pptx-react-viewer 2.12.0 → 2.13.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 (122) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/{AiChatPanel-CS4CONUO.mjs → AiChatPanel-4YS6DEIT.mjs} +4 -4
  3. package/dist/AiChatPanel-4YS6DEIT.mjs.br +0 -0
  4. package/dist/AiChatPanel-4YS6DEIT.mjs.gz +0 -0
  5. package/dist/{AiChatPanel-JIXSOZXN.js → AiChatPanel-DEI3EQFM.js} +23 -23
  6. package/dist/AiChatPanel-DEI3EQFM.js.br +0 -0
  7. package/dist/AiChatPanel-DEI3EQFM.js.gz +0 -0
  8. package/dist/{Model3DScene-RWFPSN6B.mjs → Model3DScene-JSNQCKCJ.mjs} +1 -1
  9. package/dist/Model3DScene-JSNQCKCJ.mjs.br +0 -0
  10. package/dist/Model3DScene-JSNQCKCJ.mjs.gz +0 -0
  11. package/dist/{Model3DScene-5KMJ4JL6.js → Model3DScene-X4W7GZVY.js} +2 -2
  12. package/dist/Model3DScene-X4W7GZVY.js.br +0 -0
  13. package/dist/Model3DScene-X4W7GZVY.js.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-2GZQM3LN.mjs → SurfaceChart3DScene-3MSU74YH.mjs} +1 -1
  15. package/dist/{SurfaceChart3DScene-2GZQM3LN.mjs.br → SurfaceChart3DScene-3MSU74YH.mjs.br} +0 -0
  16. package/dist/SurfaceChart3DScene-3MSU74YH.mjs.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-BIOKIETC.js → SurfaceChart3DScene-IZLUWT27.js} +2 -2
  18. package/dist/SurfaceChart3DScene-IZLUWT27.js.br +0 -0
  19. package/dist/SurfaceChart3DScene-IZLUWT27.js.gz +0 -0
  20. package/dist/{chunk-QGHC65C4.mjs → chunk-4TD7EINA.mjs} +1071 -375
  21. package/dist/chunk-4TD7EINA.mjs.br +0 -0
  22. package/dist/chunk-4TD7EINA.mjs.gz +0 -0
  23. package/dist/{chunk-AOED5MFM.mjs → chunk-6KRNQ2KF.mjs} +13 -12
  24. package/dist/chunk-6KRNQ2KF.mjs.br +0 -0
  25. package/dist/chunk-6KRNQ2KF.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-PJUQQF3I.js → chunk-EFSQW6S5.js} +1091 -376
  30. package/dist/chunk-EFSQW6S5.js.br +0 -0
  31. package/dist/chunk-EFSQW6S5.js.gz +0 -0
  32. package/dist/{chunk-ZIXSSQAZ.js → chunk-G2LZT5SV.js} +3 -3
  33. package/dist/chunk-G2LZT5SV.js.br +0 -0
  34. package/dist/chunk-G2LZT5SV.js.gz +0 -0
  35. package/dist/{chunk-CEUHGUZ4.mjs → chunk-HRLF4REI.mjs} +54 -28
  36. package/dist/chunk-HRLF4REI.mjs.br +0 -0
  37. package/dist/chunk-HRLF4REI.mjs.gz +0 -0
  38. package/dist/{chunk-2VUHJNWM.js → chunk-IDW5UPXW.js} +292 -266
  39. package/dist/chunk-IDW5UPXW.js.br +0 -0
  40. package/dist/chunk-IDW5UPXW.js.gz +0 -0
  41. package/dist/{chunk-PTGTFXPU.js → chunk-RWIQHVZQ.js} +341 -340
  42. package/dist/chunk-RWIQHVZQ.js.br +0 -0
  43. package/dist/chunk-RWIQHVZQ.js.gz +0 -0
  44. package/dist/{chunk-SP7U34QM.js → chunk-SHZ3GWOD.js} +2004 -1943
  45. package/dist/chunk-SHZ3GWOD.js.br +0 -0
  46. package/dist/chunk-SHZ3GWOD.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-EJRHYYKE.mjs → chunk-WEU5EMKK.mjs} +1 -1
  51. package/dist/chunk-WEU5EMKK.mjs.br +0 -0
  52. package/dist/chunk-WEU5EMKK.mjs.gz +0 -0
  53. package/dist/{chunk-BJQSHVYH.mjs → chunk-YA7VFYTW.mjs} +271 -210
  54. package/dist/chunk-YA7VFYTW.mjs.br +0 -0
  55. package/dist/chunk-YA7VFYTW.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.d.ts +18 -0
  63. package/dist/index.js +36 -36
  64. package/dist/index.js.br +0 -0
  65. package/dist/index.js.gz +0 -0
  66. package/dist/index.mjs +6 -6
  67. package/dist/index.mjs.br +0 -0
  68. package/dist/index.mjs.gz +0 -0
  69. package/dist/internals.d.ts +18 -0
  70. package/dist/internals.d.ts.map +1 -1
  71. package/dist/internals.js +79 -79
  72. package/dist/internals.js.br +0 -0
  73. package/dist/internals.js.gz +0 -0
  74. package/dist/internals.mjs +4 -4
  75. package/dist/internals.mjs.br +0 -0
  76. package/dist/internals.mjs.gz +0 -0
  77. package/dist/pptx-viewer.css +1 -1
  78. package/dist/pptx-viewer.css.br +0 -0
  79. package/dist/pptx-viewer.css.gz +0 -0
  80. package/dist/viewer/index.d.ts +18 -0
  81. package/dist/viewer/index.js +22 -22
  82. package/dist/viewer/index.js.br +0 -0
  83. package/dist/viewer/index.js.gz +0 -0
  84. package/dist/viewer/index.mjs +6 -6
  85. package/dist/viewer/index.mjs.br +0 -0
  86. package/dist/viewer/index.mjs.gz +0 -0
  87. package/package.json +1 -1
  88. package/dist/AiChatPanel-CS4CONUO.mjs.br +0 -0
  89. package/dist/AiChatPanel-CS4CONUO.mjs.gz +0 -0
  90. package/dist/AiChatPanel-JIXSOZXN.js.br +0 -0
  91. package/dist/AiChatPanel-JIXSOZXN.js.gz +0 -0
  92. package/dist/Model3DScene-5KMJ4JL6.js.br +0 -0
  93. package/dist/Model3DScene-5KMJ4JL6.js.gz +0 -0
  94. package/dist/Model3DScene-RWFPSN6B.mjs.br +0 -0
  95. package/dist/Model3DScene-RWFPSN6B.mjs.gz +0 -0
  96. package/dist/SurfaceChart3DScene-2GZQM3LN.mjs.gz +0 -0
  97. package/dist/SurfaceChart3DScene-BIOKIETC.js.br +0 -0
  98. package/dist/SurfaceChart3DScene-BIOKIETC.js.gz +0 -0
  99. package/dist/chunk-2VUHJNWM.js.br +0 -0
  100. package/dist/chunk-2VUHJNWM.js.gz +0 -0
  101. package/dist/chunk-3GNSGGY2.js.br +0 -0
  102. package/dist/chunk-3GNSGGY2.js.gz +0 -0
  103. package/dist/chunk-AOED5MFM.mjs.br +0 -0
  104. package/dist/chunk-AOED5MFM.mjs.gz +0 -0
  105. package/dist/chunk-BJQSHVYH.mjs.br +0 -0
  106. package/dist/chunk-BJQSHVYH.mjs.gz +0 -0
  107. package/dist/chunk-CEUHGUZ4.mjs.br +0 -0
  108. package/dist/chunk-CEUHGUZ4.mjs.gz +0 -0
  109. package/dist/chunk-ECDKYPQ2.mjs.br +0 -0
  110. package/dist/chunk-ECDKYPQ2.mjs.gz +0 -0
  111. package/dist/chunk-EJRHYYKE.mjs.br +0 -0
  112. package/dist/chunk-EJRHYYKE.mjs.gz +0 -0
  113. package/dist/chunk-PJUQQF3I.js.br +0 -0
  114. package/dist/chunk-PJUQQF3I.js.gz +0 -0
  115. package/dist/chunk-PTGTFXPU.js.br +0 -0
  116. package/dist/chunk-PTGTFXPU.js.gz +0 -0
  117. package/dist/chunk-QGHC65C4.mjs.br +0 -0
  118. package/dist/chunk-QGHC65C4.mjs.gz +0 -0
  119. package/dist/chunk-SP7U34QM.js.br +0 -0
  120. package/dist/chunk-SP7U34QM.js.gz +0 -0
  121. package/dist/chunk-ZIXSSQAZ.js.br +0 -0
  122. 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-WEU5EMKK.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-6KRNQ2KF.mjs';
3
+ import { SHAPE_PRESETS, MIN_ELEMENT_SIZE, DEFAULT_STROKE_COLOR, getConnectorPathGeometry, buildLineShadowCss, buildLineGlowFilter, renderConnectorMarker, 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-HRLF4REI.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-4TD7EINA.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.1" ;
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,8 +7232,9 @@ function ResizeHandles({
7199
7232
  ) : null
7200
7233
  ] });
7201
7234
  }
7202
- var ConnectorElementRenderer = React34.memo(
7203
- ({
7235
+ var ConnectorElementRenderer = React35.memo(
7236
+ // oxlint-disable-next-line prefer-arrow-callback -- named fn gives the memo component its displayName
7237
+ function ConnectorElementRendererInner({
7204
7238
  el,
7205
7239
  isSelected,
7206
7240
  canInteract,
@@ -7213,10 +7247,12 @@ var ConnectorElementRenderer = React34.memo(
7213
7247
  onResizePointerDown,
7214
7248
  onAdjustmentPointerDown,
7215
7249
  animationState
7216
- }) => {
7250
+ }) {
7217
7251
  const shapeEl = hasShapeProperties(el) ? el : void 0;
7218
- const viewWidth = Math.max(el.width, 1);
7219
- const viewHeight = Math.max(el.height, 1);
7252
+ const boxWidth = Math.max(el.width, MIN_ELEMENT_SIZE);
7253
+ const boxHeight = Math.max(el.height, MIN_ELEMENT_SIZE);
7254
+ const viewWidth = Math.max(el.width, 0);
7255
+ const viewHeight = Math.max(el.height, 0);
7220
7256
  const ss = shapeEl?.shapeStyle;
7221
7257
  const strokeWidth = Math.max(0, ss?.strokeWidth ?? 2);
7222
7258
  const strokeColor = normalizeHexColor(ss?.strokeColor, DEFAULT_STROKE_COLOR);
@@ -7260,8 +7296,8 @@ var ConnectorElementRenderer = React34.memo(
7260
7296
  style: {
7261
7297
  left: el.x,
7262
7298
  top: el.y,
7263
- width: Math.max(el.width, MIN_ELEMENT_SIZE),
7264
- height: Math.max(el.height, MIN_ELEMENT_SIZE),
7299
+ width: boxWidth,
7300
+ height: boxHeight,
7265
7301
  transform: getElementTransform(el),
7266
7302
  transformOrigin: "center",
7267
7303
  background: "transparent",
@@ -7277,7 +7313,7 @@ var ConnectorElementRenderer = React34.memo(
7277
7313
  /* @__PURE__ */ jsxs(
7278
7314
  "svg",
7279
7315
  {
7280
- viewBox: `0 0 ${viewWidth} ${viewHeight}`,
7316
+ viewBox: `0 0 ${boxWidth} ${boxHeight}`,
7281
7317
  className: "w-full h-full",
7282
7318
  preserveAspectRatio: "none",
7283
7319
  style: { overflow: "visible", pointerEvents: "none" },
@@ -7495,6 +7531,8 @@ function getElementInteractionProps({
7495
7531
  title: canInteract && element.actionClick ? void 0 : element.actionClick?.tooltip || element.actionHover?.tooltip || void 0
7496
7532
  };
7497
7533
  }
7534
+
7535
+ // src/viewer/components/elements/element-renderer-helpers.tsx
7498
7536
  function renderDagDuotoneFilterForElement(el) {
7499
7537
  if (!hasDagDuotoneEffect(el)) {
7500
7538
  return null;
@@ -7545,19 +7583,6 @@ function getContainerStyle({
7545
7583
  ...templateEditing ? { outline: "2px dashed rgb(217, 119, 6)", outlineOffset: "1px", opacity: opacity ?? 0.95 } : {}
7546
7584
  };
7547
7585
  }
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
7586
 
7562
7587
  // src/viewer/components/elements/element-shape-params.ts
7563
7588
  function shapeParams(element) {
@@ -8705,10 +8730,10 @@ function InlineTextEditor({
8705
8730
  function FailedToLoad() {
8706
8731
  return null;
8707
8732
  }
8708
- var LazyModel3DScene = React34.lazy(
8733
+ var LazyModel3DScene = React35.lazy(
8709
8734
  async () => {
8710
8735
  try {
8711
- return await import('./Model3DScene-RWFPSN6B.mjs');
8736
+ return await import('./Model3DScene-JSNQCKCJ.mjs');
8712
8737
  } catch {
8713
8738
  return { default: FailedToLoad };
8714
8739
  }
@@ -8791,7 +8816,7 @@ function PosterFallback({
8791
8816
  }
8792
8817
  );
8793
8818
  }
8794
- var Model3DErrorBoundary = class extends React34.Component {
8819
+ var Model3DErrorBoundary = class extends React35.Component {
8795
8820
  constructor(props) {
8796
8821
  super(props);
8797
8822
  this.state = { hasError: false };
@@ -8982,10 +9007,10 @@ function SmartArtInlineNodeEditor({
8982
9007
  onCancel
8983
9008
  }) {
8984
9009
  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(() => {
9010
+ const ref = React35.useRef(null);
9011
+ const [value, setValue] = React35.useState(initialText);
9012
+ const settled = React35.useRef(false);
9013
+ React35.useEffect(() => {
8989
9014
  const el = ref.current;
8990
9015
  if (el) {
8991
9016
  el.focus();
@@ -9077,16 +9102,16 @@ function findNodeIdFromEvent(target) {
9077
9102
  return null;
9078
9103
  }
9079
9104
  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(() => {
9105
+ const [hoveredNodeId, setHoveredNodeId] = React35.useState(null);
9106
+ const [hoveredNodeRect, setHoveredNodeRect] = React35.useState(null);
9107
+ const hideTimeoutRef = React35.useRef(null);
9108
+ const cancelPendingHide = React35.useCallback(() => {
9084
9109
  if (hideTimeoutRef.current !== null) {
9085
9110
  window.clearTimeout(hideTimeoutRef.current);
9086
9111
  hideTimeoutRef.current = null;
9087
9112
  }
9088
9113
  }, []);
9089
- const handleMouseMove = React34.useCallback(
9114
+ const handleMouseMove = React35.useCallback(
9090
9115
  (e, ignoreRef) => {
9091
9116
  const nodeEl = findNodeIdFromEvent(e.target);
9092
9117
  const container = containerRef.current;
@@ -9114,12 +9139,12 @@ function useSmartArtHoverState(containerRef) {
9114
9139
  },
9115
9140
  [containerRef, cancelPendingHide]
9116
9141
  );
9117
- const clearHover = React34.useCallback(() => {
9142
+ const clearHover = React35.useCallback(() => {
9118
9143
  cancelPendingHide();
9119
9144
  setHoveredNodeId(null);
9120
9145
  setHoveredNodeRect(null);
9121
9146
  }, [cancelPendingHide]);
9122
- React34.useEffect(() => cancelPendingHide, [cancelPendingHide]);
9147
+ React35.useEffect(() => cancelPendingHide, [cancelPendingHide]);
9123
9148
  return { hoveredNodeId, hoveredNodeRect, handleMouseMove, clearHover };
9124
9149
  }
9125
9150
  var EDITOR_PADDING = 4;
@@ -9134,11 +9159,11 @@ function SmartArtEditableLayer({
9134
9159
  onChangeNodeStyle,
9135
9160
  children
9136
9161
  }) {
9137
- const containerRef = React34.useRef(null);
9138
- const styleBarRef = React34.useRef(null);
9139
- const [edit, setEdit] = React34.useState(null);
9162
+ const containerRef = React35.useRef(null);
9163
+ const styleBarRef = React35.useRef(null);
9164
+ const [edit, setEdit] = React35.useState(null);
9140
9165
  const { hoveredNodeId, hoveredNodeRect, handleMouseMove, clearHover } = useSmartArtHoverState(containerRef);
9141
- const openEditor = React34.useCallback(
9166
+ const openEditor = React35.useCallback(
9142
9167
  (target) => {
9143
9168
  const nodeEl = findNodeIdFromEvent(target);
9144
9169
  const container = containerRef.current;
@@ -10678,11 +10703,11 @@ function arePropsEqual(prev, next) {
10678
10703
  }
10679
10704
  return true;
10680
10705
  }
10681
- var SmartArtRenderer = React34.memo(SmartArtRendererImpl, arePropsEqual);
10706
+ var SmartArtRenderer = React35.memo(SmartArtRendererImpl, arePropsEqual);
10682
10707
  function FailedToLoad2() {
10683
10708
  return null;
10684
10709
  }
10685
- var LazySmartArt3DScene = React34.lazy(
10710
+ var LazySmartArt3DScene = React35.lazy(
10686
10711
  async () => {
10687
10712
  try {
10688
10713
  return await import('./SmartArt3DScene-XCFVGCXE.mjs');
@@ -10691,7 +10716,7 @@ var LazySmartArt3DScene = React34.lazy(
10691
10716
  }
10692
10717
  }
10693
10718
  );
10694
- var SceneErrorBoundary = class extends React34.Component {
10719
+ var SceneErrorBoundary = class extends React35.Component {
10695
10720
  constructor(props) {
10696
10721
  super(props);
10697
10722
  this.state = { hasError: false };
@@ -11325,6 +11350,7 @@ function renderBody(options) {
11325
11350
  onColResize,
11326
11351
  onRowResize,
11327
11352
  isPresentationPassive,
11353
+ isStaticSurface,
11328
11354
  handleMediaPlayStateChange,
11329
11355
  allSlides,
11330
11356
  onZoomClick,
@@ -11424,6 +11450,13 @@ function renderBody(options) {
11424
11450
  autoPlay: isPresentationPassive,
11425
11451
  fullScreen: isPresentationPassive && Boolean(el.fullScreen),
11426
11452
  isPresentationMode: isPresentationPassive,
11453
+ // A still of a slide never carries a transport, whatever the canvas
11454
+ // does. The rule is shared so the five bindings cannot drift on it.
11455
+ showTransport: mediaTransportVisible({
11456
+ presenting: isPresentationPassive === true,
11457
+ preview: isStaticSurface === true,
11458
+ canvasTransport: true
11459
+ }),
11427
11460
  onPlayStateChange: handleMediaPlayStateChange
11428
11461
  });
11429
11462
  }
@@ -11450,7 +11483,7 @@ function renderBody(options) {
11450
11483
  }
11451
11484
  return renderTextElementBody(options);
11452
11485
  }
11453
- var Extrusion3DOverlay = React34.memo(({ data }) => {
11486
+ var Extrusion3DOverlay = React35.memo(({ data }) => {
11454
11487
  if (!data.hasExtrusion || data.panels.length === 0) {
11455
11488
  return null;
11456
11489
  }
@@ -11483,12 +11516,6 @@ var Extrusion3DOverlay = React34.memo(({ data }) => {
11483
11516
  ] });
11484
11517
  });
11485
11518
  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
11519
 
11493
11520
  // src/viewer/components/elements/scoped-element-handlers.ts
11494
11521
  function getScopedElementHandlers(elementId, options) {
@@ -11555,6 +11582,7 @@ function StaticElementRendererImpl({
11555
11582
  {
11556
11583
  "data-static-element-type": element.type,
11557
11584
  "data-element-id": exposeElementId ? element.id : void 0,
11585
+ "data-pptx-element": exposeElementId ? "true" : void 0,
11558
11586
  "data-pptx-action": isActionable ? "click" : void 0,
11559
11587
  className: `${positioned ? "absolute" : "relative"} overflow-hidden ${isActionable ? "pointer-events-auto cursor-pointer" : "pointer-events-none"}`,
11560
11588
  role: contractRole,
@@ -11631,6 +11659,11 @@ function StaticElementRendererImpl({
11631
11659
  onCommit: noop,
11632
11660
  onCancel: noop,
11633
11661
  isPresentationPassive: false,
11662
+ // This renderer only ever paints a STILL of a slide (presenter
11663
+ // console panes, thumbnails, previews). It is not in presentation
11664
+ // mode, so without saying so a video here would carry Chrome's
11665
+ // scrubber over a slide nobody can play.
11666
+ isStaticSurface: true,
11634
11667
  slideElements: activeSlide?.elements,
11635
11668
  allSlides,
11636
11669
  sourceSlideIndex,
@@ -11643,9 +11676,9 @@ function StaticElementRendererImpl({
11643
11676
  }
11644
11677
  );
11645
11678
  }
11646
- var StaticElementRenderer = React34.memo(StaticElementRendererImpl);
11679
+ var StaticElementRenderer = React35.memo(StaticElementRendererImpl);
11647
11680
  StaticElementRenderer.displayName = "StaticElementRenderer";
11648
- var ElementRenderer = React34.memo(
11681
+ var ElementRenderer = React35.memo(
11649
11682
  // oxlint-disable-next-line prefer-arrow-callback -- named fn gives the memo component its displayName
11650
11683
  function ElementRendererInner({
11651
11684
  element: el,
@@ -11735,6 +11768,7 @@ var ElementRenderer = React34.memo(
11735
11768
  () => build3DExtrusionData(shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height),
11736
11769
  [shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height]
11737
11770
  );
11771
+ const actionAffordance = useActionAffordance(el, canInteract);
11738
11772
  const [isMediaPlaying, setIsMediaPlaying] = useState(false);
11739
11773
  const handleMediaPlayStateChange = useCallback((playing) => {
11740
11774
  setIsMediaPlaying(playing);
@@ -11809,7 +11843,10 @@ var ElementRenderer = React34.memo(
11809
11843
  effectiveCanInteract || isActionable ? "" : "pointer-events-none",
11810
11844
  isFullscreenMedia ? "pointer-events-auto" : "",
11811
11845
  selB,
11812
- effectiveCanInteract && el.actionClick && "group/link"
11846
+ // Shared class the tooltip's `:hover` rule keys off (see
11847
+ // `ACTION_AFFORDANCE_CSS`), replacing React's Tailwind `group/link`
11848
+ // so the four non-Tailwind bindings reveal it the same way.
11849
+ actionAffordance.showLinkTooltip && LINK_TOOLTIP_HOST_CLASS
11813
11850
  ),
11814
11851
  style: getContainerStyle({
11815
11852
  el,
@@ -11887,20 +11924,7 @@ var ElementRenderer = React34.memo(
11887
11924
  onUpdateChartElement: chartUpdateHandler,
11888
11925
  onFormatText
11889
11926
  }),
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
- ),
11927
+ /* @__PURE__ */ jsx(ActionAffordances, { affordance: actionAffordance }),
11904
11928
  effectiveShowResizeHandles && !effectiveIsInlineEditing && /* @__PURE__ */ jsx(
11905
11929
  ResizeHandles,
11906
11930
  {
@@ -12916,7 +12940,7 @@ function arePropsEqual2(prev, next) {
12916
12940
  }
12917
12941
  return true;
12918
12942
  }
12919
- var SlideThumbnail = React34.memo(SlideThumbnailImpl, arePropsEqual2);
12943
+ var SlideThumbnail = React35.memo(SlideThumbnailImpl, arePropsEqual2);
12920
12944
 
12921
12945
  // src/viewer/components/context-menu-dispatch.ts
12922
12946
  function tableCell(props) {
@@ -13465,7 +13489,7 @@ function LazyThumbnailInner({
13465
13489
  }
13466
13490
  ) });
13467
13491
  }
13468
- var LazyThumbnail = React34.memo(LazyThumbnailInner);
13492
+ var LazyThumbnail = React35.memo(LazyThumbnailInner);
13469
13493
 
13470
13494
  // src/viewer/components/slides-pane/utils.ts
13471
13495
  function formatTimingMs(ms) {
@@ -13619,7 +13643,7 @@ function SlideItemInner({
13619
13643
  }
13620
13644
  );
13621
13645
  }
13622
- var SlideItem = React34.memo(SlideItemInner);
13646
+ var SlideItem = React35.memo(SlideItemInner);
13623
13647
  function useSlidePaneCallbacks(onMoveSlide, onRenameSection) {
13624
13648
  const [collapsedSections, setCollapsedSections] = useState({});
13625
13649
  const [renamingSectionId, setRenamingSectionId] = useState(null);
@@ -14896,7 +14920,7 @@ function arePropsEqual3(prev, next) {
14896
14920
  }
14897
14921
  return true;
14898
14922
  }
14899
- var SlideCard = React34.memo(SlideCardImpl, arePropsEqual3);
14923
+ var SlideCard = React35.memo(SlideCardImpl, arePropsEqual3);
14900
14924
  function SorterContextMenu({
14901
14925
  x,
14902
14926
  y,
@@ -18725,102 +18749,121 @@ function PresentationSubtitleBar({
18725
18749
  function renderNotesSegments(segments) {
18726
18750
  return notesSegmentsToSpans(segments).map((span) => {
18727
18751
  if (span.kind === "break") {
18728
- return React34.createElement("br", { key: span.key });
18752
+ return React35.createElement("br", { key: span.key });
18729
18753
  }
18730
- return React34.createElement(
18754
+ return React35.createElement(
18731
18755
  "span",
18732
18756
  { key: span.key, style: span.style },
18733
18757
  span.text
18734
18758
  );
18735
18759
  });
18736
18760
  }
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"}`;
18761
+ var CONSOLE_ICONS = {
18762
+ "arrow-left-right": LuArrowLeftRight,
18763
+ captions: LuCaptions,
18764
+ "circle-pause": LuCirclePause,
18765
+ "circle-play": LuCirclePlay,
18766
+ eraser: LuEraser,
18767
+ "grid-2x2": LuGrid2X2,
18768
+ highlighter: LuHighlighter,
18769
+ monitor: LuMonitor,
18770
+ "monitor-off": LuMonitorOff,
18771
+ "mouse-pointer-2": LuMousePointer2,
18772
+ "pen-tool": LuPenTool,
18773
+ "rotate-ccw": LuRotateCcw,
18774
+ scan: LuScan,
18775
+ x: LuX,
18776
+ "zoom-in": LuZoomIn,
18777
+ "zoom-out": LuZoomOut
18778
+ };
18779
+ var POINTER_TOOLS = {
18780
+ laser: "laser",
18781
+ pen: "pen",
18782
+ highlighter: "highlighter",
18783
+ eraser: "eraser"
18784
+ };
18785
+ function slotState(control, props) {
18786
+ const snapshot = props.snapshot;
18787
+ const pointerTool = snapshot.pointer?.tool ?? "none";
18788
+ const tool = POINTER_TOOLS[control.id];
18789
+ if (tool) {
18790
+ return {
18791
+ active: pointerTool === tool,
18792
+ onClick: () => props.onPointerTool(pointerTool === tool ? "none" : tool)
18793
+ };
18794
+ }
18795
+ switch (control.id) {
18796
+ case "timer-toggle":
18797
+ return { active: Boolean(snapshot.paused), onClick: props.onToggleTimer };
18798
+ case "timer-reset":
18799
+ return { active: false, onClick: props.onResetTimer };
18800
+ case "all-slides":
18801
+ return { active: false, onClick: props.onShowSlides };
18802
+ case "zoom-in":
18803
+ return { active: (snapshot.zoom?.scale ?? 1) > 1, onClick: () => props.onStepZoom(1) };
18804
+ case "zoom-out":
18805
+ return { active: false, onClick: () => props.onStepZoom(-1) };
18806
+ case "zoom-reset":
18807
+ return { active: false, onClick: props.onResetZoom };
18808
+ case "blackout-black":
18809
+ return {
18810
+ active: snapshot.blackout === "black",
18811
+ onClick: () => props.onBlackout(snapshot.blackout === "black" ? "none" : "black")
18812
+ };
18813
+ case "blackout-white":
18814
+ return {
18815
+ active: snapshot.blackout === "white",
18816
+ onClick: () => props.onBlackout(snapshot.blackout === "white" ? "none" : "white")
18817
+ };
18818
+ case "captions":
18819
+ return { active: Boolean(snapshot.subtitlesVisible), onClick: props.onToggleSubtitles };
18820
+ case "audience":
18821
+ return { active: props.audienceOpen, onClick: props.onToggleAudience };
18822
+ case "swap-displays":
18823
+ return { active: false, onClick: props.onSwapDisplays, disabled: !props.audienceOpen };
18824
+ case "end":
18825
+ return { active: false, onClick: props.onExit };
18826
+ default:
18827
+ return { active: false, onClick: () => void 0 };
18828
+ }
18829
+ }
18738
18830
  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(
18831
+ const { t } = useTranslation();
18832
+ return /* @__PURE__ */ jsx("div", { className: PRESENTER_CONSOLE_CLASSES.strip, "data-pptx-presenter-toolbar": true, children: PRESENTER_CONSOLE_CONTROLS.map((control) => {
18833
+ if (control.kind === "divider" || control.kind === "spacer") {
18834
+ return /* @__PURE__ */ jsx(
18835
+ "span",
18836
+ {
18837
+ "data-pptx-presenter-control": control.id,
18838
+ className: control.kind === "divider" ? PRESENTER_CONSOLE_CLASSES.divider : PRESENTER_CONSOLE_CLASSES.spacer
18839
+ },
18840
+ control.id
18841
+ );
18842
+ }
18843
+ const state = slotState(control, props);
18844
+ const labelKey = state.active && control.activeLabelKey ? control.activeLabelKey : control.labelKey;
18845
+ const iconName = state.active && control.activeIcon ? control.activeIcon : control.icon;
18846
+ const Icon = iconName === void 0 ? void 0 : CONSOLE_ICONS[iconName];
18847
+ const label = labelKey === void 0 ? void 0 : t(labelKey);
18848
+ return /* @__PURE__ */ jsxs(
18762
18849
  "button",
18763
18850
  {
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, {})
18851
+ type: "button",
18852
+ "data-pptx-presenter-control": control.id,
18853
+ className: state.active ? PRESENTER_CONSOLE_CLASSES.controlActive : PRESENTER_CONSOLE_CLASSES.control,
18854
+ onClick: state.onClick,
18855
+ disabled: state.disabled,
18856
+ "aria-label": label,
18857
+ title: label,
18858
+ "aria-pressed": control.kind === "toggle" ? state.active : void 0,
18859
+ children: [
18860
+ Icon ? /* @__PURE__ */ jsx(Icon, {}) : null,
18861
+ control.glyph
18862
+ ]
18768
18863
  },
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
- ] });
18864
+ control.id
18865
+ );
18866
+ }) });
18824
18867
  }
18825
18868
  function ScaledSlidePreviewImpl({
18826
18869
  slide,
@@ -18934,7 +18977,7 @@ function arePropsEqual4(prev, next) {
18934
18977
  }
18935
18978
  return true;
18936
18979
  }
18937
- var ScaledSlidePreview = React34.memo(ScaledSlidePreviewImpl, arePropsEqual4);
18980
+ var ScaledSlidePreview = React35.memo(ScaledSlidePreviewImpl, arePropsEqual4);
18938
18981
  function PresenterNotesRail({
18939
18982
  slides,
18940
18983
  current,
@@ -18957,14 +19000,14 @@ function PresenterNotesRail({
18957
19000
  () => notesSegments?.length ? renderNotesSegments(notesSegments) : notesText.trim() ? notesText : /* @__PURE__ */ jsx("span", { className: "italic text-muted-foreground", children: t("pptx.presenter.noNotes") }),
18958
19001
  [notesSegments, notesText, t]
18959
19002
  );
18960
- return /* @__PURE__ */ jsxs("aside", { className: "flex flex-[3] min-w-[260px] max-w-[440px] flex-col border-l border-border bg-background", children: [
19003
+ return /* @__PURE__ */ jsxs("aside", { className: PRESENTER_CONSOLE_CLASSES.rail, children: [
18961
19004
  /* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between border-b border-border/60 px-4 py-3", children: [
18962
19005
  /* @__PURE__ */ jsxs("div", { children: [
18963
- /* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: t("pptx.presenter.currentTime") }),
19006
+ /* @__PURE__ */ jsx("div", { className: PRESENTER_CONSOLE_CLASSES.railHeading, children: t("pptx.presenter.currentTime") }),
18964
19007
  /* @__PURE__ */ jsx("div", { className: "font-mono text-lg tabular-nums", children: formatTime(new Date(now)) })
18965
19008
  ] }),
18966
19009
  /* @__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") }),
19010
+ /* @__PURE__ */ jsx("div", { className: PRESENTER_CONSOLE_CLASSES.railHeading, children: t("pptx.presenter.elapsed") }),
18968
19011
  /* @__PURE__ */ jsx("div", { className: "font-mono text-lg tabular-nums text-primary", children: formatElapsed(elapsed) })
18969
19012
  ] })
18970
19013
  ] }),
@@ -18974,7 +19017,8 @@ function PresenterNotesRail({
18974
19017
  {
18975
19018
  type: "button",
18976
19019
  onClick: () => onMove(-1),
18977
- disabled: current === 0,
19020
+ disabled: presenterPrevDisabled(current),
19021
+ "data-pptx-presenter-control": "prev",
18978
19022
  className: "inline-flex items-center gap-1 rounded bg-muted px-3 py-1.5 text-xs disabled:opacity-40",
18979
19023
  children: [
18980
19024
  /* @__PURE__ */ jsx(LuChevronLeft, {}),
@@ -18993,6 +19037,8 @@ function PresenterNotesRail({
18993
19037
  {
18994
19038
  type: "button",
18995
19039
  onClick: () => onMove(1),
19040
+ disabled: presenterNextDisabled(),
19041
+ "data-pptx-presenter-control": "next",
18996
19042
  className: "inline-flex items-center gap-1 rounded bg-muted px-3 py-1.5 text-xs disabled:opacity-40",
18997
19043
  children: [
18998
19044
  t("pptx.presenter.next"),
@@ -19002,8 +19048,8 @@ function PresenterNotesRail({
19002
19048
  }
19003
19049
  )
19004
19050
  ] }),
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") }),
19051
+ /* @__PURE__ */ jsxs("section", { className: "border-b border-border/60 px-4 py-3", "data-pptx-presenter-next-preview": true, children: [
19052
+ /* @__PURE__ */ jsx("div", { className: `mb-2 ${PRESENTER_CONSOLE_CLASSES.railHeading}`, children: t("pptx.presenter.nextSlidePreview") }),
19007
19053
  nextSlide ? /* @__PURE__ */ jsx(
19008
19054
  ScaledSlidePreview,
19009
19055
  {
@@ -19013,9 +19059,9 @@ function PresenterNotesRail({
19013
19059
  }
19014
19060
  ) : /* @__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
19061
  ] }),
19016
- /* @__PURE__ */ jsxs("section", { className: "flex min-h-0 flex-1 flex-col px-4 py-3", children: [
19062
+ /* @__PURE__ */ jsxs("section", { className: "flex min-h-0 flex-1 flex-col px-4 py-3", "data-pptx-presenter-notes": true, children: [
19017
19063
  /* @__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") }),
19064
+ /* @__PURE__ */ jsx("div", { className: PRESENTER_CONSOLE_CLASSES.railHeading, children: t("pptx.presenter.speakerNotes") }),
19019
19065
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
19020
19066
  /* @__PURE__ */ jsx(
19021
19067
  "button",
@@ -19023,6 +19069,7 @@ function PresenterNotesRail({
19023
19069
  type: "button",
19024
19070
  onClick: () => setFontSize(clampNotesFontSize(fontSize - NOTES_FONT_SIZE_STEP)),
19025
19071
  disabled: fontSize <= NOTES_FONT_SIZE_MIN,
19072
+ "data-pptx-presenter-control": "notes-font-decrease",
19026
19073
  "aria-label": t("pptx.presenter.decreaseFontSize"),
19027
19074
  children: /* @__PURE__ */ jsx(LuMinus, {})
19028
19075
  }
@@ -19037,6 +19084,7 @@ function PresenterNotesRail({
19037
19084
  type: "button",
19038
19085
  onClick: () => setFontSize(clampNotesFontSize(fontSize + NOTES_FONT_SIZE_STEP)),
19039
19086
  disabled: fontSize >= NOTES_FONT_SIZE_MAX,
19087
+ "data-pptx-presenter-control": "notes-font-increase",
19040
19088
  "aria-label": t("pptx.presenter.increaseFontSize"),
19041
19089
  children: /* @__PURE__ */ jsx(LuPlus, {})
19042
19090
  }
@@ -19065,17 +19113,27 @@ function PresenterNotesRail({
19065
19113
  ] });
19066
19114
  }
19067
19115
  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: [
19116
+ const { t } = useTranslation();
19117
+ return /* @__PURE__ */ jsxs("div", { className: `${PRESENTER_CONSOLE_CLASSES.navigator} text-foreground`, children: [
19118
+ /* @__PURE__ */ jsxs("header", { className: "mb-4 flex items-center justify-between border-b border-border pb-4", children: [
19070
19119
  /* @__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" })
19120
+ /* @__PURE__ */ jsx("p", { className: "text-xs uppercase tracking-[0.22em] text-sky-300", children: t(PRESENTER_NAVIGATOR_LABEL_KEYS.title) }),
19121
+ /* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold", children: t(PRESENTER_NAVIGATOR_LABEL_KEYS.subtitle) })
19073
19122
  ] }),
19074
- /* @__PURE__ */ jsx("button", { className: "rounded-md bg-muted px-4 py-2 hover:bg-accent", onClick: props.onClose, children: "Close" })
19123
+ /* @__PURE__ */ jsx(
19124
+ "button",
19125
+ {
19126
+ type: "button",
19127
+ className: "rounded-md bg-muted px-4 py-2 hover:bg-accent",
19128
+ onClick: props.onClose,
19129
+ children: t(PRESENTER_NAVIGATOR_LABEL_KEYS.close)
19130
+ }
19131
+ )
19075
19132
  ] }),
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(
19133
+ /* @__PURE__ */ jsx("div", { className: PRESENTER_CONSOLE_CLASSES.navigatorGrid, children: props.slides.map((slide, index) => /* @__PURE__ */ jsxs(
19077
19134
  "button",
19078
19135
  {
19136
+ type: "button",
19079
19137
  className: `group text-left ${index === props.current ? "ring-2 ring-sky-400" : ""} ${slide.hidden ? "opacity-45" : ""}`,
19080
19138
  onClick: () => props.onSelect(index),
19081
19139
  children: [
@@ -19219,10 +19277,8 @@ function PresenterView({
19219
19277
  if (!currentSlide) {
19220
19278
  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
19279
  }
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: [
19280
+ const timerProgress = presenterTimerProgress(elapsed);
19281
+ return /* @__PURE__ */ jsxs("div", { className: PRESENTER_CONSOLE_CLASSES.root, children: [
19226
19282
  /* @__PURE__ */ jsx(
19227
19283
  PresenterConsoleToolbar,
19228
19284
  {
@@ -19243,14 +19299,14 @@ function PresenterView({
19243
19299
  onExit
19244
19300
  }
19245
19301
  ),
19246
- /* @__PURE__ */ jsxs("div", { className: "flex flex-1 min-h-0", children: [
19302
+ /* @__PURE__ */ jsxs("div", { className: PRESENTER_CONSOLE_CLASSES.body, children: [
19247
19303
  /* @__PURE__ */ jsxs(
19248
19304
  "div",
19249
19305
  {
19250
19306
  role: "presentation",
19251
19307
  "data-pptx-presenter-slide": true,
19252
19308
  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" : ""}`,
19309
+ className: `${PRESENTER_CONSOLE_CLASSES.main} ${paneAdvancesOnClick ? "cursor-pointer" : ""}`,
19254
19310
  children: [
19255
19311
  endOfShowVisible && /* @__PURE__ */ jsx(PresentationEndOverlay, { onExit: () => onMovePresentationSlide(1) }),
19256
19312
  /* @__PURE__ */ jsxs(
@@ -19320,18 +19376,21 @@ function PresenterView({
19320
19376
  /* @__PURE__ */ jsx(
19321
19377
  "div",
19322
19378
  {
19323
- className: "h-1.5 w-full bg-muted/60 flex-shrink-0",
19379
+ className: PRESENTER_CONSOLE_CLASSES.progressTrack,
19324
19380
  role: "progressbar",
19325
- "aria-valuenow": Math.round(timerProgress),
19381
+ "aria-valuenow": Math.round(timerProgress.percent),
19326
19382
  "aria-valuemin": 0,
19327
19383
  "aria-valuemax": 100,
19328
19384
  "aria-label": t("pptx.presenter.timerProgress"),
19329
- title: `${formatElapsed(elapsed)} (segment ${timerSegment + 1})`,
19385
+ title: t("pptx.presenter.timerTitle", {
19386
+ elapsed: formatElapsed(elapsed),
19387
+ segment: timerProgress.segment + 1
19388
+ }),
19330
19389
  children: /* @__PURE__ */ jsx(
19331
19390
  "div",
19332
19391
  {
19333
- className: "h-full bg-primary transition-[width] duration-1000 ease-linear",
19334
- style: { width: `${timerProgress}%` }
19392
+ className: PRESENTER_CONSOLE_CLASSES.progressFill,
19393
+ style: { width: `${timerProgress.percent}%` }
19335
19394
  }
19336
19395
  )
19337
19396
  }
@@ -19362,8 +19421,8 @@ function MobilePresenterView({
19362
19421
  const notesText = currentSlide.notes ?? "";
19363
19422
  const notesSegments = currentSlide.notesSegments;
19364
19423
  const hasRichNotes = notesSegments && notesSegments.length > 0;
19365
- const atFirst = isFirstSlide(currentSlideIndex);
19366
- const atLast = isLastSlide(currentSlideIndex, slides.length);
19424
+ const prevDisabled = presenterPrevDisabled(currentSlideIndex);
19425
+ const nextDisabled = presenterNextDisabled();
19367
19426
  const insetStyle = {
19368
19427
  paddingTop: "env(safe-area-inset-top, 0px)",
19369
19428
  paddingBottom: "env(safe-area-inset-bottom, 0px)",
@@ -19417,8 +19476,9 @@ function MobilePresenterView({
19417
19476
  "button",
19418
19477
  {
19419
19478
  type: "button",
19479
+ "data-pptx-presenter-control": "prev",
19420
19480
  onClick: () => onMovePresentationSlide(-1),
19421
- disabled: atFirst,
19481
+ disabled: prevDisabled,
19422
19482
  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
19483
  title: t("pptx.presenter.previousSlide"),
19424
19484
  "aria-label": t("pptx.presenter.previousSlide"),
@@ -19432,8 +19492,9 @@ function MobilePresenterView({
19432
19492
  "button",
19433
19493
  {
19434
19494
  type: "button",
19495
+ "data-pptx-presenter-control": "next",
19435
19496
  onClick: () => onMovePresentationSlide(1),
19436
- disabled: atLast,
19497
+ disabled: nextDisabled,
19437
19498
  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
19499
  title: t("pptx.presenter.nextSlide"),
19439
19500
  "aria-label": t("pptx.presenter.nextSlide"),
@@ -22426,7 +22487,7 @@ function ConnectorArrowsSection({
22426
22487
  ["Start", "End"].map((end) => {
22427
22488
  const widthKey = end === "Start" ? "connectorStartArrowWidth" : "connectorEndArrowWidth";
22428
22489
  const lengthKey = end === "Start" ? "connectorStartArrowLength" : "connectorEndArrowLength";
22429
- return /* @__PURE__ */ jsxs(React34.Fragment, { children: [
22490
+ return /* @__PURE__ */ jsxs(React35.Fragment, { children: [
22430
22491
  /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1", children: [
22431
22492
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t(END_LABEL_KEYS[end].width) }),
22432
22493
  /* @__PURE__ */ jsx(
@@ -25255,7 +25316,7 @@ function StrokeEffectsSection({
25255
25316
  ] }),
25256
25317
  EFFECT_CONFIGS.map((cfg) => {
25257
25318
  const on = cfg.isOn(style);
25258
- return /* @__PURE__ */ jsxs(React34.Fragment, { children: [
25319
+ return /* @__PURE__ */ jsxs(React35.Fragment, { children: [
25259
25320
  /* @__PURE__ */ jsxs("label", { className: `inline-flex items-center gap-2 text-foreground ${COL2}`, children: [
25260
25321
  /* @__PURE__ */ jsx(
25261
25322
  "input",
@@ -26092,7 +26153,7 @@ function TextWarpGallery({
26092
26153
  onUpdateTextStyle
26093
26154
  }) {
26094
26155
  const { t } = useTranslation();
26095
- const [expanded, setExpanded] = React34.useState(false);
26156
+ const [expanded, setExpanded] = React35.useState(false);
26096
26157
  const currentPreset = ts?.textWarpPreset || "textNoShape";
26097
26158
  return /* @__PURE__ */ jsxs("div", { className: "mt-2 rounded border border-border bg-card p-2 space-y-2", children: [
26098
26159
  /* @__PURE__ */ jsxs(
@@ -26808,7 +26869,7 @@ function SmartArtStyleControls({
26808
26869
  onChangeStyle
26809
26870
  }) {
26810
26871
  const { t } = useTranslation();
26811
- const translate = React34.useCallback((key) => t(key), [t]);
26872
+ const translate = React35.useCallback((key) => t(key), [t]);
26812
26873
  return /* @__PURE__ */ jsxs(Fragment, { children: [
26813
26874
  /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1 text-[11px]", children: [
26814
26875
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t("pptx.smartart.colorScheme") }),
@@ -26864,9 +26925,9 @@ function SmartArtPropertiesPanel({
26864
26925
  const nodes = smartArtData.nodes ?? [];
26865
26926
  const layout = smartArtData.resolvedLayoutType;
26866
26927
  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(() => {
26928
+ const inputRefs = React35.useRef(/* @__PURE__ */ new Map());
26929
+ const pendingFocusId = React35.useRef(null);
26930
+ React35.useEffect(() => {
26870
26931
  const id = pendingFocusId.current;
26871
26932
  if (id) {
26872
26933
  inputRefs.current.get(id)?.focus();
@@ -29308,7 +29369,7 @@ function PresentationPropertiesPanel({
29308
29369
  onUpdateTagCollections
29309
29370
  }) {
29310
29371
  const { t } = useTranslation();
29311
- const handleTransitionChange = React34.useCallback(
29372
+ const handleTransitionChange = React35.useCallback(
29312
29373
  (updates) => {
29313
29374
  onUpdateSlide({
29314
29375
  transition: mergeSlideTransition(activeSlide?.transition, updates)
@@ -33241,7 +33302,7 @@ function ViewerToolbarSection(props) {
33241
33302
  },
33242
33303
  [activeSlide, propertyHandlers]
33243
33304
  );
33244
- const scopedLayoutOptions = React34.useMemo(
33305
+ const scopedLayoutOptions = React35.useMemo(
33245
33306
  () => scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
33246
33307
  [s.layoutOptions, activeSlide]
33247
33308
  );
@@ -34995,7 +35056,7 @@ ${url}`)) {
34995
35056
  )
34996
35057
  );
34997
35058
  }
34998
- var AiChatPanel = lazy(() => import('./AiChatPanel-CS4CONUO.mjs'));
35059
+ var AiChatPanel = lazy(() => import('./AiChatPanel-4YS6DEIT.mjs'));
34999
35060
  function AiChatPanelLazy(props) {
35000
35061
  return /* @__PURE__ */ jsx(
35001
35062
  Suspense,