@arbidocs/blocks 0.4.154 → 0.4.156

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/{ConnectedNativeDocxComparison-OLWRQSRS.js → ConnectedNativeDocxComparison-2PLOOXSH.js} +7 -7
  2. package/dist/{ConnectedNativeDocxComparison-OLWRQSRS.js.map → ConnectedNativeDocxComparison-2PLOOXSH.js.map} +1 -1
  3. package/dist/{ConnectedNativeDocxComparison-YORMOPPN.cjs → ConnectedNativeDocxComparison-S25BPUH5.cjs} +8 -8
  4. package/dist/{ConnectedNativeDocxComparison-YORMOPPN.cjs.map → ConnectedNativeDocxComparison-S25BPUH5.cjs.map} +1 -1
  5. package/dist/{ConnectedNativeDocxEditor-34EBIIFS.js → ConnectedNativeDocxEditor-JJAGMHZC.js} +5 -5
  6. package/dist/{ConnectedNativeDocxEditor-34EBIIFS.js.map → ConnectedNativeDocxEditor-JJAGMHZC.js.map} +1 -1
  7. package/dist/{ConnectedNativeDocxEditor-EHTWGGX3.cjs → ConnectedNativeDocxEditor-YA4HWLY4.cjs} +7 -7
  8. package/dist/{ConnectedNativeDocxEditor-EHTWGGX3.cjs.map → ConnectedNativeDocxEditor-YA4HWLY4.cjs.map} +1 -1
  9. package/dist/{ConnectedStreamedWordArtifact-5DK6QGYN.cjs → ConnectedStreamedWordArtifact-EXYZAU4Y.cjs} +8 -8
  10. package/dist/ConnectedStreamedWordArtifact-EXYZAU4Y.cjs.map +1 -0
  11. package/dist/{ConnectedStreamedWordArtifact-GLIDLSAS.js → ConnectedStreamedWordArtifact-YAAXY5KY.js} +7 -7
  12. package/dist/{ConnectedStreamedWordArtifact-GLIDLSAS.js.map → ConnectedStreamedWordArtifact-YAAXY5KY.js.map} +1 -1
  13. package/dist/{NativeDocxEditor-XT5ZLFGU.js → NativeDocxEditor-JBQMH3MP.js} +3 -3
  14. package/dist/{NativeDocxEditor-XT5ZLFGU.js.map → NativeDocxEditor-JBQMH3MP.js.map} +1 -1
  15. package/dist/{NativeDocxEditor-5VBNM5I7.cjs → NativeDocxEditor-M3I776GD.cjs} +7 -7
  16. package/dist/{NativeDocxEditor-5VBNM5I7.cjs.map → NativeDocxEditor-M3I776GD.cjs.map} +1 -1
  17. package/dist/agents/index.cjs +238 -238
  18. package/dist/agents/index.js +4 -4
  19. package/dist/chat/index.cjs +1 -1
  20. package/dist/chat/index.js +1 -1
  21. package/dist/{chunk-MF5KQ4PS.js → chunk-2CWM2CFZ.js} +4 -4
  22. package/dist/{chunk-MF5KQ4PS.js.map → chunk-2CWM2CFZ.js.map} +1 -1
  23. package/dist/{chunk-QKR5LWDO.js → chunk-6HG56GCT.js} +4 -4
  24. package/dist/{chunk-QKR5LWDO.js.map → chunk-6HG56GCT.js.map} +1 -1
  25. package/dist/chunk-6HMCF4AJ.js +1720 -0
  26. package/dist/chunk-6HMCF4AJ.js.map +1 -0
  27. package/dist/{chunk-KHXEIEXN.js → chunk-7IRSCMNK.js} +3 -3
  28. package/dist/{chunk-KHXEIEXN.js.map → chunk-7IRSCMNK.js.map} +1 -1
  29. package/dist/{chunk-TZOQKV64.js → chunk-EWCJXUBP.js} +3 -3
  30. package/dist/{chunk-TZOQKV64.js.map → chunk-EWCJXUBP.js.map} +1 -1
  31. package/dist/{chunk-CU6LDQ57.js → chunk-F3EZDBDJ.js} +4 -4
  32. package/dist/{chunk-CU6LDQ57.js.map → chunk-F3EZDBDJ.js.map} +1 -1
  33. package/dist/{chunk-YF3QUHKN.cjs → chunk-FEGXFABZ.cjs} +3 -3
  34. package/dist/{chunk-YF3QUHKN.cjs.map → chunk-FEGXFABZ.cjs.map} +1 -1
  35. package/dist/{chunk-GC2FSPSQ.cjs → chunk-HDJRSCRE.cjs} +6 -6
  36. package/dist/{chunk-GC2FSPSQ.cjs.map → chunk-HDJRSCRE.cjs.map} +1 -1
  37. package/dist/{chunk-CQCNU5KT.cjs → chunk-IJEISII2.cjs} +6 -6
  38. package/dist/{chunk-CQCNU5KT.cjs.map → chunk-IJEISII2.cjs.map} +1 -1
  39. package/dist/{chunk-NPR5BGFF.cjs → chunk-JSQEAPTC.cjs} +26 -14
  40. package/dist/chunk-JSQEAPTC.cjs.map +1 -0
  41. package/dist/{chunk-BDA3RHYD.cjs → chunk-MUDEL7UL.cjs} +25 -884
  42. package/dist/chunk-MUDEL7UL.cjs.map +1 -0
  43. package/dist/{chunk-6QAAIDQQ.cjs → chunk-O3FB62T5.cjs} +47 -47
  44. package/dist/{chunk-6QAAIDQQ.cjs.map → chunk-O3FB62T5.cjs.map} +1 -1
  45. package/dist/{chunk-265GOG4W.js → chunk-ONTUMV74.js} +26 -14
  46. package/dist/chunk-ONTUMV74.js.map +1 -0
  47. package/dist/chunk-OTU5KGQ6.cjs +18 -0
  48. package/dist/{chunk-HUATKA3M.cjs.map → chunk-OTU5KGQ6.cjs.map} +1 -1
  49. package/dist/{chunk-GO3BN76C.js → chunk-PGOSIJ2I.js} +3 -3
  50. package/dist/{chunk-GO3BN76C.js.map → chunk-PGOSIJ2I.js.map} +1 -1
  51. package/dist/chunk-S74QMZVZ.cjs +18 -0
  52. package/dist/{chunk-C3SMTA3C.cjs.map → chunk-S74QMZVZ.cjs.map} +1 -1
  53. package/dist/{chunk-KUT2Y7JF.cjs → chunk-TQIY2SVY.cjs} +5 -5
  54. package/dist/{chunk-KUT2Y7JF.cjs.map → chunk-TQIY2SVY.cjs.map} +1 -1
  55. package/dist/{chunk-MNG7N6M2.js → chunk-UKCCV63X.js} +4 -4
  56. package/dist/{chunk-MNG7N6M2.js.map → chunk-UKCCV63X.js.map} +1 -1
  57. package/dist/{chunk-B3FMUFAW.cjs → chunk-UKT3WH5Z.cjs} +3 -3
  58. package/dist/{chunk-B3FMUFAW.cjs.map → chunk-UKT3WH5Z.cjs.map} +1 -1
  59. package/dist/{chunk-P6RIBIVN.js → chunk-UPMADXDU.js} +3 -3
  60. package/dist/{chunk-P6RIBIVN.js.map → chunk-UPMADXDU.js.map} +1 -1
  61. package/dist/{chunk-757OYF6G.cjs → chunk-VY4UFXTM.cjs} +4 -4
  62. package/dist/{chunk-757OYF6G.cjs.map → chunk-VY4UFXTM.cjs.map} +1 -1
  63. package/dist/{chunk-RE7NULEY.js → chunk-W7CWGURO.js} +28 -873
  64. package/dist/chunk-W7CWGURO.js.map +1 -0
  65. package/dist/chunk-WV4TD2HZ.cjs +1785 -0
  66. package/dist/chunk-WV4TD2HZ.cjs.map +1 -0
  67. package/dist/{chunk-WU34CHU5.js → chunk-YMQDDUKW.js} +3 -3
  68. package/dist/{chunk-WU34CHU5.js.map → chunk-YMQDDUKW.js.map} +1 -1
  69. package/dist/connect/docx.cjs +11 -11
  70. package/dist/connect/docx.js +7 -7
  71. package/dist/connect/index.cjs +1313 -151
  72. package/dist/connect/index.cjs.map +1 -1
  73. package/dist/connect/index.d.ts +1 -0
  74. package/dist/connect/index.js +1175 -27
  75. package/dist/connect/index.js.map +1 -1
  76. package/dist/connect/viewer.cjs +48 -52
  77. package/dist/connect/viewer.cjs.map +1 -1
  78. package/dist/connect/viewer.js +10 -14
  79. package/dist/connect/viewer.js.map +1 -1
  80. package/dist/connection/files/DocumentSyncGlyph.d.ts +28 -0
  81. package/dist/connection/files/explorer/ConnectedFilesExplorer.d.ts +56 -0
  82. package/dist/connection/files/explorer/FileTiles.d.ts +87 -0
  83. package/dist/connection/files/index.d.ts +5 -0
  84. package/dist/connection/files/store.d.ts +27 -0
  85. package/dist/connection/files/support.d.ts +38 -0
  86. package/dist/document-tools/index.cjs +1 -1
  87. package/dist/document-tools/index.js +1 -1
  88. package/dist/docx/index.cjs +47 -47
  89. package/dist/docx/index.js +3 -3
  90. package/dist/facts/index.cjs +54 -54
  91. package/dist/facts/index.js +4 -4
  92. package/dist/files/DocStatusIcon.d.ts +5 -4
  93. package/dist/files/FailedStageIcon.d.ts +26 -0
  94. package/dist/files/folders/FolderProviderIcon.d.ts +29 -0
  95. package/dist/files/folders/folderPaths.d.ts +86 -0
  96. package/dist/files/folders/index.d.ts +2 -0
  97. package/dist/files/index.cjs +326 -238
  98. package/dist/files/index.d.ts +5 -0
  99. package/dist/files/index.js +2 -2
  100. package/dist/files/permissions.d.ts +28 -0
  101. package/dist/files/recently-deleted.d.ts +7 -0
  102. package/dist/files/visibility.d.ts +31 -0
  103. package/dist/index.cjs +371 -371
  104. package/dist/index.js +10 -10
  105. package/dist/studio/index.cjs +1 -1
  106. package/dist/studio/index.js +1 -1
  107. package/dist/workflow-canvas/index.cjs +16 -16
  108. package/dist/workflow-canvas/index.js +4 -4
  109. package/node_modules/@arbidocs/coedit/dist/hocuspocus.cjs +96 -29
  110. package/node_modules/@arbidocs/coedit/dist/hocuspocus.cjs.map +1 -1
  111. package/node_modules/@arbidocs/coedit/dist/hocuspocus.d.cts +1 -1
  112. package/node_modules/@arbidocs/coedit/dist/hocuspocus.d.ts +1 -1
  113. package/node_modules/@arbidocs/coedit/dist/hocuspocus.js +98 -31
  114. package/node_modules/@arbidocs/coedit/dist/hocuspocus.js.map +1 -1
  115. package/node_modules/@arbidocs/coedit/dist/index.cjs +96 -29
  116. package/node_modules/@arbidocs/coedit/dist/index.cjs.map +1 -1
  117. package/node_modules/@arbidocs/coedit/dist/index.d.cts +1 -1
  118. package/node_modules/@arbidocs/coedit/dist/index.d.ts +1 -1
  119. package/node_modules/@arbidocs/coedit/dist/index.js +98 -31
  120. package/node_modules/@arbidocs/coedit/dist/index.js.map +1 -1
  121. package/node_modules/@arbidocs/coedit/dist/server.cjs +98 -33
  122. package/node_modules/@arbidocs/coedit/dist/server.cjs.map +1 -1
  123. package/node_modules/@arbidocs/coedit/dist/server.d.cts +1 -1
  124. package/node_modules/@arbidocs/coedit/dist/server.d.ts +1 -1
  125. package/node_modules/@arbidocs/coedit/dist/server.js +99 -34
  126. package/node_modules/@arbidocs/coedit/dist/server.js.map +1 -1
  127. package/node_modules/@arbidocs/coedit/dist/{session-Cf9iu1Vt.d.cts → session-WGvWs6yO.d.cts} +22 -4
  128. package/node_modules/@arbidocs/coedit/dist/{session-Cf9iu1Vt.d.ts → session-WGvWs6yO.d.ts} +22 -4
  129. package/node_modules/@arbidocs/coedit/package.json +1 -1
  130. package/package.json +6 -5
  131. package/dist/ConnectedStreamedWordArtifact-5DK6QGYN.cjs.map +0 -1
  132. package/dist/chunk-265GOG4W.js.map +0 -1
  133. package/dist/chunk-BDA3RHYD.cjs.map +0 -1
  134. package/dist/chunk-C3SMTA3C.cjs +0 -18
  135. package/dist/chunk-HUATKA3M.cjs +0 -18
  136. package/dist/chunk-JGOST4IL.js +0 -648
  137. package/dist/chunk-JGOST4IL.js.map +0 -1
  138. package/dist/chunk-NPR5BGFF.cjs.map +0 -1
  139. package/dist/chunk-RE7NULEY.js.map +0 -1
  140. package/dist/chunk-YAEXSCUW.cjs +0 -677
  141. package/dist/chunk-YAEXSCUW.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/FilesToolbar.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/TagPassagePanel.tsx","../src/files/page/FilesAddMenu.tsx","../src/files/page/FilesPageTitle.tsx","../src/files/import/ImportParts.tsx","../src/files/import/TaskSection.tsx","../src/files/import/UrlInputDialogView.tsx","../src/files/cells/RelatedDocsCell.tsx","../src/files/cells/DocumentNameCell.tsx","../src/files/cells/TagColumnParts.tsx","../src/files/cells/BulkLabelSelect.tsx","../src/files/bulk/BulkActionsBar.tsx","../src/files/tags/TagManager.tsx","../src/files/tags/DocTagPopover.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/DocStatusIcon.tsx"],"names":["jsxs","testIdOr","cn","jsx","FilterInput","AlertCircle","Button","X","FolderOpen","Progress","Loader2","Upload","FileText","FolderPlus","Globe","Badge","Download","Copy","FolderInput","ModalSection","ModalSectionTitle","RadioGroup","RadioGroupItem","Label","ScrollArea","Users","CheckCircle2","AlertTriangle","XCircle","Checkbox","Info","RotateCcw","Share2","Fragment","ImagePlus","Crop","ChevronLeft","ChevronRight","ZoomIn","memo","HtmlPassage","Tags","StickyNote","useMemo","getEntityColor","Dialog","DialogContent","ModalHeader","DialogTitle","DialogDescription","GridView","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","useState","useRef","IconToggle","CopyX","Sparkles","Textarea","hasNote","prefixedTestId","Check","useEffect","ChevronDown","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuSeparator","DropdownMenuItem","ExternalLink","Square","RefreshCw","Settings","Unplug","LoaderCircle","Hourglass","CircleSlash","CheckCircle","DialogTrigger","Input","Plus","ArrowRightLeft","Popover","PopoverTrigger","CornerDownRight","CornerRightDown","GitFork","Blend","PopoverContent","Trash2","MoreVertical","SquarePen","BookOpen","MessagesSquare","Pencil","FileDown","CheckboxCell","TagColumnHeader","SquareCheckBig","LabelPickerList","SelectionBar","SelectionBarAction","NotebookPen","ShareControl","MoreHorizontal","ArrowRightFromLine","Hash","ArrowDownToLine","TagIcon","List","Folder","Search","Calendar","Bot","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Switch","ModalBreadcrumbHeader","ToneBadge","formatCount","DialogHeader","Columns3","Command","CommandList","CommandGroup","Save","CommandItem","CommandSeparator","Undo2","CheckIcon","ArrowUpDown","getTagTypeIcon","PencilLine","FolderUp","BookMarked","useCallback","ChevronsUpDown","CommandInput","CommandEmpty","Table2","FileX","FailedStageIcon"],"mappings":"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","file":"chunk-MUDEL7UL.cjs","sourcesContent":["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","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'\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\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: 'Files uploaded successfully. ARBI is now indexing them in the background.',\n afterUpload: 'After upload completes, ARBI will index files in the background.',\n}\n\nfunction mergeUploadLabels(labels?: Partial<UploadPartsLabels>): UploadPartsLabels {\n return {\n ...DEFAULT_UPLOAD_PARTS_LABELS,\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 if (files.length === 0) return null\n const l = mergeUploadLabels(labels)\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 if (files.length === 0) return null\n const l = mergeUploadLabels(labels)\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 = mergeUploadLabels(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 Share2,\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 shared: string\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 shared: 'Shared',\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 /** Shows the small shared marker. */\n shared?: boolean\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 labels?: Partial<ViewerLabels>\n /** Overrides the shared-marker test id (default `document-title-shared-indicator`). */\n sharedTestId?: string\n}\n\n/** Read-only document name (plain text, no fill) with the shared marker and version label. */\nexport function ViewerTitle({\n title,\n shared,\n versionLabel,\n shrink,\n labels,\n sharedTestId,\n}: ViewerTitleProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\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 {shared && (\n <span\n title={l.shared}\n className=\"flex shrink-0 items-center\"\n data-testid={testIdOr(sharedTestId, { testId: 'document-title-shared-indicator' })}\n >\n <Share2 aria-label={l.shared} className=\"size-3.5 text-muted-foreground\" />\n </span>\n )}\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 )}\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\nexport interface 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. */\nexport function 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 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 { Loader2 } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\nexport interface FilesPageTitleProps {\n /** Page name (default \"Files\"). */\n label?: string\n /** Number of files after filtering. */\n count: number\n /** Filters are narrowing the list: the count is \"of the filtered set\". */\n isFiltered?: boolean\n /** The workspace is still indexing files. */\n isProcessing?: boolean\n /** Makes the title a button (e.g. back to the last file view from Smart Search). */\n onClick?: () => void\n /** Word shown after the count while filtered (default \"filtered\"). */\n filteredLabel?: string\n className?: string\n /** Overrides the title test id (default `documents-tab`). */\n testId?: string\n /** Overrides the count test id (default `tab-count`). */\n countTestId?: string\n}\n\n/**\n * The Files page title: \"Files\" with the file count as a quiet pill. Replaces the old single\n * header tab; it is the page's heading, so the one primary action (Add) can sit opposite it.\n */\nexport function FilesPageTitle({\n label = 'Files',\n count,\n isFiltered,\n isProcessing,\n onClick,\n filteredLabel = 'filtered',\n className,\n testId,\n countTestId,\n}: FilesPageTitleProps) {\n const body = (\n <>\n <span>{label}</span>\n <span\n data-testid={testIdOr(countTestId, { testId: 'tab-count' })}\n className=\"inline-flex h-6 min-w-6 items-center justify-center rounded-full bg-muted px-2 text-xs font-medium tabular-nums text-muted-foreground\"\n >\n {count}\n </span>\n {isFiltered && (\n <span className=\"text-xs font-normal text-muted-foreground\">{filteredLabel}</span>\n )}\n {isProcessing && (\n <Loader2 className=\"size-3.5 animate-spin text-muted-foreground\" aria-hidden />\n )}\n </>\n )\n const classes = cn(\n 'inline-flex min-w-0 items-center gap-2 text-xl font-semibold leading-8 text-foreground',\n className\n )\n return (\n <h1 data-slot=\"files-page-title\" className=\"m-0 min-w-0 font-semibold\">\n {onClick ? (\n <button\n type=\"button\"\n onClick={onClick}\n data-testid={testIdOr(testId, { testId: 'documents-tab' })}\n className={cn(\n classes,\n 'rounded-md pointer-coarse:-mx-2 pointer-coarse:min-h-11 pointer-coarse:px-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring'\n )}\n >\n {body}\n </button>\n ) : (\n <span data-testid={testIdOr(testId, { testId: 'documents-tab' })} className={classes}>\n {body}\n </span>\n )}\n </h1>\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 /** The single family action: Connect when disconnected, Reconnect when re-consent is due. */\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] = {\n connect: [l.connect, l.connect],\n reconnect: [l.reconnect, l.reconnecting],\n disconnect: [l.disconnect, l.disconnecting],\n }[action]\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 <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 </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","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 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 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 <ActionButton\n icon={Trash2}\n label=\"Delete\"\n destructive\n onClick={() => {\n onDelete(doc)\n setOpen(false)\n }}\n />\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 <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 </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 onReview: () => void\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 <DropdownMenuItem onSelect={onReview}>\n <BookOpen className=\"mr-2 h-4 w-4\" />\n Open in Review\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={onDocumentChat}>\n <MessagesSquare className=\"mr-2 h-4 w-4\" />\n Document chat\n </DropdownMenuItem>\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, 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","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 onChat: () => void\n onAnnotate: () => void\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 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 <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 {isMember && (\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 <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 {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 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 <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 <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 <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 {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 { ComponentProps, ReactNode } from 'react'\nimport { ChevronDown, ChevronRight, Plus, Tag as TagIcon, Trash2 } from 'lucide-react'\nimport { Badge, Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the tag manager. Pass a partial `labels` to translate or reword. */\nexport interface TagManagerLabels {\n addNew: (singular: string) => string\n newField: string\n zeroItems: string\n item: string\n items: string\n delete: string\n none: (pluralLower: string) => string\n close: string\n}\n\nexport const DEFAULT_TAG_MANAGER_LABELS: TagManagerLabels = {\n addNew: (singular) => `Add New ${singular}`,\n newField: 'New Field',\n zeroItems: '0 items',\n item: 'item',\n items: 'items',\n delete: 'Delete',\n none: (pluralLower) => `No custom ${pluralLower} yet`,\n close: 'Close',\n}\n\n/** One existing field row of the tag manager. */\nexport interface TagManagerItem {\n id: string\n /** Number of documents that use the field. */\n usageCount: number\n /** Only the creator may delete the field. */\n canDelete: boolean\n isEditing: boolean\n /** The field's pill (host-rendered so it can carry the rich tooltip). */\n badge: ReactNode\n /** Share toggle, rendered next to the usage count. */\n visibilityToggle?: ReactNode\n /** Inline edit form, rendered while `isEditing`. */\n form?: ReactNode\n}\n\nexport interface TagManagerProps extends Omit<ComponentProps<'div'>, 'children'> {\n items: TagManagerItem[]\n /** Singular entity label, e.g. \"Field\". */\n singularLabel: string\n /** Plural entity label, e.g. \"Fields\". */\n pluralLabel: string\n isCreating: boolean\n /** The inline create form, rendered while `isCreating`. */\n createForm?: ReactNode\n /** Colour of the placeholder pill shown while creating. */\n placeholderColor: string\n onStartCreate: () => void\n onCancel: () => void\n onToggleItem: (id: string) => void\n onDeleteItem: (id: string) => void\n /** Renders a footer \"Close\" button when set. */\n onClose?: () => void\n labels?: Partial<TagManagerLabels>\n /** Overrides the per-row delete button test id (default `tag-editor-delete-button`). */\n deleteTestId?: string\n}\n\n/**\n * TagManager: the list of a workspace's custom fields with an \"Add new\" row on top, expandable\n * inline edit forms and a usage count per field. Presentational: the host owns the forms.\n */\nexport function TagManager({\n items,\n singularLabel,\n pluralLabel,\n isCreating,\n createForm,\n placeholderColor,\n onStartCreate,\n onCancel,\n onToggleItem,\n onDeleteItem,\n onClose,\n labels,\n deleteTestId,\n className,\n ...props\n}: TagManagerProps) {\n const l = { ...DEFAULT_TAG_MANAGER_LABELS, ...labels }\n return (\n <div data-slot=\"tag-manager\" className={cn('contents', className)} {...props}>\n <div className=\"space-y-2 pt-4\">\n <div\n data-slot=\"tag-manager-create\"\n className={cn(\n 'rounded-lg bg-muted transition-colors',\n isCreating ? 'ring-1 ring-primary' : 'hover:bg-accent'\n )}\n >\n {!isCreating ? (\n <button\n type=\"button\"\n onClick={onStartCreate}\n className=\"flex w-full items-center gap-2 p-3 text-sm font-medium text-primary hover:text-primary/80 pointer-coarse:min-h-11\"\n >\n <Plus className=\"size-4\" />\n {l.addNew(singularLabel)}\n </button>\n ) : (\n <>\n <div className=\"flex items-center gap-2 p-3\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left\"\n >\n <ChevronDown className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n <span\n className=\"inline-flex flex-shrink-0 items-center gap-1.5 whitespace-nowrap rounded-full px-3 py-1 text-sm font-medium text-white\"\n style={{ backgroundColor: placeholderColor }}\n >\n <TagIcon className=\"size-4\" />\n {l.newField}\n </span>\n </button>\n <Badge variant=\"outline\" className=\"flex-shrink-0 whitespace-nowrap font-normal\">\n {l.zeroItems}\n </Badge>\n </div>\n <div className=\"border-t border-border\">{createForm}</div>\n </>\n )}\n </div>\n\n {items.map((item) => (\n <div\n key={item.id}\n data-slot=\"tag-manager-item\"\n className={cn('rounded-lg transition-colors', item.isEditing && 'ring-1 ring-primary')}\n >\n <div\n className={cn(\n 'flex items-center gap-2 rounded-lg p-3',\n item.isEditing ? 'bg-accent' : 'bg-muted'\n )}\n >\n <button\n type=\"button\"\n onClick={() => onToggleItem(item.id)}\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left\"\n >\n {item.isEditing ? (\n <ChevronDown className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n )}\n {item.badge}\n </button>\n\n {item.visibilityToggle && (\n <div className=\"flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\n {item.visibilityToggle}\n </div>\n )}\n\n <Badge variant=\"outline\" className=\"flex-shrink-0 whitespace-nowrap font-normal\">\n {item.usageCount} {item.usageCount === 1 ? l.item : l.items}\n </Badge>\n\n {item.canDelete && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n onDeleteItem(item.id)\n }}\n className=\"size-7 flex-shrink-0 p-0 text-destructive hover:text-destructive pointer-coarse:size-11\"\n data-testid={testIdOr(deleteTestId, { testId: 'tag-editor-delete-button' })}\n aria-label={l.delete}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {item.isEditing && <div className=\"border-t border-border\">{item.form}</div>}\n </div>\n ))}\n\n {items.length === 0 && !isCreating && (\n <div className=\"py-4 text-center text-muted-foreground\">\n <p className=\"text-sm\">{l.none(pluralLabel.toLowerCase())}</p>\n </div>\n )}\n </div>\n\n {onClose && (\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 border-t pt-4\">\n <Button variant=\"outline\" onClick={onClose}>\n {l.close}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport {\n Bot,\n Calendar,\n Check,\n ChevronLeft,\n ChevronRight,\n Folder,\n Hash,\n List,\n Plus,\n Search,\n SquareCheckBig,\n StickyNote,\n} from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport {\n Button,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\n\n/** Every fixed string of the document tag popover parts. Pass a partial `labels` to translate or reword. */\nexport interface DocTagLabels {\n annotations: string\n previousDocument: string\n nextDocument: string\n removeTag: (name: string) => string\n addTag: (name: string) => string\n addNote: string\n noneYet: (pluralLower: string) => string\n create: (singularLower: string) => string\n createNew: (singularLower: string) => string\n unsavedChanges: string\n cancel: string\n apply: string\n}\n\nexport const DEFAULT_DOC_TAG_LABELS: DocTagLabels = {\n annotations: 'Annotations',\n previousDocument: 'Previous document',\n nextDocument: 'Next document',\n removeTag: (name) => `Remove \"${name}\" tag`,\n addTag: (name) => `Add \"${name}\" tag`,\n addNote: 'Add a note...',\n noneYet: (pluralLower) => `No ${pluralLower} yet.`,\n create: (singularLower) => `Create ${singularLower}`,\n createNew: (singularLower) => `Create new ${singularLower}`,\n unsavedChanges: 'Unsaved changes',\n cancel: 'Cancel',\n apply: 'Apply',\n}\n\nconst TAG_TYPE_ICONS: Record<string, LucideIcon> = {\n checkbox: SquareCheckBig,\n select: List,\n number: Hash,\n text: StickyNote,\n folder: Folder,\n search: Search,\n date: Calendar,\n assistant: Bot,\n}\n\n/** A field (tag) the popover can edit. `type` drives the control; `color` the icon chip. */\nexport interface DocTagField {\n id: string\n name: string\n type: string\n color: string\n /** Options of a `select` field. */\n options?: string[]\n}\n\n/** Small coloured chip with the field type's icon. */\nexport function DocTagFieldIcon({\n type,\n color,\n size = 12,\n}: {\n type: string\n color: string\n size?: number\n}) {\n const Icon = TAG_TYPE_ICONS[type] || StickyNote\n return (\n <span\n data-slot=\"doc-tag-field-icon\"\n className=\"inline-flex flex-shrink-0 items-center justify-center rounded p-0.5 text-white\"\n style={{ backgroundColor: color }}\n >\n <Icon size={size} className=\"flex-shrink-0\" />\n </span>\n )\n}\n\nexport interface DocTagPopoverProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The trigger element (wrapped in a span). */\n trigger: ReactNode\n /** Header content (breadcrumb and document navigator). */\n header: ReactNode\n /** Footer, shown only when set (unsaved changes). */\n footer?: ReactNode\n children: ReactNode\n /** Test id of the popover content (none by default). */\n testId?: string\n}\n\n/** Popover shell for editing one document's fields: header, scrolling body, optional footer. */\nexport function DocTagPopover({\n open,\n onOpenChange,\n trigger,\n header,\n footer,\n children,\n testId,\n}: DocTagPopoverProps) {\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <span>{trigger}</span>\n </PopoverTrigger>\n <PopoverContent\n data-slot=\"doc-tag-popover\"\n data-testid={testId}\n className=\"flex max-h-[500px] w-[380px] max-w-[calc(100vw-2rem)] flex-col p-0\"\n align=\"start\"\n >\n <div className=\"flex flex-shrink-0 items-center justify-between gap-2 border-b border-border px-3 py-2\">\n {header}\n </div>\n <div className=\"flex-1 overflow-auto p-3\">{children}</div>\n {footer && <div className=\"flex-shrink-0 border-t border-border p-3\">{footer}</div>}\n </PopoverContent>\n </Popover>\n )\n}\n\nexport interface DocTagBreadcrumbProps {\n /** Workspace icon, rendered before the title. */\n workspaceIcon?: ReactNode\n title: string\n /** Trailing crumb; wins over `labels.annotations`. */\n trail?: string\n labels?: Partial<DocTagLabels>\n}\n\n/** \"workspace / Document title / Annotations\". */\nexport function DocTagBreadcrumb({ workspaceIcon, title, trail, labels }: DocTagBreadcrumbProps) {\n const l = { ...DEFAULT_DOC_TAG_LABELS, ...labels }\n return (\n <div className=\"flex min-w-0 items-center gap-1.5 text-sm font-semibold\">\n {workspaceIcon}\n <span className=\"text-muted-foreground\">/</span>\n <span className=\"max-w-[120px] truncate text-foreground\" title={title}>\n {title}\n </span>\n <span className=\"text-muted-foreground\">/ {trail ?? l.annotations}</span>\n </div>\n )\n}\n\nexport interface DocTagNavigatorProps {\n currentId: string\n currentTitle: string\n items: Array<{ id: string; title: string }>\n currentIndex: number\n onSelect: (id: string) => void\n onPrevious: () => void\n onNext: () => void\n labels?: Partial<DocTagLabels>\n}\n\n/** Document picker with previous/next, so several documents can be annotated in a row. */\nexport function DocTagNavigator({\n currentId,\n currentTitle,\n items,\n currentIndex,\n onSelect,\n onPrevious,\n onNext,\n labels,\n}: DocTagNavigatorProps) {\n const l = { ...DEFAULT_DOC_TAG_LABELS, ...labels }\n return (\n <div className=\"flex items-center gap-1\">\n <Select value={currentId} onValueChange={onSelect}>\n <SelectTrigger className=\"h-7 w-[180px] text-sm pointer-coarse:h-11\">\n <SelectValue>\n <span className=\"truncate\">{currentTitle}</span>\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {items.map((item) => (\n <SelectItem key={item.id} value={item.id}>\n <span className=\"truncate\">{item.title}</span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"size-7 p-0 pointer-coarse:size-11\"\n onClick={onPrevious}\n disabled={currentIndex <= 0}\n aria-label={l.previousDocument}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"size-7 p-0 pointer-coarse:size-11\"\n onClick={onNext}\n disabled={currentIndex >= items.length - 1}\n aria-label={l.nextDocument}\n >\n <ChevronRight className=\"size-4\" />\n </Button>\n </div>\n )\n}\n\nexport interface DocTagToggleProps extends Omit<ComponentProps<'button'>, 'onChange' | 'onToggle'> {\n name: string\n color: string\n checked: boolean\n onToggle: (checked: boolean) => void\n /** Tooltip shown while disabled. */\n disabledTooltip?: string\n showLabel?: boolean\n labels?: Partial<DocTagLabels>\n}\n\n/** Checkbox pill for a checkbox-type field: a coloured box on the left and the name. */\nexport function DocTagToggle({\n name,\n color,\n checked,\n onToggle,\n disabled = false,\n disabledTooltip,\n showLabel = true,\n labels,\n className,\n ...props\n}: DocTagToggleProps) {\n const l = { ...DEFAULT_DOC_TAG_LABELS, ...labels }\n const tooltipText = disabled ? disabledTooltip : checked ? l.removeTag(name) : l.addTag(name)\n\n const button = (\n <button\n type=\"button\"\n data-slot=\"doc-tag-toggle\"\n aria-pressed={checked}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation()\n if (!disabled) onToggle(!checked)\n }}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md border border-transparent bg-muted px-1.5 py-0.5 transition-colors pointer-coarse:min-h-11',\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer hover:border-border',\n className\n )}\n {...props}\n >\n <span\n className=\"flex size-4 flex-shrink-0 items-center justify-center rounded border-2 transition-colors\"\n style={{ borderColor: color, backgroundColor: checked ? color : 'var(--background)' }}\n >\n {checked && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n </span>\n {showLabel && <span className=\"max-w-[120px] truncate text-sm font-medium\">{name}</span>}\n </button>\n )\n\n return (\n <Tooltip>\n <TooltipTrigger asChild onFocusCapture={(e) => e.stopPropagation()}>\n {button}\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltipText}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n\nexport interface DocTagFieldRowProps {\n field: DocTagField\n value: string\n onChange: (value: string) => void\n labels?: Partial<DocTagLabels>\n}\n\n/** A select / number / text field: icon + name above its input. */\nexport function DocTagFieldRow({ field, value, onChange, labels }: DocTagFieldRowProps) {\n return (\n <div data-slot=\"doc-tag-field-row\" className=\"space-y-1\">\n <div className=\"flex items-center gap-1.5 text-sm font-medium\">\n <DocTagFieldIcon type={field.type} color={field.color} />\n <span>{field.name}</span>\n </div>\n <DocTagValueInput field={field} value={value} onChange={onChange} labels={labels} />\n </div>\n )\n}\n\n/** The input matching a field's type. */\nexport function DocTagValueInput({ field, value, onChange, labels }: DocTagFieldRowProps) {\n const l = { ...DEFAULT_DOC_TAG_LABELS, ...labels }\n if (field.type === 'select') {\n return (\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n aria-label={field.name}\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm pointer-coarse:min-h-11\"\n >\n <option value=\"\">--</option>\n {(field.options ?? []).map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n )\n }\n if (field.type === 'number') {\n return (\n <Input\n type=\"number\"\n value={value}\n aria-label={field.name}\n onChange={(e) => onChange(e.target.value)}\n className=\"text-sm\"\n />\n )\n }\n return (\n <Textarea\n value={value}\n aria-label={field.name}\n onChange={(e) => onChange(e.target.value)}\n placeholder={l.addNote}\n rows={2}\n className=\"text-sm\"\n />\n )\n}\n\nexport interface DocTagEmptyProps {\n /** Plural entity label, e.g. \"Fields\". */\n pluralLabel: string\n /** Singular entity label, e.g. \"Field\". */\n singularLabel: string\n onCreate: () => void\n labels?: Partial<DocTagLabels>\n}\n\n/** Shown when the workspace has no fields yet. */\nexport function DocTagEmpty({ pluralLabel, singularLabel, onCreate, labels }: DocTagEmptyProps) {\n const l = { ...DEFAULT_DOC_TAG_LABELS, ...labels }\n return (\n <div className=\"py-2 text-center\">\n <p className=\"mb-3 text-sm text-muted-foreground\">{l.noneYet(pluralLabel.toLowerCase())}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onCreate}>\n <Plus className=\"mr-1.5 size-4\" />\n {l.create(singularLabel.toLowerCase())}\n </Button>\n </div>\n )\n}\n\n/** \"Create new field\" link under the field list. */\nexport function DocTagCreateLink({\n singularLabel,\n onCreate,\n labels,\n}: Pick<DocTagEmptyProps, 'singularLabel' | 'onCreate' | 'labels'>) {\n const l = { ...DEFAULT_DOC_TAG_LABELS, ...labels }\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-full justify-start px-0 text-sm text-muted-foreground hover:text-foreground pointer-coarse:h-11\"\n onClick={onCreate}\n >\n <Plus className=\"mr-1.5 size-3.5\" />\n {l.createNew(singularLabel.toLowerCase())}\n </Button>\n )\n}\n\nexport interface DocTagUnsavedFooterProps {\n onCancel: () => void\n onApply: () => void\n labels?: Partial<DocTagLabels>\n}\n\n/** Footer shown while select/number/text fields hold unsaved changes. */\nexport function DocTagUnsavedFooter({ onCancel, onApply, labels }: DocTagUnsavedFooterProps) {\n const l = { ...DEFAULT_DOC_TAG_LABELS, ...labels }\n return (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-yellow-text\">{l.unsavedChanges}</span>\n <div className=\"flex gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onCancel}>\n {l.cancel}\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={onApply}>\n {l.apply}\n </Button>\n </div>\n </div>\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 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 <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 <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\nexport interface 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. */\nexport function 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\n/** The live columns of a grid: visible ones (in order) and every column. */\nexport interface GridColumnsSnapshot {\n visible: string[]\n /** colId → header name, in the grid's current order (hidden columns too). */\n all: Array<{ colId: string; label: string }>\n widths: Map<string, number | undefined>\n pinnedLeft: Set<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 { 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\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:\n 'ARBI finished this document without an answer for this field. The document may not say, or the request failed. Run it again to retry.',\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 /** 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 ) : (\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.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 l = { ...DEFAULT_AI_REVIEW_DIALOG_LABELS, ...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","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"]}