pptx-react-viewer 2.12.0 → 2.12.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 (116) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/{AiChatPanel-CS4CONUO.mjs → AiChatPanel-CGGUPVQX.mjs} +4 -4
  3. package/dist/AiChatPanel-CGGUPVQX.mjs.br +0 -0
  4. package/dist/AiChatPanel-CGGUPVQX.mjs.gz +0 -0
  5. package/dist/{AiChatPanel-JIXSOZXN.js → AiChatPanel-UEFYTUJN.js} +23 -23
  6. package/dist/AiChatPanel-UEFYTUJN.js.br +0 -0
  7. package/dist/AiChatPanel-UEFYTUJN.js.gz +0 -0
  8. package/dist/{Model3DScene-5KMJ4JL6.js → Model3DScene-QYXJNALP.js} +2 -2
  9. package/dist/{Model3DScene-5KMJ4JL6.js.br → Model3DScene-QYXJNALP.js.br} +0 -0
  10. package/dist/Model3DScene-QYXJNALP.js.gz +0 -0
  11. package/dist/{Model3DScene-RWFPSN6B.mjs → Model3DScene-TU4NTHRM.mjs} +1 -1
  12. package/dist/Model3DScene-TU4NTHRM.mjs.br +0 -0
  13. package/dist/Model3DScene-TU4NTHRM.mjs.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-BIOKIETC.js → SurfaceChart3DScene-4VCO3DRP.js} +2 -2
  15. package/dist/SurfaceChart3DScene-4VCO3DRP.js.br +0 -0
  16. package/dist/SurfaceChart3DScene-4VCO3DRP.js.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-2GZQM3LN.mjs → SurfaceChart3DScene-VTJBKUQY.mjs} +1 -1
  18. package/dist/{SurfaceChart3DScene-2GZQM3LN.mjs.br → SurfaceChart3DScene-VTJBKUQY.mjs.br} +0 -0
  19. package/dist/SurfaceChart3DScene-VTJBKUQY.mjs.gz +0 -0
  20. package/dist/{chunk-AOED5MFM.mjs → chunk-4GYNTY2G.mjs} +13 -12
  21. package/dist/chunk-4GYNTY2G.mjs.br +0 -0
  22. package/dist/chunk-4GYNTY2G.mjs.gz +0 -0
  23. package/dist/{chunk-BJQSHVYH.mjs → chunk-4SGXEGVL.mjs} +261 -203
  24. package/dist/chunk-4SGXEGVL.mjs.br +0 -0
  25. package/dist/chunk-4SGXEGVL.mjs.gz +0 -0
  26. package/dist/{chunk-3GNSGGY2.js → chunk-BXAK3JFM.js} +13 -0
  27. package/dist/chunk-BXAK3JFM.js.br +0 -0
  28. package/dist/chunk-BXAK3JFM.js.gz +0 -0
  29. package/dist/{chunk-QGHC65C4.mjs → chunk-CABQXGPI.mjs} +302 -18
  30. package/dist/chunk-CABQXGPI.mjs.br +0 -0
  31. package/dist/{chunk-QGHC65C4.mjs.gz → chunk-CABQXGPI.mjs.gz} +0 -0
  32. package/dist/{chunk-SP7U34QM.js → chunk-GBKIWNW6.js} +1996 -1938
  33. package/dist/chunk-GBKIWNW6.js.br +0 -0
  34. package/dist/chunk-GBKIWNW6.js.gz +0 -0
  35. package/dist/{chunk-2VUHJNWM.js → chunk-LE6YA5WB.js} +261 -254
  36. package/dist/chunk-LE6YA5WB.js.br +0 -0
  37. package/dist/chunk-LE6YA5WB.js.gz +0 -0
  38. package/dist/{chunk-EJRHYYKE.mjs → chunk-N3NKU7SC.mjs} +1 -1
  39. package/dist/chunk-N3NKU7SC.mjs.br +0 -0
  40. package/dist/chunk-N3NKU7SC.mjs.gz +0 -0
  41. package/dist/{chunk-PTGTFXPU.js → chunk-NUDH7TI2.js} +341 -340
  42. package/dist/chunk-NUDH7TI2.js.br +0 -0
  43. package/dist/chunk-NUDH7TI2.js.gz +0 -0
  44. package/dist/{chunk-PJUQQF3I.js → chunk-TDUDH7S4.js} +320 -19
  45. package/dist/chunk-TDUDH7S4.js.br +0 -0
  46. package/dist/{chunk-PJUQQF3I.js.gz → chunk-TDUDH7S4.js.gz} +0 -0
  47. package/dist/{chunk-ECDKYPQ2.mjs → chunk-TEXIGSA6.mjs} +13 -0
  48. package/dist/chunk-TEXIGSA6.mjs.br +0 -0
  49. package/dist/chunk-TEXIGSA6.mjs.gz +0 -0
  50. package/dist/{chunk-ZIXSSQAZ.js → chunk-UIWY4XJT.js} +3 -3
  51. package/dist/chunk-UIWY4XJT.js.br +0 -0
  52. package/dist/chunk-UIWY4XJT.js.gz +0 -0
  53. package/dist/{chunk-CEUHGUZ4.mjs → chunk-YIPR3GKG.mjs} +22 -15
  54. package/dist/chunk-YIPR3GKG.mjs.br +0 -0
  55. package/dist/chunk-YIPR3GKG.mjs.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.js +36 -36
  63. package/dist/index.js.br +0 -0
  64. package/dist/index.js.gz +0 -0
  65. package/dist/index.mjs +6 -6
  66. package/dist/index.mjs.br +0 -0
  67. package/dist/index.mjs.gz +0 -0
  68. package/dist/internals.d.ts.map +1 -1
  69. package/dist/internals.js +79 -79
  70. package/dist/internals.js.br +0 -0
  71. package/dist/internals.js.gz +0 -0
  72. package/dist/internals.mjs +4 -4
  73. package/dist/internals.mjs.br +0 -0
  74. package/dist/internals.mjs.gz +0 -0
  75. package/dist/pptx-viewer.css +1 -1
  76. package/dist/pptx-viewer.css.br +0 -0
  77. package/dist/pptx-viewer.css.gz +0 -0
  78. package/dist/viewer/index.js +22 -22
  79. package/dist/viewer/index.js.br +0 -0
  80. package/dist/viewer/index.js.gz +0 -0
  81. package/dist/viewer/index.mjs +6 -6
  82. package/dist/viewer/index.mjs.br +0 -0
  83. package/dist/viewer/index.mjs.gz +0 -0
  84. package/package.json +1 -1
  85. package/dist/AiChatPanel-CS4CONUO.mjs.br +0 -0
  86. package/dist/AiChatPanel-CS4CONUO.mjs.gz +0 -0
  87. package/dist/AiChatPanel-JIXSOZXN.js.br +0 -0
  88. package/dist/AiChatPanel-JIXSOZXN.js.gz +0 -0
  89. package/dist/Model3DScene-5KMJ4JL6.js.gz +0 -0
  90. package/dist/Model3DScene-RWFPSN6B.mjs.br +0 -0
  91. package/dist/Model3DScene-RWFPSN6B.mjs.gz +0 -0
  92. package/dist/SurfaceChart3DScene-2GZQM3LN.mjs.gz +0 -0
  93. package/dist/SurfaceChart3DScene-BIOKIETC.js.br +0 -0
  94. package/dist/SurfaceChart3DScene-BIOKIETC.js.gz +0 -0
  95. package/dist/chunk-2VUHJNWM.js.br +0 -0
  96. package/dist/chunk-2VUHJNWM.js.gz +0 -0
  97. package/dist/chunk-3GNSGGY2.js.br +0 -0
  98. package/dist/chunk-3GNSGGY2.js.gz +0 -0
  99. package/dist/chunk-AOED5MFM.mjs.br +0 -0
  100. package/dist/chunk-AOED5MFM.mjs.gz +0 -0
  101. package/dist/chunk-BJQSHVYH.mjs.br +0 -0
  102. package/dist/chunk-BJQSHVYH.mjs.gz +0 -0
  103. package/dist/chunk-CEUHGUZ4.mjs.br +0 -0
  104. package/dist/chunk-CEUHGUZ4.mjs.gz +0 -0
  105. package/dist/chunk-ECDKYPQ2.mjs.br +0 -0
  106. package/dist/chunk-ECDKYPQ2.mjs.gz +0 -0
  107. package/dist/chunk-EJRHYYKE.mjs.br +0 -0
  108. package/dist/chunk-EJRHYYKE.mjs.gz +0 -0
  109. package/dist/chunk-PJUQQF3I.js.br +0 -0
  110. package/dist/chunk-PTGTFXPU.js.br +0 -0
  111. package/dist/chunk-PTGTFXPU.js.gz +0 -0
  112. package/dist/chunk-QGHC65C4.mjs.br +0 -0
  113. package/dist/chunk-SP7U34QM.js.br +0 -0
  114. package/dist/chunk-SP7U34QM.js.gz +0 -0
  115. package/dist/chunk-ZIXSSQAZ.js.br +0 -0
  116. package/dist/chunk-ZIXSSQAZ.js.gz +0 -0
@@ -1,12 +1,12 @@
1
- import { computeFocusTargets, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, toRenderableParts } from './chunk-EJRHYYKE.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-AOED5MFM.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-CEUHGUZ4.mjs';
4
- import { LOCALE_CATALOG, translationsEn } from './chunk-ECDKYPQ2.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, hiddenSlideCue, HIDDEN_SLIDE_SLASH_GRADIENT, HIDDEN_SLIDE_LABEL_KEY, 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, PRESENT_TOOLBAR_CLASSES, 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, PEN_COLORS, HIGHLIGHTER_COLORS, 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, animationEffectLabel, 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-QGHC65C4.mjs';
6
- import React34, { 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-N3NKU7SC.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-4GYNTY2G.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-YIPR3GKG.mjs';
4
+ import { LOCALE_CATALOG, translationsEn } from './chunk-TEXIGSA6.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, LINK_TOOLTIP_HOST_CLASS, 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, ensureActionAffordanceStyles, resolveElementActionAffordance, actionAffordanceLabels, getComputedEffectStyle, getSoftEdgeSvgFilter, buildStrokeOutline, svgGradientFillRef, mediaTransportVisible, isInkElement, getElementLabel, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, hiddenSlideCue, HIDDEN_SLIDE_SLASH_GRADIENT, HIDDEN_SLIDE_LABEL_KEY, 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, ACTION_INDICATOR_CLASS, ACTION_INDICATOR_ICON_PATH, LINK_TOOLTIP_CLASS, LINK_TOOLTIP_PANEL_CLASS, LINK_TOOLTIP_LABEL_CLASS, LINK_TOOLTIP_HINT_CLASS, getSlideBackgroundStyle, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, PRESENT_TOOLBAR_CLASSES, 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, presenterPrevDisabled, presenterNextDisabled, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, presenterTimerProgress, PRESENTER_CONSOLE_CLASSES, 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, PRESENTER_NAVIGATOR_LABEL_KEYS, PEN_COLORS, HIGHLIGHTER_COLORS, 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, PRESENTER_CONSOLE_CONTROLS, 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, animationEffectLabel, 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-CABQXGPI.mjs';
6
+ import React35, { 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
- 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';
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, LuScan, LuMonitorOff, LuCirclePlay, LuCirclePause, LuArrowLeftRight, 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';
10
10
 
11
11
  var ViewerThemeContext = createContext(void 0);
12
12
  function ViewerThemeProvider({ theme, children }) {
@@ -1246,11 +1246,11 @@ var TRANSITION_PRESETS = [
1246
1246
  ];
1247
1247
  function TransitionsSection(p) {
1248
1248
  const { t } = useTranslation();
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");
1249
+ const [selected, setSelected] = React35.useState("none");
1250
+ const [duration, setDuration] = React35.useState("00.50");
1251
+ const [advanceOnClick, setAdvanceOnClick] = React35.useState(true);
1252
+ const [advanceAfter, setAdvanceAfter] = React35.useState(false);
1253
+ const [advanceAfterSeconds, setAdvanceAfterSeconds] = React35.useState("00:00.00");
1254
1254
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1255
1255
  /* @__PURE__ */ jsxs("button", { type: "button", className: pill, title: t("pptx.ribbon.previewTransition"), children: [
1256
1256
  /* @__PURE__ */ jsx(LuPlay, { className: ics }),
@@ -1452,7 +1452,7 @@ function AccountPage() {
1452
1452
  return void 0;
1453
1453
  });
1454
1454
  };
1455
- const version = "2.11.1" ;
1455
+ const version = "2.12.0" ;
1456
1456
  return /* @__PURE__ */ jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
1457
1457
  /* @__PURE__ */ jsxs("section", { className: cardClass, children: [
1458
1458
  /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -6175,7 +6175,7 @@ function HorizontalRulerView({ ticks, widthPx, highlight }) {
6175
6175
  }
6176
6176
  );
6177
6177
  }
6178
- var HorizontalRuler = React34.memo(HorizontalRulerView);
6178
+ var HorizontalRuler = React35.memo(HorizontalRulerView);
6179
6179
  HorizontalRuler.displayName = "HorizontalRuler";
6180
6180
  function VerticalRulerView({ ticks, heightPx, highlight }) {
6181
6181
  return /* @__PURE__ */ jsxs(
@@ -6247,7 +6247,7 @@ function VerticalRulerView({ ticks, heightPx, highlight }) {
6247
6247
  }
6248
6248
  );
6249
6249
  }
6250
- var VerticalRuler = React34.memo(VerticalRulerView);
6250
+ var VerticalRuler = React35.memo(VerticalRulerView);
6251
6251
  VerticalRuler.displayName = "VerticalRuler";
6252
6252
  function Ruler({
6253
6253
  canvasSize,
@@ -6951,6 +6951,39 @@ function useStableCallbacks(callbacks) {
6951
6951
  stableResizeTableRow
6952
6952
  };
6953
6953
  }
6954
+ function useActionAffordance(element, canInteract) {
6955
+ const { t } = useTranslation();
6956
+ ensureActionAffordanceStyles();
6957
+ return useMemo(
6958
+ () => resolveElementActionAffordance(element, {
6959
+ canInteract,
6960
+ // Wrapped rather than passed by reference: i18next's `TFunction` is
6961
+ // heavily overloaded and does not assign to a plain key -> string.
6962
+ labels: actionAffordanceLabels((key) => t(key))
6963
+ }),
6964
+ [element, canInteract, t]
6965
+ );
6966
+ }
6967
+ function ActionIndicator({ title }) {
6968
+ return /* @__PURE__ */ jsx("div", { className: ACTION_INDICATOR_CLASS, title, children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: ACTION_INDICATOR_ICON_PATH }) }) });
6969
+ }
6970
+ function LinkTooltip({ label, hint }) {
6971
+ return /* @__PURE__ */ jsx("div", { className: LINK_TOOLTIP_CLASS, children: /* @__PURE__ */ jsxs("div", { className: LINK_TOOLTIP_PANEL_CLASS, children: [
6972
+ /* @__PURE__ */ jsx("div", { className: LINK_TOOLTIP_LABEL_CLASS, children: label }),
6973
+ /* @__PURE__ */ jsx("div", { className: LINK_TOOLTIP_HINT_CLASS, children: hint })
6974
+ ] }) });
6975
+ }
6976
+ function ActionAffordances({
6977
+ affordance
6978
+ }) {
6979
+ if (!affordance.showIndicator && !affordance.showLinkTooltip) {
6980
+ return null;
6981
+ }
6982
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
6983
+ affordance.showIndicator && /* @__PURE__ */ jsx(ActionIndicator, { title: affordance.indicatorTitle }),
6984
+ affordance.showLinkTooltip && /* @__PURE__ */ jsx(LinkTooltip, { label: affordance.linkTooltipLabel, hint: affordance.linkTooltipHint })
6985
+ ] });
6986
+ }
6954
6987
  function ConnectorTextOverlay({
6955
6988
  connectorText,
6956
6989
  connectorTextSegments,
@@ -7199,7 +7232,7 @@ function ResizeHandles({
7199
7232
  ) : null
7200
7233
  ] });
7201
7234
  }
7202
- var ConnectorElementRenderer = React34.memo(
7235
+ var ConnectorElementRenderer = React35.memo(
7203
7236
  ({
7204
7237
  el,
7205
7238
  isSelected,
@@ -7495,6 +7528,8 @@ function getElementInteractionProps({
7495
7528
  title: canInteract && element.actionClick ? void 0 : element.actionClick?.tooltip || element.actionHover?.tooltip || void 0
7496
7529
  };
7497
7530
  }
7531
+
7532
+ // src/viewer/components/elements/element-renderer-helpers.tsx
7498
7533
  function renderDagDuotoneFilterForElement(el) {
7499
7534
  if (!hasDagDuotoneEffect(el)) {
7500
7535
  return null;
@@ -7545,19 +7580,6 @@ function getContainerStyle({
7545
7580
  ...templateEditing ? { outline: "2px dashed rgb(217, 119, 6)", outlineOffset: "1px", opacity: opacity ?? 0.95 } : {}
7546
7581
  };
7547
7582
  }
7548
- function ActionIndicator({
7549
- clickTooltip,
7550
- hoverTooltip
7551
- }) {
7552
- return /* @__PURE__ */ jsx(
7553
- "div",
7554
- {
7555
- className: "absolute -top-1 -right-1 z-20 w-4 h-4 rounded-full bg-amber-500 flex items-center justify-center shadow",
7556
- title: clickTooltip || hoverTooltip || "Has action",
7557
- children: /* @__PURE__ */ jsx("svg", { className: "w-2.5 h-2.5 text-white", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M13 2L3 14h9l-1 8 10-12h-9l1-8z" }) })
7558
- }
7559
- );
7560
- }
7561
7583
 
7562
7584
  // src/viewer/components/elements/element-shape-params.ts
7563
7585
  function shapeParams(element) {
@@ -8705,10 +8727,10 @@ function InlineTextEditor({
8705
8727
  function FailedToLoad() {
8706
8728
  return null;
8707
8729
  }
8708
- var LazyModel3DScene = React34.lazy(
8730
+ var LazyModel3DScene = React35.lazy(
8709
8731
  async () => {
8710
8732
  try {
8711
- return await import('./Model3DScene-RWFPSN6B.mjs');
8733
+ return await import('./Model3DScene-TU4NTHRM.mjs');
8712
8734
  } catch {
8713
8735
  return { default: FailedToLoad };
8714
8736
  }
@@ -8791,7 +8813,7 @@ function PosterFallback({
8791
8813
  }
8792
8814
  );
8793
8815
  }
8794
- var Model3DErrorBoundary = class extends React34.Component {
8816
+ var Model3DErrorBoundary = class extends React35.Component {
8795
8817
  constructor(props) {
8796
8818
  super(props);
8797
8819
  this.state = { hasError: false };
@@ -8982,10 +9004,10 @@ function SmartArtInlineNodeEditor({
8982
9004
  onCancel
8983
9005
  }) {
8984
9006
  const { t } = useTranslation();
8985
- const ref = React34.useRef(null);
8986
- const [value, setValue] = React34.useState(initialText);
8987
- const settled = React34.useRef(false);
8988
- React34.useEffect(() => {
9007
+ const ref = React35.useRef(null);
9008
+ const [value, setValue] = React35.useState(initialText);
9009
+ const settled = React35.useRef(false);
9010
+ React35.useEffect(() => {
8989
9011
  const el = ref.current;
8990
9012
  if (el) {
8991
9013
  el.focus();
@@ -9077,16 +9099,16 @@ function findNodeIdFromEvent(target) {
9077
9099
  return null;
9078
9100
  }
9079
9101
  function useSmartArtHoverState(containerRef) {
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(() => {
9102
+ const [hoveredNodeId, setHoveredNodeId] = React35.useState(null);
9103
+ const [hoveredNodeRect, setHoveredNodeRect] = React35.useState(null);
9104
+ const hideTimeoutRef = React35.useRef(null);
9105
+ const cancelPendingHide = React35.useCallback(() => {
9084
9106
  if (hideTimeoutRef.current !== null) {
9085
9107
  window.clearTimeout(hideTimeoutRef.current);
9086
9108
  hideTimeoutRef.current = null;
9087
9109
  }
9088
9110
  }, []);
9089
- const handleMouseMove = React34.useCallback(
9111
+ const handleMouseMove = React35.useCallback(
9090
9112
  (e, ignoreRef) => {
9091
9113
  const nodeEl = findNodeIdFromEvent(e.target);
9092
9114
  const container = containerRef.current;
@@ -9114,12 +9136,12 @@ function useSmartArtHoverState(containerRef) {
9114
9136
  },
9115
9137
  [containerRef, cancelPendingHide]
9116
9138
  );
9117
- const clearHover = React34.useCallback(() => {
9139
+ const clearHover = React35.useCallback(() => {
9118
9140
  cancelPendingHide();
9119
9141
  setHoveredNodeId(null);
9120
9142
  setHoveredNodeRect(null);
9121
9143
  }, [cancelPendingHide]);
9122
- React34.useEffect(() => cancelPendingHide, [cancelPendingHide]);
9144
+ React35.useEffect(() => cancelPendingHide, [cancelPendingHide]);
9123
9145
  return { hoveredNodeId, hoveredNodeRect, handleMouseMove, clearHover };
9124
9146
  }
9125
9147
  var EDITOR_PADDING = 4;
@@ -9134,11 +9156,11 @@ function SmartArtEditableLayer({
9134
9156
  onChangeNodeStyle,
9135
9157
  children
9136
9158
  }) {
9137
- const containerRef = React34.useRef(null);
9138
- const styleBarRef = React34.useRef(null);
9139
- const [edit, setEdit] = React34.useState(null);
9159
+ const containerRef = React35.useRef(null);
9160
+ const styleBarRef = React35.useRef(null);
9161
+ const [edit, setEdit] = React35.useState(null);
9140
9162
  const { hoveredNodeId, hoveredNodeRect, handleMouseMove, clearHover } = useSmartArtHoverState(containerRef);
9141
- const openEditor = React34.useCallback(
9163
+ const openEditor = React35.useCallback(
9142
9164
  (target) => {
9143
9165
  const nodeEl = findNodeIdFromEvent(target);
9144
9166
  const container = containerRef.current;
@@ -10678,11 +10700,11 @@ function arePropsEqual(prev, next) {
10678
10700
  }
10679
10701
  return true;
10680
10702
  }
10681
- var SmartArtRenderer = React34.memo(SmartArtRendererImpl, arePropsEqual);
10703
+ var SmartArtRenderer = React35.memo(SmartArtRendererImpl, arePropsEqual);
10682
10704
  function FailedToLoad2() {
10683
10705
  return null;
10684
10706
  }
10685
- var LazySmartArt3DScene = React34.lazy(
10707
+ var LazySmartArt3DScene = React35.lazy(
10686
10708
  async () => {
10687
10709
  try {
10688
10710
  return await import('./SmartArt3DScene-XCFVGCXE.mjs');
@@ -10691,7 +10713,7 @@ var LazySmartArt3DScene = React34.lazy(
10691
10713
  }
10692
10714
  }
10693
10715
  );
10694
- var SceneErrorBoundary = class extends React34.Component {
10716
+ var SceneErrorBoundary = class extends React35.Component {
10695
10717
  constructor(props) {
10696
10718
  super(props);
10697
10719
  this.state = { hasError: false };
@@ -11325,6 +11347,7 @@ function renderBody(options) {
11325
11347
  onColResize,
11326
11348
  onRowResize,
11327
11349
  isPresentationPassive,
11350
+ isStaticSurface,
11328
11351
  handleMediaPlayStateChange,
11329
11352
  allSlides,
11330
11353
  onZoomClick,
@@ -11424,6 +11447,13 @@ function renderBody(options) {
11424
11447
  autoPlay: isPresentationPassive,
11425
11448
  fullScreen: isPresentationPassive && Boolean(el.fullScreen),
11426
11449
  isPresentationMode: isPresentationPassive,
11450
+ // A still of a slide never carries a transport, whatever the canvas
11451
+ // does. The rule is shared so the five bindings cannot drift on it.
11452
+ showTransport: mediaTransportVisible({
11453
+ presenting: isPresentationPassive === true,
11454
+ preview: isStaticSurface === true,
11455
+ canvasTransport: true
11456
+ }),
11427
11457
  onPlayStateChange: handleMediaPlayStateChange
11428
11458
  });
11429
11459
  }
@@ -11450,7 +11480,7 @@ function renderBody(options) {
11450
11480
  }
11451
11481
  return renderTextElementBody(options);
11452
11482
  }
11453
- var Extrusion3DOverlay = React34.memo(({ data }) => {
11483
+ var Extrusion3DOverlay = React35.memo(({ data }) => {
11454
11484
  if (!data.hasExtrusion || data.panels.length === 0) {
11455
11485
  return null;
11456
11486
  }
@@ -11483,12 +11513,6 @@ var Extrusion3DOverlay = React34.memo(({ data }) => {
11483
11513
  ] });
11484
11514
  });
11485
11515
  Extrusion3DOverlay.displayName = "Extrusion3DOverlay";
11486
- function LinkTooltip({ label, hasUrl }) {
11487
- return /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute left-1 top-full z-[9999] mt-1 max-w-64 opacity-0 transition-opacity duration-150 group-hover/link:opacity-100", children: /* @__PURE__ */ jsxs("div", { className: "rounded border border-border bg-popover px-2.5 py-1.5 shadow-lg", children: [
11488
- /* @__PURE__ */ jsx("div", { className: "truncate text-xs text-foreground", children: label }),
11489
- /* @__PURE__ */ jsx("div", { className: "mt-0.5 text-[10px] text-muted-foreground", children: hasUrl ? "Ctrl+Click to follow link" : "Active in presentation mode" })
11490
- ] }) });
11491
- }
11492
11516
 
11493
11517
  // src/viewer/components/elements/scoped-element-handlers.ts
11494
11518
  function getScopedElementHandlers(elementId, options) {
@@ -11555,6 +11579,7 @@ function StaticElementRendererImpl({
11555
11579
  {
11556
11580
  "data-static-element-type": element.type,
11557
11581
  "data-element-id": exposeElementId ? element.id : void 0,
11582
+ "data-pptx-element": exposeElementId ? "true" : void 0,
11558
11583
  "data-pptx-action": isActionable ? "click" : void 0,
11559
11584
  className: `${positioned ? "absolute" : "relative"} overflow-hidden ${isActionable ? "pointer-events-auto cursor-pointer" : "pointer-events-none"}`,
11560
11585
  role: contractRole,
@@ -11631,6 +11656,11 @@ function StaticElementRendererImpl({
11631
11656
  onCommit: noop,
11632
11657
  onCancel: noop,
11633
11658
  isPresentationPassive: false,
11659
+ // This renderer only ever paints a STILL of a slide (presenter
11660
+ // console panes, thumbnails, previews). It is not in presentation
11661
+ // mode, so without saying so a video here would carry Chrome's
11662
+ // scrubber over a slide nobody can play.
11663
+ isStaticSurface: true,
11634
11664
  slideElements: activeSlide?.elements,
11635
11665
  allSlides,
11636
11666
  sourceSlideIndex,
@@ -11643,9 +11673,9 @@ function StaticElementRendererImpl({
11643
11673
  }
11644
11674
  );
11645
11675
  }
11646
- var StaticElementRenderer = React34.memo(StaticElementRendererImpl);
11676
+ var StaticElementRenderer = React35.memo(StaticElementRendererImpl);
11647
11677
  StaticElementRenderer.displayName = "StaticElementRenderer";
11648
- var ElementRenderer = React34.memo(
11678
+ var ElementRenderer = React35.memo(
11649
11679
  // oxlint-disable-next-line prefer-arrow-callback -- named fn gives the memo component its displayName
11650
11680
  function ElementRendererInner({
11651
11681
  element: el,
@@ -11735,6 +11765,7 @@ var ElementRenderer = React34.memo(
11735
11765
  () => build3DExtrusionData(shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height),
11736
11766
  [shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height]
11737
11767
  );
11768
+ const actionAffordance = useActionAffordance(el, canInteract);
11738
11769
  const [isMediaPlaying, setIsMediaPlaying] = useState(false);
11739
11770
  const handleMediaPlayStateChange = useCallback((playing) => {
11740
11771
  setIsMediaPlaying(playing);
@@ -11809,7 +11840,10 @@ var ElementRenderer = React34.memo(
11809
11840
  effectiveCanInteract || isActionable ? "" : "pointer-events-none",
11810
11841
  isFullscreenMedia ? "pointer-events-auto" : "",
11811
11842
  selB,
11812
- effectiveCanInteract && el.actionClick && "group/link"
11843
+ // Shared class the tooltip's `:hover` rule keys off (see
11844
+ // `ACTION_AFFORDANCE_CSS`), replacing React's Tailwind `group/link`
11845
+ // so the four non-Tailwind bindings reveal it the same way.
11846
+ actionAffordance.showLinkTooltip && LINK_TOOLTIP_HOST_CLASS
11813
11847
  ),
11814
11848
  style: getContainerStyle({
11815
11849
  el,
@@ -11887,20 +11921,7 @@ var ElementRenderer = React34.memo(
11887
11921
  onUpdateChartElement: chartUpdateHandler,
11888
11922
  onFormatText
11889
11923
  }),
11890
- (el.actionClick || el.actionHover) && canInteract && /* @__PURE__ */ jsx(
11891
- ActionIndicator,
11892
- {
11893
- clickTooltip: el.actionClick?.tooltip,
11894
- hoverTooltip: el.actionHover?.tooltip
11895
- }
11896
- ),
11897
- effectiveCanInteract && el.actionClick && /* @__PURE__ */ jsx(
11898
- LinkTooltip,
11899
- {
11900
- label: el.actionClick.tooltip || el.actionClick.url || el.actionClick.action || "Link",
11901
- hasUrl: Boolean(el.actionClick.url)
11902
- }
11903
- ),
11924
+ /* @__PURE__ */ jsx(ActionAffordances, { affordance: actionAffordance }),
11904
11925
  effectiveShowResizeHandles && !effectiveIsInlineEditing && /* @__PURE__ */ jsx(
11905
11926
  ResizeHandles,
11906
11927
  {
@@ -12916,7 +12937,7 @@ function arePropsEqual2(prev, next) {
12916
12937
  }
12917
12938
  return true;
12918
12939
  }
12919
- var SlideThumbnail = React34.memo(SlideThumbnailImpl, arePropsEqual2);
12940
+ var SlideThumbnail = React35.memo(SlideThumbnailImpl, arePropsEqual2);
12920
12941
 
12921
12942
  // src/viewer/components/context-menu-dispatch.ts
12922
12943
  function tableCell(props) {
@@ -13465,7 +13486,7 @@ function LazyThumbnailInner({
13465
13486
  }
13466
13487
  ) });
13467
13488
  }
13468
- var LazyThumbnail = React34.memo(LazyThumbnailInner);
13489
+ var LazyThumbnail = React35.memo(LazyThumbnailInner);
13469
13490
 
13470
13491
  // src/viewer/components/slides-pane/utils.ts
13471
13492
  function formatTimingMs(ms) {
@@ -13619,7 +13640,7 @@ function SlideItemInner({
13619
13640
  }
13620
13641
  );
13621
13642
  }
13622
- var SlideItem = React34.memo(SlideItemInner);
13643
+ var SlideItem = React35.memo(SlideItemInner);
13623
13644
  function useSlidePaneCallbacks(onMoveSlide, onRenameSection) {
13624
13645
  const [collapsedSections, setCollapsedSections] = useState({});
13625
13646
  const [renamingSectionId, setRenamingSectionId] = useState(null);
@@ -14896,7 +14917,7 @@ function arePropsEqual3(prev, next) {
14896
14917
  }
14897
14918
  return true;
14898
14919
  }
14899
- var SlideCard = React34.memo(SlideCardImpl, arePropsEqual3);
14920
+ var SlideCard = React35.memo(SlideCardImpl, arePropsEqual3);
14900
14921
  function SorterContextMenu({
14901
14922
  x,
14902
14923
  y,
@@ -18725,102 +18746,121 @@ function PresentationSubtitleBar({
18725
18746
  function renderNotesSegments(segments) {
18726
18747
  return notesSegmentsToSpans(segments).map((span) => {
18727
18748
  if (span.kind === "break") {
18728
- return React34.createElement("br", { key: span.key });
18749
+ return React35.createElement("br", { key: span.key });
18729
18750
  }
18730
- return React34.createElement(
18751
+ return React35.createElement(
18731
18752
  "span",
18732
18753
  { key: span.key, style: span.style },
18733
18754
  span.text
18734
18755
  );
18735
18756
  });
18736
18757
  }
18737
- var toolClass = (active) => `inline-flex h-9 min-w-9 items-center justify-center gap-2 rounded-md px-2 text-xs transition-colors ${active ? "bg-primary text-primary-foreground" : "bg-muted text-foreground hover:bg-accent"}`;
18758
+ var CONSOLE_ICONS = {
18759
+ "arrow-left-right": LuArrowLeftRight,
18760
+ captions: LuCaptions,
18761
+ "circle-pause": LuCirclePause,
18762
+ "circle-play": LuCirclePlay,
18763
+ eraser: LuEraser,
18764
+ "grid-2x2": LuGrid2X2,
18765
+ highlighter: LuHighlighter,
18766
+ monitor: LuMonitor,
18767
+ "monitor-off": LuMonitorOff,
18768
+ "mouse-pointer-2": LuMousePointer2,
18769
+ "pen-tool": LuPenTool,
18770
+ "rotate-ccw": LuRotateCcw,
18771
+ scan: LuScan,
18772
+ x: LuX,
18773
+ "zoom-in": LuZoomIn,
18774
+ "zoom-out": LuZoomOut
18775
+ };
18776
+ var POINTER_TOOLS = {
18777
+ laser: "laser",
18778
+ pen: "pen",
18779
+ highlighter: "highlighter",
18780
+ eraser: "eraser"
18781
+ };
18782
+ function slotState(control, props) {
18783
+ const snapshot = props.snapshot;
18784
+ const pointerTool = snapshot.pointer?.tool ?? "none";
18785
+ const tool = POINTER_TOOLS[control.id];
18786
+ if (tool) {
18787
+ return {
18788
+ active: pointerTool === tool,
18789
+ onClick: () => props.onPointerTool(pointerTool === tool ? "none" : tool)
18790
+ };
18791
+ }
18792
+ switch (control.id) {
18793
+ case "timer-toggle":
18794
+ return { active: Boolean(snapshot.paused), onClick: props.onToggleTimer };
18795
+ case "timer-reset":
18796
+ return { active: false, onClick: props.onResetTimer };
18797
+ case "all-slides":
18798
+ return { active: false, onClick: props.onShowSlides };
18799
+ case "zoom-in":
18800
+ return { active: (snapshot.zoom?.scale ?? 1) > 1, onClick: () => props.onStepZoom(1) };
18801
+ case "zoom-out":
18802
+ return { active: false, onClick: () => props.onStepZoom(-1) };
18803
+ case "zoom-reset":
18804
+ return { active: false, onClick: props.onResetZoom };
18805
+ case "blackout-black":
18806
+ return {
18807
+ active: snapshot.blackout === "black",
18808
+ onClick: () => props.onBlackout(snapshot.blackout === "black" ? "none" : "black")
18809
+ };
18810
+ case "blackout-white":
18811
+ return {
18812
+ active: snapshot.blackout === "white",
18813
+ onClick: () => props.onBlackout(snapshot.blackout === "white" ? "none" : "white")
18814
+ };
18815
+ case "captions":
18816
+ return { active: Boolean(snapshot.subtitlesVisible), onClick: props.onToggleSubtitles };
18817
+ case "audience":
18818
+ return { active: props.audienceOpen, onClick: props.onToggleAudience };
18819
+ case "swap-displays":
18820
+ return { active: false, onClick: props.onSwapDisplays, disabled: !props.audienceOpen };
18821
+ case "end":
18822
+ return { active: false, onClick: props.onExit };
18823
+ default:
18824
+ return { active: false, onClick: () => void 0 };
18825
+ }
18826
+ }
18738
18827
  function PresenterConsoleToolbar(props) {
18739
- const pointerTool = props.snapshot.pointer?.tool ?? "none";
18740
- const zoom = props.snapshot.zoom?.scale ?? 1;
18741
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1 border-b border-border bg-card px-3 py-2", children: [
18742
- /* @__PURE__ */ jsx(
18743
- "button",
18744
- {
18745
- className: toolClass(false),
18746
- onClick: props.onToggleTimer,
18747
- title: "Pause or resume timer",
18748
- children: props.snapshot.paused ? /* @__PURE__ */ jsx(LuCirclePlay, {}) : /* @__PURE__ */ jsx(LuCirclePause, {})
18749
- }
18750
- ),
18751
- /* @__PURE__ */ jsx("button", { className: toolClass(false), onClick: props.onResetTimer, title: "Reset timer", children: /* @__PURE__ */ jsx(LuRotateCcw, {}) }),
18752
- /* @__PURE__ */ jsx("span", { className: "mx-1 h-6 w-px bg-border" }),
18753
- /* @__PURE__ */ jsxs("button", { className: toolClass(false), onClick: props.onShowSlides, title: "See all slides", children: [
18754
- /* @__PURE__ */ jsx(LuGrid2X2, {}),
18755
- " Slides"
18756
- ] }),
18757
- /* @__PURE__ */ jsx("button", { className: toolClass(zoom > 1), onClick: () => props.onStepZoom(1), title: "Zoom in", children: /* @__PURE__ */ jsx(LuZoomIn, {}) }),
18758
- /* @__PURE__ */ jsx("button", { className: toolClass(false), onClick: () => props.onStepZoom(-1), title: "Zoom out", children: /* @__PURE__ */ jsx(LuZoomOut, {}) }),
18759
- /* @__PURE__ */ jsx("button", { className: toolClass(false), onClick: props.onResetZoom, title: "Reset zoom", children: /* @__PURE__ */ jsx(LuScan, {}) }),
18760
- /* @__PURE__ */ jsx("span", { className: "mx-1 h-6 w-px bg-border" }),
18761
- ["laser", "pen", "highlighter", "eraser"].map((tool) => /* @__PURE__ */ jsx(
18828
+ const { t } = useTranslation();
18829
+ return /* @__PURE__ */ jsx("div", { className: PRESENTER_CONSOLE_CLASSES.strip, "data-pptx-presenter-toolbar": true, children: PRESENTER_CONSOLE_CONTROLS.map((control) => {
18830
+ if (control.kind === "divider" || control.kind === "spacer") {
18831
+ return /* @__PURE__ */ jsx(
18832
+ "span",
18833
+ {
18834
+ "data-pptx-presenter-control": control.id,
18835
+ className: control.kind === "divider" ? PRESENTER_CONSOLE_CLASSES.divider : PRESENTER_CONSOLE_CLASSES.spacer
18836
+ },
18837
+ control.id
18838
+ );
18839
+ }
18840
+ const state = slotState(control, props);
18841
+ const labelKey = state.active && control.activeLabelKey ? control.activeLabelKey : control.labelKey;
18842
+ const iconName = state.active && control.activeIcon ? control.activeIcon : control.icon;
18843
+ const Icon = iconName === void 0 ? void 0 : CONSOLE_ICONS[iconName];
18844
+ const label = labelKey === void 0 ? void 0 : t(labelKey);
18845
+ return /* @__PURE__ */ jsxs(
18762
18846
  "button",
18763
18847
  {
18764
- className: toolClass(pointerTool === tool),
18765
- onClick: () => props.onPointerTool(pointerTool === tool ? "none" : tool),
18766
- title: tool[0].toUpperCase() + tool.slice(1),
18767
- children: tool === "laser" ? /* @__PURE__ */ jsx(LuMousePointer2, {}) : tool === "pen" ? /* @__PURE__ */ jsx(LuPenTool, {}) : tool === "highlighter" ? /* @__PURE__ */ jsx(LuHighlighter, {}) : /* @__PURE__ */ jsx(LuEraser, {})
18848
+ type: "button",
18849
+ "data-pptx-presenter-control": control.id,
18850
+ className: state.active ? PRESENTER_CONSOLE_CLASSES.controlActive : PRESENTER_CONSOLE_CLASSES.control,
18851
+ onClick: state.onClick,
18852
+ disabled: state.disabled,
18853
+ "aria-label": label,
18854
+ title: label,
18855
+ "aria-pressed": control.kind === "toggle" ? state.active : void 0,
18856
+ children: [
18857
+ Icon ? /* @__PURE__ */ jsx(Icon, {}) : null,
18858
+ control.glyph
18859
+ ]
18768
18860
  },
18769
- tool
18770
- )),
18771
- /* @__PURE__ */ jsx("span", { className: "mx-1 h-6 w-px bg-border" }),
18772
- /* @__PURE__ */ jsx(
18773
- "button",
18774
- {
18775
- className: toolClass(props.snapshot.blackout === "black"),
18776
- onClick: () => props.onBlackout(props.snapshot.blackout === "black" ? "none" : "black"),
18777
- title: "Black screen",
18778
- children: "B"
18779
- }
18780
- ),
18781
- /* @__PURE__ */ jsx(
18782
- "button",
18783
- {
18784
- className: toolClass(props.snapshot.blackout === "white"),
18785
- onClick: () => props.onBlackout(props.snapshot.blackout === "white" ? "none" : "white"),
18786
- title: "White screen",
18787
- children: "W"
18788
- }
18789
- ),
18790
- /* @__PURE__ */ jsx(
18791
- "button",
18792
- {
18793
- className: toolClass(Boolean(props.snapshot.subtitlesVisible)),
18794
- onClick: props.onToggleSubtitles,
18795
- title: "Toggle subtitles",
18796
- children: /* @__PURE__ */ jsx(LuCaptions, {})
18797
- }
18798
- ),
18799
- /* @__PURE__ */ jsx("div", { className: "flex-1" }),
18800
- /* @__PURE__ */ jsx(
18801
- "button",
18802
- {
18803
- className: toolClass(props.audienceOpen),
18804
- onClick: props.onToggleAudience,
18805
- title: "Audience display",
18806
- children: props.audienceOpen ? /* @__PURE__ */ jsx(LuMonitorOff, {}) : /* @__PURE__ */ jsx(LuMonitor, {})
18807
- }
18808
- ),
18809
- /* @__PURE__ */ jsx(
18810
- "button",
18811
- {
18812
- className: toolClass(false),
18813
- onClick: props.onSwapDisplays,
18814
- disabled: !props.audienceOpen,
18815
- title: "Swap displays",
18816
- children: "Swap"
18817
- }
18818
- ),
18819
- /* @__PURE__ */ jsxs("button", { className: toolClass(false), onClick: props.onExit, title: "End slide show", children: [
18820
- /* @__PURE__ */ jsx(LuX, {}),
18821
- " End"
18822
- ] })
18823
- ] });
18861
+ control.id
18862
+ );
18863
+ }) });
18824
18864
  }
18825
18865
  function ScaledSlidePreviewImpl({
18826
18866
  slide,
@@ -18934,7 +18974,7 @@ function arePropsEqual4(prev, next) {
18934
18974
  }
18935
18975
  return true;
18936
18976
  }
18937
- var ScaledSlidePreview = React34.memo(ScaledSlidePreviewImpl, arePropsEqual4);
18977
+ var ScaledSlidePreview = React35.memo(ScaledSlidePreviewImpl, arePropsEqual4);
18938
18978
  function PresenterNotesRail({
18939
18979
  slides,
18940
18980
  current,
@@ -18957,14 +18997,14 @@ function PresenterNotesRail({
18957
18997
  () => notesSegments?.length ? renderNotesSegments(notesSegments) : notesText.trim() ? notesText : /* @__PURE__ */ jsx("span", { className: "italic text-muted-foreground", children: t("pptx.presenter.noNotes") }),
18958
18998
  [notesSegments, notesText, t]
18959
18999
  );
18960
- return /* @__PURE__ */ jsxs("aside", { className: "flex flex-[3] min-w-[260px] max-w-[440px] flex-col border-l border-border bg-background", children: [
19000
+ return /* @__PURE__ */ jsxs("aside", { className: PRESENTER_CONSOLE_CLASSES.rail, children: [
18961
19001
  /* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between border-b border-border/60 px-4 py-3", children: [
18962
19002
  /* @__PURE__ */ jsxs("div", { children: [
18963
- /* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: t("pptx.presenter.currentTime") }),
19003
+ /* @__PURE__ */ jsx("div", { className: PRESENTER_CONSOLE_CLASSES.railHeading, children: t("pptx.presenter.currentTime") }),
18964
19004
  /* @__PURE__ */ jsx("div", { className: "font-mono text-lg tabular-nums", children: formatTime(new Date(now)) })
18965
19005
  ] }),
18966
19006
  /* @__PURE__ */ jsxs("div", { className: "text-right", children: [
18967
- /* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: t("pptx.presenter.elapsed") }),
19007
+ /* @__PURE__ */ jsx("div", { className: PRESENTER_CONSOLE_CLASSES.railHeading, children: t("pptx.presenter.elapsed") }),
18968
19008
  /* @__PURE__ */ jsx("div", { className: "font-mono text-lg tabular-nums text-primary", children: formatElapsed(elapsed) })
18969
19009
  ] })
18970
19010
  ] }),
@@ -18974,7 +19014,8 @@ function PresenterNotesRail({
18974
19014
  {
18975
19015
  type: "button",
18976
19016
  onClick: () => onMove(-1),
18977
- disabled: current === 0,
19017
+ disabled: presenterPrevDisabled(current),
19018
+ "data-pptx-presenter-control": "prev",
18978
19019
  className: "inline-flex items-center gap-1 rounded bg-muted px-3 py-1.5 text-xs disabled:opacity-40",
18979
19020
  children: [
18980
19021
  /* @__PURE__ */ jsx(LuChevronLeft, {}),
@@ -18993,6 +19034,8 @@ function PresenterNotesRail({
18993
19034
  {
18994
19035
  type: "button",
18995
19036
  onClick: () => onMove(1),
19037
+ disabled: presenterNextDisabled(),
19038
+ "data-pptx-presenter-control": "next",
18996
19039
  className: "inline-flex items-center gap-1 rounded bg-muted px-3 py-1.5 text-xs disabled:opacity-40",
18997
19040
  children: [
18998
19041
  t("pptx.presenter.next"),
@@ -19002,8 +19045,8 @@ function PresenterNotesRail({
19002
19045
  }
19003
19046
  )
19004
19047
  ] }),
19005
- /* @__PURE__ */ jsxs("section", { className: "border-b border-border/60 px-4 py-3", children: [
19006
- /* @__PURE__ */ jsx("div", { className: "mb-2 text-[10px] uppercase tracking-wider text-muted-foreground", children: t("pptx.presenter.nextSlidePreview") }),
19048
+ /* @__PURE__ */ jsxs("section", { className: "border-b border-border/60 px-4 py-3", "data-pptx-presenter-next-preview": true, children: [
19049
+ /* @__PURE__ */ jsx("div", { className: `mb-2 ${PRESENTER_CONSOLE_CLASSES.railHeading}`, children: t("pptx.presenter.nextSlidePreview") }),
19007
19050
  nextSlide ? /* @__PURE__ */ jsx(
19008
19051
  ScaledSlidePreview,
19009
19052
  {
@@ -19013,9 +19056,9 @@ function PresenterNotesRail({
19013
19056
  }
19014
19057
  ) : /* @__PURE__ */ jsx("div", { className: "flex h-16 items-center justify-center rounded bg-muted/40 text-xs italic text-muted-foreground", children: t("pptx.presenter.endOfPresentation") })
19015
19058
  ] }),
19016
- /* @__PURE__ */ jsxs("section", { className: "flex min-h-0 flex-1 flex-col px-4 py-3", children: [
19059
+ /* @__PURE__ */ jsxs("section", { className: "flex min-h-0 flex-1 flex-col px-4 py-3", "data-pptx-presenter-notes": true, children: [
19017
19060
  /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center justify-between", children: [
19018
- /* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: t("pptx.presenter.speakerNotes") }),
19061
+ /* @__PURE__ */ jsx("div", { className: PRESENTER_CONSOLE_CLASSES.railHeading, children: t("pptx.presenter.speakerNotes") }),
19019
19062
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
19020
19063
  /* @__PURE__ */ jsx(
19021
19064
  "button",
@@ -19023,6 +19066,7 @@ function PresenterNotesRail({
19023
19066
  type: "button",
19024
19067
  onClick: () => setFontSize(clampNotesFontSize(fontSize - NOTES_FONT_SIZE_STEP)),
19025
19068
  disabled: fontSize <= NOTES_FONT_SIZE_MIN,
19069
+ "data-pptx-presenter-control": "notes-font-decrease",
19026
19070
  "aria-label": t("pptx.presenter.decreaseFontSize"),
19027
19071
  children: /* @__PURE__ */ jsx(LuMinus, {})
19028
19072
  }
@@ -19037,6 +19081,7 @@ function PresenterNotesRail({
19037
19081
  type: "button",
19038
19082
  onClick: () => setFontSize(clampNotesFontSize(fontSize + NOTES_FONT_SIZE_STEP)),
19039
19083
  disabled: fontSize >= NOTES_FONT_SIZE_MAX,
19084
+ "data-pptx-presenter-control": "notes-font-increase",
19040
19085
  "aria-label": t("pptx.presenter.increaseFontSize"),
19041
19086
  children: /* @__PURE__ */ jsx(LuPlus, {})
19042
19087
  }
@@ -19065,17 +19110,27 @@ function PresenterNotesRail({
19065
19110
  ] });
19066
19111
  }
19067
19112
  function PresenterSlideNavigator(props) {
19068
- return /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 z-[120] flex flex-col bg-card/98 text-foreground", children: [
19069
- /* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between border-b border-border px-6 py-4", children: [
19113
+ const { t } = useTranslation();
19114
+ return /* @__PURE__ */ jsxs("div", { className: `${PRESENTER_CONSOLE_CLASSES.navigator} text-foreground`, children: [
19115
+ /* @__PURE__ */ jsxs("header", { className: "mb-4 flex items-center justify-between border-b border-border pb-4", children: [
19070
19116
  /* @__PURE__ */ jsxs("div", { children: [
19071
- /* @__PURE__ */ jsx("p", { className: "text-xs uppercase tracking-[0.22em] text-sky-300", children: "Slide navigator" }),
19072
- /* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold", children: "See all slides" })
19117
+ /* @__PURE__ */ jsx("p", { className: "text-xs uppercase tracking-[0.22em] text-sky-300", children: t(PRESENTER_NAVIGATOR_LABEL_KEYS.title) }),
19118
+ /* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold", children: t(PRESENTER_NAVIGATOR_LABEL_KEYS.subtitle) })
19073
19119
  ] }),
19074
- /* @__PURE__ */ jsx("button", { className: "rounded-md bg-muted px-4 py-2 hover:bg-accent", onClick: props.onClose, children: "Close" })
19120
+ /* @__PURE__ */ jsx(
19121
+ "button",
19122
+ {
19123
+ type: "button",
19124
+ className: "rounded-md bg-muted px-4 py-2 hover:bg-accent",
19125
+ onClick: props.onClose,
19126
+ children: t(PRESENTER_NAVIGATOR_LABEL_KEYS.close)
19127
+ }
19128
+ )
19075
19129
  ] }),
19076
- /* @__PURE__ */ jsx("div", { className: "grid flex-1 grid-cols-[repeat(auto-fill,minmax(220px,1fr))] gap-5 overflow-auto p-6", children: props.slides.map((slide, index) => /* @__PURE__ */ jsxs(
19130
+ /* @__PURE__ */ jsx("div", { className: PRESENTER_CONSOLE_CLASSES.navigatorGrid, children: props.slides.map((slide, index) => /* @__PURE__ */ jsxs(
19077
19131
  "button",
19078
19132
  {
19133
+ type: "button",
19079
19134
  className: `group text-left ${index === props.current ? "ring-2 ring-sky-400" : ""} ${slide.hidden ? "opacity-45" : ""}`,
19080
19135
  onClick: () => props.onSelect(index),
19081
19136
  children: [
@@ -19219,10 +19274,8 @@ function PresenterView({
19219
19274
  if (!currentSlide) {
19220
19275
  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") });
19221
19276
  }
19222
- const TIMER_SEGMENT_MS = 5 * 60 * 1e3;
19223
- const timerProgress = Math.min(100, elapsed % TIMER_SEGMENT_MS / TIMER_SEGMENT_MS * 100);
19224
- const timerSegment = Math.floor(elapsed / TIMER_SEGMENT_MS);
19225
- return /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 z-50 flex flex-col bg-card text-foreground", children: [
19277
+ const timerProgress = presenterTimerProgress(elapsed);
19278
+ return /* @__PURE__ */ jsxs("div", { className: PRESENTER_CONSOLE_CLASSES.root, children: [
19226
19279
  /* @__PURE__ */ jsx(
19227
19280
  PresenterConsoleToolbar,
19228
19281
  {
@@ -19243,14 +19296,14 @@ function PresenterView({
19243
19296
  onExit
19244
19297
  }
19245
19298
  ),
19246
- /* @__PURE__ */ jsxs("div", { className: "flex flex-1 min-h-0", children: [
19299
+ /* @__PURE__ */ jsxs("div", { className: PRESENTER_CONSOLE_CLASSES.body, children: [
19247
19300
  /* @__PURE__ */ jsxs(
19248
19301
  "div",
19249
19302
  {
19250
19303
  role: "presentation",
19251
19304
  "data-pptx-presenter-slide": true,
19252
19305
  onClick: handleSlidePaneClick,
19253
- className: `relative flex-[7] flex flex-col items-center justify-center bg-black p-6 min-w-0 overflow-hidden ${paneAdvancesOnClick ? "cursor-pointer" : ""}`,
19306
+ className: `${PRESENTER_CONSOLE_CLASSES.main} ${paneAdvancesOnClick ? "cursor-pointer" : ""}`,
19254
19307
  children: [
19255
19308
  endOfShowVisible && /* @__PURE__ */ jsx(PresentationEndOverlay, { onExit: () => onMovePresentationSlide(1) }),
19256
19309
  /* @__PURE__ */ jsxs(
@@ -19320,18 +19373,21 @@ function PresenterView({
19320
19373
  /* @__PURE__ */ jsx(
19321
19374
  "div",
19322
19375
  {
19323
- className: "h-1.5 w-full bg-muted/60 flex-shrink-0",
19376
+ className: PRESENTER_CONSOLE_CLASSES.progressTrack,
19324
19377
  role: "progressbar",
19325
- "aria-valuenow": Math.round(timerProgress),
19378
+ "aria-valuenow": Math.round(timerProgress.percent),
19326
19379
  "aria-valuemin": 0,
19327
19380
  "aria-valuemax": 100,
19328
19381
  "aria-label": t("pptx.presenter.timerProgress"),
19329
- title: `${formatElapsed(elapsed)} (segment ${timerSegment + 1})`,
19382
+ title: t("pptx.presenter.timerTitle", {
19383
+ elapsed: formatElapsed(elapsed),
19384
+ segment: timerProgress.segment + 1
19385
+ }),
19330
19386
  children: /* @__PURE__ */ jsx(
19331
19387
  "div",
19332
19388
  {
19333
- className: "h-full bg-primary transition-[width] duration-1000 ease-linear",
19334
- style: { width: `${timerProgress}%` }
19389
+ className: PRESENTER_CONSOLE_CLASSES.progressFill,
19390
+ style: { width: `${timerProgress.percent}%` }
19335
19391
  }
19336
19392
  )
19337
19393
  }
@@ -19362,8 +19418,8 @@ function MobilePresenterView({
19362
19418
  const notesText = currentSlide.notes ?? "";
19363
19419
  const notesSegments = currentSlide.notesSegments;
19364
19420
  const hasRichNotes = notesSegments && notesSegments.length > 0;
19365
- const atFirst = isFirstSlide(currentSlideIndex);
19366
- const atLast = isLastSlide(currentSlideIndex, slides.length);
19421
+ const prevDisabled = presenterPrevDisabled(currentSlideIndex);
19422
+ const nextDisabled = presenterNextDisabled();
19367
19423
  const insetStyle = {
19368
19424
  paddingTop: "env(safe-area-inset-top, 0px)",
19369
19425
  paddingBottom: "env(safe-area-inset-bottom, 0px)",
@@ -19417,8 +19473,9 @@ function MobilePresenterView({
19417
19473
  "button",
19418
19474
  {
19419
19475
  type: "button",
19476
+ "data-pptx-presenter-control": "prev",
19420
19477
  onClick: () => onMovePresentationSlide(-1),
19421
- disabled: atFirst,
19478
+ disabled: prevDisabled,
19422
19479
  className: "inline-flex items-center justify-center gap-1.5 flex-1 h-11 rounded bg-muted hover:bg-accent disabled:opacity-40 disabled:cursor-not-allowed text-sm transition-colors",
19423
19480
  title: t("pptx.presenter.previousSlide"),
19424
19481
  "aria-label": t("pptx.presenter.previousSlide"),
@@ -19432,8 +19489,9 @@ function MobilePresenterView({
19432
19489
  "button",
19433
19490
  {
19434
19491
  type: "button",
19492
+ "data-pptx-presenter-control": "next",
19435
19493
  onClick: () => onMovePresentationSlide(1),
19436
- disabled: atLast,
19494
+ disabled: nextDisabled,
19437
19495
  className: "inline-flex items-center justify-center gap-1.5 flex-1 h-11 rounded bg-muted hover:bg-accent disabled:opacity-40 disabled:cursor-not-allowed text-sm transition-colors",
19438
19496
  title: t("pptx.presenter.nextSlide"),
19439
19497
  "aria-label": t("pptx.presenter.nextSlide"),
@@ -22426,7 +22484,7 @@ function ConnectorArrowsSection({
22426
22484
  ["Start", "End"].map((end) => {
22427
22485
  const widthKey = end === "Start" ? "connectorStartArrowWidth" : "connectorEndArrowWidth";
22428
22486
  const lengthKey = end === "Start" ? "connectorStartArrowLength" : "connectorEndArrowLength";
22429
- return /* @__PURE__ */ jsxs(React34.Fragment, { children: [
22487
+ return /* @__PURE__ */ jsxs(React35.Fragment, { children: [
22430
22488
  /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1", children: [
22431
22489
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t(END_LABEL_KEYS[end].width) }),
22432
22490
  /* @__PURE__ */ jsx(
@@ -25255,7 +25313,7 @@ function StrokeEffectsSection({
25255
25313
  ] }),
25256
25314
  EFFECT_CONFIGS.map((cfg) => {
25257
25315
  const on = cfg.isOn(style);
25258
- return /* @__PURE__ */ jsxs(React34.Fragment, { children: [
25316
+ return /* @__PURE__ */ jsxs(React35.Fragment, { children: [
25259
25317
  /* @__PURE__ */ jsxs("label", { className: `inline-flex items-center gap-2 text-foreground ${COL2}`, children: [
25260
25318
  /* @__PURE__ */ jsx(
25261
25319
  "input",
@@ -26092,7 +26150,7 @@ function TextWarpGallery({
26092
26150
  onUpdateTextStyle
26093
26151
  }) {
26094
26152
  const { t } = useTranslation();
26095
- const [expanded, setExpanded] = React34.useState(false);
26153
+ const [expanded, setExpanded] = React35.useState(false);
26096
26154
  const currentPreset = ts?.textWarpPreset || "textNoShape";
26097
26155
  return /* @__PURE__ */ jsxs("div", { className: "mt-2 rounded border border-border bg-card p-2 space-y-2", children: [
26098
26156
  /* @__PURE__ */ jsxs(
@@ -26808,7 +26866,7 @@ function SmartArtStyleControls({
26808
26866
  onChangeStyle
26809
26867
  }) {
26810
26868
  const { t } = useTranslation();
26811
- const translate = React34.useCallback((key) => t(key), [t]);
26869
+ const translate = React35.useCallback((key) => t(key), [t]);
26812
26870
  return /* @__PURE__ */ jsxs(Fragment, { children: [
26813
26871
  /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1 text-[11px]", children: [
26814
26872
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t("pptx.smartart.colorScheme") }),
@@ -26864,9 +26922,9 @@ function SmartArtPropertiesPanel({
26864
26922
  const nodes = smartArtData.nodes ?? [];
26865
26923
  const layout = smartArtData.resolvedLayoutType;
26866
26924
  const topLevelCount = nodes.filter((n) => !n.parentId).length;
26867
- const inputRefs = React34.useRef(/* @__PURE__ */ new Map());
26868
- const pendingFocusId = React34.useRef(null);
26869
- React34.useEffect(() => {
26925
+ const inputRefs = React35.useRef(/* @__PURE__ */ new Map());
26926
+ const pendingFocusId = React35.useRef(null);
26927
+ React35.useEffect(() => {
26870
26928
  const id = pendingFocusId.current;
26871
26929
  if (id) {
26872
26930
  inputRefs.current.get(id)?.focus();
@@ -29308,7 +29366,7 @@ function PresentationPropertiesPanel({
29308
29366
  onUpdateTagCollections
29309
29367
  }) {
29310
29368
  const { t } = useTranslation();
29311
- const handleTransitionChange = React34.useCallback(
29369
+ const handleTransitionChange = React35.useCallback(
29312
29370
  (updates) => {
29313
29371
  onUpdateSlide({
29314
29372
  transition: mergeSlideTransition(activeSlide?.transition, updates)
@@ -33241,7 +33299,7 @@ function ViewerToolbarSection(props) {
33241
33299
  },
33242
33300
  [activeSlide, propertyHandlers]
33243
33301
  );
33244
- const scopedLayoutOptions = React34.useMemo(
33302
+ const scopedLayoutOptions = React35.useMemo(
33245
33303
  () => scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
33246
33304
  [s.layoutOptions, activeSlide]
33247
33305
  );
@@ -34995,7 +35053,7 @@ ${url}`)) {
34995
35053
  )
34996
35054
  );
34997
35055
  }
34998
- var AiChatPanel = lazy(() => import('./AiChatPanel-CS4CONUO.mjs'));
35056
+ var AiChatPanel = lazy(() => import('./AiChatPanel-CGGUPVQX.mjs'));
34999
35057
  function AiChatPanelLazy(props) {
35000
35058
  return /* @__PURE__ */ jsx(
35001
35059
  Suspense,