# Roadmap Page — UI Audit & Redesign Proposal

**Audited by:** Ripley  
**Date:** 2026-05-11  
**Component:** `client/components/AdminDashboard.jsx`  
**Route:** `/admin/roadmap` (rendered via `AboutPage admin` prop)  
**Framework:** Vite + React + Tailwind CSS + shadcn/ui + Radix

---

## Current State

The Roadmap page is an admin-only dashboard embedded inside `AboutPage.jsx`. It parses `FUTURE.md` and `DEVELOPMENT_LOG.md` via the `/api/about-admin` endpoint and renders two sections: a Roadmap card and a Development Activity Log card.

---

## Problems

### 1. It's Not a Real Page — It's an Appendix to About

The roadmap is rendered *inside* `AboutPage.jsx` with an `admin` prop. The `/admin/roadmap` route literally renders `<AboutPage admin />`. This means:

- The standard About page content (version cards, "Produced with AI" blurb, Sign In button) renders **below** the admin dashboard. An admin sees both the dashboard *and* the public about page stacked vertically.
- The "Back" button links to `/login` — wrong for an admin navigating from the sidebar.
- No dedicated page identity. It doesn't feel like a destination, it feels like a data dump tacked onto another page.

### 2. Two Giant Scrollboxes Trapped in Cards

Both Roadmap and Activity Log are `max-h-[500px]` scroll containers nested inside `Card` components. This creates:

- **Scroll-in-scroll**: The page itself scrolls, and then each card has its own internal scroll. Users fight nested scroll areas.
- **500px is arbitrary and too short** — on a 1080p screen with browser chrome, you see maybe 5-6 roadmap items before needing to scroll inside the card. With 10+ items now, most are hidden.
- **No visual indicator that content is scrollable** — no fade-out gradient, no scroll shadow, nothing signals "there's more below."

### 3. Collapsible Everything = Nothing Visible at a Glance

Every roadmap item is a `SimpleCollapsible` (custom, not shadcn). CRITICAL and HIGH start expanded, but MEDIUM/LOW/NICE-TO-HAVE are collapsed. This means:

- **6 out of 10 items are invisible by default** — you see 4 items, then 6 collapsed headers you have to click one by one.
- The collapsible headers show a priority badge + title, but no description, no effort estimate, no status beyond "PENDING" — you have to click each one to learn anything.
- No way to expand all / collapse all.
- `SimpleCollapsible` is a custom component when shadcn has `Collapsible` (Radix-based, accessible, animated).

### 4. No Priority Grouping or Visual Hierarchy

All roadmap items render as a flat list inside a single scroll container. The priority emoji/badge is the only differentiator:

- No section headers (CRITICAL / HIGH / MEDIUM / LOW) — items from different priorities blend together.
- No count indicators ("2 Critical, 3 High, 4 Medium...").
- No way to filter by priority or toggle visibility of entire tiers.
- The `PRIORITY_COLORS` object defines `border-l-4` left borders but the visual weight difference between orange and yellow on a dark theme is subtle.

### 5. Description Content Is Raw Markdown Dump

The `parseFutureMarkdown` function concatenates description, rationale, and implementation notes into a single `description` string with `whitespace-pre-wrap`. This means:

- Markdown formatting (`**Description:**`, `**Rationale:**`, bullet points) renders as literal text, not styled content.
- No visual separation between Description, Rationale, and Implementation Notes.
- Long implementation notes (the business logic item has code blocks) just dump as plain text.
- The markdown headers (`**Description:**`, etc.) show as bold text but with no structure — looks like a raw file view.

### 6. Activity Log Is Broken / Useless

The `parseDevLogMarkdown` function splits on `---` horizontal rules and tries to parse the development log. Problems:

- The actual `DEVELOPMENT_LOG.md` format doesn't consistently use `---` separators between entries — it uses `###` headers. The parser misses most entries.
- `devLogEntries` often comes back nearly empty or with badly parsed data.
- Each entry is a `DevLogEntry` component that's also collapsible (collapsed by default), so you're clicking to expand... inside a scrollbox... inside a card. Three layers of hiding.
- The dev log is 54KB of data being shipped to the frontend on every page load. Most admins never look at it.

### 7. No Interactivity or Actionability

This is a read-only data wall. There's no:

- Way to reorder priorities
- Way to mark an item as "in progress" or "started"
- Link to create a dispatch for an agent
- Progress indicator (how many items done vs pending)
- Filter or search
- Sorting (by priority, by date added, by effort)

### 8. Version Badge Is Orphaned

A lone `Badge` with the version number floats at the top of the component with no label, no context, no styling weight. It looks like it fell out of another component.

### 9. No Responsive Consideration

The component renders the same way at every breakpoint. On mobile:

- The 500px scroll containers are worse (less visible content).
- Collapsible headers with badges + long titles overflow or wrap poorly.
- No card reflow for small screens.

### 10. Accessibility Issues

- `SimpleCollapsible` uses a `div` with `onClick` — not a button, no `aria-expanded`, no keyboard activation.
- The scroll containers have no `role` or `aria-label`.
- No skip links within the dashboard sections.
- The priority emojis (🔴🟠🟡🔵💭) have no text alternatives for screen readers.

---

## Redesign Proposal

### Core Concept: Kanban-Style Priority Lanes

Replace the single flat scrollbox with a **horizontal lane layout** — one column per priority tier. Each lane shows its items as compact cards. This gives admins an at-a-glance view of the entire roadmap without scrolling or clicking.

### Architecture Changes

1. **Make it a standalone page** — `RoadmapPage.jsx`, not `AboutPage admin`. The `/admin/roadmap` route should render its own component with its own layout, header, and identity.
2. **Use shadcn Tabs** for the two sections (Roadmap / Activity Log) instead of stacking two cards.
3. **Separate the About page** — admins who navigate to `/admin/roadmap` shouldn't see the public about page below it.

### Roadmap Tab Layout

```
┌─────────────────────────────────────────────────────┐
│  🗺️ Roadmap                        v0.24.4         │
│  ┌─────────┬─────────┬─────────┬─────────┬─────────┐ │
│  │CRITICAL │ HIGH    │ MEDIUM  │ LOW     │ NICE    │ │
│  │ (1)     │ (3)     │ (4)     │ (3)     │ (1)     │ │
│  ├─────────┼─────────┼─────────┼─────────┼─────────┤ │
│  │ ┌─────┐ │ ┌─────┐ │ ┌─────┐ │ ┌─────┐ │ ┌─────┐ │ │
│  │ │Item │ │ │Item │ │ │Item │ │ │Item │ │ │Item │ │ │
│  │ │card │ │ │card │ │ │card │ │ │card │ │ │card │ │ │
│  │ └─────┘ │ └─────┘ │ └─────┘ │ └─────┘ │ └─────┘ │ │
│  │ ┌─────┐ │ ┌─────┐ │ ┌─────┐ │ ┌─────┐ │         │ │
│  │ │     │ │ │card │ │ │card │ │ │card │ │         │ │
│  │ └─────┘ │ └─────┘ │ └─────┘ │ └─────┘ │         │ │
│  │         │ ┌─────┐ │ ┌─────┐ │ ┌─────┐ │         │ │
│  │         │ │card │ │ │card │ │ │card │ │         │ │
│  │         │ └─────┘ │ └─────┘ │ └─────┘ │         │ │
│  └─────────┴─────────┴─────────┴─────────┴─────────┘ │
└─────────────────────────────────────────────────────┘
```

On mobile (below `lg` breakpoint): lanes stack vertically with each lane as a collapsible section (using shadcn `Collapsible` or `Accordion`).

### Item Card Design (compact, scannable)

```
┌─────────────────────────┐
│ 🔴 CRITICAL             │  ← Priority badge
│ No Confirmation Before  │  ← Title (bold, 2-3 lines max)
│ Destructive Actions     │
│                         │
│ Added: 2026-05-11       │  ← Meta line (date, agent)
│ Est: 3-4h              │  ← Effort estimate
│                         │
│ [Expand ▸]              │  ← Click to see full details
└─────────────────────────┘
```

Expanded card shows Description, Rationale, Implementation Notes as **properly styled sections** (not raw markdown dump).

### Activity Log Tab

- Replace the broken `parseDevLogMarkdown` with a **simpler timeline format** — just show version, date, agents involved, files modified. No full content dump.
- Consider lazy-loading: only fetch `developmentLog` when the Activity Log tab is selected (it's 54KB of data nobody needs on page load).
- Timeline format (vertical):

```
v0.24.4 — 2026-05-11
  Scarlett ✅ 12m | Neo ✅ 3m | Bishop ✅ 7m
  5 files modified
  [▸ Expand details]

v0.23.2 — 2026-05-10
  Neo ✅ | Bishop ✅
  3 files modified
```

### Component Inventory (what to use)

| Need | Use |
|------|-----|
| Page container | Standalone `RoadmapPage.jsx` |
| Priority lanes | CSS Grid (`grid-cols-5` on `lg`, `grid-cols-1` on mobile) |
| Lane sections | `Card` with colored top border from `PRIORITY_COLORS` |
| Item cards | `Card` with `CardHeader`/`CardContent` |
| Item expand/collapse | shadcn `Collapsible` (Radix, accessible) |
| Tab switching | shadcn `Tabs` / `TabsList` / `TabsTrigger` |
| Priority badges | Keep current `Badge` + emoji approach, add `aria-label` |
| Scroll | Page-level scroll only, no nested scroll containers |
| Expand All / Collapse All | `Button` at top of Roadmap tab |
| Item count per lane | `Badge` variant="outline" in lane header |

### Files to Modify

| File | Change |
|------|--------|
| `client/components/AdminDashboard.jsx` | **Delete** (replaced by RoadmapPage) |
| `client/pages/AboutPage.jsx` | Remove `admin` prop, remove AdminDashboard import — AboutPage goes back to being a public-only page |
| `client/pages/RoadmapPage.jsx` | **New** — standalone roadmap page |
| `client/App.jsx` | Update `/admin/roadmap` route to render `<RoadmapPage />` instead of `<AboutPage admin />`; possibly add `/admin/about` route if admins need the about page |
| `client/api.js` | No changes needed (same endpoint) |

### Data Parsing Improvements

- **Parse FUTURE.md into structured sections** — separate Description, Rationale, Implementation Notes into distinct fields on the item object instead of concatenating into one `description` blob.
- **Extract effort estimate** from Implementation Notes (`Estimated effort: 3-4 hours` → `effort: "3-4h"`).
- **Lazy-load dev log** — only call `/api/about-admin` with `developmentLog` when the Activity Log tab is active, or split the API into two endpoints.

### Responsive Breakpoints

| Breakpoint | Layout |
|-----------|--------|
| `< sm` (mobile) | Single column, lanes stack vertically as collapsible sections |
| `sm–lg` (tablet) | 2 columns (CRITICAL+HIGH | MEDIUM+LOW+NICE) |
| `lg+` (desktop) | 5 columns, one per priority tier |

### Accessibility Fixes

- Replace `SimpleCollapsible` div+onClick with shadcn `Collapsible` (button trigger, `aria-expanded`, keyboard support)
- Add `aria-label` to priority badges (e.g., `aria-label="Critical priority"`)
- Add `role="region"` and `aria-label` to lane sections
- Ensure all interactive elements are keyboard-focusable
- Add `aria-live="polite"` to expand/collapse regions

---

## Priority for Implementation

This is a **MEDIUM** priority redesign. The current page works for data display but fails at being a useful admin tool. The kanban-style layout and proper parsing would make it genuinely useful for planning.

**Estimated effort:** 8-12 hours (Scarlett for UI, Neo for API split if lazy-loading)