@arbidocs/blocks 0.4.146 → 0.4.150

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 (357) hide show
  1. package/dist/ConnectedNativeDocxComparison-3XQSINPQ.cjs +44 -0
  2. package/dist/ConnectedNativeDocxComparison-3XQSINPQ.cjs.map +1 -0
  3. package/dist/ConnectedNativeDocxComparison-XQSXVGHR.js +35 -0
  4. package/dist/ConnectedNativeDocxComparison-XQSXVGHR.js.map +1 -0
  5. package/dist/ConnectedNativeDocxEditor-IPEZDERL.js +33 -0
  6. package/dist/ConnectedNativeDocxEditor-IPEZDERL.js.map +1 -0
  7. package/dist/ConnectedNativeDocxEditor-OUWFMIPH.cjs +46 -0
  8. package/dist/ConnectedNativeDocxEditor-OUWFMIPH.cjs.map +1 -0
  9. package/dist/ConnectedStreamedWordArtifact-D5LSMDO4.cjs +44 -0
  10. package/dist/ConnectedStreamedWordArtifact-D5LSMDO4.cjs.map +1 -0
  11. package/dist/ConnectedStreamedWordArtifact-UZVNBKQB.js +35 -0
  12. package/dist/ConnectedStreamedWordArtifact-UZVNBKQB.js.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 +265 -266
  22. package/dist/agents/index.js +8 -9
  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/calls/index.cjs +3 -3
  27. package/dist/calls/index.js +2 -2
  28. package/dist/chat/index.cjs +78 -78
  29. package/dist/chat/index.js +3 -3
  30. package/dist/{chunk-2FL7QJKJ.js → chunk-265GOG4W.js} +3 -3
  31. package/dist/{chunk-2FL7QJKJ.js.map → chunk-265GOG4W.js.map} +1 -1
  32. package/dist/{chunk-IJST4EBM.js → chunk-3E2F4AHD.js} +8 -8
  33. package/dist/{chunk-IJST4EBM.js.map → chunk-3E2F4AHD.js.map} +1 -1
  34. package/dist/chunk-3FSXWVHW.cjs +5184 -0
  35. package/dist/chunk-3FSXWVHW.cjs.map +1 -0
  36. package/dist/{chunk-LPYEUD2D.cjs → chunk-4JNKXOFZ.cjs} +3 -3
  37. package/dist/{chunk-LPYEUD2D.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-MHFF5N65.cjs → chunk-757OYF6G.cjs} +4 -38
  41. package/dist/chunk-757OYF6G.cjs.map +1 -0
  42. package/dist/chunk-AXTDDWMR.js +16 -0
  43. package/dist/chunk-AXTDDWMR.js.map +1 -0
  44. package/dist/{chunk-B3AHCIV5.js → chunk-BJ24VPOA.js} +4 -55
  45. package/dist/chunk-BJ24VPOA.js.map +1 -0
  46. package/dist/chunk-C7PTF6BQ.cjs +172 -0
  47. package/dist/chunk-C7PTF6BQ.cjs.map +1 -0
  48. package/dist/{chunk-T5B7FM7S.js → chunk-COA3S3CZ.js} +3 -3
  49. package/dist/{chunk-T5B7FM7S.js.map → chunk-COA3S3CZ.js.map} +1 -1
  50. package/dist/{chunk-C44TDH54.js → chunk-CQPFW64W.js} +5 -5
  51. package/dist/{chunk-C44TDH54.js.map → chunk-CQPFW64W.js.map} +1 -1
  52. package/dist/chunk-D3WFIFRY.cjs +659 -0
  53. package/dist/chunk-D3WFIFRY.cjs.map +1 -0
  54. package/dist/{chunk-QXMR5YHC.js → chunk-DIB4JYUY.js} +19 -3
  55. package/dist/chunk-DIB4JYUY.js.map +1 -0
  56. package/dist/chunk-DVB5ZKOF.js +22 -0
  57. package/dist/chunk-DVB5ZKOF.js.map +1 -0
  58. package/dist/{chunk-VHJHY7TT.js → chunk-ECERC6TI.js} +3 -3
  59. package/dist/{chunk-VHJHY7TT.js.map → chunk-ECERC6TI.js.map} +1 -1
  60. package/dist/chunk-EDV7CYG6.cjs +18 -0
  61. package/dist/chunk-EDV7CYG6.cjs.map +1 -0
  62. package/dist/chunk-FAXXN7KI.cjs +213 -0
  63. package/dist/chunk-FAXXN7KI.cjs.map +1 -0
  64. package/dist/{chunk-2MJWWPHY.js → chunk-G4IYES7G.js} +140 -15
  65. package/dist/chunk-G4IYES7G.js.map +1 -0
  66. package/dist/{chunk-MFMASSEO.cjs → chunk-GGTUMLCT.cjs} +93 -91
  67. package/dist/chunk-GGTUMLCT.cjs.map +1 -0
  68. package/dist/{chunk-QI6AIHWP.cjs → chunk-GOWXP5KT.cjs} +145 -14
  69. package/dist/chunk-GOWXP5KT.cjs.map +1 -0
  70. package/dist/{chunk-O6IEZDRC.cjs → chunk-GRGS5M6O.cjs} +181 -3
  71. package/dist/chunk-GRGS5M6O.cjs.map +1 -0
  72. package/dist/{chunk-A6IU4GIW.js → chunk-HGLC566X.js} +598 -13
  73. package/dist/chunk-HGLC566X.js.map +1 -0
  74. package/dist/{chunk-O2GW5IY6.cjs → chunk-ILM42LE6.cjs} +33 -33
  75. package/dist/{chunk-O2GW5IY6.cjs.map → chunk-ILM42LE6.cjs.map} +1 -1
  76. package/dist/{chunk-C3CGJK7A.cjs → chunk-IPQ5MJ4Z.cjs} +636 -31
  77. package/dist/chunk-IPQ5MJ4Z.cjs.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-KLPRAQCE.cjs +22 -0
  85. package/dist/chunk-KLPRAQCE.cjs.map +1 -0
  86. package/dist/chunk-KQYPP72K.js +644 -0
  87. package/dist/chunk-KQYPP72K.js.map +1 -0
  88. package/dist/chunk-KUT2Y7JF.cjs +43 -0
  89. package/dist/chunk-KUT2Y7JF.cjs.map +1 -0
  90. package/dist/{chunk-6YTHQ73P.cjs → chunk-LLYZGH3L.cjs} +3 -56
  91. package/dist/chunk-LLYZGH3L.cjs.map +1 -0
  92. package/dist/{chunk-YSHIC4NJ.cjs → chunk-LXTOOUEN.cjs} +159 -154
  93. package/dist/chunk-LXTOOUEN.cjs.map +1 -0
  94. package/dist/{chunk-EVUEIBNU.js → chunk-M4S75AEJ.js} +44 -5
  95. package/dist/chunk-M4S75AEJ.js.map +1 -0
  96. package/dist/{chunk-V5OAXIBN.cjs → chunk-NPR5BGFF.cjs} +11 -11
  97. package/dist/{chunk-V5OAXIBN.cjs.map → chunk-NPR5BGFF.cjs.map} +1 -1
  98. package/dist/{chunk-PLJ7PHWU.cjs → chunk-NS7NVX4E.cjs} +3 -3
  99. package/dist/{chunk-PLJ7PHWU.cjs.map → chunk-NS7NVX4E.cjs.map} +1 -1
  100. package/dist/{chunk-RB7GX2VT.cjs → chunk-NWNAYXC7.cjs} +9 -9
  101. package/dist/{chunk-RB7GX2VT.cjs.map → chunk-NWNAYXC7.cjs.map} +1 -1
  102. package/dist/chunk-Q6N6MZKO.js +5004 -0
  103. package/dist/chunk-Q6N6MZKO.js.map +1 -0
  104. package/dist/{chunk-I2QSDQQV.cjs → chunk-QT3A4PFC.cjs} +21 -2
  105. package/dist/chunk-QT3A4PFC.cjs.map +1 -0
  106. package/dist/{chunk-6HCJ3ZEU.js → chunk-R6VCPDPF.js} +178 -6
  107. package/dist/chunk-R6VCPDPF.js.map +1 -0
  108. package/dist/{chunk-ZM26YEOT.js → chunk-RY2SODRN.js} +3 -3
  109. package/dist/{chunk-ZM26YEOT.js.map → chunk-RY2SODRN.js.map} +1 -1
  110. package/dist/chunk-SDOEHEJP.js +208 -0
  111. package/dist/chunk-SDOEHEJP.js.map +1 -0
  112. package/dist/{chunk-DETZZBG2.cjs → chunk-SIB6C7P7.cjs} +43 -2
  113. package/dist/chunk-SIB6C7P7.cjs.map +1 -0
  114. package/dist/{chunk-OPTBQSCV.cjs → chunk-SMN32BQ3.cjs} +4 -183
  115. package/dist/chunk-SMN32BQ3.cjs.map +1 -0
  116. package/dist/chunk-TAWPVD6C.cjs +1956 -0
  117. package/dist/chunk-TAWPVD6C.cjs.map +1 -0
  118. package/dist/chunk-TC25LGIM.js +6584 -0
  119. package/dist/chunk-TC25LGIM.js.map +1 -0
  120. package/dist/{chunk-OBWYM25Y.js → chunk-TL45OJQE.js} +85 -83
  121. package/dist/chunk-TL45OJQE.js.map +1 -0
  122. package/dist/{chunk-AOSUHWIL.js → chunk-TZOQKV64.js} +4 -37
  123. package/dist/chunk-TZOQKV64.js.map +1 -0
  124. package/dist/chunk-UTVY63DG.js +16 -0
  125. package/dist/chunk-UTVY63DG.js.map +1 -0
  126. package/dist/chunk-V4YZXGXR.cjs +6751 -0
  127. package/dist/chunk-V4YZXGXR.cjs.map +1 -0
  128. package/dist/chunk-XRWHFMHK.js +19 -0
  129. package/dist/chunk-XRWHFMHK.js.map +1 -0
  130. package/dist/{chunk-O4YPVYPO.cjs → chunk-YAEXSCUW.cjs} +364 -60
  131. package/dist/chunk-YAEXSCUW.cjs.map +1 -0
  132. package/dist/chunk-YIFCLNII.cjs +18 -0
  133. package/dist/chunk-YIFCLNII.cjs.map +1 -0
  134. package/dist/chunk-Z27QMJ6S.cjs +25 -0
  135. package/dist/chunk-Z27QMJ6S.cjs.map +1 -0
  136. package/dist/{chunk-CSI2B2H5.js → chunk-Z4NQ3TED.js} +4 -4
  137. package/dist/chunk-Z4NQ3TED.js.map +1 -0
  138. package/dist/{chunk-DWZXSPMB.cjs → chunk-ZAVEMQ37.cjs} +3 -3
  139. package/dist/{chunk-DWZXSPMB.cjs.map → chunk-ZAVEMQ37.cjs.map} +1 -1
  140. package/dist/{chunk-FUTMU4FR.js → chunk-ZLEYLCE4.js} +8 -181
  141. package/dist/chunk-ZLEYLCE4.js.map +1 -0
  142. package/dist/chunk-ZNLTEZEF.js +170 -0
  143. package/dist/chunk-ZNLTEZEF.js.map +1 -0
  144. package/dist/chunk-ZO7PJMCO.js +1907 -0
  145. package/dist/chunk-ZO7PJMCO.js.map +1 -0
  146. package/dist/citations/index.cjs +14 -14
  147. package/dist/citations/index.js +2 -2
  148. package/dist/collaboration/index.cjs +74 -74
  149. package/dist/collaboration/index.js +3 -3
  150. package/dist/connect/docx.cjs +23 -28
  151. package/dist/connect/docx.cjs.map +1 -1
  152. package/dist/connect/docx.js +12 -28
  153. package/dist/connect/docx.js.map +1 -1
  154. package/dist/connect/index.cjs +8799 -2057
  155. package/dist/connect/index.cjs.map +1 -1
  156. package/dist/connect/index.d.ts +11 -2
  157. package/dist/connect/index.js +8578 -1884
  158. package/dist/connect/index.js.map +1 -1
  159. package/dist/connect/viewer.cjs +1229 -0
  160. package/dist/connect/viewer.cjs.map +1 -0
  161. package/dist/connect/viewer.d.ts +8 -0
  162. package/dist/connect/viewer.js +1226 -0
  163. package/dist/connect/viewer.js.map +1 -0
  164. package/dist/connection/ConnectedWorkflowsTable.d.ts +2 -12
  165. package/dist/connection/ai.d.ts +2 -9
  166. package/dist/connection/billing/AddAddonDialog.d.ts +24 -0
  167. package/dist/connection/billing/BillingCard.d.ts +18 -0
  168. package/dist/connection/billing/BillingProjectEntity.d.ts +9 -0
  169. package/dist/connection/billing/ChangePlanDialog.d.ts +20 -0
  170. package/dist/connection/billing/ChangeProPlan.d.ts +20 -0
  171. package/dist/connection/billing/CheckoutTotal.d.ts +12 -0
  172. package/dist/connection/billing/DailyCapEditor.d.ts +4 -0
  173. package/dist/connection/billing/InvoicesModal.d.ts +6 -0
  174. package/dist/connection/billing/NewProjectFlow.d.ts +14 -0
  175. package/dist/connection/billing/PlanChangeLines.d.ts +13 -0
  176. package/dist/connection/billing/PlanSelector.d.ts +50 -0
  177. package/dist/connection/billing/ProjectBilling.d.ts +24 -0
  178. package/dist/connection/billing/ProjectDetail.d.ts +16 -0
  179. package/dist/connection/billing/ProjectUsageCard.d.ts +21 -0
  180. package/dist/connection/billing/ProjectUsageContent.d.ts +18 -0
  181. package/dist/connection/billing/ProjectsTable.d.ts +13 -0
  182. package/dist/connection/billing/ReduceAddonDialog.d.ts +18 -0
  183. package/dist/connection/billing/ReferralReward.d.ts +32 -0
  184. package/dist/connection/billing/SharedProjects.d.ts +13 -0
  185. package/dist/connection/billing/StripeCheckoutModal.d.ts +32 -0
  186. package/dist/connection/billing/SubscriptionPlans.d.ts +15 -0
  187. package/dist/connection/billing/SubscriptionStatus.d.ts +10 -0
  188. package/dist/connection/billing/addon-pricing.d.ts +97 -0
  189. package/dist/connection/billing/api-error.d.ts +6 -0
  190. package/dist/connection/billing/billing-country.d.ts +14 -0
  191. package/dist/connection/billing/billing-focus.d.ts +11 -0
  192. package/dist/connection/billing/index.d.ts +22 -0
  193. package/dist/connection/billing/plan-badge.d.ts +15 -0
  194. package/dist/connection/billing/plan-change-outcome.d.ts +15 -0
  195. package/dist/connection/billing/plan-constants.d.ts +29 -0
  196. package/dist/connection/billing/plan-pricing.d.ts +67 -0
  197. package/dist/connection/billing/quota-items.d.ts +33 -0
  198. package/dist/connection/billing/referral-reward.d.ts +28 -0
  199. package/dist/connection/billing/refusal-copy.d.ts +5 -0
  200. package/dist/connection/billing/reward-balance.d.ts +19 -0
  201. package/dist/connection/billing/support.d.ts +35 -0
  202. package/dist/connection/billing/tax-quote.d.ts +36 -0
  203. package/dist/connection/billing/useAddonPurchase.d.ts +32 -0
  204. package/dist/connection/billing/useAutoRefreshPendingProjects.d.ts +11 -0
  205. package/dist/connection/billing/useCheckoutQuote.d.ts +30 -0
  206. package/dist/connection/billing/useOpenBillingPortal.d.ts +12 -0
  207. package/dist/connection/calendar/CalendarSettingsDialog.d.ts +1 -1
  208. package/dist/connection/connectors/ConnectedAppsSettings.d.ts +24 -0
  209. package/dist/connection/connectors/ConnectedDriveSyncDialog.d.ts +12 -0
  210. package/dist/connection/connectors/ConnectedMailboxSyncDialog.d.ts +12 -0
  211. package/dist/connection/connectors/index.d.ts +4 -0
  212. package/dist/connection/connectors/sync-labels.d.ts +21 -0
  213. package/dist/connection/facts/ConnectedFactsPage.d.ts +50 -0
  214. package/dist/connection/facts/FactMarkdownEditor.d.ts +57 -0
  215. package/dist/connection/facts/FactSourcesPopover.d.ts +38 -0
  216. package/dist/connection/facts/FactTextEditor.d.ts +2 -0
  217. package/dist/connection/facts/factNouns.d.ts +4 -0
  218. package/dist/connection/facts/factPageColumns.d.ts +37 -0
  219. package/dist/connection/facts/types.d.ts +127 -0
  220. package/dist/connection/facts/useFactActions.d.ts +10 -0
  221. package/dist/connection/facts/useFactComposer.d.ts +54 -0
  222. package/dist/connection/facts/useFactFilters.d.ts +101 -0
  223. package/dist/connection/facts/useFactSelection.d.ts +82 -0
  224. package/dist/connection/facts/useFactsGrid.d.ts +87 -0
  225. package/dist/connection/facts/useFactsPageView.d.ts +4 -0
  226. package/dist/connection/mail/ConnectedMailComposer.d.ts +3 -1
  227. package/dist/connection/mail/ConnectedMailbox.d.ts +4 -2
  228. package/dist/connection/mail/MailComposerForm.d.ts +4 -2
  229. package/dist/connection/mail/MailRecipientInput.d.ts +14 -0
  230. package/dist/connection/mail/index.d.ts +1 -1
  231. package/dist/connection/mail/types.d.ts +10 -0
  232. package/dist/connection/search/ConnectedSearchPage.d.ts +64 -0
  233. package/dist/connection/search/SearchResultRows.d.ts +38 -0
  234. package/dist/connection/search/index.d.ts +2 -0
  235. package/dist/connection/settings-page/ConnectedSettingsPage.d.ts +4 -0
  236. package/dist/connection/settings-page/index.d.ts +1 -1
  237. package/dist/connection/tags/ConnectedTagTable.d.ts +108 -0
  238. package/dist/connection/tags/ConnectedTagsPage.d.ts +55 -0
  239. package/dist/connection/tags/DocTagPassages.d.ts +25 -0
  240. package/dist/connection/tags/GlossaryExport.d.ts +7 -0
  241. package/dist/connection/tags/TagCombineFilter.d.ts +14 -0
  242. package/dist/connection/tags/TagPlacement.d.ts +16 -0
  243. package/dist/connection/tags/TagsPageSections.d.ts +36 -0
  244. package/dist/connection/tags/tagCombine.d.ts +55 -0
  245. package/dist/connection/useConnectedWorkNotifications.d.ts +7 -24
  246. package/dist/connection/viewer/ConnectedDocumentToolsProvider.d.ts +11 -0
  247. package/dist/connection/viewer/ConnectedDocumentViewer.d.ts +21 -0
  248. package/dist/connection/viewer/FinaliseTranslationButton.d.ts +15 -0
  249. package/dist/connection/viewer/ViewerPdfPane.d.ts +46 -0
  250. package/dist/connection/viewer/support.d.ts +79 -0
  251. package/dist/connection/viewer/useImageCrop.d.ts +13 -0
  252. package/dist/connection/viewer/useViewedDocument.d.ts +70 -0
  253. package/dist/connection/viewer/useViewerBlobs.d.ts +15 -0
  254. package/dist/connection/viewer/useViewerTabs.d.ts +18 -0
  255. package/dist/connection/viewer/useViewerVersions.d.ts +11 -0
  256. package/dist/connection/workspace-settings/useConnectedWorkspaceSettings.d.ts +6 -0
  257. package/dist/document-tools/index.cjs +59 -652
  258. package/dist/document-tools/index.cjs.map +1 -1
  259. package/dist/document-tools/index.js +2 -641
  260. package/dist/document-tools/index.js.map +1 -1
  261. package/dist/docx/index.cjs +48 -47
  262. package/dist/docx/index.js +4 -3
  263. package/dist/facts/FactsBulkBar.d.ts +6 -3
  264. package/dist/facts/cited-version-ref.d.ts +1 -0
  265. package/dist/facts/index.cjs +206 -1942
  266. package/dist/facts/index.cjs.map +1 -1
  267. package/dist/facts/index.d.ts +1 -0
  268. package/dist/facts/index.js +15 -1897
  269. package/dist/facts/index.js.map +1 -1
  270. package/dist/files/ViewerChrome.d.ts +5 -4
  271. package/dist/files/ViewerControlBar.d.ts +12 -0
  272. package/dist/files/doc-labels.d.ts +35 -0
  273. package/dist/files/grid/FilterButton.d.ts +12 -0
  274. package/dist/files/grid/RowDensityControl.d.ts +18 -0
  275. package/dist/files/grid/row-density.d.ts +27 -0
  276. package/dist/files/index.cjs +779 -7100
  277. package/dist/files/index.cjs.map +1 -1
  278. package/dist/files/index.d.ts +5 -0
  279. package/dist/files/index.js +14 -6919
  280. package/dist/files/index.js.map +1 -1
  281. package/dist/home/index.cjs +2 -2
  282. package/dist/home/index.js +2 -2
  283. package/dist/index.cjs +1043 -1259
  284. package/dist/index.cjs.map +1 -1
  285. package/dist/index.js +27 -360
  286. package/dist/index.js.map +1 -1
  287. package/dist/retrieval/SearchSnippet.d.ts +6 -0
  288. package/dist/retrieval/index.cjs +75 -42
  289. package/dist/retrieval/index.d.ts +2 -0
  290. package/dist/retrieval/index.js +3 -2
  291. package/dist/retrieval/search-results.d.ts +46 -0
  292. package/dist/settings/Billing.d.ts +0 -66
  293. package/dist/settings/PlanBadge.d.ts +1 -1
  294. package/dist/settings/SubscriptionParts.d.ts +1 -50
  295. package/dist/settings/index.cjs +501 -3714
  296. package/dist/settings/index.cjs.map +1 -1
  297. package/dist/settings/index.d.ts +3 -2
  298. package/dist/settings/index.js +10 -3527
  299. package/dist/settings/index.js.map +1 -1
  300. package/dist/settings/inverted-index-filter.d.ts +26 -0
  301. package/dist/shell/index.cjs +2 -2
  302. package/dist/shell/index.js +2 -2
  303. package/dist/site/index.cjs +5 -5
  304. package/dist/site/index.js +1 -1
  305. package/dist/studio/index.cjs +6 -6
  306. package/dist/studio/index.js +5 -5
  307. package/dist/tags/definitions.d.ts +10 -0
  308. package/dist/tags/index.d.ts +4 -1
  309. package/dist/tags/page/ExtractEntitiesDialog.d.ts +24 -0
  310. package/dist/tags/page/TagPicker.d.ts +16 -0
  311. package/dist/tags/page/tagsPageLabels.d.ts +36 -0
  312. package/dist/workflow-canvas/index.cjs +21 -22
  313. package/dist/workflow-canvas/index.cjs.map +1 -1
  314. package/dist/workflow-canvas/index.js +8 -9
  315. package/dist/workflow-canvas/index.js.map +1 -1
  316. package/node_modules/@arbidocs/coedit/package.json +1 -1
  317. package/package.json +13 -4
  318. package/dist/calendar/access-setup.d.ts +0 -8
  319. package/dist/chunk-2MJWWPHY.js.map +0 -1
  320. package/dist/chunk-3AFWGEDJ.cjs +0 -53
  321. package/dist/chunk-3AFWGEDJ.cjs.map +0 -1
  322. package/dist/chunk-5YHEHEJT.js +0 -1667
  323. package/dist/chunk-5YHEHEJT.js.map +0 -1
  324. package/dist/chunk-6HCJ3ZEU.js.map +0 -1
  325. package/dist/chunk-6YTHQ73P.cjs.map +0 -1
  326. package/dist/chunk-7RJTEWYM.js.map +0 -1
  327. package/dist/chunk-A6IU4GIW.js.map +0 -1
  328. package/dist/chunk-AOSUHWIL.js.map +0 -1
  329. package/dist/chunk-B3AHCIV5.js.map +0 -1
  330. package/dist/chunk-C3CGJK7A.cjs.map +0 -1
  331. package/dist/chunk-CSI2B2H5.js.map +0 -1
  332. package/dist/chunk-DETZZBG2.cjs.map +0 -1
  333. package/dist/chunk-EVUEIBNU.js.map +0 -1
  334. package/dist/chunk-FUTMU4FR.js.map +0 -1
  335. package/dist/chunk-I2QSDQQV.cjs.map +0 -1
  336. package/dist/chunk-J5CWKFSC.js +0 -170
  337. package/dist/chunk-J5CWKFSC.js.map +0 -1
  338. package/dist/chunk-MFMASSEO.cjs.map +0 -1
  339. package/dist/chunk-MHFF5N65.cjs.map +0 -1
  340. package/dist/chunk-NRFAWUVD.js.map +0 -1
  341. package/dist/chunk-O4YPVYPO.cjs.map +0 -1
  342. package/dist/chunk-O6IEZDRC.cjs.map +0 -1
  343. package/dist/chunk-OBWYM25Y.js.map +0 -1
  344. package/dist/chunk-ODRHHWHY.cjs.map +0 -1
  345. package/dist/chunk-OPTBQSCV.cjs.map +0 -1
  346. package/dist/chunk-QI6AIHWP.cjs.map +0 -1
  347. package/dist/chunk-QXMR5YHC.js.map +0 -1
  348. package/dist/chunk-RFXJYIDV.js +0 -50
  349. package/dist/chunk-RFXJYIDV.js.map +0 -1
  350. package/dist/chunk-U73KPFYH.cjs +0 -1717
  351. package/dist/chunk-U73KPFYH.cjs.map +0 -1
  352. package/dist/chunk-XVUOMWMD.cjs +0 -177
  353. package/dist/chunk-XVUOMWMD.cjs.map +0 -1
  354. package/dist/chunk-YSHIC4NJ.cjs.map +0 -1
  355. package/dist/connection/ConnectedTagTable.d.ts +0 -32
  356. package/dist/connection/calendar/CopyField.d.ts +0 -9
  357. package/dist/connection/calendar/OpenAccessPanel.d.ts +0 -7
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/connection/viewer/ConnectedDocumentToolsProvider.tsx","../../src/connection/viewer/FinaliseTranslationButton.tsx","../../src/connection/viewer/useImageCrop.ts","../../src/connection/viewer/useViewedDocument.ts","../../src/connection/viewer/useViewerBlobs.ts","../../src/connection/viewer/useViewerTabs.tsx","../../src/connection/viewer/useViewerVersions.ts","../../src/connection/viewer/ViewerPdfPane.tsx","../../src/connection/viewer/ConnectedDocumentViewer.tsx"],"names":["jsx","useDocumentTools","useCallback","useState","useMemo","isImageFile","isVideoFile","isAudioFile","useEffect","parseVersionRef","useArbiSessionStore","useArbiSessionState","KitPdfViewer","friendlyFileType","lazy","useArbi","useRef","jsxs","Fragment","Button","Suspense"],"mappings":"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","file":"viewer.js","sourcesContent":["/**\n * The PDF document tools (markup, Freeze, signing, signature requests, productions) on the\n * signed-in session, for any host: the API client, the signed-in user, the host's notices and\n * document opening (`BlocksEnvironment`), and the shared caches a change refreshes. A host with its\n * own binding (its own lists to refresh, an XHR upload with progress, Mail) keeps it: an enclosing\n * `DocumentToolsProvider` wins.\n */\n\nimport { useCallback, useMemo, type ReactNode } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { arbiQueryKeys, refreshDocuments, useArbi } from '@arbidocs/react'\nimport {\n DocumentToolsProvider,\n clientUpload,\n documentBytesKey,\n useOptionalDocumentTools,\n type DocumentChange,\n type DocumentToolsNotify,\n type DocumentUploadRequest,\n} from '@arbidocs/react/document-tools'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\n\nexport function ConnectedDocumentToolsProvider({ children }: { children: ReactNode }) {\n const enclosing = useOptionalDocumentTools()\n return enclosing ? <>{children}</> : <OwnDocumentTools>{children}</OwnDocumentTools>\n}\n\nfunction OwnDocumentTools({ children }: { children: ReactNode }) {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n const { user, ensureWorkspaceOpen } = useConnectedWorkspace()\n const { notify: environmentNotify, openDocument: openInHost } = useBlocksEnvironment()\n const client = arbi.isLoggedIn ? arbi.getClient().fetch : null\n const signer = useMemo(\n () => (user ? { name: user.name, email: user.email, externalId: user.externalId } : null),\n [user]\n )\n const notify = useCallback<DocumentToolsNotify>(\n (message, kind, options) =>\n environmentNotify(message, kind, {\n description: options?.description,\n action: options?.action,\n }),\n [environmentNotify]\n )\n const onDocumentsChanged = useCallback(\n async (ids: string[], change: DocumentChange) => {\n // The list carries each version's markup count and the copies; a signature or a saved\n // version is a new current version, with new versions and a new rendered PDF.\n const refresh: Promise<unknown>[] = [refreshDocuments(queryClient, arbi, ids)]\n if (change === 'signed' || change === 'version')\n for (const id of ids)\n refresh.push(\n queryClient.invalidateQueries({ queryKey: arbiQueryKeys.documentVersions(id) }),\n queryClient.invalidateQueries({ queryKey: documentBytesKey(id) })\n )\n await Promise.all(refresh)\n },\n [queryClient, arbi]\n )\n // The server files an upload in the session's open workspace: re-assert it first.\n const uploadDocument = useCallback(\n async (request: DocumentUploadRequest) => {\n if (!client) throw new Error('Sign in to save a copy.')\n await ensureWorkspaceOpen()\n return clientUpload(client)(request)\n },\n [client, ensureWorkspaceOpen]\n )\n const openDocument = useCallback((ref: string) => openInHost(ref), [openInHost])\n if (!client) return <>{children}</>\n return (\n <DocumentToolsProvider\n client={client}\n user={signer}\n notify={notify}\n openDocument={openDocument}\n onDocumentsChanged={onDocumentsChanged}\n uploadDocument={uploadDocument}\n >\n {children}\n </DocumentToolsProvider>\n )\n}\n","import { FileCheck2 } from 'lucide-react'\nimport { useFinaliseTranslation } from '@arbidocs/react'\nimport { useDocumentTools } from '@arbidocs/react/document-tools'\nimport { Button } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\ninterface TranslationDocument {\n external_id: string\n derived_from?: ReadonlyArray<{ role?: string | null }> | null\n}\n\n/** A translation made by ARBI that is not itself a final PDF: the editable draft to finalise. */\nconst isTranslationDraft = (doc: TranslationDocument | undefined): boolean =>\n !!doc?.derived_from?.some((d) => d.role === 'translation') &&\n !doc.derived_from.some((d) => d.role === 'final')\n\n/**\n * Finalise: save the translation's current version as a new PDF document, labelled \"Translation\" and\n * linked to the original. The editable translation stays as it is; the new PDF opens.\n */\nexport function FinaliseTranslationButton({\n document,\n isCompact,\n}: {\n document: TranslationDocument | undefined\n isCompact: boolean\n}): React.ReactElement | null {\n // The new PDF joins the documents list with its links (draft, original), so the original's\n // Translations list shows it at once.\n const finalise = useFinaliseTranslation()\n const { openDocument } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n if (!document || !isTranslationDraft(document)) return null\n const pending = finalise.isPending\n const onClick = async () => {\n try {\n const { document_ext_id: finalId } = await finalise.mutateAsync(document.external_id)\n notify('Saved the final PDF of this translation', 'success')\n openDocument?.(finalId)\n } catch (error) {\n const detail = (error as { detail?: unknown })?.detail\n notify(\n typeof detail === 'string' ? detail : 'The final PDF could not be saved. Try again.',\n 'error'\n )\n }\n }\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n title=\"Finalise: save this translation as a new PDF, labelled Translation and linked to the original\"\n aria-label=\"Finalise\"\n data-testid=\"finalise-translation-button\"\n className=\"pointer-coarse:min-h-11\"\n disabled={pending}\n onClick={() => void onClick()}\n >\n <FileCheck2 className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">{pending ? 'Finalising…' : 'Finalise'}</span>}\n </Button>\n )\n}\n","/**\n * Cropping an image in the viewer: the crop is saved as a NEW document made from the image\n * (`derived_from`, role `crop`); the original is never touched. The new document opens once its id\n * is back (otherwise it arrives through the documents list).\n */\n\nimport { useCallback, useState } from 'react'\nimport { useDocumentTools } from '@arbidocs/react/document-tools'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nexport function useImageCrop(\n documentId: string,\n fileName: string | null | undefined,\n imageBlob: Blob | null\n) {\n const { uploadDocument, onDocumentsChanged, openDocument } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n const [cropImageUrl, setCropImageUrl] = useState<string | null>(null)\n\n const handleOpenCrop = useCallback(() => {\n if (!imageBlob) return\n setCropImageUrl(URL.createObjectURL(imageBlob))\n }, [imageBlob])\n\n const closeCrop = useCallback(() => {\n setCropImageUrl((url) => {\n if (url) URL.revokeObjectURL(url)\n return null\n })\n }, [])\n\n const handleCropComplete = useCallback(\n async (result: { blob: Blob }) => {\n const baseName = (fileName || 'image').replace(/\\.[^.]+$/, '')\n const file = new File([result.blob], `${baseName} (cropped).png`, { type: 'image/png' })\n try {\n const response = await uploadDocument({\n file,\n query: { derived_from: [documentId], derived_role: 'crop' },\n })\n const newDocId = response?.doc_ext_ids?.[0]\n if (newDocId) {\n await onDocumentsChanged?.([newDocId], 'copy')\n openDocument?.(newDocId)\n }\n notify('Cropped image saved', 'success')\n } catch {\n notify('Failed to save the cropped image', 'error')\n } finally {\n closeCrop()\n }\n },\n [fileName, documentId, uploadDocument, onDocumentsChanged, openDocument, notify, closeCrop]\n )\n\n return { cropImageUrl, handleOpenCrop, closeCrop, handleCropComplete }\n}\n","/**\n * What the document viewer is looking at: the document record, the host's streaming / draft overlay,\n * the kind of content (artifact, live artifact, media, Word, sheet, ...) and whether it has parsed\n * text.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useDocument, useParsedDocument } from '@arbidocs/react'\nimport {\n artifactKindFromFileName,\n artifactKindFromMode,\n useArtifactSource,\n} from '@arbidocs/react/artifacts'\nimport { isAudioFile, isDownloadOnlyFile, isImageFile, isVideoFile } from '@arbidocs/react/ui'\nimport { savedDocumentIdFor } from '../../chat/open-document'\nimport { isDocumentLabel, summariseDocTags } from '../../files/doc-labels'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useConnectedTags } from '../workspaceData'\nimport { useDocumentViewerSupport } from './support'\n\nconst DOCX_EXTENSIONS = new Set(['.docx', '.doc'])\nconst XLSX_EXTENSIONS = new Set(['.xlsx', '.xls'])\nconst EMAIL_EXTENSIONS = new Set(['.eml', '.msg'])\n\n/** Lower-cased extension with its dot (`.pdf`), or `''`. */\nexport function fileExtension(fileName: string | null | undefined): string {\n if (!fileName) return ''\n return fileName.substring(fileName.lastIndexOf('.')).toLowerCase()\n}\n\nexport function useViewedDocument(documentId: string) {\n const support = useDocumentViewerSupport()\n // `.webm` is ambiguous by extension alone (audio-only recordings use the same container as\n // video). Resolved once the bytes are here; null = not yet, and the extension's guess stands.\n const [webmHasVideoTrack, setWebmHasVideoTrack] = useState<boolean | null>(null)\n useEffect(() => setWebmHasVideoTrack(null), [documentId])\n\n // An artifact being generated in a chat.\n const streamingDoc = support.streamingDocuments?.[documentId]\n const isStreaming = !!streamingDoc && !streamingDoc.isComplete\n // A draft the user started (blank document, voice note) with no backend record yet.\n const draftDoc = support.draftDocuments?.[documentId]\n const isDraft = !!draftDoc\n // A capture draft (photo/video/audio) is its recorder; a text draft opens in the Word editor.\n const isCaptureDraft =\n draftDoc?.kind === 'audio' || draftDoc?.kind === 'photo' || draftDoc?.kind === 'video'\n const isTextDraft = draftDoc?.kind === 'text'\n\n const { workspaceId, live } = useConnectedWorkspace()\n const { data: record } = useDocument(documentId, {\n enabled: live && !!workspaceId && !isStreaming && !isDraft,\n // A new version (Save version, a signed copy) is processed before its PDF exists: keep\n // re-reading until it is done, so the PDF tab and the signing tools come back on their own.\n pollWhileProcessing: true,\n })\n // A record of the previously viewed document is not this one.\n const documentData = record?.external_id === documentId ? record : undefined\n\n // Labels for the bar the PDF view carries (the text view derives its own).\n const { data: tags } = useConnectedTags()\n const labelSummaries = useMemo(\n () => summariseDocTags(documentData?.doctags ?? [], tags.filter(isDocumentLabel)),\n [documentData, tags]\n )\n\n // A document renders on the artifact path (Word editor or live preview, and Versions) rather\n // than the PDF path when (1) an artifact is streaming, (2) it is an artifact (AI drafts are\n // stored as .docx, html/react artifacts as .html/.jsx), or (3) it is an uploaded `*.md` (editing\n // and history are its own view; the PDF is a fallback).\n const fileName = documentData?.file_name\n const isMarkdown = fileExtension(fileName) === '.md'\n const isImage = isImageFile(fileName)\n const isWebmFile = fileExtension(fileName) === '.webm'\n // A resolved \"no video track\" wins over the extension's guess (always video for .webm).\n const isVideo = isWebmFile && webmHasVideoTrack === false ? false : isVideoFile(fileName)\n const isAudio = isWebmFile && webmHasVideoTrack === false ? true : isAudioFile(fileName)\n // Generated artifacts carried as a blob (image/audio/video) render in the media viewer.\n const isBlobArtifact =\n streamingDoc?.mode === 'image' ||\n (documentData?.wp_type === 'artifact' && (isImage || isVideo || isAudio))\n const isArtifact =\n (!!streamingDoc || isTextDraft || documentData?.wp_type === 'artifact' || isMarkdown) &&\n !isBlobArtifact\n // html/react artifacts render live in a sandbox; the streaming mode or the saved extension says.\n const liveKind = isArtifact\n ? (artifactKindFromMode(streamingDoc?.mode ?? undefined) ?? artifactKindFromFileName(fileName))\n : null\n\n // The saved document a chat drafts in while it is open here: a saved artifact or Word document.\n const savedDocumentId = savedDocumentIdFor({\n documentId,\n isDraft,\n isStreaming,\n isBlobArtifact,\n documentData,\n })\n\n // Parsed text is stripped of markup: a live artifact needs its stored source.\n const { data: liveSourceFetched } = useArtifactSource(\n documentId,\n !!liveKind && !streamingDoc && !!documentData && !isDraft\n )\n const liveSource = streamingDoc ? streamingDoc.content : (liveSourceFetched ?? '')\n\n // The text view exists whenever there is parsed content, for any file (a recording's\n // transcript too). `low-content` is a terminal status with indexed passages, just sparse.\n const hasParsedDocStatus =\n documentData?.status === 'completed' || documentData?.status === 'low-content'\n const { data: parsedDoc, isLoading: isParsedDocLoading } = useParsedDocument(\n documentId,\n 'final',\n {\n enabled:\n !!documentId && live && !isStreaming && !isDraft && !isBlobArtifact && hasParsedDocStatus,\n }\n )\n const hasParsedContent =\n ((parsedDoc as { chunks?: unknown[] } | undefined)?.chunks?.length ?? 0) > 0\n\n return {\n workspaceId,\n documentData,\n streamingDoc,\n isStreaming,\n draftDoc,\n isDraft,\n isCaptureDraft,\n isTextDraft,\n labelSummaries,\n isImage,\n isWebmFile,\n setWebmHasVideoTrack,\n isVideo,\n isAudio,\n isMedia: isVideo || isAudio,\n isBlobArtifact,\n savedDocumentId,\n isArtifact,\n liveKind,\n liveSource,\n isDocx: DOCX_EXTENSIONS.has(fileExtension(fileName)),\n isXlsx: XLSX_EXTENSIONS.has(fileExtension(fileName)),\n isEmail: EMAIL_EXTENSIONS.has(fileExtension(fileName)),\n isDownloadOnly: isDownloadOnlyFile(fileName),\n isParsedDocLoading,\n hasParsedContent,\n }\n}\n\nexport type ViewedDocument = ReturnType<typeof useViewedDocument>\n","/**\n * The bytes the document viewer shows: the PDF (or, for media, the stored file), with the host's\n * copy kept on the device when the network is down; the stored sheet; the `.webm` track probe; and\n * downloading the stored file.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { hasVideoTrack } from '@arbidocs/react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport {\n fetchDocumentFile,\n useDocumentBytes,\n useDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport { isAudioFile, isImageFile, isVideoFile } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useDocumentViewerSupport } from './support'\nimport type { ViewedDocument } from './useViewedDocument'\n\n/** `documentId` may be a version reference (`doc-…@v2`). */\nexport function useViewerBlobs(documentId: string, doc: ViewedDocument) {\n const { documentData, isArtifact, isDocx, isXlsx, isDownloadOnly, isWebmFile } = doc\n const { setWebmHasVideoTrack } = doc\n const { client, saveFile } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n const { loadOfflineCopy } = useDocumentViewerSupport()\n const currentVersion = documentData?.current_version ?? 1\n\n // Images, video and audio show the stored file; everything else its PDF.\n const name = documentData?.file_name\n const original = isImageFile(name) || isVideoFile(name) || isAudioFile(name)\n // The pinned offline copy is the current version's; an earlier version has none.\n const fallback =\n loadOfflineCopy && documentData && !parseVersionRef(documentId).version\n ? () => loadOfflineCopy(documentData)\n : undefined\n const pdf = useDocumentBytes(documentId, {\n version: currentVersion,\n kind: original ? 'original' : 'pdf',\n enabled:\n !isArtifact &&\n !!documentData &&\n !isDownloadOnly &&\n (!isDocx || documentData.status === 'completed' || documentData.status === 'low-content'),\n fallback,\n })\n // Keep the last bytes on screen while a new version of the same document loads; another\n // document (or version) starts empty, never showing the previous one's pages.\n const [pdfBlob, setPdfBlob] = useState<Blob | null>(null)\n useEffect(() => setPdfBlob(null), [documentId])\n useEffect(() => {\n if (pdf.data) setPdfBlob(pdf.data)\n }, [pdf.data])\n\n // Resolve the ambiguous .webm case once the bytes are here.\n useEffect(() => {\n if (!isWebmFile || !pdfBlob) return\n let cancelled = false\n void hasVideoTrack(pdfBlob).then((result) => {\n if (!cancelled) setWebmHasVideoTrack(result)\n })\n return () => {\n cancelled = true\n }\n }, [isWebmFile, pdfBlob, setWebmHasVideoTrack])\n\n // The stored sheet (all its sheets).\n const xlsx = useDocumentBytes(documentId, {\n version: currentVersion,\n kind: 'original',\n enabled: !isArtifact && !!documentData && isXlsx,\n })\n\n const handleDirectDownload = useCallback(async () => {\n try {\n saveFile(await fetchDocumentFile(client, documentId), documentData?.file_name || 'download')\n } catch {\n notify('Failed to download file', 'error')\n }\n }, [client, saveFile, notify, documentId, documentData?.file_name])\n\n return {\n pdfBlob,\n isPdfLoading: pdf.isLoading,\n pdfError: pdf.error,\n xlsxBlob: xlsx.data ?? null,\n xlsxError: xlsx.error,\n handleDirectDownload,\n }\n}\n","/**\n * Tabs of the document viewer: which tabs a document has, the automatic switches when the\n * document's type or parsed content changes, and switching (which ends a comparison when leaving\n * the tab that hosts it). The open tab is the session state's, so whatever opens a document can\n * open it on a tab.\n */\n\nimport { useEffect, useRef } from 'react'\nimport { Code, FileText, History, MonitorPlay } from 'lucide-react'\nimport { friendlyFileType } from '@arbidocs/react/ui'\nimport {\n AudIcon,\n DocIcon,\n EmlIcon,\n HtmlIcon,\n ImgIcon,\n PdfIcon,\n VidIcon,\n XlsIcon,\n useArbiSessionState,\n useArbiSessionStore,\n type ArbiViewerTab,\n} from '@arbidocs/react'\nimport type { ViewerTab } from '../../files/ViewerParts'\nimport { useIsPhone } from '../../lib/use-media-query'\nimport type { ViewedDocument } from './useViewedDocument'\n\n/**\n * @param hasHistory The document has earlier versions (a signed copy, a re-upload): PDF and text\n * documents then get a Versions tab too. Artifacts and Word documents always have one.\n */\nexport function useViewerTabs(doc: ViewedDocument, isCompact: boolean, hasHistory = false) {\n const {\n documentData,\n isArtifact,\n isDocx,\n isXlsx,\n isEmail,\n isVideo,\n isAudio,\n isImage,\n liveKind,\n hasParsedContent,\n isParsedDocLoading,\n } = doc\n const session = useArbiSessionStore()\n const {\n tab: activeTab,\n compareId,\n tabRequest,\n phonePdfChosen,\n } = useArbiSessionState((s) => s.documentViewer)\n const setActiveTab = (tab: ArbiViewerTab) => session.setDocumentViewer({ tab })\n // A plain-text file is still shown as a generated PDF, but the tab names the file the user\n // opened (\"Text\", as the Fields panel does), not the rendering format.\n const isTextFile = friendlyFileType(documentData?.file_type, documentData?.file_name) === 'Text'\n const isPhone = useIsPhone()\n const phoneDefaultDecidedFor = useRef<string | null>(null)\n\n // Switch to the tab that fits the document type. Only on type changes: never over the user's own\n // choice. Keyed on the document and its kind, not on the record: a refreshed record (a new\n // version finishing processing) must not send a user on the PDF tab of a Word document back to\n // the editor.\n const hasDocumentData = !!documentData\n const documentKey = documentData?.external_id\n useEffect(() => {\n // A Word artifact (an AI draft, stored as .docx) has one Word tab, 'edit', not a DOCX tab.\n if (isArtifact && (activeTab === 'pdf' || (!liveKind && activeTab === 'docx'))) {\n setActiveTab(liveKind ? 'preview' : 'edit')\n } else if (isDocx && activeTab === 'pdf') {\n setActiveTab('docx')\n } else if (!liveKind && activeTab === 'preview') {\n setActiveTab(isArtifact ? 'edit' : 'pdf')\n } else if (!isArtifact && documentData && activeTab === 'edit') {\n setActiveTab(isDocx ? 'docx' : isXlsx ? 'xlsx' : 'pdf')\n } else if (\n !isArtifact &&\n !isDocx &&\n !isXlsx &&\n documentData &&\n (activeTab === 'docx' || activeTab === 'xlsx')\n ) {\n setActiveTab('pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hasDocumentData, documentKey, isArtifact, isDocx, isXlsx, liveKind])\n\n // A tab asked for when the document was opened (a signature request opens on the PDF, where it\n // is signed) wins over the type's own tab once that document has loaded, and over the phone's\n // text default. Declared after the type switch above so it has the last word.\n useEffect(() => {\n if (!tabRequest || !documentKey || tabRequest.documentId !== documentKey) return\n phoneDefaultDecidedFor.current = documentKey\n session.setDocumentViewer({ tabRequest: null, tab: tabRequest.tab })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentKey, tabRequest])\n\n // Versions of a PDF or text document exist only with history: leave the tab when there is none\n // (another document opened while it was active).\n const hasVersionsTab = isArtifact || isDocx || hasHistory\n useEffect(() => {\n if (activeTab === 'versions' && documentData && !hasVersionsTab) {\n setActiveTab(isXlsx ? 'xlsx' : 'pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, documentData, hasVersionsTab])\n\n // The text tab exists only with parsed content. When it is open without any (a recording with\n // no transcript, a failed parse), fall back to the natural default once the parsed query\n // settles. Not during a comparison, which uses the text tab. Waits for the record: until it is\n // here the parsed query has not started, so it is not loading yet.\n useEffect(() => {\n if (\n activeTab === 'html' &&\n documentData !== undefined &&\n !isParsedDocLoading &&\n !hasParsedContent &&\n !compareId\n ) {\n setActiveTab(isArtifact ? 'edit' : isDocx ? 'docx' : isXlsx ? 'xlsx' : 'pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n activeTab,\n documentData,\n isParsedDocLoading,\n hasParsedContent,\n compareId,\n isArtifact,\n isDocx,\n isXlsx,\n ])\n\n // Phones open a document on the readable reflowed (text) view: a fit-width PDF on a 390px\n // screen is footnote-sized. Decided once per document, after the parsed query settles, and only\n // over the PDF default (Word, sheets, artifacts and media keep their own tab). A PDF the user\n // picked by hand this session wins.\n useEffect(() => {\n if (!isPhone || !documentKey || isParsedDocLoading) return\n if (phoneDefaultDecidedFor.current === documentKey) return\n phoneDefaultDecidedFor.current = documentKey\n const opensOnPdf =\n !isArtifact && !isDocx && !isXlsx && !isVideo && !isAudio && !isImage && !isEmail\n if (opensOnPdf && hasParsedContent && !compareId && !phonePdfChosen && activeTab === 'pdf') {\n setActiveTab('html')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isPhone, documentKey, isParsedDocLoading, hasParsedContent])\n\n const handleTabChange = (tabId: string) => {\n // A comparison is shown on the text tab: leaving it ends the comparison.\n const change: Parameters<typeof session.setDocumentViewer>[0] = { tab: tabId as ArbiViewerTab }\n if (tabId !== 'html' && compareId) change.compareId = null\n // A phone user who goes back to the PDF wants it: stop opening documents on the text view\n // until they pick it again.\n if (isPhone && (tabId === 'pdf' || tabId === 'html')) change.phonePdfChosen = tabId === 'pdf'\n session.setDocumentViewer(change)\n }\n\n const mediaTab = isVideo\n ? { icon: <VidIcon size={20} />, tooltip: 'Video' }\n : isAudio\n ? { icon: <AudIcon size={20} />, tooltip: 'Audio' }\n : isImage\n ? { icon: <ImgIcon size={20} />, tooltip: 'Image' }\n : isEmail\n ? { icon: <EmlIcon size={20} />, tooltip: 'Email' }\n : isTextFile\n ? { icon: <FileText className=\"size-5\" />, tooltip: 'Text' }\n : documentData\n ? { icon: <PdfIcon size={20} />, tooltip: 'PDF' }\n : // The file type is unknown until the record loads: name no guess (a text file\n // would flip from PDF to Text once it arrives).\n { icon: <FileText className=\"size-5\" />, tooltip: 'Document' }\n // Tabs say what they are: in a narrow panel or on a phone only the open tab keeps its name, plus\n // the text view, whose icon is not recognisable. Labelling every tab there would crowd the header.\n const tabLabel = (id: string, label: string) =>\n !isCompact || activeTab === id || id === 'html' ? label : undefined\n\n const versionsTab: ViewerTab = {\n id: 'versions',\n icon: <History className=\"size-5\" />,\n tooltip: 'Versions',\n label: tabLabel('versions', 'Versions'),\n }\n const viewerTabs: ViewerTab[] = [\n ...(isArtifact\n ? [\n ...(liveKind\n ? [\n {\n id: 'preview',\n icon: <MonitorPlay className=\"size-5\" />,\n tooltip: 'Preview',\n label: tabLabel('preview', 'Preview'),\n },\n ]\n : []),\n {\n id: 'edit',\n icon: liveKind ? <Code className=\"size-5\" /> : <FileText className=\"size-5\" />,\n tooltip: liveKind ? 'Code' : 'Editor',\n label: tabLabel('edit', liveKind ? 'Code' : 'Document'),\n },\n versionsTab,\n ]\n : [\n ...(isDocx\n ? [\n {\n id: 'docx',\n icon: <DocIcon size={20} />,\n tooltip: 'DOCX (with track changes & comments)',\n label: tabLabel('docx', 'DOCX'),\n },\n ]\n : []),\n ...(isXlsx\n ? [\n {\n id: 'xlsx',\n icon: <XlsIcon size={20} />,\n tooltip: 'Spreadsheet',\n label: tabLabel('xlsx', 'Sheet'),\n },\n ]\n : []),\n { id: 'pdf', ...mediaTab, label: tabLabel('pdf', mediaTab.tooltip) },\n ...(hasVersionsTab ? [versionsTab] : []),\n ]),\n ...((hasParsedContent || compareId) && !liveKind\n ? [\n {\n id: 'html',\n icon: compareId ? <FileText className=\"size-5\" /> : <HtmlIcon size={20} />,\n tooltip: compareId ? 'Word redline' : 'HTML',\n label: tabLabel('html', compareId ? 'Compare' : 'HTML'),\n },\n ]\n : []),\n ]\n\n return { activeTab, handleTabChange, viewerTabs }\n}\n","/**\n * A document's versions (oldest first; every row's `id` is a version reference) and its\n * translations (each its own document, made from one of its versions). A listed document carries\n * its versions, so it costs no request; one that is not in the workspace list asks for them.\n */\n\nimport { useMemo } from 'react'\nimport { useDocumentVersionList } from '@arbidocs/react'\nimport {\n documentVersions,\n parseVersionRef,\n toArtifactVersions,\n type ArtifactVersion,\n} from '@arbidocs/react/artifacts'\nimport type { TranslationEntry } from '../../artifacts/VersionTimeline'\nimport { useConnectedDocuments } from '../workspaceData'\n\nexport function useViewerVersions(docId: string | null | undefined): {\n versions: ArtifactVersion[]\n translations: TranslationEntry[]\n} {\n const plainId = docId ? parseVersionRef(docId).docId : ''\n const { data: documents } = useConnectedDocuments()\n const listed = useMemo(\n () => (plainId ? documents.find((d) => d.external_id === plainId) : undefined),\n [documents, plainId]\n )\n const { data: history } = useDocumentVersionList(plainId, { enabled: !!plainId && !listed })\n const versions = useMemo(\n () => (listed ? documentVersions(listed) : toArtifactVersions(plainId || null, history)),\n [listed, history, plainId]\n )\n // A translation is its own document (with its own versions), never a version of the source, so\n // opening the source always opens the source.\n const translations = useMemo<TranslationEntry[]>(() => {\n if (!plainId) return []\n return documents\n .flatMap((doc) => {\n const link = doc.derived_from?.find(\n (d) => d.role === 'translation' && d.doc_ext_id === plainId\n )\n return link\n ? [\n {\n id: doc.external_id,\n name: doc.doc_metadata?.title || doc.file_name || doc.external_id,\n createdAt: doc.created_at,\n sourceVersion: link.version ?? null,\n final: !!doc.derived_from?.some((d) => d.role === 'final'),\n },\n ]\n : []\n })\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt))\n }, [documents, plainId])\n return { versions, translations }\n}\n","/**\n * The PDF (or media) body of the document viewer: loading and failure states, the image, audio and\n * video players, and the PDF with its tools — the markup layer, signature placement, a signature\n * request being prepared or signed.\n */\n\nimport { lazy, Suspense, useCallback } from 'react'\nimport { useArbiSessionState, useArbiSessionStore } from '@arbidocs/react'\nimport type {\n SignatureAppearance,\n SignatureRequest,\n useDocumentMarkup,\n} from '@arbidocs/react/document-tools'\nimport {\n AudioViewer,\n ImageViewer,\n PdfViewer as KitPdfViewer,\n VideoViewer,\n type PdfViewerProps,\n} from '@arbidocs/react/viewers'\nimport { friendlyFileType } from '@arbidocs/react/ui'\nimport { ViewerLoadError, ViewerMessage, ViewerPreviewUnavailable } from '../../files'\nimport { useDocumentViewerSupport } from './support'\nimport { fileExtension, type ViewedDocument } from './useViewedDocument'\n\n// The markup viewer brings in pdf-lib, which nothing else needs: load it only when it is shown.\nconst AnnotatedPdfViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.AnnotatedPdfViewer }))\n)\nconst SignaturePlacementViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.SignaturePlacementViewer }))\n)\n// Signature requests: placing fields for signers, and a signer's guided signing.\nconst SignatureRequestEditor = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.SignatureRequestEditor }))\n)\nconst GuidedSigningViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.GuidedSigningViewer }))\n)\n\n/** A signature request: the author placing fields, or a signer walked through theirs. */\nexport type SignatureFlow =\n { kind: 'prepare'; draft?: SignatureRequest } | { kind: 'sign'; request: SignatureRequest } | null\n\n/**\n * The kit PDF viewer, reporting the page read into the session state; in a detached window its\n * pages render without the opener's web fonts (canvas text in another document cannot use them).\n */\nexport function SessionPdfViewer(props: Omit<PdfViewerProps, 'onPageChange' | 'disableFontFace'>) {\n const session = useArbiSessionStore()\n const viewingId = useArbiSessionState((s) => s.viewingDocument?.id)\n const { isDetached } = useDocumentViewerSupport()\n const onPageChange = useCallback(\n (page: number) => {\n if (viewingId) session.setViewingDocument({ id: viewingId, page })\n },\n [session, viewingId]\n )\n return <KitPdfViewer {...props} onPageChange={onPageChange} disableFontFace={!!isDetached} />\n}\n\nexport interface ViewerPdfPaneProps {\n documentId: string\n doc: ViewedDocument\n pdfBlob: Blob | null\n isPdfLoading: boolean\n pdfError: unknown\n onDownload: () => void\n viewerProps: {\n currentPage: number | undefined\n onLoadSuccess: (pages: number) => void\n scrollTrigger: number\n zoom: number\n onZoomChange: (zoom: number) => void\n }\n signatureFlow: SignatureFlow\n onSignatureFlow: (flow: SignatureFlow) => void\n currentUserId: string | undefined\n placingSignature: boolean\n onPlacingDone: (appearance?: SignatureAppearance) => void\n annotating: boolean\n markup: ReturnType<typeof useDocumentMarkup>\n pdfSnapshotNumber: number | undefined\n isSigned: boolean\n}\n\nexport function ViewerPdfPane({\n documentId,\n doc,\n pdfBlob,\n isPdfLoading,\n pdfError,\n onDownload,\n viewerProps,\n signatureFlow,\n onSignatureFlow,\n currentUserId,\n placingSignature,\n onPlacingDone,\n annotating,\n markup,\n pdfSnapshotNumber,\n isSigned,\n}: ViewerPdfPaneProps) {\n const { documentData, isDownloadOnly, isVideo, isAudio, isImage, isDocx } = doc\n const showMarkup = markup.hasMarkup && !markup.showOriginal\n\n // Files that cannot be previewed in the browser: the download, at once.\n if (isDownloadOnly) {\n return (\n <ViewerPreviewUnavailable\n extension={fileExtension(documentData?.file_name)}\n onDownload={onDownload}\n />\n )\n }\n\n // Text files are rendered to a PDF too, so name what the user opened, not the rendering.\n const loadingLabel = isVideo\n ? 'Loading video...'\n : isAudio\n ? 'Loading audio...'\n : isImage\n ? 'Loading image...'\n : !documentData\n ? 'Loading document...'\n : friendlyFileType(documentData.file_type, documentData.file_name) === 'Text'\n ? 'Loading text...'\n : 'Loading PDF...'\n const errorLabel = isVideo\n ? 'Failed to load video'\n : isAudio\n ? 'Failed to load audio'\n : isImage\n ? 'Failed to load image'\n : 'Failed to load PDF'\n\n if (\n isDocx &&\n documentData &&\n !['completed', 'low-content', 'failed'].includes(documentData.status || '')\n ) {\n return (\n <ViewerMessage>\n PDF and search indexing are processing. Open the DOCX tab to edit now.\n </ViewerMessage>\n )\n }\n if (isPdfLoading) return <ViewerMessage>{loadingLabel}</ViewerMessage>\n if (pdfError) {\n return (\n <ViewerLoadError\n message={\n isVideo || isAudio || isImage\n ? `${errorLabel} — download it instead.`\n : \"Couldn't display the PDF — download it instead.\"\n }\n onDownload={onDownload}\n />\n )\n }\n // Nothing is fetched yet: the PDF is read once the document record has loaded, so the viewer\n // would otherwise sit empty for that first stretch.\n if (!pdfBlob) return <ViewerMessage>{loadingLabel}</ViewerMessage>\n\n if (isVideo) return <VideoViewer blob={pdfBlob} title={documentData?.file_name || 'Video'} />\n if (isAudio) return <AudioViewer blob={pdfBlob} title={documentData?.file_name || 'Audio'} />\n if (isImage) {\n return <ImageViewer blob={pdfBlob} alt={documentData?.file_name || 'Document image'} />\n }\n if (signatureFlow?.kind === 'prepare') {\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <SignatureRequestEditor\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n version={documentData?.current_version ?? undefined}\n draft={signatureFlow.draft}\n viewer={SessionPdfViewer}\n onCancel={() => onSignatureFlow(null)}\n onSaved={() => onSignatureFlow(null)}\n />\n </Suspense>\n )\n }\n if (signatureFlow?.kind === 'sign' && currentUserId) {\n const { currentPage: _page, scrollTrigger: _trigger, ...guidedProps } = viewerProps\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <GuidedSigningViewer\n {...guidedProps}\n file={pdfBlob}\n request={signatureFlow.request}\n signer={currentUserId}\n viewer={SessionPdfViewer}\n onClose={() => onSignatureFlow(null)}\n onSigned={() => onSignatureFlow(null)}\n />\n </Suspense>\n )\n }\n if (placingSignature) {\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <SignaturePlacementViewer\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n viewer={SessionPdfViewer}\n onCancel={() => onPlacingDone()}\n onContinue={(appearance) => onPlacingDone(appearance)}\n />\n </Suspense>\n )\n }\n // Annotate mode, or the markup as the reading view: one viewer, so leaving annotate mode keeps\n // (and saves) what was just drawn.\n if (annotating || showMarkup) {\n return (\n <Suspense\n fallback={\n <ViewerMessage>\n {annotating ? 'Loading annotation tools…' : 'Loading markup…'}\n </ViewerMessage>\n }\n >\n <AnnotatedPdfViewer\n key={`${documentId}@${pdfSnapshotNumber ?? 'current'}`}\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n version={pdfSnapshotNumber}\n editing={annotating}\n onMarkupChange={markup.onMarkupChange}\n fileName={documentData?.file_name}\n shared={documentData?.shared ?? false}\n folder={documentData?.folder}\n viewer={SessionPdfViewer}\n signed={isSigned}\n />\n </Suspense>\n )\n }\n return <SessionPdfViewer {...viewerProps} file={pdfBlob} />\n}\n","/**\n * The whole document viewer on the signed-in session: a document (or one of its versions, read\n * only) as its PDF, its text, the Word editor, a sheet, an image, a recording or a live artifact;\n * its versions and comparisons; markup, signing and signature requests; sharing, Email, Translate\n * and Finalise. Runs under any host (`useConnectedWorkspace`): the open document, tab and comparison\n * are the session state's, navigation the `BlocksEnvironment`'s, and what only the host knows comes\n * through `DocumentViewerSupportProvider`.\n */\n\nimport { lazy, Suspense, useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { Languages, Mail, MessageSquare } from 'lucide-react'\nimport {\n DEFAULT_ASPECT_OPTIONS,\n ImageCropModal,\n useArbi,\n useArbiSessionState,\n useArbiSessionStore,\n} from '@arbidocs/react'\nimport { findVersion, parseVersionRef, versionLabel } from '@arbidocs/react/artifacts'\nimport {\n SIGNED_LOCKED_REASON,\n canAnnotate,\n useDocumentMarkup,\n useDocumentSignatures,\n useDocumentTools,\n type SignatureAppearance,\n} from '@arbidocs/react/document-tools'\nimport { XlsxViewer, cycleZoom } from '@arbidocs/react/viewers'\nimport { Button, getEntityLabel } from '@arbidocs/react/ui'\nimport {\n ArtifactCodeView,\n ArtifactCompareBar,\n ArtifactPreview,\n VersionTimeline,\n} from '../../artifacts'\nimport { useRegisterOpenDocument } from '../../chat/open-document'\nimport { ShareControl } from '../../collaboration/sharing/ShareControl'\nimport {\n AnnotateButton,\n DownloadMarkupButton,\n MarkupNotices,\n MarkupViewNote,\n RequestSignaturesButton,\n ShowOriginalButton,\n SignButton,\n SignDocumentDialog,\n SignedEditNote,\n SignatureRequestBanner,\n SignatureStatus,\n VersionSnapshotBar,\n} from '../../document-tools'\nimport {\n DocumentLabelBar,\n PdfPageNav,\n ViewerControlBar,\n ViewerFrame,\n ViewerHeaderEnd,\n ViewerHeaderStart,\n ViewerImageActions,\n ViewerMessage,\n ViewerPageCounter,\n ViewerPane,\n ViewerStatusNote,\n ViewerTabBar,\n ViewerTitle,\n ViewerZoomControl,\n} from '../../files'\nimport { fmtDate } from '../../lib/format'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { TabHeader } from '../../shell'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useConnectedConversations } from '../workspaceData'\nimport { ConnectedDocumentToolsProvider } from './ConnectedDocumentToolsProvider'\nimport { FinaliseTranslationButton } from './FinaliseTranslationButton'\nimport { useDocumentViewerSupport } from './support'\nimport { useImageCrop } from './useImageCrop'\nimport { useViewedDocument } from './useViewedDocument'\nimport { useViewerBlobs } from './useViewerBlobs'\nimport { useViewerTabs } from './useViewerTabs'\nimport { useViewerVersions } from './useViewerVersions'\nimport { ViewerPdfPane, type SignatureFlow } from './ViewerPdfPane'\n\n// The Word editor loads only when a Word document is shown.\nconst NativeDocxEditor = lazy(() =>\n import('../docx/ConnectedNativeDocxEditor').then((m) => ({\n default: m.ConnectedNativeDocxEditor,\n }))\n)\nconst StreamedWordArtifact = lazy(() =>\n import('../docx/ConnectedStreamedWordArtifact').then((m) => ({\n default: m.ConnectedStreamedWordArtifact,\n }))\n)\nconst NativeDocxComparison = lazy(() =>\n import('../docx/ConnectedNativeDocxComparison').then((m) => ({\n default: m.ConnectedNativeDocxComparison,\n }))\n)\n\nconst UPLOADED_NO_VERSIONS =\n 'No earlier versions yet. Replacing, editing or signing this file adds a new version here.'\n\nexport interface ConnectedDocumentViewerProps {\n /**\n * The document, or a version reference `doc-…@v{n}` (a citation, a \"made from v2\" link): an\n * earlier version opens read-only. Default: the session state's viewing document.\n */\n documentId?: string\n /** Controls at the right end of the header (a panel's dock / pop-out switcher). */\n headerActions?: ReactNode\n /** Where html/react artifacts load their sandbox runtime from. */\n artifactRuntimeUrl?: string\n}\n\n/** Whether the user may change who sees the document: its creator, or an agent's work. */\nfunction canChangeVisibility(\n doc: { created_by_ext_id?: string | null } | null | undefined,\n userId: string | undefined\n): boolean {\n if (!doc || !userId) return false\n return (\n userId.startsWith('agt-') ||\n (doc.created_by_ext_id?.startsWith('agt-') ?? false) ||\n doc.created_by_ext_id === userId\n )\n}\n\nexport function ConnectedDocumentViewer(props: ConnectedDocumentViewerProps) {\n const viewing = useArbiSessionState((s) => s.viewingDocument?.id)\n const openedId = props.documentId ?? viewing\n if (!openedId) return null\n return (\n <ConnectedDocumentToolsProvider>\n <DocumentViewerContent {...props} openedId={openedId} />\n </ConnectedDocumentToolsProvider>\n )\n}\n\nfunction DocumentViewerContent({\n openedId,\n headerActions,\n artifactRuntimeUrl = '/artifact-runtime/',\n}: ConnectedDocumentViewerProps & { openedId: string }) {\n const arbi = useArbi()\n const session = useArbiSessionStore()\n const support = useDocumentViewerSupport()\n const formatDate = support.formatDate ?? fmtDate\n const tools = useDocumentTools()\n const { openConversation, notify } = useBlocksEnvironment()\n const { userId: currentUserId } = useConnectedWorkspace()\n // A document keeps one id for its whole life; its versions are inside it.\n const documentId = parseVersionRef(openedId).docId\n const [totalPages, setTotalPages] = useState<number>(0)\n const [isCompact, setIsCompact] = useState(false)\n // Zoom of the PDF (canvas scale) / text, as a multiplier of fit width; pinch, double-tap and the\n // zoom button all drive it. The text view's size is a reading preference for every document.\n const [pdfZoom, setPdfZoom] = useState(1)\n const {\n tab: zoomTab,\n textScale,\n compareId: compareDocumentId,\n } = useArbiSessionState((s) => s.documentViewer)\n const zoom = zoomTab === 'html' ? textScale : pdfZoom\n const setZoom = useCallback(\n (next: number | ((z: number) => number)) => {\n const value = typeof next === 'function' ? next(zoom) : next\n if (zoomTab === 'html') session.setDocumentViewer({ textScale: value })\n else setPdfZoom(value)\n },\n [zoomTab, session, zoom]\n )\n const [scrollTrigger, setScrollTrigger] = useState(0) // Incremented to scroll the viewers\n const containerRef = useRef<HTMLDivElement>(null)\n\n const viewingDocumentPage = useArbiSessionState((s) => s.viewingDocument?.page ?? null)\n const setViewingDocumentPage = (page: number) =>\n session.setViewingDocument({ id: openedId, page })\n const setViewingDocumentId = (id: string) => session.setViewingDocument({ id })\n const setActiveTab = (tab: Parameters<typeof session.setDocumentViewer>[0]['tab']) =>\n session.setDocumentViewer({ tab })\n const setCompareDocumentId = (id: string | null) => session.setDocumentViewer({ compareId: id })\n const { data: conversations } = useConnectedConversations()\n\n // An earlier version opened read-only (`doc-…@v{n}`) from the Versions tab, a citation or a\n // \"made from\" link. Word documents show it in the Word editor, artifacts in theirs, everything\n // else as its PDF. The version on screen is the session's viewing id, not local state: the\n // viewer remounts when its panel moves to a new window, and the version must come along.\n const snapshotRef = parseVersionRef(openedId).version ? openedId : null\n // Every version of the document, oldest first. Every version of an artifact shares one name, so\n // both sides of a comparison get the timeline's \"v1/v2/v3\" label.\n const { versions, translations } = useViewerVersions(documentId)\n const currentVersionId = versions.find((v) => v.isCurrent)?.id ?? documentId\n // Opening the current version is the live document itself, not a read-only copy of it.\n const snapshotDocumentId = snapshotRef && snapshotRef !== currentVersionId ? snapshotRef : null\n const doc = useViewedDocument(documentId)\n const setSnapshotDocumentId = (ref: string | null) => setViewingDocumentId(ref ?? documentId)\n // Drafting mode: the chat drafts in the open document, also while an earlier version of it is on\n // screen; a turn sent then brings the live document back, where the assistant's edits appear.\n useRegisterOpenDocument({\n documentId: doc.savedDocumentId,\n shownId: openedId,\n showLive: () => setViewingDocumentId(documentId),\n workspaceId: doc.workspaceId,\n })\n const {\n documentData,\n streamingDoc,\n isStreaming,\n draftDoc,\n isDraft,\n isCaptureDraft,\n labelSummaries,\n isImage,\n isVideo,\n isAudio,\n isMedia,\n isArtifact,\n liveKind,\n liveSource,\n isDocx,\n isXlsx,\n isDownloadOnly,\n } = doc\n // A thread by its title, for the threads a document (and each version) was made in.\n const threadTitle = (id: string) =>\n conversations.find((c) => c.external_id === id)?.title?.trim() || 'Its thread'\n // The thread a generated document was made in (none for an upload).\n const madeInId = documentData?.conversation_ext_id ?? null\n const madeIn = madeInId ? { id: madeInId, title: threadTitle(madeInId) } : null\n const pdfSnapshotId = snapshotDocumentId && !isDocx && !isArtifact ? snapshotDocumentId : null\n // The document on screen: an earlier version when one is open, else the current one.\n const shownDocumentId = pdfSnapshotId || documentId\n const blobs = useViewerBlobs(shownDocumentId, doc)\n const { pdfBlob, xlsxBlob, xlsxError, handleDirectDownload } = blobs\n // Annotation mode for the PDF view; off for every newly opened document.\n const [annotating, setAnnotating] = useState(false)\n useEffect(() => setAnnotating(false), [documentId])\n // Translations are listed with the versions (each is its own document), so they open the tab too.\n const hasHistory =\n versions.length > 1 || (documentData?.current_version ?? 1) > 1 || translations.length > 0\n const { activeTab, handleTabChange, viewerTabs } = useViewerTabs(doc, isCompact, hasHistory)\n const crop = useImageCrop(documentId, documentData?.file_name, pdfBlob)\n // Signing: choose where the signature goes (placing), then the Sign dialog.\n const [placingSignature, setPlacingSignature] = useState(false)\n const [signAppearance, setSignAppearance] = useState<SignatureAppearance | undefined>()\n const [isSignOpen, setIsSignOpen] = useState(false)\n // Leaving the placement when another version opens or returns: it belongs to the copy on screen.\n useEffect(() => setPlacingSignature(false), [documentId, snapshotDocumentId])\n // A signature request: the author placing fields ('prepare'), or a signer walked through theirs.\n const [signatureFlow, setSignatureFlow] = useState<SignatureFlow>(null)\n useEffect(() => setSignatureFlow(null), [documentId, snapshotDocumentId])\n const { data: signatureStatus } = useDocumentSignatures(shownDocumentId, !isDraft && !liveKind)\n\n // The Word editor on the current version: the editor's own ribbon says \"Co-edit mode\", so the\n // header carries no version label and, when narrow, no title row above the ribbon.\n const isCoEditing =\n !snapshotDocumentId &&\n !compareDocumentId &&\n !isDraft &&\n ((activeTab === 'docx' && isDocx) ||\n (activeTab === 'edit' && isArtifact && !liveKind && !isStreaming))\n const currentVersionLabel = isCoEditing\n ? undefined\n : !snapshotDocumentId && !compareDocumentId && (isDocx || (isArtifact && !liveKind))\n ? 'Live'\n : versionLabel(versions, snapshotDocumentId || documentId)\n const compareVersionLabel = versionLabel(versions, compareDocumentId)\n const snapshotNumber = findVersion(versions, snapshotDocumentId)?.number\n // The markup of the version on screen: the default view when it has any (\"Show original\" hides).\n const pdfSnapshotNumber = pdfSnapshotId ? snapshotNumber : undefined\n // A signed version is locked: only a further signature changes it. Its marks stay in the markup\n // layer (never in its PDF), and editing its content saves a new, unsigned version.\n const isSigned = !!signatureStatus?.signed\n const markup = useDocumentMarkup(documentData, pdfSnapshotNumber, isSigned)\n\n // Detect container width changes (640px = the sm: breakpoint).\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) setIsCompact(entry.contentRect.width < 640)\n })\n resizeObserver.observe(container)\n return () => resizeObserver.disconnect()\n }, [])\n\n const handleLoadSuccess = useCallback((numPages: number) => setTotalPages(numPages), [])\n\n // Go to a page: the counter, or one step from the arrows.\n const goToPage = (page: number) => {\n setViewingDocumentPage(page)\n setScrollTrigger((prev) => prev + 1)\n }\n const stepPage = (delta: number) => {\n const next = (viewingDocumentPage || 1) + delta\n if (next >= 1 && next <= totalPages) goToPage(next)\n }\n\n const documentTitle =\n streamingDoc?.title ||\n draftDoc?.title ||\n documentData?.doc_metadata?.title ||\n documentData?.file_name ||\n 'Document'\n\n // The page / zoom controls, shared by the PDF and the text view. They sit in the control bar\n // under the body, so they never cover the text being read.\n const pageNav = totalPages > 0 && (\n <>\n <ViewerZoomControl zoom={zoom} onCycle={() => setZoom(cycleZoom(zoom))} />\n <PdfPageNav\n canPrev={(viewingDocumentPage || 1) > 1}\n canNext={(viewingDocumentPage || 1) < totalPages}\n onPrev={() => stepPage(-1)}\n onNext={() => stepPage(1)}\n counter={\n <ViewerPageCounter page={viewingDocumentPage || 1} total={totalPages} onGoTo={goToPage} />\n }\n />\n </>\n )\n\n // Compare: a \"Compare vs. [doc]\" row of its own below the tab/title bar (a docked panel is\n // narrow), with the flip-direction arrow and the way out.\n const isComparing = !!compareDocumentId\n const compareTarget = compareDocumentId ? parseVersionRef(compareDocumentId).docId : null\n const compareIndicator = isComparing && compareTarget && (\n <ArtifactCompareBar\n compareTarget={support.renderDocumentPill?.(compareTarget) ?? compareTarget}\n versionLabel={compareVersionLabel}\n mode=\"flip\"\n showTrackChanges={false}\n onToggleTrackChanges={() => {}}\n onFlip={() => {\n setViewingDocumentId(compareDocumentId!)\n setCompareDocumentId(documentId)\n }}\n onStop={() => setCompareDocumentId(null)}\n />\n )\n\n // Document name block: the name, related documents and status notes. Roomy headers keep it on\n // the tab row; a narrow (phone / docked) header gives it a row of its own so the name is never\n // cut down to a couple of letters by the tabs and actions.\n const titleBlock = (\n <>\n {/* A draft gets an editable name + auto-name toggle instead of the plain read-only name. */}\n {isDraft ? (\n support.renderDraftTitle?.(documentId)\n ) : (\n <ViewerTitle\n title={documentTitle}\n versionLabel={currentVersionLabel}\n shrink={!!liveKind || isCompact}\n />\n )}\n {/* The narrow header's Share is icon-only, so the state is spelled out here as text. */}\n {isCompact && !isDraft && documentData?.shared && (\n <ViewerStatusNote testId=\"document-shared-status\">\n Shared with the workspace\n </ViewerStatusNote>\n )}\n {/* Likewise \"Show original\" is a bare page icon there: say which view is on screen. */}\n {isCompact &&\n activeTab === 'pdf' &&\n pdfBlob &&\n markup.hasMarkup &&\n !annotating &&\n !placingSignature && (\n <MarkupViewNote\n showOriginal={markup.showOriginal}\n onToggle={() => markup.setShowOriginal((on) => !on)}\n />\n )}\n {/* Related documents, except during a comparison (its own row says which). */}\n {!isComparing && !liveKind && documentData && support.renderRelated?.(documentData)}\n {isStreaming && <ViewerStatusNote pulse>streaming...</ViewerStatusNote>}\n {/* Nothing is generating: this document simply does not exist on the backend yet. */}\n {isDraft && (\n <ViewerStatusNote testId=\"draft-unsaved-indicator\">Draft — not saved</ViewerStatusNote>\n )}\n {signatureStatus?.signed && (\n <SignatureStatus status={signatureStatus} formatDate={formatDate} />\n )}\n </>\n )\n\n const leftContent = (\n <ViewerHeaderStart>\n {isDraft ? (\n // A draft's kind replaces the tabs: neither Versions nor the text view means anything\n // before the first save.\n support.renderDraftKind?.(documentId)\n ) : (\n <ViewerTabBar tabs={viewerTabs} activeId={activeTab} onChange={handleTabChange} />\n )}\n {!isCompact && titleBlock}\n </ViewerHeaderStart>\n )\n\n const annotatable = canAnnotate({\n activeTab,\n hasPdf: !!pdfBlob,\n isImage,\n isVideo,\n isAudio,\n isDownloadOnly,\n isDraft,\n isStreaming,\n isSnapshot: !!snapshotDocumentId,\n isComparing,\n })\n\n // A request waiting for this user's signature, or their own in flight: shown over the PDF and\n // the Word editor alike; signing happens on the PDF.\n const signatureBanner = !isDraft && !liveKind && !snapshotDocumentId && (\n <SignatureRequestBanner\n documentId={documentId}\n hidden={!!signatureFlow}\n onSign={(request) => {\n setAnnotating(false)\n setPlacingSignature(false)\n if (activeTab !== 'pdf') handleTabChange('pdf')\n setSignatureFlow({ kind: 'sign', request })\n }}\n onEditDraft={(draft) => {\n if (activeTab !== 'pdf') handleTabChange('pdf')\n setSignatureFlow({ kind: 'prepare', draft })\n }}\n />\n )\n\n const share = () => {\n const name = (liveKind ? documentTitle : documentData?.file_name) || undefined\n if (support.share) {\n support.share({ id: documentId, name, isPrivate: !documentData?.shared })\n return\n }\n void arbi.documents\n .update([{ external_id: documentId, shared: !documentData?.shared }])\n .then(() => tools.onDocumentsChanged?.([documentId], 'markup'))\n .catch(() => notify(\"Couldn't change who can see this document\", 'error'))\n }\n const shownRef = snapshotDocumentId || documentId\n\n const rightContent = (\n <ViewerHeaderEnd isCompact={isCompact}>\n {/* Annotate: only for a PDF on screen (text and Word files are shown as a PDF too). Marks\n sit in a layer beside the document; Freeze saves a separate copy with them built in. */}\n {annotatable && (\n <AnnotateButton\n active={annotating}\n compact={isCompact}\n onClick={() => {\n setPlacingSignature(false)\n markup.setShowOriginal(false)\n setAnnotating((on) => !on)\n }}\n />\n )}\n {/* The markup is the default view; \"Show original\" shows the untouched file. */}\n {activeTab === 'pdf' && pdfBlob && !placingSignature && (markup.hasMarkup || annotating) && (\n <ShowOriginalButton\n active={markup.showOriginal}\n compact={isCompact}\n onClick={() => {\n setAnnotating(false)\n markup.setShowOriginal((on) => !on)\n }}\n />\n )}\n {activeTab === 'pdf' && markup.hasMarkup && !annotating && (\n <DownloadMarkupButton\n onClick={() => void markup.downloadMarkup()}\n // A signed version is locked: Download serves the signed file as it is.\n disabledReason={isSigned ? SIGNED_LOCKED_REASON : undefined}\n />\n )}\n {/* Image actions: start a generation from this image, or crop it into a new document. */}\n {activeTab === 'pdf' && isImage && pdfBlob && (\n <ViewerImageActions\n compact={isCompact}\n onUseAsReference={\n support.useImageAsReference ? () => support.useImageAsReference!(documentId) : undefined\n }\n onCrop={crop.handleOpenCrop}\n />\n )}\n {/* The thread it was made in: open it at the answer that made it. */}\n {madeIn && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n onClick={() =>\n openConversation(madeIn.id, {\n messageId: documentData?.source_message_ext_id ?? undefined,\n })\n }\n title={`Open the thread it was made in: ${madeIn.title}`}\n aria-label={`Open the thread it was made in: ${madeIn.title}`}\n data-testid=\"document-open-thread\"\n >\n <MessageSquare className=\"size-4\" />\n {!isCompact && <span className=\"max-w-[10rem] truncate\">{madeIn.title}</span>}\n </Button>\n )}\n {/* Share always asks first (the host's share dialog), so a click never changes who can see\n the file by surprise. */}\n {documentId && doc.workspaceId && (\n <ShareControl\n state={documentData?.shared ? 'shared' : 'private'}\n onToggle={share}\n disabled={!canChangeVisibility(documentData, currentUserId)}\n disabledTooltip=\"Only the owner can change visibility\"\n tooltip={\n documentData?.shared\n ? 'Shared with the workspace — click to share with specific people'\n : 'Share with the workspace, then optionally notify specific people by email'\n }\n variant=\"outline\"\n compact={isCompact}\n showState={!isCompact}\n labels={{\n shared: getEntityLabel('WORKSPACE'),\n private: 'Only you',\n mixed: 'Partly shared',\n }}\n testId=\"share-document-button\"\n stateTestId=\"document-title-shared-indicator\"\n />\n )}\n {/* Email: the host's mail composer with the document on screen attached. The divider keeps\n it apart from Share, which changes who can see the file rather than sending it. */}\n {tools.emailDocument && !isDraft && !isStreaming && documentData?.file_name && (\n <>\n <span className=\"mx-1 h-5 w-px bg-border\" aria-hidden=\"true\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n title=\"Email this document\"\n aria-label=\"Email\"\n data-testid=\"email-document-button\"\n className=\"pointer-coarse:min-h-11\"\n onClick={() => tools.emailDocument?.(shownRef)}\n >\n <Mail className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Email</span>}\n </Button>\n </>\n )}\n {/* Translate: a new, editable document with the original and translation side by side. */}\n {support.translate &&\n !isDraft &&\n !isStreaming &&\n !liveKind &&\n !isImage &&\n documentData?.file_name && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n title=\"Translate into another language: a new editable document, original and translation side by side\"\n aria-label=\"Translate\"\n data-testid=\"translate-document-button\"\n className=\"pointer-coarse:min-h-11\"\n onClick={() => support.translate!(shownRef)}\n >\n <Languages className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Translate</span>}\n </Button>\n )}\n {/* Finalise (a translation): its current version saved as a new labelled PDF. */}\n {!isStreaming && !snapshotDocumentId && (\n <FinaliseTranslationButton document={documentData ?? undefined} isCompact={isCompact} />\n )}\n {/* Sign: each signature is sealed and saved as a new version; a signed copy can be\n counter-signed (the earlier signatures stay valid). */}\n {annotatable && (\n <SignButton\n active={placingSignature}\n compact={isCompact}\n onClick={() => {\n setAnnotating(false)\n setSignatureFlow(null)\n setPlacingSignature((on) => !on)\n }}\n />\n )}\n {/* Request signatures: place each signer's fields, then send; each is walked through theirs. */}\n {annotatable && !isSigned && (\n <RequestSignaturesButton\n active={signatureFlow?.kind === 'prepare'}\n compact={isCompact}\n onClick={() => {\n setAnnotating(false)\n setPlacingSignature(false)\n setSignatureFlow(signatureFlow?.kind === 'prepare' ? null : { kind: 'prepare' })\n }}\n />\n )}\n {isSignOpen && pdfBlob && (\n <SignDocumentDialog\n open={isSignOpen}\n onOpenChange={setIsSignOpen}\n documentId={documentId}\n pdfBlob={pdfBlob}\n // The PDF on screen is the current version's (an earlier one cannot be signed): the\n // server refuses if another version has landed since.\n version={documentData?.current_version ?? undefined}\n appearance={signAppearance}\n />\n )}\n {headerActions}\n </ViewerHeaderEnd>\n )\n\n const viewerProps = {\n currentPage: viewingDocumentPage || undefined,\n onLoadSuccess: handleLoadSuccess,\n scrollTrigger,\n zoom,\n onZoomChange: setZoom,\n }\n\n return (\n <ViewerFrame\n frameRef={containerRef}\n contentId={documentId}\n header={\n <>\n <TabHeader\n tabs={[]}\n activeTabId={activeTab}\n onTabChange={handleTabChange}\n leftContent={leftContent}\n rightContent={rightContent}\n variant=\"underline\"\n />\n {isCompact && !isCoEditing && (\n <div data-slot=\"viewer-title-row\" className=\"flex min-w-0 items-center gap-2 px-3 pb-2\">\n {titleBlock}\n </div>\n )}\n {/* In the sticky header, not the content area: the PDF view scrolls its first page into\n view, which scrolls a bar above it out of sight. */}\n {snapshotDocumentId && (\n <VersionSnapshotBar\n versionNumber={snapshotNumber}\n live={isDocx || isArtifact}\n onAsk={\n support.askAboutVersion\n ? () => support.askAboutVersion!(snapshotDocumentId)\n : undefined\n }\n onReturn={() => setSnapshotDocumentId(null)}\n />\n )}\n </>\n }\n compareRow={isComparing ? compareIndicator || undefined : undefined}\n footer={\n // Crop to a new document. Full resolution (no maxSize): a crop frames, it never downscales.\n <ImageCropModal\n open={crop.cropImageUrl !== null}\n image={crop.cropImageUrl}\n title=\"Crop image\"\n saveLabel=\"Save as a copy\"\n aspectOptions={DEFAULT_ASPECT_OPTIONS}\n output={{ mimeType: 'image/png' }}\n onComplete={crop.handleCropComplete}\n onCancel={crop.closeCrop}\n />\n }\n >\n {isComparing && (\n <Suspense fallback={<ViewerMessage>Loading comparison…</ViewerMessage>}>\n <NativeDocxComparison\n baseId={compareDocumentId!}\n revisedId={documentId}\n title={documentTitle}\n />\n </Suspense>\n )}\n {/* A capture draft (photo/video/audio) has no backend document at all until it is saved:\n its recorder takes over the whole content area. */}\n {isCaptureDraft && support.renderCaptureDraft?.(documentId)}\n\n {/* Media stay mounted (hidden) on the text tab, so playback goes on while reading the\n transcript. */}\n {!isCaptureDraft &&\n (activeTab === 'pdf' || (isMedia && activeTab === 'html')) &&\n !isArtifact &&\n !isComparing && (\n <ViewerPane hidden={activeTab !== 'pdf'}>\n {/* The labels are the document's, whichever view it is read in: the PDF gets the\n chips without the passage stepper (no parsed passages to walk here). */}\n <DocumentLabelBar summaries={labelSummaries} />\n {!isMedia && !isImage && signatureBanner}\n {activeTab === 'pdf' && !isMedia && !isImage && (\n <MarkupNotices\n legacyPrompt={markup.legacyPrompt}\n olderNote={markup.olderNote}\n onOpenVersion={(n) => setSnapshotDocumentId(`${documentId}@v${n}`)}\n />\n )}\n <ViewerControlBar controls={activeTab === 'pdf' && pageNav}>\n <ViewerPdfPane\n documentId={documentId}\n doc={doc}\n pdfBlob={pdfBlob}\n isPdfLoading={blobs.isPdfLoading}\n pdfError={blobs.pdfError}\n onDownload={() => void handleDirectDownload()}\n viewerProps={viewerProps}\n signatureFlow={signatureFlow}\n onSignatureFlow={setSignatureFlow}\n currentUserId={currentUserId}\n placingSignature={placingSignature}\n onPlacingDone={(appearance) => {\n setPlacingSignature(false)\n if (!appearance) return\n setSignAppearance(appearance)\n setIsSignOpen(true)\n }}\n annotating={annotating}\n markup={markup}\n pdfSnapshotNumber={pdfSnapshotNumber}\n isSigned={isSigned}\n />\n </ViewerControlBar>\n </ViewerPane>\n )}\n\n {activeTab === 'preview' && isArtifact && liveKind && (\n // The preview loads its JSX compiler on first use, so it stays out of the main bundle.\n <ArtifactPreview\n kind={liveKind}\n source={liveSource}\n isStreaming={isStreaming}\n runtimeUrl={artifactRuntimeUrl}\n />\n )}\n\n {activeTab === 'edit' && isArtifact && liveKind && (\n <ArtifactCodeView source={liveSource} fileName={documentData?.file_name ?? undefined} />\n )}\n\n {/* A document draft is stored as DOCX: once generation ends the Word editor opens the stored\n document. Only a draft still being generated shows the streamed preview. */}\n {activeTab === 'edit' && isArtifact && !liveKind && !isStreaming && !isComparing && (\n <Suspense fallback={<ViewerMessage>Loading editor…</ViewerMessage>}>\n {isSigned && !snapshotDocumentId && <SignedEditNote />}\n <NativeDocxEditor\n key={`${snapshotDocumentId || documentId}-${snapshotDocumentId ? 'snapshot' : 'live'}`}\n documentId={snapshotDocumentId || documentId}\n title={documentTitle}\n draftContent={isDraft ? draftDoc?.content || '' : undefined}\n snapshot={!!snapshotDocumentId}\n onSaved={(id) => {\n if (!isDraft) return\n support.onDraftSaved?.(documentId, id)\n setViewingDocumentId(id)\n }}\n />\n </Suspense>\n )}\n\n {activeTab === 'versions' && (isArtifact || isDocx || hasHistory) && !isComparing && (\n <VersionTimeline\n // Each version made in a thread names it and opens it at the turn that made it.\n versions={versions.map((v) => ({\n ...v,\n madeIn: v.thread\n ? {\n label: threadTitle(v.thread.conversationId),\n onOpen: () =>\n openConversation(v.thread!.conversationId, {\n messageId: v.thread!.messageId ?? undefined,\n }),\n }\n : null,\n }))}\n currentId={currentVersionId}\n live={!!liveKind}\n // An uploaded file is not a draft: its versions come from replacing, editing or signing.\n labels={isArtifact ? undefined : { emptyDocument: UPLOADED_NO_VERSIONS }}\n formatDate={formatDate}\n onOpen={(id) => {\n // The current version is the live document itself, not a read-only copy of it.\n setSnapshotDocumentId(id === currentVersionId ? null : id)\n setActiveTab(isArtifact ? 'edit' : isDocx ? 'docx' : 'pdf')\n }}\n onCompare={(id) => session.setDocumentViewer({ compareId: id, tab: 'html' })}\n translations={translations}\n onOpenTranslation={(id) => setViewingDocumentId(id)}\n />\n )}\n\n {activeTab === 'xlsx' &&\n isXlsx &&\n (xlsxBlob ? (\n <XlsxViewer blob={xlsxBlob} />\n ) : (\n <ViewerMessage>\n {xlsxError ? 'Failed to load spreadsheet' : 'Loading spreadsheet...'}\n </ViewerMessage>\n ))}\n\n {activeTab === 'docx' && isDocx && !isComparing && (\n <Suspense fallback={<ViewerMessage>Loading editor…</ViewerMessage>}>\n {signatureBanner}\n {isSigned && !snapshotDocumentId && <SignedEditNote />}\n <NativeDocxEditor\n key={`${snapshotDocumentId || documentId}-${snapshotDocumentId ? 'snapshot' : 'live'}`}\n documentId={snapshotDocumentId || documentId}\n title={documentTitle}\n snapshot={!!snapshotDocumentId}\n />\n </Suspense>\n )}\n\n {streamingDoc &&\n isStreaming &&\n isArtifact &&\n !liveKind &&\n !isComparing &&\n (activeTab === 'html' || activeTab === 'edit') && (\n <Suspense fallback={<ViewerMessage>Opening draft…</ViewerMessage>}>\n <StreamedWordArtifact\n key={documentId}\n documentId={documentId.startsWith('doc-') ? documentId : undefined}\n title={documentTitle}\n content={streamingDoc.content}\n busy={isStreaming}\n />\n </Suspense>\n )}\n\n {!isCaptureDraft &&\n !isComparing &&\n activeTab === 'html' &&\n !(isStreaming && isArtifact && !liveKind) &&\n support.renderParsedView && (\n <ViewerPane>\n <ViewerControlBar controls={pageNav}>\n {support.renderParsedView({\n documentId: pdfSnapshotId || documentId,\n onLoadSuccess: handleLoadSuccess,\n scrollTrigger,\n zoom,\n onZoomChange: setZoom,\n })}\n </ViewerControlBar>\n </ViewerPane>\n )}\n </ViewerFrame>\n )\n}\n"]}
@@ -9,23 +9,13 @@ import { type WorkflowsTableProps } from '../agents/tasks/WorkflowsTable';
9
9
  /** The viewer's role in the open workspace, and the workspace's members. */
10
10
  export declare function useConnectedWorkspaceRole(): {
11
11
  members: {
12
- user: {
13
- external_id: string;
14
- parent_ext_id?: string | null | undefined;
15
- email: string;
16
- given_name: string;
17
- family_name?: string | null | undefined;
18
- picture?: string | null | undefined;
19
- encryption_public_key: string;
20
- is_sso: boolean;
21
- is_identity_verified: boolean;
22
- };
12
+ user: import("@arbidocs/client").components["schemas"]["UserResponse"];
23
13
  role: import("@arbidocs/client").components["schemas"]["WorkspaceRole"];
24
14
  joined_at: string;
25
15
  conversation_count: number;
26
16
  document_count: number;
27
17
  files_mb: number;
28
- agent_ext_id?: string | null | undefined;
18
+ agent_ext_id?: string | null;
29
19
  is_temporary: boolean;
30
20
  }[];
31
21
  role: "owner" | "collaborator" | "guest" | undefined;
@@ -75,15 +75,8 @@ export declare function useWorkspaceDocs(): {
75
75
  isError: boolean;
76
76
  ready: boolean;
77
77
  };
78
- /** Search the active workspace's documents and return the top matching passages. */
79
- export declare function useSemanticSearch(): {
80
- query: string;
81
- results: import("@arbidocs/react").SearchChunk[];
82
- status: import("@arbidocs/react").AiTaskStatus;
83
- error: string | null;
84
- search: (q: string, mode?: "semantic" | "keyword" | "hybrid") => Promise<void>;
85
- isRunning: boolean;
86
- };
78
+ /** Search the active workspace's documents (all of them) and return the top matching passages. */
79
+ export declare function useSemanticSearch(): import("@arbidocs/react").SemanticSearch;
87
80
  /**
88
81
  * The chat controller for `ChatPage` bound to the connection: the active workspace and the host's
89
82
  * default assistant configuration are injected, so a host writes
@@ -0,0 +1,24 @@
1
+ /**
2
+ * AddAddonDialog — confirm adding one add-on block: price today, the next charge, one line; how it is charged is
3
+ * behind "More info".
4
+ *
5
+ * - ai_usage: +£25 of AI usage a month, charged now at `ai_block_price_pence` (monthly: one
6
+ * month; annual: the monthly rate × the months left, covering until the annual renewal).
7
+ * - storage: +25 GB, charged now at `storage_block_price_pence`, prorated by days for the rest of
8
+ * the period.
9
+ * The block then renews every period at `ai_block_period_pence` / `storage_block_period_pence`
10
+ * until the user removes it. The figures shown are taxed for the customer's saved address (GET /addons/quote). The
11
+ * monthly usage cap limits automatic top-ups only: it never blocks a block added here, even at £0.
12
+ */
13
+ import type { components } from '@arbidocs/client';
14
+ import { type AddonKind } from './useAddonPurchase';
15
+ type ProjectResponse = components['schemas']['ProjectResponse'];
16
+ export declare function AddAddonDialog({ kind, project, open, onOpenChange, onAdded, }: {
17
+ kind: AddonKind;
18
+ project: ProjectResponse;
19
+ open: boolean;
20
+ onOpenChange: (open: boolean) => void;
21
+ /** Called once the block is paid (not when the bank still needs to confirm). */
22
+ onAdded?: () => void;
23
+ }): import("react").JSX.Element | null;
24
+ export {};
@@ -0,0 +1,18 @@
1
+ /** The bordered card used by the project billing view (Plan, Usage and plan). */
2
+ import type { ReactNode, Ref } from 'react';
3
+ export declare function BillingCard({ title, testId, action, children, cardRef, }: {
4
+ title: string;
5
+ testId: string;
6
+ action?: ReactNode;
7
+ children: ReactNode;
8
+ cardRef?: Ref<HTMLElement>;
9
+ }): import("react").JSX.Element;
10
+ /** A scheduled change, one line, with its Undo. */
11
+ export declare function PendingChange({ children, onUndo, undoLabel, isBusy, testId, undoTestId, }: {
12
+ children: ReactNode;
13
+ onUndo?: () => void;
14
+ undoLabel?: string;
15
+ isBusy?: boolean;
16
+ testId: string;
17
+ undoTestId?: string;
18
+ }): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { type ProjectRelation } from '@arbidocs/react/ui';
2
+ export interface BillingProjectEntityProps {
3
+ name: string;
4
+ subscription?: string;
5
+ size?: 'sm' | 'base';
6
+ relation?: ProjectRelation;
7
+ }
8
+ /** The project pill, marked paid only where plans are sold. */
9
+ export declare function BillingProjectEntity({ subscription, ...props }: BillingProjectEntityProps): import("react").JSX.Element;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ChangePlanDialog — the single source of truth for a project's plan picker.
3
+ *
4
+ * Opened from two places that used to each render their own dialog (and drifted
5
+ * apart in width): the projects list "Upgrade" action and a project's detail
6
+ * "Change plan" button. Pro projects switch interval or move to Free
7
+ * (ChangeProPlan); Free or unpaid projects subscribe to Pro (SubscriptionPlans). One wrapper, one
8
+ * width — so the plan grid can't render cramped in one entry point and spacious
9
+ * in the other.
10
+ */
11
+ import type { components } from '@arbidocs/client';
12
+ type ProjectResponse = components['schemas']['ProjectResponse'];
13
+ interface ChangePlanDialogProps {
14
+ /** The project whose plan is being changed. `null` keeps the dialog closed. */
15
+ project: ProjectResponse | null;
16
+ open: boolean;
17
+ onOpenChange: (open: boolean) => void;
18
+ }
19
+ export declare function ChangePlanDialog({ project, open, onOpenChange }: ChangePlanDialogProps): import("react").JSX.Element;
20
+ export {};
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ChangeProPlan — change the plan of a project already on Pro.
3
+ *
4
+ * Pro is one licence. Choices: Pro, Free, and the billing interval; a legacy multi-pack plan (no longer
5
+ * sold) also shows its own count ("Pro ×3", priced from the project) and may only go down to one
6
+ * licence. One POST /change-plan { interval, packs }:
7
+ * - packs is 1, or the subscription's current count (which undoes a scheduled reduction).
8
+ * - One licence instead of several applies at period end (`addons.packs_next`), no refund.
9
+ * - Monthly ↔ annual switches at period end (`addons.pending_interval`); a plan that renews with
10
+ * several packs can't switch interval, so the toggle shows only once one licence is chosen.
11
+ * - Sending the current value clears a pending change; on a project set to cancel, it resumes.
12
+ * - Free: POST /cancel — Pro and its add-ons stay until the period ends.
13
+ */
14
+ import type { components } from '@arbidocs/client';
15
+ type ProjectResponse = components['schemas']['ProjectResponse'];
16
+ export declare function ChangeProPlan({ project, onDone, }: {
17
+ project: ProjectResponse;
18
+ onDone?: () => void;
19
+ }): import("react").JSX.Element;
20
+ export {};
@@ -0,0 +1,12 @@
1
+ /**
2
+ * CheckoutTotal — the tax-inclusive total of a plan purchase, shown before Stripe opens:
3
+ * "Total today £48.00 incl. VAT (£40.00 + £8.00 VAT 20%)". Priced by the backend (Stripe Tax)
4
+ * for the chosen country, plus a ZIP / postcode where the tax depends on it (e.g. the US).
5
+ */
6
+ import type { CheckoutQuoteState } from './useCheckoutQuote';
7
+ /** The postcode field (when needed) and the total line. */
8
+ export declare function CheckoutTotal({ state, postalCode, onPostalCodeChange, }: {
9
+ state: CheckoutQuoteState;
10
+ postalCode: string;
11
+ onPostalCodeChange: (value: string) => void;
12
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { type ProjectResponse } from '@arbidocs/react';
2
+ export declare function DailyCapEditor({ project }: {
3
+ project: ProjectResponse;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ export declare function InvoicesModal({ projectExtId, projectName, open, onOpenChange, }: {
2
+ projectExtId: string;
3
+ projectName: string;
4
+ open: boolean;
5
+ onOpenChange: (open: boolean) => void;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * NewProjectFlow — unified dialog: name → Free or Pro → monthly/annual + promo → checkout.
3
+ * When Stripe is disabled, just creates a project with a name (no plan selection).
4
+ * Free creates a usable project immediately. Pro creates a 'pending' project and opens the
5
+ * embedded Stripe Checkout; a cancelled checkout discards the pending project.
6
+ * The total for the billing country (incl. tax) is quoted before Stripe opens.
7
+ */
8
+ interface NewProjectFlowProps {
9
+ open: boolean;
10
+ onOpenChange: (open: boolean) => void;
11
+ defaultName: string;
12
+ }
13
+ export declare function NewProjectFlow({ open, onOpenChange, defaultName }: NewProjectFlowProps): import("react").JSX.Element;
14
+ export {};
@@ -0,0 +1,13 @@
1
+ /**
2
+ * PlanChangeLines — the plan-change panel's fixed lines (pay today / from <date> / current plan
3
+ * until), from the Stripe preview. Used by the plan picker.
4
+ */
5
+ import type { components } from '@arbidocs/client';
6
+ type PlanChangePreview = components['schemas']['PlanChangePreview'];
7
+ export declare function PlanChangeLines({ preview, isError, className, }: {
8
+ preview: PlanChangePreview | undefined;
9
+ /** The preview failed: say what today's charge is without a figure. */
10
+ isError?: boolean;
11
+ className?: string;
12
+ }): import("react").JSX.Element;
13
+ export {};
@@ -0,0 +1,50 @@
1
+ /**
2
+ * PlanSelector — binds the Pro prices to the plan-picker blocks.
3
+ *
4
+ * Two plans: Free and Pro (one licence), Pro billed monthly or annually. Used by NewProjectFlow (choose
5
+ * Free or Pro for a new project) and SubscriptionPlans (upgrade a Free project).
6
+ * Prices come from Stripe (source of truth): ex VAT, with the UK-inclusive figure under it; the
7
+ * total for the buyer's country is quoted before checkout. Presentation lives in `@arbidocs/blocks`.
8
+ */
9
+ import { type PlanChoice, type ProPrices } from './plan-pricing';
10
+ import type { components } from '@arbidocs/client';
11
+ type ProductPrice = components['schemas']['ProductPrice'];
12
+ /**
13
+ * Free and Pro plan cards. `isOnFree` marks Free as the current (unselectable) plan when
14
+ * upgrading an existing Free project; omit it for a brand-new project, where both are choices.
15
+ */
16
+ export declare function PlanChoiceCards({ selected, onSelect, isAnnual, prices, isOnFree, }: {
17
+ selected: PlanChoice | null;
18
+ onSelect: (plan: PlanChoice) => void;
19
+ isAnnual: boolean;
20
+ prices: ProPrices;
21
+ isOnFree?: boolean;
22
+ }): import("react").JSX.Element;
23
+ /** "How pricing works" popover; its link opens the AI model list in user settings. */
24
+ export declare function PlanInfoPopover(): import("react").JSX.Element;
25
+ /**
26
+ * The monthly usage cap at checkout, editable inline, with one short line (the rest is in "How pricing works").
27
+ * `value` is in pounds; an untouched default is sent as `addon_budget_pence: null`.
28
+ */
29
+ export declare function CheckoutAddonBudget({ value, onChange, }: {
30
+ value: string;
31
+ onChange: (value: string) => void;
32
+ }): import("react").JSX.Element;
33
+ /**
34
+ * Add-on blocks bought with Pro at checkout: "+£25 of AI usage" and "+25 GB storage" steppers (0..100 each), priced
35
+ * per block on the chosen interval. They are on the first invoice and renew until reduced ("How pricing works").
36
+ */
37
+ export declare function CheckoutAddonBlocks({ aiBlocks, storageBlocks, onAiBlocksChange, onStorageBlocksChange, price, }: {
38
+ aiBlocks: number;
39
+ storageBlocks: number;
40
+ onAiBlocksChange: (value: number) => void;
41
+ onStorageBlocksChange: (value: number) => void;
42
+ /** The plan price on the chosen interval; its `addon_prices` price each block. */
43
+ price?: ProductPrice;
44
+ }): import("react").JSX.Element;
45
+ /** The billing country, chosen before checkout so Stripe prices it with the right tax. */
46
+ export declare function CheckoutCountrySelect({ value, onChange, }: {
47
+ value: string;
48
+ onChange: (code: string) => void;
49
+ }): import("react").JSX.Element;
50
+ export {};
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ProjectBilling — the owner's billing view of one project: Plan / Usage and plan.
3
+ *
4
+ * - Plan card: what you have (plan, renewal date, price), any scheduled change with Undo, and
5
+ * billing problems (Free / Dev: also the AI usage and storage meters). "Change plan" is its one
6
+ * action.
7
+ * - Usage and plan card (Pro only, `ProjectUsageCard`): a usage meter per resource with + / −
8
+ * beside it, and the monthly usage cap, which limits automatic top-ups only (£100 by default for
9
+ * new projects; £0 = no automatic top-ups; "No limit" allowed).
10
+ *
11
+ * Reductions and plan downgrades take effect at the end of the period; no refunds.
12
+ */
13
+ import type { components } from '@arbidocs/client';
14
+ type ProjectResponse = components['schemas']['ProjectResponse'];
15
+ export declare function ProjectPlanCard({ project, onChangePlan, }: {
16
+ project: ProjectResponse;
17
+ /** Opens the plan picker (upgrade from Free, or change plan on Pro). */
18
+ onChangePlan?: () => void;
19
+ }): import("react").JSX.Element;
20
+ export declare function ProjectBilling({ project, onChangePlan, }: {
21
+ project: ProjectResponse;
22
+ onChangePlan?: () => void;
23
+ }): import("react").JSX.Element;
24
+ export {};
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ProjectDetail
3
+ *
4
+ * Content of an opened per-project tab. Only your OWN projects are openable
5
+ * (the table gates this), so this is purely the deep detail: the daily-cap
6
+ * setter for others on the project, plus the usage breakdown. The high-level
7
+ * summary (plan, AI usage, storage, collaborators) lives in the projects list;
8
+ * renaming the project is done here, from the pencil beside its name.
9
+ */
10
+ import { type ReactNode } from 'react';
11
+ export interface ProjectDetailProps {
12
+ projectExtId: string;
13
+ /** The project's storage (by workspace and kind, largest items, recently deleted), from the host. */
14
+ storage?: ReactNode;
15
+ }
16
+ export declare function ProjectDetail({ projectExtId, storage }: ProjectDetailProps): import("react").JSX.Element;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ProjectUsageCard — a Pro project's "Usage and plan" card: one usage meter per resource (AI usage this month,
3
+ * storage) and the monthly usage cap. Short labels and one-line facts only; how top-ups, proration, the cap and
4
+ * reductions work is behind the card's "More info" link.
5
+ *
6
+ * Each meter shows used vs the allowance now, marking the plan's part and shading the top-ups, hatches how much more
7
+ * automatic top-ups may add before the usage cap stops them ("No limit" / £0 states), says what renews from the next
8
+ * period when that differs (with Undo), and has + / − beside it with the price of one step:
9
+ * - "+" opens the add confirm (charged now: AI usage the full block, storage prorated for the rest of the period);
10
+ * the usage cap never blocks it.
11
+ * - "−" opens a one-click confirm that removes one block from the next renewal; this period's allowance stays.
12
+ * The usage cap limits automatic top-ups only (default £100; £0 = no automatic top-ups; or no limit).
13
+ */
14
+ import type { components } from '@arbidocs/client';
15
+ type ProjectResponse = components['schemas']['ProjectResponse'];
16
+ type ProjectAddons = components['schemas']['ProjectAddons'];
17
+ export declare function ProjectUsageCard({ project, addons, }: {
18
+ project: ProjectResponse;
19
+ addons: ProjectAddons;
20
+ }): import("react").JSX.Element;
21
+ export {};