@arbidocs/blocks 0.4.147 → 0.4.151

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 (339) hide show
  1. package/dist/ConnectedNativeDocxComparison-OFPIXNJB.js +35 -0
  2. package/dist/ConnectedNativeDocxComparison-OFPIXNJB.js.map +1 -0
  3. package/dist/ConnectedNativeDocxComparison-Y5BNLNH6.cjs +44 -0
  4. package/dist/ConnectedNativeDocxComparison-Y5BNLNH6.cjs.map +1 -0
  5. package/dist/ConnectedNativeDocxEditor-HTEW5JAH.cjs +46 -0
  6. package/dist/ConnectedNativeDocxEditor-HTEW5JAH.cjs.map +1 -0
  7. package/dist/ConnectedNativeDocxEditor-LRYU5HPA.js +33 -0
  8. package/dist/ConnectedNativeDocxEditor-LRYU5HPA.js.map +1 -0
  9. package/dist/ConnectedStreamedWordArtifact-QAUVUCSX.js +35 -0
  10. package/dist/ConnectedStreamedWordArtifact-QAUVUCSX.js.map +1 -0
  11. package/dist/ConnectedStreamedWordArtifact-QW74LKHN.cjs +44 -0
  12. package/dist/ConnectedStreamedWordArtifact-QW74LKHN.cjs.map +1 -0
  13. package/dist/FactTextEditor-YESAU2IJ.js +25 -0
  14. package/dist/FactTextEditor-YESAU2IJ.js.map +1 -0
  15. package/dist/FactTextEditor-YUPBCTXK.cjs +27 -0
  16. package/dist/FactTextEditor-YUPBCTXK.cjs.map +1 -0
  17. package/dist/{NativeDocxEditor-BE2OEOTJ.cjs → NativeDocxEditor-5VBNM5I7.cjs} +8 -8
  18. package/dist/{NativeDocxEditor-BE2OEOTJ.cjs.map → NativeDocxEditor-5VBNM5I7.cjs.map} +1 -1
  19. package/dist/{NativeDocxEditor-KOPFMRYW.js → NativeDocxEditor-XT5ZLFGU.js} +4 -4
  20. package/dist/{NativeDocxEditor-KOPFMRYW.js.map → NativeDocxEditor-XT5ZLFGU.js.map} +1 -1
  21. package/dist/agents/index.cjs +263 -264
  22. package/dist/agents/index.js +6 -7
  23. package/dist/calendar/index.cjs +117 -125
  24. package/dist/calendar/index.d.ts +0 -1
  25. package/dist/calendar/index.js +1 -1
  26. package/dist/chat/index.cjs +78 -78
  27. package/dist/chat/index.js +3 -3
  28. package/dist/{chunk-2FL7QJKJ.js → chunk-265GOG4W.js} +3 -3
  29. package/dist/{chunk-2FL7QJKJ.js.map → chunk-265GOG4W.js.map} +1 -1
  30. package/dist/{chunk-LTU35TQN.cjs → chunk-2FLWPM3B.cjs} +636 -31
  31. package/dist/chunk-2FLWPM3B.cjs.map +1 -0
  32. package/dist/{chunk-SUUPR735.js → chunk-3PCBYOIZ.js} +4 -4
  33. package/dist/{chunk-SUUPR735.js.map → chunk-3PCBYOIZ.js.map} +1 -1
  34. package/dist/{chunk-WIZ7Z7FN.js → chunk-4236BRZK.js} +46 -221
  35. package/dist/chunk-4236BRZK.js.map +1 -0
  36. package/dist/{chunk-IL3WB3YX.cjs → chunk-4JNKXOFZ.cjs} +3 -3
  37. package/dist/{chunk-IL3WB3YX.cjs.map → chunk-4JNKXOFZ.cjs.map} +1 -1
  38. package/dist/{chunk-ODRHHWHY.cjs → chunk-4KMLM3GY.cjs} +4 -4
  39. package/dist/chunk-4KMLM3GY.cjs.map +1 -0
  40. package/dist/chunk-6I6CVX5G.cjs +22 -0
  41. package/dist/chunk-6I6CVX5G.cjs.map +1 -0
  42. package/dist/{chunk-MHFF5N65.cjs → chunk-757OYF6G.cjs} +4 -38
  43. package/dist/chunk-757OYF6G.cjs.map +1 -0
  44. package/dist/chunk-B3FMUFAW.cjs +1956 -0
  45. package/dist/chunk-B3FMUFAW.cjs.map +1 -0
  46. package/dist/{chunk-B3AHCIV5.js → chunk-BJ24VPOA.js} +4 -55
  47. package/dist/chunk-BJ24VPOA.js.map +1 -0
  48. package/dist/chunk-C7PTF6BQ.cjs +172 -0
  49. package/dist/chunk-C7PTF6BQ.cjs.map +1 -0
  50. package/dist/{chunk-LZRMXJIE.js → chunk-COA3S3CZ.js} +3 -3
  51. package/dist/{chunk-LZRMXJIE.js.map → chunk-COA3S3CZ.js.map} +1 -1
  52. package/dist/{chunk-VUR63NMQ.js → chunk-CROTH2BS.js} +6 -6
  53. package/dist/{chunk-VUR63NMQ.js.map → chunk-CROTH2BS.js.map} +1 -1
  54. package/dist/{chunk-AO7SK6WP.cjs → chunk-CU2O32Z4.cjs} +31 -31
  55. package/dist/{chunk-AO7SK6WP.cjs.map → chunk-CU2O32Z4.cjs.map} +1 -1
  56. package/dist/chunk-D3WFIFRY.cjs +659 -0
  57. package/dist/chunk-D3WFIFRY.cjs.map +1 -0
  58. package/dist/{chunk-DAHCRVPM.js → chunk-DB2OXRQC.js} +84 -82
  59. package/dist/chunk-DB2OXRQC.js.map +1 -0
  60. package/dist/{chunk-QXMR5YHC.js → chunk-DIB4JYUY.js} +19 -3
  61. package/dist/chunk-DIB4JYUY.js.map +1 -0
  62. package/dist/chunk-DVB5ZKOF.js +22 -0
  63. package/dist/chunk-DVB5ZKOF.js.map +1 -0
  64. package/dist/chunk-EYJMMGXF.js +19 -0
  65. package/dist/chunk-EYJMMGXF.js.map +1 -0
  66. package/dist/chunk-FAXXN7KI.cjs +213 -0
  67. package/dist/chunk-FAXXN7KI.cjs.map +1 -0
  68. package/dist/{chunk-2MJWWPHY.js → chunk-G4IYES7G.js} +140 -15
  69. package/dist/chunk-G4IYES7G.js.map +1 -0
  70. package/dist/{chunk-T5I4NRFP.cjs → chunk-GFOEWPAP.cjs} +8 -8
  71. package/dist/{chunk-T5I4NRFP.cjs.map → chunk-GFOEWPAP.cjs.map} +1 -1
  72. package/dist/{chunk-QI6AIHWP.cjs → chunk-GOWXP5KT.cjs} +145 -14
  73. package/dist/chunk-GOWXP5KT.cjs.map +1 -0
  74. package/dist/chunk-HALD6ZB5.cjs +18 -0
  75. package/dist/chunk-HALD6ZB5.cjs.map +1 -0
  76. package/dist/chunk-HUJF2XM2.js +6584 -0
  77. package/dist/chunk-HUJF2XM2.js.map +1 -0
  78. package/dist/{chunk-NRFAWUVD.js → chunk-JAANWQGB.js} +157 -157
  79. package/dist/chunk-JAANWQGB.js.map +1 -0
  80. package/dist/{chunk-7RJTEWYM.js → chunk-JGOST4IL.js} +350 -64
  81. package/dist/chunk-JGOST4IL.js.map +1 -0
  82. package/dist/chunk-KHXEIEXN.js +41 -0
  83. package/dist/chunk-KHXEIEXN.js.map +1 -0
  84. package/dist/chunk-KQYPP72K.js +644 -0
  85. package/dist/chunk-KQYPP72K.js.map +1 -0
  86. package/dist/chunk-KUT2Y7JF.cjs +43 -0
  87. package/dist/chunk-KUT2Y7JF.cjs.map +1 -0
  88. package/dist/{chunk-6YTHQ73P.cjs → chunk-LLYZGH3L.cjs} +3 -56
  89. package/dist/chunk-LLYZGH3L.cjs.map +1 -0
  90. package/dist/{chunk-YSHIC4NJ.cjs → chunk-LXTOOUEN.cjs} +159 -154
  91. package/dist/chunk-LXTOOUEN.cjs.map +1 -0
  92. package/dist/{chunk-EVUEIBNU.js → chunk-M4S75AEJ.js} +44 -5
  93. package/dist/chunk-M4S75AEJ.js.map +1 -0
  94. package/dist/{chunk-V5OAXIBN.cjs → chunk-NPR5BGFF.cjs} +11 -11
  95. package/dist/{chunk-V5OAXIBN.cjs.map → chunk-NPR5BGFF.cjs.map} +1 -1
  96. package/dist/{chunk-PLJ7PHWU.cjs → chunk-NS7NVX4E.cjs} +3 -3
  97. package/dist/{chunk-PLJ7PHWU.cjs.map → chunk-NS7NVX4E.cjs.map} +1 -1
  98. package/dist/{chunk-AINU3EJ6.cjs → chunk-Q4BY2CQQ.cjs} +92 -90
  99. package/dist/chunk-Q4BY2CQQ.cjs.map +1 -0
  100. package/dist/chunk-QN47Q4N7.js +16 -0
  101. package/dist/chunk-QN47Q4N7.js.map +1 -0
  102. package/dist/{chunk-I2QSDQQV.cjs → chunk-QT3A4PFC.cjs} +21 -2
  103. package/dist/chunk-QT3A4PFC.cjs.map +1 -0
  104. package/dist/{chunk-ZM26YEOT.js → chunk-RY2SODRN.js} +3 -3
  105. package/dist/{chunk-ZM26YEOT.js.map → chunk-RY2SODRN.js.map} +1 -1
  106. package/dist/chunk-SDOEHEJP.js +208 -0
  107. package/dist/chunk-SDOEHEJP.js.map +1 -0
  108. package/dist/{chunk-DETZZBG2.cjs → chunk-SIB6C7P7.cjs} +43 -2
  109. package/dist/chunk-SIB6C7P7.cjs.map +1 -0
  110. package/dist/{chunk-MFY2ZNP6.cjs → chunk-SMN32BQ3.cjs} +4 -4
  111. package/dist/chunk-SMN32BQ3.cjs.map +1 -0
  112. package/dist/chunk-T74Q3MCZ.cjs +6751 -0
  113. package/dist/chunk-T74Q3MCZ.cjs.map +1 -0
  114. package/dist/{chunk-AOSUHWIL.js → chunk-TZOQKV64.js} +4 -37
  115. package/dist/chunk-TZOQKV64.js.map +1 -0
  116. package/dist/{chunk-U37AYUPI.cjs → chunk-U6JQ4KMX.cjs} +46 -233
  117. package/dist/chunk-U6JQ4KMX.cjs.map +1 -0
  118. package/dist/chunk-WFA2GVZJ.js +16 -0
  119. package/dist/chunk-WFA2GVZJ.js.map +1 -0
  120. package/dist/chunk-WU34CHU5.js +1907 -0
  121. package/dist/chunk-WU34CHU5.js.map +1 -0
  122. package/dist/{chunk-O4YPVYPO.cjs → chunk-YAEXSCUW.cjs} +364 -60
  123. package/dist/chunk-YAEXSCUW.cjs.map +1 -0
  124. package/dist/{chunk-H74HEPKT.js → chunk-YXNNNP57.js} +598 -13
  125. package/dist/chunk-YXNNNP57.js.map +1 -0
  126. package/dist/chunk-Z27QMJ6S.cjs +25 -0
  127. package/dist/chunk-Z27QMJ6S.cjs.map +1 -0
  128. package/dist/{chunk-CSI2B2H5.js → chunk-Z4NQ3TED.js} +4 -4
  129. package/dist/chunk-Z4NQ3TED.js.map +1 -0
  130. package/dist/{chunk-DGV7HQA7.js → chunk-ZLEYLCE4.js} +4 -4
  131. package/dist/chunk-ZLEYLCE4.js.map +1 -0
  132. package/dist/chunk-ZNLTEZEF.js +170 -0
  133. package/dist/chunk-ZNLTEZEF.js.map +1 -0
  134. package/dist/chunk-ZP6Q3KXU.cjs +18 -0
  135. package/dist/chunk-ZP6Q3KXU.cjs.map +1 -0
  136. package/dist/citations/index.cjs +14 -14
  137. package/dist/citations/index.js +2 -2
  138. package/dist/collaboration/index.cjs +35 -35
  139. package/dist/collaboration/index.js +1 -1
  140. package/dist/connect/docx.cjs +21 -26
  141. package/dist/connect/docx.cjs.map +1 -1
  142. package/dist/connect/docx.js +10 -26
  143. package/dist/connect/docx.js.map +1 -1
  144. package/dist/connect/index.cjs +8662 -2824
  145. package/dist/connect/index.cjs.map +1 -1
  146. package/dist/connect/index.d.ts +10 -2
  147. package/dist/connect/index.js +8467 -2670
  148. package/dist/connect/index.js.map +1 -1
  149. package/dist/connect/viewer.cjs +2357 -0
  150. package/dist/connect/viewer.cjs.map +1 -0
  151. package/dist/connect/viewer.d.ts +8 -0
  152. package/dist/connect/viewer.js +2350 -0
  153. package/dist/connect/viewer.js.map +1 -0
  154. package/dist/connection/ConnectedWorkflowsTable.d.ts +2 -12
  155. package/dist/connection/ai.d.ts +2 -9
  156. package/dist/connection/billing/AddAddonDialog.d.ts +24 -0
  157. package/dist/connection/billing/BillingCard.d.ts +18 -0
  158. package/dist/connection/billing/BillingProjectEntity.d.ts +9 -0
  159. package/dist/connection/billing/ChangePlanDialog.d.ts +20 -0
  160. package/dist/connection/billing/ChangeProPlan.d.ts +20 -0
  161. package/dist/connection/billing/CheckoutTotal.d.ts +12 -0
  162. package/dist/connection/billing/DailyCapEditor.d.ts +4 -0
  163. package/dist/connection/billing/InvoicesModal.d.ts +6 -0
  164. package/dist/connection/billing/NewProjectFlow.d.ts +14 -0
  165. package/dist/connection/billing/PlanChangeLines.d.ts +13 -0
  166. package/dist/connection/billing/PlanSelector.d.ts +50 -0
  167. package/dist/connection/billing/ProjectBilling.d.ts +24 -0
  168. package/dist/connection/billing/ProjectDetail.d.ts +16 -0
  169. package/dist/connection/billing/ProjectUsageCard.d.ts +21 -0
  170. package/dist/connection/billing/ProjectUsageContent.d.ts +18 -0
  171. package/dist/connection/billing/ProjectsTable.d.ts +13 -0
  172. package/dist/connection/billing/ReduceAddonDialog.d.ts +18 -0
  173. package/dist/connection/billing/ReferralReward.d.ts +32 -0
  174. package/dist/connection/billing/SharedProjects.d.ts +13 -0
  175. package/dist/connection/billing/StripeCheckoutModal.d.ts +32 -0
  176. package/dist/connection/billing/SubscriptionPlans.d.ts +15 -0
  177. package/dist/connection/billing/SubscriptionStatus.d.ts +10 -0
  178. package/dist/connection/billing/addon-pricing.d.ts +97 -0
  179. package/dist/connection/billing/api-error.d.ts +6 -0
  180. package/dist/connection/billing/billing-country.d.ts +14 -0
  181. package/dist/connection/billing/billing-focus.d.ts +11 -0
  182. package/dist/connection/billing/index.d.ts +22 -0
  183. package/dist/connection/billing/plan-badge.d.ts +15 -0
  184. package/dist/connection/billing/plan-change-outcome.d.ts +15 -0
  185. package/dist/connection/billing/plan-constants.d.ts +29 -0
  186. package/dist/connection/billing/plan-pricing.d.ts +67 -0
  187. package/dist/connection/billing/quota-items.d.ts +33 -0
  188. package/dist/connection/billing/referral-reward.d.ts +28 -0
  189. package/dist/connection/billing/refusal-copy.d.ts +5 -0
  190. package/dist/connection/billing/reward-balance.d.ts +19 -0
  191. package/dist/connection/billing/support.d.ts +35 -0
  192. package/dist/connection/billing/tax-quote.d.ts +36 -0
  193. package/dist/connection/billing/useAddonPurchase.d.ts +32 -0
  194. package/dist/connection/billing/useAutoRefreshPendingProjects.d.ts +11 -0
  195. package/dist/connection/billing/useCheckoutQuote.d.ts +30 -0
  196. package/dist/connection/billing/useOpenBillingPortal.d.ts +12 -0
  197. package/dist/connection/calendar/CalendarSettingsDialog.d.ts +1 -1
  198. package/dist/connection/facts/ConnectedFactsPage.d.ts +50 -0
  199. package/dist/connection/facts/FactMarkdownEditor.d.ts +57 -0
  200. package/dist/connection/facts/FactSourcesPopover.d.ts +38 -0
  201. package/dist/connection/facts/FactTextEditor.d.ts +2 -0
  202. package/dist/connection/facts/factNouns.d.ts +4 -0
  203. package/dist/connection/facts/factPageColumns.d.ts +37 -0
  204. package/dist/connection/facts/types.d.ts +127 -0
  205. package/dist/connection/facts/useFactActions.d.ts +10 -0
  206. package/dist/connection/facts/useFactComposer.d.ts +54 -0
  207. package/dist/connection/facts/useFactFilters.d.ts +101 -0
  208. package/dist/connection/facts/useFactSelection.d.ts +82 -0
  209. package/dist/connection/facts/useFactsGrid.d.ts +87 -0
  210. package/dist/connection/facts/useFactsPageView.d.ts +4 -0
  211. package/dist/connection/mail/ConnectedMailComposer.d.ts +3 -1
  212. package/dist/connection/mail/ConnectedMailbox.d.ts +4 -2
  213. package/dist/connection/mail/MailComposerForm.d.ts +4 -2
  214. package/dist/connection/mail/MailRecipientInput.d.ts +14 -0
  215. package/dist/connection/mail/index.d.ts +1 -1
  216. package/dist/connection/mail/types.d.ts +10 -0
  217. package/dist/connection/search/ConnectedSearchPage.d.ts +64 -0
  218. package/dist/connection/search/SearchResultRows.d.ts +38 -0
  219. package/dist/connection/search/index.d.ts +2 -0
  220. package/dist/connection/tags/ConnectedTagTable.d.ts +108 -0
  221. package/dist/connection/tags/ConnectedTagsPage.d.ts +55 -0
  222. package/dist/connection/tags/DocTagPassages.d.ts +25 -0
  223. package/dist/connection/tags/GlossaryExport.d.ts +7 -0
  224. package/dist/connection/tags/TagCombineFilter.d.ts +14 -0
  225. package/dist/connection/tags/TagPlacement.d.ts +16 -0
  226. package/dist/connection/tags/TagsPageSections.d.ts +36 -0
  227. package/dist/connection/tags/tagCombine.d.ts +55 -0
  228. package/dist/connection/useConnectedWorkNotifications.d.ts +7 -24
  229. package/dist/connection/viewer/ConnectedDocumentToolsProvider.d.ts +11 -0
  230. package/dist/connection/viewer/ConnectedDocumentViewer.d.ts +21 -0
  231. package/dist/connection/viewer/FinaliseTranslationButton.d.ts +15 -0
  232. package/dist/connection/viewer/ViewerPdfPane.d.ts +46 -0
  233. package/dist/connection/viewer/parsed/ParsedPassage.d.ts +48 -0
  234. package/dist/connection/viewer/parsed/ParsedTextView.d.ts +17 -0
  235. package/dist/connection/viewer/parsed/PassageTagPanel.d.ts +18 -0
  236. package/dist/connection/viewer/parsed/citation-line.d.ts +17 -0
  237. package/dist/connection/viewer/parsed/document-tags.d.ts +8 -0
  238. package/dist/connection/viewer/parsed/useChunkTagging.d.ts +46 -0
  239. package/dist/connection/viewer/parsed/useCitationSelection.d.ts +27 -0
  240. package/dist/connection/viewer/parsed/useDocumentLabels.d.ts +38 -0
  241. package/dist/connection/viewer/parsed/useLazyPages.d.ts +18 -0
  242. package/dist/connection/viewer/parsed/usePageScrollSync.d.ts +17 -0
  243. package/dist/connection/viewer/parsed/usePassageCopy.d.ts +25 -0
  244. package/dist/connection/viewer/support.d.ts +97 -0
  245. package/dist/connection/viewer/useImageCrop.d.ts +13 -0
  246. package/dist/connection/viewer/useViewedDocument.d.ts +70 -0
  247. package/dist/connection/viewer/useViewerBlobs.d.ts +15 -0
  248. package/dist/connection/viewer/useViewerTabs.d.ts +18 -0
  249. package/dist/connection/viewer/useViewerVersions.d.ts +11 -0
  250. package/dist/connection/workspace-settings/useConnectedWorkspaceSettings.d.ts +6 -0
  251. package/dist/document-tools/index.cjs +59 -652
  252. package/dist/document-tools/index.cjs.map +1 -1
  253. package/dist/document-tools/index.js +2 -641
  254. package/dist/document-tools/index.js.map +1 -1
  255. package/dist/docx/index.cjs +48 -47
  256. package/dist/docx/index.js +4 -3
  257. package/dist/facts/FactsBulkBar.d.ts +6 -3
  258. package/dist/facts/cited-version-ref.d.ts +1 -0
  259. package/dist/facts/index.cjs +204 -1940
  260. package/dist/facts/index.cjs.map +1 -1
  261. package/dist/facts/index.d.ts +1 -0
  262. package/dist/facts/index.js +13 -1895
  263. package/dist/facts/index.js.map +1 -1
  264. package/dist/files/TagPassagePanel.d.ts +2 -1
  265. package/dist/files/ViewerChrome.d.ts +5 -4
  266. package/dist/files/ViewerControlBar.d.ts +12 -0
  267. package/dist/files/doc-labels.d.ts +35 -0
  268. package/dist/files/grid/FilterButton.d.ts +12 -0
  269. package/dist/files/grid/RowDensityControl.d.ts +18 -0
  270. package/dist/files/grid/row-density.d.ts +27 -0
  271. package/dist/files/index.cjs +778 -7099
  272. package/dist/files/index.cjs.map +1 -1
  273. package/dist/files/index.d.ts +5 -0
  274. package/dist/files/index.js +13 -6918
  275. package/dist/files/index.js.map +1 -1
  276. package/dist/index.cjs +993 -1209
  277. package/dist/index.cjs.map +1 -1
  278. package/dist/index.js +22 -355
  279. package/dist/index.js.map +1 -1
  280. package/dist/retrieval/SearchSnippet.d.ts +6 -0
  281. package/dist/retrieval/index.cjs +74 -41
  282. package/dist/retrieval/index.d.ts +2 -0
  283. package/dist/retrieval/index.js +2 -1
  284. package/dist/retrieval/search-results.d.ts +46 -0
  285. package/dist/settings/Billing.d.ts +0 -66
  286. package/dist/settings/SubscriptionParts.d.ts +1 -50
  287. package/dist/settings/index.cjs +166 -214
  288. package/dist/settings/index.d.ts +3 -2
  289. package/dist/settings/index.js +1 -1
  290. package/dist/settings/inverted-index-filter.d.ts +26 -0
  291. package/dist/studio/index.cjs +3 -3
  292. package/dist/studio/index.js +2 -2
  293. package/dist/tags/definitions.d.ts +10 -0
  294. package/dist/tags/index.d.ts +4 -1
  295. package/dist/tags/page/ExtractEntitiesDialog.d.ts +24 -0
  296. package/dist/tags/page/TagPicker.d.ts +16 -0
  297. package/dist/tags/page/tagsPageLabels.d.ts +36 -0
  298. package/dist/workflow-canvas/index.cjs +19 -20
  299. package/dist/workflow-canvas/index.cjs.map +1 -1
  300. package/dist/workflow-canvas/index.js +6 -7
  301. package/dist/workflow-canvas/index.js.map +1 -1
  302. package/node_modules/@arbidocs/coedit/package.json +1 -1
  303. package/package.json +13 -4
  304. package/dist/calendar/access-setup.d.ts +0 -8
  305. package/dist/chunk-2MJWWPHY.js.map +0 -1
  306. package/dist/chunk-3AFWGEDJ.cjs +0 -53
  307. package/dist/chunk-3AFWGEDJ.cjs.map +0 -1
  308. package/dist/chunk-6YTHQ73P.cjs.map +0 -1
  309. package/dist/chunk-7RJTEWYM.js.map +0 -1
  310. package/dist/chunk-AINU3EJ6.cjs.map +0 -1
  311. package/dist/chunk-AOSUHWIL.js.map +0 -1
  312. package/dist/chunk-B3AHCIV5.js.map +0 -1
  313. package/dist/chunk-CSI2B2H5.js.map +0 -1
  314. package/dist/chunk-DAHCRVPM.js.map +0 -1
  315. package/dist/chunk-DETZZBG2.cjs.map +0 -1
  316. package/dist/chunk-DGV7HQA7.js.map +0 -1
  317. package/dist/chunk-EVUEIBNU.js.map +0 -1
  318. package/dist/chunk-H74HEPKT.js.map +0 -1
  319. package/dist/chunk-I2QSDQQV.cjs.map +0 -1
  320. package/dist/chunk-J5CWKFSC.js +0 -170
  321. package/dist/chunk-J5CWKFSC.js.map +0 -1
  322. package/dist/chunk-LTU35TQN.cjs.map +0 -1
  323. package/dist/chunk-MFY2ZNP6.cjs.map +0 -1
  324. package/dist/chunk-MHFF5N65.cjs.map +0 -1
  325. package/dist/chunk-NRFAWUVD.js.map +0 -1
  326. package/dist/chunk-O4YPVYPO.cjs.map +0 -1
  327. package/dist/chunk-ODRHHWHY.cjs.map +0 -1
  328. package/dist/chunk-QI6AIHWP.cjs.map +0 -1
  329. package/dist/chunk-QXMR5YHC.js.map +0 -1
  330. package/dist/chunk-RFXJYIDV.js +0 -50
  331. package/dist/chunk-RFXJYIDV.js.map +0 -1
  332. package/dist/chunk-U37AYUPI.cjs.map +0 -1
  333. package/dist/chunk-WIZ7Z7FN.js.map +0 -1
  334. package/dist/chunk-XVUOMWMD.cjs +0 -177
  335. package/dist/chunk-XVUOMWMD.cjs.map +0 -1
  336. package/dist/chunk-YSHIC4NJ.cjs.map +0 -1
  337. package/dist/connection/ConnectedTagTable.d.ts +0 -32
  338. package/dist/connection/calendar/CopyField.d.ts +0 -9
  339. package/dist/connection/calendar/OpenAccessPanel.d.ts +0 -7
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/LoadingIndicator.tsx","../src/components/EntityIdentityBar.tsx","../src/activity/workspace-activity.ts","../src/activity/WorkspaceActivityList.tsx","../src/activity/NotificationRelevanceControls.tsx","../src/tags/tagTableModel.ts","../src/tags/TagColumnsEditor.tsx","../src/tags/TagTable.tsx","../src/tags/tagTableDocx.ts"],"names":["cn","jsxs","jsx","useState","useEffect","Textarea","Input","Pencil","taskActivityHeadline","DEFAULT_TASK_ACTIVITY_LABELS","Activity","MessageSquare","FileText","Workflow","Button","Fragment","Bell","BellRing","BellOff","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuLabel","DropdownMenuRadioGroup","DropdownMenuRadioItem","DropdownMenuSeparator","DropdownMenuItem","ArrowUp","ArrowDown","X","Plus","Loader2","Checkbox","ArrowUpRight","ChevronDown","count","Lightbulb","MessagesSquare","useMemo","SlidersHorizontal","Download","FileDown","paragraph","page","minuteUtc","cell","documentXml","docxPackage","TABLE_DOCUMENT_STYLES"],"mappings":"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","file":"chunk-LTU35TQN.cjs","sourcesContent":["/**\n * LoadingIndicator Component\n *\n * Centralized loading indicator for consistent loading states across the app\n * Provides different variants and sizes for various use cases\n */\n\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface LoadingIndicatorProps {\n /** Optional message to display below the spinner */\n message?: string\n /** Size variant of the spinner */\n size?: 'small' | 'medium' | 'large'\n /** Whether to center the loader in its container */\n centered?: boolean\n /** Whether to use full screen overlay */\n fullScreen?: boolean\n /** Additional CSS classes */\n className?: string\n /** Test ID for testing */\n testId?: string\n}\n\nexport function LoadingIndicator({\n message,\n size = 'medium',\n centered = true,\n fullScreen = false,\n className,\n testId = 'loading-indicator',\n}: LoadingIndicatorProps) {\n const sizeClasses = {\n small: 'h-4 w-4 border',\n medium: 'h-8 w-8 border-2',\n large: 'h-12 w-12 border-2',\n }\n\n const containerClasses = cn(\n 'flex flex-col items-center justify-center gap-3',\n {\n 'h-64': centered && !fullScreen,\n 'fixed inset-0 bg-background/75 z-50': fullScreen,\n },\n className\n )\n\n const spinnerClasses = cn(\n 'animate-spin rounded-full border-border border-t-primary',\n sizeClasses[size]\n )\n\n return (\n <div className={containerClasses} data-testid={testId}>\n <div className={spinnerClasses} />\n {message && <p className=\"text-sm text-muted-foreground\">{message}</p>}\n </div>\n )\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { Pencil } from 'lucide-react'\nimport { Input, Textarea, cn } from '@arbidocs/react/ui'\n\n/** Longest a name may be. Exported so a form editing the same field agrees. */\nexport const IDENTITY_NAME_MAX_LENGTH = 50\n\n/** Shown once the remaining allowance gets this low, not for the whole time. */\nconst COUNTER_THRESHOLD = 10\n\nexport interface EntityIdentityField {\n /** Row caption. Rendered with a trailing colon. */\n label: string\n value: string\n /** Stands in for an empty value, in italics — never a blank row. */\n placeholder: string\n /** Commits the edit. Not called when the value is unchanged. */\n onSave: (next: string) => void\n /** A description needs line breaks; a name does not. */\n multiline?: boolean\n /** Caps the input and shows a counter as it fills. Names only, by default. */\n maxLength?: number\n /** Classes for the read-mode value, e.g. a larger weight for the name. */\n valueClassName?: string\n /**\n * Content pinned to the RIGHT END of this row — e.g. the owning project\n * beside a name, a member stack beside a status. Rows without one let their\n * value run the full width, which is what a description wants.\n */\n trailing?: ReactNode\n /**\n * Content rendered immediately BEFORE the value — the entity's own mark.\n * Sits outside the edit swap, so starting to edit the name doesn't make the\n * icon jump or disappear.\n */\n leading?: ReactNode\n /**\n * Drops the caption from view for this row, leaving the value flush left.\n * For a field whose value already says what it is — a workspace's name and\n * description read as exactly that — the caption is a word the eye has to\n * step over on the way in. The caption stays in the markup for screen\n * readers, which have no such visual cue to fall back on.\n */\n hideLabel?: boolean\n /** Row test id; the pencil and input derive `-edit` and `-input`. */\n testId?: string\n}\n\nexport interface EntityIdentityBarProps {\n /** The editable text fields, in order. Usually name then description. */\n fields: EntityIdentityField[]\n /**\n * Read-only rows shown after the editable ones — anything whose control the\n * consumer owns (a project picker, an owner avatar, a status). Rendered with\n * the same caption column so every row lines up.\n */\n extraRows?: { label: string; content: ReactNode; trailing?: ReactNode; testId?: string }[]\n /** Hides every pencil. A viewer without permission sees values, not controls. */\n canEdit?: boolean\n /** Trailing controls, pinned right — e.g. a member stack, a status. */\n actions?: ReactNode\n /**\n * Controls that act on the ENTITY rather than on any one field — typically an\n * overflow menu holding delete or leave. Sits under the field list, where a\n * destructive action is findable but not in the path of everyday reading.\n */\n footer?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The \"what am I looking at\" bar for an entity's own page.\n *\n * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The\n * captions are the point: a bare bold string at the top of a page reads equally\n * as a workspace, a project, a case file or a folder, and people read it as\n * whichever they expected. Saying which field is which costs one column and\n * removes the ambiguity entirely.\n *\n * Editing happens in place. The pencil is always visible to someone who can use\n * it rather than revealed on hover — a control you have to go hunting for is one\n * most people never find, and hover doesn't exist on touch. Commit is on blur\n * and on Enter (single-line fields only, so a description can hold line\n * breaks); Escape abandons the edit.\n *\n * Deliberately NOT a form: no submit, no dirty state, no field-level errors.\n * When a consumer needs visibility toggles, destructive actions or validation\n * messages, those belong in its settings form — this bar is the identity of the\n * thing, shown where you are working on it.\n *\n * Styled with SEMANTIC tokens only, so every host gets it in its own colours.\n */\nexport function EntityIdentityBar({\n fields,\n extraRows = [],\n canEdit = false,\n actions,\n footer,\n className,\n testId,\n}: EntityIdentityBarProps) {\n return (\n <div\n className={cn('flex flex-wrap items-start justify-between gap-x-6 gap-y-3', className)}\n data-testid={testId}\n >\n <dl className=\"min-w-0 flex-1 space-y-1.5\">\n {fields.map((field) => (\n <IdentityFieldRow key={field.label} field={field} canEdit={canEdit} />\n ))}\n {extraRows.map((row) => (\n <div\n key={row.label}\n className=\"flex min-h-7 min-w-0 items-center gap-2\"\n data-testid={row.testId}\n >\n <dt className=\"w-24 shrink-0 text-sm font-medium text-muted-foreground\">\n {row.label}:\n </dt>\n <dd className=\"flex min-w-0 flex-1 items-center gap-2\">\n {row.content}\n {row.trailing ? (\n <div className=\"min-w-0 shrink-0 sm:ml-auto\">{row.trailing}</div>\n ) : null}\n </dd>\n </div>\n ))}\n {footer ? <div className=\"flex items-center pt-0.5\">{footer}</div> : null}\n </dl>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n )\n}\n\nfunction IdentityFieldRow({ field, canEdit }: { field: EntityIdentityField; canEdit: boolean }) {\n const {\n label,\n value,\n placeholder,\n onSave,\n multiline = false,\n maxLength,\n valueClassName,\n leading,\n hideLabel,\n trailing,\n testId,\n } = field\n\n const [isEditing, setIsEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n\n // Track the value while not editing, so an update from elsewhere (another\n // tab, a websocket) doesn't get overwritten by a stale draft on the next edit.\n useEffect(() => {\n if (!isEditing) setDraft(value)\n }, [value, isEditing])\n\n const commit = () => {\n setIsEditing(false)\n const next = draft.trim()\n if (next !== value) onSave(next)\n }\n\n const cancel = () => {\n setDraft(value)\n setIsEditing(false)\n }\n\n const charsLeft = maxLength === undefined ? null : maxLength - draft.length\n\n // Editing must not move anything. The input carries the read view's exact\n // typography and padding, drops the border and shadow entirely, and marks\n // focus with a contrasting FIELD instead — a box appearing around the text\n // (and the row growing to fit it) reads as the page jumping under the cursor.\n const fieldClass =\n 'h-auto rounded border-0 bg-muted px-1.5 py-0.5 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\n const shared = {\n autoFocus: true,\n value: draft,\n placeholder,\n maxLength,\n 'aria-label': label,\n 'data-testid': testId && `${testId}-input`,\n onBlur: commit,\n onChange: (e: { target: { value: string } }) => setDraft(e.target.value),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n } else if (e.key === 'Enter' && !multiline) {\n e.preventDefault()\n commit()\n }\n },\n }\n\n // Every row shares one minimum height: that of the small controls (h-7) a\n // row may carry at its trailing end. A row that is only text then sits in\n // the same rhythm as one holding a button, so the captions fall on an even\n // beat down the bar instead of bunching up wherever a row has no control.\n return (\n <div className={cn('flex min-h-7 min-w-0 gap-2', multiline ? 'items-start' : 'items-center')}>\n <dt\n className={cn(\n hideLabel\n ? 'sr-only'\n : cn('w-24 shrink-0 text-sm font-medium text-muted-foreground', multiline && 'pt-1')\n )}\n >\n {label}:\n </dt>\n {/* Wraps under sm: the trailing controls drop to their own line instead of overflowing. */}\n <dd className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1.5 sm:flex-nowrap\">\n {leading}\n {isEditing ? (\n <div className=\"relative min-w-0 flex-1 max-sm:basis-[calc(100%-2.5rem)]\">\n {multiline ? (\n <Textarea\n {...shared}\n rows={2}\n className={cn(fieldClass, 'min-h-0 resize-none leading-snug', valueClassName)}\n />\n ) : (\n <Input {...shared} className={cn(fieldClass, 'pr-20', valueClassName)} />\n )}\n {charsLeft !== null && charsLeft <= COUNTER_THRESHOLD && (\n <span\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-destructive' : 'text-muted-foreground'\n )}\n data-testid={testId && `${testId}-counter`}\n >\n {charsLeft < 0 ? `${-charsLeft} over` : `${charsLeft} left`}\n </span>\n )}\n </div>\n ) : (\n // `identity-field` (not the generic `group`) scopes the pencil's hover\n // to THIS field only — an ancestor card also carries `group`, so a\n // `.group:hover` rule would reveal every field's pencil at once.\n <span className=\"identity-field flex min-w-0 flex-1 items-center gap-1.5 sm:flex-none\">\n {/* Same padding as the input above — the swap must not nudge the\n text sideways or change the row's height. */}\n <span className={cn('px-1.5 py-0.5', valueClassName)} data-testid={testId}>\n {value || <span className=\"italic text-muted-foreground\">{placeholder}</span>}\n </span>\n {canEdit && (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n aria-label={`Edit ${label.toLowerCase()}`}\n title={`Edit ${label.toLowerCase()}`}\n // Quiet by default — the pencil only surfaces when the row is\n // hovered so it reads as clean text, and stays reachable by\n // keyboard (focus-visible).\n //\n // NB: use the ungated `[.identity-field:hover_&]` selector rather\n // than Tailwind's `group-hover:`. The latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (whose PRIMARY\n // pointer reports `hover: none`) the rule is disabled even when a\n // real mouse is firing hover events — the pencil then stays at\n // opacity-0 forever. The arbitrary selector has no media gate, so\n // it reveals on any genuine `:hover`.\n className=\"shrink-0 cursor-pointer rounded p-1 text-muted-foreground opacity-60 transition-[color,background-color,opacity] hover:bg-accent hover:text-foreground focus-visible:opacity-100 pointer-coarse:p-[15px] [.identity-field:hover_&]:opacity-100\"\n data-testid={testId && `${testId}-edit`}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n </span>\n )}\n {trailing ? (\n <div className=\"min-w-0 shrink-0 max-sm:w-full sm:ml-auto\">{trailing}</div>\n ) : null}\n </dd>\n </div>\n )\n}\n","/**\n * The workspace activity feed's entries, as `GET /v1/workspace/{id}/activity` returns them, and what\n * each one says and opens. Everything a person is not pushed (uploads, other people's threads, runs)\n * can still be found here.\n */\n\nimport {\n DEFAULT_TASK_ACTIVITY_LABELS,\n taskActivityHeadline,\n type TaskActivityKind,\n} from '../agents/tasks/TaskActivityTimeline'\n\n/** Where an entry comes from. */\nexport type WorkspaceActivitySource = 'thread' | 'message' | 'document' | 'workflow'\n\n/** One entry of the feed (the shape of the API's `WorkspaceActivityEntry`). */\nexport interface WorkspaceActivityItem {\n external_id: string\n source: WorkspaceActivitySource\n /** A thread event kind, `message_posted`, `document_uploaded` / `_version` / `_signed`, `workflow_run`. */\n kind: string\n actor_ext_id?: string | null\n conversation_ext_id?: string | null\n /** Decrypted when the session has the workspace open, else null. */\n conversation_title?: string | null\n message_ext_id?: string | null\n document_ext_id?: string | null\n document_name?: string | null\n version?: number | null\n workflow_ext_id?: string | null\n workflow_name?: string | null\n /** A workflow run's status. */\n status?: string | null\n detail?: Record<string, unknown> | null\n created_at: string\n}\n\n/** What clicking an entry opens. */\nexport type WorkspaceActivityTarget =\n | { kind: 'thread'; conversationId: string; messageId?: string }\n | { kind: 'document'; documentId: string; version?: number }\n | { kind: 'workflow'; workflowId: string; conversationId?: string }\n\n/** The thread, document version or run an entry opens; null when it names nothing openable. */\nexport function workspaceActivityTarget(\n item: WorkspaceActivityItem\n): WorkspaceActivityTarget | null {\n switch (item.source) {\n case 'thread':\n case 'message':\n return item.conversation_ext_id\n ? {\n kind: 'thread',\n conversationId: item.conversation_ext_id,\n ...(item.message_ext_id ? { messageId: item.message_ext_id } : {}),\n }\n : null\n case 'document':\n if (!item.document_ext_id) return null\n // An upload is the document as it was first saved; a new version or a signature opens that version.\n return item.kind !== 'document_uploaded' && item.version\n ? { kind: 'document', documentId: item.document_ext_id, version: item.version }\n : { kind: 'document', documentId: item.document_ext_id }\n case 'workflow':\n return item.workflow_ext_id\n ? {\n kind: 'workflow',\n workflowId: item.workflow_ext_id,\n ...(item.conversation_ext_id ? { conversationId: item.conversation_ext_id } : {}),\n }\n : null\n default:\n return null\n }\n}\n\nconst quoted = (name: string | null | undefined, fallback: string) =>\n name ? `“${name}”` : fallback\n\n/** What happened, without who did it: \"Uploaded “Lease.pdf”\", \"Marked done in “Smith v Jones”\". */\nexport function workspaceActivityHeadline(item: WorkspaceActivityItem): string {\n const thread = quoted(item.conversation_title, 'a thread')\n const document = quoted(item.document_name, 'a document')\n switch (item.kind) {\n case 'message_posted':\n return `Posted in ${thread}`\n case 'document_uploaded':\n return `Uploaded ${document}`\n case 'document_version':\n return item.version\n ? `Saved version ${item.version} of ${document}`\n : `Saved a new version of ${document}`\n case 'document_signed':\n return `Signed ${document}`\n case 'workflow_run': {\n const run = `Ran ${quoted(item.workflow_name, 'a workflow')}`\n return item.status ? `${run} (${item.status.replace(/_/g, ' ')})` : run\n }\n default: {\n const headline = taskActivityHeadline(\n { kind: item.kind as TaskActivityKind, detail: item.detail },\n DEFAULT_TASK_ACTIVITY_LABELS\n )\n return `${headline} in ${thread}`\n }\n }\n}\n","import type { ReactNode } from 'react'\nimport { Activity, FileText, MessageSquare, Workflow } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport {\n workspaceActivityHeadline,\n workspaceActivityTarget,\n type WorkspaceActivityItem,\n type WorkspaceActivitySource,\n type WorkspaceActivityTarget,\n} from './workspace-activity'\n\nexport interface WorkspaceActivityListLabels {\n empty: string\n loading: string\n error: string\n loadMore: string\n loadingMore: string\n retry: string\n /** Who did it when the entry names no one. */\n system: string\n}\n\nexport const DEFAULT_WORKSPACE_ACTIVITY_LABELS: WorkspaceActivityListLabels = {\n empty: 'Nothing has happened in this workspace yet.',\n loading: 'Loading activity…',\n error: 'Could not load the activity.',\n loadMore: 'Show older',\n loadingMore: 'Loading…',\n retry: 'Retry',\n system: 'ARBI',\n}\n\nexport interface WorkspaceActivityListProps {\n /** Entries, newest first (every page loaded so far). */\n items: readonly WorkspaceActivityItem[]\n isLoading?: boolean\n isError?: boolean\n /** Another page exists. */\n hasMore?: boolean\n isLoadingMore?: boolean\n onLoadMore?: () => void\n onRetry?: () => void\n /** Open what an entry is about: its thread, document version or run. */\n onOpen?: (target: WorkspaceActivityTarget, item: WorkspaceActivityItem) => void\n /** A person's or agent's display name by id. */\n nameOf?: (id: string) => string | undefined\n /** \"2 hours ago\"; default the local date and time. */\n formatTime?: (iso: string) => string\n labels?: Partial<WorkspaceActivityListLabels>\n className?: string\n testId?: string\n}\n\nconst ICONS: Record<WorkspaceActivitySource, ReactNode> = {\n thread: <Activity className=\"size-4\" aria-hidden />,\n message: <MessageSquare className=\"size-4\" aria-hidden />,\n document: <FileText className=\"size-4\" aria-hidden />,\n workflow: <Workflow className=\"size-4\" aria-hidden />,\n}\n\nconst localTime = (iso: string) => new Date(iso).toLocaleString()\n\n/** A workspace's activity, newest first, one line per entry; a line opens what it is about. */\nexport function WorkspaceActivityList({\n items,\n isLoading,\n isError,\n hasMore,\n isLoadingMore,\n onLoadMore,\n onRetry,\n onOpen,\n nameOf,\n formatTime = localTime,\n labels,\n className,\n testId = 'workspace-activity',\n}: WorkspaceActivityListProps) {\n const l = { ...DEFAULT_WORKSPACE_ACTIVITY_LABELS, ...labels }\n if (isLoading)\n return (\n <p className={cn('p-3 text-sm text-muted-foreground', className)} data-testid={testId}>\n {l.loading}\n </p>\n )\n if (isError && items.length === 0)\n return (\n <div\n className={cn('flex items-center gap-2 p-3 text-sm text-muted-foreground', className)}\n data-testid={testId}\n >\n <span role=\"alert\">{l.error}</span>\n {onRetry && (\n <Button size=\"sm\" variant=\"ghost\" onClick={onRetry}>\n {l.retry}\n </Button>\n )}\n </div>\n )\n if (items.length === 0)\n return (\n <p className={cn('p-3 text-sm text-muted-foreground', className)} data-testid={testId}>\n {l.empty}\n </p>\n )\n\n return (\n <div className={cn('flex flex-col', className)} data-testid={testId}>\n <ul className=\"divide-y divide-border\" data-testid={`${testId}-list`}>\n {items.map((item) => {\n const target = workspaceActivityTarget(item)\n const actor = item.actor_ext_id ? (nameOf?.(item.actor_ext_id) ?? null) : l.system\n const body = (\n <>\n <span className=\"mt-0.5 shrink-0 text-muted-foreground\">{ICONS[item.source]}</span>\n <span className=\"min-w-0 flex-1 text-sm\">\n {actor && <span className=\"font-medium\">{actor} </span>}\n <span className=\"text-muted-foreground\">{workspaceActivityHeadline(item)}</span>\n </span>\n <time\n dateTime={item.created_at}\n className=\"shrink-0 text-xs tabular-nums text-muted-foreground\"\n >\n {formatTime(item.created_at)}\n </time>\n </>\n )\n return (\n <li\n key={item.external_id}\n data-testid={`${testId}-item-${item.external_id}`}\n data-kind={item.kind}\n >\n {target && onOpen ? (\n <button\n type=\"button\"\n className=\"flex w-full items-start gap-3 px-3 py-2 text-left hover:bg-accent focus-visible:bg-accent focus-visible:outline-none\"\n onClick={() => onOpen(target, item)}\n >\n {body}\n </button>\n ) : (\n <div className=\"flex items-start gap-3 px-3 py-2\">{body}</div>\n )}\n </li>\n )\n })}\n </ul>\n {hasMore && onLoadMore && (\n <div className=\"flex justify-center p-2\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={isLoadingMore}\n onClick={onLoadMore}\n data-testid={`${testId}-load-more`}\n >\n {isLoadingMore ? l.loadingMore : l.loadMore}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","/**\n * Follow and mute controls. A workspace member is pushed only what concerns them; following a\n * workspace or a thread opts in to everything from it, and muting a workspace silences it,\n * mentions included. Presentational: the host owns the settings and the save.\n */\n\nimport { Activity, Bell, BellOff, BellRing } from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\n\n/** `default` (what names or involves you), `following` (everything) or `muted` (nothing). */\nexport type NotificationLevel = 'default' | 'following' | 'muted'\n\nexport interface WorkspaceNotificationMenuLabels {\n trigger: string\n heading: string\n default: string\n defaultHint: string\n following: string\n followingHint: string\n muted: string\n mutedHint: string\n activity: string\n}\n\nexport const DEFAULT_WORKSPACE_NOTIFICATION_MENU_LABELS: WorkspaceNotificationMenuLabels = {\n trigger: 'Workspace notifications',\n heading: 'Notify me about',\n default: 'What involves me',\n defaultHint: 'Mentions, assignments and replies to my threads',\n following: 'Everything',\n followingHint: 'Follow every thread, upload and run',\n muted: 'Nothing',\n mutedHint: 'Mute the workspace, mentions included',\n activity: 'Workspace activity',\n}\n\nconst LEVEL_ICON = { default: Bell, following: BellRing, muted: BellOff } as const\n\nexport interface WorkspaceNotificationMenuProps {\n level: NotificationLevel\n onLevelChange: (level: NotificationLevel) => void\n disabled?: boolean\n /** Adds an item that opens the workspace's activity feed. */\n onOpenActivity?: () => void\n labels?: Partial<WorkspaceNotificationMenuLabels>\n className?: string\n testId?: string\n}\n\n/** A bell button whose menu sets how much of a workspace reaches the user. */\nexport function WorkspaceNotificationMenu({\n level,\n onLevelChange,\n disabled,\n onOpenActivity,\n labels,\n className,\n testId = 'workspace-notification-menu',\n}: WorkspaceNotificationMenuProps) {\n const l = { ...DEFAULT_WORKSPACE_NOTIFICATION_MENU_LABELS, ...labels }\n const Icon = LEVEL_ICON[level]\n const options: { value: NotificationLevel; title: string; hint: string }[] = [\n { value: 'default', title: l.default, hint: l.defaultHint },\n { value: 'following', title: l.following, hint: l.followingHint },\n { value: 'muted', title: l.muted, hint: l.mutedHint },\n ]\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className={cn('size-7 shrink-0 pointer-coarse:size-11', className)}\n aria-label={l.trigger}\n title={l.trigger}\n data-testid={testId}\n data-level={level}\n >\n <Icon className={cn('size-4', level === 'muted' && 'text-muted-foreground')} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-72\">\n <DropdownMenuLabel>{l.heading}</DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={level}\n onValueChange={(value) => {\n if (value !== level) onLevelChange(value as NotificationLevel)\n }}\n >\n {options.map((option) => (\n <DropdownMenuRadioItem\n key={option.value}\n value={option.value}\n disabled={disabled}\n data-testid={`${testId}-${option.value}`}\n >\n <span className=\"flex flex-col\">\n <span>{option.title}</span>\n <span className=\"text-xs text-muted-foreground\">{option.hint}</span>\n </span>\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n {onOpenActivity && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onSelect={onOpenActivity} data-testid={`${testId}-activity`}>\n <Activity className=\"mr-2 size-4\" aria-hidden />\n {l.activity}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport interface ThreadFollowLabels {\n follow: string\n unfollow: string\n}\n\nexport const DEFAULT_THREAD_FOLLOW_LABELS: ThreadFollowLabels = {\n follow: 'Follow thread',\n unfollow: 'Unfollow thread',\n}\n\nexport interface ThreadFollowProps {\n following: boolean\n onFollowingChange: (following: boolean) => void\n disabled?: boolean\n labels?: Partial<ThreadFollowLabels>\n testId?: string\n}\n\n/** \"Follow thread\" / \"Unfollow thread\" as an item of a thread's options menu. */\nexport function ThreadFollowMenuItem({\n following,\n onFollowingChange,\n disabled,\n labels,\n testId = 'thread-follow-item',\n}: ThreadFollowProps) {\n const l = { ...DEFAULT_THREAD_FOLLOW_LABELS, ...labels }\n const Icon = following ? BellOff : BellRing\n return (\n <DropdownMenuItem\n disabled={disabled}\n onSelect={() => onFollowingChange(!following)}\n data-testid={testId}\n data-following={following}\n >\n <Icon className=\"mr-2 size-4\" aria-hidden />\n {following ? l.unfollow : l.follow}\n </DropdownMenuItem>\n )\n}\n\n/** The same switch as a bell button, for a thread header without a menu. */\nexport function ThreadFollowButton({\n following,\n onFollowingChange,\n disabled,\n labels,\n testId = 'thread-follow-button',\n}: ThreadFollowProps) {\n const l = { ...DEFAULT_THREAD_FOLLOW_LABELS, ...labels }\n const label = following ? l.unfollow : l.follow\n return (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 shrink-0\"\n aria-label={label}\n aria-pressed={following}\n title={label}\n disabled={disabled}\n onClick={() => onFollowingChange(!following)}\n data-testid={testId}\n >\n {following ? <BellRing className=\"size-4 text-primary\" /> : <Bell className=\"size-4\" />}\n </Button>\n )\n}\n","/**\n * A table of tags as data: the rows are tags (every issue, every person, a label's children) with\n * their values and links, the columns their kind's fields in the workspace (its issue fields …),\n * and each row's linked documents, facts and threads its evidence. Pure helpers for `TagTable`: a\n * row's value, the gaps, and the snapshot as a Markdown document.\n */\n\nimport type { components } from '@arbidocs/client'\n\n/**\n * A column: one of the kind's fields. A `'tag'` field links to tags (its `options` are the kinds it\n * may point at; its value is a list of tag ids), e.g. a person's Organisation.\n */\nexport type TagTableField = components['schemas']['FieldDefinition']\nexport type TagTableFieldType = TagTableField['type']\n/** A field as written back to the kind (`id` keeps it and its values). */\nexport type TagTableFieldWrite = components['schemas']['FieldDefinitionWrite']\n/** A row: a tag, with its links (`include=links` on the list). */\nexport type TagTableRow = components['schemas']['TagResponse']\nexport type TagTableLinks = components['schemas']['TagLinks']\n\n/** What a table shows: the kind's fields as columns, and its tags as rows. */\nexport interface TagTableData {\n columns: TagTableField[]\n rows: TagTableRow[]\n}\n\nconst NO_LINKS: TagTableLinks = {\n docs: [],\n facts: [],\n threads: [],\n doc_count: 0,\n fact_count: 0,\n thread_count: 0,\n}\n\n/** A row's links (none when the list was read without them). */\nexport const rowLinks = (row: TagTableRow): TagTableLinks => row.links ?? NO_LINKS\n\n/** A row's value for a column (values are keyed by field id). */\nexport const cellValue = (row: TagTableRow, column: TagTableField): unknown =>\n row.field_values?.[column.id]\n\n/** A row with nothing behind it: no linked document, fact or thread. */\nexport const isGap = (row: TagTableRow): boolean => {\n const l = rowLinks(row)\n return l.doc_count + l.fact_count + l.thread_count === 0\n}\n\n/**\n * The tags a link field (`type: 'tag'`) points at: a list of tag ids (a single id is read as one;\n * anything else is none).\n */\nexport function linkedTagIds(value: unknown): string[] {\n if (typeof value === 'string') return value ? [value] : []\n return Array.isArray(value) ? value.filter((id): id is string => typeof id === 'string') : []\n}\n\n/** A value as text (a person or a linked tag by name, a checkbox as yes or no, blank as empty). */\nexport function cellText(\n value: unknown,\n column: Pick<TagTableField, 'type'>,\n nameOf?: (id: string) => string | undefined\n): string {\n if (value === undefined || value === null || value === '') return ''\n if (column.type === 'checkbox') return value ? 'Yes' : 'No'\n if (column.type === 'person' && typeof value === 'string') return nameOf?.(value) ?? value\n if (column.type === 'tag')\n return linkedTagIds(value)\n .map((id) => nameOf?.(id) ?? id)\n .join(', ')\n if (Array.isArray(value)) return value.map(String).join(', ')\n return String(value)\n}\n\n/** A typed input's text back as the value to store (`null` clears it). */\nexport function parseCell(text: string, type: TagTableFieldType): unknown {\n const t = text.trim()\n if (t === '') return null\n if (type === 'number') {\n const n = Number(t)\n return Number.isNaN(n) ? null : n\n }\n return t\n}\n\n/** The kind's fields as definitions to write back, every one kept by id. */\nexport const fieldWrites = (columns: readonly TagTableField[]): TagTableFieldWrite[] =>\n columns.map((c) => ({ id: c.id, name: c.name, type: c.type, options: c.options ?? null }))\n\nconst escapeCell = (text: string) => text.replace(/\\|/g, '\\\\|').replace(/\\n+/g, ' ')\n\nexport interface TagTableMarkdownOptions {\n title: string\n /** The evidence column's heading. */\n evidence?: string\n /** The row column's heading. */\n rowHeading?: string\n nameOf?: (id: string) => string | undefined\n /** When the snapshot was taken (ISO); default now. */\n at?: string\n}\n\n/**\n * The table as a Markdown document: a heading, when it was taken, and one table (a row per tag, a\n * column per field, then the evidence counts). What a host files or has signed.\n */\nexport function tagTableMarkdown(table: TagTableData, options: TagTableMarkdownOptions): string {\n const { columns } = table\n const heads = [\n options.rowHeading ?? 'Item',\n ...columns.map((c) => c.name),\n options.evidence ?? 'Evidence',\n ]\n const lines = [\n `# ${options.title}`,\n '',\n `_Snapshot taken ${new Date(options.at ?? Date.now()).toISOString().slice(0, 16).replace('T', ' ')} UTC_`,\n '',\n `| ${heads.map(escapeCell).join(' | ')} |`,\n `| ${heads.map(() => '---').join(' | ')} |`,\n ]\n for (const row of table.rows) {\n const l = rowLinks(row)\n const evidence = [\n `${l.doc_count} document${l.doc_count === 1 ? '' : 's'}`,\n `${l.fact_count} fact${l.fact_count === 1 ? '' : 's'}`,\n ...(l.thread_count ? [`${l.thread_count} thread${l.thread_count === 1 ? '' : 's'}`] : []),\n ].join(', ')\n const cells = [\n row.name,\n ...columns.map((c) => cellText(cellValue(row, c), c, options.nameOf)),\n evidence,\n ]\n lines.push(`| ${cells.map(escapeCell).join(' | ')} |`)\n }\n return `${lines.join('\\n')}\\n`\n}\n","/**\n * The columns of a table of tags — the fields of their kind in the workspace (its issue fields …) —\n * edited as one list: rename, reorder by position, add, remove, and a choice field's options. A kept\n * column keeps its id, so its values stay (its type is fixed once created). Saved in full through\n * the host (`onSave`); data-free.\n */\n\nimport { useState } from 'react'\nimport { ArrowDown, ArrowUp, Loader2, Plus, X } from 'lucide-react'\nimport { Button, Input, cn } from '@arbidocs/react/ui'\nimport type { TagTableField, TagTableFieldType, TagTableFieldWrite } from './tagTableModel'\n\nexport interface TagColumnsEditorLabels {\n title: string\n addColumn: string\n name: string\n type: string\n options: string\n optionsPlaceholder: string\n remove: string\n moveUp: string\n moveDown: string\n save: string\n saving: string\n cancel: string\n empty: string\n types: Record<TagTableFieldType, string>\n}\n\nexport const DEFAULT_TAG_COLUMNS_EDITOR_LABELS: TagColumnsEditorLabels = {\n title: 'Columns',\n addColumn: 'Add column',\n name: 'Column name',\n type: 'Type',\n options: 'Choices',\n optionsPlaceholder: 'Choices, comma-separated',\n remove: 'Remove column',\n moveUp: 'Move up',\n moveDown: 'Move down',\n save: 'Save columns',\n saving: 'Saving…',\n cancel: 'Cancel',\n empty: 'No columns.',\n types: {\n text: 'Text',\n number: 'Number',\n date: 'Date',\n checkbox: 'Yes / no',\n select: 'Choice',\n person: 'Person',\n document: 'Document',\n relation: 'Relation',\n lookup: 'Lookup',\n rollup: 'Rollup',\n tag: 'Link to tags',\n },\n}\n\n/** The types a tag's field can have. */\nconst TYPES: TagTableFieldType[] = ['text', 'number', 'date', 'checkbox', 'select', 'person']\n\ninterface Draft {\n id?: string\n name: string\n type: TagTableFieldType\n options: string\n}\n\nconst toDraft = (f: TagTableField): Draft => ({\n id: f.id,\n name: f.name,\n type: f.type,\n options: (f.options ?? []).join(', '),\n})\n\nconst toWrite = (d: Draft): TagTableFieldWrite => ({\n ...(d.id ? { id: d.id } : {}),\n name: d.name.trim(),\n type: d.type,\n options:\n d.type === 'tag'\n ? d.options\n .split(',')\n .map((o) => o.trim())\n .filter(Boolean)\n : d.type === 'select'\n ? d.options\n .split(',')\n .map((o) => o.trim())\n .filter(Boolean)\n : null,\n})\n\nexport interface TagColumnsEditorProps {\n columns: TagTableField[]\n /** Save the columns in full; a rejection (e.g. two columns of one name) stays on screen. */\n onSave: (fields: TagTableFieldWrite[]) => void | Promise<unknown>\n onCancel: () => void\n labels?: Partial<TagColumnsEditorLabels>\n className?: string\n testId?: string\n}\n\nexport function TagColumnsEditor({\n columns,\n onSave,\n onCancel,\n labels,\n className,\n testId = 'tag-columns',\n}: TagColumnsEditorProps) {\n const l = { ...DEFAULT_TAG_COLUMNS_EDITOR_LABELS, ...labels }\n const [drafts, setDrafts] = useState<Draft[]>(() => columns.map(toDraft))\n const [saving, setSaving] = useState(false)\n const patch = (i: number, change: Partial<Draft>) =>\n setDrafts((ds) => ds.map((d, j) => (j === i ? { ...d, ...change } : d)))\n const move = (i: number, by: number) =>\n setDrafts((ds) => {\n const next = [...ds]\n const [d] = next.splice(i, 1)\n next.splice(i + by, 0, d)\n return next\n })\n const valid = drafts.every(\n (d) => d.name.trim() && (d.type !== 'select' || toWrite(d).options?.length)\n )\n const input =\n 'h-8 rounded-md border border-input bg-background px-2 text-sm focus:outline-none focus:ring-1 focus:ring-ring'\n\n return (\n <form\n className={cn('space-y-2 rounded-lg border border-border p-3', className)}\n onSubmit={async (e) => {\n e.preventDefault()\n if (!valid) return\n setSaving(true)\n try {\n await onSave(drafts.map(toWrite))\n } finally {\n setSaving(false)\n }\n }}\n data-testid={testId}\n >\n <h3 className=\"text-sm font-semibold\">{l.title}</h3>\n {drafts.length === 0 && <p className=\"text-sm text-muted-foreground\">{l.empty}</p>}\n <ul className=\"space-y-2\">\n {drafts.map((d, i) => (\n <li\n key={d.id ?? `new-${i}`}\n className=\"flex flex-wrap items-center gap-2\"\n data-testid={`${testId}-column-${i}`}\n >\n <Input\n className=\"h-8 w-48\"\n value={d.name}\n placeholder={l.name}\n aria-label={l.name}\n onChange={(e) => patch(i, { name: e.target.value })}\n data-testid={`${testId}-name-${i}`}\n />\n <select\n className={cn(input, 'w-32')}\n value={d.type}\n // A column's type is fixed once it exists: its values were written for it.\n disabled={!!d.id}\n aria-label={l.type}\n onChange={(e) => patch(i, { type: e.target.value as TagTableFieldType })}\n data-testid={`${testId}-type-${i}`}\n >\n {(TYPES.includes(d.type) ? TYPES : [d.type, ...TYPES]).map((t) => (\n <option key={t} value={t}>\n {l.types[t]}\n </option>\n ))}\n </select>\n {d.type === 'select' && (\n <Input\n className=\"h-8 min-w-48 flex-1\"\n value={d.options}\n placeholder={l.optionsPlaceholder}\n aria-label={l.options}\n onChange={(e) => patch(i, { options: e.target.value })}\n data-testid={`${testId}-options-${i}`}\n />\n )}\n <div className=\"ml-auto flex items-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={i === 0}\n aria-label={l.moveUp}\n onClick={() => move(i, -1)}\n >\n <ArrowUp className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={i === drafts.length - 1}\n aria-label={l.moveDown}\n onClick={() => move(i, 1)}\n >\n <ArrowDown className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={l.remove}\n onClick={() => setDrafts((ds) => ds.filter((_, j) => j !== i))}\n data-testid={`${testId}-remove-${i}`}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n </li>\n ))}\n </ul>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setDrafts((ds) => [...ds, { name: '', type: 'text', options: '' }])}\n data-testid={`${testId}-add`}\n >\n <Plus className=\"size-4\" /> {l.addColumn}\n </Button>\n <div className=\"ml-auto flex items-center gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n {l.cancel}\n </Button>\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!valid || saving}\n data-testid={`${testId}-save`}\n >\n {saving && <Loader2 className=\"size-4 animate-spin\" />}\n {saving ? l.saving : l.save}\n </Button>\n </div>\n </div>\n </form>\n )\n}\n","/**\n * A table of tags (every issue, every person, a label's children): one row per tag, a column per\n * field of their kind in the workspace, editable in place by type (text, number, date, checkbox,\n * choice, person, a link to other tags), and the items tagged with each row (its linked documents,\n * facts and threads, with counts). A row with nothing tagged yet is a normal row with an empty\n * cell. Rows and columns can be added (the columns are the kind's fields, edited as one list), and\n * the table exported as a Word document snapshot (filed in the workspace) or downloaded.\n * The data and every write come from the host (`ConnectedTagTable` binds them to ARBI).\n */\n\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport {\n ArrowUpRight,\n ChevronDown,\n Download,\n FileDown,\n FileText,\n Lightbulb,\n Loader2,\n MessagesSquare,\n Plus,\n SlidersHorizontal,\n} from 'lucide-react'\nimport { Button, Checkbox, Input, cn } from '@arbidocs/react/ui'\nimport {\n cellText,\n cellValue,\n isGap,\n linkedTagIds,\n parseCell,\n rowLinks,\n type TagTableData,\n type TagTableField,\n type TagTableFieldWrite,\n type TagTableRow,\n} from './tagTableModel'\nimport { TagColumnsEditor, type TagColumnsEditorLabels } from './TagColumnsEditor'\n\nexport interface TagTableLabels {\n row: string\n evidence: string\n /** `{count}` documents linked. */\n documents: string\n /** `{count}` facts linked. */\n facts: string\n /** `{count}` threads linked. */\n threads: string\n /** One document, one fact, one thread. */\n document: string\n fact: string\n thread: string\n /** A thread without a title. */\n untitledThread: string\n /** `{count}` more links than shown. */\n more: string\n addRow: string\n addRowPlaceholder: string\n add: string\n export: string\n exporting: string\n download: string\n empty: string\n loading: string\n noColumns: string\n choose: string\n yes: string\n /** Opens the column editor. */\n editColumns: string\n /** The column editor's own labels. */\n columns?: Partial<TagColumnsEditorLabels>\n}\n\nexport const DEFAULT_TAG_TABLE_LABELS: TagTableLabels = {\n row: 'Item',\n evidence: 'Tagged items',\n documents: '{count} documents',\n facts: '{count} facts',\n threads: '{count} threads',\n document: '1 document',\n fact: '1 fact',\n thread: '1 thread',\n untitledThread: 'Untitled thread',\n more: '+{count} more',\n addRow: 'Add row',\n addRowPlaceholder: 'Name of the new row',\n add: 'Add',\n export: 'Export as Word document',\n download: 'Download .docx',\n exporting: 'Exporting…',\n empty: 'No rows yet.',\n loading: 'Loading…',\n noColumns: 'No columns yet: add one to give each row a value.',\n choose: '—',\n yes: 'Yes',\n editColumns: 'Columns',\n}\n\nexport interface TagTableProps {\n /** The kind's fields (the columns) and its tags (the rows, with their links). */\n table: TagTableData | undefined\n isLoading?: boolean\n /** Change one cell (`null` clears it). Absent: read only. */\n onChangeValue?: (tagId: string, fieldId: string, value: unknown) => void | Promise<unknown>\n /** Add a row (a new tag of the kind). Absent: no \"Add row\". */\n onAddRow?: (name: string) => void | Promise<unknown>\n /**\n * Set the columns (the kind's fields) in full: a kept column has its `id`. Absent: the columns\n * are fixed.\n */\n onChangeColumns?: (fields: TagTableFieldWrite[]) => void | Promise<unknown>\n /** Open a linked document. */\n onOpenDocument?: (documentId: string) => void\n /** Open a linked fact. */\n onOpenFact?: (factId: string) => void\n /** Open a linked thread (conversation). */\n onOpenThread?: (conversationId: string) => void\n /** Open a row's tag (everything tagged with it). */\n onOpenRow?: (tagId: string) => void\n /** Export the table as it stands (filed as a document). Absent: no export button. */\n onExport?: () => void | Promise<unknown>\n /** Download the table as it stands as a file. Absent: no download button. */\n onDownload?: () => void | Promise<unknown>\n /** Who a person column offers. */\n people?: ReadonlyArray<{ value: string; label: string }>\n /**\n * The tags a link column (`type: 'tag'`) offers — each with its kind; a column offers those of\n * the kinds in its `options` — and names its values by.\n */\n tags?: ReadonlyArray<{ value: string; label: string; kind: string }>\n /** Open a linked tag (a link column's value). */\n onOpenTag?: (tagId: string) => void\n /** Extra controls in the toolbar. */\n actions?: ReactNode\n labels?: Partial<TagTableLabels>\n className?: string\n testId?: string\n}\n\n/**\n * The table fits its container: a fixed layout where the row-label (\"Item\") and tagged-items columns\n * have set widths and the field columns share the rest. Long names wrap in their column (cut after\n * three lines, in full in the tooltip) and tagged-item chips wrap, so nothing runs into the next\n * column or off the page. Only a matrix with very many fields scrolls, inside its own box.\n */\nconst ROW_LABEL_WIDTH = 'w-[11rem]'\nconst EVIDENCE_WIDTH = 'w-[14rem]'\nconst ROW_LABEL = 'line-clamp-3 whitespace-normal break-words'\n\n/**\n * One editable field value of a tag, by its type: committed on blur or Enter (a checkbox and a\n * choice at once). A table cell, and a field of a single tag's form (`TagDetail`).\n */\nexport function TagTableCell({\n row,\n column,\n people,\n tags,\n onOpenTag,\n onChange,\n l,\n testId,\n}: {\n row: TagTableRow\n column: TagTableField\n people?: TagTableProps['people']\n tags?: TagTableProps['tags']\n onOpenTag?: TagTableProps['onOpenTag']\n onChange?: TagTableProps['onChangeValue']\n l: TagTableLabels\n testId: string\n}) {\n const value = cellValue(row, column)\n const nameOf = (id: string) =>\n (column.type === 'tag' ? tags : people)?.find((p) => p.value === id)?.label\n const shown = cellText(value, column, nameOf)\n const [draft, setDraft] = useState(shown)\n useEffect(() => setDraft(cellText(value, column)), [value, column])\n const set = (next: unknown) => void onChange?.(row.external_id, column.id, next)\n\n if (column.type === 'tag')\n return (\n <TagLinkCell\n row={row}\n column={column}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChange ? set : undefined}\n l={l}\n testId={testId}\n />\n )\n if (!onChange)\n return (\n <span className=\"block truncate\" title={shown} data-testid={testId}>\n {shown || <span className=\"text-muted-foreground\">{l.choose}</span>}\n </span>\n )\n const field =\n 'h-8 w-full min-w-0 rounded-md border border-transparent bg-transparent px-1.5 text-sm hover:border-input focus:border-input focus:bg-background focus:outline-none'\n switch (column.type) {\n case 'checkbox':\n return (\n <Checkbox\n checked={value === true}\n onCheckedChange={(v) => set(v === true)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n />\n )\n case 'select':\n case 'person': {\n const options =\n column.type === 'select'\n ? (column.options ?? []).map((o) => ({ value: o, label: o }))\n : (people ?? [])\n return (\n <select\n className={cn(field, 'pr-6')}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => set(e.target.value || null)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n >\n <option value=\"\">{l.choose}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n {typeof value === 'string' && value && !options.some((o) => o.value === value) && (\n <option value={value}>{value}</option>\n )}\n </select>\n )\n }\n default: {\n const commit = () => {\n if (draft !== cellText(value, column)) set(parseCell(draft, column.type))\n }\n return (\n <input\n className={cn(field, 'pr-6')}\n type={column.type === 'number' ? 'number' : column.type === 'date' ? 'date' : 'text'}\n value={column.type === 'date' ? draft.slice(0, 10) : draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur()\n if (e.key === 'Escape') setDraft(cellText(value, column))\n }}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n />\n )\n }\n }\n}\n\n/**\n * A link field's value: the linked tags as chips that open them, and (editable) a choice among the\n * tags of the kinds the field allows. One link at a time; the value is stored as a list.\n */\nfunction TagLinkCell({\n row,\n column,\n tags,\n onOpenTag,\n onChange,\n l,\n testId,\n}: {\n row: TagTableRow\n column: TagTableField\n tags?: TagTableProps['tags']\n onOpenTag?: TagTableProps['onOpenTag']\n onChange?: (next: unknown) => void\n l: TagTableLabels\n testId: string\n}) {\n const ids = linkedTagIds(cellValue(row, column))\n const kinds = column.options ?? []\n const options = (tags ?? []).filter(\n (t) => t.value !== row.external_id && (kinds.length === 0 || kinds.includes(t.kind))\n )\n const label = (id: string) => tags?.find((t) => t.value === id)?.label ?? id\n const chips = ids.map((id) =>\n onOpenTag ? (\n <button\n key={id}\n type=\"button\"\n onClick={() => onOpenTag(id)}\n className=\"inline-flex min-w-0 max-w-full items-center truncate rounded-md border border-border px-1.5 py-0.5 text-xs hover:border-primary/40 hover:text-primary\"\n data-testid={`${testId}-link-${id}`}\n >\n {label(id)}\n </button>\n ) : (\n <span\n key={id}\n className=\"inline-flex min-w-0 max-w-full truncate rounded-md border border-border px-1.5 py-0.5 text-xs\"\n data-testid={`${testId}-link-${id}`}\n >\n {label(id)}\n </span>\n )\n )\n if (!onChange)\n return (\n <span className=\"flex min-w-0 flex-wrap gap-1\" data-testid={testId}>\n {chips.length ? chips : <span className=\"text-muted-foreground\">{l.choose}</span>}\n </span>\n )\n const current = ids[0]\n // The linked name is text that wraps (a narrow column never cuts it to \"Acm…\"), and opens the\n // tag; the picker behind the chevron changes it.\n return (\n // Wraps: in a narrow column the name breaks between words and the picker moves below it.\n <span className=\"flex min-w-0 flex-wrap items-center gap-x-1 py-1\">\n {current &&\n (onOpenTag ? (\n <button\n type=\"button\"\n onClick={() => onOpenTag(current)}\n className=\"max-w-full rounded px-1 text-left text-sm break-words hover:text-primary hover:underline focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={`Open ${label(current)}`}\n title={`Open ${label(current)}`}\n data-testid={`${testId}-open`}\n >\n {label(current)}\n <ArrowUpRight className=\"ml-0.5 inline size-3.5 align-[-2px] text-muted-foreground\" />\n </button>\n ) : (\n <span className=\"max-w-full px-1 text-sm break-words\">{label(current)}</span>\n ))}\n <span\n className={cn(\n 'relative inline-flex h-6 shrink-0 items-center rounded text-muted-foreground hover:bg-muted hover:text-foreground focus-within:ring-2 focus-within:ring-ring',\n current ? 'w-6 justify-center' : 'min-w-0 flex-1 gap-1 px-1 text-sm'\n )}\n title={current ? `${column.name}: ${label(current)}` : undefined}\n >\n {!current && <span className=\"truncate\">{l.choose}</span>}\n <ChevronDown className=\"size-3.5 shrink-0\" />\n <select\n className=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n value={current ?? ''}\n onChange={(e) => onChange(e.target.value ? [e.target.value] : null)}\n aria-label={`${row.name}: ${column.name}`}\n data-testid={testId}\n >\n <option value=\"\">{l.choose}</option>\n {options.map((t) => (\n <option key={t.value} value={t.value}>\n {t.label}\n </option>\n ))}\n {current && !options.some((t) => t.value === current) && (\n <option value={current}>{label(current)}</option>\n )}\n </select>\n </span>\n </span>\n )\n}\n\n/** A count as a phrase: \"1 document\", \"3 facts\", or nothing for none. */\nconst countText = (count: number, one: string, many: string) =>\n count === 1 ? one : count ? many.replace('{count}', String(count)) : null\n\n/** What backs a row: its documents, facts and threads as links, with counts and \"+N more\". */\nfunction Evidence({\n row,\n l,\n onOpenDocument,\n onOpenFact,\n onOpenThread,\n onOpenRow,\n testId,\n}: {\n row: TagTableRow\n l: TagTableLabels\n onOpenDocument?: (id: string) => void\n onOpenFact?: (id: string) => void\n onOpenThread?: (id: string) => void\n onOpenRow?: (id: string) => void\n testId: string\n}) {\n // Nothing tagged yet is normal: an empty cell, no warning.\n if (isGap(row)) return null\n const links = rowLinks(row)\n const docs = links.docs ?? []\n const facts = links.facts ?? []\n const threads = links.threads ?? []\n const more =\n links.doc_count -\n docs.length +\n (links.fact_count - facts.length) +\n (links.thread_count - threads.length)\n const chip =\n 'inline-flex min-w-0 max-w-full items-center gap-1 truncate rounded-md border border-border px-1.5 py-0.5 text-xs hover:border-primary/40 hover:text-primary disabled:hover:border-border disabled:hover:text-inherit'\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-1\" data-testid={testId}>\n <span className=\"mr-1 w-full text-xs text-muted-foreground\">\n {[\n countText(links.doc_count, l.document, l.documents),\n countText(links.fact_count, l.fact, l.facts),\n countText(links.thread_count, l.thread, l.threads),\n ]\n .filter(Boolean)\n .join(' · ')}\n </span>\n {docs.map((d) => (\n <button\n key={d.doc_ext_id}\n type=\"button\"\n className={chip}\n title={d.note ? `${d.file_name}: ${d.note}` : d.file_name}\n disabled={!onOpenDocument}\n onClick={() => onOpenDocument?.(d.doc_ext_id)}\n data-testid={`${testId}-doc-${d.doc_ext_id}`}\n >\n <FileText className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{d.file_name}</span>\n </button>\n ))}\n {facts.map((f) => (\n <button\n key={f.fact_ext_id}\n type=\"button\"\n className={chip}\n title={f.text}\n disabled={!onOpenFact}\n onClick={() => onOpenFact?.(f.fact_ext_id)}\n data-testid={`${testId}-fact-${f.fact_ext_id}`}\n >\n <Lightbulb className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{f.text}</span>\n </button>\n ))}\n {threads.map((t) => (\n <button\n key={t.conversation_ext_id}\n type=\"button\"\n className={chip}\n title={t.title || l.untitledThread}\n disabled={!onOpenThread}\n onClick={() => onOpenThread?.(t.conversation_ext_id)}\n data-testid={`${testId}-thread-${t.conversation_ext_id}`}\n >\n <MessagesSquare className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t.title || l.untitledThread}</span>\n </button>\n ))}\n {more > 0 &&\n (onOpenRow ? (\n <button\n type=\"button\"\n className=\"text-xs text-primary hover:underline\"\n onClick={() => onOpenRow(row.external_id)}\n data-testid={`${testId}-more`}\n >\n {l.more.replace('{count}', String(more))}\n </button>\n ) : (\n <span className=\"text-xs text-muted-foreground\" data-testid={`${testId}-more`}>\n {l.more.replace('{count}', String(more))}\n </span>\n ))}\n </div>\n )\n}\n\nexport function TagTable({\n table,\n isLoading,\n onChangeValue,\n onAddRow,\n onChangeColumns,\n onOpenDocument,\n onOpenFact,\n onOpenThread,\n onOpenRow,\n onExport,\n onDownload,\n people,\n tags,\n onOpenTag,\n actions,\n labels,\n className,\n testId = 'tag-table',\n}: TagTableProps) {\n const l = { ...DEFAULT_TAG_TABLE_LABELS, ...labels }\n const columns = useMemo(() => table?.columns ?? [], [table])\n const rows = table?.rows ?? []\n const [editingColumns, setEditingColumns] = useState(false)\n const [name, setName] = useState('')\n const [adding, setAdding] = useState(false)\n const [exporting, setExporting] = useState(false)\n\n const add = async () => {\n const n = name.trim()\n if (!n || !onAddRow) return\n setAdding(true)\n try {\n await onAddRow(n)\n setName('')\n } finally {\n setAdding(false)\n }\n }\n\n return (\n <div className={cn('space-y-3', className)} data-testid={testId}>\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {actions}\n {onChangeColumns && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-pressed={editingColumns}\n onClick={() => setEditingColumns((v) => !v)}\n data-testid={`${testId}-edit-columns`}\n >\n <SlidersHorizontal className=\"size-4\" />\n {l.editColumns}\n </Button>\n )}\n {onDownload && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={rows.length === 0}\n onClick={() => void onDownload()}\n data-testid={`${testId}-download`}\n >\n <Download className=\"size-4\" />\n {l.download}\n </Button>\n )}\n {onExport && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={exporting || rows.length === 0}\n onClick={async () => {\n setExporting(true)\n try {\n await onExport()\n } finally {\n setExporting(false)\n }\n }}\n data-testid={`${testId}-export`}\n >\n {exporting ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <FileDown className=\"size-4\" />\n )}\n {exporting ? l.exporting : l.export}\n </Button>\n )}\n </div>\n </div>\n\n {editingColumns && onChangeColumns && (\n <TagColumnsEditor\n columns={columns}\n labels={l.columns}\n onCancel={() => setEditingColumns(false)}\n onSave={async (fields) => {\n await onChangeColumns(fields)\n setEditingColumns(false)\n }}\n testId={`${testId}-columns`}\n />\n )}\n\n {onAddRow && (\n <form\n className=\"flex max-w-md items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n void add()\n }}\n >\n <Input\n value={name}\n placeholder={l.addRowPlaceholder}\n aria-label={l.addRow}\n onChange={(e) => setName(e.target.value)}\n data-testid={`${testId}-add-name`}\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n variant=\"outline\"\n disabled={!name.trim() || adding}\n data-testid={`${testId}-add`}\n >\n <Plus className=\"size-4\" /> {l.addRow}\n </Button>\n </form>\n )}\n\n {isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {l.loading}\n </p>\n ) : (\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table\n className=\"w-full min-w-[36rem] table-fixed border-collapse text-sm\"\n data-testid={`${testId}-table`}\n >\n <thead className=\"bg-muted/40\">\n <tr>\n <th\n className={cn(\n ROW_LABEL_WIDTH,\n 'sticky left-0 z-10 bg-muted/40 px-3 py-2 text-left font-medium'\n )}\n >\n {l.row}\n </th>\n {columns.map((c) => (\n <th\n key={c.id}\n className=\"truncate px-3 py-2 text-left font-medium\"\n title={c.name}\n data-testid={`${testId}-column-${c.id}`}\n >\n {c.name}\n </th>\n ))}\n <th className={cn(EVIDENCE_WIDTH, 'px-3 py-2 text-left font-medium')}>\n {l.evidence}\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => {\n const id = row.external_id\n return (\n <tr\n key={id}\n className=\"border-t border-border align-top\"\n data-testid={`${testId}-row-${id}`}\n >\n <th\n scope=\"row\"\n className={cn(\n ROW_LABEL_WIDTH,\n 'sticky left-0 z-10 bg-background px-3 py-2 text-left font-medium'\n )}\n >\n {onOpenRow ? (\n <button\n type=\"button\"\n className={cn(ROW_LABEL, 'text-left hover:text-primary hover:underline')}\n title={row.name}\n onClick={() => onOpenRow(id)}\n data-testid={`${testId}-row-${id}-label`}\n >\n {row.name}\n </button>\n ) : (\n <span\n className={ROW_LABEL}\n title={row.name}\n data-testid={`${testId}-row-${id}-label`}\n >\n {row.name}\n </span>\n )}\n </th>\n {columns.map((c) => (\n <td key={c.id} className=\"px-1.5 py-1\">\n <TagTableCell\n row={row}\n column={c}\n people={people}\n tags={tags}\n onOpenTag={onOpenTag}\n onChange={onChangeValue}\n l={l}\n testId={`${testId}-cell-${id}-${c.id}`}\n />\n </td>\n ))}\n <td className=\"min-w-0 px-3 py-2\">\n <Evidence\n row={row}\n l={l}\n onOpenDocument={onOpenDocument}\n onOpenFact={onOpenFact}\n onOpenThread={onOpenThread}\n onOpenRow={onOpenRow}\n testId={`${testId}-evidence-${id}`}\n />\n </td>\n </tr>\n )\n })}\n {rows.length === 0 && (\n <tr>\n <td\n colSpan={columns.length + 2}\n className=\"px-3 py-6 text-center text-sm text-muted-foreground\"\n >\n {l.empty}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n {columns.length === 0 && rows.length > 0 && (\n <p className=\"border-t border-border px-3 py-2 text-xs text-muted-foreground\">\n {l.noColumns}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * A table of tags as a Word document: a title, when the snapshot was taken, then one table with a\n * row per tag, a column per field of its kind, the evidence behind it (linked document names and fact\n * excerpts) and its gaps. Written straight as WordprocessingML and zipped with `fflate` (already a\n * dependency, and what `docx/export.ts` uses), so the result opens in the native Word editor and\n * in Word without pulling the editor engine into the tags module.\n */\n\nimport {\n cellText,\n cellValue,\n isGap,\n rowLinks,\n type TagTableData,\n type TagTableField,\n type TagTableRow,\n} from './tagTableModel'\nimport {\n cell,\n docxPackage,\n documentXml,\n minuteUtc,\n page,\n paragraph,\n TABLE_DOCUMENT_STYLES,\n} from './ooxml'\n\nexport { DOCX_MIME_TYPE } from './ooxml'\n\n/** More table columns than this (item, fields, evidence, gaps) turn the page to landscape. */\nexport const TAG_TABLE_DOCX_LANDSCAPE_AFTER = 6\n\nexport interface TagTableDocxLabels {\n /** The row column's heading. */\n row: string\n evidence: string\n gaps: string\n /** `{at}` is the snapshot time, `YYYY-MM-DD HH:MM UTC`. */\n takenAt: string\n /** A row with no linked document, fact or thread. */\n noEvidence: string\n /** `{fields}`: the row's empty fields. */\n missing: string\n /** `{count}` more links than listed. */\n more: string\n document: string\n documents: string\n fact: string\n facts: string\n thread: string\n threads: string\n untitledThread: string\n empty: string\n}\n\nexport const DEFAULT_TAG_TABLE_DOCX_LABELS: TagTableDocxLabels = {\n row: 'Item',\n evidence: 'Evidence',\n gaps: 'Gaps',\n takenAt: 'Snapshot taken {at}',\n noEvidence: 'No evidence',\n missing: 'Missing: {fields}',\n more: '+{count} more',\n document: '1 document',\n documents: '{count} documents',\n fact: '1 fact',\n facts: '{count} facts',\n thread: '1 thread',\n threads: '{count} threads',\n untitledThread: 'Untitled thread',\n empty: 'No rows.',\n}\n\nexport interface TagTableDocxOptions {\n title: string\n nameOf?: (id: string) => string | undefined\n /** When the snapshot was taken (ISO); default now. */\n at?: string\n labels?: Partial<TagTableDocxLabels>\n}\n\nconst count = (n: number, one: string, many: string) =>\n n === 1 ? one : many.replace('{count}', String(n))\n\nfunction evidenceParagraphs(row: TagTableRow, l: TagTableDocxLabels): string[] {\n if (isGap(row)) return []\n const links = rowLinks(row)\n const docs = links.docs ?? []\n const facts = links.facts ?? []\n const threads = links.threads ?? []\n const more =\n links.doc_count -\n docs.length +\n (links.fact_count - facts.length) +\n (links.thread_count - threads.length)\n return [\n paragraph(\n [\n {\n text: [\n links.doc_count ? count(links.doc_count, l.document, l.documents) : null,\n links.fact_count ? count(links.fact_count, l.fact, l.facts) : null,\n links.thread_count ? count(links.thread_count, l.thread, l.threads) : null,\n ]\n .filter(Boolean)\n .join(' · '),\n muted: true,\n },\n ],\n 'TagTableCell'\n ),\n ...docs.map((d) =>\n paragraph(\n [{ text: d.file_name, bold: true }, ...(d.note ? [{ text: ` — ${d.note}` }] : [])],\n 'TagTableCell'\n )\n ),\n ...facts.map((f) => paragraph([{ text: `“${f.text}”`, italic: true }], 'TagTableCell')),\n ...threads.map((t) => paragraph([{ text: t.title || l.untitledThread }], 'TagTableCell')),\n ...(more > 0\n ? [\n paragraph(\n [{ text: l.more.replace('{count}', String(more)), muted: true }],\n 'TagTableCell'\n ),\n ]\n : []),\n ]\n}\n\nfunction gapParagraphs(\n row: TagTableRow,\n columns: TagTableField[],\n l: TagTableDocxLabels\n): string[] {\n const missing = columns\n .filter((c) => c.type !== 'checkbox' && cellText(cellValue(row, c), c) === '')\n .map((c) => c.name)\n return [\n ...(isGap(row) ? [paragraph([{ text: l.noEvidence, bold: true }], 'TagTableCell')] : []),\n ...(missing.length\n ? [paragraph([{ text: l.missing.replace('{fields}', missing.join(', ')) }], 'TagTableCell')]\n : []),\n ]\n}\n\n/** `word/document.xml` for the table (exposed for tests and for hosts that assemble their own package). */\nexport function tagTableDocumentXml(table: TagTableData, options: TagTableDocxOptions): string {\n const l = { ...DEFAULT_TAG_TABLE_DOCX_LABELS, ...options.labels }\n const { columns, rows } = table\n const heads = [l.row, ...columns.map((c) => c.name), l.evidence, l.gaps]\n const landscape = heads.length > TAG_TABLE_DOCX_LANDSCAPE_AFTER\n const { textWidth, sectPr } = page(landscape)\n // Relative widths: the item and evidence get room to read, each field and the gaps a share.\n const weights = [2, ...columns.map(() => 1), 3, 1.5]\n const total = weights.reduce((a, b) => a + b, 0)\n const widths = weights.map((w) => Math.floor((textWidth * w) / total))\n const at = minuteUtc(options.at ?? new Date().toISOString())\n\n const header = `<w:tr><w:trPr><w:tblHeader/><w:cantSplit/></w:trPr>${heads\n .map((h, i) =>\n cell([paragraph([{ text: h, bold: true }], 'TagTableCell')], widths[i], 'E7E6E6')\n )\n .join('')}</w:tr>`\n const body = rows.map((row) => {\n const fill = isGap(row) ? 'FFF2CC' : undefined\n const cells = [\n cell([paragraph([{ text: row.name, bold: true }], 'TagTableCell')], widths[0], fill),\n ...columns.map((c, i) => {\n const text = cellText(cellValue(row, c), c, options.nameOf)\n return cell(text ? [paragraph([{ text }], 'TagTableCell')] : [], widths[i + 1], fill)\n }),\n cell(evidenceParagraphs(row, l), widths[columns.length + 1], fill),\n cell(gapParagraphs(row, columns, l), widths[columns.length + 2], fill),\n ]\n return `<w:tr><w:trPr><w:cantSplit/></w:trPr>${cells.join('')}</w:tr>`\n })\n\n const grid = `<w:tbl><w:tblPr><w:tblStyle w:val=\"TagTableGrid\"/><w:tblW w:w=\"${textWidth}\" w:type=\"dxa\"/><w:tblLayout w:type=\"fixed\"/><w:tblLook w:val=\"04A0\" w:firstRow=\"1\" w:lastRow=\"0\" w:firstColumn=\"1\" w:lastColumn=\"0\" w:noHBand=\"0\" w:noVBand=\"1\"/></w:tblPr><w:tblGrid>${widths\n .map((w) => `<w:gridCol w:w=\"${w}\"/>`)\n .join('')}</w:tblGrid>${header}${body.join('')}</w:tbl>`\n\n return documentXml(\n `${paragraph(\n [{ text: options.title }],\n 'Title'\n )}${paragraph([{ text: l.takenAt.replace('{at}', `${at} UTC`), muted: true }])}${grid}${\n rows.length ? '' : paragraph([{ text: l.empty, muted: true }])\n }<w:p/>${sectPr}`\n )\n}\n\n/** The table as `.docx` bytes. */\nexport function tagTableDocx(table: TagTableData, options: TagTableDocxOptions): Uint8Array {\n const at = new Date(options.at ?? Date.now()).toISOString()\n return docxPackage({\n document: tagTableDocumentXml(table, { ...options, at }),\n styles: TABLE_DOCUMENT_STYLES,\n title: options.title,\n at,\n })\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/collaboration/members/WorkspaceMembers.tsx","../src/collaboration/contacts/parseEmails.ts","../src/collaboration/contacts/AddContactsParts.tsx","../src/collaboration/contacts/vcard.ts","../src/collaboration/contacts/ContactCard.tsx","../src/collaboration/direct-messages/DirectMessages.tsx","../src/collaboration/direct-messages/DmParts.tsx"],"names":["jsx","cn","jsxs","Tooltip","TooltipTrigger","Select","SelectTrigger","RoleBadge","SelectContent","SelectItem","TooltipContent","Clock","Fragment","SelectValue","Button","UserMinus","Trash2","useMemo","Gift","Textarea","AtSign","CheckCircle","XCircle","AlertCircle","ModalSection","ModalSectionTitle","Avatar","AvatarImage","AvatarFallback","Contact","Mail","Phone","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuItem","Download","UserPlus","MoreVertical","DropdownMenuSeparator","Plus","KeyRound","ScrollArea","Loader2","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","BellOff","Bell","X","Popover","PopoverTrigger","ChevronsUpDown","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem"],"mappings":"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","file":"chunk-MFY2ZNP6.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { Clock, Trash2, UserMinus } from 'lucide-react'\nimport {\n Button,\n cn,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\nimport { RoleBadge } from '../../workspaces/WorkspaceBadges'\n\n/** One assignable role. `badgeClass` is the host's palette for the role. */\nexport interface MemberRoleOption {\n value: string\n label: string\n badgeClass: string\n}\n\n/** Tooltip + grid-cell text of the members table, kept in one place. */\nexport function MemberMutedText({\n children,\n title,\n className,\n}: {\n children: ReactNode\n title?: string\n className?: string\n}) {\n return (\n <span className={cn('text-sm text-muted-foreground', className)} title={title}>\n {children}\n </span>\n )\n}\n\n/** Layout of the Name cell: identity chip followed by optional contact toggle. */\nexport function MemberNameCell({ children }: { children: ReactNode }) {\n return <div className=\"flex h-full items-center gap-2\">{children}</div>\n}\n\nexport interface MemberRoleCellProps {\n role: string\n roles: MemberRoleOption[]\n /** Tooltip: why the role is locked, or what the role means. */\n tooltip: string\n canChange: boolean\n isPending: boolean\n onChange: (role: string) => void\n /** Session-scoped (temporary) grant: adds a clock with its explanation. */\n temporaryHint?: string\n}\n\n/** Inline role dropdown of a member row (always rendered so chevrons align). */\nexport function MemberRoleCell({\n role,\n roles,\n tooltip,\n canChange,\n isPending,\n onChange,\n temporaryHint,\n}: MemberRoleCellProps) {\n const current = roles.find((r) => r.value === role)\n return (\n <div className=\"flex h-full items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <Select value={role} onValueChange={onChange} disabled={!canChange || isPending}>\n <SelectTrigger\n className={cn(\n 'h-6 w-[130px] border-0 bg-transparent text-sm focus:ring-0 focus:ring-offset-0 disabled:opacity-100',\n canChange ? 'hover:bg-muted/50' : 'cursor-not-allowed [&>svg]:opacity-30'\n )}\n >\n <RoleBadge label={current?.label ?? role} badgeClass={current?.badgeClass ?? ''} />\n </SelectTrigger>\n <SelectContent>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n <RoleBadge label={r.label} badgeClass={r.badgeClass} />\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-[300px]\">\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n {temporaryHint && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Clock\n className=\"size-3.5 shrink-0 cursor-default text-muted-foreground\"\n aria-label={temporaryHint}\n />\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"max-w-[300px]\">\n <p>{temporaryHint}</p>\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n )\n}\n\n/** Loading strip of the members list. */\nexport function MemberListLoading({ label = 'Loading users...' }: { label?: string }) {\n return (\n <div\n className=\"rounded-md bg-blue-bg p-3 text-center text-sm\"\n data-testid=\"workspace-users-loading\"\n >\n <div className=\"mr-2 inline-block size-4 animate-spin rounded-full border-2 border-primary/30 border-t-primary\" />\n {label}\n </div>\n )\n}\n\nexport interface MemberBulkActionsProps {\n /** Roles a bulk change may assign. */\n roles: { value: string; label: string }[]\n onChangeRole: (role: string) => void\n isRoleDisabled: boolean\n roleTooltip: string\n /** Only the workspace owner can use either control (also styles them muted). */\n isOwner: boolean\n onRemove: () => void\n isRemoveDisabled: boolean\n removeTooltip: string\n changeRolePlaceholder?: string\n}\n\n/** Role change dropdown + remove button inside the selection bar of the members table. */\nexport function MemberBulkActions({\n roles,\n onChangeRole,\n isRoleDisabled,\n roleTooltip,\n isOwner,\n onRemove,\n isRemoveDisabled,\n removeTooltip,\n changeRolePlaceholder = 'Change role',\n}: MemberBulkActionsProps) {\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild onFocusCapture={(e) => e.stopPropagation()}>\n <span tabIndex={!isOwner ? 0 : undefined}>\n <Select value=\"\" onValueChange={onChangeRole} disabled={isRoleDisabled}>\n <SelectTrigger\n className={cn(\n 'h-7 w-[120px] text-sm pointer-coarse:h-11',\n isRoleDisabled ? 'border-border text-muted-foreground' : 'border-input'\n )}\n >\n <SelectValue placeholder={changeRolePlaceholder} />\n </SelectTrigger>\n <SelectContent>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p>{roleTooltip}</p>\n </TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={!isOwner ? 0 : undefined}>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onRemove}\n disabled={isRemoveDisabled}\n aria-label={removeTooltip}\n className={cn(\n 'size-7 pointer-coarse:size-11',\n isOwner\n ? 'border-destructive/30 text-destructive hover:bg-destructive hover:text-destructive-foreground'\n : 'border-border text-muted-foreground'\n )}\n >\n <UserMinus className=\"size-4\" />\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p>{removeTooltip}</p>\n </TooltipContent>\n </Tooltip>\n </>\n )\n}\n\nexport interface WorkspaceDeleteButtonProps {\n canDelete: boolean\n /** Why deletion is not allowed (tooltip on the disabled button). */\n disabledReason?: string\n isDeleting?: boolean\n onDelete: () => void\n labels?: { delete: string; deleting: string }\n}\n\n/** Destructive \"Delete\" of a workspace; disabled with an explanation when not allowed. */\nexport function WorkspaceDeleteButton({\n canDelete,\n disabledReason = '',\n isDeleting = false,\n onDelete,\n labels = { delete: 'Delete', deleting: 'Deleting...' },\n}: WorkspaceDeleteButtonProps) {\n const button = (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={canDelete ? onDelete : undefined}\n disabled={!canDelete || isDeleting}\n className=\"h-7 px-2 text-sm text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:h-11\"\n data-testid=\"workspace-delete-button\"\n >\n <Trash2 className=\"mr-1 size-3.5\" />\n <span>{isDeleting ? labels.deleting : labels.delete}</span>\n </Button>\n )\n\n if (canDelete || !disabledReason) return button\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={0}>{button}</span>\n </TooltipTrigger>\n <TooltipContent>\n <p>{disabledReason}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n\nexport interface RoleSelectProps {\n value: string\n roles: MemberRoleOption[]\n onChange: (role: string) => void\n /** Tooltip: what the selected role allows. */\n description: string\n}\n\n/** Role picker shown beside a user selector (e.g. when sharing a workspace). */\nexport function RoleSelect({ value, roles, onChange, description }: RoleSelectProps) {\n const current = roles.find((r) => r.value === value)\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger className=\"h-8 w-[140px] pointer-coarse:h-11\">\n <SelectValue>\n <RoleBadge label={current?.label ?? value} badgeClass={current?.badgeClass ?? ''} />\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n <RoleBadge label={r.label} badgeClass={r.badgeClass} />\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"max-w-[300px]\">\n <p>{description}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n","import type { components } from '@arbidocs/client'\nimport type { AddContactsResultRow } from './AddContactsParts'\n\n/** The most addresses one add-contacts request may carry (the API's own limit). */\nexport const MAX_INVITE_EMAILS = 100\n\nconst EMAIL = /^[^\\s@,;]+@[^\\s@,;]+\\.[^\\s@,;]+$/\n\n/**\n * Distinct, lower-cased, well-formed addresses typed or pasted into the invite box. Commas,\n * semicolons, spaces and new lines all separate; anything that is not an address is dropped.\n */\nexport function parseEmails(text: string): string[] {\n const parts = text.split(/[\\s,;]+/).map((e) => e.trim().toLowerCase())\n return [...new Set(parts.filter((e) => EMAIL.test(e)))]\n}\n\ntype ContactRow = Pick<\n components['schemas']['ContactResponse'],\n 'email' | 'status' | 'outcome' | 'outcome_detail'\n>\n\n/** One plain sentence per outcome the backend reports. */\nexport interface ContactOutcomeLabels {\n contact_added: string\n already_contact: string\n invited: string\n reinvited: string\n not_resent_still_pending: string\n /** Fallback when the backend gives no detail for a failure. */\n failed: string\n}\n\nexport const DEFAULT_CONTACT_OUTCOME_LABELS: ContactOutcomeLabels = {\n contact_added: 'Added to your colleagues',\n already_contact: 'Already one of your colleagues',\n invited: 'Invitation sent',\n reinvited: 'Invitation sent again',\n not_resent_still_pending: 'Invitation already pending',\n failed: 'Could not add this address',\n}\n\n/** A backend add-contact row as an {@link AddContactsResultRow} for `AddContactsResults`. */\nexport function toAddContactsRow(\n row: ContactRow,\n labels: Partial<ContactOutcomeLabels> = {}\n): AddContactsResultRow {\n const l = { ...DEFAULT_CONTACT_OUTCOME_LABELS, ...labels }\n switch (row.outcome) {\n case 'contact_added':\n case 'already_contact':\n case 'invited':\n case 'reinvited':\n return { email: row.email ?? '', status: 'success', message: l[row.outcome] }\n case 'not_resent_still_pending':\n return { email: row.email ?? '', status: 'pending', message: l.not_resent_still_pending }\n default:\n return {\n email: row.email ?? '',\n status: row.status === 'failed' || row.outcome === 'failed' ? 'failed' : 'pending',\n message: row.outcome_detail ?? l.failed,\n }\n }\n}\n\n/** Map every row of an add-contacts response. */\nexport const toAddContactsRows = (\n rows: ContactRow[],\n labels?: Partial<ContactOutcomeLabels>\n): AddContactsResultRow[] => rows.map((r) => toAddContactsRow(r, labels))\n","import { useMemo, type ReactNode } from 'react'\nimport { AlertCircle, AtSign, CheckCircle, Gift, XCircle } from 'lucide-react'\nimport { Button, Textarea } from '@arbidocs/react/ui'\nimport { ModalSection, ModalSectionTitle } from '../../settings/ModalScaffold'\nimport { MAX_INVITE_EMAILS, parseEmails } from './parseEmails'\n\n/** Every fixed string of the add-contacts flow. */\nexport interface AddContactsLabels {\n placeholder: string\n hint: string\n add: (count: number) => string\n addOverMax: (count: number, max: number) => string\n adding: string\n cancel: string\n results: string\n email: string\n status: string\n done: string\n addMore: string\n /** The invite-reward banner text for a formatted amount. */\n reward: (amount: string) => ReactNode\n}\n\nexport const DEFAULT_ADD_CONTACTS_LABELS: AddContactsLabels = {\n placeholder: 'name@example.com',\n hint: 'Paste one or multiple emails — separated by commas, spaces, or new lines.',\n add: (count) => `Add${count > 0 ? ` (${count})` : ''}`,\n addOverMax: (count, max) => `Add (${count}) - Max ${max}`,\n adding: 'Adding...',\n cancel: 'Cancel',\n results: 'Results',\n email: 'Email',\n status: 'Status',\n done: 'Done',\n addMore: 'Add More',\n reward: (amount) => (\n <>\n Get <span className=\"font-semibold text-foreground\">{amount} off your next invoice</span> for\n every invited contact who goes Pro. They get {amount} off theirs.\n </>\n ),\n}\n\nexport interface AddContactsFormProps {\n value: string\n onChange: (value: string) => void\n /**\n * How many addresses `value` holds. Omit it: the form parses `value` itself with\n * {@link parseEmails} (commas, semicolons, spaces and new lines; distinct, valid, lower-cased).\n */\n emailCount?: number\n /** The most addresses one submit may carry. Default {@link MAX_INVITE_EMAILS} (the API's own limit). */\n maxEmails?: number\n isPending: boolean\n /** Receives the parsed addresses, ready to send. */\n onSubmit: (emails: string[]) => void\n onCancel?: () => void\n /** Formatted referral reward (\"$10\"); omit to hide the banner. */\n rewardAmount?: string\n labels?: Partial<AddContactsLabels>\n}\n\n/** Email invite form: a textarea for one or many addresses, and Add / Cancel. */\nexport function AddContactsForm({\n value,\n onChange,\n emailCount: emailCountProp,\n maxEmails = MAX_INVITE_EMAILS,\n isPending,\n onSubmit,\n onCancel,\n rewardAmount,\n labels,\n}: AddContactsFormProps) {\n const l = useMemo(() => ({ ...DEFAULT_ADD_CONTACTS_LABELS, ...labels }), [labels])\n const emails = useMemo(() => parseEmails(value), [value])\n const emailCount = emailCountProp ?? emails.length\n const overMax = emailCount > maxEmails\n return (\n <div className=\"space-y-4\" data-slot=\"add-contacts-form\">\n {rewardAmount && (\n <div\n className=\"flex items-start gap-2 rounded-md bg-green-bg p-3 text-sm\"\n data-testid=\"invite-reward-banner\"\n >\n <Gift className=\"mt-0.5 size-4 shrink-0 text-green-text\" />\n <p className=\"text-muted-foreground\">{l.reward(rewardAmount)}</p>\n </div>\n )}\n <div>\n <Textarea\n id=\"invite-emails\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={isPending}\n placeholder={l.placeholder}\n rows={2}\n autoFocus\n data-testid=\"invite-emails-input\"\n />\n <p className=\"mt-1.5 text-sm text-muted-foreground\">{l.hint}</p>\n </div>\n\n <div className=\"flex flex-col gap-2 pt-2\">\n <Button\n onClick={() => onSubmit(emails)}\n disabled={emailCount === 0 || overMax || isPending}\n className=\"w-full\"\n data-testid=\"invite-send-button\"\n >\n {isPending ? (\n l.adding\n ) : (\n <>\n <AtSign className=\"mr-2 size-4\" />\n {overMax ? l.addOverMax(emailCount, maxEmails) : l.add(emailCount)}\n </>\n )}\n </Button>\n <Button variant=\"outline\" onClick={onCancel} disabled={isPending} className=\"w-full\">\n {l.cancel}\n </Button>\n </div>\n </div>\n )\n}\n\nexport interface AddContactsResultRow {\n email: string\n status: 'success' | 'failed' | 'pending'\n message: string\n}\n\nexport interface AddContactsResultsProps {\n rows: AddContactsResultRow[]\n onDone?: () => void\n onAddMore: () => void\n labels?: Partial<AddContactsLabels>\n}\n\nconst STATUS_ICON = {\n success: <CheckCircle className=\"size-4 shrink-0 text-green-text\" />,\n failed: <XCircle className=\"size-4 shrink-0 text-red-text\" />,\n pending: <AlertCircle className=\"size-4 shrink-0 text-yellow-text\" />,\n} as const\n\n/** Per-address outcome table with Done / Add More. */\nexport function AddContactsResults({ rows, onDone, onAddMore, labels }: AddContactsResultsProps) {\n const l = useMemo(() => ({ ...DEFAULT_ADD_CONTACTS_LABELS, ...labels }), [labels])\n return (\n <ModalSection>\n <ModalSectionTitle>{l.results}</ModalSectionTitle>\n <div className=\"max-h-80 overflow-y-auto rounded-md border\">\n <table className=\"w-full\">\n <thead className=\"sticky top-0 bg-muted/50\">\n <tr>\n <th className=\"p-2 text-left font-medium\">{l.email}</th>\n <th className=\"p-2 text-left font-medium\">{l.status}</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row, index) => (\n <tr\n key={index}\n className=\"border-t hover:bg-muted/30\"\n data-testid={`email-status-row-${index}`}\n >\n <td className=\"p-2\">{row.email}</td>\n <td className=\"p-2\">\n <div className=\"flex items-center gap-2\">\n {STATUS_ICON[row.status]}\n <span className=\"text-muted-foreground\">{row.message}</span>\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n <div className=\"flex flex-col gap-2 pt-4\">\n <Button onClick={onDone} className=\"w-full\" data-testid=\"close-results-button\">\n {l.done}\n </Button>\n <Button\n variant=\"outline\"\n onClick={onAddMore}\n className=\"w-full\"\n data-testid=\"start-over-button\"\n >\n {l.addMore}\n </Button>\n </div>\n </ModalSection>\n )\n}\n","/**\n * vCard (.vcf) generation for a contact: a real, importable card. No dependencies: it assembles\n * vCard 3.0 text (RFC 2426, understood by every address book) and triggers a Blob download.\n */\n\n/** What a card can carry. Only `name` is required; empty fields are left out. */\nexport interface VCardContact {\n /** Full display name (\"Ada Lovelace\"). */\n name: string\n email?: string\n phone?: string\n /** Company or organisation. */\n organisation?: string\n /** Job title or role. */\n title?: string\n /** One-line postal address. */\n address?: string\n /** A web page or profile link. */\n url?: string\n note?: string\n}\n\n/** Escape a text value (RFC 2426 section 4): backslash, comma, semicolon and new lines. */\nfunction escapeText(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/([,;])/g, '\\\\$1')\n .replace(/\\r\\n|\\r|\\n/g, '\\\\n')\n}\n\n/** Fold a content line at 75 octets with a CRLF + space continuation (RFC 2426 section 2.6). */\nfunction fold(line: string): string {\n const encoder = new TextEncoder()\n if (encoder.encode(line).length <= 75) return line\n const out: string[] = []\n let current = ''\n let size = 0\n for (const ch of line) {\n const bytes = encoder.encode(ch).length\n // Continuation lines start with a space that counts toward their 75 octets.\n const limit = out.length === 0 ? 75 : 74\n if (size + bytes > limit) {\n out.push(current)\n current = ''\n size = 0\n }\n current += ch\n size += bytes\n }\n out.push(current)\n return out.join('\\r\\n ')\n}\n\n/** Split \"Ada Byron Lovelace\" into family name (last word) and given names (the rest). */\nfunction splitName(name: string): { family: string; given: string } {\n const words = name.trim().split(/\\s+/).filter(Boolean)\n const family = words.length > 1 ? (words[words.length - 1] ?? '') : ''\n const given = words.length > 1 ? words.slice(0, -1).join(' ') : (words[0] ?? '')\n return { family, given }\n}\n\n/** The vCard 3.0 text for a contact, CRLF separated. */\nexport function contactToVCard(contact: VCardContact): string {\n const name = contact.name.trim()\n const { family, given } = splitName(name)\n const lines = [\n 'BEGIN:VCARD',\n 'VERSION:3.0',\n `N:${escapeText(family)};${escapeText(given)};;;`,\n `FN:${escapeText(name)}`,\n contact.organisation && `ORG:${escapeText(contact.organisation)}`,\n contact.title && `TITLE:${escapeText(contact.title)}`,\n contact.email && `EMAIL;TYPE=INTERNET,WORK:${escapeText(contact.email)}`,\n contact.phone && `TEL;TYPE=WORK,VOICE:${escapeText(contact.phone)}`,\n contact.address && `ADR;TYPE=WORK:;;${escapeText(contact.address)};;;;`,\n contact.url && `URL:${contact.url}`,\n contact.note && `NOTE:${escapeText(contact.note)}`,\n 'END:VCARD',\n ].filter((line): line is string => Boolean(line))\n return lines.map(fold).join('\\r\\n') + '\\r\\n'\n}\n\n/** A safe file name for a contact: \"ada-lovelace.vcf\" (\"contact.vcf\" when nothing usable is left). */\nexport function vCardFilename(contact: Pick<VCardContact, 'name'>): string {\n const slug = contact.name\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n return `${slug || 'contact'}.vcf`\n}\n\n/** Save the contact as a .vcf file through a temporary link click. Browser only. */\nexport function downloadVCard(contact: VCardContact): void {\n const blob = new Blob([contactToVCard(contact)], { type: 'text/vcard;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = vCardFilename(contact)\n document.body.appendChild(link)\n link.click()\n link.remove()\n // Revoke after the click has been handled: some browsers cancel the download otherwise.\n setTimeout(() => URL.revokeObjectURL(url), 0)\n}\n","import type { ReactNode } from 'react'\nimport { Contact, Download, Mail, MoreHorizontal, Phone } from 'lucide-react'\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { downloadVCard, type VCardContact } from './vcard'\n\n/** Every fixed string of the contact card. */\nexport interface ContactCardLabels {\n /** Accessible name of the menu button. */\n actions: string\n /** The export menu item. */\n exportVCard: string\n}\n\nexport const DEFAULT_CONTACT_CARD_LABELS: ContactCardLabels = {\n actions: 'Contact actions',\n exportVCard: 'Save to address book (.vcf)',\n}\n\n/** An extra menu entry a host adds next to the built-in export. */\nexport interface ContactCardAction {\n id: string\n label: string\n icon?: ReactNode\n onSelect: () => void\n destructive?: boolean\n}\n\nexport interface ContactCardProps {\n contact: VCardContact & { avatarUrl?: string }\n /** A badge or status text under the name (\"Invitation pending\"). */\n status?: ReactNode\n /**\n * Called when \"Save to address book\" is chosen. Omit it to use the built-in\n * {@link downloadVCard}; pass your own to log, or to hand the card to a native share sheet.\n */\n onExportVCard?: (contact: VCardContact) => void\n /** Hide the export item entirely (a contact with no usable details). Default true. */\n exportable?: boolean\n /** More menu entries, listed after the export. */\n actions?: ContactCardAction[]\n labels?: Partial<ContactCardLabels>\n className?: string\n 'data-testid'?: string\n}\n\nfunction initials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean)\n return (\n (words[0]?.[0] ?? '') + (words.length > 1 ? (words[words.length - 1]?.[0] ?? '') : '')\n ).toUpperCase()\n}\n\n/**\n * A contact as a card: avatar, name, role, email and phone, and a menu that exports the contact\n * as a vCard. The export is built in ({@link downloadVCard}); `onExportVCard` replaces it, and\n * `actions` adds host entries. Presentational: no SDK, store or router.\n */\nexport function ContactCard({\n contact,\n status,\n onExportVCard = downloadVCard,\n exportable = true,\n actions = [],\n labels,\n className,\n 'data-testid': testId = 'contact-card',\n}: ContactCardProps) {\n const l = { ...DEFAULT_CONTACT_CARD_LABELS, ...labels }\n const subtitle = [contact.title, contact.organisation].filter(Boolean).join(', ')\n const hasMenu = exportable || actions.length > 0\n const { avatarUrl, ...vcard } = contact\n return (\n <div\n data-slot=\"contact-card\"\n data-testid={testId}\n className={`flex min-w-0 items-center gap-3 rounded-lg border border-border bg-card p-3 text-card-foreground ${className ?? ''}`}\n >\n <Avatar className=\"size-10 shrink-0\">\n {avatarUrl && <AvatarImage src={avatarUrl} alt=\"\" />}\n <AvatarFallback>{initials(contact.name) || <Contact className=\"size-4\" />}</AvatarFallback>\n </Avatar>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\" data-testid={`${testId}-name`}>\n {contact.name}\n </p>\n {subtitle && <p className=\"truncate text-xs text-muted-foreground\">{subtitle}</p>}\n {contact.email && (\n <p className=\"flex min-w-0 items-center gap-1 text-xs text-muted-foreground\">\n <Mail className=\"size-3 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{contact.email}</span>\n </p>\n )}\n {contact.phone && (\n <p className=\"flex min-w-0 items-center gap-1 text-xs text-muted-foreground\">\n <Phone className=\"size-3 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{contact.phone}</span>\n </p>\n )}\n {status && <div className=\"mt-1 text-xs\">{status}</div>}\n </div>\n {hasMenu && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.actions}\n data-testid={`${testId}-menu`}\n className=\"flex size-8 pointer-coarse:size-11 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-muted hover:text-foreground data-[state=open]:bg-muted\"\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {exportable && (\n <DropdownMenuItem\n onSelect={() => onExportVCard(vcard)}\n data-testid={`${testId}-export-vcard`}\n >\n <Download className=\"mr-2 size-4\" aria-hidden=\"true\" />\n {l.exportVCard}\n </DropdownMenuItem>\n )}\n {actions.map((a) => (\n <DropdownMenuItem\n key={a.id}\n onSelect={a.onSelect}\n className={a.destructive ? 'text-red-text focus:text-red-text' : undefined}\n data-testid={`${testId}-action-${a.id}`}\n >\n {a.icon}\n {a.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n )\n}\n","import { useMemo, type ReactNode } from 'react'\nimport { UserPlus } from 'lucide-react'\n\n/** Every fixed string of the invite chip. `title` / `description` props win. */\nexport interface DmInviteChipLabels {\n title: string\n description: string\n}\n\nexport const DEFAULT_DM_INVITE_CHIP_LABELS: DmInviteChipLabels = {\n title: 'Add a contact by email',\n description: 'Send an invitation to join you on ARBI',\n}\n\n/** Leading call to action of the conversation list, styled as a chip so it reads as one of the rows. */\nexport function DmInviteChip({\n onClick,\n title,\n description,\n testId = 'dm-invite-chip',\n labels,\n}: {\n onClick: () => void\n title?: string\n description?: string\n testId?: string\n labels?: Partial<DmInviteChipLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_DM_INVITE_CHIP_LABELS, ...labels }), [labels])\n return (\n <button\n type=\"button\"\n onClick={onClick}\n data-testid={testId}\n className=\"flex w-full items-center gap-3 border-b border-border px-4 py-3 text-left transition-colors hover:bg-accent/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-ai-accent-soft\">\n <UserPlus className=\"size-4 text-ai-accent\" />\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-semibold text-foreground\">{title ?? l.title}</span>\n <span className=\"block text-xs text-muted-foreground\">{description ?? l.description}</span>\n </span>\n </button>\n )\n}\n\nexport interface DmThreadHeaderProps {\n /** Peer avatar (with presence dot). Omitted while the conversation loads. */\n avatar?: ReactNode\n name: string\n /** Marks the peer as an agent. */\n badge?: ReactNode\n /** Presence in words, next to the address. */\n presence?: ReactNode\n email?: string\n /** Overflow menu, sitting after the identity. */\n menu?: ReactNode\n testId?: string\n}\n\n/**\n * The open conversation's identity, pinned above the thread: who you are talking to, static (no\n * switcher dropdown; back out to the list to pick another conversation).\n */\nexport function DmThreadHeader({\n avatar,\n name,\n badge,\n presence,\n email,\n menu,\n testId = 'dm-active-chip',\n}: DmThreadHeaderProps) {\n return (\n <div\n className=\"flex items-center gap-1 border-b border-border pr-2\"\n data-slot=\"dm-thread-header\"\n >\n <div data-testid={testId} className=\"flex min-w-0 flex-1 items-center gap-3 px-4 py-2.5\">\n {avatar}\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{name}</span>\n {badge}\n </span>\n <span className=\"flex min-w-0 items-center gap-1.5\">\n {presence}\n {presence && <span className=\"text-xs text-muted-foreground\">·</span>}\n <span className=\"min-w-0 truncate text-xs text-muted-foreground\">{email ?? ''}</span>\n </span>\n </span>\n </div>\n {menu}\n </div>\n )\n}\n","import { useMemo, type ReactNode, type Ref } from 'react'\nimport {\n AtSign,\n ChevronsUpDown,\n KeyRound,\n Loader2,\n MoreVertical,\n Plus,\n Bell,\n BellOff,\n X,\n} from 'lucide-react'\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Popover,\n PopoverContent,\n PopoverTrigger,\n ScrollArea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\nimport { ModalSectionTitle } from '../../settings/ModalScaffold'\n\n/** Every fixed string of the access-request banner. */\nexport interface DmAccessRequestBannerLabels {\n /** Text after the bold peer name (keep the leading space). */\n requestedAccess: string\n review: string\n}\n\nexport const DEFAULT_DM_ACCESS_REQUEST_BANNER_LABELS: DmAccessRequestBannerLabels = {\n requestedAccess: ' requested workspace access',\n review: 'Review',\n}\n\n/** Every fixed string of the thread frame. */\nexport interface DmThreadFrameLabels {\n noMessages: string\n}\n\nexport const DEFAULT_DM_THREAD_FRAME_LABELS: DmThreadFrameLabels = {\n noMessages: 'No messages yet — say hi 👋',\n}\n\n/** Every fixed string of the grant-access dialog. */\nexport interface DmGrantAccessDialogLabels {\n title: string\n description: (peerName: string) => string\n noWorkspace: string\n workspace: string\n role: string\n cancel: string\n grantAccess: string\n}\n\nexport const DEFAULT_DM_GRANT_ACCESS_DIALOG_LABELS: DmGrantAccessDialogLabels = {\n title: 'Grant workspace access',\n description: (peerName) =>\n `Give ${peerName} access to one of your workspaces. Access is permanent until you remove it.`,\n noWorkspace:\n 'Open the workspace you want to share, as its owner, and you can grant access to it from here.',\n workspace: 'Workspace',\n role: 'Role',\n cancel: 'Cancel',\n grantAccess: 'Grant access',\n}\n\n/** Every fixed string of the recipient picker. */\nexport interface RecipientPickerLabels {\n to: string\n unmuteNotifications: string\n muteNotifications: string\n removeRecipient: string\n selectRecipient: string\n addRecipient: string\n searchUsers: string\n noKnownUsers: string\n noMatchingUsers: string\n addContactsHint: string\n}\n\nexport const DEFAULT_RECIPIENT_PICKER_LABELS: RecipientPickerLabels = {\n to: 'To',\n unmuteNotifications: 'Unmute notifications',\n muteNotifications: 'Mute notifications',\n removeRecipient: 'Remove recipient',\n selectRecipient: 'Select recipient...',\n addRecipient: 'Add recipient',\n searchUsers: 'Search users...',\n noKnownUsers: 'No known users',\n noMatchingUsers: 'No matching users',\n addContactsHint: 'Add contacts or join workspaces to send private messages',\n}\n\nexport type ActionMenuEntry =\n | {\n id: string\n label: ReactNode\n icon?: ReactNode\n onSelect: () => void\n testId?: string\n destructive?: boolean\n }\n | { id: string; separator: true }\n\nexport interface ActionMenuProps {\n /** Accessible name of the trigger. */\n label: string\n testId?: string\n entries: ActionMenuEntry[]\n /** Width class of the menu. */\n contentClassName?: string\n}\n\n/** A single ⋮ overflow menu: the occasional actions on a row or header. */\nexport function ActionMenu({ label, testId, entries, contentClassName = 'w-56' }: ActionMenuProps) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n aria-label={label}\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n >\n <MoreVertical className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className={contentClassName}>\n {entries.map((entry) =>\n 'separator' in entry ? (\n <DropdownMenuSeparator key={entry.id} />\n ) : (\n <DropdownMenuItem\n key={entry.id}\n onClick={entry.onSelect}\n className={entry.destructive ? 'text-destructive focus:text-destructive' : undefined}\n data-testid={entry.testId}\n >\n {entry.icon && (\n <span className=\"mr-2 inline-flex size-4 items-center\">{entry.icon}</span>\n )}\n {entry.label}\n </DropdownMenuItem>\n )\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/** Round \"@\" mark standing in for the face of a pending invitation. */\nexport function DmInviteAvatar() {\n return (\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <AtSign className=\"size-4\" />\n </span>\n )\n}\n\n/** Round \"+\" tab icon of a new (compose) conversation. */\nexport function DmNewTabIcon() {\n return (\n <div className=\"flex h-5 w-5 items-center justify-center rounded-full bg-primary/10\">\n <Plus className=\"h-3 w-3 text-primary\" />\n </div>\n )\n}\n\n/** Banner at the top of a thread: the peer asked for workspace access; Review opens the grant flow. */\nexport function DmAccessRequestBanner({\n name,\n onReview,\n labels,\n}: {\n name: string\n onReview: () => void\n labels?: Partial<DmAccessRequestBannerLabels>\n}) {\n const l = useMemo(() => ({ ...DEFAULT_DM_ACCESS_REQUEST_BANNER_LABELS, ...labels }), [labels])\n return (\n <div className=\"mx-4 mt-3 flex items-center gap-3 rounded-lg bg-muted px-3 py-2.5\">\n <KeyRound className=\"h-4 w-4 shrink-0 text-primary\" />\n <span className=\"min-w-0 flex-1 text-sm text-foreground\">\n <span className=\"font-medium\">{name}</span>\n {l.requestedAccess}\n </span>\n <Button size=\"sm\" onClick={onReview} data-testid=\"dm-review-access-button\">\n {l.review}\n </Button>\n </div>\n )\n}\n\nexport interface DmThreadFrameProps {\n /** Recipient picker, shown above everything in compose mode. */\n recipientPicker?: ReactNode\n accessBanner?: ReactNode\n /** A recipient is chosen: the history area shows. */\n hasRecipient: boolean\n /** The history is still decrypting. */\n isLoading: boolean\n /** Messages (and the typing indicator), rendered inside the scroll area. */\n history: ReactNode\n /** No messages yet. */\n isEmpty: boolean\n /** Prompt shown when there is no recipient and users exist to pick from. */\n noRecipientPrompt?: ReactNode\n /** Ref to the history wrapper (the host scrolls its viewport). */\n historyRef?: Ref<HTMLDivElement>\n composer: ReactNode\n labels?: Partial<DmThreadFrameLabels>\n}\n\n/** Layout of one direct-message thread: picker, banner, scrolling history, composer. */\nexport function DmThreadFrame({\n recipientPicker,\n accessBanner,\n hasRecipient,\n isLoading,\n history,\n isEmpty,\n noRecipientPrompt,\n historyRef,\n composer,\n labels,\n}: DmThreadFrameProps) {\n const l = useMemo(() => ({ ...DEFAULT_DM_THREAD_FRAME_LABELS, ...labels }), [labels])\n return (\n <div className=\"flex h-full flex-col bg-background\">\n {recipientPicker}\n {accessBanner}\n\n {/* Clean page surface: the peer bubble is `bg-card` and the own bubble a soft tint. */}\n {hasRecipient && (\n <div className=\"min-h-0 flex-1 overflow-hidden bg-background\" ref={historyRef}>\n <ScrollArea className=\"h-full\">\n <div className=\"px-4 py-3\">\n {isLoading ? (\n <div className=\"flex h-32 items-center justify-center\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n ) : !isEmpty ? (\n history\n ) : (\n <div className=\"flex h-32 items-center justify-center text-sm text-muted-foreground\">\n {l.noMessages}\n </div>\n )}\n </div>\n </ScrollArea>\n </div>\n )}\n\n {!hasRecipient && noRecipientPrompt && (\n <div className=\"flex min-h-0 flex-1 items-center justify-center bg-background p-4\">\n <p className=\"text-center text-sm text-muted-foreground\">{noRecipientPrompt}</p>\n </div>\n )}\n\n <div className=\"shrink-0\">{composer}</div>\n </div>\n )\n}\n\nexport interface DmGrantAccessDialogViewProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n peerName: string\n /** The one workspace that can be shared; `null` when none is eligible. */\n workspaceName: string | null\n role: string\n onRoleChange: (role: string) => void\n roles: { value: string; label: string; hint: string }[]\n isGranting: boolean\n onGrant: () => void\n labels?: Partial<DmGrantAccessDialogLabels>\n}\n\n/** Offer a person access to the open workspace: the workspace, a role, a grant button. */\nexport function DmGrantAccessDialogView({\n open,\n onOpenChange,\n peerName,\n workspaceName,\n role,\n onRoleChange,\n roles,\n isGranting,\n onGrant,\n labels,\n}: DmGrantAccessDialogViewProps) {\n const l = useMemo(() => ({ ...DEFAULT_DM_GRANT_ACCESS_DIALOG_LABELS, ...labels }), [labels])\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent presentation=\"sheet\" data-testid=\"dm-grant-access-modal\">\n <DialogHeader>\n <DialogTitle>{l.title}</DialogTitle>\n <DialogDescription>{l.description(peerName)}</DialogDescription>\n </DialogHeader>\n\n {workspaceName === null ? (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"dm-grant-none\">\n {l.noWorkspace}\n </p>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{l.workspace}</label>\n <p className=\"rounded-lg bg-muted px-3 py-2 text-sm\" data-testid=\"dm-grant-workspace\">\n {workspaceName}\n </p>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{l.role}</label>\n <Select value={role} onValueChange={onRoleChange}>\n <SelectTrigger data-testid=\"dm-grant-role\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n {r.label} — {r.hint}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n )}\n\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} disabled={isGranting}>\n {l.cancel}\n </Button>\n <Button\n onClick={onGrant}\n disabled={isGranting || workspaceName === null}\n data-testid=\"dm-grant-submit\"\n >\n {isGranting && <Loader2 className=\"mr-2 size-4 animate-spin\" />}\n {l.grantAccess}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport interface RecipientView {\n id: string\n /** Avatar + name pill. */\n identity: ReactNode\n isMuted: boolean\n muteTooltip: string\n onToggleMute: () => void\n isMuteBusy?: boolean\n}\n\nexport interface RecipientCandidate {\n id: string\n identity: ReactNode\n}\n\nexport interface RecipientPickerProps {\n selected: RecipientView[]\n onRemove: (id: string) => void\n candidates: RecipientCandidate[]\n onPick: (id: string) => void\n /** Hide the add control (the maximum is reached). */\n canAdd: boolean\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n search: string\n onSearchChange: (value: string) => void\n /** There is nobody at all to pick from (vs. no search match). */\n hasNoKnownUsers: boolean\n labels?: Partial<RecipientPickerLabels>\n}\n\n/** \"To:\" row of the compose view: chosen recipients (mutable) and a searchable add control. */\nexport function RecipientPicker({\n selected,\n onRemove,\n candidates,\n onPick,\n canAdd,\n isOpen,\n onOpenChange,\n search,\n onSearchChange,\n hasNoKnownUsers,\n labels,\n}: RecipientPickerProps) {\n const l = useMemo(() => ({ ...DEFAULT_RECIPIENT_PICKER_LABELS, ...labels }), [labels])\n return (\n <div className=\"shrink-0 border-b px-6 py-4\">\n <div className=\"flex items-start gap-3\">\n <ModalSectionTitle className=\"mb-0 shrink-0 py-1.5\">{l.to}</ModalSectionTitle>\n\n <div className=\"flex flex-1 flex-col gap-1.5\">\n {selected.map((recipient) => (\n <div\n key={recipient.id}\n className=\"flex items-center justify-between gap-2 rounded-md bg-muted/50 px-3 py-1.5\"\n >\n <div className=\"flex items-center gap-2\">\n {recipient.identity}\n <Tooltip>\n <TooltipTrigger\n onClick={recipient.onToggleMute}\n aria-label={recipient.isMuted ? l.unmuteNotifications : l.muteNotifications}\n aria-pressed={recipient.isMuted}\n className={`rounded p-1 transition-colors hover:bg-muted pointer-coarse:p-3 ${\n recipient.isMuted\n ? 'text-muted-foreground'\n : 'text-muted-foreground/40 hover:text-muted-foreground'\n }`}\n disabled={recipient.isMuteBusy}\n >\n {recipient.isMuted ? (\n <BellOff size={14} fill=\"currentColor\" />\n ) : (\n <Bell size={14} />\n )}\n </TooltipTrigger>\n <TooltipContent className=\"max-w-[250px]\">{recipient.muteTooltip}</TooltipContent>\n </Tooltip>\n </div>\n <button\n type=\"button\"\n onClick={() => onRemove(recipient.id)}\n className=\"p-1 text-muted-foreground hover:text-destructive pointer-coarse:p-3\"\n title={l.removeRecipient}\n aria-label={l.removeRecipient}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n\n {canAdd && (\n <Popover open={isOpen} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n {selected.length === 0 ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={candidates.length === 0}\n className=\"w-full justify-start text-muted-foreground\"\n >\n <ChevronsUpDown className=\"mr-2 h-4 w-4\" />\n {l.selectRecipient}\n </Button>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n disabled={candidates.length === 0}\n className=\"h-7 w-7 rounded-full\"\n title={l.addRecipient}\n aria-label={l.addRecipient}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n )}\n </PopoverTrigger>\n <PopoverContent\n className=\"w-72 p-0\"\n align=\"start\"\n onPointerDownOutside={(e) => e.preventDefault()}\n >\n <Command shouldFilter={false}>\n <CommandInput\n placeholder={l.searchUsers}\n value={search}\n onValueChange={onSearchChange}\n />\n <CommandList>\n {candidates.length === 0 ? (\n <CommandEmpty>\n {hasNoKnownUsers ? l.noKnownUsers : l.noMatchingUsers}\n </CommandEmpty>\n ) : (\n <CommandGroup>\n {candidates.map((candidate) => (\n <CommandItem\n key={candidate.id}\n onSelect={() => onPick(candidate.id)}\n className=\"cursor-pointer justify-start\"\n >\n {candidate.identity}\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )}\n\n {hasNoKnownUsers && <p className=\"text-sm text-muted-foreground\">{l.addContactsHint}</p>}\n </div>\n </div>\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/docx/NativeDocxComparison.tsx","../src/docx/StreamedWordArtifact.tsx"],"names":["parseVersionRef","useRef","useState","useEffect","error","jsxs","jsx","NativeDocxEditor"],"mappings":"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","file":"chunk-MHFF5N65.cjs","sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport { NativeDocxEditor, type NativeDocxAdapter } from './NativeDocxEditor'\n\nexport interface NativeDocxComparisonProps {\n adapter: NativeDocxAdapter\n baseId: string\n revisedId: string\n title: string\n onCompared?: (documentId: string) => void | Promise<void>\n}\n\n/** A `doc-…@v{n}` side names an older version: the endpoint takes its document and version apart. */\nfunction redlineQuery(baseId: string, revisedId: string): URLSearchParams {\n const base = parseVersionRef(baseId)\n const revised = parseVersionRef(revisedId)\n const query = new URLSearchParams({ base_ext_id: base.docId, revised_ext_id: revised.docId })\n if (base.version) query.set('base_version', String(base.version))\n if (revised.version) query.set('revised_version', String(revised.version))\n return query\n}\n\n/** Word comparison through the host's authenticated transport and LibreOffice service. */\nexport function NativeDocxComparison({\n adapter,\n baseId,\n revisedId,\n title,\n onCompared,\n}: NativeDocxComparisonProps) {\n const host = useRef({ adapter, onCompared })\n host.current = { adapter, onCompared }\n const [documentId, setDocumentId] = useState('')\n const [error, setError] = useState('')\n const [attempt, setAttempt] = useState(0)\n useEffect(() => {\n let cancelled = false\n setDocumentId('')\n setError('')\n void host.current.adapter\n .request(`/redline?${redlineQuery(baseId, revisedId)}`, { method: 'POST' })\n .then((response) => response.json())\n .then((result: { document_ext_id: string }) => {\n if (!result.document_ext_id) throw new Error('Comparison did not return a Word document.')\n if (!cancelled) {\n setDocumentId(result.document_ext_id)\n void Promise.resolve(host.current.onCompared?.(result.document_ext_id)).catch(() => {})\n }\n })\n .catch((error) => {\n if (!cancelled) setError(error instanceof Error ? error.message : String(error))\n })\n return () => {\n cancelled = true\n }\n }, [baseId, revisedId, attempt])\n if (error)\n return (\n <div className=\"native-docx-error\" role=\"alert\">\n <p>{error}</p>\n <button onClick={() => setAttempt((value) => value + 1)}>Retry comparison</button>\n </div>\n )\n if (!documentId)\n return (\n <div className=\"native-docx-error\" role=\"status\">\n Comparing Word documents…\n </div>\n )\n return (\n <NativeDocxEditor\n key={documentId}\n adapter={adapter}\n documentId={documentId}\n title={`${title.replace(/\\.[^.]+$/, '')} (redline).docx`}\n />\n )\n}\n","import { NativeDocxEditor, type NativeDocxAdapter } from './NativeDocxEditor'\n\nexport interface StreamedWordArtifactProps {\n adapter: NativeDocxAdapter\n /** Streamed Markdown, shown as a read-only preview while the draft is generated. */\n content: string\n title: string\n busy: boolean\n error?: string | null\n /** The DOCX draft the server stored for this generation (`doc-…`), once known. */\n documentId?: string\n onSaved?: (documentId: string) => void\n}\n\n/**\n * One drafting surface for an AI document draft. The server stores every draft as DOCX, so\n * this component never creates a document: it previews the streamed Markdown until generation\n * ends and the stored DOCX is known, then opens that DOCX in the live collaborative editor.\n */\nexport function StreamedWordArtifact({\n adapter,\n content,\n title,\n busy,\n error,\n documentId,\n onSaved,\n}: StreamedWordArtifactProps) {\n if (!busy && documentId) {\n return (\n <NativeDocxEditor\n key={documentId}\n adapter={adapter}\n documentId={documentId}\n title={title}\n onSaved={onSaved}\n />\n )\n }\n return (\n <NativeDocxEditor\n key=\"stream-preview\"\n adapter={adapter}\n documentId=\"stream-preview\"\n title={title}\n draftContent=\"\"\n stream={{ content, busy, error }}\n />\n )\n}\n"]}