@arbidocs/blocks 0.4.32 → 0.4.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/index.cjs +257 -215
- package/dist/agents/index.js +8 -6
- package/dist/agents/tasks/ConversationListView.d.ts +58 -0
- package/dist/agents/tasks/ConversationTurnSpeaker.d.ts +16 -0
- package/dist/agents/tasks/NewThreadDialog.d.ts +1 -1
- package/dist/agents/tasks/TaskActivityTimeline.d.ts +1 -1
- package/dist/agents/tasks/TaskFlow.d.ts +22 -0
- package/dist/agents/tasks/TaskInbox.d.ts +26 -0
- package/dist/agents/tasks/TaskReviewDialog.d.ts +22 -0
- package/dist/agents/tasks/TaskRowMenu.d.ts +10 -2
- package/dist/agents/tasks/TaskRunsDialog.d.ts +8 -3
- package/dist/agents/tasks/TaskStartDialog.d.ts +24 -0
- package/dist/agents/tasks/TaskTable.d.ts +1 -1
- package/dist/agents/tasks/ThreadNotifyDialog.d.ts +11 -0
- package/dist/agents/tasks/WorkflowComposer.d.ts +1 -1
- package/dist/agents/tasks/WorkflowsTable.d.ts +7 -0
- package/dist/agents/tasks/compact-thread-activity.d.ts +8 -0
- package/dist/agents/tasks/index.d.ts +10 -0
- package/dist/agents/tasks/taskComposerTypes.d.ts +16 -1
- package/dist/agents/tasks/taskRequest.d.ts +1 -0
- package/dist/agents/tasks/testGrid.d.ts +24 -0
- package/dist/agents/tasks/workflowColumns.d.ts +2 -1
- package/dist/agents/tasks/workflowRows.d.ts +6 -0
- package/dist/agents/workflows/types.d.ts +2 -0
- package/dist/auth/index.cjs +27 -27
- package/dist/auth/index.js +1 -1
- package/dist/chat/Message.d.ts +8 -2
- package/dist/chat/index.cjs +132 -120
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +2 -2
- package/dist/chat/participant-tints.d.ts +1 -0
- package/dist/chat/useRecipientDraft.d.ts +14 -0
- package/dist/{chunk-KF4EC5XU.js → chunk-24KQJYSB.js} +3 -3
- package/dist/{chunk-KF4EC5XU.js.map → chunk-24KQJYSB.js.map} +1 -1
- package/dist/{chunk-GVQOBJKR.cjs → chunk-2EAE5JP6.cjs} +7 -4
- package/dist/chunk-2EAE5JP6.cjs.map +1 -0
- package/dist/{chunk-S5HZBXZA.cjs → chunk-2QTT2RZE.cjs} +242 -2
- package/dist/chunk-2QTT2RZE.cjs.map +1 -0
- package/dist/chunk-3AFWGEDJ.cjs +53 -0
- package/dist/chunk-3AFWGEDJ.cjs.map +1 -0
- package/dist/{chunk-4XJZ6AAY.js → chunk-4AWS54US.js} +244 -6
- package/dist/chunk-4AWS54US.js.map +1 -0
- package/dist/{chunk-56BUD74K.cjs → chunk-65THHQVB.cjs} +27 -27
- package/dist/{chunk-56BUD74K.cjs.map → chunk-65THHQVB.cjs.map} +1 -1
- package/dist/{chunk-5B4PXAKI.cjs → chunk-6DNYPLCD.cjs} +21 -7
- package/dist/chunk-6DNYPLCD.cjs.map +1 -0
- package/dist/{chunk-TZ4QF7EP.js → chunk-6RXUMBTK.js} +1948 -594
- package/dist/chunk-6RXUMBTK.js.map +1 -0
- package/dist/{chunk-UTYQPVIW.cjs → chunk-7QDX2CO4.cjs} +6 -6
- package/dist/{chunk-UTYQPVIW.cjs.map → chunk-7QDX2CO4.cjs.map} +1 -1
- package/dist/{chunk-FRRDPYBR.cjs → chunk-AZ75JUIH.cjs} +74 -5
- package/dist/chunk-AZ75JUIH.cjs.map +1 -0
- package/dist/{chunk-NUPVHEJW.js → chunk-BUHKUKKB.js} +7 -4
- package/dist/chunk-BUHKUKKB.js.map +1 -0
- package/dist/chunk-C7FGONCM.js +124 -0
- package/dist/chunk-C7FGONCM.js.map +1 -0
- package/dist/{chunk-KXMDOTGW.js → chunk-DLBUFHLY.js} +10 -2
- package/dist/chunk-DLBUFHLY.js.map +1 -0
- package/dist/{chunk-ZHLMDJCO.cjs → chunk-DLVX6R6B.cjs} +62 -26
- package/dist/chunk-DLVX6R6B.cjs.map +1 -0
- package/dist/{chunk-JGZTRLKL.cjs → chunk-IA7RTPT3.cjs} +7 -4
- package/dist/chunk-IA7RTPT3.cjs.map +1 -0
- package/dist/{chunk-NJL4LIXX.js → chunk-LFGJAZ5H.js} +11 -8
- package/dist/chunk-LFGJAZ5H.js.map +1 -0
- package/dist/{chunk-IAKUTBPX.js → chunk-LYUO3E6V.js} +3 -3
- package/dist/{chunk-IAKUTBPX.js.map → chunk-LYUO3E6V.js.map} +1 -1
- package/dist/{chunk-EYPPB5CY.cjs → chunk-M2YGPC5N.cjs} +4 -4
- package/dist/{chunk-EYPPB5CY.cjs.map → chunk-M2YGPC5N.cjs.map} +1 -1
- package/dist/{chunk-5ZBP7TCD.cjs → chunk-MJCCBMM5.cjs} +10 -2
- package/dist/chunk-MJCCBMM5.cjs.map +1 -0
- package/dist/chunk-MZL67U2E.cjs +128 -0
- package/dist/chunk-MZL67U2E.cjs.map +1 -0
- package/dist/{chunk-OJSWQM4G.js → chunk-OZJ5PXA6.js} +29 -4
- package/dist/chunk-OZJ5PXA6.js.map +1 -0
- package/dist/{chunk-UBNVIIBT.js → chunk-PXFJDX2C.js} +21 -7
- package/dist/chunk-PXFJDX2C.js.map +1 -0
- package/dist/{chunk-RGHQFJOL.cjs → chunk-QFUF4A4J.cjs} +28 -2
- package/dist/chunk-QFUF4A4J.cjs.map +1 -0
- package/dist/chunk-RFXJYIDV.js +50 -0
- package/dist/chunk-RFXJYIDV.js.map +1 -0
- package/dist/{chunk-PLGVMLBD.cjs → chunk-SEQWI6E4.cjs} +1975 -610
- package/dist/chunk-SEQWI6E4.cjs.map +1 -0
- package/dist/{chunk-QN42OA5J.js → chunk-SFXVNFES.js} +4 -4
- package/dist/chunk-SFXVNFES.js.map +1 -0
- package/dist/{chunk-3NZR6PAG.js → chunk-V6U5KVAR.js} +70 -4
- package/dist/chunk-V6U5KVAR.js.map +1 -0
- package/dist/{chunk-YVIOCITQ.cjs → chunk-VUEZARW5.cjs} +3 -3
- package/dist/chunk-VUEZARW5.cjs.map +1 -0
- package/dist/{chunk-JLOYWXRB.js → chunk-VZGBCBYB.js} +3 -3
- package/dist/chunk-VZGBCBYB.js.map +1 -0
- package/dist/{chunk-ZVPTFTGV.cjs → chunk-WBDK4PIA.cjs} +11 -8
- package/dist/chunk-WBDK4PIA.cjs.map +1 -0
- package/dist/{chunk-ZORQ5M3W.cjs → chunk-WQFGG2BV.cjs} +4 -4
- package/dist/chunk-WQFGG2BV.cjs.map +1 -0
- package/dist/{chunk-C75S6USL.js → chunk-WYVCXY7R.js} +7 -4
- package/dist/chunk-WYVCXY7R.js.map +1 -0
- package/dist/{chunk-WSJVHSGN.js → chunk-XWEJ5LV2.js} +63 -27
- package/dist/chunk-XWEJ5LV2.js.map +1 -0
- package/dist/{chunk-YMHGF6R5.js → chunk-ZCF2JJFA.js} +3 -3
- package/dist/{chunk-YMHGF6R5.js.map → chunk-ZCF2JJFA.js.map} +1 -1
- package/dist/collaboration/index.cjs +45 -41
- package/dist/collaboration/index.js +1 -1
- package/dist/collaboration/mail/MailMessagePreview.d.ts +11 -0
- package/dist/collaboration/mail/index.d.ts +1 -0
- package/dist/connect/index.cjs +33 -33
- package/dist/connect/index.js +4 -4
- package/dist/facts/FactsFilterInput.d.ts +2 -46
- package/dist/facts/FactsToolbar.d.ts +5 -5
- package/dist/facts/index.cjs +27 -124
- package/dist/facts/index.cjs.map +1 -1
- package/dist/facts/index.js +13 -118
- package/dist/facts/index.js.map +1 -1
- package/dist/files/FilesPage.d.ts +1 -1
- package/dist/files/FilesToolbar.d.ts +1 -1
- package/dist/files/FolderPicker.d.ts +2 -1
- package/dist/files/ViewerChrome.d.ts +1 -1
- package/dist/files/bulk/FolderFilterButton.d.ts +3 -2
- package/dist/files/cells/BulkLabelSelect.d.ts +11 -0
- package/dist/files/cells/LabelMultiSelect.d.ts +2 -1
- package/dist/files/cells/index.d.ts +1 -0
- package/dist/files/index.cjs +109 -166
- package/dist/files/index.cjs.map +1 -1
- package/dist/files/index.js +95 -158
- package/dist/files/index.js.map +1 -1
- package/dist/home/index.cjs +19 -19
- package/dist/home/index.cjs.map +1 -1
- package/dist/home/index.js +4 -4
- package/dist/home/index.js.map +1 -1
- package/dist/index.cjs +787 -764
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +21 -69
- package/dist/index.js.map +1 -1
- package/dist/settings/SettingsPanel.d.ts +1 -1
- package/dist/settings/index.cjs +55 -280
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.js +17 -248
- package/dist/settings/index.js.map +1 -1
- package/dist/shell/FilterInput.d.ts +46 -0
- package/dist/shell/TabHeader.d.ts +5 -1
- package/dist/shell/index.cjs +61 -48
- package/dist/shell/index.d.ts +1 -0
- package/dist/shell/index.js +3 -2
- package/dist/site/index.cjs +62 -62
- package/dist/site/index.js +2 -2
- package/dist/studio/index.cjs +74 -74
- package/dist/studio/index.js +5 -5
- package/dist/workspaces/WorkspaceCard.d.ts +2 -2
- package/dist/workspaces/index.cjs +9 -2
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.js +9 -2
- package/dist/workspaces/index.js.map +1 -1
- package/package.json +3 -3
- package/src/blocks.css +4 -0
- package/src/components/grid.css +10 -0
- package/dist/chunk-3NZR6PAG.js.map +0 -1
- package/dist/chunk-4XJZ6AAY.js.map +0 -1
- package/dist/chunk-5B4PXAKI.cjs.map +0 -1
- package/dist/chunk-5ZBP7TCD.cjs.map +0 -1
- package/dist/chunk-C75S6USL.js.map +0 -1
- package/dist/chunk-FRRDPYBR.cjs.map +0 -1
- package/dist/chunk-GVQOBJKR.cjs.map +0 -1
- package/dist/chunk-JGZTRLKL.cjs.map +0 -1
- package/dist/chunk-JLOYWXRB.js.map +0 -1
- package/dist/chunk-KXMDOTGW.js.map +0 -1
- package/dist/chunk-NJL4LIXX.js.map +0 -1
- package/dist/chunk-NUPVHEJW.js.map +0 -1
- package/dist/chunk-OJSWQM4G.js.map +0 -1
- package/dist/chunk-PLGVMLBD.cjs.map +0 -1
- package/dist/chunk-QN42OA5J.js.map +0 -1
- package/dist/chunk-RGHQFJOL.cjs.map +0 -1
- package/dist/chunk-S5HZBXZA.cjs.map +0 -1
- package/dist/chunk-TZ4QF7EP.js.map +0 -1
- package/dist/chunk-UBNVIIBT.js.map +0 -1
- package/dist/chunk-WSJVHSGN.js.map +0 -1
- package/dist/chunk-YVIOCITQ.cjs.map +0 -1
- package/dist/chunk-ZHLMDJCO.cjs.map +0 -1
- package/dist/chunk-ZORQ5M3W.cjs.map +0 -1
- package/dist/chunk-ZVPTFTGV.cjs.map +0 -1
package/dist/files/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/files/UploadDropzone.tsx","../../src/files/StatusPill.tsx","../../src/files/FilesToolbar.tsx","../../src/files/Explorer.tsx","../../src/files/ExplorerTile.tsx","../../src/files/documentGridLayout.ts","../../src/files/UploadParts.tsx","../../src/files/UploadSources.tsx","../../src/files/ExportParts.tsx","../../src/files/ViewerChrome.tsx","../../src/files/ViewerLayout.tsx","../../src/files/MoveToFolderDialog.tsx","../../src/files/FilesPage.tsx","../../src/files/DocumentGrid.tsx","../../src/files/ViewerParts.tsx","../../src/files/UploadFooter.tsx","../../src/files/FolderPicker.tsx","../../src/files/HtmlViewerParts.tsx","../../src/files/TagPassagePanel.tsx","../../src/files/page/FilesAddMenu.tsx","../../src/files/page/FilesPageTitle.tsx","../../src/files/page/FilesPageParts.tsx","../../src/files/import/ImportParts.tsx","../../src/files/import/CalendarImportRow.tsx","../../src/files/import/TaskSection.tsx","../../src/files/import/UrlInputDialogView.tsx","../../src/files/import/VendorLogo.tsx","../../src/files/cells/FolderCell.tsx","../../src/files/cells/RelatedDocsCell.tsx","../../src/files/cells/DocumentNameCell.tsx","../../src/files/cells/HoverIconCell.tsx","../../src/files/cells/LabelMultiSelect.tsx","../../src/files/cells/TagColumnParts.tsx","../../src/files/bulk/BulkActionsBar.tsx","../../src/files/bulk/FolderFilterButton.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/AiReviewDialog.tsx","../../src/files/DocStatusIcon.tsx","../../src/files/FieldParts.tsx","../../src/files/ExplorerSurface.tsx"],"names":["pick","cn","jsxs","jsx","useRef","useState","X","Loader2","Button","Fragment","FolderOpen","Badge","Tooltip","TooltipTrigger","TooltipContent","Download","Sparkles","Check","Command","CommandList","CommandGroup","CommandItem","HtmlPassage","Share2","hasNote","StickyNote","ChevronRight","Textarea","Upload","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuSeparator","DropdownMenuItem","Progress","LoaderCircle","AlertCircle","Dialog","DialogContent","DialogTitle","DialogDescription","Label","Input","Plus","FolderBreadcrumb","Popover","PopoverTrigger","PopoverContent","CopyX","Pencil","Trash2","memo","HoverIconCell","CommandInput","CommandEmpty","LabelMultiSelectView","useEffect","CheckboxCell","TagColumnHeader","MessagesSquare","Tags","MoreHorizontal","FolderInput","RefreshCw","ChevronDown","FolderPlus","TagIcon","Folder","ChevronLeft","Checkbox","TooltipProvider","ScrollArea","Search","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","PencilLine","FolderUp","BookMarked","DialogHeader","CheckCircle","AlertTriangle","Hourglass","ChevronsUpDown","useMemo","ExplorerScroller","ExplorerMarquee","UploadCloud"],"mappings":"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","file":"index.js","sourcesContent":["import { useRef, useState } from 'react'\nimport type { DragEvent } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Loader2, UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface UploadDropzoneProps {\n /** Called with the chosen/dropped files. */\n onFiles: (files: File[]) => void\n /** `accept` attribute for the file picker (e.g. `.pdf,.docx`). */\n accept?: string\n /** Allow selecting more than one file. Defaults to true. */\n multiple?: boolean\n /** Disables picking/dropping (e.g. no active workspace yet). */\n disabled?: boolean\n /** Shows a spinner + busy copy while an upload is in flight. */\n uploading?: boolean\n /** Primary line, e.g. \"Drag files here\". */\n title?: string\n /** Secondary line under the title. */\n description?: string\n /** Small muted hint, e.g. \"PDF, DOCX, images — up to 50MB\". */\n hint?: string\n /** Copy shown next to the spinner while uploading. */\n uploadingLabel?: string\n /** Glyph in the tile. Defaults to an upload-cloud icon. */\n icon?: LucideIcon\n testId?: string\n className?: string\n}\n\n/**\n * A themeable drag-and-drop upload target. Source-agnostic: it just surfaces\n * chosen files via `onFiles` — the host owns the actual upload. Handles its own\n * drag-over state, click-to-browse, and a busy state, styled with the kit's\n * SEMANTIC tokens only (border, muted, primary, foreground) so it renders in\n * each host's colours.\n */\nexport function UploadDropzone({\n onFiles,\n accept,\n multiple = true,\n disabled = false,\n uploading = false,\n title = 'Drag files here',\n description = 'or click to browse',\n hint,\n uploadingLabel = 'Uploading…',\n icon: Icon = UploadCloud,\n testId,\n className,\n}: UploadDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const [dragOver, setDragOver] = useState(false)\n const inert = disabled || uploading\n\n const pick = (files: FileList | null) => {\n if (!files?.length) return\n onFiles(Array.from(files))\n }\n\n const onDrop = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setDragOver(false)\n if (inert) return\n pick(e.dataTransfer.files)\n }\n\n const onDragOver = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n if (!inert) setDragOver(true)\n }\n\n return (\n <button\n type=\"button\"\n onClick={() => !inert && inputRef.current?.click()}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onDragLeave={() => setDragOver(false)}\n disabled={inert}\n data-testid={testId}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-3 rounded-lg bg-muted px-6 py-12 text-center transition-colors',\n 'hover:bg-accent/60',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n dragOver && 'bg-accent ring-2 ring-primary',\n inert && 'cursor-not-allowed opacity-60 hover:bg-muted',\n className\n )}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={(e) => {\n pick(e.target.files)\n if (inputRef.current) inputRef.current.value = ''\n }}\n data-testid={testId ? `${testId}-input` : undefined}\n />\n <div className=\"flex size-12 items-center justify-center rounded-full bg-primary/10 text-primary\">\n {uploading ? <Loader2 className=\"size-6 animate-spin\" /> : <Icon className=\"size-6\" />}\n </div>\n {uploading ? (\n <p className=\"text-sm font-medium text-foreground\">{uploadingLabel}</p>\n ) : (\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {title} <span className=\"text-muted-foreground\">{description}</span>\n </p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )}\n </button>\n )\n}\n","import type { KeyboardEvent, MouseEvent, ReactNode } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@arbidocs/react/ui'\nimport { TONE_SURFACE, type Tone } from '../components/tones'\n\nconst pill = cva(\n 'inline-flex max-w-full items-center justify-center gap-1 rounded-full text-xs font-medium leading-none',\n {\n variants: {\n /** `icon` = glyph-only chip; `label` = text pill. */\n shape: { icon: 'size-6 p-0 pointer-coarse:size-8', label: 'h-6 px-2 pointer-coarse:h-8' },\n interactive: {\n true: \"relative cursor-pointer pointer-coarse:after:absolute pointer-coarse:after:left-1/2 pointer-coarse:after:top-1/2 pointer-coarse:after:size-11 pointer-coarse:after:-translate-x-1/2 pointer-coarse:after:-translate-y-1/2 pointer-coarse:after:content-[''] hover:brightness-95 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n false: '',\n },\n },\n defaultVariants: { shape: 'label', interactive: false },\n }\n)\n\n/** The shared tone vocabulary (see `components/tones`). */\nexport type StatusTone = Tone\n\nexport interface StatusPillProps {\n tone?: StatusTone\n /** Leading glyph. With no `label` the pill is a glyph-only chip. */\n icon?: ReactNode\n label?: ReactNode\n /** Adds a thin bar under the label (queued = still, processing = animated). */\n progress?: 'queued' | 'processing'\n /** Native tooltip and accessible name for glyph-only pills. */\n title?: string\n /** Makes the pill a button (stops row-click propagation). */\n onClick?: () => void\n testId?: string\n className?: string\n}\n\n/**\n * A small tinted status chip. Source-agnostic: the host decides tone, glyph and copy from its\n * own status model; the block only owns the look, the touch target and the keyboard path.\n */\nexport function StatusPill({\n tone = 'neutral',\n icon,\n label,\n progress,\n title,\n onClick,\n testId,\n className,\n}: StatusPillProps) {\n const hasLabel = label !== undefined && label !== null && label !== ''\n const classes = cn(\n pill({ shape: hasLabel ? 'label' : 'icon', interactive: !!onClick }),\n TONE_SURFACE[tone],\n progress && 'h-auto min-h-6 flex-col gap-0 px-2 py-1',\n className\n )\n\n const body = (\n <>\n <span className=\"inline-flex max-w-full items-center gap-1\">\n {icon}\n {hasLabel && <span className=\"truncate\">{label}</span>}\n </span>\n {progress && (\n <span\n aria-hidden\n data-slot=\"status-pill-progress\"\n className={cn(\n 'mt-0.5 block h-1 w-full min-w-10 shrink-0 rounded-sm',\n progress === 'queued' ? 'progress-bar-queued' : 'progress-bar-processing'\n )}\n />\n )}\n </>\n )\n\n if (onClick) {\n return (\n <button\n type=\"button\"\n title={title}\n aria-label={hasLabel ? undefined : title}\n data-slot=\"status-pill\"\n data-testid={testId}\n className={classes}\n onClick={(e: MouseEvent) => {\n e.stopPropagation()\n onClick()\n }}\n onKeyDown={(e: KeyboardEvent) => e.stopPropagation()}\n >\n {body}\n </button>\n )\n }\n return (\n <span\n title={title}\n role={hasLabel || !title ? undefined : 'img'}\n aria-label={hasLabel ? undefined : title}\n data-slot=\"status-pill\"\n data-testid={testId}\n className={classes}\n >\n {body}\n </span>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport { Check, SlidersHorizontal, X } from 'lucide-react'\nimport {\n Command,\n CommandGroup,\n CommandItem,\n CommandList,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@arbidocs/react/ui'\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({\n value,\n onChange,\n fields,\n selectedFields,\n onSelectedFieldsChange,\n placeholder,\n labels,\n testIds,\n className,\n filterSlot,\n}: FilesSearchInputProps) {\n const l = { ...DEFAULT_FILES_SEARCH_LABELS, ...labels }\n const toggleField = (field: string) =>\n onSelectedFieldsChange(\n selectedFields.includes(field)\n ? selectedFields.filter((f) => f !== field)\n : [...selectedFields, field]\n )\n\n return (\n <div\n className={cn('relative flex min-w-0 items-center', className)}\n data-slot=\"files-search\"\n data-testid={testIdOr(testIds?.root, { testId: 'documents-search' })}\n >\n {filterSlot && (\n <div\n className=\"absolute left-1 top-1/2 z-10 -translate-y-1/2\"\n data-testid={testIdOr(testIds?.filterSlot, { testId: 'documents-search-filter' })}\n >\n {filterSlot}\n </div>\n )}\n <Input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder ?? l.placeholder}\n data-testid={testIdOr(testIds?.input, { testId: 'filter-bar-search-input' })}\n className={cn(\n 'h-8 border-transparent bg-muted text-sm shadow-none focus-visible:border-input focus-visible:bg-background pointer-coarse:h-11',\n filterSlot ? 'pl-11' : 'pl-2.5',\n value ? 'pr-14 pointer-coarse:pr-24' : 'pr-8 pointer-coarse:pr-12'\n )}\n />\n {value && (\n <button\n type=\"button\"\n onClick={() => onChange('')}\n aria-label={l.clearFilter}\n className=\"absolute right-8 top-1/2 z-10 flex size-5 -translate-y-1/2 items-center justify-center rounded-sm text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:right-11 pointer-coarse:size-11!\"\n >\n <X className=\"size-3\" />\n </button>\n )}\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.chooseFields}\n data-testid={testIdOr(testIds?.fieldsButton, {\n testId: 'documents-search-fields-button',\n })}\n className=\"absolute right-1.5 top-1/2 z-10 flex size-5 -translate-y-1/2 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:right-0 pointer-coarse:size-11!\"\n >\n <SlidersHorizontal className=\"size-3.5\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-44 p-0\" align=\"end\" sideOffset={6}>\n <Command shouldFilter={false}>\n <CommandList>\n <CommandGroup>\n {fields.map((field) => {\n const isSelected = selectedFields.includes(field.value)\n return (\n <CommandItem\n key={field.value}\n onSelect={() => toggleField(field.value)}\n className=\"cursor-pointer text-sm\"\n >\n <div\n className={cn(\n 'mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary',\n isSelected\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <Check className=\"size-3\" />\n </div>\n {field.label}\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </div>\n )\n}\n","import type { ComponentProps } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface ExplorerLoadingTilesProps extends ComponentProps<'div'> {\n count?: number\n /** Accessible name (default \"Loading files\"). */\n label?: string\n /** Overrides the root test id (default `explorer-loading-skeleton`). */\n testId?: string\n}\n\n/** Skeleton tile grid shown while the first page loads: the gallery reads as \"filling in\". */\nexport function ExplorerLoadingTiles({\n count = 18,\n label = 'Loading files',\n testId,\n className,\n ...rest\n}: ExplorerLoadingTilesProps) {\n return (\n <div\n className={cn(\n 'grid gap-3 [grid-template-columns:repeat(auto-fill,minmax(150px,1fr))]',\n className\n )}\n aria-busy=\"true\"\n aria-label={label}\n data-slot=\"explorer-loading-tiles\"\n {...rest}\n data-testid={testIdOr(testId, { testId: 'explorer-loading-skeleton' })}\n >\n {Array.from({ length: count }).map((_, i) => (\n <div key={i} className=\"aspect-[4/5] animate-pulse rounded-lg bg-muted\" />\n ))}\n </div>\n )\n}\n","import { useRef, useState } from 'react'\nimport type { HTMLAttributes, MouseEvent, ReactNode, Ref } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Folder, LoaderCircle, MoreHorizontal, Sparkles } from 'lucide-react'\nimport {\n Checkbox,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { ActionLink } from '../components/ActionLink'\nimport { testIdOr } from '../chat/test-id'\nimport { formatCount } from '../lib/format'\n\n/** Every fixed string of the explorer tiles. Pass a partial `labels` to translate or reword. */\nexport interface ExplorerLabels {\n moreActions: string\n name: string\n select: string\n deselect: string\n empty: string\n itemCount: (count: number) => string\n processing: (count: number) => string\n aiSummary: string\n noSummary: string\n lastModifiedBy: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_EXPLORER_LABELS: ExplorerLabels = {\n moreActions: 'More actions',\n name: 'Name',\n select: 'Select',\n deselect: 'Deselect',\n empty: 'Empty',\n itemCount: (count) => formatCount(count, { one: 'item', other: 'items' }),\n processing: (count) => `${count} processing`,\n aiSummary: 'AI Summary:',\n noSummary: 'No AI summary is available for this document yet.',\n lastModifiedBy: 'Last modified by',\n shared: 'Shared',\n private: 'Private',\n}\n\nexport interface ExplorerFileTestIds {\n root: string\n menu: string\n renameInput: string\n}\n\nexport interface ExplorerFolderTestIds {\n root: string\n menu: string\n renameInput: string\n /** Replaces the whole `explorer-folder-processing-<path>` id. */\n processing: string\n}\n\n/** Stretched anchor under the tile controls: gives the tile a real URL when `href` is set. */\nfunction TileLink({\n href,\n label,\n onSelect,\n}: {\n href: string\n label: string\n onSelect: () => void\n}) {\n return (\n <ActionLink\n href={href}\n onSelect={onSelect}\n aria-label={label}\n data-slot=\"explorer-tile-link\"\n className=\"absolute inset-0 z-10 rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n )\n}\n\nfunction isInsideTileLink(e: MouseEvent): boolean {\n return e.target instanceof Element && !!e.target.closest('[data-slot=\"explorer-tile-link\"]')\n}\n\nexport type ExplorerDensity = 'grid' | 'list'\n\nexport interface ExplorerMenuItem {\n id: string\n label: string\n icon: LucideIcon\n onSelect: () => void\n /** Red styling, for Delete. */\n destructive?: boolean\n /** Draw a separator above this item. */\n separatorBefore?: boolean\n /** A nested menu: the item opens it instead of acting (`onSelect` is then ignored). */\n submenu?: ExplorerMenuItem[]\n testId?: string\n}\n\nfunction ExplorerMenu({\n items,\n testId,\n label,\n align,\n triggerClassName,\n}: {\n items: ExplorerMenuItem[]\n testId: string\n label: string\n align: 'start' | 'end'\n triggerClassName?: string\n}) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n className={cn(\n 'flex size-6 items-center justify-center rounded-md bg-background/90 text-muted-foreground backdrop-blur-sm transition hover:bg-background hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:bg-background data-[state=open]:text-foreground pointer-coarse:size-11',\n triggerClassName\n )}\n >\n <MoreHorizontal className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align={align}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n className=\"w-44\"\n >\n {items.map((item) => (\n <div key={item.id}>\n {item.separatorBefore && <DropdownMenuSeparator />}\n {item.submenu ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger data-testid={item.testId}>\n <item.icon className=\"mr-2 size-4\" />\n {item.label}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"w-52\">\n {item.submenu.map((sub) => (\n <DropdownMenuItem key={sub.id} onSelect={sub.onSelect} data-testid={sub.testId}>\n <sub.icon className=\"mr-2 size-4\" />\n {sub.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n ) : (\n <DropdownMenuItem\n onSelect={item.onSelect}\n data-testid={item.testId}\n className={cn(item.destructive && 'text-destructive focus:text-destructive')}\n >\n <item.icon className=\"mr-2 size-4\" />\n {item.label}\n </DropdownMenuItem>\n )}\n </div>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/** Inline rename field. Enter / blur commits, Escape cancels; guarded against Enter-then-blur. */\nfunction RenameField({\n seed,\n testId,\n label,\n onCommit,\n onCancel,\n className,\n}: {\n seed: string\n testId: string\n label: string\n onCommit: (value: string) => void\n onCancel: () => void\n className?: string\n}) {\n const doneRef = useRef(false)\n const commit = (value: string) => {\n if (doneRef.current) return\n doneRef.current = true\n const trimmed = value.trim()\n if (trimmed && trimmed !== seed) onCommit(trimmed)\n else onCancel()\n }\n return (\n <input\n autoFocus\n defaultValue={seed}\n data-testid={testId}\n aria-label={label}\n onFocus={(e) => e.currentTarget.select()}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n commit(e.currentTarget.value)\n } else if (e.key === 'Escape') {\n e.preventDefault()\n doneRef.current = true\n onCancel()\n }\n }}\n onBlur={(e) => commit(e.currentTarget.value)}\n className={cn(\n 'w-full rounded-md border border-primary bg-background px-1 py-0.5 text-sm text-foreground outline-none',\n className\n )}\n />\n )\n}\n\n/** Selection checkbox: always visible (dimmed at rest), solid when selected. */\nfunction SelectCheckbox({\n selected,\n onToggle,\n labels,\n className,\n}: {\n selected: boolean\n onToggle: (e: MouseEvent) => void\n labels: Pick<ExplorerLabels, 'select' | 'deselect'>\n className?: string\n}) {\n return (\n <Checkbox\n checked={selected}\n // Pointer-down stop prevents the drag sensor / tile click from firing.\n onPointerDown={(e) => e.stopPropagation()}\n onClick={onToggle}\n aria-label={selected ? labels.deselect : labels.select}\n className={cn(\n 'size-6 rounded-md border-muted-foreground/60 bg-card transition data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground pointer-coarse:size-9',\n selected ? 'opacity-100' : 'opacity-60 hover:opacity-100',\n className\n )}\n />\n )\n}\n\n// ── File tile ───────────────────────────────────────────────────────────────────────────────\n\nexport interface ExplorerFileTileProps {\n /** Document id (`data-doc-id`). */\n id: string\n /** Rename seed: the display title. */\n title: string\n density: ExplorerDensity\n selected: boolean\n /** Part of an in-flight drag: dimmed. */\n dragging?: boolean\n renaming?: boolean\n /** First-page thumbnail (data URI/URL). Without one the file-type icon shows. */\n thumbnailUrl?: string\n /** Renders the file-type glyph at a pixel size. */\n renderFileIcon: (size: number) => ReactNode\n /** In-flight processing: shows a centred progress overlay with this label. */\n progress?: { label: string; queued: boolean }\n /** Terminal status marker (bottom-right), usually a `StatusPill`. */\n statusMarker?: ReactNode\n /** \"Available offline\" marker (bottom-left). */\n offlineMarker?: ReactNode\n /** The canonical entity pill at the bottom (click opens). */\n entity: ReactNode\n /** Hover card content. Omit to disable the tooltip (renaming, or while dragging). */\n tooltip?: ReactNode\n menuItems: ExplorerMenuItem[]\n /** Drag-and-drop hook-up: ref + listener/aria props from the host's DnD library. */\n rootRef?: Ref<HTMLDivElement>\n rootProps?: HTMLAttributes<HTMLDivElement>\n /** Plain click / double click / menu \"Open\". With `href`, a plain click still calls this. */\n onOpen: () => void\n /** Route of the document: the tile gets a real link (modified clicks go to the browser). */\n href?: string\n labels?: Partial<ExplorerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<ExplorerFileTestIds>\n /** Modifier (shift/meta/ctrl) click: range / toggle selection. */\n onSelect: (e: MouseEvent) => void\n onToggle: (e: MouseEvent) => void\n onCommitRename: (name: string) => void\n onCancelRename: () => void\n}\n\n/** One document tile: thumbnail (or icon) filling the tile with checkbox, menu, status and pill. */\nexport function ExplorerFileTile({\n id,\n title,\n density,\n selected,\n dragging,\n renaming,\n thumbnailUrl,\n renderFileIcon,\n progress,\n statusMarker,\n offlineMarker,\n entity,\n tooltip,\n menuItems,\n rootRef,\n rootProps,\n onOpen,\n href,\n labels,\n testIds,\n onSelect,\n onToggle,\n onCommitRename,\n onCancelRename,\n}: ExplorerFileTileProps) {\n const l = { ...DEFAULT_EXPLORER_LABELS, ...labels }\n const [thumbFailed, setThumbFailed] = useState(false)\n // Portrait pages fill the tile top-aligned; landscape / odd shapes are fit whole.\n const [thumbLandscape, setThumbLandscape] = useState(false)\n const showThumbnail = !!thumbnailUrl && !thumbFailed && !progress\n\n const tile = (\n <div\n ref={rootRef}\n {...rootProps}\n onClick={(e) => {\n if (href && isInsideTileLink(e)) {\n // The link owns plain and new-tab clicks; shift keeps range selection.\n if (e.shiftKey) {\n e.preventDefault()\n onSelect(e)\n }\n return\n }\n if (e.shiftKey || e.metaKey || e.ctrlKey) onSelect(e)\n else onOpen()\n }}\n onDoubleClick={onOpen}\n data-slot=\"explorer-file-tile\"\n data-testid={testIdOr(testIds?.root, { testId: 'explorer-file' })}\n data-doc-id={id}\n className={cn(\n 'group relative h-full cursor-default select-none overflow-hidden rounded-lg border transition',\n dragging && 'opacity-40',\n selected ? 'border-primary/30 bg-accent' : 'border-border bg-muted hover:bg-muted/70'\n )}\n >\n {href && <TileLink href={href} label={title} onSelect={onOpen} />}\n {showThumbnail ? (\n <img\n src={thumbnailUrl}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n onError={() => setThumbFailed(true)}\n onLoad={(e) =>\n setThumbLandscape(e.currentTarget.naturalWidth > e.currentTarget.naturalHeight)\n }\n className={cn(\n 'absolute inset-0 size-full bg-card',\n thumbLandscape ? 'object-contain' : 'object-cover object-top'\n )}\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderFileIcon(density === 'list' ? 30 : 44)}\n </div>\n )}\n\n {progress && (\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-1.5 bg-background/80 px-3\">\n <div\n className={cn(\n 'h-1.5 w-full rounded-sm',\n progress.queued ? 'progress-bar-queued' : 'progress-bar-processing'\n )}\n />\n <span className=\"text-xs font-medium text-primary\">{progress.label}</span>\n </div>\n )}\n\n <SelectCheckbox\n selected={selected}\n onToggle={onToggle}\n labels={l}\n className=\"absolute left-1.5 top-1.5 z-20\"\n />\n\n <div className=\"absolute right-1.5 top-1.5 z-20\">\n <ExplorerMenu\n items={menuItems}\n testId={testIdOr(testIds?.menu, { testId: 'explorer-file-menu' })}\n label={l.moreActions}\n align=\"start\"\n />\n </div>\n\n {renaming ? (\n <div className=\"absolute inset-x-0 bottom-0 z-20 flex items-center gap-1 bg-background/90 px-1.5 py-1 backdrop-blur-sm\">\n <span className=\"shrink-0\">{renderFileIcon(13)}</span>\n <RenameField\n seed={title}\n testId={testIdOr(testIds?.renameInput, { testId: 'explorer-rename-input' })}\n label={l.name}\n onCommit={onCommitRename}\n onCancel={onCancelRename}\n className=\"flex-1 text-left\"\n />\n </div>\n ) : (\n <div className=\"absolute inset-x-1.5 bottom-1.5 z-20 flex flex-col gap-1\">\n {(offlineMarker || statusMarker) && (\n <div className=\"flex items-center\">\n {offlineMarker}\n {statusMarker && <div className=\"ml-auto flex\">{statusMarker}</div>}\n </div>\n )}\n {entity}\n </div>\n )}\n </div>\n )\n\n if (!tooltip) return tile\n return (\n <Tooltip delayDuration={500}>\n <TooltipTrigger asChild>{tile}</TooltipTrigger>\n <TooltipContent side=\"bottom\" sideOffset={6} className=\"p-2.5\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n )\n}\n\n// ── Folder tile ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ExplorerFolderTileProps {\n /** Stored folder name (rename seed, native tooltip). */\n name: string\n /** Label shown on the tile; `''`/null renders no label (provider roots shorten to nothing). */\n displayName: string | null\n /** Folder path segments (ids and `data-folder-path`). */\n path: string[]\n /** Number of items beneath this folder; 0 renders it faded as \"Empty\". */\n count: number\n density: ExplorerDensity\n editing?: boolean\n /** Every document beneath is selected. */\n selected?: boolean\n /** Some (not all) documents beneath are selected. */\n partiallySelected?: boolean\n processingCount?: number\n /** A dragged item is over this folder. */\n isOver?: boolean\n /** Replace the folder glyph (e.g. a provider's brand mark). */\n icon?: ReactNode\n menuItems?: ExplorerMenuItem[]\n rootRef?: Ref<HTMLDivElement>\n rootProps?: HTMLAttributes<HTMLDivElement>\n onOpen: () => void\n /** Route of the folder: the tile gets a real link (modified clicks go to the browser). */\n href?: string\n labels?: Partial<ExplorerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<ExplorerFolderTestIds>\n onToggleSelect?: (e: MouseEvent) => void\n onCommitName?: (name: string) => void\n onCancelName?: () => void\n}\n\n/** One folder tile: glyph, name, item count, optional processing count and actions menu. */\nexport function ExplorerFolderTile({\n name,\n displayName,\n path,\n count,\n density,\n editing,\n selected,\n partiallySelected,\n processingCount = 0,\n isOver,\n icon,\n menuItems = [],\n rootRef,\n rootProps,\n onOpen,\n href,\n labels,\n testIds,\n onToggleSelect,\n onCommitName,\n onCancelName,\n}: ExplorerFolderTileProps) {\n const l = { ...DEFAULT_EXPLORER_LABELS, ...labels }\n const iconSize = density === 'list' ? 34 : 48\n const isEmpty = count === 0\n const countLabel = isEmpty ? l.empty : l.itemCount(count)\n const joined = path.join('/')\n\n return (\n <div\n ref={rootRef}\n {...rootProps}\n onClick={editing || href ? undefined : onOpen}\n data-slot=\"explorer-folder-tile\"\n data-testid={testIdOr(testIds?.root, { testId: 'explorer-folder' })}\n data-folder-path={joined}\n title={name}\n className={cn(\n 'group relative flex h-full cursor-pointer select-none flex-col items-center justify-center gap-1 rounded-lg p-2 text-center transition',\n isOver\n ? 'bg-accent ring-2 ring-primary/40'\n : selected\n ? 'bg-accent ring-1 ring-primary/30'\n : 'bg-muted hover:bg-muted/70',\n isEmpty && !isOver && !selected && 'opacity-70'\n )}\n >\n {href && !editing && <TileLink href={href} label={displayName || name} onSelect={onOpen} />}\n {onToggleSelect && !isEmpty && (\n <SelectCheckbox\n selected={!!selected}\n onToggle={onToggleSelect}\n labels={l}\n className={cn(\n 'absolute left-1.5 top-1.5 z-20',\n partiallySelected && !selected && 'opacity-100'\n )}\n />\n )}\n {menuItems.length > 0 && !editing && (\n <div className=\"absolute right-1 top-1 z-20\">\n <ExplorerMenu\n items={menuItems}\n testId={testIdOr(testIds?.menu, { testId: 'explorer-folder-menu' })}\n label={l.moreActions}\n align=\"end\"\n />\n </div>\n )}\n {icon ?? (\n <Folder\n className={cn(\n 'transition',\n isEmpty\n ? 'text-yellow-text/50'\n : 'fill-yellow-text/30 text-yellow-text group-hover:fill-yellow-text/40'\n )}\n size={iconSize}\n />\n )}\n {editing ? (\n <RenameField\n seed={name}\n testId={testIdOr(testIds?.renameInput, { testId: 'explorer-rename-input' })}\n label={l.name}\n onCommit={(next) => onCommitName?.(next)}\n onCancel={() => onCancelName?.()}\n className=\"text-center\"\n />\n ) : (\n displayName && (\n <span\n className={cn(\n 'line-clamp-2 w-full break-words text-xs font-semibold leading-tight',\n isEmpty ? 'text-foreground/60' : 'text-foreground/90'\n )}\n >\n {displayName}\n </span>\n )\n )}\n <span className=\"text-xs text-muted-foreground\">{countLabel}</span>\n {processingCount > 0 && (\n <span\n className=\"inline-flex items-center gap-1 text-xs font-semibold text-primary\"\n data-testid={testIdOr(testIds?.processing, {\n testId: `explorer-folder-processing-${joined}`,\n })}\n >\n <LoaderCircle className=\"size-3 animate-spin\" />\n {l.processing(processingCount)}\n </span>\n )}\n </div>\n )\n}\n\n// ── Hover card ──────────────────────────────────────────────────────────────────────────────\n\nexport interface ExplorerFileTooltipProps {\n title: string\n /** AI summary; a placeholder is shown when empty. */\n summary?: string | null\n /** Pre-formatted \"last modified\" date; omit to hide the meta rows. */\n modifiedLabel?: string | null\n /** Small avatar of whoever last modified it. */\n modifiedByAvatar?: ReactNode\n shared: boolean\n /** Glyph for the shared/private state. */\n visibilityIcon?: ReactNode\n labels: string[]\n /** Fixed strings of the card (not the document labels above). */\n uiLabels?: Partial<ExplorerLabels>\n}\n\n/** The explorer hover card: leads with the AI summary, then who/when and the labels. */\nexport function ExplorerFileTooltip({\n title,\n summary,\n modifiedLabel,\n modifiedByAvatar,\n shared,\n visibilityIcon,\n labels,\n uiLabels,\n}: ExplorerFileTooltipProps) {\n const l = { ...DEFAULT_EXPLORER_LABELS, ...uiLabels }\n return (\n <div className=\"max-w-xs space-y-2\">\n <div className=\"break-words text-xs font-semibold leading-snug text-foreground\">{title}</div>\n <div className=\"space-y-1 border-t border-border pt-1.5\">\n <div className=\"flex items-center gap-1 text-xs font-semibold text-foreground\">\n <Sparkles className=\"size-3.5 shrink-0 text-yellow-text\" />\n {l.aiSummary}\n </div>\n <p className=\"line-clamp-6 text-xs leading-snug text-foreground/90\">\n {summary?.trim() || l.noSummary}\n </p>\n </div>\n {(modifiedLabel || labels.length > 0) && (\n <div className=\"space-y-1.5 border-t border-border pt-1.5\">\n {modifiedLabel && (\n <div className=\"flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-1\">\n <span>{l.lastModifiedBy}</span>\n {modifiedByAvatar}\n <span>{modifiedLabel}</span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {visibilityIcon}\n <span>{shared ? l.shared : l.private}</span>\n </div>\n </div>\n )}\n {labels.length > 0 && (\n <div className=\"flex flex-wrap gap-1 pt-0.5\">\n {labels.map((label) => (\n <span\n key={label}\n className=\"rounded bg-muted px-1.5 py-0.5 text-xs font-medium text-foreground/80\"\n >\n {label}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","export type DocumentGridLayout = 'table' | 'tablet' | 'mobile-list' | 'modal'\n\nexport interface DocumentGridPresets {\n /** Saved-state ids per layout. Tablet, phone and modal keep their own so they never overwrite desktop state. */\n gridIds: Record<DocumentGridLayout, string>\n /** Visible columns (applied when no saved state exists) per layout. */\n visibleColumns: Record<DocumentGridLayout, string[]>\n /** Desktop row height; phones use `mobileRowHeight`. */\n rowHeight: number\n mobileRowHeight?: number\n /** Modal grids are a fixed 50vh; everything else fills its container. */\n modalHeight?: string\n}\n\nexport interface DocumentGridLayoutProps {\n /** Remount key: switching layout must rebuild the grid so state from another layout never leaks. */\n remountKey: string\n gridId: string\n initialVisibleColumns: string[]\n rowHeight: number\n height: string\n}\n\n/**\n * Pick the layout for the current viewport/container: `isNarrow` = phone, `isTablet` = a table\n * container too narrow for the full column set (a docked sidebar, iPad portrait).\n */\nexport function resolveDocumentGridLayout(\n isNarrow: boolean,\n isModal: boolean,\n isTablet = false\n): DocumentGridLayout {\n if (isModal) return 'modal'\n if (isNarrow) return 'mobile-list'\n return isTablet ? 'tablet' : 'table'\n}\n\n/**\n * Column/sizing preset for the documents grid: the props a host spreads onto its GridView so the\n * table, the phone list and the modal each get their own state id, default columns and sizing.\n * Column definitions (explicit `colId`s) and the ids themselves stay with the host.\n */\nexport function documentGridLayoutProps(\n layout: DocumentGridLayout,\n presets: DocumentGridPresets\n): DocumentGridLayoutProps {\n return {\n remountKey: layout === 'mobile-list' || layout === 'tablet' ? layout : 'table',\n gridId: presets.gridIds[layout],\n initialVisibleColumns: presets.visibleColumns[layout],\n rowHeight: layout === 'mobile-list' ? (presets.mobileRowHeight ?? 64) : presets.rowHeight,\n height: layout === 'modal' ? (presets.modalHeight ?? '50vh') : '100%',\n }\n}\n","import type { ReactNode } from 'react'\nimport { AlertCircle, FolderOpen, X } from 'lucide-react'\nimport { Button, Progress, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\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-transparent bg-muted hover:bg-muted/70',\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 { AlertTriangle, CheckCircle2, Download, FolderUp, Users, XCircle } 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 exportColumns: string\n columnsVisible: string\n columnsAll: string\n columnsFiles: string\n columnsHelp: string\n exportToWorkspace: string\n exportToWorkspaceDescription: 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',\n selected: (count) => `${count} selected`,\n exportMethod: 'Export Method',\n downloadToComputer: 'Download to Computer',\n downloadDescription: 'Download all selected documents as a ZIP file with metadata CSV',\n exportColumns: 'Export Columns',\n columnsVisible: 'Visible columns (from current table view)',\n columnsAll: 'All columns (including hidden)',\n columnsFiles: 'Files only (no metadata CSV)',\n columnsHelp: 'Choose which columns to include in the metadata CSV file',\n exportToWorkspace: 'Export to Another Workspace',\n exportToWorkspaceDescription: 'Copy documents to another workspace in ARBI',\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. */\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 <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 </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// ── Method chooser (documents only) ─────────────────────────────────────────────────────────\n\nexport type ExportMode = 'workspace' | 'download'\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 labels?: Partial<ExportLabels>\n /** Overrides the columns select test id (default `export-columns-selector`). */\n columnsTestId?: string\n}\n\n/** \"Download to computer\" vs \"Export to another workspace\", with the CSV columns picker. */\nexport function ExportMethodChooser({\n mode,\n onModeChange,\n columnsMode,\n onColumnsModeChange,\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 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 <div className={card}>\n <RadioGroupItem value=\"download\" id=\"download\" className=\"mt-1\" />\n <div className=\"flex-1\" onClick={() => onModeChange('download')}>\n <Label\n htmlFor=\"download\"\n className=\"flex cursor-pointer items-center gap-2 font-medium\"\n >\n <Download className=\"size-4\" />\n {l.downloadToComputer}\n </Label>\n <p className=\"mt-1 text-sm text-muted-foreground\">{l.downloadDescription}</p>\n {mode === 'download' && (\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 <div className={card}>\n <RadioGroupItem value=\"workspace\" id=\"workspace\" className=\"mt-1\" />\n <div className=\"flex-1\" onClick={() => onModeChange('workspace')}>\n <Label\n htmlFor=\"workspace\"\n className=\"flex cursor-pointer items-center gap-2 font-medium\"\n >\n <FolderUp className=\"size-4\" />\n {l.exportToWorkspace}\n </Label>\n <p className=\"mt-1 text-sm text-muted-foreground\">{l.exportToWorkspaceDescription}</p>\n </div>\n </div>\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 {\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}. Tap 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 pill 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 rounded-md bg-muted px-2 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 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 <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 <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 * One small zoom button for touch devices (desktop has no zoom control: the page already fits\n * the width). It stays quiet at fit width and shows the level once zoomed; pinch and double-tap\n * 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 aria-label={l.zoom(level)}\n data-testid={testIdOr(testIds?.button, { testId: 'viewer-zoom-button' })}\n className=\"absolute right-3 bottom-4 z-10 hidden h-11 min-w-11 items-center justify-center gap-1 rounded-full border border-border bg-background/95 px-2.5 shadow-md backdrop-blur pointer-coarse:inline-flex\"\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 { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Left side of the viewer header: tabs, title and status; shrinks and clips. */\nexport function ViewerHeaderStart({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"viewer-header-start\"\n className=\"flex min-w-0 items-center gap-2 overflow-hidden\"\n >\n {children}\n </div>\n )\n}\n\n/** Right side of the viewer header: the actions; never shrinks. */\nexport function ViewerHeaderEnd({\n isCompact,\n children,\n}: {\n isCompact?: boolean\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"viewer-header-end\"\n className={cn('flex flex-shrink-0 items-center', isCompact ? 'gap-1' : 'gap-2')}\n >\n {children}\n </div>\n )\n}\n\n/** Muted inline status next to the title (\"streaming...\", \"Draft — not saved\"). */\nexport function ViewerStatusNote({\n pulse,\n testId,\n children,\n}: {\n /** Animate while something is being produced. */\n pulse?: boolean\n testId?: string\n children: ReactNode\n}) {\n return (\n <span\n data-slot=\"viewer-status-note\"\n className={cn('flex-shrink-0 text-sm text-muted-foreground', pulse && 'animate-pulse')}\n data-testid={testId}\n >\n {children}\n </span>\n )\n}\n\n/**\n * A pane of the viewer body. `hidden` keeps it mounted but out of sight (media keeps playing\n * while the transcript is read); `scroll` makes the pane scroll itself.\n */\nexport function ViewerPane({\n hidden,\n scroll,\n testId,\n children,\n}: {\n hidden?: boolean\n scroll?: boolean\n testId?: string\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"viewer-pane\"\n data-testid={testId}\n className={cn(hidden ? 'hidden' : scroll ? 'h-full overflow-auto' : 'relative h-full')}\n >\n {children}\n </div>\n )\n}\n\n/** Padding around rendered (read-only) markdown. */\nexport function ViewerRenderedPane({ testId, children }: { testId?: string; children: ReactNode }) {\n return (\n <div data-slot=\"viewer-rendered\" className=\"p-6\" data-testid={testId}>\n {children}\n </div>\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 on phones, 24px from `sm`, the same as the other pages.\n */\nexport function FilesPageHeader({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-page-header\"\n className={cn(\n 'sticky top-0 z-10 flex flex-col gap-3 bg-background px-4 pb-3 pt-4 sm:px-6',\n className\n )}\n {...props}\n />\n )\n}\n\n/** The scrolling content area (grid, gallery, review, smart search). */\nexport function FilesPageMain({ className, ...props }: ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"files-page-main\"\n className={cn('min-h-0 flex-1 overflow-hidden bg-background px-4 sm:px-6', className)}\n {...props}\n />\n )\n}\n","import type { ComponentType, ReactNode } from 'react'\nimport { GridView, type GridViewProps } from './GridView'\nimport {\n documentGridLayoutProps,\n type DocumentGridLayout,\n type DocumentGridPresets,\n} from './documentGridLayout'\n\n/**\n * Row vocabulary of the documents table. The row open in the viewer (its name cell carries\n * `data-viewing`) is the one strong state: full accent tint plus a 2px primary bar. Checkbox-selected\n * rows use the lighter grid theme tint, so the two never read as the same thing. Empty values\n * (`cell-empty`, an em dash) are muted.\n */\nconst DOCUMENT_GRID_CLASS =\n 'w-full [&_.cell-empty]:text-muted-foreground [&_.ag-row:has([data-viewing])]:!bg-accent [&_.ag-row:has([data-viewing])]:shadow-[inset_2px_0_0_hsl(var(--primary))]'\n\nexport interface DocumentGridProps<T> extends Omit<\n GridViewProps<T>,\n 'gridId' | 'initialVisibleColumns' | 'rowHeight' | 'height' | 'persistState'\n> {\n /** Table, phone list or modal: each keeps its own saved state, default columns and sizing. */\n layout: DocumentGridLayout\n /** Saved-state ids, default columns and row heights per layout (ids and `colId`s stay with the host). */\n presets: DocumentGridPresets\n /**\n * The grid implementation to render. Defaults to the core `GridView`; a host passes its own\n * wrapper to add persistence of column state (the core has no store).\n */\n GridComponent?: ComponentType<GridViewProps<T>>\n /**\n * Shown instead of the grid when the workspace has no documents at all (first-run upload\n * prompt). The host decides when via `showEmptyWorkspace`.\n */\n emptyWorkspace?: ReactNode\n showEmptyWorkspace?: boolean\n}\n\n/**\n * The documents table: a GridView preset with the saved-state id, default columns and sizing\n * for the current layout, remounted when the layout flips between table and phone list so state\n * from one never leaks into the other. The host passes rows, column defs (explicit `colId`s) and\n * handlers.\n */\nexport function DocumentGrid<T>({\n layout,\n presets,\n GridComponent = GridView,\n emptyWorkspace,\n showEmptyWorkspace,\n testId = 'documents-grid',\n className = DOCUMENT_GRID_CLASS,\n ...grid\n}: DocumentGridProps<T>) {\n if (showEmptyWorkspace && emptyWorkspace) return <>{emptyWorkspace}</>\n const { remountKey, ...layoutProps } = documentGridLayoutProps(layout, presets)\n return (\n <GridComponent\n key={remountKey}\n {...grid}\n {...layoutProps}\n persistState\n testId={testId}\n className={className}\n />\n )\n}\n","import { useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { ArrowLeftRight, Download, Eye, EyeOff, X } from 'lucide-react'\nimport {\n Button,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { DEFAULT_VIEWER_LABELS, type ViewerLabels } from './ViewerChrome'\n\n// ── Tabs ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface ViewerTab {\n id: string\n icon: ReactNode\n /** Tooltip and accessible name. */\n tooltip: string\n /** Visible text next to the icon, for tabs whose icon alone is not self-explanatory. */\n label?: string\n /** Overrides the tab test id (default `<id>-tab`). */\n testId?: string\n}\n\nexport interface ViewerTabBarProps {\n tabs: ViewerTab[]\n activeId: string\n onChange: (id: string) => void\n className?: string\n}\n\n/** Underline tab strip for the viewer's formats (PDF, DOCX, Source, Versions, HTML...). */\nexport function ViewerTabBar({ tabs, activeId, onChange, className }: ViewerTabBarProps) {\n return (\n <TooltipProvider>\n <div className={cn('flex shrink-0 items-center', className)} role=\"group\">\n {tabs.map((tab) => {\n const isActive = tab.id === activeId\n return (\n <Tooltip key={tab.id}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => onChange(tab.id)}\n aria-label={tab.tooltip}\n aria-pressed={isActive}\n data-testid={testIdOr(tab.testId, { testId: `${tab.id}-tab` })}\n className={cn(\n 'shrink-0 border-b-2 px-3 py-2 font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n tab.label && 'inline-flex items-center gap-1.5 text-sm',\n isActive\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:border-border hover:text-foreground'\n )}\n >\n {tab.icon}\n {tab.label && <span>{tab.label}</span>}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{tab.tooltip}</TooltipContent>\n </Tooltip>\n )\n })}\n </div>\n </TooltipProvider>\n )\n}\n\n// ── Page counter ────────────────────────────────────────────────────────────────────────────\n\nexport interface ViewerPageCounterProps {\n page: number\n total: number\n /** Called with a valid 1..total page typed into the counter. */\n onGoTo: (page: number) => void\n labels?: Partial<ViewerLabels>\n}\n\n/** \"3 / 12\": click the number to type a page; Enter or blur commits, Escape cancels. */\nexport function ViewerPageCounter({ page, total, onGoTo, labels }: ViewerPageCounterProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n const [isEditing, setIsEditing] = useState(false)\n const [input, setInput] = useState('')\n const inputRef = useRef<HTMLInputElement>(null)\n if (total <= 0) return null\n\n const commit = () => {\n const n = parseInt(input, 10)\n if (!isNaN(n) && n >= 1 && n <= total) onGoTo(n)\n setIsEditing(false)\n }\n\n return (\n <div className=\"flex shrink-0 items-center gap-1 rounded-md bg-muted px-2 py-1\">\n {isEditing ? (\n <input\n ref={inputRef}\n autoFocus\n type=\"text\"\n value={input}\n onFocus={(e) => e.currentTarget.select()}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit()\n else if (e.key === 'Escape') setIsEditing(false)\n }}\n onBlur={commit}\n className=\"w-8 rounded border border-border bg-background px-1 py-0.5 text-center text-sm font-medium focus:outline-none\"\n aria-label={l.pageInput}\n />\n ) : (\n <button\n type=\"button\"\n onClick={() => {\n setInput(String(page))\n setIsEditing(true)\n }}\n className=\"min-w-[2rem] cursor-text rounded border border-border bg-background px-1 py-0.5 text-sm font-medium transition-colors hover:bg-muted pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n title={l.pageOfTitle}\n aria-label={l.pageOf(page, total)}\n >\n {page}\n </button>\n )}\n <span className=\"text-sm text-muted-foreground\">/ {total}</span>\n </div>\n )\n}\n\n// ── Fallbacks ───────────────────────────────────────────────────────────────────────────────\n\n/** A format that cannot be previewed in the browser: offer the original instead. */\nexport function ViewerPreviewUnavailable({\n extension,\n onDownload,\n labels,\n}: {\n extension: string\n onDownload: () => void\n labels?: Partial<ViewerLabels>\n}) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-4 p-8 text-center\">\n <div className=\"text-4xl text-muted-foreground\" aria-hidden>\n 📄\n </div>\n <div>\n <p className=\"mb-1 font-medium\">{l.previewUnavailable}</p>\n <p className=\"mb-4 text-sm text-muted-foreground\">{l.cannotPreview(extension)}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onDownload}>\n <Download className=\"mr-2 size-4\" />\n {l.downloadToOpen}\n </Button>\n </div>\n </div>\n )\n}\n\n/** The file failed to load: say so and offer the download instead. */\nexport function ViewerLoadError({\n message,\n onDownload,\n labels,\n testId,\n}: {\n message: string\n onDownload: () => void\n labels?: Partial<ViewerLabels>\n /** Overrides the root test id (default `pdf-load-error`). */\n testId?: string\n}) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n return (\n <div\n className=\"flex h-full flex-col items-center justify-center gap-3 p-8 text-center\"\n data-testid={testIdOr(testId, { testId: 'pdf-load-error' })}\n >\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onDownload}>\n <Download className=\"mr-2 size-4\" />\n {l.download}\n </Button>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { CopyX, Sparkles } from 'lucide-react'\nimport {\n IconToggle,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the upload footer. Pass a partial `labels` to translate or reword. */\nexport interface UploadFooterLabels {\n skipDuplicates: string\n skipDuplicatesActive: string\n skipDuplicatesInactive: string\n autoRename: string\n autoRenameActive: string\n autoRenameInactive: string\n titleInstruction: string\n titleInstructionPlaceholder: string\n}\n\nexport const DEFAULT_UPLOAD_FOOTER_LABELS: UploadFooterLabels = {\n skipDuplicates: 'Skip duplicates',\n skipDuplicatesActive: 'Skip identical files already in the workspace',\n skipDuplicatesInactive: 'Allow uploading identical files',\n autoRename: 'Auto-rename',\n autoRenameActive: 'Generate a descriptive title via AI instead of using the filename',\n autoRenameInactive: 'Keep the original filename',\n titleInstruction: 'Title instruction',\n titleInstructionPlaceholder: 'Optional: how should AI name these documents?',\n}\n\nexport interface UploadFooterTestIds {\n bar: string\n skipDuplicates: string\n autoRename: string\n settingsPanel: string\n instruction: string\n}\n\n// ── Container ───────────────────────────────────────────────────────────────────────────────\n\nexport function UploadContainer({\n children,\n className = 'p-4 sm:p-6',\n testId,\n}: {\n children: ReactNode\n className?: string\n /** Overrides the root test id (default `upload-container`). */\n testId?: string\n}) {\n return (\n <div\n className={className}\n data-slot=\"upload-container\"\n data-testid={testIdOr(testId, { testId: 'upload-container' })}\n >\n {children}\n </div>\n )\n}\n\n// ── Share note ──────────────────────────────────────────────────────────────────────────────\n\nexport interface UploadShareNoteProps {\n /** What the current choice means, e.g. \"Uploaded documents will be shared with this workspace\". */\n description: string\n /** The visibility toggle itself (the host owns it). */\n children: ReactNode\n /** Compact: a tooltip on the toggle. Otherwise a tonal card with the text beneath it. */\n compact?: boolean\n /** Overrides the wrapper test id (default `share-toggle`). */\n testId?: string\n}\n\n/** Wraps the upload visibility toggle with its explanation (tooltip when compact, text otherwise). */\nexport function UploadShareNote({\n description,\n children,\n compact = false,\n testId,\n}: UploadShareNoteProps) {\n const id = testIdOr(testId, { testId: 'share-toggle' })\n if (compact) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <div data-testid={id}>{children}</div>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-xs\">\n <p className=\"text-sm\">{description}</p>\n </TooltipContent>\n </Tooltip>\n )\n }\n return (\n <div className=\"rounded-lg bg-muted p-4\" data-testid={id}>\n <div className=\"flex flex-col gap-3\">\n {children}\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n </div>\n </div>\n )\n}\n\n// ── Footer bar ──────────────────────────────────────────────────────────────────────────────\n\nconst TOGGLE_COLORS = { text: 'text-primary', bg: 'bg-primary' }\n\nexport interface UploadFooterBarProps {\n skipDuplicates: boolean\n onSkipDuplicatesChange: (value: boolean) => void\n autoRename: boolean\n onAutoRenameChange: (value: boolean) => void\n autoRenameInstruction: string\n onAutoRenameInstructionChange: (value: string) => void\n /** The visibility toggle, right-aligned before the submit button. */\n shareToggle?: ReactNode\n /** The Upload submit button (the view's ONE primary action). */\n children: ReactNode\n className?: string\n labels?: Partial<UploadFooterLabels>\n testIds?: Partial<UploadFooterTestIds>\n}\n\n/**\n * The upload action footer: everyday toggles next to the submit button\n * (`[Skip duplicates] [Auto-rename] ... [Visibility] [Upload N]`). When Auto-rename is on, its\n * title instruction drops in just below.\n */\nexport function UploadFooterBar({\n skipDuplicates,\n onSkipDuplicatesChange,\n autoRename,\n onAutoRenameChange,\n autoRenameInstruction,\n onAutoRenameInstructionChange,\n shareToggle,\n children,\n className,\n labels,\n testIds,\n}: UploadFooterBarProps) {\n const l = { ...DEFAULT_UPLOAD_FOOTER_LABELS, ...labels }\n return (\n <>\n <div\n className={cn(\n 'flex shrink-0 flex-wrap items-center gap-x-3 gap-y-2 border-t border-border bg-background px-4 py-3 sm:px-6',\n className\n )}\n data-testid={testIdOr(testIds?.bar, { testId: 'upload-footer-bar' })}\n >\n <IconToggle\n icon={CopyX}\n isActive={skipDuplicates}\n onToggle={onSkipDuplicatesChange}\n colors={TOGGLE_COLORS}\n showLabel={true}\n label={l.skipDuplicates}\n tooltipActive={l.skipDuplicatesActive}\n tooltipInactive={l.skipDuplicatesInactive}\n data-testid={testIdOr(testIds?.skipDuplicates, { testId: 'toggle-skip-duplicates' })}\n />\n <IconToggle\n icon={Sparkles}\n isActive={autoRename}\n onToggle={onAutoRenameChange}\n colors={TOGGLE_COLORS}\n showLabel={true}\n label={l.autoRename}\n tooltipActive={l.autoRenameActive}\n tooltipInactive={l.autoRenameInactive}\n data-testid={testIdOr(testIds?.autoRename, { testId: 'toggle-auto-rename' })}\n />\n <div className=\"hidden flex-1 sm:block\" />\n {shareToggle}\n {/* Phones: the primary action is a full-width button on its own row below the options. */}\n <div className=\"w-full sm:w-auto max-sm:[&>button]:w-full\">{children}</div>\n </div>\n\n {autoRename && (\n <div\n className=\"shrink-0 border-t border-border bg-background px-4 py-3 sm:px-6\"\n data-testid={testIdOr(testIds?.settingsPanel, { testId: 'upload-settings-panel' })}\n >\n <label htmlFor=\"auto-rename-instruction\" className=\"text-sm font-medium\">\n {l.titleInstruction}\n </label>\n <Textarea\n id=\"auto-rename-instruction\"\n value={autoRenameInstruction}\n onChange={(e) => onAutoRenameInstructionChange(e.target.value)}\n placeholder={l.titleInstructionPlaceholder}\n className=\"mt-1 min-h-[60px] text-sm\"\n data-testid={testIdOr(testIds?.instruction, { testId: 'auto-rename-instruction' })}\n />\n </div>\n )}\n </>\n )\n}\n","import { useCallback, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Check, FolderOpen, Minus, Plus, X } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the folder pickers. Pass a partial `labels` to translate or reword. */\nexport interface FolderPickerLabels {\n none: string\n removeFromFolder: string\n searchOrCreate: string\n noFolders: string\n create: (name: string) => string\n}\n\nexport const DEFAULT_FOLDER_PICKER_LABELS: FolderPickerLabels = {\n none: 'None',\n removeFromFolder: 'Remove from folder',\n searchOrCreate: 'Search or create...',\n noFolders: 'No folders yet',\n create: (name) => `Create \\u201c${name}\\u201d`,\n}\n\nexport interface FolderCommandListTestIds {\n create: string\n createOption: string\n remove: string\n /** Replaces the whole `folder-picker-option-<folder>` id. */\n option: (folder: string) => string\n}\n\n// ── Tree row ────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderPickerRowProps {\n label: string\n /** Optional leading glyph (e.g. a connector brand mark for provider roots). */\n icon?: ReactNode\n count: number\n depth: number\n isActive: boolean\n muted?: boolean\n /** Test id of the row button (none by default). */\n testId?: string\n /**\n * Draw a checkbox in the leading slot instead of the single-select tick. A list you can pick\n * SEVERAL rows from should look like one: a lone tick reads \"this is the current one\", a box\n * reads \"tick the ones you want\".\n */\n checkbox?: boolean\n /** Checkbox only: some descendants are selected, so show a dash, not a tick. */\n indeterminate?: boolean\n onClick: () => void\n}\n\n/** One folder row: indented by depth, with a count. Whole row is the target (44px on touch). */\nexport function FolderPickerRow({\n label,\n icon,\n count,\n depth,\n isActive,\n muted,\n checkbox,\n indeterminate,\n testId,\n onClick,\n}: FolderPickerRowProps) {\n return (\n <button\n type=\"button\"\n data-testid={testId}\n onClick={onClick}\n // The row IS the checkbox: a real <Checkbox> inside this button would nest one interactive\n // element in another and swallow the click. role + aria-checked carry the same meaning.\n role={checkbox ? 'checkbox' : undefined}\n aria-checked={checkbox ? (indeterminate ? 'mixed' : isActive) : undefined}\n style={{ paddingLeft: `${4 + depth * 14}px` }}\n className={cn(\n // `[&:hover]:`, not `hover:`: the latter compiles behind `@media (hover: hover)`, so on a\n // touchscreen whose PRIMARY pointer reports `hover: none` the row would never highlight\n // even with a real mouse attached. The arbitrary selector has no media gate.\n 'flex w-full items-center gap-1 rounded-sm py-1 pr-2 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&:hover]:bg-accent pointer-coarse:min-h-11',\n isActive && 'bg-primary/10',\n muted && !isActive && 'text-muted-foreground'\n )}\n >\n <span className=\"flex w-4 shrink-0 items-center justify-center\">\n {checkbox ? (\n <span\n className={cn(\n 'flex size-3.5 items-center justify-center rounded-[3px] border transition-colors',\n isActive || indeterminate\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-muted-foreground/40'\n )}\n >\n {indeterminate ? (\n <Minus className=\"size-2.5\" />\n ) : (\n isActive && <Check className=\"size-2.5\" />\n )}\n </span>\n ) : (\n isActive && <Check className=\"size-3.5 text-primary\" />\n )}\n </span>\n {icon}\n {label !== '' && (\n <span className={cn('min-w-0 truncate', isActive && 'font-semibold text-primary')}>\n {label}\n </span>\n )}\n <span className=\"ml-auto pl-2 text-sm font-semibold text-muted-foreground\">{count}</span>\n </button>\n )\n}\n\n// ── Tree ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderTreeNode {\n path: string\n label: string\n depth: number\n count: number\n /** Replaces the label's default look (provider roots show a brand mark). */\n icon?: ReactNode\n}\n\nexport interface FolderTreeProps {\n nodes: FolderTreeNode[]\n unfiledCount: number\n /** string = folder path selected, null = Unfiled selected, undefined = nothing selected. */\n value: string | null | undefined\n onChange: (folder: string | null) => void\n /** Show the Unfiled (\"None\") row even when it is empty. */\n showUnfiledAlways?: boolean\n labels?: Partial<FolderPickerLabels>\n}\n\n/** Folder hierarchy with an Unfiled option at the bottom. No \"All\" row: callers add their own. */\nexport function FolderTree({\n nodes,\n unfiledCount,\n value,\n onChange,\n showUnfiledAlways,\n labels,\n}: FolderTreeProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n return (\n <div className=\"max-h-[240px] overflow-y-auto\">\n {nodes.map((node) => (\n <FolderPickerRow\n key={node.path}\n label={node.label}\n icon={node.icon}\n count={node.count}\n depth={node.depth}\n isActive={value === node.path}\n onClick={() => onChange(node.path)}\n />\n ))}\n {(unfiledCount > 0 || showUnfiledAlways) && (\n <>\n {nodes.length > 0 && <div className=\"my-1 border-t border-border\" />}\n <FolderPickerRow\n label={l.none}\n count={unfiledCount}\n depth={0}\n isActive={value === null}\n muted\n onClick={() => onChange(null)}\n />\n </>\n )}\n </div>\n )\n}\n\n// ── Searchable list ─────────────────────────────────────────────────────────────────────────\n\nfunction FolderBreadcrumb({ folder }: { folder: string }) {\n const parts = folder.split('/')\n return (\n <span className=\"whitespace-nowrap\">\n {parts.map((part, i) => (\n <span key={i} className=\"inline-flex items-center gap-0.5\">\n {i > 0 && <span className=\"mx-0.5 text-sm text-muted-foreground/50\">/</span>}\n <span className={i < parts.length - 1 ? 'text-sm text-muted-foreground' : ''}>\n {part}\n </span>\n </span>\n ))}\n </span>\n )\n}\n\nexport interface FolderCommandListProps {\n /** Existing folder paths (the host derives them from its documents). */\n folders: string[]\n /** Selected folder (null = unfiled, undefined = no selection). */\n value?: string | null\n /** A folder was picked or a new one created. */\n onSelect: (folder: string | null) => void\n /** Show the remove / move-to-root option. */\n showRemove?: boolean\n /** Wins over `labels.removeFromFolder`. */\n removeLabel?: string\n /** Wins over `labels.searchOrCreate`. */\n placeholder?: string\n autoFocus?: boolean\n labels?: Partial<FolderPickerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<FolderCommandListTestIds>\n}\n\n/**\n * Searchable folder picker: filter existing folders, create one by typing a new name, optional\n * \"Remove from folder\". Shows hierarchy as breadcrumbs.\n */\nexport function FolderCommandList({\n folders,\n value,\n onSelect,\n showRemove = false,\n removeLabel,\n placeholder,\n autoFocus = true,\n labels,\n testIds,\n}: FolderCommandListProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n const [search, setSearch] = useState('')\n const trimmed = search.trim()\n const matchesExisting = folders.some((f) => f.toLowerCase() === trimmed.toLowerCase())\n\n const handleCreate = useCallback(\n (name: string) => {\n const next = name.trim()\n if (!next) return\n onSelect(next)\n setSearch('')\n },\n [onSelect]\n )\n\n return (\n <Command shouldFilter={true}>\n <CommandInput\n placeholder={placeholder ?? l.searchOrCreate}\n value={search}\n onValueChange={setSearch}\n autoFocus={autoFocus}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && trimmed && !matchesExisting) {\n e.preventDefault()\n handleCreate(search)\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {trimmed ? (\n <button\n type=\"button\"\n data-testid={testIdOr(testIds?.create, { testId: 'folder-picker-create' })}\n onClick={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"flex w-full cursor-pointer items-center gap-1.5 rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n <Plus className=\"size-3.5 shrink-0\" />\n {l.create(trimmed)}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.noFolders}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {folders.map((folder) => (\n <CommandItem\n key={folder}\n value={folder}\n data-testid={testIdOr(testIds?.option?.(folder), {\n testId: `folder-picker-option-${folder}`,\n })}\n onSelect={() => onSelect(folder)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm\"\n >\n <FolderOpen className=\"mr-1.5 size-3.5 flex-none shrink-0 text-yellow-text\" />\n <FolderBreadcrumb folder={folder} />\n {value === folder && (\n <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n\n {trimmed && !matchesExisting && folders.length > 0 && (\n <CommandGroup>\n <CommandItem\n value={`__create__${trimmed}`}\n data-testid={testIdOr(testIds?.createOption, {\n testId: 'folder-picker-create-option',\n })}\n onSelect={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-primary\"\n >\n <Plus className=\"mr-1.5 size-3.5 shrink-0\" />\n <span>{l.create(trimmed)}</span>\n </CommandItem>\n </CommandGroup>\n )}\n\n {showRemove && (\n <CommandGroup>\n <CommandItem\n value=\"__none__\"\n data-testid={testIdOr(testIds?.remove, { testId: 'folder-picker-remove' })}\n onSelect={() => onSelect(null)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-muted-foreground\"\n >\n <X className=\"mr-1 size-3.5 shrink-0\" />\n <span>{removeLabel ?? l.removeFromFolder}</span>\n {value === null && <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>}\n </CommandItem>\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n )\n}\n","import { memo, useState } from 'react'\nimport type { ReactNode, Ref } from 'react'\nimport { Check, Columns2, Copy, Share2, StickyNote, Tags, X } 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 instantTranslation: string\n backToDocument: string\n compareOriginal: string\n copyComparison: string\n copyTranslation: string\n passage: string\n original: string\n translation: 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 instantTranslation: 'Instant Translation',\n backToDocument: 'Back to document',\n compareOriginal: 'Compare original vs translation',\n copyComparison: 'Copy comparison',\n copyTranslation: 'Copy full translation',\n passage: 'Passage',\n original: 'Original',\n translation: 'Translation',\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// ── Translation ─────────────────────────────────────────────────────────────────────────────\n\nexport interface TranslationBadgeProps {\n isComparing: boolean\n onToggleCompare: () => void\n onCopy: () => Promise<void>\n labels?: Partial<HtmlViewerLabels>\n}\n\n/** \"Instant Translation\" chip with compare toggle and copy. */\nexport function TranslationBadge({\n isComparing,\n onToggleCompare,\n onCopy,\n labels,\n}: TranslationBadgeProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n const [copied, setCopied] = useState(false)\n const handleCopy = async () => {\n await onCopy()\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n const iconButton =\n 'flex items-center transition-colors hover:text-blue-text-strong pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:justify-center'\n return (\n <span\n className=\"inline-flex items-center gap-1 rounded-md border border-blue-border bg-blue-bg py-0.5 pl-2 pr-1 text-sm font-medium text-blue-text\"\n data-slot=\"translation-badge\"\n >\n {l.instantTranslation}\n <button\n type=\"button\"\n onClick={onToggleCompare}\n className={iconButton}\n title={isComparing ? l.backToDocument : l.compareOriginal}\n aria-label={isComparing ? l.backToDocument : l.compareOriginal}\n >\n {isComparing ? <X className=\"size-3\" /> : <Columns2 className=\"size-3\" />}\n </button>\n <button\n type=\"button\"\n onClick={handleCopy}\n className={iconButton}\n title={isComparing ? l.copyComparison : l.copyTranslation}\n aria-label={isComparing ? l.copyComparison : l.copyTranslation}\n >\n {copied ? <Check className=\"size-3\" /> : <Copy className=\"size-3\" />}\n </button>\n </span>\n )\n}\n\nexport interface TranslationRowView {\n key: string\n /** The passage reference pill (host renders its entity). */\n passage: ReactNode\n original: string\n translated: string\n}\n\n/** Passage / Original / Translation table. */\nexport function TranslationCompareTable({\n rows,\n labels,\n}: {\n rows: TranslationRowView[]\n labels?: Partial<HtmlViewerLabels>\n}) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n const th = 'border border-border px-4 py-2 text-left text-sm font-medium text-muted-foreground'\n return (\n <div className=\"h-full w-full overflow-y-auto bg-muted p-4\" data-slot=\"translation-compare\">\n <div className=\"mx-auto max-w-6xl\">\n <table className=\"w-full border-collapse overflow-hidden rounded-md border border-border bg-background\">\n <thead>\n <tr className=\"bg-muted\">\n <th className={cn(th, 'w-40 px-3')} translate=\"no\">\n {l.passage}\n </th>\n <th className={cn(th, 'w-1/2')} translate=\"no\">\n {l.original}\n </th>\n <th className={cn(th, 'w-1/2 text-blue-text')} translate=\"no\">\n {l.translation}\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.key} className=\"align-top\">\n <td className=\"border border-border px-3 py-2\" translate=\"no\">\n {row.passage}\n </td>\n <td\n className=\"whitespace-pre-wrap border border-border px-4 py-2 text-sm text-foreground\"\n translate=\"no\"\n >\n {row.original}\n </td>\n <td className=\"whitespace-pre-wrap border border-border px-4 py-2 text-sm text-foreground\">\n {row.translated}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\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 { 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}\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 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 key={tag.id} className=\"border-b border-border last:border-b-0\">\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 <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 </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 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 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 >\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 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 { BookMarked } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Row of controls that follows the tab: filter field, folder picker, tags button. */\nexport function FilesFilterBar({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-filter-bar\"\n className={cn('flex min-w-0 flex-1 flex-nowrap items-center gap-2', className)}\n {...props}\n />\n )\n}\n\nexport interface FilesTagsButtonProps {\n onClick: () => void\n /** Button text (default \"Tags\"). */\n label?: string\n className?: string\n /** Overrides the test id (default `filter-bar-tags-button`). */\n testId?: string\n}\n\n/** Opens the labels / annotations vocabulary editor. The label collapses to sr-only on phones. */\nexport function FilesTagsButton({\n onClick,\n label = 'Tags',\n className,\n testId,\n}: FilesTagsButtonProps) {\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn('h-8 shrink-0 gap-1.5 px-2 font-normal pointer-coarse:h-11', className)}\n onClick={onClick}\n data-testid={testIdOr(testId, { testId: 'filter-bar-tags-button' })}\n >\n <BookMarked className=\"h-3.5 w-3.5\" />\n <span className=\"text-sm max-[480px]:sr-only\">{label}</span>\n </Button>\n )\n}\n\n/**\n * The view switch beside the page title. Marks a size container so the switch collapses its labels\n * to icons by the room it is given (not the viewport), and shrinks with the row.\n */\nexport function FilesViewCenter({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-view-center\"\n className={cn('@container flex min-w-[9.5rem] flex-1 items-center gap-2', className)}\n {...props}\n />\n )\n}\n\nexport interface FilesModalFooterProps {\n children?: ReactNode\n className?: string\n}\n\n/** Footer row used when the page is hosted in a modal. */\nexport function FilesModalFooter({ children, className }: FilesModalFooterProps) {\n return (\n <div\n data-slot=\"files-modal-footer\"\n className={cn(\n // Sticks to the bottom of the modal's scrolling body so Close is always reachable.\n 'sticky bottom-0 z-40 flex justify-end gap-2 border-t border-border bg-background px-4 py-3 sm:px-6',\n className\n )}\n >\n {children}\n </div>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport { ExternalLink, Loader2, RefreshCw, Settings, Square, Unplug } from 'lucide-react'\nimport { Button, Progress, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the import parts. Pass a partial `labels` to translate or reword. */\nexport interface ImportLabels {\n stop: string\n stopping: string\n importNow: string\n settings: string\n importingOf: (processed: number, total: number, noun: string) => string\n importing: (processed: number, noun: string) => string\n foldersSelected: (count: number) => string\n folders: (names: string) => string\n moreFolders: (count: number) => string\n connect: string\n reconnect: string\n reconnecting: string\n disconnect: string\n disconnecting: string\n /** Shown under a family that needs re-consent; `reconnect` is rendered bold inside it. */\n reconnectHint: (reconnectLabel: ReactNode) => ReactNode\n}\n\nexport const DEFAULT_IMPORT_LABELS: ImportLabels = {\n stop: 'Stop',\n stopping: 'Stopping…',\n importNow: 'Import now',\n settings: 'Settings',\n importingOf: (processed, total, noun) => `Importing ${processed} of ${total} ${noun}…`,\n importing: (processed, noun) => `Importing ${processed} ${noun}…`,\n foldersSelected: (count) => `Folders: ${count} selected`,\n folders: (names) => `Folders: ${names}`,\n moreFolders: (count) => ` +${count} more`,\n connect: 'Connect',\n reconnect: 'Reconnect',\n reconnecting: 'Reconnecting…',\n disconnect: 'Disconnect',\n disconnecting: 'Disconnecting…',\n reconnectHint: (reconnectLabel) => (\n <>\n Couldn’t reach this account. Click {reconnectLabel} — if it keeps happening, log out and back\n in to refresh the connection.\n </>\n ),\n}\n\n/** Divided list of provider rows inside a family section. */\nexport function ImportList({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div data-slot=\"import-list\" className={cn('divide-y divide-border', className)} {...props} />\n )\n}\n\nexport interface ImportRowProps {\n /** Brand mark, already sized by the caller. */\n logo: ReactNode\n name: ReactNode\n /** Right-aligned actions on the top line. */\n actions?: ReactNode\n /** Detail rows below the top line (summary, progress, handoff, dialogs). */\n children?: ReactNode\n testId?: string\n className?: string\n}\n\n/** One provider row: logo + name + actions, with detail content beneath. */\nexport function ImportRow({ logo, name, actions, children, testId, className }: ImportRowProps) {\n return (\n <div data-slot=\"import-row\" data-testid={testId} className={cn('py-3', className)}>\n <div className=\"flex items-center gap-2.5\">\n {logo}\n <div className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">{name}</div>\n {actions}\n </div>\n {children}\n </div>\n )\n}\n\n/** Muted explanatory text aligned under the provider name. */\nexport function ImportHint({ className, ...props }: ComponentProps<'p'>) {\n return (\n <p\n data-slot=\"import-hint\"\n className={cn('ml-[34px] mt-1 text-xs text-muted-foreground', className)}\n {...props}\n />\n )\n}\n\n/** Compact CTA used on provider rows (Reconnect, Enable...). */\nexport function ImportActionButton({\n className,\n children,\n variant = 'outline',\n ...props\n}: Omit<ComponentProps<typeof Button>, 'size'>) {\n return (\n <Button\n variant={variant}\n size=\"sm\"\n className={cn('ml-auto h-7 shrink-0 gap-1.5 pointer-coarse:h-11', className)}\n data-slot=\"import-action\"\n {...props}\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n {children}\n </Button>\n )\n}\n\nexport interface ImportRunActionsProps {\n isRunning: boolean\n isStopping?: boolean\n /** A sync request is in flight. */\n isBusy?: boolean\n importDisabled?: boolean\n importTitle?: string\n onImport: () => void\n onStop: () => void\n onSettings: () => void\n settingsLabel: string\n importButton?: { testId?: string }\n settingsButton?: { testId?: string }\n stopButton?: { testId?: string }\n labels?: Partial<ImportLabels>\n}\n\n/** \"Import now\" + settings gear, or \"Stop\" while a run is active. */\nexport function ImportRunActions({\n isRunning,\n isStopping,\n isBusy,\n importDisabled,\n importTitle,\n onImport,\n onStop,\n onSettings,\n settingsLabel,\n importButton,\n settingsButton,\n stopButton,\n labels,\n}: ImportRunActionsProps) {\n const l = { ...DEFAULT_IMPORT_LABELS, ...labels }\n if (isRunning) {\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"ml-auto h-7 gap-1.5 pointer-coarse:h-11\"\n onClick={onStop}\n disabled={isStopping}\n data-testid={stopButton?.testId}\n >\n <Square className=\"h-3 w-3\" />\n {isStopping ? l.stopping : l.stop}\n </Button>\n )\n }\n return (\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n <Button\n variant=\"default\"\n size=\"sm\"\n className=\"h-7 gap-1.5 pointer-coarse:h-11\"\n onClick={onImport}\n disabled={isBusy || importDisabled}\n data-testid={importButton?.testId}\n title={importTitle}\n >\n {isBusy ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <RefreshCw className=\"h-3.5 w-3.5\" />\n )}\n {l.importNow}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 text-muted-foreground pointer-coarse:h-11\"\n onClick={onSettings}\n disabled={isBusy}\n aria-label={settingsLabel}\n data-testid={settingsButton?.testId}\n >\n <Settings className=\"h-4 w-4\" />\n {l.settings}\n </Button>\n </div>\n )\n}\n\nexport interface ImportSummaryProps {\n /** Left column, under the name. */\n children: ReactNode\n /** Right column (pending count, folders). */\n aside?: ReactNode\n className?: string\n}\n\n/** Two-column detail block under a provider row. */\nexport function ImportSummary({ children, aside, className }: ImportSummaryProps) {\n return (\n <div\n data-slot=\"import-summary\"\n className={cn('mt-2.5 flex items-start justify-between gap-3', className)}\n >\n <div className=\"ml-[34px] text-sm leading-snug text-muted-foreground\">{children}</div>\n {aside}\n </div>\n )\n}\n\n/** Right-aligned muted aside of an `ImportSummary`. */\nexport function ImportAside({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"import-aside\"\n className={cn(\n 'min-w-0 max-w-[55%] text-right text-sm leading-snug text-muted-foreground',\n className\n )}\n {...props}\n />\n )\n}\n\nexport interface ImportProgressProps {\n processed: number\n total?: number | null\n /** Plural noun, e.g. \"emails\". */\n noun: string\n testId?: string\n labels?: Partial<ImportLabels>\n}\n\n/** Live run progress: bar when the total is known, plus a running count. */\nexport function ImportProgress({ processed, total, noun, testId, labels }: ImportProgressProps) {\n const l = { ...DEFAULT_IMPORT_LABELS, ...labels }\n const known = total != null && total > 0\n return (\n <div data-slot=\"import-progress\" className=\"mt-2 space-y-1\" data-testid={testId}>\n {known && (\n <Progress value={Math.min(100, Math.round((processed / total) * 100))} className=\"h-1.5\" />\n )}\n <div className=\"text-right text-sm leading-snug text-muted-foreground\">\n {known ? l.importingOf(processed, total, noun) : l.importing(processed, noun)}\n </div>\n </div>\n )\n}\n\nconst FOLDER_SUMMARY_LIMIT = 3\n\nexport interface FolderSummaryProps {\n /** One entry per selected folder; undefined when its name is not known (counted, never shown). */\n names: (string | undefined)[]\n testId?: string\n labels?: Partial<ImportLabels>\n}\n\n/** The first few synced folder names, then \"+N more\" (all in the tooltip). */\nexport function FolderSummary({ names, testId, labels }: FolderSummaryProps) {\n const l = { ...DEFAULT_IMPORT_LABELS, ...labels }\n const known = names.filter((n): n is string => !!n)\n if (known.length === 0) {\n return <div data-testid={testId}>{l.foldersSelected(names.length)}</div>\n }\n const shown = known.slice(0, FOLDER_SUMMARY_LIMIT)\n const hidden = names.length - shown.length\n return (\n <div className=\"break-words\" title={known.join(', ')} data-testid={testId}>\n {l.folders(shown.join(', '))}\n {hidden > 0 && <span className=\"whitespace-nowrap\">{l.moreFolders(hidden)}</span>}\n </div>\n )\n}\n\nexport type ImportFamilyActionKind = 'connect' | 'reconnect' | 'disconnect'\n\nexport interface ImportFamilySectionProps {\n label: string\n /** Connected account shown next to the label. */\n identity?: string | null\n /** 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 type { ReactNode } from 'react'\nimport { CalendarDays, Loader2 } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the calendar row. Pass a partial `labels` to translate or reword. */\nexport interface CalendarImportLabels {\n title: string\n description: string\n settings: string\n syncNow: string\n}\n\nexport const DEFAULT_CALENDAR_IMPORT_LABELS: CalendarImportLabels = {\n title: 'Calendar',\n description: 'Events become dated notes on this workspace\\u2019s timeline.',\n settings: 'Settings',\n syncNow: 'Sync now',\n}\n\nexport interface CalendarImportTestIds {\n root: string\n settings: string\n syncNow: string\n}\n\nexport interface CalendarImportRowProps {\n isSyncing?: boolean\n onSettings: () => void\n onSyncNow: () => void\n /** Dialogs owned by the host. */\n children?: ReactNode\n labels?: Partial<CalendarImportLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<CalendarImportTestIds>\n}\n\n/** Calendar sync row: what it is, plus Settings and Sync now. */\nexport function CalendarImportRow({\n isSyncing,\n onSettings,\n onSyncNow,\n children,\n labels,\n testIds,\n}: CalendarImportRowProps) {\n const l = { ...DEFAULT_CALENDAR_IMPORT_LABELS, ...labels }\n return (\n <div\n className=\"py-3\"\n data-slot=\"calendar-import\"\n data-testid={testIdOr(testIds?.root, { testId: 'calendar-import-panel' })}\n >\n <div className=\"flex items-center gap-2.5\">\n <CalendarDays className=\"h-7 w-7 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-foreground\">{l.title}</div>\n <div className=\"truncate text-xs text-muted-foreground\">{l.description}</div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"pointer-coarse:h-11\"\n onClick={onSettings}\n data-testid={testIdOr(testIds?.settings, { testId: 'calendar-settings' })}\n >\n {l.settings}\n </Button>\n <Button\n size=\"sm\"\n className=\"pointer-coarse:h-11\"\n onClick={onSyncNow}\n disabled={isSyncing}\n data-testid={testIdOr(testIds?.syncNow, { testId: 'calendar-sync-now' })}\n >\n {isSyncing && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n {l.syncNow}\n </Button>\n </div>\n </div>\n {children}\n </div>\n )\n}\n","import { useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n AlertCircle,\n CheckCircle,\n ChevronRight,\n CircleSlash,\n Hourglass,\n LoaderCircle,\n} from 'lucide-react'\nimport { Badge, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** A distinct glyph + colour per processing status (active spins while busy). */\nconst STATUS_ICONS = {\n active: { Icon: LoaderCircle, color: 'text-blue-text', spin: true },\n queued: { Icon: Hourglass, color: 'text-yellow-text', spin: false },\n failed: { Icon: AlertCircle, color: 'text-red-text', spin: false },\n skipped: { Icon: CircleSlash, color: 'text-muted-foreground', spin: false },\n completed: { Icon: CheckCircle, color: 'text-green-text', spin: false },\n} as const\n\nexport type TaskSectionStatus = keyof typeof STATUS_ICONS\n\nexport interface TaskSectionProps {\n title: string\n count: number\n status: TaskSectionStatus\n /** Explanation of what the status means, shown on the heading tooltip. */\n tooltip?: string\n headerAction?: ReactNode\n defaultExpanded?: boolean\n /** The task list; rendered only while the section has items and is expanded. */\n children?: ReactNode\n testIds?: Partial<{ root: string; toggle: string }>\n}\n\n/**\n * Collapsible processing-status section. Empty sections show a muted, inert heading;\n * only sections with items expand.\n */\nexport function TaskSection({\n title,\n count,\n status,\n tooltip,\n headerAction,\n defaultExpanded = true,\n children,\n testIds,\n}: TaskSectionProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded)\n const hasItems = count > 0\n const { Icon, color, spin } = STATUS_ICONS[status]\n\n const headingInner = (\n <div className=\"flex items-center gap-2\">\n <Icon className={cn('h-4 w-4', color, hasItems ? spin && 'animate-spin' : 'opacity-50')} />\n <span className=\"whitespace-nowrap\">{title}</span>\n <Badge variant=\"outline\" className=\"badge-count ml-2 border-border\">\n {count}\n </Badge>\n </div>\n )\n\n const heading = tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{headingInner}</TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n headingInner\n )\n\n return (\n <div data-slot=\"task-section\" data-testid={testIdOr(testIds?.root, { testId: 'task-section' })}>\n <div className=\"mb-3 flex items-center justify-between\">\n {hasItems ? (\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n aria-expanded={isExpanded}\n className=\"flex cursor-pointer items-center gap-2 text-left font-medium transition-colors hover:text-primary pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.toggle, { testId: 'task-section-toggle' })}\n >\n <ChevronRight\n className={cn('h-4 w-4 transition-transform', isExpanded && 'rotate-90')}\n />\n {heading}\n </button>\n ) : (\n <div className=\"flex items-center gap-2 font-medium text-muted-foreground\">\n <ChevronRight className=\"h-4 w-4 flex-shrink-0\" />\n {heading}\n </div>\n )}\n {headerAction}\n </div>\n {hasItems && isExpanded && children}\n </div>\n )\n}\n","import type { ClipboardEvent, ReactNode } from 'react'\nimport { Loader2, Plus, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n DialogTrigger,\n Input,\n Label,\n cn,\n} from '@arbidocs/react/ui'\nimport { ModalHeader } from '../../settings/ModalScaffold'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the URL dialog. Pass a partial `labels` to translate or reword. */\nexport interface UrlInputDialogLabels {\n title: string\n description: string\n supports: string\n url: (position: number | null) => string\n placeholder: string\n removeUrl: (position: number) => string\n addAnother: string\n adding: string\n addDocuments: string\n mediaPreview: string\n}\n\nexport const DEFAULT_URL_INPUT_DIALOG_LABELS: UrlInputDialogLabels = {\n title: 'Add from the internet',\n description:\n 'Enter one or more URLs to download documents — paste several separated by commas or new lines.',\n supports:\n 'Supports PDF, Word, PowerPoint, Excel, RTF, TXT, MD, HTML, ZIP, and audio/video links (YouTube et al.).',\n url: (position) => (position === null ? 'URL ' : `URL ${position}`),\n placeholder: 'https://example.com/document.pdf or a YouTube / audio / video link',\n removeUrl: (position) => `Remove URL ${position}`,\n addAnother: 'Add Another URL',\n adding: 'Adding…',\n addDocuments: 'Add Documents',\n mediaPreview: 'Media preview',\n}\n\nexport interface UrlInputDialogTestIds {\n modal: string\n submitError: string\n submit: string\n}\n\nexport interface UrlInputDialogViewProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Trigger element (rendered `asChild`); omit for a controlled dialog opened elsewhere. */\n trigger?: ReactNode\n /** Title content; defaults to `labels.title`. */\n title?: ReactNode\n urls: string[]\n /** Per-field error text ('' when valid). */\n errors: string[]\n onUrlChange: (index: number, value: string) => void\n onUrlPaste: (index: number, text: string) => void\n onAddUrl: () => void\n onRemoveUrl: (index: number) => void\n /** Rendered under a field, e.g. a media preview. */\n renderPreview?: (url: string, index: number) => ReactNode\n submitError?: string | null\n isSubmitting?: boolean\n onSubmit: () => void\n labels?: Partial<UrlInputDialogLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<UrlInputDialogTestIds>\n}\n\n/** \"Add from the internet\" dialog: one or more URL fields, inline errors, submit. */\nexport function UrlInputDialogView({\n open,\n onOpenChange,\n trigger,\n title,\n urls,\n errors,\n onUrlChange,\n onUrlPaste,\n onAddUrl,\n onRemoveUrl,\n renderPreview,\n submitError,\n isSubmitting,\n onSubmit,\n labels,\n testIds,\n}: UrlInputDialogViewProps) {\n const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels }\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n {trigger !== undefined && <DialogTrigger asChild>{trigger}</DialogTrigger>}\n <DialogContent\n presentation=\"sheet\"\n className=\"flex flex-col gap-0 overflow-hidden p-0 sm:max-w-[525px]\"\n data-testid={testIdOr(testIds?.modal, { testId: 'upload-modal-internet' })}\n >\n <ModalHeader>\n <DialogTitle>{title ?? l.title}</DialogTitle>\n </ModalHeader>\n <div className=\"px-6 pb-6\">\n <DialogDescription className=\"pt-4 text-sm text-muted-foreground\">\n {l.description}\n <span className=\"mt-1 block text-xs\">{l.supports}</span>\n </DialogDescription>\n <div className=\"grid gap-4 py-4\">\n {urls.map((url, index) => (\n <div key={index} className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Label htmlFor={`url-${index}`} className=\"text-sm\">\n {l.url(urls.length > 1 ? index + 1 : null)}\n </Label>\n <Input\n id={`url-${index}`}\n type=\"text\"\n placeholder={l.placeholder}\n value={url}\n onChange={(e) => onUrlChange(index, e.target.value)}\n onPaste={(e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n onUrlPaste(index, e.clipboardData.getData('text'))\n }}\n className={cn(errors[index] && 'border-red-border')}\n />\n {errors[index] && <p className=\"mt-1 text-sm text-red-text\">{errors[index]}</p>}\n </div>\n {urls.length > 1 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => onRemoveUrl(index)}\n className=\"mt-6\"\n aria-label={l.removeUrl(index + 1)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n {renderPreview?.(url, index)}\n </div>\n ))}\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onAddUrl} className=\"w-full\">\n <Plus className=\"mr-2 h-4 w-4\" />\n {l.addAnother}\n </Button>\n </div>\n {submitError && (\n <p\n className=\"text-sm text-red-text\"\n data-testid={testIdOr(testIds?.submitError, { testId: 'url-submit-error' })}\n >\n {submitError}\n </p>\n )}\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2\">\n <Button\n onClick={onSubmit}\n disabled={isSubmitting}\n data-testid={testIdOr(testIds?.submit, { testId: 'url-submit-button' })}\n >\n {isSubmitting ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.adding}\n </>\n ) : (\n l.addDocuments\n )}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface UrlDialogTitleProps {\n /** Workspace mark, e.g. its icon. */\n icon?: ReactNode\n workspaceName: string\n /** Wins over the default \"Add from the internet\". */\n labels?: Partial<UrlInputDialogLabels>\n}\n\n/** \"<workspace> / Add from the internet\" title. */\nexport function UrlDialogTitle({ icon, workspaceName, labels }: UrlDialogTitleProps) {\n const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels }\n return (\n <div className={cn('flex min-w-0 items-center', icon ? 'gap-3' : 'gap-2')}>\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\n <span className=\"min-w-0 truncate\" title={workspaceName}>\n {workspaceName}\n </span>\n <span className=\"flex-shrink-0 text-muted-foreground\">/</span>\n <span className=\"flex-shrink-0\">{l.title}</span>\n </div>\n )\n}\n\nexport interface MediaPreviewViewProps {\n kind: 'youtube' | 'video' | 'audio'\n /** Embed URL for youtube, media src otherwise. */\n src: string\n testId?: string\n labels?: Partial<UrlInputDialogLabels>\n}\n\n/** Inline media preview under a URL field. */\nexport function MediaPreviewView({ kind, src, testId, labels }: MediaPreviewViewProps) {\n const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels }\n return (\n <div className=\"mt-2 overflow-hidden rounded-md border\" data-testid={testId}>\n {kind === 'youtube' && (\n <iframe\n className=\"aspect-video w-full\"\n src={src}\n title={l.mediaPreview}\n allow=\"accelerometer; encrypted-media; picture-in-picture\"\n allowFullScreen\n />\n )}\n {kind === 'video' && (\n <video className=\"max-h-56 w-full bg-black\" src={src} controls preload=\"metadata\" />\n )}\n {kind === 'audio' && <audio className=\"w-full p-2\" src={src} controls preload=\"metadata\" />}\n </div>\n )\n}\n","/**\n * VendorLogo\n *\n * Brand marks for mailbox and document connectors (Gmail, Outlook, OneDrive,\n * Google Drive, SharePoint, Box, Dropbox, OneNote, Clio) rendered as inline SVG so\n * they read as the real products rather than a generic glyph. Falls back to a plain\n * mail icon for any other vendor. Used by the Import-from-emails shortcut and the\n * connector provider rows.\n */\n\nimport { Mail } from 'lucide-react'\n\nfunction GmailMark({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 256 193\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"#4285F4\"\n d=\"M58.182 192.05V93.14L27.507 65.077 0 49.504v125.091c0 9.658 7.825 17.455 17.455 17.455z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M197.818 192.05h40.727c9.659 0 17.455-7.826 17.455-17.455V49.505l-31.156 17.837-27.026 25.798z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"m58.182 93.14-4.174-38.647 4.174-36.989L128 69.868l69.818-52.364 4.669 34.992-4.669 40.644L128 145.504z\"\n />\n <path\n fill=\"#FBBC04\"\n d=\"M197.818 17.504V93.14L256 49.504V26.231c0-21.585-24.64-33.89-41.89-20.945z\"\n />\n <path\n fill=\"#C5221F\"\n d=\"M0 49.504 26.759 69.574 58.182 93.14V17.504L41.89 5.286C24.61-7.66 0 4.646 0 26.231z\"\n />\n </svg>\n )\n}\n\nfunction OutlookMark({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n {/* Right envelope panel */}\n <path fill=\"#0F6CBD\" d=\"M44 13H24v22h18.5A1.5 1.5 0 0 0 44 33.5z\" />\n <path fill=\"#28A8EA\" d=\"M24 15.5 44 13v3L24 27z\" />\n {/* Left blue tile with the Outlook \"O\" */}\n <rect x=\"4\" y=\"9\" width=\"21\" height=\"30\" rx=\"2.5\" fill=\"#0364B8\" />\n <ellipse cx=\"14.5\" cy=\"24\" rx=\"6.2\" ry=\"7\" fill=\"none\" stroke=\"#fff\" strokeWidth=\"3.1\" />\n </svg>\n )\n}\n\nfunction OneDriveMark({ className }: { className?: string }) {\n // Authentic Microsoft OneDrive brand mark — the layered four-tone blue cloud.\n return (\n <svg viewBox=\"0 0 256 165\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"#0364B8\"\n d=\"M154.66056 110.681557 207.502052 60.1479482C196.525811 17.3487078 152.932256-8.44908883 110.132767 2.52715287 90.8589801 7.46999082 74.1187452 19.4179992 63.179535 36.0386895 63.9974594 36.0180612 154.66056 110.681557 154.66056 110.681557Z\"\n />\n <path\n fill=\"#0078D4\"\n d=\"M97.6181022 45.5520619 97.6156169 45.5607606C87.5186874 39.307156 75.8741386 36.001658 63.9972108 36.0177537 63.7228296 36.0177537 63.4531706 36.03521 63.1792865 36.0384409 27.8517142 36.4761088-.432413365 65.4695515.00500592252 100.797124.163570414 113.612018 4.16769663 126.083687 11.4981977 136.595916L90.6631356 126.680913 151.357298 77.7409022 97.6181022 45.5520619Z\"\n />\n <path\n fill=\"#1490DF\"\n d=\"M207.502052 60.1481967C206.340406 60.0706542 205.173043 60.016946 203.992011 60.016946 196.903085 60.010012 189.887973 61.4579693 183.381112 64.271122L183.379621 64.2656543 151.357547 77.7411507 186.65952 121.347877 249.770673 136.689364C263.390071 111.405536 253.93411 79.8683506 228.650281 66.2489531 222.117076 62.7297161 214.906119 60.6497377 207.502301 60.1484453L207.502301 60.1481967 207.502052 60.1481967Z\"\n />\n <path\n fill=\"#28A8EA\"\n d=\"M11.4981977 136.595916C23.4514253 153.781772 43.063467 164.023845 63.9974594 164.012918L203.991762 164.012918C223.115435 164.018377 240.697951 153.524291 249.770425 136.689862L151.357298 77.7409022 11.4981977 136.595916Z\"\n />\n </svg>\n )\n}\n\nfunction SharePointMark({ className }: { className?: string }) {\n // Simplified SharePoint glyph — overlapping teal circles composition\n // matching Microsoft's SharePoint brand colours (#036C70 primary, #1A9BA1 accent).\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"22\" cy=\"22\" r=\"20\" fill=\"#036C70\" />\n <circle cx=\"16\" cy=\"20\" r=\"12\" fill=\"#1A9BA1\" />\n <circle cx=\"26\" cy=\"30\" r=\"10\" fill=\"#37C6D0\" />\n <circle cx=\"33\" cy=\"22\" r=\"8\" fill=\"#fff\" opacity=\"0.15\" />\n </svg>\n )\n}\n\nfunction GoogleDriveMark({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 87.3 78\" className={className} aria-hidden=\"true\" focusable=\"false\">\n {/* Google Drive triangle — the three brand colours */}\n <path\n fill=\"#0066da\"\n d=\"M6.6 66.85l3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8H0c0 1.55.4 3.1 1.2 4.5z\"\n />\n <path\n fill=\"#00ac47\"\n d=\"M43.65 25L29.9 1.2c-1.35.8-2.5 1.9-3.3 3.3L1.2 48.5A9.06 9.06 0 0 0 0 53h27.5z\"\n />\n <path\n fill=\"#ea4335\"\n d=\"M73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75L86.1 57.4c.8-1.4 1.2-2.95 1.2-4.5H59.798l5.85 11.5z\"\n />\n <path\n fill=\"#00832d\"\n d=\"M43.65 25L57.4 1.2C56.05.4 54.5 0 52.9 0H34.4c-1.6 0-3.15.45-4.5 1.2z\"\n />\n <path\n fill=\"#2684fc\"\n d=\"M59.8 53H27.5L13.75 76.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n />\n <path\n fill=\"#ffba00\"\n d=\"M73.4 26.5L60.65 4.5c-.8-1.4-1.95-2.5-3.3-3.3L43.65 25l16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n />\n </svg>\n )\n}\n\nfunction BoxMark({ className }: { className?: string }) {\n // Box brand mark — the Box blue (#0061D5) tile with a simple isometric cube.\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#0061D5\" />\n <path\n fill=\"none\"\n stroke=\"#fff\"\n strokeWidth=\"2.5\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n d=\"M24 13 36 19 36 29 24 35 12 29 12 19Z\"\n />\n <path\n fill=\"none\"\n stroke=\"#fff\"\n strokeWidth=\"2.5\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n d=\"M12 19 24 25 36 19 M24 25 24 35\"\n />\n </svg>\n )\n}\n\nfunction DropboxMark({ className }: { className?: string }) {\n // Dropbox's mark is its own logo shape rather than a tile: four parallelograms\n // meeting at a point, in Dropbox blue (#0061FF).\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <g fill=\"#0061FF\">\n <path d=\"M12 6 0 14l12 8 12-8z\" />\n <path d=\"M36 6 24 14l12 8 12-8z\" />\n <path d=\"M0 30l12 8 12-8-12-8z\" />\n <path d=\"M36 22 24 30l12 8 12-8z\" />\n <path d=\"M12 40.5 24 33l12 7.5L24 48z\" />\n </g>\n </svg>\n )\n}\n\nfunction OneNoteMark({ className }: { className?: string }) {\n // OneNote purple (#7719AA), matching the OneDrive/SharePoint tile treatment.\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#7719AA\" />\n <rect x=\"10\" y=\"10\" width=\"21\" height=\"28\" rx=\"2.5\" fill=\"#fff\" opacity=\"0.95\" />\n <rect x=\"31\" y=\"15\" width=\"7\" height=\"5\" rx=\"1.5\" fill=\"#fff\" opacity=\"0.6\" />\n <rect x=\"31\" y=\"22\" width=\"7\" height=\"5\" rx=\"1.5\" fill=\"#fff\" opacity=\"0.6\" />\n <rect x=\"31\" y=\"29\" width=\"7\" height=\"5\" rx=\"1.5\" fill=\"#fff\" opacity=\"0.6\" />\n </svg>\n )\n}\n\nfunction ClioMark({ className }: { className?: string }) {\n // Clio's brand blue (#00263E) with the rounded \"c\" counter of its wordmark.\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#00263E\" />\n <path\n fill=\"none\"\n stroke=\"#4FC3F7\"\n strokeWidth=\"4.5\"\n strokeLinecap=\"round\"\n d=\"M32 17a10 10 0 1 0 0 14\"\n />\n </svg>\n )\n}\n\nexport function VendorLogo({\n vendorKey,\n className = 'h-4 w-4',\n product,\n}: {\n vendorKey: string\n className?: string\n /** Pick a specific product mark when a vendor spans several (e.g. Microsoft → OneDrive). */\n product?: 'onedrive' | 'googledrive' | 'sharepoint' | 'box' | 'dropbox' | 'onenote' | 'clio'\n}) {\n if (product === 'onedrive') return <OneDriveMark className={className} />\n if (product === 'googledrive') return <GoogleDriveMark className={className} />\n if (product === 'sharepoint') return <SharePointMark className={className} />\n if (product === 'box') return <BoxMark className={className} />\n if (product === 'dropbox') return <DropboxMark className={className} />\n if (product === 'onenote') return <OneNoteMark className={className} />\n if (product === 'clio') return <ClioMark className={className} />\n if (vendorKey === 'gmail') return <GmailMark className={className} />\n if (vendorKey === 'microsoft') return <OutlookMark className={className} />\n if (vendorKey === 'microsoft_sharepoint') return <SharePointMark className={className} />\n if (vendorKey === 'box') return <BoxMark className={className} />\n if (vendorKey === 'dropbox') return <DropboxMark className={className} />\n if (vendorKey === 'onenote') return <OneNoteMark className={className} />\n if (vendorKey === 'clio') return <ClioMark className={className} />\n return <Mail className={`${className} text-muted-foreground`} aria-hidden=\"true\" />\n}\n","import type { ReactNode } from 'react'\nimport { FolderOpen } from 'lucide-react'\nimport { Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\n\nexport interface FolderCellProps {\n /** Stored folder path; empty/null renders an em dash. */\n folder: string | null | undefined\n /** Breadcrumb segments, already formatted for display (provider roots shortened). */\n segments: string[]\n /** Leading glyph for connector folders (brand mark); falls back to a folder icon. */\n icon?: ReactNode\n /** Editable cells open `picker` in a popover on click. */\n isEditable: boolean\n /** Popover body (the searchable folder list); only rendered for editable cells. */\n picker?: ReactNode\n className?: string\n}\n\n/** Breadcrumb \"a / b / c\" where all but the last segment are muted. */\nexport function FolderBreadcrumb({\n segments,\n size = 'xs',\n}: {\n segments: string[]\n /** Text size of the segments: `xs` in grid cells, `sm` in form fields. */\n size?: 'xs' | 'sm'\n}) {\n const text = size === 'sm' ? 'text-sm' : 'text-xs'\n return (\n <span data-slot=\"folder-breadcrumb\" className=\"min-w-0 truncate\">\n {segments.map((part, i, arr) => (\n <span key={i} className=\"inline-flex items-center gap-0.5\">\n {i > 0 && <span className={`mx-0.5 ${text} text-muted-foreground/50`}>/</span>}\n <span className={i < arr.length - 1 ? `${text} text-muted-foreground` : ''}>{part}</span>\n </span>\n ))}\n </span>\n )\n}\n\n/**\n * Grid cell for a document's folder. Uses the native `title` attribute instead of a Tooltip:\n * every visible row renders one, so Radix tooltip instances would sit in the scroll hot path.\n */\nexport function FolderCell({\n folder,\n segments,\n icon,\n isEditable,\n picker,\n className,\n}: FolderCellProps) {\n const display = folder ? (\n <>\n {icon ?? <FolderOpen className=\"h-3.5 w-3.5 flex-none shrink-0 text-muted-foreground\" />}\n <FolderBreadcrumb segments={segments} />\n </>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )\n const title = folder || undefined\n\n if (!isEditable) {\n return (\n <div\n data-slot=\"folder-cell\"\n title={title}\n className={cn('flex h-full w-full min-w-0 items-center gap-1.5 text-sm', className)}\n >\n {display}\n </div>\n )\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"folder-cell\"\n title={title}\n className={cn(\n 'flex h-full w-full min-w-0 cursor-pointer items-center gap-1.5 text-left text-sm hover:text-primary',\n className\n )}\n >\n {display}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-[220px] max-w-[min(640px,92vw)] p-0\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n >\n {picker}\n </PopoverContent>\n </Popover>\n )\n}\n","import { useState } from 'react'\nimport type { ComponentType, ReactNode } from 'react'\nimport {\n ArrowRightLeft,\n Blend,\n CopyX,\n CornerDownRight,\n CornerRightDown,\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 parent?: T | null\n /** Attachments. */\n attachments: T[]\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 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 dupeCount = duplicates.length\n const simCount = similar.length\n\n if (!parent && attachmentCount === 0 && dupeCount === 0 && simCount === 0) 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\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\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 {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 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 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 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 {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 { Ban, Pencil, Plus } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport type CellHoverIconKind = 'pencil' | 'plus' | 'blocked'\n\nconst ICONS = { pencil: Pencil, plus: Plus, blocked: Ban } as const\n\n/**\n * Edit hint of a grid cell. It appears on pointer hover, on keyboard focus anywhere inside the\n * cell and always on touch devices (coarse pointer), where there is no hover to reveal it.\n * Place it inside an element carrying the `group` class.\n */\nexport function CellHoverIcon({\n kind = 'pencil',\n className,\n}: {\n kind?: CellHoverIconKind\n className?: string\n}) {\n const Icon = ICONS[kind]\n return (\n <span\n data-slot=\"cell-hover-icon\"\n data-kind={kind}\n aria-hidden\n className={cn(\n 'inline-flex shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-70 group-focus-within:opacity-70 pointer-coarse:opacity-70',\n className\n )}\n >\n <Icon className=\"size-3.5\" />\n </span>\n )\n}\n\nexport interface HoverIconCellProps {\n content: ReactNode\n /** Non-members get a \"blocked\" hint instead of the edit hint. */\n isEditable: boolean\n showIcon?: boolean\n icon?: Exclude<CellHoverIconKind, 'blocked'>\n className?: string\n}\n\n/** A cell's content with the edit hint after it (pure CSS reveal: no re-render on mouse move). */\nexport const HoverIconCell = memo(function HoverIconCell({\n content,\n isEditable,\n showIcon = true,\n icon = 'pencil',\n className,\n}: HoverIconCellProps) {\n return (\n <div\n data-slot=\"hover-icon-cell\"\n className={cn('group flex h-full w-full items-center gap-2 pr-2', className)}\n >\n {content}\n {showIcon && <CellHoverIcon kind={isEditable ? icon : 'blocked'} />}\n </div>\n )\n})\n","import { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, PencilLine } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\nimport { CellHoverIcon } from './HoverIconCell'\n\n/** Chip row metrics (px): a chip is 24px tall with a 4px gap, as in the Facts labels cell. */\nconst CHIP_ROW_H = 24\nconst CHIP_GAP = 4\n\n/** Max height of the chip container: whole chip rows that fit `rowHeight`, never half a row. */\nexport function labelChipClampHeight(rowHeight: number): number {\n const rows = Math.max(1, Math.floor((rowHeight + CHIP_GAP) / (CHIP_ROW_H + CHIP_GAP)))\n return CHIP_ROW_H * rows + CHIP_GAP * (rows - 1)\n}\n\n/** One label a document can carry. `color` is any CSS colour (the host derives it from the id). */\nexport interface LabelOption {\n id: string\n name: string\n color: string\n}\n\n/** Every fixed string of the label picker. */\nexport interface LabelMultiSelectLabels {\n searchPlaceholder: string\n noLabels: string\n create: (name: string) => string\n editLabel: string\n}\n\nexport const DEFAULT_LABEL_MULTI_SELECT_LABELS: LabelMultiSelectLabels = {\n searchPlaceholder: 'Search or create...',\n noLabels: 'No labels yet',\n create: (name) => `Create “${name}”`,\n editLabel: 'Edit field',\n}\n\nexport interface LabelMultiSelectViewProps {\n options: LabelOption[]\n /** Ids of the labels applied to the row. */\n appliedIds: ReadonlySet<string>\n onToggle: (id: string) => void\n /** Create a label named `name` and apply it (the host decides what a non-member may do). */\n onCreate: (name: string) => void\n /** Opens the label editor; omit to hide the per-option edit button. */\n onEditLabels?: () => void\n /** The grid row height: clamps the chips to the rows that fully fit, with an ellipsis. */\n rowHeight?: number\n labels?: Partial<LabelMultiSelectLabels>\n}\n\nconst CHECK_BOX = 'flex shrink-0 items-center justify-center rounded border-2'\n\nexport interface LabelPickerListProps {\n options: LabelOption[]\n appliedIds: ReadonlySet<string>\n onToggle: (id: string) => void\n /** Create a label named `name`; omit to hide \"Create ...\" (the picker only toggles). */\n onCreate?: (name: string) => void\n /** Opens the label editor; omit to hide the per-option edit button. */\n onEditLabels?: () => void\n labels?: Partial<LabelMultiSelectLabels>\n}\n\n/**\n * Searchable list of labels with check boxes: type to filter, Enter (or the \"Create ...\" row)\n * creates a label that does not exist yet. Used by the grid cell and the document form field.\n */\nexport function LabelPickerList({\n options,\n appliedIds,\n onToggle,\n onCreate,\n onEditLabels,\n labels,\n}: LabelPickerListProps) {\n const l = useMemo(() => ({ ...DEFAULT_LABEL_MULTI_SELECT_LABELS, ...labels }), [labels])\n const [search, setSearch] = useState('')\n const trimmed = search.trim()\n const matchesExisting = options.some((o) => o.name.toLowerCase() === trimmed.toLowerCase())\n\n const create = () => {\n onCreate?.(trimmed)\n setSearch('')\n }\n\n return (\n <Command shouldFilter>\n <CommandInput\n placeholder={l.searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && onCreate && trimmed && !matchesExisting) {\n e.preventDefault()\n create()\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {trimmed && onCreate ? (\n <button\n type=\"button\"\n onClick={create}\n onPointerDown={(e) => e.preventDefault()}\n className=\"w-full cursor-pointer rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n {l.create(trimmed)}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.noLabels}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {options.map((o) => {\n const isApplied = appliedIds.has(o.id)\n return (\n <CommandItem\n key={o.id}\n value={o.name}\n onSelect={() => onToggle(o.id)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"group/label cursor-pointer\"\n data-testid={`label-select-${o.id}`}\n >\n <span\n className={`mr-2 size-4 ${CHECK_BOX} ${isApplied ? '' : 'bg-background'}`}\n style={{\n borderColor: o.color,\n backgroundColor: isApplied ? o.color : undefined,\n }}\n >\n {isApplied && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n </span>\n <span className=\"flex-1 text-sm\">{o.name}</span>\n {onEditLabels && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onEditLabels()\n }}\n onPointerDown={(e) => e.preventDefault()}\n className=\"shrink-0 rounded p-0.5 opacity-0 hover:bg-muted focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover/label:opacity-100 group-data-[selected=true]/label:opacity-100 pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center pointer-coarse:opacity-100\"\n title={l.editLabel}\n aria-label={l.editLabel}\n >\n <PencilLine className=\"size-3 text-muted-foreground\" />\n </button>\n )}\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n )\n}\n\n/**\n * Labels column cell: applied labels as bordered chips; click (or Enter) opens a popover to\n * toggle labels or type a new name and press Enter to create it. Empty cells show a pencil on\n * hover, keyboard focus and touch.\n */\nexport const LabelMultiSelectView = memo(function LabelMultiSelectView({\n options,\n appliedIds,\n onToggle,\n onCreate,\n onEditLabels,\n rowHeight = 52,\n labels,\n}: LabelMultiSelectViewProps) {\n const [open, setOpen] = useState(false)\n\n const applied = options.filter((o) => appliedIds.has(o.id))\n const maxHeight = labelChipClampHeight(rowHeight)\n const chipsRef = useRef<HTMLDivElement>(null)\n const [hasOverflow, setHasOverflow] = useState(false)\n useEffect(() => {\n const el = chipsRef.current\n if (!el) return\n const measure = () => setHasOverflow(el.scrollHeight > el.clientHeight + 1)\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(el)\n return () => ro.disconnect()\n }, [appliedIds, maxHeight, options])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"label-multi-select\"\n // No vertical clip/padding: at the minimum row height an `overflow-hidden` button would\n // crop the pills. The chip container is clamped to whole chip rows instead.\n className=\"group relative flex h-full w-full min-w-0 cursor-pointer items-center gap-1 pr-4 text-left hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n >\n {applied.length === 0 ? (\n <span className=\"flex-1\">\n <CellHoverIcon />\n </span>\n ) : (\n <>\n <div\n ref={chipsRef}\n className=\"flex min-w-0 flex-1 flex-wrap content-start gap-1 overflow-hidden\"\n style={{ maxHeight }}\n data-testid=\"label-multi-select-chips\"\n >\n {applied.map((o) => (\n <span\n key={o.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium\"\n title={o.name}\n style={{ borderColor: o.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: o.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[80px] truncate\">{o.name}</span>\n </span>\n ))}\n </div>\n {hasOverflow && (\n <span\n className=\"pointer-events-none absolute bottom-0.5 right-0.5 text-xs font-semibold leading-none text-muted-foreground\"\n aria-hidden\n data-testid=\"label-multi-select-overflow\"\n >\n …\n </span>\n )}\n </>\n )}\n </button>\n </PopoverTrigger>\n {open && (\n <PopoverContent className=\"w-[360px] p-0\" align=\"start\" side=\"bottom\" sideOffset={4}>\n <LabelPickerList\n options={options}\n appliedIds={appliedIds}\n onToggle={onToggle}\n onCreate={onCreate}\n onEditLabels={onEditLabels}\n labels={labels}\n />\n </PopoverContent>\n )}\n </Popover>\n )\n})\n","import { memo, type ReactNode } from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface CheckboxCellProps {\n isChecked: boolean\n /** Any CSS colour: the tag's colour. */\n color: string\n isEditable: boolean\n /** Tooltip / accessible name, e.g. `Add \"Urgent\" tag`. */\n title: string\n onToggle: () => void\n}\n\n/** Checkbox-tag cell: a coloured box that toggles on click; inert for non-members. */\nexport const CheckboxCell = memo(function CheckboxCell({\n isChecked,\n color,\n isEditable,\n title,\n onToggle,\n}: CheckboxCellProps) {\n return (\n <button\n type=\"button\"\n data-slot=\"checkbox-cell\"\n aria-pressed={isChecked}\n onClick={(e) => {\n e.stopPropagation()\n if (isEditable) onToggle()\n }}\n disabled={!isEditable}\n title={title}\n aria-label={title}\n className=\"inline-flex items-center justify-center rounded-md p-0.5 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n >\n <span\n className={cn(\n 'flex size-4 shrink-0 items-center justify-center rounded border-2 transition-colors',\n !isChecked && 'bg-background'\n )}\n style={{ borderColor: color, backgroundColor: isChecked ? color : undefined }}\n >\n {isChecked && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n </span>\n </button>\n )\n})\n\nexport interface TagColumnHeaderProps {\n /** The column's filter button (host-supplied: it is grid-specific). */\n filter: ReactNode\n /** The tag's name pill. */\n label: ReactNode\n /** Current sort direction; null/undefined when unsorted. */\n sort?: 'asc' | 'desc' | null\n isCentered?: boolean\n /** Sort on click; `additive` is true with Shift (multi-sort). */\n onSort?: (additive: boolean) => void\n}\n\n/**\n * Header of a tag column: filter button on the LEFT of the name, sort indicator after it.\n * The filter carries AG Grid's `.ag-header-icon` class (grid theme `order: 1`), so the label and\n * indicator pin `order-2`.\n */\nexport const TagColumnHeader = memo(function TagColumnHeader({\n filter,\n label,\n sort,\n isCentered,\n onSort,\n}: TagColumnHeaderProps) {\n return (\n <div\n data-slot=\"tag-column-header\"\n className={cn(\n 'flex h-full w-full items-center gap-2 px-2',\n onSort && 'cursor-pointer',\n isCentered && 'justify-center'\n )}\n onClick={(e) => onSort?.(e.shiftKey)}\n >\n {filter}\n <div className=\"order-2 min-w-0 flex-1\">{label}</div>\n {sort && (\n <span className=\"ag-sort-indicator-icon order-2 shrink-0\">\n <span className={`ag-icon ${sort === 'asc' ? 'ag-icon-asc' : 'ag-icon-desc'}`} />\n </span>\n )}\n </div>\n )\n})\n","import {\n ArrowDownToLine,\n ArrowRightFromLine,\n FolderInput,\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 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 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 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 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 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 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 <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 { ReactNode } from 'react'\nimport { ChevronDown, FolderOpen, FolderPlus } from 'lucide-react'\nimport { Button, Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\nimport { FolderPickerRow } from '../FolderPicker'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the folder filter. Pass a partial `labels` to translate or reword. */\nexport interface FolderFilterLabels {\n all: string\n newFolder: string\n}\n\nexport const DEFAULT_FOLDER_FILTER_LABELS: FolderFilterLabels = {\n all: 'All',\n newFolder: 'New folder',\n}\n\nexport interface FolderFilterButtonProps {\n /** Text of the active folder (\"All\", \"None\", or the display path). */\n label: string\n /** Leading glyph for connector folders; falls back to a folder icon. */\n icon?: ReactNode\n /** A folder filter is active: the trigger takes the selection tint. */\n isActive: boolean\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Total documents, shown on the \"All\" row. */\n allCount: number\n onSelectAll: () => void\n /** When set, the popover offers a \"New folder\" action. */\n onNewFolder?: () => void\n /** Slot: the folder tree picker. */\n children: ReactNode\n className?: string\n labels?: Partial<FolderFilterLabels>\n /** Test id of the trigger button (none by default). */\n testId?: string\n /** Overrides the \"New folder\" test id (default `explorer-new-folder`). */\n newFolderTestId?: string\n}\n\n/**\n * The folder filter control: a ghost button naming the active folder that opens a popover with\n * an \"All\" row, the folder tree (slot) and an optional \"New folder\" action.\n */\nexport function FolderFilterButton({\n label,\n icon,\n isActive,\n open,\n onOpenChange,\n allCount,\n onSelectAll,\n onNewFolder,\n children,\n className,\n labels,\n testId,\n newFolderTestId,\n}: FolderFilterButtonProps) {\n const l = { ...DEFAULT_FOLDER_FILTER_LABELS, ...labels }\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n data-slot=\"folder-filter-button\"\n data-testid={testId}\n className={cn(\n 'h-7 shrink-0 gap-1.5 px-2 text-sm font-normal pointer-coarse:h-10',\n isActive && 'bg-accent font-medium text-accent-foreground',\n className\n )}\n >\n {icon ?? (\n <FolderOpen\n className={cn(\n 'h-3.5 w-3.5 shrink-0 text-muted-foreground',\n isActive && 'fill-muted-foreground/30'\n )}\n />\n )}\n <span className=\"max-w-[280px] truncate\">{label}</span>\n <ChevronDown className=\"h-4 w-4 text-foreground\" strokeWidth={2.5} />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-56 max-w-[480px] p-1 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n >\n <FolderPickerRow\n label={l.all}\n count={allCount}\n depth={0}\n isActive={!isActive}\n onClick={onSelectAll}\n />\n <div className=\"my-1 border-t border-border\" />\n {children}\n {onNewFolder && (\n <>\n <div className=\"my-1 border-t border-border\" />\n <button\n type=\"button\"\n onClick={onNewFolder}\n data-testid={testIdOr(newFolderTestId, { testId: 'explorer-new-folder' })}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground pointer-coarse:min-h-11\"\n >\n <FolderPlus className=\"h-3.5 w-3.5\" />\n {l.newFolder}\n </button>\n </>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","import type { 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","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}\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}\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}\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\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 note = row.cells[0]?.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 <Loader2 className=\"size-3.5 animate-spin text-muted-foreground\" />\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 <Loader2 className=\"size-3.5 animate-spin text-muted-foreground\" />\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 type { ReactNode } from 'react'\nimport {\n AlertTriangle,\n CheckCircle,\n FileX,\n Hourglass,\n Loader2,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\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 /** The `failed` glyph is stage-aware and host-supplied. */\n failed?: ReactNode\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({ status, onClick, failed, className }: DocStatusIconProps) {\n if (!status) return null\n const key = status.toLowerCase()\n if (key === 'failed') return <>{failed}</>\n const entry = STATUS[key]\n if (!entry) return null\n const { Icon } = entry\n const glyph = (\n <Icon className={cn('size-3', entry.tone, entry.spin && 'animate-spin', className)} />\n )\n if (!onClick) {\n return (\n <span title={entry.title} data-slot=\"doc-status-icon\" data-status={key}>\n {glyph}\n </span>\n )\n }\n return (\n <button\n type=\"button\"\n title={entry.title}\n aria-label={entry.title}\n data-slot=\"doc-status-icon\"\n data-status={key}\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n className=\"cursor-pointer rounded hover:opacity-80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {glyph}\n </button>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { Check, ChevronsUpDown, FolderOpen } from 'lucide-react'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { FolderBreadcrumb } from './cells/FolderCell'\nimport {\n LabelPickerList,\n DEFAULT_LABEL_MULTI_SELECT_LABELS,\n type LabelMultiSelectLabels,\n type LabelOption,\n} from './cells/LabelMultiSelect'\n\n/**\n * Parts of the document \"card\" form (one labelled field per column): read-only values, the folder\n * and label pickers, a native select and the hover attribution of who last changed a value.\n */\n\nconst FIELD_SURFACE =\n 'rounded-md border border-input bg-muted/40 text-sm transition-colors hover:bg-background'\n\nexport interface FieldValueProps {\n tone?: 'default' | 'strong' | 'muted'\n isMono?: boolean\n isTruncated?: boolean\n children: ReactNode\n}\n\n/** A read-only value of a field. */\nexport function FieldValue({ tone = 'default', isMono, isTruncated, children }: FieldValueProps) {\n return (\n <span\n data-slot=\"field-value\"\n className={cn(\n 'text-sm',\n tone === 'strong' && 'font-semibold',\n tone === 'muted' && 'text-muted-foreground',\n isMono && 'font-mono',\n isTruncated && 'truncate'\n )}\n >\n {children}\n </span>\n )\n}\n\nexport interface FieldFolderSelectProps {\n /** Current folder path, if any. */\n folder: string | null | undefined\n /** Searchable folder list (host-bound `FolderCommandList`). */\n picker: ReactNode\n}\n\n/** Folder field: a trigger showing the breadcrumb, opening the folder picker in a popover. */\nexport function FieldFolderSelect({ folder, picker }: FieldFolderSelectProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"field-folder-select\"\n className={cn(\n FIELD_SURFACE,\n 'flex h-9 w-full min-w-0 items-center gap-1.5 px-3 text-left hover:text-primary pointer-coarse:h-11'\n )}\n >\n {folder ? (\n <>\n <FolderOpen className=\"size-3.5 flex-none shrink-0 text-yellow-600\" />\n <FolderBreadcrumb segments={folder.split('/')} size=\"sm\" />\n </>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n <ChevronsUpDown className=\"ml-auto size-3.5 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-[var(--radix-popover-trigger-width)] max-w-[min(640px,92vw)] p-0\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n >\n {picker}\n </PopoverContent>\n </Popover>\n )\n}\n\n/** Read-only folder. */\nexport function FieldFolderValue({ folder }: { folder: string | null | undefined }) {\n return (\n <div className=\"flex items-center gap-1.5 text-sm\">\n {folder ? (\n <>\n <FolderOpen className=\"size-3.5 shrink-0 text-yellow-600\" />\n <span>{folder}</span>\n </>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n )\n}\n\nexport interface FieldLabelsSelectProps {\n options: LabelOption[]\n appliedIds: ReadonlySet<string>\n /** Labels shown as check marks in the field (defaults to the applied ones). Pass fewer to list\n * the selection elsewhere, e.g. in a dialog that renders it beside the field. */\n displayedIds?: ReadonlySet<string>\n onToggle: (id: string) => void\n /** Create a label and apply it; omit to make the picker toggle-only. */\n onCreate?: (name: string) => void\n emptyText?: string\n labels?: Partial<LabelMultiSelectLabels>\n}\n\n/** Labels field: the applied labels as check marks; click to open the label picker. */\nexport function FieldLabelsSelect({\n options,\n appliedIds,\n displayedIds = appliedIds,\n onToggle,\n onCreate,\n emptyText = 'Click to add',\n labels,\n}: FieldLabelsSelectProps) {\n const applied = useMemo(\n () => options.filter((o) => displayedIds.has(o.id)),\n [options, displayedIds]\n )\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"field-labels-select\"\n className={cn(\n FIELD_SURFACE,\n 'flex min-h-9 w-full cursor-pointer items-center px-3 py-1.5 text-left pointer-coarse:min-h-11'\n )}\n >\n <div className=\"flex min-h-[28px] flex-wrap items-center gap-1.5\">\n {applied.length === 0 && (\n <span className=\"text-sm italic text-muted-foreground\">{emptyText}</span>\n )}\n {applied.map((o) => (\n <span key={o.id} className=\"inline-flex items-center gap-1 text-sm font-medium\">\n <span\n className=\"flex size-4 shrink-0 items-center justify-center rounded border-2\"\n style={{ borderColor: o.color, backgroundColor: o.color }}\n >\n <Check className=\"size-3 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[280px] truncate\">{o.name}</span>\n </span>\n ))}\n </div>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[360px] p-0\" align=\"start\" side=\"bottom\" sideOffset={4}>\n <LabelPickerList\n options={options}\n appliedIds={appliedIds}\n onToggle={onToggle}\n onCreate={onCreate}\n labels={{ ...DEFAULT_LABEL_MULTI_SELECT_LABELS, ...labels }}\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport interface FieldNativeSelectProps {\n value: string\n options: string[]\n onChange: (value: string) => void\n /** Text of the empty option. */\n emptyLabel?: string\n ariaLabel?: string\n}\n\n/** A single-choice field (a native `select`: reliable on touch and with assistive tech). */\nexport function FieldNativeSelect({\n value,\n options,\n onChange,\n emptyLabel = '--',\n ariaLabel,\n}: FieldNativeSelectProps) {\n return (\n <select\n value={value}\n aria-label={ariaLabel}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-9 w-full rounded-md border border-input bg-muted/40 px-3 text-sm transition-colors focus:bg-background focus:outline-none focus:ring-1 focus:ring-ring pointer-coarse:h-11\"\n >\n <option value=\"\">{emptyLabel}</option>\n {options.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n )\n}\n\nexport interface FieldAttributionProps {\n /** Avatar of whoever last changed the value. */\n avatar: ReactNode\n /** Formatted date of that change. */\n date: string\n /** Tooltip lines (\"Created ... by ...\", \"Updated ... by ...\"). */\n lines: string[]\n}\n\n/** Subtle \"who changed this and when\". */\nexport function FieldAttribution({ avatar, date, lines }: FieldAttributionProps) {\n return (\n <div className=\"flex items-center gap-1\" data-slot=\"field-attribution\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex items-center gap-1\">\n {avatar}\n <span className=\"text-sm text-muted-foreground\">{date}</span>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {lines.map((line, i) => (\n <p key={i} className=\"text-sm\">\n {line}\n </p>\n ))}\n </TooltipContent>\n </Tooltip>\n </div>\n )\n}\n\n/**\n * Wraps an editable value and reveals `attribution` at its top-right on hover or keyboard focus\n * inside, and always on touch devices (there is no hover there).\n */\nexport function FieldWithAttribution({\n attribution,\n children,\n}: {\n attribution: ReactNode\n children: ReactNode\n}) {\n return (\n <div className=\"group/doctag relative\" data-slot=\"field-with-attribution\">\n {children}\n <div className=\"absolute right-0 top-0 bg-background/90 pl-2 opacity-0 transition-opacity group-focus-within/doctag:opacity-100 group-hover/doctag:opacity-100 pointer-coarse:opacity-100\">\n {attribution}\n </div>\n </div>\n )\n}\n","import { forwardRef, type ComponentProps, type ReactNode } from 'react'\nimport { UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Chrome around the explorer's tile grid: frame, scroller, empty state, marquee, drop overlay. */\n\nexport function ExplorerFrame({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div data-slot=\"explorer-frame\" className={cn('flex h-full flex-col', className)} {...props} />\n )\n}\n\n/** Positioning context of the scroller: the marquee and the drop overlay sit over it. */\nexport function ExplorerStage({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"explorer-stage\"\n className={cn('relative min-h-0 flex-1', className)}\n {...props}\n />\n )\n}\n\n/**\n * The scrolling tile area. `scrollbar-gutter: stable` reserves the scrollbar's space whether or\n * not it shows, so the measured width never flips when the vertical scrollbar toggles (narrow\n * split-screen widths would otherwise thrash column count, tile height, scrollbar, width).\n */\nexport const ExplorerScroller = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n function ExplorerScroller({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"explorer-scroller\"\n className={cn(\n 'h-full select-none overflow-auto px-4 py-4 [scrollbar-gutter:stable]',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nexport interface ExplorerEmptyProps {\n title: string\n description: string\n}\n\n/** Nothing to show in this folder / search. */\nexport function ExplorerEmpty({ title, description }: ExplorerEmptyProps) {\n return (\n <div\n data-slot=\"explorer-empty\"\n className=\"flex h-full flex-col items-center justify-center gap-1 text-center text-muted-foreground\"\n >\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs\">{description}</p>\n </div>\n )\n}\n\n/**\n * Marquee (rubber-band) rectangle. Always mounted and positioned by mutating its style directly\n * during a drag, so selecting does not re-render the grid.\n */\nexport const ExplorerMarquee = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n function ExplorerMarquee({ className, style, ...props }, ref) {\n return (\n <div\n ref={ref}\n aria-hidden\n data-slot=\"explorer-marquee\"\n className={cn(\n 'pointer-events-none fixed z-30 border border-primary bg-primary/10',\n className\n )}\n style={{ display: 'none', ...style }}\n {...props}\n />\n )\n }\n)\n\n/** Shown over the grid while files are dragged in from outside. */\nexport function ExplorerDropOverlay({ label }: { label: string }) {\n return (\n <div\n data-slot=\"explorer-drop-overlay\"\n className=\"pointer-events-none absolute inset-2 z-20 flex flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-primary bg-accent/80 backdrop-blur-sm\"\n >\n <UploadCloud className=\"size-8 text-primary\" />\n <p className=\"text-sm font-medium text-primary\">{label}</p>\n </div>\n )\n}\n\nexport interface ExplorerDragPreviewProps {\n icon: ReactNode\n title: string\n /** Number of documents dragged; shown as a badge above 1. */\n count: number\n}\n\n/** Floating preview under the cursor while dragging documents. */\nexport function ExplorerDragPreview({ icon, title, count }: ExplorerDragPreviewProps) {\n return (\n <div\n data-slot=\"explorer-drag-preview\"\n className=\"flex items-center gap-2 rounded-lg border border-primary/40 bg-popover px-3 py-2 shadow-lg\"\n >\n {icon}\n <span className=\"max-w-[12rem] truncate text-sm font-medium\">{title}</span>\n {count > 1 && (\n <span className=\"rounded-full bg-primary px-1.5 py-0.5 text-xs font-semibold text-primary-foreground\">\n {count}\n </span>\n )}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/files/UploadDropzone.tsx","../../src/files/StatusPill.tsx","../../src/files/FilesToolbar.tsx","../../src/files/Explorer.tsx","../../src/files/ExplorerTile.tsx","../../src/files/documentGridLayout.ts","../../src/files/UploadParts.tsx","../../src/files/UploadSources.tsx","../../src/files/ExportParts.tsx","../../src/files/ViewerChrome.tsx","../../src/files/ViewerLayout.tsx","../../src/files/MoveToFolderDialog.tsx","../../src/files/FilesPage.tsx","../../src/files/DocumentGrid.tsx","../../src/files/ViewerParts.tsx","../../src/files/UploadFooter.tsx","../../src/files/FolderPicker.tsx","../../src/files/HtmlViewerParts.tsx","../../src/files/TagPassagePanel.tsx","../../src/files/page/FilesAddMenu.tsx","../../src/files/page/FilesPageTitle.tsx","../../src/files/page/FilesPageParts.tsx","../../src/files/import/ImportParts.tsx","../../src/files/import/CalendarImportRow.tsx","../../src/files/import/TaskSection.tsx","../../src/files/import/UrlInputDialogView.tsx","../../src/files/import/VendorLogo.tsx","../../src/files/cells/FolderCell.tsx","../../src/files/cells/RelatedDocsCell.tsx","../../src/files/cells/DocumentNameCell.tsx","../../src/files/cells/LabelMultiSelect.tsx","../../src/files/cells/TagColumnParts.tsx","../../src/files/cells/BulkLabelSelect.tsx","../../src/files/bulk/BulkActionsBar.tsx","../../src/files/bulk/FolderFilterButton.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/AiReviewDialog.tsx","../../src/files/DocStatusIcon.tsx","../../src/files/FieldParts.tsx","../../src/files/ExplorerSurface.tsx"],"names":["pick","cn","jsxs","jsx","useRef","useState","Loader2","Button","Fragment","FolderOpen","Badge","Tooltip","TooltipTrigger","TooltipContent","Download","Sparkles","Check","X","HtmlPassage","Share2","hasNote","StickyNote","ChevronRight","Textarea","Upload","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuSeparator","DropdownMenuItem","Progress","LoaderCircle","AlertCircle","Dialog","DialogContent","DialogTitle","DialogDescription","Label","Plus","FolderBreadcrumb","Popover","PopoverTrigger","CopyX","PopoverContent","Pencil","Trash2","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","Minus","memo","LabelMultiSelectView","useEffect","CheckboxCell","TagColumnHeader","MessagesSquare","Tags","MoreHorizontal","FolderInput","RefreshCw","ChevronDown","FolderPlus","TagIcon","SquareCheckBig","Folder","ChevronLeft","Input","Checkbox","TooltipProvider","ScrollArea","Search","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","PencilLine","FolderUp","BookMarked","DialogHeader","CheckCircle","AlertTriangle","Hourglass","ChevronsUpDown","useMemo","ExplorerScroller","ExplorerMarquee","UploadCloud"],"mappings":"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","file":"index.js","sourcesContent":["import { useRef, useState } from 'react'\nimport type { DragEvent } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Loader2, UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface UploadDropzoneProps {\n /** Called with the chosen/dropped files. */\n onFiles: (files: File[]) => void\n /** `accept` attribute for the file picker (e.g. `.pdf,.docx`). */\n accept?: string\n /** Allow selecting more than one file. Defaults to true. */\n multiple?: boolean\n /** Disables picking/dropping (e.g. no active workspace yet). */\n disabled?: boolean\n /** Shows a spinner + busy copy while an upload is in flight. */\n uploading?: boolean\n /** Primary line, e.g. \"Drag files here\". */\n title?: string\n /** Secondary line under the title. */\n description?: string\n /** Small muted hint, e.g. \"PDF, DOCX, images — up to 50MB\". */\n hint?: string\n /** Copy shown next to the spinner while uploading. */\n uploadingLabel?: string\n /** Glyph in the tile. Defaults to an upload-cloud icon. */\n icon?: LucideIcon\n testId?: string\n className?: string\n}\n\n/**\n * A themeable drag-and-drop upload target. Source-agnostic: it just surfaces\n * chosen files via `onFiles` — the host owns the actual upload. Handles its own\n * drag-over state, click-to-browse, and a busy state, styled with the kit's\n * SEMANTIC tokens only (border, muted, primary, foreground) so it renders in\n * each host's colours.\n */\nexport function UploadDropzone({\n onFiles,\n accept,\n multiple = true,\n disabled = false,\n uploading = false,\n title = 'Drag files here',\n description = 'or click to browse',\n hint,\n uploadingLabel = 'Uploading…',\n icon: Icon = UploadCloud,\n testId,\n className,\n}: UploadDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const [dragOver, setDragOver] = useState(false)\n const inert = disabled || uploading\n\n const pick = (files: FileList | null) => {\n if (!files?.length) return\n onFiles(Array.from(files))\n }\n\n const onDrop = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setDragOver(false)\n if (inert) return\n pick(e.dataTransfer.files)\n }\n\n const onDragOver = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n if (!inert) setDragOver(true)\n }\n\n return (\n <button\n type=\"button\"\n onClick={() => !inert && inputRef.current?.click()}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onDragLeave={() => setDragOver(false)}\n disabled={inert}\n data-testid={testId}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-3 rounded-lg bg-muted px-6 py-12 text-center transition-colors',\n 'hover:bg-accent/60',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n dragOver && 'bg-accent ring-2 ring-primary',\n inert && 'cursor-not-allowed opacity-60 hover:bg-muted',\n className\n )}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={(e) => {\n pick(e.target.files)\n if (inputRef.current) inputRef.current.value = ''\n }}\n data-testid={testId ? `${testId}-input` : undefined}\n />\n <div className=\"flex size-12 items-center justify-center rounded-full bg-primary/10 text-primary\">\n {uploading ? <Loader2 className=\"size-6 animate-spin\" /> : <Icon className=\"size-6\" />}\n </div>\n {uploading ? (\n <p className=\"text-sm font-medium text-foreground\">{uploadingLabel}</p>\n ) : (\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {title} <span className=\"text-muted-foreground\">{description}</span>\n </p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )}\n </button>\n )\n}\n","import type { KeyboardEvent, MouseEvent, ReactNode } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@arbidocs/react/ui'\nimport { TONE_SURFACE, type Tone } from '../components/tones'\n\nconst pill = cva(\n 'inline-flex max-w-full items-center justify-center gap-1 rounded-full text-xs font-medium leading-none',\n {\n variants: {\n /** `icon` = glyph-only chip; `label` = text pill. */\n shape: { icon: 'size-6 p-0 pointer-coarse:size-8', label: 'h-6 px-2 pointer-coarse:h-8' },\n interactive: {\n true: \"relative cursor-pointer pointer-coarse:after:absolute pointer-coarse:after:left-1/2 pointer-coarse:after:top-1/2 pointer-coarse:after:size-11 pointer-coarse:after:-translate-x-1/2 pointer-coarse:after:-translate-y-1/2 pointer-coarse:after:content-[''] hover:brightness-95 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n false: '',\n },\n },\n defaultVariants: { shape: 'label', interactive: false },\n }\n)\n\n/** The shared tone vocabulary (see `components/tones`). */\nexport type StatusTone = Tone\n\nexport interface StatusPillProps {\n tone?: StatusTone\n /** Leading glyph. With no `label` the pill is a glyph-only chip. */\n icon?: ReactNode\n label?: ReactNode\n /** Adds a thin bar under the label (queued = still, processing = animated). */\n progress?: 'queued' | 'processing'\n /** Native tooltip and accessible name for glyph-only pills. */\n title?: string\n /** Makes the pill a button (stops row-click propagation). */\n onClick?: () => void\n testId?: string\n className?: string\n}\n\n/**\n * A small tinted status chip. Source-agnostic: the host decides tone, glyph and copy from its\n * own status model; the block only owns the look, the touch target and the keyboard path.\n */\nexport function StatusPill({\n tone = 'neutral',\n icon,\n label,\n progress,\n title,\n onClick,\n testId,\n className,\n}: StatusPillProps) {\n const hasLabel = label !== undefined && label !== null && label !== ''\n const classes = cn(\n pill({ shape: hasLabel ? 'label' : 'icon', interactive: !!onClick }),\n TONE_SURFACE[tone],\n progress && 'h-auto min-h-6 flex-col gap-0 px-2 py-1',\n className\n )\n\n const body = (\n <>\n <span className=\"inline-flex max-w-full items-center gap-1\">\n {icon}\n {hasLabel && <span className=\"truncate\">{label}</span>}\n </span>\n {progress && (\n <span\n aria-hidden\n data-slot=\"status-pill-progress\"\n className={cn(\n 'mt-0.5 block h-1 w-full min-w-10 shrink-0 rounded-sm',\n progress === 'queued' ? 'progress-bar-queued' : 'progress-bar-processing'\n )}\n />\n )}\n </>\n )\n\n if (onClick) {\n return (\n <button\n type=\"button\"\n title={title}\n aria-label={hasLabel ? undefined : title}\n data-slot=\"status-pill\"\n data-testid={testId}\n className={classes}\n onClick={(e: MouseEvent) => {\n e.stopPropagation()\n onClick()\n }}\n onKeyDown={(e: KeyboardEvent) => e.stopPropagation()}\n >\n {body}\n </button>\n )\n }\n return (\n <span\n title={title}\n role={hasLabel || !title ? undefined : 'img'}\n aria-label={hasLabel ? undefined : title}\n data-slot=\"status-pill\"\n data-testid={testId}\n className={classes}\n >\n {body}\n </span>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { FilterInput } from '../shell/FilterInput'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FilesToolbarProps extends Omit<ComponentProps<'div'>, 'children'> {\n /** Leading controls: the filter field and the pickers that narrow the list. */\n leftActions?: ReactNode\n /** Trailing controls (row navigator, views, density...). Always visible; nothing is hover-revealed. */\n rightActions?: ReactNode\n className?: string\n /** Overrides the root test id (default `documents-filter-bar`). */\n testId?: string\n}\n\n/**\n * The calm secondary row under the page title: filters on the left, view controls on the right.\n * No border or fill: the page header already separates it. It wraps by GROUP, never mid-group:\n * the left group (filter field + pickers) keeps one line, and when the view controls no longer\n * fit beside it they drop together onto their own right-aligned line, so a docked tablet sidebar\n * or a phone never orphans a single button.\n */\nexport function FilesToolbar({\n leftActions,\n rightActions,\n className,\n testId,\n ...rest\n}: FilesToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n data-slot=\"files-toolbar\"\n {...rest}\n data-testid={testIdOr(testId, { testId: 'documents-filter-bar' })}\n className={cn('flex min-w-0 flex-wrap items-center gap-x-2 gap-y-2', className)}\n >\n {leftActions && (\n <div data-slot=\"files-toolbar-left\" className=\"flex min-w-0 flex-[1_1_22rem] items-center\">\n {leftActions}\n </div>\n )}\n {rightActions && (\n <div\n data-slot=\"files-toolbar-right\"\n className=\"ml-auto flex min-w-0 flex-wrap items-center justify-end gap-2\"\n >\n {rightActions}\n </div>\n )}\n </div>\n )\n}\n\nexport interface FilesSearchField {\n value: string\n label: string\n}\n\n/** Every fixed string of the search input. Pass a partial `labels` to translate or reword. */\nexport interface FilesSearchLabels {\n placeholder: string\n clearFilter: string\n chooseFields: string\n}\n\nexport const DEFAULT_FILES_SEARCH_LABELS: FilesSearchLabels = {\n placeholder: 'Filter...',\n clearFilter: 'Clear filter',\n chooseFields: 'Choose fields to search',\n}\n\nexport interface FilesSearchTestIds {\n root: string\n filterSlot: string\n input: string\n fieldsButton: string\n}\n\nexport interface FilesSearchInputProps {\n value: string\n onChange: (value: string) => void\n /** Fields the text can match against. */\n fields: FilesSearchField[]\n /** Currently searched field values. */\n selectedFields: string[]\n onSelectedFieldsChange: (fields: string[]) => void\n /** Wins over `labels.placeholder`. */\n placeholder?: string\n labels?: Partial<FilesSearchLabels>\n /** Overrides for the control test ids (defaults keep the current ids). */\n testIds?: Partial<FilesSearchTestIds>\n /** Width/layout classes for the outer wrapper. */\n className?: string\n /** Leading control inside the input (e.g. the filter dropdown trigger). */\n filterSlot?: ReactNode\n}\n\n/**\n * Inline \"Filter...\" box. The filter slot sits INSIDE the input on the left; on the right a muted\n * field picker chooses which fields the text matches, and a clear control shows while there is\n * text. Both inline controls stay visible and are 32px+ on touch.\n */\nexport function FilesSearchInput(props: FilesSearchInputProps) {\n return (\n <FilterInput<string>\n value={props.value}\n onChange={props.onChange}\n fieldOptions={props.fields}\n fields={props.selectedFields}\n onFieldsChange={props.onSelectedFieldsChange}\n filter={props.filterSlot}\n className={props.className}\n labels={{\n placeholder:\n props.placeholder ?? props.labels?.placeholder ?? DEFAULT_FILES_SEARCH_LABELS.placeholder,\n clear: props.labels?.clearFilter ?? DEFAULT_FILES_SEARCH_LABELS.clearFilter,\n chooseFields: props.labels?.chooseFields ?? DEFAULT_FILES_SEARCH_LABELS.chooseFields,\n }}\n testIds={{\n root: props.testIds?.root ?? 'documents-search',\n quick: props.testIds?.filterSlot ?? 'documents-search-filter',\n input: props.testIds?.input ?? 'filter-bar-search-input',\n fieldsButton: props.testIds?.fieldsButton ?? 'documents-search-fields-button',\n }}\n />\n )\n}\n","import type { ComponentProps } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface ExplorerLoadingTilesProps extends ComponentProps<'div'> {\n count?: number\n /** Accessible name (default \"Loading files\"). */\n label?: string\n /** Overrides the root test id (default `explorer-loading-skeleton`). */\n testId?: string\n}\n\n/** Skeleton tile grid shown while the first page loads: the gallery reads as \"filling in\". */\nexport function ExplorerLoadingTiles({\n count = 18,\n label = 'Loading files',\n testId,\n className,\n ...rest\n}: ExplorerLoadingTilesProps) {\n return (\n <div\n className={cn(\n 'grid gap-3 [grid-template-columns:repeat(auto-fill,minmax(150px,1fr))]',\n className\n )}\n aria-busy=\"true\"\n aria-label={label}\n data-slot=\"explorer-loading-tiles\"\n {...rest}\n data-testid={testIdOr(testId, { testId: 'explorer-loading-skeleton' })}\n >\n {Array.from({ length: count }).map((_, i) => (\n <div key={i} className=\"aspect-[4/5] animate-pulse rounded-lg bg-muted\" />\n ))}\n </div>\n )\n}\n","import { useRef, useState } from 'react'\nimport type { HTMLAttributes, MouseEvent, ReactNode, Ref } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Folder, LoaderCircle, MoreHorizontal, Sparkles } from 'lucide-react'\nimport {\n Checkbox,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { ActionLink } from '../components/ActionLink'\nimport { testIdOr } from '../chat/test-id'\nimport { formatCount } from '../lib/format'\n\n/** Every fixed string of the explorer tiles. Pass a partial `labels` to translate or reword. */\nexport interface ExplorerLabels {\n moreActions: string\n name: string\n select: string\n deselect: string\n empty: string\n itemCount: (count: number) => string\n processing: (count: number) => string\n aiSummary: string\n noSummary: string\n lastModifiedBy: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_EXPLORER_LABELS: ExplorerLabels = {\n moreActions: 'More actions',\n name: 'Name',\n select: 'Select',\n deselect: 'Deselect',\n empty: 'Empty',\n itemCount: (count) => formatCount(count, { one: 'item', other: 'items' }),\n processing: (count) => `${count} processing`,\n aiSummary: 'AI Summary:',\n noSummary: 'No AI summary is available for this document yet.',\n lastModifiedBy: 'Last modified by',\n shared: 'Shared',\n private: 'Private',\n}\n\nexport interface ExplorerFileTestIds {\n root: string\n menu: string\n renameInput: string\n}\n\nexport interface ExplorerFolderTestIds {\n root: string\n menu: string\n renameInput: string\n /** Replaces the whole `explorer-folder-processing-<path>` id. */\n processing: string\n}\n\n/** Stretched anchor under the tile controls: gives the tile a real URL when `href` is set. */\nfunction TileLink({\n href,\n label,\n onSelect,\n}: {\n href: string\n label: string\n onSelect: () => void\n}) {\n return (\n <ActionLink\n href={href}\n onSelect={onSelect}\n aria-label={label}\n data-slot=\"explorer-tile-link\"\n className=\"absolute inset-0 z-10 rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n )\n}\n\nfunction isInsideTileLink(e: MouseEvent): boolean {\n return e.target instanceof Element && !!e.target.closest('[data-slot=\"explorer-tile-link\"]')\n}\n\nexport type ExplorerDensity = 'grid' | 'list'\n\nexport interface ExplorerMenuItem {\n id: string\n label: string\n icon: LucideIcon\n onSelect: () => void\n /** Red styling, for Delete. */\n destructive?: boolean\n /** Draw a separator above this item. */\n separatorBefore?: boolean\n /** A nested menu: the item opens it instead of acting (`onSelect` is then ignored). */\n submenu?: ExplorerMenuItem[]\n testId?: string\n}\n\nfunction ExplorerMenu({\n items,\n testId,\n label,\n align,\n triggerClassName,\n}: {\n items: ExplorerMenuItem[]\n testId: string\n label: string\n align: 'start' | 'end'\n triggerClassName?: string\n}) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n className={cn(\n 'flex size-6 items-center justify-center rounded-md bg-background/90 text-muted-foreground backdrop-blur-sm transition hover:bg-background hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:bg-background data-[state=open]:text-foreground pointer-coarse:size-11',\n triggerClassName\n )}\n >\n <MoreHorizontal className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align={align}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n className=\"w-44\"\n >\n {items.map((item) => (\n <div key={item.id}>\n {item.separatorBefore && <DropdownMenuSeparator />}\n {item.submenu ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger data-testid={item.testId}>\n <item.icon className=\"mr-2 size-4\" />\n {item.label}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"w-52\">\n {item.submenu.map((sub) => (\n <DropdownMenuItem key={sub.id} onSelect={sub.onSelect} data-testid={sub.testId}>\n <sub.icon className=\"mr-2 size-4\" />\n {sub.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n ) : (\n <DropdownMenuItem\n onSelect={item.onSelect}\n data-testid={item.testId}\n className={cn(item.destructive && 'text-destructive focus:text-destructive')}\n >\n <item.icon className=\"mr-2 size-4\" />\n {item.label}\n </DropdownMenuItem>\n )}\n </div>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/** Inline rename field. Enter / blur commits, Escape cancels; guarded against Enter-then-blur. */\nfunction RenameField({\n seed,\n testId,\n label,\n onCommit,\n onCancel,\n className,\n}: {\n seed: string\n testId: string\n label: string\n onCommit: (value: string) => void\n onCancel: () => void\n className?: string\n}) {\n const doneRef = useRef(false)\n const commit = (value: string) => {\n if (doneRef.current) return\n doneRef.current = true\n const trimmed = value.trim()\n if (trimmed && trimmed !== seed) onCommit(trimmed)\n else onCancel()\n }\n return (\n <input\n autoFocus\n defaultValue={seed}\n data-testid={testId}\n aria-label={label}\n onFocus={(e) => e.currentTarget.select()}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n commit(e.currentTarget.value)\n } else if (e.key === 'Escape') {\n e.preventDefault()\n doneRef.current = true\n onCancel()\n }\n }}\n onBlur={(e) => commit(e.currentTarget.value)}\n className={cn(\n 'w-full rounded-md border border-primary bg-background px-1 py-0.5 text-sm text-foreground outline-none',\n className\n )}\n />\n )\n}\n\n/** Selection checkbox: always visible (dimmed at rest), solid when selected. */\nfunction SelectCheckbox({\n selected,\n onToggle,\n labels,\n className,\n}: {\n selected: boolean\n onToggle: (e: MouseEvent) => void\n labels: Pick<ExplorerLabels, 'select' | 'deselect'>\n className?: string\n}) {\n return (\n <Checkbox\n checked={selected}\n // Pointer-down stop prevents the drag sensor / tile click from firing.\n onPointerDown={(e) => e.stopPropagation()}\n onClick={onToggle}\n aria-label={selected ? labels.deselect : labels.select}\n className={cn(\n 'size-6 rounded-md border-muted-foreground/60 bg-card transition data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground pointer-coarse:size-9',\n selected ? 'opacity-100' : 'opacity-60 hover:opacity-100',\n className\n )}\n />\n )\n}\n\n// ── File tile ───────────────────────────────────────────────────────────────────────────────\n\nexport interface ExplorerFileTileProps {\n /** Document id (`data-doc-id`). */\n id: string\n /** Rename seed: the display title. */\n title: string\n density: ExplorerDensity\n selected: boolean\n /** Part of an in-flight drag: dimmed. */\n dragging?: boolean\n renaming?: boolean\n /** First-page thumbnail (data URI/URL). Without one the file-type icon shows. */\n thumbnailUrl?: string\n /** Renders the file-type glyph at a pixel size. */\n renderFileIcon: (size: number) => ReactNode\n /** In-flight processing: shows a centred progress overlay with this label. */\n progress?: { label: string; queued: boolean }\n /** Terminal status marker (bottom-right), usually a `StatusPill`. */\n statusMarker?: ReactNode\n /** \"Available offline\" marker (bottom-left). */\n offlineMarker?: ReactNode\n /** The canonical entity pill at the bottom (click opens). */\n entity: ReactNode\n /** Hover card content. Omit to disable the tooltip (renaming, or while dragging). */\n tooltip?: ReactNode\n menuItems: ExplorerMenuItem[]\n /** Drag-and-drop hook-up: ref + listener/aria props from the host's DnD library. */\n rootRef?: Ref<HTMLDivElement>\n rootProps?: HTMLAttributes<HTMLDivElement>\n /** Plain click / double click / menu \"Open\". With `href`, a plain click still calls this. */\n onOpen: () => void\n /** Route of the document: the tile gets a real link (modified clicks go to the browser). */\n href?: string\n labels?: Partial<ExplorerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<ExplorerFileTestIds>\n /** Modifier (shift/meta/ctrl) click: range / toggle selection. */\n onSelect: (e: MouseEvent) => void\n onToggle: (e: MouseEvent) => void\n onCommitRename: (name: string) => void\n onCancelRename: () => void\n}\n\n/** One document tile: thumbnail (or icon) filling the tile with checkbox, menu, status and pill. */\nexport function ExplorerFileTile({\n id,\n title,\n density,\n selected,\n dragging,\n renaming,\n thumbnailUrl,\n renderFileIcon,\n progress,\n statusMarker,\n offlineMarker,\n entity,\n tooltip,\n menuItems,\n rootRef,\n rootProps,\n onOpen,\n href,\n labels,\n testIds,\n onSelect,\n onToggle,\n onCommitRename,\n onCancelRename,\n}: ExplorerFileTileProps) {\n const l = { ...DEFAULT_EXPLORER_LABELS, ...labels }\n const [thumbFailed, setThumbFailed] = useState(false)\n // Portrait pages fill the tile top-aligned; landscape / odd shapes are fit whole.\n const [thumbLandscape, setThumbLandscape] = useState(false)\n const showThumbnail = !!thumbnailUrl && !thumbFailed && !progress\n\n const tile = (\n <div\n ref={rootRef}\n {...rootProps}\n onClick={(e) => {\n if (href && isInsideTileLink(e)) {\n // The link owns plain and new-tab clicks; shift keeps range selection.\n if (e.shiftKey) {\n e.preventDefault()\n onSelect(e)\n }\n return\n }\n if (e.shiftKey || e.metaKey || e.ctrlKey) onSelect(e)\n else onOpen()\n }}\n onDoubleClick={onOpen}\n data-slot=\"explorer-file-tile\"\n data-testid={testIdOr(testIds?.root, { testId: 'explorer-file' })}\n data-doc-id={id}\n className={cn(\n 'group relative h-full cursor-default select-none overflow-hidden rounded-lg border transition',\n dragging && 'opacity-40',\n selected ? 'border-primary/30 bg-accent' : 'border-border bg-muted hover:bg-muted/70'\n )}\n >\n {href && <TileLink href={href} label={title} onSelect={onOpen} />}\n {showThumbnail ? (\n <img\n src={thumbnailUrl}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n onError={() => setThumbFailed(true)}\n onLoad={(e) =>\n setThumbLandscape(e.currentTarget.naturalWidth > e.currentTarget.naturalHeight)\n }\n className={cn(\n 'absolute inset-0 size-full bg-card',\n thumbLandscape ? 'object-contain' : 'object-cover object-top'\n )}\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderFileIcon(density === 'list' ? 30 : 44)}\n </div>\n )}\n\n {progress && (\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-1.5 bg-background/80 px-3\">\n <div\n className={cn(\n 'h-1.5 w-full rounded-sm',\n progress.queued ? 'progress-bar-queued' : 'progress-bar-processing'\n )}\n />\n <span className=\"text-xs font-medium text-primary\">{progress.label}</span>\n </div>\n )}\n\n <SelectCheckbox\n selected={selected}\n onToggle={onToggle}\n labels={l}\n className=\"absolute left-1.5 top-1.5 z-20\"\n />\n\n <div className=\"absolute right-1.5 top-1.5 z-20\">\n <ExplorerMenu\n items={menuItems}\n testId={testIdOr(testIds?.menu, { testId: 'explorer-file-menu' })}\n label={l.moreActions}\n align=\"start\"\n />\n </div>\n\n {renaming ? (\n <div className=\"absolute inset-x-0 bottom-0 z-20 flex items-center gap-1 bg-background/90 px-1.5 py-1 backdrop-blur-sm\">\n <span className=\"shrink-0\">{renderFileIcon(13)}</span>\n <RenameField\n seed={title}\n testId={testIdOr(testIds?.renameInput, { testId: 'explorer-rename-input' })}\n label={l.name}\n onCommit={onCommitRename}\n onCancel={onCancelRename}\n className=\"flex-1 text-left\"\n />\n </div>\n ) : (\n <div className=\"absolute inset-x-1.5 bottom-1.5 z-20 flex flex-col gap-1\">\n {(offlineMarker || statusMarker) && (\n <div className=\"flex items-center\">\n {offlineMarker}\n {statusMarker && <div className=\"ml-auto flex\">{statusMarker}</div>}\n </div>\n )}\n {entity}\n </div>\n )}\n </div>\n )\n\n if (!tooltip) return tile\n return (\n <Tooltip delayDuration={500}>\n <TooltipTrigger asChild>{tile}</TooltipTrigger>\n <TooltipContent side=\"bottom\" sideOffset={6} className=\"p-2.5\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n )\n}\n\n// ── Folder tile ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ExplorerFolderTileProps {\n /** Stored folder name (rename seed, native tooltip). */\n name: string\n /** Label shown on the tile; `''`/null renders no label (provider roots shorten to nothing). */\n displayName: string | null\n /** Folder path segments (ids and `data-folder-path`). */\n path: string[]\n /** Number of items beneath this folder; 0 renders it faded as \"Empty\". */\n count: number\n density: ExplorerDensity\n editing?: boolean\n /** Every document beneath is selected. */\n selected?: boolean\n /** Some (not all) documents beneath are selected. */\n partiallySelected?: boolean\n processingCount?: number\n /** A dragged item is over this folder. */\n isOver?: boolean\n /** Replace the folder glyph (e.g. a provider's brand mark). */\n icon?: ReactNode\n menuItems?: ExplorerMenuItem[]\n rootRef?: Ref<HTMLDivElement>\n rootProps?: HTMLAttributes<HTMLDivElement>\n onOpen: () => void\n /** Route of the folder: the tile gets a real link (modified clicks go to the browser). */\n href?: string\n labels?: Partial<ExplorerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<ExplorerFolderTestIds>\n onToggleSelect?: (e: MouseEvent) => void\n onCommitName?: (name: string) => void\n onCancelName?: () => void\n}\n\n/** One folder tile: glyph, name, item count, optional processing count and actions menu. */\nexport function ExplorerFolderTile({\n name,\n displayName,\n path,\n count,\n density,\n editing,\n selected,\n partiallySelected,\n processingCount = 0,\n isOver,\n icon,\n menuItems = [],\n rootRef,\n rootProps,\n onOpen,\n href,\n labels,\n testIds,\n onToggleSelect,\n onCommitName,\n onCancelName,\n}: ExplorerFolderTileProps) {\n const l = { ...DEFAULT_EXPLORER_LABELS, ...labels }\n const iconSize = density === 'list' ? 34 : 48\n const isEmpty = count === 0\n const countLabel = isEmpty ? l.empty : l.itemCount(count)\n const joined = path.join('/')\n\n return (\n <div\n ref={rootRef}\n {...rootProps}\n onClick={editing || href ? undefined : onOpen}\n data-slot=\"explorer-folder-tile\"\n data-testid={testIdOr(testIds?.root, { testId: 'explorer-folder' })}\n data-folder-path={joined}\n title={name}\n className={cn(\n 'group relative flex h-full cursor-pointer select-none flex-col items-center justify-center gap-1 rounded-lg p-2 text-center transition',\n isOver\n ? 'bg-accent ring-2 ring-primary/40'\n : selected\n ? 'bg-accent ring-1 ring-primary/30'\n : 'bg-muted hover:bg-muted/70',\n isEmpty && !isOver && !selected && 'opacity-70'\n )}\n >\n {href && !editing && <TileLink href={href} label={displayName || name} onSelect={onOpen} />}\n {onToggleSelect && !isEmpty && (\n <SelectCheckbox\n selected={!!selected}\n onToggle={onToggleSelect}\n labels={l}\n className={cn(\n 'absolute left-1.5 top-1.5 z-20',\n partiallySelected && !selected && 'opacity-100'\n )}\n />\n )}\n {menuItems.length > 0 && !editing && (\n <div className=\"absolute right-1 top-1 z-20\">\n <ExplorerMenu\n items={menuItems}\n testId={testIdOr(testIds?.menu, { testId: 'explorer-folder-menu' })}\n label={l.moreActions}\n align=\"end\"\n />\n </div>\n )}\n {icon ?? (\n <Folder\n className={cn(\n 'transition',\n isEmpty\n ? 'text-yellow-text/50'\n : 'fill-yellow-text/30 text-yellow-text group-hover:fill-yellow-text/40'\n )}\n size={iconSize}\n />\n )}\n {editing ? (\n <RenameField\n seed={name}\n testId={testIdOr(testIds?.renameInput, { testId: 'explorer-rename-input' })}\n label={l.name}\n onCommit={(next) => onCommitName?.(next)}\n onCancel={() => onCancelName?.()}\n className=\"text-center\"\n />\n ) : (\n displayName && (\n <span\n className={cn(\n 'line-clamp-2 w-full break-words text-xs font-semibold leading-tight',\n isEmpty ? 'text-foreground/60' : 'text-foreground/90'\n )}\n >\n {displayName}\n </span>\n )\n )}\n <span className=\"text-xs text-muted-foreground\">{countLabel}</span>\n {processingCount > 0 && (\n <span\n className=\"inline-flex items-center gap-1 text-xs font-semibold text-primary\"\n data-testid={testIdOr(testIds?.processing, {\n testId: `explorer-folder-processing-${joined}`,\n })}\n >\n <LoaderCircle className=\"size-3 animate-spin\" />\n {l.processing(processingCount)}\n </span>\n )}\n </div>\n )\n}\n\n// ── Hover card ──────────────────────────────────────────────────────────────────────────────\n\nexport interface ExplorerFileTooltipProps {\n title: string\n /** AI summary; a placeholder is shown when empty. */\n summary?: string | null\n /** Pre-formatted \"last modified\" date; omit to hide the meta rows. */\n modifiedLabel?: string | null\n /** Small avatar of whoever last modified it. */\n modifiedByAvatar?: ReactNode\n shared: boolean\n /** Glyph for the shared/private state. */\n visibilityIcon?: ReactNode\n labels: string[]\n /** Fixed strings of the card (not the document labels above). */\n uiLabels?: Partial<ExplorerLabels>\n}\n\n/** The explorer hover card: leads with the AI summary, then who/when and the labels. */\nexport function ExplorerFileTooltip({\n title,\n summary,\n modifiedLabel,\n modifiedByAvatar,\n shared,\n visibilityIcon,\n labels,\n uiLabels,\n}: ExplorerFileTooltipProps) {\n const l = { ...DEFAULT_EXPLORER_LABELS, ...uiLabels }\n return (\n <div className=\"max-w-xs space-y-2\">\n <div className=\"break-words text-xs font-semibold leading-snug text-foreground\">{title}</div>\n <div className=\"space-y-1 border-t border-border pt-1.5\">\n <div className=\"flex items-center gap-1 text-xs font-semibold text-foreground\">\n <Sparkles className=\"size-3.5 shrink-0 text-yellow-text\" />\n {l.aiSummary}\n </div>\n <p className=\"line-clamp-6 text-xs leading-snug text-foreground/90\">\n {summary?.trim() || l.noSummary}\n </p>\n </div>\n {(modifiedLabel || labels.length > 0) && (\n <div className=\"space-y-1.5 border-t border-border pt-1.5\">\n {modifiedLabel && (\n <div className=\"flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-1\">\n <span>{l.lastModifiedBy}</span>\n {modifiedByAvatar}\n <span>{modifiedLabel}</span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {visibilityIcon}\n <span>{shared ? l.shared : l.private}</span>\n </div>\n </div>\n )}\n {labels.length > 0 && (\n <div className=\"flex flex-wrap gap-1 pt-0.5\">\n {labels.map((label) => (\n <span\n key={label}\n className=\"rounded bg-muted px-1.5 py-0.5 text-xs font-medium text-foreground/80\"\n >\n {label}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","export type DocumentGridLayout = 'table' | 'tablet' | 'mobile-list' | 'modal'\n\nexport interface DocumentGridPresets {\n /** Saved-state ids per layout. Tablet, phone and modal keep their own so they never overwrite desktop state. */\n gridIds: Record<DocumentGridLayout, string>\n /** Visible columns (applied when no saved state exists) per layout. */\n visibleColumns: Record<DocumentGridLayout, string[]>\n /** Desktop row height; phones use `mobileRowHeight`. */\n rowHeight: number\n mobileRowHeight?: number\n /** Modal grids are a fixed 50vh; everything else fills its container. */\n modalHeight?: string\n}\n\nexport interface DocumentGridLayoutProps {\n /** Remount key: switching layout must rebuild the grid so state from another layout never leaks. */\n remountKey: string\n gridId: string\n initialVisibleColumns: string[]\n rowHeight: number\n height: string\n}\n\n/**\n * Pick the layout for the current viewport/container: `isNarrow` = phone, `isTablet` = a table\n * container too narrow for the full column set (a docked sidebar, iPad portrait).\n */\nexport function resolveDocumentGridLayout(\n isNarrow: boolean,\n isModal: boolean,\n isTablet = false\n): DocumentGridLayout {\n if (isModal) return 'modal'\n if (isNarrow) return 'mobile-list'\n return isTablet ? 'tablet' : 'table'\n}\n\n/**\n * Column/sizing preset for the documents grid: the props a host spreads onto its GridView so the\n * table, the phone list and the modal each get their own state id, default columns and sizing.\n * Column definitions (explicit `colId`s) and the ids themselves stay with the host.\n */\nexport function documentGridLayoutProps(\n layout: DocumentGridLayout,\n presets: DocumentGridPresets\n): DocumentGridLayoutProps {\n return {\n remountKey: layout === 'mobile-list' || layout === 'tablet' ? layout : 'table',\n gridId: presets.gridIds[layout],\n initialVisibleColumns: presets.visibleColumns[layout],\n rowHeight: layout === 'mobile-list' ? (presets.mobileRowHeight ?? 64) : presets.rowHeight,\n height: layout === 'modal' ? (presets.modalHeight ?? '50vh') : '100%',\n }\n}\n","import type { ReactNode } from 'react'\nimport { AlertCircle, FolderOpen, X } from 'lucide-react'\nimport { Button, Progress, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\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 { AlertTriangle, CheckCircle2, Download, FolderUp, Users, XCircle } 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 exportColumns: string\n columnsVisible: string\n columnsAll: string\n columnsFiles: string\n columnsHelp: string\n exportToWorkspace: string\n exportToWorkspaceDescription: 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',\n selected: (count) => `${count} selected`,\n exportMethod: 'Export Method',\n downloadToComputer: 'Download to Computer',\n downloadDescription: 'Download all selected documents as a ZIP file with metadata CSV',\n exportColumns: 'Export Columns',\n columnsVisible: 'Visible columns (from current table view)',\n columnsAll: 'All columns (including hidden)',\n columnsFiles: 'Files only (no metadata CSV)',\n columnsHelp: 'Choose which columns to include in the metadata CSV file',\n exportToWorkspace: 'Export to Another Workspace',\n exportToWorkspaceDescription: 'Copy documents to another workspace in ARBI',\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. */\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 <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 </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// ── Method chooser (documents only) ─────────────────────────────────────────────────────────\n\nexport type ExportMode = 'workspace' | 'download'\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 labels?: Partial<ExportLabels>\n /** Overrides the columns select test id (default `export-columns-selector`). */\n columnsTestId?: string\n}\n\n/** \"Download to computer\" vs \"Export to another workspace\", with the CSV columns picker. */\nexport function ExportMethodChooser({\n mode,\n onModeChange,\n columnsMode,\n onColumnsModeChange,\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 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 <div className={card}>\n <RadioGroupItem value=\"download\" id=\"download\" className=\"mt-1\" />\n <div className=\"flex-1\" onClick={() => onModeChange('download')}>\n <Label\n htmlFor=\"download\"\n className=\"flex cursor-pointer items-center gap-2 font-medium\"\n >\n <Download className=\"size-4\" />\n {l.downloadToComputer}\n </Label>\n <p className=\"mt-1 text-sm text-muted-foreground\">{l.downloadDescription}</p>\n {mode === 'download' && (\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 <div className={card}>\n <RadioGroupItem value=\"workspace\" id=\"workspace\" className=\"mt-1\" />\n <div className=\"flex-1\" onClick={() => onModeChange('workspace')}>\n <Label\n htmlFor=\"workspace\"\n className=\"flex cursor-pointer items-center gap-2 font-medium\"\n >\n <FolderUp className=\"size-4\" />\n {l.exportToWorkspace}\n </Label>\n <p className=\"mt-1 text-sm text-muted-foreground\">{l.exportToWorkspaceDescription}</p>\n </div>\n </div>\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 {\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}. Tap 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 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 <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 <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 * One small zoom button for touch devices (desktop has no zoom control: the page already fits\n * the width). It stays quiet at fit width and shows the level once zoomed; pinch and double-tap\n * 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 aria-label={l.zoom(level)}\n data-testid={testIdOr(testIds?.button, { testId: 'viewer-zoom-button' })}\n className=\"absolute right-3 bottom-4 z-10 hidden h-11 min-w-11 items-center justify-center gap-1 rounded-full border border-border bg-background/95 px-2.5 shadow-md backdrop-blur pointer-coarse:inline-flex\"\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 { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Left side of the viewer header: tabs, title and status; shrinks and clips. */\nexport function ViewerHeaderStart({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"viewer-header-start\"\n className=\"flex min-w-0 items-center gap-2 overflow-hidden\"\n >\n {children}\n </div>\n )\n}\n\n/** Right side of the viewer header: the actions; never shrinks. */\nexport function ViewerHeaderEnd({\n isCompact,\n children,\n}: {\n isCompact?: boolean\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"viewer-header-end\"\n className={cn('flex flex-shrink-0 items-center', isCompact ? 'gap-1' : 'gap-2')}\n >\n {children}\n </div>\n )\n}\n\n/** Muted inline status next to the title (\"streaming...\", \"Draft — not saved\"). */\nexport function ViewerStatusNote({\n pulse,\n testId,\n children,\n}: {\n /** Animate while something is being produced. */\n pulse?: boolean\n testId?: string\n children: ReactNode\n}) {\n return (\n <span\n data-slot=\"viewer-status-note\"\n className={cn('flex-shrink-0 text-sm text-muted-foreground', pulse && 'animate-pulse')}\n data-testid={testId}\n >\n {children}\n </span>\n )\n}\n\n/**\n * A pane of the viewer body. `hidden` keeps it mounted but out of sight (media keeps playing\n * while the transcript is read); `scroll` makes the pane scroll itself.\n */\nexport function ViewerPane({\n hidden,\n scroll,\n testId,\n children,\n}: {\n hidden?: boolean\n scroll?: boolean\n testId?: string\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"viewer-pane\"\n data-testid={testId}\n className={cn(hidden ? 'hidden' : scroll ? 'h-full overflow-auto' : 'relative h-full')}\n >\n {children}\n </div>\n )\n}\n\n/** Padding around rendered (read-only) markdown. */\nexport function ViewerRenderedPane({ testId, children }: { testId?: string; children: ReactNode }) {\n return (\n <div data-slot=\"viewer-rendered\" className=\"p-6\" data-testid={testId}>\n {children}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { FolderOpen } from 'lucide-react'\nimport {\n Badge,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { ModalHeader } from '../settings/ModalScaffold'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the dialog. Pass a partial `labels` to translate or reword. */\nexport interface MoveToFolderLabels {\n title: string\n cancel: string\n move: string\n moving: string\n}\n\nexport const DEFAULT_MOVE_TO_FOLDER_LABELS: MoveToFolderLabels = {\n title: 'Move to Folder',\n cancel: 'Cancel',\n move: 'Move',\n moving: 'Moving...',\n}\n\nexport interface MoveToFolderTestIds {\n modal: string\n cancel: string\n confirm: string\n}\n\nexport interface MoveToFolderDialogProps {\n open: boolean\n onClose: () => void\n /** What is being moved, shown as a badge: a folder name or \"3 selected\". */\n subject: string\n /** Screen-reader description. */\n description: string\n /** The folder picker (the host owns the folder tree and search). */\n children: ReactNode\n canConfirm: boolean\n isSubmitting?: boolean\n onConfirm: () => void\n labels?: Partial<MoveToFolderLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<MoveToFolderTestIds>\n}\n\n/** \"Move to folder\" dialog shell: header with subject badge, picker slot, Cancel + Move. */\nexport function MoveToFolderDialog({\n open,\n onClose,\n subject,\n description,\n children,\n canConfirm,\n isSubmitting,\n onConfirm,\n labels,\n testIds,\n}: MoveToFolderDialogProps) {\n const l = { ...DEFAULT_MOVE_TO_FOLDER_LABELS, ...labels }\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n presentation=\"sheet\"\n className=\"sm:max-w-2xl\"\n data-testid={testIdOr(testIds?.modal, { testId: 'move-to-folder-modal' })}\n >\n <ModalHeader className=\"p-0 pb-3\">\n <DialogTitle className=\"flex items-center gap-2\">\n <FolderOpen className=\"size-5 text-yellow-text\" />\n <span>{l.title}</span>\n <Badge className=\"bg-accent px-3 py-1 text-accent-foreground hover:bg-accent\">\n <span className=\"font-semibold\">{subject}</span>\n </Badge>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">{description}</DialogDescription>\n </ModalHeader>\n\n <div className=\"overflow-hidden rounded-lg bg-muted\">{children}</div>\n\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-4\">\n <Button\n variant=\"outline\"\n onClick={onClose}\n data-testid={testIdOr(testIds?.cancel, { testId: 'move-folder-cancel-button' })}\n >\n {l.cancel}\n </Button>\n <Button\n onClick={onConfirm}\n disabled={!canConfirm || isSubmitting}\n data-testid={testIdOr(testIds?.confirm, { testId: 'move-folder-confirm-button' })}\n >\n {isSubmitting ? l.moving : l.move}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","import type { ComponentProps } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FilesPageProps extends ComponentProps<'div'> {\n /** Inside a modal the page keeps its own height instead of filling the page scroll zone. */\n isModal?: boolean\n /** Overrides the root test id (default `documents-page`). */\n testId?: string\n}\n\n/**\n * Files page column. `h-full` fills the bounded page scroll zone (not 100vh), so when a tip bar\n * shrinks the shell this column shrinks with it and the sticky selection bar stays pinned to the\n * visible bottom.\n */\nexport function FilesPage({ isModal, testId, className, ...props }: FilesPageProps) {\n return (\n <div\n data-slot=\"files-page\"\n className={cn('flex flex-col', isModal ? 'overflow-hidden' : 'h-full min-h-0', className)}\n {...props}\n data-testid={testIdOr(testId, { testId: 'documents-page' })}\n />\n )\n}\n\n/**\n * Sticky region on top: the title row (title, view switch, Add) and the calm filter row. 16px\n * gutters are owned by the shared TabHeader and the content toolbar.\n */\nexport function FilesPageHeader({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-page-header\"\n className={cn('sticky top-0 z-10 flex flex-col bg-background', className)}\n {...props}\n />\n )\n}\n\n/** The scrolling content area (grid, gallery, review, smart search). */\nexport function FilesPageMain({ className, ...props }: ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"files-page-main\"\n className={cn('min-h-0 flex-1 overflow-hidden bg-background px-4 sm:px-6', className)}\n {...props}\n />\n )\n}\n","import type { ComponentType, ReactNode } from 'react'\nimport { GridView, type GridViewProps } from './GridView'\nimport {\n documentGridLayoutProps,\n type DocumentGridLayout,\n type DocumentGridPresets,\n} from './documentGridLayout'\n\n/**\n * Row vocabulary of the documents table. The row open in the viewer (its name cell carries\n * `data-viewing`) is the one strong state: full accent tint plus a 2px primary bar. Checkbox-selected\n * rows use the lighter grid theme tint, so the two never read as the same thing. Empty values\n * (`cell-empty`, an em dash) are muted.\n */\nconst DOCUMENT_GRID_CLASS =\n 'w-full [&_.cell-empty]:text-muted-foreground [&_.ag-row:has([data-viewing])]:!bg-accent [&_.ag-row:has([data-viewing])]:shadow-[inset_2px_0_0_hsl(var(--primary))]'\n\nexport interface DocumentGridProps<T> extends Omit<\n GridViewProps<T>,\n 'gridId' | 'initialVisibleColumns' | 'rowHeight' | 'height' | 'persistState'\n> {\n /** Table, phone list or modal: each keeps its own saved state, default columns and sizing. */\n layout: DocumentGridLayout\n /** Saved-state ids, default columns and row heights per layout (ids and `colId`s stay with the host). */\n presets: DocumentGridPresets\n /**\n * The grid implementation to render. Defaults to the core `GridView`; a host passes its own\n * wrapper to add persistence of column state (the core has no store).\n */\n GridComponent?: ComponentType<GridViewProps<T>>\n /**\n * Shown instead of the grid when the workspace has no documents at all (first-run upload\n * prompt). The host decides when via `showEmptyWorkspace`.\n */\n emptyWorkspace?: ReactNode\n showEmptyWorkspace?: boolean\n}\n\n/**\n * The documents table: a GridView preset with the saved-state id, default columns and sizing\n * for the current layout, remounted when the layout flips between table and phone list so state\n * from one never leaks into the other. The host passes rows, column defs (explicit `colId`s) and\n * handlers.\n */\nexport function DocumentGrid<T>({\n layout,\n presets,\n GridComponent = GridView,\n emptyWorkspace,\n showEmptyWorkspace,\n testId = 'documents-grid',\n className = DOCUMENT_GRID_CLASS,\n ...grid\n}: DocumentGridProps<T>) {\n if (showEmptyWorkspace && emptyWorkspace) return <>{emptyWorkspace}</>\n const { remountKey, ...layoutProps } = documentGridLayoutProps(layout, presets)\n return (\n <GridComponent\n key={remountKey}\n {...grid}\n {...layoutProps}\n persistState\n testId={testId}\n className={className}\n />\n )\n}\n","import { useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { ArrowLeftRight, Download, Eye, EyeOff, X } from 'lucide-react'\nimport {\n Button,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { DEFAULT_VIEWER_LABELS, type ViewerLabels } from './ViewerChrome'\n\n// ── Tabs ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface ViewerTab {\n id: string\n icon: ReactNode\n /** Tooltip and accessible name. */\n tooltip: string\n /** Visible text next to the icon, for tabs whose icon alone is not self-explanatory. */\n label?: string\n /** Overrides the tab test id (default `<id>-tab`). */\n testId?: string\n}\n\nexport interface ViewerTabBarProps {\n tabs: ViewerTab[]\n activeId: string\n onChange: (id: string) => void\n className?: string\n}\n\n/** Underline tab strip for the viewer's formats (PDF, DOCX, Source, Versions, HTML...). */\nexport function ViewerTabBar({ tabs, activeId, onChange, className }: ViewerTabBarProps) {\n return (\n <TooltipProvider>\n <div className={cn('flex shrink-0 items-center', className)} role=\"group\">\n {tabs.map((tab) => {\n const isActive = tab.id === activeId\n return (\n <Tooltip key={tab.id}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => onChange(tab.id)}\n aria-label={tab.tooltip}\n aria-pressed={isActive}\n data-testid={testIdOr(tab.testId, { testId: `${tab.id}-tab` })}\n className={cn(\n 'shrink-0 border-b-2 px-3 py-2 font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n tab.label && 'inline-flex items-center gap-1.5 text-sm',\n isActive\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:border-border hover:text-foreground'\n )}\n >\n {tab.icon}\n {tab.label && <span>{tab.label}</span>}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{tab.tooltip}</TooltipContent>\n </Tooltip>\n )\n })}\n </div>\n </TooltipProvider>\n )\n}\n\n// ── Page counter ────────────────────────────────────────────────────────────────────────────\n\nexport interface ViewerPageCounterProps {\n page: number\n total: number\n /** Called with a valid 1..total page typed into the counter. */\n onGoTo: (page: number) => void\n labels?: Partial<ViewerLabels>\n}\n\n/** \"3 / 12\": click the number to type a page; Enter or blur commits, Escape cancels. */\nexport function ViewerPageCounter({ page, total, onGoTo, labels }: ViewerPageCounterProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n const [isEditing, setIsEditing] = useState(false)\n const [input, setInput] = useState('')\n const inputRef = useRef<HTMLInputElement>(null)\n if (total <= 0) return null\n\n const commit = () => {\n const n = parseInt(input, 10)\n if (!isNaN(n) && n >= 1 && n <= total) onGoTo(n)\n setIsEditing(false)\n }\n\n return (\n <div className=\"flex shrink-0 items-center gap-1 rounded-md bg-muted px-2 py-1\">\n {isEditing ? (\n <input\n ref={inputRef}\n autoFocus\n type=\"text\"\n value={input}\n onFocus={(e) => e.currentTarget.select()}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit()\n else if (e.key === 'Escape') setIsEditing(false)\n }}\n onBlur={commit}\n className=\"w-8 rounded border border-border bg-background px-1 py-0.5 text-center text-sm font-medium focus:outline-none\"\n aria-label={l.pageInput}\n />\n ) : (\n <button\n type=\"button\"\n onClick={() => {\n setInput(String(page))\n setIsEditing(true)\n }}\n className=\"min-w-[2rem] cursor-text rounded border border-border bg-background px-1 py-0.5 text-sm font-medium transition-colors hover:bg-muted pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n title={l.pageOfTitle}\n aria-label={l.pageOf(page, total)}\n >\n {page}\n </button>\n )}\n <span className=\"text-sm text-muted-foreground\">/ {total}</span>\n </div>\n )\n}\n\n// ── Fallbacks ───────────────────────────────────────────────────────────────────────────────\n\n/** A format that cannot be previewed in the browser: offer the original instead. */\nexport function ViewerPreviewUnavailable({\n extension,\n onDownload,\n labels,\n}: {\n extension: string\n onDownload: () => void\n labels?: Partial<ViewerLabels>\n}) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-4 p-8 text-center\">\n <div className=\"text-4xl text-muted-foreground\" aria-hidden>\n 📄\n </div>\n <div>\n <p className=\"mb-1 font-medium\">{l.previewUnavailable}</p>\n <p className=\"mb-4 text-sm text-muted-foreground\">{l.cannotPreview(extension)}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onDownload}>\n <Download className=\"mr-2 size-4\" />\n {l.downloadToOpen}\n </Button>\n </div>\n </div>\n )\n}\n\n/** The file failed to load: say so and offer the download instead. */\nexport function ViewerLoadError({\n message,\n onDownload,\n labels,\n testId,\n}: {\n message: string\n onDownload: () => void\n labels?: Partial<ViewerLabels>\n /** Overrides the root test id (default `pdf-load-error`). */\n testId?: string\n}) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n return (\n <div\n className=\"flex h-full flex-col items-center justify-center gap-3 p-8 text-center\"\n data-testid={testIdOr(testId, { testId: 'pdf-load-error' })}\n >\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onDownload}>\n <Download className=\"mr-2 size-4\" />\n {l.download}\n </Button>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { CopyX, Sparkles } from 'lucide-react'\nimport {\n IconToggle,\n Textarea,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the upload footer. Pass a partial `labels` to translate or reword. */\nexport interface UploadFooterLabels {\n skipDuplicates: string\n skipDuplicatesActive: string\n skipDuplicatesInactive: string\n autoRename: string\n autoRenameActive: string\n autoRenameInactive: string\n titleInstruction: string\n titleInstructionPlaceholder: string\n}\n\nexport const DEFAULT_UPLOAD_FOOTER_LABELS: UploadFooterLabels = {\n skipDuplicates: 'Skip duplicates',\n skipDuplicatesActive: 'Skip identical files already in the workspace',\n skipDuplicatesInactive: 'Allow uploading identical files',\n autoRename: 'Auto-rename',\n autoRenameActive: 'Generate a descriptive title via AI instead of using the filename',\n autoRenameInactive: 'Keep the original filename',\n titleInstruction: 'Title instruction',\n titleInstructionPlaceholder: 'Optional: how should AI name these documents?',\n}\n\nexport interface UploadFooterTestIds {\n bar: string\n skipDuplicates: string\n autoRename: string\n settingsPanel: string\n instruction: string\n}\n\n// ── Container ───────────────────────────────────────────────────────────────────────────────\n\nexport function UploadContainer({\n children,\n className = 'p-4 sm:p-6',\n testId,\n}: {\n children: ReactNode\n className?: string\n /** Overrides the root test id (default `upload-container`). */\n testId?: string\n}) {\n return (\n <div\n className={className}\n data-slot=\"upload-container\"\n data-testid={testIdOr(testId, { testId: 'upload-container' })}\n >\n {children}\n </div>\n )\n}\n\n// ── Share note ──────────────────────────────────────────────────────────────────────────────\n\nexport interface UploadShareNoteProps {\n /** What the current choice means, e.g. \"Uploaded documents will be shared with this workspace\". */\n description: string\n /** The visibility toggle itself (the host owns it). */\n children: ReactNode\n /** Compact: a tooltip on the toggle. Otherwise a tonal card with the text beneath it. */\n compact?: boolean\n /** Overrides the wrapper test id (default `share-toggle`). */\n testId?: string\n}\n\n/** Wraps the upload visibility toggle with its explanation (tooltip when compact, text otherwise). */\nexport function UploadShareNote({\n description,\n children,\n compact = false,\n testId,\n}: UploadShareNoteProps) {\n const id = testIdOr(testId, { testId: 'share-toggle' })\n if (compact) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <div data-testid={id}>{children}</div>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-xs\">\n <p className=\"text-sm\">{description}</p>\n </TooltipContent>\n </Tooltip>\n )\n }\n return (\n <div className=\"rounded-lg bg-muted p-4\" data-testid={id}>\n <div className=\"flex flex-col gap-3\">\n {children}\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n </div>\n </div>\n )\n}\n\n// ── Footer bar ──────────────────────────────────────────────────────────────────────────────\n\nconst TOGGLE_COLORS = { text: 'text-primary', bg: 'bg-primary' }\n\nexport interface UploadFooterBarProps {\n skipDuplicates: boolean\n onSkipDuplicatesChange: (value: boolean) => void\n autoRename: boolean\n onAutoRenameChange: (value: boolean) => void\n autoRenameInstruction: string\n onAutoRenameInstructionChange: (value: string) => void\n /** The visibility toggle, right-aligned before the submit button. */\n shareToggle?: ReactNode\n /** The Upload submit button (the view's ONE primary action). */\n children: ReactNode\n className?: string\n labels?: Partial<UploadFooterLabels>\n testIds?: Partial<UploadFooterTestIds>\n}\n\n/**\n * The upload action footer: everyday toggles next to the submit button\n * (`[Skip duplicates] [Auto-rename] ... [Visibility] [Upload N]`). When Auto-rename is on, its\n * title instruction drops in just below.\n */\nexport function UploadFooterBar({\n skipDuplicates,\n onSkipDuplicatesChange,\n autoRename,\n onAutoRenameChange,\n autoRenameInstruction,\n onAutoRenameInstructionChange,\n shareToggle,\n children,\n className,\n labels,\n testIds,\n}: UploadFooterBarProps) {\n const l = { ...DEFAULT_UPLOAD_FOOTER_LABELS, ...labels }\n return (\n <>\n <div\n className={cn(\n 'flex shrink-0 flex-wrap items-center gap-x-3 gap-y-2 border-t border-border bg-background px-4 py-3 sm:px-6',\n className\n )}\n data-testid={testIdOr(testIds?.bar, { testId: 'upload-footer-bar' })}\n >\n <IconToggle\n icon={CopyX}\n isActive={skipDuplicates}\n onToggle={onSkipDuplicatesChange}\n colors={TOGGLE_COLORS}\n showLabel={true}\n label={l.skipDuplicates}\n tooltipActive={l.skipDuplicatesActive}\n tooltipInactive={l.skipDuplicatesInactive}\n data-testid={testIdOr(testIds?.skipDuplicates, { testId: 'toggle-skip-duplicates' })}\n />\n <IconToggle\n icon={Sparkles}\n isActive={autoRename}\n onToggle={onAutoRenameChange}\n colors={TOGGLE_COLORS}\n showLabel={true}\n label={l.autoRename}\n tooltipActive={l.autoRenameActive}\n tooltipInactive={l.autoRenameInactive}\n data-testid={testIdOr(testIds?.autoRename, { testId: 'toggle-auto-rename' })}\n />\n <div className=\"hidden flex-1 sm:block\" />\n {shareToggle}\n {/* Phones: the primary action is a full-width button on its own row below the options. */}\n <div className=\"w-full sm:w-auto max-sm:[&>button]:w-full\">{children}</div>\n </div>\n\n {autoRename && (\n <div\n className=\"shrink-0 border-t border-border bg-background px-4 py-3 sm:px-6\"\n data-testid={testIdOr(testIds?.settingsPanel, { testId: 'upload-settings-panel' })}\n >\n <label htmlFor=\"auto-rename-instruction\" className=\"text-sm font-medium\">\n {l.titleInstruction}\n </label>\n <Textarea\n id=\"auto-rename-instruction\"\n value={autoRenameInstruction}\n onChange={(e) => onAutoRenameInstructionChange(e.target.value)}\n placeholder={l.titleInstructionPlaceholder}\n className=\"mt-1 min-h-[60px] text-sm\"\n data-testid={testIdOr(testIds?.instruction, { testId: 'auto-rename-instruction' })}\n />\n </div>\n )}\n </>\n )\n}\n","import { useCallback, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Check, FolderOpen, Minus, Plus, X } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the folder pickers. Pass a partial `labels` to translate or reword. */\nexport interface FolderPickerLabels {\n none: string\n removeFromFolder: string\n searchOrCreate: string\n noFolders: string\n create: (name: string) => string\n}\n\nexport const DEFAULT_FOLDER_PICKER_LABELS: FolderPickerLabels = {\n none: 'None',\n removeFromFolder: 'Remove from folder',\n searchOrCreate: 'Search or create...',\n noFolders: 'No folders yet',\n create: (name) => `Create \\u201c${name}\\u201d`,\n}\n\nexport interface FolderCommandListTestIds {\n create: string\n createOption: string\n remove: string\n /** Replaces the whole `folder-picker-option-<folder>` id. */\n option: (folder: string) => string\n}\n\n// ── Tree row ────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderPickerRowProps {\n label: string\n /** Optional leading glyph (e.g. a connector brand mark for provider roots). */\n icon?: ReactNode\n /** Shown at the right edge; omit for rows with nothing to count (e.g. an empty unread count). */\n count?: number\n depth: number\n isActive: boolean\n muted?: boolean\n /** Test id of the row button (none by default). */\n testId?: string\n /**\n * Draw a checkbox in the leading slot instead of the single-select tick. A list you can pick\n * SEVERAL rows from should look like one: a lone tick reads \"this is the current one\", a box\n * reads \"tick the ones you want\".\n */\n checkbox?: boolean\n /** Checkbox only: some descendants are selected, so show a dash, not a tick. */\n indeterminate?: boolean\n onClick: () => void\n}\n\n/** One folder row: indented by depth, with a count. Whole row is the target (44px on touch). */\nexport function FolderPickerRow({\n label,\n icon,\n count,\n depth,\n isActive,\n muted,\n checkbox,\n indeterminate,\n testId,\n onClick,\n}: FolderPickerRowProps) {\n return (\n <button\n type=\"button\"\n data-testid={testId}\n onClick={onClick}\n // The row IS the checkbox: a real <Checkbox> inside this button would nest one interactive\n // element in another and swallow the click. role + aria-checked carry the same meaning.\n role={checkbox ? 'checkbox' : undefined}\n aria-checked={checkbox ? (indeterminate ? 'mixed' : isActive) : undefined}\n style={{ paddingLeft: `${4 + depth * 14}px` }}\n className={cn(\n // `[&:hover]:`, not `hover:`: the latter compiles behind `@media (hover: hover)`, so on a\n // touchscreen whose PRIMARY pointer reports `hover: none` the row would never highlight\n // even with a real mouse attached. The arbitrary selector has no media gate.\n 'flex w-full items-center gap-1 rounded-sm py-1 pr-2 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&:hover]:bg-accent pointer-coarse:min-h-11',\n isActive && 'bg-primary/10',\n muted && !isActive && 'text-muted-foreground'\n )}\n >\n <span className=\"flex w-4 shrink-0 items-center justify-center\">\n {checkbox ? (\n <span\n className={cn(\n 'flex size-3.5 items-center justify-center rounded-[3px] border transition-colors',\n isActive || indeterminate\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-muted-foreground/40'\n )}\n >\n {indeterminate ? (\n <Minus className=\"size-2.5\" />\n ) : (\n isActive && <Check className=\"size-2.5\" />\n )}\n </span>\n ) : (\n isActive && <Check className=\"size-3.5 text-primary\" />\n )}\n </span>\n {icon}\n {label !== '' && (\n <span className={cn('min-w-0 truncate', isActive && 'font-semibold text-primary')}>\n {label}\n </span>\n )}\n {count !== undefined && (\n <span className=\"ml-auto pl-2 text-sm font-semibold text-muted-foreground\">{count}</span>\n )}\n </button>\n )\n}\n\n// ── Tree ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderTreeNode {\n path: string\n label: string\n depth: number\n count: number\n /** Replaces the label's default look (provider roots show a brand mark). */\n icon?: ReactNode\n}\n\nexport interface FolderTreeProps {\n nodes: FolderTreeNode[]\n unfiledCount: number\n /** string = folder path selected, null = Unfiled selected, undefined = nothing selected. */\n value: string | null | undefined\n onChange: (folder: string | null) => void\n /** Show the Unfiled (\"None\") row even when it is empty. */\n showUnfiledAlways?: boolean\n labels?: Partial<FolderPickerLabels>\n}\n\n/** Folder hierarchy with an Unfiled option at the bottom. No \"All\" row: callers add their own. */\nexport function FolderTree({\n nodes,\n unfiledCount,\n value,\n onChange,\n showUnfiledAlways,\n labels,\n}: FolderTreeProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n return (\n <div className=\"max-h-[240px] overflow-y-auto\">\n {nodes.map((node) => (\n <FolderPickerRow\n key={node.path}\n label={node.label}\n icon={node.icon}\n count={node.count}\n depth={node.depth}\n isActive={value === node.path}\n onClick={() => onChange(node.path)}\n />\n ))}\n {(unfiledCount > 0 || showUnfiledAlways) && (\n <>\n {nodes.length > 0 && <div className=\"my-1 border-t border-border\" />}\n <FolderPickerRow\n label={l.none}\n count={unfiledCount}\n depth={0}\n isActive={value === null}\n muted\n onClick={() => onChange(null)}\n />\n </>\n )}\n </div>\n )\n}\n\n// ── Searchable list ─────────────────────────────────────────────────────────────────────────\n\nfunction FolderBreadcrumb({ folder }: { folder: string }) {\n const parts = folder.split('/')\n return (\n <span className=\"whitespace-nowrap\">\n {parts.map((part, i) => (\n <span key={i} className=\"inline-flex items-center gap-0.5\">\n {i > 0 && <span className=\"mx-0.5 text-sm text-muted-foreground/50\">/</span>}\n <span className={i < parts.length - 1 ? 'text-sm text-muted-foreground' : ''}>\n {part}\n </span>\n </span>\n ))}\n </span>\n )\n}\n\nexport interface FolderCommandListProps {\n /** Existing folder paths (the host derives them from its documents). */\n folders: string[]\n /** Selected folder (null = unfiled, undefined = no selection). */\n value?: string | null\n /** A folder was picked or a new one created. */\n onSelect: (folder: string | null) => void\n /** Show the remove / move-to-root option. */\n showRemove?: boolean\n /** Wins over `labels.removeFromFolder`. */\n removeLabel?: string\n /** Wins over `labels.searchOrCreate`. */\n placeholder?: string\n autoFocus?: boolean\n labels?: Partial<FolderPickerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<FolderCommandListTestIds>\n}\n\n/**\n * Searchable folder picker: filter existing folders, create one by typing a new name, optional\n * \"Remove from folder\". Shows hierarchy as breadcrumbs.\n */\nexport function FolderCommandList({\n folders,\n value,\n onSelect,\n showRemove = false,\n removeLabel,\n placeholder,\n autoFocus = true,\n labels,\n testIds,\n}: FolderCommandListProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n const [search, setSearch] = useState('')\n const trimmed = search.trim()\n const matchesExisting = folders.some((f) => f.toLowerCase() === trimmed.toLowerCase())\n\n const handleCreate = useCallback(\n (name: string) => {\n const next = name.trim()\n if (!next) return\n onSelect(next)\n setSearch('')\n },\n [onSelect]\n )\n\n return (\n <Command shouldFilter={true}>\n <CommandInput\n placeholder={placeholder ?? l.searchOrCreate}\n value={search}\n onValueChange={setSearch}\n autoFocus={autoFocus}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && trimmed && !matchesExisting) {\n e.preventDefault()\n handleCreate(search)\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {trimmed ? (\n <button\n type=\"button\"\n data-testid={testIdOr(testIds?.create, { testId: 'folder-picker-create' })}\n onClick={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"flex w-full cursor-pointer items-center gap-1.5 rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n <Plus className=\"size-3.5 shrink-0\" />\n {l.create(trimmed)}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.noFolders}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {folders.map((folder) => (\n <CommandItem\n key={folder}\n value={folder}\n data-testid={testIdOr(testIds?.option?.(folder), {\n testId: `folder-picker-option-${folder}`,\n })}\n onSelect={() => onSelect(folder)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm\"\n >\n <FolderOpen className=\"mr-1.5 size-3.5 flex-none shrink-0 text-yellow-text\" />\n <FolderBreadcrumb folder={folder} />\n {value === folder && (\n <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n\n {trimmed && !matchesExisting && folders.length > 0 && (\n <CommandGroup>\n <CommandItem\n value={`__create__${trimmed}`}\n data-testid={testIdOr(testIds?.createOption, {\n testId: 'folder-picker-create-option',\n })}\n onSelect={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-primary\"\n >\n <Plus className=\"mr-1.5 size-3.5 shrink-0\" />\n <span>{l.create(trimmed)}</span>\n </CommandItem>\n </CommandGroup>\n )}\n\n {showRemove && (\n <CommandGroup>\n <CommandItem\n value=\"__none__\"\n data-testid={testIdOr(testIds?.remove, { testId: 'folder-picker-remove' })}\n onSelect={() => onSelect(null)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-muted-foreground\"\n >\n <X className=\"mr-1 size-3.5 shrink-0\" />\n <span>{removeLabel ?? l.removeFromFolder}</span>\n {value === null && <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>}\n </CommandItem>\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n )\n}\n","import { memo, useState } from 'react'\nimport type { ReactNode, Ref } from 'react'\nimport { Check, Columns2, Copy, Share2, StickyNote, Tags, X } 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 instantTranslation: string\n backToDocument: string\n compareOriginal: string\n copyComparison: string\n copyTranslation: string\n passage: string\n original: string\n translation: 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 instantTranslation: 'Instant Translation',\n backToDocument: 'Back to document',\n compareOriginal: 'Compare original vs translation',\n copyComparison: 'Copy comparison',\n copyTranslation: 'Copy full translation',\n passage: 'Passage',\n original: 'Original',\n translation: 'Translation',\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// ── Translation ─────────────────────────────────────────────────────────────────────────────\n\nexport interface TranslationBadgeProps {\n isComparing: boolean\n onToggleCompare: () => void\n onCopy: () => Promise<void>\n labels?: Partial<HtmlViewerLabels>\n}\n\n/** \"Instant Translation\" chip with compare toggle and copy. */\nexport function TranslationBadge({\n isComparing,\n onToggleCompare,\n onCopy,\n labels,\n}: TranslationBadgeProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n const [copied, setCopied] = useState(false)\n const handleCopy = async () => {\n await onCopy()\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n const iconButton =\n 'flex items-center transition-colors hover:text-blue-text-strong pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:justify-center'\n return (\n <span\n className=\"inline-flex items-center gap-1 rounded-md border border-blue-border bg-blue-bg py-0.5 pl-2 pr-1 text-sm font-medium text-blue-text\"\n data-slot=\"translation-badge\"\n >\n {l.instantTranslation}\n <button\n type=\"button\"\n onClick={onToggleCompare}\n className={iconButton}\n title={isComparing ? l.backToDocument : l.compareOriginal}\n aria-label={isComparing ? l.backToDocument : l.compareOriginal}\n >\n {isComparing ? <X className=\"size-3\" /> : <Columns2 className=\"size-3\" />}\n </button>\n <button\n type=\"button\"\n onClick={handleCopy}\n className={iconButton}\n title={isComparing ? l.copyComparison : l.copyTranslation}\n aria-label={isComparing ? l.copyComparison : l.copyTranslation}\n >\n {copied ? <Check className=\"size-3\" /> : <Copy className=\"size-3\" />}\n </button>\n </span>\n )\n}\n\nexport interface TranslationRowView {\n key: string\n /** The passage reference pill (host renders its entity). */\n passage: ReactNode\n original: string\n translated: string\n}\n\n/** Passage / Original / Translation table. */\nexport function TranslationCompareTable({\n rows,\n labels,\n}: {\n rows: TranslationRowView[]\n labels?: Partial<HtmlViewerLabels>\n}) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n const th = 'border border-border px-4 py-2 text-left text-sm font-medium text-muted-foreground'\n return (\n <div className=\"h-full w-full overflow-y-auto bg-muted p-4\" data-slot=\"translation-compare\">\n <div className=\"mx-auto max-w-6xl\">\n <table className=\"w-full border-collapse overflow-hidden rounded-md border border-border bg-background\">\n <thead>\n <tr className=\"bg-muted\">\n <th className={cn(th, 'w-40 px-3')} translate=\"no\">\n {l.passage}\n </th>\n <th className={cn(th, 'w-1/2')} translate=\"no\">\n {l.original}\n </th>\n <th className={cn(th, 'w-1/2 text-blue-text')} translate=\"no\">\n {l.translation}\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.key} className=\"align-top\">\n <td className=\"border border-border px-3 py-2\" translate=\"no\">\n {row.passage}\n </td>\n <td\n className=\"whitespace-pre-wrap border border-border px-4 py-2 text-sm text-foreground\"\n translate=\"no\"\n >\n {row.original}\n </td>\n <td className=\"whitespace-pre-wrap border border-border px-4 py-2 text-sm text-foreground\">\n {row.translated}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\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 { 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}\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 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 key={tag.id} className=\"border-b border-border last:border-b-0\">\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 <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 </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 { BookMarked } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Row of controls that follows the tab: filter field, folder picker, tags button. */\nexport function FilesFilterBar({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-filter-bar\"\n className={cn('flex min-w-0 flex-1 flex-nowrap items-center gap-2', className)}\n {...props}\n />\n )\n}\n\nexport interface FilesTagsButtonProps {\n onClick: () => void\n /** Button text (default \"Tags\"). */\n label?: string\n className?: string\n /** Overrides the test id (default `filter-bar-tags-button`). */\n testId?: string\n}\n\n/** Opens the labels / annotations vocabulary editor. The label collapses to sr-only on phones. */\nexport function FilesTagsButton({\n onClick,\n label = 'Tags',\n className,\n testId,\n}: FilesTagsButtonProps) {\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn('h-8 shrink-0 gap-1.5 px-2 font-normal pointer-coarse:h-11', className)}\n onClick={onClick}\n data-testid={testIdOr(testId, { testId: 'filter-bar-tags-button' })}\n >\n <BookMarked className=\"h-3.5 w-3.5\" />\n <span className=\"text-sm max-[480px]:sr-only\">{label}</span>\n </Button>\n )\n}\n\n/**\n * The view switch beside the page title. Marks a size container so the switch collapses its labels\n * to icons by the room it is given (not the viewport), and shrinks with the row.\n */\nexport function FilesViewCenter({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-view-center\"\n className={cn('@container flex min-w-[9.5rem] flex-1 items-center gap-2', className)}\n {...props}\n />\n )\n}\n\nexport interface FilesModalFooterProps {\n children?: ReactNode\n className?: string\n}\n\n/** Footer row used when the page is hosted in a modal. */\nexport function FilesModalFooter({ children, className }: FilesModalFooterProps) {\n return (\n <div\n data-slot=\"files-modal-footer\"\n className={cn(\n // Sticks to the bottom of the modal's scrolling body so Close is always reachable.\n 'sticky bottom-0 z-40 flex justify-end gap-2 border-t border-border bg-background px-4 py-3 sm:px-6',\n className\n )}\n >\n {children}\n </div>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport { ExternalLink, Loader2, RefreshCw, Settings, Square, Unplug } from 'lucide-react'\nimport { Button, Progress, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the import parts. Pass a partial `labels` to translate or reword. */\nexport interface ImportLabels {\n stop: string\n stopping: string\n importNow: string\n settings: string\n importingOf: (processed: number, total: number, noun: string) => string\n importing: (processed: number, noun: string) => string\n foldersSelected: (count: number) => string\n folders: (names: string) => string\n moreFolders: (count: number) => string\n connect: string\n reconnect: string\n reconnecting: string\n disconnect: string\n disconnecting: string\n /** Shown under a family that needs re-consent; `reconnect` is rendered bold inside it. */\n reconnectHint: (reconnectLabel: ReactNode) => ReactNode\n}\n\nexport const DEFAULT_IMPORT_LABELS: ImportLabels = {\n stop: 'Stop',\n stopping: 'Stopping…',\n importNow: 'Import now',\n settings: 'Settings',\n importingOf: (processed, total, noun) => `Importing ${processed} of ${total} ${noun}…`,\n importing: (processed, noun) => `Importing ${processed} ${noun}…`,\n foldersSelected: (count) => `Folders: ${count} selected`,\n folders: (names) => `Folders: ${names}`,\n moreFolders: (count) => ` +${count} more`,\n connect: 'Connect',\n reconnect: 'Reconnect',\n reconnecting: 'Reconnecting…',\n disconnect: 'Disconnect',\n disconnecting: 'Disconnecting…',\n reconnectHint: (reconnectLabel) => (\n <>\n Couldn’t reach this account. Click {reconnectLabel} — if it keeps happening, log out and back\n in to refresh the connection.\n </>\n ),\n}\n\n/** Divided list of provider rows inside a family section. */\nexport function ImportList({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div data-slot=\"import-list\" className={cn('divide-y divide-border', className)} {...props} />\n )\n}\n\nexport interface ImportRowProps {\n /** Brand mark, already sized by the caller. */\n logo: ReactNode\n name: ReactNode\n /** Right-aligned actions on the top line. */\n actions?: ReactNode\n /** Detail rows below the top line (summary, progress, handoff, dialogs). */\n children?: ReactNode\n testId?: string\n className?: string\n}\n\n/** One provider row: logo + name + actions, with detail content beneath. */\nexport function ImportRow({ logo, name, actions, children, testId, className }: ImportRowProps) {\n return (\n <div data-slot=\"import-row\" data-testid={testId} className={cn('py-3', className)}>\n <div className=\"flex items-center gap-2.5\">\n {logo}\n <div className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">{name}</div>\n {actions}\n </div>\n {children}\n </div>\n )\n}\n\n/** Muted explanatory text aligned under the provider name. */\nexport function ImportHint({ className, ...props }: ComponentProps<'p'>) {\n return (\n <p\n data-slot=\"import-hint\"\n className={cn('ml-[34px] mt-1 text-xs text-muted-foreground', className)}\n {...props}\n />\n )\n}\n\n/** Compact CTA used on provider rows (Reconnect, Enable...). */\nexport function ImportActionButton({\n className,\n children,\n variant = 'outline',\n ...props\n}: Omit<ComponentProps<typeof Button>, 'size'>) {\n return (\n <Button\n variant={variant}\n size=\"sm\"\n className={cn('ml-auto h-7 shrink-0 gap-1.5 pointer-coarse:h-11', className)}\n data-slot=\"import-action\"\n {...props}\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n {children}\n </Button>\n )\n}\n\nexport interface ImportRunActionsProps {\n isRunning: boolean\n isStopping?: boolean\n /** A sync request is in flight. */\n isBusy?: boolean\n importDisabled?: boolean\n importTitle?: string\n onImport: () => void\n onStop: () => void\n onSettings: () => void\n settingsLabel: string\n importButton?: { testId?: string }\n settingsButton?: { testId?: string }\n stopButton?: { testId?: string }\n labels?: Partial<ImportLabels>\n}\n\n/** \"Import now\" + settings gear, or \"Stop\" while a run is active. */\nexport function ImportRunActions({\n isRunning,\n isStopping,\n isBusy,\n importDisabled,\n importTitle,\n onImport,\n onStop,\n onSettings,\n settingsLabel,\n importButton,\n settingsButton,\n stopButton,\n labels,\n}: ImportRunActionsProps) {\n const l = { ...DEFAULT_IMPORT_LABELS, ...labels }\n if (isRunning) {\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"ml-auto h-7 gap-1.5 pointer-coarse:h-11\"\n onClick={onStop}\n disabled={isStopping}\n data-testid={stopButton?.testId}\n >\n <Square className=\"h-3 w-3\" />\n {isStopping ? l.stopping : l.stop}\n </Button>\n )\n }\n return (\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n <Button\n variant=\"default\"\n size=\"sm\"\n className=\"h-7 gap-1.5 pointer-coarse:h-11\"\n onClick={onImport}\n disabled={isBusy || importDisabled}\n data-testid={importButton?.testId}\n title={importTitle}\n >\n {isBusy ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <RefreshCw className=\"h-3.5 w-3.5\" />\n )}\n {l.importNow}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 text-muted-foreground pointer-coarse:h-11\"\n onClick={onSettings}\n disabled={isBusy}\n aria-label={settingsLabel}\n data-testid={settingsButton?.testId}\n >\n <Settings className=\"h-4 w-4\" />\n {l.settings}\n </Button>\n </div>\n )\n}\n\nexport interface ImportSummaryProps {\n /** Left column, under the name. */\n children: ReactNode\n /** Right column (pending count, folders). */\n aside?: ReactNode\n className?: string\n}\n\n/** Two-column detail block under a provider row. */\nexport function ImportSummary({ children, aside, className }: ImportSummaryProps) {\n return (\n <div\n data-slot=\"import-summary\"\n className={cn('mt-2.5 flex items-start justify-between gap-3', className)}\n >\n <div className=\"ml-[34px] text-sm leading-snug text-muted-foreground\">{children}</div>\n {aside}\n </div>\n )\n}\n\n/** Right-aligned muted aside of an `ImportSummary`. */\nexport function ImportAside({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"import-aside\"\n className={cn(\n 'min-w-0 max-w-[55%] text-right text-sm leading-snug text-muted-foreground',\n className\n )}\n {...props}\n />\n )\n}\n\nexport interface ImportProgressProps {\n processed: number\n total?: number | null\n /** Plural noun, e.g. \"emails\". */\n noun: string\n testId?: string\n labels?: Partial<ImportLabels>\n}\n\n/** Live run progress: bar when the total is known, plus a running count. */\nexport function ImportProgress({ processed, total, noun, testId, labels }: ImportProgressProps) {\n const l = { ...DEFAULT_IMPORT_LABELS, ...labels }\n const known = total != null && total > 0\n return (\n <div data-slot=\"import-progress\" className=\"mt-2 space-y-1\" data-testid={testId}>\n {known && (\n <Progress value={Math.min(100, Math.round((processed / total) * 100))} className=\"h-1.5\" />\n )}\n <div className=\"text-right text-sm leading-snug text-muted-foreground\">\n {known ? l.importingOf(processed, total, noun) : l.importing(processed, noun)}\n </div>\n </div>\n )\n}\n\nconst FOLDER_SUMMARY_LIMIT = 3\n\nexport interface FolderSummaryProps {\n /** One entry per selected folder; undefined when its name is not known (counted, never shown). */\n names: (string | undefined)[]\n testId?: string\n labels?: Partial<ImportLabels>\n}\n\n/** The first few synced folder names, then \"+N more\" (all in the tooltip). */\nexport function FolderSummary({ names, testId, labels }: FolderSummaryProps) {\n const l = { ...DEFAULT_IMPORT_LABELS, ...labels }\n const known = names.filter((n): n is string => !!n)\n if (known.length === 0) {\n return <div data-testid={testId}>{l.foldersSelected(names.length)}</div>\n }\n const shown = known.slice(0, FOLDER_SUMMARY_LIMIT)\n const hidden = names.length - shown.length\n return (\n <div className=\"break-words\" title={known.join(', ')} data-testid={testId}>\n {l.folders(shown.join(', '))}\n {hidden > 0 && <span className=\"whitespace-nowrap\">{l.moreFolders(hidden)}</span>}\n </div>\n )\n}\n\nexport type ImportFamilyActionKind = 'connect' | 'reconnect' | 'disconnect'\n\nexport interface ImportFamilySectionProps {\n label: string\n /** Connected account shown next to the label. */\n identity?: string | null\n /** 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 type { ReactNode } from 'react'\nimport { CalendarDays, Loader2 } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the calendar row. Pass a partial `labels` to translate or reword. */\nexport interface CalendarImportLabels {\n title: string\n description: string\n settings: string\n syncNow: string\n}\n\nexport const DEFAULT_CALENDAR_IMPORT_LABELS: CalendarImportLabels = {\n title: 'Calendar',\n description: 'Events become dated notes on this workspace\\u2019s timeline.',\n settings: 'Settings',\n syncNow: 'Sync now',\n}\n\nexport interface CalendarImportTestIds {\n root: string\n settings: string\n syncNow: string\n}\n\nexport interface CalendarImportRowProps {\n isSyncing?: boolean\n onSettings: () => void\n onSyncNow: () => void\n /** Dialogs owned by the host. */\n children?: ReactNode\n labels?: Partial<CalendarImportLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<CalendarImportTestIds>\n}\n\n/** Calendar sync row: what it is, plus Settings and Sync now. */\nexport function CalendarImportRow({\n isSyncing,\n onSettings,\n onSyncNow,\n children,\n labels,\n testIds,\n}: CalendarImportRowProps) {\n const l = { ...DEFAULT_CALENDAR_IMPORT_LABELS, ...labels }\n return (\n <div\n className=\"py-3\"\n data-slot=\"calendar-import\"\n data-testid={testIdOr(testIds?.root, { testId: 'calendar-import-panel' })}\n >\n <div className=\"flex items-center gap-2.5\">\n <CalendarDays className=\"h-7 w-7 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-foreground\">{l.title}</div>\n <div className=\"truncate text-xs text-muted-foreground\">{l.description}</div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"pointer-coarse:h-11\"\n onClick={onSettings}\n data-testid={testIdOr(testIds?.settings, { testId: 'calendar-settings' })}\n >\n {l.settings}\n </Button>\n <Button\n size=\"sm\"\n className=\"pointer-coarse:h-11\"\n onClick={onSyncNow}\n disabled={isSyncing}\n data-testid={testIdOr(testIds?.syncNow, { testId: 'calendar-sync-now' })}\n >\n {isSyncing && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n {l.syncNow}\n </Button>\n </div>\n </div>\n {children}\n </div>\n )\n}\n","import { useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n AlertCircle,\n CheckCircle,\n ChevronRight,\n CircleSlash,\n Hourglass,\n LoaderCircle,\n} from 'lucide-react'\nimport { Badge, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** A distinct glyph + colour per processing status (active spins while busy). */\nconst STATUS_ICONS = {\n active: { Icon: LoaderCircle, color: 'text-blue-text', spin: true },\n queued: { Icon: Hourglass, color: 'text-yellow-text', spin: false },\n failed: { Icon: AlertCircle, color: 'text-red-text', spin: false },\n skipped: { Icon: CircleSlash, color: 'text-muted-foreground', spin: false },\n completed: { Icon: CheckCircle, color: 'text-green-text', spin: false },\n} as const\n\nexport type TaskSectionStatus = keyof typeof STATUS_ICONS\n\nexport interface TaskSectionProps {\n title: string\n count: number\n status: TaskSectionStatus\n /** Explanation of what the status means, shown on the heading tooltip. */\n tooltip?: string\n headerAction?: ReactNode\n defaultExpanded?: boolean\n /** The task list; rendered only while the section has items and is expanded. */\n children?: ReactNode\n testIds?: Partial<{ root: string; toggle: string }>\n}\n\n/**\n * Collapsible processing-status section. Empty sections show a muted, inert heading;\n * only sections with items expand.\n */\nexport function TaskSection({\n title,\n count,\n status,\n tooltip,\n headerAction,\n defaultExpanded = true,\n children,\n testIds,\n}: TaskSectionProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded)\n const hasItems = count > 0\n const { Icon, color, spin } = STATUS_ICONS[status]\n\n const headingInner = (\n <div className=\"flex items-center gap-2\">\n <Icon className={cn('h-4 w-4', color, hasItems ? spin && 'animate-spin' : 'opacity-50')} />\n <span className=\"whitespace-nowrap\">{title}</span>\n <Badge variant=\"outline\" className=\"badge-count ml-2 border-border\">\n {count}\n </Badge>\n </div>\n )\n\n const heading = tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{headingInner}</TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n headingInner\n )\n\n return (\n <div data-slot=\"task-section\" data-testid={testIdOr(testIds?.root, { testId: 'task-section' })}>\n <div className=\"mb-3 flex items-center justify-between\">\n {hasItems ? (\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n aria-expanded={isExpanded}\n className=\"flex cursor-pointer items-center gap-2 text-left font-medium transition-colors hover:text-primary pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.toggle, { testId: 'task-section-toggle' })}\n >\n <ChevronRight\n className={cn('h-4 w-4 transition-transform', isExpanded && 'rotate-90')}\n />\n {heading}\n </button>\n ) : (\n <div className=\"flex items-center gap-2 font-medium text-muted-foreground\">\n <ChevronRight className=\"h-4 w-4 flex-shrink-0\" />\n {heading}\n </div>\n )}\n {headerAction}\n </div>\n {hasItems && isExpanded && children}\n </div>\n )\n}\n","import type { ClipboardEvent, ReactNode } from 'react'\nimport { Loader2, Plus, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n DialogTrigger,\n Input,\n Label,\n cn,\n} from '@arbidocs/react/ui'\nimport { ModalHeader } from '../../settings/ModalScaffold'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the URL dialog. Pass a partial `labels` to translate or reword. */\nexport interface UrlInputDialogLabels {\n title: string\n description: string\n supports: string\n url: (position: number | null) => string\n placeholder: string\n removeUrl: (position: number) => string\n addAnother: string\n adding: string\n addDocuments: string\n mediaPreview: string\n}\n\nexport const DEFAULT_URL_INPUT_DIALOG_LABELS: UrlInputDialogLabels = {\n title: 'Add from the internet',\n description:\n 'Enter one or more URLs to download documents — paste several separated by commas or new lines.',\n supports:\n 'Supports PDF, Word, PowerPoint, Excel, RTF, TXT, MD, HTML, ZIP, and audio/video links (YouTube et al.).',\n url: (position) => (position === null ? 'URL ' : `URL ${position}`),\n placeholder: 'https://example.com/document.pdf or a YouTube / audio / video link',\n removeUrl: (position) => `Remove URL ${position}`,\n addAnother: 'Add Another URL',\n adding: 'Adding…',\n addDocuments: 'Add Documents',\n mediaPreview: 'Media preview',\n}\n\nexport interface UrlInputDialogTestIds {\n modal: string\n submitError: string\n submit: string\n}\n\nexport interface UrlInputDialogViewProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Trigger element (rendered `asChild`); omit for a controlled dialog opened elsewhere. */\n trigger?: ReactNode\n /** Title content; defaults to `labels.title`. */\n title?: ReactNode\n urls: string[]\n /** Per-field error text ('' when valid). */\n errors: string[]\n onUrlChange: (index: number, value: string) => void\n onUrlPaste: (index: number, text: string) => void\n onAddUrl: () => void\n onRemoveUrl: (index: number) => void\n /** Rendered under a field, e.g. a media preview. */\n renderPreview?: (url: string, index: number) => ReactNode\n submitError?: string | null\n isSubmitting?: boolean\n onSubmit: () => void\n labels?: Partial<UrlInputDialogLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<UrlInputDialogTestIds>\n}\n\n/** \"Add from the internet\" dialog: one or more URL fields, inline errors, submit. */\nexport function UrlInputDialogView({\n open,\n onOpenChange,\n trigger,\n title,\n urls,\n errors,\n onUrlChange,\n onUrlPaste,\n onAddUrl,\n onRemoveUrl,\n renderPreview,\n submitError,\n isSubmitting,\n onSubmit,\n labels,\n testIds,\n}: UrlInputDialogViewProps) {\n const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels }\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n {trigger !== undefined && <DialogTrigger asChild>{trigger}</DialogTrigger>}\n <DialogContent\n presentation=\"sheet\"\n className=\"flex flex-col gap-0 overflow-hidden p-0 sm:max-w-[525px]\"\n data-testid={testIdOr(testIds?.modal, { testId: 'upload-modal-internet' })}\n >\n <ModalHeader>\n <DialogTitle>{title ?? l.title}</DialogTitle>\n </ModalHeader>\n <div className=\"px-6 pb-6\">\n <DialogDescription className=\"pt-4 text-sm text-muted-foreground\">\n {l.description}\n <span className=\"mt-1 block text-xs\">{l.supports}</span>\n </DialogDescription>\n <div className=\"grid gap-4 py-4\">\n {urls.map((url, index) => (\n <div key={index} className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Label htmlFor={`url-${index}`} className=\"text-sm\">\n {l.url(urls.length > 1 ? index + 1 : null)}\n </Label>\n <Input\n id={`url-${index}`}\n type=\"text\"\n placeholder={l.placeholder}\n value={url}\n onChange={(e) => onUrlChange(index, e.target.value)}\n onPaste={(e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n onUrlPaste(index, e.clipboardData.getData('text'))\n }}\n className={cn(errors[index] && 'border-red-border')}\n />\n {errors[index] && <p className=\"mt-1 text-sm text-red-text\">{errors[index]}</p>}\n </div>\n {urls.length > 1 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => onRemoveUrl(index)}\n className=\"mt-6\"\n aria-label={l.removeUrl(index + 1)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n {renderPreview?.(url, index)}\n </div>\n ))}\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onAddUrl} className=\"w-full\">\n <Plus className=\"mr-2 h-4 w-4\" />\n {l.addAnother}\n </Button>\n </div>\n {submitError && (\n <p\n className=\"text-sm text-red-text\"\n data-testid={testIdOr(testIds?.submitError, { testId: 'url-submit-error' })}\n >\n {submitError}\n </p>\n )}\n <div className=\"flex flex-col-reverse sm:flex-row sm:justify-end gap-2\">\n <Button\n onClick={onSubmit}\n disabled={isSubmitting}\n data-testid={testIdOr(testIds?.submit, { testId: 'url-submit-button' })}\n >\n {isSubmitting ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n {l.adding}\n </>\n ) : (\n l.addDocuments\n )}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface UrlDialogTitleProps {\n /** Workspace mark, e.g. its icon. */\n icon?: ReactNode\n workspaceName: string\n /** Wins over the default \"Add from the internet\". */\n labels?: Partial<UrlInputDialogLabels>\n}\n\n/** \"<workspace> / Add from the internet\" title. */\nexport function UrlDialogTitle({ icon, workspaceName, labels }: UrlDialogTitleProps) {\n const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels }\n return (\n <div className={cn('flex min-w-0 items-center', icon ? 'gap-3' : 'gap-2')}>\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\n <span className=\"min-w-0 truncate\" title={workspaceName}>\n {workspaceName}\n </span>\n <span className=\"flex-shrink-0 text-muted-foreground\">/</span>\n <span className=\"flex-shrink-0\">{l.title}</span>\n </div>\n )\n}\n\nexport interface MediaPreviewViewProps {\n kind: 'youtube' | 'video' | 'audio'\n /** Embed URL for youtube, media src otherwise. */\n src: string\n testId?: string\n labels?: Partial<UrlInputDialogLabels>\n}\n\n/** Inline media preview under a URL field. */\nexport function MediaPreviewView({ kind, src, testId, labels }: MediaPreviewViewProps) {\n const l = { ...DEFAULT_URL_INPUT_DIALOG_LABELS, ...labels }\n return (\n <div className=\"mt-2 overflow-hidden rounded-md border\" data-testid={testId}>\n {kind === 'youtube' && (\n <iframe\n className=\"aspect-video w-full\"\n src={src}\n title={l.mediaPreview}\n allow=\"accelerometer; encrypted-media; picture-in-picture\"\n allowFullScreen\n />\n )}\n {kind === 'video' && (\n <video className=\"max-h-56 w-full bg-black\" src={src} controls preload=\"metadata\" />\n )}\n {kind === 'audio' && <audio className=\"w-full p-2\" src={src} controls preload=\"metadata\" />}\n </div>\n )\n}\n","/**\n * VendorLogo\n *\n * Brand marks for mailbox and document connectors (Gmail, Outlook, OneDrive,\n * Google Drive, SharePoint, Box, Dropbox, OneNote, Clio) rendered as inline SVG so\n * they read as the real products rather than a generic glyph. Falls back to a plain\n * mail icon for any other vendor. Used by the Import-from-emails shortcut and the\n * connector provider rows.\n */\n\nimport { Mail } from 'lucide-react'\n\nfunction GmailMark({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 256 193\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"#4285F4\"\n d=\"M58.182 192.05V93.14L27.507 65.077 0 49.504v125.091c0 9.658 7.825 17.455 17.455 17.455z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M197.818 192.05h40.727c9.659 0 17.455-7.826 17.455-17.455V49.505l-31.156 17.837-27.026 25.798z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"m58.182 93.14-4.174-38.647 4.174-36.989L128 69.868l69.818-52.364 4.669 34.992-4.669 40.644L128 145.504z\"\n />\n <path\n fill=\"#FBBC04\"\n d=\"M197.818 17.504V93.14L256 49.504V26.231c0-21.585-24.64-33.89-41.89-20.945z\"\n />\n <path\n fill=\"#C5221F\"\n d=\"M0 49.504 26.759 69.574 58.182 93.14V17.504L41.89 5.286C24.61-7.66 0 4.646 0 26.231z\"\n />\n </svg>\n )\n}\n\nfunction OutlookMark({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n {/* Right envelope panel */}\n <path fill=\"#0F6CBD\" d=\"M44 13H24v22h18.5A1.5 1.5 0 0 0 44 33.5z\" />\n <path fill=\"#28A8EA\" d=\"M24 15.5 44 13v3L24 27z\" />\n {/* Left blue tile with the Outlook \"O\" */}\n <rect x=\"4\" y=\"9\" width=\"21\" height=\"30\" rx=\"2.5\" fill=\"#0364B8\" />\n <ellipse cx=\"14.5\" cy=\"24\" rx=\"6.2\" ry=\"7\" fill=\"none\" stroke=\"#fff\" strokeWidth=\"3.1\" />\n </svg>\n )\n}\n\nfunction OneDriveMark({ className }: { className?: string }) {\n // Authentic Microsoft OneDrive brand mark — the layered four-tone blue cloud.\n return (\n <svg viewBox=\"0 0 256 165\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"#0364B8\"\n d=\"M154.66056 110.681557 207.502052 60.1479482C196.525811 17.3487078 152.932256-8.44908883 110.132767 2.52715287 90.8589801 7.46999082 74.1187452 19.4179992 63.179535 36.0386895 63.9974594 36.0180612 154.66056 110.681557 154.66056 110.681557Z\"\n />\n <path\n fill=\"#0078D4\"\n d=\"M97.6181022 45.5520619 97.6156169 45.5607606C87.5186874 39.307156 75.8741386 36.001658 63.9972108 36.0177537 63.7228296 36.0177537 63.4531706 36.03521 63.1792865 36.0384409 27.8517142 36.4761088-.432413365 65.4695515.00500592252 100.797124.163570414 113.612018 4.16769663 126.083687 11.4981977 136.595916L90.6631356 126.680913 151.357298 77.7409022 97.6181022 45.5520619Z\"\n />\n <path\n fill=\"#1490DF\"\n d=\"M207.502052 60.1481967C206.340406 60.0706542 205.173043 60.016946 203.992011 60.016946 196.903085 60.010012 189.887973 61.4579693 183.381112 64.271122L183.379621 64.2656543 151.357547 77.7411507 186.65952 121.347877 249.770673 136.689364C263.390071 111.405536 253.93411 79.8683506 228.650281 66.2489531 222.117076 62.7297161 214.906119 60.6497377 207.502301 60.1484453L207.502301 60.1481967 207.502052 60.1481967Z\"\n />\n <path\n fill=\"#28A8EA\"\n d=\"M11.4981977 136.595916C23.4514253 153.781772 43.063467 164.023845 63.9974594 164.012918L203.991762 164.012918C223.115435 164.018377 240.697951 153.524291 249.770425 136.689862L151.357298 77.7409022 11.4981977 136.595916Z\"\n />\n </svg>\n )\n}\n\nfunction SharePointMark({ className }: { className?: string }) {\n // Simplified SharePoint glyph — overlapping teal circles composition\n // matching Microsoft's SharePoint brand colours (#036C70 primary, #1A9BA1 accent).\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"22\" cy=\"22\" r=\"20\" fill=\"#036C70\" />\n <circle cx=\"16\" cy=\"20\" r=\"12\" fill=\"#1A9BA1\" />\n <circle cx=\"26\" cy=\"30\" r=\"10\" fill=\"#37C6D0\" />\n <circle cx=\"33\" cy=\"22\" r=\"8\" fill=\"#fff\" opacity=\"0.15\" />\n </svg>\n )\n}\n\nfunction GoogleDriveMark({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 87.3 78\" className={className} aria-hidden=\"true\" focusable=\"false\">\n {/* Google Drive triangle — the three brand colours */}\n <path\n fill=\"#0066da\"\n d=\"M6.6 66.85l3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8H0c0 1.55.4 3.1 1.2 4.5z\"\n />\n <path\n fill=\"#00ac47\"\n d=\"M43.65 25L29.9 1.2c-1.35.8-2.5 1.9-3.3 3.3L1.2 48.5A9.06 9.06 0 0 0 0 53h27.5z\"\n />\n <path\n fill=\"#ea4335\"\n d=\"M73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75L86.1 57.4c.8-1.4 1.2-2.95 1.2-4.5H59.798l5.85 11.5z\"\n />\n <path\n fill=\"#00832d\"\n d=\"M43.65 25L57.4 1.2C56.05.4 54.5 0 52.9 0H34.4c-1.6 0-3.15.45-4.5 1.2z\"\n />\n <path\n fill=\"#2684fc\"\n d=\"M59.8 53H27.5L13.75 76.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n />\n <path\n fill=\"#ffba00\"\n d=\"M73.4 26.5L60.65 4.5c-.8-1.4-1.95-2.5-3.3-3.3L43.65 25l16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n />\n </svg>\n )\n}\n\nfunction BoxMark({ className }: { className?: string }) {\n // Box brand mark — the Box blue (#0061D5) tile with a simple isometric cube.\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#0061D5\" />\n <path\n fill=\"none\"\n stroke=\"#fff\"\n strokeWidth=\"2.5\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n d=\"M24 13 36 19 36 29 24 35 12 29 12 19Z\"\n />\n <path\n fill=\"none\"\n stroke=\"#fff\"\n strokeWidth=\"2.5\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n d=\"M12 19 24 25 36 19 M24 25 24 35\"\n />\n </svg>\n )\n}\n\nfunction DropboxMark({ className }: { className?: string }) {\n // Dropbox's mark is its own logo shape rather than a tile: four parallelograms\n // meeting at a point, in Dropbox blue (#0061FF).\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <g fill=\"#0061FF\">\n <path d=\"M12 6 0 14l12 8 12-8z\" />\n <path d=\"M36 6 24 14l12 8 12-8z\" />\n <path d=\"M0 30l12 8 12-8-12-8z\" />\n <path d=\"M36 22 24 30l12 8 12-8z\" />\n <path d=\"M12 40.5 24 33l12 7.5L24 48z\" />\n </g>\n </svg>\n )\n}\n\nfunction OneNoteMark({ className }: { className?: string }) {\n // OneNote purple (#7719AA), matching the OneDrive/SharePoint tile treatment.\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#7719AA\" />\n <rect x=\"10\" y=\"10\" width=\"21\" height=\"28\" rx=\"2.5\" fill=\"#fff\" opacity=\"0.95\" />\n <rect x=\"31\" y=\"15\" width=\"7\" height=\"5\" rx=\"1.5\" fill=\"#fff\" opacity=\"0.6\" />\n <rect x=\"31\" y=\"22\" width=\"7\" height=\"5\" rx=\"1.5\" fill=\"#fff\" opacity=\"0.6\" />\n <rect x=\"31\" y=\"29\" width=\"7\" height=\"5\" rx=\"1.5\" fill=\"#fff\" opacity=\"0.6\" />\n </svg>\n )\n}\n\nfunction ClioMark({ className }: { className?: string }) {\n // Clio's brand blue (#00263E) with the rounded \"c\" counter of its wordmark.\n return (\n <svg viewBox=\"0 0 48 48\" className={className} aria-hidden=\"true\" focusable=\"false\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#00263E\" />\n <path\n fill=\"none\"\n stroke=\"#4FC3F7\"\n strokeWidth=\"4.5\"\n strokeLinecap=\"round\"\n d=\"M32 17a10 10 0 1 0 0 14\"\n />\n </svg>\n )\n}\n\nexport function VendorLogo({\n vendorKey,\n className = 'h-4 w-4',\n product,\n}: {\n vendorKey: string\n className?: string\n /** Pick a specific product mark when a vendor spans several (e.g. Microsoft → OneDrive). */\n product?: 'onedrive' | 'googledrive' | 'sharepoint' | 'box' | 'dropbox' | 'onenote' | 'clio'\n}) {\n if (product === 'onedrive') return <OneDriveMark className={className} />\n if (product === 'googledrive') return <GoogleDriveMark className={className} />\n if (product === 'sharepoint') return <SharePointMark className={className} />\n if (product === 'box') return <BoxMark className={className} />\n if (product === 'dropbox') return <DropboxMark className={className} />\n if (product === 'onenote') return <OneNoteMark className={className} />\n if (product === 'clio') return <ClioMark className={className} />\n if (vendorKey === 'gmail') return <GmailMark className={className} />\n if (vendorKey === 'microsoft') return <OutlookMark className={className} />\n if (vendorKey === 'microsoft_sharepoint') return <SharePointMark className={className} />\n if (vendorKey === 'box') return <BoxMark className={className} />\n if (vendorKey === 'dropbox') return <DropboxMark className={className} />\n if (vendorKey === 'onenote') return <OneNoteMark className={className} />\n if (vendorKey === 'clio') return <ClioMark className={className} />\n return <Mail className={`${className} text-muted-foreground`} aria-hidden=\"true\" />\n}\n","import type { ReactNode } from 'react'\nimport { FolderOpen } from 'lucide-react'\nimport { Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\n\nexport interface FolderCellProps {\n /** Stored folder path; empty/null renders an em dash. */\n folder: string | null | undefined\n /** Breadcrumb segments, already formatted for display (provider roots shortened). */\n segments: string[]\n /** Leading glyph for connector folders (brand mark); falls back to a folder icon. */\n icon?: ReactNode\n /** Editable cells open `picker` in a popover on click. */\n isEditable: boolean\n /** Popover body (the searchable folder list); only rendered for editable cells. */\n picker?: ReactNode\n className?: string\n}\n\n/** Breadcrumb \"a / b / c\" where all but the last segment are muted. */\nexport function FolderBreadcrumb({\n segments,\n size = 'xs',\n}: {\n segments: string[]\n /** Text size of the segments: `xs` in grid cells, `sm` in form fields. */\n size?: 'xs' | 'sm'\n}) {\n const text = size === 'sm' ? 'text-sm' : 'text-xs'\n return (\n <span data-slot=\"folder-breadcrumb\" className=\"min-w-0 truncate\">\n {segments.map((part, i, arr) => (\n <span key={i} className=\"inline-flex items-center gap-0.5\">\n {i > 0 && <span className={`mx-0.5 ${text} text-muted-foreground/50`}>/</span>}\n <span className={i < arr.length - 1 ? `${text} text-muted-foreground` : ''}>{part}</span>\n </span>\n ))}\n </span>\n )\n}\n\n/**\n * Grid cell for a document's folder. Uses the native `title` attribute instead of a Tooltip:\n * every visible row renders one, so Radix tooltip instances would sit in the scroll hot path.\n */\nexport function FolderCell({\n folder,\n segments,\n icon,\n isEditable,\n picker,\n className,\n}: FolderCellProps) {\n const display = folder ? (\n <>\n {icon ?? <FolderOpen className=\"h-3.5 w-3.5 flex-none shrink-0 text-muted-foreground\" />}\n <FolderBreadcrumb segments={segments} />\n </>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )\n const title = folder || undefined\n\n if (!isEditable) {\n return (\n <div\n data-slot=\"folder-cell\"\n title={title}\n className={cn('flex h-full w-full min-w-0 items-center gap-1.5 text-sm', className)}\n >\n {display}\n </div>\n )\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"folder-cell\"\n title={title}\n className={cn(\n 'flex h-full w-full min-w-0 cursor-pointer items-center gap-1.5 text-left text-sm hover:text-primary',\n className\n )}\n >\n {display}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-[220px] max-w-[min(640px,92vw)] p-0\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n >\n {picker}\n </PopoverContent>\n </Popover>\n )\n}\n","import { useState } from 'react'\nimport type { ComponentType, ReactNode } from 'react'\nimport {\n ArrowRightLeft,\n Blend,\n CopyX,\n CornerDownRight,\n CornerRightDown,\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 parent?: T | null\n /** Attachments. */\n attachments: T[]\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 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 dupeCount = duplicates.length\n const simCount = similar.length\n\n if (!parent && attachmentCount === 0 && dupeCount === 0 && simCount === 0) 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\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\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 {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 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 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 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 {canEdit && (\n <DropdownMenuItem onSelect={onMove}>\n <FolderInput className=\"mr-2 h-4 w-4\" />\n Move to…\n </DropdownMenuItem>\n )}\n {canEdit && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={onDelete}\n className=\"text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport interface DocumentNameCellFrameProps {\n /** Test id on the wrapper, e.g. `open-document-viewer-button-<id>`. */\n testId?: string\n /** The row's document is open in the viewer: marks the cell so the host's row style can react. */\n isViewing?: boolean\n /** Phone-only second line (date and folder) under the title. */\n subtitle?: string\n /** Slot: the document pill (entity chip with `actions` = a DocumentRowMenu). */\n children: ReactNode\n className?: string\n}\n\n/**\n * Layout of the grid's unified \"document\" cell: the pill plus, on phones where the table\n * collapses to Title + Status, a muted second line.\n */\nexport function DocumentNameCellFrame({\n testId,\n isViewing,\n subtitle,\n children,\n className,\n}: DocumentNameCellFrameProps) {\n return (\n <div\n data-slot=\"document-name-cell\"\n data-testid={testId}\n data-viewing={isViewing || undefined}\n className={cn('flex h-full w-full flex-col justify-center', className)}\n >\n {children}\n <div className=\"hidden min-w-0 truncate pl-[27px] text-xs text-muted-foreground max-[480px]:block\">\n {subtitle}\n </div>\n </div>\n )\n}\n","import { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, Minus, PencilLine } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\nimport { CellHoverIcon } from './HoverIconCell'\n\n/** Chip row metrics (px): a chip is 24px tall with a 4px gap, as in the Facts labels cell. */\nconst CHIP_ROW_H = 24\nconst CHIP_GAP = 4\n\n/** Max height of the chip container: whole chip rows that fit `rowHeight`, never half a row. */\nexport function labelChipClampHeight(rowHeight: number): number {\n const rows = Math.max(1, Math.floor((rowHeight + CHIP_GAP) / (CHIP_ROW_H + CHIP_GAP)))\n return CHIP_ROW_H * rows + CHIP_GAP * (rows - 1)\n}\n\n/** One label a document can carry. `color` is any CSS colour (the host derives it from the id). */\nexport interface LabelOption {\n id: string\n name: string\n color: string\n}\n\n/** Every fixed string of the label picker. */\nexport interface LabelMultiSelectLabels {\n searchPlaceholder: string\n noLabels: string\n create: (name: string) => string\n editLabel: string\n}\n\nexport const DEFAULT_LABEL_MULTI_SELECT_LABELS: LabelMultiSelectLabels = {\n searchPlaceholder: 'Search or create...',\n noLabels: 'No labels yet',\n create: (name) => `Create “${name}”`,\n editLabel: 'Edit field',\n}\n\nexport interface LabelMultiSelectViewProps {\n options: LabelOption[]\n /** Ids of the labels applied to the row. */\n appliedIds: ReadonlySet<string>\n onToggle: (id: string) => void\n /** Create a label named `name` and apply it (the host decides what a non-member may do). */\n onCreate: (name: string) => void\n /** Opens the label editor; omit to hide the per-option edit button. */\n onEditLabels?: () => void\n /** The grid row height: clamps the chips to the rows that fully fit, with an ellipsis. */\n rowHeight?: number\n labels?: Partial<LabelMultiSelectLabels>\n}\n\nconst CHECK_BOX = 'flex shrink-0 items-center justify-center rounded border-2'\n\nexport interface LabelPickerListProps {\n options: LabelOption[]\n appliedIds: ReadonlySet<string>\n mixedIds?: ReadonlySet<string>\n onToggle: (id: string) => void\n /** Create a label named `name`; omit to hide \"Create ...\" (the picker only toggles). */\n onCreate?: (name: string) => void\n /** Opens the label editor; omit to hide the per-option edit button. */\n onEditLabels?: () => void\n labels?: Partial<LabelMultiSelectLabels>\n}\n\n/**\n * Searchable list of labels with check boxes: type to filter, Enter (or the \"Create ...\" row)\n * creates a label that does not exist yet. Used by the grid cell and the document form field.\n */\nexport function LabelPickerList({\n options,\n appliedIds,\n mixedIds,\n onToggle,\n onCreate,\n onEditLabels,\n labels,\n}: LabelPickerListProps) {\n const l = useMemo(() => ({ ...DEFAULT_LABEL_MULTI_SELECT_LABELS, ...labels }), [labels])\n const [search, setSearch] = useState('')\n const trimmed = search.trim()\n const matchesExisting = options.some((o) => o.name.toLowerCase() === trimmed.toLowerCase())\n\n const create = () => {\n onCreate?.(trimmed)\n setSearch('')\n }\n\n return (\n <Command shouldFilter>\n <CommandInput\n placeholder={l.searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && onCreate && trimmed && !matchesExisting) {\n e.preventDefault()\n create()\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {trimmed && onCreate ? (\n <button\n type=\"button\"\n onClick={create}\n onPointerDown={(e) => e.preventDefault()}\n className=\"w-full cursor-pointer rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n {l.create(trimmed)}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.noLabels}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {options.map((o) => {\n const isApplied = appliedIds.has(o.id)\n const isMixed = mixedIds?.has(o.id)\n return (\n <CommandItem\n key={o.id}\n value={o.name}\n onSelect={() => onToggle(o.id)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"group/label cursor-pointer\"\n data-testid={`label-select-${o.id}`}\n >\n <span\n className={`mr-2 size-4 ${CHECK_BOX} ${isApplied ? '' : 'bg-background'}`}\n style={{\n borderColor: o.color,\n backgroundColor: isApplied ? o.color : undefined,\n }}\n >\n {isApplied && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n {isMixed && <Minus className=\"size-3\" style={{ color: o.color }} />}\n </span>\n <span className=\"flex-1 text-sm\">{o.name}</span>\n {onEditLabels && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onEditLabels()\n }}\n onPointerDown={(e) => e.preventDefault()}\n className=\"shrink-0 rounded p-0.5 opacity-0 hover:bg-muted focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover/label:opacity-100 group-data-[selected=true]/label:opacity-100 pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center pointer-coarse:opacity-100\"\n title={l.editLabel}\n aria-label={l.editLabel}\n >\n <PencilLine className=\"size-3 text-muted-foreground\" />\n </button>\n )}\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n )\n}\n\n/**\n * Labels column cell: applied labels as bordered chips; click (or Enter) opens a popover to\n * toggle labels or type a new name and press Enter to create it. Empty cells show a pencil on\n * hover, keyboard focus and touch.\n */\nexport const LabelMultiSelectView = memo(function LabelMultiSelectView({\n options,\n appliedIds,\n onToggle,\n onCreate,\n onEditLabels,\n rowHeight = 52,\n labels,\n}: LabelMultiSelectViewProps) {\n const [open, setOpen] = useState(false)\n\n const applied = options.filter((o) => appliedIds.has(o.id))\n const maxHeight = labelChipClampHeight(rowHeight)\n const chipsRef = useRef<HTMLDivElement>(null)\n const [hasOverflow, setHasOverflow] = useState(false)\n useEffect(() => {\n const el = chipsRef.current\n if (!el) return\n const measure = () => setHasOverflow(el.scrollHeight > el.clientHeight + 1)\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(el)\n return () => ro.disconnect()\n }, [appliedIds, maxHeight, options])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"label-multi-select\"\n // No vertical clip/padding: at the minimum row height an `overflow-hidden` button would\n // crop the pills. The chip container is clamped to whole chip rows instead.\n className=\"group relative flex h-full w-full min-w-0 cursor-pointer items-center gap-1 pr-4 text-left hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n >\n {applied.length === 0 ? (\n <span className=\"flex-1\">\n <CellHoverIcon />\n </span>\n ) : (\n <>\n <div\n ref={chipsRef}\n className=\"flex min-w-0 flex-1 flex-wrap content-start gap-1 overflow-hidden\"\n style={{ maxHeight }}\n data-testid=\"label-multi-select-chips\"\n >\n {applied.map((o) => (\n <span\n key={o.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium\"\n title={o.name}\n style={{ borderColor: o.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: o.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[80px] truncate\">{o.name}</span>\n </span>\n ))}\n </div>\n {hasOverflow && (\n <span\n className=\"pointer-events-none absolute bottom-0.5 right-0.5 text-xs font-semibold leading-none text-muted-foreground\"\n aria-hidden\n data-testid=\"label-multi-select-overflow\"\n >\n …\n </span>\n )}\n </>\n )}\n </button>\n </PopoverTrigger>\n {open && (\n <PopoverContent className=\"w-[360px] p-0\" align=\"start\" side=\"bottom\" sideOffset={4}>\n <LabelPickerList\n options={options}\n appliedIds={appliedIds}\n onToggle={onToggle}\n onCreate={onCreate}\n onEditLabels={onEditLabels}\n labels={labels}\n />\n </PopoverContent>\n )}\n </Popover>\n )\n})\n","import { memo, type ReactNode } from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface CheckboxCellProps {\n isChecked: boolean\n /** Any CSS colour: the tag's colour. */\n color: string\n isEditable: boolean\n /** Tooltip / accessible name, e.g. `Add \"Urgent\" tag`. */\n title: string\n onToggle: () => void\n}\n\n/** Checkbox-tag cell: a coloured box that toggles on click; inert for non-members. */\nexport const CheckboxCell = memo(function CheckboxCell({\n isChecked,\n color,\n isEditable,\n title,\n onToggle,\n}: CheckboxCellProps) {\n return (\n <button\n type=\"button\"\n data-slot=\"checkbox-cell\"\n aria-pressed={isChecked}\n onClick={(e) => {\n e.stopPropagation()\n if (isEditable) onToggle()\n }}\n disabled={!isEditable}\n title={title}\n aria-label={title}\n className=\"inline-flex items-center justify-center rounded-md p-0.5 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n >\n <span\n className={cn(\n 'flex size-4 shrink-0 items-center justify-center rounded border-2 transition-colors',\n !isChecked && 'bg-background'\n )}\n style={{ borderColor: color, backgroundColor: isChecked ? color : undefined }}\n >\n {isChecked && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n </span>\n </button>\n )\n})\n\nexport interface TagColumnHeaderProps {\n /** The column's filter button (host-supplied: it is grid-specific). */\n filter: ReactNode\n /** The tag's name pill. */\n label: ReactNode\n /** Current sort direction; null/undefined when unsorted. */\n sort?: 'asc' | 'desc' | null\n isCentered?: boolean\n /** Sort on click; `additive` is true with Shift (multi-sort). */\n onSort?: (additive: boolean) => void\n}\n\n/**\n * Header of a tag column: filter button on the LEFT of the name, sort indicator after it.\n * The filter carries AG Grid's `.ag-header-icon` class (grid theme `order: 1`), so the label and\n * indicator pin `order-2`.\n */\nexport const TagColumnHeader = memo(function TagColumnHeader({\n filter,\n label,\n sort,\n isCentered,\n onSort,\n}: TagColumnHeaderProps) {\n return (\n <div\n data-slot=\"tag-column-header\"\n className={cn(\n 'flex h-full w-full items-center gap-2 px-2',\n onSort && 'cursor-pointer',\n isCentered && 'justify-center'\n )}\n onClick={(e) => onSort?.(e.shiftKey)}\n >\n {filter}\n <div className=\"order-2 min-w-0 flex-1\">{label}</div>\n {sort && (\n <span className=\"ag-sort-indicator-icon order-2 shrink-0\">\n <span className={`ag-icon ${sort === 'asc' ? 'ag-icon-asc' : 'ag-icon-desc'}`} />\n </span>\n )}\n </div>\n )\n})\n","import { SquareCheckBig } from 'lucide-react'\nimport { Button, Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\nimport { LabelPickerList, type LabelOption } from './LabelMultiSelect'\n\n/** Shared bulk label control: mixed labels apply to all; checked labels remove from all. */\nexport function BulkLabelSelectView({\n options,\n appliedIds,\n mixedIds,\n onToggle,\n onCreate,\n disabled,\n isCompact,\n}: {\n options: LabelOption[]\n appliedIds: ReadonlySet<string>\n mixedIds?: ReadonlySet<string>\n onToggle: (id: string) => void\n onCreate?: (name: string) => void\n disabled?: boolean\n isCompact?: boolean\n}) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={disabled}\n className=\"h-7 gap-1.5 px-2 text-yellow-text hover:text-yellow-text hover:bg-yellow-bg border-yellow-border\"\n data-testid=\"bulk-label-button\"\n aria-label=\"Labels\"\n >\n <SquareCheckBig className=\"size-4\" />\n {!isCompact && <span>Labels</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[220px] p-0\" align=\"start\" side=\"top\" sideOffset={4}>\n <LabelPickerList\n options={options}\n appliedIds={appliedIds}\n mixedIds={mixedIds}\n onToggle={onToggle}\n onCreate={onCreate}\n />\n </PopoverContent>\n </Popover>\n )\n}\n","import {\n ArrowDownToLine,\n ArrowRightFromLine,\n FolderInput,\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 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 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 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 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 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 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 <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 { ReactNode } from 'react'\nimport { ChevronDown, FolderOpen, FolderPlus } from 'lucide-react'\nimport { Button, Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\nimport { FolderPickerRow } from '../FolderPicker'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the folder filter. Pass a partial `labels` to translate or reword. */\nexport interface FolderFilterLabels {\n all: string\n newFolder: string\n}\n\nexport const DEFAULT_FOLDER_FILTER_LABELS: FolderFilterLabels = {\n all: 'All',\n newFolder: 'New folder',\n}\n\nexport interface FolderFilterButtonProps {\n /** Text of the active folder (\"All\", \"None\", or the display path). */\n label: string\n /** Leading glyph for connector folders; falls back to a folder icon. */\n icon?: ReactNode\n /** A folder filter is active: the trigger takes the selection tint. */\n isActive: boolean\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Total documents, shown on the \"All\" row. */\n allCount?: number\n /** When set, the popover starts with an \"All\" row; omit it for lists that have no \"All\". */\n onSelectAll?: () => void\n /** When set, the popover offers a \"New folder\" action. */\n onNewFolder?: () => void\n /** Slot: the folder tree picker. */\n children: ReactNode\n className?: string\n labels?: Partial<FolderFilterLabels>\n /** Test id of the trigger button (none by default). */\n testId?: string\n /** Overrides the \"New folder\" test id (default `explorer-new-folder`). */\n newFolderTestId?: string\n}\n\n/**\n * The folder filter control: a ghost button naming the active folder that opens a popover with\n * an \"All\" row, the folder tree (slot) and an optional \"New folder\" action.\n */\nexport function FolderFilterButton({\n label,\n icon,\n isActive,\n open,\n onOpenChange,\n allCount,\n onSelectAll,\n onNewFolder,\n children,\n className,\n labels,\n testId,\n newFolderTestId,\n}: FolderFilterButtonProps) {\n const l = { ...DEFAULT_FOLDER_FILTER_LABELS, ...labels }\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n data-slot=\"folder-filter-button\"\n data-testid={testId}\n className={cn(\n 'h-7 shrink-0 gap-1.5 px-2 text-sm font-normal pointer-coarse:h-10',\n isActive && 'bg-accent font-medium text-accent-foreground',\n className\n )}\n >\n {icon ?? (\n <FolderOpen\n className={cn(\n 'h-3.5 w-3.5 shrink-0 text-muted-foreground',\n isActive && 'fill-muted-foreground/30'\n )}\n />\n )}\n <span className=\"max-w-[280px] truncate\">{label}</span>\n <ChevronDown className=\"h-4 w-4 text-foreground\" strokeWidth={2.5} />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-56 max-w-[480px] p-1 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n >\n {onSelectAll && (\n <>\n <FolderPickerRow\n label={l.all}\n count={allCount}\n depth={0}\n isActive={!isActive}\n onClick={onSelectAll}\n />\n <div className=\"my-1 border-t border-border\" />\n </>\n )}\n {children}\n {onNewFolder && (\n <>\n <div className=\"my-1 border-t border-border\" />\n <button\n type=\"button\"\n onClick={onNewFolder}\n data-testid={testIdOr(newFolderTestId, { testId: 'explorer-new-folder' })}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground pointer-coarse:min-h-11\"\n >\n <FolderPlus className=\"h-3.5 w-3.5\" />\n {l.newFolder}\n </button>\n </>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","import type { 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","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}\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}\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}\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\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 note = row.cells[0]?.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 <Loader2 className=\"size-3.5 animate-spin text-muted-foreground\" />\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 <Loader2 className=\"size-3.5 animate-spin text-muted-foreground\" />\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 type { ReactNode } from 'react'\nimport {\n AlertTriangle,\n CheckCircle,\n FileX,\n Hourglass,\n Loader2,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\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 /** The `failed` glyph is stage-aware and host-supplied. */\n failed?: ReactNode\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({ status, onClick, failed, className }: DocStatusIconProps) {\n if (!status) return null\n const key = status.toLowerCase()\n if (key === 'failed') return <>{failed}</>\n const entry = STATUS[key]\n if (!entry) return null\n const { Icon } = entry\n const glyph = (\n <Icon className={cn('size-3', entry.tone, entry.spin && 'animate-spin', className)} />\n )\n if (!onClick) {\n return (\n <span title={entry.title} data-slot=\"doc-status-icon\" data-status={key}>\n {glyph}\n </span>\n )\n }\n return (\n <button\n type=\"button\"\n title={entry.title}\n aria-label={entry.title}\n data-slot=\"doc-status-icon\"\n data-status={key}\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n className=\"cursor-pointer rounded hover:opacity-80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {glyph}\n </button>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { Check, ChevronsUpDown, FolderOpen } from 'lucide-react'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { FolderBreadcrumb } from './cells/FolderCell'\nimport {\n LabelPickerList,\n DEFAULT_LABEL_MULTI_SELECT_LABELS,\n type LabelMultiSelectLabels,\n type LabelOption,\n} from './cells/LabelMultiSelect'\n\n/**\n * Parts of the document \"card\" form (one labelled field per column): read-only values, the folder\n * and label pickers, a native select and the hover attribution of who last changed a value.\n */\n\nconst FIELD_SURFACE =\n 'rounded-md border border-input bg-muted/40 text-sm transition-colors hover:bg-background'\n\nexport interface FieldValueProps {\n tone?: 'default' | 'strong' | 'muted'\n isMono?: boolean\n isTruncated?: boolean\n children: ReactNode\n}\n\n/** A read-only value of a field. */\nexport function FieldValue({ tone = 'default', isMono, isTruncated, children }: FieldValueProps) {\n return (\n <span\n data-slot=\"field-value\"\n className={cn(\n 'text-sm',\n tone === 'strong' && 'font-semibold',\n tone === 'muted' && 'text-muted-foreground',\n isMono && 'font-mono',\n isTruncated && 'truncate'\n )}\n >\n {children}\n </span>\n )\n}\n\nexport interface FieldFolderSelectProps {\n /** Current folder path, if any. */\n folder: string | null | undefined\n /** Searchable folder list (host-bound `FolderCommandList`). */\n picker: ReactNode\n}\n\n/** Folder field: a trigger showing the breadcrumb, opening the folder picker in a popover. */\nexport function FieldFolderSelect({ folder, picker }: FieldFolderSelectProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"field-folder-select\"\n className={cn(\n FIELD_SURFACE,\n 'flex h-9 w-full min-w-0 items-center gap-1.5 px-3 text-left hover:text-primary pointer-coarse:h-11'\n )}\n >\n {folder ? (\n <>\n <FolderOpen className=\"size-3.5 flex-none shrink-0 text-yellow-600\" />\n <FolderBreadcrumb segments={folder.split('/')} size=\"sm\" />\n </>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n <ChevronsUpDown className=\"ml-auto size-3.5 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-[var(--radix-popover-trigger-width)] max-w-[min(640px,92vw)] p-0\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n >\n {picker}\n </PopoverContent>\n </Popover>\n )\n}\n\n/** Read-only folder. */\nexport function FieldFolderValue({ folder }: { folder: string | null | undefined }) {\n return (\n <div className=\"flex items-center gap-1.5 text-sm\">\n {folder ? (\n <>\n <FolderOpen className=\"size-3.5 shrink-0 text-yellow-600\" />\n <span>{folder}</span>\n </>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n )\n}\n\nexport interface FieldLabelsSelectProps {\n options: LabelOption[]\n appliedIds: ReadonlySet<string>\n /** Labels shown as check marks in the field (defaults to the applied ones). Pass fewer to list\n * the selection elsewhere, e.g. in a dialog that renders it beside the field. */\n displayedIds?: ReadonlySet<string>\n onToggle: (id: string) => void\n /** Create a label and apply it; omit to make the picker toggle-only. */\n onCreate?: (name: string) => void\n emptyText?: string\n labels?: Partial<LabelMultiSelectLabels>\n}\n\n/** Labels field: the applied labels as check marks; click to open the label picker. */\nexport function FieldLabelsSelect({\n options,\n appliedIds,\n displayedIds = appliedIds,\n onToggle,\n onCreate,\n emptyText = 'Click to add',\n labels,\n}: FieldLabelsSelectProps) {\n const applied = useMemo(\n () => options.filter((o) => displayedIds.has(o.id)),\n [options, displayedIds]\n )\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"field-labels-select\"\n className={cn(\n FIELD_SURFACE,\n 'flex min-h-9 w-full cursor-pointer items-center px-3 py-1.5 text-left pointer-coarse:min-h-11'\n )}\n >\n <div className=\"flex min-h-[28px] flex-wrap items-center gap-1.5\">\n {applied.length === 0 && (\n <span className=\"text-sm italic text-muted-foreground\">{emptyText}</span>\n )}\n {applied.map((o) => (\n <span key={o.id} className=\"inline-flex items-center gap-1 text-sm font-medium\">\n <span\n className=\"flex size-4 shrink-0 items-center justify-center rounded border-2\"\n style={{ borderColor: o.color, backgroundColor: o.color }}\n >\n <Check className=\"size-3 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[280px] truncate\">{o.name}</span>\n </span>\n ))}\n </div>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[360px] p-0\" align=\"start\" side=\"bottom\" sideOffset={4}>\n <LabelPickerList\n options={options}\n appliedIds={appliedIds}\n onToggle={onToggle}\n onCreate={onCreate}\n labels={{ ...DEFAULT_LABEL_MULTI_SELECT_LABELS, ...labels }}\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport interface FieldNativeSelectProps {\n value: string\n options: string[]\n onChange: (value: string) => void\n /** Text of the empty option. */\n emptyLabel?: string\n ariaLabel?: string\n}\n\n/** A single-choice field (a native `select`: reliable on touch and with assistive tech). */\nexport function FieldNativeSelect({\n value,\n options,\n onChange,\n emptyLabel = '--',\n ariaLabel,\n}: FieldNativeSelectProps) {\n return (\n <select\n value={value}\n aria-label={ariaLabel}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-9 w-full rounded-md border border-input bg-muted/40 px-3 text-sm transition-colors focus:bg-background focus:outline-none focus:ring-1 focus:ring-ring pointer-coarse:h-11\"\n >\n <option value=\"\">{emptyLabel}</option>\n {options.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n )\n}\n\nexport interface FieldAttributionProps {\n /** Avatar of whoever last changed the value. */\n avatar: ReactNode\n /** Formatted date of that change. */\n date: string\n /** Tooltip lines (\"Created ... by ...\", \"Updated ... by ...\"). */\n lines: string[]\n}\n\n/** Subtle \"who changed this and when\". */\nexport function FieldAttribution({ avatar, date, lines }: FieldAttributionProps) {\n return (\n <div className=\"flex items-center gap-1\" data-slot=\"field-attribution\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex items-center gap-1\">\n {avatar}\n <span className=\"text-sm text-muted-foreground\">{date}</span>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {lines.map((line, i) => (\n <p key={i} className=\"text-sm\">\n {line}\n </p>\n ))}\n </TooltipContent>\n </Tooltip>\n </div>\n )\n}\n\n/**\n * Wraps an editable value and reveals `attribution` at its top-right on hover or keyboard focus\n * inside, and always on touch devices (there is no hover there).\n */\nexport function FieldWithAttribution({\n attribution,\n children,\n}: {\n attribution: ReactNode\n children: ReactNode\n}) {\n return (\n <div className=\"group/doctag relative\" data-slot=\"field-with-attribution\">\n {children}\n <div className=\"absolute right-0 top-0 bg-background/90 pl-2 opacity-0 transition-opacity group-focus-within/doctag:opacity-100 group-hover/doctag:opacity-100 pointer-coarse:opacity-100\">\n {attribution}\n </div>\n </div>\n )\n}\n","import { forwardRef, type ComponentProps, type ReactNode } from 'react'\nimport { UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Chrome around the explorer's tile grid: frame, scroller, empty state, marquee, drop overlay. */\n\nexport function ExplorerFrame({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div data-slot=\"explorer-frame\" className={cn('flex h-full flex-col', className)} {...props} />\n )\n}\n\n/** Positioning context of the scroller: the marquee and the drop overlay sit over it. */\nexport function ExplorerStage({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"explorer-stage\"\n className={cn('relative min-h-0 flex-1', className)}\n {...props}\n />\n )\n}\n\n/**\n * The scrolling tile area. `scrollbar-gutter: stable` reserves the scrollbar's space whether or\n * not it shows, so the measured width never flips when the vertical scrollbar toggles (narrow\n * split-screen widths would otherwise thrash column count, tile height, scrollbar, width).\n */\nexport const ExplorerScroller = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n function ExplorerScroller({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"explorer-scroller\"\n className={cn(\n 'h-full select-none overflow-auto px-4 py-4 [scrollbar-gutter:stable]',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nexport interface ExplorerEmptyProps {\n title: string\n description: string\n}\n\n/** Nothing to show in this folder / search. */\nexport function ExplorerEmpty({ title, description }: ExplorerEmptyProps) {\n return (\n <div\n data-slot=\"explorer-empty\"\n className=\"flex h-full flex-col items-center justify-center gap-1 text-center text-muted-foreground\"\n >\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs\">{description}</p>\n </div>\n )\n}\n\n/**\n * Marquee (rubber-band) rectangle. Always mounted and positioned by mutating its style directly\n * during a drag, so selecting does not re-render the grid.\n */\nexport const ExplorerMarquee = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n function ExplorerMarquee({ className, style, ...props }, ref) {\n return (\n <div\n ref={ref}\n aria-hidden\n data-slot=\"explorer-marquee\"\n className={cn(\n 'pointer-events-none fixed z-30 border border-primary bg-primary/10',\n className\n )}\n style={{ display: 'none', ...style }}\n {...props}\n />\n )\n }\n)\n\n/** Shown over the grid while files are dragged in from outside. */\nexport function ExplorerDropOverlay({ label }: { label: string }) {\n return (\n <div\n data-slot=\"explorer-drop-overlay\"\n className=\"pointer-events-none absolute inset-2 z-20 flex flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-primary bg-accent/80 backdrop-blur-sm\"\n >\n <UploadCloud className=\"size-8 text-primary\" />\n <p className=\"text-sm font-medium text-primary\">{label}</p>\n </div>\n )\n}\n\nexport interface ExplorerDragPreviewProps {\n icon: ReactNode\n title: string\n /** Number of documents dragged; shown as a badge above 1. */\n count: number\n}\n\n/** Floating preview under the cursor while dragging documents. */\nexport function ExplorerDragPreview({ icon, title, count }: ExplorerDragPreviewProps) {\n return (\n <div\n data-slot=\"explorer-drag-preview\"\n className=\"flex items-center gap-2 rounded-lg border border-primary/40 bg-popover px-3 py-2 shadow-lg\"\n >\n {icon}\n <span className=\"max-w-[12rem] truncate text-sm font-medium\">{title}</span>\n {count > 1 && (\n <span className=\"rounded-full bg-primary px-1.5 py-0.5 text-xs font-semibold text-primary-foreground\">\n {count}\n </span>\n )}\n </div>\n )\n}\n"]}
|