Left-Rail Sidebar Redesign (Expert Mode)¶
Status: Proposal (April 2026) — Phases A + B implementing on branch
leftsidebar-redesign-claude. Comments tab (ReviewPanelmode="com") UI redesign landed on branchcodex/dfm-injection-molding-rules-bar-refinement-commentsat commit8a61fd3. The broader five-panel LeftPanel shell still tracks this proposal; see Implementation status at the bottom for specifics. Reviewer role assumed: Product designer + frontend architect with enterprise-SaaS experience (Linear, Notion, Figma) and a study of CoLab Software's Workspace Feedback + Cross-Functional Review patterns Purpose: Replace the big-card, low-density left-panel look with a dense, scannable, CoLab-inspired feedback/issue list shell that all five panels inherit. Related: - Home Redesign — shared tokens and recent-items pattern - DraftLint Redesign — severity palette, stage tracker - Code Review — Frontend (D) — D1/D2 (store + API client) will land naturally on this shared shell
What CoLab Does Well (relevant to our sidebars)¶
From C:\Users\adeel\OneDrive\100_Knowledge\203_TextCAD\08_Competition_Inspiration\colabsoftware and the 25-page PRD:
- Feedback is the central object. Every issue, idea, comment, lesson learned lives in one "Workspace Feedback" table, filterable by priority / owner / status / part / revision.
- Dense rows, not big cards.
trackissue.pngshows ~15 rows on a laptop screen. Row = Key · Title · Type chip · Status · Revision. - Saved Views + Filter at top. Persistent strip — engineers return to "My Open Issues", "Reviews Due This Week", "Latest Rev Feedback".
- Avatars everywhere. Review owners, reviewers, commenters, assignees are circles with initials + status dots (
crossfunctional.png,peerreview.png,assignreview.png). - Type chips with icons, not full-width colored pills. Compact, color-dim, icon-forward.
- Pinned-comment floating card echoes the row shape (avatar, role, tag, reply count, timestamp).
- PRD emphases: automatic issue tracking, search + filter, status tracking (open/in progress/resolved/closed), assignment, priorities, due dates, @mention, real-time + async, saved views.
Current State — The Five Left-Rail Panels¶
All five panels render through two components:
| Tab | Component | Data |
|---|---|---|
views |
ViewsPanel.tsx | view/shape/occ/iso URLs |
com (Comments) |
ReviewPanel.tsx mode="com" | tickets[] (real) |
reviews |
ReviewPanel mode="reviews" |
designReviews[] (real) |
dfm |
ReviewPanel mode="dfm" |
DFM_CARDS (static mock) |
km |
ReviewPanel mode="km" |
KM_CARDS (static mock) |
req |
ReviewPanel mode="req" |
REQ_CARDS (static mock) |
A single 1,400-line component shape-shifts across five panels.
What's wrong visually¶
- Table-header column labels above a card list — mismatched mental model.
- Massive cards, 2–3 items visible.
- Giant blue tag pills, no severity color, no icon.
- No avatars anywhere.
- No priority/severity dots at row level.
- No Saved Views / Filter strip.
- No search input.
- Metadata rendered as raw "Severity: High · Status: Open · Source: …" prose.
- Empty state is "No items yet.".
- Saturated orange Start Review CTA clashes with the calm palette.
- No count strip (All / Open / In Progress / Resolved).
- No sort, group-by, bulk actions, row hover actions.
- DFM / KM / Requirements panels render static mock data.
- Comments and Reviews look identical — no distinction cue.
Design Principles¶
- Feedback-first, not CAD-first. The sidebar is where issues, reviews, DFM findings, knowledge entries live.
- Shared shell, per-panel content. Five panels inherit the same chrome so muscle memory carries.
- Row density first. Default view is a dense row list; 15+ items visible.
- Status through color, not prose. Severity dots, type chips with icons.
- Avatars are first-class. Author, owner, assignee, reviewer always visible.
- Saved Views + Filter chips persistent, not buried.
- Detail opens a split-pane, list context stays visible.
- Calm palette reusing existing tokens + PDF-report severity palette (Critical
#C0392B, Major#E67E22, Minor#F1C40F). - No new npm packages in Phase A or B.
Proposed Shared Shell (all 5 panels inherit this)¶
┌─────────────────────────────────────────────────────────────┐
│ DFM · Design for Manufacturing ≡ + ••• │
├─────────────────────────────────────────────────────────────┤
│ [All 24] [Open 12] [In Prog 3] [Resolved 9] │
├─────────────────────────────────────────────────────────────┤
│ 🔍 Search… Saved views ▾ Filter ▾ Sort ▾ │
├─────────────────────────────────────────────────────────────┤
│ 🔴 DFM-07 Sharp internal corner at load path 👤 AY 3h │
│ 🟠 DFM-06 Minimum wall thickness risk 👤 MF 5h │
│ 🟠 DFM-05 Hole-to-edge distance too small 👤 AY 6h │
│ 🟡 DFM-04 Draft angle missing on vertical faces 👤 TE 1d │
│ ─ rows continue ─ │
├─────────────────────────────────────────────────────────────┤
│ Showing 24 of 24 Export · Settings│
└─────────────────────────────────────────────────────────────┘
Row anatomy¶
Selected-row split pane¶
List stays visible at ~42% of panel; detail opens at ~58% on the right. On narrow widths it takes over the panel with a back chevron (preserves current mobile behaviour).
Per-Panel Specifics¶
Comments (com)¶
- Type chips: Issue / Idea / Comment / Question.
- Default saved view: Open on this part.
- Rows show a 📍 when the comment is anchored to geometry; click jumps the viewer to the pin.
Reviews (reviews)¶
- Row = status chip + checklist progress bar + reviewer avatars.
- Primary action: + Start Review using
--accent-1(not saturated orange). - Detail renders the checklist with inline status toggles.
Design for Manufacturing (dfm)¶
- Severity dot + title + finding tags + owner avatar + source chip (DFM checklist, CAE feedback, Tooling).
- Header action: Re-run DFM (opens right-rail DFM sidebar).
- Visual redesign keeps mock data until Phase C wires this panel to
dfm_review_v2output.
Knowledge Management (km)¶
- Row = topic title + tags + source chip + last-used time.
- Prominent Search since KM is retrieval-first.
- Empty state gets an illustration-lite card with a clear capture CTA.
- Static today.
Requirements (req)¶
- Priority dot + req ID + title + status chip + owner avatar.
- Tree grouping in Phase C.
- Static today.
Views (views)¶
Different beast — generator control panel. Phase A just aligns CTAs + placeholder cards with new tokens; no structural change.
Interaction Patterns¶
| Pattern | Behaviour |
|---|---|
| Search | ⌘F focuses; 150ms debounce; matches title + key + tags. |
| Status strip | Click to filter; click active chip again to clear. |
| Filter menu | Owner, tags, severity, source; multi-select. |
| Sort menu | Recent / Oldest / Severity / Priority / Alphabetical. |
| Saved Views | Dropdown with 4 built-ins + user-saved (localStorage; server sync later). |
| Keyboard | j/k move selection, Enter open detail, Esc close, R reply, A assign, ⌘E export. |
| Bulk actions | Shift-click range; ⌘A select all; bar shows Assign / Change status / Export. |
| Row hover | Reply / Assign / Resolve fade in at row's right edge. |
| Empty state | Icon + one-liner + primary CTA; no more "No items yet.". |
| Detail drawer | Split-pane default; full-panel takeover on narrow widths. |
Design Tokens (all reused, no new additions)¶
--accent-1for all primary CTAs (removes orange gradients).--surface-1 / --surface-2 / --surface-3for panel/row/selected-row backgrounds.--border-1 / --border-2for separators.--text-1 / --text-2 / --text-3for heading/body/meta.- Severity palette from PDF-report tokens: Critical
#C0392B, Major#E67E22, Minor#F1C40F, Info#3498DB, Pass#27AE60. - Typography:
--font-body(Aptos), 13px / 1.45 row text, 11px mono for keys (DFM-07).
Phased Plan¶
Phase A — Visual refresh (IMPLEMENTING NOW, frontend only)¶
No structural changes; modernize the existing screens.
- Dense row layout with severity dots, type chips, avatars, relative time.
- Filter chips + sort dropdown replace the table-style column header.
- Status count strip at top.
- Calm empty states.
- Align ViewsPanel CTAs + placeholder cards.
- Swap every orange gradient CTA for
--accent-1.
Phase B — Shared shell + split-pane detail (IMPLEMENTING NOW, frontend only)¶
Reorganize so every panel inherits the shell.
- New
web/src/components/LeftPanel/package: LeftPanel.tsx— layout shell.LeftPanelRow.tsx— dense row.LeftPanelDetail.tsx— split-pane detail.useLeftPanelFilters.ts— search/filter/sort hook.Avatar.tsx,SeverityDot.tsx,TypeChip.tsx— atoms.savedViews.ts— localStorage for saved views.ReviewPanel.tsxshrinks to a thin adapter:mode→ data mapper + detail renderer + header action.- Keyboard
j/k/Enter/Esc. - Saved Views with 4 built-ins.
- Split-pane detail on wide panels; takeover on narrow.
Deferred to Phase B+: CSV export, bulk multi-select, checkbox filter menus, list virtualization.
Phase C — Data wiring (frontend + backend, deferred)¶
- DFM left panel reads from
dfm_review_v2output (evidence pointers per row). - KM + Requirements need backend surfaces; flagged.
- Server-side saved views (ties into code-review F1 activity log).
- Bulk assign / bulk status change APIs.
Open Questions (do not block A/B)¶
- Default row density: compact 44px (my pick) or comfort 60px.
- Merge Comments + Reviews into one stream (CoLab-style)? My pick: keep separate, same chrome.
- Keep
reqtab if still static? My pick: keep with friendly empty state. - Rail icons: icon + 11px label below (current), or label-on-hover? My pick: keep as-is.
- Saved Views localStorage vs server-backed? My pick: localStorage first.
- Comments vs DraftLint findings overlap — which panel owns promoted findings? My pick: Comments = inbox; Reviews = structured view.
Implementation Notes¶
- Branch:
leftsidebar-redesign-claude, cut fromdraftlint-redesign-claude(so local deploys show home + draftlint + left-sidebar redesigns together). - Repo:
D:\02_Code\54_ClaudeReview_Rapiddraft\rapiddraft_utumpitch. - No new npm packages.
- Reuse existing tokens in
styles.css. - Build verification:
npm run buildmust pass. - Local only; never pushed.
Acceptance Criteria For Phases A + B¶
- All five left-rail panels use the same shared shell (
LeftPanel). ReviewPanel.tsxis under 600 lines.- Rows show severity dot, key, title, type chip, avatar, relative time.
- Status count strip filters the list.
- Search and Sort work client-side on all five panels.
- Saved Views menu has 4 built-ins + localStorage-backed custom views.
- Split-pane detail renders when a row is selected; keyboard
j/k/Enter/Escwork. - ViewsPanel's CTAs + placeholders match the new tokens.
npm run buildpasses; existing Playwright specs still pass.
Implementation status — Comments tab (April 2026)¶
Landed on branch codex/dfm-injection-molding-rules-bar-refinement-comments, commit
8a61fd3. The broader shared-shell work in this proposal is still open; this section
tracks only what's live for the Comments tab (mode="com").
Pin layer (ReviewPins.tsx)
- 22px circular glyph pins with hover tooltip (REV-003 · title · author).
- Type-specific glyph: ! issue, ✦ idea, + comment, ✓ resolved, ✕ failed review.
- Resolved state drops to muted gray with lower shadow intensity.
- Selected pin's card redesigned Colab-style: REV-nnn pill, type chip, title, author
→ assignee row, status pill, reply count.
Composer (CommentForm.tsx)
- Replaced the full-screen modal with an inline popover anchored at the
pin-click viewport coordinates. Clamped to viewport margins.
- Title autofocused; Cmd/Ctrl+Enter submits; Escape cancels; click-outside
soft-dismiss scrim.
- Chip rows for type (Issue / Idea / Comment) and priority (Low / Med / High / Crit
with arrow glyphs) — no dropdowns for the common case.
- Expandable "Details" reveals assignee picker (with <datalist> fed from known
authors) + tag + author (when not locked).
Detail pane (ReviewPanel.tsx ticket-detail render)
- Header: REV-nnn pill, type chip, priority chip, status pill, right-aligned
Resolve / Reopen button.
- Title + byline with avatar initials and relative timestamp (3h ago, expands to
absolute on hover).
- Markdown-rendered description and replies via marked + DOMPurify (see
web/src/utils/markdown.ts); @mention chips rendered as inline pills.
- Three-column assignee / priority / status controls; assignee input uses known-authors
datalist.
- Thread with avatars, relative timestamps, inline delete.
- Reply composer: markdown textarea, Cmd+Enter to send, compact submit; delete
moved to a low-weight footer action.
- Resolved state shows Resolved by X · 2h ago banner and fades the title.
Data model
- ReviewTicket gained assignee?: string | null, resolvedAt?: string | null,
resolvedBy?: string | null.
- Backend CreateTicketBody accepts assignee; UpdateTicketBody accepts
assignee, resolvedAt, resolvedBy.
- review_store.create_ticket seeds all three as null on new tickets; existing
stored tickets without these fields continue to render.
Still in proposal (not landed)
- DFM / KM / Requirements tabs still mock-card-backed (mode="dfm" / "km" /
"req").
- Saved Views menu with localStorage persistence.
- Keyboard shortcuts j/k/Enter/Esc across all five panels.
- ReviewPanel.tsx is still above the 600-line ceiling after the comments
redesign — reduction pass deferred to the shared-shell rollout.