@arbidocs/blocks 0.4.31 → 0.4.33
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/agents/index.cjs +256 -214
- package/dist/agents/index.js +7 -5
- package/dist/agents/tasks/ConversationListView.d.ts +58 -0
- package/dist/agents/tasks/ConversationTurnSpeaker.d.ts +16 -0
- package/dist/agents/tasks/NewThreadDialog.d.ts +1 -1
- package/dist/agents/tasks/TaskActivityTimeline.d.ts +1 -1
- package/dist/agents/tasks/TaskFlow.d.ts +22 -0
- package/dist/agents/tasks/TaskInbox.d.ts +26 -0
- package/dist/agents/tasks/TaskReviewDialog.d.ts +22 -0
- package/dist/agents/tasks/TaskRowMenu.d.ts +10 -2
- package/dist/agents/tasks/TaskRunsDialog.d.ts +8 -3
- package/dist/agents/tasks/TaskStartDialog.d.ts +24 -0
- package/dist/agents/tasks/TaskTable.d.ts +1 -1
- package/dist/agents/tasks/ThreadNotifyDialog.d.ts +11 -0
- package/dist/agents/tasks/WorkflowComposer.d.ts +1 -1
- package/dist/agents/tasks/WorkflowsTable.d.ts +7 -0
- package/dist/agents/tasks/compact-thread-activity.d.ts +8 -0
- package/dist/agents/tasks/index.d.ts +10 -0
- package/dist/agents/tasks/taskComposerTypes.d.ts +16 -1
- package/dist/agents/tasks/taskRequest.d.ts +1 -0
- package/dist/agents/tasks/testGrid.d.ts +24 -0
- package/dist/agents/tasks/workflowColumns.d.ts +2 -1
- package/dist/agents/tasks/workflowRows.d.ts +6 -0
- package/dist/agents/workflows/types.d.ts +2 -0
- package/dist/auth/index.cjs +27 -27
- package/dist/auth/index.js +1 -1
- package/dist/chat/Message.d.ts +8 -2
- package/dist/chat/index.cjs +132 -120
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +2 -2
- package/dist/chat/participant-tints.d.ts +1 -0
- package/dist/chat/useRecipientDraft.d.ts +14 -0
- package/dist/{chunk-KF4EC5XU.js → chunk-24KQJYSB.js} +3 -3
- package/dist/{chunk-KF4EC5XU.js.map → chunk-24KQJYSB.js.map} +1 -1
- package/dist/{chunk-GVQOBJKR.cjs → chunk-2EAE5JP6.cjs} +7 -4
- package/dist/chunk-2EAE5JP6.cjs.map +1 -0
- package/dist/{chunk-S5HZBXZA.cjs → chunk-2QTT2RZE.cjs} +242 -2
- package/dist/chunk-2QTT2RZE.cjs.map +1 -0
- package/dist/chunk-3AFWGEDJ.cjs +53 -0
- package/dist/chunk-3AFWGEDJ.cjs.map +1 -0
- package/dist/{chunk-4XJZ6AAY.js → chunk-4AWS54US.js} +244 -6
- package/dist/chunk-4AWS54US.js.map +1 -0
- package/dist/{chunk-56BUD74K.cjs → chunk-65THHQVB.cjs} +27 -27
- package/dist/{chunk-56BUD74K.cjs.map → chunk-65THHQVB.cjs.map} +1 -1
- package/dist/{chunk-5B4PXAKI.cjs → chunk-6DNYPLCD.cjs} +21 -7
- package/dist/chunk-6DNYPLCD.cjs.map +1 -0
- package/dist/{chunk-Y2LWA4ZO.js → chunk-6RXUMBTK.js} +1855 -501
- package/dist/chunk-6RXUMBTK.js.map +1 -0
- package/dist/{chunk-UTYQPVIW.cjs → chunk-7QDX2CO4.cjs} +6 -6
- package/dist/{chunk-UTYQPVIW.cjs.map → chunk-7QDX2CO4.cjs.map} +1 -1
- package/dist/{chunk-FRRDPYBR.cjs → chunk-AZ75JUIH.cjs} +74 -5
- package/dist/chunk-AZ75JUIH.cjs.map +1 -0
- package/dist/{chunk-NUPVHEJW.js → chunk-BUHKUKKB.js} +7 -4
- package/dist/chunk-BUHKUKKB.js.map +1 -0
- package/dist/chunk-C7FGONCM.js +124 -0
- package/dist/chunk-C7FGONCM.js.map +1 -0
- package/dist/{chunk-KXMDOTGW.js → chunk-DLBUFHLY.js} +10 -2
- package/dist/chunk-DLBUFHLY.js.map +1 -0
- package/dist/{chunk-ZHLMDJCO.cjs → chunk-DLVX6R6B.cjs} +62 -26
- package/dist/chunk-DLVX6R6B.cjs.map +1 -0
- package/dist/{chunk-JGZTRLKL.cjs → chunk-IA7RTPT3.cjs} +7 -4
- package/dist/chunk-IA7RTPT3.cjs.map +1 -0
- package/dist/{chunk-NJL4LIXX.js → chunk-LFGJAZ5H.js} +11 -8
- package/dist/chunk-LFGJAZ5H.js.map +1 -0
- package/dist/{chunk-IAKUTBPX.js → chunk-LYUO3E6V.js} +3 -3
- package/dist/{chunk-IAKUTBPX.js.map → chunk-LYUO3E6V.js.map} +1 -1
- package/dist/{chunk-EYPPB5CY.cjs → chunk-M2YGPC5N.cjs} +4 -4
- package/dist/{chunk-EYPPB5CY.cjs.map → chunk-M2YGPC5N.cjs.map} +1 -1
- package/dist/{chunk-5ZBP7TCD.cjs → chunk-MJCCBMM5.cjs} +10 -2
- package/dist/chunk-MJCCBMM5.cjs.map +1 -0
- package/dist/chunk-MZL67U2E.cjs +128 -0
- package/dist/chunk-MZL67U2E.cjs.map +1 -0
- package/dist/{chunk-OJSWQM4G.js → chunk-OZJ5PXA6.js} +29 -4
- package/dist/chunk-OZJ5PXA6.js.map +1 -0
- package/dist/{chunk-UBNVIIBT.js → chunk-PXFJDX2C.js} +21 -7
- package/dist/chunk-PXFJDX2C.js.map +1 -0
- package/dist/{chunk-RGHQFJOL.cjs → chunk-QFUF4A4J.cjs} +28 -2
- package/dist/chunk-QFUF4A4J.cjs.map +1 -0
- package/dist/chunk-RFXJYIDV.js +50 -0
- package/dist/chunk-RFXJYIDV.js.map +1 -0
- package/dist/{chunk-CQWRVIJC.cjs → chunk-SEQWI6E4.cjs} +1882 -517
- package/dist/chunk-SEQWI6E4.cjs.map +1 -0
- package/dist/{chunk-QN42OA5J.js → chunk-SFXVNFES.js} +4 -4
- package/dist/chunk-SFXVNFES.js.map +1 -0
- package/dist/{chunk-3NZR6PAG.js → chunk-V6U5KVAR.js} +70 -4
- package/dist/chunk-V6U5KVAR.js.map +1 -0
- package/dist/{chunk-YVIOCITQ.cjs → chunk-VUEZARW5.cjs} +3 -3
- package/dist/chunk-VUEZARW5.cjs.map +1 -0
- package/dist/{chunk-JLOYWXRB.js → chunk-VZGBCBYB.js} +3 -3
- package/dist/chunk-VZGBCBYB.js.map +1 -0
- package/dist/{chunk-ZVPTFTGV.cjs → chunk-WBDK4PIA.cjs} +11 -8
- package/dist/chunk-WBDK4PIA.cjs.map +1 -0
- package/dist/{chunk-ZORQ5M3W.cjs → chunk-WQFGG2BV.cjs} +4 -4
- package/dist/chunk-WQFGG2BV.cjs.map +1 -0
- package/dist/{chunk-C75S6USL.js → chunk-WYVCXY7R.js} +7 -4
- package/dist/chunk-WYVCXY7R.js.map +1 -0
- package/dist/{chunk-WSJVHSGN.js → chunk-XWEJ5LV2.js} +63 -27
- package/dist/chunk-XWEJ5LV2.js.map +1 -0
- package/dist/{chunk-YMHGF6R5.js → chunk-ZCF2JJFA.js} +3 -3
- package/dist/{chunk-YMHGF6R5.js.map → chunk-ZCF2JJFA.js.map} +1 -1
- package/dist/collaboration/index.cjs +45 -41
- package/dist/collaboration/index.js +1 -1
- package/dist/collaboration/mail/MailMessagePreview.d.ts +11 -0
- package/dist/collaboration/mail/index.d.ts +1 -0
- package/dist/connect/index.cjs +33 -33
- package/dist/connect/index.js +4 -4
- package/dist/facts/FactsFilterInput.d.ts +2 -46
- package/dist/facts/FactsToolbar.d.ts +5 -5
- package/dist/facts/index.cjs +27 -124
- package/dist/facts/index.cjs.map +1 -1
- package/dist/facts/index.js +13 -118
- package/dist/facts/index.js.map +1 -1
- package/dist/files/FilesPage.d.ts +1 -1
- package/dist/files/FilesToolbar.d.ts +1 -1
- package/dist/files/FolderPicker.d.ts +2 -1
- package/dist/files/ViewerChrome.d.ts +1 -1
- package/dist/files/bulk/FolderFilterButton.d.ts +3 -2
- package/dist/files/cells/BulkLabelSelect.d.ts +11 -0
- package/dist/files/cells/LabelMultiSelect.d.ts +2 -1
- package/dist/files/cells/index.d.ts +1 -0
- package/dist/files/index.cjs +108 -165
- package/dist/files/index.cjs.map +1 -1
- package/dist/files/index.js +94 -157
- package/dist/files/index.js.map +1 -1
- package/dist/home/index.cjs +19 -19
- package/dist/home/index.cjs.map +1 -1
- package/dist/home/index.js +4 -4
- package/dist/home/index.js.map +1 -1
- package/dist/index.cjs +790 -767
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +20 -68
- package/dist/index.js.map +1 -1
- package/dist/settings/SettingsPanel.d.ts +1 -1
- package/dist/settings/index.cjs +55 -280
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.js +17 -248
- package/dist/settings/index.js.map +1 -1
- package/dist/shell/FilterInput.d.ts +46 -0
- package/dist/shell/TabHeader.d.ts +5 -1
- package/dist/shell/index.cjs +61 -48
- package/dist/shell/index.d.ts +1 -0
- package/dist/shell/index.js +3 -2
- package/dist/site/index.cjs +62 -62
- package/dist/site/index.js +2 -2
- package/dist/studio/index.cjs +74 -74
- package/dist/studio/index.js +5 -5
- package/dist/workspaces/WorkspaceCard.d.ts +2 -2
- package/dist/workspaces/index.cjs +9 -2
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.js +9 -2
- package/dist/workspaces/index.js.map +1 -1
- package/package.json +3 -3
- package/src/blocks.css +4 -0
- package/src/components/grid.css +10 -0
- package/dist/chunk-3NZR6PAG.js.map +0 -1
- package/dist/chunk-4XJZ6AAY.js.map +0 -1
- package/dist/chunk-5B4PXAKI.cjs.map +0 -1
- package/dist/chunk-5ZBP7TCD.cjs.map +0 -1
- package/dist/chunk-C75S6USL.js.map +0 -1
- package/dist/chunk-CQWRVIJC.cjs.map +0 -1
- package/dist/chunk-FRRDPYBR.cjs.map +0 -1
- package/dist/chunk-GVQOBJKR.cjs.map +0 -1
- package/dist/chunk-JGZTRLKL.cjs.map +0 -1
- package/dist/chunk-JLOYWXRB.js.map +0 -1
- package/dist/chunk-KXMDOTGW.js.map +0 -1
- package/dist/chunk-NJL4LIXX.js.map +0 -1
- package/dist/chunk-NUPVHEJW.js.map +0 -1
- package/dist/chunk-OJSWQM4G.js.map +0 -1
- package/dist/chunk-QN42OA5J.js.map +0 -1
- package/dist/chunk-RGHQFJOL.cjs.map +0 -1
- package/dist/chunk-S5HZBXZA.cjs.map +0 -1
- package/dist/chunk-UBNVIIBT.js.map +0 -1
- package/dist/chunk-WSJVHSGN.js.map +0 -1
- package/dist/chunk-Y2LWA4ZO.js.map +0 -1
- package/dist/chunk-YVIOCITQ.cjs.map +0 -1
- package/dist/chunk-ZHLMDJCO.cjs.map +0 -1
- package/dist/chunk-ZORQ5M3W.cjs.map +0 -1
- package/dist/chunk-ZVPTFTGV.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/collaboration/members/WorkspaceMembers.tsx","../src/collaboration/contacts/parseEmails.ts","../src/collaboration/contacts/AddContactsParts.tsx","../src/collaboration/contacts/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"],"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"],"mappings":"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","file":"chunk-RGHQFJOL.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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/settings/DocumentPicker.tsx","../src/settings/MultiSelect.tsx"],"names":["useMemo","useState","useEffect","useRef","jsx","Checkbox","Check","cn","jsxs","Fragment","CommandEmpty","CommandGroup","CommandItem","Command","Popover","PopoverAnchor","Search","CommandPrimitive","PopoverContent","CommandList","PopoverTrigger","ChevronsUpDown","CommandInput","TriangleAlert","React","Button","ChevronDown","CheckIcon","CommandSeparator","Separator","WandSparkles"],"mappings":"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","file":"chunk-S5HZBXZA.cjs","sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Check, ChevronsUpDown, Search, TriangleAlert } from 'lucide-react'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport {\n Checkbox,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n cn,\n getDocIcon,\n} from '@arbidocs/react/ui'\n\nconst TOKEN_WARNING_THRESHOLD = 150_000\nconst TOKEN_DANGER_THRESHOLD = 190_000\n\n/** A document the picker can offer. `pages`/`tokens` are null for images and unparsed files. */\nexport interface PickerDocument {\n id: string\n title: string\n fileName?: string | null\n pages?: number | null\n tokens?: number | null\n}\n\n/** A heading with its documents, already sorted. A group without heading is unlabeled. */\nexport interface PickerGroup {\n id: string\n heading?: string\n docs: PickerDocument[]\n}\n\n/** Every fixed string of the document picker. */\nexport interface DocumentPickerLabels {\n placeholder: string\n searchDocuments: string\n noDocuments: string\n selectedAsSource: string\n selectAsSource: string\n largeDocument: string\n tooLong: string\n pages: (n: number) => string\n tokens: (n: number) => string\n}\n\nexport const DEFAULT_DOCUMENT_PICKER_LABELS: DocumentPickerLabels = {\n placeholder: 'Select a document',\n searchDocuments: 'Search documents...',\n noDocuments: 'No documents found.',\n selectedAsSource: 'Selected as source',\n selectAsSource: 'Select as source',\n largeDocument: 'Large document — may take longer to process',\n tooLong: 'Document is too long to be read in its entirety',\n pages: (n) => `${n.toLocaleString()} pages`,\n tokens: (n) => `${n.toLocaleString()} tokens`,\n}\n\nexport interface DocumentPickerProps {\n groups: PickerGroup[]\n /** The picked document (single mode). */\n value: string\n onValueChange: (id: string) => void\n /** The picked document's details, shown under the picker (pages, tokens, size warnings). */\n selected?: PickerDocument\n /**\n * Ids already chosen. Supplying this switches to MULTI mode: the search box is inline, the\n * list stays open on select and ticks what is in.\n */\n selectedIds?: string[]\n /**\n * Splits each row in two: a click OPENS the document (this callback) and a leading checkbox\n * selects it as a source via `onValueChange`. Requires `selectedIds`.\n */\n onOpenDocument?: (id: string) => void\n /** The document open in the viewer: its row is inverted (multi mode). */\n viewingId?: string | null\n /** While true the list is shut (a neighbouring popup must not overlay it). */\n forceClosed?: boolean\n /** Extra classes of the results list, e.g. a taller `max-h-*` when the picker is the surface. */\n listClassName?: string\n labels?: Partial<DocumentPickerLabels>\n}\n\n/**\n * Searchable document picker. Single mode is a button that opens a searchable list; multi mode\n * puts the search inline. After a pick it shows page/token counts with size warnings.\n */\nexport function DocumentPicker({\n groups,\n value,\n onValueChange,\n selected,\n selectedIds,\n onOpenDocument,\n viewingId,\n forceClosed = false,\n listClassName,\n labels,\n}: DocumentPickerProps) {\n const l = useMemo(() => ({ ...DEFAULT_DOCUMENT_PICKER_LABELS, ...labels }), [labels])\n const multi = selectedIds !== undefined\n const isChosen = (id: string) => (multi ? selectedIds.includes(id) : value === id)\n const [open, setOpen] = useState(false)\n useEffect(() => {\n if (forceClosed) setOpen(false)\n }, [forceClosed])\n const anchorRef = useRef<HTMLDivElement>(null)\n\n // A real checkbox when rows open on click; otherwise the tick that mirrors the pick.\n const leadingControl = (id: string): ReactNode =>\n onOpenDocument ? (\n // cmdk selects a row on click and prevents its mousedown (to keep input focus), which would\n // swallow a checkbox press. Stopping the events lets the checkbox toggle on its own.\n <span\n className=\"mr-2 flex items-center\"\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={isChosen(id)}\n onCheckedChange={() => onValueChange(id)}\n aria-label={isChosen(id) ? l.selectedAsSource : l.selectAsSource}\n data-testid={`document-combobox-select-${id}`}\n />\n </span>\n ) : (\n <Check className={cn('mr-2 size-4', isChosen(id) ? 'opacity-100' : 'opacity-0')} />\n )\n\n const itemClass = (id: string) =>\n cn(\n onOpenDocument && 'cursor-pointer',\n onOpenDocument && isChosen(id) && 'bg-primary/10 aria-selected:bg-primary/15',\n // Inverted so the open one is unmistakable, over cmdk's own hover tint.\n viewingId === id &&\n 'bg-foreground text-background data-[selected=true]:bg-foreground data-[selected=true]:text-background'\n )\n\n const renderGroups = () => (\n <>\n <CommandEmpty>{l.noDocuments}</CommandEmpty>\n {groups.map((group) => (\n <CommandGroup key={group.id} heading={group.heading}>\n {group.docs.map((doc) => (\n <CommandItem\n key={doc.id}\n // Identity is the id: two documents can share a name, and a title-valued item would\n // make cmdk treat them as one. The title stays searchable via keywords.\n value={doc.id}\n keywords={[doc.title]}\n className={itemClass(doc.id)}\n onSelect={() => {\n if (onOpenDocument) {\n onOpenDocument(doc.id)\n return\n }\n onValueChange(doc.id)\n if (!multi) setOpen(false)\n }}\n >\n {leadingControl(doc.id)}\n <span className=\"mr-2 flex shrink-0 items-center\">\n {getDocIcon(doc.fileName ?? undefined)}\n </span>\n <span className={cn('truncate', onOpenDocument && 'hover:underline')}>\n {doc.title}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </>\n )\n\n const contentClass = 'w-[var(--radix-popover-trigger-width)] border-0 bg-muted p-0 shadow-md'\n const tokens = selected?.tokens ?? null\n const pages = selected?.pages ?? null\n const isDanger = tokens != null && tokens > TOKEN_DANGER_THRESHOLD\n const isWarning = tokens != null && tokens > TOKEN_WARNING_THRESHOLD && !isDanger\n\n return (\n <div data-slot=\"document-picker\">\n {multi ? (\n // The input IS the anchor: the list opens beneath the row as soon as it is focused or\n // typed into. cmdk's context reaches the portaled list, so arrows/Enter still drive it.\n <Command>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverAnchor asChild>\n <div\n ref={anchorRef}\n className=\"flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 shadow-sm transition-colors focus-within:ring-1 focus-within:ring-ring pointer-coarse:h-11\"\n data-testid=\"document-combobox-trigger\"\n >\n <Search className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n placeholder={l.placeholder}\n aria-expanded={open}\n className=\"h-full w-full bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n onFocus={() => setOpen(true)}\n onValueChange={() => setOpen(true)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') setOpen(true)\n if (e.key === 'Escape') setOpen(false)\n }}\n data-testid=\"document-combobox-search\"\n />\n </div>\n </PopoverAnchor>\n <PopoverContent\n className={contentClass}\n align=\"start\"\n // Focus stays in the inline input, and opening a document hands focus to the viewer:\n // neither may count as an outside click. Pointer-downs in the viewer, dialogs and\n // poppers are ignored; Escape and any other outside click still close the list.\n onOpenAutoFocus={(e) => e.preventDefault()}\n onFocusOutside={(e) => e.preventDefault()}\n onInteractOutside={(e) => {\n const target = e.target as Element | null\n if (\n anchorRef.current?.contains(target) ||\n target?.closest(\n '[data-testid=\"parsed-viewer\"], [role=\"dialog\"], [data-radix-popper-content-wrapper]'\n )\n ) {\n e.preventDefault()\n }\n }}\n >\n <CommandList className={listClassName}>{renderGroups()}</CommandList>\n </PopoverContent>\n </Popover>\n </Command>\n ) : (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\n 'flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring md:text-sm pointer-coarse:h-11',\n !value && 'text-muted-foreground'\n )}\n data-testid=\"document-combobox-trigger\"\n >\n <span className=\"truncate\">{selected?.title || l.placeholder}</span>\n <ChevronsUpDown className=\"ml-2 size-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className={contentClass} align=\"start\">\n <Command>\n <CommandInput placeholder={l.searchDocuments} />\n <CommandList className={listClassName}>{renderGroups()}</CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )}\n\n {selected && (\n <div className=\"mt-2 space-y-1\" data-testid=\"document-combobox-info\">\n <p className=\"text-sm text-muted-foreground\">\n {pages != null && <span>{l.pages(pages)}</span>}\n {pages != null && tokens != null && <span> · </span>}\n {tokens != null && <span>{l.tokens(tokens)}</span>}\n </p>\n {isWarning && (\n <p\n className=\"flex items-center gap-1.5 text-sm text-yellow-text\"\n data-testid=\"document-combobox-warning\"\n >\n <TriangleAlert className=\"size-3.5 shrink-0\" />\n {l.largeDocument}\n </p>\n )}\n {isDanger && (\n <p\n className=\"flex items-center gap-1.5 text-sm text-red-text\"\n data-testid=\"document-combobox-danger\"\n >\n <TriangleAlert className=\"size-3.5 shrink-0\" />\n {l.tooLong}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { CheckIcon, ChevronDown, WandSparkles } from 'lucide-react'\n\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Separator,\n cn,\n} from '@arbidocs/react/ui'\n\n/**\n * Variants for the multi-select component to handle different styles.\n * Uses class-variance-authority (cva) to define different styles based on \"variant\" prop.\n */\n\n/**\n * Props for MultiSelect component\n */\ninterface MultiSelectProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n /**\n * An array of option objects to be displayed in the multi-select component.\n * Each option object has a label, value, and an optional icon.\n */\n data: {\n /** The text to display for the option. */\n label: string\n /** The unique value associated with the option. */\n value: string\n /** Optional icon component to display alongside the option. */\n icon?: React.ComponentType<{ className?: string }>\n }[]\n\n /**\n * Current selected values.\n */\n value: string[]\n\n /**\n * Callback function triggered when the selected values change.\n * Receives an array of the new selected values.\n */\n onChange: (value: string[]) => void\n\n /**\n * Current search value for filtering options.\n */\n searchValue?: string\n\n /**\n * Callback function triggered when the search value changes.\n */\n onSearchChange?: (value: string) => void\n\n /**\n * Placeholder text to be displayed when no values are selected.\n * Optional, defaults to \"Select options\".\n */\n placeholder?: string\n\n /**\n * Whether the component is searchable.\n */\n searchable?: boolean\n\n /**\n * Whether the component is clearable.\n */\n clearable?: boolean\n\n /**\n * Size of the component.\n */\n size?: 'sm' | 'md' | 'lg'\n\n /**\n * Whether the component should auto focus.\n */\n autoFocus?: boolean\n\n /**\n * Callback triggered when dropdown opens.\n */\n onDropdownOpen?: () => void\n\n /**\n * Callback triggered when dropdown closes.\n */\n onDropdownClose?: () => void\n\n /**\n * Custom render function for options.\n */\n renderOption?: (params: {\n option: { label: string; value: string; icon?: React.ComponentType<{ className?: string }> }\n checked: boolean\n }) => React.ReactNode\n\n /**\n * Animation duration in seconds for the visual effects (e.g., bouncing badges).\n * Optional, defaults to 0 (no animation).\n */\n animation?: number\n\n /**\n * Maximum number of items to display. Extra selected items will be summarized.\n * Optional, defaults to 3.\n */\n maxCount?: number\n\n /**\n * The modality of the popover. When set to true, interaction with outside elements\n * will be disabled and only popover content will be visible to screen readers.\n * Optional, defaults to false.\n */\n modalPopover?: boolean\n\n /**\n * If true, renders the multi-select component as a child of another component.\n * Optional, defaults to false.\n */\n asChild?: boolean\n\n /**\n * Additional class names to apply custom styles to the multi-select component.\n * Optional, can be used to add custom styles.\n */\n className?: string\n}\n\nexport const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(\n (\n {\n data,\n value,\n onChange,\n searchValue,\n onSearchChange,\n placeholder = 'Select options',\n searchable = false,\n clearable = false,\n size = 'md',\n autoFocus = false,\n onDropdownOpen,\n onDropdownClose,\n renderOption,\n animation = 0,\n modalPopover = false,\n className,\n ...props\n },\n ref\n ) => {\n const [isPopoverOpen, setIsPopoverOpen] = React.useState(false)\n const [internalSearchValue, setInternalSearchValue] = React.useState('')\n\n const currentSearchValue = searchValue ?? internalSearchValue\n\n React.useEffect(() => {\n if (isPopoverOpen && onDropdownOpen) {\n onDropdownOpen()\n } else if (!isPopoverOpen && onDropdownClose) {\n onDropdownClose()\n }\n }, [isPopoverOpen, onDropdownOpen, onDropdownClose])\n\n // Handle autoFocus - open dropdown immediately when component mounts\n React.useEffect(() => {\n if (autoFocus) {\n setIsPopoverOpen(true)\n }\n }, [autoFocus])\n\n const handleSearchValueChange = (newValue: string) => {\n if (onSearchChange) {\n onSearchChange(newValue)\n } else {\n setInternalSearchValue(newValue)\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case 'sm':\n return 'min-h-8 text-sm'\n case 'lg':\n return 'min-h-12 text-base'\n default:\n return 'min-h-10 text-sm'\n }\n }\n\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n setIsPopoverOpen(true)\n } else if (event.key === 'Backspace' && !event.currentTarget.value) {\n const newSelectedValues = [...value]\n newSelectedValues.pop()\n onChange(newSelectedValues)\n }\n }\n\n const toggleOption = (optionValue: string) => {\n const newSelectedValues = value.includes(optionValue)\n ? value.filter((v) => v !== optionValue)\n : [...value, optionValue]\n onChange(newSelectedValues)\n }\n\n const handleClear = () => {\n onChange([])\n }\n\n const toggleAll = () => {\n if (value.length === data.length) {\n handleClear()\n } else {\n const allValues = data.map((option) => option.value)\n onChange(allValues)\n }\n }\n\n return (\n <Popover open={isPopoverOpen} onOpenChange={setIsPopoverOpen} modal={modalPopover}>\n <PopoverTrigger asChild>\n <Button\n ref={ref}\n {...props}\n variant=\"outline\"\n className={cn(\n 'flex w-full p-1 rounded-md border h-auto items-center justify-between bg-background hover:bg-accent [&_svg]:pointer-events-auto',\n getSizeClasses(),\n className\n )}\n data-testid=\"multi-select-trigger\"\n >\n <div className=\"flex items-center justify-between w-full mx-auto\">\n <span className=\"text-sm text-muted-foreground mx-3\">{placeholder}</span>\n <ChevronDown className=\"h-4 cursor-pointer text-muted-foreground mx-2\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[var(--radix-popover-trigger-width)] p-0\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n >\n <Command shouldFilter={true}>\n {searchable && (\n <CommandInput\n placeholder=\"Search...\"\n value={currentSearchValue}\n onValueChange={handleSearchValueChange}\n onKeyDown={handleInputKeyDown}\n autoFocus={autoFocus}\n />\n )}\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n <CommandItem\n key=\"all\"\n onSelect={toggleAll}\n className=\"cursor-pointer\"\n data-testid=\"multi-select-all-option\"\n >\n <div\n className={cn(\n 'mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary',\n value.length === data.length\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <CheckIcon className=\"h-4 w-4\" />\n </div>\n <span>(Select All)</span>\n </CommandItem>\n {data.map((option) => {\n const isSelected = value.includes(option.value)\n return (\n <CommandItem\n key={option.value}\n value={option.label}\n onSelect={() => toggleOption(option.value)}\n className=\"cursor-pointer\"\n data-testid={`multi-select-option-${option.value}`}\n >\n {renderOption ? (\n renderOption({ option, checked: isSelected })\n ) : (\n <>\n <div\n className={cn(\n 'mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary',\n isSelected\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <CheckIcon className=\"h-4 w-4\" />\n </div>\n {option.icon && (\n <option.icon className=\"mr-2 h-4 w-4 text-muted-foreground\" />\n )}\n <span>{option.label}</span>\n </>\n )}\n </CommandItem>\n )\n })}\n </CommandGroup>\n <CommandSeparator />\n <CommandGroup>\n <div className=\"flex items-center justify-between\">\n {clearable && value.length > 0 && (\n <>\n <CommandItem\n onSelect={handleClear}\n className=\"flex-1 justify-center cursor-pointer\"\n data-testid=\"multi-select-clear-button\"\n >\n Clear\n </CommandItem>\n <Separator orientation=\"vertical\" className=\"flex min-h-6 h-full\" />\n </>\n )}\n <CommandItem\n onSelect={() => setIsPopoverOpen(false)}\n className=\"flex-1 justify-center cursor-pointer max-w-full\"\n data-testid=\"multi-select-close-button\"\n >\n Close\n </CommandItem>\n </div>\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n {animation > 0 && value.length > 0 && (\n <WandSparkles className=\"cursor-pointer my-2 text-muted-foreground bg-background w-3 h-3\" />\n )}\n </Popover>\n )\n }\n)\n\nMultiSelect.displayName = 'MultiSelect'\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shell/TabHeader.tsx"],"names":[],"mappings":"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","file":"chunk-UBNVIIBT.js","sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { X } from 'lucide-react'\nimport { Badge, cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { observeResize } from '../lib/observe-resize'\n\n/** Fixed strings of the tab row. */\nexport interface TabHeaderLabels {\n /** A tab's close button (a tab's own `closeTooltip` wins). */\n closeTab: string\n}\n\nexport const DEFAULT_TAB_HEADER_LABELS: TabHeaderLabels = {\n closeTab: 'Close tab',\n}\n\nexport interface Tab {\n id: string\n label: string | ReactNode\n testId?: string\n icon?: ReactNode\n /**\n * An entity pill (conversation, workspace, …) shown in place of the icon + label. The app\n * renders it, so the block stays free of entity components.\n */\n pill?: ReactNode\n count?: number\n /** Where the count sits relative to the label. Defaults to 'trailing'. */\n countPlacement?: 'leading' | 'trailing'\n /** Glyph INSIDE the count, in front of the number, so icon and count read as one object. */\n countIcon?: ReactNode\n badge?: string | ReactNode\n disabled?: boolean\n tooltip?: string\n actions?: ReactNode\n /** Hover handlers from actions (e.g. a filter dropdown), attached to the whole tab wrapper. */\n actionsHoverHandlers?: { onMouseEnter: () => void; onMouseLeave: () => void }\n isProcessing?: boolean\n isVariable?: boolean\n onClose?: () => void\n closeTooltip?: string\n hasActiveFilters?: boolean\n /** Extra classes for the tab button. */\n tabClassName?: string\n}\n\n/** Forces buttons in a header section to a uniform compact size (28px, 14px text). */\nconst COMPACT_SECTION =\n '[&_button]:h-7 [&_button]:px-2 [&_button]:py-0 [&_button]:text-sm [&_button]:font-medium ' +\n '[&_[role=button]]:h-7 [&_[role=button]]:px-2 [&_[role=button]]:py-0 [&_[role=button]]:text-sm [&_[role=button]]:font-medium ' +\n // Touch: the compact 28px floor is lifted to 44px (important beats the rules above).\n 'pointer-coarse:[&_button]:h-11! pointer-coarse:[&_[role=button]]:h-11!'\n\ninterface TabButtonProps {\n tab: Tab\n isActive: boolean\n /** Closable-items row: a soft chip with a close button instead of an underline. */\n isChip: boolean\n isCompact: boolean\n onTabChange: (tabId: string) => void\n labels: TabHeaderLabels\n testIds?: TabHeaderProps['testIds']\n}\n\nfunction TabButton({\n tab,\n isActive,\n isChip,\n isCompact,\n onTabChange,\n labels,\n testIds,\n}: TabButtonProps) {\n // Compact mode (narrow header) collapses every INACTIVE tab that has an icon to icon-only so\n // the trailing controls are never pushed off the edge. The active tab keeps a truncated title:\n // otherwise two icon-only tabs cannot be told apart on a phone. Collapsed tabs keep an\n // accessible name and a title with their label; label-only tabs keep their text.\n const hideLabel = isCompact && !!tab.icon && !isActive\n const handleClick = useCallback(() => {\n if (!tab.disabled) onTabChange(tab.id)\n }, [tab.disabled, tab.id, onTabChange])\n\n // div+role=button needs explicit keyboard handling; Space must not scroll the page.\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (tab.disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onTabChange(tab.id)\n }\n },\n [tab.disabled, tab.id, onTabChange]\n )\n\n const handleClose = useCallback(\n (e: MouseEvent) => {\n e.stopPropagation()\n tab.onClose?.()\n },\n [tab]\n )\n\n // Two looks, chosen by the row: a row that holds closable items (conversations, open panels)\n // shows soft chips, the active one filled, so \"close\" has an obvious owner. Every other row is a\n // plain underline: ink text + a 2px primary underline for the active tab, nothing else.\n const className = cn(\n 'group relative z-[1] flex pointer-coarse:h-11 cursor-pointer items-center justify-start text-left text-sm transition-colors',\n isChip\n ? 'h-8 max-w-[260px] rounded-md px-2.5'\n : 'h-9 max-w-[320px] border-b-2 bg-transparent px-2.5',\n isChip\n ? isActive\n ? 'bg-muted font-semibold text-foreground'\n : 'bg-transparent font-medium text-muted-foreground hover:bg-muted/60 hover:text-foreground'\n : isActive\n ? 'border-b-primary font-semibold text-foreground'\n : 'border-b-transparent font-medium text-muted-foreground hover:text-foreground',\n // Touch: an icon-only tab still meets the 44px target; a titled active tab truncates.\n isCompact && tab.icon && (isActive ? 'max-w-[45vw]' : 'pointer-coarse:min-w-11 justify-center'),\n tab.disabled && 'cursor-not-allowed opacity-50',\n tab.tabClassName\n )\n\n const countBadge =\n tab.count === undefined ? null : (\n // A plain muted number, a footnote to the label. A filtered count switches to primary ink so\n // \"this is narrowed\" still reads without a fill.\n <span\n data-testid={testIdOr(testIds?.count, { testId: 'tab-count' })}\n className={cn(\n 'flex-shrink-0 items-center justify-center gap-1 font-normal leading-none tabular-nums',\n tab.countIcon ? 'text-sm' : 'text-xs',\n tab.countPlacement === 'leading' ? 'mr-1.5' : 'ml-1.5',\n // Compact rows drop counts to save width, but a tab whose glyph lives in the count has\n // nothing else to show: there the count IS the tab.\n isCompact && !tab.countIcon ? 'hidden' : 'inline-flex',\n tab.hasActiveFilters ? 'font-semibold text-primary' : 'text-muted-foreground'\n )}\n >\n {tab.countIcon && (\n <span aria-hidden className=\"flex shrink-0 items-center justify-center\">\n {tab.countIcon}\n </span>\n )}\n {tab.isProcessing ? <span className=\"animate-pulse\">{tab.count}</span> : tab.count}\n </span>\n )\n\n const content = tab.pill ? (\n // The outer wrapper hosts the processing dot outside the pill's bounds; the inner span keeps\n // the truncation the pill needs without clipping the dot.\n <span className=\"relative inline-flex min-w-0 items-center\">\n <span className=\"min-w-0 truncate overflow-hidden\">{tab.pill}</span>\n {tab.isProcessing && (\n <span className=\"absolute -right-1 -top-1 size-2 rounded-full border border-background bg-yellow-solid\" />\n )}\n </span>\n ) : (\n <>\n {tab.icon && (\n <span\n className={cn(\n 'flex size-5 flex-shrink-0 items-center justify-center',\n !hideLabel && 'mr-1.5'\n )}\n >\n {tab.icon}\n </span>\n )}\n {tab.countPlacement === 'leading' && countBadge}\n <span className={cn('truncate', hideLabel ? 'hidden' : 'inline')}>{tab.label}</span>\n {tab.countPlacement !== 'leading' && countBadge}\n {tab.badge &&\n (typeof tab.badge === 'string' ? (\n <Badge\n variant=\"outline\"\n className={cn('ml-1.5 truncate', isCompact ? 'max-w-[120px]' : 'max-w-none')}\n >\n {tab.badge}\n </Badge>\n ) : (\n <span className=\"ml-1.5 inline-flex items-center\">{tab.badge}</span>\n ))}\n </>\n )\n\n return (\n <div\n className={cn('flex items-end', isChip && 'pb-1')}\n data-testid={testIdOr(tab.testId, { testId: `${tab.id}-tab` })}\n onMouseEnter={tab.actionsHoverHandlers?.onMouseEnter}\n onMouseLeave={tab.actionsHoverHandlers?.onMouseLeave}\n >\n {/* role=button on a div, not a <button>: a tab whose badge holds a real interactive element\n (an entity tooltip trigger) would otherwise nest a button inside a button. */}\n <div\n role=\"button\"\n tabIndex={tab.disabled ? -1 : 0}\n aria-disabled={tab.disabled || undefined}\n aria-current={isActive ? 'true' : undefined}\n data-slot=\"tab\"\n data-state={isActive ? 'active' : 'inactive'}\n // Icon-only tabs expose the label for a11y and as a native title.\n aria-label={hideLabel && typeof tab.label === 'string' ? tab.label : undefined}\n title={hideLabel && !tab.tooltip && typeof tab.label === 'string' ? tab.label : undefined}\n className={className}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {content}\n {tab.actions && (\n <span className=\"ml-auto flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\n {tab.actions}\n </span>\n )}\n {tab.onClose && (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'ml-0.5 inline-flex !size-4 flex-shrink-0 items-center justify-center rounded-sm !p-0 text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground pointer-coarse:!size-11',\n // A chip row keeps the close button quiet until the chip is the active one or is\n // hovered or focused; touch always shows it (there is no hover).\n isChip &&\n !isActive &&\n 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 pointer-coarse:opacity-100'\n )}\n onClick={handleClose}\n aria-label={tab.closeTooltip || labels.closeTab}\n data-testid={testIdOr(testIds?.closeButton, { testId: 'close-tab-button' })}\n >\n <X className=\"size-3\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tab.closeTooltip || labels.closeTab}</p>\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n )\n}\n\nexport interface TabHeaderProps {\n tabs: Tab[]\n activeTabId: string\n onTabChange: (tabId: string) => void\n /** Pinned to the far left before the tabs (e.g. the sidebar toggle). */\n leading?: ReactNode\n leftContent?: ReactNode\n afterTabs?: ReactNode | ((isCompact: boolean) => ReactNode)\n centerContent?: ReactNode | ((isCompact: boolean) => ReactNode)\n /** Pinned to the true horizontal center of the row, independent of left/right widths. */\n absoluteCenterContent?: ReactNode\n rightContent?: ReactNode | ((isCompact: boolean) => ReactNode)\n className?: string\n /** Header width below which tabs collapse to icons. */\n compactBreakpoint?: number\n labels?: Partial<TabHeaderLabels>\n /**\n * `chips` renders every tab as a soft chip (for rows of closable items), `underline` as a plain\n * underline tab. Default: chips when any tab can be closed, underline otherwise.\n */\n variant?: 'underline' | 'chips'\n /** Root id (default `tab-header`). */\n testId?: string\n /**\n * Per-tab ids; defaults are the current ids. A tab's own id is `Tab.testId`, else `<tab id>-tab`\n * (structural).\n */\n testIds?: Partial<Record<'count' | 'closeButton', string>>\n}\n\n/** Underline tab row with leading / center / right slots; collapses to icons when narrow. */\nexport function TabHeader({\n tabs,\n activeTabId,\n onTabChange,\n leading,\n leftContent,\n afterTabs,\n centerContent,\n absoluteCenterContent,\n rightContent,\n className,\n compactBreakpoint = 640,\n labels,\n variant,\n testId,\n testIds,\n}: TabHeaderProps) {\n const mergedLabels = { ...DEFAULT_TAB_HEADER_LABELS, ...labels }\n const isChipRow = variant ? variant === 'chips' : tabs.some((tab) => !!tab.onClose)\n const containerRef = useRef<HTMLDivElement>(null)\n const scrollerRef = useRef<HTMLDivElement>(null)\n const [isCompact, setIsCompact] = useState(false)\n const [canScrollEnd, setCanScrollEnd] = useState(false)\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n return observeResize(container, (entries) => {\n for (const entry of entries) setIsCompact(entry.contentRect.width < compactBreakpoint)\n })\n }, [compactBreakpoint])\n\n // Overflow cue: track whether tabs are hidden past the trailing edge.\n useEffect(() => {\n const scroller = scrollerRef.current\n if (!scroller) return\n const update = () =>\n setCanScrollEnd(scroller.scrollLeft + scroller.clientWidth < scroller.scrollWidth - 1)\n update()\n scroller.addEventListener('scroll', update, { passive: true })\n const stopObserving = observeResize(scroller, update)\n return () => {\n scroller.removeEventListener('scroll', update)\n stopObserving()\n }\n }, [tabs.length])\n\n // Keep the active tab visible when it changes (or on first render) in a scrolling row.\n useEffect(() => {\n const active = scrollerRef.current?.querySelector('[data-slot=\"tab\"][data-state=\"active\"]')\n if (active && typeof active.scrollIntoView === 'function') {\n active.scrollIntoView({ inline: 'nearest', block: 'nearest' })\n }\n }, [activeTabId])\n\n return (\n <div\n ref={containerRef}\n className={cn('w-full bg-background pt-1 pb-2', className)}\n data-slot=\"tab-header\"\n data-testid={testIdOr(testId, { testId: 'tab-header' })}\n >\n <div className=\"relative bg-background\">\n {/* The hairline lives on this non-scrolling wrapper: overflow-y-hidden on the scroll row\n would clip the active tab's underline overhang. The tabs paint over the line. */}\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-x-0 bottom-0 h-px bg-border\"\n />\n {/* overflow-y-hidden is mandatory: overflow-x-auto alone makes the browser compute\n overflow-y to `auto` too, surfacing a phantom vertical scrollbar from sub-pixel\n overflow (e.g. the processing dot's -top-1). pt-1 keeps that dot inside the clip box. */}\n <div className=\"relative flex min-h-[40px] items-end justify-between gap-4\">\n {/* Leading slot: placed in the left margin (the pl-8 gap), claiming no extra width. */}\n {leading && (\n <div className=\"absolute bottom-1.5 left-1.5 z-10 flex items-center\">{leading}</div>\n )}\n {/* Only the tabs scroll: the center and right slots sit outside the scroller so they can\n never overlap a tab, and a fade at the trailing edge signals that more tabs exist. */}\n <div className=\"relative flex min-w-0 flex-shrink items-end\">\n <div\n ref={scrollerRef}\n data-slot=\"tab-scroller\"\n className={cn(\n 'flex min-w-0 items-end overflow-x-auto overflow-y-hidden pt-1',\n leading ? 'pl-8' : 'pl-3'\n )}\n >\n {leftContent || (\n <div className=\"flex items-end gap-1\">\n {tabs.map((tab) => {\n const tabButton = (\n <TabButton\n key={tab.id}\n tab={tab}\n isActive={activeTabId === tab.id}\n isChip={isChipRow}\n // A lone tab competes with nothing: its label is the surface's title.\n isCompact={isCompact && tabs.length > 1}\n onTabChange={onTabChange}\n labels={mergedLabels}\n testIds={testIds}\n />\n )\n if (!tab.tooltip) return tabButton\n return (\n <Tooltip key={tab.id}>\n <TooltipTrigger asChild>{tabButton}</TooltipTrigger>\n {/* Below: the header can sit at the very top of the viewport. */}\n <TooltipContent side=\"bottom\">\n <p>{tab.tooltip}</p>\n </TooltipContent>\n </Tooltip>\n )\n })}\n {afterTabs && (\n <div className={cn('self-center', COMPACT_SECTION)}>\n {typeof afterTabs === 'function' ? afterTabs(isCompact) : afterTabs}\n </div>\n )}\n </div>\n )}\n </div>\n {canScrollEnd && (\n <span\n aria-hidden\n data-slot=\"tab-scroll-cue\"\n className=\"pointer-events-none absolute inset-y-0 right-0 w-8 bg-gradient-to-l from-background to-transparent\"\n />\n )}\n </div>\n\n {centerContent && (\n <div className={cn('flex min-w-fit flex-1 items-center self-center', COMPACT_SECTION)}>\n {typeof centerContent === 'function' ? centerContent(isCompact) : centerContent}\n </div>\n )}\n\n {/* pointer-events-none on the overlay so clicks reach the tabs beneath; the inner div\n re-enables them for the actual content. */}\n {absoluteCenterContent && (\n <div className=\"pointer-events-none absolute inset-0 z-10 flex items-center justify-center\">\n <div className=\"pointer-events-auto\">{absoluteCenterContent}</div>\n </div>\n )}\n\n <div\n className={cn(\n 'flex flex-shrink-0 items-center justify-end gap-2 self-center',\n COMPACT_SECTION\n )}\n >\n {typeof rightContent === 'function' ? rightContent(isCompact) : rightContent}\n </div>\n </div>\n </div>\n </div>\n )\n}\n"]}
|