@arbidocs/blocks 0.5.16 → 0.5.17

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 (191) hide show
  1. package/dist/{ConnectedCallDock-PNF46ZCD.js → ConnectedCallDock-2NBGBWY5.js} +6 -6
  2. package/dist/{ConnectedCallDock-PNF46ZCD.js.map → ConnectedCallDock-2NBGBWY5.js.map} +1 -1
  3. package/dist/{ConnectedCallDock-AN7H7EA5.cjs → ConnectedCallDock-W5WIPP3F.cjs} +15 -15
  4. package/dist/{ConnectedCallDock-AN7H7EA5.cjs.map → ConnectedCallDock-W5WIPP3F.cjs.map} +1 -1
  5. package/dist/{ConnectedCallRoom-BCBK3JOH.js → ConnectedCallRoom-5AZH33AJ.js} +6 -6
  6. package/dist/{ConnectedCallRoom-BCBK3JOH.js.map → ConnectedCallRoom-5AZH33AJ.js.map} +1 -1
  7. package/dist/{ConnectedCallRoom-CISDTK4R.cjs → ConnectedCallRoom-XR25N6PN.cjs} +7 -7
  8. package/dist/{ConnectedCallRoom-CISDTK4R.cjs.map → ConnectedCallRoom-XR25N6PN.cjs.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-FCAICKSW.js → ConnectedNativeDocxComparison-BC5WSJEU.js} +11 -10
  10. package/dist/{ConnectedNativeDocxComparison-FCAICKSW.js.map → ConnectedNativeDocxComparison-BC5WSJEU.js.map} +1 -1
  11. package/dist/{ConnectedNativeDocxComparison-M2YD5ZIU.cjs → ConnectedNativeDocxComparison-O2COCSHL.cjs} +12 -11
  12. package/dist/{ConnectedNativeDocxComparison-M2YD5ZIU.cjs.map → ConnectedNativeDocxComparison-O2COCSHL.cjs.map} +1 -1
  13. package/dist/{ConnectedNativeDocxEditor-WCVJ7UTP.js → ConnectedNativeDocxEditor-JGIHX4KM.js} +10 -9
  14. package/dist/{ConnectedNativeDocxEditor-WCVJ7UTP.js.map → ConnectedNativeDocxEditor-JGIHX4KM.js.map} +1 -1
  15. package/dist/{ConnectedNativeDocxEditor-USWYSQTI.cjs → ConnectedNativeDocxEditor-OLKFI6ER.cjs} +12 -11
  16. package/dist/{ConnectedNativeDocxEditor-USWYSQTI.cjs.map → ConnectedNativeDocxEditor-OLKFI6ER.cjs.map} +1 -1
  17. package/dist/{ConnectedStreamedWordArtifact-4VXP44AG.cjs → ConnectedStreamedWordArtifact-FCHEZYHG.cjs} +12 -11
  18. package/dist/ConnectedStreamedWordArtifact-FCHEZYHG.cjs.map +1 -0
  19. package/dist/{ConnectedStreamedWordArtifact-EWTERIGT.js → ConnectedStreamedWordArtifact-QXVGVP22.js} +11 -10
  20. package/dist/ConnectedStreamedWordArtifact-QXVGVP22.js.map +1 -0
  21. package/dist/{WorkspaceTableView-V236NDPK.js → WorkspaceTableView-V4ZNTVS4.js} +3 -3
  22. package/dist/{WorkspaceTableView-V236NDPK.js.map → WorkspaceTableView-V4ZNTVS4.js.map} +1 -1
  23. package/dist/{WorkspaceTableView-P4PCXHZ6.cjs → WorkspaceTableView-VCIRIQRL.cjs} +3 -3
  24. package/dist/{WorkspaceTableView-P4PCXHZ6.cjs.map → WorkspaceTableView-VCIRIQRL.cjs.map} +1 -1
  25. package/dist/agents/index.cjs +329 -328
  26. package/dist/agents/index.js +7 -6
  27. package/dist/calls/index.cjs +142 -142
  28. package/dist/calls/index.js +10 -10
  29. package/dist/{chunk-5QJDDEYV.js → chunk-2AWDMU6T.js} +3 -3
  30. package/dist/{chunk-5QJDDEYV.js.map → chunk-2AWDMU6T.js.map} +1 -1
  31. package/dist/{chunk-ATNQD3AE.js → chunk-2EYAJAKT.js} +3 -3
  32. package/dist/{chunk-ATNQD3AE.js.map → chunk-2EYAJAKT.js.map} +1 -1
  33. package/dist/{chunk-PBM6BFFH.cjs → chunk-3L5MXUBZ.cjs} +4 -4
  34. package/dist/{chunk-PBM6BFFH.cjs.map → chunk-3L5MXUBZ.cjs.map} +1 -1
  35. package/dist/{chunk-OKYALUAN.js → chunk-4R5OHS2D.js} +3 -3
  36. package/dist/{chunk-OKYALUAN.js.map → chunk-4R5OHS2D.js.map} +1 -1
  37. package/dist/{chunk-4IMTH6Z4.js → chunk-5RHNGSVP.js} +3 -3
  38. package/dist/{chunk-4IMTH6Z4.js.map → chunk-5RHNGSVP.js.map} +1 -1
  39. package/dist/{chunk-TRHAIU6U.js → chunk-5S424MAG.js} +4 -4
  40. package/dist/{chunk-TRHAIU6U.js.map → chunk-5S424MAG.js.map} +1 -1
  41. package/dist/{chunk-TDIC7IXS.cjs → chunk-63VQD4R7.cjs} +7 -7
  42. package/dist/{chunk-TDIC7IXS.cjs.map → chunk-63VQD4R7.cjs.map} +1 -1
  43. package/dist/{chunk-LFBT3XTK.cjs → chunk-6MHGFCIW.cjs} +14 -14
  44. package/dist/{chunk-LFBT3XTK.cjs.map → chunk-6MHGFCIW.cjs.map} +1 -1
  45. package/dist/{chunk-RPWNNTJJ.js → chunk-7TAWJXSR.js} +6 -6
  46. package/dist/{chunk-RPWNNTJJ.js.map → chunk-7TAWJXSR.js.map} +1 -1
  47. package/dist/{chunk-ZJX7RUQ3.js → chunk-B5BJH76B.js} +4 -4
  48. package/dist/{chunk-ZJX7RUQ3.js.map → chunk-B5BJH76B.js.map} +1 -1
  49. package/dist/{chunk-VP7VAE2M.cjs → chunk-B5SEHTMC.cjs} +4 -4
  50. package/dist/{chunk-VP7VAE2M.cjs.map → chunk-B5SEHTMC.cjs.map} +1 -1
  51. package/dist/{chunk-4AAM6UQG.js → chunk-BIZDGRNM.js} +3 -3
  52. package/dist/{chunk-4AAM6UQG.js.map → chunk-BIZDGRNM.js.map} +1 -1
  53. package/dist/{chunk-5NFQCGGO.cjs → chunk-BLESTVHK.cjs} +5 -5
  54. package/dist/{chunk-5NFQCGGO.cjs.map → chunk-BLESTVHK.cjs.map} +1 -1
  55. package/dist/{chunk-5TALCIRH.js → chunk-CH4FHZSR.js} +4 -91
  56. package/dist/chunk-CH4FHZSR.js.map +1 -0
  57. package/dist/{chunk-AAWF27UG.js → chunk-D3OGQ5ZW.js} +3 -3
  58. package/dist/{chunk-AAWF27UG.js.map → chunk-D3OGQ5ZW.js.map} +1 -1
  59. package/dist/{chunk-DJ4BTWMA.cjs → chunk-DAL6B556.cjs} +4 -4
  60. package/dist/{chunk-DJ4BTWMA.cjs.map → chunk-DAL6B556.cjs.map} +1 -1
  61. package/dist/{chunk-35AUFGD7.js → chunk-E65JWVDL.js} +3 -3
  62. package/dist/{chunk-35AUFGD7.js.map → chunk-E65JWVDL.js.map} +1 -1
  63. package/dist/{chunk-XUWZMZP5.cjs → chunk-F4UYC2M2.cjs} +5 -5
  64. package/dist/{chunk-XUWZMZP5.cjs.map → chunk-F4UYC2M2.cjs.map} +1 -1
  65. package/dist/{chunk-WINJF2AK.js → chunk-F6UJUUFK.js} +3 -3
  66. package/dist/{chunk-WINJF2AK.js.map → chunk-F6UJUUFK.js.map} +1 -1
  67. package/dist/{chunk-ITOQYYTG.cjs → chunk-G6NRTQ25.cjs} +5 -5
  68. package/dist/{chunk-ITOQYYTG.cjs.map → chunk-G6NRTQ25.cjs.map} +1 -1
  69. package/dist/{chunk-RG4SLXZG.js → chunk-G7PAZQHJ.js} +3 -3
  70. package/dist/{chunk-RG4SLXZG.js.map → chunk-G7PAZQHJ.js.map} +1 -1
  71. package/dist/{chunk-CJFJNR2V.js → chunk-GTO65EQQ.js} +3 -3
  72. package/dist/{chunk-CJFJNR2V.js.map → chunk-GTO65EQQ.js.map} +1 -1
  73. package/dist/{chunk-IUPZMPXP.cjs → chunk-HPUEYVG3.cjs} +18 -18
  74. package/dist/{chunk-IUPZMPXP.cjs.map → chunk-HPUEYVG3.cjs.map} +1 -1
  75. package/dist/{chunk-LHLBMP24.js → chunk-HVXNEOOU.js} +6 -6
  76. package/dist/{chunk-LHLBMP24.js.map → chunk-HVXNEOOU.js.map} +1 -1
  77. package/dist/{chunk-PSWTOD7E.js → chunk-HXYYH4OB.js} +3 -3
  78. package/dist/{chunk-PSWTOD7E.js.map → chunk-HXYYH4OB.js.map} +1 -1
  79. package/dist/{chunk-I5KTRLKB.cjs → chunk-I5UQUMUL.cjs} +8 -8
  80. package/dist/{chunk-I5KTRLKB.cjs.map → chunk-I5UQUMUL.cjs.map} +1 -1
  81. package/dist/{chunk-4MADJGGF.cjs → chunk-JYYJGYUP.cjs} +4 -4
  82. package/dist/{chunk-4MADJGGF.cjs.map → chunk-JYYJGYUP.cjs.map} +1 -1
  83. package/dist/{chunk-AE3M3RTH.js → chunk-KB5RAHUZ.js} +6 -6
  84. package/dist/{chunk-AE3M3RTH.js.map → chunk-KB5RAHUZ.js.map} +1 -1
  85. package/dist/{chunk-AUDT4L2H.cjs → chunk-KNQQFJNE.cjs} +4 -4
  86. package/dist/{chunk-AUDT4L2H.cjs.map → chunk-KNQQFJNE.cjs.map} +1 -1
  87. package/dist/{chunk-UCVCYHAC.js → chunk-KUDS6DY4.js} +3 -3
  88. package/dist/{chunk-UCVCYHAC.js.map → chunk-KUDS6DY4.js.map} +1 -1
  89. package/dist/{chunk-TSD3GFOH.js → chunk-L5UHXBJK.js} +3 -3
  90. package/dist/{chunk-TSD3GFOH.js.map → chunk-L5UHXBJK.js.map} +1 -1
  91. package/dist/{chunk-52BZME74.cjs → chunk-LDB77NUS.cjs} +4 -4
  92. package/dist/{chunk-52BZME74.cjs.map → chunk-LDB77NUS.cjs.map} +1 -1
  93. package/dist/{chunk-SWBD76UN.cjs → chunk-M36FYCOE.cjs} +9 -9
  94. package/dist/{chunk-SWBD76UN.cjs.map → chunk-M36FYCOE.cjs.map} +1 -1
  95. package/dist/{chunk-3NTC4UZV.js → chunk-NUHWRBSL.js} +3 -3
  96. package/dist/{chunk-3NTC4UZV.js.map → chunk-NUHWRBSL.js.map} +1 -1
  97. package/dist/{chunk-VPUGVNGV.cjs → chunk-NXOPNJ3Y.cjs} +4 -4
  98. package/dist/{chunk-VPUGVNGV.cjs.map → chunk-NXOPNJ3Y.cjs.map} +1 -1
  99. package/dist/{chunk-RAPIHS52.js → chunk-NZUPFIS7.js} +3 -3
  100. package/dist/{chunk-RAPIHS52.js.map → chunk-NZUPFIS7.js.map} +1 -1
  101. package/dist/{chunk-5DRKMFRL.cjs → chunk-PYIDGKZW.cjs} +52 -52
  102. package/dist/{chunk-5DRKMFRL.cjs.map → chunk-PYIDGKZW.cjs.map} +1 -1
  103. package/dist/{chunk-JWNCZ6UP.cjs → chunk-QVMQMPBZ.cjs} +4 -4
  104. package/dist/{chunk-JWNCZ6UP.cjs.map → chunk-QVMQMPBZ.cjs.map} +1 -1
  105. package/dist/{chunk-CPLRUC7D.cjs → chunk-SHRNXL2Q.cjs} +76 -76
  106. package/dist/{chunk-CPLRUC7D.cjs.map → chunk-SHRNXL2Q.cjs.map} +1 -1
  107. package/dist/chunk-SI222Z3A.cjs +185 -0
  108. package/dist/chunk-SI222Z3A.cjs.map +1 -0
  109. package/dist/{chunk-DCQGJNZQ.js → chunk-SX2RX5DT.js} +3 -3
  110. package/dist/{chunk-DCQGJNZQ.js.map → chunk-SX2RX5DT.js.map} +1 -1
  111. package/dist/{chunk-3EVLRDXP.cjs → chunk-SZGUU2TS.cjs} +7 -7
  112. package/dist/{chunk-3EVLRDXP.cjs.map → chunk-SZGUU2TS.cjs.map} +1 -1
  113. package/dist/{chunk-A6MGGHHN.cjs → chunk-T55BHIB7.cjs} +4 -4
  114. package/dist/{chunk-A6MGGHHN.cjs.map → chunk-T55BHIB7.cjs.map} +1 -1
  115. package/dist/{chunk-ML27HIMM.cjs → chunk-TCT2VS72.cjs} +6 -6
  116. package/dist/{chunk-ML27HIMM.cjs.map → chunk-TCT2VS72.cjs.map} +1 -1
  117. package/dist/chunk-U4HWVCRN.js +180 -0
  118. package/dist/chunk-U4HWVCRN.js.map +1 -0
  119. package/dist/{chunk-NEODSOVW.js → chunk-VIUWP2FC.js} +3 -3
  120. package/dist/{chunk-NEODSOVW.js.map → chunk-VIUWP2FC.js.map} +1 -1
  121. package/dist/{chunk-3GT6GPTM.cjs → chunk-XGCXHDZT.cjs} +26 -26
  122. package/dist/{chunk-3GT6GPTM.cjs.map → chunk-XGCXHDZT.cjs.map} +1 -1
  123. package/dist/{chunk-U7ZBIU4S.cjs → chunk-XZ2IUJQV.cjs} +4 -4
  124. package/dist/{chunk-U7ZBIU4S.cjs.map → chunk-XZ2IUJQV.cjs.map} +1 -1
  125. package/dist/{chunk-5RIPA5DV.js → chunk-YFLARXLW.js} +5 -5
  126. package/dist/{chunk-5RIPA5DV.js.map → chunk-YFLARXLW.js.map} +1 -1
  127. package/dist/{chunk-MRG4OUL3.js → chunk-YN6ND3LW.js} +5 -5
  128. package/dist/{chunk-MRG4OUL3.js.map → chunk-YN6ND3LW.js.map} +1 -1
  129. package/dist/{chunk-OTV7TUKD.cjs → chunk-Z3IB6UMJ.cjs} +29 -29
  130. package/dist/{chunk-OTV7TUKD.cjs.map → chunk-Z3IB6UMJ.cjs.map} +1 -1
  131. package/dist/{chunk-BZF6E46W.cjs → chunk-ZLSMS6OK.cjs} +5 -92
  132. package/dist/chunk-ZLSMS6OK.cjs.map +1 -0
  133. package/dist/citations/index.cjs +12 -10
  134. package/dist/citations/index.js +4 -2
  135. package/dist/connect/docx.cjs +14 -13
  136. package/dist/connect/docx.js +10 -9
  137. package/dist/connect/index.cjs +711 -711
  138. package/dist/connect/index.cjs.map +1 -1
  139. package/dist/connect/index.js +31 -31
  140. package/dist/connect/index.js.map +1 -1
  141. package/dist/connect/viewer.cjs +91 -91
  142. package/dist/connect/viewer.js +14 -14
  143. package/dist/connection/billing/{ReferralReward.d.ts → ConnectedReferralReward.d.ts} +7 -7
  144. package/dist/connection/billing/referral-reward.d.ts +1 -1
  145. package/dist/document-tools/index.cjs +16 -16
  146. package/dist/document-tools/index.js +2 -2
  147. package/dist/facts/index.cjs +4 -3
  148. package/dist/facts/index.cjs.map +1 -1
  149. package/dist/facts/index.js +3 -2
  150. package/dist/facts/index.js.map +1 -1
  151. package/dist/files/index.cjs +224 -223
  152. package/dist/files/index.js +4 -3
  153. package/dist/home/index.cjs +31 -30
  154. package/dist/home/index.cjs.map +1 -1
  155. package/dist/home/index.js +6 -5
  156. package/dist/home/index.js.map +1 -1
  157. package/dist/index.cjs +453 -452
  158. package/dist/index.cjs.map +1 -1
  159. package/dist/index.js +14 -13
  160. package/dist/index.js.map +1 -1
  161. package/dist/provider/dialogs.d.ts +43 -0
  162. package/dist/retrieval/index.cjs +5 -4
  163. package/dist/retrieval/index.js +3 -2
  164. package/dist/settings/index.cjs +3 -3
  165. package/dist/settings/index.d.ts +1 -1
  166. package/dist/settings/index.js +1 -1
  167. package/dist/shell/index.cjs +47 -46
  168. package/dist/shell/index.js +4 -3
  169. package/dist/studio/index.cjs +14 -13
  170. package/dist/studio/index.cjs.map +1 -1
  171. package/dist/studio/index.js +6 -5
  172. package/dist/studio/index.js.map +1 -1
  173. package/dist/workflow-canvas/index.cjs +27 -26
  174. package/dist/workflow-canvas/index.cjs.map +1 -1
  175. package/dist/workflow-canvas/index.js +9 -8
  176. package/dist/workflow-canvas/index.js.map +1 -1
  177. package/dist/workspaces/index.cjs +22 -20
  178. package/dist/workspaces/index.cjs.map +1 -1
  179. package/dist/workspaces/index.js +6 -4
  180. package/dist/workspaces/index.js.map +1 -1
  181. package/node_modules/@arbidocs/coedit/package.json +1 -1
  182. package/package.json +5 -5
  183. package/dist/ConnectedStreamedWordArtifact-4VXP44AG.cjs.map +0 -1
  184. package/dist/ConnectedStreamedWordArtifact-EWTERIGT.js.map +0 -1
  185. package/dist/chunk-5TALCIRH.js.map +0 -1
  186. package/dist/chunk-BZF6E46W.cjs.map +0 -1
  187. package/dist/chunk-ECERC6TI.js +0 -77
  188. package/dist/chunk-ECERC6TI.js.map +0 -1
  189. package/dist/chunk-ZAVEMQ37.cjs +0 -80
  190. package/dist/chunk-ZAVEMQ37.cjs.map +0 -1
  191. package/dist/settings/ConfirmDialog.d.ts +0 -31
@@ -1,37 +1,37 @@
1
1
  "use client";
2
- import { ConnectedMarkdown, ConnectedDocumentToolsProvider, useDocumentViewerSupport, useViewerStreamingDocument, useViewerDraftDocument, useViewerIsDetached, useViewerPassageCitation } from '../chunk-5RIPA5DV.js';
3
- export { ConnectedDocumentToolsProvider } from '../chunk-5RIPA5DV.js';
4
- import { HtmlPassage, ViewerTitle, ViewerTabBar, ViewerImageActions, canChangeVisibility, ViewerFrame, ViewerMessage, DocumentLabelBar, ViewerControlBar, ViewerZoomControl, PdfPageNav, ViewerPageCounter, summariseDocTags, isDocumentLabel, ViewerPreviewUnavailable, ViewerLoadError, HtmlViewerRoot, CitedRunNav, HtmlViewerSurface, HtmlPage, HtmlViewerEmpty, TagPassagePanel } from '../chunk-35AUFGD7.js';
2
+ import { ConnectedMarkdown, ConnectedDocumentToolsProvider, useDocumentViewerSupport, useViewerStreamingDocument, useViewerDraftDocument, useViewerIsDetached, useViewerPassageCitation } from '../chunk-YFLARXLW.js';
3
+ export { ConnectedDocumentToolsProvider } from '../chunk-YFLARXLW.js';
4
+ import { HtmlPassage, ViewerTitle, ViewerTabBar, ViewerImageActions, canChangeVisibility, ViewerFrame, ViewerMessage, DocumentLabelBar, ViewerControlBar, ViewerZoomControl, PdfPageNav, ViewerPageCounter, summariseDocTags, isDocumentLabel, ViewerPreviewUnavailable, ViewerLoadError, HtmlViewerRoot, CitedRunNav, HtmlViewerSurface, HtmlPage, HtmlViewerEmpty, TagPassagePanel } from '../chunk-E65JWVDL.js';
5
5
  import '../chunk-JJA6GQKH.js';
6
6
  import '../chunk-RC6VTY2H.js';
7
- import { MarkupViewNote, AnnotateButton, ShowOriginalButton, DownloadMarkupButton, SignButton, PlaceMySignatureButton, RequestSignaturesButton, MarkupNotices, SignedEditNote, VersionSnapshotBar, SignatureRequestBanner } from '../chunk-ATNQD3AE.js';
7
+ import { MarkupViewNote, AnnotateButton, ShowOriginalButton, DownloadMarkupButton, SignButton, PlaceMySignatureButton, RequestSignaturesButton, MarkupNotices, SignedEditNote, VersionSnapshotBar, SignatureRequestBanner } from '../chunk-2EYAJAKT.js';
8
8
  import { SignatureStatus, SignDocumentDialog } from '../chunk-PQU6LE7U.js';
9
9
  import { ViewerStatusNote, ViewerHeaderStart, ViewerHeaderEnd, ViewerPane } from '../chunk-6HKLTYNN.js';
10
10
  import '../chunk-2R3GGNPA.js';
11
11
  import '../chunk-TBNXJHTP.js';
12
- import '../chunk-WINJF2AK.js';
12
+ import '../chunk-F6UJUUFK.js';
13
13
  import { ErrorBoundary } from '../chunk-EQ3WRY2N.js';
14
14
  import '../chunk-JMQLTMJ7.js';
15
15
  import '../chunk-6MMYWBYS.js';
16
- import { PassageMark, NoteMark, LabelMark, PassagePill } from '../chunk-TSD3GFOH.js';
16
+ import { PassageMark, NoteMark, LabelMark, PassagePill } from '../chunk-L5UHXBJK.js';
17
17
  import { ShareControl } from '../chunk-K4BGOPGG.js';
18
18
  import '../chunk-M4S75AEJ.js';
19
19
  import '../chunk-5LXQPP2K.js';
20
20
  import '../chunk-NUNKSZKU.js';
21
21
  import '../chunk-RLWIUUQ5.js';
22
22
  import '../chunk-YU2KUMGE.js';
23
- import '../chunk-DCQGJNZQ.js';
23
+ import '../chunk-SX2RX5DT.js';
24
24
  import '../chunk-N5YEF3LC.js';
25
25
  import { ArtifactCompareBar, ArtifactPreview, ArtifactCodeView, VersionTimeline } from '../chunk-65S53MZK.js';
26
26
  import '../chunk-NS4JD2VR.js';
27
27
  import '../chunk-LOJVUGBJ.js';
28
- import { useConnectedConversations, useConnectedDocuments, useConnectedTags } from '../chunk-RG4SLXZG.js';
29
- import { useConnectedWorkspace } from '../chunk-4AAM6UQG.js';
30
- import '../chunk-ECERC6TI.js';
28
+ import { useConnectedConversations, useConnectedDocuments, useConnectedTags } from '../chunk-G7PAZQHJ.js';
29
+ import { useConnectedWorkspace } from '../chunk-BIZDGRNM.js';
31
30
  import '../chunk-T4P237N6.js';
32
31
  import { TabHeader } from '../chunk-ABEKUV6L.js';
33
32
  import '../chunk-P6GHJSLR.js';
34
- import { useBlocksEnvironment } from '../chunk-5TALCIRH.js';
33
+ import { useBlocksEnvironment } from '../chunk-CH4FHZSR.js';
34
+ import '../chunk-U4HWVCRN.js';
35
35
  import '../chunk-TX2ZICS7.js';
36
36
  import '../chunk-OKERRHLH.js';
37
37
  import '../chunk-DDCMLHXF.js';
@@ -1713,17 +1713,17 @@ function ViewerPdfPane({
1713
1713
  return /* @__PURE__ */ jsx(SessionPdfViewer, { ...viewerProps, file: pdfBlob });
1714
1714
  }
1715
1715
  var NativeDocxEditor = lazy(
1716
- () => import('../ConnectedNativeDocxEditor-WCVJ7UTP.js').then((m) => ({
1716
+ () => import('../ConnectedNativeDocxEditor-JGIHX4KM.js').then((m) => ({
1717
1717
  default: m.ConnectedNativeDocxEditor
1718
1718
  }))
1719
1719
  );
1720
1720
  var StreamedWordArtifact = lazy(
1721
- () => import('../ConnectedStreamedWordArtifact-EWTERIGT.js').then((m) => ({
1721
+ () => import('../ConnectedStreamedWordArtifact-QXVGVP22.js').then((m) => ({
1722
1722
  default: m.ConnectedStreamedWordArtifact
1723
1723
  }))
1724
1724
  );
1725
1725
  var NativeDocxComparison = lazy(
1726
- () => import('../ConnectedNativeDocxComparison-FCAICKSW.js').then((m) => ({
1726
+ () => import('../ConnectedNativeDocxComparison-BC5WSJEU.js').then((m) => ({
1727
1727
  default: m.ConnectedNativeDocxComparison
1728
1728
  }))
1729
1729
  );
@@ -1,25 +1,25 @@
1
1
  /**
2
- * ReferralReward — binds the user's referral reward to the reward blocks.
2
+ * ConnectedReferralReward — binds the user's referral reward to the reward views.
3
3
  *
4
4
  * The reward is a single GLOBAL per-user Stripe account balance (mirrored read-only
5
5
  * into `settings.extra_discount`) that auto-applies to the user's NEXT invoice. Surfaced as:
6
- * - `ReferralRewardBadge` — standing indicator in the Projects tab header.
7
- * - `ReferralRewardSummary` — "subtotal / −reward / you pay now" where the charge is known
6
+ * - `ConnectedReferralRewardBadge` — standing indicator in the Projects tab header.
7
+ * - `ConnectedReferralRewardSummary` — "subtotal / −reward / you pay now" where the charge is known
8
8
  * exactly (new-project first invoice == the shown total).
9
- * - `ReferralRewardNote` — a one-line note where the exact charge is a proration we
9
+ * - `ConnectedReferralRewardNote` — a one-line note where the exact charge is a proration we
10
10
  * can't compute client-side (switching an existing Pro plan).
11
11
  *
12
12
  * Logic + the `useReferralReward` hook live in `./referral-reward`; the presentation in
13
13
  * `@arbidocs/blocks`.
14
14
  */
15
15
  /** Standing pill for the Projects tab header — the global available reward. */
16
- export declare function ReferralRewardBadge(): import("react").JSX.Element | null;
16
+ export declare function ConnectedReferralRewardBadge(): import("react").JSX.Element | null;
17
17
  /**
18
18
  * Available referral reward shown alongside a new-project purchase. When the exact charge is
19
19
  * known (`totalCents` + `currency`), we do the math and show subtotal / −reward / you pay now;
20
20
  * otherwise we fall back to a one-line note. Renders nothing when there's no reward.
21
21
  */
22
- export declare function ReferralRewardSummary({ totalCents, currency, }: {
22
+ export declare function ConnectedReferralRewardSummary({ totalCents, currency, }: {
23
23
  /** The known charge for this purchase, in minor units (e.g. pennies). */
24
24
  totalCents?: number;
25
25
  /** Currency of the charge — must match the reward's currency to apply. */
@@ -29,4 +29,4 @@ export declare function ReferralRewardSummary({ totalCents, currency, }: {
29
29
  * One-line note for charges whose exact amount is a proration we don't compute client-side
30
30
  * (switching an existing Pro subscription). Stripe applies the reward at charge time.
31
31
  */
32
- export declare function ReferralRewardNote(): import("react").JSX.Element | null;
32
+ export declare function ConnectedReferralRewardNote(): import("react").JSX.Element | null;
@@ -4,7 +4,7 @@
4
4
  * The reward is a single GLOBAL per-user number — a Stripe account balance mirrored
5
5
  * read-only into `settings.extra_discount`. It auto-applies to the user's NEXT invoice.
6
6
  * `applyReferralReward` mirrors Stripe's customer-balance logic: applied to the charge,
7
- * clamped at zero, remainder rolls forward. Components live in `./ReferralReward`.
7
+ * clamped at zero, remainder rolls forward. Components live in `./ConnectedReferralReward`.
8
8
  */
9
9
  export { formatMoney } from './reward-balance';
10
10
  export interface ReferralReward {
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkU7ZBIU4S_cjs = require('../chunk-U7ZBIU4S.cjs');
4
+ var chunkXZ2IUJQV_cjs = require('../chunk-XZ2IUJQV.cjs');
5
5
  var chunk2XLVE2XD_cjs = require('../chunk-2XLVE2XD.cjs');
6
6
  require('../chunk-UWIILWDI.cjs');
7
7
  require('../chunk-NMZI3K6R.cjs');
8
8
  var chunkRAYCOBF7_cjs = require('../chunk-RAYCOBF7.cjs');
9
- require('../chunk-ZAVEMQ37.cjs');
9
+ require('../chunk-SI222Z3A.cjs');
10
10
  require('../chunk-ULWRNGGE.cjs');
11
11
  require('../chunk-MHVNT4J3.cjs');
12
12
  require('../chunk-DES3K4SD.cjs');
@@ -15,59 +15,59 @@ require('../chunk-DES3K4SD.cjs');
15
15
 
16
16
  Object.defineProperty(exports, "AnnotateButton", {
17
17
  enumerable: true,
18
- get: function () { return chunkU7ZBIU4S_cjs.AnnotateButton; }
18
+ get: function () { return chunkXZ2IUJQV_cjs.AnnotateButton; }
19
19
  });
20
20
  Object.defineProperty(exports, "DEFAULT_VERSION_SNAPSHOT_BAR_LABELS", {
21
21
  enumerable: true,
22
- get: function () { return chunkU7ZBIU4S_cjs.DEFAULT_VERSION_SNAPSHOT_BAR_LABELS; }
22
+ get: function () { return chunkXZ2IUJQV_cjs.DEFAULT_VERSION_SNAPSHOT_BAR_LABELS; }
23
23
  });
24
24
  Object.defineProperty(exports, "DELETE_SAVED_SIGNATURE_TEXT", {
25
25
  enumerable: true,
26
- get: function () { return chunkU7ZBIU4S_cjs.DELETE_SAVED_SIGNATURE_TEXT; }
26
+ get: function () { return chunkXZ2IUJQV_cjs.DELETE_SAVED_SIGNATURE_TEXT; }
27
27
  });
28
28
  Object.defineProperty(exports, "DownloadMarkupButton", {
29
29
  enumerable: true,
30
- get: function () { return chunkU7ZBIU4S_cjs.DownloadMarkupButton; }
30
+ get: function () { return chunkXZ2IUJQV_cjs.DownloadMarkupButton; }
31
31
  });
32
32
  Object.defineProperty(exports, "MarkupNotices", {
33
33
  enumerable: true,
34
- get: function () { return chunkU7ZBIU4S_cjs.MarkupNotices; }
34
+ get: function () { return chunkXZ2IUJQV_cjs.MarkupNotices; }
35
35
  });
36
36
  Object.defineProperty(exports, "MarkupViewNote", {
37
37
  enumerable: true,
38
- get: function () { return chunkU7ZBIU4S_cjs.MarkupViewNote; }
38
+ get: function () { return chunkXZ2IUJQV_cjs.MarkupViewNote; }
39
39
  });
40
40
  Object.defineProperty(exports, "PlaceMySignatureButton", {
41
41
  enumerable: true,
42
- get: function () { return chunkU7ZBIU4S_cjs.PlaceMySignatureButton; }
42
+ get: function () { return chunkXZ2IUJQV_cjs.PlaceMySignatureButton; }
43
43
  });
44
44
  Object.defineProperty(exports, "RequestSignaturesButton", {
45
45
  enumerable: true,
46
- get: function () { return chunkU7ZBIU4S_cjs.RequestSignaturesButton; }
46
+ get: function () { return chunkXZ2IUJQV_cjs.RequestSignaturesButton; }
47
47
  });
48
48
  Object.defineProperty(exports, "SavedSignatureSettings", {
49
49
  enumerable: true,
50
- get: function () { return chunkU7ZBIU4S_cjs.SavedSignatureSettings; }
50
+ get: function () { return chunkXZ2IUJQV_cjs.SavedSignatureSettings; }
51
51
  });
52
52
  Object.defineProperty(exports, "ShowOriginalButton", {
53
53
  enumerable: true,
54
- get: function () { return chunkU7ZBIU4S_cjs.ShowOriginalButton; }
54
+ get: function () { return chunkXZ2IUJQV_cjs.ShowOriginalButton; }
55
55
  });
56
56
  Object.defineProperty(exports, "SignButton", {
57
57
  enumerable: true,
58
- get: function () { return chunkU7ZBIU4S_cjs.SignButton; }
58
+ get: function () { return chunkXZ2IUJQV_cjs.SignButton; }
59
59
  });
60
60
  Object.defineProperty(exports, "SignatureRequestBanner", {
61
61
  enumerable: true,
62
- get: function () { return chunkU7ZBIU4S_cjs.SignatureRequestBanner; }
62
+ get: function () { return chunkXZ2IUJQV_cjs.SignatureRequestBanner; }
63
63
  });
64
64
  Object.defineProperty(exports, "SignedEditNote", {
65
65
  enumerable: true,
66
- get: function () { return chunkU7ZBIU4S_cjs.SignedEditNote; }
66
+ get: function () { return chunkXZ2IUJQV_cjs.SignedEditNote; }
67
67
  });
68
68
  Object.defineProperty(exports, "VersionSnapshotBar", {
69
69
  enumerable: true,
70
- get: function () { return chunkU7ZBIU4S_cjs.VersionSnapshotBar; }
70
+ get: function () { return chunkXZ2IUJQV_cjs.VersionSnapshotBar; }
71
71
  });
72
72
  Object.defineProperty(exports, "SignDocumentDialog", {
73
73
  enumerable: true,
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- export { AnnotateButton, DEFAULT_VERSION_SNAPSHOT_BAR_LABELS, DELETE_SAVED_SIGNATURE_TEXT, DownloadMarkupButton, MarkupNotices, MarkupViewNote, PlaceMySignatureButton, RequestSignaturesButton, SavedSignatureSettings, ShowOriginalButton, SignButton, SignatureRequestBanner, SignedEditNote, VersionSnapshotBar } from '../chunk-ATNQD3AE.js';
2
+ export { AnnotateButton, DEFAULT_VERSION_SNAPSHOT_BAR_LABELS, DELETE_SAVED_SIGNATURE_TEXT, DownloadMarkupButton, MarkupNotices, MarkupViewNote, PlaceMySignatureButton, RequestSignaturesButton, SavedSignatureSettings, ShowOriginalButton, SignButton, SignatureRequestBanner, SignedEditNote, VersionSnapshotBar } from '../chunk-2EYAJAKT.js';
3
3
  export { SignDocumentDialog, SignatureCertificate, SignatureStatus, formatSignedAt } from '../chunk-PQU6LE7U.js';
4
4
  import '../chunk-6HKLTYNN.js';
5
5
  import '../chunk-2R3GGNPA.js';
6
6
  export { AdoptSignatureDialog, TYPED_SIGNATURE_STYLE } from '../chunk-TBNXJHTP.js';
7
- import '../chunk-ECERC6TI.js';
7
+ import '../chunk-U4HWVCRN.js';
8
8
  import '../chunk-TX2ZICS7.js';
9
9
  import '../chunk-7F6CBP3Z.js';
10
10
  import '../chunk-VUNV25KB.js';
@@ -4,7 +4,7 @@
4
4
  var chunkYD3RN2FY_cjs = require('../chunk-YD3RN2FY.cjs');
5
5
  require('../chunk-2WLXQGWC.cjs');
6
6
  var chunk5FYU7ZIU_cjs = require('../chunk-5FYU7ZIU.cjs');
7
- var chunk4MADJGGF_cjs = require('../chunk-4MADJGGF.cjs');
7
+ var chunkJYYJGYUP_cjs = require('../chunk-JYYJGYUP.cjs');
8
8
  require('../chunk-VPPX5XUF.cjs');
9
9
  var chunkRC25WMVB_cjs = require('../chunk-RC25WMVB.cjs');
10
10
  require('../chunk-V4ISCZJ7.cjs');
@@ -12,7 +12,8 @@ var chunk2EI7NCUA_cjs = require('../chunk-2EI7NCUA.cjs');
12
12
  var chunkC2CWWEHO_cjs = require('../chunk-C2CWWEHO.cjs');
13
13
  require('../chunk-QUMUAJ2P.cjs');
14
14
  require('../chunk-MEMWZ72Y.cjs');
15
- require('../chunk-BZF6E46W.cjs');
15
+ require('../chunk-ZLSMS6OK.cjs');
16
+ require('../chunk-SI222Z3A.cjs');
16
17
  require('../chunk-ULWRNGGE.cjs');
17
18
  require('../chunk-FX3K6LNZ.cjs');
18
19
  require('../chunk-PPCATBOY.cjs');
@@ -331,7 +332,7 @@ function FactSearchResult({
331
332
  }
332
333
  ),
333
334
  /* @__PURE__ */ jsxRuntime.jsx(
334
- chunk4MADJGGF_cjs.SearchHit,
335
+ chunkJYYJGYUP_cjs.SearchHit,
335
336
  {
336
337
  className: "min-w-0 flex-1",
337
338
  testId: chunkMHVNT4J3_cjs.testIdOr(testIds?.hit?.(id), { testId: `facts-smart-search-hit-${id}` }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/facts/FactsTable.tsx","../../src/facts/fact-row.ts","../../src/facts/FactSearchParts.tsx"],"names":["jsx","cn","DEFAULT_FACT_COLUMN_LABELS","useMemo","createFactColumns","FactRowActions","GridView","jsxs","testIdOr","Button","X","Loader2","Search","SearchHit","Paperclip","Check","CheckCircle2","CornerDownLeft"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * FactsTable: the default facts grid. `createFactColumns` wired to `GridView` with ready-made\n * cells (in-chat, verified and shared switches, label chips, creator initials, row menu), so a host\n * only supplies rows and handlers. Hosts that need custom cells call `createFactColumns` with\n * their own slots and render `GridView` themselves.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { cn } from '@arbidocs/react/ui'\nimport { GridView, type GridViewProps } from '../files/GridView'\nimport { initials } from '../lib/format'\nimport { FactRowActions } from './FactRowActions'\nimport {\n DEFAULT_FACT_COLUMN_LABELS,\n createFactColumns,\n type FactColumnLabels,\n type FactRowView,\n} from './factColumns'\n\nexport interface FactsTableProps<T extends FactRowView> {\n facts: T[]\n /** With `onToggleInChat`, shows the In chat column (whether a fact is in the host's chat). */\n isInChat?: (fact: T) => boolean\n onToggleInChat?: (fact: T) => void\n onToggleConfirmed: (fact: T) => void\n onToggleShared: (fact: T) => void\n /** The row menu appears when both `onEdit` and `onDelete` are provided. */\n onEdit?: (fact: T) => void\n onDelete?: (fact: T) => void\n /** Row click (opens the fact). */\n onOpen?: (fact: T) => void\n /** Display name of the fact's creator (sorting, filtering and the initials chip). */\n getCreatorName?: (fact: T) => string\n /** Friendly display of an ISO timestamp. Defaults to the locale date. */\n formatDate?: (iso: string) => string\n columnLabels?: Partial<FactColumnLabels>\n isLoading?: boolean\n /** Saved column state key (AG Grid persists by it). */\n gridId?: string\n height?: GridViewProps<T>['height']\n rowHeight?: number\n /** Escape hatch for any other `GridView` prop. */\n gridProps?: Partial<Omit<GridViewProps<T>, 'items' | 'columnDefs' | 'getItemId'>>\n testId?: string\n}\n\ninterface FactSwitchProps {\n checked: boolean\n label: string\n onToggle: () => void\n testId: string\n}\n\nfunction FactSwitch({ checked, label, onToggle, testId }: FactSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n onClick={onToggle}\n data-testid={testId}\n className={cn(\n 'inline-flex h-5 w-9 items-center rounded-full p-0.5 transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n checked ? 'bg-green-solid' : 'bg-muted-foreground/30'\n )}\n >\n <span\n className={cn(\n 'size-4 rounded-full bg-background transition-transform',\n checked && 'translate-x-4'\n )}\n />\n </button>\n )\n}\n\nconst defaultFormatDate = (iso: string): string => {\n const d = new Date(iso)\n return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString()\n}\n\nconst EMPTY_STATE = { title: 'No facts yet' }\n\n/** The default facts table: columns, cells and the grid in one component. */\nexport function FactsTable<T extends FactRowView>({\n facts,\n isInChat,\n onToggleInChat,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n onOpen,\n getCreatorName,\n formatDate = defaultFormatDate,\n columnLabels,\n isLoading,\n gridId = 'facts-table-v1',\n height = '100%',\n rowHeight = 52,\n gridProps,\n testId = 'facts-table',\n}: FactsTableProps<T>) {\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...columnLabels }\n\n const columnDefs = useMemo<ColDef<T>[]>(\n () =>\n createFactColumns<T>({\n isInChat,\n onToggleInChat,\n renderHeader: (params) => (\n <span className=\"text-[12.5px] font-medium\">{params.displayName}</span>\n ),\n renderRowActions: (fact) =>\n onEdit && onDelete ? (\n <FactRowActions onEdit={() => onEdit(fact)} onDelete={() => onDelete(fact)} />\n ) : null,\n renderLabels: (fact): ReactNode => (\n <span className=\"flex flex-wrap items-center gap-1\">\n {(fact.tags ?? []).map((tag) => (\n <span\n key={tag.name}\n className=\"rounded-full bg-muted px-2 py-px text-xs text-muted-foreground\"\n >\n {tag.name}\n </span>\n ))}\n </span>\n ),\n renderVerified: (fact) => (\n <FactSwitch\n checked={fact.confirmed}\n label={l.verified}\n onToggle={() => onToggleConfirmed(fact)}\n testId={`facts-grid-confirmed-${fact.external_id}`}\n />\n ),\n renderShared: (fact) => (\n <FactSwitch\n checked={fact.shared}\n label={l.shared}\n onToggle={() => onToggleShared(fact)}\n testId={`facts-grid-shared-${fact.external_id}`}\n />\n ),\n renderCreator: (fact, _params: ICellRendererParams<T>) => {\n const name = getCreatorName?.(fact) ?? ''\n return name ? (\n <span\n title={name}\n className=\"inline-flex size-6 items-center justify-center rounded-full bg-muted text-[10px] font-medium text-muted-foreground\"\n >\n {initials(name)}\n </span>\n ) : null\n },\n getCreatorName: (params) => (params.data ? (getCreatorName?.(params.data) ?? '') : ''),\n formatDate,\n labels: columnLabels,\n }),\n [\n isInChat,\n onToggleInChat,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n getCreatorName,\n formatDate,\n columnLabels,\n l.verified,\n l.shared,\n ]\n )\n\n return (\n <GridView<T>\n testId={testId}\n items={facts}\n columnDefs={columnDefs}\n getItemId={(fact) => fact.external_id}\n onRowClick={onOpen}\n isLoading={isLoading}\n emptyState={EMPTY_STATE}\n gridId={gridId}\n height={height}\n rowHeight={rowHeight}\n {...gridProps}\n gridOptions={{ suppressClickEdit: true, ...gridProps?.gridOptions }}\n />\n )\n}\n","import type { FactRowView } from './factColumns'\n\n/**\n * A fact as a host with plain records usually holds it: camelCase, optional flags, tags as\n * strings. `toFactRow` maps it to the `FactRowView` that `FactsTable` and `createFactColumns`\n * read, so a host without the SDK type needs no adapter of its own.\n */\nexport interface PlainFactRecord {\n id: string\n text: string\n confirmed?: boolean\n shared?: boolean\n /** ISO date (or date-time) the fact starts. */\n dateStart?: string | null\n dateEnd?: string | null\n timezone?: string | null\n tags?: Array<string | { name: string }> | null\n /** Passages that support the fact; only their count is shown. */\n citations?: unknown[] | null\n createdBy?: string | null\n createdAt?: string | null\n updatedAt?: string | null\n}\n\n/** The row plus the record it came from, so callbacks can hand the host its own object back. */\nexport type PlainFactRow<T extends PlainFactRecord> = FactRowView & { record: T }\n\n/** Map one plain record to a grid row. Missing flags are `false`, missing lists are empty. */\nexport function toFactRow<T extends PlainFactRecord>(record: T): PlainFactRow<T> {\n return {\n external_id: record.id,\n text: record.text,\n confirmed: record.confirmed ?? false,\n shared: record.shared ?? false,\n date_start: record.dateStart ?? null,\n date_end: record.dateEnd ?? null,\n timezone: record.timezone ?? null,\n tags: (record.tags ?? []).map((t) => (typeof t === 'string' ? { name: t } : t)),\n citations: record.citations ?? [],\n created_by_ext_id: record.createdBy ?? null,\n created_at: record.createdAt ?? null,\n updated_at: record.updatedAt ?? null,\n record,\n }\n}\n\nexport function toFactRows<T extends PlainFactRecord>(records: T[]): PlainFactRow<T>[] {\n return records.map(toFactRow)\n}\n","import type { ReactNode } from 'react'\nimport { Check, CheckCircle2, CornerDownLeft, Loader2, Paperclip, Search, X } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { SearchHit } from '../retrieval/SearchHit'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactSearchBarLabels {\n search: string\n placeholder: string\n clear: string\n submit: string\n}\n\nexport const DEFAULT_FACT_SEARCH_BAR_LABELS: FactSearchBarLabels = {\n search: 'Search:',\n // An example query rather than an instruction: shows the quoted-phrase syntax.\n placeholder: 'e.g. \"board meeting\" decision on the budget',\n clear: 'Clear search',\n submit: 'Search',\n}\n\nexport interface FactSearchBarTestIds {\n input: string\n clear: string\n submit: string\n}\n\nexport interface FactSearchResultLabels {\n inChat: string\n verified: string\n open: string\n}\n\nexport const DEFAULT_FACT_SEARCH_RESULT_LABELS: FactSearchResultLabels = {\n inChat: 'In this chat',\n verified: 'Verified',\n open: 'Open',\n}\n\nexport interface FactSearchResultTestIds {\n hit: (id: string) => string\n labels: (id: string) => string\n verified: (id: string) => string\n}\n\nexport interface FactSearchBarProps {\n query: string\n onQueryChange: (query: string) => void\n onSubmit: () => void\n onClear: () => void\n isSearching: boolean\n /** Wins over `labels.placeholder`. */\n placeholder?: string\n labels?: Partial<FactSearchBarLabels>\n testIds?: Partial<FactSearchBarTestIds>\n}\n\n/**\n * The facts Smart Search bar: the same bordered, auto-growing box as the Files Smart Search.\n * Enter searches; Shift+Enter breaks a line.\n */\nexport function FactSearchBar({\n query,\n onQueryChange,\n onSubmit,\n onClear,\n isSearching,\n placeholder,\n labels,\n testIds,\n}: FactSearchBarProps) {\n const l = { ...DEFAULT_FACT_SEARCH_BAR_LABELS, ...labels }\n return (\n <div className=\"border-t border-border px-6 pb-4 pt-6\" data-slot=\"fact-search-bar\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"mx-auto flex w-full max-w-2xl items-center gap-3\"\n >\n <label\n htmlFor=\"facts-smart-search-input\"\n className=\"shrink-0 text-base font-medium text-foreground\"\n >\n {l.search}\n </label>\n <div className=\"flex min-w-0 flex-1 items-start gap-2 rounded-lg border border-border bg-background px-3.5 py-2.5 transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n id=\"facts-smart-search-input\"\n rows={1}\n value={query}\n onChange={(e) => {\n onQueryChange(e.target.value)\n e.target.style.height = 'auto'\n e.target.style.height = `${e.target.scrollHeight}px`\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSubmit()\n }\n }}\n placeholder={placeholder ?? l.placeholder}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.input, { testId: 'facts-smart-search-input' })}\n autoFocus\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {query && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n onClick={onClear}\n aria-label={l.clear}\n title={l.clear}\n data-testid={testIdOr(testIds?.clear, { testId: 'facts-smart-search-clear' })}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!query.trim() || isSearching}\n className=\"size-7 pointer-coarse:size-11\"\n data-testid={testIdOr(testIds?.submit, { testId: 'facts-smart-search-submit' })}\n title={l.submit}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </form>\n </div>\n )\n}\n\n/** Totals headline pinned between the search bar and the scrolling results. */\nexport function FactSearchTotals({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <div className=\"px-4 pb-3\">\n <p\n className=\"font-sans text-base font-semibold tabular-nums text-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-totals' })}\n >\n {children}\n </p>\n </div>\n )\n}\n\n/** \"Searching facts…\" line. */\nexport function FactSearchPending({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex items-center justify-center gap-2 py-16 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {children}\n </div>\n )\n}\n\n/** No-matches message. */\nexport function FactSearchNoMatches({\n children,\n testId,\n}: {\n children: ReactNode\n testId?: string\n}) {\n return (\n <div\n className=\"py-16 text-center text-sm text-muted-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-empty' })}\n >\n {children}\n </div>\n )\n}\n\nexport interface FactSearchResultLabel {\n id: string\n name: string\n color: string\n}\n\nexport interface FactSearchResultProps {\n /** Fact id: keys the test ids. */\n id: string\n /** 1-based rank, shown outside the card (it numbers the results, it is not part of the hit). */\n rank: number\n text: string\n terms: string[]\n renderSnippet: (content: string, terms: string[]) => ReactNode\n labels: FactSearchResultLabel[]\n /** The fact is in the host's current chat. */\n isInChat?: boolean\n isVerified?: boolean\n /** The fact open in the composer. */\n isSelected?: boolean\n onOpen: () => void\n uiLabels?: Partial<FactSearchResultLabels>\n testIds?: Partial<FactSearchResultTestIds>\n /** Destination of the fact; the card stays a click target (see SearchHit `href`). */\n href?: string\n}\n\n/** One facts search result: rank, highlighted text, labels (and In this chat) and the Verified mark. */\nexport function FactSearchResult({\n id,\n rank,\n text,\n terms,\n renderSnippet,\n labels,\n isInChat,\n isVerified,\n isSelected,\n onOpen,\n uiLabels: labelOverrides,\n testIds,\n href,\n}: FactSearchResultProps) {\n const l = { ...DEFAULT_FACT_SEARCH_RESULT_LABELS, ...labelOverrides }\n return (\n <div className=\"flex items-start gap-2\" data-slot=\"fact-search-hit\">\n <span\n className=\"w-5 shrink-0 pt-3 text-right text-xs tabular-nums text-muted-foreground\"\n aria-hidden=\"true\"\n >\n {rank}\n </span>\n <SearchHit\n className=\"min-w-0 flex-1\"\n testId={testIdOr(testIds?.hit?.(id), { testId: `facts-smart-search-hit-${id}` })}\n href={href}\n selected={isSelected}\n onClick={onOpen}\n content={text}\n terms={terms}\n renderSnippet={renderSnippet}\n header={\n <div\n className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1 text-xs text-muted-foreground\"\n data-testid={testIdOr(testIds?.labels?.(id), {\n testId: `facts-smart-search-hit-labels-${id}`,\n })}\n >\n {isInChat && (\n <span\n className=\"inline-flex items-center gap-1 pr-1\"\n data-testid={`facts-smart-search-hit-in-chat-${id}`}\n >\n <Paperclip className=\"size-3\" /> {l.inChat}\n </span>\n )}\n {labels.map((tag) => (\n <span\n key={tag.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium text-foreground\"\n title={tag.name}\n style={{ borderColor: tag.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: tag.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[120px] truncate\">{tag.name}</span>\n </span>\n ))}\n </div>\n }\n headerRight={\n <span className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {isVerified && (\n <span\n className=\"inline-flex shrink-0 items-center gap-1 text-green-text\"\n data-testid={testIdOr(testIds?.verified?.(id), {\n testId: `facts-smart-search-hit-verified-${id}`,\n })}\n >\n <CheckCircle2 className=\"size-3\" /> {l.verified}\n </span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n {l.open} <CornerDownLeft className=\"size-3\" />\n </span>\n </span>\n }\n />\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/facts/FactsTable.tsx","../../src/facts/fact-row.ts","../../src/facts/FactSearchParts.tsx"],"names":["jsx","cn","DEFAULT_FACT_COLUMN_LABELS","useMemo","createFactColumns","FactRowActions","GridView","jsxs","testIdOr","Button","X","Loader2","Search","SearchHit","Paperclip","Check","CheckCircle2","CornerDownLeft"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * FactsTable: the default facts grid. `createFactColumns` wired to `GridView` with ready-made\n * cells (in-chat, verified and shared switches, label chips, creator initials, row menu), so a host\n * only supplies rows and handlers. Hosts that need custom cells call `createFactColumns` with\n * their own slots and render `GridView` themselves.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { cn } from '@arbidocs/react/ui'\nimport { GridView, type GridViewProps } from '../files/GridView'\nimport { initials } from '../lib/format'\nimport { FactRowActions } from './FactRowActions'\nimport {\n DEFAULT_FACT_COLUMN_LABELS,\n createFactColumns,\n type FactColumnLabels,\n type FactRowView,\n} from './factColumns'\n\nexport interface FactsTableProps<T extends FactRowView> {\n facts: T[]\n /** With `onToggleInChat`, shows the In chat column (whether a fact is in the host's chat). */\n isInChat?: (fact: T) => boolean\n onToggleInChat?: (fact: T) => void\n onToggleConfirmed: (fact: T) => void\n onToggleShared: (fact: T) => void\n /** The row menu appears when both `onEdit` and `onDelete` are provided. */\n onEdit?: (fact: T) => void\n onDelete?: (fact: T) => void\n /** Row click (opens the fact). */\n onOpen?: (fact: T) => void\n /** Display name of the fact's creator (sorting, filtering and the initials chip). */\n getCreatorName?: (fact: T) => string\n /** Friendly display of an ISO timestamp. Defaults to the locale date. */\n formatDate?: (iso: string) => string\n columnLabels?: Partial<FactColumnLabels>\n isLoading?: boolean\n /** Saved column state key (AG Grid persists by it). */\n gridId?: string\n height?: GridViewProps<T>['height']\n rowHeight?: number\n /** Escape hatch for any other `GridView` prop. */\n gridProps?: Partial<Omit<GridViewProps<T>, 'items' | 'columnDefs' | 'getItemId'>>\n testId?: string\n}\n\ninterface FactSwitchProps {\n checked: boolean\n label: string\n onToggle: () => void\n testId: string\n}\n\nfunction FactSwitch({ checked, label, onToggle, testId }: FactSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n onClick={onToggle}\n data-testid={testId}\n className={cn(\n 'inline-flex h-5 w-9 items-center rounded-full p-0.5 transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n checked ? 'bg-green-solid' : 'bg-muted-foreground/30'\n )}\n >\n <span\n className={cn(\n 'size-4 rounded-full bg-background transition-transform',\n checked && 'translate-x-4'\n )}\n />\n </button>\n )\n}\n\nconst defaultFormatDate = (iso: string): string => {\n const d = new Date(iso)\n return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString()\n}\n\nconst EMPTY_STATE = { title: 'No facts yet' }\n\n/** The default facts table: columns, cells and the grid in one component. */\nexport function FactsTable<T extends FactRowView>({\n facts,\n isInChat,\n onToggleInChat,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n onOpen,\n getCreatorName,\n formatDate = defaultFormatDate,\n columnLabels,\n isLoading,\n gridId = 'facts-table-v1',\n height = '100%',\n rowHeight = 52,\n gridProps,\n testId = 'facts-table',\n}: FactsTableProps<T>) {\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...columnLabels }\n\n const columnDefs = useMemo<ColDef<T>[]>(\n () =>\n createFactColumns<T>({\n isInChat,\n onToggleInChat,\n renderHeader: (params) => (\n <span className=\"text-[12.5px] font-medium\">{params.displayName}</span>\n ),\n renderRowActions: (fact) =>\n onEdit && onDelete ? (\n <FactRowActions onEdit={() => onEdit(fact)} onDelete={() => onDelete(fact)} />\n ) : null,\n renderLabels: (fact): ReactNode => (\n <span className=\"flex flex-wrap items-center gap-1\">\n {(fact.tags ?? []).map((tag) => (\n <span\n key={tag.name}\n className=\"rounded-full bg-muted px-2 py-px text-xs text-muted-foreground\"\n >\n {tag.name}\n </span>\n ))}\n </span>\n ),\n renderVerified: (fact) => (\n <FactSwitch\n checked={fact.confirmed}\n label={l.verified}\n onToggle={() => onToggleConfirmed(fact)}\n testId={`facts-grid-confirmed-${fact.external_id}`}\n />\n ),\n renderShared: (fact) => (\n <FactSwitch\n checked={fact.shared}\n label={l.shared}\n onToggle={() => onToggleShared(fact)}\n testId={`facts-grid-shared-${fact.external_id}`}\n />\n ),\n renderCreator: (fact, _params: ICellRendererParams<T>) => {\n const name = getCreatorName?.(fact) ?? ''\n return name ? (\n <span\n title={name}\n className=\"inline-flex size-6 items-center justify-center rounded-full bg-muted text-[10px] font-medium text-muted-foreground\"\n >\n {initials(name)}\n </span>\n ) : null\n },\n getCreatorName: (params) => (params.data ? (getCreatorName?.(params.data) ?? '') : ''),\n formatDate,\n labels: columnLabels,\n }),\n [\n isInChat,\n onToggleInChat,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n getCreatorName,\n formatDate,\n columnLabels,\n l.verified,\n l.shared,\n ]\n )\n\n return (\n <GridView<T>\n testId={testId}\n items={facts}\n columnDefs={columnDefs}\n getItemId={(fact) => fact.external_id}\n onRowClick={onOpen}\n isLoading={isLoading}\n emptyState={EMPTY_STATE}\n gridId={gridId}\n height={height}\n rowHeight={rowHeight}\n {...gridProps}\n gridOptions={{ suppressClickEdit: true, ...gridProps?.gridOptions }}\n />\n )\n}\n","import type { FactRowView } from './factColumns'\n\n/**\n * A fact as a host with plain records usually holds it: camelCase, optional flags, tags as\n * strings. `toFactRow` maps it to the `FactRowView` that `FactsTable` and `createFactColumns`\n * read, so a host without the SDK type needs no adapter of its own.\n */\nexport interface PlainFactRecord {\n id: string\n text: string\n confirmed?: boolean\n shared?: boolean\n /** ISO date (or date-time) the fact starts. */\n dateStart?: string | null\n dateEnd?: string | null\n timezone?: string | null\n tags?: Array<string | { name: string }> | null\n /** Passages that support the fact; only their count is shown. */\n citations?: unknown[] | null\n createdBy?: string | null\n createdAt?: string | null\n updatedAt?: string | null\n}\n\n/** The row plus the record it came from, so callbacks can hand the host its own object back. */\nexport type PlainFactRow<T extends PlainFactRecord> = FactRowView & { record: T }\n\n/** Map one plain record to a grid row. Missing flags are `false`, missing lists are empty. */\nexport function toFactRow<T extends PlainFactRecord>(record: T): PlainFactRow<T> {\n return {\n external_id: record.id,\n text: record.text,\n confirmed: record.confirmed ?? false,\n shared: record.shared ?? false,\n date_start: record.dateStart ?? null,\n date_end: record.dateEnd ?? null,\n timezone: record.timezone ?? null,\n tags: (record.tags ?? []).map((t) => (typeof t === 'string' ? { name: t } : t)),\n citations: record.citations ?? [],\n created_by_ext_id: record.createdBy ?? null,\n created_at: record.createdAt ?? null,\n updated_at: record.updatedAt ?? null,\n record,\n }\n}\n\nexport function toFactRows<T extends PlainFactRecord>(records: T[]): PlainFactRow<T>[] {\n return records.map(toFactRow)\n}\n","import type { ReactNode } from 'react'\nimport { Check, CheckCircle2, CornerDownLeft, Loader2, Paperclip, Search, X } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { SearchHit } from '../retrieval/SearchHit'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactSearchBarLabels {\n search: string\n placeholder: string\n clear: string\n submit: string\n}\n\nexport const DEFAULT_FACT_SEARCH_BAR_LABELS: FactSearchBarLabels = {\n search: 'Search:',\n // An example query rather than an instruction: shows the quoted-phrase syntax.\n placeholder: 'e.g. \"board meeting\" decision on the budget',\n clear: 'Clear search',\n submit: 'Search',\n}\n\nexport interface FactSearchBarTestIds {\n input: string\n clear: string\n submit: string\n}\n\nexport interface FactSearchResultLabels {\n inChat: string\n verified: string\n open: string\n}\n\nexport const DEFAULT_FACT_SEARCH_RESULT_LABELS: FactSearchResultLabels = {\n inChat: 'In this chat',\n verified: 'Verified',\n open: 'Open',\n}\n\nexport interface FactSearchResultTestIds {\n hit: (id: string) => string\n labels: (id: string) => string\n verified: (id: string) => string\n}\n\nexport interface FactSearchBarProps {\n query: string\n onQueryChange: (query: string) => void\n onSubmit: () => void\n onClear: () => void\n isSearching: boolean\n /** Wins over `labels.placeholder`. */\n placeholder?: string\n labels?: Partial<FactSearchBarLabels>\n testIds?: Partial<FactSearchBarTestIds>\n}\n\n/**\n * The facts Smart Search bar: the same bordered, auto-growing box as the Files Smart Search.\n * Enter searches; Shift+Enter breaks a line.\n */\nexport function FactSearchBar({\n query,\n onQueryChange,\n onSubmit,\n onClear,\n isSearching,\n placeholder,\n labels,\n testIds,\n}: FactSearchBarProps) {\n const l = { ...DEFAULT_FACT_SEARCH_BAR_LABELS, ...labels }\n return (\n <div className=\"border-t border-border px-6 pb-4 pt-6\" data-slot=\"fact-search-bar\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"mx-auto flex w-full max-w-2xl items-center gap-3\"\n >\n <label\n htmlFor=\"facts-smart-search-input\"\n className=\"shrink-0 text-base font-medium text-foreground\"\n >\n {l.search}\n </label>\n <div className=\"flex min-w-0 flex-1 items-start gap-2 rounded-lg border border-border bg-background px-3.5 py-2.5 transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n id=\"facts-smart-search-input\"\n rows={1}\n value={query}\n onChange={(e) => {\n onQueryChange(e.target.value)\n e.target.style.height = 'auto'\n e.target.style.height = `${e.target.scrollHeight}px`\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSubmit()\n }\n }}\n placeholder={placeholder ?? l.placeholder}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.input, { testId: 'facts-smart-search-input' })}\n autoFocus\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {query && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n onClick={onClear}\n aria-label={l.clear}\n title={l.clear}\n data-testid={testIdOr(testIds?.clear, { testId: 'facts-smart-search-clear' })}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!query.trim() || isSearching}\n className=\"size-7 pointer-coarse:size-11\"\n data-testid={testIdOr(testIds?.submit, { testId: 'facts-smart-search-submit' })}\n title={l.submit}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </form>\n </div>\n )\n}\n\n/** Totals headline pinned between the search bar and the scrolling results. */\nexport function FactSearchTotals({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <div className=\"px-4 pb-3\">\n <p\n className=\"font-sans text-base font-semibold tabular-nums text-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-totals' })}\n >\n {children}\n </p>\n </div>\n )\n}\n\n/** \"Searching facts…\" line. */\nexport function FactSearchPending({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex items-center justify-center gap-2 py-16 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {children}\n </div>\n )\n}\n\n/** No-matches message. */\nexport function FactSearchNoMatches({\n children,\n testId,\n}: {\n children: ReactNode\n testId?: string\n}) {\n return (\n <div\n className=\"py-16 text-center text-sm text-muted-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-empty' })}\n >\n {children}\n </div>\n )\n}\n\nexport interface FactSearchResultLabel {\n id: string\n name: string\n color: string\n}\n\nexport interface FactSearchResultProps {\n /** Fact id: keys the test ids. */\n id: string\n /** 1-based rank, shown outside the card (it numbers the results, it is not part of the hit). */\n rank: number\n text: string\n terms: string[]\n renderSnippet: (content: string, terms: string[]) => ReactNode\n labels: FactSearchResultLabel[]\n /** The fact is in the host's current chat. */\n isInChat?: boolean\n isVerified?: boolean\n /** The fact open in the composer. */\n isSelected?: boolean\n onOpen: () => void\n uiLabels?: Partial<FactSearchResultLabels>\n testIds?: Partial<FactSearchResultTestIds>\n /** Destination of the fact; the card stays a click target (see SearchHit `href`). */\n href?: string\n}\n\n/** One facts search result: rank, highlighted text, labels (and In this chat) and the Verified mark. */\nexport function FactSearchResult({\n id,\n rank,\n text,\n terms,\n renderSnippet,\n labels,\n isInChat,\n isVerified,\n isSelected,\n onOpen,\n uiLabels: labelOverrides,\n testIds,\n href,\n}: FactSearchResultProps) {\n const l = { ...DEFAULT_FACT_SEARCH_RESULT_LABELS, ...labelOverrides }\n return (\n <div className=\"flex items-start gap-2\" data-slot=\"fact-search-hit\">\n <span\n className=\"w-5 shrink-0 pt-3 text-right text-xs tabular-nums text-muted-foreground\"\n aria-hidden=\"true\"\n >\n {rank}\n </span>\n <SearchHit\n className=\"min-w-0 flex-1\"\n testId={testIdOr(testIds?.hit?.(id), { testId: `facts-smart-search-hit-${id}` })}\n href={href}\n selected={isSelected}\n onClick={onOpen}\n content={text}\n terms={terms}\n renderSnippet={renderSnippet}\n header={\n <div\n className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1 text-xs text-muted-foreground\"\n data-testid={testIdOr(testIds?.labels?.(id), {\n testId: `facts-smart-search-hit-labels-${id}`,\n })}\n >\n {isInChat && (\n <span\n className=\"inline-flex items-center gap-1 pr-1\"\n data-testid={`facts-smart-search-hit-in-chat-${id}`}\n >\n <Paperclip className=\"size-3\" /> {l.inChat}\n </span>\n )}\n {labels.map((tag) => (\n <span\n key={tag.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium text-foreground\"\n title={tag.name}\n style={{ borderColor: tag.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: tag.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[120px] truncate\">{tag.name}</span>\n </span>\n ))}\n </div>\n }\n headerRight={\n <span className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {isVerified && (\n <span\n className=\"inline-flex shrink-0 items-center gap-1 text-green-text\"\n data-testid={testIdOr(testIds?.verified?.(id), {\n testId: `facts-smart-search-hit-verified-${id}`,\n })}\n >\n <CheckCircle2 className=\"size-3\" /> {l.verified}\n </span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n {l.open} <CornerDownLeft className=\"size-3\" />\n </span>\n </span>\n }\n />\n </div>\n )\n}\n"]}
@@ -3,7 +3,7 @@ import { DEFAULT_FACT_COLUMN_LABELS, createFactColumns, FactRowActions } from '.
3
3
  export { DEFAULT_FACTS_BULK_BAR_LABELS, DEFAULT_FACTS_EMPTY_STATE_LABELS, DEFAULT_FACTS_FIELDS_BUTTON_LABELS, DEFAULT_FACTS_TOOLBAR_LABELS, DEFAULT_FACTS_VIEW_TOGGLE_LABELS, DEFAULT_FACT_COLUMN_LABELS, DEFAULT_FACT_COLUMN_ORDER, DEFAULT_FACT_COMPOSER_LABELS, DEFAULT_FACT_DATE_INPUT_LABELS, DEFAULT_FACT_LABELS_CELL_LABELS, DEFAULT_FACT_ROW_ACTIONS_LABELS, DEFAULT_FACT_SOURCES_ROW_LABELS, DEFAULT_FACT_SOURCE_GROUP_LABELS, DEFAULT_FACT_TIMELINE_LABELS, EMPTY_FACT_DATE_FIELDS, FactComposer, FactDateInput, FactFieldRow, FactLabelsCell, FactRowActions, FactSourceGroup, FactSourcesRow, FactsBulkBar, FactsCalendar, FactsEmptyState, FactsFieldsButton, FactsGanttPane, FactsLoadError, FactsLoading, FactsToolbar, FactsViewToggle, ISO_DATE_FILTER_PARAMS, buildFactCitations, chronologyFactBodies, chunkIdsOf, citedVersionRef, createFactColumns, docIdsOf, enableFactTableColumnResize, factDateFieldsToSpan, factDateSpanToFields, hasChunk, isWholeDoc, parseChronologyDate, sourceDocCount, toFactCitations, withChunk, withDoc, withoutChunk, withoutDoc } from '../chunk-75Z5AUMM.js';
4
4
  import '../chunk-JJA6GQKH.js';
5
5
  export { DEFAULT_FACT_PASSAGES_LABELS, FactPassageItem, FactSourcesPanel, renderPreviewInline, toPreviewLine } from '../chunk-HFZ45FD3.js';
6
- import { SearchHit } from '../chunk-4IMTH6Z4.js';
6
+ import { SearchHit } from '../chunk-5RHNGSVP.js';
7
7
  import '../chunk-4EZVCGRL.js';
8
8
  export { decodeWhitespaceEntities } from '../chunk-AF6RDAJF.js';
9
9
  import '../chunk-NUNKSZKU.js';
@@ -11,7 +11,8 @@ export { DEFAULT_FILTER_INPUT_LABELS as DEFAULT_FACTS_FILTER_INPUT_LABELS, DEFAU
11
11
  import { GridView } from '../chunk-N5YEF3LC.js';
12
12
  import '../chunk-OJIX5NBN.js';
13
13
  import '../chunk-ABEKUV6L.js';
14
- import '../chunk-5TALCIRH.js';
14
+ import '../chunk-CH4FHZSR.js';
15
+ import '../chunk-U4HWVCRN.js';
15
16
  import '../chunk-TX2ZICS7.js';
16
17
  import '../chunk-SLSBJRWW.js';
17
18
  import '../chunk-NPLYHR2E.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/facts/FactsTable.tsx","../../src/facts/fact-row.ts","../../src/facts/FactSearchParts.tsx"],"names":["jsx"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * FactsTable: the default facts grid. `createFactColumns` wired to `GridView` with ready-made\n * cells (in-chat, verified and shared switches, label chips, creator initials, row menu), so a host\n * only supplies rows and handlers. Hosts that need custom cells call `createFactColumns` with\n * their own slots and render `GridView` themselves.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { cn } from '@arbidocs/react/ui'\nimport { GridView, type GridViewProps } from '../files/GridView'\nimport { initials } from '../lib/format'\nimport { FactRowActions } from './FactRowActions'\nimport {\n DEFAULT_FACT_COLUMN_LABELS,\n createFactColumns,\n type FactColumnLabels,\n type FactRowView,\n} from './factColumns'\n\nexport interface FactsTableProps<T extends FactRowView> {\n facts: T[]\n /** With `onToggleInChat`, shows the In chat column (whether a fact is in the host's chat). */\n isInChat?: (fact: T) => boolean\n onToggleInChat?: (fact: T) => void\n onToggleConfirmed: (fact: T) => void\n onToggleShared: (fact: T) => void\n /** The row menu appears when both `onEdit` and `onDelete` are provided. */\n onEdit?: (fact: T) => void\n onDelete?: (fact: T) => void\n /** Row click (opens the fact). */\n onOpen?: (fact: T) => void\n /** Display name of the fact's creator (sorting, filtering and the initials chip). */\n getCreatorName?: (fact: T) => string\n /** Friendly display of an ISO timestamp. Defaults to the locale date. */\n formatDate?: (iso: string) => string\n columnLabels?: Partial<FactColumnLabels>\n isLoading?: boolean\n /** Saved column state key (AG Grid persists by it). */\n gridId?: string\n height?: GridViewProps<T>['height']\n rowHeight?: number\n /** Escape hatch for any other `GridView` prop. */\n gridProps?: Partial<Omit<GridViewProps<T>, 'items' | 'columnDefs' | 'getItemId'>>\n testId?: string\n}\n\ninterface FactSwitchProps {\n checked: boolean\n label: string\n onToggle: () => void\n testId: string\n}\n\nfunction FactSwitch({ checked, label, onToggle, testId }: FactSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n onClick={onToggle}\n data-testid={testId}\n className={cn(\n 'inline-flex h-5 w-9 items-center rounded-full p-0.5 transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n checked ? 'bg-green-solid' : 'bg-muted-foreground/30'\n )}\n >\n <span\n className={cn(\n 'size-4 rounded-full bg-background transition-transform',\n checked && 'translate-x-4'\n )}\n />\n </button>\n )\n}\n\nconst defaultFormatDate = (iso: string): string => {\n const d = new Date(iso)\n return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString()\n}\n\nconst EMPTY_STATE = { title: 'No facts yet' }\n\n/** The default facts table: columns, cells and the grid in one component. */\nexport function FactsTable<T extends FactRowView>({\n facts,\n isInChat,\n onToggleInChat,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n onOpen,\n getCreatorName,\n formatDate = defaultFormatDate,\n columnLabels,\n isLoading,\n gridId = 'facts-table-v1',\n height = '100%',\n rowHeight = 52,\n gridProps,\n testId = 'facts-table',\n}: FactsTableProps<T>) {\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...columnLabels }\n\n const columnDefs = useMemo<ColDef<T>[]>(\n () =>\n createFactColumns<T>({\n isInChat,\n onToggleInChat,\n renderHeader: (params) => (\n <span className=\"text-[12.5px] font-medium\">{params.displayName}</span>\n ),\n renderRowActions: (fact) =>\n onEdit && onDelete ? (\n <FactRowActions onEdit={() => onEdit(fact)} onDelete={() => onDelete(fact)} />\n ) : null,\n renderLabels: (fact): ReactNode => (\n <span className=\"flex flex-wrap items-center gap-1\">\n {(fact.tags ?? []).map((tag) => (\n <span\n key={tag.name}\n className=\"rounded-full bg-muted px-2 py-px text-xs text-muted-foreground\"\n >\n {tag.name}\n </span>\n ))}\n </span>\n ),\n renderVerified: (fact) => (\n <FactSwitch\n checked={fact.confirmed}\n label={l.verified}\n onToggle={() => onToggleConfirmed(fact)}\n testId={`facts-grid-confirmed-${fact.external_id}`}\n />\n ),\n renderShared: (fact) => (\n <FactSwitch\n checked={fact.shared}\n label={l.shared}\n onToggle={() => onToggleShared(fact)}\n testId={`facts-grid-shared-${fact.external_id}`}\n />\n ),\n renderCreator: (fact, _params: ICellRendererParams<T>) => {\n const name = getCreatorName?.(fact) ?? ''\n return name ? (\n <span\n title={name}\n className=\"inline-flex size-6 items-center justify-center rounded-full bg-muted text-[10px] font-medium text-muted-foreground\"\n >\n {initials(name)}\n </span>\n ) : null\n },\n getCreatorName: (params) => (params.data ? (getCreatorName?.(params.data) ?? '') : ''),\n formatDate,\n labels: columnLabels,\n }),\n [\n isInChat,\n onToggleInChat,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n getCreatorName,\n formatDate,\n columnLabels,\n l.verified,\n l.shared,\n ]\n )\n\n return (\n <GridView<T>\n testId={testId}\n items={facts}\n columnDefs={columnDefs}\n getItemId={(fact) => fact.external_id}\n onRowClick={onOpen}\n isLoading={isLoading}\n emptyState={EMPTY_STATE}\n gridId={gridId}\n height={height}\n rowHeight={rowHeight}\n {...gridProps}\n gridOptions={{ suppressClickEdit: true, ...gridProps?.gridOptions }}\n />\n )\n}\n","import type { FactRowView } from './factColumns'\n\n/**\n * A fact as a host with plain records usually holds it: camelCase, optional flags, tags as\n * strings. `toFactRow` maps it to the `FactRowView` that `FactsTable` and `createFactColumns`\n * read, so a host without the SDK type needs no adapter of its own.\n */\nexport interface PlainFactRecord {\n id: string\n text: string\n confirmed?: boolean\n shared?: boolean\n /** ISO date (or date-time) the fact starts. */\n dateStart?: string | null\n dateEnd?: string | null\n timezone?: string | null\n tags?: Array<string | { name: string }> | null\n /** Passages that support the fact; only their count is shown. */\n citations?: unknown[] | null\n createdBy?: string | null\n createdAt?: string | null\n updatedAt?: string | null\n}\n\n/** The row plus the record it came from, so callbacks can hand the host its own object back. */\nexport type PlainFactRow<T extends PlainFactRecord> = FactRowView & { record: T }\n\n/** Map one plain record to a grid row. Missing flags are `false`, missing lists are empty. */\nexport function toFactRow<T extends PlainFactRecord>(record: T): PlainFactRow<T> {\n return {\n external_id: record.id,\n text: record.text,\n confirmed: record.confirmed ?? false,\n shared: record.shared ?? false,\n date_start: record.dateStart ?? null,\n date_end: record.dateEnd ?? null,\n timezone: record.timezone ?? null,\n tags: (record.tags ?? []).map((t) => (typeof t === 'string' ? { name: t } : t)),\n citations: record.citations ?? [],\n created_by_ext_id: record.createdBy ?? null,\n created_at: record.createdAt ?? null,\n updated_at: record.updatedAt ?? null,\n record,\n }\n}\n\nexport function toFactRows<T extends PlainFactRecord>(records: T[]): PlainFactRow<T>[] {\n return records.map(toFactRow)\n}\n","import type { ReactNode } from 'react'\nimport { Check, CheckCircle2, CornerDownLeft, Loader2, Paperclip, Search, X } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { SearchHit } from '../retrieval/SearchHit'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactSearchBarLabels {\n search: string\n placeholder: string\n clear: string\n submit: string\n}\n\nexport const DEFAULT_FACT_SEARCH_BAR_LABELS: FactSearchBarLabels = {\n search: 'Search:',\n // An example query rather than an instruction: shows the quoted-phrase syntax.\n placeholder: 'e.g. \"board meeting\" decision on the budget',\n clear: 'Clear search',\n submit: 'Search',\n}\n\nexport interface FactSearchBarTestIds {\n input: string\n clear: string\n submit: string\n}\n\nexport interface FactSearchResultLabels {\n inChat: string\n verified: string\n open: string\n}\n\nexport const DEFAULT_FACT_SEARCH_RESULT_LABELS: FactSearchResultLabels = {\n inChat: 'In this chat',\n verified: 'Verified',\n open: 'Open',\n}\n\nexport interface FactSearchResultTestIds {\n hit: (id: string) => string\n labels: (id: string) => string\n verified: (id: string) => string\n}\n\nexport interface FactSearchBarProps {\n query: string\n onQueryChange: (query: string) => void\n onSubmit: () => void\n onClear: () => void\n isSearching: boolean\n /** Wins over `labels.placeholder`. */\n placeholder?: string\n labels?: Partial<FactSearchBarLabels>\n testIds?: Partial<FactSearchBarTestIds>\n}\n\n/**\n * The facts Smart Search bar: the same bordered, auto-growing box as the Files Smart Search.\n * Enter searches; Shift+Enter breaks a line.\n */\nexport function FactSearchBar({\n query,\n onQueryChange,\n onSubmit,\n onClear,\n isSearching,\n placeholder,\n labels,\n testIds,\n}: FactSearchBarProps) {\n const l = { ...DEFAULT_FACT_SEARCH_BAR_LABELS, ...labels }\n return (\n <div className=\"border-t border-border px-6 pb-4 pt-6\" data-slot=\"fact-search-bar\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"mx-auto flex w-full max-w-2xl items-center gap-3\"\n >\n <label\n htmlFor=\"facts-smart-search-input\"\n className=\"shrink-0 text-base font-medium text-foreground\"\n >\n {l.search}\n </label>\n <div className=\"flex min-w-0 flex-1 items-start gap-2 rounded-lg border border-border bg-background px-3.5 py-2.5 transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n id=\"facts-smart-search-input\"\n rows={1}\n value={query}\n onChange={(e) => {\n onQueryChange(e.target.value)\n e.target.style.height = 'auto'\n e.target.style.height = `${e.target.scrollHeight}px`\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSubmit()\n }\n }}\n placeholder={placeholder ?? l.placeholder}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.input, { testId: 'facts-smart-search-input' })}\n autoFocus\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {query && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n onClick={onClear}\n aria-label={l.clear}\n title={l.clear}\n data-testid={testIdOr(testIds?.clear, { testId: 'facts-smart-search-clear' })}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!query.trim() || isSearching}\n className=\"size-7 pointer-coarse:size-11\"\n data-testid={testIdOr(testIds?.submit, { testId: 'facts-smart-search-submit' })}\n title={l.submit}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </form>\n </div>\n )\n}\n\n/** Totals headline pinned between the search bar and the scrolling results. */\nexport function FactSearchTotals({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <div className=\"px-4 pb-3\">\n <p\n className=\"font-sans text-base font-semibold tabular-nums text-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-totals' })}\n >\n {children}\n </p>\n </div>\n )\n}\n\n/** \"Searching facts…\" line. */\nexport function FactSearchPending({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex items-center justify-center gap-2 py-16 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {children}\n </div>\n )\n}\n\n/** No-matches message. */\nexport function FactSearchNoMatches({\n children,\n testId,\n}: {\n children: ReactNode\n testId?: string\n}) {\n return (\n <div\n className=\"py-16 text-center text-sm text-muted-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-empty' })}\n >\n {children}\n </div>\n )\n}\n\nexport interface FactSearchResultLabel {\n id: string\n name: string\n color: string\n}\n\nexport interface FactSearchResultProps {\n /** Fact id: keys the test ids. */\n id: string\n /** 1-based rank, shown outside the card (it numbers the results, it is not part of the hit). */\n rank: number\n text: string\n terms: string[]\n renderSnippet: (content: string, terms: string[]) => ReactNode\n labels: FactSearchResultLabel[]\n /** The fact is in the host's current chat. */\n isInChat?: boolean\n isVerified?: boolean\n /** The fact open in the composer. */\n isSelected?: boolean\n onOpen: () => void\n uiLabels?: Partial<FactSearchResultLabels>\n testIds?: Partial<FactSearchResultTestIds>\n /** Destination of the fact; the card stays a click target (see SearchHit `href`). */\n href?: string\n}\n\n/** One facts search result: rank, highlighted text, labels (and In this chat) and the Verified mark. */\nexport function FactSearchResult({\n id,\n rank,\n text,\n terms,\n renderSnippet,\n labels,\n isInChat,\n isVerified,\n isSelected,\n onOpen,\n uiLabels: labelOverrides,\n testIds,\n href,\n}: FactSearchResultProps) {\n const l = { ...DEFAULT_FACT_SEARCH_RESULT_LABELS, ...labelOverrides }\n return (\n <div className=\"flex items-start gap-2\" data-slot=\"fact-search-hit\">\n <span\n className=\"w-5 shrink-0 pt-3 text-right text-xs tabular-nums text-muted-foreground\"\n aria-hidden=\"true\"\n >\n {rank}\n </span>\n <SearchHit\n className=\"min-w-0 flex-1\"\n testId={testIdOr(testIds?.hit?.(id), { testId: `facts-smart-search-hit-${id}` })}\n href={href}\n selected={isSelected}\n onClick={onOpen}\n content={text}\n terms={terms}\n renderSnippet={renderSnippet}\n header={\n <div\n className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1 text-xs text-muted-foreground\"\n data-testid={testIdOr(testIds?.labels?.(id), {\n testId: `facts-smart-search-hit-labels-${id}`,\n })}\n >\n {isInChat && (\n <span\n className=\"inline-flex items-center gap-1 pr-1\"\n data-testid={`facts-smart-search-hit-in-chat-${id}`}\n >\n <Paperclip className=\"size-3\" /> {l.inChat}\n </span>\n )}\n {labels.map((tag) => (\n <span\n key={tag.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium text-foreground\"\n title={tag.name}\n style={{ borderColor: tag.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: tag.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[120px] truncate\">{tag.name}</span>\n </span>\n ))}\n </div>\n }\n headerRight={\n <span className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {isVerified && (\n <span\n className=\"inline-flex shrink-0 items-center gap-1 text-green-text\"\n data-testid={testIdOr(testIds?.verified?.(id), {\n testId: `facts-smart-search-hit-verified-${id}`,\n })}\n >\n <CheckCircle2 className=\"size-3\" /> {l.verified}\n </span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n {l.open} <CornerDownLeft className=\"size-3\" />\n </span>\n </span>\n }\n />\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/facts/FactsTable.tsx","../../src/facts/fact-row.ts","../../src/facts/FactSearchParts.tsx"],"names":["jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA,SAAS,WAAW,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,QAAO,EAAoB;AACzE,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,QAAA;AAAA,MACL,cAAA,EAAc,OAAA;AAAA,MACd,YAAA,EAAY,KAAA;AAAA,MACZ,OAAA,EAAS,QAAA;AAAA,MACT,aAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACT,uEAAA;AAAA,QACA,yEAAA;AAAA,QACA,UAAU,gBAAA,GAAmB;AAAA,OAC/B;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA;AAAA,YACT,wDAAA;AAAA,YACA,OAAA,IAAW;AAAA;AACb;AAAA;AACF;AAAA,GACF;AAEJ;AAEA,IAAM,iBAAA,GAAoB,CAAC,GAAA,KAAwB;AACjD,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,GAAG,CAAA;AACtB,EAAA,OAAO,MAAA,CAAO,MAAM,CAAA,CAAE,OAAA,EAAS,CAAA,GAAI,GAAA,GAAM,EAAE,kBAAA,EAAmB;AAChE,CAAA;AAEA,IAAM,WAAA,GAAc,EAAE,KAAA,EAAO,cAAA,EAAe;AAGrC,SAAS,UAAA,CAAkC;AAAA,EAChD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA,GAAa,iBAAA;AAAA,EACb,YAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS,gBAAA;AAAA,EACT,MAAA,GAAS,MAAA;AAAA,EACT,SAAA,GAAY,EAAA;AAAA,EACZ,SAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,0BAAA,EAA4B,GAAG,YAAA,EAAa;AAE3D,EAAA,MAAM,UAAA,GAAa,OAAA;AAAA,IACjB,MACE,iBAAA,CAAqB;AAAA,MACnB,QAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA,EAAc,CAAC,MAAA,qBACb,GAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA6B,iBAAO,WAAA,EAAY,CAAA;AAAA,MAElE,kBAAkB,CAAC,IAAA,KACjB,MAAA,IAAU,QAAA,uBACP,cAAA,EAAA,EAAe,MAAA,EAAQ,MAAM,MAAA,CAAO,IAAI,CAAA,EAAG,QAAA,EAAU,MAAM,QAAA,CAAS,IAAI,GAAG,CAAA,GAC1E,IAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,qBACb,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EACZ,QAAA,EAAA,CAAA,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,qBACtB,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,gEAAA;AAAA,UAET,QAAA,EAAA,GAAA,CAAI;AAAA,SAAA;AAAA,QAHA,GAAA,CAAI;AAAA,OAKZ,CAAA,EACH,CAAA;AAAA,MAEF,cAAA,EAAgB,CAAC,IAAA,qBACf,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,SAAS,IAAA,CAAK,SAAA;AAAA,UACd,OAAO,CAAA,CAAE,QAAA;AAAA,UACT,QAAA,EAAU,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,UACtC,MAAA,EAAQ,CAAA,qBAAA,EAAwB,IAAA,CAAK,WAAW,CAAA;AAAA;AAAA,OAClD;AAAA,MAEF,YAAA,EAAc,CAAC,IAAA,qBACb,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,SAAS,IAAA,CAAK,MAAA;AAAA,UACd,OAAO,CAAA,CAAE,MAAA;AAAA,UACT,QAAA,EAAU,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,UACnC,MAAA,EAAQ,CAAA,kBAAA,EAAqB,IAAA,CAAK,WAAW,CAAA;AAAA;AAAA,OAC/C;AAAA,MAEF,aAAA,EAAe,CAAC,IAAA,EAAM,OAAA,KAAoC;AACxD,QAAA,MAAM,IAAA,GAAO,cAAA,GAAiB,IAAI,CAAA,IAAK,EAAA;AACvC,QAAA,OAAO,IAAA,mBACL,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,IAAA;AAAA,YACP,SAAA,EAAU,oHAAA;AAAA,YAET,mBAAS,IAAI;AAAA;AAAA,SAChB,GACE,IAAA;AAAA,MACN,CAAA;AAAA,MACA,cAAA,EAAgB,CAAC,MAAA,KAAY,MAAA,CAAO,OAAQ,cAAA,GAAiB,MAAA,CAAO,IAAI,CAAA,IAAK,EAAA,GAAM,EAAA;AAAA,MACnF,UAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,IACH;AAAA,MACE,QAAA;AAAA,MACA,cAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,CAAA,CAAE,QAAA;AAAA,MACF,CAAA,CAAE;AAAA;AACJ,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,SAAA,EAAW,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA;AAAA,MAC1B,UAAA,EAAY,MAAA;AAAA,MACZ,SAAA;AAAA,MACA,UAAA,EAAY,WAAA;AAAA,MACZ,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACC,GAAG,SAAA;AAAA,MACJ,aAAa,EAAE,iBAAA,EAAmB,IAAA,EAAM,GAAG,WAAW,WAAA;AAAY;AAAA,GACpE;AAEJ;;;ACrKO,SAAS,UAAqC,MAAA,EAA4B;AAC/E,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,CAAO,EAAA;AAAA,IACpB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAA,EAAW,OAAO,SAAA,IAAa,KAAA;AAAA,IAC/B,MAAA,EAAQ,OAAO,MAAA,IAAU,KAAA;AAAA,IACzB,UAAA,EAAY,OAAO,SAAA,IAAa,IAAA;AAAA,IAChC,QAAA,EAAU,OAAO,OAAA,IAAW,IAAA;AAAA,IAC5B,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,IAC7B,IAAA,EAAA,CAAO,MAAA,CAAO,IAAA,IAAQ,IAAI,GAAA,CAAI,CAAC,CAAA,KAAO,OAAO,MAAM,QAAA,GAAW,EAAE,IAAA,EAAM,CAAA,KAAM,CAAE,CAAA;AAAA,IAC9E,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,IAChC,iBAAA,EAAmB,OAAO,SAAA,IAAa,IAAA;AAAA,IACvC,UAAA,EAAY,OAAO,SAAA,IAAa,IAAA;AAAA,IAChC,UAAA,EAAY,OAAO,SAAA,IAAa,IAAA;AAAA,IAChC;AAAA,GACF;AACF;AAEO,SAAS,WAAsC,OAAA,EAAiC;AACrF,EAAA,OAAO,OAAA,CAAQ,IAAI,SAAS,CAAA;AAC9B;ACnCO,IAAM,8BAAA,GAAsD;AAAA,EACjE,MAAA,EAAQ,SAAA;AAAA;AAAA,EAER,WAAA,EAAa,6CAAA;AAAA,EACb,KAAA,EAAO,cAAA;AAAA,EACP,MAAA,EAAQ;AACV;AAcO,IAAM,iCAAA,GAA4D;AAAA,EACvE,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM;AACR;AAwBO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,8BAAA,EAAgC,GAAG,MAAA,EAAO;AACzD,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAAwC,aAAU,iBAAA,EAC/D,QAAA,kBAAA,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AAAA,MACA,SAAA,EAAU,kDAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,0BAAA;AAAA,YACR,SAAA,EAAU,gDAAA;AAAA,YAET,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,SACL;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yLAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,0BAAA;AAAA,cACH,IAAA,EAAM,CAAA;AAAA,cACN,KAAA,EAAO,KAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAC5B,gBAAA,CAAA,CAAE,MAAA,CAAO,MAAM,MAAA,GAAS,MAAA;AACxB,gBAAA,CAAA,CAAE,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,CAAE,OAAO,YAAY,CAAA,EAAA,CAAA;AAAA,cAClD,CAAA;AAAA,cACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,gBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,QAAA,EAAS;AAAA,gBACX;AAAA,cACF,CAAA;AAAA,cACA,WAAA,EAAa,eAAe,CAAA,CAAE,WAAA;AAAA,cAC9B,SAAA,EAAU,yJAAA;AAAA,cACV,eAAa,QAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,cAC5E,SAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,YAAA,KAAA,oBACCA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,MAAA;AAAA,gBACL,SAAA,EAAU,2EAAA;AAAA,gBACV,OAAA,EAAS,OAAA;AAAA,gBACT,cAAY,CAAA,CAAE,KAAA;AAAA,gBACd,OAAO,CAAA,CAAE,KAAA;AAAA,gBACT,eAAa,QAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,gBAE5E,QAAA,kBAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,aACxB;AAAA,4BAEFA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA,EAAK,IAAK,WAAA;AAAA,gBAC3B,SAAA,EAAU,+BAAA;AAAA,gBACV,eAAa,QAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,6BAA6B,CAAA;AAAA,gBAC9E,OAAO,CAAA,CAAE,MAAA;AAAA,gBAER,QAAA,EAAA,WAAA,mBACCA,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA,mBAEzCA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA;AAE/B,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AAGO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAU,MAAA,EAAO,EAA6C;AAC/F,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACb,QAAA,kBAAAA,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,gEAAA;AAAA,MACV,eAAa,QAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,6BAA6B,CAAA;AAAA,MAEpE;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAGO,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAS,EAA4B;AACvE,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,IAAE,GAAA;AAAA,IAAE;AAAA,GAAA,EAC/C,CAAA;AAEJ;AAGO,SAAS,mBAAA,CAAoB;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iDAAA;AAAA,MACV,eAAa,QAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,MAEnE;AAAA;AAAA,GACH;AAEJ;AA8BO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,EAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,EAAU,cAAA;AAAA,EACV,OAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,iCAAA,EAAmC,GAAG,cAAA,EAAe;AACpE,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,aAAU,iBAAA,EAChD,QAAA,EAAA;AAAA,oBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,yEAAA;AAAA,QACV,aAAA,EAAY,MAAA;AAAA,QAEX,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBACAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gBAAA;AAAA,QACV,MAAA,EAAQ,QAAA,CAAS,OAAA,EAAS,GAAA,GAAM,EAAE,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,uBAAA,EAA0B,EAAE,CAAA,CAAA,EAAI,CAAA;AAAA,QAC/E,IAAA;AAAA,QACA,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS,MAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,KAAA;AAAA,QACA,aAAA;AAAA,QACA,MAAA,kBACE,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,gFAAA;AAAA,YACV,aAAA,EAAa,QAAA,CAAS,OAAA,EAAS,MAAA,GAAS,EAAE,CAAA,EAAG;AAAA,cAC3C,MAAA,EAAQ,iCAAiC,EAAE,CAAA;AAAA,aAC5C,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,cAAA,QAAA,oBACC,IAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qCAAA;AAAA,kBACV,aAAA,EAAa,kCAAkC,EAAE,CAAA,CAAA;AAAA,kBAEjD,QAAA,EAAA;AAAA,oCAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAAE,GAAA;AAAA,oBAAE,CAAA,CAAE;AAAA;AAAA;AAAA,eACtC;AAAA,cAED,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,qBACX,IAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAU,0GAAA;AAAA,kBACV,OAAO,GAAA,CAAI,IAAA;AAAA,kBACX,KAAA,EAAO,EAAE,WAAA,EAAa,GAAA,CAAI,KAAA,EAAM;AAAA,kBAEhC,QAAA,EAAA;AAAA,oCAAAA,GAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,4DAAA;AAAA,wBACV,KAAA,EAAO,EAAE,eAAA,EAAiB,GAAA,CAAI,KAAA,EAAM;AAAA,wBAEpC,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAsB,aAAa,CAAA,EAAG;AAAA;AAAA,qBACzD;AAAA,oCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,cAAI,IAAA,EAAK;AAAA;AAAA,iBAAA;AAAA,gBAX9C,GAAA,CAAI;AAAA,eAaZ;AAAA;AAAA;AAAA,SACH;AAAA,QAEF,WAAA,kBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,UAAA,UAAA,oBACC,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,yDAAA;AAAA,cACV,aAAA,EAAa,QAAA,CAAS,OAAA,EAAS,QAAA,GAAW,EAAE,CAAA,EAAG;AAAA,gBAC7C,MAAA,EAAQ,mCAAmC,EAAE,CAAA;AAAA,eAC9C,CAAA;AAAA,cAED,QAAA,EAAA;AAAA,gCAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,gBAAE,GAAA;AAAA,gBAAE,CAAA,CAAE;AAAA;AAAA;AAAA,WACzC;AAAA,0BAEF,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,IAAA;AAAA,YAAK,GAAA;AAAA,4BAACA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,QAAA,EAAS;AAAA,WAAA,EAC9C;AAAA,SAAA,EACF;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * FactsTable: the default facts grid. `createFactColumns` wired to `GridView` with ready-made\n * cells (in-chat, verified and shared switches, label chips, creator initials, row menu), so a host\n * only supplies rows and handlers. Hosts that need custom cells call `createFactColumns` with\n * their own slots and render `GridView` themselves.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport type { ColDef, ICellRendererParams } from 'ag-grid-community'\nimport { cn } from '@arbidocs/react/ui'\nimport { GridView, type GridViewProps } from '../files/GridView'\nimport { initials } from '../lib/format'\nimport { FactRowActions } from './FactRowActions'\nimport {\n DEFAULT_FACT_COLUMN_LABELS,\n createFactColumns,\n type FactColumnLabels,\n type FactRowView,\n} from './factColumns'\n\nexport interface FactsTableProps<T extends FactRowView> {\n facts: T[]\n /** With `onToggleInChat`, shows the In chat column (whether a fact is in the host's chat). */\n isInChat?: (fact: T) => boolean\n onToggleInChat?: (fact: T) => void\n onToggleConfirmed: (fact: T) => void\n onToggleShared: (fact: T) => void\n /** The row menu appears when both `onEdit` and `onDelete` are provided. */\n onEdit?: (fact: T) => void\n onDelete?: (fact: T) => void\n /** Row click (opens the fact). */\n onOpen?: (fact: T) => void\n /** Display name of the fact's creator (sorting, filtering and the initials chip). */\n getCreatorName?: (fact: T) => string\n /** Friendly display of an ISO timestamp. Defaults to the locale date. */\n formatDate?: (iso: string) => string\n columnLabels?: Partial<FactColumnLabels>\n isLoading?: boolean\n /** Saved column state key (AG Grid persists by it). */\n gridId?: string\n height?: GridViewProps<T>['height']\n rowHeight?: number\n /** Escape hatch for any other `GridView` prop. */\n gridProps?: Partial<Omit<GridViewProps<T>, 'items' | 'columnDefs' | 'getItemId'>>\n testId?: string\n}\n\ninterface FactSwitchProps {\n checked: boolean\n label: string\n onToggle: () => void\n testId: string\n}\n\nfunction FactSwitch({ checked, label, onToggle, testId }: FactSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n onClick={onToggle}\n data-testid={testId}\n className={cn(\n 'inline-flex h-5 w-9 items-center rounded-full p-0.5 transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n checked ? 'bg-green-solid' : 'bg-muted-foreground/30'\n )}\n >\n <span\n className={cn(\n 'size-4 rounded-full bg-background transition-transform',\n checked && 'translate-x-4'\n )}\n />\n </button>\n )\n}\n\nconst defaultFormatDate = (iso: string): string => {\n const d = new Date(iso)\n return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString()\n}\n\nconst EMPTY_STATE = { title: 'No facts yet' }\n\n/** The default facts table: columns, cells and the grid in one component. */\nexport function FactsTable<T extends FactRowView>({\n facts,\n isInChat,\n onToggleInChat,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n onOpen,\n getCreatorName,\n formatDate = defaultFormatDate,\n columnLabels,\n isLoading,\n gridId = 'facts-table-v1',\n height = '100%',\n rowHeight = 52,\n gridProps,\n testId = 'facts-table',\n}: FactsTableProps<T>) {\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...columnLabels }\n\n const columnDefs = useMemo<ColDef<T>[]>(\n () =>\n createFactColumns<T>({\n isInChat,\n onToggleInChat,\n renderHeader: (params) => (\n <span className=\"text-[12.5px] font-medium\">{params.displayName}</span>\n ),\n renderRowActions: (fact) =>\n onEdit && onDelete ? (\n <FactRowActions onEdit={() => onEdit(fact)} onDelete={() => onDelete(fact)} />\n ) : null,\n renderLabels: (fact): ReactNode => (\n <span className=\"flex flex-wrap items-center gap-1\">\n {(fact.tags ?? []).map((tag) => (\n <span\n key={tag.name}\n className=\"rounded-full bg-muted px-2 py-px text-xs text-muted-foreground\"\n >\n {tag.name}\n </span>\n ))}\n </span>\n ),\n renderVerified: (fact) => (\n <FactSwitch\n checked={fact.confirmed}\n label={l.verified}\n onToggle={() => onToggleConfirmed(fact)}\n testId={`facts-grid-confirmed-${fact.external_id}`}\n />\n ),\n renderShared: (fact) => (\n <FactSwitch\n checked={fact.shared}\n label={l.shared}\n onToggle={() => onToggleShared(fact)}\n testId={`facts-grid-shared-${fact.external_id}`}\n />\n ),\n renderCreator: (fact, _params: ICellRendererParams<T>) => {\n const name = getCreatorName?.(fact) ?? ''\n return name ? (\n <span\n title={name}\n className=\"inline-flex size-6 items-center justify-center rounded-full bg-muted text-[10px] font-medium text-muted-foreground\"\n >\n {initials(name)}\n </span>\n ) : null\n },\n getCreatorName: (params) => (params.data ? (getCreatorName?.(params.data) ?? '') : ''),\n formatDate,\n labels: columnLabels,\n }),\n [\n isInChat,\n onToggleInChat,\n onToggleConfirmed,\n onToggleShared,\n onEdit,\n onDelete,\n getCreatorName,\n formatDate,\n columnLabels,\n l.verified,\n l.shared,\n ]\n )\n\n return (\n <GridView<T>\n testId={testId}\n items={facts}\n columnDefs={columnDefs}\n getItemId={(fact) => fact.external_id}\n onRowClick={onOpen}\n isLoading={isLoading}\n emptyState={EMPTY_STATE}\n gridId={gridId}\n height={height}\n rowHeight={rowHeight}\n {...gridProps}\n gridOptions={{ suppressClickEdit: true, ...gridProps?.gridOptions }}\n />\n )\n}\n","import type { FactRowView } from './factColumns'\n\n/**\n * A fact as a host with plain records usually holds it: camelCase, optional flags, tags as\n * strings. `toFactRow` maps it to the `FactRowView` that `FactsTable` and `createFactColumns`\n * read, so a host without the SDK type needs no adapter of its own.\n */\nexport interface PlainFactRecord {\n id: string\n text: string\n confirmed?: boolean\n shared?: boolean\n /** ISO date (or date-time) the fact starts. */\n dateStart?: string | null\n dateEnd?: string | null\n timezone?: string | null\n tags?: Array<string | { name: string }> | null\n /** Passages that support the fact; only their count is shown. */\n citations?: unknown[] | null\n createdBy?: string | null\n createdAt?: string | null\n updatedAt?: string | null\n}\n\n/** The row plus the record it came from, so callbacks can hand the host its own object back. */\nexport type PlainFactRow<T extends PlainFactRecord> = FactRowView & { record: T }\n\n/** Map one plain record to a grid row. Missing flags are `false`, missing lists are empty. */\nexport function toFactRow<T extends PlainFactRecord>(record: T): PlainFactRow<T> {\n return {\n external_id: record.id,\n text: record.text,\n confirmed: record.confirmed ?? false,\n shared: record.shared ?? false,\n date_start: record.dateStart ?? null,\n date_end: record.dateEnd ?? null,\n timezone: record.timezone ?? null,\n tags: (record.tags ?? []).map((t) => (typeof t === 'string' ? { name: t } : t)),\n citations: record.citations ?? [],\n created_by_ext_id: record.createdBy ?? null,\n created_at: record.createdAt ?? null,\n updated_at: record.updatedAt ?? null,\n record,\n }\n}\n\nexport function toFactRows<T extends PlainFactRecord>(records: T[]): PlainFactRow<T>[] {\n return records.map(toFactRow)\n}\n","import type { ReactNode } from 'react'\nimport { Check, CheckCircle2, CornerDownLeft, Loader2, Paperclip, Search, X } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { SearchHit } from '../retrieval/SearchHit'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactSearchBarLabels {\n search: string\n placeholder: string\n clear: string\n submit: string\n}\n\nexport const DEFAULT_FACT_SEARCH_BAR_LABELS: FactSearchBarLabels = {\n search: 'Search:',\n // An example query rather than an instruction: shows the quoted-phrase syntax.\n placeholder: 'e.g. \"board meeting\" decision on the budget',\n clear: 'Clear search',\n submit: 'Search',\n}\n\nexport interface FactSearchBarTestIds {\n input: string\n clear: string\n submit: string\n}\n\nexport interface FactSearchResultLabels {\n inChat: string\n verified: string\n open: string\n}\n\nexport const DEFAULT_FACT_SEARCH_RESULT_LABELS: FactSearchResultLabels = {\n inChat: 'In this chat',\n verified: 'Verified',\n open: 'Open',\n}\n\nexport interface FactSearchResultTestIds {\n hit: (id: string) => string\n labels: (id: string) => string\n verified: (id: string) => string\n}\n\nexport interface FactSearchBarProps {\n query: string\n onQueryChange: (query: string) => void\n onSubmit: () => void\n onClear: () => void\n isSearching: boolean\n /** Wins over `labels.placeholder`. */\n placeholder?: string\n labels?: Partial<FactSearchBarLabels>\n testIds?: Partial<FactSearchBarTestIds>\n}\n\n/**\n * The facts Smart Search bar: the same bordered, auto-growing box as the Files Smart Search.\n * Enter searches; Shift+Enter breaks a line.\n */\nexport function FactSearchBar({\n query,\n onQueryChange,\n onSubmit,\n onClear,\n isSearching,\n placeholder,\n labels,\n testIds,\n}: FactSearchBarProps) {\n const l = { ...DEFAULT_FACT_SEARCH_BAR_LABELS, ...labels }\n return (\n <div className=\"border-t border-border px-6 pb-4 pt-6\" data-slot=\"fact-search-bar\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"mx-auto flex w-full max-w-2xl items-center gap-3\"\n >\n <label\n htmlFor=\"facts-smart-search-input\"\n className=\"shrink-0 text-base font-medium text-foreground\"\n >\n {l.search}\n </label>\n <div className=\"flex min-w-0 flex-1 items-start gap-2 rounded-lg border border-border bg-background px-3.5 py-2.5 transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n id=\"facts-smart-search-input\"\n rows={1}\n value={query}\n onChange={(e) => {\n onQueryChange(e.target.value)\n e.target.style.height = 'auto'\n e.target.style.height = `${e.target.scrollHeight}px`\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSubmit()\n }\n }}\n placeholder={placeholder ?? l.placeholder}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testIdOr(testIds?.input, { testId: 'facts-smart-search-input' })}\n autoFocus\n />\n <div className=\"flex shrink-0 items-center gap-1\">\n {query && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n onClick={onClear}\n aria-label={l.clear}\n title={l.clear}\n data-testid={testIdOr(testIds?.clear, { testId: 'facts-smart-search-clear' })}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!query.trim() || isSearching}\n className=\"size-7 pointer-coarse:size-11\"\n data-testid={testIdOr(testIds?.submit, { testId: 'facts-smart-search-submit' })}\n title={l.submit}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </form>\n </div>\n )\n}\n\n/** Totals headline pinned between the search bar and the scrolling results. */\nexport function FactSearchTotals({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <div className=\"px-4 pb-3\">\n <p\n className=\"font-sans text-base font-semibold tabular-nums text-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-totals' })}\n >\n {children}\n </p>\n </div>\n )\n}\n\n/** \"Searching facts…\" line. */\nexport function FactSearchPending({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex items-center justify-center gap-2 py-16 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {children}\n </div>\n )\n}\n\n/** No-matches message. */\nexport function FactSearchNoMatches({\n children,\n testId,\n}: {\n children: ReactNode\n testId?: string\n}) {\n return (\n <div\n className=\"py-16 text-center text-sm text-muted-foreground\"\n data-testid={testIdOr(testId, { testId: 'facts-smart-search-empty' })}\n >\n {children}\n </div>\n )\n}\n\nexport interface FactSearchResultLabel {\n id: string\n name: string\n color: string\n}\n\nexport interface FactSearchResultProps {\n /** Fact id: keys the test ids. */\n id: string\n /** 1-based rank, shown outside the card (it numbers the results, it is not part of the hit). */\n rank: number\n text: string\n terms: string[]\n renderSnippet: (content: string, terms: string[]) => ReactNode\n labels: FactSearchResultLabel[]\n /** The fact is in the host's current chat. */\n isInChat?: boolean\n isVerified?: boolean\n /** The fact open in the composer. */\n isSelected?: boolean\n onOpen: () => void\n uiLabels?: Partial<FactSearchResultLabels>\n testIds?: Partial<FactSearchResultTestIds>\n /** Destination of the fact; the card stays a click target (see SearchHit `href`). */\n href?: string\n}\n\n/** One facts search result: rank, highlighted text, labels (and In this chat) and the Verified mark. */\nexport function FactSearchResult({\n id,\n rank,\n text,\n terms,\n renderSnippet,\n labels,\n isInChat,\n isVerified,\n isSelected,\n onOpen,\n uiLabels: labelOverrides,\n testIds,\n href,\n}: FactSearchResultProps) {\n const l = { ...DEFAULT_FACT_SEARCH_RESULT_LABELS, ...labelOverrides }\n return (\n <div className=\"flex items-start gap-2\" data-slot=\"fact-search-hit\">\n <span\n className=\"w-5 shrink-0 pt-3 text-right text-xs tabular-nums text-muted-foreground\"\n aria-hidden=\"true\"\n >\n {rank}\n </span>\n <SearchHit\n className=\"min-w-0 flex-1\"\n testId={testIdOr(testIds?.hit?.(id), { testId: `facts-smart-search-hit-${id}` })}\n href={href}\n selected={isSelected}\n onClick={onOpen}\n content={text}\n terms={terms}\n renderSnippet={renderSnippet}\n header={\n <div\n className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1 text-xs text-muted-foreground\"\n data-testid={testIdOr(testIds?.labels?.(id), {\n testId: `facts-smart-search-hit-labels-${id}`,\n })}\n >\n {isInChat && (\n <span\n className=\"inline-flex items-center gap-1 pr-1\"\n data-testid={`facts-smart-search-hit-in-chat-${id}`}\n >\n <Paperclip className=\"size-3\" /> {l.inChat}\n </span>\n )}\n {labels.map((tag) => (\n <span\n key={tag.id}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium text-foreground\"\n title={tag.name}\n style={{ borderColor: tag.color }}\n >\n <span\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded\"\n style={{ backgroundColor: tag.color }}\n >\n <Check className=\"size-2.5 text-white\" strokeWidth={3} />\n </span>\n <span className=\"max-w-[120px] truncate\">{tag.name}</span>\n </span>\n ))}\n </div>\n }\n headerRight={\n <span className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {isVerified && (\n <span\n className=\"inline-flex shrink-0 items-center gap-1 text-green-text\"\n data-testid={testIdOr(testIds?.verified?.(id), {\n testId: `facts-smart-search-hit-verified-${id}`,\n })}\n >\n <CheckCircle2 className=\"size-3\" /> {l.verified}\n </span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n {l.open} <CornerDownLeft className=\"size-3\" />\n </span>\n </span>\n }\n />\n </div>\n )\n}\n"]}