pptx-react-viewer 2.10.0 → 2.11.1

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 (125) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/{AiChatPanel-KTMWRUD5.js → AiChatPanel-E6W3EACA.js} +23 -23
  3. package/dist/AiChatPanel-E6W3EACA.js.br +0 -0
  4. package/dist/AiChatPanel-E6W3EACA.js.gz +0 -0
  5. package/dist/{AiChatPanel-35CHYS5N.mjs → AiChatPanel-RMQIJDUJ.mjs} +4 -4
  6. package/dist/AiChatPanel-RMQIJDUJ.mjs.br +0 -0
  7. package/dist/AiChatPanel-RMQIJDUJ.mjs.gz +0 -0
  8. package/dist/{Model3DScene-TMNUKCL6.js → Model3DScene-U4B4NZJT.js} +2 -2
  9. package/dist/Model3DScene-U4B4NZJT.js.br +0 -0
  10. package/dist/Model3DScene-U4B4NZJT.js.gz +0 -0
  11. package/dist/{Model3DScene-2VMN3B65.mjs → Model3DScene-WHSHBMR5.mjs} +1 -1
  12. package/dist/Model3DScene-WHSHBMR5.mjs.br +0 -0
  13. package/dist/Model3DScene-WHSHBMR5.mjs.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-KPNP3QD5.js → SurfaceChart3DScene-5S43UBRD.js} +2 -2
  15. package/dist/SurfaceChart3DScene-5S43UBRD.js.br +0 -0
  16. package/dist/SurfaceChart3DScene-5S43UBRD.js.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-GKRDDN2U.mjs → SurfaceChart3DScene-77JP5XH5.mjs} +1 -1
  18. package/dist/{SurfaceChart3DScene-GKRDDN2U.mjs.br → SurfaceChart3DScene-77JP5XH5.mjs.br} +0 -0
  19. package/dist/SurfaceChart3DScene-77JP5XH5.mjs.gz +0 -0
  20. package/dist/{chunk-FY2AFXKP.mjs → chunk-DD54KUDG.mjs} +29 -4
  21. package/dist/chunk-DD54KUDG.mjs.br +0 -0
  22. package/dist/chunk-DD54KUDG.mjs.gz +0 -0
  23. package/dist/{chunk-IJVDNQLG.js → chunk-FAP6OPLL.js} +275 -249
  24. package/dist/chunk-FAP6OPLL.js.br +0 -0
  25. package/dist/chunk-FAP6OPLL.js.gz +0 -0
  26. package/dist/{chunk-TJ55KUWH.mjs → chunk-FV7HEYCX.mjs} +1069 -114
  27. package/dist/chunk-FV7HEYCX.mjs.br +0 -0
  28. package/dist/chunk-FV7HEYCX.mjs.gz +0 -0
  29. package/dist/{chunk-LXTKPSIG.mjs → chunk-HF6L2CTF.mjs} +1 -1
  30. package/dist/chunk-HF6L2CTF.mjs.br +0 -0
  31. package/dist/chunk-HF6L2CTF.mjs.gz +0 -0
  32. package/dist/{chunk-MMK4K3QI.js → chunk-IOVOQ6ZJ.js} +136 -1
  33. package/dist/chunk-IOVOQ6ZJ.js.br +0 -0
  34. package/dist/chunk-IOVOQ6ZJ.js.gz +0 -0
  35. package/dist/{chunk-JWMXOYSX.js → chunk-IXBM3HWH.js} +2289 -1824
  36. package/dist/chunk-IXBM3HWH.js.br +0 -0
  37. package/dist/chunk-IXBM3HWH.js.gz +0 -0
  38. package/dist/{chunk-H74UXL4Q.js → chunk-KDJBWJJH.js} +1102 -113
  39. package/dist/chunk-KDJBWJJH.js.br +0 -0
  40. package/dist/chunk-KDJBWJJH.js.gz +0 -0
  41. package/dist/{chunk-OHPF2HTP.mjs → chunk-NJ4PTG4F.mjs} +40 -28
  42. package/dist/chunk-NJ4PTG4F.mjs.br +0 -0
  43. package/dist/chunk-NJ4PTG4F.mjs.gz +0 -0
  44. package/dist/{chunk-LCG7WBAG.mjs → chunk-PXYZFWDA.mjs} +625 -160
  45. package/dist/chunk-PXYZFWDA.mjs.br +0 -0
  46. package/dist/chunk-PXYZFWDA.mjs.gz +0 -0
  47. package/dist/{chunk-A7HLINZU.js → chunk-QT6BPOZM.js} +361 -349
  48. package/dist/chunk-QT6BPOZM.js.br +0 -0
  49. package/dist/chunk-QT6BPOZM.js.gz +0 -0
  50. package/dist/{chunk-SL3XPERE.mjs → chunk-RHR7GTDX.mjs} +136 -1
  51. package/dist/chunk-RHR7GTDX.mjs.br +0 -0
  52. package/dist/chunk-RHR7GTDX.mjs.gz +0 -0
  53. package/dist/{chunk-SPJR6MPI.js → chunk-X3SFCKAF.js} +3 -3
  54. package/dist/chunk-X3SFCKAF.js.br +0 -0
  55. package/dist/chunk-X3SFCKAF.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 +28 -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 +38 -3
  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-YvCYsxa3.d.ts} +21 -5
  82. package/dist/useViewerBuildingBlocks-YvCYsxa3.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-LXTKPSIG.mjs.gz +0 -0
  115. package/dist/chunk-MMK4K3QI.js.br +0 -0
  116. package/dist/chunk-MMK4K3QI.js.gz +0 -0
  117. package/dist/chunk-OHPF2HTP.mjs.br +0 -0
  118. package/dist/chunk-OHPF2HTP.mjs.gz +0 -0
  119. package/dist/chunk-SL3XPERE.mjs.br +0 -0
  120. package/dist/chunk-SL3XPERE.mjs.gz +0 -0
  121. package/dist/chunk-SPJR6MPI.js.br +0 -0
  122. package/dist/chunk-SPJR6MPI.js.gz +0 -0
  123. package/dist/chunk-TJ55KUWH.mjs.br +0 -0
  124. package/dist/chunk-TJ55KUWH.mjs.gz +0 -0
  125. 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-HF6L2CTF.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-NJ4PTG4F.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-DD54KUDG.mjs';
4
+ import { LOCALE_CATALOG, translationsEn } from './chunk-RHR7GTDX.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, nextPresentedSlide, 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, schemaLabel, THEME_COLOR_SLOT_LABEL_KEYS, TRANSITION_VALID_DIRECTIONS, TRANSITION_ORIENTATION_TYPES, clampTransitionNumber, flattenTagCollections, formatCommentTimestamp, clearMotionPath, DIRECTIONAL_PRESETS, motionPathPresetIdForPath, computeMergeCellRight, computeMergeCellDown, computeSplitCell, SMARTART_COLOR_SCHEME_LABEL_KEYS, SMARTART_STYLE_LABEL_KEYS, 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, FILL_PATTERN_LABEL_KEYS, openNativeEyeDropper, toggleText3dExtrusion, BEVEL_PRESETS } from './chunk-FV7HEYCX.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,
@@ -550,7 +584,8 @@ function RibbonCommand({
550
584
  disabled,
551
585
  active,
552
586
  compact = false,
553
- title
587
+ title,
588
+ pressed
554
589
  }) {
555
590
  return /* @__PURE__ */ jsxs(
556
591
  "button",
@@ -559,6 +594,7 @@ function RibbonCommand({
559
594
  onClick,
560
595
  disabled,
561
596
  title: title ?? label,
597
+ "aria-pressed": pressed,
562
598
  className: cn(
563
599
  "inline-flex rounded-sm text-foreground transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-35",
564
600
  active && "bg-primary/15 text-primary ring-1 ring-primary/35",
@@ -648,6 +684,13 @@ function AnimationsSection(p) {
648
684
  children: /* @__PURE__ */ jsx(AnimationPresetGallery, { disabled, onAddAnimation: p.onAddAnimation })
649
685
  }
650
686
  ),
687
+ /* @__PURE__ */ jsx(RibbonGroup, { label: t("pptx.animation.motionPath"), className: "max-w-[420px] overflow-hidden", children: /* @__PURE__ */ jsx(
688
+ MotionPathGallery,
689
+ {
690
+ disabled,
691
+ onApplyMotionPath: (presetId) => p.onAddAnimation?.(presetId, "motionPath")
692
+ }
693
+ ) }),
651
694
  /* @__PURE__ */ jsxs(RibbonGroup, { label: t("pptx.animations.advanced", { defaultValue: "Advanced Animation" }), children: [
652
695
  /* @__PURE__ */ jsx(
653
696
  RibbonCommand,
@@ -663,7 +706,7 @@ function AnimationsSection(p) {
663
706
  {
664
707
  label: t("pptx.animations.pathAnimation", { defaultValue: "Path Animation" }),
665
708
  icon: /* @__PURE__ */ jsx(LuMoveRight, {}),
666
- onClick: () => p.onAddAnimation?.("flyIn", "entrance"),
709
+ onClick: () => p.onAddAnimation?.(DEFAULT_MOTION_PATH_PRESET_ID, "motionPath"),
667
710
  disabled
668
711
  }
669
712
  ),
@@ -1203,11 +1246,11 @@ var TRANSITION_PRESETS = [
1203
1246
  ];
1204
1247
  function TransitionsSection(p) {
1205
1248
  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");
1249
+ const [selected, setSelected] = React34.useState("none");
1250
+ const [duration, setDuration] = React34.useState("00.50");
1251
+ const [advanceOnClick, setAdvanceOnClick] = React34.useState(true);
1252
+ const [advanceAfter, setAdvanceAfter] = React34.useState(false);
1253
+ const [advanceAfterSeconds, setAdvanceAfterSeconds] = React34.useState("00:00.00");
1211
1254
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1212
1255
  /* @__PURE__ */ jsxs("button", { type: "button", className: pill, title: t("pptx.ribbon.previewTransition"), children: [
1213
1256
  /* @__PURE__ */ jsx(LuPlay, { className: ics }),
@@ -1409,7 +1452,7 @@ function AccountPage() {
1409
1452
  return void 0;
1410
1453
  });
1411
1454
  };
1412
- const version = "2.9.0" ;
1455
+ const version = "2.11.0" ;
1413
1456
  return /* @__PURE__ */ jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
1414
1457
  /* @__PURE__ */ jsxs("section", { className: cardClass, children: [
1415
1458
  /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -3012,7 +3055,9 @@ function SlideShowSection(p) {
3012
3055
  {
3013
3056
  label: t("pptx.slideShow.hideSlide", { defaultValue: "Hide Slide" }),
3014
3057
  icon: /* @__PURE__ */ jsx(LuEyeOff, {}),
3015
- disabled: true
3058
+ onClick: p.onToggleHideSlide,
3059
+ active: p.activeSlideHidden,
3060
+ pressed: p.activeSlideHidden
3016
3061
  }
3017
3062
  ),
3018
3063
  /* @__PURE__ */ jsx(
@@ -3891,6 +3936,15 @@ function ViewSection(p) {
3891
3936
  title: t("pptx.view.slideSorterTooltip")
3892
3937
  }
3893
3938
  ),
3939
+ /* @__PURE__ */ jsx(
3940
+ RibbonCommand,
3941
+ {
3942
+ label: t("pptx.view.outlineView"),
3943
+ icon: /* @__PURE__ */ jsx(LuIndentIncrease, {}),
3944
+ onClick: p.onOpenOutlineView,
3945
+ title: t("pptx.view.outlineViewTooltip")
3946
+ }
3947
+ ),
3894
3948
  /* @__PURE__ */ jsx(
3895
3949
  RibbonCommand,
3896
3950
  {
@@ -4324,6 +4378,9 @@ function MobileSectionBody({
4324
4378
  }),
4325
4379
  onOpenSetUpSlideShow: p.onOpenSetUpSlideShow ?? (() => {
4326
4380
  }),
4381
+ onToggleHideSlide: p.onToggleHideSlide ?? (() => {
4382
+ }),
4383
+ activeSlideHidden: p.activeSlideHidden ?? false,
4327
4384
  onOpenBroadcastDialog: p.onOpenBroadcastDialog ?? (() => {
4328
4385
  }),
4329
4386
  onToggleSubtitles: p.onToggleSubtitles ?? (() => {
@@ -5568,6 +5625,9 @@ function Toolbar(p) {
5568
5625
  }),
5569
5626
  onOpenSetUpSlideShow: p.onOpenSetUpSlideShow ?? (() => {
5570
5627
  }),
5628
+ onToggleHideSlide: p.onToggleHideSlide ?? (() => {
5629
+ }),
5630
+ activeSlideHidden: p.activeSlideHidden ?? false,
5571
5631
  onOpenBroadcastDialog: p.onOpenBroadcastDialog ?? (() => {
5572
5632
  }),
5573
5633
  onToggleSubtitles: p.onToggleSubtitles ?? (() => {
@@ -5627,6 +5687,7 @@ function Toolbar(p) {
5627
5687
  onToggleEyedropper: p.onToggleEyedropper,
5628
5688
  onToggleSlideSorter: p.onToggleSlideSorter,
5629
5689
  onOpenReadingView: p.onOpenReadingView,
5690
+ onOpenOutlineView: p.onOpenOutlineView,
5630
5691
  onZoomToFit: p.onZoomToFit
5631
5692
  }
5632
5693
  ),
@@ -5930,6 +5991,127 @@ function GridOverlay({ canvasSize, gridSpacingPx = GRID_SIZE, visible }) {
5930
5991
  }
5931
5992
  );
5932
5993
  }
5994
+ function MotionPathOverlay({
5995
+ element,
5996
+ path,
5997
+ canvasSize,
5998
+ scale,
5999
+ canEdit,
6000
+ onChangePath
6001
+ }) {
6002
+ const { t } = useTranslation();
6003
+ const dragRef = useRef(null);
6004
+ const frame = {
6005
+ originX: element.x + element.width / 2,
6006
+ originY: element.y + element.height / 2,
6007
+ slideWidth: canvasSize.width,
6008
+ slideHeight: canvasSize.height
6009
+ };
6010
+ const d = motionPathToSvgD(path, frame);
6011
+ const end = motionPathEndPixel(path, frame);
6012
+ const editable = canEdit && Boolean(onChangePath) && isEditableMotionPath(path);
6013
+ const handlePointerDown = useCallback(
6014
+ (event) => {
6015
+ if (!editable) {
6016
+ return;
6017
+ }
6018
+ event.stopPropagation();
6019
+ event.preventDefault();
6020
+ event.currentTarget.setPointerCapture(event.pointerId);
6021
+ dragRef.current = {
6022
+ pointerId: event.pointerId,
6023
+ startX: event.clientX,
6024
+ startY: event.clientY
6025
+ };
6026
+ },
6027
+ [editable]
6028
+ );
6029
+ const handlePointerMove = useCallback(
6030
+ (event) => {
6031
+ const drag = dragRef.current;
6032
+ if (!drag || drag.pointerId !== event.pointerId || !onChangePath) {
6033
+ return;
6034
+ }
6035
+ event.stopPropagation();
6036
+ const dxPx = (event.clientX - drag.startX) / (scale || 1);
6037
+ const dyPx = (event.clientY - drag.startY) / (scale || 1);
6038
+ const nextX = (end.x + dxPx - frame.originX) / frame.slideWidth;
6039
+ const nextY = (end.y + dyPx - frame.originY) / frame.slideHeight;
6040
+ const next = setMotionPathEnd(path, nextX, nextY);
6041
+ if (next !== path) {
6042
+ dragRef.current = {
6043
+ pointerId: event.pointerId,
6044
+ startX: event.clientX,
6045
+ startY: event.clientY
6046
+ };
6047
+ onChangePath(next);
6048
+ }
6049
+ },
6050
+ [
6051
+ end.x,
6052
+ end.y,
6053
+ frame.originX,
6054
+ frame.originY,
6055
+ frame.slideWidth,
6056
+ frame.slideHeight,
6057
+ onChangePath,
6058
+ path,
6059
+ scale
6060
+ ]
6061
+ );
6062
+ const handlePointerUp = useCallback((event) => {
6063
+ if (dragRef.current?.pointerId === event.pointerId) {
6064
+ event.currentTarget.releasePointerCapture(event.pointerId);
6065
+ dragRef.current = null;
6066
+ }
6067
+ }, []);
6068
+ if (!d) {
6069
+ return null;
6070
+ }
6071
+ return /* @__PURE__ */ jsxs(
6072
+ "svg",
6073
+ {
6074
+ className: "pointer-events-none absolute left-0 top-0 z-[45]",
6075
+ width: canvasSize.width,
6076
+ height: canvasSize.height,
6077
+ role: "img",
6078
+ "aria-label": t("pptx.animation.motionPath.overlay"),
6079
+ "data-pptx-motion-path-overlay": "true",
6080
+ children: [
6081
+ /* @__PURE__ */ jsx(
6082
+ "path",
6083
+ {
6084
+ d,
6085
+ fill: "none",
6086
+ stroke: "#0ea5e9",
6087
+ strokeWidth: 2,
6088
+ strokeDasharray: "6 4",
6089
+ vectorEffect: "non-scaling-stroke"
6090
+ }
6091
+ ),
6092
+ /* @__PURE__ */ jsx("circle", { cx: frame.originX, cy: frame.originY, r: 5, fill: "#0ea5e9", opacity: 0.55 }),
6093
+ /* @__PURE__ */ jsx(
6094
+ "circle",
6095
+ {
6096
+ cx: end.x,
6097
+ cy: end.y,
6098
+ r: 7,
6099
+ fill: "#ffffff",
6100
+ stroke: "#0ea5e9",
6101
+ strokeWidth: 2,
6102
+ className: editable ? "pointer-events-auto cursor-move" : "",
6103
+ "aria-label": t("pptx.animation.motionPath.endHandle"),
6104
+ "data-pptx-motion-path-handle": "end",
6105
+ onPointerDown: handlePointerDown,
6106
+ onPointerMove: handlePointerMove,
6107
+ onPointerUp: handlePointerUp,
6108
+ onPointerCancel: handlePointerUp
6109
+ }
6110
+ )
6111
+ ]
6112
+ }
6113
+ );
6114
+ }
5933
6115
  function HorizontalRulerView({ ticks, widthPx, highlight }) {
5934
6116
  return /* @__PURE__ */ jsxs(
5935
6117
  "svg",
@@ -5993,7 +6175,7 @@ function HorizontalRulerView({ ticks, widthPx, highlight }) {
5993
6175
  }
5994
6176
  );
5995
6177
  }
5996
- var HorizontalRuler = React33.memo(HorizontalRulerView);
6178
+ var HorizontalRuler = React34.memo(HorizontalRulerView);
5997
6179
  HorizontalRuler.displayName = "HorizontalRuler";
5998
6180
  function VerticalRulerView({ ticks, heightPx, highlight }) {
5999
6181
  return /* @__PURE__ */ jsxs(
@@ -6065,7 +6247,7 @@ function VerticalRulerView({ ticks, heightPx, highlight }) {
6065
6247
  }
6066
6248
  );
6067
6249
  }
6068
- var VerticalRuler = React33.memo(VerticalRulerView);
6250
+ var VerticalRuler = React34.memo(VerticalRulerView);
6069
6251
  VerticalRuler.displayName = "VerticalRuler";
6070
6252
  function Ruler({
6071
6253
  canvasSize,
@@ -7017,7 +7199,7 @@ function ResizeHandles({
7017
7199
  ) : null
7018
7200
  ] });
7019
7201
  }
7020
- var ConnectorElementRenderer = React33.memo(
7202
+ var ConnectorElementRenderer = React34.memo(
7021
7203
  ({
7022
7204
  el,
7023
7205
  isSelected,
@@ -8523,10 +8705,10 @@ function InlineTextEditor({
8523
8705
  function FailedToLoad() {
8524
8706
  return null;
8525
8707
  }
8526
- var LazyModel3DScene = React33.lazy(
8708
+ var LazyModel3DScene = React34.lazy(
8527
8709
  async () => {
8528
8710
  try {
8529
- return await import('./Model3DScene-2VMN3B65.mjs');
8711
+ return await import('./Model3DScene-WHSHBMR5.mjs');
8530
8712
  } catch {
8531
8713
  return { default: FailedToLoad };
8532
8714
  }
@@ -8609,7 +8791,7 @@ function PosterFallback({
8609
8791
  }
8610
8792
  );
8611
8793
  }
8612
- var Model3DErrorBoundary = class extends React33.Component {
8794
+ var Model3DErrorBoundary = class extends React34.Component {
8613
8795
  constructor(props) {
8614
8796
  super(props);
8615
8797
  this.state = { hasError: false };
@@ -8800,10 +8982,10 @@ function SmartArtInlineNodeEditor({
8800
8982
  onCancel
8801
8983
  }) {
8802
8984
  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(() => {
8985
+ const ref = React34.useRef(null);
8986
+ const [value, setValue] = React34.useState(initialText);
8987
+ const settled = React34.useRef(false);
8988
+ React34.useEffect(() => {
8807
8989
  const el = ref.current;
8808
8990
  if (el) {
8809
8991
  el.focus();
@@ -8895,16 +9077,16 @@ function findNodeIdFromEvent(target) {
8895
9077
  return null;
8896
9078
  }
8897
9079
  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(() => {
9080
+ const [hoveredNodeId, setHoveredNodeId] = React34.useState(null);
9081
+ const [hoveredNodeRect, setHoveredNodeRect] = React34.useState(null);
9082
+ const hideTimeoutRef = React34.useRef(null);
9083
+ const cancelPendingHide = React34.useCallback(() => {
8902
9084
  if (hideTimeoutRef.current !== null) {
8903
9085
  window.clearTimeout(hideTimeoutRef.current);
8904
9086
  hideTimeoutRef.current = null;
8905
9087
  }
8906
9088
  }, []);
8907
- const handleMouseMove = React33.useCallback(
9089
+ const handleMouseMove = React34.useCallback(
8908
9090
  (e, ignoreRef) => {
8909
9091
  const nodeEl = findNodeIdFromEvent(e.target);
8910
9092
  const container = containerRef.current;
@@ -8932,12 +9114,12 @@ function useSmartArtHoverState(containerRef) {
8932
9114
  },
8933
9115
  [containerRef, cancelPendingHide]
8934
9116
  );
8935
- const clearHover = React33.useCallback(() => {
9117
+ const clearHover = React34.useCallback(() => {
8936
9118
  cancelPendingHide();
8937
9119
  setHoveredNodeId(null);
8938
9120
  setHoveredNodeRect(null);
8939
9121
  }, [cancelPendingHide]);
8940
- React33.useEffect(() => cancelPendingHide, [cancelPendingHide]);
9122
+ React34.useEffect(() => cancelPendingHide, [cancelPendingHide]);
8941
9123
  return { hoveredNodeId, hoveredNodeRect, handleMouseMove, clearHover };
8942
9124
  }
8943
9125
  var EDITOR_PADDING = 4;
@@ -8952,11 +9134,11 @@ function SmartArtEditableLayer({
8952
9134
  onChangeNodeStyle,
8953
9135
  children
8954
9136
  }) {
8955
- const containerRef = React33.useRef(null);
8956
- const styleBarRef = React33.useRef(null);
8957
- const [edit, setEdit] = React33.useState(null);
9137
+ const containerRef = React34.useRef(null);
9138
+ const styleBarRef = React34.useRef(null);
9139
+ const [edit, setEdit] = React34.useState(null);
8958
9140
  const { hoveredNodeId, hoveredNodeRect, handleMouseMove, clearHover } = useSmartArtHoverState(containerRef);
8959
- const openEditor = React33.useCallback(
9141
+ const openEditor = React34.useCallback(
8960
9142
  (target) => {
8961
9143
  const nodeEl = findNodeIdFromEvent(target);
8962
9144
  const container = containerRef.current;
@@ -10496,11 +10678,11 @@ function arePropsEqual(prev, next) {
10496
10678
  }
10497
10679
  return true;
10498
10680
  }
10499
- var SmartArtRenderer = React33.memo(SmartArtRendererImpl, arePropsEqual);
10681
+ var SmartArtRenderer = React34.memo(SmartArtRendererImpl, arePropsEqual);
10500
10682
  function FailedToLoad2() {
10501
10683
  return null;
10502
10684
  }
10503
- var LazySmartArt3DScene = React33.lazy(
10685
+ var LazySmartArt3DScene = React34.lazy(
10504
10686
  async () => {
10505
10687
  try {
10506
10688
  return await import('./SmartArt3DScene-XCFVGCXE.mjs');
@@ -10509,7 +10691,7 @@ var LazySmartArt3DScene = React33.lazy(
10509
10691
  }
10510
10692
  }
10511
10693
  );
10512
- var SceneErrorBoundary = class extends React33.Component {
10694
+ var SceneErrorBoundary = class extends React34.Component {
10513
10695
  constructor(props) {
10514
10696
  super(props);
10515
10697
  this.state = { hasError: false };
@@ -11268,7 +11450,7 @@ function renderBody(options) {
11268
11450
  }
11269
11451
  return renderTextElementBody(options);
11270
11452
  }
11271
- var Extrusion3DOverlay = React33.memo(({ data }) => {
11453
+ var Extrusion3DOverlay = React34.memo(({ data }) => {
11272
11454
  if (!data.hasExtrusion || data.panels.length === 0) {
11273
11455
  return null;
11274
11456
  }
@@ -11461,9 +11643,9 @@ function StaticElementRendererImpl({
11461
11643
  }
11462
11644
  );
11463
11645
  }
11464
- var StaticElementRenderer = React33.memo(StaticElementRendererImpl);
11646
+ var StaticElementRenderer = React34.memo(StaticElementRendererImpl);
11465
11647
  StaticElementRenderer.displayName = "StaticElementRenderer";
11466
- var ElementRenderer = React33.memo(
11648
+ var ElementRenderer = React34.memo(
11467
11649
  // oxlint-disable-next-line prefer-arrow-callback -- named fn gives the memo component its displayName
11468
11650
  function ElementRendererInner({
11469
11651
  element: el,
@@ -11864,6 +12046,7 @@ function SlideCanvas({
11864
12046
  onCreateGuideFromRuler,
11865
12047
  connectorCreationMode = false,
11866
12048
  onCreateConnector,
12049
+ onUpdateSlideAnimations,
11867
12050
  allSlides,
11868
12051
  onZoomClick,
11869
12052
  sourceSlideIndex,
@@ -11927,6 +12110,18 @@ function SlideCanvas({
11927
12110
  zoom,
11928
12111
  onMoveGuide
11929
12112
  });
12113
+ const selectedMotionPath = selectedElement ? motionPathFor(activeSlide?.animations ?? [], selectedElement.id) : void 0;
12114
+ const handleMotionPathChange = useCallback(
12115
+ (path) => {
12116
+ if (!selectedElement || !onUpdateSlideAnimations) {
12117
+ return;
12118
+ }
12119
+ onUpdateSlideAnimations(
12120
+ setMotionPath(activeSlide?.animations ?? [], selectedElement.id, path)
12121
+ );
12122
+ },
12123
+ [activeSlide?.animations, onUpdateSlideAnimations, selectedElement]
12124
+ );
11930
12125
  const {
11931
12126
  connectorDragState,
11932
12127
  handleConnectionSiteDown,
@@ -11996,6 +12191,10 @@ function SlideCanvas({
11996
12191
  height: canvasSize.height,
11997
12192
  transform: `scale(${zoom.editorScale})`,
11998
12193
  transformOrigin: "top left",
12194
+ // Motion-path keyframes translate by a fraction of the SLIDE, so
12195
+ // the stage publishes its own size for those calc() offsets.
12196
+ ["--pptx-slide-w"]: `${canvasSize.width}px`,
12197
+ ["--pptx-slide-h"]: `${canvasSize.height}px`,
11999
12198
  marginTop: rulerOffset,
12000
12199
  marginLeft: rulerOffset,
12001
12200
  // In edit/master mode the stage must own all touch gestures so
@@ -12133,6 +12332,17 @@ function SlideCanvas({
12133
12332
  onConnectorDragEnd: handleConnectorDragEnd
12134
12333
  }
12135
12334
  ),
12335
+ isEditableCanvas && selectedElement && selectedMotionPath && /* @__PURE__ */ jsx(
12336
+ MotionPathOverlay,
12337
+ {
12338
+ element: selectedElement,
12339
+ path: selectedMotionPath,
12340
+ canvasSize,
12341
+ scale: zoom.editorScale,
12342
+ canEdit,
12343
+ onChangePath: handleMotionPathChange
12344
+ }
12345
+ ),
12136
12346
  isDrawing && /* @__PURE__ */ jsx(
12137
12347
  DrawingOverlaySvg,
12138
12348
  {
@@ -12705,7 +12915,7 @@ function arePropsEqual2(prev, next) {
12705
12915
  }
12706
12916
  return true;
12707
12917
  }
12708
- var SlideThumbnail = React33.memo(SlideThumbnailImpl, arePropsEqual2);
12918
+ var SlideThumbnail = React34.memo(SlideThumbnailImpl, arePropsEqual2);
12709
12919
 
12710
12920
  // src/viewer/components/context-menu-dispatch.ts
12711
12921
  function tableCell(props) {
@@ -13254,7 +13464,7 @@ function LazyThumbnailInner({
13254
13464
  }
13255
13465
  ) });
13256
13466
  }
13257
- var LazyThumbnail = React33.memo(LazyThumbnailInner);
13467
+ var LazyThumbnail = React34.memo(LazyThumbnailInner);
13258
13468
 
13259
13469
  // src/viewer/components/slides-pane/utils.ts
13260
13470
  function formatTimingMs(ms) {
@@ -13400,7 +13610,7 @@ function SlideItemInner({
13400
13610
  }
13401
13611
  );
13402
13612
  }
13403
- var SlideItem = React33.memo(SlideItemInner);
13613
+ var SlideItem = React34.memo(SlideItemInner);
13404
13614
  function useSlidePaneCallbacks(onMoveSlide, onRenameSection) {
13405
13615
  const [collapsedSections, setCollapsedSections] = useState({});
13406
13616
  const [renamingSectionId, setRenamingSectionId] = useState(null);
@@ -14669,7 +14879,7 @@ function arePropsEqual3(prev, next) {
14669
14879
  }
14670
14880
  return true;
14671
14881
  }
14672
- var SlideCard = React33.memo(SlideCardImpl, arePropsEqual3);
14882
+ var SlideCard = React34.memo(SlideCardImpl, arePropsEqual3);
14673
14883
  function SorterContextMenu({
14674
14884
  x,
14675
14885
  y,
@@ -15301,6 +15511,130 @@ function SlideSorterOverlay({
15301
15511
  }
15302
15512
  );
15303
15513
  }
15514
+ function useOutlineView(input) {
15515
+ const { slides, canvasSize, canEdit, setSlides, setActiveSlideIndex, bumpHistory } = input;
15516
+ const rows = useMemo(() => buildOutline(slides), [slides]);
15517
+ const containerRef = useRef(null);
15518
+ const pendingFocusRef = useRef(null);
15519
+ const run = useCallback(
15520
+ (edit) => {
15521
+ if (!canEdit) {
15522
+ return;
15523
+ }
15524
+ const result = applyOutlineEdit(slides, edit, { canvas: canvasSize });
15525
+ if (!result.changed) {
15526
+ return;
15527
+ }
15528
+ setSlides(result.slides);
15529
+ setActiveSlideIndex(result.activeSlideIndex);
15530
+ bumpHistory();
15531
+ pendingFocusRef.current = result.focusKey;
15532
+ },
15533
+ [bumpHistory, canEdit, canvasSize, setActiveSlideIndex, setSlides, slides]
15534
+ );
15535
+ const onRowKeyDown = useCallback(
15536
+ (event, rowKey) => {
15537
+ const { edit, preventDefault } = mapOutlineKey(event, rowKey);
15538
+ if (preventDefault) {
15539
+ event.preventDefault();
15540
+ }
15541
+ if (edit) {
15542
+ run(edit);
15543
+ }
15544
+ },
15545
+ [run]
15546
+ );
15547
+ useEffect(() => {
15548
+ const key = pendingFocusRef.current;
15549
+ if (!key) {
15550
+ return;
15551
+ }
15552
+ pendingFocusRef.current = null;
15553
+ const selector = `[${OUTLINE_ROW_ATTR}="${CSS.escape(key)}"]`;
15554
+ const target = containerRef.current?.querySelector(selector);
15555
+ if (target && document.activeElement !== target) {
15556
+ target.focus();
15557
+ target.setSelectionRange(target.value.length, target.value.length);
15558
+ }
15559
+ }, [rows]);
15560
+ return { rows, containerRef, run, onRowKeyDown };
15561
+ }
15562
+ var INDENT_PX = 22;
15563
+ function OutlineViewOverlay({
15564
+ slides,
15565
+ canvasSize,
15566
+ canEdit,
15567
+ setSlides,
15568
+ setActiveSlideIndex,
15569
+ bumpHistory,
15570
+ onClose
15571
+ }) {
15572
+ const { t } = useTranslation();
15573
+ const { rows, containerRef, run, onRowKeyDown } = useOutlineView({
15574
+ slides,
15575
+ canvasSize,
15576
+ canEdit,
15577
+ setSlides,
15578
+ setActiveSlideIndex,
15579
+ bumpHistory
15580
+ });
15581
+ return /* @__PURE__ */ jsxs(
15582
+ "div",
15583
+ {
15584
+ ...{ [OUTLINE_VIEW_ATTR]: "true" },
15585
+ role: "region",
15586
+ "aria-label": t("pptx.view.outlineView"),
15587
+ className: "fixed inset-0 z-[1300] flex flex-col bg-neutral-900 text-neutral-100",
15588
+ children: [
15589
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-b border-white/10 px-4 py-2", children: [
15590
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold", children: t("pptx.view.outlineView") }),
15591
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-[11px] text-white/50", children: t("pptx.outline.hint") }),
15592
+ /* @__PURE__ */ jsx(
15593
+ "button",
15594
+ {
15595
+ type: "button",
15596
+ className: "inline-flex h-8 w-8 items-center justify-center rounded text-white/80 transition-colors hover:bg-white/15 hover:text-white",
15597
+ "aria-label": t("pptx.statusBar.normalView"),
15598
+ title: t("pptx.statusBar.normalView"),
15599
+ onClick: onClose,
15600
+ children: /* @__PURE__ */ jsx(LuX, {})
15601
+ }
15602
+ )
15603
+ ] }),
15604
+ /* @__PURE__ */ jsx("div", { ref: containerRef, className: "min-h-0 flex-1 overflow-auto px-4 py-3", children: rows.map((row) => /* @__PURE__ */ jsxs(
15605
+ "div",
15606
+ {
15607
+ className: "flex items-center gap-2 py-0.5",
15608
+ style: { paddingLeft: row.level * INDENT_PX },
15609
+ children: [
15610
+ /* @__PURE__ */ jsx("span", { className: "w-6 shrink-0 text-right text-[10px] tabular-nums text-white/40", children: row.kind === "title" ? row.slideIndex + 1 : "" }),
15611
+ /* @__PURE__ */ jsx(
15612
+ "input",
15613
+ {
15614
+ ...{
15615
+ [OUTLINE_ROW_ATTR]: row.key,
15616
+ [OUTLINE_SLIDE_ATTR]: String(row.slideIndex + 1),
15617
+ [OUTLINE_LEVEL_ATTR]: String(row.level)
15618
+ },
15619
+ type: "text",
15620
+ value: row.text,
15621
+ readOnly: !canEdit,
15622
+ "aria-label": t(
15623
+ row.kind === "title" ? "pptx.outline.titleLine" : "pptx.outline.bodyLine"
15624
+ ),
15625
+ 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",
15626
+ onChange: (event) => run({ type: "setText", key: row.key, text: event.target.value }),
15627
+ onKeyDown: (event) => onRowKeyDown(event, row.key)
15628
+ }
15629
+ )
15630
+ ]
15631
+ },
15632
+ row.key
15633
+ )) })
15634
+ ]
15635
+ }
15636
+ );
15637
+ }
15304
15638
  function ReadingViewStage({
15305
15639
  slide,
15306
15640
  templateElements,
@@ -15509,7 +15843,7 @@ var DEBOUNCE_MS = 600;
15509
15843
  var EXPANDED_MAX_HEIGHT = 200;
15510
15844
  var PX_TO_PT = 0.75;
15511
15845
  var MAX_INDENT_LEVEL = 4;
15512
- var INDENT_PX = 24;
15846
+ var INDENT_PX2 = 24;
15513
15847
  function escapeHtml(value) {
15514
15848
  return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
15515
15849
  }
@@ -15564,7 +15898,7 @@ function buildParagraph(segments) {
15564
15898
  if (first?.style.paragraphMarginLeft) {
15565
15899
  indentLevel = Math.min(
15566
15900
  MAX_INDENT_LEVEL,
15567
- Math.max(0, Math.round(first.style.paragraphMarginLeft / INDENT_PX))
15901
+ Math.max(0, Math.round(first.style.paragraphMarginLeft / INDENT_PX2))
15568
15902
  );
15569
15903
  }
15570
15904
  return {
@@ -15609,7 +15943,7 @@ function paragraphsToSegments(paragraphs) {
15609
15943
  para.segments.forEach((seg, sIdx) => {
15610
15944
  const updated = { ...seg, style: { ...seg.style } };
15611
15945
  if (para.indentLevel > 0) {
15612
- updated.style.paragraphMarginLeft = para.indentLevel * INDENT_PX;
15946
+ updated.style.paragraphMarginLeft = para.indentLevel * INDENT_PX2;
15613
15947
  } else {
15614
15948
  delete updated.style.paragraphMarginLeft;
15615
15949
  }
@@ -15766,7 +16100,7 @@ function parseSegmentsFromRichEditor(root) {
15766
16100
  if (paraIndent > 0) {
15767
16101
  segments[i].style = {
15768
16102
  ...segments[i].style,
15769
- paragraphMarginLeft: paraIndent * INDENT_PX
16103
+ paragraphMarginLeft: paraIndent * INDENT_PX2
15770
16104
  };
15771
16105
  }
15772
16106
  break;
@@ -15830,7 +16164,7 @@ function segmentsToEditorHtml(segments) {
15830
16164
  if (para.indentLevel > 0) {
15831
16165
  attrs.push(`data-indent-level="${para.indentLevel}"`);
15832
16166
  }
15833
- const indent = para.indentLevel * INDENT_PX;
16167
+ const indent = para.indentLevel * INDENT_PX2;
15834
16168
  const divStyles = [];
15835
16169
  if (indent > 0) {
15836
16170
  divStyles.push(`padding-left:${indent}px`);
@@ -15858,7 +16192,7 @@ function renderRichNotesSegments(segments) {
15858
16192
  }
15859
16193
  const divStyle = {};
15860
16194
  if (para.indentLevel > 0) {
15861
- divStyle.paddingLeft = para.indentLevel * INDENT_PX;
16195
+ divStyle.paddingLeft = para.indentLevel * INDENT_PX2;
15862
16196
  }
15863
16197
  const children = [];
15864
16198
  if (para.bulletType === "bullet") {
@@ -18374,9 +18708,9 @@ function PresentationSubtitleBar({
18374
18708
  function renderNotesSegments(segments) {
18375
18709
  return notesSegmentsToSpans(segments).map((span) => {
18376
18710
  if (span.kind === "break") {
18377
- return React33.createElement("br", { key: span.key });
18711
+ return React34.createElement("br", { key: span.key });
18378
18712
  }
18379
- return React33.createElement(
18713
+ return React34.createElement(
18380
18714
  "span",
18381
18715
  { key: span.key, style: span.style },
18382
18716
  span.text
@@ -18583,7 +18917,7 @@ function arePropsEqual4(prev, next) {
18583
18917
  }
18584
18918
  return true;
18585
18919
  }
18586
- var ScaledSlidePreview = React33.memo(ScaledSlidePreviewImpl, arePropsEqual4);
18920
+ var ScaledSlidePreview = React34.memo(ScaledSlidePreviewImpl, arePropsEqual4);
18587
18921
  function PresenterNotesRail({
18588
18922
  slides,
18589
18923
  current,
@@ -18596,7 +18930,7 @@ function PresenterNotesRail({
18596
18930
  }) {
18597
18931
  const { t } = useTranslation();
18598
18932
  const slide = slides[current];
18599
- const nextSlide = slides.slice(current + 1).find((candidate) => !candidate.hidden);
18933
+ const nextSlide = nextPresentedSlide(slides, current);
18600
18934
  const notesText = slide?.notes ?? "";
18601
18935
  const notesSegments = slide?.notesSegments;
18602
18936
  const [notesDraft, setNotesDraft] = useState(notesText);
@@ -19004,7 +19338,7 @@ function MobilePresenterView({
19004
19338
  }, []);
19005
19339
  const elapsed = mobileElapsedSince(presentationStartTime, now);
19006
19340
  const currentSlide = slides[currentSlideIndex];
19007
- const nextSlide = currentSlideIndex + 1 < slides.length ? slides[currentSlideIndex + 1] : void 0;
19341
+ const nextSlide = nextPresentedSlide(slides, currentSlideIndex);
19008
19342
  if (!currentSlide) {
19009
19343
  return /* @__PURE__ */ jsx("div", { className: "absolute inset-0 z-50 flex items-center justify-center bg-card text-muted-foreground", children: t("pptx.presenter.noSlides") });
19010
19344
  }
@@ -19614,6 +19948,33 @@ function AnimationTimelineSection({
19614
19948
  ] })
19615
19949
  ] });
19616
19950
  }
19951
+ function MotionPathRow({
19952
+ motionPath,
19953
+ canEdit,
19954
+ onChange
19955
+ }) {
19956
+ const { t } = useTranslation();
19957
+ const presetId = motionPathPresetIdForPath(motionPath);
19958
+ const isCustom = Boolean(motionPath) && !presetId;
19959
+ return /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1", children: [
19960
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-[11px]", children: t("pptx.animation.motionPath.label") }),
19961
+ /* @__PURE__ */ jsxs(
19962
+ "select",
19963
+ {
19964
+ value: isCustom ? "custom" : presetId ?? "none",
19965
+ onChange: (event) => onChange(event.target.value),
19966
+ disabled: !canEdit,
19967
+ className: SELECT_CLS,
19968
+ children: [
19969
+ /* @__PURE__ */ jsx("option", { value: "none", children: t("pptx.animation.motionPath.none") }),
19970
+ isCustom && /* @__PURE__ */ jsx("option", { value: "custom", children: t("pptx.animation.motionPath.custom") }),
19971
+ 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))
19972
+ ]
19973
+ }
19974
+ ),
19975
+ motionPath && /* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground", children: t("pptx.animation.motionPath.editHint") })
19976
+ ] });
19977
+ }
19617
19978
  function useAnimationDragDrop({
19618
19979
  canEdit,
19619
19980
  updateAnimations
@@ -19720,6 +20081,14 @@ function useAnimationPreview({
19720
20081
  selectedElementAnimation
19721
20082
  }) {
19722
20083
  const handleAnimationHover = useCallback((anim) => {
20084
+ if (anim.motionPath) {
20085
+ startMotionPathPreview(anim.elementId, anim.motionPath, {
20086
+ durationMs: anim.durationMs,
20087
+ delayMs: anim.delayMs,
20088
+ timingCurve: anim.timingCurve
20089
+ });
20090
+ return;
20091
+ }
19723
20092
  const preset = anim.entrance ?? anim.emphasis ?? anim.exit;
19724
20093
  if (!preset || preset === "none") {
19725
20094
  return;
@@ -19735,6 +20104,14 @@ function useAnimationPreview({
19735
20104
  if (!selectedElementAnimation) {
19736
20105
  return;
19737
20106
  }
20107
+ if (selectedElementAnimation.motionPath) {
20108
+ startMotionPathPreview(selectedElementId, selectedElementAnimation.motionPath, {
20109
+ durationMs: selectedElementAnimation.durationMs,
20110
+ delayMs: selectedElementAnimation.delayMs,
20111
+ timingCurve: selectedElementAnimation.timingCurve
20112
+ });
20113
+ return;
20114
+ }
19738
20115
  const preset = selectedElementAnimation.entrance ?? selectedElementAnimation.emphasis ?? selectedElementAnimation.exit;
19739
20116
  if (!preset || preset === "none") {
19740
20117
  return;
@@ -19794,7 +20171,7 @@ function useAnimationHandlers({
19794
20171
  const idx = anims.findIndex((a) => a.elementId === selectedElement.id);
19795
20172
  const hasEffect = entrance || exit || emphasis;
19796
20173
  if (idx >= 0) {
19797
- if (!hasEffect) {
20174
+ if (!hasEffect && !anims[idx].motionPath) {
19798
20175
  return anims.filter((a) => a.elementId !== selectedElement.id);
19799
20176
  }
19800
20177
  anims[idx] = {
@@ -19852,6 +20229,20 @@ function useAnimationHandlers({
19852
20229
  },
19853
20230
  [setAnimationPreset, selectedElementAnimation]
19854
20231
  );
20232
+ const handleMotionPathChange = useCallback(
20233
+ (presetId) => {
20234
+ if (!canEdit) {
20235
+ return;
20236
+ }
20237
+ if (presetId === "custom") {
20238
+ return;
20239
+ }
20240
+ updateAnimations(
20241
+ (anims) => presetId === "none" ? clearMotionPath(anims, selectedElement.id) : applyMotionPathPreset(anims, selectedElement.id, presetId)
20242
+ );
20243
+ },
20244
+ [canEdit, updateAnimations, selectedElement.id]
20245
+ );
19855
20246
  const handleTriggerChange = useCallback(
19856
20247
  (event) => {
19857
20248
  const newTrigger = event.target.value;
@@ -19917,7 +20308,7 @@ function useAnimationHandlers({
19917
20308
  [activeSlide.elements]
19918
20309
  );
19919
20310
  const hasAnimation = Boolean(
19920
- selectedElementAnimation?.entrance || selectedElementAnimation?.exit || selectedElementAnimation?.emphasis
20311
+ selectedElementAnimation?.entrance || selectedElementAnimation?.exit || selectedElementAnimation?.emphasis || selectedElementAnimation?.motionPath
19921
20312
  );
19922
20313
  const showDirectionPicker = hasAnimation && (DIRECTIONAL_PRESETS.has(selectedElementAnimation?.entrance ?? "") || DIRECTIONAL_PRESETS.has(selectedElementAnimation?.exit ?? ""));
19923
20314
  const timelineBarData = useMemo(() => {
@@ -19959,6 +20350,7 @@ function useAnimationHandlers({
19959
20350
  handleRepeatModeChange,
19960
20351
  handleDirectionChange,
19961
20352
  handleSequenceChange,
20353
+ handleMotionPathChange,
19962
20354
  getTimelineLabel,
19963
20355
  ...preview,
19964
20356
  ...dragDrop
@@ -19993,6 +20385,7 @@ function AnimationPanel({
19993
20385
  handleRepeatModeChange,
19994
20386
  handleDirectionChange,
19995
20387
  handleSequenceChange,
20388
+ handleMotionPathChange,
19996
20389
  handlePreviewClick
19997
20390
  } = handlers;
19998
20391
  return /* @__PURE__ */ jsxs("div", { className: "rounded border border-border bg-card p-2 space-y-2", children: [
@@ -20060,6 +20453,14 @@ function AnimationPanel({
20060
20453
  }
20061
20454
  )
20062
20455
  ] }),
20456
+ /* @__PURE__ */ jsx(
20457
+ MotionPathRow,
20458
+ {
20459
+ motionPath: selectedElementAnimation?.motionPath,
20460
+ canEdit,
20461
+ onChange: handleMotionPathChange
20462
+ }
20463
+ ),
20063
20464
  hasAnimation && /* @__PURE__ */ jsxs(Fragment, { children: [
20064
20465
  showDirectionPicker && /* @__PURE__ */ jsxs("div", { className: "pt-1 border-t border-border", children: [
20065
20466
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-[11px] block mb-1", children: t("pptx.animation.direction") }),
@@ -22010,7 +22411,7 @@ function ConnectorArrowsSection({
22010
22411
  ["Start", "End"].map((end) => {
22011
22412
  const widthKey = end === "Start" ? "connectorStartArrowWidth" : "connectorEndArrowWidth";
22012
22413
  const lengthKey = end === "Start" ? "connectorStartArrowLength" : "connectorEndArrowLength";
22013
- return /* @__PURE__ */ jsxs(React33.Fragment, { children: [
22414
+ return /* @__PURE__ */ jsxs(React34.Fragment, { children: [
22014
22415
  /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1", children: [
22015
22416
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t(END_LABEL_KEYS[end].width) }),
22016
22417
  /* @__PURE__ */ jsx(
@@ -24839,7 +25240,7 @@ function StrokeEffectsSection({
24839
25240
  ] }),
24840
25241
  EFFECT_CONFIGS.map((cfg) => {
24841
25242
  const on = cfg.isOn(style);
24842
- return /* @__PURE__ */ jsxs(React33.Fragment, { children: [
25243
+ return /* @__PURE__ */ jsxs(React34.Fragment, { children: [
24843
25244
  /* @__PURE__ */ jsxs("label", { className: `inline-flex items-center gap-2 text-foreground ${COL2}`, children: [
24844
25245
  /* @__PURE__ */ jsx(
24845
25246
  "input",
@@ -25676,7 +26077,7 @@ function TextWarpGallery({
25676
26077
  onUpdateTextStyle
25677
26078
  }) {
25678
26079
  const { t } = useTranslation();
25679
- const [expanded, setExpanded] = React33.useState(false);
26080
+ const [expanded, setExpanded] = React34.useState(false);
25680
26081
  const currentPreset = ts?.textWarpPreset || "textNoShape";
25681
26082
  return /* @__PURE__ */ jsxs("div", { className: "mt-2 rounded border border-border bg-card p-2 space-y-2", children: [
25682
26083
  /* @__PURE__ */ jsxs(
@@ -26382,6 +26783,53 @@ function SmartArtNodeRow({
26382
26783
  }
26383
26784
  );
26384
26785
  }
26786
+ function SmartArtStyleControls({
26787
+ colorSchemes,
26788
+ styleOptions,
26789
+ colorScheme,
26790
+ style,
26791
+ canEdit,
26792
+ onChangeColorScheme,
26793
+ onChangeStyle
26794
+ }) {
26795
+ const { t } = useTranslation();
26796
+ const translate = React34.useCallback((key) => t(key), [t]);
26797
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
26798
+ /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1 text-[11px]", children: [
26799
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t("pptx.smartart.colorScheme") }),
26800
+ /* @__PURE__ */ jsx(
26801
+ "select",
26802
+ {
26803
+ disabled: !canEdit,
26804
+ "data-testid": "smartart-color-scheme",
26805
+ "aria-label": t("pptx.smartart.colorScheme"),
26806
+ className: cn(INPUT, "w-full"),
26807
+ value: colorScheme,
26808
+ onChange: (e) => onChangeColorScheme(e.target.value),
26809
+ children: colorSchemes.map((cs) => /* @__PURE__ */ jsx("option", { value: cs, children: schemaLabel(SMARTART_COLOR_SCHEME_LABEL_KEYS, cs, translate) }, cs))
26810
+ }
26811
+ )
26812
+ ] }),
26813
+ /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1 text-[11px]", children: [
26814
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t("pptx.smartart.style") }),
26815
+ /* @__PURE__ */ jsx("div", { className: "flex gap-1", role: "group", "aria-label": t("pptx.smartart.style"), children: styleOptions.map((s) => /* @__PURE__ */ jsx(
26816
+ "button",
26817
+ {
26818
+ type: "button",
26819
+ disabled: !canEdit,
26820
+ "aria-pressed": style === s,
26821
+ className: cn(
26822
+ "flex-1 px-2 py-1 text-[10px] rounded border transition-colors",
26823
+ style === s ? "border-primary bg-primary/20 text-primary" : "border-border text-muted-foreground hover:bg-muted"
26824
+ ),
26825
+ onClick: () => onChangeStyle(s),
26826
+ children: schemaLabel(SMARTART_STYLE_LABEL_KEYS, s, translate)
26827
+ },
26828
+ s
26829
+ )) })
26830
+ ] })
26831
+ ] });
26832
+ }
26385
26833
  var COLOR_SCHEMES = [
26386
26834
  "colorful1",
26387
26835
  "colorful2",
@@ -26401,9 +26849,9 @@ function SmartArtPropertiesPanel({
26401
26849
  const nodes = smartArtData.nodes ?? [];
26402
26850
  const layout = smartArtData.resolvedLayoutType;
26403
26851
  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(() => {
26852
+ const inputRefs = React34.useRef(/* @__PURE__ */ new Map());
26853
+ const pendingFocusId = React34.useRef(null);
26854
+ React34.useEffect(() => {
26407
26855
  const id = pendingFocusId.current;
26408
26856
  if (id) {
26409
26857
  inputRefs.current.get(id)?.focus();
@@ -26518,39 +26966,18 @@ function SmartArtPropertiesPanel({
26518
26966
  onUpdateSmartArt: updateSmartArt
26519
26967
  }
26520
26968
  ),
26521
- /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1 text-[11px]", children: [
26522
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t("pptx.smartart.colorScheme") }),
26523
- /* @__PURE__ */ jsx(
26524
- "select",
26525
- {
26526
- disabled: !canEdit,
26527
- "data-testid": "smartart-color-scheme",
26528
- "aria-label": t("pptx.smartart.colorScheme"),
26529
- className: cn(INPUT, "w-full"),
26530
- value: smartArtData.colorScheme ?? "colorful1",
26531
- onChange: (e) => updateSmartArt({ colorScheme: e.target.value }),
26532
- children: COLOR_SCHEMES.map((cs) => /* @__PURE__ */ jsx("option", { value: cs, children: cs }, cs))
26533
- }
26534
- )
26535
- ] }),
26536
- /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1 text-[11px]", children: [
26537
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t("pptx.smartart.style") }),
26538
- /* @__PURE__ */ jsx("div", { className: "flex gap-1", role: "group", "aria-label": t("pptx.smartart.style"), children: STYLE_OPTIONS.map((s) => /* @__PURE__ */ jsx(
26539
- "button",
26540
- {
26541
- type: "button",
26542
- disabled: !canEdit,
26543
- "aria-pressed": (smartArtData.style ?? "flat") === s,
26544
- className: cn(
26545
- "flex-1 px-2 py-1 text-[10px] rounded border transition-colors",
26546
- (smartArtData.style ?? "flat") === s ? "border-primary bg-primary/20 text-primary" : "border-border text-muted-foreground hover:bg-muted"
26547
- ),
26548
- onClick: () => updateSmartArt({ style: s }),
26549
- children: s
26550
- },
26551
- s
26552
- )) })
26553
- ] }),
26969
+ /* @__PURE__ */ jsx(
26970
+ SmartArtStyleControls,
26971
+ {
26972
+ colorSchemes: COLOR_SCHEMES,
26973
+ styleOptions: STYLE_OPTIONS,
26974
+ colorScheme: smartArtData.colorScheme ?? "colorful1",
26975
+ style: smartArtData.style ?? "flat",
26976
+ canEdit,
26977
+ onChangeColorScheme: (colorScheme) => updateSmartArt({ colorScheme }),
26978
+ onChangeStyle: (style) => updateSmartArt({ style })
26979
+ }
26980
+ ),
26554
26981
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
26555
26982
  /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
26556
26983
  t("pptx.smartart.textPane"),
@@ -26764,6 +27191,57 @@ function TableDataGrid({
26764
27191
  ] }) })
26765
27192
  ] }) });
26766
27193
  }
27194
+ function TableCellPatternFill({
27195
+ cellStyle,
27196
+ canEdit,
27197
+ onUpdateCellStyle
27198
+ }) {
27199
+ const { t } = useTranslation();
27200
+ const translate = (key) => t(key);
27201
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
27202
+ /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-0.5", children: [
27203
+ /* @__PURE__ */ jsx("span", { className: LBL, children: t("pptx.table.patternPreset") }),
27204
+ /* @__PURE__ */ jsx(
27205
+ "select",
27206
+ {
27207
+ disabled: !canEdit,
27208
+ className: SEL,
27209
+ value: cellStyle.patternFillPreset ?? "ltDnDiag",
27210
+ onChange: (e) => onUpdateCellStyle({ patternFillPreset: e.target.value }),
27211
+ children: PATTERN_OPTIONS.map((p) => /* @__PURE__ */ jsx("option", { value: p, children: schemaLabel(FILL_PATTERN_LABEL_KEYS, p, translate) }, p))
27212
+ }
27213
+ )
27214
+ ] }),
27215
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-1.5", children: [
27216
+ /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-0.5", children: [
27217
+ /* @__PURE__ */ jsx("span", { className: LBL, children: t("pptx.table.patternForeground") }),
27218
+ /* @__PURE__ */ jsx(
27219
+ "input",
27220
+ {
27221
+ type: "color",
27222
+ disabled: !canEdit,
27223
+ className: "w-full h-7 rounded border border-border bg-transparent cursor-pointer",
27224
+ value: cellStyle.patternFillForeground ?? "#000000",
27225
+ onChange: (e) => onUpdateCellStyle({ patternFillForeground: e.target.value })
27226
+ }
27227
+ )
27228
+ ] }),
27229
+ /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-0.5", children: [
27230
+ /* @__PURE__ */ jsx("span", { className: LBL, children: t("pptx.table.patternBackground") }),
27231
+ /* @__PURE__ */ jsx(
27232
+ "input",
27233
+ {
27234
+ type: "color",
27235
+ disabled: !canEdit,
27236
+ className: "w-full h-7 rounded border border-border bg-transparent cursor-pointer",
27237
+ value: cellStyle.patternFillBackground ?? "#FFFFFF",
27238
+ onChange: (e) => onUpdateCellStyle({ patternFillBackground: e.target.value })
27239
+ }
27240
+ )
27241
+ ] })
27242
+ ] })
27243
+ ] });
27244
+ }
26767
27245
  function TableCellAdvancedFill({
26768
27246
  cellStyle,
26769
27247
  canEdit,
@@ -26817,7 +27295,7 @@ function TableCellAdvancedFill({
26817
27295
  }
26818
27296
  ),
26819
27297
  fillMode === "pattern" && /* @__PURE__ */ jsx(
26820
- PatternControls,
27298
+ TableCellPatternFill,
26821
27299
  {
26822
27300
  cellStyle,
26823
27301
  canEdit,
@@ -26943,62 +27421,6 @@ function GradientControls({
26943
27421
  )
26944
27422
  ] });
26945
27423
  }
26946
- function PatternControls({
26947
- cellStyle,
26948
- canEdit,
26949
- onUpdateCellStyle
26950
- }) {
26951
- const { t } = useTranslation();
26952
- return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
26953
- /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-0.5", children: [
26954
- /* @__PURE__ */ jsx("span", { className: LBL, children: t("pptx.table.patternPreset") }),
26955
- /* @__PURE__ */ jsx(
26956
- "select",
26957
- {
26958
- disabled: !canEdit,
26959
- className: SEL,
26960
- value: cellStyle.patternFillPreset ?? "ltDnDiag",
26961
- onChange: (e) => onUpdateCellStyle({
26962
- patternFillPreset: e.target.value
26963
- }),
26964
- children: PATTERN_OPTIONS.map((p) => /* @__PURE__ */ jsx("option", { value: p, children: p }, p))
26965
- }
26966
- )
26967
- ] }),
26968
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-1.5", children: [
26969
- /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-0.5", children: [
26970
- /* @__PURE__ */ jsx("span", { className: LBL, children: t("pptx.table.patternForeground") }),
26971
- /* @__PURE__ */ jsx(
26972
- "input",
26973
- {
26974
- type: "color",
26975
- disabled: !canEdit,
26976
- className: "w-full h-7 rounded border border-border bg-transparent cursor-pointer",
26977
- value: cellStyle.patternFillForeground ?? "#000000",
26978
- onChange: (e) => onUpdateCellStyle({
26979
- patternFillForeground: e.target.value
26980
- })
26981
- }
26982
- )
26983
- ] }),
26984
- /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-0.5", children: [
26985
- /* @__PURE__ */ jsx("span", { className: LBL, children: t("pptx.table.patternBackground") }),
26986
- /* @__PURE__ */ jsx(
26987
- "input",
26988
- {
26989
- type: "color",
26990
- disabled: !canEdit,
26991
- className: "w-full h-7 rounded border border-border bg-transparent cursor-pointer",
26992
- value: cellStyle.patternFillBackground ?? "#FFFFFF",
26993
- onChange: (e) => onUpdateCellStyle({
26994
- patternFillBackground: e.target.value
26995
- })
26996
- }
26997
- )
26998
- ] })
26999
- ] })
27000
- ] });
27001
- }
27002
27424
  function TableCellFormattingPanel({
27003
27425
  tableData: td,
27004
27426
  tableEditorState,
@@ -28418,6 +28840,7 @@ function SlideThemeOverridePanel({
28418
28840
  onUpdateSlide
28419
28841
  }) {
28420
28842
  const { t } = useTranslation();
28843
+ const translate = useCallback((key) => t(key), [t]);
28421
28844
  const override = activeSlide?.clrMapOverride;
28422
28845
  const isOverrideActive = override !== void 0;
28423
28846
  const targetSlotOptions = useMemo(() => [...THEME_COLOR_SCHEME_KEYS], []);
@@ -28510,7 +28933,7 @@ function SlideThemeOverridePanel({
28510
28933
  className: "flex-1 bg-muted border border-border rounded px-1 py-0.5 text-[11px]",
28511
28934
  value: currentTarget,
28512
28935
  onChange: (e) => handleAliasChange(alias, e.target.value),
28513
- children: targetSlotOptions.map((slot) => /* @__PURE__ */ jsx("option", { value: slot, children: slot }, slot))
28936
+ children: targetSlotOptions.map((slot) => /* @__PURE__ */ jsx("option", { value: slot, children: schemaLabel(THEME_COLOR_SLOT_LABEL_KEYS, slot, translate) }, slot))
28514
28937
  }
28515
28938
  )
28516
28939
  ] }, alias);
@@ -28870,7 +29293,7 @@ function PresentationPropertiesPanel({
28870
29293
  onUpdateTagCollections
28871
29294
  }) {
28872
29295
  const { t } = useTranslation();
28873
- const handleTransitionChange = React33.useCallback(
29296
+ const handleTransitionChange = React34.useCallback(
28874
29297
  (updates) => {
28875
29298
  onUpdateSlide({
28876
29299
  transition: mergeSlideTransition(activeSlide?.transition, updates)
@@ -32183,6 +32606,7 @@ function ViewerOverlays({
32183
32606
  isAccessibilityPanelOpen,
32184
32607
  showSlideSorter,
32185
32608
  showReadingView,
32609
+ showOutlineView,
32186
32610
  templateElements,
32187
32611
  accessibilityIssues,
32188
32612
  slides,
@@ -32199,10 +32623,14 @@ function ViewerOverlays({
32199
32623
  onToggleHideSlides,
32200
32624
  onCloseSorter,
32201
32625
  onCloseReadingView,
32626
+ onCloseOutlineView,
32627
+ setSlides,
32628
+ setActiveSlideIndex,
32629
+ bumpHistory,
32202
32630
  reducedMotion,
32203
32631
  onToggleReducedMotion
32204
32632
  }) {
32205
- const hasOverlay = isShortcutHelpOpen || isAccessibilityPanelOpen || showSlideSorter || showReadingView;
32633
+ const hasOverlay = isShortcutHelpOpen || isAccessibilityPanelOpen || showSlideSorter || showReadingView || showOutlineView;
32206
32634
  if (!hasOverlay) {
32207
32635
  return null;
32208
32636
  }
@@ -32243,6 +32671,18 @@ function ViewerOverlays({
32243
32671
  activeSlideIndex,
32244
32672
  onExit: onCloseReadingView
32245
32673
  }
32674
+ ),
32675
+ showOutlineView && /* @__PURE__ */ jsx(
32676
+ OutlineViewOverlay,
32677
+ {
32678
+ slides,
32679
+ canvasSize,
32680
+ canEdit,
32681
+ setSlides,
32682
+ setActiveSlideIndex,
32683
+ bumpHistory,
32684
+ onClose: onCloseOutlineView
32685
+ }
32246
32686
  )
32247
32687
  ] });
32248
32688
  }
@@ -32696,6 +33136,7 @@ function ViewerToolbarSection(props) {
32696
33136
  state: s,
32697
33137
  selectedElement,
32698
33138
  activeSlide,
33139
+ activeSlideIndex,
32699
33140
  zoom,
32700
33141
  history,
32701
33142
  findReplace,
@@ -32731,6 +33172,12 @@ function ViewerToolbarSection(props) {
32731
33172
  return;
32732
33173
  }
32733
33174
  const current = activeSlide.animations ?? [];
33175
+ if (group === "motionPath") {
33176
+ propertyHandlers.handleUpdateSlide({
33177
+ animations: applyMotionPathPreset(current, selectedElement.id, preset)
33178
+ });
33179
+ return;
33180
+ }
32734
33181
  const existing = current.find((a) => a.elementId === selectedElement.id);
32735
33182
  const presetValue = preset;
32736
33183
  if (existing) {
@@ -32769,7 +33216,7 @@ function ViewerToolbarSection(props) {
32769
33216
  },
32770
33217
  [activeSlide, propertyHandlers]
32771
33218
  );
32772
- const scopedLayoutOptions = React33.useMemo(
33219
+ const scopedLayoutOptions = React34.useMemo(
32773
33220
  () => scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
32774
33221
  [s.layoutOptions, activeSlide]
32775
33222
  );
@@ -33068,6 +33515,7 @@ function ViewerToolbarSection(props) {
33068
33515
  onRunAccessibilityCheck: dialogs.handleRunAccessibilityCheck,
33069
33516
  onToggleSlideSorter: () => s.setShowSlideSorter((p) => !p),
33070
33517
  onOpenReadingView: () => s.setShowReadingView(true),
33518
+ onOpenOutlineView: () => s.setShowOutlineView(true),
33071
33519
  onUpdateTextStyle: ops.updateSelectedTextStyle,
33072
33520
  onTransformTextCase: ops.updateSelectedTextCase,
33073
33521
  isOverflowMenuOpen: s.isOverflowMenuOpen,
@@ -33112,6 +33560,8 @@ function ViewerToolbarSection(props) {
33112
33560
  eyedropperActive: s.eyedropperActive,
33113
33561
  onToggleEyedropper: () => s.setEyedropperActive((p) => !p),
33114
33562
  onOpenSetUpSlideShow: () => dialogs.setIsSetUpSlideShowOpen(true),
33563
+ onToggleHideSlide: () => slideOps.handleToggleHideSlides([activeSlideIndex]),
33564
+ activeSlideHidden: Boolean(activeSlide?.hidden),
33115
33565
  onOpenBroadcastDialog: () => dialogs.setIsBroadcastDialogOpen(true),
33116
33566
  onToggleSubtitles: dialogs.handleToggleSubtitles,
33117
33567
  showSubtitles: Boolean(s.presentationProperties.showSubtitles),
@@ -33909,6 +34359,10 @@ function PresentationStage({
33909
34359
  height: safeHeight,
33910
34360
  transform: `scale(${scale})`,
33911
34361
  transformOrigin: "top left",
34362
+ // Motion-path keyframes translate by a fraction of the SLIDE, so
34363
+ // the stage publishes its own size for those calc() offsets.
34364
+ "--pptx-slide-w": `${safeWidth}px`,
34365
+ "--pptx-slide-h": `${safeHeight}px`,
33912
34366
  ...getReactSlideBackgroundStyle(activeSlide)
33913
34367
  },
33914
34368
  children: [
@@ -34333,6 +34787,7 @@ ${url}`)) {
34333
34787
  ) : /* @__PURE__ */ jsx(
34334
34788
  SlideCanvas,
34335
34789
  {
34790
+ onUpdateSlideAnimations: props.onUpdateSlideAnimations,
34336
34791
  activeSlide: effectiveSlide,
34337
34792
  templateElements: effectiveTemplateElements,
34338
34793
  canvasSize,
@@ -34515,7 +34970,7 @@ ${url}`)) {
34515
34970
  )
34516
34971
  );
34517
34972
  }
34518
- var AiChatPanel = lazy(() => import('./AiChatPanel-35CHYS5N.mjs'));
34973
+ var AiChatPanel = lazy(() => import('./AiChatPanel-RMQIJDUJ.mjs'));
34519
34974
  function AiChatPanelLazy(props) {
34520
34975
  return /* @__PURE__ */ jsx(
34521
34976
  Suspense,
@@ -35677,6 +36132,7 @@ function ViewerMainContent(props) {
35677
36132
  /* @__PURE__ */ jsx(
35678
36133
  ViewerCanvasArea,
35679
36134
  {
36135
+ onUpdateSlideAnimations: (animations) => propertyHandlers.handleUpdateSlide({ animations }),
35680
36136
  mode,
35681
36137
  canEdit,
35682
36138
  slides,
@@ -37661,6 +38117,9 @@ var PowerPointViewer = forwardRef(
37661
38117
  mode,
37662
38118
  slides,
37663
38119
  visibleSlideIndexes,
38120
+ // File > Options > Advanced > "End with black slide". Off means the show
38121
+ // exits straight to the editor instead of raising the black end screen.
38122
+ endWithBlackSlide: viewerOptions.advanced.slideShowEndWithBlackSlide,
37664
38123
  activeSlideIndex,
37665
38124
  containerRef,
37666
38125
  content,
@@ -37873,6 +38332,7 @@ var PowerPointViewer = forwardRef(
37873
38332
  state,
37874
38333
  selectedElement,
37875
38334
  activeSlide,
38335
+ activeSlideIndex,
37876
38336
  zoom,
37877
38337
  history,
37878
38338
  findReplace: editorOps.findReplace,
@@ -38090,6 +38550,7 @@ var PowerPointViewer = forwardRef(
38090
38550
  isAccessibilityPanelOpen: state.isAccessibilityPanelOpen,
38091
38551
  showSlideSorter: state.showSlideSorter,
38092
38552
  showReadingView: state.showReadingView,
38553
+ showOutlineView: state.showOutlineView,
38093
38554
  templateElements: state.templateElements,
38094
38555
  accessibilityIssues: state.accessibilityIssues,
38095
38556
  slides,
@@ -38112,6 +38573,10 @@ var PowerPointViewer = forwardRef(
38112
38573
  state.setShowReadingView(false);
38113
38574
  state.setActiveSlideIndex(slideIndex);
38114
38575
  },
38576
+ onCloseOutlineView: () => state.setShowOutlineView(false),
38577
+ setSlides: state.setSlides,
38578
+ setActiveSlideIndex: state.setActiveSlideIndex,
38579
+ bumpHistory: () => state.setPointerCommitNonce((n) => n + 1),
38115
38580
  reducedMotion,
38116
38581
  onToggleReducedMotion: toggleReducedMotion
38117
38582
  }