# Power-ups board · brand-006 RJ Laravel Admin

**Live:** https://powerups.pina-brand-006-rj-laravel-admin.pages.dev/ · phone: `/m/`  
**Built:** 2026-10-18 · styled in the locked 4b·R direction (white HQ corner + header, 76px labelled navy rail, exact DTC navy, 2b ultra density, light tape) · motion = brand-005 crisp set.  
**Source:** `src/data.js` (patterns, fixtures, citations) · `src/demos.js` (24 live demos) · `src/board.js` (verdicts, Copy my picks, live ⌘K / find order / job tray) · `src/board.css`.  
**Evidence:** mock API probed 2026-10-18 (`Authorization: Bearer x`; 200/202 = exists, 404 "No operation … in the admin API spec (Atlas 32813eb)" = missing) · `phase-0/EVIDENCE.md` · T001 coverage (pages / actions) · T001 DECISIONS · T003 ruling.

Verdicts are stored in the viewer's browser only; **Copy my picks** produces a JSON blob (`yes / no / later / comments / unjudged`) to paste back in chat.

## Speed (6)

| # | Pattern | ★ | Tag | API evidence | Where it helps | Phone |
|---|---|---|---|---|---|---|
| 01 | ⌘K command palette | ★ | exists | GET /admin/me/menu (pages) · GET /admin/dashboard/quick-search (orders). A single search across tickets + fabrics would need GET /admin/search — not in the spec (404). | Super admin menu is 109 links; orders role alone sees 25 — typing beats scanning. Try it: press ⌘K / Ctrl K on this page. | Search icon in the app bar opens it full-screen. |
| 02 | Find order, always in the header | ★ | exists | GET /admin/dashboard/quick-search — returns order_id, customer_name, status (top 10 today, dashboard only). | /admin/orders: 240 orders, 104 actions — today the quick search lives only on the dashboard. Try it: type in the box at the top of this page. | Pinned at the top of the phone app bar; the most-used phone job. |
| 03 | Keyboard shortcuts + “?” cheat sheet |  | UI-only | No API needed. | Tickets inbox (32 pages, 87 actions): triage without the mouse. Vision-check results: PASS / FAIL down a list of photos. | Not on phone (no keyboard); hidden there. |
| 04 | Recently viewed + pinned records |  | UI-only | Kept in this browser. Following you across devices would need a preferences store (PUT /admin/me/preferences holds only locale + timezone). | Jumping between an order, its ticket and the retailer while fixing one problem. /admin/orders/{order} has 36 actions — you go back to the same few orders. | Becomes a “Recent” list at the top of search. |
| 05 | Saved views & column presets |  | needs-backend | System tabs exist: GET /admin/orders/status-catalogue (tabs[], filter_views[]). Personal saved views need storage: PUT /admin/me/preferences only stores {locale, timezone}. | Orders: status tabs + 9 export actions; each team looks at a different slice. ~3,600 cloths in fabric codes: a saved “out of stock” view. | Saved views show as the chip row above the cards. |
| 06 | Filter chips that live in the URL |  | exists | GET /admin/orders?status=build,manufacturing — status-catalogue declares multi_status with separator “,”. | Paste a link in WeChat and the factory sees the same filtered list. Back button restores the previous filter. | Chips scroll sideways under the search box. |

## Bulk & jobs (3)

| # | Pattern | ★ | Tag | API evidence | Where it helps | Phone |
|---|---|---|---|---|---|---|
| 07 | Job tray in the corner | ★ | exists | POST /admin/orders/export → 202 {batch_id} · GET /admin/dashboard/job-batches (processed / pending / failed) · GET /admin/orders/print-jobs · GET /admin/notifications?since=&unread= · polled every few seconds (T001 Q2). | Orders: 9 export actions — today you wait on the page. Kanban labels print in chunks; vision re-runs; fabric-code imports. Try it: the stack icon top-right of this page. | A small badge on the app bar; tap for the same list. |
| 08 | Bulk action bar with batch progress | ★ | exists | POST /admin/accounts/bulk-features · /admin/accounts/bulk-permissions · /admin/accessory-codes/bulk · /admin/api-keys/bulk-revoke — ≤100 per call (T003 #13). Orders have no bulk endpoint (POST /admin/orders/bulk-status → 404). | Users (26 pages, 80 actions): features and permissions across retailer accounts. Materials (30 pages, 106 actions): accessory-code mass online / offline / retire. | Select is long-press; the bar sits at the bottom. |
| 09 | Prepare → open PDF, with cloud-print status |  | exists | GET /admin/orders/print-jobs/{job}/pdf-url → {url, expires_at} · POST /admin/orders/{order}/cloud-print → 202 {print_job} (server PDFs stay, T001 Q26). | Order bill, markup, shirt and QC tags; container tickets. Factory staff know the print reached Shanghai without asking on WeChat. | Opens the PDF in the phone viewer; cloud print works from phone. |

## Context (6)

| # | Pattern | ★ | Tag | API evidence | Where it helps | Phone |
|---|---|---|---|---|---|---|
| 10 | Peek side-sheet (and pin to split view) | ★ | exists | GET /admin/orders/{order} (+ /combinations, /designs, /notes for the tabs). | /admin/orders: check 20 orders in a row without losing scroll and filters. Tickets and vision results become list-left, record-right. | Full-screen sheet; swipe down to go back to the list. |
| 11 | Hover cards |  | exists | GET /admin/accounts/{id} → brandname, currency, country_code, account_type, is_active. | Orders and tickets lists: “which currency is this retailer on?” Long retailer names (the Cambridge branch name runs to 77 characters) show in full. | Long-press instead of hover. |
| 12 | Copy any ID in one click |  | UI-only | No API needed. | Order numbers and fabric codes pasted into WeChat with the factory all day. Failed-job UUIDs into a ticket. | Tap the ID; same tick. |
| 13 | Activity side panel |  | needs-backend | Only order payloads have it: GET /admin/orders/{order}/payload-audits; API keys have their own audit. No general record history: GET /admin/audit-logs → 404. | Measurement and status changes on an order; pricing-grid edits. “Who switched this retailer offline?” on accounts. | A tab on the record, not a side panel. |
| 14 | Empty states that offer the next step |  | UI-only | No API needed. “Not available to your role” uses GET /admin/me permissions[]. | Filtered lists with no hits; a support user deep-linking into a pricing page. First run of a new module. | Same, centred, one full-width button. |
| 15 | Density switch |  | UI-only | Remembered in this browser. Saved per person would ride on preferences (only {locale, timezone} today). | Ops tables default compact, forms and hubs comfortable (design decision D4). Pricing grid and weight matrix stay compact. | Phone is always comfortable. |

## Safety (5)

| # | Pattern | ★ | Tag | API evidence | Where it helps | Phone |
|---|---|---|---|---|---|---|
| 16 | Inline edit with an undo toast | ★ | exists | PUT /admin/orders/{order}/measurements → {measurements_updated}. Undo = the same call with the old value. | Measurements on an order; pricing grid cells; sort orders. Fewer “open edit page → save → back” round trips. | Tap to edit; toast sits above the bottom bar. |
| 17 | “Someone else changed this” banner | ★ | needs-backend | Ruled in T001 Q22 (expected-version / ETag on the measurements PUT). The mock PUT /admin/orders/{order}/measurements returns no version, so the check is not in the contract yet. | Measurements edited by HQ and by a retailer's support call at the same time. Design tree edits (designs: 25 pages, 99 actions). | Same banner, buttons stacked. |
| 18 | Confirmation ladder (typed for the scary ones) | ★ | exists | POST /admin/orders/{order}/hold · POST /admin/orders/{order}/void → {settlement_status} · POST /admin/sessions/revoke-all → {sessions_revoked, tokens_revoked} (typed, T001 Q14). | Void order, wallet credit / debit, revoke API keys, revoke all sessions. Money shows currency and before → after balance. | Money and revoke actions stay desktop-first. |
| 19 | Floating “unsaved changes” bar | ★ | UI-only | No API needed (the dark pending-changes bar Frank praised in the access console). | Design edit, settings, shipping settings, fitting validation — long forms. Stops lost work when someone clicks away. | Bar sits at the bottom, full width. |
| 20 | Live / stale / offline banner |  | UI-only | No API needed; driven by the polling (T001 Q2). | Factory Wi-Fi drops; job monitors and print queues. Prevents acting on a status that already changed. | Thin banner under the app bar. |

## Language & time (2)

| # | Pattern | ★ | Tag | API evidence | Where it helps | Phone |
|---|---|---|---|---|---|---|
| 21 | Times in my timezone, both on hover | ★ | exists | PUT /admin/me/preferences {timezone} (T001 Q25). The API returns UTC; the browser formats it. | Shanghai factory and UK/US retailers read the same order differently today. Shipping cutoffs carry their own timezone — show both when they differ. | Tap the time to flip relative ↔ exact. |
| 22 | English / 中文 switch |  | exists | PUT /admin/me/preferences {locale} · GET /admin/me/menu returns labels in that locale (cn label file exists server-side). | Factory staff on Windows read Chinese; HQ reads English. EN/CN name pairs on 14 pages (categories, products, codes). | In the profile drawer. |

## Motion (2)

| # | Pattern | ★ | Tag | API evidence | Where it helps | Phone |
|---|---|---|---|---|---|---|
| 23 | Motion set |  | UI-only | brand-005 crisp set: hover 120 ms · pop 160 / 110 ms · sheet 260 / 180 ms · toast 200 / 140 ms. | Everywhere; motion shows where things came from, never decoration. Respects “reduce motion” in the OS. | Same timings; sheets come from the bottom. |
| 24 | Skeleton loading |  | UI-only | No API needed. | Order record (10+ tabs) and big lists while the API answers. Feels faster at the same speed. | Card-shaped skeletons. |

## Recommendation

**★ build first (10):** ⌘K command palette · Find order, always in the header · Job tray in the corner · Bulk action bar with batch progress · Peek side-sheet (and pin to split view) · Inline edit with an undo toast · “Someone else changed this” banner · Confirmation ladder (typed for the scary ones) · Floating “unsaved changes” bar · Times in my timezone, both on hover.

Why these: they cover the three biggest daily jobs in the evidence, plus the safety rulings Frank has already made. The jobs are finding orders (/admin/orders: 17 pages, 104 actions), acting on many rows at once (bulk cap of 100, T003 #13) and waiting on long exports or prints (polling, T001 Q2). The rulings are the typed confirm (Q14), the conflict check (Q22), the staff timezone (Q25) and the pending-changes bar Frank praised. 8 of the 10 need no backend work.

**Needs backend (3):** Saved views & column presets · Activity side panel · “Someone else changed this” banner.

- Saved views: a per-person store (PUT /admin/me/preferences only takes {locale, timezone}).
- Activity panel: a general record history (only GET /admin/orders/{order}/payload-audits and API-key audit exist; GET /admin/audit-logs → 404).
- Conflict banner: expected-version / ETag on PUT /admin/orders/{order}/measurements (ruled T001 Q22; not in the mock contract).

Also noted: orders have no bulk endpoint (POST /admin/orders/bulk-status → 404), so the bulk bar ships first on accounts / accessory codes / API keys; one search across tickets + fabrics in ⌘K would need GET /admin/search (404).
Cut from the candidate list: quick-create (+) menu (few create jobs per role), contextual field help (needs authored copy per field; revisit with the CN labels), separate notifications card (folded into the job tray), separate split view (folded into peek → pin to split).
