@opengeni/react 7.4.0 → 7.5.0-canary.36927100590001
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.
- package/README.md +124 -27
- package/dist/artifacts-document.js +3 -2
- package/dist/artifacts-presentation.js +3 -2
- package/dist/artifacts-spreadsheet.js +2 -2
- package/dist/artifacts.d.ts +1 -0
- package/dist/artifacts.js +516 -1413
- package/dist/artifacts.js.map +1 -1
- package/dist/{browser-viewer-2E6R2Y4W.js → browser-viewer-Z7S7QEJL.js} +6 -5
- package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
- package/dist/{chunk-Y3QTZN2F.js → chunk-2VFNCX4E.js} +6 -6
- package/dist/{chunk-UDD6DLLT.js → chunk-3IJJEYW4.js} +15 -3
- package/dist/chunk-3IJJEYW4.js.map +1 -0
- package/dist/chunk-4RVYOY4O.js +379 -0
- package/dist/chunk-4RVYOY4O.js.map +1 -0
- package/dist/chunk-5CVXZA3Y.js +292 -0
- package/dist/chunk-5CVXZA3Y.js.map +1 -0
- package/dist/{chunk-5YK2ZDIG.js → chunk-5J4FOW6Q.js} +2 -10
- package/dist/chunk-5J4FOW6Q.js.map +1 -0
- package/dist/{chunk-KVERXCFY.js → chunk-5KYZIQFY.js} +40 -3
- package/dist/chunk-5KYZIQFY.js.map +1 -0
- package/dist/{chunk-KNDIXZN6.js → chunk-7UAMYXJY.js} +25 -18
- package/dist/{chunk-KNDIXZN6.js.map → chunk-7UAMYXJY.js.map} +1 -1
- package/dist/{chunk-SEEVCT36.js → chunk-A4UJB2MM.js} +2 -2
- package/dist/{chunk-X4HIN6TV.js → chunk-AFLPWUQ7.js} +71 -162
- package/dist/chunk-AFLPWUQ7.js.map +1 -0
- package/dist/chunk-B3V6TG77.js +41 -0
- package/dist/chunk-B3V6TG77.js.map +1 -0
- package/dist/{chunk-XEJEOAOV.js → chunk-B7WMS3CS.js} +51 -40
- package/dist/chunk-B7WMS3CS.js.map +1 -0
- package/dist/{chunk-S5JQ4R22.js → chunk-BDKR6BAR.js} +54 -24
- package/dist/chunk-BDKR6BAR.js.map +1 -0
- package/dist/{chunk-4MDLEHXL.js → chunk-DYWBUX5Q.js} +24 -12
- package/dist/chunk-DYWBUX5Q.js.map +1 -0
- package/dist/{chunk-YZ3YYMOM.js → chunk-E3G7SAYZ.js} +252 -624
- package/dist/chunk-E3G7SAYZ.js.map +1 -0
- package/dist/chunk-JT4JW7BC.js +54 -0
- package/dist/chunk-JT4JW7BC.js.map +1 -0
- package/dist/{chunk-5AZSK6MV.js → chunk-LWNLETQT.js} +5 -5
- package/dist/{chunk-USXVQACU.js → chunk-M7LBYP63.js} +5 -4
- package/dist/{chunk-USXVQACU.js.map → chunk-M7LBYP63.js.map} +1 -1
- package/dist/{chunk-L4OSXQ6H.js → chunk-NBOHNRLJ.js} +1289 -1060
- package/dist/chunk-NBOHNRLJ.js.map +1 -0
- package/dist/chunk-RHREZ7BO.js +11 -0
- package/dist/chunk-RHREZ7BO.js.map +1 -0
- package/dist/chunk-SCOTPE2I.js +589 -0
- package/dist/chunk-SCOTPE2I.js.map +1 -0
- package/dist/chunk-WEHMPOXK.js +39 -0
- package/dist/chunk-WEHMPOXK.js.map +1 -0
- package/dist/chunk-WRHIZYZF.js +988 -0
- package/dist/chunk-WRHIZYZF.js.map +1 -0
- package/dist/{chunk-3E2AITTZ.js → chunk-WUISZ3WU.js} +32 -28
- package/dist/{chunk-3E2AITTZ.js.map → chunk-WUISZ3WU.js.map} +1 -1
- package/dist/chunk-XCHWDJ22.js +107 -0
- package/dist/chunk-XCHWDJ22.js.map +1 -0
- package/dist/{chunk-DUEBTL3N.js → chunk-Y2PRMYLC.js} +4 -3
- package/dist/{chunk-DUEBTL3N.js.map → chunk-Y2PRMYLC.js.map} +1 -1
- package/dist/chunk-YBXQDQFX.js +1772 -0
- package/dist/chunk-YBXQDQFX.js.map +1 -0
- package/dist/chunk-YV4L3ILF.js +9 -0
- package/dist/chunk-YV4L3ILF.js.map +1 -0
- package/dist/{chunk-V2ABIVYJ.js → chunk-ZXSEDZP7.js} +70 -6
- package/dist/chunk-ZXSEDZP7.js.map +1 -0
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
- package/dist/components/artifacts/index.d.ts +7 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +23 -0
- package/dist/components/browser-select-control.d.ts +3 -1
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/message-timeline.d.ts +20 -3
- package/dist/components/open-geni-links.d.ts +16 -0
- package/dist/components/session-conversation.d.ts +20 -1
- package/dist/components/timeline-pill-geometry.d.ts +8 -0
- package/dist/components/timeline-pill-placement.d.ts +24 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/composer.js +5 -5
- package/dist/{computer-viewer-WMJE6OA3.js → computer-viewer-KJWLH3GI.js} +7 -5
- package/dist/connect.js +7 -6
- package/dist/connect.js.map +1 -1
- package/dist/conversation-timeline.d.ts +1 -1
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +26 -0
- package/dist/desktop.js.map +1 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +21 -0
- package/dist/editor.js.map +1 -0
- package/dist/hooks/latest-question.d.ts +1 -1
- package/dist/hooks/use-composer.d.ts +4 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.js +460 -1386
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +8 -6
- package/dist/interaction.js.map +1 -1
- package/dist/{latest-question-QB4EUCW5.js → latest-question-IS445HOW.js} +3 -3
- package/dist/lib/format.d.ts +6 -1
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/machines.js +2 -2
- package/dist/{markdown-table-layout-PFUEZ2U4.js → markdown-table-layout-QXSLK4BY.js} +37 -5
- package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
- package/dist/{queue-surface-implementation-IM2HD3SK.js → queue-surface-implementation-2CAQAIHM.js} +2 -2
- package/dist/realtime.js +3 -3
- package/dist/{sandbox-files-PXPIZAFG.js → sandbox-files-AEJTWGT4.js} +8 -5
- package/dist/sandbox-files-AEJTWGT4.js.map +1 -0
- package/dist/session-ui.d.ts +9 -2
- package/dist/session-ui.js +39 -20
- package/dist/session-ui.js.map +1 -1
- package/dist/session.js +4 -4
- package/dist/sites.js +4 -289
- package/dist/sites.js.map +1 -1
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +31 -0
- package/dist/terminal.js.map +1 -0
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/genie-loading.d.ts +3 -1
- package/dist/timeline/types.d.ts +8 -1
- package/dist/{timeline-annotation-selection-ODLVF4OI.js → timeline-annotation-selection-DMLMM2TX.js} +6 -1
- package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
- package/dist/timeline-pill-geometry-Z23V243M.js +110 -0
- package/dist/timeline-pill-geometry-Z23V243M.js.map +1 -0
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +13 -0
- package/dist/usage.js +1073 -0
- package/dist/usage.js.map +1 -0
- package/package.json +19 -3
- package/src/artifacts.ts +37 -0
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +185 -0
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/editable-artifact-ui.tsx +3 -1
- package/src/components/artifacts/editable-artifact-view.tsx +187 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +34 -36
- package/src/components/artifacts/editable-presentation.tsx +21 -16
- package/src/components/artifacts/index.ts +41 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
- package/src/components/artifacts/site-view.tsx +116 -0
- package/src/components/browser-select-control.tsx +4 -1
- package/src/components/browser-viewer.tsx +81 -22
- package/src/components/code-editor.tsx +13 -16
- package/src/components/computer-viewer.tsx +51 -23
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/markdown-table-layout.ts +49 -5
- package/src/components/markdown.tsx +5 -2
- package/src/components/message-timeline.tsx +557 -516
- package/src/components/open-geni-links.tsx +24 -0
- package/src/components/sandbox-terminal.tsx +48 -11
- package/src/components/session-chrome.tsx +22 -3
- package/src/components/session-conversation.tsx +195 -102
- package/src/components/timeline-annotation-selection.tsx +7 -0
- package/src/components/timeline-pill-geometry.ts +169 -0
- package/src/components/timeline-pill-placement.ts +99 -0
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/conversation-timeline.ts +10 -2
- package/src/desktop.ts +24 -0
- package/src/editor.ts +13 -0
- package/src/hooks/use-available-models.ts +1 -1
- package/src/hooks/use-composer.ts +57 -2
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-usage.ts +100 -0
- package/src/index.ts +22 -0
- package/src/lib/format.ts +32 -6
- package/src/lib/workbench-peers.ts +62 -0
- package/src/session-ui.ts +22 -0
- package/src/terminal.ts +26 -0
- package/src/timeline/activity-rail.tsx +5 -3
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/genie-loading.tsx +16 -6
- package/src/timeline/projection.ts +78 -4
- package/src/timeline/types.ts +8 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +50 -0
- package/styles/compiled.css +325 -0
- package/dist/chunk-4MDLEHXL.js.map +0 -1
- package/dist/chunk-5YK2ZDIG.js.map +0 -1
- package/dist/chunk-KVERXCFY.js.map +0 -1
- package/dist/chunk-L4OSXQ6H.js.map +0 -1
- package/dist/chunk-S5JQ4R22.js.map +0 -1
- package/dist/chunk-UDD6DLLT.js.map +0 -1
- package/dist/chunk-UGMKPUEM.js +0 -299
- package/dist/chunk-UGMKPUEM.js.map +0 -1
- package/dist/chunk-V2ABIVYJ.js.map +0 -1
- package/dist/chunk-X4HIN6TV.js.map +0 -1
- package/dist/chunk-XEJEOAOV.js.map +0 -1
- package/dist/chunk-YZ3YYMOM.js.map +0 -1
- package/dist/markdown-table-layout-PFUEZ2U4.js.map +0 -1
- package/dist/timeline-annotation-selection-ODLVF4OI.js.map +0 -1
- /package/dist/{browser-viewer-2E6R2Y4W.js.map → browser-viewer-Z7S7QEJL.js.map} +0 -0
- /package/dist/{computer-viewer-WMJE6OA3.js.map → chat-interactive-block-UGBTNB3L.js.map} +0 -0
- /package/dist/{chunk-Y3QTZN2F.js.map → chunk-2VFNCX4E.js.map} +0 -0
- /package/dist/{chunk-SEEVCT36.js.map → chunk-A4UJB2MM.js.map} +0 -0
- /package/dist/{chunk-5AZSK6MV.js.map → chunk-LWNLETQT.js.map} +0 -0
- /package/dist/{sandbox-files-PXPIZAFG.js.map → computer-viewer-KJWLH3GI.js.map} +0 -0
- /package/dist/{latest-question-QB4EUCW5.js.map → latest-question-IS445HOW.js.map} +0 -0
- /package/dist/{queue-surface-implementation-IM2HD3SK.js.map → queue-surface-implementation-2CAQAIHM.js.map} +0 -0
|
@@ -1 +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 MOBILE_RAIL_ITEM_HEIGHT = 44;\nconst MOBILE_RAIL_OVERSCAN = 3;\nconst DEFAULT_MOBILE_LIST_HEIGHT = 264;\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 showHeader?: boolean | 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 showHeader?: boolean | 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 nextSlideIndexFromKey(key: string, activeIndex: number, length: number): number | null {\n if (length === 0) return null;\n if (key === \"ArrowDown\") return Math.min(length - 1, activeIndex + 1);\n if (key === \"ArrowUp\") return Math.max(0, activeIndex - 1);\n if (key === \"Home\") return 0;\n if (key === \"End\") return length - 1;\n return null;\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 [mobileSelectorOpen, setMobileSelectorOpen] = useState(false);\n const [mobileRail, setMobileRail] = useState({\n scrollTop: 0,\n height: DEFAULT_MOBILE_LIST_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 mobileSelectorTriggerRef = useRef<HTMLButtonElement>(null);\n const mobileSelectorPanelRef = useRef<HTMLDivElement>(null);\n const mobileRailRef = 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 mobileRailScrollOnOpenRef = useRef(0);\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 if (!mobileSelectorOpen) return;\n const element = mobileRailRef.current;\n if (!element) return;\n element.scrollTop = mobileRailScrollOnOpenRef.current;\n element.focus();\n const measure = () =>\n setMobileRail((current) => ({\n scrollTop: element.scrollTop,\n height: element.clientHeight || current.height,\n }));\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [mobileSelectorOpen]);\n\n useEffect(() => {\n if (!mobileSelectorOpen) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (mobileSelectorTriggerRef.current?.contains(target)) return;\n if (mobileSelectorPanelRef.current?.contains(target)) return;\n setMobileSelectorOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n setMobileSelectorOpen(false);\n mobileSelectorTriggerRef.current?.focus();\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [mobileSelectorOpen]);\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 toggleMobileSlideSelector = useCallback(() => {\n setMobileSelectorOpen((open) => {\n if (open) return false;\n const index = Math.max(0, activeIndex);\n const height = DEFAULT_MOBILE_LIST_HEIGHT;\n const maxScroll = Math.max(0, slides.length * MOBILE_RAIL_ITEM_HEIGHT - height);\n const scrollTop = Math.max(\n 0,\n Math.min(\n maxScroll,\n index * MOBILE_RAIL_ITEM_HEIGHT - height / 2 + MOBILE_RAIL_ITEM_HEIGHT / 2,\n ),\n );\n mobileRailScrollOnOpenRef.current = scrollTop;\n setMobileRail({ scrollTop, height });\n return true;\n });\n }, [activeIndex, slides.length]);\n\n const chooseMobileSlide = useCallback(\n (slide: Slide, index: number) => {\n if (slide !== activeSlide) selectSlide(slide, index);\n setMobileSelectorOpen(false);\n mobileSelectorTriggerRef.current?.focus();\n },\n [activeSlide, selectSlide],\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 mobileRailStart = Math.max(\n 0,\n Math.floor(mobileRail.scrollTop / MOBILE_RAIL_ITEM_HEIGHT) - MOBILE_RAIL_OVERSCAN,\n );\n const mobileRailEnd = Math.min(\n slides.length,\n Math.ceil((mobileRail.scrollTop + mobileRail.height) / MOBILE_RAIL_ITEM_HEIGHT) +\n MOBILE_RAIL_OVERSCAN,\n );\n const slideCountLabel =\n activeIndex >= 0 ? `${activeIndex + 1} / ${slides.length}` : `0 / ${slides.length}`;\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 <button\n ref={mobileSelectorTriggerRef}\n type=\"button\"\n aria-label=\"Choose slide\"\n aria-haspopup=\"listbox\"\n aria-expanded={mobileSelectorOpen}\n aria-controls={mobileSelectorOpen ? `${domId}-mobile-slides` : undefined}\n disabled={slides.length === 0}\n data-og-mobile-slide-selector\n onClick={toggleMobileSlideSelector}\n className=\"inline-flex min-h-11 min-w-16 shrink-0 items-center justify-center rounded-og-sm px-2 text-og-xs tabular-nums text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg disabled:opacity-35 sm:hidden\"\n >\n <span>{slideCountLabel}</span>\n </button>\n <span className=\"hidden min-w-16 shrink-0 text-center text-og-xs tabular-nums text-og-fg-muted sm:inline\">\n {slideCountLabel}\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=\"relative 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 const nextIndex = nextSlideIndexFromKey(event.key, activeIndex, slides.length);\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 {mobileSelectorOpen ? (\n <div\n ref={mobileSelectorPanelRef}\n className=\"absolute left-2 top-2 z-40 max-w-56 overflow-hidden rounded-og-md border border-og-border bg-og-surface-1 shadow-og-md sm:hidden\"\n style={{ width: \"calc(100% - 1rem)\" }}\n >\n <div\n ref={mobileRailRef}\n id={`${domId}-mobile-slides`}\n role=\"listbox\"\n tabIndex={0}\n aria-label=\"Slides\"\n aria-orientation=\"vertical\"\n aria-activedescendant={\n activeSlide && activeIndex >= mobileRailStart && activeIndex < mobileRailEnd\n ? `${domId}-mobile-slide-${safeDomId(activeSlide.id)}`\n : undefined\n }\n className=\"max-h-72 overflow-y-auto outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent\"\n data-og-mobile-slide-list\n data-og-window-start={mobileRailStart}\n data-og-window-end={mobileRailEnd}\n onScroll={(event) => {\n const scrollTop = event.currentTarget.scrollTop;\n const height = event.currentTarget.clientHeight;\n setMobileRail((current) => ({\n scrollTop,\n height: height || current.height,\n }));\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setMobileSelectorOpen(false);\n mobileSelectorTriggerRef.current?.focus();\n return;\n }\n const nextIndex = nextSlideIndexFromKey(event.key, activeIndex, slides.length);\n if (nextIndex === null) return;\n event.preventDefault();\n const next = slides[nextIndex];\n if (!next) return;\n if (next !== activeSlide) selectSlide(next, nextIndex);\n const list = event.currentTarget;\n const top = nextIndex * MOBILE_RAIL_ITEM_HEIGHT;\n const bottom = top + MOBILE_RAIL_ITEM_HEIGHT;\n if (top < list.scrollTop) list.scrollTop = top;\n else if (bottom > list.scrollTop + list.clientHeight) {\n list.scrollTop = bottom - list.clientHeight;\n }\n }}\n >\n <div\n className=\"relative w-full\"\n style={{ height: slides.length * MOBILE_RAIL_ITEM_HEIGHT }}\n >\n {slides.slice(mobileRailStart, mobileRailEnd).map((slide, offset) => {\n const index = mobileRailStart + offset;\n const active = slide === activeSlide;\n return (\n <button\n key={slide.id}\n id={`${domId}-mobile-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={() => chooseMobileSlide(slide, index)}\n className={cn(\n \"absolute left-0 flex min-h-11 w-full items-center gap-2 px-2 text-left\",\n active\n ? \"bg-og-surface-3 text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3/70\",\n )}\n style={{\n top: index * MOBILE_RAIL_ITEM_HEIGHT,\n height: MOBILE_RAIL_ITEM_HEIGHT,\n }}\n data-og-mobile-slide-index={index}\n >\n <span className=\"w-7 shrink-0 text-right text-og-xs tabular-nums text-og-fg-subtle\">\n {index + 1}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-og-sm\">\n {slide.title || `Slide ${index + 1}`}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n ) : null}\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 // The slide is white paper in both app themes, so its selection\n // chrome uses the light palette to stay visible on it.\n data-og-theme=\"light\"\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-color-accent-deep)\"\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-color-accent-deep)\"\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 showHeader,\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 showHeader={showHeader}\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 showHeader,\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 showHeader={showHeader}\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 showHeader,\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 showHeader={showHeader}\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 showHeader={showHeader}\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"]}
|
|
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 MOBILE_RAIL_ITEM_HEIGHT = 44;\nconst MOBILE_RAIL_OVERSCAN = 3;\nconst DEFAULT_MOBILE_LIST_HEIGHT = 264;\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 showHeader?: boolean | 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 showHeader?: boolean | 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 nextSlideIndexFromKey(key: string, activeIndex: number, length: number): number | null {\n if (length === 0) return null;\n if (key === \"ArrowDown\") return Math.min(length - 1, activeIndex + 1);\n if (key === \"ArrowUp\") return Math.max(0, activeIndex - 1);\n if (key === \"Home\") return 0;\n if (key === \"End\") return length - 1;\n return null;\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 [mobileSelectorOpen, setMobileSelectorOpen] = useState(false);\n const [mobileRail, setMobileRail] = useState({\n scrollTop: 0,\n height: DEFAULT_MOBILE_LIST_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 mobileSelectorTriggerRef = useRef<HTMLButtonElement>(null);\n const mobileSelectorPanelRef = useRef<HTMLDivElement>(null);\n const mobileRailRef = 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 mobileRailScrollOnOpenRef = useRef(0);\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 if (!mobileSelectorOpen) return;\n const element = mobileRailRef.current;\n if (!element) return;\n element.scrollTop = mobileRailScrollOnOpenRef.current;\n element.focus();\n const measure = () =>\n setMobileRail((current) => ({\n scrollTop: element.scrollTop,\n height: element.clientHeight || current.height,\n }));\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [mobileSelectorOpen]);\n\n useEffect(() => {\n if (!mobileSelectorOpen) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (mobileSelectorTriggerRef.current?.contains(target)) return;\n if (mobileSelectorPanelRef.current?.contains(target)) return;\n setMobileSelectorOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n setMobileSelectorOpen(false);\n mobileSelectorTriggerRef.current?.focus();\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [mobileSelectorOpen]);\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 toggleMobileSlideSelector = useCallback(() => {\n setMobileSelectorOpen((open) => {\n if (open) return false;\n const index = Math.max(0, activeIndex);\n const height = DEFAULT_MOBILE_LIST_HEIGHT;\n const maxScroll = Math.max(0, slides.length * MOBILE_RAIL_ITEM_HEIGHT - height);\n const scrollTop = Math.max(\n 0,\n Math.min(\n maxScroll,\n index * MOBILE_RAIL_ITEM_HEIGHT - height / 2 + MOBILE_RAIL_ITEM_HEIGHT / 2,\n ),\n );\n mobileRailScrollOnOpenRef.current = scrollTop;\n setMobileRail({ scrollTop, height });\n return true;\n });\n }, [activeIndex, slides.length]);\n\n const chooseMobileSlide = useCallback(\n (slide: Slide, index: number) => {\n if (slide !== activeSlide) selectSlide(slide, index);\n setMobileSelectorOpen(false);\n mobileSelectorTriggerRef.current?.focus();\n },\n [activeSlide, selectSlide],\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 mobileRailStart = Math.max(\n 0,\n Math.floor(mobileRail.scrollTop / MOBILE_RAIL_ITEM_HEIGHT) - MOBILE_RAIL_OVERSCAN,\n );\n const mobileRailEnd = Math.min(\n slides.length,\n Math.ceil((mobileRail.scrollTop + mobileRail.height) / MOBILE_RAIL_ITEM_HEIGHT) +\n MOBILE_RAIL_OVERSCAN,\n );\n const slideCountLabel =\n activeIndex >= 0 ? `${activeIndex + 1} / ${slides.length}` : `0 / ${slides.length}`;\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 <button\n ref={mobileSelectorTriggerRef}\n type=\"button\"\n aria-label=\"Choose slide\"\n aria-haspopup=\"listbox\"\n aria-expanded={mobileSelectorOpen}\n aria-controls={mobileSelectorOpen ? `${domId}-mobile-slides` : undefined}\n disabled={slides.length === 0}\n data-og-mobile-slide-selector\n onClick={toggleMobileSlideSelector}\n className=\"inline-flex min-h-11 min-w-16 shrink-0 items-center justify-center rounded-og-sm px-2 text-og-xs tabular-nums text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg disabled:opacity-35 sm:hidden\"\n >\n <span>{slideCountLabel}</span>\n </button>\n <span className=\"hidden min-w-16 shrink-0 text-center text-og-xs tabular-nums text-og-fg-muted sm:inline\">\n {slideCountLabel}\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=\"relative 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 const nextIndex = nextSlideIndexFromKey(event.key, activeIndex, slides.length);\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 {mobileSelectorOpen ? (\n <div\n ref={mobileSelectorPanelRef}\n className=\"absolute left-2 top-2 z-40 max-w-56 overflow-hidden rounded-og-md border border-og-border bg-og-surface-1 shadow-og-md sm:hidden\"\n style={{ width: \"calc(100% - 1rem)\" }}\n >\n <div\n ref={mobileRailRef}\n id={`${domId}-mobile-slides`}\n role=\"listbox\"\n tabIndex={0}\n aria-label=\"Slides\"\n aria-orientation=\"vertical\"\n aria-activedescendant={\n activeSlide && activeIndex >= mobileRailStart && activeIndex < mobileRailEnd\n ? `${domId}-mobile-slide-${safeDomId(activeSlide.id)}`\n : undefined\n }\n className=\"max-h-72 overflow-y-auto outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent\"\n data-og-mobile-slide-list\n data-og-window-start={mobileRailStart}\n data-og-window-end={mobileRailEnd}\n onScroll={(event) => {\n const scrollTop = event.currentTarget.scrollTop;\n const height = event.currentTarget.clientHeight;\n setMobileRail((current) => ({\n scrollTop,\n height: height || current.height,\n }));\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setMobileSelectorOpen(false);\n mobileSelectorTriggerRef.current?.focus();\n return;\n }\n const nextIndex = nextSlideIndexFromKey(event.key, activeIndex, slides.length);\n if (nextIndex === null) return;\n event.preventDefault();\n const next = slides[nextIndex];\n if (!next) return;\n if (next !== activeSlide) selectSlide(next, nextIndex);\n const list = event.currentTarget;\n const top = nextIndex * MOBILE_RAIL_ITEM_HEIGHT;\n const bottom = top + MOBILE_RAIL_ITEM_HEIGHT;\n if (top < list.scrollTop) list.scrollTop = top;\n else if (bottom > list.scrollTop + list.clientHeight) {\n list.scrollTop = bottom - list.clientHeight;\n }\n }}\n >\n <div\n className=\"relative w-full\"\n style={{ height: slides.length * MOBILE_RAIL_ITEM_HEIGHT }}\n >\n {slides.slice(mobileRailStart, mobileRailEnd).map((slide, offset) => {\n const index = mobileRailStart + offset;\n const active = slide === activeSlide;\n return (\n <button\n key={slide.id}\n id={`${domId}-mobile-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={() => chooseMobileSlide(slide, index)}\n className={cn(\n \"absolute left-0 flex min-h-11 w-full items-center gap-2 px-2 text-left\",\n active\n ? \"bg-og-surface-3 text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3/70\",\n )}\n style={{\n top: index * MOBILE_RAIL_ITEM_HEIGHT,\n height: MOBILE_RAIL_ITEM_HEIGHT,\n }}\n data-og-mobile-slide-index={index}\n >\n <span className=\"w-7 shrink-0 text-right text-og-xs tabular-nums text-og-fg-subtle\">\n {index + 1}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-og-sm\">\n {slide.title || `Slide ${index + 1}`}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n ) : null}\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 // The slide is white paper in both app themes, so its selection\n // chrome uses the light palette to stay visible on it.\n data-og-theme=\"light\"\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-color-accent-deep)\"\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-color-accent-deep)\"\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 showHeader,\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 showHeader={showHeader}\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 showHeader,\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 showHeader={showHeader}\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 { useLatestTaskRunner } from \"./latest-task-runner\";\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 showHeader,\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 scheduleLoad = useLatestTaskRunner(session);\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 scheduleLoad(async () => {\n if (cancelled || generation !== loadGeneration.current) return;\n await 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 });\n return () => {\n cancelled = true;\n };\n }, [invalidator, retryEpoch, scheduleLoad, 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 showHeader={showHeader}\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 showHeader={showHeader}\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"]}
|