@arbidocs/blocks 0.4.84 → 0.4.86
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/MailBodyEditor-5PIQLYVY.js +217 -0
- package/dist/MailBodyEditor-5PIQLYVY.js.map +1 -0
- package/dist/MailBodyEditor-D7MGJMLH.cjs +223 -0
- package/dist/MailBodyEditor-D7MGJMLH.cjs.map +1 -0
- package/dist/agents/index.cjs +282 -281
- package/dist/agents/index.js +7 -6
- package/dist/agents/workflows/StepBarFrame.d.ts +3 -1
- package/dist/agents/workflows/WorkflowRunner.d.ts +10 -1
- package/dist/agents/workflows/run.d.ts +24 -3
- package/dist/agents/workflows/stepWindow.d.ts +4 -2
- package/dist/agents/workflows/types.d.ts +5 -0
- package/dist/agents/workflows/useWorkflowView.d.ts +16 -1
- package/dist/chat/index.cjs +1 -1
- package/dist/chat/index.js +1 -1
- package/dist/chunk-3R6XBYL7.cjs +576 -0
- package/dist/chunk-3R6XBYL7.cjs.map +1 -0
- package/dist/{chunk-CKB64Z4R.js → chunk-4XJZ6AAY.js} +6 -245
- package/dist/chunk-4XJZ6AAY.js.map +1 -0
- package/dist/{chunk-B3WCKBJ7.cjs → chunk-5YXG342J.cjs} +6 -18
- package/dist/chunk-5YXG342J.cjs.map +1 -0
- package/dist/{chunk-SB5ZKOYN.js → chunk-7C35WXYB.js} +4 -63
- package/dist/chunk-7C35WXYB.js.map +1 -0
- package/dist/chunk-7RJTEWYM.js +362 -0
- package/dist/chunk-7RJTEWYM.js.map +1 -0
- package/dist/chunk-AFSOUS5X.cjs +253 -0
- package/dist/chunk-AFSOUS5X.cjs.map +1 -0
- package/dist/{chunk-F4RUCUXF.cjs → chunk-C2HRZSAT.cjs} +2 -63
- package/dist/chunk-C2HRZSAT.cjs.map +1 -0
- package/dist/{chunk-XA5S4776.cjs → chunk-IHYVK6F7.cjs} +52 -51
- package/dist/chunk-IHYVK6F7.cjs.map +1 -0
- package/dist/{chunk-CONIA2ZA.js → chunk-KHY4PYU7.js} +246 -146
- package/dist/chunk-KHY4PYU7.js.map +1 -0
- package/dist/chunk-LGX6UFYG.js +557 -0
- package/dist/chunk-LGX6UFYG.js.map +1 -0
- package/dist/chunk-O4YPVYPO.cjs +373 -0
- package/dist/chunk-O4YPVYPO.cjs.map +1 -0
- package/dist/chunk-R26OHONI.js +250 -0
- package/dist/chunk-R26OHONI.js.map +1 -0
- package/dist/{chunk-RYYYHPFU.cjs → chunk-RZUMQM7W.cjs} +246 -146
- package/dist/chunk-RZUMQM7W.cjs.map +1 -0
- package/dist/{chunk-RX35SMPR.js → chunk-S2NFD4QV.js} +8 -7
- package/dist/chunk-S2NFD4QV.js.map +1 -0
- package/dist/{chunk-YJQVLVBJ.cjs → chunk-S5HZBXZA.cjs} +2 -243
- package/dist/chunk-S5HZBXZA.cjs.map +1 -0
- package/dist/{chunk-GJV2G4FC.js → chunk-W7NZRZ54.js} +6 -18
- package/dist/chunk-W7NZRZ54.js.map +1 -0
- package/dist/{chunk-ZQYE7J3J.cjs → chunk-WRSBM6QN.cjs} +332 -94
- package/dist/chunk-WRSBM6QN.cjs.map +1 -0
- package/dist/{chunk-RSKSXEPW.js → chunk-X23U6QEJ.js} +324 -88
- package/dist/chunk-X23U6QEJ.js.map +1 -0
- package/dist/collaboration/index.cjs +100 -49
- package/dist/collaboration/index.js +4 -1
- package/dist/collaboration/mail/MailBodyEditor.d.ts +7 -0
- package/dist/collaboration/mail/MailDeliveryList.d.ts +8 -0
- package/dist/collaboration/mail/MailDocumentPicker.d.ts +15 -0
- package/dist/collaboration/mail/MailGrid.d.ts +17 -0
- package/dist/collaboration/mail/MailMessageView.d.ts +27 -0
- package/dist/collaboration/mail/PlainMailBodyEditor.d.ts +12 -0
- package/dist/collaboration/mail/index.d.ts +6 -0
- package/dist/collaboration/mail/mailCompose.d.ts +24 -0
- package/dist/connect/index.cjs +1673 -96
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +2 -1
- package/dist/connect/index.js +1634 -63
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/ConnectedSettings.d.ts +1 -4
- package/dist/connection/ConnectedTagTable.d.ts +32 -0
- package/dist/connection/mail/ConnectedMailAccounts.d.ts +21 -0
- package/dist/connection/mail/ConnectedMailComposer.d.ts +40 -0
- package/dist/connection/mail/ConnectedMailSetup.d.ts +16 -0
- package/dist/connection/mail/ConnectedMailbox.d.ts +65 -0
- package/dist/connection/mail/MailComposerForm.d.ts +25 -0
- package/dist/connection/mail/attachments.d.ts +13 -0
- package/dist/connection/mail/index.d.ts +6 -0
- package/dist/connection/mail/mailbox.d.ts +6 -0
- package/dist/connection/mail/types.d.ts +92 -0
- package/dist/connection/useConnectedWorkNotifications.d.ts +6 -0
- package/dist/connection/useWorkflowThread.d.ts +7 -2
- package/dist/facts/index.cjs +3 -3
- package/dist/facts/index.js +3 -3
- package/dist/files/index.cjs +48 -368
- package/dist/files/index.cjs.map +1 -1
- package/dist/files/index.js +11 -361
- package/dist/files/index.js.map +1 -1
- package/dist/home/index.cjs +1 -1
- package/dist/home/index.js +1 -1
- package/dist/index.cjs +496 -437
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +23 -20
- package/dist/index.js.map +1 -1
- package/dist/settings/PasswordChangeDialog.d.ts +9 -12
- package/dist/settings/index.cjs +44 -43
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.js +3 -2
- package/dist/settings/index.js.map +1 -1
- package/dist/shell/index.cjs +2 -2
- package/dist/shell/index.js +2 -2
- package/dist/studio/index.cjs +1 -1
- package/dist/studio/index.js +1 -1
- package/dist/tags/TagColumnsEditor.d.ts +34 -0
- package/dist/tags/TagDetail.d.ts +13 -11
- package/dist/tags/TagTable.d.ts +99 -0
- package/dist/tags/TagsNav.d.ts +2 -2
- package/dist/tags/index.d.ts +7 -5
- package/dist/tags/{tagMatrixDocx.d.ts → tagTableDocx.d.ts} +12 -12
- package/dist/tags/tagTableModel.d.ts +47 -0
- package/dist/workflow-canvas/index.cjs +50 -49
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/dist/workflow-canvas/index.js +7 -6
- package/dist/workflow-canvas/index.js.map +1 -1
- package/package.json +29 -4
- package/dist/chunk-B3WCKBJ7.cjs.map +0 -1
- package/dist/chunk-CKB64Z4R.js.map +0 -1
- package/dist/chunk-CONIA2ZA.js.map +0 -1
- package/dist/chunk-F4RUCUXF.cjs.map +0 -1
- package/dist/chunk-GJV2G4FC.js.map +0 -1
- package/dist/chunk-RSKSXEPW.js.map +0 -1
- package/dist/chunk-RX35SMPR.js.map +0 -1
- package/dist/chunk-RYYYHPFU.cjs.map +0 -1
- package/dist/chunk-SB5ZKOYN.js.map +0 -1
- package/dist/chunk-XA5S4776.cjs.map +0 -1
- package/dist/chunk-YJQVLVBJ.cjs.map +0 -1
- package/dist/chunk-ZQYE7J3J.cjs.map +0 -1
- package/dist/connection/ConnectedTagMatrix.d.ts +0 -23
- package/dist/tags/TagMatrix.d.ts +0 -87
- package/dist/tags/tagMatrixModel.d.ts +0 -43
|
@@ -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/vcard.ts","../src/collaboration/contacts/ContactCard.tsx","../src/collaboration/direct-messages/DirectMessages.tsx","../src/collaboration/direct-messages/DmParts.tsx","../src/collaboration/mail/mailFolders.ts","../src/collaboration/mail/MailFolderTree.tsx","../src/collaboration/mail/MailMessagePreview.tsx"],"names":["jsx","cn","jsxs","Tooltip","TooltipTrigger","Select","SelectTrigger","RoleBadge","SelectContent","SelectItem","TooltipContent","Clock","Fragment","SelectValue","Button","UserMinus","Trash2","useMemo","Gift","Textarea","AtSign","CheckCircle","XCircle","AlertCircle","ModalSection","ModalSectionTitle","Avatar","AvatarImage","AvatarFallback","Contact","Mail","Phone","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuItem","Download","UserPlus","MoreVertical","DropdownMenuSeparator","Plus","KeyRound","ScrollArea","Loader2","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","BellOff","Bell","X","Popover","PopoverTrigger","ChevronsUpDown","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","useState","useRef","useEffect","testIdOr","ChevronDown","ChevronRight","Checkbox","Paperclip"],"mappings":"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","file":"chunk-F4RUCUXF.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { Clock, Trash2, 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 WorkspaceDeleteButtonProps {\n canDelete: boolean\n /** Why deletion is not allowed (tooltip on the disabled button). */\n disabledReason?: string\n isDeleting?: boolean\n onDelete: () => void\n labels?: { delete: string; deleting: string }\n}\n\n/** Destructive \"Delete\" of a workspace; disabled with an explanation when not allowed. */\nexport function WorkspaceDeleteButton({\n canDelete,\n disabledReason = '',\n isDeleting = false,\n onDelete,\n labels = { delete: 'Delete', deleting: 'Deleting...' },\n}: WorkspaceDeleteButtonProps) {\n const button = (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={canDelete ? onDelete : undefined}\n disabled={!canDelete || isDeleting}\n className=\"h-7 px-2 text-sm text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:h-11\"\n data-testid=\"workspace-delete-button\"\n >\n <Trash2 className=\"mr-1 size-3.5\" />\n <span>{isDeleting ? labels.deleting : labels.delete}</span>\n </Button>\n )\n\n if (canDelete || !disabledReason) return button\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={0}>{button}</span>\n </TooltipTrigger>\n <TooltipContent>\n <p>{disabledReason}</p>\n </TooltipContent>\n </Tooltip>\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}\n\nexport const DEFAULT_CONTACT_OUTCOME_LABELS: ContactOutcomeLabels = {\n contact_added: 'Added to your colleagues',\n already_contact: 'Already one of your colleagues',\n invited: 'Invitation sent',\n reinvited: 'Invitation sent again',\n not_resent_still_pending: 'Invitation already pending',\n failed: 'Could not add this address',\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 const l = { ...DEFAULT_CONTACT_OUTCOME_LABELS, ...labels }\n switch (row.outcome) {\n case 'contact_added':\n case 'already_contact':\n case 'invited':\n case 'reinvited':\n return { email: row.email, status: 'success', message: l[row.outcome] }\n case 'not_resent_still_pending':\n return { email: row.email, status: 'pending', message: l.not_resent_still_pending }\n default:\n return {\n email: row.email,\n status: row.status === 'failed' || row.outcome === 'failed' ? 'failed' : 'pending',\n message: row.outcome_detail ?? l.failed,\n }\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 * vCard (.vcf) generation for a contact: a real, importable card. No dependencies: it assembles\n * vCard 3.0 text (RFC 2426, understood by every address book) and triggers a Blob download.\n */\n\n/** What a card can carry. Only `name` is required; empty fields are left out. */\nexport interface VCardContact {\n /** Full display name (\"Ada Lovelace\"). */\n name: string\n email?: string\n phone?: string\n /** Company or organisation. */\n organisation?: string\n /** Job title or role. */\n title?: string\n /** One-line postal address. */\n address?: string\n /** A web page or profile link. */\n url?: string\n note?: string\n}\n\n/** Escape a text value (RFC 2426 section 4): backslash, comma, semicolon and new lines. */\nfunction escapeText(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/([,;])/g, '\\\\$1')\n .replace(/\\r\\n|\\r|\\n/g, '\\\\n')\n}\n\n/** Fold a content line at 75 octets with a CRLF + space continuation (RFC 2426 section 2.6). */\nfunction fold(line: string): string {\n const encoder = new TextEncoder()\n if (encoder.encode(line).length <= 75) return line\n const out: string[] = []\n let current = ''\n let size = 0\n for (const ch of line) {\n const bytes = encoder.encode(ch).length\n // Continuation lines start with a space that counts toward their 75 octets.\n const limit = out.length === 0 ? 75 : 74\n if (size + bytes > limit) {\n out.push(current)\n current = ''\n size = 0\n }\n current += ch\n size += bytes\n }\n out.push(current)\n return out.join('\\r\\n ')\n}\n\n/** Split \"Ada Byron Lovelace\" into family name (last word) and given names (the rest). */\nfunction splitName(name: string): { family: string; given: string } {\n const words = name.trim().split(/\\s+/).filter(Boolean)\n const family = words.length > 1 ? (words[words.length - 1] ?? '') : ''\n const given = words.length > 1 ? words.slice(0, -1).join(' ') : (words[0] ?? '')\n return { family, given }\n}\n\n/** The vCard 3.0 text for a contact, CRLF separated. */\nexport function contactToVCard(contact: VCardContact): string {\n const name = contact.name.trim()\n const { family, given } = splitName(name)\n const lines = [\n 'BEGIN:VCARD',\n 'VERSION:3.0',\n `N:${escapeText(family)};${escapeText(given)};;;`,\n `FN:${escapeText(name)}`,\n contact.organisation && `ORG:${escapeText(contact.organisation)}`,\n contact.title && `TITLE:${escapeText(contact.title)}`,\n contact.email && `EMAIL;TYPE=INTERNET,WORK:${escapeText(contact.email)}`,\n contact.phone && `TEL;TYPE=WORK,VOICE:${escapeText(contact.phone)}`,\n contact.address && `ADR;TYPE=WORK:;;${escapeText(contact.address)};;;;`,\n contact.url && `URL:${contact.url}`,\n contact.note && `NOTE:${escapeText(contact.note)}`,\n 'END:VCARD',\n ].filter((line): line is string => Boolean(line))\n return lines.map(fold).join('\\r\\n') + '\\r\\n'\n}\n\n/** A safe file name for a contact: \"ada-lovelace.vcf\" (\"contact.vcf\" when nothing usable is left). */\nexport function vCardFilename(contact: Pick<VCardContact, 'name'>): string {\n const slug = contact.name\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n return `${slug || 'contact'}.vcf`\n}\n\n/** Save the contact as a .vcf file through a temporary link click. Browser only. */\nexport function downloadVCard(contact: VCardContact): void {\n const blob = new Blob([contactToVCard(contact)], { type: 'text/vcard;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = vCardFilename(contact)\n document.body.appendChild(link)\n link.click()\n link.remove()\n // Revoke after the click has been handled: some browsers cancel the download otherwise.\n setTimeout(() => URL.revokeObjectURL(url), 0)\n}\n","import type { ReactNode } from 'react'\nimport { Contact, Download, Mail, MoreHorizontal, Phone } from 'lucide-react'\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { downloadVCard, type VCardContact } from './vcard'\n\n/** Every fixed string of the contact card. */\nexport interface ContactCardLabels {\n /** Accessible name of the menu button. */\n actions: string\n /** The export menu item. */\n exportVCard: string\n}\n\nexport const DEFAULT_CONTACT_CARD_LABELS: ContactCardLabels = {\n actions: 'Contact actions',\n exportVCard: 'Save to address book (.vcf)',\n}\n\n/** An extra menu entry a host adds next to the built-in export. */\nexport interface ContactCardAction {\n id: string\n label: string\n icon?: ReactNode\n onSelect: () => void\n destructive?: boolean\n}\n\nexport interface ContactCardProps {\n contact: VCardContact & { avatarUrl?: string }\n /** A badge or status text under the name (\"Invitation pending\"). */\n status?: ReactNode\n /**\n * Called when \"Save to address book\" is chosen. Omit it to use the built-in\n * {@link downloadVCard}; pass your own to log, or to hand the card to a native share sheet.\n */\n onExportVCard?: (contact: VCardContact) => void\n /** Hide the export item entirely (a contact with no usable details). Default true. */\n exportable?: boolean\n /** More menu entries, listed after the export. */\n actions?: ContactCardAction[]\n labels?: Partial<ContactCardLabels>\n className?: string\n 'data-testid'?: string\n}\n\nfunction initials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean)\n return (\n (words[0]?.[0] ?? '') + (words.length > 1 ? (words[words.length - 1]?.[0] ?? '') : '')\n ).toUpperCase()\n}\n\n/**\n * A contact as a card: avatar, name, role, email and phone, and a menu that exports the contact\n * as a vCard. The export is built in ({@link downloadVCard}); `onExportVCard` replaces it, and\n * `actions` adds host entries. Presentational: no SDK, store or router.\n */\nexport function ContactCard({\n contact,\n status,\n onExportVCard = downloadVCard,\n exportable = true,\n actions = [],\n labels,\n className,\n 'data-testid': testId = 'contact-card',\n}: ContactCardProps) {\n const l = { ...DEFAULT_CONTACT_CARD_LABELS, ...labels }\n const subtitle = [contact.title, contact.organisation].filter(Boolean).join(', ')\n const hasMenu = exportable || actions.length > 0\n const { avatarUrl, ...vcard } = contact\n return (\n <div\n data-slot=\"contact-card\"\n data-testid={testId}\n className={`flex min-w-0 items-center gap-3 rounded-lg border border-border bg-card p-3 text-card-foreground ${className ?? ''}`}\n >\n <Avatar className=\"size-10 shrink-0\">\n {avatarUrl && <AvatarImage src={avatarUrl} alt=\"\" />}\n <AvatarFallback>{initials(contact.name) || <Contact className=\"size-4\" />}</AvatarFallback>\n </Avatar>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\" data-testid={`${testId}-name`}>\n {contact.name}\n </p>\n {subtitle && <p className=\"truncate text-xs text-muted-foreground\">{subtitle}</p>}\n {contact.email && (\n <p className=\"flex min-w-0 items-center gap-1 text-xs text-muted-foreground\">\n <Mail className=\"size-3 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{contact.email}</span>\n </p>\n )}\n {contact.phone && (\n <p className=\"flex min-w-0 items-center gap-1 text-xs text-muted-foreground\">\n <Phone className=\"size-3 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{contact.phone}</span>\n </p>\n )}\n {status && <div className=\"mt-1 text-xs\">{status}</div>}\n </div>\n {hasMenu && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.actions}\n data-testid={`${testId}-menu`}\n className=\"flex size-8 pointer-coarse:size-11 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-muted hover:text-foreground data-[state=open]:bg-muted\"\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {exportable && (\n <DropdownMenuItem\n onSelect={() => onExportVCard(vcard)}\n data-testid={`${testId}-export-vcard`}\n >\n <Download className=\"mr-2 size-4\" aria-hidden=\"true\" />\n {l.exportVCard}\n </DropdownMenuItem>\n )}\n {actions.map((a) => (\n <DropdownMenuItem\n key={a.id}\n onSelect={a.onSelect}\n className={a.destructive ? 'text-red-text focus:text-red-text' : undefined}\n data-testid={`${testId}-action-${a.id}`}\n >\n {a.icon}\n {a.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { UserPlus } from 'lucide-react'\n\n/** Every fixed string of the invite chip. `title` / `description` props win. */\nexport interface DmInviteChipLabels {\n title: string\n description: string\n}\n\nexport const DEFAULT_DM_INVITE_CHIP_LABELS: DmInviteChipLabels = {\n title: 'Add a contact by email',\n description: 'Send an invitation to join you on ARBI',\n}\n\n/** Leading call to action of the conversation list, styled as a chip so it reads as one of the rows. */\nexport function DmInviteChip({\n onClick,\n title,\n description,\n testId = 'dm-invite-chip',\n labels,\n}: {\n onClick: () => void\n title?: string\n description?: string\n testId?: string\n labels?: Partial<DmInviteChipLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_DM_INVITE_CHIP_LABELS, ...labels }), [labels])\n return (\n <button\n type=\"button\"\n onClick={onClick}\n data-testid={testId}\n className=\"flex w-full items-center gap-3 border-b border-border px-4 py-3 text-left transition-colors hover:bg-accent/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-ai-accent-soft\">\n <UserPlus className=\"size-4 text-ai-accent\" />\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-semibold text-foreground\">{title ?? l.title}</span>\n <span className=\"block text-xs text-muted-foreground\">{description ?? l.description}</span>\n </span>\n </button>\n )\n}\n\nexport interface DmThreadHeaderProps {\n /** Peer avatar (with presence dot). Omitted while the conversation loads. */\n avatar?: ReactNode\n name: string\n /** Marks the peer as an agent. */\n badge?: ReactNode\n /** Presence in words, next to the address. */\n presence?: ReactNode\n email?: string\n /** Overflow menu, sitting after the identity. */\n menu?: ReactNode\n testId?: string\n}\n\n/**\n * The open conversation's identity, pinned above the thread: who you are talking to, static (no\n * switcher dropdown; back out to the list to pick another conversation).\n */\nexport function DmThreadHeader({\n avatar,\n name,\n badge,\n presence,\n email,\n menu,\n testId = 'dm-active-chip',\n}: DmThreadHeaderProps) {\n return (\n <div\n className=\"flex items-center gap-1 border-b border-border pr-2\"\n data-slot=\"dm-thread-header\"\n >\n <div data-testid={testId} className=\"flex min-w-0 flex-1 items-center gap-3 px-4 py-2.5\">\n {avatar}\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{name}</span>\n {badge}\n </span>\n <span className=\"flex min-w-0 items-center gap-1.5\">\n {presence}\n {presence && <span className=\"text-xs text-muted-foreground\">·</span>}\n <span className=\"min-w-0 truncate text-xs text-muted-foreground\">{email ?? ''}</span>\n </span>\n </span>\n </div>\n {menu}\n </div>\n )\n}\n","import { useMemo, 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/** Round \"+\" tab icon of a new (compose) conversation. */\nexport function DmNewTabIcon() {\n return (\n <div className=\"flex h-5 w-5 items-center justify-center rounded-full bg-primary/10\">\n <Plus className=\"h-3 w-3 text-primary\" />\n </div>\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 isMuted: boolean\n muteTooltip: string\n onToggleMute: () => void\n isMuteBusy?: boolean\n}\n\nexport interface RecipientCandidate {\n id: string\n identity: ReactNode\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}\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}: RecipientPickerProps) {\n const l = useMemo(() => ({ ...DEFAULT_RECIPIENT_PICKER_LABELS, ...labels }), [labels])\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\n <div className=\"flex flex-1 flex-col gap-1.5\">\n {selected.map((recipient) => (\n <div\n key={recipient.id}\n className=\"flex items-center justify-between gap-2 rounded-md bg-muted/50 px-3 py-1.5\"\n >\n <div className=\"flex items-center gap-2\">\n {recipient.identity}\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 ? (\n <BellOff size={14} fill=\"currentColor\" />\n ) : (\n <Bell size={14} />\n )}\n </TooltipTrigger>\n <TooltipContent className=\"max-w-[250px]\">{recipient.muteTooltip}</TooltipContent>\n </Tooltip>\n </div>\n <button\n type=\"button\"\n onClick={() => onRemove(recipient.id)}\n className=\"p-1 text-muted-foreground hover:text-destructive pointer-coarse:p-3\"\n title={l.removeRecipient}\n aria-label={l.removeRecipient}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n\n {canAdd && (\n <Popover open={isOpen} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n {selected.length === 0 ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={candidates.length === 0}\n className=\"w-full justify-start text-muted-foreground\"\n >\n <ChevronsUpDown className=\"mr-2 h-4 w-4\" />\n {l.selectRecipient}\n </Button>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n disabled={candidates.length === 0}\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 className=\"w-72 p-0\"\n align=\"start\"\n onPointerDownOutside={(e) => e.preventDefault()}\n >\n <Command shouldFilter={false}>\n <CommandInput\n placeholder={l.searchUsers}\n value={search}\n onValueChange={onSearchChange}\n />\n <CommandList>\n {candidates.length === 0 ? (\n <CommandEmpty>\n {hasNoKnownUsers ? l.noKnownUsers : l.noMatchingUsers}\n </CommandEmpty>\n ) : (\n <CommandGroup>\n {candidates.map((candidate) => (\n <CommandItem\n key={candidate.id}\n onSelect={() => onPick(candidate.id)}\n className=\"cursor-pointer justify-start\"\n >\n {candidate.identity}\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )}\n\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 /** 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 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 {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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/settings/AvatarPicker.tsx","../src/settings/SettingsPanel.tsx","../src/settings/ProfileCard.tsx","../src/settings/IdentityVerification.tsx","../src/settings/PasswordChangeDialog.tsx","../src/settings/AccountDialogs.tsx","../src/settings/LogoutDialog.tsx","../src/settings/SettingsSwitchRow.tsx","../src/settings/NotificationCategoryList.tsx","../src/settings/account-views.ts"],"names":["jsx","cn","jsxs","useMemo","Loader2","Button","VerifiedBadge","Fragment","Input","Tooltip","TooltipTrigger","TooltipContent","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","useId","Badge","LogOut","ChevronDown","ChevronRight","Radio"],"mappings":"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","file":"chunk-GJV2G4FC.js","sourcesContent":["import { useMemo, useRef, type ChangeEvent } from 'react'\nimport { Camera, Loader2 } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the avatar picker. */\nexport interface AvatarPickerLabels {\n uploadingPicture: string\n changeProfilePicture: string\n change: string\n}\n\nexport const DEFAULT_AVATAR_PICKER_LABELS: AvatarPickerLabels = {\n uploadingPicture: 'Uploading picture',\n changeProfilePicture: 'Change profile picture',\n change: 'Change',\n}\n\nexport interface AvatarPickerProps {\n labels?: Partial<AvatarPickerLabels>\n /** Image URL / data URL; the initials show when absent. */\n pictureUrl?: string | null\n initials: string\n /** Background class of the initials fallback (a stable per-user colour). */\n fallbackClassName?: string\n isUploading?: boolean\n disabled?: boolean\n /** A file was chosen; the host validates, crops and uploads it. */\n onFileChosen: (file: File) => void\n testId?: string\n}\n\n/**\n * Profile picture with a change affordance. A permanent camera mark says the picture is tappable on\n * touch screens; the overlay (revealed on hover/focus) is the actual control.\n */\nexport function AvatarPicker({\n pictureUrl,\n initials,\n fallbackClassName,\n isUploading,\n disabled,\n onFileChosen,\n testId = 'avatar-uploader-input',\n labels,\n}: AvatarPickerProps) {\n const l = useMemo(() => ({ ...DEFAULT_AVATAR_PICKER_LABELS, ...labels }), [labels])\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n // Reset so choosing the same file again still fires a change.\n e.target.value = ''\n if (file) onFileChosen(file)\n }\n\n return (\n <div data-slot=\"avatar-picker\" className=\"group/avatar relative shrink-0\">\n <Avatar className=\"h-20 w-20 ring-1 ring-border\">\n {pictureUrl && <AvatarImage src={pictureUrl} alt={initials} />}\n <AvatarFallback\n className={cn('text-2xl font-semibold leading-none text-white', fallbackClassName)}\n >\n {initials}\n </AvatarFallback>\n </Avatar>\n\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || isUploading}\n className={cn(\n 'absolute inset-0 flex items-center justify-center rounded-full',\n 'bg-foreground/70 text-background',\n 'opacity-0 focus-visible:opacity-100 group-hover/avatar:opacity-100',\n // Touch has no hover: keep the change affordance visible (lighter scrim over the photo).\n 'pointer-coarse:opacity-100',\n 'transition-opacity duration-200',\n 'disabled:cursor-not-allowed disabled:opacity-100'\n )}\n aria-label={isUploading ? l.uploadingPicture : l.changeProfilePicture}\n >\n {isUploading ? (\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n ) : (\n <div className=\"flex flex-col items-center gap-0.5\">\n <Camera className=\"h-5 w-5\" />\n <span className=\"text-xs font-medium\">{l.change}</span>\n </div>\n )}\n </button>\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -bottom-1 -right-1 flex h-7 w-7 items-center justify-center rounded-full bg-background text-muted-foreground ring-1 ring-border\"\n >\n <Camera className=\"h-3.5 w-3.5\" />\n </span>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp,image/gif\"\n onChange={handleChange}\n hidden\n className=\"hidden\"\n data-testid={testId}\n />\n </div>\n )\n}\n","import { useMemo, type ComponentProps, type ReactNode } from 'react'\nimport { ChevronDown, ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the danger zone. `label` prop wins. */\nexport interface SettingsDangerZoneLabels {\n dangerZone: string\n}\n\nexport const DEFAULT_SETTINGS_DANGER_ZONE_LABELS: SettingsDangerZoneLabels = {\n dangerZone: 'Danger Zone',\n}\n\nexport interface SettingsPanelProps extends ComponentProps<'div'> {\n /** Stable test id of the panel. */\n testId?: string\n}\n\n/** Centred column of {@link SettingsSection}s with a readable measure. */\nexport function SettingsPanel({ className, testId, ...props }: SettingsPanelProps) {\n return (\n <div\n data-slot=\"settings-panel\"\n data-testid={testId}\n className={cn('mx-auto w-full max-w-xl space-y-6', className)}\n {...props}\n />\n )\n}\n\nexport interface SettingsSectionProps extends Omit<ComponentProps<'section'>, 'title'> {\n /** Small muted icon before the title. */\n icon?: ReactNode\n title?: ReactNode\n description?: ReactNode\n /** Right-aligned control in the heading row (e.g. a Reset button). */\n action?: ReactNode\n testId?: string\n}\n\n/** Titled group of settings: heading row, optional description, then the controls. */\nexport function SettingsSection({\n icon,\n title,\n description,\n action,\n testId,\n className,\n children,\n ...props\n}: SettingsSectionProps) {\n return (\n <section\n data-slot=\"settings-section\"\n data-testid={testId}\n className={cn('space-y-3', className)}\n {...props}\n >\n {(title || action) && (\n <div className=\"flex items-center justify-between gap-3\">\n {title && (\n <div className=\"flex items-center gap-2\">\n {icon && (\n <span className=\"text-muted-foreground [&_svg]:h-4 [&_svg]:w-4\">{icon}</span>\n )}\n <h2 className=\"text-base font-semibold text-foreground\">{title}</h2>\n </div>\n )}\n {action}\n </div>\n )}\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\n {children}\n </section>\n )\n}\n\nexport interface SettingsRowProps extends Omit<ComponentProps<'div'>, 'title'> {\n label: ReactNode\n /** Id of the control: renders the label as a `<label htmlFor>` so it toggles the control. */\n labelFor?: string\n description?: ReactNode\n /** The control: switch, select, button. Sits at the end of the row. */\n children?: ReactNode\n testId?: string\n}\n\n/** One setting: label + help text on the left, its control on the right (stacks on phones). */\nexport function SettingsRow({\n label,\n labelFor,\n description,\n children,\n testId,\n className,\n ...props\n}: SettingsRowProps) {\n return (\n <div\n data-slot=\"settings-row\"\n data-testid={testId}\n className={cn(\n 'flex flex-col gap-2 py-2 @xl:flex-row @xl:items-center @xl:justify-between @xl:gap-6',\n className\n )}\n {...props}\n >\n <div className=\"min-w-0\">\n {labelFor ? (\n <label htmlFor={labelFor} className=\"text-sm font-medium text-foreground\">\n {label}\n </label>\n ) : (\n <div className=\"text-sm font-medium text-foreground\">{label}</div>\n )}\n {description && <div className=\"text-sm text-muted-foreground\">{description}</div>}\n </div>\n {children && <div className=\"flex shrink-0 items-center gap-2\">{children}</div>}\n </div>\n )\n}\n\nexport interface SettingsCardProps extends ComponentProps<'div'> {\n /** `md` for form-like content, `sm` when the card holds a list of full-bleed action rows. */\n padding?: 'md' | 'sm'\n}\n\n/** Bordered card that groups related settings, the same surface as the dashboard cards. */\nexport function SettingsCard({ padding = 'md', className, ...props }: SettingsCardProps) {\n return (\n <div\n data-slot=\"settings-card\"\n className={cn(\n 'rounded-lg border border-border bg-card shadow-xs',\n padding === 'md' ? 'space-y-5 p-5' : 'divide-y divide-border p-2',\n className\n )}\n {...props}\n />\n )\n}\n\nexport interface SettingsActionRowProps {\n title: ReactNode\n description?: ReactNode\n onClick: () => void\n testId?: string\n}\n\n/** Full-width row that opens a dialog or sub-page: title, help text and a chevron. */\nexport function SettingsActionRow({ title, description, onClick, testId }: SettingsActionRowProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n data-slot=\"settings-action-row\"\n data-testid={testId}\n className=\"flex w-full items-center gap-3 rounded-md px-3 py-3 text-left transition-colors hover:bg-background/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold text-foreground\">{title}</div>\n {description && (\n <div className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">{description}</div>\n )}\n </div>\n <ChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n )\n}\n\nexport interface SettingsDangerZoneProps {\n isOpen: boolean\n onToggle: () => void\n /** Heading of the collapsed zone. */\n label?: string\n title: ReactNode\n description: ReactNode\n /** The destructive control (a Button). */\n action: ReactNode\n labels?: Partial<SettingsDangerZoneLabels>\n}\n\n/** Collapsed-by-default zone for irreversible actions. */\nexport function SettingsDangerZone({\n isOpen,\n onToggle,\n label,\n title,\n description,\n action,\n labels,\n}: SettingsDangerZoneProps) {\n const l = useMemo(() => ({ ...DEFAULT_SETTINGS_DANGER_ZONE_LABELS, ...labels }), [labels])\n return (\n <div data-slot=\"settings-danger-zone\" className=\"mt-8 pt-2\">\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={isOpen}\n className=\"flex w-full items-center gap-1.5 text-left pointer-coarse:min-h-11\"\n >\n {isOpen ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n <p className=\"text-sm font-medium text-muted-foreground\">{label ?? l.dangerZone}</p>\n </button>\n {isOpen && (\n <div className=\"mt-3 flex items-center justify-between gap-4 rounded-lg bg-destructive/5 p-4\">\n <div>\n <p className=\"font-medium\">{title}</p>\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n </div>\n <div className=\"shrink-0\">{action}</div>\n </div>\n )}\n </div>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { Check, Loader2, Mail, Pencil } from 'lucide-react'\nimport {\n Button,\n cn,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n VerifiedBadge,\n} from '@arbidocs/react/ui'\nimport { SettingsCard } from './SettingsPanel'\n\n/** Every fixed string of the profile card. `ssoTooltip` prop wins over the label. */\nexport interface ProfileCardLabels {\n firstName: string\n lastName: string\n save: string\n cancel: string\n sso: string\n ssoTooltip: string\n change: string\n newEmailAddress: string\n emailPlaceholder: string\n /** Sentence under the new-email field. */\n codeWillBeSent: string\n sendCode: string\n /** Heading of the verify step: \"Verify new@example.com\". */\n verify: (email: string) => string\n codePlaceholder: string\n enterCodeHint: string\n confirm: string\n /** Resend button while cooling down: \"Resend in 30s\". */\n resendIn: (seconds: number) => string\n resendCode: string\n /** Shown while editing the name of a verified account. */\n verifiedNameLocked: string\n}\n\nexport const DEFAULT_PROFILE_CARD_LABELS: ProfileCardLabels = {\n firstName: 'First name',\n lastName: 'Last name',\n save: 'Save',\n cancel: 'Cancel',\n sso: 'SSO',\n ssoTooltip:\n 'Your email is managed by your sign-in provider. Change it there and it will sync here automatically on your next sign-in.',\n change: 'Change',\n newEmailAddress: 'New email address',\n emailPlaceholder: 'you@example.com',\n codeWillBeSent: 'We\\u2019ll send a 3-word verification code to this address.',\n sendCode: 'Send code',\n verify: (email) => `Verify ${email}`,\n codePlaceholder: 'WORD-WORD-WORD',\n enterCodeHint: 'Enter the 3-word code from the email we just sent.',\n confirm: 'Confirm',\n resendIn: (seconds) => `Resend in ${seconds}s`,\n resendCode: 'Resend code',\n verifiedNameLocked: 'Verified name. Remove your identity verification to change it.',\n}\n\nexport interface ProfileNameView {\n /** Display name; \"Unnamed\" is the host's call. */\n display: string\n isEditing: boolean\n givenName: string\n familyName: string\n onGivenNameChange: (value: string) => void\n onFamilyNameChange: (value: string) => void\n onStartEdit: () => void\n onSave: () => void\n onCancel: () => void\n isSaving: boolean\n}\n\nexport interface ProfileEmailChangeView {\n step: 'enter' | 'verify'\n newEmail: string\n onNewEmailChange: (value: string) => void\n onSendCode: () => void\n isSending: boolean\n code: string\n onCodeChange: (value: string) => void\n onConfirm: () => void\n isConfirming: boolean\n /** Seconds until a new code may be requested; 0 when allowed. */\n cooldownSeconds: number\n onCancel: () => void\n}\n\nexport interface ProfileCardProps {\n /** The picture with its change control. */\n avatar: ReactNode\n name: ProfileNameView\n email: string\n /** Email is managed by the sign-in provider: shows an \"SSO\" marker instead of \"Change\". */\n isSso: boolean\n /** Verified tick after the name. A verified name is locked (the server refuses a rename), so it is not editable. */\n isVerified?: boolean\n onStartEmailChange: () => void\n /** Open email-change flow; hides the plain email row. */\n emailChange?: ProfileEmailChangeView\n ssoTooltip?: string\n labels?: Partial<ProfileCardLabels>\n}\n\n/** Profile identity: avatar, editable name, email and the inline email-change flow. */\nexport function ProfileCard({\n avatar,\n name,\n email,\n isSso,\n isVerified = false,\n onStartEmailChange,\n emailChange,\n ssoTooltip,\n labels,\n}: ProfileCardProps) {\n const l = useMemo(() => ({ ...DEFAULT_PROFILE_CARD_LABELS, ...labels }), [labels])\n return (\n <SettingsCard>\n <div className=\"flex items-start gap-5\">\n {avatar}\n\n <div className=\"min-w-0 flex-1 space-y-3\">\n {name.isEditing ? (\n <div className=\"space-y-2\">\n <div className=\"flex flex-col gap-2 @xl:flex-row\">\n <Input\n value={name.givenName}\n onChange={(e) => name.onGivenNameChange(e.target.value)}\n placeholder={l.firstName}\n className=\"flex-1\"\n autoFocus\n />\n <Input\n value={name.familyName}\n onChange={(e) => name.onFamilyNameChange(e.target.value)}\n placeholder={l.lastName}\n className=\"flex-1\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={name.onSave}\n size=\"sm\"\n disabled={!name.givenName.trim() || name.isSaving}\n >\n {name.isSaving ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1 h-4 w-4\" />\n )}\n {l.save}\n </Button>\n <Button onClick={name.onCancel} size=\"sm\" variant=\"ghost\" disabled={name.isSaving}>\n {l.cancel}\n </Button>\n </div>\n </div>\n ) : isVerified ? (\n <div className=\"-mx-2 w-full px-2 py-1\" data-testid=\"verified-name\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate font-heading text-xl font-semibold text-foreground\">\n {name.display}\n </span>\n <VerifiedBadge className=\"h-4 w-4\" />\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{l.verifiedNameLocked}</p>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={name.onStartEdit}\n className=\"-mx-2 w-full rounded-md px-2 py-1 text-left transition-colors hover:bg-background/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate font-heading text-xl font-semibold text-foreground\">\n {name.display}\n </span>\n <Pencil className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </div>\n </button>\n )}\n\n {!emailChange && (\n <div className=\"-mx-2 flex min-w-0 items-center gap-2 px-2 py-1\">\n <Mail className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate text-sm text-muted-foreground\">{email}</span>\n {isSso ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"ml-1 shrink-0 cursor-help rounded bg-background px-1.5 py-0.5 text-xs font-medium text-muted-foreground\"\n tabIndex={0}\n >\n {l.sso}\n </span>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{ssoTooltip ?? l.ssoTooltip}</TooltipContent>\n </Tooltip>\n ) : (\n <button\n type=\"button\"\n onClick={onStartEmailChange}\n className=\"ml-auto shrink-0 text-xs font-medium text-primary hover:underline pointer-coarse:min-h-11\"\n >\n {l.change}\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n\n {emailChange && !isSso && (\n <div className=\"animate-accordion-down overflow-hidden\">\n <div className=\"space-y-3 rounded-lg bg-background p-4\">\n {emailChange.step === 'enter' ? (\n <>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" />\n {l.newEmailAddress}\n </div>\n <Input\n type=\"email\"\n value={emailChange.newEmail}\n onChange={(e) => emailChange.onNewEmailChange(e.target.value)}\n placeholder={l.emailPlaceholder}\n autoFocus\n />\n <p className=\"text-xs text-muted-foreground\">{l.codeWillBeSent}</p>\n <div className=\"flex items-center gap-2 pt-1\">\n <Button\n onClick={emailChange.onSendCode}\n size=\"sm\"\n disabled={!emailChange.newEmail.trim() || emailChange.isSending}\n >\n {emailChange.isSending ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Mail className=\"mr-1 h-4 w-4\" />\n )}\n {l.sendCode}\n </Button>\n <Button\n onClick={emailChange.onCancel}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.isSending}\n >\n {l.cancel}\n </Button>\n </div>\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Mail className=\"h-3.5 w-3.5\" />\n {l.verify(emailChange.newEmail)}\n </div>\n <Input\n value={emailChange.code}\n onChange={(e) =>\n emailChange.onCodeChange(e.target.value.toUpperCase().replace(/\\s+/g, '-'))\n }\n className={cn('text-center font-mono tracking-wider')}\n placeholder={l.codePlaceholder}\n autoFocus\n />\n <p className=\"text-xs text-muted-foreground\">{l.enterCodeHint}</p>\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Button\n onClick={emailChange.onConfirm}\n size=\"sm\"\n disabled={!emailChange.code.trim() || emailChange.isConfirming}\n >\n {emailChange.isConfirming ? (\n <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1 h-4 w-4\" />\n )}\n {l.confirm}\n </Button>\n <Button\n onClick={() => {\n if (emailChange.cooldownSeconds > 0) return\n emailChange.onSendCode()\n }}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.cooldownSeconds > 0 || emailChange.isSending}\n >\n {emailChange.cooldownSeconds > 0\n ? l.resendIn(emailChange.cooldownSeconds)\n : l.resendCode}\n </Button>\n <Button\n onClick={emailChange.onCancel}\n size=\"sm\"\n variant=\"ghost\"\n disabled={emailChange.isConfirming}\n >\n {l.cancel}\n </Button>\n </div>\n </>\n )}\n </div>\n </div>\n )}\n </SettingsCard>\n )\n}\n","/**\n * Identity verification blocks: the settings card, the dialog (pay → verify in Didit's frame →\n * result) and a gate for deployments that require it. All take the `IdentityVerificationFlow` from\n * `@arbidocs/react` (`useIdentityVerification` with a provider, or `useIdentityVerificationFlow`\n * bound to a host's own API), so they work the same inside ARBI and on a customer's site.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport { ExternalLink, Loader2, ShieldCheck } from 'lucide-react'\nimport { Button, VerifiedBadge, type IdentityVerificationFlow } from '@arbidocs/react/ui'\nimport { ModalScaffold } from './ModalScaffold'\nimport { SettingsCard, SettingsRow } from './SettingsPanel'\n\n/** Every fixed string of the identity verification blocks. */\nexport interface IdentityVerificationLabels {\n title: string\n intro: string\n /** \"£5.00 incl. VAT · 3 attempts\" (`price` comes formatted, VAT note included). */\n priceLine: (price: string, attempts: number) => string\n proOnly: string\n seePlans: string\n manageBilling: string\n verify: string\n continue: string\n attemptsLeft: (n: number) => string\n verified: string\n verifiedDetail: (country: string) => string\n inReview: string\n finishName: string\n finish: string\n remove: string\n payTitle: string\n payBody: (price: string, attempts: number) => string\n pay: string\n confirmPayment: string\n paymentConfirmed: string\n verifyTitle: string\n embedFailed: string\n openInNewTab: string\n checkResult: string\n resultVerified: string\n resultDeclined: (attemptsLeft: number) => string\n tryAgain: string\n resultInReview: string\n nameMismatchTitle: string\n nameMismatchBody: string\n documentName: string\n accountName: string\n useDocumentName: (name: string) => string\n keepName: string\n close: string\n requiredTitle: string\n requiredBody: string\n requiredProOnly: string\n}\n\nexport const DEFAULT_IDENTITY_VERIFICATION_LABELS: IdentityVerificationLabels = {\n title: 'Identity verification',\n intro: 'Check your ID once to get a verified tick next to your name.',\n priceLine: (price, attempts) => `${price} · ${attempts} attempts`,\n proOnly: 'Available on Pro plans.',\n seePlans: 'See plans',\n manageBilling: 'Manage billing',\n verify: 'Verify identity',\n continue: 'Continue',\n attemptsLeft: (n) => `${n} attempt${n === 1 ? '' : 's'} left`,\n verified: 'Verified',\n verifiedDetail: (country) => `ID issued in ${country}`,\n inReview: 'Your check is being reviewed. We’ll update this when it’s done.',\n finishName: 'Your ID was verified. Confirm your name to get the tick.',\n finish: 'Finish',\n remove: 'Remove',\n payTitle: 'Verify your identity',\n payBody: (price, attempts) =>\n `A one-time fee of ${price} is charged to the card on your Pro plan. It covers up to ${attempts} attempts. Your ID is checked by our provider, Didit; ARBI does not keep your document.`,\n pay: 'Pay and continue',\n confirmPayment: 'Confirm payment with your bank',\n paymentConfirmed: 'I’ve confirmed it',\n verifyTitle: 'Scan your ID',\n embedFailed: 'Your camera isn’t available here. Continue in a new tab, then come back.',\n openInNewTab: 'Open in a new tab',\n checkResult: 'I’ve finished',\n resultVerified: 'You’re verified. The tick now shows next to your name.',\n resultDeclined: (n) =>\n n > 0\n ? `We couldn’t verify your ID. You have ${n} attempt${n === 1 ? '' : 's'} left.`\n : 'We couldn’t verify your ID and no attempts are left.',\n tryAgain: 'Try again',\n resultInReview: 'Your check needs a manual review. We’ll show the result here when it’s done.',\n nameMismatchTitle: 'Your ID was verified',\n nameMismatchBody:\n 'The name on your ID differs from your account name. The tick shows only with the name on your ID.',\n documentName: 'Name on your ID',\n accountName: 'Account name',\n useDocumentName: (name) => `Change my name to ${name}`,\n keepName: 'Keep my name',\n close: 'Close',\n requiredTitle: 'Identity verification required',\n requiredBody: 'This workspace requires a verified identity before you continue.',\n requiredProOnly: 'Identity verification is available on Pro plans. Ask your administrator.',\n}\n\nfunction useLabels(labels?: Partial<IdentityVerificationLabels>) {\n return useMemo(() => ({ ...DEFAULT_IDENTITY_VERIFICATION_LABELS, ...labels }), [labels])\n}\n\n/** Refusals the user fixes in billing (plan, card, address). */\nconst BILLING_CODES = [\n 'PRO_REQUIRED',\n 'PAYMENT_METHOD_REQUIRED',\n 'BILLING_ADDRESS_REQUIRED',\n 'PAYMENT_DECLINED',\n]\n\nfunction Problem({\n flow,\n onManageBilling,\n label,\n}: {\n flow: IdentityVerificationFlow\n onManageBilling?: () => void\n label: string\n}) {\n if (!flow.problem) return null\n const billing = onManageBilling && BILLING_CODES.includes(flow.problem.code ?? '')\n return (\n <div className=\"flex flex-wrap items-center gap-2\" data-testid=\"identity-problem\">\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {flow.problem.message}\n </p>\n {billing && (\n <Button size=\"sm\" variant=\"outline\" onClick={onManageBilling}>\n {label}\n </Button>\n )}\n </div>\n )\n}\n\n// ── Card ────────────────────────────────────────────────────────────────────\n\nexport interface IdentityVerificationCardProps {\n flow: IdentityVerificationFlow\n /** Open the host's plans / billing (upgrade to Pro, fix the card or address). */\n onManageBilling?: () => void\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** Settings row for the ID check: offer, progress, or the tick. Renders nothing when not offered. */\nexport function IdentityVerificationCard({\n flow,\n onManageBilling,\n labels,\n}: IdentityVerificationCardProps) {\n const l = useLabels(labels)\n const { status } = flow\n if (!status?.enabled) return null\n const busy = flow.busy !== null\n\n let description: ReactNode\n let action: ReactNode = null\n if (status.verified) {\n description = (\n <span className=\"inline-flex items-center gap-1.5\">\n <VerifiedBadge />\n {l.verified}\n {status.document_country && (\n <span className=\"text-muted-foreground\">\n {' · '}\n {l.verifiedDetail(status.document_country)}\n </span>\n )}\n </span>\n )\n action = (\n <Button size=\"sm\" variant=\"ghost\" onClick={flow.remove} disabled={busy}>\n {l.remove}\n </Button>\n )\n } else if (!status.eligible) {\n description = `${l.intro} ${l.proOnly}`\n action = onManageBilling ? (\n <Button size=\"sm\" variant=\"outline\" onClick={onManageBilling}>\n {l.seePlans}\n </Button>\n ) : null\n } else if (status.state === 'in_review') {\n description = l.inReview\n } else if (status.state === 'name_mismatch') {\n description = l.finishName\n action = (\n <Button size=\"sm\" onClick={flow.open}>\n {l.finish}\n </Button>\n )\n } else {\n const resuming = status.attempts_left > 0 || status.state === 'in_progress'\n description = (\n <>\n {l.intro}{' '}\n <span className=\"text-muted-foreground\">\n {resuming\n ? l.attemptsLeft(status.attempts_left)\n : l.priceLine(flow.price ?? '', status.attempts_per_fee)}\n </span>\n </>\n )\n action = (\n <Button size=\"sm\" onClick={flow.open} disabled={busy}>\n <ShieldCheck className=\"mr-1 h-4 w-4\" />\n {resuming ? l.continue : l.verify}\n </Button>\n )\n }\n\n return (\n <SettingsCard padding=\"sm\" data-testid=\"identity-verification-card\">\n <SettingsRow label={l.title} description={description}>\n {action}\n </SettingsRow>\n {!flow.isOpen && (\n <Problem flow={flow} onManageBilling={onManageBilling} label={l.manageBilling} />\n )}\n </SettingsCard>\n )\n}\n\n// ── Dialog ──────────────────────────────────────────────────────────────────\n\nexport interface IdentityVerificationDialogProps {\n flow: IdentityVerificationFlow\n /** The account name as shown, compared with the name on the document. */\n accountName: string\n /** Block closing (the `RequireVerified` gate). Default true. */\n dismissible?: boolean\n /** Open the host's billing to fix a refused payment (plan, card, address). */\n onManageBilling?: () => void\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** The verification dialog: pay the fee, verify in Didit's embedded frame, then the result. */\nexport function IdentityVerificationDialog({\n flow,\n accountName,\n dismissible = true,\n onManageBilling,\n labels,\n}: IdentityVerificationDialogProps) {\n const l = useLabels(labels)\n const { status } = flow\n const attempts = status?.attempts_per_fee ?? 0\n const docName = [status?.document_given_name, status?.document_family_name]\n .filter(Boolean)\n .join(' ')\n const spinner = <Loader2 className=\"mr-1 h-4 w-4 animate-spin\" />\n\n let body: ReactNode\n let footer: ReactNode = null\n if (flow.step === 'pay') {\n body = flow.paymentUrl ? (\n <a\n href={flow.paymentUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-sm font-medium text-primary hover:underline\"\n >\n {l.confirmPayment}\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{l.payBody(flow.price ?? '', attempts)}</p>\n )\n footer = flow.paymentUrl ? (\n <Button onClick={flow.recheckPayment} disabled={flow.busy !== null}>\n {flow.busy === 'start' && spinner}\n {l.paymentConfirmed}\n </Button>\n ) : (\n <Button onClick={flow.pay} disabled={flow.busy !== null} data-testid=\"identity-pay\">\n {flow.busy === 'pay' && spinner}\n {l.pay}\n </Button>\n )\n } else if (flow.step === 'verify') {\n body = (\n <div className=\"space-y-3\">\n {flow.embedFailed ? (\n <p className=\"text-sm text-muted-foreground\">{l.embedFailed}</p>\n ) : (\n <div\n id={flow.verifyContainerId}\n ref={flow.verifyContainerRef}\n className=\"h-[560px] w-full overflow-hidden rounded-md bg-muted\"\n data-testid=\"identity-didit-frame\"\n >\n {flow.busy === 'start' && (\n <div className=\"flex h-full items-center justify-center\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n )}\n </div>\n )}\n </div>\n )\n footer = (\n <>\n {flow.embedFailed && (\n <Button variant=\"outline\" onClick={flow.openInNewTab}>\n <ExternalLink className=\"mr-1 h-4 w-4\" />\n {l.openInNewTab}\n </Button>\n )}\n <Button variant=\"ghost\" onClick={flow.checkResult} disabled={flow.busy !== null}>\n {flow.busy === 'refresh' && spinner}\n {l.checkResult}\n </Button>\n </>\n )\n } else if (status?.state === 'name_mismatch') {\n body = (\n <div className=\"space-y-3\" data-testid=\"identity-name-mismatch\">\n <p className=\"text-sm text-muted-foreground\">{l.nameMismatchBody}</p>\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm\">\n <dt className=\"text-muted-foreground\">{l.documentName}</dt>\n <dd className=\"font-medium\">{docName}</dd>\n <dt className=\"text-muted-foreground\">{l.accountName}</dt>\n <dd>{accountName}</dd>\n </dl>\n </div>\n )\n footer = (\n <>\n <Button variant=\"ghost\" onClick={flow.keepName} disabled={flow.busy !== null}>\n {l.keepName}\n </Button>\n <Button onClick={flow.acceptName} disabled={flow.busy !== null || !docName}>\n {flow.busy === 'accept' && spinner}\n {l.useDocumentName(docName)}\n </Button>\n </>\n )\n } else if (status?.verified) {\n body = (\n <p className=\"flex items-center gap-2 text-sm\">\n <VerifiedBadge className=\"h-4 w-4\" />\n {l.resultVerified}\n </p>\n )\n footer = <Button onClick={flow.close}>{l.close}</Button>\n } else if (status?.state === 'in_review') {\n body = <p className=\"text-sm text-muted-foreground\">{l.resultInReview}</p>\n footer = <Button onClick={flow.close}>{l.close}</Button>\n } else {\n const left = status?.attempts_left ?? 0\n body = <p className=\"text-sm text-muted-foreground\">{l.resultDeclined(left)}</p>\n footer =\n left > 0 ? (\n <Button onClick={flow.retry} disabled={flow.busy !== null}>\n {l.tryAgain}\n </Button>\n ) : (\n <Button onClick={flow.close}>{l.close}</Button>\n )\n }\n\n const title =\n status?.state === 'name_mismatch' && flow.step === 'result'\n ? l.nameMismatchTitle\n : flow.step === 'verify'\n ? l.verifyTitle\n : l.payTitle\n return (\n <ModalScaffold\n open={flow.isOpen}\n onOpenChange={(open) => (open ? flow.open() : flow.close())}\n title={title}\n icon={<ShieldCheck className=\"h-5 w-5\" />}\n size={flow.step === 'verify' ? 'lg' : 'md'}\n dismissible={dismissible}\n testId=\"identity-verification-dialog\"\n >\n <ModalScaffold.Body>\n {body}\n <Problem flow={flow} onManageBilling={onManageBilling} label={l.manageBilling} />\n </ModalScaffold.Body>\n <ModalScaffold.Footer>{footer}</ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n\n// ── Gate ────────────────────────────────────────────────────────────────────\n\nexport interface RequireVerifiedProps {\n flow: IdentityVerificationFlow\n accountName: string\n onManageBilling?: () => void\n children?: ReactNode\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/**\n * Children behind a verified identity when the deployment requires it (`status.required`): until\n * the user is verified a dialog that cannot be dismissed covers them. Passes through otherwise.\n */\nexport function RequireVerified({\n flow,\n accountName,\n onManageBilling,\n children,\n labels,\n}: RequireVerifiedProps) {\n const l = useLabels(labels)\n const { status } = flow\n const blocked = Boolean(status?.enabled && status.required && !status.verified)\n if (!blocked || !status) return <>{children}</>\n\n if (flow.isOpen) {\n return (\n <>\n {children}\n <IdentityVerificationDialog\n flow={flow}\n accountName={accountName}\n dismissible={false}\n onManageBilling={onManageBilling}\n labels={labels}\n />\n </>\n )\n }\n return (\n <>\n {children}\n <ModalScaffold\n open\n onOpenChange={() => {}}\n title={l.requiredTitle}\n icon={<ShieldCheck className=\"h-5 w-5\" />}\n dismissible={false}\n testId=\"identity-required-gate\"\n >\n <ModalScaffold.Body>\n <p className=\"text-sm text-muted-foreground\">\n {status.eligible ? l.requiredBody : l.requiredProOnly}\n </p>\n </ModalScaffold.Body>\n {status.eligible && (\n <ModalScaffold.Footer>\n <Button onClick={flow.open}>{l.verify}</Button>\n </ModalScaffold.Footer>\n )}\n </ModalScaffold>\n </>\n )\n}\n","import { useMemo, type FormEvent, type ReactNode, useId } from 'react'\nimport { AlertCircle, CheckCircle2, Loader2 } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\nimport {\n PasswordStrengthInput,\n type PasswordStrengthInputLabels,\n type PasswordStrengthInputTestIds,\n} from '../auth/PasswordStrengthInput'\nimport { testIdOr } from '../chat/test-id'\nimport { formatCount } from '../lib/format'\n\n/** Every fixed string of the password-change dialog. */\nexport interface PasswordChangeDialogLabels {\n setNewPasswordTitle: string\n changeMasterPasswordTitle: string\n recoveryDescription: string\n changeDescription: string\n passwordChanged: string\n done: string\n recoverySuccessful: string\n currentPassword: string\n currentPasswordPlaceholder: string\n masterPassword: string\n newPassword: string\n confirmPassword: string\n confirmNewPassword: string\n /** Re-key notice: \"3 workspaces will be re-keyed with your new password.\" */\n workspacesRekeyed: (count: number) => string\n cancel: string\n settingPassword: string\n changingPassword: string\n continue: string\n changePassword: string\n}\n\nexport const DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS: PasswordChangeDialogLabels = {\n setNewPasswordTitle: 'Set New Password',\n changeMasterPasswordTitle: 'Change Master Password',\n recoveryDescription: 'Set a new password for your recovered account',\n changeDescription: 'Change your master password dialog',\n passwordChanged: 'Password changed',\n done: 'Done',\n recoverySuccessful: 'Recovery successful. Set a new master password to continue.',\n currentPassword: 'Current Password',\n currentPasswordPlaceholder: 'Enter current password',\n masterPassword: 'Master Password',\n newPassword: 'New Password',\n confirmPassword: 'Confirm Password',\n confirmNewPassword: 'Confirm New Password',\n workspacesRekeyed: (count) =>\n `${formatCount(count, { one: 'workspace', other: 'workspaces' })} will be re-keyed with your new password.`,\n cancel: 'Cancel',\n settingPassword: 'Setting Password...',\n changingPassword: 'Changing Password...',\n continue: 'Continue',\n changePassword: 'Change Password',\n}\n\nexport interface PasswordChangeDialogProps {\n labels?: Partial<PasswordChangeDialogLabels>\n /** Labels forwarded to the embedded password input. */\n passwordInputLabels?: Partial<PasswordStrengthInputLabels>\n /** Dialog test id (default `change-password-dialog`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<\n Record<'done' | 'currentInput' | 'workspaceCount' | 'error' | 'cancel' | 'submit', string>\n >\n /** Ids forwarded to the embedded password input. */\n passwordInputTestIds?: PasswordStrengthInputTestIds\n open: boolean\n /** Dismiss (also fired by Cancel and the close button). */\n onClose: () => void\n /** After recovery with a key: no current password, no Cancel, full-width Continue. */\n recoveryMode: boolean\n currentPassword: string\n onCurrentPasswordChange: (value: string) => void\n newPassword: string\n onNewPasswordChange: (value: string) => void\n confirmPassword: string\n onConfirmPasswordChange: (value: string) => void\n /** The host's password policy (see `PasswordStrengthInput`). */\n getUnmetRequirement: (password: string) => string | null\n /** Number of workspaces that will be re-keyed; the notice is hidden at 0. */\n workspaceCount: number\n error: string | null\n isProcessing: boolean\n isSubmitDisabled: boolean\n onSubmit: () => void\n /**\n * Success state: shown instead of the form once the password changed (the new recovery key\n * download). `null` while the form is showing.\n */\n success: ReactNode | null\n onDone: () => void\n}\n\n/** Change (or set, after recovery) the master password, then offer the new recovery key. */\nexport function PasswordChangeDialog({\n open,\n onClose,\n recoveryMode,\n currentPassword,\n onCurrentPasswordChange,\n newPassword,\n onNewPasswordChange,\n confirmPassword,\n onConfirmPasswordChange,\n getUnmetRequirement,\n workspaceCount,\n error,\n isProcessing,\n isSubmitDisabled,\n onSubmit,\n success,\n onDone,\n labels,\n passwordInputLabels,\n testId,\n testIds,\n passwordInputTestIds,\n}: PasswordChangeDialogProps) {\n const currentPasswordId = useId()\n const l = useMemo(() => ({ ...DEFAULT_PASSWORD_CHANGE_DIALOG_LABELS, ...labels }), [labels])\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault()\n onSubmit()\n }\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'change-password-dialog' })}\n >\n <DialogHeader>\n <DialogTitle>\n {recoveryMode ? l.setNewPasswordTitle : l.changeMasterPasswordTitle}\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n {recoveryMode ? l.recoveryDescription : l.changeDescription}\n </DialogDescription>\n </DialogHeader>\n\n {success ? (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-green-text\">\n <CheckCircle2 className=\"h-5 w-5\" />\n <span className=\"font-medium\">{l.passwordChanged}</span>\n </div>\n {success}\n <div className=\"flex justify-end\">\n <Button\n onClick={onDone}\n data-testid={testIdOr(testIds?.done, { testId: 'change-password-done-button' })}\n >\n {l.done}\n </Button>\n </div>\n </div>\n ) : (\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n {recoveryMode && (\n <p className=\"text-sm font-medium text-green-text\">{l.recoverySuccessful}</p>\n )}\n\n {!recoveryMode && (\n <div className=\"space-y-1.5\">\n <label htmlFor={currentPasswordId} className=\"text-sm font-medium text-foreground\">\n {l.currentPassword} <span className=\"text-red-text\">*</span>\n </label>\n <Input\n id={currentPasswordId}\n type=\"password\"\n value={currentPassword}\n onChange={(e) => onCurrentPasswordChange(e.target.value)}\n disabled={isProcessing}\n placeholder={l.currentPasswordPlaceholder}\n autoComplete=\"current-password\"\n className=\"placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.currentInput, {\n testId: 'change-password-current-input',\n })}\n />\n </div>\n )}\n\n <PasswordStrengthInput\n password={newPassword}\n confirmPassword={confirmPassword}\n onPasswordChange={onNewPasswordChange}\n onConfirmPasswordChange={onConfirmPasswordChange}\n showConfirmation\n disabled={isProcessing}\n passwordLabel={recoveryMode ? l.masterPassword : l.newPassword}\n confirmLabel={recoveryMode ? l.confirmPassword : l.confirmNewPassword}\n labels={passwordInputLabels}\n testIds={passwordInputTestIds}\n layout={recoveryMode ? 'side-by-side' : 'stacked'}\n showStrengthIndicator\n getUnmetRequirement={getUnmetRequirement}\n />\n\n {workspaceCount > 0 && (\n <div\n className=\"rounded-md bg-green-bg p-3\"\n data-testid={testIdOr(testIds?.workspaceCount, {\n testId: 'change-password-workspace-count',\n })}\n >\n <div className=\"flex gap-2\">\n <CheckCircle2 className=\"h-5 w-5 flex-shrink-0 text-green-text\" />\n <p className=\"text-sm text-green-text\">{l.workspacesRekeyed(workspaceCount)}</p>\n </div>\n </div>\n )}\n\n {error && (\n <div\n className=\"rounded-md bg-red-bg p-3\"\n data-testid={testIdOr(testIds?.error, { testId: 'change-password-error' })}\n >\n <div className=\"flex gap-2\">\n <AlertCircle className=\"h-5 w-5 flex-shrink-0 text-red-text\" />\n <p className=\"text-sm text-red-text\">{error}</p>\n </div>\n </div>\n )}\n\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-3 pt-4\">\n {!recoveryMode && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onClose}\n disabled={isProcessing}\n data-testid={testIdOr(testIds?.cancel, {\n testId: 'change-password-cancel-button',\n })}\n >\n {l.cancel}\n </Button>\n )}\n <Button\n type=\"submit\"\n disabled={isSubmitDisabled}\n className={recoveryMode ? 'w-full' : ''}\n data-testid={testIdOr(testIds?.submit, { testId: 'change-password-submit-button' })}\n >\n {isProcessing ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {recoveryMode ? l.settingPassword : l.changingPassword}\n </>\n ) : recoveryMode ? (\n l.continue\n ) : (\n l.changePassword\n )}\n </Button>\n </div>\n </form>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import { useMemo, type ReactNode, useId } from 'react'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { AlertTriangle, Loader2, LogOut, Radio } from 'lucide-react'\nimport {\n Badge,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the active-sessions dialog. */\nexport interface ActiveSessionsDialogLabels {\n title: string\n description: string\n noSessions: string\n thisDevice: string\n agent: string\n endSession: string\n}\n\nexport const DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS: ActiveSessionsDialogLabels = {\n title: 'Active sessions',\n description:\n 'Devices and agents currently signed in to your account. Ending a session signs it out immediately.',\n noSessions: 'No active sessions.',\n thisDevice: 'This device',\n agent: 'Agent',\n endSession: 'End this session',\n}\n\n/** Every fixed string of the delete-account dialog. */\nexport interface DeleteAccountDialogLabels {\n warningTitle: string\n /** Sentence start, before the emphasised part (keep the trailing space). */\n warningBefore: string\n /** Emphasised (bold) part of the warning. */\n warningEmphasis: string\n /** Sentence end, after the emphasised part. */\n warningAfter: string\n blockersHeading: string\n cancel: string\n continue: string\n confirmTitle: string\n confirmDescription: string\n yourEmail: string\n back: string\n deleting: string\n deleteAccount: string\n}\n\nexport const DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS: DeleteAccountDialogLabels = {\n warningTitle: 'Delete your account?',\n warningBefore: 'Once deleted, your account will be ',\n warningEmphasis: 'immediately closed and you will be logged out',\n warningAfter: '. This action cannot be undone.',\n blockersHeading: 'You must resolve these first:',\n cancel: 'Cancel',\n continue: 'Continue',\n confirmTitle: 'Confirm account deletion',\n confirmDescription:\n 'Type your email address to confirm. Your account will be closed immediately and you will be logged out.',\n yourEmail: 'Your email',\n back: 'Back',\n deleting: 'Deleting...',\n deleteAccount: 'Delete Account',\n}\n\nexport interface ActiveSessionView {\n id: string\n /** Display name, e.g. \"Browser session\". */\n name: string\n /** The session of this device: badged, and cannot be ended here. */\n isCurrent: boolean\n isAgent: boolean\n /** Secondary line, e.g. \"10.0.0.1 · expires in 2h · 3 workspaces\". */\n detail: string\n isTerminating: boolean\n /** Avatar glyph (monitor / bot). */\n icon?: ReactNode\n}\n\nexport interface ActiveSessionsDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n isLoading: boolean\n sessions: ActiveSessionView[]\n onTerminate: (id: string) => void\n labels?: Partial<ActiveSessionsDialogLabels>\n /** Dialog test id (default `active-sessions-dialog`). */\n testId?: string\n /**\n * Part ids; defaults are the current ids. `sessionItem` is a prefix (`<prefix>-<session id>`);\n * `terminateSession` is a prefix (`<prefix>-<session id>-button`).\n */\n testIds?: Partial<Record<'list' | 'sessionItem' | 'terminateSession', string>>\n}\n\nfunction SessionListRow({\n session,\n onTerminate,\n labels,\n testIds,\n}: {\n session: ActiveSessionView\n onTerminate: (id: string) => void\n labels: ActiveSessionsDialogLabels\n testIds?: ActiveSessionsDialogProps['testIds']\n}) {\n return (\n <div\n className=\"flex w-full items-center gap-3 border-b border-border/60 px-4 py-3 last:border-b-0\"\n data-testid={prefixedTestId(testIds?.sessionItem, session.id, {\n testId: `session-item-${session.id}`,\n })}\n >\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted\">\n {session.icon}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{session.name}</span>\n {session.isCurrent && (\n <Badge className=\"border-transparent bg-accent px-1.5 py-0 text-xs text-accent-foreground shadow-none hover:bg-accent\">\n {labels.thisDevice}\n </Badge>\n )}\n {session.isAgent && (\n <Badge variant=\"default\" className=\"px-1 py-0 text-xs\">\n {labels.agent}\n </Badge>\n )}\n </div>\n <div className=\"mt-0.5 truncate text-xs text-muted-foreground\">{session.detail}</div>\n </div>\n {!session.isCurrent && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-destructive\"\n aria-label={labels.endSession}\n onClick={() => onTerminate(session.id)}\n disabled={session.isTerminating}\n data-testid={prefixedTestId(\n testIds?.terminateSession,\n session.id,\n { testId: `terminate-session-${session.id}-button` },\n '-button'\n )}\n >\n {session.isTerminating ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <LogOut className=\"h-4 w-4\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>{labels.endSession}</TooltipContent>\n </Tooltip>\n )}\n </div>\n )\n}\n\n/**\n * Every session signed in to the account (this device, other devices, agents). Any but the current\n * one can be ended; ending the current one belongs to the Logout flow.\n */\nexport function ActiveSessionsDialog({\n open,\n onOpenChange,\n isLoading,\n sessions,\n onTerminate,\n labels,\n testId,\n testIds,\n}: ActiveSessionsDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_ACTIVE_SESSIONS_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-lg\"\n data-testid={testIdOr(testId, { testId: 'active-sessions-dialog' })}\n >\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <Radio className=\"h-6 w-6\" />\n <DialogTitle>{l.title}</DialogTitle>\n </div>\n <DialogDescription>{l.description}</DialogDescription>\n </DialogHeader>\n\n {isLoading ? (\n <div className=\"flex justify-center py-8\">\n <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n </div>\n ) : sessions.length === 0 ? (\n <p className=\"py-4 text-center text-sm text-muted-foreground\">{l.noSessions}</p>\n ) : (\n <div\n className=\"-mx-2 max-h-96 overflow-auto rounded-lg bg-muted\"\n data-testid={testIdOr(testIds?.list, { testId: 'session-list' })}\n >\n {sessions.map((session) => (\n <SessionListRow\n key={session.id}\n session={session}\n onTerminate={onTerminate}\n labels={l}\n testIds={testIds}\n />\n ))}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface DeleteAccountBlocker {\n key: string\n content: ReactNode\n}\n\nexport interface DeleteAccountDialogProps {\n open: boolean\n onClose: () => void\n step: 'warning' | 'confirm'\n /** Reasons the account cannot be deleted yet; Continue is disabled while any exist. */\n blockers: DeleteAccountBlocker[]\n onContinue: () => void\n onBack: () => void\n userEmail: string\n confirmEmail: string\n onConfirmEmailChange: (email: string) => void\n isDeleting: boolean\n onSubmit: () => void\n labels?: Partial<DeleteAccountDialogLabels>\n /** Dialog test id (default `delete-account-dialog`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'continue' | 'emailInput' | 'back' | 'submit', string>>\n}\n\n/** Two-step account deletion: a warning (with blockers), then type-your-email to confirm. */\nexport function DeleteAccountDialog({\n open,\n onClose,\n step,\n blockers,\n onContinue,\n onBack,\n userEmail,\n confirmEmail,\n onConfirmEmailChange,\n isDeleting,\n onSubmit,\n labels,\n testId,\n testIds,\n}: DeleteAccountDialogProps) {\n const confirmEmailId = useId()\n const l = useMemo(() => ({ ...DEFAULT_DELETE_ACCOUNT_DIALOG_LABELS, ...labels }), [labels])\n const emailMatches = confirmEmail.toLowerCase() === userEmail.toLowerCase()\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'delete-account-dialog' })}\n >\n {step === 'warning' ? (\n <>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <AlertTriangle className=\"h-5 w-5 text-destructive\" />\n {l.warningTitle}\n </DialogTitle>\n <DialogDescription>\n {l.warningBefore}\n <strong>{l.warningEmphasis}</strong>\n {l.warningAfter}\n </DialogDescription>\n </DialogHeader>\n {blockers.length > 0 && (\n <div className=\"rounded-md bg-yellow-bg p-3 text-sm text-yellow-text\">\n <p className=\"mb-1 font-semibold\">{l.blockersHeading}</p>\n <ul className=\"list-inside list-disc space-y-1\">\n {blockers.map((blocker) => (\n <li key={blocker.key}>{blocker.content}</li>\n ))}\n </ul>\n </div>\n )}\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.cancel, { testId: 'delete-account-cancel-button' })}\n >\n {l.cancel}\n </Button>\n <Button\n variant=\"destructive\"\n disabled={blockers.length > 0}\n onClick={onContinue}\n data-testid={testIdOr(testIds?.continue, {\n testId: 'delete-account-continue-button',\n })}\n >\n {l.continue}\n </Button>\n </div>\n </>\n ) : (\n <>\n <DialogHeader>\n <DialogTitle>{l.confirmTitle}</DialogTitle>\n <DialogDescription>{l.confirmDescription}</DialogDescription>\n </DialogHeader>\n <div>\n <label htmlFor={confirmEmailId} className=\"mb-1 block text-sm font-medium\">\n {l.yourEmail}\n </label>\n <Input\n id={confirmEmailId}\n type=\"email\"\n placeholder={userEmail}\n value={confirmEmail}\n onChange={(e) => onConfirmEmailChange(e.target.value)}\n autoFocus\n data-testid={testIdOr(testIds?.emailInput, {\n testId: 'delete-account-email-input',\n })}\n />\n </div>\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-2\">\n <Button\n variant=\"outline\"\n onClick={onBack}\n data-testid={testIdOr(testIds?.back, { testId: 'delete-account-back-button' })}\n >\n {l.back}\n </Button>\n <Button\n variant=\"destructive\"\n disabled={!emailMatches || isDeleting}\n onClick={onSubmit}\n data-testid={testIdOr(testIds?.submit, { testId: 'delete-account-submit-button' })}\n >\n {isDeleting ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.deleting}\n </>\n ) : (\n l.deleteAccount\n )}\n </Button>\n </div>\n </>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { ChevronDown, ChevronRight, LogOut, Radio } from 'lucide-react'\nimport {\n Badge,\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { useRestoreFocus } from '../lib/useRestoreFocus'\nimport { formatCount } from '../lib/format'\n\n/** Every fixed string of the logout dialog. */\nexport interface LogoutDialogLabels {\n title: string\n descriptionAll: string\n descriptionThis: string\n cancel: string\n allSessions: string\n offlineTooltip: string\n thisSession: string\n offlineNote: string\n /** Disclosure trigger: \"3 active sessions\". */\n activeSessions: (count: number) => string\n /** Session row: \"2 workspaces\". */\n workspaces: (count: number) => string\n /** Session row: \"TTL 2h\". */\n ttl: (ttlLabel: string) => string\n}\n\nexport const DEFAULT_LOGOUT_DIALOG_LABELS: LogoutDialogLabels = {\n title: 'Logout',\n descriptionAll: 'End this session or all active sessions?',\n descriptionThis: 'End this session and return to the login page.',\n cancel: 'Cancel',\n allSessions: 'All sessions',\n offlineTooltip: 'Ending all sessions needs a connection — you can still log out of this device.',\n thisSession: 'This session',\n offlineNote:\n 'You’re offline — ending all sessions needs a connection. You can still log out of this device.',\n activeSessions: (count) =>\n formatCount(count, { one: 'active session', other: 'active sessions' }),\n workspaces: (count) => formatCount(count, { one: 'workspace', other: 'workspaces' }),\n ttl: (ttlLabel) => `TTL ${ttlLabel}`,\n}\n\nexport interface LogoutSessionView {\n id: string\n /** `agent` sessions are shown with the primary badge. */\n status: string\n ipAddress?: string | null\n /** Pre-formatted remaining lifetime, e.g. \"2h\". */\n ttlLabel: string\n workspaceCount: number\n}\n\nexport interface LogoutDialogProps {\n open: boolean\n onClose: () => void\n onLogoutThis: () => void\n onLogoutAll: () => void\n /** False for agent accounts: \"All sessions\" is not offered. */\n canLogoutAll: boolean\n isOnline: boolean\n sessions: LogoutSessionView[]\n /** Icon for a session row (monitor / bot). */\n renderSessionIcon?: (status: string) => ReactNode\n labels?: Partial<LogoutDialogLabels>\n /** Dialog test id (default `logout-modal`). */\n testId?: string\n /** Part ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'all' | 'this' | 'offlineNote', string>>\n}\n\nfunction SessionRow({\n session,\n icon,\n labels,\n}: {\n session: LogoutSessionView\n icon?: ReactNode\n labels: LogoutDialogLabels\n}) {\n const { status } = session\n return (\n <div className=\"flex items-center gap-3 rounded-md bg-muted/50 px-3 py-2\">\n {icon && <div className=\"flex-shrink-0\">{icon}</div>}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <code className=\"truncate font-mono text-sm\">{session.id.slice(0, 12)}</code>\n <Badge\n variant={status === 'agent' ? 'default' : 'secondary'}\n className=\"px-1 py-0 text-sm\"\n >\n {status}\n </Badge>\n </div>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {session.ipAddress && <span>{session.ipAddress}</span>}\n <span>{labels.ttl(session.ttlLabel)}</span>\n {session.workspaceCount > 0 && <span>{labels.workspaces(session.workspaceCount)}</span>}\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Logout confirmation: end this session or all sessions, with the list of the\n * user's active sessions (including agent sessions) under a disclosure.\n * \"All sessions\" is disabled while offline because it must reach the server.\n */\nexport function LogoutDialog({\n open,\n onClose,\n onLogoutThis,\n onLogoutAll,\n canLogoutAll,\n isOnline,\n sessions,\n renderSessionIcon,\n labels,\n testId,\n testIds,\n}: LogoutDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_LOGOUT_DIALOG_LABELS, ...labels }), [labels])\n const [sessionsOpen, setSessionsOpen] = useState(false)\n const restoreFocus = useRestoreFocus()\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n {...restoreFocus}\n className=\"sm:max-w-md\"\n data-testid={testIdOr(testId, { testId: 'logout-modal' })}\n >\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <LogOut className=\"h-6 w-6\" />\n <DialogTitle>{l.title}</DialogTitle>\n </div>\n <DialogDescription className=\"text-base\">\n {canLogoutAll ? l.descriptionAll : l.descriptionThis}\n </DialogDescription>\n </DialogHeader>\n\n <DialogFooter className=\"gap-2\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.cancel, { testId: 'logout-modal-cancel-button' })}\n >\n {l.cancel}\n </Button>\n {canLogoutAll && (\n <Button\n variant=\"secondary\"\n onClick={onLogoutAll}\n disabled={!isOnline}\n title={isOnline ? undefined : l.offlineTooltip}\n data-testid={testIdOr(testIds?.all, { testId: 'logout-modal-all-button' })}\n >\n {l.allSessions}\n </Button>\n )}\n <Button\n variant=\"default\"\n onClick={onLogoutThis}\n data-testid={testIdOr(testIds?.this, { testId: 'logout-modal-this-button' })}\n >\n {l.thisSession}\n </Button>\n </DialogFooter>\n\n {canLogoutAll && !isOnline && (\n <p\n className=\"text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.offlineNote, { testId: 'logout-offline-note' })}\n >\n {l.offlineNote}\n </p>\n )}\n\n {sessions.length > 0 && (\n <Collapsible open={sessionsOpen} onOpenChange={setSessionsOpen}>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 py-1 text-left transition-opacity hover:opacity-80 pointer-coarse:py-3\">\n {sessionsOpen ? (\n <ChevronDown className=\"h-4 w-4 flex-shrink-0\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 flex-shrink-0\" />\n )}\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-muted-foreground\">\n <Radio className=\"h-3 w-3\" />\n <span>{l.activeSessions(sessions.length)}</span>\n </div>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"max-h-48 space-y-1.5 overflow-auto pt-2\">\n {sessions.map((session) => (\n <SessionRow\n key={session.id}\n session={session}\n icon={renderSessionIcon?.(session.status)}\n labels={l}\n />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Switch, cn } from '@arbidocs/react/ui'\n\nexport interface SettingsSwitchRowProps {\n /** Id of the switch; also the `htmlFor` of the label so clicking the label toggles it. */\n id: string\n title: ReactNode\n /** Leading glyph of the title. */\n icon?: ReactNode\n description?: ReactNode\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n testId?: string\n disabled?: boolean\n className?: string\n}\n\n/** One on/off setting: icon + title + help text at the start, the switch at the end. */\nexport function SettingsSwitchRow({\n id,\n title,\n icon,\n description,\n checked,\n onCheckedChange,\n testId,\n disabled,\n className,\n}: SettingsSwitchRowProps) {\n return (\n <div\n data-slot=\"settings-switch-row\"\n className={cn('flex items-center justify-between gap-4', className)}\n >\n <div className=\"min-w-0 flex-1\">\n <label htmlFor={id} className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {icon}\n {title}\n </label>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>}\n </div>\n <Switch\n id={id}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n data-testid={testId}\n />\n </div>\n )\n}\n\n/** Indented group of rows that belong to the row above (e.g. the connectors of \"Connectors\"). */\nexport function SettingsSwitchGroup({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"settings-switch-group\"\n className={cn('ml-6 space-y-4 border-l border-border pl-4', className)}\n >\n {children}\n </div>\n )\n}\n","import { Checkbox, cn } from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { SettingsSwitchRow } from './SettingsSwitchRow'\n\nexport interface NotificationCategory {\n key: string\n label: string\n description: string\n checked: boolean\n}\n\nexport interface NotificationCategoryListProps {\n /** Master switch: on while at least one category is on. */\n masterId: string\n masterTitle: string\n masterDescription: string\n masterChecked: boolean\n onMasterChange: (checked: boolean) => void\n masterTestId?: string\n categories: NotificationCategory[]\n onCategoryChange: (key: string, checked: boolean) => void\n /** Prefix of the checkbox ids (`<prefix>-<key>`); default the master id. */\n idPrefix?: string\n /** Prefix of the checkbox test ids (`<prefix>-<key>`); default `toggle-email`. */\n testIdPrefix?: string\n}\n\n/**\n * A master switch with per-category checkboxes under it. The checkboxes are greyed out and\n * disabled while the master is off.\n */\nexport function NotificationCategoryList({\n masterId,\n masterTitle,\n masterDescription,\n masterChecked,\n onMasterChange,\n masterTestId,\n categories,\n onCategoryChange,\n idPrefix = masterId,\n testIdPrefix,\n}: NotificationCategoryListProps) {\n return (\n <div data-slot=\"notification-category-list\">\n <SettingsSwitchRow\n id={masterId}\n title={masterTitle}\n description={masterDescription}\n checked={masterChecked}\n onCheckedChange={onMasterChange}\n testId={testIdOr(masterTestId, { testId: 'toggle-email-notifications' })}\n />\n <div className=\"ml-1 mt-3 space-y-3 border-l border-border pl-4 pointer-coarse:mt-5 pointer-coarse:space-y-5\">\n {categories.map((c) => (\n <label\n key={c.key}\n htmlFor={`${idPrefix}-${c.key}`}\n className={cn(\n 'flex items-start gap-3 pointer-coarse:min-h-11',\n masterChecked ? 'cursor-pointer' : 'cursor-not-allowed opacity-50'\n )}\n >\n <Checkbox\n id={`${idPrefix}-${c.key}`}\n checked={c.checked}\n disabled={!masterChecked}\n onCheckedChange={(value) => onCategoryChange(c.key, value === true)}\n data-testid={prefixedTestId(testIdPrefix, c.key, { testId: `toggle-email-${c.key}` })}\n className=\"mt-0.5 size-5 shrink-0\"\n />\n <div className=\"min-w-0\">\n <span className=\"text-sm\">{c.label}</span>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{c.description}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * Pure mappers from the account data the hooks return to the props of the settings parts\n * (`ActiveSessionsDialog`, `LogoutDialog`, `DeleteAccountDialog`, `NotificationCategoryList`).\n * No React Query, no SDK: a host with its own data layer uses them too.\n */\n\nimport type { ReactNode } from 'react'\nimport type { ActiveSessionView, DeleteAccountBlocker } from './AccountDialogs'\nimport type { LogoutSessionView } from './LogoutDialog'\nimport type { NotificationCategory } from './NotificationCategoryList'\n\n/** A session as `GET /v1/user/sessions` reports it (the fields the views read). */\nexport interface SessionLike {\n session_id: string\n name?: string | null\n ip_address?: string | null\n workspaces: readonly string[]\n status?: string | null\n /** Seconds left. */\n ttl: number\n}\n\n/** Remaining seconds as `1d 2h 3m`; `expired` at or below zero. */\nexport function formatSessionTtl(totalSeconds: number): string {\n if (totalSeconds <= 0) return 'expired'\n const days = Math.floor(totalSeconds / 86400)\n const hours = Math.floor((totalSeconds % 86400) / 3600)\n const minutes = Math.floor((totalSeconds % 3600) / 60)\n const parts: string[] = []\n if (days > 0) parts.push(`${days}d`)\n if (hours > 0) parts.push(`${hours}h`)\n if (minutes > 0) parts.push(`${minutes}m`)\n return parts.length > 0 ? parts.join(' ') : '<1m'\n}\n\nexport interface ToActiveSessionViewsOptions {\n /** This device's session id (`useCurrentSessionId`); it is listed first and cannot be ended. */\n currentSessionId: string | null\n /** The session being ended right now, for its spinner. */\n terminatingId?: string | null\n /** Glyph per status (`user` / `agent`). */\n renderIcon?: (status: string) => ReactNode\n formatTtl?: (seconds: number) => string\n}\n\n/** Sessions as `ActiveSessionsDialog` rows: this device first, a detail line, agents marked. */\nexport function toActiveSessionViews(\n sessions: readonly SessionLike[],\n {\n currentSessionId,\n terminatingId,\n renderIcon,\n formatTtl = formatSessionTtl,\n }: ToActiveSessionViewsOptions\n): ActiveSessionView[] {\n return sessions\n .map((session) => {\n const status = session.status || 'user'\n const count = session.workspaces.length\n return {\n id: session.session_id,\n name: session.name || (status === 'agent' ? 'Agent session' : 'Browser session'),\n isCurrent: session.session_id === currentSessionId,\n isAgent: status === 'agent',\n detail: `${session.ip_address ?? 'Unknown IP'} · expires in ${formatTtl(session.ttl)}${\n count > 0 ? ` · ${count} workspace${count > 1 ? 's' : ''}` : ''\n }`,\n isTerminating: terminatingId === session.session_id,\n icon: renderIcon?.(status),\n }\n })\n .sort((a, b) => Number(b.isCurrent) - Number(a.isCurrent))\n}\n\n/** Sessions as `LogoutDialog` rows. */\nexport function toLogoutSessionViews(\n sessions: readonly SessionLike[],\n formatTtl: (seconds: number) => string = formatSessionTtl\n): LogoutSessionView[] {\n return sessions.map((session) => ({\n id: session.session_id,\n status: session.status || 'user',\n ipAddress: session.ip_address,\n ttlLabel: formatTtl(session.ttl),\n workspaceCount: session.workspaces.length,\n }))\n}\n\n/** A reason the account cannot be closed yet (see `parseDeleteAccountBlockers`). */\nexport type DeleteBlockerLike =\n { type: 'active_subscription' } | { type: 'workspace_members'; workspaces: readonly string[] }\n\n/** Blockers as `DeleteAccountDialog` rows. `renderSubscriptionLink` lets the host link its billing page. */\nexport function toDeleteBlockerViews(\n blockers: readonly DeleteBlockerLike[],\n renderSubscriptionLink?: () => ReactNode\n): DeleteAccountBlocker[] {\n return blockers.flatMap<DeleteAccountBlocker>((blocker) =>\n blocker.type === 'active_subscription'\n ? [\n {\n key: 'active_subscription',\n content: renderSubscriptionLink\n ? renderSubscriptionLink()\n : 'Active subscription: cancel it in your subscription settings first',\n },\n ]\n : blocker.workspaces.map((ws) => ({\n key: `workspace-${ws}`,\n content: `You are the sole admin of workspace \"${ws}\" — transfer admin rights or remove all other members first`,\n }))\n )\n}\n\n/** One email category the user can switch: its key in the settings record and its wording. */\nexport interface EmailNotificationCategoryDef {\n key: string\n label: string\n description: string\n}\n\n/** The categories ARBI sends email for today (add one when the backend adds it). */\nexport const EMAIL_NOTIFICATION_CATEGORIES: readonly EmailNotificationCategoryDef[] = [\n { key: 'messages', label: 'New messages', description: 'A direct message while you’re offline' },\n { key: 'workspace_added', label: 'Workspace access', description: 'You’re added to a workspace' },\n {\n key: 'contact_accepted',\n label: 'Invitation accepted',\n description: 'Someone accepts your invitation',\n },\n { key: 'referral_reward', label: 'Rewards', description: 'You earn a reward' },\n {\n key: 'product_updates',\n label: 'ARBI update',\n description: 'Weekly digest of new features and highlights',\n },\n]\n\n/** The category keys, in the order the list shows them. */\nexport const EMAIL_NOTIFICATION_KEYS: readonly string[] = EMAIL_NOTIFICATION_CATEGORIES.map(\n (c) => c.key\n)\n\n/** Category definitions plus their states as `NotificationCategoryList` rows. */\nexport function toNotificationCategories(\n checked: Readonly<Record<string, boolean>>,\n defs: readonly EmailNotificationCategoryDef[] = EMAIL_NOTIFICATION_CATEGORIES\n): NotificationCategory[] {\n return defs.map((def) => ({ ...def, checked: checked[def.key] ?? true }))\n}\n"]}
|