@arbidocs/blocks 0.5.102 → 0.5.104
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.
- package/dist/{DocumentReviewCard-UUMBYSHO.cjs → DocumentReviewCard-MSHD73S3.cjs} +12 -12
- package/dist/{DocumentReviewCard-UUMBYSHO.cjs.map → DocumentReviewCard-MSHD73S3.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-UEFTDEOL.js → DocumentReviewCard-WZNBPG72.js} +7 -7
- package/dist/{DocumentReviewCard-UEFTDEOL.js.map → DocumentReviewCard-WZNBPG72.js.map} +1 -1
- package/dist/{FilesViewerDialog-B6AQP2UB.cjs → FilesViewerDialog-DV2U4USR.cjs} +7 -7
- package/dist/{FilesViewerDialog-B6AQP2UB.cjs.map → FilesViewerDialog-DV2U4USR.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-R5VNYH72.js → FilesViewerDialog-XETOHORQ.js} +6 -6
- package/dist/{FilesViewerDialog-R5VNYH72.js.map → FilesViewerDialog-XETOHORQ.js.map} +1 -1
- package/dist/agents/index.cjs +176 -175
- package/dist/agents/index.js +3 -2
- package/dist/{chunk-AUQF6UJZ.js → chunk-4UOXUWX3.js} +4 -4
- package/dist/{chunk-AUQF6UJZ.js.map → chunk-4UOXUWX3.js.map} +1 -1
- package/dist/{chunk-ZGAUD357.cjs → chunk-4WMGFGYP.cjs} +4 -4
- package/dist/{chunk-ZGAUD357.cjs.map → chunk-4WMGFGYP.cjs.map} +1 -1
- package/dist/{chunk-AMIPT72L.cjs → chunk-5R67KX2O.cjs} +8 -8
- package/dist/{chunk-AMIPT72L.cjs.map → chunk-5R67KX2O.cjs.map} +1 -1
- package/dist/{chunk-PL2CVHBB.cjs → chunk-5UMZXDGL.cjs} +5 -5
- package/dist/{chunk-PL2CVHBB.cjs.map → chunk-5UMZXDGL.cjs.map} +1 -1
- package/dist/{chunk-CDOW3H4B.js → chunk-62OMGQHS.js} +3 -3
- package/dist/{chunk-CDOW3H4B.js.map → chunk-62OMGQHS.js.map} +1 -1
- package/dist/{chunk-JJ5BXK3Q.cjs → chunk-6A4GNM4T.cjs} +5 -4
- package/dist/chunk-6A4GNM4T.cjs.map +1 -0
- package/dist/{chunk-VVCSEYDP.cjs → chunk-6NSKIS35.cjs} +4 -4
- package/dist/{chunk-VVCSEYDP.cjs.map → chunk-6NSKIS35.cjs.map} +1 -1
- package/dist/{chunk-PCSJODXV.js → chunk-7ONU7EWY.js} +3 -3
- package/dist/{chunk-PCSJODXV.js.map → chunk-7ONU7EWY.js.map} +1 -1
- package/dist/{chunk-D3DOHXBQ.cjs → chunk-BSPPKX6X.cjs} +24 -24
- package/dist/{chunk-D3DOHXBQ.cjs.map → chunk-BSPPKX6X.cjs.map} +1 -1
- package/dist/{chunk-ICE2ZKN4.js → chunk-CEVVGJQX.js} +3 -3
- package/dist/{chunk-ICE2ZKN4.js.map → chunk-CEVVGJQX.js.map} +1 -1
- package/dist/{chunk-6AETD75K.js → chunk-E26MNOLG.js} +3 -3
- package/dist/{chunk-6AETD75K.js.map → chunk-E26MNOLG.js.map} +1 -1
- package/dist/{chunk-S67KFB54.js → chunk-E6ISR55S.js} +3 -3
- package/dist/{chunk-S67KFB54.js.map → chunk-E6ISR55S.js.map} +1 -1
- package/dist/{chunk-ZKTMTYFN.js → chunk-ET3W24JV.js} +5 -5
- package/dist/{chunk-ZKTMTYFN.js.map → chunk-ET3W24JV.js.map} +1 -1
- package/dist/{chunk-GCW7PS3D.js → chunk-GOJ5GHFS.js} +3 -3
- package/dist/{chunk-GCW7PS3D.js.map → chunk-GOJ5GHFS.js.map} +1 -1
- package/dist/{chunk-FKFUAU4F.js → chunk-HTGEAQOA.js} +5 -4
- package/dist/chunk-HTGEAQOA.js.map +1 -0
- package/dist/{chunk-4RQDYXLE.js → chunk-HTIEJVPI.js} +5 -5
- package/dist/{chunk-4RQDYXLE.js.map → chunk-HTIEJVPI.js.map} +1 -1
- package/dist/{chunk-4YQBT5EL.cjs → chunk-IWLNDDPN.cjs} +35 -35
- package/dist/{chunk-4YQBT5EL.cjs.map → chunk-IWLNDDPN.cjs.map} +1 -1
- package/dist/chunk-JCMKYQGZ.js +26 -0
- package/dist/chunk-JCMKYQGZ.js.map +1 -0
- package/dist/{chunk-6S2LRXJ4.js → chunk-JWUCDK2F.js} +5 -5
- package/dist/chunk-JWUCDK2F.js.map +1 -0
- package/dist/{chunk-6TYZ33WH.cjs → chunk-OKUXM2N4.cjs} +5 -5
- package/dist/chunk-OKUXM2N4.cjs.map +1 -0
- package/dist/{chunk-HC54CTGN.cjs → chunk-OSR3GCJG.cjs} +11 -11
- package/dist/chunk-OSR3GCJG.cjs.map +1 -0
- package/dist/{chunk-TOT4HHHN.js → chunk-P5RTO2WL.js} +3 -24
- package/dist/chunk-P5RTO2WL.js.map +1 -0
- package/dist/chunk-QECKDZ47.cjs +31 -0
- package/dist/chunk-QECKDZ47.cjs.map +1 -0
- package/dist/{chunk-L3CWX2BN.cjs → chunk-RBI7WVEP.cjs} +4 -4
- package/dist/{chunk-L3CWX2BN.cjs.map → chunk-RBI7WVEP.cjs.map} +1 -1
- package/dist/{chunk-PP2NXTOP.js → chunk-RUV2ERID.js} +12 -12
- package/dist/{chunk-PP2NXTOP.js.map → chunk-RUV2ERID.js.map} +1 -1
- package/dist/{chunk-W4QYNRBU.cjs → chunk-S7NJVJJX.cjs} +45 -45
- package/dist/{chunk-W4QYNRBU.cjs.map → chunk-S7NJVJJX.cjs.map} +1 -1
- package/dist/{chunk-QM6OI62U.js → chunk-TQFDPCWU.js} +5 -5
- package/dist/{chunk-QM6OI62U.js.map → chunk-TQFDPCWU.js.map} +1 -1
- package/dist/{chunk-MDMQDVCA.cjs → chunk-V2CKYM4B.cjs} +4 -4
- package/dist/{chunk-MDMQDVCA.cjs.map → chunk-V2CKYM4B.cjs.map} +1 -1
- package/dist/{chunk-CMEIU2GA.cjs → chunk-VULH3XAJ.cjs} +28 -28
- package/dist/{chunk-CMEIU2GA.cjs.map → chunk-VULH3XAJ.cjs.map} +1 -1
- package/dist/{chunk-SOS2WASA.cjs → chunk-WZAHVTTO.cjs} +2 -26
- package/dist/chunk-WZAHVTTO.cjs.map +1 -0
- package/dist/collaboration/index.cjs +69 -69
- package/dist/collaboration/index.js +1 -1
- package/dist/collaboration/mail/MailActionBar.d.ts +3 -2
- package/dist/collaboration/mail/MailAddToWorkspaceDialog.d.ts +20 -0
- package/dist/collaboration/mail/MailFiledChips.d.ts +15 -0
- package/dist/collaboration/mail/MailMessageView.d.ts +3 -3
- package/dist/connect/index.cjs +1078 -805
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +498 -225
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +5 -5
- package/dist/connect/viewer.js +4 -4
- package/dist/connection/connectors/ConnectedMailboxSyncDialog.d.ts +3 -1
- package/dist/connection/connectors/native-mailbox.d.ts +19 -0
- package/dist/connection/files/imports/EmailImportPanel.d.ts +2 -2
- package/dist/connection/files/imports/NativeMailImportRow.d.ts +11 -0
- package/dist/connection/mail/ConnectedMailConversation.d.ts +3 -4
- package/dist/connection/mail/ConnectedMailbox.d.ts +1 -4
- package/dist/connection/mail/types.d.ts +2 -4
- package/dist/connection/mail/useMailMessageChange.d.ts +11 -2
- package/dist/connection/mail/useMailboxDefaults.d.ts +6 -3
- package/dist/connection/workspace-access/ConnectedGrantWorkspaceAccessDialog.d.ts +1 -1
- package/dist/document-tools/viewer/index.cjs +1 -1
- package/dist/document-tools/viewer/index.cjs.map +1 -1
- package/dist/document-tools/viewer/index.js +1 -1
- package/dist/document-tools/viewer/index.js.map +1 -1
- package/dist/embed/index.cjs +11 -11
- package/dist/embed/index.js +5 -5
- package/dist/files/import/ImportParts.d.ts +6 -3
- package/dist/files/index.cjs +222 -222
- package/dist/files/index.js +1 -1
- package/dist/index.cjs +294 -293
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/site/index.cjs +5 -5
- package/dist/site/index.js +1 -1
- package/dist/studio/index.cjs +1 -1
- package/dist/studio/index.js +1 -1
- package/dist/workflow-canvas/index.cjs +19 -18
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/dist/workflow-canvas/index.js +9 -8
- package/dist/workflow-canvas/index.js.map +1 -1
- package/dist/workspaces/index.cjs +33 -28
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.d.ts +1 -1
- package/dist/workspaces/index.js +3 -2
- package/dist/workspaces/index.js.map +1 -1
- package/dist/workspaces/workspace-roles.d.ts +11 -4
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/chunk-6S2LRXJ4.js.map +0 -1
- package/dist/chunk-6TYZ33WH.cjs.map +0 -1
- package/dist/chunk-FKFUAU4F.js.map +0 -1
- package/dist/chunk-HC54CTGN.cjs.map +0 -1
- package/dist/chunk-JJ5BXK3Q.cjs.map +0 -1
- package/dist/chunk-SOS2WASA.cjs.map +0 -1
- package/dist/chunk-TOT4HHHN.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/collaboration/members/WorkspaceMembers.tsx","../src/collaboration/contacts/parseEmails.ts","../src/collaboration/contacts/AddContactsParts.tsx","../src/collaboration/contacts/invite-plan.ts","../src/collaboration/contacts/contact-form.ts","../src/collaboration/direct-messages/DmParts.tsx","../src/collaboration/mail/mailFolders.ts","../src/collaboration/mail/MailFolderTree.tsx","../src/collaboration/mail/MailMessagePreview.tsx","../src/collaboration/mail/MailFlagButton.tsx","../src/collaboration/mail/mailCompose.ts","../src/collaboration/mail/MailGrid.tsx","../src/collaboration/mail/MailActionBar.tsx","../src/collaboration/mail/MailDeliveryList.tsx","../src/collaboration/mail/MailMessageContent.tsx","../src/collaboration/mail/printMail.ts","../src/collaboration/mail/moveTargets.ts","../src/collaboration/mail/MailMessageView.tsx","../src/collaboration/mail/MailConversationView.tsx","../src/collaboration/mail/MailDocumentPicker.tsx","../src/collaboration/mail/PlainMailBodyEditor.tsx"],"names":["jsx","cn","jsxs","Tooltip","TooltipTrigger","Select","SelectTrigger","RoleBadge","SelectContent","SelectItem","TooltipContent","Clock","Fragment","SelectValue","Button","UserMinus","useMemo","Gift","Textarea","AtSign","CheckCircle","XCircle","AlertCircle","ModalSection","ModalSectionTitle","EMAIL","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuSeparator","DropdownMenuItem","KeyRound","ScrollArea","Loader2","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","useRef","BellOff","Bell","X","Popover","PopoverTrigger","ChevronsUpDown","Plus","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","useState","useEffect","testIdOr","ChevronDown","ChevronRight","Checkbox","deliveryProblem","Paperclip","Flag","GridView","Mail","useAssistantCopy","ArrowLeft","Pencil","Reply","ReplyAll","Sparkles","RotateCcw","Archive","Ellipsis","Forward","MailOpen","DropdownMenuSub","DropdownMenuSubTrigger","FolderInput","DropdownMenuSubContent","Save","Printer","Download","Trash2","Send","CheckCircle2","recipients","DOMPurify","FolderOpen"],"mappings":"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","file":"chunk-HC54CTGN.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { Clock, UserMinus } from 'lucide-react'\nimport {\n Button,\n cn,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\nimport { RoleBadge } from '../../workspaces/WorkspaceBadges'\n\n/** One assignable role. `badgeClass` is the host's palette for the role. */\nexport interface MemberRoleOption {\n value: string\n label: string\n badgeClass: string\n}\n\n/** Tooltip + grid-cell text of the members table, kept in one place. */\nexport function MemberMutedText({\n children,\n title,\n className,\n}: {\n children: ReactNode\n title?: string\n className?: string\n}) {\n return (\n <span className={cn('text-sm text-muted-foreground', className)} title={title}>\n {children}\n </span>\n )\n}\n\n/** Layout of the Name cell: identity chip followed by optional contact toggle. */\nexport function MemberNameCell({ children }: { children: ReactNode }) {\n return <div className=\"flex h-full items-center gap-2\">{children}</div>\n}\n\nexport interface MemberRoleCellProps {\n role: string\n roles: MemberRoleOption[]\n /** Tooltip: why the role is locked, or what the role means. */\n tooltip: string\n canChange: boolean\n isPending: boolean\n onChange: (role: string) => void\n /** Session-scoped (temporary) grant: adds a clock with its explanation. */\n temporaryHint?: string\n}\n\n/** Inline role dropdown of a member row (always rendered so chevrons align). */\nexport function MemberRoleCell({\n role,\n roles,\n tooltip,\n canChange,\n isPending,\n onChange,\n temporaryHint,\n}: MemberRoleCellProps) {\n const current = roles.find((r) => r.value === role)\n return (\n <div className=\"flex h-full items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <Select value={role} onValueChange={onChange} disabled={!canChange || isPending}>\n <SelectTrigger\n className={cn(\n 'h-6 w-[130px] border-0 bg-transparent text-sm focus:ring-0 focus:ring-offset-0 disabled:opacity-100',\n canChange ? 'hover:bg-muted/50' : 'cursor-not-allowed [&>svg]:opacity-30'\n )}\n >\n <RoleBadge label={current?.label ?? role} badgeClass={current?.badgeClass ?? ''} />\n </SelectTrigger>\n <SelectContent>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n <RoleBadge label={r.label} badgeClass={r.badgeClass} />\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-[300px]\">\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n {temporaryHint && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Clock\n className=\"size-3.5 shrink-0 cursor-default text-muted-foreground\"\n aria-label={temporaryHint}\n />\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-[300px]\">\n <p>{temporaryHint}</p>\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n )\n}\n\n/** Loading strip of the members list. */\nexport function MemberListLoading({ label = 'Loading users...' }: { label?: string }) {\n return (\n <div\n className=\"rounded-md bg-blue-bg p-3 text-center text-sm\"\n data-testid=\"workspace-users-loading\"\n >\n <div className=\"mr-2 inline-block size-4 animate-spin rounded-full border-2 border-primary/30 border-t-primary\" />\n {label}\n </div>\n )\n}\n\nexport interface MemberBulkActionsProps {\n /** Roles a bulk change may assign. */\n roles: { value: string; label: string }[]\n onChangeRole: (role: string) => void\n isRoleDisabled: boolean\n roleTooltip: string\n /** Only the workspace owner can use either control (also styles them muted). */\n isOwner: boolean\n onRemove: () => void\n isRemoveDisabled: boolean\n removeTooltip: string\n changeRolePlaceholder?: string\n}\n\n/** Role change dropdown + remove button inside the selection bar of the members table. */\nexport function MemberBulkActions({\n roles,\n onChangeRole,\n isRoleDisabled,\n roleTooltip,\n isOwner,\n onRemove,\n isRemoveDisabled,\n removeTooltip,\n changeRolePlaceholder = 'Change role',\n}: MemberBulkActionsProps) {\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild onFocusCapture={(e) => e.stopPropagation()}>\n <span tabIndex={!isOwner ? 0 : undefined}>\n <Select value=\"\" onValueChange={onChangeRole} disabled={isRoleDisabled}>\n <SelectTrigger\n className={cn(\n 'h-7 w-[120px] text-sm pointer-coarse:h-11',\n isRoleDisabled ? 'border-border text-muted-foreground' : 'border-input'\n )}\n >\n <SelectValue placeholder={changeRolePlaceholder} />\n </SelectTrigger>\n <SelectContent>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p>{roleTooltip}</p>\n </TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={!isOwner ? 0 : undefined}>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onRemove}\n disabled={isRemoveDisabled}\n aria-label={removeTooltip}\n className={cn(\n 'size-7 pointer-coarse:size-11',\n isOwner\n ? 'border-destructive/30 text-destructive hover:bg-destructive hover:text-destructive-foreground'\n : 'border-border text-muted-foreground'\n )}\n >\n <UserMinus className=\"size-4\" />\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p>{removeTooltip}</p>\n </TooltipContent>\n </Tooltip>\n </>\n )\n}\n\nexport interface RoleSelectProps {\n value: string\n roles: MemberRoleOption[]\n onChange: (role: string) => void\n /** Tooltip: what the selected role allows. */\n description: string\n}\n\n/** Role picker shown beside a user selector (e.g. when sharing a workspace). */\nexport function RoleSelect({ value, roles, onChange, description }: RoleSelectProps) {\n const current = roles.find((r) => r.value === value)\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger className=\"h-8 w-[140px] pointer-coarse:h-11\">\n <SelectValue>\n <RoleBadge label={current?.label ?? value} badgeClass={current?.badgeClass ?? ''} />\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n <RoleBadge label={r.label} badgeClass={r.badgeClass} />\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"max-w-[300px]\">\n <p>{description}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n","import type { components } from '@arbidocs/client'\nimport type { AddContactsResultRow } from './AddContactsParts'\n\n/** The most addresses one add-contacts request may carry (the API's own limit). */\nexport const MAX_INVITE_EMAILS = 100\n\nconst EMAIL = /^[^\\s@,;]+@[^\\s@,;]+\\.[^\\s@,;]+$/\n\n/**\n * Distinct, lower-cased, well-formed addresses typed or pasted into the invite box. Commas,\n * semicolons, spaces and new lines all separate; anything that is not an address is dropped.\n */\nexport function parseEmails(text: string): string[] {\n const parts = text.split(/[\\s,;]+/).map((e) => e.trim().toLowerCase())\n return [...new Set(parts.filter((e) => EMAIL.test(e)))]\n}\n\ntype ContactRow = Pick<\n components['schemas']['ContactResponse'],\n 'email' | 'status' | 'outcome' | 'outcome_detail'\n>\n\n/** One plain sentence per outcome the backend reports. */\nexport interface ContactOutcomeLabels {\n contact_added: string\n already_contact: string\n invited: string\n reinvited: string\n not_resent_still_pending: string\n /** Fallback when the backend gives no detail for a failure. */\n failed: string\n /** A row the backend reported without an outcome. */\n added: string\n}\n\nexport const DEFAULT_CONTACT_OUTCOME_LABELS: ContactOutcomeLabels = {\n contact_added: 'Added to contacts (existing user)',\n already_contact: 'Already in your contacts',\n invited: 'Invitation sent',\n reinvited: 'Previous invitation expired, new one sent',\n not_resent_still_pending: 'Invitation already pending, not resent',\n failed: 'Could not be invited',\n added: 'Added successfully',\n}\n\n/**\n * What the backend did with one address, as a sentence. `outcome_detail` carries what only the server\n * knows (which rate limit refused, how long a live invitation has left), so it is always added.\n */\nexport function contactOutcomeMessage(\n row: ContactRow,\n labels: Partial<ContactOutcomeLabels> = {}\n): string {\n const l = { ...DEFAULT_CONTACT_OUTCOME_LABELS, ...labels }\n const base = row.outcome\n ? l[row.outcome]\n : row.status === 'registered'\n ? l.contact_added\n : l.added\n return row.outcome_detail ? `${base} — ${row.outcome_detail}` : base\n}\n\n/** A backend add-contact row as an {@link AddContactsResultRow} for `AddContactsResults`. */\nexport function toAddContactsRow(\n row: ContactRow,\n labels: Partial<ContactOutcomeLabels> = {}\n): AddContactsResultRow {\n return {\n email: row.email ?? '',\n status: row.outcome === 'failed' ? 'failed' : 'success',\n message: contactOutcomeMessage(row, labels),\n }\n}\n\n/** Map every row of an add-contacts response. */\nexport const toAddContactsRows = (\n rows: ContactRow[],\n labels?: Partial<ContactOutcomeLabels>\n): AddContactsResultRow[] => rows.map((r) => toAddContactsRow(r, labels))\n","import { useMemo, type ReactNode } from 'react'\nimport { AlertCircle, AtSign, CheckCircle, Gift, XCircle } from 'lucide-react'\nimport { Button, Textarea } from '@arbidocs/react/ui'\nimport { ModalSection, ModalSectionTitle } from '../../settings/ModalScaffold'\nimport { MAX_INVITE_EMAILS, parseEmails } from './parseEmails'\n\n/** Every fixed string of the add-contacts flow. */\nexport interface AddContactsLabels {\n placeholder: string\n hint: string\n add: (count: number) => string\n addOverMax: (count: number, max: number) => string\n adding: string\n cancel: string\n results: string\n email: string\n status: string\n done: string\n addMore: string\n /** The invite-reward banner text for a formatted amount. */\n reward: (amount: string) => ReactNode\n}\n\nexport const DEFAULT_ADD_CONTACTS_LABELS: AddContactsLabels = {\n placeholder: 'name@example.com',\n hint: 'Paste one or multiple emails — separated by commas, spaces, or new lines.',\n add: (count) => `Add${count > 0 ? ` (${count})` : ''}`,\n addOverMax: (count, max) => `Add (${count}) - Max ${max}`,\n adding: 'Adding...',\n cancel: 'Cancel',\n results: 'Results',\n email: 'Email',\n status: 'Status',\n done: 'Done',\n addMore: 'Add More',\n reward: (amount) => (\n <>\n Get <span className=\"font-semibold text-foreground\">{amount} off your next invoice</span> for\n every invited contact who goes Pro. They get {amount} off theirs.\n </>\n ),\n}\n\nexport interface AddContactsFormProps {\n value: string\n onChange: (value: string) => void\n /**\n * How many addresses `value` holds. Omit it: the form parses `value` itself with\n * {@link parseEmails} (commas, semicolons, spaces and new lines; distinct, valid, lower-cased).\n */\n emailCount?: number\n /** The most addresses one submit may carry. Default {@link MAX_INVITE_EMAILS} (the API's own limit). */\n maxEmails?: number\n isPending: boolean\n /** Receives the parsed addresses, ready to send. */\n onSubmit: (emails: string[]) => void\n onCancel?: () => void\n /** Formatted referral reward (\"$10\"); omit to hide the banner. */\n rewardAmount?: string\n labels?: Partial<AddContactsLabels>\n}\n\n/** Email invite form: a textarea for one or many addresses, and Add / Cancel. */\nexport function AddContactsForm({\n value,\n onChange,\n emailCount: emailCountProp,\n maxEmails = MAX_INVITE_EMAILS,\n isPending,\n onSubmit,\n onCancel,\n rewardAmount,\n labels,\n}: AddContactsFormProps) {\n const l = useMemo(() => ({ ...DEFAULT_ADD_CONTACTS_LABELS, ...labels }), [labels])\n const emails = useMemo(() => parseEmails(value), [value])\n const emailCount = emailCountProp ?? emails.length\n const overMax = emailCount > maxEmails\n return (\n <div className=\"space-y-4\" data-slot=\"add-contacts-form\">\n {rewardAmount && (\n <div\n className=\"flex items-start gap-2 rounded-md bg-green-bg p-3 text-sm\"\n data-testid=\"invite-reward-banner\"\n >\n <Gift className=\"mt-0.5 size-4 shrink-0 text-green-text\" />\n <p className=\"text-muted-foreground\">{l.reward(rewardAmount)}</p>\n </div>\n )}\n <div>\n <Textarea\n id=\"invite-emails\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={isPending}\n placeholder={l.placeholder}\n rows={2}\n autoFocus\n data-testid=\"invite-emails-input\"\n />\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{l.hint}</p>\n </div>\n\n <div className=\"flex flex-col gap-2 pt-2\">\n <Button\n onClick={() => onSubmit(emails)}\n disabled={emailCount === 0 || overMax || isPending}\n className=\"w-full\"\n data-testid=\"invite-send-button\"\n >\n {isPending ? (\n l.adding\n ) : (\n <>\n <AtSign className=\"mr-2 size-4\" />\n {overMax ? l.addOverMax(emailCount, maxEmails) : l.add(emailCount)}\n </>\n )}\n </Button>\n <Button variant=\"outline\" onClick={onCancel} disabled={isPending} className=\"w-full\">\n {l.cancel}\n </Button>\n </div>\n </div>\n )\n}\n\nexport interface AddContactsResultRow {\n email: string\n status: 'success' | 'failed' | 'pending'\n message: string\n}\n\nexport interface AddContactsResultsProps {\n rows: AddContactsResultRow[]\n onDone?: () => void\n onAddMore: () => void\n labels?: Partial<AddContactsLabels>\n}\n\nconst STATUS_ICON = {\n success: <CheckCircle className=\"size-4 shrink-0 text-green-text\" />,\n failed: <XCircle className=\"size-4 shrink-0 text-red-text\" />,\n pending: <AlertCircle className=\"size-4 shrink-0 text-yellow-text\" />,\n} as const\n\n/** Per-address outcome table with Done / Add More. */\nexport function AddContactsResults({ rows, onDone, onAddMore, labels }: AddContactsResultsProps) {\n const l = useMemo(() => ({ ...DEFAULT_ADD_CONTACTS_LABELS, ...labels }), [labels])\n return (\n <ModalSection>\n <ModalSectionTitle>{l.results}</ModalSectionTitle>\n <div className=\"max-h-80 overflow-y-auto rounded-md border\">\n <table className=\"w-full\">\n <thead className=\"sticky top-0 bg-muted/50\">\n <tr>\n <th className=\"p-2 text-left font-medium\">{l.email}</th>\n <th className=\"p-2 text-left font-medium\">{l.status}</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row, index) => (\n <tr\n key={index}\n className=\"border-t hover:bg-muted/30\"\n data-testid={`email-status-row-${index}`}\n >\n <td className=\"p-2\">{row.email}</td>\n <td className=\"p-2\">\n <div className=\"flex items-center gap-2\">\n {STATUS_ICON[row.status]}\n <span className=\"text-muted-foreground\">{row.message}</span>\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n <div className=\"flex flex-col gap-2 pt-4\">\n <Button onClick={onDone} className=\"w-full\" data-testid=\"close-results-button\">\n {l.done}\n </Button>\n <Button\n variant=\"outline\"\n onClick={onAddMore}\n className=\"w-full\"\n data-testid=\"start-over-button\"\n >\n {l.addMore}\n </Button>\n </div>\n </ModalSection>\n )\n}\n","/**\n * The \"add contacts by e-mail\" flow as pure steps: what was typed → which addresses to send (and a row for\n * every one left out, with the reason) → the rows once the server answered → one summary sentence.\n */\nimport type { components } from '@arbidocs/client'\nimport type { AddContactsResultRow } from './AddContactsParts'\nimport { toAddContactsRow, type ContactOutcomeLabels } from './parseEmails'\n\ntype Contact = components['schemas']['ContactResponse']\n\n/** Every typed token, lower-cased and distinct (commas, semicolons, spaces and new lines separate). */\nexport function emailTokens(text: string): string[] {\n return [\n ...new Set(\n text\n .split(/[,;\\s]+/)\n .map((e) => e.trim().toLowerCase())\n .filter(Boolean)\n ),\n ]\n}\n\nconst EMAIL = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\n\n/** A deliverable address: local@domain.tld, a TLD of 2+ letters, no doubled dots. */\nexport const isInvitableEmail = (email: string): boolean =>\n EMAIL.test(email) && !email.includes('..')\n\n/** Every fixed sentence of the planned rows and the summary. */\nexport interface ContactInviteLabels {\n invalid: string\n self: string\n resending: string\n sending: string\n alreadyInvited: string\n alreadyRegistered: string\n notProcessed: string\n}\n\nexport const DEFAULT_CONTACT_INVITE_LABELS: ContactInviteLabels = {\n invalid: 'Invalid email format (excluded)',\n self: \"Can't add yourself as a contact\",\n resending: 'Resending invitation...',\n sending: 'Sending...',\n alreadyInvited: 'User already in contacts (invitation pending)',\n alreadyRegistered: 'User already in contacts (registered)',\n notProcessed: 'Not processed by server (may be rate limited or invalid)',\n}\n\nexport interface ContactInvitePlan {\n /** One row per typed address, in the order shown. */\n rows: AddContactsResultRow[]\n /** The addresses to send (new ones, and expired invitations to resend). */\n send: string[]\n}\n\n/**\n * Plan an invite: bad addresses and your own are left out, people already in your contacts are not sent\n * again (an expired invitation is), the rest are sent.\n */\nexport function planContactInvites(\n text: string,\n contacts: Pick<Contact, 'email' | 'status'>[],\n selfEmail?: string | null,\n labels: Partial<ContactInviteLabels> = {}\n): ContactInvitePlan {\n const l = { ...DEFAULT_CONTACT_INVITE_LABELS, ...labels }\n const me = selfEmail?.toLowerCase()\n const tokens = emailTokens(text)\n const invalid = tokens.filter((e) => !isInvitableEmail(e))\n const valid = tokens.filter((e) => isInvitableEmail(e))\n const rows: AddContactsResultRow[] = invalid.map((email) => ({\n email,\n status: 'failed',\n message: l.invalid,\n }))\n const self = valid.filter((e) => me && e === me)\n rows.push(...self.map((email) => ({ email, status: 'failed' as const, message: l.self })))\n const send: string[] = []\n for (const email of valid) {\n if (me && email === me) continue\n const existing = contacts.find((c) => c.email?.toLowerCase() === email)\n if (!existing) {\n send.push(email)\n rows.push({ email, status: 'pending', message: l.sending })\n } else if (existing.status === 'expired') {\n send.push(email)\n rows.push({ email, status: 'pending', message: l.resending })\n } else\n rows.push({\n email,\n status: 'success',\n message: existing.status === 'invited' ? l.alreadyInvited : l.alreadyRegistered,\n })\n }\n return { rows, send }\n}\n\n/** The planned rows once the server answered for the sent addresses. */\nexport function applyContactInviteResults(\n plan: ContactInvitePlan,\n response: Pick<Contact, 'email' | 'status' | 'outcome' | 'outcome_detail'>[],\n labels: Partial<ContactInviteLabels & ContactOutcomeLabels> = {}\n): AddContactsResultRow[] {\n const l = { ...DEFAULT_CONTACT_INVITE_LABELS, ...labels }\n return plan.rows.map((row) => {\n if (!plan.send.includes(row.email)) return row\n const answer = response.find((c) => c.email?.toLowerCase() === row.email)\n return answer\n ? { ...toAddContactsRow(answer, labels), email: row.email }\n : { email: row.email, status: 'failed', message: l.notProcessed }\n })\n}\n\n/** The planned rows when the request itself failed: every sent address carries `message`. */\nexport function failContactInvites(\n plan: ContactInvitePlan,\n message: string\n): AddContactsResultRow[] {\n return plan.rows.map((row) =>\n plan.send.includes(row.email) ? { ...row, status: 'failed', message } : row\n )\n}\n\n/** \"2 contacts added, 1 invitation email sent, 1 failed\" for what the server did. */\nexport function summarizeContactInvites(response: Pick<Contact, 'outcome'>[]): {\n message: string\n failed: boolean\n} {\n const count = (...outcomes: Contact['outcome'][]) =>\n response.filter((c) => outcomes.includes(c.outcome)).length\n const added = count('contact_added')\n const sent = count('invited', 'reinvited')\n const failed = count('failed')\n const notResent = count('not_resent_still_pending')\n const parts: string[] = []\n if (added) parts.push(`${added} contact${added !== 1 ? 's' : ''} added`)\n if (sent) parts.push(`${sent} invitation email${sent !== 1 ? 's' : ''} sent`)\n if (notResent) parts.push(`${notResent} already pending`)\n if (failed) parts.push(`${failed} failed`)\n return { message: parts.length ? parts.join(', ') : 'No changes', failed: failed > 0 }\n}\n\n/** The sentence when nothing needed sending (everyone already a contact, or left out). */\nexport function summarizeUnsentInvites(\n rows: AddContactsResultRow[],\n labels: Partial<ContactInviteLabels> = {}\n): string {\n const l = { ...DEFAULT_CONTACT_INVITE_LABELS, ...labels }\n const already = rows.filter(\n (r) => r.message === l.alreadyInvited || r.message === l.alreadyRegistered\n ).length\n const excluded = rows.filter((r) => r.message === l.invalid).length\n if (already && excluded) return `${already} already in contacts, ${excluded} excluded`\n if (already) return `All ${already} email${already !== 1 ? 's are' : ' is'} already in contacts`\n return 'All emails excluded (invalid or duplicate)'\n}\n","/** Contact form state ↔ API (`ContactCardWrite` / `ContactCard`) mapping, validation and list helpers. Pure. */\nimport type { components } from '@arbidocs/client'\n\ntype Contact = components['schemas']['ContactResponse']\ntype ContactCard = components['schemas']['ContactCard']\ntype ContactCardWrite = components['schemas']['ContactCardWrite']\ntype ContactImportResult = components['schemas']['ContactImportResult']\n\nexport interface LabeledValue {\n value: string\n type: string\n}\n\nexport interface ContactFormState {\n name: string\n emails: LabeledValue[]\n phones: LabeledValue[]\n addresses: LabeledValue[]\n organization: string\n title: string\n /** YYYY-MM-DD, --MM-DD, or MM-DD (normalised to --MM-DD) */\n birthday: string\n anniversary: string\n note: string\n /** Not edited in the form; carried so an edit does not drop them. */\n nickname: string\n urls: string[]\n}\n\nexport const EMPTY_CONTACT_FORM: ContactFormState = {\n name: '',\n emails: [{ value: '', type: '' }],\n phones: [{ value: '', type: '' }],\n addresses: [],\n organization: '',\n title: '',\n birthday: '',\n anniversary: '',\n note: '',\n nickname: '',\n urls: [],\n}\n\nfunction str(v: unknown): string {\n return typeof v === 'string' ? v : ''\n}\n\nexport function contactToForm(c: ContactCard): ContactFormState {\n const pick = (rows: object[] | undefined, key: string) =>\n (rows ?? []).map((row) => {\n const r = row as Record<string, unknown>\n return { value: str(r[key]), type: str(r.type) }\n })\n const emails = pick(c.emails, 'email')\n const phones = pick(c.phones, 'number')\n return {\n name: c.name ?? '',\n emails: emails.length ? emails : [{ value: '', type: '' }],\n phones: phones.length ? phones : [{ value: '', type: '' }],\n addresses: pick(c.addresses, 'value'),\n organization: c.organization ?? '',\n title: c.title ?? '',\n birthday: c.birthday ?? '',\n anniversary: c.anniversary ?? '',\n note: c.note ?? '',\n nickname: c.nickname ?? '',\n urls: c.urls ?? [],\n }\n}\n\nconst FULL_DATE = /^\\d{4}-\\d{2}-\\d{2}$/\nconst NO_YEAR = /^--\\d{2}-\\d{2}$/\nconst MONTH_DAY = /^\\d{2}-\\d{2}$/\n\n/**\n * A vCard date: `YYYY-MM-DD`, or `--MM-DD` when the year is unknown (`MM-DD` is accepted and normalised).\n * Returns null for empty input and `undefined` when invalid.\n */\nexport function normalizeVCardDate(input: string): string | null | undefined {\n const v = input.trim()\n if (!v) return null\n const candidate = MONTH_DAY.test(v) ? `--${v}` : v\n if (!FULL_DATE.test(candidate) && !NO_YEAR.test(candidate)) return undefined\n const [m, d] = candidate.slice(-5).split('-').map(Number)\n if (m < 1 || m > 12 || d < 1 || d > 31) return undefined\n if (FULL_DATE.test(candidate)) {\n const y = Number(candidate.slice(0, 4))\n const t = new Date(Date.UTC(y, m - 1, d))\n if (t.getUTCMonth() !== m - 1) return undefined\n } else {\n // Feb 29 is fine without a year; reject impossible days.\n const max = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][m - 1]\n if (d > max) return undefined\n }\n return candidate\n}\n\nconst EMAIL = /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/\n\nexport function validateContactForm(f: ContactFormState): Record<string, string> {\n const errors: Record<string, string> = {}\n if (!f.name.trim()) errors.name = 'Enter a name'\n if (f.emails.some((e) => e.value.trim() && !EMAIL.test(e.value.trim())))\n errors.emails = 'Check the e-mail address'\n if (normalizeVCardDate(f.birthday) === undefined)\n errors.birthday = 'Use YYYY-MM-DD, or --MM-DD without a year'\n if (normalizeVCardDate(f.anniversary) === undefined)\n errors.anniversary = 'Use YYYY-MM-DD, or --MM-DD without a year'\n return errors\n}\n\n/** Build the API body: trims, drops blank rows, nulls empty optional text, normalises dates. */\nexport function formToContactCard(f: ContactFormState): ContactCardWrite {\n const rows = (list: LabeledValue[]) =>\n list.map((r) => ({ value: r.value.trim(), type: r.type.trim() || null })).filter((r) => r.value)\n const opt = (v: string) => v.trim() || null\n return {\n name: f.name.trim(),\n emails: rows(f.emails).map((r) => ({ email: r.value, type: r.type })),\n phones: rows(f.phones).map((r) => ({ number: r.value, type: r.type })),\n addresses: rows(f.addresses).map((r) => ({ value: r.value, type: r.type })),\n organization: opt(f.organization),\n title: opt(f.title),\n birthday: normalizeVCardDate(f.birthday) ?? null,\n anniversary: normalizeVCardDate(f.anniversary) ?? null,\n note: opt(f.note),\n nickname: opt(f.nickname),\n urls: f.urls.map((u) => u.trim()).filter(Boolean),\n }\n}\n\n/** The first well-formed e-mail address on the form: the one \"Invite to ARBI\" links. */\nexport function inviteEmail(f: ContactFormState): string | null {\n const first = f.emails.map((e) => e.value.trim()).find((e) => EMAIL.test(e))\n return first ? first.toLowerCase() : null\n}\n\n/** The name a contact is listed under: its card, else the ARBI account, else the address. */\nexport function contactName(c: Contact): string {\n const user = c.user ? [c.user.given_name, c.user.family_name].filter(Boolean).join(' ') : ''\n return c.card?.name || user || c.email || ''\n}\n\n/** Primary e-mail of a contact for list display: the linked address, else the card's first. */\nexport function primaryEmail(c: Contact): string | null {\n return c.email || c.card?.emails?.[0]?.email || null\n}\n\nexport function matchesContact(c: Contact, q: string): boolean {\n const term = q.trim().toLowerCase()\n if (!term) return true\n const card = c.card\n const hay = [\n contactName(c),\n c.email,\n card?.organization,\n card?.title,\n card?.nickname,\n ...(card?.emails ?? []).map((e) => e.email),\n ...(card?.phones ?? []).map((p) => p.number),\n ]\n return hay.some((h) => h && h.toLowerCase().includes(term))\n}\n\n/** The short status a contact row shows; a plain card shows none. */\nexport function contactStatusLabel(status: Contact['status']): string | null {\n switch (status) {\n case 'registered':\n return 'On ARBI'\n case 'invited':\n return 'Invited'\n case 'expired':\n return 'Invite expired'\n case 'failed':\n return 'Invite failed'\n default:\n return null\n }\n}\n\n/** \"12 added, 3 matched existing contacts, 1 skipped\" for a .vcf import. */\nexport function summarizeImport(r: ContactImportResult): string {\n const parts = [`${r.added} added`]\n if (r.matched) parts.push(`${r.matched} matched existing contact${r.matched === 1 ? '' : 's'}`)\n if (r.skipped.length) parts.push(`${r.skipped.length} skipped`)\n return parts.join(', ')\n}\n","import { useMemo, useRef, type ReactNode, type Ref } from 'react'\nimport {\n AtSign,\n ChevronsUpDown,\n KeyRound,\n Loader2,\n MoreVertical,\n Plus,\n Bell,\n BellOff,\n X,\n} from 'lucide-react'\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Popover,\n PopoverContent,\n PopoverTrigger,\n ScrollArea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\nimport { ModalSectionTitle } from '../../settings/ModalScaffold'\n\n/** Every fixed string of the access-request banner. */\nexport interface DmAccessRequestBannerLabels {\n /** Text after the bold peer name (keep the leading space). */\n requestedAccess: string\n review: string\n}\n\nexport const DEFAULT_DM_ACCESS_REQUEST_BANNER_LABELS: DmAccessRequestBannerLabels = {\n requestedAccess: ' requested workspace access',\n review: 'Review',\n}\n\n/** Every fixed string of the thread frame. */\nexport interface DmThreadFrameLabels {\n noMessages: string\n}\n\nexport const DEFAULT_DM_THREAD_FRAME_LABELS: DmThreadFrameLabels = {\n noMessages: 'No messages yet — say hi 👋',\n}\n\n/** Every fixed string of the grant-access dialog. */\nexport interface DmGrantAccessDialogLabels {\n title: string\n description: (peerName: string) => string\n noWorkspace: string\n workspace: string\n role: string\n cancel: string\n grantAccess: string\n}\n\nexport const DEFAULT_DM_GRANT_ACCESS_DIALOG_LABELS: DmGrantAccessDialogLabels = {\n title: 'Grant workspace access',\n description: (peerName) =>\n `Give ${peerName} access to one of your workspaces. Access is permanent until you remove it.`,\n noWorkspace:\n 'Open the workspace you want to share, as its owner, and you can grant access to it from here.',\n workspace: 'Workspace',\n role: 'Role',\n cancel: 'Cancel',\n grantAccess: 'Grant access',\n}\n\n/** Every fixed string of the recipient picker. */\nexport interface RecipientPickerLabels {\n to: string\n unmuteNotifications: string\n muteNotifications: string\n removeRecipient: string\n selectRecipient: string\n addRecipient: string\n searchUsers: string\n noKnownUsers: string\n noMatchingUsers: string\n addContactsHint: string\n}\n\nexport const DEFAULT_RECIPIENT_PICKER_LABELS: RecipientPickerLabels = {\n to: 'To',\n unmuteNotifications: 'Unmute notifications',\n muteNotifications: 'Mute notifications',\n removeRecipient: 'Remove recipient',\n selectRecipient: 'Select recipient...',\n addRecipient: 'Add recipient',\n searchUsers: 'Search users...',\n noKnownUsers: 'No known users',\n noMatchingUsers: 'No matching users',\n addContactsHint: 'Add contacts or join workspaces to send private messages',\n}\n\nexport type ActionMenuEntry =\n | {\n id: string\n label: ReactNode\n icon?: ReactNode\n onSelect: () => void\n testId?: string\n destructive?: boolean\n }\n | { id: string; separator: true }\n\nexport interface ActionMenuProps {\n /** Accessible name of the trigger. */\n label: string\n testId?: string\n entries: ActionMenuEntry[]\n /** Width class of the menu. */\n contentClassName?: string\n}\n\n/** A single ⋮ overflow menu: the occasional actions on a row or header. */\nexport function ActionMenu({ label, testId, entries, contentClassName = 'w-56' }: ActionMenuProps) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n aria-label={label}\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n >\n <MoreVertical className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className={contentClassName}>\n {entries.map((entry) =>\n 'separator' in entry ? (\n <DropdownMenuSeparator key={entry.id} />\n ) : (\n <DropdownMenuItem\n key={entry.id}\n onClick={entry.onSelect}\n className={entry.destructive ? 'text-destructive focus:text-destructive' : undefined}\n data-testid={entry.testId}\n >\n {entry.icon && (\n <span className=\"mr-2 inline-flex size-4 items-center\">{entry.icon}</span>\n )}\n {entry.label}\n </DropdownMenuItem>\n )\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/** Round \"@\" mark standing in for the face of a pending invitation. */\nexport function DmInviteAvatar() {\n return (\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <AtSign className=\"size-4\" />\n </span>\n )\n}\n\n/** Banner at the top of a thread: the peer asked for workspace access; Review opens the grant flow. */\nexport function DmAccessRequestBanner({\n name,\n onReview,\n labels,\n}: {\n name: string\n onReview: () => void\n labels?: Partial<DmAccessRequestBannerLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_DM_ACCESS_REQUEST_BANNER_LABELS, ...labels }), [labels])\n return (\n <div className=\"mx-4 mt-3 flex items-center gap-3 rounded-lg bg-muted px-3 py-2.5\">\n <KeyRound className=\"h-4 w-4 shrink-0 text-primary\" />\n <span className=\"min-w-0 flex-1 text-sm text-foreground\">\n <span className=\"font-medium\">{name}</span>\n {l.requestedAccess}\n </span>\n <Button size=\"sm\" onClick={onReview} data-testid=\"dm-review-access-button\">\n {l.review}\n </Button>\n </div>\n )\n}\n\nexport interface DmThreadFrameProps {\n /** Recipient picker, shown above everything in compose mode. */\n recipientPicker?: ReactNode\n accessBanner?: ReactNode\n /** A recipient is chosen: the history area shows. */\n hasRecipient: boolean\n /** The history is still decrypting. */\n isLoading: boolean\n /** Messages (and the typing indicator), rendered inside the scroll area. */\n history: ReactNode\n /** No messages yet. */\n isEmpty: boolean\n /** Prompt shown when there is no recipient and users exist to pick from. */\n noRecipientPrompt?: ReactNode\n /** Ref to the history wrapper (the host scrolls its viewport). */\n historyRef?: Ref<HTMLDivElement>\n composer: ReactNode\n labels?: Partial<DmThreadFrameLabels>\n}\n\n/** Layout of one direct-message thread: picker, banner, scrolling history, composer. */\nexport function DmThreadFrame({\n recipientPicker,\n accessBanner,\n hasRecipient,\n isLoading,\n history,\n isEmpty,\n noRecipientPrompt,\n historyRef,\n composer,\n labels,\n}: DmThreadFrameProps) {\n const l = useMemo(() => ({ ...DEFAULT_DM_THREAD_FRAME_LABELS, ...labels }), [labels])\n return (\n <div className=\"flex h-full flex-col bg-background\">\n {recipientPicker}\n {accessBanner}\n\n {/* Clean page surface: the peer bubble is `bg-card` and the own bubble a soft tint. */}\n {hasRecipient && (\n <div className=\"min-h-0 flex-1 overflow-hidden bg-background\" ref={historyRef}>\n <ScrollArea className=\"h-full\">\n <div className=\"px-4 py-3\">\n {isLoading ? (\n <div className=\"flex h-32 items-center justify-center\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n ) : !isEmpty ? (\n history\n ) : (\n <div className=\"flex h-32 items-center justify-center text-sm text-muted-foreground\">\n {l.noMessages}\n </div>\n )}\n </div>\n </ScrollArea>\n </div>\n )}\n\n {!hasRecipient && noRecipientPrompt && (\n <div className=\"flex min-h-0 flex-1 items-center justify-center bg-background p-4\">\n <p className=\"text-center text-sm text-muted-foreground\">{noRecipientPrompt}</p>\n </div>\n )}\n\n <div className=\"shrink-0\">{composer}</div>\n </div>\n )\n}\n\nexport interface DmGrantAccessDialogViewProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n peerName: string\n /** The one workspace that can be shared; `null` when none is eligible. */\n workspaceName: string | null\n role: string\n onRoleChange: (role: string) => void\n roles: { value: string; label: string; hint: string }[]\n isGranting: boolean\n onGrant: () => void\n labels?: Partial<DmGrantAccessDialogLabels>\n}\n\n/** Offer a person access to the open workspace: the workspace, a role, a grant button. */\nexport function DmGrantAccessDialogView({\n open,\n onOpenChange,\n peerName,\n workspaceName,\n role,\n onRoleChange,\n roles,\n isGranting,\n onGrant,\n labels,\n}: DmGrantAccessDialogViewProps) {\n const l = useMemo(() => ({ ...DEFAULT_DM_GRANT_ACCESS_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent presentation=\"sheet\" data-testid=\"dm-grant-access-modal\">\n <DialogHeader>\n <DialogTitle>{l.title}</DialogTitle>\n <DialogDescription>{l.description(peerName)}</DialogDescription>\n </DialogHeader>\n\n {workspaceName === null ? (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"dm-grant-none\">\n {l.noWorkspace}\n </p>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{l.workspace}</label>\n <p className=\"rounded-lg bg-muted px-3 py-2 text-sm\" data-testid=\"dm-grant-workspace\">\n {workspaceName}\n </p>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{l.role}</label>\n <Select value={role} onValueChange={onRoleChange}>\n <SelectTrigger data-testid=\"dm-grant-role\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n {r.label} — {r.hint}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} disabled={isGranting}>\n {l.cancel}\n </Button>\n <Button\n onClick={onGrant}\n disabled={isGranting || workspaceName === null}\n data-testid=\"dm-grant-submit\"\n >\n {isGranting && <Loader2 className=\"mr-2 size-4 animate-spin\" />}\n {l.grantAccess}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface RecipientView {\n id: string\n /** Avatar + name pill. */\n identity: ReactNode\n /** DM selections have notification controls; a form field may supply identity only. */\n isMuted?: boolean\n muteTooltip?: string\n onToggleMute?: () => void\n isMuteBusy?: boolean\n}\n\nexport interface RecipientCandidate {\n id: string\n identity: ReactNode\n value?: string\n}\n\nexport interface RecipientPickerProps {\n selected: RecipientView[]\n onRemove: (id: string) => void\n candidates: RecipientCandidate[]\n onPick: (id: string) => void\n /** Hide the add control (the maximum is reached). */\n canAdd: boolean\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n search: string\n onSearchChange: (value: string) => void\n /** There is nobody at all to pick from (vs. no search match). */\n hasNoKnownUsers: boolean\n labels?: Partial<RecipientPickerLabels>\n /** The compose row, or a form field using the same selected rows and search. */\n layout?: 'compose' | 'field'\n actionSlot?: ReactNode\n beforeCandidates?: ReactNode\n candidateHeading?: string\n /** null hides the empty row (e.g. while a typed address can be added). */\n emptyContent?: ReactNode\n triggerTestId?: string\n}\n\n/** \"To:\" row of the compose view: chosen recipients (mutable) and a searchable add control. */\nexport function RecipientPicker({\n selected,\n onRemove,\n candidates,\n onPick,\n canAdd,\n isOpen,\n onOpenChange,\n search,\n onSearchChange,\n hasNoKnownUsers,\n labels,\n layout = 'compose',\n actionSlot,\n beforeCandidates,\n candidateHeading,\n emptyContent,\n triggerTestId,\n}: RecipientPickerProps) {\n const openRef = useRef(isOpen)\n openRef.current = isOpen\n const l = useMemo(() => ({ ...DEFAULT_RECIPIENT_PICKER_LABELS, ...labels }), [labels])\n const rows = selected.map((recipient) => (\n <div\n key={recipient.id}\n className={\n layout === 'field'\n ? 'flex items-center justify-between gap-2 py-1.5 px-3 bg-muted/50 rounded-md'\n : 'flex items-center justify-between gap-2 rounded-md bg-muted/50 px-3 py-1.5'\n }\n >\n <div\n className={\n layout === 'field' ? 'flex items-center gap-2 min-w-0' : 'flex items-center gap-2'\n }\n >\n {recipient.identity}\n {recipient.onToggleMute && (\n <Tooltip>\n <TooltipTrigger\n onClick={recipient.onToggleMute}\n aria-label={recipient.isMuted ? l.unmuteNotifications : l.muteNotifications}\n aria-pressed={recipient.isMuted}\n className={`rounded p-1 transition-colors hover:bg-muted pointer-coarse:p-3 ${\n recipient.isMuted\n ? 'text-muted-foreground'\n : 'text-muted-foreground/40 hover:text-muted-foreground'\n }`}\n disabled={recipient.isMuteBusy}\n >\n {recipient.isMuted ? <BellOff size={14} fill=\"currentColor\" /> : <Bell size={14} />}\n </TooltipTrigger>\n <TooltipContent className=\"max-w-[250px]\">{recipient.muteTooltip}</TooltipContent>\n </Tooltip>\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => onRemove(recipient.id)}\n className={\n layout === 'field'\n ? 'p-1 text-muted-foreground hover:text-destructive'\n : 'p-1 text-muted-foreground hover:text-destructive pointer-coarse:p-3'\n }\n title={l.removeRecipient}\n aria-label={l.removeRecipient}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ))\n const picker = canAdd && (\n <Popover open={isOpen} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n {layout === 'field' || selected.length === 0 ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={layout === 'compose' && hasNoKnownUsers}\n className={\n layout === 'field'\n ? 'min-w-0 flex-1 justify-start text-muted-foreground'\n : 'w-full justify-start text-muted-foreground'\n }\n data-testid={triggerTestId}\n >\n <ChevronsUpDown\n className={layout === 'field' ? 'mr-2 h-4 w-4 shrink-0' : 'mr-2 h-4 w-4'}\n />\n {layout === 'field' ? (\n <span className=\"truncate\">{l.selectRecipient}</span>\n ) : (\n l.selectRecipient\n )}\n </Button>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n disabled={layout === 'compose' && hasNoKnownUsers}\n className=\"h-7 w-7 rounded-full\"\n title={l.addRecipient}\n aria-label={l.addRecipient}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n )}\n </PopoverTrigger>\n <PopoverContent\n // A previous close can restore focus after this picker reopened. Keep the new\n // input focused; the ordinary close still returns focus to the trigger.\n onCloseAutoFocus={(event) => {\n if (openRef.current) event.preventDefault()\n }}\n className=\"w-72 p-0\"\n align=\"start\"\n onPointerDownOutside={layout === 'compose' ? (e) => e.preventDefault() : undefined}\n >\n <Command shouldFilter={false}>\n <CommandInput placeholder={l.searchUsers} value={search} onValueChange={onSearchChange} />\n <CommandList>\n {beforeCandidates}\n {candidates.length === 0 ? (\n emptyContent === null ? null : (\n <CommandEmpty>\n {emptyContent ?? (hasNoKnownUsers ? l.noKnownUsers : l.noMatchingUsers)}\n </CommandEmpty>\n )\n ) : (\n <CommandGroup heading={candidateHeading}>\n {candidates.map((candidate) => (\n <CommandItem\n key={candidate.id}\n value={candidate.value}\n onSelect={() => onPick(candidate.id)}\n className={\n layout === 'field' ? 'cursor-pointer' : 'cursor-pointer justify-start'\n }\n >\n {candidate.identity}\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n if (layout === 'field')\n return (\n <div className=\"flex flex-col gap-1.5\">\n {rows}\n <div className=\"flex items-center gap-2\">\n {picker}\n {selected.length > 0 && actionSlot}\n </div>\n </div>\n )\n return (\n <div className=\"shrink-0 border-b px-6 py-4\">\n <div className=\"flex items-start gap-3\">\n <ModalSectionTitle className=\"mb-0 shrink-0 py-1.5\">{l.to}</ModalSectionTitle>\n <div className=\"flex flex-1 flex-col gap-1.5\">\n {rows}\n {picker}\n {hasNoKnownUsers && <p className=\"text-sm text-muted-foreground\">{l.addContactsHint}</p>}\n </div>\n </div>\n </div>\n )\n}\n","/** A selectable mail folder (Outlook) or label (Gmail). */\nexport interface MailFolder {\n id: string\n /** Full path, e.g. \"Inbox/Clients/Acme\". */\n name: string\n /** Total messages (null/undefined when unavailable). */\n count?: number | null\n}\n\nexport interface MailFolderNode {\n key: string\n label: string\n /** null for a path segment with no folder of its own (a grouping row). */\n folder: MailFolder | null\n children: MailFolderNode[]\n}\n\nexport const isInboxFolder = (f: MailFolder) => f.id === 'INBOX' || /^inbox$/i.test(f.name)\n\n/** Build the folder tree from full-path names; Inbox first, then alphabetical. */\nexport function buildMailFolderTree(folders: MailFolder[]): MailFolderNode[] {\n const root: MailFolderNode = { key: '', label: '', folder: null, children: [] }\n const byPath = new Map<string, MailFolderNode>([['', root]])\n // Parents before children so a real folder claims its node before descendants.\n const sorted = [...folders].sort((a, b) => a.name.split('/').length - b.name.split('/').length)\n for (const f of sorted) {\n const parts = f.name.split('/')\n let path = ''\n let parent = root\n parts.forEach((part, i) => {\n path = path ? `${path}/${part}` : part\n let node = byPath.get(path)\n if (!node) {\n node = { key: path, label: part, folder: null, children: [] }\n byPath.set(path, node)\n parent.children.push(node)\n }\n if (i === parts.length - 1 && !node.folder) node.folder = f\n parent = node\n })\n }\n const order = (nodes: MailFolderNode[]) => {\n nodes.sort((a, b) => {\n const ai = a.folder ? isInboxFolder(a.folder) : false\n const bi = b.folder ? isInboxFolder(b.folder) : false\n if (ai !== bi) return ai ? -1 : 1\n return a.label.localeCompare(b.label)\n })\n nodes.forEach((n) => order(n.children))\n }\n order(root.children)\n return root.children\n}\n\n/** Ids of every real folder beneath `node`. */\nexport function descendantFolderIds(node: MailFolderNode): string[] {\n return node.children.flatMap((c) => [\n ...(c.folder ? [c.folder.id] : []),\n ...descendantFolderIds(c),\n ])\n}\n\n/**\n * Selection after toggling `node`: untick removes it; tick adds it and, when `cascade`, drops any\n * selected descendants (the parent already covers its subtree, so only the top-most is kept).\n */\nexport function toggleMailFolder(\n selected: string[],\n node: MailFolderNode,\n cascade: boolean\n): string[] {\n const id = node.folder?.id\n if (!id) return selected\n if (selected.includes(id)) return selected.filter((s) => s !== id)\n const covered = cascade ? new Set(descendantFolderIds(node)) : new Set<string>()\n return [...selected.filter((s) => !covered.has(s)), id]\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { ChevronDown, ChevronRight } from 'lucide-react'\nimport { Checkbox, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\nimport { isInboxFolder, toggleMailFolder, type MailFolderNode } from './mailFolders'\n\nfunction hasSelectedDescendant(node: MailFolderNode, selected: string[]): boolean {\n return node.children.some(\n (c) => (c.folder && selected.includes(c.folder.id)) || hasSelectedDescendant(c, selected)\n )\n}\n\nexport interface MailFolderTreeLabels {\n collapse: string\n expand: string\n recommended: string\n}\n\nexport const DEFAULT_MAIL_FOLDER_TREE_LABELS: MailFolderTreeLabels = {\n collapse: 'Collapse folder',\n expand: 'Expand folder',\n recommended: 'Recommended',\n}\n\nexport interface MailFolderTreeTestIds {\n /** Builds the id of a node's expand toggle from its key. */\n toggle: (nodeKey: string) => string\n /** Builds the id of a folder checkbox from its folder id. */\n checkbox: (folderId: string) => string\n}\n\ninterface RowProps {\n labels: MailFolderTreeLabels\n testIds?: Partial<MailFolderTreeTestIds>\n node: MailFolderNode\n depth: number\n selected: string[]\n onToggle: (node: MailFolderNode) => void\n ancestorSelected: boolean\n cascade: boolean\n expandAllNonce: number\n collapseAllNonce: number\n}\n\nfunction MailFolderRow({\n labels,\n testIds,\n node,\n depth,\n selected,\n onToggle,\n ancestorSelected,\n cascade,\n expandAllNonce,\n collapseAllNonce,\n}: RowProps) {\n const f = node.folder\n // Open a selected folder (so its checked subfolders show) or a branch holding a selection;\n // later ticks never force a node open.\n const [expanded, setExpanded] = useState(\n () =>\n (!!f && selected.includes(f.id)) ||\n hasSelectedDescendant(node, selected) ||\n expandAllNonce > collapseAllNonce\n )\n // \"Expand all\" / \"Collapse all\": each bump of a nonce opens / closes this node.\n const applied = useRef({ expand: expandAllNonce, collapse: collapseAllNonce })\n useEffect(() => {\n if (expandAllNonce > applied.current.expand) setExpanded(true)\n if (collapseAllNonce > applied.current.collapse) setExpanded(false)\n applied.current = { expand: expandAllNonce, collapse: collapseAllNonce }\n }, [expandAllNonce, collapseAllNonce])\n const isSelected = ancestorSelected || (!!f && selected.includes(f.id))\n return (\n <div>\n <div\n className=\"flex items-center gap-1.5 rounded px-1 py-1 text-sm hover:bg-muted/50 pointer-coarse:min-h-11\"\n style={{ paddingLeft: depth * 18 + 4 }}\n >\n {node.children.length > 0 ? (\n <button\n type=\"button\"\n className=\"flex size-4 shrink-0 items-center justify-center text-muted-foreground pointer-coarse:size-8\"\n onClick={() => setExpanded((e) => !e)}\n aria-label={expanded ? labels.collapse : labels.expand}\n aria-expanded={expanded}\n data-testid={testIdOr(testIds?.toggle?.(node.key), {\n testId: `mail-folder-toggle-${node.key}`,\n })}\n >\n {expanded ? (\n <ChevronDown className=\"size-3.5\" />\n ) : (\n <ChevronRight className=\"size-3.5\" />\n )}\n </button>\n ) : (\n <span className=\"size-4 shrink-0\" />\n )}\n {f ? (\n <label className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-2\">\n <Checkbox\n checked={isSelected}\n disabled={ancestorSelected}\n onCheckedChange={() => onToggle(node)}\n data-testid={testIdOr(testIds?.checkbox?.(f.id), {\n testId: `mail-folder-checkbox-${f.id}`,\n })}\n />\n <span className=\"truncate\" title={f.name}>\n {node.label}\n </span>\n {typeof f.count === 'number' && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n ({f.count.toLocaleString()})\n </span>\n )}\n {isInboxFolder(f) && (\n <span className=\"ml-auto shrink-0 rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\">\n {labels.recommended}\n </span>\n )}\n </label>\n ) : (\n <span className=\"truncate font-medium text-muted-foreground\">{node.label}</span>\n )}\n </div>\n {expanded &&\n node.children.map((c) => (\n <MailFolderRow\n labels={labels}\n testIds={testIds}\n key={c.key}\n node={c}\n depth={depth + 1}\n selected={selected}\n onToggle={onToggle}\n ancestorSelected={cascade && isSelected}\n cascade={cascade}\n expandAllNonce={expandAllNonce}\n collapseAllNonce={collapseAllNonce}\n />\n ))}\n </div>\n )\n}\n\nexport interface MailFolderTreeProps {\n nodes: MailFolderNode[]\n /** Selected folder ids. */\n selected: string[]\n onChange: (selected: string[]) => void\n /** Selecting a folder includes its subfolders (default). Descendants show checked + locked. */\n cascade?: boolean\n /** Bump to open every node. */\n expandAllNonce?: number\n /** Bump to close every node. */\n collapseAllNonce?: number\n labels?: Partial<MailFolderTreeLabels>\n testIds?: Partial<MailFolderTreeTestIds>\n className?: string\n}\n\n/**\n * A mailbox's folders / labels as an expandable checkbox tree. Build `nodes` with\n * `buildMailFolderTree`. With `cascade` only the top-most selected folder is stored; the server\n * expands it at sync time so new subfolders are picked up too.\n */\nexport function MailFolderTree({\n nodes,\n selected,\n onChange,\n cascade = true,\n expandAllNonce = 0,\n collapseAllNonce = 0,\n labels,\n testIds,\n className,\n}: MailFolderTreeProps) {\n const l = { ...DEFAULT_MAIL_FOLDER_TREE_LABELS, ...labels }\n return (\n <div className={cn('space-y-0.5', className)} data-slot=\"mail-folder-tree\">\n {nodes.map((n) => (\n <MailFolderRow\n labels={l}\n testIds={testIds}\n key={n.key}\n node={n}\n depth={0}\n selected={selected}\n onToggle={(node) => onChange(toggleMailFolder(selected, node, cascade))}\n ancestorSelected={false}\n cascade={cascade}\n expandAllNonce={expandAllNonce}\n collapseAllNonce={collapseAllNonce}\n />\n ))}\n </div>\n )\n}\n","import { Paperclip } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface MailMessagePreviewProps {\n participants: string\n subject: string\n preview?: string\n date: string\n dateTime?: string\n unread?: boolean\n hasAttachments?: boolean\n /** Messages in the conversation; shown when more than one. */\n count?: number\n /** A sent message's delivery problem; sent and delivered mail shows nothing, as in other clients. */\n deliveryProblem?: MailDeliveryProblem\n}\n\nexport type MailDeliveryProblem = 'bounced' | 'partially_bounced' | 'delayed'\n\nconst DELIVERY_BADGE: Record<MailDeliveryProblem, { label: string; title: string; tone: string }> =\n {\n bounced: {\n label: 'Bounced',\n title: \"Not delivered: the recipient's mail server sent this message back.\",\n tone: 'bg-destructive/10 text-destructive',\n },\n partially_bounced: {\n label: 'Partly bounced',\n title: 'Some recipients did not get this message. Open it to see who.',\n tone: 'bg-destructive/10 text-destructive',\n },\n delayed: {\n label: 'Delayed',\n title: \"Delivery is delayed; the recipient's server will keep retrying.\",\n tone: 'bg-muted text-muted-foreground',\n },\n }\n\n/** A pill for a sent message that bounced, partly bounced, or is delayed. */\nexport function MailDeliveryBadge({\n problem,\n className,\n}: {\n problem: MailDeliveryProblem\n className?: string\n}) {\n const badge = DELIVERY_BADGE[problem]\n return (\n <span\n className={cn('shrink-0 rounded-full px-2 py-0.5 text-xs font-medium', badge.tone, className)}\n title={badge.title}\n data-testid=\"mail-delivery-badge\"\n >\n {badge.label}\n </span>\n )\n}\n\n/** Compact inbox identity: sender/date, subject, then a body preview. */\nexport function MailMessagePreview({\n participants,\n subject,\n preview,\n date,\n dateTime,\n unread,\n hasAttachments,\n count,\n deliveryProblem,\n}: MailMessagePreviewProps) {\n return (\n <div className=\"flex h-full w-full min-w-0 flex-col justify-center gap-0.5 text-sm leading-5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className={cn('min-w-0 flex-1 truncate', unread && 'font-semibold')}>\n {participants}\n </span>\n {count !== undefined && count > 1 && (\n <span\n className=\"shrink-0 text-xs font-normal text-muted-foreground\"\n aria-label={`${count} messages`}\n data-testid=\"mail-conversation-count\"\n >\n {count}\n </span>\n )}\n {hasAttachments && (\n <Paperclip\n className=\"size-3.5 shrink-0 text-muted-foreground\"\n aria-label=\"Has attachments\"\n />\n )}\n {deliveryProblem && <MailDeliveryBadge problem={deliveryProblem} />}\n <time dateTime={dateTime} className=\"shrink-0 text-xs font-normal text-muted-foreground\">\n {date}\n </time>\n </div>\n <div className={cn('truncate', unread && 'font-semibold')}>{subject || '(No subject)'}</div>\n <div className=\"truncate font-normal text-muted-foreground\">{preview || '\\u00a0'}</div>\n </div>\n )\n}\n","import type { MouseEvent } from 'react'\nimport { Flag } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface MailFlagButtonProps {\n flagged: boolean\n onToggle: () => void\n disabled?: boolean\n /** Why it is disabled (e.g. offline with no device storage). */\n title?: string\n /**\n * A list row's marker: shown when flagged, else only while the row is hovered or focused (and\n * always, faintly, on touch, where there is no hover). Default: always shown (a toolbar button).\n */\n reveal?: boolean\n className?: string\n}\n\n/** The Flag as a one-click on/off toggle (`aria-pressed`), in a toolbar or on a list row. */\nexport function MailFlagButton({\n flagged,\n onToggle,\n disabled,\n title,\n reveal = false,\n className,\n}: MailFlagButtonProps) {\n return (\n <button\n type=\"button\"\n aria-label=\"Flag\"\n aria-pressed={flagged}\n title={title ?? (flagged ? 'Unflag' : 'Flag')}\n // aria-disabled, not disabled: a disabled button shows no tooltip, and the tooltip says why.\n aria-disabled={disabled || undefined}\n data-testid=\"mail-flag-button\"\n onClick={(event: MouseEvent) => {\n // On a list row: toggles the flag without opening the conversation.\n event.stopPropagation()\n if (!disabled) onToggle()\n }}\n className={cn(\n 'inline-flex size-8 shrink-0 items-center justify-center rounded text-muted-foreground transition-opacity hover:bg-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring aria-disabled:cursor-not-allowed aria-disabled:opacity-50 pointer-coarse:size-11',\n flagged && 'text-yellow-text hover:text-yellow-text',\n reveal &&\n !flagged &&\n 'opacity-0 focus-visible:opacity-100 pointer-coarse:opacity-60 [.ag-row-focus_&]:opacity-100 [.ag-row-hover_&]:opacity-100',\n className\n )}\n >\n <Flag className={cn('size-4', flagged && 'fill-current')} aria-hidden=\"true\" />\n </button>\n )\n}\n","/** Pure helpers for writing mail: an empty message, recipient parsing, replies and forwards. */\n\nimport type {\n MailAccount,\n MailAddress,\n MailAttachment,\n MailCompose,\n MailMessage,\n} from '@arbidocs/react'\n\nexport const emptyMailCompose = (): MailCompose => ({\n to: [],\n cc: [],\n bcc: [],\n subject: '',\n text: '',\n attachments: [],\n})\n\n/** A person as shown: the name on the message, else the address. */\nexport const mailAddressLabel = (person: MailAddress): string => person.name || person.email\n\n/**\n * Typed or pasted recipients (`a@x.org; Pat <pat@y.org>`), separated by commas, semicolons or\n * lines, deduplicated by address.\n */\nexport function parseMailRecipients(value: string): MailAddress[] {\n const addresses = (value.match(/(?:[^,;\"\\n]|\"[^\"]*\")+/g) ?? [])\n .map((entry) => entry.trim())\n .filter(Boolean)\n .map((entry) => {\n const named = entry.match(/^(.*?)\\s*<([^<>]+)>$/)\n return named\n ? { email: named[2].trim(), name: named[1].trim().replace(/^\"|\"$/g, '') }\n : { email: entry }\n })\n return addresses.filter(\n (address, index) =>\n addresses.findIndex((item) => item.email.toLowerCase() === address.email.toLowerCase()) ===\n index\n )\n}\n\n/** A reply (to the sender, or everyone with `all`) or a forward of `message`. */\nexport function replyMailCompose(\n message: MailMessage,\n {\n account,\n folderRole,\n forward = false,\n all = false,\n attachments = [],\n }: {\n account: MailAccount\n /** The folder the message is in: replying from Sent goes to its recipients. */\n folderRole: string\n forward?: boolean\n all?: boolean\n /** A forward's attachments, with their content. */\n attachments?: MailAttachment[]\n }\n): MailCompose {\n return {\n ...emptyMailCompose(),\n to: forward ? [] : folderRole === 'sent' ? message.to : message.sender,\n cc: all\n ? [...message.to, ...message.cc]\n .filter(\n (r) =>\n r.email.toLowerCase() !== account.email.toLowerCase() &&\n !message.sender.some((s) => s.email.toLowerCase() === r.email.toLowerCase())\n )\n .filter(\n (r, i, values) =>\n values.findIndex((v) => v.email.toLowerCase() === r.email.toLowerCase()) === i\n )\n : [],\n subject: `${forward ? 'Fwd' : 'Re'}: ${message.subject.replace(/^(Re|Fwd):\\s*/i, '')}`,\n text: `\\n\\n${message.sender.map((s) => s.email).join(', ')} wrote:\\n${message.text}`,\n in_reply_to: forward ? undefined : message.message_id,\n references: [...message.references, ...(message.message_id ? [message.message_id] : [])],\n attachments,\n secure_delivery: message.secure_delivery,\n }\n}\n\n/** A saved draft, reopened for editing (`attachments` with their content). */\nexport function draftMailCompose(message: MailMessage, attachments: MailAttachment[]): MailCompose {\n return {\n to: message.to,\n cc: message.cc,\n bcc: message.bcc,\n subject: message.subject,\n text: message.text,\n html: message.html,\n attachments,\n draft_id: message.id,\n secure_delivery: message.secure_delivery,\n }\n}\n\n/** Whether a message carries a calendar invite (an .ics part). */\nexport const hasCalendarPart = (attachments: MailAttachment[]): boolean =>\n attachments.some(\n (a) => /^text\\/calendar\\b|^application\\/ics\\b/i.test(a.content_type) || /\\.ics$/i.test(a.name)\n )\n","import { useMemo } from 'react'\nimport type { ColDef, GridState } from 'ag-grid-community'\nimport { Mail } from 'lucide-react'\nimport type { MailAddress, MailConversation, MailMessage } from '@arbidocs/react'\nimport { GridView } from '../../files/GridView'\nimport { MailFlagButton } from './MailFlagButton'\nimport { MailMessagePreview, type MailDeliveryProblem } from './MailMessagePreview'\nimport { mailAddressLabel } from './mailCompose'\n\n/** The grid id the conversation list keeps its column state under. */\nexport const MAIL_GRID_ID = 'personal-mail-grid-v3'\n\n/** The list shows only delivery problems; sent and delivered mail stays quiet. */\nfunction deliveryProblem(status: MailMessage['delivery_status']): MailDeliveryProblem | undefined {\n return status === 'bounced' || status === 'partially_bounced' || status === 'delayed'\n ? status\n : undefined\n}\n\n/** Everyone a conversation's messages went to, each once (for Sent, Drafts and the Outbox). */\nfunction recipients(conversation: MailConversation): MailAddress[] {\n const seen = new Map<string, MailAddress>()\n for (const m of [...conversation.messages].reverse())\n for (const p of m.to) if (!seen.has(p.email.toLowerCase())) seen.set(p.email.toLowerCase(), p)\n return [...seen.values()]\n}\n\nexport interface MailGridProps {\n conversations: MailConversation[]\n loading: boolean\n /** The open conversation's `thread_id`. */\n selected: string | null\n /** Sent, Drafts or Outbox: rows show recipients instead of the senders. */\n outgoing?: boolean\n onSelect: (threadId: string) => void\n /** Flag or unflag a conversation from its row. */\n onToggleFlag: (conversation: MailConversation) => void\n /** Flagging can't run right now (offline without device storage): the row's flag says why. */\n flagDisabledReason?: string\n /** How a person is named (default: the name on the message, else the address). */\n personLabel?: (person: MailAddress) => string\n /** Column state to restore at mount, and where to persist changes (both optional). */\n gridState?: GridState\n onGridStateChange?: (state: GridState) => void\n}\n\n/**\n * A folder's conversations: one row each, with an unread dot, the people in it, how many\n * messages, subject and preview, and the Flag (a toggle, shown when flagged, else on hover or\n * focus).\n */\nexport function MailGrid({\n conversations,\n loading,\n selected,\n onSelect,\n onToggleFlag,\n flagDisabledReason,\n outgoing = false,\n personLabel = mailAddressLabel,\n gridState,\n onGridStateChange,\n}: MailGridProps) {\n const columns = useMemo<ColDef<MailConversation>[]>(\n () => [\n {\n colId: 'unread',\n cellStyle: { padding: 0, justifyContent: 'center' },\n headerName: '',\n width: 30,\n minWidth: 30,\n maxWidth: 30,\n sortable: false,\n resizable: false,\n cellRenderer: ({ data }: { data?: MailConversation }) =>\n data?.unread_count ? (\n <span className=\"inline-block size-2 rounded-full bg-primary\" aria-label=\"Unread\" />\n ) : null,\n },\n {\n colId: 'message',\n cellClass:\n '[&_.ag-cell-value]:h-full [&_.ag-cell-value]:w-full [&_.ag-cell-wrapper]:h-full [&_.ag-cell-wrapper]:w-full',\n headerName: 'Message',\n flex: 1,\n minWidth: 200,\n sortable: false,\n valueGetter: (p) => p.data?.subject ?? '',\n cellRenderer: ({ data }: { data?: MailConversation }) =>\n data ? (\n <MailMessagePreview\n participants={(outgoing ? recipients(data) : data.senders)\n .map(personLabel)\n .join(', ')}\n subject={data.subject}\n preview={data.preview}\n unread={data.unread_count > 0}\n count={data.message_count}\n hasAttachments={data.messages.some((m) => m.attachments.length > 0)}\n deliveryProblem={deliveryProblem(data.messages[0]?.delivery_status)}\n dateTime={data.received_at ?? undefined}\n date={\n data.received_at\n ? new Date(data.received_at).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n : ''\n }\n />\n ) : null,\n },\n {\n colId: 'flag',\n cellStyle: { padding: 0, justifyContent: 'center' },\n headerName: '',\n width: 44,\n minWidth: 44,\n maxWidth: 44,\n sortable: false,\n resizable: false,\n cellRenderer: ({ data }: { data?: MailConversation }) =>\n data && !data.thread_id.startsWith('local-draft:') ? (\n <MailFlagButton\n reveal\n flagged={data.flagged}\n onToggle={() => onToggleFlag(data)}\n disabled={!!flagDisabledReason}\n title={flagDisabledReason}\n />\n ) : null,\n },\n ],\n [outgoing, personLabel, onToggleFlag, flagDisabledReason]\n )\n return (\n <GridView<MailConversation>\n items={conversations}\n columnDefs={columns}\n getItemId={(c) => c.thread_id}\n onRowClick={(c) => onSelect(c.thread_id)}\n height=\"100%\"\n rowHeight={84}\n persistState={Boolean(onGridStateChange)}\n gridId={MAIL_GRID_ID}\n gridState={gridState}\n onGridStateChange={onGridStateChange}\n testId=\"mail-grid\"\n isLoading={loading}\n getRowTestId={(c) => `mail-row-${c.thread_id}`}\n emptyState={{\n icon: <Mail className=\"size-10 text-muted-foreground/50\" />,\n title: 'No messages',\n message: 'Messages in this folder will appear here.',\n }}\n gridOptions={{\n headerHeight: 0,\n suppressCellFocus: false,\n onCellKeyDown: (event) => {\n const key = (event.event as KeyboardEvent)?.key\n if (!event.data) return\n // On the flag cell, Enter or Space toggles the flag; anywhere else, Enter opens.\n if (\n 'column' in event &&\n event.column.getColId() === 'flag' &&\n (key === 'Enter' || key === ' ')\n ) {\n ;(event.event as KeyboardEvent).preventDefault()\n if (!flagDisabledReason) onToggleFlag(event.data)\n } else if (key === 'Enter') onSelect(event.data.thread_id)\n },\n defaultColDef: {\n sortable: true,\n resizable: true,\n filter: false,\n },\n rowClassRules: { 'bg-muted/60': (p) => p.data?.thread_id === selected },\n }}\n />\n )\n}\n","import {\n Archive,\n ArrowLeft,\n Download,\n Ellipsis,\n FolderInput,\n Forward,\n MailOpen,\n Pencil,\n Printer,\n Reply,\n ReplyAll,\n RotateCcw,\n Save,\n Sparkles,\n Trash2,\n} from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport type { MailFolder } from '@arbidocs/react'\nimport { MailFlagButton } from './MailFlagButton'\nimport { useAssistantCopy } from '@arbidocs/react/shell'\n\n/** Why an action that changes the mailbox on the server can't run right now. */\nexport const NEEDS_CONNECTION = 'Available when you are back online'\n\nexport interface MailActionBarProps {\n onBack: () => void\n /** A draft: \"Edit draft\" is the primary action, instead of replying. */\n onEditDraft?: () => void\n onReply?: () => void\n /** Offered only when the message has more than one other recipient. */\n onReplyAll?: () => void\n /** Ask ARBI to draft the reply. Absent: not offered. */\n onReplyWithArbi?: () => void\n onForward?: () => void\n onArchive?: () => void\n /** ARBI mail's Trash: put it back where it came from (shown instead of Archive). */\n onRestore?: () => void\n flagged: boolean\n onToggleFlag?: () => void\n onMarkUnread?: () => void\n /** Where \"Move to…\" can move it (the current folder and views like Flagged left out). */\n moveTargets?: MailFolder[]\n onMove?: (folderId: string) => void\n onSaveToWorkspace?: () => void\n onPrint?: () => void\n /** ARBI mail: the original `.eml`. */\n onDownloadOriginal?: () => void\n onDelete?: () => void\n /** \"Delete forever\" in ARBI mail's Trash (the host confirms); else \"Delete\" (to the Trash). */\n deletesForever?: boolean\n /** Changing the mailbox (flag, move, Trash, read state) can run now: online, or kept on the device. */\n canChange: boolean\n /** Reading the server (saving, downloading the original) can run now. */\n isOnline: boolean\n busy?: boolean\n}\n\n/**\n * An open message's or conversation's actions. The everyday ones are always in view (Reply, Reply\n * all, Archive, and the Flag as a one-click toggle); the rarer ones wait behind \"…\".\n */\nexport function MailActionBar({\n onBack,\n onEditDraft,\n onReply,\n onReplyAll,\n onReplyWithArbi,\n onForward,\n onArchive,\n onRestore,\n flagged,\n onToggleFlag,\n onMarkUnread,\n moveTargets = [],\n onMove,\n onSaveToWorkspace,\n onPrint,\n onDownloadOriginal,\n onDelete,\n deletesForever = false,\n canChange,\n isOnline,\n busy,\n}: MailActionBarProps) {\n const assistant = useAssistantCopy()\n const changeTitle = canChange ? undefined : NEEDS_CONNECTION\n const onlineTitle = isOnline ? undefined : NEEDS_CONNECTION\n return (\n <div\n data-testid=\"mail-action-bar\"\n className=\"@container sticky top-0 z-10 -mx-4 mb-4 border-b bg-background px-2 py-1.5 sm:-mx-5 sm:px-3\"\n >\n {/* One row at any width: the labels beside Reply give way to their icons as it narrows. */}\n <div className=\"flex flex-nowrap items-center gap-1 [&>button]:h-8 [&>button]:shrink-0 [&>button]:px-2 [&>button]:text-xs pointer-coarse:[&>button]:h-11\">\n <Button variant=\"ghost\" aria-label=\"Back\" onClick={onBack}>\n <ArrowLeft className=\"size-4\" />\n </Button>\n {onEditDraft ? (\n <Button onClick={onEditDraft}>\n <Pencil className=\"mr-1.5 size-4\" />\n Edit draft\n </Button>\n ) : (\n <>\n {onReply && (\n <Button variant=\"ghost\" onClick={onReply}>\n <Reply className=\"mr-1.5 size-4\" />\n Reply\n </Button>\n )}\n {onReplyAll && (\n <Button variant=\"ghost\" aria-label=\"Reply all\" title=\"Reply all\" onClick={onReplyAll}>\n <ReplyAll className=\"size-4 @md:mr-1.5\" />\n <span className=\"hidden @md:inline\">Reply all</span>\n </Button>\n )}\n {onReplyWithArbi && (\n <Button\n variant=\"ghost\"\n aria-label={assistant.replyWith}\n title={assistant.replyWith}\n onClick={onReplyWithArbi}\n >\n <Sparkles className=\"size-4 @xl:mr-1.5\" />\n <span className=\"hidden @xl:inline\">{assistant.replyWith}</span>\n </Button>\n )}\n </>\n )}\n {onRestore ? (\n <Button\n variant=\"ghost\"\n disabled={!canChange || busy}\n title={changeTitle}\n onClick={onRestore}\n data-testid=\"mail-restore-button\"\n >\n <RotateCcw className=\"mr-1.5 size-4\" />\n Restore\n </Button>\n ) : (\n onArchive && (\n <Button\n variant=\"ghost\"\n aria-label=\"Archive\"\n disabled={!canChange || busy}\n title={changeTitle ?? 'Archive'}\n onClick={onArchive}\n data-testid=\"mail-archive-button\"\n >\n <Archive className=\"size-4 @md:mr-1.5\" />\n <span className=\"hidden @md:inline\">Archive</span>\n </Button>\n )\n )}\n {onToggleFlag && (\n <MailFlagButton\n flagged={flagged}\n onToggle={onToggleFlag}\n disabled={!canChange || busy}\n title={changeTitle}\n />\n )}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" aria-label=\"More actions\" data-testid=\"mail-more-button\">\n <Ellipsis className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n {onForward && (\n <DropdownMenuItem onSelect={onForward}>\n <Forward className=\"mr-2 size-4\" />\n Forward\n </DropdownMenuItem>\n )}\n {onMarkUnread && (\n <DropdownMenuItem disabled={!canChange} title={changeTitle} onSelect={onMarkUnread}>\n <MailOpen className=\"mr-2 size-4\" />\n Mark unread\n </DropdownMenuItem>\n )}\n {onMove && moveTargets.length > 0 && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger disabled={!canChange} data-testid=\"mail-move-menu\">\n <FolderInput className=\"mr-2 size-4\" />\n Move to…\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"max-h-80 overflow-auto\">\n {moveTargets.map((folder) => (\n <DropdownMenuItem key={folder.id} onSelect={() => onMove(folder.id)}>\n {folder.name}\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n {onSaveToWorkspace && (\n <DropdownMenuItem\n disabled={!isOnline || busy}\n title={onlineTitle}\n onSelect={onSaveToWorkspace}\n >\n <Save className=\"mr-2 size-4\" />\n Save to workspace\n </DropdownMenuItem>\n )}\n {onPrint && (\n <DropdownMenuItem onSelect={onPrint}>\n <Printer className=\"mr-2 size-4\" />\n Print\n </DropdownMenuItem>\n )}\n {onDownloadOriginal && (\n <DropdownMenuItem\n disabled={!isOnline}\n title={onlineTitle}\n onSelect={onDownloadOriginal}\n >\n <Download className=\"mr-2 size-4\" />\n Download original (.eml)\n </DropdownMenuItem>\n )}\n {onDelete && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n disabled={!canChange || busy}\n title={changeTitle}\n onSelect={onDelete}\n className=\"text-destructive focus:text-destructive\"\n data-testid={deletesForever ? 'mail-delete-forever-button' : 'mail-delete-button'}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {deletesForever ? 'Delete forever' : 'Delete'}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n )\n}\n","import { AlertCircle, CheckCircle2, Clock, Send } from 'lucide-react'\nimport type { MailDeliveryRecipient } from '@arbidocs/react'\nimport { cn } from '@arbidocs/react/ui'\n\nconst ICONS: Record<MailDeliveryRecipient['status'], typeof Send> = {\n accepted: Send,\n relayed: Send,\n expanded: Send,\n delivered: CheckCircle2,\n delayed: Clock,\n rejected: AlertCircle,\n failed: AlertCircle,\n}\n\nconst LABELS: Record<MailDeliveryRecipient['status'], string> = {\n accepted: 'Sent',\n relayed: 'Sent',\n expanded: 'Sent',\n delivered: 'Delivered',\n delayed: 'Delayed',\n rejected: 'Not delivered',\n failed: 'Not delivered',\n}\n\n/**\n * Where a sent message got to, per recipient: the relay's answer and any delivery reports that came\n * back, in plain words. Shown on sent native mail only.\n */\nexport function MailDeliveryList({\n recipients,\n}: {\n recipients: MailDeliveryRecipient[]\n}): React.ReactElement | null {\n if (recipients.length === 0) return null\n return (\n <section\n aria-label=\"Delivery\"\n className=\"mb-5 rounded-md border border-border/60 px-3 py-2\"\n data-testid=\"mail-delivery-list\"\n >\n <h3 className=\"mb-1 text-xs font-medium text-muted-foreground\">Delivery</h3>\n <ul className=\"space-y-1\">\n {recipients.map((recipient) => {\n const Icon = ICONS[recipient.status]\n const failed = recipient.status === 'failed' || recipient.status === 'rejected'\n return (\n <li\n key={recipient.email}\n className=\"flex flex-wrap items-baseline gap-x-2 text-sm\"\n data-testid={`mail-delivery-${recipient.email}`}\n >\n <Icon\n aria-hidden=\"true\"\n className={cn(\n 'size-3.5 shrink-0 self-center',\n failed ? 'text-destructive' : 'text-muted-foreground'\n )}\n />\n <span className=\"font-medium\">{recipient.email}</span>\n <span className={cn(failed ? 'text-destructive' : 'text-muted-foreground')}>\n {LABELS[recipient.status]}: {recipient.description}\n </span>\n </li>\n )\n })}\n </ul>\n </section>\n )\n}\n","import type { KeyboardEvent, ReactNode } from 'react'\nimport DOMPurify from 'dompurify'\nimport { Paperclip } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport type { MailAddress, MailAttachment, MailMessage } from '@arbidocs/react'\nimport { MailDeliveryList } from './MailDeliveryList'\nimport { MailDeliveryBadge } from './MailMessagePreview'\nimport { hasCalendarPart, mailAddressLabel } from './mailCompose'\n\nexport interface MailMessageContentProps {\n message: MailMessage\n onDownloadAttachment: (attachment: MailAttachment) => void\n /** How a person is named (default: the name on the message, else the address). */\n personLabel?: (person: MailAddress) => string\n /** A calendar invite card, for a message that carries an .ics part. */\n renderInvite?: () => ReactNode\n /** Clicking who it is from (a conversation collapses the message). Absent: not clickable. */\n onHeaderClick?: () => void\n}\n\nconst SANITIZE = {\n ALLOWED_TAGS: [\n 'p',\n 'br',\n 'strong',\n 'b',\n 'em',\n 'i',\n 'u',\n 's',\n 'ul',\n 'ol',\n 'li',\n 'a',\n 'span',\n 'blockquote',\n ],\n ALLOWED_ATTR: ['href'],\n ALLOW_DATA_ATTR: false,\n}\n\n/** One message as read: who it is from and to, delivery, an invitation, attachments and the body. */\nexport function MailMessageContent({\n message,\n onDownloadAttachment,\n personLabel = mailAddressLabel,\n renderInvite,\n onHeaderClick,\n}: MailMessageContentProps) {\n return (\n <>\n <div\n className={cn(\n 'mb-5 flex gap-3 border-b border-border/60 pb-4',\n onHeaderClick && 'cursor-pointer'\n )}\n {...(onHeaderClick && {\n role: 'button',\n tabIndex: 0,\n 'aria-expanded': true,\n onClick: onHeaderClick,\n onKeyDown: (event: KeyboardEvent) => {\n if (event.key !== 'Enter' && event.key !== ' ') return\n event.preventDefault()\n onHeaderClick()\n },\n })}\n >\n <span\n aria-hidden=\"true\"\n className=\"flex size-10 shrink-0 items-center justify-center rounded-full bg-primary/10 text-sm font-semibold text-primary\"\n >\n {(message.sender[0]?.name || message.sender[0]?.email || '?')\n .split(/\\s+/)\n .slice(0, 2)\n .map((part) => part[0])\n .join('')\n .toUpperCase()}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-1\">\n <p className=\"flex flex-wrap items-center gap-2 text-sm font-semibold\">\n {message.sender.map((person) => person.name || person.email).join(', ')}\n {(message.delivery_status === 'bounced' ||\n message.delivery_status === 'partially_bounced' ||\n message.delivery_status === 'delayed') && (\n <MailDeliveryBadge problem={message.delivery_status} />\n )}\n </p>\n <time className=\"text-[11px] text-muted-foreground\">\n {message.received_at ? new Date(message.received_at).toLocaleString() : ''}\n </time>\n </div>\n <p className=\"break-all text-xs text-muted-foreground\">\n {message.sender.map((person) => person.email).join(', ')}\n </p>\n <p className=\"mt-2 break-all text-xs text-muted-foreground\">\n To: {message.to.map(personLabel).join(', ')}\n {message.cc.length > 0 && ` · Cc: ${message.cc.map(personLabel).join(', ')}`}\n </p>\n </div>\n </div>\n <MailDeliveryList recipients={message.delivery ?? []} />\n {renderInvite && hasCalendarPart(message.attachments) && renderInvite()}\n <div className=\"mb-4 flex flex-wrap gap-2\">\n {message.attachments.map((a) => (\n <Button\n key={a.id}\n className=\"h-auto min-h-12 justify-start rounded-md border-border/70 bg-muted/20 px-3 py-2 text-left shadow-none hover:bg-muted/60\"\n variant=\"outline\"\n onClick={() => onDownloadAttachment(a)}\n >\n <Paperclip className=\"mr-2 size-4\" />\n <span className=\"min-w-0\">\n <span className=\"block truncate text-xs font-medium\">{a.name}</span>\n <span\n aria-hidden=\"true\"\n className=\"block text-[11px] font-normal text-muted-foreground\"\n >\n {a.size < 1024 ? `${a.size} B` : `${Math.ceil(a.size / 1024)} KB`}\n </span>\n </span>\n </Button>\n ))}\n </div>\n {message.html && message.text ? (\n <div\n data-testid=\"mail-message-body\"\n className=\"text-sm leading-7 [&_p]:mb-3 [&_ul]:list-disc [&_ul]:pl-6 [&_ol]:list-decimal [&_ol]:pl-6 [&_a]:text-primary [&_a]:underline\"\n dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(message.html, SANITIZE) }}\n />\n ) : message.text ? (\n <pre\n data-testid=\"mail-message-body\"\n className=\"whitespace-pre-wrap break-words font-sans text-sm leading-7 text-foreground/90\"\n >\n {message.text.split(/(https?:\\/\\/[^\\s]+)/g).map((part, index) =>\n /^https?:\\/\\//.test(part) ? (\n <a\n key={index}\n href={part}\n className=\"text-primary underline underline-offset-2\"\n rel=\"noreferrer\"\n >\n {part}\n </a>\n ) : (\n part\n )\n )}\n </pre>\n ) : message.html ? (\n <iframe\n title=\"Email body\"\n sandbox=\"\"\n referrerPolicy=\"no-referrer\"\n className=\"min-h-96 w-full border-0 bg-white\"\n srcDoc={`<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; img-src data:; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'\">${message.html}`}\n />\n ) : (\n <p className=\"text-muted-foreground\">Empty message</p>\n )}\n </>\n )\n}\n","import DOMPurify from 'dompurify'\nimport type { MailMessage } from '@arbidocs/react'\n\nconst escape = (value: string) =>\n value.replace(\n /[&<>\"']/g,\n (c) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[c]!\n )\n\nconst people = (list: MailMessage['to']) =>\n list.map((p) => (p.name ? `${p.name} <${p.email}>` : p.email)).join(', ')\n\n/** The printable page of a conversation: each message's headers and body, text only, no scripts. */\nexport function mailPrintHtml(subject: string, messages: MailMessage[]): string {\n const body = messages\n .map((m) => {\n const content = m.text\n ? `<pre>${escape(m.text)}</pre>`\n : DOMPurify.sanitize(m.html ?? '', {\n FORBID_TAGS: ['img', 'style'],\n FORBID_ATTR: ['style'],\n })\n return `<section><p><b>${escape(people(m.sender))}</b><br>To: ${escape(people(m.to))}${\n m.cc.length ? `<br>Cc: ${escape(people(m.cc))}` : ''\n }<br>${escape(m.received_at ? new Date(m.received_at).toLocaleString() : '')}</p>${content}</section>`\n })\n .join('<hr>')\n return `<!doctype html><meta charset=\"utf-8\"><title>${escape(subject)}</title><style>body{font:14px/1.5 system-ui,sans-serif;margin:24px}pre{white-space:pre-wrap;font:inherit}hr{border:0;border-top:1px solid #ccc;margin:24px 0}</style><h1>${escape(subject || '(No subject)')}</h1>${body}`\n}\n\n/** Print a conversation from a hidden frame, so the app around it is not printed. */\nexport function printMail(subject: string, messages: MailMessage[]): void {\n const frame = document.createElement('iframe')\n frame.setAttribute('aria-hidden', 'true')\n frame.style.cssText = 'position:fixed;width:0;height:0;border:0;opacity:0'\n // No scripts: the page is sanitized markup; printing it needs only same-origin access and modals.\n frame.setAttribute('sandbox', 'allow-same-origin allow-modals')\n frame.srcdoc = mailPrintHtml(subject, messages)\n frame.onload = () => {\n frame.contentWindow?.print()\n setTimeout(() => frame.remove(), 1000)\n }\n document.body.appendChild(frame)\n}\n","import type { MailFolder } from '@arbidocs/react'\n\n/** The folders a message can be moved to: real folders other than the one it is in. */\nexport function mailMoveTargets(\n folders: MailFolder[] | undefined,\n folderRole: string,\n folderId?: string\n) {\n return (folders ?? []).filter(\n (f) =>\n f.id !== folderId &&\n (!f.role || f.role !== folderRole) &&\n f.role !== 'flagged' &&\n !f.id.startsWith('device:')\n )\n}\n","import type { ReactNode } from 'react'\nimport type {\n MailAccount,\n MailAddress,\n MailAttachment,\n MailFolder,\n MailMessage,\n MailMessageUpdate,\n} from '@arbidocs/react'\nimport { MailActionBar } from './MailActionBar'\nimport { MailMessageContent } from './MailMessageContent'\nimport { printMail } from './printMail'\nimport { mailMoveTargets } from './moveTargets'\n\nexport interface MailMessageViewProps {\n account: MailAccount\n message: MailMessage\n folderRole: string\n folders: MailFolder[] | undefined\n isOnline: boolean\n /**\n * Flagging, marking, moving, Trash and delete forever can be done offline: they wait on the\n * device and apply on reconnect. Default: they need a connection.\n */\n changesWaitOffline?: boolean\n loading: boolean\n uploadPending?: boolean\n onBack: () => void\n onEditDraft: () => void\n onReply: (forward?: boolean, all?: boolean) => void\n /** Ask ARBI to draft the reply (in a chat beside it). Absent: not offered. */\n onReplyWithArbi?: () => void\n onUpdate: (body: MailMessageUpdate) => void\n onDownloadAttachment: (attachment: MailAttachment) => void\n onDownloadOriginal: () => void\n /** Native mail: save the email to a workspace. Absent: not offered. */\n onSaveToWorkspace?: () => void\n /** How a person is named (default: the name on the message, else the address). */\n personLabel?: (person: MailAddress) => string\n /** A calendar invite card, for a message that carries an .ics part. */\n renderInvite?: () => ReactNode\n /** In the Trash (ARBI mail): put it back in the folder it was trashed from. Absent: \"Move to…\". */\n onRestore?: () => void\n /** In the Trash (ARBI mail): delete it for good (the host confirms). Absent: \"Delete\" trashes it. */\n onDeleteForever?: () => void\n}\n\n/** An opened message on its own: its actions, then the message as read. */\nexport function MailMessageView({\n account,\n message,\n folderRole,\n folders,\n isOnline,\n changesWaitOffline = false,\n loading,\n uploadPending,\n onBack,\n onEditDraft,\n onReply,\n onReplyWithArbi,\n onUpdate,\n onDownloadAttachment,\n onDownloadOriginal,\n onSaveToWorkspace,\n personLabel,\n renderInvite,\n onRestore,\n onDeleteForever,\n}: MailMessageViewProps) {\n const archive = folders?.find((f) => f.role === 'archive')?.id ?? 'archive'\n return (\n <article className=\"min-w-0 flex-1 overflow-auto px-4 pb-4 sm:px-5 sm:pb-5\">\n <MailActionBar\n onBack={onBack}\n onEditDraft={folderRole === 'drafts' ? onEditDraft : undefined}\n onReply={() => onReply()}\n onReplyAll={\n message.to.length + message.cc.length > 1 ? () => onReply(false, true) : undefined\n }\n onReplyWithArbi={onReplyWithArbi}\n onForward={() => onReply(true)}\n onArchive={folderRole === 'archive' ? undefined : () => onUpdate({ folder_id: archive })}\n onRestore={folderRole === 'trash' ? onRestore : undefined}\n flagged={!!message.flagged}\n onToggleFlag={() => onUpdate({ flagged: !message.flagged })}\n onMarkUnread={message.unread ? undefined : () => onUpdate({ unread: true })}\n moveTargets={mailMoveTargets(folders, folderRole)}\n onMove={(folderId) => onUpdate({ folder_id: folderId })}\n onSaveToWorkspace={onSaveToWorkspace}\n onPrint={() => printMail(message.subject, [message])}\n onDownloadOriginal={account.provider === 'native' ? onDownloadOriginal : undefined}\n onDelete={\n folderRole === 'trash' && onDeleteForever\n ? onDeleteForever\n : folderRole === 'trash'\n ? undefined\n : () => onUpdate({ action: 'trash' })\n }\n deletesForever={folderRole === 'trash' && !!onDeleteForever}\n canChange={isOnline || changesWaitOffline}\n isOnline={isOnline}\n busy={uploadPending}\n />\n {loading && <p className=\"text-muted-foreground\">Loading message…</p>}\n <h2 className=\"mb-4 text-xl font-semibold leading-snug tracking-tight\">\n {message.subject || '(No subject)'}\n </h2>\n <MailMessageContent\n message={message}\n onDownloadAttachment={onDownloadAttachment}\n personLabel={personLabel}\n renderInvite={renderInvite}\n />\n </article>\n )\n}\n","import { useState, type ReactNode } from 'react'\nimport { Flag } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport type { MailAddress, MailMessage } from '@arbidocs/react'\nimport { mailAddressLabel } from './mailCompose'\n\nexport interface MailConversationViewProps {\n subject: string\n /** The conversation's messages, oldest first. */\n messages: MailMessage[]\n /** Its actions (a `MailActionBar`), kept in view while the messages scroll. */\n actions: ReactNode\n /** An expanded message as read; `collapse` folds it back to its one-line summary. */\n renderMessage: (message: MailMessage, collapse: () => void) => ReactNode\n /** Something to say above the messages (still loading, or not saved on this device). */\n notice?: ReactNode\n personLabel?: (person: MailAddress) => string\n}\n\nconst shortDate = (value?: string | null) =>\n value\n ? new Date(value).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n : ''\n\n/**\n * An open conversation: its messages stacked oldest to newest, the newest (and any unread) open, the\n * others folded to one line that opens them.\n */\nexport function MailConversationView({\n subject,\n messages,\n actions,\n renderMessage,\n notice,\n personLabel = mailAddressLabel,\n}: MailConversationViewProps) {\n const newest = messages.at(-1)?.id\n // Open by default: the newest and the unread. `flipped` holds the ones the reader opened or folded.\n const [flipped, setFlipped] = useState<Set<string>>(() => new Set())\n // Unread when the conversation was opened: opening it marks them read, and they stay open.\n const [arrivedUnread, setArrivedUnread] = useState<Set<string>>(() => new Set())\n const unreadNow = messages.filter((m) => m.unread && !arrivedUnread.has(m.id))\n if (unreadNow.length) setArrivedUnread(new Set([...arrivedUnread, ...unreadNow.map((m) => m.id)]))\n const isOpen = (m: MailMessage) =>\n (arrivedUnread.has(m.id) || m.unread || m.id === newest) !== flipped.has(m.id)\n const toggle = (id: string) =>\n setFlipped((current) => {\n const next = new Set(current)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n return (\n <article\n data-testid=\"mail-conversation\"\n className=\"min-w-0 flex-1 overflow-auto px-4 pb-4 sm:px-5 sm:pb-5\"\n >\n {actions}\n <h2 className=\"mb-4 text-xl font-semibold leading-snug tracking-tight\">\n {subject || '(No subject)'}\n </h2>\n {notice}\n <ol className=\"flex flex-col gap-3\">\n {messages.map((message) => (\n <li\n key={message.id}\n data-testid={`mail-conversation-message-${message.id}`}\n className=\"rounded-lg border border-border/70 bg-background\"\n >\n {isOpen(message) ? (\n <div className=\"p-3 sm:p-4\">{renderMessage(message, () => toggle(message.id))}</div>\n ) : (\n <button\n type=\"button\"\n aria-expanded={false}\n onClick={() => toggle(message.id)}\n className=\"flex w-full min-w-0 items-center gap-3 rounded-lg px-3 py-2.5 text-left text-sm hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring sm:px-4\"\n >\n <span className={cn('w-36 shrink-0 truncate', message.unread && 'font-semibold')}>\n {message.sender.map(personLabel).join(', ') || '(No sender)'}\n </span>\n {message.folder === 'drafts' && (\n <span className=\"shrink-0 text-xs font-medium text-destructive\">Draft</span>\n )}\n <span className=\"min-w-0 flex-1 truncate text-muted-foreground\">\n {message.preview || ' '}\n </span>\n {message.flagged && (\n <Flag\n className=\"size-3.5 shrink-0 fill-current text-yellow-text\"\n aria-label=\"Flagged\"\n />\n )}\n <time\n dateTime={message.received_at ?? undefined}\n className=\"shrink-0 text-xs text-muted-foreground\"\n >\n {shortDate(message.received_at)}\n </time>\n </button>\n )}\n </li>\n ))}\n </ol>\n </article>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { FolderOpen } from 'lucide-react'\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\n\n/** A workspace document that can be attached to an email. */\nexport interface MailAttachableDocument {\n id: string\n title: string\n /** Its file-type icon. */\n icon?: ReactNode\n}\n\nexport interface MailDocumentPickerProps {\n documents: MailAttachableDocument[]\n onAttach: (document: MailAttachableDocument) => void\n disabled?: boolean\n}\n\n/** \"From workspace\": a searchable list of the workspace's documents, attached as their files. */\nexport function MailDocumentPicker({\n documents,\n onAttach,\n disabled = false,\n}: MailDocumentPickerProps): React.ReactElement {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase()\n return q ? documents.filter((d) => d.title.toLowerCase().includes(q)) : documents\n }, [documents, query])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={disabled}\n data-testid=\"mail-attach-workspace-document\"\n >\n <FolderOpen className=\"mr-2 size-4\" />\n From workspace\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80 p-0\" align=\"start\" sideOffset={4}>\n <Command shouldFilter={false}>\n <CommandInput placeholder=\"Search documents...\" value={query} onValueChange={setQuery} />\n <CommandList className=\"max-h-72\">\n <CommandEmpty>No documents in this workspace</CommandEmpty>\n <CommandGroup>\n {filtered.map((doc) => (\n <CommandItem\n key={doc.id}\n value={doc.id}\n onSelect={() => {\n setOpen(false)\n setQuery('')\n onAttach(doc)\n }}\n data-testid={`document-search-item-${doc.id}`}\n >\n {doc.icon && <span className=\"shrink-0 text-muted-foreground\">{doc.icon}</span>}\n <span className=\"ml-1.5 flex-1 truncate text-sm\">{doc.title}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","export interface MailBodyEditorProps {\n text: string\n html?: string\n disabled: boolean\n /** Every edit: the plain text and, from the rich editor, its HTML (`''` from this one). */\n onChange: (text: string, html: string) => void\n}\n\n/**\n * The message body as plain text: used when the rich editor (an optional peer, `lexical`) is not\n * installed or could not be loaded.\n */\nexport function PlainMailBodyEditor({ text, disabled, onChange }: MailBodyEditorProps) {\n return (\n <textarea\n aria-label=\"Message\"\n className=\"my-3 min-h-48 w-full resize-y bg-transparent text-sm outline-none\"\n value={text}\n disabled={disabled}\n onChange={(event) => onChange(event.target.value, '')}\n />\n )\n}\n"]}
|