{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "mailbox-layout", "title": "Mailbox Layout", "description": "Email mailbox with folder sidebar, email list with checkboxes/stars, read view, and compose view.", "registryDependencies": [ "https://raw.githubusercontent.com/dnachavez/adminlte-next/master/public/r/adminlte-theme.json", "https://raw.githubusercontent.com/dnachavez/adminlte-next/master/public/r/box.json", "https://raw.githubusercontent.com/dnachavez/adminlte-next/master/public/r/adminlte-table.json", "https://raw.githubusercontent.com/dnachavez/adminlte-next/master/public/r/adminlte-button.json" ], "files": [ { "path": "registry/new-york/mailbox-layout/blocks/mailbox-layout.tsx", "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"@/registry/new-york/adminlte-theme/lib/cn\"\n\ninterface MailboxEmail {\n id: string\n from: string\n subject: string\n preview: string\n time: string\n read?: boolean\n starred?: boolean\n hasAttachment?: boolean\n labels?: { text: string; color: string }[]\n}\n\ninterface MailboxFolder {\n id: string\n name: string\n icon?: React.ReactNode\n count?: number\n active?: boolean\n}\n\ninterface MailboxLayoutProps extends React.HTMLAttributes {\n folders?: MailboxFolder[]\n emails?: MailboxEmail[]\n activeFolder?: string\n onFolderClick?: (folderId: string) => void\n onEmailClick?: (emailId: string) => void\n onCompose?: () => void\n selectedEmails?: string[]\n onSelectEmail?: (emailId: string) => void\n onSelectAll?: () => void\n view?: \"inbox\" | \"read\" | \"compose\"\n readContent?: React.ReactNode\n composeContent?: React.ReactNode\n}\n\nfunction MailboxLayout({\n className,\n folders = [],\n emails = [],\n activeFolder,\n onFolderClick,\n onEmailClick,\n onCompose,\n selectedEmails = [],\n onSelectEmail,\n onSelectAll,\n view = \"inbox\",\n readContent,\n composeContent,\n ...props\n}: MailboxLayoutProps) {\n return (\n
\n {/* Sidebar */}\n
\n \n Compose\n \n\n
\n
    \n {folders.map((folder) => (\n
  • \n onFolderClick?.(folder.id)}\n >\n {folder.icon && {folder.icon}}\n {folder.name}\n {folder.count !== undefined && folder.count > 0 && (\n {folder.count}\n )}\n \n
  • \n ))}\n
\n
\n
\n\n {/* Main */}\n
\n
\n {view === \"inbox\" && (\n <>\n {/* Controls */}\n
\n \n \n \n
\n\n {/* Email list */}\n \n \n {emails.map((email) => (\n onEmailClick?.(email.id)}\n >\n \n \n \n \n \n \n ))}\n \n
\n {\n e.stopPropagation()\n onSelectEmail?.(email.id)\n }}\n onClick={(e) => e.stopPropagation()}\n />\n \n {email.starred ? \"★\" : \"☆\"}\n {email.from}\n {email.subject}\n - {email.preview}\n {email.labels?.map((l, i) => (\n \n {l.text}\n \n ))}\n {email.hasAttachment && 📎}\n {email.time}
\n \n )}\n\n {view === \"read\" && (\n
{readContent}
\n )}\n\n {view === \"compose\" && (\n
{composeContent}
\n )}\n
\n
\n
\n )\n}\n\nexport { MailboxLayout }\nexport type { MailboxLayoutProps, MailboxEmail, MailboxFolder }\n", "type": "registry:component" } ], "type": "registry:block" }