@arbidocs/blocks 0.5.102 → 0.5.104
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{DocumentReviewCard-UUMBYSHO.cjs → DocumentReviewCard-MSHD73S3.cjs} +12 -12
- package/dist/{DocumentReviewCard-UUMBYSHO.cjs.map → DocumentReviewCard-MSHD73S3.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-UEFTDEOL.js → DocumentReviewCard-WZNBPG72.js} +7 -7
- package/dist/{DocumentReviewCard-UEFTDEOL.js.map → DocumentReviewCard-WZNBPG72.js.map} +1 -1
- package/dist/{FilesViewerDialog-B6AQP2UB.cjs → FilesViewerDialog-DV2U4USR.cjs} +7 -7
- package/dist/{FilesViewerDialog-B6AQP2UB.cjs.map → FilesViewerDialog-DV2U4USR.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-R5VNYH72.js → FilesViewerDialog-XETOHORQ.js} +6 -6
- package/dist/{FilesViewerDialog-R5VNYH72.js.map → FilesViewerDialog-XETOHORQ.js.map} +1 -1
- package/dist/agents/index.cjs +176 -175
- package/dist/agents/index.js +3 -2
- package/dist/{chunk-AUQF6UJZ.js → chunk-4UOXUWX3.js} +4 -4
- package/dist/{chunk-AUQF6UJZ.js.map → chunk-4UOXUWX3.js.map} +1 -1
- package/dist/{chunk-ZGAUD357.cjs → chunk-4WMGFGYP.cjs} +4 -4
- package/dist/{chunk-ZGAUD357.cjs.map → chunk-4WMGFGYP.cjs.map} +1 -1
- package/dist/{chunk-AMIPT72L.cjs → chunk-5R67KX2O.cjs} +8 -8
- package/dist/{chunk-AMIPT72L.cjs.map → chunk-5R67KX2O.cjs.map} +1 -1
- package/dist/{chunk-PL2CVHBB.cjs → chunk-5UMZXDGL.cjs} +5 -5
- package/dist/{chunk-PL2CVHBB.cjs.map → chunk-5UMZXDGL.cjs.map} +1 -1
- package/dist/{chunk-CDOW3H4B.js → chunk-62OMGQHS.js} +3 -3
- package/dist/{chunk-CDOW3H4B.js.map → chunk-62OMGQHS.js.map} +1 -1
- package/dist/{chunk-JJ5BXK3Q.cjs → chunk-6A4GNM4T.cjs} +5 -4
- package/dist/chunk-6A4GNM4T.cjs.map +1 -0
- package/dist/{chunk-VVCSEYDP.cjs → chunk-6NSKIS35.cjs} +4 -4
- package/dist/{chunk-VVCSEYDP.cjs.map → chunk-6NSKIS35.cjs.map} +1 -1
- package/dist/{chunk-PCSJODXV.js → chunk-7ONU7EWY.js} +3 -3
- package/dist/{chunk-PCSJODXV.js.map → chunk-7ONU7EWY.js.map} +1 -1
- package/dist/{chunk-D3DOHXBQ.cjs → chunk-BSPPKX6X.cjs} +24 -24
- package/dist/{chunk-D3DOHXBQ.cjs.map → chunk-BSPPKX6X.cjs.map} +1 -1
- package/dist/{chunk-ICE2ZKN4.js → chunk-CEVVGJQX.js} +3 -3
- package/dist/{chunk-ICE2ZKN4.js.map → chunk-CEVVGJQX.js.map} +1 -1
- package/dist/{chunk-6AETD75K.js → chunk-E26MNOLG.js} +3 -3
- package/dist/{chunk-6AETD75K.js.map → chunk-E26MNOLG.js.map} +1 -1
- package/dist/{chunk-S67KFB54.js → chunk-E6ISR55S.js} +3 -3
- package/dist/{chunk-S67KFB54.js.map → chunk-E6ISR55S.js.map} +1 -1
- package/dist/{chunk-ZKTMTYFN.js → chunk-ET3W24JV.js} +5 -5
- package/dist/{chunk-ZKTMTYFN.js.map → chunk-ET3W24JV.js.map} +1 -1
- package/dist/{chunk-GCW7PS3D.js → chunk-GOJ5GHFS.js} +3 -3
- package/dist/{chunk-GCW7PS3D.js.map → chunk-GOJ5GHFS.js.map} +1 -1
- package/dist/{chunk-FKFUAU4F.js → chunk-HTGEAQOA.js} +5 -4
- package/dist/chunk-HTGEAQOA.js.map +1 -0
- package/dist/{chunk-4RQDYXLE.js → chunk-HTIEJVPI.js} +5 -5
- package/dist/{chunk-4RQDYXLE.js.map → chunk-HTIEJVPI.js.map} +1 -1
- package/dist/{chunk-4YQBT5EL.cjs → chunk-IWLNDDPN.cjs} +35 -35
- package/dist/{chunk-4YQBT5EL.cjs.map → chunk-IWLNDDPN.cjs.map} +1 -1
- package/dist/chunk-JCMKYQGZ.js +26 -0
- package/dist/chunk-JCMKYQGZ.js.map +1 -0
- package/dist/{chunk-6S2LRXJ4.js → chunk-JWUCDK2F.js} +5 -5
- package/dist/chunk-JWUCDK2F.js.map +1 -0
- package/dist/{chunk-6TYZ33WH.cjs → chunk-OKUXM2N4.cjs} +5 -5
- package/dist/chunk-OKUXM2N4.cjs.map +1 -0
- package/dist/{chunk-HC54CTGN.cjs → chunk-OSR3GCJG.cjs} +11 -11
- package/dist/chunk-OSR3GCJG.cjs.map +1 -0
- package/dist/{chunk-TOT4HHHN.js → chunk-P5RTO2WL.js} +3 -24
- package/dist/chunk-P5RTO2WL.js.map +1 -0
- package/dist/chunk-QECKDZ47.cjs +31 -0
- package/dist/chunk-QECKDZ47.cjs.map +1 -0
- package/dist/{chunk-L3CWX2BN.cjs → chunk-RBI7WVEP.cjs} +4 -4
- package/dist/{chunk-L3CWX2BN.cjs.map → chunk-RBI7WVEP.cjs.map} +1 -1
- package/dist/{chunk-PP2NXTOP.js → chunk-RUV2ERID.js} +12 -12
- package/dist/{chunk-PP2NXTOP.js.map → chunk-RUV2ERID.js.map} +1 -1
- package/dist/{chunk-W4QYNRBU.cjs → chunk-S7NJVJJX.cjs} +45 -45
- package/dist/{chunk-W4QYNRBU.cjs.map → chunk-S7NJVJJX.cjs.map} +1 -1
- package/dist/{chunk-QM6OI62U.js → chunk-TQFDPCWU.js} +5 -5
- package/dist/{chunk-QM6OI62U.js.map → chunk-TQFDPCWU.js.map} +1 -1
- package/dist/{chunk-MDMQDVCA.cjs → chunk-V2CKYM4B.cjs} +4 -4
- package/dist/{chunk-MDMQDVCA.cjs.map → chunk-V2CKYM4B.cjs.map} +1 -1
- package/dist/{chunk-CMEIU2GA.cjs → chunk-VULH3XAJ.cjs} +28 -28
- package/dist/{chunk-CMEIU2GA.cjs.map → chunk-VULH3XAJ.cjs.map} +1 -1
- package/dist/{chunk-SOS2WASA.cjs → chunk-WZAHVTTO.cjs} +2 -26
- package/dist/chunk-WZAHVTTO.cjs.map +1 -0
- package/dist/collaboration/index.cjs +69 -69
- package/dist/collaboration/index.js +1 -1
- package/dist/collaboration/mail/MailActionBar.d.ts +3 -2
- package/dist/collaboration/mail/MailAddToWorkspaceDialog.d.ts +20 -0
- package/dist/collaboration/mail/MailFiledChips.d.ts +15 -0
- package/dist/collaboration/mail/MailMessageView.d.ts +3 -3
- package/dist/connect/index.cjs +1078 -805
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +498 -225
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +5 -5
- package/dist/connect/viewer.js +4 -4
- package/dist/connection/connectors/ConnectedMailboxSyncDialog.d.ts +3 -1
- package/dist/connection/connectors/native-mailbox.d.ts +19 -0
- package/dist/connection/files/imports/EmailImportPanel.d.ts +2 -2
- package/dist/connection/files/imports/NativeMailImportRow.d.ts +11 -0
- package/dist/connection/mail/ConnectedMailConversation.d.ts +3 -4
- package/dist/connection/mail/ConnectedMailbox.d.ts +1 -4
- package/dist/connection/mail/types.d.ts +2 -4
- package/dist/connection/mail/useMailMessageChange.d.ts +11 -2
- package/dist/connection/mail/useMailboxDefaults.d.ts +6 -3
- package/dist/connection/workspace-access/ConnectedGrantWorkspaceAccessDialog.d.ts +1 -1
- package/dist/document-tools/viewer/index.cjs +1 -1
- package/dist/document-tools/viewer/index.cjs.map +1 -1
- package/dist/document-tools/viewer/index.js +1 -1
- package/dist/document-tools/viewer/index.js.map +1 -1
- package/dist/embed/index.cjs +11 -11
- package/dist/embed/index.js +5 -5
- package/dist/files/import/ImportParts.d.ts +6 -3
- package/dist/files/index.cjs +222 -222
- package/dist/files/index.js +1 -1
- package/dist/index.cjs +294 -293
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/site/index.cjs +5 -5
- package/dist/site/index.js +1 -1
- package/dist/studio/index.cjs +1 -1
- package/dist/studio/index.js +1 -1
- package/dist/workflow-canvas/index.cjs +19 -18
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/dist/workflow-canvas/index.js +9 -8
- package/dist/workflow-canvas/index.js.map +1 -1
- package/dist/workspaces/index.cjs +33 -28
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.d.ts +1 -1
- package/dist/workspaces/index.js +3 -2
- package/dist/workspaces/index.js.map +1 -1
- package/dist/workspaces/workspace-roles.d.ts +11 -4
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/chunk-6S2LRXJ4.js.map +0 -1
- package/dist/chunk-6TYZ33WH.cjs.map +0 -1
- package/dist/chunk-FKFUAU4F.js.map +0 -1
- package/dist/chunk-HC54CTGN.cjs.map +0 -1
- package/dist/chunk-JJ5BXK3Q.cjs.map +0 -1
- package/dist/chunk-SOS2WASA.cjs.map +0 -1
- package/dist/chunk-TOT4HHHN.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/files/StatusPill.tsx","../src/files/FilesToolbar.tsx","../src/files/Explorer.tsx","../src/files/ExplorerTile.tsx","../src/files/documentGridLayout.ts","../src/files/UploadParts.tsx","../src/files/UploadSources.tsx","../src/files/ExportParts.tsx","../src/files/TransferParts.tsx","../src/files/ViewerChrome.tsx","../src/files/ViewerControlBar.tsx","../src/files/HtmlViewerParts.tsx","../src/files/doc-labels.tsx","../src/files/MoveToFolderDialog.tsx","../src/files/FilesPage.tsx","../src/files/DocumentGrid.tsx","../src/files/ViewerParts.tsx","../src/files/UploadFooter.tsx","../src/files/FolderPicker.tsx","../src/files/TagPassagePanel.tsx","../src/files/page/FilesAddMenu.tsx","../src/files/page/FilesPageParts.tsx","../src/files/import/ImportParts.tsx","../src/files/import/TaskSection.tsx","../src/files/import/UrlInputDialogView.tsx","../src/files/import/VendorLogo.tsx","../src/files/cells/FolderCell.tsx","../src/files/cells/RelatedDocsCell.tsx","../src/files/cells/DocumentNameCell.tsx","../src/files/cells/LabelMultiSelect.tsx","../src/files/cells/TagColumnParts.tsx","../src/files/cells/BulkLabelSelect.tsx","../src/files/cells/MultiSelectCellEditor.tsx","../src/files/bulk/BulkActionsBar.tsx","../src/files/bulk/FolderFilterButton.tsx","../src/files/tags/BulkTagEditor.tsx","../src/files/views/ViewSelectorMenu.tsx","../src/files/views/FieldsEditorParts.tsx","../src/files/views/fieldsEditorModel.ts","../src/files/views/FieldsManagerParts.tsx","../src/files/views/TagFormParts.tsx","../src/files/views/gridViews.ts","../src/files/views/useGridViews.ts","../src/files/AiReviewDialog.tsx","../src/files/FailedStageIcon.tsx","../src/files/DocStatusIcon.tsx","../src/files/FieldParts.tsx","../src/files/ExplorerSurface.tsx","../src/files/grid/FilterButton.tsx","../src/files/grid/row-density.ts","../src/files/grid/RowDensityControl.tsx","../src/files/folders/folderPaths.ts","../src/files/folders/FolderProviderIcon.tsx","../src/files/folders/FolderTreePicker.tsx","../src/files/folders/DocumentsFolderButton.tsx","../src/files/permissions.ts","../src/files/visibility.ts","../src/files/recently-deleted.ts","../src/files/media-preview.ts","../src/files/UrlInputDialog.tsx","../src/files/ShareToggle.tsx","../src/files/PrivacyExplainerModal.tsx","../src/files/documentColumns.ts","../src/files/navigator/DocumentSearchList.tsx","../src/files/navigator/NavDocumentPicker.tsx","../src/files/navigator/NavigatorPickerBar.tsx","../src/files/navigator/ExplorerFileNavigator.tsx"],"names":["jsxs","cn","jsx","Button","RadioGroup","RadioGroupItem","Label","Checkbox","Loader2","AlertTriangle","Progress","Fragment","HtmlPassage","FolderOpen","Badge","Tooltip","TooltipTrigger","TooltipContent","useState","useRef","Download","Sparkles","Check","X","hasNote","StickyNote","ChevronRight","Textarea","Upload","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuSeparator","DropdownMenuItem","LoaderCircle","AlertCircle","Dialog","DialogContent","DialogTitle","DialogDescription","Plus","FolderBreadcrumb","Popover","PopoverTrigger","Copy","CopyX","PopoverContent","Pencil","FolderInput","Trash2","useMemo","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","Minus","memo","LabelMultiSelectView","useEffect","CheckboxCell","TagColumnHeader","MessagesSquare","Tags","MoreHorizontal","Share2","RefreshCw","ChevronDown","FolderPlus","Input","TooltipProvider","ScrollArea","CommandSeparator","PencilLine","BookMarked","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","useCallback","ARBI","assistantCopy","useAssistantCopy","DialogHeader","CircleSlash","FailedStageIcon","CheckCircle","FileX","Hourglass","ChevronsUpDown","ExplorerScroller","ExplorerMarquee","newUrls","getEntityLabel","Eye","BrainCircuit","Info","getDocumentTitle","getFileTypeIcon","ChevronLeft"],"mappings":"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","file":"chunk-JWUCDK2F.js","sourcesContent":["import type { KeyboardEvent, MouseEvent, ReactNode } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@arbidocs/react/ui'\nimport { TONE_SURFACE, type Tone } from '../components/tones'\n\nconst pill = cva(\n 'inline-flex max-w-full items-center justify-center gap-1 rounded-full text-xs font-medium leading-none',\n {\n variants: {\n /** `icon` = glyph-only chip; `label` = text pill. */\n shape: { icon: 'size-6 p-0 pointer-coarse:size-8', label: 'h-6 px-2 pointer-coarse:h-8' },\n interactive: {\n true: \"relative cursor-pointer pointer-coarse:after:absolute pointer-coarse:after:left-1/2 pointer-coarse:after:top-1/2 pointer-coarse:after:size-11 pointer-coarse:after:-translate-x-1/2 pointer-coarse:after:-translate-y-1/2 pointer-coarse:after:content-[''] hover:brightness-95 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n false: '',\n },\n },\n defaultVariants: { shape: 'label', interactive: false },\n }\n)\n\n/** The shared tone vocabulary (see `components/tones`). */\nexport type StatusTone = Tone\n\nexport interface StatusPillProps {\n tone?: StatusTone\n /** Leading glyph. With no `label` the pill is a glyph-only chip. */\n icon?: ReactNode\n label?: ReactNode\n /** Adds a thin bar under the label (queued = still, processing = animated). */\n progress?: 'queued' | 'processing'\n /** Native tooltip and accessible name for glyph-only pills. */\n title?: string\n /** Makes the pill a button (stops row-click propagation). */\n onClick?: () => void\n testId?: string\n className?: string\n}\n\n/**\n * A small tinted status chip. Source-agnostic: the host decides tone, glyph and copy from its\n * own status model; the block only owns the look, the touch target and the keyboard path.\n */\nexport function StatusPill({\n tone = 'neutral',\n icon,\n label,\n progress,\n title,\n onClick,\n testId,\n className,\n}: StatusPillProps) {\n const hasLabel = label !== undefined && label !== null && label !== ''\n const classes = cn(\n pill({ shape: hasLabel ? 'label' : 'icon', interactive: !!onClick }),\n TONE_SURFACE[tone],\n progress && 'h-auto min-h-6 flex-col gap-0 px-2 py-1',\n className\n )\n\n const body = (\n <>\n <span className=\"inline-flex max-w-full items-center gap-1\">\n {icon}\n {hasLabel && <span className=\"truncate\">{label}</span>}\n </span>\n {progress && (\n <span\n aria-hidden\n data-slot=\"status-pill-progress\"\n className={cn(\n 'mt-0.5 block h-1 w-full min-w-10 shrink-0 rounded-sm',\n progress === 'queued' ? 'progress-bar-queued' : 'progress-bar-processing'\n )}\n />\n )}\n </>\n )\n\n if (onClick) {\n return (\n <button\n type=\"button\"\n title={title}\n aria-label={hasLabel ? undefined : title}\n data-slot=\"status-pill\"\n data-testid={testId}\n className={classes}\n onClick={(e: MouseEvent) => {\n e.stopPropagation()\n onClick()\n }}\n onKeyDown={(e: KeyboardEvent) => e.stopPropagation()}\n >\n {body}\n </button>\n )\n }\n return (\n <span\n title={title}\n role={hasLabel || !title ? undefined : 'img'}\n aria-label={hasLabel ? undefined : title}\n data-slot=\"status-pill\"\n data-testid={testId}\n className={classes}\n >\n {body}\n </span>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { FilterInput } from '../shell/FilterInput'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FilesToolbarProps extends Omit<ComponentProps<'div'>, 'children'> {\n /** Leading controls: the filter field and the pickers that narrow the list. */\n leftActions?: ReactNode\n /** Trailing controls (row navigator, views, density...). Always visible; nothing is hover-revealed. */\n rightActions?: ReactNode\n className?: string\n /** Overrides the root test id (default `documents-filter-bar`). */\n testId?: string\n}\n\n/**\n * The calm secondary row under the page title: filters on the left, view controls on the right.\n * No border or fill: the page header already separates it. It wraps by GROUP, never mid-group:\n * the left group (filter field + pickers) keeps one line, and when the view controls no longer\n * fit beside it they drop together onto their own right-aligned line, so a docked tablet sidebar\n * or a phone never orphans a single button.\n */\nexport function FilesToolbar({\n leftActions,\n rightActions,\n className,\n testId,\n ...rest\n}: FilesToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n data-slot=\"files-toolbar\"\n {...rest}\n data-testid={testIdOr(testId, { testId: 'documents-filter-bar' })}\n className={cn('flex min-w-0 flex-wrap items-center gap-x-2 gap-y-2', className)}\n >\n {leftActions && (\n <div data-slot=\"files-toolbar-left\" className=\"flex min-w-0 flex-[1_1_22rem] items-center\">\n {leftActions}\n </div>\n )}\n {rightActions && (\n <div\n data-slot=\"files-toolbar-right\"\n className=\"ml-auto flex min-w-0 flex-wrap items-center justify-end gap-2\"\n >\n {rightActions}\n </div>\n )}\n </div>\n )\n}\n\nexport interface FilesSearchField {\n value: string\n label: string\n}\n\n/** Every fixed string of the search input. Pass a partial `labels` to translate or reword. */\nexport interface FilesSearchLabels {\n placeholder: string\n clearFilter: string\n chooseFields: string\n}\n\nexport const DEFAULT_FILES_SEARCH_LABELS: FilesSearchLabels = {\n placeholder: 'Filter...',\n clearFilter: 'Clear filter',\n chooseFields: 'Choose fields to search',\n}\n\nexport interface FilesSearchTestIds {\n root: string\n filterSlot: string\n input: string\n fieldsButton: string\n}\n\nexport interface FilesSearchInputProps {\n value: string\n onChange: (value: string) => void\n /** Fields the text can match against. */\n fields: FilesSearchField[]\n /** Currently searched field values. */\n selectedFields: string[]\n onSelectedFieldsChange: (fields: string[]) => void\n /** Wins over `labels.placeholder`. */\n placeholder?: string\n labels?: Partial<FilesSearchLabels>\n /** Overrides for the control test ids (defaults keep the current ids). */\n testIds?: Partial<FilesSearchTestIds>\n /** Width/layout classes for the outer wrapper. */\n className?: string\n /** Leading control inside the input (e.g. the filter dropdown trigger). */\n filterSlot?: ReactNode\n}\n\n/**\n * Inline \"Filter...\" box. The filter slot sits INSIDE the input on the left; on the right a muted\n * field picker chooses which fields the text matches, and a clear control shows while there is\n * text. Both inline controls stay visible and are 32px+ on touch.\n */\nexport function FilesSearchInput(props: FilesSearchInputProps) {\n return (\n <FilterInput<string>\n value={props.value}\n onChange={props.onChange}\n fieldOptions={props.fields}\n fields={props.selectedFields}\n onFieldsChange={props.onSelectedFieldsChange}\n filter={props.filterSlot}\n className={props.className}\n labels={{\n placeholder:\n props.placeholder ?? props.labels?.placeholder ?? DEFAULT_FILES_SEARCH_LABELS.placeholder,\n clear: props.labels?.clearFilter ?? DEFAULT_FILES_SEARCH_LABELS.clearFilter,\n chooseFields: props.labels?.chooseFields ?? DEFAULT_FILES_SEARCH_LABELS.chooseFields,\n }}\n testIds={{\n root: props.testIds?.root ?? 'documents-search',\n quick: props.testIds?.filterSlot ?? 'documents-search-filter',\n input: props.testIds?.input ?? 'filter-bar-search-input',\n fieldsButton: props.testIds?.fieldsButton ?? 'documents-search-fields-button',\n }}\n />\n )\n}\n","import type { ComponentProps } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface ExplorerLoadingTilesProps extends ComponentProps<'div'> {\n count?: number\n /** Accessible name (default \"Loading files\"). */\n label?: string\n /** Overrides the root test id (default `explorer-loading-skeleton`). */\n testId?: string\n}\n\n/** Skeleton tile grid shown while the first page loads: the gallery reads as \"filling in\". */\nexport function ExplorerLoadingTiles({\n count = 18,\n label = 'Loading files',\n testId,\n className,\n ...rest\n}: ExplorerLoadingTilesProps) {\n return (\n <div\n className={cn(\n 'grid gap-3 [grid-template-columns:repeat(auto-fill,minmax(150px,1fr))]',\n className\n )}\n aria-busy=\"true\"\n aria-label={label}\n data-slot=\"explorer-loading-tiles\"\n {...rest}\n data-testid={testIdOr(testId, { testId: 'explorer-loading-skeleton' })}\n >\n {Array.from({ length: count }).map((_, i) => (\n <div key={i} className=\"aspect-[4/5] animate-pulse rounded-lg bg-muted\" />\n ))}\n </div>\n )\n}\n","import { useRef, useState } from 'react'\nimport type { HTMLAttributes, MouseEvent, ReactNode, Ref } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Folder, LoaderCircle, MoreHorizontal, Sparkles } from 'lucide-react'\nimport {\n Checkbox,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { ActionLink } from '../components/ActionLink'\nimport { testIdOr } from '../chat/test-id'\nimport { formatCount } from '../lib/format'\n\n/** Every fixed string of the explorer tiles. Pass a partial `labels` to translate or reword. */\nexport interface ExplorerLabels {\n moreActions: string\n name: string\n select: string\n deselect: string\n empty: string\n itemCount: (count: number) => string\n processing: (count: number) => string\n aiSummary: string\n noSummary: string\n lastModifiedBy: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_EXPLORER_LABELS: ExplorerLabels = {\n moreActions: 'More actions',\n name: 'Name',\n select: 'Select',\n deselect: 'Deselect',\n empty: 'Empty',\n itemCount: (count) => formatCount(count, { one: 'item', other: 'items' }),\n processing: (count) => `${count} processing`,\n aiSummary: 'AI Summary:',\n noSummary: 'No AI summary is available for this document yet.',\n lastModifiedBy: 'Last modified by',\n shared: 'Shared',\n private: 'Private',\n}\n\nexport interface ExplorerFileTestIds {\n root: string\n menu: string\n renameInput: string\n}\n\nexport interface ExplorerFolderTestIds {\n root: string\n menu: string\n renameInput: string\n /** Replaces the whole `explorer-folder-processing-<path>` id. */\n processing: string\n}\n\n/** Stretched anchor under the tile controls: gives the tile a real URL when `href` is set. */\nfunction TileLink({\n href,\n label,\n onSelect,\n}: {\n href: string\n label: string\n onSelect: () => void\n}) {\n return (\n <ActionLink\n href={href}\n onSelect={onSelect}\n aria-label={label}\n data-slot=\"explorer-tile-link\"\n className=\"absolute inset-0 z-10 rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n )\n}\n\nfunction isInsideTileLink(e: MouseEvent): boolean {\n return e.target instanceof Element && !!e.target.closest('[data-slot=\"explorer-tile-link\"]')\n}\n\nexport type ExplorerDensity = 'grid' | 'list'\n\nexport interface ExplorerMenuItem {\n id: string\n label: string\n icon: LucideIcon\n onSelect: () => void\n /** Red styling, for Delete. */\n destructive?: boolean\n /** Draw a separator above this item. */\n separatorBefore?: boolean\n /** A nested menu: the item opens it instead of acting (`onSelect` is then ignored). */\n submenu?: ExplorerMenuItem[]\n testId?: string\n}\n\nfunction ExplorerMenu({\n items,\n testId,\n label,\n align,\n triggerClassName,\n}: {\n items: ExplorerMenuItem[]\n testId: string\n label: string\n align: 'start' | 'end'\n triggerClassName?: string\n}) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n className={cn(\n 'flex size-6 items-center justify-center rounded-md bg-background/90 text-muted-foreground backdrop-blur-sm transition hover:bg-background hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:bg-background data-[state=open]:text-foreground pointer-coarse:size-11',\n triggerClassName\n )}\n >\n <MoreHorizontal className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align={align}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n className=\"w-44\"\n >\n {items.map((item) => (\n <div key={item.id}>\n {item.separatorBefore && <DropdownMenuSeparator />}\n {item.submenu ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger data-testid={item.testId}>\n <item.icon className=\"mr-2 size-4\" />\n {item.label}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"w-52\">\n {item.submenu.map((sub) => (\n <DropdownMenuItem key={sub.id} onSelect={sub.onSelect} data-testid={sub.testId}>\n <sub.icon className=\"mr-2 size-4\" />\n {sub.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n ) : (\n <DropdownMenuItem\n onSelect={item.onSelect}\n data-testid={item.testId}\n className={cn(item.destructive && 'text-destructive focus:text-destructive')}\n >\n <item.icon className=\"mr-2 size-4\" />\n {item.label}\n </DropdownMenuItem>\n )}\n </div>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/** Inline rename field. Enter / blur commits, Escape cancels; guarded against Enter-then-blur. */\nfunction RenameField({\n seed,\n testId,\n label,\n onCommit,\n onCancel,\n className,\n}: {\n seed: string\n testId: string\n label: string\n onCommit: (value: string) => void\n onCancel: () => void\n className?: string\n}) {\n const doneRef = useRef(false)\n const commit = (value: string) => {\n if (doneRef.current) return\n doneRef.current = true\n const trimmed = value.trim()\n if (trimmed && trimmed !== seed) onCommit(trimmed)\n else onCancel()\n }\n return (\n <input\n autoFocus\n defaultValue={seed}\n data-testid={testId}\n aria-label={label}\n onFocus={(e) => e.currentTarget.select()}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n commit(e.currentTarget.value)\n } else if (e.key === 'Escape') {\n e.preventDefault()\n doneRef.current = true\n onCancel()\n }\n }}\n onBlur={(e) => commit(e.currentTarget.value)}\n className={cn(\n 'w-full rounded-md border border-primary bg-background px-1 py-0.5 text-sm text-foreground outline-none',\n className\n )}\n />\n )\n}\n\n/** Selection checkbox: always visible (dimmed at rest), solid when selected. */\nfunction SelectCheckbox({\n selected,\n onToggle,\n labels,\n className,\n}: {\n selected: boolean\n onToggle: (e: MouseEvent) => void\n labels: Pick<ExplorerLabels, 'select' | 'deselect'>\n className?: string\n}) {\n return (\n <Checkbox\n checked={selected}\n // Pointer-down stop prevents the drag sensor / tile click from firing.\n onPointerDown={(e) => e.stopPropagation()}\n onClick={onToggle}\n aria-label={selected ? labels.deselect : labels.select}\n className={cn(\n 'size-6 rounded-md border-muted-foreground/60 bg-card transition data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground pointer-coarse:size-9',\n selected ? 'opacity-100' : 'opacity-60 hover:opacity-100',\n className\n )}\n />\n )\n}\n\n// ── File tile ───────────────────────────────────────────────────────────────────────────────\n\nexport interface ExplorerFileTileProps {\n /** Document id (`data-doc-id`). */\n id: string\n /** Rename seed: the display title. */\n title: string\n density: ExplorerDensity\n selected: boolean\n /** Part of an in-flight drag: dimmed. */\n dragging?: boolean\n renaming?: boolean\n /** First-page thumbnail (data URI/URL). Without one the file-type icon shows. */\n thumbnailUrl?: string\n /** Renders the file-type glyph at a pixel size. */\n renderFileIcon: (size: number) => ReactNode\n /** In-flight processing: shows a centred progress overlay with this label. */\n progress?: { label: string; queued: boolean }\n /** Terminal status marker (bottom-right), usually a `StatusPill`. */\n statusMarker?: ReactNode\n /** \"Available offline\" marker (bottom-left). */\n offlineMarker?: ReactNode\n /** The canonical entity pill at the bottom (click opens). */\n entity: ReactNode\n /** Hover card content. Omit to disable the tooltip (renaming, or while dragging). */\n tooltip?: ReactNode\n menuItems: ExplorerMenuItem[]\n /** Drag-and-drop hook-up: ref + listener/aria props from the host's DnD library. */\n rootRef?: Ref<HTMLDivElement>\n rootProps?: HTMLAttributes<HTMLDivElement>\n /** Plain click / double click / menu \"Open\". With `href`, a plain click still calls this. */\n onOpen: () => void\n /** Route of the document: the tile gets a real link (modified clicks go to the browser). */\n href?: string\n labels?: Partial<ExplorerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<ExplorerFileTestIds>\n /** Modifier (shift/meta/ctrl) click: range / toggle selection. */\n onSelect: (e: MouseEvent) => void\n onToggle: (e: MouseEvent) => void\n onCommitRename: (name: string) => void\n onCancelRename: () => void\n}\n\n/** One document tile: thumbnail (or icon) filling the tile with checkbox, menu, status and pill. */\nexport function ExplorerFileTile({\n id,\n title,\n density,\n selected,\n dragging,\n renaming,\n thumbnailUrl,\n renderFileIcon,\n progress,\n statusMarker,\n offlineMarker,\n entity,\n tooltip,\n menuItems,\n rootRef,\n rootProps,\n onOpen,\n href,\n labels,\n testIds,\n onSelect,\n onToggle,\n onCommitRename,\n onCancelRename,\n}: ExplorerFileTileProps) {\n const l = { ...DEFAULT_EXPLORER_LABELS, ...labels }\n const [thumbFailed, setThumbFailed] = useState(false)\n // Portrait pages fill the tile top-aligned; landscape / odd shapes are fit whole.\n const [thumbLandscape, setThumbLandscape] = useState(false)\n const showThumbnail = !!thumbnailUrl && !thumbFailed && !progress\n\n const tile = (\n <div\n ref={rootRef}\n {...rootProps}\n onClick={(e) => {\n if (href && isInsideTileLink(e)) {\n // The link owns plain and new-tab clicks; shift keeps range selection.\n if (e.shiftKey) {\n e.preventDefault()\n onSelect(e)\n }\n return\n }\n if (e.shiftKey || e.metaKey || e.ctrlKey) onSelect(e)\n else onOpen()\n }}\n onDoubleClick={onOpen}\n data-slot=\"explorer-file-tile\"\n data-testid={testIdOr(testIds?.root, { testId: 'explorer-file' })}\n data-doc-id={id}\n className={cn(\n 'group relative h-full cursor-default select-none overflow-hidden rounded-lg border transition',\n dragging && 'opacity-40',\n selected ? 'border-primary/30 bg-accent' : 'border-border bg-muted hover:bg-muted/70'\n )}\n >\n {href && <TileLink href={href} label={title} onSelect={onOpen} />}\n {showThumbnail ? (\n <img\n src={thumbnailUrl}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n onError={() => setThumbFailed(true)}\n onLoad={(e) =>\n setThumbLandscape(e.currentTarget.naturalWidth > e.currentTarget.naturalHeight)\n }\n className={cn(\n 'absolute inset-0 size-full bg-card',\n thumbLandscape ? 'object-contain' : 'object-cover object-top'\n )}\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderFileIcon(density === 'list' ? 30 : 44)}\n </div>\n )}\n\n {progress && (\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-1.5 bg-background/80 px-3\">\n <div\n className={cn(\n 'h-1.5 w-full rounded-sm',\n progress.queued ? 'progress-bar-queued' : 'progress-bar-processing'\n )}\n />\n <span className=\"text-xs font-medium text-primary\">{progress.label}</span>\n </div>\n )}\n\n <SelectCheckbox\n selected={selected}\n onToggle={onToggle}\n labels={l}\n className=\"absolute left-1.5 top-1.5 z-20\"\n />\n\n <div className=\"absolute right-1.5 top-1.5 z-20\">\n <ExplorerMenu\n items={menuItems}\n testId={testIdOr(testIds?.menu, { testId: 'explorer-file-menu' })}\n label={l.moreActions}\n align=\"start\"\n />\n </div>\n\n {renaming ? (\n <div className=\"absolute inset-x-0 bottom-0 z-20 flex items-center gap-1 bg-background/90 px-1.5 py-1 backdrop-blur-sm\">\n <span className=\"shrink-0\">{renderFileIcon(13)}</span>\n <RenameField\n seed={title}\n testId={testIdOr(testIds?.renameInput, { testId: 'explorer-rename-input' })}\n label={l.name}\n onCommit={onCommitRename}\n onCancel={onCancelRename}\n className=\"flex-1 text-left\"\n />\n </div>\n ) : (\n <div className=\"absolute inset-x-1.5 bottom-1.5 z-20 flex flex-col gap-1\">\n {(offlineMarker || statusMarker) && (\n <div className=\"flex items-center\">\n {offlineMarker}\n {statusMarker && <div className=\"ml-auto flex\">{statusMarker}</div>}\n </div>\n )}\n {entity}\n </div>\n )}\n </div>\n )\n\n if (!tooltip) return tile\n return (\n <Tooltip delayDuration={500}>\n <TooltipTrigger asChild>{tile}</TooltipTrigger>\n <TooltipContent side=\"bottom\" sideOffset={6} className=\"p-2.5\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n )\n}\n\n// ── Folder tile ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ExplorerFolderTileProps {\n /** Stored folder name (rename seed, native tooltip). */\n name: string\n /** Label shown on the tile; `''`/null renders no label (provider roots shorten to nothing). */\n displayName: string | null\n /** Folder path segments (ids and `data-folder-path`). */\n path: string[]\n /** Number of items beneath this folder; 0 renders it faded as \"Empty\". */\n count: number\n density: ExplorerDensity\n editing?: boolean\n /** Every document beneath is selected. */\n selected?: boolean\n /** Some (not all) documents beneath are selected. */\n partiallySelected?: boolean\n processingCount?: number\n /** A dragged item is over this folder. */\n isOver?: boolean\n /** Replace the folder glyph (e.g. a provider's brand mark). */\n icon?: ReactNode\n menuItems?: ExplorerMenuItem[]\n rootRef?: Ref<HTMLDivElement>\n rootProps?: HTMLAttributes<HTMLDivElement>\n onOpen: () => void\n /** Route of the folder: the tile gets a real link (modified clicks go to the browser). */\n href?: string\n labels?: Partial<ExplorerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<ExplorerFolderTestIds>\n onToggleSelect?: (e: MouseEvent) => void\n onCommitName?: (name: string) => void\n onCancelName?: () => void\n}\n\n/** One folder tile: glyph, name, item count, optional processing count and actions menu. */\nexport function ExplorerFolderTile({\n name,\n displayName,\n path,\n count,\n density,\n editing,\n selected,\n partiallySelected,\n processingCount = 0,\n isOver,\n icon,\n menuItems = [],\n rootRef,\n rootProps,\n onOpen,\n href,\n labels,\n testIds,\n onToggleSelect,\n onCommitName,\n onCancelName,\n}: ExplorerFolderTileProps) {\n const l = { ...DEFAULT_EXPLORER_LABELS, ...labels }\n const iconSize = density === 'list' ? 34 : 48\n const isEmpty = count === 0\n const countLabel = isEmpty ? l.empty : l.itemCount(count)\n const joined = path.join('/')\n\n return (\n <div\n ref={rootRef}\n {...rootProps}\n onClick={editing || href ? undefined : onOpen}\n data-slot=\"explorer-folder-tile\"\n data-testid={testIdOr(testIds?.root, { testId: 'explorer-folder' })}\n data-folder-path={joined}\n title={name}\n className={cn(\n 'group relative flex h-full cursor-pointer select-none flex-col items-center justify-center gap-1 rounded-lg p-2 text-center transition',\n isOver\n ? 'bg-accent ring-2 ring-primary/40'\n : selected\n ? 'bg-accent ring-1 ring-primary/30'\n : 'bg-muted hover:bg-muted/70',\n isEmpty && !isOver && !selected && 'opacity-70'\n )}\n >\n {href && !editing && <TileLink href={href} label={displayName || name} onSelect={onOpen} />}\n {onToggleSelect && !isEmpty && (\n <SelectCheckbox\n selected={!!selected}\n onToggle={onToggleSelect}\n labels={l}\n className={cn(\n 'absolute left-1.5 top-1.5 z-20',\n partiallySelected && !selected && 'opacity-100'\n )}\n />\n )}\n {menuItems.length > 0 && !editing && (\n <div className=\"absolute right-1 top-1 z-20\">\n <ExplorerMenu\n items={menuItems}\n testId={testIdOr(testIds?.menu, { testId: 'explorer-folder-menu' })}\n label={l.moreActions}\n align=\"end\"\n />\n </div>\n )}\n {icon ?? (\n <Folder\n className={cn(\n 'transition',\n isEmpty\n ? 'text-yellow-text/50'\n : 'fill-yellow-text/30 text-yellow-text group-hover:fill-yellow-text/40'\n )}\n size={iconSize}\n />\n )}\n {editing ? (\n <RenameField\n seed={name}\n testId={testIdOr(testIds?.renameInput, { testId: 'explorer-rename-input' })}\n label={l.name}\n onCommit={(next) => onCommitName?.(next)}\n onCancel={() => onCancelName?.()}\n className=\"text-center\"\n />\n ) : (\n displayName && (\n <span\n className={cn(\n 'line-clamp-2 w-full break-words text-xs font-semibold leading-tight',\n isEmpty ? 'text-foreground/60' : 'text-foreground/90'\n )}\n >\n {displayName}\n </span>\n )\n )}\n <span className=\"text-xs text-muted-foreground\">{countLabel}</span>\n {processingCount > 0 && (\n <span\n className=\"inline-flex items-center gap-1 text-xs font-semibold text-primary\"\n data-testid={testIdOr(testIds?.processing, {\n testId: `explorer-folder-processing-${joined}`,\n })}\n >\n <LoaderCircle className=\"size-3 animate-spin\" />\n {l.processing(processingCount)}\n </span>\n )}\n </div>\n )\n}\n\n// ── Hover card ──────────────────────────────────────────────────────────────────────────────\n\nexport interface ExplorerFileTooltipProps {\n title: string\n /** AI summary; a placeholder is shown when empty. */\n summary?: string | null\n /** Pre-formatted \"last modified\" date; omit to hide the meta rows. */\n modifiedLabel?: string | null\n /** Small avatar of whoever last modified it. */\n modifiedByAvatar?: ReactNode\n shared: boolean\n /** Glyph for the shared/private state. */\n visibilityIcon?: ReactNode\n labels: string[]\n /** Fixed strings of the card (not the document labels above). */\n uiLabels?: Partial<ExplorerLabels>\n}\n\n/** The explorer hover card: leads with the AI summary, then who/when and the labels. */\nexport function ExplorerFileTooltip({\n title,\n summary,\n modifiedLabel,\n modifiedByAvatar,\n shared,\n visibilityIcon,\n labels,\n uiLabels,\n}: ExplorerFileTooltipProps) {\n const l = { ...DEFAULT_EXPLORER_LABELS, ...uiLabels }\n return (\n <div className=\"max-w-xs space-y-2\">\n <div className=\"break-words text-xs font-semibold leading-snug text-foreground\">{title}</div>\n <div className=\"space-y-1 border-t border-border pt-1.5\">\n <div className=\"flex items-center gap-1 text-xs font-semibold text-foreground\">\n <Sparkles className=\"size-3.5 shrink-0 text-yellow-text\" />\n {l.aiSummary}\n </div>\n <p className=\"line-clamp-6 text-xs leading-snug text-foreground/90\">\n {summary?.trim() || l.noSummary}\n </p>\n </div>\n {(modifiedLabel || labels.length > 0) && (\n <div className=\"space-y-1.5 border-t border-border pt-1.5\">\n {modifiedLabel && (\n <div className=\"flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-1\">\n <span>{l.lastModifiedBy}</span>\n {modifiedByAvatar}\n <span>{modifiedLabel}</span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {visibilityIcon}\n <span>{shared ? l.shared : l.private}</span>\n </div>\n </div>\n )}\n {labels.length > 0 && (\n <div className=\"flex flex-wrap gap-1 pt-0.5\">\n {labels.map((label) => (\n <span\n key={label}\n className=\"rounded bg-muted px-1.5 py-0.5 text-xs font-medium text-foreground/80\"\n >\n {label}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","export type DocumentGridLayout = 'table' | 'tablet' | 'mobile-list' | 'modal'\n\nexport interface DocumentGridPresets {\n /** Saved-state ids per layout. Tablet, phone and modal keep their own so they never overwrite desktop state. */\n gridIds: Record<DocumentGridLayout, string>\n /** Visible columns (applied when no saved state exists) per layout. */\n visibleColumns: Record<DocumentGridLayout, string[]>\n /** Desktop row height; phones use `mobileRowHeight`. */\n rowHeight: number\n mobileRowHeight?: number\n /** Modal grids are a fixed 50vh; everything else fills its container. */\n modalHeight?: string\n}\n\nexport interface DocumentGridLayoutProps {\n /** Remount key: switching layout must rebuild the grid so state from another layout never leaks. */\n remountKey: string\n gridId: string\n initialVisibleColumns: string[]\n rowHeight: number\n height: string\n}\n\n/**\n * Pick the layout for the current viewport/container: `isNarrow` = phone, `isTablet` = a table\n * container too narrow for the full column set (a docked sidebar, iPad portrait).\n */\nexport function resolveDocumentGridLayout(\n isNarrow: boolean,\n isModal: boolean,\n isTablet = false\n): DocumentGridLayout {\n if (isModal) return 'modal'\n if (isNarrow) return 'mobile-list'\n return isTablet ? 'tablet' : 'table'\n}\n\n/**\n * Column/sizing preset for the documents grid: the props a host spreads onto its GridView so the\n * table, the phone list and the modal each get their own state id, default columns and sizing.\n * Column definitions (explicit `colId`s) and the ids themselves stay with the host.\n */\nexport function documentGridLayoutProps(\n layout: DocumentGridLayout,\n presets: DocumentGridPresets\n): DocumentGridLayoutProps {\n return {\n remountKey: layout === 'mobile-list' || layout === 'tablet' ? layout : 'table',\n gridId: presets.gridIds[layout],\n initialVisibleColumns: presets.visibleColumns[layout],\n rowHeight: layout === 'mobile-list' ? (presets.mobileRowHeight ?? 64) : presets.rowHeight,\n height: layout === 'modal' ? (presets.modalHeight ?? '50vh') : '100%',\n }\n}\n","import type { ReactNode } from 'react'\nimport { AlertCircle, FolderOpen, X } from 'lucide-react'\nimport { Button, Progress, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { assistantCopy, useAssistantCopy } from '@arbidocs/react/shell'\n\n/** Every fixed string of the upload parts. Pass a partial `labels` to translate or reword. */\nexport interface UploadPartsLabels {\n /** Heading per rejection reason (`too_large`, `unsupported`, `empty`, `no_extension`, `empty_zip`, `zip_error`). */\n rejectedReasons: Record<string, string>\n rejectedFallback: string\n clearRejected: string\n selectedFiles: (count: number) => string\n total: (size: string) => string\n clearAll: string\n remove: (fileName: string) => string\n uploadComplete: (entity: string) => string\n uploading: (count: number, entity: string) => string\n uploadedIndexing: string\n afterUpload: string\n}\n\n/** ARBI's own phrases (the defaults below). */\nconst ARBI = assistantCopy()\n\nexport const DEFAULT_UPLOAD_PARTS_LABELS: UploadPartsLabels = {\n rejectedReasons: {\n too_large: 'The following files exceed the 1 GB size limit:',\n unsupported:\n 'The following files are not in a supported format (PDF, DOC(X), PPT(X), XLS(X), RTF, TXT, MD, HTML, images, audio, video, email, Outlook archive (.pst/.ost), or ZIP):',\n empty: 'The following files are empty (0 bytes):',\n no_extension: 'The following files have no file extension:',\n empty_zip: 'The following ZIP archives contain no supported files:',\n zip_error: 'The following ZIP archives could not be processed:',\n },\n rejectedFallback: 'The following files cannot be uploaded:',\n clearRejected: 'Clear rejected files',\n selectedFiles: (count) => `Selected Files (${count})`,\n total: (size) => `Total: ${size}`,\n clearAll: 'Clear All',\n remove: (fileName) => `Remove ${fileName}`,\n uploadComplete: (entity) => `Upload complete! Processing ${entity} in the background...`,\n uploading: (count, entity) => `Uploading ${count} ${entity}...`,\n uploadedIndexing: ARBI.uploadedIndexing,\n afterUpload: ARBI.afterUpload,\n}\n\n/** The defaults with the host's assistant name, then the caller's labels. */\nfunction useUploadLabels(labels?: Partial<UploadPartsLabels>): UploadPartsLabels {\n const assistant = useAssistantCopy()\n return {\n ...DEFAULT_UPLOAD_PARTS_LABELS,\n uploadedIndexing: assistant.uploadedIndexing,\n afterUpload: assistant.afterUpload,\n ...labels,\n rejectedReasons: {\n ...DEFAULT_UPLOAD_PARTS_LABELS.rejectedReasons,\n ...labels?.rejectedReasons,\n },\n }\n}\n\n// ── Error banner ────────────────────────────────────────────────────────────────────────────\n\n/** Compact tinted error for the upload flow (status tone, not a boxed banner). */\nexport function UploadErrorMessage({\n message,\n className,\n testId,\n}: {\n message: string\n className?: string\n /** Overrides the root test id (default `error-message`). */\n testId?: string\n}) {\n return (\n <div\n role=\"alert\"\n className={cn('mt-6 flex items-center gap-2 rounded-lg bg-red-bg p-3', className)}\n data-testid={testIdOr(testId, { testId: 'error-message' })}\n >\n <AlertCircle className=\"size-5 shrink-0 text-red-text\" />\n <p className=\"text-base text-red-text\">{message}</p>\n </div>\n )\n}\n\n// ── Rejected files ──────────────────────────────────────────────────────────────────────────\n\nexport interface RejectedFile {\n name: string\n reason?: string\n}\n\nexport interface RejectedFilesListProps {\n /** Plain names are treated as \"unsupported\". */\n files: (string | RejectedFile)[]\n onClear: () => void\n labels?: Partial<UploadPartsLabels>\n testIds?: Partial<RejectedFilesTestIds>\n}\n\nexport interface RejectedFilesTestIds {\n root: string\n clear: string\n /** Replaces the whole `rejected-file-item-<group>-<index>` id. */\n item: (groupIndex: number, index: number) => string\n}\n\n/** Files that cannot be uploaded, grouped by rejection reason. */\nexport function RejectedFilesList({ files, onClear, labels, testIds }: RejectedFilesListProps) {\n const l = useUploadLabels(labels)\n if (files.length === 0) return null\n\n const byReason = new Map<string, string[]>()\n for (const file of files) {\n const reason = typeof file === 'string' ? 'unsupported' : file.reason || 'unsupported'\n const name = typeof file === 'string' ? file : file.name\n byReason.set(reason, [...(byReason.get(reason) ?? []), name])\n }\n\n return (\n <div\n className=\"mt-4 rounded-lg bg-red-bg p-3\"\n data-testid={testIdOr(testIds?.root, { testId: 'rejected-files-list' })}\n >\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"mt-0.5 size-5 shrink-0 text-red-text\" />\n <div className=\"flex-1\">\n {Array.from(byReason.entries()).map(([reason, names], groupIndex) => (\n <div key={reason} className={groupIndex > 0 ? 'mt-3' : ''}>\n <p className=\"mb-2 text-sm font-medium text-red-text\">\n {l.rejectedReasons[reason] ?? l.rejectedFallback}\n </p>\n <div className=\"space-y-1\">\n {names.map((name, index) => (\n <div\n key={index}\n className=\"rounded-md bg-background/60 p-2\"\n data-testid={testIdOr(testIds?.item?.(groupIndex, index), {\n testId: `rejected-file-item-${groupIndex}-${index}`,\n })}\n >\n <span className=\"text-sm text-red-text\">{name}</span>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClear}\n aria-label={l.clearRejected}\n className=\"size-6 text-red-text hover:text-red-text pointer-coarse:size-11\"\n data-testid={testIdOr(testIds?.clear, { testId: 'clear-rejected-files-button' })}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n </div>\n )\n}\n\n// ── Selected files ──────────────────────────────────────────────────────────────────────────\n\nfunction folderPathOf(file: File): string | null {\n const rel = file.webkitRelativePath\n if (!rel) return null\n const slash = rel.lastIndexOf('/')\n return slash > 0 ? rel.substring(0, slash) : null\n}\n\nexport interface SelectedFilesListProps {\n files: File[]\n onRemoveFile: (index: number) => void\n onClearAll?: () => void\n formatFileSize: (bytes: number) => string\n /** File-type glyph for a file name (the host owns its icon set). */\n renderFileIcon: (fileName: string) => ReactNode\n labels?: Partial<UploadPartsLabels>\n testIds?: Partial<SelectedFilesTestIds>\n}\n\nexport interface SelectedFilesTestIds {\n root: string\n clearAll: string\n /** Replaces the whole `selected-file-item-<index>` id. */\n item: (index: number) => string\n /** Replaces the whole `remove-file-button-<index>` id. */\n remove: (index: number) => string\n}\n\n/** The files chosen for upload, with total size, per-file remove and Clear All. */\nexport function SelectedFilesList({\n files,\n onRemoveFile,\n onClearAll,\n formatFileSize,\n renderFileIcon,\n labels,\n testIds,\n}: SelectedFilesListProps) {\n const l = useUploadLabels(labels)\n if (files.length === 0) return null\n const total = files.reduce((sum, f) => sum + f.size, 0)\n\n return (\n <div\n className=\"mt-2 sm:mt-6\"\n data-testid={testIdOr(testIds?.root, { testId: 'selected-files-list' })}\n >\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-col sm:flex-row sm:items-center sm:gap-4\">\n <h4 className=\"text-base font-medium\">{l.selectedFiles(files.length)}</h4>\n <p className=\"text-sm text-muted-foreground\">{l.total(formatFileSize(total))}</p>\n </div>\n {onClearAll && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClearAll}\n className=\"h-8 shrink-0 whitespace-nowrap text-muted-foreground hover:text-foreground pointer-coarse:h-11\"\n data-testid={testIdOr(testIds?.clearAll, { testId: 'clear-all-files-button' })}\n >\n {l.clearAll}\n <X className=\"ml-1 hidden size-4 sm:block\" />\n </Button>\n )}\n </div>\n <div className=\"space-y-1 overflow-y-auto overscroll-contain pr-1 sm:max-h-[300px]\">\n {files.map((file, index) => {\n const folder = folderPathOf(file)\n return (\n <div\n key={index}\n className=\"flex min-w-0 items-center gap-2 rounded-lg bg-muted p-3\"\n data-testid={testIdOr(testIds?.item?.(index), {\n testId: `selected-file-item-${index}`,\n })}\n >\n <div className=\"shrink-0\">{renderFileIcon(file.name)}</div>\n <div className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-base\" title={file.name}>\n {file.name}\n </span>\n {folder && (\n <span className=\"flex items-center gap-1 text-sm text-muted-foreground\">\n <FolderOpen className=\"size-3\" />\n {folder}\n </span>\n )}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => onRemoveFile(index)}\n aria-label={l.remove(file.name)}\n className=\"size-6 shrink-0 pointer-coarse:size-11\"\n data-testid={testIdOr(testIds?.remove?.(index), {\n testId: `remove-file-button-${index}`,\n })}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\n// ── Upload progress ─────────────────────────────────────────────────────────────────────────\n\nexport interface UploadProgressProps {\n fileCount: number\n entityLabel: string\n percentage: number\n /** Multi-batch uploads draw a tick between batches on the bar. */\n batchInfo?: { current: number; total: number } | null\n labels?: Partial<UploadPartsLabels>\n /** Overrides the root test id (default `upload-progress`). */\n testId?: string\n}\n\n/** Determinate upload bar with the copy for in-flight and complete states. */\nexport function UploadProgress({\n fileCount,\n entityLabel,\n percentage,\n batchInfo,\n labels,\n testId,\n}: UploadProgressProps) {\n const l = useUploadLabels(labels)\n const isComplete = percentage >= 100\n return (\n <div className=\"text-center\" data-testid={testIdOr(testId, { testId: 'upload-progress' })}>\n <h3 className=\"mb-2 text-lg font-medium\">\n {isComplete ? l.uploadComplete(entityLabel) : l.uploading(fileCount, entityLabel)}\n </h3>\n <div className=\"mx-auto mb-4 max-w-md\">\n <div className=\"relative\">\n <Progress value={percentage} className=\"h-3\" />\n {batchInfo && batchInfo.total > 1 && (\n <div className=\"pointer-events-none absolute inset-0\" aria-hidden=\"true\">\n {Array.from({ length: batchInfo.total - 1 }, (_, i) => (\n <span\n key={i}\n className=\"absolute top-0 h-full w-px bg-background/50\"\n style={{ left: `${((i + 1) / batchInfo.total) * 100}%` }}\n />\n ))}\n </div>\n )}\n </div>\n <div className=\"mt-2 flex items-center justify-center text-sm text-muted-foreground\">\n <span>{Math.round(percentage)}%</span>\n </div>\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {isComplete ? l.uploadedIndexing : l.afterUpload}\n </p>\n </div>\n )\n}\n","import type { DragEventHandler, MouseEventHandler, ReactNode } from 'react'\nimport { FileText, FolderPlus, Globe, Loader2, Upload } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the upload source parts. */\nexport interface UploadSourcesLabels {\n uploadFiles: string\n uploadFolder: string\n}\n\nexport const DEFAULT_UPLOAD_SOURCES_LABELS: UploadSourcesLabels = {\n uploadFiles: 'Choose files',\n uploadFolder: 'Choose a folder',\n}\n\nexport interface UploadFrameProps {\n isCompact?: boolean\n /** Dimmed while disabled or while files are being processed. */\n isDimmed?: boolean\n className?: string\n children: ReactNode\n}\n\n/** Outer column of the upload surface: drop area, source picker or a single source. */\nexport function UploadFrame({ isCompact, isDimmed, className, children }: UploadFrameProps) {\n return (\n <div\n data-slot=\"upload-frame\"\n className={cn(\n 'relative flex w-full flex-col items-center',\n isCompact ? 'gap-4' : 'gap-6',\n isDimmed && 'opacity-50',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\nexport interface UploadDropAreaProps {\n isActive: boolean\n isDisabled: boolean\n isProcessing: boolean\n processingMessage: string\n isCompact?: boolean\n title: string\n subtitle?: string\n onDrag: DragEventHandler<HTMLDivElement>\n onDrop: DragEventHandler<HTMLDivElement>\n /** Receives clicks on the area itself (the host filters out clicks on child buttons). */\n onClick: MouseEventHandler<HTMLDivElement>\n /** Browse actions shown inside the box (compact mode). */\n actions?: ReactNode\n testId?: string\n}\n\n/** The drag-and-drop box: icon, title, subtitle, a processing overlay and optional actions. */\nexport function UploadDropArea({\n isActive,\n isDisabled,\n isProcessing,\n processingMessage,\n isCompact,\n title,\n subtitle,\n onDrag,\n onDrop,\n onClick,\n actions,\n testId = 'upload-dropzone-area',\n}: UploadDropAreaProps) {\n const active = isActive && !isDisabled\n return (\n <div\n data-slot=\"upload-drop-area\"\n data-testid={testId}\n onDragEnter={onDrag}\n onDragLeave={onDrag}\n onDragOver={onDrag}\n onDrop={onDrop}\n onClick={onClick}\n className={cn(\n 'relative flex w-full flex-col items-center justify-center rounded-lg border text-center transition-colors',\n active\n ? 'border-dashed border-primary bg-accent'\n : 'border-border bg-card shadow-xs hover:border-ring/50 hover:bg-accent/40',\n isDisabled || isProcessing ? 'cursor-not-allowed' : 'cursor-pointer',\n isCompact ? 'min-h-[150px] p-4' : 'min-h-[200px] p-5',\n // Touch screens cannot drag files in: the area stays in the DOM (assistive tech, e2e) but\n // the \"Choose files / folder\" buttons are the whole affordance.\n 'pointer-coarse:sr-only'\n )}\n >\n {isProcessing && (\n <div\n role=\"status\"\n className=\"absolute inset-0 z-10 flex flex-col items-center justify-center rounded-lg bg-background/80\"\n >\n <Loader2 className=\"mb-3 size-8 animate-spin text-primary\" />\n <div className=\"progress-bar-processing mb-3 h-1.5 w-48 rounded-sm\" />\n <p className=\"text-sm text-muted-foreground\">{processingMessage}</p>\n </div>\n )}\n <div\n className={cn(\n 'mb-2 flex items-center justify-center rounded-full bg-muted text-muted-foreground',\n isCompact ? 'size-11' : 'size-10',\n active && 'bg-primary/10 text-primary'\n )}\n >\n <Upload className=\"size-5\" />\n </div>\n <h4 className=\"text-sm font-semibold text-foreground\">{title}</h4>\n {subtitle && <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{subtitle}</p>}\n {actions}\n </div>\n )\n}\n\nexport interface UploadBrowseButtonsProps {\n onFiles: MouseEventHandler<HTMLButtonElement>\n onFolder: MouseEventHandler<HTMLButtonElement>\n isDisabled?: boolean\n /** `inline` sits inside the drop box; `grid` is two full-width columns below it. */\n layout?: 'inline' | 'grid'\n labels?: Partial<UploadSourcesLabels>\n}\n\n/** \"Choose files\" + \"Choose a folder\" buttons (ids `upload-files-button`, `upload-folder-button`). */\nexport function UploadBrowseButtons({\n onFiles,\n onFolder,\n isDisabled,\n layout = 'inline',\n labels,\n}: UploadBrowseButtonsProps) {\n const l = { ...DEFAULT_UPLOAD_SOURCES_LABELS, ...labels }\n const isInline = layout === 'inline'\n const size = isInline ? 'sm' : 'default'\n const width = isInline ? undefined : 'w-full'\n return (\n <div\n data-slot=\"upload-browse-buttons\"\n className={\n isInline\n ? 'mt-3 flex flex-wrap items-center justify-center gap-2'\n : 'grid grid-cols-1 gap-2 sm:grid-cols-2'\n }\n >\n <Button\n variant={isInline ? 'outline' : 'default'}\n size={size}\n className={width}\n onClick={onFiles}\n disabled={isDisabled}\n data-testid=\"upload-files-button\"\n >\n <FileText className=\"mr-2 size-4\" />\n {l.uploadFiles}\n </Button>\n <Button\n variant=\"outline\"\n size={size}\n className={width}\n onClick={onFolder}\n disabled={isDisabled}\n data-testid=\"upload-folder-button\"\n >\n <FolderPlus className=\"mr-2 size-4\" />\n {l.uploadFolder}\n </Button>\n </div>\n )\n}\n\nexport interface UploadSourceOption {\n key: string\n label: string\n description: string\n icon: ReactNode\n onClick?: () => void\n /** Wraps the option's button (e.g. in a dialog trigger that owns its click). */\n wrap?: (button: ReactNode) => ReactNode\n}\n\nexport interface UploadSourcePickerProps {\n options: UploadSourceOption[]\n isDisabled?: boolean\n}\n\n/** Chooser of where files come from (ids `upload-source-picker`, `upload-source-pick-<key>`). */\nexport function UploadSourcePicker({ options, isDisabled }: UploadSourcePickerProps) {\n return (\n <div\n data-slot=\"upload-source-picker\"\n className=\"flex w-full flex-col gap-2\"\n data-testid=\"upload-source-picker\"\n >\n {options.map((o) => {\n const button = (\n <Button\n variant=\"outline\"\n onClick={o.onClick}\n disabled={isDisabled}\n data-testid={`upload-source-pick-${o.key}`}\n className=\"h-auto w-full justify-start gap-3 px-4 py-3 text-left\"\n >\n <span className=\"shrink-0 text-muted-foreground [&_svg]:size-5\">{o.icon}</span>\n <span className=\"flex flex-col\">\n <span className=\"text-sm font-medium\">{o.label}</span>\n <span className=\"text-xs font-normal text-muted-foreground\">{o.description}</span>\n </span>\n </Button>\n )\n return (\n <span key={o.key} className=\"contents\">\n {o.wrap ? o.wrap(button) : button}\n </span>\n )\n })}\n </div>\n )\n}\n\nexport interface UploadUrlButtonProps {\n isCompact?: boolean\n isDisabled?: boolean\n label?: string\n /** Set when the button is not wrapped in a trigger that owns its click. */\n onClick?: () => void\n}\n\n/** \"Add from URL\" button (id `upload-url-button`); wrap it in the URL dialog's trigger. */\nexport function UploadUrlButton({\n isCompact,\n isDisabled,\n label = 'Add from URL',\n onClick,\n}: UploadUrlButtonProps) {\n return (\n <Button\n variant=\"outline\"\n size={isCompact ? 'sm' : 'default'}\n disabled={isDisabled}\n onClick={onClick}\n data-testid=\"upload-url-button\"\n >\n <Globe className=\"mr-2 size-4\" />\n {label}\n </Button>\n )\n}\n\nexport interface UploadSourceSectionProps {\n testId?: string\n className?: string\n /** Swallow clicks so a surrounding clickable area does not also fire. */\n isIsolated?: boolean\n children: ReactNode\n}\n\n/** One focused source (computer / internet / email) of the scoped upload view. */\nexport function UploadSourceSection({\n testId,\n className,\n isIsolated,\n children,\n}: UploadSourceSectionProps) {\n return (\n <div\n data-slot=\"upload-source-section\"\n data-testid={testId}\n className={className}\n onClick={isIsolated ? (e) => e.stopPropagation() : undefined}\n >\n {children}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n AlertTriangle,\n CheckCircle2,\n Copy,\n Download,\n FolderInput,\n Users,\n XCircle,\n} from 'lucide-react'\nimport {\n Badge,\n Button,\n Label,\n RadioGroup,\n RadioGroupItem,\n ScrollArea,\n cn,\n} from '@arbidocs/react/ui'\nimport { ModalSection, ModalSectionTitle } from '../settings/ModalScaffold'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the export parts. Pass a partial `labels` to translate or reword. */\nexport interface ExportLabels {\n export: string\n selected: (count: number) => string\n exportMethod: string\n downloadToComputer: string\n downloadDescription: string\n copyToWorkspace: string\n copyDescription: string\n moveToWorkspace: string\n moveDescription: string\n exportColumns: string\n columnsVisible: string\n columnsAll: string\n columnsFiles: string\n columnsHelp: string\n selectTargetWorkspace: string\n noOtherWorkspaces: string\n member: string\n members: string\n result: string\n noItemDetail: string\n done: string\n cancel: string\n}\n\nexport const DEFAULT_EXPORT_LABELS: ExportLabels = {\n export: 'Export, copy or move',\n selected: (count) => `${count} selected`,\n exportMethod: 'Where to',\n downloadToComputer: 'Download as files',\n downloadDescription:\n 'A ZIP with the files (every version), one data file per kind (JSON) and a manifest',\n copyToWorkspace: 'Copy to another workspace',\n copyDescription: 'Re-encrypted for the target workspace; nothing changes here',\n moveToWorkspace: 'Move to another workspace',\n moveDescription: 'Copied first, then removed from here — only what you may delete here',\n exportColumns: 'Document table (index.csv)',\n columnsVisible: 'Visible columns (from current table view)',\n columnsAll: 'All columns (including hidden)',\n columnsFiles: 'None (files and data only)',\n columnsHelp: 'Which document columns go into index.csv',\n selectTargetWorkspace: 'Select Target Workspace',\n noOtherWorkspaces: 'No other workspaces available',\n member: 'member',\n members: 'members',\n result: 'Result',\n noItemDetail: 'The server returned no per-item detail.',\n done: 'Done',\n cancel: 'Cancel',\n}\n\n// ── Header ──────────────────────────────────────────────────────────────────────────────────\n\nexport interface ExportModalTitleProps {\n /** Workspace crumb (icon + name); omit when there is no current workspace. */\n workspace?: { icon: ReactNode; name: string }\n /** Icon and plural noun of what is exported (the selection count badge hides at 0). */\n entityIcon: ReactNode\n entityPlural: string\n selectedCount: number\n labels?: Partial<ExportLabels>\n}\n\n/** `Workspace / Chats / Export [3 selected]` for the Export dialog title. */\nexport function ExportModalTitle({\n workspace,\n entityIcon,\n entityPlural,\n selectedCount,\n labels,\n}: ExportModalTitleProps) {\n const l = { ...DEFAULT_EXPORT_LABELS, ...labels }\n return (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span>{l.export}</span>\n {selectedCount > 0 && (\n <Badge className=\"bg-accent px-2.5 py-0.5 text-accent-foreground hover:bg-accent\">\n <span className=\"font-semibold\">{l.selected(selectedCount)}</span>\n </Badge>\n )}\n </div>\n {workspace && (\n <div className=\"flex min-w-0 items-center gap-1.5 text-sm font-normal text-muted-foreground\">\n <span className=\"shrink-0\">{workspace.icon}</span>\n <span className=\"truncate\" title={workspace.name}>\n {workspace.name}\n </span>\n <span aria-hidden=\"true\">/</span>\n <span className=\"shrink-0\">{entityIcon}</span>\n <span className=\"truncate\">{entityPlural}</span>\n </div>\n )}\n </div>\n )\n}\n\n// ── Destination chooser ─────────────────────────────────────────────────────────────────────\n\nexport type ExportMode = 'download' | 'copy' | 'move'\nexport type ExportColumnsMode = 'visible' | 'all' | 'files'\n\nexport interface ExportMethodChooserProps {\n mode: ExportMode\n onModeChange: (mode: ExportMode) => void\n columnsMode: ExportColumnsMode\n onColumnsModeChange: (mode: ExportColumnsMode) => void\n /** Offer the index.csv columns picker under \"Download\" (when documents are involved). */\n showColumns?: boolean\n /** Why \"Move\" is unavailable (e.g. a guest cannot remove anything here); disables it. */\n moveDisabledReason?: string\n labels?: Partial<ExportLabels>\n /** Overrides the columns select test id (default `export-columns-selector`). */\n columnsTestId?: string\n}\n\n/** Download as files, copy to another workspace, or move there — with the CSV columns picker. */\nexport function ExportMethodChooser({\n mode,\n onModeChange,\n columnsMode,\n onColumnsModeChange,\n showColumns = true,\n moveDisabledReason,\n labels,\n columnsTestId,\n}: ExportMethodChooserProps) {\n const l = { ...DEFAULT_EXPORT_LABELS, ...labels }\n const card =\n 'flex cursor-pointer items-start space-x-3 rounded-lg bg-muted p-4 transition-colors hover:bg-accent'\n const options: {\n value: ExportMode\n icon: typeof Download\n title: string\n description: string\n disabledReason?: string\n }[] = [\n {\n value: 'download',\n icon: Download,\n title: l.downloadToComputer,\n description: l.downloadDescription,\n },\n { value: 'copy', icon: Copy, title: l.copyToWorkspace, description: l.copyDescription },\n {\n value: 'move',\n icon: FolderInput,\n title: l.moveToWorkspace,\n description: moveDisabledReason ?? l.moveDescription,\n disabledReason: moveDisabledReason,\n },\n ]\n return (\n <ModalSection>\n <ModalSectionTitle>{l.exportMethod}</ModalSectionTitle>\n <RadioGroup\n value={mode}\n onValueChange={(v) => onModeChange(v as ExportMode)}\n className=\"space-y-3\"\n >\n {options.map((option) => {\n const Icon = option.icon\n const disabled = !!option.disabledReason\n return (\n <div\n key={option.value}\n className={cn(card, disabled && 'cursor-not-allowed opacity-60 hover:bg-muted')}\n >\n <RadioGroupItem\n value={option.value}\n id={`export-mode-${option.value}`}\n className=\"mt-1\"\n disabled={disabled}\n />\n <div className=\"flex-1\" onClick={() => !disabled && onModeChange(option.value)}>\n <Label\n htmlFor={`export-mode-${option.value}`}\n className=\"flex cursor-pointer items-center gap-2 font-medium\"\n >\n <Icon className=\"size-4\" />\n {option.title}\n </Label>\n <p className=\"mt-1 text-sm text-muted-foreground\">{option.description}</p>\n {option.value === 'download' && mode === 'download' && showColumns && (\n <div className=\"mt-3\" onClick={(e) => e.stopPropagation()}>\n <label className=\"text-sm font-medium text-foreground\">{l.exportColumns}</label>\n <select\n value={columnsMode}\n onChange={(e) => onColumnsModeChange(e.target.value as ExportColumnsMode)}\n className=\"mt-1.5 w-full rounded-md border border-input bg-background px-3 py-2 text-sm pointer-coarse:min-h-11\"\n data-testid={testIdOr(columnsTestId, { testId: 'export-columns-selector' })}\n >\n <option value=\"visible\">{l.columnsVisible}</option>\n <option value=\"all\">{l.columnsAll}</option>\n <option value=\"files\">{l.columnsFiles}</option>\n </select>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{l.columnsHelp}</p>\n </div>\n )}\n </div>\n </div>\n )\n })}\n </RadioGroup>\n </ModalSection>\n )\n}\n\n// ── Target workspace picker ─────────────────────────────────────────────────────────────────\n\nexport interface ExportWorkspaceOption {\n id: string\n name: string\n description?: string | null\n memberCount: number\n /** Workspace icon (32px). */\n icon: ReactNode\n /** Member avatars (the host decides which and how many). */\n members?: ReactNode\n}\n\nexport interface ExportWorkspacePickerProps {\n workspaces: ExportWorkspaceOption[]\n selectedId: string | null\n onSelect: (id: string) => void\n labels?: Partial<ExportLabels>\n /** Replaces the whole `export-workspace-<id>` id. */\n testId?: (id: string) => string\n}\n\n/** Pick the workspace to export into. */\nexport function ExportWorkspacePicker({\n workspaces,\n selectedId,\n onSelect,\n labels,\n testId,\n}: ExportWorkspacePickerProps) {\n const l = { ...DEFAULT_EXPORT_LABELS, ...labels }\n return (\n <ModalSection>\n <ModalSectionTitle>{l.selectTargetWorkspace}</ModalSectionTitle>\n <ScrollArea className=\"h-[300px] rounded-lg bg-muted\">\n <div className=\"space-y-2 p-2\">\n {workspaces.length === 0 ? (\n <p className=\"py-4 text-center text-sm text-muted-foreground\">{l.noOtherWorkspaces}</p>\n ) : (\n workspaces.map((w) => (\n <button\n key={w.id}\n type=\"button\"\n onClick={() => onSelect(w.id)}\n aria-pressed={selectedId === w.id}\n data-testid={testIdOr(testId?.(w.id), { testId: `export-workspace-${w.id}` })}\n className={cn(\n 'w-full rounded-lg p-3 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selectedId === w.id\n ? 'bg-accent ring-1 ring-primary/40'\n : 'bg-background hover:bg-accent/60'\n )}\n >\n <div className=\"mb-2 flex items-start gap-3\">\n {w.icon}\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium\">{w.name}</div>\n {w.description && (\n <div className=\"mt-0.5 truncate text-sm text-muted-foreground\">\n {w.description}\n </div>\n )}\n </div>\n </div>\n <div className=\"flex items-center justify-between border-t border-border pt-2\">\n <div className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <Users className=\"size-3\" />\n <span>\n {w.memberCount} {w.memberCount === 1 ? l.member : l.members}\n </span>\n </div>\n {w.members}\n </div>\n </button>\n ))\n )}\n </div>\n </ScrollArea>\n </ModalSection>\n )\n}\n\n// ── Results report ──────────────────────────────────────────────────────────────────────────\n\nexport interface ExportResultRowView {\n id: string\n tone: 'success' | 'warning' | 'error'\n name: string\n /** User-facing kind, e.g. \"Document\". */\n kind: string\n detail?: string\n}\n\nconst RESULT_ICON = { success: CheckCircle2, warning: AlertTriangle, error: XCircle } as const\nconst RESULT_ICON_CLASS = {\n success: 'text-green-text',\n warning: 'text-yellow-text',\n error: 'text-red-text',\n} as const\n\nexport interface ExportResultsReportProps {\n /** One-line outcome, e.g. \"Exported 3 documents. 1 failed.\" */\n summary: string\n /** Failures first, then warnings, then clean rows (the host orders them). */\n rows: ExportResultRowView[]\n onDone: () => void\n labels?: Partial<ExportLabels>\n testIds?: Partial<ExportResultsTestIds>\n}\n\nexport interface ExportResultsTestIds {\n root: string\n summary: string\n done: string\n /** Replaces the whole `export-result-<id>` id. */\n row: (id: string) => string\n}\n\n/**\n * Per-item outcome list. A batch can come back part-succeeded, with warnings that are not\n * failures, so every item that did not cleanly succeed is named with its reason.\n */\nexport function ExportResultsReport({\n summary,\n rows,\n onDone,\n labels,\n testIds,\n}: ExportResultsReportProps) {\n const l = { ...DEFAULT_EXPORT_LABELS, ...labels }\n return (\n <ModalSection data-testid={testIdOr(testIds?.root, { testId: 'export-results' })}>\n <ModalSectionTitle>{l.result}</ModalSectionTitle>\n <p\n className=\"text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.summary, { testId: 'export-results-summary' })}\n >\n {summary}\n </p>\n <ScrollArea className=\"mt-3 h-[280px] rounded-lg bg-muted\">\n <div className=\"space-y-1 p-2\">\n {rows.map((row) => {\n const Icon = RESULT_ICON[row.tone]\n return (\n <div\n key={row.id}\n className=\"flex items-start gap-2 rounded-md px-2 py-1.5\"\n data-testid={testIdOr(testIds?.row?.(row.id), {\n testId: `export-result-${row.id}`,\n })}\n >\n <Icon className={cn('mt-0.5 size-4 shrink-0', RESULT_ICON_CLASS[row.tone])} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-sm\">{row.name}</span>\n <span className=\"shrink-0 text-xs uppercase tracking-wide text-muted-foreground\">\n {row.kind}\n </span>\n </div>\n {row.detail && (\n <p className=\"mt-0.5 break-words text-sm text-muted-foreground\">{row.detail}</p>\n )}\n </div>\n </div>\n )\n })}\n {rows.length === 0 && (\n <p className=\"py-4 text-center text-sm text-muted-foreground\">{l.noItemDetail}</p>\n )}\n </div>\n </ScrollArea>\n <div className=\"mt-4 flex justify-end\">\n <Button\n onClick={onDone}\n data-testid={testIdOr(testIds?.done, { testId: 'export-results-done-button' })}\n >\n {l.done}\n </Button>\n </div>\n </ModalSection>\n )\n}\n\n// ── Footer ──────────────────────────────────────────────────────────────────────────────────\n\nexport interface ExportFooterProps {\n onCancel?: () => void\n onSubmit: () => void\n submitLabel: string\n submitDisabled: boolean\n labels?: Partial<ExportLabels>\n testIds?: Partial<{ cancel: string; submit: string }>\n}\n\n/** Sticky Cancel + the ONE primary Export button. */\nexport function ExportFooter({\n onCancel,\n onSubmit,\n submitLabel,\n submitDisabled,\n labels,\n testIds,\n}: ExportFooterProps) {\n const l = { ...DEFAULT_EXPORT_LABELS, ...labels }\n return (\n <div className=\"sticky bottom-0 flex flex-col-reverse sm:flex-row sm:justify-end gap-2 border-t border-border bg-background p-4\">\n <Button\n variant=\"outline\"\n onClick={onCancel}\n data-testid={testIdOr(testIds?.cancel, { testId: 'export-cancel-button' })}\n >\n {l.cancel}\n </Button>\n <Button\n onClick={onSubmit}\n disabled={submitDisabled}\n data-testid={testIdOr(testIds?.submit, { testId: 'export-submit-button' })}\n >\n {submitLabel}\n </Button>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { AlertTriangle, Info, Loader2, RotateCcw } from 'lucide-react'\nimport {\n Button,\n Checkbox,\n Label,\n Progress,\n RadioGroup,\n RadioGroupItem,\n cn,\n} from '@arbidocs/react/ui'\nimport { ModalSection, ModalSectionTitle } from '../settings/ModalScaffold'\n\n/**\n * The \"what\" half of the Export / copy / move dialog: scope, entity types,\n * cited documents, conflicts; plus the plan summary, the job's progress and the\n * resume banner. The \"where\" half (destination, target workspace, results) is\n * in `ExportParts`. Presentational only — the host resolves scope into counts.\n */\n\nexport interface TransferLabels {\n what: string\n scopeSelection: (count: number) => string\n scopeLabel: string\n scopeAll: string\n chooseLabel: string\n include: string\n references: string\n referencesInclude: string\n referencesLink: string\n referencesHelp: string\n conflicts: string\n conflictSkip: string\n conflictKeepBoth: string\n summary: string\n summaryLoading: string\n hide: string\n cancelJob: string\n resume: string\n}\n\nexport const DEFAULT_TRANSFER_LABELS: TransferLabels = {\n what: 'What',\n scopeSelection: (count) => `The ${count} selected`,\n scopeLabel: 'Everything with a label',\n scopeAll: 'Everything in this workspace',\n chooseLabel: 'Label',\n include: 'Include',\n references: 'Documents they cite',\n referencesInclude: 'Bring them along',\n referencesLink: 'Leave them here (the citation keeps pointing here)',\n referencesHelp: 'Notes, conversations and automations can cite documents outside your selection.',\n conflicts: 'Already in the target',\n conflictSkip: 'Skip it (same-named file or automation, identical note)',\n conflictKeepBoth: 'Keep both — the copy is renamed \"name (2)\"',\n summary: 'This will include',\n summaryLoading: 'Working out what is included…',\n hide: 'Close — it keeps going',\n cancelJob: 'Stop',\n resume: 'Resume',\n}\n\n// ── Scope ───────────────────────────────────────────────────────────────────────────────────\n\nexport type TransferScopeChoice = 'selection' | 'label' | 'all'\n\nexport interface TransferLabelOption {\n id: string\n name: string\n}\n\nexport interface TransferScopeChooserProps {\n scope: TransferScopeChoice\n onScopeChange: (scope: TransferScopeChoice) => void\n /** How many items the dialog was opened with; 0 hides \"selected\". */\n selectedCount: number\n labelOptions: TransferLabelOption[]\n labelId: string | null\n onLabelChange: (id: string) => void\n labels?: Partial<TransferLabels>\n}\n\n/** Selected items, everything with one label, or everything. */\nexport function TransferScopeChooser({\n scope,\n onScopeChange,\n selectedCount,\n labelOptions,\n labelId,\n onLabelChange,\n labels,\n}: TransferScopeChooserProps) {\n const l = { ...DEFAULT_TRANSFER_LABELS, ...labels }\n const choices: {\n value: TransferScopeChoice\n title: string\n hidden?: boolean\n disabled?: boolean\n }[] = [\n { value: 'selection', title: l.scopeSelection(selectedCount), hidden: selectedCount === 0 },\n { value: 'label', title: l.scopeLabel, disabled: labelOptions.length === 0 },\n { value: 'all', title: l.scopeAll },\n ]\n return (\n <ModalSection data-testid=\"transfer-scope\">\n <ModalSectionTitle>{l.what}</ModalSectionTitle>\n <RadioGroup\n value={scope}\n onValueChange={(v) => onScopeChange(v as TransferScopeChoice)}\n className=\"space-y-2\"\n >\n {choices\n .filter((c) => !c.hidden)\n .map((c) => (\n <div key={c.value} className=\"flex items-center gap-3\">\n <RadioGroupItem\n value={c.value}\n id={`transfer-scope-${c.value}`}\n disabled={c.disabled}\n data-testid={`transfer-scope-${c.value}`}\n />\n <Label htmlFor={`transfer-scope-${c.value}`} className=\"cursor-pointer\">\n {c.title}\n </Label>\n {c.value === 'label' && scope === 'label' && (\n <select\n aria-label={l.chooseLabel}\n value={labelId ?? ''}\n onChange={(e) => onLabelChange(e.target.value)}\n className=\"min-w-0 flex-1 rounded-md border border-input bg-background px-2 py-1 text-sm pointer-coarse:min-h-11\"\n data-testid=\"transfer-scope-label-select\"\n >\n {labelOptions.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n )}\n </div>\n ))}\n </RadioGroup>\n </ModalSection>\n )\n}\n\n// ── Entity types ────────────────────────────────────────────────────────────────────────────\n\nexport interface TransferKindOption {\n kind: string\n label: string\n /** What the current scope holds of this kind; undefined while counting. */\n count?: number\n}\n\nexport interface TransferKindsPickerProps {\n options: TransferKindOption[]\n selected: string[]\n onToggle: (kind: string, checked: boolean) => void\n labels?: Partial<TransferLabels>\n}\n\n/** One checkbox per entity type, each with what the scope holds of it. */\nexport function TransferKindsPicker({\n options,\n selected,\n onToggle,\n labels,\n}: TransferKindsPickerProps) {\n const l = { ...DEFAULT_TRANSFER_LABELS, ...labels }\n return (\n <ModalSection data-testid=\"transfer-kinds\">\n <ModalSectionTitle>{l.include}</ModalSectionTitle>\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-2\">\n {options.map((option) => {\n const id = `transfer-kind-${option.kind}`\n return (\n <div\n key={option.kind}\n className=\"flex items-center gap-2 rounded-md bg-muted px-3 py-2\"\n >\n <Checkbox\n id={id}\n checked={selected.includes(option.kind)}\n onCheckedChange={(checked) => onToggle(option.kind, checked === true)}\n data-testid={id}\n />\n <Label htmlFor={id} className=\"flex-1 cursor-pointer\">\n {option.label}\n </Label>\n {option.count !== undefined && (\n <span\n className=\"text-sm tabular-nums text-muted-foreground\"\n data-testid={`${id}-count`}\n >\n {option.count}\n </span>\n )}\n </div>\n )\n })}\n </div>\n </ModalSection>\n )\n}\n\n// ── Two small choices ───────────────────────────────────────────────────────────────────────\n\ninterface ChoiceRowsProps<T extends string> {\n title: string\n value: T\n onChange: (value: T) => void\n choices: { value: T; title: string }[]\n help?: ReactNode\n testId: string\n}\n\nfunction ChoiceRows<T extends string>({\n title,\n value,\n onChange,\n choices,\n help,\n testId,\n}: ChoiceRowsProps<T>) {\n return (\n <ModalSection data-testid={testId}>\n <ModalSectionTitle>{title}</ModalSectionTitle>\n {help && <p className=\"mb-2 text-sm text-muted-foreground\">{help}</p>}\n <RadioGroup value={value} onValueChange={(v) => onChange(v as T)} className=\"space-y-2\">\n {choices.map((c) => (\n <div key={c.value} className=\"flex items-center gap-3\">\n <RadioGroupItem\n value={c.value}\n id={`${testId}-${c.value}`}\n data-testid={`${testId}-${c.value}`}\n />\n <Label htmlFor={`${testId}-${c.value}`} className=\"cursor-pointer\">\n {c.title}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </ModalSection>\n )\n}\n\nexport type TransferReferencesChoice = 'include' | 'link'\n\nexport function TransferReferencesChooser({\n value,\n onChange,\n labels,\n}: {\n value: TransferReferencesChoice\n onChange: (value: TransferReferencesChoice) => void\n labels?: Partial<TransferLabels>\n}) {\n const l = { ...DEFAULT_TRANSFER_LABELS, ...labels }\n return (\n <ChoiceRows\n title={l.references}\n help={l.referencesHelp}\n value={value}\n onChange={onChange}\n testId=\"transfer-references\"\n choices={[\n { value: 'include', title: l.referencesInclude },\n { value: 'link', title: l.referencesLink },\n ]}\n />\n )\n}\n\nexport type TransferConflictChoice = 'skip' | 'keep_both'\n\nexport function TransferConflictChooser({\n value,\n onChange,\n labels,\n}: {\n value: TransferConflictChoice\n onChange: (value: TransferConflictChoice) => void\n labels?: Partial<TransferLabels>\n}) {\n const l = { ...DEFAULT_TRANSFER_LABELS, ...labels }\n return (\n <ChoiceRows\n title={l.conflicts}\n value={value}\n onChange={onChange}\n testId=\"transfer-conflict\"\n choices={[\n { value: 'skip', title: l.conflictSkip },\n { value: 'keep_both', title: l.conflictKeepBoth },\n ]}\n />\n )\n}\n\n// ── Plan summary ────────────────────────────────────────────────────────────────────────────\n\nexport interface TransferPlanSummaryProps {\n /** e.g. \"12 documents (5 older versions and 3 attachments come with them)\". */\n lines: string[]\n /** What will NOT be kept as-is: dropped links, dangling citations, items that stay. */\n warnings: string[]\n isLoading?: boolean\n labels?: Partial<TransferLabels>\n}\n\nexport function TransferPlanSummary({\n lines,\n warnings,\n isLoading,\n labels,\n}: TransferPlanSummaryProps) {\n const l = { ...DEFAULT_TRANSFER_LABELS, ...labels }\n return (\n <ModalSection data-testid=\"transfer-plan-summary\">\n <ModalSectionTitle>{l.summary}</ModalSectionTitle>\n {isLoading && lines.length === 0 ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" />\n {l.summaryLoading}\n </p>\n ) : (\n <ul className=\"space-y-1 text-sm\">\n {lines.map((line) => (\n <li key={line} className=\"flex items-start gap-2\">\n <Info className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <span>{line}</span>\n </li>\n ))}\n </ul>\n )}\n {warnings.length > 0 && (\n <ul className=\"mt-2 space-y-1 text-sm\" data-testid=\"transfer-plan-warnings\">\n {warnings.map((warning) => (\n <li key={warning} className=\"flex items-start gap-2\">\n <AlertTriangle className=\"mt-0.5 size-4 shrink-0 text-yellow-text\" />\n <span>{warning}</span>\n </li>\n ))}\n </ul>\n )}\n </ModalSection>\n )\n}\n\n// ── Progress + resume ───────────────────────────────────────────────────────────────────────\n\nexport interface TransferProgressViewProps {\n title: string\n processed: number\n total: number\n /** \"Copying\", \"Linking\", \"Removing from this workspace\" … */\n phaseLabel: string\n onHide?: () => void\n onCancel?: () => void\n isCancelling?: boolean\n labels?: Partial<TransferLabels>\n}\n\nexport function TransferProgressView({\n title,\n processed,\n total,\n phaseLabel,\n onHide,\n onCancel,\n isCancelling,\n labels,\n}: TransferProgressViewProps) {\n const l = { ...DEFAULT_TRANSFER_LABELS, ...labels }\n const percent = total > 0 ? Math.min(100, Math.round((processed / total) * 100)) : 0\n return (\n <ModalSection data-testid=\"transfer-progress\">\n <ModalSectionTitle>{title}</ModalSectionTitle>\n <Progress value={percent} className=\"h-2\" />\n <p className=\"mt-2 text-sm text-muted-foreground\" data-testid=\"transfer-progress-text\">\n {phaseLabel} · {processed} / {total}\n </p>\n <div className=\"mt-4 flex justify-end gap-2\">\n {onCancel && (\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isCancelling}\n data-testid=\"transfer-cancel-button\"\n >\n {l.cancelJob}\n </Button>\n )}\n {onHide && (\n <Button onClick={onHide} data-testid=\"transfer-hide-button\">\n {l.hide}\n </Button>\n )}\n </div>\n </ModalSection>\n )\n}\n\nexport function TransferResumeBanner({\n message,\n onResume,\n isResuming,\n labels,\n}: {\n message: string\n onResume: () => void\n isResuming?: boolean\n labels?: Partial<TransferLabels>\n}) {\n const l = { ...DEFAULT_TRANSFER_LABELS, ...labels }\n return (\n <div\n className={cn('flex items-center gap-3 rounded-lg bg-muted p-3 text-sm')}\n data-testid=\"transfer-resume-banner\"\n >\n <AlertTriangle className=\"size-4 shrink-0 text-yellow-text\" />\n <span className=\"flex-1\">{message}</span>\n <Button\n size=\"sm\"\n onClick={onResume}\n disabled={isResuming}\n data-testid=\"transfer-resume-button\"\n >\n <RotateCcw className=\"size-4\" />\n {l.resume}\n </Button>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Check,\n ChevronLeft,\n ChevronRight,\n Crop,\n GitCompare,\n ImagePlus,\n Loader2,\n Pencil,\n X,\n ZoomIn,\n} from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the viewer chrome and parts. Pass a partial `labels` to translate or reword. */\nexport interface ViewerLabels {\n useAsReference: string\n useAsReferenceTitle: string\n crop: string\n cropTitle: string\n previousPage: string\n nextPage: string\n /** The zoom button's accessible name; `level` is the current zoom, e.g. \"150%\". */\n zoom: (level: string) => string\n pageInput: string\n pageOfTitle: string\n pageOf: (page: number, total: number) => string\n previewUnavailable: string\n cannotPreview: (extension: string) => string\n downloadToOpen: string\n download: string\n}\n\nexport const DEFAULT_VIEWER_LABELS: ViewerLabels = {\n useAsReference: 'Use as reference',\n useAsReferenceTitle: 'Use as reference for a new image generation',\n crop: 'Crop',\n cropTitle: 'Crop and save as a new version',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n zoom: (level) => `Zoom ${level}. Click to zoom in further, then back to fit the page width.`,\n pageInput: 'Page number input',\n pageOfTitle: 'Click to go to page',\n pageOf: (page, total) => `Page ${page} of ${total}. Click to navigate.`,\n previewUnavailable: 'Preview not available',\n cannotPreview: (extension) => `${extension} files cannot be previewed in the browser.`,\n downloadToOpen: 'Download to open',\n download: 'Download',\n}\n\nexport interface ViewerFrameTestIds {\n root: string\n compareRow: string\n /** Replaces the whole `document-viewer-content-<id>` id. */\n content: string\n}\n\n// ── Frame ───────────────────────────────────────────────────────────────────────────────────\n\nexport interface ViewerFrameProps {\n /** The sticky top bar (tabs + title + actions). */\n header: ReactNode\n /** \"Comparing against...\" chips, shown on their own row under the header when set. */\n compareRow?: ReactNode\n /** Document id; the content area's test id is `document-viewer-content-{id}`. */\n contentId: string\n children: ReactNode\n /** Rendered after the content area (modals owned by the viewer, e.g. crop). */\n footer?: ReactNode\n frameRef?: React.Ref<HTMLDivElement>\n className?: string\n testIds?: Partial<ViewerFrameTestIds>\n}\n\n/** The document viewer shell: sticky header, optional compare row, scrolling content. */\nexport const ViewerFrame = ({\n header,\n compareRow,\n contentId,\n children,\n footer,\n frameRef,\n className,\n testIds,\n}: ViewerFrameProps) => (\n <div\n ref={frameRef}\n className={cn('flex h-full w-full flex-col', className)}\n data-slot=\"viewer-frame\"\n data-testid={testIdOr(testIds?.root, { testId: 'document-viewer' })}\n >\n <div className=\"sticky top-0 z-10 bg-background\">\n {header}\n {compareRow && (\n <div\n className=\"flex flex-wrap items-center gap-1.5 border-t border-border px-3 py-1.5\"\n data-testid={testIdOr(testIds?.compareRow, { testId: 'compare-indicator-row' })}\n >\n {compareRow}\n </div>\n )}\n </div>\n <div\n className=\"flex-1 overflow-hidden\"\n data-testid={testIdOr(testIds?.content, { testId: `document-viewer-content-${contentId}` })}\n >\n {children}\n </div>\n {footer}\n </div>\n)\n\n/** Centered muted status line for loading / error states inside the viewer. */\nexport function ViewerMessage({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <div className=\"flex h-full items-center justify-center\" data-testid={testId}>\n <div className=\"text-sm text-muted-foreground\">{children}</div>\n </div>\n )\n}\n\n// ── Title ───────────────────────────────────────────────────────────────────────────────────\n\nexport interface ViewerTitleProps {\n title: string\n /** e.g. \"v3\". */\n versionLabel?: string | null\n /** Let the pill shrink (live artifacts share the row with more controls). */\n shrink?: boolean\n}\n\n/** Read-only document name (plain text, no fill) with the version label. */\nexport function ViewerTitle({ title, versionLabel, shrink }: ViewerTitleProps) {\n return (\n <span\n className={cn(\n 'inline-flex min-w-0 items-center gap-1.5 px-1 py-1 text-sm font-medium',\n shrink ? 'shrink' : 'shrink-0'\n )}\n title={title}\n >\n <span className=\"truncate\">{title}</span>\n {versionLabel && (\n <span className=\"shrink-0 text-xs font-normal text-muted-foreground\">{versionLabel}</span>\n )}\n </span>\n )\n}\n\n// ── Actions ─────────────────────────────────────────────────────────────────────────────────\n\nexport interface ViewerImageActionsProps {\n compact: boolean\n /** Start a generation from the image. Omitted: not offered. */\n onUseAsReference?: () => void\n onCrop: () => void\n labels?: Partial<ViewerLabels>\n testIds?: Partial<{ useAsReference: string; crop: string }>\n}\n\n/** Image-only actions: feed it into a new generation, or crop it into a new version. */\nexport function ViewerImageActions({\n compact,\n onUseAsReference,\n onCrop,\n labels,\n testIds,\n}: ViewerImageActionsProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n const size = compact ? 'icon' : 'sm'\n return (\n <>\n {onUseAsReference && (\n <Button\n onClick={onUseAsReference}\n variant=\"outline\"\n size={size}\n title={l.useAsReferenceTitle}\n aria-label={l.useAsReference}\n data-testid={testIdOr(testIds?.useAsReference, {\n testId: 'image-use-as-reference-button',\n })}\n className=\"pointer-coarse:min-h-11\"\n >\n <ImagePlus className=\"size-4\" />\n {!compact && <span className=\"ml-1\">{l.useAsReference}</span>}\n </Button>\n )}\n <Button\n onClick={onCrop}\n variant=\"outline\"\n size={size}\n title={l.cropTitle}\n aria-label={l.crop}\n data-testid={testIdOr(testIds?.crop, { testId: 'image-crop-button' })}\n className=\"pointer-coarse:min-h-11\"\n >\n <Crop className=\"size-4\" />\n {!compact && <span className=\"ml-1\">{l.crop}</span>}\n </Button>\n </>\n )\n}\n\n// ── PDF page navigation ─────────────────────────────────────────────────────────────────────\n\nexport interface PdfPageNavProps {\n canPrev: boolean\n canNext: boolean\n onPrev: () => void\n onNext: () => void\n /** The \"3 / 12\" counter between the arrows (the host owns its editing behaviour). */\n counter: ReactNode\n labels?: Partial<ViewerLabels>\n testIds?: Partial<{ overlay: string; prev: string; next: string }>\n}\n\n/** Floating prev / counter / next control over a rendered PDF. */\nexport function PdfPageNav({\n canPrev,\n canNext,\n onPrev,\n onNext,\n counter,\n labels,\n testIds,\n}: PdfPageNavProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n return (\n <div\n className=\"absolute bottom-4 left-1/2 z-10 flex -translate-x-1/2 items-center gap-1 rounded-lg border border-border bg-background/95 px-2 py-1.5 shadow-lg backdrop-blur\"\n data-testid={testIdOr(testIds?.overlay, { testId: 'pdf-page-nav-overlay' })}\n >\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 pointer-coarse:size-11\"\n onClick={onPrev}\n disabled={!canPrev}\n aria-label={l.previousPage}\n data-testid={testIdOr(testIds?.prev, { testId: 'pdf-page-nav-prev' })}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n {counter}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 pointer-coarse:size-11\"\n onClick={onNext}\n disabled={!canNext}\n aria-label={l.nextPage}\n data-testid={testIdOr(testIds?.next, { testId: 'pdf-page-nav-next' })}\n >\n <ChevronRight className=\"size-4\" />\n </Button>\n </div>\n )\n}\n\n// ── Zoom ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface ViewerZoomControlProps {\n /** Multiplier of the fit-width size (1 = fit width). */\n zoom: number\n /** Steps to the next zoom level (and back to fit width after the last). */\n onCycle: () => void\n labels?: Partial<ViewerLabels>\n testIds?: Partial<{ button: string; level: string }>\n}\n\n/**\n * The viewer's zoom button, on every pointer: a docked panel on a desktop screen still leaves the\n * text too small to read, so mouse users need a way to enlarge it too. It stays quiet at fit width\n * and shows the level once zoomed; pinch and double-tap work alongside it.\n */\nexport function ViewerZoomControl({ zoom, onCycle, labels, testIds }: ViewerZoomControlProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n const level = `${Math.round(zoom * 100)}%`\n const isZoomed = Math.abs(zoom - 1) > 0.02\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onCycle}\n title={`Zoom ${level}`}\n aria-label={l.zoom(level)}\n data-testid={testIdOr(testIds?.button, { testId: 'viewer-zoom-button' })}\n className=\"absolute right-3 bottom-4 z-10 h-9 min-w-9 items-center justify-center gap-1 rounded-full border border-border bg-background/95 px-2 shadow-md backdrop-blur pointer-coarse:h-11 pointer-coarse:min-w-11 pointer-coarse:px-2.5\"\n >\n <ZoomIn className=\"size-4\" />\n {isZoomed && (\n <span\n className=\"text-xs font-medium tabular-nums\"\n data-testid={testIdOr(testIds?.level, { testId: 'viewer-zoom-level' })}\n >\n {level}\n </span>\n )}\n </Button>\n )\n}\n","import type { ReactElement, ReactNode } from 'react'\n\nexport interface ViewerControlBarProps {\n /** The viewer body. It scrolls in the space above the bar, never underneath it. */\n children: ReactNode\n /** Page and zoom controls. Without them no bar is drawn and the body fills the pane. */\n controls?: ReactNode\n}\n\n/**\n * Lays the viewer's page and zoom controls in a bar of their own below the body. The body stops\n * above the bar, so the controls never sit over the text being read, even while the reader pauses.\n */\nexport function ViewerControlBar({ children, controls }: ViewerControlBarProps): ReactElement {\n // The body keeps the same place in the tree whether or not a bar is drawn, so it isn't\n // remounted (and loses its scroll position) when the page count arrives.\n return (\n // It fills what its pane leaves below any bars above it (a ViewerPane is a column), never\n // the pane's whole height: that would push the body past the pane by the bars' height.\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"relative min-h-0 flex-1\">{children}</div>\n {controls && (\n <div\n data-testid=\"viewer-control-bar\"\n className=\"relative h-22 shrink-0 border-t border-border bg-background\"\n >\n {controls}\n </div>\n )}\n </div>\n )\n}\n","import { memo } from 'react'\nimport type { ReactNode, Ref } from 'react'\nimport { Share2, StickyNote, Tags } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the parsed viewer parts. Pass a partial `labels` to translate or reword. */\nexport interface HtmlViewerLabels {\n viewerRegion: string\n pageOfTotal: (page: number, total: number) => string\n documentContent: string\n page: (n: number) => string\n noContent: string\n noContentDescription: string\n citedSuffix: string\n previousCited: string\n nextCited: string\n previousLabelPassage: string\n nextLabelPassage: string\n sharedWithMembers: string\n privateToYou: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_HTML_VIEWER_LABELS: HtmlViewerLabels = {\n viewerRegion: 'Parsed document viewer',\n pageOfTotal: (page, total) => `Page ${page} of ${total}`,\n documentContent: 'Document content',\n page: (n) => `Page ${n}`,\n noContent: 'No Content Available',\n noContentDescription: 'This document has not been parsed yet or contains no content',\n citedSuffix: 'cited',\n previousCited: 'Previous cited passage',\n nextCited: 'Next cited passage',\n previousLabelPassage: 'Previous passage with this label',\n nextLabelPassage: 'Next passage with this label',\n sharedWithMembers: 'Shared with workspace members',\n privateToYou: 'Private to you',\n shared: 'Shared',\n private: 'Private',\n}\n\n// ── Surface + pages ─────────────────────────────────────────────────────────────────────────\n\nexport interface HtmlViewerRootProps {\n children: ReactNode\n className?: string\n}\n\n/** Positioning context for the parsed viewer: overlays (tag bar, cited stepper) sit on it. */\nexport function HtmlViewerRoot({ children, className }: HtmlViewerRootProps) {\n return (\n <div className={cn('relative h-full w-full', className)} data-slot=\"html-viewer\">\n {children}\n </div>\n )\n}\n\nexport interface HtmlViewerSurfaceProps {\n children: ReactNode\n surfaceRef?: Ref<HTMLDivElement>\n /** Hidden (kept mounted) while the translation comparison table is showing. */\n hidden?: boolean\n onMouseUp?: () => void\n className?: string\n labels?: Partial<HtmlViewerLabels>\n /** Overrides the root test id (default `parsed-viewer`). */\n testId?: string\n}\n\n/** The scrolling canvas the page sheets stack on. */\nexport function HtmlViewerSurface({\n children,\n surfaceRef,\n hidden,\n onMouseUp,\n className,\n labels,\n testId,\n}: HtmlViewerSurfaceProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div\n ref={surfaceRef}\n className={cn(\n 'flex h-full w-full flex-col items-center overflow-y-auto bg-muted p-4 pb-20',\n hidden && 'hidden',\n className\n )}\n role=\"region\"\n aria-label={l.viewerRegion}\n data-slot=\"html-viewer-surface\"\n // Two-finger gestures belong to the host's text zoom, not to the browser's bitmap zoom.\n style={{ touchAction: 'pan-x pan-y' }}\n data-testid={testIdOr(testId, { testId: 'parsed-viewer' })}\n onMouseUp={onMouseUp}\n >\n {children}\n </div>\n )\n}\n\nexport interface HtmlPageProps {\n /** 1-based page number, null for unpaginated content. */\n pageNumber: number | null\n totalPages: number\n /** False renders a sized placeholder (lazy pages). */\n isRendered: boolean\n /** Placeholder height in px when not rendered. */\n placeholderHeight: number\n /** Text size multiplier: the font size changes and the text reflows inside the page width. */\n zoom?: number\n children?: ReactNode\n labels?: Partial<HtmlViewerLabels>\n}\n\n/** One page sheet: numbered header, content, or a lightweight placeholder while off-screen. */\nexport function HtmlPage({\n pageNumber,\n totalPages,\n isRendered,\n placeholderHeight,\n zoom = 1,\n children,\n labels,\n}: HtmlPageProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div\n id={pageNumber ? `page-${pageNumber}` : undefined}\n data-page-number={pageNumber ?? undefined}\n data-slot=\"html-page\"\n className={cn(\n // shrink-0: a page is a flex item of the scrolling surface and must never be squeezed.\n 'mb-6 w-full max-w-4xl shrink-0',\n isRendered && 'rounded-lg border border-border bg-background p-8'\n )}\n role=\"article\"\n aria-label={pageNumber ? l.pageOfTotal(pageNumber, totalPages) : l.documentContent}\n >\n {isRendered ? (\n <>\n {pageNumber ? (\n <div className=\"mb-4 flex items-center justify-center border-b border-border pb-4\">\n <div className=\"text-sm font-medium text-muted-foreground\">{l.page(pageNumber)}</div>\n </div>\n ) : null}\n <div\n className=\"prose prose-sm max-w-none prose-p:my-0 prose-headings:my-0 [&_img]:max-w-full [&_pre]:overflow-x-auto [&_table]:block [&_table]:max-w-full [&_table]:overflow-x-auto\"\n // The page text inherits this size (1rem at 100%), so this one value scales it and reflows.\n style={zoom === 1 ? undefined : { fontSize: `${zoom}rem` }}\n >\n {children}\n </div>\n </>\n ) : (\n <div\n className=\"flex items-center justify-center rounded-md border border-border bg-muted\"\n style={{ height: placeholderHeight }}\n >\n {pageNumber ? (\n <div className=\"text-sm text-muted-foreground\">{l.page(pageNumber)}</div>\n ) : null}\n </div>\n )}\n </div>\n )\n}\n\n/** Shown when a parsed document has no chunks. */\nexport function HtmlViewerEmpty({ labels }: { labels?: Partial<HtmlViewerLabels> }) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div className=\"flex h-full items-center justify-center text-muted-foreground\">\n <div className=\"text-center\">\n <p className=\"mb-2 text-base font-medium\">{l.noContent}</p>\n <p className=\"text-sm\">{l.noContentDescription}</p>\n </div>\n </div>\n )\n}\n\n// ── Passage ─────────────────────────────────────────────────────────────────────────────────\n\nexport type PassageHighlight = 'light' | 'strong'\n\nexport interface HtmlPassageProps {\n /** Passage (chunk) id: the element id, deep-link and scroll target. */\n chunkId?: string\n /** Yellow wash: `strong` = selected/being read, `light` = listed or search hit. */\n highlight?: PassageHighlight\n /** Marks a search hit for e2e (`highlighted-chunk`). */\n isHit?: boolean\n /** Overrides the hit test id (default `highlighted-chunk`). */\n hitTestId?: string\n /** Part of a contiguous selected run; the run is drawn as one block. */\n isSelected?: boolean\n runIsStart?: boolean\n runIsEnd?: boolean\n /** Citation mode: the passage toggles on click. */\n isClickable?: boolean\n /** Click on the passage; `extend` is true when shift was held (range select). */\n onSelect?: (extend: boolean) => void\n /** The passage carries labels; `tagMark` draws them. */\n isTagged?: boolean\n /** Colour of the label currently being walked, when it marks this passage. */\n activeTagColor?: string\n /** Citation run marker, shown once at the first member of a run. */\n runMarker?: ReactNode\n /** Label stripes in the margin (a `LabelMark`): always visible, one menu. */\n tagMark?: ReactNode\n /**\n * The passage's reference mark (a `PassageMark`): quiet text in the margin whose menu carries\n * every passage action. Faint on hover/focus, always faintly visible on touch.\n */\n mark?: ReactNode\n /** The passage text. */\n children: ReactNode\n}\n\n/** One parsed passage: highlight states, label stripes, run marker, reference label, actions. */\nexport const HtmlPassage = memo(function HtmlPassage({\n chunkId,\n highlight,\n isHit,\n hitTestId,\n isSelected,\n runIsStart,\n runIsEnd,\n isClickable,\n onSelect,\n isTagged,\n activeTagColor,\n runMarker,\n tagMark,\n mark,\n children,\n}: HtmlPassageProps) {\n const hasId = !!chunkId\n // A selected run is one block: round only its first top and last bottom.\n const rounding = !isSelected\n ? 'rounded'\n : [runIsStart ? 'rounded-t' : 'rounded-t-none', runIsEnd ? 'rounded-b' : 'rounded-b-none'].join(\n ' '\n )\n return (\n <div\n id={chunkId}\n data-slot=\"html-passage\"\n data-chunk-id={chunkId}\n data-run-start={(isSelected && runIsStart) || undefined}\n data-tagged={isTagged || undefined}\n data-tag-active={activeTagColor ? true : undefined}\n data-testid={isHit ? testIdOr(hitTestId, { testId: 'highlighted-chunk' }) : null}\n onClick={\n hasId && onSelect\n ? (e) => {\n // A mark or its menu is its own target; it must not also select the passage.\n if ((e.target as HTMLElement).closest('[data-slot=\"mark\"], [data-slot=\"mark-menu\"]'))\n return\n onSelect(e.shiftKey)\n }\n : undefined\n }\n className={cn(\n 'group relative block px-1 py-0.5',\n rounding,\n highlight === 'strong'\n ? 'bg-ai-soft text-foreground ring-1 ring-ai-accent/40'\n : highlight === 'light'\n ? 'bg-ai-soft/60 text-foreground hover:bg-ai-soft'\n : hasId && 'hover:bg-muted/50',\n hasId && isClickable && 'cursor-pointer select-none',\n // On touch every passage with an id is at least 44px tall, so the marks of consecutive\n // one-line passages keep their 44px tap areas apart. Tied to the id, which never changes,\n // not to the mark, which comes and goes while a citation run is selected: the document\n // must not jump under the finger.\n hasId && 'pointer-coarse:min-h-11'\n )}\n // The active label washes its passages in its own (dynamic) colour, kept faint.\n style={\n activeTagColor && !highlight\n ? {\n backgroundColor: `${activeTagColor}22`,\n boxShadow: `inset 3px 0 0 0 ${activeTagColor}`,\n }\n : undefined\n }\n >\n {children}\n\n {tagMark && <span className=\"absolute -left-3 top-1.5 z-10\">{tagMark}</span>}\n\n {runMarker ? (\n <span className=\"absolute -top-2.5 left-1 z-10\" data-run-marker>\n {runMarker}\n </span>\n ) : null}\n\n {mark && (\n <span className=\"absolute -top-2.5 right-0 z-10 opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-within:opacity-100 pointer-coarse:opacity-70 [&:has([aria-expanded=true])]:opacity-100\">\n {mark}\n </span>\n )}\n </div>\n )\n})\n\n// ── Steppers ────────────────────────────────────────────────────────────────────────────────\n\ninterface PassageStepperProps {\n /** 1-based position. */\n position: number\n total: number\n onStep: (delta: number) => void\n /** Test id of the stepper (none by default). */\n testId?: string\n className?: string\n prevLabel: string\n nextLabel: string\n /** Text after the count, e.g. \"cited\". */\n suffix?: string\n}\n\nconst stepButton =\n 'px-1 text-muted-foreground hover:text-foreground pointer-coarse:min-h-11 pointer-coarse:min-w-11'\n\n/** Compact \"3/9 cited\" prev/next stepper overlaid on the document. */\nfunction PassageStepper({\n position,\n total,\n onStep,\n testId,\n className,\n prevLabel,\n nextLabel,\n suffix,\n}: PassageStepperProps) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-md border border-border bg-background/95 px-1.5 py-0.5',\n className\n )}\n data-slot=\"passage-stepper\"\n data-testid={testId}\n >\n <button\n type=\"button\"\n onClick={() => onStep(-1)}\n aria-label={prevLabel}\n className={stepButton}\n >\n ‹\n </button>\n <span className=\"text-xs tabular-nums text-muted-foreground\">\n {Math.min(position, total)}/{total}\n {suffix ? ` ${suffix}` : ''}\n </span>\n <button type=\"button\" onClick={() => onStep(1)} aria-label={nextLabel} className={stepButton}>\n ›\n </button>\n </span>\n )\n}\n\n/** Overlay placement for the cited-passages stepper (top centre of the viewer). */\nexport function CitedRunNav({\n labels,\n testId,\n ...props\n}: Omit<PassageStepperProps, 'prevLabel' | 'nextLabel' | 'testId' | 'suffix'> & {\n labels?: Partial<HtmlViewerLabels>\n /** Overrides the stepper test id (default `note-run-nav`). */\n testId?: string\n}) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div className=\"absolute left-1/2 top-2 z-20 -translate-x-1/2\" data-slot=\"cited-run-nav\">\n <PassageStepper\n {...props}\n suffix={l.citedSuffix}\n prevLabel={l.previousCited}\n nextLabel={l.nextCited}\n testId={testIdOr(testId, { testId: 'note-run-nav' })}\n />\n </div>\n )\n}\n\n// ── Label bar ───────────────────────────────────────────────────────────────────────────────\n\nexport interface DocTagChipView {\n id: string\n name: string\n /** Fill colour (dynamic, per label). */\n color: string\n /** Passages the label marks; 0 = applies to the whole document. */\n passageCount: number\n hasNote: boolean\n title: string\n}\n\nexport interface DocTagBarProps {\n chips: DocTagChipView[]\n /** Document visibility mark on the far right; null/undefined omits it. */\n visibility?: 'shared' | 'private' | null\n /** Passage stepping over the active label's passages (parsed view only). */\n step?: { position: number; total: number; onStep: (delta: number) => void }\n /** The label currently washing its passages (parsed view only). */\n activeId?: string | null\n /** When given, chips are toggles: pick a label to mark its passages, pick it again to clear. */\n onSelect?: (id: string | null) => void\n labels?: Partial<HtmlViewerLabels>\n testIds?: Partial<DocTagBarTestIds>\n}\n\nexport interface DocTagBarTestIds {\n root: string\n nav: string\n visibility: string\n /** Replaces the whole `doc-tag-chip-<id>` id. */\n chip: (id: string) => string\n}\n\n/**\n * The document's labels along the top of a viewer: chips (toggles when `onSelect` is given, else\n * read-only marks), optional passage stepper for the active label, and the shared/private mark.\n * Draws nothing when it has nothing to say.\n */\nexport function DocTagBar({\n chips,\n visibility,\n step,\n activeId = null,\n onSelect,\n labels,\n testIds,\n}: DocTagBarProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n if (chips.length === 0 && !visibility) return null\n return (\n <div\n className=\"absolute left-2 right-2 top-2 z-20 flex flex-wrap items-center gap-1\"\n data-slot=\"doc-tag-bar\"\n data-testid={testIdOr(testIds?.root, { testId: 'doc-tag-bar' })}\n >\n {chips.map((c) => {\n const isActive = c.id === activeId\n const content = (\n <>\n <Tags className=\"size-3 shrink-0\" />\n {c.name}\n {c.passageCount > 0 && (\n <span className=\"tabular-nums opacity-90\">{c.passageCount}</span>\n )}\n {c.hasNote && <StickyNote className=\"size-3 opacity-90\" />}\n </>\n )\n const chipClass =\n 'inline-flex items-center gap-1.5 rounded-full border border-transparent px-2 py-0.5 text-xs text-white'\n return onSelect ? (\n <button\n key={c.id}\n type=\"button\"\n // Picking the active chip again clears it: the way back to the plain document.\n onClick={() => onSelect(isActive ? null : c.id)}\n aria-pressed={isActive}\n title={c.title}\n data-testid={testIdOr(testIds?.chip?.(c.id), { testId: `doc-tag-chip-${c.id}` })}\n data-active={isActive || undefined}\n className={cn(chipClass, 'cursor-pointer', !isActive && 'opacity-70 hover:opacity-100')}\n style={{ backgroundColor: c.color }}\n >\n {content}\n </button>\n ) : (\n <span\n key={c.id}\n title={c.title}\n data-testid={testIdOr(testIds?.chip?.(c.id), { testId: `doc-tag-chip-${c.id}` })}\n className={chipClass}\n style={{ backgroundColor: c.color }}\n >\n {content}\n </span>\n )\n })}\n\n {step && step.total > 0 && (\n <PassageStepper\n className=\"ml-1\"\n position={step.position}\n total={step.total}\n onStep={step.onStep}\n testId={testIdOr(testIds?.nav, { testId: 'doc-tag-nav' })}\n prevLabel={l.previousLabelPassage}\n nextLabel={l.nextLabelPassage}\n />\n )}\n\n {visibility && (\n <span\n title={visibility === 'shared' ? l.sharedWithMembers : l.privateToYou}\n data-testid={testIdOr(testIds?.visibility, { testId: 'doc-visibility-chip' })}\n className={cn(\n 'ml-auto inline-flex shrink-0 items-center gap-1.5 rounded-full px-2 py-0.5 text-xs',\n visibility === 'shared'\n ? 'bg-accent text-accent-foreground'\n : 'bg-muted text-muted-foreground'\n )}\n >\n <Share2 className=\"size-3 shrink-0\" />\n {visibility === 'shared' ? l.shared : l.private}\n </span>\n )}\n </div>\n )\n}\n","/**\n * A document's labels as the viewer's label bar shows them: one entry per doctag with the passages\n * it marks in THIS document, and the bar itself (`DocumentLabelBar`). Chips mark which labels the\n * document carries and, in the text view (`onSelect`), toggle the active label; the stepper walks\n * the active label's passages (the PDF mounts the bar read-only, without either).\n */\n\nimport { useMemo } from 'react'\nimport type { components } from '@arbidocs/client'\nimport { getEntityColor } from '@arbidocs/react/ui'\nimport { DocTagBar, type DocTagChipView } from './HtmlViewerParts'\n\ntype Tag = Pick<components['schemas']['TagResponse'], 'external_id' | 'name'>\ntype ScopedTag = Pick<\n components['schemas']['TagResponse'],\n 'kind' | 'doctag_count' | 'facttag_count'\n>\n\n/**\n * A label of the documents' vocabulary: a plain label (not an issue, entity or saved search) used\n * on documents, or not used anywhere yet (a label used only on facts belongs to the facts').\n */\nexport function isDocumentLabel(tag: ScopedTag): boolean {\n if (tag.kind !== 'label') return false\n const onDocs = (tag.doctag_count ?? 0) > 0\n const onFacts = (tag.facttag_count ?? 0) > 0\n return onDocs || !onFacts\n}\ntype DocTag = Pick<components['schemas']['DocTagResponse'], 'tag_ext_id' | 'note' | 'citations'>\n\nexport interface DocTagSummary {\n tagExtId: string\n name: string\n /** Passages in THIS document carrying the label. */\n chunkIds: string[]\n hasNote: boolean\n}\n\n/** One entry per doctag on the document, in workspace-tag order. */\nexport function summariseDocTags(\n doctags: readonly DocTag[],\n workspaceTags: readonly Tag[]\n): DocTagSummary[] {\n const byTag = new Map(doctags.map((dt) => [dt.tag_ext_id, dt]))\n return workspaceTags\n .filter((t) => byTag.has(t.external_id))\n .map((t) => {\n const dt = byTag.get(t.external_id)!\n return {\n tagExtId: t.external_id,\n name: t.name,\n chunkIds: (dt.citations ?? []).flatMap((d) => (d.chunks ?? []).map((c) => c.chunk_id)),\n hasNote: !!dt.note,\n }\n })\n}\n\nexport interface DocumentLabelBarProps {\n summaries: DocTagSummary[]\n activeTagExtId?: string | null\n /** Position within the active label's passages, 0-based. */\n cursor?: number\n /** When given, chips toggle the active label (text view only). */\n onSelect?: (tagExtId: string | null) => void\n onStep?: (delta: number) => void\n}\n\nexport function DocumentLabelBar({\n summaries,\n activeTagExtId = null,\n cursor = 0,\n onSelect,\n onStep,\n}: DocumentLabelBarProps) {\n const chips = useMemo<DocTagChipView[]>(\n () =>\n summaries.map((s) => {\n const marked = s.chunkIds.length\n return {\n id: s.tagExtId,\n name: s.name,\n color: getEntityColor(s.tagExtId, 'medium'),\n passageCount: marked,\n hasNote: s.hasNote,\n title: marked\n ? `${s.name} — ${marked} passage${marked === 1 ? '' : 's'}${s.hasNote ? ', annotated' : ''}`\n : `${s.name} — applies to the document, no passages marked`,\n }\n }),\n [summaries]\n )\n const active = summaries.find((s) => s.tagExtId === activeTagExtId)\n return (\n <DocTagBar\n chips={chips}\n activeId={activeTagExtId}\n onSelect={onSelect}\n step={\n onStep && active && active.chunkIds.length > 0\n ? { position: cursor + 1, total: active.chunkIds.length, onStep }\n : undefined\n }\n />\n )\n}\n","import type { ReactNode } from 'react'\nimport { FolderOpen } from 'lucide-react'\nimport {\n Badge,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { ModalHeader } from '../settings/ModalScaffold'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the dialog. Pass a partial `labels` to translate or reword. */\nexport interface MoveToFolderLabels {\n title: string\n cancel: string\n move: string\n moving: string\n}\n\nexport const DEFAULT_MOVE_TO_FOLDER_LABELS: MoveToFolderLabels = {\n title: 'Move to Folder',\n cancel: 'Cancel',\n move: 'Move',\n moving: 'Moving...',\n}\n\nexport interface MoveToFolderTestIds {\n modal: string\n cancel: string\n confirm: string\n}\n\nexport interface MoveToFolderDialogProps {\n open: boolean\n onClose: () => void\n /** What is being moved, shown as a badge: a folder name or \"3 selected\". */\n subject: string\n /** Screen-reader description. */\n description: string\n /** The folder picker (the host owns the folder tree and search). */\n children: ReactNode\n canConfirm: boolean\n isSubmitting?: boolean\n onConfirm: () => void\n labels?: Partial<MoveToFolderLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<MoveToFolderTestIds>\n}\n\n/** \"Move to folder\" dialog shell: header with subject badge, picker slot, Cancel + Move. */\nexport function MoveToFolderDialog({\n open,\n onClose,\n subject,\n description,\n children,\n canConfirm,\n isSubmitting,\n onConfirm,\n labels,\n testIds,\n}: MoveToFolderDialogProps) {\n const l = { ...DEFAULT_MOVE_TO_FOLDER_LABELS, ...labels }\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-2xl\"\n data-testid={testIdOr(testIds?.modal, { testId: 'move-to-folder-modal' })}\n >\n <ModalHeader className=\"p-0 pb-3\">\n <DialogTitle className=\"flex items-center gap-2\">\n <FolderOpen className=\"size-5 text-yellow-text\" />\n <span>{l.title}</span>\n <Badge className=\"bg-accent px-3 py-1 text-accent-foreground hover:bg-accent\">\n <span className=\"font-semibold\">{subject}</span>\n </Badge>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n </ModalHeader>\n\n <div className=\"overflow-hidden rounded-lg bg-muted\">{children}</div>\n\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-4\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.cancel, { testId: 'move-folder-cancel-button' })}\n >\n {l.cancel}\n </Button>\n <Button\n onClick={onConfirm}\n disabled={!canConfirm || isSubmitting}\n data-testid={testIdOr(testIds?.confirm, { testId: 'move-folder-confirm-button' })}\n >\n {isSubmitting ? l.moving : l.move}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","import type { ComponentProps } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FilesPageProps extends ComponentProps<'div'> {\n /** Inside a modal the page keeps its own height instead of filling the page scroll zone. */\n isModal?: boolean\n /** Overrides the root test id (default `documents-page`). */\n testId?: string\n}\n\n/**\n * Files page column. `h-full` fills the bounded page scroll zone (not 100vh), so when a tip bar\n * shrinks the shell this column shrinks with it and the sticky selection bar stays pinned to the\n * visible bottom.\n */\nexport function FilesPage({ isModal, testId, className, ...props }: FilesPageProps) {\n return (\n <div\n data-slot=\"files-page\"\n className={cn('flex flex-col', isModal ? 'overflow-hidden' : 'h-full min-h-0', className)}\n {...props}\n data-testid={testIdOr(testId, { testId: 'documents-page' })}\n />\n )\n}\n\n/**\n * Sticky region on top: the title row (title, view switch, Add) and the calm filter row. 16px\n * gutters are owned by the shared TabHeader and the content toolbar.\n */\nexport function FilesPageHeader({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-page-header\"\n className={cn('sticky top-0 z-10 flex flex-col bg-background', className)}\n {...props}\n />\n )\n}\n\n/** The scrolling content area (grid, gallery, review, smart search). */\nexport function FilesPageMain({ className, ...props }: ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"files-page-main\"\n className={cn('min-h-0 flex-1 overflow-hidden bg-background px-4 sm:px-6', className)}\n {...props}\n />\n )\n}\n","import type { ComponentType, ReactNode } from 'react'\nimport { GridView, type GridViewProps } from './GridView'\nimport {\n documentGridLayoutProps,\n type DocumentGridLayout,\n type DocumentGridPresets,\n} from './documentGridLayout'\n\n/**\n * Row vocabulary of the documents table. The row open in the viewer (its name cell carries\n * `data-viewing`) is the one strong state: full accent tint plus a 2px primary bar. Checkbox-selected\n * rows use the lighter grid theme tint, so the two never read as the same thing. Empty values\n * (`cell-empty`, an em dash) are muted.\n */\nconst DOCUMENT_GRID_CLASS =\n 'w-full [&_.cell-empty]:text-muted-foreground [&_.ag-row:has([data-viewing])]:!bg-accent [&_.ag-row:has([data-viewing])]:shadow-[inset_2px_0_0_hsl(var(--primary))]'\n\nexport interface DocumentGridProps<T> extends Omit<\n GridViewProps<T>,\n 'gridId' | 'initialVisibleColumns' | 'rowHeight' | 'height' | 'persistState'\n> {\n /** Table, phone list or modal: each keeps its own saved state, default columns and sizing. */\n layout: DocumentGridLayout\n /** Saved-state ids, default columns and row heights per layout (ids and `colId`s stay with the host). */\n presets: DocumentGridPresets\n /**\n * The grid implementation to render. Defaults to the core `GridView`; a host passes its own\n * wrapper to add persistence of column state (the core has no store).\n */\n GridComponent?: ComponentType<GridViewProps<T>>\n /**\n * Shown instead of the grid when the workspace has no documents at all (first-run upload\n * prompt). The host decides when via `showEmptyWorkspace`.\n */\n emptyWorkspace?: ReactNode\n showEmptyWorkspace?: boolean\n}\n\n/**\n * The documents table: a GridView preset with the saved-state id, default columns and sizing\n * for the current layout, remounted when the layout flips between table and phone list so state\n * from one never leaks into the other. The host passes rows, column defs (explicit `colId`s) and\n * handlers.\n */\nexport function DocumentGrid<T>({\n layout,\n presets,\n GridComponent = GridView,\n emptyWorkspace,\n showEmptyWorkspace,\n testId = 'documents-grid',\n className = DOCUMENT_GRID_CLASS,\n ...grid\n}: DocumentGridProps<T>) {\n if (showEmptyWorkspace && emptyWorkspace) return <>{emptyWorkspace}</>\n const { remountKey, ...layoutProps } = documentGridLayoutProps(layout, presets)\n return (\n <GridComponent\n key={remountKey}\n {...grid}\n {...layoutProps}\n persistState\n testId={testId}\n className={className}\n />\n )\n}\n","import { useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { ArrowLeftRight, Download, Eye, EyeOff, X } from 'lucide-react'\nimport {\n Button,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { DEFAULT_VIEWER_LABELS, type ViewerLabels } from './ViewerChrome'\n\n// ── Tabs ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface ViewerTab {\n id: string\n icon: ReactNode\n /** Tooltip and accessible name. */\n tooltip: string\n /** Visible text next to the icon, for tabs whose icon alone is not self-explanatory. */\n label?: string\n /** Overrides the tab test id (default `<id>-tab`). */\n testId?: string\n}\n\nexport interface ViewerTabBarProps {\n tabs: ViewerTab[]\n activeId: string\n onChange: (id: string) => void\n className?: string\n}\n\n/** Underline tab strip for the viewer's formats (PDF, DOCX, Source, Versions, HTML...). */\nexport function ViewerTabBar({ tabs, activeId, onChange, className }: ViewerTabBarProps) {\n return (\n <TooltipProvider>\n <div className={cn('flex shrink-0 items-center', className)} role=\"group\">\n {tabs.map((tab) => {\n const isActive = tab.id === activeId\n return (\n <Tooltip key={tab.id}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => onChange(tab.id)}\n aria-label={tab.tooltip}\n aria-pressed={isActive}\n data-testid={testIdOr(tab.testId, { testId: `${tab.id}-tab` })}\n className={cn(\n 'shrink-0 border-b-2 px-3 py-2 font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n tab.label && 'inline-flex items-center gap-1.5 text-sm',\n isActive\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:border-border hover:text-foreground'\n )}\n >\n {tab.icon}\n {tab.label && <span>{tab.label}</span>}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{tab.tooltip}</TooltipContent>\n </Tooltip>\n )\n })}\n </div>\n </TooltipProvider>\n )\n}\n\n// ── Page counter ────────────────────────────────────────────────────────────────────────────\n\nexport interface ViewerPageCounterProps {\n page: number\n total: number\n /** Called with a valid 1..total page typed into the counter. */\n onGoTo: (page: number) => void\n labels?: Partial<ViewerLabels>\n}\n\n/** \"3 / 12\": click the number to type a page; Enter or blur commits, Escape cancels. */\nexport function ViewerPageCounter({ page, total, onGoTo, labels }: ViewerPageCounterProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n const [isEditing, setIsEditing] = useState(false)\n const [input, setInput] = useState('')\n const inputRef = useRef<HTMLInputElement>(null)\n if (total <= 0) return null\n\n const commit = () => {\n const n = parseInt(input, 10)\n if (!isNaN(n) && n >= 1 && n <= total) onGoTo(n)\n setIsEditing(false)\n }\n\n return (\n <div className=\"flex shrink-0 items-center gap-1 rounded-md bg-muted px-2 py-1\">\n {isEditing ? (\n <input\n ref={inputRef}\n autoFocus\n type=\"text\"\n value={input}\n onFocus={(e) => e.currentTarget.select()}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit()\n else if (e.key === 'Escape') setIsEditing(false)\n }}\n onBlur={commit}\n className=\"w-8 rounded border border-border bg-background px-1 py-0.5 text-center text-sm font-medium focus:outline-none\"\n aria-label={l.pageInput}\n />\n ) : (\n <button\n type=\"button\"\n onClick={() => {\n setInput(String(page))\n setIsEditing(true)\n }}\n className=\"min-w-[2rem] cursor-text rounded border border-border bg-background px-1 py-0.5 text-sm font-medium transition-colors hover:bg-muted pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n title={l.pageOfTitle}\n aria-label={l.pageOf(page, total)}\n >\n {page}\n </button>\n )}\n <span className=\"text-sm text-muted-foreground\">/ {total}</span>\n </div>\n )\n}\n\n// ── Fallbacks ───────────────────────────────────────────────────────────────────────────────\n\n/** A format that cannot be previewed in the browser: offer the original instead. */\nexport function ViewerPreviewUnavailable({\n extension,\n onDownload,\n labels,\n}: {\n extension: string\n onDownload: () => void\n labels?: Partial<ViewerLabels>\n}) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-4 p-8 text-center\">\n <div className=\"text-4xl text-muted-foreground\" aria-hidden>\n 📄\n </div>\n <div>\n <p className=\"mb-1 font-medium\">{l.previewUnavailable}</p>\n <p className=\"mb-4 text-sm text-muted-foreground\">{l.cannotPreview(extension)}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onDownload}>\n <Download className=\"mr-2 size-4\" />\n {l.downloadToOpen}\n </Button>\n </div>\n </div>\n )\n}\n\n/** The file failed to load: say so and offer the download instead. */\nexport function ViewerLoadError({\n message,\n onDownload,\n labels,\n testId,\n}: {\n message: string\n onDownload: () => void\n labels?: Partial<ViewerLabels>\n /** Overrides the root test id (default `pdf-load-error`). */\n testId?: string\n}) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n return (\n <div\n className=\"flex h-full flex-col items-center justify-center gap-3 p-8 text-center\"\n data-testid={testIdOr(testId, { testId: 'pdf-load-error' })}\n >\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onDownload}>\n <Download className=\"mr-2 size-4\" />\n {l.download}\n </Button>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { CopyX, Sparkles } from 'lucide-react'\nimport {\n IconToggle,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the upload footer. Pass a partial `labels` to translate or reword. */\nexport interface UploadFooterLabels {\n skipDuplicates: string\n skipDuplicatesActive: string\n skipDuplicatesInactive: string\n autoRename: string\n autoRenameActive: string\n autoRenameInactive: string\n titleInstruction: string\n titleInstructionPlaceholder: string\n}\n\nexport const DEFAULT_UPLOAD_FOOTER_LABELS: UploadFooterLabels = {\n skipDuplicates: 'Skip duplicates',\n skipDuplicatesActive: 'Skip identical files already in the workspace',\n skipDuplicatesInactive: 'Allow uploading identical files',\n autoRename: 'Auto-rename',\n autoRenameActive: 'Generate a descriptive title via AI instead of using the filename',\n autoRenameInactive: 'Keep the original filename',\n titleInstruction: 'Title instruction',\n titleInstructionPlaceholder: 'Optional: how should AI name these documents?',\n}\n\nexport interface UploadFooterTestIds {\n bar: string\n skipDuplicates: string\n autoRename: string\n settingsPanel: string\n instruction: string\n}\n\n// ── Container ───────────────────────────────────────────────────────────────────────────────\n\nexport function UploadContainer({\n children,\n className = 'p-4 sm:p-6',\n testId,\n}: {\n children: ReactNode\n className?: string\n /** Overrides the root test id (default `upload-container`). */\n testId?: string\n}) {\n return (\n <div\n className={className}\n data-slot=\"upload-container\"\n data-testid={testIdOr(testId, { testId: 'upload-container' })}\n >\n {children}\n </div>\n )\n}\n\n// ── Share note ──────────────────────────────────────────────────────────────────────────────\n\nexport interface UploadShareNoteProps {\n /** What the current choice means, e.g. \"Uploaded documents will be shared with this workspace\". */\n description: string\n /** The visibility toggle itself (the host owns it). */\n children: ReactNode\n /** Compact: a tooltip on the toggle. Otherwise a tonal card with the text beneath it. */\n compact?: boolean\n /** Overrides the wrapper test id (default `share-toggle`). */\n testId?: string\n}\n\n/** Wraps the upload visibility toggle with its explanation (tooltip when compact, text otherwise). */\nexport function UploadShareNote({\n description,\n children,\n compact = false,\n testId,\n}: UploadShareNoteProps) {\n const id = testIdOr(testId, { testId: 'share-toggle' })\n if (compact) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <div data-testid={id}>{children}</div>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-xs\">\n <p className=\"text-sm\">{description}</p>\n </TooltipContent>\n </Tooltip>\n )\n }\n return (\n <div className=\"rounded-lg bg-muted p-4\" data-testid={id}>\n <div className=\"flex flex-col gap-3\">\n {children}\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n </div>\n </div>\n )\n}\n\n// ── Footer bar ──────────────────────────────────────────────────────────────────────────────\n\nconst TOGGLE_COLORS = { text: 'text-primary', bg: 'bg-primary' }\n\nexport interface UploadFooterBarProps {\n skipDuplicates: boolean\n onSkipDuplicatesChange: (value: boolean) => void\n autoRename: boolean\n onAutoRenameChange: (value: boolean) => void\n autoRenameInstruction: string\n onAutoRenameInstructionChange: (value: string) => void\n /** The visibility toggle, right-aligned before the submit button. */\n shareToggle?: ReactNode\n /** The Upload submit button (the view's ONE primary action). */\n children: ReactNode\n className?: string\n labels?: Partial<UploadFooterLabels>\n testIds?: Partial<UploadFooterTestIds>\n}\n\n/**\n * The upload action footer: everyday toggles next to the submit button\n * (`[Skip duplicates] [Auto-rename] ... [Visibility] [Upload N]`). When Auto-rename is on, its\n * title instruction drops in just below.\n */\nexport function UploadFooterBar({\n skipDuplicates,\n onSkipDuplicatesChange,\n autoRename,\n onAutoRenameChange,\n autoRenameInstruction,\n onAutoRenameInstructionChange,\n shareToggle,\n children,\n className,\n labels,\n testIds,\n}: UploadFooterBarProps) {\n const l = { ...DEFAULT_UPLOAD_FOOTER_LABELS, ...labels }\n return (\n <>\n <div\n className={cn(\n 'flex shrink-0 flex-wrap items-center gap-x-3 gap-y-2 border-t border-border bg-background px-4 py-3 sm:px-6',\n className\n )}\n data-testid={testIdOr(testIds?.bar, { testId: 'upload-footer-bar' })}\n >\n <IconToggle\n icon={CopyX}\n isActive={skipDuplicates}\n onToggle={onSkipDuplicatesChange}\n colors={TOGGLE_COLORS}\n showLabel={true}\n label={l.skipDuplicates}\n tooltipActive={l.skipDuplicatesActive}\n tooltipInactive={l.skipDuplicatesInactive}\n data-testid={testIdOr(testIds?.skipDuplicates, { testId: 'toggle-skip-duplicates' })}\n />\n <IconToggle\n icon={Sparkles}\n isActive={autoRename}\n onToggle={onAutoRenameChange}\n colors={TOGGLE_COLORS}\n showLabel={true}\n label={l.autoRename}\n tooltipActive={l.autoRenameActive}\n tooltipInactive={l.autoRenameInactive}\n data-testid={testIdOr(testIds?.autoRename, { testId: 'toggle-auto-rename' })}\n />\n <div className=\"hidden flex-1 sm:block\" />\n {shareToggle}\n {/* Phones: the primary action is a full-width button on its own row below the options. */}\n <div className=\"w-full sm:w-auto max-sm:[&>button]:w-full\">{children}</div>\n </div>\n\n {autoRename && (\n <div\n className=\"shrink-0 border-t border-border bg-background px-4 py-3 sm:px-6\"\n data-testid={testIdOr(testIds?.settingsPanel, { testId: 'upload-settings-panel' })}\n >\n <label htmlFor=\"auto-rename-instruction\" className=\"text-sm font-medium\">\n {l.titleInstruction}\n </label>\n <Textarea\n id=\"auto-rename-instruction\"\n value={autoRenameInstruction}\n onChange={(e) => onAutoRenameInstructionChange(e.target.value)}\n placeholder={l.titleInstructionPlaceholder}\n className=\"mt-1 min-h-[60px] text-sm\"\n data-testid={testIdOr(testIds?.instruction, { testId: 'auto-rename-instruction' })}\n />\n </div>\n )}\n </>\n )\n}\n","import { useCallback, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Check, FolderOpen, Minus, Plus, X } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the folder pickers. Pass a partial `labels` to translate or reword. */\nexport interface FolderPickerLabels {\n none: string\n removeFromFolder: string\n searchOrCreate: string\n noFolders: string\n create: (name: string) => string\n}\n\nexport const DEFAULT_FOLDER_PICKER_LABELS: FolderPickerLabels = {\n none: 'None',\n removeFromFolder: 'Remove from folder',\n searchOrCreate: 'Search or create...',\n noFolders: 'No folders yet',\n create: (name) => `Create \\u201c${name}\\u201d`,\n}\n\nexport interface FolderCommandListTestIds {\n create: string\n createOption: string\n remove: string\n /** Replaces the whole `folder-picker-option-<folder>` id. */\n option: (folder: string) => string\n}\n\n// ── Tree row ────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderPickerRowProps {\n label: string\n /** Optional leading glyph (e.g. a connector brand mark for provider roots). */\n icon?: ReactNode\n /** Shown at the right edge; omit for rows with nothing to count (e.g. an empty unread count). */\n count?: number\n depth: number\n isActive: boolean\n muted?: boolean\n /** Test id of the row button (none by default). */\n testId?: string\n /**\n * Draw a checkbox in the leading slot instead of the single-select tick. A list you can pick\n * SEVERAL rows from should look like one: a lone tick reads \"this is the current one\", a box\n * reads \"tick the ones you want\".\n */\n checkbox?: boolean\n /** Checkbox only: some descendants are selected, so show a dash, not a tick. */\n indeterminate?: boolean\n onClick: () => void\n}\n\n/** One folder row: indented by depth, with a count. Whole row is the target (44px on touch). */\nexport function FolderPickerRow({\n label,\n icon,\n count,\n depth,\n isActive,\n muted,\n checkbox,\n indeterminate,\n testId,\n onClick,\n}: FolderPickerRowProps) {\n return (\n <button\n type=\"button\"\n data-testid={testId}\n onClick={onClick}\n // The row IS the checkbox: a real <Checkbox> inside this button would nest one interactive\n // element in another and swallow the click. role + aria-checked carry the same meaning.\n role={checkbox ? 'checkbox' : undefined}\n aria-checked={checkbox ? (indeterminate ? 'mixed' : isActive) : undefined}\n style={{ paddingLeft: `${4 + depth * 14}px` }}\n className={cn(\n // `[&:hover]:`, not `hover:`: the latter compiles behind `@media (hover: hover)`, so on a\n // touchscreen whose PRIMARY pointer reports `hover: none` the row would never highlight\n // even with a real mouse attached. The arbitrary selector has no media gate.\n 'flex w-full items-center gap-1 rounded-sm py-1 pr-2 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&:hover]:bg-accent pointer-coarse:min-h-11',\n isActive && 'bg-primary/10',\n muted && !isActive && 'text-muted-foreground'\n )}\n >\n <span className=\"flex w-4 shrink-0 items-center justify-center\">\n {checkbox ? (\n <span\n className={cn(\n 'flex size-3.5 items-center justify-center rounded-[3px] border transition-colors',\n isActive || indeterminate\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-muted-foreground/40'\n )}\n >\n {indeterminate ? (\n <Minus className=\"size-2.5\" />\n ) : (\n isActive && <Check className=\"size-2.5\" />\n )}\n </span>\n ) : (\n isActive && <Check className=\"size-3.5 text-primary\" />\n )}\n </span>\n {icon}\n {label !== '' && (\n <span className={cn('min-w-0 truncate', isActive && 'font-semibold text-primary')}>\n {label}\n </span>\n )}\n {count !== undefined && (\n <span className=\"ml-auto pl-2 text-sm font-semibold text-muted-foreground\">{count}</span>\n )}\n </button>\n )\n}\n\n// ── Tree ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderTreeNode {\n path: string\n label: string\n depth: number\n count: number\n /** Replaces the label's default look (provider roots show a brand mark). */\n icon?: ReactNode\n}\n\nexport interface FolderTreeProps {\n nodes: FolderTreeNode[]\n unfiledCount: number\n /** string = folder path selected, null = Unfiled selected, undefined = nothing selected. */\n value: string | null | undefined\n onChange: (folder: string | null) => void\n /** Show the Unfiled (\"None\") row even when it is empty. */\n showUnfiledAlways?: boolean\n labels?: Partial<FolderPickerLabels>\n}\n\n/** Folder hierarchy with an Unfiled option at the bottom. No \"All\" row: callers add their own. */\nexport function FolderTree({\n nodes,\n unfiledCount,\n value,\n onChange,\n showUnfiledAlways,\n labels,\n}: FolderTreeProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n return (\n <div className=\"max-h-[240px] overflow-y-auto\">\n {nodes.map((node) => (\n <FolderPickerRow\n key={node.path}\n label={node.label}\n icon={node.icon}\n count={node.count}\n depth={node.depth}\n isActive={value === node.path}\n onClick={() => onChange(node.path)}\n />\n ))}\n {(unfiledCount > 0 || showUnfiledAlways) && (\n <>\n {nodes.length > 0 && <div className=\"my-1 border-t border-border\" />}\n <FolderPickerRow\n label={l.none}\n count={unfiledCount}\n depth={0}\n isActive={value === null}\n muted\n onClick={() => onChange(null)}\n />\n </>\n )}\n </div>\n )\n}\n\n// ── Searchable list ─────────────────────────────────────────────────────────────────────────\n\nfunction FolderBreadcrumb({ folder }: { folder: string }) {\n const parts = folder.split('/')\n return (\n <span className=\"whitespace-nowrap\">\n {parts.map((part, i) => (\n <span key={i} className=\"inline-flex items-center gap-0.5\">\n {i > 0 && <span className=\"mx-0.5 text-sm text-muted-foreground/50\">/</span>}\n <span className={i < parts.length - 1 ? 'text-sm text-muted-foreground' : ''}>\n {part}\n </span>\n </span>\n ))}\n </span>\n )\n}\n\nexport interface FolderCommandListProps {\n /** Existing folder paths (the host derives them from its documents). */\n folders: string[]\n /** Selected folder (null = unfiled, undefined = no selection). */\n value?: string | null\n /** A folder was picked or a new one created. */\n onSelect: (folder: string | null) => void\n /** Show the remove / move-to-root option. */\n showRemove?: boolean\n /** Wins over `labels.removeFromFolder`. */\n removeLabel?: string\n /** Wins over `labels.searchOrCreate`. */\n placeholder?: string\n autoFocus?: boolean\n labels?: Partial<FolderPickerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<FolderCommandListTestIds>\n}\n\n/**\n * Searchable folder picker: filter existing folders, create one by typing a new name, optional\n * \"Remove from folder\". Shows hierarchy as breadcrumbs.\n */\nexport function FolderCommandList({\n folders,\n value,\n onSelect,\n showRemove = false,\n removeLabel,\n placeholder,\n autoFocus = true,\n labels,\n testIds,\n}: FolderCommandListProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n const [search, setSearch] = useState('')\n const trimmed = search.trim()\n const matchesExisting = folders.some((f) => f.toLowerCase() === trimmed.toLowerCase())\n\n const handleCreate = useCallback(\n (name: string) => {\n const next = name.trim()\n if (!next) return\n onSelect(next)\n setSearch('')\n },\n [onSelect]\n )\n\n return (\n <Command shouldFilter={true}>\n <CommandInput\n placeholder={placeholder ?? l.searchOrCreate}\n value={search}\n onValueChange={setSearch}\n autoFocus={autoFocus}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && trimmed && !matchesExisting) {\n e.preventDefault()\n handleCreate(search)\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {trimmed ? (\n <button\n type=\"button\"\n data-testid={testIdOr(testIds?.create, { testId: 'folder-picker-create' })}\n onClick={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"flex w-full cursor-pointer items-center gap-1.5 rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n <Plus className=\"size-3.5 shrink-0\" />\n {l.create(trimmed)}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.noFolders}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {folders.map((folder) => (\n <CommandItem\n key={folder}\n value={folder}\n data-testid={testIdOr(testIds?.option?.(folder), {\n testId: `folder-picker-option-${folder}`,\n })}\n onSelect={() => onSelect(folder)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm\"\n >\n <FolderOpen className=\"mr-1.5 size-3.5 flex-none shrink-0 text-yellow-text\" />\n <FolderBreadcrumb folder={folder} />\n {value === folder && (\n <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n\n {trimmed && !matchesExisting && folders.length > 0 && (\n <CommandGroup>\n <CommandItem\n value={`__create__${trimmed}`}\n data-testid={testIdOr(testIds?.createOption, {\n testId: 'folder-picker-create-option',\n })}\n onSelect={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-primary\"\n >\n <Plus className=\"mr-1.5 size-3.5 shrink-0\" />\n <span>{l.create(trimmed)}</span>\n </CommandItem>\n </CommandGroup>\n )}\n\n {showRemove && (\n <CommandGroup>\n <CommandItem\n value=\"__none__\"\n data-testid={testIdOr(testIds?.remove, { testId: 'folder-picker-remove' })}\n onSelect={() => onSelect(null)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-muted-foreground\"\n >\n <X className=\"mr-1 size-3.5 shrink-0\" />\n <span>{removeLabel ?? l.removeFromFolder}</span>\n {value === null && <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>}\n </CommandItem>\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Check, ChevronRight, Loader2, StickyNote, X } from 'lucide-react'\nimport { Button, Textarea, cn } from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the panel. Pass a partial `labels` to translate or reword. */\nexport interface TagPassagePanelLabels {\n title: string\n page: (n: number) => string\n close: string\n empty: string\n viewTagged: string\n notePlaceholder: string\n cancel: string\n save: string\n addNote: string\n createField: string\n}\n\nexport const DEFAULT_TAG_PASSAGE_PANEL_LABELS: TagPassagePanelLabels = {\n title: 'Tag Passage',\n page: (n) => `Page ${n}`,\n close: 'Close',\n empty: 'No tags available. Create one to start tagging passages.',\n viewTagged: 'View all passages with this tag',\n notePlaceholder: 'Add a note for this tag...',\n cancel: 'Cancel',\n save: 'Save',\n addNote: 'Add note...',\n createField: '+ Create new field',\n}\n\nexport interface TagPassagePanelTestIds {\n root: string\n close: string\n viewTagged: string\n /** Prefix of each label's row, `<prefix>-<tag id>`. */\n row: string\n}\n\nexport interface PassageTagRowView {\n id: string\n /** Fill colour of the checkbox (dynamic, per label). */\n color: string\n isApplied: boolean\n /** The tag badge (host renders its entity). */\n badge: ReactNode\n /** The saved note on this passage's application of the tag. */\n note?: string | null\n}\n\nexport interface PassageTagGroupView {\n id: string\n title: string\n tags: PassageTagRowView[]\n}\n\nexport interface TagPassagePanelProps {\n pageNumber?: number\n /** Truncated passage text shown under the header. */\n preview: string\n groups: PassageTagGroupView[]\n /** No tags exist yet (shows the empty state). */\n isEmpty: boolean\n isBusy: boolean\n /** The tag whose note is open for editing, and its draft. */\n editingNoteTagId: string | null\n noteValue: string\n onNoteChange: (value: string) => void\n onToggle: (tagId: string) => void\n onViewTagged?: (tagId: string) => void\n onStartNote: (tagId: string) => void\n onSaveNote: (tagId: string) => void\n onCancelNote: () => void\n /** Start a new label or field. Omitted: not offered. */\n onCreate?: () => void\n onClose: () => void\n labels?: Partial<TagPassagePanelLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<TagPassagePanelTestIds>\n}\n\n/** Side panel to apply labels (and per-passage notes) to one passage of a document. */\nexport function TagPassagePanel({\n pageNumber,\n preview,\n groups,\n isEmpty,\n isBusy,\n editingNoteTagId,\n noteValue,\n onNoteChange,\n onToggle,\n onViewTagged,\n onStartNote,\n onSaveNote,\n onCancelNote,\n onCreate,\n onClose,\n labels,\n testIds,\n}: TagPassagePanelProps) {\n const l = { ...DEFAULT_TAG_PASSAGE_PANEL_LABELS, ...labels }\n return (\n <div\n className=\"fixed right-0 top-0 z-50 flex h-full w-80 max-w-full flex-col border-l border-border bg-background shadow-lg\"\n data-slot=\"tag-passage-panel\"\n data-testid={testIdOr(testIds?.root, { testId: 'chunk-tag-panel' })}\n >\n <div className=\"flex items-center justify-between border-b border-border p-4\">\n <div>\n <h3 className=\"text-sm font-semibold\">{l.title}</h3>\n {pageNumber && (\n <span className=\"text-sm text-muted-foreground\">{l.page(pageNumber)}</span>\n )}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClose}\n aria-label={l.close}\n className=\"pointer-coarse:size-11\"\n data-testid={testIdOr(testIds?.close, { testId: 'chunk-tag-panel-close' })}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n\n <div className=\"border-b border-border bg-muted p-4\">\n <p className=\"line-clamp-4 text-sm text-muted-foreground\">{preview}</p>\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n {isEmpty ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">{l.empty}</div>\n ) : (\n <div className=\"py-2\">\n {groups.map((group) => (\n <div key={group.id} className=\"mb-2\">\n <div className=\"bg-muted px-4 py-2 text-sm font-medium uppercase tracking-wider text-muted-foreground\">\n {group.title}\n </div>\n {group.tags.map((tag) => {\n const hasNote = !!tag.note\n const isEditing = editingNoteTagId === tag.id\n return (\n <div\n key={tag.id}\n className=\"border-b border-border last:border-b-0\"\n data-testid={prefixedTestId(testIds?.row, tag.id, {\n testId: `chunk-tag-row-${tag.id}`,\n })}\n >\n <div className=\"flex items-center transition-colors hover:bg-muted\">\n <button\n onClick={() => onToggle(tag.id)}\n disabled={isBusy}\n className=\"flex flex-1 items-center gap-3 px-4 py-3 disabled:opacity-50 pointer-coarse:min-h-11\"\n >\n <div\n className=\"flex size-5 shrink-0 items-center justify-center rounded border-2\"\n style={{\n borderColor: tag.color,\n backgroundColor: tag.isApplied ? tag.color : 'transparent',\n }}\n >\n {tag.isApplied && (\n <Check className=\"size-3 text-white\" strokeWidth={3} />\n )}\n </div>\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n {tag.badge}\n {hasNote && !isEditing && (\n <StickyNote className=\"size-3.5 text-muted-foreground\" />\n )}\n </div>\n {isBusy && <Loader2 className=\"size-4 shrink-0 animate-spin\" />}\n </button>\n\n {tag.isApplied && onViewTagged && (\n <button\n onClick={() => onViewTagged(tag.id)}\n className=\"mr-3 shrink-0 rounded p-1 hover:bg-muted pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n title={l.viewTagged}\n data-testid={testIdOr(testIds?.viewTagged, {\n testId: 'view-tagged-chunks-button',\n })}\n >\n <ChevronRight className=\"size-4 text-muted-foreground\" />\n </button>\n )}\n </div>\n\n {tag.isApplied && (\n <div className=\"px-4 pb-3\">\n {isEditing ? (\n <div className=\"space-y-2\">\n <Textarea\n value={noteValue}\n onChange={(e) => onNoteChange(e.target.value)}\n placeholder={l.notePlaceholder}\n className=\"min-h-[60px] text-sm\"\n autoFocus\n />\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancelNote}>\n {l.cancel}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => onSaveNote(tag.id)}\n disabled={isBusy}\n >\n {l.save}\n </Button>\n </div>\n </div>\n ) : (\n <button\n onClick={() => onStartNote(tag.id)}\n className={cn(\n 'w-full rounded-md bg-muted px-2 py-1.5 text-left text-sm pointer-coarse:min-h-11',\n hasNote ? 'text-foreground' : 'text-muted-foreground'\n )}\n >\n {tag.note || l.addNote}\n </button>\n )}\n </div>\n )}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {onCreate && (\n <div className=\"border-t border-border p-4\">\n <Button variant=\"outline\" size=\"sm\" className=\"w-full\" onClick={onCreate}>\n {l.createField}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { ChevronDown, Upload } from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\nexport interface FilesAddMenuItem {\n id: string\n label: string\n icon: LucideIcon\n onSelect: () => void\n testId?: string\n /** Draws a separator above this item (groups the \"add now\" sources from the rest). */\n separatorBefore?: boolean\n}\n\nexport interface FilesAddMenuProps {\n items: FilesAddMenuItem[]\n /** Hide the \"Add\" label (narrow headers); the icon and chevron stay. */\n isCompact?: boolean\n /** When false the trigger is disabled and `disabledReason` is shown as a tooltip. */\n canAdd?: boolean\n disabledReason?: string\n size?: 'default' | 'sm'\n /** Trigger text (default \"Add\"). */\n label?: string\n className?: string\n /** Overrides the trigger test id (default `documents-upload-button`). */\n testId?: string\n}\n\nconst CLOSE_DELAY_MS = 120\n\n/**\n * The page's single primary \"Add\" control: a source-picker dropdown. Opens on hover (enhancement)\n * AND on click/tap/keyboard, so it is never hover-only; closes on pointer-out with a short grace\n * delay so crossing the trigger-to-menu gap does not flicker it shut.\n */\nexport function FilesAddMenu({\n items,\n isCompact = false,\n canAdd = true,\n disabledReason,\n size = 'default',\n label = 'Add',\n className,\n testId,\n}: FilesAddMenuProps) {\n const [open, setOpen] = useState(false)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const cancelClose = () => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current)\n closeTimer.current = null\n }\n }\n const openMenu = () => {\n cancelClose()\n if (canAdd) setOpen(true)\n }\n const scheduleClose = () => {\n cancelClose()\n closeTimer.current = setTimeout(() => setOpen(false), CLOSE_DELAY_MS)\n }\n useEffect(() => cancelClose, [])\n\n const trigger = (\n <Button\n ref={triggerRef}\n variant=\"default\"\n size={size}\n disabled={!canAdd}\n aria-label={label}\n className={cn('gap-2', className)}\n data-testid={testIdOr(testId, { testId: 'documents-upload-button' })}\n onPointerEnter={(e) => e.pointerType === 'mouse' && openMenu()}\n onPointerLeave={(e) => e.pointerType === 'mouse' && scheduleClose()}\n // Hover has already opened the menu; the press that follows must keep it open, not toggle it\n // shut (Radix toggles on pointerdown). Pairs with onPointerDownOutside below.\n onPointerDown={(e) => e.pointerType === 'mouse' && open && e.preventDefault()}\n >\n <Upload className=\"h-4 w-4\" />\n <span className={isCompact ? 'hidden' : 'inline'}>{label}</span>\n <ChevronDown className=\"h-3.5 w-3.5 opacity-70\" />\n </Button>\n )\n\n if (!canAdd) {\n return (\n <div data-slot=\"files-add-menu\" className=\"flex items-center gap-2\">\n <Tooltip delayDuration={50}>\n <TooltipTrigger asChild>{trigger}</TooltipTrigger>\n {disabledReason && <TooltipContent>{disabledReason}</TooltipContent>}\n </Tooltip>\n </div>\n )\n }\n\n return (\n <div data-slot=\"files-add-menu\" className=\"flex items-center gap-2\">\n {/* modal={false}: a modal dropdown disables pointer-events on the page while open, which\n makes the trigger's hover events bounce and the hover-opened menu flicker. */}\n <DropdownMenu open={open} onOpenChange={setOpen} modal={false}>\n <DropdownMenuTrigger asChild>{trigger}</DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={4}\n className=\"w-56\"\n onPointerEnter={(e) => e.pointerType === 'mouse' && openMenu()}\n onPointerLeave={(e) => e.pointerType === 'mouse' && scheduleClose()}\n onPointerDownOutside={(e) =>\n triggerRef.current?.contains(e.target as Node) && e.preventDefault()\n }\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n {items.map((item) => (\n <span key={item.id} className=\"contents\">\n {item.separatorBefore && <DropdownMenuSeparator />}\n <DropdownMenuItem onSelect={item.onSelect} data-testid={item.testId}>\n <item.icon className=\"mr-2 h-4 w-4 text-muted-foreground\" />\n {item.label}\n </DropdownMenuItem>\n </span>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport { BookMarked } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Row of controls that follows the tab: filter field, folder picker, tags button. */\nexport function FilesFilterBar({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-filter-bar\"\n className={cn('flex min-w-0 flex-1 flex-nowrap items-center gap-2', className)}\n {...props}\n />\n )\n}\n\nexport interface FilesTagsButtonProps {\n onClick: () => void\n /** Button text (default \"Tags\"). */\n label?: string\n className?: string\n /** Overrides the test id (default `filter-bar-tags-button`). */\n testId?: string\n}\n\n/** Opens the labels / annotations vocabulary editor. The label collapses to sr-only on phones. */\nexport function FilesTagsButton({\n onClick,\n label = 'Tags',\n className,\n testId,\n}: FilesTagsButtonProps) {\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn('h-8 shrink-0 gap-1.5 px-2 font-normal pointer-coarse:h-11', className)}\n onClick={onClick}\n data-testid={testIdOr(testId, { testId: 'filter-bar-tags-button' })}\n >\n <BookMarked className=\"h-3.5 w-3.5\" />\n <span className=\"text-sm max-[480px]:sr-only\">{label}</span>\n </Button>\n )\n}\n\n/**\n * The view switch beside the page title. Marks a size container so the switch collapses its labels\n * to icons by the room it is given (not the viewport), and shrinks with the row.\n */\nexport function FilesViewCenter({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-view-center\"\n className={cn('@container flex min-w-[9.5rem] flex-1 items-center gap-2', className)}\n {...props}\n />\n )\n}\n\nexport interface FilesModalFooterProps {\n children?: ReactNode\n className?: string\n}\n\n/** Footer row used when the page is hosted in a modal. */\nexport function FilesModalFooter({ children, className }: FilesModalFooterProps) {\n return (\n <div\n data-slot=\"files-modal-footer\"\n className={cn(\n // Sticks to the bottom of the modal's scrolling body so Close is always reachable.\n 'sticky bottom-0 z-40 flex justify-end gap-2 border-t border-border bg-background px-4 py-3 sm:px-6',\n className\n )}\n >\n {children}\n </div>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport { ExternalLink, Loader2, RefreshCw, Settings, Square, Unplug } from 'lucide-react'\nimport { Button, Progress, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the import parts. Pass a partial `labels` to translate or reword. */\nexport interface ImportLabels {\n stop: string\n stopping: string\n importNow: string\n settings: string\n importingOf: (processed: number, total: number, noun: string) => string\n importing: (processed: number, noun: string) => string\n foldersSelected: (count: number) => string\n folders: (names: string) => string\n moreFolders: (count: number) => string\n connect: string\n reconnect: string\n reconnecting: string\n disconnect: string\n disconnecting: string\n /** Shown under a family that needs re-consent; `reconnect` is rendered bold inside it. */\n reconnectHint: (reconnectLabel: ReactNode) => ReactNode\n}\n\nexport const DEFAULT_IMPORT_LABELS: ImportLabels = {\n stop: 'Stop',\n stopping: 'Stopping…',\n importNow: 'Import now',\n settings: 'Settings',\n importingOf: (processed, total, noun) => `Importing ${processed} of ${total} ${noun}…`,\n importing: (processed, noun) => `Importing ${processed} ${noun}…`,\n foldersSelected: (count) => `Folders: ${count} selected`,\n folders: (names) => `Folders: ${names}`,\n moreFolders: (count) => ` +${count} more`,\n connect: 'Connect',\n reconnect: 'Reconnect',\n reconnecting: 'Reconnecting…',\n disconnect: 'Disconnect',\n disconnecting: 'Disconnecting…',\n reconnectHint: (reconnectLabel) => (\n <>\n Couldn’t reach this account. Click {reconnectLabel} — if it keeps happening, log out and back\n in to refresh the connection.\n </>\n ),\n}\n\n/** Divided list of provider rows inside a family section. */\nexport function ImportList({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div data-slot=\"import-list\" className={cn('divide-y divide-border', className)} {...props} />\n )\n}\n\nexport interface ImportRowProps {\n /** Brand mark, already sized by the caller. */\n logo: ReactNode\n name: ReactNode\n /** Right-aligned actions on the top line. */\n actions?: ReactNode\n /** Detail rows below the top line (summary, progress, handoff, dialogs). */\n children?: ReactNode\n testId?: string\n className?: string\n}\n\n/** One provider row: logo + name + actions, with detail content beneath. */\nexport function ImportRow({ logo, name, actions, children, testId, className }: ImportRowProps) {\n return (\n <div data-slot=\"import-row\" data-testid={testId} className={cn('py-3', className)}>\n <div className=\"flex items-center gap-2.5\">\n {logo}\n <div className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">{name}</div>\n {actions}\n </div>\n {children}\n </div>\n )\n}\n\n/** Muted explanatory text aligned under the provider name. */\nexport function ImportHint({ className, ...props }: ComponentProps<'p'>) {\n return (\n <p\n data-slot=\"import-hint\"\n className={cn('ml-[34px] mt-1 text-xs text-muted-foreground', className)}\n {...props}\n />\n )\n}\n\n/** Compact CTA used on provider rows (Reconnect, Enable...). */\nexport function ImportActionButton({\n className,\n children,\n variant = 'outline',\n ...props\n}: Omit<ComponentProps<typeof Button>, 'size'>) {\n return (\n <Button\n variant={variant}\n size=\"sm\"\n className={cn('ml-auto h-7 shrink-0 gap-1.5 pointer-coarse:h-11', className)}\n data-slot=\"import-action\"\n {...props}\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n {children}\n </Button>\n )\n}\n\nexport interface ImportRunActionsProps {\n isRunning: boolean\n isStopping?: boolean\n /** A sync request is in flight. */\n isBusy?: boolean\n importDisabled?: boolean\n importTitle?: string\n onImport: () => void\n onStop: () => void\n onSettings: () => void\n settingsLabel: string\n importButton?: { testId?: string }\n settingsButton?: { testId?: string }\n stopButton?: { testId?: string }\n labels?: Partial<ImportLabels>\n}\n\n/** \"Import now\" + settings gear, or \"Stop\" while a run is active. */\nexport function ImportRunActions({\n isRunning,\n isStopping,\n isBusy,\n importDisabled,\n importTitle,\n onImport,\n onStop,\n onSettings,\n settingsLabel,\n importButton,\n settingsButton,\n stopButton,\n labels,\n}: ImportRunActionsProps) {\n const l = { ...DEFAULT_IMPORT_LABELS, ...labels }\n if (isRunning) {\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"ml-auto h-7 gap-1.5 pointer-coarse:h-11\"\n onClick={onStop}\n disabled={isStopping}\n data-testid={stopButton?.testId}\n >\n <Square className=\"h-3 w-3\" />\n {isStopping ? l.stopping : l.stop}\n </Button>\n )\n }\n return (\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n <Button\n variant=\"default\"\n size=\"sm\"\n className=\"h-7 gap-1.5 pointer-coarse:h-11\"\n onClick={onImport}\n disabled={isBusy || importDisabled}\n data-testid={importButton?.testId}\n title={importTitle}\n >\n {isBusy ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <RefreshCw className=\"h-3.5 w-3.5\" />\n )}\n {l.importNow}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 text-muted-foreground pointer-coarse:h-11\"\n onClick={onSettings}\n disabled={isBusy}\n aria-label={settingsLabel}\n data-testid={settingsButton?.testId}\n >\n <Settings className=\"h-4 w-4\" />\n {l.settings}\n </Button>\n </div>\n )\n}\n\nexport interface ImportSummaryProps {\n /** Left column, under the name. */\n children: ReactNode\n /** Right column (pending count, folders). */\n aside?: ReactNode\n className?: string\n}\n\n/** Two-column detail block under a provider row. */\nexport function ImportSummary({ children, aside, className }: ImportSummaryProps) {\n return (\n <div\n data-slot=\"import-summary\"\n className={cn('mt-2.5 flex items-start justify-between gap-3', className)}\n >\n <div className=\"ml-[34px] text-sm leading-snug text-muted-foreground\">{children}</div>\n {aside}\n </div>\n )\n}\n\n/** Right-aligned muted aside of an `ImportSummary`. */\nexport function ImportAside({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"import-aside\"\n className={cn(\n 'min-w-0 max-w-[55%] text-right text-sm leading-snug text-muted-foreground',\n className\n )}\n {...props}\n />\n )\n}\n\nexport interface ImportProgressProps {\n processed: number\n total?: number | null\n /** Plural noun, e.g. \"emails\". */\n noun: string\n testId?: string\n labels?: Partial<ImportLabels>\n}\n\n/** Live run progress: bar when the total is known, plus a running count. */\nexport function ImportProgress({ processed, total, noun, testId, labels }: ImportProgressProps) {\n const l = { ...DEFAULT_IMPORT_LABELS, ...labels }\n const known = total != null && total > 0\n return (\n <div data-slot=\"import-progress\" className=\"mt-2 space-y-1\" data-testid={testId}>\n {known && (\n <Progress value={Math.min(100, Math.round((processed / total) * 100))} className=\"h-1.5\" />\n )}\n <div className=\"text-right text-sm leading-snug text-muted-foreground\">\n {known ? l.importingOf(processed, total, noun) : l.importing(processed, noun)}\n </div>\n </div>\n )\n}\n\nconst FOLDER_SUMMARY_LIMIT = 3\n\nexport interface FolderSummaryProps {\n /** One entry per selected folder; undefined when its name is not known (counted, never shown). */\n names: (string | undefined)[]\n testId?: string\n labels?: Partial<ImportLabels>\n}\n\n/** The first few synced folder names, then \"+N more\" (all in the tooltip). */\nexport function FolderSummary({ names, testId, labels }: FolderSummaryProps) {\n const l = { ...DEFAULT_IMPORT_LABELS, ...labels }\n const known = names.filter((n): n is string => !!n)\n if (known.length === 0) {\n return <div data-testid={testId}>{l.foldersSelected(names.length)}</div>\n }\n const shown = known.slice(0, FOLDER_SUMMARY_LIMIT)\n const hidden = names.length - shown.length\n return (\n <div className=\"break-words\" title={known.join(', ')} data-testid={testId}>\n {l.folders(shown.join(', '))}\n {hidden > 0 && <span className=\"whitespace-nowrap\">{l.moreFolders(hidden)}</span>}\n </div>\n )\n}\n\nexport type ImportFamilyActionKind = 'connect' | 'reconnect' | 'disconnect'\n\nexport interface ImportFamilySectionProps {\n label: string\n /** Connected account shown next to the label. */\n identity?: string | null\n /**\n * The single family action: Connect when disconnected, Reconnect when re-consent is due. None for\n * a source with no connection of its own (the user's own mailbox).\n */\n action?: ImportFamilyActionKind\n isActionPending?: boolean\n onAction?: () => void\n testId?: string\n actionButton?: { testId?: string }\n children: ReactNode\n labels?: Partial<ImportLabels>\n}\n\n/** A provider family (Microsoft / Google): header with one action, then its rows. */\nexport function ImportFamilySection({\n label,\n identity,\n action,\n isActionPending,\n onAction,\n testId,\n actionButton,\n children,\n labels,\n}: ImportFamilySectionProps) {\n const l = { ...DEFAULT_IMPORT_LABELS, ...labels }\n const [idle, pending] = action\n ? {\n connect: [l.connect, l.connect],\n reconnect: [l.reconnect, l.reconnecting],\n disconnect: [l.disconnect, l.disconnecting],\n }[action]\n : ['', '']\n const Icon = action === 'disconnect' ? Unplug : ExternalLink\n const isPending = action !== 'connect' && !!isActionPending\n return (\n <section data-slot=\"import-family\" data-testid={testId}>\n <div className=\"mb-1 flex items-center gap-2\">\n <h3 className=\"min-w-0 truncate text-sm font-semibold uppercase tracking-wide text-muted-foreground\">\n {label}\n {identity && (\n <span className=\"ml-1.5 text-sm font-normal normal-case tracking-normal\">\n ({identity})\n </span>\n )}\n </h3>\n {action && (\n <Button\n variant={action === 'disconnect' ? 'ghost' : 'outline'}\n size=\"sm\"\n className={cn(\n 'h-6 shrink-0 gap-1 px-2 text-xs pointer-coarse:h-11',\n action === 'disconnect' && 'text-muted-foreground [&:hover]:text-destructive'\n )}\n onClick={onAction}\n disabled={isPending}\n data-testid={actionButton?.testId}\n >\n <Icon className=\"h-3 w-3\" />\n {isPending ? pending : idle}\n </Button>\n )}\n </div>\n {action === 'reconnect' && (\n <p className=\"mb-1 text-xs text-muted-foreground\">\n {l.reconnectHint(<span className=\"font-medium\">{l.reconnect}</span>)}\n </p>\n )}\n {children}\n </section>\n )\n}\n\n/** Stack of family sections. */\nexport function ImportPanel({ className, ...props }: ComponentProps<'div'>) {\n return <div data-slot=\"import-panel\" className={cn('space-y-5', className)} {...props} />\n}\n","import { useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n AlertCircle,\n CheckCircle,\n ChevronRight,\n CircleSlash,\n Hourglass,\n LoaderCircle,\n} from 'lucide-react'\nimport { Badge, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** A distinct glyph + colour per processing status (active spins while busy). */\nconst STATUS_ICONS = {\n active: { Icon: LoaderCircle, color: 'text-blue-text', spin: true },\n queued: { Icon: Hourglass, color: 'text-yellow-text', spin: false },\n failed: { Icon: AlertCircle, color: 'text-red-text', spin: false },\n skipped: { Icon: CircleSlash, color: 'text-muted-foreground', spin: false },\n completed: { Icon: CheckCircle, color: 'text-green-text', spin: false },\n} as const\n\nexport type TaskSectionStatus = keyof typeof STATUS_ICONS\n\nexport interface TaskSectionProps {\n title: string\n count: number\n status: TaskSectionStatus\n /** Explanation of what the status means, shown on the heading tooltip. */\n tooltip?: string\n headerAction?: ReactNode\n defaultExpanded?: boolean\n /** The task list; rendered only while the section has items and is expanded. */\n children?: ReactNode\n testIds?: Partial<{ root: string; toggle: string }>\n}\n\n/**\n * Collapsible processing-status section. Empty sections show a muted, inert heading;\n * only sections with items expand.\n */\nexport function TaskSection({\n title,\n count,\n status,\n tooltip,\n headerAction,\n defaultExpanded = true,\n children,\n testIds,\n}: TaskSectionProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded)\n const hasItems = count > 0\n const { Icon, color, spin } = STATUS_ICONS[status]\n\n const headingInner = (\n <div className=\"flex items-center gap-2\">\n <Icon className={cn('h-4 w-4', color, hasItems ? spin && 'animate-spin' : 'opacity-50')} />\n <span className=\"whitespace-nowrap\">{title}</span>\n <Badge variant=\"outline\" className=\"badge-count ml-2 border-border\">\n {count}\n </Badge>\n </div>\n )\n\n const heading = tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{headingInner}</TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n headingInner\n )\n\n return (\n <div data-slot=\"task-section\" data-testid={testIdOr(testIds?.root, { testId: 'task-section' })}>\n <div className=\"mb-3 flex items-center justify-between\">\n {hasItems ? (\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n aria-expanded={isExpanded}\n className=\"flex cursor-pointer items-center gap-2 text-left font-medium transition-colors hover:text-primary pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.toggle, { testId: 'task-section-toggle' })}\n >\n <ChevronRight\n className={cn('h-4 w-4 transition-transform', isExpanded && 'rotate-90')}\n />\n {heading}\n </button>\n ) : (\n <div className=\"flex items-center gap-2 font-medium text-muted-foreground\">\n <ChevronRight className=\"h-4 w-4 flex-shrink-0\" />\n {heading}\n </div>\n )}\n {headerAction}\n </div>\n {hasItems && isExpanded && children}\n </div>\n )\n}\n","import type { ClipboardEvent, ReactNode } from 'react'\nimport { Loader2, Plus, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n DialogTrigger,\n Input,\n Label,\n cn,\n} from '@arbidocs/react/ui'\nimport { ModalHeader } from '../../settings/ModalScaffold'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the URL dialog. Pass a partial `labels` to translate or reword. */\nexport interface UrlInputDialogLabels {\n title: string\n description: string\n supports: string\n url: (position: number | null) => string\n placeholder: string\n removeUrl: (position: number) => string\n addAnother: string\n adding: string\n addDocuments: string\n mediaPreview: string\n}\n\nexport const DEFAULT_URL_INPUT_DIALOG_LABELS: UrlInputDialogLabels = {\n title: 'Add from the internet',\n description:\n 'Enter one or more URLs to download documents — paste several separated by commas or new lines.',\n supports:\n 'Supports PDF, Word, PowerPoint, Excel, RTF, TXT, MD, HTML, ZIP, and audio/video links (YouTube et al.).',\n url: (position) => (position === null ? 'URL ' : `URL ${position}`),\n placeholder: 'https://example.com/document.pdf or a YouTube / audio / video link',\n removeUrl: (position) => `Remove URL ${position}`,\n addAnother: 'Add Another URL',\n adding: 'Adding…',\n addDocuments: 'Add Documents',\n mediaPreview: 'Media preview',\n}\n\nexport interface UrlInputDialogTestIds {\n modal: string\n submitError: string\n submit: string\n}\n\nexport interface UrlInputDialogViewProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Trigger element (rendered `asChild`); omit for a controlled dialog opened elsewhere. */\n trigger?: ReactNode\n /** Title content; defaults to `labels.title`. */\n title?: ReactNode\n urls: string[]\n /** Per-field error text ('' when valid). */\n errors: string[]\n onUrlChange: (index: number, value: string) => void\n onUrlPaste: (index: number, text: string) => void\n onAddUrl: () => void\n onRemoveUrl: (index: number) => void\n /** Rendered under a field, e.g. a media preview. */\n renderPreview?: (url: string, index: number) => ReactNode\n submitError?: string | null\n isSubmitting?: boolean\n onSubmit: () => void\n labels?: Partial<UrlInputDialogLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<UrlInputDialogTestIds>\n}\n\n/** \"Add from the internet\" dialog: one or more URL fields, inline errors, submit. */\nexport function UrlInputDialogView({\n open,\n onOpenChange,\n trigger,\n title,\n urls,\n errors,\n onUrlChange,\n onUrlPaste,\n onAddUrl,\n onRemoveUrl,\n renderPreview,\n submitError,\n isSubmitting,\n onSubmit,\n labels,\n testIds,\n}: UrlInputDialogViewProps) {\n const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels }\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n {trigger !== undefined && <DialogTrigger asChild>{trigger}</DialogTrigger>}\n <DialogContent\n presentation=\"sheet\"\n className=\"flex flex-col gap-0 overflow-hidden p-0 sm:max-w-[525px]\"\n data-testid={testIdOr(testIds?.modal, { testId: 'upload-modal-internet' })}\n >\n <ModalHeader>\n <DialogTitle>{title ?? l.title}</DialogTitle>\n </ModalHeader>\n <div className=\"px-6 pb-6\">\n <DialogDescription className=\"pt-4 text-sm text-muted-foreground\">\n {l.description}\n <span className=\"mt-1 block text-xs\">{l.supports}</span>\n </DialogDescription>\n <div className=\"grid gap-4 py-4\">\n {urls.map((url, index) => (\n <div key={index} className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Label htmlFor={`url-${index}`} className=\"text-sm\">\n {l.url(urls.length > 1 ? index + 1 : null)}\n </Label>\n <Input\n id={`url-${index}`}\n type=\"text\"\n placeholder={l.placeholder}\n value={url}\n onChange={(e) => onUrlChange(index, e.target.value)}\n onPaste={(e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n onUrlPaste(index, e.clipboardData.getData('text'))\n }}\n className={cn(errors[index] && 'border-red-border')}\n />\n {errors[index] && <p className=\"mt-1 text-sm text-red-text\">{errors[index]}</p>}\n </div>\n {urls.length > 1 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => onRemoveUrl(index)}\n className=\"mt-6\"\n aria-label={l.removeUrl(index + 1)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n {renderPreview?.(url, index)}\n </div>\n ))}\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onAddUrl} className=\"w-full\">\n <Plus className=\"mr-2 h-4 w-4\" />\n {l.addAnother}\n </Button>\n </div>\n {submitError && (\n <p\n className=\"text-sm text-red-text\"\n data-testid={testIdOr(testIds?.submitError, { testId: 'url-submit-error' })}\n >\n {submitError}\n </p>\n )}\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2\">\n <Button\n onClick={onSubmit}\n disabled={isSubmitting}\n data-testid={testIdOr(testIds?.submit, { testId: 'url-submit-button' })}\n >\n {isSubmitting ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.adding}\n </>\n ) : (\n l.addDocuments\n )}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface UrlDialogTitleProps {\n /** Workspace mark, e.g. its icon. */\n icon?: ReactNode\n workspaceName: string\n /** Wins over the default \"Add from the internet\". */\n labels?: Partial<UrlInputDialogLabels>\n}\n\n/** \"<workspace> / Add from the internet\" title. */\nexport function UrlDialogTitle({ icon, workspaceName, labels }: UrlDialogTitleProps) {\n const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels }\n return (\n <div className={cn('flex min-w-0 items-center', icon ? 'gap-3' : 'gap-2')}>\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\n <span className=\"min-w-0 truncate\" title={workspaceName}>\n {workspaceName}\n </span>\n <span className=\"flex-shrink-0 text-muted-foreground\">/</span>\n <span className=\"flex-shrink-0\">{l.title}</span>\n </div>\n )\n}\n\nexport interface MediaPreviewViewProps {\n kind: 'youtube' | 'video' | 'audio'\n /** Embed URL for youtube, media src otherwise. */\n src: string\n testId?: string\n labels?: Partial<UrlInputDialogLabels>\n}\n\n/** Inline media preview under a URL field. */\nexport function MediaPreviewView({ kind, src, testId, labels }: MediaPreviewViewProps) {\n const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels }\n return (\n <div className=\"mt-2 overflow-hidden rounded-md border\" data-testid={testId}>\n {kind === 'youtube' && (\n <iframe\n className=\"aspect-video w-full\"\n src={src}\n title={l.mediaPreview}\n allow=\"accelerometer; encrypted-media; picture-in-picture\"\n allowFullScreen\n />\n )}\n {kind === 'video' && (\n <video className=\"max-h-56 w-full bg-black\" src={src} controls preload=\"metadata\" />\n )}\n {kind === 'audio' && <audio className=\"w-full p-2\" src={src} controls preload=\"metadata\" />}\n </div>\n )\n}\n","/**\n * VendorLogo\n *\n * Brand marks for mailbox and document connectors (Gmail, Outlook, OneDrive,\n * Google Drive, SharePoint, Box, Dropbox, OneNote, Clio) rendered as inline SVG so\n * they read as the real products rather than a generic glyph. Falls back to a plain\n * mail icon for any other vendor. Used by the Import-from-emails shortcut and the\n * connector provider rows.\n */\n\nimport { Mail } from 'lucide-react'\n\nfunction GmailMark({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 256 193\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"#4285F4\"\n d=\"M58.182 192.05V93.14L27.507 65.077 0 49.504v125.091c0 9.658 7.825 17.455 17.455 17.455z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M197.818 192.05h40.727c9.659 0 17.455-7.826 17.455-17.455V49.505l-31.156 17.837-27.026 25.798z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"m58.182 93.14-4.174-38.647 4.174-36.989L128 69.868l69.818-52.364 4.669 34.992-4.669 40.644L128 145.504z\"\n />\n <path\n fill=\"#FBBC04\"\n d=\"M197.818 17.504V93.14L256 49.504V26.231c0-21.585-24.64-33.89-41.89-20.945z\"\n />\n <path\n fill=\"#C5221F\"\n d=\"M0 49.504 26.759 69.574 58.182 93.14V17.504L41.89 5.286C24.61-7.66 0 4.646 0 26.231z\"\n />\n </svg>\n )\n}\n\nfunction OutlookMark({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n {/* Right envelope panel */}\n <path fill=\"#0F6CBD\" d=\"M44 13H24v22h18.5A1.5 1.5 0 0 0 44 33.5z\" />\n <path fill=\"#28A8EA\" d=\"M24 15.5 44 13v3L24 27z\" />\n {/* Left blue tile with the Outlook \"O\" */}\n <rect x=\"4\" y=\"9\" width=\"21\" height=\"30\" rx=\"2.5\" fill=\"#0364B8\" />\n <ellipse cx=\"14.5\" cy=\"24\" rx=\"6.2\" ry=\"7\" fill=\"none\" stroke=\"#fff\" strokeWidth=\"3.1\" />\n </svg>\n )\n}\n\nfunction OneDriveMark({ className }: { className?: string }) {\n // Authentic Microsoft OneDrive brand mark — the layered four-tone blue cloud.\n return (\n <svg viewBox=\"0 0 256 165\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"#0364B8\"\n d=\"M154.66056 110.681557 207.502052 60.1479482C196.525811 17.3487078 152.932256-8.44908883 110.132767 2.52715287 90.8589801 7.46999082 74.1187452 19.4179992 63.179535 36.0386895 63.9974594 36.0180612 154.66056 110.681557 154.66056 110.681557Z\"\n />\n <path\n fill=\"#0078D4\"\n d=\"M97.6181022 45.5520619 97.6156169 45.5607606C87.5186874 39.307156 75.8741386 36.001658 63.9972108 36.0177537 63.7228296 36.0177537 63.4531706 36.03521 63.1792865 36.0384409 27.8517142 36.4761088-.432413365 65.4695515.00500592252 100.797124.163570414 113.612018 4.16769663 126.083687 11.4981977 136.595916L90.6631356 126.680913 151.357298 77.7409022 97.6181022 45.5520619Z\"\n />\n <path\n fill=\"#1490DF\"\n d=\"M207.502052 60.1481967C206.340406 60.0706542 205.173043 60.016946 203.992011 60.016946 196.903085 60.010012 189.887973 61.4579693 183.381112 64.271122L183.379621 64.2656543 151.357547 77.7411507 186.65952 121.347877 249.770673 136.689364C263.390071 111.405536 253.93411 79.8683506 228.650281 66.2489531 222.117076 62.7297161 214.906119 60.6497377 207.502301 60.1484453L207.502301 60.1481967 207.502052 60.1481967Z\"\n />\n <path\n fill=\"#28A8EA\"\n d=\"M11.4981977 136.595916C23.4514253 153.781772 43.063467 164.023845 63.9974594 164.012918L203.991762 164.012918C223.115435 164.018377 240.697951 153.524291 249.770425 136.689862L151.357298 77.7409022 11.4981977 136.595916Z\"\n />\n </svg>\n )\n}\n\nfunction SharePointMark({ className }: { className?: string }) {\n // Simplified SharePoint glyph — overlapping teal circles composition\n // matching Microsoft's SharePoint brand colours (#036C70 primary, #1A9BA1 accent).\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"22\" cy=\"22\" r=\"20\" fill=\"#036C70\" />\n <circle cx=\"16\" cy=\"20\" r=\"12\" fill=\"#1A9BA1\" />\n <circle cx=\"26\" cy=\"30\" r=\"10\" fill=\"#37C6D0\" />\n <circle cx=\"33\" cy=\"22\" r=\"8\" fill=\"#fff\" opacity=\"0.15\" />\n </svg>\n )\n}\n\nfunction GoogleDriveMark({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 87.3 78\" className={className} aria-hidden=\"true\" focusable=\"false\">\n {/* Google Drive triangle — the three brand colours */}\n <path\n fill=\"#0066da\"\n d=\"M6.6 66.85l3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8H0c0 1.55.4 3.1 1.2 4.5z\"\n />\n <path\n fill=\"#00ac47\"\n d=\"M43.65 25L29.9 1.2c-1.35.8-2.5 1.9-3.3 3.3L1.2 48.5A9.06 9.06 0 0 0 0 53h27.5z\"\n />\n <path\n fill=\"#ea4335\"\n d=\"M73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75L86.1 57.4c.8-1.4 1.2-2.95 1.2-4.5H59.798l5.85 11.5z\"\n />\n <path\n fill=\"#00832d\"\n d=\"M43.65 25L57.4 1.2C56.05.4 54.5 0 52.9 0H34.4c-1.6 0-3.15.45-4.5 1.2z\"\n />\n <path\n fill=\"#2684fc\"\n d=\"M59.8 53H27.5L13.75 76.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n />\n <path\n fill=\"#ffba00\"\n d=\"M73.4 26.5L60.65 4.5c-.8-1.4-1.95-2.5-3.3-3.3L43.65 25l16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n />\n </svg>\n )\n}\n\nfunction BoxMark({ className }: { className?: string }) {\n // Box brand mark — the Box blue (#0061D5) tile with a simple isometric cube.\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#0061D5\" />\n <path\n fill=\"none\"\n stroke=\"#fff\"\n strokeWidth=\"2.5\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n d=\"M24 13 36 19 36 29 24 35 12 29 12 19Z\"\n />\n <path\n fill=\"none\"\n stroke=\"#fff\"\n strokeWidth=\"2.5\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n d=\"M12 19 24 25 36 19 M24 25 24 35\"\n />\n </svg>\n )\n}\n\nfunction DropboxMark({ className }: { className?: string }) {\n // Dropbox's mark is its own logo shape rather than a tile: four parallelograms\n // meeting at a point, in Dropbox blue (#0061FF).\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <g fill=\"#0061FF\">\n <path d=\"M12 6 0 14l12 8 12-8z\" />\n <path d=\"M36 6 24 14l12 8 12-8z\" />\n <path d=\"M0 30l12 8 12-8-12-8z\" />\n <path d=\"M36 22 24 30l12 8 12-8z\" />\n <path d=\"M12 40.5 24 33l12 7.5L24 48z\" />\n </g>\n </svg>\n )\n}\n\nfunction OneNoteMark({ className }: { className?: string }) {\n // OneNote purple (#7719AA), matching the OneDrive/SharePoint tile treatment.\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#7719AA\" />\n <rect x=\"10\" y=\"10\" width=\"21\" height=\"28\" rx=\"2.5\" fill=\"#fff\" opacity=\"0.95\" />\n <rect x=\"31\" y=\"15\" width=\"7\" height=\"5\" rx=\"1.5\" fill=\"#fff\" opacity=\"0.6\" />\n <rect x=\"31\" y=\"22\" width=\"7\" height=\"5\" rx=\"1.5\" fill=\"#fff\" opacity=\"0.6\" />\n <rect x=\"31\" y=\"29\" width=\"7\" height=\"5\" rx=\"1.5\" fill=\"#fff\" opacity=\"0.6\" />\n </svg>\n )\n}\n\nfunction ClioMark({ className }: { className?: string }) {\n // Clio's brand blue (#00263E) with the rounded \"c\" counter of its wordmark.\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#00263E\" />\n <path\n fill=\"none\"\n stroke=\"#4FC3F7\"\n strokeWidth=\"4.5\"\n strokeLinecap=\"round\"\n d=\"M32 17a10 10 0 1 0 0 14\"\n />\n </svg>\n )\n}\n\nexport function VendorLogo({\n vendorKey,\n className = 'h-4 w-4',\n product,\n}: {\n vendorKey: string\n className?: string\n /** Pick a specific product mark when a vendor spans several (e.g. Microsoft → OneDrive). */\n product?: 'onedrive' | 'googledrive' | 'sharepoint' | 'box' | 'dropbox' | 'onenote' | 'clio'\n}) {\n if (product === 'onedrive') return <OneDriveMark className={className} />\n if (product === 'googledrive') return <GoogleDriveMark className={className} />\n if (product === 'sharepoint') return <SharePointMark className={className} />\n if (product === 'box') return <BoxMark className={className} />\n if (product === 'dropbox') return <DropboxMark className={className} />\n if (product === 'onenote') return <OneNoteMark className={className} />\n if (product === 'clio') return <ClioMark className={className} />\n if (vendorKey === 'gmail') return <GmailMark className={className} />\n if (vendorKey === 'microsoft') return <OutlookMark className={className} />\n if (vendorKey === 'microsoft_sharepoint') return <SharePointMark className={className} />\n if (vendorKey === 'box') return <BoxMark className={className} />\n if (vendorKey === 'dropbox') return <DropboxMark className={className} />\n if (vendorKey === 'onenote') return <OneNoteMark className={className} />\n if (vendorKey === 'clio') return <ClioMark className={className} />\n return <Mail className={`${className} text-muted-foreground`} aria-hidden=\"true\" />\n}\n","import type { ReactNode } from 'react'\nimport { FolderOpen } from 'lucide-react'\nimport { Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\n\nexport interface FolderCellProps {\n /** Stored folder path; empty/null renders an em dash. */\n folder: string | null | undefined\n /** Breadcrumb segments, already formatted for display (provider roots shortened). */\n segments: string[]\n /** Leading glyph for connector folders (brand mark); falls back to a folder icon. */\n icon?: ReactNode\n /** Editable cells open `picker` in a popover on click. */\n isEditable: boolean\n /** Popover body (the searchable folder list); only rendered for editable cells. */\n picker?: ReactNode\n className?: string\n}\n\n/** Breadcrumb \"a / b / c\" where all but the last segment are muted. */\nexport function FolderBreadcrumb({\n segments,\n size = 'xs',\n}: {\n segments: string[]\n /** Text size of the segments: `xs` in grid cells, `sm` in form fields. */\n size?: 'xs' | 'sm'\n}) {\n const text = size === 'sm' ? 'text-sm' : 'text-xs'\n return (\n <span data-slot=\"folder-breadcrumb\" className=\"min-w-0 truncate\">\n {segments.map((part, i, arr) => (\n <span key={i} className=\"inline-flex items-center gap-0.5\">\n {i > 0 && <span className={`mx-0.5 ${text} text-muted-foreground/50`}>/</span>}\n <span className={i < arr.length - 1 ? `${text} text-muted-foreground` : ''}>{part}</span>\n </span>\n ))}\n </span>\n )\n}\n\n/**\n * Grid cell for a document's folder. Uses the native `title` attribute instead of a Tooltip:\n * every visible row renders one, so Radix tooltip instances would sit in the scroll hot path.\n */\nexport function FolderCell({\n folder,\n segments,\n icon,\n isEditable,\n picker,\n className,\n}: FolderCellProps) {\n const display = folder ? (\n <>\n {icon ?? <FolderOpen className=\"h-3.5 w-3.5 flex-none shrink-0 text-muted-foreground\" />}\n <FolderBreadcrumb segments={segments} />\n </>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )\n const title = folder || undefined\n\n if (!isEditable) {\n return (\n <div\n data-slot=\"folder-cell\"\n title={title}\n className={cn('flex h-full w-full min-w-0 items-center gap-1.5 text-sm', className)}\n >\n {display}\n </div>\n )\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"folder-cell\"\n title={title}\n className={cn(\n 'flex h-full w-full min-w-0 cursor-pointer items-center gap-1.5 text-left text-sm hover:text-primary',\n className\n )}\n >\n {display}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-[220px] max-w-[min(640px,92vw)] p-0\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n >\n {picker}\n </PopoverContent>\n </Popover>\n )\n}\n","import { useState } from 'react'\nimport type { ComponentType, ReactNode } from 'react'\nimport {\n ArrowRightLeft,\n Blend,\n Copy,\n CopyX,\n CornerDownRight,\n CornerRightDown,\n GitFork,\n Trash2,\n} from 'lucide-react'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\n\ntype IconType = ComponentType<{ className?: string }>\n\nexport interface RelatedDocsCellProps<T> {\n /** The email (or mailbox archive) this document was extracted from. */\n parent?: T | null\n /** Attachments (the documents extracted from this email). */\n attachments: T[]\n /** Documents this one was made from (a crop's image, a redline's inputs, a copy's original). */\n madeFrom?: T[]\n /** Documents made from this one (a redacted or annotated copy, a production). */\n copies?: T[]\n /** Optional short word for how a made-from / copy document is related (\"Redacted copy\"). */\n getRelation?: (doc: T) => string | undefined\n duplicates: T[]\n similar: T[]\n /** Slot: the document pill for one related doc (the app supplies its entity chip). */\n renderDoc: (doc: T) => ReactNode\n getKey: (doc: T) => string\n /** \"Switch to\": open the doc in the viewer. */\n onSwitchTo: (doc: T) => void\n onDelete: (doc: T) => void\n /** Whether this viewer may delete a related document. Defaults to true for existing hosts. */\n canDelete?: (doc: T) => boolean\n /** Compare with a similar document. Absent: not offered. */\n onCompare?: (doc: T) => void\n className?: string\n}\n\nfunction RelatedBadge({\n icon: Icon,\n count,\n label,\n}: {\n icon: IconType\n count: number\n label: string\n}) {\n if (count === 0) return null\n // Native `title`: up to 4 badges per visible row would otherwise be ~200 tooltip instances.\n return (\n <span className=\"inline-flex items-center gap-0.5\" title={`${count} ${label}`}>\n <Icon className=\"h-3.5 w-3.5\" />\n <span className=\"text-xs leading-none tabular-nums\">{count}</span>\n </span>\n )\n}\n\nfunction ActionButton({\n icon: Icon,\n label,\n onClick,\n destructive,\n}: {\n icon: IconType\n label: string\n onClick: () => void\n destructive?: boolean\n}) {\n return (\n <Tooltip>\n <TooltipTrigger asChild onFocusCapture={(e) => e.stopPropagation()}>\n <button\n type=\"button\"\n aria-label={label}\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n className={cn(\n 'shrink-0 rounded-sm p-1 transition-colors pointer-coarse:p-2.5',\n destructive\n ? 'text-muted-foreground hover:bg-destructive/10 hover:text-destructive'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">\n {label}\n </TooltipContent>\n </Tooltip>\n )\n}\n\nfunction RelatedGroup({\n icon: Icon,\n title,\n count,\n children,\n}: {\n icon: IconType\n title: string\n count: number\n children: ReactNode\n}) {\n return (\n <div>\n <div className=\"mb-1.5 flex items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n <Icon className=\"h-3.5 w-3.5\" />\n {title} ({count})\n </div>\n <div className=\"flex flex-col gap-1\">{children}</div>\n </div>\n )\n}\n\n/**\n * Grid cell for the \"Related\" column: compact icon + count badges (parent, attachments,\n * duplicates, similar); clicking opens a popover grouping the related documents with an action\n * per group (Switch to / Delete / Compare). Renders nothing when there are no relations.\n */\nexport function RelatedDocsCell<T>({\n parent,\n attachments,\n madeFrom = [],\n copies = [],\n getRelation,\n duplicates,\n similar,\n renderDoc,\n getKey,\n onSwitchTo,\n onDelete,\n canDelete = () => true,\n onCompare,\n className,\n}: RelatedDocsCellProps<T>) {\n const [open, setOpen] = useState(false)\n const attachmentCount = attachments.length\n const madeFromCount = madeFrom.length\n const copyCount = copies.length\n const dupeCount = duplicates.length\n const simCount = similar.length\n\n if (\n !parent &&\n attachmentCount === 0 &&\n madeFromCount === 0 &&\n copyCount === 0 &&\n dupeCount === 0 &&\n simCount === 0\n )\n return null\n\n const row = (doc: T, action: ReactNode) => (\n <div key={getKey(doc)} className=\"flex items-center gap-1\">\n {renderDoc(doc)}\n {action}\n </div>\n )\n const switchAction = (doc: T) => (\n <ActionButton icon={ArrowRightLeft} label=\"Switch to\" onClick={() => onSwitchTo(doc)} />\n )\n // A made-from / copy row: the document, how it is related, and Switch to.\n const derivedRow = (doc: T) => {\n const relation = getRelation?.(doc)\n return row(\n doc,\n <>\n {relation && (\n <span\n className=\"shrink-0 text-xs text-muted-foreground\"\n data-slot=\"related-docs-relation\"\n >\n {relation}\n </span>\n )}\n {switchAction(doc)}\n </>\n )\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"related-docs-cell\"\n className={cn(\n 'flex h-full w-full cursor-pointer items-center gap-2 text-muted-foreground hover:text-foreground',\n className\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <RelatedBadge icon={CornerDownRight} count={parent ? 1 : 0} label=\"parent\" />\n <RelatedBadge\n icon={CornerRightDown}\n count={attachmentCount}\n label={attachmentCount === 1 ? 'attachment' : 'attachments'}\n />\n <RelatedBadge icon={GitFork} count={madeFromCount} label=\"made from\" />\n <RelatedBadge icon={Copy} count={copyCount} label={copyCount === 1 ? 'copy' : 'copies'} />\n <RelatedBadge\n icon={CopyX}\n count={dupeCount}\n label={dupeCount === 1 ? 'duplicate' : 'duplicates'}\n />\n <RelatedBadge icon={Blend} count={simCount} label=\"similar\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"max-h-[400px] w-[320px] overflow-y-auto p-3\" align=\"start\">\n <div className=\"flex flex-col gap-3\">\n {parent && (\n <RelatedGroup icon={CornerDownRight} title=\"Parent\" count={1}>\n {row(parent, switchAction(parent))}\n </RelatedGroup>\n )}\n {attachmentCount > 0 && (\n <RelatedGroup icon={CornerRightDown} title=\"Attachments\" count={attachmentCount}>\n {attachments.map((doc) => row(doc, switchAction(doc)))}\n </RelatedGroup>\n )}\n {madeFromCount > 0 && (\n <RelatedGroup icon={GitFork} title=\"Made from\" count={madeFromCount}>\n {madeFrom.map(derivedRow)}\n </RelatedGroup>\n )}\n {copyCount > 0 && (\n <RelatedGroup icon={Copy} title=\"Copies made from it\" count={copyCount}>\n {copies.map(derivedRow)}\n </RelatedGroup>\n )}\n {dupeCount > 0 && (\n <RelatedGroup icon={CopyX} title=\"Duplicates\" count={dupeCount}>\n {duplicates.map((doc) =>\n row(\n doc,\n canDelete(doc) ? (\n <ActionButton\n icon={Trash2}\n label=\"Delete\"\n destructive\n onClick={() => {\n onDelete(doc)\n setOpen(false)\n }}\n />\n ) : null\n )\n )}\n </RelatedGroup>\n )}\n {simCount > 0 && (\n <RelatedGroup icon={Blend} title=\"Similar\" count={simCount}>\n {similar.map((doc) =>\n row(\n doc,\n onCompare && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onCompare(doc)\n setOpen(false)\n }}\n className=\"inline-flex shrink-0 items-center gap-1 text-xs text-primary hover:underline pointer-coarse:min-h-11\"\n >\n <Blend className=\"h-3.5 w-3.5\" />\n Compare\n </button>\n )\n )\n )}\n </RelatedGroup>\n )}\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n BookOpen,\n Download,\n FileDown,\n FolderInput,\n MessagesSquare,\n MoreVertical,\n Pencil,\n SquarePen,\n Trash2,\n} from 'lucide-react'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\n\nexport interface DocumentRowMenuProps {\n /** Whether the user may rename / move / delete this document. */\n canEdit: boolean\n onOpen: () => void\n /** Open in the review view. Absent: not offered. */\n onReview?: () => void\n /** Start a chat about the document. Absent: not offered. */\n onDocumentChat?: () => void\n onRename: () => void\n onDownload: () => void\n /** \"Download with markup\": shown when the document's current version has markup. */\n onDownloadMarkup?: () => void\n /** Why \"Download with markup\" is off (a signed, locked version): shown under it. */\n downloadMarkupDisabledReason?: string\n onMove: () => void\n onDelete: () => void\n testId?: string\n}\n\n/** The row-actions kebab of the grid's document cell (Open, Review, Chat, Rename, ...). */\nexport function DocumentRowMenu({\n canEdit,\n onOpen,\n onReview,\n onDocumentChat,\n onRename,\n onDownload,\n onDownloadMarkup,\n downloadMarkupDisabledReason,\n onMove,\n onDelete,\n testId = 'document-row-menu',\n}: DocumentRowMenuProps) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"More actions\"\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n // Always reachable (low emphasis at rest; see grid.css).\n className=\"doc-row-kebab flex h-6 w-6 items-center justify-center rounded text-muted-foreground transition hover:bg-muted hover:text-foreground data-[state=open]:opacity-100 pointer-coarse:h-11 pointer-coarse:w-11\"\n >\n <MoreVertical className=\"h-4 w-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n onClick={(e) => e.stopPropagation()}\n className=\"w-44 border-border/40\"\n >\n <DropdownMenuItem onSelect={onOpen}>\n <SquarePen className=\"mr-2 h-4 w-4\" />\n Open\n </DropdownMenuItem>\n {onReview && (\n <DropdownMenuItem onSelect={onReview}>\n <BookOpen className=\"mr-2 h-4 w-4\" />\n Open in Review\n </DropdownMenuItem>\n )}\n {onDocumentChat && (\n <DropdownMenuItem onSelect={onDocumentChat}>\n <MessagesSquare className=\"mr-2 h-4 w-4\" />\n Document chat\n </DropdownMenuItem>\n )}\n <DropdownMenuSeparator />\n {canEdit && (\n <DropdownMenuItem onSelect={onRename}>\n <Pencil className=\"mr-2 h-4 w-4\" />\n Rename\n </DropdownMenuItem>\n )}\n <DropdownMenuItem onSelect={onDownload}>\n <Download className=\"mr-2 h-4 w-4\" />\n Download\n </DropdownMenuItem>\n {onDownloadMarkup && (\n <DropdownMenuItem\n onSelect={onDownloadMarkup}\n disabled={!!downloadMarkupDisabledReason}\n title={downloadMarkupDisabledReason}\n data-testid=\"document-row-download-markup\"\n className={downloadMarkupDisabledReason ? 'flex-wrap' : undefined}\n >\n <FileDown className=\"mr-2 h-4 w-4\" />\n Download with markup\n {downloadMarkupDisabledReason && (\n <span className=\"mt-0.5 w-full pl-6 text-xs text-muted-foreground\">\n {downloadMarkupDisabledReason}\n </span>\n )}\n </DropdownMenuItem>\n )}\n {canEdit && (\n <DropdownMenuItem onSelect={onMove}>\n <FolderInput className=\"mr-2 h-4 w-4\" />\n Move to…\n </DropdownMenuItem>\n )}\n {canEdit && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={onDelete}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport interface DocumentNameCellFrameProps {\n /** Test id on the wrapper, e.g. `open-document-viewer-button-<id>`. */\n testId?: string\n /** The row's document is open in the viewer: marks the cell so the host's row style can react. */\n isViewing?: boolean\n /** Phone-only second line (date and folder) under the title. */\n subtitle?: string\n /** Slot: the document pill (entity chip with `actions` = a DocumentRowMenu). */\n children: ReactNode\n className?: string\n}\n\n/**\n * Layout of the grid's unified \"document\" cell: the pill plus, on phones where the table\n * collapses to Title + Status, a muted second line.\n */\nexport function DocumentNameCellFrame({\n testId,\n isViewing,\n subtitle,\n children,\n className,\n}: DocumentNameCellFrameProps) {\n return (\n <div\n data-slot=\"document-name-cell\"\n data-testid={testId}\n data-viewing={isViewing || undefined}\n className={cn('flex h-full w-full flex-col justify-center', className)}\n >\n {children}\n <div className=\"hidden min-w-0 truncate pl-[27px] text-xs text-muted-foreground max-[480px]:block\">\n {subtitle}\n </div>\n </div>\n )\n}\n","import { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, Minus, PencilLine } from 'lucide-react'\nimport {\n TagEntity,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\nimport { CellHoverIcon } from './HoverIconCell'\n\n/** Chip row metrics (px): a chip is 24px tall with a 4px gap, as in the Facts labels cell. */\nconst CHIP_ROW_H = 24\nconst CHIP_GAP = 4\n\n/** Max height of the chip container: whole chip rows that fit `rowHeight`, never half a row. */\nexport function labelChipClampHeight(rowHeight: number): number {\n const rows = Math.max(1, Math.floor((rowHeight + CHIP_GAP) / (CHIP_ROW_H + CHIP_GAP)))\n return CHIP_ROW_H * rows + CHIP_GAP * (rows - 1)\n}\n\n/** One label a document can carry. `color` is any CSS colour (the host derives it from the id). */\nexport interface LabelOption {\n id: string\n name: string\n color: string\n}\n\n/** Every fixed string of the label picker. */\nexport interface LabelMultiSelectLabels {\n searchPlaceholder: string\n noLabels: string\n create: (name: string) => string\n editLabel: string\n}\n\nexport const DEFAULT_LABEL_MULTI_SELECT_LABELS: LabelMultiSelectLabels = {\n searchPlaceholder: 'Search or create...',\n noLabels: 'No labels yet',\n create: (name) => `Create “${name}”`,\n editLabel: 'Edit field',\n}\n\nexport interface LabelMultiSelectViewProps {\n options: LabelOption[]\n /** Ids of the labels applied to the row. */\n appliedIds: ReadonlySet<string>\n onToggle: (id: string) => void\n /** Create a label named `name` and apply it (the host decides what a non-member may do). */\n onCreate: (name: string) => void\n /** Opens the label editor; omit to hide the per-option edit button. */\n onEditLabels?: () => void\n /** The grid row height: clamps the chips to the rows that fully fit, with an ellipsis. */\n rowHeight?: number\n labels?: Partial<LabelMultiSelectLabels>\n}\n\nconst CHECK_BOX = 'flex shrink-0 items-center justify-center rounded border-2'\n\nexport interface LabelPickerListProps {\n options: LabelOption[]\n appliedIds: ReadonlySet<string>\n mixedIds?: ReadonlySet<string>\n onToggle: (id: string) => void\n /** Create a label named `name`; omit to hide \"Create ...\" (the picker only toggles). */\n onCreate?: (name: string) => void\n /**\n * Further ways to create from the typed name, each its own row under \"Create ...\" (e.g. one per\n * kind of tag). Enter still runs `onCreate`.\n */\n moreCreates?: { label: (name: string) => string; onCreate: (name: string) => void }[]\n /** Opens the label editor; omit to hide the per-option edit button. */\n onEditLabels?: () => void\n labels?: Partial<LabelMultiSelectLabels>\n}\n\n/**\n * Searchable list of labels with check boxes: type to filter, Enter (or the \"Create ...\" row, shown\n * whenever the typed name is not a label yet, below any labels that partly match it) creates it. Used by the grid cell and the document form field.\n */\nexport function LabelPickerList({\n options,\n appliedIds,\n mixedIds,\n onToggle,\n onCreate,\n moreCreates,\n onEditLabels,\n labels,\n}: LabelPickerListProps) {\n const l = useMemo(() => ({ ...DEFAULT_LABEL_MULTI_SELECT_LABELS, ...labels }), [labels])\n const [search, setSearch] = useState('')\n const trimmed = search.trim()\n const matchesExisting = options.some((o) => o.name.toLowerCase() === trimmed.toLowerCase())\n\n const create = () => {\n onCreate?.(trimmed)\n setSearch('')\n }\n\n return (\n <Command shouldFilter>\n <CommandInput\n placeholder={l.searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && onCreate && trimmed && !matchesExisting) {\n e.preventDefault()\n create()\n }\n }}\n />\n <CommandList>\n {/* Nothing matches and nothing to create: say so. A new name is offered below instead. */}\n {!(trimmed && onCreate) && (\n <CommandEmpty>\n <span className=\"text-muted-foreground\">{l.noLabels}</span>\n </CommandEmpty>\n )}\n <CommandGroup>\n {options.map((o) => {\n const isApplied = appliedIds.has(o.id)\n const isMixed = mixedIds?.has(o.id)\n return (\n <CommandItem\n key={o.id}\n value={o.name}\n onSelect={() => onToggle(o.id)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"group/label cursor-pointer\"\n data-testid={`label-select-${o.id}`}\n >\n <span\n className={`mr-2 size-4 ${CHECK_BOX} ${isApplied ? '' : 'bg-background'}`}\n style={{\n borderColor: o.color,\n backgroundColor: isApplied ? o.color : undefined,\n }}\n >\n {isApplied && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n {isMixed && <Minus className=\"size-3\" style={{ color: o.color }} />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <TagEntity\n tag={{ external_id: o.id, name: o.name }}\n size=\"sm\"\n showTooltip={false}\n />\n </span>\n {onEditLabels && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onEditLabels()\n }}\n onPointerDown={(e) => e.preventDefault()}\n className=\"shrink-0 rounded p-0.5 opacity-0 hover:bg-muted focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover/label:opacity-100 group-data-[selected=true]/label:opacity-100 pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center pointer-coarse:opacity-100\"\n title={l.editLabel}\n aria-label={l.editLabel}\n >\n <PencilLine className=\"size-3 text-muted-foreground\" />\n </button>\n )}\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n {trimmed && onCreate && !matchesExisting && (\n <div className=\"border-t border-border p-1\" data-slot=\"label-picker-create\">\n {[{ label: l.create, onCreate }, ...(moreCreates ?? [])].map((c, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => {\n c.onCreate(trimmed)\n setSearch('')\n }}\n onPointerDown={(e) => e.preventDefault()}\n className=\"w-full cursor-pointer rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n {c.label(trimmed)}\n </button>\n ))}\n </div>\n )}\n </Command>\n )\n}\n\n/**\n * Labels column cell: applied labels as bordered chips; click (or Enter) opens a popover to\n * toggle labels or type a new name and press Enter to create it. Empty cells show a pencil on\n * hover, keyboard focus and touch.\n */\nexport const LabelMultiSelectView = memo(function LabelMultiSelectView({\n options,\n appliedIds,\n onToggle,\n onCreate,\n onEditLabels,\n rowHeight = 52,\n labels,\n}: LabelMultiSelectViewProps) {\n const [open, setOpen] = useState(false)\n\n const applied = options.filter((o) => appliedIds.has(o.id))\n const maxHeight = labelChipClampHeight(rowHeight)\n const chipsRef = useRef<HTMLDivElement>(null)\n const [hasOverflow, setHasOverflow] = useState(false)\n useEffect(() => {\n const el = chipsRef.current\n if (!el) return\n const measure = () => setHasOverflow(el.scrollHeight > el.clientHeight + 1)\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(el)\n return () => ro.disconnect()\n }, [appliedIds, maxHeight, options])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"label-multi-select\"\n // No vertical clip/padding: at the minimum row height an `overflow-hidden` button would\n // crop the pills. The chip container is clamped to whole chip rows instead.\n className=\"group relative flex h-full w-full min-w-0 cursor-pointer items-center gap-1 pr-4 text-left hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n >\n {applied.length === 0 ? (\n <span className=\"flex-1\">\n <CellHoverIcon />\n </span>\n ) : (\n <>\n <div\n ref={chipsRef}\n className=\"flex min-w-0 flex-1 flex-wrap content-start gap-1 overflow-hidden\"\n style={{ maxHeight }}\n data-testid=\"label-multi-select-chips\"\n >\n {applied.map((o) => (\n <TagEntity\n key={o.id}\n tag={{ external_id: o.id, name: o.name }}\n size=\"sm\"\n showTooltip={false}\n />\n ))}\n </div>\n {hasOverflow && (\n <span\n className=\"pointer-events-none absolute bottom-0.5 right-0.5 text-xs font-semibold leading-none text-muted-foreground\"\n aria-hidden\n data-testid=\"label-multi-select-overflow\"\n >\n …\n </span>\n )}\n </>\n )}\n </button>\n </PopoverTrigger>\n {open && (\n <PopoverContent className=\"w-[360px] p-0\" align=\"start\" side=\"bottom\" sideOffset={4}>\n <LabelPickerList\n options={options}\n appliedIds={appliedIds}\n onToggle={onToggle}\n onCreate={onCreate}\n onEditLabels={onEditLabels}\n labels={labels}\n />\n </PopoverContent>\n )}\n </Popover>\n )\n})\n","import { memo, type ReactNode } from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface CheckboxCellProps {\n isChecked: boolean\n /** Any CSS colour: the tag's colour. */\n color: string\n isEditable: boolean\n /** Tooltip / accessible name, e.g. `Add \"Urgent\" tag`. */\n title: string\n onToggle: () => void\n}\n\n/** Checkbox-tag cell: a coloured box that toggles on click; inert for non-members. */\nexport const CheckboxCell = memo(function CheckboxCell({\n isChecked,\n color,\n isEditable,\n title,\n onToggle,\n}: CheckboxCellProps) {\n return (\n <button\n type=\"button\"\n data-slot=\"checkbox-cell\"\n aria-pressed={isChecked}\n onClick={(e) => {\n e.stopPropagation()\n if (isEditable) onToggle()\n }}\n disabled={!isEditable}\n title={title}\n aria-label={title}\n className=\"inline-flex items-center justify-center rounded-md p-0.5 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n >\n <span\n className={cn(\n 'flex size-4 shrink-0 items-center justify-center rounded border-2 transition-colors',\n !isChecked && 'bg-background'\n )}\n style={{ borderColor: color, backgroundColor: isChecked ? color : undefined }}\n >\n {isChecked && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n </span>\n </button>\n )\n})\n\nexport interface TagColumnHeaderProps {\n /** The column's filter button (host-supplied: it is grid-specific). */\n filter: ReactNode\n /** The tag's name pill. */\n label: ReactNode\n /** Current sort direction; null/undefined when unsorted. */\n sort?: 'asc' | 'desc' | null\n isCentered?: boolean\n /** Sort on click; `additive` is true with Shift (multi-sort). */\n onSort?: (additive: boolean) => void\n}\n\n/**\n * Header of a tag column: filter button on the LEFT of the name, sort indicator after it.\n * The filter carries AG Grid's `.ag-header-icon` class (grid theme `order: 1`), so the label and\n * indicator pin `order-2`.\n */\nexport const TagColumnHeader = memo(function TagColumnHeader({\n filter,\n label,\n sort,\n isCentered,\n onSort,\n}: TagColumnHeaderProps) {\n return (\n <div\n data-slot=\"tag-column-header\"\n className={cn(\n 'flex h-full w-full items-center gap-2 px-2',\n onSort && 'cursor-pointer',\n isCentered && 'justify-center'\n )}\n onClick={(e) => onSort?.(e.shiftKey)}\n >\n {filter}\n <div className=\"order-2 min-w-0 flex-1\">{label}</div>\n {sort && (\n <span className=\"ag-sort-indicator-icon order-2 shrink-0\">\n <span className={`ag-icon ${sort === 'asc' ? 'ag-icon-asc' : 'ag-icon-desc'}`} />\n </span>\n )}\n </div>\n )\n})\n","import { SquareCheckBig } from 'lucide-react'\nimport { Button, Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\nimport { LabelPickerList, type LabelOption } from './LabelMultiSelect'\n\n/** Shared bulk label control: mixed labels apply to all; checked labels remove from all. */\nexport function BulkLabelSelectView({\n options,\n appliedIds,\n mixedIds,\n onToggle,\n onCreate,\n disabled,\n isCompact,\n}: {\n options: LabelOption[]\n appliedIds: ReadonlySet<string>\n mixedIds?: ReadonlySet<string>\n onToggle: (id: string) => void\n onCreate?: (name: string) => void\n disabled?: boolean\n isCompact?: boolean\n}) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={disabled}\n className=\"h-7 gap-1.5 px-2 text-yellow-text hover:text-yellow-text hover:bg-yellow-bg border-yellow-border\"\n data-testid=\"bulk-label-button\"\n aria-label=\"Labels\"\n >\n <SquareCheckBig className=\"size-4\" />\n {!isCompact && <span>Labels</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[220px] p-0\" align=\"start\" side=\"top\" sideOffset={4}>\n <LabelPickerList\n options={options}\n appliedIds={appliedIds}\n mixedIds={mixedIds}\n onToggle={onToggle}\n onCreate={onCreate}\n />\n </PopoverContent>\n </Popover>\n )\n}\n","/**\n * AG Grid Cell Editor for Multi-Select\n *\n * Custom cell editor that displays a Command-based multi-select UI directly.\n * Uses AG Grid's cellEditorPopup for positioning - no internal Popover needed.\n * Values are stored as semicolon-separated strings (e.g., \"Option1;Option2\").\n */\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '@arbidocs/react/ui'\nimport { memo, useState, useRef, useEffect } from 'react'\nimport { Check } from 'lucide-react'\nimport { CustomCellEditorProps } from 'ag-grid-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface MultiSelectCellEditorParams {\n /** Available options for selection */\n values: string[]\n}\n\n// Parse semicolon-separated string to array\nconst parseValue = (val: string | null | undefined): string[] => {\n if (!val || val === '--') return []\n return val\n .split(';')\n .map((v) => v.trim())\n .filter(Boolean)\n}\n\n// Convert array back to semicolon-separated string\nconst formatValue = (arr: string[]): string => {\n if (arr.length === 0) return ''\n return arr.join(';')\n}\n\nexport const MultiSelectCellEditor = memo(\n (props: CustomCellEditorProps & MultiSelectCellEditorParams) => {\n const { value, values, stopEditing, onValueChange } = props\n\n const [selectedValues, setSelectedValues] = useState<string[]>(() => parseValue(value))\n const [searchValue, setSearchValue] = useState('')\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Convert options to data format\n const data = values.map((v) => ({ label: v, value: v }))\n\n // Handle toggling an option\n const toggleOption = (optionValue: string) => {\n const newValues = selectedValues.includes(optionValue)\n ? selectedValues.filter((v) => v !== optionValue)\n : [...selectedValues, optionValue]\n setSelectedValues(newValues)\n onValueChange(formatValue(newValues))\n }\n\n // Handle select all\n const toggleAll = () => {\n const newValues = selectedValues.length === data.length ? [] : data.map((d) => d.value)\n setSelectedValues(newValues)\n onValueChange(formatValue(newValues))\n }\n\n // Handle clear\n const handleClear = () => {\n setSelectedValues([])\n onValueChange('')\n }\n\n // Handle done - close the editor\n const handleDone = () => {\n stopEditing()\n }\n\n // Handle focus out - close when focus leaves the container\n useEffect(() => {\n const handleFocusOut = (event: FocusEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.relatedTarget as Node)) {\n stopEditing()\n }\n }\n\n const container = containerRef.current\n if (container) {\n container.addEventListener('focusout', handleFocusOut)\n }\n\n return () => {\n if (container) {\n container.removeEventListener('focusout', handleFocusOut)\n }\n }\n }, [stopEditing])\n\n return (\n <div ref={containerRef} className=\"w-64 bg-popover border rounded-md shadow-md\">\n <Command shouldFilter={true}>\n {data.length > 5 && (\n <CommandInput\n placeholder=\"Search...\"\n value={searchValue}\n onValueChange={setSearchValue}\n autoFocus\n />\n )}\n <CommandList>\n <CommandEmpty>No options found.</CommandEmpty>\n <CommandGroup>\n {/* Select All option */}\n <CommandItem onSelect={toggleAll} className=\"cursor-pointer\">\n <div\n className={cn(\n 'mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary',\n selectedValues.length === data.length\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <Check className=\"h-4 w-4\" />\n </div>\n <span>(Select All)</span>\n </CommandItem>\n\n {/* Individual options */}\n {data.map((option) => {\n const isSelected = selectedValues.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 >\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 <Check className=\"h-4 w-4\" />\n </div>\n <span>{option.label}</span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n <CommandSeparator />\n <CommandGroup>\n <div className=\"flex items-center justify-between\">\n {selectedValues.length > 0 && (\n <CommandItem\n onSelect={handleClear}\n className=\"flex-1 justify-center cursor-pointer\"\n >\n Clear\n </CommandItem>\n )}\n <CommandItem onSelect={handleDone} className=\"flex-1 justify-center cursor-pointer\">\n Done\n </CommandItem>\n </div>\n </CommandGroup>\n </CommandList>\n </Command>\n </div>\n )\n }\n)\n\nMultiSelectCellEditor.displayName = 'MultiSelectCellEditor'\n","import {\n ArrowDownToLine,\n ArrowRightFromLine,\n FolderInput,\n Hash,\n MessagesSquare,\n MoreHorizontal,\n NotebookPen,\n RefreshCw,\n Share2,\n Tags,\n Trash2,\n} from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { SelectionBar, SelectionBarAction, type SelectionBarProps } from '../SelectionBar'\nimport {\n ShareControl,\n type ShareControlLabels,\n type ShareState,\n} from '../../collaboration/sharing/ShareControl'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the bulk bar. Pass a partial `labels` to translate or reword. */\nexport interface BulkActionsLabels {\n chat: string\n chatTooltip: string\n annotate: string\n annotateTooltip: string\n label: string\n labelTooltip: string\n share: string\n makePrivate: string\n more: string\n folder: string\n export: string\n production: string\n reprocess: string\n removeOffline: string\n useOffline: string\n delete: string\n}\n\nexport const DEFAULT_BULK_ACTIONS_LABELS: BulkActionsLabels = {\n chat: 'Chat',\n chatTooltip: 'Start a new chat with the selected document(s)',\n annotate: 'AI Annotate',\n annotateTooltip: 'Add or remove annotations from selected documents',\n label: 'Label',\n labelTooltip: 'Add or remove labels from selected documents',\n share: 'Share',\n makePrivate: 'Make private',\n more: 'More',\n folder: 'Folder',\n export: 'Export',\n production: 'Production set',\n reprocess: 'Reprocess',\n removeOffline: 'Remove offline',\n useOffline: 'Use Offline',\n delete: 'Delete',\n}\n\nexport interface BulkActionsTestIds {\n chat: string\n annotate: string\n label: string\n more: string\n moveFolder: string\n share: string\n export: string\n production: string\n reprocess: string\n offline: string\n delete: string\n}\n\nexport interface BulkActionsBarProps {\n /** Number of selected documents; the bar is hidden at 0. */\n count: number\n onClear: () => void\n onReview?: () => void\n /** Members get annotate / label / share / folder / export / reprocess / delete. */\n isMember: boolean\n /** Online-only actions (export, reprocess, enabling offline) are disabled while offline. */\n isOnline: boolean\n /** Chat about the selection. Absent: not offered. */\n onChat?: () => void\n /** Fill AI fields on the selection. Absent: not offered. */\n onAnnotate?: () => void\n /** Label the selection. Absent: not offered. */\n onLabel?: () => void\n onMoveToFolder: () => void\n onExport: () => void\n /** Opens the production-set (Bates numbering) flow; the menu item is hidden when omitted. */\n onProduce?: () => void\n onReprocess: () => void\n /** Label of the reprocess item (the app adds the \"(max N)\" cap hint). */\n reprocessLabel?: string\n /** Keep the selection on this device (or stop). Absent: not offered. */\n onToggleOffline?: () => void\n /** All selected docs are already available offline: the item removes them instead. */\n isAllOffline?: boolean\n isOfflinePending?: boolean\n onDelete: () => void\n /** Visibility of the selection (all shared, none shared, or a mix). */\n shareState: ShareState\n /** `true` = share with the workspace, `false` = make private. */\n onToggleShare: (shouldShare: boolean) => void\n /** Tooltip of the share button (what a click does). */\n shareTooltip?: string\n /** Labels of the share control (Share / Shared / Private). */\n shareLabels?: Partial<ShareControlLabels>\n className?: string\n labels?: Partial<BulkActionsLabels>\n /** Overrides for the control test ids (defaults keep the current ids). */\n testIds?: Partial<BulkActionsTestIds>\n /** Labels / test ids of the underlying selection bar (count, clear, review). */\n selectionBar?: Pick<SelectionBarProps, 'labels' | 'testIds'>\n}\n\n/**\n * Bulk actions for selected documents, composed on the `SelectionBar`. Primary actions stay\n * inline (Chat, AI Annotate, Label, Shared); the rest fold into a \"More\" menu to keep the bar\n * on one row. Data-free: every action is a callback, the visibility toggle is a slot.\n */\nexport function BulkActionsBar({\n count,\n onClear,\n onReview,\n isMember,\n isOnline,\n onChat,\n onAnnotate,\n onLabel,\n onMoveToFolder,\n onExport,\n onProduce,\n onReprocess,\n reprocessLabel,\n onToggleOffline,\n isAllOffline,\n isOfflinePending,\n onDelete,\n shareState,\n onToggleShare,\n shareTooltip,\n shareLabels,\n className,\n labels,\n testIds,\n selectionBar,\n}: BulkActionsBarProps) {\n const l = { ...DEFAULT_BULK_ACTIONS_LABELS, ...labels }\n const ids = {\n chat: testIdOr(testIds?.chat, { testId: 'bulk-chat-button' }),\n annotate: testIdOr(testIds?.annotate, { testId: 'bulk-annotate-button' }),\n label: testIdOr(testIds?.label, { testId: 'bulk-label-button' }),\n more: testIdOr(testIds?.more, { testId: 'bulk-more-button' }),\n moveFolder: testIdOr(testIds?.moveFolder, { testId: 'bulk-move-folder-button' }),\n share: testIdOr(testIds?.share, { testId: 'bulk-shared-toggle' }),\n export: testIdOr(testIds?.export, { testId: 'bulk-export-button' }),\n production: testIdOr(testIds?.production, { testId: 'bulk-production-button' }),\n reprocess: testIdOr(testIds?.reprocess, { testId: 'bulk-reprocess-button' }),\n offline: testIdOr(testIds?.offline, { testId: 'bulk-offline-button' }),\n delete: testIdOr(testIds?.delete, { testId: 'bulk-delete-button' }),\n }\n const noSelection = count === 0\n const divider = <div className=\"h-5 w-px flex-shrink-0 bg-border\" />\n\n return (\n <SelectionBar\n count={count}\n onClear={onClear}\n onReview={onReview}\n className={className}\n {...selectionBar}\n >\n {(compactBar, isNarrow) => {\n // Phone width keeps the first two actions labelled; only the desktop bar collapses to icons.\n const isCompact = compactBar && !isNarrow\n return (\n <>\n {onChat && (\n <SelectionBarAction\n icon={MessagesSquare}\n label={l.chat}\n tooltip={l.chatTooltip}\n onClick={onChat}\n disabled={noSelection}\n isCompact={isCompact}\n variant=\"secondary\"\n testId={ids.chat}\n />\n )}\n\n {isMember && onAnnotate && (\n <SelectionBarAction\n icon={NotebookPen}\n label={l.annotate}\n onClick={onAnnotate}\n disabled={noSelection}\n tooltip={l.annotateTooltip}\n isCompact={isCompact}\n testId={ids.annotate}\n />\n )}\n\n {isMember && !isNarrow && (\n <>\n {onLabel && (\n <SelectionBarAction\n icon={Tags}\n label={l.label}\n onClick={onLabel}\n disabled={noSelection}\n tooltip={l.labelTooltip}\n isCompact={isCompact}\n testId={ids.label}\n />\n )}\n {divider}\n <ShareControl\n state={shareState}\n onToggle={onToggleShare}\n disabled={noSelection}\n tooltip={shareTooltip}\n variant=\"ghost\"\n compact={isCompact}\n showState={!isCompact}\n labels={{ share: l.share, ...shareLabels }}\n testId={ids.share}\n />\n </>\n )}\n\n {!isNarrow && divider}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2 pointer-coarse:h-11\"\n // Icon-only in the compact bar: it still needs a name (as SelectionBarAction does).\n aria-label={isCompact ? l.more : undefined}\n data-testid={ids.more}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n {!isCompact && <span className=\"text-sm\">{l.more}</span>}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {/* Phone width: the secondary inline actions fold in here so the bar fits one row. */}\n {isMember && isNarrow && (\n <>\n {onLabel && (\n <DropdownMenuItem\n onClick={onLabel}\n disabled={noSelection}\n data-testid={ids.label}\n >\n <Tags className=\"mr-2 h-4 w-4\" />\n {l.label}\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onClick={() => onToggleShare(shareState !== 'shared')}\n disabled={noSelection}\n data-testid={ids.share}\n >\n <Share2 className=\"mr-2 h-4 w-4\" />\n {shareState === 'shared' ? l.makePrivate : l.share}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n {isMember && (\n <>\n <DropdownMenuItem\n onClick={onMoveToFolder}\n disabled={noSelection}\n data-testid={ids.moveFolder}\n >\n <FolderInput className=\"mr-2 h-4 w-4\" />\n {l.folder}\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={onExport}\n disabled={noSelection || !isOnline}\n data-testid={ids.export}\n >\n <ArrowRightFromLine className=\"mr-2 h-4 w-4\" />\n {l.export}\n </DropdownMenuItem>\n {onProduce && (\n <DropdownMenuItem\n onClick={onProduce}\n disabled={noSelection || !isOnline}\n data-testid={ids.production}\n >\n <Hash className=\"mr-2 h-4 w-4\" />\n {l.production}\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onClick={onReprocess}\n disabled={noSelection || !isOnline}\n data-testid={ids.reprocess}\n >\n <RefreshCw className=\"mr-2 h-4 w-4\" />\n {reprocessLabel ?? l.reprocess}\n </DropdownMenuItem>\n </>\n )}\n {onToggleOffline && (\n <DropdownMenuItem\n onClick={onToggleOffline}\n disabled={noSelection || isOfflinePending || (!isAllOffline && !isOnline)}\n data-testid={ids.offline}\n >\n <ArrowDownToLine className=\"mr-2 h-4 w-4\" />\n {isAllOffline ? l.removeOffline : l.useOffline}\n </DropdownMenuItem>\n )}\n {isMember && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={onDelete}\n disabled={noSelection}\n className=\"text-red-text focus:text-red-text\"\n data-testid={ids.delete}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n {l.delete}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )\n }}\n </SelectionBar>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ChevronDown, FolderOpen, FolderPlus } from 'lucide-react'\nimport { Button, Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\nimport { FolderPickerRow } from '../FolderPicker'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the folder filter. Pass a partial `labels` to translate or reword. */\nexport interface FolderFilterLabels {\n all: string\n newFolder: string\n}\n\nexport const DEFAULT_FOLDER_FILTER_LABELS: FolderFilterLabels = {\n all: 'All',\n newFolder: 'New folder',\n}\n\nexport interface FolderFilterButtonProps {\n /** Text of the active folder (\"All\", \"None\", or the display path). */\n label: string\n /** Leading glyph for connector folders; falls back to a folder icon. */\n icon?: ReactNode\n /** A folder filter is active: the trigger takes the selection tint. */\n isActive: boolean\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Total documents, shown on the \"All\" row. */\n allCount?: number\n /** When set, the popover starts with an \"All\" row; omit it for lists that have no \"All\". */\n onSelectAll?: () => void\n /** When set, the popover offers a \"New folder\" action. */\n onNewFolder?: () => void\n /** Slot: the folder tree picker. */\n children: ReactNode\n className?: string\n labels?: Partial<FolderFilterLabels>\n /** Test id of the trigger button (none by default). */\n testId?: string\n /** Overrides the \"New folder\" test id (default `explorer-new-folder`). */\n newFolderTestId?: string\n}\n\n/**\n * The folder filter control: a ghost button naming the active folder that opens a popover with\n * an \"All\" row, the folder tree (slot) and an optional \"New folder\" action.\n */\nexport function FolderFilterButton({\n label,\n icon,\n isActive,\n open,\n onOpenChange,\n allCount,\n onSelectAll,\n onNewFolder,\n children,\n className,\n labels,\n testId,\n newFolderTestId,\n}: FolderFilterButtonProps) {\n const l = { ...DEFAULT_FOLDER_FILTER_LABELS, ...labels }\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n data-slot=\"folder-filter-button\"\n data-testid={testId}\n className={cn(\n 'h-7 shrink-0 gap-1.5 px-2 text-sm font-normal pointer-coarse:h-10',\n isActive && 'bg-accent font-medium text-accent-foreground',\n className\n )}\n >\n {icon ?? (\n <FolderOpen\n className={cn(\n 'h-3.5 w-3.5 shrink-0 text-muted-foreground',\n isActive && 'fill-muted-foreground/30'\n )}\n />\n )}\n <span className=\"max-w-[280px] truncate\">{label}</span>\n <ChevronDown className=\"h-4 w-4 text-foreground\" strokeWidth={2.5} />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-56 max-w-[480px] p-1 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n >\n {onSelectAll && (\n <>\n <FolderPickerRow\n label={l.all}\n count={allCount}\n depth={0}\n isActive={!isActive}\n onClick={onSelectAll}\n />\n <div className=\"my-1 border-t border-border\" />\n </>\n )}\n {children}\n {onNewFolder && (\n <>\n <div className=\"my-1 border-t border-border\" />\n <button\n type=\"button\"\n onClick={onNewFolder}\n data-testid={testIdOr(newFolderTestId, { testId: 'explorer-new-folder' })}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground pointer-coarse:min-h-11\"\n >\n <FolderPlus className=\"h-3.5 w-3.5\" />\n {l.newFolder}\n </button>\n </>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ToneBadge } from '../../components/ToneBadge'\nimport { ChevronDown, ChevronRight, Loader2, Plus, Sparkles } from 'lucide-react'\nimport {\n Badge,\n Button,\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n ScrollArea,\n Switch,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\nimport { formatCount } from '../../lib/format'\nimport { ModalBreadcrumbHeader } from '../../settings/ModalBreadcrumbHeader'\n\n/** One field row of the bulk editor, resolved by the host from the selection and pending edits. */\nexport interface BulkTagRow {\n id: string\n /** Field pill (host-rendered). */\n badge: ReactNode\n type: 'checkbox' | 'select' | 'number' | 'text'\n /** Switch / select / input colour. */\n color: string\n options?: string[]\n /** AI instruction; a field that has one can be generated. */\n instruction?: string | null\n /** How many of the selected documents already have a value. */\n currentCount: number\n /** Some but not all selected documents have it. */\n isMixed: boolean\n /** Checkbox fields: resolved state after pending edits. */\n checkboxState: 'checked' | 'unchecked' | 'mixed'\n /** Select/number/text fields: pending value ('' when none or when clearing). */\n value: string\n /** The field is pending removal from all selected documents. */\n isClearing: boolean\n /** Tick box for AI generation. */\n isSelectedForGeneration: boolean\n hasPendingChange: boolean\n}\n\nexport interface BulkTagEditorLabels {\n /** \"Custom {entity}\" new-field button text. */\n newField: string\n empty: string\n /** Screen-reader description of the dialog. */\n description: string\n annotate: string\n selected: (count: number) => string\n haveValues: (current: number, total: number) => string\n enterValue: string\n clear: string\n aiInstruction: string\n selectForGeneration: string\n generateWithAi: string\n clearing: string\n cancel: string\n apply: string\n}\n\nexport const DEFAULT_BULK_TAG_EDITOR_LABELS: BulkTagEditorLabels = {\n newField: 'Custom Field',\n empty: 'Create a custom field to annotate your documents.',\n description: 'Set, clear or generate field values for the selected documents',\n annotate: 'Annotate',\n selected: (count) => `${count} selected`,\n haveValues: (current, total) => `${current}/${total} have values`,\n enterValue: 'Enter value...',\n clear: 'Clear',\n aiInstruction: 'AI Instruction',\n selectForGeneration: 'Select fields for AI generation',\n generateWithAi: 'Generate with AI',\n clearing: 'Clearing...',\n cancel: 'Cancel',\n apply: 'Apply',\n}\n\nexport interface BulkTagEditorTestIds {\n dialog: string\n selectAllAi: string\n generate: string\n newField: string\n cancel: string\n apply: string\n /** Replaces the whole `select-ai-<id>` id. */\n selectAi: (id: string) => string\n}\n\nexport interface BulkTagEditorDialogProps {\n open: boolean\n onClose: () => void\n /** Breadcrumb in the title (workspace / page); rendered before \"Annotate\". */\n breadcrumb?: ReactNode\n selectedCount: number\n rows: BulkTagRow[]\n labels?: Partial<BulkTagEditorLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<BulkTagEditorTestIds>\n onToggleCheckbox: (id: string) => void\n onChangeValue: (id: string, value: string) => void\n onToggleClear: (id: string) => void\n onToggleGeneration: (id: string) => void\n /** AI generation bar (all generatable fields). */\n generation?: {\n allSelected: boolean\n selectedCount: number\n isBusy: boolean\n isClearing: boolean\n onToggleAll: () => void\n onGenerate: () => void\n }\n /** Make a new field. Absent: not offered. */\n onNewField?: () => void\n onCancel: () => void\n onApply: () => void\n canApply: boolean\n}\n\nconst AI_CHECKBOX_CLASS =\n 'size-4 border-amber-400 data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500'\n\nfunction ClearButton({\n isClearing,\n label,\n onClick,\n}: {\n isClearing: boolean\n label: string\n onClick: () => void\n}) {\n return (\n <Button\n variant={isClearing ? 'default' : 'outline'}\n size=\"sm\"\n onClick={onClick}\n className={cn(\n 'h-8 px-2 text-sm pointer-coarse:h-11',\n isClearing\n ? 'bg-destructive text-destructive-foreground hover:bg-destructive/90'\n : 'border-red-border text-red-text hover:bg-red-bg hover:text-red-text'\n )}\n >\n {label}\n </Button>\n )\n}\n\nfunction BulkValueEditor({\n row,\n total,\n labels,\n onToggleCheckbox,\n onChangeValue,\n onToggleClear,\n}: {\n row: BulkTagRow\n total: number\n labels: BulkTagEditorLabels\n onToggleCheckbox: BulkTagEditorDialogProps['onToggleCheckbox']\n onChangeValue: BulkTagEditorDialogProps['onChangeValue']\n onToggleClear: BulkTagEditorDialogProps['onToggleClear']\n}) {\n const hasValues = row.currentCount > 0\n const placeholder = hasValues ? labels.haveValues(row.currentCount, total) : labels.enterValue\n const clear = hasValues && (\n <ClearButton\n isClearing={row.isClearing}\n label={labels.clear}\n onClick={() => onToggleClear(row.id)}\n />\n )\n\n if (row.type === 'checkbox') {\n const isOn = row.checkboxState !== 'unchecked'\n return (\n <div className=\"flex items-center\">\n <Switch\n checked={isOn}\n onCheckedChange={() => onToggleCheckbox(row.id)}\n style={{ backgroundColor: isOn ? row.color : undefined }}\n />\n {row.isMixed && !row.hasPendingChange && (\n <span className=\"ml-2 text-sm text-muted-foreground\">\n ({row.currentCount}/{total})\n </span>\n )}\n </div>\n )\n }\n\n if (row.type === 'select') {\n return (\n <div className=\"flex items-center gap-2\">\n <select\n value={row.value}\n onChange={(e) => onChangeValue(row.id, e.target.value)}\n disabled={row.isClearing}\n className={cn(\n 'flex-1 rounded-md border bg-background px-3 py-1.5 text-sm pointer-coarse:min-h-11',\n row.isClearing && 'opacity-50'\n )}\n >\n <option value=\"\">--</option>\n {(row.options ?? []).map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n {clear}\n </div>\n )\n }\n\n if (row.type === 'number') {\n return (\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"number\"\n value={row.value}\n onChange={(e) => onChangeValue(row.id, e.target.value)}\n placeholder={placeholder}\n disabled={row.isClearing}\n className={cn('h-8 flex-1 text-sm', row.isClearing && 'opacity-50')}\n />\n {clear}\n </div>\n )\n }\n\n return (\n <div className=\"flex items-start gap-2\">\n <Textarea\n value={row.value}\n onChange={(e) => onChangeValue(row.id, e.target.value)}\n placeholder={placeholder}\n disabled={row.isClearing}\n className={cn('min-h-[60px] flex-1 text-sm', row.isClearing && 'opacity-50')}\n />\n {clear}\n </div>\n )\n}\n\n/**\n * BulkTagEditorDialog: set, clear or AI-generate field values across the selected documents.\n * Presentational: the host resolves rows from the selection and owns apply / generate logic.\n */\nexport function BulkTagEditorDialog({\n open,\n onClose,\n breadcrumb,\n selectedCount,\n rows,\n labels: labelOverrides,\n testIds,\n onToggleCheckbox,\n onChangeValue,\n onToggleClear,\n onToggleGeneration,\n generation,\n onNewField,\n onCancel,\n onApply,\n canApply,\n}: BulkTagEditorDialogProps) {\n const labels = { ...DEFAULT_BULK_TAG_EDITOR_LABELS, ...labelOverrides }\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n presentation=\"sheet\"\n className=\"flex flex-col gap-0 overflow-hidden p-0 sm:max-w-modal\"\n data-testid={testIdOr(testIds?.dialog, { testId: 'bulk-doc-tag-editor' })}\n >\n <ModalBreadcrumbHeader\n className=\"mb-0 p-6 pb-3 pr-12\"\n title={labels.annotate}\n titleExtra={\n <Badge className=\"bg-accent px-2.5 py-0.5 text-accent-foreground hover:bg-accent\">\n <span className=\"font-semibold\">{labels.selected(selectedCount)}</span>\n </Badge>\n }\n subtitle={breadcrumb}\n description={labels.description}\n />\n\n {rows.length === 0 ? (\n <div className=\"px-4 py-12 text-center\">\n <p className=\"text-sm text-muted-foreground\">{labels.empty}</p>\n </div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain px-4 sm:max-h-[400px] sm:px-6\">\n <div className=\"space-y-4\">\n {rows.map((row) => {\n const hasInstruction = Boolean(row.instruction)\n return (\n <div\n key={row.id}\n data-slot=\"bulk-tag-row\"\n className=\"border-b border-border py-3 last:border-0\"\n >\n <div className=\"mb-2 flex items-center gap-3\">\n {hasInstruction ? (\n <Checkbox\n checked={row.isSelectedForGeneration}\n onCheckedChange={() => onToggleGeneration(row.id)}\n className={AI_CHECKBOX_CLASS}\n data-testid={testIdOr(testIds?.selectAi?.(row.id), {\n testId: `select-ai-${row.id}`,\n })}\n />\n ) : (\n <div className=\"w-4\" />\n )}\n {row.badge}\n {row.currentCount > 0 && (\n <span className=\"text-sm text-muted-foreground\">\n ({labels.haveValues(row.currentCount, selectedCount)})\n </span>\n )}\n </div>\n\n {hasInstruction && (\n <div className=\"mb-2 ml-7 rounded-md border border-yellow-border bg-yellow-bg p-2\">\n <div className=\"mb-1 flex items-center gap-1.5 text-sm font-medium text-yellow-text\">\n <Sparkles className=\"size-3.5\" />\n {labels.aiInstruction}\n </div>\n <p className=\"text-sm text-yellow-text\">{row.instruction}</p>\n </div>\n )}\n\n <div className=\"ml-7\">\n <BulkValueEditor\n row={row}\n total={selectedCount}\n labels={labels}\n onToggleCheckbox={onToggleCheckbox}\n onChangeValue={onChangeValue}\n onToggleClear={onToggleClear}\n />\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {generation && (\n <div className=\"shrink-0 border-t border-yellow-border bg-yellow-bg px-4 py-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex items-center gap-3\">\n <Checkbox\n checked={generation.allSelected}\n onCheckedChange={generation.onToggleAll}\n className={AI_CHECKBOX_CLASS}\n data-testid={testIdOr(testIds?.selectAllAi, { testId: 'select-all-ai' })}\n />\n <span className=\"text-sm font-medium text-yellow-text\">\n {labels.selectForGeneration}\n </span>\n {generation.selectedCount > 0 && (\n <ToneBadge tone=\"warning\">{labels.selected(generation.selectedCount)}</ToneBadge>\n )}\n </div>\n <Button\n onClick={generation.onGenerate}\n disabled={generation.selectedCount === 0 || generation.isBusy}\n className=\"gap-2 bg-amber-600 text-white hover:bg-amber-700\"\n data-testid={testIdOr(testIds?.generate, { testId: 'bulk-generate-ai-button' })}\n >\n {generation.isBusy ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Sparkles className=\"size-4\" />\n )}\n {generation.isClearing ? labels.clearing : labels.generateWithAi}\n </Button>\n </div>\n </div>\n )}\n\n <div className=\"flex shrink-0 flex-col gap-2 border-t px-4 py-3 sm:flex-row sm:justify-between sm:px-6 sm:py-4\">\n {onNewField ? (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onNewField}\n className=\"gap-2\"\n data-testid={testIdOr(testIds?.newField, {\n testId: 'bulk-tag-editor-new-field-button',\n })}\n >\n <Plus className=\"size-4\" />\n {labels.newField}\n </Button>\n ) : (\n <span />\n )}\n <div className=\"flex flex-col-reverse gap-2 sm:flex-row\">\n <Button\n variant=\"outline\"\n onClick={onCancel}\n data-testid={testIdOr(testIds?.cancel, { testId: 'bulk-tag-editor-cancel-button' })}\n >\n {labels.cancel}\n </Button>\n <Button\n onClick={onApply}\n disabled={!canApply}\n data-testid={testIdOr(testIds?.apply, { testId: 'bulk-tag-editor-apply-button' })}\n >\n {labels.apply}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\n/** Every fixed string of the replace dialog. Pass a partial `labels` to translate or reword. */\nexport interface BulkReplaceLabels {\n title: string\n description: (replaceCount: number, documentCount: number) => string\n hideDetails: string\n showDetails: string\n document: string\n replaceOn: (field: string, doc: string) => string\n currentValue: string\n selectedToReplace: (count: number) => string\n selectAll: string\n selectNone: string\n cancel: string\n generate: string\n}\n\nexport const DEFAULT_BULK_REPLACE_LABELS: BulkReplaceLabels = {\n title: 'Replace existing values?',\n description: (replaceCount, documentCount) =>\n `${formatCount(replaceCount, { one: 'existing value', other: 'existing values' })} will be replaced by AI-generated content across ${formatCount(documentCount, { one: 'document', other: 'documents' })}.`,\n hideDetails: 'Hide details',\n showDetails: 'Show details',\n document: 'Document',\n replaceOn: (field, doc) => `Replace ${field} on ${doc}`,\n currentValue: 'Current value:',\n selectedToReplace: (count) =>\n `${formatCount(count, { one: 'value', other: 'values' })} selected to replace`,\n selectAll: 'Select all',\n selectNone: 'Select none',\n cancel: 'Cancel',\n generate: 'Generate',\n}\n\n/** A selected document and, per generating field, its existing value (undefined = empty). */\nexport interface BulkReplaceDocRow {\n id: string\n title: string\n /** fieldId -> existing value preview; absent key = nothing to replace. */\n existing: Record<string, string>\n}\n\nexport interface BulkReplaceDialogProps {\n open: boolean\n onClose: () => void\n /** Number of existing values that will be replaced. */\n replaceCount: number\n documentCount: number\n fields: Array<{ id: string; name: string }>\n docs: BulkReplaceDocRow[]\n /** Set of `${docId}:${fieldId}` pairs ticked for replacement. */\n selectedPairs: Set<string>\n showDetails: boolean\n onToggleDetails: () => void\n onTogglePair: (docId: string, fieldId: string) => void\n onSelectAll: () => void\n onSelectNone: () => void\n isBusy: boolean\n isClearing: boolean\n onConfirm: () => void\n labels?: Partial<BulkReplaceLabels>\n}\n\n/** \"Replace existing values?\" dialog with a collapsible document x field matrix. */\nexport function BulkReplaceDialog({\n open,\n onClose,\n replaceCount,\n documentCount,\n fields,\n docs,\n selectedPairs,\n showDetails,\n onToggleDetails,\n onTogglePair,\n onSelectAll,\n onSelectNone,\n isBusy,\n onConfirm,\n isClearing,\n labels,\n}: BulkReplaceDialogProps) {\n const l = { ...DEFAULT_BULK_REPLACE_LABELS, ...labels }\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent presentation=\"sheet\" className=\"sm:max-w-modal\">\n <DialogHeader>\n <DialogTitle>{l.title}</DialogTitle>\n <DialogDescription>{l.description(replaceCount, documentCount)}</DialogDescription>\n </DialogHeader>\n\n <button\n type=\"button\"\n onClick={onToggleDetails}\n aria-expanded={showDetails}\n className=\"flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground pointer-coarse:min-h-11\"\n >\n {showDetails ? <ChevronDown className=\"size-4\" /> : <ChevronRight className=\"size-4\" />}\n {showDetails ? l.hideDetails : l.showDetails}\n </button>\n\n {showDetails && (\n <>\n <TooltipProvider>\n <ScrollArea className=\"max-h-[280px] rounded-md border\">\n <table className=\"w-full text-sm\">\n <thead className=\"sticky top-0 z-10 bg-muted\">\n <tr>\n <th className=\"border-b p-2 text-left font-medium\">{l.document}</th>\n {fields.map((field) => (\n <th\n key={field.id}\n className=\"min-w-[80px] border-b p-2 text-center font-medium\"\n >\n {field.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {docs.map((doc) => (\n <tr key={doc.id} className=\"border-b last:border-0\">\n <td className=\"max-w-[200px] truncate p-2 font-medium\" title={doc.title}>\n {doc.title}\n </td>\n {fields.map((field) => {\n const preview = doc.existing[field.id]\n if (preview === undefined) {\n return (\n <td key={field.id} className=\"p-2 text-center\">\n <span className=\"text-lg text-muted-foreground\">+</span>\n </td>\n )\n }\n const isSelected = selectedPairs.has(`${doc.id}:${field.id}`)\n return (\n <td key={field.id} className=\"p-2 text-center\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"inline-flex\">\n <Checkbox\n checked={isSelected}\n onCheckedChange={() => onTogglePair(doc.id, field.id)}\n aria-label={l.replaceOn(field.name, doc.title)}\n className={cn(\n 'size-5',\n isSelected &&\n 'border-destructive data-[state=checked]:border-destructive data-[state=checked]:bg-destructive'\n )}\n />\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-[300px]\">\n <div className=\"text-sm\">\n <div className=\"mb-1 font-medium\">{l.currentValue}</div>\n <div className=\"text-muted-foreground\">{preview}</div>\n </div>\n </TooltipContent>\n </Tooltip>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </ScrollArea>\n </TooltipProvider>\n\n <div className=\"flex items-center justify-between text-sm text-muted-foreground\">\n <span>{l.selectedToReplace(selectedPairs.size)}</span>\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onSelectAll}>\n {l.selectAll}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={onSelectNone}>\n {l.selectNone}\n </Button>\n </div>\n </div>\n </>\n )}\n\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 border-t pt-2\">\n <Button variant=\"ghost\" onClick={onClose}>\n {l.cancel}\n </Button>\n <Button\n onClick={onConfirm}\n disabled={isBusy}\n className=\"bg-amber-600 text-white hover:bg-amber-700\"\n >\n {isClearing ? (\n <Loader2 className=\"mr-2 size-4 animate-spin\" />\n ) : (\n <Sparkles className=\"mr-2 size-4\" />\n )}\n {l.generate}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Check, CheckIcon, ChevronDown, Columns3, Save, Trash2, Undo2 } from 'lucide-react'\nimport {\n Button,\n Command,\n CommandGroup,\n CommandItem,\n CommandList,\n CommandSeparator,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the view menu. Pass a partial `labels` to translate or reword. */\nexport interface ViewSelectorLabels {\n trigger: string\n savePlaceholder: string\n save: string\n viewName: (name: string) => string\n deleteView: string\n deleteNamedView: (name: string) => string\n allFields: (count: number) => string\n}\n\nexport const DEFAULT_VIEW_SELECTOR_LABELS: ViewSelectorLabels = {\n trigger: 'Fields',\n savePlaceholder: 'My view...',\n save: 'Save',\n viewName: (name) => `${name} View`,\n deleteView: 'Delete view',\n deleteNamedView: (name) => `Delete view ${name}`,\n allFields: (count) => `All Fields (${count})`,\n}\n\nexport interface ViewSelectorTestIds {\n trigger: string\n saveNameInput: string\n saveButton: string\n currentView: string\n activeCheck: string\n deleteCurrent: string\n defaultItem: string\n /** Replaces the whole `view-selector-view-item-<name>` id. */\n viewItem: (name: string) => string\n /** Replaces the whole `view-selector-column-toggle-<colId>` id. */\n columnToggle: (colId: string) => string\n}\n\nexport interface ViewBuiltinItem {\n key: string\n label: string\n icon: LucideIcon\n /** Defaults to `view-selector-builtin-item-${key}`. */\n testId?: string\n}\n\nexport interface ViewColumnItem {\n colId: string\n label: string\n hidden: boolean\n}\n\nexport interface ViewSelectorMenuProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Key of a built-in, the name of a saved view, or `'unsaved'`. */\n currentView: string\n builtins: ViewBuiltinItem[]\n /** Saved view names (the current one is listed in the header, not here). */\n savedViewNames: string[]\n columns: ViewColumnItem[]\n saveName: string\n onSaveNameChange: (value: string) => void\n onSave: () => void\n isSaving?: boolean\n onSelectView: (key: string) => void\n onDeleteView: (name: string) => void\n onToggleColumn: (colId: string) => void\n /** Trigger caption (wins over `labels.trigger`); fixed so the width never jumps as views change. */\n triggerLabel?: string\n className?: string\n labels?: Partial<ViewSelectorLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<ViewSelectorTestIds>\n}\n\nconst DELETE_BUTTON =\n 'flex size-5 shrink-0 items-center justify-center rounded p-0 text-destructive/50 hover:bg-destructive/10 hover:text-destructive pointer-coarse:size-9'\n\n/**\n * Saved-views / column-visibility popover. Presentational: the app computes which view is\n * active and handles load/save/delete/toggle.\n */\nexport function ViewSelectorMenu({\n open,\n onOpenChange,\n currentView,\n builtins,\n savedViewNames,\n columns,\n saveName,\n onSaveNameChange,\n onSave,\n isSaving,\n onSelectView,\n onDeleteView,\n onToggleColumn,\n triggerLabel,\n className,\n labels,\n testIds,\n}: ViewSelectorMenuProps): ReactNode {\n const l = { ...DEFAULT_VIEW_SELECTOR_LABELS, ...labels }\n const activeCheckId = testIdOr(testIds?.activeCheck, { testId: 'view-selector-active-check' })\n const activeBuiltin = builtins.some((b) => b.key === currentView)\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n data-slot=\"view-selector-trigger\"\n className={cn(\n 'h-7 gap-1.5 px-2 text-sm font-normal text-muted-foreground hover:text-foreground pointer-coarse:h-11',\n className\n )}\n data-testid={testIdOr(testIds?.trigger, { testId: 'view-selector-trigger' })}\n >\n <Columns3 className=\"size-3.5\" />\n {triggerLabel ?? l.trigger}\n <ChevronDown className=\"size-3\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n data-slot=\"view-selector-menu\"\n className=\"w-[240px] overflow-x-hidden p-0\"\n align=\"end\"\n side=\"bottom\"\n sideOffset={4}\n >\n <Command shouldFilter={false}>\n <CommandList className=\"max-h-[60dvh]\">\n {!activeBuiltin && (\n <CommandGroup>\n {currentView === 'unsaved' ? (\n <div className=\"flex min-h-[32px] items-center gap-1.5 px-2 py-1\">\n <Save className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <Input\n value={saveName}\n onChange={(e) => onSaveNameChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSave()\n }}\n placeholder={l.savePlaceholder}\n className=\"h-7 flex-1 text-sm\"\n autoFocus\n data-testid={testIdOr(testIds?.saveNameInput, {\n testId: 'view-selector-save-name-input',\n })}\n />\n <Button\n variant=\"default\"\n size=\"sm\"\n className=\"h-6 px-2 text-sm pointer-coarse:h-9\"\n onClick={onSave}\n disabled={!saveName.trim() || isSaving}\n data-testid={testIdOr(testIds?.saveButton, {\n testId: 'view-selector-save-button',\n })}\n >\n {l.save}\n </Button>\n </div>\n ) : (\n <CommandItem\n onSelect={() => {}}\n data-testid={testIdOr(testIds?.currentView, {\n testId: 'view-selector-current-view',\n })}\n >\n <Save className=\"mr-2 size-3.5 shrink-0\" />\n <span className=\"flex-1 truncate\">{l.viewName(currentView)}</span>\n <Check className=\"size-3.5 shrink-0 text-primary\" data-testid={activeCheckId} />\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onDeleteView(currentView)\n }}\n className={cn(DELETE_BUTTON, 'ml-1')}\n title={l.deleteView}\n aria-label={l.deleteView}\n data-testid={testIdOr(testIds?.deleteCurrent, {\n testId: 'view-selector-delete-current-button',\n })}\n >\n <Trash2 className=\"size-3\" />\n </button>\n </CommandItem>\n )}\n </CommandGroup>\n )}\n\n {!activeBuiltin && <CommandSeparator />}\n\n <CommandGroup>\n {builtins.map((builtin) => (\n <CommandItem\n key={builtin.key}\n disabled={builtin.key === currentView}\n onSelect={() => onSelectView(builtin.key)}\n className={builtin.key === currentView ? 'opacity-100' : 'cursor-pointer'}\n data-testid={\n builtin.testId ??\n (builtin.key === 'default'\n ? testIdOr(testIds?.defaultItem, { testId: 'view-selector-default-item' })\n : `view-selector-builtin-item-${builtin.key}`)\n }\n >\n <builtin.icon className=\"mr-2 size-3.5 shrink-0\" />\n <span className=\"flex-1\">{builtin.label}</span>\n {builtin.key === currentView ? (\n <Check className=\"size-3.5 shrink-0 text-primary\" data-testid={activeCheckId} />\n ) : (\n <Undo2 className=\"size-3.5 shrink-0 text-muted-foreground/60\" />\n )}\n </CommandItem>\n ))}\n\n {savedViewNames\n .filter((name) => name !== currentView)\n .map((name) => (\n <CommandItem\n key={name}\n onSelect={() => onSelectView(name)}\n className=\"cursor-pointer\"\n data-testid={testIdOr(testIds?.viewItem?.(name), {\n testId: `view-selector-view-item-${name}`,\n })}\n >\n <Save className=\"mr-2 size-3.5 shrink-0\" />\n <span className=\"flex-1 truncate\">{l.viewName(name)}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onDeleteView(name)\n }}\n className={DELETE_BUTTON}\n aria-label={l.deleteNamedView(name)}\n >\n <Trash2 className=\"size-3\" />\n </button>\n </CommandItem>\n ))}\n </CommandGroup>\n\n {columns.length > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup heading={l.allFields(columns.length)}>\n {columns.map((col) => (\n <CommandItem\n key={col.colId}\n onSelect={() => onToggleColumn(col.colId)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer\"\n data-testid={testIdOr(testIds?.columnToggle?.(col.colId), {\n testId: `view-selector-column-toggle-${col.colId}`,\n })}\n >\n <div\n className={cn(\n 'mr-2 flex size-4 shrink-0 items-center justify-center rounded-sm border border-primary',\n col.hidden\n ? 'opacity-50 [&_svg]:invisible'\n : 'bg-primary text-primary-foreground'\n )}\n >\n <CheckIcon className=\"size-3\" />\n </div>\n <span\n className={cn(\n 'flex-1 truncate text-sm',\n col.hidden && 'text-muted-foreground'\n )}\n >\n {col.label}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport {\n ArrowUpDown,\n ChevronDown,\n FolderUp,\n PencilLine,\n Plus,\n Search,\n Sparkles,\n Tags,\n Trash2,\n X,\n} from 'lucide-react'\nimport {\n Button,\n Checkbox,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n getTagTypeIcon,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the fields editor parts. Pass a partial `labels` to translate or reword. */\nexport interface FieldsEditorLabels {\n newItem: (singular: string) => string\n find: (singular: string) => string\n filter: (plural: string) => string\n clearFilter: string\n sort: (plural: string) => string\n sortNameAsc: string\n sortNameDesc: string\n sortNewest: string\n sortOldest: string\n select: string\n selectNamed: (name: string) => string\n selectNounNamed: (noun: string, name: string) => string\n selectsThisOnly: string\n renameNamed: (kind: string, name: string) => string\n rename: string\n nested: (count: number) => string\n hasInstruction: string\n collapse: (name: string) => string\n edit: (name: string) => string\n exportAria: string\n}\n\nexport const DEFAULT_FIELDS_EDITOR_LABELS: FieldsEditorLabels = {\n newItem: (singular) => `New ${singular}`,\n find: (singular) => `Find ${singular}…`,\n filter: (plural) => `Filter ${plural}`,\n clearFilter: 'Clear filter',\n sort: (plural) => `Sort ${plural}`,\n sortNameAsc: 'Name A–Z',\n sortNameDesc: 'Name Z–A',\n sortNewest: 'Newest first',\n sortOldest: 'Oldest first',\n select: 'Select',\n selectNamed: (name) => `Select ${name}`,\n selectNounNamed: (noun, name) => `Select ${noun} ${name}`,\n selectsThisOnly: 'Selects this field only — nested fields are selected separately',\n renameNamed: (kind, name) => `Rename ${kind} ${name}`,\n rename: 'Rename',\n nested: (count) => `${count} nested`,\n hasInstruction: 'Has an AI instruction',\n collapse: (name) => `Collapse ${name}`,\n edit: (name) => `Edit ${name}`,\n exportAria: 'Export fields to another workspace',\n}\n\nexport interface FieldsEditorToolbarTestIds {\n newButton: string\n createForm: string\n filterInput: string\n filterClear: string\n sortSelect: string\n}\n\nexport interface FieldRowTestIds {\n /** Replaces the whole `field-row-<tagId>` id. */\n row: (tagId: string) => string\n /** Replaces the whole `tag-row-icon-<tagId>` id. */\n icon: (tagId: string) => string\n /** Replaces the whole `label-rename-input-<tagId>` id. */\n renameInput: (tagId: string) => string\n /** Replaces the whole `label-rename-<tagId>` id (the `-text` sibling follows it). */\n rename: (tagId: string) => string\n /** Replaces the whole `apply-field-checkbox-<tagId>` id. */\n checkbox: (tagId: string) => string\n /** Replaces the whole `field-nested-count-<tagId>` id. */\n nestedCount: (tagId: string) => string\n}\n\nexport interface FieldsApplyBarTestIds {\n apply: string\n clear: string\n delete: string\n export: string\n}\n\n// ── Root / list scaffolding ─────────────────────────────────────────────────────────────────\n\n/** Fields editor column: a fixed toolbar, a scrolling list and a pinned apply bar. */\nexport function FieldsEditorRoot({\n testId,\n className,\n ...props\n}: ComponentProps<'div'> & {\n /** Overrides the root test id (default `view-editor`). */\n testId?: string\n}) {\n return (\n <div\n data-slot=\"fields-editor\"\n className={cn('flex h-full min-h-0 flex-col overflow-hidden', className)}\n {...props}\n data-testid={testIdOr(testId, { testId: 'view-editor' })}\n />\n )\n}\n\n/** The scrolling list region. */\nexport function FieldsEditorList({ className, children, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"fields-editor-list\"\n className={cn('min-h-0 flex-1 overflow-y-auto p-2 [scrollbar-gutter:stable]', className)}\n {...props}\n >\n <div className=\"space-y-1 pb-4\">{children}</div>\n </div>\n )\n}\n\nexport function FieldsEmptyState({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"fields-empty\"\n className={cn('py-8 text-center text-sm text-muted-foreground', className)}\n {...props}\n />\n )\n}\n\n// ── Toolbar: New / inline create form / filter / sort ───────────────────────────────────────\n\nexport type FieldsSortKey = 'name-asc' | 'name-desc' | 'created-desc' | 'created-asc'\n\nfunction sortOptions(l: FieldsEditorLabels): { value: FieldsSortKey; label: string }[] {\n return [\n { value: 'name-asc', label: l.sortNameAsc },\n { value: 'name-desc', label: l.sortNameDesc },\n { value: 'created-desc', label: l.sortNewest },\n { value: 'created-asc', label: l.sortOldest },\n ]\n}\n\nexport interface FieldsEditorToolbarProps {\n /** Singular / plural nouns used in copy and aria labels (\"label\", \"labels\"). */\n nouns: { singular: string; plural: string }\n /** Omit to hide the New button (read-only host). */\n onNew?: () => void\n isCreating: boolean\n /** The create form stays mounted for the collapse animation; `open` drives the height. */\n createForm?: { mounted: boolean; open: boolean; children: ReactNode }\n filterText: string\n onFilterTextChange: (value: string) => void\n sortBy: FieldsSortKey\n onSortByChange: (value: FieldsSortKey) => void\n className?: string\n labels?: Partial<FieldsEditorLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<FieldsEditorToolbarTestIds>\n}\n\n/** New button (leads the list), inline create form, quick filter and sort. */\nexport function FieldsEditorToolbar({\n nouns,\n onNew,\n isCreating,\n createForm,\n filterText,\n onFilterTextChange,\n sortBy,\n onSortByChange,\n className,\n labels,\n testIds,\n}: FieldsEditorToolbarProps) {\n const l = { ...DEFAULT_FIELDS_EDITOR_LABELS, ...labels }\n return (\n <div\n data-slot=\"fields-editor-toolbar\"\n className={cn('shrink-0 space-y-1 border-b border-border/60 p-2 pb-1.5', className)}\n >\n {onNew && (\n <div className=\"flex items-center gap-1.5\">\n {/* Stays put (disabled) while its form is open so the filter row never jumps. */}\n <button\n type=\"button\"\n disabled={isCreating}\n onClick={onNew}\n className=\"flex min-w-0 flex-1 items-center gap-1.5 rounded-md border border-dashed border-border px-2 py-1.5 text-sm text-muted-foreground hover:border-primary/40 hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-default disabled:opacity-50 disabled:hover:border-border disabled:hover:bg-transparent pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.newButton, {\n testId: 'fields-manager-new-field-button',\n })}\n >\n <Plus className=\"size-4\" />\n {l.newItem(nouns.singular)}\n </button>\n </div>\n )}\n {createForm?.mounted && onNew && (\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-200 ease-out',\n createForm.open ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n data-testid={testIdOr(testIds?.createForm, { testId: 'fields-create-form' })}\n data-state={createForm.open ? 'open' : 'closed'}\n >\n <div className=\"min-h-0 overflow-hidden\">\n <div className=\"rounded-md border border-primary/40 bg-primary/5\">\n {createForm.children}\n </div>\n </div>\n </div>\n )}\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative min-w-0 flex-1\">\n <Search className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={filterText}\n onChange={(e) => onFilterTextChange(e.target.value)}\n placeholder={l.find(nouns.singular)}\n className=\"h-8 pl-7 pr-6 text-sm pointer-coarse:h-11\"\n aria-label={l.filter(nouns.plural)}\n data-testid={testIdOr(testIds?.filterInput, { testId: 'fields-filter-input' })}\n />\n {filterText && (\n <button\n type=\"button\"\n onClick={() => onFilterTextChange('')}\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-muted-foreground hover:text-foreground\"\n aria-label={l.clearFilter}\n data-testid={testIdOr(testIds?.filterClear, { testId: 'fields-filter-clear' })}\n >\n <X className=\"size-3\" />\n </button>\n )}\n </div>\n <Select value={sortBy} onValueChange={(v) => onSortByChange(v as FieldsSortKey)}>\n <SelectTrigger\n className=\"h-8 w-[150px] shrink-0 text-sm pointer-coarse:h-11\"\n aria-label={l.sort(nouns.plural)}\n data-testid={testIdOr(testIds?.sortSelect, { testId: 'fields-sort-select' })}\n >\n <ArrowUpDown className=\"mr-1.5 size-3.5 text-muted-foreground\" />\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {sortOptions(l).map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n )\n}\n\n// ── Row ─────────────────────────────────────────────────────────────────────────────────────\n\nexport interface FieldRenameState {\n value: string\n onChange: (value: string) => void\n onCommit: () => void\n onCancel: () => void\n}\n\nexport interface FieldRowProps {\n tagId: string\n name: string\n /** Label rows are a bare name; annotation (and untyped) rows expand into an edit form. */\n kind?: 'label' | 'annotation'\n /** API tag type (`text`, `checkbox`, ...): picks the glyph for non-label rows. */\n tagType?: string | null\n /** Solid colour behind the glyph. */\n iconColor: string\n /** Nesting depth (already clamped by the caller). Indents 20px per step. */\n depth: number\n nestedCount?: number\n selected: boolean\n onSelectedChange: () => void\n usageLabel: string\n /** The shared/private toggle (app-owned). */\n sharedToggle: ReactNode\n hasInstruction?: boolean\n /** Starts an in-place rename; omit when renaming is not allowed. */\n onRename?: () => void\n renaming?: FieldRenameState | null\n /** Annotation rows: omit for a non-editable row. */\n onToggleEditing?: () => void\n isEditing?: boolean\n /** Inline edit form, rendered under the row while `isEditing`. */\n editForm?: ReactNode\n className?: string\n labels?: Partial<FieldsEditorLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<FieldRowTestIds>\n}\n\n/** One field row: select box, glyph, name (rename in place), usage, share toggle, chevron. */\nexport function FieldRow({\n tagId,\n name,\n kind,\n tagType,\n iconColor,\n depth,\n nestedCount = 0,\n selected,\n onSelectedChange,\n usageLabel,\n sharedToggle,\n hasInstruction,\n onRename,\n renaming,\n onToggleEditing,\n isEditing,\n editForm,\n className,\n labels,\n testIds,\n}: FieldRowProps) {\n const l = { ...DEFAULT_FIELDS_EDITOR_LABELS, ...labels }\n const isLabel = kind === 'label'\n const noun = isLabel ? 'label' : 'field'\n const Icon = isLabel ? Tags : getTagTypeIcon(tagType)\n const renameLabel = l.renameNamed(isLabel ? 'label' : (kind ?? 'field'), name)\n const renameTestId = testIds?.rename?.(tagId) ?? `label-rename-${tagId}`\n\n const renameInput = renaming && (\n <Input\n autoFocus\n value={renaming.value}\n onChange={(e) => renaming.onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n renaming.onCommit()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n renaming.onCancel()\n }\n }}\n onBlur={renaming.onCommit}\n className=\"h-7 w-full min-w-0 flex-1 bg-card text-sm\"\n data-testid={testIdOr(testIds?.renameInput?.(tagId), {\n testId: `label-rename-input-${tagId}`,\n })}\n aria-label={renameLabel}\n />\n )\n\n const nameCell = (\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onSelectedChange()\n }}\n className=\"inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md p-1 text-white focus-visible:ring-2 focus-visible:ring-ring\"\n style={{ backgroundColor: iconColor }}\n data-testid={testIdOr(testIds?.icon?.(tagId), { testId: `tag-row-icon-${tagId}` })}\n aria-label={l.selectNamed(name)}\n title={l.select}\n >\n <Icon size={14} className=\"shrink-0\" />\n </button>\n {renaming ? (\n <div className=\"min-w-0 flex-1\" onClick={(e) => e.stopPropagation()}>\n {renameInput}\n </div>\n ) : onRename ? (\n <>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onRename()\n }}\n className=\"min-w-0 truncate rounded text-left text-sm font-medium decoration-muted-foreground/60 underline-offset-2 hover:underline\"\n title={name}\n aria-label={renameLabel}\n data-testid={`${renameTestId}-text`}\n >\n {name}\n </button>\n {/* Always visible: a hover-only pencil would be unreachable on touch. */}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onRename()\n }}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground/70 hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:p-2.5\"\n data-testid={renameTestId}\n aria-label={renameLabel}\n title={l.rename}\n >\n <PencilLine className=\"size-3.5\" />\n </button>\n </>\n ) : (\n <span className=\"truncate text-sm font-medium\" title={name}>\n {name}\n </span>\n )}\n </span>\n )\n\n const checkbox = (\n <Checkbox\n checked={selected}\n onCheckedChange={onSelectedChange}\n data-testid={testIdOr(testIds?.checkbox?.(tagId), {\n testId: `apply-field-checkbox-${tagId}`,\n })}\n aria-label={l.selectNounNamed(noun, name)}\n title={!isLabel && nestedCount > 0 ? l.selectsThisOnly : undefined}\n className=\"size-5\"\n />\n )\n\n const usage = (\n <span className=\"min-w-[56px] shrink-0 text-right text-sm text-muted-foreground\">\n {usageLabel}\n </span>\n )\n\n const rowClass = cn(\n 'rounded-md border',\n !isLabel && isEditing ? 'border-primary/40 bg-primary/5' : 'border-border',\n className\n )\n const indent = { marginLeft: depth * 20 }\n\n if (isLabel) {\n return (\n <div\n style={indent}\n data-slot=\"field-row\"\n data-testid={testIdOr(testIds?.row?.(tagId), { testId: `field-row-${tagId}` })}\n data-field-depth={depth}\n className={rowClass}\n >\n <div className=\"flex items-center gap-1.5 px-2 py-1.5 transition-colors hover:bg-muted/50 pointer-coarse:min-h-11\">\n <div className=\"shrink-0\">{checkbox}</div>\n {nameCell}\n {usage}\n <div className=\"shrink-0\">{sharedToggle}</div>\n </div>\n </div>\n )\n }\n\n return (\n <div\n style={indent}\n data-slot=\"field-row\"\n data-testid={testIdOr(testIds?.row?.(tagId), { testId: `field-row-${tagId}` })}\n data-field-depth={depth}\n className={rowClass}\n >\n <div\n className={cn(\n 'flex items-center gap-1.5 px-2 py-1.5 transition-colors hover:bg-muted/50 pointer-coarse:min-h-11',\n onToggleEditing && 'cursor-pointer'\n )}\n onClick={onToggleEditing}\n >\n {/* Checking a parent selects only the parent: applying an AI field costs a generation\n run per document, so nested fields are an explicit choice. */}\n <div className=\"shrink-0\" onClick={(e) => e.stopPropagation()}>\n {checkbox}\n </div>\n {nameCell}\n {nestedCount > 0 && (\n <span\n className=\"shrink-0 text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.nestedCount?.(tagId), {\n testId: `field-nested-count-${tagId}`,\n })}\n >\n {l.nested(nestedCount)}\n </span>\n )}\n {usage}\n <div className=\"shrink-0\" onClick={(e) => e.stopPropagation()}>\n {sharedToggle}\n </div>\n {/* Always reserved so the chevron column stays aligned on rows without an instruction. */}\n <span\n className=\"flex h-5 w-3.5 shrink-0 items-center justify-center\"\n title={hasInstruction ? l.hasInstruction : undefined}\n >\n {hasInstruction ? <Sparkles className=\"size-3.5 text-yellow-text\" /> : null}\n </span>\n {onToggleEditing && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onToggleEditing()\n }}\n className=\"shrink-0 rounded p-0.5 hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:p-2.5\"\n aria-label={isEditing ? l.collapse(name) : l.edit(name)}\n aria-expanded={!!isEditing}\n >\n <ChevronDown\n className={cn(\n 'size-3.5 text-muted-foreground transition-transform',\n isEditing && 'rotate-180'\n )}\n />\n </button>\n )}\n </div>\n {isEditing && editForm && <div className=\"border-t border-primary/20\">{editForm}</div>}\n </div>\n )\n}\n\n// ── Apply bar ───────────────────────────────────────────────────────────────────────────────\n\nexport interface FieldsApplyBarProps {\n /** Shown above the buttons, e.g. \"Select documents in the table to apply these labels.\" */\n hint?: ReactNode\n applyLabel: string\n applyTitle: string\n canApply: boolean\n onApply: () => void\n clearLabel: string\n clearTitle: string\n canClear: boolean\n onClear: () => void\n /** Omit to hide the delete button. */\n onDelete?: () => void\n canDelete?: boolean\n deleteTitle?: string\n exportTitle: string\n canExport: boolean\n onExport: () => void\n className?: string\n labels?: Partial<FieldsEditorLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<FieldsApplyBarTestIds>\n}\n\n/** Pinned bar: Add / Remove (to the target), delete checked, export checked. */\nexport function FieldsApplyBar({\n hint,\n applyLabel,\n applyTitle,\n canApply,\n onApply,\n clearLabel,\n clearTitle,\n canClear,\n onClear,\n onDelete,\n canDelete,\n deleteTitle,\n exportTitle,\n canExport,\n onExport,\n className,\n labels,\n testIds,\n}: FieldsApplyBarProps) {\n const l = { ...DEFAULT_FIELDS_EDITOR_LABELS, ...labels }\n return (\n <div\n data-slot=\"fields-apply-bar\"\n className={cn('shrink-0 space-y-1.5 border-t bg-background p-2', className)}\n >\n {hint && <p className=\"text-center text-xs text-muted-foreground\">{hint}</p>}\n <div className=\"flex gap-1.5\">\n <Button\n className=\"min-w-0 flex-1 truncate pointer-coarse:h-11\"\n size=\"sm\"\n disabled={!canApply}\n onClick={onApply}\n data-testid={testIdOr(testIds?.apply, { testId: 'custom-fields-apply-button' })}\n title={applyTitle}\n >\n <span className=\"truncate\">{applyLabel}</span>\n </Button>\n <Button\n variant=\"outline\"\n className=\"min-w-0 flex-1 truncate pointer-coarse:h-11\"\n size=\"sm\"\n disabled={!canClear}\n onClick={onClear}\n data-testid={testIdOr(testIds?.clear, { testId: 'custom-fields-clear-button' })}\n title={clearTitle}\n >\n <span className=\"truncate\">{clearLabel}</span>\n </Button>\n {onDelete && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"shrink-0 px-2 text-destructive hover:text-destructive pointer-coarse:size-11\"\n disabled={!canDelete}\n onClick={onDelete}\n data-testid={testIdOr(testIds?.delete, { testId: 'custom-fields-delete-button' })}\n title={deleteTitle}\n aria-label={deleteTitle}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"shrink-0 px-2 pointer-coarse:size-11\"\n disabled={!canExport}\n onClick={onExport}\n data-testid={testIdOr(testIds?.export, { testId: 'export-fields-button' })}\n title={exportTitle}\n aria-label={l.exportAria}\n >\n <FolderUp className=\"size-4\" />\n </Button>\n </div>\n </div>\n )\n}\n","import type { FieldsSortKey } from './FieldsEditorParts'\n\nexport interface SortableField {\n name: string\n created_at?: string | null\n}\n\n/** Quick name filter: a plain case-insensitive substring match. */\nexport function filterFieldsByName<T extends SortableField>(fields: T[], query: string): T[] {\n const q = query.trim().toLowerCase()\n return q ? fields.filter((f) => f.name.toLowerCase().includes(q)) : fields\n}\n\n/** Sort by name or creation time (returns a new array). */\nexport function sortFields<T extends SortableField>(fields: T[], sortBy: FieldsSortKey): T[] {\n const byName = (a: T, b: T) => a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })\n const byCreated = (a: T, b: T) => Date.parse(a.created_at ?? '') - Date.parse(b.created_at ?? '')\n const sorted = [...fields]\n switch (sortBy) {\n case 'name-asc':\n return sorted.sort(byName)\n case 'name-desc':\n return sorted.sort((a, b) => byName(b, a))\n case 'created-desc':\n return sorted.sort((a, b) => byCreated(b, a))\n case 'created-asc':\n return sorted.sort(byCreated)\n }\n}\n\nexport interface Noun {\n singular: string\n plural: string\n}\n\nconst pick = (n: number, noun: Noun) => (n === 1 ? noun.singular : noun.plural)\n\nexport interface FieldsApplyBarCopyInput {\n /** What the fields are called (field / label / annotation). */\n nouns: Noun\n /** What Apply and Clear act on (document / fact ...). */\n targetNoun: Noun\n fieldCount: number\n targetCount: number\n /** Acting on the single document under review rather than a selection. */\n isReviewMode: boolean\n isApplying: boolean\n isClearing: boolean\n}\n\nexport interface FieldsApplyBarCopy {\n applyLabel: string\n applyTitle: string\n clearLabel: string\n clearTitle: string\n deleteTitle: string\n exportTitle: string\n /** Shown while fields are ticked but nothing is selected to apply them to. */\n hint: string | undefined\n}\n\n/** Every label and tooltip of the apply bar, derived from what is ticked and what is targeted. */\nexport function fieldsApplyBarCopy(i: FieldsApplyBarCopyInput): FieldsApplyBarCopy {\n const { nouns, targetNoun, fieldCount, targetCount, isReviewMode } = i\n const targetWords = `${targetCount} ${pick(targetCount, targetNoun)}`\n const docWords = `${targetCount} ${targetCount === 1 ? 'document' : 'documents'}`\n\n const applyLabel = i.isApplying\n ? 'Adding…'\n : targetCount === 0\n ? 'Add'\n : isReviewMode\n ? 'Add to this document'\n : `Add to ${targetWords}`\n const applyTitle =\n targetCount === 0\n ? `Apply ${nouns.plural}`\n : isReviewMode\n ? `Apply ${nouns.plural} to this document`\n : `Apply ${nouns.plural} to ${docWords}`\n const clearLabel = i.isClearing\n ? 'Removing…'\n : targetCount === 0\n ? 'Remove'\n : isReviewMode\n ? 'Remove from this document'\n : `Remove from ${targetWords}`\n const clearTitle =\n targetCount === 0\n ? `Clear ${nouns.plural}`\n : isReviewMode\n ? `Clear ${nouns.plural} from this document`\n : `Clear ${nouns.plural} from ${docWords}`\n\n return {\n applyLabel,\n applyTitle,\n clearLabel,\n clearTitle,\n deleteTitle:\n fieldCount === 0\n ? `Delete ${nouns.plural}`\n : `Delete ${fieldCount} ${pick(fieldCount, nouns)}`,\n exportTitle:\n fieldCount === 0\n ? 'Export fields to another workspace'\n : `Export ${fieldCount} ${fieldCount === 1 ? 'field' : 'fields'} to another workspace`,\n hint:\n fieldCount > 0 && targetCount === 0\n ? `Select ${targetNoun.plural} in the table to apply these ${nouns.plural}.`\n : undefined,\n }\n}\n\n/** Empty-list copy: a filter with no match, a kind-specific list, or the generic custom fields. */\nexport function fieldsEmptyText(i: { nouns: Noun; filterText: string; hasKind: boolean }): string {\n const q = i.filterText.trim()\n if (q) return `No ${i.nouns.plural} match “${q}”`\n return i.hasKind ? `No ${i.nouns.plural} yet` : 'No custom fields yet'\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport { BookMarked } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\nexport interface FieldsManagerTitleProps extends Omit<ComponentProps<'div'>, 'title'> {\n /** Heading text (default \"Tags\"). */\n title?: ReactNode\n}\n\n/** Panel heading: the tags glyph + \"Tags\". */\nexport function FieldsManagerTitle({\n title = 'Tags',\n className,\n ...props\n}: FieldsManagerTitleProps) {\n return (\n <div\n data-slot=\"fields-manager-title\"\n className={cn('flex items-center gap-2 text-foreground', className)}\n {...props}\n >\n <BookMarked className=\"size-[18px] shrink-0 text-muted-foreground\" />\n <span className=\"text-lg font-semibold leading-none tracking-tight\">{title}</span>\n </div>\n )\n}\n\n/** One-line definition of the active tab (labels vs annotations). */\nexport function FieldsManagerDefinition({\n testId,\n className,\n ...props\n}: ComponentProps<'p'> & {\n /** Overrides the test id (default `fields-manager-definition`). */\n testId?: string\n}) {\n return (\n <p\n data-slot=\"fields-manager-definition\"\n className={cn(\n 'max-w-prose text-pretty px-4 pb-1 pt-3 text-sm italic leading-relaxed text-muted-foreground',\n className\n )}\n {...props}\n data-testid={testIdOr(testId, { testId: 'fields-manager-definition' })}\n />\n )\n}\n\n/** Region holding the fields editor; fills the remaining height. */\nexport function FieldsManagerBody({\n testId,\n className,\n ...props\n}: ComponentProps<'div'> & {\n /** Overrides the test id (default `document-views`). */\n testId?: string\n}) {\n return (\n <div\n data-slot=\"fields-manager-body\"\n className={cn('min-h-0 flex-1 overflow-hidden', className)}\n {...props}\n data-testid={testIdOr(testId, { testId: 'document-views' })}\n />\n )\n}\n","import type { ReactNode, Ref } from 'react'\nimport { Plus, Sparkles, Trash2, X } from 'lucide-react'\nimport {\n Button,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n} from '@arbidocs/react/ui'\n\n/**\n * Parts of the field (tag) create / edit form. The host owns the state and the submit rules and\n * composes the parts it needs: a label field is name only, an annotation adds a value type, a\n * select value adds options, a text value adds an AI instruction.\n */\n\nexport function TagFormRoot({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"tag-form\" className=\"space-y-4 p-4\">\n {children}\n </div>\n )\n}\n\ninterface TagFormFieldProps {\n label: ReactNode\n /** Muted note under the control. */\n hint?: ReactNode\n testId?: string\n children: ReactNode\n}\n\n/** A labelled control of the form. */\nfunction TagFormField({ label, hint, testId, children }: TagFormFieldProps) {\n return (\n <div className=\"space-y-2\" data-testid={testId}>\n <label className=\"text-sm font-medium text-foreground\">{label}</label>\n {children}\n {hint && <p className=\"text-sm text-muted-foreground\">{hint}</p>}\n </div>\n )\n}\n\nexport interface TagFormNameFieldProps {\n label: string\n placeholder: string\n value: string\n onChange: (value: string) => void\n inputRef?: Ref<HTMLInputElement>\n testId?: string\n}\n\nexport function TagFormNameField({\n label,\n placeholder,\n value,\n onChange,\n inputRef,\n testId = 'inline-tag-form-name-input',\n}: TagFormNameFieldProps) {\n return (\n <TagFormField label={label}>\n <Input\n ref={inputRef}\n data-testid={testId}\n placeholder={placeholder}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"bg-card text-sm\"\n />\n </TagFormField>\n )\n}\n\nexport interface TagFormSelectOption {\n value: string\n label: string\n isDisabled?: boolean\n testId?: string\n}\n\nexport interface TagFormSelectFieldProps {\n label: string\n value: string\n onChange: (value: string) => void\n options: TagFormSelectOption[]\n placeholder?: string\n /** Muted note under the select. */\n hint?: ReactNode\n /** Note with a sparkle (AI) glyph under the select. */\n aiNote?: string\n /** Id of the field wrapper. */\n testId?: string\n trigger?: { testId?: string }\n}\n\n/** A select field (value type, parent field). */\nexport function TagFormSelectField({\n label,\n value,\n onChange,\n options,\n placeholder,\n hint,\n aiNote,\n testId,\n trigger,\n}: TagFormSelectFieldProps) {\n return (\n <TagFormField label={label} hint={hint} testId={testId}>\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger className=\"bg-card text-sm\" data-testid={trigger?.testId}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((o) => (\n <SelectItem\n key={o.value}\n value={o.value}\n disabled={o.isDisabled}\n data-testid={o.testId}\n >\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {aiNote && (\n <p className=\"flex items-start gap-1 text-sm text-muted-foreground\">\n <Sparkles className=\"mt-0.5 size-3 shrink-0 text-yellow-text\" />\n <span>{aiNote}</span>\n </p>\n )}\n </TagFormField>\n )\n}\n\n/** Why the nesting picker is absent. */\nexport function TagFormNote({ testId, children }: { testId?: string; children: ReactNode }) {\n return (\n <p className=\"text-sm text-muted-foreground\" data-testid={testId}>\n {children}\n </p>\n )\n}\n\nexport interface TagFormOptionsEditorProps {\n label: string\n options: string[]\n draft: string\n onDraftChange: (value: string) => void\n onAdd: () => void\n onRemove: (index: number) => void\n addPlaceholder: string\n emptyHint: string\n removeLabel?: string\n addLabel?: string\n}\n\n/** Options of a select value: the list with a remove button each, and an add input. */\nexport function TagFormOptionsEditor({\n label,\n options,\n draft,\n onDraftChange,\n onAdd,\n onRemove,\n addPlaceholder,\n emptyHint,\n removeLabel = 'Remove option',\n addLabel = 'Add option',\n}: TagFormOptionsEditorProps) {\n return (\n <TagFormField label={label}>\n <div className=\"space-y-2\">\n {options.length > 0 && (\n <div className=\"space-y-1\">\n {options.map((option, index) => (\n <div\n key={index}\n className=\"flex items-center gap-2 rounded border bg-card p-2 hover:bg-muted\"\n >\n <span className=\"flex-1 text-sm\">{option}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onRemove(index)}\n aria-label={removeLabel}\n className=\"size-6 p-0 hover:bg-destructive/10 hover:text-destructive pointer-coarse:size-11\"\n >\n <X className=\"size-3\" />\n </Button>\n </div>\n ))}\n </div>\n )}\n <div className=\"flex gap-2\">\n <Input\n placeholder={addPlaceholder}\n value={draft}\n onChange={(e) => onDraftChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n onAdd()\n }\n }}\n className=\"flex-1 bg-card text-sm\"\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={onAdd}\n disabled={!draft.trim()}\n aria-label={addLabel}\n >\n <Plus className=\"size-4\" />\n </Button>\n </div>\n {options.length === 0 && <p className=\"text-sm text-muted-foreground\">{emptyHint}</p>}\n </div>\n </TagFormField>\n )\n}\n\nexport interface TagFormInstructionFieldProps {\n label: string\n optionalLabel: string\n description: string\n placeholder: string\n value: string\n onChange: (value: string) => void\n}\n\n/** The AI instruction of a text field. */\nexport function TagFormInstructionField({\n label,\n optionalLabel,\n description,\n placeholder,\n value,\n onChange,\n}: TagFormInstructionFieldProps) {\n return (\n <div className=\"space-y-2\">\n <label className=\"flex items-center gap-1.5 text-sm font-medium text-foreground\">\n <Sparkles className=\"size-3.5 text-yellow-text\" />\n {label}\n <span className=\"font-normal text-muted-foreground\">{optionalLabel}</span>\n </label>\n <p className=\"text-sm italic text-muted-foreground\">{description}</p>\n <Textarea\n placeholder={placeholder}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"min-h-[80px] bg-card text-sm\"\n />\n </div>\n )\n}\n\nexport interface TagFormMetaLine {\n /** \"Created 3 days ago\". */\n text: string\n /** \"by\" word and the author's pill. */\n byLabel?: string\n by?: ReactNode\n}\n\n/** Created / Updated stamps of an existing field. */\nexport function TagFormMeta({ lines }: { lines: TagFormMetaLine[] }) {\n return (\n <div className=\"flex flex-col gap-1.5 text-sm text-muted-foreground\">\n {lines.map((line, i) => (\n <div key={i} className=\"flex items-center gap-2\">\n <span>{line.text}</span>\n {line.by && (\n <>\n <span>{line.byLabel}</span>\n {line.by}\n </>\n )}\n </div>\n ))}\n </div>\n )\n}\n\nexport interface TagFormFooterProps {\n /** Create mode: the shared toggle + its label, at the start of the line. */\n sharedToggle?: ReactNode\n onDelete?: () => void\n deleteLabel?: string\n onCancel: () => void\n cancelLabel?: string\n onSubmit: () => void\n submitLabel: string\n canSubmit: boolean\n}\n\n/** \"Shared with workspace\": the host's visibility toggle with its label. */\nexport function TagFormSharedToggle({ toggle, label }: { toggle: ReactNode; label: string }) {\n return (\n <div className=\"flex items-center gap-2\">\n {toggle}\n <label className=\"text-sm font-medium text-foreground\">{label}</label>\n </div>\n )\n}\n\n/** Cancel / submit line, with the optional shared toggle and delete at the start. */\nexport function TagFormFooter({\n sharedToggle,\n onDelete,\n deleteLabel = 'Delete',\n onCancel,\n cancelLabel = 'Cancel',\n onSubmit,\n submitLabel,\n canSubmit,\n}: TagFormFooterProps) {\n return (\n <div className=\"flex items-center gap-2\">\n {sharedToggle}\n {onDelete && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onDelete}\n className=\"gap-1.5 px-2 text-destructive hover:bg-destructive/10 hover:text-destructive\"\n data-testid=\"inline-tag-form-delete-button\"\n >\n <Trash2 className=\"size-3.5\" />\n {deleteLabel}\n </Button>\n )}\n <div className=\"flex-1\" />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onCancel}\n data-testid=\"inline-tag-form-cancel-button\"\n >\n {cancelLabel}\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={onSubmit}\n disabled={!canSubmit}\n data-testid=\"inline-tag-form-submit-button\"\n >\n {submitLabel}\n </Button>\n </div>\n )\n}\n","/**\n * Saved grid views: the model behind the views menu of an AG Grid table (the Files table, a\n * database). A view is a named layout: which columns show and in what order, their widths, and, for\n * a grid that has them, the row height and the Gallery zoom. Pure functions over the grid's column\n * state, so a host persists views however it likes (user settings, …) and the same rules decide\n * which view is on screen everywhere.\n */\nimport type { GridApi } from 'ag-grid-community'\n\n/** AG Grid's own row-selection checkbox column: never part of a view. */\nexport const SELECTION_COL_ID = 'ag-Grid-SelectionColumn'\n\n/** A saved (or built-in) layout of a grid. Field names follow the API's `TableView`. */\nexport interface SavedGridView {\n name: string\n /** Visible columns, in order. */\n columns: string[]\n /** colId → width (px) of the columns that have a fixed width (flex columns are never stored). */\n column_widths?: Record<string, number> | null\n /** Gallery zoom (tile width), for a grid that has a Gallery. */\n tile_size?: number | null\n /** Table row height (px). */\n row_height?: number | null\n /**\n * Built-ins only: the columns to pin left when the view loads (`[]` unpins everything). Saved\n * views never carry it, so loading one leaves pins alone.\n */\n pinned_left?: string[]\n}\n\nconst live = <T>(api: GridApi<T> | null): api is GridApi<T> => Boolean(api && !api.isDestroyed())\n\n/** Visible columns of the grid, in order, without the ignored ones (the selection column, …). */\nexport function visibleColumns<T>(\n api: GridApi<T> | null,\n ignored: ReadonlySet<string>,\n fallback: string[]\n): string[] {\n if (!live(api)) return fallback\n const state = api.getColumnState()\n if (!state) return fallback\n return state.filter((c) => !c.hide && !ignored.has(c.colId)).map((c) => c.colId)\n}\n\n/**\n * Does `viewColumns` match the visible columns? Same set in the same order, ignoring columns of the\n * view the grid no longer has (a deleted field).\n */\nexport function columnsMatch<T>(\n api: GridApi<T> | null,\n current: string[],\n viewColumns: string[]\n): boolean {\n const gridIds = live(api) ? new Set(api.getColumns()?.map((c) => c.getColId()) ?? []) : null\n const effective = gridIds ? viewColumns.filter((c) => gridIds.has(c)) : viewColumns\n return current.length === effective.length && current.every((c, i) => c === effective[i])\n}\n\n/**\n * Do the view's stored widths still match the grid? Only columns the view stored a width for count\n * (flex columns are never stored), so a window resize re-flexing a column cannot flip the view.\n */\nexport function widthsMatch<T>(\n api: GridApi<T> | null,\n widths: SavedGridView['column_widths']\n): boolean {\n if (!widths || !live(api)) return true\n const byId = new Map(api.getColumnState().map((c) => [c.colId, c.width]))\n return Object.entries(widths).every(([colId, w]) => {\n const cur = byId.get(colId)\n return cur != null && Math.round(cur) === Math.round(w)\n })\n}\n\n/** Ids of the columns pinned left right now. */\nexport function pinnedLeftColumns<T>(api: GridApi<T> | null): Set<string> {\n if (!live(api)) return new Set()\n return new Set(\n api\n .getColumnState()\n .filter((c) => c.pinned === 'left')\n .map((c) => c.colId)\n )\n}\n\n/** Widths of the visible fixed-width columns, to store with a view. */\nexport function captureColumnWidths<T>(\n api: GridApi<T> | null,\n ignored: ReadonlySet<string>\n): Record<string, number> {\n const widths: Record<string, number> = {}\n if (!live(api)) return widths\n for (const col of api.getColumnState()) {\n if (ignored.has(col.colId) || col.hide) continue\n // A flex column's width follows the container, not the user: storing it would flip the view\n // to \"unsaved\" on a window resize.\n if (col.flex != null) continue\n if (typeof col.width === 'number') widths[col.colId] = col.width\n }\n return widths\n}\n\n/**\n * Every column (but the ignored ones) for the menu's field list, in a stable order: `canonical`\n * first (the default view's order), then the rest as the grid has them.\n */\nexport function columnItems<T>(\n api: GridApi<T> | null,\n visible: string[],\n canonical: string[],\n ignored: ReadonlySet<string>\n): Array<{ colId: string; label: string; hidden: boolean }> {\n if (!live(api)) return []\n const state = api.getColumnState()\n if (!state) return []\n const shown = new Set(visible)\n const all = new Map<string, { colId: string; label: string; hidden: boolean }>()\n for (const col of state) {\n if (ignored.has(col.colId)) continue\n const def = api.getColumnDef(col.colId)\n all.set(col.colId, {\n colId: col.colId,\n label: def?.headerName || col.colId,\n hidden: !shown.has(col.colId),\n })\n }\n const result: Array<{ colId: string; label: string; hidden: boolean }> = []\n const seen = new Set<string>()\n for (const colId of canonical) {\n const col = all.get(colId)\n if (col) {\n result.push(col)\n seen.add(colId)\n }\n }\n for (const [colId, col] of all) if (!seen.has(colId)) result.push(col)\n return result\n}\n\n/**\n * The visible columns after toggling `colId`: hidden, or shown again at its place in `canonical`\n * (after the last visible column that comes before it). The last visible column stays.\n */\nexport function toggleColumn(current: string[], colId: string, canonical: string[]): string[] {\n if (current.includes(colId)) {\n return current.length <= 1 ? current : current.filter((c) => c !== colId)\n }\n const index = canonical.indexOf(colId)\n const next = [...current]\n let insertAt = next.length\n for (let i = index - 1; i >= 0; i--) {\n const at = next.indexOf(canonical[i])\n if (at !== -1) {\n insertAt = at + 1\n break\n }\n }\n next.splice(insertAt, 0, colId)\n return next\n}\n\n/**\n * Show exactly `columns`, in that order (the selection column stays first), and hide the rest.\n * Columns not yet in the grid's state get their definition's width.\n */\nexport function applyColumnLayout<T>(api: GridApi<T>, columns: string[]): void {\n if (api.isDestroyed()) return\n const state = api.getColumnState()\n const selection = state.find((c) => c.colId === SELECTION_COL_ID)\n const byId = new Map(state.map((c) => [c.colId, c]))\n const wanted = new Set(columns)\n api.applyColumnState({\n state: [\n { colId: SELECTION_COL_ID, hide: false, width: selection?.width || 48 },\n ...columns.map((colId) => {\n const existing = byId.get(colId)\n if (existing) return { ...existing, hide: false }\n const def = api.getColumnDef(colId)\n return { colId, hide: false, width: def?.width || def?.minWidth || 200 }\n }),\n ...state\n .filter((c) => c.colId !== SELECTION_COL_ID && !wanted.has(c.colId))\n .map((c) => ({ ...c, hide: true })),\n ],\n defaultState: { hide: undefined },\n applyOrder: true,\n })\n // Belt and braces: AG Grid can keep a column's colDef visibility over the applied state.\n api.setColumnsVisible(\n columns.filter((id) => !id.startsWith('ag-Grid-')),\n true\n )\n api.setColumnsVisible(\n state\n .filter((c) => !c.colId.startsWith('ag-Grid-') && !wanted.has(c.colId))\n .map((c) => c.colId),\n false\n )\n}\n\n/**\n * Load a view's column layout: columns (`applyColumns`, default `applyColumnLayout`), then the\n * stored widths, then the built-in's pins. Row height and zoom are the host's (it owns them).\n */\nexport function applyViewColumns<T>(\n api: GridApi<T>,\n view: SavedGridView,\n applyColumns: (columns: string[], api: GridApi<T>) => void = (c, a) => applyColumnLayout(a, c)\n): void {\n applyColumns(view.columns, api)\n if (view.column_widths && !api.isDestroyed()) {\n api.applyColumnState({\n state: Object.entries(view.column_widths).map(([colId, width]) => ({ colId, width })),\n applyOrder: false,\n })\n }\n // Pinning lives in column STATE (colDefs use initialPinned only), so a later columnDefs rebuild\n // cannot re-pin or un-pin.\n if (view.pinned_left && !api.isDestroyed()) {\n const pinned = new Set(view.pinned_left)\n api.applyColumnState({\n state: api.getColumnState().map((c) => ({\n colId: c.colId,\n pinned: pinned.has(c.colId) ? ('left' as const) : null,\n })),\n applyOrder: false,\n })\n }\n}\n\n/** Replace the view named like `view` (or add it), keeping the others in order. */\nexport function upsertView<V extends SavedGridView>(views: V[], view: V): V[] {\n return [...views.filter((v) => v.name !== view.name), view]\n}\n","/**\n * useGridViews: the state behind `ViewSelectorMenu` for any AG Grid table: which view is on screen\n * (derived from the live layout, never stored), loading a built-in or saved view, saving the\n * current layout under a name, deleting a view and showing or hiding one column.\n *\n * The host owns persistence (`onSaveView` / `onDeleteView` write wherever its views live) and the\n * parts of a layout outside the grid (row height, Gallery zoom), which it passes in and restores in\n * `onLoadView`. Pass `stateVersion` that changes whenever the grid's column state does (e.g. the\n * persisted grid state) so the active view is recomputed.\n */\nimport { useCallback, useMemo, useState } from 'react'\nimport type { GridApi } from 'ag-grid-community'\nimport type { ViewBuiltinItem, ViewSelectorMenuProps } from './ViewSelectorMenu'\nimport {\n SELECTION_COL_ID,\n captureColumnWidths,\n columnItems,\n columnsMatch,\n pinnedLeftColumns,\n toggleColumn,\n visibleColumns,\n widthsMatch,\n type SavedGridView,\n} from './gridViews'\n\n/** A view that ships with the grid (keyed by a stable id, so renaming its label keeps it matching). */\nexport interface GridBuiltinView extends ViewBuiltinItem {\n columns: string[]\n /** The row height the view loads with (and must match to be active). */\n rowHeight?: number\n /** Columns pinned left by this view (`[]`: none, the selection column unpinned). */\n pinnedLeft?: string[]\n}\n\nexport interface UseGridViewsOptions<T, V extends SavedGridView> {\n getGridApi: () => GridApi<T> | null\n /** The default view's columns: also the stable order of the field list. */\n defaultColumns: string[]\n builtins: GridBuiltinView[]\n savedViews: V[]\n /** Changes whenever the grid's column state changes (recomputes the active view). */\n stateVersion?: unknown\n /** Columns never part of a view besides the selection column (an \"add a column\" column…). */\n ignoredColumns?: string[]\n /** Current layout outside the grid; omitted, it never decides which view is active. */\n currentRowHeight?: number\n currentTileSize?: number\n /** The Gallery zoom the built-ins load with. */\n defaultTileSize?: number\n /** Show these columns in this order (a field toggled in the menu). */\n onApplyColumns: (columns: string[], api: GridApi<T>) => void\n /** Restore a whole view (built-in or saved): columns, widths, pins, row height, zoom. */\n onLoadView: (view: SavedGridView | V, api: GridApi<T>) => void\n /** Store a view (replacing one of the same name); resolve once stored. */\n onSaveView: (view: SavedGridView) => Promise<unknown> | void\n /** Delete a saved view; resolve `false` if it was not deleted (e.g. not confirmed). */\n onDeleteView: (name: string) => Promise<boolean | void> | boolean | void\n isSaving?: boolean\n}\n\nexport type GridViewsMenuProps = Omit<ViewSelectorMenuProps, 'labels' | 'testIds' | 'className'>\n\nexport function useGridViews<T, V extends SavedGridView>({\n getGridApi,\n defaultColumns,\n builtins,\n savedViews,\n stateVersion,\n ignoredColumns,\n currentRowHeight,\n currentTileSize,\n defaultTileSize,\n onApplyColumns,\n onLoadView,\n onSaveView,\n onDeleteView,\n isSaving,\n}: UseGridViewsOptions<T, V>): GridViewsMenuProps {\n const [open, setOpen] = useState(false)\n const [saveName, setSaveName] = useState('')\n const ignoredKey = (ignoredColumns ?? []).join('\\u0000')\n const ignored = useMemo(\n () => new Set([SELECTION_COL_ID, ...(ignoredKey ? ignoredKey.split('\\u0000') : [])]),\n [ignoredKey]\n )\n\n const current = useMemo(\n () => visibleColumns(getGridApi(), ignored, defaultColumns),\n // stateVersion: the grid's column state lives outside React.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [getGridApi, defaultColumns, ignored, stateVersion]\n )\n\n const viewMatches = useCallback(\n (view: SavedGridView) => {\n const api = getGridApi()\n return (\n columnsMatch(api, current, view.columns) &&\n widthsMatch(api, view.column_widths) &&\n (view.row_height == null ||\n currentRowHeight == null ||\n view.row_height === currentRowHeight) &&\n (view.tile_size == null || currentTileSize == null || view.tile_size === currentTileSize)\n )\n },\n [getGridApi, current, currentRowHeight, currentTileSize]\n )\n\n // The active view, from the live layout. A built-in matches on its columns, its row height, its\n // pins and the default zoom; any deviation lands on a saved view or \"unsaved\".\n const currentView = useMemo(() => {\n const api = getGridApi()\n const pinned = pinnedLeftColumns(api)\n // A pinning built-in needs all its pins; a non-pinning one only needs the selection column\n // unpinned (a column's own initialPinned alone does not make it the pinning view).\n const pinsMatch = (pinnedLeft: string[] = []) =>\n pinnedLeft.length > 0\n ? pinnedLeft.every((id) => pinned.has(id))\n : !pinned.has(SELECTION_COL_ID)\n if (currentTileSize == null || defaultTileSize == null || currentTileSize === defaultTileSize) {\n for (const b of builtins) {\n if (\n (b.rowHeight == null || currentRowHeight == null || currentRowHeight === b.rowHeight) &&\n pinsMatch(b.pinnedLeft) &&\n columnsMatch(api, current, b.columns)\n )\n return b.key\n }\n }\n for (const view of savedViews) if (viewMatches(view)) return view.name\n return 'unsaved'\n }, [\n getGridApi,\n builtins,\n current,\n savedViews,\n viewMatches,\n currentRowHeight,\n currentTileSize,\n defaultTileSize,\n ])\n\n const loadView = useCallback(\n (key: string) => {\n const api = getGridApi()\n if (!api) return\n const builtin = builtins.find((b) => b.key === key)\n if (builtin) {\n // The whole layout back to the built-in's baseline, so the menu reads it afterwards.\n onLoadView(\n {\n name: builtin.key,\n columns: builtin.columns,\n row_height: builtin.rowHeight,\n tile_size: defaultTileSize,\n pinned_left: builtin.pinnedLeft ?? [],\n },\n api\n )\n setOpen(false)\n return\n }\n const view = savedViews.find((v) => v.name === key)\n if (view) {\n onLoadView(view, api)\n setOpen(false)\n }\n },\n [getGridApi, builtins, savedViews, onLoadView, defaultTileSize]\n )\n\n const save = useCallback(async () => {\n const name = saveName.trim()\n if (!name) return\n const api = getGridApi()\n const view: SavedGridView = {\n name,\n columns: current,\n column_widths: captureColumnWidths(api, ignored),\n ...(currentTileSize != null ? { tile_size: currentTileSize } : {}),\n ...(currentRowHeight != null ? { row_height: currentRowHeight } : {}),\n }\n try {\n await onSaveView(view)\n } catch {\n return // the host reports the failure; the name stays to retry\n }\n setSaveName('')\n setOpen(false)\n // Apply it at once so the menu reads the new view before the host's list catches up.\n if (api && !api.isDestroyed()) onLoadView(view, api)\n }, [\n saveName,\n getGridApi,\n current,\n ignored,\n currentTileSize,\n currentRowHeight,\n onSaveView,\n onLoadView,\n ])\n\n const remove = useCallback(\n async (name: string) => {\n const deleted = await onDeleteView(name)\n if (deleted === false) return\n if (currentView === name && builtins[0]) loadView(builtins[0].key)\n },\n [onDeleteView, currentView, builtins, loadView]\n )\n\n const columns = useMemo(\n () => columnItems(getGridApi(), current, defaultColumns, ignored),\n [getGridApi, current, defaultColumns, ignored]\n )\n\n const toggle = useCallback(\n (colId: string) => {\n const api = getGridApi()\n if (!api || api.isDestroyed()) return\n const next = toggleColumn(\n current,\n colId,\n columns.map((c) => c.colId)\n )\n if (next !== current) onApplyColumns(next, api)\n },\n [getGridApi, current, columns, onApplyColumns]\n )\n\n const builtinItems = useMemo(\n () => builtins.map(({ key, label, icon, testId }) => ({ key, label, icon, testId })),\n [builtins]\n )\n\n return {\n open,\n onOpenChange: (next: boolean) => {\n setOpen(next)\n if (!next) setSaveName('')\n },\n currentView,\n builtins: builtinItems,\n savedViewNames: savedViews.map((v) => v.name),\n columns,\n saveName,\n onSaveNameChange: setSaveName,\n onSave: () => void save(),\n isSaving,\n onSelectView: loadView,\n onDeleteView: (name: string) => void remove(name),\n onToggleColumn: toggle,\n }\n}\n","import { useState, type ReactNode } from 'react'\nimport { Check, ChevronsUpDown, Loader2, Plus, Sparkles, Table2 } 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 DialogHeader,\n DialogTitle,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\nimport { assistantCopy, useAssistantCopy } from '@arbidocs/react/shell'\nimport { ModalSection } from '../settings/ModalScaffold'\n\n/** Every fixed string of the AI annotation dialog. */\nexport interface AiReviewDialogLabels {\n title: string\n fieldLabel: string\n newField: string\n searchPlaceholder: string\n noFields: string\n create: (name: string) => string\n instructionPlaceholder: string\n documentColumn: string\n viewInTable: string\n done: string\n /** A finished AI cell that got no value. */\n noValue: string\n noValueHint: string\n}\n\n/** ARBI's own phrases (the defaults below). */\nconst ARBI = assistantCopy()\n\nexport const DEFAULT_AI_REVIEW_DIALOG_LABELS: AiReviewDialogLabels = {\n title: 'AI annotation',\n fieldLabel: 'Field',\n newField: 'New field',\n searchPlaceholder: 'Search or create a field...',\n noFields: 'No fields yet',\n create: (name) => `Create “${name}”`,\n instructionPlaceholder:\n 'Write what you want to know — e.g. What language is this document written in?',\n documentColumn: 'Document',\n viewInTable: 'View in table',\n done: 'Done',\n noValue: 'No value',\n noValueHint: ARBI.noAnswerHint,\n}\n\nexport interface AiReviewFieldOption {\n id: string\n name: string\n}\n\n/** Where answers go: an existing field, a new field the user named, or null (auto-named). */\nexport interface AiReviewTarget {\n id?: string\n name: string\n}\n\nexport interface AiReviewAskView {\n fields: AiReviewFieldOption[]\n target: AiReviewTarget | null\n onPickTarget: (target: AiReviewTarget | null) => void\n /** Create-from-search: the host reuses an exact name match or remembers the typed name. */\n onPickFromSearch: (name: string) => void\n instruction: string\n onInstructionChange: (value: string) => void\n canSubmit: boolean\n isSubmitting: boolean\n /** e.g. \"Review 3 documents\". */\n runLabel: string\n onRun: () => void\n}\n\nexport interface AiReviewResultCell {\n fieldId: string\n note?: string\n /** A presence tag applied to this document; annotations require a nonempty note. */\n isApplied?: boolean\n /** An AI value still being produced shows a spinner while empty. */\n isAi: boolean\n /** The run finished this document: an empty AI cell will not fill, so it says so. */\n isFinished?: boolean\n}\n\nexport interface AiReviewResultRow {\n id: string\n title: string\n cells: AiReviewResultCell[]\n}\n\nexport interface AiReviewResultsView {\n fields: AiReviewFieldOption[]\n rows: AiReviewResultRow[]\n /** One AI field: a per-document list; otherwise a field-by-document table. */\n isSingleField: boolean\n /** Header chip: the field name (or a count) with its tooltip. */\n chip: { label: string; tooltip?: string }\n onViewInTable: () => void\n onDone: () => void\n}\n\nexport interface AiReviewDialogViewProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Subtitle: instructions while asking, progress while reviewing. */\n description: string\n /** Exactly one of `ask` / `results` is rendered, by phase. */\n phase: 'ask' | 'review'\n ask: AiReviewAskView\n results?: AiReviewResultsView\n labels?: Partial<AiReviewDialogLabels>\n}\n\nconst hasNote = (note?: string) => note != null && note !== ''\n\n/** An empty AI cell: a spinner while the run works on it, \"No value\" once it finished. */\nfunction PendingAiValue({ isFinished, l }: { isFinished?: boolean; l: AiReviewDialogLabels }) {\n return isFinished ? (\n <span\n className=\"text-muted-foreground italic\"\n title={l.noValueHint}\n data-testid=\"ai-review-no-value\"\n >\n {l.noValue}\n </span>\n ) : (\n <Loader2\n className=\"size-3.5 animate-spin text-muted-foreground\"\n aria-label=\"Working\"\n data-testid=\"ai-review-pending\"\n />\n )\n}\n\nfunction FieldPicker({ ask, l }: { ask: AiReviewAskView; l: AiReviewDialogLabels }): ReactNode {\n const [open, setOpen] = useState(false)\n const [search, setSearch] = useState('')\n const close = () => {\n setOpen(false)\n setSearch('')\n }\n const trimmed = search.trim()\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next)\n if (!next) setSearch('')\n }}\n >\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"max-w-[280px] gap-1.5\"\n data-testid=\"ai-review-field-picker\"\n >\n {ask.target ? (\n <span className=\"truncate\">{ask.target.name}</span>\n ) : (\n <span className=\"flex items-center gap-1 text-muted-foreground\">\n <Plus className=\"size-3.5\" />\n {l.newField}\n </span>\n )}\n <ChevronsUpDown className=\"size-3.5 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n {open && (\n <PopoverContent className=\"w-[300px] p-0\" align=\"start\">\n <Command shouldFilter>\n <CommandInput\n placeholder={l.searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && trimmed) {\n e.preventDefault()\n ask.onPickFromSearch(search)\n close()\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {trimmed ? (\n <button\n type=\"button\"\n onClick={() => {\n ask.onPickFromSearch(search)\n close()\n }}\n onPointerDown={(e) => e.preventDefault()}\n className=\"w-full cursor-pointer rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n data-testid=\"ai-review-create-field-option\"\n >\n {l.create(trimmed)}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.noFields}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n <CommandItem\n value=\"__new-field__\"\n onSelect={() => {\n ask.onPickTarget(null)\n close()\n }}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer\"\n data-testid=\"ai-review-new-field-option\"\n >\n <Plus className=\"mr-2 size-3.5\" />\n {l.newField}\n </CommandItem>\n {ask.fields.map((f) => (\n <CommandItem\n key={f.id}\n value={f.name}\n onSelect={() => {\n ask.onPickTarget({ id: f.id, name: f.name })\n close()\n }}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer\"\n data-testid={`ai-review-field-option-${f.id}`}\n >\n <span className=\"flex-1 truncate\">{f.name}</span>\n {ask.target?.id === f.id && <Check className=\"size-3.5 shrink-0\" />}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n )}\n </Popover>\n )\n}\n\nfunction AskPhase({ ask, l }: { ask: AiReviewAskView; l: AiReviewDialogLabels }) {\n return (\n <ModalSection className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">{l.fieldLabel}</span>\n <FieldPicker ask={ask} l={l} />\n </div>\n <Textarea\n autoFocus\n placeholder={l.instructionPlaceholder}\n value={ask.instruction}\n onChange={(e) => ask.onInstructionChange(e.target.value)}\n className=\"min-h-[140px]\"\n data-testid=\"ai-review-instruction-input\"\n />\n <Button\n onClick={ask.onRun}\n disabled={!ask.canSubmit}\n className=\"w-full gap-1.5\"\n data-testid=\"ai-review-run-button\"\n >\n {ask.isSubmitting ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Sparkles className=\"size-4\" />\n )}\n {ask.runLabel}\n </Button>\n </ModalSection>\n )\n}\n\nfunction ResultsPhase({ r, l }: { r: AiReviewResultsView; l: AiReviewDialogLabels }) {\n return (\n <ModalSection className=\"space-y-3\">\n {r.isSingleField ? (\n <div\n className=\"max-h-[50dvh] space-y-1 overflow-y-auto pr-1\"\n data-testid=\"ai-review-results\"\n >\n {r.rows.map((row) => {\n const cell = row.cells[0]\n const note = cell?.note\n return (\n <div\n key={row.id}\n className=\"flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm\"\n >\n <span className=\"min-w-0 flex-1 truncate text-muted-foreground\">{row.title}</span>\n {hasNote(note) ? (\n <span className=\"flex items-center gap-1 font-medium text-foreground\">\n <span className=\"whitespace-pre-line\">{note}</span>\n <Check className=\"size-3.5 text-green-text\" />\n </span>\n ) : cell?.isApplied ? (\n <Check className=\"size-3.5 text-green-text\" aria-label=\"Applied\" />\n ) : (\n <PendingAiValue isFinished={cell?.isFinished} l={l} />\n )}\n </div>\n )\n })}\n </div>\n ) : (\n <div\n className=\"max-h-[55dvh] overflow-auto rounded-md border border-border\"\n data-testid=\"ai-review-results\"\n >\n <table className=\"w-full text-sm\">\n <thead className=\"sticky top-0 bg-muted/80 backdrop-blur\">\n <tr>\n <th className=\"px-3 py-2 text-left font-medium\">{l.documentColumn}</th>\n {r.fields.map((f) => (\n <th key={f.id} className=\"px-3 py-2 text-left font-medium\">\n {f.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {r.rows.map((row) => (\n <tr key={row.id} className=\"border-t border-border\">\n <td className=\"max-w-[360px] truncate px-3 py-2 text-muted-foreground\">\n {row.title}\n </td>\n {row.cells.map((c) => (\n <td key={c.fieldId} className=\"px-3 py-2\">\n {hasNote(c.note) ? (\n <span className=\"whitespace-pre-line font-medium text-foreground\">\n {c.note}\n </span>\n ) : c.isApplied ? (\n <Check className=\"size-3.5 text-green-text\" aria-label=\"Applied\" />\n ) : c.isAi ? (\n <PendingAiValue isFinished={c.isFinished} l={l} />\n ) : (\n <Check className=\"size-3.5 text-green-text\" />\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n <div className=\"flex items-center justify-between gap-2\">\n <Button\n variant=\"outline\"\n onClick={r.onViewInTable}\n className=\"gap-1.5 bg-background\"\n data-testid=\"ai-review-view-button\"\n >\n <Table2 className=\"size-4\" />\n {l.viewInTable}\n </Button>\n <Button onClick={r.onDone} data-testid=\"ai-review-done-button\">\n {l.done}\n </Button>\n </div>\n </ModalSection>\n )\n}\n\n/**\n * The \"AI annotation\" dialog: ask one question (pick or name a field, write the prompt, run) and\n * then watch each document's answer land (list for one field, table for several).\n */\nexport function AiReviewDialogView({\n open,\n onOpenChange,\n description,\n phase,\n ask,\n results,\n labels,\n}: AiReviewDialogViewProps) {\n const assistant = useAssistantCopy()\n const l = { ...DEFAULT_AI_REVIEW_DIALOG_LABELS, noValueHint: assistant.noAnswerHint, ...labels }\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent presentation=\"sheet\" className=\"sm:max-w-5xl\" data-testid=\"ai-review-modal\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Sparkles className=\"size-5 text-yellow-text\" />\n {l.title}\n {phase === 'review' && results ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"max-w-[220px] truncate rounded-full bg-yellow-bg px-2.5 py-0.5 text-xs font-medium text-yellow-text\"\n data-testid=\"ai-review-field-chip\"\n >\n {results.chip.label}\n </span>\n </TooltipTrigger>\n {results.chip.tooltip ? (\n <TooltipContent className=\"max-w-xs\">{results.chip.tooltip}</TooltipContent>\n ) : null}\n </Tooltip>\n </TooltipProvider>\n ) : null}\n </DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n {phase === 'ask' || !results ? (\n <AskPhase ask={ask} l={l} />\n ) : (\n <ResultsPhase r={results} l={l} />\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Stage-aware failure icon.\n *\n * All variants share the red color and \"alert\" weight so the cell still\n * reads as \"failure\" at a glance, but the glyph differs per pipeline\n * stage so users can tell *where* it died without opening details.\n *\n * Backend taxonomy (mirrors src/models/document.py FAILABLE_STAGES):\n * parsing — parser service: extraction / OCR / marker-subchunk\n * indexing — Qdrant chunk + vector writes\n * encrypting — SecretBox wrap of chunks/metadata\n * analysing — doctagllm metadata extraction\n * queued — failed before processing started\n * unknown — current code couldn't classify (defensive fallback)\n * null — legacy failure predating the failed_stage column;\n * rendered as \"Failed (stage unknown)\"\n */\n\nimport { memo } from 'react'\nimport {\n AlertCircle,\n BrainCircuit,\n CircleSlash,\n DatabaseZap,\n FileX,\n LockKeyholeOpen,\n type LucideIcon,\n} from 'lucide-react'\n\nexport type FailedStage = 'parsing' | 'indexing' | 'encrypting' | 'analysing' | 'queued' | 'unknown'\n\ninterface StageVariant {\n Icon: LucideIcon\n title: string\n}\n\nconst STAGE_VARIANTS: Record<FailedStage, StageVariant> = {\n parsing: { Icon: FileX, title: 'Parsing failed' },\n indexing: { Icon: DatabaseZap, title: 'Indexing failed' },\n encrypting: { Icon: LockKeyholeOpen, title: 'Encryption failed' },\n analysing: { Icon: BrainCircuit, title: 'Analysis failed' },\n queued: { Icon: CircleSlash, title: 'Failed before processing' },\n unknown: { Icon: AlertCircle, title: 'Failed' },\n}\n\nconst LEGACY_VARIANT: StageVariant = {\n Icon: AlertCircle,\n title: 'Failed (stage unknown)',\n}\n\nfunction resolveVariant(stage: string | null | undefined): StageVariant {\n if (stage == null) return LEGACY_VARIANT\n return (STAGE_VARIANTS as Record<string, StageVariant>)[stage] ?? STAGE_VARIANTS.unknown\n}\n\ninterface FailedStageIconProps {\n stage: string | null | undefined\n errorMessage?: string | null\n className?: string\n onClick?: (e: React.MouseEvent) => void\n}\n\nexport const FailedStageIcon = memo(function FailedStageIcon({\n stage,\n errorMessage,\n className = 'w-4 h-4 text-red-text cursor-pointer hover:text-red-text',\n onClick,\n}: FailedStageIconProps) {\n const { Icon, title } = resolveVariant(stage)\n const fullTitle = errorMessage ? `${title}: ${errorMessage}` : title\n return (\n <div title={fullTitle}>\n <Icon className={className} onClick={onClick} />\n </div>\n )\n})\n","import {\n AlertTriangle,\n CheckCircle,\n FileX,\n Hourglass,\n Loader2,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { FailedStageIcon } from './FailedStageIcon'\n\nexport interface DocStatusIconProps {\n /** Document processing status (case-insensitive); unknown / empty renders nothing. */\n status?: string | null\n /** Activating the glyph (click, Enter, Space) e.g. opens the status details. */\n onClick?: () => void\n /** Where a failed document's processing stopped (the failed glyph differs per stage). */\n failedStage?: string | null\n /** Why it failed, added to the failed glyph's title. */\n errorMessage?: string | null\n className?: string\n}\n\nconst STATUS: Record<string, { Icon: LucideIcon; title: string; tone: string; spin?: boolean }> = {\n completed: { Icon: CheckCircle, title: 'Ready', tone: 'text-green-text' },\n empty: { Icon: FileX, title: 'Empty', tone: 'text-yellow-text' },\n 'low-content': { Icon: AlertTriangle, title: 'Low Content', tone: 'text-yellow-text' },\n processing: { Icon: Loader2, title: 'Indexing', tone: 'text-muted-foreground', spin: true },\n queued: { Icon: Hourglass, title: 'Queued', tone: 'text-yellow-text' },\n}\n\n/** Compact status glyph of a document row (ready, empty, low content, indexing, queued, failed). */\nexport function DocStatusIcon({\n status,\n onClick,\n failedStage,\n errorMessage,\n className,\n}: DocStatusIconProps) {\n if (!status) return null\n const key = status.toLowerCase()\n if (key === 'failed') {\n return (\n <FailedStageIcon\n stage={failedStage}\n errorMessage={errorMessage}\n className={cn('size-3 text-red-text', onClick && 'cursor-pointer', className)}\n onClick={\n onClick\n ? (e) => {\n e.stopPropagation()\n onClick()\n }\n : undefined\n }\n />\n )\n }\n const entry = STATUS[key]\n if (!entry) return null\n const { Icon } = entry\n const glyph = (\n <Icon className={cn('size-3', entry.tone, entry.spin && 'animate-spin', className)} />\n )\n if (!onClick) {\n return (\n <span title={entry.title} data-slot=\"doc-status-icon\" data-status={key}>\n {glyph}\n </span>\n )\n }\n return (\n <button\n type=\"button\"\n title={entry.title}\n aria-label={entry.title}\n data-slot=\"doc-status-icon\"\n data-status={key}\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n className=\"cursor-pointer rounded hover:opacity-80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {glyph}\n </button>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { Check, ChevronsUpDown, FolderOpen } from 'lucide-react'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { FolderBreadcrumb } from './cells/FolderCell'\nimport {\n LabelPickerList,\n DEFAULT_LABEL_MULTI_SELECT_LABELS,\n type LabelMultiSelectLabels,\n type LabelOption,\n} from './cells/LabelMultiSelect'\n\n/**\n * Parts of the document \"card\" form (one labelled field per column): read-only values, the folder\n * and label pickers, a native select and the hover attribution of who last changed a value.\n */\n\nconst FIELD_SURFACE =\n 'rounded-md border border-input bg-muted/40 text-sm transition-colors hover:bg-background'\n\nexport interface FieldValueProps {\n tone?: 'default' | 'strong' | 'muted'\n isMono?: boolean\n isTruncated?: boolean\n children: ReactNode\n}\n\n/** A read-only value of a field. */\nexport function FieldValue({ tone = 'default', isMono, isTruncated, children }: FieldValueProps) {\n return (\n <span\n data-slot=\"field-value\"\n className={cn(\n 'text-sm',\n tone === 'strong' && 'font-semibold',\n tone === 'muted' && 'text-muted-foreground',\n isMono && 'font-mono',\n isTruncated && 'truncate'\n )}\n >\n {children}\n </span>\n )\n}\n\nexport interface FieldFolderSelectProps {\n /** Current folder path, if any. */\n folder: string | null | undefined\n /** Searchable folder list (host-bound `FolderCommandList`). */\n picker: ReactNode\n}\n\n/** Folder field: a trigger showing the breadcrumb, opening the folder picker in a popover. */\nexport function FieldFolderSelect({ folder, picker }: FieldFolderSelectProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"field-folder-select\"\n className={cn(\n FIELD_SURFACE,\n 'flex h-9 w-full min-w-0 items-center gap-1.5 px-3 text-left hover:text-primary pointer-coarse:h-11'\n )}\n >\n {folder ? (\n <>\n <FolderOpen className=\"size-3.5 flex-none shrink-0 text-yellow-600\" />\n <FolderBreadcrumb segments={folder.split('/')} size=\"sm\" />\n </>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n <ChevronsUpDown className=\"ml-auto size-3.5 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-[var(--radix-popover-trigger-width)] max-w-[min(640px,92vw)] p-0\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n >\n {picker}\n </PopoverContent>\n </Popover>\n )\n}\n\n/** Read-only folder. */\nexport function FieldFolderValue({ folder }: { folder: string | null | undefined }) {\n return (\n <div className=\"flex items-center gap-1.5 text-sm\">\n {folder ? (\n <>\n <FolderOpen className=\"size-3.5 shrink-0 text-yellow-600\" />\n <span>{folder}</span>\n </>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n )\n}\n\nexport interface FieldLabelsSelectProps {\n options: LabelOption[]\n appliedIds: ReadonlySet<string>\n /** Labels shown as check marks in the field (defaults to the applied ones). Pass fewer to list\n * the selection elsewhere, e.g. in a dialog that renders it beside the field. */\n displayedIds?: ReadonlySet<string>\n onToggle: (id: string) => void\n /** Create a label and apply it; omit to make the picker toggle-only. */\n onCreate?: (name: string) => void\n emptyText?: string\n labels?: Partial<LabelMultiSelectLabels>\n}\n\n/** Labels field: the applied labels as check marks; click to open the label picker. */\nexport function FieldLabelsSelect({\n options,\n appliedIds,\n displayedIds = appliedIds,\n onToggle,\n onCreate,\n emptyText = 'Click to add',\n labels,\n}: FieldLabelsSelectProps) {\n const applied = useMemo(\n () => options.filter((o) => displayedIds.has(o.id)),\n [options, displayedIds]\n )\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"field-labels-select\"\n className={cn(\n FIELD_SURFACE,\n 'flex min-h-9 w-full cursor-pointer items-center px-3 py-1.5 text-left pointer-coarse:min-h-11'\n )}\n >\n <div className=\"flex min-h-[28px] flex-wrap items-center gap-1.5\">\n {applied.length === 0 && (\n <span className=\"text-sm italic text-muted-foreground\">{emptyText}</span>\n )}\n {applied.map((o) => (\n <span key={o.id} className=\"inline-flex items-center gap-1 text-sm font-medium\">\n <span\n className=\"flex size-4 shrink-0 items-center justify-center rounded border-2\"\n style={{ borderColor: o.color, backgroundColor: o.color }}\n >\n <Check className=\"size-3 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[280px] truncate\">{o.name}</span>\n </span>\n ))}\n </div>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[360px] p-0\" align=\"start\" side=\"bottom\" sideOffset={4}>\n <LabelPickerList\n options={options}\n appliedIds={appliedIds}\n onToggle={onToggle}\n onCreate={onCreate}\n labels={{ ...DEFAULT_LABEL_MULTI_SELECT_LABELS, ...labels }}\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport interface FieldNativeSelectProps {\n value: string\n options: string[]\n onChange: (value: string) => void\n /** Text of the empty option. */\n emptyLabel?: string\n ariaLabel?: string\n}\n\n/** A single-choice field (a native `select`: reliable on touch and with assistive tech). */\nexport function FieldNativeSelect({\n value,\n options,\n onChange,\n emptyLabel = '--',\n ariaLabel,\n}: FieldNativeSelectProps) {\n return (\n <select\n value={value}\n aria-label={ariaLabel}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-9 w-full rounded-md border border-input bg-muted/40 px-3 text-sm transition-colors focus:bg-background focus:outline-none focus:ring-1 focus:ring-ring pointer-coarse:h-11\"\n >\n <option value=\"\">{emptyLabel}</option>\n {options.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n )\n}\n\nexport interface FieldAttributionProps {\n /** Avatar of whoever last changed the value. */\n avatar: ReactNode\n /** Formatted date of that change. */\n date: string\n /** Tooltip lines (\"Created ... by ...\", \"Updated ... by ...\"). */\n lines: string[]\n}\n\n/** Subtle \"who changed this and when\". */\nexport function FieldAttribution({ avatar, date, lines }: FieldAttributionProps) {\n return (\n <div className=\"flex items-center gap-1\" data-slot=\"field-attribution\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex items-center gap-1\">\n {avatar}\n <span className=\"text-sm text-muted-foreground\">{date}</span>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {lines.map((line, i) => (\n <p key={i} className=\"text-sm\">\n {line}\n </p>\n ))}\n </TooltipContent>\n </Tooltip>\n </div>\n )\n}\n\n/**\n * Wraps an editable value and reveals `attribution` at its top-right on hover or keyboard focus\n * inside, and always on touch devices (there is no hover there).\n */\nexport function FieldWithAttribution({\n attribution,\n children,\n}: {\n attribution: ReactNode\n children: ReactNode\n}) {\n return (\n <div className=\"group/doctag relative\" data-slot=\"field-with-attribution\">\n {children}\n <div className=\"absolute right-0 top-0 bg-background/90 pl-2 opacity-0 transition-opacity group-focus-within/doctag:opacity-100 group-hover/doctag:opacity-100 pointer-coarse:opacity-100\">\n {attribution}\n </div>\n </div>\n )\n}\n","import { forwardRef, type ComponentProps, type ReactNode } from 'react'\nimport { UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Chrome around the explorer's tile grid: frame, scroller, empty state, marquee, drop overlay. */\n\nexport function ExplorerFrame({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div data-slot=\"explorer-frame\" className={cn('flex h-full flex-col', className)} {...props} />\n )\n}\n\n/** Positioning context of the scroller: the marquee and the drop overlay sit over it. */\nexport function ExplorerStage({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"explorer-stage\"\n className={cn('relative min-h-0 flex-1', className)}\n {...props}\n />\n )\n}\n\n/**\n * The scrolling tile area. `scrollbar-gutter: stable` reserves the scrollbar's space whether or\n * not it shows, so the measured width never flips when the vertical scrollbar toggles (narrow\n * split-screen widths would otherwise thrash column count, tile height, scrollbar, width).\n */\nexport const ExplorerScroller = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n function ExplorerScroller({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"explorer-scroller\"\n className={cn(\n 'h-full select-none overflow-auto px-4 py-4 [scrollbar-gutter:stable]',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nexport interface ExplorerEmptyProps {\n title: string\n description: string\n}\n\n/** Nothing to show in this folder / search. */\nexport function ExplorerEmpty({ title, description }: ExplorerEmptyProps) {\n return (\n <div\n data-slot=\"explorer-empty\"\n className=\"flex h-full flex-col items-center justify-center gap-1 text-center text-muted-foreground\"\n >\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs\">{description}</p>\n </div>\n )\n}\n\n/**\n * Marquee (rubber-band) rectangle. Always mounted and positioned by mutating its style directly\n * during a drag, so selecting does not re-render the grid.\n */\nexport const ExplorerMarquee = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n function ExplorerMarquee({ className, style, ...props }, ref) {\n return (\n <div\n ref={ref}\n aria-hidden\n data-slot=\"explorer-marquee\"\n className={cn(\n 'pointer-events-none fixed z-30 border border-primary bg-primary/10',\n className\n )}\n style={{ display: 'none', ...style }}\n {...props}\n />\n )\n }\n)\n\n/** Shown over the grid while files are dragged in from outside. */\nexport function ExplorerDropOverlay({ label }: { label: string }) {\n return (\n <div\n data-slot=\"explorer-drop-overlay\"\n className=\"pointer-events-none absolute inset-2 z-20 flex flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-primary bg-accent/80 backdrop-blur-sm\"\n >\n <UploadCloud className=\"size-8 text-primary\" />\n <p className=\"text-sm font-medium text-primary\">{label}</p>\n </div>\n )\n}\n\nexport interface ExplorerDragPreviewProps {\n icon: ReactNode\n title: string\n /** Number of documents dragged; above 1 the card stacks and shows an \"N items\" badge. */\n count: number\n}\n\n/**\n * Floating preview under the cursor while dragging documents. When the drag\n * carries a multi-selection the card renders as a stack with an \"N items\"\n * badge, so it's obvious the whole selection moves — not just this file.\n */\nexport function ExplorerDragPreview({ icon, title, count }: ExplorerDragPreviewProps) {\n const isMulti = count > 1\n return (\n <div data-slot=\"explorer-drag-preview\" className=\"relative\">\n {isMulti && (\n <div\n aria-hidden\n className=\"absolute inset-0 translate-x-1.5 translate-y-1.5 rounded-lg border border-primary/30 bg-popover shadow-md\"\n />\n )}\n <div className=\"relative flex items-center gap-2 rounded-lg border border-primary/40 bg-popover px-3 py-2 shadow-lg\">\n {icon}\n <span className=\"max-w-[12rem] truncate text-sm font-medium\">{title}</span>\n {isMulti && (\n <span\n data-slot=\"explorer-drag-preview-count\"\n className=\"whitespace-nowrap rounded-full bg-primary px-2 py-0.5 text-xs font-semibold text-primary-foreground\"\n >\n {count} items\n </span>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Filter button for custom AG Grid header components.\n * Uses AG Grid's own CSS classes (ag-header-icon, ag-icon-filter) so it is\n * visually identical to the native filter button shown on standard columns.\n */\n\nimport { useState, useEffect, useRef } from 'react'\nimport type { IHeaderParams } from 'ag-grid-community'\n\ninterface FilterButtonProps {\n params: IHeaderParams\n colId: string\n}\n\nexport const FilterButton = ({ params, colId }: FilterButtonProps) => {\n const [isFilterActive, setIsFilterActive] = useState(false)\n const btnRef = useRef<HTMLSpanElement>(null)\n\n useEffect(() => {\n const check = () => setIsFilterActive(!!params.api.getFilterModel()[colId])\n check()\n params.api.addEventListener('filterChanged', check)\n return () => {\n if (!params.api.isDestroyed()) params.api.removeEventListener('filterChanged', check)\n }\n }, [params.api, colId])\n\n return (\n <span\n ref={btnRef}\n role=\"button\"\n aria-label=\"Filter\"\n onClick={(e) => {\n e.stopPropagation()\n if (btnRef.current) params.showFilter(btnRef.current)\n }}\n className={`ag-header-icon ag-header-cell-filter-button ag-header-label-icon ${isFilterActive ? 'ag-filter-active' : ''}`}\n aria-hidden=\"false\"\n >\n <span className=\"ag-icon ag-icon-filter\" />\n </span>\n )\n}\n","/**\n * Row-height ⇄ line-count math shared by the documents and facts tables.\n *\n * The grid (packages/arbi-blocks GridView) clamps a multiline cell to\n * `floor((rowHeight - chrome) / lineHeight)` fully-visible lines. Snapping every\n * density value to a line boundary makes each step add exactly one whole line\n * instead of growing the row while clipping the next line in half.\n *\n * The constants MUST match packages/arbi-blocks/src/components/GridView.tsx.\n */\n\n/** One multiline line: grid font-size (14) × its line-height (1.35) = 18.9px. */\nexport const LINE_PX = 14 * 1.35\n/** Fixed per-row chrome: 16px vertical padding + 2px border. */\nexport const CHROME = 18\nexport const MIN_LINES = 1\nexport const MAX_LINES = 10\n\n/**\n * Row height (px) that renders exactly `lines` fully-visible text lines. Uses\n * `ceil` (not `round`) so the value never lands just BELOW a boundary, where the\n * grid's own `floor` would drop back to `lines - 1`.\n */\nexport const rowHeightForLines = (lines: number) => Math.ceil(lines * LINE_PX + CHROME)\n\n/** How many whole lines a given row height renders as — the grid's own formula,\n * so the density slider position matches what's actually on screen. */\nexport const linesForRowHeight = (height: number) =>\n Math.max(MIN_LINES, Math.min(MAX_LINES, Math.floor((height - CHROME) / LINE_PX)))\n\nexport const ROW_MIN = rowHeightForLines(MIN_LINES)\n","/**\n * RowDensityControl\n *\n * Row-height adjuster for the documents AND facts tables. It steps in whole\n * TEXT LINES, not arbitrary pixels: the grid (packages/arbi-blocks GridView)\n * clamps a multiline cell to `floor((rowHeight - chrome) / lineHeight)` lines,\n * so a px-based step smaller than a line would grow the row while revealing only\n * a sliver of the next line (text cut in half). Snapping every value to a line\n * boundary makes each increment add exactly one fully-visible line.\n */\n\nimport { Slider, Tooltip, TooltipTrigger, TooltipContent } from '@arbidocs/react/ui'\nimport { ListChevronsUpDown } from 'lucide-react'\nimport { MIN_LINES, MAX_LINES, linesForRowHeight, rowHeightForLines } from './row-density'\n\ninterface RowDensityControlProps {\n rowHeight: number\n onRowHeightChange: (height: number) => void\n /** Testid stem — \"documents-density\" (default) keeps the original ids. */\n testId?: string\n}\n\nexport function RowDensityControl({\n rowHeight,\n onRowHeightChange,\n testId = 'documents-density',\n}: RowDensityControlProps) {\n const lines = linesForRowHeight(rowHeight)\n const setLines = (next: number) =>\n onRowHeightChange(rowHeightForLines(Math.max(MIN_LINES, Math.min(MAX_LINES, next))))\n\n return (\n <Tooltip delayDuration={300}>\n <TooltipTrigger asChild>\n <div className=\"flex h-7 items-center gap-1.5 rounded-md border border-input px-2 pointer-coarse:h-11\">\n <span className=\"hidden text-xs text-muted-foreground md:inline\">Rows</span>\n <button\n type=\"button\"\n aria-label=\"Shorter rows\"\n data-testid={`${testId}-out`}\n onClick={() => setLines(lines - 1)}\n disabled={lines <= MIN_LINES}\n className=\"flex items-center justify-center text-muted-foreground hover:text-foreground disabled:opacity-40 pointer-coarse:size-11\"\n >\n <ListChevronsUpDown className=\"h-4 w-4\" />\n </button>\n {/* The slider works in LINE units — one notch per line — so it can only\n land on line-boundary heights. */}\n <Slider\n value={[lines]}\n min={MIN_LINES}\n max={MAX_LINES}\n step={1}\n onValueChange={([value]) => setLines(value)}\n aria-label=\"Row height\"\n data-testid={testId}\n className=\"w-20\"\n />\n </div>\n </TooltipTrigger>\n <TooltipContent>\n Row height: {lines} line{lines === 1 ? '' : 's'}\n </TooltipContent>\n </Tooltip>\n )\n}\n","/**\n * Pure helpers that turn the flat document list into a navigable folder tree.\n *\n * Folders are not a backend entity — each document carries a slash-separated\n * `folder` path string (e.g. `\"Reports/Q1\"`, or `null`/`\"\"` for the root).\n * These helpers derive, for a given path, the immediate sub-folders (with\n * descendant counts) and the files that live directly in that folder. Kept\n * pure and side-effect-free so the navigation logic is unit-testable.\n */\n\nimport { extensionFromMime, getDocumentTitle, getFileExtension } from '@arbidocs/react/ui'\n\n/** The fields of a document the folder view reads. */\nexport interface FolderDocument {\n external_id: string\n file_name?: string | null\n file_type?: string | null\n file_size?: number | null\n folder?: string | null\n parent_ext_id?: string | null\n created_at?: string | null\n doc_metadata?: { title?: string | null } | null\n}\n\nexport interface ExplorerFolder {\n kind: 'folder'\n /** The folder's own name (last path segment). */\n name: string\n /** Full path segments from the root, including this folder. */\n path: string[]\n /** Number of documents anywhere beneath this folder. */\n count: number\n}\n\nexport interface ExplorerFile<D extends FolderDocument = FolderDocument> {\n kind: 'file'\n doc: D\n}\n\nexport type ExplorerEntry<D extends FolderDocument = FolderDocument> =\n ExplorerFolder | ExplorerFile<D>\n\nexport type ExplorerSort = 'name' | 'date' | 'size'\n\n/**\n * Display name for a document in the explorer, with its real file extension —\n * the familiar \"Report.pdf\" form. Many documents store an AI-generated display\n * title that drops the extension, so we re-attach it from the stored\n * `file_name` or, failing that, the MIME `file_type`.\n */\nexport function getExplorerDisplayName(doc: FolderDocument): string {\n const title = getDocumentTitle(doc, doc.file_name ?? 'Untitled')\n // Already carries an extension → trust it.\n if (getFileExtension(title)) return title\n const ext = getFileExtension(doc.file_name) || extensionFromMime(doc.file_type)\n return ext ? `${title}.${ext}` : title\n}\n\n/** Split a `Doc.folder` value into trimmed, non-empty path segments. */\nexport function parseFolderSegments(folder?: string | null): string[] {\n if (!folder) return []\n return folder\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n}\n\n/** Join path segments back into a canonical `Doc.folder` string (or null at root). */\nexport function joinFolderPath(segments: string[]): string | null {\n return segments.length > 0 ? segments.join('/') : null\n}\n\n/** True when `segments` starts with every segment of `prefix`. */\nfunction startsWithPath(segments: string[], prefix: string[]): boolean {\n if (segments.length < prefix.length) return false\n for (let i = 0; i < prefix.length; i++) {\n if (segments[i] !== prefix[i]) return false\n }\n return true\n}\n\n/**\n * A document is shown in the explorer unless it belongs to an email family:\n * attachments and archived messages (`parent_ext_id` set) live \"inside\" their\n * email / archive and would otherwise clutter the folder view. Versions are not\n * children — the list holds each document's current version only.\n */\nexport function isExplorerDocument(doc: FolderDocument): boolean {\n return !doc.parent_ext_id\n}\n\n/**\n * Every explorer document that lives anywhere beneath `path` (directly in the\n * folder or in a sub-folder). Used to expand a folder into the documents a\n * folder-level action (select / move / download / delete / rename) applies to —\n * \"act on a folder\" means \"act on everything in it\".\n */\nexport function collectFolderDocs<D extends FolderDocument>(documents: D[], path: string[]): D[] {\n if (path.length === 0) return documents.filter(isExplorerDocument)\n return documents.filter(\n (doc) => isExplorerDocument(doc) && startsWithPath(parseFolderSegments(doc.folder), path)\n )\n}\n\nfunction compareFiles(a: FolderDocument, b: FolderDocument, sort: ExplorerSort): number {\n switch (sort) {\n case 'date': {\n // Newest first.\n const at = a.created_at ? Date.parse(a.created_at) : 0\n const bt = b.created_at ? Date.parse(b.created_at) : 0\n return bt - at\n }\n case 'size': {\n // Largest first.\n return (b.file_size ?? 0) - (a.file_size ?? 0)\n }\n case 'name':\n default:\n return getDocumentTitle(a, a.file_name ?? '').localeCompare(\n getDocumentTitle(b, b.file_name ?? ''),\n undefined,\n { numeric: true, sensitivity: 'base' }\n )\n }\n}\n\n/**\n * Documents in the order the gallery shows them for a sort choice (and its\n * direction toggle). Review mode steps through this same order.\n */\nexport function sortExplorerFiles<D extends FolderDocument>(\n docs: D[],\n sort: ExplorerSort,\n reversed = false\n): D[] {\n const sorted = [...docs].sort((a, b) => compareFiles(a, b, sort))\n return reversed ? sorted.reverse() : sorted\n}\n\n/**\n * Build the folders and files that live directly under `currentPath`.\n *\n * - Files: documents whose folder path exactly equals `currentPath`.\n * - Folders: the distinct next path segment of any document nested deeper than\n * `currentPath`, with `count` = number of documents beneath it.\n *\n * Folders are always sorted by name; files by the requested sort.\n */\nexport function buildExplorerEntries<D extends FolderDocument>(\n documents: D[],\n currentPath: string[],\n sort: ExplorerSort = 'name',\n pendingFolders: string[] = []\n): { folders: ExplorerFolder[]; files: D[] } {\n const folderCounts = new Map<string, number>()\n const files: D[] = []\n\n for (const doc of documents) {\n const segments = parseFolderSegments(doc.folder)\n if (!startsWithPath(segments, currentPath)) continue\n\n if (segments.length === currentPath.length) {\n files.push(doc)\n } else {\n const childName = segments[currentPath.length]\n folderCounts.set(childName, (folderCounts.get(childName) ?? 0) + 1)\n }\n }\n\n // Placeholder (empty) folders the user created that live directly under the\n // current path — surfaced with count 0 so the UI can render them faded. A\n // pending folder that has since gained documents already appears above.\n const childNames = new Set(folderCounts.keys())\n for (const pending of pendingFolders) {\n const segments = parseFolderSegments(pending)\n if (!startsWithPath(segments, currentPath)) continue\n if (segments.length > currentPath.length) childNames.add(segments[currentPath.length])\n }\n\n const folders: ExplorerFolder[] = Array.from(childNames)\n .map((name) => ({\n kind: 'folder' as const,\n name,\n path: [...currentPath, name],\n count: folderCounts.get(name) ?? 0,\n }))\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' }))\n\n files.sort((a, b) => compareFiles(a, b, sort))\n\n return { folders, files }\n}\n\n/**\n * Flat, cross-folder search over every top-level document by title / file name.\n * Used when the explorer search box is non-empty (mirrors real file explorers,\n * which flatten results and ignore the current folder while searching).\n */\nexport function searchExplorerDocuments<D extends FolderDocument>(\n documents: D[],\n query: string,\n sort: ExplorerSort = 'name'\n): D[] {\n const needle = query.trim().toLowerCase()\n if (!needle) return []\n return documents\n .filter((doc) => {\n if (!isExplorerDocument(doc)) return false\n const title = getDocumentTitle(doc, doc.file_name ?? '').toLowerCase()\n const name = (doc.file_name ?? '').toLowerCase()\n return title.includes(needle) || name.includes(needle)\n })\n .sort((a, b) => compareFiles(a, b, sort))\n}\n","/**\n * folderProviderIcon\n *\n * Maps a folder path to the brand mark of the connector that imported it, so\n * connector-created folders (e.g. \"Outlook (jane@arbi.city)\") show their\n * source at a glance. Only the ROOT segment is matched — nested subfolders\n * keep the generic folder icon. Returns null when the root isn't a known\n * provider (including the legacy bare \"Email\" root), letting call sites fall\n * back to their existing folder glyph.\n */\n\nimport { VendorLogo } from '../import/VendorLogo'\n\ntype ProviderLogoProps =\n | { vendorKey: 'gmail' | 'microsoft'; product?: undefined }\n | { vendorKey: string; product: 'onedrive' | 'googledrive' }\n\n/** Roots are formatted \"<Provider> (<account email>)\"; older docs may be bare. */\nconst PROVIDER_PREFIXES: [string, ProviderLogoProps][] = [\n ['Outlook', { vendorKey: 'microsoft' }],\n ['Gmail', { vendorKey: 'gmail' }],\n ['OneDrive', { vendorKey: 'microsoft', product: 'onedrive' }],\n ['Google Drive', { vendorKey: 'gmail', product: 'googledrive' }],\n]\n\nfunction providerForRoot(root: string): ProviderLogoProps | null {\n for (const [prefix, props] of PROVIDER_PREFIXES) {\n if (root.startsWith(prefix)) return props\n }\n return null\n}\n\n/**\n * Provider brand mark for a folder path's root segment, or null when the\n * folder isn't a connector import (call sites render their usual icon).\n */\nexport function FolderProviderIcon({\n folderPath,\n className,\n}: {\n folderPath: string\n className?: string\n}) {\n const root = folderPath.split('/')[0]\n const provider = providerForRoot(root)\n if (!provider) return null\n return (\n <VendorLogo vendorKey={provider.vendorKey} product={provider.product} className={className} />\n )\n}\n\n/** True when the folder path's root segment belongs to a known connector. */\n// eslint-disable-next-line react-refresh/only-export-components\nexport function hasFolderProviderIcon(folderPath: string): boolean {\n return providerForRoot(folderPath.split('/')[0]) !== null\n}\n\n/**\n * Display text for a single folder path segment. Provider roots drop the\n * provider name — the brand mark already says it — leaving just the account:\n * \"Outlook (jane@arbi.city)\" → \"jane@arbi.city\"\n * \"Outlook\" (legacy bare root) → \"\" (the logo stands alone)\n * Non-provider segments are returned unchanged. Stored paths are untouched;\n * this is display-only.\n */\n// eslint-disable-next-line react-refresh/only-export-components\nexport function formatFolderSegment(segment: string): string {\n if (!providerForRoot(segment)) return segment\n const account = segment.match(/\\(([^)]*)\\)/)\n return account ? account[1].trim() : ''\n}\n","/**\n * FolderTreePicker: binds the `FolderTree` block to documents. Builds the hierarchy from each\n * document's folder and gives connector (provider) roots their brand mark and shortened label.\n * Shared by the filter bar popover and MoveToFolderModal.\n */\n\nimport { useMemo } from 'react'\nimport { buildFolderTree } from '@arbidocs/react/ui'\nimport { FolderTree, type FolderTreeNode } from '../FolderPicker'\nimport {\n FolderProviderIcon,\n formatFolderSegment,\n hasFolderProviderIcon,\n} from './FolderProviderIcon'\n\ntype Doc = Parameters<typeof buildFolderTree>[0][number]\n\nexport interface FolderTreePickerProps {\n docs: Doc[]\n /** string = folder path selected, null = Unfiled selected, undefined = nothing selected. */\n value: string | null | undefined\n onChange: (folder: string | null) => void\n showUnfiledAlways?: boolean\n}\n\nexport function FolderTreePicker({\n docs,\n value,\n onChange,\n showUnfiledAlways,\n}: FolderTreePickerProps) {\n const { nodes, unfiledCount } = useMemo(() => buildFolderTree(docs), [docs])\n\n const viewNodes = useMemo<FolderTreeNode[]>(\n () =>\n nodes.map((node) => {\n // Root-level connector folders show the provider's brand mark and drop the provider name\n // from the label (legacy bare roots show the logo alone).\n const isProviderRoot = node.depth === 0 && hasFolderProviderIcon(node.path)\n return {\n ...node,\n label: isProviderRoot ? formatFolderSegment(node.label) : node.label,\n icon: isProviderRoot ? (\n <FolderProviderIcon folderPath={node.path} className=\"h-3.5 w-3.5 shrink-0\" />\n ) : undefined,\n }\n }),\n [nodes]\n )\n\n return (\n <FolderTree\n nodes={viewNodes}\n unfiledCount={unfiledCount}\n value={value}\n onChange={onChange}\n showUnfiledAlways={showUnfiledAlways}\n />\n )\n}\n","/**\n * DocumentsFolderButton\n *\n * The folder-tree filter control: a ghost button showing the active folder,\n * opening a popover with the \"All\" row + the full folder tree picker (and an\n * optional \"New folder\" action). Extracted from DocumentsFilterBar so it can be\n * reused wherever the shared 'documents' folder filter should be adjustable —\n * e.g. above the Smart Search search bar as well as in the filter toolbar.\n *\n * It reads/writes the same `documentFilters` map every consumer shares, so the\n * selected folder scopes the document list and the Smart Search query alike.\n */\n\nimport { useState, useMemo } from 'react'\nimport { FolderPlus } from 'lucide-react'\nimport { FolderFilterButton } from '../bulk/FolderFilterButton'\nimport {\n FolderProviderIcon,\n formatFolderSegment,\n hasFolderProviderIcon,\n} from './FolderProviderIcon'\nimport { FolderTreePicker, type FolderTreePickerProps } from './FolderTreePicker'\n\ntype Doc = FolderTreePickerProps['docs'][number]\ntype FilterState = 'include' | 'exclude' | null\n/** A filter id of the documents list (`folder:<path>` for folders, `folder:none` for unfiled). */\ntype DocumentFilterId = string\n\nexport interface DocumentsFolderButtonProps {\n documents: Doc[]\n documentFilters: Map<DocumentFilterId, FilterState>\n onFiltersChange: (filters: Map<DocumentFilterId, FilterState>) => void\n /** When set, the folder dropdown offers a \"New folder\" action that calls this. */\n onNewFolder?: () => void\n}\n\nexport function DocumentsFolderButton({\n documents,\n documentFilters,\n onFiltersChange,\n onNewFolder,\n}: DocumentsFolderButtonProps) {\n const [folderOpen, setFolderOpen] = useState(false)\n\n const activeFolderFilterId = useMemo(() => {\n for (const [key, state] of documentFilters) {\n if ((key as string).startsWith('folder:') && state === 'include') return key as string\n }\n return null\n }, [documentFilters])\n\n // Selected folder path (raw), or null for All/None. Provider roots render\n // their brand mark in the trigger with the account-only label, matching the\n // dropdown rows.\n const activeFolderPath = useMemo(() => {\n if (!activeFolderFilterId || activeFolderFilterId === 'folder:none') return null\n return activeFolderFilterId.slice('folder:'.length)\n }, [activeFolderFilterId])\n\n const activeFolderLabel = useMemo(() => {\n if (!activeFolderFilterId) return 'All'\n if (activeFolderFilterId === 'folder:none') return 'None'\n const path = activeFolderFilterId.slice('folder:'.length)\n const [root, ...rest] = path.split('/')\n return [formatFolderSegment(root), ...rest].filter(Boolean).join('/')\n }, [activeFolderFilterId])\n\n const handleFolderSelect = (filterId: string) => {\n const newFilters = new Map(documentFilters)\n for (const key of [...newFilters.keys()]) {\n if ((key as string).startsWith('folder:')) newFilters.set(key, null)\n }\n // Picking a folder always selects it, the current one included: this list\n // is navigation, so clicking a folder must mean \"go here\". It used to\n // toggle, which sent a second click on the folder you were already in\n // back to All — and \"All\" is a row right here for when that IS the intent.\n if (filterId !== '__clear__') {\n newFilters.set(filterId as DocumentFilterId, 'include')\n }\n onFiltersChange(newFilters)\n setFolderOpen(false)\n }\n\n return (\n <FolderFilterButton\n label={activeFolderLabel}\n icon={\n activeFolderPath && hasFolderProviderIcon(activeFolderPath) ? (\n <FolderProviderIcon folderPath={activeFolderPath} className=\"h-3.5 w-3.5 shrink-0\" />\n ) : undefined\n }\n isActive={!!activeFolderFilterId}\n open={folderOpen}\n onOpenChange={setFolderOpen}\n allCount={documents.length}\n onSelectAll={() => handleFolderSelect('__clear__')}\n >\n {/* \"New folder\" sits right under \"All\", not below the folder list: the list grows with\n every folder, and a footer action would slide down under the pointer. */}\n {onNewFolder && (\n <>\n <button\n type=\"button\"\n onClick={() => {\n setFolderOpen(false)\n onNewFolder()\n }}\n data-testid=\"explorer-new-folder\"\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground pointer-coarse:min-h-11\"\n >\n <FolderPlus className=\"h-3.5 w-3.5\" />\n New folder\n </button>\n <div className=\"my-1 border-t border-border\" />\n </>\n )}\n <FolderTreePicker\n docs={documents}\n value={\n activeFolderFilterId === 'folder:none'\n ? null\n : activeFolderFilterId\n ? activeFolderFilterId.slice('folder:'.length)\n : undefined\n }\n onChange={(folder) =>\n handleFolderSelect(folder === null ? 'folder:none' : `folder:${folder}`)\n }\n />\n </FolderFilterButton>\n )\n}\n","/**\n * Who may do what to a document, by the workspace role: edit its fields, delete it, change who can\n * see it. The table, the explorer, the bulk actions and the detail pane all ask here, so they agree\n * with each other and with what the server allows.\n */\n\n/** A member's role in a workspace. */\nexport type WorkspaceMemberRole = 'owner' | 'collaborator' | 'guest'\n\n/** The fields of a document its permissions depend on. */\nexport interface OwnedDocument {\n created_by_ext_id?: string | null\n}\n\n/**\n * Whether the current user may flip a document's visibility. Only its creator (or an agent) may:\n * the server rejects anyone else with a 403, so the controls must not offer the toggle.\n */\nexport function canChangeVisibility(\n doc: OwnedDocument | null | undefined,\n currentUserExtId: string | undefined\n): boolean {\n if (!doc || !currentUserExtId) return false\n const isCurrentUserAgent = currentUserExtId.startsWith('agt-')\n const isCreatedByAgent = doc.created_by_ext_id?.startsWith('agt-') ?? false\n return isCurrentUserAgent || isCreatedByAgent || doc.created_by_ext_id === currentUserExtId\n}\n\n/**\n * Whether the current user may edit a document's regular fields (title, author, labels…).\n * Agents and workspace owners/collaborators may edit any document; guests and non-members\n * only their own.\n */\nexport function canEditDocumentFields(\n doc: OwnedDocument | null | undefined,\n currentUserExtId: string | undefined,\n workspaceRole: WorkspaceMemberRole | null\n): boolean {\n if (!doc || !currentUserExtId) return false\n if (currentUserExtId.startsWith('agt-')) return true\n if (workspaceRole === 'owner' || workspaceRole === 'collaborator') return true\n return canChangeVisibility(doc, currentUserExtId)\n}\n\n/**\n * Whether the current user may delete a document. Workspace owners may delete any document;\n * collaborators only their own, since they cannot delete shared content created by others.\n * Guests and non-members may not delete at all.\n */\nexport function canDeleteDocument(\n doc: OwnedDocument | null | undefined,\n currentUserExtId: string | undefined,\n workspaceRole: WorkspaceMemberRole | null\n): boolean {\n if (!doc || !currentUserExtId) return false\n if (workspaceRole === 'owner') return true\n if (workspaceRole === 'collaborator') return doc.created_by_ext_id === currentUserExtId\n return false\n}\n","/** Who can see documents, in words: the bulk bar, the explorer tiles and the upload dialog. */\n\nimport { getEntityLabel, getUserDisplayName, isAgent } from '@arbidocs/react/ui'\nimport type { BlocksEnvironment } from '../provider/environment'\nimport type { ShareState } from '../collaboration/sharing/ShareControl'\nimport type { SharedItem } from '../components/SharedCell'\n\n/** Only whether it is shared matters here; `SharedItem` is one type for the root and `/files`. */\ntype Shareable = Pick<SharedItem, 'shared'>\n\n/** A workspace member as returned by the users endpoint. */\nexport interface WorkspaceMember {\n user: { external_id: string; given_name: string; family_name?: string | null }\n}\n\n/** Names listed in the hide confirmation before the rest are summarised as \"and N more\". */\nconst MAX_NAMES_IN_CONFIRM = 5\n\n/** Visibility of a selection: every item shared, none shared, or a mix. */\nexport function shareStateOf(items: Shareable[]): ShareState {\n if (items.length === 0) return 'private'\n const sharedCount = items.filter((item) => item.shared === true).length\n if (sharedCount === items.length) return 'shared'\n return sharedCount > 0 ? 'mixed' : 'private'\n}\n\n/** Tooltip for the share button: what a click does in the given state. */\nexport function shareTooltipFor(state: ShareState, isSingle: boolean): string {\n const workspace = getEntityLabel('WORKSPACE')\n const subject = isSingle ? '' : ' all'\n if (state === 'shared') return `Hide${subject} from ${workspace} members`\n if (state === 'mixed') return `Make all visible to ${workspace} members (some already shared)`\n return `Make${subject} visible to ${workspace} members`\n}\n\n/**\n * Asks before hiding `count` documents from the workspace. A shared document is visible to every\n * member, so the confirmation names them: that is who loses access. Agents are not people and are\n * left out. Resolves true only when the user confirms.\n */\nexport function confirmHideFromMembers(\n confirm: BlocksEnvironment['confirm'],\n count: number,\n members: WorkspaceMember[]\n): Promise<boolean> {\n const workspace = getEntityLabel('WORKSPACE')\n const documentLabel = getEntityLabel('DOCUMENT', count === 1 ? 'SINGULAR' : 'PLURAL')\n const pronoun = count === 1 ? 'it' : 'them'\n const names = members\n .filter((member) => !isAgent(member.user))\n .map((member) => getUserDisplayName(member.user))\n const shown = names.slice(0, MAX_NAMES_IN_CONFIRM)\n const hiddenCount = names.length - shown.length\n const listed = hiddenCount > 0 ? [...shown, `${hiddenCount} more`] : shown\n const last = listed[listed.length - 1]\n const audienceList =\n listed.length > 2 ? `${listed.slice(0, -1).join(', ')}, and ${last}` : listed.join(' and ')\n const audience = names.length > 0 ? `Right now ${audienceList} can see ${pronoun}. ` : ''\n return confirm({\n message:\n `Hide ${count} ${documentLabel.toLowerCase()} from ${workspace} members? ${audience}` +\n `They will no longer be able to see ${pronoun}.`,\n title: 'Hide from members',\n })\n}\n\n/**\n * Who can see a single file, in plain words: the wording of the upload dialog's ShareToggle, so a\n * file reads the same before and after it is uploaded.\n */\nexport function visibilityAudience(\n shared: boolean,\n workspaceLabel: string = getEntityLabel('WORKSPACE')\n): string {\n return shared ? `Shared with ${workspaceLabel.toLowerCase()}` : 'Private to you'\n}\n\n/** Tooltip for a single file's share toggle: who can see it now, then what a click does. */\nexport function visibilityToggleTooltip(shared: boolean): string {\n const workspace = getEntityLabel('WORKSPACE').toLowerCase()\n return shared\n ? `${visibilityAudience(true)}: everyone in it can see this file. Click to make it private to you.`\n : `${visibilityAudience(false)}: only you can see this file. Click to share it with the ${workspace}.`\n}\n","/**\n * What deleting a document or a workspace does: it goes to Recently deleted (Settings > Storage, and the\n * project's Storage), where it can be restored until it is removed for good 30–60 days later. It keeps using\n * storage until then.\n */\nexport const RECENTLY_DELETED_HINT =\n 'You can restore it from Recently deleted (Settings > Storage) for at least 30 days.'\n\nexport const RECENTLY_DELETED_HINT_PLURAL =\n 'You can restore them from Recently deleted (Settings > Storage) for at least 30 days.'\n","/**\n * Client-side detection of audio/video URLs (YouTube et al. or direct media\n * links) and a preview descriptor for rendering them natively in the\n * URL-upload dialog. Mirrors the backend's media detection (src/core/media_download.py)\n * so the frontend can preview before the file ever hits the backend.\n */\n\nexport type MediaPreview =\n | { kind: 'youtube'; embedUrl: string }\n | { kind: 'video'; src: string }\n | { kind: 'audio'; src: string }\n\nconst MEDIA_HOSTS = [\n 'youtube.com',\n 'youtu.be',\n 'vimeo.com',\n 'soundcloud.com',\n 'dailymotion.com',\n 'twitch.tv',\n]\nconst VIDEO_EXTENSIONS = ['.mp4', '.mpeg', '.mpg', '.webm', '.mov', '.avi', '.mkv', '.ogv']\nconst AUDIO_EXTENSIONS = ['.mp3', '.wav', '.m4a', '.aac', '.flac', '.ogg', '.oga']\n\nfunction normalizeHost(hostname: string): string {\n return hostname.toLowerCase().replace(/^(www|m)\\./, '')\n}\n\nfunction getYoutubeId(url: URL): string | null {\n const host = normalizeHost(url.hostname)\n if (host === 'youtu.be') return url.pathname.slice(1).split('/')[0] || null\n if (host === 'youtube.com' || host.endsWith('.youtube.com')) {\n if (url.pathname === '/watch') return url.searchParams.get('v')\n const segments = url.pathname.split('/').filter(Boolean)\n if (segments[0] === 'embed' || segments[0] === 'shorts' || segments[0] === 'v') {\n return segments[1] ?? null\n }\n }\n return null\n}\n\nfunction getExtension(pathname: string): string {\n const lower = pathname.toLowerCase()\n const lastDot = lower.lastIndexOf('.')\n const lastSlash = lower.lastIndexOf('/')\n return lastDot > lastSlash ? lower.slice(lastDot) : ''\n}\n\n/** Preview descriptor for media URLs we can render natively, otherwise null. */\nexport function getMediaPreview(rawUrl: string): MediaPreview | null {\n let url: URL\n try {\n url = new URL(rawUrl)\n } catch {\n return null\n }\n\n const youtubeId = getYoutubeId(url)\n if (youtubeId) {\n return { kind: 'youtube', embedUrl: `https://www.youtube.com/embed/${youtubeId}` }\n }\n\n const extension = getExtension(url.pathname)\n if (VIDEO_EXTENSIONS.includes(extension)) return { kind: 'video', src: rawUrl }\n if (AUDIO_EXTENSIONS.includes(extension)) return { kind: 'audio', src: rawUrl }\n\n return null\n}\n\n/**\n * True when a URL points at audio/video we should transcribe — including\n * streaming hosts we can't preview inline (e.g. SoundCloud). The backend\n * downloads these via yt-dlp.\n */\nexport function isMediaUrl(rawUrl: string): boolean {\n if (getMediaPreview(rawUrl)) return true\n try {\n const host = normalizeHost(new URL(rawUrl).hostname)\n return MEDIA_HOSTS.some((mediaHost) => host === mediaHost || host.endsWith(`.${mediaHost}`))\n } catch {\n return false\n }\n}\n","/**\n * \"Add from the internet\": web addresses to fetch into the workspace, checked as they are typed\n * (a missing scheme is added, a list pasted at once is split), with a preview of audio and video\n * links. The upload is the caller's; a failure keeps the dialog open with the error.\n */\n\nimport { Button } from '@arbidocs/react/ui'\nimport { useState, type ReactNode } from 'react'\nimport { Link } from 'lucide-react'\nimport { MediaPreviewView, UrlDialogTitle, UrlInputDialogView } from './import/UrlInputDialogView'\nimport { getMediaPreview, isMediaUrl } from './media-preview'\n\nexport interface UrlInputDialogProps {\n /**\n * Handle the submitted URLs. Return `false` (or reject) to keep the dialog open and show the\n * error inline; return void/true to close it. Async handlers are awaited, with a spinner on the\n * submit button while in flight.\n */\n onUrlsSubmit: (urls: string[]) => void | boolean | Promise<void | boolean>\n trigger?: ReactNode\n processing?: boolean\n /** Controlled open state; omit to let the dialog manage its own (trigger) state. */\n open?: boolean\n onOpenChange?: (open: boolean) => void\n /** The workspace the documents go to, named in the title (\"<icon> name / Add from the internet\"). */\n titleWorkspaceName?: string\n /** The workspace's icon beside its name. */\n titleIcon?: ReactNode\n}\n\nexport function UrlInputDialog({\n onUrlsSubmit,\n trigger,\n processing = false,\n open: controlledOpen,\n onOpenChange,\n titleWorkspaceName,\n titleIcon,\n}: UrlInputDialogProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false)\n // Controlled when `open` is provided (opened from the Add dropdown); otherwise\n // the dialog manages its own state via the trigger.\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = (next: boolean) => {\n onOpenChange?.(next)\n if (controlledOpen === undefined) setUncontrolledOpen(next)\n }\n const [urls, setUrls] = useState<string[]>([''])\n const [errors, setErrors] = useState<string[]>([])\n // In-flight + failure state for the dialog-owned upload (so the error shows\n // here, next to the URLs, instead of in a separate modal).\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n\n const preprocessUrl = (url: string): string => {\n let processedUrl = url.trim()\n\n // Add https:// if no protocol is specified\n if (processedUrl && !processedUrl.match(/^https?:\\/\\//i)) {\n processedUrl = 'https://' + processedUrl\n }\n\n // Encode spaces and other special characters in the URL\n // Split URL into parts to handle encoding properly\n try {\n new URL(processedUrl) // Validate URL structure\n // The URL constructor already handles encoding, but we'll ensure spaces are encoded\n processedUrl = processedUrl.replace(/ /g, '%20')\n return processedUrl\n } catch {\n // If URL is still invalid after preprocessing, encode spaces at minimum\n return processedUrl.replace(/ /g, '%20')\n }\n }\n\n const validateUrl = (url: string): { valid: boolean; error?: string } => {\n try {\n const urlObj = new URL(url)\n\n // Audio/video URLs (YouTube, direct media links, etc.) are downloaded and\n // transcribed server-side via yt-dlp — accept them regardless of extension.\n if (isMediaUrl(url)) {\n return { valid: true }\n }\n\n // Check if the URL has a supported file extension or is a web page\n const pathname = urlObj.pathname.toLowerCase()\n const supportedExtensions = [\n '.pdf',\n '.txt',\n '.md',\n '.html',\n '.doc',\n '.docx',\n '.rtf',\n '.ppt',\n '.pptx',\n '.xls',\n '.xlsx',\n // .zip is fetched from the URL by the browser and extracted by the\n // frontend zip worker; each entry is then uploaded as a normal file.\n '.zip',\n ]\n const hasFileExtension =\n pathname.includes('.') && pathname.lastIndexOf('.') > pathname.lastIndexOf('/')\n const hasValidExtension =\n !hasFileExtension || supportedExtensions.some((ext) => pathname.endsWith(ext))\n\n if (!hasValidExtension) {\n return {\n valid: false,\n error:\n 'File type not supported. Supported formats: PDF, DOC(X), PPT(X), XLS(X), RTF, TXT, MD, HTML, ZIP.',\n }\n }\n\n return { valid: true }\n } catch {\n return { valid: false, error: 'Invalid URL format' }\n }\n }\n\n const addUrlField = () => {\n setUrls([...urls, ''])\n setErrors([...errors, ''])\n }\n\n const removeUrlField = (index: number) => {\n setUrls(urls.filter((_, i) => i !== index))\n setErrors(errors.filter((_, i) => i !== index))\n }\n\n const updateUrl = (index: number, value: string) => {\n // Editing clears a prior submit failure so the stale error doesn't linger.\n if (submitError) setSubmitError(null)\n // Check if the value contains multiple URLs (comma or newline separated)\n const delimiters = /[,\\n]+/\n if (delimiters.test(value)) {\n // Split by comma or newline and filter out empty strings\n const urlList = value\n .split(delimiters)\n .map((u) => u.trim())\n .filter((u) => u.length > 0)\n\n if (urlList.length > 1) {\n // Replace current URLs array with the new list\n const newUrls = [...urls]\n newUrls.splice(index, 1, ...urlList)\n\n // Add empty slots if we're adding to the last field and need more\n if (index === urls.length - 1) {\n // Remove the empty last field since we're replacing it\n newUrls.push('')\n }\n\n setUrls(newUrls)\n // Clear errors for new fields\n const newErrors = [...errors]\n urlList.forEach((_, i) => {\n newErrors[index + i] = ''\n })\n setErrors(newErrors)\n return\n }\n }\n\n // Normal single URL update\n const newUrls = [...urls]\n newUrls[index] = value\n setUrls(newUrls)\n\n // Clear error for this field when user types\n if (errors[index]) {\n const newErrors = [...errors]\n newErrors[index] = ''\n setErrors(newErrors)\n }\n }\n\n const handleSubmit = async () => {\n const newErrors: string[] = []\n const validUrls: string[] = []\n\n urls.forEach((url, index) => {\n const trimmedUrl = url.trim()\n if (!trimmedUrl) {\n newErrors[index] = 'URL is required'\n } else {\n // Preprocess the URL to add https:// and encode spaces\n const processedUrl = preprocessUrl(trimmedUrl)\n const validation = validateUrl(processedUrl)\n\n if (!validation.valid) {\n newErrors[index] = validation.error || 'Invalid URL'\n } else {\n newErrors[index] = ''\n validUrls.push(processedUrl)\n }\n }\n })\n\n setErrors(newErrors)\n\n if (validUrls.length > 0 && !newErrors.some((error) => error)) {\n setSubmitError(null)\n setSubmitting(true)\n let ok: void | boolean\n try {\n ok = await onUrlsSubmit(validUrls)\n } catch {\n ok = false\n }\n setSubmitting(false)\n if (ok === false) {\n // Keep the dialog open so the user can fix the URLs and retry.\n setSubmitError('Failed to upload documents from URLs. Please check the URLs and try again.')\n return\n }\n setOpen(false)\n // Reset form\n setUrls([''])\n setErrors([])\n }\n }\n\n // A controlled dialog opened from elsewhere (e.g. the Add dropdown) passes `open` and no\n // trigger; it must NOT fall back to a default \"Add from URL\" button.\n const showTrigger = trigger !== undefined || controlledOpen === undefined\n const title = titleWorkspaceName ? (\n <UrlDialogTitle icon={titleIcon} workspaceName={titleWorkspaceName} />\n ) : undefined\n\n return (\n <UrlInputDialogView\n open={open}\n onOpenChange={setOpen}\n trigger={\n showTrigger\n ? trigger || (\n <Button variant=\"outline\" size=\"sm\" disabled={processing}>\n <Link className=\"w-4 h-4 mr-2\" />\n {processing ? 'Processing...' : 'Add from URL'}\n </Button>\n )\n : undefined\n }\n title={title}\n urls={urls}\n errors={errors}\n onUrlChange={updateUrl}\n onUrlPaste={updateUrl}\n onAddUrl={addUrlField}\n onRemoveUrl={removeUrlField}\n renderPreview={(url, index) => {\n const trimmed = url.trim()\n const preview = trimmed ? getMediaPreview(preprocessUrl(trimmed)) : null\n if (!preview) return null\n return (\n <MediaPreviewView\n kind={preview.kind}\n src={preview.kind === 'youtube' ? preview.embedUrl : preview.src}\n testId={`url-media-preview-${index}`}\n />\n )\n }}\n submitError={submitError}\n isSubmitting={submitting}\n onSubmit={handleSubmit}\n />\n )\n}\n","import { VisibilityToggle, getEntityLabel } from '@arbidocs/react/ui'\nimport { UploadShareNote } from './UploadFooter'\nimport { visibilityAudience } from './visibility'\n\nexport interface ShareToggleProps {\n isVisible: boolean\n onToggle: (visible: boolean) => void\n workspaceEntityLabel: string\n compact?: boolean\n}\n\n/** Visibility choice for an upload, with the plain-language consequence of each state. */\nexport function ShareToggle({\n isVisible,\n onToggle,\n workspaceEntityLabel,\n compact = false,\n}: ShareToggleProps) {\n const doc = getEntityLabel('DOCUMENT', 'PLURAL').toLowerCase()\n const workspace = workspaceEntityLabel.toLowerCase()\n const description = isVisible\n ? `Uploaded ${doc} will be shared with this ${workspace} — everyone in it, now and in the future.`\n : `Uploaded ${doc} stay private to you — not shared with this ${workspace}. You can change this later.`\n\n // The label states who can see the files in plain words, so it doesn't need a hover to read.\n // The inner toggle's own tooltip is off: it would replace the description tooltip above.\n const audience = visibilityAudience(isVisible, workspaceEntityLabel)\n\n const toggle = (\n <VisibilityToggle\n items={{ shared: isVisible }}\n onToggle={onToggle}\n showLabel={true}\n label={audience}\n showTooltip={false}\n />\n )\n\n // The footer is one row next to the Upload button, so there is no room for a card. The short\n // consequence sits under the toggle as visible text: a tooltip would need a hover, which touch\n // and keyboard users never get.\n if (compact) {\n const summary = isVisible\n ? `Everyone in this ${workspace} can see uploaded ${doc}.`\n : `Only you can see uploaded ${doc}.`\n return (\n <div data-testid=\"share-toggle\" className=\"flex max-w-[15rem] flex-col items-end gap-1\">\n {toggle}\n <p className=\"text-right text-xs text-muted-foreground\">{summary}</p>\n </div>\n )\n }\n\n return (\n <UploadShareNote description={description} compact={false}>\n {toggle}\n </UploadShareNote>\n )\n}\n","/**\n * PrivacyExplainerModal Component\n *\n * A short, plain-language explainer of ARBI's privacy guarantees, surfaced from\n * the empty-workspace upload screen. Deliberately NOT a privacy policy — three\n * one-line promises a user can grasp at a glance.\n */\n\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { useState } from 'react'\nimport { KeyRound, Eye, ShieldCheck, BrainCircuit, Info, ChevronRight } from 'lucide-react'\n\nconst POINTS = [\n {\n icon: KeyRound,\n heading: 'Only you hold the key',\n body: 'You choose who to invite to a workspace and the role they hold. Each workspace is encrypted with its own key, held only by its members — so no one outside it, including ARBI administrators, can access its confidential data.',\n },\n {\n icon: Eye,\n heading: 'You decide what to share',\n body: 'Within a workspace, conversations are private by default and documents are shared with collaborators. Anything you keep private stays invisible to other members, even the owner.',\n },\n {\n icon: ShieldCheck,\n heading: 'Your data stays in the UK',\n body: \"By default, the AI that processes your files runs on ARBI's own infrastructure in the United Kingdom. Third-party models (OpenAI, Anthropic or Google) are optional; we select providers with the strongest data-protection terms, but recommend reviewing each provider's data-retention policy before enabling one.\",\n },\n {\n icon: BrainCircuit,\n heading: 'We never train AI on your data',\n body: 'Your files and conversations are never used to train AI models.',\n },\n]\n\nexport function PrivacyExplainerModal() {\n const [open, setOpen] = useState(false)\n\n return (\n <>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n className=\"gap-1.5 text-primary hover:text-primary\"\n data-testid=\"privacy-explainer-button\"\n >\n <Info className=\"w-4 h-4\" />\n Privacy Guarantee\n <ChevronRight className=\"w-3.5 h-3.5 opacity-70\" />\n </Button>\n\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"sm:max-w-lg\" data-testid=\"privacy-explainer-dialog\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <ShieldCheck className=\"h-5 w-5 text-primary\" />\n Your data, your keys\n </DialogTitle>\n <DialogDescription>How ARBI protects confidentiality.</DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-5 py-1\">\n {POINTS.map(({ icon: Icon, heading, body }) => (\n <div key={heading} className=\"flex gap-3\">\n <Icon className=\"mt-0.5 h-5 w-5 shrink-0 text-primary\" />\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-semibold leading-none\">{heading}</p>\n <p className=\"text-sm text-muted-foreground\">{body}</p>\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"flex items-center justify-between gap-2 pt-1\">\n {/* The stable-name whitepaper on arbicity.com (also in its\n sitemap) — unlike the date-stamped copies, this URL survives\n new releases. */}\n <a\n href=\"https://arbicity.com/ARBI-Security-Whitepaper.pdf\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline\"\n data-testid=\"privacy-explainer-whitepaper-link\"\n >\n Full security details →\n </a>\n <Button\n type=\"button\"\n onClick={() => setOpen(false)}\n data-testid=\"privacy-explainer-dismiss\"\n >\n Got it\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n","/**\n * The documents table's columns as data: the ones a new user sees (and their order), the built-in\n * email view's, and the document types the Type column offers.\n */\n\n/** Visible columns, left to right, before any view is saved (or after a reset). */\nexport const DEFAULT_DOCUMENT_COLUMNS: readonly string[] = [\n 'title', // Document (carries its own status glyph)\n 'doc_subject', // Abstract\n 'doc_date', // Date\n 'folder', // Folder\n 'sender', // From\n 'related', // Related\n 'all_tags', // Labels\n 'file_type', // File type\n 'n_pages', // Pages\n 'created_by', // By\n 'created_at', // Uploaded\n 'file_name', // File name\n 'updated_at', // Last modified\n 'file_size', // Size\n]\n\n/** The built-in email view's columns: Date, From, Title, Folder, Related, Labels, Abstract, Status. */\nexport const EMAIL_VIEW_COLUMNS: readonly string[] = [\n 'doc_date',\n 'sender',\n 'title',\n 'folder',\n 'related',\n 'all_tags',\n 'doc_subject',\n 'status',\n]\n\n/** The document types the AI assigns and the Type column offers (the server's own list). */\nexport const DOCUMENT_TYPE_OPTIONS = [\n 'Agreement',\n 'Email',\n 'Letter',\n 'Report',\n 'Decision',\n 'Memo',\n 'Financial',\n 'Form',\n 'Index',\n 'Submission',\n 'Other',\n] as const\n\nexport type DocumentType = (typeof DOCUMENT_TYPE_OPTIONS)[number]\n\n/** The documents table's row height at the built-in views (the compact minimum). */\nexport const DOCUMENTS_ROW_HEIGHT_INITIAL = 28\n/** The row height the \"Default\" density means. */\nexport const DOCUMENTS_ROW_HEIGHT_DEFAULT = 52\n","/**\n * DocumentSearchList\n *\n * The searchable document list of the Review navigator's picker: a search box over the documents,\n * each shown with its file-type icon and title. Hosts wrap it in their own popover.\n */\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@arbidocs/react/ui'\nimport { useMemo, useState } from 'react'\nimport type { NavigatorDocument as Doc } from './types'\nimport { getDocumentTitle, getFileTypeIcon } from '@arbidocs/react/ui'\n\nexport interface DocumentSearchListProps {\n documents: Doc[]\n onSelect: (doc: Doc) => void\n /** Highlighted in bold (e.g. the document open in Review). */\n currentId?: string\n /** The highlighted row, for keyboard navigation (cmdk value). */\n value?: string\n onValueChange?: (value: string) => void\n placeholder?: string\n emptyMessage?: string\n}\n\nexport function DocumentSearchList({\n documents,\n onSelect,\n currentId,\n value,\n onValueChange,\n placeholder = 'Search documents...',\n emptyMessage = 'No documents found',\n}: DocumentSearchListProps): React.ReactElement {\n const [query, setQuery] = useState('')\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase()\n if (!q) return documents\n return documents.filter((d) => getDocumentTitle(d).toLowerCase().includes(q))\n }, [documents, query])\n\n return (\n <Command shouldFilter={false} value={value} onValueChange={onValueChange}>\n <CommandInput placeholder={placeholder} value={query} onValueChange={setQuery} />\n <CommandList className=\"max-h-72\">\n <CommandEmpty>{emptyMessage}</CommandEmpty>\n <CommandGroup>\n {filtered.map((doc) => {\n const isCurrent = doc.external_id === currentId\n const Icon = getFileTypeIcon(doc.file_name, { mime: doc.file_type })\n return (\n <CommandItem\n key={doc.external_id}\n value={doc.external_id}\n onSelect={() => {\n onSelect(doc)\n setQuery('')\n }}\n className={isCurrent ? 'bg-primary/10' : ''}\n data-testid={`document-search-item-${doc.external_id}`}\n >\n <Icon size={14} className=\"shrink-0 text-muted-foreground\" />\n <span\n className={`ml-1.5 flex-1 truncate text-sm ${isCurrent ? 'font-semibold text-primary' : ''}`}\n >\n {getDocumentTitle(doc)}\n </span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n )\n}\n","/**\n * NavDocumentPicker\n *\n * Searchable document switcher shown in the Review/navigator filter-bar\n * strip — lets the user jump directly to any filtered document instead of\n * stepping through prev/next one at a time.\n */\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\nimport { useEffect, useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport type { NavigatorDocument as Doc } from './types'\nimport { DocumentSearchList } from './DocumentSearchList'\nimport { getDocumentTitle, getFileTypeIcon } from '@arbidocs/react/ui'\n\ninterface NavDocumentPickerProps {\n currentDocument: Doc\n documents: Doc[]\n onNavigate: (docId: string) => void\n}\n\nexport function NavDocumentPicker({\n currentDocument,\n documents,\n onNavigate,\n}: NavDocumentPickerProps) {\n const [open, setOpen] = useState(false)\n const [highlightedValue, setHighlightedValue] = useState(currentDocument.external_id)\n\n // Reset highlighted item to current doc each time the popover opens.\n useEffect(() => {\n if (open) setHighlightedValue(currentDocument.external_id)\n }, [open, currentDocument.external_id])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n className=\"w-full h-7 flex items-center gap-1.5 px-2 text-sm rounded-md border border-input bg-background hover:bg-accent transition-colors focus:outline-none focus:ring-1 focus:ring-ring\"\n data-testid=\"nav-document-picker-trigger\"\n >\n {(() => {\n const TriggerIcon = getFileTypeIcon(currentDocument.file_name, {\n mime: currentDocument.file_type,\n })\n return <TriggerIcon size={14} className=\"text-muted-foreground shrink-0\" />\n })()}\n <span className=\"flex-1 min-w-0 truncate text-left\">\n {getDocumentTitle(currentDocument)}\n </span>\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n </button>\n </PopoverTrigger>\n {/* width matches the trigger button via Radix CSS variable */}\n <PopoverContent\n className=\"p-0\"\n style={{ width: 'var(--radix-popover-trigger-width)' }}\n align=\"start\"\n sideOffset={4}\n >\n <DocumentSearchList\n documents={documents}\n currentId={currentDocument.external_id}\n value={highlightedValue}\n onValueChange={setHighlightedValue}\n onSelect={(doc) => {\n onNavigate(doc.external_id)\n setOpen(false)\n }}\n />\n </PopoverContent>\n </Popover>\n )\n}\n","/**\n * NavigatorPickerBar\n *\n * Prev/next + document switcher controls for Review (navigator) mode. Rendered\n * inline as the filter bar's leftActions (before the folder dropdown), so the\n * document navigation and the folder/field controls share a single toolbar.\n *\n * When the document being viewed is filtered/searched out of the list, it stays\n * on screen (we never auto-advance) but its position in the filtered list is -1.\n * Rather than the nonsensical \"0 / N\", the counter shows an explicit\n * \"Not in filter\" flag with a Clear action; Prev/Next still step manually into\n * the matches.\n */\n\nimport { Button, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { ChevronLeft, ChevronRight, FunnelX } from 'lucide-react'\nimport { NavDocumentPicker } from './NavDocumentPicker'\nimport type { NavigatorDocument as Doc } from './types'\n\n/** Same classes as the table navigator's chevron buttons (GridRowNavigator). */\nconst NAV_BUTTON =\n 'rounded p-0.5 text-muted-foreground enabled:hover:bg-accent enabled:hover:text-foreground disabled:opacity-30'\n\ninterface NavigatorPickerBarProps {\n currentDocument: Doc\n documents: Doc[]\n currentIndex: number\n onPrevious: () => void\n onNext: () => void\n onNavigate: (docId: string) => void\n /** Clears the filters + search that hid the viewed doc (shown in the flag). */\n onClearFilters?: () => void\n}\n\nexport function NavigatorPickerBar({\n currentDocument,\n documents,\n currentIndex,\n onPrevious,\n onNext,\n onNavigate,\n onClearFilters,\n}: NavigatorPickerBarProps) {\n // -1 → the viewed doc isn't in the current filtered list.\n const outOfFilter = currentIndex < 0\n const total = documents.length\n\n return (\n <div className=\"flex items-center gap-2 shrink-0\">\n {/* ‹ n / N › styled exactly like the table views' GridRowNavigator, so the\n same control reads the same wherever it appears. */}\n <span className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n aria-label=\"Previous document\"\n className={NAV_BUTTON}\n onClick={onPrevious}\n disabled={outOfFilter ? total === 0 : currentIndex <= 0}\n data-testid=\"filter-bar-nav-previous\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n\n {outOfFilter ? (\n <span\n className=\"flex items-center gap-1 whitespace-nowrap shrink-0\"\n data-testid=\"filter-bar-nav-out-of-filter\"\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"flex items-center gap-1 text-xs font-medium text-amber-600 dark:text-amber-500\">\n <FunnelX className=\"h-3.5 w-3.5\" />\n Not in filter\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <p>This document isn't in the current filter.</p>\n </TooltipContent>\n </Tooltip>\n {onClearFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-1.5 text-xs text-primary hover:text-primary\"\n onClick={onClearFilters}\n data-testid=\"filter-bar-nav-clear-filter\"\n >\n Clear\n </Button>\n )}\n </span>\n ) : (\n <span\n className=\"text-sm font-light whitespace-nowrap tabular-nums text-muted-foreground shrink-0\"\n data-testid=\"filter-bar-nav-counter\"\n >\n {currentIndex + 1} / {total}\n </span>\n )}\n\n <button\n type=\"button\"\n aria-label=\"Next document\"\n className={NAV_BUTTON}\n onClick={onNext}\n disabled={outOfFilter ? total === 0 : currentIndex >= total - 1}\n data-testid=\"filter-bar-nav-next\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </span>\n\n {/* Divider sits right of the ‹ n / N › navigator — the same position the\n filter bar puts it in for Table/Gallery, where the navigator is the\n whole of leftActions. */}\n <span className=\"h-4 w-px bg-border shrink-0\" aria-hidden=\"true\" />\n\n <div className=\"w-56 min-w-0 max-w-full\">\n <NavDocumentPicker\n currentDocument={currentDocument}\n documents={documents}\n onNavigate={onNavigate}\n />\n </div>\n </div>\n )\n}\n","/**\n * ExplorerFileNavigator\n *\n * The Gallery twin of GridRowNavigator: a ‹ n / N › stepper over the files the\n * explorer currently displays (current folder or search result, in its sort\n * order), skipping folder tiles. Stepping selects the file, scrolls its tile\n * into view and opens it in the viewer — the same gesture the table navigator\n * performs on a row, so switching views doesn't change what the arrows do.\n *\n * The position tracks `selectedId` (the doc open in the viewer), falling back\n * to \"– / N\" when nothing is open or the open doc isn't in this folder. A\n * folder-only view keeps a disabled \"– / –\" rather than dropping the control.\n */\n\nimport { RowNavigatorControls } from '../../components/RowNavigatorControls'\n\ninterface ExplorerFileNavigatorProps {\n /** Displayed file ids, in the order the gallery lays them out. */\n fileIds: string[]\n /** The document currently open — where the counter points. */\n selectedId: string | null\n /** Open the file the user stepped to. */\n onSelect: (docId: string) => void\n}\n\nexport function ExplorerFileNavigator({\n fileIds,\n selectedId,\n onSelect,\n}: ExplorerFileNavigatorProps) {\n const index = selectedId ? fileIds.indexOf(selectedId) : -1\n\n const goTo = (target: number) => {\n const clamped = Math.max(0, Math.min(fileIds.length - 1, target))\n const docId = fileIds[clamped]\n if (docId) onSelect(docId)\n }\n\n return (\n <RowNavigatorControls\n total={fileIds.length}\n currentIndex={index >= 0 ? index : null}\n onGo={goTo}\n testId=\"documents-explorer\"\n itemLabel=\"document\"\n keepWhenEmpty\n />\n )\n}\n"]}
|