…stly dimmed (#112)
Layout/styling pass over the inbox to match the target mockup while holding the
LIVE/ROADMAP honesty contract (real data or honest empty states — never
fabricated; unbuilt features render dimmed/"soon", non-functional, never wired).
Left pane (ListFilters, new): "Inbox" + real total → conversation search →
FILTER-BY-TAG chip row (All + each real workspace tag, replaces the popover —
drives the same tagIds engine) → STATUS pills (LIVE Open/Resolved/Escalated/All
+ dimmed ROADMAP Unassigned/AI-handled).
Thread header (ThreadActions, new): LIVE Resolve/Reopen + Delete (confirm,
non-optimistic) moved here from the contact panel; Assign rendered dimmed/inert.
Contact panel (DetailPanel): Copy email (LIVE) + merged CONTACT fields
(Email/IP/Device/Started/Messages) + CSAT (real) + Tags add/remove (moved here)
+ Visitor-context kept as the honest "Not captured yet" em-dash block.
Composer (ReplyComposer): Reply (LIVE) vs Internal-note (dimmed); Suggest-with-AI
and attach dimmed/inert; Send live.
- removed the stat-card strip + horizontal toolbar to match the mockup; the real
total is shown in the list header (per-conversation CSAT stays). The
escalated/resolved/avg aggregates are intentionally dropped (mockup has none).
- top-bar ⌘K search left untouched: it's LIVE (#81) and shell, not inbox.
- inbox project switcher kept (our per-project filter); archive==resolve so a
single Resolve, not a fake Archive. No LIVE/ROADMAP annotation pills ship.
- deleted InboxToolbar / InboxStats / TagFilter (+ tests), superseded.
Adversarial review: honesty + layout reviewers found 0 issues; correctness flagged
the (intentional) stats drop + a missing ReplyComposer test — test added. Gates:
dashboard 409 tests, tsc + lint + prettier clean. Three-pane bounded layout intact.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Styling/layout pass over the inbox to match the attached target mockup, holding the LIVE/ROADMAP honesty contract — real data or honest empty states, never fabricated; features we don't have render visibly dimmed/"soon" and non-functional, never wired. No backend/feature/data changes. Branched from
main(independent of PR #80).Reconciliation (mockup element → what shipped)
ListFilters(new)tagIdsengine (closes the audit's cosmetic gap; replaces the popover)Notable, intentional changes (flagging, not silent)
InboxToolbar/InboxStats/TagFilter(+ tests), superseded byListFilters.Honesty rail — enforced by tests
New/updated tests pin the contract:
ListFilters.test(4 real status radios; Unassigned/AI-handled are NOT radios/buttons; data-driven tag chips; Manage gated to admin),ThreadActions.test(Resolve/Delete live + confirm; Assign is not a button),DetailPanel.test(real fields, visitor-context em-dashes never a value, Copy email, tags, no Resolve/Delete),ReplyComposer.test(Send live; Internal note / Suggest with AI / attach are not buttons),page.test(chip-filter end-to-end, Inbox heading, deep-link).Adversarial review
3 parallel reviewers (honesty · layout/overflow/dark-tokens · correctness) → per-finding verification. Honesty: 0 findings (no fabricated data, every roadmap control is an inert
aria-disabledspan with no handler, no annotation pills ship). Layout: 0 findings (flex-wrap chip/pill rows, truncation everywhere, three-pane boundedmin-h-0/overflow-y-autochain intact, allck/dstokens so Light/Dark flip). Correctness flagged the (intentional) stats drop + a missingReplyComposertest — test added.I could not produce the requested CDP screenshots here: this sandbox's headless Chromium renders DOM (
--dump-dom) but the screenshot rasterizer fails (no GPU/SwiftShader) and a resident CDP server won't stay up. I did not fabricate any. Verification instead rests on the adversarial honesty/layout review + the 409-test dashboard suite. To eyeball both themes locally: dashboard is athttp://localhost:3001→/inbox(sign inadmin@example.com/admin@example.com), toggle theme via the mode switch. Before/after screenshots to be added by the reviewer.Gates
dashboard 409 tests pass · tsc clean · lint 7/7 · prettier clean.
Deploy note: dashboard preview runs the
kind: nextjsbuilder; if it failsNo executable pnpm found, that's the known transient Ploy flake — re-trigger once.🤖 Generated with Claude Code