@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,1229 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkV4YZXGXR_cjs = require('../chunk-V4YZXGXR.cjs');
5
+ var chunkKLPRAQCE_cjs = require('../chunk-KLPRAQCE.cjs');
6
+ require('../chunk-YAEXSCUW.cjs');
7
+ require('../chunk-223D4727.cjs');
8
+ var chunkGAYMJWTC_cjs = require('../chunk-GAYMJWTC.cjs');
9
+ var chunkGFNELPDP_cjs = require('../chunk-GFNELPDP.cjs');
10
+ var chunkD3WFIFRY_cjs = require('../chunk-D3WFIFRY.cjs');
11
+ require('../chunk-6MG62I5B.cjs');
12
+ var chunkUWIILWDI_cjs = require('../chunk-UWIILWDI.cjs');
13
+ var chunkJH6JTI76_cjs = require('../chunk-JH6JTI76.cjs');
14
+ require('../chunk-2WLXQGWC.cjs');
15
+ require('../chunk-COCGRJLA.cjs');
16
+ var chunkVLCY46K6_cjs = require('../chunk-VLCY46K6.cjs');
17
+ require('../chunk-FAXXN7KI.cjs');
18
+ require('../chunk-V46W7YLI.cjs');
19
+ require('../chunk-SIB6C7P7.cjs');
20
+ require('../chunk-DVUZTGVL.cjs');
21
+ require('../chunk-AHDJXIUB.cjs');
22
+ require('../chunk-DTROMMDX.cjs');
23
+ require('../chunk-V4ISCZJ7.cjs');
24
+ require('../chunk-2EI7NCUA.cjs');
25
+ require('../chunk-C2CWWEHO.cjs');
26
+ var chunk2YV7FBLO_cjs = require('../chunk-2YV7FBLO.cjs');
27
+ require('../chunk-VG24E4JJ.cjs');
28
+ require('../chunk-QVBZESYQ.cjs');
29
+ var chunk7RGLTF76_cjs = require('../chunk-7RGLTF76.cjs');
30
+ var chunkKPZZ5FHE_cjs = require('../chunk-KPZZ5FHE.cjs');
31
+ require('../chunk-ULWRNGGE.cjs');
32
+ require('../chunk-5UHAWSEX.cjs');
33
+ require('../chunk-B6MVQCXW.cjs');
34
+ var chunkJKB7WT7L_cjs = require('../chunk-JKB7WT7L.cjs');
35
+ require('../chunk-32HW2Q33.cjs');
36
+ var chunkFX3K6LNZ_cjs = require('../chunk-FX3K6LNZ.cjs');
37
+ require('../chunk-PPCATBOY.cjs');
38
+ require('../chunk-MHVNT4J3.cjs');
39
+ var chunkKDG6FER6_cjs = require('../chunk-KDG6FER6.cjs');
40
+ require('../chunk-DES3K4SD.cjs');
41
+ var react = require('react');
42
+ var lucideReact = require('lucide-react');
43
+ var react$1 = require('@arbidocs/react');
44
+ var artifacts = require('@arbidocs/react/artifacts');
45
+ var documentTools = require('@arbidocs/react/document-tools');
46
+ var viewers = require('@arbidocs/react/viewers');
47
+ var ui = require('@arbidocs/react/ui');
48
+ var reactQuery = require('@tanstack/react-query');
49
+ var jsxRuntime = require('react/jsx-runtime');
50
+
51
+ function ConnectedDocumentToolsProvider({ children }) {
52
+ const enclosing = documentTools.useOptionalDocumentTools();
53
+ return enclosing ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children }) : /* @__PURE__ */ jsxRuntime.jsx(OwnDocumentTools, { children });
54
+ }
55
+ function OwnDocumentTools({ children }) {
56
+ const arbi = react$1.useArbi();
57
+ const queryClient = reactQuery.useQueryClient();
58
+ const { user, ensureWorkspaceOpen } = chunkGFNELPDP_cjs.useConnectedWorkspace();
59
+ const { notify: environmentNotify, openDocument: openInHost } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
60
+ const client = arbi.isLoggedIn ? arbi.getClient().fetch : null;
61
+ const signer = react.useMemo(
62
+ () => user ? { name: user.name, email: user.email, externalId: user.externalId } : null,
63
+ [user]
64
+ );
65
+ const notify = react.useCallback(
66
+ (message, kind, options) => environmentNotify(message, kind, {
67
+ description: options?.description,
68
+ action: options?.action
69
+ }),
70
+ [environmentNotify]
71
+ );
72
+ const onDocumentsChanged = react.useCallback(
73
+ async (ids, change) => {
74
+ const refresh = [react$1.refreshDocuments(queryClient, arbi, ids)];
75
+ if (change === "signed" || change === "version")
76
+ for (const id of ids)
77
+ refresh.push(
78
+ queryClient.invalidateQueries({ queryKey: react$1.arbiQueryKeys.documentVersions(id) }),
79
+ queryClient.invalidateQueries({ queryKey: documentTools.documentBytesKey(id) })
80
+ );
81
+ await Promise.all(refresh);
82
+ },
83
+ [queryClient, arbi]
84
+ );
85
+ const uploadDocument = react.useCallback(
86
+ async (request) => {
87
+ if (!client) throw new Error("Sign in to save a copy.");
88
+ await ensureWorkspaceOpen();
89
+ return documentTools.clientUpload(client)(request);
90
+ },
91
+ [client, ensureWorkspaceOpen]
92
+ );
93
+ const openDocument = react.useCallback((ref) => openInHost(ref), [openInHost]);
94
+ if (!client) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
95
+ return /* @__PURE__ */ jsxRuntime.jsx(
96
+ documentTools.DocumentToolsProvider,
97
+ {
98
+ client,
99
+ user: signer,
100
+ notify,
101
+ openDocument,
102
+ onDocumentsChanged,
103
+ uploadDocument,
104
+ children
105
+ }
106
+ );
107
+ }
108
+ var isTranslationDraft = (doc) => !!doc?.derived_from?.some((d) => d.role === "translation") && !doc.derived_from.some((d) => d.role === "final");
109
+ function FinaliseTranslationButton({
110
+ document,
111
+ isCompact
112
+ }) {
113
+ const finalise = react$1.useFinaliseTranslation();
114
+ const { openDocument } = documentTools.useDocumentTools();
115
+ const { notify } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
116
+ if (!document || !isTranslationDraft(document)) return null;
117
+ const pending = finalise.isPending;
118
+ const onClick = async () => {
119
+ try {
120
+ const { document_ext_id: finalId } = await finalise.mutateAsync(document.external_id);
121
+ notify("Saved the final PDF of this translation", "success");
122
+ openDocument?.(finalId);
123
+ } catch (error) {
124
+ const detail = error?.detail;
125
+ notify(
126
+ typeof detail === "string" ? detail : "The final PDF could not be saved. Try again.",
127
+ "error"
128
+ );
129
+ }
130
+ };
131
+ return /* @__PURE__ */ jsxRuntime.jsxs(
132
+ ui.Button,
133
+ {
134
+ type: "button",
135
+ variant: "outline",
136
+ size: isCompact ? "icon" : "sm",
137
+ title: "Finalise: save this translation as a new PDF, labelled Translation and linked to the original",
138
+ "aria-label": "Finalise",
139
+ "data-testid": "finalise-translation-button",
140
+ className: "pointer-coarse:min-h-11",
141
+ disabled: pending,
142
+ onClick: () => void onClick(),
143
+ children: [
144
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileCheck2, { className: "size-4" }),
145
+ !isCompact && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1", children: pending ? "Finalising\u2026" : "Finalise" })
146
+ ]
147
+ }
148
+ );
149
+ }
150
+ function useImageCrop(documentId, fileName, imageBlob) {
151
+ const { uploadDocument, onDocumentsChanged, openDocument } = documentTools.useDocumentTools();
152
+ const { notify } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
153
+ const [cropImageUrl, setCropImageUrl] = react.useState(null);
154
+ const handleOpenCrop = react.useCallback(() => {
155
+ if (!imageBlob) return;
156
+ setCropImageUrl(URL.createObjectURL(imageBlob));
157
+ }, [imageBlob]);
158
+ const closeCrop = react.useCallback(() => {
159
+ setCropImageUrl((url) => {
160
+ if (url) URL.revokeObjectURL(url);
161
+ return null;
162
+ });
163
+ }, []);
164
+ const handleCropComplete = react.useCallback(
165
+ async (result) => {
166
+ const baseName = (fileName || "image").replace(/\.[^.]+$/, "");
167
+ const file = new File([result.blob], `${baseName} (cropped).png`, { type: "image/png" });
168
+ try {
169
+ const response = await uploadDocument({
170
+ file,
171
+ query: { derived_from: [documentId], derived_role: "crop" }
172
+ });
173
+ const newDocId = response?.doc_ext_ids?.[0];
174
+ if (newDocId) {
175
+ await onDocumentsChanged?.([newDocId], "copy");
176
+ openDocument?.(newDocId);
177
+ }
178
+ notify("Cropped image saved", "success");
179
+ } catch {
180
+ notify("Failed to save the cropped image", "error");
181
+ } finally {
182
+ closeCrop();
183
+ }
184
+ },
185
+ [fileName, documentId, uploadDocument, onDocumentsChanged, openDocument, notify, closeCrop]
186
+ );
187
+ return { cropImageUrl, handleOpenCrop, closeCrop, handleCropComplete };
188
+ }
189
+ var DOCX_EXTENSIONS = /* @__PURE__ */ new Set([".docx", ".doc"]);
190
+ var XLSX_EXTENSIONS = /* @__PURE__ */ new Set([".xlsx", ".xls"]);
191
+ var EMAIL_EXTENSIONS = /* @__PURE__ */ new Set([".eml", ".msg"]);
192
+ function fileExtension(fileName) {
193
+ if (!fileName) return "";
194
+ return fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
195
+ }
196
+ function useViewedDocument(documentId) {
197
+ const support = chunkKLPRAQCE_cjs.useDocumentViewerSupport();
198
+ const [webmHasVideoTrack, setWebmHasVideoTrack] = react.useState(null);
199
+ react.useEffect(() => setWebmHasVideoTrack(null), [documentId]);
200
+ const streamingDoc = support.streamingDocuments?.[documentId];
201
+ const isStreaming = !!streamingDoc && !streamingDoc.isComplete;
202
+ const draftDoc = support.draftDocuments?.[documentId];
203
+ const isDraft = !!draftDoc;
204
+ const isCaptureDraft = draftDoc?.kind === "audio" || draftDoc?.kind === "photo" || draftDoc?.kind === "video";
205
+ const isTextDraft = draftDoc?.kind === "text";
206
+ const { workspaceId, live } = chunkGFNELPDP_cjs.useConnectedWorkspace();
207
+ const { data: record } = react$1.useDocument(documentId, {
208
+ enabled: live && !!workspaceId && !isStreaming && !isDraft,
209
+ // A new version (Save version, a signed copy) is processed before its PDF exists: keep
210
+ // re-reading until it is done, so the PDF tab and the signing tools come back on their own.
211
+ pollWhileProcessing: true
212
+ });
213
+ const documentData = record?.external_id === documentId ? record : void 0;
214
+ const { data: tags } = chunkGAYMJWTC_cjs.useConnectedTags();
215
+ const labelSummaries = react.useMemo(
216
+ () => chunkV4YZXGXR_cjs.summariseDocTags(documentData?.doctags ?? [], tags.filter(chunkV4YZXGXR_cjs.isDocumentLabel)),
217
+ [documentData, tags]
218
+ );
219
+ const fileName = documentData?.file_name;
220
+ const isMarkdown = fileExtension(fileName) === ".md";
221
+ const isImage = ui.isImageFile(fileName);
222
+ const isWebmFile = fileExtension(fileName) === ".webm";
223
+ const isVideo = isWebmFile && webmHasVideoTrack === false ? false : ui.isVideoFile(fileName);
224
+ const isAudio = isWebmFile && webmHasVideoTrack === false ? true : ui.isAudioFile(fileName);
225
+ const isBlobArtifact = streamingDoc?.mode === "image" || documentData?.wp_type === "artifact" && (isImage || isVideo || isAudio);
226
+ const isArtifact = (!!streamingDoc || isTextDraft || documentData?.wp_type === "artifact" || isMarkdown) && !isBlobArtifact;
227
+ const liveKind = isArtifact ? artifacts.artifactKindFromMode(streamingDoc?.mode ?? void 0) ?? artifacts.artifactKindFromFileName(fileName) : null;
228
+ const savedDocumentId = chunkJKB7WT7L_cjs.savedDocumentIdFor({
229
+ documentId,
230
+ isDraft,
231
+ isStreaming,
232
+ isBlobArtifact,
233
+ documentData
234
+ });
235
+ const { data: liveSourceFetched } = artifacts.useArtifactSource(
236
+ documentId,
237
+ !!liveKind && !streamingDoc && !!documentData && !isDraft
238
+ );
239
+ const liveSource = streamingDoc ? streamingDoc.content : liveSourceFetched ?? "";
240
+ const hasParsedDocStatus = documentData?.status === "completed" || documentData?.status === "low-content";
241
+ const { data: parsedDoc, isLoading: isParsedDocLoading } = react$1.useParsedDocument(
242
+ documentId,
243
+ "final",
244
+ {
245
+ enabled: !!documentId && live && !isStreaming && !isDraft && !isBlobArtifact && hasParsedDocStatus
246
+ }
247
+ );
248
+ const hasParsedContent = (parsedDoc?.chunks?.length ?? 0) > 0;
249
+ return {
250
+ workspaceId,
251
+ documentData,
252
+ streamingDoc,
253
+ isStreaming,
254
+ draftDoc,
255
+ isDraft,
256
+ isCaptureDraft,
257
+ isTextDraft,
258
+ labelSummaries,
259
+ isImage,
260
+ isWebmFile,
261
+ setWebmHasVideoTrack,
262
+ isVideo,
263
+ isAudio,
264
+ isMedia: isVideo || isAudio,
265
+ isBlobArtifact,
266
+ savedDocumentId,
267
+ isArtifact,
268
+ liveKind,
269
+ liveSource,
270
+ isDocx: DOCX_EXTENSIONS.has(fileExtension(fileName)),
271
+ isXlsx: XLSX_EXTENSIONS.has(fileExtension(fileName)),
272
+ isEmail: EMAIL_EXTENSIONS.has(fileExtension(fileName)),
273
+ isDownloadOnly: ui.isDownloadOnlyFile(fileName),
274
+ isParsedDocLoading,
275
+ hasParsedContent
276
+ };
277
+ }
278
+ function useViewerBlobs(documentId, doc) {
279
+ const { documentData, isArtifact, isDocx, isXlsx, isDownloadOnly, isWebmFile } = doc;
280
+ const { setWebmHasVideoTrack } = doc;
281
+ const { client, saveFile } = documentTools.useDocumentTools();
282
+ const { notify } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
283
+ const { loadOfflineCopy } = chunkKLPRAQCE_cjs.useDocumentViewerSupport();
284
+ const currentVersion = documentData?.current_version ?? 1;
285
+ const name = documentData?.file_name;
286
+ const original = ui.isImageFile(name) || ui.isVideoFile(name) || ui.isAudioFile(name);
287
+ const fallback = loadOfflineCopy && documentData && !artifacts.parseVersionRef(documentId).version ? () => loadOfflineCopy(documentData) : void 0;
288
+ const pdf = documentTools.useDocumentBytes(documentId, {
289
+ version: currentVersion,
290
+ kind: original ? "original" : "pdf",
291
+ enabled: !isArtifact && !!documentData && !isDownloadOnly && (!isDocx || documentData.status === "completed" || documentData.status === "low-content"),
292
+ fallback
293
+ });
294
+ const [pdfBlob, setPdfBlob] = react.useState(null);
295
+ react.useEffect(() => setPdfBlob(null), [documentId]);
296
+ react.useEffect(() => {
297
+ if (pdf.data) setPdfBlob(pdf.data);
298
+ }, [pdf.data]);
299
+ react.useEffect(() => {
300
+ if (!isWebmFile || !pdfBlob) return;
301
+ let cancelled = false;
302
+ void react$1.hasVideoTrack(pdfBlob).then((result) => {
303
+ if (!cancelled) setWebmHasVideoTrack(result);
304
+ });
305
+ return () => {
306
+ cancelled = true;
307
+ };
308
+ }, [isWebmFile, pdfBlob, setWebmHasVideoTrack]);
309
+ const xlsx = documentTools.useDocumentBytes(documentId, {
310
+ version: currentVersion,
311
+ kind: "original",
312
+ enabled: !isArtifact && !!documentData && isXlsx
313
+ });
314
+ const handleDirectDownload = react.useCallback(async () => {
315
+ try {
316
+ saveFile(await documentTools.fetchDocumentFile(client, documentId), documentData?.file_name || "download");
317
+ } catch {
318
+ notify("Failed to download file", "error");
319
+ }
320
+ }, [client, saveFile, notify, documentId, documentData?.file_name]);
321
+ return {
322
+ pdfBlob,
323
+ isPdfLoading: pdf.isLoading,
324
+ pdfError: pdf.error,
325
+ xlsxBlob: xlsx.data ?? null,
326
+ xlsxError: xlsx.error,
327
+ handleDirectDownload
328
+ };
329
+ }
330
+ function useViewerTabs(doc, isCompact, hasHistory = false) {
331
+ const {
332
+ documentData,
333
+ isArtifact,
334
+ isDocx,
335
+ isXlsx,
336
+ isEmail,
337
+ isVideo,
338
+ isAudio,
339
+ isImage,
340
+ liveKind,
341
+ hasParsedContent,
342
+ isParsedDocLoading
343
+ } = doc;
344
+ const session = react$1.useArbiSessionStore();
345
+ const {
346
+ tab: activeTab,
347
+ compareId,
348
+ tabRequest,
349
+ phonePdfChosen
350
+ } = react$1.useArbiSessionState((s) => s.documentViewer);
351
+ const setActiveTab = (tab) => session.setDocumentViewer({ tab });
352
+ const isTextFile = ui.friendlyFileType(documentData?.file_type, documentData?.file_name) === "Text";
353
+ const isPhone = chunkFX3K6LNZ_cjs.useIsPhone();
354
+ const phoneDefaultDecidedFor = react.useRef(null);
355
+ const hasDocumentData = !!documentData;
356
+ const documentKey = documentData?.external_id;
357
+ react.useEffect(() => {
358
+ if (isArtifact && (activeTab === "pdf" || !liveKind && activeTab === "docx")) {
359
+ setActiveTab(liveKind ? "preview" : "edit");
360
+ } else if (isDocx && activeTab === "pdf") {
361
+ setActiveTab("docx");
362
+ } else if (!liveKind && activeTab === "preview") {
363
+ setActiveTab(isArtifact ? "edit" : "pdf");
364
+ } else if (!isArtifact && documentData && activeTab === "edit") {
365
+ setActiveTab(isDocx ? "docx" : isXlsx ? "xlsx" : "pdf");
366
+ } else if (!isArtifact && !isDocx && !isXlsx && documentData && (activeTab === "docx" || activeTab === "xlsx")) {
367
+ setActiveTab("pdf");
368
+ }
369
+ }, [hasDocumentData, documentKey, isArtifact, isDocx, isXlsx, liveKind]);
370
+ react.useEffect(() => {
371
+ if (!tabRequest || !documentKey || tabRequest.documentId !== documentKey) return;
372
+ phoneDefaultDecidedFor.current = documentKey;
373
+ session.setDocumentViewer({ tabRequest: null, tab: tabRequest.tab });
374
+ }, [documentKey, tabRequest]);
375
+ const hasVersionsTab = isArtifact || isDocx || hasHistory;
376
+ react.useEffect(() => {
377
+ if (activeTab === "versions" && documentData && !hasVersionsTab) {
378
+ setActiveTab(isXlsx ? "xlsx" : "pdf");
379
+ }
380
+ }, [activeTab, documentData, hasVersionsTab]);
381
+ react.useEffect(() => {
382
+ if (activeTab === "html" && documentData !== void 0 && !isParsedDocLoading && !hasParsedContent && !compareId) {
383
+ setActiveTab(isArtifact ? "edit" : isDocx ? "docx" : isXlsx ? "xlsx" : "pdf");
384
+ }
385
+ }, [
386
+ activeTab,
387
+ documentData,
388
+ isParsedDocLoading,
389
+ hasParsedContent,
390
+ compareId,
391
+ isArtifact,
392
+ isDocx,
393
+ isXlsx
394
+ ]);
395
+ react.useEffect(() => {
396
+ if (!isPhone || !documentKey || isParsedDocLoading) return;
397
+ if (phoneDefaultDecidedFor.current === documentKey) return;
398
+ phoneDefaultDecidedFor.current = documentKey;
399
+ const opensOnPdf = !isArtifact && !isDocx && !isXlsx && !isVideo && !isAudio && !isImage && !isEmail;
400
+ if (opensOnPdf && hasParsedContent && !compareId && !phonePdfChosen && activeTab === "pdf") {
401
+ setActiveTab("html");
402
+ }
403
+ }, [isPhone, documentKey, isParsedDocLoading, hasParsedContent]);
404
+ const handleTabChange = (tabId) => {
405
+ const change = { tab: tabId };
406
+ if (tabId !== "html" && compareId) change.compareId = null;
407
+ if (isPhone && (tabId === "pdf" || tabId === "html")) change.phonePdfChosen = tabId === "pdf";
408
+ session.setDocumentViewer(change);
409
+ };
410
+ const mediaTab = isVideo ? { icon: /* @__PURE__ */ jsxRuntime.jsx(react$1.VidIcon, { size: 20 }), tooltip: "Video" } : isAudio ? { icon: /* @__PURE__ */ jsxRuntime.jsx(react$1.AudIcon, { size: 20 }), tooltip: "Audio" } : isImage ? { icon: /* @__PURE__ */ jsxRuntime.jsx(react$1.ImgIcon, { size: 20 }), tooltip: "Image" } : isEmail ? { icon: /* @__PURE__ */ jsxRuntime.jsx(react$1.EmlIcon, { size: 20 }), tooltip: "Email" } : isTextFile ? { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "size-5" }), tooltip: "Text" } : documentData ? { icon: /* @__PURE__ */ jsxRuntime.jsx(react$1.PdfIcon, { size: 20 }), tooltip: "PDF" } : (
411
+ // The file type is unknown until the record loads: name no guess (a text file
412
+ // would flip from PDF to Text once it arrives).
413
+ { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "size-5" }), tooltip: "Document" }
414
+ );
415
+ const tabLabel = (id, label) => !isCompact || activeTab === id || id === "html" ? label : void 0;
416
+ const versionsTab = {
417
+ id: "versions",
418
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.History, { className: "size-5" }),
419
+ tooltip: "Versions",
420
+ label: tabLabel("versions", "Versions")
421
+ };
422
+ const viewerTabs = [
423
+ ...isArtifact ? [
424
+ ...liveKind ? [
425
+ {
426
+ id: "preview",
427
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MonitorPlay, { className: "size-5" }),
428
+ tooltip: "Preview",
429
+ label: tabLabel("preview", "Preview")
430
+ }
431
+ ] : [],
432
+ {
433
+ id: "edit",
434
+ icon: liveKind ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Code, { className: "size-5" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "size-5" }),
435
+ tooltip: liveKind ? "Code" : "Editor",
436
+ label: tabLabel("edit", liveKind ? "Code" : "Document")
437
+ },
438
+ versionsTab
439
+ ] : [
440
+ ...isDocx ? [
441
+ {
442
+ id: "docx",
443
+ icon: /* @__PURE__ */ jsxRuntime.jsx(react$1.DocIcon, { size: 20 }),
444
+ tooltip: "DOCX (with track changes & comments)",
445
+ label: tabLabel("docx", "DOCX")
446
+ }
447
+ ] : [],
448
+ ...isXlsx ? [
449
+ {
450
+ id: "xlsx",
451
+ icon: /* @__PURE__ */ jsxRuntime.jsx(react$1.XlsIcon, { size: 20 }),
452
+ tooltip: "Spreadsheet",
453
+ label: tabLabel("xlsx", "Sheet")
454
+ }
455
+ ] : [],
456
+ { id: "pdf", ...mediaTab, label: tabLabel("pdf", mediaTab.tooltip) },
457
+ ...hasVersionsTab ? [versionsTab] : []
458
+ ],
459
+ ...(hasParsedContent || compareId) && !liveKind ? [
460
+ {
461
+ id: "html",
462
+ icon: compareId ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "size-5" }) : /* @__PURE__ */ jsxRuntime.jsx(react$1.HtmlIcon, { size: 20 }),
463
+ tooltip: compareId ? "Word redline" : "HTML",
464
+ label: tabLabel("html", compareId ? "Compare" : "HTML")
465
+ }
466
+ ] : []
467
+ ];
468
+ return { activeTab, handleTabChange, viewerTabs };
469
+ }
470
+ function useViewerVersions(docId) {
471
+ const plainId = docId ? artifacts.parseVersionRef(docId).docId : "";
472
+ const { data: documents } = chunkGAYMJWTC_cjs.useConnectedDocuments();
473
+ const listed = react.useMemo(
474
+ () => plainId ? documents.find((d) => d.external_id === plainId) : void 0,
475
+ [documents, plainId]
476
+ );
477
+ const { data: history } = react$1.useDocumentVersionList(plainId, { enabled: !!plainId && !listed });
478
+ const versions = react.useMemo(
479
+ () => listed ? artifacts.documentVersions(listed) : artifacts.toArtifactVersions(plainId || null, history),
480
+ [listed, history, plainId]
481
+ );
482
+ const translations = react.useMemo(() => {
483
+ if (!plainId) return [];
484
+ return documents.flatMap((doc) => {
485
+ const link = doc.derived_from?.find(
486
+ (d) => d.role === "translation" && d.doc_ext_id === plainId
487
+ );
488
+ return link ? [
489
+ {
490
+ id: doc.external_id,
491
+ name: doc.doc_metadata?.title || doc.file_name || doc.external_id,
492
+ createdAt: doc.created_at,
493
+ sourceVersion: link.version ?? null,
494
+ final: !!doc.derived_from?.some((d) => d.role === "final")
495
+ }
496
+ ] : [];
497
+ }).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
498
+ }, [documents, plainId]);
499
+ return { versions, translations };
500
+ }
501
+ var AnnotatedPdfViewer = react.lazy(
502
+ () => import('../document-tools/viewer/index.cjs').then((m) => ({ default: m.AnnotatedPdfViewer }))
503
+ );
504
+ var SignaturePlacementViewer = react.lazy(
505
+ () => import('../document-tools/viewer/index.cjs').then((m) => ({ default: m.SignaturePlacementViewer }))
506
+ );
507
+ var SignatureRequestEditor = react.lazy(
508
+ () => import('../document-tools/viewer/index.cjs').then((m) => ({ default: m.SignatureRequestEditor }))
509
+ );
510
+ var GuidedSigningViewer = react.lazy(
511
+ () => import('../document-tools/viewer/index.cjs').then((m) => ({ default: m.GuidedSigningViewer }))
512
+ );
513
+ function SessionPdfViewer(props) {
514
+ const session = react$1.useArbiSessionStore();
515
+ const viewingId = react$1.useArbiSessionState((s) => s.viewingDocument?.id);
516
+ const { isDetached } = chunkKLPRAQCE_cjs.useDocumentViewerSupport();
517
+ const onPageChange = react.useCallback(
518
+ (page) => {
519
+ if (viewingId) session.setViewingDocument({ id: viewingId, page });
520
+ },
521
+ [session, viewingId]
522
+ );
523
+ return /* @__PURE__ */ jsxRuntime.jsx(viewers.PdfViewer, { ...props, onPageChange, disableFontFace: !!isDetached });
524
+ }
525
+ function ViewerPdfPane({
526
+ documentId,
527
+ doc,
528
+ pdfBlob,
529
+ isPdfLoading,
530
+ pdfError,
531
+ onDownload,
532
+ viewerProps,
533
+ signatureFlow,
534
+ onSignatureFlow,
535
+ currentUserId,
536
+ placingSignature,
537
+ onPlacingDone,
538
+ annotating,
539
+ markup,
540
+ pdfSnapshotNumber,
541
+ isSigned
542
+ }) {
543
+ const { documentData, isDownloadOnly, isVideo, isAudio, isImage, isDocx } = doc;
544
+ const showMarkup = markup.hasMarkup && !markup.showOriginal;
545
+ if (isDownloadOnly) {
546
+ return /* @__PURE__ */ jsxRuntime.jsx(
547
+ chunkV4YZXGXR_cjs.ViewerPreviewUnavailable,
548
+ {
549
+ extension: fileExtension(documentData?.file_name),
550
+ onDownload
551
+ }
552
+ );
553
+ }
554
+ const loadingLabel = isVideo ? "Loading video..." : isAudio ? "Loading audio..." : isImage ? "Loading image..." : !documentData ? "Loading document..." : ui.friendlyFileType(documentData.file_type, documentData.file_name) === "Text" ? "Loading text..." : "Loading PDF...";
555
+ const errorLabel = isVideo ? "Failed to load video" : isAudio ? "Failed to load audio" : isImage ? "Failed to load image" : "Failed to load PDF";
556
+ if (isDocx && documentData && !["completed", "low-content", "failed"].includes(documentData.status || "")) {
557
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: "PDF and search indexing are processing. Open the DOCX tab to edit now." });
558
+ }
559
+ if (isPdfLoading) return /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: loadingLabel });
560
+ if (pdfError) {
561
+ return /* @__PURE__ */ jsxRuntime.jsx(
562
+ chunkV4YZXGXR_cjs.ViewerLoadError,
563
+ {
564
+ message: isVideo || isAudio || isImage ? `${errorLabel} \u2014 download it instead.` : "Couldn't display the PDF \u2014 download it instead.",
565
+ onDownload
566
+ }
567
+ );
568
+ }
569
+ if (!pdfBlob) return /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: loadingLabel });
570
+ if (isVideo) return /* @__PURE__ */ jsxRuntime.jsx(viewers.VideoViewer, { blob: pdfBlob, title: documentData?.file_name || "Video" });
571
+ if (isAudio) return /* @__PURE__ */ jsxRuntime.jsx(viewers.AudioViewer, { blob: pdfBlob, title: documentData?.file_name || "Audio" });
572
+ if (isImage) {
573
+ return /* @__PURE__ */ jsxRuntime.jsx(viewers.ImageViewer, { blob: pdfBlob, alt: documentData?.file_name || "Document image" });
574
+ }
575
+ if (signatureFlow?.kind === "prepare") {
576
+ return /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: "Loading\u2026" }), children: /* @__PURE__ */ jsxRuntime.jsx(
577
+ SignatureRequestEditor,
578
+ {
579
+ ...viewerProps,
580
+ file: pdfBlob,
581
+ documentId,
582
+ version: documentData?.current_version ?? void 0,
583
+ draft: signatureFlow.draft,
584
+ viewer: SessionPdfViewer,
585
+ onCancel: () => onSignatureFlow(null),
586
+ onSaved: () => onSignatureFlow(null)
587
+ }
588
+ ) });
589
+ }
590
+ if (signatureFlow?.kind === "sign" && currentUserId) {
591
+ const { currentPage: _page, scrollTrigger: _trigger, ...guidedProps } = viewerProps;
592
+ return /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: "Loading\u2026" }), children: /* @__PURE__ */ jsxRuntime.jsx(
593
+ GuidedSigningViewer,
594
+ {
595
+ ...guidedProps,
596
+ file: pdfBlob,
597
+ request: signatureFlow.request,
598
+ signer: currentUserId,
599
+ viewer: SessionPdfViewer,
600
+ onClose: () => onSignatureFlow(null),
601
+ onSigned: () => onSignatureFlow(null)
602
+ }
603
+ ) });
604
+ }
605
+ if (placingSignature) {
606
+ return /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: "Loading\u2026" }), children: /* @__PURE__ */ jsxRuntime.jsx(
607
+ SignaturePlacementViewer,
608
+ {
609
+ ...viewerProps,
610
+ file: pdfBlob,
611
+ documentId,
612
+ viewer: SessionPdfViewer,
613
+ onCancel: () => onPlacingDone(),
614
+ onContinue: (appearance) => onPlacingDone(appearance)
615
+ }
616
+ ) });
617
+ }
618
+ if (annotating || showMarkup) {
619
+ return /* @__PURE__ */ jsxRuntime.jsx(
620
+ react.Suspense,
621
+ {
622
+ fallback: /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: annotating ? "Loading annotation tools\u2026" : "Loading markup\u2026" }),
623
+ children: /* @__PURE__ */ jsxRuntime.jsx(
624
+ AnnotatedPdfViewer,
625
+ {
626
+ ...viewerProps,
627
+ file: pdfBlob,
628
+ documentId,
629
+ version: pdfSnapshotNumber,
630
+ editing: annotating,
631
+ onMarkupChange: markup.onMarkupChange,
632
+ fileName: documentData?.file_name,
633
+ shared: documentData?.shared ?? false,
634
+ folder: documentData?.folder,
635
+ viewer: SessionPdfViewer,
636
+ signed: isSigned
637
+ },
638
+ `${documentId}@${pdfSnapshotNumber ?? "current"}`
639
+ )
640
+ }
641
+ );
642
+ }
643
+ return /* @__PURE__ */ jsxRuntime.jsx(SessionPdfViewer, { ...viewerProps, file: pdfBlob });
644
+ }
645
+ var NativeDocxEditor = react.lazy(
646
+ () => import('../ConnectedNativeDocxEditor-OUWFMIPH.cjs').then((m) => ({
647
+ default: m.ConnectedNativeDocxEditor
648
+ }))
649
+ );
650
+ var StreamedWordArtifact = react.lazy(
651
+ () => import('../ConnectedStreamedWordArtifact-D5LSMDO4.cjs').then((m) => ({
652
+ default: m.ConnectedStreamedWordArtifact
653
+ }))
654
+ );
655
+ var NativeDocxComparison = react.lazy(
656
+ () => import('../ConnectedNativeDocxComparison-3XQSINPQ.cjs').then((m) => ({
657
+ default: m.ConnectedNativeDocxComparison
658
+ }))
659
+ );
660
+ var UPLOADED_NO_VERSIONS = "No earlier versions yet. Replacing, editing or signing this file adds a new version here.";
661
+ function canChangeVisibility(doc, userId) {
662
+ if (!doc || !userId) return false;
663
+ return userId.startsWith("agt-") || (doc.created_by_ext_id?.startsWith("agt-") ?? false) || doc.created_by_ext_id === userId;
664
+ }
665
+ function ConnectedDocumentViewer(props) {
666
+ const viewing = react$1.useArbiSessionState((s) => s.viewingDocument?.id);
667
+ const openedId = props.documentId ?? viewing;
668
+ if (!openedId) return null;
669
+ return /* @__PURE__ */ jsxRuntime.jsx(ConnectedDocumentToolsProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(DocumentViewerContent, { ...props, openedId }) });
670
+ }
671
+ function DocumentViewerContent({
672
+ openedId,
673
+ headerActions,
674
+ artifactRuntimeUrl = "/artifact-runtime/"
675
+ }) {
676
+ const arbi = react$1.useArbi();
677
+ const session = react$1.useArbiSessionStore();
678
+ const support = chunkKLPRAQCE_cjs.useDocumentViewerSupport();
679
+ const formatDate = support.formatDate ?? chunkKDG6FER6_cjs.fmtDate;
680
+ const tools = documentTools.useDocumentTools();
681
+ const { openConversation, notify } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
682
+ const { userId: currentUserId } = chunkGFNELPDP_cjs.useConnectedWorkspace();
683
+ const documentId = artifacts.parseVersionRef(openedId).docId;
684
+ const [totalPages, setTotalPages] = react.useState(0);
685
+ const [isCompact, setIsCompact] = react.useState(false);
686
+ const [pdfZoom, setPdfZoom] = react.useState(1);
687
+ const {
688
+ tab: zoomTab,
689
+ textScale,
690
+ compareId: compareDocumentId
691
+ } = react$1.useArbiSessionState((s) => s.documentViewer);
692
+ const zoom = zoomTab === "html" ? textScale : pdfZoom;
693
+ const setZoom = react.useCallback(
694
+ (next) => {
695
+ const value = typeof next === "function" ? next(zoom) : next;
696
+ if (zoomTab === "html") session.setDocumentViewer({ textScale: value });
697
+ else setPdfZoom(value);
698
+ },
699
+ [zoomTab, session, zoom]
700
+ );
701
+ const [scrollTrigger, setScrollTrigger] = react.useState(0);
702
+ const containerRef = react.useRef(null);
703
+ const viewingDocumentPage = react$1.useArbiSessionState((s) => s.viewingDocument?.page ?? null);
704
+ const setViewingDocumentPage = (page) => session.setViewingDocument({ id: openedId, page });
705
+ const setViewingDocumentId = (id) => session.setViewingDocument({ id });
706
+ const setActiveTab = (tab) => session.setDocumentViewer({ tab });
707
+ const setCompareDocumentId = (id) => session.setDocumentViewer({ compareId: id });
708
+ const { data: conversations } = chunkGAYMJWTC_cjs.useConnectedConversations();
709
+ const snapshotRef = artifacts.parseVersionRef(openedId).version ? openedId : null;
710
+ const { versions, translations } = useViewerVersions(documentId);
711
+ const currentVersionId = versions.find((v) => v.isCurrent)?.id ?? documentId;
712
+ const snapshotDocumentId = snapshotRef && snapshotRef !== currentVersionId ? snapshotRef : null;
713
+ const doc = useViewedDocument(documentId);
714
+ const setSnapshotDocumentId = (ref) => setViewingDocumentId(ref ?? documentId);
715
+ chunkJKB7WT7L_cjs.useRegisterOpenDocument({
716
+ documentId: doc.savedDocumentId,
717
+ shownId: openedId,
718
+ showLive: () => setViewingDocumentId(documentId),
719
+ workspaceId: doc.workspaceId
720
+ });
721
+ const {
722
+ documentData,
723
+ streamingDoc,
724
+ isStreaming,
725
+ draftDoc,
726
+ isDraft,
727
+ isCaptureDraft,
728
+ labelSummaries,
729
+ isImage,
730
+ isVideo,
731
+ isAudio,
732
+ isMedia,
733
+ isArtifact,
734
+ liveKind,
735
+ liveSource,
736
+ isDocx,
737
+ isXlsx,
738
+ isDownloadOnly
739
+ } = doc;
740
+ const threadTitle = (id) => conversations.find((c) => c.external_id === id)?.title?.trim() || "Its thread";
741
+ const madeInId = documentData?.conversation_ext_id ?? null;
742
+ const madeIn = madeInId ? { id: madeInId, title: threadTitle(madeInId) } : null;
743
+ const pdfSnapshotId = snapshotDocumentId && !isDocx && !isArtifact ? snapshotDocumentId : null;
744
+ const shownDocumentId = pdfSnapshotId || documentId;
745
+ const blobs = useViewerBlobs(shownDocumentId, doc);
746
+ const { pdfBlob, xlsxBlob, xlsxError, handleDirectDownload } = blobs;
747
+ const [annotating, setAnnotating] = react.useState(false);
748
+ react.useEffect(() => setAnnotating(false), [documentId]);
749
+ const hasHistory = versions.length > 1 || (documentData?.current_version ?? 1) > 1 || translations.length > 0;
750
+ const { activeTab, handleTabChange, viewerTabs } = useViewerTabs(doc, isCompact, hasHistory);
751
+ const crop = useImageCrop(documentId, documentData?.file_name, pdfBlob);
752
+ const [placingSignature, setPlacingSignature] = react.useState(false);
753
+ const [signAppearance, setSignAppearance] = react.useState();
754
+ const [isSignOpen, setIsSignOpen] = react.useState(false);
755
+ react.useEffect(() => setPlacingSignature(false), [documentId, snapshotDocumentId]);
756
+ const [signatureFlow, setSignatureFlow] = react.useState(null);
757
+ react.useEffect(() => setSignatureFlow(null), [documentId, snapshotDocumentId]);
758
+ const { data: signatureStatus } = documentTools.useDocumentSignatures(shownDocumentId, !isDraft && !liveKind);
759
+ const isCoEditing = !snapshotDocumentId && !compareDocumentId && !isDraft && (activeTab === "docx" && isDocx || activeTab === "edit" && isArtifact && !liveKind && !isStreaming);
760
+ const currentVersionLabel = isCoEditing ? void 0 : !snapshotDocumentId && !compareDocumentId && (isDocx || isArtifact && !liveKind) ? "Live" : artifacts.versionLabel(versions, snapshotDocumentId || documentId);
761
+ const compareVersionLabel = artifacts.versionLabel(versions, compareDocumentId);
762
+ const snapshotNumber = artifacts.findVersion(versions, snapshotDocumentId)?.number;
763
+ const pdfSnapshotNumber = pdfSnapshotId ? snapshotNumber : void 0;
764
+ const isSigned = !!signatureStatus?.signed;
765
+ const markup = documentTools.useDocumentMarkup(documentData, pdfSnapshotNumber, isSigned);
766
+ react.useEffect(() => {
767
+ const container = containerRef.current;
768
+ if (!container) return;
769
+ const resizeObserver = new ResizeObserver((entries) => {
770
+ for (const entry of entries) setIsCompact(entry.contentRect.width < 640);
771
+ });
772
+ resizeObserver.observe(container);
773
+ return () => resizeObserver.disconnect();
774
+ }, []);
775
+ const handleLoadSuccess = react.useCallback((numPages) => setTotalPages(numPages), []);
776
+ const goToPage = (page) => {
777
+ setViewingDocumentPage(page);
778
+ setScrollTrigger((prev) => prev + 1);
779
+ };
780
+ const stepPage = (delta) => {
781
+ const next = (viewingDocumentPage || 1) + delta;
782
+ if (next >= 1 && next <= totalPages) goToPage(next);
783
+ };
784
+ const documentTitle = streamingDoc?.title || draftDoc?.title || documentData?.doc_metadata?.title || documentData?.file_name || "Document";
785
+ const pageNav = totalPages > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
786
+ /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerZoomControl, { zoom, onCycle: () => setZoom(viewers.cycleZoom(zoom)) }),
787
+ /* @__PURE__ */ jsxRuntime.jsx(
788
+ chunkV4YZXGXR_cjs.PdfPageNav,
789
+ {
790
+ canPrev: (viewingDocumentPage || 1) > 1,
791
+ canNext: (viewingDocumentPage || 1) < totalPages,
792
+ onPrev: () => stepPage(-1),
793
+ onNext: () => stepPage(1),
794
+ counter: /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerPageCounter, { page: viewingDocumentPage || 1, total: totalPages, onGoTo: goToPage })
795
+ }
796
+ )
797
+ ] });
798
+ const isComparing = !!compareDocumentId;
799
+ const compareTarget = compareDocumentId ? artifacts.parseVersionRef(compareDocumentId).docId : null;
800
+ const compareIndicator = isComparing && compareTarget && /* @__PURE__ */ jsxRuntime.jsx(
801
+ chunk2YV7FBLO_cjs.ArtifactCompareBar,
802
+ {
803
+ compareTarget: support.renderDocumentPill?.(compareTarget) ?? compareTarget,
804
+ versionLabel: compareVersionLabel,
805
+ mode: "flip",
806
+ showTrackChanges: false,
807
+ onToggleTrackChanges: () => {
808
+ },
809
+ onFlip: () => {
810
+ setViewingDocumentId(compareDocumentId);
811
+ setCompareDocumentId(documentId);
812
+ },
813
+ onStop: () => setCompareDocumentId(null)
814
+ }
815
+ );
816
+ const titleBlock = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
817
+ isDraft ? support.renderDraftTitle?.(documentId) : /* @__PURE__ */ jsxRuntime.jsx(
818
+ chunkV4YZXGXR_cjs.ViewerTitle,
819
+ {
820
+ title: documentTitle,
821
+ versionLabel: currentVersionLabel,
822
+ shrink: !!liveKind || isCompact
823
+ }
824
+ ),
825
+ isCompact && !isDraft && documentData?.shared && /* @__PURE__ */ jsxRuntime.jsx(chunkUWIILWDI_cjs.ViewerStatusNote, { testId: "document-shared-status", children: "Shared with the workspace" }),
826
+ isCompact && activeTab === "pdf" && pdfBlob && markup.hasMarkup && !annotating && !placingSignature && /* @__PURE__ */ jsxRuntime.jsx(
827
+ chunkD3WFIFRY_cjs.MarkupViewNote,
828
+ {
829
+ showOriginal: markup.showOriginal,
830
+ onToggle: () => markup.setShowOriginal((on) => !on)
831
+ }
832
+ ),
833
+ !isComparing && !liveKind && documentData && support.renderRelated?.(documentData),
834
+ isStreaming && /* @__PURE__ */ jsxRuntime.jsx(chunkUWIILWDI_cjs.ViewerStatusNote, { pulse: true, children: "streaming..." }),
835
+ isDraft && /* @__PURE__ */ jsxRuntime.jsx(chunkUWIILWDI_cjs.ViewerStatusNote, { testId: "draft-unsaved-indicator", children: "Draft \u2014 not saved" }),
836
+ signatureStatus?.signed && /* @__PURE__ */ jsxRuntime.jsx(chunkD3WFIFRY_cjs.SignatureStatus, { status: signatureStatus, formatDate })
837
+ ] });
838
+ const leftContent = /* @__PURE__ */ jsxRuntime.jsxs(chunkUWIILWDI_cjs.ViewerHeaderStart, { children: [
839
+ isDraft ? (
840
+ // A draft's kind replaces the tabs: neither Versions nor the text view means anything
841
+ // before the first save.
842
+ support.renderDraftKind?.(documentId)
843
+ ) : /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerTabBar, { tabs: viewerTabs, activeId: activeTab, onChange: handleTabChange }),
844
+ !isCompact && titleBlock
845
+ ] });
846
+ const annotatable = documentTools.canAnnotate({
847
+ activeTab,
848
+ hasPdf: !!pdfBlob,
849
+ isImage,
850
+ isVideo,
851
+ isAudio,
852
+ isDownloadOnly,
853
+ isDraft,
854
+ isStreaming,
855
+ isSnapshot: !!snapshotDocumentId,
856
+ isComparing
857
+ });
858
+ const signatureBanner = !isDraft && !liveKind && !snapshotDocumentId && /* @__PURE__ */ jsxRuntime.jsx(
859
+ chunkD3WFIFRY_cjs.SignatureRequestBanner,
860
+ {
861
+ documentId,
862
+ hidden: !!signatureFlow,
863
+ onSign: (request) => {
864
+ setAnnotating(false);
865
+ setPlacingSignature(false);
866
+ if (activeTab !== "pdf") handleTabChange("pdf");
867
+ setSignatureFlow({ kind: "sign", request });
868
+ },
869
+ onEditDraft: (draft) => {
870
+ if (activeTab !== "pdf") handleTabChange("pdf");
871
+ setSignatureFlow({ kind: "prepare", draft });
872
+ }
873
+ }
874
+ );
875
+ const share = () => {
876
+ const name = (liveKind ? documentTitle : documentData?.file_name) || void 0;
877
+ if (support.share) {
878
+ support.share({ id: documentId, name, isPrivate: !documentData?.shared });
879
+ return;
880
+ }
881
+ void arbi.documents.update([{ external_id: documentId, shared: !documentData?.shared }]).then(() => tools.onDocumentsChanged?.([documentId], "markup")).catch(() => notify("Couldn't change who can see this document", "error"));
882
+ };
883
+ const shownRef = snapshotDocumentId || documentId;
884
+ const rightContent = /* @__PURE__ */ jsxRuntime.jsxs(chunkUWIILWDI_cjs.ViewerHeaderEnd, { isCompact, children: [
885
+ annotatable && /* @__PURE__ */ jsxRuntime.jsx(
886
+ chunkD3WFIFRY_cjs.AnnotateButton,
887
+ {
888
+ active: annotating,
889
+ compact: isCompact,
890
+ onClick: () => {
891
+ setPlacingSignature(false);
892
+ markup.setShowOriginal(false);
893
+ setAnnotating((on) => !on);
894
+ }
895
+ }
896
+ ),
897
+ activeTab === "pdf" && pdfBlob && !placingSignature && (markup.hasMarkup || annotating) && /* @__PURE__ */ jsxRuntime.jsx(
898
+ chunkD3WFIFRY_cjs.ShowOriginalButton,
899
+ {
900
+ active: markup.showOriginal,
901
+ compact: isCompact,
902
+ onClick: () => {
903
+ setAnnotating(false);
904
+ markup.setShowOriginal((on) => !on);
905
+ }
906
+ }
907
+ ),
908
+ activeTab === "pdf" && markup.hasMarkup && !annotating && /* @__PURE__ */ jsxRuntime.jsx(
909
+ chunkD3WFIFRY_cjs.DownloadMarkupButton,
910
+ {
911
+ onClick: () => void markup.downloadMarkup(),
912
+ disabledReason: isSigned ? documentTools.SIGNED_LOCKED_REASON : void 0
913
+ }
914
+ ),
915
+ activeTab === "pdf" && isImage && pdfBlob && /* @__PURE__ */ jsxRuntime.jsx(
916
+ chunkV4YZXGXR_cjs.ViewerImageActions,
917
+ {
918
+ compact: isCompact,
919
+ onUseAsReference: support.useImageAsReference ? () => support.useImageAsReference(documentId) : void 0,
920
+ onCrop: crop.handleOpenCrop
921
+ }
922
+ ),
923
+ madeIn && /* @__PURE__ */ jsxRuntime.jsxs(
924
+ ui.Button,
925
+ {
926
+ type: "button",
927
+ variant: "outline",
928
+ size: isCompact ? "icon" : "sm",
929
+ onClick: () => openConversation(madeIn.id, {
930
+ messageId: documentData?.source_message_ext_id ?? void 0
931
+ }),
932
+ title: `Open the thread it was made in: ${madeIn.title}`,
933
+ "aria-label": `Open the thread it was made in: ${madeIn.title}`,
934
+ "data-testid": "document-open-thread",
935
+ children: [
936
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageSquare, { className: "size-4" }),
937
+ !isCompact && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[10rem] truncate", children: madeIn.title })
938
+ ]
939
+ }
940
+ ),
941
+ documentId && doc.workspaceId && /* @__PURE__ */ jsxRuntime.jsx(
942
+ chunkVLCY46K6_cjs.ShareControl,
943
+ {
944
+ state: documentData?.shared ? "shared" : "private",
945
+ onToggle: share,
946
+ disabled: !canChangeVisibility(documentData, currentUserId),
947
+ disabledTooltip: "Only the owner can change visibility",
948
+ tooltip: documentData?.shared ? "Shared with the workspace \u2014 click to share with specific people" : "Share with the workspace, then optionally notify specific people by email",
949
+ variant: "outline",
950
+ compact: isCompact,
951
+ showState: !isCompact,
952
+ labels: {
953
+ shared: ui.getEntityLabel("WORKSPACE"),
954
+ private: "Only you",
955
+ mixed: "Partly shared"
956
+ },
957
+ testId: "share-document-button",
958
+ stateTestId: "document-title-shared-indicator"
959
+ }
960
+ ),
961
+ tools.emailDocument && !isDraft && !isStreaming && documentData?.file_name && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
962
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mx-1 h-5 w-px bg-border", "aria-hidden": "true" }),
963
+ /* @__PURE__ */ jsxRuntime.jsxs(
964
+ ui.Button,
965
+ {
966
+ type: "button",
967
+ variant: "outline",
968
+ size: isCompact ? "icon" : "sm",
969
+ title: "Email this document",
970
+ "aria-label": "Email",
971
+ "data-testid": "email-document-button",
972
+ className: "pointer-coarse:min-h-11",
973
+ onClick: () => tools.emailDocument?.(shownRef),
974
+ children: [
975
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mail, { className: "size-4" }),
976
+ !isCompact && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1", children: "Email" })
977
+ ]
978
+ }
979
+ )
980
+ ] }),
981
+ support.translate && !isDraft && !isStreaming && !liveKind && !isImage && documentData?.file_name && /* @__PURE__ */ jsxRuntime.jsxs(
982
+ ui.Button,
983
+ {
984
+ type: "button",
985
+ variant: "outline",
986
+ size: isCompact ? "icon" : "sm",
987
+ title: "Translate into another language: a new editable document, original and translation side by side",
988
+ "aria-label": "Translate",
989
+ "data-testid": "translate-document-button",
990
+ className: "pointer-coarse:min-h-11",
991
+ onClick: () => support.translate(shownRef),
992
+ children: [
993
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Languages, { className: "size-4" }),
994
+ !isCompact && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1", children: "Translate" })
995
+ ]
996
+ }
997
+ ),
998
+ !isStreaming && !snapshotDocumentId && /* @__PURE__ */ jsxRuntime.jsx(FinaliseTranslationButton, { document: documentData ?? void 0, isCompact }),
999
+ annotatable && /* @__PURE__ */ jsxRuntime.jsx(
1000
+ chunkD3WFIFRY_cjs.SignButton,
1001
+ {
1002
+ active: placingSignature,
1003
+ compact: isCompact,
1004
+ onClick: () => {
1005
+ setAnnotating(false);
1006
+ setSignatureFlow(null);
1007
+ setPlacingSignature((on) => !on);
1008
+ }
1009
+ }
1010
+ ),
1011
+ annotatable && !isSigned && /* @__PURE__ */ jsxRuntime.jsx(
1012
+ chunkD3WFIFRY_cjs.RequestSignaturesButton,
1013
+ {
1014
+ active: signatureFlow?.kind === "prepare",
1015
+ compact: isCompact,
1016
+ onClick: () => {
1017
+ setAnnotating(false);
1018
+ setPlacingSignature(false);
1019
+ setSignatureFlow(signatureFlow?.kind === "prepare" ? null : { kind: "prepare" });
1020
+ }
1021
+ }
1022
+ ),
1023
+ isSignOpen && pdfBlob && /* @__PURE__ */ jsxRuntime.jsx(
1024
+ chunkJH6JTI76_cjs.SignDocumentDialog,
1025
+ {
1026
+ open: isSignOpen,
1027
+ onOpenChange: setIsSignOpen,
1028
+ documentId,
1029
+ pdfBlob,
1030
+ version: documentData?.current_version ?? void 0,
1031
+ appearance: signAppearance
1032
+ }
1033
+ ),
1034
+ headerActions
1035
+ ] });
1036
+ const viewerProps = {
1037
+ currentPage: viewingDocumentPage || void 0,
1038
+ onLoadSuccess: handleLoadSuccess,
1039
+ scrollTrigger,
1040
+ zoom,
1041
+ onZoomChange: setZoom
1042
+ };
1043
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1044
+ chunkV4YZXGXR_cjs.ViewerFrame,
1045
+ {
1046
+ frameRef: containerRef,
1047
+ contentId: documentId,
1048
+ header: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1049
+ /* @__PURE__ */ jsxRuntime.jsx(
1050
+ chunk7RGLTF76_cjs.TabHeader,
1051
+ {
1052
+ tabs: [],
1053
+ activeTabId: activeTab,
1054
+ onTabChange: handleTabChange,
1055
+ leftContent,
1056
+ rightContent,
1057
+ variant: "underline"
1058
+ }
1059
+ ),
1060
+ isCompact && !isCoEditing && /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "viewer-title-row", className: "flex min-w-0 items-center gap-2 px-3 pb-2", children: titleBlock }),
1061
+ snapshotDocumentId && /* @__PURE__ */ jsxRuntime.jsx(
1062
+ chunkD3WFIFRY_cjs.VersionSnapshotBar,
1063
+ {
1064
+ versionNumber: snapshotNumber,
1065
+ live: isDocx || isArtifact,
1066
+ onAsk: support.askAboutVersion ? () => support.askAboutVersion(snapshotDocumentId) : void 0,
1067
+ onReturn: () => setSnapshotDocumentId(null)
1068
+ }
1069
+ )
1070
+ ] }),
1071
+ compareRow: isComparing ? compareIndicator || void 0 : void 0,
1072
+ footer: (
1073
+ // Crop to a new document. Full resolution (no maxSize): a crop frames, it never downscales.
1074
+ /* @__PURE__ */ jsxRuntime.jsx(
1075
+ react$1.ImageCropModal,
1076
+ {
1077
+ open: crop.cropImageUrl !== null,
1078
+ image: crop.cropImageUrl,
1079
+ title: "Crop image",
1080
+ saveLabel: "Save as a copy",
1081
+ aspectOptions: react$1.DEFAULT_ASPECT_OPTIONS,
1082
+ output: { mimeType: "image/png" },
1083
+ onComplete: crop.handleCropComplete,
1084
+ onCancel: crop.closeCrop
1085
+ }
1086
+ )
1087
+ ),
1088
+ children: [
1089
+ isComparing && /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: "Loading comparison\u2026" }), children: /* @__PURE__ */ jsxRuntime.jsx(
1090
+ NativeDocxComparison,
1091
+ {
1092
+ baseId: compareDocumentId,
1093
+ revisedId: documentId,
1094
+ title: documentTitle
1095
+ }
1096
+ ) }),
1097
+ isCaptureDraft && support.renderCaptureDraft?.(documentId),
1098
+ !isCaptureDraft && (activeTab === "pdf" || isMedia && activeTab === "html") && !isArtifact && !isComparing && /* @__PURE__ */ jsxRuntime.jsxs(chunkUWIILWDI_cjs.ViewerPane, { hidden: activeTab !== "pdf", children: [
1099
+ /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.DocumentLabelBar, { summaries: labelSummaries }),
1100
+ !isMedia && !isImage && signatureBanner,
1101
+ activeTab === "pdf" && !isMedia && !isImage && /* @__PURE__ */ jsxRuntime.jsx(
1102
+ chunkD3WFIFRY_cjs.MarkupNotices,
1103
+ {
1104
+ legacyPrompt: markup.legacyPrompt,
1105
+ olderNote: markup.olderNote,
1106
+ onOpenVersion: (n) => setSnapshotDocumentId(`${documentId}@v${n}`)
1107
+ }
1108
+ ),
1109
+ /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerControlBar, { controls: activeTab === "pdf" && pageNav, children: /* @__PURE__ */ jsxRuntime.jsx(
1110
+ ViewerPdfPane,
1111
+ {
1112
+ documentId,
1113
+ doc,
1114
+ pdfBlob,
1115
+ isPdfLoading: blobs.isPdfLoading,
1116
+ pdfError: blobs.pdfError,
1117
+ onDownload: () => void handleDirectDownload(),
1118
+ viewerProps,
1119
+ signatureFlow,
1120
+ onSignatureFlow: setSignatureFlow,
1121
+ currentUserId,
1122
+ placingSignature,
1123
+ onPlacingDone: (appearance) => {
1124
+ setPlacingSignature(false);
1125
+ if (!appearance) return;
1126
+ setSignAppearance(appearance);
1127
+ setIsSignOpen(true);
1128
+ },
1129
+ annotating,
1130
+ markup,
1131
+ pdfSnapshotNumber,
1132
+ isSigned
1133
+ }
1134
+ ) })
1135
+ ] }),
1136
+ activeTab === "preview" && isArtifact && liveKind && // The preview loads its JSX compiler on first use, so it stays out of the main bundle.
1137
+ /* @__PURE__ */ jsxRuntime.jsx(
1138
+ chunk2YV7FBLO_cjs.ArtifactPreview,
1139
+ {
1140
+ kind: liveKind,
1141
+ source: liveSource,
1142
+ isStreaming,
1143
+ runtimeUrl: artifactRuntimeUrl
1144
+ }
1145
+ ),
1146
+ activeTab === "edit" && isArtifact && liveKind && /* @__PURE__ */ jsxRuntime.jsx(chunk2YV7FBLO_cjs.ArtifactCodeView, { source: liveSource, fileName: documentData?.file_name ?? void 0 }),
1147
+ activeTab === "edit" && isArtifact && !liveKind && !isStreaming && !isComparing && /* @__PURE__ */ jsxRuntime.jsxs(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: "Loading editor\u2026" }), children: [
1148
+ isSigned && !snapshotDocumentId && /* @__PURE__ */ jsxRuntime.jsx(chunkD3WFIFRY_cjs.SignedEditNote, {}),
1149
+ /* @__PURE__ */ jsxRuntime.jsx(
1150
+ NativeDocxEditor,
1151
+ {
1152
+ documentId: snapshotDocumentId || documentId,
1153
+ title: documentTitle,
1154
+ draftContent: isDraft ? draftDoc?.content || "" : void 0,
1155
+ snapshot: !!snapshotDocumentId,
1156
+ onSaved: (id) => {
1157
+ if (!isDraft) return;
1158
+ support.onDraftSaved?.(documentId, id);
1159
+ setViewingDocumentId(id);
1160
+ }
1161
+ },
1162
+ `${snapshotDocumentId || documentId}-${snapshotDocumentId ? "snapshot" : "live"}`
1163
+ )
1164
+ ] }),
1165
+ activeTab === "versions" && (isArtifact || isDocx || hasHistory) && !isComparing && /* @__PURE__ */ jsxRuntime.jsx(
1166
+ chunk2YV7FBLO_cjs.VersionTimeline,
1167
+ {
1168
+ versions: versions.map((v) => ({
1169
+ ...v,
1170
+ madeIn: v.thread ? {
1171
+ label: threadTitle(v.thread.conversationId),
1172
+ onOpen: () => openConversation(v.thread.conversationId, {
1173
+ messageId: v.thread.messageId ?? void 0
1174
+ })
1175
+ } : null
1176
+ })),
1177
+ currentId: currentVersionId,
1178
+ live: !!liveKind,
1179
+ labels: isArtifact ? void 0 : { emptyDocument: UPLOADED_NO_VERSIONS },
1180
+ formatDate,
1181
+ onOpen: (id) => {
1182
+ setSnapshotDocumentId(id === currentVersionId ? null : id);
1183
+ setActiveTab(isArtifact ? "edit" : isDocx ? "docx" : "pdf");
1184
+ },
1185
+ onCompare: (id) => session.setDocumentViewer({ compareId: id, tab: "html" }),
1186
+ translations,
1187
+ onOpenTranslation: (id) => setViewingDocumentId(id)
1188
+ }
1189
+ ),
1190
+ activeTab === "xlsx" && isXlsx && (xlsxBlob ? /* @__PURE__ */ jsxRuntime.jsx(viewers.XlsxViewer, { blob: xlsxBlob }) : /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: xlsxError ? "Failed to load spreadsheet" : "Loading spreadsheet..." })),
1191
+ activeTab === "docx" && isDocx && !isComparing && /* @__PURE__ */ jsxRuntime.jsxs(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: "Loading editor\u2026" }), children: [
1192
+ signatureBanner,
1193
+ isSigned && !snapshotDocumentId && /* @__PURE__ */ jsxRuntime.jsx(chunkD3WFIFRY_cjs.SignedEditNote, {}),
1194
+ /* @__PURE__ */ jsxRuntime.jsx(
1195
+ NativeDocxEditor,
1196
+ {
1197
+ documentId: snapshotDocumentId || documentId,
1198
+ title: documentTitle,
1199
+ snapshot: !!snapshotDocumentId
1200
+ },
1201
+ `${snapshotDocumentId || documentId}-${snapshotDocumentId ? "snapshot" : "live"}`
1202
+ )
1203
+ ] }),
1204
+ streamingDoc && isStreaming && isArtifact && !liveKind && !isComparing && (activeTab === "html" || activeTab === "edit") && /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerMessage, { children: "Opening draft\u2026" }), children: /* @__PURE__ */ jsxRuntime.jsx(
1205
+ StreamedWordArtifact,
1206
+ {
1207
+ documentId: documentId.startsWith("doc-") ? documentId : void 0,
1208
+ title: documentTitle,
1209
+ content: streamingDoc.content,
1210
+ busy: isStreaming
1211
+ },
1212
+ documentId
1213
+ ) }),
1214
+ !isCaptureDraft && !isComparing && activeTab === "html" && !(isStreaming && isArtifact && !liveKind) && support.renderParsedView && /* @__PURE__ */ jsxRuntime.jsx(chunkUWIILWDI_cjs.ViewerPane, { children: /* @__PURE__ */ jsxRuntime.jsx(chunkV4YZXGXR_cjs.ViewerControlBar, { controls: pageNav, children: support.renderParsedView({
1215
+ documentId: pdfSnapshotId || documentId,
1216
+ onLoadSuccess: handleLoadSuccess,
1217
+ scrollTrigger,
1218
+ zoom,
1219
+ onZoomChange: setZoom
1220
+ }) }) })
1221
+ ]
1222
+ }
1223
+ );
1224
+ }
1225
+
1226
+ exports.ConnectedDocumentToolsProvider = ConnectedDocumentToolsProvider;
1227
+ exports.ConnectedDocumentViewer = ConnectedDocumentViewer;
1228
+ //# sourceMappingURL=viewer.cjs.map
1229
+ //# sourceMappingURL=viewer.cjs.map