/** * FocusCard -- THE ONE THING component. * * Displays a single work item with maximum prominence. * Action buttons and keyboard shortcuts let the user * Start (open in browser), Defer (1h/tomorrow), or Skip. */ import { useCallback, useEffect } from "react"; import { motion, AnimatePresence } from "framer-motion"; import type { FocusItem, FocusItemType, Staleness } from "@/lib/types"; import { computeStaleness } from "@/lib/types"; import { formatIid } from "@/lib/format"; interface FocusCardProps { item: FocusItem | null; onStart: () => void; onDefer1h: () => void; onDeferTomorrow: () => void; onSkip: () => void; } const TYPE_LABELS: Record = { mr_review: "MR REVIEW", issue: "ISSUE", mr_authored: "MR AUTHORED", manual: "TASK", }; const STALENESS_COLORS: Record = { fresh: "bg-mc-fresh/20 text-mc-fresh border-mc-fresh/30", normal: "bg-zinc-700/50 text-zinc-300 border-zinc-600", amber: "bg-mc-amber/20 text-mc-amber border-mc-amber/30", urgent: "bg-mc-urgent/20 text-mc-urgent border-mc-urgent/30", }; export function FocusCard({ item, onStart, onDefer1h, onDeferTomorrow, onSkip, }: FocusCardProps): React.ReactElement { const handleKeyDown = useCallback( (e: KeyboardEvent) => { if (!item) return; if (e.key === "Enter" && !e.metaKey && !e.ctrlKey) { e.preventDefault(); onStart(); } else if (e.key === "s" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); onSkip(); } else if (e.key === "1" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); onDefer1h(); } else if (e.key === "2" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); onDeferTomorrow(); } }, [item, onStart, onSkip, onDefer1h, onDeferTomorrow] ); useEffect(() => { document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [handleKeyDown]); if (!item) { return ; } const staleness = computeStaleness(item.updatedAt); return ( {/* Type badge */}
{TYPE_LABELS[item.type]}
{/* Title */}

{item.title}

{/* Metadata line */}

{formatIid(item.type, item.iid)} in {item.project}

{/* Context quote */} {(item.contextQuote || item.requestedBy) && (
{item.requestedBy && (

@{item.requestedBy}

)} {item.contextQuote && (

“{item.contextQuote}”

)}
)} {/* Action buttons */}
); } function ActionButton({ label, shortcut, onClick, variant = "default", }: { label: string; shortcut: string; onClick: () => void; variant?: "primary" | "default"; }): React.ReactElement { const base = "flex flex-col items-center gap-1 rounded-lg border px-5 py-3 text-sm font-medium transition-colors"; const styles = variant === "primary" ? `${base} border-mc-fresh/40 bg-mc-fresh/10 text-mc-fresh hover:bg-mc-fresh/20` : `${base} border-zinc-600 bg-surface-raised text-zinc-300 hover:bg-surface-overlay hover:text-zinc-100`; return ( ); } function EmptyState(): React.ReactElement { return (

All Clear

Nothing needs your attention right now. Nice work.

); }