@arbidocs/blocks 0.5.52 → 0.5.53

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 (80) hide show
  1. package/dist/{ConnectedNativeDocxComparison-E3J2DKJU.js → ConnectedNativeDocxComparison-URPACTBQ.js} +8 -8
  2. package/dist/{ConnectedStreamedWordArtifact-OLTI5TGZ.js.map → ConnectedNativeDocxComparison-URPACTBQ.js.map} +1 -1
  3. package/dist/{ConnectedNativeDocxComparison-B3PXV6QS.cjs → ConnectedNativeDocxComparison-YROKRZOV.cjs} +9 -9
  4. package/dist/{ConnectedNativeDocxComparison-B3PXV6QS.cjs.map → ConnectedNativeDocxComparison-YROKRZOV.cjs.map} +1 -1
  5. package/dist/{ConnectedNativeDocxEditor-USZ2EO3T.js → ConnectedNativeDocxEditor-A3F2QISR.js} +7 -7
  6. package/dist/{ConnectedNativeDocxEditor-USZ2EO3T.js.map → ConnectedNativeDocxEditor-A3F2QISR.js.map} +1 -1
  7. package/dist/{ConnectedNativeDocxEditor-3ZQQ3IKM.cjs → ConnectedNativeDocxEditor-MJ3LAXTF.cjs} +9 -9
  8. package/dist/{ConnectedNativeDocxEditor-3ZQQ3IKM.cjs.map → ConnectedNativeDocxEditor-MJ3LAXTF.cjs.map} +1 -1
  9. package/dist/{ConnectedStreamedWordArtifact-OLTI5TGZ.js → ConnectedStreamedWordArtifact-GQWYYVT5.js} +8 -8
  10. package/dist/{ConnectedNativeDocxComparison-E3J2DKJU.js.map → ConnectedStreamedWordArtifact-GQWYYVT5.js.map} +1 -1
  11. package/dist/{ConnectedStreamedWordArtifact-WP7XISA3.cjs → ConnectedStreamedWordArtifact-KPVL377Z.cjs} +9 -9
  12. package/dist/ConnectedStreamedWordArtifact-KPVL377Z.cjs.map +1 -0
  13. package/dist/{DocumentReviewCard-WHDZA46J.cjs → DocumentReviewCard-IWQFZO3X.cjs} +3 -3
  14. package/dist/{DocumentReviewCard-WHDZA46J.cjs.map → DocumentReviewCard-IWQFZO3X.cjs.map} +1 -1
  15. package/dist/{DocumentReviewCard-PZFDQMLX.js → DocumentReviewCard-TBU56QQG.js} +3 -3
  16. package/dist/{DocumentReviewCard-PZFDQMLX.js.map → DocumentReviewCard-TBU56QQG.js.map} +1 -1
  17. package/dist/WorkspaceTableView-4DZ4YODA.js +1 -1
  18. package/dist/WorkspaceTableView-XHEVFCRP.cjs +1 -1
  19. package/dist/agents/index.cjs +335 -335
  20. package/dist/agents/index.js +5 -5
  21. package/dist/calls/index.cjs +1 -1
  22. package/dist/calls/index.js +1 -1
  23. package/dist/{chunk-ED4TE7XG.cjs → chunk-2DRTKD2W.cjs} +7 -7
  24. package/dist/{chunk-ED4TE7XG.cjs.map → chunk-2DRTKD2W.cjs.map} +1 -1
  25. package/dist/{chunk-PEBVG2FZ.cjs → chunk-2KQH2Z6Y.cjs} +4 -4
  26. package/dist/{chunk-PEBVG2FZ.cjs.map → chunk-2KQH2Z6Y.cjs.map} +1 -1
  27. package/dist/{chunk-JA45SE3Q.js → chunk-2SAVSXZF.js} +3 -3
  28. package/dist/{chunk-JA45SE3Q.js.map → chunk-2SAVSXZF.js.map} +1 -1
  29. package/dist/{chunk-JS7KJRKG.js → chunk-75Z5AUMM.js} +3 -3
  30. package/dist/{chunk-JS7KJRKG.js.map → chunk-75Z5AUMM.js.map} +1 -1
  31. package/dist/{chunk-NX2RTI3E.js → chunk-7WMEKKX5.js} +3 -3
  32. package/dist/{chunk-NX2RTI3E.js.map → chunk-7WMEKKX5.js.map} +1 -1
  33. package/dist/{chunk-WADQ6T5Q.js → chunk-BAKRM5XB.js} +3 -3
  34. package/dist/{chunk-WADQ6T5Q.js.map → chunk-BAKRM5XB.js.map} +1 -1
  35. package/dist/{chunk-JJ3BM4O4.js → chunk-FCHIMF7Q.js} +3 -3
  36. package/dist/{chunk-JJ3BM4O4.js.map → chunk-FCHIMF7Q.js.map} +1 -1
  37. package/dist/{chunk-YIPMYI7I.cjs → chunk-JEXP72GJ.cjs} +4 -4
  38. package/dist/{chunk-YIPMYI7I.cjs.map → chunk-JEXP72GJ.cjs.map} +1 -1
  39. package/dist/{chunk-P35R4CNF.js → chunk-KOKGEFSE.js} +4 -4
  40. package/dist/{chunk-P35R4CNF.js.map → chunk-KOKGEFSE.js.map} +1 -1
  41. package/dist/{chunk-UIGZHXIA.js → chunk-LXQGAYUZ.js} +6 -6
  42. package/dist/{chunk-UIGZHXIA.js.map → chunk-LXQGAYUZ.js.map} +1 -1
  43. package/dist/{chunk-O56XBFEC.js → chunk-MGHRGZPH.js} +4 -4
  44. package/dist/{chunk-O56XBFEC.js.map → chunk-MGHRGZPH.js.map} +1 -1
  45. package/dist/{chunk-PC3RCNCQ.js → chunk-O7KU7QW2.js} +4 -4
  46. package/dist/{chunk-PC3RCNCQ.js.map → chunk-O7KU7QW2.js.map} +1 -1
  47. package/dist/{chunk-Q5MGOAZW.cjs → chunk-PTNV3TT5.cjs} +36 -36
  48. package/dist/{chunk-Q5MGOAZW.cjs.map → chunk-PTNV3TT5.cjs.map} +1 -1
  49. package/dist/{chunk-FCOP4ZJD.cjs → chunk-R3247EN3.cjs} +13 -13
  50. package/dist/{chunk-FCOP4ZJD.cjs.map → chunk-R3247EN3.cjs.map} +1 -1
  51. package/dist/{chunk-BKILOHZ3.cjs → chunk-ST6ELFDF.cjs} +4 -4
  52. package/dist/{chunk-BKILOHZ3.cjs.map → chunk-ST6ELFDF.cjs.map} +1 -1
  53. package/dist/{chunk-6ODV5TIC.cjs → chunk-VGFU6JFI.cjs} +5 -5
  54. package/dist/{chunk-6ODV5TIC.cjs.map → chunk-VGFU6JFI.cjs.map} +1 -1
  55. package/dist/{chunk-TXJK77YJ.js → chunk-VT3TOWWF.js} +3 -3
  56. package/dist/{chunk-TXJK77YJ.js.map → chunk-VT3TOWWF.js.map} +1 -1
  57. package/dist/{chunk-22WFFNYY.cjs → chunk-VVNG7LMP.cjs} +18 -18
  58. package/dist/{chunk-22WFFNYY.cjs.map → chunk-VVNG7LMP.cjs.map} +1 -1
  59. package/dist/{chunk-N5CKIKQB.cjs → chunk-WHJMV6TX.cjs} +10 -10
  60. package/dist/{chunk-N5CKIKQB.cjs.map → chunk-WHJMV6TX.cjs.map} +1 -1
  61. package/dist/{chunk-F72ZD5Q2.cjs → chunk-YD3RN2FY.cjs} +3 -3
  62. package/dist/{chunk-F72ZD5Q2.cjs.map → chunk-YD3RN2FY.cjs.map} +1 -1
  63. package/dist/connect/docx.cjs +11 -11
  64. package/dist/connect/docx.js +7 -7
  65. package/dist/connect/index.cjs +279 -279
  66. package/dist/connect/index.js +15 -15
  67. package/dist/connect/viewer.cjs +4 -4
  68. package/dist/connect/viewer.js +4 -4
  69. package/dist/connection/facts/useFactFilters.d.ts +10 -1
  70. package/dist/facts/index.cjs +55 -55
  71. package/dist/facts/index.js +3 -3
  72. package/dist/index.cjs +400 -400
  73. package/dist/index.js +7 -7
  74. package/dist/settings/index.cjs +1 -1
  75. package/dist/settings/index.js +1 -1
  76. package/dist/workflow-canvas/index.cjs +30 -30
  77. package/dist/workflow-canvas/index.js +8 -8
  78. package/node_modules/@arbidocs/coedit/package.json +1 -1
  79. package/package.json +5 -5
  80. package/dist/ConnectedStreamedWordArtifact-WP7XISA3.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/facts/FactSourceGroup.tsx","../src/facts/fact-citations.ts","../src/facts/cited-version-ref.ts","../src/facts/FactComposer.tsx","../src/facts/fact-date.ts","../src/facts/FactDateInput.tsx","../src/facts/FactsBulkBar.tsx","../src/facts/FactsEmptyState.tsx","../src/facts/FactsFieldsButton.tsx","../src/facts/FactTimelineViews.tsx","../src/facts/FactsViewToggle.tsx","../src/facts/FactsToolbar.tsx","../src/facts/fact-table-column-resize.ts","../src/facts/FactLabelsCell.tsx","../src/facts/factColumns.tsx","../src/facts/FactRowActions.tsx","../src/facts/fact-chronology.ts"],"names":["document","jsxs","testIdOr","jsx","X","unwrapCitationLinks","versionRef","cn","Tooltip","TooltipTrigger","Info","TooltipContent","Button","Loader2","Trash2","detectTimeZone","useMemo","useState","ChevronLeft","ChevronRight","listTimeZones","formatSpan","Popover","PopoverTrigger","CalendarDays","PopoverContent","Input","SelectionBar","Fragment","SelectionBarAction","Paperclip","Tags","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuItem","FolderUp","DropdownMenuSeparator","CalendarClock","Scale","Lightbulb","Milestone","ArrowRight","Columns3","ChevronDown","Command","CommandList","CommandGroup","CommandItem","RotateCcw","CommandSeparator","Check","useRef","useEffect","TimelineCalendar","TimelineGantt","Table2","CalendarRange","GanttChartSquare","Search","ViewToggle","observeResize","FilterInput","BookMarked","TabHeader","Plus","memo","FactLabelsCell","PencilLine","CommandInput","CommandEmpty","decodeWhitespaceEntities","Quote","MoreVertical","Pencil"],"mappings":"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","file":"chunk-F72ZD5Q2.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { X } from 'lucide-react'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactSourceGroupLabels {\n remove: string\n wholeDocument: string\n}\n\nexport const DEFAULT_FACT_SOURCE_GROUP_LABELS: FactSourceGroupLabels = {\n remove: 'Remove this document',\n wholeDocument: 'Whole document — open it to cite specific passages',\n}\n\nexport interface FactSourceGroupTestIds {\n root: (docId: string) => string\n remove: (docId: string) => string\n}\n\nexport interface FactSourceGroupProps {\n docId: string\n /** The document label/pill (the app supplies its entity pill). */\n document: ReactNode\n /** True when this document is the one on display in the viewer. */\n isViewing?: boolean\n /** Remove this document from the sources. Absent: a read-only list, no remove control. */\n onRemove?: () => void\n /** The FactPassageItem children; when absent a \"whole document\" hint shows. */\n children?: ReactNode\n /** Whether any passages are cited from this document. */\n hasPassages: boolean\n labels?: Partial<FactSourceGroupLabels>\n testIds?: Partial<FactSourceGroupTestIds>\n}\n\n/** One cited document in the sources list: its label, a remove control and its passages. */\nexport function FactSourceGroup({\n docId,\n document,\n isViewing,\n onRemove,\n children,\n hasPassages,\n labels,\n testIds,\n}: FactSourceGroupProps) {\n const l = { ...DEFAULT_FACT_SOURCE_GROUP_LABELS, ...labels }\n return (\n <div\n className=\"flex flex-col gap-1\"\n data-testid={testIdOr(testIds?.root?.(docId), { testId: `citation-doc-${docId}` })}\n data-viewing={isViewing || undefined}\n data-slot=\"fact-source-group\"\n >\n <div className=\"flex items-center gap-1.5 px-1 text-sm\">\n {document}\n <span className=\"flex-1\" />\n {onRemove && (\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={l.remove}\n data-testid={testIdOr(testIds?.remove?.(docId), {\n testId: `fact-source-remove-${docId}`,\n })}\n className=\"shrink-0 rounded p-0.5 hover:bg-destructive/20 hover:text-destructive pointer-coarse:p-3\"\n >\n <X className=\"size-3\" />\n </button>\n )}\n </div>\n {hasPassages ? (\n children\n ) : (\n <span className=\"px-2 text-xs text-muted-foreground\">{l.wholeDocument}</span>\n )}\n </div>\n )\n}\n","/**\n * Fact citations: the documents a fact draws on, each with the passages cited\n * from it. Mirrors the backend `CitationSources`:\n *\n * [{ doc_ext_id, chunks: [{ chunk_id, page }] }]\n *\n * An EMPTY `chunks` list means the whole document is the source (the picker's\n * checkbox). Order matters: best document first, best chunk first within it.\n *\n * {@link buildFactCitations} produces that from a chat answer at save time —\n * the fact's `text` is CLEAN (markers stripped): that is what the table shows,\n * the search indexes and the assistant reads. The helpers below are the only\n * way the UI should edit a citation list, so the two invariants (a document\n * appears once; a chunk appears once within it) hold everywhere.\n */\nimport { unwrapCitationLinks } from '@arbidocs/react/artifacts'\n\n/** One cited passage — mirrors the backend `CitedChunk`. */\nexport interface FactCitedChunk {\n chunk_id: string\n page?: number | null\n}\n\n/** One cited document — mirrors the backend `CitedDocument`. */\nexport interface FactCitedDoc {\n doc_ext_id: string\n /** The document version quoted; missing = its current version (the backend pins it on save). */\n version?: number | null\n chunks: FactCitedChunk[]\n}\n\nexport type FactCitations = FactCitedDoc[]\n\ntype MaybeCitations = FactCitations | null | undefined\n\n/**\n * Adopt a server citation list as a local one. The generated `CitedDocument`\n * leaves `chunks` optional (a whole-document source may omit it); everything in\n * the UI wants it present, so it is filled in ONCE, here, where server facts\n * enter the composer — rather than casting at every call site.\n */\nexport function toFactCitations(\n citations:\n | { doc_ext_id: string; version?: number | null; chunks?: FactCitedChunk[] | null }[]\n | null\n | undefined\n): FactCitations | null {\n if (!citations) return null\n return citations.map((d) => ({\n doc_ext_id: d.doc_ext_id,\n ...(d.version ? { version: d.version } : {}),\n chunks: d.chunks ?? [],\n }))\n}\n\n/** A whole-document source: the picker ticked it without choosing passages. */\nexport function isWholeDoc(doc: FactCitedDoc): boolean {\n return doc.chunks.length === 0\n}\n\nexport function docIdsOf(citations: MaybeCitations): string[] {\n return (citations ?? []).map((d) => d.doc_ext_id)\n}\n\nexport function chunkIdsOf(citations: MaybeCitations): string[] {\n return (citations ?? []).flatMap((d) => d.chunks.map((c) => c.chunk_id))\n}\n\nexport function hasChunk(citations: MaybeCitations, chunkId: string): boolean {\n return (citations ?? []).some((d) => d.chunks.some((c) => c.chunk_id === chunkId))\n}\n\n/** Cite a whole document. No-op when it is already a source. */\nexport function withDoc(citations: MaybeCitations, docExtId: string): FactCitations {\n const list = citations ?? []\n if (list.some((d) => d.doc_ext_id === docExtId)) return list\n return [...list, { doc_ext_id: docExtId, chunks: [] }]\n}\n\n/** Drop a document and every passage cited from it. Null once nothing remains. */\nexport function withoutDoc(citations: MaybeCitations, docExtId: string): FactCitations | null {\n const remaining = (citations ?? []).filter((d) => d.doc_ext_id !== docExtId)\n return remaining.length ? remaining : null\n}\n\n/** Cite a passage; creates the document entry if needed. No-op on a duplicate. */\nexport function withChunk(\n citations: MaybeCitations,\n docExtId: string,\n chunk: FactCitedChunk\n): FactCitations {\n const list = citations ?? []\n const idx = list.findIndex((d) => d.doc_ext_id === docExtId)\n if (idx === -1) return [...list, { doc_ext_id: docExtId, chunks: [chunk] }]\n const doc = list[idx]\n if (doc.chunks.some((c) => c.chunk_id === chunk.chunk_id)) return list\n const next = [...list]\n next[idx] = { ...doc, chunks: [...doc.chunks, chunk] }\n return next\n}\n\n/**\n * Un-cite a passage. By default the document STAYS a source (as a whole-doc\n * reference) when it loses its last passage — removing the source itself is a\n * separate act (`withoutDoc`). Pass `keepDoc: false` to drop it too.\n */\nexport function withoutChunk(\n citations: MaybeCitations,\n chunkId: string,\n opts: { keepDoc?: boolean } = {}\n): FactCitations | null {\n const keepDoc = opts.keepDoc ?? true\n const list = citations ?? []\n if (!hasChunk(list, chunkId)) return citations ?? null\n const next: FactCitations = []\n for (const doc of list) {\n if (!doc.chunks.some((c) => c.chunk_id === chunkId)) {\n next.push(doc)\n continue\n }\n const chunks = doc.chunks.filter((c) => c.chunk_id !== chunkId)\n if (chunks.length || keepDoc) next.push({ ...doc, chunks })\n }\n return next.length ? next : null\n}\n\n/**\n * Repair a bold run whose closing `**`/`__` sits directly between a punctuation\n * character and a word character, e.g. `**Mr. Kantor, Esq.**and`. CommonMark\n * treats that closer as NOT right-flanking and leaves both delimiters literal.\n * The chat never shows this because the citation marker supplied a `]`\n * boundary; a fact loses it the moment the marker is stripped. A no-op on\n * well-formed markdown.\n */\nfunction repairBoldFlanking(md: string): string {\n return md.replace(/([.,;:!?\"'’”)\\]])(\\*\\*|__)(?=[A-Za-z0-9])/g, '$1$2 ')\n}\n\n/**\n * A chat lead-in such as \"Here's a short overview:\" that introduces the answer\n * body. A fact's label is its first line, so the lead-in would title the fact.\n * Only a single colon-ended line in that shape is dropped, and only when a body\n * follows it.\n */\nconst CHAT_LEAD_IN =\n /^(?:here(?:'s| is| are)|below (?:is|are)|sure|certainly)\\b[^\\n]*:[ \\t]*(?:\\n+|$)/i\n\nfunction dropChatLeadIn(md: string): string {\n const body = md.replace(CHAT_LEAD_IN, '')\n return body.trim() ? body : md\n}\n\ninterface RawChunk {\n chunk_id?: string\n metadata?: { chunk_ext_id?: string; doc_ext_id?: string | null; page_number?: number | null }\n}\n\n/**\n * Build a fact's clean text + citations from an assistant answer.\n *\n * @param content Answer markdown, WITH `[text](#cite-N)` markers.\n * @param activeCitations `model_citations`: citation number → chunk_ids.\n * @param citationData Retrieval chunks, keyed by file (holds the metadata).\n */\nexport function buildFactCitations(\n content: string,\n activeCitations: Record<string, string[]> | null,\n citationData: Record<string, unknown>\n): { text: string; citations: FactCitations | null } {\n const text = dropChatLeadIn(repairBoldFlanking(unwrapCitationLinks(content)).trim()).trim()\n if (!activeCitations) return { text, citations: null }\n\n // chunk id → {doc_ext_id, page}, first occurrence wins. A citation's chunk_ids\n // key against a chunk's `metadata.chunk_ext_id` (the same join the chat's\n // renderer uses); the top-level `chunk_id` is a fallback for older payloads.\n const chunkMeta = new Map<string, { doc_ext_id: string | null; page: number | null }>()\n for (const chunks of Object.values(citationData)) {\n if (!Array.isArray(chunks)) continue\n for (const chunk of chunks as RawChunk[]) {\n const meta = {\n doc_ext_id: chunk.metadata?.doc_ext_id ?? null,\n page: chunk.metadata?.page_number ?? null,\n }\n for (const key of [chunk.metadata?.chunk_ext_id, chunk.chunk_id]) {\n if (key && !chunkMeta.has(key)) chunkMeta.set(key, meta)\n }\n }\n }\n\n // Citation order, grouped by document, deduped by chunk. A chunk whose document\n // is unknown cannot be cited (every chunk belongs to exactly one document).\n let citations: FactCitations | null = null\n for (const chunkIds of Object.values(activeCitations)) {\n for (const chunkId of chunkIds) {\n const meta = chunkMeta.get(chunkId)\n if (!meta?.doc_ext_id) continue\n citations = withChunk(citations, meta.doc_ext_id, { chunk_id: chunkId, page: meta.page })\n }\n }\n return { text, citations }\n}\n","/**\n * What to open for a cited passage: a document keeps one id across its versions, so a passage\n * quoted from an older version opens that version (`doc-…@v{n}`, read-only in the viewer), and one\n * from the current version (or with no version) opens the document itself.\n */\nimport { versionRef } from '@arbidocs/react/artifacts'\n\nexport function citedVersionRef(\n docId: string,\n version: number | null | undefined,\n currentVersion: number | null | undefined\n): string {\n if (!version) return docId\n // Unknown current version: name the version exactly (the viewer opens the current one as itself).\n return currentVersion != null && currentVersion === version ? docId : versionRef(docId, version)\n}\n","import type { ReactNode, Ref } from 'react'\nimport { Info, Loader2, Trash2 } from 'lucide-react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactComposerLabels {\n shared: string\n verified: string\n dates: string\n deleteFact: string\n cancel: string\n saveFact: string\n saving: string\n addFact: string\n adding: string\n}\n\nexport const DEFAULT_FACT_COMPOSER_LABELS: FactComposerLabels = {\n shared: 'Shared',\n verified: 'Verified',\n dates: 'Dates',\n deleteFact: 'Delete fact',\n cancel: 'Cancel',\n saveFact: 'Save fact',\n saving: 'Saving…',\n addFact: 'Add fact',\n adding: 'Adding…',\n}\n\nexport interface FactComposerTestIds {\n tags: string\n delete: string\n save: string\n error: string\n}\n\nexport interface FactSourcesRowLabels {\n sources: string\n hintButton: string\n hint: string\n}\n\nexport const DEFAULT_FACT_SOURCES_ROW_LABELS: FactSourcesRowLabels = {\n sources: 'Sources',\n hintButton: 'How to add sources',\n hint: \"In the picker, tick a document's checkbox to add it as a source, or click its name to just open it. Inside a document, click a passage to add it — shift-click to take a whole range. Add as many as you like, from as many documents as you like.\",\n}\n\n/** Composer field: the name stacked above its control (\"Labels\", \"Dates\"...). */\nexport function FactFieldRow({\n label,\n children,\n className,\n}: {\n label: string\n children: ReactNode\n className?: string\n}) {\n return (\n <div className={cn('flex flex-col gap-1.5', className)} data-slot=\"fact-field-row\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n <div className=\"min-w-0\">{children}</div>\n </div>\n )\n}\n\nexport interface FactSourcesRowProps {\n /** The show/hide-sources toggle. */\n toggle: ReactNode\n /** The document picker. */\n picker: ReactNode\n labels?: Partial<FactSourcesRowLabels>\n /** Test id of the hint button (default `facts-source-hint`). */\n hintTestId?: string\n}\n\n/** Sources label (with passage-collection guidance), the sources toggle and the picker. */\nexport function FactSourcesRow({ toggle, picker, labels, hintTestId }: FactSourcesRowProps) {\n const l = { ...DEFAULT_FACT_SOURCES_ROW_LABELS, ...labels }\n return (\n <div className=\"flex flex-col gap-1.5\" data-slot=\"fact-sources-row\">\n <span className=\"flex items-center gap-1 text-sm font-medium text-foreground\">\n {l.sources}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.hintButton}\n className=\"text-muted-foreground hover:text-foreground\"\n data-testid={testIdOr(hintTestId, { testId: 'facts-source-hint' })}\n >\n <Info className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{l.hint}</TooltipContent>\n </Tooltip>\n </span>\n <div className=\"flex items-start gap-3\">\n {toggle}\n <div className=\"min-w-0 flex-1\">{picker}</div>\n </div>\n </div>\n )\n}\n\nexport interface FactComposerProps {\n /** Whether the composer is open (it stays mounted so it animates both ways). */\n isOpen: boolean\n /** Ref to the panel (used to keep it measured/focus-managed by the page). */\n panelRef?: Ref<HTMLDivElement>\n /** The WYSIWYG fact editor, with its sources row. */\n editor: ReactNode\n /** The labels picker row. */\n labels: ReactNode\n /** The Shared switch (label is added here). */\n sharedToggle: ReactNode\n /** The Verified switch (label is added here). */\n verifiedToggle: ReactNode\n /** The date picker. */\n dateInput: ReactNode\n /** Editing an existing fact (shows Delete, \"Save fact\"). */\n isEditing: boolean\n canSave: boolean\n isSaving: boolean\n isDeleting: boolean\n onSave: () => void\n onCancel: () => void\n onDelete: () => void\n error?: string | null\n uiLabels?: Partial<FactComposerLabels>\n testIds?: Partial<FactComposerTestIds>\n}\n\n/**\n * The inline fact composer: editor on top, then labels + Shared / Verified, then the date with\n * Cancel / Save (and Delete when editing). Always mounted; the grid-rows transition animates it\n * open and closed symmetrically (a conditional mount could only animate one way).\n */\nexport function FactComposer({\n isOpen,\n panelRef,\n editor,\n labels,\n sharedToggle,\n verifiedToggle,\n dateInput,\n isEditing,\n canSave,\n isSaving,\n isDeleting,\n onSave,\n onCancel,\n onDelete,\n error,\n uiLabels: labelOverrides,\n testIds,\n}: FactComposerProps) {\n const l = { ...DEFAULT_FACT_COMPOSER_LABELS, ...labelOverrides }\n return (\n <div\n className={cn(\n 'grid shrink-0 transition-[grid-template-rows,opacity] duration-500 ease-in-out',\n isOpen ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'\n )}\n data-slot=\"fact-composer\"\n >\n <div className=\"overflow-hidden\">\n <div\n ref={panelRef}\n className=\"facts-composer flex flex-col gap-4 border-b border-border bg-muted px-4 py-4\"\n >\n <div className=\"flex flex-col gap-3\">\n {editor}\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n <div\n data-testid={testIdOr(testIds?.tags, { testId: 'facts-page-composer-tags' })}\n className=\"min-w-[14rem] flex-1\"\n >\n {labels}\n </div>\n <div className=\"flex shrink-0 items-center gap-6\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {sharedToggle}\n {l.shared}\n </div>\n <div className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {verifiedToggle}\n {l.verified}\n </div>\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-2\">\n <div className=\"flex min-w-[10rem] flex-1 flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{l.dates}</span>\n {dateInput}\n </div>\n <div className=\"flex shrink-0 items-center gap-2 self-end max-sm:w-full max-sm:justify-end\">\n {isEditing && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"size-7 p-0 text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:size-11\"\n onClick={onDelete}\n disabled={isDeleting}\n data-testid={testIdOr(testIds?.delete, {\n testId: 'facts-page-composer-delete',\n })}\n aria-label={l.deleteFact}\n title={l.deleteFact}\n >\n {isDeleting ? (\n <Loader2 className=\"size-3.5 animate-spin\" />\n ) : (\n <Trash2 className=\"size-3.5\" />\n )}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 pointer-coarse:h-11\"\n onClick={onCancel}\n >\n {l.cancel}\n </Button>\n <Button\n size=\"sm\"\n className=\"h-7 pointer-coarse:h-11\"\n disabled={!canSave}\n onClick={onSave}\n data-testid={testIdOr(testIds?.save, { testId: 'facts-page-composer-save' })}\n >\n {isEditing\n ? isSaving\n ? l.saving\n : l.saveFact\n : isSaving\n ? l.adding\n : l.addFact}\n </Button>\n </div>\n </div>\n </div>\n </div>\n {error && (\n <p\n className=\"text-xs text-destructive\"\n data-testid={testIdOr(testIds?.error, { testId: 'facts-page-composer-error' })}\n >\n {error}\n </p>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * A fact's date span, translated between the API's ISO instants and the\n * editable wall-clock fields FactDateInput renders. Kept apart from the\n * component so the conversions are plain functions with no React in them.\n */\nimport { detectTimeZone } from '../calendar/zone'\n\nexport interface FactDateFields {\n /** `YYYY-MM-DD`. Empty means the fact has no date at all. */\n date: string\n /** `HH:MM`. Empty means `date` is a whole day, not an instant. */\n time: string\n /** IANA zone `time` is expressed in. Only meaningful (and only sent) when `time` is set. */\n timezone: string\n /** `YYYY-MM-DD` end of a range. Empty means a single day/instant, not a span. */\n endDate: string\n /** `HH:MM` paired with `endDate`, only offered once `time` is set. */\n endTime: string\n}\n\nexport const EMPTY_FACT_DATE_FIELDS: FactDateFields = {\n date: '',\n time: '',\n timezone: '',\n endDate: '',\n endTime: '',\n}\n\nfunction isMidnightUtc(d: Date): boolean {\n return d.getUTCHours() === 0 && d.getUTCMinutes() === 0 && d.getUTCSeconds() === 0\n}\n\nfunction isEndOfDayUtc(d: Date): boolean {\n return d.getUTCHours() === 23 && d.getUTCMinutes() === 59\n}\n\nfunction dayKeyUtc(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n/** A timezone name safe to hand to `Intl` — free-typed garbage falls back to UTC\n * rather than throwing and taking the whole date field down with it. */\nfunction safeTimeZone(tz: string): string {\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: tz })\n return tz\n } catch {\n return 'UTC'\n }\n}\n\n/** Wall-clock parts (`YYYY-MM-DD`, `HH:MM`) an ISO instant reads as in `timeZone`. */\nfunction isoToZonedParts(iso: string, timeZone: string): { date: string; time: string } {\n const d = new Date(iso)\n const parts = Object.fromEntries(\n new Intl.DateTimeFormat('en-US', {\n timeZone: safeTimeZone(timeZone),\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n })\n .formatToParts(d)\n .map((p) => [p.type, p.value])\n )\n return {\n date: `${parts.year}-${parts.month}-${parts.day}`,\n time: `${parts.hour}:${parts.minute}`,\n }\n}\n\n/** The UTC instant a `YYYY-MM-DD` + `HH:MM` wall-clock pair means in `timeZone`,\n * found by reading a naive guess back through the zone and correcting for its\n * offset — no date library, at the cost of rare DST-boundary imprecision. */\nfunction zonedPartsToIso(date: string, time: string, timeZone: string): string {\n const tz = safeTimeZone(timeZone)\n const guess = new Date(`${date}T${time}:00Z`)\n const zoned = isoToZonedParts(guess.toISOString(), tz)\n const [y, m, dd] = zoned.date.split('-').map(Number)\n const [hh, mi] = zoned.time.split(':').map(Number)\n const asIfUtc = Date.UTC(y, m - 1, dd, hh, mi)\n const offsetMs = asIfUtc - guess.getTime()\n return new Date(guess.getTime() - offsetMs).toISOString()\n}\n\n/** Editable fields from a stored fact's date span — the inverse of `factDateFieldsToSpan`. */\nexport function factDateSpanToFields(\n dateStart: string | null | undefined,\n dateEnd: string | null | undefined,\n timezone: string | null | undefined\n): FactDateFields {\n if (!dateStart) return EMPTY_FACT_DATE_FIELDS\n const start = new Date(dateStart)\n if (Number.isNaN(start.getTime())) return EMPTY_FACT_DATE_FIELDS\n const end = dateEnd ? new Date(dateEnd) : start\n const dateOnly = isMidnightUtc(start) && (!dateEnd || isEndOfDayUtc(end))\n\n if (dateOnly) {\n const startKey = dayKeyUtc(start)\n const endKey = dateEnd ? dayKeyUtc(end) : startKey\n return { ...EMPTY_FACT_DATE_FIELDS, date: startKey, endDate: endKey !== startKey ? endKey : '' }\n }\n\n const tz = timezone || 'UTC'\n const startParts = isoToZonedParts(dateStart, tz)\n const isInstant = !dateEnd || dateStart === dateEnd\n const endParts = isInstant ? null : isoToZonedParts(dateEnd, tz)\n return {\n date: startParts.date,\n time: startParts.time,\n timezone: tz,\n endDate: endParts?.date ?? '',\n endTime: endParts?.time ?? '',\n }\n}\n\n/** A fact's date span for the API — the inverse of `factDateSpanToFields`. `null`s\n * clear the span entirely; a bare date (no time) stays timezone-agnostic. */\nexport function factDateFieldsToSpan(fields: FactDateFields): {\n date: string | null\n date_end: string | null\n timezone: string | null\n} {\n if (!fields.date) return { date: null, date_end: null, timezone: null }\n const tz = fields.timezone || detectTimeZone()\n\n const startIso = fields.time\n ? zonedPartsToIso(fields.date, fields.time, tz)\n : `${fields.date}T00:00:00.000Z`\n\n let endIso: string\n if (fields.endDate) {\n endIso =\n fields.time && fields.endTime\n ? zonedPartsToIso(fields.endDate, fields.endTime, tz)\n : `${fields.endDate}T23:59:59.000Z`\n } else {\n endIso = fields.time ? startIso : `${fields.date}T23:59:59.000Z`\n }\n\n return { date: startIso, date_end: endIso, timezone: fields.time ? tz : null }\n}\n","/**\n * A fact's date, edited in a popover: a month calendar to pick the day, with\n * optional start time, end time and end date beneath it. Fully controlled —\n * the FactDateFields shape is unchanged, so fact-date.ts still converts to and\n * from the API's ISO span. A time silently brings the viewer's timezone with\n * it (editable), and an end time implies an end date (defaulting to the start\n * day) so a same-day interval round-trips through the span conversion.\n */\nimport { useMemo, useState } from 'react'\nimport { CalendarDays, ChevronLeft, ChevronRight, X } from 'lucide-react'\nimport { Button, Input, Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\nimport { formatSpan } from '../timeline/span'\nimport { factDateFieldsToSpan, EMPTY_FACT_DATE_FIELDS, type FactDateFields } from './fact-date'\nimport { detectTimeZone, listTimeZones } from '../calendar/zone'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactDateInputLabels {\n weekdays: string[]\n months: string[]\n previousMonth: string\n earlierYears: string\n nextMonth: string\n laterYears: string\n pickYear: string\n addDate: string\n startTime: string\n endTime: string\n setStartFirst: string\n timezone: string\n endDate: string\n clearDate: string\n}\n\nexport const DEFAULT_FACT_DATE_INPUT_LABELS: FactDateInputLabels = {\n weekdays: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n previousMonth: 'Previous month',\n earlierYears: 'Earlier years',\n nextMonth: 'Next month',\n laterYears: 'Later years',\n pickYear: 'Pick a year',\n addDate: 'Add a date',\n startTime: 'Start time',\n endTime: 'End time',\n setStartFirst: 'Set a start time first',\n timezone: 'Timezone',\n endDate: 'End date (optional)',\n clearDate: 'Clear date',\n}\n\nexport interface FactDateInputTestIds {\n caption: string\n day: (dateKey: string) => string\n year: (year: number) => string\n}\n\n/** `YYYY-MM-DD` for a calendar cell — local parts, never toISOString (which\n * would shift the day for viewers west of UTC). */\nfunction dayKey(year: number, monthIndex: number, day: number): string {\n const m = String(monthIndex + 1).padStart(2, '0')\n const d = String(day).padStart(2, '0')\n return `${year}-${m}-${d}`\n}\n\n/** Pretty `YYYY-MM-DD` → \"Mar 12, 2024\" using UTC parts (no day shift). */\nfunction prettyDay(iso: string): string {\n const [y, m, d] = iso.split('-').map(Number)\n if (!y || !m || !d) return iso\n return new Date(Date.UTC(y, m - 1, d)).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n timeZone: 'UTC',\n })\n}\n\n/** Trigger label when times are present — includes the Start time and, if set,\n * the End time (which formatSpan omits on a range). */\nfunction summarizeWithTimes(v: FactDateFields): string {\n const start = `${prettyDay(v.date)}, ${v.time}`\n const endDay = v.endDate || v.date\n if (v.endTime) return `${start} – ${prettyDay(endDay)}, ${v.endTime}`\n if (v.endDate && v.endDate !== v.date) return `${start} – ${prettyDay(v.endDate)}`\n return start\n}\n\n/** A month grid that reads and writes `YYYY-MM-DD` strings — no date library. */\nfunction MonthCalendar({\n selected,\n onSelect,\n labels: l,\n testIds,\n}: {\n selected: string\n onSelect: (dateKey: string) => void\n labels: FactDateInputLabels\n testIds?: Partial<FactDateInputTestIds>\n}) {\n const now = new Date()\n const todayKey = dayKey(now.getFullYear(), now.getMonth(), now.getDate())\n\n const initial = useMemo(() => {\n if (selected) {\n const [y, m] = selected.split('-').map(Number)\n if (y && m) return { year: y, monthIndex: m - 1 }\n }\n return { year: now.getFullYear(), monthIndex: now.getMonth() }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n const [view, setView] = useState(initial)\n // 'days' shows the month grid; 'years' shows a grid of years so a distant year\n // is one click away instead of dozens of month steps. yearStart is the first\n // year of the visible 12-year page.\n const [mode, setMode] = useState<'days' | 'years'>('days')\n const [yearStart, setYearStart] = useState(initial.year - 5)\n\n const firstWeekday = new Date(view.year, view.monthIndex, 1).getDay()\n const daysInMonth = new Date(view.year, view.monthIndex + 1, 0).getDate()\n\n const cells: Array<number | null> = [\n ...Array.from({ length: firstWeekday }, () => null),\n ...Array.from({ length: daysInMonth }, (_, i) => i + 1),\n ]\n\n const step = (delta: number) => {\n const next = view.monthIndex + delta\n setView({\n year: view.year + Math.floor(next / 12),\n monthIndex: ((next % 12) + 12) % 12,\n })\n }\n\n // The caption's chevrons page months in day view, and whole 12-year blocks in\n // year view. Clicking the caption opens the year grid; picking a year returns\n // to that year's month.\n const openYears = () => {\n setYearStart(view.year - 5)\n setMode('years')\n }\n const pickYear = (year: number) => {\n setView((v) => ({ ...v, year }))\n setMode('days')\n }\n const years = Array.from({ length: 12 }, (_, i) => yearStart + i)\n\n return (\n <div className=\"w-[248px]\">\n <div className=\"flex items-center justify-between px-1 pb-2\">\n <button\n type=\"button\"\n onClick={() => (mode === 'days' ? step(-1) : setYearStart((s) => s - 12))}\n className=\"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground pointer-coarse:p-3\"\n aria-label={mode === 'days' ? l.previousMonth : l.earlierYears}\n >\n <ChevronLeft className=\"size-4\" />\n </button>\n {mode === 'days' ? (\n <button\n type=\"button\"\n onClick={openYears}\n className=\"rounded px-1.5 py-0.5 text-sm font-medium hover:bg-accent hover:text-foreground\"\n aria-label={l.pickYear}\n data-testid={testIdOr(testIds?.caption, { testId: 'fact-calendar-caption' })}\n >\n {l.months[view.monthIndex]} {view.year}\n </button>\n ) : (\n <span className=\"text-sm font-medium\">\n {yearStart} – {yearStart + 11}\n </span>\n )}\n <button\n type=\"button\"\n onClick={() => (mode === 'days' ? step(1) : setYearStart((s) => s + 12))}\n className=\"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground pointer-coarse:p-3\"\n aria-label={mode === 'days' ? l.nextMonth : l.laterYears}\n >\n <ChevronRight className=\"size-4\" />\n </button>\n </div>\n {mode === 'days' ? (\n <div className=\"grid grid-cols-7 gap-0.5\">\n {l.weekdays.map((w) => (\n <div key={w} className=\"py-1 text-center text-xs font-medium text-muted-foreground\">\n {w}\n </div>\n ))}\n {cells.map((day, i) => {\n if (day === null) return <div key={`blank-${i}`} />\n const key = dayKey(view.year, view.monthIndex, day)\n const isSelected = key === selected\n const isToday = key === todayKey\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => onSelect(key)}\n data-testid={testIdOr(testIds?.day?.(key), { testId: `fact-calendar-day-${key}` })}\n className={cn(\n 'h-8 rounded text-xs transition-colors hover:bg-accent pointer-coarse:h-11',\n isSelected && 'bg-primary text-primary-foreground hover:bg-primary',\n !isSelected && isToday && 'ring-1 ring-inset ring-primary/50'\n )}\n >\n {day}\n </button>\n )\n })}\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-1\">\n {years.map((y) => (\n <button\n key={y}\n type=\"button\"\n onClick={() => pickYear(y)}\n data-testid={testIdOr(testIds?.year?.(y), { testId: `fact-calendar-year-${y}` })}\n className={cn(\n 'h-9 rounded text-xs transition-colors hover:bg-accent pointer-coarse:h-11',\n y === view.year && 'bg-primary text-primary-foreground hover:bg-primary'\n )}\n >\n {y}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport interface FactDateInputProps {\n value: FactDateFields\n onChange: (next: FactDateFields) => void\n /** Prefix for data-testids: keeps composer vs. edit-row instances distinct. */\n idPrefix: string\n labels?: Partial<FactDateInputLabels>\n /** Overrides for the calendar's own ids (the field ids derive from `idPrefix`). */\n testIds?: Partial<FactDateInputTestIds>\n}\n\n/** A fact's date in a popover: month/year calendar plus optional times, timezone and end date. */\nexport function FactDateInput({ value, onChange, idPrefix, labels, testIds }: FactDateInputProps) {\n const l = { ...DEFAULT_FACT_DATE_INPUT_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n const timezones = useMemo(() => listTimeZones(), [])\n const timezoneListId = `${idPrefix}-timezone-options`\n\n // The trigger reads the same way a fact's date renders in the grid, so the\n // button label and the row agree — EXCEPT when explicit times are set:\n // formatSpan drops the clock time on a start/end-time range, so we build a\n // time-inclusive label ourselves in that case (formatSpan still handles the\n // day/month/year precisions nicely when there are no times).\n const span = factDateFieldsToSpan(value)\n const summary =\n value.time || value.endTime\n ? summarizeWithTimes(value)\n : formatSpan(span.date, span.date_end, span.timezone)\n\n const setDate = (dateKey: string) =>\n onChange({ ...value, date: dateKey, endDate: value.endDate && dateKey ? value.endDate : '' })\n\n // Setting a start time needs a timezone to be meaningful; setting an end time\n // needs an end date for the span conversion to keep it (defaults to the start\n // day, i.e. a same-day interval).\n const setStartTime = (time: string) =>\n onChange({\n ...value,\n time,\n timezone: time ? value.timezone || detectTimeZone() : '',\n endTime: time ? value.endTime : '',\n })\n\n const setEndTime = (endTime: string) =>\n onChange({\n ...value,\n endTime,\n endDate: endTime ? value.endDate || value.date : value.endDate,\n })\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 text-sm transition-colors hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n !summary && 'text-muted-foreground'\n )}\n data-testid={`${idPrefix}-date-trigger`}\n >\n <CalendarDays className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"truncate\">{summary || l.addDate}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-3\" align=\"start\">\n <MonthCalendar selected={value.date} onSelect={setDate} labels={l} testIds={testIds} />\n\n {value.date && (\n <div className=\"mt-3 flex flex-col gap-2 border-t border-border pt-3\">\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.startTime}</span>\n <Input\n type=\"time\"\n value={value.time}\n onChange={(e) => setStartTime(e.target.value)}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-time`}\n />\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.endTime}</span>\n <Input\n type=\"time\"\n value={value.endTime}\n onChange={(e) => setEndTime(e.target.value)}\n disabled={!value.time}\n title={value.time ? undefined : l.setStartFirst}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-end-time`}\n />\n </label>\n </div>\n\n {value.time && (\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.timezone}</span>\n <Input\n list={timezoneListId}\n value={value.timezone}\n onChange={(e) => onChange({ ...value, timezone: e.target.value })}\n placeholder={detectTimeZone()}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-timezone`}\n />\n <datalist id={timezoneListId}>\n {timezones.map((tz) => (\n <option key={tz} value={tz} />\n ))}\n </datalist>\n </label>\n )}\n\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.endDate}</span>\n <Input\n type=\"date\"\n value={value.endDate}\n min={value.date}\n onChange={(e) => onChange({ ...value, endDate: e.target.value })}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-end-date`}\n />\n </label>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 self-start text-muted-foreground hover:text-foreground\"\n onClick={() => onChange(EMPTY_FACT_DATE_FIELDS)}\n data-testid={`${idPrefix}-clear-date`}\n >\n <X className=\"mr-1 size-3.5\" /> {l.clearDate}\n </Button>\n </div>\n )}\n </PopoverContent>\n </Popover>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { FolderUp, MoreHorizontal, Paperclip, Tags, Trash2 } from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { SelectionBar, SelectionBarAction } from '../files/SelectionBar'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsBulkBarLabels {\n removeFromChat: string\n addToChat: string\n label: string\n shared: string\n more: string\n export: string\n delete: string\n budgetHint: string\n /** The `~{tokens}/{cap} tokens` line (numbers arrive formatted). */\n budget: (tokens: string, cap: string) => string\n removeFromChatTooltip: (pluralNoun: string) => string\n addToChatTooltip: (pluralNoun: string) => string\n labelTooltip: (pluralNoun: string) => string\n}\n\nexport const DEFAULT_FACTS_BULK_BAR_LABELS: FactsBulkBarLabels = {\n removeFromChat: 'Remove from Chat',\n addToChat: 'Add to Chat',\n label: 'Label',\n shared: 'Shared',\n more: 'More',\n export: 'Export',\n delete: 'Delete',\n budgetHint:\n \"Facts added to this chat are always in ARBI's context for this chat, so they share one budget. This estimates the tokens they add (≈4 characters per token), capped at ~2,000.\",\n budget: (tokens, cap) => `~${tokens}/${cap} tokens`,\n removeFromChatTooltip: (n) => `Remove the selected ${n} from this chat`,\n addToChatTooltip: (n) => `Add the selected ${n} to this chat, so they are always in its context`,\n labelTooltip: (n) => `Add or remove labels from selected ${n}`,\n}\n\nexport interface FactsBulkBarTestIds {\n budget: string\n inChat: string\n label: string\n more: string\n export: string\n delete: string\n}\n\nexport interface FactsBulkBarProps {\n /** Number of selected facts. */\n count: number\n onClear: () => void\n /** True when every selected fact is already in the current chat (the action then removes). */\n allSelectedInChat: boolean\n /** Add the selection to the current chat, or take it out (absent: no chat, no action). */\n onToggleInChat?: () => void\n /** Label the selection (absent: no action). */\n onLabel?: () => void\n /** The aggregate Shared switch for the selection (the app binds its toggle). */\n sharedToggle: ReactNode\n /** Export the selection (absent: no action). */\n onExport?: () => void\n onDelete: () => void\n /** The current chat's facts token budget, shown at the left (the chat's facts, not the selection). */\n budget?: { tokens: number; cap: number; isOver: boolean } | null\n /** Plural noun for tooltips (lower case). */\n pluralNoun?: string\n labels?: Partial<FactsBulkBarLabels>\n testIds?: Partial<FactsBulkBarTestIds>\n}\n\n/**\n * Sticky bulk-action bar for the facts table: Add to Chat, Label, Shared and a More menu (Export,\n * Delete). Actions are disabled until something is selected.\n */\nexport function FactsBulkBar({\n count,\n onClear,\n allSelectedInChat,\n onToggleInChat,\n onLabel,\n sharedToggle,\n onExport,\n onDelete,\n budget,\n pluralNoun = 'facts',\n labels,\n testIds,\n}: FactsBulkBarProps) {\n const l = { ...DEFAULT_FACTS_BULK_BAR_LABELS, ...labels }\n const none = count === 0\n return (\n <div className=\"pb-3\" data-slot=\"facts-bulk-bar\">\n <SelectionBar\n count={count}\n onClear={onClear}\n status={\n budget ? (\n <span\n className={cn(\n 'shrink-0 text-xs tabular-nums',\n budget.isOver ? 'text-destructive' : 'text-muted-foreground'\n )}\n title={l.budgetHint}\n data-testid={testIdOr(testIds?.budget, { testId: 'facts-page-chat-budget' })}\n >\n {l.budget(budget.tokens.toLocaleString(), budget.cap.toLocaleString())}\n </span>\n ) : null\n }\n >\n {(isCompact) => (\n <>\n {onToggleInChat && (\n <SelectionBarAction\n icon={Paperclip}\n label={allSelectedInChat ? l.removeFromChat : l.addToChat}\n onClick={onToggleInChat}\n disabled={none}\n isCompact={isCompact}\n className=\"border-blue-border text-blue-text hover:bg-blue-bg hover:text-blue-text\"\n tooltip={\n allSelectedInChat\n ? l.removeFromChatTooltip(pluralNoun)\n : l.addToChatTooltip(pluralNoun)\n }\n testId={testIdOr(testIds?.inChat, { testId: 'bulk-in-chat-facts-button' })}\n />\n )}\n {onLabel && (\n <SelectionBarAction\n icon={Tags}\n label={l.label}\n onClick={onLabel}\n disabled={none}\n isCompact={isCompact}\n className=\"border-green-border text-green-text hover:bg-green-bg hover:text-green-text\"\n tooltip={l.labelTooltip(pluralNoun)}\n testId={testIdOr(testIds?.label, { testId: 'bulk-label-facts-button' })}\n />\n )}\n <div className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1\">\n {sharedToggle}\n {!isCompact && <span className=\"text-sm text-muted-foreground\">{l.shared}</span>}\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 pointer-coarse:h-11\"\n disabled={none}\n data-testid={testIdOr(testIds?.more, { testId: 'facts-bulk-more-button' })}\n >\n <MoreHorizontal className=\"size-4\" />\n {!isCompact && <span className=\"text-sm\">{l.more}</span>}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {onExport && (\n <>\n <DropdownMenuItem\n onClick={onExport}\n disabled={none}\n data-testid={testIdOr(testIds?.export, { testId: 'export-facts-button' })}\n >\n <FolderUp className=\"mr-2 size-4\" />\n {l.export}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n onClick={onDelete}\n disabled={none}\n className=\"text-red-text focus:text-red-text\"\n data-testid={testIdOr(testIds?.delete, { testId: 'bulk-delete-facts-button' })}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {l.delete}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )}\n </SelectionBar>\n </div>\n )\n}\n","import { ArrowRight, CalendarClock, Lightbulb, Loader2, Milestone, Scale } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsEmptyStateLabels {\n title: string\n intro: string\n tryAdding: string\n /** Three kinds of durable knowledge a fact captures. */\n kinds: { label: string; desc: string }[]\n /** Starter fact texts offered as one-tap examples. */\n examples: string[]\n loading: string\n loadError: string\n retry: string\n}\n\nexport const DEFAULT_FACTS_EMPTY_STATE_LABELS: FactsEmptyStateLabels = {\n title: 'Everything this workspace knows',\n intro:\n 'Facts are durable knowledge — a deadline, a decision, a preference. Write them yourself, or let the assistant distill them from your documents and chats.',\n tryAdding: 'Try adding a fact',\n kinds: [\n {\n label: 'Deadlines & dates',\n desc: 'A due date or milestone — it lands on the calendar and timeline',\n },\n { label: 'Decisions', desc: 'What was agreed, and why — so it is not lost in a thread' },\n { label: 'Preferences', desc: 'How this workspace likes things done' },\n ],\n examples: [\n 'The renewal deadline is March 31, 2026',\n 'Payment terms are net 30',\n 'The team prefers email over phone for updates',\n 'Board approved the Q3 budget on May 12',\n ],\n loading: 'Loading facts…',\n loadError: 'Could not load facts.',\n retry: 'Try again',\n}\n\nconst KIND_ICONS = [CalendarClock, Scale, Lightbulb]\n\nexport interface FactsEmptyStateTestIds {\n root: string\n example: string\n}\n\nexport interface FactsEmptyStateProps {\n /** Open the composer prefilled with an example. */\n onUseExample: (text: string) => void\n labels?: Partial<FactsEmptyStateLabels>\n testIds?: Partial<FactsEmptyStateTestIds>\n}\n\n/** First-run state: what facts are, the kinds they capture, and one-tap examples. */\nexport function FactsEmptyState({ onUseExample, labels, testIds }: FactsEmptyStateProps) {\n const l = { ...DEFAULT_FACTS_EMPTY_STATE_LABELS, ...labels }\n return (\n <div\n className=\"flex min-h-full items-center justify-center p-10\"\n data-testid={testIdOr(testIds?.root, { testId: 'facts-page-empty-state' })}\n data-slot=\"facts-empty-state\"\n >\n <div className=\"w-full max-w-xl text-center\">\n <div className=\"mx-auto mb-4 flex size-12 items-center justify-center rounded-lg bg-accent text-accent-foreground\">\n <Milestone className=\"size-6\" />\n </div>\n\n <h2 className=\"mt-2 text-xl font-semibold text-foreground\">{l.title}</h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">{l.intro}</p>\n\n <div className=\"mt-7 grid gap-3 text-left @xl:grid-cols-3\">\n {l.kinds.map(({ label, desc }, i) => {\n const KindIcon = KIND_ICONS[i % KIND_ICONS.length]\n return (\n <div key={label} className=\"rounded-lg border border-border bg-card p-3 shadow-xs\">\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-foreground\">\n <KindIcon className=\"size-4 text-primary\" />\n {label}\n </div>\n <p className=\"mt-1 text-xs leading-snug text-muted-foreground\">{desc}</p>\n </div>\n )\n })}\n </div>\n\n <p className=\"mt-10 text-sm font-medium text-muted-foreground\">{l.tryAdding}</p>\n <div className=\"mt-4 flex flex-wrap justify-center gap-2.5\">\n {l.examples.map((fact) => (\n <button\n key={fact}\n type=\"button\"\n onClick={() => onUseExample(fact)}\n className=\"group inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-3.5 py-2 text-sm text-foreground transition-colors hover:border-ring/50 hover:bg-accent/40 pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.example, { testId: 'facts-page-example' })}\n >\n {fact}\n <ArrowRight className=\"size-3.5 text-muted-foreground transition-colors group-hover:text-primary\" />\n </button>\n ))}\n </div>\n </div>\n </div>\n )\n}\n\n/** Centered \"Loading facts…\" line. */\nexport function FactsLoading({\n label = DEFAULT_FACTS_EMPTY_STATE_LABELS.loading,\n}: {\n label?: string\n}) {\n return (\n <div className=\"flex items-center justify-center py-10 text-muted-foreground\">\n <Loader2 className=\"mr-2 size-4 animate-spin\" /> {label}\n </div>\n )\n}\n\n/** Load-failure message with a retry action. */\nexport function FactsLoadError({\n onRetry,\n message = DEFAULT_FACTS_EMPTY_STATE_LABELS.loadError,\n retryLabel = DEFAULT_FACTS_EMPTY_STATE_LABELS.retry,\n}: {\n onRetry: () => void\n message?: string\n retryLabel?: string\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 px-6 py-10 text-center\">\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n {retryLabel}\n </Button>\n </div>\n )\n}\n","/**\n * FactsFieldsButton\n *\n * The Facts table's column-visibility control — the same \"Fields\" affordance the\n * Documents table wears (Columns3 icon, ghost button), pared down to what facts\n * need: a checkbox per column that shows or hides it. Toggling writes straight\n * to the grid via the AG Grid api, so the change persists through GridView's own\n * column-state persistence (no separate saved-views machinery here).\n */\nimport { useMemo, useState } from 'react'\nimport { Columns3, ChevronDown, Check, RotateCcw } from 'lucide-react'\nimport type { GridApi } from 'ag-grid-community'\nimport {\n Button,\n Command,\n CommandGroup,\n CommandItem,\n CommandList,\n CommandSeparator,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsFieldsButtonLabels {\n fields: string\n defaultView: string\n columns: string\n /** Names for icon-only columns, keyed by colId. */\n columnNames: Record<string, string>\n}\n\nexport const DEFAULT_FACTS_FIELDS_BUTTON_LABELS: FactsFieldsButtonLabels = {\n fields: 'Fields',\n defaultView: 'Default view',\n columns: 'Columns',\n columnNames: { in_chat: 'In chat' },\n}\n\nexport interface FactsFieldsButtonTestIds {\n trigger: string\n defaultView: string\n toggle: (colId: string) => string\n}\n\nexport interface FactsFieldsButtonProps<TData = unknown> {\n /** The facts grid api (read lazily: the grid may not exist yet). */\n getGridApi: () => GridApi<TData> | null | undefined\n labels?: Partial<FactsFieldsButtonLabels>\n testIds?: Partial<FactsFieldsButtonTestIds>\n}\n\nexport function FactsFieldsButton<TData = unknown>({\n getGridApi,\n labels,\n testIds,\n}: FactsFieldsButtonProps<TData>) {\n const l = { ...DEFAULT_FACTS_FIELDS_BUTTON_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n // Bumped after each toggle so the list re-reads the grid's live column state.\n const [version, setVersion] = useState(0)\n\n const columns = useMemo(() => {\n if (!open) return []\n const api = getGridApi()\n if (!api || api.isDestroyed()) return []\n const state = api.getColumnState()\n return state\n .filter((c) => c.colId !== 'ag-Grid-SelectionColumn')\n .map((c) => {\n const def = api.getColumnDef(c.colId)\n const label =\n (def?.headerName && def.headerName.trim()) || l.columnNames[c.colId] || c.colId\n return { colId: c.colId, label, visible: !c.hide }\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, version, getGridApi, l.columnNames])\n\n const visibleCount = columns.filter((c) => c.visible).length\n\n const toggle = (colId: string, visible: boolean) => {\n const api = getGridApi()\n if (!api || api.isDestroyed()) return\n // Never hide the last remaining column — an empty grid has no headers to\n // bring back the chooser against.\n if (visible && visibleCount <= 1) return\n api.setColumnsVisible([colId], !visible)\n setVersion((v) => v + 1)\n }\n\n // Default view: restore the columns' built-in order, visibility and widths\n // from the column definitions (like the Files table's \"Default view\"). Handy\n // when a column got hidden or dragged and the table no longer reads right.\n const resetToDefault = () => {\n const api = getGridApi()\n if (!api || api.isDestroyed()) return\n api.resetColumnState()\n setVersion((v) => v + 1)\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-sm gap-1.5 text-muted-foreground hover:text-foreground font-light!\"\n data-testid={testIdOr(testIds?.trigger, { testId: 'facts-fields-trigger' })}\n >\n <Columns3 className=\"size-3.5\" />\n {l.fields}\n <ChevronDown className=\"size-3\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[220px] p-0\" align=\"end\" side=\"bottom\" sideOffset={4}>\n <Command shouldFilter={false}>\n <CommandList className=\"max-h-[60dvh]\">\n <CommandGroup>\n <CommandItem\n onSelect={resetToDefault}\n className=\"cursor-pointer text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.defaultView, {\n testId: 'facts-fields-default-view',\n })}\n >\n <RotateCcw className=\"mr-2 size-3.5\" />\n {l.defaultView}\n </CommandItem>\n </CommandGroup>\n <CommandSeparator />\n <CommandGroup heading={l.columns}>\n {columns.map((col) => (\n <CommandItem\n key={col.colId}\n onSelect={() => toggle(col.colId, col.visible)}\n className=\"cursor-pointer text-sm\"\n data-testid={testIdOr(testIds?.toggle?.(col.colId), {\n testId: `facts-fields-toggle-${col.colId}`,\n })}\n >\n <div\n className={cn(\n 'mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary',\n col.visible\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <Check className=\"size-3\" />\n </div>\n {col.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","import { useEffect, useMemo, useRef } from 'react'\nimport { TimelineCalendar } from '../timeline/TimelineCalendar'\nimport { TimelineGantt, type TimelineGanttProps } from '../timeline/TimelineGantt'\nimport type { TimelineItem } from '../timeline/types'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactTimelineLabels {\n ganttEmpty: string\n}\n\nexport const DEFAULT_FACT_TIMELINE_LABELS: FactTimelineLabels = {\n ganttEmpty: 'Give a fact a date and it appears here.',\n}\n\n/** The fields of a fact the calendar reads. */\nexport interface FactCalendarRow {\n external_id: string\n text: string\n date_start?: string | null\n date_end?: string | null\n}\n\ntype CalendarItem<T> = TimelineItem & { fact: T }\n\nexport interface FactsCalendarProps<T extends FactCalendarRow> {\n facts: T[]\n onSelect?: (fact: T) => void\n /** The fact currently open for editing: its bars are highlighted. */\n selectedId?: string | null\n /** Host element the n / N fact navigator portals into (see TimelineCalendar). */\n navigatorContainer?: HTMLElement | null\n /** Denominator for the navigator: the page's filtered fact count. */\n navigatorTotal?: number\n /** Calendar test id; entries are `${testId}-entry-${factId}` (default `facts-calendar`). */\n testId?: string\n}\n\n/**\n * Facts on the shared calendar. Maps a fact to a labelled span and hands the fact back on select,\n * so packing, spanning bars and continuous scroll stay one implementation shared with every\n * other timeline surface. Undated facts have nowhere to sit and are skipped.\n */\nexport function FactsCalendar<T extends FactCalendarRow>({\n facts,\n onSelect,\n selectedId,\n navigatorContainer,\n navigatorTotal,\n testId,\n}: FactsCalendarProps<T>) {\n const calendarTestId = testIdOr(testId, { testId: 'facts-calendar' })\n const items = useMemo<CalendarItem<T>[]>(\n () =>\n facts\n .filter((f) => f.date_start)\n .map((f) => ({\n id: f.external_id,\n label: f.text,\n start: f.date_start as string,\n end: f.date_end,\n fact: f,\n })),\n [facts]\n )\n\n // The shared calendar takes no \"selected\" prop, so mark the selected fact's entries (a\n // multi-day fact has several) directly in the DOM, re-applied when selection or items change.\n const rootRef = useRef<HTMLDivElement>(null)\n const entryId = testIdOr(testId && `${testId}-entry-${selectedId}`, {\n testId: `facts-calendar-entry-${selectedId}`,\n })\n useEffect(() => {\n const root = rootRef.current\n if (!root) return\n root\n .querySelectorAll('.fact-cal-selected')\n .forEach((el) => el.classList.remove('fact-cal-selected'))\n if (!selectedId) return\n root\n .querySelectorAll(`[data-testid=\"${entryId}\"]`)\n .forEach((el) => el.classList.add('fact-cal-selected'))\n }, [selectedId, items, entryId])\n\n return (\n <div ref={rootRef} className=\"h-full border-t border-border\" data-slot=\"facts-calendar\">\n <TimelineCalendar\n items={items}\n testId={calendarTestId}\n // Show every fact on a day, never \"+n more\": single-line bars keep a busy day compact.\n maxLanes={Infinity}\n selectedIds={selectedId ? [selectedId] : []}\n onSelect={(item) => onSelect?.(item.fact)}\n navigatorContainer={navigatorContainer}\n navigatorTotal={navigatorTotal}\n />\n </div>\n )\n}\n\n/**\n * The Facts timeline. `.facts-gantt` scopes CSS that truncates row labels to one line and hides\n * the built-in detail side panel: a fact's contents are seen and edited in the composer instead.\n */\nexport function FactsGanttPane({\n testId,\n emptyMessage,\n labels,\n ...props\n}: TimelineGanttProps & { labels?: Partial<FactTimelineLabels> }) {\n const l = { ...DEFAULT_FACT_TIMELINE_LABELS, ...labels }\n return (\n <div className=\"facts-gantt h-full border-t border-border\" data-slot=\"facts-gantt\">\n <TimelineGantt\n testId={testIdOr(testId, { testId: 'gantt' })}\n emptyMessage={emptyMessage ?? l.ganttEmpty}\n {...props}\n />\n </div>\n )\n}\n","/**\n * FactsViewToggle\n *\n * Table / Calendar / Timeline switch for the Notes page. (The list view\n * retired into the table — 'list' stays in the type for old deep links,\n * which the page maps to 'table'.) Uses the shared\n * ViewToggle so it matches Documents (Gallery / Table / Review), Home and Smart\n * Search rather than being a fifth bespoke button group, and sits in the tab\n * header where every other page puts its views.\n *\n * Calendar and Timeline read only the dated notes — a note without a date has\n * nowhere to sit on either — which the tooltips say rather than the labels.\n */\n\nimport { CalendarRange, GanttChartSquare, Search, Table2 } from 'lucide-react'\nimport { ViewToggle, type ViewToggleOption } from '../files/ViewToggle'\nimport { testIdOr } from '../chat/test-id'\n\nexport type FactsViewMode = 'list' | 'table' | 'calendar' | 'gantt' | 'smart_search'\n\nexport interface FactsViewToggleLabels {\n table: string\n calendar: string\n timeline: string\n smartSearch: string\n}\n\nexport const DEFAULT_FACTS_VIEW_TOGGLE_LABELS: FactsViewToggleLabels = {\n table: 'Table',\n calendar: 'Calendar',\n timeline: 'Timeline',\n smartSearch: 'Smart Search',\n}\n\nconst createOptions = (l: FactsViewToggleLabels): ViewToggleOption[] => [\n { value: 'table', icon: <Table2 className=\"size-3.5\" />, label: l.table },\n { value: 'calendar', icon: <CalendarRange className=\"size-3.5\" />, label: l.calendar },\n { value: 'gantt', icon: <GanttChartSquare className=\"size-3.5\" />, label: l.timeline },\n // Facts-only semantic/keyword recall — mirrors the Files \"Smart Search\" view\n // (same Search icon + label), but searches this workspace's facts, not docs.\n { value: 'smart_search', icon: <Search className=\"size-3.5\" />, label: l.smartSearch },\n]\n\nexport interface FactsViewToggleProps {\n viewMode: FactsViewMode\n onChange: (mode: FactsViewMode) => void\n /**\n * Collapse the labels to icons. Driven by a width measurement of the header\n * row (see FactsPage) rather than a `@container`, so the toggle can stay\n * absolutely centred — its position never shifts with the side controls —\n * while still collapsing when the row actually runs out of room.\n */\n collapsed?: boolean\n labels?: Partial<FactsViewToggleLabels>\n /** Item test ids are `${testIdPrefix}-${mode}-button` (default `facts-layout`). */\n testIdPrefix?: string\n /** Per-mode item ids that replace the prefixed ones. */\n testIds?: Partial<Record<FactsViewMode, string>>\n}\n\nexport function FactsViewToggle({\n viewMode,\n onChange,\n collapsed = false,\n labels,\n testIdPrefix,\n testIds,\n}: FactsViewToggleProps) {\n const options = createOptions({ ...DEFAULT_FACTS_VIEW_TOGGLE_LABELS, ...labels }).map((o) => ({\n ...o,\n testId: testIds?.[o.value as FactsViewMode],\n }))\n return (\n <ViewToggle\n options={options}\n value={viewMode}\n onChange={(value) => onChange(value as FactsViewMode)}\n testIdPrefix={testIdOr(testIdPrefix, { testId: 'facts-layout' })}\n showLabels={!collapsed}\n size=\"sm\"\n />\n )\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { BookMarked, Milestone, Plus } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { TabHeader, type Tab } from '../shell/TabHeader'\nimport { observeResize } from '../lib/observe-resize'\nimport { testIdOr } from '../chat/test-id'\nimport {\n FilterInput,\n type FilterInputLabels,\n type FilterInputTestIds,\n type FilterField,\n} from '../shell/FilterInput'\nimport { FactsViewToggle, type FactsViewMode, type FactsViewToggleLabels } from './FactsViewToggle'\n\nexport interface FactsToolbarLabels {\n tags: string\n newFact: string\n}\n\nexport const DEFAULT_FACTS_TOOLBAR_LABELS: FactsToolbarLabels = {\n tags: 'Tags',\n newFact: 'New fact',\n}\n\nexport interface FactsToolbarTestIds {\n tab: string\n tagsButton: string\n newFact: string\n filterBar: string\n filterBarNav: string\n}\n\nexport interface FactsToolbarProps {\n /** Facts matching the current filters (shown beside the glyph). */\n count: number\n /** Solid-fill the count while any filter is narrowing the list. */\n hasActiveFilters: boolean\n filterText: string\n onFilterTextChange: (text: string) => void\n searchFields: FilterField[]\n onSearchFieldsChange: (fields: FilterField[]) => void\n /** The quick-filter dropdown, embedded inside the filter box. */\n quickFilter?: ReactNode\n /** Open the Labels panel. Omit it to hide the Tags button. */\n onOpenTags?: () => void\n viewMode: FactsViewMode\n onViewModeChange: (mode: FactsViewMode) => void\n onNewFact: () => void\n /** Second row: left slot for the row navigator (portal host for calendar/timeline). */\n navSlotRef?: (el: HTMLElement | null) => void\n /** Table navigator rendered directly in the left slot. */\n navigator?: ReactNode\n /** Second row, right side: per-view controls (Fields, density, zoom). */\n tools?: ReactNode\n /** Smart Search has no toolbar row. */\n showToolbarRow?: boolean\n labels?: Partial<FactsToolbarLabels>\n testIds?: Partial<FactsToolbarTestIds>\n /** Overrides for the embedded filter box. */\n filterLabels?: Partial<FilterInputLabels>\n filterTestIds?: Partial<FilterInputTestIds>\n /** Overrides for the embedded view toggle. */\n viewToggleLabels?: Partial<FactsViewToggleLabels>\n viewToggleTestIdPrefix?: string\n}\n\n/**\n * Facts page header: count tab with filter box and Tags button, the view toggle centred, New fact\n * on the right (the page's one primary action), and a second row for per-view controls.\n */\nexport function FactsToolbar({\n count,\n hasActiveFilters,\n filterText,\n onFilterTextChange,\n searchFields,\n onSearchFieldsChange,\n quickFilter,\n onOpenTags,\n viewMode,\n onViewModeChange,\n onNewFact,\n navSlotRef,\n navigator,\n tools,\n showToolbarRow = true,\n labels,\n testIds,\n filterLabels,\n filterTestIds,\n viewToggleLabels,\n viewToggleTestIdPrefix,\n}: FactsToolbarProps) {\n const l = { ...DEFAULT_FACTS_TOOLBAR_LABELS, ...labels }\n // Collapse the view toggle's labels to icons when the row runs low on room, measured off the\n // row's own width (stable against side controls appearing) with hysteresis to avoid flicker.\n const headerRef = useRef<HTMLDivElement>(null)\n const [viewsCollapsed, setViewsCollapsed] = useState(false)\n // On phones the header cannot hold the view toggle beside the filter and New fact, so the\n // toggle moves to a row of its own beneath it.\n const [isNarrow, setIsNarrow] = useState(false)\n useEffect(() => {\n const el = headerRef.current\n if (!el) return\n const measure = () => {\n const w = el.clientWidth\n setViewsCollapsed((prev) => (prev ? w < 990 : w < 950))\n // Touch targets are 44px, so the one-row header needs more room on a touch device: a phone\n // held sideways (~760px) already clips the Tags button under the view toggle.\n const narrowAt = window.matchMedia?.('(pointer: coarse)')?.matches ? 820 : 640\n setIsNarrow((prev) => (prev ? w < narrowAt + 20 : w < narrowAt))\n }\n measure()\n return observeResize(el, measure)\n }, [])\n\n const tabs: Tab[] = [\n {\n id: 'facts',\n // No name: the page needs no self-label, but the fact glyph stays in front of the count.\n countIcon: <Milestone className=\"size-3.5\" />,\n label: '',\n count,\n countPlacement: 'leading',\n hasActiveFilters,\n testId: testIdOr(testIds?.tab, { testId: 'facts-tab' }),\n presentation: 'count',\n },\n ]\n\n // Filter box (+ Tags). In the header on wide rows; on phones it gets a full-width row of its\n // own so the filter is never squeezed to a stub.\n const filterControls = (\n <div className={isNarrow ? 'flex w-full items-center gap-1.5' : 'flex items-center gap-1.5'}>\n <FilterInput\n value={filterText}\n onChange={onFilterTextChange}\n fields={searchFields}\n onFieldsChange={onSearchFieldsChange}\n filter={quickFilter}\n className={isNarrow ? 'min-w-0 flex-1' : undefined}\n labels={filterLabels}\n testIds={filterTestIds}\n />\n {onOpenTags && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-6 shrink-0 gap-1.5 px-2 pointer-coarse:h-11\"\n onClick={onOpenTags}\n data-testid={testIdOr(testIds?.tagsButton, { testId: 'facts-tags-button' })}\n >\n <BookMarked className=\"size-3.5\" />\n <span className=\"text-sm\">{l.tags}</span>\n </Button>\n )}\n </div>\n )\n\n return (\n <div ref={headerRef} className=\"sticky top-0 z-10 bg-background\" data-slot=\"facts-toolbar\">\n <TabHeader\n tabs={tabs}\n activeTabId=\"notes\"\n onTabChange={() => {}}\n firstTabContent={isNarrow ? null : filterControls}\n centerContent={\n isNarrow ? null : (\n <div className=\"flex w-full items-center justify-center\">\n <FactsViewToggle\n viewMode={viewMode}\n onChange={onViewModeChange}\n collapsed={viewsCollapsed}\n labels={viewToggleLabels}\n testIdPrefix={viewToggleTestIdPrefix}\n />\n </div>\n )\n }\n rightContent={\n <Button\n onClick={onNewFact}\n data-testid={testIdOr(testIds?.newFact, { testId: 'facts-page-new' })}\n >\n <Plus className=\"mr-0.5 size-4\" />\n {l.newFact}\n </Button>\n }\n />\n {isNarrow && (\n <div\n className=\"flex flex-col gap-1.5 border-b border-border px-3 py-1.5\"\n data-slot=\"facts-toolbar-stack\"\n >\n {filterControls}\n <div className=\"flex justify-center\">\n <FactsViewToggle\n viewMode={viewMode}\n onChange={onViewModeChange}\n collapsed\n labels={viewToggleLabels}\n testIdPrefix={viewToggleTestIdPrefix}\n />\n </div>\n </div>\n )}\n {showToolbarRow && (\n <div\n className=\"flex min-h-8 flex-wrap items-center gap-x-1.5 border-b border-border bg-background px-3 py-0.5\"\n data-testid={testIdOr(testIds?.filterBar, { testId: 'facts-filter-bar' })}\n >\n <div\n ref={navSlotRef}\n className=\"flex shrink-0 items-center empty:hidden\"\n data-testid={testIdOr(testIds?.filterBarNav, { testId: 'facts-filter-bar-nav' })}\n >\n {navigator}\n </div>\n <div className=\"flex-1\" />\n <div className=\"flex shrink-0 items-center\">{tools}</div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * Drag-to-resize columns for the tables rendered inside the fact editor's\n * MDXEditor.\n *\n * MDXEditor's table has no built-in column resizing, but it renders a\n * `<colgroup>` of `<col>` elements — one per column plus the leading/trailing\n * tool columns. Column widths are honoured by setting a width on those `<col>`\n * elements and switching the table to `table-layout: fixed`. MDXEditor only\n * manages each `<col>`'s `className` (alignment), so an inline `style.width`\n * survives typing edits; it only resets when the column count changes (a new\n * `<colgroup>` is rendered) — acceptable for an editing-time affordance, since\n * markdown tables can't store widths anyway.\n *\n * Wiring: attach once to the editor container. Listeners are delegated, so\n * they work for tables that appear/disappear as the user edits. Returns a\n * cleanup that removes every listener and any lingering drag state.\n */\n\n/** How close (px) to a cell's right edge the pointer must be to grab it. */\nconst EDGE = 6\n/** Never let a column get narrower than this (px). */\nconst MIN_WIDTH = 48\n\ninterface DragState {\n col: HTMLTableColElement\n table: HTMLTableElement\n startX: number\n startWidth: number\n}\n\nexport function enableFactTableColumnResize(container: HTMLElement): () => void {\n let drag: DragState | null = null\n\n const cellFromEvent = (e: PointerEvent): HTMLTableCellElement | null => {\n const el = e.target as HTMLElement | null\n const cell = el?.closest?.('td, th') as HTMLTableCellElement | null\n // Only content cells resize — never the row/column tool cells.\n if (!cell || cell.hasAttribute('data-tool-cell')) return null\n if (!container.contains(cell)) return null\n return cell\n }\n\n const nearRightEdge = (cell: HTMLTableCellElement, clientX: number): boolean => {\n const rect = cell.getBoundingClientRect()\n return clientX >= rect.right - EDGE && clientX <= rect.right + 2\n }\n\n /** The `<col>` that governs `cell`'s column. Body rows and the colgroup both\n * lead with a tool element, so the cell's index in its row maps 1:1 to the\n * colgroup child index. */\n const colForCell = (cell: HTMLTableCellElement): HTMLTableColElement | null => {\n const row = cell.parentElement\n const table = cell.closest('table')\n const colgroup = table?.querySelector('colgroup')\n if (!row || !table || !colgroup) return null\n const index = Array.prototype.indexOf.call(row.children, cell)\n return (colgroup.children[index] as HTMLTableColElement | undefined) ?? null\n }\n\n /** Freeze every column at its current rendered width before switching to a\n * fixed layout, so grabbing a border doesn't make the whole table jump. The\n * header row has a cell for every colgroup entry (incl. the tool columns),\n * so it's the reliable ruler. */\n const freezeWidths = (table: HTMLTableElement) => {\n const colgroup = table.querySelector('colgroup')\n if (!colgroup) return\n const ruler = table.querySelector('thead tr') ?? table.querySelector('tbody tr')\n const cells = ruler ? Array.from(ruler.children) : []\n Array.from(colgroup.children).forEach((node, i) => {\n const col = node as HTMLTableColElement\n const cell = cells[i] as HTMLElement | undefined\n if (!col.style.width && cell) col.style.width = `${cell.getBoundingClientRect().width}px`\n })\n table.style.tableLayout = 'fixed'\n }\n\n const onPointerMove = (e: PointerEvent) => {\n if (drag) {\n const next = Math.max(MIN_WIDTH, drag.startWidth + (e.clientX - drag.startX))\n drag.col.style.width = `${next}px`\n e.preventDefault()\n return\n }\n // Hover affordance: show the resize cursor only in a cell's right margin.\n const cell = cellFromEvent(e)\n if (cell && nearRightEdge(cell, e.clientX)) {\n cell.style.cursor = 'col-resize'\n } else if (cell) {\n cell.style.cursor = ''\n }\n }\n\n const endDrag = () => {\n if (!drag) return\n drag = null\n document.documentElement.classList.remove('fact-col-resizing')\n document.removeEventListener('pointermove', onPointerMove, true)\n document.removeEventListener('pointerup', endDrag, true)\n }\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n const cell = cellFromEvent(e)\n if (!cell || !nearRightEdge(cell, e.clientX)) return\n const table = cell.closest('table') as HTMLTableElement | null\n if (!table) return\n freezeWidths(table)\n const col = colForCell(cell)\n if (!col) return\n drag = {\n col,\n table,\n startX: e.clientX,\n startWidth: parseFloat(col.style.width) || cell.getBoundingClientRect().width,\n }\n // Grab the border, not the caret: suppress the click-to-edit + selection.\n e.preventDefault()\n document.documentElement.classList.add('fact-col-resizing')\n document.addEventListener('pointermove', onPointerMove, true)\n document.addEventListener('pointerup', endDrag, true)\n }\n\n container.addEventListener('pointerdown', onPointerDown)\n container.addEventListener('pointermove', onPointerMove)\n\n return () => {\n endDrag()\n container.removeEventListener('pointerdown', onPointerDown)\n container.removeEventListener('pointermove', onPointerMove)\n }\n}\n","import { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, PencilLine } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\nimport { observeResize } from '../lib/observe-resize'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactLabelsCellLabels {\n edit: string\n searchPlaceholder: string\n create: (name: string) => string\n empty: string\n}\n\nexport const DEFAULT_FACT_LABELS_CELL_LABELS: FactLabelsCellLabels = {\n edit: 'Edit labels',\n searchPlaceholder: 'Search or create...',\n create: (name) => `Create \\u201c${name}\\u201d`,\n empty: 'No labels yet',\n}\n\nexport interface FactLabelsCellTestIds {\n option: (labelId: string) => string\n}\n\n/** One selectable label: id, name and a colour (any CSS colour) that keys its chip. */\nexport interface FactLabelOption {\n id: string\n name: string\n color: string\n}\n\nexport interface FactLabelsCellProps {\n /** Every label that can be applied. */\n options: FactLabelOption[]\n /** The fact's full label id list (ids not in `options` are preserved on change). */\n selectedIds: string[]\n /** Persist the fact's full label id list. */\n onChange: (ids: string[]) => void\n /** Create a label and resolve with its id (undefined when creation failed). */\n onCreate: (name: string) => Promise<string | undefined>\n /** The grid row height; clamps the chips to the rows that fully fit. */\n rowHeight?: number\n labels?: Partial<FactLabelsCellLabels>\n testIds?: Partial<FactLabelsCellTestIds>\n}\n\n// Visible height reserved per chip row: a touch taller than a chip (~22px) so a row is never\n// clipped at the edges, but short enough that the gap hides the next row.\nconst CHIP_ROW_H = 24\nconst CHIP_GAP = 4\n\n/**\n * The Labels cell of the Facts table: applied labels as colour-keyed chips (an empty cell shows\n * a pencil), and a popover to toggle labels or create one with Enter.\n */\nexport const FactLabelsCell = memo(function FactLabelsCell({\n options,\n selectedIds,\n onChange,\n onCreate,\n rowHeight = 52,\n labels,\n testIds,\n}: FactLabelsCellProps) {\n const l = { ...DEFAULT_FACT_LABELS_CELL_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n const [search, setSearch] = useState('')\n\n const applied = useMemo(\n () => new Set(selectedIds.filter((id) => options.some((o) => o.id === id))),\n [selectedIds, options]\n )\n\n const toggle = (option: FactLabelOption) =>\n onChange(\n applied.has(option.id)\n ? selectedIds.filter((id) => id !== option.id)\n : [...selectedIds, option.id]\n )\n\n const createAndApply = async (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return\n const existing = options.find((o) => o.name.toLowerCase() === trimmed.toLowerCase())\n if (existing) {\n if (!applied.has(existing.id)) onChange([...selectedIds, existing.id])\n setSearch('')\n return\n }\n const id = await onCreate(trimmed)\n if (id) onChange([...selectedIds, id])\n setSearch('')\n }\n\n const clampRows = Math.max(1, Math.floor((rowHeight + CHIP_GAP) / (CHIP_ROW_H + CHIP_GAP)))\n const appliedOptions = options.filter((o) => applied.has(o.id))\n\n // Show an ellipsis whenever chips are hidden below the clamp. A ResizeObserver re-measures on\n // any size change (column resize, row height, layout settling) so the indicator is reliable.\n const chipsRef = useRef<HTMLDivElement>(null)\n const [hasOverflow, setHasOverflow] = useState(false)\n useEffect(() => {\n const el = chipsRef.current\n if (!el) return\n const measure = () => setHasOverflow(el.scrollHeight > el.clientHeight + 1)\n measure()\n return observeResize(el, measure)\n }, [applied, clampRows, rowHeight, options])\n\n const searchMatchesExisting = options.some(\n (o) => o.name.toLowerCase() === search.trim().toLowerCase()\n )\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next)\n if (!next) setSearch('')\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.edit}\n data-slot=\"fact-labels-cell\"\n className=\"group relative flex h-full w-full min-w-0 cursor-pointer items-center gap-1 pr-4 text-left hover:bg-muted\"\n >\n {appliedOptions.length === 0 ? (\n <span className=\"flex-1 text-muted-foreground opacity-50\">\n <PencilLine className=\"size-3.5\" />\n </span>\n ) : (\n <>\n <div\n ref={chipsRef}\n className=\"flex min-w-0 flex-1 flex-wrap content-start gap-1 overflow-hidden\"\n style={{ maxHeight: CHIP_ROW_H * clampRows + CHIP_GAP * (clampRows - 1) }}\n >\n {appliedOptions.map((o) => (\n <span\n key={o.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium\"\n title={o.name}\n style={{ borderColor: o.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: o.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[80px] truncate\">{o.name}</span>\n </span>\n ))}\n </div>\n {hasOverflow && (\n <span\n className=\"pointer-events-none absolute bottom-0.5 right-0.5 text-xs font-semibold leading-none text-muted-foreground\"\n aria-hidden\n >\n …\n </span>\n )}\n </>\n )}\n </button>\n </PopoverTrigger>\n {open && (\n <PopoverContent className=\"w-[360px] p-0\" align=\"start\" side=\"bottom\" sideOffset={4}>\n <Command shouldFilter={true}>\n <CommandInput\n placeholder={l.searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && search.trim() && !searchMatchesExisting) {\n e.preventDefault()\n void createAndApply(search)\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {search.trim() ? (\n <button\n type=\"button\"\n onClick={() => void createAndApply(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"w-full cursor-pointer rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n {l.create(search.trim())}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.empty}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {options.map((o) => {\n const isApplied = applied.has(o.id)\n return (\n <CommandItem\n key={o.id}\n value={o.name}\n onSelect={() => toggle(o)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.option?.(o.id), {\n testId: `fact-label-select-${o.id}`,\n })}\n >\n <span\n className=\"mr-2 flex size-4 shrink-0 items-center justify-center rounded border-2\"\n style={\n isApplied\n ? { borderColor: o.color, backgroundColor: o.color }\n : { borderColor: o.color }\n }\n >\n {isApplied && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n </span>\n <span className=\"flex-1 text-sm\">{o.name}</span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n )}\n </Popover>\n )\n})\n","/**\n * Column definitions for the Facts grid. Every column has an explicit `colId` (AG Grid persists\n * column state by id: see CLAUDE.md). The app supplies behaviour and app-specific cells through\n * slots; the structure, widths, sorting, filters and presentational cells live here.\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport type {\n ColDef,\n ICellRendererParams,\n IHeaderParams,\n ValueGetterParams,\n} from 'ag-grid-community'\nimport { CalendarDays, Paperclip, Quote } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatSpan } from '../timeline/span'\nimport { decodeWhitespaceEntities } from './fact-text'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactColumnLabels {\n inChatHeaderTooltip: string\n inChatTitle: string\n notInChatTitle: string\n removeFromChat: string\n addToChat: string\n fact: string\n dates: string\n dateTitle: string\n labels: string\n verified: string\n verifiedTooltip: string\n shared: string\n sharedTooltip: string\n createdBy: string\n sources: string\n /** Tooltip of the Sources cell for `count` cited documents. */\n sourcedFrom: (count: number) => string\n createdAt: string\n updated: string\n id: string\n}\n\nexport const DEFAULT_FACT_COLUMN_LABELS: FactColumnLabels = {\n inChatHeaderTooltip: 'Facts added to this chat are always in context for this chat',\n inChatTitle: 'In this chat — always in context for it. Click to remove from chat.',\n notInChatTitle: 'Add to chat — always in context for this chat',\n removeFromChat: 'Remove from chat',\n addToChat: 'Add to chat',\n fact: 'Fact',\n dates: 'Dates',\n dateTitle: 'Date of the fact itself, not when this was saved',\n labels: 'Labels',\n verified: 'Verified',\n verifiedTooltip: 'Verified by a human',\n shared: 'Shared',\n sharedTooltip: 'Shared with the workspace, or private to you & your agents',\n createdBy: 'Created by',\n sources: 'Sources',\n sourcedFrom: (n) => `Sourced from ${n} document${n === 1 ? '' : 's'} — open the fact to see them`,\n createdAt: 'Created at',\n updated: 'Updated',\n id: 'ID',\n}\n\nexport interface FactColumnTestIds {\n inChat: (factId: string) => string\n text: (factId: string) => string\n date: (factId: string) => string\n}\n\n/** The fields of a fact the grid reads. Callers' richer types are accepted as-is. */\nexport interface FactRowView {\n external_id: string\n text: string\n confirmed: boolean\n shared: boolean\n date_start?: string | null\n date_end?: string | null\n timezone?: string | null\n tags?: Array<{ name: string }> | null\n citations?: unknown[] | null\n created_by_ext_id?: string | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nexport interface FactColumnSlots<T extends FactRowView> {\n /** Whether the fact is in the host's current chat. With `onToggleInChat`, adds the In chat\n * column; a host without chats leaves both out. Read at render time: the host refreshes the\n * column when its chat changes. */\n isInChat?: (fact: T) => boolean\n /** Add the fact to the current chat, or take it out. */\n onToggleInChat?: (fact: T) => void\n /** Custom header (persistent filter button) for the columns that use one. */\n renderHeader: (params: IHeaderParams, colId: string) => ReactNode\n /** Row action menu, shown at the right edge of the Fact cell. */\n renderRowActions: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Inline label picker for the Labels cell. */\n renderLabels: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The Verified switch. */\n renderVerified: (fact: T) => ReactNode\n /** The Shared switch. */\n renderShared: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The creator avatar. */\n renderCreator: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Sort/filter value for the Created by column (the creator's display name). */\n getCreatorName: (params: ValueGetterParams<T>) => string\n /** Friendly display of an ISO timestamp (Created at / Updated). */\n formatDate: (iso: string) => string\n labels?: Partial<FactColumnLabels>\n testIds?: Partial<FactColumnTestIds>\n}\n\n/**\n * Date-filter params for a column whose value is an ISO string. AG Grid hands the comparator a JS\n * `Date` from the picker and the raw cell value; this compares UTC day components so a filter\n * never shifts a date by a day for viewers west of UTC.\n */\nexport const ISO_DATE_FILTER_PARAMS = {\n browserDatePicker: true,\n comparator: (filterDate: Date, cellValue: unknown): number => {\n if (!cellValue || typeof cellValue !== 'string') return -1\n const cell = new Date(cellValue)\n if (Number.isNaN(cell.getTime())) return -1\n const cellDay = Date.UTC(cell.getUTCFullYear(), cell.getUTCMonth(), cell.getUTCDate())\n const filterDay = Date.UTC(\n filterDate.getFullYear(),\n filterDate.getMonth(),\n filterDate.getDate()\n )\n return cellDay < filterDay ? -1 : cellDay > filterDay ? 1 : 0\n },\n}\n\n/** How many source documents a fact cites (the Sources column counts documents, not passages). */\nexport function sourceDocCount(fact: Pick<FactRowView, 'citations'> | undefined): number {\n return fact?.citations?.length ?? 0\n}\n\n/** Default left-to-right order; default-hidden columns trail. Every colId must be listed. */\nexport const DEFAULT_FACT_COLUMN_ORDER = [\n 'in_chat',\n 'text',\n 'sources',\n 'tags',\n 'date',\n 'confirmed',\n 'shared',\n 'created_by',\n 'created_at',\n 'updated_at',\n 'note_id',\n] as const\n\nexport function createFactColumns<T extends FactRowView>(slots: FactColumnSlots<T>): ColDef<T>[] {\n // AG Grid's `field` is a path type over the row; for a generic row we assert the known keys.\n const fieldOf = (name: keyof FactRowView) => name as ColDef<T>['field']\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...slots.labels }\n const ids = slots.testIds\n\n const { isInChat, onToggleInChat } = slots\n const inChatColumn: ColDef<T>[] =\n isInChat && onToggleInChat\n ? [\n {\n colId: 'in_chat',\n headerName: '',\n headerComponent: () => (\n <span className=\"flex size-full items-center justify-center\">\n <Paperclip className=\"size-3.5 text-muted-foreground\" />\n </span>\n ),\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data ? isInChat(params.data) : false,\n width: 44,\n minWidth: 44,\n maxWidth: 44,\n sortable: true,\n resizable: false,\n headerTooltip: l.inChatHeaderTooltip,\n cellClass: 'cell-hcenter',\n // A toggle, not a readout: a fact in the chat rides every message of it, so it flips\n // in place.\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n const inChat = isInChat(fact)\n return (\n <button\n type=\"button\"\n onClick={() => onToggleInChat(fact)}\n title={inChat ? l.inChatTitle : l.notInChatTitle}\n aria-label={inChat ? l.removeFromChat : l.addToChat}\n aria-pressed={inChat}\n data-testid={testIdOr(ids?.inChat?.(fact.external_id), {\n testId: `facts-grid-in-chat-${fact.external_id}`,\n })}\n className=\"flex h-full items-center\"\n >\n <Paperclip\n className={cn(\n 'size-3.5',\n inChat\n ? 'text-primary'\n : 'text-muted-foreground/30 transition-colors hover:text-muted-foreground'\n )}\n />\n </button>\n )\n },\n },\n ]\n : []\n\n const columns: ColDef<T>[] = [\n ...inChatColumn,\n {\n colId: 'text',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'text'),\n headerName: l.fact,\n field: fieldOf('text'),\n flex: 3,\n minWidth: 280,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Decode the editor's whitespace entities (`&#x20;` for a trailing space) so the tooltip\n // reads as typed, not as raw markdown references.\n tooltipValueGetter: (p) => decodeWhitespaceEntities(p.data?.text),\n // Editable only via the grid api (Rename in the row's menu); clicks never open the editor\n // (suppressClickEdit on the grid).\n editable: true,\n cellEditor: 'agLargeTextCellEditor',\n cellEditorPopup: true,\n cellEditorParams: { rows: 8, cols: 60 },\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.text = params.newValue\n return true\n },\n // NOT `cell-multiline`: this cell has its OWN clamp (the `.fact-clamp` span below, sized\n // from the row height). A second clamp cut the text in half at the minimum row height.\n cellClass: 'relative',\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n // Clamp to however many WHOLE lines fit the row height (leading-snug ~ 20px/line),\n // top-aligned so the BEGINNING of the fact is always shown. No overflow clip here: the\n // wrapper is the cell's content box, shorter than a line at the density floor.\n const rowH = params.node.rowHeight ?? 52\n const clampLines = Math.max(1, Math.floor(rowH / 20))\n return (\n <div className=\"relative flex size-full items-start pr-6\">\n <span\n className=\"fact-clamp whitespace-normal break-words text-sm leading-snug text-foreground\"\n style={{ ['--fact-clamp-lines' as string]: clampLines } as CSSProperties}\n data-testid={testIdOr(ids?.text?.(fact.external_id), {\n testId: `facts-grid-text-${fact.external_id}`,\n })}\n >\n {decodeWhitespaceEntities(fact.text)}\n </span>\n {/* `facts-row-kebab` (app CSS) keeps the menu always visible: touch has no hover. */}\n <div className=\"facts-row-kebab absolute right-0.5 top-1/2 -translate-y-1/2\">\n {slots.renderRowActions(fact, params)}\n </div>\n </div>\n )\n },\n },\n {\n colId: 'date',\n // AG Grid's DEFAULT header, so the sort arrow and filter button are the native ones,\n // identical to the Files table's Date columns.\n headerName: l.dates,\n // Sort on the raw bound rather than the rendered string (\"Oct 2019\" sorts April first).\n field: fieldOf('date_start'),\n flex: 0.8,\n minWidth: 132,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // The edit value is the date-only slice: a lexical sort matches a chronological one, and\n // the inline editor shows \"2024-03-12\" rather than a full ISO timestamp. Inline typing\n // accepts YYYY, YYYY-MM or YYYY-MM-DD; clearing the cell undates the fact.\n editable: true,\n singleClickEdit: true,\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data?.date_start ? params.data.date_start.slice(0, 10) : null,\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.date_start = params.newValue\n return true\n },\n cellClass: 'relative cell-tnum',\n cellRenderer: (params: ICellRendererParams<T>) => {\n const when = formatSpan(\n params.data?.date_start,\n params.data?.date_end,\n params.data?.timezone\n )\n if (!when) return <span className=\"text-muted-foreground/50\">—</span>\n return (\n <span\n className=\"inline-flex items-center gap-1\"\n data-testid={testIdOr(ids?.date?.(params.data?.external_id ?? ''), {\n testId: `facts-grid-date-${params.data?.external_id}`,\n })}\n title={l.dateTitle}\n >\n <CalendarDays className=\"size-3 opacity-70\" />\n {when}\n </span>\n )\n },\n },\n {\n colId: 'tags',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'tags'),\n headerName: l.labels,\n flex: 0.9,\n // Never narrower than its own header, even with the filter button and sort indicator.\n minWidth: 160,\n sortable: true,\n filter: 'agTextColumnFilter',\n cellClass: 'overflow-visible',\n valueGetter: (params: ValueGetterParams<T>) =>\n (params.data?.tags ?? []).map((t) => t.name).join(', '),\n // Editable in place: toggling a label persists immediately, no dialog round-trip.\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? slots.renderLabels(params.data, params) : null,\n },\n {\n colId: 'confirmed',\n headerName: l.verified,\n headerTooltip: l.verifiedTooltip,\n field: fieldOf('confirmed'),\n // minWidth matches width so the header can't be clamped narrow enough to ellipsize.\n width: 116,\n minWidth: 116,\n sortable: true,\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.confirmed ?? false,\n cellClass: 'cell-hcenter',\n headerClass: 'header-hcenter',\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderVerified(params.data)}\n </div>\n ) : null,\n },\n {\n colId: 'shared',\n headerName: l.shared,\n headerTooltip: l.sharedTooltip,\n field: fieldOf('shared'),\n // minWidth (not just width) is raised too: AG Grid clamps any persisted width up to it.\n width: 110,\n minWidth: 110,\n sortable: true,\n headerClass: 'header-hcenter',\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.shared ?? false,\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderShared(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'created_by',\n headerName: l.createdBy,\n headerTooltip: l.createdBy,\n width: 138,\n minWidth: 138,\n sortable: true,\n valueGetter: (params) => slots.getCreatorName(params),\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderCreator(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'sources',\n headerName: l.sources,\n width: 112,\n minWidth: 104,\n sortable: true,\n // A hand-written fact has no sources, which is information rather than a gap: it reads as\n // an em dash instead of a zero.\n valueGetter: (params) => sourceDocCount(params.data),\n cellRenderer: (params: ICellRendererParams<T>) => {\n const n = sourceDocCount(params.data)\n if (n === 0) return <span className=\"text-muted-foreground/40\">—</span>\n return (\n <span\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\"\n title={l.sourcedFrom(n)}\n >\n <Quote className=\"size-3 opacity-70\" />\n {n}\n </span>\n )\n },\n },\n {\n colId: 'created_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'created_at'),\n headerName: l.createdAt,\n field: fieldOf('created_at'),\n width: 162,\n minWidth: 154,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // Display-only: a valueFormatter avoids mounting a React component per row.\n cellClass: 'text-muted-foreground',\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'updated_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'updated_at'),\n headerName: l.updated,\n field: fieldOf('updated_at'),\n width: 140,\n minWidth: 140,\n // Hidden by default: a column-menu opt-in like the documents grid's long tail.\n hide: true,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'note_id',\n headerName: l.id,\n field: fieldOf('external_id'),\n width: 120,\n minWidth: 100,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Hidden by default like the documents ID column: needed when quoting a fact to support.\n hide: true,\n cellClass: 'font-mono text-xs text-muted-foreground',\n },\n ]\n\n // Persisted per-user column order still wins once set; bump the grid id to apply a new default.\n return DEFAULT_FACT_COLUMN_ORDER.map((id) => columns.find((c) => c.colId === id)).filter(\n (c): c is ColDef<T> => c !== undefined\n )\n}\n","/**\n * FactRowActions\n *\n * The ⋯ kebab menu for a Facts table row — mirroring the documents table's row\n * kebab. Carries Rename (inline-edit the fact text), Edit (the full dialog), and\n * Delete. Replaces the old inline edit-pencil affordance.\n */\nimport { MoreVertical, Pencil, Trash2 } from 'lucide-react'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactRowActionsLabels {\n actions: string\n edit: string\n /** Tooltip on a disabled Edit: rewording a fact is for its creator or a workspace owner. */\n editRestricted: string\n delete: string\n}\n\nexport const DEFAULT_FACT_ROW_ACTIONS_LABELS: FactRowActionsLabels = {\n actions: 'Fact actions',\n edit: 'Edit',\n editRestricted: 'Only the creator or a workspace owner can reword this fact',\n delete: 'Delete',\n}\n\nexport interface FactRowActionsTestIds {\n trigger: string\n edit: string\n delete: string\n}\n\nexport interface FactRowActionsProps {\n onEdit: () => void\n /** False when the viewer may not reword the fact: Edit is shown disabled, with the reason. */\n canEdit?: boolean\n onDelete: () => void\n labels?: Partial<FactRowActionsLabels>\n testIds?: Partial<FactRowActionsTestIds>\n}\n\nexport function FactRowActions({\n onEdit,\n canEdit = true,\n onDelete,\n labels,\n testIds,\n}: FactRowActionsProps) {\n const l = { ...DEFAULT_FACT_ROW_ACTIONS_LABELS, ...labels }\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => e.stopPropagation()}\n className=\"flex size-6 pointer-coarse:size-11 items-center justify-center rounded text-muted-foreground/70 transition-colors hover:bg-muted hover:text-foreground data-[state=open]:bg-muted data-[state=open]:text-foreground\"\n data-testid={testIdOr(testIds?.trigger, { testId: 'fact-row-actions' })}\n aria-label={l.actions}\n >\n <MoreVertical className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" onClick={(e) => e.stopPropagation()}>\n <DropdownMenuItem\n onSelect={onEdit}\n disabled={!canEdit}\n title={canEdit ? undefined : l.editRestricted}\n data-testid={testIdOr(testIds?.edit, { testId: 'fact-action-edit' })}\n >\n <Pencil className=\"mr-2 size-4\" />\n {l.edit}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={onDelete}\n className=\"text-red-text focus:text-red-text\"\n data-testid={testIdOr(testIds?.delete, { testId: 'fact-action-delete' })}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {l.delete}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * Chronology tables in a chat answer, as dated facts. A table with a Date (or When) column\n * becomes one fact per row, dated by that column, so the Timeline can place each event. Only\n * unambiguous date spellings are read; a row whose date will not parse stays an undated fact.\n */\nimport type { components } from '@arbidocs/client'\nimport { EMPTY_FACT_DATE_FIELDS, factDateFieldsToSpan } from './fact-date'\nimport type { FactCitations } from './fact-citations'\n\ntype CreateFactBody = components['schemas']['CreateFactRequest']\n\nconst MONTHS = [\n 'january',\n 'february',\n 'march',\n 'april',\n 'may',\n 'june',\n 'july',\n 'august',\n 'september',\n 'october',\n 'november',\n 'december',\n]\n\n/** 1-based month number for an English month name or its three-letter abbreviation. */\nfunction monthNumber(name: string): number | null {\n const n = name.toLowerCase()\n const index = MONTHS.findIndex((m) => m === n || (n.length === 3 && m.startsWith(n)))\n return index === -1 ? null : index + 1\n}\n\n/** `YYYY-MM-DD` for an unambiguous date cell, or null. Impossible calendar days are rejected. */\nexport function parseChronologyDate(raw: string): string | null {\n const text = raw.replace(/[*_]/g, '').trim().replace(/\\.$/, '')\n let year: number\n let month: number | null\n let day: number\n const iso = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(text)\n const dayFirst = /^(\\d{1,2})(?:st|nd|rd|th)?\\s+([A-Za-z]+),?\\s+(\\d{4})$/.exec(text)\n const monthFirst = /^([A-Za-z]+)\\s+(\\d{1,2})(?:st|nd|rd|th)?,?\\s+(\\d{4})$/.exec(text)\n if (iso) {\n year = Number(iso[1])\n month = Number(iso[2])\n day = Number(iso[3])\n } else if (dayFirst) {\n day = Number(dayFirst[1])\n month = monthNumber(dayFirst[2])\n year = Number(dayFirst[3])\n } else if (monthFirst) {\n month = monthNumber(monthFirst[1])\n day = Number(monthFirst[2])\n year = Number(monthFirst[3])\n } else {\n return null\n }\n if (month === null) return null\n const probe = new Date(Date.UTC(year, month - 1, day))\n if (probe.getUTCDate() !== day || probe.getUTCMonth() !== month - 1) return null\n return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`\n}\n\n/** Cells of one markdown table row, without the outer pipes. */\nfunction splitRow(line: string): string[] {\n return line\n .trim()\n .replace(/^\\|/, '')\n .replace(/\\|$/, '')\n .split('|')\n .map((c) => c.trim())\n}\n\nconst SEPARATOR = /^\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)*\\|?$/\n\n/**\n * One fact body per row of every table in `markdown` that has a Date or When column, or null\n * when no row carries a parseable date (the answer is then saved as one fact, as before).\n */\nexport function chronologyFactBodies(\n markdown: string,\n citations: FactCitations | null\n): CreateFactBody[] | null {\n const lines = markdown.split('\\n').map((l) => l.trim())\n const bodies: CreateFactBody[] = []\n for (let i = 0; i < lines.length - 1; i++) {\n if (!lines[i].startsWith('|') || !SEPARATOR.test(lines[i + 1])) continue\n const dateCol = splitRow(lines[i]).findIndex((h) => /\\b(date|when)\\b/i.test(h))\n if (dateCol === -1) continue\n let row = i + 2\n for (; row < lines.length && lines[row].startsWith('|'); row++) {\n const cells = splitRow(lines[row])\n const date = parseChronologyDate(cells[dateCol] ?? '')\n const text = cells\n .filter((_, idx) => idx !== dateCol)\n .filter(Boolean)\n .join(' — ')\n if (!text) continue\n bodies.push({\n text,\n shared: false,\n confirmed: true,\n tag_ext_ids: [],\n citations,\n ...(date ? factDateFieldsToSpan({ ...EMPTY_FACT_DATE_FIELDS, date }) : {}),\n })\n }\n i = row - 1\n }\n return bodies.some((b) => b.date) ? bodies : null\n}\n"]}
1
+ {"version":3,"sources":["../src/facts/FactSourceGroup.tsx","../src/facts/fact-citations.ts","../src/facts/cited-version-ref.ts","../src/facts/FactComposer.tsx","../src/facts/fact-date.ts","../src/facts/FactDateInput.tsx","../src/facts/FactsBulkBar.tsx","../src/facts/FactsEmptyState.tsx","../src/facts/FactsFieldsButton.tsx","../src/facts/FactTimelineViews.tsx","../src/facts/FactsViewToggle.tsx","../src/facts/FactsToolbar.tsx","../src/facts/fact-table-column-resize.ts","../src/facts/FactLabelsCell.tsx","../src/facts/factColumns.tsx","../src/facts/FactRowActions.tsx","../src/facts/fact-chronology.ts"],"names":["document","jsxs","testIdOr","jsx","X","unwrapCitationLinks","versionRef","cn","Tooltip","TooltipTrigger","Info","TooltipContent","Button","Loader2","Trash2","detectTimeZone","useMemo","useState","ChevronLeft","ChevronRight","listTimeZones","formatSpan","Popover","PopoverTrigger","CalendarDays","PopoverContent","Input","SelectionBar","Fragment","SelectionBarAction","Paperclip","Tags","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuItem","FolderUp","DropdownMenuSeparator","CalendarClock","Scale","Lightbulb","Milestone","ArrowRight","Columns3","ChevronDown","Command","CommandList","CommandGroup","CommandItem","RotateCcw","CommandSeparator","Check","useRef","useEffect","TimelineCalendar","TimelineGantt","Table2","CalendarRange","GanttChartSquare","Search","ViewToggle","observeResize","FilterInput","BookMarked","TabHeader","Plus","memo","FactLabelsCell","PencilLine","CommandInput","CommandEmpty","decodeWhitespaceEntities","Quote","MoreVertical","Pencil"],"mappings":"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","file":"chunk-YD3RN2FY.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { X } from 'lucide-react'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactSourceGroupLabels {\n remove: string\n wholeDocument: string\n}\n\nexport const DEFAULT_FACT_SOURCE_GROUP_LABELS: FactSourceGroupLabels = {\n remove: 'Remove this document',\n wholeDocument: 'Whole document — open it to cite specific passages',\n}\n\nexport interface FactSourceGroupTestIds {\n root: (docId: string) => string\n remove: (docId: string) => string\n}\n\nexport interface FactSourceGroupProps {\n docId: string\n /** The document label/pill (the app supplies its entity pill). */\n document: ReactNode\n /** True when this document is the one on display in the viewer. */\n isViewing?: boolean\n /** Remove this document from the sources. Absent: a read-only list, no remove control. */\n onRemove?: () => void\n /** The FactPassageItem children; when absent a \"whole document\" hint shows. */\n children?: ReactNode\n /** Whether any passages are cited from this document. */\n hasPassages: boolean\n labels?: Partial<FactSourceGroupLabels>\n testIds?: Partial<FactSourceGroupTestIds>\n}\n\n/** One cited document in the sources list: its label, a remove control and its passages. */\nexport function FactSourceGroup({\n docId,\n document,\n isViewing,\n onRemove,\n children,\n hasPassages,\n labels,\n testIds,\n}: FactSourceGroupProps) {\n const l = { ...DEFAULT_FACT_SOURCE_GROUP_LABELS, ...labels }\n return (\n <div\n className=\"flex flex-col gap-1\"\n data-testid={testIdOr(testIds?.root?.(docId), { testId: `citation-doc-${docId}` })}\n data-viewing={isViewing || undefined}\n data-slot=\"fact-source-group\"\n >\n <div className=\"flex items-center gap-1.5 px-1 text-sm\">\n {document}\n <span className=\"flex-1\" />\n {onRemove && (\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={l.remove}\n data-testid={testIdOr(testIds?.remove?.(docId), {\n testId: `fact-source-remove-${docId}`,\n })}\n className=\"shrink-0 rounded p-0.5 hover:bg-destructive/20 hover:text-destructive pointer-coarse:p-3\"\n >\n <X className=\"size-3\" />\n </button>\n )}\n </div>\n {hasPassages ? (\n children\n ) : (\n <span className=\"px-2 text-xs text-muted-foreground\">{l.wholeDocument}</span>\n )}\n </div>\n )\n}\n","/**\n * Fact citations: the documents a fact draws on, each with the passages cited\n * from it. Mirrors the backend `CitationSources`:\n *\n * [{ doc_ext_id, chunks: [{ chunk_id, page }] }]\n *\n * An EMPTY `chunks` list means the whole document is the source (the picker's\n * checkbox). Order matters: best document first, best chunk first within it.\n *\n * {@link buildFactCitations} produces that from a chat answer at save time —\n * the fact's `text` is CLEAN (markers stripped): that is what the table shows,\n * the search indexes and the assistant reads. The helpers below are the only\n * way the UI should edit a citation list, so the two invariants (a document\n * appears once; a chunk appears once within it) hold everywhere.\n */\nimport { unwrapCitationLinks } from '@arbidocs/react/artifacts'\n\n/** One cited passage — mirrors the backend `CitedChunk`. */\nexport interface FactCitedChunk {\n chunk_id: string\n page?: number | null\n}\n\n/** One cited document — mirrors the backend `CitedDocument`. */\nexport interface FactCitedDoc {\n doc_ext_id: string\n /** The document version quoted; missing = its current version (the backend pins it on save). */\n version?: number | null\n chunks: FactCitedChunk[]\n}\n\nexport type FactCitations = FactCitedDoc[]\n\ntype MaybeCitations = FactCitations | null | undefined\n\n/**\n * Adopt a server citation list as a local one. The generated `CitedDocument`\n * leaves `chunks` optional (a whole-document source may omit it); everything in\n * the UI wants it present, so it is filled in ONCE, here, where server facts\n * enter the composer — rather than casting at every call site.\n */\nexport function toFactCitations(\n citations:\n | { doc_ext_id: string; version?: number | null; chunks?: FactCitedChunk[] | null }[]\n | null\n | undefined\n): FactCitations | null {\n if (!citations) return null\n return citations.map((d) => ({\n doc_ext_id: d.doc_ext_id,\n ...(d.version ? { version: d.version } : {}),\n chunks: d.chunks ?? [],\n }))\n}\n\n/** A whole-document source: the picker ticked it without choosing passages. */\nexport function isWholeDoc(doc: FactCitedDoc): boolean {\n return doc.chunks.length === 0\n}\n\nexport function docIdsOf(citations: MaybeCitations): string[] {\n return (citations ?? []).map((d) => d.doc_ext_id)\n}\n\nexport function chunkIdsOf(citations: MaybeCitations): string[] {\n return (citations ?? []).flatMap((d) => d.chunks.map((c) => c.chunk_id))\n}\n\nexport function hasChunk(citations: MaybeCitations, chunkId: string): boolean {\n return (citations ?? []).some((d) => d.chunks.some((c) => c.chunk_id === chunkId))\n}\n\n/** Cite a whole document. No-op when it is already a source. */\nexport function withDoc(citations: MaybeCitations, docExtId: string): FactCitations {\n const list = citations ?? []\n if (list.some((d) => d.doc_ext_id === docExtId)) return list\n return [...list, { doc_ext_id: docExtId, chunks: [] }]\n}\n\n/** Drop a document and every passage cited from it. Null once nothing remains. */\nexport function withoutDoc(citations: MaybeCitations, docExtId: string): FactCitations | null {\n const remaining = (citations ?? []).filter((d) => d.doc_ext_id !== docExtId)\n return remaining.length ? remaining : null\n}\n\n/** Cite a passage; creates the document entry if needed. No-op on a duplicate. */\nexport function withChunk(\n citations: MaybeCitations,\n docExtId: string,\n chunk: FactCitedChunk\n): FactCitations {\n const list = citations ?? []\n const idx = list.findIndex((d) => d.doc_ext_id === docExtId)\n if (idx === -1) return [...list, { doc_ext_id: docExtId, chunks: [chunk] }]\n const doc = list[idx]\n if (doc.chunks.some((c) => c.chunk_id === chunk.chunk_id)) return list\n const next = [...list]\n next[idx] = { ...doc, chunks: [...doc.chunks, chunk] }\n return next\n}\n\n/**\n * Un-cite a passage. By default the document STAYS a source (as a whole-doc\n * reference) when it loses its last passage — removing the source itself is a\n * separate act (`withoutDoc`). Pass `keepDoc: false` to drop it too.\n */\nexport function withoutChunk(\n citations: MaybeCitations,\n chunkId: string,\n opts: { keepDoc?: boolean } = {}\n): FactCitations | null {\n const keepDoc = opts.keepDoc ?? true\n const list = citations ?? []\n if (!hasChunk(list, chunkId)) return citations ?? null\n const next: FactCitations = []\n for (const doc of list) {\n if (!doc.chunks.some((c) => c.chunk_id === chunkId)) {\n next.push(doc)\n continue\n }\n const chunks = doc.chunks.filter((c) => c.chunk_id !== chunkId)\n if (chunks.length || keepDoc) next.push({ ...doc, chunks })\n }\n return next.length ? next : null\n}\n\n/**\n * Repair a bold run whose closing `**`/`__` sits directly between a punctuation\n * character and a word character, e.g. `**Mr. Kantor, Esq.**and`. CommonMark\n * treats that closer as NOT right-flanking and leaves both delimiters literal.\n * The chat never shows this because the citation marker supplied a `]`\n * boundary; a fact loses it the moment the marker is stripped. A no-op on\n * well-formed markdown.\n */\nfunction repairBoldFlanking(md: string): string {\n return md.replace(/([.,;:!?\"'’”)\\]])(\\*\\*|__)(?=[A-Za-z0-9])/g, '$1$2 ')\n}\n\n/**\n * A chat lead-in such as \"Here's a short overview:\" that introduces the answer\n * body. A fact's label is its first line, so the lead-in would title the fact.\n * Only a single colon-ended line in that shape is dropped, and only when a body\n * follows it.\n */\nconst CHAT_LEAD_IN =\n /^(?:here(?:'s| is| are)|below (?:is|are)|sure|certainly)\\b[^\\n]*:[ \\t]*(?:\\n+|$)/i\n\nfunction dropChatLeadIn(md: string): string {\n const body = md.replace(CHAT_LEAD_IN, '')\n return body.trim() ? body : md\n}\n\ninterface RawChunk {\n chunk_id?: string\n metadata?: { chunk_ext_id?: string; doc_ext_id?: string | null; page_number?: number | null }\n}\n\n/**\n * Build a fact's clean text + citations from an assistant answer.\n *\n * @param content Answer markdown, WITH `[text](#cite-N)` markers.\n * @param activeCitations `model_citations`: citation number → chunk_ids.\n * @param citationData Retrieval chunks, keyed by file (holds the metadata).\n */\nexport function buildFactCitations(\n content: string,\n activeCitations: Record<string, string[]> | null,\n citationData: Record<string, unknown>\n): { text: string; citations: FactCitations | null } {\n const text = dropChatLeadIn(repairBoldFlanking(unwrapCitationLinks(content)).trim()).trim()\n if (!activeCitations) return { text, citations: null }\n\n // chunk id → {doc_ext_id, page}, first occurrence wins. A citation's chunk_ids\n // key against a chunk's `metadata.chunk_ext_id` (the same join the chat's\n // renderer uses); the top-level `chunk_id` is a fallback for older payloads.\n const chunkMeta = new Map<string, { doc_ext_id: string | null; page: number | null }>()\n for (const chunks of Object.values(citationData)) {\n if (!Array.isArray(chunks)) continue\n for (const chunk of chunks as RawChunk[]) {\n const meta = {\n doc_ext_id: chunk.metadata?.doc_ext_id ?? null,\n page: chunk.metadata?.page_number ?? null,\n }\n for (const key of [chunk.metadata?.chunk_ext_id, chunk.chunk_id]) {\n if (key && !chunkMeta.has(key)) chunkMeta.set(key, meta)\n }\n }\n }\n\n // Citation order, grouped by document, deduped by chunk. A chunk whose document\n // is unknown cannot be cited (every chunk belongs to exactly one document).\n let citations: FactCitations | null = null\n for (const chunkIds of Object.values(activeCitations)) {\n for (const chunkId of chunkIds) {\n const meta = chunkMeta.get(chunkId)\n if (!meta?.doc_ext_id) continue\n citations = withChunk(citations, meta.doc_ext_id, { chunk_id: chunkId, page: meta.page })\n }\n }\n return { text, citations }\n}\n","/**\n * What to open for a cited passage: a document keeps one id across its versions, so a passage\n * quoted from an older version opens that version (`doc-…@v{n}`, read-only in the viewer), and one\n * from the current version (or with no version) opens the document itself.\n */\nimport { versionRef } from '@arbidocs/react/artifacts'\n\nexport function citedVersionRef(\n docId: string,\n version: number | null | undefined,\n currentVersion: number | null | undefined\n): string {\n if (!version) return docId\n // Unknown current version: name the version exactly (the viewer opens the current one as itself).\n return currentVersion != null && currentVersion === version ? docId : versionRef(docId, version)\n}\n","import type { ReactNode, Ref } from 'react'\nimport { Info, Loader2, Trash2 } from 'lucide-react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactComposerLabels {\n shared: string\n verified: string\n dates: string\n deleteFact: string\n cancel: string\n saveFact: string\n saving: string\n addFact: string\n adding: string\n}\n\nexport const DEFAULT_FACT_COMPOSER_LABELS: FactComposerLabels = {\n shared: 'Shared',\n verified: 'Verified',\n dates: 'Dates',\n deleteFact: 'Delete fact',\n cancel: 'Cancel',\n saveFact: 'Save fact',\n saving: 'Saving…',\n addFact: 'Add fact',\n adding: 'Adding…',\n}\n\nexport interface FactComposerTestIds {\n tags: string\n delete: string\n save: string\n error: string\n}\n\nexport interface FactSourcesRowLabels {\n sources: string\n hintButton: string\n hint: string\n}\n\nexport const DEFAULT_FACT_SOURCES_ROW_LABELS: FactSourcesRowLabels = {\n sources: 'Sources',\n hintButton: 'How to add sources',\n hint: \"In the picker, tick a document's checkbox to add it as a source, or click its name to just open it. Inside a document, click a passage to add it — shift-click to take a whole range. Add as many as you like, from as many documents as you like.\",\n}\n\n/** Composer field: the name stacked above its control (\"Labels\", \"Dates\"...). */\nexport function FactFieldRow({\n label,\n children,\n className,\n}: {\n label: string\n children: ReactNode\n className?: string\n}) {\n return (\n <div className={cn('flex flex-col gap-1.5', className)} data-slot=\"fact-field-row\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n <div className=\"min-w-0\">{children}</div>\n </div>\n )\n}\n\nexport interface FactSourcesRowProps {\n /** The show/hide-sources toggle. */\n toggle: ReactNode\n /** The document picker. */\n picker: ReactNode\n labels?: Partial<FactSourcesRowLabels>\n /** Test id of the hint button (default `facts-source-hint`). */\n hintTestId?: string\n}\n\n/** Sources label (with passage-collection guidance), the sources toggle and the picker. */\nexport function FactSourcesRow({ toggle, picker, labels, hintTestId }: FactSourcesRowProps) {\n const l = { ...DEFAULT_FACT_SOURCES_ROW_LABELS, ...labels }\n return (\n <div className=\"flex flex-col gap-1.5\" data-slot=\"fact-sources-row\">\n <span className=\"flex items-center gap-1 text-sm font-medium text-foreground\">\n {l.sources}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.hintButton}\n className=\"text-muted-foreground hover:text-foreground\"\n data-testid={testIdOr(hintTestId, { testId: 'facts-source-hint' })}\n >\n <Info className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-xs\">{l.hint}</TooltipContent>\n </Tooltip>\n </span>\n <div className=\"flex items-start gap-3\">\n {toggle}\n <div className=\"min-w-0 flex-1\">{picker}</div>\n </div>\n </div>\n )\n}\n\nexport interface FactComposerProps {\n /** Whether the composer is open (it stays mounted so it animates both ways). */\n isOpen: boolean\n /** Ref to the panel (used to keep it measured/focus-managed by the page). */\n panelRef?: Ref<HTMLDivElement>\n /** The WYSIWYG fact editor, with its sources row. */\n editor: ReactNode\n /** The labels picker row. */\n labels: ReactNode\n /** The Shared switch (label is added here). */\n sharedToggle: ReactNode\n /** The Verified switch (label is added here). */\n verifiedToggle: ReactNode\n /** The date picker. */\n dateInput: ReactNode\n /** Editing an existing fact (shows Delete, \"Save fact\"). */\n isEditing: boolean\n canSave: boolean\n isSaving: boolean\n isDeleting: boolean\n onSave: () => void\n onCancel: () => void\n onDelete: () => void\n error?: string | null\n uiLabels?: Partial<FactComposerLabels>\n testIds?: Partial<FactComposerTestIds>\n}\n\n/**\n * The inline fact composer: editor on top, then labels + Shared / Verified, then the date with\n * Cancel / Save (and Delete when editing). Always mounted; the grid-rows transition animates it\n * open and closed symmetrically (a conditional mount could only animate one way).\n */\nexport function FactComposer({\n isOpen,\n panelRef,\n editor,\n labels,\n sharedToggle,\n verifiedToggle,\n dateInput,\n isEditing,\n canSave,\n isSaving,\n isDeleting,\n onSave,\n onCancel,\n onDelete,\n error,\n uiLabels: labelOverrides,\n testIds,\n}: FactComposerProps) {\n const l = { ...DEFAULT_FACT_COMPOSER_LABELS, ...labelOverrides }\n return (\n <div\n className={cn(\n 'grid shrink-0 transition-[grid-template-rows,opacity] duration-500 ease-in-out',\n isOpen ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'\n )}\n data-slot=\"fact-composer\"\n >\n <div className=\"overflow-hidden\">\n <div\n ref={panelRef}\n className=\"facts-composer flex flex-col gap-4 border-b border-border bg-muted px-4 py-4\"\n >\n <div className=\"flex flex-col gap-3\">\n {editor}\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n <div\n data-testid={testIdOr(testIds?.tags, { testId: 'facts-page-composer-tags' })}\n className=\"min-w-[14rem] flex-1\"\n >\n {labels}\n </div>\n <div className=\"flex shrink-0 items-center gap-6\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {sharedToggle}\n {l.shared}\n </div>\n <div className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n {verifiedToggle}\n {l.verified}\n </div>\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-2\">\n <div className=\"flex min-w-[10rem] flex-1 flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-foreground\">{l.dates}</span>\n {dateInput}\n </div>\n <div className=\"flex shrink-0 items-center gap-2 self-end max-sm:w-full max-sm:justify-end\">\n {isEditing && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"size-7 p-0 text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:size-11\"\n onClick={onDelete}\n disabled={isDeleting}\n data-testid={testIdOr(testIds?.delete, {\n testId: 'facts-page-composer-delete',\n })}\n aria-label={l.deleteFact}\n title={l.deleteFact}\n >\n {isDeleting ? (\n <Loader2 className=\"size-3.5 animate-spin\" />\n ) : (\n <Trash2 className=\"size-3.5\" />\n )}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 pointer-coarse:h-11\"\n onClick={onCancel}\n >\n {l.cancel}\n </Button>\n <Button\n size=\"sm\"\n className=\"h-7 pointer-coarse:h-11\"\n disabled={!canSave}\n onClick={onSave}\n data-testid={testIdOr(testIds?.save, { testId: 'facts-page-composer-save' })}\n >\n {isEditing\n ? isSaving\n ? l.saving\n : l.saveFact\n : isSaving\n ? l.adding\n : l.addFact}\n </Button>\n </div>\n </div>\n </div>\n </div>\n {error && (\n <p\n className=\"text-xs text-destructive\"\n data-testid={testIdOr(testIds?.error, { testId: 'facts-page-composer-error' })}\n >\n {error}\n </p>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * A fact's date span, translated between the API's ISO instants and the\n * editable wall-clock fields FactDateInput renders. Kept apart from the\n * component so the conversions are plain functions with no React in them.\n */\nimport { detectTimeZone } from '../calendar/zone'\n\nexport interface FactDateFields {\n /** `YYYY-MM-DD`. Empty means the fact has no date at all. */\n date: string\n /** `HH:MM`. Empty means `date` is a whole day, not an instant. */\n time: string\n /** IANA zone `time` is expressed in. Only meaningful (and only sent) when `time` is set. */\n timezone: string\n /** `YYYY-MM-DD` end of a range. Empty means a single day/instant, not a span. */\n endDate: string\n /** `HH:MM` paired with `endDate`, only offered once `time` is set. */\n endTime: string\n}\n\nexport const EMPTY_FACT_DATE_FIELDS: FactDateFields = {\n date: '',\n time: '',\n timezone: '',\n endDate: '',\n endTime: '',\n}\n\nfunction isMidnightUtc(d: Date): boolean {\n return d.getUTCHours() === 0 && d.getUTCMinutes() === 0 && d.getUTCSeconds() === 0\n}\n\nfunction isEndOfDayUtc(d: Date): boolean {\n return d.getUTCHours() === 23 && d.getUTCMinutes() === 59\n}\n\nfunction dayKeyUtc(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n/** A timezone name safe to hand to `Intl` — free-typed garbage falls back to UTC\n * rather than throwing and taking the whole date field down with it. */\nfunction safeTimeZone(tz: string): string {\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: tz })\n return tz\n } catch {\n return 'UTC'\n }\n}\n\n/** Wall-clock parts (`YYYY-MM-DD`, `HH:MM`) an ISO instant reads as in `timeZone`. */\nfunction isoToZonedParts(iso: string, timeZone: string): { date: string; time: string } {\n const d = new Date(iso)\n const parts = Object.fromEntries(\n new Intl.DateTimeFormat('en-US', {\n timeZone: safeTimeZone(timeZone),\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n })\n .formatToParts(d)\n .map((p) => [p.type, p.value])\n )\n return {\n date: `${parts.year}-${parts.month}-${parts.day}`,\n time: `${parts.hour}:${parts.minute}`,\n }\n}\n\n/** The UTC instant a `YYYY-MM-DD` + `HH:MM` wall-clock pair means in `timeZone`,\n * found by reading a naive guess back through the zone and correcting for its\n * offset — no date library, at the cost of rare DST-boundary imprecision. */\nfunction zonedPartsToIso(date: string, time: string, timeZone: string): string {\n const tz = safeTimeZone(timeZone)\n const guess = new Date(`${date}T${time}:00Z`)\n const zoned = isoToZonedParts(guess.toISOString(), tz)\n const [y, m, dd] = zoned.date.split('-').map(Number)\n const [hh, mi] = zoned.time.split(':').map(Number)\n const asIfUtc = Date.UTC(y, m - 1, dd, hh, mi)\n const offsetMs = asIfUtc - guess.getTime()\n return new Date(guess.getTime() - offsetMs).toISOString()\n}\n\n/** Editable fields from a stored fact's date span — the inverse of `factDateFieldsToSpan`. */\nexport function factDateSpanToFields(\n dateStart: string | null | undefined,\n dateEnd: string | null | undefined,\n timezone: string | null | undefined\n): FactDateFields {\n if (!dateStart) return EMPTY_FACT_DATE_FIELDS\n const start = new Date(dateStart)\n if (Number.isNaN(start.getTime())) return EMPTY_FACT_DATE_FIELDS\n const end = dateEnd ? new Date(dateEnd) : start\n const dateOnly = isMidnightUtc(start) && (!dateEnd || isEndOfDayUtc(end))\n\n if (dateOnly) {\n const startKey = dayKeyUtc(start)\n const endKey = dateEnd ? dayKeyUtc(end) : startKey\n return { ...EMPTY_FACT_DATE_FIELDS, date: startKey, endDate: endKey !== startKey ? endKey : '' }\n }\n\n const tz = timezone || 'UTC'\n const startParts = isoToZonedParts(dateStart, tz)\n const isInstant = !dateEnd || dateStart === dateEnd\n const endParts = isInstant ? null : isoToZonedParts(dateEnd, tz)\n return {\n date: startParts.date,\n time: startParts.time,\n timezone: tz,\n endDate: endParts?.date ?? '',\n endTime: endParts?.time ?? '',\n }\n}\n\n/** A fact's date span for the API — the inverse of `factDateSpanToFields`. `null`s\n * clear the span entirely; a bare date (no time) stays timezone-agnostic. */\nexport function factDateFieldsToSpan(fields: FactDateFields): {\n date: string | null\n date_end: string | null\n timezone: string | null\n} {\n if (!fields.date) return { date: null, date_end: null, timezone: null }\n const tz = fields.timezone || detectTimeZone()\n\n const startIso = fields.time\n ? zonedPartsToIso(fields.date, fields.time, tz)\n : `${fields.date}T00:00:00.000Z`\n\n let endIso: string\n if (fields.endDate) {\n endIso =\n fields.time && fields.endTime\n ? zonedPartsToIso(fields.endDate, fields.endTime, tz)\n : `${fields.endDate}T23:59:59.000Z`\n } else {\n endIso = fields.time ? startIso : `${fields.date}T23:59:59.000Z`\n }\n\n return { date: startIso, date_end: endIso, timezone: fields.time ? tz : null }\n}\n","/**\n * A fact's date, edited in a popover: a month calendar to pick the day, with\n * optional start time, end time and end date beneath it. Fully controlled —\n * the FactDateFields shape is unchanged, so fact-date.ts still converts to and\n * from the API's ISO span. A time silently brings the viewer's timezone with\n * it (editable), and an end time implies an end date (defaulting to the start\n * day) so a same-day interval round-trips through the span conversion.\n */\nimport { useMemo, useState } from 'react'\nimport { CalendarDays, ChevronLeft, ChevronRight, X } from 'lucide-react'\nimport { Button, Input, Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\nimport { formatSpan } from '../timeline/span'\nimport { factDateFieldsToSpan, EMPTY_FACT_DATE_FIELDS, type FactDateFields } from './fact-date'\nimport { detectTimeZone, listTimeZones } from '../calendar/zone'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactDateInputLabels {\n weekdays: string[]\n months: string[]\n previousMonth: string\n earlierYears: string\n nextMonth: string\n laterYears: string\n pickYear: string\n addDate: string\n startTime: string\n endTime: string\n setStartFirst: string\n timezone: string\n endDate: string\n clearDate: string\n}\n\nexport const DEFAULT_FACT_DATE_INPUT_LABELS: FactDateInputLabels = {\n weekdays: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n previousMonth: 'Previous month',\n earlierYears: 'Earlier years',\n nextMonth: 'Next month',\n laterYears: 'Later years',\n pickYear: 'Pick a year',\n addDate: 'Add a date',\n startTime: 'Start time',\n endTime: 'End time',\n setStartFirst: 'Set a start time first',\n timezone: 'Timezone',\n endDate: 'End date (optional)',\n clearDate: 'Clear date',\n}\n\nexport interface FactDateInputTestIds {\n caption: string\n day: (dateKey: string) => string\n year: (year: number) => string\n}\n\n/** `YYYY-MM-DD` for a calendar cell — local parts, never toISOString (which\n * would shift the day for viewers west of UTC). */\nfunction dayKey(year: number, monthIndex: number, day: number): string {\n const m = String(monthIndex + 1).padStart(2, '0')\n const d = String(day).padStart(2, '0')\n return `${year}-${m}-${d}`\n}\n\n/** Pretty `YYYY-MM-DD` → \"Mar 12, 2024\" using UTC parts (no day shift). */\nfunction prettyDay(iso: string): string {\n const [y, m, d] = iso.split('-').map(Number)\n if (!y || !m || !d) return iso\n return new Date(Date.UTC(y, m - 1, d)).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n timeZone: 'UTC',\n })\n}\n\n/** Trigger label when times are present — includes the Start time and, if set,\n * the End time (which formatSpan omits on a range). */\nfunction summarizeWithTimes(v: FactDateFields): string {\n const start = `${prettyDay(v.date)}, ${v.time}`\n const endDay = v.endDate || v.date\n if (v.endTime) return `${start} – ${prettyDay(endDay)}, ${v.endTime}`\n if (v.endDate && v.endDate !== v.date) return `${start} – ${prettyDay(v.endDate)}`\n return start\n}\n\n/** A month grid that reads and writes `YYYY-MM-DD` strings — no date library. */\nfunction MonthCalendar({\n selected,\n onSelect,\n labels: l,\n testIds,\n}: {\n selected: string\n onSelect: (dateKey: string) => void\n labels: FactDateInputLabels\n testIds?: Partial<FactDateInputTestIds>\n}) {\n const now = new Date()\n const todayKey = dayKey(now.getFullYear(), now.getMonth(), now.getDate())\n\n const initial = useMemo(() => {\n if (selected) {\n const [y, m] = selected.split('-').map(Number)\n if (y && m) return { year: y, monthIndex: m - 1 }\n }\n return { year: now.getFullYear(), monthIndex: now.getMonth() }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n const [view, setView] = useState(initial)\n // 'days' shows the month grid; 'years' shows a grid of years so a distant year\n // is one click away instead of dozens of month steps. yearStart is the first\n // year of the visible 12-year page.\n const [mode, setMode] = useState<'days' | 'years'>('days')\n const [yearStart, setYearStart] = useState(initial.year - 5)\n\n const firstWeekday = new Date(view.year, view.monthIndex, 1).getDay()\n const daysInMonth = new Date(view.year, view.monthIndex + 1, 0).getDate()\n\n const cells: Array<number | null> = [\n ...Array.from({ length: firstWeekday }, () => null),\n ...Array.from({ length: daysInMonth }, (_, i) => i + 1),\n ]\n\n const step = (delta: number) => {\n const next = view.monthIndex + delta\n setView({\n year: view.year + Math.floor(next / 12),\n monthIndex: ((next % 12) + 12) % 12,\n })\n }\n\n // The caption's chevrons page months in day view, and whole 12-year blocks in\n // year view. Clicking the caption opens the year grid; picking a year returns\n // to that year's month.\n const openYears = () => {\n setYearStart(view.year - 5)\n setMode('years')\n }\n const pickYear = (year: number) => {\n setView((v) => ({ ...v, year }))\n setMode('days')\n }\n const years = Array.from({ length: 12 }, (_, i) => yearStart + i)\n\n return (\n <div className=\"w-[248px]\">\n <div className=\"flex items-center justify-between px-1 pb-2\">\n <button\n type=\"button\"\n onClick={() => (mode === 'days' ? step(-1) : setYearStart((s) => s - 12))}\n className=\"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground pointer-coarse:p-3\"\n aria-label={mode === 'days' ? l.previousMonth : l.earlierYears}\n >\n <ChevronLeft className=\"size-4\" />\n </button>\n {mode === 'days' ? (\n <button\n type=\"button\"\n onClick={openYears}\n className=\"rounded px-1.5 py-0.5 text-sm font-medium hover:bg-accent hover:text-foreground\"\n aria-label={l.pickYear}\n data-testid={testIdOr(testIds?.caption, { testId: 'fact-calendar-caption' })}\n >\n {l.months[view.monthIndex]} {view.year}\n </button>\n ) : (\n <span className=\"text-sm font-medium\">\n {yearStart} – {yearStart + 11}\n </span>\n )}\n <button\n type=\"button\"\n onClick={() => (mode === 'days' ? step(1) : setYearStart((s) => s + 12))}\n className=\"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground pointer-coarse:p-3\"\n aria-label={mode === 'days' ? l.nextMonth : l.laterYears}\n >\n <ChevronRight className=\"size-4\" />\n </button>\n </div>\n {mode === 'days' ? (\n <div className=\"grid grid-cols-7 gap-0.5\">\n {l.weekdays.map((w) => (\n <div key={w} className=\"py-1 text-center text-xs font-medium text-muted-foreground\">\n {w}\n </div>\n ))}\n {cells.map((day, i) => {\n if (day === null) return <div key={`blank-${i}`} />\n const key = dayKey(view.year, view.monthIndex, day)\n const isSelected = key === selected\n const isToday = key === todayKey\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => onSelect(key)}\n data-testid={testIdOr(testIds?.day?.(key), { testId: `fact-calendar-day-${key}` })}\n className={cn(\n 'h-8 rounded text-xs transition-colors hover:bg-accent pointer-coarse:h-11',\n isSelected && 'bg-primary text-primary-foreground hover:bg-primary',\n !isSelected && isToday && 'ring-1 ring-inset ring-primary/50'\n )}\n >\n {day}\n </button>\n )\n })}\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-1\">\n {years.map((y) => (\n <button\n key={y}\n type=\"button\"\n onClick={() => pickYear(y)}\n data-testid={testIdOr(testIds?.year?.(y), { testId: `fact-calendar-year-${y}` })}\n className={cn(\n 'h-9 rounded text-xs transition-colors hover:bg-accent pointer-coarse:h-11',\n y === view.year && 'bg-primary text-primary-foreground hover:bg-primary'\n )}\n >\n {y}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport interface FactDateInputProps {\n value: FactDateFields\n onChange: (next: FactDateFields) => void\n /** Prefix for data-testids: keeps composer vs. edit-row instances distinct. */\n idPrefix: string\n labels?: Partial<FactDateInputLabels>\n /** Overrides for the calendar's own ids (the field ids derive from `idPrefix`). */\n testIds?: Partial<FactDateInputTestIds>\n}\n\n/** A fact's date in a popover: month/year calendar plus optional times, timezone and end date. */\nexport function FactDateInput({ value, onChange, idPrefix, labels, testIds }: FactDateInputProps) {\n const l = { ...DEFAULT_FACT_DATE_INPUT_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n const timezones = useMemo(() => listTimeZones(), [])\n const timezoneListId = `${idPrefix}-timezone-options`\n\n // The trigger reads the same way a fact's date renders in the grid, so the\n // button label and the row agree — EXCEPT when explicit times are set:\n // formatSpan drops the clock time on a start/end-time range, so we build a\n // time-inclusive label ourselves in that case (formatSpan still handles the\n // day/month/year precisions nicely when there are no times).\n const span = factDateFieldsToSpan(value)\n const summary =\n value.time || value.endTime\n ? summarizeWithTimes(value)\n : formatSpan(span.date, span.date_end, span.timezone)\n\n const setDate = (dateKey: string) =>\n onChange({ ...value, date: dateKey, endDate: value.endDate && dateKey ? value.endDate : '' })\n\n // Setting a start time needs a timezone to be meaningful; setting an end time\n // needs an end date for the span conversion to keep it (defaults to the start\n // day, i.e. a same-day interval).\n const setStartTime = (time: string) =>\n onChange({\n ...value,\n time,\n timezone: time ? value.timezone || detectTimeZone() : '',\n endTime: time ? value.endTime : '',\n })\n\n const setEndTime = (endTime: string) =>\n onChange({\n ...value,\n endTime,\n endDate: endTime ? value.endDate || value.date : value.endDate,\n })\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 text-sm transition-colors hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n !summary && 'text-muted-foreground'\n )}\n data-testid={`${idPrefix}-date-trigger`}\n >\n <CalendarDays className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"truncate\">{summary || l.addDate}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-3\" align=\"start\">\n <MonthCalendar selected={value.date} onSelect={setDate} labels={l} testIds={testIds} />\n\n {value.date && (\n <div className=\"mt-3 flex flex-col gap-2 border-t border-border pt-3\">\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.startTime}</span>\n <Input\n type=\"time\"\n value={value.time}\n onChange={(e) => setStartTime(e.target.value)}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-time`}\n />\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.endTime}</span>\n <Input\n type=\"time\"\n value={value.endTime}\n onChange={(e) => setEndTime(e.target.value)}\n disabled={!value.time}\n title={value.time ? undefined : l.setStartFirst}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-end-time`}\n />\n </label>\n </div>\n\n {value.time && (\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.timezone}</span>\n <Input\n list={timezoneListId}\n value={value.timezone}\n onChange={(e) => onChange({ ...value, timezone: e.target.value })}\n placeholder={detectTimeZone()}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-timezone`}\n />\n <datalist id={timezoneListId}>\n {timezones.map((tz) => (\n <option key={tz} value={tz} />\n ))}\n </datalist>\n </label>\n )}\n\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.endDate}</span>\n <Input\n type=\"date\"\n value={value.endDate}\n min={value.date}\n onChange={(e) => onChange({ ...value, endDate: e.target.value })}\n className=\"h-8 text-xs\"\n data-testid={`${idPrefix}-end-date`}\n />\n </label>\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 self-start text-muted-foreground hover:text-foreground\"\n onClick={() => onChange(EMPTY_FACT_DATE_FIELDS)}\n data-testid={`${idPrefix}-clear-date`}\n >\n <X className=\"mr-1 size-3.5\" /> {l.clearDate}\n </Button>\n </div>\n )}\n </PopoverContent>\n </Popover>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { FolderUp, MoreHorizontal, Paperclip, Tags, Trash2 } from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { SelectionBar, SelectionBarAction } from '../files/SelectionBar'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsBulkBarLabels {\n removeFromChat: string\n addToChat: string\n label: string\n shared: string\n more: string\n export: string\n delete: string\n budgetHint: string\n /** The `~{tokens}/{cap} tokens` line (numbers arrive formatted). */\n budget: (tokens: string, cap: string) => string\n removeFromChatTooltip: (pluralNoun: string) => string\n addToChatTooltip: (pluralNoun: string) => string\n labelTooltip: (pluralNoun: string) => string\n}\n\nexport const DEFAULT_FACTS_BULK_BAR_LABELS: FactsBulkBarLabels = {\n removeFromChat: 'Remove from Chat',\n addToChat: 'Add to Chat',\n label: 'Label',\n shared: 'Shared',\n more: 'More',\n export: 'Export',\n delete: 'Delete',\n budgetHint:\n \"Facts added to this chat are always in ARBI's context for this chat, so they share one budget. This estimates the tokens they add (≈4 characters per token), capped at ~2,000.\",\n budget: (tokens, cap) => `~${tokens}/${cap} tokens`,\n removeFromChatTooltip: (n) => `Remove the selected ${n} from this chat`,\n addToChatTooltip: (n) => `Add the selected ${n} to this chat, so they are always in its context`,\n labelTooltip: (n) => `Add or remove labels from selected ${n}`,\n}\n\nexport interface FactsBulkBarTestIds {\n budget: string\n inChat: string\n label: string\n more: string\n export: string\n delete: string\n}\n\nexport interface FactsBulkBarProps {\n /** Number of selected facts. */\n count: number\n onClear: () => void\n /** True when every selected fact is already in the current chat (the action then removes). */\n allSelectedInChat: boolean\n /** Add the selection to the current chat, or take it out (absent: no chat, no action). */\n onToggleInChat?: () => void\n /** Label the selection (absent: no action). */\n onLabel?: () => void\n /** The aggregate Shared switch for the selection (the app binds its toggle). */\n sharedToggle: ReactNode\n /** Export the selection (absent: no action). */\n onExport?: () => void\n onDelete: () => void\n /** The current chat's facts token budget, shown at the left (the chat's facts, not the selection). */\n budget?: { tokens: number; cap: number; isOver: boolean } | null\n /** Plural noun for tooltips (lower case). */\n pluralNoun?: string\n labels?: Partial<FactsBulkBarLabels>\n testIds?: Partial<FactsBulkBarTestIds>\n}\n\n/**\n * Sticky bulk-action bar for the facts table: Add to Chat, Label, Shared and a More menu (Export,\n * Delete). Actions are disabled until something is selected.\n */\nexport function FactsBulkBar({\n count,\n onClear,\n allSelectedInChat,\n onToggleInChat,\n onLabel,\n sharedToggle,\n onExport,\n onDelete,\n budget,\n pluralNoun = 'facts',\n labels,\n testIds,\n}: FactsBulkBarProps) {\n const l = { ...DEFAULT_FACTS_BULK_BAR_LABELS, ...labels }\n const none = count === 0\n return (\n <div className=\"pb-3\" data-slot=\"facts-bulk-bar\">\n <SelectionBar\n count={count}\n onClear={onClear}\n status={\n budget ? (\n <span\n className={cn(\n 'shrink-0 text-xs tabular-nums',\n budget.isOver ? 'text-destructive' : 'text-muted-foreground'\n )}\n title={l.budgetHint}\n data-testid={testIdOr(testIds?.budget, { testId: 'facts-page-chat-budget' })}\n >\n {l.budget(budget.tokens.toLocaleString(), budget.cap.toLocaleString())}\n </span>\n ) : null\n }\n >\n {(isCompact) => (\n <>\n {onToggleInChat && (\n <SelectionBarAction\n icon={Paperclip}\n label={allSelectedInChat ? l.removeFromChat : l.addToChat}\n onClick={onToggleInChat}\n disabled={none}\n isCompact={isCompact}\n className=\"border-blue-border text-blue-text hover:bg-blue-bg hover:text-blue-text\"\n tooltip={\n allSelectedInChat\n ? l.removeFromChatTooltip(pluralNoun)\n : l.addToChatTooltip(pluralNoun)\n }\n testId={testIdOr(testIds?.inChat, { testId: 'bulk-in-chat-facts-button' })}\n />\n )}\n {onLabel && (\n <SelectionBarAction\n icon={Tags}\n label={l.label}\n onClick={onLabel}\n disabled={none}\n isCompact={isCompact}\n className=\"border-green-border text-green-text hover:bg-green-bg hover:text-green-text\"\n tooltip={l.labelTooltip(pluralNoun)}\n testId={testIdOr(testIds?.label, { testId: 'bulk-label-facts-button' })}\n />\n )}\n <div className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1\">\n {sharedToggle}\n {!isCompact && <span className=\"text-sm text-muted-foreground\">{l.shared}</span>}\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 pointer-coarse:h-11\"\n disabled={none}\n data-testid={testIdOr(testIds?.more, { testId: 'facts-bulk-more-button' })}\n >\n <MoreHorizontal className=\"size-4\" />\n {!isCompact && <span className=\"text-sm\">{l.more}</span>}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {onExport && (\n <>\n <DropdownMenuItem\n onClick={onExport}\n disabled={none}\n data-testid={testIdOr(testIds?.export, { testId: 'export-facts-button' })}\n >\n <FolderUp className=\"mr-2 size-4\" />\n {l.export}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n onClick={onDelete}\n disabled={none}\n className=\"text-red-text focus:text-red-text\"\n data-testid={testIdOr(testIds?.delete, { testId: 'bulk-delete-facts-button' })}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {l.delete}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )}\n </SelectionBar>\n </div>\n )\n}\n","import { ArrowRight, CalendarClock, Lightbulb, Loader2, Milestone, Scale } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsEmptyStateLabels {\n title: string\n intro: string\n tryAdding: string\n /** Three kinds of durable knowledge a fact captures. */\n kinds: { label: string; desc: string }[]\n /** Starter fact texts offered as one-tap examples. */\n examples: string[]\n loading: string\n loadError: string\n retry: string\n}\n\nexport const DEFAULT_FACTS_EMPTY_STATE_LABELS: FactsEmptyStateLabels = {\n title: 'Everything this workspace knows',\n intro:\n 'Facts are durable knowledge — a deadline, a decision, a preference. Write them yourself, or let the assistant distill them from your documents and chats.',\n tryAdding: 'Try adding a fact',\n kinds: [\n {\n label: 'Deadlines & dates',\n desc: 'A due date or milestone — it lands on the calendar and timeline',\n },\n { label: 'Decisions', desc: 'What was agreed, and why — so it is not lost in a thread' },\n { label: 'Preferences', desc: 'How this workspace likes things done' },\n ],\n examples: [\n 'The renewal deadline is March 31, 2026',\n 'Payment terms are net 30',\n 'The team prefers email over phone for updates',\n 'Board approved the Q3 budget on May 12',\n ],\n loading: 'Loading facts…',\n loadError: 'Could not load facts.',\n retry: 'Try again',\n}\n\nconst KIND_ICONS = [CalendarClock, Scale, Lightbulb]\n\nexport interface FactsEmptyStateTestIds {\n root: string\n example: string\n}\n\nexport interface FactsEmptyStateProps {\n /** Open the composer prefilled with an example. */\n onUseExample: (text: string) => void\n labels?: Partial<FactsEmptyStateLabels>\n testIds?: Partial<FactsEmptyStateTestIds>\n}\n\n/** First-run state: what facts are, the kinds they capture, and one-tap examples. */\nexport function FactsEmptyState({ onUseExample, labels, testIds }: FactsEmptyStateProps) {\n const l = { ...DEFAULT_FACTS_EMPTY_STATE_LABELS, ...labels }\n return (\n <div\n className=\"flex min-h-full items-center justify-center p-10\"\n data-testid={testIdOr(testIds?.root, { testId: 'facts-page-empty-state' })}\n data-slot=\"facts-empty-state\"\n >\n <div className=\"w-full max-w-xl text-center\">\n <div className=\"mx-auto mb-4 flex size-12 items-center justify-center rounded-lg bg-accent text-accent-foreground\">\n <Milestone className=\"size-6\" />\n </div>\n\n <h2 className=\"mt-2 text-xl font-semibold text-foreground\">{l.title}</h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">{l.intro}</p>\n\n <div className=\"mt-7 grid gap-3 text-left @xl:grid-cols-3\">\n {l.kinds.map(({ label, desc }, i) => {\n const KindIcon = KIND_ICONS[i % KIND_ICONS.length]\n return (\n <div key={label} className=\"rounded-lg border border-border bg-card p-3 shadow-xs\">\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-foreground\">\n <KindIcon className=\"size-4 text-primary\" />\n {label}\n </div>\n <p className=\"mt-1 text-xs leading-snug text-muted-foreground\">{desc}</p>\n </div>\n )\n })}\n </div>\n\n <p className=\"mt-10 text-sm font-medium text-muted-foreground\">{l.tryAdding}</p>\n <div className=\"mt-4 flex flex-wrap justify-center gap-2.5\">\n {l.examples.map((fact) => (\n <button\n key={fact}\n type=\"button\"\n onClick={() => onUseExample(fact)}\n className=\"group inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-3.5 py-2 text-sm text-foreground transition-colors hover:border-ring/50 hover:bg-accent/40 pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.example, { testId: 'facts-page-example' })}\n >\n {fact}\n <ArrowRight className=\"size-3.5 text-muted-foreground transition-colors group-hover:text-primary\" />\n </button>\n ))}\n </div>\n </div>\n </div>\n )\n}\n\n/** Centered \"Loading facts…\" line. */\nexport function FactsLoading({\n label = DEFAULT_FACTS_EMPTY_STATE_LABELS.loading,\n}: {\n label?: string\n}) {\n return (\n <div className=\"flex items-center justify-center py-10 text-muted-foreground\">\n <Loader2 className=\"mr-2 size-4 animate-spin\" /> {label}\n </div>\n )\n}\n\n/** Load-failure message with a retry action. */\nexport function FactsLoadError({\n onRetry,\n message = DEFAULT_FACTS_EMPTY_STATE_LABELS.loadError,\n retryLabel = DEFAULT_FACTS_EMPTY_STATE_LABELS.retry,\n}: {\n onRetry: () => void\n message?: string\n retryLabel?: string\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 px-6 py-10 text-center\">\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n {retryLabel}\n </Button>\n </div>\n )\n}\n","/**\n * FactsFieldsButton\n *\n * The Facts table's column-visibility control — the same \"Fields\" affordance the\n * Documents table wears (Columns3 icon, ghost button), pared down to what facts\n * need: a checkbox per column that shows or hides it. Toggling writes straight\n * to the grid via the AG Grid api, so the change persists through GridView's own\n * column-state persistence (no separate saved-views machinery here).\n */\nimport { useMemo, useState } from 'react'\nimport { Columns3, ChevronDown, Check, RotateCcw } from 'lucide-react'\nimport type { GridApi } from 'ag-grid-community'\nimport {\n Button,\n Command,\n CommandGroup,\n CommandItem,\n CommandList,\n CommandSeparator,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactsFieldsButtonLabels {\n fields: string\n defaultView: string\n columns: string\n /** Names for icon-only columns, keyed by colId. */\n columnNames: Record<string, string>\n}\n\nexport const DEFAULT_FACTS_FIELDS_BUTTON_LABELS: FactsFieldsButtonLabels = {\n fields: 'Fields',\n defaultView: 'Default view',\n columns: 'Columns',\n columnNames: { in_chat: 'In chat' },\n}\n\nexport interface FactsFieldsButtonTestIds {\n trigger: string\n defaultView: string\n toggle: (colId: string) => string\n}\n\nexport interface FactsFieldsButtonProps<TData = unknown> {\n /** The facts grid api (read lazily: the grid may not exist yet). */\n getGridApi: () => GridApi<TData> | null | undefined\n labels?: Partial<FactsFieldsButtonLabels>\n testIds?: Partial<FactsFieldsButtonTestIds>\n}\n\nexport function FactsFieldsButton<TData = unknown>({\n getGridApi,\n labels,\n testIds,\n}: FactsFieldsButtonProps<TData>) {\n const l = { ...DEFAULT_FACTS_FIELDS_BUTTON_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n // Bumped after each toggle so the list re-reads the grid's live column state.\n const [version, setVersion] = useState(0)\n\n const columns = useMemo(() => {\n if (!open) return []\n const api = getGridApi()\n if (!api || api.isDestroyed()) return []\n const state = api.getColumnState()\n return state\n .filter((c) => c.colId !== 'ag-Grid-SelectionColumn')\n .map((c) => {\n const def = api.getColumnDef(c.colId)\n const label =\n (def?.headerName && def.headerName.trim()) || l.columnNames[c.colId] || c.colId\n return { colId: c.colId, label, visible: !c.hide }\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, version, getGridApi, l.columnNames])\n\n const visibleCount = columns.filter((c) => c.visible).length\n\n const toggle = (colId: string, visible: boolean) => {\n const api = getGridApi()\n if (!api || api.isDestroyed()) return\n // Never hide the last remaining column — an empty grid has no headers to\n // bring back the chooser against.\n if (visible && visibleCount <= 1) return\n api.setColumnsVisible([colId], !visible)\n setVersion((v) => v + 1)\n }\n\n // Default view: restore the columns' built-in order, visibility and widths\n // from the column definitions (like the Files table's \"Default view\"). Handy\n // when a column got hidden or dragged and the table no longer reads right.\n const resetToDefault = () => {\n const api = getGridApi()\n if (!api || api.isDestroyed()) return\n api.resetColumnState()\n setVersion((v) => v + 1)\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-sm gap-1.5 text-muted-foreground hover:text-foreground font-light!\"\n data-testid={testIdOr(testIds?.trigger, { testId: 'facts-fields-trigger' })}\n >\n <Columns3 className=\"size-3.5\" />\n {l.fields}\n <ChevronDown className=\"size-3\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[220px] p-0\" align=\"end\" side=\"bottom\" sideOffset={4}>\n <Command shouldFilter={false}>\n <CommandList className=\"max-h-[60dvh]\">\n <CommandGroup>\n <CommandItem\n onSelect={resetToDefault}\n className=\"cursor-pointer text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.defaultView, {\n testId: 'facts-fields-default-view',\n })}\n >\n <RotateCcw className=\"mr-2 size-3.5\" />\n {l.defaultView}\n </CommandItem>\n </CommandGroup>\n <CommandSeparator />\n <CommandGroup heading={l.columns}>\n {columns.map((col) => (\n <CommandItem\n key={col.colId}\n onSelect={() => toggle(col.colId, col.visible)}\n className=\"cursor-pointer text-sm\"\n data-testid={testIdOr(testIds?.toggle?.(col.colId), {\n testId: `facts-fields-toggle-${col.colId}`,\n })}\n >\n <div\n className={cn(\n 'mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary',\n col.visible\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <Check className=\"size-3\" />\n </div>\n {col.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","import { useEffect, useMemo, useRef } from 'react'\nimport { TimelineCalendar } from '../timeline/TimelineCalendar'\nimport { TimelineGantt, type TimelineGanttProps } from '../timeline/TimelineGantt'\nimport type { TimelineItem } from '../timeline/types'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactTimelineLabels {\n ganttEmpty: string\n}\n\nexport const DEFAULT_FACT_TIMELINE_LABELS: FactTimelineLabels = {\n ganttEmpty: 'Give a fact a date and it appears here.',\n}\n\n/** The fields of a fact the calendar reads. */\nexport interface FactCalendarRow {\n external_id: string\n text: string\n date_start?: string | null\n date_end?: string | null\n}\n\ntype CalendarItem<T> = TimelineItem & { fact: T }\n\nexport interface FactsCalendarProps<T extends FactCalendarRow> {\n facts: T[]\n onSelect?: (fact: T) => void\n /** The fact currently open for editing: its bars are highlighted. */\n selectedId?: string | null\n /** Host element the n / N fact navigator portals into (see TimelineCalendar). */\n navigatorContainer?: HTMLElement | null\n /** Denominator for the navigator: the page's filtered fact count. */\n navigatorTotal?: number\n /** Calendar test id; entries are `${testId}-entry-${factId}` (default `facts-calendar`). */\n testId?: string\n}\n\n/**\n * Facts on the shared calendar. Maps a fact to a labelled span and hands the fact back on select,\n * so packing, spanning bars and continuous scroll stay one implementation shared with every\n * other timeline surface. Undated facts have nowhere to sit and are skipped.\n */\nexport function FactsCalendar<T extends FactCalendarRow>({\n facts,\n onSelect,\n selectedId,\n navigatorContainer,\n navigatorTotal,\n testId,\n}: FactsCalendarProps<T>) {\n const calendarTestId = testIdOr(testId, { testId: 'facts-calendar' })\n const items = useMemo<CalendarItem<T>[]>(\n () =>\n facts\n .filter((f) => f.date_start)\n .map((f) => ({\n id: f.external_id,\n label: f.text,\n start: f.date_start as string,\n end: f.date_end,\n fact: f,\n })),\n [facts]\n )\n\n // The shared calendar takes no \"selected\" prop, so mark the selected fact's entries (a\n // multi-day fact has several) directly in the DOM, re-applied when selection or items change.\n const rootRef = useRef<HTMLDivElement>(null)\n const entryId = testIdOr(testId && `${testId}-entry-${selectedId}`, {\n testId: `facts-calendar-entry-${selectedId}`,\n })\n useEffect(() => {\n const root = rootRef.current\n if (!root) return\n root\n .querySelectorAll('.fact-cal-selected')\n .forEach((el) => el.classList.remove('fact-cal-selected'))\n if (!selectedId) return\n root\n .querySelectorAll(`[data-testid=\"${entryId}\"]`)\n .forEach((el) => el.classList.add('fact-cal-selected'))\n }, [selectedId, items, entryId])\n\n return (\n <div ref={rootRef} className=\"h-full border-t border-border\" data-slot=\"facts-calendar\">\n <TimelineCalendar\n items={items}\n testId={calendarTestId}\n // Show every fact on a day, never \"+n more\": single-line bars keep a busy day compact.\n maxLanes={Infinity}\n selectedIds={selectedId ? [selectedId] : []}\n onSelect={(item) => onSelect?.(item.fact)}\n navigatorContainer={navigatorContainer}\n navigatorTotal={navigatorTotal}\n />\n </div>\n )\n}\n\n/**\n * The Facts timeline. `.facts-gantt` scopes CSS that truncates row labels to one line and hides\n * the built-in detail side panel: a fact's contents are seen and edited in the composer instead.\n */\nexport function FactsGanttPane({\n testId,\n emptyMessage,\n labels,\n ...props\n}: TimelineGanttProps & { labels?: Partial<FactTimelineLabels> }) {\n const l = { ...DEFAULT_FACT_TIMELINE_LABELS, ...labels }\n return (\n <div className=\"facts-gantt h-full border-t border-border\" data-slot=\"facts-gantt\">\n <TimelineGantt\n testId={testIdOr(testId, { testId: 'gantt' })}\n emptyMessage={emptyMessage ?? l.ganttEmpty}\n {...props}\n />\n </div>\n )\n}\n","/**\n * FactsViewToggle\n *\n * Table / Calendar / Timeline switch for the Notes page. (The list view\n * retired into the table — 'list' stays in the type for old deep links,\n * which the page maps to 'table'.) Uses the shared\n * ViewToggle so it matches Documents (Gallery / Table / Review), Home and Smart\n * Search rather than being a fifth bespoke button group, and sits in the tab\n * header where every other page puts its views.\n *\n * Calendar and Timeline read only the dated notes — a note without a date has\n * nowhere to sit on either — which the tooltips say rather than the labels.\n */\n\nimport { CalendarRange, GanttChartSquare, Search, Table2 } from 'lucide-react'\nimport { ViewToggle, type ViewToggleOption } from '../files/ViewToggle'\nimport { testIdOr } from '../chat/test-id'\n\nexport type FactsViewMode = 'list' | 'table' | 'calendar' | 'gantt' | 'smart_search'\n\nexport interface FactsViewToggleLabels {\n table: string\n calendar: string\n timeline: string\n smartSearch: string\n}\n\nexport const DEFAULT_FACTS_VIEW_TOGGLE_LABELS: FactsViewToggleLabels = {\n table: 'Table',\n calendar: 'Calendar',\n timeline: 'Timeline',\n smartSearch: 'Smart Search',\n}\n\nconst createOptions = (l: FactsViewToggleLabels): ViewToggleOption[] => [\n { value: 'table', icon: <Table2 className=\"size-3.5\" />, label: l.table },\n { value: 'calendar', icon: <CalendarRange className=\"size-3.5\" />, label: l.calendar },\n { value: 'gantt', icon: <GanttChartSquare className=\"size-3.5\" />, label: l.timeline },\n // Facts-only semantic/keyword recall — mirrors the Files \"Smart Search\" view\n // (same Search icon + label), but searches this workspace's facts, not docs.\n { value: 'smart_search', icon: <Search className=\"size-3.5\" />, label: l.smartSearch },\n]\n\nexport interface FactsViewToggleProps {\n viewMode: FactsViewMode\n onChange: (mode: FactsViewMode) => void\n /**\n * Collapse the labels to icons. Driven by a width measurement of the header\n * row (see FactsPage) rather than a `@container`, so the toggle can stay\n * absolutely centred — its position never shifts with the side controls —\n * while still collapsing when the row actually runs out of room.\n */\n collapsed?: boolean\n labels?: Partial<FactsViewToggleLabels>\n /** Item test ids are `${testIdPrefix}-${mode}-button` (default `facts-layout`). */\n testIdPrefix?: string\n /** Per-mode item ids that replace the prefixed ones. */\n testIds?: Partial<Record<FactsViewMode, string>>\n}\n\nexport function FactsViewToggle({\n viewMode,\n onChange,\n collapsed = false,\n labels,\n testIdPrefix,\n testIds,\n}: FactsViewToggleProps) {\n const options = createOptions({ ...DEFAULT_FACTS_VIEW_TOGGLE_LABELS, ...labels }).map((o) => ({\n ...o,\n testId: testIds?.[o.value as FactsViewMode],\n }))\n return (\n <ViewToggle\n options={options}\n value={viewMode}\n onChange={(value) => onChange(value as FactsViewMode)}\n testIdPrefix={testIdOr(testIdPrefix, { testId: 'facts-layout' })}\n showLabels={!collapsed}\n size=\"sm\"\n />\n )\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { BookMarked, Milestone, Plus } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { TabHeader, type Tab } from '../shell/TabHeader'\nimport { observeResize } from '../lib/observe-resize'\nimport { testIdOr } from '../chat/test-id'\nimport {\n FilterInput,\n type FilterInputLabels,\n type FilterInputTestIds,\n type FilterField,\n} from '../shell/FilterInput'\nimport { FactsViewToggle, type FactsViewMode, type FactsViewToggleLabels } from './FactsViewToggle'\n\nexport interface FactsToolbarLabels {\n tags: string\n newFact: string\n}\n\nexport const DEFAULT_FACTS_TOOLBAR_LABELS: FactsToolbarLabels = {\n tags: 'Tags',\n newFact: 'New fact',\n}\n\nexport interface FactsToolbarTestIds {\n tab: string\n tagsButton: string\n newFact: string\n filterBar: string\n filterBarNav: string\n}\n\nexport interface FactsToolbarProps {\n /** Facts matching the current filters (shown beside the glyph). */\n count: number\n /** Solid-fill the count while any filter is narrowing the list. */\n hasActiveFilters: boolean\n filterText: string\n onFilterTextChange: (text: string) => void\n searchFields: FilterField[]\n onSearchFieldsChange: (fields: FilterField[]) => void\n /** The quick-filter dropdown, embedded inside the filter box. */\n quickFilter?: ReactNode\n /** Open the Labels panel. Omit it to hide the Tags button. */\n onOpenTags?: () => void\n viewMode: FactsViewMode\n onViewModeChange: (mode: FactsViewMode) => void\n onNewFact: () => void\n /** Second row: left slot for the row navigator (portal host for calendar/timeline). */\n navSlotRef?: (el: HTMLElement | null) => void\n /** Table navigator rendered directly in the left slot. */\n navigator?: ReactNode\n /** Second row, right side: per-view controls (Fields, density, zoom). */\n tools?: ReactNode\n /** Smart Search has no toolbar row. */\n showToolbarRow?: boolean\n labels?: Partial<FactsToolbarLabels>\n testIds?: Partial<FactsToolbarTestIds>\n /** Overrides for the embedded filter box. */\n filterLabels?: Partial<FilterInputLabels>\n filterTestIds?: Partial<FilterInputTestIds>\n /** Overrides for the embedded view toggle. */\n viewToggleLabels?: Partial<FactsViewToggleLabels>\n viewToggleTestIdPrefix?: string\n}\n\n/**\n * Facts page header: count tab with filter box and Tags button, the view toggle centred, New fact\n * on the right (the page's one primary action), and a second row for per-view controls.\n */\nexport function FactsToolbar({\n count,\n hasActiveFilters,\n filterText,\n onFilterTextChange,\n searchFields,\n onSearchFieldsChange,\n quickFilter,\n onOpenTags,\n viewMode,\n onViewModeChange,\n onNewFact,\n navSlotRef,\n navigator,\n tools,\n showToolbarRow = true,\n labels,\n testIds,\n filterLabels,\n filterTestIds,\n viewToggleLabels,\n viewToggleTestIdPrefix,\n}: FactsToolbarProps) {\n const l = { ...DEFAULT_FACTS_TOOLBAR_LABELS, ...labels }\n // Collapse the view toggle's labels to icons when the row runs low on room, measured off the\n // row's own width (stable against side controls appearing) with hysteresis to avoid flicker.\n const headerRef = useRef<HTMLDivElement>(null)\n const [viewsCollapsed, setViewsCollapsed] = useState(false)\n // On phones the header cannot hold the view toggle beside the filter and New fact, so the\n // toggle moves to a row of its own beneath it.\n const [isNarrow, setIsNarrow] = useState(false)\n useEffect(() => {\n const el = headerRef.current\n if (!el) return\n const measure = () => {\n const w = el.clientWidth\n setViewsCollapsed((prev) => (prev ? w < 990 : w < 950))\n // Touch targets are 44px, so the one-row header needs more room on a touch device: a phone\n // held sideways (~760px) already clips the Tags button under the view toggle.\n const narrowAt = window.matchMedia?.('(pointer: coarse)')?.matches ? 820 : 640\n setIsNarrow((prev) => (prev ? w < narrowAt + 20 : w < narrowAt))\n }\n measure()\n return observeResize(el, measure)\n }, [])\n\n const tabs: Tab[] = [\n {\n id: 'facts',\n // No name: the page needs no self-label, but the fact glyph stays in front of the count.\n countIcon: <Milestone className=\"size-3.5\" />,\n label: '',\n count,\n countPlacement: 'leading',\n hasActiveFilters,\n testId: testIdOr(testIds?.tab, { testId: 'facts-tab' }),\n presentation: 'count',\n },\n ]\n\n // Filter box (+ Tags). In the header on wide rows; on phones it gets a full-width row of its\n // own so the filter is never squeezed to a stub.\n const filterControls = (\n <div className={isNarrow ? 'flex w-full items-center gap-1.5' : 'flex items-center gap-1.5'}>\n <FilterInput\n value={filterText}\n onChange={onFilterTextChange}\n fields={searchFields}\n onFieldsChange={onSearchFieldsChange}\n filter={quickFilter}\n className={isNarrow ? 'min-w-0 flex-1' : undefined}\n labels={filterLabels}\n testIds={filterTestIds}\n />\n {onOpenTags && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-6 shrink-0 gap-1.5 px-2 pointer-coarse:h-11\"\n onClick={onOpenTags}\n data-testid={testIdOr(testIds?.tagsButton, { testId: 'facts-tags-button' })}\n >\n <BookMarked className=\"size-3.5\" />\n <span className=\"text-sm\">{l.tags}</span>\n </Button>\n )}\n </div>\n )\n\n return (\n <div ref={headerRef} className=\"sticky top-0 z-10 bg-background\" data-slot=\"facts-toolbar\">\n <TabHeader\n tabs={tabs}\n activeTabId=\"notes\"\n onTabChange={() => {}}\n firstTabContent={isNarrow ? null : filterControls}\n centerContent={\n isNarrow ? null : (\n <div className=\"flex w-full items-center justify-center\">\n <FactsViewToggle\n viewMode={viewMode}\n onChange={onViewModeChange}\n collapsed={viewsCollapsed}\n labels={viewToggleLabels}\n testIdPrefix={viewToggleTestIdPrefix}\n />\n </div>\n )\n }\n rightContent={\n <Button\n onClick={onNewFact}\n data-testid={testIdOr(testIds?.newFact, { testId: 'facts-page-new' })}\n >\n <Plus className=\"mr-0.5 size-4\" />\n {l.newFact}\n </Button>\n }\n />\n {isNarrow && (\n <div\n className=\"flex flex-col gap-1.5 border-b border-border px-3 py-1.5\"\n data-slot=\"facts-toolbar-stack\"\n >\n {filterControls}\n <div className=\"flex justify-center\">\n <FactsViewToggle\n viewMode={viewMode}\n onChange={onViewModeChange}\n collapsed\n labels={viewToggleLabels}\n testIdPrefix={viewToggleTestIdPrefix}\n />\n </div>\n </div>\n )}\n {showToolbarRow && (\n <div\n className=\"flex min-h-8 flex-wrap items-center gap-x-1.5 border-b border-border bg-background px-3 py-0.5\"\n data-testid={testIdOr(testIds?.filterBar, { testId: 'facts-filter-bar' })}\n >\n <div\n ref={navSlotRef}\n className=\"flex shrink-0 items-center empty:hidden\"\n data-testid={testIdOr(testIds?.filterBarNav, { testId: 'facts-filter-bar-nav' })}\n >\n {navigator}\n </div>\n <div className=\"flex-1\" />\n <div className=\"flex shrink-0 items-center\">{tools}</div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * Drag-to-resize columns for the tables rendered inside the fact editor's\n * MDXEditor.\n *\n * MDXEditor's table has no built-in column resizing, but it renders a\n * `<colgroup>` of `<col>` elements — one per column plus the leading/trailing\n * tool columns. Column widths are honoured by setting a width on those `<col>`\n * elements and switching the table to `table-layout: fixed`. MDXEditor only\n * manages each `<col>`'s `className` (alignment), so an inline `style.width`\n * survives typing edits; it only resets when the column count changes (a new\n * `<colgroup>` is rendered) — acceptable for an editing-time affordance, since\n * markdown tables can't store widths anyway.\n *\n * Wiring: attach once to the editor container. Listeners are delegated, so\n * they work for tables that appear/disappear as the user edits. Returns a\n * cleanup that removes every listener and any lingering drag state.\n */\n\n/** How close (px) to a cell's right edge the pointer must be to grab it. */\nconst EDGE = 6\n/** Never let a column get narrower than this (px). */\nconst MIN_WIDTH = 48\n\ninterface DragState {\n col: HTMLTableColElement\n table: HTMLTableElement\n startX: number\n startWidth: number\n}\n\nexport function enableFactTableColumnResize(container: HTMLElement): () => void {\n let drag: DragState | null = null\n\n const cellFromEvent = (e: PointerEvent): HTMLTableCellElement | null => {\n const el = e.target as HTMLElement | null\n const cell = el?.closest?.('td, th') as HTMLTableCellElement | null\n // Only content cells resize — never the row/column tool cells.\n if (!cell || cell.hasAttribute('data-tool-cell')) return null\n if (!container.contains(cell)) return null\n return cell\n }\n\n const nearRightEdge = (cell: HTMLTableCellElement, clientX: number): boolean => {\n const rect = cell.getBoundingClientRect()\n return clientX >= rect.right - EDGE && clientX <= rect.right + 2\n }\n\n /** The `<col>` that governs `cell`'s column. Body rows and the colgroup both\n * lead with a tool element, so the cell's index in its row maps 1:1 to the\n * colgroup child index. */\n const colForCell = (cell: HTMLTableCellElement): HTMLTableColElement | null => {\n const row = cell.parentElement\n const table = cell.closest('table')\n const colgroup = table?.querySelector('colgroup')\n if (!row || !table || !colgroup) return null\n const index = Array.prototype.indexOf.call(row.children, cell)\n return (colgroup.children[index] as HTMLTableColElement | undefined) ?? null\n }\n\n /** Freeze every column at its current rendered width before switching to a\n * fixed layout, so grabbing a border doesn't make the whole table jump. The\n * header row has a cell for every colgroup entry (incl. the tool columns),\n * so it's the reliable ruler. */\n const freezeWidths = (table: HTMLTableElement) => {\n const colgroup = table.querySelector('colgroup')\n if (!colgroup) return\n const ruler = table.querySelector('thead tr') ?? table.querySelector('tbody tr')\n const cells = ruler ? Array.from(ruler.children) : []\n Array.from(colgroup.children).forEach((node, i) => {\n const col = node as HTMLTableColElement\n const cell = cells[i] as HTMLElement | undefined\n if (!col.style.width && cell) col.style.width = `${cell.getBoundingClientRect().width}px`\n })\n table.style.tableLayout = 'fixed'\n }\n\n const onPointerMove = (e: PointerEvent) => {\n if (drag) {\n const next = Math.max(MIN_WIDTH, drag.startWidth + (e.clientX - drag.startX))\n drag.col.style.width = `${next}px`\n e.preventDefault()\n return\n }\n // Hover affordance: show the resize cursor only in a cell's right margin.\n const cell = cellFromEvent(e)\n if (cell && nearRightEdge(cell, e.clientX)) {\n cell.style.cursor = 'col-resize'\n } else if (cell) {\n cell.style.cursor = ''\n }\n }\n\n const endDrag = () => {\n if (!drag) return\n drag = null\n document.documentElement.classList.remove('fact-col-resizing')\n document.removeEventListener('pointermove', onPointerMove, true)\n document.removeEventListener('pointerup', endDrag, true)\n }\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n const cell = cellFromEvent(e)\n if (!cell || !nearRightEdge(cell, e.clientX)) return\n const table = cell.closest('table') as HTMLTableElement | null\n if (!table) return\n freezeWidths(table)\n const col = colForCell(cell)\n if (!col) return\n drag = {\n col,\n table,\n startX: e.clientX,\n startWidth: parseFloat(col.style.width) || cell.getBoundingClientRect().width,\n }\n // Grab the border, not the caret: suppress the click-to-edit + selection.\n e.preventDefault()\n document.documentElement.classList.add('fact-col-resizing')\n document.addEventListener('pointermove', onPointerMove, true)\n document.addEventListener('pointerup', endDrag, true)\n }\n\n container.addEventListener('pointerdown', onPointerDown)\n container.addEventListener('pointermove', onPointerMove)\n\n return () => {\n endDrag()\n container.removeEventListener('pointerdown', onPointerDown)\n container.removeEventListener('pointermove', onPointerMove)\n }\n}\n","import { memo, useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, PencilLine } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\nimport { observeResize } from '../lib/observe-resize'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactLabelsCellLabels {\n edit: string\n searchPlaceholder: string\n create: (name: string) => string\n empty: string\n}\n\nexport const DEFAULT_FACT_LABELS_CELL_LABELS: FactLabelsCellLabels = {\n edit: 'Edit labels',\n searchPlaceholder: 'Search or create...',\n create: (name) => `Create \\u201c${name}\\u201d`,\n empty: 'No labels yet',\n}\n\nexport interface FactLabelsCellTestIds {\n option: (labelId: string) => string\n}\n\n/** One selectable label: id, name and a colour (any CSS colour) that keys its chip. */\nexport interface FactLabelOption {\n id: string\n name: string\n color: string\n}\n\nexport interface FactLabelsCellProps {\n /** Every label that can be applied. */\n options: FactLabelOption[]\n /** The fact's full label id list (ids not in `options` are preserved on change). */\n selectedIds: string[]\n /** Persist the fact's full label id list. */\n onChange: (ids: string[]) => void\n /** Create a label and resolve with its id (undefined when creation failed). */\n onCreate: (name: string) => Promise<string | undefined>\n /** The grid row height; clamps the chips to the rows that fully fit. */\n rowHeight?: number\n labels?: Partial<FactLabelsCellLabels>\n testIds?: Partial<FactLabelsCellTestIds>\n}\n\n// Visible height reserved per chip row: a touch taller than a chip (~22px) so a row is never\n// clipped at the edges, but short enough that the gap hides the next row.\nconst CHIP_ROW_H = 24\nconst CHIP_GAP = 4\n\n/**\n * The Labels cell of the Facts table: applied labels as colour-keyed chips (an empty cell shows\n * a pencil), and a popover to toggle labels or create one with Enter.\n */\nexport const FactLabelsCell = memo(function FactLabelsCell({\n options,\n selectedIds,\n onChange,\n onCreate,\n rowHeight = 52,\n labels,\n testIds,\n}: FactLabelsCellProps) {\n const l = { ...DEFAULT_FACT_LABELS_CELL_LABELS, ...labels }\n const [open, setOpen] = useState(false)\n const [search, setSearch] = useState('')\n\n const applied = useMemo(\n () => new Set(selectedIds.filter((id) => options.some((o) => o.id === id))),\n [selectedIds, options]\n )\n\n const toggle = (option: FactLabelOption) =>\n onChange(\n applied.has(option.id)\n ? selectedIds.filter((id) => id !== option.id)\n : [...selectedIds, option.id]\n )\n\n const createAndApply = async (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return\n const existing = options.find((o) => o.name.toLowerCase() === trimmed.toLowerCase())\n if (existing) {\n if (!applied.has(existing.id)) onChange([...selectedIds, existing.id])\n setSearch('')\n return\n }\n const id = await onCreate(trimmed)\n if (id) onChange([...selectedIds, id])\n setSearch('')\n }\n\n const clampRows = Math.max(1, Math.floor((rowHeight + CHIP_GAP) / (CHIP_ROW_H + CHIP_GAP)))\n const appliedOptions = options.filter((o) => applied.has(o.id))\n\n // Show an ellipsis whenever chips are hidden below the clamp. A ResizeObserver re-measures on\n // any size change (column resize, row height, layout settling) so the indicator is reliable.\n const chipsRef = useRef<HTMLDivElement>(null)\n const [hasOverflow, setHasOverflow] = useState(false)\n useEffect(() => {\n const el = chipsRef.current\n if (!el) return\n const measure = () => setHasOverflow(el.scrollHeight > el.clientHeight + 1)\n measure()\n return observeResize(el, measure)\n }, [applied, clampRows, rowHeight, options])\n\n const searchMatchesExisting = options.some(\n (o) => o.name.toLowerCase() === search.trim().toLowerCase()\n )\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next)\n if (!next) setSearch('')\n }}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.edit}\n data-slot=\"fact-labels-cell\"\n className=\"group relative flex h-full w-full min-w-0 cursor-pointer items-center gap-1 pr-4 text-left hover:bg-muted\"\n >\n {appliedOptions.length === 0 ? (\n <span className=\"flex-1 text-muted-foreground opacity-50\">\n <PencilLine className=\"size-3.5\" />\n </span>\n ) : (\n <>\n <div\n ref={chipsRef}\n className=\"flex min-w-0 flex-1 flex-wrap content-start gap-1 overflow-hidden\"\n style={{ maxHeight: CHIP_ROW_H * clampRows + CHIP_GAP * (clampRows - 1) }}\n >\n {appliedOptions.map((o) => (\n <span\n key={o.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium\"\n title={o.name}\n style={{ borderColor: o.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: o.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[80px] truncate\">{o.name}</span>\n </span>\n ))}\n </div>\n {hasOverflow && (\n <span\n className=\"pointer-events-none absolute bottom-0.5 right-0.5 text-xs font-semibold leading-none text-muted-foreground\"\n aria-hidden\n >\n …\n </span>\n )}\n </>\n )}\n </button>\n </PopoverTrigger>\n {open && (\n <PopoverContent className=\"w-[360px] p-0\" align=\"start\" side=\"bottom\" sideOffset={4}>\n <Command shouldFilter={true}>\n <CommandInput\n placeholder={l.searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && search.trim() && !searchMatchesExisting) {\n e.preventDefault()\n void createAndApply(search)\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {search.trim() ? (\n <button\n type=\"button\"\n onClick={() => void createAndApply(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"w-full cursor-pointer rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n {l.create(search.trim())}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.empty}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {options.map((o) => {\n const isApplied = applied.has(o.id)\n return (\n <CommandItem\n key={o.id}\n value={o.name}\n onSelect={() => toggle(o)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.option?.(o.id), {\n testId: `fact-label-select-${o.id}`,\n })}\n >\n <span\n className=\"mr-2 flex size-4 shrink-0 items-center justify-center rounded border-2\"\n style={\n isApplied\n ? { borderColor: o.color, backgroundColor: o.color }\n : { borderColor: o.color }\n }\n >\n {isApplied && <Check className=\"size-3 text-white\" strokeWidth={3} />}\n </span>\n <span className=\"flex-1 text-sm\">{o.name}</span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n )}\n </Popover>\n )\n})\n","/**\n * Column definitions for the Facts grid. Every column has an explicit `colId` (AG Grid persists\n * column state by id: see CLAUDE.md). The app supplies behaviour and app-specific cells through\n * slots; the structure, widths, sorting, filters and presentational cells live here.\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport type {\n ColDef,\n ICellRendererParams,\n IHeaderParams,\n ValueGetterParams,\n} from 'ag-grid-community'\nimport { CalendarDays, Paperclip, Quote } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatSpan } from '../timeline/span'\nimport { decodeWhitespaceEntities } from './fact-text'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactColumnLabels {\n inChatHeaderTooltip: string\n inChatTitle: string\n notInChatTitle: string\n removeFromChat: string\n addToChat: string\n fact: string\n dates: string\n dateTitle: string\n labels: string\n verified: string\n verifiedTooltip: string\n shared: string\n sharedTooltip: string\n createdBy: string\n sources: string\n /** Tooltip of the Sources cell for `count` cited documents. */\n sourcedFrom: (count: number) => string\n createdAt: string\n updated: string\n id: string\n}\n\nexport const DEFAULT_FACT_COLUMN_LABELS: FactColumnLabels = {\n inChatHeaderTooltip: 'Facts added to this chat are always in context for this chat',\n inChatTitle: 'In this chat — always in context for it. Click to remove from chat.',\n notInChatTitle: 'Add to chat — always in context for this chat',\n removeFromChat: 'Remove from chat',\n addToChat: 'Add to chat',\n fact: 'Fact',\n dates: 'Dates',\n dateTitle: 'Date of the fact itself, not when this was saved',\n labels: 'Labels',\n verified: 'Verified',\n verifiedTooltip: 'Verified by a human',\n shared: 'Shared',\n sharedTooltip: 'Shared with the workspace, or private to you & your agents',\n createdBy: 'Created by',\n sources: 'Sources',\n sourcedFrom: (n) => `Sourced from ${n} document${n === 1 ? '' : 's'} — open the fact to see them`,\n createdAt: 'Created at',\n updated: 'Updated',\n id: 'ID',\n}\n\nexport interface FactColumnTestIds {\n inChat: (factId: string) => string\n text: (factId: string) => string\n date: (factId: string) => string\n}\n\n/** The fields of a fact the grid reads. Callers' richer types are accepted as-is. */\nexport interface FactRowView {\n external_id: string\n text: string\n confirmed: boolean\n shared: boolean\n date_start?: string | null\n date_end?: string | null\n timezone?: string | null\n tags?: Array<{ name: string }> | null\n citations?: unknown[] | null\n created_by_ext_id?: string | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nexport interface FactColumnSlots<T extends FactRowView> {\n /** Whether the fact is in the host's current chat. With `onToggleInChat`, adds the In chat\n * column; a host without chats leaves both out. Read at render time: the host refreshes the\n * column when its chat changes. */\n isInChat?: (fact: T) => boolean\n /** Add the fact to the current chat, or take it out. */\n onToggleInChat?: (fact: T) => void\n /** Custom header (persistent filter button) for the columns that use one. */\n renderHeader: (params: IHeaderParams, colId: string) => ReactNode\n /** Row action menu, shown at the right edge of the Fact cell. */\n renderRowActions: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Inline label picker for the Labels cell. */\n renderLabels: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The Verified switch. */\n renderVerified: (fact: T) => ReactNode\n /** The Shared switch. */\n renderShared: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The creator avatar. */\n renderCreator: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Sort/filter value for the Created by column (the creator's display name). */\n getCreatorName: (params: ValueGetterParams<T>) => string\n /** Friendly display of an ISO timestamp (Created at / Updated). */\n formatDate: (iso: string) => string\n labels?: Partial<FactColumnLabels>\n testIds?: Partial<FactColumnTestIds>\n}\n\n/**\n * Date-filter params for a column whose value is an ISO string. AG Grid hands the comparator a JS\n * `Date` from the picker and the raw cell value; this compares UTC day components so a filter\n * never shifts a date by a day for viewers west of UTC.\n */\nexport const ISO_DATE_FILTER_PARAMS = {\n browserDatePicker: true,\n comparator: (filterDate: Date, cellValue: unknown): number => {\n if (!cellValue || typeof cellValue !== 'string') return -1\n const cell = new Date(cellValue)\n if (Number.isNaN(cell.getTime())) return -1\n const cellDay = Date.UTC(cell.getUTCFullYear(), cell.getUTCMonth(), cell.getUTCDate())\n const filterDay = Date.UTC(\n filterDate.getFullYear(),\n filterDate.getMonth(),\n filterDate.getDate()\n )\n return cellDay < filterDay ? -1 : cellDay > filterDay ? 1 : 0\n },\n}\n\n/** How many source documents a fact cites (the Sources column counts documents, not passages). */\nexport function sourceDocCount(fact: Pick<FactRowView, 'citations'> | undefined): number {\n return fact?.citations?.length ?? 0\n}\n\n/** Default left-to-right order; default-hidden columns trail. Every colId must be listed. */\nexport const DEFAULT_FACT_COLUMN_ORDER = [\n 'in_chat',\n 'text',\n 'sources',\n 'tags',\n 'date',\n 'confirmed',\n 'shared',\n 'created_by',\n 'created_at',\n 'updated_at',\n 'note_id',\n] as const\n\nexport function createFactColumns<T extends FactRowView>(slots: FactColumnSlots<T>): ColDef<T>[] {\n // AG Grid's `field` is a path type over the row; for a generic row we assert the known keys.\n const fieldOf = (name: keyof FactRowView) => name as ColDef<T>['field']\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...slots.labels }\n const ids = slots.testIds\n\n const { isInChat, onToggleInChat } = slots\n const inChatColumn: ColDef<T>[] =\n isInChat && onToggleInChat\n ? [\n {\n colId: 'in_chat',\n headerName: '',\n headerComponent: () => (\n <span className=\"flex size-full items-center justify-center\">\n <Paperclip className=\"size-3.5 text-muted-foreground\" />\n </span>\n ),\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data ? isInChat(params.data) : false,\n width: 44,\n minWidth: 44,\n maxWidth: 44,\n sortable: true,\n resizable: false,\n headerTooltip: l.inChatHeaderTooltip,\n cellClass: 'cell-hcenter',\n // A toggle, not a readout: a fact in the chat rides every message of it, so it flips\n // in place.\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n const inChat = isInChat(fact)\n return (\n <button\n type=\"button\"\n onClick={() => onToggleInChat(fact)}\n title={inChat ? l.inChatTitle : l.notInChatTitle}\n aria-label={inChat ? l.removeFromChat : l.addToChat}\n aria-pressed={inChat}\n data-testid={testIdOr(ids?.inChat?.(fact.external_id), {\n testId: `facts-grid-in-chat-${fact.external_id}`,\n })}\n className=\"flex h-full items-center\"\n >\n <Paperclip\n className={cn(\n 'size-3.5',\n inChat\n ? 'text-primary'\n : 'text-muted-foreground/30 transition-colors hover:text-muted-foreground'\n )}\n />\n </button>\n )\n },\n },\n ]\n : []\n\n const columns: ColDef<T>[] = [\n ...inChatColumn,\n {\n colId: 'text',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'text'),\n headerName: l.fact,\n field: fieldOf('text'),\n flex: 3,\n minWidth: 280,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Decode the editor's whitespace entities (`&#x20;` for a trailing space) so the tooltip\n // reads as typed, not as raw markdown references.\n tooltipValueGetter: (p) => decodeWhitespaceEntities(p.data?.text),\n // Editable only via the grid api (Rename in the row's menu); clicks never open the editor\n // (suppressClickEdit on the grid).\n editable: true,\n cellEditor: 'agLargeTextCellEditor',\n cellEditorPopup: true,\n cellEditorParams: { rows: 8, cols: 60 },\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.text = params.newValue\n return true\n },\n // NOT `cell-multiline`: this cell has its OWN clamp (the `.fact-clamp` span below, sized\n // from the row height). A second clamp cut the text in half at the minimum row height.\n cellClass: 'relative',\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n // Clamp to however many WHOLE lines fit the row height (leading-snug ~ 20px/line),\n // top-aligned so the BEGINNING of the fact is always shown. No overflow clip here: the\n // wrapper is the cell's content box, shorter than a line at the density floor.\n const rowH = params.node.rowHeight ?? 52\n const clampLines = Math.max(1, Math.floor(rowH / 20))\n return (\n <div className=\"relative flex size-full items-start pr-6\">\n <span\n className=\"fact-clamp whitespace-normal break-words text-sm leading-snug text-foreground\"\n style={{ ['--fact-clamp-lines' as string]: clampLines } as CSSProperties}\n data-testid={testIdOr(ids?.text?.(fact.external_id), {\n testId: `facts-grid-text-${fact.external_id}`,\n })}\n >\n {decodeWhitespaceEntities(fact.text)}\n </span>\n {/* `facts-row-kebab` (app CSS) keeps the menu always visible: touch has no hover. */}\n <div className=\"facts-row-kebab absolute right-0.5 top-1/2 -translate-y-1/2\">\n {slots.renderRowActions(fact, params)}\n </div>\n </div>\n )\n },\n },\n {\n colId: 'date',\n // AG Grid's DEFAULT header, so the sort arrow and filter button are the native ones,\n // identical to the Files table's Date columns.\n headerName: l.dates,\n // Sort on the raw bound rather than the rendered string (\"Oct 2019\" sorts April first).\n field: fieldOf('date_start'),\n flex: 0.8,\n minWidth: 132,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // The edit value is the date-only slice: a lexical sort matches a chronological one, and\n // the inline editor shows \"2024-03-12\" rather than a full ISO timestamp. Inline typing\n // accepts YYYY, YYYY-MM or YYYY-MM-DD; clearing the cell undates the fact.\n editable: true,\n singleClickEdit: true,\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data?.date_start ? params.data.date_start.slice(0, 10) : null,\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.date_start = params.newValue\n return true\n },\n cellClass: 'relative cell-tnum',\n cellRenderer: (params: ICellRendererParams<T>) => {\n const when = formatSpan(\n params.data?.date_start,\n params.data?.date_end,\n params.data?.timezone\n )\n if (!when) return <span className=\"text-muted-foreground/50\">—</span>\n return (\n <span\n className=\"inline-flex items-center gap-1\"\n data-testid={testIdOr(ids?.date?.(params.data?.external_id ?? ''), {\n testId: `facts-grid-date-${params.data?.external_id}`,\n })}\n title={l.dateTitle}\n >\n <CalendarDays className=\"size-3 opacity-70\" />\n {when}\n </span>\n )\n },\n },\n {\n colId: 'tags',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'tags'),\n headerName: l.labels,\n flex: 0.9,\n // Never narrower than its own header, even with the filter button and sort indicator.\n minWidth: 160,\n sortable: true,\n filter: 'agTextColumnFilter',\n cellClass: 'overflow-visible',\n valueGetter: (params: ValueGetterParams<T>) =>\n (params.data?.tags ?? []).map((t) => t.name).join(', '),\n // Editable in place: toggling a label persists immediately, no dialog round-trip.\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? slots.renderLabels(params.data, params) : null,\n },\n {\n colId: 'confirmed',\n headerName: l.verified,\n headerTooltip: l.verifiedTooltip,\n field: fieldOf('confirmed'),\n // minWidth matches width so the header can't be clamped narrow enough to ellipsize.\n width: 116,\n minWidth: 116,\n sortable: true,\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.confirmed ?? false,\n cellClass: 'cell-hcenter',\n headerClass: 'header-hcenter',\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderVerified(params.data)}\n </div>\n ) : null,\n },\n {\n colId: 'shared',\n headerName: l.shared,\n headerTooltip: l.sharedTooltip,\n field: fieldOf('shared'),\n // minWidth (not just width) is raised too: AG Grid clamps any persisted width up to it.\n width: 110,\n minWidth: 110,\n sortable: true,\n headerClass: 'header-hcenter',\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.shared ?? false,\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderShared(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'created_by',\n headerName: l.createdBy,\n headerTooltip: l.createdBy,\n width: 138,\n minWidth: 138,\n sortable: true,\n valueGetter: (params) => slots.getCreatorName(params),\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderCreator(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'sources',\n headerName: l.sources,\n width: 112,\n minWidth: 104,\n sortable: true,\n // A hand-written fact has no sources, which is information rather than a gap: it reads as\n // an em dash instead of a zero.\n valueGetter: (params) => sourceDocCount(params.data),\n cellRenderer: (params: ICellRendererParams<T>) => {\n const n = sourceDocCount(params.data)\n if (n === 0) return <span className=\"text-muted-foreground/40\">—</span>\n return (\n <span\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\"\n title={l.sourcedFrom(n)}\n >\n <Quote className=\"size-3 opacity-70\" />\n {n}\n </span>\n )\n },\n },\n {\n colId: 'created_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'created_at'),\n headerName: l.createdAt,\n field: fieldOf('created_at'),\n width: 162,\n minWidth: 154,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // Display-only: a valueFormatter avoids mounting a React component per row.\n cellClass: 'text-muted-foreground',\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'updated_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'updated_at'),\n headerName: l.updated,\n field: fieldOf('updated_at'),\n width: 140,\n minWidth: 140,\n // Hidden by default: a column-menu opt-in like the documents grid's long tail.\n hide: true,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'note_id',\n headerName: l.id,\n field: fieldOf('external_id'),\n width: 120,\n minWidth: 100,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Hidden by default like the documents ID column: needed when quoting a fact to support.\n hide: true,\n cellClass: 'font-mono text-xs text-muted-foreground',\n },\n ]\n\n // Persisted per-user column order still wins once set; bump the grid id to apply a new default.\n return DEFAULT_FACT_COLUMN_ORDER.map((id) => columns.find((c) => c.colId === id)).filter(\n (c): c is ColDef<T> => c !== undefined\n )\n}\n","/**\n * FactRowActions\n *\n * The ⋯ kebab menu for a Facts table row — mirroring the documents table's row\n * kebab. Carries Rename (inline-edit the fact text), Edit (the full dialog), and\n * Delete. Replaces the old inline edit-pencil affordance.\n */\nimport { MoreVertical, Pencil, Trash2 } from 'lucide-react'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactRowActionsLabels {\n actions: string\n edit: string\n /** Tooltip on a disabled Edit: rewording a fact is for its creator or a workspace owner. */\n editRestricted: string\n delete: string\n}\n\nexport const DEFAULT_FACT_ROW_ACTIONS_LABELS: FactRowActionsLabels = {\n actions: 'Fact actions',\n edit: 'Edit',\n editRestricted: 'Only the creator or a workspace owner can reword this fact',\n delete: 'Delete',\n}\n\nexport interface FactRowActionsTestIds {\n trigger: string\n edit: string\n delete: string\n}\n\nexport interface FactRowActionsProps {\n onEdit: () => void\n /** False when the viewer may not reword the fact: Edit is shown disabled, with the reason. */\n canEdit?: boolean\n onDelete: () => void\n labels?: Partial<FactRowActionsLabels>\n testIds?: Partial<FactRowActionsTestIds>\n}\n\nexport function FactRowActions({\n onEdit,\n canEdit = true,\n onDelete,\n labels,\n testIds,\n}: FactRowActionsProps) {\n const l = { ...DEFAULT_FACT_ROW_ACTIONS_LABELS, ...labels }\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => e.stopPropagation()}\n className=\"flex size-6 pointer-coarse:size-11 items-center justify-center rounded text-muted-foreground/70 transition-colors hover:bg-muted hover:text-foreground data-[state=open]:bg-muted data-[state=open]:text-foreground\"\n data-testid={testIdOr(testIds?.trigger, { testId: 'fact-row-actions' })}\n aria-label={l.actions}\n >\n <MoreVertical className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" onClick={(e) => e.stopPropagation()}>\n <DropdownMenuItem\n onSelect={onEdit}\n disabled={!canEdit}\n title={canEdit ? undefined : l.editRestricted}\n data-testid={testIdOr(testIds?.edit, { testId: 'fact-action-edit' })}\n >\n <Pencil className=\"mr-2 size-4\" />\n {l.edit}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={onDelete}\n className=\"text-red-text focus:text-red-text\"\n data-testid={testIdOr(testIds?.delete, { testId: 'fact-action-delete' })}\n >\n <Trash2 className=\"mr-2 size-4\" />\n {l.delete}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * Chronology tables in a chat answer, as dated facts. A table with a Date (or When) column\n * becomes one fact per row, dated by that column, so the Timeline can place each event. Only\n * unambiguous date spellings are read; a row whose date will not parse stays an undated fact.\n */\nimport type { components } from '@arbidocs/client'\nimport { EMPTY_FACT_DATE_FIELDS, factDateFieldsToSpan } from './fact-date'\nimport type { FactCitations } from './fact-citations'\n\ntype CreateFactBody = components['schemas']['CreateFactRequest']\n\nconst MONTHS = [\n 'january',\n 'february',\n 'march',\n 'april',\n 'may',\n 'june',\n 'july',\n 'august',\n 'september',\n 'october',\n 'november',\n 'december',\n]\n\n/** 1-based month number for an English month name or its three-letter abbreviation. */\nfunction monthNumber(name: string): number | null {\n const n = name.toLowerCase()\n const index = MONTHS.findIndex((m) => m === n || (n.length === 3 && m.startsWith(n)))\n return index === -1 ? null : index + 1\n}\n\n/** `YYYY-MM-DD` for an unambiguous date cell, or null. Impossible calendar days are rejected. */\nexport function parseChronologyDate(raw: string): string | null {\n const text = raw.replace(/[*_]/g, '').trim().replace(/\\.$/, '')\n let year: number\n let month: number | null\n let day: number\n const iso = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(text)\n const dayFirst = /^(\\d{1,2})(?:st|nd|rd|th)?\\s+([A-Za-z]+),?\\s+(\\d{4})$/.exec(text)\n const monthFirst = /^([A-Za-z]+)\\s+(\\d{1,2})(?:st|nd|rd|th)?,?\\s+(\\d{4})$/.exec(text)\n if (iso) {\n year = Number(iso[1])\n month = Number(iso[2])\n day = Number(iso[3])\n } else if (dayFirst) {\n day = Number(dayFirst[1])\n month = monthNumber(dayFirst[2])\n year = Number(dayFirst[3])\n } else if (monthFirst) {\n month = monthNumber(monthFirst[1])\n day = Number(monthFirst[2])\n year = Number(monthFirst[3])\n } else {\n return null\n }\n if (month === null) return null\n const probe = new Date(Date.UTC(year, month - 1, day))\n if (probe.getUTCDate() !== day || probe.getUTCMonth() !== month - 1) return null\n return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`\n}\n\n/** Cells of one markdown table row, without the outer pipes. */\nfunction splitRow(line: string): string[] {\n return line\n .trim()\n .replace(/^\\|/, '')\n .replace(/\\|$/, '')\n .split('|')\n .map((c) => c.trim())\n}\n\nconst SEPARATOR = /^\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)*\\|?$/\n\n/**\n * One fact body per row of every table in `markdown` that has a Date or When column, or null\n * when no row carries a parseable date (the answer is then saved as one fact, as before).\n */\nexport function chronologyFactBodies(\n markdown: string,\n citations: FactCitations | null\n): CreateFactBody[] | null {\n const lines = markdown.split('\\n').map((l) => l.trim())\n const bodies: CreateFactBody[] = []\n for (let i = 0; i < lines.length - 1; i++) {\n if (!lines[i].startsWith('|') || !SEPARATOR.test(lines[i + 1])) continue\n const dateCol = splitRow(lines[i]).findIndex((h) => /\\b(date|when)\\b/i.test(h))\n if (dateCol === -1) continue\n let row = i + 2\n for (; row < lines.length && lines[row].startsWith('|'); row++) {\n const cells = splitRow(lines[row])\n const date = parseChronologyDate(cells[dateCol] ?? '')\n const text = cells\n .filter((_, idx) => idx !== dateCol)\n .filter(Boolean)\n .join(' — ')\n if (!text) continue\n bodies.push({\n text,\n shared: false,\n confirmed: true,\n tag_ext_ids: [],\n citations,\n ...(date ? factDateFieldsToSpan({ ...EMPTY_FACT_DATE_FIELDS, date }) : {}),\n })\n }\n i = row - 1\n }\n return bodies.some((b) => b.date) ? bodies : null\n}\n"]}