@arbidocs/blocks 0.5.125 → 0.5.127

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 (200) hide show
  1. package/README.md +19 -0
  2. package/dist/{ClippingMediaViewer-ZFEX5A3U.cjs → ClippingMediaViewer-47BAXNLO.cjs} +10 -11
  3. package/dist/ClippingMediaViewer-47BAXNLO.cjs.map +1 -0
  4. package/dist/{ClippingPdfViewer-3LRTEPHV.cjs → ClippingPdfViewer-D5BYHEAH.cjs} +16 -14
  5. package/dist/ClippingPdfViewer-D5BYHEAH.cjs.map +1 -0
  6. package/dist/ConnectedCallDock-XJOYVVAH.cjs +6 -6
  7. package/dist/ConnectedCallRoom-CUDYAPQK.cjs +6 -6
  8. package/dist/{ConnectedNativeDocxComparison-7QQ55JIO.cjs → ConnectedNativeDocxComparison-JUF2TI2P.cjs} +12 -12
  9. package/dist/{ConnectedNativeDocxComparison-7QQ55JIO.cjs.map → ConnectedNativeDocxComparison-JUF2TI2P.cjs.map} +1 -1
  10. package/dist/{ConnectedPresentation-L32JPRFI.cjs → ConnectedPresentation-SI3L77J4.cjs} +35 -36
  11. package/dist/ConnectedPresentation-SI3L77J4.cjs.map +1 -0
  12. package/dist/{ConnectedProductionSetDialog-4EAY6KAZ.cjs → ConnectedProductionSetDialog-LHB4VQWC.cjs} +3 -3
  13. package/dist/{ConnectedProductionSetDialog-4EAY6KAZ.cjs.map → ConnectedProductionSetDialog-LHB4VQWC.cjs.map} +1 -1
  14. package/dist/{ConnectedSlidesTab-P7GGNUTO.cjs → ConnectedSlidesTab-E76OVY34.cjs} +38 -44
  15. package/dist/ConnectedSlidesTab-E76OVY34.cjs.map +1 -0
  16. package/dist/{ConnectedStreamedWordArtifact-7NJ3N52V.cjs → ConnectedStreamedWordArtifact-Q64DRRQD.cjs} +12 -12
  17. package/dist/{ConnectedStreamedWordArtifact-7NJ3N52V.cjs.map → ConnectedStreamedWordArtifact-Q64DRRQD.cjs.map} +1 -1
  18. package/dist/{DocumentReviewCard-BFPOFQXI.cjs → DocumentReviewCard-M53XFLI2.cjs} +16 -16
  19. package/dist/{DocumentReviewCard-BFPOFQXI.cjs.map → DocumentReviewCard-M53XFLI2.cjs.map} +1 -1
  20. package/dist/{FilesViewerDialog-MHUVEZ7M.cjs → FilesViewerDialog-V6FSRQTP.cjs} +33 -34
  21. package/dist/FilesViewerDialog-V6FSRQTP.cjs.map +1 -0
  22. package/dist/{NativeDocxEditor-SIRYPMBN.cjs → NativeDocxEditor-2PTEK6ND.cjs} +6 -6
  23. package/dist/{NativeDocxEditor-SIRYPMBN.cjs.map → NativeDocxEditor-2PTEK6ND.cjs.map} +1 -1
  24. package/dist/{SpotlightStrip-ED22UYTM.cjs → SpotlightStrip-QQ2WUI32.cjs} +28 -29
  25. package/dist/SpotlightStrip-QQ2WUI32.cjs.map +1 -0
  26. package/dist/{WorkspaceTableView-MIFYXV3G.cjs → WorkspaceTableView-3XYAV4BV.cjs} +8 -8
  27. package/dist/{WorkspaceTableView-MIFYXV3G.cjs.map → WorkspaceTableView-3XYAV4BV.cjs.map} +1 -1
  28. package/dist/agents/index.cjs +215 -215
  29. package/dist/ai-IEIR7SC2.cjs +3 -3
  30. package/dist/auth/index.cjs +1 -1
  31. package/dist/calls/index.cjs +2 -2
  32. package/dist/chat/index.cjs +6 -6
  33. package/dist/{chunk-GAMRVB3I.cjs → chunk-23I5EUZA.cjs} +65 -10
  34. package/dist/chunk-23I5EUZA.cjs.map +1 -0
  35. package/dist/{chunk-ZZZITHGK.cjs → chunk-26SFI2BH.cjs} +16 -3
  36. package/dist/chunk-26SFI2BH.cjs.map +1 -0
  37. package/dist/{chunk-OGK377NL.cjs → chunk-2SU37RZA.cjs} +409 -42
  38. package/dist/chunk-2SU37RZA.cjs.map +1 -0
  39. package/dist/{chunk-CQ2RJYE2.cjs → chunk-3IH55CDE.cjs} +3 -3
  40. package/dist/{chunk-CQ2RJYE2.cjs.map → chunk-3IH55CDE.cjs.map} +1 -1
  41. package/dist/{chunk-AS6QZETU.cjs → chunk-5QERK4PK.cjs} +35 -35
  42. package/dist/{chunk-AS6QZETU.cjs.map → chunk-5QERK4PK.cjs.map} +1 -1
  43. package/dist/{chunk-AISYXX4M.cjs → chunk-7NLO7ASW.cjs} +4 -4
  44. package/dist/{chunk-AISYXX4M.cjs.map → chunk-7NLO7ASW.cjs.map} +1 -1
  45. package/dist/{chunk-QIK7E6VF.cjs → chunk-7PN3YENO.cjs} +4 -4
  46. package/dist/{chunk-QIK7E6VF.cjs.map → chunk-7PN3YENO.cjs.map} +1 -1
  47. package/dist/{chunk-JY7UUZQG.cjs → chunk-7Q46YAX4.cjs} +74 -71
  48. package/dist/chunk-7Q46YAX4.cjs.map +1 -0
  49. package/dist/{chunk-J3FFSEKO.cjs → chunk-ADDQKZ5I.cjs} +4 -4
  50. package/dist/{chunk-J3FFSEKO.cjs.map → chunk-ADDQKZ5I.cjs.map} +1 -1
  51. package/dist/{chunk-L6HTZIBD.cjs → chunk-ALK3PUUB.cjs} +3 -3
  52. package/dist/{chunk-L6HTZIBD.cjs.map → chunk-ALK3PUUB.cjs.map} +1 -1
  53. package/dist/{chunk-3ZZZO4F7.cjs → chunk-BY3QA3S5.cjs} +9 -9
  54. package/dist/{chunk-3ZZZO4F7.cjs.map → chunk-BY3QA3S5.cjs.map} +1 -1
  55. package/dist/{chunk-3UP32FM3.cjs → chunk-CQQQIZU4.cjs} +5 -5
  56. package/dist/{chunk-3UP32FM3.cjs.map → chunk-CQQQIZU4.cjs.map} +1 -1
  57. package/dist/{chunk-YOEP3I4V.cjs → chunk-E3L5DB5F.cjs} +5 -5
  58. package/dist/{chunk-YOEP3I4V.cjs.map → chunk-E3L5DB5F.cjs.map} +1 -1
  59. package/dist/{chunk-UA7HOLAZ.cjs → chunk-ESVRVZ53.cjs} +5 -5
  60. package/dist/{chunk-UA7HOLAZ.cjs.map → chunk-ESVRVZ53.cjs.map} +1 -1
  61. package/dist/{chunk-2K6IMIVL.cjs → chunk-GNZAH6UI.cjs} +3 -3
  62. package/dist/{chunk-2K6IMIVL.cjs.map → chunk-GNZAH6UI.cjs.map} +1 -1
  63. package/dist/{chunk-KA3F6TIH.cjs → chunk-IWHP7FAB.cjs} +12 -5
  64. package/dist/chunk-IWHP7FAB.cjs.map +1 -0
  65. package/dist/{chunk-ORNLCBNE.cjs → chunk-JVEDKKNO.cjs} +43 -4
  66. package/dist/chunk-JVEDKKNO.cjs.map +1 -0
  67. package/dist/{chunk-6JMW3IJ2.cjs → chunk-JVLOIIA7.cjs} +103 -100
  68. package/dist/chunk-JVLOIIA7.cjs.map +1 -0
  69. package/dist/{chunk-UUENH4BJ.cjs → chunk-KXIRVKCJ.cjs} +3 -3
  70. package/dist/{chunk-UUENH4BJ.cjs.map → chunk-KXIRVKCJ.cjs.map} +1 -1
  71. package/dist/{chunk-YVO6Z5BS.cjs → chunk-M6WVIGYP.cjs} +10 -10
  72. package/dist/{chunk-YVO6Z5BS.cjs.map → chunk-M6WVIGYP.cjs.map} +1 -1
  73. package/dist/{chunk-PSB64T43.cjs → chunk-MLA2BJ2Y.cjs} +28 -28
  74. package/dist/{chunk-PSB64T43.cjs.map → chunk-MLA2BJ2Y.cjs.map} +1 -1
  75. package/dist/{chunk-B3R62764.cjs → chunk-MMSHIIKG.cjs} +6 -6
  76. package/dist/{chunk-B3R62764.cjs.map → chunk-MMSHIIKG.cjs.map} +1 -1
  77. package/dist/{chunk-ENOPKX7E.cjs → chunk-MXBXZXXQ.cjs} +3 -3
  78. package/dist/{chunk-ENOPKX7E.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
  79. package/dist/chunk-NTDQQLDD.cjs +18 -0
  80. package/dist/{chunk-IRGRMJPP.cjs.map → chunk-NTDQQLDD.cjs.map} +1 -1
  81. package/dist/{chunk-PVJ5ODDB.cjs → chunk-Q6IKXWPG.cjs} +4 -4
  82. package/dist/{chunk-PVJ5ODDB.cjs.map → chunk-Q6IKXWPG.cjs.map} +1 -1
  83. package/dist/{chunk-4LP5MJGQ.cjs → chunk-QG2U2JGX.cjs} +4 -4
  84. package/dist/{chunk-4LP5MJGQ.cjs.map → chunk-QG2U2JGX.cjs.map} +1 -1
  85. package/dist/{chunk-MVXHTAJ4.cjs → chunk-QWVUBTW3.cjs} +9 -9
  86. package/dist/{chunk-MVXHTAJ4.cjs.map → chunk-QWVUBTW3.cjs.map} +1 -1
  87. package/dist/{chunk-OHWHYVKG.cjs → chunk-T73BHNQX.cjs} +3 -3
  88. package/dist/{chunk-OHWHYVKG.cjs.map → chunk-T73BHNQX.cjs.map} +1 -1
  89. package/dist/{chunk-PWBRE7JA.cjs → chunk-VLQCLQAS.cjs} +23 -10
  90. package/dist/chunk-VLQCLQAS.cjs.map +1 -0
  91. package/dist/{chunk-ADPRIBSH.cjs → chunk-X7ALF4MP.cjs} +7 -7
  92. package/dist/{chunk-ADPRIBSH.cjs.map → chunk-X7ALF4MP.cjs.map} +1 -1
  93. package/dist/{chunk-7RJZIPLE.cjs → chunk-YP5EBGLU.cjs} +33 -33
  94. package/dist/{chunk-7RJZIPLE.cjs.map → chunk-YP5EBGLU.cjs.map} +1 -1
  95. package/dist/{chunk-TSFNLY3K.cjs → chunk-ZCU72Q76.cjs} +192 -166
  96. package/dist/chunk-ZCU72Q76.cjs.map +1 -0
  97. package/dist/{chunk-BLIO3B7Z.cjs → chunk-ZYGAXD3N.cjs} +3 -3
  98. package/dist/{chunk-BLIO3B7Z.cjs.map → chunk-ZYGAXD3N.cjs.map} +1 -1
  99. package/dist/connect/docx.cjs +16 -16
  100. package/dist/connect/index.cjs +1095 -1114
  101. package/dist/connect/index.cjs.map +1 -1
  102. package/dist/connect/viewer.cjs +26 -27
  103. package/dist/connection/ai.d.ts +1 -0
  104. package/dist/connection/docx/ConnectedNativeDocxEditor.js +4 -5
  105. package/dist/connection/docx/ConnectedNativeDocxEditor.js.map +2 -2
  106. package/dist/connection/docx/save-native-version.d.ts +3 -0
  107. package/dist/connection/docx/save-native-version.js +19 -0
  108. package/dist/connection/docx/save-native-version.js.map +7 -0
  109. package/dist/connection/presentation/ClippingPdfViewer.js +8 -5
  110. package/dist/connection/presentation/ClippingPdfViewer.js.map +2 -2
  111. package/dist/connection/presentation/ConnectedSlidesTab.js +8 -13
  112. package/dist/connection/presentation/ConnectedSlidesTab.js.map +2 -2
  113. package/dist/connection/presentation/usePresentationController.js +24 -15
  114. package/dist/connection/presentation/usePresentationController.js.map +2 -2
  115. package/dist/connection/presentation/usePresentationFiles.d.ts +2 -1
  116. package/dist/connection/presentation/usePresentationFiles.js +15 -6
  117. package/dist/connection/presentation/usePresentationFiles.js.map +2 -2
  118. package/dist/connection/remote-control/ConnectedRemoteControlConsent.js +6 -3
  119. package/dist/connection/remote-control/ConnectedRemoteControlConsent.js.map +2 -2
  120. package/dist/connection/remote-control/ConnectedRemoteControlIndicator.js +12 -2
  121. package/dist/connection/remote-control/ConnectedRemoteControlIndicator.js.map +2 -2
  122. package/dist/connection/remote-control/ConnectedRemoteControlSwitch.js +1 -1
  123. package/dist/connection/remote-control/ConnectedRemoteControlSwitch.js.map +1 -1
  124. package/dist/connection/remote-control/browser-diagnostics.d.ts +7 -0
  125. package/dist/connection/remote-control/browser-diagnostics.js +109 -0
  126. package/dist/connection/remote-control/browser-diagnostics.js.map +7 -0
  127. package/dist/connection/remote-control/remoteControl.d.ts +9 -1
  128. package/dist/connection/remote-control/remoteControl.js +130 -10
  129. package/dist/connection/remote-control/remoteControl.js.map +2 -2
  130. package/dist/connection/remote-control/screen-sharing.d.ts +11 -0
  131. package/dist/connection/remote-control/screen-sharing.js +78 -0
  132. package/dist/connection/remote-control/screen-sharing.js.map +7 -0
  133. package/dist/connection/report-problem/screen-capture.d.ts +1 -0
  134. package/dist/connection/report-problem/screen-capture.js +2 -1
  135. package/dist/connection/report-problem/screen-capture.js.map +2 -2
  136. package/dist/connection/search/ConnectedSearchPage.d.ts +0 -11
  137. package/dist/connection/search/ConnectedSearchPage.js +3 -0
  138. package/dist/connection/search/ConnectedSearchPage.js.map +2 -2
  139. package/dist/connection/search/SearchResultRows.js +75 -43
  140. package/dist/connection/search/SearchResultRows.js.map +2 -2
  141. package/dist/connection/viewer/CleanViewControl.d.ts +3 -1
  142. package/dist/connection/viewer/CleanViewControl.js +5 -1
  143. package/dist/connection/viewer/CleanViewControl.js.map +2 -2
  144. package/dist/connection/viewer/ConnectedDocumentViewer.js +1 -1
  145. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  146. package/dist/connection/viewer/useCleanView.d.ts +1 -1
  147. package/dist/connection/viewer/useCleanView.js +2 -2
  148. package/dist/connection/viewer/useCleanView.js.map +2 -2
  149. package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
  150. package/dist/document-tools/index.cjs +20 -20
  151. package/dist/docx/NativeDocxEditor.d.ts +2 -1
  152. package/dist/docx/NativeDocxEditor.js +34 -7
  153. package/dist/docx/NativeDocxEditor.js.map +2 -2
  154. package/dist/docx/index.cjs +38 -38
  155. package/dist/docx/useVersionAutosave.d.ts +10 -0
  156. package/dist/docx/useVersionAutosave.js +36 -0
  157. package/dist/docx/useVersionAutosave.js.map +7 -0
  158. package/dist/embed/index.cjs +19 -19
  159. package/dist/facts/index.cjs +64 -64
  160. package/dist/files/index.cjs +223 -223
  161. package/dist/index.cjs +542 -542
  162. package/dist/presentation/ClipCaptureOverlay.js +14 -1
  163. package/dist/presentation/ClipCaptureOverlay.js.map +2 -2
  164. package/dist/presentation/ClipImage.js +7 -4
  165. package/dist/presentation/ClipImage.js.map +2 -2
  166. package/dist/presentation/ClipTray.js +11 -7
  167. package/dist/presentation/ClipTray.js.map +2 -2
  168. package/dist/presentation/SlidesEditor.js +6 -2
  169. package/dist/presentation/SlidesEditor.js.map +2 -2
  170. package/dist/presentation/store.d.ts +2 -0
  171. package/dist/presentation/store.js +15 -0
  172. package/dist/presentation/store.js.map +3 -3
  173. package/dist/settings/index.cjs +146 -146
  174. package/dist/shell/RemoteControlPill.d.ts +2 -1
  175. package/dist/shell/RemoteControlPill.js +10 -3
  176. package/dist/shell/RemoteControlPill.js.map +2 -2
  177. package/dist/shell/index.cjs +21 -21
  178. package/dist/site/index.cjs +6 -6
  179. package/dist/studio/index.cjs +9 -9
  180. package/dist/workflow-canvas/index.cjs +34 -34
  181. package/node_modules/@arbidocs/coedit/package.json +1 -1
  182. package/package.json +5 -5
  183. package/dist/ClippingMediaViewer-ZFEX5A3U.cjs.map +0 -1
  184. package/dist/ClippingPdfViewer-3LRTEPHV.cjs.map +0 -1
  185. package/dist/ConnectedPresentation-L32JPRFI.cjs.map +0 -1
  186. package/dist/ConnectedSlidesTab-P7GGNUTO.cjs.map +0 -1
  187. package/dist/FilesViewerDialog-MHUVEZ7M.cjs.map +0 -1
  188. package/dist/SpotlightStrip-ED22UYTM.cjs.map +0 -1
  189. package/dist/chunk-6JMW3IJ2.cjs.map +0 -1
  190. package/dist/chunk-GAMRVB3I.cjs.map +0 -1
  191. package/dist/chunk-GFUOCGY6.cjs +0 -32
  192. package/dist/chunk-GFUOCGY6.cjs.map +0 -1
  193. package/dist/chunk-IRGRMJPP.cjs +0 -18
  194. package/dist/chunk-JY7UUZQG.cjs.map +0 -1
  195. package/dist/chunk-KA3F6TIH.cjs.map +0 -1
  196. package/dist/chunk-OGK377NL.cjs.map +0 -1
  197. package/dist/chunk-ORNLCBNE.cjs.map +0 -1
  198. package/dist/chunk-PWBRE7JA.cjs.map +0 -1
  199. package/dist/chunk-TSFNLY3K.cjs.map +0 -1
  200. package/dist/chunk-ZZZITHGK.cjs.map +0 -1
package/README.md CHANGED
@@ -951,6 +951,25 @@ connection registers the handler; a host with its own socket passes `useRemoteCo
951
951
  `ArbiWebSocketProvider`'s `handlers`. With remote control off, the handler, prompt, pill and switch
952
952
  are absent; "Show me" works either way.
953
953
 
954
+ For troubleshooting, backend `view_screen` requests use the same dialog with **Start sharing**, **Share one image**,
955
+ and **Deny**. Start sharing retains the browser-selected tab/window stream across chat turns; each tool call takes
956
+ one fresh native frame. The pill exposes a visible **Stop sharing** button. That button, the browser's own Stop,
957
+ sign-out, workspace change, and runtime teardown close the stream and revoke control together. There is no recording
958
+ or audio. Browser permission to choose the surface remains required even when remote control was already enabled.
959
+
960
+ While sharing, a bounded in-memory feed collects ARBI console warnings/errors, uncaught errors/rejections and failed
961
+ request summaries, using the existing error-report formatter. The SDK's `diagnose()` supplies content-free connection,
962
+ session and workspace checks. Replies also list visible ARBI controls with selectors. No request/response bodies,
963
+ headers, storage, or form values are collected; URL queries/fragments and common credential patterns are removed.
964
+ The feed starts at sharing, clears at Stop, and cannot read prior DevTools history or another tab's console. Diagnostics
965
+ always describe ARBI even if the user shares another surface. Fresh frame evidence travels through authenticated,
966
+ owner/workspace/session-bound replies and expires after consumption; it is not uploaded as a document.
967
+
968
+ Workspace `control_ui` requests acknowledge runner completion/denial/Stop back to the agent. Completion means the
969
+ sequence finished, not proof that every target existed or a change succeeded; use a fresh `view_screen` inspection
970
+ to verify effects. Viewing and control share the existing grant, while control remains limited to ARBI's guided runner.
971
+
972
+
954
973
  ## Workflows page
955
974
 
956
975
  `ConnectedWorkflowsPage` (`@arbidocs/blocks/workflow-canvas`) is the whole Workflows page: one
@@ -1,11 +1,10 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkZZZITHGK_cjs = require('./chunk-ZZZITHGK.cjs');
4
+ var chunk26SFI2BH_cjs = require('./chunk-26SFI2BH.cjs');
5
5
  var chunkWOOOMTTA_cjs = require('./chunk-WOOOMTTA.cjs');
6
- var chunkMVXHTAJ4_cjs = require('./chunk-MVXHTAJ4.cjs');
7
- var chunkORNLCBNE_cjs = require('./chunk-ORNLCBNE.cjs');
8
- require('./chunk-GFUOCGY6.cjs');
6
+ var chunkQWVUBTW3_cjs = require('./chunk-QWVUBTW3.cjs');
7
+ var chunkJVEDKKNO_cjs = require('./chunk-JVEDKKNO.cjs');
9
8
  var react = require('react');
10
9
  var lucideReact = require('lucide-react');
11
10
  var ui = require('@arbidocs/react/ui');
@@ -42,7 +41,7 @@ function ClippingMediaViewer({
42
41
  const capture = react.useCallback(
43
42
  ({ rect, aspect }) => {
44
43
  const start = kind === "video" ? videoRef.current?.currentTime ?? 0 : void 0;
45
- chunkMVXHTAJ4_cjs.useSpotlight.getState().gather({
44
+ chunkQWVUBTW3_cjs.useSpotlight.getState().gather({
46
45
  kind,
47
46
  documentId,
48
47
  fileName,
@@ -52,7 +51,7 @@ function ClippingMediaViewer({
52
51
  masks: [],
53
52
  source: file,
54
53
  start,
55
- caption: chunkORNLCBNE_cjs.mediaCaption(fileName, start)
54
+ caption: chunkJVEDKKNO_cjs.mediaCaption(fileName, start)
56
55
  });
57
56
  },
58
57
  [kind, documentId, fileName, file]
@@ -90,7 +89,7 @@ function ClippingMediaViewer({
90
89
  className: "block h-full w-full select-none"
91
90
  }
92
91
  ),
93
- natural && /* @__PURE__ */ jsxRuntime.jsx(chunkZZZITHGK_cjs.ClipCaptureOverlay, { page: 1, onCapture: capture })
92
+ natural && /* @__PURE__ */ jsxRuntime.jsx(chunk26SFI2BH_cjs.ClipCaptureOverlay, { page: 1, onCapture: capture })
94
93
  ]
95
94
  }
96
95
  ) }),
@@ -129,9 +128,9 @@ function ClippingMediaViewer({
129
128
  }
130
129
  ),
131
130
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs tabular-nums text-muted-foreground", children: [
132
- chunkORNLCBNE_cjs.formatTime(time),
131
+ chunkJVEDKKNO_cjs.formatTime(time),
133
132
  " / ",
134
- chunkORNLCBNE_cjs.formatTime(duration)
133
+ chunkJVEDKKNO_cjs.formatTime(duration)
135
134
  ] }),
136
135
  /* @__PURE__ */ jsxRuntime.jsxs(
137
136
  ui.Button,
@@ -153,5 +152,5 @@ function ClippingMediaViewer({
153
152
  }
154
153
 
155
154
  exports.ClippingMediaViewer = ClippingMediaViewer;
156
- //# sourceMappingURL=ClippingMediaViewer-ZFEX5A3U.cjs.map
157
- //# sourceMappingURL=ClippingMediaViewer-ZFEX5A3U.cjs.map
155
+ //# sourceMappingURL=ClippingMediaViewer-47BAXNLO.cjs.map
156
+ //# sourceMappingURL=ClippingMediaViewer-47BAXNLO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/connection/presentation/ClippingMediaViewer.tsx"],"names":["useObjectUrl","useRef","useState","useEffect","useCallback","useSpotlight","mediaCaption","jsxs","jsx","ClipCaptureOverlay","Button","Pause","Play","formatTime","Plus"],"mappings":"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","file":"ClippingMediaViewer-47BAXNLO.cjs","sourcesContent":["/**\n * An image or a video while clipping for a presentation: drag over it and that area becomes a clip\n * (of a video: from the moment on screen). A video has its own small bar (play / pause, scrub, and\n * \"Add whole frame\"), since the drag area covers the picture.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { Pause, Play, Plus } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ClipCaptureOverlay } from '../../presentation/ClipCaptureOverlay'\nimport { formatTime, mediaCaption, type Rect } from '../../presentation/model'\nimport { useSpotlight } from '../../presentation/spotlight'\nimport { useObjectUrl } from '../../presentation/useObjectUrl'\n\nexport interface ClippingMediaViewerProps {\n file: Blob\n kind: 'image' | 'video'\n documentId: string\n fileName: string\n}\n\nconst WHOLE: Rect = { x: 0, y: 0, w: 1, h: 1 }\n\nexport function ClippingMediaViewer({\n file,\n kind,\n documentId,\n fileName,\n}: ClippingMediaViewerProps) {\n const url = useObjectUrl(file)\n const videoRef = useRef<HTMLVideoElement>(null)\n const imageRef = useRef<HTMLImageElement>(null)\n // The picture's own width / height, once known.\n const [natural, setNatural] = useState<number | null>(null)\n const [time, setTime] = useState(0)\n const [duration, setDuration] = useState(0)\n const [playing, setPlaying] = useState(false)\n\n // Its size, read as soon as it is known: at once if it already loaded (a cached file can load\n // before any handler is attached), else when it does.\n useEffect(() => {\n const media = videoRef.current ?? imageRef.current\n if (!media || !url) return\n const read = () => {\n const width = media instanceof HTMLVideoElement ? media.videoWidth : media.naturalWidth\n const height = media instanceof HTMLVideoElement ? media.videoHeight : media.naturalHeight\n if (width && height) setNatural(width / height)\n if (media instanceof HTMLVideoElement) setDuration(media.duration || 0)\n }\n read()\n const event = media instanceof HTMLVideoElement ? 'loadedmetadata' : 'load'\n media.addEventListener(event, read)\n return () => media.removeEventListener(event, read)\n }, [url])\n\n const capture = useCallback(\n ({ rect, aspect }: { rect: Rect; aspect: number }) => {\n const start = kind === 'video' ? (videoRef.current?.currentTime ?? 0) : undefined\n useSpotlight.getState().gather({\n kind,\n documentId,\n fileName,\n page: 1,\n rect,\n aspect,\n masks: [],\n source: file,\n start,\n caption: mediaCaption(fileName, start),\n })\n },\n [kind, documentId, fileName, file]\n )\n\n return (\n <div className=\"flex h-full min-h-0 flex-col\" data-testid=\"clipping-media-viewer\">\n <div className=\"border-b border-border bg-muted px-3 py-1.5 text-xs text-muted-foreground\">\n {kind === 'video'\n ? 'Drag over the video to clip that area from this moment, or add the whole frame.'\n : 'Drag over the part of the image to clip it.'}\n </div>\n <div className=\"relative min-h-0 flex-1 bg-black\" style={{ containerType: 'size' }}>\n {/* The picture as large as fits, aspect kept; the drag area covers exactly it. */}\n <div\n className=\"absolute inset-0 m-auto\"\n style={\n natural\n ? {\n width: `min(100cqw, calc(100cqh * ${natural}))`,\n height: `min(100cqh, calc(100cqw / ${natural}))`,\n }\n : { width: '100%', height: '100%' }\n }\n >\n {kind === 'video' ? (\n <video\n ref={videoRef}\n src={url}\n playsInline\n preload=\"auto\"\n className=\"block h-full w-full\"\n onTimeUpdate={(event) => setTime(event.currentTarget.currentTime)}\n onPlay={() => setPlaying(true)}\n onPause={() => setPlaying(false)}\n />\n ) : (\n <img\n ref={imageRef}\n src={url}\n alt={fileName}\n draggable={false}\n className=\"block h-full w-full select-none\"\n />\n )}\n {natural && <ClipCaptureOverlay page={1} onCapture={capture} />}\n </div>\n </div>\n {kind === 'video' && (\n <div className=\"flex items-center gap-2 border-t border-border px-3 py-1.5\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8\"\n onClick={() => {\n const v = videoRef.current\n if (!v) return\n if (v.paused) void v.play()\n else v.pause()\n }}\n aria-label={playing ? 'Pause' : 'Play'}\n >\n {playing ? <Pause className=\"size-4\" /> : <Play className=\"size-4\" />}\n </Button>\n <input\n type=\"range\"\n min={0}\n max={duration || 0}\n step={0.1}\n value={time}\n onChange={(event) => {\n const v = videoRef.current\n if (v) v.currentTime = Number(event.target.value)\n }}\n className=\"min-w-0 flex-1\"\n aria-label=\"Position in the video\"\n />\n <span className=\"text-xs tabular-nums text-muted-foreground\">\n {formatTime(time)} / {formatTime(duration)}\n </span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={!natural}\n onClick={() => natural && capture({ rect: WHOLE, aspect: natural })}\n data-testid=\"clip-whole-frame\"\n >\n <Plus className=\"mr-1 size-4\" />\n Add whole frame\n </Button>\n </div>\n )}\n </div>\n )\n}\n"]}
@@ -1,11 +1,10 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkZZZITHGK_cjs = require('./chunk-ZZZITHGK.cjs');
4
+ var chunk26SFI2BH_cjs = require('./chunk-26SFI2BH.cjs');
5
5
  var chunkJITYC4OS_cjs = require('./chunk-JITYC4OS.cjs');
6
- var chunkMVXHTAJ4_cjs = require('./chunk-MVXHTAJ4.cjs');
7
- require('./chunk-ORNLCBNE.cjs');
8
- require('./chunk-GFUOCGY6.cjs');
6
+ var chunkQWVUBTW3_cjs = require('./chunk-QWVUBTW3.cjs');
7
+ require('./chunk-JVEDKKNO.cjs');
9
8
  var react = require('react');
10
9
  var react$1 = require('@arbidocs/react');
11
10
  var documentTools = require('@arbidocs/react/document-tools');
@@ -40,17 +39,20 @@ function useRedactionMasks(documentId, version, hasMarkup) {
40
39
  }
41
40
  var NO_FOOTNOTES = {};
42
41
  var NO_PASSAGES = /* @__PURE__ */ new Map();
43
- function usePassageAreas(documentId, current) {
44
- const { data: parsed } = react$1.useParsedDocument(documentId, "final", { enabled: current });
42
+ function usePassageAreas(documentId, version) {
43
+ const { data: parsed } = react$1.useParsedDocument(
44
+ version ? `${documentId}@v${version}` : documentId,
45
+ "final"
46
+ );
45
47
  const { processedChunks } = viewers.useProcessedChunks(parsed?.chunks, NO_FOOTNOTES);
46
48
  return react.useMemo(() => {
47
- if (!current || !processedChunks.length) return NO_PASSAGES;
49
+ if (!processedChunks.length) return NO_PASSAGES;
48
50
  const areas = /* @__PURE__ */ new Map();
49
51
  for (const [page, boxes] of chunkJITYC4OS_cjs.placedPassagesByPage(processedChunks)) {
50
- areas.set(page, boxes.map(chunkZZZITHGK_cjs.passageClipRect));
52
+ areas.set(page, boxes.map(chunk26SFI2BH_cjs.passageClipRect));
51
53
  }
52
54
  return areas;
53
- }, [current, processedChunks]);
55
+ }, [processedChunks]);
54
56
  }
55
57
  function Notice({ children }) {
56
58
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-b border-border bg-muted px-3 py-1.5 text-xs text-muted-foreground", children });
@@ -64,12 +66,12 @@ function ClippingPdfViewer({
64
66
  ...viewerProps
65
67
  }) {
66
68
  const masks = useRedactionMasks(documentId, version, hasMarkup);
67
- const passages = usePassageAreas(documentId, version === void 0);
69
+ const passages = usePassageAreas(documentId, version);
68
70
  const file = viewerProps.file;
69
71
  const capture = react.useCallback(
70
72
  ({ page, rect, aspect }) => {
71
73
  if (masks.status !== "ready") return;
72
- chunkMVXHTAJ4_cjs.useSpotlight.getState().gather({
74
+ chunkQWVUBTW3_cjs.useSpotlight.getState().gather({
73
75
  kind: "pdf",
74
76
  documentId,
75
77
  version,
@@ -85,7 +87,7 @@ function ClippingPdfViewer({
85
87
  );
86
88
  const renderPageOverlay = react.useCallback(
87
89
  ({ pageNumber }) => masks.status === "ready" ? /* @__PURE__ */ jsxRuntime.jsx(
88
- chunkZZZITHGK_cjs.ClipCaptureOverlay,
90
+ chunk26SFI2BH_cjs.ClipCaptureOverlay,
89
91
  {
90
92
  page: pageNumber,
91
93
  passages: passages.get(pageNumber),
@@ -109,5 +111,5 @@ function ClippingPdfViewer({
109
111
  }
110
112
 
111
113
  exports.ClippingPdfViewer = ClippingPdfViewer;
112
- //# sourceMappingURL=ClippingPdfViewer-3LRTEPHV.cjs.map
113
- //# sourceMappingURL=ClippingPdfViewer-3LRTEPHV.cjs.map
114
+ //# sourceMappingURL=ClippingPdfViewer-D5BYHEAH.cjs.map
115
+ //# sourceMappingURL=ClippingPdfViewer-D5BYHEAH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/connection/presentation/ClippingPdfViewer.tsx"],"names":["useDocumentTools","useState","useEffect","createMarkupStore","useParsedDocument","useProcessedChunks","useMemo","placedPassagesByPage","passageClipRect","jsx","useCallback","useSpotlight","ClipCaptureOverlay","jsxs"],"mappings":"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","file":"ClippingPdfViewer-D5BYHEAH.cjs","sourcesContent":["/**\n * The PDF while clipping: a click on a passage clips that passage (outlined under the pointer), a\n * drag over a page clips that area. Clips are gathered in the viewer's spotlight strip\n * (`SpotlightStrip`), to show over the document or keep as a slide.\n *\n * Redactions are honoured: when the version has markup, its redaction marks (all but rejected\n * ones) are read first and every clip carries those over its area as black masks, so a redacted\n * passage never reaches a shared screen. Clipping waits for them, and stays off if they cannot be\n * read.\n */\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react'\nimport { useParsedDocument } from '@arbidocs/react'\nimport { createMarkupStore, useDocumentTools } from '@arbidocs/react/document-tools'\nimport { useProcessedChunks, type PdfViewerProps } from '@arbidocs/react/viewers'\nimport { ClipCaptureOverlay } from '../../presentation/ClipCaptureOverlay'\nimport type { Rect } from '../../presentation/model'\nimport { passageClipRect } from '../../presentation/passage-clip'\nimport { useSpotlight } from '../../presentation/spotlight'\nimport { placedPassagesByPage } from '../viewer/pdf/passageHighlights'\n\ntype MaskState =\n | { status: 'loading' }\n | { status: 'error' }\n | { status: 'ready'; masks: ReadonlyMap<number, Rect[]> }\n\nconst NO_MASKS: MaskState = { status: 'ready', masks: new Map() }\n\n/** The version's redaction rectangles by page; none to read when it has no markup. */\nfunction useRedactionMasks(documentId: string, version: number | undefined, hasMarkup: boolean) {\n const { client } = useDocumentTools()\n const [state, setState] = useState<MaskState>(hasMarkup ? { status: 'loading' } : NO_MASKS)\n useEffect(() => {\n if (!hasMarkup) {\n setState(NO_MASKS)\n return\n }\n let cancelled = false\n setState({ status: 'loading' })\n createMarkupStore({ version, client })\n .load(documentId)\n .then((layer) => {\n if (cancelled) return\n const masks = new Map<number, Rect[]>()\n for (const mark of layer.annotations) {\n if (mark.kind !== 'redaction' || mark.status === 'rejected') continue\n masks.set(mark.page, [...(masks.get(mark.page) ?? []), ...mark.rects])\n }\n setState({ status: 'ready', masks })\n })\n .catch(() => !cancelled && setState({ status: 'error' }))\n return () => {\n cancelled = true\n }\n }, [client, documentId, version, hasMarkup])\n return state\n}\n\nconst NO_FOOTNOTES: Record<string, string> = {}\nconst NO_PASSAGES: ReadonlyMap<number, Rect[]> = new Map()\n\n/**\n * The areas a click clips, by page: each passage the parser placed, with its margin. Only for the\n * current version (the passages are its own); an older one is clipped by dragging.\n */\nfunction usePassageAreas(documentId: string, version?: number): ReadonlyMap<number, Rect[]> {\n const { data: parsed } = useParsedDocument(\n version ? `${documentId}@v${version}` : documentId,\n 'final'\n )\n const { processedChunks } = useProcessedChunks(parsed?.chunks, NO_FOOTNOTES)\n return useMemo(() => {\n if (!processedChunks.length) return NO_PASSAGES\n const areas = new Map<number, Rect[]>()\n for (const [page, boxes] of placedPassagesByPage(processedChunks)) {\n areas.set(page, boxes.map(passageClipRect))\n }\n return areas\n }, [processedChunks])\n}\n\nexport interface ClippingPdfViewerProps extends Omit<PdfViewerProps, 'renderPageOverlay'> {\n file: Blob\n documentId: string\n /** The version on screen when it is an older one. */\n version?: number\n fileName: string\n /** The version has markup, which may hold redactions. */\n hasMarkup: boolean\n viewer: ComponentType<PdfViewerProps>\n}\n\nfunction Notice({ children }: { children: ReactNode }) {\n return (\n <div className=\"border-b border-border bg-muted px-3 py-1.5 text-xs text-muted-foreground\">\n {children}\n </div>\n )\n}\n\nexport function ClippingPdfViewer({\n documentId,\n version,\n fileName,\n hasMarkup,\n viewer: Viewer,\n ...viewerProps\n}: ClippingPdfViewerProps) {\n const masks = useRedactionMasks(documentId, version, hasMarkup)\n const passages = usePassageAreas(documentId, version)\n const file = viewerProps.file\n\n const capture = useCallback(\n ({ page, rect, aspect }: { page: number; rect: Rect; aspect: number }) => {\n if (masks.status !== 'ready') return\n useSpotlight.getState().gather({\n kind: 'pdf',\n documentId,\n version,\n fileName,\n page,\n rect,\n aspect,\n masks: masks.masks.get(page) ?? [],\n source: file,\n })\n // It joins the viewer's spotlight strip.\n },\n [masks, documentId, version, fileName, file]\n )\n\n const renderPageOverlay = useCallback(\n ({ pageNumber }: { pageNumber: number }) =>\n masks.status === 'ready' ? (\n <ClipCaptureOverlay\n page={pageNumber}\n passages={passages.get(pageNumber)}\n onCapture={capture}\n />\n ) : null,\n [masks.status, capture, passages]\n )\n\n return (\n <div\n className=\"flex h-full min-h-0 flex-col\"\n // The spotlight finds a clip's page here, to fly it from there.\n data-clip-document={documentId}\n data-testid=\"clipping-pdf-viewer\"\n >\n <Notice>\n {masks.status === 'loading'\n ? 'Reading the redactions before clipping…'\n : masks.status === 'error'\n ? \"Couldn't read this document's redactions, so it can't be clipped.\"\n : passages.size\n ? 'Click a passage to clip it, or drag over any area.'\n : 'Drag over the part of a page to clip it.'}\n </Notice>\n <div className=\"min-h-0 flex-1\">\n <Viewer {...viewerProps} renderPageOverlay={renderPageOverlay} />\n </div>\n </div>\n )\n}\n"]}
@@ -16,31 +16,31 @@ require('./chunk-KLMNCBLY.cjs');
16
16
  require('./chunk-KNGZZC4O.cjs');
17
17
  require('./chunk-5SKHK3BG.cjs');
18
18
  require('./chunk-IDCD5TEZ.cjs');
19
+ require('./chunk-JHDCDEXY.cjs');
20
+ require('./chunk-M2FOXGJU.cjs');
21
+ require('./chunk-5F4DCIHS.cjs');
19
22
  require('./chunk-CT3SLXB7.cjs');
20
23
  require('./chunk-DEXUL3T6.cjs');
21
24
  require('./chunk-AFQTQC7A.cjs');
22
25
  require('./chunk-XJEXFEWG.cjs');
23
- require('./chunk-JHDCDEXY.cjs');
24
- require('./chunk-M2FOXGJU.cjs');
25
- require('./chunk-5F4DCIHS.cjs');
26
26
  require('./chunk-Z2XZ2D4N.cjs');
27
27
  require('./chunk-YZSQ7F5K.cjs');
28
28
  require('./chunk-MCXS6X37.cjs');
29
29
  require('./chunk-KQF7POTG.cjs');
30
30
  require('./chunk-75BNMCUX.cjs');
31
31
  require('./chunk-IN6ILI5A.cjs');
32
- require('./chunk-FX3K6LNZ.cjs');
33
32
  require('./chunk-HSLPFBK2.cjs');
33
+ require('./chunk-FX3K6LNZ.cjs');
34
34
  require('./chunk-QGVOT7E4.cjs');
35
- require('./chunk-IPSHAMO2.cjs');
36
35
  require('./chunk-QRAQZTJE.cjs');
37
36
  require('./chunk-UDSHVNU3.cjs');
37
+ require('./chunk-IPSHAMO2.cjs');
38
38
  var chunkZBP4ZSAJ_cjs = require('./chunk-ZBP4ZSAJ.cjs');
39
39
  require('./chunk-PPCATBOY.cjs');
40
- require('./chunk-LJJJ6CYH.cjs');
41
40
  require('./chunk-TKHCIHE2.cjs');
42
41
  require('./chunk-JDFBEGQO.cjs');
43
42
  require('./chunk-ULWRNGGE.cjs');
43
+ require('./chunk-LJJJ6CYH.cjs');
44
44
  require('./chunk-PLIF5CUV.cjs');
45
45
  var react = require('@arbidocs/react');
46
46
  var react$1 = require('react');
@@ -16,31 +16,31 @@ require('./chunk-KLMNCBLY.cjs');
16
16
  require('./chunk-KNGZZC4O.cjs');
17
17
  require('./chunk-5SKHK3BG.cjs');
18
18
  require('./chunk-IDCD5TEZ.cjs');
19
+ require('./chunk-JHDCDEXY.cjs');
20
+ require('./chunk-M2FOXGJU.cjs');
21
+ require('./chunk-5F4DCIHS.cjs');
19
22
  require('./chunk-CT3SLXB7.cjs');
20
23
  require('./chunk-DEXUL3T6.cjs');
21
24
  require('./chunk-AFQTQC7A.cjs');
22
25
  require('./chunk-XJEXFEWG.cjs');
23
- require('./chunk-JHDCDEXY.cjs');
24
- require('./chunk-M2FOXGJU.cjs');
25
- require('./chunk-5F4DCIHS.cjs');
26
26
  require('./chunk-Z2XZ2D4N.cjs');
27
27
  require('./chunk-YZSQ7F5K.cjs');
28
28
  require('./chunk-MCXS6X37.cjs');
29
29
  require('./chunk-KQF7POTG.cjs');
30
30
  require('./chunk-75BNMCUX.cjs');
31
31
  require('./chunk-IN6ILI5A.cjs');
32
- require('./chunk-FX3K6LNZ.cjs');
33
32
  require('./chunk-HSLPFBK2.cjs');
33
+ require('./chunk-FX3K6LNZ.cjs');
34
34
  require('./chunk-QGVOT7E4.cjs');
35
- require('./chunk-IPSHAMO2.cjs');
36
35
  require('./chunk-QRAQZTJE.cjs');
37
36
  require('./chunk-UDSHVNU3.cjs');
37
+ require('./chunk-IPSHAMO2.cjs');
38
38
  require('./chunk-ZBP4ZSAJ.cjs');
39
39
  require('./chunk-PPCATBOY.cjs');
40
- require('./chunk-LJJJ6CYH.cjs');
41
40
  require('./chunk-TKHCIHE2.cjs');
42
41
  require('./chunk-JDFBEGQO.cjs');
43
42
  require('./chunk-ULWRNGGE.cjs');
43
+ require('./chunk-LJJJ6CYH.cjs');
44
44
  require('./chunk-PLIF5CUV.cjs');
45
45
 
46
46
 
@@ -1,21 +1,21 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkB3R62764_cjs = require('./chunk-B3R62764.cjs');
5
- require('./chunk-PVJ5ODDB.cjs');
6
- require('./chunk-GAMRVB3I.cjs');
4
+ var chunkMMSHIIKG_cjs = require('./chunk-MMSHIIKG.cjs');
5
+ require('./chunk-Q6IKXWPG.cjs');
6
+ require('./chunk-23I5EUZA.cjs');
7
7
  require('./chunk-GA5ZO4YA.cjs');
8
8
  require('./chunk-VG5XNE4H.cjs');
9
9
  require('./chunk-DDWLMYRO.cjs');
10
- require('./chunk-PWBRE7JA.cjs');
10
+ require('./chunk-VLQCLQAS.cjs');
11
11
  require('./chunk-4ONPEVTP.cjs');
12
12
  require('./chunk-V3KLUWQQ.cjs');
13
- require('./chunk-ZESMRGDV.cjs');
14
13
  require('./chunk-P5AQYC4D.cjs');
15
14
  require('./chunk-WAV762GP.cjs');
15
+ require('./chunk-ZESMRGDV.cjs');
16
16
  require('./chunk-UKOYN2WD.cjs');
17
17
  require('./chunk-RC25WMVB.cjs');
18
- require('./chunk-BLIO3B7Z.cjs');
18
+ require('./chunk-ZYGAXD3N.cjs');
19
19
  require('./chunk-JJZOL5MG.cjs');
20
20
  require('./chunk-3YEXZX4H.cjs');
21
21
  require('./chunk-4PA6VCCR.cjs');
@@ -25,8 +25,8 @@ require('./chunk-RL2HI6NP.cjs');
25
25
  require('./chunk-6UZC4XVV.cjs');
26
26
  require('./chunk-YVCOQHCE.cjs');
27
27
  require('./chunk-JV5TVUOU.cjs');
28
- require('./chunk-VZOOGA47.cjs');
29
28
  require('./chunk-ZVEW3JBT.cjs');
29
+ require('./chunk-VZOOGA47.cjs');
30
30
  require('./chunk-HQDR43JC.cjs');
31
31
  require('./chunk-JR2YSBD5.cjs');
32
32
  require('./chunk-3YZKDCWY.cjs');
@@ -34,21 +34,21 @@ require('./chunk-SJSGSHIT.cjs');
34
34
  require('./chunk-ZW6FPIFC.cjs');
35
35
  require('./chunk-75BNMCUX.cjs');
36
36
  require('./chunk-QGVOT7E4.cjs');
37
- require('./chunk-IPSHAMO2.cjs');
38
37
  require('./chunk-QRAQZTJE.cjs');
39
38
  require('./chunk-UDSHVNU3.cjs');
39
+ require('./chunk-IPSHAMO2.cjs');
40
40
  require('./chunk-PPCATBOY.cjs');
41
- require('./chunk-LJJJ6CYH.cjs');
42
41
  require('./chunk-TKHCIHE2.cjs');
43
42
  require('./chunk-JDFBEGQO.cjs');
44
43
  require('./chunk-ULWRNGGE.cjs');
44
+ require('./chunk-LJJJ6CYH.cjs');
45
45
  require('./chunk-PLIF5CUV.cjs');
46
46
 
47
47
 
48
48
 
49
49
  Object.defineProperty(exports, "ConnectedNativeDocxComparison", {
50
50
  enumerable: true,
51
- get: function () { return chunkB3R62764_cjs.ConnectedNativeDocxComparison; }
51
+ get: function () { return chunkMMSHIIKG_cjs.ConnectedNativeDocxComparison; }
52
52
  });
53
- //# sourceMappingURL=ConnectedNativeDocxComparison-7QQ55JIO.cjs.map
54
- //# sourceMappingURL=ConnectedNativeDocxComparison-7QQ55JIO.cjs.map
53
+ //# sourceMappingURL=ConnectedNativeDocxComparison-JUF2TI2P.cjs.map
54
+ //# sourceMappingURL=ConnectedNativeDocxComparison-JUF2TI2P.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ConnectedNativeDocxComparison-7QQ55JIO.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ConnectedNativeDocxComparison-JUF2TI2P.cjs"}
@@ -1,19 +1,18 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkTSFNLY3K_cjs = require('./chunk-TSFNLY3K.cjs');
5
- var chunk3ZZZO4F7_cjs = require('./chunk-3ZZZO4F7.cjs');
6
- var chunkJY7UUZQG_cjs = require('./chunk-JY7UUZQG.cjs');
4
+ var chunkZCU72Q76_cjs = require('./chunk-ZCU72Q76.cjs');
5
+ var chunkBY3QA3S5_cjs = require('./chunk-BY3QA3S5.cjs');
6
+ var chunk7Q46YAX4_cjs = require('./chunk-7Q46YAX4.cjs');
7
7
  require('./chunk-WOOOMTTA.cjs');
8
8
  var chunk6OK7ESTL_cjs = require('./chunk-6OK7ESTL.cjs');
9
9
  require('./chunk-5GCCUXMT.cjs');
10
- require('./chunk-WVZLAAIZ.cjs');
11
- var chunkADPRIBSH_cjs = require('./chunk-ADPRIBSH.cjs');
12
- var chunkORNLCBNE_cjs = require('./chunk-ORNLCBNE.cjs');
13
- var chunkPL7HUTM3_cjs = require('./chunk-PL7HUTM3.cjs');
14
- var chunkGFUOCGY6_cjs = require('./chunk-GFUOCGY6.cjs');
15
10
  require('./chunk-2F57IO7S.cjs');
16
11
  require('./chunk-UFT22LAB.cjs');
12
+ require('./chunk-WVZLAAIZ.cjs');
13
+ var chunkX7ALF4MP_cjs = require('./chunk-X7ALF4MP.cjs');
14
+ var chunkPL7HUTM3_cjs = require('./chunk-PL7HUTM3.cjs');
15
+ var chunkJVEDKKNO_cjs = require('./chunk-JVEDKKNO.cjs');
17
16
  require('./chunk-HYUKPHCT.cjs');
18
17
  require('./chunk-WAV762GP.cjs');
19
18
  require('./chunk-K4763GD5.cjs');
@@ -32,9 +31,9 @@ require('./chunk-SJSGSHIT.cjs');
32
31
  require('./chunk-XJEXFEWG.cjs');
33
32
  require('./chunk-YZSQ7F5K.cjs');
34
33
  require('./chunk-FX3K6LNZ.cjs');
35
- require('./chunk-IPSHAMO2.cjs');
36
34
  require('./chunk-QRAQZTJE.cjs');
37
35
  require('./chunk-UDSHVNU3.cjs');
36
+ require('./chunk-IPSHAMO2.cjs');
38
37
  require('./chunk-PPCATBOY.cjs');
39
38
  require('./chunk-TKHCIHE2.cjs');
40
39
  require('./chunk-JDFBEGQO.cjs');
@@ -58,11 +57,11 @@ function useStageShapedWindow(view, presenting) {
58
57
  Math.min(PRESENT_WIDTH, Math.round((view.screen.availWidth - chromeWidth) * 0.6))
59
58
  );
60
59
  const height = Math.min(
61
- Math.round(width / chunkORNLCBNE_cjs.STAGE_ASPECT),
60
+ Math.round(width / chunkJVEDKKNO_cjs.STAGE_ASPECT),
62
61
  view.screen.availHeight - chromeHeight
63
62
  );
64
63
  try {
65
- view.resizeTo(Math.round(height * chunkORNLCBNE_cjs.STAGE_ASPECT) + chromeWidth, height + chromeHeight);
64
+ view.resizeTo(Math.round(height * chunkJVEDKKNO_cjs.STAGE_ASPECT) + chromeWidth, height + chromeHeight);
66
65
  } catch {
67
66
  return;
68
67
  }
@@ -75,14 +74,14 @@ function useStageShapedWindow(view, presenting) {
75
74
  }, [view, presenting]);
76
75
  }
77
76
  function PresenterView({ onPresent, ...editor }) {
78
- const presenting = chunkORNLCBNE_cjs.usePresentation((s) => s.presenting);
77
+ const presenting = chunkJVEDKKNO_cjs.usePresentation((s) => s.presenting);
79
78
  const [view, setView] = react$1.useState(null);
80
79
  const rootRef = react$1.useCallback((node) => {
81
80
  if (node) setView(node.ownerDocument.defaultView);
82
81
  }, []);
83
- chunkADPRIBSH_cjs.usePresenterKeys(presenting ? view : null, true);
82
+ chunkX7ALF4MP_cjs.usePresenterKeys(presenting ? view : null, true);
84
83
  useStageShapedWindow(view, presenting);
85
- const active = chunk3ZZZO4F7_cjs.usePointerActive(presenting ? view : null);
84
+ const active = chunkBY3QA3S5_cjs.usePointerActive(presenting ? view : null);
86
85
  if (presenting) {
87
86
  return /* @__PURE__ */ jsxRuntime.jsxs(
88
87
  "div",
@@ -91,23 +90,23 @@ function PresenterView({ onPresent, ...editor }) {
91
90
  className: "relative h-full w-full select-none bg-black",
92
91
  style: { cursor: active ? "default" : "none" },
93
92
  onClick: () => {
94
- const state = chunkORNLCBNE_cjs.usePresentation.getState();
93
+ const state = chunkJVEDKKNO_cjs.usePresentation.getState();
95
94
  state.goTo(state.current + 1);
96
95
  },
97
- onDoubleClick: () => view && chunkADPRIBSH_cjs.toggleFullscreen(view),
96
+ onDoubleClick: () => view && chunkX7ALF4MP_cjs.toggleFullscreen(view),
98
97
  "data-testid": "presentation-present",
99
98
  children: [
100
- /* @__PURE__ */ jsxRuntime.jsx(chunkJY7UUZQG_cjs.PresentationStage, {}),
101
- /* @__PURE__ */ jsxRuntime.jsx(chunk3ZZZO4F7_cjs.PresentControls, { view, shown: active })
99
+ /* @__PURE__ */ jsxRuntime.jsx(chunk7Q46YAX4_cjs.PresentationStage, {}),
100
+ /* @__PURE__ */ jsxRuntime.jsx(chunkBY3QA3S5_cjs.PresentControls, { view, shown: active })
102
101
  ]
103
102
  }
104
103
  );
105
104
  }
106
105
  return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: rootRef, className: "h-full min-h-0", "data-testid": "presenter-view", children: /* @__PURE__ */ jsxRuntime.jsx(
107
- chunkTSFNLY3K_cjs.SlidesEditor,
106
+ chunkZCU72Q76_cjs.SlidesEditor,
108
107
  {
109
108
  ...editor,
110
- onPresent: onPresent ?? (() => chunkORNLCBNE_cjs.usePresentation.getState().setPresenting(true))
109
+ onPresent: onPresent ?? (() => chunkJVEDKKNO_cjs.usePresentation.getState().setPresenting(true))
111
110
  }
112
111
  ) });
113
112
  }
@@ -116,44 +115,44 @@ function ConnectedPresentation() {
116
115
  }
117
116
  function PresentationWindow() {
118
117
  const session = react.useArbiSessionStore();
119
- const notify = chunkORNLCBNE_cjs.usePresentation((s) => s.notify);
120
- const presenting = chunkORNLCBNE_cjs.usePresentation((s) => s.presenting);
121
- const isOpen = react.useArbiSessionState((state) => react.isPanelOpen(state, chunkGFUOCGY6_cjs.PRESENTATION_PANEL));
118
+ const notify = chunkJVEDKKNO_cjs.usePresentation((s) => s.notify);
119
+ const presenting = chunkJVEDKKNO_cjs.usePresentation((s) => s.presenting);
120
+ const isOpen = react.useArbiSessionState((state) => react.isPanelOpen(state, chunkJVEDKKNO_cjs.PRESENTATION_PANEL));
122
121
  const { user } = react.useArbiSession();
123
122
  const userId = user?.external_id ?? null;
124
123
  const shownFor = react$1.useRef(userId);
125
- const { downloadFile } = chunkTSFNLY3K_cjs.usePresentationFiles();
126
- const logoId = chunkORNLCBNE_cjs.usePresentation((s) => s.theme.logo?.documentId ?? null);
127
- const controller = chunkTSFNLY3K_cjs.usePresentationController(isOpen && !presenting);
124
+ const { downloadFile } = chunkZCU72Q76_cjs.usePresentationFiles();
125
+ const logoId = chunkJVEDKKNO_cjs.usePresentation((s) => s.theme.logo?.documentId ?? null);
126
+ const controller = chunkZCU72Q76_cjs.usePresentationController(isOpen && !presenting);
128
127
  react$1.useEffect(() => {
129
128
  if (shownFor.current === userId) return;
130
129
  shownFor.current = userId;
131
- chunkORNLCBNE_cjs.usePresentation.getState().reset();
132
- session.closePanel(chunkGFUOCGY6_cjs.PRESENTATION_PANEL);
130
+ chunkJVEDKKNO_cjs.usePresentation.getState().reset();
131
+ session.closePanel(chunkJVEDKKNO_cjs.PRESENTATION_PANEL);
133
132
  }, [userId, session]);
134
133
  react$1.useEffect(() => {
135
134
  if (!logoId) return;
136
135
  let current = true;
137
- downloadFile(logoId).then((image) => current && chunkORNLCBNE_cjs.usePresentation.getState().setLogoImage(image)).catch(() => current && notify("The logo could not be read", "error"));
136
+ downloadFile(logoId).then((image) => current && chunkJVEDKKNO_cjs.usePresentation.getState().setLogoImage(image)).catch(() => current && notify("The logo could not be read", "error"));
138
137
  return () => {
139
138
  current = false;
140
139
  };
141
140
  }, [logoId, downloadFile, notify]);
142
141
  react$1.useEffect(() => {
143
- if (!isOpen) chunkORNLCBNE_cjs.usePresentation.getState().setPresenting(false);
142
+ if (!isOpen) chunkJVEDKKNO_cjs.usePresentation.getState().setPresenting(false);
144
143
  }, [isOpen]);
145
144
  const wasPresenting = react$1.useRef(presenting);
146
145
  react$1.useEffect(() => {
147
- if (wasPresenting.current && !presenting && isOpen && chunkGFUOCGY6_cjs.presentationWindowOnlyPresents()) {
148
- session.closePanel(chunkGFUOCGY6_cjs.PRESENTATION_PANEL);
146
+ if (wasPresenting.current && !presenting && isOpen && chunkJVEDKKNO_cjs.presentationWindowOnlyPresents()) {
147
+ session.closePanel(chunkJVEDKKNO_cjs.PRESENTATION_PANEL);
149
148
  }
150
149
  wasPresenting.current = presenting;
151
150
  }, [presenting, isOpen, session]);
152
- const onClose = react$1.useCallback(() => session.closePanel(chunkGFUOCGY6_cjs.PRESENTATION_PANEL), [session]);
151
+ const onClose = react$1.useCallback(() => session.closePanel(chunkJVEDKKNO_cjs.PRESENTATION_PANEL), [session]);
153
152
  return /* @__PURE__ */ jsxRuntime.jsx(
154
153
  chunk6OK7ESTL_cjs.ConnectedPanelHost,
155
154
  {
156
- panelId: chunkGFUOCGY6_cjs.PRESENTATION_PANEL,
155
+ panelId: chunkJVEDKKNO_cjs.PRESENTATION_PANEL,
157
156
  isOpen,
158
157
  onClose,
159
158
  title: "Presentation",
@@ -191,5 +190,5 @@ function PresentationWindow() {
191
190
  }
192
191
 
193
192
  exports.ConnectedPresentation = ConnectedPresentation;
194
- //# sourceMappingURL=ConnectedPresentation-L32JPRFI.cjs.map
195
- //# sourceMappingURL=ConnectedPresentation-L32JPRFI.cjs.map
193
+ //# sourceMappingURL=ConnectedPresentation-SI3L77J4.cjs.map
194
+ //# sourceMappingURL=ConnectedPresentation-SI3L77J4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presentation/PresenterView.tsx","../src/connection/presentation/ConnectedPresentation.tsx"],"names":["useEffect","STAGE_ASPECT","usePresentation","useState","useCallback","usePresenterKeys","usePointerActive","jsxs","toggleFullscreen","jsx","PresentationStage","PresentControls","SlidesEditor","ConnectedDocumentToolsProvider","useArbiSessionStore","useArbiSessionState","isPanelOpen","PRESENTATION_PANEL","useArbiSession","useRef","usePresentationFiles","usePresentationController","presentationWindowOnlyPresents","ConnectedPanelHost","Fragment","Button","PanelLeftClose"],"mappings":"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","file":"ConnectedPresentation-SI3L77J4.cjs","sourcesContent":["/**\n * The presentation in a window of its own, in one of two modes.\n *\n * Present: nothing but the stage on black, no controls and no pointer: what is shared in a call or\n * shown on a projector. Keys drive it (arrows / Page Up / Page Down change slide, B blanks, F or\n * double-click toggles full screen, Space plays videos, Escape stops presenting).\n *\n * Edit: the slides editor (`SlidesEditor`), the same as in the viewer's tab, when the presentation\n * is edited in its own window (beside the document its clips come from).\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { PresentationStage } from './PresentationStage'\nimport { SlidesEditor, type SlidesEditorProps } from './SlidesEditor'\nimport { STAGE_ASPECT } from './model'\nimport { usePresentation } from './store'\nimport { toggleFullscreen, usePresenterKeys } from './usePresenterKeys'\nimport { PresentControls } from './PresentControls'\nimport { usePointerActive } from './usePointerActive'\n\n/** The presenting window's page width, at most (smaller on a small screen). */\nconst PRESENT_WIDTH = 1280\n\n/**\n * While presenting in a pop-out, its page is made 16:9 and wide enough to share sharply, so a\n * shared window is all stage with no bars; editing again gives the window back its size. Only a\n * pop-out (a window this app opened) can be resized; the app's own window is left alone.\n */\nfunction useStageShapedWindow(view: Window | null, presenting: boolean) {\n useEffect(() => {\n if (!view || !presenting || !view.opener) return\n const before = { width: view.outerWidth, height: view.outerHeight }\n const chromeWidth = view.outerWidth - view.innerWidth\n const chromeHeight = view.outerHeight - view.innerHeight\n // Wide enough for a sharp share (a call receives about what the window shows), and 16:9.\n const width = Math.max(\n view.innerWidth,\n Math.min(PRESENT_WIDTH, Math.round((view.screen.availWidth - chromeWidth) * 0.6))\n )\n const height = Math.min(\n Math.round(width / STAGE_ASPECT),\n view.screen.availHeight - chromeHeight\n )\n try {\n view.resizeTo(Math.round(height * STAGE_ASPECT) + chromeWidth, height + chromeHeight)\n } catch {\n return // not resizable: the stage letterboxes in black\n }\n return () => {\n try {\n if (!view.closed) view.resizeTo(before.width, before.height)\n } catch {\n // gone or not resizable\n }\n }\n }, [view, presenting])\n}\n\nexport type PresenterViewProps = Omit<SlidesEditorProps, 'onPresent'> & {\n /** Present (default: here, in this window). */\n onPresent?: () => void\n}\n\nexport function PresenterView({ onPresent, ...editor }: PresenterViewProps) {\n const presenting = usePresentation((s) => s.presenting)\n const [view, setView] = useState<Window | null>(null)\n // The keys work in whichever window the presenter is in.\n const rootRef = useCallback((node: HTMLDivElement | null) => {\n if (node) setView(node.ownerDocument.defaultView)\n }, [])\n usePresenterKeys(presenting ? view : null, true)\n useStageShapedWindow(view, presenting)\n\n const active = usePointerActive(presenting ? view : null)\n\n if (presenting) {\n return (\n <div\n ref={rootRef}\n className=\"relative h-full w-full select-none bg-black\"\n // The pointer shows while it moves, with the controls; idle, nothing but the slide.\n style={{ cursor: active ? 'default' : 'none' }}\n // A click on the slide goes to the next one, as in a slideshow.\n onClick={() => {\n const state = usePresentation.getState()\n state.goTo(state.current + 1)\n }}\n onDoubleClick={() => view && toggleFullscreen(view)}\n data-testid=\"presentation-present\"\n >\n <PresentationStage />\n <PresentControls view={view} shown={active} />\n </div>\n )\n }\n return (\n <div ref={rootRef} className=\"h-full min-h-0\" data-testid=\"presenter-view\">\n <SlidesEditor\n {...editor}\n onPresent={onPresent ?? (() => usePresentation.getState().setPresenting(true))}\n />\n </div>\n )\n}\n","/**\n * The presentation's own window, mounted once by the app shell (the session's `PRESENTATION_PANEL`,\n * a pop-out). It presents: the slides alone, what is shared in a call or put full screen; or, when\n * the editor is popped out of the viewer's slides tab, it edits there, beside the documents its\n * clips come from. A window opened only to present closes when presenting ends.\n *\n * It also keeps what the presentation needs wherever it is edited: the theme's logo image, read\n * when the logo changes; and a clean slate when the session signs out or another user signs in\n * (the presentation holds decrypted files in memory).\n */\n\nimport { useCallback, useEffect, useRef } from 'react'\nimport { PanelLeftClose } from 'lucide-react'\nimport {\n isPanelOpen,\n useArbiSession,\n useArbiSessionState,\n useArbiSessionStore,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ConnectedPanelHost } from '../panels/ConnectedPanelHost'\nimport { ConnectedDocumentToolsProvider } from '../viewer/ConnectedDocumentToolsProvider'\nimport { PRESENTATION_PANEL, presentationWindowOnlyPresents } from '../../presentation/panel-id'\nimport { PresenterView } from '../../presentation/PresenterView'\nimport { usePresentation } from '../../presentation/store'\nimport { usePresentationController } from './usePresentationController'\nimport { usePresentationFiles } from './usePresentationFiles'\n\n/** The presentation's window, with the document tools it needs (sources, redactions). */\nexport function ConnectedPresentation() {\n return (\n <ConnectedDocumentToolsProvider>\n <PresentationWindow />\n </ConnectedDocumentToolsProvider>\n )\n}\n\nfunction PresentationWindow() {\n const session = useArbiSessionStore()\n const notify = usePresentation((s) => s.notify)\n const presenting = usePresentation((s) => s.presenting)\n const isOpen = useArbiSessionState((state) => isPanelOpen(state, PRESENTATION_PANEL))\n const { user } = useArbiSession()\n const userId = user?.external_id ?? null\n const shownFor = useRef(userId)\n const { downloadFile } = usePresentationFiles()\n const logoId = usePresentation((s) => s.theme.logo?.documentId ?? null)\n const controller = usePresentationController(isOpen && !presenting)\n\n useEffect(() => {\n if (shownFor.current === userId) return\n shownFor.current = userId\n usePresentation.getState().reset()\n session.closePanel(PRESENTATION_PANEL)\n }, [userId, session])\n\n // The theme's logo image, fetched whenever the logo changes (the theme keeps a reference only).\n useEffect(() => {\n if (!logoId) return\n let current = true\n downloadFile(logoId)\n .then((image) => current && usePresentation.getState().setLogoImage(image))\n .catch(() => current && notify('The logo could not be read', 'error'))\n return () => {\n current = false\n }\n }, [logoId, downloadFile, notify])\n\n // A closed window is not presenting.\n useEffect(() => {\n if (!isOpen) usePresentation.getState().setPresenting(false)\n }, [isOpen])\n\n // Opened only to present: closed when presenting ends (Escape).\n const wasPresenting = useRef(presenting)\n useEffect(() => {\n if (wasPresenting.current && !presenting && isOpen && presentationWindowOnlyPresents()) {\n session.closePanel(PRESENTATION_PANEL)\n }\n wasPresenting.current = presenting\n }, [presenting, isOpen, session])\n\n const onClose = useCallback(() => session.closePanel(PRESENTATION_PANEL), [session])\n\n return (\n <ConnectedPanelHost\n panelId={PRESENTATION_PANEL}\n isOpen={isOpen}\n onClose={onClose}\n title=\"Presentation\"\n defaultMode=\"popout\"\n defaultWidth={960}\n closeTestId=\"presentation-panel-close\"\n >\n {/* Inside the panel, so its dialogs open in its window. */}\n {() => (\n <>\n {!presenting && controller.dialogs}\n <PresenterView\n {...controller.editor}\n actions={\n <>\n {controller.editor.actions}\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n title=\"Back into the app's viewer\"\n aria-label=\"Back to the viewer\"\n onClick={onClose}\n data-testid=\"presentation-pop-in\"\n >\n <PanelLeftClose className=\"size-4\" />\n </Button>\n </>\n }\n />\n </>\n )}\n </ConnectedPanelHost>\n )\n}\n"]}
@@ -7,10 +7,10 @@ var chunkJOUMBLGL_cjs = require('./chunk-JOUMBLGL.cjs');
7
7
  require('./chunk-JR2YSBD5.cjs');
8
8
  require('./chunk-3YZKDCWY.cjs');
9
9
  require('./chunk-ZT5MIFLC.cjs');
10
- require('./chunk-LJJJ6CYH.cjs');
11
10
  var chunkTKHCIHE2_cjs = require('./chunk-TKHCIHE2.cjs');
12
11
  require('./chunk-JDFBEGQO.cjs');
13
12
  require('./chunk-ULWRNGGE.cjs');
13
+ require('./chunk-LJJJ6CYH.cjs');
14
14
  require('./chunk-PLIF5CUV.cjs');
15
15
  var react$1 = require('react');
16
16
  var react = require('@arbidocs/react');
@@ -45,5 +45,5 @@ function ConnectedProductionSetDialog({
45
45
  }
46
46
 
47
47
  module.exports = ConnectedProductionSetDialog;
48
- //# sourceMappingURL=ConnectedProductionSetDialog-4EAY6KAZ.cjs.map
49
- //# sourceMappingURL=ConnectedProductionSetDialog-4EAY6KAZ.cjs.map
48
+ //# sourceMappingURL=ConnectedProductionSetDialog-LHB4VQWC.cjs.map
49
+ //# sourceMappingURL=ConnectedProductionSetDialog-LHB4VQWC.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/files/ConnectedProductionSetDialog.tsx"],"names":["useArbiSessionState","useDocuments","hrefFor","useBlocksEnvironment","useMemo","ConnectedDocumentToolsProvider","jsx","ProductionSetDialog"],"mappings":";;;;;;;;;;;;;;;;;AAiBe,SAAR,4BAAA,CAA8C;AAAA,EACnD,KAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,SAAS,KAAA,KAAU,IAAA;AACzB,EAAA,MAAM,mBAAA,GAAsBA,yBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,mBAAmB,CAAA;AAC5E,EAAA,MAAM,WAAA,GAAcA,yBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC5D,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,GAAe,EAAC,KAAMC,kBAAA,EAAa;AACjD,EAAA,MAAM,EAAE,OAAA,EAAAC,QAAAA,EAAQ,GAAIC,sCAAA,EAAqB;AAGzC,EAAA,MAAM,QAAA,GAAWC,eAAA;AAAA,IACf,MAAM,aAAa,MAAA,CAAO,CAAC,QAAQ,mBAAA,CAAoB,QAAA,CAAS,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,IAChF,CAAC,cAAc,mBAAmB;AAAA,GACpC;AAEA,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,WAAA,EAAa,OAAO,IAAA;AAEpC,EAAA,sCACGC,gDAAA,EAAA,EACC,QAAA,kBAAAC,cAAA;AAAA,IAACC,qCAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS,CAAC,QAAQ,OAAA,EAAQ;AAAA,MACzC,SAAA,EAAW,QAAA;AAAA,MAGX,WAAA,EAAa,CAAC,EAAA,KAAO;AACnB,QAAA,MAAM,SAAS,EAAE,IAAA,EAAM,UAAA,EAAqB,WAAA,EAAa,YAAY,EAAA,EAAG;AACxE,QAAA,OAAO,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAGL,SAAQ,MAAM,CAAA,IAAKA,yBAAA,CAAU,MAAM,CAAC,CAAA,CAAA;AAAA,MACzE;AAAA;AAAA,GACF,EACF,CAAA;AAEJ","file":"ConnectedProductionSetDialog-4EAY6KAZ.cjs","sourcesContent":["/**\n * The `productionSet` global dialog: the selected documents (the session's selection, in the order\n * of the documents list) numbered as a production set (`ProductionSetDialog`: Bates labels,\n * optional QR links back to each document, optional index page), downloaded and, unless turned off,\n * saved to the workspace as documents derived from their sources. The API client, uploads, toasts\n * and the list refresh are the connected document tools'; each QR code links to the document\n * through the host's `hrefFor`. Blocks loads it lazily (it brings in pdf-lib when it numbers).\n */\n\nimport { useMemo } from 'react'\nimport { useArbiSessionState, useDocuments } from '@arbidocs/react'\nimport { ProductionSetDialog } from '../../document-tools/production'\nimport { hrefFor as routeHref } from '../../lib/routes'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { ConnectedDocumentToolsProvider } from '../viewer/ConnectedDocumentToolsProvider'\nimport type { GlobalDialogProps } from '../dialogs/ConnectedGlobalDialogs'\n\nexport default function ConnectedProductionSetDialog({\n props,\n onClose,\n}: GlobalDialogProps<'productionSet'>) {\n const isOpen = props !== null\n const selectedDocumentIds = useArbiSessionState((s) => s.selectedDocumentIds)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: allDocuments = [] } = useDocuments()\n const { hrefFor } = useBlocksEnvironment()\n\n // Listed in the order of the documents list; the dialog lets the user reorder them.\n const selected = useMemo(\n () => allDocuments.filter((doc) => selectedDocumentIds.includes(doc.external_id)),\n [allDocuments, selectedDocumentIds]\n )\n\n if (!isOpen || !workspaceId) return null\n\n return (\n <ConnectedDocumentToolsProvider>\n <ProductionSetDialog\n open={isOpen}\n onOpenChange={(open) => !open && onClose()}\n documents={selected}\n // The QR code opens the document on this site: the host's link for it (`hrefFor`), else\n // the deep link of the default routes.\n documentUrl={(id) => {\n const target = { kind: 'document' as const, workspaceId, documentId: id }\n return `${window.location.origin}${hrefFor(target) ?? routeHref(target)}`\n }}\n />\n </ConnectedDocumentToolsProvider>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/files/ConnectedProductionSetDialog.tsx"],"names":["useArbiSessionState","useDocuments","hrefFor","useBlocksEnvironment","useMemo","ConnectedDocumentToolsProvider","jsx","ProductionSetDialog"],"mappings":";;;;;;;;;;;;;;;;;AAiBe,SAAR,4BAAA,CAA8C;AAAA,EACnD,KAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,SAAS,KAAA,KAAU,IAAA;AACzB,EAAA,MAAM,mBAAA,GAAsBA,yBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,mBAAmB,CAAA;AAC5E,EAAA,MAAM,WAAA,GAAcA,yBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC5D,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,GAAe,EAAC,KAAMC,kBAAA,EAAa;AACjD,EAAA,MAAM,EAAE,OAAA,EAAAC,QAAAA,EAAQ,GAAIC,sCAAA,EAAqB;AAGzC,EAAA,MAAM,QAAA,GAAWC,eAAA;AAAA,IACf,MAAM,aAAa,MAAA,CAAO,CAAC,QAAQ,mBAAA,CAAoB,QAAA,CAAS,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,IAChF,CAAC,cAAc,mBAAmB;AAAA,GACpC;AAEA,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,WAAA,EAAa,OAAO,IAAA;AAEpC,EAAA,sCACGC,gDAAA,EAAA,EACC,QAAA,kBAAAC,cAAA;AAAA,IAACC,qCAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS,CAAC,QAAQ,OAAA,EAAQ;AAAA,MACzC,SAAA,EAAW,QAAA;AAAA,MAGX,WAAA,EAAa,CAAC,EAAA,KAAO;AACnB,QAAA,MAAM,SAAS,EAAE,IAAA,EAAM,UAAA,EAAqB,WAAA,EAAa,YAAY,EAAA,EAAG;AACxE,QAAA,OAAO,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAGL,SAAQ,MAAM,CAAA,IAAKA,yBAAA,CAAU,MAAM,CAAC,CAAA,CAAA;AAAA,MACzE;AAAA;AAAA,GACF,EACF,CAAA;AAEJ","file":"ConnectedProductionSetDialog-LHB4VQWC.cjs","sourcesContent":["/**\n * The `productionSet` global dialog: the selected documents (the session's selection, in the order\n * of the documents list) numbered as a production set (`ProductionSetDialog`: Bates labels,\n * optional QR links back to each document, optional index page), downloaded and, unless turned off,\n * saved to the workspace as documents derived from their sources. The API client, uploads, toasts\n * and the list refresh are the connected document tools'; each QR code links to the document\n * through the host's `hrefFor`. Blocks loads it lazily (it brings in pdf-lib when it numbers).\n */\n\nimport { useMemo } from 'react'\nimport { useArbiSessionState, useDocuments } from '@arbidocs/react'\nimport { ProductionSetDialog } from '../../document-tools/production'\nimport { hrefFor as routeHref } from '../../lib/routes'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { ConnectedDocumentToolsProvider } from '../viewer/ConnectedDocumentToolsProvider'\nimport type { GlobalDialogProps } from '../dialogs/ConnectedGlobalDialogs'\n\nexport default function ConnectedProductionSetDialog({\n props,\n onClose,\n}: GlobalDialogProps<'productionSet'>) {\n const isOpen = props !== null\n const selectedDocumentIds = useArbiSessionState((s) => s.selectedDocumentIds)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: allDocuments = [] } = useDocuments()\n const { hrefFor } = useBlocksEnvironment()\n\n // Listed in the order of the documents list; the dialog lets the user reorder them.\n const selected = useMemo(\n () => allDocuments.filter((doc) => selectedDocumentIds.includes(doc.external_id)),\n [allDocuments, selectedDocumentIds]\n )\n\n if (!isOpen || !workspaceId) return null\n\n return (\n <ConnectedDocumentToolsProvider>\n <ProductionSetDialog\n open={isOpen}\n onOpenChange={(open) => !open && onClose()}\n documents={selected}\n // The QR code opens the document on this site: the host's link for it (`hrefFor`), else\n // the deep link of the default routes.\n documentUrl={(id) => {\n const target = { kind: 'document' as const, workspaceId, documentId: id }\n return `${window.location.origin}${hrefFor(target) ?? routeHref(target)}`\n }}\n />\n </ConnectedDocumentToolsProvider>\n )\n}\n"]}