pptx-react-viewer 3.1.5 → 3.3.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 +35 -0
- package/dist/{AiChatPanel-ITCVRVKP.mjs → AiChatPanel-BNFDBP4S.mjs} +9 -8
- package/dist/AiChatPanel-BNFDBP4S.mjs.br +0 -0
- package/dist/AiChatPanel-BNFDBP4S.mjs.gz +0 -0
- package/dist/{AiChatPanel-TO5PHBGW.js → AiChatPanel-WNQCTQB5.js} +29 -28
- package/dist/AiChatPanel-WNQCTQB5.js.br +0 -0
- package/dist/AiChatPanel-WNQCTQB5.js.gz +0 -0
- package/dist/{Area3DChartScene-2UNQ3J3V.js → Area3DChartScene-FXBSLIGX.js} +2 -2
- package/dist/Area3DChartScene-FXBSLIGX.js.br +0 -0
- package/dist/Area3DChartScene-FXBSLIGX.js.gz +0 -0
- package/dist/{Area3DChartScene-7PHPDOTG.mjs → Area3DChartScene-SAQVRYOH.mjs} +1 -1
- package/dist/Area3DChartScene-SAQVRYOH.mjs.br +0 -0
- package/dist/Area3DChartScene-SAQVRYOH.mjs.gz +0 -0
- package/dist/{Bar3DChartScene-MC5S3AGT.js → Bar3DChartScene-7HVUTP2E.js} +2 -2
- package/dist/Bar3DChartScene-7HVUTP2E.js.br +0 -0
- package/dist/Bar3DChartScene-7HVUTP2E.js.gz +0 -0
- package/dist/{Bar3DChartScene-BLPUHYRZ.mjs → Bar3DChartScene-LUA6E2K6.mjs} +1 -1
- package/dist/Bar3DChartScene-LUA6E2K6.mjs.br +3 -0
- package/dist/Bar3DChartScene-LUA6E2K6.mjs.gz +0 -0
- package/dist/{Line3DChartScene-L5B4YFG3.mjs → Line3DChartScene-IW4JGH57.mjs} +1 -1
- package/dist/Line3DChartScene-IW4JGH57.mjs.br +0 -0
- package/dist/Line3DChartScene-IW4JGH57.mjs.gz +0 -0
- package/dist/{Line3DChartScene-JVVZRIDD.js → Line3DChartScene-OVPULUTF.js} +2 -2
- package/dist/Line3DChartScene-OVPULUTF.js.br +0 -0
- package/dist/Line3DChartScene-OVPULUTF.js.gz +0 -0
- package/dist/{Model3DScene-LRDNQNKJ.js → Model3DScene-5KP6BVCV.js} +2 -2
- package/dist/Model3DScene-5KP6BVCV.js.br +0 -0
- package/dist/Model3DScene-5KP6BVCV.js.gz +0 -0
- package/dist/{Model3DScene-6TNWS5LV.mjs → Model3DScene-BERTZYCJ.mjs} +1 -1
- package/dist/Model3DScene-BERTZYCJ.mjs.br +0 -0
- package/dist/Model3DScene-BERTZYCJ.mjs.gz +0 -0
- package/dist/{PieChart3DScene-PZWZCXHX.js → PieChart3DScene-3R2ETTGA.js} +2 -2
- package/dist/PieChart3DScene-3R2ETTGA.js.br +0 -0
- package/dist/PieChart3DScene-3R2ETTGA.js.gz +0 -0
- package/dist/{PieChart3DScene-XXAIVP4I.mjs → PieChart3DScene-O6FFK5L7.mjs} +1 -1
- package/dist/PieChart3DScene-O6FFK5L7.mjs.br +0 -0
- package/dist/PieChart3DScene-O6FFK5L7.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-CRUGJSCY.mjs → SurfaceChart3DScene-OCR26R5D.mjs} +1 -1
- package/dist/SurfaceChart3DScene-OCR26R5D.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-OCR26R5D.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-UBQV3ZN2.js → SurfaceChart3DScene-TGFAOLHL.js} +2 -2
- package/dist/SurfaceChart3DScene-TGFAOLHL.js.br +0 -0
- package/dist/SurfaceChart3DScene-TGFAOLHL.js.gz +0 -0
- package/dist/{chunk-QOLYY7E3.mjs → chunk-2FTJAMFA.mjs} +300 -66
- package/dist/chunk-2FTJAMFA.mjs.br +0 -0
- package/dist/chunk-2FTJAMFA.mjs.gz +0 -0
- package/dist/{chunk-P3VXXUZM.mjs → chunk-3B5FRKYU.mjs} +137 -438
- package/dist/chunk-3B5FRKYU.mjs.br +0 -0
- package/dist/chunk-3B5FRKYU.mjs.gz +0 -0
- package/dist/{chunk-SWRY3SI5.js → chunk-3P7FYHJH.js} +47 -1
- package/dist/chunk-3P7FYHJH.js.br +0 -0
- package/dist/chunk-3P7FYHJH.js.gz +0 -0
- package/dist/{chunk-T2QG2HD5.js → chunk-44CQ67GQ.js} +173 -262
- package/dist/chunk-44CQ67GQ.js.br +0 -0
- package/dist/chunk-44CQ67GQ.js.gz +0 -0
- package/dist/{chunk-ARJE3V6V.mjs → chunk-AMRT3AE4.mjs} +47 -1
- package/dist/chunk-AMRT3AE4.mjs.br +0 -0
- package/dist/chunk-AMRT3AE4.mjs.gz +0 -0
- package/dist/{chunk-XIHK52SB.mjs → chunk-DM2IZCSD.mjs} +8499 -3404
- package/dist/chunk-DM2IZCSD.mjs.br +0 -0
- package/dist/chunk-DM2IZCSD.mjs.gz +0 -0
- package/dist/{chunk-LGVNUG3G.js → chunk-FSQCEAMG.js} +305 -68
- package/dist/chunk-FSQCEAMG.js.br +0 -0
- package/dist/chunk-FSQCEAMG.js.gz +0 -0
- package/dist/{chunk-LXYDXLKZ.js → chunk-GR6SJJIT.js} +463 -776
- package/dist/chunk-GR6SJJIT.js.br +0 -0
- package/dist/chunk-GR6SJJIT.js.gz +0 -0
- package/dist/{chunk-BPWSJLLG.mjs → chunk-ITN5NYYM.mjs} +10 -98
- package/dist/chunk-ITN5NYYM.mjs.br +0 -0
- package/dist/chunk-ITN5NYYM.mjs.gz +0 -0
- package/dist/{chunk-YDEEINER.js → chunk-K6R2JNCK.js} +8531 -3410
- package/dist/chunk-K6R2JNCK.js.br +0 -0
- package/dist/chunk-K6R2JNCK.js.gz +0 -0
- package/dist/{chunk-A2UAUSJM.mjs → chunk-QEEU4S4Z.mjs} +65 -378
- package/dist/chunk-QEEU4S4Z.mjs.br +0 -0
- package/dist/chunk-QEEU4S4Z.mjs.gz +0 -0
- package/dist/{chunk-ZPF4L6SD.js → chunk-QKSYKQEL.js} +1243 -1544
- package/dist/chunk-QKSYKQEL.js.br +0 -0
- package/dist/chunk-QKSYKQEL.js.gz +0 -0
- package/dist/i18n.js +4 -4
- package/dist/i18n.js.br +0 -0
- package/dist/i18n.js.gz +0 -0
- package/dist/i18n.mjs +1 -1
- package/dist/i18n.mjs.br +0 -0
- package/dist/i18n.mjs.gz +0 -0
- package/dist/index.d.ts +170 -17
- package/dist/index.js +47 -47
- package/dist/index.js.br +0 -0
- package/dist/index.js.gz +0 -0
- package/dist/index.mjs +6 -6
- package/dist/index.mjs.br +0 -0
- package/dist/index.mjs.gz +0 -0
- package/dist/internals.d.ts +170 -17
- package/dist/internals.d.ts.map +1 -1
- package/dist/internals.js +79 -79
- package/dist/internals.js.br +0 -0
- package/dist/internals.js.gz +0 -0
- package/dist/internals.mjs +4 -4
- package/dist/internals.mjs.br +0 -0
- package/dist/internals.mjs.gz +0 -0
- package/dist/viewer/index.d.ts +170 -17
- package/dist/viewer/index.js +27 -27
- package/dist/viewer/index.js.br +0 -0
- package/dist/viewer/index.js.gz +0 -0
- package/dist/viewer/index.mjs +6 -6
- package/dist/viewer/index.mjs.br +0 -0
- package/dist/viewer/index.mjs.gz +0 -0
- package/package.json +1 -1
- package/dist/AiChatPanel-ITCVRVKP.mjs.br +0 -0
- package/dist/AiChatPanel-ITCVRVKP.mjs.gz +0 -0
- package/dist/AiChatPanel-TO5PHBGW.js.br +0 -0
- package/dist/AiChatPanel-TO5PHBGW.js.gz +0 -0
- package/dist/Area3DChartScene-2UNQ3J3V.js.br +0 -0
- package/dist/Area3DChartScene-2UNQ3J3V.js.gz +0 -0
- package/dist/Area3DChartScene-7PHPDOTG.mjs.br +0 -0
- package/dist/Area3DChartScene-7PHPDOTG.mjs.gz +0 -0
- package/dist/Bar3DChartScene-BLPUHYRZ.mjs.br +0 -0
- package/dist/Bar3DChartScene-BLPUHYRZ.mjs.gz +0 -0
- package/dist/Bar3DChartScene-MC5S3AGT.js.br +0 -0
- package/dist/Bar3DChartScene-MC5S3AGT.js.gz +0 -0
- package/dist/Line3DChartScene-JVVZRIDD.js.br +0 -0
- package/dist/Line3DChartScene-JVVZRIDD.js.gz +0 -0
- package/dist/Line3DChartScene-L5B4YFG3.mjs.br +0 -0
- package/dist/Line3DChartScene-L5B4YFG3.mjs.gz +0 -0
- package/dist/Model3DScene-6TNWS5LV.mjs.br +0 -0
- package/dist/Model3DScene-6TNWS5LV.mjs.gz +0 -0
- package/dist/Model3DScene-LRDNQNKJ.js.br +0 -0
- package/dist/Model3DScene-LRDNQNKJ.js.gz +0 -0
- package/dist/PieChart3DScene-PZWZCXHX.js.br +0 -0
- package/dist/PieChart3DScene-PZWZCXHX.js.gz +0 -0
- package/dist/PieChart3DScene-XXAIVP4I.mjs.br +0 -0
- package/dist/PieChart3DScene-XXAIVP4I.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-CRUGJSCY.mjs.br +0 -1
- package/dist/SurfaceChart3DScene-CRUGJSCY.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-UBQV3ZN2.js.br +0 -0
- package/dist/SurfaceChart3DScene-UBQV3ZN2.js.gz +0 -0
- package/dist/chunk-A2UAUSJM.mjs.br +0 -0
- package/dist/chunk-A2UAUSJM.mjs.gz +0 -0
- package/dist/chunk-ARJE3V6V.mjs.br +0 -0
- package/dist/chunk-ARJE3V6V.mjs.gz +0 -0
- package/dist/chunk-BPWSJLLG.mjs.br +0 -0
- package/dist/chunk-BPWSJLLG.mjs.gz +0 -0
- package/dist/chunk-LGVNUG3G.js.br +0 -0
- package/dist/chunk-LGVNUG3G.js.gz +0 -0
- package/dist/chunk-LXYDXLKZ.js.br +0 -0
- package/dist/chunk-LXYDXLKZ.js.gz +0 -0
- package/dist/chunk-P3VXXUZM.mjs.br +0 -0
- package/dist/chunk-P3VXXUZM.mjs.gz +0 -0
- package/dist/chunk-QOLYY7E3.mjs.br +0 -0
- package/dist/chunk-QOLYY7E3.mjs.gz +0 -0
- package/dist/chunk-SWRY3SI5.js.br +0 -0
- package/dist/chunk-SWRY3SI5.js.gz +0 -0
- package/dist/chunk-T2QG2HD5.js.br +0 -0
- package/dist/chunk-T2QG2HD5.js.gz +0 -0
- package/dist/chunk-XIHK52SB.mjs.br +0 -0
- package/dist/chunk-XIHK52SB.mjs.gz +0 -0
- package/dist/chunk-YDEEINER.js.br +0 -0
- package/dist/chunk-YDEEINER.js.gz +0 -0
- package/dist/chunk-ZPF4L6SD.js.br +0 -0
- package/dist/chunk-ZPF4L6SD.js.gz +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
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,
|
|
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, PresentationAnimationController, 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, attachPresentationVisibilityPause, buildMorphTransitionPlan, morphOptionToMode, buildMorphAnimationRules, findInSlides, applyFindReplacements, createCollaborationLivePatcher, publishLiveInlineText, PptxHandler, collectMediaElements, collectImagePaths,
|
|
3
|
-
import { translationsEn } from './chunk-
|
|
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, buildPdfFromImageData, buildNotesPdf, GRID_SIZE, DEFAULT_TEXT_FONT_SIZE } from './chunk-ITN5NYYM.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, cancelBuildReveal, PresentationAnimationController, scheduleAutoAdvanceChain, 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, attachPresentationVisibilityPause, buildMorphTransitionPlan, morphOptionToMode, buildMorphAnimationRules, findInSlides, applyFindReplacements, createCollaborationLivePatcher, publishLiveInlineText, PptxHandler, collectMediaElements, collectImagePaths, applyImagePathPatches, resolveTableCellImageUrls, resolveTableStyleImageUrls, partitionTemplateElements, resolveAuthoredCustomShowId, buildInitialGuides, EncryptedFileError, resolveAutosaveIntervalMs, shouldWriteAutosaveSnapshot, saveAutosaveSnapshot, autosaveSnapshotMark, updateMasterViewElement, isTemplateElementId, updateElement, hasShapeProperties, hasTextProperties, getInlineEditorSelection, applyStyleToSelectedSegments, setPendingSelectionRestore, applyCaseTransformToSegments, transformTextCase, masterViewElements, replaceMasterViewElements, addSection, renameSection, deleteSection, moveSectionUp, moveSectionDown, moveSlidesToSection, normalizeColorsForCapture, preprocessCssForCapture, slideProgressPercent, slideStatusLabel, EXPORT_ASSEMBLING_PERCENT, EXPORT_DONE_PERCENT, isExportAbortError, recordProgressPercent, downloadBlob, resolveImageResolutionScale, applyThemeToData, THEME_PRESETS, themeColorSchemesEqual, comparePresentation, applyAcceptSlide, applyAcceptAllSlides, collectUsedFonts, describeFontEmbedding, isMobileViewport, mayLeaveSlideShow, stopAllPersistentAudio, remapTextToSegments, guidePxToEmu, buildSaveSlides, embeddedFontSaveOptions, resolveSlideSizeSelection, saveDeckWithPassword, shouldProbeAutosaveRecovery, probeAutosaveRecovery, acceptAutosaveRecovery, discardAutosaveRecovery, shouldLoopContinuously, applyRehearsalTimings, copyFormatFromElement, applyFormatToElement, collectReferencedFontFamilies, resolveGoogleWebfontHref, mapEditorKey, isEditorTextInputTarget, createViewerOptionsStore, readSlidesFromYDoc, shouldRoomSlidesReplaceLoad, reconcileSlidesInYDoc, LOCAL_SYNC_ORIGIN, observeYDocSlides, shouldAutoFollowBroadcaster, detectTouchDevice, detectOrientation, deriveViewportBreakpoints, createTouchGestureRecognizer, MAX_ZOOM_SCALE, MIN_ZOOM_SCALE, isKeyboardOpen, scopeLayoutOptionsToSlide, openPptxFile, readBackstageRecentFile, isActionHidden, resolveInlineEditAutoFitHeight, canInteractWithElement, filterInteractableIds, beginShapeAdjustment, buildElementClipboardPayload, savedPresentationFileName, exportDeckJson, groupElements, generateElementId, makeCloneId, ungroupElements, alignElements, distributeElements, bringForward, sendBackward, bringToFront, sendToBack, newTableElement, createDefaultChartElement, readViewportMetrics, computeKeyboardInset, mergeShapes, mapPresentationKey, lastShowSlideIndex, firstShowSlideIndex, mapPresentationWheel, openPendingPrintWindow, computeColorFilter, filterHiddenSlideIndices, computeSlideIndices, buildPrintDocument, finishPrintWindow, buildPrintHtmlDocument, buildOutlineHtml, buildSlidesHtml, buildNotesHtml, buildHandoutsHtml, createBlankSlide, makeSlideId, buildSlideTemplateSlide, templateSchemeFromTheme, buildThemeColorMap, reResolveSlideColors, computeEntranceAnimationDelay, createPresentationSessionId, resolveTransitionDurationMs, runPresentationAction, createPresenterTimer, createInitialPresentationSnapshot, mergePresentationSnapshot, resetPresenterTimer, presenterElapsed, stepPresenterZoom, togglePresenterTimer, addCommentToList, removeCommentFromList, editCommentInList, toggleCommentResolvedInList, replyToCommentInList, canvasToJpegData, downloadDataUrl, pickSupportedMimeType, WEBM_MIME_CANDIDATES, fpsToFrameIntervalMs, segmentFrameCount, encodeGif, computeGridSpacingPx, resolveShowSlideIndexes, groupSlidesBySection, masterViewPseudoSlide, resolveHistoryDepth, hasCopyableFormat, createBackstagePresentation, buildFieldSubstitutionContext, cloneElementForPaste, computeScrollDelta, getPresetShapeClipPath, svgPathToPolygons, polygonsToSvgPath, rerouteConnectorsForMovedElements, applyReroutedConnectors, SvgExporter, deleteTableColumn, rebuildTableStructureInRawXml, insertTableColumn, deleteTableRow, insertTableRow, updateCellTextStyleInRawXml, setCellText, updateCellTextInRawXml, splitCell, updateMergeAttrsInRawXml, mergeCells, isPpactionUrl, parsePpactionUrl, resolvePresentationAction, ACTION_BUTTON_PRESETS, elementActionToPptxAction, isUrlSafe, buildSmartArtPresetData, classifyMediaType, computeSnapToShape, publishLiveGeometry, getDraggedShapeAdjustments, computeMarqueeHitIds, mergeAdditiveSelection, shouldConfirmExternalHyperlink, safeOpenUrl, applyResize, lockResizeAspect, snapBoxToGrid, applyMotionPathPreset } from './chunk-DM2IZCSD.mjs';
|
|
3
|
+
import { translationsEn } from './chunk-AMRT3AE4.mjs';
|
|
4
4
|
import { createContext, useRef, useState, useEffect, useCallback, useMemo, useLayoutEffect, useContext, useImperativeHandle, useSyncExternalStore } from 'react';
|
|
5
5
|
import { useTranslation } from 'react-i18next';
|
|
6
6
|
|
|
@@ -969,67 +969,6 @@ function stopAnimationSound() {
|
|
|
969
969
|
}
|
|
970
970
|
|
|
971
971
|
// src/viewer/hooks/presentation-mode/animation-helpers.ts
|
|
972
|
-
function applyAnimationGroupSteps(group, onPlayActionSound, setPresentationElementStates, presentationTimersRef) {
|
|
973
|
-
for (const step of group.steps) {
|
|
974
|
-
if (step.command) {
|
|
975
|
-
const command = step.command;
|
|
976
|
-
const timer = window.setTimeout(
|
|
977
|
-
() => {
|
|
978
|
-
executeMediaCommand(command);
|
|
979
|
-
},
|
|
980
|
-
Math.max(0, step.delayMs)
|
|
981
|
-
);
|
|
982
|
-
presentationTimersRef.current.push(timer);
|
|
983
|
-
continue;
|
|
984
|
-
}
|
|
985
|
-
if (step.stopSound) {
|
|
986
|
-
stopAnimationSound();
|
|
987
|
-
} else if (step.soundPath && onPlayActionSound) {
|
|
988
|
-
onPlayActionSound(step.soundPath);
|
|
989
|
-
}
|
|
990
|
-
}
|
|
991
|
-
setPresentationElementStates((previousStates) => {
|
|
992
|
-
const nextStates = new Map(previousStates);
|
|
993
|
-
for (const step of group.steps) {
|
|
994
|
-
if (step.command) {
|
|
995
|
-
continue;
|
|
996
|
-
}
|
|
997
|
-
const currentState = nextStates.get(step.elementId) ?? {
|
|
998
|
-
visible: true};
|
|
999
|
-
const shouldBeVisible = step.presetClass === "exit" ? currentState.visible : true;
|
|
1000
|
-
const colorTargets = step.colorTargets;
|
|
1001
|
-
nextStates.set(step.elementId, {
|
|
1002
|
-
visible: shouldBeVisible,
|
|
1003
|
-
cssAnimation: step.cssAnimation,
|
|
1004
|
-
animatesFill: colorTargets?.includes("fill") ? true : void 0,
|
|
1005
|
-
animatesStroke: colorTargets?.includes("stroke") ? true : void 0
|
|
1006
|
-
});
|
|
1007
|
-
}
|
|
1008
|
-
return nextStates;
|
|
1009
|
-
});
|
|
1010
|
-
for (const step of group.steps) {
|
|
1011
|
-
if (step.command) {
|
|
1012
|
-
continue;
|
|
1013
|
-
}
|
|
1014
|
-
const timer = window.setTimeout(
|
|
1015
|
-
() => {
|
|
1016
|
-
setPresentationElementStates((previousStates) => {
|
|
1017
|
-
const nextStates = new Map(previousStates);
|
|
1018
|
-
const currentState = nextStates.get(step.elementId) ?? {
|
|
1019
|
-
visible: true};
|
|
1020
|
-
const visibleAfterStep = step.presetClass === "exit" || step.hideAfterEffect ? false : currentState.visible;
|
|
1021
|
-
nextStates.set(step.elementId, {
|
|
1022
|
-
visible: visibleAfterStep,
|
|
1023
|
-
cssAnimation: step.holdEndState ? step.cssAnimation : void 0
|
|
1024
|
-
});
|
|
1025
|
-
return nextStates;
|
|
1026
|
-
});
|
|
1027
|
-
},
|
|
1028
|
-
Math.max(0, step.delayMs + step.durationMs + 8)
|
|
1029
|
-
);
|
|
1030
|
-
presentationTimersRef.current.push(timer);
|
|
1031
|
-
}
|
|
1032
|
-
}
|
|
1033
972
|
function shouldSeekAnimationGroup(group, endAtMs, nowMs) {
|
|
1034
973
|
return group?.seqNextAction === "seek" && nowMs < endAtMs;
|
|
1035
974
|
}
|
|
@@ -1102,49 +1041,8 @@ function finishAnimationGroupSteps(group, setPresentationElementStates, complete
|
|
|
1102
1041
|
});
|
|
1103
1042
|
}
|
|
1104
1043
|
|
|
1105
|
-
// src/viewer/hooks/presentation-mode/build-playback.ts
|
|
1106
|
-
function cancelBuildReveal(handle) {
|
|
1107
|
-
if (handle.current !== null) {
|
|
1108
|
-
cancelAnimationFrame(handle.current);
|
|
1109
|
-
handle.current = null;
|
|
1110
|
-
}
|
|
1111
|
-
}
|
|
1112
|
-
function driveBuildReveal(controller, buildIds, setStates, handle) {
|
|
1113
|
-
cancelBuildReveal(handle);
|
|
1114
|
-
if (buildIds.length === 0 || typeof requestAnimationFrame !== "function") {
|
|
1115
|
-
return;
|
|
1116
|
-
}
|
|
1117
|
-
const start = performance.now();
|
|
1118
|
-
const tick = () => {
|
|
1119
|
-
const elapsedMs = performance.now() - start;
|
|
1120
|
-
const states = controller.computeStatesFor(buildIds, { elapsedMs });
|
|
1121
|
-
setStates((prev) => {
|
|
1122
|
-
const next = new Map(prev);
|
|
1123
|
-
for (const id of buildIds) {
|
|
1124
|
-
const build = states.get(id)?.build;
|
|
1125
|
-
if (!build) {
|
|
1126
|
-
continue;
|
|
1127
|
-
}
|
|
1128
|
-
const existing = next.get(id) ?? { visible: true, cssAnimation: void 0 };
|
|
1129
|
-
next.set(id, { ...existing, build });
|
|
1130
|
-
}
|
|
1131
|
-
return next;
|
|
1132
|
-
});
|
|
1133
|
-
let pending = false;
|
|
1134
|
-
for (const id of buildIds) {
|
|
1135
|
-
const build = states.get(id)?.build;
|
|
1136
|
-
if (build && build.progress < 1) {
|
|
1137
|
-
pending = true;
|
|
1138
|
-
break;
|
|
1139
|
-
}
|
|
1140
|
-
}
|
|
1141
|
-
handle.current = pending ? requestAnimationFrame(tick) : null;
|
|
1142
|
-
};
|
|
1143
|
-
tick();
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1146
1044
|
// src/viewer/hooks/presentation-mode/entrance-animation-timers.ts
|
|
1147
|
-
function scheduleOpeningAutoPlayGroup(controller,
|
|
1045
|
+
function scheduleOpeningAutoPlayGroup(controller, ctx) {
|
|
1148
1046
|
if (!controller.hasMoreSteps()) {
|
|
1149
1047
|
return;
|
|
1150
1048
|
}
|
|
@@ -1157,17 +1055,10 @@ function scheduleOpeningAutoPlayGroup(controller, deps) {
|
|
|
1157
1055
|
if (!group) {
|
|
1158
1056
|
return;
|
|
1159
1057
|
}
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
deps.onPlayActionSound,
|
|
1163
|
-
deps.setPresentationElementStates,
|
|
1164
|
-
deps.presentationTimersRef
|
|
1165
|
-
);
|
|
1166
|
-
deps.markAnimationGroupActive(group);
|
|
1167
|
-
deps.startBuildReveal(controller, group);
|
|
1168
|
-
deps.scheduleAutoAdvanceChain(controller);
|
|
1058
|
+
playGroup(controller, group, ctx);
|
|
1059
|
+
scheduleAutoAdvanceChain(controller, ctx);
|
|
1169
1060
|
}, firstGroup.autoAdvanceDelayMs ?? 0);
|
|
1170
|
-
|
|
1061
|
+
ctx.timers.push(timer);
|
|
1171
1062
|
}
|
|
1172
1063
|
function scheduleEntranceAnimationTimers(slide, setPresentationAnimations, presentationTimersRef) {
|
|
1173
1064
|
const entranceAnimations = [...slide.animations || []].filter((animation) => Boolean(animation.entrance)).sort(
|
|
@@ -1214,17 +1105,16 @@ function useAnimationPlayback(input) {
|
|
|
1214
1105
|
const activeAnimationEndAtRef = useRef(0);
|
|
1215
1106
|
const seededCompletedRef = useRef(false);
|
|
1216
1107
|
const lastSeedCompletedRef = useRef(false);
|
|
1217
|
-
const
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
}
|
|
1226
|
-
|
|
1227
|
-
);
|
|
1108
|
+
const buildPlaybackContext = useCallback(() => {
|
|
1109
|
+
return {
|
|
1110
|
+
setStates: setPresentationElementStates,
|
|
1111
|
+
timers: presentationTimersRef.current,
|
|
1112
|
+
buildHandle: buildRafRef,
|
|
1113
|
+
onPlayActionSound,
|
|
1114
|
+
playSound: playAnimationSound,
|
|
1115
|
+
stopSound: stopAnimationSound
|
|
1116
|
+
};
|
|
1117
|
+
}, [onPlayActionSound]);
|
|
1228
1118
|
useEffect(() => {
|
|
1229
1119
|
return () => {
|
|
1230
1120
|
cancelBuildReveal(buildRafRef);
|
|
@@ -1243,45 +1133,6 @@ function useAnimationPlayback(input) {
|
|
|
1243
1133
|
activeAnimationGroupRef.current = group;
|
|
1244
1134
|
activeAnimationEndAtRef.current = performance.now() + Math.max(0, group.totalDurationMs);
|
|
1245
1135
|
}, []);
|
|
1246
|
-
const scheduleAutoAdvanceChain = useCallback(
|
|
1247
|
-
(controller) => {
|
|
1248
|
-
if (!controller.shouldAutoAdvance()) {
|
|
1249
|
-
return;
|
|
1250
|
-
}
|
|
1251
|
-
const delay = controller.getAutoAdvanceDelay();
|
|
1252
|
-
const previousGroup = controller.peekNext();
|
|
1253
|
-
if (!previousGroup) {
|
|
1254
|
-
return;
|
|
1255
|
-
}
|
|
1256
|
-
const totalDelay = delay + (previousGroup.autoAdvanceDelayMs ?? 0);
|
|
1257
|
-
const timer = window.setTimeout(
|
|
1258
|
-
() => {
|
|
1259
|
-
const group = controller.advance();
|
|
1260
|
-
if (!group) {
|
|
1261
|
-
return;
|
|
1262
|
-
}
|
|
1263
|
-
applyAnimationGroupSteps(
|
|
1264
|
-
group,
|
|
1265
|
-
onPlayActionSound,
|
|
1266
|
-
setPresentationElementStates,
|
|
1267
|
-
presentationTimersRef
|
|
1268
|
-
);
|
|
1269
|
-
markAnimationGroupActive(group);
|
|
1270
|
-
startBuildReveal(controller, group);
|
|
1271
|
-
scheduleAutoAdvanceChain(controller);
|
|
1272
|
-
},
|
|
1273
|
-
Math.max(0, totalDelay)
|
|
1274
|
-
);
|
|
1275
|
-
presentationTimersRef.current.push(timer);
|
|
1276
|
-
},
|
|
1277
|
-
// `scheduleAutoAdvanceChain` recursively calls itself (line 190) to walk the
|
|
1278
|
-
// auto-advance chain; it can't list itself as its own dependency (the const
|
|
1279
|
-
// isn't assigned yet when the array is evaluated). The recursive call still
|
|
1280
|
-
// resolves correctly because the setTimeout callback only reads the binding
|
|
1281
|
-
// once the outer const has been assigned.
|
|
1282
|
-
// oxlint-disable-next-line react/memo-dependencies -- see comment above
|
|
1283
|
-
[markAnimationGroupActive, onPlayActionSound, startBuildReveal]
|
|
1284
|
-
);
|
|
1285
1136
|
const resetSlideTimeline = useCallback(
|
|
1286
1137
|
(slideIndex) => {
|
|
1287
1138
|
cancelBuildReveal(buildRafRef);
|
|
@@ -1315,7 +1166,7 @@ function useAnimationPlayback(input) {
|
|
|
1315
1166
|
const completedStates = controller.computeStatesFor(buildIds);
|
|
1316
1167
|
clearPresentationTimers();
|
|
1317
1168
|
finishAnimationGroupSteps(activeGroup, setPresentationElementStates, completedStates);
|
|
1318
|
-
scheduleAutoAdvanceChain(controller);
|
|
1169
|
+
scheduleAutoAdvanceChain(controller, buildPlaybackContext());
|
|
1319
1170
|
return true;
|
|
1320
1171
|
}
|
|
1321
1172
|
if (!controller || !controller.hasMoreSteps()) {
|
|
@@ -1325,24 +1176,12 @@ function useAnimationPlayback(input) {
|
|
|
1325
1176
|
if (!group) {
|
|
1326
1177
|
return false;
|
|
1327
1178
|
}
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
onPlayActionSound,
|
|
1331
|
-
setPresentationElementStates,
|
|
1332
|
-
presentationTimersRef
|
|
1333
|
-
);
|
|
1179
|
+
const ctx = buildPlaybackContext();
|
|
1180
|
+
playGroup(controller, group, ctx);
|
|
1334
1181
|
markAnimationGroupActive(group);
|
|
1335
|
-
|
|
1336
|
-
scheduleAutoAdvanceChain(controller);
|
|
1182
|
+
scheduleAutoAdvanceChain(controller, ctx);
|
|
1337
1183
|
return true;
|
|
1338
|
-
}, [
|
|
1339
|
-
animationsEnabled,
|
|
1340
|
-
clearPresentationTimers,
|
|
1341
|
-
markAnimationGroupActive,
|
|
1342
|
-
onPlayActionSound,
|
|
1343
|
-
scheduleAutoAdvanceChain,
|
|
1344
|
-
startBuildReveal
|
|
1345
|
-
]);
|
|
1184
|
+
}, [animationsEnabled, buildPlaybackContext, clearPresentationTimers, markAnimationGroupActive]);
|
|
1346
1185
|
const handleInteractiveShapeClick = useCallback(
|
|
1347
1186
|
(shapeId) => {
|
|
1348
1187
|
const controller = controllerRef.current;
|
|
@@ -1353,16 +1192,10 @@ function useAnimationPlayback(input) {
|
|
|
1353
1192
|
if (!group) {
|
|
1354
1193
|
return false;
|
|
1355
1194
|
}
|
|
1356
|
-
|
|
1357
|
-
group,
|
|
1358
|
-
onPlayActionSound,
|
|
1359
|
-
setPresentationElementStates,
|
|
1360
|
-
presentationTimersRef
|
|
1361
|
-
);
|
|
1362
|
-
startBuildReveal(controller, group);
|
|
1195
|
+
playGroup(controller, group, buildPlaybackContext());
|
|
1363
1196
|
return true;
|
|
1364
1197
|
},
|
|
1365
|
-
[
|
|
1198
|
+
[buildPlaybackContext]
|
|
1366
1199
|
);
|
|
1367
1200
|
const handleHoverStart = useCallback(
|
|
1368
1201
|
(shapeId) => {
|
|
@@ -1378,16 +1211,10 @@ function useAnimationPlayback(input) {
|
|
|
1378
1211
|
if (!group) {
|
|
1379
1212
|
return false;
|
|
1380
1213
|
}
|
|
1381
|
-
|
|
1382
|
-
group,
|
|
1383
|
-
onPlayActionSound,
|
|
1384
|
-
setPresentationElementStates,
|
|
1385
|
-
presentationTimersRef
|
|
1386
|
-
);
|
|
1387
|
-
startBuildReveal(controller, group);
|
|
1214
|
+
playGroup(controller, group, buildPlaybackContext());
|
|
1388
1215
|
return true;
|
|
1389
1216
|
},
|
|
1390
|
-
[animationsEnabled,
|
|
1217
|
+
[animationsEnabled, buildPlaybackContext]
|
|
1391
1218
|
);
|
|
1392
1219
|
const handleHoverEnd = useCallback((shapeId) => {
|
|
1393
1220
|
const controller = controllerRef.current;
|
|
@@ -1433,25 +1260,12 @@ function useAnimationPlayback(input) {
|
|
|
1433
1260
|
}
|
|
1434
1261
|
const controller = controllerRef.current;
|
|
1435
1262
|
if (controller) {
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
setPresentationElementStates,
|
|
1439
|
-
presentationTimersRef,
|
|
1440
|
-
startBuildReveal,
|
|
1441
|
-
scheduleAutoAdvanceChain,
|
|
1442
|
-
markAnimationGroupActive
|
|
1443
|
-
});
|
|
1263
|
+
const ctx = buildPlaybackContext();
|
|
1264
|
+
scheduleOpeningAutoPlayGroup(controller, ctx);
|
|
1444
1265
|
}
|
|
1445
1266
|
scheduleEntranceAnimationTimers(slide, setPresentationAnimations, presentationTimersRef);
|
|
1446
1267
|
},
|
|
1447
|
-
[
|
|
1448
|
-
animationsEnabled,
|
|
1449
|
-
slides,
|
|
1450
|
-
onPlayActionSound,
|
|
1451
|
-
markAnimationGroupActive,
|
|
1452
|
-
scheduleAutoAdvanceChain,
|
|
1453
|
-
startBuildReveal
|
|
1454
|
-
]
|
|
1268
|
+
[animationsEnabled, slides, buildPlaybackContext]
|
|
1455
1269
|
);
|
|
1456
1270
|
const runPresentationEntranceAnimations = useCallback(
|
|
1457
1271
|
(slideIndex, options) => {
|
|
@@ -3992,93 +3806,19 @@ function useLoadContent({
|
|
|
3992
3806
|
}
|
|
3993
3807
|
})
|
|
3994
3808
|
);
|
|
3995
|
-
|
|
3996
|
-
|
|
3997
|
-
|
|
3998
|
-
|
|
3999
|
-
continue;
|
|
4000
|
-
}
|
|
4001
|
-
const id = ref.element.id;
|
|
4002
|
-
const existing = elementPatches.get(id) ?? {};
|
|
4003
|
-
existing[ref.field] = url;
|
|
4004
|
-
elementPatches.set(id, existing);
|
|
4005
|
-
}
|
|
4006
|
-
if (elementPatches.size > 0) {
|
|
4007
|
-
const patchElements = (elements) => {
|
|
4008
|
-
let mutated = false;
|
|
4009
|
-
const next = elements.map((el) => {
|
|
4010
|
-
let updated = el;
|
|
4011
|
-
const patch = elementPatches.get(el.id);
|
|
4012
|
-
if (patch) {
|
|
4013
|
-
updated = { ...el, ...patch };
|
|
4014
|
-
}
|
|
4015
|
-
if (updated.type === "group" && updated.children?.length) {
|
|
4016
|
-
const newChildren = patchElements(updated.children);
|
|
4017
|
-
if (newChildren !== updated.children) {
|
|
4018
|
-
updated = { ...updated, children: newChildren };
|
|
4019
|
-
}
|
|
4020
|
-
}
|
|
4021
|
-
if (updated !== el) {
|
|
4022
|
-
mutated = true;
|
|
4023
|
-
}
|
|
4024
|
-
return updated;
|
|
4025
|
-
});
|
|
4026
|
-
return mutated ? next : elements;
|
|
4027
|
-
};
|
|
4028
|
-
nextSlides = parsed.slides.map((s) => {
|
|
4029
|
-
const newElements = patchElements(s.elements);
|
|
4030
|
-
return newElements === s.elements ? s : { ...s, elements: newElements };
|
|
4031
|
-
});
|
|
4032
|
-
}
|
|
4033
|
-
}
|
|
4034
|
-
const { paths: tableImagePaths, refs: tableImageRefs } = collectTableCellImagePaths(nextSlides);
|
|
4035
|
-
if (tableImagePaths.size > 0) {
|
|
4036
|
-
const resolvedTableMap = /* @__PURE__ */ new Map();
|
|
4037
|
-
await Promise.all(
|
|
4038
|
-
Array.from(tableImagePaths).map(async (path) => {
|
|
4039
|
-
try {
|
|
4040
|
-
const url = await handler.getImageData(path);
|
|
4041
|
-
if (url) {
|
|
4042
|
-
resolvedTableMap.set(path, url);
|
|
4043
|
-
}
|
|
4044
|
-
} catch {
|
|
4045
|
-
}
|
|
4046
|
-
})
|
|
4047
|
-
);
|
|
4048
|
-
if (resolvedTableMap.size > 0) {
|
|
4049
|
-
nextSlides = nextSlides.map((s) => {
|
|
4050
|
-
const newElements = applyTableCellImagePatches(
|
|
4051
|
-
s.elements,
|
|
4052
|
-
resolvedTableMap,
|
|
4053
|
-
tableImageRefs
|
|
4054
|
-
);
|
|
4055
|
-
return newElements === s.elements ? s : { ...s, elements: newElements };
|
|
4056
|
-
});
|
|
4057
|
-
}
|
|
4058
|
-
}
|
|
4059
|
-
let nextTableStyleMap = parsed.tableStyleMap;
|
|
4060
|
-
const { paths: tableStyleImagePaths, refs: tableStyleImageRefs } = collectTableStyleImagePaths(nextTableStyleMap);
|
|
4061
|
-
if (tableStyleImagePaths.size > 0) {
|
|
4062
|
-
const resolvedStyleMap = /* @__PURE__ */ new Map();
|
|
4063
|
-
await Promise.all(
|
|
4064
|
-
Array.from(tableStyleImagePaths).map(async (path) => {
|
|
4065
|
-
try {
|
|
4066
|
-
const url = await handler.getImageData(path);
|
|
4067
|
-
if (url) {
|
|
4068
|
-
resolvedStyleMap.set(path, url);
|
|
4069
|
-
}
|
|
4070
|
-
} catch {
|
|
4071
|
-
}
|
|
4072
|
-
})
|
|
4073
|
-
);
|
|
4074
|
-
if (resolvedStyleMap.size > 0 && nextTableStyleMap) {
|
|
4075
|
-
nextTableStyleMap = applyTableStyleImagePatches(
|
|
4076
|
-
nextTableStyleMap,
|
|
4077
|
-
resolvedStyleMap,
|
|
4078
|
-
tableStyleImageRefs
|
|
4079
|
-
);
|
|
4080
|
-
}
|
|
3809
|
+
nextSlides = parsed.slides.map((s) => {
|
|
3810
|
+
const newElements = applyImagePathPatches(s.elements, resolvedMap, imageRefs);
|
|
3811
|
+
return newElements === s.elements ? s : { ...s, elements: newElements };
|
|
3812
|
+
});
|
|
4081
3813
|
}
|
|
3814
|
+
nextSlides = await resolveTableCellImageUrls(
|
|
3815
|
+
nextSlides,
|
|
3816
|
+
(path) => handler.getImageData(path)
|
|
3817
|
+
);
|
|
3818
|
+
const nextTableStyleMap = await resolveTableStyleImageUrls(
|
|
3819
|
+
parsed.tableStyleMap,
|
|
3820
|
+
(path) => handler.getImageData(path)
|
|
3821
|
+
);
|
|
4082
3822
|
handlerRef.current = handler;
|
|
4083
3823
|
const partition = partitionTemplateElements(nextSlides);
|
|
4084
3824
|
setSlides(partition.slides);
|
|
@@ -4312,19 +4052,7 @@ function useElementOperations(input) {
|
|
|
4312
4052
|
}));
|
|
4313
4053
|
}
|
|
4314
4054
|
} else {
|
|
4315
|
-
setSlides(
|
|
4316
|
-
(prev) => prev.map(
|
|
4317
|
-
(s, i) => i !== activeSlideIndex ? s : {
|
|
4318
|
-
...s,
|
|
4319
|
-
elements: s.elements.map(
|
|
4320
|
-
(el) => el.id === elementId ? {
|
|
4321
|
-
...el,
|
|
4322
|
-
...updates
|
|
4323
|
-
} : el
|
|
4324
|
-
)
|
|
4325
|
-
}
|
|
4326
|
-
)
|
|
4327
|
-
);
|
|
4055
|
+
setSlides((prev) => updateElement(prev, activeSlideIndex, elementId, updates));
|
|
4328
4056
|
}
|
|
4329
4057
|
history.markDirty();
|
|
4330
4058
|
},
|
|
@@ -4555,15 +4283,12 @@ function useSectionOperations(input) {
|
|
|
4555
4283
|
}
|
|
4556
4284
|
|
|
4557
4285
|
// src/viewer/hooks/pointer-move-handlers.ts
|
|
4558
|
-
function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx) {
|
|
4559
|
-
const
|
|
4560
|
-
|
|
4561
|
-
|
|
4562
|
-
|
|
4563
|
-
|
|
4564
|
-
1,
|
|
4565
|
-
{ minSize: MIN_ELEMENT_SIZE }
|
|
4566
|
-
);
|
|
4286
|
+
function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx, lockAspect = false) {
|
|
4287
|
+
const startBox = { x: startX, y: startY, width: startWidth, height: startHeight };
|
|
4288
|
+
let resized = applyResize(startBox, handle, dx, dy, 1, { minSize: MIN_ELEMENT_SIZE });
|
|
4289
|
+
if (lockAspect) {
|
|
4290
|
+
resized = lockResizeAspect(resized, startBox, handle, MIN_ELEMENT_SIZE);
|
|
4291
|
+
}
|
|
4567
4292
|
const box = { x: resized.x, y: resized.y, width: resized.width, height: resized.height };
|
|
4568
4293
|
if (!snapToGrid) {
|
|
4569
4294
|
return box;
|
|
@@ -4745,7 +4470,8 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4745
4470
|
dx,
|
|
4746
4471
|
dy,
|
|
4747
4472
|
snapToGrid,
|
|
4748
|
-
gridSpacingPx
|
|
4473
|
+
gridSpacingPx,
|
|
4474
|
+
e.shiftKey
|
|
4749
4475
|
);
|
|
4750
4476
|
rs.lastX = geo.x;
|
|
4751
4477
|
rs.lastY = geo.y;
|
|
@@ -9179,28 +8905,6 @@ function useIOHandlers(input) {
|
|
|
9179
8905
|
});
|
|
9180
8906
|
return { exportHandlers, printHandlers, themeHandlers, propertyHandlers };
|
|
9181
8907
|
}
|
|
9182
|
-
var GOOGLE_FONTS_AVAILABLE = {
|
|
9183
|
-
"Atkinson Hyperlegible": "Atkinson+Hyperlegible:wght@400;700",
|
|
9184
|
-
Roboto: "Roboto:wght@400;700",
|
|
9185
|
-
"Open Sans": "Open+Sans:wght@400;700",
|
|
9186
|
-
Lato: "Lato:wght@400;700",
|
|
9187
|
-
Montserrat: "Montserrat:wght@400;700",
|
|
9188
|
-
Poppins: "Poppins:wght@400;700",
|
|
9189
|
-
Raleway: "Raleway:wght@400;700",
|
|
9190
|
-
Nunito: "Nunito:wght@400;700",
|
|
9191
|
-
"Playfair Display": "Playfair+Display:wght@400;700",
|
|
9192
|
-
"Source Sans Pro": "Source+Sans+Pro:wght@400;700",
|
|
9193
|
-
"PT Sans": "PT+Sans:wght@400;700",
|
|
9194
|
-
Merriweather: "Merriweather:wght@400;700",
|
|
9195
|
-
Ubuntu: "Ubuntu:wght@400;700",
|
|
9196
|
-
Oswald: "Oswald:wght@400;700",
|
|
9197
|
-
"Noto Sans": "Noto+Sans:wght@400;700",
|
|
9198
|
-
"Fira Sans": "Fira+Sans:wght@400;700",
|
|
9199
|
-
Inter: "Inter:wght@400;700",
|
|
9200
|
-
"Work Sans": "Work+Sans:wght@400;700",
|
|
9201
|
-
Quicksand: "Quicksand:wght@400;700",
|
|
9202
|
-
Cabin: "Cabin:wght@400;700"
|
|
9203
|
-
};
|
|
9204
8908
|
var EMBEDDED_FONTS_STYLE_ID = "pptx-embedded-fonts";
|
|
9205
8909
|
var GOOGLE_FONTS_LINK_ID = "pptx-google-fonts";
|
|
9206
8910
|
var SYMBOL_FONTS_STYLE_ID = "pptx-symbol-font-fallback";
|
|
@@ -9211,21 +8915,6 @@ var SYMBOL_FONT_FAMILIES = [
|
|
|
9211
8915
|
"Symbol",
|
|
9212
8916
|
"Webdings"
|
|
9213
8917
|
];
|
|
9214
|
-
function collectReferencedFontFamilies(slides) {
|
|
9215
|
-
const families = /* @__PURE__ */ new Set();
|
|
9216
|
-
for (const slide of slides) {
|
|
9217
|
-
for (const el of slide.elements) {
|
|
9218
|
-
if (hasTextProperties(el) && el.textSegments) {
|
|
9219
|
-
for (const seg of el.textSegments) {
|
|
9220
|
-
if (seg.style.fontFamily) {
|
|
9221
|
-
families.add(seg.style.fontFamily);
|
|
9222
|
-
}
|
|
9223
|
-
}
|
|
9224
|
-
}
|
|
9225
|
-
}
|
|
9226
|
-
}
|
|
9227
|
-
return families;
|
|
9228
|
-
}
|
|
9229
8918
|
var FONT_NAME_UNSAFE_CHARS = /["\\\n\r;}<>]/u;
|
|
9230
8919
|
var FONT_FORMAT_ALLOWED = /* @__PURE__ */ new Set([
|
|
9231
8920
|
"truetype",
|
|
@@ -9286,31 +8975,29 @@ function useFontInjection({ embeddedFonts, slides }) {
|
|
|
9286
8975
|
}, [embeddedFonts]);
|
|
9287
8976
|
const referencedFamilies = useMemo(() => collectReferencedFontFamilies(slides), [slides]);
|
|
9288
8977
|
useEffect(() => {
|
|
9289
|
-
|
|
9290
|
-
|
|
9291
|
-
|
|
9292
|
-
|
|
9293
|
-
continue;
|
|
8978
|
+
let cancelled = false;
|
|
8979
|
+
void resolveGoogleWebfontHref(slides, embeddedFonts).then((href) => {
|
|
8980
|
+
if (cancelled) {
|
|
8981
|
+
return null;
|
|
9294
8982
|
}
|
|
9295
|
-
if (
|
|
9296
|
-
|
|
8983
|
+
if (!href || document.getElementById(GOOGLE_FONTS_LINK_ID)) {
|
|
8984
|
+
return null;
|
|
9297
8985
|
}
|
|
9298
|
-
|
|
9299
|
-
|
|
9300
|
-
|
|
9301
|
-
|
|
9302
|
-
|
|
9303
|
-
|
|
9304
|
-
|
|
9305
|
-
linkEl.href = `https://fonts.googleapis.com/css2?${googleFamilies.map((f) => `family=${encodeURIComponent(GOOGLE_FONTS_AVAILABLE[f])}`).join("&")}&display=swap`;
|
|
9306
|
-
document.head.appendChild(linkEl);
|
|
8986
|
+
const linkEl = document.createElement("link");
|
|
8987
|
+
linkEl.id = GOOGLE_FONTS_LINK_ID;
|
|
8988
|
+
linkEl.rel = "stylesheet";
|
|
8989
|
+
linkEl.href = href;
|
|
8990
|
+
document.head.appendChild(linkEl);
|
|
8991
|
+
return href;
|
|
8992
|
+
});
|
|
9307
8993
|
return () => {
|
|
8994
|
+
cancelled = true;
|
|
9308
8995
|
const existing = document.getElementById(GOOGLE_FONTS_LINK_ID);
|
|
9309
8996
|
if (existing) {
|
|
9310
8997
|
document.head.removeChild(existing);
|
|
9311
8998
|
}
|
|
9312
8999
|
};
|
|
9313
|
-
}, [embeddedFonts,
|
|
9000
|
+
}, [embeddedFonts, slides]);
|
|
9314
9001
|
useEffect(() => {
|
|
9315
9002
|
const neededSymbolFonts = SYMBOL_FONT_FAMILIES.filter((f) => referencedFamilies.has(f));
|
|
9316
9003
|
if (neededSymbolFonts.length === 0) {
|
|
Binary file
|
|
Binary file
|