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.
- package/CHANGELOG.md +42 -0
- package/dist/{AiChatPanel-E53JJRZX.js → AiChatPanel-7CWOJ3PS.js} +32 -32
- package/dist/AiChatPanel-7CWOJ3PS.js.br +0 -0
- package/dist/AiChatPanel-7CWOJ3PS.js.gz +0 -0
- package/dist/{AiChatPanel-JTXC5WWH.mjs → AiChatPanel-TBIAQSZ7.mjs} +11 -11
- package/dist/AiChatPanel-TBIAQSZ7.mjs.br +0 -0
- package/dist/AiChatPanel-TBIAQSZ7.mjs.gz +0 -0
- package/dist/{Area3DChartScene-JQ2VU73H.mjs → Area3DChartScene-6FFBYPHF.mjs} +1 -1
- package/dist/Area3DChartScene-6FFBYPHF.mjs.br +0 -0
- package/dist/Area3DChartScene-6FFBYPHF.mjs.gz +0 -0
- package/dist/{Area3DChartScene-J7G54OH4.js → Area3DChartScene-ZJYR6K66.js} +2 -2
- package/dist/Area3DChartScene-ZJYR6K66.js.br +0 -0
- package/dist/Area3DChartScene-ZJYR6K66.js.gz +0 -0
- package/dist/{Bar3DChartScene-5HC7LYBH.mjs → Bar3DChartScene-42MWINQX.mjs} +1 -1
- package/dist/Bar3DChartScene-42MWINQX.mjs.br +0 -0
- package/dist/Bar3DChartScene-42MWINQX.mjs.gz +0 -0
- package/dist/{Bar3DChartScene-JV3A2P6O.js → Bar3DChartScene-JP3BXEZW.js} +2 -2
- package/dist/Bar3DChartScene-JP3BXEZW.js.br +0 -0
- package/dist/Bar3DChartScene-JP3BXEZW.js.gz +0 -0
- package/dist/{Line3DChartScene-7SN7TVKQ.js → Line3DChartScene-JK3AELXZ.js} +2 -2
- package/dist/Line3DChartScene-JK3AELXZ.js.br +0 -0
- package/dist/Line3DChartScene-JK3AELXZ.js.gz +0 -0
- package/dist/{Line3DChartScene-4ZAOOU7U.mjs → Line3DChartScene-YVCSJMWK.mjs} +1 -1
- package/dist/Line3DChartScene-YVCSJMWK.mjs.br +0 -0
- package/dist/Line3DChartScene-YVCSJMWK.mjs.gz +0 -0
- package/dist/{Model3DScene-GQANXXQD.js → Model3DScene-N6UIMN7T.js} +2 -2
- package/dist/Model3DScene-N6UIMN7T.js.br +0 -0
- package/dist/Model3DScene-N6UIMN7T.js.gz +0 -0
- package/dist/{Model3DScene-GWIBUQ2U.mjs → Model3DScene-OXWSYHHK.mjs} +1 -1
- package/dist/{Model3DScene-GWIBUQ2U.mjs.br → Model3DScene-OXWSYHHK.mjs.br} +0 -0
- package/dist/Model3DScene-OXWSYHHK.mjs.gz +0 -0
- package/dist/{PieChart3DScene-QPFDRMEA.js → PieChart3DScene-Q2Z3ECL4.js} +2 -2
- package/dist/PieChart3DScene-Q2Z3ECL4.js.br +0 -0
- package/dist/PieChart3DScene-Q2Z3ECL4.js.gz +0 -0
- package/dist/{PieChart3DScene-RDTOLFTD.mjs → PieChart3DScene-XK4ETZJC.mjs} +1 -1
- package/dist/PieChart3DScene-XK4ETZJC.mjs.br +0 -0
- package/dist/PieChart3DScene-XK4ETZJC.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-5JQCRWA5.mjs → SurfaceChart3DScene-KNWMKMOL.mjs} +1 -1
- package/dist/SurfaceChart3DScene-KNWMKMOL.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-KNWMKMOL.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-JLYGC7QU.js → SurfaceChart3DScene-ULBUIF7T.js} +2 -2
- package/dist/SurfaceChart3DScene-ULBUIF7T.js.br +0 -0
- package/dist/SurfaceChart3DScene-ULBUIF7T.js.gz +0 -0
- package/dist/{chunk-TWUAZRCG.js → chunk-5KAMDV37.js} +143233 -141589
- package/dist/chunk-5KAMDV37.js.br +0 -0
- package/dist/chunk-5KAMDV37.js.gz +0 -0
- package/dist/{chunk-PKHTTHA2.mjs → chunk-6547ZWC7.mjs} +323 -171
- package/dist/chunk-6547ZWC7.mjs.br +0 -0
- package/dist/chunk-6547ZWC7.mjs.gz +0 -0
- package/dist/{chunk-HB7DJENT.mjs → chunk-AT4BJKON.mjs} +1 -1
- package/dist/chunk-AT4BJKON.mjs.br +0 -0
- package/dist/chunk-AT4BJKON.mjs.gz +0 -0
- package/dist/{chunk-M7SNS3DQ.mjs → chunk-C4Q4WYAJ.mjs} +275 -127
- package/dist/chunk-C4Q4WYAJ.mjs.br +0 -0
- package/dist/chunk-C4Q4WYAJ.mjs.gz +0 -0
- package/dist/{chunk-IVCYND7A.js → chunk-GLY4OPMY.js} +167 -167
- package/dist/chunk-GLY4OPMY.js.br +0 -0
- package/dist/chunk-GLY4OPMY.js.gz +0 -0
- package/dist/{chunk-Y3SA5H5H.mjs → chunk-J7Q7AGN7.mjs} +1 -1
- package/dist/chunk-J7Q7AGN7.mjs.br +0 -0
- package/dist/chunk-J7Q7AGN7.mjs.gz +0 -0
- package/dist/{chunk-H3GHGSGW.js → chunk-LAB7WX2N.js} +700 -551
- package/dist/chunk-LAB7WX2N.js.br +0 -0
- package/dist/chunk-LAB7WX2N.js.gz +0 -0
- package/dist/{chunk-UGVPKJSU.js → chunk-Q6CSZ7VM.js} +1568 -1416
- package/dist/chunk-Q6CSZ7VM.js.br +0 -0
- package/dist/chunk-Q6CSZ7VM.js.gz +0 -0
- package/dist/{chunk-G2Z7QULX.js → chunk-VVJTEFGP.js} +5 -5
- package/dist/chunk-VVJTEFGP.js.br +0 -0
- package/dist/chunk-VVJTEFGP.js.gz +0 -0
- package/dist/{chunk-TS2DHMBS.mjs → chunk-YNTZCMRI.mjs} +143222 -141589
- package/dist/chunk-YNTZCMRI.mjs.br +0 -0
- package/dist/chunk-YNTZCMRI.mjs.gz +0 -0
- package/dist/index.d.ts +54 -1
- package/dist/index.js +45 -45
- package/dist/index.js.br +0 -0
- package/dist/index.js.gz +0 -0
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.br +0 -0
- package/dist/index.mjs.gz +0 -0
- package/dist/internals.d.ts +88 -2
- package/dist/internals.d.ts.map +1 -1
- package/dist/internals.js +78 -78
- package/dist/internals.js.br +0 -0
- package/dist/internals.js.gz +0 -0
- package/dist/internals.mjs +3 -3
- package/dist/internals.mjs.br +0 -0
- package/dist/internals.mjs.gz +0 -0
- package/dist/pptx-viewer.css +1 -1
- package/dist/pptx-viewer.css.br +0 -0
- package/dist/pptx-viewer.css.gz +0 -0
- package/dist/viewer/index.d.ts +54 -1
- package/dist/viewer/index.js +26 -26
- package/dist/viewer/index.js.br +0 -0
- package/dist/viewer/index.js.gz +0 -0
- package/dist/viewer/index.mjs +5 -5
- package/dist/viewer/index.mjs.br +0 -0
- package/dist/viewer/index.mjs.gz +0 -0
- package/package.json +3 -1
- package/dist/AiChatPanel-E53JJRZX.js.br +0 -0
- package/dist/AiChatPanel-E53JJRZX.js.gz +0 -0
- package/dist/AiChatPanel-JTXC5WWH.mjs.br +0 -0
- package/dist/AiChatPanel-JTXC5WWH.mjs.gz +0 -0
- package/dist/Area3DChartScene-J7G54OH4.js.br +0 -0
- package/dist/Area3DChartScene-J7G54OH4.js.gz +0 -0
- package/dist/Area3DChartScene-JQ2VU73H.mjs.br +0 -0
- package/dist/Area3DChartScene-JQ2VU73H.mjs.gz +0 -0
- package/dist/Bar3DChartScene-5HC7LYBH.mjs.br +0 -0
- package/dist/Bar3DChartScene-5HC7LYBH.mjs.gz +0 -0
- package/dist/Bar3DChartScene-JV3A2P6O.js.br +0 -0
- package/dist/Bar3DChartScene-JV3A2P6O.js.gz +0 -0
- package/dist/Line3DChartScene-4ZAOOU7U.mjs.br +0 -0
- package/dist/Line3DChartScene-4ZAOOU7U.mjs.gz +0 -0
- package/dist/Line3DChartScene-7SN7TVKQ.js.br +0 -0
- package/dist/Line3DChartScene-7SN7TVKQ.js.gz +0 -0
- package/dist/Model3DScene-GQANXXQD.js.br +0 -0
- package/dist/Model3DScene-GQANXXQD.js.gz +0 -0
- package/dist/Model3DScene-GWIBUQ2U.mjs.gz +0 -0
- package/dist/PieChart3DScene-QPFDRMEA.js.br +0 -0
- package/dist/PieChart3DScene-QPFDRMEA.js.gz +0 -0
- package/dist/PieChart3DScene-RDTOLFTD.mjs.br +0 -0
- package/dist/PieChart3DScene-RDTOLFTD.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-5JQCRWA5.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-5JQCRWA5.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-JLYGC7QU.js.br +0 -0
- package/dist/SurfaceChart3DScene-JLYGC7QU.js.gz +0 -0
- package/dist/chunk-G2Z7QULX.js.br +0 -0
- package/dist/chunk-G2Z7QULX.js.gz +0 -0
- package/dist/chunk-H3GHGSGW.js.br +0 -0
- package/dist/chunk-H3GHGSGW.js.gz +0 -0
- package/dist/chunk-HB7DJENT.mjs.br +0 -0
- package/dist/chunk-HB7DJENT.mjs.gz +0 -0
- package/dist/chunk-IVCYND7A.js.br +0 -0
- package/dist/chunk-IVCYND7A.js.gz +0 -0
- package/dist/chunk-M7SNS3DQ.mjs.br +0 -0
- package/dist/chunk-M7SNS3DQ.mjs.gz +0 -0
- package/dist/chunk-PKHTTHA2.mjs.br +0 -0
- package/dist/chunk-PKHTTHA2.mjs.gz +0 -0
- package/dist/chunk-TS2DHMBS.mjs.br +0 -0
- package/dist/chunk-TS2DHMBS.mjs.gz +0 -0
- package/dist/chunk-TWUAZRCG.js.br +0 -0
- package/dist/chunk-TWUAZRCG.js.gz +0 -0
- package/dist/chunk-UGVPKJSU.js.br +0 -0
- package/dist/chunk-UGVPKJSU.js.gz +0 -0
- package/dist/chunk-Y3SA5H5H.mjs.br +0 -0
- package/dist/chunk-Y3SA5H5H.mjs.gz +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ThemePresets, PptxMarkdownConverter, hasTextProperties, hasShapeProperties } from './chunk-
|
|
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-
|
|
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,
|
|
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
|
|
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(
|
|
6505
|
+
next.splice(insertAt, 0, newSlide);
|
|
6498
6506
|
return next;
|
|
6499
6507
|
});
|
|
6500
|
-
setActiveSlideIndex(
|
|
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
|
|
7112
|
+
async function renderElementToTiledCanvas(element, scale = 2, backgroundColor, mode = "auto") {
|
|
7119
7113
|
const { width, height } = measureNaturalSize(element);
|
|
7120
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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 {
|
|
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
|
|
7341
|
-
const
|
|
7342
|
-
if (!
|
|
7360
|
+
const { canvas } = await renderElementToTiledCanvas(stageEl, scale);
|
|
7361
|
+
const frame = frameFromCanvas(canvas, maxSide);
|
|
7362
|
+
if (!frame) {
|
|
7343
7363
|
continue;
|
|
7344
7364
|
}
|
|
7345
|
-
|
|
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(
|
|
10021
|
-
|
|
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 =
|
|
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
|