@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,141 @@
1
+ "use client";
2
+ import {
3
+ SLIDE_LAYOUTS
4
+ } from "./model.js";
5
+ import { parseTheme } from "./theme.js";
6
+ import { parseBackground, parseBoxes } from "./saved-boxes.js";
7
+ const PRESENTATIONS_FOLDER = "Presentations";
8
+ const TEMPLATES_FOLDER = `${PRESENTATIONS_FOLDER}/Templates`;
9
+ const EXPORTS_FOLDER = `${PRESENTATIONS_FOLDER}/Exports`;
10
+ import { LEGACY_PRESENTATION_SUFFIX, PRESENTATION_FILE_SUFFIX } from "./panel-id.js";
11
+ const PRESENTATION_ATTACHMENT = "arbi-presentation.json";
12
+ const FORMAT = "arbi-presentation";
13
+ function serializePresentation(snapshot) {
14
+ const index = new Map(snapshot.clips.map((clip, i) => [clip.id, i]));
15
+ return {
16
+ format: FORMAT,
17
+ version: 1,
18
+ title: snapshot.title,
19
+ captions: snapshot.captions,
20
+ ...snapshot.labelColumn ? { labelColumn: snapshot.labelColumn } : {},
21
+ ...snapshot.theme ? { theme: snapshot.theme } : {},
22
+ clips: snapshot.clips.map((clip) => ({
23
+ kind: clip.kind,
24
+ documentId: clip.documentId,
25
+ ...clip.version !== void 0 ? { version: clip.version } : {},
26
+ fileName: clip.fileName,
27
+ page: clip.page,
28
+ rect: clip.rect,
29
+ aspect: clip.aspect,
30
+ caption: clip.caption,
31
+ ...clip.start !== void 0 ? { start: clip.start } : {},
32
+ ...clip.zoomBase !== void 0 ? { zoomBase: clip.zoomBase } : {},
33
+ ...clip.media ? { media: clip.media } : {},
34
+ ...clip.plain ? { plain: true } : {}
35
+ })),
36
+ slides: snapshot.slides.map((slide, i) => ({
37
+ caption: slide.caption,
38
+ auto: slide.auto,
39
+ layout: slide.layout ?? "clips",
40
+ ...slide.points ? { points: slide.points } : {},
41
+ items: slide.items.filter((item) => index.has(item.clipId)).map((item) => ({ clip: index.get(item.clipId), frame: item.frame })),
42
+ ...slide.boxes?.length ? { boxes: slide.boxes.map(({ id: _id, ...box }) => (void _id, box)) } : {},
43
+ ...slide.background ? { background: slide.background } : {},
44
+ ...slide.notes?.trim() ? { notes: slide.notes } : {},
45
+ ...snapshot.fingerprints?.[i] ? { fingerprint: snapshot.fingerprints[i] } : {}
46
+ })),
47
+ ...usedMedia(snapshot) ? { media: usedMedia(snapshot) } : {}
48
+ };
49
+ }
50
+ function usedMedia(snapshot) {
51
+ const media = snapshot.media ?? {};
52
+ const keys = /* @__PURE__ */ new Set();
53
+ for (const clip of snapshot.clips) if (clip.media) keys.add(clip.media);
54
+ for (const slide of snapshot.slides) if (slide.background?.image) keys.add(slide.background.image);
55
+ const used = Object.fromEntries(
56
+ [...keys].filter((key) => media[key]).map((key) => [key, media[key]])
57
+ );
58
+ return Object.keys(used).length ? used : void 0;
59
+ }
60
+ const isNumber = (v) => typeof v === "number" && Number.isFinite(v);
61
+ const isRect = (v) => {
62
+ const r = v;
63
+ return !!r && isNumber(r.x) && isNumber(r.y) && isNumber(r.w) && isNumber(r.h) && r.w > 0 && r.h > 0;
64
+ };
65
+ const isFrame = (v) => {
66
+ const f = v;
67
+ return !!f && isNumber(f.x) && isNumber(f.y) && isNumber(f.w) && f.w > 0;
68
+ };
69
+ function parsePresentation(text) {
70
+ const data = JSON.parse(text);
71
+ if (data?.format !== FORMAT || data.version !== 1) throw new Error("Not a presentation file");
72
+ const clips = Array.isArray(data.clips) ? data.clips : [];
73
+ const slides = Array.isArray(data.slides) ? data.slides : [];
74
+ const media = data.media && typeof data.media === "object" ? Object.fromEntries(
75
+ Object.entries(data.media).filter(
76
+ ([, url]) => typeof url === "string" && url.startsWith("data:image/")
77
+ )
78
+ ) : {};
79
+ for (const clip of clips) {
80
+ if (!["pdf", "image", "video"].includes(clip.kind) || typeof clip.documentId !== "string" || clip.media !== void 0 && !media[clip.media] || !isRect(clip.rect) || !isNumber(clip.aspect) || !isNumber(clip.page)) {
81
+ throw new Error("The presentation file is damaged");
82
+ }
83
+ }
84
+ for (const slide of slides) {
85
+ if (!Array.isArray(slide.items)) throw new Error("The presentation file is damaged");
86
+ for (const item of slide.items) {
87
+ if (!isNumber(item.clip) || !clips[item.clip] || !isFrame(item.frame)) {
88
+ throw new Error("The presentation file is damaged");
89
+ }
90
+ }
91
+ }
92
+ return {
93
+ format: FORMAT,
94
+ version: 1,
95
+ title: typeof data.title === "string" ? data.title : "Presentation",
96
+ captions: data.captions !== false,
97
+ ...data.theme !== void 0 ? { theme: parseTheme(data.theme) } : {},
98
+ ...typeof data.labelColumn === "string" && data.labelColumn ? { labelColumn: data.labelColumn } : {},
99
+ clips,
100
+ slides: slides.map((slide) => {
101
+ const { boxes, background, fingerprint, notes, ...rest } = slide;
102
+ const parsedBoxes = parseBoxes(boxes);
103
+ const parsedBackground = parseBackground(background, media);
104
+ return {
105
+ ...rest,
106
+ layout: SLIDE_LAYOUTS.includes(slide.layout) ? slide.layout : "clips",
107
+ ...typeof slide.points === "string" && slide.points ? { points: slide.points } : {},
108
+ ...parsedBoxes.length ? { boxes: parsedBoxes } : {},
109
+ ...parsedBackground ? { background: parsedBackground } : {},
110
+ ...typeof fingerprint === "string" ? { fingerprint } : {},
111
+ ...typeof notes === "string" && notes.trim() ? { notes } : {}
112
+ };
113
+ }),
114
+ ...Object.keys(media).length ? { media } : {},
115
+ ...data.slidesStale === true ? { slidesStale: true } : {}
116
+ };
117
+ }
118
+ function safeFileStem(title) {
119
+ return title.replace(/[\\/:*?"<>|]+/g, " ").trim() || "Presentation";
120
+ }
121
+ function presentationFileName(title) {
122
+ return `${safeFileStem(title)}.pptx`;
123
+ }
124
+ function presentationTitle(fileName) {
125
+ for (const suffix of [PRESENTATION_FILE_SUFFIX, LEGACY_PRESENTATION_SUFFIX, ".pptx", ".pdf"]) {
126
+ if (fileName.endsWith(suffix)) return fileName.slice(0, -suffix.length);
127
+ }
128
+ return fileName;
129
+ }
130
+ export {
131
+ EXPORTS_FOLDER,
132
+ PRESENTATIONS_FOLDER,
133
+ PRESENTATION_ATTACHMENT,
134
+ TEMPLATES_FOLDER,
135
+ parsePresentation,
136
+ presentationFileName,
137
+ presentationTitle,
138
+ safeFileStem,
139
+ serializePresentation
140
+ };
141
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/presentation/persistence.ts"],
4
+ "sourcesContent": ["/**\n * A presentation saved as a document of the workspace's `Presentations` folder,\n * `<title>.presentation.pdf`: a PDF of its slides (each an image as presented, redactions burnt in,\n * its words searchable), with its editable data attached to the PDF as `arbi-presentation.json`\n * (the format below; see docs/presentation-format.md). One file: viewing, searching, downloading,\n * copying and versions are a PDF's, and the editable data can never part from its slides.\n *\n * The data holds references, never pixels: for each clip its source document (and version), page,\n * area and label; for each slide its title and where its clips sit. Opening it fetches the sources\n * again (so clips stay sharp and editable) and reads their redactions again (so a newer redaction\n * applies too).\n *\n * Agents and the API: read and write the attachment with any PDF library. Changing the data cannot\n * redraw the slides (that needs the sources and their redactions, decrypted in the app), so set\n * `slidesStale: true`: the editor says so on opening, and its next save draws them again.\n */\n\nimport {\n SLIDE_LAYOUTS,\n type Clip,\n type ClipKind,\n type Frame,\n type Rect,\n type SlideLayout,\n} from './model'\nimport { parseTheme, type Theme } from './theme'\nimport { parseBackground, parseBoxes, type SavedBox } from './saved-boxes'\nimport type { SlideBackground, SlideBox } from './boxes'\n\nexport const PRESENTATIONS_FOLDER = 'Presentations'\n/**\n * Templates: presentations kept here are offered by New from template (their look and slides,\n * without clips). A firm keeps its house look by keeping one here.\n */\nexport const TEMPLATES_FOLDER = `${PRESENTATIONS_FOLDER}/Templates`\n/** Exported PDFs and PowerPoint decks: kept apart, so they are not taken for presentations. */\nexport const EXPORTS_FOLDER = `${PRESENTATIONS_FOLDER}/Exports`\nimport { LEGACY_PRESENTATION_SUFFIX, PRESENTATION_FILE_SUFFIX } from './panel-id'\n\n/** The name of the editable data attached to a presentation's PDF. */\nexport const PRESENTATION_ATTACHMENT = 'arbi-presentation.json'\nconst FORMAT = 'arbi-presentation'\n\nexport interface SavedClip {\n kind: ClipKind\n documentId: string\n version?: number\n fileName: string\n page: number\n rect: Rect\n aspect: number\n caption: string\n start?: number\n zoomBase?: number\n /** An image embedded in the presentation (a key of `media`); `documentId` is empty. */\n media?: string\n /** Drawn as it is (no frame finish, no label). */\n plain?: boolean\n}\n\nexport interface SavedSlide {\n caption: string\n auto: boolean\n /** Absent in files saved before layouts: 'clips'. */\n layout?: SlideLayout\n /** One point per line (a subtitle on a title or section slide). */\n points?: string\n /** `clip` is an index into `clips`. */\n items: { clip: number; frame: Frame }[]\n /** Its text boxes and shapes (`boxes`). */\n boxes?: SavedBox[]\n background?: SlideBackground\n /** Speaker notes. */\n notes?: string\n /**\n * What its PowerPoint slide looked like when saved (`slideFingerprint`): a slide whose\n * fingerprint no longer matches was changed in PowerPoint, and is imported again.\n */\n fingerprint?: string\n}\n\nexport interface SavedPresentation {\n format: typeof FORMAT\n version: 1\n title: string\n captions: boolean\n /** The annotation column (tag id) whose value leads each clip's label, e.g. its exhibit number. */\n labelColumn?: string\n /** Absent in files saved before themes: the default theme. */\n theme?: Theme\n clips: SavedClip[]\n slides: SavedSlide[]\n /** Images embedded in the presentation (an imported deck's pictures), as data URLs. */\n media?: Record<string, string>\n /** The data was changed outside the editor (an agent): the PDF's slides do not show it yet. */\n slidesStale?: boolean\n}\n\nexport interface PresentationSnapshot {\n title: string\n captions: boolean\n labelColumn?: string | null\n theme?: Theme\n clips: readonly Clip[]\n slides: readonly {\n caption: string\n auto: boolean\n layout?: SlideLayout\n points?: string\n items: { clipId: string; frame: Frame }[]\n boxes?: readonly SlideBox[]\n background?: SlideBackground\n notes?: string\n }[]\n /** Embedded images by key (data URLs). */\n media?: Readonly<Record<string, string>>\n /** Each slide's PowerPoint fingerprint, as just written (`slideFingerprint`). */\n fingerprints?: readonly string[]\n}\n\n/** The presentation as saved: references only. */\nexport function serializePresentation(snapshot: PresentationSnapshot): SavedPresentation {\n const index = new Map(snapshot.clips.map((clip, i) => [clip.id, i]))\n return {\n format: FORMAT,\n version: 1,\n title: snapshot.title,\n captions: snapshot.captions,\n ...(snapshot.labelColumn ? { labelColumn: snapshot.labelColumn } : {}),\n ...(snapshot.theme ? { theme: snapshot.theme } : {}),\n clips: snapshot.clips.map((clip) => ({\n kind: clip.kind,\n documentId: clip.documentId,\n ...(clip.version !== undefined ? { version: clip.version } : {}),\n fileName: clip.fileName,\n page: clip.page,\n rect: clip.rect,\n aspect: clip.aspect,\n caption: clip.caption,\n ...(clip.start !== undefined ? { start: clip.start } : {}),\n ...(clip.zoomBase !== undefined ? { zoomBase: clip.zoomBase } : {}),\n ...(clip.media ? { media: clip.media } : {}),\n ...(clip.plain ? { plain: true } : {}),\n })),\n slides: snapshot.slides.map((slide, i) => ({\n caption: slide.caption,\n auto: slide.auto,\n layout: slide.layout ?? 'clips',\n ...(slide.points ? { points: slide.points } : {}),\n items: slide.items\n .filter((item) => index.has(item.clipId))\n .map((item) => ({ clip: index.get(item.clipId)!, frame: item.frame })),\n ...(slide.boxes?.length\n ? { boxes: slide.boxes.map(({ id: _id, ...box }) => (void _id, box)) }\n : {}),\n ...(slide.background ? { background: slide.background } : {}),\n ...(slide.notes?.trim() ? { notes: slide.notes } : {}),\n ...(snapshot.fingerprints?.[i] ? { fingerprint: snapshot.fingerprints[i] } : {}),\n })),\n ...(usedMedia(snapshot) ? { media: usedMedia(snapshot) } : {}),\n }\n}\n\n/** The embedded images still used (by a clip or a slide's background), or none. */\nfunction usedMedia(snapshot: PresentationSnapshot): Record<string, string> | undefined {\n const media = snapshot.media ?? {}\n const keys = new Set<string>()\n for (const clip of snapshot.clips) if (clip.media) keys.add(clip.media)\n for (const slide of snapshot.slides) if (slide.background?.image) keys.add(slide.background.image)\n const used = Object.fromEntries(\n [...keys].filter((key) => media[key]).map((key) => [key, media[key]])\n )\n return Object.keys(used).length ? used : undefined\n}\n\nconst isNumber = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v)\nconst isRect = (v: unknown): v is Rect => {\n const r = v as Rect | null\n return (\n !!r && isNumber(r.x) && isNumber(r.y) && isNumber(r.w) && isNumber(r.h) && r.w > 0 && r.h > 0\n )\n}\nconst isFrame = (v: unknown): v is Frame => {\n const f = v as Frame | null\n return !!f && isNumber(f.x) && isNumber(f.y) && isNumber(f.w) && f.w > 0\n}\n\n/** A saved presentation read from a file, checked; throws on anything else. */\nexport function parsePresentation(text: string): SavedPresentation {\n const data = JSON.parse(text) as Partial<SavedPresentation>\n if (data?.format !== FORMAT || data.version !== 1) throw new Error('Not a presentation file')\n const clips = Array.isArray(data.clips) ? data.clips : []\n const slides = Array.isArray(data.slides) ? data.slides : []\n const media =\n data.media && typeof data.media === 'object'\n ? Object.fromEntries(\n Object.entries(data.media).filter(\n ([, url]) => typeof url === 'string' && url.startsWith('data:image/')\n )\n )\n : {}\n for (const clip of clips) {\n if (\n !['pdf', 'image', 'video'].includes(clip.kind) ||\n typeof clip.documentId !== 'string' ||\n (clip.media !== undefined && !media[clip.media]) ||\n !isRect(clip.rect) ||\n !isNumber(clip.aspect) ||\n !isNumber(clip.page)\n ) {\n throw new Error('The presentation file is damaged')\n }\n }\n for (const slide of slides) {\n if (!Array.isArray(slide.items)) throw new Error('The presentation file is damaged')\n for (const item of slide.items) {\n if (!isNumber(item.clip) || !clips[item.clip] || !isFrame(item.frame)) {\n throw new Error('The presentation file is damaged')\n }\n }\n }\n return {\n format: FORMAT,\n version: 1,\n title: typeof data.title === 'string' ? data.title : 'Presentation',\n captions: data.captions !== false,\n ...(data.theme !== undefined ? { theme: parseTheme(data.theme) } : {}),\n ...(typeof data.labelColumn === 'string' && data.labelColumn\n ? { labelColumn: data.labelColumn }\n : {}),\n clips,\n slides: slides.map((slide) => {\n const { boxes, background, fingerprint, notes, ...rest } = slide\n const parsedBoxes = parseBoxes(boxes)\n const parsedBackground = parseBackground(background, media)\n return {\n ...rest,\n layout: SLIDE_LAYOUTS.includes(slide.layout as SlideLayout) ? slide.layout : 'clips',\n ...(typeof slide.points === 'string' && slide.points ? { points: slide.points } : {}),\n ...(parsedBoxes.length ? { boxes: parsedBoxes } : {}),\n ...(parsedBackground ? { background: parsedBackground } : {}),\n ...(typeof fingerprint === 'string' ? { fingerprint } : {}),\n ...(typeof notes === 'string' && notes.trim() ? { notes } : {}),\n }\n }),\n ...(Object.keys(media).length ? { media } : {}),\n ...(data.slidesStale === true ? { slidesStale: true } : {}),\n }\n}\n\n/** A title as a file name stem (characters a file name can hold). */\nexport function safeFileStem(title: string): string {\n return title.replace(/[\\\\/:*?\"<>|]+/g, ' ').trim() || 'Presentation'\n}\n\n/** \"Opening statement\" \u2192 \"Opening statement.pptx\": a presentation is a PowerPoint file. */\nexport function presentationFileName(title: string): string {\n return `${safeFileStem(title)}.pptx`\n}\n\n/** The title of a saved presentation, from its file name (older names too). */\nexport function presentationTitle(fileName: string): string {\n for (const suffix of [PRESENTATION_FILE_SUFFIX, LEGACY_PRESENTATION_SUFFIX, '.pptx', '.pdf']) {\n if (fileName.endsWith(suffix)) return fileName.slice(0, -suffix.length)\n }\n return fileName\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * A presentation's editable data inside its PowerPoint file: a custom XML part, the Office way for
3
+ * an application to keep its own data in a document (PowerPoint keeps it when it saves the file).
4
+ *
5
+ * customXml/itemN.xml <arbiPresentation xmlns="urn:arbi:presentation:v1">…json…</…>
6
+ * customXml/itemPropsN.xml its properties (schema reference)
7
+ * customXml/_rels/itemN.xml.rels
8
+ * ppt/_rels/presentation.xml.rels a customXml relationship from the presentation to it
9
+ *
10
+ * The data is the same JSON a saved presentation always had (`persistence`), XML-escaped.
11
+ */
12
+ /** The custom XML part's root namespace: what marks a PowerPoint file as an ARBI presentation. */
13
+ export declare const PRESENTATION_XML_NS = "urn:arbi:presentation:v1";
14
+ /** A PowerPoint file (any zip) by its first bytes ("PK\x03\x04"). */
15
+ export declare const isZipBytes: (bytes: Uint8Array) => boolean;
16
+ /** The editable data in a PowerPoint file (its JSON), or null when it has none (another deck). */
17
+ export declare function readPptxPresentationData(file: Blob | Uint8Array): Promise<string | null>;
18
+ /**
19
+ * The PowerPoint file with `json` as its editable data (replacing data it had): the part, its
20
+ * properties, and the relationships and content type that make it part of the package.
21
+ */
22
+ export declare function writePptxPresentationData(file: Blob, json: string): Promise<Blob>;
@@ -0,0 +1,83 @@
1
+ "use client";
2
+ const PRESENTATION_XML_NS = "urn:arbi:presentation:v1";
3
+ const RELS_NS = "http://schemas.openxmlformats.org/package/2006/relationships";
4
+ const CUSTOM_XML_REL = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml";
5
+ const CUSTOM_XML_PROPS_REL = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps";
6
+ const CUSTOM_XML_PROPS_TYPE = "application/vnd.openxmlformats-officedocument.customXmlProperties+xml";
7
+ const escapeXml = (text) => text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
8
+ const unescapeXml = (text) => text.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&amp;/g, "&");
9
+ const ROOT = /<arbiPresentation\b[^>]*xmlns="urn:arbi:presentation:v1"[^>]*>([\s\S]*?)<\/arbiPresentation>/;
10
+ async function loadZip(file) {
11
+ const { default: JSZip } = await import("jszip");
12
+ return JSZip.loadAsync(file instanceof Blob ? await file.arrayBuffer() : file);
13
+ }
14
+ const isZipBytes = (bytes) => bytes[0] === 80 && bytes[1] === 75 && bytes[2] === 3 && bytes[3] === 4;
15
+ async function readPptxPresentationData(file) {
16
+ const zip = await loadZip(file);
17
+ for (const name of Object.keys(zip.files)) {
18
+ if (!/^customXml\/item\d+\.xml$/.test(name)) continue;
19
+ const match = ROOT.exec(await zip.file(name).async("string"));
20
+ if (match) return unescapeXml(match[1]);
21
+ }
22
+ return null;
23
+ }
24
+ async function writePptxPresentationData(file, json) {
25
+ const zip = await loadZip(file);
26
+ let index = 1;
27
+ for (const name of Object.keys(zip.files)) {
28
+ const match = /^customXml\/item(\d+)\.xml$/.exec(name);
29
+ if (!match) continue;
30
+ if (ROOT.test(await zip.file(name).async("string"))) {
31
+ index = Number(match[1]);
32
+ break;
33
+ }
34
+ index = Math.max(index, Number(match[1]) + 1);
35
+ }
36
+ const item = `customXml/item${index}.xml`;
37
+ const props = `customXml/itemProps${index}.xml`;
38
+ zip.file(
39
+ item,
40
+ `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
41
+ <arbiPresentation xmlns="${PRESENTATION_XML_NS}">${escapeXml(json)}</arbiPresentation>`
42
+ );
43
+ zip.file(
44
+ props,
45
+ `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
46
+ <ds:datastoreItem ds:itemID="{8B1C2E5A-7D40-4E9B-A1F3-0C6D2B9E4A71}" xmlns:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml"><ds:schemaRefs><ds:schemaRef ds:uri="${PRESENTATION_XML_NS}"/></ds:schemaRefs></ds:datastoreItem>`
47
+ );
48
+ zip.file(
49
+ `customXml/_rels/item${index}.xml.rels`,
50
+ `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
51
+ <Relationships xmlns="${RELS_NS}"><Relationship Id="rId1" Type="${CUSTOM_XML_PROPS_REL}" Target="itemProps${index}.xml"/></Relationships>`
52
+ );
53
+ const typesName = "[Content_Types].xml";
54
+ let types = await zip.file(typesName).async("string");
55
+ if (!types.includes(`PartName="/${props}"`)) {
56
+ types = types.replace(
57
+ "</Types>",
58
+ `<Override PartName="/${props}" ContentType="${CUSTOM_XML_PROPS_TYPE}"/></Types>`
59
+ );
60
+ zip.file(typesName, types);
61
+ }
62
+ const relsName = "ppt/_rels/presentation.xml.rels";
63
+ let rels = await zip.file(relsName).async("string");
64
+ if (!rels.includes(`Target="../${item}"`)) {
65
+ rels = rels.replace(
66
+ "</Relationships>",
67
+ `<Relationship Id="rIdArbiPresentation" Type="${CUSTOM_XML_REL}" Target="../${item}"/></Relationships>`
68
+ );
69
+ zip.file(relsName, rels);
70
+ }
71
+ return zip.generateAsync({
72
+ type: "blob",
73
+ mimeType: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
74
+ compression: "DEFLATE"
75
+ });
76
+ }
77
+ export {
78
+ PRESENTATION_XML_NS,
79
+ isZipBytes,
80
+ readPptxPresentationData,
81
+ writePptxPresentationData
82
+ };
83
+ //# sourceMappingURL=pptx-data.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/presentation/pptx-data.ts"],
4
+ "sourcesContent": ["/**\n * A presentation's editable data inside its PowerPoint file: a custom XML part, the Office way for\n * an application to keep its own data in a document (PowerPoint keeps it when it saves the file).\n *\n * customXml/itemN.xml <arbiPresentation xmlns=\"urn:arbi:presentation:v1\">\u2026json\u2026</\u2026>\n * customXml/itemPropsN.xml its properties (schema reference)\n * customXml/_rels/itemN.xml.rels\n * ppt/_rels/presentation.xml.rels a customXml relationship from the presentation to it\n *\n * The data is the same JSON a saved presentation always had (`persistence`), XML-escaped.\n */\n\n/** The custom XML part's root namespace: what marks a PowerPoint file as an ARBI presentation. */\nexport const PRESENTATION_XML_NS = 'urn:arbi:presentation:v1'\n\nconst RELS_NS = 'http://schemas.openxmlformats.org/package/2006/relationships'\nconst CUSTOM_XML_REL =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml'\nconst CUSTOM_XML_PROPS_REL =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps'\nconst CUSTOM_XML_PROPS_TYPE =\n 'application/vnd.openxmlformats-officedocument.customXmlProperties+xml'\n\nconst escapeXml = (text: string) =>\n text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n\nconst unescapeXml = (text: string) =>\n text\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, '&')\n\nconst ROOT =\n /<arbiPresentation\\b[^>]*xmlns=\"urn:arbi:presentation:v1\"[^>]*>([\\s\\S]*?)<\\/arbiPresentation>/\n\nasync function loadZip(file: Blob | Uint8Array) {\n const { default: JSZip } = await import('jszip')\n return JSZip.loadAsync(file instanceof Blob ? await file.arrayBuffer() : file)\n}\n\n/** A PowerPoint file (any zip) by its first bytes (\"PK\\x03\\x04\"). */\nexport const isZipBytes = (bytes: Uint8Array): boolean =>\n bytes[0] === 0x50 && bytes[1] === 0x4b && bytes[2] === 0x03 && bytes[3] === 0x04\n\n/** The editable data in a PowerPoint file (its JSON), or null when it has none (another deck). */\nexport async function readPptxPresentationData(file: Blob | Uint8Array): Promise<string | null> {\n const zip = await loadZip(file)\n for (const name of Object.keys(zip.files)) {\n if (!/^customXml\\/item\\d+\\.xml$/.test(name)) continue\n const match = ROOT.exec(await zip.file(name)!.async('string'))\n if (match) return unescapeXml(match[1])\n }\n return null\n}\n\n/**\n * The PowerPoint file with `json` as its editable data (replacing data it had): the part, its\n * properties, and the relationships and content type that make it part of the package.\n */\nexport async function writePptxPresentationData(file: Blob, json: string): Promise<Blob> {\n const zip = await loadZip(file)\n // An earlier copy of the data goes; any other custom XML part stays as it is.\n let index = 1\n for (const name of Object.keys(zip.files)) {\n const match = /^customXml\\/item(\\d+)\\.xml$/.exec(name)\n if (!match) continue\n if (ROOT.test(await zip.file(name)!.async('string'))) {\n index = Number(match[1])\n break\n }\n index = Math.max(index, Number(match[1]) + 1)\n }\n const item = `customXml/item${index}.xml`\n const props = `customXml/itemProps${index}.xml`\n zip.file(\n item,\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<arbiPresentation xmlns=\"${PRESENTATION_XML_NS}\">${escapeXml(json)}</arbiPresentation>`\n )\n zip.file(\n props,\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\\n<ds:datastoreItem ds:itemID=\"{8B1C2E5A-7D40-4E9B-A1F3-0C6D2B9E4A71}\" xmlns:ds=\"http://schemas.openxmlformats.org/officeDocument/2006/customXml\"><ds:schemaRefs><ds:schemaRef ds:uri=\"${PRESENTATION_XML_NS}\"/></ds:schemaRefs></ds:datastoreItem>`\n )\n zip.file(\n `customXml/_rels/item${index}.xml.rels`,\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"${RELS_NS}\"><Relationship Id=\"rId1\" Type=\"${CUSTOM_XML_PROPS_REL}\" Target=\"itemProps${index}.xml\"/></Relationships>`\n )\n\n const typesName = '[Content_Types].xml'\n let types = await zip.file(typesName)!.async('string')\n if (!types.includes(`PartName=\"/${props}\"`)) {\n types = types.replace(\n '</Types>',\n `<Override PartName=\"/${props}\" ContentType=\"${CUSTOM_XML_PROPS_TYPE}\"/></Types>`\n )\n zip.file(typesName, types)\n }\n\n const relsName = 'ppt/_rels/presentation.xml.rels'\n let rels = await zip.file(relsName)!.async('string')\n if (!rels.includes(`Target=\"../${item}\"`)) {\n rels = rels.replace(\n '</Relationships>',\n `<Relationship Id=\"rIdArbiPresentation\" Type=\"${CUSTOM_XML_REL}\" Target=\"../${item}\"/></Relationships>`\n )\n zip.file(relsName, rels)\n }\n\n return zip.generateAsync({\n type: 'blob',\n mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n compression: 'DEFLATE',\n })\n}\n"],
5
+ "mappings": ";AAaO,MAAM,sBAAsB;AAEnC,MAAM,UAAU;AAChB,MAAM,iBACJ;AACF,MAAM,uBACJ;AACF,MAAM,wBACJ;AAEF,MAAM,YAAY,CAAC,SACjB,KAAK,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM;AAExE,MAAM,cAAc,CAAC,SACnB,KACG,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,WAAW,GAAG,EACtB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG;AAE1B,MAAM,OACJ;AAEF,eAAe,QAAQ,MAAyB;AAC9C,QAAM,EAAE,SAAS,MAAM,IAAI,MAAM,OAAO,OAAO;AAC/C,SAAO,MAAM,UAAU,gBAAgB,OAAO,MAAM,KAAK,YAAY,IAAI,IAAI;AAC/E;AAGO,MAAM,aAAa,CAAC,UACzB,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,KAAQ,MAAM,CAAC,MAAM;AAG9E,eAAsB,yBAAyB,MAAiD;AAC9F,QAAM,MAAM,MAAM,QAAQ,IAAI;AAC9B,aAAW,QAAQ,OAAO,KAAK,IAAI,KAAK,GAAG;AACzC,QAAI,CAAC,4BAA4B,KAAK,IAAI,EAAG;AAC7C,UAAM,QAAQ,KAAK,KAAK,MAAM,IAAI,KAAK,IAAI,EAAG,MAAM,QAAQ,CAAC;AAC7D,QAAI,MAAO,QAAO,YAAY,MAAM,CAAC,CAAC;AAAA,EACxC;AACA,SAAO;AACT;AAMA,eAAsB,0BAA0B,MAAY,MAA6B;AACvF,QAAM,MAAM,MAAM,QAAQ,IAAI;AAE9B,MAAI,QAAQ;AACZ,aAAW,QAAQ,OAAO,KAAK,IAAI,KAAK,GAAG;AACzC,UAAM,QAAQ,8BAA8B,KAAK,IAAI;AACrD,QAAI,CAAC,MAAO;AACZ,QAAI,KAAK,KAAK,MAAM,IAAI,KAAK,IAAI,EAAG,MAAM,QAAQ,CAAC,GAAG;AACpD,cAAQ,OAAO,MAAM,CAAC,CAAC;AACvB;AAAA,IACF;AACA,YAAQ,KAAK,IAAI,OAAO,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC;AAAA,EAC9C;AACA,QAAM,OAAO,iBAAiB,KAAK;AACnC,QAAM,QAAQ,sBAAsB,KAAK;AACzC,MAAI;AAAA,IACF;AAAA,IACA;AAAA,2BAAqF,mBAAmB,KAAK,UAAU,IAAI,CAAC;AAAA,EAC9H;AACA,MAAI;AAAA,IACF;AAAA,IACA;AAAA,uLAAgP,mBAAmB;AAAA,EACrQ;AACA,MAAI;AAAA,IACF,uBAAuB,KAAK;AAAA,IAC5B;AAAA,wBAAkF,OAAO,mCAAmC,oBAAoB,sBAAsB,KAAK;AAAA,EAC7K;AAEA,QAAM,YAAY;AAClB,MAAI,QAAQ,MAAM,IAAI,KAAK,SAAS,EAAG,MAAM,QAAQ;AACrD,MAAI,CAAC,MAAM,SAAS,cAAc,KAAK,GAAG,GAAG;AAC3C,YAAQ,MAAM;AAAA,MACZ;AAAA,MACA,wBAAwB,KAAK,kBAAkB,qBAAqB;AAAA,IACtE;AACA,QAAI,KAAK,WAAW,KAAK;AAAA,EAC3B;AAEA,QAAM,WAAW;AACjB,MAAI,OAAO,MAAM,IAAI,KAAK,QAAQ,EAAG,MAAM,QAAQ;AACnD,MAAI,CAAC,KAAK,SAAS,cAAc,IAAI,GAAG,GAAG;AACzC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,gDAAgD,cAAc,gBAAgB,IAAI;AAAA,IACpF;AACA,QAAI,KAAK,UAAU,IAAI;AAAA,EACzB;AAEA,SAAO,IAAI,cAAc;AAAA,IACvB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Reading a PowerPoint package's XML: its parts and relationships, and DrawingML's colours, fills,
3
+ * outlines and theme (colour scheme, fonts) as PowerPoint resolves them. What `import-pptx` builds
4
+ * slides from.
5
+ */
6
+ import type JSZip from 'jszip';
7
+ export declare const NS: {
8
+ a: string;
9
+ p: string;
10
+ r: string;
11
+ };
12
+ /** EMUs per point. */
13
+ export declare const EMU_PER_POINT = 12700;
14
+ /** The element's child elements named `name` (by local name, any namespace). */
15
+ export declare function kids(element: Element | null | undefined, name?: string): Element[];
16
+ /** The first child element named `name`. */
17
+ export declare function kid(element: Element | null | undefined, name: string): Element | null;
18
+ /** The element at a path of child names (`path(sp, 'spPr', 'xfrm')`). */
19
+ export declare function path(element: Element | null | undefined, ...names: string[]): Element | null;
20
+ /** A numeric attribute, or `fallback`. */
21
+ export declare function numAttr(element: Element | null | undefined, name: string, fallback?: number): number;
22
+ /** A relationship id attribute (`r:embed`, `r:id`…). */
23
+ export declare const relAttr: (element: Element | null | undefined, name: string) => string | null;
24
+ /** A truthy OOXML boolean attribute ("1", "true"). */
25
+ export declare const boolAttr: (element: Element | null | undefined, name: string) => boolean | undefined;
26
+ /** A package: its parts parsed on demand and its relationships resolved. */
27
+ export declare class Package {
28
+ readonly zip: JSZip;
29
+ private parsed;
30
+ private rels;
31
+ constructor(zip: JSZip);
32
+ xml(part: string): Promise<Document | null>;
33
+ bytes(part: string): Promise<Uint8Array | null>;
34
+ /** A part's relationships by id, their targets resolved to part names. */
35
+ relationships(part: string): Promise<Map<string, {
36
+ target: string;
37
+ type: string;
38
+ external: boolean;
39
+ }>>;
40
+ /** The first relationship of `part` whose type ends with `type` ("/slideLayout"). */
41
+ related(part: string, type: string): Promise<string | null>;
42
+ }
43
+ /** A relationship target resolved against the part's folder ("../media/a.png" → "ppt/media/a.png"). */
44
+ export declare function resolvePart(dir: string, target: string): string;
45
+ export interface Color {
46
+ hex: string;
47
+ alpha: number;
48
+ }
49
+ export interface DeckTheme {
50
+ /** Scheme colours by name (dk1, lt1, accent1…), and the master's mapping (bg1 → lt1…). */
51
+ scheme: Record<string, string>;
52
+ map: Record<string, string>;
53
+ majorFont: string;
54
+ minorFont: string;
55
+ /** The theme's line widths (lnStyleLst), in points, by style index (1-based). */
56
+ lineWidths: number[];
57
+ }
58
+ /** The colour a DrawingML colour element names (srgbClr, schemeClr…), its modifiers applied. */
59
+ export declare function readColor(element: Element | null, theme: DeckTheme, placeholder?: Color): Color | null;
60
+ /** The colour inside an element that holds one (solidFill, a style ref…). */
61
+ export declare function colorIn(element: Element | null, theme: DeckTheme, placeholder?: Color): Color | null;
62
+ export type Fill = {
63
+ kind: 'none';
64
+ } | {
65
+ kind: 'solid';
66
+ color: Color;
67
+ } | {
68
+ kind: 'gradient';
69
+ from: Color;
70
+ to: Color;
71
+ angle: number;
72
+ } | {
73
+ kind: 'image';
74
+ embed: string;
75
+ srcRect: Element | null;
76
+ };
77
+ /** The fill an element holding fill properties (spPr, bgPr, tcPr) sets, if any. */
78
+ export declare function readFill(element: Element | null, theme: DeckTheme, placeholder?: Color): Fill | null;
79
+ /** An outline (a:ln), if it draws: its colour, width (points) and dash. */
80
+ export declare function readLine(ln: Element | null, theme: DeckTheme, placeholder?: Color): {
81
+ color: Color;
82
+ width: number;
83
+ dash: boolean;
84
+ } | null | undefined;
85
+ /** A deck's theme, from the theme part its master uses, with the master's colour map. */
86
+ export declare function readTheme(pkg: Package, master: string): Promise<DeckTheme>;
87
+ /** A typeface as named in a run, the theme's fonts resolved. */
88
+ export declare function typefaceOf(name: string | null | undefined, theme: DeckTheme): string | undefined;
89
+ /** A media part as a data URL (null for formats a browser cannot show: EMF, WMF, TIFF). */
90
+ export declare function mediaDataUrl(pkg: Package, part: string): Promise<string | null>;