pptx-react-viewer 2.10.0 → 2.11.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 (124) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/{AiChatPanel-35CHYS5N.mjs → AiChatPanel-EX2TBRJM.mjs} +4 -4
  3. package/dist/AiChatPanel-EX2TBRJM.mjs.br +0 -0
  4. package/dist/AiChatPanel-EX2TBRJM.mjs.gz +0 -0
  5. package/dist/{AiChatPanel-KTMWRUD5.js → AiChatPanel-PJPSDMN4.js} +23 -23
  6. package/dist/AiChatPanel-PJPSDMN4.js.br +0 -0
  7. package/dist/AiChatPanel-PJPSDMN4.js.gz +0 -0
  8. package/dist/{Model3DScene-2VMN3B65.mjs → Model3DScene-TTQFV7OS.mjs} +1 -1
  9. package/dist/Model3DScene-TTQFV7OS.mjs.br +0 -0
  10. package/dist/Model3DScene-TTQFV7OS.mjs.gz +0 -0
  11. package/dist/{Model3DScene-TMNUKCL6.js → Model3DScene-UCBPTEAY.js} +2 -2
  12. package/dist/Model3DScene-UCBPTEAY.js.br +0 -0
  13. package/dist/Model3DScene-UCBPTEAY.js.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-GKRDDN2U.mjs → SurfaceChart3DScene-5SZCRHZI.mjs} +1 -1
  15. package/dist/{SurfaceChart3DScene-GKRDDN2U.mjs.br → SurfaceChart3DScene-5SZCRHZI.mjs.br} +0 -0
  16. package/dist/SurfaceChart3DScene-5SZCRHZI.mjs.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-KPNP3QD5.js → SurfaceChart3DScene-ADKCYYOQ.js} +2 -2
  18. package/dist/SurfaceChart3DScene-ADKCYYOQ.js.br +0 -0
  19. package/dist/SurfaceChart3DScene-ADKCYYOQ.js.gz +0 -0
  20. package/dist/{chunk-A7HLINZU.js → chunk-4J7SPY64.js} +334 -324
  21. package/dist/chunk-4J7SPY64.js.br +0 -0
  22. package/dist/chunk-4J7SPY64.js.gz +0 -0
  23. package/dist/{chunk-SL3XPERE.mjs → chunk-53NXKDMZ.mjs} +47 -0
  24. package/dist/chunk-53NXKDMZ.mjs.br +0 -0
  25. package/dist/chunk-53NXKDMZ.mjs.gz +0 -0
  26. package/dist/{chunk-TJ55KUWH.mjs → chunk-C2UWTH42.mjs} +859 -112
  27. package/dist/chunk-C2UWTH42.mjs.br +0 -0
  28. package/dist/chunk-C2UWTH42.mjs.gz +0 -0
  29. package/dist/{chunk-JWMXOYSX.js → chunk-E367QIKR.js} +2162 -1736
  30. package/dist/chunk-E367QIKR.js.br +0 -0
  31. package/dist/chunk-E367QIKR.js.gz +0 -0
  32. package/dist/{chunk-OHPF2HTP.mjs → chunk-HK2UERUX.mjs} +13 -3
  33. package/dist/chunk-HK2UERUX.mjs.br +0 -0
  34. package/dist/chunk-HK2UERUX.mjs.gz +0 -0
  35. package/dist/{chunk-H74UXL4Q.js → chunk-HMQVOPQH.js} +880 -111
  36. package/dist/chunk-HMQVOPQH.js.br +0 -0
  37. package/dist/chunk-HMQVOPQH.js.gz +0 -0
  38. package/dist/{chunk-LCG7WBAG.mjs → chunk-L2CM5EUD.mjs} +491 -65
  39. package/dist/chunk-L2CM5EUD.mjs.br +0 -0
  40. package/dist/chunk-L2CM5EUD.mjs.gz +0 -0
  41. package/dist/{chunk-IJVDNQLG.js → chunk-MM5RMRSP.js} +275 -249
  42. package/dist/chunk-MM5RMRSP.js.br +0 -0
  43. package/dist/chunk-MM5RMRSP.js.gz +0 -0
  44. package/dist/{chunk-MMK4K3QI.js → chunk-N6IHR6PS.js} +47 -0
  45. package/dist/chunk-N6IHR6PS.js.br +0 -0
  46. package/dist/chunk-N6IHR6PS.js.gz +0 -0
  47. package/dist/{chunk-FY2AFXKP.mjs → chunk-RJEY2KZH.mjs} +29 -4
  48. package/dist/chunk-RJEY2KZH.mjs.br +0 -0
  49. package/dist/chunk-RJEY2KZH.mjs.gz +0 -0
  50. package/dist/{chunk-LXTKPSIG.mjs → chunk-UZVRM6LD.mjs} +1 -1
  51. package/dist/chunk-UZVRM6LD.mjs.br +0 -0
  52. package/dist/{chunk-LXTKPSIG.mjs.gz → chunk-UZVRM6LD.mjs.gz} +0 -0
  53. package/dist/{chunk-SPJR6MPI.js → chunk-VNP627O5.js} +3 -3
  54. package/dist/chunk-VNP627O5.js.br +0 -0
  55. package/dist/chunk-VNP627O5.js.gz +0 -0
  56. package/dist/i18n.js +4 -4
  57. package/dist/i18n.js.br +0 -0
  58. package/dist/i18n.js.gz +0 -0
  59. package/dist/i18n.mjs +1 -1
  60. package/dist/i18n.mjs.br +0 -0
  61. package/dist/i18n.mjs.gz +0 -0
  62. package/dist/index.d.ts +24 -3
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +36 -36
  65. package/dist/index.js.br +0 -0
  66. package/dist/index.js.gz +0 -0
  67. package/dist/index.mjs +6 -6
  68. package/dist/index.mjs.br +0 -0
  69. package/dist/index.mjs.gz +0 -0
  70. package/dist/internals.d.ts +26 -2
  71. package/dist/internals.d.ts.map +1 -1
  72. package/dist/internals.js +79 -79
  73. package/dist/internals.js.br +0 -0
  74. package/dist/internals.js.gz +0 -0
  75. package/dist/internals.mjs +4 -4
  76. package/dist/internals.mjs.br +0 -0
  77. package/dist/internals.mjs.gz +0 -0
  78. package/dist/pptx-viewer.css +1 -1
  79. package/dist/pptx-viewer.css.br +0 -0
  80. package/dist/pptx-viewer.css.gz +0 -0
  81. package/dist/{useViewerBuildingBlocks-CpUwhBD5.d.ts → useViewerBuildingBlocks-Rqxm0pRS.d.ts} +17 -5
  82. package/dist/useViewerBuildingBlocks-Rqxm0pRS.d.ts.map +1 -0
  83. package/dist/viewer/index.js +22 -22
  84. package/dist/viewer/index.js.br +0 -0
  85. package/dist/viewer/index.js.gz +0 -0
  86. package/dist/viewer/index.mjs +6 -6
  87. package/dist/viewer/index.mjs.br +0 -0
  88. package/dist/viewer/index.mjs.gz +0 -0
  89. package/package.json +1 -1
  90. package/dist/AiChatPanel-35CHYS5N.mjs.br +0 -0
  91. package/dist/AiChatPanel-35CHYS5N.mjs.gz +0 -0
  92. package/dist/AiChatPanel-KTMWRUD5.js.br +0 -0
  93. package/dist/AiChatPanel-KTMWRUD5.js.gz +0 -0
  94. package/dist/Model3DScene-2VMN3B65.mjs.br +0 -0
  95. package/dist/Model3DScene-2VMN3B65.mjs.gz +0 -0
  96. package/dist/Model3DScene-TMNUKCL6.js.br +0 -0
  97. package/dist/Model3DScene-TMNUKCL6.js.gz +0 -0
  98. package/dist/SurfaceChart3DScene-GKRDDN2U.mjs.gz +0 -0
  99. package/dist/SurfaceChart3DScene-KPNP3QD5.js.br +0 -0
  100. package/dist/SurfaceChart3DScene-KPNP3QD5.js.gz +0 -0
  101. package/dist/chunk-A7HLINZU.js.br +0 -0
  102. package/dist/chunk-A7HLINZU.js.gz +0 -0
  103. package/dist/chunk-FY2AFXKP.mjs.br +0 -0
  104. package/dist/chunk-FY2AFXKP.mjs.gz +0 -0
  105. package/dist/chunk-H74UXL4Q.js.br +0 -0
  106. package/dist/chunk-H74UXL4Q.js.gz +0 -0
  107. package/dist/chunk-IJVDNQLG.js.br +0 -0
  108. package/dist/chunk-IJVDNQLG.js.gz +0 -0
  109. package/dist/chunk-JWMXOYSX.js.br +0 -0
  110. package/dist/chunk-JWMXOYSX.js.gz +0 -0
  111. package/dist/chunk-LCG7WBAG.mjs.br +0 -0
  112. package/dist/chunk-LCG7WBAG.mjs.gz +0 -0
  113. package/dist/chunk-LXTKPSIG.mjs.br +0 -0
  114. package/dist/chunk-MMK4K3QI.js.br +0 -0
  115. package/dist/chunk-MMK4K3QI.js.gz +0 -0
  116. package/dist/chunk-OHPF2HTP.mjs.br +0 -0
  117. package/dist/chunk-OHPF2HTP.mjs.gz +0 -0
  118. package/dist/chunk-SL3XPERE.mjs.br +0 -0
  119. package/dist/chunk-SL3XPERE.mjs.gz +0 -0
  120. package/dist/chunk-SPJR6MPI.js.br +0 -0
  121. package/dist/chunk-SPJR6MPI.js.gz +0 -0
  122. package/dist/chunk-TJ55KUWH.mjs.br +0 -0
  123. package/dist/chunk-TJ55KUWH.mjs.gz +0 -0
  124. package/dist/useViewerBuildingBlocks-CpUwhBD5.d.ts.map +0 -1
@@ -1,9 +1,9 @@
1
- import { computeFocusTargets, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, toRenderableParts } from './chunk-LXTKPSIG.mjs';
2
- import { useReducedMotion, useViewerState, useViewerOptions, useIsMobile, useResizablePanels, useDerivedSlideState, useZoomViewport, useEditorHistory, usePresentationSetup, useTouchGestures, useViewerDialogs, useEditorOperations, useViewerIntegration, useYjsDocumentSync, useCollaborationLivePatch, useFollowMode, useBroadcastFollower, scopeLayoutOptionsToActiveSlide, useToolbarVisibility, useKeyboardInsets, useModalDismissDrag, useCollaborativeState, useVirtualizedSlides, useSwipeNavigation, useSheetDismissDrag, detectTargetType, parseEmailUrl, parseSlideFromUrl, ACTION_VERB_MAP, downloadBlob } from './chunk-OHPF2HTP.mjs';
3
- import { SHAPE_PRESETS, DEFAULT_STROKE_COLOR, getConnectorPathGeometry, buildLineShadowCss, buildLineGlowFilter, renderConnectorMarker, MIN_ELEMENT_SIZE, getShapeVisualStyle, getTextStyleForElement, DEFAULT_TEXT_COLOR, renderVectorShape, isConnectorOrLineElement, build3DExtrusionData, getImageRenderStyle, cn, ANIMATION_PRESET_OPTIONS, resolvePalette, resolveStyle, layoutToCategory, wrapChrome, DEFAULT_FILL_COLOR, hasDagDuotoneEffect, renderDagDuotoneSvgFilter, getTextLayoutStyle, renderTableElement, renderMediaElement, shouldRenderFallbackLabel, getCropShapeClipPath, SLIDE_NAV_THUMBNAIL_WIDTH, styleShadow, styleStroke, colour, fitFontSize, smartArtNodeGroupProps, chevronPoints, SmartArtNodeText, truncate, renderStepDownProcess, renderAlternatingFlow, renderDescendingProcess, renderPictureAccentList, renderVerticalBlockList, renderGroupedList, renderPyramidList, renderHorizontalPictureList, renderAccentProcess, renderVerticalChevronList, isImageTiled, getImageTilingStyle, getDuotoneColors, getTextWarpStyle, renderTextSegments, buildReactChartViewModel, renderChartElement, buildTextBody3DSceneStyle, TOOLBAR_SECTIONS, SHORTCUT_REFERENCE_ITEMS as SHORTCUT_REFERENCE_ITEMS$1, buildTree, treeWidth, treeDepth, nodeOpacity, gearPath, resolveSmartArtDataPalette, DEFAULT_TEXT_FONT_SIZE, DEFAULT_FONT_FAMILY, HYPERLINK_COLOR, GRID_SIZE, CONNECTOR_ARROW_OPTIONS, ARROW_SIZE_OPTIONS, startPreviewAnimation, stopPreviewAnimation, THEME_COLOR_SWATCHES, STROKE_DASH_OPTIONS } from './chunk-FY2AFXKP.mjs';
4
- import { LOCALE_CATALOG, translationsEn } from './chunk-SL3XPERE.mjs';
5
- import { hasShapeProperties, normalizeHexColor, colorWithOpacity, normalizeStrokeDashType, getSvgStrokeDasharray, getCompoundLineOffsets, getCompoundLineWidths, svgLineCap, hasTextProperties, getElementTransform, ACTION_BUTTON_PRESETS, isEditableTextElement, isElementRendered, isElementActionable, getAriaRole, getAriaLabel, getAriaRoleDescription, getImageEffectsOpacity, getImageEffectsFilter, getElementTransformWithoutRotation, SWITCHABLE_LAYOUT_TYPES, DEFAULT_VIEWER_OPTIONS, compileEquationTemplateMathMl, buildUserFontFaceStyles, readStoredViewerPrefs, resolveThemeCatalogEntry, THEME_CATALOG, writeStoredViewerPrefs, openPptxFile, readBackstageRecentFile, viewerOptionsToPreferences, applyPreferenceToOptions, listAutosaveSnapshots, deleteAutosaveSnapshot, RULER_THICKNESS, RULER_FONT_SIZE, revealedSmartArtNodeCount, buildSmartArtA11y, buildCssGradientFromShapeStyle, resolveGroupChildFill, getGroupChildParentFill, getComputedEffectStyle, getSoftEdgeSvgFilter, buildStrokeOutline, svgGradientFillRef, isInkElement, getElementLabel, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, themeToCssVars, DEFAULT_INSERT_CHART_TYPE, hasCopyableFormat, createBackstagePresentation, printPropertiesFrameSlides, printPropertiesSlidesPerPage, VIEWER_OPTIONS_TABS, DEFAULT_QUICK_ACCESS_COMMAND_IDS, buildJoinCollaborationConfig, buildCreateCollaborationConfig, generateBroadcastRoomId, DEFAULT_BROADCAST_SERVER_URL, buildBroadcastViewerUrl, resolveTransportForServerUrl, resolveDrawingShapeNodeId, buildSummaryZoomView, getImageColorWashStyle, isImageLikeElement, getPendingSelectionRestore, restoreSegmentSelection, getTextCompensationTransform, applyChartBuildReveal, formatAxisValue, hasPressureVariation, getInkReplayStyles, INK_REPLAY_KEYFRAMES, resolveInkColor, resolveInkWidth, resolveInkOpacity, pressuresToWidths, getContentPartReplayStyles, resolveOleType, getOleTypeColor, getOleTypeLabel, filterRenderedElements, isLinkedTextBox, getOverflowSegments, shouldUseSvgWarp, getSlideBackgroundStyle, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, buildContextMenuEntries, themeColorSchemesEqual, STATUS_BAR_CLASSES, formatVersionTimestamp, formatRelativeTime, scanAvailableFontFamilies, PRESETS, CATEGORIES, convertOmmlToLatex, compileLatexEquation, convertLatexToOmml, EQUATION_TEMPLATES, clampPercent, HANDOUT_OPTIONS, TOOLBAR_TABS, SHORTCUT_REFERENCE_ITEMS, resolveViewerAddinRows, availableQuickAccessCommands, addQuickAccessCommand, removeQuickAccessCommand, moveQuickAccessCommand, activateModalFocus, buildCollaborationShareUrl, canGoPrevious, formatSlideCounter, READING_VIEW_COUNTER_ATTR, canGoNext, READING_VIEW_ATTR, mobileElapsedSince, isFirstSlide, isLastSlide, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, formatElapsed, computeInlineEditorRect, findSmartArtNodeText, setSmartArtNodeStyle, rebuildDrawingShapesIfCleared, shouldCommitSmartArtNodeText, updateSmartArtNodeText, getImageSvgFilters, buildDuotoneCacheKey, getDuotoneCachedResult, applyDuotone, setDuotoneCachedResult, buildCacheKey, DEFAULT_COLOR_CHANGE_TOLERANCE, getCachedResult, applyColorChange, setCachedResult, findChartPartTarget, dragValueForPart, withChartPointValue, dragAnchorViewY, withChartTitle, computeSmartArtLayout, buildSmartArt3DModel, extractPathPoints, generatePressureCircles, isBrowserOpenableMime, formatBytes, getOleBadgeLabel, openUrlInNewTab, getSubstituteFontFamily, getWarpPath, extraQuickAccessCommands, TAB_ROW_ACTION_CLASSES, listBackstageRecentFiles, BACKSTAGE_NAV, INSERT_CHART_TYPES, SLIDE_VIRTUALIZATION_THRESHOLD, getSlideTransitionAnimations, SLIDE_TRANSITION_KEYFRAMES, presentationInkPath, getShapeAdjustmentHandleDescriptor, PRESET_THEMES, isUrlSafe, sanitizeMathMl, computeHandoutLayout, getPrintableArea, generateNoteLineCount, computeAllNotesPages, getNotesPrintableArea, QUICK_ACCESS_COMMAND_CATALOG, openReadingView, applyReadingViewCommand, createPresentationKeyBuffer, readingViewFitScale, READING_VIEW_STAGE_ATTR, notesSegmentsToSpans, erasePresentationInkAt, movePresenterPointer, appendPresentationInkPoint, NOTES_FONT_SIZE_DEFAULT, formatTime, NOTES_FONT_SIZE_MIN, clampNotesFontSize, NOTES_FONT_SIZE_STEP, NOTES_FONT_SIZE_MAX, groupIntoParagraphs, substituteFieldText, BACKSTAGE_TEMPLATES, formatBackstageDate, formatBackstageSize, backstageCardsFor, DEFAULT_VIEWER_PROFILE, resolveProfileInitial, AVATAR_COLOR_SWATCHES, ENTRANCE_PRESET_VALUES, EMPHASIS_PRESET_VALUES, EXIT_PRESET_VALUES, getConnectionSites, generateTicks, rulerDragToGuidePosition, getCommentMarkerPosition, buildThemeColorGrid, THEME_COLOR_SCHEME_KEYS, THEME_COLOR_LABELS, COMMON_FONTS, buildSmartArtPresetData, handleReadingViewKey, getLocalStorageUsageSummary, saveViewerProfile, clearAllLocalViewerData, mergeSlideTransition, buildTableDataGrid, appendTableElementRow, removeLastTableElementRow, appendTableElementColumn, removeLastTableElementColumn, removeTableElementColumn, removeTableElementRow, setTableElementCellText, TABLE_STYLE_PRESETS, chartDataChangeType, setChartCategoryLabel, setChartCellValue, addChartCategory, removeChartCategory, addChartSeries, removeChartSeries, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, setChartDataPointMarker, setChartDataPointLabel, getOleObjectTypeLabel, sanitizeGradientStops, pptxActionToElementAction, withFrameSlides, withSlidesPerPage, applyThemeOverrideToSlide, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, TRANSITION_VALID_DIRECTIONS, TRANSITION_ORIENTATION_TYPES, clampTransitionNumber, flattenTagCollections, formatCommentTimestamp, DIRECTIONAL_PRESETS, computeMergeCellRight, computeMergeCellDown, computeSplitCell, addSmartArtNodeAsChild, removeSmartArtNode, clampCropValue, DUOTONE_PRESETS, ARTISTIC_EFFECTS, resolveActionType, ELEMENT_ACTION_TYPE_OPTIONS, toSlideIndex, elementActionToPptxAction, canCommitActionType, TRANSITION_DIR_ARROWS, buildDirectionGrid, updateTagInCollections, deleteTagFromCollections, addTagToCollections, LBL, SEL, FILL_MODE_OPTIONS, SECTION_HEADING, NUM, switchSmartArtLayout, addSmartArtNode, demoteSmartArtNode, promoteSmartArtNode, reorderSmartArtNode, SHAPE_QUICK_STYLES, quickStyleSwatchCss, getPatternSvg, TEXT_WARP_PRESETS, warpPreviewPath, text3dPtToEmu, text3dEmuToPt, MATERIAL_PRESETS, GRADIENT_TYPE_OPTIONS, PATTERN_OPTIONS, openNativeEyeDropper, toggleText3dExtrusion, BEVEL_PRESETS } from './chunk-TJ55KUWH.mjs';
6
- import React33, { createContext, useMemo, useState, useCallback, lazy, forwardRef, useEffect, useRef, useContext, Suspense, useLayoutEffect, Fragment as Fragment$1, useDeferredValue } from 'react';
1
+ import { computeFocusTargets, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, toRenderableParts } from './chunk-UZVRM6LD.mjs';
2
+ import { useReducedMotion, useViewerState, useViewerOptions, useIsMobile, useResizablePanels, useDerivedSlideState, useZoomViewport, useEditorHistory, usePresentationSetup, useTouchGestures, useViewerDialogs, useEditorOperations, useViewerIntegration, useYjsDocumentSync, useCollaborationLivePatch, useFollowMode, useBroadcastFollower, scopeLayoutOptionsToActiveSlide, useToolbarVisibility, useKeyboardInsets, useModalDismissDrag, useCollaborativeState, useVirtualizedSlides, useSwipeNavigation, useSheetDismissDrag, detectTargetType, parseEmailUrl, parseSlideFromUrl, ACTION_VERB_MAP, downloadBlob } from './chunk-HK2UERUX.mjs';
3
+ import { SHAPE_PRESETS, DEFAULT_STROKE_COLOR, getConnectorPathGeometry, buildLineShadowCss, buildLineGlowFilter, renderConnectorMarker, MIN_ELEMENT_SIZE, getShapeVisualStyle, getTextStyleForElement, DEFAULT_TEXT_COLOR, renderVectorShape, isConnectorOrLineElement, build3DExtrusionData, getImageRenderStyle, cn, ANIMATION_PRESET_OPTIONS, resolvePalette, resolveStyle, layoutToCategory, wrapChrome, DEFAULT_FILL_COLOR, hasDagDuotoneEffect, renderDagDuotoneSvgFilter, getTextLayoutStyle, renderTableElement, renderMediaElement, shouldRenderFallbackLabel, getCropShapeClipPath, SLIDE_NAV_THUMBNAIL_WIDTH, styleShadow, styleStroke, colour, fitFontSize, smartArtNodeGroupProps, chevronPoints, SmartArtNodeText, truncate, renderStepDownProcess, renderAlternatingFlow, renderDescendingProcess, renderPictureAccentList, renderVerticalBlockList, renderGroupedList, renderPyramidList, renderHorizontalPictureList, renderAccentProcess, renderVerticalChevronList, isImageTiled, getImageTilingStyle, getDuotoneColors, getTextWarpStyle, renderTextSegments, buildReactChartViewModel, renderChartElement, buildTextBody3DSceneStyle, TOOLBAR_SECTIONS, SHORTCUT_REFERENCE_ITEMS as SHORTCUT_REFERENCE_ITEMS$1, buildTree, treeWidth, treeDepth, nodeOpacity, gearPath, resolveSmartArtDataPalette, DEFAULT_TEXT_FONT_SIZE, DEFAULT_FONT_FAMILY, HYPERLINK_COLOR, GRID_SIZE, CONNECTOR_ARROW_OPTIONS, ARROW_SIZE_OPTIONS, startMotionPathPreview, startPreviewAnimation, stopPreviewAnimation, THEME_COLOR_SWATCHES, STROKE_DASH_OPTIONS } from './chunk-RJEY2KZH.mjs';
4
+ import { LOCALE_CATALOG, translationsEn } from './chunk-53NXKDMZ.mjs';
5
+ import { hasShapeProperties, normalizeHexColor, colorWithOpacity, normalizeStrokeDashType, getSvgStrokeDasharray, getCompoundLineOffsets, getCompoundLineWidths, svgLineCap, hasTextProperties, getElementTransform, ACTION_BUTTON_PRESETS, isEditableTextElement, isElementRendered, isElementActionable, getAriaRole, getAriaLabel, getAriaRoleDescription, getImageEffectsOpacity, getImageEffectsFilter, getElementTransformWithoutRotation, SWITCHABLE_LAYOUT_TYPES, DEFAULT_VIEWER_OPTIONS, compileEquationTemplateMathMl, buildUserFontFaceStyles, readStoredViewerPrefs, resolveThemeCatalogEntry, THEME_CATALOG, writeStoredViewerPrefs, openPptxFile, readBackstageRecentFile, viewerOptionsToPreferences, applyPreferenceToOptions, listAutosaveSnapshots, deleteAutosaveSnapshot, RULER_THICKNESS, RULER_FONT_SIZE, revealedSmartArtNodeCount, buildSmartArtA11y, buildCssGradientFromShapeStyle, resolveGroupChildFill, getGroupChildParentFill, getComputedEffectStyle, getSoftEdgeSvgFilter, buildStrokeOutline, svgGradientFillRef, isInkElement, getElementLabel, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, themeToCssVars, applyMotionPathPreset, DEFAULT_INSERT_CHART_TYPE, hasCopyableFormat, createBackstagePresentation, printPropertiesFrameSlides, printPropertiesSlidesPerPage, VIEWER_OPTIONS_TABS, DEFAULT_QUICK_ACCESS_COMMAND_IDS, buildJoinCollaborationConfig, buildCreateCollaborationConfig, generateBroadcastRoomId, DEFAULT_BROADCAST_SERVER_URL, buildBroadcastViewerUrl, resolveTransportForServerUrl, resolveDrawingShapeNodeId, buildSummaryZoomView, getImageColorWashStyle, isImageLikeElement, getPendingSelectionRestore, restoreSegmentSelection, getTextCompensationTransform, applyChartBuildReveal, formatAxisValue, hasPressureVariation, getInkReplayStyles, INK_REPLAY_KEYFRAMES, resolveInkColor, resolveInkWidth, resolveInkOpacity, pressuresToWidths, getContentPartReplayStyles, resolveOleType, getOleTypeColor, getOleTypeLabel, filterRenderedElements, isLinkedTextBox, getOverflowSegments, shouldUseSvgWarp, getSlideBackgroundStyle, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, buildContextMenuEntries, themeColorSchemesEqual, STATUS_BAR_CLASSES, formatVersionTimestamp, formatRelativeTime, scanAvailableFontFamilies, PRESETS, CATEGORIES, convertOmmlToLatex, compileLatexEquation, convertLatexToOmml, EQUATION_TEMPLATES, clampPercent, HANDOUT_OPTIONS, TOOLBAR_TABS, SHORTCUT_REFERENCE_ITEMS, resolveViewerAddinRows, availableQuickAccessCommands, addQuickAccessCommand, removeQuickAccessCommand, moveQuickAccessCommand, activateModalFocus, buildCollaborationShareUrl, canGoPrevious, formatSlideCounter, READING_VIEW_COUNTER_ATTR, canGoNext, READING_VIEW_ATTR, OUTLINE_LEVEL_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_ROW_ATTR, OUTLINE_VIEW_ATTR, mobileElapsedSince, isFirstSlide, isLastSlide, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, formatElapsed, computeInlineEditorRect, findSmartArtNodeText, setSmartArtNodeStyle, rebuildDrawingShapesIfCleared, shouldCommitSmartArtNodeText, updateSmartArtNodeText, getImageSvgFilters, buildDuotoneCacheKey, getDuotoneCachedResult, applyDuotone, setDuotoneCachedResult, buildCacheKey, DEFAULT_COLOR_CHANGE_TOLERANCE, getCachedResult, applyColorChange, setCachedResult, findChartPartTarget, dragValueForPart, withChartPointValue, dragAnchorViewY, withChartTitle, computeSmartArtLayout, buildSmartArt3DModel, extractPathPoints, generatePressureCircles, isBrowserOpenableMime, formatBytes, getOleBadgeLabel, openUrlInNewTab, getSubstituteFontFamily, getWarpPath, extraQuickAccessCommands, TAB_ROW_ACTION_CLASSES, listBackstageRecentFiles, BACKSTAGE_NAV, INSERT_CHART_TYPES, DEFAULT_MOTION_PATH_PRESET_ID, SLIDE_VIRTUALIZATION_THRESHOLD, getSlideTransitionAnimations, SLIDE_TRANSITION_KEYFRAMES, presentationInkPath, motionPathFor, setMotionPath, getShapeAdjustmentHandleDescriptor, PRESET_THEMES, isUrlSafe, sanitizeMathMl, computeHandoutLayout, getPrintableArea, generateNoteLineCount, computeAllNotesPages, getNotesPrintableArea, QUICK_ACCESS_COMMAND_CATALOG, openReadingView, applyReadingViewCommand, createPresentationKeyBuffer, readingViewFitScale, READING_VIEW_STAGE_ATTR, buildOutline, applyOutlineEdit, mapOutlineKey, notesSegmentsToSpans, erasePresentationInkAt, movePresenterPointer, appendPresentationInkPoint, NOTES_FONT_SIZE_DEFAULT, formatTime, NOTES_FONT_SIZE_MIN, clampNotesFontSize, NOTES_FONT_SIZE_STEP, NOTES_FONT_SIZE_MAX, groupIntoParagraphs, substituteFieldText, BACKSTAGE_TEMPLATES, formatBackstageDate, formatBackstageSize, backstageCardsFor, DEFAULT_VIEWER_PROFILE, resolveProfileInitial, AVATAR_COLOR_SWATCHES, ENTRANCE_PRESET_VALUES, EMPHASIS_PRESET_VALUES, EXIT_PRESET_VALUES, MOTION_PATH_FAMILIES, motionPathFamilyLabelKey, motionPathPresetsByFamily, motionPathPresetLabelKey, getConnectionSites, generateTicks, rulerDragToGuidePosition, getCommentMarkerPosition, motionPathToSvgD, motionPathEndPixel, isEditableMotionPath, setMotionPathEnd, buildThemeColorGrid, THEME_COLOR_SCHEME_KEYS, THEME_COLOR_LABELS, COMMON_FONTS, buildSmartArtPresetData, handleReadingViewKey, getLocalStorageUsageSummary, saveViewerProfile, clearAllLocalViewerData, mergeSlideTransition, buildTableDataGrid, appendTableElementRow, removeLastTableElementRow, appendTableElementColumn, removeLastTableElementColumn, removeTableElementColumn, removeTableElementRow, setTableElementCellText, TABLE_STYLE_PRESETS, chartDataChangeType, setChartCategoryLabel, setChartCellValue, addChartCategory, removeChartCategory, addChartSeries, removeChartSeries, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, setChartDataPointMarker, setChartDataPointLabel, getOleObjectTypeLabel, sanitizeGradientStops, pptxActionToElementAction, withFrameSlides, withSlidesPerPage, applyThemeOverrideToSlide, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, TRANSITION_VALID_DIRECTIONS, TRANSITION_ORIENTATION_TYPES, clampTransitionNumber, flattenTagCollections, formatCommentTimestamp, clearMotionPath, DIRECTIONAL_PRESETS, motionPathPresetIdForPath, computeMergeCellRight, computeMergeCellDown, computeSplitCell, addSmartArtNodeAsChild, removeSmartArtNode, clampCropValue, DUOTONE_PRESETS, ARTISTIC_EFFECTS, resolveActionType, ELEMENT_ACTION_TYPE_OPTIONS, toSlideIndex, elementActionToPptxAction, canCommitActionType, TRANSITION_DIR_ARROWS, buildDirectionGrid, updateTagInCollections, deleteTagFromCollections, addTagToCollections, LBL, SEL, FILL_MODE_OPTIONS, SECTION_HEADING, NUM, switchSmartArtLayout, addSmartArtNode, demoteSmartArtNode, promoteSmartArtNode, reorderSmartArtNode, SHAPE_QUICK_STYLES, quickStyleSwatchCss, getPatternSvg, TEXT_WARP_PRESETS, warpPreviewPath, text3dPtToEmu, text3dEmuToPt, MATERIAL_PRESETS, GRADIENT_TYPE_OPTIONS, PATTERN_OPTIONS, openNativeEyeDropper, toggleText3dExtrusion, BEVEL_PRESETS } from './chunk-C2UWTH42.mjs';
6
+ import React34, { createContext, useMemo, useState, useCallback, lazy, forwardRef, useEffect, useRef, useContext, Suspense, useLayoutEffect, Fragment as Fragment$1, useDeferredValue } from 'react';
7
7
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
8
  import { useTranslation } from 'react-i18next';
9
9
  import { LuRotateCw, LuMessageSquare, LuEyeOff, LuSettings, LuX, LuCalendarDays, LuHash, LuText, LuCast, LuSave, LuUndo, LuRedo, LuSearch, LuShieldCheck, LuPlus, LuPanelLeftClose, LuStickyNote, LuMonitor, LuColumns2, LuPresentation, LuMinus, LuLayers, LuSettings2, LuClock, LuDownload, LuTrash2, LuCheck, LuLock, LuEye, LuFileText, LuType, LuLoader, LuShieldAlert, LuSignature, LuInfo, LuTriangleAlert, LuPrinter, LuPenTool, LuBug, LuChevronUp, LuChevronDown, LuWifi, LuWifiOff, LuUsers, LuCopy, LuChevronLeft, LuChevronRight, LuPlay, LuPause, LuZoomOut, LuZoomIn, LuSpellCheck, LuFileDown, LuMenu, LuSparkles, LuShare2, LuPanelLeft, LuPanelRight, LuArrowLeft, LuFolderOpen, LuClipboardPaste, LuScissors, LuPaintbrush, LuSquare, LuImage, LuVideo, LuDatabase, LuAArrowUp, LuAArrowDown, LuRemoveFormatting, LuHighlighter, LuList, LuListOrdered, LuIndentDecrease, LuIndentIncrease, LuReplace, LuMousePointer2, LuShapes, LuPaintBucket, LuPenLine, LuPalette, LuPencil, LuStar, LuMoveRight, LuMousePointerClick, LuClock3, LuMonitorPlay, LuListVideo, LuCaptions, LuCamera, LuEraser, LuRotateCcw, LuCircleHelp, LuBookOpen, LuLanguages, LuGlobe, LuGitCompare, LuMessageSquarePlus, LuLockKeyhole, LuPanelTop, LuLayoutGrid, LuGrid3X3, LuPipette, LuRuler, LuMaximize2, LuCode, LuCaseSensitive, LuTimer, LuGripVertical, LuLoaderCircle, LuUpload, LuBold, LuItalic, LuUnderline, LuStrikethrough, LuLink, LuGrid2X2, LuCopyPlus, LuCirclePlay, LuCirclePause, LuScan, LuMonitorOff, LuClipboardCopy, LuWand, LuTextCursorInput, LuFile, LuEllipsis, LuUserRound, LuFilePlus2, LuHouse, LuPackage, LuBox, LuFileImage, LuUser, LuHardDrive, LuLogIn, LuFolderPlus, LuAlignLeft, LuAlignCenter, LuAlignRight, LuAlignJustify, LuColumns3, LuSpline, LuAlignHorizontalSpaceAround, LuAlignVerticalSpaceAround, LuGroup, LuUngroup, LuMove, LuRadio, LuLockOpen, LuArrowDown, LuArrowUp, LuArrowRight, LuReply, LuBookmark } from 'react-icons/lu';
@@ -523,6 +523,40 @@ function AnimationPresetGallery({
523
523
  }
524
524
  );
525
525
  }
526
+ function MotionPathGallery({
527
+ disabled,
528
+ onApplyMotionPath
529
+ }) {
530
+ const { t } = useTranslation();
531
+ return /* @__PURE__ */ jsx(
532
+ "div",
533
+ {
534
+ className: "flex max-h-[62px] items-start gap-2 overflow-y-auto rounded-sm border border-border/60 bg-muted/30 px-1.5 py-1",
535
+ "aria-label": t("pptx.animations.motionPathGalleryAria"),
536
+ children: MOTION_PATH_FAMILIES.map((family) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
537
+ /* @__PURE__ */ jsx("span", { className: "text-[9px] font-semibold leading-3 text-muted-foreground", children: t(motionPathFamilyLabelKey(family)) }),
538
+ /* @__PURE__ */ jsx("div", { className: "flex max-w-[150px] flex-wrap gap-0.5", children: motionPathPresetsByFamily(family).map((preset) => {
539
+ const label = t(motionPathPresetLabelKey(preset.id));
540
+ return /* @__PURE__ */ jsxs(
541
+ "button",
542
+ {
543
+ type: "button",
544
+ disabled,
545
+ onClick: () => onApplyMotionPath?.(preset.id),
546
+ title: label,
547
+ className: "inline-flex items-center gap-0.5 rounded-sm px-1 py-0.5 text-[9px] leading-3 text-foreground transition-colors hover:bg-accent disabled:opacity-35",
548
+ children: [
549
+ /* @__PURE__ */ jsx(LuMoveRight, { className: "h-2.5 w-2.5 text-sky-500", "aria-hidden": "true" }),
550
+ /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: label })
551
+ ]
552
+ },
553
+ preset.id
554
+ );
555
+ }) })
556
+ ] }, family))
557
+ }
558
+ );
559
+ }
526
560
  function RibbonGroup({
527
561
  label,
528
562
  children,
@@ -648,6 +682,13 @@ function AnimationsSection(p) {
648
682
  children: /* @__PURE__ */ jsx(AnimationPresetGallery, { disabled, onAddAnimation: p.onAddAnimation })
649
683
  }
650
684
  ),
685
+ /* @__PURE__ */ jsx(RibbonGroup, { label: t("pptx.animation.motionPath"), className: "max-w-[420px] overflow-hidden", children: /* @__PURE__ */ jsx(
686
+ MotionPathGallery,
687
+ {
688
+ disabled,
689
+ onApplyMotionPath: (presetId) => p.onAddAnimation?.(presetId, "motionPath")
690
+ }
691
+ ) }),
651
692
  /* @__PURE__ */ jsxs(RibbonGroup, { label: t("pptx.animations.advanced", { defaultValue: "Advanced Animation" }), children: [
652
693
  /* @__PURE__ */ jsx(
653
694
  RibbonCommand,
@@ -663,7 +704,7 @@ function AnimationsSection(p) {
663
704
  {
664
705
  label: t("pptx.animations.pathAnimation", { defaultValue: "Path Animation" }),
665
706
  icon: /* @__PURE__ */ jsx(LuMoveRight, {}),
666
- onClick: () => p.onAddAnimation?.("flyIn", "entrance"),
707
+ onClick: () => p.onAddAnimation?.(DEFAULT_MOTION_PATH_PRESET_ID, "motionPath"),
667
708
  disabled
668
709
  }
669
710
  ),
@@ -1203,11 +1244,11 @@ var TRANSITION_PRESETS = [
1203
1244
  ];
1204
1245
  function TransitionsSection(p) {
1205
1246
  const { t } = useTranslation();
1206
- const [selected, setSelected] = React33.useState("none");
1207
- const [duration, setDuration] = React33.useState("00.50");
1208
- const [advanceOnClick, setAdvanceOnClick] = React33.useState(true);
1209
- const [advanceAfter, setAdvanceAfter] = React33.useState(false);
1210
- const [advanceAfterSeconds, setAdvanceAfterSeconds] = React33.useState("00:00.00");
1247
+ const [selected, setSelected] = React34.useState("none");
1248
+ const [duration, setDuration] = React34.useState("00.50");
1249
+ const [advanceOnClick, setAdvanceOnClick] = React34.useState(true);
1250
+ const [advanceAfter, setAdvanceAfter] = React34.useState(false);
1251
+ const [advanceAfterSeconds, setAdvanceAfterSeconds] = React34.useState("00:00.00");
1211
1252
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1212
1253
  /* @__PURE__ */ jsxs("button", { type: "button", className: pill, title: t("pptx.ribbon.previewTransition"), children: [
1213
1254
  /* @__PURE__ */ jsx(LuPlay, { className: ics }),
@@ -1409,7 +1450,7 @@ function AccountPage() {
1409
1450
  return void 0;
1410
1451
  });
1411
1452
  };
1412
- const version = "2.9.0" ;
1453
+ const version = "2.10.0" ;
1413
1454
  return /* @__PURE__ */ jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
1414
1455
  /* @__PURE__ */ jsxs("section", { className: cardClass, children: [
1415
1456
  /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -3891,6 +3932,15 @@ function ViewSection(p) {
3891
3932
  title: t("pptx.view.slideSorterTooltip")
3892
3933
  }
3893
3934
  ),
3935
+ /* @__PURE__ */ jsx(
3936
+ RibbonCommand,
3937
+ {
3938
+ label: t("pptx.view.outlineView"),
3939
+ icon: /* @__PURE__ */ jsx(LuIndentIncrease, {}),
3940
+ onClick: p.onOpenOutlineView,
3941
+ title: t("pptx.view.outlineViewTooltip")
3942
+ }
3943
+ ),
3894
3944
  /* @__PURE__ */ jsx(
3895
3945
  RibbonCommand,
3896
3946
  {
@@ -5627,6 +5677,7 @@ function Toolbar(p) {
5627
5677
  onToggleEyedropper: p.onToggleEyedropper,
5628
5678
  onToggleSlideSorter: p.onToggleSlideSorter,
5629
5679
  onOpenReadingView: p.onOpenReadingView,
5680
+ onOpenOutlineView: p.onOpenOutlineView,
5630
5681
  onZoomToFit: p.onZoomToFit
5631
5682
  }
5632
5683
  ),
@@ -5930,6 +5981,127 @@ function GridOverlay({ canvasSize, gridSpacingPx = GRID_SIZE, visible }) {
5930
5981
  }
5931
5982
  );
5932
5983
  }
5984
+ function MotionPathOverlay({
5985
+ element,
5986
+ path,
5987
+ canvasSize,
5988
+ scale,
5989
+ canEdit,
5990
+ onChangePath
5991
+ }) {
5992
+ const { t } = useTranslation();
5993
+ const dragRef = useRef(null);
5994
+ const frame = {
5995
+ originX: element.x + element.width / 2,
5996
+ originY: element.y + element.height / 2,
5997
+ slideWidth: canvasSize.width,
5998
+ slideHeight: canvasSize.height
5999
+ };
6000
+ const d = motionPathToSvgD(path, frame);
6001
+ const end = motionPathEndPixel(path, frame);
6002
+ const editable = canEdit && Boolean(onChangePath) && isEditableMotionPath(path);
6003
+ const handlePointerDown = useCallback(
6004
+ (event) => {
6005
+ if (!editable) {
6006
+ return;
6007
+ }
6008
+ event.stopPropagation();
6009
+ event.preventDefault();
6010
+ event.currentTarget.setPointerCapture(event.pointerId);
6011
+ dragRef.current = {
6012
+ pointerId: event.pointerId,
6013
+ startX: event.clientX,
6014
+ startY: event.clientY
6015
+ };
6016
+ },
6017
+ [editable]
6018
+ );
6019
+ const handlePointerMove = useCallback(
6020
+ (event) => {
6021
+ const drag = dragRef.current;
6022
+ if (!drag || drag.pointerId !== event.pointerId || !onChangePath) {
6023
+ return;
6024
+ }
6025
+ event.stopPropagation();
6026
+ const dxPx = (event.clientX - drag.startX) / (scale || 1);
6027
+ const dyPx = (event.clientY - drag.startY) / (scale || 1);
6028
+ const nextX = (end.x + dxPx - frame.originX) / frame.slideWidth;
6029
+ const nextY = (end.y + dyPx - frame.originY) / frame.slideHeight;
6030
+ const next = setMotionPathEnd(path, nextX, nextY);
6031
+ if (next !== path) {
6032
+ dragRef.current = {
6033
+ pointerId: event.pointerId,
6034
+ startX: event.clientX,
6035
+ startY: event.clientY
6036
+ };
6037
+ onChangePath(next);
6038
+ }
6039
+ },
6040
+ [
6041
+ end.x,
6042
+ end.y,
6043
+ frame.originX,
6044
+ frame.originY,
6045
+ frame.slideWidth,
6046
+ frame.slideHeight,
6047
+ onChangePath,
6048
+ path,
6049
+ scale
6050
+ ]
6051
+ );
6052
+ const handlePointerUp = useCallback((event) => {
6053
+ if (dragRef.current?.pointerId === event.pointerId) {
6054
+ event.currentTarget.releasePointerCapture(event.pointerId);
6055
+ dragRef.current = null;
6056
+ }
6057
+ }, []);
6058
+ if (!d) {
6059
+ return null;
6060
+ }
6061
+ return /* @__PURE__ */ jsxs(
6062
+ "svg",
6063
+ {
6064
+ className: "pointer-events-none absolute left-0 top-0 z-[45]",
6065
+ width: canvasSize.width,
6066
+ height: canvasSize.height,
6067
+ role: "img",
6068
+ "aria-label": t("pptx.animation.motionPath.overlay"),
6069
+ "data-pptx-motion-path-overlay": "true",
6070
+ children: [
6071
+ /* @__PURE__ */ jsx(
6072
+ "path",
6073
+ {
6074
+ d,
6075
+ fill: "none",
6076
+ stroke: "#0ea5e9",
6077
+ strokeWidth: 2,
6078
+ strokeDasharray: "6 4",
6079
+ vectorEffect: "non-scaling-stroke"
6080
+ }
6081
+ ),
6082
+ /* @__PURE__ */ jsx("circle", { cx: frame.originX, cy: frame.originY, r: 5, fill: "#0ea5e9", opacity: 0.55 }),
6083
+ /* @__PURE__ */ jsx(
6084
+ "circle",
6085
+ {
6086
+ cx: end.x,
6087
+ cy: end.y,
6088
+ r: 7,
6089
+ fill: "#ffffff",
6090
+ stroke: "#0ea5e9",
6091
+ strokeWidth: 2,
6092
+ className: editable ? "pointer-events-auto cursor-move" : "",
6093
+ "aria-label": t("pptx.animation.motionPath.endHandle"),
6094
+ "data-pptx-motion-path-handle": "end",
6095
+ onPointerDown: handlePointerDown,
6096
+ onPointerMove: handlePointerMove,
6097
+ onPointerUp: handlePointerUp,
6098
+ onPointerCancel: handlePointerUp
6099
+ }
6100
+ )
6101
+ ]
6102
+ }
6103
+ );
6104
+ }
5933
6105
  function HorizontalRulerView({ ticks, widthPx, highlight }) {
5934
6106
  return /* @__PURE__ */ jsxs(
5935
6107
  "svg",
@@ -5993,7 +6165,7 @@ function HorizontalRulerView({ ticks, widthPx, highlight }) {
5993
6165
  }
5994
6166
  );
5995
6167
  }
5996
- var HorizontalRuler = React33.memo(HorizontalRulerView);
6168
+ var HorizontalRuler = React34.memo(HorizontalRulerView);
5997
6169
  HorizontalRuler.displayName = "HorizontalRuler";
5998
6170
  function VerticalRulerView({ ticks, heightPx, highlight }) {
5999
6171
  return /* @__PURE__ */ jsxs(
@@ -6065,7 +6237,7 @@ function VerticalRulerView({ ticks, heightPx, highlight }) {
6065
6237
  }
6066
6238
  );
6067
6239
  }
6068
- var VerticalRuler = React33.memo(VerticalRulerView);
6240
+ var VerticalRuler = React34.memo(VerticalRulerView);
6069
6241
  VerticalRuler.displayName = "VerticalRuler";
6070
6242
  function Ruler({
6071
6243
  canvasSize,
@@ -7017,7 +7189,7 @@ function ResizeHandles({
7017
7189
  ) : null
7018
7190
  ] });
7019
7191
  }
7020
- var ConnectorElementRenderer = React33.memo(
7192
+ var ConnectorElementRenderer = React34.memo(
7021
7193
  ({
7022
7194
  el,
7023
7195
  isSelected,
@@ -8523,10 +8695,10 @@ function InlineTextEditor({
8523
8695
  function FailedToLoad() {
8524
8696
  return null;
8525
8697
  }
8526
- var LazyModel3DScene = React33.lazy(
8698
+ var LazyModel3DScene = React34.lazy(
8527
8699
  async () => {
8528
8700
  try {
8529
- return await import('./Model3DScene-2VMN3B65.mjs');
8701
+ return await import('./Model3DScene-TTQFV7OS.mjs');
8530
8702
  } catch {
8531
8703
  return { default: FailedToLoad };
8532
8704
  }
@@ -8609,7 +8781,7 @@ function PosterFallback({
8609
8781
  }
8610
8782
  );
8611
8783
  }
8612
- var Model3DErrorBoundary = class extends React33.Component {
8784
+ var Model3DErrorBoundary = class extends React34.Component {
8613
8785
  constructor(props) {
8614
8786
  super(props);
8615
8787
  this.state = { hasError: false };
@@ -8800,10 +8972,10 @@ function SmartArtInlineNodeEditor({
8800
8972
  onCancel
8801
8973
  }) {
8802
8974
  const { t } = useTranslation();
8803
- const ref = React33.useRef(null);
8804
- const [value, setValue] = React33.useState(initialText);
8805
- const settled = React33.useRef(false);
8806
- React33.useEffect(() => {
8975
+ const ref = React34.useRef(null);
8976
+ const [value, setValue] = React34.useState(initialText);
8977
+ const settled = React34.useRef(false);
8978
+ React34.useEffect(() => {
8807
8979
  const el = ref.current;
8808
8980
  if (el) {
8809
8981
  el.focus();
@@ -8895,16 +9067,16 @@ function findNodeIdFromEvent(target) {
8895
9067
  return null;
8896
9068
  }
8897
9069
  function useSmartArtHoverState(containerRef) {
8898
- const [hoveredNodeId, setHoveredNodeId] = React33.useState(null);
8899
- const [hoveredNodeRect, setHoveredNodeRect] = React33.useState(null);
8900
- const hideTimeoutRef = React33.useRef(null);
8901
- const cancelPendingHide = React33.useCallback(() => {
9070
+ const [hoveredNodeId, setHoveredNodeId] = React34.useState(null);
9071
+ const [hoveredNodeRect, setHoveredNodeRect] = React34.useState(null);
9072
+ const hideTimeoutRef = React34.useRef(null);
9073
+ const cancelPendingHide = React34.useCallback(() => {
8902
9074
  if (hideTimeoutRef.current !== null) {
8903
9075
  window.clearTimeout(hideTimeoutRef.current);
8904
9076
  hideTimeoutRef.current = null;
8905
9077
  }
8906
9078
  }, []);
8907
- const handleMouseMove = React33.useCallback(
9079
+ const handleMouseMove = React34.useCallback(
8908
9080
  (e, ignoreRef) => {
8909
9081
  const nodeEl = findNodeIdFromEvent(e.target);
8910
9082
  const container = containerRef.current;
@@ -8932,12 +9104,12 @@ function useSmartArtHoverState(containerRef) {
8932
9104
  },
8933
9105
  [containerRef, cancelPendingHide]
8934
9106
  );
8935
- const clearHover = React33.useCallback(() => {
9107
+ const clearHover = React34.useCallback(() => {
8936
9108
  cancelPendingHide();
8937
9109
  setHoveredNodeId(null);
8938
9110
  setHoveredNodeRect(null);
8939
9111
  }, [cancelPendingHide]);
8940
- React33.useEffect(() => cancelPendingHide, [cancelPendingHide]);
9112
+ React34.useEffect(() => cancelPendingHide, [cancelPendingHide]);
8941
9113
  return { hoveredNodeId, hoveredNodeRect, handleMouseMove, clearHover };
8942
9114
  }
8943
9115
  var EDITOR_PADDING = 4;
@@ -8952,11 +9124,11 @@ function SmartArtEditableLayer({
8952
9124
  onChangeNodeStyle,
8953
9125
  children
8954
9126
  }) {
8955
- const containerRef = React33.useRef(null);
8956
- const styleBarRef = React33.useRef(null);
8957
- const [edit, setEdit] = React33.useState(null);
9127
+ const containerRef = React34.useRef(null);
9128
+ const styleBarRef = React34.useRef(null);
9129
+ const [edit, setEdit] = React34.useState(null);
8958
9130
  const { hoveredNodeId, hoveredNodeRect, handleMouseMove, clearHover } = useSmartArtHoverState(containerRef);
8959
- const openEditor = React33.useCallback(
9131
+ const openEditor = React34.useCallback(
8960
9132
  (target) => {
8961
9133
  const nodeEl = findNodeIdFromEvent(target);
8962
9134
  const container = containerRef.current;
@@ -10496,11 +10668,11 @@ function arePropsEqual(prev, next) {
10496
10668
  }
10497
10669
  return true;
10498
10670
  }
10499
- var SmartArtRenderer = React33.memo(SmartArtRendererImpl, arePropsEqual);
10671
+ var SmartArtRenderer = React34.memo(SmartArtRendererImpl, arePropsEqual);
10500
10672
  function FailedToLoad2() {
10501
10673
  return null;
10502
10674
  }
10503
- var LazySmartArt3DScene = React33.lazy(
10675
+ var LazySmartArt3DScene = React34.lazy(
10504
10676
  async () => {
10505
10677
  try {
10506
10678
  return await import('./SmartArt3DScene-XCFVGCXE.mjs');
@@ -10509,7 +10681,7 @@ var LazySmartArt3DScene = React33.lazy(
10509
10681
  }
10510
10682
  }
10511
10683
  );
10512
- var SceneErrorBoundary = class extends React33.Component {
10684
+ var SceneErrorBoundary = class extends React34.Component {
10513
10685
  constructor(props) {
10514
10686
  super(props);
10515
10687
  this.state = { hasError: false };
@@ -11268,7 +11440,7 @@ function renderBody(options) {
11268
11440
  }
11269
11441
  return renderTextElementBody(options);
11270
11442
  }
11271
- var Extrusion3DOverlay = React33.memo(({ data }) => {
11443
+ var Extrusion3DOverlay = React34.memo(({ data }) => {
11272
11444
  if (!data.hasExtrusion || data.panels.length === 0) {
11273
11445
  return null;
11274
11446
  }
@@ -11461,9 +11633,9 @@ function StaticElementRendererImpl({
11461
11633
  }
11462
11634
  );
11463
11635
  }
11464
- var StaticElementRenderer = React33.memo(StaticElementRendererImpl);
11636
+ var StaticElementRenderer = React34.memo(StaticElementRendererImpl);
11465
11637
  StaticElementRenderer.displayName = "StaticElementRenderer";
11466
- var ElementRenderer = React33.memo(
11638
+ var ElementRenderer = React34.memo(
11467
11639
  // oxlint-disable-next-line prefer-arrow-callback -- named fn gives the memo component its displayName
11468
11640
  function ElementRendererInner({
11469
11641
  element: el,
@@ -11864,6 +12036,7 @@ function SlideCanvas({
11864
12036
  onCreateGuideFromRuler,
11865
12037
  connectorCreationMode = false,
11866
12038
  onCreateConnector,
12039
+ onUpdateSlideAnimations,
11867
12040
  allSlides,
11868
12041
  onZoomClick,
11869
12042
  sourceSlideIndex,
@@ -11927,6 +12100,18 @@ function SlideCanvas({
11927
12100
  zoom,
11928
12101
  onMoveGuide
11929
12102
  });
12103
+ const selectedMotionPath = selectedElement ? motionPathFor(activeSlide?.animations ?? [], selectedElement.id) : void 0;
12104
+ const handleMotionPathChange = useCallback(
12105
+ (path) => {
12106
+ if (!selectedElement || !onUpdateSlideAnimations) {
12107
+ return;
12108
+ }
12109
+ onUpdateSlideAnimations(
12110
+ setMotionPath(activeSlide?.animations ?? [], selectedElement.id, path)
12111
+ );
12112
+ },
12113
+ [activeSlide?.animations, onUpdateSlideAnimations, selectedElement]
12114
+ );
11930
12115
  const {
11931
12116
  connectorDragState,
11932
12117
  handleConnectionSiteDown,
@@ -11996,6 +12181,10 @@ function SlideCanvas({
11996
12181
  height: canvasSize.height,
11997
12182
  transform: `scale(${zoom.editorScale})`,
11998
12183
  transformOrigin: "top left",
12184
+ // Motion-path keyframes translate by a fraction of the SLIDE, so
12185
+ // the stage publishes its own size for those calc() offsets.
12186
+ ["--pptx-slide-w"]: `${canvasSize.width}px`,
12187
+ ["--pptx-slide-h"]: `${canvasSize.height}px`,
11999
12188
  marginTop: rulerOffset,
12000
12189
  marginLeft: rulerOffset,
12001
12190
  // In edit/master mode the stage must own all touch gestures so
@@ -12133,6 +12322,17 @@ function SlideCanvas({
12133
12322
  onConnectorDragEnd: handleConnectorDragEnd
12134
12323
  }
12135
12324
  ),
12325
+ isEditableCanvas && selectedElement && selectedMotionPath && /* @__PURE__ */ jsx(
12326
+ MotionPathOverlay,
12327
+ {
12328
+ element: selectedElement,
12329
+ path: selectedMotionPath,
12330
+ canvasSize,
12331
+ scale: zoom.editorScale,
12332
+ canEdit,
12333
+ onChangePath: handleMotionPathChange
12334
+ }
12335
+ ),
12136
12336
  isDrawing && /* @__PURE__ */ jsx(
12137
12337
  DrawingOverlaySvg,
12138
12338
  {
@@ -12705,7 +12905,7 @@ function arePropsEqual2(prev, next) {
12705
12905
  }
12706
12906
  return true;
12707
12907
  }
12708
- var SlideThumbnail = React33.memo(SlideThumbnailImpl, arePropsEqual2);
12908
+ var SlideThumbnail = React34.memo(SlideThumbnailImpl, arePropsEqual2);
12709
12909
 
12710
12910
  // src/viewer/components/context-menu-dispatch.ts
12711
12911
  function tableCell(props) {
@@ -13254,7 +13454,7 @@ function LazyThumbnailInner({
13254
13454
  }
13255
13455
  ) });
13256
13456
  }
13257
- var LazyThumbnail = React33.memo(LazyThumbnailInner);
13457
+ var LazyThumbnail = React34.memo(LazyThumbnailInner);
13258
13458
 
13259
13459
  // src/viewer/components/slides-pane/utils.ts
13260
13460
  function formatTimingMs(ms) {
@@ -13400,7 +13600,7 @@ function SlideItemInner({
13400
13600
  }
13401
13601
  );
13402
13602
  }
13403
- var SlideItem = React33.memo(SlideItemInner);
13603
+ var SlideItem = React34.memo(SlideItemInner);
13404
13604
  function useSlidePaneCallbacks(onMoveSlide, onRenameSection) {
13405
13605
  const [collapsedSections, setCollapsedSections] = useState({});
13406
13606
  const [renamingSectionId, setRenamingSectionId] = useState(null);
@@ -14669,7 +14869,7 @@ function arePropsEqual3(prev, next) {
14669
14869
  }
14670
14870
  return true;
14671
14871
  }
14672
- var SlideCard = React33.memo(SlideCardImpl, arePropsEqual3);
14872
+ var SlideCard = React34.memo(SlideCardImpl, arePropsEqual3);
14673
14873
  function SorterContextMenu({
14674
14874
  x,
14675
14875
  y,
@@ -15301,6 +15501,130 @@ function SlideSorterOverlay({
15301
15501
  }
15302
15502
  );
15303
15503
  }
15504
+ function useOutlineView(input) {
15505
+ const { slides, canvasSize, canEdit, setSlides, setActiveSlideIndex, bumpHistory } = input;
15506
+ const rows = useMemo(() => buildOutline(slides), [slides]);
15507
+ const containerRef = useRef(null);
15508
+ const pendingFocusRef = useRef(null);
15509
+ const run = useCallback(
15510
+ (edit) => {
15511
+ if (!canEdit) {
15512
+ return;
15513
+ }
15514
+ const result = applyOutlineEdit(slides, edit, { canvas: canvasSize });
15515
+ if (!result.changed) {
15516
+ return;
15517
+ }
15518
+ setSlides(result.slides);
15519
+ setActiveSlideIndex(result.activeSlideIndex);
15520
+ bumpHistory();
15521
+ pendingFocusRef.current = result.focusKey;
15522
+ },
15523
+ [bumpHistory, canEdit, canvasSize, setActiveSlideIndex, setSlides, slides]
15524
+ );
15525
+ const onRowKeyDown = useCallback(
15526
+ (event, rowKey) => {
15527
+ const { edit, preventDefault } = mapOutlineKey(event, rowKey);
15528
+ if (preventDefault) {
15529
+ event.preventDefault();
15530
+ }
15531
+ if (edit) {
15532
+ run(edit);
15533
+ }
15534
+ },
15535
+ [run]
15536
+ );
15537
+ useEffect(() => {
15538
+ const key = pendingFocusRef.current;
15539
+ if (!key) {
15540
+ return;
15541
+ }
15542
+ pendingFocusRef.current = null;
15543
+ const selector = `[${OUTLINE_ROW_ATTR}="${CSS.escape(key)}"]`;
15544
+ const target = containerRef.current?.querySelector(selector);
15545
+ if (target && document.activeElement !== target) {
15546
+ target.focus();
15547
+ target.setSelectionRange(target.value.length, target.value.length);
15548
+ }
15549
+ }, [rows]);
15550
+ return { rows, containerRef, run, onRowKeyDown };
15551
+ }
15552
+ var INDENT_PX = 22;
15553
+ function OutlineViewOverlay({
15554
+ slides,
15555
+ canvasSize,
15556
+ canEdit,
15557
+ setSlides,
15558
+ setActiveSlideIndex,
15559
+ bumpHistory,
15560
+ onClose
15561
+ }) {
15562
+ const { t } = useTranslation();
15563
+ const { rows, containerRef, run, onRowKeyDown } = useOutlineView({
15564
+ slides,
15565
+ canvasSize,
15566
+ canEdit,
15567
+ setSlides,
15568
+ setActiveSlideIndex,
15569
+ bumpHistory
15570
+ });
15571
+ return /* @__PURE__ */ jsxs(
15572
+ "div",
15573
+ {
15574
+ ...{ [OUTLINE_VIEW_ATTR]: "true" },
15575
+ role: "region",
15576
+ "aria-label": t("pptx.view.outlineView"),
15577
+ className: "fixed inset-0 z-[1300] flex flex-col bg-neutral-900 text-neutral-100",
15578
+ children: [
15579
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-b border-white/10 px-4 py-2", children: [
15580
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold", children: t("pptx.view.outlineView") }),
15581
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-[11px] text-white/50", children: t("pptx.outline.hint") }),
15582
+ /* @__PURE__ */ jsx(
15583
+ "button",
15584
+ {
15585
+ type: "button",
15586
+ className: "inline-flex h-8 w-8 items-center justify-center rounded text-white/80 transition-colors hover:bg-white/15 hover:text-white",
15587
+ "aria-label": t("pptx.statusBar.normalView"),
15588
+ title: t("pptx.statusBar.normalView"),
15589
+ onClick: onClose,
15590
+ children: /* @__PURE__ */ jsx(LuX, {})
15591
+ }
15592
+ )
15593
+ ] }),
15594
+ /* @__PURE__ */ jsx("div", { ref: containerRef, className: "min-h-0 flex-1 overflow-auto px-4 py-3", children: rows.map((row) => /* @__PURE__ */ jsxs(
15595
+ "div",
15596
+ {
15597
+ className: "flex items-center gap-2 py-0.5",
15598
+ style: { paddingLeft: row.level * INDENT_PX },
15599
+ children: [
15600
+ /* @__PURE__ */ jsx("span", { className: "w-6 shrink-0 text-right text-[10px] tabular-nums text-white/40", children: row.kind === "title" ? row.slideIndex + 1 : "" }),
15601
+ /* @__PURE__ */ jsx(
15602
+ "input",
15603
+ {
15604
+ ...{
15605
+ [OUTLINE_ROW_ATTR]: row.key,
15606
+ [OUTLINE_SLIDE_ATTR]: String(row.slideIndex + 1),
15607
+ [OUTLINE_LEVEL_ATTR]: String(row.level)
15608
+ },
15609
+ type: "text",
15610
+ value: row.text,
15611
+ readOnly: !canEdit,
15612
+ "aria-label": t(
15613
+ row.kind === "title" ? "pptx.outline.titleLine" : "pptx.outline.bodyLine"
15614
+ ),
15615
+ className: row.kind === "title" ? "w-full rounded bg-transparent px-1 py-0.5 text-sm font-semibold outline-none focus:bg-white/10" : "w-full rounded bg-transparent px-1 py-0.5 text-[13px] text-white/80 outline-none focus:bg-white/10",
15616
+ onChange: (event) => run({ type: "setText", key: row.key, text: event.target.value }),
15617
+ onKeyDown: (event) => onRowKeyDown(event, row.key)
15618
+ }
15619
+ )
15620
+ ]
15621
+ },
15622
+ row.key
15623
+ )) })
15624
+ ]
15625
+ }
15626
+ );
15627
+ }
15304
15628
  function ReadingViewStage({
15305
15629
  slide,
15306
15630
  templateElements,
@@ -15509,7 +15833,7 @@ var DEBOUNCE_MS = 600;
15509
15833
  var EXPANDED_MAX_HEIGHT = 200;
15510
15834
  var PX_TO_PT = 0.75;
15511
15835
  var MAX_INDENT_LEVEL = 4;
15512
- var INDENT_PX = 24;
15836
+ var INDENT_PX2 = 24;
15513
15837
  function escapeHtml(value) {
15514
15838
  return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
15515
15839
  }
@@ -15564,7 +15888,7 @@ function buildParagraph(segments) {
15564
15888
  if (first?.style.paragraphMarginLeft) {
15565
15889
  indentLevel = Math.min(
15566
15890
  MAX_INDENT_LEVEL,
15567
- Math.max(0, Math.round(first.style.paragraphMarginLeft / INDENT_PX))
15891
+ Math.max(0, Math.round(first.style.paragraphMarginLeft / INDENT_PX2))
15568
15892
  );
15569
15893
  }
15570
15894
  return {
@@ -15609,7 +15933,7 @@ function paragraphsToSegments(paragraphs) {
15609
15933
  para.segments.forEach((seg, sIdx) => {
15610
15934
  const updated = { ...seg, style: { ...seg.style } };
15611
15935
  if (para.indentLevel > 0) {
15612
- updated.style.paragraphMarginLeft = para.indentLevel * INDENT_PX;
15936
+ updated.style.paragraphMarginLeft = para.indentLevel * INDENT_PX2;
15613
15937
  } else {
15614
15938
  delete updated.style.paragraphMarginLeft;
15615
15939
  }
@@ -15766,7 +16090,7 @@ function parseSegmentsFromRichEditor(root) {
15766
16090
  if (paraIndent > 0) {
15767
16091
  segments[i].style = {
15768
16092
  ...segments[i].style,
15769
- paragraphMarginLeft: paraIndent * INDENT_PX
16093
+ paragraphMarginLeft: paraIndent * INDENT_PX2
15770
16094
  };
15771
16095
  }
15772
16096
  break;
@@ -15830,7 +16154,7 @@ function segmentsToEditorHtml(segments) {
15830
16154
  if (para.indentLevel > 0) {
15831
16155
  attrs.push(`data-indent-level="${para.indentLevel}"`);
15832
16156
  }
15833
- const indent = para.indentLevel * INDENT_PX;
16157
+ const indent = para.indentLevel * INDENT_PX2;
15834
16158
  const divStyles = [];
15835
16159
  if (indent > 0) {
15836
16160
  divStyles.push(`padding-left:${indent}px`);
@@ -15858,7 +16182,7 @@ function renderRichNotesSegments(segments) {
15858
16182
  }
15859
16183
  const divStyle = {};
15860
16184
  if (para.indentLevel > 0) {
15861
- divStyle.paddingLeft = para.indentLevel * INDENT_PX;
16185
+ divStyle.paddingLeft = para.indentLevel * INDENT_PX2;
15862
16186
  }
15863
16187
  const children = [];
15864
16188
  if (para.bulletType === "bullet") {
@@ -18374,9 +18698,9 @@ function PresentationSubtitleBar({
18374
18698
  function renderNotesSegments(segments) {
18375
18699
  return notesSegmentsToSpans(segments).map((span) => {
18376
18700
  if (span.kind === "break") {
18377
- return React33.createElement("br", { key: span.key });
18701
+ return React34.createElement("br", { key: span.key });
18378
18702
  }
18379
- return React33.createElement(
18703
+ return React34.createElement(
18380
18704
  "span",
18381
18705
  { key: span.key, style: span.style },
18382
18706
  span.text
@@ -18583,7 +18907,7 @@ function arePropsEqual4(prev, next) {
18583
18907
  }
18584
18908
  return true;
18585
18909
  }
18586
- var ScaledSlidePreview = React33.memo(ScaledSlidePreviewImpl, arePropsEqual4);
18910
+ var ScaledSlidePreview = React34.memo(ScaledSlidePreviewImpl, arePropsEqual4);
18587
18911
  function PresenterNotesRail({
18588
18912
  slides,
18589
18913
  current,
@@ -19614,6 +19938,33 @@ function AnimationTimelineSection({
19614
19938
  ] })
19615
19939
  ] });
19616
19940
  }
19941
+ function MotionPathRow({
19942
+ motionPath,
19943
+ canEdit,
19944
+ onChange
19945
+ }) {
19946
+ const { t } = useTranslation();
19947
+ const presetId = motionPathPresetIdForPath(motionPath);
19948
+ const isCustom = Boolean(motionPath) && !presetId;
19949
+ return /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1", children: [
19950
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-[11px]", children: t("pptx.animation.motionPath.label") }),
19951
+ /* @__PURE__ */ jsxs(
19952
+ "select",
19953
+ {
19954
+ value: isCustom ? "custom" : presetId ?? "none",
19955
+ onChange: (event) => onChange(event.target.value),
19956
+ disabled: !canEdit,
19957
+ className: SELECT_CLS,
19958
+ children: [
19959
+ /* @__PURE__ */ jsx("option", { value: "none", children: t("pptx.animation.motionPath.none") }),
19960
+ isCustom && /* @__PURE__ */ jsx("option", { value: "custom", children: t("pptx.animation.motionPath.custom") }),
19961
+ MOTION_PATH_FAMILIES.map((family) => /* @__PURE__ */ jsx("optgroup", { label: t(motionPathFamilyLabelKey(family)), children: motionPathPresetsByFamily(family).map((preset) => /* @__PURE__ */ jsx("option", { value: preset.id, children: t(motionPathPresetLabelKey(preset.id)) }, preset.id)) }, family))
19962
+ ]
19963
+ }
19964
+ ),
19965
+ motionPath && /* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground", children: t("pptx.animation.motionPath.editHint") })
19966
+ ] });
19967
+ }
19617
19968
  function useAnimationDragDrop({
19618
19969
  canEdit,
19619
19970
  updateAnimations
@@ -19720,6 +20071,14 @@ function useAnimationPreview({
19720
20071
  selectedElementAnimation
19721
20072
  }) {
19722
20073
  const handleAnimationHover = useCallback((anim) => {
20074
+ if (anim.motionPath) {
20075
+ startMotionPathPreview(anim.elementId, anim.motionPath, {
20076
+ durationMs: anim.durationMs,
20077
+ delayMs: anim.delayMs,
20078
+ timingCurve: anim.timingCurve
20079
+ });
20080
+ return;
20081
+ }
19723
20082
  const preset = anim.entrance ?? anim.emphasis ?? anim.exit;
19724
20083
  if (!preset || preset === "none") {
19725
20084
  return;
@@ -19735,6 +20094,14 @@ function useAnimationPreview({
19735
20094
  if (!selectedElementAnimation) {
19736
20095
  return;
19737
20096
  }
20097
+ if (selectedElementAnimation.motionPath) {
20098
+ startMotionPathPreview(selectedElementId, selectedElementAnimation.motionPath, {
20099
+ durationMs: selectedElementAnimation.durationMs,
20100
+ delayMs: selectedElementAnimation.delayMs,
20101
+ timingCurve: selectedElementAnimation.timingCurve
20102
+ });
20103
+ return;
20104
+ }
19738
20105
  const preset = selectedElementAnimation.entrance ?? selectedElementAnimation.emphasis ?? selectedElementAnimation.exit;
19739
20106
  if (!preset || preset === "none") {
19740
20107
  return;
@@ -19794,7 +20161,7 @@ function useAnimationHandlers({
19794
20161
  const idx = anims.findIndex((a) => a.elementId === selectedElement.id);
19795
20162
  const hasEffect = entrance || exit || emphasis;
19796
20163
  if (idx >= 0) {
19797
- if (!hasEffect) {
20164
+ if (!hasEffect && !anims[idx].motionPath) {
19798
20165
  return anims.filter((a) => a.elementId !== selectedElement.id);
19799
20166
  }
19800
20167
  anims[idx] = {
@@ -19852,6 +20219,20 @@ function useAnimationHandlers({
19852
20219
  },
19853
20220
  [setAnimationPreset, selectedElementAnimation]
19854
20221
  );
20222
+ const handleMotionPathChange = useCallback(
20223
+ (presetId) => {
20224
+ if (!canEdit) {
20225
+ return;
20226
+ }
20227
+ if (presetId === "custom") {
20228
+ return;
20229
+ }
20230
+ updateAnimations(
20231
+ (anims) => presetId === "none" ? clearMotionPath(anims, selectedElement.id) : applyMotionPathPreset(anims, selectedElement.id, presetId)
20232
+ );
20233
+ },
20234
+ [canEdit, updateAnimations, selectedElement.id]
20235
+ );
19855
20236
  const handleTriggerChange = useCallback(
19856
20237
  (event) => {
19857
20238
  const newTrigger = event.target.value;
@@ -19917,7 +20298,7 @@ function useAnimationHandlers({
19917
20298
  [activeSlide.elements]
19918
20299
  );
19919
20300
  const hasAnimation = Boolean(
19920
- selectedElementAnimation?.entrance || selectedElementAnimation?.exit || selectedElementAnimation?.emphasis
20301
+ selectedElementAnimation?.entrance || selectedElementAnimation?.exit || selectedElementAnimation?.emphasis || selectedElementAnimation?.motionPath
19921
20302
  );
19922
20303
  const showDirectionPicker = hasAnimation && (DIRECTIONAL_PRESETS.has(selectedElementAnimation?.entrance ?? "") || DIRECTIONAL_PRESETS.has(selectedElementAnimation?.exit ?? ""));
19923
20304
  const timelineBarData = useMemo(() => {
@@ -19959,6 +20340,7 @@ function useAnimationHandlers({
19959
20340
  handleRepeatModeChange,
19960
20341
  handleDirectionChange,
19961
20342
  handleSequenceChange,
20343
+ handleMotionPathChange,
19962
20344
  getTimelineLabel,
19963
20345
  ...preview,
19964
20346
  ...dragDrop
@@ -19993,6 +20375,7 @@ function AnimationPanel({
19993
20375
  handleRepeatModeChange,
19994
20376
  handleDirectionChange,
19995
20377
  handleSequenceChange,
20378
+ handleMotionPathChange,
19996
20379
  handlePreviewClick
19997
20380
  } = handlers;
19998
20381
  return /* @__PURE__ */ jsxs("div", { className: "rounded border border-border bg-card p-2 space-y-2", children: [
@@ -20060,6 +20443,14 @@ function AnimationPanel({
20060
20443
  }
20061
20444
  )
20062
20445
  ] }),
20446
+ /* @__PURE__ */ jsx(
20447
+ MotionPathRow,
20448
+ {
20449
+ motionPath: selectedElementAnimation?.motionPath,
20450
+ canEdit,
20451
+ onChange: handleMotionPathChange
20452
+ }
20453
+ ),
20063
20454
  hasAnimation && /* @__PURE__ */ jsxs(Fragment, { children: [
20064
20455
  showDirectionPicker && /* @__PURE__ */ jsxs("div", { className: "pt-1 border-t border-border", children: [
20065
20456
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-[11px] block mb-1", children: t("pptx.animation.direction") }),
@@ -22010,7 +22401,7 @@ function ConnectorArrowsSection({
22010
22401
  ["Start", "End"].map((end) => {
22011
22402
  const widthKey = end === "Start" ? "connectorStartArrowWidth" : "connectorEndArrowWidth";
22012
22403
  const lengthKey = end === "Start" ? "connectorStartArrowLength" : "connectorEndArrowLength";
22013
- return /* @__PURE__ */ jsxs(React33.Fragment, { children: [
22404
+ return /* @__PURE__ */ jsxs(React34.Fragment, { children: [
22014
22405
  /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1", children: [
22015
22406
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t(END_LABEL_KEYS[end].width) }),
22016
22407
  /* @__PURE__ */ jsx(
@@ -24839,7 +25230,7 @@ function StrokeEffectsSection({
24839
25230
  ] }),
24840
25231
  EFFECT_CONFIGS.map((cfg) => {
24841
25232
  const on = cfg.isOn(style);
24842
- return /* @__PURE__ */ jsxs(React33.Fragment, { children: [
25233
+ return /* @__PURE__ */ jsxs(React34.Fragment, { children: [
24843
25234
  /* @__PURE__ */ jsxs("label", { className: `inline-flex items-center gap-2 text-foreground ${COL2}`, children: [
24844
25235
  /* @__PURE__ */ jsx(
24845
25236
  "input",
@@ -25676,7 +26067,7 @@ function TextWarpGallery({
25676
26067
  onUpdateTextStyle
25677
26068
  }) {
25678
26069
  const { t } = useTranslation();
25679
- const [expanded, setExpanded] = React33.useState(false);
26070
+ const [expanded, setExpanded] = React34.useState(false);
25680
26071
  const currentPreset = ts?.textWarpPreset || "textNoShape";
25681
26072
  return /* @__PURE__ */ jsxs("div", { className: "mt-2 rounded border border-border bg-card p-2 space-y-2", children: [
25682
26073
  /* @__PURE__ */ jsxs(
@@ -26401,9 +26792,9 @@ function SmartArtPropertiesPanel({
26401
26792
  const nodes = smartArtData.nodes ?? [];
26402
26793
  const layout = smartArtData.resolvedLayoutType;
26403
26794
  const topLevelCount = nodes.filter((n) => !n.parentId).length;
26404
- const inputRefs = React33.useRef(/* @__PURE__ */ new Map());
26405
- const pendingFocusId = React33.useRef(null);
26406
- React33.useEffect(() => {
26795
+ const inputRefs = React34.useRef(/* @__PURE__ */ new Map());
26796
+ const pendingFocusId = React34.useRef(null);
26797
+ React34.useEffect(() => {
26407
26798
  const id = pendingFocusId.current;
26408
26799
  if (id) {
26409
26800
  inputRefs.current.get(id)?.focus();
@@ -28870,7 +29261,7 @@ function PresentationPropertiesPanel({
28870
29261
  onUpdateTagCollections
28871
29262
  }) {
28872
29263
  const { t } = useTranslation();
28873
- const handleTransitionChange = React33.useCallback(
29264
+ const handleTransitionChange = React34.useCallback(
28874
29265
  (updates) => {
28875
29266
  onUpdateSlide({
28876
29267
  transition: mergeSlideTransition(activeSlide?.transition, updates)
@@ -32183,6 +32574,7 @@ function ViewerOverlays({
32183
32574
  isAccessibilityPanelOpen,
32184
32575
  showSlideSorter,
32185
32576
  showReadingView,
32577
+ showOutlineView,
32186
32578
  templateElements,
32187
32579
  accessibilityIssues,
32188
32580
  slides,
@@ -32199,10 +32591,14 @@ function ViewerOverlays({
32199
32591
  onToggleHideSlides,
32200
32592
  onCloseSorter,
32201
32593
  onCloseReadingView,
32594
+ onCloseOutlineView,
32595
+ setSlides,
32596
+ setActiveSlideIndex,
32597
+ bumpHistory,
32202
32598
  reducedMotion,
32203
32599
  onToggleReducedMotion
32204
32600
  }) {
32205
- const hasOverlay = isShortcutHelpOpen || isAccessibilityPanelOpen || showSlideSorter || showReadingView;
32601
+ const hasOverlay = isShortcutHelpOpen || isAccessibilityPanelOpen || showSlideSorter || showReadingView || showOutlineView;
32206
32602
  if (!hasOverlay) {
32207
32603
  return null;
32208
32604
  }
@@ -32243,6 +32639,18 @@ function ViewerOverlays({
32243
32639
  activeSlideIndex,
32244
32640
  onExit: onCloseReadingView
32245
32641
  }
32642
+ ),
32643
+ showOutlineView && /* @__PURE__ */ jsx(
32644
+ OutlineViewOverlay,
32645
+ {
32646
+ slides,
32647
+ canvasSize,
32648
+ canEdit,
32649
+ setSlides,
32650
+ setActiveSlideIndex,
32651
+ bumpHistory,
32652
+ onClose: onCloseOutlineView
32653
+ }
32246
32654
  )
32247
32655
  ] });
32248
32656
  }
@@ -32731,6 +33139,12 @@ function ViewerToolbarSection(props) {
32731
33139
  return;
32732
33140
  }
32733
33141
  const current = activeSlide.animations ?? [];
33142
+ if (group === "motionPath") {
33143
+ propertyHandlers.handleUpdateSlide({
33144
+ animations: applyMotionPathPreset(current, selectedElement.id, preset)
33145
+ });
33146
+ return;
33147
+ }
32734
33148
  const existing = current.find((a) => a.elementId === selectedElement.id);
32735
33149
  const presetValue = preset;
32736
33150
  if (existing) {
@@ -32769,7 +33183,7 @@ function ViewerToolbarSection(props) {
32769
33183
  },
32770
33184
  [activeSlide, propertyHandlers]
32771
33185
  );
32772
- const scopedLayoutOptions = React33.useMemo(
33186
+ const scopedLayoutOptions = React34.useMemo(
32773
33187
  () => scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
32774
33188
  [s.layoutOptions, activeSlide]
32775
33189
  );
@@ -33068,6 +33482,7 @@ function ViewerToolbarSection(props) {
33068
33482
  onRunAccessibilityCheck: dialogs.handleRunAccessibilityCheck,
33069
33483
  onToggleSlideSorter: () => s.setShowSlideSorter((p) => !p),
33070
33484
  onOpenReadingView: () => s.setShowReadingView(true),
33485
+ onOpenOutlineView: () => s.setShowOutlineView(true),
33071
33486
  onUpdateTextStyle: ops.updateSelectedTextStyle,
33072
33487
  onTransformTextCase: ops.updateSelectedTextCase,
33073
33488
  isOverflowMenuOpen: s.isOverflowMenuOpen,
@@ -33909,6 +34324,10 @@ function PresentationStage({
33909
34324
  height: safeHeight,
33910
34325
  transform: `scale(${scale})`,
33911
34326
  transformOrigin: "top left",
34327
+ // Motion-path keyframes translate by a fraction of the SLIDE, so
34328
+ // the stage publishes its own size for those calc() offsets.
34329
+ "--pptx-slide-w": `${safeWidth}px`,
34330
+ "--pptx-slide-h": `${safeHeight}px`,
33912
34331
  ...getReactSlideBackgroundStyle(activeSlide)
33913
34332
  },
33914
34333
  children: [
@@ -34333,6 +34752,7 @@ ${url}`)) {
34333
34752
  ) : /* @__PURE__ */ jsx(
34334
34753
  SlideCanvas,
34335
34754
  {
34755
+ onUpdateSlideAnimations: props.onUpdateSlideAnimations,
34336
34756
  activeSlide: effectiveSlide,
34337
34757
  templateElements: effectiveTemplateElements,
34338
34758
  canvasSize,
@@ -34515,7 +34935,7 @@ ${url}`)) {
34515
34935
  )
34516
34936
  );
34517
34937
  }
34518
- var AiChatPanel = lazy(() => import('./AiChatPanel-35CHYS5N.mjs'));
34938
+ var AiChatPanel = lazy(() => import('./AiChatPanel-EX2TBRJM.mjs'));
34519
34939
  function AiChatPanelLazy(props) {
34520
34940
  return /* @__PURE__ */ jsx(
34521
34941
  Suspense,
@@ -35677,6 +36097,7 @@ function ViewerMainContent(props) {
35677
36097
  /* @__PURE__ */ jsx(
35678
36098
  ViewerCanvasArea,
35679
36099
  {
36100
+ onUpdateSlideAnimations: (animations) => propertyHandlers.handleUpdateSlide({ animations }),
35680
36101
  mode,
35681
36102
  canEdit,
35682
36103
  slides,
@@ -38090,6 +38511,7 @@ var PowerPointViewer = forwardRef(
38090
38511
  isAccessibilityPanelOpen: state.isAccessibilityPanelOpen,
38091
38512
  showSlideSorter: state.showSlideSorter,
38092
38513
  showReadingView: state.showReadingView,
38514
+ showOutlineView: state.showOutlineView,
38093
38515
  templateElements: state.templateElements,
38094
38516
  accessibilityIssues: state.accessibilityIssues,
38095
38517
  slides,
@@ -38112,6 +38534,10 @@ var PowerPointViewer = forwardRef(
38112
38534
  state.setShowReadingView(false);
38113
38535
  state.setActiveSlideIndex(slideIndex);
38114
38536
  },
38537
+ onCloseOutlineView: () => state.setShowOutlineView(false),
38538
+ setSlides: state.setSlides,
38539
+ setActiveSlideIndex: state.setActiveSlideIndex,
38540
+ bumpHistory: () => state.setPointerCommitNonce((n) => n + 1),
38115
38541
  reducedMotion,
38116
38542
  onToggleReducedMotion: toggleReducedMotion
38117
38543
  }