# Draft Room Redesign Plan

**Status**: ✅ Complete - All Features Implemented & Tested
**Created**: 2025-10-24
**Last Updated**: 2025-10-24

## Overview

Redesigning the draft room to use a full-screen layout with a collapsible left sidebar and tabbed main content area.

---

## Requirements

### Layout Changes

#### 1. Full-Screen Layout (No Page Scroll)
- Page fills entire viewport (100vh)
- Individual sections scroll internally
- Fixed header at top
- Content area uses remaining height

#### 2. Collapsible Left Sidebar
- **Default State**: Expanded
- **Width**:
  - Expanded: 350px
  - Collapsed: 50px
- **Contents** (Accordion-style sections):
  - My Queue (top section) - Collapsible
    - Eligibility status banner
    - Queue list (ordered, scrollable)
    - Autodraft settings
    - Clear queue button
  - Available Participants (bottom section) - Collapsible
    - Search bar
    - Sport filter dropdown
    - Show/hide drafted toggle
    - Participants table (scrollable)
    - Action buttons (Pick/Add to Queue)
- **Section Behavior**:
  - Both sections can be expanded or collapsed independently
  - When both expanded: 50/50 vertical split
  - When one collapsed: Expanded section takes 100% of space
  - At least one section must remain expanded
- **Responsive**:
  - Desktop (≥1024px): Fixed sidebar on left
  - Mobile (<1024px): Full-screen modal

#### 3. Tabbed Main Content Area
Three tabs with toggle functionality:

**Tab 1: Draft Board (Default)**
- Current draft grid display
- Team headers with timers and autodraft status
- Snake draft grid (scrollable)
- Context menu for commissioners
- Reuse existing DraftGrid component or inline implementation

**Tab 2: Recent Picks**
- List of recent picks (latest 10-20)
- Same format as current Recent Picks section
- Scrollable list
- Shows: Pick number, team, participant, sport

**Tab 3: Teams Drafted (NEW)**
- Grid layout:
  - **Rows**: Sports (from season sports)
  - **Columns**: Teams (in draft order)
  - **Cells**: Participants drafted by that team in that sport
- **Highlighting**: Visual indicator when team has multiple participants in same sport
- **Flex Display**: Show "X of Y flexes used" somewhere with team data
- **Scrollable**: Both horizontal and vertical as needed

### Design Decisions

**Teams Drafted Grid:**
1. ✅ **Cell content**: Show participant names (e.g., "Patrick Mahomes, Travis Kelce")
2. ✅ **Cell interactivity**: No clickability needed (existing commissioner context menu on draft board remains)
3. ✅ **Empty cells**: Leave empty (just border, no text)
4. ✅ **Flex display**: In team column header, below team name (similar to timer positioning)

**Tab UI:**
5. ✅ **Tab style**: ShadCN Tabs component
6. ✅ **Recent Picks data**: Same 10 most recent picks as current implementation

**Sidebar:**
7. ✅ **Section sizing**: Accordion-style - both sections collapsible independently
   - Both expanded: 50/50 split
   - One collapsed: Expanded section takes 100%
   - At least one must remain expanded

---

## Current Implementation Analysis

### File Structure

**Main Route**: `/app/routes/leagues/$leagueId.draft.$seasonId.tsx`
- All draft room logic currently in this single file
- ~1,300 lines of code
- Inline rendering of Queue and Available Participants (not extracted components)

**Related Components**:
- `/app/components/DraftGrid.tsx` - Reusable draft grid (not currently used in draft room)
- `/app/components/AutodraftSettings.tsx` - Autodraft toggle and settings

**Current Layout**:
```
Header (full width, fixed)
├─ Title and metadata
├─ Control buttons (start/pause/resume)
└─ Connection status

Draft Grid (full width, scrollable)
├─ Team headers
└─ Pick grid

3-Column Grid (lg:grid-cols-3)
├─ My Queue (conditional if user has team)
│  ├─ Eligibility status
│  ├─ Queue list (max-h-96)
│  ├─ Autodraft settings
│  └─ Clear button
├─ Recent Picks
│  └─ Last 10 picks (max-h-96)
└─ Available Participants
   ├─ Search and filters
   └─ Participants table (max-h-[500px])
```

### State Management
Component state (useState):
- `picks` - All draft picks
- `currentPick` - Current pick number
- `searchQuery` - Participant search term
- `hideDrafted` - Toggle drafted visibility
- `sportFilter` - Active sport filter
- `queue` - User's queue items
- `teamTimers` - Timer for each team
- `autodraftStatus` - Autodraft state per team
- `connectedTeams` - Set of connected team IDs
- `forcePickDialogOpen` - Commissioner dialog state

Real-time updates via Socket.IO:
- `pick-made`
- `timer-update`
- `draft-paused` / `draft-resumed`
- `draft-completed`
- `autodraft-updated`
- `team-connected` / `team-disconnected`
- `participant-removed-from-queues`

### Data Flow
- Loader provides initial data
- Socket.IO provides real-time updates
- Form actions handle queue management and draft actions
- Draft eligibility calculated client-side via `calculateDraftEligibility()`

---

## Proposed Architecture

### New Component Structure

```
leagues/$leagueId.draft.$seasonId.tsx (Main Route)
├─ Full-screen flex container (100vh)
├─ Header (fixed, flex: 0 0 auto)
├─ Content Area (flex: 1 1 auto, flex row)
│  ├─ DraftSidebar (NEW component)
│  │  ├─ Collapse toggle button
│  │  ├─ QueueSection (scrollable)
│  │  └─ AvailableParticipantsSection (scrollable)
│  └─ MainContent (flex: 1 1 auto)
│     ├─ TabSelector (Draft Board | Recent Picks | Teams Drafted)
│     └─ TabContent (scrollable)
│        ├─ DraftBoardTab (uses DraftGrid component)
│        ├─ RecentPicksTab
│        └─ TeamsDraftedTab (NEW)
```

### Files to Create

1. **`/app/components/DraftSidebar.tsx`** (NEW)
   - Collapsible sidebar container
   - Props: collapsed state, queue data, participants data, handlers
   - Two internal sections with separate scrolling

2. **`/app/components/draft/QueueSection.tsx`** (NEW, optional)
   - Extracted queue rendering logic
   - Props: queue, eligibility, autodraft settings, handlers

3. **`/app/components/draft/AvailableParticipantsSection.tsx`** (NEW, optional)
   - Extracted participants table logic
   - Props: participants, filters, handlers

4. **`/app/components/draft/TeamsDraftedGrid.tsx`** (NEW)
   - Grid showing teams × sports with drafted participants
   - Props: teams, sports, picks, flex usage
   - Highlighting logic for multiple drafts per sport

5. **`/app/components/draft/DraftTabs.tsx`** (NEW, optional)
   - Tab selector and content container
   - Props: active tab, tab change handler, children

### Files to Modify

1. **`/app/routes/leagues/$leagueId.draft.$seasonId.tsx`**
   - Add full-screen layout container
   - Add sidebar collapsed state
   - Add active tab state
   - Import and render DraftSidebar
   - Render tabbed main content
   - Remove 3-column grid layout
   - Remove Recent Picks section (moved to tab)

2. **`/app/components/DraftGrid.tsx`**
   - Ensure it works in flex container
   - May need height/overflow adjustments

### State Additions

Add to main route component:
```typescript
const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {
  // Check localStorage for user preference
  const stored = localStorage.getItem('draftSidebarCollapsed');
  return stored ? JSON.parse(stored) : false; // Default: expanded
});

const [activeTab, setActiveTab] = useState<'board' | 'picks' | 'teams'>('board');
```

---

## CSS/Styling Strategy

### Layout CSS

```css
/* Main container */
.draft-room-container {
  height: 100vh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

/* Header */
.draft-room-header {
  flex: 0 0 auto;
}

/* Content area */
.draft-room-content {
  flex: 1 1 auto;
  display: flex;
  overflow: hidden;
}

/* Sidebar */
.draft-sidebar {
  flex: 0 0 auto;
  width: 350px; /* Expanded */
  transition: width 0.3s ease, transform 0.3s ease;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
}

.draft-sidebar.collapsed {
  width: 50px;
}

/* Sidebar sections */
.sidebar-section {
  flex: 0 0 auto; /* Queue: take what you need */
  overflow-y: auto;
}

.sidebar-section.grow {
  flex: 1 1 auto; /* Available Participants: take remaining */
}

/* Main content */
.draft-main-content {
  flex: 1 1 auto;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
}

/* Tab content */
.draft-tab-content {
  flex: 1 1 auto;
  overflow-y: auto;
}
```

### Responsive Breakpoints

```css
/* Mobile (<1024px) */
@media (max-width: 1023px) {
  .draft-sidebar {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    z-index: 50;
    transform: translateX(-100%);
  }

  .draft-sidebar.open {
    transform: translateX(0);
  }
}
```

### Teams Drafted Grid Styling

```css
.teams-grid {
  display: grid;
  grid-template-columns: 150px repeat(auto-fit, minmax(120px, 1fr));
  overflow: auto;
}

.teams-grid-cell {
  border: 1px solid var(--border);
  padding: 0.5rem;
  min-height: 60px;
}

.teams-grid-cell.multiple-picks {
  background-color: var(--accent);
  font-weight: 600;
}
```

---

## Implementation Steps

### Phase 1: Setup and Layout Structure
- [x] Create plans directory and documentation
- [ ] Add sidebar collapsed state with localStorage persistence
- [ ] Add active tab state
- [ ] Create full-screen layout container in main route
- [ ] Update header to work with new layout
- [ ] Test basic layout structure

### Phase 2: Sidebar Component
- [ ] Create DraftSidebar.tsx component shell
- [ ] Add collapse/expand toggle button
- [ ] Move Queue section rendering to sidebar
- [ ] Move Available Participants section to sidebar
- [ ] Add internal scrolling for both sections
- [ ] Test sidebar functionality and transitions
- [ ] Add mobile modal behavior

### Phase 3: Tab System
- [ ] Create tab selector UI (choose style based on user feedback)
- [ ] Add Draft Board tab (use existing grid)
- [ ] Add Recent Picks tab (move existing section)
- [ ] Create TeamsDraftedGrid component
- [ ] Implement Teams Drafted grid logic
- [ ] Add flex usage display
- [ ] Add highlighting for multiple picks
- [ ] Test tab switching and content rendering

### Phase 4: Refinement
- [ ] Adjust spacing and padding throughout
- [ ] Test all Socket.IO real-time updates
- [ ] Test all form actions (queue management, making picks)
- [ ] Test responsive behavior (desktop, tablet, mobile)
- [ ] Add keyboard shortcuts (optional)
- [ ] Performance testing with large datasets
- [ ] Accessibility audit (ARIA labels, focus management)

### Phase 5: Polish
- [ ] Animation tuning
- [ ] Dark mode verification
- [ ] Cross-browser testing
- [ ] User acceptance testing

---

## Notes

- Preserve all existing Socket.IO functionality
- Maintain commissioner-specific features (force pick, context menus)
- Keep eligibility calculation logic unchanged
- Ensure autodraft integration remains functional
- Test with various screen sizes and data volumes

---

## Success Criteria

- [ ] Draft room fills viewport (no page scroll)
- [ ] Sidebar collapses/expands smoothly
- [ ] All three tabs render correctly
- [ ] Teams Drafted grid shows accurate data
- [ ] Queue and Available Participants work as before
- [ ] All real-time updates continue to work
- [ ] Mobile experience is usable
- [ ] No regressions in existing functionality
- [ ] Performance is acceptable (no lag during picks/updates)
