# Technician (Mobile) — Screen Inventory

> Source: `docs/design/SCREEN_LIST.md` "Technician (TECH)" block (5 role screens, CL-2) + the shared Auth screens (Module 0) the role passes through on login. Surface = Mobile (Flutter) portrait. GZ scope = `own · team`.
> **Pixel target:** the `screens/*.html` mockups at ~390px. **States:** `states/`. **Sheets:** `bottom-sheets/`.

---

## Auth (shared — built in Wave 0, included here as the entry path)

| Screen ID | Screen | Purpose | States / sheets | Mockup |
|---|---|---|---|---|
| `AUTH-LOGIN` | Login | Email/phone + password sign-in | error (bad creds), locked (rate-limited), 401 (session expired), loading | `screens/01-login.html` |
| `TECH-DASH` (router) | Role-resolved Home | Post-login → Technician Home via `/me` role resolve | loading | `screens/02-dashboard.html` |

> `AUTH-FORGOT / AUTH-OTP / AUTH-RESET / AUTH-LOGOUT / SH-NOTIF / SH-PROFILE` are Wave-0 shared screens; this pack mocks `01-login.html` + a `07-profile.html` to show the role's entry + More-tab landing. The full shared-auth set ships once in Wave 0 and is reused by every role.

## Technician (TECH) — role screens

| # | Screen ID | Screen | Purpose | States / sheets | Mockup |
|---|---|---|---|---|---|
| 1 | `TECH-DASH` | Technician Home | My WO counts (assigned / in-progress / returned / done) + due-soon / overdue badges + list preview | loading, empty (nothing-assigned), overdue badge | `screens/02-dashboard.html` |
| 2 | `TECH-WO-TODAY` | My Work-Orders | WOs assigned to me by the Maintenance TL — WorkOrderCard (source checklist + ride, A-item, `wo-*` state chip, age/SLA) | wo-state chips, overdue, returned row, empty | `screens/03-work-orders.html` |
| 3 | `TECH-WO-DETAIL` | Work-Order Detail | Source checklist + A-item + issue photos + instructions + WO timeline; **Start work** CTA | photo viewer, start-work CTA, 403 | `screens/04-wo-detail.html` |
| 4 | `TECH-WO-DONE` | Mark Done (fixed) | Mark the WO fixed; **mandatory fix photo** → action CLOSED at maintenance level | camera FAB, photo-required block, offline; sheets: photo-capture, confirm-done | `screens/05-wo-done.html` |
| 5 | `TECH-WO-RETURN` | Return with Reason | Can't fix internally → **required reason** (+ optional photo) → back to Maintenance TL | reason-required, offline; sheet: return-reason | `screens/06-wo-return.html` |
| — | `SH-PROFILE` (More) | Profile / More | Own profile, role, reports-to, maintenance skills; logout | — | `screens/07-profile.html` |

## States (this pack)

| State | File | Where it appears |
|---|---|---|
| Loading (skeleton) | `states/loading.html` | `TECH-DASH`, `TECH-WO-TODAY` |
| Empty (nothing assigned) | `states/empty.html` | `TECH-WO-TODAY`, `TECH-DASH` |
| Error (generic + retry) | `states/error.html` | any data screen |
| Offline / online-only retry | `states/offline.html` | Done + Return (in-memory draft preserved) |
| 403 (out-of-scope WO / action) | `states/forbidden.html` | any |
| 401 (session expired) | `states/session-expired.html` | any (token expired) |
| Locked (rate-limited login) | `states/locked.html` | `AUTH-LOGIN` |

## Bottom sheets (this pack)

| Sheet | File | Trigger |
|---|---|---|
| Photo-capture (Camera / Gallery) | `bottom-sheets/photo-capture.html` | tap the fix-photo tile or camera FAB on `TECH-WO-DONE` |
| Return with reason | `bottom-sheets/return-reason.html` | tap Return on `TECH-WO-DETAIL` / `TECH-WO-RETURN` |
| Confirm Done | `bottom-sheets/confirm-done.html` | tap Mark Done (once the fix photo is present) |

---

## Counts

- **7 screen mockups** (1 login + Home + Work-Orders + Detail + Done + Return + Profile) — covering the 5 `TECH-*` role screens + the auth entry + the More landing.
- **7 state variants** · **3 bottom-sheets**.
- **Total HTML artifacts in this pack: 7 screens + 7 states + 3 sheets = 17 HTML files** (PNG render is a later step).

> The Technician is a **maintenance filler**: he mirrors the anchor's fill→submit→status nav *shape* (Home / work-list / action / action / More) but the verbs are **Start → Done(+photo) / Return(+reason)** instead of fill→submit, and there is **no approve slot**.
