@opengeni/react 0.46.1 → 0.52.1

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 (341) hide show
  1. package/README.md +158 -14
  2. package/dist/artifacts-document.d.ts +3 -0
  3. package/dist/artifacts-document.js +17 -0
  4. package/dist/artifacts-document.js.map +1 -0
  5. package/dist/artifacts-presentation.d.ts +3 -0
  6. package/dist/artifacts-presentation.js +17 -0
  7. package/dist/artifacts-presentation.js.map +1 -0
  8. package/dist/artifacts-spreadsheet.d.ts +3 -0
  9. package/dist/artifacts-spreadsheet.js +17 -0
  10. package/dist/artifacts-spreadsheet.js.map +1 -0
  11. package/dist/artifacts.d.ts +2 -0
  12. package/dist/artifacts.js +170 -0
  13. package/dist/artifacts.js.map +1 -0
  14. package/dist/chunk-6BBWWOOU.js +82 -0
  15. package/dist/chunk-6BBWWOOU.js.map +1 -0
  16. package/dist/{chunk-HFO4ERGQ.js → chunk-724BW4TW.js} +586 -35
  17. package/dist/chunk-724BW4TW.js.map +1 -0
  18. package/dist/chunk-7I2KB3OK.js +3895 -0
  19. package/dist/chunk-7I2KB3OK.js.map +1 -0
  20. package/dist/chunk-7WCLAEFV.js +2828 -0
  21. package/dist/chunk-7WCLAEFV.js.map +1 -0
  22. package/dist/{chunk-U3CSCMWA.js → chunk-FK6VG4LL.js} +9 -13
  23. package/dist/chunk-FK6VG4LL.js.map +1 -0
  24. package/dist/{chunk-SRFUT2ZU.js → chunk-FWS3KC3Z.js} +120 -64
  25. package/dist/chunk-FWS3KC3Z.js.map +1 -0
  26. package/dist/{chunk-EKZH6IDG.js → chunk-HDBG7XGO.js} +62 -1
  27. package/dist/chunk-HDBG7XGO.js.map +1 -0
  28. package/dist/chunk-HUIKIDM5.js +2148 -0
  29. package/dist/chunk-HUIKIDM5.js.map +1 -0
  30. package/dist/{chunk-LGVMUIRV.js → chunk-JAGDUCZQ.js} +1053 -390
  31. package/dist/chunk-JAGDUCZQ.js.map +1 -0
  32. package/dist/{chunk-LWR4MXSS.js → chunk-JR3QFY6B.js} +420 -35
  33. package/dist/chunk-JR3QFY6B.js.map +1 -0
  34. package/dist/chunk-JVYQRRC4.js +53 -0
  35. package/dist/chunk-JVYQRRC4.js.map +1 -0
  36. package/dist/chunk-KCGXPP5V.js +157 -0
  37. package/dist/chunk-KCGXPP5V.js.map +1 -0
  38. package/dist/{chunk-EB67J347.js → chunk-KZ73RL76.js} +111 -31
  39. package/dist/chunk-KZ73RL76.js.map +1 -0
  40. package/dist/chunk-PEI6RANI.js +3234 -0
  41. package/dist/chunk-PEI6RANI.js.map +1 -0
  42. package/dist/{chunk-3PB7MIT6.js → chunk-ROIRTM37.js} +220 -72
  43. package/dist/chunk-ROIRTM37.js.map +1 -0
  44. package/dist/chunk-VZTQ73XT.js +86 -0
  45. package/dist/chunk-VZTQ73XT.js.map +1 -0
  46. package/dist/{chunk-VCBFUSUZ.js → chunk-WSK7G5LE.js} +72 -4
  47. package/dist/chunk-WSK7G5LE.js.map +1 -0
  48. package/dist/{chunk-FGZUCXZF.js → chunk-WYA65Y3F.js} +16 -16
  49. package/dist/chunk-WYA65Y3F.js.map +1 -0
  50. package/dist/{chunk-6EDV6YFE.js → chunk-X4S56Y2H.js} +147 -35
  51. package/dist/chunk-X4S56Y2H.js.map +1 -0
  52. package/dist/client.d.ts +7 -1
  53. package/dist/clipboard.d.ts +1 -0
  54. package/dist/clipboard.js +7 -0
  55. package/dist/clipboard.js.map +1 -0
  56. package/dist/commands/index.d.ts +3 -3
  57. package/dist/commands/registry.d.ts +1 -1
  58. package/dist/commands/types.d.ts +1 -1
  59. package/dist/components/approval-surface.d.ts +2 -2
  60. package/dist/components/artifacts/artifact-surface.d.ts +18 -0
  61. package/dist/components/artifacts/document-editor.d.ts +172 -0
  62. package/dist/components/artifacts/editable-artifact-ui.d.ts +13 -0
  63. package/dist/components/artifacts/editable-artifact-workbench.d.ts +49 -0
  64. package/dist/components/artifacts/editable-document.d.ts +24 -0
  65. package/dist/components/artifacts/editable-presentation.d.ts +24 -0
  66. package/dist/components/artifacts/editable-spreadsheet.d.ts +32 -0
  67. package/dist/components/artifacts/index.d.ts +8 -0
  68. package/dist/components/artifacts/presentation-editor.d.ts +297 -0
  69. package/dist/components/artifacts/spreadsheet-canvas.d.ts +120 -0
  70. package/dist/components/artifacts/spreadsheet-grid.d.ts +113 -0
  71. package/dist/components/browser-viewer.d.ts +29 -0
  72. package/dist/components/chat-composer.d.ts +13 -8
  73. package/dist/components/code-editor.d.ts +25 -3
  74. package/dist/components/command-palette.d.ts +2 -2
  75. package/dist/components/composer-transcription-control.d.ts +4 -2
  76. package/dist/components/composer.d.ts +29 -15
  77. package/dist/components/computer-viewer.d.ts +23 -0
  78. package/dist/components/copy-button.d.ts +2 -2
  79. package/dist/components/desktop-viewer.d.ts +25 -21
  80. package/dist/components/diff-view.d.ts +1 -1
  81. package/dist/components/enrollment-consent.d.ts +1 -1
  82. package/dist/components/enrollment-device-flow.d.ts +1 -1
  83. package/dist/components/file-browser.d.ts +2 -2
  84. package/dist/components/fleet-tile.d.ts +1 -1
  85. package/dist/components/generated-video-player.d.ts +10 -0
  86. package/dist/components/human-input-form.d.ts +1 -1
  87. package/dist/components/human-input-surface.d.ts +2 -2
  88. package/dist/components/interactive-workbench-viewers.d.ts +2 -0
  89. package/dist/components/machine-card.d.ts +2 -2
  90. package/dist/components/machine-dock-bar.d.ts +3 -3
  91. package/dist/components/machine-health-pill.d.ts +2 -2
  92. package/dist/components/machine-input-display.d.ts +1 -1
  93. package/dist/components/machine-metrics.d.ts +2 -2
  94. package/dist/components/machine-status-pill.d.ts +4 -4
  95. package/dist/components/machines/health.d.ts +1 -1
  96. package/dist/components/machines/machine-detail.d.ts +5 -3
  97. package/dist/components/machines/metric-history-chart.d.ts +1 -1
  98. package/dist/components/machines/metric-sparkline.d.ts +2 -2
  99. package/dist/components/machines/series.d.ts +2 -2
  100. package/dist/components/machines-dashboard.d.ts +5 -5
  101. package/dist/components/markdown.d.ts +1 -1
  102. package/dist/components/message-timeline.d.ts +22 -5
  103. package/dist/components/model-picker.d.ts +2 -2
  104. package/dist/components/model-policy-picker.d.ts +7 -7
  105. package/dist/components/pierre-diff.d.ts +1 -1
  106. package/dist/components/pierre-file.d.ts +1 -1
  107. package/dist/components/queue-draft-policy.d.ts +1 -1
  108. package/dist/components/queue-surface-implementation.d.ts +3 -3
  109. package/dist/components/queue-surface-state.d.ts +4 -4
  110. package/dist/components/queue-surface.d.ts +5 -5
  111. package/dist/components/sandbox-files.d.ts +5 -5
  112. package/dist/components/sandbox-terminal.d.ts +50 -4
  113. package/dist/components/sandbox-workspace.d.ts +30 -10
  114. package/dist/components/session-chrome.d.ts +4 -4
  115. package/dist/components/session-status.d.ts +2 -2
  116. package/dist/components/timeline-annotation-selection.d.ts +9 -0
  117. package/dist/components/timeline-annotations-dialog.d.ts +16 -0
  118. package/dist/components/timeline-annotations.d.ts +13 -0
  119. package/dist/components/tooltip.d.ts +4 -4
  120. package/dist/components/user-message-body.d.ts +2 -2
  121. package/dist/components/workbench-changes.d.ts +2 -2
  122. package/dist/components/workspace-dock.d.ts +3 -1
  123. package/dist/composer.d.ts +11 -11
  124. package/dist/composer.js +7 -7
  125. package/dist/hooks/internal.d.ts +7 -1
  126. package/dist/hooks/use-attached-browsers.d.ts +21 -0
  127. package/dist/hooks/use-available-models.d.ts +2 -2
  128. package/dist/hooks/use-billing-usage.d.ts +1 -1
  129. package/dist/hooks/use-browser-frame-stream.d.ts +28 -0
  130. package/dist/hooks/use-browser-identities.d.ts +26 -0
  131. package/dist/hooks/use-browser-session.d.ts +28 -0
  132. package/dist/hooks/use-browser-sessions.d.ts +32 -0
  133. package/dist/hooks/use-codex-accounts.d.ts +3 -3
  134. package/dist/hooks/use-composer.d.ts +36 -9
  135. package/dist/hooks/use-computer-frame-stream.d.ts +24 -0
  136. package/dist/hooks/use-computer-session.d.ts +28 -0
  137. package/dist/hooks/use-computer-sessions.d.ts +28 -0
  138. package/dist/hooks/use-desktop-stream.d.ts +1 -1
  139. package/dist/hooks/use-environments.d.ts +11 -5
  140. package/dist/hooks/use-file-attachments.d.ts +1 -1
  141. package/dist/hooks/use-goal.d.ts +2 -2
  142. package/dist/hooks/use-human-input.d.ts +2 -2
  143. package/dist/hooks/use-last-started-turn-policy.d.ts +2 -2
  144. package/dist/hooks/use-machine-chip.d.ts +2 -2
  145. package/dist/hooks/use-machines.d.ts +10 -3
  146. package/dist/hooks/use-packs.d.ts +7 -2
  147. package/dist/hooks/use-rigs.d.ts +1 -1
  148. package/dist/hooks/use-sandbox-files.d.ts +25 -4
  149. package/dist/hooks/use-sandbox-git.d.ts +13 -5
  150. package/dist/hooks/use-sandbox-terminal.d.ts +1 -1
  151. package/dist/hooks/use-scheduled-tasks.d.ts +1 -1
  152. package/dist/hooks/use-session-capabilities.d.ts +5 -4
  153. package/dist/hooks/use-session-control.d.ts +1 -1
  154. package/dist/hooks/use-session-events.d.ts +2 -2
  155. package/dist/hooks/use-session-lineage.d.ts +1 -1
  156. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  157. package/dist/hooks/use-session.d.ts +2 -2
  158. package/dist/hooks/use-slash-commands.d.ts +1 -1
  159. package/dist/hooks/use-terminal-stream.d.ts +8 -2
  160. package/dist/hooks/use-transcription.d.ts +2 -2
  161. package/dist/hooks/use-turn-queue.d.ts +2 -2
  162. package/dist/hooks/use-video-artifact-playback.d.ts +9 -0
  163. package/dist/hooks/use-voice-input.d.ts +6 -4
  164. package/dist/hooks/use-workspace-capture.d.ts +1 -1
  165. package/dist/hooks/use-workspace-edit.d.ts +1 -1
  166. package/dist/hooks/use-workspace-sessions.d.ts +1 -1
  167. package/dist/hooks/use-workspaces.d.ts +1 -1
  168. package/dist/index.d.ts +158 -154
  169. package/dist/index.js +1718 -908
  170. package/dist/index.js.map +1 -1
  171. package/dist/interaction.d.ts +23 -0
  172. package/dist/interaction.js +36 -0
  173. package/dist/interaction.js.map +1 -0
  174. package/dist/interactive-workbench-viewers-KHNOHWQE.js +13 -0
  175. package/dist/interactive-workbench-viewers-KHNOHWQE.js.map +1 -0
  176. package/dist/lib/composer-responsive-context.d.ts +9 -0
  177. package/dist/lib/relay-wire.d.ts +4 -0
  178. package/dist/lib/sandbox-liveness.d.ts +9 -0
  179. package/dist/lib/terminal-capability.d.ts +5 -0
  180. package/dist/lib/use-portal-token-style.d.ts +14 -3
  181. package/dist/lib/xterm-theme.d.ts +1 -1
  182. package/dist/machines.d.ts +30 -30
  183. package/dist/machines.js +3 -3
  184. package/dist/provider.d.ts +4 -4
  185. package/dist/{queue-surface-implementation-J4XJFKRW.js → queue-surface-implementation-2KVJTYXH.js} +117 -64
  186. package/dist/queue-surface-implementation-2KVJTYXH.js.map +1 -0
  187. package/dist/realtime/dropdown-menu.d.ts +8 -8
  188. package/dist/realtime/realtime-control.d.ts +15 -6
  189. package/dist/realtime.d.ts +4 -4
  190. package/dist/realtime.js +30 -33
  191. package/dist/realtime.js.map +1 -1
  192. package/dist/session-context.d.ts +19 -1
  193. package/dist/session-ui.d.ts +14 -14
  194. package/dist/session-ui.js +6 -5
  195. package/dist/session.d.ts +28 -28
  196. package/dist/session.js +5 -5
  197. package/dist/timeline/activity-rail.d.ts +6 -3
  198. package/dist/timeline/disclosure-context.d.ts +1 -1
  199. package/dist/timeline/fleet-decision-projection.d.ts +1 -1
  200. package/dist/timeline/fleet-decision-row.d.ts +3 -3
  201. package/dist/timeline/index.d.ts +19 -19
  202. package/dist/timeline/parsers.d.ts +6 -3
  203. package/dist/timeline/projection.d.ts +3 -3
  204. package/dist/timeline/registry.d.ts +10 -1
  205. package/dist/timeline/screenshot-lightbox.d.ts +2 -2
  206. package/dist/timeline/shared.d.ts +21 -10
  207. package/dist/timeline/tool-diff.d.ts +2 -2
  208. package/dist/timeline/tool-renderers.d.ts +1 -1
  209. package/dist/timeline/turn-summary.d.ts +3 -3
  210. package/dist/timeline/types.d.ts +42 -2
  211. package/dist/timeline-annotation-selection-3L7LHGG2.js +187 -0
  212. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +1 -0
  213. package/dist/timeline-annotations-dialog-U7EVLR75.js +196 -0
  214. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +1 -0
  215. package/dist/voice-recording-store.d.ts +8 -2
  216. package/package.json +52 -7
  217. package/src/artifacts-document.ts +31 -0
  218. package/src/artifacts-presentation.ts +36 -0
  219. package/src/artifacts-spreadsheet.ts +21 -0
  220. package/src/artifacts.ts +86 -0
  221. package/src/client.ts +90 -1
  222. package/src/clipboard.ts +2 -0
  223. package/src/components/artifacts/artifact-surface.tsx +93 -0
  224. package/src/components/artifacts/document-editor.tsx +2255 -0
  225. package/src/components/artifacts/editable-artifact-ui.tsx +89 -0
  226. package/src/components/artifacts/editable-artifact-workbench.tsx +203 -0
  227. package/src/components/artifacts/editable-document.tsx +657 -0
  228. package/src/components/artifacts/editable-presentation.tsx +1020 -0
  229. package/src/components/artifacts/editable-spreadsheet.tsx +733 -0
  230. package/src/components/artifacts/index.ts +99 -0
  231. package/src/components/artifacts/presentation-editor.tsx +3148 -0
  232. package/src/components/artifacts/spreadsheet-canvas.ts +799 -0
  233. package/src/components/artifacts/spreadsheet-grid.tsx +2129 -0
  234. package/src/components/browser-viewer.tsx +1592 -0
  235. package/src/components/chat-composer.tsx +25 -2
  236. package/src/components/code-editor.tsx +90 -31
  237. package/src/components/command-palette.tsx +1 -1
  238. package/src/components/composer-transcription-control.tsx +51 -22
  239. package/src/components/composer.tsx +49 -23
  240. package/src/components/computer-viewer.tsx +1139 -0
  241. package/src/components/copy-button.tsx +1 -1
  242. package/src/components/desktop-viewer.tsx +103 -75
  243. package/src/components/file-browser.tsx +39 -17
  244. package/src/components/generated-video-player.tsx +89 -0
  245. package/src/components/human-input-form.tsx +2 -2
  246. package/src/components/interactive-workbench-viewers.ts +2 -0
  247. package/src/components/machine-card.tsx +1 -1
  248. package/src/components/machine-input-display.ts +3 -0
  249. package/src/components/machines/machine-detail.tsx +39 -15
  250. package/src/components/machines-dashboard.tsx +7 -6
  251. package/src/components/message-timeline.tsx +327 -37
  252. package/src/components/model-picker.tsx +2 -2
  253. package/src/components/model-policy-picker.tsx +16 -15
  254. package/src/components/queue-surface-implementation.tsx +135 -75
  255. package/src/components/queue-surface-state.tsx +2 -2
  256. package/src/components/sandbox-files.tsx +142 -62
  257. package/src/components/sandbox-terminal.tsx +119 -35
  258. package/src/components/sandbox-workspace.tsx +394 -228
  259. package/src/components/session-chrome.tsx +67 -27
  260. package/src/components/timeline-annotation-selection.tsx +221 -0
  261. package/src/components/timeline-annotations-dialog.tsx +213 -0
  262. package/src/components/timeline-annotations.tsx +84 -0
  263. package/src/components/tooltip.tsx +13 -16
  264. package/src/components/user-message-body.tsx +1 -1
  265. package/src/components/workbench-changes.tsx +192 -35
  266. package/src/components/workspace-dock.tsx +13 -5
  267. package/src/composer.ts +3 -0
  268. package/src/hooks/internal.ts +132 -38
  269. package/src/hooks/use-attached-browsers.ts +152 -0
  270. package/src/hooks/use-browser-frame-stream.ts +316 -0
  271. package/src/hooks/use-browser-identities.ts +225 -0
  272. package/src/hooks/use-browser-session.ts +476 -0
  273. package/src/hooks/use-browser-sessions.ts +281 -0
  274. package/src/hooks/use-codex-accounts.ts +4 -4
  275. package/src/hooks/use-composer.ts +769 -24
  276. package/src/hooks/use-computer-frame-stream.ts +311 -0
  277. package/src/hooks/use-computer-session.ts +442 -0
  278. package/src/hooks/use-computer-sessions.ts +245 -0
  279. package/src/hooks/use-environments.ts +24 -5
  280. package/src/hooks/use-file-attachments.ts +70 -32
  281. package/src/hooks/use-goal.ts +17 -5
  282. package/src/hooks/use-machine-chip.ts +5 -3
  283. package/src/hooks/use-machines.ts +79 -3
  284. package/src/hooks/use-packs.ts +51 -0
  285. package/src/hooks/use-sandbox-files.ts +382 -88
  286. package/src/hooks/use-sandbox-git.ts +208 -46
  287. package/src/hooks/use-sandbox-terminal.ts +3 -2
  288. package/src/hooks/use-session-capabilities.ts +94 -70
  289. package/src/hooks/use-session-events.ts +18 -4
  290. package/src/hooks/use-terminal-stream.ts +102 -23
  291. package/src/hooks/use-transcription.ts +4 -14
  292. package/src/hooks/use-turn-queue.ts +17 -5
  293. package/src/hooks/use-video-artifact-playback.ts +28 -0
  294. package/src/hooks/use-voice-input.ts +163 -19
  295. package/src/hooks/use-windowed-sections.ts +9 -7
  296. package/src/hooks/use-workspace-edit.ts +2 -1
  297. package/src/index.ts +21 -6
  298. package/src/interaction.ts +71 -0
  299. package/src/lib/composer-responsive-context.ts +15 -0
  300. package/src/lib/relay-wire.ts +4 -0
  301. package/src/lib/sandbox-liveness.ts +11 -0
  302. package/src/lib/terminal-capability.ts +10 -0
  303. package/src/lib/use-portal-token-style.ts +60 -15
  304. package/src/provider.tsx +52 -7
  305. package/src/realtime/dropdown-menu.tsx +15 -19
  306. package/src/realtime/realtime-control.tsx +16 -5
  307. package/src/session-context.ts +90 -0
  308. package/src/timeline/activity-rail.tsx +31 -6
  309. package/src/timeline/index.ts +4 -1
  310. package/src/timeline/parsers.ts +46 -20
  311. package/src/timeline/projection.ts +233 -13
  312. package/src/timeline/registry.ts +19 -0
  313. package/src/timeline/screenshot-lightbox.tsx +30 -9
  314. package/src/timeline/shared.tsx +59 -11
  315. package/src/timeline/tool-renderers.tsx +421 -24
  316. package/src/timeline/turn-summary.tsx +2 -2
  317. package/src/timeline/types.ts +58 -2
  318. package/src/voice-recording-store.ts +15 -0
  319. package/styles/compiled.css +5298 -0
  320. package/styles/compiled.d.ts +2 -0
  321. package/styles/effective-tokens.css +27 -0
  322. package/styles/index.css +18 -0
  323. package/styles/responsive.css +208 -0
  324. package/styles/responsive.d.ts +2 -0
  325. package/styles/tokens.css +50 -17
  326. package/dist/chunk-3PB7MIT6.js.map +0 -1
  327. package/dist/chunk-6EDV6YFE.js.map +0 -1
  328. package/dist/chunk-EB67J347.js.map +0 -1
  329. package/dist/chunk-EKZH6IDG.js.map +0 -1
  330. package/dist/chunk-FGZUCXZF.js.map +0 -1
  331. package/dist/chunk-HFO4ERGQ.js.map +0 -1
  332. package/dist/chunk-JB5725BI.js +0 -48
  333. package/dist/chunk-JB5725BI.js.map +0 -1
  334. package/dist/chunk-LGVMUIRV.js.map +0 -1
  335. package/dist/chunk-LWR4MXSS.js.map +0 -1
  336. package/dist/chunk-SRFUT2ZU.js.map +0 -1
  337. package/dist/chunk-U3CSCMWA.js.map +0 -1
  338. package/dist/chunk-VCBFUSUZ.js.map +0 -1
  339. package/dist/fleet-decision-projection-SLNZMS42.js +0 -241
  340. package/dist/fleet-decision-projection-SLNZMS42.js.map +0 -1
  341. package/dist/queue-surface-implementation-J4XJFKRW.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/artifacts/presentation-editor.tsx","../src/components/artifacts/editable-presentation.tsx"],"sourcesContent":["import {\n ChevronLeftIcon,\n ChevronRightIcon,\n ExpandIcon,\n FilePlus2Icon,\n MinusIcon,\n PlusIcon,\n Trash2Icon,\n TypeIcon,\n} from \"lucide-react\";\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n Presentation,\n PresentationChart,\n PresentationElement,\n PresentationFill,\n PresentationGroup,\n PresentationGroupChild,\n PresentationImage,\n PresentationLine,\n PresentationPosition,\n PresentationShape,\n PresentationTable,\n PresentationTextStyle,\n Slide,\n} from \"@opengeni/artifact-tool/reference\";\n\nimport { cn } from \"../../lib/cn\";\nimport { ArtifactSurface } from \"./artifact-surface\";\n\nconst MIN_ZOOM = 0.2;\nconst MAX_ZOOM = 4;\nconst RAIL_ITEM_HEIGHT = 116;\nconst RAIL_OVERSCAN = 3;\nconst DEFAULT_RAIL_HEIGHT = 640;\nconst DEFAULT_VIEWPORT = { width: 960, height: 640 };\nconst SPATIAL_TILE = 256;\nconst MAX_SPATIAL_BUCKETS_PER_OBJECT = 1_024;\nconst CANVAS_OVERSCAN_PX = 96;\nconst MAX_CANVAS_EDGE = 8_192;\nconst MAX_CANVAS_PIXELS = 16_000_000;\nconst MAX_EDITOR_GEOMETRY = 1_000_000;\nconst MAX_TABLE_CELLS_PER_PAINT = 20_000;\nconst MAX_PROJECTION_SLIDES = 100_000;\nconst MAX_PROJECTION_ELEMENTS_PER_SLIDE = 100_000;\nconst MAX_PROJECTION_GROUP_DEPTH = 16;\nconst MAX_PROJECTION_TABLE_CELLS = 1_000_000;\nconst MAX_PROJECTION_TEXT = 1_000_000;\n\ntype PresentationObject = PresentationElement;\ntype PresentationObjectKind = \"shape\" | \"chart\" | \"image\" | \"table\" | \"group\";\n\ntype DisplayObject = {\n id: string;\n kind: PresentationObjectKind;\n object: PresentationObject;\n readOnly: boolean;\n};\n\nexport type PresentationCommit =\n | {\n kind: \"slide-insert\";\n slideId: string;\n index: number;\n revision?: string | number;\n }\n | {\n kind: \"slide-delete\";\n slideId: string;\n index: number;\n revision?: string | number;\n }\n | {\n kind: \"object-insert\";\n slideId: string;\n objectId: string;\n index: number;\n position: PresentationPosition;\n revision?: string | number;\n }\n | {\n kind: \"object-delete\";\n slideId: string;\n objectId: string;\n revision?: string | number;\n }\n | {\n kind: \"move\" | \"resize\";\n slideId: string;\n objectId: string;\n before: PresentationPosition;\n after: PresentationPosition;\n revision?: string | number;\n }\n | {\n kind: \"text\";\n slideId: string;\n objectId: string;\n before: string;\n after: string;\n revision?: string | number;\n };\n\nexport type PresentationCommitHandler =\n | ((commit: PresentationCommit) => void)\n | ((commit: PresentationCommit) => Promise<void>);\n\nexport type PresentationProjectionPosition = Readonly<{\n left: number;\n top: number;\n width: number;\n height: number;\n}>;\n\nexport type PresentationProjectionFill = string | Readonly<{ type?: \"solid\"; color: string }>;\n\nexport type PresentationProjectionLine = Readonly<{\n style?: \"solid\" | \"dash\" | \"dot\" | \"none\";\n fill?: PresentationProjectionFill;\n width?: number;\n}>;\n\nexport type PresentationProjectionTextStyle = Readonly<{\n fontFamily?: string;\n fontSize?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n color?: string;\n alignment?: \"left\" | \"center\" | \"right\" | \"justify\";\n verticalAlignment?: \"top\" | \"middle\" | \"bottom\";\n}>;\n\nexport type PresentationProjectionTextRun = Readonly<{\n text: string;\n style: PresentationProjectionTextStyle;\n language?: string | null;\n}>;\n\nexport type PresentationProjectionTextParagraph = Readonly<{\n runs: readonly PresentationProjectionTextRun[];\n alignment: \"left\" | \"center\" | \"right\" | \"justify\";\n}>;\n\nexport type PresentationProjectionRichText = Readonly<{\n paragraphs: readonly PresentationProjectionTextParagraph[];\n verticalAlignment: \"top\" | \"middle\" | \"bottom\";\n}>;\n\nexport type PresentationProjectionElementMetadata = Readonly<{\n nodeSource?: Readonly<{ kind: \"master\" | \"layout\" | \"slide\"; id: string }>;\n inherited?: boolean;\n parentId?: string | null;\n order?: number;\n /** Inherited master/layout nodes remain visible but cannot be edited in slide mode. */\n readOnly?: boolean;\n}>;\n\nexport type PresentationProjectionShape = Readonly<{\n kind: \"shape\";\n id: string;\n name: string;\n geometry: \"textbox\" | \"rect\" | \"roundRect\" | \"ellipse\" | \"triangle\" | \"rightArrow\" | \"line\";\n position: PresentationProjectionPosition;\n fill?: PresentationProjectionFill;\n line?: PresentationProjectionLine;\n rotation?: number;\n borderRadius?: number | string;\n text: string;\n textStyle?: PresentationProjectionTextStyle;\n richText?: PresentationProjectionRichText;\n}> &\n PresentationProjectionElementMetadata;\n\nexport type PresentationProjectionChartSeries = Readonly<{\n name: string;\n categories?: readonly string[];\n values: readonly number[];\n xValues?: readonly number[];\n bubbleSizes?: readonly number[];\n fill?: PresentationProjectionFill;\n line?: PresentationProjectionLine;\n}>;\n\nexport type PresentationProjectionChart = Readonly<{\n kind: \"chart\";\n id: string;\n name: string;\n type: \"bar\" | \"line\" | \"area\" | \"pie\" | \"doughnut\" | \"scatter\" | \"bubble\" | \"radar\";\n position: PresentationProjectionPosition;\n title?: string;\n titleRichText?: PresentationProjectionRichText;\n hasLegend?: boolean;\n series: readonly PresentationProjectionChartSeries[];\n xAxis?: Readonly<{ visible?: boolean; title?: string; min?: number; max?: number }>;\n yAxis?: Readonly<{ visible?: boolean; title?: string; min?: number; max?: number }>;\n dataLabels?: Readonly<{\n showValue?: boolean;\n showSeriesName?: boolean;\n showCategoryName?: boolean;\n showPercent?: boolean;\n position?: \"center\" | \"inEnd\" | \"outEnd\";\n }>;\n}> &\n PresentationProjectionElementMetadata;\n\nexport type PresentationProjectionImage = Readonly<{\n kind: \"image\";\n id: string;\n name: string;\n position: PresentationProjectionPosition;\n /** Host-resolved data/blob/same-origin URL. Arbitrary remote URLs are ignored. */\n source?: string;\n alt?: string;\n prompt?: string;\n fit?: \"contain\" | \"cover\";\n crop?: Readonly<{ left: number; top: number; right: number; bottom: number }>;\n geometry?: \"rect\" | \"roundRect\" | \"ellipse\";\n borderRadius?: number | string;\n rotation?: number;\n flipHorizontal?: boolean;\n flipVertical?: boolean;\n digest?: string;\n contentType?: string;\n intrinsicWidth?: number;\n intrinsicHeight?: number;\n}> &\n PresentationProjectionElementMetadata;\n\nexport type PresentationProjectionTableCell = Readonly<{\n text: string;\n richText?: PresentationProjectionRichText;\n fill?: PresentationProjectionFill;\n textStyle?: PresentationProjectionTextStyle;\n rowSpan?: number;\n colSpan?: number;\n}>;\n\nexport type PresentationProjectionTable = Readonly<{\n kind: \"table\";\n id: string;\n name: string;\n position: PresentationProjectionPosition;\n rows: readonly (readonly (PresentationProjectionTableCell | null)[])[];\n columnWidths?: readonly number[];\n rowHeights?: readonly number[];\n fill?: PresentationProjectionFill;\n line?: PresentationProjectionLine;\n textStyle?: PresentationProjectionTextStyle;\n}> &\n PresentationProjectionElementMetadata;\n\nexport type PresentationProjectionGroup = Readonly<{\n kind: \"group\";\n id: string;\n name: string;\n position: PresentationProjectionPosition;\n childOffset: Readonly<{ left: number; top: number }>;\n childExtent: Readonly<{ width: number; height: number }>;\n rotation?: number;\n flipHorizontal?: boolean;\n flipVertical?: boolean;\n children: readonly PresentationProjectionElement[];\n}> &\n PresentationProjectionElementMetadata;\n\nexport type PresentationProjectionConnector = Readonly<{\n kind: \"connector\";\n id: string;\n name: string;\n connectorKind: \"straight\" | \"elbow\" | \"curved\";\n position: PresentationProjectionPosition;\n start: Readonly<{ nodeId: string | null; x: number; y: number }>;\n end: Readonly<{ nodeId: string | null; x: number; y: number }>;\n line?: PresentationProjectionLine;\n}> &\n PresentationProjectionElementMetadata;\n\nexport type PresentationProjectionElement =\n | PresentationProjectionShape\n | PresentationProjectionChart\n | PresentationProjectionImage\n | PresentationProjectionTable\n | PresentationProjectionGroup\n | PresentationProjectionConnector;\n\nexport type PresentationSlideProjection = Readonly<{\n id: string;\n title?: string;\n background?: PresentationProjectionFill;\n elements: readonly PresentationProjectionElement[];\n layout?: Readonly<{\n id: string;\n name: string;\n masterId: string | null;\n background: PresentationProjectionFill;\n }> | null;\n notes?: PresentationProjectionRichText | null;\n}>;\n\n/** Immutable render/edit projection; the host keeps the canonical deck off the React thread. */\nexport type PresentationEditorProjection = Readonly<{\n revision: string | number;\n slideSize: Readonly<{ width: number; height: number }>;\n slides: readonly PresentationSlideProjection[];\n}>;\n\nexport type PresentationProjectionEditorProps = Omit<\n PresentationEditorProps,\n \"presentation\" | \"revision\" | \"onSlideChange\" | \"onSelectionChange\" | \"onCommit\"\n> & {\n projection: PresentationEditorProjection;\n commit?: PresentationCommitHandler | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n onSlideChange?: ((slide: PresentationSlideProjection, index: number) => void) | undefined;\n onSelectionChange?:\n | ((object: PresentationProjectionElement | null, slide: PresentationSlideProjection) => void)\n | undefined;\n};\n\nexport type PresentationProjectionArtifactSurfaceProps = PresentationProjectionEditorProps & {\n title?: string | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n busy?: boolean | undefined;\n};\n\nexport type PresentationEditorProps = {\n presentation: Presentation;\n /** Increment/change after a host applies an out-of-band model mutation. */\n revision?: string | number | undefined;\n activeSlideId?: string | undefined;\n defaultActiveSlideId?: string | undefined;\n selectedObjectId?: string | null | undefined;\n defaultSelectedObjectId?: string | null | undefined;\n zoom?: number | undefined;\n defaultZoom?: number | undefined;\n readOnly?: boolean | undefined;\n className?: string | undefined;\n onSlideChange?: ((slide: Slide, index: number) => void) | undefined;\n onSelectionChange?: ((object: PresentationObject | null, slide: Slide) => void) | undefined;\n onCommit?: PresentationCommitHandler | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n onZoomChange?: ((zoom: number) => void) | undefined;\n};\n\nexport type PresentationArtifactSurfaceProps = PresentationEditorProps & {\n title?: string | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n busy?: boolean | undefined;\n};\n\ntype ViewportMetrics = {\n scrollLeft: number;\n scrollTop: number;\n width: number;\n height: number;\n stageLeft: number;\n stageTop: number;\n};\n\ntype DragState = {\n pointerId: number;\n mode: \"move\" | \"resize\";\n object: PresentationObject;\n rotation: number;\n start: { x: number; y: number };\n before: PresentationPosition;\n};\n\ntype TextEdit = {\n slideId: string;\n shape: PresentationShape;\n before: string;\n};\n\ntype DraftPosition = {\n objectId: string;\n position: PresentationPosition;\n};\n\ntype SpatialIndex = {\n objects: DisplayObject[];\n bounds: PresentationPosition[];\n buckets: Map<string, number[]>;\n overflowObjects: number[];\n};\n\ntype CanvasImageEntry = {\n image: HTMLImageElement;\n ready: boolean;\n};\n\n/** Compatibility adapter for the public authoring model. */\nexport function PresentationEditor(props: PresentationEditorProps) {\n return <PresentationEditorCore {...props} />;\n}\n\n/**\n * Projection-first editor. It creates only a disposable render view; all\n * durable mutations leave through the async command port.\n */\nexport function PresentationProjectionEditor({\n projection,\n commit,\n onCommandError,\n onSlideChange,\n onSelectionChange,\n readOnly = false,\n ...props\n}: PresentationProjectionEditorProps) {\n const view = useMemo(() => presentationViewFromProjection(projection), [projection]);\n return (\n <PresentationEditorCore\n {...props}\n presentation={view.presentation}\n revision={projection.revision}\n readOnly={readOnly || !commit}\n onCommit={\n commit\n ? (command) => commit({ ...command, revision: projection.revision } as PresentationCommit)\n : undefined\n }\n onCommandError={onCommandError}\n onSlideChange={(slide, index) => {\n const projected = view.slideById.get(slide.id);\n if (projected) onSlideChange?.(projected, index);\n }}\n onSelectionChange={(object, slide) => {\n const projectedSlide = view.slideById.get(slide.id);\n if (!projectedSlide) return;\n onSelectionChange?.(\n object ? (view.elementById.get(object.id) ?? null) : null,\n projectedSlide,\n );\n }}\n />\n );\n}\n\nfunction PresentationEditorCore({\n presentation,\n revision,\n activeSlideId: controlledSlideId,\n defaultActiveSlideId,\n selectedObjectId: controlledSelectionId,\n defaultSelectedObjectId = null,\n zoom: controlledZoom,\n defaultZoom = 0.75,\n readOnly = false,\n className,\n onSlideChange,\n onSelectionChange,\n onCommit,\n onCommandError,\n onZoomChange,\n}: PresentationEditorProps) {\n const slides = presentation.slides.items;\n const firstSlideId = slides[0]?.id ?? null;\n const [localSlideId, setLocalSlideId] = useState(\n defaultActiveSlideId ?? controlledSlideId ?? firstSlideId,\n );\n const requestedSlideId = controlledSlideId ?? localSlideId;\n const activeSlide = slides.find((slide) => slide.id === requestedSlideId) ?? slides[0] ?? null;\n const activeIndex = activeSlide ? slides.indexOf(activeSlide) : -1;\n\n const [localSelectionId, setLocalSelectionId] = useState<string | null>(defaultSelectedObjectId);\n const selectedId = controlledSelectionId === undefined ? localSelectionId : controlledSelectionId;\n const [localZoom, setLocalZoom] = useState(() => clampZoom(defaultZoom));\n const zoom = clampZoom(controlledZoom ?? localZoom);\n const [fitMode, setFitMode] = useState(false);\n const [viewportMeasured, setViewportMeasured] = useState(false);\n const [modelEpoch, setModelEpoch] = useState(0);\n const [pendingCommands, setPendingCommands] = useState(0);\n const [commandFailure, setCommandFailure] = useState<{\n message: string;\n retry: () => void;\n } | null>(null);\n const [rail, setRail] = useState({\n scrollTop: 0,\n height: DEFAULT_RAIL_HEIGHT,\n });\n const [viewport, setViewport] = useState<ViewportMetrics>({\n scrollLeft: 0,\n scrollTop: 0,\n ...DEFAULT_VIEWPORT,\n stageLeft: 0,\n stageTop: 0,\n });\n const [draftPosition, setDraftPosition] = useState<DraftPosition | null>(null);\n const [textEdit, setTextEdit] = useState<TextEdit | null>(null);\n const [textDraft, setTextDraft] = useState(\"\");\n const [paintEpoch, setPaintEpoch] = useState(0);\n const railRef = useRef<HTMLDivElement>(null);\n const viewportRef = useRef<HTMLDivElement>(null);\n const stageRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const overlayRef = useRef<SVGSVGElement>(null);\n const editorRef = useRef<HTMLTextAreaElement>(null);\n const dragRef = useRef<DragState | null>(null);\n const textEditRef = useRef<TextEdit | null>(null);\n const imageCacheRef = useRef(new Map<string, CanvasImageEntry>());\n const mountedRef = useRef(true);\n const commandScopeRef = useRef(0);\n const commandVersionsRef = useRef(new Map<string, number>());\n const pendingSlideIdRef = useRef<string | null>(null);\n const pendingObjectIdRef = useRef<string | null>(null);\n const domId = useId().replaceAll(\":\", \"\");\n const selectionProxyId = `${domId}-presentation-selection`;\n const instructionsId = `${domId}-presentation-instructions`;\n\n const objects = useMemo(\n () => (activeSlide ? listSlideObjects(activeSlide) : []),\n // revision is a deliberate host invalidation token; modelEpoch covers local commits.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n [activeSlide, modelEpoch, revision],\n );\n const objectById = useMemo(\n () => new Map(objects.map((entry) => [entry.id, entry] as const)),\n [objects],\n );\n const objectIndexById = useMemo(\n () => new Map(objects.map((entry, index) => [entry.id, index] as const)),\n [objects],\n );\n const selected = selectedId ? (objectById.get(selectedId) ?? null) : null;\n const spatialIndex = useMemo(\n () => buildSpatialIndex(objects, presentation.slideSize),\n [objects, presentation.slideSize],\n );\n const effectiveSelectedPosition =\n selected && draftPosition?.objectId === selected.id\n ? draftPosition.position\n : selected\n ? copyPosition(selected.object.position)\n : null;\n\n useEffect(() => {\n const pendingSlideId = pendingSlideIdRef.current;\n if (\n pendingSlideId &&\n controlledSlideId === undefined &&\n slides.some((slide) => slide.id === pendingSlideId)\n ) {\n pendingSlideIdRef.current = null;\n setLocalSlideId(pendingSlideId);\n return;\n }\n if (\n activeSlide &&\n requestedSlideId !== activeSlide.id &&\n controlledSlideId === undefined &&\n pendingSlideId === null\n ) {\n setLocalSlideId(activeSlide.id);\n }\n }, [activeSlide, controlledSlideId, requestedSlideId, slides]);\n\n useEffect(() => {\n if (selectedId && !objectById.has(selectedId) && controlledSelectionId === undefined) {\n setLocalSelectionId(null);\n }\n }, [controlledSelectionId, objectById, selectedId]);\n\n useEffect(() => {\n const pendingObjectId = pendingObjectIdRef.current;\n if (pendingObjectId && controlledSelectionId === undefined && objectById.has(pendingObjectId)) {\n pendingObjectIdRef.current = null;\n setLocalSelectionId(pendingObjectId);\n }\n }, [controlledSelectionId, objectById]);\n\n useLayoutEffect(() => {\n const element = railRef.current;\n if (!element || typeof ResizeObserver === \"undefined\") return;\n const measure = () =>\n setRail((current) => ({\n scrollTop: element.scrollTop,\n height: element.clientHeight || current.height,\n }));\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n useLayoutEffect(() => {\n const element = viewportRef.current;\n if (!element) return;\n const measure = () => {\n const stage = stageRef.current;\n const measuredWidth = element.clientWidth;\n const measuredHeight = element.clientHeight;\n const next: ViewportMetrics = {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop,\n width: measuredWidth || DEFAULT_VIEWPORT.width,\n height: measuredHeight || DEFAULT_VIEWPORT.height,\n stageLeft: stage?.offsetLeft ?? 0,\n stageTop: stage?.offsetTop ?? 0,\n };\n setViewport((current) => (sameViewport(current, next) ? current : next));\n if (measuredWidth > 0 && measuredHeight > 0) setViewportMeasured(true);\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n if (stageRef.current) observer.observe(stageRef.current);\n return () => observer.disconnect();\n }, [activeSlide?.id, presentation.slideSize.height, presentation.slideSize.width, zoom]);\n\n useLayoutEffect(() => {\n const imageCache = imageCacheRef.current;\n return () => disposeCanvasImageCache(imageCache);\n }, [activeSlide]);\n\n useEffect(() => {\n const edit = textEditRef.current;\n const currentEntry = edit ? objectById.get(edit.shape.id) : null;\n if (\n edit &&\n activeSlide?.id === edit.slideId &&\n currentEntry?.kind === \"shape\" &&\n !currentEntry.readOnly &&\n (currentEntry.object as PresentationShape).geometry !== \"line\"\n ) {\n const rebound = {\n ...edit,\n shape: currentEntry.object as PresentationShape,\n };\n textEditRef.current = rebound;\n setTextEdit(rebound);\n } else {\n textEditRef.current = null;\n setTextEdit(null);\n }\n }, [activeSlide?.id, objectById]);\n\n useEffect(() => {\n dragRef.current = null;\n setDraftPosition(null);\n commandScopeRef.current += 1;\n commandVersionsRef.current.clear();\n setPendingCommands(0);\n setCommandFailure(null);\n }, [activeSlide?.id, revision]);\n\n useEffect(() => {\n const edit = textEditRef.current;\n if (edit && edit.shape.id !== selectedId) {\n textEditRef.current = null;\n setTextEdit(null);\n }\n const drag = dragRef.current;\n if (drag && drag.object.id !== selectedId) {\n dragRef.current = null;\n setDraftPosition(null);\n }\n }, [selectedId]);\n\n useEffect(() => {\n if (!readOnly) return;\n dragRef.current = null;\n setDraftPosition(null);\n textEditRef.current = null;\n setTextEdit(null);\n }, [readOnly]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n dragRef.current = null;\n textEditRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n const element = railRef.current;\n if (!element || activeIndex < 0) return;\n const top = activeIndex * RAIL_ITEM_HEIGHT;\n const bottom = top + RAIL_ITEM_HEIGHT;\n const height = element.clientHeight || rail.height;\n if (top >= element.scrollTop && bottom <= element.scrollTop + height) return;\n const nextTop = Math.max(0, top - height / 2);\n element.scrollTop = nextTop;\n setRail((current) => ({ ...current, scrollTop: nextTop }));\n }, [activeIndex, rail.height]);\n\n const visibleSlideRegion = useMemo<PresentationPosition>(() => {\n const slideWidth = presentation.slideSize.width;\n const slideHeight = presentation.slideSize.height;\n const stageWidth = slideWidth * zoom;\n const stageHeight = slideHeight * zoom;\n if (stageWidth <= viewport.width && stageHeight <= viewport.height) {\n return { left: 0, top: 0, width: slideWidth, height: slideHeight };\n }\n const overscan = CANVAS_OVERSCAN_PX / zoom;\n const visibleLeft = Math.max(0, (viewport.scrollLeft - viewport.stageLeft) / zoom);\n const visibleTop = Math.max(0, (viewport.scrollTop - viewport.stageTop) / zoom);\n const left = Math.max(0, visibleLeft - overscan);\n const top = Math.max(0, visibleTop - overscan);\n return {\n left,\n top,\n width: Math.max(0, Math.min(slideWidth - left, viewport.width / zoom + overscan * 2)),\n height: Math.max(0, Math.min(slideHeight - top, viewport.height / zoom + overscan * 2)),\n };\n }, [presentation.slideSize.height, presentation.slideSize.width, viewport, zoom]);\n\n const visibleObjectIndexes = useMemo(() => {\n if (!activeSlide) return [];\n if (\n visibleSlideRegion.left === 0 &&\n visibleSlideRegion.top === 0 &&\n visibleSlideRegion.width === presentation.slideSize.width &&\n visibleSlideRegion.height === presentation.slideSize.height\n ) {\n return objects.map((_, index) => index);\n }\n const visible = querySpatialIndex(spatialIndex, visibleSlideRegion);\n const selectedIndex = selectedId ? (objectIndexById.get(selectedId) ?? -1) : -1;\n if (selectedIndex >= 0 && !visible.includes(selectedIndex)) visible.push(selectedIndex);\n const draftIndex = draftPosition ? (objectIndexById.get(draftPosition.objectId) ?? -1) : -1;\n if (draftIndex >= 0 && !visible.includes(draftIndex)) visible.push(draftIndex);\n return visible.sort((a, b) => a - b);\n }, [\n activeSlide,\n objects,\n objectIndexById,\n presentation.slideSize,\n draftPosition,\n selectedId,\n spatialIndex,\n visibleSlideRegion,\n ]);\n\n useLayoutEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || !activeSlide) return;\n paintSlideCanvas({\n canvas,\n slide: activeSlide,\n slideSize: presentation.slideSize,\n zoom,\n objects,\n objectIndexes: visibleObjectIndexes,\n renderRegion: visibleSlideRegion,\n draftPosition,\n imageCache: imageCacheRef.current,\n requestRepaint: () => setPaintEpoch((value) => value + 1),\n });\n }, [\n activeSlide,\n draftPosition,\n objects,\n paintEpoch,\n presentation.slideSize,\n visibleObjectIndexes,\n visibleSlideRegion,\n zoom,\n ]);\n\n const selectObject = useCallback(\n (entry: DisplayObject | null) => {\n textEditRef.current = null;\n setTextEdit(null);\n setDraftPosition(null);\n if (controlledSelectionId === undefined) setLocalSelectionId(entry?.id ?? null);\n if (activeSlide) onSelectionChange?.(entry?.object ?? null, activeSlide);\n },\n [activeSlide, controlledSelectionId, onSelectionChange],\n );\n\n const selectSlide = useCallback(\n (slide: Slide, index: number) => {\n if (controlledSlideId === undefined) setLocalSlideId(slide.id);\n selectObject(null);\n onSlideChange?.(slide, index);\n },\n [controlledSlideId, onSlideChange, selectObject],\n );\n\n const changeZoom = useCallback(\n (next: number) => {\n const clamped = clampZoom(next);\n setFitMode(false);\n if (clamped === zoom) return;\n if (controlledZoom === undefined) setLocalZoom(clamped);\n onZoomChange?.(clamped);\n },\n [controlledZoom, onZoomChange, zoom],\n );\n\n const applyFittedZoom = useCallback(() => {\n const next = fittedPresentationZoom(viewport, presentation.slideSize);\n if (next === zoom) return;\n if (controlledZoom === undefined) setLocalZoom(next);\n onZoomChange?.(next);\n }, [controlledZoom, onZoomChange, presentation.slideSize, viewport, zoom]);\n\n const fitSlide = useCallback(() => {\n setFitMode(true);\n applyFittedZoom();\n }, [applyFittedZoom]);\n\n useLayoutEffect(() => {\n if (!viewportMeasured || controlledZoom !== undefined) return;\n const fitted = fittedPresentationZoom(viewport, presentation.slideSize);\n if (!fitMode && zoom <= fitted) return;\n if (!fitMode) setFitMode(true);\n applyFittedZoom();\n }, [\n applyFittedZoom,\n controlledZoom,\n fitMode,\n presentation.slideSize,\n viewport,\n viewportMeasured,\n zoom,\n ]);\n\n const runCommit = useCallback(\n (key: string, command: PresentationCommit, rollback: () => void, retry: () => void) => {\n if (!onCommit) return;\n const version = (commandVersionsRef.current.get(key) ?? 0) + 1;\n commandVersionsRef.current.set(key, version);\n const scope = commandScopeRef.current;\n setCommandFailure(null);\n let result: void | Promise<void>;\n try {\n result = onCommit(command);\n } catch (cause) {\n if (\n !mountedRef.current ||\n commandScopeRef.current !== scope ||\n commandVersionsRef.current.get(key) !== version\n ) {\n return;\n }\n rollback();\n const error = asPresentationError(cause);\n setCommandFailure({ message: error.message, retry });\n onCommandError?.(error);\n return;\n }\n if (!result || typeof result.then !== \"function\") return;\n setPendingCommands((current) => current + 1);\n void Promise.resolve(result).then(\n () => {\n if (!mountedRef.current || commandScopeRef.current !== scope) return;\n setPendingCommands((current) => Math.max(0, current - 1));\n },\n (cause) => {\n if (!mountedRef.current || commandScopeRef.current !== scope) return;\n setPendingCommands((current) => Math.max(0, current - 1));\n if (commandVersionsRef.current.get(key) !== version) return;\n rollback();\n const error = asPresentationError(cause);\n setCommandFailure({ message: error.message, retry });\n onCommandError?.(error);\n },\n );\n },\n [onCommandError, onCommit],\n );\n\n const commitPosition = useCallback(\n (entry: DisplayObject, kind: \"move\" | \"resize\", next: PresentationPosition) => {\n if (!activeSlide || readOnly || entry.readOnly) return;\n const before = copyPosition(entry.object.position);\n const after = normalizeEditorPosition(next);\n if (samePosition(before, after)) return;\n entry.object.position = after;\n setModelEpoch((value) => value + 1);\n const command: PresentationCommit = {\n kind,\n slideId: activeSlide.id,\n objectId: entry.id,\n before,\n after,\n };\n const submit = () =>\n runCommit(\n `position:${activeSlide.id}:${entry.id}`,\n command,\n () => {\n entry.object.position = before;\n setModelEpoch((value) => value + 1);\n },\n () => {\n entry.object.position = after;\n setModelEpoch((value) => value + 1);\n submit();\n },\n );\n submit();\n },\n [activeSlide, readOnly, runCommit],\n );\n\n const insertSlide = useCallback(() => {\n if (readOnly) return;\n const slideId = randomPresentationId();\n const index = activeIndex < 0 ? slides.length : activeIndex + 1;\n const command: PresentationCommit = { kind: \"slide-insert\", slideId, index };\n const submit = () => {\n pendingSlideIdRef.current = slideId;\n runCommit(\n `slide-insert:${slideId}`,\n command,\n () => {\n if (pendingSlideIdRef.current === slideId) pendingSlideIdRef.current = null;\n },\n submit,\n );\n };\n submit();\n }, [activeIndex, readOnly, runCommit, slides.length]);\n\n const deleteSlide = useCallback(() => {\n if (readOnly || !activeSlide) return;\n const command: PresentationCommit = {\n kind: \"slide-delete\",\n slideId: activeSlide.id,\n index: activeIndex,\n };\n const submit = () =>\n runCommit(`slide-delete:${activeSlide.id}`, command, () => undefined, submit);\n submit();\n }, [activeIndex, activeSlide, readOnly, runCommit]);\n\n const insertTextBox = useCallback(() => {\n if (readOnly || !activeSlide) return;\n const objectId = randomPresentationId();\n const position = nextTextBoxPosition(objects, presentation.slideSize);\n const command: PresentationCommit = {\n kind: \"object-insert\",\n slideId: activeSlide.id,\n objectId,\n index: activeSlide.elements.length,\n position,\n };\n const submit = () => {\n pendingObjectIdRef.current = objectId;\n runCommit(\n `object-insert:${activeSlide.id}:${objectId}`,\n command,\n () => {\n if (pendingObjectIdRef.current === objectId) pendingObjectIdRef.current = null;\n },\n submit,\n );\n };\n submit();\n }, [activeSlide, objects, presentation.slideSize, readOnly, runCommit]);\n\n const deleteObject = useCallback(() => {\n if (readOnly || !activeSlide || !selected || selected.readOnly) return;\n const command: PresentationCommit = {\n kind: \"object-delete\",\n slideId: activeSlide.id,\n objectId: selected.id,\n };\n const submit = () =>\n runCommit(`object-delete:${activeSlide.id}:${selected.id}`, command, () => undefined, submit);\n submit();\n }, [activeSlide, readOnly, runCommit, selected]);\n\n const startTextEdit = useCallback(\n (entry: DisplayObject | null) => {\n if (readOnly || !entry || entry.readOnly || entry.kind !== \"shape\") return;\n const shape = entry.object as PresentationShape;\n if (shape.geometry === \"line\") return;\n const before = shape.text.toString();\n if (!activeSlide) return;\n const edit = { slideId: activeSlide.id, shape, before };\n textEditRef.current = edit;\n setTextEdit(edit);\n setTextDraft(before);\n },\n [activeSlide, readOnly],\n );\n\n useEffect(() => {\n if (!textEdit) return;\n editorRef.current?.focus();\n editorRef.current?.select();\n }, [textEdit]);\n\n const finishTextEdit = useCallback(\n (cancel = false) => {\n const edit = textEditRef.current;\n if (!edit) return;\n textEditRef.current = null;\n setTextEdit(null);\n const { shape, before, slideId } = edit;\n if (!activeSlide || activeSlide.id !== slideId) return;\n if (cancel || readOnly || before === textDraft) return;\n shape.text.set(textDraft);\n setModelEpoch((value) => value + 1);\n const command: PresentationCommit = {\n kind: \"text\",\n slideId,\n objectId: shape.id,\n before,\n after: textDraft,\n };\n const submit = () =>\n runCommit(\n `text:${slideId}:${shape.id}`,\n command,\n () => {\n shape.text.set(before);\n setModelEpoch((value) => value + 1);\n },\n () => {\n shape.text.set(textDraft);\n setModelEpoch((value) => value + 1);\n submit();\n },\n );\n submit();\n },\n [activeSlide, readOnly, runCommit, textDraft],\n );\n\n const cycleObject = useCallback(\n (direction: -1 | 1) => {\n if (objects.length === 0) return;\n const current = selected ? objects.indexOf(selected) : direction === 1 ? -1 : 0;\n const next = (current + direction + objects.length) % objects.length;\n selectObject(objects[next] ?? null);\n },\n [objects, selectObject, selected],\n );\n\n const changeSlideBy = useCallback(\n (amount: -1 | 1) => {\n if (activeIndex < 0) return;\n const nextIndex = Math.max(0, Math.min(slides.length - 1, activeIndex + amount));\n const next = slides[nextIndex];\n if (next && next !== activeSlide) selectSlide(next, nextIndex);\n },\n [activeIndex, activeSlide, selectSlide, slides],\n );\n\n const handleCanvasKeyDown = useCallback(\n (event: ReactKeyboardEvent<SVGSVGElement>) => {\n if (event.metaKey || event.ctrlKey) {\n if (event.key === \"+\" || event.key === \"=\") {\n event.preventDefault();\n changeZoom(zoom * 1.15);\n } else if (event.key === \"-\") {\n event.preventDefault();\n changeZoom(zoom / 1.15);\n } else if (event.key === \"0\") {\n event.preventDefault();\n fitSlide();\n }\n return;\n }\n if (event.key === \"]\") {\n event.preventDefault();\n cycleObject(1);\n return;\n }\n if (event.key === \"[\") {\n event.preventDefault();\n cycleObject(-1);\n return;\n }\n if (event.key === \"PageDown\") {\n event.preventDefault();\n changeSlideBy(1);\n return;\n }\n if (event.key === \"PageUp\") {\n event.preventDefault();\n changeSlideBy(-1);\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n selectObject(null);\n return;\n }\n if (event.key === \"Enter\" || event.key === \"F2\") {\n if (selected?.kind === \"shape\") {\n event.preventDefault();\n startTextEdit(selected);\n }\n return;\n }\n if (!selected || !event.key.startsWith(\"Arrow\")) return;\n event.preventDefault();\n if (readOnly || selected.readOnly) return;\n const amount = event.shiftKey ? 10 : 1;\n const dx = event.key === \"ArrowLeft\" ? -amount : event.key === \"ArrowRight\" ? amount : 0;\n const dy = event.key === \"ArrowUp\" ? -amount : event.key === \"ArrowDown\" ? amount : 0;\n const before = selected.object.position;\n commitPosition(\n selected,\n event.altKey ? \"resize\" : \"move\",\n event.altKey\n ? {\n ...before,\n width: Math.max(8, before.width + dx),\n height: Math.max(8, before.height + dy),\n }\n : { ...before, left: before.left + dx, top: before.top + dy },\n );\n },\n [\n changeSlideBy,\n changeZoom,\n commitPosition,\n cycleObject,\n fitSlide,\n readOnly,\n selectObject,\n selected,\n startTextEdit,\n zoom,\n ],\n );\n\n const pointFromPointer = useCallback(\n (event: ReactPointerEvent<SVGElement>): { x: number; y: number } => {\n const rect =\n overlayRef.current?.getBoundingClientRect() ?? event.currentTarget.getBoundingClientRect();\n const width = rect.width || presentation.slideSize.width * zoom;\n const height = rect.height || presentation.slideSize.height * zoom;\n return {\n x: ((event.clientX - rect.left) / Math.max(1, width)) * presentation.slideSize.width,\n y: ((event.clientY - rect.top) / Math.max(1, height)) * presentation.slideSize.height,\n };\n },\n [presentation.slideSize.height, presentation.slideSize.width, zoom],\n );\n\n const beginDrag = useCallback(\n (event: ReactPointerEvent<SVGElement>, entry: DisplayObject, mode: \"move\" | \"resize\") => {\n event.preventDefault();\n event.stopPropagation();\n selectObject(entry);\n if (readOnly || entry.readOnly) return;\n const start = pointFromPointer(event);\n const before = copyPosition(entry.object.position);\n dragRef.current = {\n pointerId: event.pointerId,\n mode,\n object: entry.object,\n rotation: objectRotation(entry),\n start,\n before,\n };\n setDraftPosition({ objectId: entry.id, position: before });\n overlayRef.current?.setPointerCapture?.(event.pointerId);\n },\n [pointFromPointer, readOnly, selectObject],\n );\n\n const handlePointerDown = useCallback(\n (event: ReactPointerEvent<SVGSVGElement>) => {\n if (event.button !== 0) return;\n const point = pointFromPointer(event);\n const hit = hitTest(spatialIndex, point.x, point.y);\n if (!hit) {\n selectObject(null);\n return;\n }\n beginDrag(event, hit, \"move\");\n },\n [beginDrag, pointFromPointer, selectObject, spatialIndex],\n );\n\n const handlePointerMove = useCallback(\n (event: ReactPointerEvent<SVGSVGElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== event.pointerId) return;\n const point = pointFromPointer(event);\n setDraftPosition({ objectId: drag.object.id, position: positionFromDrag(drag, point) });\n },\n [pointFromPointer],\n );\n\n const finishDrag = useCallback(\n (event: ReactPointerEvent<SVGSVGElement>, cancel = false) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== event.pointerId) return;\n dragRef.current = null;\n const captureTarget = overlayRef.current;\n if (captureTarget?.hasPointerCapture?.(event.pointerId)) {\n captureTarget.releasePointerCapture(event.pointerId);\n }\n setDraftPosition(null);\n if (cancel) return;\n const entry = objectById.get(drag.object.id);\n if (!entry) return;\n const point = pointFromPointer(event);\n commitPosition(entry, drag.mode, positionFromDrag(drag, point));\n },\n [commitPosition, objectById, pointFromPointer],\n );\n\n const handleLostPointerCapture = useCallback((event: ReactPointerEvent<SVGSVGElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== event.pointerId) return;\n dragRef.current = null;\n setDraftPosition(null);\n }, []);\n\n const railStart = Math.max(0, Math.floor(rail.scrollTop / RAIL_ITEM_HEIGHT) - RAIL_OVERSCAN);\n const railEnd = Math.min(\n slides.length,\n Math.ceil((rail.scrollTop + rail.height) / RAIL_ITEM_HEIGHT) + RAIL_OVERSCAN,\n );\n const stageWidth = presentation.slideSize.width * zoom;\n const stageHeight = presentation.slideSize.height * zoom;\n\n return (\n <div\n className={cn(\"flex size-full min-w-0 flex-col bg-og-surface-1\", className)}\n style={{ minHeight: \"22rem\" }}\n data-og-presentation-editor\n data-og-painted-object-count={visibleObjectIndexes.length}\n data-og-command-state={commandFailure ? \"error\" : pendingCommands > 0 ? \"pending\" : \"idle\"}\n aria-busy={pendingCommands > 0 ? \"true\" : undefined}\n >\n <div\n role=\"toolbar\"\n aria-label=\"Presentation controls\"\n className=\"flex h-10 shrink-0 items-center border-b border-og-border bg-og-surface-2\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto px-2 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\">\n <button\n type=\"button\"\n aria-label=\"Previous slide\"\n disabled={activeIndex <= 0}\n onClick={() => changeSlideBy(-1)}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg disabled:opacity-35 [&>svg]:size-3.5\"\n >\n <ChevronLeftIcon />\n </button>\n <span className=\"min-w-16 shrink-0 text-center text-og-xs tabular-nums text-og-fg-muted\">\n {activeIndex >= 0 ? `${activeIndex + 1} / ${slides.length}` : `0 / ${slides.length}`}\n </span>\n <button\n type=\"button\"\n aria-label=\"Next slide\"\n disabled={activeIndex < 0 || activeIndex >= slides.length - 1}\n onClick={() => changeSlideBy(1)}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg disabled:opacity-35 [&>svg]:size-3.5\"\n >\n <ChevronRightIcon />\n </button>\n <button\n type=\"button\"\n aria-label=\"Add slide\"\n disabled={readOnly}\n onClick={insertSlide}\n className=\"ml-0.5 grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg disabled:opacity-35 [&>svg]:size-3.5\"\n >\n <FilePlus2Icon />\n </button>\n <button\n type=\"button\"\n aria-label=\"Delete slide\"\n disabled={readOnly || !activeSlide}\n onClick={deleteSlide}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-status-failed disabled:opacity-35 [&>svg]:size-3.5\"\n >\n <Trash2Icon />\n </button>\n <span className=\"mx-1 h-4 w-px shrink-0 bg-og-border\" />\n <button\n type=\"button\"\n aria-label=\"Zoom out\"\n onClick={() => changeZoom(zoom / 1.15)}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg [&>svg]:size-3.5\"\n >\n <MinusIcon />\n </button>\n <span className=\"min-w-11 shrink-0 text-center text-og-xs tabular-nums text-og-fg-muted\">\n {Math.round(zoom * 100)}%\n </span>\n <button\n type=\"button\"\n aria-label=\"Zoom in\"\n onClick={() => changeZoom(zoom * 1.15)}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg [&>svg]:size-3.5\"\n >\n <PlusIcon />\n </button>\n <button\n type=\"button\"\n aria-label=\"Fit slide\"\n onClick={fitSlide}\n className=\"ml-0.5 grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg [&>svg]:size-3.5\"\n >\n <ExpandIcon />\n </button>\n <span className=\"mx-1 h-4 w-px shrink-0 bg-og-border\" />\n <button\n type=\"button\"\n aria-label=\"Add text box\"\n disabled={readOnly || !activeSlide}\n onClick={insertTextBox}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg disabled:opacity-35 [&>svg]:size-3.5\"\n >\n <TypeIcon />\n </button>\n <button\n type=\"button\"\n aria-label=\"Delete selected object\"\n disabled={readOnly || !selected || selected.readOnly}\n onClick={deleteObject}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-status-failed disabled:opacity-35 [&>svg]:size-3.5\"\n >\n <Trash2Icon />\n </button>\n </div>\n <span\n className=\"hidden max-w-44 shrink-0 truncate border-l border-og-border px-2 text-og-xs text-og-fg-subtle sm:block\"\n title={\n commandFailure\n ? \"Change not saved\"\n : pendingCommands > 0\n ? \"Saving…\"\n : readOnly\n ? \"View only\"\n : selected\n ? `${objectLabel(selected)}${selected.readOnly ? \" · View only\" : \"\"}`\n : \"Select an object to edit\"\n }\n >\n {commandFailure\n ? \"Change not saved\"\n : pendingCommands > 0\n ? \"Saving…\"\n : readOnly\n ? \"View only\"\n : selected\n ? `${objectLabel(selected)}${selected.readOnly ? \" · View only\" : \"\"}`\n : \"Select an object to edit\"}\n </span>\n </div>\n\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {commandFailure?.message ?? (pendingCommands > 0 ? \"Saving presentation changes\" : \"\")}\n </div>\n\n <div className=\"flex min-h-0 min-w-0 flex-1\">\n <div\n ref={railRef}\n role=\"listbox\"\n tabIndex={0}\n aria-label=\"Slides\"\n aria-orientation=\"vertical\"\n aria-activedescendant={\n activeSlide && activeIndex >= railStart && activeIndex < railEnd\n ? `${domId}-slide-${safeDomId(activeSlide.id)}`\n : undefined\n }\n className=\"relative hidden w-40 shrink-0 overflow-y-auto border-r border-og-border bg-og-surface-2/70 outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent sm:block\"\n data-og-slide-rail\n data-og-window-start={railStart}\n data-og-window-end={railEnd}\n onScroll={(event) => {\n const scrollTop = event.currentTarget.scrollTop;\n const height = event.currentTarget.clientHeight;\n setRail((current) => ({\n scrollTop,\n height: height || current.height,\n }));\n }}\n onKeyDown={(event) => {\n if (slides.length === 0) return;\n let nextIndex: number | null = null;\n if (event.key === \"ArrowDown\") nextIndex = Math.min(slides.length - 1, activeIndex + 1);\n else if (event.key === \"ArrowUp\") nextIndex = Math.max(0, activeIndex - 1);\n else if (event.key === \"Home\") nextIndex = 0;\n else if (event.key === \"End\") nextIndex = slides.length - 1;\n if (nextIndex === null) return;\n event.preventDefault();\n const next = slides[nextIndex];\n if (next && next !== activeSlide) selectSlide(next, nextIndex);\n }}\n >\n <div className=\"relative w-full\" style={{ height: slides.length * RAIL_ITEM_HEIGHT }}>\n {slides.slice(railStart, railEnd).map((slide, offset) => {\n const index = railStart + offset;\n const active = slide === activeSlide;\n return (\n <button\n key={slide.id}\n id={`${domId}-slide-${safeDomId(slide.id)}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={active}\n aria-label={`Slide ${index + 1}${slide.title ? `: ${slide.title}` : \"\"}`}\n onClick={() => selectSlide(slide, index)}\n className={cn(\n \"absolute left-0 flex w-full items-start gap-2 px-2 py-2 text-left transition-colors\",\n active\n ? \"bg-og-surface-3 text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3/70\",\n )}\n style={{ top: index * RAIL_ITEM_HEIGHT, height: 116 }}\n data-og-slide-index={index}\n >\n <span className=\"w-5 shrink-0 pt-0.5 text-right text-og-xs tabular-nums text-og-fg-subtle\">\n {index + 1}\n </span>\n <span\n className={cn(\n \"block min-w-0 flex-1 overflow-hidden border bg-white shadow-og-sm\",\n active ? \"border-og-accent\" : \"border-og-border\",\n )}\n style={{ aspectRatio: \"16 / 9\", borderRadius: 3 }}\n >\n <SlideThumbnail\n slide={slide}\n width={presentation.slideSize.width}\n height={presentation.slideSize.height}\n paintRevision={`${String(revision ?? \"\")}:${modelEpoch}`}\n />\n </span>\n </button>\n );\n })}\n </div>\n </div>\n\n <div\n ref={viewportRef}\n className=\"relative min-h-0 min-w-0 flex-1 overflow-auto bg-og-surface-3/60 p-6\"\n onScroll={(event) => {\n const element = event.currentTarget;\n const width = element.clientWidth || viewport.width;\n const height = element.clientHeight || viewport.height;\n const next: ViewportMetrics = {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop,\n width,\n height,\n stageLeft: stageRef.current?.offsetLeft ?? 0,\n stageTop: stageRef.current?.offsetTop ?? 0,\n };\n setViewport((current) => (sameViewport(current, next) ? current : next));\n if (element.clientWidth > 0 && element.clientHeight > 0) setViewportMeasured(true);\n }}\n data-og-presentation-viewport\n >\n {commandFailure ? (\n <div\n role=\"alert\"\n className=\"absolute left-2 top-2 z-30 flex w-fit items-center gap-2 rounded-og-sm border border-og-status-failed/30 bg-og-surface-1/95 px-2 py-1 text-og-xs text-og-status-failed shadow-og-sm\"\n style={{ maxWidth: \"calc(100% - 1rem)\" }}\n >\n <span className=\"truncate\">{commandFailure.message}</span>\n <button\n type=\"button\"\n onClick={commandFailure.retry}\n className=\"shrink-0 rounded-og-xs px-1.5 py-0.5 font-medium outline-hidden hover:bg-og-surface-3 focus-visible:ring-2 focus-visible:ring-og-accent\"\n >\n Retry\n </button>\n </div>\n ) : null}\n {activeSlide ? (\n <div\n ref={stageRef}\n className=\"relative mx-auto shrink-0 overflow-hidden shadow-og-lg\"\n style={{ width: stageWidth, height: stageHeight, backgroundColor: \"#fff\" }}\n data-og-presentation-stage\n >\n <canvas\n ref={canvasRef}\n aria-hidden\n className=\"absolute inset-0 size-full\"\n style={{ width: stageWidth, height: stageHeight }}\n />\n <svg\n ref={overlayRef}\n role=\"application\"\n tabIndex={0}\n aria-label={`Slide ${activeIndex + 1} editor`}\n aria-describedby={\n selected ? `${instructionsId} ${selectionProxyId}` : instructionsId\n }\n aria-readonly={readOnly || selected?.readOnly || undefined}\n viewBox={`0 0 ${presentation.slideSize.width} ${presentation.slideSize.height}`}\n className=\"absolute inset-0 size-full touch-none outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent\"\n onKeyDown={handleCanvasKeyDown}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={(event) => finishDrag(event)}\n onPointerCancel={(event) => finishDrag(event, true)}\n onLostPointerCapture={handleLostPointerCapture}\n onDoubleClick={() => startTextEdit(selected)}\n >\n {selected && effectiveSelectedPosition ? (\n <g\n data-og-presentation-object={selected.id}\n transform={selectionTransform(selected, effectiveSelectedPosition)}\n >\n <rect\n x={effectiveSelectedPosition.left}\n y={effectiveSelectedPosition.top}\n width={effectiveSelectedPosition.width}\n height={effectiveSelectedPosition.height}\n fill=\"transparent\"\n stroke=\"var(--og-accent, #3b82f6)\"\n strokeWidth={2}\n vectorEffect=\"non-scaling-stroke\"\n pointerEvents=\"none\"\n />\n {!readOnly && !selected.readOnly ? (\n <circle\n cx={effectiveSelectedPosition.left + effectiveSelectedPosition.width}\n cy={effectiveSelectedPosition.top + effectiveSelectedPosition.height}\n r={6 / zoom}\n fill=\"var(--og-accent, #3b82f6)\"\n stroke=\"white\"\n strokeWidth={1.5}\n vectorEffect=\"non-scaling-stroke\"\n className=\"cursor-nwse-resize\"\n onPointerDown={(event) => beginDrag(event, selected, \"resize\")}\n />\n ) : null}\n </g>\n ) : null}\n </svg>\n\n {selected ? (\n <span id={selectionProxyId} role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {accessibleObjectLabel(selected)}\n </span>\n ) : null}\n\n <span id={instructionsId} className=\"sr-only\">\n Use bracket keys to select objects, arrows to move, Alt plus arrows to resize, Enter\n to edit text, and Page Up or Page Down to change slides.\n </span>\n\n {textEdit && selected?.id === textEdit.shape.id && effectiveSelectedPosition ? (\n <textarea\n ref={editorRef}\n aria-label={`Edit ${textEdit.shape.name}`}\n value={textDraft}\n maxLength={1_000_000}\n onChange={(event) => setTextDraft(event.currentTarget.value)}\n onInput={(event) => setTextDraft(event.currentTarget.value)}\n onBlur={() => finishTextEdit()}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n finishTextEdit(true);\n } else if (event.key === \"Enter\" && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n finishTextEdit();\n }\n }}\n className=\"absolute resize-none overflow-hidden border-2 border-og-accent p-1 outline-hidden\"\n style={{\n left: effectiveSelectedPosition.left * zoom,\n top: effectiveSelectedPosition.top * zoom,\n width: effectiveSelectedPosition.width * zoom,\n height: effectiveSelectedPosition.height * zoom,\n backgroundColor: \"#fffffff2\",\n color: resolveColor(textEdit.shape.text.style.color ?? \"slate-950\"),\n fontFamily: textEdit.shape.text.style.fontFamily ?? \"Arial, sans-serif\",\n fontSize: Math.max(8, (textEdit.shape.text.style.fontSize ?? 18) * zoom),\n fontWeight: textEdit.shape.text.style.bold ? 700 : 400,\n fontStyle: textEdit.shape.text.style.italic ? \"italic\" : \"normal\",\n textAlign: textEdit.shape.text.style.alignment ?? \"left\",\n transform:\n textEdit.shape.rotation === 0\n ? undefined\n : `rotate(${textEdit.shape.rotation}deg)`,\n transformOrigin: \"center\",\n }}\n />\n ) : null}\n </div>\n ) : (\n <div className=\"grid size-full min-h-72 place-items-center text-og-sm text-og-fg-muted\">\n This presentation has no slides.\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n/** Artifact chrome plus the editor, for drop-in SDK embedding. */\nexport function PresentationArtifactSurface({\n presentation,\n title = \"Presentation\",\n subtitle,\n actions,\n busy,\n className,\n ...editorProps\n}: PresentationArtifactSurfaceProps) {\n const count = presentation.slides.items.length;\n return (\n <ArtifactSurface\n modality=\"presentation\"\n title={title}\n subtitle={subtitle ?? `${count} slide${count === 1 ? \"\" : \"s\"}`}\n actions={actions}\n busy={busy}\n className={className}\n >\n <PresentationEditor {...editorProps} presentation={presentation} />\n </ArtifactSurface>\n );\n}\n\n/** Artifact chrome over the projection-first editor. */\nexport function PresentationProjectionArtifactSurface({\n projection,\n title = \"Presentation\",\n subtitle,\n actions,\n busy,\n className,\n ...editorProps\n}: PresentationProjectionArtifactSurfaceProps) {\n const count = projection.slides.length;\n return (\n <ArtifactSurface\n modality=\"presentation\"\n title={title}\n subtitle={subtitle ?? `${count} slide${count === 1 ? \"\" : \"s\"}`}\n actions={actions}\n busy={busy}\n className={className}\n >\n <PresentationProjectionEditor {...editorProps} projection={projection} />\n </ArtifactSurface>\n );\n}\n\nfunction SlideThumbnail({\n slide,\n width,\n height,\n paintRevision,\n}: {\n slide: Slide;\n width: number;\n height: number;\n paintRevision: string;\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const imageCacheRef = useRef(new Map<string, CanvasImageEntry>());\n const [paintEpoch, setPaintEpoch] = useState(0);\n useLayoutEffect(() => {\n const imageCache = imageCacheRef.current;\n return () => disposeCanvasImageCache(imageCache);\n }, []);\n useLayoutEffect(() => {\n const canvas = canvasRef.current;\n const context = canvas?.getContext(\"2d\");\n if (!canvas || !context) return;\n const displayWidth = 112;\n const scale = displayWidth / width;\n canvas.width = Math.max(1, Math.round(width * scale));\n canvas.height = Math.max(1, Math.round(height * scale));\n context.setTransform(scale, 0, 0, scale, 0, 0);\n context.fillStyle = resolveColor(slide.background.fill);\n context.fillRect(0, 0, width, height);\n const objects = listSlideObjects(slide);\n const usedImageSources = new Set<string>();\n for (const entry of objects) {\n drawObject(\n context,\n entry,\n entry.object.position,\n imageCacheRef.current,\n () => setPaintEpoch((value) => value + 1),\n { left: 0, top: 0, width, height },\n scale,\n usedImageSources,\n );\n }\n disposeUnusedCanvasImages(imageCacheRef.current, usedImageSources);\n }, [height, paintEpoch, paintRevision, slide, width]);\n return <canvas ref={canvasRef} aria-hidden className=\"block size-full\" />;\n}\n\ntype PresentationProjectionView = {\n presentation: Presentation;\n slideById: Map<string, PresentationSlideProjection>;\n elementById: Map<string, PresentationProjectionElement>;\n};\n\nfunction presentationViewFromProjection(\n projection: PresentationEditorProjection,\n): PresentationProjectionView {\n if (projection.slides.length > MAX_PROJECTION_SLIDES) {\n throw new Error(`Presentation projection exceeds ${MAX_PROJECTION_SLIDES} slides`);\n }\n const slideById = new Map<string, PresentationSlideProjection>();\n const elementById = new Map<string, PresentationProjectionElement>();\n const slideSize = {\n width: Math.min(MAX_EDITOR_GEOMETRY, Math.max(1, finite(projection.slideSize.width, 1))),\n height: Math.min(MAX_EDITOR_GEOMETRY, Math.max(1, finite(projection.slideSize.height, 1))),\n };\n const slides = projection.slides.map((slideProjection) => {\n if (slideProjection.elements.length > MAX_PROJECTION_ELEMENTS_PER_SLIDE) {\n throw new Error(\n `Slide ${slideProjection.id} exceeds ${MAX_PROJECTION_ELEMENTS_PER_SLIDE} projected objects`,\n );\n }\n slideById.set(slideProjection.id, slideProjection);\n const elements = slideProjection.elements.map((element) =>\n presentationElementView(element, elementById, 0),\n );\n return {\n id: slideProjection.id,\n title: boundedProjectionText(slideProjection.title ?? \"\"),\n background: { fill: cloneProjectionFill(slideProjection.background ?? \"white\") },\n elements,\n } as unknown as Slide;\n });\n return {\n presentation: {\n slideSize,\n slides: { items: slides },\n } as unknown as Presentation,\n slideById,\n elementById,\n };\n}\n\nfunction presentationElementView(\n element: PresentationProjectionElement,\n byId: Map<string, PresentationProjectionElement>,\n depth: number,\n): PresentationElement {\n if (depth > MAX_PROJECTION_GROUP_DEPTH) {\n throw new Error(`Presentation group depth exceeds ${MAX_PROJECTION_GROUP_DEPTH}`);\n }\n byId.set(element.id, element);\n const position = normalizeEditorPosition(element.position);\n switch (element.kind) {\n case \"shape\": {\n const text = mutableProjectionText(element.text, element.textStyle);\n return {\n id: element.id,\n name: boundedProjectionText(element.name),\n __projectionReadOnly: element.readOnly ?? false,\n geometry: element.geometry,\n position,\n fill: cloneProjectionFill(\n element.fill ?? (element.geometry === \"textbox\" ? \"none\" : \"white\"),\n ),\n line: cloneProjectionLine(element.line),\n rotation: finite(element.rotation ?? 0, 0),\n borderRadius: element.borderRadius,\n text,\n } as unknown as PresentationShape;\n }\n case \"chart\":\n return {\n id: element.id,\n name: boundedProjectionText(element.name),\n __projectionReadOnly: element.readOnly ?? false,\n type: element.type,\n position,\n title: boundedProjectionText(element.title ?? \"\"),\n series: {\n items: element.series.map((series) => ({\n name: boundedProjectionText(series.name),\n categories: (series.categories ?? []).map(boundedProjectionText),\n values: series.values.map((value) => finite(value, 0)),\n xValues: (series.xValues ?? []).map((value) => finite(value, 0)),\n bubbleSizes: (series.bubbleSizes ?? []).map((value) => finite(value, 0)),\n fill: series.fill ? cloneProjectionFill(series.fill) : undefined,\n line: cloneProjectionLine(series.line),\n })),\n },\n xAxis: element.xAxis ? { ...element.xAxis } : undefined,\n yAxis: element.yAxis ? { ...element.yAxis } : undefined,\n dataLabels: element.dataLabels ? { ...element.dataLabels } : undefined,\n } as unknown as PresentationChart;\n case \"image\": {\n const source = safeProjectionImageSource(element.source);\n return {\n id: element.id,\n name: boundedProjectionText(element.name),\n __projectionReadOnly: element.readOnly ?? false,\n position,\n alt: boundedProjectionText(element.alt ?? \"\"),\n prompt: element.prompt ? boundedProjectionText(element.prompt) : undefined,\n fit: element.fit ?? \"contain\",\n crop: element.crop ? { ...element.crop } : undefined,\n geometry: element.geometry ?? \"rect\",\n borderRadius: element.borderRadius,\n rotation: finite(element.rotation ?? 0, 0),\n flipHorizontal: element.flipHorizontal ?? false,\n flipVertical: element.flipVertical ?? false,\n sourceForSvg: () => source,\n } as unknown as PresentationImage;\n }\n case \"table\": {\n const columns = element.rows[0]?.length ?? 0;\n if (\n columns <= 0 ||\n element.rows.some((row) => row.length !== columns) ||\n element.rows.length * columns > MAX_PROJECTION_TABLE_CELLS\n ) {\n throw new Error(`Table ${element.id} has an invalid or oversized projected grid`);\n }\n return {\n id: element.id,\n name: boundedProjectionText(element.name),\n __projectionReadOnly: element.readOnly ?? false,\n position,\n rows: element.rows.map((row) =>\n row.map((cell) =>\n cell\n ? {\n text: mutableProjectionText(cell.text, cell.textStyle),\n fill: cloneProjectionFill(cell.fill ?? \"white\"),\n rowSpan: boundedSpan(cell.rowSpan),\n colSpan: boundedSpan(cell.colSpan),\n }\n : null,\n ),\n ),\n columnWidths: [...(element.columnWidths ?? [])],\n rowHeights: [...(element.rowHeights ?? [])],\n fill: cloneProjectionFill(element.fill ?? \"white\"),\n line: cloneProjectionLine(element.line),\n textStyle: { ...(element.textStyle ?? {}) },\n } as unknown as PresentationTable;\n }\n case \"group\":\n return {\n id: element.id,\n name: boundedProjectionText(element.name),\n __projectionReadOnly: element.readOnly ?? false,\n position,\n childOffset: {\n left: finite(element.childOffset.left, 0),\n top: finite(element.childOffset.top, 0),\n },\n childExtent: {\n width: Math.max(1, finite(element.childExtent.width, 1)),\n height: Math.max(1, finite(element.childExtent.height, 1)),\n },\n rotation: finite(element.rotation ?? 0, 0),\n flipHorizontal: element.flipHorizontal ?? false,\n flipVertical: element.flipVertical ?? false,\n children: element.children.map((child) => presentationElementView(child, byId, depth + 1)),\n } as unknown as PresentationGroup;\n case \"connector\":\n return {\n id: element.id,\n name: boundedProjectionText(element.name),\n __projectionReadOnly: element.readOnly ?? false,\n geometry: \"line\",\n position,\n fill: \"none\",\n line: cloneProjectionLine(element.line),\n rotation: 0,\n text: mutableProjectionText(\"\", undefined),\n } as unknown as PresentationShape;\n }\n}\n\nfunction mutableProjectionText(\n initial: string,\n style: PresentationProjectionTextStyle | undefined,\n): PresentationShape[\"text\"] {\n let value = boundedProjectionText(initial);\n return {\n style: { ...(style ?? {}) },\n set(next: string) {\n value = boundedProjectionText(next);\n },\n toString() {\n return value;\n },\n } as PresentationShape[\"text\"];\n}\n\nfunction cloneProjectionFill(fill: PresentationProjectionFill): PresentationFill {\n return typeof fill === \"string\" ? fill : { ...fill };\n}\n\nfunction cloneProjectionLine(line: PresentationProjectionLine | undefined): PresentationLine {\n return {\n style: line?.style ?? \"solid\",\n fill: line?.fill ? cloneProjectionFill(line.fill) : \"slate-900\",\n width: Math.max(0, finite(line?.width ?? 1, 1)),\n };\n}\n\nfunction boundedProjectionText(value: string): string {\n return value.slice(0, MAX_PROJECTION_TEXT);\n}\n\nfunction boundedSpan(value: number | undefined): number {\n return Math.max(1, Math.min(10_000, Math.floor(finite(value ?? 1, 1))));\n}\n\nfunction safeProjectionImageSource(source: string | undefined): string | undefined {\n if (!source || source.length > 64 * 1024 * 1024) return undefined;\n if (/^data:image\\/(?:png|jpeg|gif|webp);base64,/i.test(source) || source.startsWith(\"blob:\")) {\n return source;\n }\n try {\n const base = globalThis.location?.href;\n if (!base) return undefined;\n const url = new URL(source, base);\n return url.origin === globalThis.location.origin && /^https?:$/.test(url.protocol)\n ? url.href\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction asPresentationError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(\"Presentation change failed\");\n}\n\nfunction listSlideObjects(slide: Slide): DisplayObject[] {\n return slide.elements.map(displayObjectFromElement);\n}\n\nfunction displayObjectFromElement(\n object: PresentationElement | PresentationGroupChild,\n): DisplayObject {\n const readOnly =\n (object as PresentationElement & { __projectionReadOnly?: boolean }).__projectionReadOnly ===\n true;\n if (\"geometry\" in object && \"text\" in object)\n return { id: object.id, kind: \"shape\", object, readOnly };\n if (\"series\" in object) return { id: object.id, kind: \"chart\", object, readOnly };\n if (\"sourceForSvg\" in object) return { id: object.id, kind: \"image\", object, readOnly };\n if (\"rows\" in object) return { id: object.id, kind: \"table\", object, readOnly };\n return { id: object.id, kind: \"group\", object, readOnly };\n}\n\nfunction buildSpatialIndex(\n objects: DisplayObject[],\n slideSize: { width: number; height: number },\n): SpatialIndex {\n const buckets = new Map<string, number[]>();\n const overflowObjects: number[] = [];\n const bounds = objects.map(objectBounds);\n const maxX = Math.max(0, Math.ceil(slideSize.width / SPATIAL_TILE) - 1);\n const maxY = Math.max(0, Math.ceil(slideSize.height / SPATIAL_TILE) - 1);\n for (const [index, entry] of objects.entries()) {\n const objectBound = bounds[index] ?? entry.object.position;\n if (!intersects(objectBound, { left: 0, top: 0, ...slideSize })) continue;\n const left = Math.max(0, Math.floor(objectBound.left / SPATIAL_TILE));\n const top = Math.max(0, Math.floor(objectBound.top / SPATIAL_TILE));\n const right = Math.min(maxX, Math.floor((objectBound.left + objectBound.width) / SPATIAL_TILE));\n const bottom = Math.min(\n maxY,\n Math.floor((objectBound.top + objectBound.height) / SPATIAL_TILE),\n );\n const bucketCount = (right - left + 1) * (bottom - top + 1);\n if (!Number.isSafeInteger(bucketCount) || bucketCount > MAX_SPATIAL_BUCKETS_PER_OBJECT) {\n overflowObjects.push(index);\n continue;\n }\n for (let y = top; y <= bottom; y += 1) {\n for (let x = left; x <= right; x += 1) {\n const key = `${x}:${y}`;\n const bucket = buckets.get(key);\n if (bucket) bucket.push(index);\n else buckets.set(key, [index]);\n }\n }\n }\n return { objects, bounds, buckets, overflowObjects };\n}\n\nfunction querySpatialIndex(index: SpatialIndex, viewport: PresentationPosition): number[] {\n const seen = new Set<number>(index.overflowObjects);\n const left = Math.floor(viewport.left / SPATIAL_TILE);\n const top = Math.floor(viewport.top / SPATIAL_TILE);\n const right = Math.floor((viewport.left + viewport.width) / SPATIAL_TILE);\n const bottom = Math.floor((viewport.top + viewport.height) / SPATIAL_TILE);\n for (let y = top; y <= bottom; y += 1) {\n for (let x = left; x <= right; x += 1) {\n for (const objectIndex of index.buckets.get(`${x}:${y}`) ?? []) {\n if (intersects(index.bounds[objectIndex], viewport)) seen.add(objectIndex);\n }\n }\n }\n return [...seen]\n .filter((objectIndex) => {\n return !!index.objects[objectIndex] && intersects(index.bounds[objectIndex], viewport);\n })\n .sort((a, b) => a - b);\n}\n\nfunction paintSlideCanvas(options: {\n canvas: HTMLCanvasElement;\n slide: Slide;\n slideSize: { width: number; height: number };\n zoom: number;\n objects: DisplayObject[];\n objectIndexes: number[];\n renderRegion: PresentationPosition;\n draftPosition: DraftPosition | null;\n imageCache: Map<string, CanvasImageEntry>;\n requestRepaint: () => void;\n}): void {\n const { canvas, slide, slideSize, zoom } = options;\n const context = canvas.getContext(\"2d\");\n if (!context) return;\n const cssWidth = slideSize.width * zoom;\n const cssHeight = slideSize.height * zoom;\n const ratio = Math.max(\n 0.0001,\n Math.min(\n 2,\n Math.max(1, globalThis.devicePixelRatio || 1),\n MAX_CANVAS_EDGE / Math.max(1, cssWidth),\n MAX_CANVAS_EDGE / Math.max(1, cssHeight),\n Math.sqrt(MAX_CANVAS_PIXELS / Math.max(1, cssWidth * cssHeight)),\n ),\n );\n const pixelWidth = Math.max(1, Math.round(slideSize.width * zoom * ratio));\n const pixelHeight = Math.max(1, Math.round(slideSize.height * zoom * ratio));\n if (canvas.width !== pixelWidth) canvas.width = pixelWidth;\n if (canvas.height !== pixelHeight) canvas.height = pixelHeight;\n context.setTransform(zoom * ratio, 0, 0, zoom * ratio, 0, 0);\n context.clearRect(0, 0, slideSize.width, slideSize.height);\n context.fillStyle = resolveColor(slide.background.fill);\n context.fillRect(0, 0, slideSize.width, slideSize.height);\n const usedImageSources = new Set<string>();\n for (const index of options.objectIndexes) {\n const entry = options.objects[index];\n if (!entry) continue;\n const position =\n entry.id === options.draftPosition?.objectId\n ? options.draftPosition.position\n : entry.object.position;\n drawObject(\n context,\n entry,\n position,\n options.imageCache,\n options.requestRepaint,\n options.renderRegion,\n zoom * ratio,\n usedImageSources,\n );\n }\n disposeUnusedCanvasImages(options.imageCache, usedImageSources);\n}\n\nfunction drawObject(\n context: CanvasRenderingContext2D,\n entry: DisplayObject,\n position: PresentationPosition,\n imageCache: Map<string, CanvasImageEntry>,\n requestRepaint: () => void,\n renderRegion: PresentationPosition,\n pixelScale: number,\n usedImageSources: Set<string>,\n): void {\n switch (entry.kind) {\n case \"shape\":\n drawShape(context, entry.object as PresentationShape, position);\n return;\n case \"chart\":\n drawChart(context, entry.object as PresentationChart, position);\n return;\n case \"image\": {\n const source = drawImage(\n context,\n entry.object as PresentationImage,\n position,\n imageCache,\n requestRepaint,\n );\n if (source) usedImageSources.add(source);\n return;\n }\n case \"table\":\n drawTable(context, entry.object as PresentationTable, position, renderRegion, pixelScale);\n return;\n case \"group\":\n drawGroup(\n context,\n entry.object as PresentationGroup,\n position,\n imageCache,\n requestRepaint,\n renderRegion,\n pixelScale,\n usedImageSources,\n );\n }\n}\n\nfunction drawTable(\n context: CanvasRenderingContext2D,\n table: PresentationTable,\n position: PresentationPosition,\n renderRegion: PresentationPosition,\n pixelScale: number,\n): void {\n const rowCount = table.rows.length;\n const columnCount = table.rows[0]?.length ?? 0;\n if (rowCount === 0 || columnCount === 0 || !intersects(position, renderRegion)) return;\n const columnWidths = normalizeTableTracks(table.columnWidths, columnCount, position.width);\n const rowHeights = normalizeTableTracks(table.rowHeights, rowCount, position.height);\n const columnOffsets = cumulativeOffsets(columnWidths, position.left);\n const rowOffsets = cumulativeOffsets(rowHeights, position.top);\n const columnStart = visibleTrackStart(columnOffsets, renderRegion.left);\n const columnEnd = visibleTrackEnd(columnOffsets, renderRegion.left + renderRegion.width);\n const rowStart = visibleTrackStart(rowOffsets, renderRegion.top);\n const rowEnd = visibleTrackEnd(rowOffsets, renderRegion.top + renderRegion.height);\n const visibleCellCount = (rowEnd - rowStart) * (columnEnd - columnStart);\n if (visibleCellCount > MAX_TABLE_CELLS_PER_PAINT) {\n drawTableOverview(context, table, position, columnOffsets, rowOffsets, {\n columnStart,\n columnEnd,\n rowStart,\n rowEnd,\n });\n return;\n }\n context.save();\n for (let rowIndex = rowStart; rowIndex < rowEnd; rowIndex += 1) {\n const row = table.rows[rowIndex];\n if (!row) continue;\n for (let columnIndex = columnStart; columnIndex < columnEnd; columnIndex += 1) {\n const cell = row[columnIndex];\n if (!cell) continue;\n const rightIndex = Math.min(columnCount, columnIndex + cell.colSpan);\n const bottomIndex = Math.min(rowCount, rowIndex + cell.rowSpan);\n const left = columnOffsets[columnIndex] ?? position.left;\n const top = rowOffsets[rowIndex] ?? position.top;\n const right = columnOffsets[rightIndex] ?? position.left + position.width;\n const bottom = rowOffsets[bottomIndex] ?? position.top + position.height;\n const width = Math.max(1, right - left);\n const height = Math.max(1, bottom - top);\n context.beginPath();\n context.rect(left, top, width, height);\n applyFillAndLine(context, cell.fill, table.line, false);\n if (width * pixelScale >= 8 && height * pixelScale >= 8) {\n drawText(context, cell.text.toString(), cell.text.style, {\n left: left + 4,\n top: top + 2,\n width: Math.max(1, width - 8),\n height: Math.max(1, height - 4),\n });\n }\n }\n }\n context.restore();\n}\n\nfunction visibleTrackStart(offsets: readonly number[], value: number): number {\n return Math.max(0, Math.min(offsets.length - 2, lowerBound(offsets, value) - 1));\n}\n\nfunction visibleTrackEnd(offsets: readonly number[], value: number): number {\n return Math.max(0, Math.min(offsets.length - 1, lowerBound(offsets, value) + 1));\n}\n\nfunction lowerBound(values: readonly number[], target: number): number {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const middle = low + Math.floor((high - low) / 2);\n if ((values[middle] ?? Number.POSITIVE_INFINITY) < target) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\nfunction drawTableOverview(\n context: CanvasRenderingContext2D,\n table: PresentationTable,\n position: PresentationPosition,\n columnOffsets: readonly number[],\n rowOffsets: readonly number[],\n visible: { columnStart: number; columnEnd: number; rowStart: number; rowEnd: number },\n): void {\n context.save();\n context.beginPath();\n context.rect(position.left, position.top, position.width, position.height);\n applyFillAndLine(context, table.fill, table.line, false);\n const columnStep = Math.max(1, Math.ceil((visible.columnEnd - visible.columnStart) / 96));\n const rowStep = Math.max(1, Math.ceil((visible.rowEnd - visible.rowStart) / 96));\n context.beginPath();\n for (let index = visible.columnStart; index <= visible.columnEnd; index += columnStep) {\n const x = columnOffsets[index];\n if (x === undefined) continue;\n context.moveTo(x, position.top);\n context.lineTo(x, position.top + position.height);\n }\n for (let index = visible.rowStart; index <= visible.rowEnd; index += rowStep) {\n const y = rowOffsets[index];\n if (y === undefined) continue;\n context.moveTo(position.left, y);\n context.lineTo(position.left + position.width, y);\n }\n applyFillAndLine(context, \"none\", table.line, true);\n context.restore();\n}\n\nfunction normalizeTableTracks(values: readonly number[], count: number, total: number): number[] {\n if (values.length !== count) return Array.from({ length: count }, () => total / count);\n const sum = values.reduce((value, next) => value + next, 0);\n if (!Number.isFinite(sum) || sum <= 0) {\n return Array.from({ length: count }, () => total / count);\n }\n return values.map((value) => (value / sum) * total);\n}\n\nfunction cumulativeOffsets(tracks: readonly number[], start: number): number[] {\n const offsets = [start];\n for (const track of tracks) offsets.push((offsets.at(-1) ?? start) + track);\n return offsets;\n}\n\nfunction drawGroup(\n context: CanvasRenderingContext2D,\n group: PresentationGroup,\n position: PresentationPosition,\n imageCache: Map<string, CanvasImageEntry>,\n requestRepaint: () => void,\n renderRegion: PresentationPosition,\n pixelScale: number,\n usedImageSources: Set<string>,\n): void {\n const scaleX = position.width / group.childExtent.width;\n const scaleY = position.height / group.childExtent.height;\n const translatedX = position.left - group.childOffset.left * scaleX;\n const translatedY = position.top - group.childOffset.top * scaleY;\n const centerX = position.left + position.width / 2;\n const centerY = position.top + position.height / 2;\n context.save();\n context.translate(centerX, centerY);\n context.rotate((group.rotation * Math.PI) / 180);\n context.scale(group.flipHorizontal ? -1 : 1, group.flipVertical ? -1 : 1);\n context.translate(-centerX, -centerY);\n context.translate(translatedX, translatedY);\n context.scale(scaleX, scaleY);\n const childRenderRegion = inverseGroupRegion(group, position, renderRegion);\n for (const child of group.children) {\n const entry = displayObjectFromElement(child);\n if (!intersects(objectBounds(entry), childRenderRegion)) continue;\n drawObject(\n context,\n entry,\n child.position,\n imageCache,\n requestRepaint,\n childRenderRegion,\n pixelScale * Math.min(Math.abs(scaleX), Math.abs(scaleY)),\n usedImageSources,\n );\n }\n context.restore();\n}\n\nfunction inverseGroupRegion(\n group: PresentationGroup,\n position: PresentationPosition,\n region: PresentationPosition,\n): PresentationPosition {\n const scaleX = position.width / group.childExtent.width;\n const scaleY = position.height / group.childExtent.height;\n const translatedX = position.left - group.childOffset.left * scaleX;\n const translatedY = position.top - group.childOffset.top * scaleY;\n const centerX = position.left + position.width / 2;\n const centerY = position.top + position.height / 2;\n const radians = (-group.rotation * Math.PI) / 180;\n const cos = Math.cos(radians);\n const sin = Math.sin(radians);\n const points = [\n [region.left, region.top],\n [region.left + region.width, region.top],\n [region.left, region.top + region.height],\n [region.left + region.width, region.top + region.height],\n ].map(([x = 0, y = 0]) => {\n const dx = x - centerX;\n const dy = y - centerY;\n const rotatedX = dx * cos - dy * sin;\n const rotatedY = dx * sin + dy * cos;\n const unflippedX = rotatedX * (group.flipHorizontal ? -1 : 1) + centerX;\n const unflippedY = rotatedY * (group.flipVertical ? -1 : 1) + centerY;\n return {\n x: (unflippedX - translatedX) / scaleX,\n y: (unflippedY - translatedY) / scaleY,\n };\n });\n const xs = points.map((point) => point.x);\n const ys = points.map((point) => point.y);\n const left = Math.min(...xs);\n const right = Math.max(...xs);\n const top = Math.min(...ys);\n const bottom = Math.max(...ys);\n return { left, top, width: right - left, height: bottom - top };\n}\n\nfunction drawShape(\n context: CanvasRenderingContext2D,\n shape: PresentationShape,\n position: PresentationPosition,\n): void {\n context.save();\n context.translate(position.left + position.width / 2, position.top + position.height / 2);\n context.rotate((shape.rotation * Math.PI) / 180);\n const x = -position.width / 2;\n const y = -position.height / 2;\n context.beginPath();\n switch (shape.geometry) {\n case \"ellipse\":\n context.ellipse(0, 0, position.width / 2, position.height / 2, 0, 0, Math.PI * 2);\n break;\n case \"triangle\":\n context.moveTo(0, y);\n context.lineTo(x + position.width, y + position.height);\n context.lineTo(x, y + position.height);\n context.closePath();\n break;\n case \"rightArrow\": {\n const body = position.width * 0.65;\n context.moveTo(x, y + position.height * 0.25);\n context.lineTo(x + body, y + position.height * 0.25);\n context.lineTo(x + body, y);\n context.lineTo(x + position.width, 0);\n context.lineTo(x + body, y + position.height);\n context.lineTo(x + body, y + position.height * 0.75);\n context.lineTo(x, y + position.height * 0.75);\n context.closePath();\n break;\n }\n case \"line\":\n context.moveTo(x, y);\n context.lineTo(x + position.width, y + position.height);\n break;\n case \"roundRect\":\n roundedRect(\n context,\n x,\n y,\n position.width,\n position.height,\n resolveRadius(shape.borderRadius, position),\n );\n break;\n default:\n context.rect(x, y, position.width, position.height);\n }\n applyFillAndLine(context, shape.fill, shape.line, shape.geometry === \"line\");\n const text = shape.text.toString();\n if (text)\n drawText(context, text, shape.text.style, {\n left: x,\n top: y,\n width: position.width,\n height: position.height,\n });\n context.restore();\n}\n\nfunction drawChart(\n context: CanvasRenderingContext2D,\n chart: PresentationChart,\n position: PresentationPosition,\n): void {\n context.save();\n context.fillStyle = \"#ffffff\";\n context.strokeStyle = \"#e2e8f0\";\n context.lineWidth = 1;\n context.fillRect(position.left, position.top, position.width, position.height);\n context.strokeRect(position.left, position.top, position.width, position.height);\n if (chart.title) {\n drawText(\n context,\n chart.title,\n { fontSize: 18, bold: true, alignment: \"center\" },\n {\n left: position.left + 16,\n top: position.top + 8,\n width: Math.max(1, position.width - 32),\n height: 28,\n },\n );\n }\n const plot = {\n left: position.left + 36,\n top: position.top + (chart.title ? 46 : 20),\n width: Math.max(1, position.width - 56),\n height: Math.max(1, position.height - (chart.title ? 72 : 48)),\n };\n const values = chart.series.items.flatMap((series) => series.values).filter(Number.isFinite);\n const minValue = Math.min(0, chart.yAxis?.min ?? Math.min(...values, 0));\n const maxValue = Math.max(1, chart.yAxis?.max ?? Math.max(...values, 1));\n const valueRange = Math.max(Number.EPSILON, maxValue - minValue);\n const yForValue = (value: number) =>\n plot.top + plot.height - ((value - minValue) / valueRange) * plot.height;\n const palette = [\"#2563eb\", \"#0f766e\", \"#f59e0b\", \"#dc2626\", \"#7c3aed\"];\n if (chart.type === \"pie\" || chart.type === \"doughnut\") {\n const series = chart.series.items[0];\n const slices = series?.values.map((value) => Math.max(0, value)) ?? [];\n const total = slices.reduce((sum, value) => sum + value, 0);\n let angle = -Math.PI / 2;\n const radius = Math.min(plot.width, plot.height) * 0.42;\n const cx = plot.left + plot.width / 2;\n const cy = plot.top + plot.height / 2;\n slices.forEach((value, index) => {\n const next = angle + (total > 0 ? (value / total) * Math.PI * 2 : 0);\n context.beginPath();\n context.moveTo(cx, cy);\n context.arc(cx, cy, radius, angle, next);\n context.closePath();\n context.fillStyle = palette[index % palette.length] ?? \"#2563eb\";\n context.fill();\n angle = next;\n });\n if (chart.type === \"doughnut\") {\n context.beginPath();\n context.arc(cx, cy, radius * 0.55, 0, Math.PI * 2);\n context.fillStyle = \"#ffffff\";\n context.fill();\n }\n } else if (chart.type === \"line\" || chart.type === \"area\") {\n drawChartAxes(context, chart, plot, yForValue(0));\n chart.series.items.forEach((series, seriesIndex) => {\n if (series.values.length === 0) return;\n const points = series.values.map((value, index) => ({\n x: plot.left + (index / Math.max(1, series.values.length - 1)) * plot.width,\n y: yForValue(value),\n }));\n const color = resolveColor(\n series.line?.fill ?? series.fill ?? palette[seriesIndex % palette.length] ?? \"#2563eb\",\n );\n if (chart.type === \"area\") {\n context.beginPath();\n context.moveTo(points[0]?.x ?? plot.left, yForValue(0));\n for (const point of points) context.lineTo(point.x, point.y);\n context.lineTo(points.at(-1)?.x ?? plot.left + plot.width, yForValue(0));\n context.closePath();\n context.globalAlpha = 0.22;\n context.fillStyle = color;\n context.fill();\n context.globalAlpha = 1;\n }\n context.beginPath();\n points.forEach((point, index) => {\n if (index === 0) context.moveTo(point.x, point.y);\n else context.lineTo(point.x, point.y);\n });\n context.strokeStyle = color;\n context.lineWidth = series.line?.width ?? 3;\n context.stroke();\n for (const point of points) {\n context.beginPath();\n context.arc(point.x, point.y, 3, 0, Math.PI * 2);\n context.fillStyle = color;\n context.fill();\n }\n });\n } else if (chart.type === \"scatter\" || chart.type === \"bubble\") {\n drawChartAxes(context, chart, plot, yForValue(0));\n const xValues = chart.series.items.flatMap((series) =>\n series.values.map((_value, index) => series.xValues[index] ?? index),\n );\n const minX = chart.xAxis?.min ?? Math.min(...xValues, 0);\n const maxX = chart.xAxis?.max ?? Math.max(...xValues, 1);\n const xRange = Math.max(Number.EPSILON, maxX - minX);\n chart.series.items.forEach((series, seriesIndex) => {\n context.fillStyle = resolveColor(\n series.fill ?? palette[seriesIndex % palette.length] ?? \"#2563eb\",\n );\n series.values.forEach((value, index) => {\n const xValue = series.xValues[index] ?? index;\n const x = plot.left + ((xValue - minX) / xRange) * plot.width;\n const radius =\n chart.type === \"bubble\"\n ? Math.max(3, Math.sqrt(Math.max(0, series.bubbleSizes[index] ?? 9)))\n : 4;\n context.beginPath();\n context.arc(x, yForValue(value), radius, 0, Math.PI * 2);\n context.fill();\n });\n });\n } else if (chart.type === \"radar\") {\n drawRadarChart(context, chart, plot, palette);\n } else {\n drawChartAxes(context, chart, plot, yForValue(0));\n const count = Math.max(1, ...chart.series.items.map((series) => series.values.length));\n const groupWidth = plot.width / count;\n const barWidth = (groupWidth * 0.72) / Math.max(1, chart.series.items.length);\n const baseline = yForValue(0);\n chart.series.items.forEach((series, seriesIndex) => {\n series.values.forEach((value, valueIndex) => {\n const valueY = yForValue(value);\n const height = Math.abs(baseline - valueY);\n context.fillStyle = resolveColor(\n series.fill ?? palette[seriesIndex % palette.length] ?? \"#2563eb\",\n );\n const left =\n plot.left + valueIndex * groupWidth + groupWidth * 0.14 + seriesIndex * barWidth;\n context.fillRect(left, Math.min(baseline, valueY), Math.max(1, barWidth), height);\n if (chart.dataLabels?.showValue) {\n drawText(\n context,\n String(value),\n { fontSize: 11, alignment: \"center\" },\n {\n left,\n top: Math.max(plot.top, Math.min(baseline, valueY) - 14),\n width: Math.max(1, barWidth),\n height: 14,\n },\n );\n }\n });\n });\n }\n context.restore();\n}\n\nfunction drawChartAxes(\n context: CanvasRenderingContext2D,\n chart: PresentationChart,\n plot: PresentationPosition,\n baseline: number,\n): void {\n context.save();\n context.strokeStyle = \"#94a3b8\";\n context.lineWidth = 1;\n if (chart.xAxis?.visible !== false) {\n context.beginPath();\n context.moveTo(plot.left, Math.max(plot.top, Math.min(plot.top + plot.height, baseline)));\n context.lineTo(\n plot.left + plot.width,\n Math.max(plot.top, Math.min(plot.top + plot.height, baseline)),\n );\n context.stroke();\n }\n if (chart.yAxis?.visible !== false) {\n context.beginPath();\n context.moveTo(plot.left, plot.top);\n context.lineTo(plot.left, plot.top + plot.height);\n context.stroke();\n }\n context.restore();\n}\n\nfunction drawRadarChart(\n context: CanvasRenderingContext2D,\n chart: PresentationChart,\n plot: PresentationPosition,\n palette: readonly string[],\n): void {\n const count = Math.max(3, ...chart.series.items.map((series) => series.values.length));\n const maximum = Math.max(\n 1,\n ...chart.series.items.flatMap((series) => series.values.map((value) => Math.max(0, value))),\n );\n const centerX = plot.left + plot.width / 2;\n const centerY = plot.top + plot.height / 2;\n const radius = Math.min(plot.width, plot.height) * 0.42;\n const point = (index: number, value: number) => {\n const angle = -Math.PI / 2 + (index / count) * Math.PI * 2;\n const scaled = (Math.max(0, value) / maximum) * radius;\n return { x: centerX + Math.cos(angle) * scaled, y: centerY + Math.sin(angle) * scaled };\n };\n context.save();\n context.strokeStyle = \"#cbd5e1\";\n for (let ring = 1; ring <= 4; ring += 1) {\n context.beginPath();\n for (let index = 0; index < count; index += 1) {\n const next = point(index, (maximum * ring) / 4);\n if (index === 0) context.moveTo(next.x, next.y);\n else context.lineTo(next.x, next.y);\n }\n context.closePath();\n context.stroke();\n }\n chart.series.items.forEach((series, seriesIndex) => {\n const color = resolveColor(series.fill ?? palette[seriesIndex % palette.length] ?? \"#2563eb\");\n context.beginPath();\n for (let index = 0; index < count; index += 1) {\n const next = point(index, series.values[index] ?? 0);\n if (index === 0) context.moveTo(next.x, next.y);\n else context.lineTo(next.x, next.y);\n }\n context.closePath();\n context.globalAlpha = 0.18;\n context.fillStyle = color;\n context.fill();\n context.globalAlpha = 1;\n context.strokeStyle = color;\n context.lineWidth = series.line?.width ?? 2;\n context.stroke();\n });\n context.restore();\n}\n\nfunction drawImage(\n context: CanvasRenderingContext2D,\n image: PresentationImage,\n position: PresentationPosition,\n imageCache: Map<string, CanvasImageEntry>,\n requestRepaint: () => void,\n): string | undefined {\n context.save();\n applyImageTransform(context, image, position);\n imageClipPath(context, image, position);\n context.clip();\n context.fillStyle = \"#f1f5f9\";\n context.fillRect(position.left, position.top, position.width, position.height);\n const source = imageSourceForCanvas(image);\n if (source && typeof Image !== \"undefined\") {\n let cached = imageCache.get(source);\n if (!cached) {\n const element = new Image();\n cached = { image: element, ready: false };\n imageCache.set(source, cached);\n element.onload = () => {\n const current = imageCache.get(source);\n if (!current || current.image !== element) return;\n current.ready = true;\n requestRepaint();\n };\n element.onerror = () => {\n const current = imageCache.get(source);\n if (current?.image === element) current.ready = false;\n };\n element.src = source;\n }\n if (cached.ready && cached.image.naturalWidth > 0 && cached.image.naturalHeight > 0) {\n drawFittedImage(context, cached.image, image, position);\n context.restore();\n return source;\n }\n }\n context.strokeStyle = \"#94a3b8\";\n context.lineWidth = 1;\n context.setLineDash([8, 6]);\n imageClipPath(context, image, position);\n context.stroke();\n context.setLineDash([]);\n drawText(\n context,\n image.alt || image.prompt || \"Image\",\n { fontSize: 14, color: \"slate-600\" },\n {\n left: position.left + 12,\n top: position.top + 12,\n width: Math.max(1, position.width - 24),\n height: Math.max(1, position.height - 24),\n },\n );\n context.restore();\n return source;\n}\n\nfunction imageSourceForCanvas(image: PresentationImage): string | undefined {\n try {\n return image.sourceForSvg();\n } catch {\n return undefined;\n }\n}\n\nfunction applyImageTransform(\n context: CanvasRenderingContext2D,\n image: PresentationImage,\n position: PresentationPosition,\n): void {\n const centerX = position.left + position.width / 2;\n const centerY = position.top + position.height / 2;\n context.translate(centerX, centerY);\n context.rotate((image.rotation * Math.PI) / 180);\n context.scale(image.flipHorizontal ? -1 : 1, image.flipVertical ? -1 : 1);\n context.translate(-centerX, -centerY);\n}\n\nfunction imageClipPath(\n context: CanvasRenderingContext2D,\n image: PresentationImage,\n position: PresentationPosition,\n): void {\n context.beginPath();\n if (image.geometry === \"ellipse\") {\n context.ellipse(\n position.left + position.width / 2,\n position.top + position.height / 2,\n position.width / 2,\n position.height / 2,\n 0,\n 0,\n Math.PI * 2,\n );\n } else if (image.geometry === \"roundRect\") {\n roundedRect(\n context,\n position.left,\n position.top,\n position.width,\n position.height,\n resolveRadius(image.borderRadius, position),\n );\n } else {\n context.rect(position.left, position.top, position.width, position.height);\n }\n context.closePath();\n}\n\nfunction drawFittedImage(\n context: CanvasRenderingContext2D,\n source: HTMLImageElement,\n image: PresentationImage,\n position: PresentationPosition,\n): void {\n const crop = image.crop ?? { left: 0, top: 0, right: 0, bottom: 0 };\n const sourceX = source.naturalWidth * crop.left;\n const sourceY = source.naturalHeight * crop.top;\n const sourceWidth = source.naturalWidth * (1 - crop.left - crop.right);\n const sourceHeight = source.naturalHeight * (1 - crop.top - crop.bottom);\n if (sourceWidth <= 0 || sourceHeight <= 0) return;\n const scale =\n image.fit === \"cover\"\n ? Math.max(position.width / sourceWidth, position.height / sourceHeight)\n : Math.min(position.width / sourceWidth, position.height / sourceHeight);\n const width = sourceWidth * scale;\n const height = sourceHeight * scale;\n const left = position.left + (position.width - width) / 2;\n const top = position.top + (position.height - height) / 2;\n context.drawImage(source, sourceX, sourceY, sourceWidth, sourceHeight, left, top, width, height);\n}\n\nfunction disposeCanvasImageCache(cache: Map<string, CanvasImageEntry>): void {\n for (const entry of cache.values()) disposeCanvasImageEntry(entry);\n cache.clear();\n}\n\nfunction disposeUnusedCanvasImages(\n cache: Map<string, CanvasImageEntry>,\n usedSources: ReadonlySet<string>,\n): void {\n for (const [source, entry] of cache) {\n if (usedSources.has(source)) continue;\n disposeCanvasImageEntry(entry);\n cache.delete(source);\n }\n}\n\nfunction disposeCanvasImageEntry(entry: CanvasImageEntry): void {\n entry.image.onload = null;\n entry.image.onerror = null;\n entry.image.removeAttribute(\"src\");\n}\n\nfunction drawText(\n context: CanvasRenderingContext2D,\n text: string,\n style: PresentationTextStyle,\n position: PresentationPosition,\n): void {\n const fontSize = style.fontSize ?? 18;\n const fontStyle = style.italic ? \"italic \" : \"\";\n const fontWeight = style.bold ? \"700 \" : \"400 \";\n context.font = `${fontStyle}${fontWeight}${fontSize}px ${style.fontFamily ?? \"Arial, sans-serif\"}`;\n context.fillStyle = resolveColor(style.color ?? \"slate-950\");\n context.textAlign =\n style.alignment === \"center\" ? \"center\" : style.alignment === \"right\" ? \"right\" : \"left\";\n context.textBaseline = \"top\";\n const x =\n style.alignment === \"center\"\n ? position.left + position.width / 2\n : style.alignment === \"right\"\n ? position.left + position.width\n : position.left;\n const lineHeight = fontSize * 1.2;\n const lines = wrapCanvasText(context, text, position.width);\n const totalHeight = lines.length * lineHeight;\n const top =\n style.verticalAlignment === \"middle\"\n ? position.top + (position.height - totalHeight) / 2\n : style.verticalAlignment === \"bottom\"\n ? position.top + position.height - totalHeight\n : position.top;\n context.save();\n context.beginPath();\n context.rect(position.left, position.top, position.width, position.height);\n context.clip();\n lines.forEach((line, index) => context.fillText(line, x, top + index * lineHeight));\n context.restore();\n}\n\nfunction wrapCanvasText(context: CanvasRenderingContext2D, text: string, width: number): string[] {\n const result: string[] = [];\n for (const paragraph of text.split(\"\\n\")) {\n const words = paragraph.split(/\\s+/).filter(Boolean);\n if (words.length === 0) {\n result.push(\"\");\n continue;\n }\n let line = words[0] ?? \"\";\n for (let index = 1; index < words.length; index += 1) {\n const word = words[index] ?? \"\";\n const candidate = `${line} ${word}`;\n if (context.measureText(candidate).width <= width || line.length === 0) line = candidate;\n else {\n result.push(line);\n line = word;\n }\n }\n result.push(line);\n }\n return result;\n}\n\nfunction applyFillAndLine(\n context: CanvasRenderingContext2D,\n fill: PresentationFill,\n line: PresentationLine,\n lineOnly: boolean,\n): void {\n if (!lineOnly && resolveColor(fill) !== \"transparent\") {\n context.fillStyle = resolveColor(fill);\n context.fill();\n }\n if (\n line.style !== \"none\" &&\n resolveColor(line.fill ?? \"slate-900\") !== \"transparent\" &&\n (line.width ?? 1) > 0\n ) {\n context.strokeStyle = resolveColor(line.fill ?? \"slate-900\");\n context.lineWidth = line.width ?? 1;\n context.setLineDash(line.style === \"dash\" ? [8, 5] : line.style === \"dot\" ? [2, 4] : []);\n context.stroke();\n context.setLineDash([]);\n }\n}\n\nfunction roundedRect(\n context: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n): void {\n const r = Math.min(Math.max(0, radius), width / 2, height / 2);\n context.moveTo(x + r, y);\n context.lineTo(x + width - r, y);\n context.quadraticCurveTo(x + width, y, x + width, y + r);\n context.lineTo(x + width, y + height - r);\n context.quadraticCurveTo(x + width, y + height, x + width - r, y + height);\n context.lineTo(x + r, y + height);\n context.quadraticCurveTo(x, y + height, x, y + height - r);\n context.lineTo(x, y + r);\n context.quadraticCurveTo(x, y, x + r, y);\n context.closePath();\n}\n\nfunction hitTest(index: SpatialIndex, x: number, y: number): DisplayObject | null {\n const candidates = querySpatialIndex(index, { left: x, top: y, width: 0, height: 0 });\n for (let candidateIndex = candidates.length - 1; candidateIndex >= 0; candidateIndex -= 1) {\n const entry = index.objects[candidates[candidateIndex] ?? -1];\n if (entry && objectContainsPoint(entry, x, y)) return entry;\n }\n return null;\n}\n\nfunction objectContainsPoint(entry: DisplayObject, x: number, y: number): boolean {\n const position = entry.object.position;\n const rotation = objectRotation(entry);\n if (rotation === 0) {\n return (\n x >= position.left &&\n x <= position.left + position.width &&\n y >= position.top &&\n y <= position.top + position.height\n );\n }\n const centerX = position.left + position.width / 2;\n const centerY = position.top + position.height / 2;\n const radians = (-rotation * Math.PI) / 180;\n const dx = x - centerX;\n const dy = y - centerY;\n const localX = dx * Math.cos(radians) - dy * Math.sin(radians) + centerX;\n const localY = dx * Math.sin(radians) + dy * Math.cos(radians) + centerY;\n return (\n localX >= position.left &&\n localX <= position.left + position.width &&\n localY >= position.top &&\n localY <= position.top + position.height\n );\n}\n\nfunction objectBounds(entry: DisplayObject): PresentationPosition {\n const position = entry.object.position;\n const rotation = objectRotation(entry);\n if (rotation === 0) return position;\n const radians = (rotation * Math.PI) / 180;\n const width =\n Math.abs(position.width * Math.cos(radians)) + Math.abs(position.height * Math.sin(radians));\n const height =\n Math.abs(position.width * Math.sin(radians)) + Math.abs(position.height * Math.cos(radians));\n return {\n left: position.left + (position.width - width) / 2,\n top: position.top + (position.height - height) / 2,\n width,\n height,\n };\n}\n\nfunction objectRotation(entry: DisplayObject): number {\n if (entry.kind === \"shape\") return finite((entry.object as PresentationShape).rotation, 0);\n if (entry.kind === \"image\") return finite((entry.object as PresentationImage).rotation, 0);\n if (entry.kind === \"group\") return finite((entry.object as PresentationGroup).rotation, 0);\n return 0;\n}\n\nfunction objectLabel(entry: DisplayObject): string {\n const object = entry.object;\n if (entry.kind === \"shape\") {\n const shape = object as PresentationShape;\n return shape.text.toString().trim() || shape.name || \"Shape\";\n }\n if (entry.kind === \"chart\") return (object as PresentationChart).title || object.name || \"Chart\";\n if (entry.kind === \"image\") return (object as PresentationImage).alt || object.name || \"Image\";\n if (entry.kind === \"table\") return object.name || \"Table\";\n return object.name || \"Group\";\n}\n\nfunction accessibleObjectLabel(entry: DisplayObject): string {\n const position = entry.object.position;\n return `${objectLabel(entry)}. Position ${Math.round(position.left)}, ${Math.round(position.top)}. Size ${Math.round(position.width)} by ${Math.round(position.height)}.`;\n}\n\nfunction nextTextBoxPosition(\n objects: readonly DisplayObject[],\n slideSize: Readonly<{ width: number; height: number }>,\n): PresentationPosition {\n const width = slideSize.width * 0.6;\n const height = Math.max(48, slideSize.height * 0.16);\n const lefts = [0.2, 0.08, 0.32].map((ratio) =>\n Math.max(0, Math.min(slideSize.width - width, slideSize.width * ratio)),\n );\n const tops = [0.2, 0.42, 0.64, 0.06].map((ratio) =>\n Math.max(0, Math.min(slideSize.height - height, slideSize.height * ratio)),\n );\n const occupied = objects.map(objectBounds);\n let best: PresentationPosition | null = null;\n let bestOverlap = Number.POSITIVE_INFINITY;\n for (const left of lefts) {\n for (const top of tops) {\n const candidate = normalizeEditorPosition({ left, top, width, height });\n const overlap = occupied.reduce(\n (total, bounds) => total + intersectionArea(candidate, bounds),\n 0,\n );\n if (overlap < bestOverlap) {\n best = candidate;\n bestOverlap = overlap;\n if (overlap === 0) return candidate;\n }\n }\n }\n return best ?? normalizeEditorPosition({ left: 0, top: 0, width, height });\n}\n\nfunction intersectionArea(a: PresentationPosition, b: PresentationPosition): number {\n const width = Math.max(\n 0,\n Math.min(a.left + a.width, b.left + b.width) - Math.max(a.left, b.left),\n );\n const height = Math.max(0, Math.min(a.top + a.height, b.top + b.height) - Math.max(a.top, b.top));\n return width * height;\n}\n\nfunction normalizeEditorPosition(position: PresentationPosition): PresentationPosition {\n return {\n left: clampGeometry(finite(position.left, 0)),\n top: clampGeometry(finite(position.top, 0)),\n width: Math.min(MAX_EDITOR_GEOMETRY, Math.max(8, finite(position.width, 8))),\n height: Math.min(MAX_EDITOR_GEOMETRY, Math.max(8, finite(position.height, 8))),\n };\n}\n\nfunction clampGeometry(value: number): number {\n return Math.max(-MAX_EDITOR_GEOMETRY, Math.min(MAX_EDITOR_GEOMETRY, value));\n}\n\nfunction positionFromDrag(drag: DragState, point: { x: number; y: number }): PresentationPosition {\n const dx = point.x - drag.start.x;\n const dy = point.y - drag.start.y;\n const radians = (-drag.rotation * Math.PI) / 180;\n const resizeDx = dx * Math.cos(radians) - dy * Math.sin(radians);\n const resizeDy = dx * Math.sin(radians) + dy * Math.cos(radians);\n return normalizeEditorPosition(\n drag.mode === \"move\"\n ? {\n ...drag.before,\n left: drag.before.left + dx,\n top: drag.before.top + dy,\n }\n : {\n ...drag.before,\n width: Math.max(8, drag.before.width + resizeDx),\n height: Math.max(8, drag.before.height + resizeDy),\n },\n );\n}\n\nfunction selectionTransform(\n entry: DisplayObject,\n position: PresentationPosition,\n): string | undefined {\n const rotation = objectRotation(entry);\n if (rotation === 0) return undefined;\n const centerX = position.left + position.width / 2;\n const centerY = position.top + position.height / 2;\n return `rotate(${rotation} ${centerX} ${centerY})`;\n}\n\nfunction copyPosition(position: PresentationPosition): PresentationPosition {\n return {\n left: position.left,\n top: position.top,\n width: position.width,\n height: position.height,\n };\n}\n\nfunction samePosition(a: PresentationPosition, b: PresentationPosition): boolean {\n return a.left === b.left && a.top === b.top && a.width === b.width && a.height === b.height;\n}\n\nfunction sameViewport(a: ViewportMetrics, b: ViewportMetrics): boolean {\n return (\n a.scrollLeft === b.scrollLeft &&\n a.scrollTop === b.scrollTop &&\n a.width === b.width &&\n a.height === b.height &&\n a.stageLeft === b.stageLeft &&\n a.stageTop === b.stageTop\n );\n}\n\nfunction intersects(a: PresentationPosition | undefined, b: PresentationPosition): boolean {\n return (\n !!a &&\n a.left <= b.left + b.width &&\n a.left + a.width >= b.left &&\n a.top <= b.top + b.height &&\n a.top + a.height >= b.top\n );\n}\n\nfunction clampZoom(value: number): number {\n return Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, finite(value, 0.75)));\n}\n\nfunction fittedPresentationZoom(\n viewport: Pick<ViewportMetrics, \"width\" | \"height\">,\n slideSize: Readonly<{ width: number; height: number }>,\n): number {\n const horizontalRoom = Math.max(1, viewport.width - 48);\n const verticalRoom = Math.max(1, viewport.height - 48);\n return clampZoom(Math.min(horizontalRoom / slideSize.width, verticalRoom / slideSize.height));\n}\n\nfunction finite(value: number, fallback: number): number {\n return Number.isFinite(value) ? value : fallback;\n}\n\nfunction safeDomId(value: string): string {\n return value.replaceAll(/[^a-zA-Z0-9_-]/g, \"-\");\n}\n\nfunction randomPresentationId(): string {\n for (;;) {\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n if (bytes.some((byte) => byte !== 0)) {\n return [...bytes].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n }\n }\n}\n\nfunction resolveRadius(value: number | string | undefined, position: PresentationPosition): number {\n if (typeof value === \"number\") return value;\n const min = Math.min(position.width, position.height);\n const preset = value?.startsWith(\"rounded-\") ? value.slice(\"rounded-\".length) : undefined;\n if (preset === \"full\") return min / 2;\n if (preset === \"2xl\") return 16;\n if (preset === \"xl\") return 12;\n if (preset === \"lg\") return 8;\n return 6;\n}\n\nconst COLORS: Record<string, string> = {\n none: \"transparent\",\n transparent: \"transparent\",\n white: \"#ffffff\",\n black: \"#000000\",\n \"slate-50\": \"#f8fafc\",\n \"slate-100\": \"#f1f5f9\",\n \"slate-200\": \"#e2e8f0\",\n \"slate-300\": \"#cbd5e1\",\n \"slate-400\": \"#94a3b8\",\n \"slate-500\": \"#64748b\",\n \"slate-600\": \"#475569\",\n \"slate-700\": \"#334155\",\n \"slate-800\": \"#1e293b\",\n \"slate-900\": \"#0f172a\",\n \"slate-950\": \"#020617\",\n};\n\nfunction resolveColor(fill: PresentationFill): string {\n const value = typeof fill === \"string\" ? fill : fill.color;\n return COLORS[value] ?? value;\n}\n","import {\n PRESENTATION_ARTIFACT_COMMAND_VERSION,\n PRESENTATION_ARTIFACT_QUERY_MAX_NODES,\n PRESENTATION_ARTIFACT_QUERY_MAX_SLIDES,\n PRESENTATION_ARTIFACT_QUERY_MAX_TEXT_BYTES,\n PRESENTATION_ARTIFACT_QUERY_RESPONSE_MAX_BYTES,\n type EditableArtifactSession,\n type EditablePresentationEditorSlideProjection,\n type PresentationArtifactCommand,\n type PresentationArtifactEditorSceneNode,\n type PresentationArtifactFill,\n type PresentationArtifactLine,\n type PresentationArtifactNodeKind,\n type PresentationArtifactRichText,\n type PresentationArtifactSlideCatalogItem,\n type PresentationArtifactTextParagraph,\n type PresentationArtifactTextStyle,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { type ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport {\n PresentationProjectionArtifactSurface,\n type PresentationCommit,\n type PresentationCommitHandler,\n type PresentationEditorProjection,\n type PresentationProjectionArtifactSurfaceProps,\n type PresentationProjectionElement,\n type PresentationProjectionFill,\n type PresentationProjectionLine,\n type PresentationProjectionPosition,\n type PresentationProjectionRichText,\n type PresentationProjectionTextStyle,\n type PresentationSlideProjection,\n} from \"./presentation-editor\";\nimport { ArtifactSurface } from \"./artifact-surface\";\nimport {\n asEditableArtifactError,\n editableArtifactAccessRevoked,\n editableArtifactProjectionKey,\n editableArtifactStatusLabel,\n EditableArtifactMessage,\n useEditableArtifactView,\n} from \"./editable-artifact-ui\";\n\nconst EMU_PER_CSS_PIXEL = 9_525;\nconst PRESENTATION_CATALOG_PAGE = 128;\nconst PRESENTATION_MAX_INTERACTIVE_SLIDES = 256;\nconst PRESENTATION_MAX_INTERACTIVE_NODES = 16_384;\nconst PRESENTATION_MAX_INTERACTIVE_TEXT_BYTES = 4 * 1024 * 1024;\nconst PRESENTATION_MAX_CATALOG_PAGES = 32;\nconst PRESENTATION_SCENE_CONCURRENCY = 4;\nconst PRESENTATION_COMPOSITION_ATTEMPTS = 3;\nconst DEFAULT_PRESENTATION_TEXT_STYLE: PresentationArtifactTextStyle = Object.freeze({\n fontFamily: \"Arial\",\n fontSizeCentipoints: 1_800,\n color: 0x000000ff,\n bold: false,\n italic: false,\n underline: false,\n language: null,\n});\n\nexport type EditablePresentationArtifactSurfaceProps = Omit<\n PresentationProjectionArtifactSurfaceProps,\n \"projection\" | \"commit\" | \"readOnly\" | \"busy\" | \"subtitle\"\n> & {\n session: EditableArtifactSession;\n subtitle?: ReactNode | undefined;\n readOnly?: boolean | undefined;\n /** Called only after the durable SDK command has been accepted locally. */\n onCommit?: PresentationCommitHandler | undefined;\n};\n\nexport type ComposedPresentationProjection = Readonly<{\n projection: PresentationEditorProjection;\n sceneNodes: ReadonlyMap<string, PresentationArtifactEditorSceneNode>;\n}>;\n\ntype PresentationProjectionState = {\n composed: ComposedPresentationProjection | null;\n loading: boolean;\n error: Error | null;\n};\n\n/**\n * Durable presentation editor over the public SDK. The Worker owns canonical\n * state; React only receives bounded catalog and per-slide editor projections.\n */\nexport function EditablePresentationArtifactSurface({\n session,\n title = \"Presentation\",\n subtitle,\n readOnly = false,\n onCommit,\n onCommandError,\n ...surfaceProps\n}: EditablePresentationArtifactSurfaceProps) {\n const view = useEditableArtifactView(session);\n const invalidator = editableArtifactProjectionKey(view);\n const [retryEpoch, setRetryEpoch] = useState(0);\n const [state, setState] = useState<PresentationProjectionState>({\n composed: null,\n loading: true,\n error: null,\n });\n const loadGeneration = useRef(0);\n const sceneNodes = useRef(new Map<string, PresentationArtifactEditorSceneNode>());\n\n useEffect(() => {\n const generation = ++loadGeneration.current;\n let cancelled = false;\n setState((current) => ({ ...current, loading: true, error: null }));\n void composePresentationEditorProjection(session).then(\n (composed) => {\n if (cancelled || generation !== loadGeneration.current) return;\n sceneNodes.current = new Map(composed.sceneNodes);\n setState({ composed, loading: false, error: null });\n },\n (cause) => {\n if (cancelled || generation !== loadGeneration.current) return;\n setState({\n composed: null,\n loading: false,\n error: asEditableArtifactError(cause, \"Could not open this presentation\"),\n });\n },\n );\n return () => {\n cancelled = true;\n };\n }, [invalidator, retryEpoch, session]);\n\n const refresh = useCallback(() => setRetryEpoch((value) => value + 1), []);\n const writable = !readOnly && view.writable;\n const applyCommit = useCallback(\n async (commit: PresentationCommit) => {\n const composed = state.composed;\n if (!composed) throw new Error(\"Presentation projection is not ready\");\n if (!writable) throw new Error(\"This presentation is read only\");\n if (\n commit.revision !== undefined &&\n String(commit.revision) !== String(composed.projection.revision)\n ) {\n throw new Error(\"The presentation changed; retry this edit on the latest version\");\n }\n\n if (commit.kind === \"slide-insert\") {\n await session.createPresentationSlide({\n slideId: commit.slideId,\n index: commit.index,\n });\n notifyPresentationCommit(onCommit, onCommandError, commit);\n refresh();\n return;\n }\n if (commit.kind === \"slide-delete\") {\n await session.applyPresentationCommands({\n version: PRESENTATION_ARTIFACT_COMMAND_VERSION,\n commands: [{ kind: \"slide.delete\", id: commit.slideId }],\n });\n notifyPresentationCommit(onCommit, onCommandError, commit);\n refresh();\n return;\n }\n if (commit.kind === \"object-insert\") {\n await session.applyPresentationCommands({\n version: PRESENTATION_ARTIFACT_COMMAND_VERSION,\n commands: [\n {\n kind: \"node.insert\",\n owner: { kind: \"slide\", id: commit.slideId },\n parentId: null,\n index: commit.index,\n node: {\n id: commit.objectId,\n name: \"Text box\",\n bounds: {\n x: canonicalCoordinate(commit.position.left),\n y: canonicalCoordinate(commit.position.top),\n width: Math.max(1, canonicalCoordinate(commit.position.width)),\n height: Math.max(1, canonicalCoordinate(commit.position.height)),\n },\n transform: { rotation: 0, flipHorizontal: false, flipVertical: false },\n content: {\n kind: \"shape\",\n geometry: \"text-box\",\n fill: { kind: \"none\" },\n line: { fill: { kind: \"none\" }, width: 0, dash: \"solid\" },\n text: emptyPresentationText(),\n placeholder: null,\n },\n },\n },\n ],\n });\n notifyPresentationCommit(onCommit, onCommandError, commit);\n refresh();\n return;\n }\n if (commit.kind === \"object-delete\") {\n await session.applyPresentationCommands({\n version: PRESENTATION_ARTIFACT_COMMAND_VERSION,\n commands: [{ kind: \"node.delete\", id: commit.objectId }],\n });\n notifyPresentationCommit(onCommit, onCommandError, commit);\n refresh();\n return;\n }\n\n const key = sceneNodeKey(commit.slideId, commit.objectId);\n const node = sceneNodes.current.get(key);\n if (!node) throw new Error(\"The edited presentation object is no longer available\");\n if (node.inherited || node.source.kind !== \"slide\" || node.source.id !== commit.slideId) {\n throw new Error(\"Inherited master and layout objects are view only in the slide editor\");\n }\n\n let command: PresentationArtifactCommand;\n let nextNode: PresentationArtifactEditorSceneNode;\n if (commit.kind === \"text\") {\n if (node.content.kind !== \"shape\" || node.content.text === null) {\n throw new Error(\"This presentation object does not contain editable text\");\n }\n if (flattenPresentationRichText(node.content.text) !== commit.before) {\n throw new Error(\"The presentation text changed; retry this edit\");\n }\n const text = replacePresentationRichText(node.content.text, commit.before, commit.after);\n const content: PresentationArtifactNodeKind = Object.freeze({ ...node.content, text });\n command = { kind: \"node.content.set\", id: node.id, content };\n nextNode = Object.freeze({ ...node, content });\n } else {\n const current = normalizeProjectedEditorPosition(projectPosition(node.bounds));\n if (!sameProjectedPosition(current, commit.before)) {\n throw new Error(\"The presentation object changed; retry this edit\");\n }\n const bounds =\n commit.kind === \"move\"\n ? Object.freeze({\n ...node.bounds,\n x: canonicalCoordinate(commit.after.left),\n y: canonicalCoordinate(commit.after.top),\n })\n : Object.freeze({\n ...node.bounds,\n width: Math.max(1, canonicalCoordinate(commit.after.width)),\n height: Math.max(1, canonicalCoordinate(commit.after.height)),\n });\n command = { kind: \"node.bounds.set\", id: node.id, bounds };\n nextNode = Object.freeze({ ...node, bounds });\n }\n\n await session.applyPresentationCommands({\n version: PRESENTATION_ARTIFACT_COMMAND_VERSION,\n commands: [command],\n });\n sceneNodes.current.set(key, nextNode);\n notifyPresentationCommit(onCommit, onCommandError, commit);\n refresh();\n },\n [onCommandError, onCommit, refresh, session, state.composed, writable],\n );\n\n const projection = state.composed?.projection ?? null;\n const status = editableArtifactStatusLabel(view);\n const accessRevoked = editableArtifactAccessRevoked(view);\n return projection && !accessRevoked ? (\n <PresentationProjectionArtifactSurface\n {...surfaceProps}\n title={title}\n subtitle={\n subtitle ??\n `${projection.slides.length} slide${projection.slides.length === 1 ? \"\" : \"s\"}${writable ? \"\" : \" · Read only\"}`\n }\n projection={projection}\n commit={writable ? applyCommit : undefined}\n readOnly={!writable}\n busy={state.loading}\n onCommandError={onCommandError}\n />\n ) : (\n <ArtifactSurface\n modality=\"presentation\"\n title={title}\n subtitle={subtitle ?? status}\n actions={surfaceProps.actions}\n busy={!accessRevoked && !state.error}\n className={surfaceProps.className}\n >\n <EditableArtifactMessage\n title={\n accessRevoked\n ? \"Access changed\"\n : state.error\n ? \"Could not open this presentation\"\n : \"Opening presentation\"\n }\n detail={accessRevoked ? status : (state.error?.message ?? status)}\n retry={!accessRevoked && state.error ? refresh : undefined}\n />\n </ArtifactSurface>\n );\n}\n\n/** Builds a deterministic, bounded catalog + editor-slide projection at one revision. */\nexport async function composePresentationEditorProjection(\n session: EditableArtifactSession,\n): Promise<ComposedPresentationProjection> {\n if (session.modality !== \"presentation\") {\n throw new Error(\"Expected a presentation artifact session\");\n }\n let lastRevisionError: Error | null = null;\n for (let attempt = 0; attempt < PRESENTATION_COMPOSITION_ATTEMPTS; attempt += 1) {\n try {\n return await composePresentationAttempt(session);\n } catch (cause) {\n const error = asEditableArtifactError(cause, \"Could not project this presentation\");\n if (\n !isPresentationRevisionDrift(error) ||\n attempt === PRESENTATION_COMPOSITION_ATTEMPTS - 1\n ) {\n throw error;\n }\n lastRevisionError = error;\n }\n }\n throw lastRevisionError ?? new Error(\"Presentation changed while it was opening\");\n}\n\nasync function composePresentationAttempt(\n session: EditableArtifactSession,\n): Promise<ComposedPresentationProjection> {\n const metadata = await session.queryPresentation({\n kind: \"metadata\",\n maxBytes: PRESENTATION_ARTIFACT_QUERY_RESPONSE_MAX_BYTES,\n });\n if (metadata.kind !== \"metadata\") throw new Error(\"Presentation metadata response is malformed\");\n if (metadata.slides > PRESENTATION_MAX_INTERACTIVE_SLIDES) {\n throw new Error(\n `Presentation exceeds the interactive limit of ${PRESENTATION_MAX_INTERACTIVE_SLIDES} slides`,\n );\n }\n const catalog = await collectSlideCatalog(session, metadata.revision, metadata.slides);\n const scenes: EditablePresentationEditorSlideProjection[] = [];\n for (let start = 0; start < catalog.length; start += PRESENTATION_SCENE_CONCURRENCY) {\n const batch = catalog.slice(start, start + PRESENTATION_SCENE_CONCURRENCY);\n const projected = await Promise.all(\n batch.map((slide) =>\n session.queryPresentationEditorSlide({\n kind: \"editor-slide\",\n slideId: slide.id,\n maxNodes: PRESENTATION_ARTIFACT_QUERY_MAX_NODES,\n maxTextBytes: PRESENTATION_ARTIFACT_QUERY_MAX_TEXT_BYTES,\n maxBytes: PRESENTATION_ARTIFACT_QUERY_RESPONSE_MAX_BYTES,\n }),\n ),\n );\n for (const scene of projected) {\n if (scene.revision !== metadata.revision) {\n throw new Error(\"Presentation projection revision drifted\");\n }\n if (scene.truncated) {\n throw new Error(`Slide ${scene.slide.index + 1} exceeds the bounded editor projection`);\n }\n scenes.push(scene);\n }\n }\n\n const totalNodes = scenes.reduce((sum, scene) => sum + scene.nodes.length, 0);\n const totalText = scenes.reduce((sum, scene) => sum + scene.projectedTextBytes, 0);\n if (totalNodes > PRESENTATION_MAX_INTERACTIVE_NODES) {\n throw new Error(\n `Presentation exceeds the interactive limit of ${PRESENTATION_MAX_INTERACTIVE_NODES} scene nodes`,\n );\n }\n if (totalText > PRESENTATION_MAX_INTERACTIVE_TEXT_BYTES) {\n throw new Error(\n `Presentation exceeds the interactive limit of ${PRESENTATION_MAX_INTERACTIVE_TEXT_BYTES} text bytes`,\n );\n }\n if (scenes.length !== catalog.length) {\n throw new Error(\"Presentation slides changed while they were opening\");\n }\n\n const sceneNodeMap = new Map<string, PresentationArtifactEditorSceneNode>();\n const slides = scenes.map((scene, index) => {\n if (scene.slide.id !== catalog[index]?.id || scene.slide.index !== index) {\n throw new Error(\"Presentation slide catalog changed while it was opening\");\n }\n for (const node of scene.nodes) {\n sceneNodeMap.set(sceneNodeKey(scene.slide.id, node.id), node);\n }\n return projectPresentationSlide(scene);\n });\n return Object.freeze({\n projection: Object.freeze({\n revision: metadata.revision.toString(),\n slideSize: Object.freeze({\n width: displayCoordinate(metadata.slideSize.width),\n height: displayCoordinate(metadata.slideSize.height),\n }),\n slides: Object.freeze(slides),\n }),\n sceneNodes: sceneNodeMap,\n });\n}\n\nasync function collectSlideCatalog(\n session: EditableArtifactSession,\n revision: bigint,\n expectedSlides: number,\n): Promise<PresentationArtifactSlideCatalogItem[]> {\n const slides: PresentationArtifactSlideCatalogItem[] = [];\n let startSlide = 0;\n let projectedText = 0;\n for (let page = 0; page < PRESENTATION_MAX_CATALOG_PAGES; page += 1) {\n const response = await session.queryPresentationSlideCatalog({\n kind: \"slide-catalog\",\n startSlide,\n maxSlides: Math.min(\n PRESENTATION_CATALOG_PAGE,\n PRESENTATION_ARTIFACT_QUERY_MAX_SLIDES,\n Math.max(1, expectedSlides - slides.length),\n ),\n maxTextBytes: PRESENTATION_ARTIFACT_QUERY_MAX_TEXT_BYTES,\n maxBytes: PRESENTATION_ARTIFACT_QUERY_RESPONSE_MAX_BYTES,\n });\n if (response.revision !== revision) {\n throw new Error(\"Presentation projection revision drifted\");\n }\n if (response.startSlide !== startSlide) {\n throw new Error(\"Presentation slide catalog cursor is malformed\");\n }\n if (response.slides.some((slide, offset) => slide.index !== startSlide + offset)) {\n throw new Error(\"Presentation slide catalog order is malformed\");\n }\n slides.push(...response.slides);\n projectedText += response.projectedTextBytes;\n if (\n slides.length > PRESENTATION_MAX_INTERACTIVE_SLIDES ||\n projectedText > PRESENTATION_MAX_INTERACTIVE_TEXT_BYTES\n ) {\n throw new Error(\"Presentation slide catalog exceeds its interactive limit\");\n }\n if (response.nextSlide === null) {\n if (response.truncated || slides.length !== expectedSlides) {\n throw new Error(\"Presentation slide catalog is incomplete\");\n }\n return slides;\n }\n if (\n !response.truncated ||\n response.nextSlide <= startSlide ||\n response.nextSlide !== startSlide + response.slides.length ||\n response.slides.length === 0\n ) {\n throw new Error(\"Presentation slide catalog did not advance\");\n }\n startSlide = response.nextSlide;\n }\n throw new Error(`Presentation catalog exceeds ${PRESENTATION_MAX_CATALOG_PAGES} pages`);\n}\n\nfunction projectPresentationSlide(\n scene: EditablePresentationEditorSlideProjection,\n): PresentationSlideProjection {\n const byId = new Map(scene.nodes.map((node) => [node.id, node] as const));\n if (byId.size !== scene.nodes.length)\n throw new Error(\"Presentation slide contains duplicate IDs\");\n const children = new Map<string | null, PresentationArtifactEditorSceneNode[]>();\n for (const node of scene.nodes) {\n const entries = children.get(node.parentId) ?? [];\n entries.push(node);\n children.set(node.parentId, entries);\n }\n for (const entries of children.values()) {\n entries.sort((left, right) => left.order - right.order || left.id.localeCompare(right.id));\n }\n const visited = new Set<string>();\n const stack = new Set<string>();\n const projectNode = (\n node: PresentationArtifactEditorSceneNode,\n ): PresentationProjectionElement => {\n if (stack.has(node.id)) throw new Error(\"Presentation group hierarchy contains a cycle\");\n if (visited.has(node.id)) throw new Error(\"Presentation node appears more than once\");\n stack.add(node.id);\n visited.add(node.id);\n const directChildren = children.get(node.id) ?? [];\n let orderedChildren = directChildren;\n if (node.content.kind === \"group\") {\n const directIds = new Set(directChildren.map((child) => child.id));\n if (\n node.content.children.length !== directChildren.length ||\n node.content.children.some((id) => !directIds.has(id))\n ) {\n throw new Error(`Presentation group ${node.id} hierarchy is inconsistent`);\n }\n orderedChildren = node.content.children.map((id) => byId.get(id)!);\n } else if (directChildren.length > 0) {\n throw new Error(`Presentation non-group node ${node.id} contains children`);\n }\n const result = projectPresentationNode(node, orderedChildren.map(projectNode));\n stack.delete(node.id);\n return result;\n };\n const elements = (children.get(null) ?? []).map(projectNode);\n if (visited.size !== scene.nodes.length) {\n throw new Error(\"Presentation slide contains orphaned hierarchy nodes\");\n }\n return Object.freeze({\n id: scene.slide.id,\n title: scene.slide.title,\n background: projectFill(scene.slide.background),\n elements: Object.freeze(elements),\n layout: scene.slide.layout\n ? Object.freeze({\n id: scene.slide.layout.id,\n name: scene.slide.layout.name,\n masterId: scene.slide.layout.masterId,\n background: projectFill(scene.slide.layout.background),\n })\n : null,\n notes: scene.notes ? projectRichText(scene.notes) : null,\n });\n}\n\nfunction projectPresentationNode(\n node: PresentationArtifactEditorSceneNode,\n children: readonly PresentationProjectionElement[],\n): PresentationProjectionElement {\n const metadata = {\n nodeSource: { ...node.source },\n inherited: node.inherited,\n parentId: node.parentId,\n order: node.order,\n readOnly: node.inherited || node.source.kind !== \"slide\",\n } as const;\n const position = projectPosition(node.bounds);\n const rotation = node.transform.rotation / 60_000;\n const content = node.content;\n if (content.kind === \"shape\") {\n const richText = content.text ? projectRichText(content.text) : undefined;\n const textStyle = richText ? firstTextStyle(richText) : undefined;\n return Object.freeze({\n ...metadata,\n kind: \"shape\",\n id: node.id,\n name: node.name,\n geometry: projectShapeGeometry(content.geometry),\n position,\n fill: projectFill(content.fill),\n line: projectLine(content.line),\n rotation,\n text: content.text ? flattenPresentationRichText(content.text) : \"\",\n ...(richText ? { richText } : {}),\n ...(textStyle ? { textStyle } : {}),\n });\n }\n if (content.kind === \"group\") {\n return Object.freeze({\n ...metadata,\n kind: \"group\",\n id: node.id,\n name: node.name,\n position,\n childOffset: Object.freeze({\n left: displayCoordinate(content.childOffsetX),\n top: displayCoordinate(content.childOffsetY),\n }),\n childExtent: Object.freeze({\n width: displayCoordinate(content.childExtentWidth),\n height: displayCoordinate(content.childExtentHeight),\n }),\n rotation,\n flipHorizontal: node.transform.flipHorizontal,\n flipVertical: node.transform.flipVertical,\n children: Object.freeze([...children]),\n });\n }\n if (content.kind === \"connector\") {\n return Object.freeze({\n ...metadata,\n kind: \"connector\",\n id: node.id,\n name: node.name,\n connectorKind: content.connectorKind,\n position,\n start: Object.freeze({\n nodeId: content.start.nodeId,\n x: displayCoordinate(content.start.x),\n y: displayCoordinate(content.start.y),\n }),\n end: Object.freeze({\n nodeId: content.end.nodeId,\n x: displayCoordinate(content.end.x),\n y: displayCoordinate(content.end.y),\n }),\n line: projectLine(content.line),\n });\n }\n if (content.kind === \"chart\") {\n const titleRichText = projectRichText(content.title);\n return Object.freeze({\n ...metadata,\n kind: \"chart\",\n id: node.id,\n name: node.name,\n type: content.chartType,\n position,\n title: flattenPresentationRichText(content.title),\n titleRichText,\n hasLegend: content.hasLegend,\n series: Object.freeze(\n content.series.map((series) => ({\n name: series.name,\n categories: Object.freeze([...series.categories]),\n values: Object.freeze([...series.values]),\n xValues: Object.freeze([...series.xValues]),\n bubbleSizes: Object.freeze([...series.bubbleSizes]),\n })),\n ),\n });\n }\n if (content.kind === \"table\") {\n return Object.freeze({\n ...metadata,\n kind: \"table\",\n id: node.id,\n name: node.name,\n position,\n rows: Object.freeze(\n content.rows.map((row) =>\n Object.freeze(\n row.map((cell) =>\n cell\n ? Object.freeze({\n text: flattenPresentationRichText(cell.text),\n richText: projectRichText(cell.text),\n fill: projectFill(cell.fill),\n rowSpan: cell.rowSpan,\n colSpan: cell.columnSpan,\n })\n : null,\n ),\n ),\n ),\n ),\n columnWidths: Object.freeze(content.columnWidths.map(displayCoordinate)),\n rowHeights: Object.freeze(content.rowHeights.map(displayCoordinate)),\n line: projectLine(content.line),\n });\n }\n return Object.freeze({\n ...metadata,\n kind: \"image\",\n id: node.id,\n name: node.name,\n position,\n alt: content.altText,\n fit: content.fit,\n rotation,\n flipHorizontal: node.transform.flipHorizontal,\n flipVertical: node.transform.flipVertical,\n digest: bytesToHex(content.digest),\n contentType: content.contentType,\n intrinsicWidth: content.intrinsicWidth,\n intrinsicHeight: content.intrinsicHeight,\n });\n}\n\nfunction projectRichText(text: PresentationArtifactRichText): PresentationProjectionRichText {\n return Object.freeze({\n verticalAlignment: text.verticalAlignment,\n paragraphs: Object.freeze(\n text.paragraphs.map((paragraph) =>\n Object.freeze({\n alignment: paragraph.alignment,\n runs: Object.freeze(\n paragraph.runs.map((run) =>\n Object.freeze({\n text: run.text,\n style: projectTextStyle(run.style, paragraph.alignment, text.verticalAlignment),\n language: run.style.language,\n }),\n ),\n ),\n }),\n ),\n ),\n });\n}\n\nfunction projectTextStyle(\n style: PresentationArtifactTextStyle,\n alignment?: PresentationArtifactTextParagraph[\"alignment\"],\n verticalAlignment?: PresentationArtifactRichText[\"verticalAlignment\"],\n): PresentationProjectionTextStyle {\n return Object.freeze({\n fontFamily: style.fontFamily,\n fontSize: style.fontSizeCentipoints / 100,\n color: rgbaCss(style.color),\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n ...(alignment ? { alignment } : {}),\n ...(verticalAlignment ? { verticalAlignment } : {}),\n });\n}\n\nfunction firstTextStyle(\n text: PresentationProjectionRichText,\n): PresentationProjectionTextStyle | undefined {\n return text.paragraphs[0]?.runs[0]?.style;\n}\n\nfunction projectFill(fill: PresentationArtifactFill): PresentationProjectionFill {\n return fill.kind === \"none\"\n ? \"none\"\n : Object.freeze({ type: \"solid\", color: rgbaCss(fill.color) });\n}\n\nfunction projectLine(line: PresentationArtifactLine): PresentationProjectionLine {\n return Object.freeze({\n style: line.dash,\n fill: projectFill(line.fill),\n width: displayCoordinate(line.width),\n });\n}\n\nfunction projectPosition(\n bounds: PresentationArtifactEditorSceneNode[\"bounds\"],\n): PresentationProjectionPosition {\n return Object.freeze({\n left: displayCoordinate(bounds.x),\n top: displayCoordinate(bounds.y),\n width: displayCoordinate(bounds.width),\n height: displayCoordinate(bounds.height),\n });\n}\n\nfunction displayCoordinate(value: number): number {\n return value / EMU_PER_CSS_PIXEL;\n}\n\nfunction normalizeProjectedEditorPosition(\n position: PresentationProjectionPosition,\n): PresentationProjectionPosition {\n const clamp = (value: number) => Math.max(-1_000_000, Math.min(1_000_000, value));\n return {\n left: clamp(position.left),\n top: clamp(position.top),\n width: Math.min(1_000_000, Math.max(8, position.width)),\n height: Math.min(1_000_000, Math.max(8, position.height)),\n };\n}\n\nfunction canonicalCoordinate(value: number): number {\n if (!Number.isFinite(value)) throw new Error(\"Presentation coordinate must be finite\");\n const canonical = Math.round(value * EMU_PER_CSS_PIXEL);\n if (!Number.isSafeInteger(canonical)) throw new Error(\"Presentation coordinate is out of range\");\n return canonical;\n}\n\nfunction sameProjectedPosition(\n left: PresentationProjectionPosition,\n right: PresentationProjectionPosition,\n): boolean {\n return (\n canonicalCoordinate(left.left) === canonicalCoordinate(right.left) &&\n canonicalCoordinate(left.top) === canonicalCoordinate(right.top) &&\n canonicalCoordinate(left.width) === canonicalCoordinate(right.width) &&\n canonicalCoordinate(left.height) === canonicalCoordinate(right.height)\n );\n}\n\nfunction projectShapeGeometry(\n geometry: Extract<PresentationArtifactNodeKind, { kind: \"shape\" }>[\"geometry\"],\n) {\n return {\n \"text-box\": \"textbox\",\n rectangle: \"rect\",\n \"rounded-rectangle\": \"roundRect\",\n ellipse: \"ellipse\",\n triangle: \"triangle\",\n \"right-arrow\": \"rightArrow\",\n line: \"line\",\n }[geometry] as \"textbox\" | \"rect\" | \"roundRect\" | \"ellipse\" | \"triangle\" | \"rightArrow\" | \"line\";\n}\n\nfunction emptyPresentationText(): PresentationArtifactRichText {\n return Object.freeze({\n verticalAlignment: \"middle\",\n paragraphs: Object.freeze([\n Object.freeze({\n alignment: \"left\",\n runs: Object.freeze([Object.freeze({ text: \"\", style: DEFAULT_PRESENTATION_TEXT_STYLE })]),\n }),\n ]),\n });\n}\n\nexport function flattenPresentationRichText(text: PresentationArtifactRichText): string {\n return text.paragraphs\n .map((paragraph) => paragraph.runs.map((run) => run.text).join(\"\"))\n .join(\"\\n\");\n}\n\n/** Preserves unaffected run styles and paragraph alignment across one UTF-16 text edit. */\nexport function replacePresentationRichText(\n richText: PresentationArtifactRichText,\n before: string,\n after: string,\n): PresentationArtifactRichText {\n const canonicalBefore = flattenPresentationRichText(richText);\n if (canonicalBefore !== before) throw new Error(\"Presentation rich text does not match its edit\");\n if (before === after) return richText;\n const diff = textReplacementRange(before, after);\n const spans = presentationStyleSpans(richText);\n const paragraphStarts = presentationParagraphStarts(richText);\n const insertionStyle = styleAtOffset(spans, diff.start) ?? DEFAULT_PRESENTATION_TEXT_STYLE;\n const insertionAlignment = alignmentAtOffset(richText, paragraphStarts, diff.start);\n const paragraphs: PresentationArtifactTextParagraph[] = [];\n let newOffset = 0;\n for (const paragraphText of after.split(\"\\n\")) {\n const alignment = alignmentForNewOffset(\n richText,\n paragraphStarts,\n diff,\n newOffset,\n insertionAlignment,\n );\n const runs: { text: string; style: PresentationArtifactTextStyle }[] = [];\n let localOffset = 0;\n for (const character of paragraphText) {\n const offset = newOffset + localOffset;\n const oldOffset = oldOffsetForNewOffset(diff, offset);\n const style =\n oldOffset === null ? insertionStyle : (styleAtOffset(spans, oldOffset) ?? insertionStyle);\n const previous = runs.at(-1);\n if (previous && samePresentationTextStyle(previous.style, style)) previous.text += character;\n else runs.push({ text: character, style });\n localOffset += character.length;\n }\n paragraphs.push(\n Object.freeze({\n alignment,\n runs: Object.freeze(\n runs.map((run) =>\n Object.freeze({ text: run.text, style: Object.freeze({ ...run.style }) }),\n ),\n ),\n }),\n );\n newOffset += paragraphText.length + 1;\n }\n return Object.freeze({\n verticalAlignment: richText.verticalAlignment,\n paragraphs: Object.freeze(paragraphs),\n });\n}\n\ntype TextReplacement = {\n start: number;\n oldEnd: number;\n newEnd: number;\n delta: number;\n};\n\nfunction textReplacementRange(before: string, after: string): TextReplacement {\n let start = 0;\n while (\n start < before.length &&\n start < after.length &&\n before.charCodeAt(start) === after.charCodeAt(start)\n ) {\n start += 1;\n }\n while (start > 0 && (splitsSurrogate(before, start) || splitsSurrogate(after, start))) start -= 1;\n let suffix = 0;\n while (\n suffix < before.length - start &&\n suffix < after.length - start &&\n before.charCodeAt(before.length - suffix - 1) === after.charCodeAt(after.length - suffix - 1)\n ) {\n suffix += 1;\n }\n while (\n suffix > 0 &&\n (splitsSurrogate(before, before.length - suffix) ||\n splitsSurrogate(after, after.length - suffix))\n ) {\n suffix -= 1;\n }\n const oldEnd = before.length - suffix;\n const newEnd = after.length - suffix;\n return { start, oldEnd, newEnd, delta: oldEnd - newEnd };\n}\n\nfunction oldOffsetForNewOffset(diff: TextReplacement, offset: number): number | null {\n if (offset < diff.start) return offset;\n if (offset >= diff.newEnd) return offset + diff.delta;\n return null;\n}\n\ntype PresentationStyleSpan = {\n start: number;\n end: number;\n style: PresentationArtifactTextStyle;\n};\n\nfunction presentationStyleSpans(text: PresentationArtifactRichText): PresentationStyleSpan[] {\n const spans: PresentationStyleSpan[] = [];\n let offset = 0;\n text.paragraphs.forEach((paragraph, paragraphIndex) => {\n for (const run of paragraph.runs) {\n spans.push({ start: offset, end: offset + run.text.length, style: run.style });\n offset += run.text.length;\n }\n if (paragraphIndex < text.paragraphs.length - 1) offset += 1;\n });\n return spans;\n}\n\nfunction presentationParagraphStarts(text: PresentationArtifactRichText): number[] {\n const starts: number[] = [];\n let offset = 0;\n text.paragraphs.forEach((paragraph, index) => {\n starts.push(offset);\n offset += paragraph.runs.reduce((sum, run) => sum + run.text.length, 0);\n if (index < text.paragraphs.length - 1) offset += 1;\n });\n return starts;\n}\n\nfunction styleAtOffset(\n spans: readonly PresentationStyleSpan[],\n offset: number,\n): PresentationArtifactTextStyle | null {\n const containing = spans.find((span) => offset >= span.start && offset < span.end);\n if (containing) return containing.style;\n const before = [...spans].reverse().find((span) => span.end <= offset);\n return before?.style ?? spans[0]?.style ?? null;\n}\n\nfunction alignmentAtOffset(\n text: PresentationArtifactRichText,\n starts: readonly number[],\n offset: number,\n): PresentationArtifactTextParagraph[\"alignment\"] {\n let index = 0;\n while (index + 1 < starts.length && (starts[index + 1] ?? Number.POSITIVE_INFINITY) <= offset) {\n index += 1;\n }\n return text.paragraphs[index]?.alignment ?? \"left\";\n}\n\nfunction alignmentForNewOffset(\n text: PresentationArtifactRichText,\n starts: readonly number[],\n diff: TextReplacement,\n newOffset: number,\n fallback: PresentationArtifactTextParagraph[\"alignment\"],\n): PresentationArtifactTextParagraph[\"alignment\"] {\n const oldOffset = oldOffsetForNewOffset(diff, newOffset);\n return oldOffset === null ? fallback : alignmentAtOffset(text, starts, oldOffset);\n}\n\nfunction samePresentationTextStyle(\n left: PresentationArtifactTextStyle,\n right: PresentationArtifactTextStyle,\n): boolean {\n return (\n left.fontFamily === right.fontFamily &&\n left.fontSizeCentipoints === right.fontSizeCentipoints &&\n left.color === right.color &&\n left.bold === right.bold &&\n left.italic === right.italic &&\n left.underline === right.underline &&\n left.language === right.language\n );\n}\n\nfunction splitsSurrogate(value: string, index: number): boolean {\n if (index <= 0 || index >= value.length) return false;\n const left = value.charCodeAt(index - 1);\n const right = value.charCodeAt(index);\n return left >= 0xd800 && left <= 0xdbff && right >= 0xdc00 && right <= 0xdfff;\n}\n\nfunction rgbaCss(value: number): string {\n const hex = (value >>> 0).toString(16).padStart(8, \"0\");\n return hex.endsWith(\"ff\") ? `#${hex.slice(0, 6)}` : `#${hex}`;\n}\n\nfunction bytesToHex(value: Uint8Array): string {\n return [...value].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction sceneNodeKey(slideId: string, nodeId: string): string {\n return `${slideId}:${nodeId}`;\n}\n\nfunction isPresentationRevisionDrift(error: Error): boolean {\n return error.message.includes(\"changed while\") || error.message.includes(\"revision drifted\");\n}\n\nfunction notifyPresentationCommit(\n observer: PresentationCommitHandler | undefined,\n onError: ((error: Error) => void) | undefined,\n commit: PresentationCommit,\n): void {\n try {\n const result = observer?.(commit);\n if (result && typeof result.then === \"function\") {\n void Promise.resolve(result).catch((cause) =>\n onError?.(asEditableArtifactError(cause, \"Presentation commit observer failed\")),\n );\n }\n } catch (cause) {\n onError?.(asEditableArtifactError(cause, \"Presentation commit observer failed\"));\n }\n}\n"],"mappings":"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","names":["stageWidth","stageHeight","useCallback","useEffect","useRef","useState","jsx","useState","useRef","useEffect","useCallback"]}