@arbidocs/blocks 0.5.120 → 0.5.121

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 (413) hide show
  1. package/dist/ClippingMediaViewer-B6WG7Q64.cjs +156 -0
  2. package/dist/ClippingMediaViewer-B6WG7Q64.cjs.map +1 -0
  3. package/dist/ClippingPdfViewer-6GCVTV3V.cjs +79 -0
  4. package/dist/ClippingPdfViewer-6GCVTV3V.cjs.map +1 -0
  5. package/dist/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-DC5V5OUJ.cjs} +25 -23
  6. package/dist/ConnectedCallDock-DC5V5OUJ.cjs.map +1 -0
  7. package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-FQLXWTFB.cjs} +18 -16
  8. package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-FQLXWTFB.cjs.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-SGE4R3M4.cjs → ConnectedNativeDocxComparison-4Q5S7VLD.cjs} +17 -17
  10. package/dist/{ConnectedNativeDocxComparison-SGE4R3M4.cjs.map → ConnectedNativeDocxComparison-4Q5S7VLD.cjs.map} +1 -1
  11. package/dist/ConnectedPresentation-4HLDZDWV.cjs +183 -0
  12. package/dist/ConnectedPresentation-4HLDZDWV.cjs.map +1 -0
  13. package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
  14. package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
  15. package/dist/ConnectedSlidesTab-7QDE2CZD.cjs +234 -0
  16. package/dist/ConnectedSlidesTab-7QDE2CZD.cjs.map +1 -0
  17. package/dist/{ConnectedStreamedWordArtifact-6MCLJRIT.cjs → ConnectedStreamedWordArtifact-FFOQJBOI.cjs} +17 -17
  18. package/dist/{ConnectedStreamedWordArtifact-6MCLJRIT.cjs.map → ConnectedStreamedWordArtifact-FFOQJBOI.cjs.map} +1 -1
  19. package/dist/{DocumentReviewCard-BPIAJJED.cjs → DocumentReviewCard-SNWVEZ7S.cjs} +17 -16
  20. package/dist/DocumentReviewCard-SNWVEZ7S.cjs.map +1 -0
  21. package/dist/{FilesViewerDialog-67WK3TZC.cjs → FilesViewerDialog-IZI63FOV.cjs} +52 -45
  22. package/dist/FilesViewerDialog-IZI63FOV.cjs.map +1 -0
  23. package/dist/{GridViewImpl-ZMJJWTOM.cjs → GridViewImpl-LTYET77Q.cjs} +3 -3
  24. package/dist/GridViewImpl-LTYET77Q.cjs.map +1 -0
  25. package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-TEIRB6VJ.cjs} +11 -10
  26. package/dist/WorkspaceTableView-TEIRB6VJ.cjs.map +1 -0
  27. package/dist/agents/index.cjs +297 -297
  28. package/dist/{ai-IM4A23YT.cjs → ai-KBYNRNZ6.cjs} +28 -26
  29. package/dist/ai-KBYNRNZ6.cjs.map +1 -0
  30. package/dist/calls/connected/CallControls.d.ts +2 -0
  31. package/dist/calls/connected/CallControls.js +71 -9
  32. package/dist/calls/connected/CallControls.js.map +2 -2
  33. package/dist/calls/connected/ShareDocumentDialog.d.ts +14 -0
  34. package/dist/calls/connected/ShareDocumentDialog.js +77 -0
  35. package/dist/calls/connected/ShareDocumentDialog.js.map +7 -0
  36. package/dist/calls/index.cjs +121 -121
  37. package/dist/chat/index.cjs +9 -8
  38. package/dist/{chunk-T23UTIRI.cjs → chunk-2PZT3J34.cjs} +6 -6
  39. package/dist/{chunk-T23UTIRI.cjs.map → chunk-2PZT3J34.cjs.map} +1 -1
  40. package/dist/{chunk-SGYSDABK.cjs → chunk-2W5E62EY.cjs} +6 -6
  41. package/dist/{chunk-SGYSDABK.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
  42. package/dist/{chunk-TDO5UWXF.cjs → chunk-3SCNXNHI.cjs} +5 -5
  43. package/dist/{chunk-TDO5UWXF.cjs.map → chunk-3SCNXNHI.cjs.map} +1 -1
  44. package/dist/{chunk-KTQOGT2L.cjs → chunk-474GPLCM.cjs} +7 -7
  45. package/dist/{chunk-KTQOGT2L.cjs.map → chunk-474GPLCM.cjs.map} +1 -1
  46. package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
  47. package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
  48. package/dist/{chunk-NY3YUCOW.cjs → chunk-4NPCDS2X.cjs} +3 -3
  49. package/dist/{chunk-NY3YUCOW.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
  50. package/dist/{chunk-HA66DHW6.cjs → chunk-4RBQ44RY.cjs} +28 -28
  51. package/dist/chunk-4RBQ44RY.cjs.map +1 -0
  52. package/dist/{chunk-BQ5RIWWT.cjs → chunk-4VZZWYEC.cjs} +3 -3
  53. package/dist/{chunk-BQ5RIWWT.cjs.map → chunk-4VZZWYEC.cjs.map} +1 -1
  54. package/dist/{chunk-BP3IJ34D.cjs → chunk-52KGMAO5.cjs} +15 -15
  55. package/dist/{chunk-BP3IJ34D.cjs.map → chunk-52KGMAO5.cjs.map} +1 -1
  56. package/dist/{chunk-5IZFSAEZ.cjs → chunk-5534FYXP.cjs} +4 -4
  57. package/dist/{chunk-5IZFSAEZ.cjs.map → chunk-5534FYXP.cjs.map} +1 -1
  58. package/dist/chunk-5GCCUXMT.cjs +63 -0
  59. package/dist/chunk-5GCCUXMT.cjs.map +1 -0
  60. package/dist/chunk-5LTIZ44D.cjs +95 -0
  61. package/dist/chunk-5LTIZ44D.cjs.map +1 -0
  62. package/dist/{chunk-DFBDQKGE.cjs → chunk-734NPQNR.cjs} +4 -4
  63. package/dist/{chunk-DFBDQKGE.cjs.map → chunk-734NPQNR.cjs.map} +1 -1
  64. package/dist/{chunk-X36UR4A7.cjs → chunk-7VUJGHMY.cjs} +323 -96
  65. package/dist/chunk-7VUJGHMY.cjs.map +1 -0
  66. package/dist/chunk-AFQTQC7A.cjs +35 -0
  67. package/dist/chunk-AFQTQC7A.cjs.map +1 -0
  68. package/dist/{chunk-YYSBWMDJ.cjs → chunk-AY6EZSZB.cjs} +4 -4
  69. package/dist/{chunk-YYSBWMDJ.cjs.map → chunk-AY6EZSZB.cjs.map} +1 -1
  70. package/dist/{chunk-BUVIBHFU.cjs → chunk-BVAT4EVC.cjs} +38 -38
  71. package/dist/chunk-BVAT4EVC.cjs.map +1 -0
  72. package/dist/{chunk-ECLUFKYR.cjs → chunk-C2OICDMI.cjs} +10 -10
  73. package/dist/{chunk-ECLUFKYR.cjs.map → chunk-C2OICDMI.cjs.map} +1 -1
  74. package/dist/{chunk-CPR6EHG7.cjs → chunk-DR2AH7JL.cjs} +179 -55
  75. package/dist/chunk-DR2AH7JL.cjs.map +1 -0
  76. package/dist/{chunk-NJCK6V6U.cjs → chunk-EATIFPKP.cjs} +4 -60
  77. package/dist/chunk-EATIFPKP.cjs.map +1 -0
  78. package/dist/{chunk-B3LZITVF.cjs → chunk-EHP6OH5D.cjs} +11 -451
  79. package/dist/chunk-EHP6OH5D.cjs.map +1 -0
  80. package/dist/{chunk-775S43W7.cjs → chunk-ENGL7P3I.cjs} +31 -31
  81. package/dist/{chunk-775S43W7.cjs.map → chunk-ENGL7P3I.cjs.map} +1 -1
  82. package/dist/{chunk-VZCPMXWC.cjs → chunk-FKFQCK3C.cjs} +4 -4
  83. package/dist/{chunk-VZCPMXWC.cjs.map → chunk-FKFQCK3C.cjs.map} +1 -1
  84. package/dist/{chunk-6UTKM5AB.cjs → chunk-GKVE5JGB.cjs} +76 -76
  85. package/dist/chunk-GKVE5JGB.cjs.map +1 -0
  86. package/dist/{chunk-Q6CLWOP2.cjs → chunk-GPX5VC57.cjs} +50 -50
  87. package/dist/{chunk-Q6CLWOP2.cjs.map → chunk-GPX5VC57.cjs.map} +1 -1
  88. package/dist/{chunk-WAV762GP.cjs → chunk-GQXPNIRE.cjs} +6 -6
  89. package/dist/{chunk-WAV762GP.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
  90. package/dist/chunk-GX2EBMJW.cjs +133 -0
  91. package/dist/chunk-GX2EBMJW.cjs.map +1 -0
  92. package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
  93. package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
  94. package/dist/chunk-HYUKPHCT.cjs +66 -0
  95. package/dist/chunk-HYUKPHCT.cjs.map +1 -0
  96. package/dist/{chunk-NLSWDP42.cjs → chunk-JQLWKNJO.cjs} +22 -12
  97. package/dist/chunk-JQLWKNJO.cjs.map +1 -0
  98. package/dist/{chunk-CKCG4NDB.cjs → chunk-JZEYHDWJ.cjs} +75 -75
  99. package/dist/{chunk-CKCG4NDB.cjs.map → chunk-JZEYHDWJ.cjs.map} +1 -1
  100. package/dist/{chunk-PGJYD67F.cjs → chunk-KNGZZC4O.cjs} +7 -6
  101. package/dist/chunk-KNGZZC4O.cjs.map +1 -0
  102. package/dist/{chunk-W6INT5GS.cjs → chunk-KP5AITQ4.cjs} +10 -10
  103. package/dist/{chunk-W6INT5GS.cjs.map → chunk-KP5AITQ4.cjs.map} +1 -1
  104. package/dist/{chunk-YYPZOEED.cjs → chunk-LHWOKOMP.cjs} +23 -2
  105. package/dist/chunk-LHWOKOMP.cjs.map +1 -0
  106. package/dist/{chunk-WXUU3COI.cjs → chunk-MZ2KZXNU.cjs} +3 -3
  107. package/dist/{chunk-WXUU3COI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
  108. package/dist/chunk-NAJN32MF.cjs +154 -0
  109. package/dist/chunk-NAJN32MF.cjs.map +1 -0
  110. package/dist/{chunk-557MJ4IH.cjs → chunk-NLOETJCB.cjs} +17 -154
  111. package/dist/chunk-NLOETJCB.cjs.map +1 -0
  112. package/dist/{chunk-4XJEHKVZ.cjs → chunk-PIYYBPHH.cjs} +4 -4
  113. package/dist/{chunk-4XJEHKVZ.cjs.map → chunk-PIYYBPHH.cjs.map} +1 -1
  114. package/dist/chunk-Q3XJUXID.cjs +4774 -0
  115. package/dist/chunk-Q3XJUXID.cjs.map +1 -0
  116. package/dist/{chunk-325GVZE6.cjs → chunk-Q6DQGGP4.cjs} +3 -3
  117. package/dist/{chunk-325GVZE6.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
  118. package/dist/chunk-QFXILJMJ.cjs +458 -0
  119. package/dist/chunk-QFXILJMJ.cjs.map +1 -0
  120. package/dist/{chunk-QQWHG3KF.cjs → chunk-RYVZDFVO.cjs} +5 -5
  121. package/dist/{chunk-QQWHG3KF.cjs.map → chunk-RYVZDFVO.cjs.map} +1 -1
  122. package/dist/{chunk-EOG6OT5I.cjs → chunk-TXP2N3DC.cjs} +4 -4
  123. package/dist/{chunk-EOG6OT5I.cjs.map → chunk-TXP2N3DC.cjs.map} +1 -1
  124. package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
  125. package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
  126. package/dist/chunk-VJ5ZLRBD.cjs +27 -0
  127. package/dist/chunk-VJ5ZLRBD.cjs.map +1 -0
  128. package/dist/{chunk-3GWWOYGS.cjs → chunk-W6B3RYTX.cjs} +4 -4
  129. package/dist/{chunk-3GWWOYGS.cjs.map → chunk-W6B3RYTX.cjs.map} +1 -1
  130. package/dist/chunk-WOOOMTTA.cjs +19 -0
  131. package/dist/chunk-WOOOMTTA.cjs.map +1 -0
  132. package/dist/{chunk-CJYWHUZR.cjs → chunk-XCKHOXRP.cjs} +4 -4
  133. package/dist/{chunk-CJYWHUZR.cjs.map → chunk-XCKHOXRP.cjs.map} +1 -1
  134. package/dist/{chunk-6WMMZLEV.cjs → chunk-XJEXFEWG.cjs} +2 -27
  135. package/dist/chunk-XJEXFEWG.cjs.map +1 -0
  136. package/dist/chunk-XK4TVJKD.cjs +73 -0
  137. package/dist/chunk-XK4TVJKD.cjs.map +1 -0
  138. package/dist/chunk-XTR26TNE.cjs +1358 -0
  139. package/dist/chunk-XTR26TNE.cjs.map +1 -0
  140. package/dist/{chunk-E7TE2WVT.cjs → chunk-ZVEW3JBT.cjs} +3 -3
  141. package/dist/{chunk-E7TE2WVT.cjs.map → chunk-ZVEW3JBT.cjs.map} +1 -1
  142. package/dist/collaboration/index.cjs +70 -70
  143. package/dist/components/ZoomSlider.d.ts +25 -0
  144. package/dist/components/ZoomSlider.js +59 -0
  145. package/dist/components/ZoomSlider.js.map +7 -0
  146. package/dist/connect/docx.cjs +20 -20
  147. package/dist/connect/index.cjs +1150 -1232
  148. package/dist/connect/index.cjs.map +1 -1
  149. package/dist/connect/viewer.cjs +40 -34
  150. package/dist/connection/ai.d.ts +1 -1
  151. package/dist/connection/files/ConnectedNewFileMenu.d.ts +2 -1
  152. package/dist/connection/files/ConnectedNewFileMenu.js +9 -3
  153. package/dist/connection/files/ConnectedNewFileMenu.js.map +2 -2
  154. package/dist/connection/files/explorer/ConnectedFilesExplorer.js +1 -1
  155. package/dist/connection/files/explorer/ConnectedFilesExplorer.js.map +2 -2
  156. package/dist/connection/files/explorer/FileTiles.js +1 -1
  157. package/dist/connection/files/explorer/FileTiles.js.map +2 -2
  158. package/dist/connection/files/fields/documentField.js +1 -1
  159. package/dist/connection/files/fields/documentField.js.map +2 -2
  160. package/dist/connection/files/grid/documentColumns.js +1 -1
  161. package/dist/connection/files/grid/documentColumns.js.map +2 -2
  162. package/dist/connection/files/page/DocumentsFilterBarActions.js +17 -28
  163. package/dist/connection/files/page/DocumentsFilterBarActions.js.map +2 -2
  164. package/dist/connection/mail/useMailboxDefaults.js +1 -1
  165. package/dist/connection/mail/useMailboxDefaults.js.map +2 -2
  166. package/dist/connection/panels/useSessionPanelMode.js +3 -2
  167. package/dist/connection/panels/useSessionPanelMode.js.map +2 -2
  168. package/dist/connection/presentation/ClippingMediaViewer.d.ts +12 -0
  169. package/dist/connection/presentation/ClippingMediaViewer.js +153 -0
  170. package/dist/connection/presentation/ClippingMediaViewer.js.map +7 -0
  171. package/dist/connection/presentation/ClippingPdfViewer.d.ts +22 -0
  172. package/dist/connection/presentation/ClippingPdfViewer.js +75 -0
  173. package/dist/connection/presentation/ClippingPdfViewer.js.map +7 -0
  174. package/dist/connection/presentation/ConnectedPresentation.d.ts +12 -0
  175. package/dist/connection/presentation/ConnectedPresentation.js +100 -0
  176. package/dist/connection/presentation/ConnectedPresentation.js.map +7 -0
  177. package/dist/connection/presentation/ConnectedSlidesTab.d.ts +20 -0
  178. package/dist/connection/presentation/ConnectedSlidesTab.js +220 -0
  179. package/dist/connection/presentation/ConnectedSlidesTab.js.map +7 -0
  180. package/dist/connection/presentation/CropClipDialog.d.ts +11 -0
  181. package/dist/connection/presentation/CropClipDialog.js +86 -0
  182. package/dist/connection/presentation/CropClipDialog.js.map +7 -0
  183. package/dist/connection/presentation/GenerateTile.d.ts +4 -0
  184. package/dist/connection/presentation/GenerateTile.js +24 -0
  185. package/dist/connection/presentation/GenerateTile.js.map +7 -0
  186. package/dist/connection/presentation/LabelColumnMenu.d.ts +8 -0
  187. package/dist/connection/presentation/LabelColumnMenu.js +38 -0
  188. package/dist/connection/presentation/LabelColumnMenu.js.map +7 -0
  189. package/dist/connection/presentation/PresentationDialogs.d.ts +39 -0
  190. package/dist/connection/presentation/PresentationDialogs.js +295 -0
  191. package/dist/connection/presentation/PresentationDialogs.js.map +7 -0
  192. package/dist/connection/presentation/PresentationFileCard.d.ts +10 -0
  193. package/dist/connection/presentation/PresentationFileCard.js +35 -0
  194. package/dist/connection/presentation/PresentationFileCard.js.map +7 -0
  195. package/dist/connection/presentation/PresentationPill.d.ts +8 -0
  196. package/dist/connection/presentation/PresentationPill.js +44 -0
  197. package/dist/connection/presentation/PresentationPill.js.map +7 -0
  198. package/dist/connection/presentation/PresentationSlot.d.ts +7 -0
  199. package/dist/connection/presentation/PresentationSlot.js +35 -0
  200. package/dist/connection/presentation/PresentationSlot.js.map +7 -0
  201. package/dist/connection/presentation/requests.d.ts +16 -0
  202. package/dist/connection/presentation/requests.js +20 -0
  203. package/dist/connection/presentation/requests.js.map +7 -0
  204. package/dist/connection/presentation/useImageGeneration.d.ts +11 -0
  205. package/dist/connection/presentation/useImageGeneration.js +66 -0
  206. package/dist/connection/presentation/useImageGeneration.js.map +7 -0
  207. package/dist/connection/presentation/useLabelColumns.d.ts +15 -0
  208. package/dist/connection/presentation/useLabelColumns.js +33 -0
  209. package/dist/connection/presentation/useLabelColumns.js.map +7 -0
  210. package/dist/connection/presentation/usePresentationController.d.ts +15 -0
  211. package/dist/connection/presentation/usePresentationController.js +118 -0
  212. package/dist/connection/presentation/usePresentationController.js.map +7 -0
  213. package/dist/connection/presentation/usePresentationFiles.d.ts +44 -0
  214. package/dist/connection/presentation/usePresentationFiles.js +307 -0
  215. package/dist/connection/presentation/usePresentationFiles.js.map +7 -0
  216. package/dist/connection/presentation/useViewerClipping.d.ts +14 -0
  217. package/dist/connection/presentation/useViewerClipping.js +18 -0
  218. package/dist/connection/presentation/useViewerClipping.js.map +7 -0
  219. package/dist/connection/shell/ConnectedAppShell.js +5 -1
  220. package/dist/connection/shell/ConnectedAppShell.js.map +2 -2
  221. package/dist/connection/viewer/CleanViewControl.d.ts +8 -0
  222. package/dist/connection/viewer/CleanViewControl.js +76 -0
  223. package/dist/connection/viewer/CleanViewControl.js.map +7 -0
  224. package/dist/connection/viewer/ConnectedDocumentViewer.js +28 -29
  225. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  226. package/dist/connection/viewer/ViewerCropModal.d.ts +5 -0
  227. package/dist/connection/viewer/ViewerCropModal.js +22 -0
  228. package/dist/connection/viewer/ViewerCropModal.js.map +7 -0
  229. package/dist/connection/viewer/ViewerPdfPane.d.ts +3 -1
  230. package/dist/connection/viewer/ViewerPdfPane.js +37 -0
  231. package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
  232. package/dist/connection/viewer/drafts.js +6 -4
  233. package/dist/connection/viewer/drafts.js.map +2 -2
  234. package/dist/connection/viewer/shareDocument.d.ts +11 -0
  235. package/dist/connection/viewer/shareDocument.js +11 -0
  236. package/dist/connection/viewer/shareDocument.js.map +7 -0
  237. package/dist/connection/viewer/slidesTabChunk.d.ts +2 -0
  238. package/dist/connection/viewer/slidesTabChunk.js +9 -0
  239. package/dist/connection/viewer/slidesTabChunk.js.map +7 -0
  240. package/dist/connection/viewer/useCleanView.d.ts +14 -0
  241. package/dist/connection/viewer/useCleanView.js +29 -0
  242. package/dist/connection/viewer/useCleanView.js.map +7 -0
  243. package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
  244. package/dist/connection/viewer/useViewedDocument.js +9 -1
  245. package/dist/connection/viewer/useViewedDocument.js.map +2 -2
  246. package/dist/connection/viewer/useViewerTabs.js +18 -4
  247. package/dist/connection/viewer/useViewerTabs.js.map +2 -2
  248. package/dist/connection/workflows/ConnectedWorkflowStart.d.ts +14 -2
  249. package/dist/connection/workflows/ConnectedWorkflowStart.js +5 -2
  250. package/dist/connection/workflows/ConnectedWorkflowStart.js.map +2 -2
  251. package/dist/dashboards/index.cjs +1 -1
  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 +41 -39
  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 +225 -225
  267. package/dist/files/navigator/DocumentSearchList.js +1 -1
  268. package/dist/files/navigator/DocumentSearchList.js.map +2 -2
  269. package/dist/index.cjs +1666 -1664
  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/PresentationStage.d.ts +32 -0
  302. package/dist/presentation/PresentationStage.js +232 -0
  303. package/dist/presentation/PresentationStage.js.map +7 -0
  304. package/dist/presentation/PresenterView.d.ts +16 -0
  305. package/dist/presentation/PresenterView.js +69 -0
  306. package/dist/presentation/PresenterView.js.map +7 -0
  307. package/dist/presentation/SlideDecor.d.ts +25 -0
  308. package/dist/presentation/SlideDecor.js +189 -0
  309. package/dist/presentation/SlideDecor.js.map +7 -0
  310. package/dist/presentation/SlidesEditor.d.ts +25 -0
  311. package/dist/presentation/SlidesEditor.js +359 -0
  312. package/dist/presentation/SlidesEditor.js.map +7 -0
  313. package/dist/presentation/StageBox.d.ts +30 -0
  314. package/dist/presentation/StageBox.js +281 -0
  315. package/dist/presentation/StageBox.js.map +7 -0
  316. package/dist/presentation/StageItem.d.ts +37 -0
  317. package/dist/presentation/StageItem.js +211 -0
  318. package/dist/presentation/StageItem.js.map +7 -0
  319. package/dist/presentation/box-style.d.ts +6 -0
  320. package/dist/presentation/box-style.js +19 -0
  321. package/dist/presentation/box-style.js.map +7 -0
  322. package/dist/presentation/boxes.d.ts +105 -0
  323. package/dist/presentation/boxes.js +103 -0
  324. package/dist/presentation/boxes.js.map +7 -0
  325. package/dist/presentation/draw-boxes.d.ts +8 -0
  326. package/dist/presentation/draw-boxes.js +130 -0
  327. package/dist/presentation/draw-boxes.js.map +7 -0
  328. package/dist/presentation/export-boxes.d.ts +10 -0
  329. package/dist/presentation/export-boxes.js +74 -0
  330. package/dist/presentation/export-boxes.js.map +7 -0
  331. package/dist/presentation/export-pptx.d.ts +16 -0
  332. package/dist/presentation/export-pptx.js +194 -0
  333. package/dist/presentation/export-pptx.js.map +7 -0
  334. package/dist/presentation/import-pptx.d.ts +35 -0
  335. package/dist/presentation/import-pptx.js +659 -0
  336. package/dist/presentation/import-pptx.js.map +7 -0
  337. package/dist/presentation/merge-outside-edits.d.ts +12 -0
  338. package/dist/presentation/merge-outside-edits.js +35 -0
  339. package/dist/presentation/merge-outside-edits.js.map +7 -0
  340. package/dist/presentation/model.d.ts +201 -0
  341. package/dist/presentation/model.js +271 -0
  342. package/dist/presentation/model.js.map +7 -0
  343. package/dist/presentation/panel-id.d.ts +34 -0
  344. package/dist/presentation/panel-id.js +24 -0
  345. package/dist/presentation/panel-id.js.map +7 -0
  346. package/dist/presentation/persistence.d.ts +121 -0
  347. package/dist/presentation/persistence.js +141 -0
  348. package/dist/presentation/persistence.js.map +7 -0
  349. package/dist/presentation/pptx-data.d.ts +22 -0
  350. package/dist/presentation/pptx-data.js +83 -0
  351. package/dist/presentation/pptx-data.js.map +7 -0
  352. package/dist/presentation/pptx-xml.d.ts +90 -0
  353. package/dist/presentation/pptx-xml.js +333 -0
  354. package/dist/presentation/pptx-xml.js.map +7 -0
  355. package/dist/presentation/render-slides.d.ts +58 -0
  356. package/dist/presentation/render-slides.js +309 -0
  357. package/dist/presentation/render-slides.js.map +7 -0
  358. package/dist/presentation/saved-boxes.d.ts +11 -0
  359. package/dist/presentation/saved-boxes.js +80 -0
  360. package/dist/presentation/saved-boxes.js.map +7 -0
  361. package/dist/presentation/slide-layout.d.ts +54 -0
  362. package/dist/presentation/slide-layout.js +117 -0
  363. package/dist/presentation/slide-layout.js.map +7 -0
  364. package/dist/presentation/stage-videos.d.ts +5 -0
  365. package/dist/presentation/stage-videos.js +19 -0
  366. package/dist/presentation/stage-videos.js.map +7 -0
  367. package/dist/presentation/store.d.ts +203 -0
  368. package/dist/presentation/store.js +429 -0
  369. package/dist/presentation/store.js.map +7 -0
  370. package/dist/presentation/theme.d.ts +102 -0
  371. package/dist/presentation/theme.js +276 -0
  372. package/dist/presentation/theme.js.map +7 -0
  373. package/dist/presentation/useClipDrag.d.ts +26 -0
  374. package/dist/presentation/useClipDrag.js +65 -0
  375. package/dist/presentation/useClipDrag.js.map +7 -0
  376. package/dist/presentation/useObjectUrl.d.ts +6 -0
  377. package/dist/presentation/useObjectUrl.js +15 -0
  378. package/dist/presentation/useObjectUrl.js.map +7 -0
  379. package/dist/presentation/usePresenterKeys.d.ts +13 -0
  380. package/dist/presentation/usePresenterKeys.js +62 -0
  381. package/dist/presentation/usePresenterKeys.js.map +7 -0
  382. package/dist/settings/index.cjs +151 -150
  383. package/dist/shell/PanelPortal.js +1 -0
  384. package/dist/shell/PanelPortal.js.map +2 -2
  385. package/dist/shell/index.cjs +112 -110
  386. package/dist/shell/panel-windows.d.ts +2 -0
  387. package/dist/shell/panel-windows.js +7 -2
  388. package/dist/shell/panel-windows.js.map +2 -2
  389. package/dist/studio/index.cjs +28 -26
  390. package/dist/studio/index.cjs.map +1 -1
  391. package/dist/styles.css +1 -1
  392. package/dist/workflow-canvas/index.cjs +55 -54
  393. package/dist/workflow-canvas/index.cjs.map +1 -1
  394. package/node_modules/@arbidocs/coedit/package.json +1 -1
  395. package/package.json +6 -5
  396. package/dist/ConnectedCallDock-WER7R222.cjs.map +0 -1
  397. package/dist/DocumentReviewCard-BPIAJJED.cjs.map +0 -1
  398. package/dist/FilesViewerDialog-67WK3TZC.cjs.map +0 -1
  399. package/dist/GridViewImpl-ZMJJWTOM.cjs.map +0 -1
  400. package/dist/WorkspaceTableView-J3C6VH4T.cjs.map +0 -1
  401. package/dist/ai-IM4A23YT.cjs.map +0 -1
  402. package/dist/chunk-557MJ4IH.cjs.map +0 -1
  403. package/dist/chunk-6UTKM5AB.cjs.map +0 -1
  404. package/dist/chunk-6WMMZLEV.cjs.map +0 -1
  405. package/dist/chunk-B3LZITVF.cjs.map +0 -1
  406. package/dist/chunk-BUVIBHFU.cjs.map +0 -1
  407. package/dist/chunk-CPR6EHG7.cjs.map +0 -1
  408. package/dist/chunk-HA66DHW6.cjs.map +0 -1
  409. package/dist/chunk-NJCK6V6U.cjs.map +0 -1
  410. package/dist/chunk-NLSWDP42.cjs.map +0 -1
  411. package/dist/chunk-PGJYD67F.cjs.map +0 -1
  412. package/dist/chunk-X36UR4A7.cjs.map +0 -1
  413. package/dist/chunk-YYPZOEED.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/OpenConversationButton.tsx","../src/nav/actions.ts","../src/nav/manifest.ts"],"names":["hrefFor","useBlocksEnvironment","jsxs","ActionLink","cn","buttonVariants","jsx","MessagesSquare","createElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBO,SAAS,sBAAA,CAAuB;AAAA,EACrC,cAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA,GAAQ,gBAAA;AAAA,EACR,SAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,EAAE,OAAA,EAAAA,QAAAA,EAAS,gBAAA,KAAqBC,sCAAA,EAAqB;AAC3D,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAC5B,EAAA,uBACEC,eAAA;AAAA,IAACC,4BAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAMH,SAAQ,EAAE,IAAA,EAAM,gBAAgB,cAAA,EAAgB,WAAA,EAAa,WAAW,CAAA;AAAA,MAC9E,QAAA,EAAU,MACR,gBAAA,CAAiB,cAAA,EAAgB;AAAA,QAC/B,GAAI,SAAA,IAAa,EAAE,SAAA,EAAU;AAAA,QAC7B,GAAI,WAAA,IAAe,EAAE,WAAA;AAAY,OAClC,CAAA;AAAA,MAEH,SAAA,EAAWI,KAAA,CAAGC,iBAAA,CAAe,EAAE,OAAA,EAAS,WAAW,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA;AAAA,MAC3E,aAAA,EAAa,MAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAACC,0BAAA,EAAA,EAAe,SAAA,EAAU,UAAA,EAAW,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,QAChD;AAAA;AAAA;AAAA,GACH;AAEJ;;;ACbO,SAAS,aAAA,CACd,OAAA,EACA,OAAA,GAAuE,EAAC,EACxE;AACA,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AAChD,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA,EAAU,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAe,GAAA,CAAI,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,QAAA,EAAS,MAAO;AAAA,MAC9E,KAAA,EAAO,EAAA;AAAA,MACP,KAAA;AAAA,MACA;AAAA,KACF,CAAE,CAAA;AAAA,IACF,WAAW,KAAA,EAA4B;AACrC,MAAA,OAAO,MAAA,CAAO,IAAI,KAAK,CAAA,IAAK,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAAA,IACjF,CAAA;AAAA,IACA,IAAI,EAAA,EAAc;AAChB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,SAAS,EAAE,CAAA,GAAI,OAAA,CAAQ,EAAE,CAAA,GAAI,MAAA;AACjF,MAAA,IAAI,MAAA,SAAe,GAAA,EAAI;AAAA,WAClB,OAAA,CAAQ,YAAY,EAAE,CAAA;AAAA,IAC7B;AAAA,GACF;AACF;ACjDO,SAAS,iBAAiB,QAAA,EAAoC;AACnE,EAAA,MAAM,QAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY,QAAQ,KAAK,CAAA;AACzD,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAQ,OAAA,EAIM;AACZ,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC1B,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAMC,mBAAA,CAAc,IAAA,CAAK,MAAM,EAAE,SAAA,EAAW,UAAU,CAAA;AAAA,QACtD,GAAG,OAAA,CAAQ,SAAA,GAAY,IAAI,CAAA;AAAA,QAC3B,UAAU,MAAM;AACd,UAAA,OAAA,CAAQ,cAAA,IAAiB;AACzB,UAAA,OAAA,CAAQ,WAAW,IAAI,CAAA;AAAA,QACzB;AAAA,OACF,CAAE,CAAA;AAAA,IACJ;AAAA,GACF;AACF","file":"index.cjs","sourcesContent":["import { MessagesSquare } from 'lucide-react'\nimport { buttonVariants, cn } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport { ActionLink } from './ActionLink'\n\nexport interface OpenConversationButtonProps {\n /** The conversation behind an AI result; none: nothing is rendered. */\n conversationId: string | null | undefined\n /** The workspace it is in, for its link. */\n workspaceId?: string | null\n /** A message to scroll to. */\n messageId?: string\n /** Default \"Open in thread\". */\n label?: string\n className?: string\n testId?: string\n}\n\n/**\n * \"Open in thread\": the full conversation behind an AI result (a brief, a translation, a draft),\n * to check its sources and follow up. A real link where the host gives one (`hrefFor`), opened with\n * `openConversation`.\n */\nexport function OpenConversationButton({\n conversationId,\n workspaceId,\n messageId,\n label = 'Open in thread',\n className,\n testId,\n}: OpenConversationButtonProps) {\n const { hrefFor, openConversation } = useBlocksEnvironment()\n if (!conversationId) return null\n return (\n <ActionLink\n href={hrefFor({ kind: 'conversation', conversationId, workspaceId, messageId })}\n onSelect={() =>\n openConversation(conversationId, {\n ...(messageId && { messageId }),\n ...(workspaceId && { workspaceId }),\n })\n }\n className={cn(buttonVariants({ variant: 'outline', size: 'sm' }), className)}\n data-testid={testId}\n >\n <MessagesSquare className=\"size-3.5\" aria-hidden />\n {label}\n </ActionLink>\n )\n}\n","import type { ArbiFeature } from '@arbidocs/react'\n\n/** Who is asking, for an action's `available` (the same gates the primary UI applies). */\nexport interface ActionContext {\n /** The open workspace; `null` outside one. */\n workspaceId: string | null\n /** The viewer is a member of the open workspace. */\n isMember: boolean\n /** The viewer's role there (`owner`, `collaborator`, `guest`); `null` when not a member. */\n role: string | null\n /** A temporary-access (external) account. */\n isTemporaryAccess: boolean\n /** Whether the account may create projects; `undefined` until known. */\n canCreateProjects: boolean | undefined\n isFeatureOn: (feature: ArbiFeature) => boolean\n}\n\n/** A parameter-light action, supplied by a host and usable outside React. */\nexport interface ActionDefinition<Id extends string = string> {\n id: Id\n label: string\n category: string\n /**\n * An icon name, so the catalogue stays independent of a renderer. The palette draws the lucide\n * icons its catalogue names (`connection/command/icons.ts`); any other name, a generic glyph.\n */\n icon: string\n keywords?: readonly string[]\n /** Offered (in the command palette) only when it says so. Dispatch is not gated. */\n available?: (context: ActionContext) => boolean\n /** `false`: dispatch only, never listed (a second name for another row's effect). */\n listed?: boolean\n run: () => void\n}\n\n/** One catalogue for picker options, tip CTAs, palettes and validated remote dispatch. */\nexport function defineActions<Id extends string, Action extends ActionDefinition<Id>>(\n actions: Partial<Record<Id, Action>>,\n options: { scopedIds?: readonly Id[]; onUnknown?: (id: Id) => void } = {}\n) {\n const scoped = new Set<string>(options.scopedIds)\n return {\n actions,\n options: (Object.values(actions) as Action[]).map(({ id, label, category }) => ({\n value: id,\n label,\n category,\n })),\n isActionId(value: string): value is Id {\n return scoped.has(value) || Object.prototype.hasOwnProperty.call(actions, value)\n },\n run(id: Id): void {\n const action = Object.prototype.hasOwnProperty.call(actions, id) ? actions[id] : undefined\n if (action) action.run()\n else options.onUnknown?.(id)\n },\n }\n}\n","import { createElement } from 'react'\nimport type { AppNavItem, AppNavSection } from './types'\nimport type { NavItem } from '../shell/types'\n\n/**\n * A host's destinations, once: the items are also the command palette's nav contract. Resolve\n * their state and handlers for ShellSidebar or MobileTabBar without copying the catalogue.\n */\nexport function defineNavigation(sections: readonly AppNavSection[]) {\n const items = sections.flatMap((section) => section.items)\n return {\n sections,\n items,\n resolve(options: {\n beforeNavigate?: () => void\n onNavigate: (item: AppNavItem) => void\n itemProps?: (item: AppNavItem) => Partial<Omit<NavItem, 'id' | 'label' | 'onSelect'>>\n }): NavItem[] {\n return items.map((item) => ({\n id: item.id,\n label: item.label,\n icon: createElement(item.icon, { className: 'size-5' }),\n ...options.itemProps?.(item),\n onSelect: () => {\n options.beforeNavigate?.()\n options.onNavigate(item)\n },\n }))\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/components/OpenConversationButton.tsx","../src/nav/actions.ts","../src/nav/manifest.ts"],"names":["hrefFor","useBlocksEnvironment","jsxs","ActionLink","cn","buttonVariants","jsx","MessagesSquare","createElement"],"mappings":"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","file":"index.cjs","sourcesContent":["import { MessagesSquare } from 'lucide-react'\nimport { buttonVariants, cn } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport { ActionLink } from './ActionLink'\n\nexport interface OpenConversationButtonProps {\n /** The conversation behind an AI result; none: nothing is rendered. */\n conversationId: string | null | undefined\n /** The workspace it is in, for its link. */\n workspaceId?: string | null\n /** A message to scroll to. */\n messageId?: string\n /** Default \"Open in thread\". */\n label?: string\n className?: string\n testId?: string\n}\n\n/**\n * \"Open in thread\": the full conversation behind an AI result (a brief, a translation, a draft),\n * to check its sources and follow up. A real link where the host gives one (`hrefFor`), opened with\n * `openConversation`.\n */\nexport function OpenConversationButton({\n conversationId,\n workspaceId,\n messageId,\n label = 'Open in thread',\n className,\n testId,\n}: OpenConversationButtonProps) {\n const { hrefFor, openConversation } = useBlocksEnvironment()\n if (!conversationId) return null\n return (\n <ActionLink\n href={hrefFor({ kind: 'conversation', conversationId, workspaceId, messageId })}\n onSelect={() =>\n openConversation(conversationId, {\n ...(messageId && { messageId }),\n ...(workspaceId && { workspaceId }),\n })\n }\n className={cn(buttonVariants({ variant: 'outline', size: 'sm' }), className)}\n data-testid={testId}\n >\n <MessagesSquare className=\"size-3.5\" aria-hidden />\n {label}\n </ActionLink>\n )\n}\n","import type { ArbiFeature } from '@arbidocs/react'\n\n/** Who is asking, for an action's `available` (the same gates the primary UI applies). */\nexport interface ActionContext {\n /** The open workspace; `null` outside one. */\n workspaceId: string | null\n /** The viewer is a member of the open workspace. */\n isMember: boolean\n /** The viewer's role there (`owner`, `collaborator`, `guest`); `null` when not a member. */\n role: string | null\n /** A temporary-access (external) account. */\n isTemporaryAccess: boolean\n /** Whether the account may create projects; `undefined` until known. */\n canCreateProjects: boolean | undefined\n isFeatureOn: (feature: ArbiFeature) => boolean\n}\n\n/** A parameter-light action, supplied by a host and usable outside React. */\nexport interface ActionDefinition<Id extends string = string> {\n id: Id\n label: string\n category: string\n /**\n * An icon name, so the catalogue stays independent of a renderer. The palette draws the lucide\n * icons its catalogue names (`connection/command/icons.ts`); any other name, a generic glyph.\n */\n icon: string\n keywords?: readonly string[]\n /** Offered (in the command palette) only when it says so. Dispatch is not gated. */\n available?: (context: ActionContext) => boolean\n /** `false`: dispatch only, never listed (a second name for another row's effect). */\n listed?: boolean\n run: () => void\n}\n\n/** One catalogue for picker options, tip CTAs, palettes and validated remote dispatch. */\nexport function defineActions<Id extends string, Action extends ActionDefinition<Id>>(\n actions: Partial<Record<Id, Action>>,\n options: { scopedIds?: readonly Id[]; onUnknown?: (id: Id) => void } = {}\n) {\n const scoped = new Set<string>(options.scopedIds)\n return {\n actions,\n options: (Object.values(actions) as Action[]).map(({ id, label, category }) => ({\n value: id,\n label,\n category,\n })),\n isActionId(value: string): value is Id {\n return scoped.has(value) || Object.prototype.hasOwnProperty.call(actions, value)\n },\n run(id: Id): void {\n const action = Object.prototype.hasOwnProperty.call(actions, id) ? actions[id] : undefined\n if (action) action.run()\n else options.onUnknown?.(id)\n },\n }\n}\n","import { createElement } from 'react'\nimport type { AppNavItem, AppNavSection } from './types'\nimport type { NavItem } from '../shell/types'\n\n/**\n * A host's destinations, once: the items are also the command palette's nav contract. Resolve\n * their state and handlers for ShellSidebar or MobileTabBar without copying the catalogue.\n */\nexport function defineNavigation(sections: readonly AppNavSection[]) {\n const items = sections.flatMap((section) => section.items)\n return {\n sections,\n items,\n resolve(options: {\n beforeNavigate?: () => void\n onNavigate: (item: AppNavItem) => void\n itemProps?: (item: AppNavItem) => Partial<Omit<NavItem, 'id' | 'label' | 'onSelect'>>\n }): NavItem[] {\n return items.map((item) => ({\n id: item.id,\n label: item.label,\n icon: createElement(item.icon, { className: 'size-5' }),\n ...options.itemProps?.(item),\n onSelect: () => {\n options.beforeNavigate?.()\n options.onNavigate(item)\n },\n }))\n },\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The floating bar over a selected text box or shape: its type (smaller, larger, bold, italic, its
3
+ * colour), its alignment, its fill, in front of or behind the clips, delete. Colours are picked with
4
+ * the system's colour picker.
5
+ */
6
+ import { type SlideBox } from './boxes';
7
+ export interface BoxActionBarProps {
8
+ box: SlideBox;
9
+ onRemoved: () => void;
10
+ }
11
+ export declare function BoxActionBar({ box, onRemoved }: BoxActionBarProps): import("react").JSX.Element;
@@ -0,0 +1,182 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ AlignCenter,
5
+ AlignLeft,
6
+ AlignRight,
7
+ AArrowDown,
8
+ AArrowUp,
9
+ Baseline,
10
+ Bold,
11
+ BringToFront,
12
+ Italic,
13
+ PaintBucket,
14
+ SendToBack,
15
+ Trash2
16
+ } from "lucide-react";
17
+ import { cn } from "@arbidocs/react/ui";
18
+ import { ACTION, Action } from "./ClipActionBar.js";
19
+ import { DEFAULT_TEXT_SIZE, firstRun, styleRuns } from "./boxes.js";
20
+ import { usePresentation } from "./store.js";
21
+ import { TEXT_COLORS } from "./theme.js";
22
+ const SIZE_STEPS = [8, 10, 12, 14, 16, 18, 20, 24, 28, 32, 36, 44, 54, 66, 80, 96];
23
+ const nextSize = (size, up) => up ? SIZE_STEPS.find((step) => step > size + 0.5) ?? size : [...SIZE_STEPS].reverse().find((step) => step < size - 0.5) ?? size;
24
+ const ALIGN_NEXT = {
25
+ left: "center",
26
+ center: "right",
27
+ right: "left",
28
+ justify: "left"
29
+ };
30
+ const ALIGN_ICON = {
31
+ left: /* @__PURE__ */ jsx(AlignLeft, { className: "size-4" }),
32
+ center: /* @__PURE__ */ jsx(AlignCenter, { className: "size-4" }),
33
+ right: /* @__PURE__ */ jsx(AlignRight, { className: "size-4" }),
34
+ justify: /* @__PURE__ */ jsx(AlignLeft, { className: "size-4" })
35
+ };
36
+ function ColorAction({
37
+ label,
38
+ value,
39
+ onChange,
40
+ children
41
+ }) {
42
+ return /* @__PURE__ */ jsxs("label", { className: cn(ACTION, "relative cursor-pointer"), title: label, "aria-label": label, children: [
43
+ children,
44
+ /* @__PURE__ */ jsx(
45
+ "span",
46
+ {
47
+ className: "pointer-events-none absolute inset-x-1.5 bottom-0.5 h-0.5 rounded-full",
48
+ style: { background: value }
49
+ }
50
+ ),
51
+ /* @__PURE__ */ jsx(
52
+ "input",
53
+ {
54
+ type: "color",
55
+ value,
56
+ onChange: (event) => onChange(event.target.value),
57
+ className: "absolute inset-0 size-full cursor-pointer opacity-0",
58
+ "aria-label": label
59
+ }
60
+ )
61
+ ] });
62
+ }
63
+ function BoxActionBar({ box, onRemoved }) {
64
+ const actions = usePresentation.getState();
65
+ const run = firstRun(box);
66
+ const size = run?.size ?? DEFAULT_TEXT_SIZE;
67
+ const align = box.paragraphs[0]?.align ?? "left";
68
+ const update = (change) => actions.updateBox(box.id, change);
69
+ const text = box.shape !== "line";
70
+ const top = Math.max(0, box.frame.y);
71
+ return /* @__PURE__ */ jsxs(
72
+ "div",
73
+ {
74
+ role: "toolbar",
75
+ "aria-label": "Text box",
76
+ className: "absolute z-20 flex items-center gap-0.5 rounded-md border border-border bg-background p-0.5 shadow-md",
77
+ style: {
78
+ left: `${Math.min(Math.max(0, box.frame.x), 0.6) * 100}%`,
79
+ top: `calc(${top * 100}% - 40px)`
80
+ },
81
+ onPointerDown: (event) => event.stopPropagation(),
82
+ "data-testid": "box-action-bar",
83
+ children: [
84
+ text && /* @__PURE__ */ jsxs(Fragment, { children: [
85
+ /* @__PURE__ */ jsx(
86
+ Action,
87
+ {
88
+ label: "Smaller",
89
+ onClick: () => update((b) => styleRuns(b, (r) => ({ ...r, size: nextSize(r.size ?? size, false) }))),
90
+ children: /* @__PURE__ */ jsx(AArrowDown, { className: "size-4" })
91
+ }
92
+ ),
93
+ /* @__PURE__ */ jsx(
94
+ "span",
95
+ {
96
+ className: "w-7 text-center text-xs tabular-nums text-muted-foreground",
97
+ "data-testid": "box-text-size",
98
+ children: Math.round(size)
99
+ }
100
+ ),
101
+ /* @__PURE__ */ jsx(
102
+ Action,
103
+ {
104
+ label: "Larger",
105
+ onClick: () => update((b) => styleRuns(b, (r) => ({ ...r, size: nextSize(r.size ?? size, true) }))),
106
+ children: /* @__PURE__ */ jsx(AArrowUp, { className: "size-4" })
107
+ }
108
+ ),
109
+ /* @__PURE__ */ jsx(
110
+ Action,
111
+ {
112
+ label: "Bold",
113
+ onClick: () => update((b) => styleRuns(b, (r) => ({ ...r, bold: !run?.bold }))),
114
+ children: /* @__PURE__ */ jsx(Bold, { className: cn("size-4", run?.bold && "text-primary") })
115
+ }
116
+ ),
117
+ /* @__PURE__ */ jsx(
118
+ Action,
119
+ {
120
+ label: "Italic",
121
+ onClick: () => update((b) => styleRuns(b, (r) => ({ ...r, italic: !run?.italic }))),
122
+ children: /* @__PURE__ */ jsx(Italic, { className: cn("size-4", run?.italic && "text-primary") })
123
+ }
124
+ ),
125
+ /* @__PURE__ */ jsx(
126
+ Action,
127
+ {
128
+ label: "Align",
129
+ onClick: () => update((b) => ({
130
+ ...b,
131
+ paragraphs: b.paragraphs.map((p) => ({ ...p, align: ALIGN_NEXT[align] }))
132
+ })),
133
+ children: ALIGN_ICON[align]
134
+ }
135
+ ),
136
+ /* @__PURE__ */ jsx(
137
+ ColorAction,
138
+ {
139
+ label: "Text colour",
140
+ value: run?.color ?? TEXT_COLORS.body,
141
+ onChange: (color) => update((b) => styleRuns(b, (r) => ({ ...r, color }))),
142
+ children: /* @__PURE__ */ jsx(Baseline, { className: "size-4" })
143
+ }
144
+ )
145
+ ] }),
146
+ /* @__PURE__ */ jsx(
147
+ ColorAction,
148
+ {
149
+ label: box.shape === "line" ? "Line colour" : "Fill",
150
+ value: (box.shape === "line" ? box.line?.color : box.fill) ?? "#ffffff",
151
+ onChange: (color) => update(
152
+ (b) => b.shape === "line" ? { ...b, line: { width: b.line?.width ?? 2, ...b.line, color } } : { ...b, fill: color, shape: b.shape === "text" ? "rect" : b.shape }
153
+ ),
154
+ children: /* @__PURE__ */ jsx(PaintBucket, { className: "size-4" })
155
+ }
156
+ ),
157
+ /* @__PURE__ */ jsx("div", { className: "mx-0.5 h-5 w-px bg-border" }),
158
+ /* @__PURE__ */ jsx(Action, { label: "In front of the clips", onClick: () => actions.restackBox(box.id, "front"), children: /* @__PURE__ */ jsx(BringToFront, { className: "size-4" }) }),
159
+ /* @__PURE__ */ jsx(Action, { label: "Behind the clips", onClick: () => actions.restackBox(box.id, "back"), children: /* @__PURE__ */ jsx(SendToBack, { className: "size-4" }) }),
160
+ /* @__PURE__ */ jsx("div", { className: "mx-0.5 h-5 w-px bg-border" }),
161
+ /* @__PURE__ */ jsx(
162
+ "button",
163
+ {
164
+ type: "button",
165
+ className: cn(ACTION, "text-destructive hover:bg-destructive/10"),
166
+ title: "Delete (Delete)",
167
+ "aria-label": "Delete",
168
+ onClick: () => {
169
+ actions.removeBox(box.id);
170
+ onRemoved();
171
+ },
172
+ children: /* @__PURE__ */ jsx(Trash2, { className: "size-4" })
173
+ }
174
+ )
175
+ ]
176
+ }
177
+ );
178
+ }
179
+ export {
180
+ BoxActionBar
181
+ };
182
+ //# sourceMappingURL=BoxActionBar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/presentation/BoxActionBar.tsx"],
4
+ "sourcesContent": ["/**\n * The floating bar over a selected text box or shape: its type (smaller, larger, bold, italic, its\n * colour), its alignment, its fill, in front of or behind the clips, delete. Colours are picked with\n * the system's colour picker.\n */\n\nimport type { ReactNode } from 'react'\nimport {\n AlignCenter,\n AlignLeft,\n AlignRight,\n AArrowDown,\n AArrowUp,\n Baseline,\n Bold,\n BringToFront,\n Italic,\n PaintBucket,\n SendToBack,\n Trash2,\n} from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ACTION, Action } from './ClipActionBar'\nimport { DEFAULT_TEXT_SIZE, firstRun, styleRuns, type SlideBox, type TextAlign } from './boxes'\nimport { usePresentation } from './store'\nimport { TEXT_COLORS } from './theme'\n\nconst SIZE_STEPS = [8, 10, 12, 14, 16, 18, 20, 24, 28, 32, 36, 44, 54, 66, 80, 96]\n\nconst nextSize = (size: number, up: boolean) =>\n up\n ? (SIZE_STEPS.find((step) => step > size + 0.5) ?? size)\n : ([...SIZE_STEPS].reverse().find((step) => step < size - 0.5) ?? size)\n\nconst ALIGN_NEXT: Record<TextAlign, TextAlign> = {\n left: 'center',\n center: 'right',\n right: 'left',\n justify: 'left',\n}\nconst ALIGN_ICON: Record<TextAlign, ReactNode> = {\n left: <AlignLeft className=\"size-4\" />,\n center: <AlignCenter className=\"size-4\" />,\n right: <AlignRight className=\"size-4\" />,\n justify: <AlignLeft className=\"size-4\" />,\n}\n\n/** A button that opens the system colour picker. */\nfunction ColorAction({\n label,\n value,\n onChange,\n children,\n}: {\n label: string\n value: string\n onChange: (color: string) => void\n children: ReactNode\n}) {\n return (\n <label className={cn(ACTION, 'relative cursor-pointer')} title={label} aria-label={label}>\n {children}\n <span\n className=\"pointer-events-none absolute inset-x-1.5 bottom-0.5 h-0.5 rounded-full\"\n style={{ background: value }}\n />\n <input\n type=\"color\"\n value={value}\n onChange={(event) => onChange(event.target.value)}\n className=\"absolute inset-0 size-full cursor-pointer opacity-0\"\n aria-label={label}\n />\n </label>\n )\n}\n\nexport interface BoxActionBarProps {\n box: SlideBox\n onRemoved: () => void\n}\n\nexport function BoxActionBar({ box, onRemoved }: BoxActionBarProps) {\n const actions = usePresentation.getState()\n const run = firstRun(box)\n const size = run?.size ?? DEFAULT_TEXT_SIZE\n const align = box.paragraphs[0]?.align ?? 'left'\n const update = (change: (b: SlideBox) => SlideBox) => actions.updateBox(box.id, change)\n const text = box.shape !== 'line'\n const top = Math.max(0, box.frame.y)\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Text box\"\n className=\"absolute z-20 flex items-center gap-0.5 rounded-md border border-border bg-background p-0.5 shadow-md\"\n style={{\n left: `${Math.min(Math.max(0, box.frame.x), 0.6) * 100}%`,\n top: `calc(${top * 100}% - 40px)`,\n }}\n onPointerDown={(event) => event.stopPropagation()}\n data-testid=\"box-action-bar\"\n >\n {text && (\n <>\n <Action\n label=\"Smaller\"\n onClick={() =>\n update((b) => styleRuns(b, (r) => ({ ...r, size: nextSize(r.size ?? size, false) })))\n }\n >\n <AArrowDown className=\"size-4\" />\n </Action>\n <span\n className=\"w-7 text-center text-xs tabular-nums text-muted-foreground\"\n data-testid=\"box-text-size\"\n >\n {Math.round(size)}\n </span>\n <Action\n label=\"Larger\"\n onClick={() =>\n update((b) => styleRuns(b, (r) => ({ ...r, size: nextSize(r.size ?? size, true) })))\n }\n >\n <AArrowUp className=\"size-4\" />\n </Action>\n <Action\n label=\"Bold\"\n onClick={() => update((b) => styleRuns(b, (r) => ({ ...r, bold: !run?.bold })))}\n >\n <Bold className={cn('size-4', run?.bold && 'text-primary')} />\n </Action>\n <Action\n label=\"Italic\"\n onClick={() => update((b) => styleRuns(b, (r) => ({ ...r, italic: !run?.italic })))}\n >\n <Italic className={cn('size-4', run?.italic && 'text-primary')} />\n </Action>\n <Action\n label=\"Align\"\n onClick={() =>\n update((b) => ({\n ...b,\n paragraphs: b.paragraphs.map((p) => ({ ...p, align: ALIGN_NEXT[align] })),\n }))\n }\n >\n {ALIGN_ICON[align]}\n </Action>\n <ColorAction\n label=\"Text colour\"\n value={run?.color ?? TEXT_COLORS.body}\n onChange={(color) => update((b) => styleRuns(b, (r) => ({ ...r, color })))}\n >\n <Baseline className=\"size-4\" />\n </ColorAction>\n </>\n )}\n <ColorAction\n label={box.shape === 'line' ? 'Line colour' : 'Fill'}\n value={(box.shape === 'line' ? box.line?.color : box.fill) ?? '#ffffff'}\n onChange={(color) =>\n update((b) =>\n b.shape === 'line'\n ? { ...b, line: { width: b.line?.width ?? 2, ...b.line, color } }\n : { ...b, fill: color, shape: b.shape === 'text' ? 'rect' : b.shape }\n )\n }\n >\n <PaintBucket className=\"size-4\" />\n </ColorAction>\n <div className=\"mx-0.5 h-5 w-px bg-border\" />\n <Action label=\"In front of the clips\" onClick={() => actions.restackBox(box.id, 'front')}>\n <BringToFront className=\"size-4\" />\n </Action>\n <Action label=\"Behind the clips\" onClick={() => actions.restackBox(box.id, 'back')}>\n <SendToBack className=\"size-4\" />\n </Action>\n <div className=\"mx-0.5 h-5 w-px bg-border\" />\n <button\n type=\"button\"\n className={cn(ACTION, 'text-destructive hover:bg-destructive/10')}\n title=\"Delete (Delete)\"\n aria-label=\"Delete\"\n onClick={() => {\n actions.removeBox(box.id)\n onRemoved()\n }}\n >\n <Trash2 className=\"size-4\" />\n </button>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The floating action bar over the selected clip (the markup overlay's pattern): size it to the
3
+ * stage, align it, put it in front or behind, take it off the slide. Icons with labels on hover
4
+ * (`title`: portalled tooltips misplace in a popped-out window).
5
+ */
6
+ import type { ReactNode } from 'react';
7
+ export declare const ACTION = "inline-flex size-7 items-center justify-center rounded text-foreground hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11";
8
+ export declare function Action({ label, onClick, children, }: {
9
+ label: string;
10
+ onClick: () => void;
11
+ children: ReactNode;
12
+ }): import("react").JSX.Element;
13
+ export interface ClipActionBarProps {
14
+ clipId: string;
15
+ /** The clip's top-left, as fractions of the stage. */
16
+ at: {
17
+ x: number;
18
+ y: number;
19
+ };
20
+ onRemoved: () => void;
21
+ /** An image clip: make a new version of the image (Generate image with it as the reference). */
22
+ onEditImage?: () => void;
23
+ /** An image clip: choose the part of the image it shows. */
24
+ onCropImage?: () => void;
25
+ }
26
+ export declare function ClipActionBar({ clipId, at, onRemoved, onEditImage, onCropImage, }: ClipActionBarProps): import("react").JSX.Element;
@@ -0,0 +1,103 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ AlignCenterHorizontal,
5
+ AlignCenterVertical,
6
+ AlignEndHorizontal,
7
+ AlignEndVertical,
8
+ AlignStartHorizontal,
9
+ AlignStartVertical,
10
+ BringToFront,
11
+ Crop,
12
+ Maximize2,
13
+ MoveHorizontal,
14
+ MoveVertical,
15
+ SendToBack,
16
+ Sparkles,
17
+ Trash2
18
+ } from "lucide-react";
19
+ import {
20
+ DropdownMenu,
21
+ DropdownMenuContent,
22
+ DropdownMenuItem,
23
+ DropdownMenuTrigger,
24
+ cn
25
+ } from "@arbidocs/react/ui";
26
+ import { usePresentation } from "./store.js";
27
+ const ACTION = "inline-flex size-7 items-center justify-center rounded text-foreground hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11";
28
+ const SIZES = [
29
+ { command: "fit", label: "Fit the slide", icon: /* @__PURE__ */ jsx(Maximize2, { className: "size-4" }) },
30
+ { command: "fullWidth", label: "Full width", icon: /* @__PURE__ */ jsx(MoveHorizontal, { className: "size-4" }) },
31
+ { command: "fullHeight", label: "Full height", icon: /* @__PURE__ */ jsx(MoveVertical, { className: "size-4" }) }
32
+ ];
33
+ const ALIGNMENTS = [
34
+ { alignment: "left", label: "Left", icon: /* @__PURE__ */ jsx(AlignStartVertical, { className: "size-4" }) },
35
+ { alignment: "centre", label: "Centre", icon: /* @__PURE__ */ jsx(AlignCenterVertical, { className: "size-4" }) },
36
+ { alignment: "right", label: "Right", icon: /* @__PURE__ */ jsx(AlignEndVertical, { className: "size-4" }) },
37
+ { alignment: "top", label: "Top", icon: /* @__PURE__ */ jsx(AlignStartHorizontal, { className: "size-4" }) },
38
+ { alignment: "middle", label: "Middle", icon: /* @__PURE__ */ jsx(AlignCenterHorizontal, { className: "size-4" }) },
39
+ { alignment: "bottom", label: "Bottom", icon: /* @__PURE__ */ jsx(AlignEndHorizontal, { className: "size-4" }) }
40
+ ];
41
+ function Action({
42
+ label,
43
+ onClick,
44
+ children
45
+ }) {
46
+ return /* @__PURE__ */ jsx("button", { type: "button", className: ACTION, title: label, "aria-label": label, onClick, children });
47
+ }
48
+ function ClipActionBar({
49
+ clipId,
50
+ at,
51
+ onRemoved,
52
+ onEditImage,
53
+ onCropImage
54
+ }) {
55
+ const actions = usePresentation.getState();
56
+ return /* @__PURE__ */ jsxs(
57
+ "div",
58
+ {
59
+ role: "toolbar",
60
+ "aria-label": "Clip",
61
+ className: "absolute z-20 flex items-center gap-0.5 rounded-md border border-border bg-background p-0.5 shadow-md",
62
+ style: { left: `${at.x * 100}%`, top: `calc(${at.y * 100}% - 40px)` },
63
+ onPointerDown: (event) => event.stopPropagation(),
64
+ "data-testid": "clip-action-bar",
65
+ children: [
66
+ SIZES.map(({ command, label, icon }) => /* @__PURE__ */ jsx(Action, { label, onClick: () => actions.applyFrame(clipId, command), children: icon }, command)),
67
+ /* @__PURE__ */ jsxs(DropdownMenu, { children: [
68
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx("button", { type: "button", className: ACTION, title: "Align", "aria-label": "Align", children: /* @__PURE__ */ jsx(AlignCenterHorizontal, { className: "size-4" }) }) }),
69
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align: "start", children: ALIGNMENTS.map(({ alignment, label, icon }) => /* @__PURE__ */ jsxs(DropdownMenuItem, { onSelect: () => actions.align(clipId, alignment), children: [
70
+ icon,
71
+ /* @__PURE__ */ jsx("span", { className: "ml-2", children: label })
72
+ ] }, alignment)) })
73
+ ] }),
74
+ onCropImage && /* @__PURE__ */ jsx(Action, { label: "Crop", onClick: onCropImage, children: /* @__PURE__ */ jsx(Crop, { className: "size-4" }) }),
75
+ onEditImage && /* @__PURE__ */ jsx(Action, { label: "Edit image", onClick: onEditImage, children: /* @__PURE__ */ jsx(Sparkles, { className: "size-4" }) }),
76
+ /* @__PURE__ */ jsx("div", { className: "mx-0.5 h-5 w-px bg-border" }),
77
+ /* @__PURE__ */ jsx(Action, { label: "Bring to front", onClick: () => actions.bringToFront(clipId), children: /* @__PURE__ */ jsx(BringToFront, { className: "size-4" }) }),
78
+ /* @__PURE__ */ jsx(Action, { label: "Send to back", onClick: () => actions.sendToBack(clipId), children: /* @__PURE__ */ jsx(SendToBack, { className: "size-4" }) }),
79
+ /* @__PURE__ */ jsx("div", { className: "mx-0.5 h-5 w-px bg-border" }),
80
+ /* @__PURE__ */ jsx(
81
+ "button",
82
+ {
83
+ type: "button",
84
+ className: cn(ACTION, "text-destructive hover:bg-destructive/10"),
85
+ title: "Remove from slide (Delete)",
86
+ "aria-label": "Remove from slide",
87
+ onClick: () => {
88
+ actions.unplace(clipId);
89
+ onRemoved();
90
+ },
91
+ children: /* @__PURE__ */ jsx(Trash2, { className: "size-4" })
92
+ }
93
+ )
94
+ ]
95
+ }
96
+ );
97
+ }
98
+ export {
99
+ ACTION,
100
+ Action,
101
+ ClipActionBar
102
+ };
103
+ //# sourceMappingURL=ClipActionBar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/presentation/ClipActionBar.tsx"],
4
+ "sourcesContent": ["/**\n * The floating action bar over the selected clip (the markup overlay's pattern): size it to the\n * stage, align it, put it in front or behind, take it off the slide. Icons with labels on hover\n * (`title`: portalled tooltips misplace in a popped-out window).\n */\n\nimport type { ReactNode } from 'react'\nimport {\n AlignCenterHorizontal,\n AlignCenterVertical,\n AlignEndHorizontal,\n AlignEndVertical,\n AlignStartHorizontal,\n AlignStartVertical,\n BringToFront,\n Crop,\n Maximize2,\n MoveHorizontal,\n MoveVertical,\n SendToBack,\n Sparkles,\n Trash2,\n} from 'lucide-react'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport type { Alignment } from './model'\nimport { usePresentation, type FrameCommand } from './store'\n\nexport const ACTION =\n 'inline-flex size-7 items-center justify-center rounded text-foreground hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11'\n\nconst SIZES: { command: FrameCommand; label: string; icon: ReactNode }[] = [\n { command: 'fit', label: 'Fit the slide', icon: <Maximize2 className=\"size-4\" /> },\n { command: 'fullWidth', label: 'Full width', icon: <MoveHorizontal className=\"size-4\" /> },\n { command: 'fullHeight', label: 'Full height', icon: <MoveVertical className=\"size-4\" /> },\n]\n\nconst ALIGNMENTS: { alignment: Alignment; label: string; icon: ReactNode }[] = [\n { alignment: 'left', label: 'Left', icon: <AlignStartVertical className=\"size-4\" /> },\n { alignment: 'centre', label: 'Centre', icon: <AlignCenterVertical className=\"size-4\" /> },\n { alignment: 'right', label: 'Right', icon: <AlignEndVertical className=\"size-4\" /> },\n { alignment: 'top', label: 'Top', icon: <AlignStartHorizontal className=\"size-4\" /> },\n { alignment: 'middle', label: 'Middle', icon: <AlignCenterHorizontal className=\"size-4\" /> },\n { alignment: 'bottom', label: 'Bottom', icon: <AlignEndHorizontal className=\"size-4\" /> },\n]\n\nexport function Action({\n label,\n onClick,\n children,\n}: {\n label: string\n onClick: () => void\n children: ReactNode\n}) {\n return (\n <button type=\"button\" className={ACTION} title={label} aria-label={label} onClick={onClick}>\n {children}\n </button>\n )\n}\n\nexport interface ClipActionBarProps {\n clipId: string\n /** The clip's top-left, as fractions of the stage. */\n at: { x: number; y: number }\n onRemoved: () => void\n /** An image clip: make a new version of the image (Generate image with it as the reference). */\n onEditImage?: () => void\n /** An image clip: choose the part of the image it shows. */\n onCropImage?: () => void\n}\n\nexport function ClipActionBar({\n clipId,\n at,\n onRemoved,\n onEditImage,\n onCropImage,\n}: ClipActionBarProps) {\n const actions = usePresentation.getState()\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Clip\"\n className=\"absolute z-20 flex items-center gap-0.5 rounded-md border border-border bg-background p-0.5 shadow-md\"\n style={{ left: `${at.x * 100}%`, top: `calc(${at.y * 100}% - 40px)` }}\n // Its clicks are not a click on the stage (which would deselect the clip).\n onPointerDown={(event) => event.stopPropagation()}\n data-testid=\"clip-action-bar\"\n >\n {SIZES.map(({ command, label, icon }) => (\n <Action key={command} label={label} onClick={() => actions.applyFrame(clipId, command)}>\n {icon}\n </Action>\n ))}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" className={ACTION} title=\"Align\" aria-label=\"Align\">\n <AlignCenterHorizontal className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {ALIGNMENTS.map(({ alignment, label, icon }) => (\n <DropdownMenuItem key={alignment} onSelect={() => actions.align(clipId, alignment)}>\n {icon}\n <span className=\"ml-2\">{label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n {onCropImage && (\n <Action label=\"Crop\" onClick={onCropImage}>\n <Crop className=\"size-4\" />\n </Action>\n )}\n {onEditImage && (\n <Action label=\"Edit image\" onClick={onEditImage}>\n <Sparkles className=\"size-4\" />\n </Action>\n )}\n <div className=\"mx-0.5 h-5 w-px bg-border\" />\n <Action label=\"Bring to front\" onClick={() => actions.bringToFront(clipId)}>\n <BringToFront className=\"size-4\" />\n </Action>\n <Action label=\"Send to back\" onClick={() => actions.sendToBack(clipId)}>\n <SendToBack className=\"size-4\" />\n </Action>\n <div className=\"mx-0.5 h-5 w-px bg-border\" />\n <button\n type=\"button\"\n className={cn(ACTION, 'text-destructive hover:bg-destructive/10')}\n title=\"Remove from slide (Delete)\"\n aria-label=\"Remove from slide\"\n onClick={() => {\n actions.unplace(clipId)\n onRemoved()\n }}\n >\n <Trash2 className=\"size-4\" />\n </button>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Over a page while clipping: drag a rectangle and it becomes a clip. The rectangle is kept as
3
+ * fractions of the page (`toNorm`), so it does not depend on the zoom it was drawn at.
4
+ */
5
+ import type { Rect } from './model';
6
+ export interface ClipCaptureOverlayProps {
7
+ page: number;
8
+ onCapture: (capture: {
9
+ page: number;
10
+ rect: Rect;
11
+ aspect: number;
12
+ }) => void;
13
+ }
14
+ export declare function ClipCaptureOverlay({ page, onCapture }: ClipCaptureOverlayProps): import("react").JSX.Element;
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useRef, useState } from "react";
4
+ import { toNorm } from "@arbidocs/react/annotations";
5
+ const MIN_CLIP_FRACTION = 0.02;
6
+ function ClipCaptureOverlay({ page, onCapture }) {
7
+ const start = useRef(null);
8
+ const [draft, setDraft] = useState(null);
9
+ const point = (event, box) => ({
10
+ x: event.clientX - box.left,
11
+ y: event.clientY - box.top
12
+ });
13
+ const onPointerDown = (event) => {
14
+ if (event.button !== 0) return;
15
+ event.preventDefault();
16
+ event.currentTarget.setPointerCapture(event.pointerId);
17
+ const box = event.currentTarget.getBoundingClientRect();
18
+ start.current = { ...point(event, box), box };
19
+ setDraft(null);
20
+ };
21
+ const onPointerMove = (event) => {
22
+ const s = start.current;
23
+ if (!s) return;
24
+ const p = point(event, s.box);
25
+ setDraft({ x: s.x, y: s.y, width: p.x - s.x, height: p.y - s.y });
26
+ };
27
+ const onPointerUp = (event) => {
28
+ const s = start.current;
29
+ start.current = null;
30
+ setDraft(null);
31
+ if (!s) return;
32
+ const p = point(event, s.box);
33
+ const size = { width: s.box.width, height: s.box.height };
34
+ const rect = toNorm({ x: s.x, y: s.y, width: p.x - s.x, height: p.y - s.y }, size);
35
+ if (rect.w < MIN_CLIP_FRACTION || rect.h < MIN_CLIP_FRACTION) return;
36
+ onCapture({ page, rect, aspect: rect.w * size.width / (rect.h * size.height) });
37
+ };
38
+ const shown = draft && {
39
+ left: Math.min(draft.x, draft.x + draft.width),
40
+ top: Math.min(draft.y, draft.y + draft.height),
41
+ width: Math.abs(draft.width),
42
+ height: Math.abs(draft.height)
43
+ };
44
+ return /* @__PURE__ */ jsx(
45
+ "div",
46
+ {
47
+ className: "absolute inset-0 z-20 cursor-crosshair touch-none select-none",
48
+ onPointerDown,
49
+ onPointerMove,
50
+ onPointerUp,
51
+ onPointerCancel: () => {
52
+ start.current = null;
53
+ setDraft(null);
54
+ },
55
+ "data-testid": `clip-capture-${page}`,
56
+ children: shown && /* @__PURE__ */ jsx(
57
+ "div",
58
+ {
59
+ className: "pointer-events-none absolute border-2 border-dashed border-primary bg-primary/10",
60
+ style: shown
61
+ }
62
+ )
63
+ }
64
+ );
65
+ }
66
+ export {
67
+ ClipCaptureOverlay
68
+ };
69
+ //# sourceMappingURL=ClipCaptureOverlay.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/presentation/ClipCaptureOverlay.tsx"],
4
+ "sourcesContent": ["/**\n * Over a page while clipping: drag a rectangle and it becomes a clip. The rectangle is kept as\n * fractions of the page (`toNorm`), so it does not depend on the zoom it was drawn at.\n */\n\nimport { useRef, useState, type PointerEvent as ReactPointerEvent } from 'react'\nimport { toNorm, type PixelRect } from '@arbidocs/react/annotations'\nimport type { Rect } from './model'\n\n/** Smaller than this (a fraction of the page, either side) is a stray click, not a clip. */\nconst MIN_CLIP_FRACTION = 0.02\n\nexport interface ClipCaptureOverlayProps {\n page: number\n onCapture: (capture: { page: number; rect: Rect; aspect: number }) => void\n}\n\nexport function ClipCaptureOverlay({ page, onCapture }: ClipCaptureOverlayProps) {\n const start = useRef<{ x: number; y: number; box: DOMRect } | null>(null)\n const [draft, setDraft] = useState<PixelRect | null>(null)\n\n const point = (event: ReactPointerEvent, box: DOMRect) => ({\n x: event.clientX - box.left,\n y: event.clientY - box.top,\n })\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) return\n event.preventDefault()\n event.currentTarget.setPointerCapture(event.pointerId)\n const box = event.currentTarget.getBoundingClientRect()\n start.current = { ...point(event, box), box }\n setDraft(null)\n }\n\n const onPointerMove = (event: ReactPointerEvent) => {\n const s = start.current\n if (!s) return\n const p = point(event, s.box)\n setDraft({ x: s.x, y: s.y, width: p.x - s.x, height: p.y - s.y })\n }\n\n const onPointerUp = (event: ReactPointerEvent) => {\n const s = start.current\n start.current = null\n setDraft(null)\n if (!s) return\n const p = point(event, s.box)\n const size = { width: s.box.width, height: s.box.height }\n const rect = toNorm({ x: s.x, y: s.y, width: p.x - s.x, height: p.y - s.y }, size)\n if (rect.w < MIN_CLIP_FRACTION || rect.h < MIN_CLIP_FRACTION) return\n onCapture({ page, rect, aspect: (rect.w * size.width) / (rect.h * size.height) })\n }\n\n const shown = draft && {\n left: Math.min(draft.x, draft.x + draft.width),\n top: Math.min(draft.y, draft.y + draft.height),\n width: Math.abs(draft.width),\n height: Math.abs(draft.height),\n }\n\n return (\n <div\n className=\"absolute inset-0 z-20 cursor-crosshair touch-none select-none\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={() => {\n start.current = null\n setDraft(null)\n }}\n data-testid={`clip-capture-${page}`}\n >\n {shown && (\n <div\n className=\"pointer-events-none absolute border-2 border-dashed border-primary bg-primary/10\"\n style={shown}\n />\n )}\n </div>\n )\n}\n"],
5
+ "mappings": ";AA0EQ;AArER,SAAS,QAAQ,gBAAwD;AACzE,SAAS,cAA8B;AAIvC,MAAM,oBAAoB;AAOnB,SAAS,mBAAmB,EAAE,MAAM,UAAU,GAA4B;AAC/E,QAAM,QAAQ,OAAsD,IAAI;AACxE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA2B,IAAI;AAEzD,QAAM,QAAQ,CAAC,OAA0B,SAAkB;AAAA,IACzD,GAAG,MAAM,UAAU,IAAI;AAAA,IACvB,GAAG,MAAM,UAAU,IAAI;AAAA,EACzB;AAEA,QAAM,gBAAgB,CAAC,UAA6C;AAClE,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,eAAe;AACrB,UAAM,cAAc,kBAAkB,MAAM,SAAS;AACrD,UAAM,MAAM,MAAM,cAAc,sBAAsB;AACtD,UAAM,UAAU,EAAE,GAAG,MAAM,OAAO,GAAG,GAAG,IAAI;AAC5C,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,gBAAgB,CAAC,UAA6B;AAClD,UAAM,IAAI,MAAM;AAChB,QAAI,CAAC,EAAG;AACR,UAAM,IAAI,MAAM,OAAO,EAAE,GAAG;AAC5B,aAAS,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;AAAA,EAClE;AAEA,QAAM,cAAc,CAAC,UAA6B;AAChD,UAAM,IAAI,MAAM;AAChB,UAAM,UAAU;AAChB,aAAS,IAAI;AACb,QAAI,CAAC,EAAG;AACR,UAAM,IAAI,MAAM,OAAO,EAAE,GAAG;AAC5B,UAAM,OAAO,EAAE,OAAO,EAAE,IAAI,OAAO,QAAQ,EAAE,IAAI,OAAO;AACxD,UAAM,OAAO,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI;AACjF,QAAI,KAAK,IAAI,qBAAqB,KAAK,IAAI,kBAAmB;AAC9D,cAAU,EAAE,MAAM,MAAM,QAAS,KAAK,IAAI,KAAK,SAAU,KAAK,IAAI,KAAK,QAAQ,CAAC;AAAA,EAClF;AAEA,QAAM,QAAQ,SAAS;AAAA,IACrB,MAAM,KAAK,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,KAAK;AAAA,IAC7C,KAAK,KAAK,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,MAAM;AAAA,IAC7C,OAAO,KAAK,IAAI,MAAM,KAAK;AAAA,IAC3B,QAAQ,KAAK,IAAI,MAAM,MAAM;AAAA,EAC/B;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,MAAM;AACrB,cAAM,UAAU;AAChB,iBAAS,IAAI;AAAA,MACf;AAAA,MACA,eAAa,gBAAgB,IAAI;AAAA,MAEhC,mBACC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA;AAAA,MACT;AAAA;AAAA,EAEJ;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * A clip as shown on a slide or in the tray.
3
+ *
4
+ * A PDF clip is drawn into a canvas the size of its box in device pixels (measured in whichever
5
+ * window it is in), from a bitmap of its region rendered for that size: as sharp as the screen
6
+ * allows. The canvas remembers what area its bitmap covers, so when the clip is scrolled or
7
+ * resized it is redrawn at once from the bitmap it has (shifted or scaled: cheap), and the sharp
8
+ * rendering follows once the change settles. An older render still running is cancelled; renders
9
+ * across clips are queued a few at a time (`renderPdfRegion`), so the page stays smooth.
10
+ *
11
+ * An image or video clip is its own file, cropped (`MediaClip`).
12
+ */
13
+ import type { Clip } from './model';
14
+ export interface ClipImageProps {
15
+ clip: Clip;
16
+ className?: string;
17
+ /** On the presented stage: a video clip plays with its sound (the editor's copy is muted). */
18
+ live?: boolean;
19
+ }
20
+ /** An image or video clip is its own file, cropped; a PDF clip is drawn for its size. */
21
+ export declare const ClipImage: import("react").NamedExoticComponent<ClipImageProps>;