@arbidocs/blocks 0.4.154 → 0.4.155

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/chunk-6HMCF4AJ.js +1720 -0
  2. package/dist/chunk-6HMCF4AJ.js.map +1 -0
  3. package/dist/{chunk-BDA3RHYD.cjs → chunk-MUDEL7UL.cjs} +25 -884
  4. package/dist/chunk-MUDEL7UL.cjs.map +1 -0
  5. package/dist/{chunk-RE7NULEY.js → chunk-W7CWGURO.js} +28 -873
  6. package/dist/chunk-W7CWGURO.js.map +1 -0
  7. package/dist/chunk-WV4TD2HZ.cjs +1785 -0
  8. package/dist/chunk-WV4TD2HZ.cjs.map +1 -0
  9. package/dist/connect/index.cjs +1178 -16
  10. package/dist/connect/index.cjs.map +1 -1
  11. package/dist/connect/index.d.ts +1 -0
  12. package/dist/connect/index.js +1160 -12
  13. package/dist/connect/index.js.map +1 -1
  14. package/dist/connect/viewer.cjs +40 -44
  15. package/dist/connect/viewer.cjs.map +1 -1
  16. package/dist/connect/viewer.js +2 -6
  17. package/dist/connect/viewer.js.map +1 -1
  18. package/dist/connection/files/DocumentSyncGlyph.d.ts +28 -0
  19. package/dist/connection/files/explorer/ConnectedFilesExplorer.d.ts +56 -0
  20. package/dist/connection/files/explorer/FileTiles.d.ts +87 -0
  21. package/dist/connection/files/index.d.ts +5 -0
  22. package/dist/connection/files/store.d.ts +27 -0
  23. package/dist/connection/files/support.d.ts +38 -0
  24. package/dist/files/DocStatusIcon.d.ts +5 -4
  25. package/dist/files/FailedStageIcon.d.ts +26 -0
  26. package/dist/files/folders/FolderProviderIcon.d.ts +29 -0
  27. package/dist/files/folders/folderPaths.d.ts +86 -0
  28. package/dist/files/folders/index.d.ts +2 -0
  29. package/dist/files/index.cjs +326 -238
  30. package/dist/files/index.d.ts +5 -0
  31. package/dist/files/index.js +2 -2
  32. package/dist/files/permissions.d.ts +28 -0
  33. package/dist/files/recently-deleted.d.ts +7 -0
  34. package/dist/files/visibility.d.ts +31 -0
  35. package/dist/index.cjs +38 -38
  36. package/dist/index.js +2 -2
  37. package/node_modules/@arbidocs/coedit/package.json +1 -1
  38. package/package.json +6 -5
  39. package/dist/chunk-BDA3RHYD.cjs.map +0 -1
  40. package/dist/chunk-JGOST4IL.js +0 -648
  41. package/dist/chunk-JGOST4IL.js.map +0 -1
  42. package/dist/chunk-RE7NULEY.js.map +0 -1
  43. package/dist/chunk-YAEXSCUW.cjs +0 -677
  44. package/dist/chunk-YAEXSCUW.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"],"names":["jsxs","jsx","cn","Popover","PopoverTrigger","Fragment","FolderOpen","PopoverContent","Tooltip","TooltipTrigger","TooltipContent","Check","FolderBreadcrumb","useState","Button","ExplorerScroller","ExplorerMarquee","useRef","FailedStageIcon"],"mappings":"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","file":"chunk-6HMCF4AJ.js","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"]}