{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "smart-inbox-triage",
  "title": "Smart Inbox Triage",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/smart-inbox-triage/SmartInboxTriage.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport {\n  Archive,\n  ArrowDown,\n  ArrowUp,\n  AtSign,\n  Check,\n  CheckCircle2,\n  Clock,\n  Command as CommandIcon,\n  FileText,\n  Forward,\n  Mail,\n  Paperclip,\n  Reply,\n  ReplyAll,\n  Search,\n  Send,\n  Smile,\n  Star,\n  Undo2,\n  X,\n} from 'lucide-react'\nimport { Avatar, AvatarFallback } from '@/components/ui/avatar'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Separator } from '@/components/ui/separator'\nimport { cn } from '@/lib/utils'\n\nexport type InboxCategory = 'vip' | 'team' | 'newsletters' | 'archived'\n\nexport interface EmailMessage {\n  id: string\n  sender: {\n    name: string\n    email: string\n    initials: string\n  }\n  recipient: string\n  subject: string\n  snippet: string\n  body: string\n  timestamp: string\n  fullDate: string\n  category: 'vip' | 'team' | 'newsletters'\n  categoryLabel: string\n  badgeVariant?: 'default' | 'secondary' | 'outline' | 'info' | 'success' | 'warning'\n  unread: boolean\n  starred: boolean\n  archived: boolean\n  snoozed?: boolean\n  attachment?: {\n    name: string\n    size: string\n    type: string\n  }\n}\n\nexport interface SmartInboxTriageProps {\n  initialCategory?: InboxCategory\n  initialSearch?: string\n  initialSelectedId?: string\n  messages?: EmailMessage[]\n  className?: string\n}\n\nconst defaultMessages: EmailMessage[] = [\n  {\n    id: 'msg-1',\n    sender: {\n      name: 'Marcus Vance',\n      email: 'marcus.vance@uipkge.internal',\n      initials: 'MV',\n    },\n    recipient: 'you@uipkge.dev, core-eng@uipkge.dev',\n    subject: 'Architecture Review: Real-time Sync & CRDT Conflict Resolution',\n    snippet: 'I’ve updated the design doc with event-sourcing and CRDT tradeoffs for the multi-region sync engine...',\n    body: `Hey team,\n\nI’ve updated the architecture RFC for the multi-region state synchronization engine. Based on yesterday's benchmark results, we are proceeding with hybrid state-based CRDTs for deterministic document convergence.\n\nKey RFC Highlights:\n• P99 sync latency reduced from 140ms to 24ms across edge worker replicas\n• Deterministic Last-Write-Wins (LWW) resolver for metadata mutations\n• Offline reconciliation buffer with automated exponential retry backoff\n• Zero dependency footprint — pure TypeScript state machines\n\nPlease review the attached technical specification and drop your comments before Thursday's design council.\n\nBest,\nMarcus Vance\nPrincipal Systems Architect`,\n    timestamp: '14:28',\n    fullDate: 'Today at 14:28 PM',\n    category: 'vip',\n    categoryLabel: 'VIP Review',\n    badgeVariant: 'default',\n    unread: true,\n    starred: true,\n    archived: false,\n    attachment: {\n      name: 'sync-engine-rfc-v2.4.pdf',\n      size: '2.4 MB',\n      type: 'PDF',\n    },\n  },\n  {\n    id: 'msg-2',\n    sender: {\n      name: 'Sarah Connor',\n      email: 'sarah.connor@uipkge.internal',\n      initials: 'SC',\n    },\n    recipient: 'you@uipkge.dev, exec@uipkge.dev',\n    subject: 'Q2 OKR Sign-off & Headcount Allocation',\n    snippet: 'Final draft from the leadership offsite. Flagged two key decisions before Wednesday lock...',\n    body: `Hi team,\n\nI’ve compiled the finalized Q2 OKR draft following our executive offsite. There are two strategic items requiring your explicit sign-off before we lock the plan Wednesday EOD:\n\n1. Engineering Headcount: 4 vs. 6 senior backend roles\n2. Multi-cloud deployment schedule: Target June instead of August\n\nPlease review and confirm your alignment so we can present to the board.\n\nThanks,\nSarah Connor\nVP of Engineering`,\n    timestamp: '15:40',\n    fullDate: 'Today at 15:40 PM',\n    category: 'vip',\n    categoryLabel: 'VIP Review',\n    badgeVariant: 'default',\n    unread: true,\n    starred: false,\n    archived: false,\n  },\n  {\n    id: 'msg-3',\n    sender: {\n      name: 'Stripe Merchant Services',\n      email: 'payouts@stripe.com',\n      initials: 'ST',\n    },\n    recipient: 'billing@uipkge.dev',\n    subject: 'Payout Confirmed: $18,420.50 USD',\n    snippet:\n      'Your daily payout for May 18 has been processed and initiated to your linked corporate checking account...',\n    body: `Hello UIPKGE Team,\n\nYour automatic daily payout has been initiated and is on its way to your designated bank account ending in •••• 8842.\n\nTransfer Summary:\n• Gross volume (last 24h): $19,250.00\n• Stripe processing fees: -$829.50\n• Net settled transfer: $18,420.50 USD\n• Estimated arrival: Thursday, May 22, 2026\n\nNo further action is required. You can download your official tax statement and transaction logs directly in the Stripe Merchant Portal.`,\n    timestamp: '12:15',\n    fullDate: 'Today at 12:15 PM',\n    category: 'vip',\n    categoryLabel: 'Finance',\n    badgeVariant: 'success',\n    unread: true,\n    starred: false,\n    archived: false,\n  },\n  {\n    id: 'msg-4',\n    sender: {\n      name: 'GitHub Notifications',\n      email: 'notifications@github.com',\n      initials: 'GH',\n    },\n    recipient: 'you@uipkge.dev',\n    subject: '[PR #412] Merged: feat(tokens): OKLCH color scale & dynamic theme engine',\n    snippet: 'Merged by @uday into main with 4 approvals and all CI checks passing in 42s...',\n    body: `Pull Request #412 has been successfully merged into \\`main\\` by @uday.\n\nBranch: feat/oklch-tokens → main\nApprovals: 4 / 4 (Marcus Vance, Elena Rostova, Devon Patel, Sarah Connor)\nCI Workflow: Build, Typecheck, and Parity Verification passed in 42s.\n\nKey Deliverables:\n• Implemented OKLCH lightness/chroma token scale with WCAG AAA contrast\n• Tailwind v4 @theme inline integration with zero CSS variable bloat\n• 100% test coverage across both Vue and React registry packages\n\nAutomated staging preview is now active at https://staging.uipkge.dev.`,\n    timestamp: '10:45',\n    fullDate: 'Today at 10:45 AM',\n    category: 'team',\n    categoryLabel: 'GitHub',\n    badgeVariant: 'info',\n    unread: false,\n    starred: true,\n    archived: false,\n  },\n  {\n    id: 'msg-5',\n    sender: {\n      name: 'Elena Rostova',\n      email: 'elena.rostova@uipkge.internal',\n      initials: 'ER',\n    },\n    recipient: 'you@uipkge.dev, design-system@uipkge.dev',\n    subject: 'Design Tokens OKLCH Migration Spec & Guidelines',\n    snippet: 'Here is the finalized Figma token mapping and color ramp guide for the new high-contrast theme...',\n    body: `Hi team,\n\nFollowing up on PR #412, I’ve published the companion Figma variables library and developer handoff sheet.\n\nWhat’s included in this release:\n1. Semantic tokens: added \\`--surface-elevated\\` and \\`--sidebar-accent\\`\n2. Focus ring contrast ratios audited across all 14 colorways\n3. Mobile breakpoint typography scale verified with 12px min floor\n4. Tactile micro-transitions mapped to \\`--ease-spring\\` (140ms duration)\n\nPlease review the design system documentation and let me know if any component needs tailored adjustments.\n\nWarmly,\nElena Rostova\nLead Product Designer`,\n    timestamp: '09:12',\n    fullDate: 'Today at 09:12 AM',\n    category: 'team',\n    categoryLabel: 'Design',\n    badgeVariant: 'secondary',\n    unread: false,\n    starred: false,\n    archived: false,\n  },\n  {\n    id: 'msg-6',\n    sender: {\n      name: 'Substack / The Unbundled Engineer',\n      email: 'digest@unbundled.dev',\n      initials: 'SE',\n    },\n    recipient: 'you@uipkge.dev',\n    subject: 'The Unbundled Engineer: Issue #84 — The Rise of Component Registries',\n    snippet:\n      'Why copy-paste component architecture is replacing bloated npm packages across modern frontend engineering...',\n    body: `Welcome to Issue #84 of The Unbundled Engineer.\n\nThis week: Why the component registry model is winning.\n\n\"When you install a traditional monolithic npm UI library, you inherit its dependency tree, its CSS opinions, and its release bottlenecks. When you copy registry source code into your own repository, you gain zero-dependency ownership, effortless code customization, and total UI autonomy.\"\n\nIn this edition:\n• Benchmarking bundle sizes: Registry components vs. Monolithic packages\n• Tactile micro-interactions and keyboard-first inbox triage UX\n• The future of dual-framework design systems (Vue 3.5 & React 19)\n\nRead the full deep-dive on our website.`,\n    timestamp: 'Yesterday',\n    fullDate: 'Yesterday at 17:30 PM',\n    category: 'newsletters',\n    categoryLabel: 'Newsletter',\n    badgeVariant: 'warning',\n    unread: false,\n    starred: false,\n    archived: false,\n  },\n]\n\nexport function SmartInboxTriage({\n  initialCategory = 'vip',\n  initialSearch = '',\n  initialSelectedId = 'msg-1',\n  messages,\n  className,\n}: SmartInboxTriageProps) {\n  const [mails, setMails] = React.useState<EmailMessage[]>(() =>\n    messages ? JSON.parse(JSON.stringify(messages)) : defaultMessages,\n  )\n  const [activeCategory, setActiveCategory] = React.useState<InboxCategory>(initialCategory)\n  const [search, setSearch] = React.useState(initialSearch)\n  const [activeId, setActiveId] = React.useState<string>(initialSelectedId)\n  const [replyMode, setReplyMode] = React.useState<'reply' | 'reply-all' | 'forward'>('reply')\n  const [replyDraft, setReplyDraft] = React.useState('')\n  const [toastMessage, setToastMessage] = React.useState('')\n  const [hasUndo, setHasUndo] = React.useState(false)\n  const [lastArchivedId, setLastArchivedId] = React.useState<string | null>(null)\n  const [commandPaletteOpen, setCommandPaletteOpen] = React.useState(false)\n  const [commandFilter, setCommandFilter] = React.useState('')\n\n  const searchInputRef = React.useRef<HTMLInputElement | null>(null)\n  const replyTextareaRef = React.useRef<HTMLTextAreaElement | null>(null)\n  const toastTimerRef = React.useRef<number | undefined>(undefined)\n\n  const showToast = React.useCallback((msg: string, allowUndo = false) => {\n    setToastMessage(msg)\n    setHasUndo(allowUndo)\n    if (toastTimerRef.current) clearTimeout(toastTimerRef.current)\n    toastTimerRef.current = window.setTimeout(() => {\n      setToastMessage('')\n      setHasUndo(false)\n    }, 4000)\n  }, [])\n\n  const vipCount = React.useMemo(() => mails.filter((m) => !m.archived && m.category === 'vip').length, [mails])\n  const teamCount = React.useMemo(() => mails.filter((m) => !m.archived && m.category === 'team').length, [mails])\n  const newslettersCount = React.useMemo(\n    () => mails.filter((m) => !m.archived && m.category === 'newsletters').length,\n    [mails],\n  )\n  const archivedCount = React.useMemo(() => mails.filter((m) => m.archived).length, [mails])\n  const remainingCount = React.useMemo(() => mails.filter((m) => !m.archived).length, [mails])\n\n  const categoriesList = React.useMemo<Array<{ id: InboxCategory; label: string; count: number }>>(\n    () => [\n      { id: 'vip', label: 'Important & VIP', count: vipCount },\n      { id: 'team', label: 'Team & GitHub', count: teamCount },\n      { id: 'newsletters', label: 'Newsletters', count: newslettersCount },\n      { id: 'archived', label: 'Done / Archived', count: archivedCount },\n    ],\n    [vipCount, teamCount, newslettersCount, archivedCount],\n  )\n\n  const visibleMails = React.useMemo(() => {\n    const q = search.trim().toLowerCase()\n    let list = mails.filter((m) => {\n      if (activeCategory === 'archived') {\n        return m.archived\n      }\n      return !m.archived && m.category === activeCategory\n    })\n\n    if (q) {\n      list = list.filter(\n        (m) =>\n          m.subject.toLowerCase().includes(q) ||\n          m.sender.name.toLowerCase().includes(q) ||\n          m.sender.email.toLowerCase().includes(q) ||\n          m.snippet.toLowerCase().includes(q) ||\n          m.body.toLowerCase().includes(q),\n      )\n    }\n\n    return list\n  }, [mails, activeCategory, search])\n\n  const activeMail = React.useMemo(() => {\n    if (!activeId) return visibleMails[0] ?? null\n    return mails.find((m) => m.id === activeId) ?? visibleMails[0] ?? null\n  }, [mails, activeId, visibleMails])\n\n  const selectMail = React.useCallback((id: string) => {\n    setActiveId(id)\n    setMails((prev) => prev.map((m) => (m.id === id ? { ...m, unread: false } : m)))\n  }, [])\n\n  const selectCategory = React.useCallback(\n    (cat: InboxCategory) => {\n      setActiveCategory(cat)\n      const q = search.trim().toLowerCase()\n      const nextVisible = mails.filter((m) => {\n        if (cat === 'archived') return m.archived\n        return !m.archived && m.category === cat\n      })\n      const filtered = q\n        ? nextVisible.filter(\n            (m) =>\n              m.subject.toLowerCase().includes(q) ||\n              m.sender.name.toLowerCase().includes(q) ||\n              m.sender.email.toLowerCase().includes(q) ||\n              m.snippet.toLowerCase().includes(q) ||\n              m.body.toLowerCase().includes(q),\n          )\n        : nextVisible\n\n      if (filtered[0]) {\n        selectMail(filtered[0].id)\n      } else {\n        setActiveId('')\n      }\n    },\n    [mails, search, selectMail],\n  )\n\n  const archiveMail = React.useCallback(\n    (id?: string) => {\n      const targetId = id ?? activeMail?.id\n      if (!targetId) return\n\n      const item = mails.find((m) => m.id === targetId)\n      if (!item) return\n\n      setMails((prev) => prev.map((m) => (m.id === targetId ? { ...m, archived: true, snoozed: false } : m)))\n      setLastArchivedId(targetId)\n      showToast(`Archived: \"${item.subject}\"`, true)\n\n      // Find next visible email\n      const remainingVisible = visibleMails.filter((m) => m.id !== targetId)\n      if (remainingVisible[0]) {\n        selectMail(remainingVisible[0].id)\n      } else {\n        setActiveId('')\n      }\n    },\n    [activeMail, mails, showToast, visibleMails, selectMail],\n  )\n\n  const snoozeMail = React.useCallback(\n    (id?: string) => {\n      const targetId = id ?? activeMail?.id\n      if (!targetId) return\n\n      const item = mails.find((m) => m.id === targetId)\n      if (!item) return\n\n      setMails((prev) => prev.map((m) => (m.id === targetId ? { ...m, archived: true, snoozed: true } : m)))\n      setLastArchivedId(targetId)\n      showToast('Snoozed until tomorrow 08:00 AM', true)\n\n      const remainingVisible = visibleMails.filter((m) => m.id !== targetId)\n      if (remainingVisible[0]) {\n        selectMail(remainingVisible[0].id)\n      } else {\n        setActiveId('')\n      }\n    },\n    [activeMail, mails, showToast, visibleMails, selectMail],\n  )\n\n  const undoLastAction = React.useCallback(() => {\n    if (!lastArchivedId) return\n    const item = mails.find((m) => m.id === lastArchivedId)\n    if (item) {\n      setMails((prev) => prev.map((m) => (m.id === lastArchivedId ? { ...m, archived: false, snoozed: false } : m)))\n      setActiveCategory(item.category)\n      setActiveId(item.id)\n      showToast(`Restored: \"${item.subject}\"`)\n    }\n    setLastArchivedId(null)\n    setHasUndo(false)\n  }, [lastArchivedId, mails, showToast])\n\n  const toggleStar = React.useCallback(\n    (id?: string, e?: React.MouseEvent) => {\n      e?.stopPropagation()\n      const targetId = id ?? activeMail?.id\n      if (!targetId) return\n      setMails((prev) => prev.map((m) => (m.id === targetId ? { ...m, starred: !m.starred } : m)))\n    },\n    [activeMail],\n  )\n\n  const navigateNext = React.useCallback(() => {\n    if (visibleMails.length === 0) return\n    const currentIndex = visibleMails.findIndex((m) => m.id === activeId)\n    if (currentIndex === -1 || currentIndex >= visibleMails.length - 1) {\n      selectMail(visibleMails[0].id)\n    } else {\n      selectMail(visibleMails[currentIndex + 1].id)\n    }\n  }, [visibleMails, activeId, selectMail])\n\n  const navigatePrev = React.useCallback(() => {\n    if (visibleMails.length === 0) return\n    const currentIndex = visibleMails.findIndex((m) => m.id === activeId)\n    if (currentIndex <= 0) {\n      selectMail(visibleMails[visibleMails.length - 1].id)\n    } else {\n      selectMail(visibleMails[currentIndex - 1].id)\n    }\n  }, [visibleMails, activeId, selectMail])\n\n  const sendReply = React.useCallback(() => {\n    const content = replyDraft.trim()\n    if (!content || !activeMail) return\n\n    const senderName = activeMail.sender.name\n    setReplyDraft('')\n    showToast(`Reply sent to ${senderName}`)\n  }, [replyDraft, activeMail, showToast])\n\n  const markAllRead = React.useCallback(() => {\n    setMails((prev) =>\n      prev.map((m) => {\n        if (activeCategory === 'archived' ? m.archived : !m.archived && m.category === activeCategory) {\n          return { ...m, unread: false }\n        }\n        return m\n      }),\n    )\n    showToast('Marked all as read')\n  }, [activeCategory, showToast])\n\n  const archiveAllInCategory = React.useCallback(() => {\n    if (activeCategory === 'archived') return\n    setMails((prev) => prev.map((m) => (!m.archived && m.category === activeCategory ? { ...m, archived: true } : m)))\n    showToast('All messages in category archived')\n    setActiveId('')\n  }, [activeCategory, showToast])\n\n  // Global Keyboard Navigation\n  React.useEffect(() => {\n    function handleKeyDown(e: KeyboardEvent) {\n      const activeEl = document.activeElement\n      const isInputActive =\n        activeEl instanceof HTMLInputElement ||\n        activeEl instanceof HTMLTextAreaElement ||\n        activeEl?.getAttribute('contenteditable') === 'true'\n\n      // Cmd+K / Ctrl+K\n      if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {\n        e.preventDefault()\n        setCommandPaletteOpen((prev) => !prev)\n        return\n      }\n\n      // Cmd+Z / Ctrl+Z\n      if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z') {\n        e.preventDefault()\n        undoLastAction()\n        return\n      }\n\n      // Cmd+Enter inside reply\n      if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n        if (replyDraft.trim()) {\n          e.preventDefault()\n          sendReply()\n          return\n        }\n      }\n\n      // Escape\n      if (e.key === 'Escape') {\n        if (commandPaletteOpen) {\n          e.preventDefault()\n          setCommandPaletteOpen(false)\n          return\n        }\n        if (isInputActive) {\n          ;(activeEl as HTMLElement).blur()\n          return\n        }\n        if (search) {\n          setSearch('')\n          return\n        }\n      }\n\n      // Guard for typing in inputs\n      if (isInputActive) return\n\n      switch (e.key.toLowerCase()) {\n        case 'j':\n        case 'arrowdown':\n          e.preventDefault()\n          navigateNext()\n          break\n        case 'k':\n        case 'arrowup':\n          e.preventDefault()\n          navigatePrev()\n          break\n        case 'e':\n          e.preventDefault()\n          archiveMail()\n          break\n        case 'h':\n          e.preventDefault()\n          snoozeMail()\n          break\n        case 'r':\n          e.preventDefault()\n          replyTextareaRef.current?.focus()\n          break\n        case 's':\n          e.preventDefault()\n          toggleStar()\n          break\n        case '/':\n          e.preventDefault()\n          searchInputRef.current?.focus()\n          searchInputRef.current?.select()\n          break\n        case '1':\n          e.preventDefault()\n          selectCategory('vip')\n          break\n        case '2':\n          e.preventDefault()\n          selectCategory('team')\n          break\n        case '3':\n          e.preventDefault()\n          selectCategory('newsletters')\n          break\n        case '4':\n          e.preventDefault()\n          selectCategory('archived')\n          break\n      }\n    }\n\n    window.addEventListener('keydown', handleKeyDown)\n    return () => {\n      window.removeEventListener('keydown', handleKeyDown)\n      if (toastTimerRef.current) clearTimeout(toastTimerRef.current)\n    }\n  }, [\n    archiveMail,\n    commandPaletteOpen,\n    navigateNext,\n    navigatePrev,\n    replyDraft,\n    search,\n    selectCategory,\n    sendReply,\n    snoozeMail,\n    toggleStar,\n    undoLastAction,\n  ])\n\n  const commandPaletteItems = React.useMemo(\n    () => [\n      { key: 'E', label: 'Archive active email', action: () => archiveMail() },\n      { key: 'H', label: 'Snooze until tomorrow', action: () => snoozeMail() },\n      {\n        key: 'R',\n        label: 'Reply to sender',\n        action: () => {\n          replyTextareaRef.current?.focus()\n        },\n      },\n      { key: 'S', label: 'Toggle star / priority', action: () => toggleStar() },\n      { key: '1', label: 'Switch to Important & VIP', action: () => selectCategory('vip') },\n      { key: '2', label: 'Switch to Team & GitHub', action: () => selectCategory('team') },\n      { key: '3', label: 'Switch to Newsletters', action: () => selectCategory('newsletters') },\n      { key: '4', label: 'Switch to Done / Archived', action: () => selectCategory('archived') },\n      { key: 'Shift+A', label: 'Mark all as read in current category', action: () => markAllRead() },\n      { key: 'Shift+E', label: 'Archive all in category', action: () => archiveAllInCategory() },\n    ],\n    [archiveAllInCategory, archiveMail, markAllRead, selectCategory, snoozeMail, toggleStar],\n  )\n\n  const filteredCommandPaletteItems = React.useMemo(() => {\n    const q = commandFilter.trim().toLowerCase()\n    if (!q) return commandPaletteItems\n    return commandPaletteItems.filter((i) => i.label.toLowerCase().includes(q) || i.key.toLowerCase().includes(q))\n  }, [commandFilter, commandPaletteItems])\n\n  function executeCommand(action: () => void) {\n    action()\n    setCommandPaletteOpen(false)\n    setCommandFilter('')\n  }\n\n  return (\n    <div\n      data-slot=\"smart-inbox-triage\"\n      className={cn(\n        'bg-card text-card-foreground border-border relative flex flex-col overflow-hidden rounded-xl border shadow-xs',\n        className,\n      )}\n    >\n      {/* TOP COMMAND BAR */}\n      <header className=\"bg-card/95 border-border/80 border-b px-4 py-3 backdrop-blur-xs\">\n        <div className=\"flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between\">\n          {/* Left: Inbox Status & Goal Badge */}\n          <div className=\"flex flex-wrap items-center gap-2.5\">\n            <div className=\"bg-primary/10 border-primary/20 text-foreground inline-flex items-center gap-2 rounded-full border px-3 py-1 text-xs font-semibold tracking-tight\">\n              <span className=\"bg-primary size-2 animate-pulse rounded-full\" />\n              <span>Inbox Zero Goal</span>\n              <span className=\"text-primary font-mono tabular-nums\">\n                {remainingCount === 0 ? 'Zero Achieved 🎉' : `${remainingCount} Messages Remaining`}\n              </span>\n            </div>\n\n            <div className=\"border-border/70 bg-muted/40 text-muted-foreground hidden items-center gap-1.5 rounded-full border px-3 py-1 text-xs xl:inline-flex\">\n              <span>Shortcuts:</span>\n              <kbd className=\"bg-card border-border/80 text-foreground rounded border px-1.5 py-0.5 font-mono text-xs\">\n                E\n              </kbd>\n              <span>Archive</span>\n              <kbd className=\"bg-card border-border/80 text-foreground rounded border px-1.5 py-0.5 font-mono text-xs\">\n                H\n              </kbd>\n              <span>Snooze</span>\n              <kbd className=\"bg-card border-border/80 text-foreground rounded border px-1.5 py-0.5 font-mono text-xs\">\n                R\n              </kbd>\n              <span>Reply</span>\n              <kbd className=\"bg-card border-border/80 text-foreground rounded border px-1.5 py-0.5 font-mono text-xs\">\n                J/K\n              </kbd>\n              <span>Navigate</span>\n            </div>\n          </div>\n\n          {/* Right: Search Bar & Command Key Trigger */}\n          <div className=\"flex items-center gap-2\">\n            <div className=\"relative w-full sm:w-72\">\n              <Search className=\"text-muted-foreground absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2\" />\n              <input\n                ref={searchInputRef}\n                value={search}\n                onChange={(e) => setSearch(e.target.value)}\n                type=\"text\"\n                placeholder=\"Search messages...\"\n                className=\"border-input bg-background text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 h-8 w-full rounded-md border pr-8 pl-8 text-xs shadow-xs focus-visible:ring-2 focus-visible:outline-none\"\n              />\n              <kbd className=\"bg-muted text-muted-foreground border-border/70 absolute top-1/2 right-2 -translate-y-1/2 rounded border px-1 font-mono text-xs\">\n                /\n              </kbd>\n            </div>\n\n            <Button\n              aria-label=\"Close command palette\"\n              variant=\"outline\"\n              size=\"sm\"\n              className=\"h-8 shrink-0 gap-1.5 px-2.5 text-xs font-medium\"\n              onClick={() => setCommandPaletteOpen(true)}\n            >\n              <CommandIcon className=\"size-3.5\" />\n              <span className=\"hidden sm:inline\">Commands</span>\n              <kbd className=\"bg-muted text-muted-foreground border-border/60 ml-0.5 rounded border px-1 font-mono text-xs\">\n                ⌘K\n              </kbd>\n            </Button>\n          </div>\n        </div>\n\n        {/* Split Category Tabs Bar */}\n        <div className=\"border-border/40 mt-3 flex items-center justify-between border-t pt-2.5\">\n          <nav className=\"flex flex-wrap items-center gap-1.5\" aria-label=\"Inbox Categories\">\n            {categoriesList.map((cat) => (\n              <button\n                key={cat.id}\n                type=\"button\"\n                className={cn(\n                  'inline-flex items-center gap-2 rounded-md px-3 py-1.5 text-xs font-medium transition-colors duration-150',\n                  activeCategory === cat.id\n                    ? 'bg-primary text-primary-foreground shadow-xs'\n                    : 'text-muted-foreground hover:bg-muted/70 hover:text-foreground',\n                )}\n                onClick={() => selectCategory(cat.id)}\n              >\n                <span>{cat.label}</span>\n                <span\n                  className={cn(\n                    'inline-flex h-4 min-w-4 items-center justify-center rounded-full px-1 font-mono text-xs font-semibold tabular-nums',\n                    activeCategory === cat.id\n                      ? 'bg-primary-foreground/20 text-primary-foreground'\n                      : 'bg-muted text-foreground',\n                  )}\n                >\n                  {cat.count}\n                </span>\n              </button>\n            ))}\n          </nav>\n\n          <div className=\"hidden items-center gap-1 sm:flex\">\n            <Button\n              variant=\"ghost\"\n              size=\"sm\"\n              className=\"text-muted-foreground hover:text-foreground h-7 px-2 text-xs\"\n              onClick={markAllRead}\n            >\n              <Check className=\"mr-1 size-3\" />\n              Mark read\n            </Button>\n          </div>\n        </div>\n      </header>\n\n      {/* 2-COLUMN SPLIT PANE */}\n      <div className=\"grid h-[620px] grid-cols-1 md:grid-cols-[384px_1fr]\">\n        {/* LEFT: EMAIL LIST (w-96) */}\n        <aside className=\"bg-card border-border flex min-w-0 flex-col border-r\">\n          {/* List Header */}\n          <div className=\"bg-muted/20 border-border/80 flex h-11 shrink-0 items-center justify-between border-b px-3.5\">\n            <div className=\"flex items-center gap-2\">\n              <span className=\"text-muted-foreground text-xs font-semibold tracking-tight uppercase\">\n                {categoriesList.find((c) => c.id === activeCategory)?.label}\n              </span>\n              <Badge variant=\"outline\" className=\"h-4 px-1.5 font-mono text-xs tabular-nums\">\n                {visibleMails.length}\n              </Badge>\n            </div>\n            <span className=\"text-muted-foreground/80 font-mono text-xs\">[J/K] navigate</span>\n          </div>\n\n          {/* Scrollable Messages Feed */}\n          <div className=\"list-scroll divide-border/40 flex-1 divide-y overflow-y-auto\">\n            {visibleMails.map((mail) => (\n              <div\n                key={mail.id}\n                role=\"button\"\n                tabIndex={0}\n                className={cn(\n                  'group relative flex cursor-pointer flex-col gap-1 px-4 py-3 text-left transition-colors duration-150',\n                  mail.id === activeMail?.id\n                    ? 'bg-accent/70 text-accent-foreground'\n                    : 'hover:bg-muted/40 text-foreground',\n                )}\n                onClick={() => selectMail(mail.id)}\n                onKeyDown={(e) => {\n                  if (e.key === 'Enter' || e.key === ' ') {\n                    e.preventDefault()\n                    selectMail(mail.id)\n                  }\n                }}\n              >\n                {/* Active indicator left bar */}\n                {mail.id === activeMail?.id && (\n                  <span className=\"bg-primary absolute top-2 bottom-2 left-0 w-[3px] rounded-r-full\" />\n                )}\n\n                {/* Row 1: Sender avatar, name, time, star */}\n                <div className=\"flex items-center justify-between gap-2\">\n                  <div className=\"flex min-w-0 items-center gap-2.5\">\n                    <Avatar className=\"size-6 shrink-0 text-xs\">\n                      <AvatarFallback className=\"bg-muted text-xs font-semibold\">{mail.sender.initials}</AvatarFallback>\n                    </Avatar>\n                    <p\n                      className={cn(\n                        'truncate text-xs',\n                        mail.unread ? 'text-foreground font-semibold' : 'text-foreground/80 font-medium',\n                      )}\n                    >\n                      {mail.sender.name}\n                    </p>\n                  </div>\n\n                  <div className=\"flex shrink-0 items-center gap-1.5\">\n                    <span className=\"text-muted-foreground font-mono text-xs tabular-nums\">{mail.timestamp}</span>\n                    <button\n                      type=\"button\"\n                      className={cn(\n                        'hover:text-warning inline-flex size-6 items-center justify-center rounded transition-colors',\n                        mail.starred ? 'text-warning' : 'text-muted-foreground/40 hover:text-muted-foreground',\n                      )}\n                      title={mail.starred ? 'Unstar message' : 'Star message'}\n                      onClick={(e) => toggleStar(mail.id, e)}\n                    >\n                      <Star className={cn('size-3.5', mail.starred ? 'fill-warning' : '')} />\n                    </button>\n                  </div>\n                </div>\n\n                {/* Row 2: Subject line with unread bullet */}\n                <div className=\"mt-0.5 flex items-center gap-1.5\">\n                  {mail.unread && <span className=\"bg-primary size-1.5 shrink-0 rounded-full\" />}\n                  <p\n                    className={cn(\n                      'truncate text-xs tracking-tight',\n                      mail.unread ? 'text-foreground font-semibold' : 'text-foreground/90 font-medium',\n                    )}\n                  >\n                    {mail.subject}\n                  </p>\n                </div>\n\n                {/* Row 3: 1-line snippet */}\n                <p className=\"text-muted-foreground line-clamp-1 text-xs leading-relaxed\">{mail.snippet}</p>\n\n                {/* Row 4: Category badge and attachment */}\n                <div className=\"mt-1 flex items-center justify-between gap-2\">\n                  <Badge variant={mail.badgeVariant ?? 'secondary'} className=\"h-4.5 px-1.5 text-xs font-medium\">\n                    {mail.categoryLabel}\n                  </Badge>\n\n                  {mail.attachment && (\n                    <div className=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                      <Paperclip className=\"size-3\" />\n                      <span>{mail.attachment.type}</span>\n                    </div>\n                  )}\n                </div>\n              </div>\n            ))}\n\n            {/* Empty State */}\n            {visibleMails.length === 0 && (\n              <div className=\"flex flex-col items-center justify-center px-6 py-20 text-center\">\n                <div className=\"bg-muted/80 text-muted-foreground mb-3 flex size-12 items-center justify-center rounded-full\">\n                  <CheckCircle2 className=\"text-primary size-6\" />\n                </div>\n                <p className=\"text-foreground text-sm font-semibold\">Inbox Zero Achieved</p>\n                <p className=\"text-muted-foreground mt-1 max-w-[220px] text-xs\">\n                  No emails in {categoriesList.find((c) => c.id === activeCategory)?.label}. You are completely caught\n                  up!\n                </p>\n                {activeCategory !== 'archived' && (\n                  <Button\n                    variant=\"outline\"\n                    size=\"sm\"\n                    className=\"mt-4 h-7 text-xs\"\n                    onClick={() => selectCategory('archived')}\n                  >\n                    View Archived\n                  </Button>\n                )}\n              </div>\n            )}\n          </div>\n        </aside>\n\n        {/* RIGHT: SELECTED EMAIL READER & QUICK ACTION */}\n        <main className=\"bg-background flex min-w-0 flex-col overflow-hidden\">\n          {activeMail ? (\n            <>\n              {/* Top Action Bar */}\n              <div className=\"bg-card/80 border-border flex h-11 shrink-0 items-center justify-between gap-2 overflow-x-auto border-b px-4 backdrop-blur-xs\">\n                <div className=\"flex items-center gap-1\">\n                  <Button\n                    variant=\"outline\"\n                    size=\"sm\"\n                    className=\"h-7 gap-1 px-2.5 text-xs font-medium shadow-xs\"\n                    onClick={() => archiveMail(activeMail.id)}\n                  >\n                    <Archive className=\"size-3.5\" />\n                    <span>Archive</span>\n                    <kbd className=\"bg-muted text-muted-foreground border-border/80 ml-0.5 rounded border px-1 font-mono text-xs\">\n                      E\n                    </kbd>\n                  </Button>\n\n                  <Button\n                    variant=\"outline\"\n                    size=\"sm\"\n                    className=\"h-7 gap-1 px-2.5 text-xs font-medium shadow-xs\"\n                    onClick={() => snoozeMail(activeMail.id)}\n                  >\n                    <Clock className=\"size-3.5\" />\n                    <span>Snooze</span>\n                    <kbd className=\"bg-muted text-muted-foreground border-border/80 ml-0.5 rounded border px-1 font-mono text-xs\">\n                      H\n                    </kbd>\n                  </Button>\n\n                  <Button\n                    variant=\"outline\"\n                    size=\"sm\"\n                    className=\"h-7 gap-1 px-2.5 text-xs font-medium shadow-xs\"\n                    onClick={() => replyTextareaRef.current?.focus()}\n                  >\n                    <Reply className=\"size-3.5\" />\n                    <span>Reply</span>\n                    <kbd className=\"bg-muted text-muted-foreground border-border/80 ml-0.5 rounded border px-1 font-mono text-xs\">\n                      R\n                    </kbd>\n                  </Button>\n\n                  <Button\n                    variant=\"ghost\"\n                    size=\"icon\"\n                    className=\"size-7\"\n                    title={activeMail.starred ? 'Unstar' : 'Star'}\n                    onClick={(e) => toggleStar(activeMail.id, e)}\n                  >\n                    <Star\n                      className={cn(\n                        'size-4',\n                        activeMail.starred ? 'fill-warning text-warning' : 'text-muted-foreground',\n                      )}\n                    />\n                  </Button>\n                </div>\n\n                {/* Reader Navigation buttons */}\n                <div className=\"flex items-center gap-1\">\n                  <Button\n                    variant=\"ghost\"\n                    size=\"icon\"\n                    className=\"text-muted-foreground size-7\"\n                    title=\"Previous (K)\"\n                    onClick={navigatePrev}\n                    aria-label=\"Action\"\n                  >\n                    <ArrowUp className=\"size-3.5\" />\n                  </Button>\n                  <Button\n                    variant=\"ghost\"\n                    size=\"icon\"\n                    className=\"text-muted-foreground size-7\"\n                    title=\"Next (J)\"\n                    onClick={navigateNext}\n                    aria-label=\"Action\"\n                  >\n                    <ArrowDown className=\"size-3.5\" />\n                  </Button>\n                </div>\n              </div>\n\n              {/* Toast Feedback Notification Banner */}\n              {toastMessage && (\n                <div className=\"bg-primary text-primary-foreground flex items-center justify-between px-4 py-2 text-xs font-medium shadow-xs transition-colors\">\n                  <div className=\"flex items-center gap-2\">\n                    <Check className=\"size-3.5\" />\n                    <span>{toastMessage}</span>\n                  </div>\n                  {hasUndo && (\n                    <button\n                      type=\"button\"\n                      className=\"bg-primary-foreground/20 hover:bg-primary-foreground/30 inline-flex items-center gap-1 rounded px-2 py-0.5 text-xs font-semibold transition-colors\"\n                      onClick={undoLastAction}\n                    >\n                      <Undo2 className=\"size-3\" />\n                      <span>Undo (⌘Z)</span>\n                    </button>\n                  )}\n                </div>\n              )}\n\n              {/* Reader Scroll Area */}\n              <div className=\"reader-scroll flex-1 overflow-y-auto px-6 py-5\">\n                {/* Subject Title */}\n                <div className=\"flex items-start justify-between gap-4\">\n                  <h1 className=\"text-foreground text-lg font-bold tracking-tight sm:text-xl lg:text-2xl\">\n                    {activeMail.subject}\n                  </h1>\n                  <Badge variant={activeMail.badgeVariant ?? 'default'} className=\"shrink-0 text-xs\">\n                    {activeMail.categoryLabel}\n                  </Badge>\n                </div>\n\n                {/* Sender & Recipient Information Card */}\n                <div className=\"border-border/80 bg-muted/20 mt-4 flex items-start gap-3 rounded-lg border p-3.5\">\n                  <Avatar className=\"size-9 shrink-0\">\n                    <AvatarFallback className=\"bg-primary/10 text-primary text-xs font-bold\">\n                      {activeMail.sender.initials}\n                    </AvatarFallback>\n                  </Avatar>\n\n                  <div className=\"min-w-0 flex-1\">\n                    <div className=\"flex flex-wrap items-baseline justify-between gap-x-2\">\n                      <p className=\"text-foreground min-w-0 truncate text-sm font-semibold\">\n                        {activeMail.sender.name}{' '}\n                        <span className=\"text-muted-foreground text-xs font-normal\">\n                          &lt;{activeMail.sender.email}&gt;\n                        </span>\n                      </p>\n                      <span className=\"text-muted-foreground font-mono text-xs tabular-nums\">\n                        {activeMail.fullDate}\n                      </span>\n                    </div>\n                    <p className=\"text-muted-foreground mt-0.5 text-xs\">\n                      to <span className=\"text-foreground/80 font-medium\">{activeMail.recipient}</span>\n                    </p>\n                  </div>\n                </div>\n\n                <Separator className=\"my-5\" />\n\n                {/* Email Body Content */}\n                <article className=\"text-foreground/90 space-y-4 text-sm leading-relaxed whitespace-pre-wrap\">\n                  {activeMail.body}\n                </article>\n\n                {/* Attachment Tile */}\n                {activeMail.attachment && (\n                  <div className=\"mt-6\">\n                    <p className=\"text-muted-foreground mb-2 text-xs font-semibold tracking-wider uppercase\">\n                      Attachment\n                    </p>\n                    <div className=\"border-border/80 bg-card hover:bg-muted/30 flex max-w-sm items-center justify-between gap-3 rounded-lg border p-3 shadow-xs\">\n                      <div className=\"flex items-center gap-3\">\n                        <div className=\"bg-info/10 text-info flex size-9 items-center justify-center rounded-md\">\n                          <FileText className=\"size-4\" />\n                        </div>\n                        <div>\n                          <p className=\"text-foreground text-xs font-semibold\">{activeMail.attachment.name}</p>\n                          <p className=\"text-muted-foreground font-mono text-xs\">\n                            {activeMail.attachment.size} · {activeMail.attachment.type}\n                          </p>\n                        </div>\n                      </div>\n                      <Button aria-label=\"Download attachment\" variant=\"outline\" size=\"sm\" className=\"h-7 px-2 text-xs\">\n                        Download\n                      </Button>\n                    </div>\n                  </div>\n                )}\n              </div>\n\n              {/* Quick Reply Composer */}\n              <div className=\"border-border bg-card border-t p-3.5\">\n                <div className=\"mb-2 flex items-center justify-between\">\n                  {/* Mode pills */}\n                  <div className=\"flex items-center gap-1\">\n                    <button\n                      type=\"button\"\n                      className={cn(\n                        'inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-colors',\n                        replyMode === 'reply'\n                          ? 'bg-primary/10 text-primary font-semibold'\n                          : 'text-muted-foreground hover:bg-muted',\n                      )}\n                      onClick={() => setReplyMode('reply')}\n                    >\n                      <Reply className=\"size-3\" />\n                      Reply\n                    </button>\n                    <button\n                      type=\"button\"\n                      className={cn(\n                        'inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-colors',\n                        replyMode === 'reply-all'\n                          ? 'bg-primary/10 text-primary font-semibold'\n                          : 'text-muted-foreground hover:bg-muted',\n                      )}\n                      onClick={() => setReplyMode('reply-all')}\n                    >\n                      <ReplyAll className=\"size-3\" />\n                      Reply all\n                    </button>\n                    <button\n                      type=\"button\"\n                      className={cn(\n                        'inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-colors',\n                        replyMode === 'forward'\n                          ? 'bg-primary/10 text-primary font-semibold'\n                          : 'text-muted-foreground hover:bg-muted',\n                      )}\n                      onClick={() => setReplyMode('forward')}\n                    >\n                      <Forward className=\"size-3\" />\n                      Forward\n                    </button>\n                  </div>\n\n                  <span className=\"text-muted-foreground hidden min-w-0 truncate font-mono text-xs lg:inline\">\n                    To: {activeMail.sender.email}\n                  </span>\n                </div>\n\n                {/* Composer Input Box */}\n                <div className=\"border-input bg-background focus-within:border-ring focus-within:ring-ring/50 relative flex flex-col rounded-lg border shadow-xs focus-within:ring-2\">\n                  <textarea\n                    ref={replyTextareaRef}\n                    value={replyDraft}\n                    onChange={(e) => setReplyDraft(e.target.value)}\n                    rows={2}\n                    placeholder={`Write a reply to ${activeMail.sender.name}... (⌘↵ to send)`}\n                    className=\"placeholder:text-muted-foreground w-full resize-none bg-transparent px-3 py-2 text-xs leading-relaxed outline-none\"\n                  />\n\n                  <div className=\"border-border/40 flex items-center justify-between border-t px-2 py-1.5\">\n                    <div className=\"flex items-center gap-0.5\">\n                      <Button\n                        aria-label=\"Attach file\"\n                        variant=\"ghost\"\n                        size=\"icon\"\n                        className=\"text-muted-foreground hover:text-foreground size-7\"\n                      >\n                        <Paperclip className=\"size-3.5\" />\n                      </Button>\n                      <Button\n                        aria-label=\"Add emoji\"\n                        variant=\"ghost\"\n                        size=\"icon\"\n                        className=\"text-muted-foreground hover:text-foreground size-7\"\n                      >\n                        <Smile className=\"size-3.5\" />\n                      </Button>\n                      <Button\n                        aria-label=\"Mention someone\"\n                        variant=\"ghost\"\n                        size=\"icon\"\n                        className=\"text-muted-foreground hover:text-foreground size-7\"\n                      >\n                        <AtSign className=\"size-3.5\" />\n                      </Button>\n                    </div>\n\n                    <div className=\"flex items-center gap-2\">\n                      <kbd className=\"bg-muted text-muted-foreground border-border/70 hidden rounded border px-1.5 py-0.5 font-mono text-xs sm:inline-flex\">\n                        ⌘↵\n                      </kbd>\n                      <Button\n                        size=\"sm\"\n                        className=\"h-7 gap-1 px-3 text-xs font-semibold shadow-xs\"\n                        disabled={!replyDraft.trim()}\n                        onClick={sendReply}\n                      >\n                        <span>Send</span>\n                        <Send className=\"size-3\" />\n                      </Button>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </>\n          ) : (\n            /* No Email Selected Placeholder */\n            <div className=\"flex flex-1 flex-col items-center justify-center p-8 text-center\">\n              <div className=\"bg-muted/60 text-muted-foreground mb-3 flex size-14 items-center justify-center rounded-full\">\n                <Mail className=\"size-7\" />\n              </div>\n              <p className=\"text-foreground text-sm font-semibold\">No message selected</p>\n              <p className=\"text-muted-foreground mt-1 max-w-sm text-xs\">\n                Select an email from the list or use J/K to navigate through your triage queue.\n              </p>\n            </div>\n          )}\n        </main>\n      </div>\n\n      {/* COMMAND PALETTE MODAL (⌘K) */}\n      {commandPaletteOpen && (\n        <div\n          className=\"bg-background/80 fixed inset-0 z-50 flex items-center justify-center p-4 backdrop-blur-xs\"\n          onClick={(e) => {\n            if (e.target === e.currentTarget) setCommandPaletteOpen(false)\n          }}\n        >\n          <div className=\"bg-card text-card-foreground border-border animate-in fade-in-0 zoom-in-95 w-full max-w-lg overflow-hidden rounded-xl border shadow-xl\">\n            <div className=\"border-border flex items-center border-b px-3 py-2.5\">\n              <CommandIcon className=\"text-muted-foreground mr-2 size-4\" />\n              <input\n                value={commandFilter}\n                onChange={(e) => setCommandFilter(e.target.value)}\n                type=\"text\"\n                placeholder=\"Type a command or shortcut...\"\n                className=\"placeholder:text-muted-foreground w-full bg-transparent text-xs outline-none\"\n                autoFocus\n              />\n              <button\n                type=\"button\"\n                className=\"text-muted-foreground hover:text-foreground ml-2 rounded p-1\"\n                aria-label=\"Close command palette\"\n                onClick={() => setCommandPaletteOpen(false)}\n              >\n                <X className=\"size-4\" />\n              </button>\n            </div>\n\n            <div className=\"max-h-72 overflow-y-auto p-2\">\n              <p className=\"text-muted-foreground px-2 py-1 text-xs font-semibold tracking-wider uppercase\">\n                High Velocity Actions\n              </p>\n              {filteredCommandPaletteItems.map((item) => (\n                <button\n                  key={item.key}\n                  type=\"button\"\n                  className=\"hover:bg-muted/70 flex w-full items-center justify-between rounded-md px-2.5 py-1.5 text-left text-xs transition-colors\"\n                  onClick={() => executeCommand(item.action)}\n                >\n                  <span>{item.label}</span>\n                  <kbd className=\"bg-muted text-muted-foreground border-border/80 rounded border px-1.5 py-0.5 font-mono text-xs\">\n                    {item.key}\n                  </kbd>\n                </button>\n              ))}\n            </div>\n\n            <div className=\"bg-muted/40 border-border text-muted-foreground flex items-center justify-between border-t px-3 py-2 text-xs\">\n              <span>\n                Use <strong>Esc</strong> to close\n              </span>\n              <span>Superhuman Mode Active</span>\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/SmartInboxTriage.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/avatar.json",
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/separator.json"
  ],
  "description": "Superhuman-style high-velocity email inbox triage command center with keyboard shortcuts, split category tabs (VIP, Team & GitHub, Newsletters, Archived), dual-pane split reader, fast triage actions (Archive, Snooze, Star, Quick Reply), and command palette.",
  "categories": [
    "communication",
    "productivity",
    "layout"
  ]
}