@arbidocs/blocks 0.5.119 → 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 (463) 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-546ILGLW.cjs → ConnectedNativeDocxComparison-4Q5S7VLD.cjs} +17 -17
  10. package/dist/{ConnectedNativeDocxComparison-546ILGLW.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-S2ZFZLZQ.cjs → ConnectedStreamedWordArtifact-FFOQJBOI.cjs} +17 -17
  18. package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs.map → ConnectedStreamedWordArtifact-FFOQJBOI.cjs.map} +1 -1
  19. package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-SNWVEZ7S.cjs} +19 -18
  20. package/dist/DocumentReviewCard-SNWVEZ7S.cjs.map +1 -0
  21. package/dist/{FilesViewerDialog-6UKR5WEF.cjs → FilesViewerDialog-IZI63FOV.cjs} +54 -47
  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/agents/tasks/ConversationListView.js +10 -2
  29. package/dist/agents/tasks/ConversationListView.js.map +2 -2
  30. package/dist/agents/tasks/TaskTable.js +5 -4
  31. package/dist/agents/tasks/TaskTable.js.map +2 -2
  32. package/dist/agents/tasks/WorkflowsTable.js +4 -5
  33. package/dist/agents/tasks/WorkflowsTable.js.map +2 -2
  34. package/dist/agents/tasks/taskColumns.js +1 -1
  35. package/dist/agents/tasks/taskColumns.js.map +1 -1
  36. package/dist/agents/tasks/taskTableLabels.js +1 -1
  37. package/dist/agents/tasks/taskTableLabels.js.map +1 -1
  38. package/dist/agents/tasks/workflowTableLabels.js +1 -1
  39. package/dist/agents/tasks/workflowTableLabels.js.map +1 -1
  40. package/dist/{ai-IM4A23YT.cjs → ai-KBYNRNZ6.cjs} +28 -26
  41. package/dist/ai-KBYNRNZ6.cjs.map +1 -0
  42. package/dist/calls/connected/CallControls.d.ts +2 -0
  43. package/dist/calls/connected/CallControls.js +71 -9
  44. package/dist/calls/connected/CallControls.js.map +2 -2
  45. package/dist/calls/connected/ShareDocumentDialog.d.ts +14 -0
  46. package/dist/calls/connected/ShareDocumentDialog.js +77 -0
  47. package/dist/calls/connected/ShareDocumentDialog.js.map +7 -0
  48. package/dist/calls/index.cjs +121 -121
  49. package/dist/chat/index.cjs +9 -8
  50. package/dist/{chunk-T23UTIRI.cjs → chunk-2PZT3J34.cjs} +6 -6
  51. package/dist/{chunk-T23UTIRI.cjs.map → chunk-2PZT3J34.cjs.map} +1 -1
  52. package/dist/{chunk-SGYSDABK.cjs → chunk-2W5E62EY.cjs} +6 -6
  53. package/dist/{chunk-SGYSDABK.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
  54. package/dist/{chunk-TDO5UWXF.cjs → chunk-3SCNXNHI.cjs} +5 -5
  55. package/dist/{chunk-TDO5UWXF.cjs.map → chunk-3SCNXNHI.cjs.map} +1 -1
  56. package/dist/{chunk-KTQOGT2L.cjs → chunk-474GPLCM.cjs} +7 -7
  57. package/dist/{chunk-KTQOGT2L.cjs.map → chunk-474GPLCM.cjs.map} +1 -1
  58. package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
  59. package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
  60. package/dist/{chunk-NY3YUCOW.cjs → chunk-4NPCDS2X.cjs} +3 -3
  61. package/dist/{chunk-NY3YUCOW.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
  62. package/dist/{chunk-CPG7II4E.cjs → chunk-4RBQ44RY.cjs} +28 -28
  63. package/dist/chunk-4RBQ44RY.cjs.map +1 -0
  64. package/dist/{chunk-BQ5RIWWT.cjs → chunk-4VZZWYEC.cjs} +3 -3
  65. package/dist/{chunk-BQ5RIWWT.cjs.map → chunk-4VZZWYEC.cjs.map} +1 -1
  66. package/dist/{chunk-Y24V6HPR.cjs → chunk-52KGMAO5.cjs} +15 -15
  67. package/dist/{chunk-Y24V6HPR.cjs.map → chunk-52KGMAO5.cjs.map} +1 -1
  68. package/dist/{chunk-HB2O4THB.cjs → chunk-5534FYXP.cjs} +4 -4
  69. package/dist/{chunk-HB2O4THB.cjs.map → chunk-5534FYXP.cjs.map} +1 -1
  70. package/dist/chunk-5GCCUXMT.cjs +63 -0
  71. package/dist/chunk-5GCCUXMT.cjs.map +1 -0
  72. package/dist/chunk-5LTIZ44D.cjs +95 -0
  73. package/dist/chunk-5LTIZ44D.cjs.map +1 -0
  74. package/dist/{chunk-YGXOKB5Z.cjs → chunk-734NPQNR.cjs} +4 -4
  75. package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-734NPQNR.cjs.map} +1 -1
  76. package/dist/{chunk-SB4M3ITT.cjs → chunk-7VUJGHMY.cjs} +444 -100
  77. package/dist/chunk-7VUJGHMY.cjs.map +1 -0
  78. package/dist/chunk-AFQTQC7A.cjs +35 -0
  79. package/dist/chunk-AFQTQC7A.cjs.map +1 -0
  80. package/dist/{chunk-XKVPSOKP.cjs → chunk-AY6EZSZB.cjs} +4 -4
  81. package/dist/{chunk-XKVPSOKP.cjs.map → chunk-AY6EZSZB.cjs.map} +1 -1
  82. package/dist/{chunk-TT4IF52H.cjs → chunk-BVAT4EVC.cjs} +40 -41
  83. package/dist/chunk-BVAT4EVC.cjs.map +1 -0
  84. package/dist/{chunk-VGCTYTEW.cjs → chunk-C2OICDMI.cjs} +10 -10
  85. package/dist/{chunk-VGCTYTEW.cjs.map → chunk-C2OICDMI.cjs.map} +1 -1
  86. package/dist/{chunk-CPR6EHG7.cjs → chunk-DR2AH7JL.cjs} +179 -55
  87. package/dist/chunk-DR2AH7JL.cjs.map +1 -0
  88. package/dist/{chunk-NJCK6V6U.cjs → chunk-EATIFPKP.cjs} +4 -60
  89. package/dist/chunk-EATIFPKP.cjs.map +1 -0
  90. package/dist/{chunk-B3LZITVF.cjs → chunk-EHP6OH5D.cjs} +11 -451
  91. package/dist/chunk-EHP6OH5D.cjs.map +1 -0
  92. package/dist/{chunk-DDIW4HLU.cjs → chunk-ENGL7P3I.cjs} +46 -37
  93. package/dist/chunk-ENGL7P3I.cjs.map +1 -0
  94. package/dist/{chunk-QHOHDNBU.cjs → chunk-FKFQCK3C.cjs} +4 -4
  95. package/dist/{chunk-QHOHDNBU.cjs.map → chunk-FKFQCK3C.cjs.map} +1 -1
  96. package/dist/{chunk-6UTKM5AB.cjs → chunk-GKVE5JGB.cjs} +76 -76
  97. package/dist/chunk-GKVE5JGB.cjs.map +1 -0
  98. package/dist/{chunk-B2HNNG25.cjs → chunk-GPX5VC57.cjs} +50 -50
  99. package/dist/{chunk-B2HNNG25.cjs.map → chunk-GPX5VC57.cjs.map} +1 -1
  100. package/dist/{chunk-WAV762GP.cjs → chunk-GQXPNIRE.cjs} +6 -6
  101. package/dist/{chunk-WAV762GP.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
  102. package/dist/chunk-GX2EBMJW.cjs +133 -0
  103. package/dist/chunk-GX2EBMJW.cjs.map +1 -0
  104. package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
  105. package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
  106. package/dist/chunk-HYUKPHCT.cjs +66 -0
  107. package/dist/chunk-HYUKPHCT.cjs.map +1 -0
  108. package/dist/{chunk-NNUK5ZM7.cjs → chunk-JQLWKNJO.cjs} +29 -27
  109. package/dist/chunk-JQLWKNJO.cjs.map +1 -0
  110. package/dist/{chunk-OEREKAAP.cjs → chunk-JZEYHDWJ.cjs} +75 -75
  111. package/dist/{chunk-OEREKAAP.cjs.map → chunk-JZEYHDWJ.cjs.map} +1 -1
  112. package/dist/{chunk-PGJYD67F.cjs → chunk-KNGZZC4O.cjs} +7 -6
  113. package/dist/chunk-KNGZZC4O.cjs.map +1 -0
  114. package/dist/{chunk-NIE3N6OM.cjs → chunk-KP5AITQ4.cjs} +10 -10
  115. package/dist/{chunk-NIE3N6OM.cjs.map → chunk-KP5AITQ4.cjs.map} +1 -1
  116. package/dist/{chunk-YYPZOEED.cjs → chunk-LHWOKOMP.cjs} +23 -2
  117. package/dist/chunk-LHWOKOMP.cjs.map +1 -0
  118. package/dist/{chunk-57NHXEU2.cjs → chunk-MXBXZXXQ.cjs} +5 -5
  119. package/dist/{chunk-57NHXEU2.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
  120. package/dist/{chunk-WXUU3COI.cjs → chunk-MZ2KZXNU.cjs} +3 -3
  121. package/dist/{chunk-WXUU3COI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
  122. package/dist/chunk-NAJN32MF.cjs +154 -0
  123. package/dist/chunk-NAJN32MF.cjs.map +1 -0
  124. package/dist/{chunk-557MJ4IH.cjs → chunk-NLOETJCB.cjs} +17 -154
  125. package/dist/chunk-NLOETJCB.cjs.map +1 -0
  126. package/dist/{chunk-4XJEHKVZ.cjs → chunk-PIYYBPHH.cjs} +4 -4
  127. package/dist/{chunk-4XJEHKVZ.cjs.map → chunk-PIYYBPHH.cjs.map} +1 -1
  128. package/dist/chunk-Q3XJUXID.cjs +4774 -0
  129. package/dist/chunk-Q3XJUXID.cjs.map +1 -0
  130. package/dist/{chunk-325GVZE6.cjs → chunk-Q6DQGGP4.cjs} +3 -3
  131. package/dist/{chunk-325GVZE6.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
  132. package/dist/chunk-QFXILJMJ.cjs +458 -0
  133. package/dist/chunk-QFXILJMJ.cjs.map +1 -0
  134. package/dist/{chunk-R7CJEIA5.cjs → chunk-RYVZDFVO.cjs} +8 -9
  135. package/dist/chunk-RYVZDFVO.cjs.map +1 -0
  136. package/dist/{chunk-VLCY46K6.cjs → chunk-TG2GM7WJ.cjs} +4 -3
  137. package/dist/chunk-TG2GM7WJ.cjs.map +1 -0
  138. package/dist/{chunk-EOG6OT5I.cjs → chunk-TXP2N3DC.cjs} +4 -4
  139. package/dist/{chunk-EOG6OT5I.cjs.map → chunk-TXP2N3DC.cjs.map} +1 -1
  140. package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
  141. package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
  142. package/dist/chunk-VJ5ZLRBD.cjs +27 -0
  143. package/dist/chunk-VJ5ZLRBD.cjs.map +1 -0
  144. package/dist/{chunk-P77YTTJ3.cjs → chunk-W6B3RYTX.cjs} +4 -4
  145. package/dist/{chunk-P77YTTJ3.cjs.map → chunk-W6B3RYTX.cjs.map} +1 -1
  146. package/dist/chunk-WOOOMTTA.cjs +19 -0
  147. package/dist/chunk-WOOOMTTA.cjs.map +1 -0
  148. package/dist/{chunk-ZPPMAL5P.cjs → chunk-WQMR3O2D.cjs} +6 -10
  149. package/dist/chunk-WQMR3O2D.cjs.map +1 -0
  150. package/dist/{chunk-CJYWHUZR.cjs → chunk-XCKHOXRP.cjs} +4 -4
  151. package/dist/{chunk-CJYWHUZR.cjs.map → chunk-XCKHOXRP.cjs.map} +1 -1
  152. package/dist/{chunk-6WMMZLEV.cjs → chunk-XJEXFEWG.cjs} +2 -27
  153. package/dist/chunk-XJEXFEWG.cjs.map +1 -0
  154. package/dist/chunk-XK4TVJKD.cjs +73 -0
  155. package/dist/chunk-XK4TVJKD.cjs.map +1 -0
  156. package/dist/chunk-XTR26TNE.cjs +1358 -0
  157. package/dist/chunk-XTR26TNE.cjs.map +1 -0
  158. package/dist/{chunk-E7TE2WVT.cjs → chunk-ZVEW3JBT.cjs} +3 -3
  159. package/dist/{chunk-E7TE2WVT.cjs.map → chunk-ZVEW3JBT.cjs.map} +1 -1
  160. package/dist/collaboration/index.cjs +73 -73
  161. package/dist/collaboration/sharing/ShareControl.js +10 -2
  162. package/dist/collaboration/sharing/ShareControl.js.map +2 -2
  163. package/dist/components/SharedCell.d.ts +2 -4
  164. package/dist/components/SharedCell.js +4 -8
  165. package/dist/components/SharedCell.js.map +2 -2
  166. package/dist/components/ZoomSlider.d.ts +25 -0
  167. package/dist/components/ZoomSlider.js +59 -0
  168. package/dist/components/ZoomSlider.js.map +7 -0
  169. package/dist/connect/docx.cjs +20 -20
  170. package/dist/connect/index.cjs +1210 -1264
  171. package/dist/connect/index.cjs.map +1 -1
  172. package/dist/connect/viewer.cjs +42 -36
  173. package/dist/connection/ai.d.ts +1 -1
  174. package/dist/connection/facts/factPageColumns.js +3 -9
  175. package/dist/connection/facts/factPageColumns.js.map +2 -2
  176. package/dist/connection/files/ConnectedNewFileMenu.d.ts +2 -1
  177. package/dist/connection/files/ConnectedNewFileMenu.js +9 -3
  178. package/dist/connection/files/ConnectedNewFileMenu.js.map +2 -2
  179. package/dist/connection/files/explorer/ConnectedFilesExplorer.js +1 -1
  180. package/dist/connection/files/explorer/ConnectedFilesExplorer.js.map +2 -2
  181. package/dist/connection/files/explorer/FileTiles.js +1 -1
  182. package/dist/connection/files/explorer/FileTiles.js.map +2 -2
  183. package/dist/connection/files/fields/documentField.js +1 -1
  184. package/dist/connection/files/fields/documentField.js.map +2 -2
  185. package/dist/connection/files/grid/cells.js +1 -3
  186. package/dist/connection/files/grid/cells.js.map +2 -2
  187. package/dist/connection/files/grid/documentColumns.js +4 -3
  188. package/dist/connection/files/grid/documentColumns.js.map +2 -2
  189. package/dist/connection/files/page/DocumentsFilterBarActions.js +17 -28
  190. package/dist/connection/files/page/DocumentsFilterBarActions.js.map +2 -2
  191. package/dist/connection/mail/useMailboxDefaults.js +1 -1
  192. package/dist/connection/mail/useMailboxDefaults.js.map +2 -2
  193. package/dist/connection/panels/useSessionPanelMode.js +3 -2
  194. package/dist/connection/panels/useSessionPanelMode.js.map +2 -2
  195. package/dist/connection/presentation/ClippingMediaViewer.d.ts +12 -0
  196. package/dist/connection/presentation/ClippingMediaViewer.js +153 -0
  197. package/dist/connection/presentation/ClippingMediaViewer.js.map +7 -0
  198. package/dist/connection/presentation/ClippingPdfViewer.d.ts +22 -0
  199. package/dist/connection/presentation/ClippingPdfViewer.js +75 -0
  200. package/dist/connection/presentation/ClippingPdfViewer.js.map +7 -0
  201. package/dist/connection/presentation/ConnectedPresentation.d.ts +12 -0
  202. package/dist/connection/presentation/ConnectedPresentation.js +100 -0
  203. package/dist/connection/presentation/ConnectedPresentation.js.map +7 -0
  204. package/dist/connection/presentation/ConnectedSlidesTab.d.ts +20 -0
  205. package/dist/connection/presentation/ConnectedSlidesTab.js +220 -0
  206. package/dist/connection/presentation/ConnectedSlidesTab.js.map +7 -0
  207. package/dist/connection/presentation/CropClipDialog.d.ts +11 -0
  208. package/dist/connection/presentation/CropClipDialog.js +86 -0
  209. package/dist/connection/presentation/CropClipDialog.js.map +7 -0
  210. package/dist/connection/presentation/GenerateTile.d.ts +4 -0
  211. package/dist/connection/presentation/GenerateTile.js +24 -0
  212. package/dist/connection/presentation/GenerateTile.js.map +7 -0
  213. package/dist/connection/presentation/LabelColumnMenu.d.ts +8 -0
  214. package/dist/connection/presentation/LabelColumnMenu.js +38 -0
  215. package/dist/connection/presentation/LabelColumnMenu.js.map +7 -0
  216. package/dist/connection/presentation/PresentationDialogs.d.ts +39 -0
  217. package/dist/connection/presentation/PresentationDialogs.js +295 -0
  218. package/dist/connection/presentation/PresentationDialogs.js.map +7 -0
  219. package/dist/connection/presentation/PresentationFileCard.d.ts +10 -0
  220. package/dist/connection/presentation/PresentationFileCard.js +35 -0
  221. package/dist/connection/presentation/PresentationFileCard.js.map +7 -0
  222. package/dist/connection/presentation/PresentationPill.d.ts +8 -0
  223. package/dist/connection/presentation/PresentationPill.js +44 -0
  224. package/dist/connection/presentation/PresentationPill.js.map +7 -0
  225. package/dist/connection/presentation/PresentationSlot.d.ts +7 -0
  226. package/dist/connection/presentation/PresentationSlot.js +35 -0
  227. package/dist/connection/presentation/PresentationSlot.js.map +7 -0
  228. package/dist/connection/presentation/requests.d.ts +16 -0
  229. package/dist/connection/presentation/requests.js +20 -0
  230. package/dist/connection/presentation/requests.js.map +7 -0
  231. package/dist/connection/presentation/useImageGeneration.d.ts +11 -0
  232. package/dist/connection/presentation/useImageGeneration.js +66 -0
  233. package/dist/connection/presentation/useImageGeneration.js.map +7 -0
  234. package/dist/connection/presentation/useLabelColumns.d.ts +15 -0
  235. package/dist/connection/presentation/useLabelColumns.js +33 -0
  236. package/dist/connection/presentation/useLabelColumns.js.map +7 -0
  237. package/dist/connection/presentation/usePresentationController.d.ts +15 -0
  238. package/dist/connection/presentation/usePresentationController.js +118 -0
  239. package/dist/connection/presentation/usePresentationController.js.map +7 -0
  240. package/dist/connection/presentation/usePresentationFiles.d.ts +44 -0
  241. package/dist/connection/presentation/usePresentationFiles.js +307 -0
  242. package/dist/connection/presentation/usePresentationFiles.js.map +7 -0
  243. package/dist/connection/presentation/useViewerClipping.d.ts +14 -0
  244. package/dist/connection/presentation/useViewerClipping.js +18 -0
  245. package/dist/connection/presentation/useViewerClipping.js.map +7 -0
  246. package/dist/connection/sharing/WorkspaceMembersList.d.ts +4 -0
  247. package/dist/connection/sharing/WorkspaceMembersList.js +34 -0
  248. package/dist/connection/sharing/WorkspaceMembersList.js.map +7 -0
  249. package/dist/connection/shell/ConnectedAppShell.js +9 -1
  250. package/dist/connection/shell/ConnectedAppShell.js.map +2 -2
  251. package/dist/connection/viewer/CleanViewControl.d.ts +8 -0
  252. package/dist/connection/viewer/CleanViewControl.js +76 -0
  253. package/dist/connection/viewer/CleanViewControl.js.map +7 -0
  254. package/dist/connection/viewer/ConnectedDocumentViewer.js +31 -31
  255. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  256. package/dist/connection/viewer/ViewerCropModal.d.ts +5 -0
  257. package/dist/connection/viewer/ViewerCropModal.js +22 -0
  258. package/dist/connection/viewer/ViewerCropModal.js.map +7 -0
  259. package/dist/connection/viewer/ViewerPdfPane.d.ts +3 -1
  260. package/dist/connection/viewer/ViewerPdfPane.js +57 -2
  261. package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
  262. package/dist/connection/viewer/drafts.js +6 -4
  263. package/dist/connection/viewer/drafts.js.map +2 -2
  264. package/dist/connection/viewer/pdf/PdfPassageHighlights.d.ts +12 -0
  265. package/dist/connection/viewer/pdf/PdfPassageHighlights.js +36 -0
  266. package/dist/connection/viewer/pdf/PdfPassageHighlights.js.map +7 -0
  267. package/dist/connection/viewer/pdf/passageHighlights.d.ts +26 -0
  268. package/dist/connection/viewer/pdf/passageHighlights.js +40 -0
  269. package/dist/connection/viewer/pdf/passageHighlights.js.map +7 -0
  270. package/dist/connection/viewer/pdf/usePdfPassageHighlights.d.ts +9 -0
  271. package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +47 -0
  272. package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +7 -0
  273. package/dist/connection/viewer/shareDocument.d.ts +11 -0
  274. package/dist/connection/viewer/shareDocument.js +11 -0
  275. package/dist/connection/viewer/shareDocument.js.map +7 -0
  276. package/dist/connection/viewer/slidesTabChunk.d.ts +2 -0
  277. package/dist/connection/viewer/slidesTabChunk.js +9 -0
  278. package/dist/connection/viewer/slidesTabChunk.js.map +7 -0
  279. package/dist/connection/viewer/useCleanView.d.ts +14 -0
  280. package/dist/connection/viewer/useCleanView.js +29 -0
  281. package/dist/connection/viewer/useCleanView.js.map +7 -0
  282. package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
  283. package/dist/connection/viewer/useViewedDocument.js +9 -1
  284. package/dist/connection/viewer/useViewedDocument.js.map +2 -2
  285. package/dist/connection/viewer/useViewerTabs.js +18 -4
  286. package/dist/connection/viewer/useViewerTabs.js.map +2 -2
  287. package/dist/connection/workflows/ConnectedWorkflowStart.d.ts +14 -2
  288. package/dist/connection/workflows/ConnectedWorkflowStart.js +5 -2
  289. package/dist/connection/workflows/ConnectedWorkflowStart.js.map +2 -2
  290. package/dist/connection/workflows/workflowsPageLabels.js +1 -1
  291. package/dist/connection/workflows/workflowsPageLabels.js.map +1 -1
  292. package/dist/dashboards/index.cjs +1 -1
  293. package/dist/databases/index.cjs +49 -49
  294. package/dist/document-tools/DocumentToolButtons.d.ts +2 -0
  295. package/dist/document-tools/DocumentToolButtons.js +22 -1
  296. package/dist/document-tools/DocumentToolButtons.js.map +2 -2
  297. package/dist/document-tools/index.cjs +16 -12
  298. package/dist/document-tools/index.d.ts +1 -1
  299. package/dist/document-tools/index.js +2 -0
  300. package/dist/document-tools/index.js.map +2 -2
  301. package/dist/embed/index.cjs +43 -41
  302. package/dist/facts/factColumns.js +3 -3
  303. package/dist/facts/factColumns.js.map +1 -1
  304. package/dist/facts/index.cjs +42 -42
  305. package/dist/files/GridViewImpl.js +1 -1
  306. package/dist/files/GridViewImpl.js.map +2 -2
  307. package/dist/files/HtmlViewerParts.js +7 -15
  308. package/dist/files/HtmlViewerParts.js.map +2 -2
  309. package/dist/files/ViewerChrome.d.ts +5 -1
  310. package/dist/files/ViewerChrome.js +16 -6
  311. package/dist/files/ViewerChrome.js.map +2 -2
  312. package/dist/files/index.cjs +226 -226
  313. package/dist/files/navigator/DocumentSearchList.js +1 -1
  314. package/dist/files/navigator/DocumentSearchList.js.map +2 -2
  315. package/dist/index.cjs +1668 -1666
  316. package/dist/index.cjs.map +1 -1
  317. package/dist/presentation/BoxActionBar.d.ts +11 -0
  318. package/dist/presentation/BoxActionBar.js +182 -0
  319. package/dist/presentation/BoxActionBar.js.map +7 -0
  320. package/dist/presentation/ClipActionBar.d.ts +26 -0
  321. package/dist/presentation/ClipActionBar.js +103 -0
  322. package/dist/presentation/ClipActionBar.js.map +7 -0
  323. package/dist/presentation/ClipCaptureOverlay.d.ts +14 -0
  324. package/dist/presentation/ClipCaptureOverlay.js +69 -0
  325. package/dist/presentation/ClipCaptureOverlay.js.map +7 -0
  326. package/dist/presentation/ClipImage.d.ts +21 -0
  327. package/dist/presentation/ClipImage.js +119 -0
  328. package/dist/presentation/ClipImage.js.map +7 -0
  329. package/dist/presentation/ClipTray.d.ts +11 -0
  330. package/dist/presentation/ClipTray.js +152 -0
  331. package/dist/presentation/ClipTray.js.map +7 -0
  332. package/dist/presentation/ClipViewControls.d.ts +11 -0
  333. package/dist/presentation/ClipViewControls.js +142 -0
  334. package/dist/presentation/ClipViewControls.js.map +7 -0
  335. package/dist/presentation/DesignMenu.d.ts +8 -0
  336. package/dist/presentation/DesignMenu.js +199 -0
  337. package/dist/presentation/DesignMenu.js.map +7 -0
  338. package/dist/presentation/LayoutMenu.d.ts +17 -0
  339. package/dist/presentation/LayoutMenu.js +122 -0
  340. package/dist/presentation/LayoutMenu.js.map +7 -0
  341. package/dist/presentation/MediaClip.d.ts +15 -0
  342. package/dist/presentation/MediaClip.js +67 -0
  343. package/dist/presentation/MediaClip.js.map +7 -0
  344. package/dist/presentation/Notice.d.ts +6 -0
  345. package/dist/presentation/Notice.js +43 -0
  346. package/dist/presentation/Notice.js.map +7 -0
  347. package/dist/presentation/PresentationStage.d.ts +32 -0
  348. package/dist/presentation/PresentationStage.js +232 -0
  349. package/dist/presentation/PresentationStage.js.map +7 -0
  350. package/dist/presentation/PresenterView.d.ts +16 -0
  351. package/dist/presentation/PresenterView.js +69 -0
  352. package/dist/presentation/PresenterView.js.map +7 -0
  353. package/dist/presentation/SlideDecor.d.ts +25 -0
  354. package/dist/presentation/SlideDecor.js +189 -0
  355. package/dist/presentation/SlideDecor.js.map +7 -0
  356. package/dist/presentation/SlidesEditor.d.ts +25 -0
  357. package/dist/presentation/SlidesEditor.js +359 -0
  358. package/dist/presentation/SlidesEditor.js.map +7 -0
  359. package/dist/presentation/StageBox.d.ts +30 -0
  360. package/dist/presentation/StageBox.js +281 -0
  361. package/dist/presentation/StageBox.js.map +7 -0
  362. package/dist/presentation/StageItem.d.ts +37 -0
  363. package/dist/presentation/StageItem.js +211 -0
  364. package/dist/presentation/StageItem.js.map +7 -0
  365. package/dist/presentation/box-style.d.ts +6 -0
  366. package/dist/presentation/box-style.js +19 -0
  367. package/dist/presentation/box-style.js.map +7 -0
  368. package/dist/presentation/boxes.d.ts +105 -0
  369. package/dist/presentation/boxes.js +103 -0
  370. package/dist/presentation/boxes.js.map +7 -0
  371. package/dist/presentation/draw-boxes.d.ts +8 -0
  372. package/dist/presentation/draw-boxes.js +130 -0
  373. package/dist/presentation/draw-boxes.js.map +7 -0
  374. package/dist/presentation/export-boxes.d.ts +10 -0
  375. package/dist/presentation/export-boxes.js +74 -0
  376. package/dist/presentation/export-boxes.js.map +7 -0
  377. package/dist/presentation/export-pptx.d.ts +16 -0
  378. package/dist/presentation/export-pptx.js +194 -0
  379. package/dist/presentation/export-pptx.js.map +7 -0
  380. package/dist/presentation/import-pptx.d.ts +35 -0
  381. package/dist/presentation/import-pptx.js +659 -0
  382. package/dist/presentation/import-pptx.js.map +7 -0
  383. package/dist/presentation/merge-outside-edits.d.ts +12 -0
  384. package/dist/presentation/merge-outside-edits.js +35 -0
  385. package/dist/presentation/merge-outside-edits.js.map +7 -0
  386. package/dist/presentation/model.d.ts +201 -0
  387. package/dist/presentation/model.js +271 -0
  388. package/dist/presentation/model.js.map +7 -0
  389. package/dist/presentation/panel-id.d.ts +34 -0
  390. package/dist/presentation/panel-id.js +24 -0
  391. package/dist/presentation/panel-id.js.map +7 -0
  392. package/dist/presentation/persistence.d.ts +121 -0
  393. package/dist/presentation/persistence.js +141 -0
  394. package/dist/presentation/persistence.js.map +7 -0
  395. package/dist/presentation/pptx-data.d.ts +22 -0
  396. package/dist/presentation/pptx-data.js +83 -0
  397. package/dist/presentation/pptx-data.js.map +7 -0
  398. package/dist/presentation/pptx-xml.d.ts +90 -0
  399. package/dist/presentation/pptx-xml.js +333 -0
  400. package/dist/presentation/pptx-xml.js.map +7 -0
  401. package/dist/presentation/render-slides.d.ts +58 -0
  402. package/dist/presentation/render-slides.js +309 -0
  403. package/dist/presentation/render-slides.js.map +7 -0
  404. package/dist/presentation/saved-boxes.d.ts +11 -0
  405. package/dist/presentation/saved-boxes.js +80 -0
  406. package/dist/presentation/saved-boxes.js.map +7 -0
  407. package/dist/presentation/slide-layout.d.ts +54 -0
  408. package/dist/presentation/slide-layout.js +117 -0
  409. package/dist/presentation/slide-layout.js.map +7 -0
  410. package/dist/presentation/stage-videos.d.ts +5 -0
  411. package/dist/presentation/stage-videos.js +19 -0
  412. package/dist/presentation/stage-videos.js.map +7 -0
  413. package/dist/presentation/store.d.ts +203 -0
  414. package/dist/presentation/store.js +429 -0
  415. package/dist/presentation/store.js.map +7 -0
  416. package/dist/presentation/theme.d.ts +102 -0
  417. package/dist/presentation/theme.js +276 -0
  418. package/dist/presentation/theme.js.map +7 -0
  419. package/dist/presentation/useClipDrag.d.ts +26 -0
  420. package/dist/presentation/useClipDrag.js +65 -0
  421. package/dist/presentation/useClipDrag.js.map +7 -0
  422. package/dist/presentation/useObjectUrl.d.ts +6 -0
  423. package/dist/presentation/useObjectUrl.js +15 -0
  424. package/dist/presentation/useObjectUrl.js.map +7 -0
  425. package/dist/presentation/usePresenterKeys.d.ts +13 -0
  426. package/dist/presentation/usePresenterKeys.js +62 -0
  427. package/dist/presentation/usePresenterKeys.js.map +7 -0
  428. package/dist/settings/index.cjs +151 -150
  429. package/dist/shell/PanelPortal.js +1 -0
  430. package/dist/shell/PanelPortal.js.map +2 -2
  431. package/dist/shell/index.cjs +112 -110
  432. package/dist/shell/panel-windows.d.ts +2 -0
  433. package/dist/shell/panel-windows.js +7 -2
  434. package/dist/shell/panel-windows.js.map +2 -2
  435. package/dist/studio/index.cjs +28 -26
  436. package/dist/studio/index.cjs.map +1 -1
  437. package/dist/styles.css +1 -1
  438. package/dist/workflow-canvas/index.cjs +58 -57
  439. package/dist/workflow-canvas/index.cjs.map +1 -1
  440. package/node_modules/@arbidocs/coedit/package.json +1 -1
  441. package/package.json +6 -5
  442. package/dist/ConnectedCallDock-WER7R222.cjs.map +0 -1
  443. package/dist/DocumentReviewCard-ZSBZBGFK.cjs.map +0 -1
  444. package/dist/FilesViewerDialog-6UKR5WEF.cjs.map +0 -1
  445. package/dist/GridViewImpl-ZMJJWTOM.cjs.map +0 -1
  446. package/dist/WorkspaceTableView-J3C6VH4T.cjs.map +0 -1
  447. package/dist/ai-IM4A23YT.cjs.map +0 -1
  448. package/dist/chunk-557MJ4IH.cjs.map +0 -1
  449. package/dist/chunk-6UTKM5AB.cjs.map +0 -1
  450. package/dist/chunk-6WMMZLEV.cjs.map +0 -1
  451. package/dist/chunk-B3LZITVF.cjs.map +0 -1
  452. package/dist/chunk-CPG7II4E.cjs.map +0 -1
  453. package/dist/chunk-CPR6EHG7.cjs.map +0 -1
  454. package/dist/chunk-DDIW4HLU.cjs.map +0 -1
  455. package/dist/chunk-NJCK6V6U.cjs.map +0 -1
  456. package/dist/chunk-NNUK5ZM7.cjs.map +0 -1
  457. package/dist/chunk-PGJYD67F.cjs.map +0 -1
  458. package/dist/chunk-R7CJEIA5.cjs.map +0 -1
  459. package/dist/chunk-SB4M3ITT.cjs.map +0 -1
  460. package/dist/chunk-TT4IF52H.cjs.map +0 -1
  461. package/dist/chunk-VLCY46K6.cjs.map +0 -1
  462. package/dist/chunk-YYPZOEED.cjs.map +0 -1
  463. package/dist/chunk-ZPPMAL5P.cjs.map +0 -1
@@ -0,0 +1,232 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ forwardRef,
5
+ memo,
6
+ useEffect,
7
+ useImperativeHandle,
8
+ useMemo,
9
+ useRef,
10
+ useState
11
+ } from "react";
12
+ import { cn } from "@arbidocs/react/ui";
13
+ import { ClipActionBar } from "./ClipActionBar.js";
14
+ import { SlideDecor } from "./SlideDecor.js";
15
+ import { StageItem } from "./StageItem.js";
16
+ import { StageBox } from "./StageBox.js";
17
+ import { BoxActionBar } from "./BoxActionBar.js";
18
+ import { FONTS, backgroundCss, slideBackgroundCss } from "./theme.js";
19
+ import { clipLabel } from "./model.js";
20
+ import { usePresentation } from "./store.js";
21
+ import { DROP_ATTRIBUTE } from "./useClipDrag.js";
22
+ const GuideLayer = memo(
23
+ forwardRef(function GuideLayer2(_, ref) {
24
+ const [guides, setGuides] = useState([]);
25
+ useImperativeHandle(ref, () => ({ set: setGuides }), []);
26
+ return /* @__PURE__ */ jsx(Fragment, { children: guides.map((guide) => /* @__PURE__ */ jsx(
27
+ "div",
28
+ {
29
+ className: "pointer-events-none absolute z-10 bg-primary",
30
+ style: guide.axis === "x" ? { left: `${guide.at * 100}%`, top: 0, bottom: 0, width: 1 } : { top: `${guide.at * 100}%`, left: 0, right: 0, height: 1 },
31
+ "data-testid": `stage-guide-${guide.axis}`
32
+ },
33
+ `${guide.axis}-${guide.at}`
34
+ )) });
35
+ })
36
+ );
37
+ function PresentationStage({
38
+ editable = false,
39
+ slideIndex,
40
+ selected = null,
41
+ onSelect,
42
+ onEditImage,
43
+ onCropImage,
44
+ textEditing,
45
+ overlay,
46
+ className
47
+ }) {
48
+ const index = usePresentation((s) => slideIndex ?? s.current);
49
+ const slide = usePresentation((s) => s.slides[index]);
50
+ const clips = usePresentation((s) => s.clips);
51
+ const blank = usePresentation((s) => s.blank && !editable);
52
+ const captions = usePresentation((s) => s.captions);
53
+ const columnValues = usePresentation((s) => s.columnValues);
54
+ const theme = usePresentation((s) => s.theme);
55
+ const logoImage = usePresentation((s) => s.logoImage);
56
+ const media = usePresentation((s) => s.media);
57
+ const stageRef = useRef(null);
58
+ const guideLayer = useRef(null);
59
+ const dropping = usePresentation((s) => editable && s.dragging !== null);
60
+ const [dragging, setDragging] = useState(false);
61
+ const latest = useRef({ slide, clips, index, onSelect });
62
+ latest.current = { slide, clips, index, onSelect };
63
+ const host = useMemo(
64
+ () => ({
65
+ stageBox: () => stageRef.current?.getBoundingClientRect() ?? null,
66
+ others: (clipId) => {
67
+ const { slide: current, clips: all } = latest.current;
68
+ return (current?.items ?? []).filter((item) => item.clipId !== clipId).map((item) => ({
69
+ frame: item.frame,
70
+ aspect: all.find((clip) => clip.id === item.clipId)?.aspect ?? 1
71
+ }));
72
+ },
73
+ select: (clipId) => {
74
+ usePresentation.getState().goTo(latest.current.index);
75
+ latest.current.onSelect?.(clipId);
76
+ },
77
+ guides: (guides) => guideLayer.current?.set(guides),
78
+ dragging: setDragging,
79
+ commit: (clipId, frame, shape) => {
80
+ const state = usePresentation.getState();
81
+ state.goTo(latest.current.index);
82
+ if (shape) state.reshapeClip(clipId, frame, shape.rect, shape.aspect);
83
+ else state.setFrame(clipId, frame);
84
+ }
85
+ }),
86
+ []
87
+ );
88
+ const boxHost = useMemo(
89
+ () => ({
90
+ stageBox: () => stageRef.current?.getBoundingClientRect() ?? null,
91
+ select: (boxId) => {
92
+ usePresentation.getState().goTo(latest.current.index);
93
+ latest.current.onSelect?.(boxId);
94
+ },
95
+ commit: (boxId, frame) => usePresentation.getState().updateBox(boxId, (box) => ({ ...box, frame })),
96
+ setText: (boxId, text) => usePresentation.getState().setBoxText(boxId, text)
97
+ }),
98
+ []
99
+ );
100
+ const font = FONTS[theme.font].css;
101
+ const boxes = slide?.boxes ?? [];
102
+ const selectedBox = selected ? boxes.find((box) => box.id === selected) : void 0;
103
+ const renderBoxes = (front) => boxes.filter((box) => !!box.front === front).map((box) => /* @__PURE__ */ jsx(
104
+ StageBox,
105
+ {
106
+ box,
107
+ font,
108
+ editable,
109
+ selected: editable && selected === box.id,
110
+ host: boxHost
111
+ },
112
+ box.id
113
+ ));
114
+ const clipOf = (id) => clips.find((clip) => clip.id === id);
115
+ const selectedFrame = selected ? slide?.items.find((item) => item.clipId === selected)?.frame : void 0;
116
+ useEffect(() => {
117
+ const stage = stageRef.current;
118
+ const view = stage?.ownerDocument.defaultView;
119
+ if (!editable || !selected || !stage || !view) return;
120
+ let sum = { x: 0, y: 0 };
121
+ let request = null;
122
+ const onWheel = (event) => {
123
+ const item = event.target?.closest?.(
124
+ `[data-testid="stage-item-${selected}"]`
125
+ );
126
+ const clip = usePresentation.getState().clips.find((entry) => entry.id === selected);
127
+ if (!item || !clip) return;
128
+ event.preventDefault();
129
+ const box = item.getBoundingClientRect();
130
+ const horizontal = event.shiftKey && !event.deltaX;
131
+ const deltaX = horizontal ? event.deltaY : event.deltaX;
132
+ const deltaY = horizontal ? 0 : event.deltaY;
133
+ sum = {
134
+ x: sum.x + deltaX / box.width * clip.rect.w,
135
+ y: sum.y + deltaY / box.height * clip.rect.h
136
+ };
137
+ request ??= view.requestAnimationFrame(() => {
138
+ request = null;
139
+ usePresentation.getState().panClip(selected, sum.x, sum.y);
140
+ sum = { x: 0, y: 0 };
141
+ });
142
+ };
143
+ stage.addEventListener("wheel", onWheel, { passive: false });
144
+ return () => {
145
+ stage.removeEventListener("wheel", onWheel);
146
+ if (request !== null) view.cancelAnimationFrame(request);
147
+ };
148
+ }, [editable, selected]);
149
+ return /* @__PURE__ */ jsx(
150
+ "div",
151
+ {
152
+ className: cn("relative h-full w-full", !editable && "overflow-hidden bg-black", className),
153
+ style: { containerType: "size" },
154
+ "data-testid": editable ? "presentation-stage-editor" : "presentation-stage",
155
+ children: /* @__PURE__ */ jsxs(
156
+ "div",
157
+ {
158
+ ref: stageRef,
159
+ className: cn(
160
+ "absolute inset-0 m-auto",
161
+ editable ? "shadow-md" : "overflow-hidden",
162
+ dropping && "outline outline-2 outline-offset-2 outline-primary"
163
+ ),
164
+ style: {
165
+ width: "min(100cqw, calc(100cqh * 16 / 9))",
166
+ height: "min(100cqh, calc(100cqw * 9 / 16))",
167
+ containerType: "inline-size",
168
+ background: slide?.background ? slideBackgroundCss(slide.background, media) : backgroundCss(theme.background),
169
+ fontFamily: FONTS[theme.font].css
170
+ },
171
+ onPointerDown: () => {
172
+ if (!editable) return;
173
+ usePresentation.getState().goTo(index);
174
+ onSelect?.(null);
175
+ },
176
+ ...editable ? { [DROP_ATTRIBUTE]: "stage", "data-slide-index": index } : {},
177
+ "aria-label": `Slide ${index + 1}`,
178
+ children: [
179
+ blank && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 z-20 bg-black" }),
180
+ slide && /* @__PURE__ */ jsx(
181
+ SlideDecor,
182
+ {
183
+ slide,
184
+ theme,
185
+ labels: captions,
186
+ logoImage,
187
+ editable,
188
+ editing: textEditing
189
+ }
190
+ ),
191
+ renderBoxes(false),
192
+ slide?.items.map((item) => {
193
+ const clip = clipOf(item.clipId);
194
+ if (!clip) return null;
195
+ return /* @__PURE__ */ jsx(
196
+ StageItem,
197
+ {
198
+ clip,
199
+ frame: item.frame,
200
+ editable,
201
+ selected: editable && selected === clip.id,
202
+ dim: false,
203
+ label: captions ? clipLabel(clip, columnValues) : "",
204
+ host
205
+ },
206
+ clip.id
207
+ );
208
+ }),
209
+ renderBoxes(true),
210
+ editable && /* @__PURE__ */ jsx(GuideLayer, { ref: guideLayer }),
211
+ editable && selectedFrame && selected && !dragging && /* @__PURE__ */ jsx(
212
+ ClipActionBar,
213
+ {
214
+ clipId: selected,
215
+ at: selectedFrame,
216
+ onRemoved: () => onSelect?.(null),
217
+ onEditImage: onEditImage && clipOf(selected)?.kind === "image" ? () => onEditImage(selected) : void 0,
218
+ onCropImage: onCropImage && clipOf(selected)?.kind === "image" ? () => onCropImage(selected) : void 0
219
+ }
220
+ ),
221
+ editable && selectedBox && /* @__PURE__ */ jsx(BoxActionBar, { box: selectedBox, onRemoved: () => onSelect?.(null) }),
222
+ overlay
223
+ ]
224
+ }
225
+ )
226
+ }
227
+ );
228
+ }
229
+ export {
230
+ PresentationStage
231
+ };
232
+ //# sourceMappingURL=PresentationStage.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/presentation/PresentationStage.tsx"],
4
+ "sourcesContent": ["/**\n * The 16:9 stage: a slide's clips in their frames, its title, points and logo, as large as the\n * container allows. Presenting shows it bare; the editor's copy is `editable`: each clip\n * (`StageItem`) is moved, resized and reshaped by dragging, snapping with guide lines; clips are\n * selected for their floating actions, and clips dragged from the tray are dropped onto it.\n *\n * A slide's stage re-renders only when its slide (or the clips, theme or labels) change; a clip's\n * drag re-renders nothing here but the guides and, at its start and end, the floating actions.\n */\n\nimport {\n forwardRef,\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ClipActionBar } from './ClipActionBar'\nimport { SlideDecor, type SlideTextEditing } from './SlideDecor'\nimport { StageItem, type StageItemHost } from './StageItem'\nimport { StageBox, type StageBoxHost } from './StageBox'\nimport { BoxActionBar } from './BoxActionBar'\nimport { FONTS, backgroundCss, slideBackgroundCss } from './theme'\nimport { clipLabel, type Clip, type Frame, type Guide } from './model'\nimport { usePresentation } from './store'\nimport { DROP_ATTRIBUTE } from './useClipDrag'\n\nexport interface PresentationStageProps {\n editable?: boolean\n /** The slide shown (default: the current one). */\n slideIndex?: number\n selected?: string | null\n onSelect?: (clipId: string | null) => void\n /** Offered on a selected image clip: make a new version of it. */\n onEditImage?: (clipId: string) => void\n /** Offered on a selected image clip: choose the part of the image it shows. */\n onCropImage?: (clipId: string) => void\n /** Typing the slide's title and points on the slide itself (the editor's stages). */\n textEditing?: SlideTextEditing\n /** Over the slide (e.g. the editor's hover actions). */\n overlay?: ReactNode\n className?: string\n}\n\nexport interface GuideLayerHandle {\n set(guides: Guide[]): void\n}\n\n/** The snap lines of a dragged clip: its own state, so drawing them re-renders nothing else. */\nconst GuideLayer = memo(\n forwardRef<GuideLayerHandle>(function GuideLayer(_, ref) {\n const [guides, setGuides] = useState<Guide[]>([])\n useImperativeHandle(ref, () => ({ set: setGuides }), [])\n return (\n <>\n {guides.map((guide) => (\n <div\n key={`${guide.axis}-${guide.at}`}\n className=\"pointer-events-none absolute z-10 bg-primary\"\n style={\n guide.axis === 'x'\n ? { left: `${guide.at * 100}%`, top: 0, bottom: 0, width: 1 }\n : { top: `${guide.at * 100}%`, left: 0, right: 0, height: 1 }\n }\n data-testid={`stage-guide-${guide.axis}`}\n />\n ))}\n </>\n )\n })\n)\n\nexport function PresentationStage({\n editable = false,\n slideIndex,\n selected = null,\n onSelect,\n onEditImage,\n onCropImage,\n textEditing,\n overlay,\n className,\n}: PresentationStageProps) {\n const index = usePresentation((s) => slideIndex ?? s.current)\n const slide = usePresentation((s) => s.slides[index])\n const clips = usePresentation((s) => s.clips)\n const blank = usePresentation((s) => s.blank && !editable)\n const captions = usePresentation((s) => s.captions)\n const columnValues = usePresentation((s) => s.columnValues)\n const theme = usePresentation((s) => s.theme)\n const logoImage = usePresentation((s) => s.logoImage)\n const media = usePresentation((s) => s.media)\n const stageRef = useRef<HTMLDivElement>(null)\n const guideLayer = useRef<GuideLayerHandle>(null)\n // A clip dragged from the tray: the stage shows it can take it.\n const dropping = usePresentation((s) => editable && s.dragging !== null)\n // A clip being dragged on the stage: its floating actions hide meanwhile.\n const [dragging, setDragging] = useState(false)\n\n // The latest values the clips' gestures read as they begin (the host itself never changes).\n const latest = useRef({ slide, clips, index, onSelect })\n latest.current = { slide, clips, index, onSelect }\n const host = useMemo<StageItemHost>(\n () => ({\n stageBox: () => stageRef.current?.getBoundingClientRect() ?? null,\n others: (clipId) => {\n const { slide: current, clips: all } = latest.current\n return (current?.items ?? [])\n .filter((item) => item.clipId !== clipId)\n .map((item) => ({\n frame: item.frame,\n aspect: all.find((clip) => clip.id === item.clipId)?.aspect ?? 1,\n }))\n },\n select: (clipId) => {\n usePresentation.getState().goTo(latest.current.index)\n latest.current.onSelect?.(clipId)\n },\n guides: (guides) => guideLayer.current?.set(guides),\n dragging: setDragging,\n commit: (clipId: string, frame: Frame, shape?: Pick<Clip, 'rect' | 'aspect'>) => {\n const state = usePresentation.getState()\n state.goTo(latest.current.index)\n if (shape) state.reshapeClip(clipId, frame, shape.rect, shape.aspect)\n else state.setFrame(clipId, frame)\n },\n }),\n []\n )\n\n const boxHost = useMemo<StageBoxHost>(\n () => ({\n stageBox: () => stageRef.current?.getBoundingClientRect() ?? null,\n select: (boxId) => {\n usePresentation.getState().goTo(latest.current.index)\n latest.current.onSelect?.(boxId)\n },\n commit: (boxId, frame) =>\n usePresentation.getState().updateBox(boxId, (box) => ({ ...box, frame })),\n setText: (boxId, text) => usePresentation.getState().setBoxText(boxId, text),\n }),\n []\n )\n const font = FONTS[theme.font].css\n const boxes = slide?.boxes ?? []\n const selectedBox = selected ? boxes.find((box) => box.id === selected) : undefined\n const renderBoxes = (front: boolean) =>\n boxes\n .filter((box) => !!box.front === front)\n .map((box) => (\n <StageBox\n key={box.id}\n box={box}\n font={font}\n editable={editable}\n selected={editable && selected === box.id}\n host={boxHost}\n />\n ))\n\n const clipOf = (id: string): Clip | undefined => clips.find((clip) => clip.id === id)\n const selectedFrame = selected\n ? slide?.items.find((item) => item.clipId === selected)?.frame\n : undefined\n\n // Scrolling over the selected clip (wheel or trackpad; Shift for sideways) scrolls what it shows\n // over its source: the lines above or below, say. A native listener, so the editor itself does\n // not scroll; steps are gathered and applied once per animation frame.\n useEffect(() => {\n const stage = stageRef.current\n const view = stage?.ownerDocument.defaultView\n if (!editable || !selected || !stage || !view) return\n let sum = { x: 0, y: 0 }\n let request: number | null = null\n const onWheel = (event: WheelEvent) => {\n const item = (event.target as Element | null)?.closest?.(\n `[data-testid=\"stage-item-${selected}\"]`\n )\n const clip = usePresentation.getState().clips.find((entry) => entry.id === selected)\n if (!item || !clip) return\n event.preventDefault()\n const box = item.getBoundingClientRect()\n const horizontal = event.shiftKey && !event.deltaX\n const deltaX = horizontal ? event.deltaY : event.deltaX\n const deltaY = horizontal ? 0 : event.deltaY\n // Screen pixels to fractions of the source: the clip's area spans the clip's box.\n sum = {\n x: sum.x + (deltaX / box.width) * clip.rect.w,\n y: sum.y + (deltaY / box.height) * clip.rect.h,\n }\n request ??= view.requestAnimationFrame(() => {\n request = null\n usePresentation.getState().panClip(selected, sum.x, sum.y)\n sum = { x: 0, y: 0 }\n })\n }\n stage.addEventListener('wheel', onWheel, { passive: false })\n return () => {\n stage.removeEventListener('wheel', onWheel)\n if (request !== null) view.cancelAnimationFrame(request)\n }\n }, [editable, selected])\n\n return (\n <div\n className={cn('relative h-full w-full', !editable && 'overflow-hidden bg-black', className)}\n // The stage's size comes from this box's (container query units): 16:9, as large as fits.\n style={{ containerType: 'size' }}\n data-testid={editable ? 'presentation-stage-editor' : 'presentation-stage'}\n >\n <div\n ref={stageRef}\n className={cn(\n 'absolute inset-0 m-auto',\n editable ? 'shadow-md' : 'overflow-hidden',\n dropping && 'outline outline-2 outline-offset-2 outline-primary'\n )}\n style={{\n width: 'min(100cqw, calc(100cqh * 16 / 9))',\n height: 'min(100cqh, calc(100cqw * 9 / 16))',\n containerType: 'inline-size',\n background: slide?.background\n ? slideBackgroundCss(slide.background, media)\n : backgroundCss(theme.background),\n fontFamily: FONTS[theme.font].css,\n }}\n onPointerDown={() => {\n if (!editable) return\n usePresentation.getState().goTo(index)\n onSelect?.(null)\n }}\n {...(editable ? { [DROP_ATTRIBUTE]: 'stage', 'data-slide-index': index } : {})}\n aria-label={`Slide ${index + 1}`}\n >\n {/* Blanked: the shared stage is black. */}\n {blank && <div className=\"absolute inset-0 z-20 bg-black\" />}\n {/* The title, points and logo, by the slide's layout. */}\n {slide && (\n <SlideDecor\n slide={slide}\n theme={theme}\n labels={captions}\n logoImage={logoImage}\n editable={editable}\n editing={textEditing}\n />\n )}\n {renderBoxes(false)}\n {slide?.items.map((item) => {\n const clip = clipOf(item.clipId)\n if (!clip) return null\n return (\n <StageItem\n key={clip.id}\n clip={clip}\n frame={item.frame}\n editable={editable}\n selected={editable && selected === clip.id}\n dim={false}\n label={captions ? clipLabel(clip, columnValues) : ''}\n host={host}\n />\n )\n })}\n {renderBoxes(true)}\n {/* Smart guides: the lines the dragged clip snapped to (editor only). */}\n {editable && <GuideLayer ref={guideLayer} />}\n {/* The selected clip's floating actions, above it (the stage leaves room). */}\n {editable && selectedFrame && selected && !dragging && (\n <ClipActionBar\n clipId={selected}\n at={selectedFrame}\n onRemoved={() => onSelect?.(null)}\n onEditImage={\n onEditImage && clipOf(selected)?.kind === 'image'\n ? () => onEditImage(selected)\n : undefined\n }\n onCropImage={\n onCropImage && clipOf(selected)?.kind === 'image'\n ? () => onCropImage(selected)\n : undefined\n }\n />\n )}\n {editable && selectedBox && (\n <BoxActionBar box={selectedBox} onRemoved={() => onSelect?.(null)} />\n )}\n {overlay}\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": ";AA0DM,mBAEI,KA0JJ,YA5JA;AAhDN;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,UAAU;AACnB,SAAS,qBAAqB;AAC9B,SAAS,kBAAyC;AAClD,SAAS,iBAAqC;AAC9C,SAAS,gBAAmC;AAC5C,SAAS,oBAAoB;AAC7B,SAAS,OAAO,eAAe,0BAA0B;AACzD,SAAS,iBAAoD;AAC7D,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAwB/B,MAAM,aAAa;AAAA,EACjB,WAA6B,SAASA,YAAW,GAAG,KAAK;AACvD,UAAM,CAAC,QAAQ,SAAS,IAAI,SAAkB,CAAC,CAAC;AAChD,wBAAoB,KAAK,OAAO,EAAE,KAAK,UAAU,IAAI,CAAC,CAAC;AACvD,WACE,gCACG,iBAAO,IAAI,CAAC,UACX;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,OACE,MAAM,SAAS,MACX,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,KAAK,KAAK,GAAG,QAAQ,GAAG,OAAO,EAAE,IAC1D,EAAE,KAAK,GAAG,MAAM,KAAK,GAAG,KAAK,MAAM,GAAG,OAAO,GAAG,QAAQ,EAAE;AAAA,QAEhE,eAAa,eAAe,MAAM,IAAI;AAAA;AAAA,MAPjC,GAAG,MAAM,IAAI,IAAI,MAAM,EAAE;AAAA,IAQhC,CACD,GACH;AAAA,EAEJ,CAAC;AACH;AAEO,SAAS,kBAAkB;AAAA,EAChC,WAAW;AAAA,EACX;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,QAAQ,gBAAgB,CAAC,MAAM,cAAc,EAAE,OAAO;AAC5D,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC;AACpD,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,KAAK;AAC5C,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ;AACzD,QAAM,WAAW,gBAAgB,CAAC,MAAM,EAAE,QAAQ;AAClD,QAAM,eAAe,gBAAgB,CAAC,MAAM,EAAE,YAAY;AAC1D,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,KAAK;AAC5C,QAAM,YAAY,gBAAgB,CAAC,MAAM,EAAE,SAAS;AACpD,QAAM,QAAQ,gBAAgB,CAAC,MAAM,EAAE,KAAK;AAC5C,QAAM,WAAW,OAAuB,IAAI;AAC5C,QAAM,aAAa,OAAyB,IAAI;AAEhD,QAAM,WAAW,gBAAgB,CAAC,MAAM,YAAY,EAAE,aAAa,IAAI;AAEvE,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAG9C,QAAM,SAAS,OAAO,EAAE,OAAO,OAAO,OAAO,SAAS,CAAC;AACvD,SAAO,UAAU,EAAE,OAAO,OAAO,OAAO,SAAS;AACjD,QAAM,OAAO;AAAA,IACX,OAAO;AAAA,MACL,UAAU,MAAM,SAAS,SAAS,sBAAsB,KAAK;AAAA,MAC7D,QAAQ,CAAC,WAAW;AAClB,cAAM,EAAE,OAAO,SAAS,OAAO,IAAI,IAAI,OAAO;AAC9C,gBAAQ,SAAS,SAAS,CAAC,GACxB,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM,EACvC,IAAI,CAAC,UAAU;AAAA,UACd,OAAO,KAAK;AAAA,UACZ,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,MAAM,GAAG,UAAU;AAAA,QACjE,EAAE;AAAA,MACN;AAAA,MACA,QAAQ,CAAC,WAAW;AAClB,wBAAgB,SAAS,EAAE,KAAK,OAAO,QAAQ,KAAK;AACpD,eAAO,QAAQ,WAAW,MAAM;AAAA,MAClC;AAAA,MACA,QAAQ,CAAC,WAAW,WAAW,SAAS,IAAI,MAAM;AAAA,MAClD,UAAU;AAAA,MACV,QAAQ,CAAC,QAAgB,OAAc,UAA0C;AAC/E,cAAM,QAAQ,gBAAgB,SAAS;AACvC,cAAM,KAAK,OAAO,QAAQ,KAAK;AAC/B,YAAI,MAAO,OAAM,YAAY,QAAQ,OAAO,MAAM,MAAM,MAAM,MAAM;AAAA,YAC/D,OAAM,SAAS,QAAQ,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,UAAU;AAAA,IACd,OAAO;AAAA,MACL,UAAU,MAAM,SAAS,SAAS,sBAAsB,KAAK;AAAA,MAC7D,QAAQ,CAAC,UAAU;AACjB,wBAAgB,SAAS,EAAE,KAAK,OAAO,QAAQ,KAAK;AACpD,eAAO,QAAQ,WAAW,KAAK;AAAA,MACjC;AAAA,MACA,QAAQ,CAAC,OAAO,UACd,gBAAgB,SAAS,EAAE,UAAU,OAAO,CAAC,SAAS,EAAE,GAAG,KAAK,MAAM,EAAE;AAAA,MAC1E,SAAS,CAAC,OAAO,SAAS,gBAAgB,SAAS,EAAE,WAAW,OAAO,IAAI;AAAA,IAC7E;AAAA,IACA,CAAC;AAAA,EACH;AACA,QAAM,OAAO,MAAM,MAAM,IAAI,EAAE;AAC/B,QAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,QAAM,cAAc,WAAW,MAAM,KAAK,CAAC,QAAQ,IAAI,OAAO,QAAQ,IAAI;AAC1E,QAAM,cAAc,CAAC,UACnB,MACG,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,UAAU,KAAK,EACrC,IAAI,CAAC,QACJ;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,YAAY,aAAa,IAAI;AAAA,MACvC,MAAM;AAAA;AAAA,IALD,IAAI;AAAA,EAMX,CACD;AAEL,QAAM,SAAS,CAAC,OAAiC,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACpF,QAAM,gBAAgB,WAClB,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,QAAQ,GAAG,QACvD;AAKJ,YAAU,MAAM;AACd,UAAM,QAAQ,SAAS;AACvB,UAAM,OAAO,OAAO,cAAc;AAClC,QAAI,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,KAAM;AAC/C,QAAI,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE;AACvB,QAAI,UAAyB;AAC7B,UAAM,UAAU,CAAC,UAAsB;AACrC,YAAM,OAAQ,MAAM,QAA2B;AAAA,QAC7C,4BAA4B,QAAQ;AAAA,MACtC;AACA,YAAM,OAAO,gBAAgB,SAAS,EAAE,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,QAAQ;AACnF,UAAI,CAAC,QAAQ,CAAC,KAAM;AACpB,YAAM,eAAe;AACrB,YAAM,MAAM,KAAK,sBAAsB;AACvC,YAAM,aAAa,MAAM,YAAY,CAAC,MAAM;AAC5C,YAAM,SAAS,aAAa,MAAM,SAAS,MAAM;AACjD,YAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,YAAM;AAAA,QACJ,GAAG,IAAI,IAAK,SAAS,IAAI,QAAS,KAAK,KAAK;AAAA,QAC5C,GAAG,IAAI,IAAK,SAAS,IAAI,SAAU,KAAK,KAAK;AAAA,MAC/C;AACA,kBAAY,KAAK,sBAAsB,MAAM;AAC3C,kBAAU;AACV,wBAAgB,SAAS,EAAE,QAAQ,UAAU,IAAI,GAAG,IAAI,CAAC;AACzD,cAAM,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,MACrB,CAAC;AAAA,IACH;AACA,UAAM,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;AAC3D,WAAO,MAAM;AACX,YAAM,oBAAoB,SAAS,OAAO;AAC1C,UAAI,YAAY,KAAM,MAAK,qBAAqB,OAAO;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,UAAU,QAAQ,CAAC;AAEvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,0BAA0B,CAAC,YAAY,4BAA4B,SAAS;AAAA,MAE1F,OAAO,EAAE,eAAe,OAAO;AAAA,MAC/B,eAAa,WAAW,8BAA8B;AAAA,MAEtD;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAW;AAAA,YACT;AAAA,YACA,WAAW,cAAc;AAAA,YACzB,YAAY;AAAA,UACd;AAAA,UACA,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,eAAe;AAAA,YACf,YAAY,OAAO,aACf,mBAAmB,MAAM,YAAY,KAAK,IAC1C,cAAc,MAAM,UAAU;AAAA,YAClC,YAAY,MAAM,MAAM,IAAI,EAAE;AAAA,UAChC;AAAA,UACA,eAAe,MAAM;AACnB,gBAAI,CAAC,SAAU;AACf,4BAAgB,SAAS,EAAE,KAAK,KAAK;AACrC,uBAAW,IAAI;AAAA,UACjB;AAAA,UACC,GAAI,WAAW,EAAE,CAAC,cAAc,GAAG,SAAS,oBAAoB,MAAM,IAAI,CAAC;AAAA,UAC5E,cAAY,SAAS,QAAQ,CAAC;AAAA,UAG7B;AAAA,qBAAS,oBAAC,SAAI,WAAU,kCAAiC;AAAA,YAEzD,SACC;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA,SAAS;AAAA;AAAA,YACX;AAAA,YAED,YAAY,KAAK;AAAA,YACjB,OAAO,MAAM,IAAI,CAAC,SAAS;AAC1B,oBAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,kBAAI,CAAC,KAAM,QAAO;AAClB,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC;AAAA,kBACA,OAAO,KAAK;AAAA,kBACZ;AAAA,kBACA,UAAU,YAAY,aAAa,KAAK;AAAA,kBACxC,KAAK;AAAA,kBACL,OAAO,WAAW,UAAU,MAAM,YAAY,IAAI;AAAA,kBAClD;AAAA;AAAA,gBAPK,KAAK;AAAA,cAQZ;AAAA,YAEJ,CAAC;AAAA,YACA,YAAY,IAAI;AAAA,YAEhB,YAAY,oBAAC,cAAW,KAAK,YAAY;AAAA,YAEzC,YAAY,iBAAiB,YAAY,CAAC,YACzC;AAAA,cAAC;AAAA;AAAA,gBACC,QAAQ;AAAA,gBACR,IAAI;AAAA,gBACJ,WAAW,MAAM,WAAW,IAAI;AAAA,gBAChC,aACE,eAAe,OAAO,QAAQ,GAAG,SAAS,UACtC,MAAM,YAAY,QAAQ,IAC1B;AAAA,gBAEN,aACE,eAAe,OAAO,QAAQ,GAAG,SAAS,UACtC,MAAM,YAAY,QAAQ,IAC1B;AAAA;AAAA,YAER;AAAA,YAED,YAAY,eACX,oBAAC,gBAAa,KAAK,aAAa,WAAW,MAAM,WAAW,IAAI,GAAG;AAAA,YAEpE;AAAA;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;",
6
+ "names": ["GuideLayer"]
7
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The presentation in a window of its own, in one of two modes.
3
+ *
4
+ * Present: nothing but the stage on black, no controls and no pointer: what is shared in a call or
5
+ * shown on a projector. Keys drive it (arrows / Page Up / Page Down change slide, B blanks, F or
6
+ * double-click toggles full screen, Space plays videos, Escape stops presenting).
7
+ *
8
+ * Edit: the slides editor (`SlidesEditor`), the same as in the viewer's tab, when the presentation
9
+ * is edited in its own window (beside the document its clips come from).
10
+ */
11
+ import { type SlidesEditorProps } from './SlidesEditor';
12
+ export type PresenterViewProps = Omit<SlidesEditorProps, 'onPresent'> & {
13
+ /** Present (default: here, in this window). */
14
+ onPresent?: () => void;
15
+ };
16
+ export declare function PresenterView({ onPresent, ...editor }: PresenterViewProps): import("react").JSX.Element;
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useState } from "react";
4
+ import { PresentationStage } from "./PresentationStage.js";
5
+ import { SlidesEditor } from "./SlidesEditor.js";
6
+ import { STAGE_ASPECT } from "./model.js";
7
+ import { usePresentation } from "./store.js";
8
+ import { toggleFullscreen, usePresenterKeys } from "./usePresenterKeys.js";
9
+ const PRESENT_WIDTH = 1280;
10
+ function useStageShapedWindow(view, presenting) {
11
+ useEffect(() => {
12
+ if (!view || !presenting || !view.opener) return;
13
+ const before = { width: view.outerWidth, height: view.outerHeight };
14
+ const chromeWidth = view.outerWidth - view.innerWidth;
15
+ const chromeHeight = view.outerHeight - view.innerHeight;
16
+ const width = Math.max(
17
+ view.innerWidth,
18
+ Math.min(PRESENT_WIDTH, Math.round((view.screen.availWidth - chromeWidth) * 0.6))
19
+ );
20
+ const height = Math.min(
21
+ Math.round(width / STAGE_ASPECT),
22
+ view.screen.availHeight - chromeHeight
23
+ );
24
+ try {
25
+ view.resizeTo(Math.round(height * STAGE_ASPECT) + chromeWidth, height + chromeHeight);
26
+ } catch {
27
+ return;
28
+ }
29
+ return () => {
30
+ try {
31
+ if (!view.closed) view.resizeTo(before.width, before.height);
32
+ } catch {
33
+ }
34
+ };
35
+ }, [view, presenting]);
36
+ }
37
+ function PresenterView({ onPresent, ...editor }) {
38
+ const presenting = usePresentation((s) => s.presenting);
39
+ const [view, setView] = useState(null);
40
+ const rootRef = useCallback((node) => {
41
+ if (node) setView(node.ownerDocument.defaultView);
42
+ }, []);
43
+ usePresenterKeys(presenting ? view : null, true);
44
+ useStageShapedWindow(view, presenting);
45
+ if (presenting) {
46
+ return /* @__PURE__ */ jsx(
47
+ "div",
48
+ {
49
+ ref: rootRef,
50
+ className: "h-full w-full select-none bg-black",
51
+ style: { cursor: "none" },
52
+ onDoubleClick: () => view && toggleFullscreen(view),
53
+ "data-testid": "presentation-present",
54
+ children: /* @__PURE__ */ jsx(PresentationStage, {})
55
+ }
56
+ );
57
+ }
58
+ return /* @__PURE__ */ jsx("div", { ref: rootRef, className: "h-full min-h-0", "data-testid": "presenter-view", children: /* @__PURE__ */ jsx(
59
+ SlidesEditor,
60
+ {
61
+ ...editor,
62
+ onPresent: onPresent ?? (() => usePresentation.getState().setPresenting(true))
63
+ }
64
+ ) });
65
+ }
66
+ export {
67
+ PresenterView
68
+ };
69
+ //# sourceMappingURL=PresenterView.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/presentation/PresenterView.tsx"],
4
+ "sourcesContent": ["/**\n * The presentation in a window of its own, in one of two modes.\n *\n * Present: nothing but the stage on black, no controls and no pointer: what is shared in a call or\n * shown on a projector. Keys drive it (arrows / Page Up / Page Down change slide, B blanks, F or\n * double-click toggles full screen, Space plays videos, Escape stops presenting).\n *\n * Edit: the slides editor (`SlidesEditor`), the same as in the viewer's tab, when the presentation\n * is edited in its own window (beside the document its clips come from).\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { PresentationStage } from './PresentationStage'\nimport { SlidesEditor, type SlidesEditorProps } from './SlidesEditor'\nimport { STAGE_ASPECT } from './model'\nimport { usePresentation } from './store'\nimport { toggleFullscreen, usePresenterKeys } from './usePresenterKeys'\n\n/** The presenting window's page width, at most (smaller on a small screen). */\nconst PRESENT_WIDTH = 1280\n\n/**\n * While presenting in a pop-out, its page is made 16:9 and wide enough to share sharply, so a\n * shared window is all stage with no bars; editing again gives the window back its size. Only a\n * pop-out (a window this app opened) can be resized; the app's own window is left alone.\n */\nfunction useStageShapedWindow(view: Window | null, presenting: boolean) {\n useEffect(() => {\n if (!view || !presenting || !view.opener) return\n const before = { width: view.outerWidth, height: view.outerHeight }\n const chromeWidth = view.outerWidth - view.innerWidth\n const chromeHeight = view.outerHeight - view.innerHeight\n // Wide enough for a sharp share (a call receives about what the window shows), and 16:9.\n const width = Math.max(\n view.innerWidth,\n Math.min(PRESENT_WIDTH, Math.round((view.screen.availWidth - chromeWidth) * 0.6))\n )\n const height = Math.min(\n Math.round(width / STAGE_ASPECT),\n view.screen.availHeight - chromeHeight\n )\n try {\n view.resizeTo(Math.round(height * STAGE_ASPECT) + chromeWidth, height + chromeHeight)\n } catch {\n return // not resizable: the stage letterboxes in black\n }\n return () => {\n try {\n if (!view.closed) view.resizeTo(before.width, before.height)\n } catch {\n // gone or not resizable\n }\n }\n }, [view, presenting])\n}\n\nexport type PresenterViewProps = Omit<SlidesEditorProps, 'onPresent'> & {\n /** Present (default: here, in this window). */\n onPresent?: () => void\n}\n\nexport function PresenterView({ onPresent, ...editor }: PresenterViewProps) {\n const presenting = usePresentation((s) => s.presenting)\n const [view, setView] = useState<Window | null>(null)\n // The keys work in whichever window the presenter is in.\n const rootRef = useCallback((node: HTMLDivElement | null) => {\n if (node) setView(node.ownerDocument.defaultView)\n }, [])\n usePresenterKeys(presenting ? view : null, true)\n useStageShapedWindow(view, presenting)\n\n if (presenting) {\n return (\n <div\n ref={rootRef}\n className=\"h-full w-full select-none bg-black\"\n style={{ cursor: 'none' }}\n onDoubleClick={() => view && toggleFullscreen(view)}\n data-testid=\"presentation-present\"\n >\n <PresentationStage />\n </div>\n )\n }\n return (\n <div ref={rootRef} className=\"h-full min-h-0\" data-testid=\"presenter-view\">\n <SlidesEditor\n {...editor}\n onPresent={onPresent ?? (() => usePresentation.getState().setPresenting(true))}\n />\n </div>\n )\n}\n"],
5
+ "mappings": ";AAgFQ;AArER,SAAS,aAAa,WAAW,gBAAgB;AACjD,SAAS,yBAAyB;AAClC,SAAS,oBAA4C;AACrD,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,kBAAkB,wBAAwB;AAGnD,MAAM,gBAAgB;AAOtB,SAAS,qBAAqB,MAAqB,YAAqB;AACtE,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,OAAQ;AAC1C,UAAM,SAAS,EAAE,OAAO,KAAK,YAAY,QAAQ,KAAK,YAAY;AAClE,UAAM,cAAc,KAAK,aAAa,KAAK;AAC3C,UAAM,eAAe,KAAK,cAAc,KAAK;AAE7C,UAAM,QAAQ,KAAK;AAAA,MACjB,KAAK;AAAA,MACL,KAAK,IAAI,eAAe,KAAK,OAAO,KAAK,OAAO,aAAa,eAAe,GAAG,CAAC;AAAA,IAClF;AACA,UAAM,SAAS,KAAK;AAAA,MAClB,KAAK,MAAM,QAAQ,YAAY;AAAA,MAC/B,KAAK,OAAO,cAAc;AAAA,IAC5B;AACA,QAAI;AACF,WAAK,SAAS,KAAK,MAAM,SAAS,YAAY,IAAI,aAAa,SAAS,YAAY;AAAA,IACtF,QAAQ;AACN;AAAA,IACF;AACA,WAAO,MAAM;AACX,UAAI;AACF,YAAI,CAAC,KAAK,OAAQ,MAAK,SAAS,OAAO,OAAO,OAAO,MAAM;AAAA,MAC7D,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,CAAC;AACvB;AAOO,SAAS,cAAc,EAAE,WAAW,GAAG,OAAO,GAAuB;AAC1E,QAAM,aAAa,gBAAgB,CAAC,MAAM,EAAE,UAAU;AACtD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,IAAI;AAEpD,QAAM,UAAU,YAAY,CAAC,SAAgC;AAC3D,QAAI,KAAM,SAAQ,KAAK,cAAc,WAAW;AAAA,EAClD,GAAG,CAAC,CAAC;AACL,mBAAiB,aAAa,OAAO,MAAM,IAAI;AAC/C,uBAAqB,MAAM,UAAU;AAErC,MAAI,YAAY;AACd,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,OAAO,EAAE,QAAQ,OAAO;AAAA,QACxB,eAAe,MAAM,QAAQ,iBAAiB,IAAI;AAAA,QAClD,eAAY;AAAA,QAEZ,8BAAC,qBAAkB;AAAA;AAAA,IACrB;AAAA,EAEJ;AACA,SACE,oBAAC,SAAI,KAAK,SAAS,WAAU,kBAAiB,eAAY,kBACxD;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW,cAAc,MAAM,gBAAgB,SAAS,EAAE,cAAc,IAAI;AAAA;AAAA,EAC9E,GACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * What a slide shows besides its clips, by its layout and the theme: its title with the accent
3
+ * rule, its points (accent bullets) or subtitle, and the logo in the footer. Positioned on the
4
+ * stage from `slideGeometry`, sized in container units (`cqw`) so it scales with the stage. The
5
+ * saved PDF and the PowerPoint export draw the same geometry.
6
+ *
7
+ * In the editor (`editing`), the title and text are typed on the slide itself: a click swaps the
8
+ * text for a field with the same type, size and place, so nothing moves while it is edited.
9
+ */
10
+ import type { Slide } from './model';
11
+ import { type Theme } from './theme';
12
+ /** Typing a slide's title and text on the slide. */
13
+ export interface SlideTextEditing {
14
+ onTitle(title: string): void;
15
+ onPoints(points: string): void;
16
+ }
17
+ export declare const SlideDecor: import("react").NamedExoticComponent<{
18
+ slide: Pick<Slide, "layout" | "caption" | "points">;
19
+ theme: Theme;
20
+ labels: boolean;
21
+ logoImage: Blob | null;
22
+ editable: boolean;
23
+ editing?: SlideTextEditing;
24
+ dim?: boolean;
25
+ }>;
@@ -0,0 +1,189 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { memo, useState } from "react";
4
+ import { cn } from "@arbidocs/react/ui";
5
+ import { LAYOUT_INFO, slideGeometry, textLines } from "./slide-layout.js";
6
+ import { TEXT_COLORS, accentColor } from "./theme.js";
7
+ import { useObjectUrl } from "./useObjectUrl.js";
8
+ const boxStyle = (box) => ({
9
+ left: `${box.x * 100}%`,
10
+ top: `${box.y * 100}%`,
11
+ width: `${box.w * 100}%`,
12
+ height: `${box.h * 100}%`
13
+ });
14
+ const textStyle = (box, color) => ({
15
+ ...boxStyle(box),
16
+ fontSize: `${box.size * 100}cqw`,
17
+ fontWeight: box.weight,
18
+ lineHeight: box.leading,
19
+ color,
20
+ letterSpacing: box.tone === "title" ? "-0.01em" : void 0
21
+ });
22
+ const PLACEHOLDER_COLOR = "rgba(255,255,255,0.32)";
23
+ function Text({
24
+ box,
25
+ lines,
26
+ accent,
27
+ placeholder,
28
+ onEdit,
29
+ testId
30
+ }) {
31
+ const empty = lines.length === 0;
32
+ if (empty && !placeholder) return null;
33
+ return /* @__PURE__ */ jsx(
34
+ "div",
35
+ {
36
+ className: cn(
37
+ "absolute flex flex-col overflow-hidden",
38
+ onEdit ? "pointer-events-auto cursor-text rounded-[0.3cqw] hover:outline hover:outline-1 hover:outline-white/25" : "pointer-events-none",
39
+ box.align === "center" && "text-center",
40
+ box.bullets && "gap-[0.6cqw]",
41
+ box.anchor === "middle" && "justify-center",
42
+ box.anchor === "bottom" && "justify-end"
43
+ ),
44
+ style: textStyle(box, empty ? PLACEHOLDER_COLOR : TEXT_COLORS[box.tone]),
45
+ onPointerDown: onEdit ? (event) => event.stopPropagation() : void 0,
46
+ onClick: onEdit,
47
+ "data-testid": testId,
48
+ children: (empty ? [placeholder] : lines).map(
49
+ (line, index) => box.bullets ? /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-[0.8em]", children: [
50
+ /* @__PURE__ */ jsx(
51
+ "span",
52
+ {
53
+ "aria-hidden": true,
54
+ className: "inline-block size-[0.42em] shrink-0 -translate-y-[0.12em]",
55
+ style: { background: empty ? "currentColor" : accent }
56
+ }
57
+ ),
58
+ /* @__PURE__ */ jsx("span", { children: line })
59
+ ] }, index) : /* @__PURE__ */ jsx("div", { children: line }, index)
60
+ )
61
+ }
62
+ );
63
+ }
64
+ function TextField({
65
+ box,
66
+ value,
67
+ placeholder,
68
+ multiline,
69
+ onChange,
70
+ onDone,
71
+ testId
72
+ }) {
73
+ return /* @__PURE__ */ jsx(
74
+ "textarea",
75
+ {
76
+ autoFocus: true,
77
+ value,
78
+ placeholder,
79
+ onChange: (event) => onChange(multiline ? event.target.value : event.target.value.replace(/\n/g, " ")),
80
+ onBlur: onDone,
81
+ onPointerDown: (event) => event.stopPropagation(),
82
+ onKeyDown: (event) => {
83
+ if (event.key === "Escape" || !multiline && event.key === "Enter") {
84
+ event.preventDefault();
85
+ event.currentTarget.blur();
86
+ }
87
+ },
88
+ className: cn(
89
+ "pointer-events-auto absolute resize-none overflow-hidden rounded-[0.3cqw] bg-white/5 p-0 outline outline-1 outline-white/40 placeholder:text-white/30 focus:outline-white/60",
90
+ box.align === "center" && "text-center"
91
+ ),
92
+ style: {
93
+ ...textStyle(box, TEXT_COLORS[box.tone]),
94
+ fontFamily: "inherit",
95
+ // Bulleted lines keep their indent while typed.
96
+ paddingLeft: box.bullets ? "1.22em" : void 0
97
+ },
98
+ "aria-label": placeholder,
99
+ "data-testid": testId
100
+ }
101
+ );
102
+ }
103
+ function Logo({ image, box }) {
104
+ const url = useObjectUrl(image);
105
+ if (!url) return null;
106
+ return /* @__PURE__ */ jsx(
107
+ "img",
108
+ {
109
+ src: url,
110
+ alt: "",
111
+ className: "pointer-events-none absolute object-contain opacity-90",
112
+ style: { ...boxStyle(box), objectPosition: box.x < 0.5 ? "left bottom" : "right bottom" },
113
+ "data-testid": "stage-logo"
114
+ }
115
+ );
116
+ }
117
+ const SlideDecor = memo(function SlideDecor2({
118
+ slide,
119
+ theme,
120
+ labels,
121
+ logoImage,
122
+ editable,
123
+ editing,
124
+ dim
125
+ }) {
126
+ const [typing, setTyping] = useState(null);
127
+ const geometry = slideGeometry(slide, { labels, logo: theme.logo?.corner ?? null });
128
+ const title = slide.caption.trim();
129
+ const titled = slide.layout === "title" || slide.layout === "section";
130
+ const info = LAYOUT_INFO[slide.layout];
131
+ return /* @__PURE__ */ jsxs("div", { className: cn("pointer-events-none absolute inset-0", dim && "opacity-30"), children: [
132
+ !geometry.title ? null : editing && typing === "title" ? /* @__PURE__ */ jsx(
133
+ TextField,
134
+ {
135
+ box: geometry.title,
136
+ value: slide.caption,
137
+ placeholder: "Title",
138
+ multiline: false,
139
+ onChange: editing.onTitle,
140
+ onDone: () => setTyping(null),
141
+ testId: "stage-slide-caption-input"
142
+ }
143
+ ) : /* @__PURE__ */ jsx(
144
+ Text,
145
+ {
146
+ box: geometry.title,
147
+ lines: title ? [title] : [],
148
+ accent: accentColor(theme.accent),
149
+ placeholder: editable && (titled || editing) ? "Click to add a title" : void 0,
150
+ onEdit: editing ? () => setTyping("title") : void 0,
151
+ testId: "stage-slide-caption"
152
+ }
153
+ ),
154
+ geometry.rule && (title || editable && titled) && /* @__PURE__ */ jsx(
155
+ "div",
156
+ {
157
+ className: "absolute",
158
+ style: { ...boxStyle(geometry.rule), background: accentColor(theme.accent) }
159
+ }
160
+ ),
161
+ geometry.text && (editing && typing === "text" ? /* @__PURE__ */ jsx(
162
+ TextField,
163
+ {
164
+ box: geometry.text,
165
+ value: slide.points,
166
+ placeholder: info.text ?? "",
167
+ multiline: true,
168
+ onChange: editing.onPoints,
169
+ onDone: () => setTyping(null),
170
+ testId: "stage-slide-points-input"
171
+ }
172
+ ) : /* @__PURE__ */ jsx(
173
+ Text,
174
+ {
175
+ box: geometry.text,
176
+ lines: textLines(slide.points),
177
+ accent: accentColor(theme.accent),
178
+ placeholder: editable ? info.text : void 0,
179
+ onEdit: editing ? () => setTyping("text") : void 0,
180
+ testId: "stage-slide-points"
181
+ }
182
+ )),
183
+ geometry.logo && logoImage && /* @__PURE__ */ jsx(Logo, { image: logoImage, box: geometry.logo })
184
+ ] });
185
+ });
186
+ export {
187
+ SlideDecor
188
+ };
189
+ //# sourceMappingURL=SlideDecor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/presentation/SlideDecor.tsx"],
4
+ "sourcesContent": ["/**\n * What a slide shows besides its clips, by its layout and the theme: its title with the accent\n * rule, its points (accent bullets) or subtitle, and the logo in the footer. Positioned on the\n * stage from `slideGeometry`, sized in container units (`cqw`) so it scales with the stage. The\n * saved PDF and the PowerPoint export draw the same geometry.\n *\n * In the editor (`editing`), the title and text are typed on the slide itself: a click swaps the\n * text for a field with the same type, size and place, so nothing moves while it is edited.\n */\n\nimport { memo, useState, type CSSProperties } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport type { Slide } from './model'\nimport { LAYOUT_INFO, slideGeometry, textLines, type Box, type TextBox } from './slide-layout'\nimport { TEXT_COLORS, accentColor, type Theme } from './theme'\nimport { useObjectUrl } from './useObjectUrl'\n\n/** Typing a slide's title and text on the slide. */\nexport interface SlideTextEditing {\n onTitle(title: string): void\n onPoints(points: string): void\n}\n\nconst boxStyle = (box: Box) => ({\n left: `${box.x * 100}%`,\n top: `${box.y * 100}%`,\n width: `${box.w * 100}%`,\n height: `${box.h * 100}%`,\n})\n\nconst textStyle = (box: TextBox, color: string): CSSProperties => ({\n ...boxStyle(box),\n fontSize: `${box.size * 100}cqw`,\n fontWeight: box.weight,\n lineHeight: box.leading,\n color,\n letterSpacing: box.tone === 'title' ? '-0.01em' : undefined,\n})\n\nconst PLACEHOLDER_COLOR = 'rgba(255,255,255,0.32)'\n\nfunction Text({\n box,\n lines,\n accent,\n placeholder,\n onEdit,\n testId,\n}: {\n box: TextBox\n lines: string[]\n accent: string\n /** Shown faintly in the editor while the text is empty. */\n placeholder?: string\n /** A click starts typing (the editor). */\n onEdit?: () => void\n testId: string\n}) {\n const empty = lines.length === 0\n if (empty && !placeholder) return null\n return (\n <div\n className={cn(\n 'absolute flex flex-col overflow-hidden',\n onEdit\n ? 'pointer-events-auto cursor-text rounded-[0.3cqw] hover:outline hover:outline-1 hover:outline-white/25'\n : 'pointer-events-none',\n box.align === 'center' && 'text-center',\n box.bullets && 'gap-[0.6cqw]',\n box.anchor === 'middle' && 'justify-center',\n box.anchor === 'bottom' && 'justify-end'\n )}\n style={textStyle(box, empty ? PLACEHOLDER_COLOR : TEXT_COLORS[box.tone])}\n onPointerDown={onEdit ? (event) => event.stopPropagation() : undefined}\n onClick={onEdit}\n data-testid={testId}\n >\n {(empty ? [placeholder!] : lines).map((line, index) =>\n box.bullets ? (\n <div key={index} className=\"flex items-baseline gap-[0.8em]\">\n <span\n aria-hidden\n className=\"inline-block size-[0.42em] shrink-0 -translate-y-[0.12em]\"\n style={{ background: empty ? 'currentColor' : accent }}\n />\n <span>{line}</span>\n </div>\n ) : (\n <div key={index}>{line}</div>\n )\n )}\n </div>\n )\n}\n\n/** The field a title or text is typed in: the text's own type, size and place. */\nfunction TextField({\n box,\n value,\n placeholder,\n multiline,\n onChange,\n onDone,\n testId,\n}: {\n box: TextBox\n value: string\n placeholder: string\n multiline: boolean\n onChange: (value: string) => void\n onDone: () => void\n testId: string\n}) {\n return (\n <textarea\n autoFocus\n value={value}\n placeholder={placeholder}\n onChange={(event) =>\n onChange(multiline ? event.target.value : event.target.value.replace(/\\n/g, ' '))\n }\n onBlur={onDone}\n onPointerDown={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n if (event.key === 'Escape' || (!multiline && event.key === 'Enter')) {\n event.preventDefault()\n event.currentTarget.blur()\n }\n }}\n className={cn(\n 'pointer-events-auto absolute resize-none overflow-hidden rounded-[0.3cqw] bg-white/5 p-0 outline outline-1 outline-white/40 placeholder:text-white/30 focus:outline-white/60',\n box.align === 'center' && 'text-center'\n )}\n style={{\n ...textStyle(box, TEXT_COLORS[box.tone]),\n fontFamily: 'inherit',\n // Bulleted lines keep their indent while typed.\n paddingLeft: box.bullets ? '1.22em' : undefined,\n }}\n aria-label={placeholder}\n data-testid={testId}\n />\n )\n}\n\nfunction Logo({ image, box }: { image: Blob; box: Box }) {\n const url = useObjectUrl(image)\n if (!url) return null\n return (\n <img\n src={url}\n alt=\"\"\n className=\"pointer-events-none absolute object-contain opacity-90\"\n style={{ ...boxStyle(box), objectPosition: box.x < 0.5 ? 'left bottom' : 'right bottom' }}\n data-testid=\"stage-logo\"\n />\n )\n}\n\nexport const SlideDecor = memo(function SlideDecor({\n slide,\n theme,\n labels,\n logoImage,\n editable,\n editing,\n dim,\n}: {\n slide: Pick<Slide, 'layout' | 'caption' | 'points'>\n theme: Theme\n labels: boolean\n logoImage: Blob | null\n editable: boolean\n editing?: SlideTextEditing\n dim?: boolean\n}) {\n const [typing, setTyping] = useState<'title' | 'text' | null>(null)\n const geometry = slideGeometry(slide, { labels, logo: theme.logo?.corner ?? null })\n const title = slide.caption.trim()\n const titled = slide.layout === 'title' || slide.layout === 'section'\n const info = LAYOUT_INFO[slide.layout]\n return (\n <div className={cn('pointer-events-none absolute inset-0', dim && 'opacity-30')}>\n {!geometry.title ? null : editing && typing === 'title' ? (\n <TextField\n box={geometry.title}\n value={slide.caption}\n placeholder=\"Title\"\n multiline={false}\n onChange={editing.onTitle}\n onDone={() => setTyping(null)}\n testId=\"stage-slide-caption-input\"\n />\n ) : (\n <Text\n box={geometry.title}\n lines={title ? [title] : []}\n accent={accentColor(theme.accent)}\n placeholder={editable && (titled || editing) ? 'Click to add a title' : undefined}\n onEdit={editing ? () => setTyping('title') : undefined}\n testId=\"stage-slide-caption\"\n />\n )}\n {geometry.rule && (title || (editable && titled)) && (\n <div\n className=\"absolute\"\n style={{ ...boxStyle(geometry.rule), background: accentColor(theme.accent) }}\n />\n )}\n {geometry.text &&\n (editing && typing === 'text' ? (\n <TextField\n box={geometry.text}\n value={slide.points}\n placeholder={info.text ?? ''}\n multiline\n onChange={editing.onPoints}\n onDone={() => setTyping(null)}\n testId=\"stage-slide-points-input\"\n />\n ) : (\n <Text\n box={geometry.text}\n lines={textLines(slide.points)}\n accent={accentColor(theme.accent)}\n placeholder={editable ? info.text : undefined}\n onEdit={editing ? () => setTyping('text') : undefined}\n testId=\"stage-slide-points\"\n />\n ))}\n {geometry.logo && logoImage && <Logo image={logoImage} box={geometry.logo} />}\n </div>\n )\n})\n"],
5
+ "mappings": "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",
6
+ "names": ["SlideDecor"]
7
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The presentation editor: its slides one under the other, scrolled like a PDF's pages, each one
3
+ * edited where it is — clips dragged, resized and reshaped on it, its title and points typed on
4
+ * it. Hovering a slide shows its actions (layout, move up or down, duplicate, delete); between two
5
+ * slides, + inserts one. One small floating bar holds the rest (Design, the host's Save and other
6
+ * actions, Present, "…"), so no header takes room from the slides. The clips collected for the
7
+ * presentation wait in the tray along the bottom, to be dragged onto any slide.
8
+ *
9
+ * The same editor shows wherever the host mounts it (the viewer's tab, or its own window).
10
+ */
11
+ import { type ReactNode } from 'react';
12
+ export interface SlidesEditorProps {
13
+ /** Present: the host opens the shareable window. */
14
+ onPresent: () => void;
15
+ /** In the floating bar, before Present (e.g. Save, pop out). */
16
+ actions?: ReactNode;
17
+ /** At the top of the "…" menu (e.g. New from template, Save as, Export). */
18
+ menuItems?: ReactNode;
19
+ /** First in the clip tray (e.g. Generate image). */
20
+ trayStart?: ReactNode;
21
+ onChooseLogo?: () => void;
22
+ onEditImage?: (clipId: string) => void;
23
+ onCropImage?: (clipId: string) => void;
24
+ }
25
+ export declare function SlidesEditor({ onPresent, actions, menuItems, trayStart, onChooseLogo, onEditImage, onCropImage, }: SlidesEditorProps): import("react").JSX.Element;