@arbidocs/blocks 0.3.185 → 0.4.1

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 (612) hide show
  1. package/README.md +122 -0
  2. package/dist/agents/approvals/AuthorizeAgentParts.d.ts +79 -0
  3. package/dist/agents/approvals/ConsentPage.d.ts +76 -0
  4. package/dist/agents/approvals/ConsentParts.d.ts +37 -0
  5. package/dist/agents/approvals/index.d.ts +3 -0
  6. package/dist/agents/config/ConfigField.d.ts +43 -0
  7. package/dist/agents/config/ConfigForm.d.ts +35 -0
  8. package/dist/agents/config/TupleArrayField.d.ts +32 -0
  9. package/dist/agents/config/index.d.ts +4 -0
  10. package/dist/agents/config/schema-utils.d.ts +28 -0
  11. package/dist/agents/definitions/AgentCard.d.ts +63 -0
  12. package/dist/agents/definitions/AgentCreator.d.ts +118 -0
  13. package/dist/agents/definitions/AgentEditorParts.d.ts +63 -0
  14. package/dist/agents/definitions/AgentGallery.d.ts +29 -0
  15. package/dist/agents/definitions/index.d.ts +4 -0
  16. package/dist/agents/index.cjs +595 -0
  17. package/dist/agents/index.cjs.map +1 -0
  18. package/dist/agents/index.d.ts +7 -0
  19. package/dist/agents/index.js +14 -0
  20. package/dist/agents/index.js.map +1 -0
  21. package/dist/agents/runs/AgentBar.d.ts +103 -0
  22. package/dist/agents/runs/AgentSteps.d.ts +157 -0
  23. package/dist/agents/runs/SubagentRoster.d.ts +37 -0
  24. package/dist/agents/runs/index.d.ts +3 -0
  25. package/dist/agents/skills/SkillBrowserParts.d.ts +70 -0
  26. package/dist/agents/skills/SkillCard.d.ts +48 -0
  27. package/dist/agents/skills/SkillForms.d.ts +64 -0
  28. package/dist/agents/skills/SkillParts.d.ts +31 -0
  29. package/dist/agents/skills/SkillRow.d.ts +34 -0
  30. package/dist/agents/skills/index.d.ts +5 -0
  31. package/dist/agents/tasks/LiveRunsBanner.d.ts +26 -0
  32. package/dist/agents/tasks/RecurrenceBuilder.d.ts +36 -0
  33. package/dist/agents/tasks/TaskComposer.d.ts +108 -0
  34. package/dist/agents/tasks/TaskPlan.d.ts +78 -0
  35. package/dist/agents/tasks/TaskRowActions.d.ts +43 -0
  36. package/dist/agents/tasks/TaskRunsDialog.d.ts +45 -0
  37. package/dist/agents/tasks/TasksChrome.d.ts +36 -0
  38. package/dist/agents/tasks/UploadTaskItem.d.ts +39 -0
  39. package/dist/agents/tasks/UploadTaskList.d.ts +35 -0
  40. package/dist/agents/tasks/elapsed.d.ts +2 -0
  41. package/dist/agents/tasks/index.d.ts +13 -0
  42. package/dist/agents/tasks/rrule.d.ts +36 -0
  43. package/dist/agents/tasks/taskColumns.d.ts +68 -0
  44. package/dist/agents/tasks/taskLabels.d.ts +26 -0
  45. package/dist/agents/workflows/AgentSelect.d.ts +33 -0
  46. package/dist/agents/workflows/SchemaForm.d.ts +37 -0
  47. package/dist/agents/workflows/WorkflowConfigDialog.d.ts +73 -0
  48. package/dist/agents/workflows/WorkflowLauncher.d.ts +38 -0
  49. package/dist/agents/workflows/index.d.ts +6 -0
  50. package/dist/agents/workflows/types.d.ts +125 -0
  51. package/dist/agents/workflows/workflow.d.ts +62 -0
  52. package/dist/auth/AuthFooter.d.ts +56 -0
  53. package/dist/auth/AuthForm.d.ts +105 -0
  54. package/dist/auth/AuthLayout.d.ts +46 -0
  55. package/dist/auth/PasswordStrengthInput.d.ts +44 -0
  56. package/dist/auth/RecoveryDialogs.d.ts +90 -0
  57. package/dist/auth/SsoLoginButton.d.ts +19 -0
  58. package/dist/auth/index.cjs +123 -0
  59. package/dist/auth/index.cjs.map +1 -0
  60. package/dist/auth/index.d.ts +6 -0
  61. package/dist/auth/index.js +6 -0
  62. package/dist/auth/index.js.map +1 -0
  63. package/dist/builder/AgentsPanel.d.ts +9 -0
  64. package/dist/builder/ModuleManager.d.ts +6 -0
  65. package/dist/builder/VerticalBuilder.d.ts +32 -0
  66. package/dist/builder/agents/store.d.ts +21 -0
  67. package/dist/builder/export.d.ts +30 -0
  68. package/dist/builder/modules/registry.d.ts +11 -0
  69. package/dist/builder/modules/store.d.ts +29 -0
  70. package/dist/builder/modules/types.d.ts +29 -0
  71. package/dist/builder/types.d.ts +28 -0
  72. package/dist/chat/BranchControls.d.ts +33 -0
  73. package/dist/chat/Composer.d.ts +156 -0
  74. package/dist/chat/ContextChip.d.ts +19 -0
  75. package/dist/chat/ContextPanel.d.ts +108 -0
  76. package/dist/chat/ConversationEmpty.d.ts +53 -0
  77. package/dist/chat/ConversationLayout.d.ts +40 -0
  78. package/dist/chat/ConversationParts.d.ts +62 -0
  79. package/dist/chat/ConversationSearchView.d.ts +57 -0
  80. package/dist/chat/LabelPinRow.d.ts +30 -0
  81. package/dist/chat/Message.d.ts +189 -0
  82. package/dist/chat/MessageAlert.d.ts +25 -0
  83. package/dist/chat/MessageList.d.ts +102 -0
  84. package/dist/chat/ModelPicker.d.ts +103 -0
  85. package/dist/chat/PendingAnswerBar.d.ts +36 -0
  86. package/dist/chat/PinnedDocChip.d.ts +22 -0
  87. package/dist/chat/SlashMenu.d.ts +57 -0
  88. package/dist/chat/ThreadMap.d.ts +45 -0
  89. package/dist/chat/index.cjs +423 -0
  90. package/dist/chat/index.cjs.map +1 -0
  91. package/dist/chat/index.d.ts +21 -0
  92. package/dist/chat/index.js +6 -0
  93. package/dist/chat/index.js.map +1 -0
  94. package/dist/chat/test-id.d.ts +16 -0
  95. package/dist/chat/useStreamAnnouncement.d.ts +19 -0
  96. package/dist/chunk-223D4727.cjs +50 -0
  97. package/dist/chunk-223D4727.cjs.map +1 -0
  98. package/dist/chunk-2K33YGM6.cjs +1846 -0
  99. package/dist/chunk-2K33YGM6.cjs.map +1 -0
  100. package/dist/chunk-2ORA62OF.js +266 -0
  101. package/dist/chunk-2ORA62OF.js.map +1 -0
  102. package/dist/chunk-4EZVCGRL.js +803 -0
  103. package/dist/chunk-4EZVCGRL.js.map +1 -0
  104. package/dist/chunk-54Q3RNJU.cjs +516 -0
  105. package/dist/chunk-54Q3RNJU.cjs.map +1 -0
  106. package/dist/chunk-5B4PXAKI.cjs +287 -0
  107. package/dist/chunk-5B4PXAKI.cjs.map +1 -0
  108. package/dist/chunk-6HIPFEID.cjs +574 -0
  109. package/dist/chunk-6HIPFEID.cjs.map +1 -0
  110. package/dist/{chunk-FZ2S6VAZ.js → chunk-6P6AEQJB.js} +413 -1132
  111. package/dist/chunk-6P6AEQJB.js.map +1 -0
  112. package/dist/chunk-76JDDMSP.js +31 -0
  113. package/dist/chunk-76JDDMSP.js.map +1 -0
  114. package/dist/chunk-7F6CBP3Z.js +12 -0
  115. package/dist/chunk-7F6CBP3Z.js.map +1 -0
  116. package/dist/chunk-7G2LJMUG.cjs +45 -0
  117. package/dist/chunk-7G2LJMUG.cjs.map +1 -0
  118. package/dist/chunk-7PEELPMA.js +1799 -0
  119. package/dist/chunk-7PEELPMA.js.map +1 -0
  120. package/dist/chunk-A2YAC22G.js +93 -0
  121. package/dist/chunk-A2YAC22G.js.map +1 -0
  122. package/dist/chunk-ADOKTJHV.cjs +262 -0
  123. package/dist/chunk-ADOKTJHV.cjs.map +1 -0
  124. package/dist/chunk-AE5FHFZ5.cjs +272 -0
  125. package/dist/chunk-AE5FHFZ5.cjs.map +1 -0
  126. package/dist/chunk-AXIZ2MDV.js +751 -0
  127. package/dist/chunk-AXIZ2MDV.js.map +1 -0
  128. package/dist/chunk-AZQDNYH4.js +2865 -0
  129. package/dist/chunk-AZQDNYH4.js.map +1 -0
  130. package/dist/chunk-C54XEN5T.cjs +34 -0
  131. package/dist/chunk-C54XEN5T.cjs.map +1 -0
  132. package/dist/chunk-CQCC7LE7.js +210 -0
  133. package/dist/chunk-CQCC7LE7.js.map +1 -0
  134. package/dist/chunk-CRIKTUEU.cjs +47 -0
  135. package/dist/chunk-CRIKTUEU.cjs.map +1 -0
  136. package/dist/chunk-CTZ5745I.js +564 -0
  137. package/dist/chunk-CTZ5745I.js.map +1 -0
  138. package/dist/chunk-DPLRHEJZ.js +78 -0
  139. package/dist/chunk-DPLRHEJZ.js.map +1 -0
  140. package/dist/{chunk-DBAUZD7A.cjs → chunk-DREI7EQ2.cjs} +437 -1152
  141. package/dist/chunk-DREI7EQ2.cjs.map +1 -0
  142. package/dist/chunk-ELR74ME6.cjs +68 -0
  143. package/dist/chunk-ELR74ME6.cjs.map +1 -0
  144. package/dist/chunk-G3G7LZPM.cjs +205 -0
  145. package/dist/chunk-G3G7LZPM.cjs.map +1 -0
  146. package/dist/chunk-GDFWJ73C.cjs +2973 -0
  147. package/dist/chunk-GDFWJ73C.cjs.map +1 -0
  148. package/dist/chunk-ITGHMJOM.js +5528 -0
  149. package/dist/chunk-ITGHMJOM.js.map +1 -0
  150. package/dist/chunk-J2BGSWXM.cjs +990 -0
  151. package/dist/chunk-J2BGSWXM.cjs.map +1 -0
  152. package/dist/chunk-K4BGOPGG.js +79 -0
  153. package/dist/chunk-K4BGOPGG.js.map +1 -0
  154. package/dist/chunk-LGBAZD37.js +341 -0
  155. package/dist/chunk-LGBAZD37.js.map +1 -0
  156. package/dist/chunk-LRUCMZK6.cjs +680 -0
  157. package/dist/chunk-LRUCMZK6.cjs.map +1 -0
  158. package/dist/chunk-MHVNT4J3.cjs +15 -0
  159. package/dist/chunk-MHVNT4J3.cjs.map +1 -0
  160. package/dist/chunk-NBV56SGU.js +42 -0
  161. package/dist/chunk-NBV56SGU.js.map +1 -0
  162. package/dist/chunk-NPLYHR2E.js +13 -0
  163. package/dist/chunk-NPLYHR2E.js.map +1 -0
  164. package/dist/chunk-NUNKSZKU.js +203 -0
  165. package/dist/chunk-NUNKSZKU.js.map +1 -0
  166. package/dist/chunk-OB5F4577.cjs +40 -0
  167. package/dist/chunk-OB5F4577.cjs.map +1 -0
  168. package/dist/chunk-OBLSURHV.js +973 -0
  169. package/dist/chunk-OBLSURHV.js.map +1 -0
  170. package/dist/chunk-OUW6G4O2.cjs +96 -0
  171. package/dist/chunk-OUW6G4O2.cjs.map +1 -0
  172. package/dist/chunk-OVEQERPO.js +66 -0
  173. package/dist/chunk-OVEQERPO.js.map +1 -0
  174. package/dist/chunk-P6GHJSLR.js +34 -0
  175. package/dist/chunk-P6GHJSLR.js.map +1 -0
  176. package/dist/chunk-PCB2BPN3.cjs +41 -0
  177. package/dist/chunk-PCB2BPN3.cjs.map +1 -0
  178. package/dist/chunk-PPCATBOY.cjs +15 -0
  179. package/dist/chunk-PPCATBOY.cjs.map +1 -0
  180. package/dist/chunk-QN42OA5J.js +887 -0
  181. package/dist/chunk-QN42OA5J.js.map +1 -0
  182. package/dist/chunk-QXEJXIP4.js +675 -0
  183. package/dist/chunk-QXEJXIP4.js.map +1 -0
  184. package/dist/chunk-RC6VTY2H.js +47 -0
  185. package/dist/chunk-RC6VTY2H.js.map +1 -0
  186. package/dist/chunk-RFIBUWLF.cjs +232 -0
  187. package/dist/chunk-RFIBUWLF.cjs.map +1 -0
  188. package/dist/chunk-S7PSMMRG.js +38 -0
  189. package/dist/chunk-S7PSMMRG.js.map +1 -0
  190. package/dist/chunk-SCFYPAG6.cjs +18 -0
  191. package/dist/chunk-SCFYPAG6.cjs.map +1 -0
  192. package/dist/chunk-SYDHKKRZ.cjs +818 -0
  193. package/dist/chunk-SYDHKKRZ.cjs.map +1 -0
  194. package/dist/chunk-TX2ZICS7.js +139 -0
  195. package/dist/chunk-TX2ZICS7.js.map +1 -0
  196. package/dist/chunk-TYZUCAT7.js +787 -0
  197. package/dist/chunk-TYZUCAT7.js.map +1 -0
  198. package/dist/chunk-U2E3WT3J.js +45 -0
  199. package/dist/chunk-U2E3WT3J.js.map +1 -0
  200. package/dist/chunk-UBNVIIBT.js +284 -0
  201. package/dist/chunk-UBNVIIBT.js.map +1 -0
  202. package/dist/chunk-UFHMLHIR.cjs +66 -0
  203. package/dist/chunk-UFHMLHIR.cjs.map +1 -0
  204. package/dist/chunk-UJE32SST.js +39 -0
  205. package/dist/chunk-UJE32SST.js.map +1 -0
  206. package/dist/chunk-ULWRNGGE.cjs +146 -0
  207. package/dist/chunk-ULWRNGGE.cjs.map +1 -0
  208. package/dist/chunk-UWGIB3VQ.js +64 -0
  209. package/dist/chunk-UWGIB3VQ.js.map +1 -0
  210. package/dist/chunk-V4ISCZJ7.cjs +207 -0
  211. package/dist/chunk-V4ISCZJ7.cjs.map +1 -0
  212. package/dist/chunk-VFUWWH52.cjs +83 -0
  213. package/dist/chunk-VFUWWH52.cjs.map +1 -0
  214. package/dist/chunk-VILAPTCB.js +259 -0
  215. package/dist/chunk-VILAPTCB.js.map +1 -0
  216. package/dist/chunk-VLCY46K6.cjs +82 -0
  217. package/dist/chunk-VLCY46K6.cjs.map +1 -0
  218. package/dist/chunk-VPPX5XUF.cjs +813 -0
  219. package/dist/chunk-VPPX5XUF.cjs.map +1 -0
  220. package/dist/chunk-WJMEXTVD.cjs +122 -0
  221. package/dist/chunk-WJMEXTVD.cjs.map +1 -0
  222. package/dist/chunk-WTNMWEBC.js +504 -0
  223. package/dist/chunk-WTNMWEBC.js.map +1 -0
  224. package/dist/chunk-WW6EOVZA.js +112 -0
  225. package/dist/chunk-WW6EOVZA.js.map +1 -0
  226. package/dist/chunk-XNBAXRY7.cjs +5673 -0
  227. package/dist/chunk-XNBAXRY7.cjs.map +1 -0
  228. package/dist/chunk-XQ7PKKDY.cjs +787 -0
  229. package/dist/chunk-XQ7PKKDY.cjs.map +1 -0
  230. package/dist/chunk-XZIYRKLW.cjs +347 -0
  231. package/dist/chunk-XZIYRKLW.cjs.map +1 -0
  232. package/dist/chunk-YBXCZEWS.js +187 -0
  233. package/dist/chunk-YBXCZEWS.js.map +1 -0
  234. package/dist/chunk-YDHO4AVL.js +16 -0
  235. package/dist/chunk-YDHO4AVL.js.map +1 -0
  236. package/dist/chunk-ZORQ5M3W.cjs +934 -0
  237. package/dist/chunk-ZORQ5M3W.cjs.map +1 -0
  238. package/dist/chunk-ZW6FPIFC.cjs +36 -0
  239. package/dist/chunk-ZW6FPIFC.cjs.map +1 -0
  240. package/dist/citations/CitationEditor.d.ts +58 -0
  241. package/dist/citations/PassagePill.d.ts +49 -0
  242. package/dist/citations/QuietMarks.d.ts +81 -0
  243. package/dist/citations/index.cjs +47 -0
  244. package/dist/citations/index.cjs.map +1 -0
  245. package/dist/citations/index.d.ts +3 -0
  246. package/dist/citations/index.js +6 -0
  247. package/dist/citations/index.js.map +1 -0
  248. package/dist/collaboration/contacts/AddContactsParts.d.ts +46 -0
  249. package/dist/collaboration/contacts/index.d.ts +1 -0
  250. package/dist/collaboration/direct-messages/DirectMessages.d.ts +33 -0
  251. package/dist/collaboration/direct-messages/DmParts.d.ts +139 -0
  252. package/dist/collaboration/direct-messages/index.d.ts +2 -0
  253. package/dist/collaboration/index.cjs +141 -0
  254. package/dist/collaboration/index.cjs.map +1 -0
  255. package/dist/collaboration/index.d.ts +5 -0
  256. package/dist/collaboration/index.js +8 -0
  257. package/dist/collaboration/index.js.map +1 -0
  258. package/dist/collaboration/mail/MailFolderTree.d.ts +34 -0
  259. package/dist/collaboration/mail/index.d.ts +2 -0
  260. package/dist/collaboration/mail/mailFolders.d.ts +25 -0
  261. package/dist/collaboration/members/WorkspaceMembers.d.ts +74 -0
  262. package/dist/collaboration/members/index.d.ts +1 -0
  263. package/dist/collaboration/sharing/ShareControl.d.ts +38 -0
  264. package/dist/collaboration/sharing/index.d.ts +1 -0
  265. package/dist/components/Accordion.d.ts +12 -0
  266. package/dist/components/ActionLink.d.ts +18 -0
  267. package/dist/components/AskBar.d.ts +48 -0
  268. package/dist/components/AvatarBlock.d.ts +9 -0
  269. package/dist/components/Banner.d.ts +12 -0
  270. package/dist/components/BlockImage.d.ts +18 -0
  271. package/dist/components/CTABanner.d.ts +17 -0
  272. package/dist/components/Callout.d.ts +9 -0
  273. package/dist/components/Chart.d.ts +35 -0
  274. package/dist/components/CollectionDetail.d.ts +23 -0
  275. package/dist/components/Columns.d.ts +11 -0
  276. package/dist/components/ContactForm.d.ts +54 -0
  277. package/dist/components/Container.d.ts +11 -0
  278. package/dist/components/DataTable.d.ts +47 -0
  279. package/dist/components/DataTableBlock.d.ts +26 -0
  280. package/dist/components/EmptyState.d.ts +11 -0
  281. package/dist/components/EntityChip.d.ts +24 -0
  282. package/dist/components/EntityIdentityBar.d.ts +90 -0
  283. package/dist/components/EntityTooltip.d.ts +43 -0
  284. package/dist/components/FAQ.d.ts +14 -0
  285. package/dist/components/FeatureGrid.d.ts +18 -0
  286. package/dist/components/Footer.d.ts +25 -0
  287. package/dist/components/Gallery.d.ts +15 -0
  288. package/dist/components/Hero.d.ts +35 -0
  289. package/dist/components/ListBlock.d.ts +10 -0
  290. package/dist/components/LogoCloud.d.ts +12 -0
  291. package/dist/components/MediaText.d.ts +15 -0
  292. package/dist/components/MemberAvatarStack.d.ts +36 -0
  293. package/dist/components/MetricCard.d.ts +28 -0
  294. package/dist/components/Navbar.d.ts +39 -0
  295. package/dist/components/PageHeader.d.ts +15 -0
  296. package/dist/components/PricingTable.d.ts +19 -0
  297. package/dist/components/RichTextBlock.d.ts +10 -0
  298. package/dist/components/SectionHeading.d.ts +11 -0
  299. package/dist/components/Spacer.d.ts +7 -0
  300. package/dist/components/StatGroup.d.ts +12 -0
  301. package/dist/components/Steps.d.ts +12 -0
  302. package/dist/components/Tabs.d.ts +15 -0
  303. package/dist/components/TeamGrid.d.ts +30 -0
  304. package/dist/components/Testimonial.d.ts +9 -0
  305. package/dist/components/TestimonialGrid.d.ts +13 -0
  306. package/dist/components/ToneBadge.d.ts +18 -0
  307. package/dist/components/Toolbar.d.ts +11 -0
  308. package/dist/components/UsageMeter.d.ts +21 -0
  309. package/dist/components/VideoEmbed.d.ts +16 -0
  310. package/dist/components/assetImage.d.ts +16 -0
  311. package/dist/components/assetResolver.d.ts +57 -0
  312. package/dist/components/blockLink.d.ts +26 -0
  313. package/dist/components/editorial/ArticleList.d.ts +32 -0
  314. package/dist/components/editorial/Bands.d.ts +29 -0
  315. package/dist/components/editorial/EditorialHeading.d.ts +17 -0
  316. package/dist/components/editorial/EditorialHero.d.ts +46 -0
  317. package/dist/components/editorial/EditorialSection.d.ts +47 -0
  318. package/dist/components/editorial/Eyebrow.d.ts +14 -0
  319. package/dist/components/editorial/PanelGrid.d.ts +45 -0
  320. package/dist/components/editorial/ProfileCard.d.ts +27 -0
  321. package/dist/components/editorial/PullQuote.d.ts +17 -0
  322. package/dist/components/editorial/Reveal.d.ts +15 -0
  323. package/dist/components/editorial/index.d.ts +12 -0
  324. package/dist/components/editorial/lists.d.ts +42 -0
  325. package/dist/components/editorial/tone.d.ts +33 -0
  326. package/dist/components/tones.d.ts +14 -0
  327. package/dist/connect/index.cjs +65 -0
  328. package/dist/connect/index.cjs.map +1 -0
  329. package/dist/connect/index.d.ts +8 -0
  330. package/dist/connect/index.js +28 -0
  331. package/dist/connect/index.js.map +1 -0
  332. package/dist/connection/ArbiAppProvider.d.ts +16 -0
  333. package/dist/connection/ConnectionProvider.d.ts +50 -0
  334. package/dist/connection/ai.d.ts +99 -0
  335. package/dist/connection/types.d.ts +54 -0
  336. package/dist/connection/useImageGen.d.ts +22 -0
  337. package/dist/facts/FactComposer.d.ts +75 -0
  338. package/dist/facts/FactDateInput.d.ts +34 -0
  339. package/dist/facts/FactLabelsCell.d.ts +35 -0
  340. package/dist/facts/FactPassages.d.ts +52 -0
  341. package/dist/facts/FactRowActions.d.ts +18 -0
  342. package/dist/facts/FactSearchParts.d.ts +80 -0
  343. package/dist/facts/FactSourceGroup.d.ts +26 -0
  344. package/dist/facts/FactTimelineViews.d.ts +37 -0
  345. package/dist/facts/FactsBulkBar.d.ts +53 -0
  346. package/dist/facts/FactsEmptyState.d.ts +38 -0
  347. package/dist/facts/FactsFieldsButton.d.ts +21 -0
  348. package/dist/facts/FactsFilterInput.d.ts +46 -0
  349. package/dist/facts/FactsTable.d.ts +28 -0
  350. package/dist/facts/FactsToolbar.d.ts +53 -0
  351. package/dist/facts/FactsViewToggle.d.ts +38 -0
  352. package/dist/facts/fact-date.d.ts +22 -0
  353. package/dist/facts/fact-row.d.ts +32 -0
  354. package/dist/facts/fact-text.d.ts +14 -0
  355. package/dist/facts/factColumns.d.ts +88 -0
  356. package/dist/facts/index.cjs +2401 -0
  357. package/dist/facts/index.cjs.map +1 -0
  358. package/dist/facts/index.d.ts +35 -0
  359. package/dist/facts/index.js +2343 -0
  360. package/dist/facts/index.js.map +1 -0
  361. package/dist/facts/timezone.d.ts +4 -0
  362. package/dist/files/AiReviewDialog.d.ts +77 -0
  363. package/dist/files/DocStatusIcon.d.ts +12 -0
  364. package/dist/files/DocumentGrid.d.ts +27 -0
  365. package/dist/files/Explorer.d.ts +10 -0
  366. package/dist/files/ExplorerSurface.d.ts +34 -0
  367. package/dist/files/ExplorerTile.d.ts +142 -0
  368. package/dist/files/ExportParts.d.ts +114 -0
  369. package/dist/files/FieldParts.d.ts +64 -0
  370. package/dist/files/FilesPage.d.ts +20 -0
  371. package/dist/files/FilesToolbar.d.ts +59 -0
  372. package/dist/files/FolderPicker.d.ts +82 -0
  373. package/dist/files/GridView.d.ts +59 -0
  374. package/dist/files/HtmlViewerParts.d.ts +183 -0
  375. package/dist/files/MoveToFolderDialog.d.ts +32 -0
  376. package/dist/files/RedlineParts.d.ts +72 -0
  377. package/dist/files/SelectionBar.d.ts +65 -0
  378. package/dist/files/StatusPill.d.ts +23 -0
  379. package/dist/files/TagPassagePanel.d.ts +60 -0
  380. package/dist/files/UploadDropzone.d.ts +33 -0
  381. package/dist/files/UploadFooter.d.ts +59 -0
  382. package/dist/files/UploadParts.d.ts +78 -0
  383. package/dist/files/UploadSources.d.ts +77 -0
  384. package/dist/files/VersionTimeline.d.ts +60 -0
  385. package/dist/files/ViewToggle.d.ts +53 -0
  386. package/dist/files/ViewerChrome.d.ts +152 -0
  387. package/dist/files/ViewerLayout.d.ts +32 -0
  388. package/dist/files/ViewerParts.d.ts +62 -0
  389. package/dist/files/bulk/BulkActionsBar.d.ts +76 -0
  390. package/dist/files/bulk/FolderFilterButton.d.ts +35 -0
  391. package/dist/files/bulk/index.d.ts +2 -0
  392. package/dist/files/cells/DocumentNameCell.d.ts +31 -0
  393. package/dist/files/cells/FolderCell.d.ts +25 -0
  394. package/dist/files/cells/HoverIconCell.d.ts +21 -0
  395. package/dist/files/cells/LabelMultiSelect.d.ts +50 -0
  396. package/dist/files/cells/RelatedDocsCell.d.ts +22 -0
  397. package/dist/files/cells/TagColumnParts.d.ts +29 -0
  398. package/dist/files/cells/index.d.ts +6 -0
  399. package/dist/files/documentGridLayout.d.ts +31 -0
  400. package/dist/files/grid-test-ids.d.ts +18 -0
  401. package/dist/files/import/CalendarImportRow.d.ts +26 -0
  402. package/dist/files/import/ImportParts.d.ts +114 -0
  403. package/dist/files/import/TaskSection.d.ts +51 -0
  404. package/dist/files/import/UrlInputDialogView.d.ts +63 -0
  405. package/dist/files/import/VendorLogo.d.ts +15 -0
  406. package/dist/files/import/index.d.ts +5 -0
  407. package/dist/files/index.cjs +7555 -0
  408. package/dist/files/index.cjs.map +1 -0
  409. package/dist/files/index.d.ts +34 -0
  410. package/dist/files/index.js +7340 -0
  411. package/dist/files/index.js.map +1 -0
  412. package/dist/files/page/FilesAddMenu.d.ts +30 -0
  413. package/dist/files/page/FilesPageParts.d.ts +24 -0
  414. package/dist/files/page/FilesPageTitle.d.ts +24 -0
  415. package/dist/files/page/index.d.ts +3 -0
  416. package/dist/files/tags/BulkTagEditor.d.ts +136 -0
  417. package/dist/files/tags/DocTagPopover.d.ts +113 -0
  418. package/dist/files/tags/TagManager.d.ts +54 -0
  419. package/dist/files/tags/index.d.ts +3 -0
  420. package/dist/files/views/FieldsEditorParts.d.ts +151 -0
  421. package/dist/files/views/FieldsManagerParts.d.ts +17 -0
  422. package/dist/files/views/TagFormParts.d.ts +109 -0
  423. package/dist/files/views/ViewSelectorMenu.d.ts +66 -0
  424. package/dist/files/views/fieldsEditorModel.d.ts +43 -0
  425. package/dist/files/views/index.d.ts +5 -0
  426. package/dist/home/ActionMenuDialog.d.ts +26 -0
  427. package/dist/home/AddFilesFirst.d.ts +22 -0
  428. package/dist/home/CardHeaderBar.d.ts +40 -0
  429. package/dist/home/CollapsibleSection.d.ts +43 -0
  430. package/dist/home/CreateTile.d.ts +17 -0
  431. package/dist/home/DashboardParts.d.ts +32 -0
  432. package/dist/home/FactsStrip.d.ts +41 -0
  433. package/dist/home/FoldSection.d.ts +19 -0
  434. package/dist/home/GettingStartedStrip.d.ts +49 -0
  435. package/dist/home/Greeting.d.ts +18 -0
  436. package/dist/home/HomeLayout.d.ts +28 -0
  437. package/dist/home/KeyValueRow.d.ts +43 -0
  438. package/dist/home/ProjectBandParts.d.ts +70 -0
  439. package/dist/home/QuickActionDialogHeader.d.ts +21 -0
  440. package/dist/home/RecentList.d.ts +48 -0
  441. package/dist/home/ScopePicker.d.ts +65 -0
  442. package/dist/home/StartTiles.d.ts +33 -0
  443. package/dist/home/index.cjs +854 -0
  444. package/dist/home/index.cjs.map +1 -0
  445. package/dist/home/index.d.ts +37 -0
  446. package/dist/home/index.js +763 -0
  447. package/dist/home/index.js.map +1 -0
  448. package/dist/home/sections.d.ts +33 -0
  449. package/dist/index.cjs +1992 -5547
  450. package/dist/index.cjs.map +1 -1
  451. package/dist/index.d.ts +72 -1716
  452. package/dist/index.js +142 -5316
  453. package/dist/index.js.map +1 -1
  454. package/dist/lib/balanced-columns.d.ts +8 -0
  455. package/dist/lib/format.d.ts +37 -0
  456. package/dist/lib/observe-resize.d.ts +6 -0
  457. package/dist/lib/password-strength.d.ts +24 -0
  458. package/dist/lib/sidebar-mode.d.ts +46 -0
  459. package/dist/lib/testid.d.ts +7 -0
  460. package/dist/lib/use-drawer.d.ts +11 -0
  461. package/dist/lib/useControllableState.d.ts +5 -0
  462. package/dist/lib/useDismissibleCard.d.ts +15 -0
  463. package/dist/lib/useListKeyNav.d.ts +42 -0
  464. package/dist/lib/useLongPaste.d.ts +15 -0
  465. package/dist/lib/useRestoreFocus.d.ts +11 -0
  466. package/dist/lib/useScopeSelection.d.ts +34 -0
  467. package/dist/nav/types.d.ts +19 -0
  468. package/dist/provider/BlocksProvider.d.ts +20 -0
  469. package/dist/provider/TooltipScope.d.ts +9 -0
  470. package/dist/record/index.cjs +2 -4
  471. package/dist/record/index.cjs.map +1 -1
  472. package/dist/record/index.d.ts +12 -16
  473. package/dist/record/index.js +2 -4
  474. package/dist/record/index.js.map +1 -1
  475. package/dist/retrieval/HighlightText.d.ts +21 -0
  476. package/dist/retrieval/SearchEmptyState.d.ts +39 -0
  477. package/dist/retrieval/SearchGroupHeader.d.ts +21 -0
  478. package/dist/retrieval/SearchHit.d.ts +36 -0
  479. package/dist/retrieval/SearchPage.d.ts +187 -0
  480. package/dist/retrieval/SearchPagination.d.ts +21 -0
  481. package/dist/retrieval/highlight.d.ts +21 -0
  482. package/dist/retrieval/index.cjs +160 -0
  483. package/dist/retrieval/index.cjs.map +1 -0
  484. package/dist/retrieval/index.d.ts +7 -0
  485. package/dist/retrieval/index.js +7 -0
  486. package/dist/retrieval/index.js.map +1 -0
  487. package/dist/settings/AccountDialogs.d.ts +89 -0
  488. package/dist/settings/AvatarPicker.d.ts +25 -0
  489. package/dist/settings/Billing.d.ts +113 -0
  490. package/dist/settings/ConfigSwitcherBar.d.ts +46 -0
  491. package/dist/settings/ConfirmDialog.d.ts +28 -0
  492. package/dist/settings/ConnectionCard.d.ts +58 -0
  493. package/dist/settings/ConversationSettingsParts.d.ts +53 -0
  494. package/dist/settings/DocumentPicker.d.ts +57 -0
  495. package/dist/settings/EmailWorkspaceDialogView.d.ts +60 -0
  496. package/dist/settings/ErrorDialog.d.ts +36 -0
  497. package/dist/settings/FloatingPanel.d.ts +32 -0
  498. package/dist/settings/JsonTree.d.ts +24 -0
  499. package/dist/settings/LogoutDialog.d.ts +51 -0
  500. package/dist/settings/ModalBreadcrumbHeader.d.ts +32 -0
  501. package/dist/settings/ModalScaffold.d.ts +60 -0
  502. package/dist/settings/MultiSelect.d.ts +111 -0
  503. package/dist/settings/NotificationCategoryList.d.ts +26 -0
  504. package/dist/settings/PanelFrame.d.ts +47 -0
  505. package/dist/settings/PasswordChangeDialog.d.ts +64 -0
  506. package/dist/settings/PlanBadge.d.ts +14 -0
  507. package/dist/settings/PlanCard.d.ts +97 -0
  508. package/dist/settings/PremiumModelsFrame.d.ts +17 -0
  509. package/dist/settings/ProfileCard.d.ts +67 -0
  510. package/dist/settings/Projects.d.ts +108 -0
  511. package/dist/settings/QuotaMeter.d.ts +31 -0
  512. package/dist/settings/ReferralCredit.d.ts +46 -0
  513. package/dist/settings/SegmentedControl.d.ts +20 -0
  514. package/dist/settings/ServerConnectionControls.d.ts +31 -0
  515. package/dist/settings/SettingsPanel.d.ts +61 -0
  516. package/dist/settings/SettingsSwitchRow.d.ts +21 -0
  517. package/dist/settings/SubscriptionParts.d.ts +215 -0
  518. package/dist/settings/SupportPanel.d.ts +32 -0
  519. package/dist/settings/SyncDialogParts.d.ts +155 -0
  520. package/dist/settings/ThreadPreviewDialog.d.ts +18 -0
  521. package/dist/settings/TipsEditorDialog.d.ts +94 -0
  522. package/dist/settings/TriStateFilterMenu.d.ts +66 -0
  523. package/dist/settings/Usage.d.ts +102 -0
  524. package/dist/settings/WelcomeDialog.d.ts +79 -0
  525. package/dist/settings/index.cjs +5131 -0
  526. package/dist/settings/index.cjs.map +1 -0
  527. package/dist/settings/index.d.ts +38 -0
  528. package/dist/settings/index.js +4922 -0
  529. package/dist/settings/index.js.map +1 -0
  530. package/dist/shell/ActionCluster.d.ts +33 -0
  531. package/dist/shell/AskField.d.ts +76 -0
  532. package/dist/shell/InfoBar.d.ts +20 -0
  533. package/dist/shell/MobileBars.d.ts +47 -0
  534. package/dist/shell/OfflinePill.d.ts +28 -0
  535. package/dist/shell/RemoteControlPill.d.ts +23 -0
  536. package/dist/shell/Shell.d.ts +123 -0
  537. package/dist/shell/Sidebar.d.ts +104 -0
  538. package/dist/shell/SidebarBadgeRow.d.ts +29 -0
  539. package/dist/shell/SidebarRowAction.d.ts +24 -0
  540. package/dist/shell/StatusRow.d.ts +20 -0
  541. package/dist/shell/TabHeader.d.ts +70 -0
  542. package/dist/shell/TipCard.d.ts +46 -0
  543. package/dist/shell/ToolButton.d.ts +12 -0
  544. package/dist/shell/Workspace.d.ts +90 -0
  545. package/dist/shell/index.cjs +187 -0
  546. package/dist/shell/index.cjs.map +1 -0
  547. package/dist/shell/index.d.ts +20 -0
  548. package/dist/shell/index.js +10 -0
  549. package/dist/shell/index.js.map +1 -0
  550. package/dist/shell/sidebar-context.d.ts +19 -0
  551. package/dist/shell/types.d.ts +48 -0
  552. package/dist/site/index.cjs +173 -90
  553. package/dist/site/index.d.ts +60 -4
  554. package/dist/site/index.js +8 -1
  555. package/dist/studio/PageRenderer.d.ts +35 -0
  556. package/dist/studio/Section.d.ts +24 -0
  557. package/dist/studio/StudioEditor.d.ts +32 -0
  558. package/dist/studio/aiFields.d.ts +17 -0
  559. package/dist/studio/blockKit.d.ts +36 -0
  560. package/dist/studio/blocksConfig.d.ts +42 -0
  561. package/dist/studio/imageFields.d.ts +14 -0
  562. package/dist/studio/index.cjs +3353 -0
  563. package/dist/studio/index.cjs.map +1 -0
  564. package/dist/studio/index.d.ts +32 -0
  565. package/dist/studio/index.js +3297 -0
  566. package/dist/studio/index.js.map +1 -0
  567. package/dist/studio/liveData.d.ts +4 -0
  568. package/dist/studio/liveWidgetRuntime.d.ts +41 -0
  569. package/dist/studio/persistence.d.ts +38 -0
  570. package/dist/studio/publish.d.ts +39 -0
  571. package/dist/studio/siteBlocks.d.ts +14 -0
  572. package/dist/studio/types.d.ts +46 -0
  573. package/dist/studio/websiteBlocks.d.ts +4 -0
  574. package/dist/studio/widgets.d.ts +20 -0
  575. package/dist/theme/ThemeEditor.d.ts +16 -0
  576. package/dist/theme/fontPairings.d.ts +48 -0
  577. package/dist/theme/store.d.ts +53 -0
  578. package/dist/theme/tokens.d.ts +105 -0
  579. package/dist/timeline/Timeline.d.ts +27 -0
  580. package/dist/timeline/TimelineCalendar.d.ts +54 -0
  581. package/dist/timeline/TimelineGantt.d.ts +71 -0
  582. package/dist/timeline/TimelineZoomControl.d.ts +17 -0
  583. package/dist/timeline/index.cjs +50 -0
  584. package/dist/timeline/index.cjs.map +1 -0
  585. package/dist/timeline/index.d.ts +13 -0
  586. package/dist/timeline/index.js +5 -0
  587. package/dist/timeline/index.js.map +1 -0
  588. package/dist/timeline/span.d.ts +29 -0
  589. package/dist/timeline/types.d.ts +30 -0
  590. package/dist/workspaces/WorkspaceBadges.d.ts +27 -0
  591. package/dist/workspaces/WorkspaceCard.d.ts +142 -0
  592. package/dist/workspaces/WorkspaceFormParts.d.ts +98 -0
  593. package/dist/workspaces/WorkspaceGroup.d.ts +31 -0
  594. package/dist/workspaces/WorkspaceSettingsParts.d.ts +70 -0
  595. package/dist/workspaces/index.cjs +690 -0
  596. package/dist/workspaces/index.cjs.map +1 -0
  597. package/dist/workspaces/index.d.ts +9 -0
  598. package/dist/workspaces/index.js +661 -0
  599. package/dist/workspaces/index.js.map +1 -0
  600. package/package.json +154 -9
  601. package/src/blocks.css +365 -0
  602. package/src/components/grid.css +60 -107
  603. package/src/source.css +20 -0
  604. package/src/studio/studio.css +3 -3
  605. package/src/tokens.css +226 -0
  606. package/dist/chunk-DBAUZD7A.cjs.map +0 -1
  607. package/dist/chunk-FZ2S6VAZ.js.map +0 -1
  608. package/dist/index-DduoEosi.d.cts +0 -846
  609. package/dist/index-DduoEosi.d.ts +0 -846
  610. package/dist/index.d.cts +0 -1717
  611. package/dist/record/index.d.cts +0 -96
  612. package/dist/site/index.d.cts +0 -4
@@ -0,0 +1,2401 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkLRUCMZK6_cjs = require('../chunk-LRUCMZK6.cjs');
5
+ var chunkOUW6G4O2_cjs = require('../chunk-OUW6G4O2.cjs');
6
+ var chunkVPPX5XUF_cjs = require('../chunk-VPPX5XUF.cjs');
7
+ var chunkV4ISCZJ7_cjs = require('../chunk-V4ISCZJ7.cjs');
8
+ var chunk5B4PXAKI_cjs = require('../chunk-5B4PXAKI.cjs');
9
+ var chunkPPCATBOY_cjs = require('../chunk-PPCATBOY.cjs');
10
+ var chunkWJMEXTVD_cjs = require('../chunk-WJMEXTVD.cjs');
11
+ require('../chunk-C54XEN5T.cjs');
12
+ var chunkMHVNT4J3_cjs = require('../chunk-MHVNT4J3.cjs');
13
+ var lucideReact = require('lucide-react');
14
+ var ui = require('@arbidocs/react/ui');
15
+ var jsxRuntime = require('react/jsx-runtime');
16
+ var react = require('react');
17
+
18
+ // src/facts/fact-text.ts
19
+ var WHITESPACE_CODE_POINTS = /* @__PURE__ */ new Set([32, 9, 160]);
20
+ function decodeWhitespaceEntities(text) {
21
+ if (!text) return "";
22
+ return text.replace(/&#x([0-9a-f]+);|&#(\d+);/gi, (match, hex, dec) => {
23
+ const code = hex ? parseInt(hex, 16) : parseInt(dec, 10);
24
+ return WHITESPACE_CODE_POINTS.has(code) ? String.fromCodePoint(code) : match;
25
+ });
26
+ }
27
+ var DEFAULT_FACT_COLUMN_LABELS = {
28
+ pinnedHeaderTooltip: "Pinned facts are given to the assistant every turn",
29
+ pinnedTitle: "Pinned \u2014 sent with every AI request. Click to unpin.",
30
+ unpinnedTitle: "Pin \u2014 send with every AI request",
31
+ unpin: "Unpin fact",
32
+ pin: "Pin fact",
33
+ fact: "Fact",
34
+ dates: "Dates",
35
+ dateTitle: "Date of the fact itself, not when this was saved",
36
+ labels: "Labels",
37
+ verified: "Verified",
38
+ verifiedTooltip: "Verified by a human",
39
+ shared: "Shared",
40
+ sharedTooltip: "Shared with the workspace, or private to you & your agents",
41
+ createdBy: "Created by",
42
+ sources: "Sources",
43
+ sourcedFrom: (n) => `Sourced from ${n} document${n === 1 ? "" : "s"} \u2014 open the fact to see them`,
44
+ createdAt: "Created at",
45
+ updated: "Updated",
46
+ id: "ID"
47
+ };
48
+ var ISO_DATE_FILTER_PARAMS = {
49
+ browserDatePicker: true,
50
+ comparator: (filterDate, cellValue) => {
51
+ if (!cellValue || typeof cellValue !== "string") return -1;
52
+ const cell = new Date(cellValue);
53
+ if (Number.isNaN(cell.getTime())) return -1;
54
+ const cellDay = Date.UTC(cell.getUTCFullYear(), cell.getUTCMonth(), cell.getUTCDate());
55
+ const filterDay = Date.UTC(
56
+ filterDate.getFullYear(),
57
+ filterDate.getMonth(),
58
+ filterDate.getDate()
59
+ );
60
+ return cellDay < filterDay ? -1 : cellDay > filterDay ? 1 : 0;
61
+ }
62
+ };
63
+ function sourceDocCount(fact) {
64
+ return fact?.citations?.length ?? 0;
65
+ }
66
+ var DEFAULT_FACT_COLUMN_ORDER = [
67
+ "pinned",
68
+ "text",
69
+ "sources",
70
+ "tags",
71
+ "date",
72
+ "confirmed",
73
+ "shared",
74
+ "created_by",
75
+ "created_at",
76
+ "updated_at",
77
+ "note_id"
78
+ ];
79
+ function createFactColumns(slots) {
80
+ const fieldOf = (name) => name;
81
+ const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...slots.labels };
82
+ const ids = slots.testIds;
83
+ const columns = [
84
+ {
85
+ colId: "pinned",
86
+ headerName: "",
87
+ headerComponent: () => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex size-full items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pin, { className: "size-3.5 text-muted-foreground" }) }),
88
+ field: fieldOf("pinned"),
89
+ width: 44,
90
+ minWidth: 44,
91
+ maxWidth: 44,
92
+ sortable: true,
93
+ resizable: false,
94
+ headerTooltip: l.pinnedHeaderTooltip,
95
+ cellClass: "cell-hcenter",
96
+ // A toggle, not a readout: pinning is the row's most consequential switch (pinned facts
97
+ // ride every AI request), so it flips in place.
98
+ cellRenderer: (params) => {
99
+ if (!params.data) return null;
100
+ const fact = params.data;
101
+ return /* @__PURE__ */ jsxRuntime.jsx(
102
+ "button",
103
+ {
104
+ type: "button",
105
+ onClick: () => slots.onTogglePin(fact),
106
+ title: fact.pinned ? l.pinnedTitle : l.unpinnedTitle,
107
+ "aria-label": fact.pinned ? l.unpin : l.pin,
108
+ "aria-pressed": fact.pinned,
109
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(ids?.pinned?.(fact.external_id), {
110
+ testId: `facts-grid-pinned-${fact.external_id}`
111
+ }),
112
+ className: "flex h-full items-center",
113
+ children: /* @__PURE__ */ jsxRuntime.jsx(
114
+ lucideReact.Pin,
115
+ {
116
+ className: ui.cn(
117
+ "size-3.5",
118
+ fact.pinned ? "fill-current text-yellow-text" : "text-muted-foreground/30 transition-colors hover:text-muted-foreground"
119
+ )
120
+ }
121
+ )
122
+ }
123
+ );
124
+ }
125
+ },
126
+ {
127
+ colId: "text",
128
+ suppressHeaderFilterButton: true,
129
+ headerComponent: (p) => slots.renderHeader(p, "text"),
130
+ headerName: l.fact,
131
+ field: fieldOf("text"),
132
+ flex: 3,
133
+ minWidth: 280,
134
+ sortable: true,
135
+ filter: "agTextColumnFilter",
136
+ // Decode the editor's whitespace entities (`&#x20;` for a trailing space) so the tooltip
137
+ // reads as typed, not as raw markdown references.
138
+ tooltipValueGetter: (p) => decodeWhitespaceEntities(p.data?.text),
139
+ // Editable only via the grid api (Rename in the row's menu); clicks never open the editor
140
+ // (suppressClickEdit on the grid).
141
+ editable: true,
142
+ cellEditor: "agLargeTextCellEditor",
143
+ cellEditorPopup: true,
144
+ cellEditorParams: { rows: 8, cols: 60 },
145
+ valueSetter: (params) => {
146
+ if (!params.data) return false;
147
+ params.data.text = params.newValue;
148
+ return true;
149
+ },
150
+ // NOT `cell-multiline`: this cell has its OWN clamp (the `.fact-clamp` span below, sized
151
+ // from the row height). A second clamp cut the text in half at the minimum row height.
152
+ cellClass: "relative",
153
+ cellRenderer: (params) => {
154
+ if (!params.data) return null;
155
+ const fact = params.data;
156
+ const rowH = params.node.rowHeight ?? 52;
157
+ const clampLines = Math.max(1, Math.floor(rowH / 20));
158
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex size-full items-start pr-6", children: [
159
+ /* @__PURE__ */ jsxRuntime.jsx(
160
+ "span",
161
+ {
162
+ className: "fact-clamp whitespace-normal break-words text-sm leading-snug text-foreground",
163
+ style: { ["--fact-clamp-lines"]: clampLines },
164
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(ids?.text?.(fact.external_id), {
165
+ testId: `facts-grid-text-${fact.external_id}`
166
+ }),
167
+ children: decodeWhitespaceEntities(fact.text)
168
+ }
169
+ ),
170
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "facts-row-kebab absolute right-0.5 top-1/2 -translate-y-1/2", children: slots.renderRowActions(fact, params) })
171
+ ] });
172
+ }
173
+ },
174
+ {
175
+ colId: "date",
176
+ // AG Grid's DEFAULT header, so the sort arrow and filter button are the native ones,
177
+ // identical to the Files table's Date columns.
178
+ headerName: l.dates,
179
+ // Sort on the raw bound rather than the rendered string ("Oct 2019" sorts April first).
180
+ field: fieldOf("date_start"),
181
+ flex: 0.8,
182
+ minWidth: 132,
183
+ sortable: true,
184
+ filter: "agDateColumnFilter",
185
+ filterParams: ISO_DATE_FILTER_PARAMS,
186
+ // The edit value is the date-only slice: a lexical sort matches a chronological one, and
187
+ // the inline editor shows "2024-03-12" rather than a full ISO timestamp. Inline typing
188
+ // accepts YYYY, YYYY-MM or YYYY-MM-DD; clearing the cell undates the fact.
189
+ editable: true,
190
+ singleClickEdit: true,
191
+ valueGetter: (params) => params.data?.date_start ? params.data.date_start.slice(0, 10) : null,
192
+ valueSetter: (params) => {
193
+ if (!params.data) return false;
194
+ params.data.date_start = params.newValue;
195
+ return true;
196
+ },
197
+ cellClass: "relative cell-tnum",
198
+ cellRenderer: (params) => {
199
+ const when = chunkVPPX5XUF_cjs.formatSpan(
200
+ params.data?.date_start,
201
+ params.data?.date_end,
202
+ params.data?.timezone
203
+ );
204
+ if (!when) return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground/50", children: "\u2014" });
205
+ return /* @__PURE__ */ jsxRuntime.jsxs(
206
+ "span",
207
+ {
208
+ className: "inline-flex items-center gap-1",
209
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(ids?.date?.(params.data?.external_id ?? ""), {
210
+ testId: `facts-grid-date-${params.data?.external_id}`
211
+ }),
212
+ title: l.dateTitle,
213
+ children: [
214
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarDays, { className: "size-3 opacity-70" }),
215
+ when
216
+ ]
217
+ }
218
+ );
219
+ }
220
+ },
221
+ {
222
+ colId: "tags",
223
+ suppressHeaderFilterButton: true,
224
+ headerComponent: (p) => slots.renderHeader(p, "tags"),
225
+ headerName: l.labels,
226
+ flex: 0.9,
227
+ // Never narrower than its own header, even with the filter button and sort indicator.
228
+ minWidth: 160,
229
+ sortable: true,
230
+ filter: "agTextColumnFilter",
231
+ cellClass: "overflow-visible",
232
+ valueGetter: (params) => (params.data?.tags ?? []).map((t) => t.name).join(", "),
233
+ // Editable in place: toggling a label persists immediately, no dialog round-trip.
234
+ cellRenderer: (params) => params.data ? slots.renderLabels(params.data, params) : null
235
+ },
236
+ {
237
+ colId: "confirmed",
238
+ headerName: l.verified,
239
+ headerTooltip: l.verifiedTooltip,
240
+ field: fieldOf("confirmed"),
241
+ // minWidth matches width so the header can't be clamped narrow enough to ellipsize.
242
+ width: 116,
243
+ minWidth: 116,
244
+ sortable: true,
245
+ cellDataType: "boolean",
246
+ valueGetter: (params) => params.data?.confirmed ?? false,
247
+ cellClass: "cell-hcenter",
248
+ headerClass: "header-hcenter",
249
+ cellRenderer: (params) => params.data ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center", children: slots.renderVerified(params.data) }) : null
250
+ },
251
+ {
252
+ colId: "shared",
253
+ headerName: l.shared,
254
+ headerTooltip: l.sharedTooltip,
255
+ field: fieldOf("shared"),
256
+ // minWidth (not just width) is raised too: AG Grid clamps any persisted width up to it.
257
+ width: 110,
258
+ minWidth: 110,
259
+ sortable: true,
260
+ headerClass: "header-hcenter",
261
+ cellDataType: "boolean",
262
+ valueGetter: (params) => params.data?.shared ?? false,
263
+ cellRenderer: (params) => params.data ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center", children: slots.renderShared(params.data) }) : null
264
+ },
265
+ {
266
+ colId: "created_by",
267
+ headerName: l.createdBy,
268
+ headerTooltip: l.createdBy,
269
+ width: 138,
270
+ minWidth: 138,
271
+ sortable: true,
272
+ valueGetter: (params) => slots.getCreatorName(params),
273
+ cellRenderer: (params) => params.data ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center", children: slots.renderCreator(params.data, params) }) : null
274
+ },
275
+ {
276
+ colId: "sources",
277
+ headerName: l.sources,
278
+ width: 112,
279
+ minWidth: 104,
280
+ sortable: true,
281
+ // A hand-written fact has no sources, which is information rather than a gap: it reads as
282
+ // an em dash instead of a zero.
283
+ valueGetter: (params) => sourceDocCount(params.data),
284
+ cellRenderer: (params) => {
285
+ const n = sourceDocCount(params.data);
286
+ if (n === 0) return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground/40", children: "\u2014" });
287
+ return /* @__PURE__ */ jsxRuntime.jsxs(
288
+ "span",
289
+ {
290
+ className: "inline-flex items-center gap-1 text-xs text-muted-foreground",
291
+ title: l.sourcedFrom(n),
292
+ children: [
293
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Quote, { className: "size-3 opacity-70" }),
294
+ n
295
+ ]
296
+ }
297
+ );
298
+ }
299
+ },
300
+ {
301
+ colId: "created_at",
302
+ suppressHeaderFilterButton: true,
303
+ headerComponent: (p) => slots.renderHeader(p, "created_at"),
304
+ headerName: l.createdAt,
305
+ field: fieldOf("created_at"),
306
+ width: 162,
307
+ minWidth: 154,
308
+ sortable: true,
309
+ filter: "agDateColumnFilter",
310
+ filterParams: ISO_DATE_FILTER_PARAMS,
311
+ // Display-only: a valueFormatter avoids mounting a React component per row.
312
+ cellClass: "text-muted-foreground",
313
+ valueFormatter: (params) => params.value ? slots.formatDate(params.value) : ""
314
+ },
315
+ {
316
+ colId: "updated_at",
317
+ suppressHeaderFilterButton: true,
318
+ headerComponent: (p) => slots.renderHeader(p, "updated_at"),
319
+ headerName: l.updated,
320
+ field: fieldOf("updated_at"),
321
+ width: 140,
322
+ minWidth: 140,
323
+ // Hidden by default: a column-menu opt-in like the documents grid's long tail.
324
+ hide: true,
325
+ sortable: true,
326
+ filter: "agDateColumnFilter",
327
+ filterParams: ISO_DATE_FILTER_PARAMS,
328
+ valueFormatter: (params) => params.value ? slots.formatDate(params.value) : ""
329
+ },
330
+ {
331
+ colId: "note_id",
332
+ headerName: l.id,
333
+ field: fieldOf("external_id"),
334
+ width: 120,
335
+ minWidth: 100,
336
+ sortable: true,
337
+ filter: "agTextColumnFilter",
338
+ // Hidden by default like the documents ID column: needed when quoting a fact to support.
339
+ hide: true,
340
+ cellClass: "font-mono text-xs text-muted-foreground"
341
+ }
342
+ ];
343
+ return DEFAULT_FACT_COLUMN_ORDER.map((id) => columns.find((c) => c.colId === id)).filter(
344
+ (c) => c !== void 0
345
+ );
346
+ }
347
+ var DEFAULT_FACT_ROW_ACTIONS_LABELS = {
348
+ actions: "Fact actions",
349
+ edit: "Edit",
350
+ delete: "Delete"
351
+ };
352
+ function FactRowActions({ onEdit, onDelete, labels, testIds }) {
353
+ const l = { ...DEFAULT_FACT_ROW_ACTIONS_LABELS, ...labels };
354
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
355
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
356
+ "button",
357
+ {
358
+ type: "button",
359
+ onClick: (e) => e.stopPropagation(),
360
+ className: "flex size-6 pointer-coarse:size-11 items-center justify-center rounded text-muted-foreground/70 transition-colors hover:bg-muted hover:text-foreground data-[state=open]:bg-muted data-[state=open]:text-foreground",
361
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.trigger, { testId: "fact-row-actions" }),
362
+ "aria-label": l.actions,
363
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreVertical, { className: "size-4" })
364
+ }
365
+ ) }),
366
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenuContent, { align: "end", onClick: (e) => e.stopPropagation(), children: [
367
+ /* @__PURE__ */ jsxRuntime.jsxs(
368
+ ui.DropdownMenuItem,
369
+ {
370
+ onSelect: onEdit,
371
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.edit, { testId: "fact-action-edit" }),
372
+ children: [
373
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pencil, { className: "mr-2 size-4" }),
374
+ l.edit
375
+ ]
376
+ }
377
+ ),
378
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuSeparator, {}),
379
+ /* @__PURE__ */ jsxRuntime.jsxs(
380
+ ui.DropdownMenuItem,
381
+ {
382
+ onSelect: onDelete,
383
+ className: "text-red-text focus:text-red-text",
384
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.delete, { testId: "fact-action-delete" }),
385
+ children: [
386
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2, { className: "mr-2 size-4" }),
387
+ l.delete
388
+ ]
389
+ }
390
+ )
391
+ ] })
392
+ ] });
393
+ }
394
+ function FactSwitch({ checked, label, onToggle, testId }) {
395
+ return /* @__PURE__ */ jsxRuntime.jsx(
396
+ "button",
397
+ {
398
+ type: "button",
399
+ role: "switch",
400
+ "aria-checked": checked,
401
+ "aria-label": label,
402
+ onClick: onToggle,
403
+ "data-testid": testId,
404
+ className: ui.cn(
405
+ "inline-flex h-5 w-9 items-center rounded-full p-0.5 transition-colors",
406
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
407
+ checked ? "bg-green-solid" : "bg-muted-foreground/30"
408
+ ),
409
+ children: /* @__PURE__ */ jsxRuntime.jsx(
410
+ "span",
411
+ {
412
+ className: ui.cn(
413
+ "size-4 rounded-full bg-background transition-transform",
414
+ checked && "translate-x-4"
415
+ )
416
+ }
417
+ )
418
+ }
419
+ );
420
+ }
421
+ var defaultFormatDate = (iso) => {
422
+ const d = new Date(iso);
423
+ return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString();
424
+ };
425
+ var EMPTY_STATE = { title: "No facts yet" };
426
+ function FactsTable({
427
+ facts,
428
+ onTogglePin,
429
+ onToggleConfirmed,
430
+ onToggleShared,
431
+ onEdit,
432
+ onDelete,
433
+ onOpen,
434
+ getCreatorName,
435
+ formatDate = defaultFormatDate,
436
+ columnLabels,
437
+ isLoading,
438
+ gridId = "facts-table-v1",
439
+ height = "100%",
440
+ rowHeight = 52,
441
+ gridProps,
442
+ testId = "facts-table"
443
+ }) {
444
+ const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...columnLabels };
445
+ const columnDefs = react.useMemo(
446
+ () => createFactColumns({
447
+ onTogglePin,
448
+ renderHeader: (params) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12.5px] font-medium", children: params.displayName }),
449
+ renderRowActions: (fact) => onEdit && onDelete ? /* @__PURE__ */ jsxRuntime.jsx(FactRowActions, { onEdit: () => onEdit(fact), onDelete: () => onDelete(fact) }) : null,
450
+ renderLabels: (fact) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex flex-wrap items-center gap-1", children: (fact.tags ?? []).map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
451
+ "span",
452
+ {
453
+ className: "rounded-full bg-muted px-2 py-px text-xs text-muted-foreground",
454
+ children: tag.name
455
+ },
456
+ tag.name
457
+ )) }),
458
+ renderVerified: (fact) => /* @__PURE__ */ jsxRuntime.jsx(
459
+ FactSwitch,
460
+ {
461
+ checked: fact.confirmed,
462
+ label: l.verified,
463
+ onToggle: () => onToggleConfirmed(fact),
464
+ testId: `facts-grid-confirmed-${fact.external_id}`
465
+ }
466
+ ),
467
+ renderShared: (fact) => /* @__PURE__ */ jsxRuntime.jsx(
468
+ FactSwitch,
469
+ {
470
+ checked: fact.shared,
471
+ label: l.shared,
472
+ onToggle: () => onToggleShared(fact),
473
+ testId: `facts-grid-shared-${fact.external_id}`
474
+ }
475
+ ),
476
+ renderCreator: (fact, _params) => {
477
+ const name = getCreatorName?.(fact) ?? "";
478
+ return name ? /* @__PURE__ */ jsxRuntime.jsx(
479
+ "span",
480
+ {
481
+ title: name,
482
+ className: "inline-flex size-6 items-center justify-center rounded-full bg-muted text-[10px] font-medium text-muted-foreground",
483
+ children: chunkWJMEXTVD_cjs.initials(name)
484
+ }
485
+ ) : null;
486
+ },
487
+ getCreatorName: (params) => params.data ? getCreatorName?.(params.data) ?? "" : "",
488
+ formatDate,
489
+ labels: columnLabels
490
+ }),
491
+ [
492
+ onTogglePin,
493
+ onToggleConfirmed,
494
+ onToggleShared,
495
+ onEdit,
496
+ onDelete,
497
+ getCreatorName,
498
+ formatDate,
499
+ columnLabels,
500
+ l.verified,
501
+ l.shared
502
+ ]
503
+ );
504
+ return /* @__PURE__ */ jsxRuntime.jsx(
505
+ chunkLRUCMZK6_cjs.GridView,
506
+ {
507
+ testId,
508
+ items: facts,
509
+ columnDefs,
510
+ getItemId: (fact) => fact.external_id,
511
+ onRowClick: onOpen,
512
+ isLoading,
513
+ emptyState: EMPTY_STATE,
514
+ gridId,
515
+ height,
516
+ rowHeight,
517
+ ...gridProps,
518
+ gridOptions: { suppressClickEdit: true, ...gridProps?.gridOptions }
519
+ }
520
+ );
521
+ }
522
+
523
+ // src/facts/fact-row.ts
524
+ function toFactRow(record) {
525
+ return {
526
+ external_id: record.id,
527
+ text: record.text,
528
+ pinned: record.pinned ?? false,
529
+ confirmed: record.confirmed ?? false,
530
+ shared: record.shared ?? false,
531
+ date_start: record.dateStart ?? null,
532
+ date_end: record.dateEnd ?? null,
533
+ timezone: record.timezone ?? null,
534
+ tags: (record.tags ?? []).map((t) => typeof t === "string" ? { name: t } : t),
535
+ citations: record.citations ?? [],
536
+ created_by_ext_id: record.createdBy ?? null,
537
+ created_at: record.createdAt ?? null,
538
+ updated_at: record.updatedAt ?? null,
539
+ record
540
+ };
541
+ }
542
+ function toFactRows(records) {
543
+ return records.map(toFactRow);
544
+ }
545
+ var DEFAULT_FACT_LABELS_CELL_LABELS = {
546
+ edit: "Edit labels",
547
+ searchPlaceholder: "Search or create...",
548
+ create: (name) => `Create \u201C${name}\u201D`,
549
+ empty: "No labels yet"
550
+ };
551
+ var CHIP_ROW_H = 24;
552
+ var CHIP_GAP = 4;
553
+ var FactLabelsCell = react.memo(function FactLabelsCell2({
554
+ options,
555
+ selectedIds,
556
+ onChange,
557
+ onCreate,
558
+ rowHeight = 52,
559
+ labels,
560
+ testIds
561
+ }) {
562
+ const l = { ...DEFAULT_FACT_LABELS_CELL_LABELS, ...labels };
563
+ const [open, setOpen] = react.useState(false);
564
+ const [search, setSearch] = react.useState("");
565
+ const applied = react.useMemo(
566
+ () => new Set(selectedIds.filter((id) => options.some((o) => o.id === id))),
567
+ [selectedIds, options]
568
+ );
569
+ const toggle = (option) => onChange(
570
+ applied.has(option.id) ? selectedIds.filter((id) => id !== option.id) : [...selectedIds, option.id]
571
+ );
572
+ const createAndApply = async (name) => {
573
+ const trimmed = name.trim();
574
+ if (!trimmed) return;
575
+ const existing = options.find((o) => o.name.toLowerCase() === trimmed.toLowerCase());
576
+ if (existing) {
577
+ if (!applied.has(existing.id)) onChange([...selectedIds, existing.id]);
578
+ setSearch("");
579
+ return;
580
+ }
581
+ const id = await onCreate(trimmed);
582
+ if (id) onChange([...selectedIds, id]);
583
+ setSearch("");
584
+ };
585
+ const clampRows = Math.max(1, Math.floor((rowHeight + CHIP_GAP) / (CHIP_ROW_H + CHIP_GAP)));
586
+ const appliedOptions = options.filter((o) => applied.has(o.id));
587
+ const chipsRef = react.useRef(null);
588
+ const [hasOverflow, setHasOverflow] = react.useState(false);
589
+ react.useEffect(() => {
590
+ const el = chipsRef.current;
591
+ if (!el) return;
592
+ const measure = () => setHasOverflow(el.scrollHeight > el.clientHeight + 1);
593
+ measure();
594
+ return chunkPPCATBOY_cjs.observeResize(el, measure);
595
+ }, [applied, clampRows, rowHeight, options]);
596
+ const searchMatchesExisting = options.some(
597
+ (o) => o.name.toLowerCase() === search.trim().toLowerCase()
598
+ );
599
+ return /* @__PURE__ */ jsxRuntime.jsxs(
600
+ ui.Popover,
601
+ {
602
+ open,
603
+ onOpenChange: (next) => {
604
+ setOpen(next);
605
+ if (!next) setSearch("");
606
+ },
607
+ children: [
608
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
609
+ "button",
610
+ {
611
+ type: "button",
612
+ "aria-label": l.edit,
613
+ "data-slot": "fact-labels-cell",
614
+ className: "group relative flex h-full w-full min-w-0 cursor-pointer items-center gap-1 pr-4 text-left hover:bg-muted",
615
+ children: appliedOptions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 text-muted-foreground opacity-50", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PencilLine, { className: "size-3.5" }) }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
616
+ /* @__PURE__ */ jsxRuntime.jsx(
617
+ "div",
618
+ {
619
+ ref: chipsRef,
620
+ className: "flex min-w-0 flex-1 flex-wrap content-start gap-1 overflow-hidden",
621
+ style: { maxHeight: CHIP_ROW_H * clampRows + CHIP_GAP * (clampRows - 1) },
622
+ children: appliedOptions.map((o) => /* @__PURE__ */ jsxRuntime.jsxs(
623
+ "span",
624
+ {
625
+ className: "inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium",
626
+ title: o.name,
627
+ style: { borderColor: o.color },
628
+ children: [
629
+ /* @__PURE__ */ jsxRuntime.jsx(
630
+ "span",
631
+ {
632
+ className: "flex size-3.5 shrink-0 items-center justify-center rounded",
633
+ style: { backgroundColor: o.color },
634
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-2.5 text-white", strokeWidth: 3 })
635
+ }
636
+ ),
637
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[80px] truncate", children: o.name })
638
+ ]
639
+ },
640
+ o.id
641
+ ))
642
+ }
643
+ ),
644
+ hasOverflow && /* @__PURE__ */ jsxRuntime.jsx(
645
+ "span",
646
+ {
647
+ className: "pointer-events-none absolute bottom-0.5 right-0.5 text-xs font-semibold leading-none text-muted-foreground",
648
+ "aria-hidden": true,
649
+ children: "\u2026"
650
+ }
651
+ )
652
+ ] })
653
+ }
654
+ ) }),
655
+ open && /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverContent, { className: "w-[360px] p-0", align: "start", side: "bottom", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Command, { shouldFilter: true, children: [
656
+ /* @__PURE__ */ jsxRuntime.jsx(
657
+ ui.CommandInput,
658
+ {
659
+ placeholder: l.searchPlaceholder,
660
+ value: search,
661
+ onValueChange: setSearch,
662
+ onKeyDown: (e) => {
663
+ if (e.key === "Enter" && search.trim() && !searchMatchesExisting) {
664
+ e.preventDefault();
665
+ void createAndApply(search);
666
+ }
667
+ }
668
+ }
669
+ ),
670
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.CommandList, { children: [
671
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandEmpty, { children: search.trim() ? /* @__PURE__ */ jsxRuntime.jsx(
672
+ "button",
673
+ {
674
+ type: "button",
675
+ onClick: () => void createAndApply(search),
676
+ onPointerDown: (e) => e.preventDefault(),
677
+ className: "w-full cursor-pointer rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11",
678
+ children: l.create(search.trim())
679
+ }
680
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: l.empty }) }),
681
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: options.map((o) => {
682
+ const isApplied = applied.has(o.id);
683
+ return /* @__PURE__ */ jsxRuntime.jsxs(
684
+ ui.CommandItem,
685
+ {
686
+ value: o.name,
687
+ onSelect: () => toggle(o),
688
+ onPointerDown: (e) => e.preventDefault(),
689
+ className: "cursor-pointer pointer-coarse:min-h-11",
690
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.option?.(o.id), {
691
+ testId: `fact-label-select-${o.id}`
692
+ }),
693
+ children: [
694
+ /* @__PURE__ */ jsxRuntime.jsx(
695
+ "span",
696
+ {
697
+ className: "mr-2 flex size-4 shrink-0 items-center justify-center rounded border-2",
698
+ style: isApplied ? { borderColor: o.color, backgroundColor: o.color } : { borderColor: o.color },
699
+ children: isApplied && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-3 text-white", strokeWidth: 3 })
700
+ }
701
+ ),
702
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 text-sm", children: o.name })
703
+ ]
704
+ },
705
+ o.id
706
+ );
707
+ }) })
708
+ ] })
709
+ ] }) })
710
+ ]
711
+ }
712
+ );
713
+ });
714
+
715
+ // src/facts/timezone.ts
716
+ function detectTimezone() {
717
+ try {
718
+ return Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC";
719
+ } catch {
720
+ return "UTC";
721
+ }
722
+ }
723
+ function supportedTimezones() {
724
+ try {
725
+ const fn = Intl.supportedValuesOf;
726
+ return fn ? fn("timeZone") : [];
727
+ } catch {
728
+ return [];
729
+ }
730
+ }
731
+
732
+ // src/facts/fact-date.ts
733
+ var EMPTY_FACT_DATE_FIELDS = {
734
+ date: "",
735
+ time: "",
736
+ timezone: "",
737
+ endDate: "",
738
+ endTime: ""
739
+ };
740
+ function isMidnightUtc(d) {
741
+ return d.getUTCHours() === 0 && d.getUTCMinutes() === 0 && d.getUTCSeconds() === 0;
742
+ }
743
+ function isEndOfDayUtc(d) {
744
+ return d.getUTCHours() === 23 && d.getUTCMinutes() === 59;
745
+ }
746
+ function dayKeyUtc(d) {
747
+ return d.toISOString().slice(0, 10);
748
+ }
749
+ function safeTimeZone(tz) {
750
+ try {
751
+ new Intl.DateTimeFormat("en-US", { timeZone: tz });
752
+ return tz;
753
+ } catch {
754
+ return "UTC";
755
+ }
756
+ }
757
+ function isoToZonedParts(iso, timeZone) {
758
+ const d = new Date(iso);
759
+ const parts = Object.fromEntries(
760
+ new Intl.DateTimeFormat("en-US", {
761
+ timeZone: safeTimeZone(timeZone),
762
+ hourCycle: "h23",
763
+ year: "numeric",
764
+ month: "2-digit",
765
+ day: "2-digit",
766
+ hour: "2-digit",
767
+ minute: "2-digit"
768
+ }).formatToParts(d).map((p) => [p.type, p.value])
769
+ );
770
+ return {
771
+ date: `${parts.year}-${parts.month}-${parts.day}`,
772
+ time: `${parts.hour}:${parts.minute}`
773
+ };
774
+ }
775
+ function zonedPartsToIso(date, time, timeZone) {
776
+ const tz = safeTimeZone(timeZone);
777
+ const guess = /* @__PURE__ */ new Date(`${date}T${time}:00Z`);
778
+ const zoned = isoToZonedParts(guess.toISOString(), tz);
779
+ const [y, m, dd] = zoned.date.split("-").map(Number);
780
+ const [hh, mi] = zoned.time.split(":").map(Number);
781
+ const asIfUtc = Date.UTC(y, m - 1, dd, hh, mi);
782
+ const offsetMs = asIfUtc - guess.getTime();
783
+ return new Date(guess.getTime() - offsetMs).toISOString();
784
+ }
785
+ function factDateSpanToFields(dateStart, dateEnd, timezone) {
786
+ if (!dateStart) return EMPTY_FACT_DATE_FIELDS;
787
+ const start = new Date(dateStart);
788
+ if (Number.isNaN(start.getTime())) return EMPTY_FACT_DATE_FIELDS;
789
+ const end = dateEnd ? new Date(dateEnd) : start;
790
+ const dateOnly = isMidnightUtc(start) && (!dateEnd || isEndOfDayUtc(end));
791
+ if (dateOnly) {
792
+ const startKey = dayKeyUtc(start);
793
+ const endKey = dateEnd ? dayKeyUtc(end) : startKey;
794
+ return { ...EMPTY_FACT_DATE_FIELDS, date: startKey, endDate: endKey !== startKey ? endKey : "" };
795
+ }
796
+ const tz = timezone || "UTC";
797
+ const startParts = isoToZonedParts(dateStart, tz);
798
+ const isInstant = !dateEnd || dateStart === dateEnd;
799
+ const endParts = isInstant ? null : isoToZonedParts(dateEnd, tz);
800
+ return {
801
+ date: startParts.date,
802
+ time: startParts.time,
803
+ timezone: tz,
804
+ endDate: endParts?.date ?? "",
805
+ endTime: endParts?.time ?? ""
806
+ };
807
+ }
808
+ function factDateFieldsToSpan(fields) {
809
+ if (!fields.date) return { date: null, date_end: null, timezone: null };
810
+ const tz = fields.timezone || detectTimezone();
811
+ const startIso = fields.time ? zonedPartsToIso(fields.date, fields.time, tz) : `${fields.date}T00:00:00.000Z`;
812
+ let endIso;
813
+ if (fields.endDate) {
814
+ endIso = fields.time && fields.endTime ? zonedPartsToIso(fields.endDate, fields.endTime, tz) : `${fields.endDate}T23:59:59.000Z`;
815
+ } else {
816
+ endIso = fields.time ? startIso : `${fields.date}T23:59:59.000Z`;
817
+ }
818
+ return { date: startIso, date_end: endIso, timezone: fields.time ? tz : null };
819
+ }
820
+ var DEFAULT_FACT_DATE_INPUT_LABELS = {
821
+ weekdays: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
822
+ months: [
823
+ "January",
824
+ "February",
825
+ "March",
826
+ "April",
827
+ "May",
828
+ "June",
829
+ "July",
830
+ "August",
831
+ "September",
832
+ "October",
833
+ "November",
834
+ "December"
835
+ ],
836
+ previousMonth: "Previous month",
837
+ earlierYears: "Earlier years",
838
+ nextMonth: "Next month",
839
+ laterYears: "Later years",
840
+ pickYear: "Pick a year",
841
+ addDate: "Add a date",
842
+ startTime: "Start time",
843
+ endTime: "End time",
844
+ setStartFirst: "Set a start time first",
845
+ timezone: "Timezone",
846
+ endDate: "End date (optional)",
847
+ clearDate: "Clear date"
848
+ };
849
+ function dayKey(year, monthIndex, day) {
850
+ const m = String(monthIndex + 1).padStart(2, "0");
851
+ const d = String(day).padStart(2, "0");
852
+ return `${year}-${m}-${d}`;
853
+ }
854
+ function prettyDay(iso) {
855
+ const [y, m, d] = iso.split("-").map(Number);
856
+ if (!y || !m || !d) return iso;
857
+ return new Date(Date.UTC(y, m - 1, d)).toLocaleDateString(void 0, {
858
+ year: "numeric",
859
+ month: "short",
860
+ day: "numeric",
861
+ timeZone: "UTC"
862
+ });
863
+ }
864
+ function summarizeWithTimes(v) {
865
+ const start = `${prettyDay(v.date)}, ${v.time}`;
866
+ const endDay = v.endDate || v.date;
867
+ if (v.endTime) return `${start} \u2013 ${prettyDay(endDay)}, ${v.endTime}`;
868
+ if (v.endDate && v.endDate !== v.date) return `${start} \u2013 ${prettyDay(v.endDate)}`;
869
+ return start;
870
+ }
871
+ function MonthCalendar({
872
+ selected,
873
+ onSelect,
874
+ labels: l,
875
+ testIds
876
+ }) {
877
+ const now = /* @__PURE__ */ new Date();
878
+ const todayKey = dayKey(now.getFullYear(), now.getMonth(), now.getDate());
879
+ const initial = react.useMemo(() => {
880
+ if (selected) {
881
+ const [y, m] = selected.split("-").map(Number);
882
+ if (y && m) return { year: y, monthIndex: m - 1 };
883
+ }
884
+ return { year: now.getFullYear(), monthIndex: now.getMonth() };
885
+ }, []);
886
+ const [view, setView] = react.useState(initial);
887
+ const [mode, setMode] = react.useState("days");
888
+ const [yearStart, setYearStart] = react.useState(initial.year - 5);
889
+ const firstWeekday = new Date(view.year, view.monthIndex, 1).getDay();
890
+ const daysInMonth = new Date(view.year, view.monthIndex + 1, 0).getDate();
891
+ const cells = [
892
+ ...Array.from({ length: firstWeekday }, () => null),
893
+ ...Array.from({ length: daysInMonth }, (_, i) => i + 1)
894
+ ];
895
+ const step = (delta) => {
896
+ const next = view.monthIndex + delta;
897
+ setView({
898
+ year: view.year + Math.floor(next / 12),
899
+ monthIndex: (next % 12 + 12) % 12
900
+ });
901
+ };
902
+ const openYears = () => {
903
+ setYearStart(view.year - 5);
904
+ setMode("years");
905
+ };
906
+ const pickYear = (year) => {
907
+ setView((v) => ({ ...v, year }));
908
+ setMode("days");
909
+ };
910
+ const years = Array.from({ length: 12 }, (_, i) => yearStart + i);
911
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-[248px]", children: [
912
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-1 pb-2", children: [
913
+ /* @__PURE__ */ jsxRuntime.jsx(
914
+ "button",
915
+ {
916
+ type: "button",
917
+ onClick: () => mode === "days" ? step(-1) : setYearStart((s) => s - 12),
918
+ className: "rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground pointer-coarse:p-3",
919
+ "aria-label": mode === "days" ? l.previousMonth : l.earlierYears,
920
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "size-4" })
921
+ }
922
+ ),
923
+ mode === "days" ? /* @__PURE__ */ jsxRuntime.jsxs(
924
+ "button",
925
+ {
926
+ type: "button",
927
+ onClick: openYears,
928
+ className: "rounded px-1.5 py-0.5 text-sm font-medium hover:bg-accent hover:text-foreground",
929
+ "aria-label": l.pickYear,
930
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.caption, { testId: "fact-calendar-caption" }),
931
+ children: [
932
+ l.months[view.monthIndex],
933
+ " ",
934
+ view.year
935
+ ]
936
+ }
937
+ ) : /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium", children: [
938
+ yearStart,
939
+ " \u2013 ",
940
+ yearStart + 11
941
+ ] }),
942
+ /* @__PURE__ */ jsxRuntime.jsx(
943
+ "button",
944
+ {
945
+ type: "button",
946
+ onClick: () => mode === "days" ? step(1) : setYearStart((s) => s + 12),
947
+ className: "rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground pointer-coarse:p-3",
948
+ "aria-label": mode === "days" ? l.nextMonth : l.laterYears,
949
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-4" })
950
+ }
951
+ )
952
+ ] }),
953
+ mode === "days" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-7 gap-0.5", children: [
954
+ l.weekdays.map((w) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-1 text-center text-xs font-medium text-muted-foreground", children: w }, w)),
955
+ cells.map((day, i) => {
956
+ if (day === null) return /* @__PURE__ */ jsxRuntime.jsx("div", {}, `blank-${i}`);
957
+ const key = dayKey(view.year, view.monthIndex, day);
958
+ const isSelected = key === selected;
959
+ const isToday = key === todayKey;
960
+ return /* @__PURE__ */ jsxRuntime.jsx(
961
+ "button",
962
+ {
963
+ type: "button",
964
+ onClick: () => onSelect(key),
965
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.day?.(key), { testId: `fact-calendar-day-${key}` }),
966
+ className: ui.cn(
967
+ "h-8 rounded text-xs transition-colors hover:bg-accent pointer-coarse:h-11",
968
+ isSelected && "bg-primary text-primary-foreground hover:bg-primary",
969
+ !isSelected && isToday && "ring-1 ring-inset ring-primary/50"
970
+ ),
971
+ children: day
972
+ },
973
+ key
974
+ );
975
+ })
976
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-1", children: years.map((y) => /* @__PURE__ */ jsxRuntime.jsx(
977
+ "button",
978
+ {
979
+ type: "button",
980
+ onClick: () => pickYear(y),
981
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.year?.(y), { testId: `fact-calendar-year-${y}` }),
982
+ className: ui.cn(
983
+ "h-9 rounded text-xs transition-colors hover:bg-accent pointer-coarse:h-11",
984
+ y === view.year && "bg-primary text-primary-foreground hover:bg-primary"
985
+ ),
986
+ children: y
987
+ },
988
+ y
989
+ )) })
990
+ ] });
991
+ }
992
+ function FactDateInput({ value, onChange, idPrefix, labels, testIds }) {
993
+ const l = { ...DEFAULT_FACT_DATE_INPUT_LABELS, ...labels };
994
+ const [open, setOpen] = react.useState(false);
995
+ const timezones = react.useMemo(() => supportedTimezones(), []);
996
+ const timezoneListId = `${idPrefix}-timezone-options`;
997
+ const span = factDateFieldsToSpan(value);
998
+ const summary = value.time || value.endTime ? summarizeWithTimes(value) : chunkVPPX5XUF_cjs.formatSpan(span.date, span.date_end, span.timezone);
999
+ const setDate = (dateKey) => onChange({ ...value, date: dateKey, endDate: value.endDate && dateKey ? value.endDate : "" });
1000
+ const setStartTime = (time) => onChange({
1001
+ ...value,
1002
+ time,
1003
+ timezone: time ? value.timezone || detectTimezone() : "",
1004
+ endTime: time ? value.endTime : ""
1005
+ });
1006
+ const setEndTime = (endTime) => onChange({
1007
+ ...value,
1008
+ endTime,
1009
+ endDate: endTime ? value.endDate || value.date : value.endDate
1010
+ });
1011
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-1.5", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open, onOpenChange: setOpen, children: [
1012
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
1013
+ "button",
1014
+ {
1015
+ type: "button",
1016
+ className: ui.cn(
1017
+ "inline-flex h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-3 text-sm transition-colors hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
1018
+ !summary && "text-muted-foreground"
1019
+ ),
1020
+ "data-testid": `${idPrefix}-date-trigger`,
1021
+ children: [
1022
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarDays, { className: "size-4 shrink-0 text-muted-foreground" }),
1023
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: summary || l.addDate })
1024
+ ]
1025
+ }
1026
+ ) }),
1027
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.PopoverContent, { className: "w-auto p-3", align: "start", children: [
1028
+ /* @__PURE__ */ jsxRuntime.jsx(MonthCalendar, { selected: value.date, onSelect: setDate, labels: l, testIds }),
1029
+ value.date && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 flex flex-col gap-2 border-t border-border pt-3", children: [
1030
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
1031
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1", children: [
1032
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-muted-foreground", children: l.startTime }),
1033
+ /* @__PURE__ */ jsxRuntime.jsx(
1034
+ ui.Input,
1035
+ {
1036
+ type: "time",
1037
+ value: value.time,
1038
+ onChange: (e) => setStartTime(e.target.value),
1039
+ className: "h-8 text-xs",
1040
+ "data-testid": `${idPrefix}-time`
1041
+ }
1042
+ )
1043
+ ] }),
1044
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1", children: [
1045
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-muted-foreground", children: l.endTime }),
1046
+ /* @__PURE__ */ jsxRuntime.jsx(
1047
+ ui.Input,
1048
+ {
1049
+ type: "time",
1050
+ value: value.endTime,
1051
+ onChange: (e) => setEndTime(e.target.value),
1052
+ disabled: !value.time,
1053
+ title: value.time ? void 0 : l.setStartFirst,
1054
+ className: "h-8 text-xs",
1055
+ "data-testid": `${idPrefix}-end-time`
1056
+ }
1057
+ )
1058
+ ] })
1059
+ ] }),
1060
+ value.time && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1", children: [
1061
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-muted-foreground", children: l.timezone }),
1062
+ /* @__PURE__ */ jsxRuntime.jsx(
1063
+ ui.Input,
1064
+ {
1065
+ list: timezoneListId,
1066
+ value: value.timezone,
1067
+ onChange: (e) => onChange({ ...value, timezone: e.target.value }),
1068
+ placeholder: detectTimezone(),
1069
+ className: "h-8 text-xs",
1070
+ "data-testid": `${idPrefix}-timezone`
1071
+ }
1072
+ ),
1073
+ /* @__PURE__ */ jsxRuntime.jsx("datalist", { id: timezoneListId, children: timezones.map((tz) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: tz }, tz)) })
1074
+ ] }),
1075
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1", children: [
1076
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-muted-foreground", children: l.endDate }),
1077
+ /* @__PURE__ */ jsxRuntime.jsx(
1078
+ ui.Input,
1079
+ {
1080
+ type: "date",
1081
+ value: value.endDate,
1082
+ min: value.date,
1083
+ onChange: (e) => onChange({ ...value, endDate: e.target.value }),
1084
+ className: "h-8 text-xs",
1085
+ "data-testid": `${idPrefix}-end-date`
1086
+ }
1087
+ )
1088
+ ] }),
1089
+ /* @__PURE__ */ jsxRuntime.jsxs(
1090
+ ui.Button,
1091
+ {
1092
+ type: "button",
1093
+ variant: "ghost",
1094
+ size: "sm",
1095
+ className: "h-7 self-start text-muted-foreground hover:text-foreground",
1096
+ onClick: () => onChange(EMPTY_FACT_DATE_FIELDS),
1097
+ "data-testid": `${idPrefix}-clear-date`,
1098
+ children: [
1099
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "mr-1 size-3.5" }),
1100
+ " ",
1101
+ l.clearDate
1102
+ ]
1103
+ }
1104
+ )
1105
+ ] })
1106
+ ] })
1107
+ ] }) });
1108
+ }
1109
+ var DEFAULT_FACT_PASSAGES_LABELS = {
1110
+ loading: "Loading passage\u2026",
1111
+ close: "Close"
1112
+ };
1113
+ function toPreviewLine(md) {
1114
+ return md.replace(/`{1,3}([^`]*)`{1,3}/g, "$1").replace(/!\[[^\]]*\]\([^)]*\)/g, "").replace(/\[([^\]]*)\]\([^)]*\)/g, "$1").replace(/^[>\s]*#{1,6}\s*/gm, "").replace(/^[>\s]*[-*+]\s+/gm, "").replace(/[*_~]/g, "").replace(/\|/g, " ").replace(/\s+/g, " ").trim();
1115
+ }
1116
+ var SUP_SUB_RE = /<(sup|sub)>([\s\S]*?)<\/\1>/gi;
1117
+ var STRAY_SUP_SUB_RE = /<\/?(?:sup|sub)>/gi;
1118
+ var stripStrayTags = (s) => s.replace(STRAY_SUP_SUB_RE, "");
1119
+ function renderPreviewInline(line) {
1120
+ const nodes = [];
1121
+ let last = 0;
1122
+ let key = 0;
1123
+ for (const m of line.matchAll(SUP_SUB_RE)) {
1124
+ const start = m.index ?? 0;
1125
+ if (start > last) nodes.push(stripStrayTags(line.slice(last, start)));
1126
+ const inner = stripStrayTags(m[2]);
1127
+ nodes.push(
1128
+ m[1].toLowerCase() === "sup" ? /* @__PURE__ */ jsxRuntime.jsx("sup", { children: inner }, key++) : /* @__PURE__ */ jsxRuntime.jsx("sub", { children: inner }, key++)
1129
+ );
1130
+ last = start + m[0].length;
1131
+ }
1132
+ if (last < line.length) nodes.push(stripStrayTags(line.slice(last)));
1133
+ return nodes;
1134
+ }
1135
+ function FactPassageItem({
1136
+ index,
1137
+ page,
1138
+ excerpt,
1139
+ isViewing,
1140
+ onSelect,
1141
+ testId,
1142
+ className,
1143
+ labels
1144
+ }) {
1145
+ const l = { ...DEFAULT_FACT_PASSAGES_LABELS, ...labels };
1146
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1147
+ "button",
1148
+ {
1149
+ type: "button",
1150
+ onClick: onSelect,
1151
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "fact-source-passage" }),
1152
+ "aria-current": isViewing || void 0,
1153
+ className: ui.cn(
1154
+ "flex w-full items-start gap-2 rounded px-2 py-1.5 text-left text-xs transition-colors pointer-coarse:min-h-11",
1155
+ isViewing ? "bg-ai-soft text-foreground ring-1 ring-ai-accent/40" : "bg-ai-soft/60 text-foreground hover:bg-ai-soft",
1156
+ className
1157
+ ),
1158
+ children: [
1159
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-0.5 shrink-0 rounded bg-muted px-1 py-0.5 font-mono text-xs text-muted-foreground", children: [
1160
+ index + 1,
1161
+ "."
1162
+ ] }),
1163
+ page != null && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-0.5 shrink-0 rounded-full bg-muted px-1.5 py-0.5 font-mono text-xs text-muted-foreground", children: [
1164
+ "p.",
1165
+ page
1166
+ ] }),
1167
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap", children: excerpt ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1168
+ "\u201C",
1169
+ renderPreviewInline(toPreviewLine(excerpt)),
1170
+ "\u201D"
1171
+ ] }) : l.loading })
1172
+ ]
1173
+ }
1174
+ );
1175
+ }
1176
+ function FactSourcesPanel({
1177
+ title,
1178
+ onClose,
1179
+ container,
1180
+ children,
1181
+ labels,
1182
+ testIds
1183
+ }) {
1184
+ const l = { ...DEFAULT_FACT_PASSAGES_LABELS, ...labels };
1185
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1186
+ ui.PopoverContent,
1187
+ {
1188
+ align: "start",
1189
+ side: "bottom",
1190
+ sideOffset: 4,
1191
+ collisionPadding: 16,
1192
+ container,
1193
+ collisionBoundary: container ?? void 0,
1194
+ onInteractOutside: (e) => {
1195
+ const target = e.detail.originalEvent.target;
1196
+ if (target?.closest(
1197
+ '[data-testid="parsed-viewer"], [role="dialog"], [data-radix-popper-content-wrapper]'
1198
+ )) {
1199
+ e.preventDefault();
1200
+ }
1201
+ },
1202
+ className: "w-[34rem] max-w-[var(--radix-popover-content-available-width)] p-0 data-[state=closed]:animate-none",
1203
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.popover, { testId: "fact-sources-popover" }),
1204
+ "data-slot": "fact-sources-panel",
1205
+ children: [
1206
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sticky top-0 z-10 flex items-center justify-between gap-2 border-b border-border bg-popover px-3 py-2", children: [
1207
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold text-muted-foreground", children: title }),
1208
+ /* @__PURE__ */ jsxRuntime.jsx(
1209
+ "button",
1210
+ {
1211
+ type: "button",
1212
+ "aria-label": l.close,
1213
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.close, { testId: "fact-sources-close" }),
1214
+ onClick: onClose,
1215
+ className: "-m-1.5 flex shrink-0 items-center justify-center rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground pointer-coarse:p-3",
1216
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-3.5" })
1217
+ }
1218
+ )
1219
+ ] }),
1220
+ /* @__PURE__ */ jsxRuntime.jsx(
1221
+ "div",
1222
+ {
1223
+ className: "flex max-h-[min(60vh,var(--radix-popover-content-available-height))] flex-col gap-2 overflow-y-auto p-1.5",
1224
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.list, { testId: "fact-sources-list" }),
1225
+ children
1226
+ }
1227
+ )
1228
+ ]
1229
+ }
1230
+ );
1231
+ }
1232
+ var DEFAULT_FACT_SOURCE_GROUP_LABELS = {
1233
+ remove: "Remove this document",
1234
+ wholeDocument: "Whole document \u2014 open it to cite specific passages"
1235
+ };
1236
+ function FactSourceGroup({
1237
+ docId,
1238
+ document,
1239
+ isViewing,
1240
+ onRemove,
1241
+ children,
1242
+ hasPassages,
1243
+ labels,
1244
+ testIds
1245
+ }) {
1246
+ const l = { ...DEFAULT_FACT_SOURCE_GROUP_LABELS, ...labels };
1247
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1248
+ "div",
1249
+ {
1250
+ className: "flex flex-col gap-1",
1251
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.root?.(docId), { testId: `citation-doc-${docId}` }),
1252
+ "data-viewing": isViewing || void 0,
1253
+ "data-slot": "fact-source-group",
1254
+ children: [
1255
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 px-1 text-sm", children: [
1256
+ document,
1257
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1" }),
1258
+ /* @__PURE__ */ jsxRuntime.jsx(
1259
+ "button",
1260
+ {
1261
+ type: "button",
1262
+ onClick: onRemove,
1263
+ "aria-label": l.remove,
1264
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.remove?.(docId), {
1265
+ testId: `fact-source-remove-${docId}`
1266
+ }),
1267
+ className: "shrink-0 rounded p-0.5 hover:bg-destructive/20 hover:text-destructive pointer-coarse:p-3",
1268
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-3" })
1269
+ }
1270
+ )
1271
+ ] }),
1272
+ hasPassages ? children : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-2 text-xs text-muted-foreground", children: l.wholeDocument })
1273
+ ]
1274
+ }
1275
+ );
1276
+ }
1277
+ var DEFAULT_FACTS_VIEW_TOGGLE_LABELS = {
1278
+ table: "Table",
1279
+ calendar: "Calendar",
1280
+ timeline: "Timeline",
1281
+ smartSearch: "Smart Search"
1282
+ };
1283
+ var createOptions = (l) => [
1284
+ { value: "table", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Table2, { className: "size-3.5" }), label: l.table },
1285
+ { value: "calendar", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarRange, { className: "size-3.5" }), label: l.calendar },
1286
+ { value: "gantt", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.GanttChartSquare, { className: "size-3.5" }), label: l.timeline },
1287
+ // Facts-only semantic/keyword recall — mirrors the Files "Smart Search" view
1288
+ // (same Search icon + label), but searches this workspace's facts, not docs.
1289
+ { value: "smart_search", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "size-3.5" }), label: l.smartSearch }
1290
+ ];
1291
+ function FactsViewToggle({
1292
+ viewMode,
1293
+ onChange,
1294
+ collapsed = false,
1295
+ labels,
1296
+ testIdPrefix,
1297
+ testIds
1298
+ }) {
1299
+ const options = createOptions({ ...DEFAULT_FACTS_VIEW_TOGGLE_LABELS, ...labels }).map((o) => ({
1300
+ ...o,
1301
+ testId: testIds?.[o.value]
1302
+ }));
1303
+ return /* @__PURE__ */ jsxRuntime.jsx(
1304
+ chunkLRUCMZK6_cjs.ViewToggle,
1305
+ {
1306
+ options,
1307
+ value: viewMode,
1308
+ onChange: (value) => onChange(value),
1309
+ testIdPrefix: chunkMHVNT4J3_cjs.testIdOr(testIdPrefix, { testId: "facts-layout" }),
1310
+ showLabels: !collapsed,
1311
+ size: "sm"
1312
+ }
1313
+ );
1314
+ }
1315
+ var FACTS_SEARCH_FIELD_OPTIONS = [
1316
+ { value: "text", label: "Fact" },
1317
+ { value: "labels", label: "Labels" }
1318
+ ];
1319
+ var DEFAULT_FACTS_FILTER_INPUT_LABELS = {
1320
+ placeholder: "Filter...",
1321
+ clear: "Clear filter",
1322
+ chooseFields: "Choose fields to filter",
1323
+ fieldsHeading: "Filter fields",
1324
+ fieldNames: { text: "Fact", labels: "Labels" }
1325
+ };
1326
+ function FactsFilterInput({
1327
+ value,
1328
+ onChange,
1329
+ fields,
1330
+ onFieldsChange,
1331
+ filter,
1332
+ className,
1333
+ labels,
1334
+ testIds
1335
+ }) {
1336
+ const l = { ...DEFAULT_FACTS_FILTER_INPUT_LABELS, ...labels };
1337
+ const toggleField = (field) => onFieldsChange(fields.includes(field) ? fields.filter((f) => f !== field) : [...fields, field]);
1338
+ return /* @__PURE__ */ jsxRuntime.jsx(
1339
+ "div",
1340
+ {
1341
+ className: ui.cn("flex min-w-0 items-center", className ?? "w-44 pointer-coarse:w-56"),
1342
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "facts-filter" }),
1343
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex-1 min-w-0", children: [
1344
+ filter ? /* @__PURE__ */ jsxRuntime.jsx(
1345
+ "div",
1346
+ {
1347
+ className: "absolute left-1 top-1/2 z-10 -translate-y-1/2",
1348
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.quick, { testId: "facts-filter-quick" }),
1349
+ children: filter
1350
+ }
1351
+ ) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Filter, { className: "pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
1352
+ /* @__PURE__ */ jsxRuntime.jsx(
1353
+ ui.Input,
1354
+ {
1355
+ value,
1356
+ onChange: (e) => onChange(e.target.value),
1357
+ placeholder: l.placeholder,
1358
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.input, { testId: "facts-filter-input" }),
1359
+ className: ui.cn(
1360
+ "h-7 bg-muted pr-12 text-sm shadow-none focus-visible:bg-muted focus-visible:ring-0 pointer-coarse:h-11 pointer-coarse:pr-24",
1361
+ filter ? "pl-11" : "pl-7"
1362
+ )
1363
+ }
1364
+ ),
1365
+ value && /* @__PURE__ */ jsxRuntime.jsx(
1366
+ "button",
1367
+ {
1368
+ type: "button",
1369
+ onClick: () => onChange(""),
1370
+ "aria-label": l.clear,
1371
+ className: "absolute right-7 top-1/2 z-10 -translate-y-1/2 text-muted-foreground hover:text-foreground pointer-coarse:right-11 pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center",
1372
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-3" })
1373
+ }
1374
+ ),
1375
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { children: [
1376
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
1377
+ "button",
1378
+ {
1379
+ type: "button",
1380
+ "aria-label": l.chooseFields,
1381
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.fieldsButton, {
1382
+ testId: "facts-filter-fields-button"
1383
+ }),
1384
+ className: "absolute right-1.5 top-1/2 z-10 -translate-y-1/2 !h-5 !w-5 !p-0 text-muted-foreground/60 transition-colors hover:text-foreground pointer-coarse:right-0 pointer-coarse:!flex pointer-coarse:!h-11 pointer-coarse:!w-11 pointer-coarse:items-center pointer-coarse:justify-center",
1385
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SlidersHorizontal, { className: "size-3.5" })
1386
+ }
1387
+ ) }),
1388
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverContent, { className: "w-44 p-0", align: "end", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Command, { shouldFilter: false, children: /* @__PURE__ */ jsxRuntime.jsx(ui.CommandList, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { heading: l.fieldsHeading, children: FACTS_SEARCH_FIELD_OPTIONS.map((option) => {
1389
+ const isSelected = fields.includes(option.value);
1390
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1391
+ ui.CommandItem,
1392
+ {
1393
+ onSelect: () => toggleField(option.value),
1394
+ className: "cursor-pointer text-sm",
1395
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.field?.(option.value), {
1396
+ testId: `facts-filter-field-${option.value}`
1397
+ }),
1398
+ children: [
1399
+ /* @__PURE__ */ jsxRuntime.jsx(
1400
+ "div",
1401
+ {
1402
+ className: ui.cn(
1403
+ "mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary",
1404
+ isSelected ? "bg-primary text-primary-foreground" : "opacity-50 [&_svg]:invisible"
1405
+ ),
1406
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-3" })
1407
+ }
1408
+ ),
1409
+ l.fieldNames[option.value]
1410
+ ]
1411
+ },
1412
+ option.value
1413
+ );
1414
+ }) }) }) }) })
1415
+ ] })
1416
+ ] })
1417
+ }
1418
+ );
1419
+ }
1420
+ var DEFAULT_FACTS_FIELDS_BUTTON_LABELS = {
1421
+ fields: "Fields",
1422
+ defaultView: "Default view",
1423
+ columns: "Columns",
1424
+ columnNames: { pinned: "Pinned" }
1425
+ };
1426
+ function FactsFieldsButton({
1427
+ getGridApi,
1428
+ labels,
1429
+ testIds
1430
+ }) {
1431
+ const l = { ...DEFAULT_FACTS_FIELDS_BUTTON_LABELS, ...labels };
1432
+ const [open, setOpen] = react.useState(false);
1433
+ const [version, setVersion] = react.useState(0);
1434
+ const columns = react.useMemo(() => {
1435
+ if (!open) return [];
1436
+ const api = getGridApi();
1437
+ if (!api || api.isDestroyed()) return [];
1438
+ const state = api.getColumnState();
1439
+ return state.filter((c) => c.colId !== "ag-Grid-SelectionColumn").map((c) => {
1440
+ const def = api.getColumnDef(c.colId);
1441
+ const label = def?.headerName && def.headerName.trim() || l.columnNames[c.colId] || c.colId;
1442
+ return { colId: c.colId, label, visible: !c.hide };
1443
+ });
1444
+ }, [open, version, getGridApi, l.columnNames]);
1445
+ const visibleCount = columns.filter((c) => c.visible).length;
1446
+ const toggle = (colId, visible) => {
1447
+ const api = getGridApi();
1448
+ if (!api || api.isDestroyed()) return;
1449
+ if (visible && visibleCount <= 1) return;
1450
+ api.setColumnsVisible([colId], !visible);
1451
+ setVersion((v) => v + 1);
1452
+ };
1453
+ const resetToDefault = () => {
1454
+ const api = getGridApi();
1455
+ if (!api || api.isDestroyed()) return;
1456
+ api.resetColumnState();
1457
+ setVersion((v) => v + 1);
1458
+ };
1459
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open, onOpenChange: setOpen, children: [
1460
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
1461
+ ui.Button,
1462
+ {
1463
+ variant: "ghost",
1464
+ size: "sm",
1465
+ className: "h-7 px-2 text-sm gap-1.5 text-muted-foreground hover:text-foreground font-light!",
1466
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.trigger, { testId: "facts-fields-trigger" }),
1467
+ children: [
1468
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Columns3, { className: "size-3.5" }),
1469
+ l.fields,
1470
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "size-3" })
1471
+ ]
1472
+ }
1473
+ ) }),
1474
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverContent, { className: "w-[220px] p-0", align: "end", side: "bottom", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Command, { shouldFilter: false, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.CommandList, { className: "max-h-[60dvh]", children: [
1475
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs(
1476
+ ui.CommandItem,
1477
+ {
1478
+ onSelect: resetToDefault,
1479
+ className: "cursor-pointer text-sm text-muted-foreground",
1480
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.defaultView, {
1481
+ testId: "facts-fields-default-view"
1482
+ }),
1483
+ children: [
1484
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCcw, { className: "mr-2 size-3.5" }),
1485
+ l.defaultView
1486
+ ]
1487
+ }
1488
+ ) }),
1489
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandSeparator, {}),
1490
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { heading: l.columns, children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsxs(
1491
+ ui.CommandItem,
1492
+ {
1493
+ onSelect: () => toggle(col.colId, col.visible),
1494
+ className: "cursor-pointer text-sm",
1495
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.toggle?.(col.colId), {
1496
+ testId: `facts-fields-toggle-${col.colId}`
1497
+ }),
1498
+ children: [
1499
+ /* @__PURE__ */ jsxRuntime.jsx(
1500
+ "div",
1501
+ {
1502
+ className: ui.cn(
1503
+ "mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary",
1504
+ col.visible ? "bg-primary text-primary-foreground" : "opacity-50 [&_svg]:invisible"
1505
+ ),
1506
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-3" })
1507
+ }
1508
+ ),
1509
+ col.label
1510
+ ]
1511
+ },
1512
+ col.colId
1513
+ )) })
1514
+ ] }) }) })
1515
+ ] });
1516
+ }
1517
+ var DEFAULT_FACT_TIMELINE_LABELS = {
1518
+ ganttEmpty: "Give a fact a date and it appears here."
1519
+ };
1520
+ function FactsCalendar({
1521
+ facts,
1522
+ onSelect,
1523
+ selectedId,
1524
+ navigatorContainer,
1525
+ navigatorTotal,
1526
+ testId
1527
+ }) {
1528
+ const calendarTestId = chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "facts-calendar" });
1529
+ const items = react.useMemo(
1530
+ () => facts.filter((f) => f.date_start).map((f) => ({
1531
+ id: f.external_id,
1532
+ label: f.text,
1533
+ start: f.date_start,
1534
+ end: f.date_end,
1535
+ fact: f
1536
+ })),
1537
+ [facts]
1538
+ );
1539
+ const rootRef = react.useRef(null);
1540
+ const entryId = chunkMHVNT4J3_cjs.testIdOr(testId && `${testId}-entry-${selectedId}`, {
1541
+ testId: `facts-calendar-entry-${selectedId}`
1542
+ });
1543
+ react.useEffect(() => {
1544
+ const root = rootRef.current;
1545
+ if (!root) return;
1546
+ root.querySelectorAll(".fact-cal-selected").forEach((el) => el.classList.remove("fact-cal-selected"));
1547
+ if (!selectedId) return;
1548
+ root.querySelectorAll(`[data-testid="${entryId}"]`).forEach((el) => el.classList.add("fact-cal-selected"));
1549
+ }, [selectedId, items, entryId]);
1550
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: rootRef, className: "h-full border-t border-border", "data-slot": "facts-calendar", children: /* @__PURE__ */ jsxRuntime.jsx(
1551
+ chunkVPPX5XUF_cjs.TimelineCalendar,
1552
+ {
1553
+ items,
1554
+ testId: calendarTestId,
1555
+ maxLanes: Infinity,
1556
+ selectedIds: selectedId ? [selectedId] : [],
1557
+ onSelect: (item) => onSelect?.(item.fact),
1558
+ navigatorContainer,
1559
+ navigatorTotal
1560
+ }
1561
+ ) });
1562
+ }
1563
+ function FactsGanttPane({
1564
+ testId,
1565
+ emptyMessage,
1566
+ labels,
1567
+ ...props
1568
+ }) {
1569
+ const l = { ...DEFAULT_FACT_TIMELINE_LABELS, ...labels };
1570
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "facts-gantt h-full border-t border-border", "data-slot": "facts-gantt", children: /* @__PURE__ */ jsxRuntime.jsx(
1571
+ chunkVPPX5XUF_cjs.TimelineGantt,
1572
+ {
1573
+ testId: chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "gantt" }),
1574
+ emptyMessage: emptyMessage ?? l.ganttEmpty,
1575
+ ...props
1576
+ }
1577
+ ) });
1578
+ }
1579
+ var DEFAULT_FACTS_EMPTY_STATE_LABELS = {
1580
+ title: "Everything this workspace knows",
1581
+ intro: "Facts are durable knowledge \u2014 a deadline, a decision, a preference. Write them yourself, or let the assistant distill them from your documents and chats.",
1582
+ tryAdding: "Try adding a fact",
1583
+ kinds: [
1584
+ {
1585
+ label: "Deadlines & dates",
1586
+ desc: "A due date or milestone \u2014 it lands on the calendar and timeline"
1587
+ },
1588
+ { label: "Decisions", desc: "What was agreed, and why \u2014 so it is not lost in a thread" },
1589
+ { label: "Preferences", desc: "How this workspace likes things done" }
1590
+ ],
1591
+ examples: [
1592
+ "The renewal deadline is March 31, 2026",
1593
+ "Payment terms are net 30",
1594
+ "The team prefers email over phone for updates",
1595
+ "Board approved the Q3 budget on May 12"
1596
+ ],
1597
+ loading: "Loading facts\u2026",
1598
+ loadError: "Could not load facts.",
1599
+ retry: "Try again"
1600
+ };
1601
+ var KIND_ICONS = [lucideReact.CalendarClock, lucideReact.Scale, lucideReact.Lightbulb];
1602
+ function FactsEmptyState({ onUseExample, labels, testIds }) {
1603
+ const l = { ...DEFAULT_FACTS_EMPTY_STATE_LABELS, ...labels };
1604
+ return /* @__PURE__ */ jsxRuntime.jsx(
1605
+ "div",
1606
+ {
1607
+ className: "flex min-h-full items-center justify-center p-10",
1608
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "facts-page-empty-state" }),
1609
+ "data-slot": "facts-empty-state",
1610
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full max-w-xl text-center", children: [
1611
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto mb-4 flex size-12 items-center justify-center rounded-lg bg-accent text-accent-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Milestone, { className: "size-6" }) }),
1612
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "mt-2 text-xl font-semibold text-foreground", children: l.title }),
1613
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: l.intro }),
1614
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-7 grid gap-3 text-left sm:grid-cols-3", children: l.kinds.map(({ label, desc }, i) => {
1615
+ const KindIcon = KIND_ICONS[i % KIND_ICONS.length];
1616
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg bg-muted p-3", children: [
1617
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-sm font-medium text-foreground", children: [
1618
+ /* @__PURE__ */ jsxRuntime.jsx(KindIcon, { className: "size-4 text-primary" }),
1619
+ label
1620
+ ] }),
1621
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs leading-snug text-muted-foreground", children: desc })
1622
+ ] }, label);
1623
+ }) }),
1624
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-10 text-xs font-medium uppercase tracking-wide text-muted-foreground", children: l.tryAdding }),
1625
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 flex flex-wrap justify-center gap-2.5", children: l.examples.map((fact) => /* @__PURE__ */ jsxRuntime.jsxs(
1626
+ "button",
1627
+ {
1628
+ type: "button",
1629
+ onClick: () => onUseExample(fact),
1630
+ className: "group inline-flex items-center gap-1.5 rounded-full bg-muted px-3.5 py-2 text-sm text-foreground transition-colors hover:bg-accent pointer-coarse:min-h-11",
1631
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.example, { testId: "facts-page-example" }),
1632
+ children: [
1633
+ fact,
1634
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRight, { className: "size-3.5 text-muted-foreground transition-colors group-hover:text-primary" })
1635
+ ]
1636
+ },
1637
+ fact
1638
+ )) })
1639
+ ] })
1640
+ }
1641
+ );
1642
+ }
1643
+ function FactsLoading({
1644
+ label = DEFAULT_FACTS_EMPTY_STATE_LABELS.loading
1645
+ }) {
1646
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center py-10 text-muted-foreground", children: [
1647
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "mr-2 size-4 animate-spin" }),
1648
+ " ",
1649
+ label
1650
+ ] });
1651
+ }
1652
+ function FactsLoadError({
1653
+ onRetry,
1654
+ message = DEFAULT_FACTS_EMPTY_STATE_LABELS.loadError,
1655
+ retryLabel = DEFAULT_FACTS_EMPTY_STATE_LABELS.retry
1656
+ }) {
1657
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center gap-3 px-6 py-10 text-center", children: [
1658
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: message }),
1659
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "outline", size: "sm", onClick: onRetry, children: retryLabel })
1660
+ ] });
1661
+ }
1662
+ var DEFAULT_FACT_COMPOSER_LABELS = {
1663
+ shared: "Shared",
1664
+ verified: "Verified",
1665
+ dates: "Dates",
1666
+ deleteFact: "Delete fact",
1667
+ cancel: "Cancel",
1668
+ saveFact: "Save fact",
1669
+ saving: "Saving\u2026",
1670
+ addFact: "Add fact",
1671
+ adding: "Adding\u2026"
1672
+ };
1673
+ var DEFAULT_FACT_SOURCES_ROW_LABELS = {
1674
+ sources: "Sources",
1675
+ hintButton: "How to add sources",
1676
+ hint: "In the picker, tick a document's checkbox to add it as a source, or click its name to just open it. Inside a document, click a passage to add it \u2014 shift-click to take a whole range. Add as many as you like, from as many documents as you like."
1677
+ };
1678
+ function FactFieldRow({
1679
+ label,
1680
+ children,
1681
+ className
1682
+ }) {
1683
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cn("flex flex-col gap-1.5", className), "data-slot": "fact-field-row", children: [
1684
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-foreground", children: label }),
1685
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children })
1686
+ ] });
1687
+ }
1688
+ function FactSourcesRow({ toggle, picker, labels, hintTestId }) {
1689
+ const l = { ...DEFAULT_FACT_SOURCES_ROW_LABELS, ...labels };
1690
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1.5", "data-slot": "fact-sources-row", children: [
1691
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1 text-sm font-medium text-foreground", children: [
1692
+ l.sources,
1693
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
1694
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
1695
+ "button",
1696
+ {
1697
+ type: "button",
1698
+ "aria-label": l.hintButton,
1699
+ className: "text-muted-foreground hover:text-foreground",
1700
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(hintTestId, { testId: "facts-source-hint" }),
1701
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, { className: "size-3.5" })
1702
+ }
1703
+ ) }),
1704
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { className: "max-w-xs", children: l.hint })
1705
+ ] })
1706
+ ] }),
1707
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
1708
+ toggle,
1709
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1", children: picker })
1710
+ ] })
1711
+ ] });
1712
+ }
1713
+ function FactComposer({
1714
+ isOpen,
1715
+ panelRef,
1716
+ editor,
1717
+ labels,
1718
+ sharedToggle,
1719
+ verifiedToggle,
1720
+ dateInput,
1721
+ isEditing,
1722
+ canSave,
1723
+ isSaving,
1724
+ isDeleting,
1725
+ onSave,
1726
+ onCancel,
1727
+ onDelete,
1728
+ error,
1729
+ uiLabels: labelOverrides,
1730
+ testIds
1731
+ }) {
1732
+ const l = { ...DEFAULT_FACT_COMPOSER_LABELS, ...labelOverrides };
1733
+ return /* @__PURE__ */ jsxRuntime.jsx(
1734
+ "div",
1735
+ {
1736
+ className: ui.cn(
1737
+ "grid shrink-0 transition-[grid-template-rows,opacity] duration-500 ease-in-out",
1738
+ isOpen ? "grid-rows-[1fr] opacity-100" : "grid-rows-[0fr] opacity-0"
1739
+ ),
1740
+ "data-slot": "fact-composer",
1741
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsxs(
1742
+ "div",
1743
+ {
1744
+ ref: panelRef,
1745
+ className: "facts-composer flex flex-col gap-4 border-b border-border bg-muted px-4 py-4",
1746
+ children: [
1747
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
1748
+ editor,
1749
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
1750
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-2", children: [
1751
+ /* @__PURE__ */ jsxRuntime.jsx(
1752
+ "div",
1753
+ {
1754
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.tags, { testId: "facts-page-composer-tags" }),
1755
+ className: "min-w-[14rem] flex-1",
1756
+ children: labels
1757
+ }
1758
+ ),
1759
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-6", children: [
1760
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
1761
+ sharedToggle,
1762
+ l.shared
1763
+ ] }),
1764
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
1765
+ verifiedToggle,
1766
+ l.verified
1767
+ ] })
1768
+ ] })
1769
+ ] }),
1770
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-2", children: [
1771
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-[10rem] flex-1 flex-col gap-1.5", children: [
1772
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-foreground", children: l.dates }),
1773
+ dateInput
1774
+ ] }),
1775
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-2 self-end max-sm:w-full max-sm:justify-end", children: [
1776
+ isEditing && /* @__PURE__ */ jsxRuntime.jsx(
1777
+ ui.Button,
1778
+ {
1779
+ variant: "ghost",
1780
+ size: "sm",
1781
+ className: "size-7 p-0 text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:size-11",
1782
+ onClick: onDelete,
1783
+ disabled: isDeleting,
1784
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.delete, {
1785
+ testId: "facts-page-composer-delete"
1786
+ }),
1787
+ "aria-label": l.deleteFact,
1788
+ title: l.deleteFact,
1789
+ children: isDeleting ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2, { className: "size-3.5" })
1790
+ }
1791
+ ),
1792
+ /* @__PURE__ */ jsxRuntime.jsx(
1793
+ ui.Button,
1794
+ {
1795
+ variant: "ghost",
1796
+ size: "sm",
1797
+ className: "h-7 pointer-coarse:h-11",
1798
+ onClick: onCancel,
1799
+ children: l.cancel
1800
+ }
1801
+ ),
1802
+ /* @__PURE__ */ jsxRuntime.jsx(
1803
+ ui.Button,
1804
+ {
1805
+ size: "sm",
1806
+ className: "h-7 pointer-coarse:h-11",
1807
+ disabled: !canSave,
1808
+ onClick: onSave,
1809
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.save, { testId: "facts-page-composer-save" }),
1810
+ children: isEditing ? isSaving ? l.saving : l.saveFact : isSaving ? l.adding : l.addFact
1811
+ }
1812
+ )
1813
+ ] })
1814
+ ] })
1815
+ ] })
1816
+ ] }),
1817
+ error && /* @__PURE__ */ jsxRuntime.jsx(
1818
+ "p",
1819
+ {
1820
+ className: "text-xs text-destructive",
1821
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.error, { testId: "facts-page-composer-error" }),
1822
+ children: error
1823
+ }
1824
+ )
1825
+ ]
1826
+ }
1827
+ ) })
1828
+ }
1829
+ );
1830
+ }
1831
+ var DEFAULT_FACTS_BULK_BAR_LABELS = {
1832
+ unpin: "Unpin Facts",
1833
+ pin: "Pin to Chats",
1834
+ label: "Label",
1835
+ shared: "Shared",
1836
+ more: "More",
1837
+ export: "Export",
1838
+ delete: "Delete",
1839
+ budgetHint: "Pinned facts ride every AI request, so they are always in context and share one budget. This estimates the tokens they add (\u22484 characters per token), capped at ~2,000.",
1840
+ budget: (tokens, cap) => `~${tokens}/${cap} tokens`,
1841
+ unpinTooltip: (n) => `Unpin the selected ${n} so they no longer ride every chat`,
1842
+ pinTooltip: (n) => `Pin the selected ${n} so they ride every chat with the assistant`,
1843
+ labelTooltip: (n) => `Add or remove labels from selected ${n}`
1844
+ };
1845
+ function FactsBulkBar({
1846
+ count,
1847
+ onClear,
1848
+ allSelectedPinned,
1849
+ onTogglePin,
1850
+ onLabel,
1851
+ sharedToggle,
1852
+ onExport,
1853
+ onDelete,
1854
+ budget,
1855
+ pluralNoun = "facts",
1856
+ labels,
1857
+ testIds
1858
+ }) {
1859
+ const l = { ...DEFAULT_FACTS_BULK_BAR_LABELS, ...labels };
1860
+ const none = count === 0;
1861
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pb-3", "data-slot": "facts-bulk-bar", children: /* @__PURE__ */ jsxRuntime.jsx(
1862
+ chunkV4ISCZJ7_cjs.SelectionBar,
1863
+ {
1864
+ count,
1865
+ onClear,
1866
+ status: budget ? /* @__PURE__ */ jsxRuntime.jsx(
1867
+ "span",
1868
+ {
1869
+ className: ui.cn(
1870
+ "shrink-0 text-xs tabular-nums",
1871
+ budget.isOver ? "text-destructive" : "text-muted-foreground"
1872
+ ),
1873
+ title: l.budgetHint,
1874
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.budget, { testId: "facts-page-core-budget" }),
1875
+ children: l.budget(budget.tokens.toLocaleString(), budget.cap.toLocaleString())
1876
+ }
1877
+ ) : null,
1878
+ children: (isCompact) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1879
+ /* @__PURE__ */ jsxRuntime.jsx(
1880
+ chunkV4ISCZJ7_cjs.SelectionBarAction,
1881
+ {
1882
+ icon: allSelectedPinned ? lucideReact.PinOff : lucideReact.Pin,
1883
+ label: allSelectedPinned ? l.unpin : l.pin,
1884
+ onClick: onTogglePin,
1885
+ disabled: none,
1886
+ isCompact,
1887
+ className: "border-yellow-border text-yellow-text hover:bg-yellow-bg hover:text-yellow-text",
1888
+ tooltip: allSelectedPinned ? l.unpinTooltip(pluralNoun) : l.pinTooltip(pluralNoun),
1889
+ testId: chunkMHVNT4J3_cjs.testIdOr(testIds?.pin, { testId: "bulk-pin-facts-button" })
1890
+ }
1891
+ ),
1892
+ /* @__PURE__ */ jsxRuntime.jsx(
1893
+ chunkV4ISCZJ7_cjs.SelectionBarAction,
1894
+ {
1895
+ icon: lucideReact.Tags,
1896
+ label: l.label,
1897
+ onClick: onLabel,
1898
+ disabled: none,
1899
+ isCompact,
1900
+ className: "border-green-border text-green-text hover:bg-green-bg hover:text-green-text",
1901
+ tooltip: l.labelTooltip(pluralNoun),
1902
+ testId: chunkMHVNT4J3_cjs.testIdOr(testIds?.label, { testId: "bulk-label-facts-button" })
1903
+ }
1904
+ ),
1905
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1", children: [
1906
+ sharedToggle,
1907
+ !isCompact && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: l.shared })
1908
+ ] }),
1909
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
1910
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
1911
+ ui.Button,
1912
+ {
1913
+ variant: "outline",
1914
+ size: "sm",
1915
+ className: "h-7 gap-1.5 px-2 pointer-coarse:h-11",
1916
+ disabled: none,
1917
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.more, { testId: "facts-bulk-more-button" }),
1918
+ children: [
1919
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreHorizontal, { className: "size-4" }),
1920
+ !isCompact && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: l.more })
1921
+ ]
1922
+ }
1923
+ ) }),
1924
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenuContent, { align: "end", children: [
1925
+ /* @__PURE__ */ jsxRuntime.jsxs(
1926
+ ui.DropdownMenuItem,
1927
+ {
1928
+ onClick: onExport,
1929
+ disabled: none,
1930
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.export, { testId: "export-facts-button" }),
1931
+ children: [
1932
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderUp, { className: "mr-2 size-4" }),
1933
+ l.export
1934
+ ]
1935
+ }
1936
+ ),
1937
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuSeparator, {}),
1938
+ /* @__PURE__ */ jsxRuntime.jsxs(
1939
+ ui.DropdownMenuItem,
1940
+ {
1941
+ onClick: onDelete,
1942
+ disabled: none,
1943
+ className: "text-red-text focus:text-red-text",
1944
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.delete, { testId: "bulk-delete-facts-button" }),
1945
+ children: [
1946
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2, { className: "mr-2 size-4" }),
1947
+ l.delete
1948
+ ]
1949
+ }
1950
+ )
1951
+ ] })
1952
+ ] })
1953
+ ] })
1954
+ }
1955
+ ) });
1956
+ }
1957
+ var DEFAULT_FACTS_TOOLBAR_LABELS = {
1958
+ tags: "Tags",
1959
+ newFact: "New fact"
1960
+ };
1961
+ function FactsToolbar({
1962
+ count,
1963
+ hasActiveFilters,
1964
+ filterText,
1965
+ onFilterTextChange,
1966
+ searchFields,
1967
+ onSearchFieldsChange,
1968
+ quickFilter,
1969
+ onOpenTags,
1970
+ viewMode,
1971
+ onViewModeChange,
1972
+ onNewFact,
1973
+ navSlotRef,
1974
+ navigator,
1975
+ tools,
1976
+ showToolbarRow = true,
1977
+ labels,
1978
+ testIds,
1979
+ filterLabels,
1980
+ filterTestIds,
1981
+ viewToggleLabels,
1982
+ viewToggleTestIdPrefix
1983
+ }) {
1984
+ const l = { ...DEFAULT_FACTS_TOOLBAR_LABELS, ...labels };
1985
+ const headerRef = react.useRef(null);
1986
+ const [viewsCollapsed, setViewsCollapsed] = react.useState(false);
1987
+ const [isNarrow, setIsNarrow] = react.useState(false);
1988
+ react.useEffect(() => {
1989
+ const el = headerRef.current;
1990
+ if (!el) return;
1991
+ const measure = () => {
1992
+ const w = el.clientWidth;
1993
+ setViewsCollapsed((prev) => prev ? w < 990 : w < 950);
1994
+ const narrowAt = window.matchMedia?.("(pointer: coarse)")?.matches ? 820 : 640;
1995
+ setIsNarrow((prev) => prev ? w < narrowAt + 20 : w < narrowAt);
1996
+ };
1997
+ measure();
1998
+ return chunkPPCATBOY_cjs.observeResize(el, measure);
1999
+ }, []);
2000
+ const tabs = [
2001
+ {
2002
+ id: "facts",
2003
+ // No name: the page needs no self-label, but the fact glyph stays in front of the count.
2004
+ countIcon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Milestone, { className: "size-3.5" }),
2005
+ label: "",
2006
+ count,
2007
+ countPlacement: "leading",
2008
+ hasActiveFilters,
2009
+ testId: chunkMHVNT4J3_cjs.testIdOr(testIds?.tab, { testId: "facts-tab" }),
2010
+ // Strip the folder-tab chrome: just the glyph and count, as in the Files header.
2011
+ tabClassName: "!bg-transparent hover:!bg-transparent !border-transparent !rounded-none !mb-0 !pl-0 before:!hidden after:!hidden shadow-none!"
2012
+ }
2013
+ ];
2014
+ const filterControls = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: isNarrow ? "flex w-full items-center gap-1.5" : "flex items-center gap-1.5", children: [
2015
+ /* @__PURE__ */ jsxRuntime.jsx(
2016
+ FactsFilterInput,
2017
+ {
2018
+ value: filterText,
2019
+ onChange: onFilterTextChange,
2020
+ fields: searchFields,
2021
+ onFieldsChange: onSearchFieldsChange,
2022
+ filter: quickFilter,
2023
+ className: isNarrow ? "min-w-0 flex-1" : void 0,
2024
+ labels: filterLabels,
2025
+ testIds: filterTestIds
2026
+ }
2027
+ ),
2028
+ onOpenTags && /* @__PURE__ */ jsxRuntime.jsxs(
2029
+ ui.Button,
2030
+ {
2031
+ variant: "outline",
2032
+ size: "sm",
2033
+ className: "h-6 shrink-0 gap-1.5 px-2 pointer-coarse:h-11",
2034
+ onClick: onOpenTags,
2035
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.tagsButton, { testId: "facts-tags-button" }),
2036
+ children: [
2037
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookMarked, { className: "size-3.5" }),
2038
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: l.tags })
2039
+ ]
2040
+ }
2041
+ )
2042
+ ] });
2043
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: headerRef, className: "sticky top-0 z-10 bg-background", "data-slot": "facts-toolbar", children: [
2044
+ /* @__PURE__ */ jsxRuntime.jsx(
2045
+ chunk5B4PXAKI_cjs.TabHeader,
2046
+ {
2047
+ tabs,
2048
+ className: "pr-3",
2049
+ activeTabId: "notes",
2050
+ onTabChange: () => {
2051
+ },
2052
+ afterTabs: isNarrow ? null : filterControls,
2053
+ centerContent: isNarrow ? null : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex w-full items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
2054
+ FactsViewToggle,
2055
+ {
2056
+ viewMode,
2057
+ onChange: onViewModeChange,
2058
+ collapsed: viewsCollapsed,
2059
+ labels: viewToggleLabels,
2060
+ testIdPrefix: viewToggleTestIdPrefix
2061
+ }
2062
+ ) }),
2063
+ rightContent: /* @__PURE__ */ jsxRuntime.jsxs(
2064
+ ui.Button,
2065
+ {
2066
+ onClick: onNewFact,
2067
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.newFact, { testId: "facts-page-new" }),
2068
+ children: [
2069
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "mr-0.5 size-4" }),
2070
+ l.newFact
2071
+ ]
2072
+ }
2073
+ )
2074
+ }
2075
+ ),
2076
+ isNarrow && /* @__PURE__ */ jsxRuntime.jsxs(
2077
+ "div",
2078
+ {
2079
+ className: "flex flex-col gap-1.5 border-b border-border px-3 py-1.5",
2080
+ "data-slot": "facts-toolbar-stack",
2081
+ children: [
2082
+ filterControls,
2083
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
2084
+ FactsViewToggle,
2085
+ {
2086
+ viewMode,
2087
+ onChange: onViewModeChange,
2088
+ collapsed: true,
2089
+ labels: viewToggleLabels,
2090
+ testIdPrefix: viewToggleTestIdPrefix
2091
+ }
2092
+ ) })
2093
+ ]
2094
+ }
2095
+ ),
2096
+ showToolbarRow && /* @__PURE__ */ jsxRuntime.jsxs(
2097
+ "div",
2098
+ {
2099
+ className: "flex min-h-8 flex-wrap items-center gap-x-1.5 border-b border-border bg-background px-3 py-0.5",
2100
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.filterBar, { testId: "facts-filter-bar" }),
2101
+ children: [
2102
+ /* @__PURE__ */ jsxRuntime.jsx(
2103
+ "div",
2104
+ {
2105
+ ref: navSlotRef,
2106
+ className: "flex shrink-0 items-center empty:hidden",
2107
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.filterBarNav, { testId: "facts-filter-bar-nav" }),
2108
+ children: navigator
2109
+ }
2110
+ ),
2111
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
2112
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center", children: tools })
2113
+ ]
2114
+ }
2115
+ )
2116
+ ] });
2117
+ }
2118
+ var DEFAULT_FACT_SEARCH_BAR_LABELS = {
2119
+ search: "Search:",
2120
+ // An example query rather than an instruction: shows the quoted-phrase syntax.
2121
+ placeholder: 'e.g. "board meeting" decision on the budget',
2122
+ clear: "Clear search",
2123
+ submit: "Search"
2124
+ };
2125
+ var DEFAULT_FACT_SEARCH_RESULT_LABELS = {
2126
+ core: "Core",
2127
+ verified: "Verified",
2128
+ open: "Open"
2129
+ };
2130
+ function FactSearchBar({
2131
+ query,
2132
+ onQueryChange,
2133
+ onSubmit,
2134
+ onClear,
2135
+ isSearching,
2136
+ placeholder,
2137
+ labels,
2138
+ testIds
2139
+ }) {
2140
+ const l = { ...DEFAULT_FACT_SEARCH_BAR_LABELS, ...labels };
2141
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t border-border px-6 pb-4 pt-6", "data-slot": "fact-search-bar", children: /* @__PURE__ */ jsxRuntime.jsxs(
2142
+ "form",
2143
+ {
2144
+ onSubmit: (e) => {
2145
+ e.preventDefault();
2146
+ onSubmit();
2147
+ },
2148
+ className: "mx-auto flex w-full max-w-2xl items-center gap-3",
2149
+ children: [
2150
+ /* @__PURE__ */ jsxRuntime.jsx(
2151
+ "label",
2152
+ {
2153
+ htmlFor: "facts-smart-search-input",
2154
+ className: "shrink-0 text-base font-medium text-foreground",
2155
+ children: l.search
2156
+ }
2157
+ ),
2158
+ /* @__PURE__ */ jsxRuntime.jsxs("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", children: [
2159
+ /* @__PURE__ */ jsxRuntime.jsx(
2160
+ "textarea",
2161
+ {
2162
+ id: "facts-smart-search-input",
2163
+ rows: 1,
2164
+ value: query,
2165
+ onChange: (e) => {
2166
+ onQueryChange(e.target.value);
2167
+ e.target.style.height = "auto";
2168
+ e.target.style.height = `${e.target.scrollHeight}px`;
2169
+ },
2170
+ onKeyDown: (e) => {
2171
+ if (e.key === "Enter" && !e.shiftKey) {
2172
+ e.preventDefault();
2173
+ onSubmit();
2174
+ }
2175
+ },
2176
+ placeholder: placeholder ?? l.placeholder,
2177
+ 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",
2178
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.input, { testId: "facts-smart-search-input" }),
2179
+ autoFocus: true
2180
+ }
2181
+ ),
2182
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [
2183
+ query && /* @__PURE__ */ jsxRuntime.jsx(
2184
+ ui.Button,
2185
+ {
2186
+ type: "button",
2187
+ variant: "ghost",
2188
+ size: "icon",
2189
+ className: "size-7 text-muted-foreground hover:text-foreground pointer-coarse:size-11",
2190
+ onClick: onClear,
2191
+ "aria-label": l.clear,
2192
+ title: l.clear,
2193
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.clear, { testId: "facts-smart-search-clear" }),
2194
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-4" })
2195
+ }
2196
+ ),
2197
+ /* @__PURE__ */ jsxRuntime.jsx(
2198
+ ui.Button,
2199
+ {
2200
+ type: "submit",
2201
+ size: "icon",
2202
+ disabled: !query.trim() || isSearching,
2203
+ className: "size-7 pointer-coarse:size-11",
2204
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.submit, { testId: "facts-smart-search-submit" }),
2205
+ title: l.submit,
2206
+ children: isSearching ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-4 animate-spin" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "size-4" })
2207
+ }
2208
+ )
2209
+ ] })
2210
+ ] })
2211
+ ]
2212
+ }
2213
+ ) });
2214
+ }
2215
+ function FactSearchTotals({ children, testId }) {
2216
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 pb-3", children: /* @__PURE__ */ jsxRuntime.jsx(
2217
+ "p",
2218
+ {
2219
+ className: "font-sans text-base font-semibold tabular-nums text-foreground",
2220
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "facts-smart-search-totals" }),
2221
+ children
2222
+ }
2223
+ ) });
2224
+ }
2225
+ function FactSearchPending({ children }) {
2226
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 py-16 text-sm text-muted-foreground", children: [
2227
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-4 animate-spin" }),
2228
+ " ",
2229
+ children
2230
+ ] });
2231
+ }
2232
+ function FactSearchNoMatches({
2233
+ children,
2234
+ testId
2235
+ }) {
2236
+ return /* @__PURE__ */ jsxRuntime.jsx(
2237
+ "div",
2238
+ {
2239
+ className: "py-16 text-center text-sm text-muted-foreground",
2240
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "facts-smart-search-empty" }),
2241
+ children
2242
+ }
2243
+ );
2244
+ }
2245
+ function FactSearchResult({
2246
+ id,
2247
+ rank,
2248
+ text,
2249
+ terms,
2250
+ renderSnippet,
2251
+ labels,
2252
+ isPinned,
2253
+ isVerified,
2254
+ isSelected,
2255
+ onOpen,
2256
+ uiLabels: labelOverrides,
2257
+ testIds,
2258
+ href
2259
+ }) {
2260
+ const l = { ...DEFAULT_FACT_SEARCH_RESULT_LABELS, ...labelOverrides };
2261
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2", "data-slot": "fact-search-hit", children: [
2262
+ /* @__PURE__ */ jsxRuntime.jsx(
2263
+ "span",
2264
+ {
2265
+ className: "w-5 shrink-0 pt-3 text-right text-xs tabular-nums text-muted-foreground",
2266
+ "aria-hidden": "true",
2267
+ children: rank
2268
+ }
2269
+ ),
2270
+ /* @__PURE__ */ jsxRuntime.jsx(
2271
+ chunkOUW6G4O2_cjs.SearchHit,
2272
+ {
2273
+ className: "min-w-0 flex-1",
2274
+ testId: chunkMHVNT4J3_cjs.testIdOr(testIds?.hit?.(id), { testId: `facts-smart-search-hit-${id}` }),
2275
+ href,
2276
+ selected: isSelected,
2277
+ onClick: onOpen,
2278
+ content: text,
2279
+ terms,
2280
+ renderSnippet,
2281
+ header: /* @__PURE__ */ jsxRuntime.jsxs(
2282
+ "div",
2283
+ {
2284
+ className: "flex min-w-0 flex-1 flex-wrap items-center gap-1 text-xs text-muted-foreground",
2285
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.labels?.(id), {
2286
+ testId: `facts-smart-search-hit-labels-${id}`
2287
+ }),
2288
+ children: [
2289
+ isPinned && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1 pr-1", children: [
2290
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pin, { className: "size-3" }),
2291
+ " ",
2292
+ l.core
2293
+ ] }),
2294
+ labels.map((tag) => /* @__PURE__ */ jsxRuntime.jsxs(
2295
+ "span",
2296
+ {
2297
+ className: "inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium text-foreground",
2298
+ title: tag.name,
2299
+ style: { borderColor: tag.color },
2300
+ children: [
2301
+ /* @__PURE__ */ jsxRuntime.jsx(
2302
+ "span",
2303
+ {
2304
+ className: "flex size-3.5 shrink-0 items-center justify-center rounded",
2305
+ style: { backgroundColor: tag.color },
2306
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-2.5 text-white", strokeWidth: 3 })
2307
+ }
2308
+ ),
2309
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[120px] truncate", children: tag.name })
2310
+ ]
2311
+ },
2312
+ tag.id
2313
+ ))
2314
+ ]
2315
+ }
2316
+ ),
2317
+ headerRight: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-3 text-xs text-muted-foreground", children: [
2318
+ isVerified && /* @__PURE__ */ jsxRuntime.jsxs(
2319
+ "span",
2320
+ {
2321
+ className: "inline-flex shrink-0 items-center gap-1 text-green-text",
2322
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.verified?.(id), {
2323
+ testId: `facts-smart-search-hit-verified-${id}`
2324
+ }),
2325
+ children: [
2326
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckCircle2, { className: "size-3" }),
2327
+ " ",
2328
+ l.verified
2329
+ ]
2330
+ }
2331
+ ),
2332
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1", children: [
2333
+ l.open,
2334
+ " ",
2335
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CornerDownLeft, { className: "size-3" })
2336
+ ] })
2337
+ ] })
2338
+ }
2339
+ )
2340
+ ] });
2341
+ }
2342
+
2343
+ exports.DEFAULT_FACTS_BULK_BAR_LABELS = DEFAULT_FACTS_BULK_BAR_LABELS;
2344
+ exports.DEFAULT_FACTS_EMPTY_STATE_LABELS = DEFAULT_FACTS_EMPTY_STATE_LABELS;
2345
+ exports.DEFAULT_FACTS_FIELDS_BUTTON_LABELS = DEFAULT_FACTS_FIELDS_BUTTON_LABELS;
2346
+ exports.DEFAULT_FACTS_FILTER_INPUT_LABELS = DEFAULT_FACTS_FILTER_INPUT_LABELS;
2347
+ exports.DEFAULT_FACTS_TOOLBAR_LABELS = DEFAULT_FACTS_TOOLBAR_LABELS;
2348
+ exports.DEFAULT_FACTS_VIEW_TOGGLE_LABELS = DEFAULT_FACTS_VIEW_TOGGLE_LABELS;
2349
+ exports.DEFAULT_FACT_COLUMN_LABELS = DEFAULT_FACT_COLUMN_LABELS;
2350
+ exports.DEFAULT_FACT_COLUMN_ORDER = DEFAULT_FACT_COLUMN_ORDER;
2351
+ exports.DEFAULT_FACT_COMPOSER_LABELS = DEFAULT_FACT_COMPOSER_LABELS;
2352
+ exports.DEFAULT_FACT_DATE_INPUT_LABELS = DEFAULT_FACT_DATE_INPUT_LABELS;
2353
+ exports.DEFAULT_FACT_LABELS_CELL_LABELS = DEFAULT_FACT_LABELS_CELL_LABELS;
2354
+ exports.DEFAULT_FACT_PASSAGES_LABELS = DEFAULT_FACT_PASSAGES_LABELS;
2355
+ exports.DEFAULT_FACT_ROW_ACTIONS_LABELS = DEFAULT_FACT_ROW_ACTIONS_LABELS;
2356
+ exports.DEFAULT_FACT_SEARCH_BAR_LABELS = DEFAULT_FACT_SEARCH_BAR_LABELS;
2357
+ exports.DEFAULT_FACT_SEARCH_RESULT_LABELS = DEFAULT_FACT_SEARCH_RESULT_LABELS;
2358
+ exports.DEFAULT_FACT_SOURCES_ROW_LABELS = DEFAULT_FACT_SOURCES_ROW_LABELS;
2359
+ exports.DEFAULT_FACT_SOURCE_GROUP_LABELS = DEFAULT_FACT_SOURCE_GROUP_LABELS;
2360
+ exports.DEFAULT_FACT_TIMELINE_LABELS = DEFAULT_FACT_TIMELINE_LABELS;
2361
+ exports.EMPTY_FACT_DATE_FIELDS = EMPTY_FACT_DATE_FIELDS;
2362
+ exports.FACTS_SEARCH_FIELD_OPTIONS = FACTS_SEARCH_FIELD_OPTIONS;
2363
+ exports.FactComposer = FactComposer;
2364
+ exports.FactDateInput = FactDateInput;
2365
+ exports.FactFieldRow = FactFieldRow;
2366
+ exports.FactLabelsCell = FactLabelsCell;
2367
+ exports.FactPassageItem = FactPassageItem;
2368
+ exports.FactRowActions = FactRowActions;
2369
+ exports.FactSearchBar = FactSearchBar;
2370
+ exports.FactSearchNoMatches = FactSearchNoMatches;
2371
+ exports.FactSearchPending = FactSearchPending;
2372
+ exports.FactSearchResult = FactSearchResult;
2373
+ exports.FactSearchTotals = FactSearchTotals;
2374
+ exports.FactSourceGroup = FactSourceGroup;
2375
+ exports.FactSourcesPanel = FactSourcesPanel;
2376
+ exports.FactSourcesRow = FactSourcesRow;
2377
+ exports.FactsBulkBar = FactsBulkBar;
2378
+ exports.FactsCalendar = FactsCalendar;
2379
+ exports.FactsEmptyState = FactsEmptyState;
2380
+ exports.FactsFieldsButton = FactsFieldsButton;
2381
+ exports.FactsFilterInput = FactsFilterInput;
2382
+ exports.FactsGanttPane = FactsGanttPane;
2383
+ exports.FactsLoadError = FactsLoadError;
2384
+ exports.FactsLoading = FactsLoading;
2385
+ exports.FactsTable = FactsTable;
2386
+ exports.FactsToolbar = FactsToolbar;
2387
+ exports.FactsViewToggle = FactsViewToggle;
2388
+ exports.ISO_DATE_FILTER_PARAMS = ISO_DATE_FILTER_PARAMS;
2389
+ exports.createFactColumns = createFactColumns;
2390
+ exports.decodeWhitespaceEntities = decodeWhitespaceEntities;
2391
+ exports.detectTimezone = detectTimezone;
2392
+ exports.factDateFieldsToSpan = factDateFieldsToSpan;
2393
+ exports.factDateSpanToFields = factDateSpanToFields;
2394
+ exports.renderPreviewInline = renderPreviewInline;
2395
+ exports.sourceDocCount = sourceDocCount;
2396
+ exports.supportedTimezones = supportedTimezones;
2397
+ exports.toFactRow = toFactRow;
2398
+ exports.toFactRows = toFactRows;
2399
+ exports.toPreviewLine = toPreviewLine;
2400
+ //# sourceMappingURL=index.cjs.map
2401
+ //# sourceMappingURL=index.cjs.map