pptx-react-viewer 4.4.0 → 4.5.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 (136) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/{AiChatPanel-QJHUDIWT.mjs → AiChatPanel-HXGCZPUX.mjs} +4 -4
  3. package/dist/AiChatPanel-HXGCZPUX.mjs.br +0 -0
  4. package/dist/AiChatPanel-HXGCZPUX.mjs.gz +0 -0
  5. package/dist/{AiChatPanel-UFMSTNCB.js → AiChatPanel-P2N6X2KB.js} +28 -28
  6. package/dist/AiChatPanel-P2N6X2KB.js.br +0 -0
  7. package/dist/AiChatPanel-P2N6X2KB.js.gz +0 -0
  8. package/dist/{Model3DScene-KXNJBAQD.js → Model3DScene-PIFMH2TU.js} +2 -2
  9. package/dist/Model3DScene-PIFMH2TU.js.br +0 -0
  10. package/dist/Model3DScene-PIFMH2TU.js.gz +0 -0
  11. package/dist/{Model3DScene-3GOC5HUS.mjs → Model3DScene-QXMMJRV3.mjs} +1 -1
  12. package/dist/Model3DScene-QXMMJRV3.mjs.br +0 -0
  13. package/dist/Model3DScene-QXMMJRV3.mjs.gz +0 -0
  14. package/dist/{chunk-OWTHF5N4.js → chunk-6FVYG27J.js} +201 -191
  15. package/dist/chunk-6FVYG27J.js.br +0 -0
  16. package/dist/chunk-6FVYG27J.js.gz +0 -0
  17. package/dist/{chunk-JQXN6PO7.mjs → chunk-APAVAD2A.mjs} +12 -0
  18. package/dist/chunk-APAVAD2A.mjs.br +0 -0
  19. package/dist/chunk-APAVAD2A.mjs.gz +0 -0
  20. package/dist/{chunk-XMKLY2SE.mjs → chunk-DX2JCSQ4.mjs} +1 -1
  21. package/dist/chunk-DX2JCSQ4.mjs.br +0 -0
  22. package/dist/chunk-DX2JCSQ4.mjs.gz +0 -0
  23. package/dist/{chunk-LUHUYBGW.mjs → chunk-IDV2ITXM.mjs} +413 -92
  24. package/dist/chunk-IDV2ITXM.mjs.br +0 -0
  25. package/dist/chunk-IDV2ITXM.mjs.gz +0 -0
  26. package/dist/{chunk-7WWINBGF.js → chunk-LYZQLV7R.js} +2513 -1533
  27. package/dist/chunk-LYZQLV7R.js.br +0 -0
  28. package/dist/chunk-LYZQLV7R.js.gz +0 -0
  29. package/dist/{chunk-WCHKDZP6.mjs → chunk-PRXJ3J5W.mjs} +24 -5
  30. package/dist/chunk-PRXJ3J5W.mjs.br +0 -0
  31. package/dist/chunk-PRXJ3J5W.mjs.gz +0 -0
  32. package/dist/{chunk-CSY422LU.js → chunk-T35BGKZG.js} +5 -5
  33. package/dist/chunk-T35BGKZG.js.br +0 -0
  34. package/dist/chunk-T35BGKZG.js.gz +0 -0
  35. package/dist/{chunk-I4D6JQOI.js → chunk-UMQV2432.js} +12 -0
  36. package/dist/chunk-UMQV2432.js.br +0 -0
  37. package/dist/chunk-UMQV2432.js.gz +0 -0
  38. package/dist/{chunk-AI6K5EAE.js → chunk-UZFCFYK6.js} +1478 -1157
  39. package/dist/chunk-UZFCFYK6.js.br +0 -0
  40. package/dist/chunk-UZFCFYK6.js.gz +0 -0
  41. package/dist/{chunk-D3TZOCQP.mjs → chunk-VZNIVS3X.mjs} +2509 -1534
  42. package/dist/chunk-VZNIVS3X.mjs.br +0 -0
  43. package/dist/chunk-VZNIVS3X.mjs.gz +0 -0
  44. package/dist/{chunk-YJKR7Z3X.js → chunk-Y4VRYQQS.js} +841 -822
  45. package/dist/chunk-Y4VRYQQS.js.br +0 -0
  46. package/dist/chunk-Y4VRYQQS.js.gz +0 -0
  47. package/dist/{chunk-WNFHFFYE.mjs → chunk-ZF5S3HHW.mjs} +17 -7
  48. package/dist/chunk-ZF5S3HHW.mjs.br +0 -0
  49. package/dist/chunk-ZF5S3HHW.mjs.gz +0 -0
  50. package/dist/i18n/de.cjs +10 -0
  51. package/dist/i18n/de.cjs.br +0 -0
  52. package/dist/i18n/de.cjs.gz +0 -0
  53. package/dist/i18n/de.mjs +10 -0
  54. package/dist/i18n/de.mjs.br +0 -0
  55. package/dist/i18n/de.mjs.gz +0 -0
  56. package/dist/i18n/es.cjs +10 -0
  57. package/dist/i18n/es.cjs.br +0 -0
  58. package/dist/i18n/es.cjs.gz +0 -0
  59. package/dist/i18n/es.mjs +10 -0
  60. package/dist/i18n/es.mjs.br +0 -0
  61. package/dist/i18n/es.mjs.gz +0 -0
  62. package/dist/i18n/fr.cjs +10 -0
  63. package/dist/i18n/fr.cjs.br +0 -0
  64. package/dist/i18n/fr.cjs.gz +0 -0
  65. package/dist/i18n/fr.mjs +10 -0
  66. package/dist/i18n/fr.mjs.br +0 -0
  67. package/dist/i18n/fr.mjs.gz +0 -0
  68. package/dist/i18n/zh-CN.cjs +10 -0
  69. package/dist/i18n/zh-CN.cjs.br +0 -0
  70. package/dist/i18n/zh-CN.cjs.gz +0 -0
  71. package/dist/i18n/zh-CN.mjs +10 -0
  72. package/dist/i18n/zh-CN.mjs.br +0 -0
  73. package/dist/i18n/zh-CN.mjs.gz +0 -0
  74. package/dist/i18n.js +4 -4
  75. package/dist/i18n.js.br +0 -0
  76. package/dist/i18n.js.gz +0 -0
  77. package/dist/i18n.mjs +1 -1
  78. package/dist/i18n.mjs.br +0 -0
  79. package/dist/i18n.mjs.gz +0 -0
  80. package/dist/index.d.ts +45 -1
  81. package/dist/index.js +49 -49
  82. package/dist/index.js.br +0 -0
  83. package/dist/index.js.gz +0 -0
  84. package/dist/index.mjs +6 -6
  85. package/dist/index.mjs.br +0 -0
  86. package/dist/index.mjs.gz +0 -0
  87. package/dist/internals.d.ts +55 -1
  88. package/dist/internals.js +105 -105
  89. package/dist/internals.js.br +0 -0
  90. package/dist/internals.js.gz +0 -0
  91. package/dist/internals.mjs +4 -4
  92. package/dist/internals.mjs.br +0 -0
  93. package/dist/internals.mjs.gz +0 -0
  94. package/dist/pptx-viewer.css +1 -1
  95. package/dist/pptx-viewer.css.br +0 -0
  96. package/dist/pptx-viewer.css.gz +0 -0
  97. package/dist/viewer/index.d.ts +48 -1
  98. package/dist/viewer/index.js +27 -27
  99. package/dist/viewer/index.js.br +0 -0
  100. package/dist/viewer/index.js.gz +0 -0
  101. package/dist/viewer/index.mjs +6 -6
  102. package/dist/viewer/index.mjs.br +0 -0
  103. package/dist/viewer/index.mjs.gz +0 -0
  104. package/package.json +1 -1
  105. package/dist/AiChatPanel-QJHUDIWT.mjs.br +0 -0
  106. package/dist/AiChatPanel-QJHUDIWT.mjs.gz +0 -0
  107. package/dist/AiChatPanel-UFMSTNCB.js.br +0 -0
  108. package/dist/AiChatPanel-UFMSTNCB.js.gz +0 -0
  109. package/dist/Model3DScene-3GOC5HUS.mjs.br +0 -0
  110. package/dist/Model3DScene-3GOC5HUS.mjs.gz +0 -0
  111. package/dist/Model3DScene-KXNJBAQD.js.br +0 -0
  112. package/dist/Model3DScene-KXNJBAQD.js.gz +0 -0
  113. package/dist/chunk-7WWINBGF.js.br +0 -0
  114. package/dist/chunk-7WWINBGF.js.gz +0 -0
  115. package/dist/chunk-AI6K5EAE.js.br +0 -0
  116. package/dist/chunk-AI6K5EAE.js.gz +0 -0
  117. package/dist/chunk-CSY422LU.js.br +0 -0
  118. package/dist/chunk-CSY422LU.js.gz +0 -0
  119. package/dist/chunk-D3TZOCQP.mjs.br +0 -0
  120. package/dist/chunk-D3TZOCQP.mjs.gz +0 -0
  121. package/dist/chunk-I4D6JQOI.js.br +0 -0
  122. package/dist/chunk-I4D6JQOI.js.gz +0 -0
  123. package/dist/chunk-JQXN6PO7.mjs.br +0 -0
  124. package/dist/chunk-JQXN6PO7.mjs.gz +0 -0
  125. package/dist/chunk-LUHUYBGW.mjs.br +0 -0
  126. package/dist/chunk-LUHUYBGW.mjs.gz +0 -0
  127. package/dist/chunk-OWTHF5N4.js.br +0 -0
  128. package/dist/chunk-OWTHF5N4.js.gz +0 -0
  129. package/dist/chunk-WCHKDZP6.mjs.br +0 -0
  130. package/dist/chunk-WCHKDZP6.mjs.gz +0 -0
  131. package/dist/chunk-WNFHFFYE.mjs.br +0 -0
  132. package/dist/chunk-WNFHFFYE.mjs.gz +0 -0
  133. package/dist/chunk-XMKLY2SE.mjs.br +0 -0
  134. package/dist/chunk-XMKLY2SE.mjs.gz +0 -0
  135. package/dist/chunk-YJKR7Z3X.js.br +0 -0
  136. package/dist/chunk-YJKR7Z3X.js.gz +0 -0
@@ -1,8 +1,8 @@
1
- import { computeFocusTargets, deckDataFieldChanged, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, collectStoredChats, exportAiChatLogs, applyElementUpdate } from './chunk-XMKLY2SE.mjs';
2
- import { useViewerOptions, useReadOnlyRecommendationState, useCompatibilityToastsState, useReducedMotion, useViewerState, useIsMobile, useResizablePanels, useDerivedSlideState, useZoomViewport, useEditorHistory, usePresentationSetup, useTouchGestures, useViewerDialogs, useEditorOperations, useViewerIntegration, useViewPreferencesSync, useLayoutSwitching, ViewerOptionsContext, Rendering3DFlagsContext, CollaborationProvider, useCollaboration, useCollaborationDocumentSync, useFollowMode, useBroadcastFollower, SlideBackgroundImageLayer, StaticElementRenderer, safePrompt, scopeLayoutOptionsToActiveSlide, ChartPartSelectionProvider, useToolbarVisibility, useKeyboardInsets, useModalDismissDrag, useViewerOptionsContext, useVirtualizedSlides, useSwipeNavigation, PresentationTransitionOverlay, RemoteSelectionOverlay, CollaborationCursorOverlay, useSheetDismissDrag, detectTargetType, parseEmailUrl, parseSlideFromUrl, ACTION_VERB_MAP, ElementRenderer, InlineCollaborationContext, SmartArtRenderer, playAnimationSound, ResizeHandles, renderStrokeView, useChartPartSelection, resolveSmartArtDataPalette } from './chunk-WCHKDZP6.mjs';
3
- import { SHAPE_PRESETS, ANIMATION_PRESET_OPTIONS, cn, SLIDE_NAV_THUMBNAIL_WIDTH, TOOLBAR_SECTIONS, DEFAULT_SECTION_GROUP_ID, SHORTCUT_REFERENCE_ITEMS as SHORTCUT_REFERENCE_ITEMS$1, isConnectorOrLineElement, GRID_SIZE, MIN_ELEMENT_SIZE, CONNECTOR_ARROW_OPTIONS, ARROW_SIZE_OPTIONS, DEFAULT_FILL_COLOR, startMotionPathPreview, startPreviewAnimation, stopPreviewAnimation, DEFAULT_STROKE_COLOR, STROKE_DASH_OPTIONS } from './chunk-WNFHFFYE.mjs';
4
- import { SWITCHABLE_LAYOUT_TYPES, compileEquationTemplateMathMl, buildUserFontFaceStyles, readStoredViewerPrefs, resolveThemeCatalogEntry, THEME_CATALOG, writeStoredViewerPrefs, openPptxFile, readBackstageRecentFile, resolveAutosaveActivation, buildThemeColorMap, viewerOptionsToPreferences, applyPreferenceToOptions, resolveHistoryDepth, applyAutoCorrect, resolveImageResolutionScale, resolveAutosaveIntervalMs, resolveAutosaveIntervalSeconds, shouldShowAutosaveRecoveryPrompt, resolveOptionRootClasses, resolve3DRenderingFlags, resolveSlideSizeSelection, RULER_THICKNESS, RULER_FONT_SIZE, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, hiddenSlideCue, HIDDEN_SLIDE_SLASH_GRADIENT, HIDDEN_SLIDE_LABEL_KEY, visibleTemplateElements, normalizeHexColor, themeToCssVars, listAutosaveSnapshots, resolveExpiredAutosaveSnapshots, deleteAutosaveSnapshot, masterViewCrudActions, applyMasterViewCrudAction, masterViewCrudFailureKey, applyMotionPathPreset, resetSlideLayoutPath, DEFAULT_INSERT_CHART_KIND, hasCopyableFormat, templateSchemeFromTheme, createBackstagePresentation, playFeedbackSound, shouldDiscardAutosaveOnSuccessfulSave, setMasterViewBackgroundColor, canUseClipboard, runProgramNoticeStackStyle, compatToastStackStyle, printPropertiesFrameSlides, printPropertiesSlidesPerPage, PASTE_SPECIAL_OPTIONS, getDensePanelTouchTargetPx, shouldStickyActionRow, VIEWER_OPTIONS_TABS, DEFAULT_QUICK_ACCESS_COMMAND_IDS, isHeaderFooterDateTextVisible, isHeaderFooterHeaderTextVisible, isHeaderFooterFooterTextVisible, buildJoinCollaborationConfig, buildCreateCollaborationConfig, generateBroadcastRoomId, DEFAULT_BROADCAST_SERVER_URL, buildBroadcastViewerUrl, resolveTransportForServerUrl, getSlideBackgroundStyle, pushRecentColor, mruColorsPatch, shouldClearAutosaveCacheOnClose, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, resolveScreenTip, masterViewBackgroundColor, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, resolvePresentationAction, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, toggleBlackboard, PRESENT_TOOLBAR_CLASSES, buildContextMenuEntries, themeColorSchemesEqual, observeElementHeight, EXPANDED_MAX_HEIGHT, STATUS_BAR_CLASSES, buildBarActions, formatVersionTimestamp, formatRelativeTime, scanAvailableFontFamilies, PRESETS, CATEGORIES, convertOmmlToLatex, compileLatexEquation, convertLatexToOmml, EQUATION_TEMPLATES, clampPercent2, resolveDefaultPrintSettings, HANDOUT_OPTIONS, TOOLBAR_TABS, SHORTCUT_REFERENCE_ITEMS, resolveViewerAddinRows, availableQuickAccessCommands, addQuickAccessCommand, removeQuickAccessCommand, moveQuickAccessCommand, CUSTOM_FONT_ACCEPT, activateModalFocus, buildCollaborationShareUrl, buildActiveSessionUsers, SORTER_MIN_ZOOM, SORTER_ZOOM_STEP, SORTER_MAX_ZOOM, canGoPrevious, formatSlideCounter, READING_VIEW_COUNTER_ATTR, canGoNext, READING_VIEW_ATTR, OUTLINE_LEVEL_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_ROW_ATTR, OUTLINE_VIEW_ATTR, mobileElapsedSince, nextPresentedSlide, presenterPrevDisabled, presenterNextDisabled, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, presenterTimerProgress, PRESENTER_CONSOLE_CLASSES, formatElapsed, extraQuickAccessCommands, TAB_ROW_ACTION_CLASSES, listBackstageRecentFiles, BACKSTAGE_NAV, BACKSTAGE_BACK_CLASSES, BACKSTAGE_NAV_CLASSES, hasTextProperties, COMMON_FONT_SIZES, textFontSizePtToPx, INSERT_CHART_TYPES, ACTION_BUTTON_PRESETS, CHARACTER_SPACING_OPTIONS, OFFICE_COLOR_SWATCHES, hasShapeProperties, shapeFillChange, shapeOutlineChange, readRibbonTransitionDraft, ribbonTransitionUpdates, playSlideTransitionPreview, RIBBON_TRANSITION_PRESETS, transitionSoundOptions, transitionSoundSelectedValue, DEFAULT_MOTION_PATH_PRESET_ID, SLIDE_SHOW_OPTIONS, slideShowOptionChange, readSlideShowOption, SLIDE_VIRTUALIZATION_THRESHOLD, PRESENTATION_HIT_TEST_CSS, PRESENTATION_STAGE_ATTRIBUTE, buildStrokePathD, cursorForTool, annotationOverlayZIndex, presentationInkPath, resolveNotesSchematicBodyFontSizePx, PRESENTER_NAVIGATOR_LABEL_KEYS, PEN_COLORS, HIGHLIGHTER_COLORS, isBlackboardActive, scaleSlidesForSizeChange, slideSizeToCanvasPx, resolveSelectionPaneRename, PRESET_THEMES, resolveNotesSegments, segmentsToEditorHtml, DEBOUNCE_MS, createPlainNotesSegments, parseSegmentsFromRichEditor, segmentsToPlainText, getCurrentParagraphIndex, segmentsToParagraphs, paragraphsToSegments, MAX_INDENT_LEVEL, INDENT_PX, isUrlSafe, buildNotesPrintHtml, MIN_TOUCH_TARGET_PX, toggleSheet, SMARTART_PREVIEW_ELEMENT_HEIGHT, SMARTART_PREVIEW_ELEMENT_WIDTH, buildSmartArtPreviewElement, sanitizeMathMl, computeHandoutLayout, getPrintableArea, generateNoteLineCount, computeAllNotesPages, getNotesPrintableArea, downloadBlob, clampOptionNumber, QUICK_ACCESS_COMMAND_CATALOG, registerCustomFont, openReadingView, applyReadingViewCommand, createPresentationKeyBuffer, readingViewFitScale, READING_VIEW_STAGE_ATTR, buildOutline, applyOutlineEdit, mapOutlineKey, notesSegmentsToSpans, erasePresentationInkAt, movePresenterPointer, appendPresentationInkPoint, PRESENTER_CONSOLE_CONTROLS, NOTES_FONT_SIZE_DEFAULT, formatTime, NOTES_FONT_SIZE_MIN, clampNotesFontSize, NOTES_FONT_SIZE_STEP, NOTES_FONT_SIZE_MAX, BACKSTAGE_TEMPLATES, formatBackstageDate, formatBackstageSize, backstageCardsFor, DEFAULT_VIEWER_PROFILE, resolveProfileInitial, AVATAR_COLOR_SWATCHES, resolveDefaultFontFamily, textFontSizePxToPt, buildFontCatalog, getSelectionTextStyleFlags, getInlineEditorSelectionResult, selectedParagraphBulletKind, elementBulletKind, selectionBulletKind, TEXT_DECORATION_FLAGS, nextToggleValue, buildThemeColorSwatchGrid, themeColorSwatchRows, findSelectedThemeSwatch, themeSwatchCommit, RIBBON_SHAPE_SWATCHES, canGroupSelection, canUngroupSelection, canSetStrokeWidth, strokeWidthOf, readSoundFileAsDataUrl, applyTransitionSoundFile, TRANSITION_SOUND_OTHER_VALUE, TRANSITION_SOUND_NONE_VALUE, clearTransitionSound, applyTransitionStockSound, transitionStockSoundId, getEffectSoundAsset, ENTRANCE_PRESET_VALUES, EMPHASIS_PRESET_VALUES, EXIT_PRESET_VALUES, MOTION_PATH_FAMILIES, motionPathFamilyLabelKey, motionPathPresetsByFamily, motionPathPresetLabelKey, masterViewPseudoSlide, motionPathFor, setMotionPath, getShapeAdjustmentHandleDescriptors, shouldShowElementHandles, hasMultipleSelectedTableCells, applyTableStyleDelete, applyTableStyleMapChange, themeColorLabel, buildThemeColorGrid, THEME_COLOR_SCHEME_KEYS, COMMON_FONTS, handleReadingViewKey, getLocalStorageUsageSummary, saveViewerProfile, clearAllLocalViewerData, isCurrentLayout, SLIDE_TEMPLATES, computeAnchoredPopupPosition, attachEditorImagePaste, authorConnectorBetweenSites, findEraserHitElementId, generateTicks, rulerDragToGuidePosition, resolveElementInteractivity, getElementTransformWithoutRotation, getElementTransform, buildChartQuickActionsDescriptor, applyChartElementToggle, CHART_QUICK_ACTION_BUTTON_SIZE, applyChartStylePreset, hideChartSeries, restoreFilteredSeries, getActiveXControlOverlayView, buildCommentMarkers, COMMENT_MARKER_SIZE, collectConnectorSiteCandidates, getConnectorEndpointHandles, findConnectorSiteNear, motionPathToSvgD, motionPathEndPixel, isEditableMotionPath, setMotionPathEnd, isElementLocked, isImageLikeElement, mergeSlideTransition, getElementLabel, TRIGGER_OPTIONS, mapSlideSorterKey, isEditorTextInputTarget, clampSorterZoom, buildLayoutPreviewGeometry, buildSlideTemplateContent, buildFreeformShapeElement, buildLiveInkStrokeView, CONNECTOR_SITE_SNAP_PX, resolveConnectorEndpointUpdate, withConnectorEndpointUpdate, getShapeConnectionSites, elementLockTogglePatch, buildTableDataGrid, getDenseGridLayoutPlan, appendTableElementRow, removeLastTableElementRow, appendTableElementColumn, removeLastTableElementColumn, removeTableElementColumn, removeTableElementRow, setTableElementCellText, TABLE_STYLE_PRESETS, applyTableStylePreset, tableStyleAssignmentUpdate, evenColumnWidths, redistributeColumnWidth, evenRowHeights, patchChartData, collapseChartTitleRunsForEdit, chartGridlinesState, chartGridlinesPatch, seriesSecondaryAxisPatch, setChartCategoryLabel, setChartCellValue, addChartCategory, removeChartCategory, addChartSeries, removeChartSeries, setDataLabelsRangeCache, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, setChartDataPointMarker, setChartDataPointLabel, describeSmartArtBounds, canAddTopLevelNode, classifyExtraConnections, siblingIndex, siblingCount, canRemoveTopLevelNode, canInteractWithElement, buildOleObjectNamePatch, getOleObjectTypeLabel, sanitizeGradientStops, shouldShowAccessibilitySection, pptxActionToElementAction, withFrameSlides, withSlidesPerPage, applyThemeOverrideToSlide, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, schemaLabel, THEME_COLOR_SLOT_LABEL_KEYS, SLIDE_SIZE_PRESETS, TRANSITION_VALID_DIRECTIONS, TRANSITION_ORIENTATION_TYPES, TRANSITION_PATTERN_OPTIONS, TRANSITION_THRUBLK_TYPES, clampTransitionNumber, TRANSITION_SPEED_OPTIONS, TRANSITION_MORPH_OPTIONS, flattenTagCollections, resolveTemplateBackgroundRows, formatCommentTimestamp, commentMentionQuery, matchCommentMentionAuthors, buildAnimationTimelineRows, clearMotionPath, getEffectSoundState, setEffectSound, setEffectStockSound, setAfterAnimation, setAfterAnimationColor, DIRECTIONAL_PRESETS, buildAnimationTimelineBars, motionPathPresetIdForPath, EFFECT_SOUND_CATALOGUE, hasTiltData, normalizeTableStyleGuid, describeTableStyleEditor, TABLE_STYLE_EDITOR_PARTS, computeMergeCellRight, computeMergeCellDown, computeSplitCell, updateMergeAttrsInRawXml, resolveDisplayedChartType, CHART_TYPE_OPTIONS, chartDataLabelsTogglePatch, BAR3D_SHAPE_OPTIONS, bar3DShapePatch, RADAR_STYLE_OPTIONS, radarStylePatch, SURFACE_WIREFRAME_OPTIONS, surfaceWireframePatch, isSeriesUsingSecondaryAxis, listChartUserShapeRows, withChartUserShapeAdded, createDefaultChartUserShape, withChartUserShapeRowRemoved, withChartUserShapeRowTextUpdated, SMARTART_COLOR_SCHEME_LABEL_KEYS, SMARTART_STYLE_LABEL_KEYS, addSmartArtNodeAsChild, setSmartArtNodeStyle, removeSmartArtNode, addSiblingAfter, removeEmptyNode, demote, promote, updateSmartArtNodeText, reorder, clampCropValue, DUOTONE_PRESETS, ARTISTIC_EFFECTS, mediaTrimEndSeconds, trimmedMediaDurationMs, mediaTrimEndAbsoluteMs, mediaTrimEndMsFromAbsoluteMs, buildOleEditDialogDescriptor, buildOleContentUpdatePatch, applyOleSheetCellEdit, getOleSheetGrid, applyOleDocumentParagraphEdit, getOleDocumentParagraphs, applyOleNestedDeckElementTextEdit, getOleNestedDeckDetail, replaceOleFile, getNonVisualDescriptionFields, resolveActionType, ELEMENT_ACTION_TYPE_OPTIONS, elementActionToPptxAction, canCommitActionType, slideSizeFromPreset, withSlideSizeOrientation, TRANSITION_DIR_ARROWS, buildDirectionGrid, getSlideTransitionAnimations, SLIDE_TRANSITION_KEYFRAMES, updateTagInCollections, deleteTagFromCollections, addTagToCollections, commentTextSegments, COMMENT_MENTION_CLASS, COMMENT_MENTION_ATTRIBUTE, insertCommentMention, reorderAnimationTimelineRows, applyAnimationTimelineOrder, animationEffectLabel, TABLE_STYLE_BORDER_SIDES, applyTableStyleFieldEdit, createTableStyleEntry, addTableStyleToMap, deleteTableStyleFromMap, LBL, SEL, FILL_MODE_OPTIONS, SECTION_HEADING, NUM, getChartUserShapeGroupTransform, withChartUserShapeGroupChildAdded, createDefaultChartUserShapeGroupChild, withChartUserShapeRowUpdated, getChartUserShapeRowChartBox, withChartUserShapeRowFlipUpdated, withChartUserShapeRowRotationUpdated, withChartUserShapeRowChartBoxUpdated, switchSmartArtLayout, rebuildDrawingShapesIfCleared, mediaTrimEndMsFromSeconds, validateMediaTrimRange, SHAPE_QUICK_STYLES, quickStyleSwatchCss, PATTERN_PRESET_OPTIONS, getPatternSvg, COMPOUND_LINE_OPTIONS, LINE_JOIN_OPTIONS, LINE_CAP_OPTIONS, TEXT_WARP_PRESETS, warpPreviewPath, text3dPtToEmu, text3dEmuToPt, MATERIAL_PRESETS, toSlideIndex, TABLE_STYLE_BORDER_SIDE_LABEL_KEYS, TABLE_STYLE_DASH_PRESETS, GRADIENT_TYPE_OPTIONS, PATTERN_OPTIONS, FILL_PATTERN_LABEL_KEYS, openNativeEyeDropper, toggleText3dExtrusion, BEVEL_PRESETS } from './chunk-D3TZOCQP.mjs';
5
- import { LOCALE_CATALOG, ALIGNMENT_LABEL_KEYS } from './chunk-JQXN6PO7.mjs';
1
+ import { computeFocusTargets, deckDataFieldChanged, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, collectStoredChats, exportAiChatLogs, applyElementUpdate } from './chunk-DX2JCSQ4.mjs';
2
+ import { useViewerOptions, useReadOnlyRecommendationState, useCompatibilityToastsState, useReducedMotion, useViewerState, useIsMobile, useResizablePanels, useDerivedSlideState, useZoomViewport, useEditorHistory, usePresentationSetup, useTouchGestures, useViewerDialogs, useEditorOperations, useViewerIntegration, useViewPreferencesSync, useLayoutSwitching, ViewerOptionsContext, Rendering3DFlagsContext, CollaborationProvider, useCollaboration, useCollaborationDocumentSync, useFollowMode, useBroadcastFollower, SlideBackgroundImageLayer, StaticElementRenderer, safePrompt, scopeLayoutOptionsToActiveSlide, ChartPartSelectionProvider, useToolbarVisibility, useKeyboardInsets, useModalDismissDrag, useViewerOptionsContext, useVirtualizedSlides, useSwipeNavigation, PresentationTransitionOverlay, RemoteSelectionOverlay, CollaborationCursorOverlay, useSheetDismissDrag, detectTargetType, parseEmailUrl, parseSlideFromUrl, ACTION_VERB_MAP, ElementRenderer, InlineCollaborationContext, SmartArtRenderer, playAnimationSound, ResizeHandles, renderStrokeView, useChartPartSelection, resolveSmartArtDataPalette } from './chunk-PRXJ3J5W.mjs';
3
+ import { SHAPE_PRESETS, ANIMATION_PRESET_OPTIONS, cn, SLIDE_NAV_THUMBNAIL_WIDTH, TOOLBAR_SECTIONS, DEFAULT_SECTION_GROUP_ID, SHORTCUT_REFERENCE_ITEMS as SHORTCUT_REFERENCE_ITEMS$1, isConnectorOrLineElement, GRID_SIZE, MIN_ELEMENT_SIZE, CONNECTOR_ARROW_OPTIONS, ARROW_SIZE_OPTIONS, DEFAULT_FILL_COLOR, startMotionPathPreview, startPreviewAnimation, stopPreviewAnimation, DEFAULT_STROKE_COLOR, STROKE_DASH_OPTIONS } from './chunk-ZF5S3HHW.mjs';
4
+ import { SWITCHABLE_LAYOUT_TYPES, compileEquationTemplateMathMl, buildUserFontFaceStyles, readStoredViewerPrefs, resolveThemeCatalogEntry, THEME_CATALOG, writeStoredViewerPrefs, openPptxFile, readBackstageRecentFile, resolveAutosaveActivation, buildThemeColorMap, viewerOptionsToPreferences, applyPreferenceToOptions, resolveHistoryDepth, applyAutoCorrect, resolveImageResolutionScale, resolveAutosaveIntervalMs, resolveAutosaveIntervalSeconds, shouldShowAutosaveRecoveryPrompt, resolveOptionRootClasses, resolve3DRenderingFlags, resolveSlideSizeSelection, RULER_THICKNESS, RULER_FONT_SIZE, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, hiddenSlideCue, HIDDEN_SLIDE_SLASH_GRADIENT, HIDDEN_SLIDE_LABEL_KEY, visibleTemplateElements, normalizeHexColor, themeToCssVars, listAutosaveSnapshots, resolveExpiredAutosaveSnapshots, deleteAutosaveSnapshot, masterViewCrudActions, applyMasterViewCrudAction, masterViewCrudFailureKey, applyMotionPathPreset, resetSlideLayoutPath, DEFAULT_INSERT_CHART_KIND, hasCopyableFormat, templateSchemeFromTheme, createBackstagePresentation, playFeedbackSound, shouldDiscardAutosaveOnSuccessfulSave, setMasterViewBackgroundColor, canUseClipboard, runProgramNoticeStackStyle, compatToastStackStyle, printPropertiesFrameSlides, printPropertiesSlidesPerPage, PASTE_SPECIAL_OPTIONS, getDensePanelTouchTargetPx, shouldStickyActionRow, VIEWER_OPTIONS_TABS, DEFAULT_QUICK_ACCESS_COMMAND_IDS, isHeaderFooterDateTextVisible, isHeaderFooterHeaderTextVisible, isHeaderFooterFooterTextVisible, buildJoinCollaborationConfig, buildCreateCollaborationConfig, generateBroadcastRoomId, DEFAULT_BROADCAST_SERVER_URL, buildBroadcastViewerUrl, resolveTransportForServerUrl, getSlideBackgroundStyle, pushRecentColor, mruColorsPatch, shouldClearAutosaveCacheOnClose, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, resolveScreenTip, masterViewBackgroundColor, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, resolvePresentationAction, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, toggleBlackboard, PRESENT_TOOLBAR_CLASSES, buildContextMenuEntries, buildCanvasContextMenuEntries, isCurrentLayout, themeColorSchemesEqual, observeElementHeight, EXPANDED_MAX_HEIGHT, STATUS_BAR_CLASSES, buildBarActions, formatVersionTimestamp, formatRelativeTime, scanAvailableFontFamilies, PRESETS, CATEGORIES, convertOmmlToLatex, compileLatexEquation, convertLatexToOmml, EQUATION_TEMPLATES, clampPercent2, resolveDefaultPrintSettings, HANDOUT_OPTIONS, TOOLBAR_TABS, SHORTCUT_REFERENCE_ITEMS, resolveViewerAddinRows, availableQuickAccessCommands, addQuickAccessCommand, removeQuickAccessCommand, moveQuickAccessCommand, CUSTOM_FONT_ACCEPT, activateModalFocus, buildCollaborationShareUrl, buildActiveSessionUsers, SORTER_MIN_ZOOM, SORTER_ZOOM_STEP, SORTER_MAX_ZOOM, canGoPrevious, formatSlideCounter, READING_VIEW_COUNTER_ATTR, canGoNext, READING_VIEW_ATTR, OUTLINE_LEVEL_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_ROW_ATTR, OUTLINE_VIEW_ATTR, mobileElapsedSince, nextPresentedSlide, presenterPrevDisabled, presenterNextDisabled, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, presenterTimerProgress, PRESENTER_CONSOLE_CLASSES, formatElapsed, extraQuickAccessCommands, TAB_ROW_ACTION_CLASSES, listBackstageRecentFiles, BACKSTAGE_NAV, BACKSTAGE_BACK_CLASSES, BACKSTAGE_NAV_CLASSES, hasTextProperties, COMMON_FONT_SIZES, textFontSizePtToPx, INSERT_CHART_TYPES, ACTION_BUTTON_PRESETS, CHARACTER_SPACING_OPTIONS, OFFICE_COLOR_SWATCHES, hasShapeProperties, shapeFillChange, shapeOutlineChange, readRibbonTransitionDraft, ribbonTransitionUpdates, playSlideTransitionPreview, RIBBON_TRANSITION_PRESETS, transitionSoundOptions, transitionSoundSelectedValue, DEFAULT_MOTION_PATH_PRESET_ID, SLIDE_SHOW_OPTIONS, slideShowOptionChange, readSlideShowOption, resolveSlidePaneClick, SLIDE_VIRTUALIZATION_THRESHOLD, buildSlidePaneContextMenuEntries, PRESENTATION_HIT_TEST_CSS, PRESENTATION_STAGE_ATTRIBUTE, buildStrokePathD, cursorForTool, annotationOverlayZIndex, presentationInkPath, resolveNotesSchematicBodyFontSizePx, PRESENTER_NAVIGATOR_LABEL_KEYS, PEN_COLORS, HIGHLIGHTER_COLORS, isBlackboardActive, buildLayoutPreviewGeometry, scaleSlidesForSizeChange, slideSizeToCanvasPx, resolveSelectionPaneRename, PRESET_THEMES, resolveNotesSegments, segmentsToEditorHtml, DEBOUNCE_MS, createPlainNotesSegments, parseSegmentsFromRichEditor, segmentsToPlainText, getCurrentParagraphIndex, segmentsToParagraphs, paragraphsToSegments, MAX_INDENT_LEVEL, INDENT_PX, isUrlSafe, buildNotesPrintHtml, MIN_TOUCH_TARGET_PX, toggleSheet, SMARTART_PREVIEW_ELEMENT_HEIGHT, SMARTART_PREVIEW_ELEMENT_WIDTH, buildSmartArtPreviewElement, sanitizeMathMl, computeHandoutLayout, getPrintableArea, generateNoteLineCount, computeAllNotesPages, getNotesPrintableArea, downloadBlob, clampOptionNumber, QUICK_ACCESS_COMMAND_CATALOG, registerCustomFont, openReadingView, applyReadingViewCommand, createPresentationKeyBuffer, readingViewFitScale, READING_VIEW_STAGE_ATTR, buildOutline, applyOutlineEdit, mapOutlineKey, notesSegmentsToSpans, erasePresentationInkAt, movePresenterPointer, appendPresentationInkPoint, PRESENTER_CONSOLE_CONTROLS, NOTES_FONT_SIZE_DEFAULT, formatTime, NOTES_FONT_SIZE_MIN, clampNotesFontSize, NOTES_FONT_SIZE_STEP, NOTES_FONT_SIZE_MAX, BACKSTAGE_TEMPLATES, formatBackstageDate, formatBackstageSize, backstageCardsFor, DEFAULT_VIEWER_PROFILE, resolveProfileInitial, AVATAR_COLOR_SWATCHES, resolveDefaultFontFamily, textFontSizePxToPt, buildFontCatalog, getSelectionTextStyleFlags, getInlineEditorSelectionResult, selectedParagraphBulletKind, elementBulletKind, selectionBulletKind, TEXT_DECORATION_FLAGS, nextToggleValue, buildThemeColorSwatchGrid, themeColorSwatchRows, findSelectedThemeSwatch, themeSwatchCommit, RIBBON_SHAPE_SWATCHES, canGroupSelection, canUngroupSelection, canSetStrokeWidth, strokeWidthOf, readSoundFileAsDataUrl, applyTransitionSoundFile, TRANSITION_SOUND_OTHER_VALUE, TRANSITION_SOUND_NONE_VALUE, clearTransitionSound, applyTransitionStockSound, transitionStockSoundId, getEffectSoundAsset, playAnimationRibbonPreview, ENTRANCE_PRESET_VALUES, EMPHASIS_PRESET_VALUES, EXIT_PRESET_VALUES, MOTION_PATH_FAMILIES, motionPathFamilyLabelKey, motionPathPresetsByFamily, motionPathPresetLabelKey, masterViewPseudoSlide, motionPathFor, setMotionPath, getShapeAdjustmentHandleDescriptors, shouldShowElementHandles, hasMultipleSelectedTableCells, computeAnchoredPopupPosition, applyTableStyleDelete, applyTableStyleMapChange, themeColorLabel, buildThemeColorGrid, THEME_COLOR_SCHEME_KEYS, COMMON_FONTS, handleReadingViewKey, getLocalStorageUsageSummary, saveViewerProfile, clearAllLocalViewerData, SLIDE_TEMPLATES, attachEditorImagePaste, authorConnectorBetweenSites, findEraserHitElementId, generateTicks, rulerDragToGuidePosition, resolveElementInteractivity, getElementTransformWithoutRotation, getElementTransform, buildChartQuickActionsDescriptor, applyChartElementToggle, CHART_QUICK_ACTION_BUTTON_SIZE, applyChartStylePreset, hideChartSeries, restoreFilteredSeries, getActiveXControlOverlayView, buildCommentMarkers, COMMENT_MARKER_SIZE, collectConnectorSiteCandidates, getConnectorEndpointHandles, findConnectorSiteNear, motionPathToSvgD, motionPathEndPixel, isEditableMotionPath, setMotionPathEnd, isElementLocked, isImageLikeElement, mergeSlideTransition, getElementLabel, TRIGGER_OPTIONS, mapSlideSorterKey, isEditorTextInputTarget, clampSorterZoom, buildSlideTemplateContent, buildFreeformShapeElement, buildLiveInkStrokeView, CONNECTOR_SITE_SNAP_PX, resolveConnectorEndpointUpdate, withConnectorEndpointUpdate, getShapeConnectionSites, elementLockTogglePatch, buildTableDataGrid, getDenseGridLayoutPlan, appendTableElementRow, removeLastTableElementRow, appendTableElementColumn, removeLastTableElementColumn, removeTableElementColumn, removeTableElementRow, setTableElementCellText, TABLE_STYLE_PRESETS, applyTableStylePreset, tableStyleAssignmentUpdate, evenColumnWidths, redistributeColumnWidth, evenRowHeights, patchChartData, collapseChartTitleRunsForEdit, chartGridlinesState, chartGridlinesPatch, seriesSecondaryAxisPatch, setChartCategoryLabel, setChartCellValue, addChartCategory, removeChartCategory, addChartSeries, removeChartSeries, setDataLabelsRangeCache, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, setChartDataPointMarker, setChartDataPointLabel, describeSmartArtBounds, canAddTopLevelNode, classifyExtraConnections, siblingIndex, siblingCount, canRemoveTopLevelNode, canInteractWithElement, buildOleObjectNamePatch, getOleObjectTypeLabel, sanitizeGradientStops, shouldShowAccessibilitySection, pptxActionToElementAction, withFrameSlides, withSlidesPerPage, applyThemeOverrideToSlide, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, schemaLabel, THEME_COLOR_SLOT_LABEL_KEYS, SLIDE_SIZE_PRESETS, TRANSITION_VALID_DIRECTIONS, TRANSITION_ORIENTATION_TYPES, TRANSITION_PATTERN_OPTIONS, TRANSITION_THRUBLK_TYPES, clampTransitionNumber, TRANSITION_SPEED_OPTIONS, TRANSITION_MORPH_OPTIONS, flattenTagCollections, resolveTemplateBackgroundRows, formatCommentTimestamp, commentMentionQuery, matchCommentMentionAuthors, buildAnimationTimelineRows, clearMotionPath, getEffectSoundState, setEffectSound, setEffectStockSound, setAfterAnimation, setAfterAnimationColor, DIRECTIONAL_PRESETS, buildAnimationTimelineBars, motionPathPresetIdForPath, EFFECT_SOUND_CATALOGUE, hasTiltData, normalizeTableStyleGuid, describeTableStyleEditor, TABLE_STYLE_EDITOR_PARTS, computeMergeCellRight, computeMergeCellDown, computeSplitCell, updateMergeAttrsInRawXml, resolveDisplayedChartType, CHART_TYPE_OPTIONS, chartDataLabelsTogglePatch, BAR3D_SHAPE_OPTIONS, bar3DShapePatch, RADAR_STYLE_OPTIONS, radarStylePatch, SURFACE_WIREFRAME_OPTIONS, surfaceWireframePatch, isSeriesUsingSecondaryAxis, listChartUserShapeRows, withChartUserShapeAdded, createDefaultChartUserShape, withChartUserShapeRowRemoved, withChartUserShapeRowTextUpdated, SMARTART_COLOR_SCHEME_LABEL_KEYS, SMARTART_STYLE_LABEL_KEYS, addSmartArtNodeAsChild, setSmartArtNodeStyle, removeSmartArtNode, addSiblingAfter, removeEmptyNode, demote, promote, updateSmartArtNodeText, reorder, clampCropValue, DUOTONE_PRESETS, ARTISTIC_EFFECTS, mediaTrimEndSeconds, trimmedMediaDurationMs, mediaTrimEndAbsoluteMs, mediaTrimEndMsFromAbsoluteMs, buildOleEditDialogDescriptor, buildOleContentUpdatePatch, applyOleSheetCellEdit, getOleSheetGrid, applyOleDocumentParagraphEdit, getOleDocumentParagraphs, applyOleNestedDeckElementTextEdit, getOleNestedDeckDetail, replaceOleFile, getNonVisualDescriptionFields, resolveActionType, ELEMENT_ACTION_TYPE_OPTIONS, elementActionToPptxAction, canCommitActionType, slideSizeFromPreset, withSlideSizeOrientation, TRANSITION_DIR_ARROWS, buildDirectionGrid, getSlideTransitionAnimations, SLIDE_TRANSITION_KEYFRAMES, updateTagInCollections, deleteTagFromCollections, addTagToCollections, commentTextSegments, COMMENT_MENTION_CLASS, COMMENT_MENTION_ATTRIBUTE, insertCommentMention, reorderAnimationTimelineRows, applyAnimationTimelineOrder, animationEffectLabel, TABLE_STYLE_BORDER_SIDES, applyTableStyleFieldEdit, createTableStyleEntry, addTableStyleToMap, deleteTableStyleFromMap, LBL, SEL, FILL_MODE_OPTIONS, SECTION_HEADING, NUM, getChartUserShapeGroupTransform, withChartUserShapeGroupChildAdded, createDefaultChartUserShapeGroupChild, withChartUserShapeRowUpdated, getChartUserShapeRowChartBox, withChartUserShapeRowFlipUpdated, withChartUserShapeRowRotationUpdated, withChartUserShapeRowChartBoxUpdated, switchSmartArtLayout, rebuildDrawingShapesIfCleared, mediaTrimEndMsFromSeconds, validateMediaTrimRange, SHAPE_QUICK_STYLES, quickStyleSwatchCss, PATTERN_PRESET_OPTIONS, getPatternSvg, COMPOUND_LINE_OPTIONS, LINE_JOIN_OPTIONS, LINE_CAP_OPTIONS, TEXT_WARP_PRESETS, warpPreviewPath, text3dPtToEmu, text3dEmuToPt, MATERIAL_PRESETS, toSlideIndex, TABLE_STYLE_BORDER_SIDE_LABEL_KEYS, TABLE_STYLE_DASH_PRESETS, GRADIENT_TYPE_OPTIONS, PATTERN_OPTIONS, FILL_PATTERN_LABEL_KEYS, openNativeEyeDropper, toggleText3dExtrusion, BEVEL_PRESETS } from './chunk-VZNIVS3X.mjs';
5
+ import { LOCALE_CATALOG, ALIGNMENT_LABEL_KEYS } from './chunk-APAVAD2A.mjs';
6
6
  import React4, { createContext, lazy, forwardRef, useEffect, useState, useCallback, useMemo, useRef, useId, Fragment as Fragment$1, useDeferredValue, useLayoutEffect, Suspense, useContext, useSyncExternalStore } from 'react';
7
7
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
8
  import { useTranslation } from 'react-i18next';
@@ -658,12 +658,17 @@ function AnimationsSection(p) {
658
658
  const { t } = useTranslation();
659
659
  const [previewActive, setPreviewActive] = useState(false);
660
660
  const disabled = !p.canEdit || p.selectedElement === null;
661
+ const selectedAnimation = useMemo(
662
+ () => p.selectedElement ? (p.activeSlide?.animations ?? []).find((a) => a.elementId === p.selectedElement?.id) : void 0,
663
+ [p.activeSlide?.animations, p.selectedElement]
664
+ );
661
665
  const preview = () => {
662
666
  if (disabled) {
663
667
  return;
664
668
  }
665
669
  setPreviewActive(true);
666
670
  setTimeout(() => setPreviewActive(false), 1200);
671
+ playAnimationRibbonPreview(document, selectedAnimation);
667
672
  };
668
673
  return /* @__PURE__ */ jsxs(Fragment, { children: [
669
674
  /* @__PURE__ */ jsx(RibbonGroup, { label: t("pptx.animations.preview"), children: /* @__PURE__ */ jsx(
@@ -1683,7 +1688,7 @@ function AccountPage() {
1683
1688
  return void 0;
1684
1689
  });
1685
1690
  };
1686
- const version = "4.3.0" ;
1691
+ const version = "4.4.0" ;
1687
1692
  return /* @__PURE__ */ jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
1688
1693
  /* @__PURE__ */ jsxs("section", { className: cardClass, children: [
1689
1694
  /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -4911,6 +4916,7 @@ function MobileSectionBody({
4911
4916
  {
4912
4917
  canEdit: p.canEdit,
4913
4918
  selectedElement: p.selectedElement,
4919
+ activeSlide: p.activeSlide,
4914
4920
  isInspectorPaneOpen: p.isInspectorPaneOpen,
4915
4921
  onToggleInspector: p.onToggleInspector,
4916
4922
  onOpenAnimationPanel: p.onOpenAnimationPanel,
@@ -6293,6 +6299,7 @@ function Toolbar(p) {
6293
6299
  {
6294
6300
  canEdit: p.canEdit,
6295
6301
  selectedElement: p.selectedElement,
6302
+ activeSlide: p.activeSlide,
6296
6303
  isInspectorPaneOpen: p.isInspectorPaneOpen,
6297
6304
  onToggleInspector: p.onToggleInspector,
6298
6305
  onOpenAnimationPanel: p.onOpenAnimationPanel,
@@ -7588,6 +7595,7 @@ function isViewportBackgroundMouseDownTarget(target, currentTarget) {
7588
7595
  function useCanvasEventHandlers({
7589
7596
  cbRef,
7590
7597
  onCanvasMouseDown,
7598
+ onCanvasContextMenu,
7591
7599
  findResults,
7592
7600
  findResultIndex,
7593
7601
  activeSlideIndex,
@@ -7705,9 +7713,11 @@ function useCanvasEventHandlers({
7705
7713
  const id = getElementIdFromEvent(e);
7706
7714
  if (id) {
7707
7715
  cbRef.current.onContextMenu(id, e);
7716
+ return;
7708
7717
  }
7718
+ onCanvasContextMenu?.(e);
7709
7719
  },
7710
- [cbRef]
7720
+ [cbRef, onCanvasContextMenu]
7711
7721
  );
7712
7722
  const [draggingGuide, setDraggingGuide] = useState(null);
7713
7723
  const handleStagePointerMove = useCallback(
@@ -8288,6 +8298,7 @@ function SlideCanvasContent({
8288
8298
  onMouseDown,
8289
8299
  onContextMenu,
8290
8300
  onCanvasMouseDown,
8301
+ onCanvasContextMenu,
8291
8302
  onResizePointerDown,
8292
8303
  onAdjustmentPointerDown,
8293
8304
  onRotate,
@@ -8388,6 +8399,7 @@ function SlideCanvasContent({
8388
8399
  } = useCanvasEventHandlers({
8389
8400
  cbRef,
8390
8401
  onCanvasMouseDown,
8402
+ onCanvasContextMenu,
8391
8403
  findResults,
8392
8404
  findResultIndex,
8393
8405
  activeSlideIndex,
@@ -9327,17 +9339,22 @@ function ContextMenuItem({
9327
9339
  onSelect,
9328
9340
  danger,
9329
9341
  disabled,
9342
+ checked,
9330
9343
  children
9331
9344
  }) {
9332
- return /* @__PURE__ */ jsx(
9345
+ return /* @__PURE__ */ jsxs(
9333
9346
  "button",
9334
9347
  {
9335
9348
  type: "button",
9336
- role: "menuitem",
9349
+ role: checked === void 0 ? "menuitem" : "menuitemcheckbox",
9350
+ "aria-checked": checked === void 0 ? void 0 : checked,
9337
9351
  disabled,
9338
9352
  className: `${danger ? DANGER_ITEM_CLASS : ITEM_CLASS}${disabled ? DISABLED_CLASS : ""}`,
9339
9353
  onClick: onSelect,
9340
- children
9354
+ children: [
9355
+ checked !== void 0 && /* @__PURE__ */ jsx("span", { className: "mr-1.5 inline-block w-3", "aria-hidden": "true", children: checked ? "\u2713" : "" }),
9356
+ children
9357
+ ]
9341
9358
  }
9342
9359
  );
9343
9360
  }
@@ -9408,6 +9425,94 @@ function ContextMenu(props) {
9408
9425
  )
9409
9426
  ] });
9410
9427
  }
9428
+
9429
+ // src/viewer/components/canvas-context-menu-dispatch.ts
9430
+ function canvasContextMenuContext(props) {
9431
+ return {
9432
+ hasClipboard: props.hasClipboard,
9433
+ showGrid: props.showGrid,
9434
+ showRulers: props.showRulers
9435
+ };
9436
+ }
9437
+ function canvasContextMenuHandlers(props) {
9438
+ const { onClose } = props;
9439
+ const andClose = (run) => () => {
9440
+ run();
9441
+ onClose();
9442
+ };
9443
+ return {
9444
+ paste: andClose(props.onPaste),
9445
+ layout: andClose(props.onOpenLayoutGallery),
9446
+ "reset-slide": andClose(props.onResetSlide),
9447
+ "format-background": andClose(props.onOpenFormatBackground),
9448
+ "grid-and-guides": andClose(props.onToggleGrid),
9449
+ ruler: andClose(props.onToggleRulers)
9450
+ };
9451
+ }
9452
+ function CanvasContextMenu(props) {
9453
+ const { canvasContextMenuState, mode, onClose } = props;
9454
+ const { t } = useTranslation();
9455
+ const open = Boolean(canvasContextMenuState) && mode === "edit";
9456
+ useEffect(() => {
9457
+ if (!open) {
9458
+ return;
9459
+ }
9460
+ const onKeyDown = (event) => {
9461
+ if (event.key === "Escape") {
9462
+ event.preventDefault();
9463
+ onClose();
9464
+ }
9465
+ };
9466
+ document.addEventListener("keydown", onKeyDown);
9467
+ return () => document.removeEventListener("keydown", onKeyDown);
9468
+ }, [open, onClose]);
9469
+ if (!open) {
9470
+ return null;
9471
+ }
9472
+ const handlers = canvasContextMenuHandlers(props);
9473
+ const entries = buildCanvasContextMenuEntries(canvasContextMenuContext(props));
9474
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
9475
+ /* @__PURE__ */ jsx(
9476
+ "div",
9477
+ {
9478
+ className: "fixed inset-0 z-[119]",
9479
+ onClick: onClose,
9480
+ onContextMenu: (e) => {
9481
+ e.preventDefault();
9482
+ onClose();
9483
+ }
9484
+ }
9485
+ ),
9486
+ /* @__PURE__ */ jsx(
9487
+ "div",
9488
+ {
9489
+ "data-pptx-canvas-context-menu": "true",
9490
+ role: "menu",
9491
+ "aria-label": t("pptx.canvasContextMenu.ariaLabel"),
9492
+ className: "fixed z-[120] min-w-[180px] rounded border border-border bg-popover shadow-2xl py-1.5 text-xs text-foreground",
9493
+ style: {
9494
+ left: Math.max(canvasContextMenuState.x, 8),
9495
+ top: Math.max(canvasContextMenuState.y, 8)
9496
+ },
9497
+ children: entries.map((entry) => {
9498
+ const run = handlers[entry.id];
9499
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
9500
+ entry.separatorBefore && /* @__PURE__ */ jsx(ContextMenuSeparator, {}),
9501
+ /* @__PURE__ */ jsx(
9502
+ ContextMenuItem,
9503
+ {
9504
+ disabled: entry.disabled || !run,
9505
+ checked: entry.checked,
9506
+ onSelect: () => run?.(),
9507
+ children: t(entry.labelKey)
9508
+ }
9509
+ )
9510
+ ] }, entry.id);
9511
+ })
9512
+ }
9513
+ )
9514
+ ] });
9515
+ }
9411
9516
  var ic2 = "w-3.5 h-3.5";
9412
9517
  var btnBase = "inline-flex items-center justify-center rounded p-1 transition-colors disabled:opacity-40 disabled:cursor-not-allowed";
9413
9518
  var btnGhost = `${btnBase} hover:bg-accent text-muted-foreground hover:text-foreground`;
@@ -9743,30 +9848,83 @@ function SectionHeader({
9743
9848
  }
9744
9849
  function SlideContextMenu({
9745
9850
  state,
9851
+ slides,
9852
+ onAddSlideAfter,
9853
+ onDuplicateSlides,
9854
+ onDeleteSlides,
9855
+ onHideSlides,
9856
+ onOpenLayoutForSlide,
9746
9857
  onAddSection,
9747
9858
  onClose
9748
9859
  }) {
9749
9860
  const { t } = useTranslation();
9750
- return /* @__PURE__ */ jsx(
9751
- "div",
9752
- {
9753
- className: "fixed z-50 min-w-[180px] rounded-md border border-border bg-popover py-1 shadow-xl",
9754
- style: { left: state.x, top: state.y },
9755
- onClick: (e) => e.stopPropagation(),
9756
- children: /* @__PURE__ */ jsx(
9757
- "button",
9758
- {
9759
- type: "button",
9760
- className: "flex w-full items-center px-3 py-1.5 text-xs text-foreground hover:bg-muted",
9761
- onClick: () => {
9762
- onAddSection?.(t("pptx.sections.defaultName"), state.slideIndex);
9763
- onClose();
9764
- },
9765
- children: t("pptx.sections.addBefore")
9766
- }
9767
- )
9861
+ useEffect(() => {
9862
+ const onKeyDown = (event) => {
9863
+ if (event.key === "Escape") {
9864
+ event.preventDefault();
9865
+ onClose();
9866
+ }
9867
+ };
9868
+ document.addEventListener("keydown", onKeyDown);
9869
+ return () => document.removeEventListener("keydown", onKeyDown);
9870
+ }, [onClose]);
9871
+ const selected = state.selectedIndexes;
9872
+ const selectedSlides = selected.map((i) => slides[i]).filter((s) => Boolean(s));
9873
+ const entries = buildSlidePaneContextMenuEntries({
9874
+ selectedCount: selected.length,
9875
+ hasHiddenInSelection: selectedSlides.some((s) => s.hidden),
9876
+ hasVisibleInSelection: selectedSlides.some((s) => !s.hidden),
9877
+ wouldDeleteAllSlides: selected.length >= slides.length
9878
+ });
9879
+ const run = (id) => {
9880
+ switch (id) {
9881
+ case "new-slide":
9882
+ onAddSlideAfter(state.slideIndex);
9883
+ break;
9884
+ case "duplicate":
9885
+ onDuplicateSlides(selected);
9886
+ break;
9887
+ case "delete":
9888
+ onDeleteSlides(selected);
9889
+ break;
9890
+ case "layout":
9891
+ onOpenLayoutForSlide(state.slideIndex, state.x, state.y);
9892
+ break;
9893
+ case "hide":
9894
+ onHideSlides(selected);
9895
+ break;
9896
+ case "add-section":
9897
+ onAddSection?.(t("pptx.sections.defaultName"), state.slideIndex);
9898
+ break;
9768
9899
  }
9769
- );
9900
+ onClose();
9901
+ };
9902
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
9903
+ /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-[119]", onClick: onClose }),
9904
+ /* @__PURE__ */ jsx(
9905
+ "div",
9906
+ {
9907
+ "data-pptx-context-menu": "true",
9908
+ "data-pptx-slide-pane-context-menu": "true",
9909
+ role: "menu",
9910
+ "aria-label": t("pptx.slidesPane.contextMenu.newSlide"),
9911
+ className: "fixed z-[120] min-w-[190px] rounded border border-border bg-popover shadow-2xl py-1.5 text-xs text-foreground",
9912
+ style: { left: state.x, top: state.y },
9913
+ children: entries.map((entry) => /* @__PURE__ */ jsxs("span", { children: [
9914
+ entry.separatorBefore && /* @__PURE__ */ jsx(ContextMenuSeparator, {}),
9915
+ /* @__PURE__ */ jsx(
9916
+ ContextMenuItem,
9917
+ {
9918
+ danger: entry.id === "delete",
9919
+ disabled: entry.disabled,
9920
+ onSelect: () => run(entry.id),
9921
+ children: entry.countLabelKey ? t(entry.labelKey, { count: selected.length }) : t(entry.labelKey)
9922
+ }
9923
+ )
9924
+ ] }, entry.id))
9925
+ }
9926
+ )
9927
+ ] });
9770
9928
  }
9771
9929
  function LazyThumbnailInner({
9772
9930
  slide,
@@ -9865,6 +10023,7 @@ function SlideItemInner({
9865
10023
  templateElements,
9866
10024
  slideIndex,
9867
10025
  isActive,
10026
+ isSelected = false,
9868
10027
  canvasSize,
9869
10028
  canEdit,
9870
10029
  rehearsalTimings,
@@ -9873,7 +10032,6 @@ function SlideItemInner({
9873
10032
  tableStyleContext,
9874
10033
  onSelectSlide,
9875
10034
  onSlideContextMenu,
9876
- onAddSection,
9877
10035
  onOpenSlideCtxMenu,
9878
10036
  onDragStart,
9879
10037
  onDragOver,
@@ -9885,7 +10043,7 @@ function SlideItemInner({
9885
10043
  const cue = hiddenSlideCue(slide.hidden, "rail", slideIndex);
9886
10044
  const handleContextMenu = useCallback(
9887
10045
  (e) => {
9888
- if (canEdit && onAddSection) {
10046
+ if (canEdit) {
9889
10047
  e.preventDefault();
9890
10048
  e.stopPropagation();
9891
10049
  onOpenSlideCtxMenu(e.clientX, e.clientY, slideIndex);
@@ -9893,7 +10051,7 @@ function SlideItemInner({
9893
10051
  onSlideContextMenu(e, slideIndex);
9894
10052
  }
9895
10053
  },
9896
- [canEdit, onAddSection, onOpenSlideCtxMenu, onSlideContextMenu, slideIndex]
10054
+ [canEdit, onOpenSlideCtxMenu, onSlideContextMenu, slideIndex]
9897
10055
  );
9898
10056
  const safeCanvasWidth = Math.max(canvasSize.width, 1);
9899
10057
  const safeCanvasHeight = Math.max(canvasSize.height, 1);
@@ -9911,10 +10069,11 @@ function SlideItemInner({
9911
10069
  className: cn(
9912
10070
  "group relative flex w-full items-center gap-1 cursor-pointer border-0 bg-transparent py-0.5 px-1 text-left transition-all",
9913
10071
  isActive && "bg-accent/40 before:absolute before:left-0 before:top-1 before:bottom-1 before:w-[3px] before:bg-primary before:rounded-r",
10072
+ isSelected && !isActive && "bg-accent/20 ring-1 ring-inset ring-primary/50",
9914
10073
  isHidden && "opacity-50"
9915
10074
  ),
9916
10075
  draggable: canEdit,
9917
- onClick: () => onSelectSlide(slideIndex),
10076
+ onClick: (e) => onSelectSlide(slideIndex, e),
9918
10077
  onContextMenu: handleContextMenu,
9919
10078
  onDragStart: (e) => onDragStart(e, slideIndex),
9920
10079
  onDragOver,
@@ -9988,6 +10147,24 @@ function useSlidePaneCallbacks(onMoveSlide, onRenameSection, onToggleSectionColl
9988
10147
  null
9989
10148
  );
9990
10149
  const [slideCtxMenu, setSlideCtxMenu] = useState(null);
10150
+ const [selectedSlideIds, setSelectedSlideIds] = useState([]);
10151
+ const [selectionAnchorId, setSelectionAnchorId] = useState(null);
10152
+ const handleSlideClick = useCallback(
10153
+ (event, slideId, orderedIds) => {
10154
+ const result = resolveSlidePaneClick({
10155
+ clickedId: slideId,
10156
+ orderedIds,
10157
+ selectedIds: selectedSlideIds,
10158
+ anchorId: selectionAnchorId,
10159
+ ctrlKey: event.ctrlKey,
10160
+ metaKey: event.metaKey,
10161
+ shiftKey: event.shiftKey
10162
+ });
10163
+ setSelectedSlideIds(result.selectedIds);
10164
+ setSelectionAnchorId(result.anchorId);
10165
+ },
10166
+ [selectedSlideIds, selectionAnchorId]
10167
+ );
9991
10168
  useEffect(() => {
9992
10169
  if (!sectionContextMenu && !slideCtxMenu) {
9993
10170
  return;
@@ -10058,9 +10235,12 @@ function useSlidePaneCallbacks(onMoveSlide, onRenameSection, onToggleSectionColl
10058
10235
  },
10059
10236
  []
10060
10237
  );
10061
- const handleOpenSlideCtxMenu = useCallback((x, y, slideIndex) => {
10062
- setSlideCtxMenu({ x, y, slideIndex });
10063
- }, []);
10238
+ const handleOpenSlideCtxMenu = useCallback(
10239
+ (x, y, slideIndex, selectedIndexes) => {
10240
+ setSlideCtxMenu({ x, y, slideIndex, selectedIndexes });
10241
+ },
10242
+ []
10243
+ );
10064
10244
  const closeSectionContextMenu = useCallback(() => {
10065
10245
  setSectionContextMenu(null);
10066
10246
  }, []);
@@ -10084,7 +10264,9 @@ function useSlidePaneCallbacks(onMoveSlide, onRenameSection, onToggleSectionColl
10084
10264
  handleSectionContextMenu,
10085
10265
  handleOpenSlideCtxMenu,
10086
10266
  closeSectionContextMenu,
10087
- closeSlideCtxMenu
10267
+ closeSlideCtxMenu,
10268
+ selectedSlideIds,
10269
+ handleSlideClick
10088
10270
  };
10089
10271
  }
10090
10272
  var EMPTY_TEMPLATE_ELEMENTS = [];
@@ -10101,6 +10283,11 @@ function SlidesPaneSidebar({
10101
10283
  onSlideContextMenu,
10102
10284
  onMoveSlide,
10103
10285
  onAddSlide,
10286
+ onAddSlideAfter,
10287
+ onDuplicateSlides,
10288
+ onDeleteSlides,
10289
+ onHideSlides,
10290
+ onOpenLayoutForSlide,
10104
10291
  onCollapse: _onCollapse,
10105
10292
  onAddSection,
10106
10293
  onRenameSection,
@@ -10156,8 +10343,46 @@ function SlidesPaneSidebar({
10156
10343
  handleSectionContextMenu,
10157
10344
  handleOpenSlideCtxMenu,
10158
10345
  closeSectionContextMenu,
10159
- closeSlideCtxMenu
10346
+ closeSlideCtxMenu,
10347
+ selectedSlideIds,
10348
+ handleSlideClick
10160
10349
  } = useSlidePaneCallbacks(onMoveSlide, onRenameSection, onToggleSectionCollapse);
10350
+ const orderedIds = useMemo(() => slides.map((s) => s.id), [slides]);
10351
+ const selectSlide = useCallback(
10352
+ (index, e) => {
10353
+ const slide = slides[index];
10354
+ if (slide) {
10355
+ handleSlideClick(
10356
+ { ctrlKey: e.ctrlKey, metaKey: e.metaKey, shiftKey: e.shiftKey },
10357
+ slide.id,
10358
+ orderedIds
10359
+ );
10360
+ }
10361
+ onSelectSlide(index);
10362
+ },
10363
+ [slides, orderedIds, handleSlideClick, onSelectSlide]
10364
+ );
10365
+ const openSlideCtxMenu = useCallback(
10366
+ (x, y, slideIndex) => {
10367
+ const slide = slides[slideIndex];
10368
+ if (!slide) {
10369
+ return;
10370
+ }
10371
+ const idsForMenu = selectedSlideIds.length > 0 && selectedSlideIds.includes(slide.id) ? selectedSlideIds : [slide.id];
10372
+ const selectedIndexes = idsForMenu.map((id) => slides.findIndex((s) => s.id === id)).filter((i) => i !== -1);
10373
+ handleOpenSlideCtxMenu(x, y, slideIndex, selectedIndexes);
10374
+ },
10375
+ [slides, selectedSlideIds, handleOpenSlideCtxMenu]
10376
+ );
10377
+ const onPaneKeyDown = useCallback(
10378
+ (e) => {
10379
+ if (e.key === "Enter" && canEdit) {
10380
+ e.preventDefault();
10381
+ onAddSlideAfter(activeSlideIndex);
10382
+ }
10383
+ },
10384
+ [canEdit, onAddSlideAfter, activeSlideIndex]
10385
+ );
10161
10386
  const effectiveCollapsed = useMemo(() => {
10162
10387
  const map = {};
10163
10388
  for (const group of sectionGroups) {
@@ -10260,16 +10485,16 @@ function SlidesPaneSidebar({
10260
10485
  templateElements: templateElementsBySlideId[slide.id] ?? EMPTY_TEMPLATE_ELEMENTS,
10261
10486
  slideIndex: item.slideIndex,
10262
10487
  isActive: item.slideIndex === activeSlideIndex,
10488
+ isSelected: selectedSlideIds.includes(slide.id),
10263
10489
  canvasSize,
10264
10490
  canEdit,
10265
10491
  rehearsalTimings,
10266
10492
  presenceUsers: slidePresenceMap?.get(item.slideIndex),
10267
10493
  fieldContext,
10268
10494
  tableStyleContext,
10269
- onSelectSlide,
10495
+ onSelectSlide: selectSlide,
10270
10496
  onSlideContextMenu,
10271
- onAddSection,
10272
- onOpenSlideCtxMenu: handleOpenSlideCtxMenu,
10497
+ onOpenSlideCtxMenu: openSlideCtxMenu,
10273
10498
  onDragStart: handleDragStart,
10274
10499
  onDragOver: handleDragOver,
10275
10500
  onDrop: handleDrop,
@@ -10317,16 +10542,16 @@ function SlidesPaneSidebar({
10317
10542
  templateElements: templateElementsBySlideId[slide.id] ?? EMPTY_TEMPLATE_ELEMENTS,
10318
10543
  slideIndex: idx,
10319
10544
  isActive: idx === activeSlideIndex,
10545
+ isSelected: selectedSlideIds.includes(slide.id),
10320
10546
  canvasSize,
10321
10547
  canEdit,
10322
10548
  rehearsalTimings,
10323
10549
  presenceUsers: slidePresenceMap?.get(idx),
10324
10550
  fieldContext,
10325
10551
  tableStyleContext,
10326
- onSelectSlide,
10552
+ onSelectSlide: selectSlide,
10327
10553
  onSlideContextMenu,
10328
- onAddSection,
10329
- onOpenSlideCtxMenu: handleOpenSlideCtxMenu,
10554
+ onOpenSlideCtxMenu: openSlideCtxMenu,
10330
10555
  onDragStart: handleDragStart,
10331
10556
  onDragOver: handleDragOver,
10332
10557
  onDrop: handleDrop,
@@ -10337,52 +10562,62 @@ function SlidesPaneSidebar({
10337
10562
  })
10338
10563
  ] }, section.id);
10339
10564
  }) });
10340
- return /* @__PURE__ */ jsxs(
10341
- "aside",
10342
- {
10343
- role: "navigation",
10344
- "aria-label": t("pptx.sections.slides"),
10345
- className: "flex h-full flex-col border-r border-border bg-secondary/30",
10346
- style: panelWidth ? { width: panelWidth, flexShrink: 0 } : void 0,
10347
- children: [
10348
- shouldVirtualize ? renderVirtualized() : renderNonVirtualized(),
10349
- canEdit && /* @__PURE__ */ jsx("div", { className: "border-t border-border/60 px-2 py-1.5", children: /* @__PURE__ */ jsxs(
10350
- "button",
10351
- {
10352
- type: "button",
10353
- className: "flex w-full items-center justify-center gap-1 rounded-sm px-2 py-1 text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground transition-colors disabled:cursor-not-allowed disabled:opacity-40",
10354
- disabled: !canEdit,
10355
- onClick: onAddSlide,
10356
- children: [
10357
- /* @__PURE__ */ jsx(LuPlus, { className: "h-3 w-3" }),
10358
- t("pptx.sections.addSlide")
10359
- ]
10360
- }
10361
- ) }),
10362
- sectionContextMenu && /* @__PURE__ */ jsx(
10363
- SectionContextMenu,
10364
- {
10365
- state: sectionContextMenu,
10366
- sectionGroups,
10367
- totalSlides: slides.length,
10368
- onStartRename: startRename,
10369
- onDeleteSection,
10370
- onMoveSectionUp,
10371
- onMoveSectionDown,
10372
- onAddSection,
10373
- onClose: closeSectionContextMenu
10374
- }
10375
- ),
10376
- slideCtxMenu && /* @__PURE__ */ jsx(
10377
- SlideContextMenu,
10378
- {
10379
- state: slideCtxMenu,
10380
- onAddSection,
10381
- onClose: closeSlideCtxMenu
10382
- }
10383
- )
10384
- ]
10385
- }
10565
+ return (
10566
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- Enter here only catches the keydown bubbled up from a focused (interactive) thumbnail button; the aside itself has no interactive semantics of its own
10567
+ /* @__PURE__ */ jsxs(
10568
+ "aside",
10569
+ {
10570
+ role: "navigation",
10571
+ "aria-label": t("pptx.sections.slides"),
10572
+ className: "flex h-full flex-col border-r border-border bg-secondary/30",
10573
+ style: panelWidth ? { width: panelWidth, flexShrink: 0 } : void 0,
10574
+ onKeyDown: onPaneKeyDown,
10575
+ children: [
10576
+ shouldVirtualize ? renderVirtualized() : renderNonVirtualized(),
10577
+ canEdit && /* @__PURE__ */ jsx("div", { className: "border-t border-border/60 px-2 py-1.5", children: /* @__PURE__ */ jsxs(
10578
+ "button",
10579
+ {
10580
+ type: "button",
10581
+ className: "flex w-full items-center justify-center gap-1 rounded-sm px-2 py-1 text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground transition-colors disabled:cursor-not-allowed disabled:opacity-40",
10582
+ disabled: !canEdit,
10583
+ onClick: onAddSlide,
10584
+ children: [
10585
+ /* @__PURE__ */ jsx(LuPlus, { className: "h-3 w-3" }),
10586
+ t("pptx.sections.addSlide")
10587
+ ]
10588
+ }
10589
+ ) }),
10590
+ sectionContextMenu && /* @__PURE__ */ jsx(
10591
+ SectionContextMenu,
10592
+ {
10593
+ state: sectionContextMenu,
10594
+ sectionGroups,
10595
+ totalSlides: slides.length,
10596
+ onStartRename: startRename,
10597
+ onDeleteSection,
10598
+ onMoveSectionUp,
10599
+ onMoveSectionDown,
10600
+ onAddSection,
10601
+ onClose: closeSectionContextMenu
10602
+ }
10603
+ ),
10604
+ slideCtxMenu && /* @__PURE__ */ jsx(
10605
+ SlideContextMenu,
10606
+ {
10607
+ state: slideCtxMenu,
10608
+ slides,
10609
+ onAddSlideAfter,
10610
+ onDuplicateSlides,
10611
+ onDeleteSlides,
10612
+ onHideSlides,
10613
+ onOpenLayoutForSlide,
10614
+ onAddSection,
10615
+ onClose: closeSlideCtxMenu
10616
+ }
10617
+ )
10618
+ ]
10619
+ }
10620
+ )
10386
10621
  );
10387
10622
  }
10388
10623
  var HANDOUT_SLIDES_PER_PAGE_OPTIONS = [1, 2, 3, 4, 6, 9];
@@ -33100,7 +33335,7 @@ function useTableStyleMapHandlers(input) {
33100
33335
  var AiChatPanel = lazy(async () => {
33101
33336
  const [{ useChat }, { default: Panel }] = await Promise.all([
33102
33337
  import('@ai-sdk/react'),
33103
- import('./AiChatPanel-QJHUDIWT.mjs')
33338
+ import('./AiChatPanel-HXGCZPUX.mjs')
33104
33339
  ]);
33105
33340
  function BoundAiChatPanel(props) {
33106
33341
  return /* @__PURE__ */ jsx(Panel, { ...props, useChat });
@@ -34201,7 +34436,9 @@ function ViewerMainContent(props) {
34201
34436
  hiddenActions,
34202
34437
  aiConfig,
34203
34438
  aiBridge,
34204
- aiPanel
34439
+ aiPanel,
34440
+ onApplyLayout,
34441
+ loadLayoutPreviews
34205
34442
  } = props;
34206
34443
  const {
34207
34444
  ops,
@@ -34228,6 +34465,11 @@ function ViewerMainContent(props) {
34228
34465
  () => state.theme || state.tableStyleMap ? { theme: state.theme, tableStyleMap: state.tableStyleMap } : void 0,
34229
34466
  [state.theme, state.tableStyleMap]
34230
34467
  );
34468
+ const [layoutGalleryAnchor, setLayoutGalleryAnchor] = useState(
34469
+ null
34470
+ );
34471
+ const layoutGalleryAnchorRef = useRef(null);
34472
+ const layoutGalleryPreviews = useLayoutPreviews(loadLayoutPreviews, layoutGalleryAnchor !== null);
34231
34473
  return /* @__PURE__ */ jsx(ChartPartSelectionProvider, { children: /* @__PURE__ */ jsxs("div", { className: "relative z-10 flex flex-1 min-h-0", children: [
34232
34474
  showSlidesPane && /* @__PURE__ */ jsxs(Fragment, { children: [
34233
34475
  /* @__PURE__ */ jsx(
@@ -34244,6 +34486,14 @@ function ViewerMainContent(props) {
34244
34486
  onSlideContextMenu: slideOps.handleSlideContextMenu,
34245
34487
  onMoveSlide: slideOps.handleMoveSlide,
34246
34488
  onAddSlide: slideOps.handleAddSlide,
34489
+ onAddSlideAfter: slideOps.handleAddSlideAfter,
34490
+ onDuplicateSlides: slideOps.handleDuplicateSlides,
34491
+ onDeleteSlides: slideOps.handleDeleteSlides,
34492
+ onHideSlides: slideOps.handleToggleHideSlides,
34493
+ onOpenLayoutForSlide: (index, x, y) => {
34494
+ state.setActiveSlideIndex(index);
34495
+ setLayoutGalleryAnchor({ x, y });
34496
+ },
34247
34497
  onCollapse: () => state.setIsSlidesPaneOpen(false),
34248
34498
  onAddSection: sectionOps.addSection,
34249
34499
  onRenameSection: sectionOps.renameSection,
@@ -34381,6 +34631,67 @@ function ViewerMainContent(props) {
34381
34631
  onClose: () => state.setContextMenuState(null)
34382
34632
  }
34383
34633
  ),
34634
+ state.canvasContextMenuState && /* @__PURE__ */ jsx(
34635
+ CanvasContextMenu,
34636
+ {
34637
+ canvasContextMenuState: state.canvasContextMenuState,
34638
+ mode,
34639
+ hasClipboard: Boolean(state.clipboardPayload),
34640
+ showGrid: state.showGrid,
34641
+ showRulers: state.showRulers,
34642
+ onPaste: () => manipulation.handlePaste(),
34643
+ onOpenLayoutGallery: () => {
34644
+ const pos = state.canvasContextMenuState;
34645
+ if (pos) {
34646
+ setLayoutGalleryAnchor(pos);
34647
+ }
34648
+ },
34649
+ onResetSlide: () => {
34650
+ const path = resetSlideLayoutPath(activeSlide);
34651
+ if (path) {
34652
+ onApplyLayout?.(path);
34653
+ }
34654
+ },
34655
+ onOpenFormatBackground: () => {
34656
+ state.setSelectedElementId(null);
34657
+ state.setSelectedElementIds([]);
34658
+ state.setSidebarPanelMode("properties");
34659
+ state.setIsInspectorPaneOpen(true);
34660
+ },
34661
+ onToggleGrid: () => state.setShowGrid((v) => !v),
34662
+ onToggleRulers: () => state.setShowRulers((v) => !v),
34663
+ onClose: () => state.setCanvasContextMenuState(null)
34664
+ }
34665
+ ),
34666
+ layoutGalleryAnchor && /* @__PURE__ */ jsxs(Fragment, { children: [
34667
+ /* @__PURE__ */ jsx(
34668
+ "div",
34669
+ {
34670
+ ref: layoutGalleryAnchorRef,
34671
+ style: {
34672
+ position: "fixed",
34673
+ left: layoutGalleryAnchor.x,
34674
+ top: layoutGalleryAnchor.y,
34675
+ width: 0,
34676
+ height: 0
34677
+ }
34678
+ }
34679
+ ),
34680
+ /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-[119]", onClick: () => setLayoutGalleryAnchor(null) }),
34681
+ /* @__PURE__ */ jsx(
34682
+ LayoutGalleryMenu,
34683
+ {
34684
+ anchorRef: layoutGalleryAnchorRef,
34685
+ layoutOptions: state.layoutOptions,
34686
+ previews: layoutGalleryPreviews,
34687
+ currentLayoutPath: activeSlide?.layoutPath,
34688
+ onSelect: (layout) => {
34689
+ onApplyLayout?.(layout.path);
34690
+ setLayoutGalleryAnchor(null);
34691
+ }
34692
+ }
34693
+ )
34694
+ ] }),
34384
34695
  /* @__PURE__ */ jsx(
34385
34696
  ViewerSidePanels,
34386
34697
  {
@@ -34868,6 +35179,14 @@ function MobileChromeOverlay(props) {
34868
35179
  onSlideContextMenu: editorOps.slideOps.handleSlideContextMenu,
34869
35180
  onMoveSlide: editorOps.slideOps.handleMoveSlide,
34870
35181
  onAddSlide: editorOps.slideOps.handleAddSlide,
35182
+ onAddSlideAfter: editorOps.slideOps.handleAddSlideAfter,
35183
+ onDuplicateSlides: editorOps.slideOps.handleDuplicateSlides,
35184
+ onDeleteSlides: editorOps.slideOps.handleDeleteSlides,
35185
+ onHideSlides: editorOps.slideOps.handleToggleHideSlides,
35186
+ onOpenLayoutForSlide: (index) => {
35187
+ s.setActiveSlideIndex(index);
35188
+ s.setIsSlidesPaneOpen(false);
35189
+ },
34871
35190
  onCollapse: () => s.setIsSlidesPaneOpen(false),
34872
35191
  onAddSection: editorOps.sectionOps.addSection,
34873
35192
  onRenameSection: editorOps.sectionOps.renameSection,
@@ -37181,6 +37500,8 @@ var PowerPointViewer = forwardRef(
37181
37500
  canEdit,
37182
37501
  slides,
37183
37502
  activeSlide,
37503
+ onApplyLayout: (path) => void layoutSwitching.applyLayout(path),
37504
+ loadLayoutPreviews: layoutSwitching.loadLayoutPreviews,
37184
37505
  presentationOverlay: (
37185
37506
  // `ppaction://program` ("Run program") notices. Rendered INSIDE
37186
37507
  // the show stage, not beside the viewer: the fullscreen element