@arbidocs/blocks 0.4.156 → 0.4.157
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/ConnectedNativeDocxComparison-2PLOOXSH.js +1 -1
- package/dist/ConnectedNativeDocxComparison-S25BPUH5.cjs +1 -1
- package/dist/ConnectedNativeDocxEditor-JJAGMHZC.js +1 -1
- package/dist/ConnectedNativeDocxEditor-YA4HWLY4.cjs +1 -1
- package/dist/ConnectedStreamedWordArtifact-EXYZAU4Y.cjs +1 -1
- package/dist/ConnectedStreamedWordArtifact-YAAXY5KY.js +1 -1
- package/dist/agents/index.cjs +238 -238
- package/dist/agents/index.js +4 -4
- package/dist/chat/index.cjs +1 -1
- package/dist/chat/index.js +1 -1
- package/dist/{chunk-6HMCF4AJ.js → chunk-5ZIYPZYE.js} +1033 -5
- package/dist/chunk-5ZIYPZYE.js.map +1 -0
- package/dist/{chunk-O3FB62T5.cjs → chunk-6QAAIDQQ.cjs} +47 -47
- package/dist/{chunk-O3FB62T5.cjs.map → chunk-6QAAIDQQ.cjs.map} +1 -1
- package/dist/{chunk-UKT3WH5Z.cjs → chunk-B3FMUFAW.cjs} +3 -3
- package/dist/{chunk-UKT3WH5Z.cjs.map → chunk-B3FMUFAW.cjs.map} +1 -1
- package/dist/{chunk-W7CWGURO.js → chunk-FTZ45WHY.js} +6 -685
- package/dist/chunk-FTZ45WHY.js.map +1 -0
- package/dist/{chunk-HDJRSCRE.cjs → chunk-GC2FSPSQ.cjs} +6 -6
- package/dist/{chunk-HDJRSCRE.cjs.map → chunk-GC2FSPSQ.cjs.map} +1 -1
- package/dist/{chunk-UKCCV63X.js → chunk-MNG7N6M2.js} +4 -4
- package/dist/{chunk-UKCCV63X.js.map → chunk-MNG7N6M2.js.map} +1 -1
- package/dist/{chunk-MUDEL7UL.cjs → chunk-NPLGB4LI.cjs} +4 -703
- package/dist/chunk-NPLGB4LI.cjs.map +1 -0
- package/dist/{chunk-UPMADXDU.js → chunk-P6RIBIVN.js} +3 -3
- package/dist/{chunk-UPMADXDU.js.map → chunk-P6RIBIVN.js.map} +1 -1
- package/dist/{chunk-WV4TD2HZ.cjs → chunk-QJFJ5JBF.cjs} +1055 -2
- package/dist/chunk-QJFJ5JBF.cjs.map +1 -0
- package/dist/{chunk-6HG56GCT.js → chunk-QKR5LWDO.js} +4 -4
- package/dist/{chunk-6HG56GCT.js.map → chunk-QKR5LWDO.js.map} +1 -1
- package/dist/{chunk-YMQDDUKW.js → chunk-WU34CHU5.js} +3 -3
- package/dist/{chunk-YMQDDUKW.js.map → chunk-WU34CHU5.js.map} +1 -1
- package/dist/{chunk-FEGXFABZ.cjs → chunk-YF3QUHKN.cjs} +3 -3
- package/dist/{chunk-FEGXFABZ.cjs.map → chunk-YF3QUHKN.cjs.map} +1 -1
- package/dist/connect/docx.cjs +1 -1
- package/dist/connect/docx.js +1 -1
- package/dist/connect/index.cjs +730 -170
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +571 -16
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +45 -45
- package/dist/connect/viewer.js +7 -7
- package/dist/connection/files/index.d.ts +5 -0
- package/dist/connection/files/support.d.ts +2 -0
- package/dist/connection/files/upload/AddFromAccountsButton.d.ts +16 -0
- package/dist/connection/files/upload/ConnectedUpload.d.ts +36 -0
- package/dist/connection/files/upload/ConnectedUploadDropzone.d.ts +36 -0
- package/dist/connection/files/upload/EmptyWorkspaceUpload.d.ts +13 -0
- package/dist/connection/files/upload/useAddFromUrls.d.ts +13 -0
- package/dist/document-tools/index.cjs +1 -1
- package/dist/document-tools/index.js +1 -1
- package/dist/facts/index.cjs +54 -54
- package/dist/facts/index.js +4 -4
- package/dist/files/PrivacyExplainerModal.d.ts +8 -0
- package/dist/files/ShareToggle.d.ts +8 -0
- package/dist/files/UrlInputDialog.d.ts +24 -0
- package/dist/files/index.cjs +298 -278
- package/dist/files/index.d.ts +4 -0
- package/dist/files/index.js +2 -2
- package/dist/files/media-preview.d.ts +24 -0
- package/dist/index.cjs +347 -347
- package/dist/index.js +8 -8
- package/dist/studio/index.cjs +1 -1
- package/dist/studio/index.js +1 -1
- package/dist/workflow-canvas/index.cjs +16 -16
- package/dist/workflow-canvas/index.js +4 -4
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/chunk-6HMCF4AJ.js.map +0 -1
- package/dist/chunk-MUDEL7UL.cjs.map +0 -1
- package/dist/chunk-W7CWGURO.js.map +0 -1
- package/dist/chunk-WV4TD2HZ.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/files/page/FilesPageParts.tsx","../src/files/grid/row-density.ts","../src/files/grid/RowDensityControl.tsx","../src/files/cells/FolderCell.tsx","../src/files/FieldParts.tsx","../src/files/grid/FilterButton.tsx","../src/files/FolderPicker.tsx","../src/files/bulk/FolderFilterButton.tsx","../src/files/ExplorerSurface.tsx","../src/files/Explorer.tsx","../src/files/folders/folderPaths.ts","../src/files/import/VendorLogo.tsx","../src/files/folders/FolderProviderIcon.tsx","../src/files/permissions.ts","../src/files/recently-deleted.ts","../src/files/ExplorerTile.tsx","../src/files/StatusPill.tsx","../src/files/FailedStageIcon.tsx","../src/files/visibility.ts","../src/files/UploadParts.tsx","../src/files/UploadFooter.tsx","../src/files/ShareToggle.tsx","../src/files/UploadSources.tsx","../src/files/import/UrlInputDialogView.tsx","../src/files/media-preview.ts","../src/files/UrlInputDialog.tsx","../src/files/PrivacyExplainerModal.tsx"],"names":["jsx","cn","jsxs","Button","testIdOr","BookMarked","Tooltip","TooltipTrigger","ListChevronsUpDown","Slider","TooltipContent","Fragment","FolderOpen","Popover","PopoverTrigger","PopoverContent","ChevronsUpDown","useMemo","Check","LabelPickerList","DEFAULT_LABEL_MULTI_SELECT_LABELS","useState","useRef","useEffect","Minus","FolderBreadcrumb","useCallback","Command","CommandInput","CommandList","CommandEmpty","Plus","CommandGroup","CommandItem","X","ChevronDown","FolderPlus","forwardRef","ExplorerScroller","ExplorerMarquee","UploadCloud","getDocumentTitle","getFileExtension","extensionFromMime","Mail","formatCount","ActionLink","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuSeparator","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","DropdownMenuItem","Checkbox","Folder","LoaderCircle","Sparkles","cva","TONE_SURFACE","FileX","DatabaseZap","LockKeyholeOpen","BrainCircuit","CircleSlash","AlertCircle","memo","FailedStageIcon","getEntityLabel","isAgent","getUserDisplayName","Progress","IconToggle","CopyX","Textarea","VisibilityToggle","Loader2","Upload","FileText","Globe","Dialog","DialogTrigger","DialogContent","ModalHeader","DialogTitle","DialogDescription","Label","Input","newUrls","Link","KeyRound","Eye","ShieldCheck","Info","ChevronRight","DialogHeader"],"mappings":"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","file":"chunk-QJFJ5JBF.cjs","sourcesContent":["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","/**\n * Row-height ⇄ line-count math shared by the documents and facts tables.\n *\n * The grid (packages/arbi-blocks GridView) clamps a multiline cell to\n * `floor((rowHeight - chrome) / lineHeight)` fully-visible lines. Snapping every\n * density value to a line boundary makes each step add exactly one whole line\n * instead of growing the row while clipping the next line in half.\n *\n * The constants MUST match packages/arbi-blocks/src/components/GridView.tsx.\n */\n\n/** One multiline line: grid font-size (14) × its line-height (1.35) = 18.9px. */\nexport const LINE_PX = 14 * 1.35\n/** Fixed per-row chrome: 16px vertical padding + 2px border. */\nexport const CHROME = 18\nexport const MIN_LINES = 1\nexport const MAX_LINES = 10\n\n/**\n * Row height (px) that renders exactly `lines` fully-visible text lines. Uses\n * `ceil` (not `round`) so the value never lands just BELOW a boundary, where the\n * grid's own `floor` would drop back to `lines - 1`.\n */\nexport const rowHeightForLines = (lines: number) => Math.ceil(lines * LINE_PX + CHROME)\n\n/** How many whole lines a given row height renders as — the grid's own formula,\n * so the density slider position matches what's actually on screen. */\nexport const linesForRowHeight = (height: number) =>\n Math.max(MIN_LINES, Math.min(MAX_LINES, Math.floor((height - CHROME) / LINE_PX)))\n\nexport const ROW_MIN = rowHeightForLines(MIN_LINES)\nexport const ROW_MAX = rowHeightForLines(MAX_LINES)\n","/**\n * RowDensityControl\n *\n * Row-height adjuster for the documents AND facts tables. It steps in whole\n * TEXT LINES, not arbitrary pixels: the grid (packages/arbi-blocks GridView)\n * clamps a multiline cell to `floor((rowHeight - chrome) / lineHeight)` lines,\n * so a px-based step smaller than a line would grow the row while revealing only\n * a sliver of the next line (text cut in half). Snapping every value to a line\n * boundary makes each increment add exactly one fully-visible line.\n */\n\nimport { Slider, Tooltip, TooltipTrigger, TooltipContent } from '@arbidocs/react/ui'\nimport { ListChevronsUpDown } from 'lucide-react'\nimport { MIN_LINES, MAX_LINES, linesForRowHeight, rowHeightForLines } from './row-density'\n\ninterface RowDensityControlProps {\n rowHeight: number\n onRowHeightChange: (height: number) => void\n /** Testid stem — \"documents-density\" (default) keeps the original ids. */\n testId?: string\n}\n\nexport function RowDensityControl({\n rowHeight,\n onRowHeightChange,\n testId = 'documents-density',\n}: RowDensityControlProps) {\n const lines = linesForRowHeight(rowHeight)\n const setLines = (next: number) =>\n onRowHeightChange(rowHeightForLines(Math.max(MIN_LINES, Math.min(MAX_LINES, next))))\n\n return (\n <Tooltip delayDuration={300}>\n <TooltipTrigger asChild>\n <div className=\"flex h-7 items-center gap-1.5 rounded-md border border-input px-2 pointer-coarse:h-11\">\n <span className=\"hidden text-xs text-muted-foreground md:inline\">Rows</span>\n <button\n type=\"button\"\n aria-label=\"Shorter rows\"\n data-testid={`${testId}-out`}\n onClick={() => setLines(lines - 1)}\n disabled={lines <= MIN_LINES}\n className=\"flex items-center justify-center text-muted-foreground hover:text-foreground disabled:opacity-40 pointer-coarse:size-11\"\n >\n <ListChevronsUpDown className=\"h-4 w-4\" />\n </button>\n {/* The slider works in LINE units — one notch per line — so it can only\n land on line-boundary heights. */}\n <Slider\n value={[lines]}\n min={MIN_LINES}\n max={MAX_LINES}\n step={1}\n onValueChange={([value]) => setLines(value)}\n aria-label=\"Row height\"\n data-testid={testId}\n className=\"w-20\"\n />\n </div>\n </TooltipTrigger>\n <TooltipContent>\n Row height: {lines} line{lines === 1 ? '' : 's'}\n </TooltipContent>\n </Tooltip>\n )\n}\n","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 { 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","/**\n * Filter button for custom AG Grid header components.\n * Uses AG Grid's own CSS classes (ag-header-icon, ag-icon-filter) so it is\n * visually identical to the native filter button shown on standard columns.\n */\n\nimport { useState, useEffect, useRef } from 'react'\nimport type { IHeaderParams } from 'ag-grid-community'\n\ninterface FilterButtonProps {\n params: IHeaderParams\n colId: string\n}\n\nexport const FilterButton = ({ params, colId }: FilterButtonProps) => {\n const [isFilterActive, setIsFilterActive] = useState(false)\n const btnRef = useRef<HTMLSpanElement>(null)\n\n useEffect(() => {\n const check = () => setIsFilterActive(!!params.api.getFilterModel()[colId])\n check()\n params.api.addEventListener('filterChanged', check)\n return () => {\n if (!params.api.isDestroyed()) params.api.removeEventListener('filterChanged', check)\n }\n }, [params.api, colId])\n\n return (\n <span\n ref={btnRef}\n role=\"button\"\n aria-label=\"Filter\"\n onClick={(e) => {\n e.stopPropagation()\n if (btnRef.current) params.showFilter(btnRef.current)\n }}\n className={`ag-header-icon ag-header-cell-filter-button ag-header-label-icon ${isFilterActive ? 'ag-filter-active' : ''}`}\n aria-hidden=\"false\"\n >\n <span className=\"ag-icon ag-icon-filter\" />\n </span>\n )\n}\n","import { useCallback, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Check, FolderOpen, Minus, Plus, X } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the folder pickers. Pass a partial `labels` to translate or reword. */\nexport interface FolderPickerLabels {\n none: string\n removeFromFolder: string\n searchOrCreate: string\n noFolders: string\n create: (name: string) => string\n}\n\nexport const DEFAULT_FOLDER_PICKER_LABELS: FolderPickerLabels = {\n none: 'None',\n removeFromFolder: 'Remove from folder',\n searchOrCreate: 'Search or create...',\n noFolders: 'No folders yet',\n create: (name) => `Create \\u201c${name}\\u201d`,\n}\n\nexport interface FolderCommandListTestIds {\n create: string\n createOption: string\n remove: string\n /** Replaces the whole `folder-picker-option-<folder>` id. */\n option: (folder: string) => string\n}\n\n// ── Tree row ────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderPickerRowProps {\n label: string\n /** Optional leading glyph (e.g. a connector brand mark for provider roots). */\n icon?: ReactNode\n /** Shown at the right edge; omit for rows with nothing to count (e.g. an empty unread count). */\n count?: number\n depth: number\n isActive: boolean\n muted?: boolean\n /** Test id of the row button (none by default). */\n testId?: string\n /**\n * Draw a checkbox in the leading slot instead of the single-select tick. A list you can pick\n * SEVERAL rows from should look like one: a lone tick reads \"this is the current one\", a box\n * reads \"tick the ones you want\".\n */\n checkbox?: boolean\n /** Checkbox only: some descendants are selected, so show a dash, not a tick. */\n indeterminate?: boolean\n onClick: () => void\n}\n\n/** One folder row: indented by depth, with a count. Whole row is the target (44px on touch). */\nexport function FolderPickerRow({\n label,\n icon,\n count,\n depth,\n isActive,\n muted,\n checkbox,\n indeterminate,\n testId,\n onClick,\n}: FolderPickerRowProps) {\n return (\n <button\n type=\"button\"\n data-testid={testId}\n onClick={onClick}\n // The row IS the checkbox: a real <Checkbox> inside this button would nest one interactive\n // element in another and swallow the click. role + aria-checked carry the same meaning.\n role={checkbox ? 'checkbox' : undefined}\n aria-checked={checkbox ? (indeterminate ? 'mixed' : isActive) : undefined}\n style={{ paddingLeft: `${4 + depth * 14}px` }}\n className={cn(\n // `[&:hover]:`, not `hover:`: the latter compiles behind `@media (hover: hover)`, so on a\n // touchscreen whose PRIMARY pointer reports `hover: none` the row would never highlight\n // even with a real mouse attached. The arbitrary selector has no media gate.\n 'flex w-full items-center gap-1 rounded-sm py-1 pr-2 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&:hover]:bg-accent pointer-coarse:min-h-11',\n isActive && 'bg-primary/10',\n muted && !isActive && 'text-muted-foreground'\n )}\n >\n <span className=\"flex w-4 shrink-0 items-center justify-center\">\n {checkbox ? (\n <span\n className={cn(\n 'flex size-3.5 items-center justify-center rounded-[3px] border transition-colors',\n isActive || indeterminate\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-muted-foreground/40'\n )}\n >\n {indeterminate ? (\n <Minus className=\"size-2.5\" />\n ) : (\n isActive && <Check className=\"size-2.5\" />\n )}\n </span>\n ) : (\n isActive && <Check className=\"size-3.5 text-primary\" />\n )}\n </span>\n {icon}\n {label !== '' && (\n <span className={cn('min-w-0 truncate', isActive && 'font-semibold text-primary')}>\n {label}\n </span>\n )}\n {count !== undefined && (\n <span className=\"ml-auto pl-2 text-sm font-semibold text-muted-foreground\">{count}</span>\n )}\n </button>\n )\n}\n\n// ── Tree ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderTreeNode {\n path: string\n label: string\n depth: number\n count: number\n /** Replaces the label's default look (provider roots show a brand mark). */\n icon?: ReactNode\n}\n\nexport interface FolderTreeProps {\n nodes: FolderTreeNode[]\n unfiledCount: number\n /** string = folder path selected, null = Unfiled selected, undefined = nothing selected. */\n value: string | null | undefined\n onChange: (folder: string | null) => void\n /** Show the Unfiled (\"None\") row even when it is empty. */\n showUnfiledAlways?: boolean\n labels?: Partial<FolderPickerLabels>\n}\n\n/** Folder hierarchy with an Unfiled option at the bottom. No \"All\" row: callers add their own. */\nexport function FolderTree({\n nodes,\n unfiledCount,\n value,\n onChange,\n showUnfiledAlways,\n labels,\n}: FolderTreeProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n return (\n <div className=\"max-h-[240px] overflow-y-auto\">\n {nodes.map((node) => (\n <FolderPickerRow\n key={node.path}\n label={node.label}\n icon={node.icon}\n count={node.count}\n depth={node.depth}\n isActive={value === node.path}\n onClick={() => onChange(node.path)}\n />\n ))}\n {(unfiledCount > 0 || showUnfiledAlways) && (\n <>\n {nodes.length > 0 && <div className=\"my-1 border-t border-border\" />}\n <FolderPickerRow\n label={l.none}\n count={unfiledCount}\n depth={0}\n isActive={value === null}\n muted\n onClick={() => onChange(null)}\n />\n </>\n )}\n </div>\n )\n}\n\n// ── Searchable list ─────────────────────────────────────────────────────────────────────────\n\nfunction FolderBreadcrumb({ folder }: { folder: string }) {\n const parts = folder.split('/')\n return (\n <span className=\"whitespace-nowrap\">\n {parts.map((part, i) => (\n <span key={i} className=\"inline-flex items-center gap-0.5\">\n {i > 0 && <span className=\"mx-0.5 text-sm text-muted-foreground/50\">/</span>}\n <span className={i < parts.length - 1 ? 'text-sm text-muted-foreground' : ''}>\n {part}\n </span>\n </span>\n ))}\n </span>\n )\n}\n\nexport interface FolderCommandListProps {\n /** Existing folder paths (the host derives them from its documents). */\n folders: string[]\n /** Selected folder (null = unfiled, undefined = no selection). */\n value?: string | null\n /** A folder was picked or a new one created. */\n onSelect: (folder: string | null) => void\n /** Show the remove / move-to-root option. */\n showRemove?: boolean\n /** Wins over `labels.removeFromFolder`. */\n removeLabel?: string\n /** Wins over `labels.searchOrCreate`. */\n placeholder?: string\n autoFocus?: boolean\n labels?: Partial<FolderPickerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<FolderCommandListTestIds>\n}\n\n/**\n * Searchable folder picker: filter existing folders, create one by typing a new name, optional\n * \"Remove from folder\". Shows hierarchy as breadcrumbs.\n */\nexport function FolderCommandList({\n folders,\n value,\n onSelect,\n showRemove = false,\n removeLabel,\n placeholder,\n autoFocus = true,\n labels,\n testIds,\n}: FolderCommandListProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n const [search, setSearch] = useState('')\n const trimmed = search.trim()\n const matchesExisting = folders.some((f) => f.toLowerCase() === trimmed.toLowerCase())\n\n const handleCreate = useCallback(\n (name: string) => {\n const next = name.trim()\n if (!next) return\n onSelect(next)\n setSearch('')\n },\n [onSelect]\n )\n\n return (\n <Command shouldFilter={true}>\n <CommandInput\n placeholder={placeholder ?? l.searchOrCreate}\n value={search}\n onValueChange={setSearch}\n autoFocus={autoFocus}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && trimmed && !matchesExisting) {\n e.preventDefault()\n handleCreate(search)\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {trimmed ? (\n <button\n type=\"button\"\n data-testid={testIdOr(testIds?.create, { testId: 'folder-picker-create' })}\n onClick={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"flex w-full cursor-pointer items-center gap-1.5 rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n <Plus className=\"size-3.5 shrink-0\" />\n {l.create(trimmed)}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.noFolders}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {folders.map((folder) => (\n <CommandItem\n key={folder}\n value={folder}\n data-testid={testIdOr(testIds?.option?.(folder), {\n testId: `folder-picker-option-${folder}`,\n })}\n onSelect={() => onSelect(folder)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm\"\n >\n <FolderOpen className=\"mr-1.5 size-3.5 flex-none shrink-0 text-yellow-text\" />\n <FolderBreadcrumb folder={folder} />\n {value === folder && (\n <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n\n {trimmed && !matchesExisting && folders.length > 0 && (\n <CommandGroup>\n <CommandItem\n value={`__create__${trimmed}`}\n data-testid={testIdOr(testIds?.createOption, {\n testId: 'folder-picker-create-option',\n })}\n onSelect={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-primary\"\n >\n <Plus className=\"mr-1.5 size-3.5 shrink-0\" />\n <span>{l.create(trimmed)}</span>\n </CommandItem>\n </CommandGroup>\n )}\n\n {showRemove && (\n <CommandGroup>\n <CommandItem\n value=\"__none__\"\n data-testid={testIdOr(testIds?.remove, { testId: 'folder-picker-remove' })}\n onSelect={() => onSelect(null)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-muted-foreground\"\n >\n <X className=\"mr-1 size-3.5 shrink-0\" />\n <span>{removeLabel ?? l.removeFromFolder}</span>\n {value === null && <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>}\n </CommandItem>\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n )\n}\n","import type { ReactNode } from 'react'\nimport { 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 { forwardRef, type ComponentProps, type ReactNode } from 'react'\nimport { UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Chrome around the explorer's tile grid: frame, scroller, empty state, marquee, drop overlay. */\n\nexport function ExplorerFrame({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div data-slot=\"explorer-frame\" className={cn('flex h-full flex-col', className)} {...props} />\n )\n}\n\n/** Positioning context of the scroller: the marquee and the drop overlay sit over it. */\nexport function ExplorerStage({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"explorer-stage\"\n className={cn('relative min-h-0 flex-1', className)}\n {...props}\n />\n )\n}\n\n/**\n * The scrolling tile area. `scrollbar-gutter: stable` reserves the scrollbar's space whether or\n * not it shows, so the measured width never flips when the vertical scrollbar toggles (narrow\n * split-screen widths would otherwise thrash column count, tile height, scrollbar, width).\n */\nexport const ExplorerScroller = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n function ExplorerScroller({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"explorer-scroller\"\n className={cn(\n 'h-full select-none overflow-auto px-4 py-4 [scrollbar-gutter:stable]',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nexport interface ExplorerEmptyProps {\n title: string\n description: string\n}\n\n/** Nothing to show in this folder / search. */\nexport function ExplorerEmpty({ title, description }: ExplorerEmptyProps) {\n return (\n <div\n data-slot=\"explorer-empty\"\n className=\"flex h-full flex-col items-center justify-center gap-1 text-center text-muted-foreground\"\n >\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs\">{description}</p>\n </div>\n )\n}\n\n/**\n * Marquee (rubber-band) rectangle. Always mounted and positioned by mutating its style directly\n * during a drag, so selecting does not re-render the grid.\n */\nexport const ExplorerMarquee = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n function ExplorerMarquee({ className, style, ...props }, ref) {\n return (\n <div\n ref={ref}\n aria-hidden\n data-slot=\"explorer-marquee\"\n className={cn(\n 'pointer-events-none fixed z-30 border border-primary bg-primary/10',\n className\n )}\n style={{ display: 'none', ...style }}\n {...props}\n />\n )\n }\n)\n\n/** Shown over the grid while files are dragged in from outside. */\nexport function ExplorerDropOverlay({ label }: { label: string }) {\n return (\n <div\n data-slot=\"explorer-drop-overlay\"\n className=\"pointer-events-none absolute inset-2 z-20 flex flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-primary bg-accent/80 backdrop-blur-sm\"\n >\n <UploadCloud className=\"size-8 text-primary\" />\n <p className=\"text-sm font-medium text-primary\">{label}</p>\n </div>\n )\n}\n\nexport interface ExplorerDragPreviewProps {\n icon: ReactNode\n title: string\n /** Number of documents dragged; above 1 the card stacks and shows an \"N items\" badge. */\n count: number\n}\n\n/**\n * Floating preview under the cursor while dragging documents. When the drag\n * carries a multi-selection the card renders as a stack with an \"N items\"\n * badge, so it's obvious the whole selection moves — not just this file.\n */\nexport function ExplorerDragPreview({ icon, title, count }: ExplorerDragPreviewProps) {\n const isMulti = count > 1\n return (\n <div data-slot=\"explorer-drag-preview\" className=\"relative\">\n {isMulti && (\n <div\n aria-hidden\n className=\"absolute inset-0 translate-x-1.5 translate-y-1.5 rounded-lg border border-primary/30 bg-popover shadow-md\"\n />\n )}\n <div className=\"relative flex items-center gap-2 rounded-lg border border-primary/40 bg-popover px-3 py-2 shadow-lg\">\n {icon}\n <span className=\"max-w-[12rem] truncate text-sm font-medium\">{title}</span>\n {isMulti && (\n <span\n data-slot=\"explorer-drag-preview-count\"\n className=\"whitespace-nowrap rounded-full bg-primary px-2 py-0.5 text-xs font-semibold text-primary-foreground\"\n >\n {count} items\n </span>\n )}\n </div>\n </div>\n )\n}\n","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","/**\n * Pure helpers that turn the flat document list into a navigable folder tree.\n *\n * Folders are not a backend entity — each document carries a slash-separated\n * `folder` path string (e.g. `\"Reports/Q1\"`, or `null`/`\"\"` for the root).\n * These helpers derive, for a given path, the immediate sub-folders (with\n * descendant counts) and the files that live directly in that folder. Kept\n * pure and side-effect-free so the navigation logic is unit-testable.\n */\n\nimport { extensionFromMime, getDocumentTitle, getFileExtension } from '@arbidocs/react/ui'\n\n/** The fields of a document the folder view reads. */\nexport interface FolderDocument {\n external_id: string\n file_name?: string | null\n file_type?: string | null\n file_size?: number | null\n folder?: string | null\n parent_ext_id?: string | null\n created_at?: string | null\n doc_metadata?: { title?: string | null } | null\n}\n\nexport interface ExplorerFolder {\n kind: 'folder'\n /** The folder's own name (last path segment). */\n name: string\n /** Full path segments from the root, including this folder. */\n path: string[]\n /** Number of documents anywhere beneath this folder. */\n count: number\n}\n\nexport interface ExplorerFile<D extends FolderDocument = FolderDocument> {\n kind: 'file'\n doc: D\n}\n\nexport type ExplorerEntry<D extends FolderDocument = FolderDocument> =\n ExplorerFolder | ExplorerFile<D>\n\nexport type ExplorerSort = 'name' | 'date' | 'size'\n\n/**\n * Display name for a document in the explorer, with its real file extension —\n * the familiar \"Report.pdf\" form. Many documents store an AI-generated display\n * title that drops the extension, so we re-attach it from the stored\n * `file_name` or, failing that, the MIME `file_type`.\n */\nexport function getExplorerDisplayName(doc: FolderDocument): string {\n const title = getDocumentTitle(doc, doc.file_name ?? 'Untitled')\n // Already carries an extension → trust it.\n if (getFileExtension(title)) return title\n const ext = getFileExtension(doc.file_name) || extensionFromMime(doc.file_type)\n return ext ? `${title}.${ext}` : title\n}\n\n/** Split a `Doc.folder` value into trimmed, non-empty path segments. */\nexport function parseFolderSegments(folder?: string | null): string[] {\n if (!folder) return []\n return folder\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n}\n\n/** Join path segments back into a canonical `Doc.folder` string (or null at root). */\nexport function joinFolderPath(segments: string[]): string | null {\n return segments.length > 0 ? segments.join('/') : null\n}\n\n/** True when `segments` starts with every segment of `prefix`. */\nfunction startsWithPath(segments: string[], prefix: string[]): boolean {\n if (segments.length < prefix.length) return false\n for (let i = 0; i < prefix.length; i++) {\n if (segments[i] !== prefix[i]) return false\n }\n return true\n}\n\n/**\n * A document is shown in the explorer unless it belongs to an email family:\n * attachments and archived messages (`parent_ext_id` set) live \"inside\" their\n * email / archive and would otherwise clutter the folder view. Versions are not\n * children — the list holds each document's current version only.\n */\nexport function isExplorerDocument(doc: FolderDocument): boolean {\n return !doc.parent_ext_id\n}\n\n/**\n * Every explorer document that lives anywhere beneath `path` (directly in the\n * folder or in a sub-folder). Used to expand a folder into the documents a\n * folder-level action (select / move / download / delete / rename) applies to —\n * \"act on a folder\" means \"act on everything in it\".\n */\nexport function collectFolderDocs<D extends FolderDocument>(documents: D[], path: string[]): D[] {\n if (path.length === 0) return documents.filter(isExplorerDocument)\n return documents.filter(\n (doc) => isExplorerDocument(doc) && startsWithPath(parseFolderSegments(doc.folder), path)\n )\n}\n\nfunction compareFiles(a: FolderDocument, b: FolderDocument, sort: ExplorerSort): number {\n switch (sort) {\n case 'date': {\n // Newest first.\n const at = a.created_at ? Date.parse(a.created_at) : 0\n const bt = b.created_at ? Date.parse(b.created_at) : 0\n return bt - at\n }\n case 'size': {\n // Largest first.\n return (b.file_size ?? 0) - (a.file_size ?? 0)\n }\n case 'name':\n default:\n return getDocumentTitle(a, a.file_name ?? '').localeCompare(\n getDocumentTitle(b, b.file_name ?? ''),\n undefined,\n { numeric: true, sensitivity: 'base' }\n )\n }\n}\n\n/**\n * Documents in the order the gallery shows them for a sort choice (and its\n * direction toggle). Review mode steps through this same order.\n */\nexport function sortExplorerFiles<D extends FolderDocument>(\n docs: D[],\n sort: ExplorerSort,\n reversed = false\n): D[] {\n const sorted = [...docs].sort((a, b) => compareFiles(a, b, sort))\n return reversed ? sorted.reverse() : sorted\n}\n\n/**\n * Build the folders and files that live directly under `currentPath`.\n *\n * - Files: documents whose folder path exactly equals `currentPath`.\n * - Folders: the distinct next path segment of any document nested deeper than\n * `currentPath`, with `count` = number of documents beneath it.\n *\n * Folders are always sorted by name; files by the requested sort.\n */\nexport function buildExplorerEntries<D extends FolderDocument>(\n documents: D[],\n currentPath: string[],\n sort: ExplorerSort = 'name',\n pendingFolders: string[] = []\n): { folders: ExplorerFolder[]; files: D[] } {\n const folderCounts = new Map<string, number>()\n const files: D[] = []\n\n for (const doc of documents) {\n const segments = parseFolderSegments(doc.folder)\n if (!startsWithPath(segments, currentPath)) continue\n\n if (segments.length === currentPath.length) {\n files.push(doc)\n } else {\n const childName = segments[currentPath.length]\n folderCounts.set(childName, (folderCounts.get(childName) ?? 0) + 1)\n }\n }\n\n // Placeholder (empty) folders the user created that live directly under the\n // current path — surfaced with count 0 so the UI can render them faded. A\n // pending folder that has since gained documents already appears above.\n const childNames = new Set(folderCounts.keys())\n for (const pending of pendingFolders) {\n const segments = parseFolderSegments(pending)\n if (!startsWithPath(segments, currentPath)) continue\n if (segments.length > currentPath.length) childNames.add(segments[currentPath.length])\n }\n\n const folders: ExplorerFolder[] = Array.from(childNames)\n .map((name) => ({\n kind: 'folder' as const,\n name,\n path: [...currentPath, name],\n count: folderCounts.get(name) ?? 0,\n }))\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' }))\n\n files.sort((a, b) => compareFiles(a, b, sort))\n\n return { folders, files }\n}\n\n/**\n * Flat, cross-folder search over every top-level document by title / file name.\n * Used when the explorer search box is non-empty (mirrors real file explorers,\n * which flatten results and ignore the current folder while searching).\n */\nexport function searchExplorerDocuments<D extends FolderDocument>(\n documents: D[],\n query: string,\n sort: ExplorerSort = 'name'\n): D[] {\n const needle = query.trim().toLowerCase()\n if (!needle) return []\n return documents\n .filter((doc) => {\n if (!isExplorerDocument(doc)) return false\n const title = getDocumentTitle(doc, doc.file_name ?? '').toLowerCase()\n const name = (doc.file_name ?? '').toLowerCase()\n return title.includes(needle) || name.includes(needle)\n })\n .sort((a, b) => compareFiles(a, b, sort))\n}\n","/**\n * 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","/**\n * folderProviderIcon\n *\n * Maps a folder path to the brand mark of the connector that imported it, so\n * connector-created folders (e.g. \"Outlook (jane@arbi.city)\") show their\n * source at a glance. Only the ROOT segment is matched — nested subfolders\n * keep the generic folder icon. Returns null when the root isn't a known\n * provider (including the legacy bare \"Email\" root), letting call sites fall\n * back to their existing folder glyph.\n */\n\nimport { VendorLogo } from '../import/VendorLogo'\n\ntype ProviderLogoProps =\n | { vendorKey: 'gmail' | 'microsoft'; product?: undefined }\n | { vendorKey: string; product: 'onedrive' | 'googledrive' }\n\n/** Roots are formatted \"<Provider> (<account email>)\"; older docs may be bare. */\nconst PROVIDER_PREFIXES: [string, ProviderLogoProps][] = [\n ['Outlook', { vendorKey: 'microsoft' }],\n ['Gmail', { vendorKey: 'gmail' }],\n ['OneDrive', { vendorKey: 'microsoft', product: 'onedrive' }],\n ['Google Drive', { vendorKey: 'gmail', product: 'googledrive' }],\n]\n\nfunction providerForRoot(root: string): ProviderLogoProps | null {\n for (const [prefix, props] of PROVIDER_PREFIXES) {\n if (root.startsWith(prefix)) return props\n }\n return null\n}\n\n/**\n * Provider brand mark for a folder path's root segment, or null when the\n * folder isn't a connector import (call sites render their usual icon).\n */\nexport function FolderProviderIcon({\n folderPath,\n className,\n}: {\n folderPath: string\n className?: string\n}) {\n const root = folderPath.split('/')[0]\n const provider = providerForRoot(root)\n if (!provider) return null\n return (\n <VendorLogo vendorKey={provider.vendorKey} product={provider.product} className={className} />\n )\n}\n\n/** True when the folder path's root segment belongs to a known connector. */\n// eslint-disable-next-line react-refresh/only-export-components\nexport function hasFolderProviderIcon(folderPath: string): boolean {\n return providerForRoot(folderPath.split('/')[0]) !== null\n}\n\n/**\n * Display text for a single folder path segment. Provider roots drop the\n * provider name — the brand mark already says it — leaving just the account:\n * \"Outlook (jane@arbi.city)\" → \"jane@arbi.city\"\n * \"Outlook\" (legacy bare root) → \"\" (the logo stands alone)\n * Non-provider segments are returned unchanged. Stored paths are untouched;\n * this is display-only.\n */\n// eslint-disable-next-line react-refresh/only-export-components\nexport function formatFolderSegment(segment: string): string {\n if (!providerForRoot(segment)) return segment\n const account = segment.match(/\\(([^)]*)\\)/)\n return account ? account[1].trim() : ''\n}\n","/**\n * Who may do what to a document, by the workspace role: edit its fields, delete it, change who can\n * see it. The table, the explorer, the bulk actions and the detail pane all ask here, so they agree\n * with each other and with what the server allows.\n */\n\n/** A member's role in a workspace. */\nexport type WorkspaceMemberRole = 'owner' | 'collaborator' | 'guest'\n\n/** The fields of a document its permissions depend on. */\nexport interface OwnedDocument {\n created_by_ext_id?: string | null\n}\n\n/**\n * Whether the current user may flip a document's visibility. Only its creator (or an agent) may:\n * the server rejects anyone else with a 403, so the controls must not offer the toggle.\n */\nexport function canChangeVisibility(\n doc: OwnedDocument | null | undefined,\n currentUserExtId: string | undefined\n): boolean {\n if (!doc || !currentUserExtId) return false\n const isCurrentUserAgent = currentUserExtId.startsWith('agt-')\n const isCreatedByAgent = doc.created_by_ext_id?.startsWith('agt-') ?? false\n return isCurrentUserAgent || isCreatedByAgent || doc.created_by_ext_id === currentUserExtId\n}\n\n/**\n * Whether the current user may edit a document's regular fields (title, author, labels…).\n * Agents and workspace owners/collaborators may edit any document; guests and non-members\n * only their own.\n */\nexport function canEditDocumentFields(\n doc: OwnedDocument | null | undefined,\n currentUserExtId: string | undefined,\n workspaceRole: WorkspaceMemberRole | null\n): boolean {\n if (!doc || !currentUserExtId) return false\n if (currentUserExtId.startsWith('agt-')) return true\n if (workspaceRole === 'owner' || workspaceRole === 'collaborator') return true\n return canChangeVisibility(doc, currentUserExtId)\n}\n\n/**\n * Whether the current user may delete a document. Workspace owners may delete any document;\n * collaborators only their own, since they cannot delete shared content created by others.\n * Guests and non-members may not delete at all.\n */\nexport function canDeleteDocument(\n doc: OwnedDocument | null | undefined,\n currentUserExtId: string | undefined,\n workspaceRole: WorkspaceMemberRole | null\n): boolean {\n if (!doc || !currentUserExtId) return false\n if (workspaceRole === 'owner') return true\n if (workspaceRole === 'collaborator') return doc.created_by_ext_id === currentUserExtId\n return false\n}\n","/**\n * What deleting a document or a workspace does: it goes to Recently deleted (Settings > Storage, and the\n * project's Storage), where it can be restored until it is removed for good 30–60 days later. It keeps using\n * storage until then.\n */\nexport const RECENTLY_DELETED_HINT =\n 'You can restore it from Recently deleted (Settings > Storage) for at least 30 days.'\n\nexport const RECENTLY_DELETED_HINT_PLURAL =\n 'You can restore them from Recently deleted (Settings > Storage) for at least 30 days.'\n","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","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","/**\n * Stage-aware failure icon.\n *\n * All variants share the red color and \"alert\" weight so the cell still\n * reads as \"failure\" at a glance, but the glyph differs per pipeline\n * stage so users can tell *where* it died without opening details.\n *\n * Backend taxonomy (mirrors src/models/document.py FAILABLE_STAGES):\n * parsing — parser service: extraction / OCR / marker-subchunk\n * indexing — Qdrant chunk + vector writes\n * encrypting — SecretBox wrap of chunks/metadata\n * analysing — doctagllm metadata extraction\n * queued — failed before processing started\n * unknown — current code couldn't classify (defensive fallback)\n * null — legacy failure predating the failed_stage column;\n * rendered as \"Failed (stage unknown)\"\n */\n\nimport { memo } from 'react'\nimport {\n AlertCircle,\n BrainCircuit,\n CircleSlash,\n DatabaseZap,\n FileX,\n LockKeyholeOpen,\n type LucideIcon,\n} from 'lucide-react'\n\nexport type FailedStage = 'parsing' | 'indexing' | 'encrypting' | 'analysing' | 'queued' | 'unknown'\n\ninterface StageVariant {\n Icon: LucideIcon\n title: string\n}\n\nconst STAGE_VARIANTS: Record<FailedStage, StageVariant> = {\n parsing: { Icon: FileX, title: 'Parsing failed' },\n indexing: { Icon: DatabaseZap, title: 'Indexing failed' },\n encrypting: { Icon: LockKeyholeOpen, title: 'Encryption failed' },\n analysing: { Icon: BrainCircuit, title: 'Analysis failed' },\n queued: { Icon: CircleSlash, title: 'Failed before processing' },\n unknown: { Icon: AlertCircle, title: 'Failed' },\n}\n\nconst LEGACY_VARIANT: StageVariant = {\n Icon: AlertCircle,\n title: 'Failed (stage unknown)',\n}\n\nfunction resolveVariant(stage: string | null | undefined): StageVariant {\n if (stage == null) return LEGACY_VARIANT\n return (STAGE_VARIANTS as Record<string, StageVariant>)[stage] ?? STAGE_VARIANTS.unknown\n}\n\ninterface FailedStageIconProps {\n stage: string | null | undefined\n errorMessage?: string | null\n className?: string\n onClick?: (e: React.MouseEvent) => void\n}\n\nexport const FailedStageIcon = memo(function FailedStageIcon({\n stage,\n errorMessage,\n className = 'w-4 h-4 text-red-text cursor-pointer hover:text-red-text',\n onClick,\n}: FailedStageIconProps) {\n const { Icon, title } = resolveVariant(stage)\n const fullTitle = errorMessage ? `${title}: ${errorMessage}` : title\n return (\n <div title={fullTitle}>\n <Icon className={className} onClick={onClick} />\n </div>\n )\n})\n","/** Who can see documents, in words: the bulk bar, the explorer tiles and the upload dialog. */\n\nimport { getEntityLabel, getUserDisplayName, isAgent } from '@arbidocs/react/ui'\nimport type { BlocksEnvironment } from '../provider/BlocksProvider'\nimport type { ShareState } from '../collaboration/sharing/ShareControl'\n\nexport interface SharedItem {\n shared?: boolean | null\n}\n\n/** A workspace member as returned by the users endpoint. */\nexport interface WorkspaceMember {\n user: { external_id: string; given_name: string; family_name?: string | null }\n}\n\n/** Names listed in the hide confirmation before the rest are summarised as \"and N more\". */\nconst MAX_NAMES_IN_CONFIRM = 5\n\n/** Visibility of a selection: every item shared, none shared, or a mix. */\nexport function shareStateOf(items: SharedItem[]): ShareState {\n if (items.length === 0) return 'private'\n const sharedCount = items.filter((item) => item.shared === true).length\n if (sharedCount === items.length) return 'shared'\n return sharedCount > 0 ? 'mixed' : 'private'\n}\n\n/** Tooltip for the share button: what a click does in the given state. */\nexport function shareTooltipFor(state: ShareState, isSingle: boolean): string {\n const workspace = getEntityLabel('WORKSPACE')\n const subject = isSingle ? '' : ' all'\n if (state === 'shared') return `Hide${subject} from ${workspace} members`\n if (state === 'mixed') return `Make all visible to ${workspace} members (some already shared)`\n return `Make${subject} visible to ${workspace} members`\n}\n\n/**\n * Asks before hiding `count` documents from the workspace. A shared document is visible to every\n * member, so the confirmation names them: that is who loses access. Agents are not people and are\n * left out. Resolves true only when the user confirms.\n */\nexport function confirmHideFromMembers(\n confirm: BlocksEnvironment['confirm'],\n count: number,\n members: WorkspaceMember[]\n): Promise<boolean> {\n const workspace = getEntityLabel('WORKSPACE')\n const documentLabel = getEntityLabel('DOCUMENT', count === 1 ? 'SINGULAR' : 'PLURAL')\n const pronoun = count === 1 ? 'it' : 'them'\n const names = members\n .filter((member) => !isAgent(member.user))\n .map((member) => getUserDisplayName(member.user))\n const shown = names.slice(0, MAX_NAMES_IN_CONFIRM)\n const hiddenCount = names.length - shown.length\n const listed = hiddenCount > 0 ? [...shown, `${hiddenCount} more`] : shown\n const last = listed[listed.length - 1]\n const audienceList =\n listed.length > 2 ? `${listed.slice(0, -1).join(', ')}, and ${last}` : listed.join(' and ')\n const audience = names.length > 0 ? `Right now ${audienceList} can see ${pronoun}. ` : ''\n return confirm({\n message:\n `Hide ${count} ${documentLabel.toLowerCase()} from ${workspace} members? ${audience}` +\n `They will no longer be able to see ${pronoun}.`,\n title: 'Hide from members',\n })\n}\n\n/**\n * Who can see a single file, in plain words: the wording of the upload dialog's ShareToggle, so a\n * file reads the same before and after it is uploaded.\n */\nexport function visibilityAudience(\n shared: boolean,\n workspaceLabel: string = getEntityLabel('WORKSPACE')\n): string {\n return shared ? `Shared with ${workspaceLabel.toLowerCase()}` : 'Private to you'\n}\n\n/** Tooltip for a single file's share toggle: who can see it now, then what a click does. */\nexport function visibilityToggleTooltip(shared: boolean): string {\n const workspace = getEntityLabel('WORKSPACE').toLowerCase()\n return shared\n ? `${visibilityAudience(true)}: everyone in it can see this file. Click to make it private to you.`\n : `${visibilityAudience(false)}: only you can see this file. Click to share it with the ${workspace}.`\n}\n","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 { 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 { VisibilityToggle, getEntityLabel } from '@arbidocs/react/ui'\nimport { UploadShareNote } from './UploadFooter'\nimport { visibilityAudience } from './visibility'\n\nexport interface ShareToggleProps {\n isVisible: boolean\n onToggle: (visible: boolean) => void\n workspaceEntityLabel: string\n compact?: boolean\n}\n\n/** Visibility choice for an upload, with the plain-language consequence of each state. */\nexport function ShareToggle({\n isVisible,\n onToggle,\n workspaceEntityLabel,\n compact = false,\n}: ShareToggleProps) {\n const doc = getEntityLabel('DOCUMENT', 'PLURAL').toLowerCase()\n const workspace = workspaceEntityLabel.toLowerCase()\n const description = isVisible\n ? `Uploaded ${doc} will be shared with this ${workspace} — everyone in it, now and in the future.`\n : `Uploaded ${doc} stay private to you — not shared with this ${workspace}. You can change this later.`\n\n // The label states who can see the files in plain words, so it doesn't need a hover to read.\n // The inner toggle's own tooltip is off: it would replace the description tooltip above.\n const audience = visibilityAudience(isVisible, workspaceEntityLabel)\n\n const toggle = (\n <VisibilityToggle\n items={{ shared: isVisible }}\n onToggle={onToggle}\n showLabel={true}\n label={audience}\n showTooltip={false}\n />\n )\n\n // The footer is one row next to the Upload button, so there is no room for a card. The short\n // consequence sits under the toggle as visible text: a tooltip would need a hover, which touch\n // and keyboard users never get.\n if (compact) {\n const summary = isVisible\n ? `Everyone in this ${workspace} can see uploaded ${doc}.`\n : `Only you can see uploaded ${doc}.`\n return (\n <div data-testid=\"share-toggle\" className=\"flex max-w-[15rem] flex-col items-end gap-1\">\n {toggle}\n <p className=\"text-right text-xs text-muted-foreground\">{summary}</p>\n </div>\n )\n }\n\n return (\n <UploadShareNote description={description} compact={false}>\n {toggle}\n </UploadShareNote>\n )\n}\n","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 { 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 * Client-side detection of audio/video URLs (YouTube et al. or direct media\n * links) and a preview descriptor for rendering them natively in the\n * URL-upload dialog. Mirrors the backend's media detection (src/core/media_download.py)\n * so the frontend can preview before the file ever hits the backend.\n */\n\nexport type MediaPreview =\n | { kind: 'youtube'; embedUrl: string }\n | { kind: 'video'; src: string }\n | { kind: 'audio'; src: string }\n\nconst MEDIA_HOSTS = [\n 'youtube.com',\n 'youtu.be',\n 'vimeo.com',\n 'soundcloud.com',\n 'dailymotion.com',\n 'twitch.tv',\n]\nconst VIDEO_EXTENSIONS = ['.mp4', '.mpeg', '.mpg', '.webm', '.mov', '.avi', '.mkv', '.ogv']\nconst AUDIO_EXTENSIONS = ['.mp3', '.wav', '.m4a', '.aac', '.flac', '.ogg', '.oga']\n\nfunction normalizeHost(hostname: string): string {\n return hostname.toLowerCase().replace(/^(www|m)\\./, '')\n}\n\nfunction getYoutubeId(url: URL): string | null {\n const host = normalizeHost(url.hostname)\n if (host === 'youtu.be') return url.pathname.slice(1).split('/')[0] || null\n if (host === 'youtube.com' || host.endsWith('.youtube.com')) {\n if (url.pathname === '/watch') return url.searchParams.get('v')\n const segments = url.pathname.split('/').filter(Boolean)\n if (segments[0] === 'embed' || segments[0] === 'shorts' || segments[0] === 'v') {\n return segments[1] ?? null\n }\n }\n return null\n}\n\nfunction getExtension(pathname: string): string {\n const lower = pathname.toLowerCase()\n const lastDot = lower.lastIndexOf('.')\n const lastSlash = lower.lastIndexOf('/')\n return lastDot > lastSlash ? lower.slice(lastDot) : ''\n}\n\n/** Preview descriptor for media URLs we can render natively, otherwise null. */\nexport function getMediaPreview(rawUrl: string): MediaPreview | null {\n let url: URL\n try {\n url = new URL(rawUrl)\n } catch {\n return null\n }\n\n const youtubeId = getYoutubeId(url)\n if (youtubeId) {\n return { kind: 'youtube', embedUrl: `https://www.youtube.com/embed/${youtubeId}` }\n }\n\n const extension = getExtension(url.pathname)\n if (VIDEO_EXTENSIONS.includes(extension)) return { kind: 'video', src: rawUrl }\n if (AUDIO_EXTENSIONS.includes(extension)) return { kind: 'audio', src: rawUrl }\n\n return null\n}\n\n/**\n * True when a URL points at audio/video we should transcribe — including\n * streaming hosts we can't preview inline (e.g. SoundCloud). The backend\n * downloads these via yt-dlp.\n */\nexport function isMediaUrl(rawUrl: string): boolean {\n if (getMediaPreview(rawUrl)) return true\n try {\n const host = normalizeHost(new URL(rawUrl).hostname)\n return MEDIA_HOSTS.some((mediaHost) => host === mediaHost || host.endsWith(`.${mediaHost}`))\n } catch {\n return false\n }\n}\n","/**\n * \"Add from the internet\": web addresses to fetch into the workspace, checked as they are typed\n * (a missing scheme is added, a list pasted at once is split), with a preview of audio and video\n * links. The upload is the caller's; a failure keeps the dialog open with the error.\n */\n\nimport { Button } from '@arbidocs/react/ui'\nimport { useState, type ReactNode } from 'react'\nimport { Link } from 'lucide-react'\nimport { MediaPreviewView, UrlDialogTitle, UrlInputDialogView } from './import/UrlInputDialogView'\nimport { getMediaPreview, isMediaUrl } from './media-preview'\n\nexport interface UrlInputDialogProps {\n /**\n * Handle the submitted URLs. Return `false` (or reject) to keep the dialog open and show the\n * error inline; return void/true to close it. Async handlers are awaited, with a spinner on the\n * submit button while in flight.\n */\n onUrlsSubmit: (urls: string[]) => void | boolean | Promise<void | boolean>\n trigger?: ReactNode\n processing?: boolean\n /** Controlled open state; omit to let the dialog manage its own (trigger) state. */\n open?: boolean\n onOpenChange?: (open: boolean) => void\n /** The workspace the documents go to, named in the title (\"<icon> name / Add from the internet\"). */\n titleWorkspaceName?: string\n /** The workspace's icon beside its name. */\n titleIcon?: ReactNode\n}\n\nexport function UrlInputDialog({\n onUrlsSubmit,\n trigger,\n processing = false,\n open: controlledOpen,\n onOpenChange,\n titleWorkspaceName,\n titleIcon,\n}: UrlInputDialogProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false)\n // Controlled when `open` is provided (opened from the Add dropdown); otherwise\n // the dialog manages its own state via the trigger.\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = (next: boolean) => {\n onOpenChange?.(next)\n if (controlledOpen === undefined) setUncontrolledOpen(next)\n }\n const [urls, setUrls] = useState<string[]>([''])\n const [errors, setErrors] = useState<string[]>([])\n // In-flight + failure state for the dialog-owned upload (so the error shows\n // here, next to the URLs, instead of in a separate modal).\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n\n const preprocessUrl = (url: string): string => {\n let processedUrl = url.trim()\n\n // Add https:// if no protocol is specified\n if (processedUrl && !processedUrl.match(/^https?:\\/\\//i)) {\n processedUrl = 'https://' + processedUrl\n }\n\n // Encode spaces and other special characters in the URL\n // Split URL into parts to handle encoding properly\n try {\n new URL(processedUrl) // Validate URL structure\n // The URL constructor already handles encoding, but we'll ensure spaces are encoded\n processedUrl = processedUrl.replace(/ /g, '%20')\n return processedUrl\n } catch {\n // If URL is still invalid after preprocessing, encode spaces at minimum\n return processedUrl.replace(/ /g, '%20')\n }\n }\n\n const validateUrl = (url: string): { valid: boolean; error?: string } => {\n try {\n const urlObj = new URL(url)\n\n // Audio/video URLs (YouTube, direct media links, etc.) are downloaded and\n // transcribed server-side via yt-dlp — accept them regardless of extension.\n if (isMediaUrl(url)) {\n return { valid: true }\n }\n\n // Check if the URL has a supported file extension or is a web page\n const pathname = urlObj.pathname.toLowerCase()\n const supportedExtensions = [\n '.pdf',\n '.txt',\n '.md',\n '.html',\n '.doc',\n '.docx',\n '.rtf',\n '.ppt',\n '.pptx',\n '.xls',\n '.xlsx',\n // .zip is fetched from the URL by the browser and extracted by the\n // frontend zip worker; each entry is then uploaded as a normal file.\n '.zip',\n ]\n const hasFileExtension =\n pathname.includes('.') && pathname.lastIndexOf('.') > pathname.lastIndexOf('/')\n const hasValidExtension =\n !hasFileExtension || supportedExtensions.some((ext) => pathname.endsWith(ext))\n\n if (!hasValidExtension) {\n return {\n valid: false,\n error:\n 'File type not supported. Supported formats: PDF, DOC(X), PPT(X), XLS(X), RTF, TXT, MD, HTML, ZIP.',\n }\n }\n\n return { valid: true }\n } catch {\n return { valid: false, error: 'Invalid URL format' }\n }\n }\n\n const addUrlField = () => {\n setUrls([...urls, ''])\n setErrors([...errors, ''])\n }\n\n const removeUrlField = (index: number) => {\n setUrls(urls.filter((_, i) => i !== index))\n setErrors(errors.filter((_, i) => i !== index))\n }\n\n const updateUrl = (index: number, value: string) => {\n // Editing clears a prior submit failure so the stale error doesn't linger.\n if (submitError) setSubmitError(null)\n // Check if the value contains multiple URLs (comma or newline separated)\n const delimiters = /[,\\n]+/\n if (delimiters.test(value)) {\n // Split by comma or newline and filter out empty strings\n const urlList = value\n .split(delimiters)\n .map((u) => u.trim())\n .filter((u) => u.length > 0)\n\n if (urlList.length > 1) {\n // Replace current URLs array with the new list\n const newUrls = [...urls]\n newUrls.splice(index, 1, ...urlList)\n\n // Add empty slots if we're adding to the last field and need more\n if (index === urls.length - 1) {\n // Remove the empty last field since we're replacing it\n newUrls.push('')\n }\n\n setUrls(newUrls)\n // Clear errors for new fields\n const newErrors = [...errors]\n urlList.forEach((_, i) => {\n newErrors[index + i] = ''\n })\n setErrors(newErrors)\n return\n }\n }\n\n // Normal single URL update\n const newUrls = [...urls]\n newUrls[index] = value\n setUrls(newUrls)\n\n // Clear error for this field when user types\n if (errors[index]) {\n const newErrors = [...errors]\n newErrors[index] = ''\n setErrors(newErrors)\n }\n }\n\n const handleSubmit = async () => {\n const newErrors: string[] = []\n const validUrls: string[] = []\n\n urls.forEach((url, index) => {\n const trimmedUrl = url.trim()\n if (!trimmedUrl) {\n newErrors[index] = 'URL is required'\n } else {\n // Preprocess the URL to add https:// and encode spaces\n const processedUrl = preprocessUrl(trimmedUrl)\n const validation = validateUrl(processedUrl)\n\n if (!validation.valid) {\n newErrors[index] = validation.error || 'Invalid URL'\n } else {\n newErrors[index] = ''\n validUrls.push(processedUrl)\n }\n }\n })\n\n setErrors(newErrors)\n\n if (validUrls.length > 0 && !newErrors.some((error) => error)) {\n setSubmitError(null)\n setSubmitting(true)\n let ok: void | boolean\n try {\n ok = await onUrlsSubmit(validUrls)\n } catch {\n ok = false\n }\n setSubmitting(false)\n if (ok === false) {\n // Keep the dialog open so the user can fix the URLs and retry.\n setSubmitError('Failed to upload documents from URLs. Please check the URLs and try again.')\n return\n }\n setOpen(false)\n // Reset form\n setUrls([''])\n setErrors([])\n }\n }\n\n // A controlled dialog opened from elsewhere (e.g. the Add dropdown) passes `open` and no\n // trigger; it must NOT fall back to a default \"Add from URL\" button.\n const showTrigger = trigger !== undefined || controlledOpen === undefined\n const title = titleWorkspaceName ? (\n <UrlDialogTitle icon={titleIcon} workspaceName={titleWorkspaceName} />\n ) : undefined\n\n return (\n <UrlInputDialogView\n open={open}\n onOpenChange={setOpen}\n trigger={\n showTrigger\n ? trigger || (\n <Button variant=\"outline\" size=\"sm\" disabled={processing}>\n <Link className=\"w-4 h-4 mr-2\" />\n {processing ? 'Processing...' : 'Add from URL'}\n </Button>\n )\n : undefined\n }\n title={title}\n urls={urls}\n errors={errors}\n onUrlChange={updateUrl}\n onUrlPaste={updateUrl}\n onAddUrl={addUrlField}\n onRemoveUrl={removeUrlField}\n renderPreview={(url, index) => {\n const trimmed = url.trim()\n const preview = trimmed ? getMediaPreview(preprocessUrl(trimmed)) : null\n if (!preview) return null\n return (\n <MediaPreviewView\n kind={preview.kind}\n src={preview.kind === 'youtube' ? preview.embedUrl : preview.src}\n testId={`url-media-preview-${index}`}\n />\n )\n }}\n submitError={submitError}\n isSubmitting={submitting}\n onSubmit={handleSubmit}\n />\n )\n}\n","/**\n * PrivacyExplainerModal Component\n *\n * A short, plain-language explainer of ARBI's privacy guarantees, surfaced from\n * the empty-workspace upload screen. Deliberately NOT a privacy policy — three\n * one-line promises a user can grasp at a glance.\n */\n\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { useState } from 'react'\nimport { KeyRound, Eye, ShieldCheck, BrainCircuit, Info, ChevronRight } from 'lucide-react'\n\nconst POINTS = [\n {\n icon: KeyRound,\n heading: 'Only you hold the key',\n body: 'You choose who to invite to a workspace and the role they hold. Each workspace is encrypted with its own key, held only by its members — so no one outside it, including ARBI administrators, can access its confidential data.',\n },\n {\n icon: Eye,\n heading: 'You decide what to share',\n body: 'Within a workspace, conversations are private by default and documents are shared with collaborators. Anything you keep private stays invisible to other members, even the owner.',\n },\n {\n icon: ShieldCheck,\n heading: 'Your data stays in the UK',\n body: \"By default, the AI that processes your files runs on ARBI's own infrastructure in the United Kingdom. Third-party models (OpenAI, Anthropic or Google) are optional; we select providers with the strongest data-protection terms, but recommend reviewing each provider's data-retention policy before enabling one.\",\n },\n {\n icon: BrainCircuit,\n heading: 'We never train AI on your data',\n body: 'Your files and conversations are never used to train AI models.',\n },\n]\n\nexport function PrivacyExplainerModal() {\n const [open, setOpen] = useState(false)\n\n return (\n <>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n className=\"gap-1.5 text-primary hover:text-primary\"\n data-testid=\"privacy-explainer-button\"\n >\n <Info className=\"w-4 h-4\" />\n Privacy Guarantee\n <ChevronRight className=\"w-3.5 h-3.5 opacity-70\" />\n </Button>\n\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"sm:max-w-lg\" data-testid=\"privacy-explainer-dialog\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <ShieldCheck className=\"h-5 w-5 text-primary\" />\n Your data, your keys\n </DialogTitle>\n <DialogDescription>How ARBI protects confidentiality.</DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-5 py-1\">\n {POINTS.map(({ icon: Icon, heading, body }) => (\n <div key={heading} className=\"flex gap-3\">\n <Icon className=\"mt-0.5 h-5 w-5 shrink-0 text-primary\" />\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-semibold leading-none\">{heading}</p>\n <p className=\"text-sm text-muted-foreground\">{body}</p>\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"flex items-center justify-between gap-2 pt-1\">\n {/* The stable-name whitepaper on arbicity.com (also in its\n sitemap) — unlike the date-stamped copies, this URL survives\n new releases. */}\n <a\n href=\"https://arbicity.com/ARBI-Security-Whitepaper.pdf\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline\"\n data-testid=\"privacy-explainer-whitepaper-link\"\n >\n Full security details →\n </a>\n <Button\n type=\"button\"\n onClick={() => setOpen(false)}\n data-testid=\"privacy-explainer-dismiss\"\n >\n Got it\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n"]}
|