@arbidocs/blocks 0.5.123 → 0.5.125

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 (192) hide show
  1. package/dist/{ClippingMediaViewer-IEIBT74X.cjs → ClippingMediaViewer-ZFEX5A3U.cjs} +11 -10
  2. package/dist/ClippingMediaViewer-ZFEX5A3U.cjs.map +1 -0
  3. package/dist/{ClippingPdfViewer-OGYLMVCE.cjs → ClippingPdfViewer-3LRTEPHV.cjs} +45 -11
  4. package/dist/ClippingPdfViewer-3LRTEPHV.cjs.map +1 -0
  5. package/dist/ConnectedCallDock-XJOYVVAH.cjs +6 -6
  6. package/dist/ConnectedCallRoom-CUDYAPQK.cjs +6 -6
  7. package/dist/{ConnectedNativeDocxComparison-QKHCYD6W.cjs → ConnectedNativeDocxComparison-7QQ55JIO.cjs} +13 -13
  8. package/dist/{ConnectedNativeDocxComparison-QKHCYD6W.cjs.map → ConnectedNativeDocxComparison-7QQ55JIO.cjs.map} +1 -1
  9. package/dist/{ConnectedPresentation-5DOJ35XL.cjs → ConnectedPresentation-L32JPRFI.cjs} +30 -156
  10. package/dist/ConnectedPresentation-L32JPRFI.cjs.map +1 -0
  11. package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
  12. package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
  13. package/dist/{ConnectedSlidesTab-7YMEDGUU.cjs → ConnectedSlidesTab-P7GGNUTO.cjs} +31 -29
  14. package/dist/ConnectedSlidesTab-P7GGNUTO.cjs.map +1 -0
  15. package/dist/{ConnectedStreamedWordArtifact-AG62232A.cjs → ConnectedStreamedWordArtifact-7NJ3N52V.cjs} +13 -13
  16. package/dist/{ConnectedStreamedWordArtifact-AG62232A.cjs.map → ConnectedStreamedWordArtifact-7NJ3N52V.cjs.map} +1 -1
  17. package/dist/{DocumentReviewCard-M53XFLI2.cjs → DocumentReviewCard-BFPOFQXI.cjs} +16 -16
  18. package/dist/{DocumentReviewCard-M53XFLI2.cjs.map → DocumentReviewCard-BFPOFQXI.cjs.map} +1 -1
  19. package/dist/{FilesViewerDialog-2QCCRWF2.cjs → FilesViewerDialog-MHUVEZ7M.cjs} +35 -32
  20. package/dist/FilesViewerDialog-MHUVEZ7M.cjs.map +1 -0
  21. package/dist/{NativeDocxEditor-2LQY2CTV.cjs → NativeDocxEditor-SIRYPMBN.cjs} +6 -6
  22. package/dist/{NativeDocxEditor-2LQY2CTV.cjs.map → NativeDocxEditor-SIRYPMBN.cjs.map} +1 -1
  23. package/dist/SpotlightStrip-ED22UYTM.cjs +398 -0
  24. package/dist/SpotlightStrip-ED22UYTM.cjs.map +1 -0
  25. package/dist/{WorkspaceTableView-3XYAV4BV.cjs → WorkspaceTableView-MIFYXV3G.cjs} +8 -8
  26. package/dist/{WorkspaceTableView-3XYAV4BV.cjs.map → WorkspaceTableView-MIFYXV3G.cjs.map} +1 -1
  27. package/dist/agents/index.cjs +216 -216
  28. package/dist/ai-IEIR7SC2.cjs +3 -3
  29. package/dist/auth/index.cjs +1 -1
  30. package/dist/calls/index.cjs +2 -2
  31. package/dist/chat/index.cjs +6 -6
  32. package/dist/{chunk-GNZAH6UI.cjs → chunk-2K6IMIVL.cjs} +3 -3
  33. package/dist/{chunk-GNZAH6UI.cjs.map → chunk-2K6IMIVL.cjs.map} +1 -1
  34. package/dist/{chunk-NQML7IUC.cjs → chunk-3UP32FM3.cjs} +6 -6
  35. package/dist/{chunk-NQML7IUC.cjs.map → chunk-3UP32FM3.cjs.map} +1 -1
  36. package/dist/chunk-3ZZZO4F7.cjs +145 -0
  37. package/dist/chunk-3ZZZO4F7.cjs.map +1 -0
  38. package/dist/{chunk-L4CIFLCU.cjs → chunk-4LP5MJGQ.cjs} +4 -4
  39. package/dist/{chunk-L4CIFLCU.cjs.map → chunk-4LP5MJGQ.cjs.map} +1 -1
  40. package/dist/{chunk-JD2HX2BR.cjs → chunk-6JMW3IJ2.cjs} +152 -155
  41. package/dist/chunk-6JMW3IJ2.cjs.map +1 -0
  42. package/dist/{chunk-WV7BCGCK.cjs → chunk-7RJZIPLE.cjs} +33 -33
  43. package/dist/{chunk-WV7BCGCK.cjs.map → chunk-7RJZIPLE.cjs.map} +1 -1
  44. package/dist/{chunk-WFMWKPGY.cjs → chunk-ADPRIBSH.cjs} +9 -33
  45. package/dist/chunk-ADPRIBSH.cjs.map +1 -0
  46. package/dist/{chunk-7NLO7ASW.cjs → chunk-AISYXX4M.cjs} +4 -4
  47. package/dist/{chunk-7NLO7ASW.cjs.map → chunk-AISYXX4M.cjs.map} +1 -1
  48. package/dist/{chunk-5QERK4PK.cjs → chunk-AS6QZETU.cjs} +35 -35
  49. package/dist/{chunk-5QERK4PK.cjs.map → chunk-AS6QZETU.cjs.map} +1 -1
  50. package/dist/{chunk-V6MW7B4B.cjs → chunk-B3R62764.cjs} +6 -6
  51. package/dist/{chunk-V6MW7B4B.cjs.map → chunk-B3R62764.cjs.map} +1 -1
  52. package/dist/{chunk-VKH3BEZE.cjs → chunk-BLIO3B7Z.cjs} +3 -3
  53. package/dist/{chunk-VKH3BEZE.cjs.map → chunk-BLIO3B7Z.cjs.map} +1 -1
  54. package/dist/{chunk-46P7IDBX.cjs → chunk-CQ2RJYE2.cjs} +4 -4
  55. package/dist/chunk-CQ2RJYE2.cjs.map +1 -0
  56. package/dist/{chunk-MXBXZXXQ.cjs → chunk-ENOPKX7E.cjs} +3 -3
  57. package/dist/{chunk-MXBXZXXQ.cjs.map → chunk-ENOPKX7E.cjs.map} +1 -1
  58. package/dist/{chunk-2CSLFAGF.cjs → chunk-GAMRVB3I.cjs} +4 -3
  59. package/dist/chunk-GAMRVB3I.cjs.map +1 -0
  60. package/dist/chunk-IRGRMJPP.cjs +18 -0
  61. package/dist/{chunk-SDRYSLOX.cjs.map → chunk-IRGRMJPP.cjs.map} +1 -1
  62. package/dist/{chunk-ADDQKZ5I.cjs → chunk-J3FFSEKO.cjs} +4 -4
  63. package/dist/{chunk-ADDQKZ5I.cjs.map → chunk-J3FFSEKO.cjs.map} +1 -1
  64. package/dist/chunk-JITYC4OS.cjs +66 -0
  65. package/dist/chunk-JITYC4OS.cjs.map +1 -0
  66. package/dist/chunk-JY7UUZQG.cjs +1513 -0
  67. package/dist/chunk-JY7UUZQG.cjs.map +1 -0
  68. package/dist/{chunk-ALK3PUUB.cjs → chunk-L6HTZIBD.cjs} +3 -3
  69. package/dist/{chunk-ALK3PUUB.cjs.map → chunk-L6HTZIBD.cjs.map} +1 -1
  70. package/dist/chunk-MVXHTAJ4.cjs +111 -0
  71. package/dist/chunk-MVXHTAJ4.cjs.map +1 -0
  72. package/dist/{chunk-OHHKBURG.cjs → chunk-OGK377NL.cjs} +33 -33
  73. package/dist/{chunk-OHHKBURG.cjs.map → chunk-OGK377NL.cjs.map} +1 -1
  74. package/dist/{chunk-T73BHNQX.cjs → chunk-OHWHYVKG.cjs} +3 -3
  75. package/dist/{chunk-T73BHNQX.cjs.map → chunk-OHWHYVKG.cjs.map} +1 -1
  76. package/dist/{chunk-4TTX6ZNS.cjs → chunk-ORNLCBNE.cjs} +24 -2
  77. package/dist/chunk-ORNLCBNE.cjs.map +1 -0
  78. package/dist/{chunk-MLA2BJ2Y.cjs → chunk-PSB64T43.cjs} +28 -28
  79. package/dist/{chunk-MLA2BJ2Y.cjs.map → chunk-PSB64T43.cjs.map} +1 -1
  80. package/dist/{chunk-COD5ENHK.cjs → chunk-PVJ5ODDB.cjs} +4 -4
  81. package/dist/{chunk-COD5ENHK.cjs.map → chunk-PVJ5ODDB.cjs.map} +1 -1
  82. package/dist/{chunk-7557LDAN.cjs → chunk-PWBRE7JA.cjs} +5 -5
  83. package/dist/{chunk-7557LDAN.cjs.map → chunk-PWBRE7JA.cjs.map} +1 -1
  84. package/dist/{chunk-7PN3YENO.cjs → chunk-QIK7E6VF.cjs} +4 -4
  85. package/dist/{chunk-7PN3YENO.cjs.map → chunk-QIK7E6VF.cjs.map} +1 -1
  86. package/dist/{chunk-DWMWEALB.cjs → chunk-TSFNLY3K.cjs} +143 -1634
  87. package/dist/chunk-TSFNLY3K.cjs.map +1 -0
  88. package/dist/{chunk-YGBHY67W.cjs → chunk-UA7HOLAZ.cjs} +5 -5
  89. package/dist/{chunk-YGBHY67W.cjs.map → chunk-UA7HOLAZ.cjs.map} +1 -1
  90. package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
  91. package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
  92. package/dist/chunk-WVZLAAIZ.cjs +31 -0
  93. package/dist/chunk-WVZLAAIZ.cjs.map +1 -0
  94. package/dist/{chunk-E3L5DB5F.cjs → chunk-YOEP3I4V.cjs} +5 -5
  95. package/dist/{chunk-E3L5DB5F.cjs.map → chunk-YOEP3I4V.cjs.map} +1 -1
  96. package/dist/{chunk-SNPK3R3O.cjs → chunk-YVO6Z5BS.cjs} +10 -10
  97. package/dist/{chunk-SNPK3R3O.cjs.map → chunk-YVO6Z5BS.cjs.map} +1 -1
  98. package/dist/chunk-ZZZITHGK.cjs +119 -0
  99. package/dist/chunk-ZZZITHGK.cjs.map +1 -0
  100. package/dist/connect/docx.cjs +17 -17
  101. package/dist/connect/index.cjs +994 -994
  102. package/dist/connect/viewer.cjs +28 -25
  103. package/dist/connection/presentation/ClippingMediaViewer.js +3 -3
  104. package/dist/connection/presentation/ClippingMediaViewer.js.map +2 -2
  105. package/dist/connection/presentation/ClippingPdfViewer.d.ts +4 -3
  106. package/dist/connection/presentation/ClippingPdfViewer.js +48 -9
  107. package/dist/connection/presentation/ClippingPdfViewer.js.map +2 -2
  108. package/dist/connection/presentation/SpotlightLayer.d.ts +5 -0
  109. package/dist/connection/presentation/SpotlightLayer.js +19 -0
  110. package/dist/connection/presentation/SpotlightLayer.js.map +7 -0
  111. package/dist/connection/presentation/SpotlightStrip.d.ts +10 -0
  112. package/dist/connection/presentation/SpotlightStrip.js +237 -0
  113. package/dist/connection/presentation/SpotlightStrip.js.map +7 -0
  114. package/dist/connection/presentation/useViewerClipping.d.ts +4 -3
  115. package/dist/connection/presentation/useViewerClipping.js +8 -4
  116. package/dist/connection/presentation/useViewerClipping.js.map +2 -2
  117. package/dist/connection/viewer/ConnectedDocumentViewer.js +1 -1
  118. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  119. package/dist/connection/viewer/VersionDropdown.js +1 -1
  120. package/dist/connection/viewer/VersionDropdown.js.map +1 -1
  121. package/dist/connection/viewer/ViewerPdfPane.js +2 -0
  122. package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
  123. package/dist/connection/viewer/pdf/passageHighlights.d.ts +5 -0
  124. package/dist/connection/viewer/pdf/passageHighlights.js +14 -1
  125. package/dist/connection/viewer/pdf/passageHighlights.js.map +2 -2
  126. package/dist/connection/viewer/pdf/usePassageTextFallback.d.ts +12 -0
  127. package/dist/connection/viewer/pdf/usePassageTextFallback.js +30 -0
  128. package/dist/connection/viewer/pdf/usePassageTextFallback.js.map +7 -0
  129. package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +2 -11
  130. package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +2 -2
  131. package/dist/connection/viewer/useCleanView.d.ts +3 -1
  132. package/dist/connection/viewer/useCleanView.js +6 -3
  133. package/dist/connection/viewer/useCleanView.js.map +2 -2
  134. package/dist/connection/viewer/useViewerTabs.js +13 -1
  135. package/dist/connection/viewer/useViewerTabs.js.map +2 -2
  136. package/dist/document-tools/DocumentToolButtons.js +1 -1
  137. package/dist/document-tools/DocumentToolButtons.js.map +1 -1
  138. package/dist/document-tools/index.cjs +20 -20
  139. package/dist/docx/DocxCommandMenu.js +2 -1
  140. package/dist/docx/DocxCommandMenu.js.map +2 -2
  141. package/dist/docx/index.cjs +38 -38
  142. package/dist/embed/index.cjs +20 -20
  143. package/dist/facts/index.cjs +64 -64
  144. package/dist/files/index.cjs +223 -223
  145. package/dist/index.cjs +521 -521
  146. package/dist/presentation/ClipCaptureOverlay.d.ts +7 -3
  147. package/dist/presentation/ClipCaptureOverlay.js +43 -14
  148. package/dist/presentation/ClipCaptureOverlay.js.map +2 -2
  149. package/dist/presentation/PresentControls.d.ts +8 -0
  150. package/dist/presentation/PresentControls.js +1 -0
  151. package/dist/presentation/PresentControls.js.map +2 -2
  152. package/dist/presentation/PresentationStage.d.ts +10 -2
  153. package/dist/presentation/PresentationStage.js +6 -3
  154. package/dist/presentation/PresentationStage.js.map +2 -2
  155. package/dist/presentation/PresenterView.js +1 -22
  156. package/dist/presentation/PresenterView.js.map +2 -2
  157. package/dist/presentation/SpotlightView.d.ts +19 -0
  158. package/dist/presentation/SpotlightView.js +180 -0
  159. package/dist/presentation/SpotlightView.js.map +7 -0
  160. package/dist/presentation/passage-clip.d.ts +17 -0
  161. package/dist/presentation/passage-clip.js +25 -0
  162. package/dist/presentation/passage-clip.js.map +7 -0
  163. package/dist/presentation/spotlight.d.ts +58 -0
  164. package/dist/presentation/spotlight.js +110 -0
  165. package/dist/presentation/spotlight.js.map +7 -0
  166. package/dist/presentation/store.d.ts +5 -0
  167. package/dist/presentation/store.js +19 -0
  168. package/dist/presentation/store.js.map +2 -2
  169. package/dist/presentation/usePointerActive.d.ts +2 -0
  170. package/dist/presentation/usePointerActive.js +28 -0
  171. package/dist/presentation/usePointerActive.js.map +7 -0
  172. package/dist/settings/index.cjs +146 -146
  173. package/dist/site/index.cjs +6 -6
  174. package/dist/studio/index.cjs +9 -9
  175. package/dist/styles.css +1 -1
  176. package/dist/workflow-canvas/index.cjs +35 -35
  177. package/node_modules/@arbidocs/coedit/package.json +1 -1
  178. package/package.json +5 -5
  179. package/dist/ClippingMediaViewer-IEIBT74X.cjs.map +0 -1
  180. package/dist/ClippingPdfViewer-OGYLMVCE.cjs.map +0 -1
  181. package/dist/ConnectedPresentation-5DOJ35XL.cjs.map +0 -1
  182. package/dist/ConnectedSlidesTab-7YMEDGUU.cjs.map +0 -1
  183. package/dist/FilesViewerDialog-2QCCRWF2.cjs.map +0 -1
  184. package/dist/chunk-2CSLFAGF.cjs.map +0 -1
  185. package/dist/chunk-46P7IDBX.cjs.map +0 -1
  186. package/dist/chunk-4TTX6ZNS.cjs.map +0 -1
  187. package/dist/chunk-DWMWEALB.cjs.map +0 -1
  188. package/dist/chunk-JD2HX2BR.cjs.map +0 -1
  189. package/dist/chunk-SDRYSLOX.cjs +0 -18
  190. package/dist/chunk-WFMWKPGY.cjs.map +0 -1
  191. package/dist/chunk-XK4TVJKD.cjs +0 -73
  192. package/dist/chunk-XK4TVJKD.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presentation/ClipTray.tsx","../src/presentation/DesignMenu.tsx","../src/presentation/LayoutMenu.tsx","../src/presentation/Notice.tsx","../src/presentation/SlidesEditor.tsx","../src/presentation/draw-boxes.ts","../src/presentation/render-slides.ts","../src/presentation/export-boxes.ts","../src/presentation/export-pptx.ts","../src/presentation/pptx-data.ts","../src/presentation/pptx-xml.ts","../src/presentation/import-pptx.ts","../src/presentation/merge-outside-edits.ts","../src/connection/presentation/usePresentationFiles.ts","../src/connection/presentation/useImageGeneration.ts","../src/connection/presentation/PresentationDialogs.tsx","../src/connection/presentation/CropClipDialog.tsx","../src/connection/presentation/LabelColumnMenu.tsx","../src/connection/presentation/GenerateTile.tsx","../src/connection/presentation/useLabelColumns.ts","../src/connection/presentation/usePresentationController.tsx"],"names":["box","jsx","ClipImage","useState","usePresentation","useClipDrag","useRef","jsxs","cn","Check","X","createPortal","useMemo","currentSlide","Plus","isHexColor","ACCENTS","Popover","PopoverTrigger","Button","Palette","PopoverContent","BACKGROUNDS","backgroundCss","FONTS","accentColor","Trash2","ImagePlus","slideGeometry","STAGE_MARGIN","DropdownMenu","DropdownMenuTrigger","LAYOUT_INFO","ChevronDown","DropdownMenuContent","SLIDE_LAYOUTS","DropdownMenuItem","useEffect","CircleAlert","CircleCheck","memo","SlideCard","current","useCallback","MoreHorizontal","ArrowUp","ArrowDown","Copy","DropdownMenuSeparator","PresentationStage","Type","Square","RectangleHorizontal","Circle","Minus","newBox","isLightBackground","Shapes","usePresenterKeys","DropdownMenuCheckboxItem","Play","pointsToStage","DEFAULT_TEXT_SIZE","TEXT_COLORS","DEFAULT_INSET","lineWidth","STAGE_ASPECT","renderPdfRegion","closePdfRegionImage","outline","paintClipEdge","textLines","paintSlideBackground","paintBackground","frameHeight","clipLabel","SLIDE_INCHES","hex","pixels","data","at","runs","xfrm","frame","SLIDE_POINTS","DEFAULT_THEME","slide","readPdfAttachment","PRESENTATION_ATTACHMENT","useArbi","useDocumentTools","useArbiSessionState","serializePresentation","presentationFileName","TEMPLATES_FOLDER","PRESENTATIONS_FOLDER","imagesToPdf","safeFileStem","EXPORTS_FOLDER","isPresentationFileName","presentationTitle","parsePresentation","fetchDocumentPdf","createMarkupStore","MarkupStoreError","PROMPT_BINDINGS","GENERATE_IMAGE_ID","mediaCaption","useWorkflowDefinitions","ConnectedWorkflowStart","ModalScaffold","FileDown","Save","Input","Loader2","useBlocksEnvironment","LayoutTemplate","FolderOpen","Presentation","useDocuments","getDocumentTitle","ImageIcon","DocumentPicker","useObjectUrl","Crop","ImageCropper","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","DropdownMenuRadioGroup","DropdownMenuRadioItem","Sparkles","useTags","note","useArbiSessionStore","Fragment","editPresentation"],"mappings":"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","file":"chunk-TSFNLY3K.cjs","sourcesContent":["/**\n * The clips taken so far, as a strip of tiles along the bottom (the files explorer's tile look).\n * Drag one up onto the slide or onto a slide card, with a mouse, pen or finger, or tap it to add\n * it to this slide; a check marks those already on it; × deletes a clip; double-click its label\n * to rename it. The strip scrolls sideways; on a touch screen a sideways swipe scrolls and a drag\n * upwards moves the clip.\n */\n\nimport { useMemo, useRef, useState, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Check, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ClipImage } from './ClipImage'\nimport type { Clip } from './model'\nimport { currentSlide, usePresentation } from './store'\nimport { useClipDrag } from './useClipDrag'\n\n/** Tile height (px); its width follows the clip's shape, within these bounds. */\nconst TILE_HEIGHT = 72\nconst TILE_WIDTH = { min: 56, max: 168 }\n\nfunction tileSize(aspect: number, height = TILE_HEIGHT) {\n const width = Math.min(Math.max(height * aspect, TILE_WIDTH.min), TILE_WIDTH.max)\n return { width, height }\n}\n\n/** The clip, fitted in a box, aspect kept. */\nfunction Fitted({ clip, box }: { clip: Clip; box: { width: number; height: number } }) {\n const wide = clip.aspect > box.width / box.height\n const size = wide\n ? { width: box.width, height: box.width / clip.aspect }\n : { width: box.height * clip.aspect, height: box.height }\n return (\n <div className=\"pointer-events-none\" style={size}>\n <ClipImage clip={clip} />\n </div>\n )\n}\n\nfunction Label({ clip }: { clip: Clip }) {\n const [editing, setEditing] = useState(false)\n if (editing) {\n return (\n <input\n autoFocus\n defaultValue={clip.caption}\n aria-label=\"Clip label\"\n className=\"w-full rounded border border-input bg-background px-1 text-[11px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onBlur={(event) => {\n usePresentation.getState().setCaption(clip.id, event.target.value)\n setEditing(false)\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter') event.currentTarget.blur()\n if (event.key === 'Escape') setEditing(false)\n }}\n />\n )\n }\n return (\n <button\n type=\"button\"\n onDoubleClick={() => setEditing(true)}\n title=\"Double-click to rename\"\n className=\"block w-full truncate rounded px-0.5 text-left text-[11px] text-muted-foreground hover:text-foreground\"\n >\n {clip.caption || 'Untitled'}\n </button>\n )\n}\n\nfunction TrayTile({ clip, onSlide }: { clip: Clip; onSlide: boolean }) {\n const { place, removeClip } = usePresentation.getState()\n const drag = useClipDrag(clip.id, () => !onSlide && place(clip.id))\n const itemRef = useRef<HTMLLIElement>(null)\n const size = tileSize(clip.aspect)\n return (\n <li\n ref={itemRef}\n className=\"group relative flex shrink-0 flex-col gap-1\"\n style={{ width: size.width }}\n data-testid={`tray-clip-${clip.id}`}\n >\n <div\n className={cn(\n 'relative flex cursor-grab touch-pan-x select-none items-center justify-center overflow-hidden rounded-lg border bg-muted active:cursor-grabbing',\n onSlide ? 'border-primary/40' : 'border-border hover:bg-muted/70',\n drag.ghost && 'opacity-40'\n )}\n style={{ height: size.height }}\n {...drag.handlers}\n title={\n onSlide ? 'On this slide: drag to place it again' : 'Drag onto the slide, or tap to add'\n }\n data-testid=\"tray-clip-handle\"\n >\n <Fitted clip={clip} box={{ width: size.width - 8, height: size.height - 8 }} />\n {onSlide && (\n <span\n className=\"absolute left-1 top-1 flex size-4 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-sm\"\n aria-label=\"On this slide\"\n >\n <Check className=\"size-3\" />\n </span>\n )}\n </div>\n <button\n type=\"button\"\n className=\"absolute right-1 top-1 flex size-5 items-center justify-center rounded-md bg-background/90 text-muted-foreground opacity-0 shadow-sm backdrop-blur-sm transition-opacity hover:text-destructive focus-visible:opacity-100 group-hover:opacity-100 pointer-coarse:size-11 pointer-coarse:opacity-100\"\n title=\"Delete clip\"\n aria-label={`Delete ${clip.caption || 'clip'}`}\n onClick={() => removeClip(clip.id)}\n >\n <X className=\"size-3\" />\n </button>\n <Label clip={clip} />\n {/* The tile following the pointer while dragging, above everything in its window. */}\n {drag.ghost &&\n createPortal(\n <div\n className=\"pointer-events-none fixed z-[100] flex -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-lg border border-border bg-card p-1 shadow-xl\"\n style={{ left: drag.ghost.x, top: drag.ghost.y }}\n data-testid=\"tray-drag-ghost\"\n >\n <Fitted clip={clip} box={tileSize(clip.aspect, 96)} />\n </div>,\n // The tray's own window (the app's, or the presentation pop-out's).\n itemRef.current?.ownerDocument.body ?? document.body\n )}\n </li>\n )\n}\n\nexport function ClipTray({ start }: { start?: ReactNode }) {\n const all = usePresentation((s) => s.clips)\n // A picture that is part of a slide's design (an imported deck's) is no clip to arrange.\n const clips = useMemo(() => all.filter((clip) => !clip.plain), [all])\n const slide = usePresentation(currentSlide)\n const onSlide = new Set(slide?.items.map((item) => item.clipId))\n return (\n <div className=\"shrink-0 border-t border-border bg-background\" data-testid=\"clip-tray-bar\">\n {clips.length || start ? (\n <ul\n className=\"flex items-start gap-2 overflow-x-auto overscroll-x-contain px-3 py-2 [scrollbar-width:none]\"\n aria-label=\"Clips\"\n data-testid=\"clip-tray\"\n >\n {start && <li className=\"shrink-0\">{start}</li>}\n {clips.map((clip) => (\n <TrayTile key={clip.id} clip={clip} onSlide={onSlide.has(clip.id)} />\n ))}\n </ul>\n ) : (\n <p\n className=\"px-4 py-5 text-center text-xs text-muted-foreground\"\n data-testid=\"clip-tray-empty\"\n >\n Your clips appear here. In a document, choose <strong>Clip</strong> and drag over a page,\n image or video.\n </p>\n )}\n </div>\n )\n}\n","/**\n * Design: the presentation's one look, for every slide — its background (a preset, or any\n * colour), typeface, accent colour and footer logo. A popover from the header; each choice applies\n * at once (the stage behind it shows the result).\n */\n\nimport type { ReactNode } from 'react'\nimport { Check, ImagePlus, Palette, Plus, Trash2 } from 'lucide-react'\nimport { Button, Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\nimport { usePresentation } from './store'\nimport {\n ACCENTS,\n BACKGROUNDS,\n FONTS,\n backgroundCss,\n accentColor,\n isHexColor,\n type FontId,\n type LogoCorner,\n} from './theme'\n\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section className=\"flex flex-col gap-2\">\n <h3 className=\"text-xs font-medium text-muted-foreground\">{title}</h3>\n {children}\n </section>\n )\n}\n\n/** A colour well: a swatch that opens the system colour picker. */\nfunction CustomColor({\n value,\n selected,\n label,\n round,\n onChange,\n}: {\n value: string\n selected: boolean\n label: string\n round?: boolean\n onChange: (color: string) => void\n}) {\n return (\n <label\n title={label}\n className={cn(\n 'relative flex size-8 cursor-pointer items-center justify-center border border-dashed border-border text-muted-foreground hover:text-foreground',\n round ? 'rounded-full' : 'rounded-md',\n selected && 'border-solid ring-2 ring-primary ring-offset-1 ring-offset-background'\n )}\n style={selected ? { background: value } : undefined}\n >\n {!selected && <Plus className=\"size-3.5\" />}\n <input\n type=\"color\"\n value={isHexColor(value) ? value : '#1f2937'}\n onChange={(event) => onChange(event.target.value)}\n aria-label={label}\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n />\n </label>\n )\n}\n\nexport function DesignMenu({ onChooseLogo }: { onChooseLogo?: () => void }) {\n const theme = usePresentation((s) => s.theme)\n const setTheme = usePresentation((s) => s.setTheme)\n const customBackground = isHexColor(theme.background)\n const customAccent = !ACCENTS.some((accent) => accent.color === theme.accent)\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n title=\"Design: background, typeface, accent, logo\"\n aria-label=\"Design\"\n data-testid=\"presentation-design\"\n >\n <Palette className=\"size-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"flex w-[21.5rem] flex-col gap-4 overflow-x-hidden p-4\">\n <Section title=\"Background\">\n <div className=\"grid grid-cols-7 gap-2\">\n {BACKGROUNDS.map((preset) => (\n <button\n key={preset.id}\n type=\"button\"\n title={preset.label}\n aria-label={`${preset.label} background`}\n aria-pressed={theme.background === preset.id}\n onClick={() => setTheme({ background: preset.id })}\n className={cn(\n 'size-8 rounded-md border border-border shadow-sm',\n theme.background === preset.id &&\n 'ring-2 ring-primary ring-offset-1 ring-offset-background'\n )}\n style={{ background: backgroundCss(preset.id), containerType: 'inline-size' }}\n data-testid={`design-background-${preset.id}`}\n />\n ))}\n <CustomColor\n value={theme.background}\n selected={customBackground}\n label=\"Your own background colour\"\n onChange={(background) => setTheme({ background })}\n />\n </div>\n </Section>\n\n <Section title=\"Typeface\">\n <div className=\"grid grid-cols-3 gap-2\">\n {(Object.keys(FONTS) as FontId[]).map((font) => (\n <button\n key={font}\n type=\"button\"\n aria-pressed={theme.font === font}\n onClick={() => setTheme({ font })}\n className={cn(\n 'flex flex-col items-center gap-0.5 rounded-md border border-border px-2 py-1.5 hover:bg-muted',\n theme.font === font && 'border-primary bg-primary/5'\n )}\n data-testid={`design-font-${font}`}\n >\n <span className=\"text-xl leading-tight\" style={{ fontFamily: FONTS[font].css }}>\n Aa\n </span>\n <span className=\"text-[11px] text-muted-foreground\">{FONTS[font].label}</span>\n </button>\n ))}\n </div>\n </Section>\n\n <Section title=\"Accent\">\n <div className=\"flex items-center gap-2\">\n {ACCENTS.map((accent) => (\n <button\n key={accent.color}\n type=\"button\"\n title={accent.label}\n aria-label={`${accent.label} accent`}\n aria-pressed={theme.accent === accent.color}\n onClick={() => setTheme({ accent: accent.color })}\n className={cn(\n 'flex size-8 items-center justify-center rounded-full border border-black/10 shadow-sm',\n theme.accent === accent.color &&\n 'ring-2 ring-primary ring-offset-1 ring-offset-background'\n )}\n style={{ background: accentColor(accent.color) }}\n >\n {theme.accent === accent.color && <Check className=\"size-3.5 text-black/70\" />}\n </button>\n ))}\n <CustomColor\n value={accentColor(theme.accent)}\n selected={customAccent}\n label=\"Your own accent colour\"\n round\n onChange={(accent) => setTheme({ accent })}\n />\n </div>\n </Section>\n\n <Section title=\"Logo\">\n {theme.logo ? (\n <div className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm\" title={theme.logo.fileName}>\n {theme.logo.fileName || 'Logo'}\n </span>\n <div className=\"flex rounded-md border border-border p-0.5\" role=\"group\">\n {(['bl', 'br'] as LogoCorner[]).map((corner) => (\n <button\n key={corner}\n type=\"button\"\n aria-pressed={theme.logo?.corner === corner}\n onClick={() => theme.logo && setTheme({ logo: { ...theme.logo, corner } })}\n className={cn(\n 'rounded px-2 py-0.5 text-xs text-muted-foreground',\n theme.logo?.corner === corner && 'bg-muted text-foreground'\n )}\n >\n {corner === 'bl' ? 'Left' : 'Right'}\n </button>\n ))}\n </div>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-7 text-muted-foreground\"\n title=\"Remove the logo\"\n aria-label=\"Remove the logo\"\n onClick={() => setTheme({ logo: null })}\n >\n <Trash2 className=\"size-3.5\" />\n </Button>\n </div>\n ) : (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n disabled={!onChooseLogo}\n onClick={onChooseLogo}\n data-testid=\"design-choose-logo\"\n >\n <ImagePlus className=\"size-4\" />\n Choose an image…\n </Button>\n )}\n </Section>\n </PopoverContent>\n </Popover>\n )\n}\n","/**\n * The current slide's layout: a menu of the layouts, each drawn in miniature from the geometry\n * the stage uses (its title, text and the room its clips take), so what is picked is what shows.\n */\n\nimport { ChevronDown } from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { STAGE_MARGIN, SLIDE_LAYOUTS, type SlideLayout } from './model'\nimport { LAYOUT_INFO, slideGeometry, type Box } from './slide-layout'\nimport { currentSlide, usePresentation } from './store'\n\nconst at = (box: Box) => ({\n left: `${box.x * 100}%`,\n top: `${box.y * 100}%`,\n width: `${box.w * 100}%`,\n height: `${box.h * 100}%`,\n})\n\n/** A layout in miniature: title and text as bars, the clips' room as light blocks. */\nexport function LayoutThumb({ layout, className }: { layout: SlideLayout; className?: string }) {\n const geometry = slideGeometry({ layout, caption: 'Title' }, { labels: false, logo: null })\n const { top, right = 0, bottom = 0, columns } = geometry.reserve\n const room = {\n x: STAGE_MARGIN,\n y: STAGE_MARGIN + top,\n w: 1 - 2 * STAGE_MARGIN - right,\n h: 1 - 2 * STAGE_MARGIN - top - bottom,\n }\n const blocks =\n layout === 'title' || layout === 'section' || layout === 'free'\n ? []\n : columns === 2\n ? [\n { ...room, w: room.w / 2 - 0.02 },\n { ...room, x: room.x + room.w / 2 + 0.02, w: room.w / 2 - 0.02 },\n ]\n : [room]\n const title = geometry.title\n return (\n <span\n aria-hidden\n className={cn(\n 'relative block aspect-video shrink-0 overflow-hidden rounded-[3px] bg-zinc-800',\n className\n )}\n >\n {title && (\n <span\n className=\"absolute rounded-full bg-white/90\"\n style={at({\n x: title.align === 'center' ? title.x + title.w * 0.2 : title.x,\n y: title.y + title.h * 0.3,\n w: title.align === 'center' ? title.w * 0.6 : title.w * 0.55,\n h: Math.max(0.05, title.h * 0.35),\n })}\n />\n )}\n {geometry.text &&\n [0, 1, 2].slice(0, geometry.text.bullets ? 3 : 1).map((line) => (\n <span\n key={line}\n className=\"absolute rounded-full bg-white/45\"\n style={at({\n x:\n geometry.text!.align === 'center'\n ? geometry.text!.x + geometry.text!.w * 0.3\n : geometry.text!.x,\n y: geometry.text!.y + line * 0.1,\n w:\n geometry.text!.align === 'center'\n ? geometry.text!.w * 0.4\n : geometry.text!.w * 0.85,\n h: 0.045,\n })}\n />\n ))}\n {blocks.map((block, index) => (\n <span key={index} className=\"absolute rounded-[1px] bg-white/25\" style={at(block)} />\n ))}\n </span>\n )\n}\n\n/** A slide's layout (default the current slide's). */\nexport function LayoutMenu({\n index,\n className,\n compact = false,\n}: {\n index?: number\n className?: string\n /** The layout's miniature alone (no chevron): a narrow column. */\n compact?: boolean\n}) {\n const layout = usePresentation(\n (s) => (index === undefined ? currentSlide(s) : s.slides[index])?.layout ?? 'clips'\n )\n const setSlideLayout = usePresentation((s) => s.setSlideLayout)\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n 'h-7 gap-1.5 px-1.5 text-xs text-muted-foreground hover:text-foreground',\n className\n )}\n title=\"Slide layout\"\n aria-label={`Slide layout: ${LAYOUT_INFO[layout].label}`}\n data-testid=\"presentation-layout\"\n >\n <LayoutThumb layout={layout} className={compact ? 'w-6' : 'w-7'} />\n {!compact && <ChevronDown className=\"size-3\" />}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-56\">\n {SLIDE_LAYOUTS.map((option) => (\n <DropdownMenuItem\n key={option}\n onSelect={() => setSlideLayout(option, index)}\n className={cn(option === layout && 'bg-accent')}\n data-testid={`presentation-layout-${option}`}\n >\n <LayoutThumb layout={option} className=\"w-12\" />\n <span>{LAYOUT_INFO[option].label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import { useEffect } from 'react'\nimport { CircleAlert, CircleCheck, X } from 'lucide-react'\nimport { usePresentation } from './store'\n\n/**\n * The presentation's own messages (saved, failed…), shown where it is edited: the app's\n * notifications show in the app's window, out of sight behind a popped-out editor. Above its\n * dialogs.\n */\nexport function Notice() {\n const notice = usePresentation((s) => s.notice)\n useEffect(() => {\n if (!notice) return\n const timer = setTimeout(\n () => usePresentation.getState().clearNotice(notice.id),\n notice.kind === 'error' ? 8000 : 3000\n )\n return () => clearTimeout(timer)\n }, [notice])\n if (!notice) return null\n return (\n <div\n role={notice.kind === 'error' ? 'alert' : 'status'}\n className=\"pointer-events-auto fixed left-1/2 top-3 z-[100] flex max-w-[90vw] -translate-x-1/2 items-center gap-2 rounded-lg border border-border bg-popover px-3 py-2 text-sm shadow-lg\"\n data-testid=\"presentation-notice\"\n >\n {notice.kind === 'error' ? (\n <CircleAlert className=\"size-4 shrink-0 text-destructive\" />\n ) : (\n <CircleCheck className=\"size-4 shrink-0 text-primary\" />\n )}\n <span>{notice.text}</span>\n <button\n type=\"button\"\n className=\"ml-1 rounded p-0.5 text-muted-foreground hover:text-foreground\"\n aria-label=\"Dismiss\"\n onClick={() => usePresentation.getState().clearNotice(notice.id)}\n >\n <X className=\"size-3.5\" />\n </button>\n </div>\n )\n}\n","/**\n * The presentation editor: its slides one under the other, scrolled like a PDF's pages, each one\n * edited where it is — clips dragged, resized and reshaped on it, its title and points typed on\n * it. Hovering a slide shows its actions (layout, move up or down, duplicate, delete); between two\n * slides, + inserts one. One small floating bar holds the rest (Design, the host's Save and other\n * actions, Present, \"…\"), so no header takes room from the slides. The clips collected for the\n * presentation wait in the tray along the bottom, to be dragged onto any slide.\n *\n * The same editor shows wherever the host mounts it (the viewer's tab, or its own window).\n */\n\nimport { memo, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport {\n ArrowDown,\n ArrowUp,\n Circle,\n Copy,\n Minus,\n MoreHorizontal,\n Play,\n Plus,\n RectangleHorizontal,\n Shapes,\n Square,\n Trash2,\n Type,\n} from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { ClipTray } from './ClipTray'\nimport { DesignMenu } from './DesignMenu'\nimport { LayoutMenu } from './LayoutMenu'\nimport { Notice } from './Notice'\nimport { PresentationStage } from './PresentationStage'\nimport type { SlideTextEditing } from './SlideDecor'\nimport { usePresentation } from './store'\nimport { newBox, type BoxShape } from './boxes'\nimport { accentColor, isLightBackground } from './theme'\nimport { usePresenterKeys } from './usePresenterKeys'\n\nexport interface SlidesEditorProps {\n /** Present: the host opens the shareable window. */\n onPresent: () => void\n /** In the floating bar, before Present (e.g. Save, pop out). */\n actions?: ReactNode\n /** At the top of the \"…\" menu (e.g. New from template, Save as, Export). */\n menuItems?: ReactNode\n /** First in the clip tray (e.g. Generate image). */\n trayStart?: ReactNode\n onChooseLogo?: () => void\n onEditImage?: (clipId: string) => void\n onCropImage?: (clipId: string) => void\n}\n\ninterface Selection {\n index: number\n clipId: string\n}\n\nconst SlideCard = memo(function SlideCard({\n index,\n count,\n current,\n selected,\n onSelect,\n onEditImage,\n onCropImage,\n}: {\n index: number\n count: number\n current: boolean\n selected: string | null\n onSelect: (index: number, clipId: string | null) => void\n onEditImage?: (clipId: string) => void\n onCropImage?: (clipId: string) => void\n}) {\n const empty = usePresentation((s) => {\n const slide = s.slides[index]\n return (\n !!slide &&\n !slide.items.length &&\n !slide.boxes.length &&\n !slide.points.trim() &&\n slide.layout !== 'title' &&\n slide.layout !== 'section'\n )\n })\n const notes = usePresentation((s) => s.slides[index]?.notes ?? '')\n const textEditing = useMemo<SlideTextEditing>(\n () => ({\n onTitle: (title) => usePresentation.getState().setSlideCaption(title, index),\n onPoints: (points) => usePresentation.getState().setSlidePoints(points, index),\n }),\n [index]\n )\n const select = useCallback((clipId: string | null) => onSelect(index, clipId), [onSelect, index])\n const actions = usePresentation.getState()\n return (\n <div className=\"group relative flex gap-2\" data-testid={`slide-${index}`}>\n {/* The gutter: the slide's number, and its actions on hover (always on a touch screen's\n current slide), clear of the slide itself. */}\n <div className=\"flex w-9 shrink-0 flex-col items-center gap-0.5\">\n <span\n className={cn(\n 'py-1 text-xs tabular-nums',\n current ? 'font-semibold text-foreground' : 'text-muted-foreground'\n )}\n >\n {index + 1}\n </span>\n <div\n className={cn(\n 'flex flex-col items-center gap-0.5 transition-opacity',\n 'opacity-0 focus-within:opacity-100 group-hover:opacity-100',\n current && 'pointer-coarse:opacity-100'\n )}\n data-testid={`slide-actions-${index}`}\n >\n <LayoutMenu index={index} compact />\n {/* The slide's other actions, behind \"…\": moving it, copying it, deleting it. */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-7 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n title=\"Slide actions\"\n aria-label={`Slide ${index + 1} actions`}\n data-testid={`slide-menu-${index}`}\n >\n <MoreHorizontal className=\"size-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuItem\n disabled={index === 0}\n onSelect={() => actions.moveSlide(index, index - 1)}\n >\n <ArrowUp className=\"size-4\" />\n <span className=\"ml-2\">Move up</span>\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={index === count - 1}\n onSelect={() => actions.moveSlide(index, index + 1)}\n >\n <ArrowDown className=\"size-4\" />\n <span className=\"ml-2\">Move down</span>\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => actions.duplicateSlide(index)}>\n <Copy className=\"size-4\" />\n <span className=\"ml-2\">Duplicate</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"text-destructive\"\n onSelect={() => actions.removeSlide(index)}\n >\n <Trash2 className=\"size-4\" />\n <span className=\"ml-2\">Delete slide</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n <div\n className={cn(\n 'relative aspect-video min-w-0 flex-1 rounded-sm',\n current && 'ring-1 ring-primary/40 ring-offset-4 ring-offset-transparent'\n )}\n >\n <PresentationStage\n editable\n slideIndex={index}\n selected={selected}\n onSelect={select}\n onEditImage={onEditImage}\n onCropImage={onCropImage}\n textEditing={textEditing}\n overlay={\n empty && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-[8%] flex justify-center\">\n <span className=\"rounded-full bg-black/40 px-3 py-1 text-[1.4cqw] text-white/70\">\n Drag a clip here from the tray\n </span>\n </div>\n )\n }\n />\n {(notes || current) && (\n <textarea\n value={notes}\n rows={notes.split('\\n').length}\n placeholder=\"Speaker notes\"\n onChange={(event) =>\n usePresentation.getState().setSlideNotes(event.target.value, index)\n }\n className=\"mt-2 block w-full resize-none rounded-sm border-0 bg-transparent px-1 py-0.5 text-xs text-muted-foreground placeholder:text-muted-foreground/50 focus:bg-background focus:text-foreground focus:outline-none focus:ring-1 focus:ring-ring\"\n aria-label={`Speaker notes for slide ${index + 1}`}\n data-testid={`slide-notes-${index}`}\n />\n )}\n </div>\n </div>\n )\n})\n\nconst INSERTS: { shape: BoxShape; label: string; icon: ReactNode }[] = [\n { shape: 'text', label: 'Text box', icon: <Type className=\"size-4\" /> },\n { shape: 'rect', label: 'Rectangle', icon: <Square className=\"size-4\" /> },\n {\n shape: 'roundRect',\n label: 'Rounded rectangle',\n icon: <RectangleHorizontal className=\"size-4\" />,\n },\n { shape: 'ellipse', label: 'Ellipse', icon: <Circle className=\"size-4\" /> },\n { shape: 'line', label: 'Line', icon: <Minus className=\"size-4\" /> },\n]\n\n/** Insert a text box or a shape on the current slide; it is selected, ready to type in. */\nfunction InsertMenu({ onInserted }: { onInserted: (index: number, boxId: string) => void }) {\n const insert = (shape: BoxShape) => {\n const state = usePresentation.getState()\n const slide = state.slides[state.current]\n const box = newBox(shape, accentColor(state.theme.accent))\n // On a light slide (an imported deck's), text is dark.\n const dark = isLightBackground(slide?.background)\n const { id, ...rest } = dark\n ? {\n ...box,\n paragraphs: box.paragraphs.map((p) => ({\n ...p,\n runs: p.runs.map((r) => ({ color: '#1f2328', ...r })),\n })),\n }\n : box\n void id\n onInserted(state.current, state.addBox(rest))\n }\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n title=\"Insert a text box or shape\"\n aria-label=\"Insert\"\n data-testid=\"slides-insert\"\n >\n <Shapes className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {INSERTS.map(({ shape, label, icon }) => (\n <DropdownMenuItem\n key={shape}\n onSelect={() => insert(shape)}\n data-testid={`slides-insert-${shape}`}\n >\n {icon}\n <span className=\"ml-2\">{label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/** Between two slides (and after the last): + inserts a slide there, shown on hover. */\nfunction InsertSlide({ after, always }: { after: number; always?: boolean }) {\n return (\n <div className=\"group/insert relative flex h-8 items-center justify-center pl-11\">\n <button\n type=\"button\"\n onClick={() => usePresentation.getState().addSlide(undefined, after)}\n className={cn(\n 'flex items-center gap-1 rounded-full border border-dashed border-border bg-background px-2.5 py-0.5 text-xs text-muted-foreground transition-opacity hover:border-solid hover:text-foreground focus-visible:opacity-100',\n !always && 'opacity-0 group-hover/insert:opacity-100 pointer-coarse:opacity-100'\n )}\n aria-label={`New slide after slide ${after + 1}`}\n data-testid={`slide-insert-${after}`}\n >\n <Plus className=\"size-3\" />\n Slide\n </button>\n </div>\n )\n}\n\nexport function SlidesEditor({\n onPresent,\n actions,\n menuItems,\n trayStart,\n onChooseLogo,\n onEditImage,\n onCropImage,\n}: SlidesEditorProps) {\n const ids = usePresentation((s) => s.slides.map((slide) => slide.id).join(' '))\n const slideIds = useMemo(() => ids.split(' '), [ids])\n const current = usePresentation((s) => s.current)\n const captions = usePresentation((s) => s.captions)\n // Presenting in the presentation's own window: Present becomes Stop presenting.\n const presenting = usePresentation((s) => s.presenting)\n const [selection, setSelection] = useState<Selection | null>(null)\n const [view, setView] = useState<Window | null>(null)\n const list = useRef<HTMLDivElement>(null)\n const rootRef = useCallback((node: HTMLDivElement | null) => {\n if (node) setView(node.ownerDocument.defaultView)\n }, [])\n\n const onSelect = useCallback((index: number, clipId: string | null) => {\n setSelection(clipId ? { index, clipId } : null)\n }, [])\n const keySelection = useMemo(\n () => ({ clipId: selection?.clipId ?? null, clear: () => setSelection(null) }),\n [selection]\n )\n usePresenterKeys(view, false, keySelection)\n\n // A slide added, duplicated or moved becomes the current one: brought into view.\n useEffect(() => {\n const card = list.current?.querySelector(`[data-testid=\"slide-${current}\"]`)\n card?.scrollIntoView?.({ block: 'nearest', behavior: 'smooth' })\n }, [current, slideIds.length])\n\n return (\n <div\n ref={rootRef}\n className=\"relative flex h-full min-h-0 flex-col bg-muted/30\"\n data-testid=\"slides-editor\"\n >\n <div ref={list} className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className=\"mx-auto flex max-w-[1100px] flex-col pb-6 pl-2 pr-6 pt-14\">\n {slideIds.map((id, index) => (\n <div key={id}>\n <SlideCard\n index={index}\n count={slideIds.length}\n current={index === current}\n selected={selection?.index === index ? selection.clipId : null}\n onSelect={onSelect}\n onEditImage={onEditImage}\n onCropImage={onCropImage}\n />\n <InsertSlide after={index} always={index === slideIds.length - 1} />\n </div>\n ))}\n </div>\n </div>\n\n {/* The rest, in one small floating bar: no header row. */}\n <div\n className=\"absolute right-4 top-2.5 z-40 flex items-center gap-0.5 rounded-full border border-border bg-background p-1 shadow-md\"\n data-testid=\"slides-toolbar\"\n >\n <DesignMenu onChooseLogo={onChooseLogo} />\n <InsertMenu onInserted={(index, boxId) => setSelection({ index, clipId: boxId })} />\n {actions}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n title=\"More\"\n aria-label=\"More\"\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {menuItems}\n {menuItems && <DropdownMenuSeparator />}\n <DropdownMenuCheckboxItem\n checked={captions}\n onCheckedChange={(on) => usePresentation.getState().setCaptions(!!on)}\n >\n Show source labels\n </DropdownMenuCheckboxItem>\n </DropdownMenuContent>\n </DropdownMenu>\n {presenting ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"destructive\"\n className=\"ml-0.5 h-8 rounded-full\"\n onClick={() => usePresentation.getState().setPresenting(false)}\n title=\"Stop presenting (the presentation window closes)\"\n data-testid=\"presentation-stop-button\"\n >\n <Square className=\"size-3 fill-current\" />\n Stop presenting\n </Button>\n ) : (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"ml-0.5 h-8 rounded-full\"\n onClick={() => {\n setSelection(null)\n onPresent()\n }}\n title=\"Present: the slides alone, in a window to share or put full screen\"\n data-testid=\"presentation-present-button\"\n >\n <Play className=\"size-3.5\" />\n Present\n </Button>\n )}\n </div>\n\n <ClipTray start={trayStart} />\n <Notice />\n </div>\n )\n}\n","/**\n * A slide's text boxes and shapes drawn on a canvas, as the stage draws them (`StageBox`): for the\n * saved PDF's pages. Text wraps by words across runs of different type.\n */\n\nimport {\n DEFAULT_INSET,\n DEFAULT_TEXT_SIZE,\n pointsToStage,\n type SlideBox,\n type TextRun,\n} from './boxes'\nimport { TEXT_COLORS } from './theme'\n\nconst LINE_HEIGHT = 1.2\n\nfunction fontOf(run: TextRun, themeFont: string, width: number): string {\n const size = pointsToStage(run.size ?? DEFAULT_TEXT_SIZE) * width\n const family = run.font ? `\"${run.font}\", ${themeFont}` : themeFont\n return `${run.italic ? 'italic ' : ''}${run.bold ? 700 : 400} ${size}px ${family}`\n}\n\ninterface Piece {\n text: string\n run: TextRun\n width: number\n}\n\n/** The box's outline path (its shape) at `x, y, w, h`. */\nfunction outline(context: CanvasRenderingContext2D, box: SlideBox, w: number, h: number) {\n context.beginPath()\n if (box.shape === 'ellipse') context.ellipse(w / 2, h / 2, w / 2, h / 2, 0, 0, Math.PI * 2)\n else if (box.shape === 'roundRect') context.roundRect(0, 0, w, h, Math.min(w, h) / 6)\n else context.rect(0, 0, w, h)\n}\n\nexport function drawBox(\n context: CanvasRenderingContext2D,\n box: SlideBox,\n width: number,\n height: number,\n themeFont: string\n): void {\n const { frame } = box\n const w = frame.w * width\n const h = frame.h * height\n context.save()\n context.translate(frame.x * width + w / 2, frame.y * height + h / 2)\n if (box.rotation) context.rotate((box.rotation * Math.PI) / 180)\n context.translate(-w / 2, -h / 2)\n\n const lineWidth = box.line ? Math.max(1, pointsToStage(box.line.width) * width) : 0\n if (box.shape === 'line') {\n context.strokeStyle = box.line?.color ?? TEXT_COLORS.body\n context.lineWidth = lineWidth || 1\n if (box.line?.dash) context.setLineDash([lineWidth * 3, lineWidth * 2])\n context.beginPath()\n context.moveTo(0, box.flipV ? h : 0)\n context.lineTo(w, box.flipV ? 0 : h)\n context.stroke()\n context.restore()\n return\n }\n if (box.fill) {\n context.globalAlpha = box.fillAlpha ?? 1\n context.fillStyle = box.fill\n outline(context, box, w, h)\n context.fill()\n context.globalAlpha = 1\n }\n if (box.line && lineWidth) {\n context.strokeStyle = box.line.color\n context.lineWidth = lineWidth\n if (box.line.dash) context.setLineDash([lineWidth * 3, lineWidth * 2])\n outline(context, box, w, h)\n context.stroke()\n context.setLineDash([])\n }\n\n // The text: each paragraph wrapped to the box (inside its inset), placed by its anchor.\n const inset = pointsToStage(box.inset ?? DEFAULT_INSET) * width\n const room = w - 2 * inset\n context.textBaseline = 'alphabetic'\n const lines: {\n pieces: Piece[]\n size: number\n align: string\n indent: number\n bullet?: TextRun\n }[] = []\n for (const paragraph of box.paragraphs) {\n const size = pointsToStage(paragraph.runs[0]?.size ?? DEFAULT_TEXT_SIZE) * width\n const indent = (paragraph.level ?? 0) * 0.5 * size + (paragraph.bullet ? size * 0.9 : 0)\n const words: Piece[] = []\n for (const run of paragraph.runs) {\n context.font = fontOf(run, themeFont, width)\n for (const part of run.text.split(/(\\s+)/).filter(Boolean)) {\n words.push({ text: part, run, width: context.measureText(part).width })\n }\n }\n let line: Piece[] = []\n let used = 0\n let first = true\n const flush = () => {\n lines.push({\n pieces: line,\n size,\n align: paragraph.align ?? 'left',\n indent,\n ...(first && paragraph.bullet ? { bullet: paragraph.runs[0] } : {}),\n })\n first = false\n line = []\n used = 0\n }\n for (const word of words) {\n if (used + word.width > room - indent && line.length && word.text.trim()) flush()\n if (!line.length && !word.text.trim()) continue\n line.push(word)\n used += word.width\n }\n flush()\n }\n const total = lines.reduce((sum, line) => sum + line.size * LINE_HEIGHT, 0)\n const free = h - 2 * inset - total\n let y = inset + (box.anchor === 'middle' ? free / 2 : box.anchor === 'bottom' ? free : 0)\n context.save()\n context.beginPath()\n context.rect(0, 0, w, h)\n context.clip()\n for (const line of lines) {\n const lineWidth = line.pieces.reduce((sum, piece) => sum + piece.width, 0)\n const space = room - line.indent\n let x =\n inset +\n line.indent +\n (line.align === 'center'\n ? (space - lineWidth) / 2\n : line.align === 'right'\n ? space - lineWidth\n : 0)\n const baseline = y + line.size * (LINE_HEIGHT - 0.2)\n if (line.bullet) {\n context.font = fontOf(line.bullet, themeFont, width)\n context.fillStyle = line.bullet.color ?? TEXT_COLORS.body\n context.fillText('•', inset + line.indent - line.size * 0.9, baseline)\n }\n for (const piece of line.pieces) {\n context.font = fontOf(piece.run, themeFont, width)\n context.fillStyle = piece.run.color ?? TEXT_COLORS.body\n context.fillText(piece.text, x, baseline)\n if (piece.run.underline) {\n context.fillRect(x, baseline + line.size * 0.08, piece.width, Math.max(1, line.size * 0.05))\n }\n x += piece.width\n }\n y += line.size * LINE_HEIGHT\n }\n context.restore()\n context.restore()\n}\n\n/** The words a box shows, for a searchable PDF. */\nexport const boxWords = (box: SlideBox): string[] =>\n box.paragraphs\n .map((paragraph) =>\n paragraph.runs\n .map((run) => run.text)\n .join('')\n .trim()\n )\n .filter(Boolean)\n","/**\n * A presentation's slides as images, exactly as they are presented: the theme's background, the\n * slide's title, rule and points by its layout, each clip in its frame (a PDF clip drawn from its\n * PDF with its redactions burnt in, an image from its file, a video as its frame at the clip's\n * start), the source labels under them and the logo. For the saved PDF (`imagesToPdf`), where they\n * are the pages; the PowerPoint export draws its parts with the same pieces.\n */\n\nimport { closePdfRegionImage, renderPdfRegion } from '@arbidocs/react/viewers'\nimport { STAGE_ASPECT, clipLabel, frameHeight, type Clip, type Slide } from './model'\nimport { slideGeometry, textLines, type Box, type TextBox } from './slide-layout'\nimport {\n FONTS,\n TEXT_COLORS,\n accentColor,\n paintBackground,\n paintClipEdge,\n paintSlideBackground,\n type Theme,\n} from './theme'\nimport { boxWords, drawBox } from './draw-boxes'\n\n/** The rendered slide's size in pixels (a 1080p screen). */\nexport const SLIDE_PIXELS = { width: 1920, height: Math.round(1920 / STAGE_ASPECT) }\n\nexport interface RenderedSlide {\n /** A JPEG of the slide. */\n image: Blob\n /** The slide's words (title, labels), for a searchable PDF. */\n text: string[]\n}\n\n/** A video's frame at `seconds`; null when it cannot be read in time. */\nasync function videoFrame(source: Blob, seconds: number): Promise<HTMLVideoElement | null> {\n const video = document.createElement('video')\n video.muted = true\n video.playsInline = true\n video.preload = 'auto'\n const url = URL.createObjectURL(source)\n video.src = url\n const ready = new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => resolve(false), 8000)\n video.addEventListener(\n 'loadedmetadata',\n () => {\n video.currentTime = Math.min(seconds, Math.max(0, (video.duration || 0) - 0.05))\n },\n { once: true }\n )\n video.addEventListener(\n 'seeked',\n () => {\n clearTimeout(timer)\n resolve(true)\n },\n { once: true }\n )\n video.addEventListener('error', () => resolve(false), { once: true })\n })\n const ok = await ready\n URL.revokeObjectURL(url)\n return ok ? video : null\n}\n\nexport async function drawClip(\n context: CanvasRenderingContext2D,\n clip: Clip,\n box: { x: number; y: number; width: number; height: number }\n) {\n const { rect } = clip\n if (clip.kind === 'pdf') {\n const image = await renderPdfRegion({\n file: clip.source,\n page: clip.page,\n rect,\n masks: clip.masks,\n width: Math.ceil(box.width),\n })\n context.drawImage(image, box.x, box.y, box.width, box.height)\n closePdfRegionImage(image)\n return\n }\n if (clip.kind === 'image') {\n const bitmap = await createImageBitmap(clip.source)\n context.drawImage(\n bitmap,\n rect.x * bitmap.width,\n rect.y * bitmap.height,\n rect.w * bitmap.width,\n rect.h * bitmap.height,\n box.x,\n box.y,\n box.width,\n box.height\n )\n bitmap.close()\n return\n }\n const video = await videoFrame(clip.source, clip.start ?? 0)\n if (video) {\n const w = video.videoWidth\n const h = video.videoHeight\n context.drawImage(\n video,\n rect.x * w,\n rect.y * h,\n rect.w * w,\n rect.h * h,\n box.x,\n box.y,\n box.width,\n box.height\n )\n return\n }\n // The frame could not be read: a placeholder that still says what plays there.\n context.fillStyle = '#262626'\n context.fillRect(box.x, box.y, box.width, box.height)\n context.fillStyle = '#e5e5e5'\n context.font = `${Math.round(box.height * 0.12)}px sans-serif`\n context.textAlign = 'center'\n context.textBaseline = 'middle'\n context.fillText(\n `▶ ${clip.caption}`,\n box.x + box.width / 2,\n box.y + box.height / 2,\n box.width * 0.9\n )\n}\n\n/** A clip's corner radius, a fraction of the stage width (as the stage's 0.6cqw). */\nexport const CLIP_RADIUS = 0.006\n\n/**\n * A clip as the stage shows it: lifted off the background by a soft shadow, its corners softly\n * rounded, a faint light edge around it.\n */\nexport async function drawRoundedClip(\n context: CanvasRenderingContext2D,\n clip: Clip,\n box: { x: number; y: number; width: number; height: number },\n stageWidth: number,\n shadow = true\n) {\n const radius = stageWidth * CLIP_RADIUS\n const outline = () => {\n context.beginPath()\n context.roundRect(box.x, box.y, box.width, box.height, radius)\n }\n context.save()\n if (shadow) {\n context.shadowColor = 'rgba(0,0,0,0.5)'\n context.shadowBlur = stageWidth * 0.016\n context.shadowOffsetY = stageWidth * 0.005\n }\n context.fillStyle = '#fff'\n outline()\n context.fill()\n context.restore()\n context.save()\n outline()\n context.clip()\n await drawClip(context, clip, box)\n if (clip.kind === 'pdf') paintClipEdge(context, box, stageWidth)\n context.restore()\n context.save()\n context.strokeStyle = 'rgba(255,255,255,0.15)'\n context.lineWidth = Math.max(1, stageWidth / 1280)\n outline()\n context.stroke()\n context.restore()\n}\n\n/** What a slide is drawn with besides itself and its clips. */\nexport interface SlideLook {\n labels: boolean\n /** Each document's value in the label column (see `clipLabel`). */\n columnValues: Readonly<Record<string, string>>\n theme: Theme\n /** The theme's logo image, if it has one. */\n logo: Blob | null\n /** Images embedded in the presentation (slide backgrounds, imported pictures), by key. */\n media: Readonly<Record<string, string>>\n}\n\n/** The lines of `text` that fit `width` (words wrapped), at most `max`, the last one cut short. */\nexport function wrapLines(\n context: CanvasRenderingContext2D,\n text: string,\n width: number,\n max: number\n): string[] {\n const lines: string[] = []\n let line = ''\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n const next = line ? `${line} ${word}` : word\n if (context.measureText(next).width <= width || !line) {\n line = next\n continue\n }\n lines.push(line)\n line = word\n }\n if (line) lines.push(line)\n if (lines.length <= max) return lines\n const kept = lines.slice(0, max)\n let last = kept[max - 1]\n while (last && context.measureText(`${last}…`).width > width) last = last.slice(0, -1)\n kept[max - 1] = `${last}…`\n return kept\n}\n\n/** A text box drawn on a `width × height` canvas (as the stage draws it). */\nfunction drawText(\n context: CanvasRenderingContext2D,\n box: TextBox,\n lines: readonly string[],\n theme: Theme,\n width: number,\n height: number\n) {\n const size = box.size * width\n const lineHeight = size * box.leading\n context.font = `${box.weight} ${size}px ${FONTS[theme.font].css}`\n context.textBaseline = 'top'\n const indent = box.bullets ? size * 1.22 : 0\n const left = box.x * width\n const boxWidth = box.w * width - indent\n const gap = box.bullets ? size * 0.3 : 0\n const room = box.h * height\n // The lines that fit, then placed in the box by its anchor (as the stage places them).\n const paragraphs: string[][] = []\n let used = 0\n for (const paragraph of lines) {\n const fits = Math.floor((room - used + 1e-6) / lineHeight)\n if (fits < 1) break\n const wrapped = wrapLines(context, paragraph, boxWidth, fits)\n paragraphs.push(wrapped)\n used += wrapped.length * lineHeight + gap\n }\n used = Math.max(0, used - gap)\n const offset =\n box.anchor === 'bottom' ? room - used : box.anchor === 'middle' ? (room - used) / 2 : 0\n let y = box.y * height + offset + (lineHeight - size) / 2\n for (const wrapped of paragraphs) {\n if (box.bullets) {\n const square = size * 0.42\n context.fillStyle = accentColor(theme.accent)\n context.fillRect(left, y + size * 0.5 - square / 2, square, square)\n }\n context.fillStyle = TEXT_COLORS[box.tone]\n context.textAlign = box.align === 'center' ? 'center' : 'left'\n for (const line of wrapped) {\n const x = box.align === 'center' ? left + (box.w * width) / 2 : left + indent\n context.fillText(line, x, y)\n y += lineHeight\n }\n y += gap\n }\n}\n\n/** The logo, contained in its box and set to the box's outer side. */\nasync function drawLogo(\n context: CanvasRenderingContext2D,\n logo: Blob,\n box: Box,\n width: number,\n height: number\n) {\n const image = await loadImage(logo)\n const scale = Math.min((box.w * width) / image.width, (box.h * height) / image.height)\n const w = image.width * scale\n const h = image.height * scale\n const x = box.x < 0.5 ? box.x * width : (box.x + box.w) * width - w\n context.globalAlpha = 0.9\n context.drawImage(image, x, (box.y + box.h) * height - h, w, h)\n context.globalAlpha = 1\n}\n\n/** An image file, decoded (any format the browser shows, SVG included). */\nexport async function loadImage(file: Blob): Promise<HTMLImageElement> {\n const url = URL.createObjectURL(file)\n try {\n const image = new Image()\n image.src = url\n await image.decode()\n // An SVG without a size of its own is drawn at a usable one.\n if (!image.naturalWidth) {\n image.width = 600\n image.height = 200\n }\n return image\n } finally {\n URL.revokeObjectURL(url)\n }\n}\n\n/** A slide's title, rule and text, as `drawSlideText` draws them: for the searchable PDF's text. */\nexport function slideWords(slide: Slide): string[] {\n // A blank slide's title is in its boxes.\n const own = slide.layout === 'free' ? [] : [slide.caption.trim(), ...textLines(slide.points)]\n return [...own, ...slide.boxes.flatMap(boxWords)].filter(Boolean)\n}\n\n/** The slide's own text (title, rule, points or subtitle) on a `width × height` canvas. */\nexport function drawSlideText(\n context: CanvasRenderingContext2D,\n slide: Slide,\n look: SlideLook,\n width: number,\n height: number\n) {\n const geometry = slideGeometry(slide, {\n labels: look.labels,\n logo: look.theme.logo?.corner ?? null,\n })\n const title = slide.caption.trim()\n if (title && geometry.title) {\n drawText(context, geometry.title, [title], look.theme, width, height)\n if (geometry.rule) {\n context.fillStyle = accentColor(look.theme.accent)\n const r = geometry.rule\n context.fillRect(r.x * width, r.y * height, r.w * width, r.h * height)\n }\n }\n if (geometry.text) {\n drawText(context, geometry.text, textLines(slide.points), look.theme, width, height)\n }\n return geometry\n}\n\nexport async function renderSlide(\n slide: Slide,\n clips: readonly Clip[],\n look: SlideLook\n): Promise<RenderedSlide> {\n const { width, height } = SLIDE_PIXELS\n const canvas = document.createElement('canvas')\n canvas.width = width\n canvas.height = height\n const context = canvas.getContext('2d')\n if (!context) throw new Error('Could not draw the slides')\n if (slide.background) {\n await paintSlideBackground(context, width, height, slide.background, look.media)\n } else {\n paintBackground(context, width, height, look.theme.background)\n }\n const geometry = drawSlideText(context, slide, look, width, height)\n const text: string[] = slideWords(slide)\n const font = FONTS[look.theme.font].css\n const drawBoxes = (front: boolean) => {\n for (const box of slide.boxes) {\n if (!!box.front === front) drawBox(context, box, width, height, font)\n }\n }\n drawBoxes(false)\n\n for (const item of slide.items) {\n const clip = clips.find((entry) => entry.id === item.clipId)\n if (!clip) continue\n const box = {\n x: item.frame.x * width,\n y: item.frame.y * height,\n width: item.frame.w * width,\n height: frameHeight(item.frame, clip.aspect) * height,\n }\n if (clip.plain) {\n await drawClip(context, clip, box)\n continue\n }\n await drawRoundedClip(context, clip, box, width)\n const label = clipLabel(clip, look.columnValues)\n if (look.labels && label) {\n context.fillStyle = TEXT_COLORS.muted\n context.font = `${Math.round(width * 0.017)}px ${font}`\n context.textAlign = 'left'\n context.textBaseline = 'top'\n context.fillText(label, box.x, box.y + box.height + width * 0.005, box.width)\n text.push(label)\n }\n }\n\n drawBoxes(true)\n if (geometry.logo && look.logo) await drawLogo(context, look.logo, geometry.logo, width, height)\n\n const image = await new Promise<Blob>((resolve, reject) =>\n canvas.toBlob(\n (blob) => (blob ? resolve(blob) : reject(new Error('Could not draw the slides'))),\n 'image/jpeg',\n 0.92\n )\n )\n canvas.width = canvas.height = 0\n return { image, text }\n}\n","/**\n * A slide's text boxes and shapes as PowerPoint's own: editable text (each run's type, colour and\n * weight, each paragraph's alignment, level and bullet) in a shape with its fill and outline, so a\n * deck imported from PowerPoint goes back to PowerPoint as it came.\n */\n\nimport type PptxGenJS from 'pptxgenjs'\nimport { DEFAULT_INSET, DEFAULT_TEXT_SIZE, type SlideBox } from './boxes'\nimport { TEXT_COLORS } from './theme'\n\n/** PowerPoint's widescreen slide, in inches. */\nconst SLIDE_INCHES = { w: 13.333, h: 7.5 }\nconst hex = (color: string) => color.replace('#', '').toUpperCase()\n\ntype Slide = ReturnType<PptxGenJS['addSlide']>\n\nexport function addBox(pptx: PptxGenJS, page: Slide, box: SlideBox, themeFont: string): void {\n const { frame } = box\n const place = {\n x: frame.x * SLIDE_INCHES.w,\n y: frame.y * SLIDE_INCHES.h,\n w: Math.max(0.01, frame.w * SLIDE_INCHES.w),\n h: frame.h * SLIDE_INCHES.h,\n ...(box.rotation ? { rotate: box.rotation } : {}),\n ...(box.flipH ? { flipH: true } : {}),\n ...(box.flipV ? { flipV: true } : {}),\n }\n const line = box.line\n ? {\n color: hex(box.line.color),\n width: box.line.width,\n ...(box.line.dash ? { dashType: 'dash' as const } : {}),\n }\n : undefined\n if (box.shape === 'line') {\n page.addShape(pptx.ShapeType.line, {\n ...place,\n line: line ?? { color: hex(TEXT_COLORS.body), width: 1 },\n })\n return\n }\n const shape =\n box.shape === 'ellipse'\n ? pptx.ShapeType.ellipse\n : box.shape === 'roundRect'\n ? pptx.ShapeType.roundRect\n : pptx.ShapeType.rect\n const fill = box.fill\n ? {\n color: hex(box.fill),\n ...(box.fillAlpha !== undefined\n ? { transparency: Math.round((1 - box.fillAlpha) * 100) }\n : {}),\n }\n : undefined\n const runs: PptxGenJS.TextProps[] = []\n box.paragraphs.forEach((paragraph, p) => {\n const last = p === box.paragraphs.length - 1\n const paragraphRuns = paragraph.runs.length ? paragraph.runs : [{ text: '' }]\n paragraphRuns.forEach((run, r) => {\n runs.push({\n text: run.text,\n options: {\n fontSize: run.size ?? DEFAULT_TEXT_SIZE,\n fontFace: run.font ?? themeFont,\n color: hex(run.color ?? TEXT_COLORS.body),\n ...(run.bold ? { bold: true } : {}),\n ...(run.italic ? { italic: true } : {}),\n ...(run.underline ? { underline: { style: 'sng' as const } } : {}),\n align: paragraph.align ?? 'left',\n ...(paragraph.level ? { indentLevel: paragraph.level } : {}),\n ...(paragraph.bullet && r === 0 ? { bullet: true } : {}),\n ...(r === paragraphRuns.length - 1 && !last ? { breakLine: true } : {}),\n },\n })\n })\n })\n const text = runs.some((run) => run.text)\n if (!text && box.shape === 'text') return\n page.addText(text ? runs : '', {\n ...place,\n shape,\n ...(fill ? { fill } : {}),\n ...(line ? { line } : {}),\n // Its part in the slide (its title, its body), kept by name: read back when imported.\n ...(box.role ? { objectName: `ARBI ${box.role}` } : {}),\n valign: box.anchor ?? 'top',\n margin: box.inset ?? DEFAULT_INSET,\n lineSpacingMultiple: 1,\n fit: 'none',\n })\n}\n","/**\n * The presentation as a PowerPoint deck (.pptx), drawn from the same geometry as the stage and the\n * saved PDF: each slide's themed background (an image, painted as the PDF's is), its title, rule\n * and points as real, editable PowerPoint text in the theme's typeface, each clip as an image\n * (redactions burnt in, at 1.5× the size it is shown, so it stays sharp on a projector) with its\n * label, and the logo. PptxGenJS is loaded only when a deck is exported.\n */\n\nimport { clipLabel, frameHeight, type Clip, type Slide } from './model'\nimport { SLIDE_PIXELS, drawClip, drawRoundedClip, loadImage, type SlideLook } from './render-slides'\nimport { addBox } from './export-boxes'\nimport { slideGeometry, textLines, type TextBox } from './slide-layout'\nimport { FONTS, TEXT_COLORS, accentColor, paintBackground, paintSlideBackground } from './theme'\n\n/** PowerPoint's widescreen slide, in inches. */\nconst SLIDE_INCHES = { w: 13.333, h: 7.5 }\n/** A stage-width fraction as a type size in points. */\nconst toPoints = (size: number) => Math.round(size * SLIDE_INCHES.w * 72 * 10) / 10\nconst hex = (color: string) => color.replace('#', '').toUpperCase()\n\n/** A canvas drawn by `draw`, as the data PptxGenJS takes (\"image/png;base64,…\"). */\nasync function canvasImage(\n width: number,\n height: number,\n draw: (context: CanvasRenderingContext2D) => void | Promise<void>\n): Promise<string> {\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(width))\n canvas.height = Math.max(1, Math.round(height))\n const context = canvas.getContext('2d')\n if (!context) throw new Error('Could not draw the slides')\n await draw(context)\n const url = canvas.toDataURL('image/png')\n canvas.width = canvas.height = 0\n return url.replace(/^data:/, '')\n}\n\nconst box = (b: { x: number; y: number; w: number; h: number }) => ({\n x: b.x * SLIDE_INCHES.w,\n y: b.y * SLIDE_INCHES.h,\n w: b.w * SLIDE_INCHES.w,\n h: b.h * SLIDE_INCHES.h,\n})\n\nfunction textOptions(text: TextBox, look: SlideLook) {\n return {\n ...box(text),\n fontFace: FONTS[look.theme.font].pptx,\n fontSize: toPoints(text.size),\n bold: text.weight >= 600,\n color: hex(TEXT_COLORS[text.tone]),\n align: text.align,\n valign: text.anchor ?? 'top',\n lineSpacingMultiple: text.leading,\n margin: 0,\n } as const\n}\n\nexport interface DeckContent {\n title: string\n slides: readonly Slide[]\n clips: readonly Clip[]\n}\n\n/** The deck as a .pptx file. */\nexport async function buildPptx(deck: DeckContent, look: SlideLook): Promise<Blob> {\n const { default: PptxGenJS } = await import('pptxgenjs')\n const pptx = new PptxGenJS()\n pptx.layout = 'LAYOUT_WIDE'\n pptx.title = deck.title\n pptx.theme = {\n headFontFace: FONTS[look.theme.font].pptx,\n bodyFontFace: FONTS[look.theme.font].pptx,\n }\n\n const { width, height } = SLIDE_PIXELS\n const background = await canvasImage(width, height, (context) =>\n paintBackground(context, width, height, look.theme.background)\n )\n const logo = look.logo ? await loadImage(look.logo) : null\n const logoData = logo\n ? await canvasImage(logo.width, logo.height, (context) => context.drawImage(logo, 0, 0))\n : null\n\n const themeFont = FONTS[look.theme.font].pptx\n for (const slide of deck.slides) {\n const page = pptx.addSlide()\n // A slide's own background (an imported deck's): a plain colour stays a colour.\n if (slide.background?.color && !slide.background.gradient && !slide.background.image) {\n page.background = { color: hex(slide.background.color) }\n } else if (slide.background) {\n const own = slide.background\n page.background = {\n data: await canvasImage(width, height, (context) =>\n paintSlideBackground(context, width, height, own, look.media)\n ),\n }\n } else {\n page.background = { data: background }\n }\n if (slide.notes?.trim()) page.addNotes(slide.notes)\n const geometry = slideGeometry(slide, {\n labels: look.labels,\n logo: look.theme.logo?.corner ?? null,\n })\n for (const shape of slide.boxes) if (!shape.front) addBox(pptx, page, shape, themeFont)\n\n for (const item of slide.items) {\n const clip = deck.clips.find((entry) => entry.id === item.clipId)\n if (!clip) continue\n const frame = { ...item.frame, h: frameHeight(item.frame, clip.aspect) }\n if (clip.plain) {\n // Part of the slide's design: as it is, at its own resolution where it has one.\n const source = clip.kind === 'image' ? await createImageBitmap(clip.source) : null\n const scale = source ? Math.min(1, 2400 / Math.max(1, clip.rect.w * source.width)) : 1.5\n const pixels = source\n ? { w: clip.rect.w * source.width * scale, h: clip.rect.h * source.height * scale }\n : { w: frame.w * width * 1.5, h: frame.h * height * 1.5 }\n source?.close()\n const data = await canvasImage(pixels.w, pixels.h, (context) =>\n drawClip(context, clip, { x: 0, y: 0, width: pixels.w, height: pixels.h })\n )\n page.addImage({ data, ...box(frame), altText: clip.caption || clip.fileName })\n continue\n }\n const pixels = { w: frame.w * width * 1.5, h: frame.h * height * 1.5 }\n // Rounded as on the stage: the corners are transparent, so PowerPoint's shadow follows them.\n const data = await canvasImage(pixels.w, pixels.h, (context) =>\n drawRoundedClip(\n context,\n clip,\n { x: 0, y: 0, width: pixels.w, height: pixels.h },\n width * 1.5,\n false\n )\n )\n page.addImage({\n data,\n ...box(frame),\n altText: clip.caption,\n shadow: { type: 'outer', blur: 10, offset: 3, angle: 90, color: '000000', opacity: 0.45 },\n })\n const label = clipLabel(clip, look.columnValues)\n if (look.labels && label) {\n page.addText(label, {\n ...box({ x: frame.x, y: frame.y + frame.h + 0.008, w: frame.w, h: 0.045 }),\n fontFace: FONTS[look.theme.font].pptx,\n fontSize: toPoints(0.017),\n color: hex(TEXT_COLORS.muted),\n margin: 0,\n valign: 'top',\n fit: 'shrink',\n })\n }\n }\n\n const title = slide.caption.trim()\n if (title && geometry.title) {\n page.addText(title, textOptions(geometry.title, look))\n if (geometry.rule) {\n page.addShape(pptx.ShapeType.rect, {\n ...box(geometry.rule),\n fill: { color: hex(accentColor(look.theme.accent)) },\n line: { color: hex(accentColor(look.theme.accent)), width: 0 },\n })\n }\n }\n const lines = textLines(slide.points)\n if (geometry.text && lines.length) {\n const text = geometry.text\n page.addText(\n lines.map((line) => ({\n text: line,\n options: {\n breakLine: true,\n ...(text.bullets\n ? { bullet: { characterCode: '25A0', indent: toPoints(text.size) * 1.2 } }\n : {}),\n },\n })),\n {\n ...textOptions(text, look),\n ...(text.bullets ? { paraSpaceAfter: toPoints(text.size) * 0.45 } : {}),\n }\n )\n }\n\n for (const shape of slide.boxes) if (shape.front) addBox(pptx, page, shape, themeFont)\n\n if (geometry.logo && logo && logoData) {\n const area = box(geometry.logo)\n const scale = Math.min(area.w / logo.width, area.h / logo.height)\n const w = logo.width * scale\n const h = logo.height * scale\n page.addImage({\n data: logoData,\n x: geometry.logo.x < 0.5 ? area.x : area.x + area.w - w,\n y: area.y + area.h - h,\n w,\n h,\n transparency: 10,\n })\n }\n }\n\n const deckFile = (await pptx.write({ outputType: 'blob' })) as Blob\n return accentBullets(deckFile, accentColor(look.theme.accent))\n}\n\n/**\n * The bullets in the accent colour, as on the stage, and their squares the stage's size: PptxGenJS\n * has no option for either, so the slides' XML gets PowerPoint's own bullet colour and size.\n */\nasync function accentBullets(deck: Blob, accent: string): Promise<Blob> {\n const { default: JSZip } = await import('jszip')\n const zip = await JSZip.loadAsync(deck)\n const slides = Object.keys(zip.files).filter((name) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(name))\n for (const name of slides) {\n const xml = await zip.file(name)!.async('string')\n zip.file(\n name,\n xml.replaceAll(\n '<a:buSzPct val=\"100000\"/><a:buChar',\n `<a:buClr><a:srgbClr val=\"${hex(accent)}\"/></a:buClr><a:buSzPct val=\"70000\"/><a:buChar`\n )\n )\n }\n return zip.generateAsync({ type: 'blob', mimeType: deck.type || undefined })\n}\n","/**\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\">…json…</…>\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","/**\n * Reading a PowerPoint package's XML: its parts and relationships, and DrawingML's colours, fills,\n * outlines and theme (colour scheme, fonts) as PowerPoint resolves them. What `import-pptx` builds\n * slides from.\n */\n\nimport type JSZip from 'jszip'\n\nexport const NS = {\n a: 'http://schemas.openxmlformats.org/drawingml/2006/main',\n p: 'http://schemas.openxmlformats.org/presentationml/2006/main',\n r: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n}\n\n/** EMUs per point. */\nexport const EMU_PER_POINT = 12700\n\n/** The element's child elements named `name` (by local name, any namespace). */\nexport function kids(element: Element | null | undefined, name?: string): Element[] {\n if (!element) return []\n const found: Element[] = []\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (!name || child.localName === name) found.push(child)\n }\n return found\n}\n\n/** The first child element named `name`. */\nexport function kid(element: Element | null | undefined, name: string): Element | null {\n if (!element) return null\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (child.localName === name) return child\n }\n return null\n}\n\n/** The element at a path of child names (`path(sp, 'spPr', 'xfrm')`). */\nexport function path(element: Element | null | undefined, ...names: string[]): Element | null {\n let at: Element | null = element ?? null\n for (const name of names) at = kid(at, name)\n return at\n}\n\n/** A numeric attribute, or `fallback`. */\nexport function numAttr(element: Element | null | undefined, name: string, fallback = 0): number {\n const value = element?.getAttribute(name)\n if (value === null || value === undefined || value === '') return fallback\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : fallback\n}\n\n/** A relationship id attribute (`r:embed`, `r:id`…). */\nexport const relAttr = (element: Element | null | undefined, name: string): string | null =>\n element?.getAttributeNS(NS.r, name) ?? element?.getAttribute(`r:${name}`) ?? null\n\n/** A truthy OOXML boolean attribute (\"1\", \"true\"). */\nexport const boolAttr = (\n element: Element | null | undefined,\n name: string\n): boolean | undefined => {\n const value = element?.getAttribute(name)\n if (value === null || value === undefined) return undefined\n return value === '1' || value === 'true'\n}\n\n/** A package: its parts parsed on demand and its relationships resolved. */\nexport class Package {\n private parsed = new Map<string, Document | null>()\n private rels = new Map<string, Map<string, { target: string; type: string; external: boolean }>>()\n\n constructor(readonly zip: JSZip) {}\n\n async xml(part: string): Promise<Document | null> {\n if (this.parsed.has(part)) return this.parsed.get(part) ?? null\n const file = this.zip.file(part)\n const text = file ? await file.async('string') : null\n const doc = text ? new DOMParser().parseFromString(text, 'application/xml') : null\n const ok = doc && !doc.getElementsByTagName('parsererror').length ? doc : null\n this.parsed.set(part, ok)\n return ok\n }\n\n async bytes(part: string): Promise<Uint8Array | null> {\n const file = this.zip.file(part)\n return file ? file.async('uint8array') : null\n }\n\n /** A part's relationships by id, their targets resolved to part names. */\n async relationships(part: string) {\n const cached = this.rels.get(part)\n if (cached) return cached\n const slash = part.lastIndexOf('/')\n const dir = part.slice(0, slash + 1)\n const relsPart = `${dir}_rels/${part.slice(slash + 1)}.rels`\n const doc = await this.xml(relsPart)\n const map = new Map<string, { target: string; type: string; external: boolean }>()\n for (const rel of kids(doc?.documentElement, 'Relationship')) {\n const id = rel.getAttribute('Id')\n const target = rel.getAttribute('Target') ?? ''\n const external = rel.getAttribute('TargetMode') === 'External'\n if (!id) continue\n map.set(id, {\n target: external ? target : resolvePart(dir, target),\n type: rel.getAttribute('Type') ?? '',\n external,\n })\n }\n this.rels.set(part, map)\n return map\n }\n\n /** The first relationship of `part` whose type ends with `type` (\"/slideLayout\"). */\n async related(part: string, type: string): Promise<string | null> {\n for (const rel of (await this.relationships(part)).values()) {\n if (rel.type.endsWith(type) && !rel.external) return rel.target\n }\n return null\n }\n}\n\n/** A relationship target resolved against the part's folder (\"../media/a.png\" → \"ppt/media/a.png\"). */\nexport function resolvePart(dir: string, target: string): string {\n if (target.startsWith('/')) return target.slice(1)\n const parts = (dir + target).split('/')\n const out: string[] = []\n for (const part of parts) {\n if (part === '..') out.pop()\n else if (part !== '.' && part !== '') out.push(part)\n }\n return out.join('/')\n}\n\n// --- Colour -------------------------------------------------------------------------------\n\nexport interface Color {\n hex: string\n alpha: number\n}\n\nexport interface DeckTheme {\n /** Scheme colours by name (dk1, lt1, accent1…), and the master's mapping (bg1 → lt1…). */\n scheme: Record<string, string>\n map: Record<string, string>\n majorFont: string\n minorFont: string\n /** The theme's line widths (lnStyleLst), in points, by style index (1-based). */\n lineWidths: number[]\n}\n\nconst PRESET_COLORS: Record<string, string> = {\n black: '000000',\n white: 'ffffff',\n red: 'ff0000',\n green: '008000',\n blue: '0000ff',\n yellow: 'ffff00',\n gray: '808080',\n grey: '808080',\n darkGray: 'a9a9a9',\n lightGray: 'd3d3d3',\n orange: 'ffa500',\n navy: '000080',\n}\n\nconst toHex = (r: number, g: number, b: number) =>\n `#${[r, g, b]\n .map((v) =>\n Math.round(Math.min(255, Math.max(0, v)))\n .toString(16)\n .padStart(2, '0')\n )\n .join('')}`\n\nfunction rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n r /= 255\n g /= 255\n b /= 255\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n if (max === min) return [0, 0, l]\n const d = max - min\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n let h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4\n h /= 6\n return [h, s, l]\n}\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n if (s === 0) return [l * 255, l * 255, l * 255]\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n const hue = (t: number) => {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1 / 6) return p + (q - p) * 6 * t\n if (t < 1 / 2) return q\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n return p\n }\n return [hue(h + 1 / 3) * 255, hue(h) * 255, hue(h - 1 / 3) * 255]\n}\n\n/** The colour a DrawingML colour element names (srgbClr, schemeClr…), its modifiers applied. */\nexport function readColor(\n element: Element | null,\n theme: DeckTheme,\n placeholder?: Color\n): Color | null {\n if (!element) return null\n let hex: string | null = null\n switch (element.localName) {\n case 'srgbClr':\n hex = element.getAttribute('val')\n break\n case 'sysClr':\n hex =\n element.getAttribute('lastClr') ??\n (element.getAttribute('val') === 'window' ? 'ffffff' : '000000')\n break\n case 'prstClr':\n hex = PRESET_COLORS[element.getAttribute('val') ?? ''] ?? '000000'\n break\n case 'scrgbClr': {\n const c = (name: string) => Math.round((numAttr(element, name) / 100000) * 255)\n hex = toHex(c('r'), c('g'), c('b')).slice(1)\n break\n }\n case 'schemeClr': {\n const name = element.getAttribute('val') ?? ''\n if (name === 'phClr') {\n hex = placeholder?.hex.slice(1) ?? '000000'\n break\n }\n const mapped = theme.map[name] ?? name\n hex = theme.scheme[mapped] ?? theme.scheme[name] ?? null\n break\n }\n default:\n return null\n }\n if (!hex || !/^[0-9a-f]{6}$/i.test(hex)) return null\n let r = parseInt(hex.slice(0, 2), 16)\n let g = parseInt(hex.slice(2, 4), 16)\n let b = parseInt(hex.slice(4, 6), 16)\n let alpha = 1\n for (const mod of kids(element)) {\n const val = numAttr(mod, 'val') / 100000\n switch (mod.localName) {\n case 'alpha':\n alpha = val\n break\n case 'lumMod':\n case 'lumOff':\n case 'satMod': {\n const [h, s, l] = rgbToHsl(r, g, b)\n const next =\n mod.localName === 'lumMod'\n ? hslToRgb(h, s, Math.min(1, l * val))\n : mod.localName === 'lumOff'\n ? hslToRgb(h, s, Math.min(1, Math.max(0, l + val)))\n : hslToRgb(h, Math.min(1, s * val), l)\n ;[r, g, b] = next\n break\n }\n case 'tint':\n r = 255 - (255 - r) * val\n g = 255 - (255 - g) * val\n b = 255 - (255 - b) * val\n break\n case 'shade':\n r *= val\n g *= val\n b *= val\n break\n }\n }\n return { hex: toHex(r, g, b), alpha }\n}\n\nconst COLOR_NAMES = ['srgbClr', 'schemeClr', 'sysClr', 'prstClr', 'scrgbClr']\n\n/** The colour inside an element that holds one (solidFill, a style ref…). */\nexport function colorIn(\n element: Element | null,\n theme: DeckTheme,\n placeholder?: Color\n): Color | null {\n for (const child of kids(element)) {\n if (COLOR_NAMES.includes(child.localName)) return readColor(child, theme, placeholder)\n }\n return null\n}\n\nexport type Fill =\n | { kind: 'none' }\n | { kind: 'solid'; color: Color }\n | { kind: 'gradient'; from: Color; to: Color; angle: number }\n | { kind: 'image'; embed: string; srcRect: Element | null }\n\n/** The fill an element holding fill properties (spPr, bgPr, tcPr) sets, if any. */\nexport function readFill(\n element: Element | null,\n theme: DeckTheme,\n placeholder?: Color\n): Fill | null {\n for (const child of kids(element)) {\n switch (child.localName) {\n case 'noFill':\n return { kind: 'none' }\n case 'solidFill': {\n const color = colorIn(child, theme, placeholder)\n return color ? { kind: 'solid', color } : null\n }\n case 'gradFill': {\n const stops = kids(kid(child, 'gsLst'), 'gs')\n .map((gs) => ({ pos: numAttr(gs, 'pos'), color: colorIn(gs, theme, placeholder) }))\n .filter((stop): stop is { pos: number; color: Color } => stop.color !== null)\n .sort((x, y) => x.pos - y.pos)\n if (!stops.length) return null\n // DrawingML's angle runs clockwise from left-to-right; CSS's from bottom-to-top.\n const ang = numAttr(kid(child, 'lin'), 'ang') / 60000\n return {\n kind: 'gradient',\n from: stops[0].color,\n to: stops[stops.length - 1].color,\n angle: (ang + 90) % 360,\n }\n }\n case 'pattFill': {\n const color = colorIn(kid(child, 'fgClr'), theme, placeholder)\n return color ? { kind: 'solid', color } : null\n }\n case 'blipFill': {\n const blip = kid(child, 'blip')\n const embed = relAttr(blip, 'embed')\n return embed ? { kind: 'image', embed, srcRect: kid(child, 'srcRect') } : null\n }\n }\n }\n return null\n}\n\n/** An outline (a:ln), if it draws: its colour, width (points) and dash. */\nexport function readLine(\n ln: Element | null,\n theme: DeckTheme,\n placeholder?: Color\n): { color: Color; width: number; dash: boolean } | null | undefined {\n if (!ln) return undefined\n const fill = readFill(ln, theme, placeholder)\n if (fill?.kind === 'none') return null\n const color = fill?.kind === 'solid' ? fill.color : fill?.kind === 'gradient' ? fill.from : null\n if (!color) return undefined\n const dash = kid(ln, 'prstDash')?.getAttribute('val')\n return {\n color,\n width: ln.hasAttribute('w') ? numAttr(ln, 'w') / EMU_PER_POINT : 0.75,\n dash: !!dash && dash !== 'solid',\n }\n}\n\n/** A deck's theme, from the theme part its master uses, with the master's colour map. */\nexport async function readTheme(pkg: Package, master: string): Promise<DeckTheme> {\n const themePart = await pkg.related(master, '/theme')\n const doc = themePart ? await pkg.xml(themePart) : null\n const elements = path(doc?.documentElement, 'themeElements')\n const scheme: Record<string, string> = {}\n const bare: DeckTheme = {\n scheme,\n map: {},\n majorFont: 'Calibri',\n minorFont: 'Calibri',\n lineWidths: [],\n }\n for (const entry of kids(kid(elements, 'clrScheme'))) {\n const color = colorIn(entry, bare)\n if (color) scheme[entry.localName] = color.hex.slice(1)\n }\n const fonts = kid(elements, 'fontScheme')\n const typeface = (name: string) =>\n path(fonts, name, 'latin')?.getAttribute('typeface') || 'Calibri'\n const masterDoc = await pkg.xml(master)\n const clrMap = kid(masterDoc?.documentElement, 'clrMap')\n const map: Record<string, string> = {}\n for (const attr of Array.from(clrMap?.attributes ?? [])) map[attr.name] = attr.value\n const lineWidths = kids(path(elements, 'fmtScheme', 'lnStyleLst'), 'ln').map(\n (ln) => numAttr(ln, 'w', 9525) / EMU_PER_POINT\n )\n return {\n scheme,\n map,\n majorFont: typeface('majorFont'),\n minorFont: typeface('minorFont'),\n lineWidths,\n }\n}\n\n/** A typeface as named in a run, the theme's fonts resolved. */\nexport function typefaceOf(name: string | null | undefined, theme: DeckTheme): string | undefined {\n if (!name) return undefined\n if (name.startsWith('+mj')) return theme.majorFont\n if (name.startsWith('+mn')) return theme.minorFont\n return name\n}\n\n/** A media part as a data URL (null for formats a browser cannot show: EMF, WMF, TIFF). */\nexport async function mediaDataUrl(pkg: Package, part: string): Promise<string | null> {\n const ext = part.split('.').pop()?.toLowerCase() ?? ''\n const mime =\n ext === 'png'\n ? 'image/png'\n : ext === 'jpg' || ext === 'jpeg'\n ? 'image/jpeg'\n : ext === 'gif'\n ? 'image/gif'\n : ext === 'svg'\n ? 'image/svg+xml'\n : ext === 'webp'\n ? 'image/webp'\n : ext === 'bmp'\n ? 'image/bmp'\n : null\n if (!mime) return null\n const bytes = await pkg.bytes(part)\n if (!bytes) return null\n let binary = ''\n for (let i = 0; i < bytes.length; i += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000))\n }\n return `data:${mime};base64,${btoa(binary)}`\n}\n","/**\n * A PowerPoint deck made elsewhere, as a presentation: each slide a blank (`free`) slide that looks\n * as it did, with its words editable. Text boxes and placeholders become boxes (their position,\n * size, rotation, fill, outline and text, the styles they inherit from the slide's layout and\n * master resolved), pictures become clips of images embedded in the presentation, tables become a\n * grid of boxes, and the background (the slide's, its layout's or its master's) the slide's own.\n *\n * What cannot be edited here (charts, SmartArt, embedded objects, shapes other than rectangles,\n * rounded rectangles, ellipses and lines) is shown as it was: a clip of that area of the deck's own\n * PDF (the one the backend makes of every PowerPoint file), so the slide still looks right.\n * Speaker notes come along; animations and transitions do not (reported in `notes`).\n *\n * `slideFingerprints` reads what each slide shows (its words, its pictures and where things are):\n * saved with a presentation, it tells, when the file is opened again, which slides were changed in\n * PowerPoint since.\n */\n\nimport type { SavedPresentation, SavedClip, SavedSlide } from './persistence'\nimport type { SavedBox } from './saved-boxes'\nimport type { BoxShape, Paragraph, SlideBackground, TextAlign, TextRun } from './boxes'\nimport { SLIDE_POINTS } from './boxes'\nimport { STAGE_ASPECT } from './model'\nimport { DEFAULT_THEME } from './theme'\nimport {\n EMU_PER_POINT,\n Package,\n boolAttr,\n colorIn,\n kid,\n kids,\n mediaDataUrl,\n numAttr,\n path,\n readFill,\n readLine,\n readTheme,\n relAttr,\n typefaceOf,\n type Color,\n type DeckTheme,\n type Fill,\n} from './pptx-xml'\n\nexport interface ImportOptions {\n /** The presentation's title (default: the deck's own, else \"Presentation\"). */\n title?: string\n /** The deck as a document, and the version imported: what stands in for what cannot be edited. */\n documentId?: string\n version?: number\n fileName?: string\n}\n\nexport interface ImportedDeck {\n saved: SavedPresentation\n /** What did not come across as it was (\"2 charts shown as pictures\"). */\n notes: string[]\n /** Each slide's fingerprint (`slideFingerprints`). */\n fingerprints: string[]\n}\n\n/** EMU rectangle on the slide. */\ninterface Area {\n x: number\n y: number\n w: number\n h: number\n}\n\n/** A group's child coordinates mapped to the slide's. */\ninterface Transform {\n sx: number\n sy: number\n ox: number\n oy: number\n}\nconst IDENTITY: Transform = { sx: 1, sy: 1, ox: 0, oy: 0 }\n\nconst TITLE_TYPES = new Set(['title', 'ctrTitle'])\nconst FOOTER_TYPES = new Set(['dt', 'ftr', 'sldNum', 'hdr'])\n\ninterface Placeholder {\n type: string\n idx: string | null\n}\n\nfunction placeholderOf(shape: Element): Placeholder | null {\n const nv = kids(shape).find((child) => child.localName.startsWith('nv'))\n const ph = path(nv, 'nvPr', 'ph')\n if (!ph) return null\n return { type: ph.getAttribute('type') ?? 'body', idx: ph.getAttribute('idx') }\n}\n\n/** The shape in `tree` that a placeholder inherits from (same index, else same type). */\nfunction findPlaceholder(tree: Element | null, ph: Placeholder, master: boolean): Element | null {\n const shapes = kids(tree).filter((child) => child.localName === 'sp')\n const typeOf = (type: string) =>\n master ? (TITLE_TYPES.has(type) ? 'title' : FOOTER_TYPES.has(type) ? type : 'body') : type\n if (!master && ph.idx !== null) {\n const byIdx = shapes.find((shape) => placeholderOf(shape)?.idx === ph.idx)\n if (byIdx) return byIdx\n }\n const wanted = typeOf(ph.type)\n return (\n shapes.find((shape) => {\n const other = placeholderOf(shape)\n return other !== null && typeOf(other.type) === wanted\n }) ?? null\n )\n}\n\n/** A text level's style (lvlNpPr): what a paragraph and its runs inherit. */\ninterface LevelStyle {\n align?: TextAlign\n bullet?: boolean\n size?: number\n bold?: boolean\n italic?: boolean\n underline?: boolean\n color?: Color\n font?: string\n}\n\nconst ALIGN: Record<string, TextAlign> = { l: 'left', ctr: 'center', r: 'right', just: 'justify' }\n\nfunction readRunProps(rPr: Element | null, theme: DeckTheme): LevelStyle {\n if (!rPr) return {}\n const style: LevelStyle = {}\n if (rPr.hasAttribute('sz')) style.size = numAttr(rPr, 'sz') / 100\n const b = boolAttr(rPr, 'b')\n if (b !== undefined) style.bold = b\n const i = boolAttr(rPr, 'i')\n if (i !== undefined) style.italic = i\n const u = rPr.getAttribute('u')\n if (u) style.underline = u !== 'none'\n const fill = readFill(rPr, theme)\n if (fill?.kind === 'solid') style.color = fill.color\n else if (fill?.kind === 'gradient') style.color = fill.from\n const font = typefaceOf(kid(rPr, 'latin')?.getAttribute('typeface'), theme)\n if (font) style.font = font\n return style\n}\n\nfunction readLevel(pPr: Element | null, theme: DeckTheme): LevelStyle {\n if (!pPr) return {}\n const style: LevelStyle = { ...readRunProps(kid(pPr, 'defRPr'), theme) }\n const algn = pPr.getAttribute('algn')\n if (algn && ALIGN[algn]) style.align = ALIGN[algn]\n if (kid(pPr, 'buNone')) style.bullet = false\n else if (kid(pPr, 'buChar') || kid(pPr, 'buAutoNum') || kid(pPr, 'buBlip')) style.bullet = true\n return style\n}\n\n/** The first value each property has, down a list of styles (most specific first). */\nfunction merge(styles: LevelStyle[]): LevelStyle {\n const out: LevelStyle = {}\n for (const style of styles) {\n for (const key of Object.keys(style) as (keyof LevelStyle)[]) {\n if (out[key] === undefined && style[key] !== undefined) {\n ;(out as Record<string, unknown>)[key] = style[key]\n }\n }\n }\n return out\n}\n\n/** A shape's text as inherited: its lists of level styles, most specific first. */\ntype StyleChain = (Element | null)[]\n\nfunction levelStyle(chain: StyleChain, level: number, theme: DeckTheme): LevelStyle {\n return merge(chain.map((list) => readLevel(kid(list, `lvl${level + 1}pPr`), theme)))\n}\n\ninterface DeckContext {\n pkg: Package\n theme: DeckTheme\n /** EMU → stage fractions. */\n slideSize: { cx: number; cy: number }\n /** The deck's slide placed on the 16:9 stage (a 4:3 deck is centred). */\n place: { x: number; y: number; w: number; h: number }\n /** Points on the deck's slide → points on the widescreen slide. */\n pointScale: number\n defaultText: Element | null\n options: ImportOptions\n clips: SavedClip[]\n media: Record<string, string>\n /** Media parts already read, by part name → key. */\n mediaKeys: Map<string, string | null>\n notes: Map<string, number>\n}\n\ninterface PartContext {\n part: string\n /** The page of the deck's PDF this slide is (null: hidden, not in the PDF). */\n page: number | null\n}\n\nconst note = (deck: DeckContext, text: string) =>\n deck.notes.set(text, (deck.notes.get(text) ?? 0) + 1)\n\nfunction hash(text: string): string {\n let h = 0x811c9dc5\n for (let i = 0; i < text.length; i++) {\n h ^= text.charCodeAt(i)\n h = Math.imul(h, 0x01000193)\n }\n return (h >>> 0).toString(36)\n}\n\nasync function mediaKey(deck: DeckContext, part: string): Promise<string | null> {\n if (deck.mediaKeys.has(part)) return deck.mediaKeys.get(part) ?? null\n const url = await mediaDataUrl(deck.pkg, part)\n const key = url ? `m${hash(url)}` : null\n if (url && key) deck.media[key] = url\n deck.mediaKeys.set(part, key)\n return key\n}\n\n/** A shape's area on the slide (EMU), through its groups' transforms. */\nfunction areaOf(\n xfrm: Element | null,\n transform: Transform\n): (Area & { rotation: number; flipH: boolean; flipV: boolean }) | null {\n const off = kid(xfrm, 'off')\n const ext = kid(xfrm, 'ext')\n if (!off || !ext) return null\n return {\n x: transform.ox + numAttr(off, 'x') * transform.sx,\n y: transform.oy + numAttr(off, 'y') * transform.sy,\n w: numAttr(ext, 'cx') * transform.sx,\n h: numAttr(ext, 'cy') * transform.sy,\n rotation: numAttr(xfrm, 'rot') / 60000,\n flipH: boolAttr(xfrm, 'flipH') === true,\n flipV: boolAttr(xfrm, 'flipV') === true,\n }\n}\n\n/** An area as stage fractions. */\nfunction stageFrame(deck: DeckContext, area: Area) {\n const { cx, cy } = deck.slideSize\n const { place } = deck\n return {\n x: place.x + (area.x / cx) * place.w,\n y: place.y + (area.y / cy) * place.h,\n w: (area.w / cx) * place.w,\n h: (area.h / cy) * place.h,\n }\n}\n\nconst hexOf = (color: Color) => color.hex\n\n/** A picture of an area of the deck's own PDF: what stands in for what cannot be edited. */\nfunction renditionClip(\n deck: DeckContext,\n part: PartContext,\n area: Area,\n what: string\n): number | null {\n const { documentId, version, fileName } = deck.options\n if (!documentId || part.page === null) {\n note(deck, `${what} could not be shown`)\n return null\n }\n const { cx, cy } = deck.slideSize\n const clamp = (v: number) => Math.min(1, Math.max(0, v))\n const x = clamp(area.x / cx)\n const y = clamp(area.y / cy)\n const rect = { x, y, w: clamp((area.x + area.w) / cx) - x, h: clamp((area.y + area.h) / cy) - y }\n if (rect.w <= 0 || rect.h <= 0) return null\n const frame = stageFrame(deck, area)\n note(deck, `${what} shown as a picture`)\n deck.clips.push({\n kind: 'pdf',\n documentId,\n ...(version !== undefined ? { version } : {}),\n fileName: fileName ?? 'Presentation.pptx',\n page: part.page,\n rect,\n aspect: (frame.w * STAGE_ASPECT) / Math.max(frame.h, 1e-6),\n caption: '',\n plain: true,\n })\n return deck.clips.length - 1\n}\n\n/** The paragraphs of a text body, every run's style resolved down its inheritance. */\nfunction readParagraphs(\n body: Element | null,\n chain: StyleChain,\n deck: DeckContext,\n /** The shape's style's text colour (over `fallback`), and the colour when nothing sets one. */\n defaults: { color?: Color; base?: Color },\n fontScale: number,\n /** The deck's default text style: below the shape's own. */\n fallback: StyleChain = []\n): Paragraph[] {\n const { theme } = deck\n const paragraphs: Paragraph[] = []\n for (const p of kids(body, 'p')) {\n const pPr = kid(p, 'pPr')\n const level = Math.min(8, numAttr(pPr, 'lvl'))\n const own = readLevel(pPr, theme)\n const style = merge([\n own,\n levelStyle(chain, level, theme),\n defaults.color ? { color: defaults.color } : {},\n levelStyle(fallback, level, theme),\n ])\n const runStyle = (rPr: Element | null): TextRun => {\n const s = merge([readRunProps(rPr, theme), style])\n const color = s.color ?? defaults.base\n return {\n text: '',\n size: Math.round((s.size ?? 18) * fontScale * deck.pointScale * 10) / 10,\n ...(s.bold ? { bold: true } : {}),\n ...(s.italic ? { italic: true } : {}),\n ...(s.underline ? { underline: true } : {}),\n ...(color ? { color: hexOf(color) } : {}),\n font: s.font ?? theme.minorFont,\n }\n }\n const shape = (runs: TextRun[]): Paragraph => ({\n runs,\n ...(style.align && style.align !== 'left' ? { align: style.align } : {}),\n ...(level ? { level } : {}),\n ...(style.bullet && runs.some((run) => run.text.trim()) ? { bullet: true } : {}),\n })\n let runs: TextRun[] = []\n for (const child of kids(p)) {\n if (child.localName === 'r' || child.localName === 'fld') {\n const text = kid(child, 't')?.textContent ?? ''\n runs.push({ ...runStyle(kid(child, 'rPr')), text })\n } else if (child.localName === 'br') {\n // A line break inside a paragraph: a paragraph of its own here.\n paragraphs.push(shape(runs.length ? runs : [{ ...runStyle(kid(child, 'rPr')), text: '' }]))\n runs = []\n }\n }\n if (!runs.length) runs = [{ ...runStyle(kid(p, 'endParaRPr')), text: '' }]\n paragraphs.push(shape(runs))\n }\n // Trailing empty paragraphs say nothing.\n while (\n paragraphs.length > 1 &&\n !paragraphs[paragraphs.length - 1].runs.some((run) => run.text.trim())\n ) {\n paragraphs.pop()\n }\n return paragraphs\n}\n\nconst SHAPES: Record<string, BoxShape> = {\n rect: 'rect',\n flowChartProcess: 'rect',\n snip1Rect: 'rect',\n roundRect: 'roundRect',\n round1Rect: 'roundRect',\n round2SameRect: 'roundRect',\n flowChartAlternateProcess: 'roundRect',\n ellipse: 'ellipse',\n flowChartConnector: 'ellipse',\n line: 'line',\n straightConnector1: 'line',\n}\n\ninterface Built {\n boxes: SavedBox[]\n /** Clip items placed, with the index in `boxes` they come after (drawing order). */\n items: { clip: number; frame: { x: number; y: number; w: number }; after: number }[]\n}\n\ninterface Inheritance {\n layoutTree: Element | null\n masterTree: Element | null\n masterTxStyles: Element | null\n}\n\n/** One shape of a slide, layout or master, added to `built`. */\nasync function readShape(\n shape: Element,\n transform: Transform,\n deck: DeckContext,\n part: PartContext,\n inherit: Inheritance | null,\n built: Built\n): Promise<void> {\n const { theme } = deck\n const name = shape.localName\n if (name === 'AlternateContent') {\n const choice = kid(shape, 'Fallback') ?? kid(shape, 'Choice')\n for (const child of kids(choice)) await readShape(child, transform, deck, part, inherit, built)\n return\n }\n if (name === 'grpSp') {\n const xfrm = path(shape, 'grpSpPr', 'xfrm')\n const off = kid(xfrm, 'off')\n const ext = kid(xfrm, 'ext')\n const chOff = kid(xfrm, 'chOff')\n const chExt = kid(xfrm, 'chExt')\n let inner = transform\n if (off && ext && chOff && chExt) {\n const sx = numAttr(chExt, 'cx') ? numAttr(ext, 'cx') / numAttr(chExt, 'cx') : 1\n const sy = numAttr(chExt, 'cy') ? numAttr(ext, 'cy') / numAttr(chExt, 'cy') : 1\n inner = {\n sx: transform.sx * sx,\n sy: transform.sy * sy,\n ox: transform.ox + (numAttr(off, 'x') - numAttr(chOff, 'x') * sx) * transform.sx,\n oy: transform.oy + (numAttr(off, 'y') - numAttr(chOff, 'y') * sy) * transform.sy,\n }\n }\n for (const child of kids(shape)) await readShape(child, inner, deck, part, inherit, built)\n return\n }\n\n const ph = name === 'sp' || name === 'pic' ? placeholderOf(shape) : null\n // Placeholders on a layout or master are prompts, not content (\"Click to add title\").\n if (ph && !inherit) return\n if (ph && FOOTER_TYPES.has(ph.type)) return\n const layoutPh = ph && inherit ? findPlaceholder(inherit.layoutTree, ph, false) : null\n const masterPh = ph && inherit ? findPlaceholder(inherit.masterTree, ph, true) : null\n const spPr = kid(shape, name === 'graphicFrame' ? 'xfrm' : 'spPr')\n const xfrm =\n name === 'graphicFrame'\n ? kid(shape, 'xfrm')\n : (kid(spPr, 'xfrm') ?? path(layoutPh, 'spPr', 'xfrm') ?? path(masterPh, 'spPr', 'xfrm'))\n const area = areaOf(xfrm, transform)\n if (!area) return\n\n if (name === 'pic') {\n const blipFill = kid(shape, 'blipFill')\n const embed = relAttr(kid(blipFill, 'blip'), 'embed')\n const target = embed ? (await deck.pkg.relationships(part.part)).get(embed) : undefined\n const key = target && !target.external ? await mediaKey(deck, target.target) : null\n if (!key || Math.abs(area.rotation) > 0.5 || area.flipH || area.flipV) {\n const clip = renditionClip(deck, part, area, 'A picture')\n if (clip !== null) {\n const frame = stageFrame(deck, area)\n built.items.push({ clip, frame, after: built.boxes.length })\n }\n return\n }\n const src = kid(blipFill, 'srcRect')\n const l = numAttr(src, 'l') / 100000\n const t = numAttr(src, 't') / 100000\n const r = numAttr(src, 'r') / 100000\n const b = numAttr(src, 'b') / 100000\n const rect = {\n x: Math.max(0, l),\n y: Math.max(0, t),\n w: Math.min(1, 1 - r) - Math.max(0, l),\n h: Math.min(1, 1 - b) - Math.max(0, t),\n }\n if (rect.w <= 0 || rect.h <= 0) return\n if (kid(path(shape, 'nvPicPr', 'nvPr'), 'videoFile')) note(deck, 'A video shown as its picture')\n const frame = stageFrame(deck, area)\n deck.clips.push({\n kind: 'image',\n documentId: '',\n fileName: target?.target.split('/').pop() ?? 'Picture',\n page: 1,\n rect,\n aspect: (frame.w * STAGE_ASPECT) / Math.max(frame.h, 1e-6),\n caption: '',\n media: key,\n plain: true,\n })\n built.items.push({ clip: deck.clips.length - 1, frame, after: built.boxes.length })\n return\n }\n\n if (name === 'graphicFrame') {\n const data = path(shape, 'graphic', 'graphicData')\n const table = kid(data, 'tbl')\n if (table) {\n readTable(table, area, deck, built)\n return\n }\n const uri = data?.getAttribute('uri') ?? ''\n const what = uri.includes('chart')\n ? 'A chart'\n : uri.includes('diagram')\n ? 'A SmartArt graphic'\n : 'An embedded object'\n const clip = renditionClip(deck, part, area, what)\n if (clip !== null)\n built.items.push({ clip, frame: stageFrame(deck, area), after: built.boxes.length })\n return\n }\n\n if (name !== 'sp' && name !== 'cxnSp') return\n const style = kid(shape, 'style')\n const prst =\n path(spPr, 'prstGeom')?.getAttribute('prst') ?? (kid(spPr, 'custGeom') ? 'custom' : 'rect')\n let fill: Fill | null = readFill(spPr, theme)\n const fillRef = kid(style, 'fillRef')\n if (!fill && fillRef && numAttr(fillRef, 'idx') > 0) {\n const color = colorIn(fillRef, theme)\n if (color) fill = { kind: 'solid', color }\n }\n if (!fill && ph)\n fill = readFill(kid(layoutPh, 'spPr'), theme) ?? readFill(kid(masterPh, 'spPr'), theme)\n let line = readLine(kid(spPr, 'ln'), theme)\n const lnRef = kid(style, 'lnRef')\n if (line === undefined && lnRef && numAttr(lnRef, 'idx') > 0) {\n const color = colorIn(lnRef, theme)\n if (color)\n line = { color, width: theme.lineWidths[numAttr(lnRef, 'idx') - 1] ?? 0.75, dash: false }\n }\n if (line === undefined && name === 'cxnSp') line = null\n\n // Its text, inheriting from its layout and master placeholder, then the master's text styles.\n const body = kid(shape, 'txBody')\n const bodyPr = kid(body, 'bodyPr')\n const inheritedBodyPr = [\n bodyPr,\n path(layoutPh, 'txBody', 'bodyPr'),\n path(masterPh, 'txBody', 'bodyPr'),\n ]\n const category = !ph ? 'otherStyle' : TITLE_TYPES.has(ph.type) ? 'titleStyle' : 'bodyStyle'\n const chain: StyleChain = [\n kid(body, 'lstStyle'),\n path(layoutPh, 'txBody', 'lstStyle'),\n path(masterPh, 'txBody', 'lstStyle'),\n ph ? kid(inherit?.masterTxStyles, category) : null,\n ]\n const fontRef = kid(style, 'fontRef')\n const tx1 = theme.scheme[theme.map.tx1 ?? 'dk1']\n const fontScale = numAttr(kid(bodyPr, 'normAutofit'), 'fontScale', 100000) / 100000\n const paragraphs = body\n ? readParagraphs(\n body,\n chain,\n deck,\n {\n color: colorIn(fontRef, theme) ?? undefined,\n base: tx1 ? { hex: `#${tx1}`, alpha: 1 } : undefined,\n },\n fontScale,\n [deck.defaultText]\n )\n : []\n const hasText = paragraphs.some((p) => p.runs.some((run) => run.text.trim()))\n const visibleFill = fill && fill.kind !== 'none' && fill.kind !== 'image'\n if (!hasText && !visibleFill && !line && fill?.kind !== 'image') return\n\n let shapeKind: BoxShape = SHAPES[prst] ?? (name === 'cxnSp' ? 'line' : 'rect')\n const exotic = !SHAPES[prst] && name !== 'cxnSp'\n if ((exotic && (visibleFill || line)) || fill?.kind === 'image') {\n // A shape drawn here as it was (its outline cannot be edited); its text stays editable on top.\n const clip = renditionClip(deck, part, area, exotic ? 'A shape' : 'A picture fill')\n if (clip !== null) {\n built.items.push({ clip, frame: stageFrame(deck, area), after: built.boxes.length })\n if (!hasText) return\n fill = null\n line = null\n shapeKind = 'text'\n }\n }\n if (shapeKind === 'rect' && !visibleFill && !line) shapeKind = 'text'\n\n const anchorOf = (value: string | null | undefined) =>\n value === 'ctr' ? 'middle' : value === 'b' ? 'bottom' : value === 't' ? 'top' : undefined\n const anchor =\n inheritedBodyPr.map((pr) => anchorOf(pr?.getAttribute('anchor'))).find(Boolean) ??\n (ph && TITLE_TYPES.has(ph.type) ? 'middle' : 'top')\n const insetPr = inheritedBodyPr.find((pr) => pr?.hasAttribute('lIns'))\n const inset = numAttr(insetPr, 'lIns', 91440) / EMU_PER_POINT\n\n // A placeholder's part in the slide; or, exported by ARBI, the part its name keeps.\n const shapeName = path(shape, 'nvSpPr', 'cNvPr')?.getAttribute('name') ?? ''\n const role: SavedBox['role'] = ph\n ? TITLE_TYPES.has(ph.type)\n ? 'title'\n : 'body'\n : shapeName === 'ARBI title'\n ? 'title'\n : shapeName === 'ARBI body'\n ? 'body'\n : undefined\n const box: SavedBox = {\n frame: stageFrame(deck, area),\n shape: shapeKind,\n paragraphs: hasText ? paragraphs : [],\n ...(Math.abs(area.rotation) > 0.01 ? { rotation: area.rotation } : {}),\n ...(area.flipH ? { flipH: true } : {}),\n ...(area.flipV ? { flipV: true } : {}),\n ...(fill?.kind === 'solid'\n ? { fill: fill.color.hex, ...(fill.color.alpha < 1 ? { fillAlpha: fill.color.alpha } : {}) }\n : fill?.kind === 'gradient'\n ? { fill: fill.from.hex }\n : {}),\n ...(line\n ? { line: { color: line.color.hex, width: line.width, ...(line.dash ? { dash: true } : {}) } }\n : {}),\n ...(anchor !== 'top' ? { anchor } : {}),\n ...(Math.abs(inset - 7.2) > 0.05 ? { inset: inset * deck.pointScale } : {}),\n ...(role ? { role } : {}),\n }\n built.boxes.push(box)\n}\n\n/** Medium Style 2 (PowerPoint's default table look): a header row in accent 1, banded rows. */\nfunction readTable(table: Element, area: Area, deck: DeckContext, built: Built) {\n const { theme } = deck\n const tblPr = kid(table, 'tblPr')\n const styled = !!kid(tblPr, 'tableStyleId')\n const firstRow = boolAttr(tblPr, 'firstRow') === true\n const banded = boolAttr(tblPr, 'bandRow') === true\n const accent = `#${theme.scheme.accent1 ?? '4472c4'}`\n const tint = (hex: string, amount: number) =>\n `#${[1, 3, 5]\n .map((i) =>\n Math.round(255 - (255 - parseInt(hex.slice(i, i + 2), 16)) * amount)\n .toString(16)\n .padStart(2, '0')\n )\n .join('')}`\n const columns = kids(kid(table, 'tblGrid'), 'gridCol').map((col) => numAttr(col, 'w'))\n const totalW = columns.reduce((sum, w) => sum + w, 0) || area.w\n const rows = kids(table, 'tr')\n const totalH = rows.reduce((sum, row) => sum + numAttr(row, 'h'), 0) || area.h\n // Rows grow to fit their text in PowerPoint: the frame's height is what it shows.\n const scaleY = area.h / totalH\n let y = area.y\n rows.forEach((row, r) => {\n const h = numAttr(row, 'h') * scaleY\n let x = area.x\n let c = 0\n for (const cell of kids(row, 'tc')) {\n const span = Math.max(1, numAttr(cell, 'gridSpan', 1))\n const w = columns.slice(c, c + span).reduce((sum, cw) => sum + cw, 0) * (area.w / totalW)\n c += span\n if (boolAttr(cell, 'hMerge') || boolAttr(cell, 'vMerge')) {\n x += w\n continue\n }\n const rowSpan = Math.max(1, numAttr(cell, 'rowSpan', 1))\n const cellH = rows\n .slice(r, r + rowSpan)\n .reduce((sum, rr) => sum + numAttr(rr, 'h') * scaleY, 0)\n const tcPr = kid(cell, 'tcPr')\n const own = readFill(tcPr, theme)\n const header = styled && firstRow && r === 0\n const fill =\n own?.kind === 'solid'\n ? own.color.hex\n : own?.kind === 'none'\n ? undefined\n : styled\n ? header\n ? accent\n : banded && (r - (firstRow ? 1 : 0)) % 2 === 0\n ? tint(accent, 0.2)\n : tint(accent, 0.1)\n : undefined\n const text = readParagraphs(\n kid(cell, 'txBody'),\n // The table's style sets its text colour, over the deck's default text.\n [kid(kid(cell, 'txBody'), 'lstStyle')],\n deck,\n {\n color: {\n hex: header ? '#ffffff' : `#${theme.scheme[theme.map.tx1 ?? 'dk1'] ?? '000000'}`,\n alpha: 1,\n },\n },\n 1\n ).map((p) => (header ? { ...p, runs: p.runs.map((run) => ({ ...run, bold: true })) } : p))\n const border = readLine(kid(tcPr, 'lnB'), theme) ?? readLine(kid(tcPr, 'lnT'), theme)\n built.boxes.push({\n frame: stageFrame(deck, { x, y, w, h: cellH }),\n shape: fill || border || styled ? 'rect' : 'text',\n paragraphs: text,\n ...(fill ? { fill } : {}),\n ...(border\n ? { line: { color: border.color.hex, width: border.width } }\n : styled\n ? { line: { color: '#ffffff', width: 1 } }\n : {}),\n anchor: tcPr?.getAttribute('anchor') === 'ctr' ? 'middle' : 'top',\n inset: 7.2 * deck.pointScale,\n })\n x += w\n }\n y += h\n })\n}\n\n/** A background element's fill as a slide background. */\nasync function readBackground(\n bg: Element | null,\n deck: DeckContext,\n part: string\n): Promise<SlideBackground | null> {\n if (!bg) return null\n const bgPr = kid(bg, 'bgPr')\n const bgRef = kid(bg, 'bgRef')\n const fill = bgPr ? readFill(bgPr, deck.theme) : null\n if (fill?.kind === 'solid') return { color: fill.color.hex }\n if (fill?.kind === 'gradient') {\n return { gradient: { from: fill.from.hex, to: fill.to.hex, angle: fill.angle } }\n }\n if (fill?.kind === 'image') {\n const target = (await deck.pkg.relationships(part)).get(fill.embed)\n const key = target && !target.external ? await mediaKey(deck, target.target) : null\n return key ? { image: key } : null\n }\n if (bgRef) {\n const color = colorIn(bgRef, deck.theme)\n if (color) return { color: color.hex }\n }\n return null\n}\n\n/** The deck's slides, in order, with whether each is hidden. */\nasync function slideParts(pkg: Package): Promise<{ part: string; hidden: boolean }[]> {\n const pres = await pkg.xml('ppt/presentation.xml')\n const rels = await pkg.relationships('ppt/presentation.xml')\n const parts: { part: string; hidden: boolean }[] = []\n for (const id of kids(kid(pres?.documentElement, 'sldIdLst'), 'sldId')) {\n const rel = rels.get(relAttr(id, 'id') ?? '')\n if (!rel) continue\n const slide = await pkg.xml(rel.target)\n parts.push({ part: rel.target, hidden: slide?.documentElement.getAttribute('show') === '0' })\n }\n return parts\n}\n\n/** A slide's speaker notes. */\nasync function speakerNotes(pkg: Package, part: string): Promise<string> {\n const notesPart = await pkg.related(part, '/notesSlide')\n const doc = notesPart ? await pkg.xml(notesPart) : null\n const tree = path(doc?.documentElement, 'cSld', 'spTree')\n for (const shape of kids(tree, 'sp')) {\n const ph = placeholderOf(shape)\n if (ph?.type !== 'body') continue\n return kids(kid(shape, 'txBody'), 'p')\n .map((p) =>\n kids(p)\n .filter((child) => child.localName === 'r' || child.localName === 'fld')\n .map((run) => kid(run, 't')?.textContent ?? '')\n .join('')\n )\n .join('\\n')\n .trim()\n }\n return ''\n}\n\nconst JSZIP = () => import('jszip').then((module) => module.default)\n\nexport async function importPptx(\n bytes: Uint8Array,\n options: ImportOptions = {}\n): Promise<ImportedDeck> {\n const JSZip = await JSZIP()\n const pkg = new Package(await JSZip.loadAsync(bytes))\n const pres = await pkg.xml('ppt/presentation.xml')\n if (!pres) throw new Error('This file is not a PowerPoint presentation.')\n const size = kid(pres.documentElement, 'sldSz')\n const cx = numAttr(size, 'cx', 12192000)\n const cy = numAttr(size, 'cy', 6858000)\n const deckAspect = cx / cy\n const place =\n deckAspect < STAGE_ASPECT\n ? { w: deckAspect / STAGE_ASPECT, h: 1, x: (1 - deckAspect / STAGE_ASPECT) / 2, y: 0 }\n : { w: 1, h: STAGE_ASPECT / deckAspect, x: 0, y: (1 - STAGE_ASPECT / deckAspect) / 2 }\n const slides = await slideParts(pkg)\n const firstLayout = slides.length ? await pkg.related(slides[0].part, '/slideLayout') : null\n const firstMaster = firstLayout ? await pkg.related(firstLayout, '/slideMaster') : null\n const deck: DeckContext = {\n pkg,\n theme: firstMaster\n ? await readTheme(pkg, firstMaster)\n : { scheme: {}, map: {}, majorFont: 'Calibri', minorFont: 'Calibri', lineWidths: [] },\n slideSize: { cx, cy },\n place,\n pointScale: (SLIDE_POINTS.h * place.h) / (cy / EMU_PER_POINT),\n defaultText: kid(pres.documentElement, 'defaultTextStyle'),\n options,\n clips: [],\n media: {},\n mediaKeys: new Map(),\n notes: new Map(),\n }\n\n const saved: SavedSlide[] = []\n let page = 0\n for (const { part, hidden } of slides) {\n if (!hidden) page += 1\n const layout = await pkg.related(part, '/slideLayout')\n const master = layout ? await pkg.related(layout, '/slideMaster') : null\n if (master && master !== firstMaster) deck.theme = await readTheme(pkg, master)\n const slideDoc = await pkg.xml(part)\n const layoutDoc = layout ? await pkg.xml(layout) : null\n const masterDoc = master ? await pkg.xml(master) : null\n const tree = (doc: Document | null) => path(doc?.documentElement, 'cSld', 'spTree')\n const built: Built = { boxes: [], items: [] }\n const partContext: PartContext = { part, page: hidden ? null : page }\n // The master's and layout's own shapes (a logo, a band) show on the slide unless it hides them.\n const showMaster = (doc: Document | null) =>\n doc?.documentElement.getAttribute('showMasterSp') !== '0'\n if (masterDoc && showMaster(slideDoc) && showMaster(layoutDoc)) {\n for (const shape of kids(tree(masterDoc))) {\n await readShape(\n shape,\n IDENTITY,\n deck,\n { part: master!, page: partContext.page },\n null,\n built\n )\n }\n }\n if (layoutDoc && showMaster(slideDoc)) {\n for (const shape of kids(tree(layoutDoc))) {\n await readShape(\n shape,\n IDENTITY,\n deck,\n { part: layout!, page: partContext.page },\n null,\n built\n )\n }\n }\n const inherit: Inheritance = {\n layoutTree: tree(layoutDoc),\n masterTree: tree(masterDoc),\n masterTxStyles: kid(masterDoc?.documentElement, 'txStyles'),\n }\n for (const shape of kids(tree(slideDoc))) {\n await readShape(shape, IDENTITY, deck, partContext, inherit, built)\n }\n const bg = (await readBackground(path(slideDoc?.documentElement, 'cSld', 'bg'), deck, part)) ??\n (layout\n ? await readBackground(path(layoutDoc?.documentElement, 'cSld', 'bg'), deck, layout)\n : null) ??\n (master\n ? await readBackground(path(masterDoc?.documentElement, 'cSld', 'bg'), deck, master)\n : null) ?? {\n color: '#ffffff',\n }\n if (hidden) note(deck, 'A hidden slide')\n const firstClipAt = built.items.length\n ? Math.min(...built.items.map((item) => item.after))\n : Infinity\n const boxes = built.boxes.map((box, index) =>\n index >= firstClipAt ? { ...box, front: true } : box\n )\n const title = boxes.find((box) => box.role === 'title')\n const notes = await speakerNotes(pkg, part)\n saved.push({\n caption: title\n ? title.paragraphs\n .map((p) => p.runs.map((run) => run.text).join(''))\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim()\n : '',\n auto: false,\n layout: 'free',\n items: built.items.map(({ clip, frame }) => ({\n clip,\n frame: { x: frame.x, y: frame.y, w: frame.w },\n })),\n boxes,\n background: bg,\n ...(notes ? { notes } : {}),\n })\n }\n\n for (const part of Object.keys(pkg.zip.files)) {\n if (/^ppt\\/slides\\/slide\\d+\\.xml$/.test(part)) {\n const xml = await pkg.zip.file(part)!.async('string')\n if (/<p:timing\\b/.test(xml)) {\n note(deck, 'Animations are not kept')\n break\n }\n }\n }\n\n const core = await pkg.xml('docProps/core.xml')\n const coreTitle = Array.from(core?.documentElement.childNodes ?? []).find(\n (node): node is Element => node instanceof Element && node.localName === 'title'\n )?.textContent\n return {\n saved: {\n format: 'arbi-presentation',\n version: 1,\n title: options.title ?? (coreTitle?.trim() || 'Presentation'),\n captions: false,\n theme: DEFAULT_THEME,\n clips: deck.clips,\n slides: saved,\n ...(Object.keys(deck.media).length ? { media: deck.media } : {}),\n },\n notes: [...deck.notes.entries()].map(([text, count]) =>\n count > 1 && !text.startsWith('Animations') ? `${text} (${count})` : text\n ),\n fingerprints: await fingerprintsOf(pkg, slides),\n }\n}\n\n/** What a slide shows, reduced to a short string: its words, its pictures and their places. */\nasync function fingerprintsOf(pkg: Package, slides: { part: string }[]): Promise<string[]> {\n const out: string[] = []\n for (const { part } of slides) {\n const doc = await pkg.xml(part)\n const tree = path(doc?.documentElement, 'cSld', 'spTree')\n const parts: string[] = []\n const visit = (element: Element) => {\n for (const child of kids(element)) {\n const name = child.localName\n if (name === 't') parts.push(child.textContent ?? '')\n else if (name === 'off') {\n // Places to a hundredth of the slide (a re-save may round them).\n parts.push(\n `@${Math.round(numAttr(child, 'x') / 120000)},${Math.round(numAttr(child, 'y') / 68000)}`\n )\n } else if (name === 'blip') parts.push('pic')\n else visit(child)\n }\n }\n if (tree) visit(tree)\n parts.push(`notes:${await speakerNotes(pkg, part)}`)\n out.push(hash(parts.join('|').replace(/\\s+/g, ' ')))\n }\n return out\n}\n\n/** Each slide's fingerprint, in order (see the module's notes). */\nexport async function slideFingerprints(bytes: Uint8Array | Blob): Promise<string[]> {\n const JSZip = await JSZIP()\n const pkg = new Package(await JSZip.loadAsync(bytes))\n return fingerprintsOf(pkg, await slideParts(pkg))\n}\n","/**\n * A presentation saved by the editor and then changed in PowerPoint (or another app): its slides,\n * as they now are. A slide PowerPoint left as it was (its fingerprint unchanged) keeps the editor's\n * own version of it (clips that are references to their sources, its layout); a slide changed,\n * added or moved in PowerPoint is taken as imported, so nothing done there is lost. Slides deleted\n * there are gone.\n */\n\nimport type { SavedPresentation, SavedSlide } from './persistence'\n\nexport function mergeOutsideEdits(\n saved: SavedPresentation,\n imported: SavedPresentation,\n fingerprints: readonly string[]\n): { saved: SavedPresentation; changed: number[] } {\n const used = new Set<number>()\n const offset = saved.clips.length\n const changed: number[] = []\n const slides: SavedSlide[] = fingerprints.map((fingerprint, index) => {\n const own = saved.slides.findIndex(\n (slide, i) => !used.has(i) && slide.fingerprint === fingerprint\n )\n if (own >= 0) {\n used.add(own)\n return saved.slides[own]\n }\n changed.push(index + 1)\n const slide = imported.slides[index]\n return {\n ...slide,\n items: slide.items.map((item) => ({ ...item, clip: item.clip + offset })),\n fingerprint,\n }\n })\n return {\n saved: {\n ...saved,\n clips: [...saved.clips, ...imported.clips],\n slides,\n ...(saved.media || imported.media ? { media: { ...saved.media, ...imported.media } } : {}),\n },\n changed,\n }\n}\n","/**\n * Saving and opening presentations as documents of the open workspace's `Presentations` folder:\n * a PowerPoint file (`<title>.pptx`: its slides as editable PowerPoint, the presentation's own data\n * inside it, `pptx-data`). Saving again adds a version to the same document; Export PDF saves a\n * PDF of the slides.\n *\n * Opening fetches each clip's source again: the PDF the viewer shows for a page clip (so Word and\n * text documents work too), the original file for an image or a video. A page clip's redactions\n * are read again from the markup; a clip whose source or redactions cannot be read is left out\n * (never shown unredacted), and how many were is reported.\n *\n * Presentations saved before they were PowerPoint files (a PDF with the data attached, or the data\n * alone) still open; their first save makes a PowerPoint file of them.\n */\n\nimport { useCallback } from 'react'\nimport { useArbi, useArbiSessionState } from '@arbidocs/react'\nimport { isPresentationFileName } from '@arbidocs/react/ui'\nimport {\n createMarkupStore,\n fetchDocumentPdf,\n imagesToPdf,\n MarkupStoreError,\n readPdfAttachment,\n useDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport type { Clip, Rect, Slide } from '../../presentation/model'\nimport {\n EXPORTS_FOLDER,\n PRESENTATIONS_FOLDER,\n PRESENTATION_ATTACHMENT,\n TEMPLATES_FOLDER,\n parsePresentation,\n presentationFileName,\n presentationTitle,\n safeFileStem,\n serializePresentation,\n type SavedClip,\n} from '../../presentation/persistence'\nimport { usePresentation } from '../../presentation/store'\nimport { renderSlide } from '../../presentation/render-slides'\nimport { buildPptx } from '../../presentation/export-pptx'\nimport {\n isZipBytes,\n readPptxPresentationData,\n writePptxPresentationData,\n} from '../../presentation/pptx-data'\nimport { importPptx, slideFingerprints } from '../../presentation/import-pptx'\nimport { mergeOutsideEdits } from '../../presentation/merge-outside-edits'\nimport type { SavedPresentation } from '../../presentation/persistence'\n\nconst PPTX_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\n\n/** A slide's page in the exported PDF, in points: 16:9. */\nconst SLIDE_PAGE = { width: 1280, height: 720 }\n\n/** An image embedded as a data URL, as a file. */\nfunction dataUrlBlob(url: string): Blob {\n const [head, body] = url.split(',', 2)\n const type = /^data:([^;]+)/.exec(head)?.[1] ?? 'application/octet-stream'\n const binary = atob(body ?? '')\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i)\n return new Blob([bytes], { type })\n}\n\n/** What opening a presentation found besides its content. */\nexport interface OpenedPresentation {\n /** Clips whose source could not be opened (left out). */\n missing: number\n /** Changed outside the editor (an agent): the slides are drawn again on the next save. */\n stale: boolean\n /** A PowerPoint made elsewhere, imported: what did not come across as it was. */\n imported?: { notes: string[] }\n /** Slides (1-based) changed in PowerPoint since the editor saved it, brought in. */\n changedOutside?: number[]\n}\n\n/**\n * The editable data of a saved presentation: inside its PowerPoint file; or, saved before that,\n * attached to its PDF, or the file itself.\n */\nasync function presentationData(bytes: Uint8Array): Promise<string | null> {\n if (isZipBytes(bytes)) return readPptxPresentationData(bytes)\n const isPdf = bytes[0] === 0x25 && bytes[1] === 0x50 && bytes[2] === 0x44 && bytes[3] === 0x46\n if (!isPdf) return new TextDecoder().decode(bytes)\n const data = await readPdfAttachment(bytes, PRESENTATION_ATTACHMENT)\n if (!data) {\n throw new Error(\n 'This PDF has no editable presentation in it (it may have been changed outside ARBI).'\n )\n }\n return new TextDecoder().decode(data)\n}\n\nexport interface SavedPresentationEntry {\n id: string\n title: string\n updatedAt: string | null\n}\n\n/** The presentation as it is now, or (`withoutClips`) its look and slides only: a template. */\nfunction current(withoutClips: boolean) {\n const state = usePresentation.getState()\n return withoutClips\n ? {\n ...state,\n clips: [],\n slides: state.slides.map((slide): Slide => ({ ...slide, items: [] })),\n }\n : state\n}\n\nconst lookOf = (state: ReturnType<typeof current>) => ({\n labels: state.captions,\n columnValues: state.columnValues,\n theme: state.theme,\n logo: state.logoImage,\n media: state.media,\n})\n\nexport function usePresentationFiles() {\n const arbi = useArbi()\n const { client } = useDocumentTools()\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n\n /** The presentation as its PowerPoint file, its editable data inside. */\n const buildFile = useCallback(async (title: string, withoutClips: boolean): Promise<Blob> => {\n const state = current(withoutClips)\n const deck = await buildPptx({ title, slides: state.slides, clips: state.clips }, lookOf(state))\n // Drawn just now from the presentation itself: never stale. Each slide's fingerprint tells,\n // when it is opened again, which slides were changed in PowerPoint meanwhile.\n const fingerprints = await slideFingerprints(deck)\n const data = serializePresentation({ ...state, title, fingerprints })\n return writePptxPresentationData(deck, JSON.stringify(data, null, 2))\n }, [])\n\n /**\n * Save the presentation: `<title>.pptx` in Presentations, through the ordinary upload, so it is\n * viewed, searched and downloaded like any document (and opens in PowerPoint). A new version of\n * the document it was saved as, or (never saved, or `asNew`: Save as) a new document named\n * `title`; a template (its look and slides, no clips) goes to Presentations/Templates. Resolves\n * with its id.\n */\n const save = useCallback(\n async (\n title: string,\n { asNew = false, template = false }: { asNew?: boolean; template?: boolean } = {}\n ): Promise<string> => {\n if (!arbi || !workspaceId) throw new Error('Open a workspace to save the presentation.')\n const state = usePresentation.getState()\n // A template is always a new document; the open presentation stays what it was.\n const versionOf = asNew || template ? null : state.savedId\n const deck = await buildFile(title, template)\n const file = new File([deck], presentationFileName(title), { type: PPTX_TYPE })\n const result = await arbi.documents.upload([file], {\n folder: template ? TEMPLATES_FOLDER : PRESENTATIONS_FOLDER,\n workspaceExtId: workspaceId,\n ...(versionOf ? { versionOf } : {}),\n })\n const id = versionOf ?? result.doc_ext_ids?.[0]\n if (!id) throw new Error('The presentation could not be saved.')\n if (!template) {\n // The version just saved: a newer one (saved by ARBI, or someone else) is then told apart.\n const [doc] = await arbi.documents.get([id]).catch(() => [])\n state.setSaved(id, title, doc?.current_version ?? null)\n }\n return id\n },\n [arbi, workspaceId, buildFile]\n )\n\n /**\n * Export the slides as a PDF named `title` (in Presentations/Exports): to send outside or file\n * in a bundle, each slide a page as presented, redactions burnt in.\n */\n const exportPdf = useCallback(\n async (title: string): Promise<string> => {\n if (!arbi || !workspaceId) throw new Error('Open a workspace to export the PDF.')\n const state = current(false)\n const pages = []\n for (const slide of state.slides) {\n const { image, text } = await renderSlide(slide, state.clips, lookOf(state))\n pages.push({ image, text, width: SLIDE_PAGE.width, height: SLIDE_PAGE.height })\n }\n const pdf = await imagesToPdf(pages, { title })\n const result = await arbi.documents.upload(\n [new File([pdf], `${safeFileStem(title)}.pdf`, { type: 'application/pdf' })],\n { folder: EXPORTS_FOLDER, workspaceExtId: workspaceId }\n )\n const id = result.doc_ext_ids?.[0]\n if (!id) throw new Error('The PDF could not be saved.')\n return id\n },\n [arbi, workspaceId]\n )\n\n /** The presentations saved in the open workspace (or its templates), newest first. */\n const list = useCallback(\n async (\n scope: 'presentations' | 'templates' = 'presentations'\n ): Promise<SavedPresentationEntry[]> => {\n if (!arbi || !workspaceId) return []\n const docs = await arbi.documents.list({ workspaceId })\n return docs\n .filter((doc) => {\n const folder = doc.folder ?? ''\n if (!isPresentationFileName(doc.file_name, folder)) return false\n return scope === 'templates'\n ? folder === TEMPLATES_FOLDER\n : folder.startsWith(PRESENTATIONS_FOLDER) &&\n folder !== TEMPLATES_FOLDER &&\n !folder.startsWith(EXPORTS_FOLDER)\n })\n .map((doc) => ({\n id: doc.external_id,\n title: presentationTitle(doc.file_name ?? ''),\n updatedAt: doc.updated_at ?? doc.created_at ?? null,\n }))\n .sort((a, b) => ((a.updatedAt ?? '') < (b.updatedAt ?? '') ? 1 : -1))\n },\n [arbi, workspaceId]\n )\n\n /**\n * A saved presentation's data: from its PowerPoint file (slides changed in PowerPoint since\n * brought in), its PDF's attachment or a file saved before that; a PowerPoint made elsewhere is\n * imported.\n */\n const readSaved = useCallback(\n async (id: string, version?: number) => {\n if (!arbi) throw new Error('Sign in to open a presentation.')\n const response = await arbi.documents.download(id, version)\n const bytes = new Uint8Array(await response.arrayBuffer())\n const text = await presentationData(bytes)\n const [doc] = await arbi.documents.get([id]).catch(() => [])\n const openedVersion = version ?? doc?.current_version ?? null\n if (text === null) {\n // A PowerPoint made elsewhere: imported, the version imported pinned (what cannot be edited\n // here is shown from that version's PDF).\n const imported = await importPptx(bytes, {\n title: presentationTitle(doc?.file_name ?? 'Presentation.pptx'),\n documentId: id,\n version: version ?? doc?.current_version,\n fileName: doc?.file_name ?? undefined,\n })\n return {\n saved: imported.saved,\n legacy: false,\n imported: { notes: imported.notes },\n openedVersion,\n }\n }\n let saved: SavedPresentation = parsePresentation(text)\n let changedOutside: number[] | undefined\n if (isZipBytes(bytes) && saved.slides.some((slide) => slide.fingerprint)) {\n const now = await slideFingerprints(bytes)\n const unchanged =\n now.length === saved.slides.length &&\n now.every((fingerprint, i) => fingerprint === saved.slides[i].fingerprint)\n if (!unchanged) {\n const imported = await importPptx(bytes, {\n title: saved.title,\n documentId: id,\n version: version ?? doc?.current_version,\n fileName: doc?.file_name ?? undefined,\n })\n const merged = mergeOutsideEdits(saved, imported.saved, now)\n saved = merged.saved\n changedOutside = merged.changed\n }\n }\n return {\n saved,\n // Saved before presentations were PowerPoint files: its next save is a new PowerPoint\n // file, not a version of this one (a document's versions keep one format).\n legacy: !isZipBytes(bytes),\n changedOutside,\n openedVersion,\n }\n },\n [arbi]\n )\n\n /** A new presentation from a template: its look and slides, without clips, unsaved. */\n const startFromTemplate = useCallback(\n async (id: string) => {\n const { saved } = await readSaved(id)\n usePresentation.getState().load({\n title: 'Untitled presentation',\n savedId: null,\n captions: saved.captions,\n labelColumn: saved.labelColumn ?? null,\n theme: saved.theme,\n clips: [],\n slides: saved.slides.map((slide) => ({ ...slide, items: [] })),\n media: saved.media,\n })\n },\n [readSaved]\n )\n\n /** A file of the workspace (e.g. the theme's logo). */\n const downloadFile = useCallback(\n async (id: string): Promise<Blob> => {\n if (!arbi) throw new Error('Sign in to read the file.')\n return (await arbi.documents.download(id)).blob()\n },\n [arbi]\n )\n\n /**\n * Open a saved presentation (as of `version`; default its current one) in place of this one.\n * Resolves with how many clips were left out, and whether its slides are stale (its data was\n * changed outside the editor: the next save draws them again).\n */\n const open = useCallback(\n async (id: string, version?: number): Promise<OpenedPresentation> => {\n if (!arbi) throw new Error('Sign in to open a presentation.')\n const { saved, legacy, imported, changedOutside, openedVersion } = await readSaved(\n id,\n version\n )\n const media = saved.media ?? {}\n\n // Each source fetched once, however many clips come from it.\n const sources = new Map<string, Promise<Blob>>()\n const sourceOf = (clip: SavedClip) => {\n if (clip.media) {\n const url = media[clip.media]\n return url ? Promise.resolve(dataUrlBlob(url)) : Promise.reject(new Error('No image'))\n }\n const key = `${clip.kind === 'pdf' ? 'pdf' : 'file'}:${clip.documentId}@${clip.version ?? ''}`\n let pending = sources.get(key)\n if (!pending) {\n pending =\n clip.kind === 'pdf'\n ? fetchDocumentPdf(client, clip.documentId, { version: clip.version ?? null })\n : arbi.documents.download(clip.documentId, clip.version).then((r) => r.blob())\n sources.set(key, pending)\n }\n return pending\n }\n // Redactions per page, read once per source version.\n const markups = new Map<string, Promise<Map<number, Rect[]>>>()\n const masksOf = (clip: SavedClip) => {\n const key = `${clip.documentId}@${clip.version ?? ''}`\n let pending = markups.get(key)\n if (!pending) {\n pending = createMarkupStore({ version: clip.version, client })\n .load(clip.documentId)\n .then((layer) => {\n const byPage = new Map<number, Rect[]>()\n for (const mark of layer.annotations) {\n if (mark.kind !== 'redaction' || mark.status === 'rejected') continue\n byPage.set(mark.page, [...(byPage.get(mark.page) ?? []), ...mark.rects])\n }\n return byPage\n })\n .catch((error: unknown) => {\n // No markup at all is no redaction; anything else is a reason not to show it.\n if (error instanceof MarkupStoreError && error.status === 404) return new Map()\n throw error\n })\n markups.set(key, pending)\n }\n return pending\n }\n\n const opened = await Promise.all(\n saved.clips.map(async (clip): Promise<Omit<Clip, 'id'> | null> => {\n try {\n const [source, masks] = await Promise.all([\n sourceOf(clip),\n clip.kind === 'pdf' && !clip.media\n ? masksOf(clip)\n : Promise.resolve(new Map<number, Rect[]>()),\n ])\n return { ...clip, source, masks: masks.get(clip.page) ?? [] }\n } catch {\n return null\n }\n })\n )\n // Keep slide items pointing at the right clips once the missing ones are dropped.\n const kept: Omit<Clip, 'id'>[] = []\n const newIndex = opened.map((clip) => (clip ? kept.push(clip) - 1 : -1))\n usePresentation.getState().load({\n title: saved.title,\n savedId: legacy ? null : id,\n version: legacy ? null : openedVersion,\n boundTo: id,\n captions: saved.captions,\n labelColumn: saved.labelColumn ?? null,\n theme: saved.theme,\n clips: kept,\n slides: saved.slides.map((slide) => ({\n ...slide,\n items: slide.items\n .filter((item) => newIndex[item.clip] >= 0)\n .map((item) => ({ ...item, clip: newIndex[item.clip] })),\n })),\n media,\n })\n return {\n missing: opened.length - kept.length,\n stale: saved.slidesStale === true,\n ...(imported ? { imported } : {}),\n ...(changedOutside?.length ? { changedOutside } : {}),\n }\n },\n [arbi, client, readSaved]\n )\n\n return {\n save,\n exportPdf,\n list,\n open,\n startFromTemplate,\n downloadFile,\n canSave: !!arbi && !!workspaceId,\n }\n}\n","/**\n * Generate image, for a presentation: the app's own Generate image dialog (the workflow's form:\n * prompt, source images to edit or combine, shape) launched here instead of into a chat. The run is\n * the platform's `/image` command sent exactly as that workflow sends it (`PROMPT_BINDINGS`: the\n * shape and source images ride structured tool arguments); like the workflow it leaves a thread\n * and the image as a document in the workspace. The image is then added to the presentation as a\n * clip of the whole picture.\n */\n\nimport { useCallback } from 'react'\nimport { useArbi, useArbiSessionState } from '@arbidocs/react'\nimport type { ArtifactEvent } from '@arbidocs/sdk/browser'\nimport { GENERATE_IMAGE_ID } from '../../agents/workflows/catalogue/seed'\nimport type { OnWorkflowLaunch } from '../../agents/workflows/types'\nimport { PROMPT_BINDINGS } from '../workflows/launch-bindings'\nimport { mediaCaption } from '../../presentation/model'\nimport { usePresentation } from '../../presentation/store'\n\nconst WHOLE = { x: 0, y: 0, w: 1, h: 1 }\n\n/** An image's width / height. */\nasync function aspectOf(blob: Blob): Promise<number> {\n const bitmap = await createImageBitmap(blob)\n const aspect = bitmap.width / bitmap.height\n bitmap.close()\n return aspect\n}\n\n/** The Generate image dialog's launch, run for the presentation: the image becomes a clip. */\nexport function useGenerateImageLaunch(): OnWorkflowLaunch {\n const arbi = useArbi()\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n\n return useCallback(\n async ({ inputs }) => {\n if (!arbi || !workspaceId) throw new Error('Open a workspace to generate images.')\n const prompt = typeof inputs.prompt === 'string' ? inputs.prompt.trim() : ''\n if (!prompt) return\n const tools = PROMPT_BINDINGS[GENERATE_IMAGE_ID].tools?.(inputs)\n let image: ArtifactEvent | undefined\n let answer = ''\n let failure = ''\n await arbi.assistant\n .ask(\n { question: `/image ${prompt}`, workspaceId, ...(tools ? { tools } : {}) },\n {\n onToken: (token) => {\n answer += token\n },\n onError: (error) => {\n failure = error instanceof Error ? error.message : String(error)\n },\n onArtifact: (artifact) => {\n if (artifact.mode === 'image' && artifact.doc_ext_id) image = artifact\n },\n }\n )\n .catch((error: unknown) => {\n failure ||= error instanceof Error ? error.message : String(error)\n })\n const documentId = image?.doc_ext_id\n // `/image` reports a refused or failed generation as its answer text.\n if (!documentId)\n throw new Error(failure || answer.trim() || 'The image could not be generated.')\n const source = await (await arbi.documents.download(documentId)).blob()\n const fileName = `${prompt.split('\\n')[0].slice(0, 60)}.png`\n usePresentation.getState().addClip({\n kind: 'image',\n documentId,\n fileName,\n page: 1,\n rect: WHOLE,\n aspect: await aspectOf(source),\n masks: [],\n source,\n caption: mediaCaption(fileName),\n })\n },\n [arbi, workspaceId]\n )\n}\n","/**\n * The presentation's dialogs: the app's Generate image (to create or edit an image into the clips),\n * save under a title (or as a template), open a saved one (or start from a template), choose the\n * theme's logo.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n FileDown,\n FolderOpen,\n ImageIcon,\n LayoutTemplate,\n Loader2,\n Presentation,\n Save,\n} from 'lucide-react'\nimport { useDocuments } from '@arbidocs/react'\nimport { Button, Input, getDocumentTitle } from '@arbidocs/react/ui'\nimport { DocumentPicker, type PickerGroup } from '../../settings/DocumentPicker'\nimport { ModalScaffold } from '../../settings/ModalScaffold'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { GENERATE_IMAGE_ID } from '../../agents/workflows/catalogue/seed'\nimport type { OnWorkflowLaunch } from '../../agents/workflows/types'\nimport { ConnectedWorkflowStart } from '../workflows/ConnectedWorkflowStart'\nimport { useWorkflowDefinitions } from '../workflows/useWorkflowDefinitions'\nimport { usePresentation } from '../../presentation/store'\nimport { useGenerateImageLaunch } from './useImageGeneration'\nimport { usePresentationFiles, type SavedPresentationEntry } from './usePresentationFiles'\n\ninterface DialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\n/**\n * Generate image, from the presentation: the app's own Generate image dialog (the workflow's form),\n * opened straight on its form, with `referenceId` as its source image when editing one. Its run\n * adds the image to the clips instead of opening a chat.\n */\nexport function GenerateImageDialog({\n open,\n onOpenChange,\n referenceId,\n}: DialogProps & { referenceId?: string | null }) {\n const notify = usePresentation((s) => s.notify)\n const { skills } = useWorkflowDefinitions()\n const run = useGenerateImageLaunch()\n // The run makes an image for the presentation, so it is always the user's own (no agent choice).\n const workflows = useMemo(\n () =>\n skills\n .filter((w) => w.id === GENERATE_IMAGE_ID)\n .map((w) => ({ ...w, options: { ...w.options, agent: false } })),\n [skills]\n )\n const onLaunch = useCallback<OnWorkflowLaunch>(\n async (launch) => {\n try {\n await run(launch)\n notify('The image is in your clips', 'success')\n } catch (error) {\n notify(error instanceof Error ? error.message : 'The image could not be generated', 'error')\n throw error\n }\n },\n [run, notify]\n )\n if (!open || !workflows.length) return null\n return (\n <ConnectedWorkflowStart\n workflows={workflows}\n showTiles={false}\n activeId={GENERATE_IMAGE_ID}\n onActiveIdChange={(id) => id === null && onOpenChange(false)}\n initialInputsFor={() =>\n referenceId ? { references: { folders: [], labels: [], documents: [referenceId] } } : {}\n }\n onLaunch={onLaunch}\n // In the presentation's (popped-out) window: uploads happen here, not in the app's window.\n uploadInPlace\n />\n )\n}\n\n/** Save the presentation under a title (in the workspace's Presentations folder). */\n/** How the presentation is saved: again, as a new copy, as a template, or exported as a PDF. */\nexport type SaveMode = 'save' | 'saveAs' | 'export' | 'template'\n\nconst SAVE_TEXT: Record<SaveMode, { title: string; description: string; action: string }> = {\n save: {\n title: 'Save presentation',\n description:\n 'Saved in Files › Presentations as a PowerPoint file: searchable, it opens again here for editing, and in PowerPoint.',\n action: 'Save',\n },\n saveAs: {\n title: 'Save as',\n description: 'A new copy under this name in Files › Presentations.',\n action: 'Save',\n },\n template: {\n title: 'Save as template',\n description:\n 'Its look and slides, without clips, in Files › Presentations › Templates: New from template starts from it.',\n action: 'Save template',\n },\n export: {\n title: 'Export PDF',\n description:\n 'A PDF of the slides in Files › Presentations › Exports: to send or file. Redactions are burnt in.',\n action: 'Export',\n },\n}\n\n/** Save under a name you type, in the workspace's Presentations folder. */\nexport function SavePresentationDialog({\n open,\n onOpenChange,\n mode = 'save',\n}: DialogProps & { mode?: SaveMode }) {\n const notify = usePresentation((s) => s.notify)\n const { save, exportPdf } = usePresentationFiles()\n const current = usePresentation((s) => s.title)\n const [title, setTitle] = useState(current)\n const [busy, setBusy] = useState(false)\n const text = SAVE_TEXT[mode]\n useEffect(() => {\n if (!open) return\n const named = current === 'Untitled presentation' ? '' : current\n setTitle(mode === 'saveAs' && named ? `${named} (copy)` : mode === 'template' ? '' : named)\n }, [open, current, mode])\n\n const submit = async () => {\n const name = title.trim()\n if (!name || busy) return\n setBusy(true)\n try {\n if (mode === 'export') {\n await exportPdf(name)\n notify(`\"${name}.pdf\" saved in Presentations`, 'success')\n } else {\n await save(name, { asNew: mode === 'saveAs', template: mode === 'template' })\n notify(`\"${name}\" saved in Presentations`, 'success')\n }\n onOpenChange(false)\n } catch (error) {\n notify(error instanceof Error ? error.message : 'Could not save', 'error')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <ModalScaffold\n open={open}\n onOpenChange={onOpenChange}\n title={text.title}\n description={text.description}\n showDescription\n icon={mode === 'export' ? <FileDown className=\"size-5\" /> : <Save className=\"size-5\" />}\n size=\"sm\"\n testId=\"presentation-save-dialog\"\n >\n <ModalScaffold.Body>\n <Input\n autoFocus\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n onKeyDown={(event) => event.key === 'Enter' && void submit()}\n placeholder=\"Name, e.g. Opening statement\"\n aria-label=\"Name\"\n disabled={busy}\n />\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button type=\"button\" onClick={() => void submit()} disabled={!title.trim() || busy}>\n {busy && <Loader2 className=\"size-4 animate-spin\" />}\n {text.action}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n\n/**\n * Open a presentation saved in this workspace, in place of this one; or (`templates`) start a new\n * one from a template.\n */\nexport function OpenPresentationDialog({\n open,\n onOpenChange,\n onOpened,\n templates = false,\n}: DialogProps & {\n /**\n * Show the chosen presentation (the viewer's slides tab opens its document, and loads it);\n * after a template, `null`: a new presentation, its look and slides already loaded.\n */\n onOpened: (documentId: string | null) => void\n templates?: boolean\n}) {\n const { confirm } = useBlocksEnvironment()\n const notify = usePresentation((s) => s.notify)\n const { list, startFromTemplate } = usePresentationFiles()\n const [entries, setEntries] = useState<SavedPresentationEntry[] | null>(null)\n const [opening, setOpening] = useState<string | null>(null)\n\n useEffect(() => {\n if (!open) return\n setEntries(null)\n list(templates ? 'templates' : 'presentations')\n .then(setEntries)\n .catch(() => setEntries([]))\n }, [open, list, templates])\n\n const choose = async (entry: SavedPresentationEntry) => {\n if (!templates) {\n onOpenChange(false)\n onOpened(entry.id)\n return\n }\n if (usePresentation.getState().clips.length) {\n const ok = await confirm({\n title: 'New from template',\n message: 'Replace the presentation that is open? Save it first to keep it.',\n kind: 'confirm',\n })\n if (!ok) return\n }\n setOpening(entry.id)\n try {\n await startFromTemplate(entry.id)\n onOpenChange(false)\n onOpened(null)\n } catch (error) {\n notify(error instanceof Error ? error.message : 'The template could not be opened', 'error')\n } finally {\n setOpening(null)\n }\n }\n\n return (\n <ModalScaffold\n open={open}\n onOpenChange={onOpenChange}\n title={templates ? 'New from template' : 'Open presentation'}\n description={\n templates\n ? 'A new presentation with the template’s look and slides.'\n : 'Presentations saved in this workspace.'\n }\n showDescription\n icon={templates ? <LayoutTemplate className=\"size-5\" /> : <FolderOpen className=\"size-5\" />}\n testId={templates ? 'presentation-template-dialog' : 'presentation-open-dialog'}\n >\n <ModalScaffold.Body>\n {entries === null ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> Loading…\n </p>\n ) : entries.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n {templates\n ? 'No templates yet. Save as template… keeps one in Files › Presentations › Templates.'\n : 'No saved presentations yet.'}\n </p>\n ) : (\n <ul className=\"divide-y divide-border rounded-lg border border-border\">\n {entries.map((entry) => (\n <li key={entry.id}>\n <button\n type=\"button\"\n disabled={!!opening}\n onClick={() => void choose(entry)}\n className=\"flex w-full items-center gap-3 px-3 py-2.5 text-left hover:bg-muted focus-visible:bg-muted focus-visible:outline-none disabled:opacity-60 pointer-coarse:min-h-11\"\n >\n {opening === entry.id ? (\n <Loader2 className=\"size-4 shrink-0 animate-spin text-muted-foreground\" />\n ) : (\n <Presentation className=\"size-4 shrink-0 text-muted-foreground\" />\n )}\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">{entry.title}</span>\n {entry.updatedAt && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {new Date(entry.updatedAt).toLocaleDateString()}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n )}\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\nconst IMAGE_FILE = /\\.(png|jpe?g|gif|webp|svg)$/i\n\n/** Design › Logo: one of the workspace's images, in the footer of every slide. */\nexport function ChooseLogoDialog({ open, onOpenChange }: DialogProps) {\n const setTheme = usePresentation((s) => s.setTheme)\n const corner = usePresentation((s) => s.theme.logo?.corner ?? 'br')\n const { data: documents } = useDocuments(undefined, { enabled: open })\n const [picked, setPicked] = useState('')\n const groups = useMemo<PickerGroup[]>(\n () => [\n {\n id: 'images',\n docs: (documents ?? [])\n .filter((doc) => IMAGE_FILE.test(doc.file_name ?? ''))\n .map((doc) => ({\n id: doc.external_id,\n title: getDocumentTitle(doc, 'Untitled'),\n fileName: doc.file_name,\n }))\n .sort((a, b) => a.title.localeCompare(b.title)),\n },\n ],\n [documents]\n )\n const selected = groups[0].docs.find((doc) => doc.id === picked)\n const use = () => {\n if (!selected) return\n setTheme({ logo: { documentId: selected.id, fileName: selected.fileName ?? '', corner } })\n setPicked('')\n onOpenChange(false)\n }\n return (\n <ModalScaffold\n open={open}\n onOpenChange={onOpenChange}\n title=\"Logo\"\n description=\"An image of this workspace (a PNG with a transparent background looks best), small in the footer of every slide.\"\n showDescription\n icon={<ImageIcon className=\"size-5\" />}\n size=\"sm\"\n testId=\"presentation-logo-dialog\"\n >\n <ModalScaffold.Body>\n <DocumentPicker\n groups={groups}\n value={picked}\n onValueChange={setPicked}\n labels={{ placeholder: 'Choose an image', noDocuments: 'No images in this workspace.' }}\n />\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={use}\n disabled={!selected}\n data-testid=\"presentation-logo-use\"\n >\n Use as logo\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n","/**\n * Crop an image clip: the app's image cropper over the whole source image, to choose the part the\n * clip shows (and its shape). The image itself is untouched: only the clip's area changes, so it\n * can be cropped again, wider or narrower, at any time.\n */\n\nimport { useEffect, useState } from 'react'\nimport { Crop } from 'lucide-react'\nimport { ImageCropper, type CropArea } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ModalScaffold } from '../../settings/ModalScaffold'\nimport type { Clip } from '../../presentation/model'\nimport { usePresentation } from '../../presentation/store'\nimport { useObjectUrl } from '../../presentation/useObjectUrl'\n\nexport interface CropClipDialogProps {\n clip: Clip | null\n onOpenChange: (open: boolean) => void\n}\n\nexport function CropClipDialog({ clip, onOpenChange }: CropClipDialogProps) {\n const url = useObjectUrl(clip?.source ?? EMPTY)\n const [natural, setNatural] = useState<{ width: number; height: number } | null>(null)\n const [area, setArea] = useState<CropArea | null>(null)\n\n // The source's own size, to turn the cropper's pixels into fractions of the image.\n useEffect(() => {\n setNatural(null)\n setArea(null)\n if (!clip) return\n let cancelled = false\n void createImageBitmap(clip.source).then((bitmap) => {\n if (!cancelled) setNatural({ width: bitmap.width, height: bitmap.height })\n bitmap.close()\n })\n return () => {\n cancelled = true\n }\n }, [clip])\n\n const original = natural ? natural.width / natural.height : 1\n const apply = () => {\n if (!clip || !natural || !area || !area.width || !area.height) return\n const rect = {\n x: Math.max(0, area.x / natural.width),\n y: Math.max(0, area.y / natural.height),\n w: Math.min(1, area.width / natural.width),\n h: Math.min(1, area.height / natural.height),\n }\n usePresentation.getState().cropClip(clip.id, rect, area.width / area.height)\n onOpenChange(false)\n }\n\n return (\n <ModalScaffold\n open={!!clip}\n onOpenChange={onOpenChange}\n title=\"Crop\"\n description=\"Choose the part of the image the clip shows.\"\n icon={<Crop className=\"size-5\" />}\n size=\"lg\"\n testId=\"presentation-crop-dialog\"\n >\n <ModalScaffold.Body>\n {url && natural && (\n <ImageCropper\n image={url}\n aspect={original}\n aspectOptions={[\n { label: 'Original', value: original },\n { label: '16:9', value: 16 / 9 },\n { label: '4:3', value: 4 / 3 },\n { label: '1:1', value: 1 },\n { label: '3:4', value: 3 / 4 },\n ]}\n onCropComplete={(next) => setArea(next)}\n />\n )}\n </ModalScaffold.Body>\n <ModalScaffold.Footer>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={apply}\n disabled={!area}\n data-testid=\"presentation-crop-apply\"\n >\n Crop\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n\nconst EMPTY = new Blob()\n","import {\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from '@arbidocs/react/ui'\nimport { usePresentation } from '../../presentation/store'\nimport type { LabelColumn } from './useLabelColumns'\n\nconst NONE = 'none'\n\n/**\n * \"Label clips with\" in the presentation's menu: no column, or one of the workspace's annotation\n * columns (`useLabelColumns`), whose value leads each clip's label.\n */\nexport function LabelColumnMenu({ columns }: { columns: LabelColumn[] }) {\n const labelColumn = usePresentation((s) => s.labelColumn)\n const setLabelColumn = usePresentation((s) => s.setLabelColumn)\n if (!columns.length) return null\n const chosen = columns.find((column) => column.id === labelColumn)\n return (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger data-testid=\"presentation-label-column\">\n Label clips with\n <span className=\"ml-auto pl-3 text-xs text-muted-foreground\">{chosen?.name ?? 'None'}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuRadioGroup\n value={chosen?.id ?? NONE}\n onValueChange={(value) => setLabelColumn(value === NONE ? null : value)}\n >\n <DropdownMenuRadioItem value={NONE}>No column</DropdownMenuRadioItem>\n {columns.map((column) => (\n <DropdownMenuRadioItem key={column.id} value={column.id}>\n {column.name}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )\n}\n","import { Sparkles } from 'lucide-react'\n\n/** The dashed first tile of the clip tray: Generate image. */\nexport function GenerateTile({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title=\"Generate an image\"\n aria-label=\"Generate image\"\n className=\"flex h-[72px] w-[72px] flex-col items-center justify-center gap-1 rounded-lg border border-dashed border-border text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid=\"presentation-generate-image\"\n >\n <Sparkles className=\"size-4\" />\n <span className=\"text-[10px] font-medium\">Generate</span>\n </button>\n )\n}\n","/**\n * Labelling clips with an annotation column: an Exhibit column's \"R-100\" leads the label of every\n * clip of that document (\"R-100 · Statement of case · p. 3\"), so a hearing bundle's numbering is on\n * the slide. The values are read live from the documents (editing one in Files updates the slides);\n * only the column's choice is saved with the presentation.\n */\n\nimport { useEffect, useMemo } from 'react'\nimport { useArbiSessionState, useDocuments, useTags } from '@arbidocs/react'\nimport { usePresentation } from '../../presentation/store'\n\n/** Column formats that hold one value per document (a checkbox only says yes or no). */\nconst VALUE_FORMATS = new Set(['text', 'number', 'select'])\n\nexport interface LabelColumn {\n id: string\n name: string\n}\n\n/**\n * The workspace's columns a clip can be labelled with, and (while the presentation is open) each\n * clip document's value in the chosen one, kept in the presentation store.\n */\nexport function useLabelColumns(active: boolean): LabelColumn[] {\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: tags } = useTags(workspaceId, { enabled: active })\n const { data: documents } = useDocuments(workspaceId, { enabled: active })\n const labelColumn = usePresentation((s) => s.labelColumn)\n const documentIds = usePresentation((s) => s.clips.map((clip) => clip.documentId).join(' '))\n\n const columns = useMemo(\n () =>\n (tags ?? [])\n .filter((tag) => tag.kind !== 'search' && VALUE_FORMATS.has(tag.tag_type.type))\n .map((tag) => ({ id: tag.external_id, name: tag.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [tags]\n )\n\n useEffect(() => {\n const values: Record<string, string> = {}\n if (labelColumn) {\n const wanted = new Set(documentIds.split(' '))\n for (const doc of documents ?? []) {\n if (!wanted.has(doc.external_id)) continue\n const note = doc.doctags?.find((dt) => dt.tag_ext_id === labelColumn)?.note?.trim()\n if (note) values[doc.external_id] = note\n }\n }\n usePresentation.getState().setColumnValues(values)\n }, [labelColumn, documentIds, documents])\n\n return columns\n}\n","/**\n * What the presentation editor gets from the session, wherever it is mounted (the viewer's slides\n * tab, or the presentation's own window): Save, the \"…\" menu (Open, New from template, Save as,\n * Save as template, Export PowerPoint, Export PDF, label column), Generate image, crop and the logo\n * picker, and the dialogs they open (rendered by the host, in its own window).\n */\n\nimport { useCallback, useState, type ReactNode } from 'react'\nimport { Save } from 'lucide-react'\nimport { useArbiSessionStore } from '@arbidocs/react'\nimport { Button, DropdownMenuItem } from '@arbidocs/react/ui'\nimport type { SlidesEditorProps } from '../../presentation/SlidesEditor'\nimport { usePresentation } from '../../presentation/store'\nimport {\n ChooseLogoDialog,\n GenerateImageDialog,\n OpenPresentationDialog,\n SavePresentationDialog,\n type SaveMode,\n} from './PresentationDialogs'\nimport { CropClipDialog } from './CropClipDialog'\nimport { LabelColumnMenu } from './LabelColumnMenu'\nimport { GenerateTile } from './GenerateTile'\nimport { editPresentation } from './requests'\nimport { useLabelColumns } from './useLabelColumns'\nimport { usePresentationFiles } from './usePresentationFiles'\n\ntype Dialog = SaveMode | 'open' | 'fromTemplate' | 'generate' | 'logo'\n\nexport interface PresentationController {\n /** The editor's session parts (the host adds its own actions and Present). */\n editor: Omit<SlidesEditorProps, 'onPresent'>\n /** The dialogs, for the host to render in its window. */\n dialogs: ReactNode\n}\n\nexport function usePresentationController(active: boolean): PresentationController {\n const session = useArbiSessionStore()\n const notify = usePresentation((s) => s.notify)\n const { save, canSave } = usePresentationFiles()\n const labelColumns = useLabelColumns(active)\n const [dialog, setDialog] = useState<Dialog | null>(null)\n const [reference, setReference] = useState<string | null>(null)\n const [cropping, setCropping] = useState<string | null>(null)\n const cropClip = usePresentation((s) => s.clips.find((c) => c.id === cropping) ?? null)\n const [saving, setSaving] = useState(false)\n const close = (open: boolean) => !open && setDialog(null)\n\n // Saved before: save again (a new version) at once; never saved: ask for a title.\n const quickSave = useCallback(async () => {\n const { savedId, title } = usePresentation.getState()\n if (!savedId) return setDialog('save')\n setSaving(true)\n try {\n await save(title)\n notify('Presentation saved', 'success')\n } catch (error) {\n notify(\n error instanceof Error ? error.message : 'The presentation could not be saved',\n 'error'\n )\n } finally {\n setSaving(false)\n }\n }, [save, notify])\n\n const generate = useCallback((referenceId: string | null) => {\n setReference(referenceId)\n setDialog('generate')\n }, [])\n\n const saveModes: SaveMode[] = ['save', 'saveAs', 'export', 'template']\n const dialogs = (\n <>\n <SavePresentationDialog\n open={saveModes.includes(dialog as SaveMode)}\n mode={saveModes.includes(dialog as SaveMode) ? (dialog as SaveMode) : 'save'}\n onOpenChange={close}\n />\n <OpenPresentationDialog\n open={dialog === 'open' || dialog === 'fromTemplate'}\n templates={dialog === 'fromTemplate'}\n // A saved one opens in the viewer's slides tab (its document); a template, as a new one.\n onOpened={(id) =>\n editPresentation(session, id ? { kind: 'open', documentId: id } : { kind: 'new' })\n }\n onOpenChange={close}\n />\n <ChooseLogoDialog open={dialog === 'logo'} onOpenChange={close} />\n <CropClipDialog clip={cropClip} onOpenChange={(open) => !open && setCropping(null)} />\n <GenerateImageDialog\n open={dialog === 'generate'}\n referenceId={reference}\n onOpenChange={close}\n />\n </>\n )\n\n const editor: PresentationController['editor'] = {\n actions: canSave && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 text-muted-foreground hover:text-foreground pointer-coarse:size-11\"\n title=\"Save (in Files › Presentations)\"\n aria-label=\"Save\"\n disabled={saving}\n onClick={() => void quickSave()}\n data-testid=\"presentation-save\"\n >\n <Save className=\"size-4\" />\n </Button>\n ),\n menuItems: canSave && (\n <>\n <DropdownMenuItem onSelect={() => setDialog('open')}>Open…</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => setDialog('fromTemplate')}>\n New from template…\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => setDialog('saveAs')}>Save as…</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => setDialog('template')}>\n Save as template…\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => setDialog('export')}>Export PDF…</DropdownMenuItem>\n <LabelColumnMenu columns={labelColumns} />\n </>\n ),\n trayStart: canSave && <GenerateTile onClick={() => generate(null)} />,\n onChooseLogo: canSave ? () => setDialog('logo') : undefined,\n onEditImage: (clipId) => {\n const clip = usePresentation.getState().clips.find((c) => c.id === clipId)\n if (clip) generate(clip.documentId)\n },\n onCropImage: setCropping,\n }\n return { editor, dialogs }\n}\n"]}