@arbidocs/blocks 0.5.120 → 0.5.122

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 (417) hide show
  1. package/dist/ClippingMediaViewer-IEIBT74X.cjs +156 -0
  2. package/dist/ClippingMediaViewer-IEIBT74X.cjs.map +1 -0
  3. package/dist/ClippingPdfViewer-OGYLMVCE.cjs +79 -0
  4. package/dist/ClippingPdfViewer-OGYLMVCE.cjs.map +1 -0
  5. package/dist/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-XJOYVVAH.cjs} +9 -7
  6. package/dist/ConnectedCallDock-XJOYVVAH.cjs.map +1 -0
  7. package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-CUDYAPQK.cjs} +9 -7
  8. package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-CUDYAPQK.cjs.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-SGE4R3M4.cjs → ConnectedNativeDocxComparison-QKHCYD6W.cjs} +7 -7
  10. package/dist/{ConnectedNativeDocxComparison-SGE4R3M4.cjs.map → ConnectedNativeDocxComparison-QKHCYD6W.cjs.map} +1 -1
  11. package/dist/ConnectedPresentation-AU25OW25.cjs +321 -0
  12. package/dist/ConnectedPresentation-AU25OW25.cjs.map +1 -0
  13. package/dist/ConnectedSlidesTab-I75LKKN7.cjs +236 -0
  14. package/dist/ConnectedSlidesTab-I75LKKN7.cjs.map +1 -0
  15. package/dist/{ConnectedStreamedWordArtifact-6MCLJRIT.cjs → ConnectedStreamedWordArtifact-AG62232A.cjs} +7 -7
  16. package/dist/{ConnectedStreamedWordArtifact-6MCLJRIT.cjs.map → ConnectedStreamedWordArtifact-AG62232A.cjs.map} +1 -1
  17. package/dist/{DocumentReviewCard-BPIAJJED.cjs → DocumentReviewCard-M53XFLI2.cjs} +15 -14
  18. package/dist/DocumentReviewCard-M53XFLI2.cjs.map +1 -0
  19. package/dist/{FilesViewerDialog-67WK3TZC.cjs → FilesViewerDialog-4352KIOG.cjs} +30 -22
  20. package/dist/FilesViewerDialog-4352KIOG.cjs.map +1 -0
  21. package/dist/{GridViewImpl-ZMJJWTOM.cjs → GridViewImpl-LTYET77Q.cjs} +3 -3
  22. package/dist/GridViewImpl-LTYET77Q.cjs.map +1 -0
  23. package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-3XYAV4BV.cjs} +9 -8
  24. package/dist/WorkspaceTableView-3XYAV4BV.cjs.map +1 -0
  25. package/dist/agents/index.cjs +186 -186
  26. package/dist/{ai-IM4A23YT.cjs → ai-IEIR7SC2.cjs} +17 -15
  27. package/dist/ai-IEIR7SC2.cjs.map +1 -0
  28. package/dist/calls/connected/CallControls.d.ts +2 -0
  29. package/dist/calls/connected/CallControls.js +71 -9
  30. package/dist/calls/connected/CallControls.js.map +2 -2
  31. package/dist/calls/connected/ShareDocumentDialog.d.ts +14 -0
  32. package/dist/calls/connected/ShareDocumentDialog.js +77 -0
  33. package/dist/calls/connected/ShareDocumentDialog.js.map +7 -0
  34. package/dist/calls/index.cjs +2 -2
  35. package/dist/chat/index.cjs +8 -7
  36. package/dist/{chunk-557MJ4IH.cjs → chunk-2F57IO7S.cjs} +9 -146
  37. package/dist/chunk-2F57IO7S.cjs.map +1 -0
  38. package/dist/chunk-2RLA6QO2.cjs +174 -0
  39. package/dist/chunk-2RLA6QO2.cjs.map +1 -0
  40. package/dist/chunk-4TTX6ZNS.cjs +1374 -0
  41. package/dist/chunk-4TTX6ZNS.cjs.map +1 -0
  42. package/dist/chunk-5GCCUXMT.cjs +63 -0
  43. package/dist/chunk-5GCCUXMT.cjs.map +1 -0
  44. package/dist/{chunk-BUVIBHFU.cjs → chunk-5QERK4PK.cjs} +38 -38
  45. package/dist/chunk-5QERK4PK.cjs.map +1 -0
  46. package/dist/chunk-6OK7ESTL.cjs +134 -0
  47. package/dist/chunk-6OK7ESTL.cjs.map +1 -0
  48. package/dist/{chunk-ECLUFKYR.cjs → chunk-7557LDAN.cjs} +4 -4
  49. package/dist/{chunk-ECLUFKYR.cjs.map → chunk-7557LDAN.cjs.map} +1 -1
  50. package/dist/{chunk-KTQOGT2L.cjs → chunk-7L4X6QN2.cjs} +7 -7
  51. package/dist/{chunk-KTQOGT2L.cjs.map → chunk-7L4X6QN2.cjs.map} +1 -1
  52. package/dist/{chunk-BP3IJ34D.cjs → chunk-7NLO7ASW.cjs} +4 -4
  53. package/dist/{chunk-BP3IJ34D.cjs.map → chunk-7NLO7ASW.cjs.map} +1 -1
  54. package/dist/{chunk-3GWWOYGS.cjs → chunk-7PN3YENO.cjs} +4 -4
  55. package/dist/{chunk-3GWWOYGS.cjs.map → chunk-7PN3YENO.cjs.map} +1 -1
  56. package/dist/{chunk-DFBDQKGE.cjs → chunk-ADDQKZ5I.cjs} +4 -4
  57. package/dist/{chunk-DFBDQKGE.cjs.map → chunk-ADDQKZ5I.cjs.map} +1 -1
  58. package/dist/chunk-AFQTQC7A.cjs +35 -0
  59. package/dist/chunk-AFQTQC7A.cjs.map +1 -0
  60. package/dist/{chunk-NLSWDP42.cjs → chunk-ALK3PUUB.cjs} +21 -11
  61. package/dist/chunk-ALK3PUUB.cjs.map +1 -0
  62. package/dist/{chunk-775S43W7.cjs → chunk-CQQQIZU4.cjs} +8 -8
  63. package/dist/{chunk-775S43W7.cjs.map → chunk-CQQQIZU4.cjs.map} +1 -1
  64. package/dist/{chunk-TDO5UWXF.cjs → chunk-E3L5DB5F.cjs} +5 -5
  65. package/dist/{chunk-TDO5UWXF.cjs.map → chunk-E3L5DB5F.cjs.map} +1 -1
  66. package/dist/chunk-GFUOCGY6.cjs +32 -0
  67. package/dist/chunk-GFUOCGY6.cjs.map +1 -0
  68. package/dist/chunk-HYUKPHCT.cjs +66 -0
  69. package/dist/chunk-HYUKPHCT.cjs.map +1 -0
  70. package/dist/{chunk-QQWHG3KF.cjs → chunk-JJZOL5MG.cjs} +4 -4
  71. package/dist/{chunk-QQWHG3KF.cjs.map → chunk-JJZOL5MG.cjs.map} +1 -1
  72. package/dist/chunk-K4763GD5.cjs +301 -0
  73. package/dist/chunk-K4763GD5.cjs.map +1 -0
  74. package/dist/{chunk-B3LZITVF.cjs → chunk-KA3F6TIH.cjs} +2 -442
  75. package/dist/chunk-KA3F6TIH.cjs.map +1 -0
  76. package/dist/{chunk-PGJYD67F.cjs → chunk-KNGZZC4O.cjs} +7 -6
  77. package/dist/chunk-KNGZZC4O.cjs.map +1 -0
  78. package/dist/{chunk-YYPZOEED.cjs → chunk-LHWOKOMP.cjs} +23 -2
  79. package/dist/chunk-LHWOKOMP.cjs.map +1 -0
  80. package/dist/{chunk-HA66DHW6.cjs → chunk-MLA2BJ2Y.cjs} +28 -28
  81. package/dist/chunk-MLA2BJ2Y.cjs.map +1 -0
  82. package/dist/{chunk-CPR6EHG7.cjs → chunk-NG2EE7HR.cjs} +134 -10
  83. package/dist/chunk-NG2EE7HR.cjs.map +1 -0
  84. package/dist/{chunk-CKCG4NDB.cjs → chunk-OHHKBURG.cjs} +29 -29
  85. package/dist/chunk-OHHKBURG.cjs.map +1 -0
  86. package/dist/{chunk-4XJEHKVZ.cjs → chunk-PIYYBPHH.cjs} +4 -4
  87. package/dist/{chunk-4XJEHKVZ.cjs.map → chunk-PIYYBPHH.cjs.map} +1 -1
  88. package/dist/{chunk-YYSBWMDJ.cjs → chunk-QG2U2JGX.cjs} +4 -4
  89. package/dist/{chunk-YYSBWMDJ.cjs.map → chunk-QG2U2JGX.cjs.map} +1 -1
  90. package/dist/{chunk-5IZFSAEZ.cjs → chunk-SDRYSLOX.cjs} +4 -4
  91. package/dist/{chunk-5IZFSAEZ.cjs.map → chunk-SDRYSLOX.cjs.map} +1 -1
  92. package/dist/{chunk-NJCK6V6U.cjs → chunk-T73BHNQX.cjs} +2 -58
  93. package/dist/chunk-T73BHNQX.cjs.map +1 -0
  94. package/dist/{chunk-EOG6OT5I.cjs → chunk-TXP2N3DC.cjs} +4 -4
  95. package/dist/{chunk-EOG6OT5I.cjs.map → chunk-TXP2N3DC.cjs.map} +1 -1
  96. package/dist/{chunk-6UTKM5AB.cjs → chunk-UFT22LAB.cjs} +75 -75
  97. package/dist/chunk-UFT22LAB.cjs.map +1 -0
  98. package/dist/chunk-USNTRL22.cjs +4790 -0
  99. package/dist/chunk-USNTRL22.cjs.map +1 -0
  100. package/dist/{chunk-X36UR4A7.cjs → chunk-UTJ223TI.cjs} +413 -90
  101. package/dist/chunk-UTJ223TI.cjs.map +1 -0
  102. package/dist/{chunk-VZCPMXWC.cjs → chunk-V6MW7B4B.cjs} +4 -4
  103. package/dist/{chunk-VZCPMXWC.cjs.map → chunk-V6MW7B4B.cjs.map} +1 -1
  104. package/dist/{chunk-T23UTIRI.cjs → chunk-VWBYE3XY.cjs} +5 -5
  105. package/dist/{chunk-T23UTIRI.cjs.map → chunk-VWBYE3XY.cjs.map} +1 -1
  106. package/dist/chunk-WFMWKPGY.cjs +102 -0
  107. package/dist/chunk-WFMWKPGY.cjs.map +1 -0
  108. package/dist/chunk-WOOOMTTA.cjs +19 -0
  109. package/dist/chunk-WOOOMTTA.cjs.map +1 -0
  110. package/dist/{chunk-W6INT5GS.cjs → chunk-WRLGLZIA.cjs} +8 -8
  111. package/dist/{chunk-W6INT5GS.cjs.map → chunk-WRLGLZIA.cjs.map} +1 -1
  112. package/dist/{chunk-CJYWHUZR.cjs → chunk-XCKHOXRP.cjs} +4 -4
  113. package/dist/{chunk-CJYWHUZR.cjs.map → chunk-XCKHOXRP.cjs.map} +1 -1
  114. package/dist/chunk-XF355M7O.cjs +154 -0
  115. package/dist/chunk-XF355M7O.cjs.map +1 -0
  116. package/dist/{chunk-Q6CLWOP2.cjs → chunk-XGM4VVNV.cjs} +34 -34
  117. package/dist/{chunk-Q6CLWOP2.cjs.map → chunk-XGM4VVNV.cjs.map} +1 -1
  118. package/dist/{chunk-6WMMZLEV.cjs → chunk-XJEXFEWG.cjs} +2 -27
  119. package/dist/chunk-XJEXFEWG.cjs.map +1 -0
  120. package/dist/chunk-XK4TVJKD.cjs +73 -0
  121. package/dist/chunk-XK4TVJKD.cjs.map +1 -0
  122. package/dist/{chunk-E7TE2WVT.cjs → chunk-ZVEW3JBT.cjs} +3 -3
  123. package/dist/{chunk-E7TE2WVT.cjs.map → chunk-ZVEW3JBT.cjs.map} +1 -1
  124. package/dist/collaboration/index.cjs +70 -70
  125. package/dist/components/ZoomSlider.d.ts +25 -0
  126. package/dist/components/ZoomSlider.js +59 -0
  127. package/dist/components/ZoomSlider.js.map +7 -0
  128. package/dist/connect/docx.cjs +10 -10
  129. package/dist/connect/index.cjs +1066 -1147
  130. package/dist/connect/index.cjs.map +1 -1
  131. package/dist/connect/viewer.cjs +19 -12
  132. package/dist/connection/ai.d.ts +1 -1
  133. package/dist/connection/conversation/ConnectedMessage.js +1 -1
  134. package/dist/connection/conversation/ConnectedMessage.js.map +2 -2
  135. package/dist/connection/files/ConnectedNewFileMenu.d.ts +2 -1
  136. package/dist/connection/files/ConnectedNewFileMenu.js +9 -3
  137. package/dist/connection/files/ConnectedNewFileMenu.js.map +2 -2
  138. package/dist/connection/files/explorer/ConnectedFilesExplorer.js +1 -1
  139. package/dist/connection/files/explorer/ConnectedFilesExplorer.js.map +2 -2
  140. package/dist/connection/files/explorer/FileTiles.js +1 -1
  141. package/dist/connection/files/explorer/FileTiles.js.map +2 -2
  142. package/dist/connection/files/fields/documentField.js +1 -1
  143. package/dist/connection/files/fields/documentField.js.map +2 -2
  144. package/dist/connection/files/grid/documentColumns.js +1 -1
  145. package/dist/connection/files/grid/documentColumns.js.map +2 -2
  146. package/dist/connection/files/page/DocumentsFilterBarActions.js +17 -28
  147. package/dist/connection/files/page/DocumentsFilterBarActions.js.map +2 -2
  148. package/dist/connection/mail/useMailboxDefaults.js +1 -1
  149. package/dist/connection/mail/useMailboxDefaults.js.map +2 -2
  150. package/dist/connection/panels/useSessionPanelMode.js +3 -2
  151. package/dist/connection/panels/useSessionPanelMode.js.map +2 -2
  152. package/dist/connection/presentation/ClippingMediaViewer.d.ts +12 -0
  153. package/dist/connection/presentation/ClippingMediaViewer.js +153 -0
  154. package/dist/connection/presentation/ClippingMediaViewer.js.map +7 -0
  155. package/dist/connection/presentation/ClippingPdfViewer.d.ts +22 -0
  156. package/dist/connection/presentation/ClippingPdfViewer.js +75 -0
  157. package/dist/connection/presentation/ClippingPdfViewer.js.map +7 -0
  158. package/dist/connection/presentation/ConnectedPresentation.d.ts +12 -0
  159. package/dist/connection/presentation/ConnectedPresentation.js +100 -0
  160. package/dist/connection/presentation/ConnectedPresentation.js.map +7 -0
  161. package/dist/connection/presentation/ConnectedSlidesTab.d.ts +20 -0
  162. package/dist/connection/presentation/ConnectedSlidesTab.js +222 -0
  163. package/dist/connection/presentation/ConnectedSlidesTab.js.map +7 -0
  164. package/dist/connection/presentation/CropClipDialog.d.ts +11 -0
  165. package/dist/connection/presentation/CropClipDialog.js +86 -0
  166. package/dist/connection/presentation/CropClipDialog.js.map +7 -0
  167. package/dist/connection/presentation/GenerateTile.d.ts +4 -0
  168. package/dist/connection/presentation/GenerateTile.js +24 -0
  169. package/dist/connection/presentation/GenerateTile.js.map +7 -0
  170. package/dist/connection/presentation/LabelColumnMenu.d.ts +8 -0
  171. package/dist/connection/presentation/LabelColumnMenu.js +38 -0
  172. package/dist/connection/presentation/LabelColumnMenu.js.map +7 -0
  173. package/dist/connection/presentation/PresentationDialogs.d.ts +39 -0
  174. package/dist/connection/presentation/PresentationDialogs.js +295 -0
  175. package/dist/connection/presentation/PresentationDialogs.js.map +7 -0
  176. package/dist/connection/presentation/PresentationFileCard.d.ts +10 -0
  177. package/dist/connection/presentation/PresentationFileCard.js +35 -0
  178. package/dist/connection/presentation/PresentationFileCard.js.map +7 -0
  179. package/dist/connection/presentation/PresentationPill.d.ts +8 -0
  180. package/dist/connection/presentation/PresentationPill.js +39 -0
  181. package/dist/connection/presentation/PresentationPill.js.map +7 -0
  182. package/dist/connection/presentation/PresentationSlot.d.ts +7 -0
  183. package/dist/connection/presentation/PresentationSlot.js +35 -0
  184. package/dist/connection/presentation/PresentationSlot.js.map +7 -0
  185. package/dist/connection/presentation/requests.d.ts +21 -0
  186. package/dist/connection/presentation/requests.js +27 -0
  187. package/dist/connection/presentation/requests.js.map +7 -0
  188. package/dist/connection/presentation/useImageGeneration.d.ts +11 -0
  189. package/dist/connection/presentation/useImageGeneration.js +66 -0
  190. package/dist/connection/presentation/useImageGeneration.js.map +7 -0
  191. package/dist/connection/presentation/useLabelColumns.d.ts +15 -0
  192. package/dist/connection/presentation/useLabelColumns.js +33 -0
  193. package/dist/connection/presentation/useLabelColumns.js.map +7 -0
  194. package/dist/connection/presentation/usePresentationController.d.ts +15 -0
  195. package/dist/connection/presentation/usePresentationController.js +118 -0
  196. package/dist/connection/presentation/usePresentationController.js.map +7 -0
  197. package/dist/connection/presentation/usePresentationFiles.d.ts +44 -0
  198. package/dist/connection/presentation/usePresentationFiles.js +307 -0
  199. package/dist/connection/presentation/usePresentationFiles.js.map +7 -0
  200. package/dist/connection/presentation/useViewerClipping.d.ts +14 -0
  201. package/dist/connection/presentation/useViewerClipping.js +18 -0
  202. package/dist/connection/presentation/useViewerClipping.js.map +7 -0
  203. package/dist/connection/shell/ConnectedAppShell.js +5 -1
  204. package/dist/connection/shell/ConnectedAppShell.js.map +2 -2
  205. package/dist/connection/viewer/CleanViewControl.d.ts +8 -0
  206. package/dist/connection/viewer/CleanViewControl.js +76 -0
  207. package/dist/connection/viewer/CleanViewControl.js.map +7 -0
  208. package/dist/connection/viewer/ConnectedDocumentViewer.js +28 -29
  209. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  210. package/dist/connection/viewer/ViewerCropModal.d.ts +5 -0
  211. package/dist/connection/viewer/ViewerCropModal.js +22 -0
  212. package/dist/connection/viewer/ViewerCropModal.js.map +7 -0
  213. package/dist/connection/viewer/ViewerPdfPane.d.ts +3 -1
  214. package/dist/connection/viewer/ViewerPdfPane.js +41 -1
  215. package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
  216. package/dist/connection/viewer/documentPlace.d.ts +5 -4
  217. package/dist/connection/viewer/documentPlace.js +2 -2
  218. package/dist/connection/viewer/documentPlace.js.map +2 -2
  219. package/dist/connection/viewer/drafts.js +6 -4
  220. package/dist/connection/viewer/drafts.js.map +2 -2
  221. package/dist/connection/viewer/pdf/PdfClipOutlines.d.ts +11 -0
  222. package/dist/connection/viewer/pdf/PdfClipOutlines.js +42 -0
  223. package/dist/connection/viewer/pdf/PdfClipOutlines.js.map +7 -0
  224. package/dist/connection/viewer/pdf/clipOutlines.d.ts +17 -0
  225. package/dist/connection/viewer/pdf/clipOutlines.js +24 -0
  226. package/dist/connection/viewer/pdf/clipOutlines.js.map +7 -0
  227. package/dist/connection/viewer/pdf/passageHighlights.d.ts +2 -0
  228. package/dist/connection/viewer/pdf/passageHighlights.js +12 -1
  229. package/dist/connection/viewer/pdf/passageHighlights.js.map +2 -2
  230. package/dist/connection/viewer/pdf/usePdfClipOutlines.d.ts +7 -0
  231. package/dist/connection/viewer/pdf/usePdfClipOutlines.js +36 -0
  232. package/dist/connection/viewer/pdf/usePdfClipOutlines.js.map +7 -0
  233. package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +11 -2
  234. package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +2 -2
  235. package/dist/connection/viewer/shareDocument.d.ts +11 -0
  236. package/dist/connection/viewer/shareDocument.js +11 -0
  237. package/dist/connection/viewer/shareDocument.js.map +7 -0
  238. package/dist/connection/viewer/slidesTabChunk.d.ts +2 -0
  239. package/dist/connection/viewer/slidesTabChunk.js +9 -0
  240. package/dist/connection/viewer/slidesTabChunk.js.map +7 -0
  241. package/dist/connection/viewer/useCleanView.d.ts +14 -0
  242. package/dist/connection/viewer/useCleanView.js +29 -0
  243. package/dist/connection/viewer/useCleanView.js.map +7 -0
  244. package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
  245. package/dist/connection/viewer/useViewedDocument.js +9 -1
  246. package/dist/connection/viewer/useViewedDocument.js.map +2 -2
  247. package/dist/connection/viewer/useViewerTabs.js +18 -4
  248. package/dist/connection/viewer/useViewerTabs.js.map +2 -2
  249. package/dist/connection/workflows/ConnectedWorkflowStart.d.ts +14 -2
  250. package/dist/connection/workflows/ConnectedWorkflowStart.js +5 -2
  251. package/dist/connection/workflows/ConnectedWorkflowStart.js.map +2 -2
  252. package/dist/databases/index.cjs +49 -49
  253. package/dist/document-tools/DocumentToolButtons.d.ts +2 -0
  254. package/dist/document-tools/DocumentToolButtons.js +22 -1
  255. package/dist/document-tools/DocumentToolButtons.js.map +2 -2
  256. package/dist/document-tools/index.cjs +16 -12
  257. package/dist/document-tools/index.d.ts +1 -1
  258. package/dist/document-tools/index.js +2 -0
  259. package/dist/document-tools/index.js.map +2 -2
  260. package/dist/embed/index.cjs +17 -15
  261. package/dist/files/GridViewImpl.js +1 -1
  262. package/dist/files/GridViewImpl.js.map +2 -2
  263. package/dist/files/ViewerChrome.d.ts +5 -1
  264. package/dist/files/ViewerChrome.js +16 -6
  265. package/dist/files/ViewerChrome.js.map +2 -2
  266. package/dist/files/index.cjs +224 -224
  267. package/dist/files/navigator/DocumentSearchList.js +1 -1
  268. package/dist/files/navigator/DocumentSearchList.js.map +2 -2
  269. package/dist/index.cjs +359 -356
  270. package/dist/index.cjs.map +1 -1
  271. package/dist/presentation/BoxActionBar.d.ts +11 -0
  272. package/dist/presentation/BoxActionBar.js +182 -0
  273. package/dist/presentation/BoxActionBar.js.map +7 -0
  274. package/dist/presentation/ClipActionBar.d.ts +26 -0
  275. package/dist/presentation/ClipActionBar.js +103 -0
  276. package/dist/presentation/ClipActionBar.js.map +7 -0
  277. package/dist/presentation/ClipCaptureOverlay.d.ts +14 -0
  278. package/dist/presentation/ClipCaptureOverlay.js +69 -0
  279. package/dist/presentation/ClipCaptureOverlay.js.map +7 -0
  280. package/dist/presentation/ClipImage.d.ts +21 -0
  281. package/dist/presentation/ClipImage.js +119 -0
  282. package/dist/presentation/ClipImage.js.map +7 -0
  283. package/dist/presentation/ClipTray.d.ts +11 -0
  284. package/dist/presentation/ClipTray.js +152 -0
  285. package/dist/presentation/ClipTray.js.map +7 -0
  286. package/dist/presentation/ClipViewControls.d.ts +11 -0
  287. package/dist/presentation/ClipViewControls.js +142 -0
  288. package/dist/presentation/ClipViewControls.js.map +7 -0
  289. package/dist/presentation/DesignMenu.d.ts +8 -0
  290. package/dist/presentation/DesignMenu.js +199 -0
  291. package/dist/presentation/DesignMenu.js.map +7 -0
  292. package/dist/presentation/LayoutMenu.d.ts +17 -0
  293. package/dist/presentation/LayoutMenu.js +122 -0
  294. package/dist/presentation/LayoutMenu.js.map +7 -0
  295. package/dist/presentation/MediaClip.d.ts +15 -0
  296. package/dist/presentation/MediaClip.js +67 -0
  297. package/dist/presentation/MediaClip.js.map +7 -0
  298. package/dist/presentation/Notice.d.ts +6 -0
  299. package/dist/presentation/Notice.js +43 -0
  300. package/dist/presentation/Notice.js.map +7 -0
  301. package/dist/presentation/PresentControls.d.ts +11 -0
  302. package/dist/presentation/PresentControls.js +117 -0
  303. package/dist/presentation/PresentControls.js.map +7 -0
  304. package/dist/presentation/PresentationStage.d.ts +32 -0
  305. package/dist/presentation/PresentationStage.js +232 -0
  306. package/dist/presentation/PresentationStage.js.map +7 -0
  307. package/dist/presentation/PresenterView.d.ts +16 -0
  308. package/dist/presentation/PresenterView.js +100 -0
  309. package/dist/presentation/PresenterView.js.map +7 -0
  310. package/dist/presentation/SlideDecor.d.ts +25 -0
  311. package/dist/presentation/SlideDecor.js +189 -0
  312. package/dist/presentation/SlideDecor.js.map +7 -0
  313. package/dist/presentation/SlidesEditor.d.ts +25 -0
  314. package/dist/presentation/SlidesEditor.js +375 -0
  315. package/dist/presentation/SlidesEditor.js.map +7 -0
  316. package/dist/presentation/StageBox.d.ts +30 -0
  317. package/dist/presentation/StageBox.js +281 -0
  318. package/dist/presentation/StageBox.js.map +7 -0
  319. package/dist/presentation/StageItem.d.ts +37 -0
  320. package/dist/presentation/StageItem.js +211 -0
  321. package/dist/presentation/StageItem.js.map +7 -0
  322. package/dist/presentation/box-style.d.ts +6 -0
  323. package/dist/presentation/box-style.js +19 -0
  324. package/dist/presentation/box-style.js.map +7 -0
  325. package/dist/presentation/boxes.d.ts +105 -0
  326. package/dist/presentation/boxes.js +103 -0
  327. package/dist/presentation/boxes.js.map +7 -0
  328. package/dist/presentation/draw-boxes.d.ts +8 -0
  329. package/dist/presentation/draw-boxes.js +130 -0
  330. package/dist/presentation/draw-boxes.js.map +7 -0
  331. package/dist/presentation/export-boxes.d.ts +10 -0
  332. package/dist/presentation/export-boxes.js +74 -0
  333. package/dist/presentation/export-boxes.js.map +7 -0
  334. package/dist/presentation/export-pptx.d.ts +16 -0
  335. package/dist/presentation/export-pptx.js +194 -0
  336. package/dist/presentation/export-pptx.js.map +7 -0
  337. package/dist/presentation/import-pptx.d.ts +35 -0
  338. package/dist/presentation/import-pptx.js +659 -0
  339. package/dist/presentation/import-pptx.js.map +7 -0
  340. package/dist/presentation/merge-outside-edits.d.ts +12 -0
  341. package/dist/presentation/merge-outside-edits.js +35 -0
  342. package/dist/presentation/merge-outside-edits.js.map +7 -0
  343. package/dist/presentation/model.d.ts +201 -0
  344. package/dist/presentation/model.js +271 -0
  345. package/dist/presentation/model.js.map +7 -0
  346. package/dist/presentation/panel-id.d.ts +44 -0
  347. package/dist/presentation/panel-id.js +29 -0
  348. package/dist/presentation/panel-id.js.map +7 -0
  349. package/dist/presentation/persistence.d.ts +121 -0
  350. package/dist/presentation/persistence.js +141 -0
  351. package/dist/presentation/persistence.js.map +7 -0
  352. package/dist/presentation/pptx-data.d.ts +22 -0
  353. package/dist/presentation/pptx-data.js +83 -0
  354. package/dist/presentation/pptx-data.js.map +7 -0
  355. package/dist/presentation/pptx-xml.d.ts +90 -0
  356. package/dist/presentation/pptx-xml.js +333 -0
  357. package/dist/presentation/pptx-xml.js.map +7 -0
  358. package/dist/presentation/render-slides.d.ts +58 -0
  359. package/dist/presentation/render-slides.js +309 -0
  360. package/dist/presentation/render-slides.js.map +7 -0
  361. package/dist/presentation/saved-boxes.d.ts +11 -0
  362. package/dist/presentation/saved-boxes.js +80 -0
  363. package/dist/presentation/saved-boxes.js.map +7 -0
  364. package/dist/presentation/slide-layout.d.ts +58 -0
  365. package/dist/presentation/slide-layout.js +133 -0
  366. package/dist/presentation/slide-layout.js.map +7 -0
  367. package/dist/presentation/stage-videos.d.ts +5 -0
  368. package/dist/presentation/stage-videos.js +19 -0
  369. package/dist/presentation/stage-videos.js.map +7 -0
  370. package/dist/presentation/store.d.ts +203 -0
  371. package/dist/presentation/store.js +429 -0
  372. package/dist/presentation/store.js.map +7 -0
  373. package/dist/presentation/theme.d.ts +102 -0
  374. package/dist/presentation/theme.js +276 -0
  375. package/dist/presentation/theme.js.map +7 -0
  376. package/dist/presentation/useClipDrag.d.ts +26 -0
  377. package/dist/presentation/useClipDrag.js +65 -0
  378. package/dist/presentation/useClipDrag.js.map +7 -0
  379. package/dist/presentation/useObjectUrl.d.ts +6 -0
  380. package/dist/presentation/useObjectUrl.js +15 -0
  381. package/dist/presentation/useObjectUrl.js.map +7 -0
  382. package/dist/presentation/usePresenterKeys.d.ts +13 -0
  383. package/dist/presentation/usePresenterKeys.js +62 -0
  384. package/dist/presentation/usePresenterKeys.js.map +7 -0
  385. package/dist/settings/index.cjs +149 -148
  386. package/dist/shell/PanelPortal.js +13 -3
  387. package/dist/shell/PanelPortal.js.map +2 -2
  388. package/dist/shell/index.cjs +49 -46
  389. package/dist/shell/panel-windows.d.ts +2 -0
  390. package/dist/shell/panel-windows.js +8 -2
  391. package/dist/shell/panel-windows.js.map +2 -2
  392. package/dist/studio/index.cjs +8 -6
  393. package/dist/studio/index.cjs.map +1 -1
  394. package/dist/styles.css +1 -1
  395. package/dist/workflow-canvas/index.cjs +26 -25
  396. package/dist/workflow-canvas/index.cjs.map +1 -1
  397. package/node_modules/@arbidocs/coedit/package.json +1 -1
  398. package/package.json +6 -5
  399. package/dist/ConnectedCallDock-WER7R222.cjs.map +0 -1
  400. package/dist/DocumentReviewCard-BPIAJJED.cjs.map +0 -1
  401. package/dist/FilesViewerDialog-67WK3TZC.cjs.map +0 -1
  402. package/dist/GridViewImpl-ZMJJWTOM.cjs.map +0 -1
  403. package/dist/WorkspaceTableView-J3C6VH4T.cjs.map +0 -1
  404. package/dist/ai-IM4A23YT.cjs.map +0 -1
  405. package/dist/chunk-557MJ4IH.cjs.map +0 -1
  406. package/dist/chunk-6UTKM5AB.cjs.map +0 -1
  407. package/dist/chunk-6WMMZLEV.cjs.map +0 -1
  408. package/dist/chunk-B3LZITVF.cjs.map +0 -1
  409. package/dist/chunk-BUVIBHFU.cjs.map +0 -1
  410. package/dist/chunk-CKCG4NDB.cjs.map +0 -1
  411. package/dist/chunk-CPR6EHG7.cjs.map +0 -1
  412. package/dist/chunk-HA66DHW6.cjs.map +0 -1
  413. package/dist/chunk-NJCK6V6U.cjs.map +0 -1
  414. package/dist/chunk-NLSWDP42.cjs.map +0 -1
  415. package/dist/chunk-PGJYD67F.cjs.map +0 -1
  416. package/dist/chunk-X36UR4A7.cjs.map +0 -1
  417. package/dist/chunk-YYPZOEED.cjs.map +0 -1
@@ -0,0 +1,86 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from "react";
4
+ import { Crop } from "lucide-react";
5
+ import { ImageCropper } from "@arbidocs/react";
6
+ import { Button } from "@arbidocs/react/ui";
7
+ import { ModalScaffold } from "../../settings/ModalScaffold.js";
8
+ import { usePresentation } from "../../presentation/store.js";
9
+ import { useObjectUrl } from "../../presentation/useObjectUrl.js";
10
+ function CropClipDialog({ clip, onOpenChange }) {
11
+ const url = useObjectUrl(clip?.source ?? EMPTY);
12
+ const [natural, setNatural] = useState(null);
13
+ const [area, setArea] = useState(null);
14
+ useEffect(() => {
15
+ setNatural(null);
16
+ setArea(null);
17
+ if (!clip) return;
18
+ let cancelled = false;
19
+ void createImageBitmap(clip.source).then((bitmap) => {
20
+ if (!cancelled) setNatural({ width: bitmap.width, height: bitmap.height });
21
+ bitmap.close();
22
+ });
23
+ return () => {
24
+ cancelled = true;
25
+ };
26
+ }, [clip]);
27
+ const original = natural ? natural.width / natural.height : 1;
28
+ const apply = () => {
29
+ if (!clip || !natural || !area || !area.width || !area.height) return;
30
+ const rect = {
31
+ x: Math.max(0, area.x / natural.width),
32
+ y: Math.max(0, area.y / natural.height),
33
+ w: Math.min(1, area.width / natural.width),
34
+ h: Math.min(1, area.height / natural.height)
35
+ };
36
+ usePresentation.getState().cropClip(clip.id, rect, area.width / area.height);
37
+ onOpenChange(false);
38
+ };
39
+ return /* @__PURE__ */ jsxs(
40
+ ModalScaffold,
41
+ {
42
+ open: !!clip,
43
+ onOpenChange,
44
+ title: "Crop",
45
+ description: "Choose the part of the image the clip shows.",
46
+ icon: /* @__PURE__ */ jsx(Crop, { className: "size-5" }),
47
+ size: "lg",
48
+ testId: "presentation-crop-dialog",
49
+ children: [
50
+ /* @__PURE__ */ jsx(ModalScaffold.Body, { children: url && natural && /* @__PURE__ */ jsx(
51
+ ImageCropper,
52
+ {
53
+ image: url,
54
+ aspect: original,
55
+ aspectOptions: [
56
+ { label: "Original", value: original },
57
+ { label: "16:9", value: 16 / 9 },
58
+ { label: "4:3", value: 4 / 3 },
59
+ { label: "1:1", value: 1 },
60
+ { label: "3:4", value: 3 / 4 }
61
+ ],
62
+ onCropComplete: (next) => setArea(next)
63
+ }
64
+ ) }),
65
+ /* @__PURE__ */ jsxs(ModalScaffold.Footer, { children: [
66
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => onOpenChange(false), children: "Cancel" }),
67
+ /* @__PURE__ */ jsx(
68
+ Button,
69
+ {
70
+ type: "button",
71
+ onClick: apply,
72
+ disabled: !area,
73
+ "data-testid": "presentation-crop-apply",
74
+ children: "Crop"
75
+ }
76
+ )
77
+ ] })
78
+ ]
79
+ }
80
+ );
81
+ }
82
+ const EMPTY = new Blob();
83
+ export {
84
+ CropClipDialog
85
+ };
86
+ //# sourceMappingURL=CropClipDialog.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/connection/presentation/CropClipDialog.tsx"],
4
+ "sourcesContent": ["/**\n * Crop an image clip: the app's image cropper over the whole source image, to choose the part the\n * clip shows (and its shape). The image itself is untouched: only the clip's area changes, so it\n * can be cropped again, wider or narrower, at any time.\n */\n\nimport { useEffect, useState } from 'react'\nimport { Crop } from 'lucide-react'\nimport { ImageCropper, type CropArea } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ModalScaffold } from '../../settings/ModalScaffold'\nimport type { Clip } from '../../presentation/model'\nimport { usePresentation } from '../../presentation/store'\nimport { useObjectUrl } from '../../presentation/useObjectUrl'\n\nexport interface CropClipDialogProps {\n clip: Clip | null\n onOpenChange: (open: boolean) => void\n}\n\nexport function CropClipDialog({ clip, onOpenChange }: CropClipDialogProps) {\n const url = useObjectUrl(clip?.source ?? EMPTY)\n const [natural, setNatural] = useState<{ width: number; height: number } | null>(null)\n const [area, setArea] = useState<CropArea | null>(null)\n\n // The source's own size, to turn the cropper's pixels into fractions of the image.\n useEffect(() => {\n setNatural(null)\n setArea(null)\n if (!clip) return\n let cancelled = false\n void createImageBitmap(clip.source).then((bitmap) => {\n if (!cancelled) setNatural({ width: bitmap.width, height: bitmap.height })\n bitmap.close()\n })\n return () => {\n cancelled = true\n }\n }, [clip])\n\n const original = natural ? natural.width / natural.height : 1\n const apply = () => {\n if (!clip || !natural || !area || !area.width || !area.height) return\n const rect = {\n x: Math.max(0, area.x / natural.width),\n y: Math.max(0, area.y / natural.height),\n w: Math.min(1, area.width / natural.width),\n h: Math.min(1, area.height / natural.height),\n }\n usePresentation.getState().cropClip(clip.id, rect, area.width / area.height)\n onOpenChange(false)\n }\n\n return (\n <ModalScaffold\n open={!!clip}\n onOpenChange={onOpenChange}\n title=\"Crop\"\n description=\"Choose the part of the image the clip shows.\"\n icon={<Crop className=\"size-5\" />}\n size=\"lg\"\n testId=\"presentation-crop-dialog\"\n >\n <ModalScaffold.Body>\n {url && natural && (\n <ImageCropper\n image={url}\n aspect={original}\n aspectOptions={[\n { label: 'Original', value: original },\n { label: '16:9', value: 16 / 9 },\n { label: '4:3', value: 4 / 3 },\n { label: '1:1', value: 1 },\n { label: '3:4', value: 3 / 4 },\n ]}\n onCropComplete={(next) => setArea(next)}\n />\n )}\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={apply}\n disabled={!area}\n data-testid=\"presentation-crop-apply\"\n >\n Crop\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n\nconst EMPTY = new Blob()\n"],
5
+ "mappings": ";AA2DY,cAoBN,YApBM;AArDZ,SAAS,WAAW,gBAAgB;AACpC,SAAS,YAAY;AACrB,SAAS,oBAAmC;AAC5C,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAE9B,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAOtB,SAAS,eAAe,EAAE,MAAM,aAAa,GAAwB;AAC1E,QAAM,MAAM,aAAa,MAAM,UAAU,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAmD,IAAI;AACrF,QAAM,CAAC,MAAM,OAAO,IAAI,SAA0B,IAAI;AAGtD,YAAU,MAAM;AACd,eAAW,IAAI;AACf,YAAQ,IAAI;AACZ,QAAI,CAAC,KAAM;AACX,QAAI,YAAY;AAChB,SAAK,kBAAkB,KAAK,MAAM,EAAE,KAAK,CAAC,WAAW;AACnD,UAAI,CAAC,UAAW,YAAW,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,CAAC;AACzE,aAAO,MAAM;AAAA,IACf,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,WAAW,UAAU,QAAQ,QAAQ,QAAQ,SAAS;AAC5D,QAAM,QAAQ,MAAM;AAClB,QAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,KAAK,OAAQ;AAC/D,UAAM,OAAO;AAAA,MACX,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,KAAK;AAAA,MACrC,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,MAAM;AAAA,MACtC,GAAG,KAAK,IAAI,GAAG,KAAK,QAAQ,QAAQ,KAAK;AAAA,MACzC,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,QAAQ,MAAM;AAAA,IAC7C;AACA,oBAAgB,SAAS,EAAE,SAAS,KAAK,IAAI,MAAM,KAAK,QAAQ,KAAK,MAAM;AAC3E,iBAAa,KAAK;AAAA,EACpB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,CAAC,CAAC;AAAA,MACR;AAAA,MACA,OAAM;AAAA,MACN,aAAY;AAAA,MACZ,MAAM,oBAAC,QAAK,WAAU,UAAS;AAAA,MAC/B,MAAK;AAAA,MACL,QAAO;AAAA,MAEP;AAAA,4BAAC,cAAc,MAAd,EACE,iBAAO,WACN;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,eAAe;AAAA,cACb,EAAE,OAAO,YAAY,OAAO,SAAS;AAAA,cACrC,EAAE,OAAO,QAAQ,OAAO,KAAK,EAAE;AAAA,cAC/B,EAAE,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,cAC7B,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,cACzB,EAAE,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,YAC/B;AAAA,YACA,gBAAgB,CAAC,SAAS,QAAQ,IAAI;AAAA;AAAA,QACxC,GAEJ;AAAA,QACA,qBAAC,cAAc,QAAd,EACC;AAAA,8BAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,SAAS,MAAM,aAAa,KAAK,GAAG,oBAE5E;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU,CAAC;AAAA,cACX,eAAY;AAAA,cACb;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,MAAM,QAAQ,IAAI,KAAK;",
6
+ "names": []
7
+ }
@@ -0,0 +1,4 @@
1
+ /** The dashed first tile of the clip tray: Generate image. */
2
+ export declare function GenerateTile({ onClick }: {
3
+ onClick: () => void;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Sparkles } from "lucide-react";
4
+ function GenerateTile({ onClick }) {
5
+ return /* @__PURE__ */ jsxs(
6
+ "button",
7
+ {
8
+ type: "button",
9
+ onClick,
10
+ title: "Generate an image",
11
+ "aria-label": "Generate image",
12
+ className: "flex h-[72px] w-[72px] flex-col items-center justify-center gap-1 rounded-lg border border-dashed border-border text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
13
+ "data-testid": "presentation-generate-image",
14
+ children: [
15
+ /* @__PURE__ */ jsx(Sparkles, { className: "size-4" }),
16
+ /* @__PURE__ */ jsx("span", { className: "text-[10px] font-medium", children: "Generate" })
17
+ ]
18
+ }
19
+ );
20
+ }
21
+ export {
22
+ GenerateTile
23
+ };
24
+ //# sourceMappingURL=GenerateTile.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/connection/presentation/GenerateTile.tsx"],
4
+ "sourcesContent": ["import { Sparkles } from 'lucide-react'\n\n/** The dashed first tile of the clip tray: Generate image. */\nexport function GenerateTile({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title=\"Generate an image\"\n aria-label=\"Generate image\"\n className=\"flex h-[72px] w-[72px] flex-col items-center justify-center gap-1 rounded-lg border border-dashed border-border text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid=\"presentation-generate-image\"\n >\n <Sparkles className=\"size-4\" />\n <span className=\"text-[10px] font-medium\">Generate</span>\n </button>\n )\n}\n"],
5
+ "mappings": ";AAKI,SAQE,KARF;AALJ,SAAS,gBAAgB;AAGlB,SAAS,aAAa,EAAE,QAAQ,GAA4B;AACjE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,OAAM;AAAA,MACN,cAAW;AAAA,MACX,WAAU;AAAA,MACV,eAAY;AAAA,MAEZ;AAAA,4BAAC,YAAS,WAAU,UAAS;AAAA,QAC7B,oBAAC,UAAK,WAAU,2BAA0B,sBAAQ;AAAA;AAAA;AAAA,EACpD;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,8 @@
1
+ import type { LabelColumn } from './useLabelColumns';
2
+ /**
3
+ * "Label clips with" in the presentation's menu: no column, or one of the workspace's annotation
4
+ * columns (`useLabelColumns`), whose value leads each clip's label.
5
+ */
6
+ export declare function LabelColumnMenu({ columns }: {
7
+ columns: LabelColumn[];
8
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ DropdownMenuRadioGroup,
5
+ DropdownMenuRadioItem,
6
+ DropdownMenuSub,
7
+ DropdownMenuSubContent,
8
+ DropdownMenuSubTrigger
9
+ } from "@arbidocs/react/ui";
10
+ import { usePresentation } from "../../presentation/store.js";
11
+ const NONE = "none";
12
+ function LabelColumnMenu({ columns }) {
13
+ const labelColumn = usePresentation((s) => s.labelColumn);
14
+ const setLabelColumn = usePresentation((s) => s.setLabelColumn);
15
+ if (!columns.length) return null;
16
+ const chosen = columns.find((column) => column.id === labelColumn);
17
+ return /* @__PURE__ */ jsxs(DropdownMenuSub, { children: [
18
+ /* @__PURE__ */ jsxs(DropdownMenuSubTrigger, { "data-testid": "presentation-label-column", children: [
19
+ "Label clips with",
20
+ /* @__PURE__ */ jsx("span", { className: "ml-auto pl-3 text-xs text-muted-foreground", children: chosen?.name ?? "None" })
21
+ ] }),
22
+ /* @__PURE__ */ jsx(DropdownMenuSubContent, { children: /* @__PURE__ */ jsxs(
23
+ DropdownMenuRadioGroup,
24
+ {
25
+ value: chosen?.id ?? NONE,
26
+ onValueChange: (value) => setLabelColumn(value === NONE ? null : value),
27
+ children: [
28
+ /* @__PURE__ */ jsx(DropdownMenuRadioItem, { value: NONE, children: "No column" }),
29
+ columns.map((column) => /* @__PURE__ */ jsx(DropdownMenuRadioItem, { value: column.id, children: column.name }, column.id))
30
+ ]
31
+ }
32
+ ) })
33
+ ] });
34
+ }
35
+ export {
36
+ LabelColumnMenu
37
+ };
38
+ //# sourceMappingURL=LabelColumnMenu.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/connection/presentation/LabelColumnMenu.tsx"],
4
+ "sourcesContent": ["import {\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@arbidocs/react/ui'\nimport { usePresentation } from '../../presentation/store'\nimport type { LabelColumn } from './useLabelColumns'\n\nconst NONE = 'none'\n\n/**\n * \"Label clips with\" in the presentation's menu: no column, or one of the workspace's annotation\n * columns (`useLabelColumns`), whose value leads each clip's label.\n */\nexport function LabelColumnMenu({ columns }: { columns: LabelColumn[] }) {\n const labelColumn = usePresentation((s) => s.labelColumn)\n const setLabelColumn = usePresentation((s) => s.setLabelColumn)\n if (!columns.length) return null\n const chosen = columns.find((column) => column.id === labelColumn)\n return (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger data-testid=\"presentation-label-column\">\n Label clips with\n <span className=\"ml-auto pl-3 text-xs text-muted-foreground\">{chosen?.name ?? 'None'}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuRadioGroup\n value={chosen?.id ?? NONE}\n onValueChange={(value) => setLabelColumn(value === NONE ? null : value)}\n >\n <DropdownMenuRadioItem value={NONE}>No column</DropdownMenuRadioItem>\n {columns.map((column) => (\n <DropdownMenuRadioItem key={column.id} value={column.id}>\n {column.name}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )\n}\n"],
5
+ "mappings": ";AAuBM,SAEE,KAFF;AAvBN;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAGhC,MAAM,OAAO;AAMN,SAAS,gBAAgB,EAAE,QAAQ,GAA+B;AACvE,QAAM,cAAc,gBAAgB,CAAC,MAAM,EAAE,WAAW;AACxD,QAAM,iBAAiB,gBAAgB,CAAC,MAAM,EAAE,cAAc;AAC9D,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAM,SAAS,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,WAAW;AACjE,SACE,qBAAC,mBACC;AAAA,yBAAC,0BAAuB,eAAY,6BAA4B;AAAA;AAAA,MAE9D,oBAAC,UAAK,WAAU,8CAA8C,kBAAQ,QAAQ,QAAO;AAAA,OACvF;AAAA,IACA,oBAAC,0BACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,QAAQ,MAAM;AAAA,QACrB,eAAe,CAAC,UAAU,eAAe,UAAU,OAAO,OAAO,KAAK;AAAA,QAEtE;AAAA,8BAAC,yBAAsB,OAAO,MAAM,uBAAS;AAAA,UAC5C,QAAQ,IAAI,CAAC,WACZ,oBAAC,yBAAsC,OAAO,OAAO,IAClD,iBAAO,QADkB,OAAO,EAEnC,CACD;AAAA;AAAA;AAAA,IACH,GACF;AAAA,KACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The presentation's dialogs: the app's Generate image (to create or edit an image into the clips),
3
+ * save under a title (or as a template), open a saved one (or start from a template), choose the
4
+ * theme's logo.
5
+ */
6
+ interface DialogProps {
7
+ open: boolean;
8
+ onOpenChange: (open: boolean) => void;
9
+ }
10
+ /**
11
+ * Generate image, from the presentation: the app's own Generate image dialog (the workflow's form),
12
+ * opened straight on its form, with `referenceId` as its source image when editing one. Its run
13
+ * adds the image to the clips instead of opening a chat.
14
+ */
15
+ export declare function GenerateImageDialog({ open, onOpenChange, referenceId, }: DialogProps & {
16
+ referenceId?: string | null;
17
+ }): import("react").JSX.Element | null;
18
+ /** Save the presentation under a title (in the workspace's Presentations folder). */
19
+ /** How the presentation is saved: again, as a new copy, as a template, or exported as a PDF. */
20
+ export type SaveMode = 'save' | 'saveAs' | 'export' | 'template';
21
+ /** Save under a name you type, in the workspace's Presentations folder. */
22
+ export declare function SavePresentationDialog({ open, onOpenChange, mode, }: DialogProps & {
23
+ mode?: SaveMode;
24
+ }): import("react").JSX.Element;
25
+ /**
26
+ * Open a presentation saved in this workspace, in place of this one; or (`templates`) start a new
27
+ * one from a template.
28
+ */
29
+ export declare function OpenPresentationDialog({ open, onOpenChange, onOpened, templates, }: DialogProps & {
30
+ /**
31
+ * Show the chosen presentation (the viewer's slides tab opens its document, and loads it);
32
+ * after a template, `null`: a new presentation, its look and slides already loaded.
33
+ */
34
+ onOpened: (documentId: string | null) => void;
35
+ templates?: boolean;
36
+ }): import("react").JSX.Element;
37
+ /** Design › Logo: one of the workspace's images, in the footer of every slide. */
38
+ export declare function ChooseLogoDialog({ open, onOpenChange }: DialogProps): import("react").JSX.Element;
39
+ export {};
@@ -0,0 +1,295 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useMemo, useState } from "react";
4
+ import {
5
+ FileDown,
6
+ FolderOpen,
7
+ ImageIcon,
8
+ LayoutTemplate,
9
+ Loader2,
10
+ Presentation,
11
+ Save
12
+ } from "lucide-react";
13
+ import { useDocuments } from "@arbidocs/react";
14
+ import { Button, Input, getDocumentTitle } from "@arbidocs/react/ui";
15
+ import { DocumentPicker } from "../../settings/DocumentPicker.js";
16
+ import { ModalScaffold } from "../../settings/ModalScaffold.js";
17
+ import { useBlocksEnvironment } from "../../provider/environment.js";
18
+ import { GENERATE_IMAGE_ID } from "../../agents/workflows/catalogue/seed.js";
19
+ import { ConnectedWorkflowStart } from "../workflows/ConnectedWorkflowStart.js";
20
+ import { useWorkflowDefinitions } from "../workflows/useWorkflowDefinitions.js";
21
+ import { usePresentation } from "../../presentation/store.js";
22
+ import { useGenerateImageLaunch } from "./useImageGeneration.js";
23
+ import { usePresentationFiles } from "./usePresentationFiles.js";
24
+ function GenerateImageDialog({
25
+ open,
26
+ onOpenChange,
27
+ referenceId
28
+ }) {
29
+ const notify = usePresentation((s) => s.notify);
30
+ const { skills } = useWorkflowDefinitions();
31
+ const run = useGenerateImageLaunch();
32
+ const workflows = useMemo(
33
+ () => skills.filter((w) => w.id === GENERATE_IMAGE_ID).map((w) => ({ ...w, options: { ...w.options, agent: false } })),
34
+ [skills]
35
+ );
36
+ const onLaunch = useCallback(
37
+ async (launch) => {
38
+ try {
39
+ await run(launch);
40
+ notify("The image is in your clips", "success");
41
+ } catch (error) {
42
+ notify(error instanceof Error ? error.message : "The image could not be generated", "error");
43
+ throw error;
44
+ }
45
+ },
46
+ [run, notify]
47
+ );
48
+ if (!open || !workflows.length) return null;
49
+ return /* @__PURE__ */ jsx(
50
+ ConnectedWorkflowStart,
51
+ {
52
+ workflows,
53
+ showTiles: false,
54
+ activeId: GENERATE_IMAGE_ID,
55
+ onActiveIdChange: (id) => id === null && onOpenChange(false),
56
+ initialInputsFor: () => referenceId ? { references: { folders: [], labels: [], documents: [referenceId] } } : {},
57
+ onLaunch,
58
+ uploadInPlace: true
59
+ }
60
+ );
61
+ }
62
+ const SAVE_TEXT = {
63
+ save: {
64
+ title: "Save presentation",
65
+ description: "Saved in Files \u203A Presentations as a PowerPoint file: searchable, it opens again here for editing, and in PowerPoint.",
66
+ action: "Save"
67
+ },
68
+ saveAs: {
69
+ title: "Save as",
70
+ description: "A new copy under this name in Files \u203A Presentations.",
71
+ action: "Save"
72
+ },
73
+ template: {
74
+ title: "Save as template",
75
+ description: "Its look and slides, without clips, in Files \u203A Presentations \u203A Templates: New from template starts from it.",
76
+ action: "Save template"
77
+ },
78
+ export: {
79
+ title: "Export PDF",
80
+ description: "A PDF of the slides in Files \u203A Presentations \u203A Exports: to send or file. Redactions are burnt in.",
81
+ action: "Export"
82
+ }
83
+ };
84
+ function SavePresentationDialog({
85
+ open,
86
+ onOpenChange,
87
+ mode = "save"
88
+ }) {
89
+ const notify = usePresentation((s) => s.notify);
90
+ const { save, exportPdf } = usePresentationFiles();
91
+ const current = usePresentation((s) => s.title);
92
+ const [title, setTitle] = useState(current);
93
+ const [busy, setBusy] = useState(false);
94
+ const text = SAVE_TEXT[mode];
95
+ useEffect(() => {
96
+ if (!open) return;
97
+ const named = current === "Untitled presentation" ? "" : current;
98
+ setTitle(mode === "saveAs" && named ? `${named} (copy)` : mode === "template" ? "" : named);
99
+ }, [open, current, mode]);
100
+ const submit = async () => {
101
+ const name = title.trim();
102
+ if (!name || busy) return;
103
+ setBusy(true);
104
+ try {
105
+ if (mode === "export") {
106
+ await exportPdf(name);
107
+ notify(`"${name}.pdf" saved in Presentations`, "success");
108
+ } else {
109
+ await save(name, { asNew: mode === "saveAs", template: mode === "template" });
110
+ notify(`"${name}" saved in Presentations`, "success");
111
+ }
112
+ onOpenChange(false);
113
+ } catch (error) {
114
+ notify(error instanceof Error ? error.message : "Could not save", "error");
115
+ } finally {
116
+ setBusy(false);
117
+ }
118
+ };
119
+ return /* @__PURE__ */ jsxs(
120
+ ModalScaffold,
121
+ {
122
+ open,
123
+ onOpenChange,
124
+ title: text.title,
125
+ description: text.description,
126
+ showDescription: true,
127
+ icon: mode === "export" ? /* @__PURE__ */ jsx(FileDown, { className: "size-5" }) : /* @__PURE__ */ jsx(Save, { className: "size-5" }),
128
+ size: "sm",
129
+ testId: "presentation-save-dialog",
130
+ children: [
131
+ /* @__PURE__ */ jsx(ModalScaffold.Body, { children: /* @__PURE__ */ jsx(
132
+ Input,
133
+ {
134
+ autoFocus: true,
135
+ value: title,
136
+ onChange: (event) => setTitle(event.target.value),
137
+ onKeyDown: (event) => event.key === "Enter" && void submit(),
138
+ placeholder: "Name, e.g. Opening statement",
139
+ "aria-label": "Name",
140
+ disabled: busy
141
+ }
142
+ ) }),
143
+ /* @__PURE__ */ jsxs(ModalScaffold.Footer, { children: [
144
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => onOpenChange(false), children: "Cancel" }),
145
+ /* @__PURE__ */ jsxs(Button, { type: "button", onClick: () => void submit(), disabled: !title.trim() || busy, children: [
146
+ busy && /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin" }),
147
+ text.action
148
+ ] })
149
+ ] })
150
+ ]
151
+ }
152
+ );
153
+ }
154
+ function OpenPresentationDialog({
155
+ open,
156
+ onOpenChange,
157
+ onOpened,
158
+ templates = false
159
+ }) {
160
+ const { confirm } = useBlocksEnvironment();
161
+ const notify = usePresentation((s) => s.notify);
162
+ const { list, startFromTemplate } = usePresentationFiles();
163
+ const [entries, setEntries] = useState(null);
164
+ const [opening, setOpening] = useState(null);
165
+ useEffect(() => {
166
+ if (!open) return;
167
+ setEntries(null);
168
+ list(templates ? "templates" : "presentations").then(setEntries).catch(() => setEntries([]));
169
+ }, [open, list, templates]);
170
+ const choose = async (entry) => {
171
+ if (!templates) {
172
+ onOpenChange(false);
173
+ onOpened(entry.id);
174
+ return;
175
+ }
176
+ if (usePresentation.getState().clips.length) {
177
+ const ok = await confirm({
178
+ title: "New from template",
179
+ message: "Replace the presentation that is open? Save it first to keep it.",
180
+ kind: "confirm"
181
+ });
182
+ if (!ok) return;
183
+ }
184
+ setOpening(entry.id);
185
+ try {
186
+ await startFromTemplate(entry.id);
187
+ onOpenChange(false);
188
+ onOpened(null);
189
+ } catch (error) {
190
+ notify(error instanceof Error ? error.message : "The template could not be opened", "error");
191
+ } finally {
192
+ setOpening(null);
193
+ }
194
+ };
195
+ return /* @__PURE__ */ jsx(
196
+ ModalScaffold,
197
+ {
198
+ open,
199
+ onOpenChange,
200
+ title: templates ? "New from template" : "Open presentation",
201
+ description: templates ? "A new presentation with the template\u2019s look and slides." : "Presentations saved in this workspace.",
202
+ showDescription: true,
203
+ icon: templates ? /* @__PURE__ */ jsx(LayoutTemplate, { className: "size-5" }) : /* @__PURE__ */ jsx(FolderOpen, { className: "size-5" }),
204
+ testId: templates ? "presentation-template-dialog" : "presentation-open-dialog",
205
+ children: /* @__PURE__ */ jsx(ModalScaffold.Body, { children: entries === null ? /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
206
+ /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin" }),
207
+ " Loading\u2026"
208
+ ] }) : entries.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: templates ? "No templates yet. Save as template\u2026 keeps one in Files \u203A Presentations \u203A Templates." : "No saved presentations yet." }) : /* @__PURE__ */ jsx("ul", { className: "divide-y divide-border rounded-lg border border-border", children: entries.map((entry) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
209
+ "button",
210
+ {
211
+ type: "button",
212
+ disabled: !!opening,
213
+ onClick: () => void choose(entry),
214
+ className: "flex w-full items-center gap-3 px-3 py-2.5 text-left hover:bg-muted focus-visible:bg-muted focus-visible:outline-none disabled:opacity-60 pointer-coarse:min-h-11",
215
+ children: [
216
+ opening === entry.id ? /* @__PURE__ */ jsx(Loader2, { className: "size-4 shrink-0 animate-spin text-muted-foreground" }) : /* @__PURE__ */ jsx(Presentation, { className: "size-4 shrink-0 text-muted-foreground" }),
217
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-sm font-medium", children: entry.title }),
218
+ entry.updatedAt && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: new Date(entry.updatedAt).toLocaleDateString() })
219
+ ]
220
+ }
221
+ ) }, entry.id)) }) })
222
+ }
223
+ );
224
+ }
225
+ const IMAGE_FILE = /\.(png|jpe?g|gif|webp|svg)$/i;
226
+ function ChooseLogoDialog({ open, onOpenChange }) {
227
+ const setTheme = usePresentation((s) => s.setTheme);
228
+ const corner = usePresentation((s) => s.theme.logo?.corner ?? "br");
229
+ const { data: documents } = useDocuments(void 0, { enabled: open });
230
+ const [picked, setPicked] = useState("");
231
+ const groups = useMemo(
232
+ () => [
233
+ {
234
+ id: "images",
235
+ docs: (documents ?? []).filter((doc) => IMAGE_FILE.test(doc.file_name ?? "")).map((doc) => ({
236
+ id: doc.external_id,
237
+ title: getDocumentTitle(doc, "Untitled"),
238
+ fileName: doc.file_name
239
+ })).sort((a, b) => a.title.localeCompare(b.title))
240
+ }
241
+ ],
242
+ [documents]
243
+ );
244
+ const selected = groups[0].docs.find((doc) => doc.id === picked);
245
+ const use = () => {
246
+ if (!selected) return;
247
+ setTheme({ logo: { documentId: selected.id, fileName: selected.fileName ?? "", corner } });
248
+ setPicked("");
249
+ onOpenChange(false);
250
+ };
251
+ return /* @__PURE__ */ jsxs(
252
+ ModalScaffold,
253
+ {
254
+ open,
255
+ onOpenChange,
256
+ title: "Logo",
257
+ description: "An image of this workspace (a PNG with a transparent background looks best), small in the footer of every slide.",
258
+ showDescription: true,
259
+ icon: /* @__PURE__ */ jsx(ImageIcon, { className: "size-5" }),
260
+ size: "sm",
261
+ testId: "presentation-logo-dialog",
262
+ children: [
263
+ /* @__PURE__ */ jsx(ModalScaffold.Body, { children: /* @__PURE__ */ jsx(
264
+ DocumentPicker,
265
+ {
266
+ groups,
267
+ value: picked,
268
+ onValueChange: setPicked,
269
+ labels: { placeholder: "Choose an image", noDocuments: "No images in this workspace." }
270
+ }
271
+ ) }),
272
+ /* @__PURE__ */ jsxs(ModalScaffold.Footer, { children: [
273
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => onOpenChange(false), children: "Cancel" }),
274
+ /* @__PURE__ */ jsx(
275
+ Button,
276
+ {
277
+ type: "button",
278
+ onClick: use,
279
+ disabled: !selected,
280
+ "data-testid": "presentation-logo-use",
281
+ children: "Use as logo"
282
+ }
283
+ )
284
+ ] })
285
+ ]
286
+ }
287
+ );
288
+ }
289
+ export {
290
+ ChooseLogoDialog,
291
+ GenerateImageDialog,
292
+ OpenPresentationDialog,
293
+ SavePresentationDialog
294
+ };
295
+ //# sourceMappingURL=PresentationDialogs.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/connection/presentation/PresentationDialogs.tsx"],
4
+ "sourcesContent": ["/**\n * The presentation's dialogs: the app's Generate image (to create or edit an image into the clips),\n * save under a title (or as a template), open a saved one (or start from a template), choose the\n * theme's logo.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n FileDown,\n FolderOpen,\n ImageIcon,\n LayoutTemplate,\n Loader2,\n Presentation,\n Save,\n} from 'lucide-react'\nimport { useDocuments } from '@arbidocs/react'\nimport { Button, Input, getDocumentTitle } from '@arbidocs/react/ui'\nimport { DocumentPicker, type PickerGroup } from '../../settings/DocumentPicker'\nimport { ModalScaffold } from '../../settings/ModalScaffold'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { GENERATE_IMAGE_ID } from '../../agents/workflows/catalogue/seed'\nimport type { OnWorkflowLaunch } from '../../agents/workflows/types'\nimport { ConnectedWorkflowStart } from '../workflows/ConnectedWorkflowStart'\nimport { useWorkflowDefinitions } from '../workflows/useWorkflowDefinitions'\nimport { usePresentation } from '../../presentation/store'\nimport { useGenerateImageLaunch } from './useImageGeneration'\nimport { usePresentationFiles, type SavedPresentationEntry } from './usePresentationFiles'\n\ninterface DialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\n/**\n * Generate image, from the presentation: the app's own Generate image dialog (the workflow's form),\n * opened straight on its form, with `referenceId` as its source image when editing one. Its run\n * adds the image to the clips instead of opening a chat.\n */\nexport function GenerateImageDialog({\n open,\n onOpenChange,\n referenceId,\n}: DialogProps & { referenceId?: string | null }) {\n const notify = usePresentation((s) => s.notify)\n const { skills } = useWorkflowDefinitions()\n const run = useGenerateImageLaunch()\n // The run makes an image for the presentation, so it is always the user's own (no agent choice).\n const workflows = useMemo(\n () =>\n skills\n .filter((w) => w.id === GENERATE_IMAGE_ID)\n .map((w) => ({ ...w, options: { ...w.options, agent: false } })),\n [skills]\n )\n const onLaunch = useCallback<OnWorkflowLaunch>(\n async (launch) => {\n try {\n await run(launch)\n notify('The image is in your clips', 'success')\n } catch (error) {\n notify(error instanceof Error ? error.message : 'The image could not be generated', 'error')\n throw error\n }\n },\n [run, notify]\n )\n if (!open || !workflows.length) return null\n return (\n <ConnectedWorkflowStart\n workflows={workflows}\n showTiles={false}\n activeId={GENERATE_IMAGE_ID}\n onActiveIdChange={(id) => id === null && onOpenChange(false)}\n initialInputsFor={() =>\n referenceId ? { references: { folders: [], labels: [], documents: [referenceId] } } : {}\n }\n onLaunch={onLaunch}\n // In the presentation's (popped-out) window: uploads happen here, not in the app's window.\n uploadInPlace\n />\n )\n}\n\n/** Save the presentation under a title (in the workspace's Presentations folder). */\n/** How the presentation is saved: again, as a new copy, as a template, or exported as a PDF. */\nexport type SaveMode = 'save' | 'saveAs' | 'export' | 'template'\n\nconst SAVE_TEXT: Record<SaveMode, { title: string; description: string; action: string }> = {\n save: {\n title: 'Save presentation',\n description:\n 'Saved in Files \u203A Presentations as a PowerPoint file: searchable, it opens again here for editing, and in PowerPoint.',\n action: 'Save',\n },\n saveAs: {\n title: 'Save as',\n description: 'A new copy under this name in Files \u203A Presentations.',\n action: 'Save',\n },\n template: {\n title: 'Save as template',\n description:\n 'Its look and slides, without clips, in Files \u203A Presentations \u203A Templates: New from template starts from it.',\n action: 'Save template',\n },\n export: {\n title: 'Export PDF',\n description:\n 'A PDF of the slides in Files \u203A Presentations \u203A Exports: to send or file. Redactions are burnt in.',\n action: 'Export',\n },\n}\n\n/** Save under a name you type, in the workspace's Presentations folder. */\nexport function SavePresentationDialog({\n open,\n onOpenChange,\n mode = 'save',\n}: DialogProps & { mode?: SaveMode }) {\n const notify = usePresentation((s) => s.notify)\n const { save, exportPdf } = usePresentationFiles()\n const current = usePresentation((s) => s.title)\n const [title, setTitle] = useState(current)\n const [busy, setBusy] = useState(false)\n const text = SAVE_TEXT[mode]\n useEffect(() => {\n if (!open) return\n const named = current === 'Untitled presentation' ? '' : current\n setTitle(mode === 'saveAs' && named ? `${named} (copy)` : mode === 'template' ? '' : named)\n }, [open, current, mode])\n\n const submit = async () => {\n const name = title.trim()\n if (!name || busy) return\n setBusy(true)\n try {\n if (mode === 'export') {\n await exportPdf(name)\n notify(`\"${name}.pdf\" saved in Presentations`, 'success')\n } else {\n await save(name, { asNew: mode === 'saveAs', template: mode === 'template' })\n notify(`\"${name}\" saved in Presentations`, 'success')\n }\n onOpenChange(false)\n } catch (error) {\n notify(error instanceof Error ? error.message : 'Could not save', 'error')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <ModalScaffold\n open={open}\n onOpenChange={onOpenChange}\n title={text.title}\n description={text.description}\n showDescription\n icon={mode === 'export' ? <FileDown className=\"size-5\" /> : <Save className=\"size-5\" />}\n size=\"sm\"\n testId=\"presentation-save-dialog\"\n >\n <ModalScaffold.Body>\n <Input\n autoFocus\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n onKeyDown={(event) => event.key === 'Enter' && void submit()}\n placeholder=\"Name, e.g. Opening statement\"\n aria-label=\"Name\"\n disabled={busy}\n />\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button type=\"button\" onClick={() => void submit()} disabled={!title.trim() || busy}>\n {busy && <Loader2 className=\"size-4 animate-spin\" />}\n {text.action}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n\n/**\n * Open a presentation saved in this workspace, in place of this one; or (`templates`) start a new\n * one from a template.\n */\nexport function OpenPresentationDialog({\n open,\n onOpenChange,\n onOpened,\n templates = false,\n}: DialogProps & {\n /**\n * Show the chosen presentation (the viewer's slides tab opens its document, and loads it);\n * after a template, `null`: a new presentation, its look and slides already loaded.\n */\n onOpened: (documentId: string | null) => void\n templates?: boolean\n}) {\n const { confirm } = useBlocksEnvironment()\n const notify = usePresentation((s) => s.notify)\n const { list, startFromTemplate } = usePresentationFiles()\n const [entries, setEntries] = useState<SavedPresentationEntry[] | null>(null)\n const [opening, setOpening] = useState<string | null>(null)\n\n useEffect(() => {\n if (!open) return\n setEntries(null)\n list(templates ? 'templates' : 'presentations')\n .then(setEntries)\n .catch(() => setEntries([]))\n }, [open, list, templates])\n\n const choose = async (entry: SavedPresentationEntry) => {\n if (!templates) {\n onOpenChange(false)\n onOpened(entry.id)\n return\n }\n if (usePresentation.getState().clips.length) {\n const ok = await confirm({\n title: 'New from template',\n message: 'Replace the presentation that is open? Save it first to keep it.',\n kind: 'confirm',\n })\n if (!ok) return\n }\n setOpening(entry.id)\n try {\n await startFromTemplate(entry.id)\n onOpenChange(false)\n onOpened(null)\n } catch (error) {\n notify(error instanceof Error ? error.message : 'The template could not be opened', 'error')\n } finally {\n setOpening(null)\n }\n }\n\n return (\n <ModalScaffold\n open={open}\n onOpenChange={onOpenChange}\n title={templates ? 'New from template' : 'Open presentation'}\n description={\n templates\n ? 'A new presentation with the template\u2019s look and slides.'\n : 'Presentations saved in this workspace.'\n }\n showDescription\n icon={templates ? <LayoutTemplate className=\"size-5\" /> : <FolderOpen className=\"size-5\" />}\n testId={templates ? 'presentation-template-dialog' : 'presentation-open-dialog'}\n >\n <ModalScaffold.Body>\n {entries === null ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> Loading\u2026\n </p>\n ) : entries.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n {templates\n ? 'No templates yet. Save as template\u2026 keeps one in Files \u203A Presentations \u203A Templates.'\n : 'No saved presentations yet.'}\n </p>\n ) : (\n <ul className=\"divide-y divide-border rounded-lg border border-border\">\n {entries.map((entry) => (\n <li key={entry.id}>\n <button\n type=\"button\"\n disabled={!!opening}\n onClick={() => void choose(entry)}\n className=\"flex w-full items-center gap-3 px-3 py-2.5 text-left hover:bg-muted focus-visible:bg-muted focus-visible:outline-none disabled:opacity-60 pointer-coarse:min-h-11\"\n >\n {opening === entry.id ? (\n <Loader2 className=\"size-4 shrink-0 animate-spin text-muted-foreground\" />\n ) : (\n <Presentation className=\"size-4 shrink-0 text-muted-foreground\" />\n )}\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">{entry.title}</span>\n {entry.updatedAt && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {new Date(entry.updatedAt).toLocaleDateString()}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n )}\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\nconst IMAGE_FILE = /\\.(png|jpe?g|gif|webp|svg)$/i\n\n/** Design \u203A Logo: one of the workspace's images, in the footer of every slide. */\nexport function ChooseLogoDialog({ open, onOpenChange }: DialogProps) {\n const setTheme = usePresentation((s) => s.setTheme)\n const corner = usePresentation((s) => s.theme.logo?.corner ?? 'br')\n const { data: documents } = useDocuments(undefined, { enabled: open })\n const [picked, setPicked] = useState('')\n const groups = useMemo<PickerGroup[]>(\n () => [\n {\n id: 'images',\n docs: (documents ?? [])\n .filter((doc) => IMAGE_FILE.test(doc.file_name ?? ''))\n .map((doc) => ({\n id: doc.external_id,\n title: getDocumentTitle(doc, 'Untitled'),\n fileName: doc.file_name,\n }))\n .sort((a, b) => a.title.localeCompare(b.title)),\n },\n ],\n [documents]\n )\n const selected = groups[0].docs.find((doc) => doc.id === picked)\n const use = () => {\n if (!selected) return\n setTheme({ logo: { documentId: selected.id, fileName: selected.fileName ?? '', corner } })\n setPicked('')\n onOpenChange(false)\n }\n return (\n <ModalScaffold\n open={open}\n onOpenChange={onOpenChange}\n title=\"Logo\"\n description=\"An image of this workspace (a PNG with a transparent background looks best), small in the footer of every slide.\"\n showDescription\n icon={<ImageIcon className=\"size-5\" />}\n size=\"sm\"\n testId=\"presentation-logo-dialog\"\n >\n <ModalScaffold.Body>\n <DocumentPicker\n groups={groups}\n value={picked}\n onValueChange={setPicked}\n labels={{ placeholder: 'Choose an image', noDocuments: 'No images in this workspace.' }}\n />\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={use}\n disabled={!selected}\n data-testid=\"presentation-logo-use\"\n >\n Use as logo\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * A presentation saved before presentations were PDFs (the editable data alone), in the viewer's
3
+ * PDF tab: it has no slides to show there, so the card says what it is and opens its slides.
4
+ */
5
+ export interface PresentationFileCardProps {
6
+ documentId: string;
7
+ fileName: string;
8
+ }
9
+ /** A presentation saved in the older format: opening it and saving makes it a presentation PDF. */
10
+ export declare function PresentationFileCard({ documentId, fileName }: PresentationFileCardProps): import("react").JSX.Element;
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Pencil, Presentation } from "lucide-react";
4
+ import { useArbiSessionStore } from "@arbidocs/react";
5
+ import { Button } from "@arbidocs/react/ui";
6
+ import { EmptyState } from "../../components/EmptyState.js";
7
+ import { presentationTitle } from "../../presentation/persistence.js";
8
+ import { editPresentation } from "./requests.js";
9
+ function PresentationFileCard({ documentId, fileName }) {
10
+ const session = useArbiSessionStore();
11
+ return /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center p-6", "data-testid": "presentation-file", children: /* @__PURE__ */ jsx(
12
+ EmptyState,
13
+ {
14
+ icon: Presentation,
15
+ title: presentationTitle(fileName),
16
+ description: "A presentation saved in an earlier format, without its slides. Open it and save it to keep it as a presentation PDF; this file can then be deleted.",
17
+ action: /* @__PURE__ */ jsxs(
18
+ Button,
19
+ {
20
+ type: "button",
21
+ onClick: () => editPresentation(session, { kind: "open", documentId }),
22
+ "data-testid": "presentation-file-edit",
23
+ children: [
24
+ /* @__PURE__ */ jsx(Pencil, { className: "size-4" }),
25
+ "Open the slides"
26
+ ]
27
+ }
28
+ )
29
+ }
30
+ ) });
31
+ }
32
+ export {
33
+ PresentationFileCard
34
+ };
35
+ //# sourceMappingURL=PresentationFileCard.js.map