@arbidocs/blocks 0.5.115 → 0.5.117

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 (147) hide show
  1. package/dist/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-OZBTU3IT.cjs} +20 -20
  2. package/dist/{ConnectedCallDock-WER7R222.cjs.map → ConnectedCallDock-OZBTU3IT.cjs.map} +1 -1
  3. package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-VMZE2NFP.cjs} +13 -13
  4. package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-VMZE2NFP.cjs.map} +1 -1
  5. package/dist/{ConnectedNativeDocxComparison-YXMYJWXY.cjs → ConnectedNativeDocxComparison-7OUKTKYP.cjs} +20 -20
  6. package/dist/{ConnectedNativeDocxComparison-YXMYJWXY.cjs.map → ConnectedNativeDocxComparison-7OUKTKYP.cjs.map} +1 -1
  7. package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
  8. package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
  9. package/dist/{ConnectedStreamedWordArtifact-2RTCHVPI.cjs → ConnectedStreamedWordArtifact-7V24ZDAC.cjs} +20 -20
  10. package/dist/{ConnectedStreamedWordArtifact-2RTCHVPI.cjs.map → ConnectedStreamedWordArtifact-7V24ZDAC.cjs.map} +1 -1
  11. package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-OCPFVMLD.cjs} +15 -15
  12. package/dist/{DocumentReviewCard-ZSBZBGFK.cjs.map → DocumentReviewCard-OCPFVMLD.cjs.map} +1 -1
  13. package/dist/{FilesViewerDialog-I5QIHQZT.cjs → FilesViewerDialog-KLRDIYEH.cjs} +45 -45
  14. package/dist/{FilesViewerDialog-I5QIHQZT.cjs.map → FilesViewerDialog-KLRDIYEH.cjs.map} +1 -1
  15. package/dist/{NativeDocxEditor-H6TAEVGY.cjs → NativeDocxEditor-2LQY2CTV.cjs} +6 -6
  16. package/dist/{NativeDocxEditor-H6TAEVGY.cjs.map → NativeDocxEditor-2LQY2CTV.cjs.map} +1 -1
  17. package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-IMAZICIZ.cjs} +8 -8
  18. package/dist/{WorkspaceTableView-J3C6VH4T.cjs.map → WorkspaceTableView-IMAZICIZ.cjs.map} +1 -1
  19. package/dist/agents/index.cjs +297 -297
  20. package/dist/{ai-IM4A23YT.cjs → ai-7U4B4CVF.cjs} +24 -24
  21. package/dist/ai-7U4B4CVF.cjs.map +1 -0
  22. package/dist/calls/index.cjs +121 -121
  23. package/dist/chat/index.cjs +1 -1
  24. package/dist/{chunk-M6IKVKU5.cjs → chunk-2CSLFAGF.cjs} +392 -149
  25. package/dist/chunk-2CSLFAGF.cjs.map +1 -0
  26. package/dist/{chunk-SGYSDABK.cjs → chunk-2W5E62EY.cjs} +6 -6
  27. package/dist/{chunk-SGYSDABK.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
  28. package/dist/{chunk-P77YTTJ3.cjs → chunk-3ODEWSRO.cjs} +4 -4
  29. package/dist/{chunk-P77YTTJ3.cjs.map → chunk-3ODEWSRO.cjs.map} +1 -1
  30. package/dist/{chunk-DDIW4HLU.cjs → chunk-3U36VYMD.cjs} +27 -27
  31. package/dist/{chunk-DDIW4HLU.cjs.map → chunk-3U36VYMD.cjs.map} +1 -1
  32. package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
  33. package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
  34. package/dist/{chunk-NY3YUCOW.cjs → chunk-4NPCDS2X.cjs} +3 -3
  35. package/dist/{chunk-NY3YUCOW.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
  36. package/dist/{chunk-BQ5RIWWT.cjs → chunk-4VZZWYEC.cjs} +3 -3
  37. package/dist/{chunk-BQ5RIWWT.cjs.map → chunk-4VZZWYEC.cjs.map} +1 -1
  38. package/dist/{chunk-Y24V6HPR.cjs → chunk-57EE6CMW.cjs} +15 -15
  39. package/dist/{chunk-Y24V6HPR.cjs.map → chunk-57EE6CMW.cjs.map} +1 -1
  40. package/dist/{chunk-NNUK5ZM7.cjs → chunk-5QUL5BZO.cjs} +4 -4
  41. package/dist/{chunk-NNUK5ZM7.cjs.map → chunk-5QUL5BZO.cjs.map} +1 -1
  42. package/dist/{chunk-OEREKAAP.cjs → chunk-6DCIZA3X.cjs} +75 -75
  43. package/dist/{chunk-OEREKAAP.cjs.map → chunk-6DCIZA3X.cjs.map} +1 -1
  44. package/dist/{chunk-YGXOKB5Z.cjs → chunk-7TEUGFIL.cjs} +4 -4
  45. package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-7TEUGFIL.cjs.map} +1 -1
  46. package/dist/{chunk-TT4IF52H.cjs → chunk-7X3FS5HQ.cjs} +35 -35
  47. package/dist/{chunk-TT4IF52H.cjs.map → chunk-7X3FS5HQ.cjs.map} +1 -1
  48. package/dist/{chunk-CPR6EHG7.cjs → chunk-7XT5B2DZ.cjs} +47 -47
  49. package/dist/{chunk-CPR6EHG7.cjs.map → chunk-7XT5B2DZ.cjs.map} +1 -1
  50. package/dist/chunk-BKY2LAV2.cjs +18 -0
  51. package/dist/{chunk-CIHERNDO.cjs.map → chunk-BKY2LAV2.cjs.map} +1 -1
  52. package/dist/{chunk-XKVPSOKP.cjs → chunk-BW5MF464.cjs} +4 -4
  53. package/dist/{chunk-XKVPSOKP.cjs.map → chunk-BW5MF464.cjs.map} +1 -1
  54. package/dist/{chunk-IW7CDJTA.cjs → chunk-COD5ENHK.cjs} +4 -4
  55. package/dist/{chunk-IW7CDJTA.cjs.map → chunk-COD5ENHK.cjs.map} +1 -1
  56. package/dist/{chunk-A3T3IC3K.cjs → chunk-D7ICHGWM.cjs} +239 -85
  57. package/dist/chunk-D7ICHGWM.cjs.map +1 -0
  58. package/dist/{chunk-TDO5UWXF.cjs → chunk-E4BLRF2L.cjs} +5 -5
  59. package/dist/{chunk-TDO5UWXF.cjs.map → chunk-E4BLRF2L.cjs.map} +1 -1
  60. package/dist/{chunk-WR2SF44W.cjs → chunk-E4DUXU5K.cjs} +9 -9
  61. package/dist/{chunk-WR2SF44W.cjs.map → chunk-E4DUXU5K.cjs.map} +1 -1
  62. package/dist/{chunk-WAV762GP.cjs → chunk-GQXPNIRE.cjs} +6 -6
  63. package/dist/{chunk-WAV762GP.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
  64. package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
  65. package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
  66. package/dist/{chunk-6UTKM5AB.cjs → chunk-JSQQV23D.cjs} +3 -3
  67. package/dist/{chunk-6UTKM5AB.cjs.map → chunk-JSQQV23D.cjs.map} +1 -1
  68. package/dist/{chunk-557MJ4IH.cjs → chunk-LFRNBT2I.cjs} +20 -20
  69. package/dist/{chunk-557MJ4IH.cjs.map → chunk-LFRNBT2I.cjs.map} +1 -1
  70. package/dist/{chunk-R7CJEIA5.cjs → chunk-LYTIQQQ2.cjs} +3 -3
  71. package/dist/{chunk-R7CJEIA5.cjs.map → chunk-LYTIQQQ2.cjs.map} +1 -1
  72. package/dist/{chunk-CPG7II4E.cjs → chunk-MC4F2URI.cjs} +28 -28
  73. package/dist/{chunk-CPG7II4E.cjs.map → chunk-MC4F2URI.cjs.map} +1 -1
  74. package/dist/{chunk-WXUU3COI.cjs → chunk-MZ2KZXNU.cjs} +3 -3
  75. package/dist/{chunk-WXUU3COI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
  76. package/dist/{chunk-ZTXQIIFV.cjs → chunk-OZVDOAXG.cjs} +6 -6
  77. package/dist/{chunk-ZTXQIIFV.cjs.map → chunk-OZVDOAXG.cjs.map} +1 -1
  78. package/dist/{chunk-325GVZE6.cjs → chunk-Q6DQGGP4.cjs} +3 -3
  79. package/dist/{chunk-325GVZE6.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
  80. package/dist/{chunk-KTQOGT2L.cjs → chunk-TDN33HSK.cjs} +6 -6
  81. package/dist/{chunk-KTQOGT2L.cjs.map → chunk-TDN33HSK.cjs.map} +1 -1
  82. package/dist/{chunk-T23UTIRI.cjs → chunk-UNDQYTRF.cjs} +6 -6
  83. package/dist/{chunk-T23UTIRI.cjs.map → chunk-UNDQYTRF.cjs.map} +1 -1
  84. package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
  85. package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
  86. package/dist/{chunk-24EDG4PC.cjs → chunk-VBL3SHWX.cjs} +50 -50
  87. package/dist/{chunk-24EDG4PC.cjs.map → chunk-VBL3SHWX.cjs.map} +1 -1
  88. package/dist/{chunk-3A7QWUAW.cjs → chunk-VKH3BEZE.cjs} +3 -3
  89. package/dist/{chunk-3A7QWUAW.cjs.map → chunk-VKH3BEZE.cjs.map} +1 -1
  90. package/dist/{chunk-X5LANJDZ.cjs → chunk-VTYJAZDU.cjs} +23 -15
  91. package/dist/chunk-VTYJAZDU.cjs.map +1 -0
  92. package/dist/{chunk-B3LZITVF.cjs → chunk-WW6LXQY6.cjs} +12 -12
  93. package/dist/{chunk-B3LZITVF.cjs.map → chunk-WW6LXQY6.cjs.map} +1 -1
  94. package/dist/{chunk-NJCK6V6U.cjs → chunk-XKDUPU7B.cjs} +4 -4
  95. package/dist/{chunk-NJCK6V6U.cjs.map → chunk-XKDUPU7B.cjs.map} +1 -1
  96. package/dist/{chunk-42TURFHF.cjs → chunk-YGBHY67W.cjs} +5 -5
  97. package/dist/{chunk-42TURFHF.cjs.map → chunk-YGBHY67W.cjs.map} +1 -1
  98. package/dist/connect/docx.cjs +24 -24
  99. package/dist/connect/index.cjs +983 -983
  100. package/dist/connect/viewer.cjs +34 -34
  101. package/dist/connection/docx/ConnectedNativeDocxEditor.js +10 -2
  102. package/dist/connection/docx/ConnectedNativeDocxEditor.js.map +2 -2
  103. package/dist/connection/viewer/ConnectedDocumentViewer.js +124 -21
  104. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  105. package/dist/connection/viewer/VersionDropdown.d.ts +9 -0
  106. package/dist/connection/viewer/VersionDropdown.js +39 -0
  107. package/dist/connection/viewer/VersionDropdown.js.map +7 -0
  108. package/dist/connection/viewer/ViewerPdfPane.js +4 -1
  109. package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
  110. package/dist/connection/viewer/useViewerBlobs.d.ts +3 -1
  111. package/dist/connection/viewer/useViewerBlobs.js +14 -8
  112. package/dist/connection/viewer/useViewerBlobs.js.map +2 -2
  113. package/dist/connection/viewer/useViewerTabs.js +10 -0
  114. package/dist/connection/viewer/useViewerTabs.js.map +2 -2
  115. package/dist/dashboards/index.cjs +1 -1
  116. package/dist/docx/DocxCommandMenu.d.ts +8 -0
  117. package/dist/docx/DocxCommandMenu.js +202 -0
  118. package/dist/docx/DocxCommandMenu.js.map +7 -0
  119. package/dist/docx/NativeDocxEditor.d.ts +4 -2
  120. package/dist/docx/NativeDocxEditor.js +51 -12
  121. package/dist/docx/NativeDocxEditor.js.map +2 -2
  122. package/dist/docx/RibbonMenu.d.ts +3 -1
  123. package/dist/docx/RibbonMenu.js +10 -3
  124. package/dist/docx/RibbonMenu.js.map +2 -2
  125. package/dist/docx/RibbonOverflow.d.ts +3 -0
  126. package/dist/docx/RibbonOverflow.js +24 -1
  127. package/dist/docx/RibbonOverflow.js.map +2 -2
  128. package/dist/docx/index.cjs +38 -38
  129. package/dist/docx/signatures/SignatureFields.d.ts +3 -1
  130. package/dist/docx/signatures/SignatureFields.js +17 -8
  131. package/dist/docx/signatures/SignatureFields.js.map +2 -2
  132. package/dist/embed/index.cjs +38 -38
  133. package/dist/files/index.cjs +224 -224
  134. package/dist/index.cjs +1590 -1590
  135. package/dist/settings/index.cjs +147 -147
  136. package/dist/shell/index.cjs +90 -90
  137. package/dist/studio/index.cjs +26 -26
  138. package/dist/styles.css +1 -1
  139. package/dist/workflow-canvas/index.cjs +55 -55
  140. package/node_modules/@arbidocs/coedit/package.json +1 -1
  141. package/package.json +5 -5
  142. package/src/docx/styles.css +94 -0
  143. package/dist/ai-IM4A23YT.cjs.map +0 -1
  144. package/dist/chunk-A3T3IC3K.cjs.map +0 -1
  145. package/dist/chunk-CIHERNDO.cjs +0 -18
  146. package/dist/chunk-M6IKVKU5.cjs.map +0 -1
  147. package/dist/chunk-X5LANJDZ.cjs.map +0 -1
@@ -1,21 +1,21 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkA3T3IC3K_cjs = require('../chunk-A3T3IC3K.cjs');
4
+ var chunkD7ICHGWM_cjs = require('../chunk-D7ICHGWM.cjs');
5
5
  require('../chunk-4CIVQWAX.cjs');
6
6
  var chunkPL7HUTM3_cjs = require('../chunk-PL7HUTM3.cjs');
7
- require('../chunk-YGXOKB5Z.cjs');
8
- require('../chunk-KXIRVKCJ.cjs');
9
- require('../chunk-TT4IF52H.cjs');
10
- require('../chunk-NJCK6V6U.cjs');
11
- require('../chunk-NNUK5ZM7.cjs');
7
+ require('../chunk-7TEUGFIL.cjs');
8
+ require('../chunk-UUENH4BJ.cjs');
9
+ require('../chunk-7X3FS5HQ.cjs');
10
+ require('../chunk-XKDUPU7B.cjs');
11
+ require('../chunk-5QUL5BZO.cjs');
12
12
  require('../chunk-223D4727.cjs');
13
13
  require('../chunk-SNUBQMIS.cjs');
14
- require('../chunk-X5LANJDZ.cjs');
14
+ require('../chunk-VTYJAZDU.cjs');
15
+ require('../chunk-P5AQYC4D.cjs');
16
+ require('../chunk-GQXPNIRE.cjs');
15
17
  require('../chunk-4ONPEVTP.cjs');
16
18
  require('../chunk-V3KLUWQQ.cjs');
17
- require('../chunk-P5AQYC4D.cjs');
18
- require('../chunk-WAV762GP.cjs');
19
19
  require('../chunk-YYPZOEED.cjs');
20
20
  require('../chunk-GNZAH6UI.cjs');
21
21
  require('../chunk-JH6JTI76.cjs');
@@ -24,31 +24,42 @@ require('../chunk-DTMBAFIL.cjs');
24
24
  require('../chunk-ZESMRGDV.cjs');
25
25
  require('../chunk-VCEX7COE.cjs');
26
26
  require('../chunk-34HQO4ZQ.cjs');
27
- require('../chunk-B3LZITVF.cjs');
27
+ require('../chunk-CT3SLXB7.cjs');
28
+ require('../chunk-WW6LXQY6.cjs');
28
29
  require('../chunk-MZZ3SBQL.cjs');
29
- require('../chunk-NY3YUCOW.cjs');
30
- require('../chunk-325GVZE6.cjs');
30
+ require('../chunk-4NPCDS2X.cjs');
31
+ require('../chunk-Q6DQGGP4.cjs');
31
32
  require('../chunk-ZPPMAL5P.cjs');
32
33
  require('../chunk-ORELHENJ.cjs');
33
34
  require('../chunk-NWNVWO6L.cjs');
34
35
  require('../chunk-SK6HQ46Q.cjs');
35
- require('../chunk-MNIQDXM6.cjs');
36
- require('../chunk-E3Y7RI3J.cjs');
37
36
  require('../chunk-VLCY46K6.cjs');
38
- require('../chunk-3A7QWUAW.cjs');
37
+ require('../chunk-DEXUL3T6.cjs');
38
+ require('../chunk-6WMMZLEV.cjs');
39
+ require('../chunk-Z2XZ2D4N.cjs');
40
+ require('../chunk-YZSQ7F5K.cjs');
41
+ require('../chunk-MCXS6X37.cjs');
42
+ require('../chunk-KQF7POTG.cjs');
43
+ require('../chunk-VKH3BEZE.cjs');
44
+ require('../chunk-75BNMCUX.cjs');
39
45
  require('../chunk-OEJQFPWO.cjs');
40
46
  require('../chunk-OYXWQTHF.cjs');
41
47
  require('../chunk-S237ORM3.cjs');
42
48
  require('../chunk-II2OEXHW.cjs');
43
- require('../chunk-R7CJEIA5.cjs');
49
+ require('../chunk-FX3K6LNZ.cjs');
50
+ require('../chunk-LYTIQQQ2.cjs');
44
51
  require('../chunk-3YEXZX4H.cjs');
45
52
  require('../chunk-4PA6VCCR.cjs');
46
- require('../chunk-WXUU3COI.cjs');
53
+ require('../chunk-MZ2KZXNU.cjs');
47
54
  require('../chunk-AHDJXIUB.cjs');
55
+ require('../chunk-YVCOQHCE.cjs');
48
56
  require('../chunk-RL2HI6NP.cjs');
49
57
  require('../chunk-6UZC4XVV.cjs');
50
- require('../chunk-YVCOQHCE.cjs');
58
+ require('../chunk-QGVOT7E4.cjs');
59
+ require('../chunk-QRAQZTJE.cjs');
60
+ require('../chunk-UDSHVNU3.cjs');
51
61
  require('../chunk-JV5TVUOU.cjs');
62
+ require('../chunk-IPSHAMO2.cjs');
52
63
  require('../chunk-E7TE2WVT.cjs');
53
64
  require('../chunk-EG7EJFUE.cjs');
54
65
  require('../chunk-VG24E4JJ.cjs');
@@ -60,32 +71,21 @@ require('../chunk-HQDR43JC.cjs');
60
71
  require('../chunk-JR2YSBD5.cjs');
61
72
  require('../chunk-3YZKDCWY.cjs');
62
73
  require('../chunk-SJSGSHIT.cjs');
63
- require('../chunk-ZW6FPIFC.cjs');
64
- require('../chunk-CT3SLXB7.cjs');
65
- require('../chunk-DEXUL3T6.cjs');
66
- require('../chunk-6WMMZLEV.cjs');
67
- require('../chunk-Z2XZ2D4N.cjs');
68
- require('../chunk-YZSQ7F5K.cjs');
69
- require('../chunk-MCXS6X37.cjs');
70
- require('../chunk-KQF7POTG.cjs');
71
- require('../chunk-75BNMCUX.cjs');
72
- require('../chunk-FX3K6LNZ.cjs');
73
- require('../chunk-QGVOT7E4.cjs');
74
- require('../chunk-QRAQZTJE.cjs');
75
- require('../chunk-UDSHVNU3.cjs');
76
- require('../chunk-IPSHAMO2.cjs');
77
74
  require('../chunk-PPCATBOY.cjs');
75
+ require('../chunk-ZW6FPIFC.cjs');
76
+ require('../chunk-LJJJ6CYH.cjs');
77
+ require('../chunk-MNIQDXM6.cjs');
78
+ require('../chunk-E3Y7RI3J.cjs');
78
79
  require('../chunk-TKHCIHE2.cjs');
79
80
  require('../chunk-JDFBEGQO.cjs');
80
81
  require('../chunk-ULWRNGGE.cjs');
81
- require('../chunk-LJJJ6CYH.cjs');
82
82
  require('../chunk-PLIF5CUV.cjs');
83
83
 
84
84
 
85
85
 
86
86
  Object.defineProperty(exports, "ConnectedDocumentViewer", {
87
87
  enumerable: true,
88
- get: function () { return chunkA3T3IC3K_cjs.ConnectedDocumentViewer; }
88
+ get: function () { return chunkD7ICHGWM_cjs.ConnectedDocumentViewer; }
89
89
  });
90
90
  Object.defineProperty(exports, "ConnectedDocumentToolsProvider", {
91
91
  enumerable: true,
@@ -106,8 +106,16 @@ function useConnectedNativeDocxAdapter(fontBaseUrl = "/native-docx/fonts") {
106
106
  onDirtyChange: support.onDirtyChange,
107
107
  // The document's row moves to the saved version in place: through the host when it keeps
108
108
  // the lists (its document tools refresh them), else here.
109
- onVersionSaved: async (id) => {
110
- await (onDocumentsChanged ? onDocumentsChanged([id], "version") : refreshDocuments(queries, arbi, [id]));
109
+ onVersionSaved: async (id, version) => {
110
+ if (onDocumentsChanged) await onDocumentsChanged([id], "version");
111
+ if (version || !onDocumentsChanged) {
112
+ const fresh = await refreshDocuments(queries, arbi, [id]);
113
+ if (version && !fresh.some((doc) => doc.external_id === id && (doc.current_version ?? 0) >= version)) {
114
+ throw new Error(
115
+ "The version was saved, but its current status could not be confirmed. Please try again."
116
+ );
117
+ }
118
+ }
111
119
  },
112
120
  notify,
113
121
  mentions: members?.map(({ user: member }) => ({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/connection/docx/ConnectedNativeDocxEditor.tsx"],
4
- "sourcesContent": ["import { useMemo, useRef, useState } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { refreshDocuments, useArbi, useWorkspaceUsers } from '@arbidocs/react'\nimport {\n fetchSavedSignature,\n storeSavedSignature,\n useOptionalDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport type { NativeDocxAdapter, NativeDocxEditorProps } from '../../docx/NativeDocxEditor'\nimport { NativeDocxEditor } from '../../docx/lazy'\nimport { useRegisterOpenDocument } from '@arbidocs/react/shell'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useDocxCommentTarget, useNativeDocxSupport } from './support'\nimport { useConnectedDocxReferences } from './useConnectedDocxReferences'\nimport { useConnectedHouseTemplate } from './useConnectedHouseTemplate'\n\nexport type ConnectedNativeDocxEditorProps = Omit<NativeDocxEditorProps, 'adapter' | 'compact'> & {\n fontBaseUrl?: string\n}\n\n/**\n * The native Word editor on the signed-in ARBI session, under any host (`defaultHost`'s sign-in\n * layer, or the host's own `arbi` and session state). Until a live session has opened, a failure to\n * open one falls back to the saved copy, read-only, so the document is still readable; later token\n * refreshes are not guarded (switching modes would drop unsaved edits).\n */\nexport function ConnectedNativeDocxEditor({\n fontBaseUrl = '/native-docx/fonts',\n ...props\n}: ConnectedNativeDocxEditorProps) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n const { workspaceId } = useConnectedWorkspace()\n const commentTarget = useDocxCommentTarget()\n const [openFailed, setOpenFailed] = useState(false)\n const hasOpened = useRef(false)\n const guardedAdapter = useMemo<NativeDocxAdapter>(\n () => ({\n ...adapter,\n open: async (documentId) => {\n try {\n const session = await adapter.open(documentId)\n hasOpened.current = true\n return session\n } catch (error) {\n if (!hasOpened.current) setOpenFailed(true)\n throw error\n }\n },\n }),\n [adapter]\n )\n // Drafting mode: the saved Word document being edited is what the chat is about. A history\n // snapshot, a streamed preview, an unsaved draft and an embedded body field are not.\n const live = !props.snapshot && !props.stream && !props.draftContent\n useRegisterOpenDocument({ documentId: live ? props.documentId : null, workspaceId })\n const initialCommentId =\n props.initialCommentId ??\n (commentTarget?.documentId === props.documentId ? commentTarget.commentId : undefined)\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {openFailed && (\n <p role=\"status\" className=\"text-muted-foreground border-b px-3 py-2 text-xs\">\n Co-editing isn&apos;t available for this document right now, so this is a read-only copy\n of the last saved version.\n </p>\n )}\n <div className=\"min-h-0 flex-1\">\n <NativeDocxEditor\n {...props}\n snapshot={props.snapshot || openFailed}\n initialCommentId={initialCommentId}\n adapter={guardedAdapter}\n />\n </div>\n </div>\n )\n}\n\n/** The access token changed (a refresh): the live room is told the new one. */\nfunction tokenChanges(arbi: ReturnType<typeof useArbi>) {\n return (listener: () => void) => {\n if (!arbi.isLoggedIn) return () => {}\n const session = arbi.getClient().session\n let token = session.getState().accessToken\n return session.subscribe((state) => {\n if (state.accessToken === token) return\n token = state.accessToken\n listener()\n })\n }\n}\n\n/**\n * The native Word adapter on the signed-in session: the editor transport, the people to mention,\n * cross-references, the house template, and the host's extras (its host config's `docx`).\n */\nexport function useConnectedNativeDocxAdapter(fontBaseUrl = '/native-docx/fonts') {\n const arbi = useArbi()\n const { workspaceId, live, user, ensureWorkspaceOpen } = useConnectedWorkspace()\n const queries = useQueryClient()\n const { notify } = useBlocksEnvironment()\n const tools = useOptionalDocumentTools()\n const support = useNativeDocxSupport()\n const references = useConnectedDocxReferences()\n const houseTemplate = useConnectedHouseTemplate()\n const { data: members } = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: live && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const onDocumentsChanged = tools?.onDocumentsChanged\n // Tracked changes and comments are authored by the user's first name.\n const author = (live && arbi.user.profile()?.givenName) || user?.name || 'You'\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n request: async (path, options) => {\n await ensureWorkspaceOpen()\n return arbi.editor.request(path, options)\n },\n open: async (id) => {\n await ensureWorkspaceOpen()\n return (\n await arbi.editor.request(`/${encodeURIComponent(id)}/session`, { method: 'POST' })\n ).json()\n },\n save: async (id, state) =>\n (\n await arbi.editor.request(`/${encodeURIComponent(id)}/save`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ state }),\n })\n ).json(),\n loadFonts: () => import('../../docx/fonts').then((m) => m.loadDocxFonts(fontBaseUrl)),\n baseUrl: arbi.getConnectionInfo()?.baseUrl || window.location.origin,\n author,\n subscribeTokenChanges: tokenChanges(arbi),\n onDirtyChange: support.onDirtyChange,\n // The document's row moves to the saved version in place: through the host when it keeps\n // the lists (its document tools refresh them), else here.\n onVersionSaved: async (id) => {\n await (onDocumentsChanged\n ? onDocumentsChanged([id], 'version')\n : refreshDocuments(queries, arbi, [id]))\n },\n notify,\n mentions: members?.map(({ user: member }) => ({\n id: member.external_id,\n name: [member.given_name, member.family_name].filter(Boolean).join(' '),\n kind: member.external_id.startsWith('agt-') ? 'agent' : 'human',\n })),\n savedSignature: {\n load: () => fetchSavedSignature(arbi.getClient().fetch),\n save: (signature) => storeSavedSignature(arbi.getClient().fetch, signature),\n defaultName: user?.name ?? '',\n },\n signatureSigners: members\n ?.filter(({ user: member }) => member.external_id.startsWith('usr-'))\n .map(({ user: member }) => ({\n email: member.email,\n name: [member.given_name, member.family_name].filter(Boolean).join(' '),\n })),\n requestAgent: async (id, request) => {\n const response = await arbi.editor.request(`/${encodeURIComponent(id)}/mentions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n comment_id: request.commentId,\n instruction: request.instruction,\n request_id: request.requestId,\n recipient_ids: request.recipientIds,\n }),\n })\n const delivery = (await response.json()) as { response_ids: string[] }\n notify('Mention delivered.', 'success')\n return { responseIds: delivery.response_ids || [] }\n },\n getAgentStatus: async (responseId) => (await arbi.assistant.getResponse(responseId)).status,\n definitions: support.definitions,\n references,\n imageGeneration: support.imageGeneration,\n houseTemplate,\n }),\n [\n arbi,\n author,\n members,\n ensureWorkspaceOpen,\n fontBaseUrl,\n queries,\n notify,\n onDocumentsChanged,\n support,\n references,\n houseTemplate,\n user?.name,\n ]\n )\n return adapter\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { useMemo, useRef, useState } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { refreshDocuments, useArbi, useWorkspaceUsers } from '@arbidocs/react'\nimport {\n fetchSavedSignature,\n storeSavedSignature,\n useOptionalDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport type { NativeDocxAdapter, NativeDocxEditorProps } from '../../docx/NativeDocxEditor'\nimport { NativeDocxEditor } from '../../docx/lazy'\nimport { useRegisterOpenDocument } from '@arbidocs/react/shell'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useDocxCommentTarget, useNativeDocxSupport } from './support'\nimport { useConnectedDocxReferences } from './useConnectedDocxReferences'\nimport { useConnectedHouseTemplate } from './useConnectedHouseTemplate'\n\nexport type ConnectedNativeDocxEditorProps = Omit<NativeDocxEditorProps, 'adapter' | 'compact'> & {\n fontBaseUrl?: string\n}\n\n/**\n * The native Word editor on the signed-in ARBI session, under any host (`defaultHost`'s sign-in\n * layer, or the host's own `arbi` and session state). Until a live session has opened, a failure to\n * open one falls back to the saved copy, read-only, so the document is still readable; later token\n * refreshes are not guarded (switching modes would drop unsaved edits).\n */\nexport function ConnectedNativeDocxEditor({\n fontBaseUrl = '/native-docx/fonts',\n ...props\n}: ConnectedNativeDocxEditorProps) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n const { workspaceId } = useConnectedWorkspace()\n const commentTarget = useDocxCommentTarget()\n const [openFailed, setOpenFailed] = useState(false)\n const hasOpened = useRef(false)\n const guardedAdapter = useMemo<NativeDocxAdapter>(\n () => ({\n ...adapter,\n open: async (documentId) => {\n try {\n const session = await adapter.open(documentId)\n hasOpened.current = true\n return session\n } catch (error) {\n if (!hasOpened.current) setOpenFailed(true)\n throw error\n }\n },\n }),\n [adapter]\n )\n // Drafting mode: the saved Word document being edited is what the chat is about. A history\n // snapshot, a streamed preview, an unsaved draft and an embedded body field are not.\n const live = !props.snapshot && !props.stream && !props.draftContent\n useRegisterOpenDocument({ documentId: live ? props.documentId : null, workspaceId })\n const initialCommentId =\n props.initialCommentId ??\n (commentTarget?.documentId === props.documentId ? commentTarget.commentId : undefined)\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {openFailed && (\n <p role=\"status\" className=\"text-muted-foreground border-b px-3 py-2 text-xs\">\n Co-editing isn&apos;t available for this document right now, so this is a read-only copy\n of the last saved version.\n </p>\n )}\n <div className=\"min-h-0 flex-1\">\n <NativeDocxEditor\n {...props}\n snapshot={props.snapshot || openFailed}\n initialCommentId={initialCommentId}\n adapter={guardedAdapter}\n />\n </div>\n </div>\n )\n}\n\n/** The access token changed (a refresh): the live room is told the new one. */\nfunction tokenChanges(arbi: ReturnType<typeof useArbi>) {\n return (listener: () => void) => {\n if (!arbi.isLoggedIn) return () => {}\n const session = arbi.getClient().session\n let token = session.getState().accessToken\n return session.subscribe((state) => {\n if (state.accessToken === token) return\n token = state.accessToken\n listener()\n })\n }\n}\n\n/**\n * The native Word adapter on the signed-in session: the editor transport, the people to mention,\n * cross-references, the house template, and the host's extras (its host config's `docx`).\n */\nexport function useConnectedNativeDocxAdapter(fontBaseUrl = '/native-docx/fonts') {\n const arbi = useArbi()\n const { workspaceId, live, user, ensureWorkspaceOpen } = useConnectedWorkspace()\n const queries = useQueryClient()\n const { notify } = useBlocksEnvironment()\n const tools = useOptionalDocumentTools()\n const support = useNativeDocxSupport()\n const references = useConnectedDocxReferences()\n const houseTemplate = useConnectedHouseTemplate()\n const { data: members } = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: live && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const onDocumentsChanged = tools?.onDocumentsChanged\n // Tracked changes and comments are authored by the user's first name.\n const author = (live && arbi.user.profile()?.givenName) || user?.name || 'You'\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n request: async (path, options) => {\n await ensureWorkspaceOpen()\n return arbi.editor.request(path, options)\n },\n open: async (id) => {\n await ensureWorkspaceOpen()\n return (\n await arbi.editor.request(`/${encodeURIComponent(id)}/session`, { method: 'POST' })\n ).json()\n },\n save: async (id, state) =>\n (\n await arbi.editor.request(`/${encodeURIComponent(id)}/save`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ state }),\n })\n ).json(),\n loadFonts: () => import('../../docx/fonts').then((m) => m.loadDocxFonts(fontBaseUrl)),\n baseUrl: arbi.getConnectionInfo()?.baseUrl || window.location.origin,\n author,\n subscribeTokenChanges: tokenChanges(arbi),\n onDirtyChange: support.onDirtyChange,\n // The document's row moves to the saved version in place: through the host when it keeps\n // the lists (its document tools refresh them), else here.\n onVersionSaved: async (id, version) => {\n if (onDocumentsChanged) await onDocumentsChanged([id], 'version')\n if (version || !onDocumentsChanged) {\n const fresh = await refreshDocuments(queries, arbi, [id])\n if (\n version &&\n !fresh.some((doc) => doc.external_id === id && (doc.current_version ?? 0) >= version)\n ) {\n throw new Error(\n 'The version was saved, but its current status could not be confirmed. Please try again.'\n )\n }\n }\n },\n notify,\n mentions: members?.map(({ user: member }) => ({\n id: member.external_id,\n name: [member.given_name, member.family_name].filter(Boolean).join(' '),\n kind: member.external_id.startsWith('agt-') ? 'agent' : 'human',\n })),\n savedSignature: {\n load: () => fetchSavedSignature(arbi.getClient().fetch),\n save: (signature) => storeSavedSignature(arbi.getClient().fetch, signature),\n defaultName: user?.name ?? '',\n },\n signatureSigners: members\n ?.filter(({ user: member }) => member.external_id.startsWith('usr-'))\n .map(({ user: member }) => ({\n email: member.email,\n name: [member.given_name, member.family_name].filter(Boolean).join(' '),\n })),\n requestAgent: async (id, request) => {\n const response = await arbi.editor.request(`/${encodeURIComponent(id)}/mentions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n comment_id: request.commentId,\n instruction: request.instruction,\n request_id: request.requestId,\n recipient_ids: request.recipientIds,\n }),\n })\n const delivery = (await response.json()) as { response_ids: string[] }\n notify('Mention delivered.', 'success')\n return { responseIds: delivery.response_ids || [] }\n },\n getAgentStatus: async (responseId) => (await arbi.assistant.getResponse(responseId)).status,\n definitions: support.definitions,\n references,\n imageGeneration: support.imageGeneration,\n houseTemplate,\n }),\n [\n arbi,\n author,\n members,\n ensureWorkspaceOpen,\n fontBaseUrl,\n queries,\n notify,\n onDocumentsChanged,\n support,\n references,\n houseTemplate,\n user?.name,\n ]\n )\n return adapter\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -92,6 +92,7 @@ import { useViewedDocument } from "./useViewedDocument.js";
92
92
  import { useViewerBlobs } from "./useViewerBlobs.js";
93
93
  import { useViewerTabs } from "./useViewerTabs.js";
94
94
  import { useViewerVersions } from "./useViewerVersions.js";
95
+ import { VersionDropdown } from "./VersionDropdown.js";
95
96
  import { ParsedTextView } from "./parsed/ParsedTextView.js";
96
97
  import { ViewerPdfPane } from "./ViewerPdfPane.js";
97
98
  import { ConnectedNativeDocxEditor as NativeDocxEditor } from "../docx/ConnectedNativeDocxEditor.js";
@@ -205,10 +206,15 @@ function DocumentViewerContent({
205
206
  const threadTitle = (id) => conversations.find((c) => c.external_id === id)?.title?.trim() || "Its thread";
206
207
  const madeInId = documentData?.conversation_ext_id ?? null;
207
208
  const madeIn = madeInId ? { id: madeInId, title: threadTitle(madeInId) } : null;
208
- const pdfSnapshotId = snapshotDocumentId && !isDocx && !isArtifact ? snapshotDocumentId : null;
209
+ const pdfSnapshotId = snapshotDocumentId && (!isArtifact || isDocx) ? snapshotDocumentId : null;
209
210
  const shownDocumentId = pdfSnapshotId || documentId;
210
211
  const blobs = useViewerBlobs(shownDocumentId, doc);
211
- const { pdfBlob, xlsxBlob, xlsxError, handleDirectDownload } = blobs;
212
+ const [minimumPdfVersion, setMinimumPdfVersion] = useState(null);
213
+ useEffect(() => setMinimumPdfVersion(null), [documentId]);
214
+ const versionReady = !!pdfSnapshotId || minimumPdfVersion === null || (documentData?.current_version ?? 0) >= minimumPdfVersion;
215
+ const { xlsxBlob, xlsxError, handleDirectDownload } = blobs;
216
+ const pdfBlob = versionReady ? blobs.pdfBlob : null;
217
+ const pdfVerified = !!pdfBlob && blobs.pdfVerified !== false;
212
218
  const [annotating, setAnnotating] = useState(false);
213
219
  const [sharingFile, setSharingFile] = useState(false);
214
220
  useEffect(() => setAnnotating(false), [documentId]);
@@ -216,7 +222,52 @@ function DocumentViewerContent({
216
222
  null
217
223
  );
218
224
  const hasHistory = versions.length > 1 || (documentData?.current_version ?? 1) > 1 || translations.length > 0;
219
- const { activeTab, handleTabChange, viewerTabs } = useViewerTabs(doc, isCompact, hasHistory);
225
+ const {
226
+ activeTab,
227
+ handleTabChange: changeTab,
228
+ viewerTabs
229
+ } = useViewerTabs(doc, isCompact, hasHistory);
230
+ const saveWordRef = useRef(null);
231
+ const transitionPending = useRef(false);
232
+ const transitionKey = JSON.stringify([openedId, doc.workspaceId]);
233
+ const transitionScope = useRef({ key: transitionKey, generation: 0 });
234
+ if (transitionScope.current.key !== transitionKey) {
235
+ transitionScope.current = {
236
+ key: transitionKey,
237
+ generation: transitionScope.current.generation + 1
238
+ };
239
+ }
240
+ useEffect(
241
+ () => () => {
242
+ transitionScope.current.generation += 1;
243
+ },
244
+ []
245
+ );
246
+ const requestViewerTransition = async (transition) => {
247
+ if (transitionPending.current) return false;
248
+ const leavingWord = isDocx && !isDraft && !isStreaming && !snapshotDocumentId && (activeTab === "docx" || isArtifact && !liveKind && activeTab === "edit");
249
+ if (leavingWord) {
250
+ transitionPending.current = true;
251
+ const generation = transitionScope.current.generation;
252
+ try {
253
+ const saved = saveWordRef.current && await saveWordRef.current();
254
+ if (!saved) {
255
+ notify("Could not save the current document. Stay in the editor and try again.", "error");
256
+ return false;
257
+ }
258
+ if (generation !== transitionScope.current.generation) return false;
259
+ if (typeof saved === "number") setMinimumPdfVersion(saved);
260
+ } finally {
261
+ transitionPending.current = false;
262
+ }
263
+ }
264
+ transition();
265
+ return true;
266
+ };
267
+ const handleTabChange = (tab) => {
268
+ if (tab === activeTab) return;
269
+ void requestViewerTransition(() => changeTab(tab));
270
+ };
220
271
  const crop = useImageCrop(
221
272
  documentId,
222
273
  documentData?.file_name,
@@ -226,15 +277,31 @@ function DocumentViewerContent({
226
277
  const [placingSignature, setPlacingSignature] = useState(false);
227
278
  const [signAppearance, setSignAppearance] = useState();
228
279
  const [isSignOpen, setIsSignOpen] = useState(false);
229
- useEffect(() => setPlacingSignature(false), [documentId, snapshotDocumentId]);
280
+ const signingScope = JSON.stringify([
281
+ documentId,
282
+ snapshotDocumentId,
283
+ documentData?.current_version
284
+ ]);
285
+ const signingScopeRef = useRef(signingScope);
286
+ const signingScopeMatches = signingScopeRef.current === signingScope;
287
+ useEffect(() => {
288
+ setPlacingSignature(false);
289
+ setIsSignOpen(false);
290
+ setSignAppearance(void 0);
291
+ signingScopeRef.current = signingScope;
292
+ }, [signingScope]);
230
293
  const [signatureFlow, setSignatureFlow] = useState(null);
231
- useEffect(() => setSignatureFlow(null), [documentId, snapshotDocumentId]);
232
- const { data: signatureStatus } = useDocumentSignatures(shownDocumentId, !isDraft && !liveKind);
294
+ useEffect(() => setSignatureFlow(null), [signingScope]);
295
+ const signatureDocumentId = pdfSnapshotId || (documentData?.current_version ? `${documentId}@v${documentData.current_version}` : documentId);
296
+ const { data: signatureStatus } = useDocumentSignatures(
297
+ signatureDocumentId,
298
+ !isDraft && !liveKind
299
+ );
233
300
  const isCoEditing = !snapshotDocumentId && !compareDocumentId && !isDraft && (activeTab === "docx" && isDocx || activeTab === "edit" && isArtifact && !liveKind && !isStreaming);
234
301
  const currentVersionLabel = isCoEditing ? void 0 : !snapshotDocumentId && !compareDocumentId && (isDocx || isArtifact && !liveKind) ? "Live" : versionLabel(versions, snapshotDocumentId || documentId);
235
302
  const compareVersionLabel = versionLabel(versions, compareDocumentId);
236
303
  const snapshotNumber = findVersion(versions, snapshotDocumentId)?.number;
237
- const pdfSnapshotNumber = pdfSnapshotId ? snapshotNumber : void 0;
304
+ const pdfSnapshotNumber = pdfSnapshotId ? parseVersionRef(pdfSnapshotId).version ?? void 0 : void 0;
238
305
  const isSigned = !!signatureStatus?.signed;
239
306
  const markup = useDocumentMarkup(documentData, pdfSnapshotNumber, isSigned);
240
307
  useEffect(() => {
@@ -314,12 +381,37 @@ function DocumentViewerContent({
314
381
  // A draft's kind replaces the tabs: neither Versions nor the text view means anything
315
382
  // before the first save.
316
383
  /* @__PURE__ */ jsx(ViewerDraftKind, { documentId })
317
- ) : /* @__PURE__ */ jsx(ViewerTabBar, { tabs: viewerTabs, activeId: activeTab, onChange: handleTabChange }),
384
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
385
+ /* @__PURE__ */ jsx(
386
+ ViewerTabBar,
387
+ {
388
+ tabs: viewerTabs.filter((tab) => tab.id !== "versions"),
389
+ activeId: activeTab,
390
+ onChange: handleTabChange
391
+ }
392
+ ),
393
+ (isArtifact || isDocx || hasHistory) && !liveKind && !isComparing && /* @__PURE__ */ jsx(
394
+ VersionDropdown,
395
+ {
396
+ versions,
397
+ activeId: snapshotDocumentId ?? (currentVersionId === documentId && documentData?.current_version ? `${documentId}@v${documentData.current_version}` : currentVersionId),
398
+ isSnapshot: !!snapshotDocumentId,
399
+ onOpen: (id) => {
400
+ void requestViewerTransition(() => {
401
+ setSnapshotDocumentId(id === currentVersionId ? null : id);
402
+ if (activeTab === "versions")
403
+ setActiveTab(isArtifact ? "edit" : isDocx ? "docx" : "pdf");
404
+ });
405
+ },
406
+ onHistory: () => handleTabChange("versions")
407
+ }
408
+ )
409
+ ] }),
318
410
  !isCompact && titleBlock
319
411
  ] });
320
412
  const annotatable = canAnnotate({
321
413
  activeTab,
322
- hasPdf: !!pdfBlob,
414
+ hasPdf: pdfVerified,
323
415
  isImage,
324
416
  isVideo,
325
417
  isAudio,
@@ -335,14 +427,18 @@ function DocumentViewerContent({
335
427
  documentId,
336
428
  hidden: !!signatureFlow,
337
429
  onSign: (request) => {
338
- setAnnotating(false);
339
- setPlacingSignature(false);
340
- if (activeTab !== "pdf") handleTabChange("pdf");
341
- setSignatureFlow({ kind: "sign", request });
430
+ void requestViewerTransition(() => {
431
+ setAnnotating(false);
432
+ setPlacingSignature(false);
433
+ if (activeTab !== "pdf") changeTab("pdf");
434
+ setSignatureFlow({ kind: "sign", request });
435
+ });
342
436
  },
343
437
  onEditDraft: (draft) => {
344
- if (activeTab !== "pdf") handleTabChange("pdf");
345
- setSignatureFlow({ kind: "prepare", draft });
438
+ void requestViewerTransition(() => {
439
+ if (activeTab !== "pdf") changeTab("pdf");
440
+ setSignatureFlow({ kind: "prepare", draft });
441
+ });
346
442
  }
347
443
  }
348
444
  );
@@ -579,7 +675,7 @@ function DocumentViewerContent({
579
675
  ] })
580
676
  ] })
581
677
  ] }),
582
- isSignOpen && pdfBlob && /* @__PURE__ */ jsx(
678
+ isSignOpen && pdfBlob && pdfVerified && signingScopeMatches && /* @__PURE__ */ jsx(
583
679
  SignDocumentDialog,
584
680
  {
585
681
  open: isSignOpen,
@@ -654,9 +750,14 @@ function DocumentViewerContent({
654
750
  }
655
751
  ) }),
656
752
  isCaptureDraft && /* @__PURE__ */ jsx(ViewerCaptureDraft, { documentId }),
657
- !isCaptureDraft && (activeTab === "pdf" || isMedia && activeTab === "html") && !isArtifact && !isComparing && /* @__PURE__ */ jsxs(ViewerPane, { hidden: activeTab !== "pdf", children: [
753
+ !isCaptureDraft && (activeTab === "pdf" || isMedia && activeTab === "html") && (!isArtifact || isDocx && !isDraft && !isStreaming && !liveKind) && !isComparing && /* @__PURE__ */ jsxs(ViewerPane, { hidden: activeTab !== "pdf", children: [
658
754
  /* @__PURE__ */ jsx(DocumentLabelBar, { summaries: labelSummaries }),
659
755
  !isMedia && !isImage && signatureBanner,
756
+ activeTab === "pdf" && pdfBlob && !pdfVerified && /* @__PURE__ */ jsxs(ViewerMessage, { children: [
757
+ "Offline copy: its version cannot be verified. Reconnect before signing.",
758
+ " ",
759
+ /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void blobs.retryPdf(), className: "underline", children: "Retry loading the current PDF" })
760
+ ] }),
660
761
  activeTab === "pdf" && !isMedia && !isImage && /* @__PURE__ */ jsx(
661
762
  MarkupNotices,
662
763
  {
@@ -671,14 +772,14 @@ function DocumentViewerContent({
671
772
  documentId,
672
773
  doc,
673
774
  pdfBlob,
674
- isPdfLoading: blobs.isPdfLoading,
775
+ isPdfLoading: !versionReady || blobs.isPdfLoading,
675
776
  pdfError: blobs.pdfError,
676
777
  onDownload: () => void handleDirectDownload(),
677
778
  viewerProps,
678
- signatureFlow,
779
+ signatureFlow: pdfVerified && signingScopeMatches ? signatureFlow : null,
679
780
  onSignatureFlow: setSignatureFlow,
680
781
  currentUserId,
681
- placingSignature,
782
+ placingSignature: pdfVerified && signingScopeMatches && placingSignature,
682
783
  onPlacingDone: (appearance) => {
683
784
  setPlacingSignature(false);
684
785
  if (!appearance) return;
@@ -713,6 +814,7 @@ function DocumentViewerContent({
713
814
  title: documentTitle,
714
815
  draftContent: isDraft ? draftDoc?.content || "" : void 0,
715
816
  snapshot: !!snapshotDocumentId,
817
+ saveRef: saveWordRef,
716
818
  onSaved: (id) => {
717
819
  if (!isDraft) return;
718
820
  session.clearDraftDocument(documentId);
@@ -756,7 +858,8 @@ function DocumentViewerContent({
756
858
  {
757
859
  documentId: snapshotDocumentId || documentId,
758
860
  title: documentTitle,
759
- snapshot: !!snapshotDocumentId
861
+ snapshot: !!snapshotDocumentId,
862
+ saveRef: saveWordRef
760
863
  },
761
864
  `${snapshotDocumentId || documentId}-${snapshotDocumentId ? "snapshot" : "live"}`
762
865
  )