pptx-react-viewer 4.16.1 → 4.17.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 (134) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/{AiChatPanel-DFZSMXJB.js → AiChatPanel-4VMAZWMA.js} +28 -28
  3. package/dist/AiChatPanel-4VMAZWMA.js.br +0 -0
  4. package/dist/AiChatPanel-4VMAZWMA.js.gz +0 -0
  5. package/dist/{AiChatPanel-K3PL6O3M.mjs → AiChatPanel-Z455OA7S.mjs} +4 -4
  6. package/dist/AiChatPanel-Z455OA7S.mjs.br +0 -0
  7. package/dist/AiChatPanel-Z455OA7S.mjs.gz +0 -0
  8. package/dist/{Model3DScene-EOKTWVG7.mjs → Model3DScene-DTWVQCBT.mjs} +1 -1
  9. package/dist/Model3DScene-DTWVQCBT.mjs.br +0 -0
  10. package/dist/Model3DScene-DTWVQCBT.mjs.gz +0 -0
  11. package/dist/{Model3DScene-ZYC5U7NY.js → Model3DScene-MFLMJAQX.js} +2 -2
  12. package/dist/Model3DScene-MFLMJAQX.js.br +0 -0
  13. package/dist/Model3DScene-MFLMJAQX.js.gz +0 -0
  14. package/dist/{chunk-XVJSAY7C.js → chunk-24CSDBXI.js} +875 -826
  15. package/dist/chunk-24CSDBXI.js.br +0 -0
  16. package/dist/chunk-24CSDBXI.js.gz +0 -0
  17. package/dist/{chunk-4VV5HJXQ.js → chunk-24UNI4EL.js} +6363 -3381
  18. package/dist/chunk-24UNI4EL.js.br +0 -0
  19. package/dist/chunk-24UNI4EL.js.gz +0 -0
  20. package/dist/{chunk-VUNRFZRR.mjs → chunk-26EMM7IE.mjs} +6343 -3365
  21. package/dist/chunk-26EMM7IE.mjs.br +0 -0
  22. package/dist/chunk-26EMM7IE.mjs.gz +0 -0
  23. package/dist/{chunk-33XJSD62.mjs → chunk-GLLEZR4U.mjs} +8 -0
  24. package/dist/chunk-GLLEZR4U.mjs.br +0 -0
  25. package/dist/{chunk-33XJSD62.mjs.gz → chunk-GLLEZR4U.mjs.gz} +0 -0
  26. package/dist/{chunk-KK2CFTKC.mjs → chunk-HUNX22TC.mjs} +2 -2
  27. package/dist/chunk-HUNX22TC.mjs.br +0 -0
  28. package/dist/chunk-HUNX22TC.mjs.gz +0 -0
  29. package/dist/{chunk-CWVPHCMJ.js → chunk-I23JEAUE.js} +5 -5
  30. package/dist/chunk-I23JEAUE.js.br +0 -0
  31. package/dist/chunk-I23JEAUE.js.gz +0 -0
  32. package/dist/{chunk-RE6NDQH7.js → chunk-I6VNRB6R.js} +197 -197
  33. package/dist/chunk-I6VNRB6R.js.br +0 -0
  34. package/dist/chunk-I6VNRB6R.js.gz +0 -0
  35. package/dist/{chunk-6PWT46Y4.mjs → chunk-JSMKHCKC.mjs} +604 -1804
  36. package/dist/chunk-JSMKHCKC.mjs.br +0 -0
  37. package/dist/chunk-JSMKHCKC.mjs.gz +0 -0
  38. package/dist/{chunk-VVGYZBF5.js → chunk-QDVMTPYQ.js} +2568 -3768
  39. package/dist/chunk-QDVMTPYQ.js.br +0 -0
  40. package/dist/chunk-QDVMTPYQ.js.gz +0 -0
  41. package/dist/{chunk-LJEI7O6S.js → chunk-QWQADOJZ.js} +8 -0
  42. package/dist/chunk-QWQADOJZ.js.br +0 -0
  43. package/dist/{chunk-LJEI7O6S.js.gz → chunk-QWQADOJZ.js.gz} +0 -0
  44. package/dist/{chunk-VUI3VE7K.mjs → chunk-UKR42GJS.mjs} +59 -10
  45. package/dist/chunk-UKR42GJS.mjs.br +0 -0
  46. package/dist/chunk-UKR42GJS.mjs.gz +0 -0
  47. package/dist/{chunk-QZSA3E4L.mjs → chunk-YMVJOQIS.mjs} +1 -1
  48. package/dist/chunk-YMVJOQIS.mjs.br +0 -0
  49. package/dist/chunk-YMVJOQIS.mjs.gz +0 -0
  50. package/dist/i18n/de.cjs +9 -1
  51. package/dist/i18n/de.cjs.br +0 -0
  52. package/dist/i18n/de.cjs.gz +0 -0
  53. package/dist/i18n/de.mjs +9 -1
  54. package/dist/i18n/de.mjs.br +0 -0
  55. package/dist/i18n/de.mjs.gz +0 -0
  56. package/dist/i18n/es.cjs +9 -1
  57. package/dist/i18n/es.cjs.br +0 -0
  58. package/dist/i18n/es.cjs.gz +0 -0
  59. package/dist/i18n/es.mjs +9 -1
  60. package/dist/i18n/es.mjs.br +0 -0
  61. package/dist/i18n/es.mjs.gz +0 -0
  62. package/dist/i18n/fr.cjs +9 -1
  63. package/dist/i18n/fr.cjs.br +0 -0
  64. package/dist/i18n/fr.cjs.gz +0 -0
  65. package/dist/i18n/fr.mjs +9 -1
  66. package/dist/i18n/fr.mjs.br +0 -0
  67. package/dist/i18n/fr.mjs.gz +0 -0
  68. package/dist/i18n/zh-CN.cjs +9 -1
  69. package/dist/i18n/zh-CN.cjs.br +0 -0
  70. package/dist/i18n/zh-CN.cjs.gz +0 -0
  71. package/dist/i18n/zh-CN.mjs +9 -1
  72. package/dist/i18n/zh-CN.mjs.br +0 -0
  73. package/dist/i18n/zh-CN.mjs.gz +0 -0
  74. package/dist/i18n.js +4 -4
  75. package/dist/i18n.js.br +0 -0
  76. package/dist/i18n.js.gz +0 -0
  77. package/dist/i18n.mjs +1 -1
  78. package/dist/i18n.mjs.br +0 -0
  79. package/dist/i18n.mjs.gz +0 -0
  80. package/dist/index.d.ts +158 -12185
  81. package/dist/index.js +63 -63
  82. package/dist/index.js.br +0 -0
  83. package/dist/index.js.gz +0 -0
  84. package/dist/index.mjs +6 -6
  85. package/dist/index.mjs.br +0 -0
  86. package/dist/index.mjs.gz +0 -0
  87. package/dist/internals.d.ts +162 -12196
  88. package/dist/internals.js +105 -105
  89. package/dist/internals.js.br +0 -0
  90. package/dist/internals.js.gz +0 -0
  91. package/dist/internals.mjs +4 -4
  92. package/dist/internals.mjs.br +0 -0
  93. package/dist/internals.mjs.gz +0 -0
  94. package/dist/pptx-viewer.css +1 -1
  95. package/dist/pptx-viewer.css.br +0 -0
  96. package/dist/pptx-viewer.css.gz +0 -0
  97. package/dist/viewer/index.d.ts +156 -12183
  98. package/dist/viewer/index.js +27 -27
  99. package/dist/viewer/index.js.br +0 -0
  100. package/dist/viewer/index.js.gz +0 -0
  101. package/dist/viewer/index.mjs +6 -6
  102. package/dist/viewer/index.mjs.br +0 -0
  103. package/dist/viewer/index.mjs.gz +0 -0
  104. package/package.json +2 -2
  105. package/dist/AiChatPanel-DFZSMXJB.js.br +0 -0
  106. package/dist/AiChatPanel-DFZSMXJB.js.gz +0 -0
  107. package/dist/AiChatPanel-K3PL6O3M.mjs.br +0 -0
  108. package/dist/AiChatPanel-K3PL6O3M.mjs.gz +0 -0
  109. package/dist/Model3DScene-EOKTWVG7.mjs.br +0 -0
  110. package/dist/Model3DScene-EOKTWVG7.mjs.gz +0 -0
  111. package/dist/Model3DScene-ZYC5U7NY.js.br +0 -0
  112. package/dist/Model3DScene-ZYC5U7NY.js.gz +0 -0
  113. package/dist/chunk-33XJSD62.mjs.br +0 -0
  114. package/dist/chunk-4VV5HJXQ.js.br +0 -0
  115. package/dist/chunk-4VV5HJXQ.js.gz +0 -0
  116. package/dist/chunk-6PWT46Y4.mjs.br +0 -0
  117. package/dist/chunk-6PWT46Y4.mjs.gz +0 -0
  118. package/dist/chunk-CWVPHCMJ.js.br +0 -0
  119. package/dist/chunk-CWVPHCMJ.js.gz +0 -0
  120. package/dist/chunk-KK2CFTKC.mjs.br +0 -0
  121. package/dist/chunk-KK2CFTKC.mjs.gz +0 -0
  122. package/dist/chunk-LJEI7O6S.js.br +0 -0
  123. package/dist/chunk-QZSA3E4L.mjs.br +0 -0
  124. package/dist/chunk-QZSA3E4L.mjs.gz +0 -0
  125. package/dist/chunk-RE6NDQH7.js.br +0 -0
  126. package/dist/chunk-RE6NDQH7.js.gz +0 -0
  127. package/dist/chunk-VUI3VE7K.mjs.br +0 -0
  128. package/dist/chunk-VUI3VE7K.mjs.gz +0 -0
  129. package/dist/chunk-VUNRFZRR.mjs.br +0 -0
  130. package/dist/chunk-VUNRFZRR.mjs.gz +0 -0
  131. package/dist/chunk-VVGYZBF5.js.br +0 -0
  132. package/dist/chunk-VVGYZBF5.js.gz +0 -0
  133. package/dist/chunk-XVJSAY7C.js.br +0 -0
  134. package/dist/chunk-XVJSAY7C.js.gz +0 -0
@@ -1,12 +1,12 @@
1
- import { computeFocusTargets, deckDataFieldChanged, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, collectStoredChats, exportAiChatLogs, applyElementUpdate } from './chunk-QZSA3E4L.mjs';
2
- import { useViewerOptions, useReadOnlyRecommendationState, useCompatibilityToastsState, useReducedMotion, useViewerState, useIsMobile, useResizablePanels, useDerivedSlideState, useZoomViewport, useEditorHistory, usePresentationSetup, useTouchGestures, useViewerDialogs, useEditorOperations, useViewerIntegration, useViewPreferencesSync, useLayoutSwitching, Rendering3DFlagsContext, CollaborationProvider, useCollaboration, useCollaborationDocumentSync, useFollowMode, useBroadcastFollower, SlideBackgroundImageLayer, StaticElementRenderer, safePrompt, scopeLayoutOptionsToActiveSlide, ChartPartSelectionProvider, useToolbarVisibility, useKeyboardInsets, useModalDismissDrag, ViewerOptionsStoreContext, ViewerOptionsContext, useViewerOptionsContext, useVirtualizedSlides, useSwipeNavigation, PresentationTransitionOverlay, RemoteSelectionOverlay, CollaborationCursorOverlay, useSheetDismissDrag, detectTargetType, parseEmailUrl, parseSlideFromUrl, ACTION_VERB_MAP, ElementRenderer, InlineCollaborationContext, SmartArtRenderer, playAnimationSound, ResizeHandles, imgSrc, renderStrokeView, useChartPartSelection, resolveSmartArtDataPalette } from './chunk-VUI3VE7K.mjs';
3
- import { SHAPE_PRESETS, ANIMATION_PRESET_OPTIONS, cn, SLIDE_NAV_THUMBNAIL_WIDTH, DEFAULT_SECTION_GROUP_ID, SHORTCUT_REFERENCE_ITEMS as SHORTCUT_REFERENCE_ITEMS$1, TOOLBAR_SECTIONS, isConnectorOrLineElement, GRID_SIZE, MIN_ELEMENT_SIZE, CONNECTOR_ARROW_OPTIONS, ARROW_SIZE_OPTIONS, DEFAULT_FILL_COLOR, startMotionPathPreview, startPreviewAnimation, stopPreviewAnimation, DEFAULT_STROKE_COLOR, STROKE_DASH_OPTIONS } from './chunk-KK2CFTKC.mjs';
4
- import { EMPTY_RESOLVED_CUSTOMIZATION, FIXED_TAB_GALLERIES, ANIMATION_DIRECTION_LABEL_KEYS, SWITCHABLE_LAYOUT_TYPES, compileEquationTemplateMathMl, buildUserFontFaceStyles, readStoredViewerPrefs, resolveThemeCatalogEntry, THEME_CATALOG, writeStoredViewerPrefs, openPptxFile, readBackstageRecentFile, isFeatureEnabled, isDialogAvailable, resolveAutosaveActivation, buildThemeColorMap, viewerOptionsToPreferences, applyPreferenceToOptions, resolveHistoryDepth, applyAutoCorrect, resolveImageResolutionScale, resolveAutosaveIntervalMs, resolveAutosaveIntervalSeconds, isPanelVisible, shouldShowAutosaveRecoveryPrompt, resolveOptionRootClasses, RIBBON_SCOPE_ATTR, resolve3DRenderingFlags, resolveSlideSizeSelection, RULER_THICKNESS, RULER_FONT_SIZE, editorThumbnailHeight, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, hiddenSlideCue, EDITOR_THUMBNAIL_WIDTH, HIDDEN_SLIDE_SLASH_GRADIENT, HIDDEN_SLIDE_LABEL_KEY, visibleTemplateElements, normalizeHexColor, themeToCssVars, createCustomizationController, resolveEffectiveHiddenActions, listAutosaveSnapshots, resolveExpiredAutosaveSnapshots, deleteAutosaveSnapshot, masterViewCrudActions, applyMasterViewCrudAction, masterViewCrudFailureKey, EDITOR_CHROME_CSS, ribbonCustomizationCss, applyMotionPathPreset, resetSlideLayoutPath, DEFAULT_INSERT_CHART_KIND, hasCopyableFormat, templateSchemeFromTheme, createBackstagePresentation, playFeedbackSound, shouldDiscardAutosaveOnSuccessfulSave, setMasterViewBackgroundColor, canUseClipboard, runProgramNoticeStackStyle, compatToastStackStyle, printPropertiesFrameSlides, printPropertiesSlidesPerPage, PASTE_SPECIAL_OPTIONS, getDensePanelTouchTargetPx, shouldStickyActionRow, customizeOptionsTabs, VIEWER_OPTIONS_TABS, isOptionsPageVisible, DEFAULT_QUICK_ACCESS_COMMAND_IDS, isHeaderFooterDateTextVisible, isHeaderFooterHeaderTextVisible, isHeaderFooterFooterTextVisible, buildJoinCollaborationConfig, buildCreateCollaborationConfig, generateBroadcastRoomId, DEFAULT_BROADCAST_SERVER_URL, buildBroadcastViewerUrl, resolveTransportForServerUrl, getSlideBackgroundStyle, pushRecentColor, mruColorsPatch, shouldClearAutosaveCacheOnClose, canCropElement, cropSessionChanged, cancelCropUpdate, startCropSession, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, editorThumbnailWidth, masterViewBackgroundColor, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, resolvePresentationAction, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, toggleBlackboard, PRESENT_TOOLBAR_CLASSES, resolveEditPointsAvailability, isCurrentLayout, themeColorSchemesEqual, observeElementHeight, EXPANDED_MAX_HEIGHT, STATUS_BAR_CLASSES, buildBarActions, formatVersionTimestamp, formatRelativeTime, scanAvailableFontFamilies, PRESETS, CATEGORIES, convertOmmlToLatex, compileLatexEquation, convertLatexToOmml, EQUATION_TEMPLATES, clampPercent2, resolveDefaultPrintSettings, HANDOUT_OPTIONS, TOOLBAR_TABS, SHORTCUT_REFERENCE_ITEMS, resolveViewerAddinRows, availableQuickAccessCommands, addQuickAccessCommand, removeQuickAccessCommand, moveQuickAccessCommand, CUSTOM_FONT_ACCEPT, activateModalFocus, buildCollaborationShareUrl, buildActiveSessionUsers, SORTER_MIN_ZOOM, SORTER_ZOOM_STEP, SORTER_MAX_ZOOM, canGoPrevious, formatSlideCounter, READING_VIEW_COUNTER_ATTR, canGoNext, READING_VIEW_ATTR, OUTLINE_LEVEL_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_ROW_ATTR, OUTLINE_VIEW_ATTR, mobileElapsedSince, nextPresentedSlide, presenterPrevDisabled, presenterNextDisabled, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, presenterTimerProgress, PRESENTER_CONSOLE_CLASSES, formatElapsed, cropModeKeyAction, extraQuickAccessCommands, visibleContextualTabs, resolveActiveRibbonTab, resolveScreenTip, contextualTabLabelKey, RIBBON_CONTEXTUAL_TAB_ATTR, TAB_ROW_ACTION_CLASSES, customizeBackstageNav, BACKSTAGE_NAV, listBackstageRecentFiles, BACKSTAGE_BACK_CLASSES, BACKSTAGE_NAV_CLASSES, hasTextProperties, textFontSizePtToPx, INSERT_CHART_TYPES, ACTION_BUTTON_PRESETS, hasShapeProperties, shapeFillChange, shapeOutlineChange, DESIGN_RIBBON_GROUPS, DESIGN_RIBBON_COMMANDS, designCommandState, CONTEXTUAL_TAB_GROUPS, editorThumbnailStep, resolveSlidePaneClick, SLIDE_VIRTUALIZATION_THRESHOLD, buildSlidePaneContextMenuEntries, isEditPointsEnabled, PRESENTATION_HIT_TEST_CSS, PRESENTATION_STAGE_ATTRIBUTE, buildStrokePathD, cursorForTool, annotationOverlayZIndex, presentationInkPath, resolveNotesSchematicBodyFontSizePx, PRESENTER_NAVIGATOR_LABEL_KEYS, subtitleRecognitionLanguage, subtitleSettingsFromOptions, getSpeechRecognitionCtor, mergeCaptionResults, PEN_COLORS, HIGHLIGHTER_COLORS, isBlackboardActive, customizeContextMenuEntries, buildContextMenuEntries, customizeCanvasContextMenuEntries, buildCanvasContextMenuEntries, buildLayoutPreviewGeometry, scaleSlidesForSizeChange, slideSizeToCanvasPx, resolveSelectionPaneRename, themeEditorLabels, resolveNotesSegments, segmentsToEditorHtml, DEBOUNCE_MS, createPlainNotesSegments, parseSegmentsFromRichEditor, segmentsToPlainText, getCurrentParagraphIndex, segmentsToParagraphs, paragraphsToSegments, MAX_INDENT_LEVEL, INDENT_PX, isUrlSafe, buildNotesPrintHtml, MIN_TOUCH_TARGET_PX, toggleSheet, SMARTART_PREVIEW_ELEMENT_HEIGHT, SMARTART_PREVIEW_ELEMENT_WIDTH, buildSmartArtPreviewElement, sanitizeMathMl, computeHandoutLayout, getPrintableArea, generateNoteLineCount, computeAllNotesPages, getNotesPrintableArea, downloadBlob, clampOptionNumber, QUICK_ACCESS_COMMAND_CATALOG, registerCustomFont, openReadingView, applyReadingViewCommand, createPresentationKeyBuffer, readingViewFitScale, READING_VIEW_STAGE_ATTR, buildOutline, applyOutlineEdit, mapOutlineKey, notesSegmentsToSpans, erasePresentationInkAt, movePresenterPointer, appendPresentationInkPoint, PRESENTER_CONSOLE_CONTROLS, NOTES_FONT_SIZE_DEFAULT, formatTime, NOTES_FONT_SIZE_MIN, clampNotesFontSize, NOTES_FONT_SIZE_STEP, NOTES_FONT_SIZE_MAX, BACKSTAGE_TEMPLATES, formatBackstageDate, formatBackstageSize, customizeBackstageCards, backstageCardsFor, DEFAULT_VIEWER_PROFILE, resolveProfileInitial, AVATAR_COLOR_SWATCHES, resolveDefaultFontFamily, textFontSizePxToPt, buildFontCatalog, COMMON_FONT_SIZES, RIBBON_CONTROL_ATTR, FREEFORM_TOOL_IDS, isDrawingToolVisible, FREEFORM_TOOL_LABEL_KEYS, getSelectionTextStyleFlags, getInlineEditorSelectionResult, selectedParagraphBulletKind, elementBulletKind, selectionBulletKind, TEXT_DECORATION_FLAGS, nextToggleValue, CHARACTER_SPACING_OPTIONS, OFFICE_COLOR_SWATCHES, RIBBON_GROUP_ATTR, RIBBON_SHAPE_SWATCHES, buildRibbonGallery, canGroupSelection, canUngroupSelection, canSetStrokeWidth, strokeWidthOf, readRibbonTransitionDraft, ribbonTransitionUpdates, playSlideTransitionPreview, RIBBON_TRANSITION_PRESETS, transitionSoundOptions, transitionSoundSelectedValue, DEFAULT_MOTION_PATH_PRESET_ID, SLIDE_SHOW_COMMAND_GROUPS, RECORD_COMMAND_GROUPS, buildReviewRibbon, HELP_RIBBON_COMMANDS, galleryTextLabel, masterViewPseudoSlide, PRESENTATION_ANIM_TRIGGER_ATTRIBUTE, motionPathFor, setMotionPath, getShapeAdjustmentHandleDescriptors, shouldShowElementHandles, clampFlyoutPosition, computeAnchoredPopupPosition, applyTableStyleDelete, applyTableStyleMapChange, handleReadingViewKey, getLocalStorageUsageSummary, saveViewerProfile, clearAllLocalViewerData, SLIDE_TEMPLATES, buildThemeColorSwatchGrid, themeColorSwatchRows, findSelectedThemeSwatch, themeSwatchCommit, applyRibbonGalleryItem, MERGE_SHAPES_LABEL_KEY, MERGE_SHAPES_HINT_KEY, MERGE_SHAPES_MENU_ITEMS, CROP_LABEL_KEY, CROP_ASPECT_LABEL_KEY, CROP_ASPECT_GROUP_LABEL_KEYS, CROP_ASPECT_PRESETS, CROP_FILL_LABEL_KEY, CROP_FIT_LABEL_KEY, readSoundFileAsDataUrl, applyTransitionSoundFile, TRANSITION_SOUND_OTHER_VALUE, TRANSITION_SOUND_NONE_VALUE, clearTransitionSound, applyTransitionStockSound, transitionStockSoundId, getEffectSoundAsset, playAnimationRibbonPreview, ENTRANCE_PRESET_VALUES, EMPHASIS_PRESET_VALUES, EXIT_PRESET_VALUES, MOTION_PATH_FAMILIES, motionPathFamilyLabelKey, motionPathPresetsByFamily, motionPathPresetLabelKey, SLIDE_SHOW_OPTIONS, createViewerOptionsStore, subtitleSettingsLabels, attachEditorImagePaste, authorConnectorBetweenSites, findEraserHitElementId, generateTicks, rulerDragToGuidePosition, resolveElementInteractivity, getElementTransformWithoutRotation, getElementTransform, buildChartQuickActionsDescriptor, applyChartElementToggle, CHART_QUICK_ACTION_BUTTON_SIZE, applyChartStylePreset, hideChartSeries, restoreFilteredSeries, buildCropOverlay, CROP_HANDLE_ARIA_KEY, getActiveXControlOverlayView, buildCommentMarkers, COMMENT_MARKER_SIZE, collectConnectorSiteCandidates, getConnectorEndpointHandles, findConnectorSiteNear, motionPathToSvgD, motionPathEndPixel, isEditableMotionPath, setMotionPathEnd, canEditElementPoints, hasMultipleSelectedTableCells, isElementLocked, isImageLikeElement, mergeSlideTransition, getElementLabel, effectiveDirection, TRIGGER_OPTIONS, effectiveTimingCurve, mapSlideSorterKey, isEditorTextInputTarget, clampSorterZoom, buildSlideTemplateContent, updateSubtitleSettings, buildFreeformShapeElement, buildLiveInkStrokeView, beginCropDrag, CONNECTOR_SITE_SNAP_PX, resolveConnectorEndpointUpdate, withConnectorEndpointUpdate, getShapeConnectionSites, FreeformToolSession, attachOverlayKeyboard, EditPointsSession, EDIT_POINTS_STYLE, elementLockTogglePatch, buildTableDataGrid, getDenseGridLayoutPlan, appendTableElementRow, removeLastTableElementRow, appendTableElementColumn, removeLastTableElementColumn, removeTableElementColumn, removeTableElementRow, setTableElementCellText, TABLE_STYLE_PRESETS, applyTableStylePreset, tableStyleAssignmentUpdate, evenColumnWidths, redistributeColumnWidth, evenRowHeights, patchChartData, collapseChartTitleRunsForEdit, chartGridlinesState, chartGridlinesPatch, seriesSecondaryAxisPatch, setChartCategoryLabel, setChartCellValue, addChartCategory, removeChartCategory, addChartSeries, removeChartSeries, setDataLabelsRangeCache, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, setChartDataPointMarker, setChartDataPointLabel, describeSmartArtBounds, canAddTopLevelNode, classifyExtraConnections, siblingIndex, siblingCount, canRemoveTopLevelNode, canInteractWithElement, buildOleObjectNamePatch, getOleObjectTypeLabel, sanitizeGradientStops, shouldShowAccessibilitySection, pptxActionToElementAction, withFrameSlides, withSlidesPerPage, THEME_COLOR_SCHEME_KEYS, applyThemeOverrideToSlide, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, schemaLabel, THEME_COLOR_SLOT_LABEL_KEYS, SLIDE_SIZE_PRESETS, TRANSITION_VALID_DIRECTIONS, TRANSITION_ORIENTATION_TYPES, TRANSITION_PATTERN_OPTIONS, TRANSITION_THRUBLK_TYPES, clampTransitionNumber, TRANSITION_SPEED_OPTIONS, TRANSITION_MORPH_OPTIONS, flattenTagCollections, resolveTemplateBackgroundRows, formatCommentTimestamp, commentMentionQuery, matchCommentMentionAuthors, buildAnimationTimelineRows, clearMotionPath, setTrigger, setTriggerBookmark, getEffectSoundState, setEffectSound, setEffectStockSound, setAfterAnimation, setAfterAnimationColor, directionValuesFor, buildAnimationTimelineBars, motionPathPresetIdForPath, EFFECT_SOUND_CATALOGUE, listMediaBookmarkOptions, selectedBookmarkOptionValue, hasTiltData, toElementAxes, dragCropHandle, panCropImage, clientToSlidePoint, EDIT_POINTS_TARGET_ATTR, normalizeTableStyleGuid, describeTableStyleEditor, TABLE_STYLE_EDITOR_PARTS, computeMergeCellRight, computeMergeCellDown, computeSplitCell, updateMergeAttrsInRawXml, resolveDisplayedChartType, CHART_TYPE_OPTIONS, chartDataLabelsTogglePatch, BAR3D_SHAPE_OPTIONS, bar3DShapePatch, RADAR_STYLE_OPTIONS, radarStylePatch, SURFACE_WIREFRAME_OPTIONS, surfaceWireframePatch, isSeriesUsingSecondaryAxis, listChartUserShapeRows, withChartUserShapeAdded, createDefaultChartUserShape, withChartUserShapeRowRemoved, withChartUserShapeRowTextUpdated, SMARTART_COLOR_SCHEME_LABEL_KEYS, SMARTART_STYLE_LABEL_KEYS, addSmartArtNodeAsChild, setSmartArtNodeStyle, removeSmartArtNode, addSiblingAfter, removeEmptyNode, demote, promote, updateSmartArtNodeText, reorder, clampCropValue, DUOTONE_PRESETS, ARTISTIC_EFFECTS, mediaTrimEndSeconds, trimmedMediaDurationMs, mediaTrimEndAbsoluteMs, mediaTrimEndMsFromAbsoluteMs, buildOleEditDialogDescriptor, buildOleContentUpdatePatch, applyOleSheetCellEdit, getOleSheetGrid, applyOleDocumentParagraphEdit, getOleDocumentParagraphs, applyOleNestedDeckElementTextEdit, getOleNestedDeckDetail, replaceOleFile, getNonVisualDescriptionFields, resolveActionType, ELEMENT_ACTION_TYPE_OPTIONS, elementActionToPptxAction, canCommitActionType, slideSizeFromPreset, withSlideSizeOrientation, TRANSITION_DIR_ARROWS, buildDirectionGrid, getSlideTransitionAnimations, SLIDE_TRANSITION_KEYFRAMES, updateTagInCollections, deleteTagFromCollections, addTagToCollections, commentTextSegments, COMMENT_MENTION_CLASS, COMMENT_MENTION_ATTRIBUTE, insertCommentMention, reorderAnimationTimelineRows, applyAnimationTimelineOrder, animationEffectLabel, overlayPointerInput, TABLE_STYLE_BORDER_SIDES, applyTableStyleFieldEdit, createTableStyleEntry, addTableStyleToMap, deleteTableStyleFromMap, LBL, SEL, FILL_MODE_OPTIONS, SECTION_HEADING, NUM, getChartUserShapeGroupTransform, withChartUserShapeGroupChildAdded, createDefaultChartUserShapeGroupChild, withChartUserShapeRowUpdated, getChartUserShapeRowChartBox, withChartUserShapeRowFlipUpdated, withChartUserShapeRowRotationUpdated, withChartUserShapeRowChartBoxUpdated, switchSmartArtLayout, rebuildDrawingShapesIfCleared, mediaTrimEndMsFromSeconds, validateMediaTrimRange, SHAPE_QUICK_STYLES, quickStyleSwatchCss, PATTERN_PRESET_OPTIONS, getPatternSvg, COMPOUND_LINE_OPTIONS, LINE_JOIN_OPTIONS, LINE_CAP_OPTIONS, TEXT_WARP_PRESETS, warpPreviewPath, text3dPtToEmu, text3dEmuToPt, MATERIAL_PRESETS, toSlideIndex, TABLE_STYLE_BORDER_SIDE_LABEL_KEYS, TABLE_STYLE_DASH_PRESETS, GRADIENT_TYPE_OPTIONS, PATTERN_OPTIONS, FILL_PATTERN_LABEL_KEYS, openNativeEyeDropper, toggleText3dExtrusion, BEVEL_PRESETS, cropFit, cropFill, cropToAspectRatio } from './chunk-VUNRFZRR.mjs';
5
- import { LOCALE_CATALOG, ALIGNMENT_LABEL_KEYS } from './chunk-33XJSD62.mjs';
6
- import React7, { createContext, lazy, forwardRef, useEffect, useState, useCallback, useMemo, useRef, useLayoutEffect, useSyncExternalStore, useId, useContext, useDeferredValue, Fragment as Fragment$1, Suspense, useReducer } from 'react';
1
+ import { computeFocusTargets, deckDataFieldChanged, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, collectStoredChats, exportAiChatLogs, applyElementUpdate } from './chunk-YMVJOQIS.mjs';
2
+ import { useViewerOptions, useReadOnlyRecommendationState, useCompatibilityToastsState, useReducedMotion, useViewerState, useIsMobile, useResizablePanels, useDerivedSlideState, useZoomViewport, useEditorHistory, usePresentationSetup, useTouchGestures, useViewerDialogs, useEditorOperations, useViewerIntegration, useViewPreferencesSync, useLayoutSwitching, Rendering3DFlagsContext, CollaborationProvider, useCollaboration, useCollaborationDocumentSync, useFollowMode, useBroadcastFollower, SlideBackgroundImageLayer, StaticElementRenderer, safePrompt, scopeLayoutOptionsToActiveSlide, ChartPartSelectionProvider, useToolbarVisibility, useKeyboardInsets, useModalDismissDrag, ViewerOptionsStoreContext, ViewerOptionsContext, useViewerOptionsContext, useVirtualizedSlides, useSwipeNavigation, PresentationTransitionOverlay, RemoteSelectionOverlay, CollaborationCursorOverlay, useSheetDismissDrag, detectTargetType, parseEmailUrl, parseSlideFromUrl, ACTION_VERB_MAP, ElementRenderer, InlineCollaborationContext, SmartArtRenderer, playAnimationSound, ResizeHandles, imgSrc, renderStrokeView, useChartPartSelection, resolveSmartArtDataPalette } from './chunk-UKR42GJS.mjs';
3
+ import { SHAPE_PRESETS, ANIMATION_PRESET_OPTIONS, cn, SLIDE_NAV_THUMBNAIL_WIDTH, DEFAULT_SECTION_GROUP_ID, SHORTCUT_REFERENCE_ITEMS as SHORTCUT_REFERENCE_ITEMS$1, TOOLBAR_SECTIONS, isConnectorOrLineElement, GRID_SIZE, MIN_ELEMENT_SIZE, CONNECTOR_ARROW_OPTIONS, ARROW_SIZE_OPTIONS, DEFAULT_FILL_COLOR, startMotionPathPreview, startPreviewAnimation, stopPreviewAnimation, DEFAULT_STROKE_COLOR, STROKE_DASH_OPTIONS } from './chunk-HUNX22TC.mjs';
4
+ import { EMPTY_RESOLVED_CUSTOMIZATION, FIXED_TAB_GALLERIES, editingHomeControls, ANIMATION_DIRECTION_LABEL_KEYS, SWITCHABLE_LAYOUT_TYPES, compileEquationTemplateMathMl, buildUserFontFaceStyles, readStoredViewerPrefs, resolveThemeCatalogEntry, THEME_CATALOG, writeStoredViewerPrefs, openPptxFile, readBackstageRecentFile, isFeatureEnabled, isDialogAvailable, resolveAutosaveActivation, buildThemeColorMap, viewerOptionsToPreferences, applyPreferenceToOptions, resolveHistoryDepth, applyAutoCorrect, resolveImageResolutionScale, resolveAutosaveIntervalMs, resolveAutosaveIntervalSeconds, isPanelVisible, shouldShowAutosaveRecoveryPrompt, resolveOptionRootClasses, RIBBON_SCOPE_ATTR, resolve3DRenderingFlags, resolveSlideSizeSelection, RULER_THICKNESS, RULER_FONT_SIZE, editorThumbnailHeight, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, hiddenSlideCue, EDITOR_THUMBNAIL_WIDTH, HIDDEN_SLIDE_SLASH_GRADIENT, HIDDEN_SLIDE_LABEL_KEY, visibleTemplateElements, normalizeHexColor, themeToCssVars, createCustomizationController, resolveEffectiveHiddenActions, listAutosaveSnapshots, resolveExpiredAutosaveSnapshots, deleteAutosaveSnapshot, masterViewCrudActions, applyMasterViewCrudAction, masterViewCrudFailureKey, EDITOR_CHROME_CSS, ribbonCustomizationCss, applyMotionPathPreset, resetSlideLayoutPath, DEFAULT_INSERT_CHART_KIND, hasCopyableFormat, templateSchemeFromTheme, createBackstagePresentation, playFeedbackSound, shouldDiscardAutosaveOnSuccessfulSave, setMasterViewBackgroundColor, canUseClipboard, runProgramNoticeStackStyle, compatToastStackStyle, printPropertiesFrameSlides, printPropertiesSlidesPerPage, PASTE_SPECIAL_OPTIONS, getDensePanelTouchTargetPx, shouldStickyActionRow, customizeOptionsTabs, VIEWER_OPTIONS_TABS, isOptionsPageVisible, DEFAULT_QUICK_ACCESS_COMMAND_IDS, isHeaderFooterDateTextVisible, isHeaderFooterHeaderTextVisible, isHeaderFooterFooterTextVisible, buildJoinCollaborationConfig, buildCreateCollaborationConfig, generateBroadcastRoomId, DEFAULT_BROADCAST_SERVER_URL, buildBroadcastViewerUrl, resolveTransportForServerUrl, getSlideBackgroundStyle, pushRecentColor, mruColorsPatch, shouldClearAutosaveCacheOnClose, canCropElement, cropSessionChanged, cancelCropUpdate, startCropSession, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, editorThumbnailWidth, masterViewBackgroundColor, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, resolvePresentationAction, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, toggleBlackboard, PRESENT_TOOLBAR_CLASSES, resolveEditPointsAvailability, isCurrentLayout, themeColorSchemesEqual, observeElementHeight, EXPANDED_MAX_HEIGHT, STATUS_BAR_CLASSES, buildBarActions, formatVersionTimestamp, formatRelativeTime, scanAvailableFontFamilies, PRESETS, CATEGORIES, convertOmmlToLatex, compileLatexEquation, convertLatexToOmml, EQUATION_TEMPLATES, clampPercent2, resolveDefaultPrintSettings, HANDOUT_OPTIONS, TOOLBAR_TABS, SHORTCUT_REFERENCE_ITEMS, resolveViewerAddinRows, availableQuickAccessCommands, addQuickAccessCommand, removeQuickAccessCommand, moveQuickAccessCommand, CUSTOM_FONT_ACCEPT, activateModalFocus, buildCollaborationShareUrl, buildActiveSessionUsers, SORTER_MIN_ZOOM, SORTER_ZOOM_STEP, SORTER_MAX_ZOOM, canGoPrevious, formatSlideCounter, READING_VIEW_COUNTER_ATTR, canGoNext, READING_VIEW_ATTR, OUTLINE_LEVEL_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_ROW_ATTR, OUTLINE_VIEW_ATTR, mobileElapsedSince, nextPresentedSlide, presenterPrevDisabled, presenterNextDisabled, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, presenterTimerProgress, PRESENTER_CONSOLE_CLASSES, formatElapsed, cropModeKeyAction, extraQuickAccessCommands, visibleContextualTabs, resolveActiveRibbonTab, resolveScreenTip, contextualTabLabelKey, RIBBON_CONTEXTUAL_TAB_ATTR, TAB_ROW_ACTION_CLASSES, customizeBackstageNav, BACKSTAGE_NAV, listBackstageRecentFiles, BACKSTAGE_BACK_CLASSES, BACKSTAGE_NAV_CLASSES, hasTextProperties, textFontSizePtToPx, FREEFORM_TOOL_IDS, isDrawingToolVisible, hasShapeProperties, shapeFillChange, shapeOutlineChange, DESIGN_RIBBON_GROUPS, DESIGN_RIBBON_COMMANDS, designCommandState, CONTEXTUAL_TAB_GROUPS, editorThumbnailStep, resolveSlidePaneClick, SLIDE_VIRTUALIZATION_THRESHOLD, buildSlidePaneContextMenuEntries, isEditPointsEnabled, PRESENTATION_HIT_TEST_CSS, PRESENTATION_STAGE_ATTRIBUTE, buildStrokePathD, cursorForTool, annotationOverlayZIndex, presentationInkPath, resolveNotesSchematicBodyFontSizePx, PRESENTER_NAVIGATOR_LABEL_KEYS, subtitleRecognitionLanguage, subtitleSettingsFromOptions, getSpeechRecognitionCtor, mergeCaptionResults, PEN_COLORS, HIGHLIGHTER_COLORS, isBlackboardActive, customizeContextMenuEntries, buildContextMenuEntries, customizeCanvasContextMenuEntries, buildCanvasContextMenuEntries, buildLayoutPreviewGeometry, scaleSlidesForSizeChange, slideSizeToCanvasPx, resolveSelectionPaneRename, themeEditorLabels, resolveNotesSegments, segmentsToEditorHtml, DEBOUNCE_MS, createPlainNotesSegments, parseSegmentsFromRichEditor, segmentsToPlainText, getCurrentParagraphIndex, segmentsToParagraphs, paragraphsToSegments, MAX_INDENT_LEVEL, INDENT_PX, isUrlSafe, buildNotesPrintHtml, MIN_TOUCH_TARGET_PX, toggleSheet, SMARTART_PREVIEW_ELEMENT_HEIGHT, SMARTART_PREVIEW_ELEMENT_WIDTH, buildSmartArtPreviewElement, sanitizeMathMl, computeHandoutLayout, getPrintableArea, generateNoteLineCount, computeAllNotesPages, getNotesPrintableArea, downloadBlob, clampOptionNumber, QUICK_ACCESS_COMMAND_CATALOG, registerCustomFont, openReadingView, applyReadingViewCommand, createPresentationKeyBuffer, readingViewFitScale, READING_VIEW_STAGE_ATTR, buildOutline, applyOutlineEdit, mapOutlineKey, notesSegmentsToSpans, erasePresentationInkAt, movePresenterPointer, appendPresentationInkPoint, PRESENTER_CONSOLE_CONTROLS, NOTES_FONT_SIZE_DEFAULT, formatTime, NOTES_FONT_SIZE_MIN, clampNotesFontSize, NOTES_FONT_SIZE_STEP, NOTES_FONT_SIZE_MAX, BACKSTAGE_TEMPLATES, formatBackstageDate, formatBackstageSize, customizeBackstageCards, backstageCardsFor, DEFAULT_VIEWER_PROFILE, resolveProfileInitial, AVATAR_COLOR_SWATCHES, resolveDefaultFontFamily, textFontSizePxToPt, clipboardHomeControls, buildFontCatalog, COMMON_FONT_SIZES, getInlineEditorSelectionResult, selectedParagraphBulletKind, elementBulletKind, selectionBulletKind, fontHomeControls, nextToggleValue, CHARACTER_SPACING_OPTIONS, OFFICE_COLOR_SWATCHES, RIBBON_GROUP_ATTR, paragraphHomeAlign, paragraphHomeControls, paragraphHomeAction, RIBBON_CONTROL_ATTR, RIBBON_SHAPE_SWATCHES, buildRibbonGallery, canGroupSelection, canUngroupSelection, canSetStrokeWidth, strokeWidthOf, readRibbonTransitionDraft, SLIDE_SHOW_COMMAND_GROUPS, RECORD_COMMAND_GROUPS, buildReviewRibbon, HELP_RIBBON_COMMANDS, galleryTextLabel, masterViewPseudoSlide, PRESENTATION_ANIM_TRIGGER_ATTRIBUTE, parentSelection, slideSpaceElement, isGroupMember, motionPathFor, setMotionPath, getShapeAdjustmentHandleDescriptors, shouldShowElementHandles, clampFlyoutPosition, computeAnchoredPopupPosition, applyTableStyleDelete, applyTableStyleMapChange, handleReadingViewKey, getLocalStorageUsageSummary, saveViewerProfile, clearAllLocalViewerData, SLIDE_TEMPLATES, getSelectionTextStyleFlags, TEXT_DECORATION_FLAGS, buildThemeColorSwatchGrid, themeColorSwatchRows, findSelectedThemeSwatch, themeSwatchCommit, applyRibbonGalleryItem, MERGE_SHAPES_LABEL_KEY, MERGE_SHAPES_HINT_KEY, MERGE_SHAPES_MENU_ITEMS, CROP_LABEL_KEY, CROP_ASPECT_LABEL_KEY, CROP_ASPECT_GROUP_LABEL_KEYS, CROP_ASPECT_PRESETS, CROP_FILL_LABEL_KEY, CROP_FIT_LABEL_KEY, ribbonTransitionsDraftPatch, ribbonTransitionUpdates, ribbonTransitionsSoundChange, ribbonTransitionStockSoundUrl, playSlideTransitionPreview, playAnimationRibbonPreview, SLIDE_SHOW_OPTIONS, createViewerOptionsStore, subtitleSettingsLabels, attachEditorImagePaste, authorConnectorBetweenSites, findEraserHitElementId, generateTicks, rulerDragToGuidePosition, resolveElementInteractivity, getElementTransformWithoutRotation, getElementTransform, buildChartQuickActionsDescriptor, applyChartElementToggle, CHART_QUICK_ACTION_BUTTON_SIZE, applyChartStylePreset, hideChartSeries, restoreFilteredSeries, buildCropOverlay, CROP_HANDLE_ARIA_KEY, getActiveXControlOverlayView, buildCommentMarkers, COMMENT_MARKER_SIZE, collectConnectorSiteCandidates, getConnectorEndpointHandles, findConnectorSiteNear, motionPathToSvgD, motionPathEndPixel, isEditableMotionPath, setMotionPathEnd, canEditElementPoints, hasMultipleSelectedTableCells, isElementLocked, isImageLikeElement, mergeSlideTransition, getElementLabel, effectiveDirection, TRIGGER_OPTIONS, effectiveTimingCurve, mapSlideSorterKey, isEditorTextInputTarget, clampSorterZoom, buildSlideTemplateContent, updateSubtitleSettings, buildFreeformShapeElement, buildLiveInkStrokeView, beginCropDrag, CONNECTOR_SITE_SNAP_PX, resolveConnectorEndpointUpdate, withConnectorEndpointUpdate, getShapeConnectionSites, FreeformToolSession, attachOverlayKeyboard, EditPointsSession, EDIT_POINTS_STYLE, elementLockTogglePatch, buildTableDataGrid, getDenseGridLayoutPlan, appendTableElementRow, removeLastTableElementRow, appendTableElementColumn, removeLastTableElementColumn, removeTableElementColumn, removeTableElementRow, setTableElementCellText, TABLE_STYLE_PRESETS, applyTableStylePreset, tableStyleAssignmentUpdate, evenColumnWidths, redistributeColumnWidth, evenRowHeights, patchChartData, collapseChartTitleRunsForEdit, chartGridlinesState, chartGridlinesPatch, seriesSecondaryAxisPatch, setChartCategoryLabel, setChartCellValue, addChartCategory, removeChartCategory, addChartSeries, removeChartSeries, setDataLabelsRangeCache, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, setChartDataPointMarker, setChartDataPointLabel, describeSmartArtBounds, canAddTopLevelNode, classifyExtraConnections, siblingIndex, siblingCount, canRemoveTopLevelNode, canInteractWithElement, buildOleObjectNamePatch, getOleObjectTypeLabel, sanitizeGradientStops, shouldShowAccessibilitySection, pptxActionToElementAction, withFrameSlides, withSlidesPerPage, THEME_COLOR_SCHEME_KEYS, applyThemeOverrideToSlide, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, schemaLabel, THEME_COLOR_SLOT_LABEL_KEYS, SLIDE_SIZE_PRESETS, TRANSITION_VALID_DIRECTIONS, TRANSITION_ORIENTATION_TYPES, TRANSITION_PATTERN_OPTIONS, TRANSITION_THRUBLK_TYPES, clampTransitionNumber, TRANSITION_SPEED_OPTIONS, TRANSITION_MORPH_OPTIONS, flattenTagCollections, resolveTemplateBackgroundRows, formatCommentTimestamp, commentMentionQuery, matchCommentMentionAuthors, buildAnimationTimelineRows, clearMotionPath, setTrigger, setTriggerBookmark, getEffectSoundState, setEffectSound, setEffectStockSound, setAfterAnimation, setAfterAnimationColor, directionValuesFor, buildAnimationTimelineBars, motionPathPresetIdForPath, MOTION_PATH_FAMILIES, motionPathPresetsByFamily, motionPathPresetLabelKey, motionPathFamilyLabelKey, EFFECT_SOUND_CATALOGUE, listMediaBookmarkOptions, selectedBookmarkOptionValue, hasTiltData, toElementAxes, dragCropHandle, panCropImage, clientToSlidePoint, EDIT_POINTS_TARGET_ATTR, normalizeTableStyleGuid, describeTableStyleEditor, TABLE_STYLE_EDITOR_PARTS, computeMergeCellRight, computeMergeCellDown, computeSplitCell, updateMergeAttrsInRawXml, resolveDisplayedChartType, CHART_TYPE_OPTIONS, chartDataLabelsTogglePatch, BAR3D_SHAPE_OPTIONS, bar3DShapePatch, RADAR_STYLE_OPTIONS, radarStylePatch, SURFACE_WIREFRAME_OPTIONS, surfaceWireframePatch, isSeriesUsingSecondaryAxis, listChartUserShapeRows, withChartUserShapeAdded, createDefaultChartUserShape, withChartUserShapeRowRemoved, withChartUserShapeRowTextUpdated, SMARTART_COLOR_SCHEME_LABEL_KEYS, SMARTART_STYLE_LABEL_KEYS, addSmartArtNodeAsChild, setSmartArtNodeStyle, removeSmartArtNode, addSiblingAfter, removeEmptyNode, demote, promote, updateSmartArtNodeText, reorder, clampCropValue, DUOTONE_PRESETS, ARTISTIC_EFFECTS, mediaTrimEndSeconds, trimmedMediaDurationMs, mediaTrimEndAbsoluteMs, mediaTrimEndMsFromAbsoluteMs, buildOleEditDialogDescriptor, buildOleContentUpdatePatch, applyOleSheetCellEdit, getOleSheetGrid, applyOleDocumentParagraphEdit, getOleDocumentParagraphs, applyOleNestedDeckElementTextEdit, getOleNestedDeckDetail, replaceOleFile, getNonVisualDescriptionFields, resolveActionType, ELEMENT_ACTION_TYPE_OPTIONS, elementActionToPptxAction, canCommitActionType, slideSizeFromPreset, withSlideSizeOrientation, TRANSITION_DIR_ARROWS, buildDirectionGrid, getSlideTransitionAnimations, SLIDE_TRANSITION_KEYFRAMES, updateTagInCollections, deleteTagFromCollections, addTagToCollections, commentTextSegments, COMMENT_MENTION_CLASS, COMMENT_MENTION_ATTRIBUTE, insertCommentMention, reorderAnimationTimelineRows, applyAnimationTimelineOrder, getEffectSoundAsset, animationEffectLabel, overlayPointerInput, TABLE_STYLE_BORDER_SIDES, applyTableStyleFieldEdit, createTableStyleEntry, addTableStyleToMap, deleteTableStyleFromMap, LBL, SEL, FILL_MODE_OPTIONS, SECTION_HEADING, NUM, getChartUserShapeGroupTransform, withChartUserShapeGroupChildAdded, createDefaultChartUserShapeGroupChild, withChartUserShapeRowUpdated, getChartUserShapeRowChartBox, withChartUserShapeRowFlipUpdated, withChartUserShapeRowRotationUpdated, withChartUserShapeRowChartBoxUpdated, switchSmartArtLayout, rebuildDrawingShapesIfCleared, mediaTrimEndMsFromSeconds, validateMediaTrimRange, SHAPE_QUICK_STYLES, quickStyleSwatchCss, PATTERN_PRESET_OPTIONS, getPatternSvg, COMPOUND_LINE_OPTIONS, LINE_JOIN_OPTIONS, LINE_CAP_OPTIONS, TEXT_WARP_PRESETS, warpPreviewPath, text3dPtToEmu, text3dEmuToPt, MATERIAL_PRESETS, toSlideIndex, TABLE_STYLE_BORDER_SIDE_LABEL_KEYS, TABLE_STYLE_DASH_PRESETS, GRADIENT_TYPE_OPTIONS, PATTERN_OPTIONS, FILL_PATTERN_LABEL_KEYS, openNativeEyeDropper, toggleText3dExtrusion, BEVEL_PRESETS, cropFit, cropFill, cropToAspectRatio } from './chunk-26EMM7IE.mjs';
5
+ import { LOCALE_CATALOG, ALIGNMENT_LABEL_KEYS } from './chunk-GLLEZR4U.mjs';
6
+ import React95, { createContext, lazy, forwardRef, useEffect, useState, useCallback, useMemo, useRef, useLayoutEffect, useSyncExternalStore, useId, useContext, useDeferredValue, Fragment as Fragment$1, Suspense, useReducer } from 'react';
7
7
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
8
  import { useTranslation } from 'react-i18next';
9
- import { LuArrowDown, LuArrowUp, LuArrowRight, LuArrowLeft, LuArrowDownRight, LuArrowDownLeft, LuArrowUpRight, LuArrowUpLeft, LuMessageSquare, LuEyeOff, LuHistory, LuTrash2, LuSettings, LuX, LuCalendarDays, LuClock, LuHash, LuFileText, LuText, LuCast, LuSave, LuUndo, LuRedo, LuSearch, LuShieldCheck, LuPlus, LuPanelLeftClose, LuStickyNote, LuMonitor, LuColumns2, LuPresentation, LuMinus, LuSettings2, LuLayers, LuDownload, LuCheck, LuLock, LuEye, 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, LuFolderOpen, LuSquare, LuImage, LuVideo, LuDatabase, LuAArrowUp, LuAArrowDown, LuRemoveFormatting, LuReplace, LuMousePointer2, LuShapes, LuPaintBucket, LuPenLine, LuPalette, LuPaintbrush, LuCaseSensitive, LuTimer, LuHighlighter, LuEraser, LuGripVertical, LuLoaderCircle, LuBold, LuItalic, LuUnderline, LuStrikethrough, LuList, LuListOrdered, LuIndentIncrease, LuIndentDecrease, LuLink, LuGrid2X2, LuClipboardPaste, LuCopyPlus, LuScan, LuRotateCcw, LuMonitorOff, LuCirclePlay, LuCirclePause, LuCaptions, LuArrowLeftRight, LuClipboardCopy, LuLayoutGrid, LuWand, LuTextCursorInput, LuFile, LuEllipsis, LuUserRound, LuFilePlus2, LuHouse, LuFileJson, LuBox, LuFileImage, LuClock3, LuUser, LuHardDrive, LuLogIn, LuScissors, LuLayoutTemplate, LuFolderPlus, LuSpline, LuMoveRight, LuPencil, LuAlignLeft, LuAlignCenter, LuAlignRight, LuAlignHorizontalSpaceAround, LuAlignVerticalSpaceAround, LuGroup, LuUngroup, LuStar, LuMousePointerClick, LuPanelTop, LuBookOpen, LuGrid3X3, LuPipette, LuRuler, LuMaximize2, LuCode, LuMove, LuRadio, LuAlignJustify, LuColumns3, LuCombine, LuCrop, LuFilter, LuLockOpen, LuReply, LuRotateCw, LuBookmark } from 'react-icons/lu';
9
+ import { LuArrowDown, LuArrowUp, LuArrowRight, LuArrowLeft, LuArrowDownRight, LuArrowDownLeft, LuArrowUpRight, LuArrowUpLeft, LuMessageSquare, LuEyeOff, LuHistory, LuTrash2, LuSettings, LuX, LuCalendarDays, LuClock, LuHash, LuFileText, LuText, LuCast, LuSave, LuUndo, LuRedo, LuSearch, LuShieldCheck, LuPlus, LuPanelLeftClose, LuStickyNote, LuMonitor, LuColumns2, LuPresentation, LuMinus, LuSettings2, LuLayers, LuDownload, LuCheck, LuLock, LuEye, 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, LuFolderOpen, LuMousePointer2, LuShapes, LuPaintBucket, LuPenLine, LuPalette, LuPaintbrush, LuCaseSensitive, LuReplace, LuTimer, LuHighlighter, LuEraser, LuGripVertical, LuLoaderCircle, LuBold, LuItalic, LuUnderline, LuStrikethrough, LuList, LuListOrdered, LuIndentIncrease, LuIndentDecrease, LuLink, LuGrid2X2, LuClipboardPaste, LuCopyPlus, LuScan, LuRotateCcw, LuMonitorOff, LuCirclePlay, LuCirclePause, LuCaptions, LuArrowLeftRight, LuClipboardCopy, LuLayoutGrid, LuWand, LuTextCursorInput, LuFile, LuEllipsis, LuUserRound, LuFilePlus2, LuHouse, LuFileJson, LuBox, LuVideo, LuFileImage, LuDatabase, LuClock3, LuUser, LuHardDrive, LuLogIn, LuLayoutTemplate, LuFolderPlus, LuAlignLeft, LuAlignCenter, LuAlignRight, LuAlignHorizontalSpaceAround, LuAlignVerticalSpaceAround, LuGroup, LuUngroup, LuMove, LuRadio, LuImage, LuColumns3, LuCombine, LuCrop, LuFilter, LuLockOpen, LuPencil, LuReply, LuMoveRight, LuRotateCw, LuScissors, LuBookmark, LuPipette } from 'react-icons/lu';
10
10
 
11
11
  var ViewerThemeContext = createContext(void 0);
12
12
  function ViewerThemeProvider({ theme, children }) {
@@ -464,99 +464,57 @@ function SlideTemplateGalleryDialog({
464
464
  )
465
465
  ] });
466
466
  }
467
- var CATEGORIES2 = [
468
- {
469
- group: "entrance",
470
- labelKey: "pptx.animation.entrance",
471
- tone: "text-emerald-500",
472
- presets: ENTRANCE_PRESET_VALUES
473
- },
474
- {
475
- group: "emphasis",
476
- labelKey: "pptx.animation.emphasis",
477
- tone: "text-amber-500",
478
- presets: EMPHASIS_PRESET_VALUES
479
- },
480
- {
481
- group: "exit",
482
- labelKey: "pptx.animation.exit",
483
- tone: "text-red-500",
484
- presets: EXIT_PRESET_VALUES
485
- }
486
- ];
487
- function AnimationPresetGallery({
488
- disabled,
489
- onAddAnimation
490
- }) {
467
+ function AnimationsSection(p) {
491
468
  const { t } = useTranslation();
492
- return /* @__PURE__ */ jsx(
493
- "div",
494
- {
495
- className: "flex max-h-[62px] items-start gap-2 overflow-y-auto rounded-sm border border-border/60 bg-muted/30 px-1.5 py-1",
496
- "aria-label": t("pptx.animations.galleryAria"),
497
- children: CATEGORIES2.map((category) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
498
- /* @__PURE__ */ jsx("span", { className: "text-[9px] font-semibold leading-3 text-muted-foreground", children: t(category.labelKey) }),
499
- /* @__PURE__ */ jsx("div", { className: "flex max-w-[150px] flex-wrap gap-0.5", children: category.presets.map((preset) => {
500
- const label = t(`pptx.animation.preset.${preset}`);
501
- return /* @__PURE__ */ jsxs(
502
- "button",
503
- {
504
- type: "button",
505
- disabled,
506
- onClick: () => onAddAnimation?.(preset, category.group),
507
- title: label,
508
- className: "inline-flex items-center gap-0.5 rounded-sm px-1 py-0.5 text-[9px] leading-3 text-foreground transition-colors hover:bg-accent disabled:opacity-35",
509
- children: [
510
- /* @__PURE__ */ jsx(
511
- LuStar,
512
- {
513
- className: `h-2.5 w-2.5 fill-current ${category.tone}`,
514
- "aria-hidden": "true"
515
- }
516
- ),
517
- /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: label })
518
- ]
519
- },
520
- preset
521
- );
522
- }) })
523
- ] }, category.group))
524
- }
469
+ const ref = useRef(null);
470
+ const [previewActive, setPreviewActive] = useState(false);
471
+ const timer = useRef(void 0);
472
+ const disabled = !p.canEdit || p.selectedElement === null;
473
+ const selectedAnimation = useMemo(
474
+ () => p.selectedElement ? (p.activeSlide?.animations ?? []).find((a) => a.elementId === p.selectedElement?.id) : void 0,
475
+ [p.activeSlide?.animations, p.selectedElement]
525
476
  );
526
- }
527
- function MotionPathGallery({
528
- disabled,
529
- onApplyMotionPath
530
- }) {
531
- const { t } = useTranslation();
532
- return /* @__PURE__ */ jsx(
533
- "div",
534
- {
535
- className: "flex max-h-[62px] items-start gap-2 overflow-y-auto rounded-sm border border-border/60 bg-muted/30 px-1.5 py-1",
536
- "aria-label": t("pptx.animations.motionPathGalleryAria"),
537
- children: MOTION_PATH_FAMILIES.map((family) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
538
- /* @__PURE__ */ jsx("span", { className: "text-[9px] font-semibold leading-3 text-muted-foreground", children: t(motionPathFamilyLabelKey(family)) }),
539
- /* @__PURE__ */ jsx("div", { className: "flex max-w-[150px] flex-wrap gap-0.5", children: motionPathPresetsByFamily(family).map((preset) => {
540
- const label = t(motionPathPresetLabelKey(preset.id));
541
- return /* @__PURE__ */ jsxs(
542
- "button",
543
- {
544
- type: "button",
545
- disabled,
546
- onClick: () => onApplyMotionPath?.(preset.id),
547
- title: label,
548
- className: "inline-flex items-center gap-0.5 rounded-sm px-1 py-0.5 text-[9px] leading-3 text-foreground transition-colors hover:bg-accent disabled:opacity-35",
549
- children: [
550
- /* @__PURE__ */ jsx(LuMoveRight, { className: "h-2.5 w-2.5 text-sky-500", "aria-hidden": "true" }),
551
- /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: label })
552
- ]
553
- },
554
- preset.id
555
- );
556
- }) })
557
- ] }, family))
477
+ useEffect(() => () => clearTimeout(timer.current), []);
478
+ useEffect(() => {
479
+ const host = ref.current;
480
+ if (!host) {
481
+ return;
558
482
  }
559
- );
483
+ host.state = {
484
+ editable: p.canEdit,
485
+ hasSelection: p.selectedElement !== null,
486
+ paneOpen: p.isInspectorPaneOpen,
487
+ previewActive,
488
+ translate: t
489
+ };
490
+ }, [p.canEdit, p.selectedElement, p.isInspectorPaneOpen, previewActive, t]);
491
+ useEffect(() => {
492
+ const host = ref.current;
493
+ if (!host) {
494
+ return;
495
+ }
496
+ const request = (event) => {
497
+ const intent = event.detail;
498
+ if (intent.kind === "add") {
499
+ p.onAddAnimation?.(intent.preset, intent.group);
500
+ } else if (intent.value === "remove") {
501
+ p.onRemoveAnimation?.();
502
+ } else if (intent.value === "preview") {
503
+ if (disabled) {
504
+ return;
505
+ }
506
+ setPreviewActive(true);
507
+ clearTimeout(timer.current);
508
+ timer.current = setTimeout(() => setPreviewActive(false), 1200);
509
+ playAnimationRibbonPreview(document, selectedAnimation);
510
+ } else {
511
+ (p.onOpenAnimationPanel ?? p.onToggleInspector)();
512
+ }
513
+ };
514
+ host.addEventListener("animations-request", request);
515
+ return () => host.removeEventListener("animations-request", request);
516
+ }, [p, disabled, selectedAnimation]);
517
+ return /* @__PURE__ */ jsx("pptx-ui-ribbon-animations", { ref });
560
518
  }
561
519
  function controlAttr(id) {
562
520
  return id ? { [RIBBON_CONTROL_ATTR]: id } : {};
@@ -570,291 +528,6 @@ function RibbonGroupScope({
570
528
  }) {
571
529
  return /* @__PURE__ */ jsx("div", { className: "contents", ...groupAttr(id), children });
572
530
  }
573
- function RibbonGroup({
574
- label,
575
- children,
576
- className,
577
- groupId
578
- }) {
579
- return /* @__PURE__ */ jsxs(
580
- "section",
581
- {
582
- ...groupAttr(groupId),
583
- className: cn(
584
- "relative flex min-h-[78px] self-stretch shrink-0 items-start gap-1 border-r border-border/60 px-2 pb-4 pt-1 last:border-r-0",
585
- className
586
- ),
587
- "aria-label": label,
588
- children: [
589
- children,
590
- /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute inset-x-1 bottom-0.5 truncate text-center text-[9px] leading-3 text-muted-foreground", children: label })
591
- ]
592
- }
593
- );
594
- }
595
- function RibbonCommand({
596
- label,
597
- icon,
598
- onClick,
599
- disabled,
600
- active,
601
- compact = false,
602
- title,
603
- pressed,
604
- controlId
605
- }) {
606
- return /* @__PURE__ */ jsxs(
607
- "button",
608
- {
609
- type: "button",
610
- ...controlAttr(controlId),
611
- onClick,
612
- disabled,
613
- title: title ?? label,
614
- "aria-pressed": pressed,
615
- className: cn(
616
- "inline-flex rounded-sm text-foreground transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-35",
617
- active && "bg-primary/15 text-primary ring-1 ring-primary/35",
618
- compact ? "h-[26px] min-w-[88px] items-center gap-1.5 px-1.5 text-left text-[10px] leading-3" : "h-[58px] min-w-[54px] max-w-[72px] flex-col items-center justify-start gap-0.5 px-1 py-1 text-center text-[9px] leading-[11px]"
619
- ),
620
- children: [
621
- /* @__PURE__ */ jsx(
622
- "span",
623
- {
624
- className: cn(
625
- "grid shrink-0 place-items-center text-primary",
626
- compact ? "h-4 w-4 [&>svg]:h-4 [&>svg]:w-4" : "h-7 w-7 [&>svg]:h-6 [&>svg]:w-6"
627
- ),
628
- "aria-hidden": "true",
629
- children: icon
630
- }
631
- ),
632
- /* @__PURE__ */ jsx("span", { children: label })
633
- ]
634
- }
635
- );
636
- }
637
- function RibbonCommandStack({
638
- children
639
- }) {
640
- return /* @__PURE__ */ jsx("div", { className: "flex flex-col justify-start gap-0.5", children });
641
- }
642
- function RibbonToggle({
643
- label,
644
- checked,
645
- onChange,
646
- disabled,
647
- title,
648
- controlId
649
- }) {
650
- return /* @__PURE__ */ jsxs(
651
- "label",
652
- {
653
- ...controlAttr(controlId),
654
- title,
655
- className: cn(
656
- "flex h-[19px] items-center gap-1 whitespace-nowrap rounded-sm px-1 text-[10px] text-foreground",
657
- checked && "bg-primary/15 text-primary"
658
- ),
659
- children: [
660
- /* @__PURE__ */ jsx(
661
- "input",
662
- {
663
- type: "checkbox",
664
- checked,
665
- disabled,
666
- onChange: (event) => onChange?.(event.target.checked),
667
- className: "h-3 w-3 accent-primary disabled:opacity-35"
668
- }
669
- ),
670
- label
671
- ]
672
- }
673
- );
674
- }
675
- function AnimationsSection(p) {
676
- const { t } = useTranslation();
677
- const [previewActive, setPreviewActive] = useState(false);
678
- const disabled = !p.canEdit || p.selectedElement === null;
679
- const selectedAnimation = useMemo(
680
- () => p.selectedElement ? (p.activeSlide?.animations ?? []).find((a) => a.elementId === p.selectedElement?.id) : void 0,
681
- [p.activeSlide?.animations, p.selectedElement]
682
- );
683
- const preview = () => {
684
- if (disabled) {
685
- return;
686
- }
687
- setPreviewActive(true);
688
- setTimeout(() => setPreviewActive(false), 1200);
689
- playAnimationRibbonPreview(document, selectedAnimation);
690
- };
691
- return /* @__PURE__ */ jsxs(Fragment, { children: [
692
- /* @__PURE__ */ jsx(RibbonGroup, { label: t("pptx.animations.preview"), groupId: "animations.preview", children: /* @__PURE__ */ jsx(
693
- RibbonCommand,
694
- {
695
- controlId: "animations.preview.preview",
696
- label: t("pptx.animations.preview"),
697
- icon: /* @__PURE__ */ jsx(LuPlay, {}),
698
- onClick: preview,
699
- disabled,
700
- active: previewActive,
701
- title: t("pptx.animations.previewTooltip")
702
- }
703
- ) }),
704
- /* @__PURE__ */ jsx(
705
- RibbonGroup,
706
- {
707
- label: t("pptx.animations.animation", { defaultValue: "Animation" }),
708
- className: "max-w-[500px] overflow-hidden",
709
- groupId: "animations.animation",
710
- children: /* @__PURE__ */ jsx("div", { className: "contents", ...controlAttr("animations.animation.gallery"), children: /* @__PURE__ */ jsx(AnimationPresetGallery, { disabled, onAddAnimation: p.onAddAnimation }) })
711
- }
712
- ),
713
- /* @__PURE__ */ jsx(
714
- RibbonGroup,
715
- {
716
- label: t("pptx.animation.motionPath"),
717
- className: "max-w-[420px] overflow-hidden",
718
- groupId: "animations.motionPath",
719
- children: /* @__PURE__ */ jsx("div", { className: "contents", ...controlAttr("animations.motionPath.gallery"), children: /* @__PURE__ */ jsx(
720
- MotionPathGallery,
721
- {
722
- disabled,
723
- onApplyMotionPath: (presetId) => p.onAddAnimation?.(presetId, "motionPath")
724
- }
725
- ) })
726
- }
727
- ),
728
- /* @__PURE__ */ jsxs(
729
- RibbonGroup,
730
- {
731
- label: t("pptx.animations.advanced", { defaultValue: "Advanced Animation" }),
732
- groupId: "animations.advancedAnimation",
733
- children: [
734
- /* @__PURE__ */ jsx(
735
- RibbonCommand,
736
- {
737
- label: t("pptx.animations.exitEffects", { defaultValue: "Exit Effects" }),
738
- icon: /* @__PURE__ */ jsx(LuStar, { className: "text-red-500" }),
739
- onClick: () => p.onAddAnimation?.("fadeOut", "exit"),
740
- disabled
741
- }
742
- ),
743
- /* @__PURE__ */ jsx(
744
- RibbonCommand,
745
- {
746
- label: t("pptx.animations.pathAnimation", { defaultValue: "Path Animation" }),
747
- icon: /* @__PURE__ */ jsx(LuMoveRight, {}),
748
- onClick: () => p.onAddAnimation?.(DEFAULT_MOTION_PATH_PRESET_ID, "motionPath"),
749
- disabled
750
- }
751
- ),
752
- /* @__PURE__ */ jsxs(RibbonCommandStack, { children: [
753
- /* @__PURE__ */ jsx(
754
- RibbonCommand,
755
- {
756
- compact: true,
757
- controlId: "animations.animation.effectOptions",
758
- label: t("pptx.animations.effectOptions", { defaultValue: "Effect Options" }),
759
- icon: /* @__PURE__ */ jsx(LuSparkles, {}),
760
- onClick: p.onOpenAnimationPanel ?? p.onToggleInspector,
761
- disabled
762
- }
763
- ),
764
- /* @__PURE__ */ jsx(
765
- RibbonCommand,
766
- {
767
- compact: true,
768
- controlId: "animations.advancedAnimation.animationPane",
769
- label: t("pptx.animations.animationPanel"),
770
- icon: /* @__PURE__ */ jsx(LuPanelRight, {}),
771
- onClick: p.onOpenAnimationPanel ?? p.onToggleInspector,
772
- active: p.isInspectorPaneOpen,
773
- title: t("pptx.animations.openPanelTooltip")
774
- }
775
- )
776
- ] }),
777
- /* @__PURE__ */ jsxs(RibbonCommandStack, { children: [
778
- /* @__PURE__ */ jsx(
779
- RibbonCommand,
780
- {
781
- compact: true,
782
- controlId: "animations.advancedAnimation.trigger",
783
- label: t("pptx.animations.trigger", { defaultValue: "Trigger" }),
784
- icon: /* @__PURE__ */ jsx(LuMousePointerClick, {}),
785
- onClick: p.onOpenAnimationPanel ?? p.onToggleInspector,
786
- disabled
787
- }
788
- ),
789
- /* @__PURE__ */ jsx(
790
- RibbonCommand,
791
- {
792
- compact: true,
793
- controlId: "animations.advancedAnimation.animationPainter",
794
- label: t("pptx.animations.painter", { defaultValue: "Animation Painter" }),
795
- icon: /* @__PURE__ */ jsx(LuPaintbrush, {}),
796
- disabled: true
797
- }
798
- )
799
- ] }),
800
- /* @__PURE__ */ jsx(
801
- RibbonCommand,
802
- {
803
- controlId: "animations.advancedAnimation.remove",
804
- label: t("pptx.animations.remove"),
805
- icon: /* @__PURE__ */ jsx(LuTrash2, {}),
806
- onClick: p.onRemoveAnimation,
807
- disabled,
808
- title: t("pptx.animations.removeTooltip")
809
- }
810
- )
811
- ]
812
- }
813
- ),
814
- /* @__PURE__ */ jsx(
815
- RibbonGroup,
816
- {
817
- label: t("pptx.animations.timing", { defaultValue: "Timing" }),
818
- groupId: "animations.timing",
819
- children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[48px_82px] items-center gap-x-1 gap-y-1 text-[10px]", children: [
820
- /* @__PURE__ */ jsx("label", { htmlFor: "pptx-animation-start", children: t("pptx.animations.start", { defaultValue: "Start" }) }),
821
- /* @__PURE__ */ jsxs(
822
- "select",
823
- {
824
- id: "pptx-animation-start",
825
- ...controlAttr("animations.timing.start"),
826
- disabled: true,
827
- className: "h-6 rounded-sm border border-border bg-muted px-1 text-[10px]",
828
- children: [
829
- /* @__PURE__ */ jsx("option", { children: t("pptx.animations.onClick", { defaultValue: "On Click" }) }),
830
- /* @__PURE__ */ jsx("option", { children: t("pptx.animations.withPrevious", { defaultValue: "With Previous" }) }),
831
- /* @__PURE__ */ jsx("option", { children: t("pptx.animations.afterPrevious", { defaultValue: "After Previous" }) })
832
- ]
833
- }
834
- ),
835
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
836
- /* @__PURE__ */ jsx(LuClock3, {}),
837
- " ",
838
- t("pptx.animations.duration", { defaultValue: "Duration" })
839
- ] }),
840
- /* @__PURE__ */ jsx(
841
- "input",
842
- {
843
- type: "number",
844
- min: "0",
845
- step: "0.1",
846
- defaultValue: "0.5",
847
- disabled: true,
848
- "aria-label": t("pptx.animations.duration", { defaultValue: "Duration" }),
849
- ...controlAttr("animations.timing.duration"),
850
- className: "h-6 rounded-sm border border-border bg-muted px-1 text-[10px]"
851
- }
852
- )
853
- ] })
854
- }
855
- )
856
- ] });
857
- }
858
531
  var ShapeFormatContext = createContext(null);
859
532
  function useShapeFormatContext() {
860
533
  return useContext(ShapeFormatContext);
@@ -915,38 +588,6 @@ var DISTRIBUTE_BTNS = [
915
588
  { k: "horizontal", el: /* @__PURE__ */ jsx(LuAlignHorizontalSpaceAround, { className: ic }) },
916
589
  { k: "vertical", el: /* @__PURE__ */ jsx(LuAlignVerticalSpaceAround, { className: ic }) }
917
590
  ];
918
- var DRAW_TOOLS = [
919
- {
920
- id: "select",
921
- icon: /* @__PURE__ */ jsx(LuMoveRight, { className: ic }),
922
- labelKey: "pptx.ribbon.tool.select",
923
- ac: "bg-primary text-white"
924
- },
925
- {
926
- id: "pen",
927
- icon: /* @__PURE__ */ jsx(LuPencil, { className: ic }),
928
- labelKey: "pptx.ribbon.tool.pen",
929
- ac: "bg-primary text-white"
930
- },
931
- {
932
- id: "highlighter",
933
- icon: /* @__PURE__ */ jsx(LuType, { className: ic }),
934
- labelKey: "pptx.ribbon.tool.highlighter",
935
- ac: "bg-yellow-600 text-white"
936
- },
937
- {
938
- id: "eraser",
939
- icon: /* @__PURE__ */ jsx(LuMinus, { className: ic }),
940
- labelKey: "pptx.ribbon.tool.eraser",
941
- ac: "bg-red-600 text-white"
942
- },
943
- {
944
- id: "freeform",
945
- icon: /* @__PURE__ */ jsx(LuSpline, { className: ic }),
946
- labelKey: "pptx.ribbon.tool.freeform",
947
- ac: "bg-primary text-white"
948
- }
949
- ];
950
591
  var OV = [
951
592
  {
952
593
  k: "png",
@@ -1038,22 +679,6 @@ var OV = [
1038
679
  i: /* @__PURE__ */ jsx(LuShieldAlert, { className: `${ics} text-muted-foreground` })
1039
680
  }
1040
681
  ];
1041
- var FMT = [
1042
- { id: "bold", i: /* @__PURE__ */ jsx(LuBold, { className: ic }), labelKey: "pptx.textPanel.bold" },
1043
- { id: "italic", i: /* @__PURE__ */ jsx(LuItalic, { className: ic }), labelKey: "pptx.textPanel.italic" },
1044
- { id: "underline", i: /* @__PURE__ */ jsx(LuUnderline, { className: ic }), labelKey: "pptx.textPanel.underline" },
1045
- {
1046
- id: "strikethrough",
1047
- i: /* @__PURE__ */ jsx(LuStrikethrough, { className: ic }),
1048
- labelKey: "pptx.textPanel.strikethrough"
1049
- }
1050
- ];
1051
- var ATXT = [
1052
- { id: "left", i: /* @__PURE__ */ jsx(LuAlignLeft, { className: ic }), labelKey: "pptx.ribbon.alignLeft" },
1053
- { id: "center", i: /* @__PURE__ */ jsx(LuAlignCenter, { className: ic }), labelKey: "pptx.ribbon.alignCenter" },
1054
- { id: "right", i: /* @__PURE__ */ jsx(LuAlignRight, { className: ic }), labelKey: "pptx.ribbon.alignRight" },
1055
- { id: "justify", i: /* @__PURE__ */ jsx(LuAlignJustify, { className: ic }), labelKey: "pptx.ribbon.justify" }
1056
- ];
1057
682
  function useRibbonDropdown() {
1058
683
  const [open, setOpen] = useState(false);
1059
684
  const ref = useRef(null);
@@ -1587,295 +1212,66 @@ function WebRibbonToggle({
1587
1212
  }
1588
1213
  );
1589
1214
  }
1590
- function useTransitionSoundPicker(activeSlide, onTransitionChange) {
1591
- const soundFileInputRef = React7.useRef(null);
1592
- const handleSoundFilePicked = React7.useCallback(
1593
- (file) => {
1594
- void readSoundFileAsDataUrl(file).then((dataUrl) => {
1595
- if (dataUrl) {
1596
- onTransitionChange(applyTransitionSoundFile({ name: file.name, dataUrl }));
1597
- }
1598
- return void 0;
1599
- });
1600
- },
1601
- [onTransitionChange]
1602
- );
1603
- const handleSoundSelectChange = React7.useCallback(
1604
- (event) => {
1605
- const value = event.target.value;
1606
- if (value === TRANSITION_SOUND_OTHER_VALUE) {
1607
- soundFileInputRef.current?.click();
1608
- event.target.value = transitionSoundSelectedValue(activeSlide?.transition);
1609
- return;
1610
- }
1611
- if (value === TRANSITION_SOUND_NONE_VALUE) {
1612
- onTransitionChange(clearTransitionSound());
1613
- return;
1614
- }
1615
- const patch = applyTransitionStockSound(value);
1616
- if (patch) {
1617
- onTransitionChange(patch);
1618
- }
1619
- },
1620
- [activeSlide, onTransitionChange]
1621
- );
1622
- const handleSoundFileChange = React7.useCallback(
1623
- (event) => {
1624
- const file = event.target.files?.[0];
1625
- if (file) {
1626
- handleSoundFilePicked(file);
1627
- }
1628
- event.target.value = "";
1629
- },
1630
- [handleSoundFilePicked]
1631
- );
1632
- const stockSoundId = transitionStockSoundId(activeSlide?.transition);
1633
- const handleSoundPreview = React7.useCallback(() => {
1634
- if (!stockSoundId) {
1635
- return;
1636
- }
1637
- const asset = getEffectSoundAsset(stockSoundId);
1638
- if (asset) {
1639
- playAnimationSound(asset.dataUrl);
1640
- }
1641
- }, [stockSoundId]);
1642
- return {
1643
- soundFileInputRef,
1644
- stockSoundId,
1645
- handleSoundSelectChange,
1646
- handleSoundFileChange,
1647
- handleSoundPreview
1648
- };
1649
- }
1650
1215
  function TransitionsSection(p) {
1651
1216
  const { t } = useTranslation();
1652
- const canEdit = p.canEdit !== false;
1653
- const draft = React7.useMemo(() => readRibbonTransitionDraft(p.activeSlide), [p.activeSlide]);
1654
- const [durationBuffer, setDurationBuffer] = React7.useState(null);
1655
- const [advanceBuffer, setAdvanceBuffer] = React7.useState(null);
1656
- const commit = React7.useCallback(
1657
- (changes) => {
1658
- p.onTransitionChange(ribbonTransitionUpdates({ ...draft, ...changes }));
1659
- },
1660
- [draft, p]
1661
- );
1662
- const {
1663
- soundFileInputRef,
1664
- stockSoundId,
1665
- handleSoundSelectChange,
1666
- handleSoundFileChange,
1667
- handleSoundPreview
1668
- } = useTransitionSoundPicker(p.activeSlide, p.onTransitionChange);
1669
- return /* @__PURE__ */ jsxs(Fragment, { children: [
1670
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "transitions.preview", children: /* @__PURE__ */ jsxs(
1671
- "button",
1672
- {
1673
- type: "button",
1674
- className: pill,
1675
- title: t("pptx.ribbon.previewTransition"),
1676
- onClick: () => playSlideTransitionPreview(p.activeSlide?.transition, document),
1677
- ...controlAttr("transitions.preview.preview"),
1678
- children: [
1679
- /* @__PURE__ */ jsx(LuPlay, { className: ics }),
1680
- t("pptx.ribbon.preview")
1681
- ]
1682
- }
1683
- ) }),
1684
- sep,
1685
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "transitions.transitionToThisSlide", children: /* @__PURE__ */ jsx(
1686
- "div",
1687
- {
1688
- className: "inline-flex items-center gap-0.5 overflow-x-auto max-w-[420px]",
1689
- ...controlAttr("transitions.transitionToThisSlide.gallery"),
1690
- children: RIBBON_TRANSITION_PRESETS.map((preset) => /* @__PURE__ */ jsx(
1691
- "button",
1692
- {
1693
- type: "button",
1694
- disabled: !canEdit,
1695
- onClick: () => commit({ type: preset.type }),
1696
- className: cn(
1697
- "flex-shrink-0 px-2 py-1 max-md:min-h-[44px] rounded border text-[11px] leading-tight transition-colors",
1698
- draft.type === preset.type ? "border-primary bg-primary/10 text-primary font-medium" : "border-border bg-muted hover:bg-accent text-foreground"
1699
- ),
1700
- title: t("pptx.ribbon.transitionTitle", { name: t(preset.labelKey) }),
1701
- children: t(preset.labelKey)
1702
- },
1703
- preset.type
1704
- ))
1217
+ const ref = useRef(null);
1218
+ const draft = useMemo(() => readRibbonTransitionDraft(p.activeSlide), [p.activeSlide]);
1219
+ const transition = p.activeSlide?.transition;
1220
+ const editable = p.canEdit !== false;
1221
+ useEffect(() => {
1222
+ const host = ref.current;
1223
+ if (host) {
1224
+ host.state = {
1225
+ draft,
1226
+ transition,
1227
+ editable,
1228
+ inspectorOpen: p.isInspectorPaneOpen,
1229
+ translate: t
1230
+ };
1231
+ }
1232
+ }, [draft, transition, editable, p.isInspectorPaneOpen, t]);
1233
+ useEffect(() => {
1234
+ const host = ref.current;
1235
+ if (!host) {
1236
+ return;
1237
+ }
1238
+ const request = (event) => {
1239
+ const intent = event.detail;
1240
+ const patch = ribbonTransitionsDraftPatch(intent);
1241
+ if (patch) {
1242
+ p.onTransitionChange(ribbonTransitionUpdates({ ...draft, ...patch }));
1243
+ return;
1705
1244
  }
1706
- ) }),
1707
- sep,
1708
- /* @__PURE__ */ jsxs(RibbonGroupScope, { id: "transitions.timing", children: [
1709
- /* @__PURE__ */ jsxs(
1710
- "label",
1711
- {
1712
- className: "inline-flex items-center gap-1.5 text-xs text-muted-foreground",
1713
- ...controlAttr("transitions.timing.duration"),
1714
- children: [
1715
- /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: t("pptx.ribbon.duration") }),
1716
- /* @__PURE__ */ jsx(
1717
- "input",
1718
- {
1719
- type: "number",
1720
- min: 0,
1721
- max: 20,
1722
- step: 0.25,
1723
- disabled: !canEdit,
1724
- value: durationBuffer ?? String(draft.durationSec),
1725
- onChange: (e) => {
1726
- setDurationBuffer(e.target.value);
1727
- const seconds = Number(e.target.value);
1728
- if (Number.isFinite(seconds) && e.target.value !== "") {
1729
- commit({ durationSec: seconds });
1730
- }
1731
- },
1732
- onBlur: () => setDurationBuffer(null),
1733
- className: "w-16 px-1.5 py-1 rounded border border-border bg-muted text-xs text-foreground text-center",
1734
- title: t("pptx.ribbon.transitionDurationTitle")
1735
- }
1736
- )
1737
- ]
1738
- }
1739
- ),
1740
- sep,
1741
- /* @__PURE__ */ jsxs(
1742
- "label",
1743
- {
1744
- className: "inline-flex items-center gap-1.5 text-xs text-muted-foreground",
1745
- ...controlAttr("transitions.timing.sound"),
1746
- children: [
1747
- /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: t("pptx.ribbon.sound") }),
1748
- /* @__PURE__ */ jsx(
1749
- "select",
1750
- {
1751
- "aria-label": t("pptx.ribbon.sound"),
1752
- className: "w-24 px-1.5 py-1 rounded border border-border bg-muted text-xs text-foreground disabled:opacity-50",
1753
- disabled: !canEdit,
1754
- value: transitionSoundSelectedValue(p.activeSlide?.transition),
1755
- onChange: handleSoundSelectChange,
1756
- children: transitionSoundOptions(p.activeSlide?.transition).map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.i18nKey ? t(option.i18nKey) : option.label }, option.value))
1757
- }
1758
- ),
1759
- /* @__PURE__ */ jsx(
1760
- "button",
1761
- {
1762
- type: "button",
1763
- "aria-label": t("pptx.animation.sound.preview"),
1764
- onClick: handleSoundPreview,
1765
- disabled: !stockSoundId,
1766
- className: "shrink-0 rounded border border-border bg-muted p-1 disabled:opacity-40",
1767
- children: /* @__PURE__ */ jsx(LuPlay, { className: "h-3 w-3" })
1768
- }
1769
- ),
1770
- /* @__PURE__ */ jsx(
1771
- "input",
1772
- {
1773
- ref: soundFileInputRef,
1774
- type: "file",
1775
- accept: "audio/*",
1776
- className: "hidden",
1777
- onChange: handleSoundFileChange
1778
- }
1779
- )
1780
- ]
1781
- }
1782
- ),
1783
- sep,
1784
- /* @__PURE__ */ jsxs(
1785
- "button",
1786
- {
1787
- type: "button",
1788
- disabled: !canEdit,
1789
- className: pill,
1790
- title: t("pptx.ribbon.applyTransitionToAll"),
1791
- ...controlAttr("transitions.timing.applyToAll"),
1792
- onClick: p.onApplyTransitionToAll,
1793
- children: [
1794
- /* @__PURE__ */ jsx(LuCopy, { className: ics }),
1795
- t("pptx.headerFooter.applyToAll")
1796
- ]
1797
- }
1798
- ),
1799
- sep,
1800
- /* @__PURE__ */ jsxs("div", { className: "inline-flex flex-col gap-1 text-xs text-muted-foreground", children: [
1801
- /* @__PURE__ */ jsx("span", { className: "text-[10px] font-medium text-foreground", children: t("pptx.ribbon.advanceSlide") }),
1802
- /* @__PURE__ */ jsxs(
1803
- "label",
1804
- {
1805
- className: "inline-flex items-center gap-1.5 cursor-pointer",
1806
- ...controlAttr("transitions.timing.advanceOnClick"),
1807
- children: [
1808
- /* @__PURE__ */ jsx(
1809
- "input",
1810
- {
1811
- type: "checkbox",
1812
- disabled: !canEdit,
1813
- checked: draft.advanceOnClick,
1814
- onChange: (e) => commit({ advanceOnClick: e.target.checked }),
1815
- className: "accent-primary h-3 w-3"
1816
- }
1817
- ),
1818
- /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: t("pptx.ribbon.onMouseClick") })
1819
- ]
1820
- }
1821
- ),
1822
- /* @__PURE__ */ jsxs(
1823
- "label",
1824
- {
1825
- className: "inline-flex items-center gap-1.5 cursor-pointer",
1826
- ...controlAttr("transitions.timing.advanceAfter"),
1827
- children: [
1828
- /* @__PURE__ */ jsx(
1829
- "input",
1830
- {
1831
- type: "checkbox",
1832
- "aria-label": t("pptx.ribbon.afterDuration"),
1833
- disabled: !canEdit,
1834
- checked: draft.advanceAfter,
1835
- onChange: (e) => commit({ advanceAfter: e.target.checked }),
1836
- className: "accent-primary h-3 w-3"
1837
- }
1838
- ),
1839
- /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: t("pptx.ribbon.afterDuration") }),
1840
- /* @__PURE__ */ jsx(
1841
- "input",
1842
- {
1843
- type: "text",
1844
- "aria-label": t("pptx.ribbon.advanceAfterSeconds"),
1845
- value: advanceBuffer ?? draft.advanceAfterText,
1846
- onChange: (e) => {
1847
- setAdvanceBuffer(e.target.value);
1848
- commit({ advanceAfter: true, advanceAfterText: e.target.value });
1849
- },
1850
- onBlur: () => setAdvanceBuffer(null),
1851
- disabled: !canEdit || !draft.advanceAfter,
1852
- className: "w-16 px-1 py-0.5 rounded border border-border bg-muted text-xs text-foreground text-center disabled:opacity-50",
1853
- title: t("pptx.ribbon.advanceAfterSeconds")
1854
- }
1855
- )
1856
- ]
1245
+ switch (intent.kind) {
1246
+ case "preview":
1247
+ playSlideTransitionPreview(transition, document);
1248
+ break;
1249
+ case "applyToAll":
1250
+ p.onApplyTransitionToAll();
1251
+ break;
1252
+ case "inspector":
1253
+ p.onToggleInspector();
1254
+ break;
1255
+ case "soundPreview": {
1256
+ const url = ribbonTransitionStockSoundUrl(transition);
1257
+ if (url) {
1258
+ playAnimationSound(url);
1857
1259
  }
1858
- )
1859
- ] })
1860
- ] }),
1861
- sep,
1862
- /* @__PURE__ */ jsxs(
1863
- "button",
1864
- {
1865
- type: "button",
1866
- onClick: p.onToggleInspector,
1867
- className: cn(
1868
- pill,
1869
- p.isInspectorPaneOpen ? "bg-primary hover:bg-primary/80 text-white" : ""
1870
- ),
1871
- title: t("pptx.ribbon.openInspectorTransitions"),
1872
- children: [
1873
- /* @__PURE__ */ jsx(LuPanelRight, { className: ic }),
1874
- t("pptx.ribbon.inspector")
1875
- ]
1260
+ break;
1261
+ }
1262
+ default:
1263
+ void ribbonTransitionsSoundChange(intent).then((change) => {
1264
+ if (change) {
1265
+ p.onTransitionChange(change);
1266
+ }
1267
+ return void 0;
1268
+ });
1876
1269
  }
1877
- )
1878
- ] });
1270
+ };
1271
+ host.addEventListener("transitions-request", request);
1272
+ return () => host.removeEventListener("transitions-request", request);
1273
+ }, [draft, transition, p]);
1274
+ return /* @__PURE__ */ jsx("pptx-ui-ribbon-transitions", { ref });
1879
1275
  }
1880
1276
  function DesignSection(p) {
1881
1277
  const { t } = useTranslation();
@@ -1936,88 +1332,52 @@ var RecentColorsProvider = RecentColorsContext.Provider;
1936
1332
  function useRecentColors() {
1937
1333
  return useContext(RecentColorsContext);
1938
1334
  }
1939
- var DRAW_TOOL_CONTROL = {
1940
- select: "draw.tools.select",
1941
- pen: "draw.tools.pen",
1942
- highlighter: "draw.tools.highlighter",
1943
- eraser: "draw.tools.eraser"
1944
- };
1945
1335
  function DrawSection(p) {
1946
1336
  const { t } = useTranslation();
1947
- const { pushColor } = useRecentColors();
1948
- const colorRef = useRef(null);
1337
+ const { pushColor, recentColors } = useRecentColors();
1338
+ const ref = useRef(null);
1949
1339
  useEffect(() => {
1950
- const el = colorRef.current;
1951
- if (!el) {
1340
+ const host = ref.current;
1341
+ if (!host) {
1952
1342
  return;
1953
1343
  }
1954
- const handler = () => pushColor(el.value);
1955
- el.addEventListener("change", handler);
1956
- return () => el.removeEventListener("change", handler);
1957
- }, [pushColor]);
1958
- return /* @__PURE__ */ jsxs(RibbonGroupScope, { id: "draw.tools", children: [
1959
- /* @__PURE__ */ jsx("div", { className: grp, children: DRAW_TOOLS.map((tool, i, a) => /* @__PURE__ */ jsx(
1960
- "button",
1961
- {
1962
- type: "button",
1963
- onClick: () => p.onSetActiveTool(tool.id),
1964
- className: cn(
1965
- i < a.length - 1 ? gB : gL,
1966
- p.activeTool === tool.id ? tool.ac ?? "bg-accent text-foreground" : ""
1967
- ),
1968
- title: t(tool.labelKey),
1969
- ...controlAttr(DRAW_TOOL_CONTROL[tool.id]),
1970
- children: tool.icon
1971
- },
1972
- tool.id
1973
- )) }),
1974
- /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-2 text-xs", children: [
1975
- /* @__PURE__ */ jsxs(
1976
- "label",
1977
- {
1978
- className: "inline-flex items-center gap-1 text-muted-foreground",
1979
- title: t("pptx.ribbon.penColour"),
1980
- ...controlAttr("draw.tools.penColor"),
1981
- children: [
1982
- t("pptx.ribbon.colour"),
1983
- /* @__PURE__ */ jsx(
1984
- "input",
1985
- {
1986
- ref: colorRef,
1987
- type: "color",
1988
- value: p.drawingColor,
1989
- onChange: (e) => p.onSetDrawingColor(e.target.value),
1990
- className: "w-6 h-6 rounded border border-border bg-transparent cursor-pointer"
1991
- }
1992
- )
1993
- ]
1994
- }
1995
- ),
1996
- /* @__PURE__ */ jsxs(
1997
- "label",
1998
- {
1999
- className: "inline-flex items-center gap-1 text-muted-foreground",
2000
- title: t("pptx.ribbon.strokeWidth"),
2001
- ...controlAttr("draw.tools.penWidth"),
2002
- children: [
2003
- t("pptx.ribbon.width"),
2004
- /* @__PURE__ */ jsx(
2005
- "input",
2006
- {
2007
- type: "range",
2008
- min: 1,
2009
- max: 12,
2010
- value: p.drawingWidth,
2011
- onChange: (e) => p.onSetDrawingWidth(Number(e.target.value)),
2012
- className: "w-16 h-1 accent-primary"
2013
- }
2014
- ),
2015
- /* @__PURE__ */ jsx("span", { className: "text-foreground w-4 text-right", children: p.drawingWidth })
2016
- ]
2017
- }
2018
- )
2019
- ] })
2020
- ] });
1344
+ host.state = {
1345
+ tool: p.activeTool,
1346
+ color: p.drawingColor,
1347
+ width: p.drawingWidth,
1348
+ editable: p.canEdit !== false,
1349
+ recentColors,
1350
+ translate: t
1351
+ };
1352
+ }, [p, recentColors, t]);
1353
+ useEffect(() => {
1354
+ const host = ref.current;
1355
+ if (!host) {
1356
+ return;
1357
+ }
1358
+ const request = (event) => {
1359
+ if (p.canEdit === false) {
1360
+ return;
1361
+ }
1362
+ const intent = event.detail;
1363
+ switch (intent.kind) {
1364
+ case "tool":
1365
+ p.onSetActiveTool(intent.value);
1366
+ break;
1367
+ case "width":
1368
+ p.onSetDrawingWidth(intent.value);
1369
+ break;
1370
+ case "color":
1371
+ p.onSetDrawingColor(intent.value);
1372
+ if (intent.committed) {
1373
+ pushColor(intent.value);
1374
+ }
1375
+ }
1376
+ };
1377
+ host.addEventListener("draw-request", request);
1378
+ return () => host.removeEventListener("draw-request", request);
1379
+ }, [p, pushColor]);
1380
+ return /* @__PURE__ */ jsx("pptx-ui-ribbon-draw", { ref });
2021
1381
  }
2022
1382
  var ViewerCustomizationContext = createContext(
2023
1383
  EMPTY_RESOLVED_CUSTOMIZATION
@@ -2139,7 +1499,7 @@ function AccountPage() {
2139
1499
  return void 0;
2140
1500
  });
2141
1501
  };
2142
- const version = "4.16.0" ;
1502
+ const version = "4.17.0" ;
2143
1503
  return /* @__PURE__ */ jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
2144
1504
  /* @__PURE__ */ jsxs("section", { className: cardClass, children: [
2145
1505
  /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -2541,76 +1901,69 @@ function FileSection(p) {
2541
1901
  }
2542
1902
  );
2543
1903
  }
2544
- function ClipboardGroup(p) {
1904
+ function WebHomeControls({
1905
+ family,
1906
+ controls,
1907
+ onRequest
1908
+ }) {
2545
1909
  const { t } = useTranslation();
2546
- const [copiedFeedback, setCopiedFeedback] = useState(false);
2547
- const [cutFeedback, setCutFeedback] = useState(false);
2548
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-0.5", ...groupAttr("home.clipboard"), children: [
2549
- /* @__PURE__ */ jsxs("div", { className: grp, children: [
2550
- /* @__PURE__ */ jsx(
2551
- "button",
2552
- {
2553
- type: "button",
2554
- onClick: p.onPaste,
2555
- disabled: !p.canPaste || !p.canEdit,
2556
- className: gB,
2557
- title: t("pptx.arrange.paste"),
2558
- ...controlAttr("home.clipboard.paste"),
2559
- children: /* @__PURE__ */ jsx(LuClipboardPaste, { className: ic })
2560
- }
2561
- ),
2562
- /* @__PURE__ */ jsx(
2563
- "button",
2564
- {
2565
- type: "button",
2566
- onClick: () => {
2567
- p.onCut();
2568
- setCutFeedback(true);
2569
- setTimeout(() => setCutFeedback(false), 600);
2570
- },
2571
- disabled: !p.canEdit || !p.hasSelection,
2572
- className: cn(gB, cutFeedback && "bg-green-600/20 text-green-400"),
2573
- title: t("pptx.arrange.cut"),
2574
- ...controlAttr("home.clipboard.cut"),
2575
- children: /* @__PURE__ */ jsx(LuScissors, { className: ic })
2576
- }
2577
- ),
2578
- /* @__PURE__ */ jsx(
2579
- "button",
2580
- {
2581
- type: "button",
2582
- onClick: () => {
2583
- p.onCopy();
2584
- setCopiedFeedback(true);
2585
- setTimeout(() => setCopiedFeedback(false), 600);
2586
- },
2587
- disabled: !p.hasSelection,
2588
- className: cn(gB, copiedFeedback && "bg-green-600/20 text-green-400"),
2589
- title: t("pptx.arrange.copy"),
2590
- ...controlAttr("home.clipboard.copy"),
2591
- children: /* @__PURE__ */ jsx(LuCopy, { className: ic })
2592
- }
2593
- ),
2594
- p.onToggleFormatPainter && /* @__PURE__ */ jsx(
2595
- "button",
2596
- {
2597
- type: "button",
2598
- onClick: p.onToggleFormatPainter,
2599
- disabled: !p.canEdit || p.canActivateFormatPainter === false && !p.formatPainterActive,
2600
- "data-testid": "format-painter-toggle",
2601
- "data-active": p.formatPainterActive ? "true" : "false",
2602
- className: cn(
2603
- gL,
2604
- p.formatPainterActive ? "bg-amber-600 hover:bg-amber-500 text-amber-50" : ""
2605
- ),
2606
- title: t("pptx.arrange.formatPainter"),
2607
- ...controlAttr("home.clipboard.formatPainter"),
2608
- children: /* @__PURE__ */ jsx(LuPaintbrush, { className: ic })
2609
- }
2610
- )
2611
- ] }),
2612
- /* @__PURE__ */ jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: t("pptx.ribbon.clipboard") })
2613
- ] });
1910
+ const ref = useRef(null);
1911
+ useEffect(() => {
1912
+ if (ref.current) {
1913
+ ref.current.state = { controls, translate: t };
1914
+ }
1915
+ }, [controls, t]);
1916
+ useEffect(() => {
1917
+ const host = ref.current;
1918
+ if (!host) {
1919
+ return;
1920
+ }
1921
+ const listener = (event) => onRequest(event.detail.id);
1922
+ host.addEventListener("home-request", listener);
1923
+ return () => host.removeEventListener("home-request", listener);
1924
+ }, [onRequest]);
1925
+ return React95.createElement(`pptx-ui-ribbon-home-${family}`, { ref });
1926
+ }
1927
+ function ClipboardGroup(p) {
1928
+ const { canEdit, hasSelection, canPaste: canPaste2, formatPainterActive, canActivateFormatPainter } = p;
1929
+ const { onPaste, onCut, onCopy, onToggleFormatPainter } = p;
1930
+ const controls = useMemo(
1931
+ () => clipboardHomeControls({
1932
+ editable: canEdit,
1933
+ hasSelection,
1934
+ hasClipboard: canPaste2,
1935
+ formatPainterActive: Boolean(formatPainterActive),
1936
+ canFormatPaint: canActivateFormatPainter !== false,
1937
+ showFormatPainter: Boolean(onToggleFormatPainter)
1938
+ }),
1939
+ [
1940
+ canEdit,
1941
+ hasSelection,
1942
+ canPaste2,
1943
+ formatPainterActive,
1944
+ canActivateFormatPainter,
1945
+ onToggleFormatPainter
1946
+ ]
1947
+ );
1948
+ const request = useCallback(
1949
+ (id) => {
1950
+ switch (id) {
1951
+ case "home.clipboard.paste":
1952
+ onPaste();
1953
+ break;
1954
+ case "home.clipboard.cut":
1955
+ onCut();
1956
+ break;
1957
+ case "home.clipboard.copy":
1958
+ onCopy();
1959
+ break;
1960
+ case "home.clipboard.formatPainter":
1961
+ onToggleFormatPainter?.();
1962
+ }
1963
+ },
1964
+ [onPaste, onCut, onCopy, onToggleFormatPainter]
1965
+ );
1966
+ return /* @__PURE__ */ jsx(WebHomeControls, { family: "clipboard", controls, onRequest: request });
2614
1967
  }
2615
1968
  function FontPickers(p) {
2616
1969
  const { t } = useTranslation();
@@ -3153,425 +2506,83 @@ function DateTimeFieldDialog(p) {
3153
2506
  }
3154
2507
  );
3155
2508
  }
3156
- var ICONS3 = {
3157
- freeformShape: LuPenTool,
3158
- curve: LuSpline
3159
- };
3160
- function FreeformToolButtons({
3161
- canEdit,
3162
- activeTool,
3163
- onArm
3164
- }) {
3165
- const { t } = useTranslation();
3166
- const customization = useViewerCustomizationContext();
3167
- const tools = FREEFORM_TOOL_IDS.filter((tool) => isDrawingToolVisible(customization, tool));
3168
- if (tools.length === 0) {
3169
- return null;
3170
- }
3171
- return /* @__PURE__ */ jsx(Fragment, { children: tools.map((tool) => {
3172
- const Icon = ICONS3[tool];
3173
- const active = activeTool === tool;
3174
- return /* @__PURE__ */ jsxs(
3175
- "button",
3176
- {
3177
- type: "button",
3178
- disabled: !canEdit,
3179
- "aria-pressed": active,
3180
- "data-pptx-drawing-tool": tool,
3181
- className: cn(pill, active && "bg-primary/15 text-primary"),
3182
- title: t(FREEFORM_TOOL_LABEL_KEYS[tool]),
3183
- onClick: () => onArm(active ? null : tool),
3184
- children: [
3185
- /* @__PURE__ */ jsx(Icon, { className: ic }),
3186
- t(FREEFORM_TOOL_LABEL_KEYS[tool])
3187
- ]
3188
- },
3189
- tool
3190
- );
3191
- }) });
3192
- }
3193
- function InsertHyperlinkButton(p) {
3194
- const { t } = useTranslation();
3195
- return /* @__PURE__ */ jsxs(
3196
- "button",
3197
- {
3198
- type: "button",
3199
- onClick: p.onOpenHyperlinkDialog,
3200
- disabled: !p.hasSelection,
3201
- className: pill,
3202
- title: t("pptx.hyperlinkDialog.title"),
3203
- ...controlAttr("insert.links.link"),
3204
- children: [
3205
- /* @__PURE__ */ jsx(LuLink, { className: ic }),
3206
- t("pptx.hyperlinkDialog.title")
3207
- ]
3208
- }
3209
- );
3210
- }
3211
2509
  function InsertSection(p) {
3212
2510
  const { t } = useTranslation();
3213
- const { canEdit } = p;
2511
+ const customization = useViewerCustomizationContext();
2512
+ const ref = useRef(null);
3214
2513
  const [datePickerOpen, setDatePickerOpen] = useState(false);
3215
- const [newChartKind, setNewChartKind] = useState(DEFAULT_INSERT_CHART_KIND);
3216
- const actionMenuRef = useRef(null);
3217
- const fieldMenuRef = useRef(null);
3218
- const openDatePicker = () => setDatePickerOpen(true);
3219
- return /* @__PURE__ */ jsxs(Fragment, { children: [
3220
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "insert.text", children: /* @__PURE__ */ jsxs(
3221
- "button",
3222
- {
3223
- onClick: p.onAddTextBox,
3224
- disabled: !canEdit,
3225
- className: pill,
3226
- title: t("pptx.insert.addTextBox"),
3227
- ...controlAttr("insert.text.textBox"),
3228
- children: [
3229
- /* @__PURE__ */ jsx(LuType, { className: ic }),
3230
- t("pptx.ribbon.textBox")
3231
- ]
3232
- }
3233
- ) }),
3234
- /* @__PURE__ */ jsxs(RibbonGroupScope, { id: "insert.illustrations", children: [
3235
- /* @__PURE__ */ jsxs("div", { className: grp, ...controlAttr("insert.illustrations.shapes"), children: [
3236
- /* @__PURE__ */ jsx(
3237
- "select",
3238
- {
3239
- value: p.newShapeType,
3240
- onChange: (e) => p.onSetNewShapeType(e.target.value),
3241
- className: "bg-transparent py-1.5 pl-2 pr-1 outline-none text-xs",
3242
- title: t("pptx.insert.shapeType"),
3243
- children: SHAPE_PRESETS.map((sp) => /* @__PURE__ */ jsx("option", { value: sp.type, className: "bg-background", children: t(sp.i18nKey) }, sp.type))
3244
- }
3245
- ),
3246
- /* @__PURE__ */ jsxs(
3247
- "button",
3248
- {
3249
- onClick: p.onAddShape,
3250
- disabled: !canEdit,
3251
- className: "inline-flex items-center gap-1.5 px-2.5 py-1.5 border-l border-border hover:bg-accent transition-colors text-xs",
3252
- title: t("pptx.insert.addShape"),
3253
- children: [
3254
- SHAPE_PRESETS.find((sp) => sp.type === p.newShapeType)?.icon || /* @__PURE__ */ jsx(LuSquare, { className: ic }),
3255
- t("pptx.insert.shape")
3256
- ]
3257
- }
3258
- )
3259
- ] }),
3260
- p.onArmFreeformTool && /* @__PURE__ */ jsx(
3261
- FreeformToolButtons,
3262
- {
3263
- canEdit,
3264
- activeTool: p.activeFreeformTool,
3265
- onArm: p.onArmFreeformTool
2514
+ const [chartKind, setChartKind] = useState(DEFAULT_INSERT_CHART_KIND);
2515
+ useEffect(() => {
2516
+ const host = ref.current;
2517
+ if (!host) {
2518
+ return;
2519
+ }
2520
+ host.state = {
2521
+ editable: p.canEdit,
2522
+ hasSelection: p.hasSelection,
2523
+ shapeType: p.newShapeType,
2524
+ chartKind,
2525
+ activeFreeformTool: p.activeFreeformTool ?? null,
2526
+ freeformTools: p.onArmFreeformTool ? FREEFORM_TOOL_IDS.filter((tool) => isDrawingToolVisible(customization, tool)) : [],
2527
+ chartAvailable: Boolean(p.onAddChart),
2528
+ fieldAvailable: Boolean(p.onInsertField),
2529
+ headerFooterAvailable: Boolean(p.onOpenHeaderFooter),
2530
+ translate: t
2531
+ };
2532
+ }, [p, chartKind, customization, t]);
2533
+ useEffect(() => {
2534
+ const host = ref.current;
2535
+ if (!host) {
2536
+ return;
2537
+ }
2538
+ const request = (event) => {
2539
+ const intent = event.detail;
2540
+ switch (intent.kind) {
2541
+ case "command": {
2542
+ const commands = {
2543
+ textBox: p.onAddTextBox,
2544
+ table: p.onAddTable,
2545
+ image: p.onOpenImagePicker,
2546
+ media: p.onOpenMediaPicker,
2547
+ smartArt: p.onAddSmartArt,
2548
+ equation: p.onAddEquation,
2549
+ link: p.onOpenHyperlinkDialog,
2550
+ headerFooter: p.onOpenHeaderFooter
2551
+ };
2552
+ commands[intent.value]?.();
2553
+ break;
3266
2554
  }
3267
- )
3268
- ] }),
3269
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "insert.images", children: /* @__PURE__ */ jsxs(
3270
- "button",
3271
- {
3272
- onClick: p.onOpenImagePicker,
3273
- disabled: !canEdit,
3274
- className: pill,
3275
- title: t("pptx.ribbon.insertImage"),
3276
- ...controlAttr("insert.images.pictures"),
3277
- children: [
3278
- /* @__PURE__ */ jsx(LuImage, { className: ic }),
3279
- t("pptx.ribbon.image")
3280
- ]
3281
- }
3282
- ) }),
3283
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "insert.media", children: /* @__PURE__ */ jsxs(
3284
- "button",
3285
- {
3286
- onClick: p.onOpenMediaPicker,
3287
- disabled: !canEdit,
3288
- className: pill,
3289
- title: t("pptx.ribbon.insertMedia"),
3290
- ...controlAttr("insert.media.media"),
3291
- children: [
3292
- /* @__PURE__ */ jsx(LuVideo, { className: ic }),
3293
- t("pptx.ribbon.media")
3294
- ]
3295
- }
3296
- ) }),
3297
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "insert.tables", children: /* @__PURE__ */ jsxs(
3298
- "button",
3299
- {
3300
- onClick: p.onAddTable,
3301
- disabled: !canEdit,
3302
- className: pill,
3303
- title: t("pptx.insert.insertTable"),
3304
- ...controlAttr("insert.tables.table"),
3305
- children: [
3306
- /* @__PURE__ */ jsx(LuDatabase, { className: ic }),
3307
- t("pptx.ribbon.table")
3308
- ]
3309
- }
3310
- ) }),
3311
- /* @__PURE__ */ jsxs(RibbonGroupScope, { id: "insert.illustrations", children: [
3312
- p.onAddChart && /* @__PURE__ */ jsxs("div", { className: grp, ...controlAttr("insert.illustrations.chart"), children: [
3313
- /* @__PURE__ */ jsx(
3314
- "select",
3315
- {
3316
- value: newChartKind,
3317
- onChange: (e) => {
3318
- const kind = INSERT_CHART_TYPES.find((ct) => ct.id === e.target.value)?.id;
3319
- setNewChartKind(kind ?? DEFAULT_INSERT_CHART_KIND);
3320
- },
3321
- className: "bg-transparent py-1.5 pl-2 pr-1 outline-none text-xs",
3322
- title: t("pptx.ribbon.chartType"),
3323
- children: INSERT_CHART_TYPES.map((ct) => /* @__PURE__ */ jsx("option", { value: ct.id, className: "bg-background", children: t(ct.labelKey) }, ct.id))
3324
- }
3325
- ),
3326
- /* @__PURE__ */ jsxs(
3327
- "button",
3328
- {
3329
- onClick: () => p.onAddChart(newChartKind),
3330
- disabled: !canEdit,
3331
- className: "inline-flex items-center gap-1.5 px-2.5 py-1.5 border-l border-border hover:bg-accent transition-colors text-xs",
3332
- title: t("pptx.ribbon.insertChart"),
3333
- children: [
3334
- /* @__PURE__ */ jsxs(
3335
- "svg",
3336
- {
3337
- className: ic,
3338
- viewBox: "0 0 24 24",
3339
- fill: "none",
3340
- stroke: "currentColor",
3341
- strokeWidth: "2",
3342
- strokeLinecap: "round",
3343
- strokeLinejoin: "round",
3344
- children: [
3345
- /* @__PURE__ */ jsx("path", { d: "M3 3v18h18" }),
3346
- /* @__PURE__ */ jsx("rect", { x: "7", y: "11", width: "3", height: "6" }),
3347
- /* @__PURE__ */ jsx("rect", { x: "12", y: "7", width: "3", height: "10" }),
3348
- /* @__PURE__ */ jsx("rect", { x: "17", y: "13", width: "3", height: "4" })
3349
- ]
3350
- }
3351
- ),
3352
- t("pptx.ribbon.chart")
3353
- ]
2555
+ case "shapeType":
2556
+ p.onSetNewShapeType(intent.value);
2557
+ break;
2558
+ case "shape":
2559
+ p.onAddShape();
2560
+ break;
2561
+ case "chartType":
2562
+ setChartKind(intent.value);
2563
+ break;
2564
+ case "chart":
2565
+ p.onAddChart?.(intent.value);
2566
+ break;
2567
+ case "freeform":
2568
+ p.onArmFreeformTool?.(intent.value);
2569
+ break;
2570
+ case "actionButton":
2571
+ p.onAddActionButton(intent.value);
2572
+ break;
2573
+ case "field":
2574
+ if (intent.value === "datetime") {
2575
+ setDatePickerOpen(true);
2576
+ } else {
2577
+ p.onInsertField?.(intent.value);
3354
2578
  }
3355
- )
3356
- ] }),
3357
- /* @__PURE__ */ jsxs(
3358
- "button",
3359
- {
3360
- onClick: p.onAddSmartArt,
3361
- disabled: !canEdit,
3362
- className: pill,
3363
- title: t("pptx.insert.insertSmartArt"),
3364
- ...controlAttr("insert.illustrations.smartArt"),
3365
- children: [
3366
- /* @__PURE__ */ jsx(LuLayers, { className: ic }),
3367
- t("pptx.ribbon.smartArt")
3368
- ]
3369
- }
3370
- )
3371
- ] }),
3372
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "insert.symbols", children: /* @__PURE__ */ jsxs(
3373
- "button",
3374
- {
3375
- onClick: p.onAddEquation,
3376
- disabled: !canEdit,
3377
- className: pill,
3378
- title: t("pptx.insert.insertEquation"),
3379
- ...controlAttr("insert.symbols.equation"),
3380
- children: [
3381
- /* @__PURE__ */ jsx(
3382
- "svg",
3383
- {
3384
- className: ic,
3385
- viewBox: "0 0 24 24",
3386
- fill: "none",
3387
- stroke: "currentColor",
3388
- strokeWidth: "2",
3389
- strokeLinecap: "round",
3390
- strokeLinejoin: "round",
3391
- children: /* @__PURE__ */ jsx("path", { d: "M4 17h6M7 14v6M14 7l4.5 10M15.5 14h5" })
3392
- }
3393
- ),
3394
- t("pptx.ribbon.equation")
3395
- ]
3396
- }
3397
- ) }),
3398
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "insert.links", children: /* @__PURE__ */ jsxs(
3399
- "div",
3400
- {
3401
- className: "relative group inline-flex items-center",
3402
- ref: actionMenuRef,
3403
- ...controlAttr("insert.links.action"),
3404
- children: [
3405
- /* @__PURE__ */ jsxs(
3406
- "button",
3407
- {
3408
- type: "button",
3409
- disabled: !canEdit,
3410
- className: pill,
3411
- title: t("pptx.ribbon.insertActionButton"),
3412
- children: [
3413
- /* @__PURE__ */ jsxs(
3414
- "svg",
3415
- {
3416
- className: ic,
3417
- viewBox: "0 0 24 24",
3418
- fill: "none",
3419
- stroke: "currentColor",
3420
- strokeWidth: "2",
3421
- strokeLinecap: "round",
3422
- strokeLinejoin: "round",
3423
- children: [
3424
- /* @__PURE__ */ jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
3425
- /* @__PURE__ */ jsx("path", { d: "M13 7l4 5-4 5" })
3426
- ]
3427
- }
3428
- ),
3429
- t("pptx.ribbon.action"),
3430
- /* @__PURE__ */ jsx(LuChevronDown, { className: "w-3 h-3" })
3431
- ]
3432
- }
3433
- ),
3434
- /* @__PURE__ */ jsx(
3435
- RibbonMenu,
3436
- {
3437
- anchorRef: actionMenuRef,
3438
- className: "hidden group-hover:flex flex-col w-40 pt-1",
3439
- children: /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-border bg-popover backdrop-blur-lg shadow-2xl py-1", children: ACTION_BUTTON_PRESETS.map((preset) => /* @__PURE__ */ jsxs(
3440
- "button",
3441
- {
3442
- type: "button",
3443
- disabled: !canEdit,
3444
- className: "flex items-center gap-2 w-full px-3 py-1.5 text-xs text-foreground hover:bg-muted transition-colors",
3445
- onClick: () => p.onAddActionButton(preset.shapeType),
3446
- children: [
3447
- /* @__PURE__ */ jsx(
3448
- "svg",
3449
- {
3450
- className: "w-4 h-4 flex-shrink-0",
3451
- viewBox: "0 0 24 24",
3452
- fill: "none",
3453
- stroke: "currentColor",
3454
- strokeWidth: "2",
3455
- strokeLinecap: "round",
3456
- strokeLinejoin: "round",
3457
- children: /* @__PURE__ */ jsx("path", { d: preset.iconPath })
3458
- }
3459
- ),
3460
- preset.label
3461
- ]
3462
- },
3463
- preset.shapeType
3464
- )) })
3465
- }
3466
- )
3467
- ]
3468
- }
3469
- ) }),
3470
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "insert.text", children: p.onInsertField && /* @__PURE__ */ jsxs(
3471
- "div",
3472
- {
3473
- className: "relative group inline-flex items-center",
3474
- ref: fieldMenuRef,
3475
- ...controlAttr("insert.text.field"),
3476
- children: [
3477
- /* @__PURE__ */ jsxs(
3478
- "button",
3479
- {
3480
- type: "button",
3481
- disabled: !canEdit,
3482
- className: pill,
3483
- title: t("pptx.field.insertField"),
3484
- children: [
3485
- /* @__PURE__ */ jsxs(
3486
- "svg",
3487
- {
3488
- className: ic,
3489
- viewBox: "0 0 24 24",
3490
- fill: "none",
3491
- stroke: "currentColor",
3492
- strokeWidth: "2",
3493
- strokeLinecap: "round",
3494
- strokeLinejoin: "round",
3495
- children: [
3496
- /* @__PURE__ */ jsx("path", { d: "M4 7h16M4 12h10M4 17h12" }),
3497
- /* @__PURE__ */ jsx("circle", { cx: "19", cy: "15", r: "3" })
3498
- ]
3499
- }
3500
- ),
3501
- t("pptx.field.field"),
3502
- /* @__PURE__ */ jsx(LuChevronDown, { className: "w-3 h-3" })
3503
- ]
3504
- }
3505
- ),
3506
- /* @__PURE__ */ jsx(
3507
- RibbonMenu,
3508
- {
3509
- anchorRef: fieldMenuRef,
3510
- className: "hidden group-hover:flex flex-col w-44 pt-1",
3511
- children: /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-border bg-popover backdrop-blur-lg shadow-2xl py-1", children: [
3512
- /* @__PURE__ */ jsx(
3513
- "button",
3514
- {
3515
- type: "button",
3516
- disabled: !canEdit,
3517
- className: "flex items-center gap-2 w-full px-3 py-1.5 text-xs text-foreground hover:bg-muted transition-colors",
3518
- onClick: () => p.onInsertField("slidenum"),
3519
- children: t("pptx.field.slideNumber")
3520
- }
3521
- ),
3522
- /* @__PURE__ */ jsx(
3523
- "button",
3524
- {
3525
- type: "button",
3526
- disabled: !canEdit,
3527
- className: "flex items-center gap-2 w-full px-3 py-1.5 text-xs text-foreground hover:bg-muted transition-colors",
3528
- onClick: openDatePicker,
3529
- children: t("pptx.field.dateTime")
3530
- }
3531
- ),
3532
- /* @__PURE__ */ jsx(
3533
- "button",
3534
- {
3535
- type: "button",
3536
- disabled: !canEdit,
3537
- className: "flex items-center gap-2 w-full px-3 py-1.5 text-xs text-foreground hover:bg-muted transition-colors",
3538
- onClick: () => p.onInsertField("header"),
3539
- children: t("pptx.field.header")
3540
- }
3541
- ),
3542
- /* @__PURE__ */ jsx(
3543
- "button",
3544
- {
3545
- type: "button",
3546
- disabled: !canEdit,
3547
- className: "flex items-center gap-2 w-full px-3 py-1.5 text-xs text-foreground hover:bg-muted transition-colors",
3548
- onClick: () => p.onInsertField("footer"),
3549
- children: t("pptx.field.footer")
3550
- }
3551
- )
3552
- ] })
3553
- }
3554
- )
3555
- ]
3556
- }
3557
- ) }),
3558
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "insert.links", children: /* @__PURE__ */ jsx(
3559
- InsertHyperlinkButton,
3560
- {
3561
- hasSelection: p.hasSelection,
3562
- onOpenHyperlinkDialog: p.onOpenHyperlinkDialog
3563
- }
3564
- ) }),
3565
- /* @__PURE__ */ jsx(RibbonGroupScope, { id: "insert.text", children: p.onOpenHeaderFooter && /* @__PURE__ */ jsx(
3566
- "button",
3567
- {
3568
- type: "button",
3569
- disabled: !canEdit,
3570
- className: cn(pill, "whitespace-nowrap"),
3571
- onClick: p.onOpenHeaderFooter,
3572
- children: t("pptx.headerFooter.title")
3573
2579
  }
3574
- ) }),
2580
+ };
2581
+ host.addEventListener("insert-request", request);
2582
+ return () => host.removeEventListener("insert-request", request);
2583
+ }, [p]);
2584
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
2585
+ /* @__PURE__ */ jsx("pptx-ui-ribbon-insert", { ref }),
3575
2586
  datePickerOpen && p.onInsertField && /* @__PURE__ */ jsx(
3576
2587
  DateTimeFieldDialog,
3577
2588
  {
@@ -3871,6 +2882,124 @@ function SlideShowSection(p) {
3871
2882
  ) })
3872
2883
  ] });
3873
2884
  }
2885
+
2886
+ // src/viewer/components/toolbar/text-section-state.ts
2887
+ function getEffectiveTextStyle(element, tableEditorState) {
2888
+ if (!element) {
2889
+ return void 0;
2890
+ }
2891
+ if (hasTextProperties(element)) {
2892
+ return element.textStyle;
2893
+ }
2894
+ if (element.type === "table" && tableEditorState && element.tableData) {
2895
+ const cell = element.tableData.rows[tableEditorState.rowIndex]?.cells[tableEditorState.columnIndex];
2896
+ return cell?.style;
2897
+ }
2898
+ return void 0;
2899
+ }
2900
+ function isTextDecorationFlag(id) {
2901
+ return TEXT_DECORATION_FLAGS.includes(id);
2902
+ }
2903
+ function textSectionFlags(element, tableEditorState, readSelection) {
2904
+ if (element && hasTextProperties(element)) {
2905
+ const result = readSelection ? getInlineEditorSelectionResult(element.textSegments) : null;
2906
+ const current = result?.kind === "supported" && (!result.snapshot || result.snapshot.elementId === element.id) ? result : null;
2907
+ return getSelectionTextStyleFlags(
2908
+ current?.snapshot?.textSegments ?? element.textSegments,
2909
+ current?.selection ?? null,
2910
+ element.textStyle
2911
+ );
2912
+ }
2913
+ return getSelectionTextStyleFlags(
2914
+ void 0,
2915
+ null,
2916
+ getEffectiveTextStyle(element, tableEditorState)
2917
+ );
2918
+ }
2919
+ function textSectionBulletKind(element, tableEditorState) {
2920
+ if (element && hasTextProperties(element)) {
2921
+ const result = getInlineEditorSelectionResult(element.textSegments, { preserveCaret: true });
2922
+ return result.kind === "supported" && (!result.snapshot || result.snapshot.elementId === element.id) ? selectionBulletKind(element, result.selection, result.snapshot?.textSegments) : elementBulletKind(element);
2923
+ }
2924
+ return getEffectiveTextStyle(element, tableEditorState)?.listType ?? "none";
2925
+ }
2926
+ var TEXT_SHADOW_ON = {
2927
+ textShadowColor: "#000000",
2928
+ textShadowBlur: 2,
2929
+ textShadowOffsetX: 1,
2930
+ textShadowOffsetY: 1,
2931
+ textShadowOpacity: 0.5
2932
+ };
2933
+ var TEXT_SHADOW_OFF = {
2934
+ textShadowColor: void 0,
2935
+ textShadowBlur: void 0,
2936
+ textShadowOffsetX: void 0,
2937
+ textShadowOffsetY: void 0
2938
+ };
2939
+ function FontFormatGroup(p) {
2940
+ const { canMut, canFormat, isTextEl, selectedElement, tableEditorState, effectiveTs } = p;
2941
+ const { onUpdateTextStyle } = p;
2942
+ const flags = textSectionFlags(selectedElement, tableEditorState, false);
2943
+ const shadow = Boolean(effectiveTs?.textShadowColor);
2944
+ const controls = useMemo(
2945
+ () => fontHomeControls({
2946
+ enabled: canMut && canFormat,
2947
+ bold: flags.bold === "on",
2948
+ italic: flags.italic === "on",
2949
+ underline: flags.underline === "on",
2950
+ strikethrough: flags.strikethrough === "on",
2951
+ shadow
2952
+ }),
2953
+ [canMut, canFormat, flags.bold, flags.italic, flags.underline, flags.strikethrough, shadow]
2954
+ );
2955
+ const request = useCallback(
2956
+ (id) => {
2957
+ if (!canFormat || !selectedElement) {
2958
+ return;
2959
+ }
2960
+ const flag = id.replace("home.font.", "");
2961
+ if (isTextDecorationFlag(flag)) {
2962
+ const current2 = textSectionFlags(selectedElement, tableEditorState, true);
2963
+ onUpdateTextStyle({ [flag]: nextToggleValue(current2[flag]) });
2964
+ return;
2965
+ }
2966
+ const textual = isTextEl;
2967
+ const current = effectiveTs?.fontSize ?? (textual ? textFontSizePtToPx(18) : 18);
2968
+ const delta = textual ? textFontSizePtToPx(2) : 2;
2969
+ switch (id) {
2970
+ case "home.font.shadow":
2971
+ onUpdateTextStyle(shadow ? TEXT_SHADOW_OFF : TEXT_SHADOW_ON);
2972
+ break;
2973
+ case "home.font.increaseFontSize":
2974
+ onUpdateTextStyle({ fontSize: current + delta });
2975
+ break;
2976
+ case "home.font.decreaseFontSize":
2977
+ onUpdateTextStyle({
2978
+ fontSize: Math.max(textual ? textFontSizePtToPx(1) : 1, current - delta)
2979
+ });
2980
+ break;
2981
+ case "home.font.clearFormatting":
2982
+ onUpdateTextStyle({
2983
+ bold: false,
2984
+ italic: false,
2985
+ underline: false,
2986
+ strikethrough: false,
2987
+ highlightColor: void 0
2988
+ });
2989
+ }
2990
+ },
2991
+ [
2992
+ canFormat,
2993
+ selectedElement,
2994
+ tableEditorState,
2995
+ isTextEl,
2996
+ effectiveTs,
2997
+ shadow,
2998
+ onUpdateTextStyle
2999
+ ]
3000
+ );
3001
+ return /* @__PURE__ */ jsx(WebHomeControls, { family: "font", controls, onRequest: request });
3002
+ }
3874
3003
  var LINE_SPACING_OPTIONS = [
3875
3004
  { label: "1.0", value: 1 },
3876
3005
  { label: "1.15", value: 1.15 },
@@ -4031,12 +3160,6 @@ function ColumnsDropdown(p) {
4031
3160
  ] });
4032
3161
  }
4033
3162
  var ON = "bg-primary/20 ring-1 ring-primary";
4034
- var ALIGN_CONTROL = {
4035
- left: "home.paragraph.alignLeft",
4036
- center: "home.paragraph.alignCenter",
4037
- right: "home.paragraph.alignRight",
4038
- justify: "home.paragraph.justify"
4039
- };
4040
3163
  function fixedGallery(control) {
4041
3164
  return FIXED_TAB_GALLERIES.find((placement) => placement.control === control);
4042
3165
  }
@@ -4044,14 +3167,27 @@ var BULLETS_GALLERY = fixedGallery("home.paragraph.bullets");
4044
3167
  var NUMBERING_GALLERY = fixedGallery("home.paragraph.numbering");
4045
3168
  function ParagraphGroup(p) {
4046
3169
  const { t } = useTranslation();
4047
- const { canMut, canFormat } = p;
4048
- const indent = (delta) => {
4049
- if (!canFormat) {
4050
- return;
4051
- }
4052
- const current = p.effectiveTs?.paragraphMarginLeft ?? 0;
4053
- p.onUpdateTextStyle({ paragraphMarginLeft: Math.max(0, current + delta) });
4054
- };
3170
+ const { canMut, canFormat, effectiveTs, onUpdateTextStyle } = p;
3171
+ const align = paragraphHomeAlign(effectiveTs?.align);
3172
+ const paragraphControls = useMemo(
3173
+ () => paragraphHomeControls({ enabled: canMut && canFormat, align }),
3174
+ [canMut, canFormat, align]
3175
+ );
3176
+ const requestParagraph = useCallback(
3177
+ (id) => {
3178
+ const action = paragraphHomeAction(id);
3179
+ if (!canFormat || !action) {
3180
+ return;
3181
+ }
3182
+ if (action.kind === "indent") {
3183
+ const current = effectiveTs?.paragraphMarginLeft ?? 0;
3184
+ onUpdateTextStyle({ paragraphMarginLeft: Math.max(0, current + action.delta) });
3185
+ } else {
3186
+ onUpdateTextStyle({ align: action.align });
3187
+ }
3188
+ },
3189
+ [canFormat, effectiveTs, onUpdateTextStyle]
3190
+ );
4055
3191
  const listToggle = (kind, placement, title, icon) => /* @__PURE__ */ jsxs("div", { className: grp, ...controlAttr(placement?.control), children: [
4056
3192
  /* @__PURE__ */ jsx(
4057
3193
  "button",
@@ -4082,52 +3218,14 @@ function ParagraphGroup(p) {
4082
3218
  t("pptx.text.numberedList"),
4083
3219
  /* @__PURE__ */ jsx(LuListOrdered, { className: ic })
4084
3220
  ),
4085
- /* @__PURE__ */ jsxs("div", { className: grp, children: [
4086
- /* @__PURE__ */ jsx(
4087
- "button",
4088
- {
4089
- type: "button",
4090
- disabled: !canMut,
4091
- onMouseDown: (e) => e.preventDefault(),
4092
- onClick: () => indent(-24),
4093
- className: gB,
4094
- title: t("pptx.text.decreaseIndent"),
4095
- ...controlAttr("home.paragraph.decreaseIndent"),
4096
- children: /* @__PURE__ */ jsx(LuIndentDecrease, { className: ic })
4097
- }
4098
- ),
4099
- /* @__PURE__ */ jsx(
4100
- "button",
4101
- {
4102
- type: "button",
4103
- disabled: !canMut,
4104
- onMouseDown: (e) => e.preventDefault(),
4105
- onClick: () => indent(24),
4106
- className: gL,
4107
- title: t("pptx.text.increaseIndent"),
4108
- ...controlAttr("home.paragraph.increaseIndent"),
4109
- children: /* @__PURE__ */ jsx(LuIndentIncrease, { className: ic })
4110
- }
4111
- )
4112
- ] }),
4113
- /* @__PURE__ */ jsx("div", { className: grp, children: ATXT.map((b, i, a) => /* @__PURE__ */ jsx(
4114
- "button",
3221
+ /* @__PURE__ */ jsx(
3222
+ WebHomeControls,
4115
3223
  {
4116
- type: "button",
4117
- disabled: !canMut,
4118
- onMouseDown: (e) => e.preventDefault(),
4119
- onClick: () => {
4120
- if (canFormat) {
4121
- p.onUpdateTextStyle({ align: b.id });
4122
- }
4123
- },
4124
- className: i < a.length - 1 ? gB : gL,
4125
- title: t(b.labelKey),
4126
- ...controlAttr(ALIGN_CONTROL[b.id]),
4127
- children: b.i
4128
- },
4129
- b.id
4130
- )) }),
3224
+ family: "paragraph",
3225
+ controls: paragraphControls,
3226
+ onRequest: requestParagraph
3227
+ }
3228
+ ),
4131
3229
  /* @__PURE__ */ jsx(
4132
3230
  LineSpacingDropdown,
4133
3231
  {
@@ -4157,47 +3255,6 @@ function ParagraphGroup(p) {
4157
3255
  /* @__PURE__ */ jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: t("pptx.ribbon.paragraph") })
4158
3256
  ] });
4159
3257
  }
4160
-
4161
- // src/viewer/components/toolbar/text-section-state.ts
4162
- function getEffectiveTextStyle(element, tableEditorState) {
4163
- if (!element) {
4164
- return void 0;
4165
- }
4166
- if (hasTextProperties(element)) {
4167
- return element.textStyle;
4168
- }
4169
- if (element.type === "table" && tableEditorState && element.tableData) {
4170
- const cell = element.tableData.rows[tableEditorState.rowIndex]?.cells[tableEditorState.columnIndex];
4171
- return cell?.style;
4172
- }
4173
- return void 0;
4174
- }
4175
- function isTextDecorationFlag(id) {
4176
- return TEXT_DECORATION_FLAGS.includes(id);
4177
- }
4178
- function textSectionFlags(element, tableEditorState, readSelection) {
4179
- if (element && hasTextProperties(element)) {
4180
- const result = readSelection ? getInlineEditorSelectionResult(element.textSegments) : null;
4181
- const current = result?.kind === "supported" && (!result.snapshot || result.snapshot.elementId === element.id) ? result : null;
4182
- return getSelectionTextStyleFlags(
4183
- current?.snapshot?.textSegments ?? element.textSegments,
4184
- current?.selection ?? null,
4185
- element.textStyle
4186
- );
4187
- }
4188
- return getSelectionTextStyleFlags(
4189
- void 0,
4190
- null,
4191
- getEffectiveTextStyle(element, tableEditorState)
4192
- );
4193
- }
4194
- function textSectionBulletKind(element, tableEditorState) {
4195
- if (element && hasTextProperties(element)) {
4196
- const result = getInlineEditorSelectionResult(element.textSegments, { preserveCaret: true });
4197
- return result.kind === "supported" && (!result.snapshot || result.snapshot.elementId === element.id) ? selectionBulletKind(element, result.selection, result.snapshot?.textSegments) : elementBulletKind(element);
4198
- }
4199
- return getEffectiveTextStyle(element, tableEditorState)?.listType ?? "none";
4200
- }
4201
3258
  function RecentColorsRow({
4202
3259
  prefix,
4203
3260
  disabled,
@@ -4595,13 +3652,6 @@ function useParagraphListKind(element) {
4595
3652
  const readServer = useCallback(() => element ? elementBulletKind(element) : "none", [element]);
4596
3653
  return useSyncExternalStore(subscribe, read, readServer);
4597
3654
  }
4598
- var ON2 = "bg-primary/20 ring-1 ring-primary";
4599
- var FONT_TOGGLE_CONTROL = {
4600
- bold: "home.font.bold",
4601
- italic: "home.font.italic",
4602
- underline: "home.font.underline",
4603
- strikethrough: "home.font.strikethrough"
4604
- };
4605
3655
  function TextSection(p) {
4606
3656
  const { t } = useTranslation();
4607
3657
  const hasSel = Boolean(p.selectedElement);
@@ -4610,7 +3660,6 @@ function TextSection(p) {
4610
3660
  const isTable = hasSel && p.selectedElement?.type === "table";
4611
3661
  const canFormat = isTextEl || isTable;
4612
3662
  const effectiveTs = getEffectiveTextStyle(p.selectedElement, p.tableEditorState);
4613
- const pressedFlags = textSectionFlags(p.selectedElement, p.tableEditorState, false);
4614
3663
  const selectedListKind = useParagraphListKind(p.selectedElement);
4615
3664
  const bulletKind = isTextEl ? selectedListKind : textSectionBulletKind(p.selectedElement, p.tableEditorState);
4616
3665
  const toggleBullets = (kind) => {
@@ -4650,158 +3699,18 @@ function TextSection(p) {
4650
3699
  return /* @__PURE__ */ jsxs(Fragment, { children: [
4651
3700
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-0.5", ...groupAttr("home.font"), children: [
4652
3701
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", "data-pptx-chrome": "font-controls", children: [
4653
- /* @__PURE__ */ jsx("div", { className: grp, "data-pptx-chrome": "control-cluster", children: FMT.map((b, i, a) => {
4654
- const flag = isTextDecorationFlag(b.id) ? b.id : void 0;
4655
- const handleClick = () => {
4656
- if (!canFormat || !p.selectedElement || !flag) {
4657
- return;
4658
- }
4659
- const flags = textSectionFlags(p.selectedElement, p.tableEditorState, true);
4660
- p.onUpdateTextStyle({ [flag]: nextToggleValue(flags[flag]) });
4661
- };
4662
- const pressed = flag !== void 0 && pressedFlags[flag] === "on";
4663
- return /* @__PURE__ */ jsx(
4664
- "button",
4665
- {
4666
- type: "button",
4667
- disabled: !canMut,
4668
- "aria-pressed": pressed,
4669
- onMouseDown: (e) => e.preventDefault(),
4670
- onClick: handleClick,
4671
- className: `${i < a.length - 1 ? gB : gL}${pressed ? ` ${ON2}` : ""}`,
4672
- title: t(b.labelKey),
4673
- ...controlAttr(FONT_TOGGLE_CONTROL[b.id]),
4674
- children: b.i
4675
- },
4676
- b.id
4677
- );
4678
- }) }),
4679
3702
  /* @__PURE__ */ jsx(
4680
- "button",
3703
+ FontFormatGroup,
4681
3704
  {
4682
- type: "button",
4683
- disabled: !canMut,
4684
- onMouseDown: (e) => e.preventDefault(),
4685
- onClick: () => {
4686
- if (!canFormat) {
4687
- return;
4688
- }
4689
- const hasShadow = Boolean(effectiveTs?.textShadowColor);
4690
- p.onUpdateTextStyle(
4691
- hasShadow ? {
4692
- textShadowColor: void 0,
4693
- textShadowBlur: void 0,
4694
- textShadowOffsetX: void 0,
4695
- textShadowOffsetY: void 0
4696
- } : {
4697
- textShadowColor: "#000000",
4698
- textShadowBlur: 2,
4699
- textShadowOffsetX: 1,
4700
- textShadowOffsetY: 1,
4701
- textShadowOpacity: 0.5
4702
- }
4703
- );
4704
- },
4705
- className: pill,
4706
- title: t("pptx.textEffects.shadow"),
4707
- "aria-label": t("pptx.textEffects.shadow"),
4708
- ...controlAttr("home.font.shadow"),
4709
- children: /* @__PURE__ */ jsxs(
4710
- "svg",
4711
- {
4712
- className: ic,
4713
- viewBox: "0 0 24 24",
4714
- fill: "none",
4715
- stroke: "currentColor",
4716
- strokeWidth: "2",
4717
- children: [
4718
- /* @__PURE__ */ jsx("text", { x: "6", y: "17", fontSize: "16", fontWeight: "bold", fill: "currentColor", stroke: "none", children: "S" }),
4719
- /* @__PURE__ */ jsx(
4720
- "text",
4721
- {
4722
- x: "7.5",
4723
- y: "18.5",
4724
- fontSize: "16",
4725
- fontWeight: "bold",
4726
- fill: "none",
4727
- stroke: "currentColor",
4728
- strokeWidth: "0.5",
4729
- opacity: "0.4",
4730
- children: "S"
4731
- }
4732
- )
4733
- ]
4734
- }
4735
- )
3705
+ canMut,
3706
+ canFormat,
3707
+ isTextEl,
3708
+ selectedElement: p.selectedElement,
3709
+ tableEditorState: p.tableEditorState,
3710
+ effectiveTs,
3711
+ onUpdateTextStyle: p.onUpdateTextStyle
4736
3712
  }
4737
3713
  ),
4738
- /* @__PURE__ */ jsxs("div", { className: grp, "data-pptx-chrome": "control-cluster", children: [
4739
- /* @__PURE__ */ jsx(
4740
- "button",
4741
- {
4742
- type: "button",
4743
- disabled: !canMut,
4744
- onMouseDown: (e) => e.preventDefault(),
4745
- onClick: () => {
4746
- if (!canFormat || !p.selectedElement) {
4747
- return;
4748
- }
4749
- const current = effectiveTs?.fontSize ?? (isTextEl ? textFontSizePtToPx(18) : 18);
4750
- const delta = isTextEl ? textFontSizePtToPx(2) : 2;
4751
- p.onUpdateTextStyle({ fontSize: current + delta });
4752
- },
4753
- className: gB,
4754
- title: t("pptx.text.increaseFontSize"),
4755
- ...controlAttr("home.font.increaseFontSize"),
4756
- children: /* @__PURE__ */ jsx(LuAArrowUp, { className: ic })
4757
- }
4758
- ),
4759
- /* @__PURE__ */ jsx(
4760
- "button",
4761
- {
4762
- type: "button",
4763
- disabled: !canMut,
4764
- onMouseDown: (e) => e.preventDefault(),
4765
- onClick: () => {
4766
- if (!canFormat || !p.selectedElement) {
4767
- return;
4768
- }
4769
- const current = effectiveTs?.fontSize ?? (isTextEl ? textFontSizePtToPx(18) : 18);
4770
- const delta = isTextEl ? textFontSizePtToPx(2) : 2;
4771
- const minimum = isTextEl ? textFontSizePtToPx(1) : 1;
4772
- p.onUpdateTextStyle({ fontSize: Math.max(minimum, current - delta) });
4773
- },
4774
- className: gB,
4775
- title: t("pptx.text.decreaseFontSize"),
4776
- ...controlAttr("home.font.decreaseFontSize"),
4777
- children: /* @__PURE__ */ jsx(LuAArrowDown, { className: ic })
4778
- }
4779
- ),
4780
- /* @__PURE__ */ jsx(
4781
- "button",
4782
- {
4783
- type: "button",
4784
- disabled: !canMut,
4785
- onMouseDown: (e) => e.preventDefault(),
4786
- onClick: () => {
4787
- if (!canFormat) {
4788
- return;
4789
- }
4790
- p.onUpdateTextStyle({
4791
- bold: false,
4792
- italic: false,
4793
- underline: false,
4794
- strikethrough: false,
4795
- highlightColor: void 0
4796
- });
4797
- },
4798
- className: gL,
4799
- title: t("pptx.text.clearFormatting"),
4800
- ...controlAttr("home.font.clearFormatting"),
4801
- children: /* @__PURE__ */ jsx(LuRemoveFormatting, { className: ic })
4802
- }
4803
- )
4804
- ] }),
4805
3714
  /* @__PURE__ */ jsx(
4806
3715
  TextSpacingCaseMenus,
4807
3716
  {
@@ -4842,228 +3751,62 @@ function TextSection(p) {
4842
3751
  }
4843
3752
  function ViewSection(p) {
4844
3753
  const { t } = useTranslation();
4845
- return /* @__PURE__ */ jsxs(Fragment, { children: [
4846
- /* @__PURE__ */ jsxs(RibbonGroup, { label: t("pptx.view.presentationViews"), groupId: "view.presentationViews", children: [
4847
- /* @__PURE__ */ jsx(
4848
- RibbonCommand,
4849
- {
4850
- controlId: "view.presentationViews.normal",
4851
- label: t("pptx.view.normal"),
4852
- icon: /* @__PURE__ */ jsx(LuPanelTop, {}),
4853
- onClick: p.onGoToNormalView,
4854
- title: t("pptx.statusBar.normalView")
4855
- }
4856
- ),
4857
- /* @__PURE__ */ jsx(
4858
- RibbonCommand,
4859
- {
4860
- controlId: "view.presentationViews.slideSorter",
4861
- label: t("pptx.slideSorter.title"),
4862
- icon: /* @__PURE__ */ jsx(LuLayoutGrid, {}),
4863
- onClick: p.onToggleSlideSorter,
4864
- title: t("pptx.view.slideSorterTooltip")
4865
- }
4866
- ),
4867
- /* @__PURE__ */ jsx(
4868
- RibbonCommand,
4869
- {
4870
- controlId: "view.presentationViews.outline",
4871
- label: t("pptx.view.outlineView"),
4872
- icon: /* @__PURE__ */ jsx(LuIndentIncrease, {}),
4873
- onClick: p.onOpenOutlineView,
4874
- title: t("pptx.view.outlineViewTooltip")
4875
- }
4876
- ),
4877
- /* @__PURE__ */ jsx(
4878
- RibbonCommand,
4879
- {
4880
- controlId: "view.presentationViews.readingView",
4881
- label: t("pptx.view.readingView"),
4882
- icon: /* @__PURE__ */ jsx(LuBookOpen, {}),
4883
- onClick: p.onOpenReadingView,
4884
- title: t("pptx.view.readingView")
4885
- }
4886
- )
4887
- ] }),
4888
- /* @__PURE__ */ jsxs(RibbonGroup, { label: t("pptx.view.masterViews"), groupId: "view.masterViews", children: [
4889
- /* @__PURE__ */ jsx(
4890
- RibbonCommand,
4891
- {
4892
- controlId: "view.masterViews.slideMaster",
4893
- label: t("pptx.master.title"),
4894
- icon: /* @__PURE__ */ jsx(LuPresentation, {}),
4895
- onClick: p.onEnterMasterView,
4896
- disabled: !p.canEdit,
4897
- title: t("pptx.view.slideMasterTooltip")
4898
- }
4899
- ),
4900
- /* @__PURE__ */ jsx(
4901
- RibbonCommand,
4902
- {
4903
- controlId: "view.masterViews.handoutMaster",
4904
- label: t("pptx.master.handoutMasterTitle", { defaultValue: "Handout Master" }),
4905
- icon: /* @__PURE__ */ jsx(LuGrid3X3, {}),
4906
- disabled: true
4907
- }
4908
- ),
4909
- /* @__PURE__ */ jsx(
4910
- RibbonCommand,
4911
- {
4912
- controlId: "view.masterViews.notesMaster",
4913
- label: t("pptx.master.notesMasterTitle", { defaultValue: "Notes Master" }),
4914
- icon: /* @__PURE__ */ jsx(LuStickyNote, {}),
4915
- disabled: true
4916
- }
4917
- )
4918
- ] }),
4919
- /* @__PURE__ */ jsxs(RibbonGroup, { label: t("pptx.view.show", { defaultValue: "Show" }), groupId: "view.show", children: [
4920
- /* @__PURE__ */ jsxs(RibbonCommandStack, { children: [
4921
- /* @__PURE__ */ jsx(
4922
- RibbonToggle,
4923
- {
4924
- controlId: "view.show.ruler",
4925
- label: t("pptx.ruler.rulers"),
4926
- checked: p.showRulers,
4927
- onChange: p.onSetShowRulers
4928
- }
4929
- ),
4930
- /* @__PURE__ */ jsx(
4931
- RibbonToggle,
4932
- {
4933
- controlId: "view.show.gridlines",
4934
- label: t("pptx.grid.grid"),
4935
- checked: p.showGrid,
4936
- onChange: p.onSetShowGrid,
4937
- title: t("pptx.grid.toggleGrid")
4938
- }
4939
- ),
4940
- /* @__PURE__ */ jsx(
4941
- RibbonToggle,
4942
- {
4943
- controlId: "view.show.guides",
4944
- label: t("pptx.view.guides", { defaultValue: "Guides" }),
4945
- checked: p.showGuides,
4946
- onChange: p.onSetShowGuides,
4947
- title: t("pptx.ribbon.toggleGuides")
4948
- }
4949
- ),
4950
- /* @__PURE__ */ jsx(
4951
- RibbonToggle,
4952
- {
4953
- controlId: "view.show.snapToGrid",
4954
- label: t("pptx.settings.snapToGrid"),
4955
- checked: p.snapToGrid,
4956
- onChange: p.onSetSnapToGrid
4957
- }
4958
- )
4959
- ] }),
4960
- /* @__PURE__ */ jsxs(RibbonCommandStack, { children: [
4961
- /* @__PURE__ */ jsx(
4962
- RibbonCommand,
4963
- {
4964
- compact: true,
4965
- controlId: "view.show.selectionPane",
4966
- label: t("pptx.view.selection"),
4967
- icon: /* @__PURE__ */ jsx(LuList, {}),
4968
- onClick: p.onToggleSelectionPane,
4969
- active: p.isSelectionPaneOpen,
4970
- title: t("pptx.selectionPane.title")
4971
- }
4972
- ),
4973
- /* @__PURE__ */ jsx(
4974
- RibbonCommand,
4975
- {
4976
- compact: true,
4977
- controlId: "view.show.eyedropper",
4978
- label: t("pptx.ribbon.eyedropper"),
4979
- icon: /* @__PURE__ */ jsx(LuPipette, {}),
4980
- onClick: p.onToggleEyedropper,
4981
- active: p.eyedropperActive,
4982
- disabled: !p.canEdit
4983
- }
4984
- ),
4985
- /* @__PURE__ */ jsx(
4986
- RibbonCommand,
4987
- {
4988
- compact: true,
4989
- controlId: "view.show.snapToShape",
4990
- label: t("pptx.view.snapToShape"),
4991
- icon: /* @__PURE__ */ jsx(LuGrid3X3, {}),
4992
- onClick: () => p.onSetSnapToShape(!p.snapToShape),
4993
- active: p.snapToShape,
4994
- title: t("pptx.view.snapToShape")
4995
- }
4996
- ),
4997
- /* @__PURE__ */ jsx(
4998
- RibbonCommand,
4999
- {
5000
- compact: true,
5001
- controlId: "view.show.addGuide",
5002
- label: t("pptx.view.hGuide"),
5003
- icon: /* @__PURE__ */ jsx(LuRuler, {}),
5004
- onClick: () => p.onAddGuide("h"),
5005
- title: t("pptx.view.addHorizontalGuide")
5006
- }
5007
- ),
5008
- /* @__PURE__ */ jsx(
5009
- RibbonCommand,
5010
- {
5011
- compact: true,
5012
- controlId: "view.show.addGuide",
5013
- label: t("pptx.view.vGuide"),
5014
- icon: /* @__PURE__ */ jsx(LuRuler, {}),
5015
- onClick: () => p.onAddGuide("v"),
5016
- title: t("pptx.view.addVerticalGuide")
5017
- }
5018
- )
5019
- ] })
5020
- ] }),
5021
- /* @__PURE__ */ jsxs(RibbonGroup, { label: t("pptx.slideSorter.zoom"), groupId: "view.zoom", children: [
5022
- /* @__PURE__ */ jsx(
5023
- RibbonCommand,
5024
- {
5025
- controlId: "view.zoom.zoom",
5026
- label: t("pptx.slideSorter.zoom"),
5027
- icon: /* @__PURE__ */ jsx(LuZoomIn, {}),
5028
- disabled: true
5029
- }
5030
- ),
5031
- /* @__PURE__ */ jsx(
5032
- RibbonCommand,
5033
- {
5034
- controlId: "view.zoom.fitToWindow",
5035
- label: t("pptx.view.zoomToFit"),
5036
- icon: /* @__PURE__ */ jsx(LuMaximize2, {}),
5037
- onClick: p.onZoomToFit
5038
- }
5039
- )
5040
- ] }),
5041
- /* @__PURE__ */ jsxs(RibbonGroup, { label: t("pptx.view.window", { defaultValue: "Window" }), groupId: "view.window", children: [
5042
- /* @__PURE__ */ jsx(
5043
- RibbonCommand,
5044
- {
5045
- controlId: "view.window.templateEditing",
5046
- label: t(p.editTemplateMode ? "pptx.ribbon.templatesOn" : "pptx.ribbon.templatesOff"),
5047
- icon: /* @__PURE__ */ jsx(LuRuler, {}),
5048
- onClick: () => p.onSetEditTemplateMode(!p.editTemplateMode),
5049
- active: p.editTemplateMode,
5050
- disabled: !p.canEdit,
5051
- title: t("pptx.view.templateEditingTooltip", {
5052
- defaultValue: "Toggle template/master element editing"
5053
- })
5054
- }
5055
- ),
5056
- /* @__PURE__ */ jsx(
5057
- RibbonCommand,
5058
- {
5059
- controlId: "view.window.macros",
5060
- label: t("pptx.view.macros", { defaultValue: "Macros" }),
5061
- icon: /* @__PURE__ */ jsx(LuCode, {}),
5062
- disabled: true
5063
- }
5064
- )
5065
- ] })
5066
- ] });
3754
+ const ref = useRef(null);
3755
+ useEffect(() => {
3756
+ const host = ref.current;
3757
+ if (!host) {
3758
+ return;
3759
+ }
3760
+ host.state = {
3761
+ editable: p.canEdit,
3762
+ showRulers: p.showRulers,
3763
+ showGrid: p.showGrid,
3764
+ showGuides: p.showGuides,
3765
+ snapToGrid: p.snapToGrid,
3766
+ snapToShape: p.snapToShape,
3767
+ templateEditing: p.editTemplateMode,
3768
+ selectionPaneOpen: p.isSelectionPaneOpen,
3769
+ eyedropperActive: p.eyedropperActive,
3770
+ translate: t
3771
+ };
3772
+ }, [p, t]);
3773
+ useEffect(() => {
3774
+ const host = ref.current;
3775
+ if (!host) {
3776
+ return;
3777
+ }
3778
+ const request = (event) => {
3779
+ const intent = event.detail;
3780
+ if (intent.kind === "guide") {
3781
+ p.onAddGuide(intent.axis);
3782
+ } else if (intent.kind === "option") {
3783
+ const setters = {
3784
+ showRulers: p.onSetShowRulers,
3785
+ showGrid: p.onSetShowGrid,
3786
+ showGuides: p.onSetShowGuides,
3787
+ snapToGrid: p.onSetSnapToGrid,
3788
+ snapToShape: p.onSetSnapToShape,
3789
+ templateEditing: p.onSetEditTemplateMode
3790
+ };
3791
+ setters[intent.value](intent.enabled);
3792
+ } else {
3793
+ const commands = {
3794
+ normal: p.onGoToNormalView,
3795
+ slideSorter: p.onToggleSlideSorter,
3796
+ outline: p.onOpenOutlineView,
3797
+ readingView: p.onOpenReadingView,
3798
+ slideMaster: p.onEnterMasterView,
3799
+ selectionPane: p.onToggleSelectionPane,
3800
+ eyedropper: p.onToggleEyedropper,
3801
+ zoomToFit: p.onZoomToFit
3802
+ };
3803
+ commands[intent.value]?.();
3804
+ }
3805
+ };
3806
+ host.addEventListener("view-request", request);
3807
+ return () => host.removeEventListener("view-request", request);
3808
+ }, [p]);
3809
+ return /* @__PURE__ */ jsx("pptx-ui-ribbon-view", { ref });
5067
3810
  }
5068
3811
  function MobileSheet({
5069
3812
  open,
@@ -5260,6 +4003,7 @@ function MobileSectionBody({
5260
4003
  return /* @__PURE__ */ jsx("div", { className: wrap, children: /* @__PURE__ */ jsx(
5261
4004
  DrawSection,
5262
4005
  {
4006
+ canEdit: p.canEdit,
5263
4007
  activeTool: p.activeTool,
5264
4008
  drawingColor: p.drawingColor,
5265
4009
  drawingWidth: p.drawingWidth,
@@ -5794,6 +4538,7 @@ function DrawingGroup(p) {
5794
4538
  sep
5795
4539
  ] });
5796
4540
  }
4541
+ var editingControls = editingHomeControls();
5797
4542
  function EditingSection(p) {
5798
4543
  const { t } = useTranslation();
5799
4544
  const [selectMenuOpen, setSelectMenuOpen] = useState(false);
@@ -5814,32 +4559,14 @@ function EditingSection(p) {
5814
4559
  sep,
5815
4560
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-0.5", ...groupAttr("home.editing"), children: [
5816
4561
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
5817
- /* @__PURE__ */ jsxs("div", { className: grp, children: [
5818
- /* @__PURE__ */ jsx(
5819
- "button",
5820
- {
5821
- type: "button",
5822
- onMouseDown: (e) => e.preventDefault(),
5823
- onClick: p.onToggleFindReplace,
5824
- className: gB,
5825
- title: t("pptx.editing.find"),
5826
- ...controlAttr("home.editing.find"),
5827
- children: /* @__PURE__ */ jsx(LuSearch, { className: ic })
5828
- }
5829
- ),
5830
- /* @__PURE__ */ jsx(
5831
- "button",
5832
- {
5833
- type: "button",
5834
- onMouseDown: (e) => e.preventDefault(),
5835
- onClick: p.onToggleFindReplace,
5836
- className: gL,
5837
- title: t("pptx.ribbon.replace"),
5838
- ...controlAttr("home.editing.replace"),
5839
- children: /* @__PURE__ */ jsx(LuReplace, { className: ic })
5840
- }
5841
- )
5842
- ] }),
4562
+ /* @__PURE__ */ jsx(
4563
+ WebHomeControls,
4564
+ {
4565
+ family: "editing",
4566
+ controls: editingControls,
4567
+ onRequest: p.onToggleFindReplace
4568
+ }
4569
+ ),
5843
4570
  /* @__PURE__ */ jsxs("div", { className: "relative", ref: menuRef, ...controlAttr("home.editing.select"), children: [
5844
4571
  /* @__PURE__ */ jsx(
5845
4572
  "button",
@@ -6808,6 +5535,7 @@ function Toolbar(p) {
6808
5535
  sDrw && /* @__PURE__ */ jsx(
6809
5536
  DrawSection,
6810
5537
  {
5538
+ canEdit: p.canEdit,
6811
5539
  activeTool: p.activeTool,
6812
5540
  drawingColor: p.drawingColor,
6813
5541
  drawingWidth: p.drawingWidth,
@@ -7079,7 +5807,7 @@ var EXPLOSION_SUPPORTED_TYPES = /* @__PURE__ */ new Set([
7079
5807
  "doughnut",
7080
5808
  "ofPie"
7081
5809
  ]);
7082
- var ICONS4 = {
5810
+ var ICONS3 = {
7083
5811
  elements: LuPlus,
7084
5812
  styles: LuPaintbrush,
7085
5813
  filters: LuFilter
@@ -7122,7 +5850,7 @@ function ChartQuickActionsOverlay({
7122
5850
  "data-export-ignore": "true",
7123
5851
  style: { position: "absolute", left: 0, top: 0, zIndex: 59 },
7124
5852
  onMouseDown: (e) => e.stopPropagation(),
7125
- children: descriptor.buttons.map((button) => /* @__PURE__ */ jsxs(React7.Fragment, { children: [
5853
+ children: descriptor.buttons.map((button) => /* @__PURE__ */ jsxs(React95.Fragment, { children: [
7126
5854
  /* @__PURE__ */ jsx(
7127
5855
  "button",
7128
5856
  {
@@ -7142,7 +5870,7 @@ function ChartQuickActionsOverlay({
7142
5870
  transformOrigin: "top left"
7143
5871
  },
7144
5872
  className: "flex items-center justify-center rounded bg-white border border-gray-300 shadow-sm hover:bg-gray-100 text-gray-700",
7145
- children: React7.createElement(ICONS4[button.id], { className: "size-3.5" })
5873
+ children: React95.createElement(ICONS3[button.id], { className: "size-3.5" })
7146
5874
  }
7147
5875
  ),
7148
5876
  open === button.id && button.id === "elements" && /* @__PURE__ */ jsxs(
@@ -8292,7 +7020,7 @@ function HorizontalRulerView({ ticks, widthPx, highlight }) {
8292
7020
  }
8293
7021
  );
8294
7022
  }
8295
- var HorizontalRuler = React7.memo(HorizontalRulerView);
7023
+ var HorizontalRuler = React95.memo(HorizontalRulerView);
8296
7024
  HorizontalRuler.displayName = "HorizontalRuler";
8297
7025
  function VerticalRulerView({ ticks, heightPx, highlight }) {
8298
7026
  return /* @__PURE__ */ jsxs(
@@ -8364,7 +7092,7 @@ function VerticalRulerView({ ticks, heightPx, highlight }) {
8364
7092
  }
8365
7093
  );
8366
7094
  }
8367
- var VerticalRuler = React7.memo(VerticalRulerView);
7095
+ var VerticalRuler = React95.memo(VerticalRulerView);
8368
7096
  VerticalRuler.displayName = "VerticalRuler";
8369
7097
  function Ruler({
8370
7098
  canvasSize,
@@ -9243,6 +7971,9 @@ function ActiveXControlOverlay({
9243
7971
  }) });
9244
7972
  }
9245
7973
  var EMPTY_ADJUSTMENT_HANDLES = [];
7974
+ function cssAttr(id) {
7975
+ return id.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
7976
+ }
9246
7977
  function SlideCanvas(props) {
9247
7978
  const latest = useRef(props);
9248
7979
  latest.current = props;
@@ -9407,6 +8138,22 @@ function SlideCanvasContent({
9407
8138
  zoom,
9408
8139
  onMoveGuide
9409
8140
  });
8141
+ const slideElements = activeSlide?.elements;
8142
+ const enteredGroup = useMemo(() => {
8143
+ if (!slideElements || !selectedElement) {
8144
+ return null;
8145
+ }
8146
+ const parentId = parentSelection(slideElements, selectedElement.id);
8147
+ return parentId ? slideSpaceElement(slideElements, parentId) : null;
8148
+ }, [slideElements, selectedElement]);
8149
+ const editingMember = useMemo(() => {
8150
+ if (!slideElements || !inlineEditingElementId || !isGroupMember(slideElements, inlineEditingElementId)) {
8151
+ return null;
8152
+ }
8153
+ const member = slideSpaceElement(slideElements, inlineEditingElementId);
8154
+ const parentId = parentSelection(slideElements, inlineEditingElementId);
8155
+ return member && parentId ? { member, parentId } : null;
8156
+ }, [slideElements, inlineEditingElementId]);
9410
8157
  const selectedMotionPath = selectedElement ? motionPathFor(activeSlide?.animations ?? [], selectedElement.id) : void 0;
9411
8158
  const handleMotionPathChange = useCallback(
9412
8159
  (path) => {
@@ -9618,6 +8365,59 @@ function SlideCanvasContent({
9618
8365
  },
9619
8366
  element.id
9620
8367
  )),
8368
+ enteredGroup && /* @__PURE__ */ jsx(
8369
+ "div",
8370
+ {
8371
+ "data-pptx-entered-group": true,
8372
+ "aria-hidden": true,
8373
+ className: "absolute pointer-events-none outline outline-1 outline-dashed outline-blue-500/70",
8374
+ style: {
8375
+ left: enteredGroup.x,
8376
+ top: enteredGroup.y,
8377
+ width: enteredGroup.width,
8378
+ height: enteredGroup.height,
8379
+ zIndex: templateElements.length + (activeSlide?.elements.length ?? 0) + 1
8380
+ }
8381
+ }
8382
+ ),
8383
+ editingMember && /* @__PURE__ */ jsxs(Fragment, { children: [
8384
+ /* @__PURE__ */ jsx("style", { children: `[data-element-id="${cssAttr(editingMember.parentId)}"] [data-element-id="${cssAttr(editingMember.member.id)}"]{visibility:hidden}` }),
8385
+ /* @__PURE__ */ jsx(
8386
+ ElementRenderer,
8387
+ {
8388
+ element: editingMember.member,
8389
+ activeSlide,
8390
+ isSelected: true,
8391
+ isInlineEditing: true,
8392
+ inlineEditingText,
8393
+ canInteract: isEditableCanvas,
8394
+ spellCheckEnabled,
8395
+ mediaDataUrls,
8396
+ selectionColorClass: "blue-500",
8397
+ showHoverBorder: false,
8398
+ zIndex: templateElements.length + (activeSlide?.elements.length ?? 0) + 2,
8399
+ imageAltText: "Slide element",
8400
+ showResizeHandles: false,
8401
+ renderInk: true,
8402
+ renderGroups: true,
8403
+ adjustmentHandles: EMPTY_ADJUSTMENT_HANDLES,
8404
+ onResizePointerDown: stableResizePointerDown,
8405
+ onAdjustmentPointerDown: stableAdjustmentPointerDown,
8406
+ onRotate: stableRotate,
8407
+ onInlineEditChange: stableInlineEditChange,
8408
+ onInlineEditCommit: stableInlineEditCommit,
8409
+ onInlineEditCancel: stableInlineEditCancel,
8410
+ onUpdateSmartArtElement: stableUpdateSmartArtElement,
8411
+ onFormatText: stableFormatText,
8412
+ onHyperlinkClick,
8413
+ allSlides,
8414
+ sourceSlideIndex,
8415
+ fieldContext,
8416
+ tableStyleContext
8417
+ },
8418
+ `group-member-edit-${editingMember.member.id}`
8419
+ )
8420
+ ] }),
9621
8421
  selectedElement && selectedElement.id !== cropElement?.id && shouldShowElementHandles(isEditableCanvas, true, selectedElementIdSet.size) && !isConnectorOrLineElement(selectedElement) && outlineAuthoring?.editPointsElementId !== selectedElement.id && /* @__PURE__ */ jsx(
9622
8422
  SelectionHandleOverlay,
9623
8423
  {
@@ -10290,7 +9090,7 @@ function slideThumbnailPropsEqual(prev, next) {
10290
9090
  }
10291
9091
  return true;
10292
9092
  }
10293
- var SlideThumbnail = React7.memo(SlideThumbnailImpl, slideThumbnailPropsEqual);
9093
+ var SlideThumbnail = React95.memo(SlideThumbnailImpl, slideThumbnailPropsEqual);
10294
9094
 
10295
9095
  // src/viewer/components/context-menu-dispatch.ts
10296
9096
  function tableCell(props) {
@@ -11051,7 +9851,7 @@ function LazyThumbnailInner({
11051
9851
  }
11052
9852
  ) });
11053
9853
  }
11054
- var LazyThumbnail = React7.memo(LazyThumbnailInner);
9854
+ var LazyThumbnail = React95.memo(LazyThumbnailInner);
11055
9855
 
11056
9856
  // src/viewer/components/slides-pane/utils.ts
11057
9857
  function formatTimingMs(ms) {
@@ -11213,7 +10013,7 @@ function SlideItemInner({
11213
10013
  }
11214
10014
  );
11215
10015
  }
11216
- var SlideItem = React7.memo(SlideItemInner);
10016
+ var SlideItem = React95.memo(SlideItemInner);
11217
10017
  function useSlidePaneCallbacks(onMoveSlide, onRenameSection, onToggleSectionCollapse) {
11218
10018
  const [collapsedSections, setCollapsedSections] = useState({});
11219
10019
  const [renamingSectionId, setRenamingSectionId] = useState(null);
@@ -12622,7 +11422,7 @@ function arePropsEqual(prev, next) {
12622
11422
  }
12623
11423
  return true;
12624
11424
  }
12625
- var SlideCard = React7.memo(SlideCardImpl, arePropsEqual);
11425
+ var SlideCard = React95.memo(SlideCardImpl, arePropsEqual);
12626
11426
  function SorterContextMenu({
12627
11427
  x,
12628
11428
  y,
@@ -14181,8 +12981,8 @@ function SlideNotesPanel({
14181
12981
  onHeightChange
14182
12982
  }) {
14183
12983
  const { t } = useTranslation();
14184
- const rootRef = React7.useRef(null);
14185
- React7.useEffect(() => {
12984
+ const rootRef = React95.useRef(null);
12985
+ React95.useEffect(() => {
14186
12986
  const el = rootRef.current;
14187
12987
  if (!el || !onHeightChange) {
14188
12988
  return void 0;
@@ -16074,9 +14874,9 @@ function PresentationSubtitleBar({
16074
14874
  function renderNotesSegments(segments) {
16075
14875
  return notesSegmentsToSpans(segments).map((span) => {
16076
14876
  if (span.kind === "break") {
16077
- return React7.createElement("br", { key: span.key });
14877
+ return React95.createElement("br", { key: span.key });
16078
14878
  }
16079
- return React7.createElement(
14879
+ return React95.createElement(
16080
14880
  "span",
16081
14881
  { key: span.key, style: span.style },
16082
14882
  span.text
@@ -16308,7 +15108,7 @@ function scaledSlidePreviewPropsEqual(prev, next) {
16308
15108
  }
16309
15109
  return true;
16310
15110
  }
16311
- var ScaledSlidePreview = React7.memo(ScaledSlidePreviewImpl, scaledSlidePreviewPropsEqual);
15111
+ var ScaledSlidePreview = React95.memo(ScaledSlidePreviewImpl, scaledSlidePreviewPropsEqual);
16312
15112
  function PresenterNotesRail({
16313
15113
  slides,
16314
15114
  current,
@@ -17546,7 +16346,7 @@ function EffectSoundRow({
17546
16346
  onPickStock
17547
16347
  }) {
17548
16348
  const { t } = useTranslation();
17549
- const fileInputRef = React7.useRef(null);
16349
+ const fileInputRef = React95.useRef(null);
17550
16350
  const selectedValue = soundState.catalogueId ?? (soundState.hasSound ? CURRENT_VALUE : NONE_VALUE);
17551
16351
  const handleSelectChange = (event) => {
17552
16352
  const value = event.target.value;
@@ -21132,7 +19932,7 @@ function ConnectorArrowsSection({
21132
19932
  ["Start", "End"].map((end) => {
21133
19933
  const widthKey = end === "Start" ? "connectorStartArrowWidth" : "connectorEndArrowWidth";
21134
19934
  const lengthKey = end === "Start" ? "connectorStartArrowLength" : "connectorEndArrowLength";
21135
- return /* @__PURE__ */ jsxs(React7.Fragment, { children: [
19935
+ return /* @__PURE__ */ jsxs(React95.Fragment, { children: [
21136
19936
  /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1", children: [
21137
19937
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t(END_LABEL_KEYS[end].width) }),
21138
19938
  /* @__PURE__ */ jsx(
@@ -24009,7 +22809,7 @@ function StrokeEffectsSection({
24009
22809
  ] }),
24010
22810
  EFFECT_CONFIGS.map((cfg) => {
24011
22811
  const on = cfg.isOn(style);
24012
- return /* @__PURE__ */ jsxs(React7.Fragment, { children: [
22812
+ return /* @__PURE__ */ jsxs(React95.Fragment, { children: [
24013
22813
  /* @__PURE__ */ jsxs("label", { className: `inline-flex items-center gap-2 text-foreground ${COL2}`, children: [
24014
22814
  /* @__PURE__ */ jsx(
24015
22815
  WebCheckbox,
@@ -24877,7 +23677,7 @@ function TextWarpGallery({
24877
23677
  onUpdateTextStyle
24878
23678
  }) {
24879
23679
  const { t } = useTranslation();
24880
- const [expanded, setExpanded] = React7.useState(false);
23680
+ const [expanded, setExpanded] = React95.useState(false);
24881
23681
  const currentPreset = ts?.textWarpPreset || "textNoShape";
24882
23682
  return /* @__PURE__ */ jsxs("div", { className: "mt-2 rounded border border-border bg-card p-2 space-y-2", children: [
24883
23683
  /* @__PURE__ */ jsxs(
@@ -25528,7 +24328,7 @@ function SmartArtStyleControls({
25528
24328
  onChangeStyle
25529
24329
  }) {
25530
24330
  const { t } = useTranslation();
25531
- const translate = React7.useCallback((key) => t(key), [t]);
24331
+ const translate = React95.useCallback((key) => t(key), [t]);
25532
24332
  return /* @__PURE__ */ jsxs(Fragment, { children: [
25533
24333
  /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1 text-[11px]", children: [
25534
24334
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t("pptx.smartart.colorScheme") }),
@@ -25583,9 +24383,9 @@ function SmartArtPropertiesPanel({
25583
24383
  const nodes = smartArtData.nodes ?? [];
25584
24384
  const layout = smartArtData.resolvedLayoutType;
25585
24385
  const topLevelCount = nodes.filter((n) => !n.parentId).length;
25586
- const inputRefs = React7.useRef(/* @__PURE__ */ new Map());
25587
- const pendingFocusId = React7.useRef(null);
25588
- React7.useEffect(() => {
24386
+ const inputRefs = React95.useRef(/* @__PURE__ */ new Map());
24387
+ const pendingFocusId = React95.useRef(null);
24388
+ React95.useEffect(() => {
25589
24389
  const id = pendingFocusId.current;
25590
24390
  if (id) {
25591
24391
  inputRefs.current.get(id)?.focus();
@@ -27199,7 +25999,7 @@ function CommentBody({ text, mentions, className }) {
27199
25999
  index
27200
26000
  ) : (
27201
26001
  // eslint-disable-next-line react/no-array-index-key -- segments are positional
27202
- /* @__PURE__ */ jsx(React7.Fragment, { children: segment.text }, index)
26002
+ /* @__PURE__ */ jsx(React95.Fragment, { children: segment.text }, index)
27203
26003
  )
27204
26004
  ) });
27205
26005
  }
@@ -28718,7 +27518,7 @@ function PresentationPropertiesPanel({
28718
27518
  onUpdateTagCollections
28719
27519
  }) {
28720
27520
  const { t } = useTranslation();
28721
- const handleTransitionChange = React7.useCallback(
27521
+ const handleTransitionChange = React95.useCallback(
28722
27522
  (updates) => {
28723
27523
  onUpdateSlide({
28724
27524
  transition: mergeSlideTransition(activeSlide?.transition, updates)
@@ -32637,7 +31437,7 @@ function ViewerToolbarSection(props) {
32637
31437
  },
32638
31438
  [activeSlide, propertyHandlers]
32639
31439
  );
32640
- const scopedLayoutOptions = React7.useMemo(
31440
+ const scopedLayoutOptions = React95.useMemo(
32641
31441
  () => scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
32642
31442
  [s.layoutOptions, activeSlide]
32643
31443
  );
@@ -34609,7 +33409,7 @@ function useTableStyleMapHandlers(input) {
34609
33409
  var AiChatPanel = lazy(async () => {
34610
33410
  const [{ useChat }, { default: Panel }] = await Promise.all([
34611
33411
  import('@ai-sdk/react'),
34612
- import('./AiChatPanel-K3PL6O3M.mjs')
33412
+ import('./AiChatPanel-Z455OA7S.mjs')
34613
33413
  ]);
34614
33414
  function BoundAiChatPanel(props) {
34615
33415
  return /* @__PURE__ */ jsx(Panel, { ...props, useChat });