pptx-react-viewer 2.19.7 → 2.20.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 (108) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +1 -1
  3. package/dist/{AiChatPanel-WVO66CKC.mjs → AiChatPanel-NRWACXJ7.mjs} +4 -4
  4. package/dist/AiChatPanel-NRWACXJ7.mjs.br +0 -0
  5. package/dist/AiChatPanel-NRWACXJ7.mjs.gz +0 -0
  6. package/dist/{AiChatPanel-MAC2Z5SK.js → AiChatPanel-ZSVNVRM5.js} +24 -24
  7. package/dist/AiChatPanel-ZSVNVRM5.js.br +0 -0
  8. package/dist/AiChatPanel-ZSVNVRM5.js.gz +0 -0
  9. package/dist/{Model3DScene-CU4WGIMH.js → Model3DScene-3HGARMTA.js} +2 -2
  10. package/dist/Model3DScene-3HGARMTA.js.br +0 -0
  11. package/dist/Model3DScene-3HGARMTA.js.gz +0 -0
  12. package/dist/{Model3DScene-PTCZUGIT.mjs → Model3DScene-IFYFOD6F.mjs} +1 -1
  13. package/dist/{Model3DScene-PTCZUGIT.mjs.br → Model3DScene-IFYFOD6F.mjs.br} +0 -0
  14. package/dist/Model3DScene-IFYFOD6F.mjs.gz +0 -0
  15. package/dist/{chunk-ZPNLWBED.mjs → chunk-2MENHAYJ.mjs} +814 -449
  16. package/dist/chunk-2MENHAYJ.mjs.br +0 -0
  17. package/dist/chunk-2MENHAYJ.mjs.gz +0 -0
  18. package/dist/{chunk-GUGHIQ4P.js → chunk-4Z4HEIP5.js} +847 -456
  19. package/dist/chunk-4Z4HEIP5.js.br +0 -0
  20. package/dist/chunk-4Z4HEIP5.js.gz +0 -0
  21. package/dist/{chunk-MVKRI3CZ.js → chunk-6CPUGAK7.js} +2 -0
  22. package/dist/chunk-6CPUGAK7.js.br +0 -0
  23. package/dist/{chunk-MVKRI3CZ.js.gz → chunk-6CPUGAK7.js.gz} +0 -0
  24. package/dist/{chunk-XDF76VFA.js → chunk-GKOJO67G.js} +480 -507
  25. package/dist/chunk-GKOJO67G.js.br +0 -0
  26. package/dist/chunk-GKOJO67G.js.gz +0 -0
  27. package/dist/{chunk-5BG5BANR.mjs → chunk-HZ2PAL7P.mjs} +153 -338
  28. package/dist/chunk-HZ2PAL7P.mjs.br +0 -0
  29. package/dist/chunk-HZ2PAL7P.mjs.gz +0 -0
  30. package/dist/{chunk-V5PW4QCE.js → chunk-LLZ25OVR.js} +178 -172
  31. package/dist/chunk-LLZ25OVR.js.br +0 -0
  32. package/dist/chunk-LLZ25OVR.js.gz +0 -0
  33. package/dist/{chunk-SQJBFMEX.mjs → chunk-MZOZNBRO.mjs} +2 -0
  34. package/dist/chunk-MZOZNBRO.mjs.br +0 -0
  35. package/dist/{chunk-SQJBFMEX.mjs.gz → chunk-MZOZNBRO.mjs.gz} +0 -0
  36. package/dist/{chunk-QZV7XDQG.mjs → chunk-O5BR276S.mjs} +25 -19
  37. package/dist/chunk-O5BR276S.mjs.br +0 -0
  38. package/dist/chunk-O5BR276S.mjs.gz +0 -0
  39. package/dist/{chunk-EVM5OFAD.js → chunk-QJJX2E6I.js} +3 -3
  40. package/dist/chunk-QJJX2E6I.js.br +0 -0
  41. package/dist/chunk-QJJX2E6I.js.gz +0 -0
  42. package/dist/{chunk-DZHCLAH3.mjs → chunk-RJ26DQIM.mjs} +1 -1
  43. package/dist/chunk-RJ26DQIM.mjs.br +0 -0
  44. package/dist/chunk-RJ26DQIM.mjs.gz +0 -0
  45. package/dist/{chunk-LP3Y4NXE.mjs → chunk-SZJLZWEX.mjs} +104 -131
  46. package/dist/chunk-SZJLZWEX.mjs.br +0 -0
  47. package/dist/chunk-SZJLZWEX.mjs.gz +0 -0
  48. package/dist/{chunk-JENKEQZP.js → chunk-WCJ3HF4C.js} +1174 -1359
  49. package/dist/chunk-WCJ3HF4C.js.br +0 -0
  50. package/dist/chunk-WCJ3HF4C.js.gz +0 -0
  51. package/dist/i18n.js +4 -4
  52. package/dist/i18n.js.br +0 -0
  53. package/dist/i18n.js.gz +0 -0
  54. package/dist/i18n.mjs +1 -1
  55. package/dist/i18n.mjs.br +0 -0
  56. package/dist/i18n.mjs.gz +0 -0
  57. package/dist/index.js +47 -47
  58. package/dist/index.js.br +0 -0
  59. package/dist/index.js.gz +0 -0
  60. package/dist/index.mjs +6 -6
  61. package/dist/index.mjs.br +0 -0
  62. package/dist/index.mjs.gz +0 -0
  63. package/dist/internals.d.ts.map +1 -1
  64. package/dist/internals.js +79 -79
  65. package/dist/internals.js.br +0 -0
  66. package/dist/internals.js.gz +0 -0
  67. package/dist/internals.mjs +4 -4
  68. package/dist/internals.mjs.br +0 -0
  69. package/dist/internals.mjs.gz +0 -0
  70. package/dist/pptx-viewer.css +1 -1
  71. package/dist/pptx-viewer.css.br +0 -0
  72. package/dist/pptx-viewer.css.gz +0 -0
  73. package/dist/viewer/index.js +27 -27
  74. package/dist/viewer/index.js.br +0 -0
  75. package/dist/viewer/index.js.gz +0 -0
  76. package/dist/viewer/index.mjs +6 -6
  77. package/dist/viewer/index.mjs.br +0 -0
  78. package/dist/viewer/index.mjs.gz +0 -0
  79. package/package.json +1 -1
  80. package/dist/AiChatPanel-MAC2Z5SK.js.br +0 -0
  81. package/dist/AiChatPanel-MAC2Z5SK.js.gz +0 -0
  82. package/dist/AiChatPanel-WVO66CKC.mjs.br +0 -0
  83. package/dist/AiChatPanel-WVO66CKC.mjs.gz +0 -0
  84. package/dist/Model3DScene-CU4WGIMH.js.br +0 -0
  85. package/dist/Model3DScene-CU4WGIMH.js.gz +0 -0
  86. package/dist/Model3DScene-PTCZUGIT.mjs.gz +0 -0
  87. package/dist/chunk-5BG5BANR.mjs.br +0 -0
  88. package/dist/chunk-5BG5BANR.mjs.gz +0 -0
  89. package/dist/chunk-DZHCLAH3.mjs.br +0 -0
  90. package/dist/chunk-DZHCLAH3.mjs.gz +0 -0
  91. package/dist/chunk-EVM5OFAD.js.br +0 -0
  92. package/dist/chunk-EVM5OFAD.js.gz +0 -0
  93. package/dist/chunk-GUGHIQ4P.js.br +0 -0
  94. package/dist/chunk-GUGHIQ4P.js.gz +0 -0
  95. package/dist/chunk-JENKEQZP.js.br +0 -0
  96. package/dist/chunk-JENKEQZP.js.gz +0 -0
  97. package/dist/chunk-LP3Y4NXE.mjs.br +0 -0
  98. package/dist/chunk-LP3Y4NXE.mjs.gz +0 -0
  99. package/dist/chunk-MVKRI3CZ.js.br +0 -0
  100. package/dist/chunk-QZV7XDQG.mjs.br +0 -0
  101. package/dist/chunk-QZV7XDQG.mjs.gz +0 -0
  102. package/dist/chunk-SQJBFMEX.mjs.br +0 -0
  103. package/dist/chunk-V5PW4QCE.js.br +0 -0
  104. package/dist/chunk-V5PW4QCE.js.gz +0 -0
  105. package/dist/chunk-XDF76VFA.js.br +0 -0
  106. package/dist/chunk-XDF76VFA.js.gz +0 -0
  107. package/dist/chunk-ZPNLWBED.mjs.br +0 -0
  108. package/dist/chunk-ZPNLWBED.mjs.gz +0 -0
@@ -1,12 +1,12 @@
1
- import { computeFocusTargets, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, toRenderableParts } from './chunk-DZHCLAH3.mjs';
2
- import { useReducedMotion, useViewerState, useViewerOptions, useIsMobile, useResizablePanels, useDerivedSlideState, useZoomViewport, useEditorHistory, usePresentationSetup, useTouchGestures, useViewerDialogs, useEditorOperations, useViewerIntegration, useLayoutSwitching, useYjsDocumentSync, useCollaborationLivePatch, useFollowMode, useBroadcastFollower, scopeLayoutOptionsToActiveSlide, useToolbarVisibility, useKeyboardInsets, useModalDismissDrag, useCollaborativeState, useVirtualizedSlides, useSwipeNavigation, useSheetDismissDrag, detectTargetType, parseEmailUrl, parseSlideFromUrl, ACTION_VERB_MAP, downloadBlob } from './chunk-LP3Y4NXE.mjs';
3
- import { MIN_ELEMENT_SIZE, DEFAULT_STROKE_COLOR, getConnectorPathGeometry, buildLineShadowCss, buildLineGlowFilter, renderConnectorMarker, getShapeVisualStyle, getTextStyleForElement, DEFAULT_TEXT_COLOR, renderVectorShape, isConnectorOrLineElement, build3DExtrusionData, getImageRenderStyle, cn, getTextLayoutStyle, renderTableElement, renderMediaElement, shouldRenderFallbackLabel, SHAPE_PRESETS, ANIMATION_PRESET_OPTIONS, DEFAULT_FILL_COLOR, hasDagDuotoneEffect, renderDagDuotoneSvgFilter, getCropShapeClipPath, getImageTilingStyle, getDuotoneColors, getTextWarpStyle, renderTextSegments, buildReactChartViewModel, renderChartElement, buildTextBody3DSceneStyle, SLIDE_NAV_THUMBNAIL_WIDTH, DEFAULT_TEXT_FONT_SIZE, DEFAULT_FONT_FAMILY, TOOLBAR_SECTIONS, DEFAULT_SECTION_GROUP_ID, SHORTCUT_REFERENCE_ITEMS as SHORTCUT_REFERENCE_ITEMS$1, HYPERLINK_COLOR, GRID_SIZE, CONNECTOR_ARROW_OPTIONS, ARROW_SIZE_OPTIONS, startMotionPathPreview, startPreviewAnimation, stopPreviewAnimation, THEME_COLOR_SWATCHES, STROKE_DASH_OPTIONS } from './chunk-QZV7XDQG.mjs';
4
- import { LOCALE_CATALOG, translationsEn } from './chunk-SQJBFMEX.mjs';
5
- import { hasShapeProperties, normalizeHexColor, colorWithOpacity, normalizeStrokeDashType, getSvgStrokeDasharray, getCompoundLineOffsets, getCompoundLineWidths, svgLineCap, hasTextProperties, getElementTransform, getAriaRoleDescription, getAriaLabel, getAriaRole, resolveElementInteractivity, isEditableTextElement, isElementRendered, isElementActionable, getImageEffectsOpacity, getImageEffectsFilter, getElementTransformWithoutRotation, inlineElementPointerEvents, isHollowShapeElement, LINK_TOOLTIP_HOST_CLASS, ACTION_BUTTON_PRESETS, mediaTransportVisible, isInkElement, getGroupChildParentFill, getElementLabel, SWITCHABLE_LAYOUT_TYPES, DEFAULT_VIEWER_OPTIONS, compileEquationTemplateMathMl, buildUserFontFaceStyles, readStoredViewerPrefs, resolveThemeCatalogEntry, THEME_CATALOG, writeStoredViewerPrefs, openPptxFile, readBackstageRecentFile, resolveAutosaveActivation, viewerOptionsToPreferences, applyPreferenceToOptions, listAutosaveSnapshots, deleteAutosaveSnapshot, resolveAutosaveIntervalMs, resolveAutosaveIntervalSeconds, shouldShowAutosaveRecoveryPrompt, paintedStrokeWidth, buildCssGradientFromShapeStyle, ensureActionAffordanceStyles, resolveElementActionAffordance, actionAffordanceLabels, getComputedEffectStyle, getSoftEdgeSvgFilter, buildStrokeOutline, buildHollowHitOutline, strokeOutlineViewBox, revealedSmartArtNodeCount, buildSmartArtA11y, computeSmartArtLayout, flattenNodes, buildSummaryZoomView, isImageTiled, getImageColorWashStyle, isImageLikeElement, placeCaretAtEnd, getPendingSelectionRestore, restoreSegmentSelection, getTextCompensationTransform, ensureChartInteractionStyles, applyChartBuildReveal, formatAxisValue, hasPressureVariation, getInkReplayStyles, INK_REPLAY_KEYFRAMES, resolveInkColor, resolveInkWidth, resolveInkOpacity, pressuresToWidths, getContentPartReplayStyles, resolveOleType, getOleTypeColor, getOleTypeLabel, filterRenderedElements, resolveGroupChildFill, isLinkedTextBox, getOverflowSegments, shouldUseSvgWarp, getTextBodyRotationTransform, RULER_THICKNESS, RULER_FONT_SIZE, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, hiddenSlideCue, HIDDEN_SLIDE_SLASH_GRADIENT, HIDDEN_SLIDE_LABEL_KEY, themeToCssVars, applyMotionPathPreset, resetSlideLayoutPath, DEFAULT_INSERT_CHART_KIND, hasCopyableFormat, templateSchemeFromTheme, createBackstagePresentation, setMasterViewBackgroundColor, printPropertiesFrameSlides, printPropertiesSlidesPerPage, VIEWER_OPTIONS_TABS, DEFAULT_QUICK_ACCESS_COMMAND_IDS, buildJoinCollaborationConfig, buildCreateCollaborationConfig, generateBroadcastRoomId, DEFAULT_BROADCAST_SERVER_URL, buildBroadcastViewerUrl, resolveTransportForServerUrl, ACTION_INDICATOR_CLASS, ACTION_INDICATOR_ICON_PATH, LINK_TOOLTIP_CLASS, LINK_TOOLTIP_PANEL_CLASS, LINK_TOOLTIP_LABEL_CLASS, LINK_TOOLTIP_HINT_CLASS, DEFAULT_PALETTE2, resolvePalette, computeDrawingViewBox, projectDrawingShapes, styleShadowFilter, resolveDrawingShapeNodeId, getImageSvgFilters, buildDuotoneCacheKey, getDuotoneCachedResult, applyDuotone, setDuotoneCachedResult, buildCacheKey, DEFAULT_COLOR_CHANGE_TOLERANCE, getCachedResult, applyColorChange, setCachedResult, findChartPartTarget, dragValueForPart, withChartPointValue, dragAnchorViewY, withChartTitle, buildSmartArt3DModel, extractPathPoints, generatePressureCircles, isBrowserOpenableMime, formatBytes, getOleBadgeLabel, openUrlInNewTab, getSubstituteFontFamily, getWarpPath, getSlideBackgroundStyle, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, masterViewBackgroundColor, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, toggleBlackboard, PRESENT_TOOLBAR_CLASSES, buildContextMenuEntries, themeColorSchemesEqual, EXPANDED_MAX_HEIGHT, 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, CUSTOM_FONT_ACCEPT, activateModalFocus, buildCollaborationShareUrl, buildActiveSessionUsers, SORTER_MIN_ZOOM, SORTER_ZOOM_STEP, SORTER_MAX_ZOOM, canGoPrevious, formatSlideCounter, READING_VIEW_COUNTER_ATTR, canGoNext, READING_VIEW_ATTR, OUTLINE_LEVEL_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_ROW_ATTR, OUTLINE_VIEW_ATTR, mobileElapsedSince, nextPresentedSlide, presenterPrevDisabled, presenterNextDisabled, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, presenterTimerProgress, PRESENTER_CONSOLE_CLASSES, formatElapsed, centeredSvgTextLines, computeInlineEditorRect, findSmartArtNodeText, setSmartArtNodeStyle, rebuildDrawingShapesIfCleared, shouldCommitSmartArtNodeText, updateSmartArtNodeText, groupIntoParagraphs, substituteFieldText, extraQuickAccessCommands, TAB_ROW_ACTION_CLASSES, listBackstageRecentFiles, BACKSTAGE_NAV, INSERT_CHART_TYPES, CHARACTER_SPACING_OPTIONS, RIBBON_SHAPE_SWATCHES, shapeFillChange, shapeOutlineChange, readRibbonTransitionDraft, ribbonTransitionUpdates, playSlideTransitionPreview, RIBBON_TRANSITION_PRESETS, DEFAULT_MOTION_PATH_PRESET_ID, SLIDE_SHOW_OPTIONS, slideShowOptionChange, readSlideShowOption, SLIDE_VIRTUALIZATION_THRESHOLD, PRESENTATION_HIT_TEST_CSS, PRESENTATION_STAGE_ATTRIBUTE, getSlideTransitionAnimations, MORPH_CROSSFADE_GROUP_STYLE, MORPH_CROSSFADE_HALF_STYLE, SLIDE_TRANSITION_KEYFRAMES, annotationOverlayZIndex, presentationInkPath, motionPathFor, setMotionPath, getShapeAdjustmentHandleDescriptors, PRESENTER_NAVIGATOR_LABEL_KEYS, PEN_COLORS, HIGHLIGHTER_COLORS, isBlackboardActive, slideSizeToCanvasPx, resolveSelectionPaneRename, PRESET_THEMES, normalizeSegments, createPlainNotesSegments, segmentsToEditorHtml, DEBOUNCE_MS, parseSegmentsFromRichEditor, segmentsToPlainText, getCurrentParagraphIndex, segmentsToParagraphs, paragraphsToSegments, MAX_INDENT_LEVEL, INDENT_PX, isUrlSafe, escapeHtml2, sanitizeMathMl, computeHandoutLayout, getPrintableArea, generateNoteLineCount, computeAllNotesPages, getNotesPrintableArea, QUICK_ACCESS_COMMAND_CATALOG, registerCustomFont, openReadingView, applyReadingViewCommand, createPresentationKeyBuffer, readingViewFitScale, READING_VIEW_STAGE_ATTR, buildOutline, applyOutlineEdit, mapOutlineKey, notesSegmentsToSpans, erasePresentationInkAt, movePresenterPointer, appendPresentationInkPoint, PRESENTER_CONSOLE_CONTROLS, NOTES_FONT_SIZE_DEFAULT, formatTime, NOTES_FONT_SIZE_MIN, clampNotesFontSize, NOTES_FONT_SIZE_STEP, NOTES_FONT_SIZE_MAX, BACKSTAGE_TEMPLATES, formatBackstageDate, formatBackstageSize, backstageCardsFor, DEFAULT_VIEWER_PROFILE, resolveProfileInitial, AVATAR_COLOR_SWATCHES, resolveDefaultFontFamily, buildFontCatalog, ENTRANCE_PRESET_VALUES, EMPHASIS_PRESET_VALUES, EXIT_PRESET_VALUES, MOTION_PATH_FAMILIES, motionPathFamilyLabelKey, motionPathPresetsByFamily, motionPathPresetLabelKey, masterViewPseudoSlide, authorConnectorBetweenSites, generateTicks, rulerDragToGuidePosition, getCommentMarkerPosition, collectConnectorSiteCandidates, getConnectorEndpointHandles, findConnectorSiteNear, motionPathToSvgD, motionPathEndPixel, isEditableMotionPath, setMotionPathEnd, themeColorLabel, buildThemeColorGrid, THEME_COLOR_SCHEME_KEYS, COMMON_FONTS, buildSmartArtPresetData, handleReadingViewKey, getLocalStorageUsageSummary, saveViewerProfile, clearAllLocalViewerData, isCurrentLayout, SLIDE_TEMPLATES, CONNECTOR_SITE_SNAP_PX, resolveConnectorEndpointUpdate, withConnectorEndpointUpdate, getShapeConnectionSites, isElementLocked, mergeSlideTransition, mapSlideSorterKey, isEditorTextInputTarget, clampSorterZoom, buildLayoutPreviewGeometry, buildSlideTemplateContent, elementLockTogglePatch, 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, resolveSlideSizeSelection, SLIDE_SIZE_PRESETS, 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, slideSizeFromPreset, withSlideSizeOrientation, TRANSITION_DIR_ARROWS, buildDirectionGrid, updateTagInCollections, deleteTagFromCollections, addTagToCollections, commentTextSegments, COMMENT_MENTION_CLASS, COMMENT_MENTION_ATTRIBUTE, 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-ZPNLWBED.mjs';
1
+ import { computeFocusTargets, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, toRenderableParts } from './chunk-RJ26DQIM.mjs';
2
+ import { useReducedMotion, useViewerState, useViewerOptions, useIsMobile, useResizablePanels, useDerivedSlideState, useZoomViewport, useEditorHistory, usePresentationSetup, useTouchGestures, useViewerDialogs, useEditorOperations, useViewerIntegration, useLayoutSwitching, useYjsDocumentSync, useCollaborationLivePatch, useFollowMode, useBroadcastFollower, scopeLayoutOptionsToActiveSlide, useToolbarVisibility, useKeyboardInsets, useModalDismissDrag, useCollaborativeState, useVirtualizedSlides, useSwipeNavigation, useSheetDismissDrag, detectTargetType, parseEmailUrl, parseSlideFromUrl, ACTION_VERB_MAP, downloadBlob } from './chunk-SZJLZWEX.mjs';
3
+ import { MIN_ELEMENT_SIZE, DEFAULT_STROKE_COLOR, getConnectorPathGeometry, buildLineShadowCss, buildLineGlowFilter, renderConnectorMarker, getShapeVisualStyle, getTextStyleForElement, DEFAULT_TEXT_COLOR, renderVectorShape, isConnectorOrLineElement, build3DExtrusionData, getImageRenderStyle, cn, getTextLayoutStyle, renderTableElement, renderMediaElement, shouldRenderFallbackLabel, SHAPE_PRESETS, ANIMATION_PRESET_OPTIONS, DEFAULT_FILL_COLOR, hasDagDuotoneEffect, renderDagDuotoneSvgFilter, getCropShapeClipPath, getImageTilingStyle, getDuotoneColors, getTextWarpStyle, renderTextSegments, buildReactChartViewModel, renderChartElement, buildTextBody3DSceneStyle, SLIDE_NAV_THUMBNAIL_WIDTH, DEFAULT_TEXT_FONT_SIZE, DEFAULT_FONT_FAMILY, TOOLBAR_SECTIONS, DEFAULT_SECTION_GROUP_ID, SHORTCUT_REFERENCE_ITEMS as SHORTCUT_REFERENCE_ITEMS$1, HYPERLINK_COLOR, GRID_SIZE, CONNECTOR_ARROW_OPTIONS, ARROW_SIZE_OPTIONS, startMotionPathPreview, startPreviewAnimation, stopPreviewAnimation, THEME_COLOR_SWATCHES, STROKE_DASH_OPTIONS } from './chunk-O5BR276S.mjs';
4
+ import { LOCALE_CATALOG, translationsEn } from './chunk-MZOZNBRO.mjs';
5
+ import { hasShapeProperties, normalizeHexColor, colorWithOpacity, normalizeStrokeDashType, getSvgStrokeDasharray, getCompoundLineOffsets, getCompoundLineWidths, svgLineCap, hasTextProperties, getElementTransform, getAriaRoleDescription, getAriaLabel, getAriaRole, resolveElementInteractivity, isEditableTextElement, isElementRendered, isElementActionable, getImageEffectsOpacity, getImageEffectsFilter, getElementTransformWithoutRotation, inlineElementPointerEvents, isHollowShapeElement, LINK_TOOLTIP_HOST_CLASS, ACTION_BUTTON_PRESETS, mediaTransportVisible, isInkElement, getGroupChildParentFill, getElementLabel, SWITCHABLE_LAYOUT_TYPES, DEFAULT_VIEWER_OPTIONS, compileEquationTemplateMathMl, buildUserFontFaceStyles, readStoredViewerPrefs, resolveThemeCatalogEntry, THEME_CATALOG, writeStoredViewerPrefs, openPptxFile, readBackstageRecentFile, resolveAutosaveActivation, viewerOptionsToPreferences, applyPreferenceToOptions, listAutosaveSnapshots, deleteAutosaveSnapshot, resolveAutosaveIntervalMs, resolveAutosaveIntervalSeconds, shouldShowAutosaveRecoveryPrompt, paintedStrokeWidth, buildCssGradientFromShapeStyle, ensureActionAffordanceStyles, resolveElementActionAffordance, actionAffordanceLabels, getComputedEffectStyle, getSoftEdgeSvgFilter, buildStrokeOutline, buildHollowHitOutline, strokeOutlineViewBox, revealedSmartArtNodeCount, buildSmartArtA11y, computeSmartArtLayout, flattenNodes, buildSummaryZoomView, isImageTiled, getImageColorWashStyle, isImageLikeElement, placeCaretAtEnd, getPendingSelectionRestore, restoreSegmentSelection, getTextCompensationTransform, ensureChartInteractionStyles, applyChartPartHighlight, applyChartBuildReveal, formatAxisValue, hasPressureVariation, getInkReplayStyles, INK_REPLAY_KEYFRAMES, resolveInkColor, resolveInkWidth, resolveInkOpacity, pressuresToWidths, getContentPartReplayStyles, resolveOleType, getOleTypeColor, getOleTypeLabel, filterRenderedElements, resolveGroupChildFill, isLinkedTextBox, getOverflowSegments, shouldUseSvgWarp, getTextBodyRotationTransform, RULER_THICKNESS, RULER_FONT_SIZE, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, hiddenSlideCue, HIDDEN_SLIDE_SLASH_GRADIENT, HIDDEN_SLIDE_LABEL_KEY, themeToCssVars, applyMotionPathPreset, resetSlideLayoutPath, DEFAULT_INSERT_CHART_KIND, hasCopyableFormat, templateSchemeFromTheme, createBackstagePresentation, setMasterViewBackgroundColor, printPropertiesFrameSlides, printPropertiesSlidesPerPage, VIEWER_OPTIONS_TABS, DEFAULT_QUICK_ACCESS_COMMAND_IDS, buildJoinCollaborationConfig, buildCreateCollaborationConfig, generateBroadcastRoomId, DEFAULT_BROADCAST_SERVER_URL, buildBroadcastViewerUrl, resolveTransportForServerUrl, ACTION_INDICATOR_CLASS, ACTION_INDICATOR_ICON_PATH, LINK_TOOLTIP_CLASS, LINK_TOOLTIP_PANEL_CLASS, LINK_TOOLTIP_LABEL_CLASS, LINK_TOOLTIP_HINT_CLASS, DEFAULT_PALETTE2, resolvePalette, computeDrawingViewBox, projectDrawingShapes, styleShadowFilter, resolveDrawingShapeNodeId, buildChromeStyle, getImageSvgFilters, buildDuotoneCacheKey, getDuotoneCachedResult, applyDuotone, setDuotoneCachedResult, buildCacheKey, DEFAULT_COLOR_CHANGE_TOLERANCE, getCachedResult, applyColorChange, setCachedResult, findChartPartTarget, advanceChartValueDrag, beginChartValueDrag, withChartTitle, buildSmartArt3DModel, extractPathPoints, generatePressureCircles, isBrowserOpenableMime, formatBytes, getOleBadgeLabel, openUrlInNewTab, getSubstituteFontFamily, getWarpPath, getSlideBackgroundStyle, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, masterViewBackgroundColor, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, toggleBlackboard, PRESENT_TOOLBAR_CLASSES, buildContextMenuEntries, themeColorSchemesEqual, EXPANDED_MAX_HEIGHT, STATUS_BAR_CLASSES, buildBarActions, formatVersionTimestamp, formatRelativeTime, scanAvailableFontFamilies, PRESETS, CATEGORIES, convertOmmlToLatex, compileLatexEquation, convertLatexToOmml, EQUATION_TEMPLATES, clampPercent, HANDOUT_OPTIONS, TOOLBAR_TABS, SHORTCUT_REFERENCE_ITEMS, resolveViewerAddinRows, availableQuickAccessCommands, addQuickAccessCommand, removeQuickAccessCommand, moveQuickAccessCommand, CUSTOM_FONT_ACCEPT, activateModalFocus, buildCollaborationShareUrl, buildActiveSessionUsers, SORTER_MIN_ZOOM, SORTER_ZOOM_STEP, SORTER_MAX_ZOOM, canGoPrevious, formatSlideCounter, READING_VIEW_COUNTER_ATTR, canGoNext, READING_VIEW_ATTR, OUTLINE_LEVEL_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_ROW_ATTR, OUTLINE_VIEW_ATTR, mobileElapsedSince, nextPresentedSlide, presenterPrevDisabled, presenterNextDisabled, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, presenterTimerProgress, PRESENTER_CONSOLE_CLASSES, formatElapsed, centeredSvgTextLines, computeInlineEditorRect, findSmartArtNodeText, setSmartArtNodeStyle, rebuildDrawingShapesIfCleared, shouldCommitSmartArtNodeText, updateSmartArtNodeText, groupIntoParagraphs, substituteFieldText, extraQuickAccessCommands, TAB_ROW_ACTION_CLASSES, listBackstageRecentFiles, BACKSTAGE_NAV, INSERT_CHART_TYPES, CHARACTER_SPACING_OPTIONS, RIBBON_SHAPE_SWATCHES, shapeFillChange, shapeOutlineChange, readRibbonTransitionDraft, ribbonTransitionUpdates, playSlideTransitionPreview, RIBBON_TRANSITION_PRESETS, DEFAULT_MOTION_PATH_PRESET_ID, SLIDE_SHOW_OPTIONS, slideShowOptionChange, readSlideShowOption, SLIDE_VIRTUALIZATION_THRESHOLD, PRESENTATION_HIT_TEST_CSS, PRESENTATION_STAGE_ATTRIBUTE, getSlideTransitionAnimations, MORPH_CROSSFADE_GROUP_STYLE, MORPH_CROSSFADE_HALF_STYLE, SLIDE_TRANSITION_KEYFRAMES, annotationOverlayZIndex, presentationInkPath, motionPathFor, setMotionPath, getShapeAdjustmentHandleDescriptors, PRESENTER_NAVIGATOR_LABEL_KEYS, PEN_COLORS, HIGHLIGHTER_COLORS, isBlackboardActive, slideSizeToCanvasPx, resolveSelectionPaneRename, PRESET_THEMES, normalizeSegments, createPlainNotesSegments, segmentsToEditorHtml, DEBOUNCE_MS, parseSegmentsFromRichEditor, segmentsToPlainText, getCurrentParagraphIndex, segmentsToParagraphs, paragraphsToSegments, MAX_INDENT_LEVEL, INDENT_PX, isUrlSafe, escapeHtml2, toggleSheet, sanitizeMathMl, computeHandoutLayout, getPrintableArea, generateNoteLineCount, computeAllNotesPages, getNotesPrintableArea, clampOptionNumber, QUICK_ACCESS_COMMAND_CATALOG, registerCustomFont, openReadingView, applyReadingViewCommand, createPresentationKeyBuffer, readingViewFitScale, READING_VIEW_STAGE_ATTR, buildOutline, applyOutlineEdit, mapOutlineKey, notesSegmentsToSpans, erasePresentationInkAt, movePresenterPointer, appendPresentationInkPoint, PRESENTER_CONSOLE_CONTROLS, NOTES_FONT_SIZE_DEFAULT, formatTime, NOTES_FONT_SIZE_MIN, clampNotesFontSize, NOTES_FONT_SIZE_STEP, NOTES_FONT_SIZE_MAX, BACKSTAGE_TEMPLATES, formatBackstageDate, formatBackstageSize, backstageCardsFor, DEFAULT_VIEWER_PROFILE, resolveProfileInitial, AVATAR_COLOR_SWATCHES, resolveDefaultFontFamily, buildFontCatalog, ENTRANCE_PRESET_VALUES, EMPHASIS_PRESET_VALUES, EXIT_PRESET_VALUES, MOTION_PATH_FAMILIES, motionPathFamilyLabelKey, motionPathPresetsByFamily, motionPathPresetLabelKey, masterViewPseudoSlide, authorConnectorBetweenSites, generateTicks, rulerDragToGuidePosition, buildCommentMarkers, COMMENT_MARKER_SIZE, collectConnectorSiteCandidates, getConnectorEndpointHandles, findConnectorSiteNear, motionPathToSvgD, motionPathEndPixel, isEditableMotionPath, setMotionPathEnd, themeColorLabel, buildThemeColorGrid, THEME_COLOR_SCHEME_KEYS, COMMON_FONTS, buildSmartArtPresetData, handleReadingViewKey, getLocalStorageUsageSummary, saveViewerProfile, clearAllLocalViewerData, isCurrentLayout, SLIDE_TEMPLATES, CONNECTOR_SITE_SNAP_PX, resolveConnectorEndpointUpdate, withConnectorEndpointUpdate, getShapeConnectionSites, isElementLocked, mergeSlideTransition, mapSlideSorterKey, isEditorTextInputTarget, clampSorterZoom, buildLayoutPreviewGeometry, buildSlideTemplateContent, elementLockTogglePatch, buildTableDataGrid, appendTableElementRow, removeLastTableElementRow, appendTableElementColumn, removeLastTableElementColumn, removeTableElementColumn, removeTableElementRow, setTableElementCellText, TABLE_STYLE_PRESETS, applyTableStylePreset, evenColumnWidths, redistributeColumnWidth, evenRowHeights, chartDataChangeType, setChartCategoryLabel, setChartCellValue, addChartCategory, removeChartCategory, addChartSeries, removeChartSeries, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, setChartDataPointMarker, setChartDataPointLabel, describeSmartArtBounds, canAddTopLevelNode, classifyExtraConnections, siblingIndex, siblingCount, canRemoveTopLevelNode, getOleObjectTypeLabel, sanitizeGradientStops, pptxActionToElementAction, withFrameSlides, withSlidesPerPage, applyThemeOverrideToSlide, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, schemaLabel, THEME_COLOR_SLOT_LABEL_KEYS, resolveSlideSizeSelection, SLIDE_SIZE_PRESETS, TRANSITION_VALID_DIRECTIONS, TRANSITION_ORIENTATION_TYPES, clampTransitionNumber, flattenTagCollections, formatCommentTimestamp, clearMotionPath, DIRECTIONAL_PRESETS, buildAnimationTimelineBars, motionPathPresetIdForPath, computeMergeCellRight, computeMergeCellDown, computeSplitCell, SMARTART_COLOR_SCHEME_LABEL_KEYS, SMARTART_STYLE_LABEL_KEYS, addSmartArtNodeAsChild, removeSmartArtNode, addSiblingAfter, removeEmptyNode, demote, promote, reorder, clampCropValue, DUOTONE_PRESETS, ARTISTIC_EFFECTS, resolveActionType, ELEMENT_ACTION_TYPE_OPTIONS, toSlideIndex, elementActionToPptxAction, canCommitActionType, slideSizeFromPreset, withSlideSizeOrientation, TRANSITION_DIR_ARROWS, buildDirectionGrid, updateTagInCollections, deleteTagFromCollections, addTagToCollections, commentTextSegments, COMMENT_MENTION_CLASS, COMMENT_MENTION_ATTRIBUTE, reorderAnimationTo, animationEffectLabel, LBL, SEL, FILL_MODE_OPTIONS, SECTION_HEADING, NUM, switchSmartArtLayout, 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-2MENHAYJ.mjs';
6
6
  import React14, { createContext, useMemo, useState, useCallback, lazy, forwardRef, useEffect, useRef, Suspense, useLayoutEffect, useContext, 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, LuHistory, LuTrash2, LuSettings, LuX, LuCalendarDays, LuHash, LuText, LuCast, LuSave, LuUndo, LuRedo, LuSearch, LuShieldCheck, LuPlus, LuPanelLeftClose, LuStickyNote, LuMonitor, LuColumns2, LuPresentation, LuMinus, LuLayers, LuSettings2, LuClock, LuDownload, LuCheck, LuLock, LuEye, LuFileText, LuType, LuLoader, LuShieldAlert, LuSignature, LuInfo, LuTriangleAlert, LuPrinter, LuPenTool, LuBug, LuChevronUp, LuChevronDown, LuUpload, 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, LuBold, LuItalic, LuUnderline, LuStrikethrough, LuLink, LuGrid2X2, LuCopyPlus, LuScan, LuMonitorOff, LuCirclePlay, LuCirclePause, LuArrowLeftRight, LuClipboardCopy, LuWand, LuTextCursorInput, LuFile, LuEllipsis, LuUserRound, LuFilePlus2, LuHouse, LuPackage, LuFileJson, LuBox, LuFileImage, LuUser, LuHardDrive, LuLogIn, LuLayoutTemplate, 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, LuHistory, LuTrash2, LuSettings, LuX, LuCalendarDays, LuHash, LuText, LuCast, LuSave, LuUndo, LuRedo, LuSearch, LuShieldCheck, LuPlus, LuPanelLeftClose, LuStickyNote, LuMonitor, LuColumns2, LuPresentation, LuMinus, LuSettings2, LuLayers, LuClock, LuDownload, LuCheck, LuLock, LuEye, LuFileText, LuType, LuLoader, LuShieldAlert, LuSignature, LuInfo, LuTriangleAlert, LuPrinter, LuPenTool, LuBug, LuChevronUp, LuChevronDown, LuUpload, 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, LuBold, LuItalic, LuUnderline, LuStrikethrough, LuLink, LuGrid2X2, LuCopyPlus, LuScan, LuMonitorOff, LuCirclePlay, LuCirclePause, LuArrowLeftRight, LuClipboardCopy, LuWand, LuTextCursorInput, LuFile, LuEllipsis, LuUserRound, LuFilePlus2, LuHouse, LuPackage, LuFileJson, LuBox, LuFileImage, LuUser, LuHardDrive, LuLogIn, LuLayoutTemplate, 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 }) {
@@ -478,7 +478,6 @@ function ChartPartSelectionProvider({
478
478
  function useChartPartSelection() {
479
479
  return useContext(ChartPartSelectionContext);
480
480
  }
481
- var DRAG_THRESHOLD_PX = 3;
482
481
  function ChartElementView({
483
482
  element,
484
483
  editable,
@@ -507,21 +506,7 @@ function ChartElementView({
507
506
  }
508
507
  }, [canEdit, selection, element.id, setSelection, onUpdateElement]);
509
508
  useEffect(() => {
510
- const root = wrapperRef.current;
511
- if (!root) {
512
- return;
513
- }
514
- for (const node of root.querySelectorAll(".pptx-chart-part-selected")) {
515
- node.classList.remove("pptx-chart-part-selected");
516
- }
517
- if (!selectedPart) {
518
- return;
519
- }
520
- const pointSel = selectedPart.pointIndex !== void 0 ? `[data-chart-point='${selectedPart.pointIndex}']` : ":not([data-chart-point])";
521
- const selector = `[data-chart-part='${selectedPart.role}'][data-chart-series='${selectedPart.seriesIndex}']${pointSel}`;
522
- for (const node of root.querySelectorAll(selector)) {
523
- node.classList.add("pptx-chart-part-selected");
524
- }
509
+ applyChartPartHighlight(wrapperRef.current, selectedPart);
525
510
  });
526
511
  const endDrag = (commit) => {
527
512
  const active = dragRef.current;
@@ -554,53 +539,37 @@ function ChartElementView({
554
539
  }
555
540
  e.stopPropagation();
556
541
  setSelection({ elementId: element.id, part });
557
- if (part.role === "dataPoint" && part.pointIndex !== void 0 && viewModel?.valueDrag && element.chartData) {
558
- e.preventDefault();
559
- try {
560
- e.currentTarget.setPointerCapture?.(e.pointerId);
561
- } catch {
562
- }
563
- const startValue = element.chartData.series[part.seriesIndex]?.values[part.pointIndex] ?? 0;
564
- dragRef.current = {
565
- part,
566
- drag: viewModel.valueDrag,
567
- svgHeight: viewModel.svgHeight,
568
- startClientY: e.clientY,
569
- anchorViewY: dragAnchorViewY(startValue, viewModel.valueDrag, part.seriesIndex),
570
- baseChartData: element.chartData,
571
- moved: false,
572
- lastData: null
573
- };
542
+ if (!viewModel || !element.chartData) {
543
+ return;
544
+ }
545
+ const started = beginChartValueDrag({
546
+ part,
547
+ viewModel,
548
+ chartData: element.chartData,
549
+ clientY: e.clientY
550
+ });
551
+ if (!started) {
552
+ return;
553
+ }
554
+ e.preventDefault();
555
+ try {
556
+ e.currentTarget.setPointerCapture?.(e.pointerId);
557
+ } catch {
574
558
  }
559
+ dragRef.current = started;
575
560
  };
576
561
  const handlePointerMove = (e) => {
577
562
  const active = dragRef.current;
578
563
  if (!active) {
579
564
  return;
580
565
  }
581
- if (!active.moved && Math.abs(e.clientY - active.startClientY) < DRAG_THRESHOLD_PX) {
566
+ const height = wrapperRef.current?.querySelector("svg")?.getBoundingClientRect().height ?? 0;
567
+ const step = advanceChartValueDrag(active, e.clientY, height);
568
+ if (!step) {
582
569
  return;
583
570
  }
584
- const svg = wrapperRef.current?.querySelector("svg");
585
- if (!svg || active.part.pointIndex === void 0) {
586
- return;
587
- }
588
- const rect = svg.getBoundingClientRect();
589
- if (rect.height === 0) {
590
- return;
591
- }
592
- active.moved = true;
593
- const deltaViewY = (e.clientY - active.startClientY) / rect.height * active.svgHeight;
594
- const viewY = active.anchorViewY + deltaViewY;
595
- const value = dragValueForPart(viewY, active.drag, active.part.seriesIndex);
596
- active.lastData = withChartPointValue(
597
- active.baseChartData,
598
- active.part.seriesIndex,
599
- active.part.pointIndex,
600
- value
601
- );
602
- setPreviewData(active.lastData);
603
- setDragValue(value);
571
+ setPreviewData(step.chartData);
572
+ setDragValue(step.value);
604
573
  };
605
574
  const handlePointerUp = () => {
606
575
  if (dragRef.current) {
@@ -2574,7 +2543,7 @@ function FailedToLoad() {
2574
2543
  var LazyModel3DScene = React14.lazy(
2575
2544
  async () => {
2576
2545
  try {
2577
- return await import('./Model3DScene-PTCZUGIT.mjs');
2546
+ return await import('./Model3DScene-IFYFOD6F.mjs');
2578
2547
  } catch {
2579
2548
  return { default: FailedToLoad };
2580
2549
  }
@@ -3185,13 +3154,10 @@ function SmartArtNodeText({
3185
3154
  }
3186
3155
  );
3187
3156
  }
3188
- const source = text ?? "";
3189
- const lines = maxWidth !== void 0 ? centeredSvgTextLines(source, fontSize, { maxWidth: maxWidth * LABEL_WIDTH_FRACTION }).map(
3157
+ const source = text ?? "", lines = maxWidth !== void 0 ? centeredSvgTextLines(source, fontSize, { maxWidth: maxWidth * LABEL_WIDTH_FRACTION }).map(
3190
3158
  (line) => line.text
3191
- ) : source.split("\n").filter((l) => l.length > 0);
3192
- const lineHeight = fontSize * 1.2;
3193
- let startY;
3194
- let dominantBaseline;
3159
+ ) : source.split("\n").filter((l) => l.length > 0), lineHeight = fontSize * 1.2;
3160
+ let startY, dominantBaseline;
3195
3161
  if (anchor === "bottom") {
3196
3162
  startY = lines.length > 0 ? y - (lines.length - 1) * lineHeight : y;
3197
3163
  dominantBaseline = "auto";
@@ -3218,14 +3184,15 @@ function SmartArtNodeText({
3218
3184
  }
3219
3185
  );
3220
3186
  }
3221
- function wrapChrome(chrome, content, className, a11y) {
3222
- const wrapperStyle = {};
3223
- if (chrome?.backgroundColor) {
3224
- wrapperStyle.backgroundColor = chrome.backgroundColor;
3225
- }
3226
- if (chrome?.outlineColor) {
3227
- wrapperStyle.border = `${chrome.outlineWidth ?? 1}px solid ${chrome.outlineColor}`;
3187
+ function chromeStyleToReactCss(style) {
3188
+ const react = {};
3189
+ for (const [key, value] of Object.entries(style)) {
3190
+ react[key.replace(/-([a-z])/gu, (_match, letter) => letter.toUpperCase())] = value;
3228
3191
  }
3192
+ return react;
3193
+ }
3194
+ function wrapChrome(chrome, content, className, a11y) {
3195
+ const wrapperStyle = chromeStyleToReactCss(buildChromeStyle(chrome));
3229
3196
  return /* @__PURE__ */ jsx(
3230
3197
  "div",
3231
3198
  {
@@ -5775,7 +5742,7 @@ function AccountPage() {
5775
5742
  return void 0;
5776
5743
  });
5777
5744
  };
5778
- const version = "2.19.6" ;
5745
+ const version = "2.20.0" ;
5779
5746
  return /* @__PURE__ */ jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
5780
5747
  /* @__PURE__ */ jsxs("section", { className: cardClass, children: [
5781
5748
  /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -10282,39 +10249,42 @@ function CommentMarkersOverlay({
10282
10249
  canvasSize,
10283
10250
  onCommentMarkerClick
10284
10251
  }) {
10285
- return /* @__PURE__ */ jsx("div", { className: "absolute inset-0 pointer-events-none z-[45]", children: comments.map((comment, idx) => {
10286
- const pos = getCommentMarkerPosition(comment, idx, canvasSize.width, canvasSize.height);
10287
- return /* @__PURE__ */ jsx(
10288
- "div",
10289
- {
10290
- className: "absolute pointer-events-auto cursor-pointer",
10291
- style: {
10292
- left: pos.x - 10,
10293
- top: pos.y - 10,
10294
- width: 20,
10295
- height: 20,
10296
- borderRadius: "50%",
10297
- backgroundColor: "rgba(255, 165, 0, 0.9)",
10298
- border: "2px solid #fff",
10299
- boxShadow: "0 1px 3px rgba(0,0,0,0.3)",
10300
- display: "flex",
10301
- alignItems: "center",
10302
- justifyContent: "center",
10303
- fontSize: 10,
10304
- fontWeight: 700,
10305
- color: "#fff",
10306
- lineHeight: 1
10307
- },
10308
- title: `${comment.author ?? "Comment"}: ${comment.text}`,
10309
- onClick: (e) => {
10310
- e.stopPropagation();
10311
- onCommentMarkerClick?.(comment.id);
10312
- },
10313
- children: idx + 1
10252
+ const { t } = useTranslation(), half = COMMENT_MARKER_SIZE / 2, markers = buildCommentMarkers(
10253
+ comments,
10254
+ canvasSize.width,
10255
+ canvasSize.height,
10256
+ t("pptx.comments.unknownAuthor")
10257
+ );
10258
+ return /* @__PURE__ */ jsx("div", { className: "absolute inset-0 pointer-events-none z-[45]", children: markers.map((marker) => /* @__PURE__ */ jsx(
10259
+ "div",
10260
+ {
10261
+ className: "absolute pointer-events-auto cursor-pointer",
10262
+ style: {
10263
+ left: marker.x - half,
10264
+ top: marker.y - half,
10265
+ width: COMMENT_MARKER_SIZE,
10266
+ height: COMMENT_MARKER_SIZE,
10267
+ borderRadius: "50%",
10268
+ backgroundColor: "rgba(255, 165, 0, 0.9)",
10269
+ border: "2px solid #fff",
10270
+ boxShadow: "0 1px 3px rgba(0,0,0,0.3)",
10271
+ display: "flex",
10272
+ alignItems: "center",
10273
+ justifyContent: "center",
10274
+ fontSize: 10,
10275
+ fontWeight: 700,
10276
+ color: "#fff",
10277
+ lineHeight: 1
10314
10278
  },
10315
- comment.id
10316
- );
10317
- }) });
10279
+ title: marker.title,
10280
+ onClick: (e) => {
10281
+ e.stopPropagation();
10282
+ onCommentMarkerClick?.(marker.commentId);
10283
+ },
10284
+ children: marker.label
10285
+ },
10286
+ marker.commentId
10287
+ )) });
10318
10288
  }
10319
10289
  function ConnectorEndpointOverlay({
10320
10290
  connector,
@@ -19397,12 +19367,9 @@ function useAnimationDragDrop({
19397
19367
  }, []);
19398
19368
  const reorderAnimations = useCallback(
19399
19369
  (sourceIndex, targetIndex) => {
19400
- updateAnimations((anims) => {
19401
- const sorted = [...anims].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
19402
- const [moved] = sorted.splice(sourceIndex, 1);
19403
- sorted.splice(targetIndex, 0, moved);
19404
- return sorted.map((a, i) => ({ ...a, order: i }));
19405
- });
19370
+ updateAnimations(
19371
+ (anims) => reorderAnimationTo(anims, sourceIndex, targetIndex)
19372
+ );
19406
19373
  },
19407
19374
  [updateAnimations]
19408
19375
  );
@@ -19436,18 +19403,9 @@ function useAnimationDragDrop({
19436
19403
  );
19437
19404
  const handleMoveDown = useCallback(
19438
19405
  (animIndex) => {
19439
- updateAnimations((anims) => {
19440
- const sorted = [...anims].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
19441
- if (animIndex >= sorted.length - 1) {
19442
- return anims;
19443
- }
19444
- const temp = sorted[animIndex + 1];
19445
- sorted[animIndex + 1] = sorted[animIndex];
19446
- sorted[animIndex] = temp;
19447
- return sorted.map((a, i) => ({ ...a, order: i }));
19448
- });
19406
+ reorderAnimations(animIndex, animIndex + 1);
19449
19407
  },
19450
- [updateAnimations]
19408
+ [reorderAnimations]
19451
19409
  );
19452
19410
  return {
19453
19411
  dragIndex,
@@ -19698,25 +19656,12 @@ function useAnimationHandlers({
19698
19656
  );
19699
19657
  const showDirectionPicker = hasAnimation && (DIRECTIONAL_PRESETS.has(selectedElementAnimation?.entrance ?? "") || DIRECTIONAL_PRESETS.has(selectedElementAnimation?.exit ?? ""));
19700
19658
  const timelineBarData = useMemo(() => {
19701
- if (sortedAnimations.length === 0) {
19702
- return [];
19703
- }
19704
- let maxEndMs = 0;
19705
- const entries = sortedAnimations.map((anim) => {
19706
- const startMs = anim.delayMs ?? 0;
19707
- const durationMs = anim.durationMs ?? 500;
19708
- const endMs = startMs + durationMs;
19709
- if (endMs > maxEndMs) {
19710
- maxEndMs = endMs;
19711
- }
19712
- return { anim, startMs, durationMs, endMs };
19659
+ const bars = buildAnimationTimelineBars(sortedAnimations);
19660
+ const barsByElementId = new Map(bars.map((bar) => [bar.elementId, bar]));
19661
+ return sortedAnimations.flatMap((anim) => {
19662
+ const bar = barsByElementId.get(anim.elementId);
19663
+ return bar ? [{ anim, leftPercent: bar.leftPercent, widthPercent: bar.widthPercent }] : [];
19713
19664
  });
19714
- const totalMs = Math.max(maxEndMs, 1);
19715
- return entries.map((entry) => ({
19716
- anim: entry.anim,
19717
- leftPercent: entry.startMs / totalMs * 100,
19718
- widthPercent: entry.durationMs / totalMs * 100
19719
- }));
19720
19665
  }, [sortedAnimations]);
19721
19666
  return {
19722
19667
  selectedElementAnimation,
@@ -25732,104 +25677,6 @@ function TextFormatToggle({
25732
25677
  }
25733
25678
  );
25734
25679
  }
25735
-
25736
- // src/viewer/components/inspector/smartart-node-limits.ts
25737
- var LAYOUT_BOUNDS = {
25738
- // A Venn diagram is typically drawn with 2-3 overlapping sets; beyond a
25739
- // handful of circles it becomes unreadable.
25740
- venn: { min: 2, max: 3 },
25741
- // A 2x2 matrix has exactly four quadrants.
25742
- matrix: { min: 4, max: 4 },
25743
- // Pyramids and funnels need at least two tiers to convey a hierarchy.
25744
- pyramid: { min: 2, max: 5 },
25745
- funnel: { min: 2, max: 5 },
25746
- // A target is a small set of concentric rings.
25747
- target: { min: 2, max: 5 },
25748
- // Gears mesh in small clusters.
25749
- gear: { min: 2, max: 3 },
25750
- // Cycles need at least three steps to read as a loop.
25751
- cycle: { min: 3 }
25752
- // Relationship / process / list / hierarchy / timeline are flexible but
25753
- // still need at least one node to exist.
25754
- };
25755
- var DEFAULT_BOUNDS = { min: 1 };
25756
- function getSmartArtNodeBounds(layout) {
25757
- if (!layout) {
25758
- return DEFAULT_BOUNDS;
25759
- }
25760
- return LAYOUT_BOUNDS[layout] ?? DEFAULT_BOUNDS;
25761
- }
25762
- function canAddTopLevelNode(layout, topLevelCount) {
25763
- const { max } = getSmartArtNodeBounds(layout);
25764
- return max === void 0 || topLevelCount < max;
25765
- }
25766
- function canRemoveTopLevelNode(layout, topLevelCount) {
25767
- const { min } = getSmartArtNodeBounds(layout);
25768
- return topLevelCount > min;
25769
- }
25770
- function describeSmartArtBounds(layout) {
25771
- const { min, max } = getSmartArtNodeBounds(layout);
25772
- if (min <= 1 && max === void 0) {
25773
- return void 0;
25774
- }
25775
- if (max === void 0) {
25776
- return `Works best with at least ${min} items.`;
25777
- }
25778
- if (min === max) {
25779
- return `This layout uses exactly ${max} items.`;
25780
- }
25781
- return `Works best with ${min} to ${max} items.`;
25782
- }
25783
-
25784
- // src/viewer/components/inspector/smartart-node-pane-handlers.ts
25785
- function addSiblingAfter(data, nodeId) {
25786
- const next = addSmartArtNode(data, "", nodeId);
25787
- if (next === data) {
25788
- return void 0;
25789
- }
25790
- const idx = next.nodes.findIndex((n) => n.id === nodeId);
25791
- const inserted = idx >= 0 ? next.nodes[idx + 1] : void 0;
25792
- return { data: next, focusNodeId: inserted?.id };
25793
- }
25794
- function removeEmptyNode(data, nodeId) {
25795
- if (data.nodes.length <= 1) {
25796
- return void 0;
25797
- }
25798
- const removedIndex = data.nodes.findIndex((n) => n.id === nodeId);
25799
- const next = removeSmartArtNode(data, nodeId);
25800
- if (next === data) {
25801
- return void 0;
25802
- }
25803
- const focusNode = next.nodes[Math.max(0, removedIndex - 1)];
25804
- return { data: next, focusNodeId: focusNode?.id };
25805
- }
25806
- function demote(data, nodeId) {
25807
- const next = demoteSmartArtNode(data, nodeId);
25808
- return next === data ? void 0 : next;
25809
- }
25810
- function promote(data, nodeId) {
25811
- const next = promoteSmartArtNode(data, nodeId);
25812
- return next === data ? void 0 : next;
25813
- }
25814
- function reorder(data, nodeId, direction) {
25815
- const next = reorderSmartArtNode(data, nodeId, direction);
25816
- return next === data ? void 0 : next;
25817
- }
25818
- function siblingIndex(data, nodeId) {
25819
- const node = data.nodes.find((n) => n.id === nodeId);
25820
- if (!node) {
25821
- return -1;
25822
- }
25823
- const siblings = data.nodes.filter((n) => n.parentId === node.parentId);
25824
- return siblings.findIndex((n) => n.id === nodeId);
25825
- }
25826
- function siblingCount(data, nodeId) {
25827
- const node = data.nodes.find((n) => n.id === nodeId);
25828
- if (!node) {
25829
- return 0;
25830
- }
25831
- return data.nodes.filter((n) => n.parentId === node.parentId).length;
25832
- }
25833
25680
  function ProcessThumb() {
25834
25681
  return /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 48 32", className: "w-full h-full", children: [
25835
25682
  /* @__PURE__ */ jsx("rect", { x: "2", y: "10", width: "10", height: "12", rx: "2", fill: "currentColor", opacity: 0.7 }),
@@ -26282,7 +26129,6 @@ var COLOR_SCHEMES = [
26282
26129
  "monochromatic2"
26283
26130
  ];
26284
26131
  var STYLE_OPTIONS = ["flat", "moderate", "intense"];
26285
- var TREE_CONNECTION_TYPES = /* @__PURE__ */ new Set(["parOf", "presParOf", void 0]);
26286
26132
  function SmartArtPropertiesPanel({
26287
26133
  smartArtData,
26288
26134
  canEdit,
@@ -26392,9 +26238,7 @@ function SmartArtPropertiesPanel({
26392
26238
  };
26393
26239
  const boundsHint = describeSmartArtBounds(layout);
26394
26240
  const addDisabled = !canEdit || !canAddTopLevelNode(layout, topLevelCount);
26395
- const extraConnections = (smartArtData.connections ?? []).filter(
26396
- (c) => !TREE_CONNECTION_TYPES.has(c.type)
26397
- );
26241
+ const extraConnections = classifyExtraConnections(smartArtData);
26398
26242
  const extraConnectionSummary = Array.from(
26399
26243
  new Set(extraConnections.map((c) => c.type ?? "unknown"))
26400
26244
  ).join(", ");
@@ -27177,20 +27021,7 @@ function TablePropertiesPanel({
27177
27021
  "aria-label": preset.label,
27178
27022
  className: "rounded border border-border hover:border-primary overflow-hidden h-10 transition-colors",
27179
27023
  onClick: () => {
27180
- const newRows = td.rows.map((row, ri) => ({
27181
- ...row,
27182
- cells: row.cells.map((cell) => ({
27183
- ...cell,
27184
- style: {
27185
- ...cell.style,
27186
- backgroundColor: ri === 0 && td.firstRowHeader ? preset.headerBg : td.bandedRows && (ri - (td.firstRowHeader ? 1 : 0)) % 2 === 0 ? preset.bandBg : void 0,
27187
- color: ri === 0 && td.firstRowHeader ? preset.headerFg : cell.style?.color,
27188
- bold: ri === 0 && td.firstRowHeader ? true : cell.style?.bold,
27189
- borderColor: preset.borderColor
27190
- }
27191
- }))
27192
- }));
27193
- updateTableData({ rows: newRows });
27024
+ updateTableData({ rows: applyTableStylePreset(td, preset) });
27194
27025
  },
27195
27026
  children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-full", children: [
27196
27027
  /* @__PURE__ */ jsx("div", { className: "flex-1", style: { backgroundColor: preset.headerBg } }),
@@ -27211,10 +27042,7 @@ function TablePropertiesPanel({
27211
27042
  className: BTN,
27212
27043
  disabled: !canEdit,
27213
27044
  onClick: () => {
27214
- const even = 1 / colCount;
27215
- updateTableData({
27216
- columnWidths: Array(colCount).fill(even)
27217
- });
27045
+ updateTableData({ columnWidths: evenColumnWidths(colCount) });
27218
27046
  },
27219
27047
  children: t("pptx.table.even")
27220
27048
  }
@@ -27233,24 +27061,9 @@ function TablePropertiesPanel({
27233
27061
  className: "flex-1 accent-primary",
27234
27062
  onChange: (e) => {
27235
27063
  const newPct = Number(e.target.value) / 100;
27236
- const oldPct = td.columnWidths[ci];
27237
- const diff = newPct - oldPct;
27238
- const newWidths = [...td.columnWidths];
27239
- newWidths[ci] = newPct;
27240
- const othersTotal = 1 - oldPct;
27241
- if (othersTotal > 0) {
27242
- for (let j = 0; j < newWidths.length; j++) {
27243
- if (j !== ci) {
27244
- newWidths[j] = Math.max(
27245
- 0.05,
27246
- td.columnWidths[j] - diff * (td.columnWidths[j] / othersTotal)
27247
- );
27248
- }
27249
- }
27250
- }
27251
- const sum = newWidths.reduce((a, b) => a + b, 0);
27252
- const normed = newWidths.map((v) => v / sum);
27253
- updateTableData({ columnWidths: normed });
27064
+ updateTableData({
27065
+ columnWidths: redistributeColumnWidth(td.columnWidths, ci, newPct)
27066
+ });
27254
27067
  }
27255
27068
  }
27256
27069
  ),
@@ -27270,10 +27083,7 @@ function TablePropertiesPanel({
27270
27083
  className: BTN,
27271
27084
  disabled: !canEdit,
27272
27085
  onClick: () => {
27273
- const avg = Math.round(td.rows.reduce((s, r) => s + (r.height ?? 32), 0) / rowCount);
27274
- updateTableData({
27275
- rows: td.rows.map((r) => ({ ...r, height: avg }))
27276
- });
27086
+ updateTableData({ rows: evenRowHeights(td.rows) });
27277
27087
  },
27278
27088
  children: t("pptx.table.even")
27279
27089
  }
@@ -34690,7 +34500,7 @@ ${url}`)) {
34690
34500
  var AiChatPanel = lazy(async () => {
34691
34501
  const [{ useChat }, { default: Panel }] = await Promise.all([
34692
34502
  import('@ai-sdk/react'),
34693
- import('./AiChatPanel-WVO66CKC.mjs')
34503
+ import('./AiChatPanel-NRWACXJ7.mjs')
34694
34504
  ]);
34695
34505
  function BoundAiChatPanel(props) {
34696
34506
  return /* @__PURE__ */ jsx(Panel, { ...props, useChat });
@@ -36154,7 +35964,25 @@ var HeaderFooterPanel = ({
36154
35964
  ] })
36155
35965
  ] }) });
36156
35966
  };
35967
+ function isActionKey(key) {
35968
+ return key === "slides" || key === "insert" || key === "inspector" || key === "comments" || key === "notes";
35969
+ }
35970
+ var LABEL_BY_KEY = {
35971
+ slides: "pptx.sections.slides",
35972
+ insert: "pptx.mobileBar.insert",
35973
+ inspector: "pptx.field.format",
35974
+ comments: "pptx.toolbar.comments",
35975
+ notes: "pptx.notes.title"
35976
+ };
35977
+ var ICON_BY_KEY = {
35978
+ slides: LuLayers,
35979
+ insert: LuPlus,
35980
+ inspector: LuSettings2,
35981
+ comments: LuMessageSquare,
35982
+ notes: LuStickyNote
35983
+ };
36157
35984
  function MobileBottomBar({
35985
+ slideCount,
36158
35986
  onOpenSlides,
36159
35987
  onOpenInsert,
36160
35988
  onOpenInspector,
@@ -36163,54 +35991,38 @@ function MobileBottomBar({
36163
35991
  activeSheet,
36164
35992
  commentCount
36165
35993
  }) {
36166
- const { t } = useTranslation();
36167
- const actions = [
36168
- {
36169
- key: "slides",
36170
- label: "pptx.sections.slides",
36171
- icon: LuLayers,
36172
- onClick: onOpenSlides
36173
- },
36174
- {
36175
- key: "insert",
36176
- label: "pptx.mobileBar.insert",
36177
- icon: LuPlus,
36178
- onClick: onOpenInsert
36179
- },
36180
- {
36181
- key: "inspector",
36182
- label: "pptx.field.format",
36183
- icon: LuSettings2,
36184
- onClick: onOpenInspector
36185
- },
36186
- {
36187
- key: "comments",
36188
- label: "pptx.toolbar.comments",
36189
- icon: LuMessageSquare,
36190
- onClick: onOpenComments,
36191
- badge: commentCount
36192
- },
36193
- {
36194
- key: "notes",
36195
- label: "pptx.notes.title",
36196
- icon: LuStickyNote,
36197
- onClick: onToggleNotes
36198
- }
36199
- ];
35994
+ const { t } = useTranslation(), onClickByKey = {
35995
+ slides: onOpenSlides,
35996
+ insert: onOpenInsert,
35997
+ inspector: onOpenInspector,
35998
+ comments: onOpenComments,
35999
+ notes: onToggleNotes
36000
+ }, actions = buildBarActions({ slideCount }).filter((descriptor) => isActionKey(descriptor.key)).map((descriptor) => {
36001
+ const key = descriptor.key;
36002
+ return {
36003
+ key,
36004
+ label: LABEL_BY_KEY[key],
36005
+ icon: ICON_BY_KEY[key],
36006
+ onClick: onClickByKey[key],
36007
+ disabled: descriptor.disabled,
36008
+ badge: key === "comments" ? commentCount : void 0
36009
+ };
36010
+ });
36200
36011
  return /* @__PURE__ */ jsx(
36201
36012
  "nav",
36202
36013
  {
36203
36014
  "aria-label": t("pptx.mobileBar.ariaLabel"),
36204
36015
  className: "flex items-stretch justify-around border-t border-border bg-secondary/80 backdrop-blur supports-[backdrop-filter]:bg-secondary/60 pb-[max(env(safe-area-inset-bottom),0px)]",
36205
- children: actions.map(({ key, label, icon: Icon, onClick, badge }) => {
36016
+ children: actions.map(({ key, label, icon: Icon, onClick, disabled, badge }) => {
36206
36017
  const active = activeSheet === key;
36207
36018
  return /* @__PURE__ */ jsxs(
36208
36019
  "button",
36209
36020
  {
36210
36021
  type: "button",
36211
36022
  onClick,
36023
+ disabled,
36212
36024
  className: cn(
36213
- "relative flex flex-col items-center justify-center gap-0.5 flex-1 min-h-[56px] py-1.5 text-[10px] font-medium transition-colors active:scale-95",
36025
+ "relative flex flex-col items-center justify-center gap-0.5 flex-1 min-h-[56px] py-1.5 text-[10px] font-medium transition-colors active:scale-95 disabled:opacity-40 disabled:pointer-events-none",
36214
36026
  active ? "text-primary" : "text-muted-foreground hover:text-foreground"
36215
36027
  ),
36216
36028
  "aria-pressed": active,
@@ -36245,6 +36057,10 @@ function MobileSlidesSheet({
36245
36057
  }
36246
36058
  );
36247
36059
  }
36060
+ function nextMobileSheet(current, tapped) {
36061
+ const next = toggleSheet(current, tapped);
36062
+ return next === tapped ? tapped : null;
36063
+ }
36248
36064
  function MobileChromeOverlay(props) {
36249
36065
  const {
36250
36066
  state: s,
@@ -36256,15 +36072,11 @@ function MobileChromeOverlay(props) {
36256
36072
  slideSectionGroups,
36257
36073
  canEdit,
36258
36074
  commentCount
36259
- } = props;
36260
- const { keyboardInset, isKeyboardOpen } = useKeyboardInsets();
36261
- const activeSheet = s.isSlidesPaneOpen ? "slides" : s.isInspectorPaneOpen ? s.sidebarPanelMode === "comments" ? "comments" : "inspector" : !s.isSlideNotesCollapsed ? "notes" : null;
36262
- const closeAllSheets = () => {
36075
+ } = props, { keyboardInset, isKeyboardOpen } = useKeyboardInsets(), activeSheet = s.isSlidesPaneOpen ? "slides" : s.isInspectorPaneOpen ? s.sidebarPanelMode === "comments" ? "comments" : "inspector" : !s.isSlideNotesCollapsed ? "notes" : null, closeAllSheets = () => {
36263
36076
  s.setIsSlidesPaneOpen(false);
36264
36077
  s.setIsInspectorPaneOpen(false);
36265
36078
  s.setIsSlideNotesCollapsed(true);
36266
- };
36267
- const openSheet = (which) => {
36079
+ }, openSheet = (which) => {
36268
36080
  closeAllSheets();
36269
36081
  switch (which) {
36270
36082
  case "slides":
@@ -36282,6 +36094,12 @@ function MobileChromeOverlay(props) {
36282
36094
  s.setIsSlideNotesCollapsed(false);
36283
36095
  break;
36284
36096
  }
36097
+ }, applySheetTap = (tapped) => {
36098
+ const next = nextMobileSheet(activeSheet, tapped);
36099
+ closeAllSheets();
36100
+ if (next) {
36101
+ openSheet(next);
36102
+ }
36285
36103
  };
36286
36104
  return /* @__PURE__ */ jsxs(Fragment, { children: [
36287
36105
  /* @__PURE__ */ jsx(
@@ -36327,15 +36145,16 @@ function MobileChromeOverlay(props) {
36327
36145
  children: /* @__PURE__ */ jsx(
36328
36146
  MobileBottomBar,
36329
36147
  {
36148
+ slideCount: slides.length,
36330
36149
  activeSheet,
36331
36150
  commentCount,
36332
- onOpenSlides: () => s.isSlidesPaneOpen ? s.setIsSlidesPaneOpen(false) : openSheet("slides"),
36151
+ onOpenSlides: () => applySheetTap("slides"),
36333
36152
  onOpenInsert: () => {
36334
36153
  editorOps.insertHandlers.handleAddTextBox();
36335
36154
  },
36336
- onOpenInspector: () => s.isInspectorPaneOpen && s.sidebarPanelMode !== "comments" ? s.setIsInspectorPaneOpen(false) : openSheet("inspector"),
36337
- onOpenComments: () => s.isInspectorPaneOpen && s.sidebarPanelMode === "comments" ? s.setIsInspectorPaneOpen(false) : openSheet("comments"),
36338
- onToggleNotes: () => !s.isSlideNotesCollapsed ? s.setIsSlideNotesCollapsed(true) : openSheet("notes")
36155
+ onOpenInspector: () => applySheetTap("inspector"),
36156
+ onOpenComments: () => applySheetTap("comments"),
36157
+ onToggleNotes: () => applySheetTap("notes")
36339
36158
  }
36340
36159
  )
36341
36160
  }
@@ -36478,13 +36297,9 @@ function ControlRow({
36478
36297
  step: control.step ?? 1,
36479
36298
  value: typeof value === "number" ? value : control.min,
36480
36299
  onChange: (event) => {
36481
- const parsed = Number(event.target.value);
36482
- if (Number.isFinite(parsed)) {
36483
- onOptionChange(
36484
- control.group,
36485
- control.key,
36486
- Math.min(control.max, Math.max(control.min, parsed))
36487
- );
36300
+ const clamped = clampOptionNumber(event.target.value, control.min, control.max);
36301
+ if (clamped !== void 0) {
36302
+ onOptionChange(control.group, control.key, clamped);
36488
36303
  }
36489
36304
  }
36490
36305
  }