beadboard/src/components/shared/left-panel.tsx

205 lines
7.4 KiB
TypeScript
Raw Normal View History

feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
'use client';
import { useState, useMemo } from 'react';
import type { BeadIssue } from '../../lib/types';
import { useResponsive } from '../../hooks/use-responsive';
import { cn } from '../../lib/utils';
export interface LeftPanelProps {
issues: BeadIssue[];
selectedEpicId?: string | null;
onEpicSelect?: (epicId: string | null) => void;
}
interface EpicNode {
epic: BeadIssue;
children: BeadIssue[];
}
function buildEpicTree(issues: BeadIssue[]): EpicNode[] {
const epics = issues.filter(issue => issue.issue_type === 'epic');
const epicMap = new Map<string, EpicNode>();
for (const epic of epics) {
epicMap.set(epic.id, { epic, children: [] });
}
for (const issue of issues) {
if (issue.issue_type === 'epic') continue;
const parentDep = issue.dependencies.find(dep => dep.type === 'parent');
if (parentDep && epicMap.has(parentDep.target)) {
epicMap.get(parentDep.target)!.children.push(issue);
}
}
return Array.from(epicMap.values()).sort((a, b) =>
a.epic.id.localeCompare(b.epic.id)
);
}
export function LeftPanel({
issues,
selectedEpicId,
onEpicSelect,
}: LeftPanelProps) {
const [expandedEpics, setExpandedEpics] = useState<Set<string>>(new Set());
const { isDesktop, isTablet } = useResponsive();
const epicTree = useMemo(() => buildEpicTree(issues), [issues]);
const toggleEpic = (epicId: string) => {
setExpandedEpics(prev => {
const next = new Set(prev);
if (next.has(epicId)) {
next.delete(epicId);
} else {
next.add(epicId);
}
return next;
});
};
const handleEpicClick = (epicId: string) => {
onEpicSelect?.(epicId === selectedEpicId ? null : epicId); // Toggle selection
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
toggleEpic(epicId);
};
if (isTablet) {
return (
<div
className="w-16 overflow-y-auto flex flex-col items-center py-4 gap-2 bg-[#1a1a1a]/95 backdrop-blur-xl border-r border-white/5"
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
data-testid="left-panel"
>
{epicTree.map(({ epic }) => (
<button
key={epic.id}
type="button"
onClick={() => handleEpicClick(epic.id)}
className={cn(
'w-10 h-10 rounded-xl flex items-center justify-center text-xs font-bold transition-all duration-200',
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
selectedEpicId === epic.id
? 'bg-teal-500/20 text-teal-400 ring-1 ring-teal-500/30 shadow-[0_0_10px_rgba(45,212,191,0.2)]'
: 'hover:bg-white/5 text-text-muted hover:text-white'
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
)}
title={epic.title || epic.id}
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
>
{epic.id.slice(0, 2).toUpperCase()}
</button>
))}
</div>
);
}
return (
<div
className={cn(
'flex flex-col h-full overflow-hidden transition-all duration-300',
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
!isDesktop && 'hidden lg:flex'
)}
style={{
width: '18rem', // Wider panel
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
}}
data-testid="left-panel"
>
<div className="h-full bg-[#1a1a1a]/95 backdrop-blur-xl border-r border-white/5 flex flex-col">
{/* Header */}
<div className="p-4 border-b border-white/5 flex items-center justify-between">
<span className="text-xs font-bold uppercase tracking-[0.2em] text-text-muted">Channels</span>
<span className="text-[10px] font-mono text-text-muted/40">{epicTree.length}</span>
</div>
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
{/* Tree */}
<div className="flex-1 overflow-y-auto custom-scrollbar p-2">
{epicTree.map(({ epic, children }) => {
const isExpanded = expandedEpics.has(epic.id);
const isSelected = selectedEpicId === epic.id;
const childCount = children.length;
return (
<div key={epic.id} className="mb-1">
<button
type="button"
onClick={() => handleEpicClick(epic.id)}
className={cn(
'w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-left transition-all duration-200 group',
isSelected
? 'bg-teal-500/10 text-teal-400 border border-teal-500/20'
: 'hover:bg-white/5 text-text-secondary hover:text-white border border-transparent'
)}
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
>
<div className={cn(
"w-1 h-4 rounded-full transition-colors",
isSelected ? "bg-teal-500 shadow-[0_0_8px_#14b8a6]" : "bg-white/10 group-hover:bg-white/30"
)} />
<span className="flex-1 truncate text-sm font-medium tracking-tight">
{epic.title || epic.id}
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
</span>
{childCount > 0 && (
<span className={cn(
"text-[10px] font-mono px-1.5 py-0.5 rounded transition-colors",
isSelected ? "bg-teal-500/20 text-teal-300" : "bg-white/5 text-text-muted group-hover:bg-white/10"
)}>
{childCount}
</span>
)}
</button>
{/* Sub-items (Agents/Tasks usually, but here listed as children) */}
{isExpanded && childCount > 0 && (
<div className="ml-4 mt-1 pl-3 border-l border-white/5 space-y-0.5">
{children.slice(0, 5).map(child => (
<div
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
key={child.id}
className="px-3 py-1.5 text-xs text-text-muted/60 truncate hover:text-text-muted cursor-default"
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
>
{child.title}
</div>
))}
{childCount > 5 && (
<div className="px-3 py-1 text-[10px] text-text-muted/30 italic">
+{childCount - 5} more
</div>
)}
</div>
)}
</div>
);
})}
{epicTree.length === 0 && (
<div className="p-8 text-center opacity-40 flex flex-col items-center">
<div className="text-2xl mb-2">📡</div>
<p className="text-xs font-mono">NO_CHANNELS</p>
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
</div>
)}
</div>
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
{/* Footer Scope */}
<div className="p-4 border-t border-white/5 bg-black/20">
<label className="flex items-center gap-3 cursor-pointer group">
<div className="relative flex items-center justify-center">
<input
type="checkbox"
defaultChecked
onChange={() => onEpicSelect?.(null)} // Clear selection
checked={selectedEpicId === null}
className="peer appearance-none w-4 h-4 rounded border border-white/20 bg-transparent checked:bg-teal-500 checked:border-teal-500 transition-all"
/>
<svg className="absolute w-3 h-3 text-white opacity-0 peer-checked:opacity-100 pointer-events-none" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3" strokeLinecap="round" strokeLinejoin="round">
<polyline points="20 6 9 17 4 12"></polyline>
</svg>
</div>
<span className="text-xs font-medium text-text-secondary group-hover:text-white transition-colors">
Global Scope (All)
</span>
feat(ui): complete shell layout components (bb-ui2.6, .7, .8, .9, .27) STORY: Phase 1 of the Unified UX epic required a complete 3-panel shell layout with responsive behavior across mobile, tablet, and desktop breakpoints. The existing page structure was fragmented - we needed a cohesive shell. COLLABORATION: Three agents (bb-5am, bb-dwz, bb-3dv) worked in parallel on: - TopBar: View tabs (Social/Graph/Swarm) with active states, filter input - LeftPanel: Channel tree navigation with epic filtering, responsive collapse - RightPanel: Detail strip with sidebar (desktop) / drawer (tablet/mobile) modes We encountered a hydration mismatch error on mobile/tablet because useResponsive was returning different values on server vs client. Fixed by defaulting to desktop on server and only updating after mount. Mobile navigation (bb-ui2.27) added: - Hamburger menu for left panel access on mobile/tablet - Bottom tab bar for thumb-friendly view switching DELIVERABLES: - src/components/shared/top-bar.tsx: TopBar with view tabs + hamburger - src/components/shared/left-panel.tsx: Epic tree with expand/collapse - src/components/shared/right-panel.tsx: Responsive sidebar/drawer - src/components/shared/unified-shell.tsx: Main 3-panel grid layout - src/components/shared/mobile-nav.tsx: Bottom tab bar for mobile - src/hooks/use-responsive.ts: Breakpoint detection (mobile/tablet/desktop) - Tests for all components VERIFICATION: - npm run typecheck: PASS - npm run lint: PASS - npm run test: PASS CLOSES: bb-ui2.6, bb-ui2.7, bb-ui2.8, bb-ui2.9, bb-ui2.27
2026-02-15 23:19:52 -08:00
</label>
</div>
</div>
</div>
);
}
export default LeftPanel;