@echothink-ui/inbox 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +5 -0
  2. package/dist/components/AgentDraftReviewPanel.d.ts +18 -0
  3. package/dist/components/ApprovalToSendPanel.d.ts +11 -0
  4. package/dist/components/AttachmentList.d.ts +8 -0
  5. package/dist/components/AttachmentPreview.d.ts +7 -0
  6. package/dist/components/EmailAutomationRulePanel.d.ts +8 -0
  7. package/dist/components/InboxShell.d.ts +10 -0
  8. package/dist/components/LabelManager.d.ts +9 -0
  9. package/dist/components/MailboxFolderList.d.ts +8 -0
  10. package/dist/components/MessageComposer.d.ts +13 -0
  11. package/dist/components/MessageFilterBar.d.ts +13 -0
  12. package/dist/components/MessageList.d.ts +8 -0
  13. package/dist/components/MessagePreview.d.ts +9 -0
  14. package/dist/components/MessageSearch.d.ts +11 -0
  15. package/dist/components/MessageThread.d.ts +22 -0
  16. package/dist/components/PriorityInboxView.d.ts +14 -0
  17. package/dist/components/RecipientPicker.d.ts +10 -0
  18. package/dist/components/ThreadSummaryPanel.d.ts +9 -0
  19. package/dist/index.cjs +1699 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.css +2155 -0
  22. package/dist/index.css.map +1 -0
  23. package/dist/index.d.ts +21 -0
  24. package/dist/index.js +1645 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/types.d.ts +75 -0
  27. package/dist/utils.d.ts +5 -0
  28. package/package.json +44 -0
  29. package/src/components/AgentDraftReviewPanel.tsx +128 -0
  30. package/src/components/ApprovalToSendPanel.tsx +118 -0
  31. package/src/components/AttachmentList.tsx +85 -0
  32. package/src/components/AttachmentPreview.tsx +207 -0
  33. package/src/components/EmailAutomationRulePanel.tsx +100 -0
  34. package/src/components/InboxShell.tsx +62 -0
  35. package/src/components/LabelManager.tsx +147 -0
  36. package/src/components/MailboxFolderList.tsx +66 -0
  37. package/src/components/MessageComposer.tsx +160 -0
  38. package/src/components/MessageFilterBar.test.tsx +34 -0
  39. package/src/components/MessageFilterBar.tsx +69 -0
  40. package/src/components/MessageList.tsx +101 -0
  41. package/src/components/MessagePreview.test.tsx +48 -0
  42. package/src/components/MessagePreview.tsx +84 -0
  43. package/src/components/MessageSearch.tsx +96 -0
  44. package/src/components/MessageThread.tsx +173 -0
  45. package/src/components/PriorityInboxView.tsx +74 -0
  46. package/src/components/RecipientPicker.tsx +181 -0
  47. package/src/components/ThreadSummaryPanel.tsx +107 -0
  48. package/src/index.test.tsx +276 -0
  49. package/src/index.tsx +60 -0
  50. package/src/styles.css +2523 -0
  51. package/src/types.ts +85 -0
  52. package/src/utils.ts +33 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/InboxShell.tsx","../src/components/MailboxFolderList.tsx","../src/components/MessageList.tsx","../src/utils.ts","../src/components/MessageThread.tsx","../src/components/MessagePreview.tsx","../src/components/AttachmentList.tsx","../src/components/MessageComposer.tsx","../src/components/AttachmentPreview.tsx","../src/components/RecipientPicker.tsx","../src/components/LabelManager.tsx","../src/components/MessageSearch.tsx","../src/components/MessageFilterBar.tsx","../src/components/PriorityInboxView.tsx","../src/components/EmailAutomationRulePanel.tsx","../src/components/AgentDraftReviewPanel.tsx","../src/components/ApprovalToSendPanel.tsx","../src/components/ThreadSummaryPanel.tsx","../src/index.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type { SurfaceComponentProps } from \"@echothink-ui/core\";\n\nexport interface InboxShellProps extends SurfaceComponentProps {\n folders?: React.ReactNode;\n list?: React.ReactNode;\n thread?: React.ReactNode;\n inspector?: React.ReactNode;\n toolbar?: React.ReactNode;\n}\n\nexport function InboxShell({\n folders,\n list,\n thread,\n inspector,\n toolbar,\n className,\n title,\n description,\n ...props\n}: InboxShellProps) {\n const hasInspector = Boolean(inspector);\n\n return (\n <section\n {...props}\n className={`eth-inbox-shell ${className ?? \"\"}`}\n data-eth-component=\"InboxShell\"\n >\n {(title || description || toolbar) && (\n <header className=\"eth-inbox-shell__header\">\n <div>\n {title ? <h2>{title}</h2> : null}\n {description ? <p>{description}</p> : null}\n </div>\n {toolbar ? <div className=\"eth-inbox-shell__toolbar\">{toolbar}</div> : null}\n </header>\n )}\n <div\n className={`eth-inbox-shell__layout ${\n hasInspector ? \"eth-inbox-shell__layout--has-inspector\" : \"\"\n }`}\n >\n <aside className=\"eth-inbox-shell__folders\" aria-label=\"Mailbox folders\">\n {folders}\n </aside>\n <aside className=\"eth-inbox-shell__list\" aria-label=\"Message list\">\n {list}\n </aside>\n <main className=\"eth-inbox-shell__thread\" aria-label=\"Selected conversation\">\n {thread}\n </main>\n {inspector ? (\n <aside className=\"eth-inbox-shell__inspector\" aria-label=\"Conversation inspector\">\n {inspector}\n </aside>\n ) : null}\n </div>\n </section>\n );\n}\n","import * as React from \"react\";\nimport { Badge } from \"@echothink-ui/core\";\nimport type { MailboxFolder } from \"../types\";\n\nexport interface MailboxFolderListProps extends Omit<\n React.HTMLAttributes<HTMLElement>,\n \"onSelect\"\n> {\n folders?: MailboxFolder[];\n activeFolderId?: string;\n onSelect?: (id: string) => void;\n}\n\nexport function MailboxFolderList({\n folders = [],\n activeFolderId,\n onSelect,\n className,\n \"aria-label\": ariaLabel = \"Mailbox folders\",\n ...props\n}: MailboxFolderListProps) {\n return (\n <nav\n {...props}\n className={[\"eth-inbox-folders\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"MailboxFolderList\"\n aria-label={ariaLabel}\n >\n <ul className=\"eth-inbox-folders__list\">\n {folders.map((folder) => {\n const isActive = activeFolderId === folder.id;\n\n return (\n <li key={folder.id}>\n <button\n type=\"button\"\n className={[\n \"eth-inbox-folders__item\",\n isActive ? \"eth-inbox-folders__item--active\" : \"\",\n folder.smart ? \"eth-inbox-folders__item--smart\" : \"\"\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-current={isActive ? \"page\" : undefined}\n onClick={() => onSelect?.(folder.id)}\n title={folder.label}\n >\n {folder.icon ? (\n <span className=\"eth-inbox-folders__icon\" aria-hidden=\"true\">\n {folder.icon}\n </span>\n ) : null}\n <span className=\"eth-inbox-folders__label\">{folder.label}</span>\n {typeof folder.count === \"number\" ? (\n <Badge className=\"eth-inbox-folders__count\" aria-label={`${folder.count} items`}>\n {folder.count}\n </Badge>\n ) : null}\n </button>\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import * as React from \"react\";\nimport { Badge, StatusDot, Tag, statusLabel } from \"@echothink-ui/core\";\nimport type { InboxThread } from \"../types\";\nimport { formatDateTime, prioritySeverity } from \"../utils\";\n\nexport interface MessageListProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n threads?: InboxThread[];\n selectedThreadId?: string;\n onSelect?: (threadId: string) => void;\n}\n\nexport function MessageList({\n threads = [],\n selectedThreadId,\n onSelect,\n className,\n ...props\n}: MessageListProps) {\n const hasThreads = threads.length > 0;\n\n return (\n <div\n {...props}\n className={`eth-inbox-message-list ${className ?? \"\"}`}\n role=\"listbox\"\n aria-label=\"Message threads\"\n data-eth-component=\"MessageList\"\n >\n {hasThreads ? (\n threads.map((thread, index) => {\n const receivedAtLabel = formatDateTime(thread.receivedAt);\n const selected = selectedThreadId === thread.id;\n const hasMeta = Boolean(thread.priority || thread.labels?.length || thread.status);\n\n return (\n <button\n key={thread.id}\n type=\"button\"\n role=\"option\"\n aria-label={[\n thread.unread ? \"Unread\" : \"Read\",\n `From ${thread.from}`,\n thread.subject,\n `Received ${receivedAtLabel}`,\n thread.priority ? `${thread.priority} priority` : null,\n thread.status ? statusLabel(thread.status) : null\n ]\n .filter(Boolean)\n .join(\", \")}\n aria-posinset={index + 1}\n aria-selected={selected}\n aria-setsize={threads.length}\n className={`eth-inbox-message-list__row ${\n thread.unread ? \"eth-inbox-message-list__row--unread\" : \"\"\n }`}\n onClick={() => onSelect?.(thread.id)}\n >\n <span className=\"eth-inbox-message-list__selection\" aria-hidden=\"true\" />\n <span className=\"eth-inbox-message-list__content\">\n <span className=\"eth-inbox-message-list__header\">\n <span className=\"eth-inbox-message-list__from-group\">\n <span className=\"eth-inbox-message-list__unread\" aria-hidden=\"true\" />\n <span className=\"eth-inbox-message-list__from\">{thread.from}</span>\n </span>\n <time className=\"eth-inbox-message-list__date\" dateTime={thread.receivedAt}>\n {receivedAtLabel}\n </time>\n </span>\n <strong className=\"eth-inbox-message-list__subject\">{thread.subject}</strong>\n <span className=\"eth-inbox-message-list__preview\">{thread.preview}</span>\n {hasMeta ? (\n <span className=\"eth-inbox-message-list__meta\">\n {thread.priority ? (\n <Badge severity={prioritySeverity(thread.priority)}>\n {thread.priority}\n </Badge>\n ) : null}\n {thread.labels?.map((label) => (\n <Tag key={label}>{label}</Tag>\n ))}\n {thread.status ? (\n <StatusDot status={thread.status} label={statusLabel(thread.status)} />\n ) : null}\n </span>\n ) : null}\n </span>\n </button>\n );\n })\n ) : (\n <div\n className=\"eth-inbox-message-list__empty\"\n role=\"status\"\n aria-label=\"No message threads\"\n >\n No message threads\n </div>\n )}\n </div>\n );\n}\n","export function formatDateTime(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\"\n }).format(date);\n}\n\nexport function formatBytes(size: number) {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${Math.round(size / 1024)} KB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function listToInput(value: string[] | undefined) {\n return value?.join(\", \") ?? \"\";\n}\n\nexport function inputToList(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nexport function prioritySeverity(priority: \"high\" | \"normal\" | \"low\" | undefined) {\n if (priority === \"high\") return \"danger\";\n if (priority === \"low\") return \"neutral\";\n return \"info\";\n}\n","import * as React from \"react\";\nimport { Badge, Button, StatusDot } from \"@echothink-ui/core\";\nimport type { EthDensity, EthIntent, EthOperationalStatus } from \"@echothink-ui/core\";\nimport type { Attachment, MessageThreadModel, ThreadMessage } from \"../types\";\nimport { formatDateTime } from \"../utils\";\nimport { MessagePreview } from \"./MessagePreview\";\n\nexport interface MessageThreadAction {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n intent?: EthIntent;\n density?: EthDensity;\n disabled?: boolean;\n onSelect?: () => void;\n}\n\nexport interface MessageThreadProps extends React.HTMLAttributes<HTMLElement> {\n thread?: MessageThreadModel;\n summaryRef?: React.ReactNode;\n status?: EthOperationalStatus;\n statusLabel?: React.ReactNode;\n actions?: MessageThreadAction[];\n onPreviewAttachment?: (attachment: Attachment) => void;\n onDownloadAttachment?: (attachment: Attachment) => void;\n}\n\nexport function MessageThread({\n thread,\n summaryRef,\n status,\n statusLabel,\n actions = [],\n onPreviewAttachment,\n onDownloadAttachment,\n className,\n ...props\n}: MessageThreadProps) {\n const messages = React.useMemo(\n () =>\n [...(thread?.messages ?? [])].sort(\n (a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()\n ),\n [thread?.messages]\n );\n const older = messages.slice(0, Math.max(0, messages.length - 3));\n const recent = messages.slice(Math.max(0, messages.length - 3));\n const participantCount = countParticipants(messages);\n const attachmentCount = messages.reduce(\n (count, message) => count + (message.attachments?.length ?? 0),\n 0\n );\n const latestMessage = messages.at(-1);\n const messageLabel = formatCount(messages.length, \"message\");\n const participantLabel = formatCount(participantCount, \"participant\");\n const attachmentLabel = formatCount(attachmentCount, \"attachment\");\n\n return (\n <article\n {...props}\n className={`eth-inbox-thread ${className ?? \"\"}`}\n data-eth-component=\"MessageThread\"\n >\n <header className=\"eth-inbox-thread__header\">\n <div className=\"eth-inbox-thread__heading\">\n <span className=\"eth-inbox-thread__eyebrow\">Conversation thread</span>\n <h2>{thread?.subject ?? \"Thread\"}</h2>\n <ul className=\"eth-inbox-thread__meta\" aria-label=\"Thread metadata\">\n <li>\n <Badge severity=\"neutral\">{messageLabel}</Badge>\n </li>\n <li>\n <Badge severity=\"neutral\">{participantLabel}</Badge>\n </li>\n {attachmentCount ? (\n <li>\n <Badge severity=\"info\">{attachmentLabel}</Badge>\n </li>\n ) : null}\n {status ? (\n <li>\n <StatusDot status={status} label={statusLabel ?? statusToLabel(status)} />\n </li>\n ) : null}\n {latestMessage ? (\n <li className=\"eth-inbox-thread__updated\">\n Last activity{\" \"}\n <time dateTime={latestMessage.date}>{formatDateTime(latestMessage.date)}</time>\n </li>\n ) : null}\n </ul>\n </div>\n {actions.length ? (\n <div className=\"eth-inbox-thread__actions\" role=\"group\" aria-label=\"Thread actions\">\n {actions.map((action) => (\n <Button\n key={action.id}\n intent={action.intent ?? \"secondary\"}\n density={action.density ?? \"compact\"}\n disabled={action.disabled}\n icon={action.icon}\n onClick={action.onSelect}\n >\n {action.label}\n </Button>\n ))}\n </div>\n ) : null}\n </header>\n {summaryRef ? (\n <aside className=\"eth-inbox-thread__summary\" aria-label=\"Thread summary\">\n <span className=\"eth-inbox-thread__summary-label\">Thread summary</span>\n <div className=\"eth-inbox-thread__summary-body\">{summaryRef}</div>\n </aside>\n ) : null}\n {!messages.length ? (\n <div className=\"eth-inbox-thread__empty\" role=\"status\">\n <strong>No messages in this thread</strong>\n <span>Replies, summaries, and attachment activity will appear here.</span>\n </div>\n ) : null}\n {older.length ? (\n <details className=\"eth-inbox-thread__older\">\n <summary>{formatCount(older.length, \"older message\")}</summary>\n {older.map((message) => (\n <MessagePreview\n key={message.id}\n message={message}\n showSubject={false}\n onPreviewAttachment={onPreviewAttachment}\n onDownloadAttachment={onDownloadAttachment}\n />\n ))}\n </details>\n ) : null}\n <div className=\"eth-inbox-thread__messages\">\n {recent.map((message) => (\n <MessagePreview\n key={message.id}\n message={message}\n showSubject={false}\n onPreviewAttachment={onPreviewAttachment}\n onDownloadAttachment={onDownloadAttachment}\n />\n ))}\n </div>\n </article>\n );\n}\n\nfunction countParticipants(messages: ThreadMessage[]) {\n const participants = new Set<string>();\n\n messages.forEach((message) => {\n participants.add(message.from);\n message.to.forEach((recipient) => participants.add(recipient));\n message.cc?.forEach((recipient) => participants.add(recipient));\n message.bcc?.forEach((recipient) => participants.add(recipient));\n });\n\n return participants.size;\n}\n\nfunction formatCount(value: number, singular: string) {\n return `${value} ${value === 1 ? singular : `${singular}s`}`;\n}\n\nfunction statusToLabel(status: EthOperationalStatus) {\n return status\n .split(\"-\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n","import * as React from \"react\";\nimport type { Attachment, ThreadMessage } from \"../types\";\nimport { formatDateTime } from \"../utils\";\nimport { AttachmentList } from \"./AttachmentList\";\n\nexport interface MessagePreviewProps extends React.HTMLAttributes<HTMLElement> {\n message: ThreadMessage;\n showSubject?: boolean;\n onPreviewAttachment?: (attachment: Attachment) => void;\n onDownloadAttachment?: (attachment: Attachment) => void;\n}\n\nexport function MessagePreview({\n message,\n showSubject = true,\n onPreviewAttachment,\n onDownloadAttachment,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ...props\n}: MessagePreviewProps) {\n const subjectId = React.useId();\n const attachmentsHeadingId = React.useId();\n const visibleSubject = showSubject ? message.subject : undefined;\n const labelledBy = ariaLabel\n ? ariaLabelledBy\n : ariaLabelledBy ?? (visibleSubject ? subjectId : undefined);\n const computedAriaLabel = ariaLabel ?? (labelledBy ? undefined : \"Message preview\");\n const hasAttachments = Boolean(message.attachments?.length);\n\n return (\n <article\n {...props}\n className={[\"eth-inbox-message-preview\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"MessagePreview\"\n aria-label={computedAriaLabel}\n aria-labelledby={labelledBy}\n >\n <header className=\"eth-inbox-message-preview__header\">\n <div className=\"eth-inbox-message-preview__heading\">\n {visibleSubject ? <h3 id={subjectId}>{visibleSubject}</h3> : null}\n <dl className=\"eth-inbox-message-preview__recipients\" aria-label=\"Message routing\">\n <div>\n <dt>From</dt>\n <dd>{message.from}</dd>\n </div>\n <div>\n <dt>To</dt>\n <dd>{formatRecipients(message.to)}</dd>\n </div>\n {message.cc?.length ? (\n <div>\n <dt>Cc</dt>\n <dd>{formatRecipients(message.cc)}</dd>\n </div>\n ) : null}\n </dl>\n </div>\n <time dateTime={message.date}>{formatDateTime(message.date)}</time>\n </header>\n <div className=\"eth-inbox-message-preview__body\">\n <p>{message.body}</p>\n </div>\n {hasAttachments ? (\n <section\n className=\"eth-inbox-message-preview__attachments\"\n aria-labelledby={attachmentsHeadingId}\n >\n <h4 id={attachmentsHeadingId}>Attachments</h4>\n <AttachmentList\n attachments={message.attachments}\n onPreview={onPreviewAttachment}\n onDownload={onDownloadAttachment}\n />\n </section>\n ) : null}\n </article>\n );\n}\n\nfunction formatRecipients(recipients: string[]) {\n return recipients.length ? recipients.join(\", \") : \"No recipients\";\n}\n","import * as React from \"react\";\nimport { IconButton } from \"@echothink-ui/core\";\nimport { DocumentIcon, DownloadIcon, ViewIcon } from \"@echothink-ui/icons\";\nimport type { Attachment } from \"../types\";\nimport { formatBytes } from \"../utils\";\n\nexport interface AttachmentListProps extends React.HTMLAttributes<HTMLDivElement> {\n attachments?: Attachment[];\n onPreview?: (attachment: Attachment) => void;\n onDownload?: (attachment: Attachment) => void;\n}\n\nexport function AttachmentList({\n attachments = [],\n onPreview,\n onDownload,\n className,\n role,\n \"aria-label\": ariaLabel,\n ...props\n}: AttachmentListProps) {\n if (!attachments.length) return null;\n return (\n <div\n {...props}\n className={[\"eth-inbox-attachments\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"AttachmentList\"\n role={role ?? \"list\"}\n aria-label={ariaLabel ?? \"Message attachments\"}\n >\n {attachments.map((attachment) => {\n const typeLabel = attachmentTypeLabel(attachment);\n const hasActions = Boolean(onPreview || onDownload);\n\n return (\n <div key={attachment.id} className=\"eth-inbox-attachments__tile\" role=\"listitem\">\n <span className=\"eth-inbox-attachments__icon\" aria-hidden=\"true\">\n <DocumentIcon size={18} />\n </span>\n <div className=\"eth-inbox-attachments__content\">\n <strong title={attachment.name}>{attachment.name}</strong>\n <span className=\"eth-inbox-attachments__meta\">\n <span className=\"eth-inbox-attachments__type\">{typeLabel}</span>\n <span>{attachment.mimeType}</span>\n <span>{formatBytes(attachment.size)}</span>\n </span>\n </div>\n {hasActions ? (\n <div\n className=\"eth-inbox-attachments__actions\"\n aria-label={`Actions for ${attachment.name}`}\n >\n {onPreview ? (\n <IconButton\n intent=\"ghost\"\n density=\"compact\"\n label={`Preview ${attachment.name}`}\n icon={<ViewIcon size={16} />}\n onClick={() => onPreview(attachment)}\n />\n ) : null}\n {onDownload ? (\n <IconButton\n intent=\"ghost\"\n density=\"compact\"\n label={`Download ${attachment.name}`}\n icon={<DownloadIcon size={16} />}\n onClick={() => onDownload(attachment)}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction attachmentTypeLabel(attachment: Attachment) {\n const extension = attachment.name.split(\".\").pop();\n if (extension && extension !== attachment.name) return extension.slice(0, 4).toUpperCase();\n const subtype = attachment.mimeType.split(\"/\").pop();\n return subtype ? subtype.slice(0, 4).toUpperCase() : \"FILE\";\n}\n","import * as React from \"react\";\nimport { Button, FormField, Textarea, TextInput } from \"@echothink-ui/core\";\nimport { DocumentIcon, MessageIcon } from \"@echothink-ui/icons\";\nimport type { MessageDraft } from \"../types\";\nimport { inputToList, listToInput } from \"../utils\";\nimport { AttachmentList } from \"./AttachmentList\";\n\nexport interface MessageComposerProps extends Omit<\n React.FormHTMLAttributes<HTMLFormElement>,\n \"onChange\" | \"onSubmit\"\n> {\n draft?: MessageDraft;\n onChange?: (draft: MessageDraft) => void;\n onSend?: (draft: MessageDraft) => void;\n onDiscard?: () => void;\n onAttach?: () => void;\n recipients?: React.ReactNode;\n attachments?: React.ReactNode;\n statusText?: React.ReactNode;\n}\n\nexport function MessageComposer({\n draft = {},\n onChange,\n onSend,\n onDiscard,\n onAttach,\n recipients,\n attachments,\n statusText,\n className,\n ...props\n}: MessageComposerProps) {\n const [localDraft, setLocalDraft] = React.useState<MessageDraft>(draft);\n\n React.useEffect(() => setLocalDraft(draft), [draft]);\n\n const update = (next: MessageDraft) => {\n setLocalDraft(next);\n onChange?.(next);\n };\n\n const draftAttachments = localDraft.attachments ?? [];\n const hasAttachmentsRegion = Boolean(attachments || draftAttachments.length || onAttach);\n\n return (\n <form\n {...props}\n className={[\"eth-inbox-composer\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"MessageComposer\"\n onSubmit={(event) => {\n event.preventDefault();\n onSend?.(localDraft);\n }}\n >\n <div className=\"eth-inbox-composer__fields\">\n {recipients ?? (\n <div className=\"eth-inbox-composer__address-fields\" role=\"group\" aria-label=\"Recipients\">\n <FormField\n className=\"eth-inbox-composer__field eth-inbox-composer__field--address\"\n label=\"To\"\n >\n <TextInput\n density=\"compact\"\n placeholder=\"name@company.com\"\n value={listToInput(localDraft.to)}\n onChange={(event) =>\n update({ ...localDraft, to: inputToList(event.currentTarget.value) })\n }\n />\n </FormField>\n <FormField\n className=\"eth-inbox-composer__field eth-inbox-composer__field--address\"\n label=\"CC\"\n >\n <TextInput\n density=\"compact\"\n placeholder=\"Optional\"\n value={listToInput(localDraft.cc)}\n onChange={(event) =>\n update({ ...localDraft, cc: inputToList(event.currentTarget.value) })\n }\n />\n </FormField>\n <FormField\n className=\"eth-inbox-composer__field eth-inbox-composer__field--address\"\n label=\"BCC\"\n >\n <TextInput\n density=\"compact\"\n placeholder=\"Optional\"\n value={listToInput(localDraft.bcc)}\n onChange={(event) =>\n update({ ...localDraft, bcc: inputToList(event.currentTarget.value) })\n }\n />\n </FormField>\n </div>\n )}\n <FormField\n className=\"eth-inbox-composer__field eth-inbox-composer__field--subject\"\n label=\"Subject\"\n >\n <TextInput\n density=\"compact\"\n value={localDraft.subject ?? \"\"}\n onChange={(event) => update({ ...localDraft, subject: event.currentTarget.value })}\n />\n </FormField>\n <FormField\n className=\"eth-inbox-composer__field eth-inbox-composer__field--body\"\n label=\"Body\"\n >\n <Textarea\n value={localDraft.body ?? \"\"}\n rows={10}\n onChange={(event) => update({ ...localDraft, body: event.currentTarget.value })}\n />\n </FormField>\n </div>\n\n {hasAttachmentsRegion ? (\n <section className=\"eth-inbox-composer__attachments\" aria-label=\"Draft attachments\">\n <div className=\"eth-inbox-composer__attachments-header\">\n <span>Attachments</span>\n {onAttach ? (\n <Button\n type=\"button\"\n intent=\"tertiary\"\n density=\"compact\"\n icon={<DocumentIcon size={16} />}\n onClick={onAttach}\n >\n Attach file\n </Button>\n ) : null}\n </div>\n {attachments ??\n (draftAttachments.length ? (\n <AttachmentList attachments={draftAttachments} />\n ) : (\n <p className=\"eth-inbox-composer__empty-attachments\">No attachments added</p>\n ))}\n </section>\n ) : null}\n\n <div className=\"eth-inbox-composer__footer\">\n {statusText ? <p className=\"eth-inbox-composer__status\">{statusText}</p> : null}\n <div className=\"eth-inbox-composer__actions\">\n <Button type=\"submit\" icon={<MessageIcon size={16} />}>\n Send\n </Button>\n <Button type=\"button\" intent=\"tertiary\" onClick={onDiscard}>\n Discard\n </Button>\n </div>\n </div>\n </form>\n );\n}\n","import * as React from \"react\";\nimport type { Attachment } from \"../types\";\nimport { formatBytes } from \"../utils\";\n\nexport interface AttachmentPreviewProps extends React.HTMLAttributes<HTMLElement> {\n attachment?: Attachment;\n children?: React.ReactNode;\n}\n\nexport function AttachmentPreview({\n attachment,\n children,\n className,\n ...props\n}: AttachmentPreviewProps) {\n const kind = getPreviewKind(attachment);\n const previewSource = attachment?.previewUrl ?? attachment?.src;\n const hasCustomPreview = children !== undefined && children !== null;\n const label = attachment ? `Attachment preview for ${attachment.name}` : \"Attachment preview\";\n\n return (\n <section\n {...props}\n aria-label={props[\"aria-label\"] ?? label}\n className={`eth-inbox-attachment-preview ${className ?? \"\"}`}\n data-eth-component=\"AttachmentPreview\"\n >\n {attachment ? (\n <header className=\"eth-inbox-attachment-preview__header\">\n <div className=\"eth-inbox-attachment-preview__file\">\n <span\n className=\"eth-inbox-attachment-preview__glyph\"\n data-kind={kind}\n aria-hidden=\"true\"\n >\n {kindToken(kind)}\n </span>\n <div className=\"eth-inbox-attachment-preview__summary\">\n <strong title={attachment.name}>{attachment.name}</strong>\n <span>\n {attachment.mimeType} - {formatBytes(attachment.size)}\n </span>\n </div>\n </div>\n <span className=\"eth-inbox-attachment-preview__state\">{previewStateLabel(kind)}</span>\n </header>\n ) : null}\n <div\n className={`eth-inbox-attachment-preview__body eth-inbox-attachment-preview__body--${kind}`}\n >\n {hasCustomPreview ? children : renderDefaultPreview(attachment, kind, previewSource)}\n </div>\n </section>\n );\n}\n\ntype AttachmentPreviewKind =\n | \"empty\"\n | \"pdf\"\n | \"image\"\n | \"text\"\n | \"spreadsheet\"\n | \"archive\"\n | \"file\";\n\nfunction getPreviewKind(attachment?: Attachment): AttachmentPreviewKind {\n if (!attachment) return \"empty\";\n const mimeType = attachment.mimeType.toLowerCase();\n const name = attachment.name.toLowerCase();\n\n if (mimeType === \"application/pdf\" || name.endsWith(\".pdf\")) return \"pdf\";\n if (mimeType.startsWith(\"image/\")) return \"image\";\n if (\n mimeType.includes(\"spreadsheet\") ||\n mimeType.includes(\"csv\") ||\n name.endsWith(\".csv\") ||\n name.endsWith(\".xls\") ||\n name.endsWith(\".xlsx\")\n ) {\n return \"spreadsheet\";\n }\n if (\n mimeType.startsWith(\"text/\") ||\n [\"application/json\", \"application/xml\", \"application/yaml\"].includes(mimeType) ||\n name.endsWith(\".md\")\n ) {\n return \"text\";\n }\n if (\n mimeType.includes(\"zip\") ||\n mimeType.includes(\"compressed\") ||\n name.endsWith(\".zip\") ||\n name.endsWith(\".gz\")\n ) {\n return \"archive\";\n }\n\n return \"file\";\n}\n\nfunction kindToken(kind: AttachmentPreviewKind) {\n if (kind === \"pdf\") return \"PDF\";\n if (kind === \"image\") return \"IMG\";\n if (kind === \"text\") return \"TXT\";\n if (kind === \"spreadsheet\") return \"CSV\";\n if (kind === \"archive\") return \"ZIP\";\n return \"FILE\";\n}\n\nfunction previewStateLabel(kind: AttachmentPreviewKind) {\n if (kind === \"archive\" || kind === \"file\") return \"Preview unavailable\";\n return \"Inline preview\";\n}\n\nfunction renderDefaultPreview(\n attachment: Attachment | undefined,\n kind: AttachmentPreviewKind,\n previewSource?: string\n) {\n if (!attachment) {\n return (\n <div className=\"eth-inbox-attachment-preview__empty\">\n <strong>No attachment selected</strong>\n <span>PDF, image, text, and spreadsheet files can be previewed inline.</span>\n </div>\n );\n }\n\n if (kind === \"image\") {\n return previewSource ? (\n <img\n className=\"eth-inbox-attachment-preview__image\"\n src={previewSource}\n alt={`${attachment.name} preview`}\n />\n ) : (\n <div\n className=\"eth-inbox-attachment-preview__image-frame\"\n role=\"img\"\n aria-label={`${attachment.name} image preview`}\n >\n <span />\n <span />\n </div>\n );\n }\n\n if (kind === \"text\") {\n return (\n <div\n className=\"eth-inbox-attachment-preview__text\"\n role=\"img\"\n aria-label={`${attachment.name} text preview`}\n >\n {Array.from({ length: 9 }, (_, index) => (\n <span key={index} />\n ))}\n </div>\n );\n }\n\n if (kind === \"spreadsheet\") {\n return (\n <div\n className=\"eth-inbox-attachment-preview__sheet\"\n role=\"img\"\n aria-label={`${attachment.name} spreadsheet preview`}\n >\n {Array.from({ length: 20 }, (_, index) => (\n <span key={index} />\n ))}\n </div>\n );\n }\n\n if (kind === \"pdf\") {\n return (\n <div\n className=\"eth-inbox-attachment-preview__document\"\n role=\"img\"\n aria-label={`${attachment.name} PDF preview`}\n >\n <div className=\"eth-inbox-attachment-preview__document-bar\">\n <span>{attachment.mimeType}</span>\n <span>Page 1</span>\n </div>\n <div className=\"eth-inbox-attachment-preview__page\">\n <strong>{attachment.name.replace(/\\.[^.]+$/, \"\") || attachment.name}</strong>\n <span />\n <span />\n <span />\n <span />\n <span />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"eth-inbox-attachment-preview__empty\">\n <strong>Preview unavailable</strong>\n <span>\n {attachment.mimeType} files are kept as attachments for download or external review.\n </span>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Button, SearchInput, Tag, TextInput } from \"@echothink-ui/core\";\nimport type { RecipientSuggestion } from \"../types\";\n\nexport interface RecipientPickerProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n value?: string[];\n onChange?: (value: string[]) => void;\n onSearch?: (q: string) => void;\n suggestions?: RecipientSuggestion[];\n defaultSuggestionsOpen?: boolean;\n}\n\nexport function RecipientPicker({\n value = [],\n onChange,\n onSearch,\n suggestions = [],\n defaultSuggestionsOpen = false,\n className,\n ...props\n}: RecipientPickerProps) {\n const listboxId = React.useId().replace(/:/g, \"\");\n const [query, setQuery] = React.useState(\"\");\n const [manualValue, setManualValue] = React.useState(\"\");\n const [suggestionsOpen, setSuggestionsOpen] = React.useState(defaultSuggestionsOpen);\n\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const visibleSuggestions = normalizedQuery\n ? suggestions.filter((suggestion) =>\n [suggestion.label, suggestion.email].some((field) =>\n field.toLocaleLowerCase().includes(normalizedQuery)\n )\n )\n : suggestions;\n const showSuggestions = suggestionsOpen && (visibleSuggestions.length > 0 || Boolean(query));\n\n const add = (email: string) => {\n const normalizedEmail = email.trim();\n\n if (!normalizedEmail || value.includes(normalizedEmail)) return false;\n\n onChange?.([...value, normalizedEmail]);\n setManualValue(\"\");\n setQuery(\"\");\n return true;\n };\n\n const updateQuery = (nextQuery: string) => {\n setQuery(nextQuery);\n onSearch?.(nextQuery);\n setSuggestionsOpen(Boolean(nextQuery || suggestions.length));\n };\n\n return (\n <div\n {...props}\n className={`eth-inbox-recipient-picker ${className ?? \"\"}`}\n data-eth-component=\"RecipientPicker\"\n onBlur={(event) => {\n props.onBlur?.(event);\n\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setSuggestionsOpen(false);\n }\n }}\n onKeyDown={(event) => {\n props.onKeyDown?.(event);\n\n if (!event.defaultPrevented && event.key === \"Escape\") {\n setSuggestionsOpen(false);\n }\n }}\n >\n <div className=\"eth-inbox-recipient-picker__selected\" aria-label=\"Selected recipients\">\n <span className=\"eth-inbox-recipient-picker__label\">To</span>\n <div className=\"eth-inbox-recipient-picker__chips\">\n {value.length ? (\n value.map((email) => (\n <Tag\n key={email}\n removable\n onRemove={() => onChange?.(value.filter((item) => item !== email))}\n >\n {email}\n </Tag>\n ))\n ) : (\n <span className=\"eth-inbox-recipient-picker__placeholder\">No recipients selected</span>\n )}\n </div>\n </div>\n <SearchInput\n aria-controls={showSuggestions ? listboxId : undefined}\n aria-expanded={showSuggestions}\n aria-haspopup=\"listbox\"\n className=\"eth-inbox-recipient-picker__search\"\n labelText=\"Search recipients\"\n value={query}\n placeholder=\"Search recipients\"\n onFocus={() => setSuggestionsOpen(Boolean(suggestions.length))}\n onChange={(event) => updateQuery(event.currentTarget.value)}\n onClear={() => {\n updateQuery(\"\");\n setSuggestionsOpen(false);\n }}\n />\n <div className=\"eth-inbox-recipient-picker__manual\">\n <TextInput\n className=\"eth-inbox-recipient-picker__manual-input\"\n density=\"compact\"\n hideLabel\n labelText=\"Recipient email\"\n type=\"email\"\n value={manualValue}\n placeholder=\"name@company.com\"\n onChange={(event) => setManualValue(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n add(manualValue);\n }\n }}\n />\n <Button\n density=\"compact\"\n disabled={!manualValue.trim()}\n intent=\"primary\"\n onClick={() => add(manualValue)}\n >\n Add recipient\n </Button>\n </div>\n {showSuggestions ? (\n <div\n className=\"eth-inbox-recipient-picker__suggestions\"\n id={listboxId}\n role=\"listbox\"\n aria-label=\"Recipient suggestions\"\n aria-multiselectable\n >\n <div className=\"eth-inbox-recipient-picker__suggestions-header\">\n <span>Suggested recipients</span>\n <strong>\n {visibleSuggestions.length} result{visibleSuggestions.length === 1 ? \"\" : \"s\"}\n </strong>\n </div>\n {visibleSuggestions.length ? (\n <ul className=\"eth-inbox-recipient-picker__suggestions-list\">\n {visibleSuggestions.map((suggestion) => {\n const isSelected = value.includes(suggestion.email);\n\n return (\n <li key={suggestion.id}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isSelected ? true : undefined}\n onClick={() => add(suggestion.email)}\n >\n <span className=\"eth-inbox-recipient-picker__suggestion-copy\">\n <strong>{suggestion.label}</strong>\n <span>{suggestion.email}</span>\n </span>\n <span className=\"eth-inbox-recipient-picker__suggestion-status\">\n {isSelected ? \"Selected\" : \"Add\"}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n ) : (\n <p className=\"eth-inbox-recipient-picker__empty\">No matching recipients</p>\n )}\n </div>\n ) : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Button, FormField, Panel, TextInput } from \"@echothink-ui/core\";\nimport { EditIcon, PlusIcon } from \"@echothink-ui/icons\";\nimport type { MailLabel } from \"../types\";\n\nexport interface LabelManagerProps extends React.HTMLAttributes<HTMLDivElement> {\n labels?: MailLabel[];\n onCreate?: (label: string) => void;\n onRename?: (id: string, label: string) => void;\n onDelete?: (id: string) => void;\n}\n\nexport function LabelManager({\n labels = [],\n onCreate,\n onRename,\n onDelete,\n className,\n ...props\n}: LabelManagerProps) {\n const [newLabel, setNewLabel] = React.useState(\"\");\n const [edits, setEdits] = React.useState<Record<string, string>>({});\n const trackedLabels = labels.filter((label) => typeof label.count === \"number\");\n const trackedMessageCount = trackedLabels.reduce((total, label) => total + (label.count ?? 0), 0);\n const labelSummary = `${labels.length.toLocaleString()} ${labels.length === 1 ? \"label\" : \"labels\"}`;\n const subtitle = labels.length\n ? trackedLabels.length\n ? `${labelSummary} · ${trackedMessageCount.toLocaleString()} tracked messages`\n : `${labelSummary} configured for mailbox categories and automation tags.`\n : \"Create categories and automation tags for mailbox workflows.\";\n\n const submitNewLabel = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const nextLabel = newLabel.trim();\n if (!nextLabel || !onCreate) return;\n\n onCreate(nextLabel);\n setNewLabel(\"\");\n };\n\n return (\n <Panel\n {...props}\n className={`eth-inbox-label-manager ${className ?? \"\"}`}\n title=\"Labels\"\n subtitle={subtitle}\n data-eth-component=\"LabelManager\"\n >\n {labels.length ? (\n <div className=\"eth-inbox-label-manager__list\" role=\"table\" aria-label=\"Managed labels\">\n <div className=\"eth-inbox-label-manager__table-head\" role=\"row\">\n <span role=\"columnheader\">Label</span>\n <span role=\"columnheader\">Messages</span>\n <span role=\"columnheader\">Actions</span>\n </div>\n {labels.map((label) => {\n const draft = edits[label.id] ?? label.label;\n const trimmedDraft = draft.trim();\n const countLabel =\n typeof label.count === \"number\"\n ? `${label.count.toLocaleString()} ${label.count === 1 ? \"message\" : \"messages\"}`\n : \"Message count not tracked\";\n\n return (\n <div key={label.id} className=\"eth-inbox-label-manager__row\" role=\"row\">\n <div className=\"eth-inbox-label-manager__name-cell\" role=\"cell\">\n <TextInput\n aria-label={`Label name for ${label.label}`}\n density=\"compact\"\n placeholder=\"Label name\"\n value={draft}\n onChange={(event) =>\n setEdits((current) => ({\n ...current,\n [label.id]: event.currentTarget.value\n }))\n }\n />\n </div>\n <div\n className=\"eth-inbox-label-manager__count-cell\"\n role=\"cell\"\n aria-label={countLabel}\n >\n {typeof label.count === \"number\" ? (\n <>\n <strong>{label.count.toLocaleString()}</strong>\n <span>{label.count === 1 ? \"message\" : \"messages\"}</span>\n </>\n ) : (\n <span className=\"eth-inbox-label-manager__count-muted\">Not tracked</span>\n )}\n </div>\n <div className=\"eth-inbox-label-manager__actions\" role=\"cell\">\n <Button\n density=\"compact\"\n disabled={!onRename || !trimmedDraft}\n icon={<EditIcon size={16} />}\n intent=\"secondary\"\n onClick={() => {\n if (trimmedDraft) onRename?.(label.id, trimmedDraft);\n }}\n >\n Rename\n </Button>\n <Button\n density=\"compact\"\n disabled={!onDelete}\n intent=\"danger\"\n onClick={() => onDelete?.(label.id)}\n >\n Delete\n </Button>\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n <p className=\"eth-inbox-label-manager__empty\">\n No labels configured. Create a label to route mailbox views and automation rules.\n </p>\n )}\n <form className=\"eth-inbox-label-manager__create\" onSubmit={submitNewLabel}>\n <FormField\n label=\"New label\"\n helperText=\"Use concise names for categories, filters, and automation rules.\"\n >\n <TextInput\n density=\"compact\"\n placeholder=\"e.g. renewal-risk\"\n value={newLabel}\n onChange={(event) => setNewLabel(event.currentTarget.value)}\n />\n </FormField>\n <Button\n disabled={!onCreate || !newLabel.trim()}\n icon={<PlusIcon size={16} />}\n type=\"submit\"\n >\n Create\n </Button>\n </form>\n </Panel>\n );\n}\n","import * as React from \"react\";\nimport { IconButton, SearchInput } from \"@echothink-ui/core\";\nimport { ChevronRightIcon } from \"@echothink-ui/icons\";\n\nexport interface MessageSearchProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n value?: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n resultCount?: number;\n activeResultIndex?: number;\n onPreviousResult?: () => void;\n onNextResult?: () => void;\n}\n\nexport function MessageSearch({\n value = \"\",\n onChange,\n placeholder = \"Search messages\",\n resultCount,\n activeResultIndex = 0,\n onPreviousResult,\n onNextResult,\n className,\n role,\n \"aria-label\": ariaLabel,\n ...props\n}: MessageSearchProps) {\n const hasResultCount = typeof resultCount === \"number\";\n const normalizedResultCount =\n hasResultCount && Number.isFinite(resultCount) ? Math.max(0, Math.trunc(resultCount)) : 0;\n const normalizedResultIndex = Number.isFinite(activeResultIndex)\n ? Math.trunc(activeResultIndex)\n : 0;\n const hasResults = normalizedResultCount > 0;\n const currentResult = hasResults\n ? Math.min(Math.max(normalizedResultIndex, 0), normalizedResultCount - 1) + 1\n : 0;\n const canGoPrevious = hasResults && currentResult > 1 && Boolean(onPreviousResult);\n const canGoNext = hasResults && currentResult < normalizedResultCount && Boolean(onNextResult);\n const resultNoun = normalizedResultCount === 1 ? \"result\" : \"results\";\n const resultLabel = hasResults\n ? `${currentResult} of ${normalizedResultCount} ${resultNoun}`\n : \"No results\";\n\n return (\n <div\n {...props}\n className={[\"eth-inbox-search\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"MessageSearch\"\n role={role ?? \"search\"}\n aria-label={ariaLabel ?? \"Message search\"}\n >\n <div className=\"eth-inbox-search__input\">\n <SearchInput\n value={value}\n placeholder={placeholder}\n labelText={placeholder}\n onChange={(event) => onChange?.(event.currentTarget.value)}\n onClear={() => onChange?.(\"\")}\n className=\"eth-inbox-search__control\"\n />\n </div>\n {hasResultCount ? (\n <div className=\"eth-inbox-search__results\">\n <span className=\"eth-inbox-search__count\" aria-live=\"polite\">\n {resultLabel}\n </span>\n <div\n className=\"eth-inbox-search__nav\"\n role=\"group\"\n aria-label=\"Search result navigation\"\n >\n <IconButton\n className=\"eth-inbox-search__nav-button eth-inbox-search__nav-button--previous\"\n density=\"compact\"\n intent=\"ghost\"\n label=\"Previous result\"\n icon={<ChevronRightIcon size={16} />}\n disabled={!canGoPrevious}\n onClick={onPreviousResult}\n />\n <IconButton\n className=\"eth-inbox-search__nav-button\"\n density=\"compact\"\n intent=\"ghost\"\n label=\"Next result\"\n icon={<ChevronRightIcon size={16} />}\n disabled={!canGoNext}\n onClick={onNextResult}\n />\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n","import * as React from \"react\";\n\nexport interface MessageFilter {\n id: string;\n label: string;\n active?: boolean;\n disabled?: boolean;\n kind?: \"priority\" | \"sender\" | \"date\" | \"label\" | \"unread\" | \"status\";\n}\n\nexport interface MessageFilterBarProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onToggle\"> {\n filters?: MessageFilter[];\n onToggle?: (id: string, active: boolean) => void;\n}\n\nconst filterKindLabels: Record<NonNullable<MessageFilter[\"kind\"]>, string> = {\n priority: \"Priority\",\n sender: \"Sender\",\n date: \"Date\",\n label: \"Label\",\n unread: \"Read\",\n status: \"Status\"\n};\n\nexport function MessageFilterBar({\n filters = [],\n onToggle,\n className,\n \"aria-label\": ariaLabel = \"Message filters\",\n ...props\n}: MessageFilterBarProps) {\n return (\n <div\n {...props}\n className={`eth-inbox-filter-bar ${className ?? \"\"}`}\n data-eth-component=\"MessageFilterBar\"\n role=\"toolbar\"\n aria-label={ariaLabel}\n >\n {filters.map((filter) => {\n const kindLabel = filter.kind ? filterKindLabels[filter.kind] : undefined;\n const accessibleLabel = kindLabel ? `${kindLabel}: ${filter.label}` : filter.label;\n\n return (\n <button\n key={filter.id}\n type=\"button\"\n className={`eth-inbox-filter-bar__chip ${\n filter.active ? \"eth-inbox-filter-bar__chip--active\" : \"\"\n } ${filter.disabled ? \"eth-inbox-filter-bar__chip--disabled\" : \"\"}`}\n aria-label={accessibleLabel}\n aria-pressed={Boolean(filter.active)}\n data-filter-kind={filter.kind}\n disabled={filter.disabled}\n onClick={() => onToggle?.(filter.id, !Boolean(filter.active))}\n >\n {kindLabel ? (\n <span className=\"eth-inbox-filter-bar__kind\" aria-hidden=\"true\">\n {kindLabel}\n </span>\n ) : null}\n <span className=\"eth-inbox-filter-bar__label\">{filter.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n","import * as React from \"react\";\nimport type { InboxThread } from \"../types\";\nimport { MessageList } from \"./MessageList\";\n\nexport interface PriorityInboxGroup {\n id: string;\n title: string;\n description?: React.ReactNode;\n threads: InboxThread[];\n}\n\nexport interface PriorityInboxViewProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n groups?: PriorityInboxGroup[];\n selectedThreadId?: string;\n onSelect?: (threadId: string) => void;\n}\n\nexport function PriorityInboxView({\n groups = [],\n selectedThreadId,\n onSelect,\n className,\n ...props\n}: PriorityInboxViewProps) {\n const hasGroups = groups.length > 0;\n const idBase = React.useId();\n\n return (\n <div\n {...props}\n className={`eth-inbox-priority ${className ?? \"\"}`}\n data-eth-component=\"PriorityInboxView\"\n >\n {hasGroups ? (\n groups.map((group, index) => {\n const headingId = `${idBase}-group-${index}-heading`;\n\n return (\n <section\n key={group.id}\n className=\"eth-inbox-priority__group\"\n aria-labelledby={headingId}\n >\n <header className=\"eth-inbox-priority__group-header\">\n <div className=\"eth-inbox-priority__heading\">\n <h3 id={headingId}>{group.title}</h3>\n {group.description ? (\n <p className=\"eth-inbox-priority__description\">{group.description}</p>\n ) : null}\n </div>\n <span className=\"eth-inbox-priority__count\">\n {formatThreadCount(group.threads.length)}\n </span>\n </header>\n <MessageList\n threads={group.threads}\n selectedThreadId={selectedThreadId}\n onSelect={onSelect}\n />\n </section>\n );\n })\n ) : (\n <div className=\"eth-inbox-priority__empty\" role=\"status\" aria-label=\"No priority threads\">\n No priority threads\n </div>\n )}\n </div>\n );\n}\n\nfunction formatThreadCount(count: number) {\n return `${count} ${count === 1 ? \"thread\" : \"threads\"}`;\n}\n","import * as React from \"react\";\nimport { Badge, Button, Panel, Toggle } from \"@echothink-ui/core\";\nimport { EditIcon } from \"@echothink-ui/icons\";\nimport type { AutomationRule } from \"../types\";\n\nexport interface EmailAutomationRulePanelProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onToggle\"\n> {\n rules?: AutomationRule[];\n onToggle?: (id: string, enabled: boolean) => void;\n onEdit?: (id: string) => void;\n}\n\nexport function EmailAutomationRulePanel({\n rules = [],\n onToggle,\n onEdit,\n className,\n ...props\n}: EmailAutomationRulePanelProps) {\n const enabledCount = rules.reduce((count, rule) => count + (rule.enabled ? 1 : 0), 0);\n const ruleCountLabel = `${rules.length} automation ${rules.length === 1 ? \"rule\" : \"rules\"}`;\n const subtitle = rules.length\n ? `${enabledCount} of ${ruleCountLabel} enabled`\n : \"Create routing, drafting, and mailbox automation rules.\";\n\n return (\n <Panel\n {...props}\n className={`eth-inbox-rules ${className ?? \"\"}`}\n title=\"Automation rules\"\n subtitle={subtitle}\n data-eth-component=\"EmailAutomationRulePanel\"\n >\n {rules.length ? (\n <div className=\"eth-inbox-rules__list\" role=\"list\">\n {rules.map((rule) => {\n const headingId = `eth-inbox-rule-${rule.id.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n\n return (\n <article\n key={rule.id}\n aria-labelledby={headingId}\n className={`eth-inbox-rules__item ${\n rule.enabled ? \"eth-inbox-rules__item--enabled\" : \"eth-inbox-rules__item--paused\"\n }`}\n role=\"listitem\"\n >\n <div className=\"eth-inbox-rules__content\">\n <header className=\"eth-inbox-rules__item-header\">\n <h4 id={headingId}>{rule.name}</h4>\n <Badge severity={rule.enabled ? \"success\" : \"neutral\"}>\n {rule.enabled ? \"Enabled\" : \"Paused\"}\n </Badge>\n </header>\n <dl className=\"eth-inbox-rules__definition\">\n <div>\n <dt>Trigger</dt>\n <dd>{rule.conditions}</dd>\n </div>\n <div>\n <dt>Action</dt>\n <dd>{rule.actions}</dd>\n </div>\n </dl>\n </div>\n\n <div className=\"eth-inbox-rules__controls\">\n <Toggle\n checked={rule.enabled}\n className=\"eth-inbox-rules__toggle\"\n disabled={!onToggle}\n hideLabel\n label={`Automation status for ${rule.name}`}\n offLabel=\"Paused\"\n onChange={(event) => onToggle?.(rule.id, event.currentTarget.checked)}\n onLabel=\"Enabled\"\n />\n <Button\n aria-label={`Edit ${rule.name}`}\n density=\"compact\"\n disabled={!onEdit}\n icon={<EditIcon size={16} />}\n intent=\"secondary\"\n onClick={() => onEdit?.(rule.id)}\n >\n Edit\n </Button>\n </div>\n </article>\n );\n })}\n </div>\n ) : (\n <p className=\"eth-inbox-rules__empty\">No automation rules configured.</p>\n )}\n </Panel>\n );\n}\n","import * as React from \"react\";\nimport { Badge, Button, Panel, Tag } from \"@echothink-ui/core\";\nimport type { ThreadMessage } from \"../types\";\n\nexport interface DraftEvidence {\n id: string;\n label: string;\n href?: string;\n}\n\nexport interface AgentDraftReviewPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n draft?: ThreadMessage & {\n evidence?: DraftEvidence[];\n rationale?: React.ReactNode;\n statusLabel?: React.ReactNode;\n };\n onApprove?: () => void;\n onEdit?: () => void;\n onReject?: () => void;\n}\n\nfunction formatDraftTimestamp(value?: string) {\n if (!value) return null;\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\"\n }).format(date);\n}\n\nexport function AgentDraftReviewPanel({\n draft,\n onApprove,\n onEdit,\n onReject,\n className,\n ...props\n}: AgentDraftReviewPanelProps) {\n const formattedDate = formatDraftTimestamp(draft?.date);\n const hasDraft = Boolean(draft);\n\n return (\n <Panel\n {...props}\n className={`eth-inbox-agent-draft ${className ?? \"\"}`}\n title=\"Agent draft review\"\n subtitle=\"Validate the generated response, source evidence, and approval direction before sending.\"\n data-eth-component=\"AgentDraftReviewPanel\"\n >\n {draft ? (\n <div className=\"eth-inbox-agent-draft__content\">\n <div className=\"eth-inbox-agent-draft__status\">\n <Badge severity=\"info\">{draft.statusLabel ?? \"Ready for review\"}</Badge>\n <span>Generated from inbound thread and policy context</span>\n {formattedDate ? <time dateTime={draft.date}>Updated {formattedDate}</time> : null}\n </div>\n\n <dl className=\"eth-inbox-agent-draft__meta\">\n <div>\n <dt>Subject</dt>\n <dd>{draft.subject ?? \"No subject\"}</dd>\n </div>\n <div>\n <dt>Requested by</dt>\n <dd>{draft.from || \"Unknown sender\"}</dd>\n </div>\n <div>\n <dt>Recipients</dt>\n <dd>{draft.to?.length ? draft.to.join(\", \") : \"No recipients\"}</dd>\n </div>\n </dl>\n\n <section className=\"eth-inbox-agent-draft__section\" aria-label=\"Proposed response\">\n <div className=\"eth-inbox-agent-draft__section-header\">\n <span>Proposed response</span>\n </div>\n <div className=\"eth-inbox-agent-draft__body\">{draft.body}</div>\n </section>\n\n {draft.rationale ? (\n <section className=\"eth-inbox-agent-draft__rationale\" aria-label=\"Agent rationale\">\n <span>Agent rationale</span>\n <div className=\"eth-inbox-agent-draft__rationale-body\">{draft.rationale}</div>\n </section>\n ) : null}\n\n {draft.evidence?.length ? (\n <section className=\"eth-inbox-agent-draft__evidence\" aria-label=\"Source evidence\">\n <span>Source evidence</span>\n <div className=\"eth-inbox-agent-draft__evidence-list\">\n {draft.evidence.map((item) =>\n item.href ? (\n <a key={item.id} href={item.href}>\n <Tag>{item.label}</Tag>\n </a>\n ) : (\n <Tag key={item.id}>{item.label}</Tag>\n )\n )}\n </div>\n </section>\n ) : null}\n </div>\n ) : (\n <div className=\"eth-inbox-agent-draft__empty\" role=\"status\">\n <strong>No draft selected</strong>\n <p>Select an agent-generated response to review its evidence and approval options.</p>\n </div>\n )}\n <div className=\"eth-inbox-agent-draft__actions\">\n <Button type=\"button\" disabled={!hasDraft} onClick={onApprove}>\n Approve draft\n </Button>\n <Button type=\"button\" intent=\"secondary\" disabled={!hasDraft} onClick={onEdit}>\n Edit draft\n </Button>\n <Button type=\"button\" intent=\"danger\" disabled={!hasDraft} onClick={onReject}>\n Reject draft\n </Button>\n </div>\n </Panel>\n );\n}\n","import * as React from \"react\";\nimport { Badge, Button, Panel, Textarea } from \"@echothink-ui/core\";\nimport type { MessageDraft } from \"../types\";\n\nexport interface ApprovalToSendPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n draft?: MessageDraft;\n recipients?: string[];\n riskLevel?: \"low\" | \"medium\" | \"high\" | \"critical\";\n policyRef?: React.ReactNode;\n onApprove?: (reason?: string) => void;\n onReject?: (reason?: string) => void;\n}\n\nexport function ApprovalToSendPanel({\n draft,\n recipients = [],\n riskLevel = \"low\",\n policyRef,\n onApprove,\n onReject,\n className,\n ...props\n}: ApprovalToSendPanelProps) {\n const [reason, setReason] = React.useState(\"\");\n const toRecipients = recipients.length ? recipients : (draft?.to ?? []);\n const ccRecipients = draft?.cc ?? [];\n const bccRecipients = draft?.bcc ?? [];\n const subject = draft?.subject?.trim() || \"No subject\";\n const body = draft?.body?.trim() || \"No message body provided.\";\n const riskSeverity =\n riskLevel === \"critical\" || riskLevel === \"high\"\n ? \"danger\"\n : riskLevel === \"medium\"\n ? \"warning\"\n : \"info\";\n const riskLabel = `${riskLevel.charAt(0).toUpperCase()}${riskLevel.slice(1)} risk`;\n const recipientCount =\n recipients.length || toRecipients.length + ccRecipients.length + bccRecipients.length;\n const recipientKind = recipients.length ? \"external recipient\" : \"recipient\";\n const recipientSummary =\n recipientCount === 1 ? `1 ${recipientKind}` : `${recipientCount || \"No\"} ${recipientKind}s`;\n\n const formatRecipients = (values: string[]) =>\n values.length ? values.join(\", \") : \"Not specified\";\n\n return (\n <Panel\n {...props}\n className={`eth-inbox-send-approval eth-inbox-send-approval--${riskLevel} ${className ?? \"\"}`}\n title=\"Approval required\"\n subtitle=\"Review this outbound message before it is sent.\"\n data-eth-component=\"ApprovalToSendPanel\"\n >\n <div className=\"eth-inbox-send-approval__status\">\n <div className=\"eth-inbox-send-approval__summary\">\n <Badge severity={riskSeverity}>{riskLabel}</Badge>\n {policyRef ? <span className=\"eth-inbox-send-approval__policy\">{policyRef}</span> : null}\n </div>\n <span className=\"eth-inbox-send-approval__state\">Awaiting approval</span>\n </div>\n\n <section\n className=\"eth-inbox-send-approval__message\"\n aria-label=\"Outbound message for approval\"\n >\n <header className=\"eth-inbox-send-approval__message-header\">\n <div>\n <h4>Outbound message</h4>\n <p>{recipientSummary}</p>\n </div>\n </header>\n <dl className=\"eth-inbox-send-approval__meta\">\n <div>\n <dt>To</dt>\n <dd>{formatRecipients(toRecipients)}</dd>\n </div>\n {ccRecipients.length ? (\n <div>\n <dt>Cc</dt>\n <dd>{formatRecipients(ccRecipients)}</dd>\n </div>\n ) : null}\n {bccRecipients.length ? (\n <div>\n <dt>Bcc</dt>\n <dd>{formatRecipients(bccRecipients)}</dd>\n </div>\n ) : null}\n <div>\n <dt>Subject</dt>\n <dd>{subject}</dd>\n </div>\n </dl>\n <div className=\"eth-inbox-send-approval__message-body\">\n <span>Message body</span>\n <p>{body}</p>\n </div>\n </section>\n\n <div className=\"eth-inbox-send-approval__decision\">\n <Textarea\n value={reason}\n labelText=\"Decision note\"\n helperText=\"Optional for approval. Include the policy reason when rejecting.\"\n placeholder=\"Add an approval or rejection reason\"\n onChange={(event) => setReason(event.currentTarget.value)}\n />\n </div>\n\n <div className=\"eth-inbox-send-approval__actions\">\n <Button intent=\"danger\" onClick={() => onReject?.(reason || undefined)}>\n Reject\n </Button>\n <Button onClick={() => onApprove?.(reason || undefined)}>Approve send</Button>\n </div>\n </Panel>\n );\n}\n","import * as React from \"react\";\nimport { Badge, Panel, Tag } from \"@echothink-ui/core\";\nimport type { ThreadCitation } from \"../types\";\n\nexport interface ThreadSummaryPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n summary?: {\n text: React.ReactNode;\n citations: ThreadCitation[];\n };\n}\n\nexport function ThreadSummaryPanel({\n summary,\n className,\n ...props\n}: ThreadSummaryPanelProps) {\n const citations = summary?.citations ?? [];\n const citationCount = citations.length;\n\n return (\n <Panel\n {...props}\n className={`eth-inbox-thread-summary ${className ?? \"\"}`}\n title=\"Thread summary\"\n subtitle=\"Agent-generated recap with source references.\"\n data-eth-component=\"ThreadSummaryPanel\"\n >\n {summary ? (\n <div className=\"eth-inbox-thread-summary__content\">\n <div\n className=\"eth-inbox-thread-summary__metadata\"\n role=\"group\"\n aria-label=\"Summary metadata\"\n >\n <Badge severity=\"info\">Agent generated</Badge>\n <span>{formatCitationCount(citationCount)}</span>\n </div>\n\n <section className=\"eth-inbox-thread-summary__summary\" aria-label=\"Generated summary\">\n <span className=\"eth-inbox-thread-summary__section-label\">Summary</span>\n <div className=\"eth-inbox-thread-summary__summary-body\">{summary.text}</div>\n </section>\n\n {citations.length ? (\n <section className=\"eth-inbox-thread-summary__sources\" aria-label=\"Source citations\">\n <span className=\"eth-inbox-thread-summary__section-label\">Source citations</span>\n <ul className=\"eth-inbox-thread-summary__source-list\">\n {citations.map((citation) => (\n <li key={citation.id} className=\"eth-inbox-thread-summary__source-item\">\n <CitationTag citation={citation} />\n </li>\n ))}\n </ul>\n </section>\n ) : (\n <div className=\"eth-inbox-thread-summary__no-sources\" role=\"status\">\n No citations attached.\n </div>\n )}\n </div>\n ) : (\n <div className=\"eth-inbox-thread-summary__empty\" role=\"status\">\n <strong>No generated summary</strong>\n <p>\n Summaries and source citations appear here after the agent reviews the conversation.\n </p>\n </div>\n )}\n </Panel>\n );\n}\n\nfunction CitationTag({ citation }: { citation: ThreadCitation }) {\n const referenceLabel = citation.messageRef\n ? `${citation.label}, message ${citation.messageRef}`\n : citation.label;\n const tag = (\n <Tag\n className=\"eth-inbox-thread-summary__source-token\"\n aria-label={referenceLabel}\n title={referenceLabel}\n data-message-ref={citation.messageRef}\n >\n {citation.label}\n </Tag>\n );\n\n if (!citation.href) {\n return (\n <span className=\"eth-inbox-thread-summary__source-reference\">{tag}</span>\n );\n }\n\n return (\n <a\n className=\"eth-inbox-thread-summary__source-link\"\n href={citation.href}\n aria-label={referenceLabel}\n >\n {tag}\n </a>\n );\n}\n\nfunction formatCitationCount(count: number) {\n return `${count} ${count === 1 ? \"citation\" : \"citations\"}`;\n}\n","import \"./styles.css\";\n\nexport * from \"./types\";\nexport { InboxShell, type InboxShellProps } from \"./components/InboxShell\";\nexport { MailboxFolderList, type MailboxFolderListProps } from \"./components/MailboxFolderList\";\nexport { MessageList, type MessageListProps } from \"./components/MessageList\";\nexport {\n MessageThread,\n type MessageThreadAction,\n type MessageThreadProps\n} from \"./components/MessageThread\";\nexport { MessageComposer, type MessageComposerProps } from \"./components/MessageComposer\";\nexport { MessagePreview, type MessagePreviewProps } from \"./components/MessagePreview\";\nexport { AttachmentList, type AttachmentListProps } from \"./components/AttachmentList\";\nexport { AttachmentPreview, type AttachmentPreviewProps } from \"./components/AttachmentPreview\";\nexport { RecipientPicker, type RecipientPickerProps } from \"./components/RecipientPicker\";\nexport { LabelManager, type LabelManagerProps } from \"./components/LabelManager\";\nexport { MessageSearch, type MessageSearchProps } from \"./components/MessageSearch\";\nexport {\n MessageFilterBar,\n type MessageFilter,\n type MessageFilterBarProps\n} from \"./components/MessageFilterBar\";\nexport {\n PriorityInboxView,\n type PriorityInboxGroup,\n type PriorityInboxViewProps\n} from \"./components/PriorityInboxView\";\nexport {\n EmailAutomationRulePanel,\n type EmailAutomationRulePanelProps\n} from \"./components/EmailAutomationRulePanel\";\nexport {\n AgentDraftReviewPanel,\n type AgentDraftReviewPanelProps,\n type DraftEvidence\n} from \"./components/AgentDraftReviewPanel\";\nexport { ApprovalToSendPanel, type ApprovalToSendPanelProps } from \"./components/ApprovalToSendPanel\";\nexport { ThreadSummaryPanel, type ThreadSummaryPanelProps } from \"./components/ThreadSummaryPanel\";\n\nexport const InboxComponentNames = [\n \"InboxShell\",\n \"MailboxFolderList\",\n \"MessageList\",\n \"MessageThread\",\n \"MessageComposer\",\n \"MessagePreview\",\n \"AttachmentList\",\n \"AttachmentPreview\",\n \"RecipientPicker\",\n \"LabelManager\",\n \"MessageSearch\",\n \"MessageFilterBar\",\n \"PriorityInboxView\",\n \"EmailAutomationRulePanel\",\n \"AgentDraftReviewPanel\",\n \"ApprovalToSendPanel\",\n \"ThreadSummaryPanel\"\n] as const;\nexport type InboxComponentName = (typeof InboxComponentNames)[number];\n"],"mappings":"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","names":["jsx","jsxs","Badge","jsx","jsxs","Badge","React","Badge","StatusDot","jsx","jsxs","jsx","jsxs","jsx","jsxs","statusLabel","Badge","StatusDot","React","Button","DocumentIcon","jsx","jsxs","Button","DocumentIcon","jsx","jsxs","React","Button","Tag","TextInput","jsx","jsxs","React","Button","FormField","TextInput","jsx","jsxs","IconButton","SearchInput","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","Badge","Button","Panel","EditIcon","jsx","jsxs","Badge","Button","Panel","Tag","jsx","jsxs","React","Badge","Button","Panel","Textarea","jsx","jsxs","formatRecipients","Badge","Panel","Tag","jsx","jsxs"]}
@@ -0,0 +1,75 @@
1
+ import type * as React from "react";
2
+ import type { EthOperationalStatus } from "@echothink-ui/core";
3
+ export interface Attachment {
4
+ id: string;
5
+ name: string;
6
+ size: number;
7
+ mimeType: string;
8
+ src?: string;
9
+ previewUrl?: string;
10
+ }
11
+ export interface ThreadMessage {
12
+ id: string;
13
+ from: string;
14
+ to: string[];
15
+ cc?: string[];
16
+ bcc?: string[];
17
+ date: string;
18
+ subject?: string;
19
+ body: string;
20
+ attachments?: Attachment[];
21
+ }
22
+ export interface MessageThreadModel {
23
+ id: string;
24
+ subject: string;
25
+ messages: ThreadMessage[];
26
+ }
27
+ export interface InboxThread {
28
+ id: string;
29
+ subject: string;
30
+ preview: string;
31
+ from: string;
32
+ receivedAt: string;
33
+ unread?: boolean;
34
+ priority?: "high" | "normal" | "low";
35
+ labels?: string[];
36
+ status?: EthOperationalStatus;
37
+ }
38
+ export interface MailboxFolder {
39
+ id: string;
40
+ label: string;
41
+ icon?: React.ReactNode;
42
+ count?: number;
43
+ smart?: boolean;
44
+ }
45
+ export interface MessageDraft {
46
+ to?: string[];
47
+ cc?: string[];
48
+ bcc?: string[];
49
+ subject?: string;
50
+ body?: string;
51
+ attachments?: Attachment[];
52
+ }
53
+ export interface RecipientSuggestion {
54
+ id: string;
55
+ label: string;
56
+ email: string;
57
+ }
58
+ export interface MailLabel {
59
+ id: string;
60
+ label: string;
61
+ count?: number;
62
+ }
63
+ export interface AutomationRule {
64
+ id: string;
65
+ name: string;
66
+ conditions: React.ReactNode;
67
+ actions: React.ReactNode;
68
+ enabled: boolean;
69
+ }
70
+ export interface ThreadCitation {
71
+ id: string;
72
+ label: string;
73
+ href?: string;
74
+ messageRef?: string;
75
+ }
@@ -0,0 +1,5 @@
1
+ export declare function formatDateTime(value: string): string;
2
+ export declare function formatBytes(size: number): string;
3
+ export declare function listToInput(value: string[] | undefined): string;
4
+ export declare function inputToList(value: string): string[];
5
+ export declare function prioritySeverity(priority: "high" | "normal" | "low" | undefined): "danger" | "neutral" | "info";
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@echothink-ui/inbox",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "sideEffects": [
7
+ "**/*.css"
8
+ ],
9
+ "main": "./dist/index.cjs",
10
+ "module": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js",
16
+ "require": "./dist/index.cjs"
17
+ },
18
+ "./styles.css": "./src/styles.css"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "src",
23
+ "README.md"
24
+ ],
25
+ "peerDependencies": {
26
+ "react": ">=18.3.0",
27
+ "react-dom": ">=18.3.0"
28
+ },
29
+ "dependencies": {
30
+ "@echothink-ui/core": "0.2.0",
31
+ "@echothink-ui/data": "0.2.0",
32
+ "@echothink-ui/icons": "0.2.0",
33
+ "@echothink-ui/layouts": "0.2.0"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "scripts": {
39
+ "build": "tsup src/index.tsx --format esm,cjs --sourcemap --clean --external react --external react-dom && tsc -p tsconfig.json --declaration --emitDeclarationOnly --noEmit false --outDir dist",
40
+ "typecheck": "tsc -p tsconfig.json --noEmit",
41
+ "test": "vitest run --config ../../vitest.config.ts --passWithNoTests",
42
+ "lint": "eslint src"
43
+ }
44
+ }
@@ -0,0 +1,128 @@
1
+ import * as React from "react";
2
+ import { Badge, Button, Panel, Tag } from "@echothink-ui/core";
3
+ import type { ThreadMessage } from "../types";
4
+
5
+ export interface DraftEvidence {
6
+ id: string;
7
+ label: string;
8
+ href?: string;
9
+ }
10
+
11
+ export interface AgentDraftReviewPanelProps extends React.HTMLAttributes<HTMLDivElement> {
12
+ draft?: ThreadMessage & {
13
+ evidence?: DraftEvidence[];
14
+ rationale?: React.ReactNode;
15
+ statusLabel?: React.ReactNode;
16
+ };
17
+ onApprove?: () => void;
18
+ onEdit?: () => void;
19
+ onReject?: () => void;
20
+ }
21
+
22
+ function formatDraftTimestamp(value?: string) {
23
+ if (!value) return null;
24
+
25
+ const date = new Date(value);
26
+ if (Number.isNaN(date.getTime())) return value;
27
+
28
+ return new Intl.DateTimeFormat("en-US", {
29
+ month: "short",
30
+ day: "numeric",
31
+ hour: "numeric",
32
+ minute: "2-digit"
33
+ }).format(date);
34
+ }
35
+
36
+ export function AgentDraftReviewPanel({
37
+ draft,
38
+ onApprove,
39
+ onEdit,
40
+ onReject,
41
+ className,
42
+ ...props
43
+ }: AgentDraftReviewPanelProps) {
44
+ const formattedDate = formatDraftTimestamp(draft?.date);
45
+ const hasDraft = Boolean(draft);
46
+
47
+ return (
48
+ <Panel
49
+ {...props}
50
+ className={`eth-inbox-agent-draft ${className ?? ""}`}
51
+ title="Agent draft review"
52
+ subtitle="Validate the generated response, source evidence, and approval direction before sending."
53
+ data-eth-component="AgentDraftReviewPanel"
54
+ >
55
+ {draft ? (
56
+ <div className="eth-inbox-agent-draft__content">
57
+ <div className="eth-inbox-agent-draft__status">
58
+ <Badge severity="info">{draft.statusLabel ?? "Ready for review"}</Badge>
59
+ <span>Generated from inbound thread and policy context</span>
60
+ {formattedDate ? <time dateTime={draft.date}>Updated {formattedDate}</time> : null}
61
+ </div>
62
+
63
+ <dl className="eth-inbox-agent-draft__meta">
64
+ <div>
65
+ <dt>Subject</dt>
66
+ <dd>{draft.subject ?? "No subject"}</dd>
67
+ </div>
68
+ <div>
69
+ <dt>Requested by</dt>
70
+ <dd>{draft.from || "Unknown sender"}</dd>
71
+ </div>
72
+ <div>
73
+ <dt>Recipients</dt>
74
+ <dd>{draft.to?.length ? draft.to.join(", ") : "No recipients"}</dd>
75
+ </div>
76
+ </dl>
77
+
78
+ <section className="eth-inbox-agent-draft__section" aria-label="Proposed response">
79
+ <div className="eth-inbox-agent-draft__section-header">
80
+ <span>Proposed response</span>
81
+ </div>
82
+ <div className="eth-inbox-agent-draft__body">{draft.body}</div>
83
+ </section>
84
+
85
+ {draft.rationale ? (
86
+ <section className="eth-inbox-agent-draft__rationale" aria-label="Agent rationale">
87
+ <span>Agent rationale</span>
88
+ <div className="eth-inbox-agent-draft__rationale-body">{draft.rationale}</div>
89
+ </section>
90
+ ) : null}
91
+
92
+ {draft.evidence?.length ? (
93
+ <section className="eth-inbox-agent-draft__evidence" aria-label="Source evidence">
94
+ <span>Source evidence</span>
95
+ <div className="eth-inbox-agent-draft__evidence-list">
96
+ {draft.evidence.map((item) =>
97
+ item.href ? (
98
+ <a key={item.id} href={item.href}>
99
+ <Tag>{item.label}</Tag>
100
+ </a>
101
+ ) : (
102
+ <Tag key={item.id}>{item.label}</Tag>
103
+ )
104
+ )}
105
+ </div>
106
+ </section>
107
+ ) : null}
108
+ </div>
109
+ ) : (
110
+ <div className="eth-inbox-agent-draft__empty" role="status">
111
+ <strong>No draft selected</strong>
112
+ <p>Select an agent-generated response to review its evidence and approval options.</p>
113
+ </div>
114
+ )}
115
+ <div className="eth-inbox-agent-draft__actions">
116
+ <Button type="button" disabled={!hasDraft} onClick={onApprove}>
117
+ Approve draft
118
+ </Button>
119
+ <Button type="button" intent="secondary" disabled={!hasDraft} onClick={onEdit}>
120
+ Edit draft
121
+ </Button>
122
+ <Button type="button" intent="danger" disabled={!hasDraft} onClick={onReject}>
123
+ Reject draft
124
+ </Button>
125
+ </div>
126
+ </Panel>
127
+ );
128
+ }