'use client'; import { motion } from 'framer-motion'; import { useMemo, useState } from 'react'; import type { KanbanFilterOptions } from '../../lib/kanban'; import { buildKanbanColumns, buildKanbanStats, filterKanbanIssues } from '../../lib/kanban'; import type { BeadIssue } from '../../lib/types'; import { KanbanBoard } from './kanban-board'; import { KanbanControls } from './kanban-controls'; import { KanbanDetail } from './kanban-detail'; interface KanbanPageProps { issues: BeadIssue[]; } export function KanbanPage({ issues }: KanbanPageProps) { const [filters, setFilters] = useState({ query: '', type: '', priority: '', showClosed: false, }); const [selectedIssueId, setSelectedIssueId] = useState(issues[0]?.id ?? null); const [mobileDetailOpen, setMobileDetailOpen] = useState(false); const filteredIssues = useMemo(() => filterKanbanIssues(issues, filters), [issues, filters]); const columns = useMemo(() => buildKanbanColumns(filteredIssues), [filteredIssues]); const stats = useMemo(() => buildKanbanStats(filteredIssues), [filteredIssues]); const selectedIssue = useMemo( () => filteredIssues.find((issue) => issue.id === selectedIssueId) ?? filteredIssues[0] ?? null, [filteredIssues, selectedIssueId], ); return (

BeadBoard

Kanban Dashboard

Tracer Bullet 1 from live `.beads/issues.jsonl` on Windows-native paths.

{ setSelectedIssueId(issue.id); setMobileDetailOpen(true); }} />
{mobileDetailOpen && selectedIssue ? (
) : null}
); }