# F1 kit changelog (brand-006 · phase 1)

## v2 · 2026-10-18 · wide Jobs + notification dropdowns (Frank: "the data coming in for these jobs is much, much more than what your designs look like")

**Truth first:** `phase-2/truth/TRUTH-JOBS.md` (3.0_Backend `origin/main` 6787e7873 + rj-admin MCP reads). Jobs are five tables (`job_batches`, `print_jobs`, `cloud_jobs`, `fabric_photo_batches`, `failed_jobs`); rows carry a target, a type, two status axes or counts, timestamps and a free-text error up to a stack trace.

| Token | v1 | v2 | Why |
|---|---|---|---|
| `--dropdown-w-sm` | — | 360px | small header menu |
| `--dropdown-w-md` | — | 520px | notification centre |
| `--dropdown-w-lg` | — | 600px | Jobs list: 3-line rows |
| `--dropdown-max-h` | — | `min(78vh, 720px)` | body scrolls, header + footer fixed |
| `--sheet-w-lg` / `--sheet-w-xl` | — | 760 / 960px | Open all notifications / Open all jobs side sheets |
| `--hmenu-jobs-w` | 340px | `var(--dropdown-w-lg)` | every page's Jobs menu widens through the shell |
| `--hmenu-notif-w` | 360px | `var(--dropdown-w-md)` | every page's bell menu widens through the shell |

- **Jobs dropdown** (`.lv-jm`, `.lv-ddf`, `.lv-ddb`, `.lv-dg`, `.lv-jx`): state tabs with counts + type select; groups Running · Queued · Needs attention · Done today with sticky heads; each row = title + type tag + time · target · initiator or source · short id · progress bar with processed / total / failed + elapsed + ETA, or the dispatch / print / send line, or the error (2-line clamp, More expands in place, stack trace below) · only real actions (Download, Open PDF, Reprint label, Retry send, Results CSV, Details). No Cancel / generic Retry: no such routes.
- **Notification centre** (`.lv-nm`, `.lv-nx`): All / Unread + type select, grouped Today / Yesterday (the 2-day window), type label + time, plain-text body clamped to 2 lines with More, the lifted links, unread dot, hover mark-read + delete.
- **Side sheets** (`.lv-xs.xl` 960 · `.lv-xs.lg` 760): Open all jobs = list + detail with every field, the full `last_error`, the failed queue job and its payload in the JSON viewer; Open all notifications = type chips + full bodies.
- **Permission shape:** own queue batches always; print + agent jobs with `view orders`; Failed jobs link only with `manage failed jobs`.
- **Shell:** new states `jobs-open` and `notif-open` show the menus hanging from their buttons inside the full app frame; widths come from the tokens, so every page that uses the shell header gets them.
- **Quiet rules:** the v1 "polled every 3 s" caption and the grey header sub-labels are gone; counts live on the tabs.

## v1 · 2026-10-18 · the F1 kit on top of brand-005 kit v4

**Base:** brand-005 `phase-2/kit` at command-center `79f307db5` (kit v4, Midnight green recolour). `tokens.css` section 1 and `base.css` Part A are byte-for-byte copies (vendored in `src/upstream/`, sha256 `a323c347…` tokens, `96e48193…` base).
**Theme:** `phase-0/tokens-delta.css` verbatim (38 differing tokens: 20 changed + 18 new; comfortable mode overrides 8; 22 navy tokens pinned).

### Tokens added (B6 kit layer, `src/kit_tokens.css`)

| Token | Value | Why |
|---|---|---|
| `--tab-h` | 36px (comfortable 40px) | **repaints an inherited token**: flagship status / record tabs are 36px at compact |
| `--btn-px` | 13px (comfortable 14px) | flagship button side padding at density |
| `--label-col` | 180px (comfortable 200px) | A03 inline label column |
| `--fly-w` | 240px | T-b / T-d flyout column |
| `--hmenu-jobs-w` / `--hmenu-notif-w` / `--hmenu-tz-w` | 340 / 360 / 260px (v2: 600 / 520 / 260) | header menus, each right-aligned under its own button (FEEDBACK-B-r1) |
| `--verdict-h` / `--verdict-h-big` / `--verdict-pad` | 40 / 52 / 12px | the Pass / Fail fix: icon, label and P / F hint sit inside a 12px inner padding |
| `--cell-w`, `--meas-col`, `--gantt-day`, `--split-min` | 92px, 96px, 22px, 320px | grids, measurement grid, gantt, split pane |
| `--retailer-pill`, `--retailer-pill-fg` | #1B2438, #F2F4F8 | retailer pill (flagship O01) |
| `--tag-proposal`, `--tag-needs-backend`, `--tag-api` | #6B3FA0, warning, info | annotation tags (never product UI) |
| `--diff-add`, `--diff-del`, `--changed`, `--save-bar` | success, destructive, warning, primary | diff viewer, measurement gold, dark pending-changes bar |
| `--os-*` (11) | real OrderStatus colours | status chips (TRUTH-ORDERS §2) |
| `--ph-*` (9) | real gantt phase colours | piece pills, gantt bars (TRUTH-ORDERS §5) |
| `--tk-*` (6) | real tickets_statuses colours | ticket status chips (TRUTH-TICKETS §8) |
| `[data-density="compact"]` | restates compact | a compact island inside a comfortable page |
| `[data-theme="dtc"]` | kit v4 green ramp | the theme proof: same components, DTC colours, tape off |

### base.css Part B (the F1 layer)

Shell (`.lv-app`, `.lv-rail`, `.lv-corner`, `.lv-ri`, `.lv-side`, `.lv-top`, `.lv-crumbs .crb`, `.lv-find`, `.lv-tb`, `.lv-hmenu` + `.lv-jm` / `.lv-nm` / `.lv-tzm`, `.lv-fly`, phone `.lv-pbar` / `.lv-pnav` / `.lv-psheet`), domain atoms from the flagships (`.sc` real status chip, `.pp` piece pill, `.rpill`, `.urg`, `.bdg`, `.nx`, `.oid`, `.ex`), table (`.lv-t` sticky header + sticky first column + inline edit `.lv-ce`), bulk bar, ruler progress, banners and the state vocabulary, static dialogs / sheets / ladder, record header + split button + `.lv-menu`, forms (`.lv-frow`, `.lv-fsec`, `.lv-snav`, `.lv-save`), stepper, timeline + diff, thread, KPI + chart, media + `.verdict`, swatches, grids, gantt, document, split pane, bilingual, JSON, cron, QR, sortable, tree, rich text, and the kit-page helpers (`.kx-*`).

### Fixed on the way

- **Pass / Fail verdict buttons** (FEEDBACK-B-r1 A08): the icon and the P / F hint crashed into the border. Now: one flex row with `gap:8px` inside a 12px inner padding (`--verdict-pad`), the label truncates before the hint does, the hint is an inline 18px box, `overflow:hidden` on the button. Checked at 1440 and 390 in both densities.
- **Header menus** (FEEDBACK-B-r1 shell): Jobs is one compact button whose list shows every running / queued / failed job, right-aligned to the button; the notification centre is its own bell + menu; the locale control is a globe only (toggles EN ↔ 中文); the clock is clickable and opens the timezone choice.
- **No internal notes in the ticket thread** (TRUTH-TICKETS §0 #7): the DTC `internal` side is not offered in F1; every staff reply emails the retailer.

### Open

- Kit repo location (STACK §5.2): recommended default B, its own repo `RJmtm/admin-kit`.
- The one-day grid spike for `react-datasheet-grid` (STACK §3.2) before `MatrixEditor` is built.
