pptx-react-viewer 3.13.0 → 3.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/{AiChatPanel-E53JJRZX.js → AiChatPanel-7CWOJ3PS.js} +32 -32
  3. package/dist/AiChatPanel-7CWOJ3PS.js.br +0 -0
  4. package/dist/AiChatPanel-7CWOJ3PS.js.gz +0 -0
  5. package/dist/{AiChatPanel-JTXC5WWH.mjs → AiChatPanel-TBIAQSZ7.mjs} +11 -11
  6. package/dist/AiChatPanel-TBIAQSZ7.mjs.br +0 -0
  7. package/dist/AiChatPanel-TBIAQSZ7.mjs.gz +0 -0
  8. package/dist/{Area3DChartScene-JQ2VU73H.mjs → Area3DChartScene-6FFBYPHF.mjs} +1 -1
  9. package/dist/Area3DChartScene-6FFBYPHF.mjs.br +0 -0
  10. package/dist/Area3DChartScene-6FFBYPHF.mjs.gz +0 -0
  11. package/dist/{Area3DChartScene-J7G54OH4.js → Area3DChartScene-ZJYR6K66.js} +2 -2
  12. package/dist/Area3DChartScene-ZJYR6K66.js.br +0 -0
  13. package/dist/Area3DChartScene-ZJYR6K66.js.gz +0 -0
  14. package/dist/{Bar3DChartScene-5HC7LYBH.mjs → Bar3DChartScene-42MWINQX.mjs} +1 -1
  15. package/dist/Bar3DChartScene-42MWINQX.mjs.br +0 -0
  16. package/dist/Bar3DChartScene-42MWINQX.mjs.gz +0 -0
  17. package/dist/{Bar3DChartScene-JV3A2P6O.js → Bar3DChartScene-JP3BXEZW.js} +2 -2
  18. package/dist/Bar3DChartScene-JP3BXEZW.js.br +0 -0
  19. package/dist/Bar3DChartScene-JP3BXEZW.js.gz +0 -0
  20. package/dist/{Line3DChartScene-7SN7TVKQ.js → Line3DChartScene-JK3AELXZ.js} +2 -2
  21. package/dist/Line3DChartScene-JK3AELXZ.js.br +0 -0
  22. package/dist/Line3DChartScene-JK3AELXZ.js.gz +0 -0
  23. package/dist/{Line3DChartScene-4ZAOOU7U.mjs → Line3DChartScene-YVCSJMWK.mjs} +1 -1
  24. package/dist/Line3DChartScene-YVCSJMWK.mjs.br +0 -0
  25. package/dist/Line3DChartScene-YVCSJMWK.mjs.gz +0 -0
  26. package/dist/{Model3DScene-GQANXXQD.js → Model3DScene-N6UIMN7T.js} +2 -2
  27. package/dist/Model3DScene-N6UIMN7T.js.br +0 -0
  28. package/dist/Model3DScene-N6UIMN7T.js.gz +0 -0
  29. package/dist/{Model3DScene-GWIBUQ2U.mjs → Model3DScene-OXWSYHHK.mjs} +1 -1
  30. package/dist/{Model3DScene-GWIBUQ2U.mjs.br → Model3DScene-OXWSYHHK.mjs.br} +0 -0
  31. package/dist/Model3DScene-OXWSYHHK.mjs.gz +0 -0
  32. package/dist/{PieChart3DScene-QPFDRMEA.js → PieChart3DScene-Q2Z3ECL4.js} +2 -2
  33. package/dist/PieChart3DScene-Q2Z3ECL4.js.br +0 -0
  34. package/dist/PieChart3DScene-Q2Z3ECL4.js.gz +0 -0
  35. package/dist/{PieChart3DScene-RDTOLFTD.mjs → PieChart3DScene-XK4ETZJC.mjs} +1 -1
  36. package/dist/PieChart3DScene-XK4ETZJC.mjs.br +0 -0
  37. package/dist/PieChart3DScene-XK4ETZJC.mjs.gz +0 -0
  38. package/dist/{SurfaceChart3DScene-5JQCRWA5.mjs → SurfaceChart3DScene-KNWMKMOL.mjs} +1 -1
  39. package/dist/SurfaceChart3DScene-KNWMKMOL.mjs.br +0 -0
  40. package/dist/SurfaceChart3DScene-KNWMKMOL.mjs.gz +0 -0
  41. package/dist/{SurfaceChart3DScene-JLYGC7QU.js → SurfaceChart3DScene-ULBUIF7T.js} +2 -2
  42. package/dist/SurfaceChart3DScene-ULBUIF7T.js.br +0 -0
  43. package/dist/SurfaceChart3DScene-ULBUIF7T.js.gz +0 -0
  44. package/dist/{chunk-TWUAZRCG.js → chunk-5KAMDV37.js} +143233 -141589
  45. package/dist/chunk-5KAMDV37.js.br +0 -0
  46. package/dist/chunk-5KAMDV37.js.gz +0 -0
  47. package/dist/{chunk-PKHTTHA2.mjs → chunk-6547ZWC7.mjs} +323 -171
  48. package/dist/chunk-6547ZWC7.mjs.br +0 -0
  49. package/dist/chunk-6547ZWC7.mjs.gz +0 -0
  50. package/dist/{chunk-HB7DJENT.mjs → chunk-AT4BJKON.mjs} +1 -1
  51. package/dist/chunk-AT4BJKON.mjs.br +0 -0
  52. package/dist/chunk-AT4BJKON.mjs.gz +0 -0
  53. package/dist/{chunk-M7SNS3DQ.mjs → chunk-C4Q4WYAJ.mjs} +275 -127
  54. package/dist/chunk-C4Q4WYAJ.mjs.br +0 -0
  55. package/dist/chunk-C4Q4WYAJ.mjs.gz +0 -0
  56. package/dist/{chunk-IVCYND7A.js → chunk-GLY4OPMY.js} +167 -167
  57. package/dist/chunk-GLY4OPMY.js.br +0 -0
  58. package/dist/chunk-GLY4OPMY.js.gz +0 -0
  59. package/dist/{chunk-Y3SA5H5H.mjs → chunk-J7Q7AGN7.mjs} +1 -1
  60. package/dist/chunk-J7Q7AGN7.mjs.br +0 -0
  61. package/dist/chunk-J7Q7AGN7.mjs.gz +0 -0
  62. package/dist/{chunk-H3GHGSGW.js → chunk-LAB7WX2N.js} +700 -551
  63. package/dist/chunk-LAB7WX2N.js.br +0 -0
  64. package/dist/chunk-LAB7WX2N.js.gz +0 -0
  65. package/dist/{chunk-UGVPKJSU.js → chunk-Q6CSZ7VM.js} +1568 -1416
  66. package/dist/chunk-Q6CSZ7VM.js.br +0 -0
  67. package/dist/chunk-Q6CSZ7VM.js.gz +0 -0
  68. package/dist/{chunk-G2Z7QULX.js → chunk-VVJTEFGP.js} +5 -5
  69. package/dist/chunk-VVJTEFGP.js.br +0 -0
  70. package/dist/chunk-VVJTEFGP.js.gz +0 -0
  71. package/dist/{chunk-TS2DHMBS.mjs → chunk-YNTZCMRI.mjs} +143222 -141589
  72. package/dist/chunk-YNTZCMRI.mjs.br +0 -0
  73. package/dist/chunk-YNTZCMRI.mjs.gz +0 -0
  74. package/dist/index.d.ts +54 -1
  75. package/dist/index.js +45 -45
  76. package/dist/index.js.br +0 -0
  77. package/dist/index.js.gz +0 -0
  78. package/dist/index.mjs +5 -5
  79. package/dist/index.mjs.br +0 -0
  80. package/dist/index.mjs.gz +0 -0
  81. package/dist/internals.d.ts +88 -2
  82. package/dist/internals.d.ts.map +1 -1
  83. package/dist/internals.js +78 -78
  84. package/dist/internals.js.br +0 -0
  85. package/dist/internals.js.gz +0 -0
  86. package/dist/internals.mjs +3 -3
  87. package/dist/internals.mjs.br +0 -0
  88. package/dist/internals.mjs.gz +0 -0
  89. package/dist/pptx-viewer.css +1 -1
  90. package/dist/pptx-viewer.css.br +0 -0
  91. package/dist/pptx-viewer.css.gz +0 -0
  92. package/dist/viewer/index.d.ts +54 -1
  93. package/dist/viewer/index.js +26 -26
  94. package/dist/viewer/index.js.br +0 -0
  95. package/dist/viewer/index.js.gz +0 -0
  96. package/dist/viewer/index.mjs +5 -5
  97. package/dist/viewer/index.mjs.br +0 -0
  98. package/dist/viewer/index.mjs.gz +0 -0
  99. package/package.json +3 -1
  100. package/dist/AiChatPanel-E53JJRZX.js.br +0 -0
  101. package/dist/AiChatPanel-E53JJRZX.js.gz +0 -0
  102. package/dist/AiChatPanel-JTXC5WWH.mjs.br +0 -0
  103. package/dist/AiChatPanel-JTXC5WWH.mjs.gz +0 -0
  104. package/dist/Area3DChartScene-J7G54OH4.js.br +0 -0
  105. package/dist/Area3DChartScene-J7G54OH4.js.gz +0 -0
  106. package/dist/Area3DChartScene-JQ2VU73H.mjs.br +0 -0
  107. package/dist/Area3DChartScene-JQ2VU73H.mjs.gz +0 -0
  108. package/dist/Bar3DChartScene-5HC7LYBH.mjs.br +0 -0
  109. package/dist/Bar3DChartScene-5HC7LYBH.mjs.gz +0 -0
  110. package/dist/Bar3DChartScene-JV3A2P6O.js.br +0 -0
  111. package/dist/Bar3DChartScene-JV3A2P6O.js.gz +0 -0
  112. package/dist/Line3DChartScene-4ZAOOU7U.mjs.br +0 -0
  113. package/dist/Line3DChartScene-4ZAOOU7U.mjs.gz +0 -0
  114. package/dist/Line3DChartScene-7SN7TVKQ.js.br +0 -0
  115. package/dist/Line3DChartScene-7SN7TVKQ.js.gz +0 -0
  116. package/dist/Model3DScene-GQANXXQD.js.br +0 -0
  117. package/dist/Model3DScene-GQANXXQD.js.gz +0 -0
  118. package/dist/Model3DScene-GWIBUQ2U.mjs.gz +0 -0
  119. package/dist/PieChart3DScene-QPFDRMEA.js.br +0 -0
  120. package/dist/PieChart3DScene-QPFDRMEA.js.gz +0 -0
  121. package/dist/PieChart3DScene-RDTOLFTD.mjs.br +0 -0
  122. package/dist/PieChart3DScene-RDTOLFTD.mjs.gz +0 -0
  123. package/dist/SurfaceChart3DScene-5JQCRWA5.mjs.br +0 -0
  124. package/dist/SurfaceChart3DScene-5JQCRWA5.mjs.gz +0 -0
  125. package/dist/SurfaceChart3DScene-JLYGC7QU.js.br +0 -0
  126. package/dist/SurfaceChart3DScene-JLYGC7QU.js.gz +0 -0
  127. package/dist/chunk-G2Z7QULX.js.br +0 -0
  128. package/dist/chunk-G2Z7QULX.js.gz +0 -0
  129. package/dist/chunk-H3GHGSGW.js.br +0 -0
  130. package/dist/chunk-H3GHGSGW.js.gz +0 -0
  131. package/dist/chunk-HB7DJENT.mjs.br +0 -0
  132. package/dist/chunk-HB7DJENT.mjs.gz +0 -0
  133. package/dist/chunk-IVCYND7A.js.br +0 -0
  134. package/dist/chunk-IVCYND7A.js.gz +0 -0
  135. package/dist/chunk-M7SNS3DQ.mjs.br +0 -0
  136. package/dist/chunk-M7SNS3DQ.mjs.gz +0 -0
  137. package/dist/chunk-PKHTTHA2.mjs.br +0 -0
  138. package/dist/chunk-PKHTTHA2.mjs.gz +0 -0
  139. package/dist/chunk-TS2DHMBS.mjs.br +0 -0
  140. package/dist/chunk-TS2DHMBS.mjs.gz +0 -0
  141. package/dist/chunk-TWUAZRCG.js.br +0 -0
  142. package/dist/chunk-TWUAZRCG.js.gz +0 -0
  143. package/dist/chunk-UGVPKJSU.js.br +0 -0
  144. package/dist/chunk-UGVPKJSU.js.gz +0 -0
  145. package/dist/chunk-Y3SA5H5H.mjs.br +0 -0
  146. package/dist/chunk-Y3SA5H5H.mjs.gz +0 -0
Binary file
Binary file
@@ -1,4 +1,4 @@
1
- import { ThemePresets, PptxMarkdownConverter, hasTextProperties, hasShapeProperties } from './chunk-TS2DHMBS.mjs';
1
+ import { ThemePresets, PptxMarkdownConverter, hasTextProperties, hasShapeProperties } from './chunk-YNTZCMRI.mjs';
2
2
  import { __export } from './chunk-XGB3TDIC.mjs';
3
3
  import * as mcp from 'pptx-viewer-mcp';
4
4
  import * as mcpSchemas from 'pptx-viewer-mcp/schemas';
Binary file
Binary file
@@ -1,5 +1,5 @@
1
- import { cloneHistorySnapshot, MIN_ELEMENT_SIZE, ZOOM_TO_SELECTION_PADDING, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, UNGROUPED_SECTION_ID, DEFAULT_SECTION_GROUP_ID, DEFAULT_TABLE_ROWS, DEFAULT_TABLE_COLUMNS, buildPdfFromTiledImageData, buildNotesPdf, GRID_SIZE, DEFAULT_TEXT_FONT_SIZE } from './chunk-Y3SA5H5H.mjs';
2
- import { DEFAULT_VIEWER_OPTIONS, TOOLBAR_TABS, computeVirtualRange, DEFAULT_VIRTUAL_OVERSCAN, createPresenceProjector, BROADCAST_THROTTLE_MS, createSyncGate, clearLocalAwareness, validateRoomId, createDepartureChannel, resolveTransportForServerUrl, isMixedContentBlocked, CONNECTION_TIMEOUT_MS, registerCollaborationTeardown, sanitizeColor, cloneTemplateElementsBySlideId, cloneSlide, createWheelStepBuffer, createViewerZoomStore, clampZoomScale, mapEditingWheel, createActiveAnimationGroup, cancelBuildReveal, clearPlaybackTimers, PresentationAnimationController, resolveMediaTimeNodeElementIds, advanceMainSequence, playGroup, PRESENTATION_HASH, PRESENTATION_NONCE_KEY, PRESENTATION_CHANNEL_NAME, swapPresentationWindows, PRESENTATION_MESSAGE_ORIGIN, clearAudienceContent, buildPresentationAudienceUrl, resolveAudienceScreenPlacement, placeAudienceWindow, storeAudienceContent, isPresentationSessionMessage, endAudienceDisplay, createPresentationKeyBuffer, acceptsPresentationInput, resolveAutoAdvanceDelayMs, hasShowSlideAfter, nextShowSlideIndex, previousShowSlideIndex, createPresenterShowGuard, firstShowSlideIndex, attachPresentationVisibilityPause, presentationEntrySlideIndex, buildMorphTransitionPlan, morphOptionToMode, buildMorphAnimationRules, findInSlides, applyFindReplacements, visibleTemplateElements, createCollaborationLivePatcher, publishLiveInlineText, PptxHandler, collectMediaElements, resolveMediaElementSource, collectImagePaths, applyImagePathPatches, resolveTableCellImageUrls, resolveTableStyleImageUrls, partitionTemplateElements, seedRecentColors, resolveAuthoredCustomShowId, buildInitialGuides, readOnlyRecommendation, compatibilityWarningToasts, EncryptedFileError, resolveAutosaveIntervalMs, shouldWriteAutosaveSnapshot, saveAutosaveSnapshot, autosaveSnapshotMark, hasTextProperties, remapTextToSegments, updateMasterViewElement, isTemplateElementId, updateElement, hasShapeProperties, getInlineEditorSelection, applyStyleToSelectedSegments, setPendingSelectionRestore, applyCaseTransformToSegments, transformTextCase, masterViewElements, replaceMasterViewElements, addSection, renameSection, deleteSection, moveSectionUp, moveSectionDown, moveSlidesToSection, canInteractWithElement, normalizeColorsForCapture, preprocessCssForCapture, slideProgressPercent, slideStatusLabel, EXPORT_ASSEMBLING_PERCENT, EXPORT_DONE_PERCENT, isExportAbortError, recordProgressPercent, downloadBlob, resolveImageResolutionScale, applyThemeToData, THEME_PRESETS, themeColorSchemesEqual, comparePresentation, applyAcceptSlide, applyAcceptAllSlides, collectUsedFonts, describeFontEmbedding, isMobileViewport, resolveAuthoredSlideRange, mayLeaveSlideShow, stopAllPersistentAudio, guidePxToEmu, buildSaveSlides, buildDeckSaveOptions, resolveSlideSizeSelection, saveDeckWithPassword, shouldProbeAutosaveRecovery, probeAutosaveRecovery, acceptAutosaveRecovery, discardAutosaveRecovery, shouldLoopContinuously, applyRehearsalTimings, copyFormatFromElement, applyFormatToElement, collectReferencedFontFamilies, resolveGoogleWebfontHref, mapSlideShowStartKey, mapEditorKey, isEditorTextInputTarget, createViewerOptionsStore, readSlidesFromYDoc, shouldRoomSlidesReplaceLoad, reconcileSlidesInYDoc, LOCAL_SYNC_ORIGIN, observeYDocSlides, shouldAutoFollowBroadcaster, detectTouchDevice, detectOrientation, deriveViewportBreakpoints, createTouchGestureRecognizer, MAX_ZOOM_SCALE, MIN_ZOOM_SCALE, isKeyboardOpen, scopeLayoutOptionsToSlide, checkModifyPassword, viewerPreferencesFromViewProperties, DEFAULT_VIEWER_PREFERENCES, viewPropertiesPatchFromPreferences, openPptxFile, readBackstageRecentFile, isActionHidden, buildInlineTextCommitPatch, resolveInlineEditAutoFitHeight, resolveInlineEditNormAutofitShrink, filterInteractableIds, beginShapeAdjustment, buildElementClipboardPayload, savedPresentationFileName, exportDeckJson, groupElements, generateElementId, makeCloneId, ungroupElements, alignElements, distributeElements, bringForward, sendBackward, bringToFront, sendToBack, newTableElement, createDefaultChartElement, readViewportMetrics, computeKeyboardInset, mergeShapes, mapPresentationKey, lastShowSlideIndex, mapPresentationWheel, openPendingPrintWindow, computeColorFilter, filterHiddenSlideIndices, computeSlideIndices, buildPrintDocument, finishPrintWindow, buildPrintHtmlDocument, buildOutlineHtml, buildSlidesHtml, buildNotesHtml, buildHandoutsHtml, createBlankSlide, makeSlideId, buildSlideTemplateSlide, templateSchemeFromTheme, buildThemeColorMap, reResolveSlideColors, reResolveElementColors, scheduleAutoAdvanceChain, computeEntranceAnimationDelay, createPresentationSessionId, resolveTransitionDurationMs, resolveTransitionSoundAction, runPresentationAction, safeOpenUrl, buildRunProgramNotice, toggleStageElementMedia, resolveOleVerbTarget, downloadDataUrl, openUrlInNewTab, createPresenterTimer, createInitialPresentationSnapshot, mergePresentationSnapshot, resetPresenterTimer, presenterElapsed, stepPresenterZoom, togglePresenterTimer, addCommentToList, removeCommentFromList, editCommentInList, toggleCommentResolvedInList, pickSupportedMimeType, WEBM_MIME_CANDIDATES, fpsToFrameIntervalMs, segmentFrameCount, encodeGif, computeGridSpacingPx, resolveShowSlideIndexes, groupSlidesBySection, masterViewPseudoSlide, resolveHistoryDepth, hasCopyableFormat, createBackstagePresentation, buildFieldSubstitutionContext, cloneElementForPaste, computeScrollDelta, getPresetShapeClipPath, svgPathToPolygons, polygonsToSvgPath, rerouteConnectorsForMovedElements, applyReroutedConnectors, SvgExporter, replyToCommentInList, deleteTableColumn, rebuildTableStructureInRawXml, insertTableColumn, deleteTableRow, insertTableRow, updateCellTextStyleInRawXml, setCellText, updateCellTextInRawXml, splitCell, updateMergeAttrsInRawXml, mergeCells, rasterResultToPngBlob, rasterizeElementTiles, placeTileOnPage, PDF_SLIDES_PAGE_WIDTH_PT, PDF_SLIDES_PAGE_HEIGHT_PT, canvasToJpegData, rasterizeElementClampedToCanvas, isPpactionUrl, parsePpactionUrl, resolvePresentationAction, ACTION_BUTTON_PRESETS, elementActionToPptxAction, isUrlSafe, buildSmartArtPresetData, classifyMediaType, computeSnapToShape, publishLiveGeometry, getDraggedShapeAdjustments, computeMarqueeHitIds, mergeAdditiveSelection, rasterizeElement, shouldConfirmExternalHyperlink, applyResize, lockResizeAspect, snapBoxToGrid, applyMotionPathPreset } from './chunk-TS2DHMBS.mjs';
1
+ import { cloneHistorySnapshot, MIN_ELEMENT_SIZE, ZOOM_TO_SELECTION_PADDING, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, UNGROUPED_SECTION_ID, DEFAULT_SECTION_GROUP_ID, DEFAULT_TABLE_ROWS, DEFAULT_TABLE_COLUMNS, buildPdfFromTiledImageData, buildNotesPdf, GRID_SIZE, DEFAULT_TEXT_FONT_SIZE } from './chunk-J7Q7AGN7.mjs';
2
+ import { GlyphOutlineFontCache, createGlyphOutlineLookup, DEFAULT_VIEWER_OPTIONS, TOOLBAR_TABS, MIN_TOUCH_TARGET_PX, computeVirtualRange, DEFAULT_VIRTUAL_OVERSCAN, createPresenceProjector, BROADCAST_THROTTLE_MS, createSyncGate, clearLocalAwareness, validateRoomId, createDepartureChannel, resolveTransportForServerUrl, isMixedContentBlocked, CONNECTION_TIMEOUT_MS, registerCollaborationTeardown, sanitizeColor, cloneTemplateElementsBySlideId, cloneSlide, createWheelStepBuffer, createViewerZoomStore, clampZoomScale, mapEditingWheel, createActiveAnimationGroup, cancelBuildReveal, clearPlaybackTimers, PresentationAnimationController, resolveMediaTimeNodeElementIds, advanceMainSequence, playGroup, PRESENTATION_HASH, PRESENTATION_NONCE_KEY, PRESENTATION_CHANNEL_NAME, swapPresentationWindows, PRESENTATION_MESSAGE_ORIGIN, clearAudienceContent, buildPresentationAudienceUrl, resolveAudienceScreenPlacement, placeAudienceWindow, storeAudienceContent, isPresentationSessionMessage, endAudienceDisplay, createPresentationKeyBuffer, acceptsPresentationInput, resolveAutoAdvanceDelayMs, hasShowSlideAfter, nextShowSlideIndex, previousShowSlideIndex, createPresenterShowGuard, firstShowSlideIndex, attachPresentationVisibilityPause, presentationEntrySlideIndex, buildMorphTransitionPlan, morphOptionToMode, buildMorphAnimationRules, findInSlides, applyFindReplacements, visibleTemplateElements, createCollaborationLivePatcher, publishLiveInlineText, PptxHandler, collectMediaElements, resolveMediaElementSource, collectImagePaths, applyImagePathPatches, resolveTableCellImageUrls, resolveTableStyleImageUrls, partitionTemplateElements, seedRecentColors, resolveAuthoredCustomShowId, buildInitialGuides, readOnlyRecommendation, compatibilityWarningToasts, EncryptedFileError, resolveAutosaveIntervalMs, shouldWriteAutosaveSnapshot, saveAutosaveSnapshot, autosaveSnapshotMark, hasTextProperties, remapTextToSegments, updateMasterViewElement, isTemplateElementId, updateElement, hasShapeProperties, getInlineEditorSelection, applyStyleToSelectedSegments, setPendingSelectionRestore, applyCaseTransformToSegments, transformTextCase, masterViewElements, replaceMasterViewElements, addSection, renameSection, deleteSection, moveSectionUp, moveSectionDown, moveSlidesToSection, canInteractWithElement, normalizeColorsForCapture, preprocessCssForCapture, slideProgressPercent, slideStatusLabel, EXPORT_ASSEMBLING_PERCENT, EXPORT_DONE_PERCENT, isExportAbortError, resolveImageResolutionScale, applyThemeToData, THEME_PRESETS, themeColorSchemesEqual, comparePresentation, applyAcceptSlide, applyAcceptAllSlides, collectUsedFonts, describeFontEmbedding, isMobileViewport, resolveAuthoredSlideRange, mayLeaveSlideShow, stopAllPersistentAudio, guidePxToEmu, buildSaveSlides, buildDeckSaveOptions, resolveSlideSizeSelection, saveDeckWithPassword, shouldProbeAutosaveRecovery, probeAutosaveRecovery, acceptAutosaveRecovery, discardAutosaveRecovery, shouldLoopContinuously, applyRehearsalTimings, copyFormatFromElement, applyFormatToElement, collectReferencedFontFamilies, resolveGoogleWebfontHref, selectGoogleWebfontFamilies, fetchGoogleWebfontOutlineBytes, mapSlideShowStartKey, mapEditorKey, isEditorTextInputTarget, createViewerOptionsStore, readSlidesFromYDoc, shouldRoomSlidesReplaceLoad, reconcileSlidesInYDoc, LOCAL_SYNC_ORIGIN, observeYDocSlides, shouldAutoFollowBroadcaster, detectTouchDevice, detectOrientation, deriveViewportBreakpoints, createTouchGestureRecognizer, MAX_ZOOM_SCALE, MIN_ZOOM_SCALE, isKeyboardOpen, scopeLayoutOptionsToSlide, checkModifyPassword, viewerPreferencesFromViewProperties, DEFAULT_VIEWER_PREFERENCES, viewPropertiesPatchFromPreferences, openPptxFile, readBackstageRecentFile, isActionHidden, buildInlineTextCommitPatch, resolveInlineEditAutoFitHeight, resolveInlineEditNormAutofitShrink, filterInteractableIds, beginShapeAdjustment, buildElementClipboardPayload, savedPresentationFileName, downloadBlob, exportDeckJson, groupElements, generateElementId, makeCloneId, ungroupElements, alignElements, distributeElements, bringForward, sendBackward, bringToFront, sendToBack, newTableElement, createDefaultChartElement, readViewportMetrics, computeKeyboardInset, mergeShapes, mapPresentationKey, lastShowSlideIndex, mapPresentationWheel, openPendingPrintWindow, computeColorFilter, filterHiddenSlideIndices, computeSlideIndices, buildPrintDocument, finishPrintWindow, buildPrintHtmlDocument, buildOutlineHtml, buildSlidesHtml, buildNotesHtml, buildHandoutsHtml, createBlankSlide, makeSlideId, buildSlideTemplateSlide, templateSchemeFromTheme, buildThemeColorMap, reResolveSlideColors, reResolveElementColors, scheduleAutoAdvanceChain, computeEntranceAnimationDelay, createPresentationSessionId, resolveTransitionDurationMs, resolveTransitionSoundAction, runPresentationAction, safeOpenUrl, buildRunProgramNotice, toggleStageElementMedia, resolveOleVerbTarget, downloadDataUrl, openUrlInNewTab, createPresenterTimer, createInitialPresentationSnapshot, mergePresentationSnapshot, resetPresenterTimer, presenterElapsed, stepPresenterZoom, togglePresenterTimer, addCommentToList, removeCommentFromList, editCommentInList, toggleCommentResolvedInList, resolveExportCaptureDecision, recordProgressPercent, computeGridSpacingPx, resolveShowSlideIndexes, groupSlidesBySection, masterViewPseudoSlide, resolveHistoryDepth, hasCopyableFormat, createBackstagePresentation, buildFieldSubstitutionContext, cloneElementForPaste, computeScrollDelta, getPresetShapeClipPath, svgPathToPolygons, polygonsToSvgPath, rerouteConnectorsForMovedElements, applyReroutedConnectors, SvgExporter, replyToCommentInList, deleteTableColumn, rebuildTableStructureInRawXml, insertTableColumn, deleteTableRow, insertTableRow, updateCellTextStyleInRawXml, setCellText, updateCellTextInRawXml, splitCell, updateMergeAttrsInRawXml, mergeCells, pickSupportedMimeType, WEBM_MIME_CANDIDATES, fpsToFrameIntervalMs, segmentFrameCount, GIF_POST_CAPTURE_MAX_SIDE, encodeGif, rasterResultToPngBlob, rasterizeElementTiles, placeTileOnPage, PDF_SLIDES_PAGE_WIDTH_PT, PDF_SLIDES_PAGE_HEIGHT_PT, canvasToJpegData, rasterizeElementTiledToCanvas, isPpactionUrl, parsePpactionUrl, resolvePresentationAction, ACTION_BUTTON_PRESETS, elementActionToPptxAction, isUrlSafe, buildSmartArtPresetData, classifyMediaType, computeSnapToShape, publishLiveGeometry, getDraggedShapeAdjustments, computeMarqueeHitIds, mergeAdditiveSelection, clampGifDimensions, rasterizeElement, shouldConfirmExternalHyperlink, applyResize, lockResizeAspect, snapBoxToGrid, applyMotionPathPreset } from './chunk-YNTZCMRI.mjs';
3
3
  import { translationsEn } from './chunk-HMX3MQR7.mjs';
4
4
  import { createContext, useRef, useState, useEffect, useCallback, useMemo, useLayoutEffect, useContext, useImperativeHandle, useSyncExternalStore } from 'react';
5
5
  import { useTranslation } from 'react-i18next';
@@ -3960,6 +3960,12 @@ function useViewerState(input) {
3960
3960
  const ui = useViewerUIState();
3961
3961
  return { ...core, ...ui };
3962
3962
  }
3963
+
3964
+ // src/viewer/utils/glyph-outline-cache.ts
3965
+ var glyphOutlineFontCache = new GlyphOutlineFontCache();
3966
+ var getGlyphOutline = createGlyphOutlineLookup(glyphOutlineFontCache);
3967
+
3968
+ // src/viewer/hooks/useLoadContent.ts
3963
3969
  function useLoadContent({
3964
3970
  content,
3965
3971
  clearSelection,
@@ -4138,6 +4144,7 @@ function useLoadContent({
4138
4144
  setCoreProperties(parsed.coreProperties);
4139
4145
  setAppProperties(parsed.appProperties);
4140
4146
  setEmbeddedFonts(parsed.embeddedFonts ?? []);
4147
+ glyphOutlineFontCache.registerEmbeddedFonts(parsed.embeddedFonts ?? []);
4141
4148
  setHasMacros(parsed.hasMacros === true);
4142
4149
  setHasDigitalSignatures(parsed.hasDigitalSignatures === true);
4143
4150
  setDigitalSignatureCount(parsed.digitalSignatureCount ?? 0);
@@ -6490,16 +6497,18 @@ function useSlideManagement(input) {
6490
6497
  canvasSize,
6491
6498
  theme
6492
6499
  } = input;
6493
- const handleAddSlide = () => {
6500
+ const handleAddSlideAfter = (afterIndex) => {
6501
+ const insertAt = Math.max(0, Math.min(afterIndex + 1, slides.length));
6494
6502
  const newSlide = createBlankSlide(slides.length + 1);
6495
6503
  ops.updateSlides((prev) => {
6496
6504
  const next = [...prev];
6497
- next.splice(activeSlideIndex + 1, 0, newSlide);
6505
+ next.splice(insertAt, 0, newSlide);
6498
6506
  return next;
6499
6507
  });
6500
- setActiveSlideIndex(activeSlideIndex + 1);
6508
+ setActiveSlideIndex(insertAt);
6501
6509
  history.markDirty();
6502
6510
  };
6511
+ const handleAddSlide = () => handleAddSlideAfter(activeSlideIndex);
6503
6512
  const handleMoveSlide = (fromIndex, toIndex) => {
6504
6513
  if (fromIndex === toIndex) {
6505
6514
  return;
@@ -6629,6 +6638,7 @@ function useSlideManagement(input) {
6629
6638
  };
6630
6639
  return {
6631
6640
  handleAddSlide,
6641
+ handleAddSlideAfter,
6632
6642
  handleMoveSlide,
6633
6643
  handleSlideContextMenu,
6634
6644
  handleDeleteSlides,
@@ -7043,22 +7053,6 @@ function useExportSaveAs(input) {
7043
7053
  };
7044
7054
  }
7045
7055
 
7046
- // src/viewer/utils/dom-helpers.ts
7047
- function safePrompt(message, defaultValue) {
7048
- try {
7049
- return window.prompt(message, defaultValue);
7050
- } catch {
7051
- return null;
7052
- }
7053
- }
7054
- function safeConfirm(message) {
7055
- try {
7056
- return window.confirm(message);
7057
- } catch {
7058
- return false;
7059
- }
7060
- }
7061
-
7062
7056
  // src/viewer/utils/export-helpers.ts
7063
7057
  function ignoreExportOverlayElements(el) {
7064
7058
  const htmlEl = el;
@@ -7115,9 +7109,9 @@ async function renderElementToTiles(element, scale = 2, backgroundColor, mode =
7115
7109
  buildRasterOptions(element, scale, backgroundColor, mode)
7116
7110
  );
7117
7111
  }
7118
- async function renderElementToClampedCanvas(element, scale = 2, backgroundColor, mode = "auto") {
7112
+ async function renderElementToTiledCanvas(element, scale = 2, backgroundColor, mode = "auto") {
7119
7113
  const { width, height } = measureNaturalSize(element);
7120
- return rasterizeElementClampedToCanvas(
7114
+ return rasterizeElementTiledToCanvas(
7121
7115
  element,
7122
7116
  width,
7123
7117
  height,
@@ -7161,7 +7155,7 @@ async function captureAllSlidesAsPngDataUrls(slideStageRef, totalSlides, setActi
7161
7155
  console.warn(`[export] Could not find slide stage element for slide ${i}`);
7162
7156
  continue;
7163
7157
  }
7164
- const { canvas } = await renderElementToClampedCanvas(stageEl, scale);
7158
+ const { canvas } = await renderElementToTiledCanvas(stageEl, scale);
7165
7159
  dataUrls.push(canvas.toDataURL("image/png"));
7166
7160
  }
7167
7161
  onProgress?.(totalSlides, totalSlides);
@@ -7223,7 +7217,7 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
7223
7217
  console.warn(`[export] Could not find slide stage element for slide ${i}`);
7224
7218
  continue;
7225
7219
  }
7226
- const { canvas } = await renderElementToClampedCanvas(stageEl, scale);
7220
+ const { canvas } = await renderElementToTiledCanvas(stageEl, scale);
7227
7221
  pages.push({
7228
7222
  canvas,
7229
7223
  notes: slideNotes[i],
@@ -7262,7 +7256,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
7262
7256
  console.warn(`[export] Could not find slide stage element for slide ${i}`);
7263
7257
  continue;
7264
7258
  }
7265
- const { canvas } = await renderElementToClampedCanvas(stageEl, scale);
7259
+ const { canvas } = await renderElementToTiledCanvas(stageEl, scale);
7266
7260
  slideCanvases.push(canvas);
7267
7261
  }
7268
7262
  setActiveSlide(currentSlideIndex);
@@ -7323,8 +7317,34 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
7323
7317
  }
7324
7318
 
7325
7319
  // src/viewer/utils/export-gif.ts
7320
+ function frameFromCanvas(canvas, maxSide) {
7321
+ const { width, height } = clampGifDimensions(canvas.width, canvas.height, maxSide);
7322
+ let source = canvas;
7323
+ if (width !== canvas.width || height !== canvas.height) {
7324
+ const scaled = canvas.ownerDocument.createElement("canvas");
7325
+ scaled.width = width;
7326
+ scaled.height = height;
7327
+ const scaledCtx = scaled.getContext("2d");
7328
+ if (!scaledCtx) {
7329
+ return void 0;
7330
+ }
7331
+ scaledCtx.drawImage(canvas, 0, 0, width, height);
7332
+ source = scaled;
7333
+ }
7334
+ const ctx = source.getContext("2d");
7335
+ if (!ctx) {
7336
+ return void 0;
7337
+ }
7338
+ return { imageData: ctx.getImageData(0, 0, width, height), width, height };
7339
+ }
7326
7340
  async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, options = {}) {
7327
- const { scale = 0.5, slideDurationMs = 2e3, onProgress, signal } = options;
7341
+ const {
7342
+ scale = 0.5,
7343
+ slideDurationMs = 2e3,
7344
+ maxSide = GIF_POST_CAPTURE_MAX_SIDE,
7345
+ onProgress,
7346
+ signal
7347
+ } = options;
7328
7348
  const frames = [];
7329
7349
  for (let i = 0; i < totalSlides; i++) {
7330
7350
  if (signal?.aborted) {
@@ -7337,17 +7357,12 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
7337
7357
  if (!stageEl) {
7338
7358
  continue;
7339
7359
  }
7340
- const { canvas } = await renderElementToClampedCanvas(stageEl, scale);
7341
- const ctx = canvas.getContext("2d");
7342
- if (!ctx) {
7360
+ const { canvas } = await renderElementToTiledCanvas(stageEl, scale);
7361
+ const frame = frameFromCanvas(canvas, maxSide);
7362
+ if (!frame) {
7343
7363
  continue;
7344
7364
  }
7345
- const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
7346
- frames.push({
7347
- imageData,
7348
- width: canvas.width,
7349
- height: canvas.height
7350
- });
7365
+ frames.push(frame);
7351
7366
  }
7352
7367
  setActiveSlide(currentSlideIndex);
7353
7368
  if (frames.length === 0) {
@@ -7418,6 +7433,149 @@ function exportAllSlidesToSvg(data, options = {}) {
7418
7433
  return results;
7419
7434
  }
7420
7435
 
7436
+ // src/viewer/utils/dom-helpers.ts
7437
+ function safePrompt(message, defaultValue) {
7438
+ try {
7439
+ return window.prompt(message, defaultValue);
7440
+ } catch {
7441
+ return null;
7442
+ }
7443
+ }
7444
+ function safeConfirm(message) {
7445
+ try {
7446
+ return window.confirm(message);
7447
+ } catch {
7448
+ return false;
7449
+ }
7450
+ }
7451
+
7452
+ // src/viewer/hooks/useExportMediaHandlers.ts
7453
+ function useExportMediaHandlers(input) {
7454
+ const {
7455
+ slides,
7456
+ activeSlideIndex,
7457
+ canvasStageRef,
7458
+ setActiveSlideIndex,
7459
+ imageResolutionScale = 1,
7460
+ exportAbortRef,
7461
+ setExportModalOpen,
7462
+ setExportModalTitle,
7463
+ setExportProgress,
7464
+ setExportStatusMessage
7465
+ } = input;
7466
+ const handleExportVideo = useCallback(async () => {
7467
+ if (!canvasStageRef.current) {
7468
+ return;
7469
+ }
7470
+ const abortCtrl = new AbortController();
7471
+ exportAbortRef.current = abortCtrl;
7472
+ setExportModalTitle("Export as Video");
7473
+ setExportStatusMessage("Capturing slides...");
7474
+ setExportProgress(0);
7475
+ setExportModalOpen(true);
7476
+ try {
7477
+ const { scale } = resolveExportCaptureDecision(imageResolutionScale, "video");
7478
+ const blob = await exportAllSlidesAsVideo(
7479
+ canvasStageRef,
7480
+ slides.length,
7481
+ setActiveSlideIndex,
7482
+ activeSlideIndex,
7483
+ {
7484
+ scale,
7485
+ slideDurationMs: 3e3,
7486
+ onProgress: (current, total) => {
7487
+ setExportProgress(slideProgressPercent(current, total, 45));
7488
+ setExportStatusMessage(slideStatusLabel("Capturing", current, total));
7489
+ },
7490
+ onRecordProgress: (current, total) => {
7491
+ setExportProgress(recordProgressPercent(current, total));
7492
+ setExportStatusMessage(slideStatusLabel("Recording", current, total));
7493
+ },
7494
+ signal: abortCtrl.signal
7495
+ }
7496
+ );
7497
+ setExportProgress(EXPORT_ASSEMBLING_PERCENT);
7498
+ setExportStatusMessage("Saving file...");
7499
+ downloadBlob(blob, "presentation.webm");
7500
+ setExportProgress(EXPORT_DONE_PERCENT);
7501
+ } catch (err) {
7502
+ if (!isExportAbortError(err)) {
7503
+ console.error("[PowerPointViewer] Video export failed:", err);
7504
+ }
7505
+ } finally {
7506
+ exportAbortRef.current = null;
7507
+ setExportModalOpen(false);
7508
+ }
7509
+ }, [
7510
+ canvasStageRef,
7511
+ slides.length,
7512
+ setActiveSlideIndex,
7513
+ activeSlideIndex,
7514
+ imageResolutionScale,
7515
+ exportAbortRef,
7516
+ setExportModalOpen,
7517
+ setExportModalTitle,
7518
+ setExportProgress,
7519
+ setExportStatusMessage
7520
+ ]);
7521
+ const handleExportGif = useCallback(async () => {
7522
+ if (!canvasStageRef.current) {
7523
+ return;
7524
+ }
7525
+ const abortCtrl = new AbortController();
7526
+ exportAbortRef.current = abortCtrl;
7527
+ setExportModalTitle("Export as GIF");
7528
+ setExportStatusMessage("Capturing slides...");
7529
+ setExportProgress(0);
7530
+ setExportModalOpen(true);
7531
+ try {
7532
+ const { scale, postCaptureMaxSide } = resolveExportCaptureDecision(
7533
+ imageResolutionScale,
7534
+ "gif"
7535
+ );
7536
+ const blob = await exportAllSlidesAsGif(
7537
+ canvasStageRef,
7538
+ slides.length,
7539
+ setActiveSlideIndex,
7540
+ activeSlideIndex,
7541
+ {
7542
+ scale,
7543
+ maxSide: postCaptureMaxSide,
7544
+ slideDurationMs: 2e3,
7545
+ onProgress: (current, total) => {
7546
+ setExportProgress(slideProgressPercent(current, total));
7547
+ setExportStatusMessage(slideStatusLabel("Encoding", current, total));
7548
+ },
7549
+ signal: abortCtrl.signal
7550
+ }
7551
+ );
7552
+ setExportProgress(EXPORT_ASSEMBLING_PERCENT);
7553
+ setExportStatusMessage("Saving file...");
7554
+ downloadBlob(blob, "presentation.gif");
7555
+ setExportProgress(EXPORT_DONE_PERCENT);
7556
+ } catch (err) {
7557
+ if (!isExportAbortError(err)) {
7558
+ console.error("[PowerPointViewer] GIF export failed:", err);
7559
+ }
7560
+ } finally {
7561
+ exportAbortRef.current = null;
7562
+ setExportModalOpen(false);
7563
+ }
7564
+ }, [
7565
+ canvasStageRef,
7566
+ slides.length,
7567
+ setActiveSlideIndex,
7568
+ activeSlideIndex,
7569
+ imageResolutionScale,
7570
+ exportAbortRef,
7571
+ setExportModalOpen,
7572
+ setExportModalTitle,
7573
+ setExportProgress,
7574
+ setExportStatusMessage
7575
+ ]);
7576
+ return { handleExportVideo, handleExportGif };
7577
+ }
7578
+
7421
7579
  // src/viewer/hooks/useExportHandlers.ts
7422
7580
  function useExportHandlers(input) {
7423
7581
  const {
@@ -7442,13 +7600,26 @@ function useExportHandlers(input) {
7442
7600
  theme,
7443
7601
  canvasSize,
7444
7602
  slideSizeEmu,
7445
- imageExportScale
7603
+ imageExportScale,
7604
+ imageResolutionScale
7446
7605
  } = input;
7447
7606
  const [exportModalOpen, setExportModalOpen] = useState(false);
7448
7607
  const [exportModalTitle, setExportModalTitle] = useState("");
7449
7608
  const [exportProgress, setExportProgress] = useState(0);
7450
7609
  const [exportStatusMessage, setExportStatusMessage] = useState("");
7451
7610
  const exportAbortRef = useRef(null);
7611
+ const { handleExportVideo, handleExportGif } = useExportMediaHandlers({
7612
+ slides,
7613
+ activeSlideIndex,
7614
+ canvasStageRef,
7615
+ setActiveSlideIndex,
7616
+ imageResolutionScale,
7617
+ exportAbortRef,
7618
+ setExportModalOpen,
7619
+ setExportModalTitle,
7620
+ setExportProgress,
7621
+ setExportStatusMessage
7622
+ });
7452
7623
  const {
7453
7624
  handleExportJson,
7454
7625
  handleSaveAsFormat,
@@ -7589,88 +7760,6 @@ function useExportHandlers(input) {
7589
7760
  console.error("[PowerPointViewer] Copy slide as image failed:", err);
7590
7761
  }
7591
7762
  }, [canvasStageRef, activeSlide?.backgroundColor, imageExportScale]);
7592
- const handleExportVideo = useCallback(async () => {
7593
- if (!canvasStageRef.current) {
7594
- return;
7595
- }
7596
- const abortCtrl = new AbortController();
7597
- exportAbortRef.current = abortCtrl;
7598
- setExportModalTitle("Export as Video");
7599
- setExportStatusMessage("Capturing slides...");
7600
- setExportProgress(0);
7601
- setExportModalOpen(true);
7602
- try {
7603
- const blob = await exportAllSlidesAsVideo(
7604
- canvasStageRef,
7605
- slides.length,
7606
- setActiveSlideIndex,
7607
- activeSlideIndex,
7608
- {
7609
- scale: 1,
7610
- slideDurationMs: 3e3,
7611
- onProgress: (current, total) => {
7612
- setExportProgress(slideProgressPercent(current, total, 45));
7613
- setExportStatusMessage(slideStatusLabel("Capturing", current, total));
7614
- },
7615
- onRecordProgress: (current, total) => {
7616
- setExportProgress(recordProgressPercent(current, total));
7617
- setExportStatusMessage(slideStatusLabel("Recording", current, total));
7618
- },
7619
- signal: abortCtrl.signal
7620
- }
7621
- );
7622
- setExportProgress(EXPORT_ASSEMBLING_PERCENT);
7623
- setExportStatusMessage("Saving file...");
7624
- downloadBlob(blob, "presentation.webm");
7625
- setExportProgress(EXPORT_DONE_PERCENT);
7626
- } catch (err) {
7627
- if (!isExportAbortError(err)) {
7628
- console.error("[PowerPointViewer] Video export failed:", err);
7629
- }
7630
- } finally {
7631
- exportAbortRef.current = null;
7632
- setExportModalOpen(false);
7633
- }
7634
- }, [canvasStageRef, slides.length, setActiveSlideIndex, activeSlideIndex]);
7635
- const handleExportGif = useCallback(async () => {
7636
- if (!canvasStageRef.current) {
7637
- return;
7638
- }
7639
- const abortCtrl = new AbortController();
7640
- exportAbortRef.current = abortCtrl;
7641
- setExportModalTitle("Export as GIF");
7642
- setExportStatusMessage("Capturing slides...");
7643
- setExportProgress(0);
7644
- setExportModalOpen(true);
7645
- try {
7646
- const blob = await exportAllSlidesAsGif(
7647
- canvasStageRef,
7648
- slides.length,
7649
- setActiveSlideIndex,
7650
- activeSlideIndex,
7651
- {
7652
- scale: 0.5,
7653
- slideDurationMs: 2e3,
7654
- onProgress: (current, total) => {
7655
- setExportProgress(slideProgressPercent(current, total));
7656
- setExportStatusMessage(slideStatusLabel("Encoding", current, total));
7657
- },
7658
- signal: abortCtrl.signal
7659
- }
7660
- );
7661
- setExportProgress(EXPORT_ASSEMBLING_PERCENT);
7662
- setExportStatusMessage("Saving file...");
7663
- downloadBlob(blob, "presentation.gif");
7664
- setExportProgress(EXPORT_DONE_PERCENT);
7665
- } catch (err) {
7666
- if (!isExportAbortError(err)) {
7667
- console.error("[PowerPointViewer] GIF export failed:", err);
7668
- }
7669
- } finally {
7670
- exportAbortRef.current = null;
7671
- setExportModalOpen(false);
7672
- }
7673
- }, [canvasStageRef, slides.length, setActiveSlideIndex, activeSlideIndex]);
7674
7763
  const handleCancelExport = useCallback(() => {
7675
7764
  exportAbortRef.current?.abort();
7676
7765
  exportAbortRef.current = null;
@@ -9284,7 +9373,8 @@ function useIOHandlers(input) {
9284
9373
  serializeForRecovery,
9285
9374
  setContent,
9286
9375
  onContentChange,
9287
- imageExportScale
9376
+ imageExportScale,
9377
+ imageResolutionScale
9288
9378
  } = input;
9289
9379
  const exportHandlers = useExportHandlers({
9290
9380
  slides,
@@ -9308,7 +9398,8 @@ function useIOHandlers(input) {
9308
9398
  theme: state.theme,
9309
9399
  canvasSize,
9310
9400
  slideSizeEmu: state.slideSizeEmu,
9311
- imageExportScale
9401
+ imageExportScale,
9402
+ imageResolutionScale
9312
9403
  });
9313
9404
  const printHandlers = usePrintHandlers({
9314
9405
  slides,
@@ -9442,6 +9533,52 @@ function useFontInjection({ embeddedFonts, slides }) {
9442
9533
  }
9443
9534
  };
9444
9535
  }, [embeddedFonts, slides]);
9536
+ const [, setOutlineFontsTick] = useState(0);
9537
+ useEffect(() => {
9538
+ let cancelled = false;
9539
+ const referenced = collectReferencedFontFamilies(slides);
9540
+ const candidates = selectGoogleWebfontFamilies(
9541
+ referenced,
9542
+ embeddedFonts.map((font) => font.name)
9543
+ );
9544
+ if (candidates.length === 0) {
9545
+ return;
9546
+ }
9547
+ void resolveGoogleWebfontHref(slides, embeddedFonts).then(async (href) => {
9548
+ if (cancelled || !href) {
9549
+ return;
9550
+ }
9551
+ const boldItalicVariants = [
9552
+ { bold: false, italic: false },
9553
+ { bold: true, italic: false }
9554
+ ];
9555
+ let registeredAny = false;
9556
+ for (const family of candidates) {
9557
+ for (const variant of boldItalicVariants) {
9558
+ if (cancelled) {
9559
+ return;
9560
+ }
9561
+ const bytes = await fetchGoogleWebfontOutlineBytes(
9562
+ href,
9563
+ family,
9564
+ variant.bold,
9565
+ variant.italic,
9566
+ fetch
9567
+ );
9568
+ if (bytes && glyphOutlineFontCache.registerFontBytes(family, variant.bold, variant.italic, bytes)) {
9569
+ registeredAny = true;
9570
+ }
9571
+ }
9572
+ }
9573
+ if (registeredAny && !cancelled) {
9574
+ setOutlineFontsTick((tick) => tick + 1);
9575
+ }
9576
+ return void 0;
9577
+ });
9578
+ return () => {
9579
+ cancelled = true;
9580
+ };
9581
+ }, [embeddedFonts, slides]);
9445
9582
  useEffect(() => {
9446
9583
  const neededSymbolFonts = SYMBOL_FONT_FAMILIES.filter((f) => referencedFamilies.has(f));
9447
9584
  if (neededSymbolFonts.length === 0) {
@@ -9809,6 +9946,7 @@ function useViewerIntegration(input) {
9809
9946
  canEdit,
9810
9947
  promptKeepInkAnnotations,
9811
9948
  imageExportScale,
9949
+ imageResolutionScale,
9812
9950
  mode,
9813
9951
  slides,
9814
9952
  activeSlide,
@@ -9894,7 +10032,8 @@ function useViewerIntegration(input) {
9894
10032
  serializeForRecovery,
9895
10033
  setContent,
9896
10034
  onContentChange,
9897
- imageExportScale
10035
+ imageExportScale,
10036
+ imageResolutionScale
9898
10037
  });
9899
10038
  const {
9900
10039
  showKeepAnnotationsDialog,
@@ -10017,8 +10156,12 @@ function useViewerIntegration(input) {
10017
10156
  return slides[activeSlideIndex];
10018
10157
  },
10019
10158
  // -- Slide manipulation --
10020
- addSlide(_afterIndex) {
10021
- editorOps.slideOps.handleAddSlide();
10159
+ addSlide(afterIndex) {
10160
+ if (afterIndex === void 0) {
10161
+ editorOps.slideOps.handleAddSlide();
10162
+ } else {
10163
+ editorOps.slideOps.handleAddSlideAfter(afterIndex);
10164
+ }
10022
10165
  },
10023
10166
  deleteSlides(indexes) {
10024
10167
  editorOps.slideOps.handleDeleteSlides(indexes);
@@ -10560,7 +10703,7 @@ function useLayoutSwitching(input) {
10560
10703
  currentLayoutPath
10561
10704
  };
10562
10705
  }
10563
- var MIN_TOUCH_TARGET = 44;
10706
+ var MIN_TOUCH_TARGET = MIN_TOUCH_TARGET_PX;
10564
10707
  function subscribeTouchCapability(callback) {
10565
10708
  if (typeof window === "undefined") {
10566
10709
  return () => {
@@ -10645,7 +10788,9 @@ function useIsMobile() {
10645
10788
  isDesktop,
10646
10789
  isTouchDevice,
10647
10790
  orientation,
10648
- isVirtualKeyboardOpen
10791
+ isVirtualKeyboardOpen,
10792
+ viewportWidth,
10793
+ viewportHeight
10649
10794
  };
10650
10795
  }
10651
10796
  function useTouchGestures(input) {
@@ -11349,6 +11494,7 @@ function useViewerBuildingBlocksCore(input) {
11349
11494
  // Multiplied against the pre-existing 2x baseline; see the matching
11350
11495
  // comment in `PowerPointViewer.tsx`.
11351
11496
  imageExportScale: 2 * resolveImageResolutionScale(viewerOptions),
11497
+ imageResolutionScale: resolveImageResolutionScale(viewerOptions),
11352
11498
  viewerOptions
11353
11499
  };
11354
11500
  }
@@ -11531,6 +11677,7 @@ function useViewerBuildingBlocksState(input) {
11531
11677
  actionSoundHandlerRef,
11532
11678
  gridSpacingPx,
11533
11679
  imageExportScale,
11680
+ imageResolutionScale,
11534
11681
  setExitModeHandler,
11535
11682
  viewerOptions
11536
11683
  } = core;
@@ -11616,6 +11763,7 @@ function useViewerBuildingBlocksState(input) {
11616
11763
  canEdit,
11617
11764
  promptKeepInkAnnotations: viewerOptions.advanced.slideShowPromptKeepInkAnnotations,
11618
11765
  imageExportScale,
11766
+ imageResolutionScale,
11619
11767
  mode,
11620
11768
  slides,
11621
11769
  activeSlide,
@@ -11873,4 +12021,4 @@ function useResizablePanels() {
11873
12021
  };
11874
12022
  }
11875
12023
 
11876
- export { ACTION_VERB_MAP, MIN_TOUCH_TARGET, ViewerOptionsContext, computeToolbarVisibility, detectTargetType, isAudienceTab, parseAudienceNonce, parseEmailUrl, parseSlideFromUrl, playAnimationSound, renderToCanvas, safePrompt, scopeLayoutOptionsToActiveSlide, syncSelectionHandleOverlay, useAnimationPlayback, useAnnotationHandlers, useAudienceMode, useAutosave, useBroadcastFollower, useCanvasInteractions, useClipboardHandlers, useCollaborationLivePatch, useCollaborativeHistory, useCollaborativeState, useComments, useCompatibilityToastsState, useContentLifecycle, useDerivedElementState, useDerivedSlideState, useDialogCustomShows, useEditorHistory, useEditorOperations, useElementManipulation, useElementOperations, useExportHandlers, useExportSaveAs, useFindReplace, useFollowMode, useFontInjection, useGroupAlignLayerHandlers, useIOHandlers, useInsertElements, useIsMobile, useKeyboardInsets, useKeyboardShortcutWiring, useKeyboardShortcuts, useLayoutSwitching, useLoadContent, useMergeShapesHandler, useModalDismissDrag, usePointerHandlers, usePresenceTracking, usePresentationAnnotations, usePresentationKeyboard, usePresentationMode, usePresentationSetup, usePresenterWindow, usePrintHandlers, usePropertyHandlers, useReadOnlyRecommendationState, useRecoveryDetection, useReducedMotion, useRehearsalTimings, useResizablePanels, useSectionOperations, useSerialize, useSheetDismissDrag, useSlideManagement, useSlideNavigation, useSwipeNavigation, useTableOperations, useThemeHandlers, useThemeSwitching, useToolbarVisibility, useTouchGestures, useViewPreferencesSync, useViewerBuildingBlocks, useViewerCoreState, useViewerDialogs, useViewerIntegration, useViewerOptions, useViewerOptionsContext, useViewerState, useViewerUIState, useVirtualizedSlides, useYjsDocumentSync, useYjsProvider, useZoomNavigation, useZoomViewport };
12024
+ export { ACTION_VERB_MAP, MIN_TOUCH_TARGET, ViewerOptionsContext, computeToolbarVisibility, detectTargetType, getGlyphOutline, isAudienceTab, parseAudienceNonce, parseEmailUrl, parseSlideFromUrl, playAnimationSound, renderToCanvas, safePrompt, scopeLayoutOptionsToActiveSlide, syncSelectionHandleOverlay, useAnimationPlayback, useAnnotationHandlers, useAudienceMode, useAutosave, useBroadcastFollower, useCanvasInteractions, useClipboardHandlers, useCollaborationLivePatch, useCollaborativeHistory, useCollaborativeState, useComments, useCompatibilityToastsState, useContentLifecycle, useDerivedElementState, useDerivedSlideState, useDialogCustomShows, useEditorHistory, useEditorOperations, useElementManipulation, useElementOperations, useExportHandlers, useExportSaveAs, useFindReplace, useFollowMode, useFontInjection, useGroupAlignLayerHandlers, useIOHandlers, useInsertElements, useIsMobile, useKeyboardInsets, useKeyboardShortcutWiring, useKeyboardShortcuts, useLayoutSwitching, useLoadContent, useMergeShapesHandler, useModalDismissDrag, usePointerHandlers, usePresenceTracking, usePresentationAnnotations, usePresentationKeyboard, usePresentationMode, usePresentationSetup, usePresenterWindow, usePrintHandlers, usePropertyHandlers, useReadOnlyRecommendationState, useRecoveryDetection, useReducedMotion, useRehearsalTimings, useResizablePanels, useSectionOperations, useSerialize, useSheetDismissDrag, useSlideManagement, useSlideNavigation, useSwipeNavigation, useTableOperations, useThemeHandlers, useThemeSwitching, useToolbarVisibility, useTouchGestures, useViewPreferencesSync, useViewerBuildingBlocks, useViewerCoreState, useViewerDialogs, useViewerIntegration, useViewerOptions, useViewerOptionsContext, useViewerState, useViewerUIState, useVirtualizedSlides, useYjsDocumentSync, useYjsProvider, useZoomNavigation, useZoomViewport };
Binary file
Binary file