pptx-angular-viewer 3.4.0 → 3.5.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.
@@ -1,5 +1,5 @@
1
1
  import * as pptx_viewer_core from 'pptx-viewer-core';
2
- import { PptxThemePreset, PptxSlide, PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxChartSeries, PptxChartLegendTextStyle, PptxChartData, PptxChartDataLabelPosition, PptxChartType, PptxElementAnimation, PptxAnimationPreset, PptxAnimationSequence, PptxAnimationTrigger, PptxAnimationTimingCurve, PptxAnimationRepeatMode, PptxAnimationDirection, PptxAfterAnimationAction, ParsedTableStyleMap, PptxThemeColorScheme, PptxThemeFontScheme, TablePptxElement, PptxSection, OlePptxElement, TextSegment, TextStyle, PptxTransitionType, PptxSlideTransition, SmartArtLayoutType, SmartArtColorScheme, PptxSmartArtChrome, PptxSmartArtDrawingShape, SmartArtStyle, PptxSmartArtData, PlaceholderDefaults, PptxEmbeddedFont, SmartArtLayout, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, ElementActionType, InkPptxElement, PptxComment, PptxChartBarDirection, MediaPptxElement, PptxTheme, PptxHandler, PptxData, PptxHeaderFooter, PptxCustomShow, PptxSlideMaster, PptxNotesMaster, PptxHandoutMaster, PptxPresentationProperties, PptxViewProperties, PptxCoreProperties, PptxAppProperties, PptxThemeOption, PptxCustomProperty, PptxTagCollection, ParsedSignature, PptxSaveFormat, PptxTableCell, PptxTableCellStyle, PptxTableRow, PptxTableData, MasterViewTab, SvgExportOptions, PptxGridSpacing, RenderedNode, RenderedCircleNode, RenderedPolygonNode, RenderedRectNode, SmartArtLayoutResult, Model3DPptxElement, ZoomPptxElement, ChartPptxElement, SmartArtPptxElement, PptxAnimationTimelineAnchor, MaterialPresetType, Text3DStyle, BevelPresetType, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartMarker, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, PptxTextStyleLevels, SignatureStatus, ElementAction, PptxImageEffects, MediaBookmark, ColorMapAliasKey, ChartAxisEdit, ChartDataPointLabelEdit, PptxChartLegendPosition, PptxChartStyle, ChartAxisTitleStyleEdit, PptxChartMarkerSymbol, ChartGridlineStyleEdit, PptxSmartArtNode, PptxSmartArtNodeStyle, PptxLayoutPreview, MediaCaptionTrack, PptxMediaType } from 'pptx-viewer-core';
2
+ import { PptxThemePreset, PptxSlide, PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxChartSeries, PptxChartLegendTextStyle, PptxChartData, PptxChartDataLabelPosition, PptxChartType, PptxElementAnimation, PptxAnimationPreset, PptxAnimationSequence, PptxAnimationTrigger, PptxAnimationTimingCurve, PptxAnimationRepeatMode, PptxAnimationDirection, PptxAfterAnimationAction, ParsedTableStyleMap, PptxThemeColorScheme, PptxThemeFontScheme, TablePptxElement, PptxSection, OlePptxElement, TextSegment, TextStyle, PptxTransitionType, PptxSlideTransition, SmartArtLayoutType, SmartArtColorScheme, PptxSmartArtChrome, PptxSmartArtDrawingShape, SmartArtStyle, PptxSmartArtData, PlaceholderDefaults, PptxEmbeddedFont, SmartArtLayout, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, ElementActionType, InkPptxElement, PptxComment, PptxChartBarDirection, MasterViewTab, MediaPptxElement, PptxTheme, PptxHandler, PptxData, PptxModernCommentAuthor, PptxCommentMention, PptxHeaderFooter, PptxCustomShow, PptxSlideMaster, PptxNotesMaster, PptxHandoutMaster, PptxPresentationProperties, PptxViewProperties, PptxCoreProperties, PptxAppProperties, PptxThemeOption, PptxCustomProperty, PptxTagCollection, ParsedSignature, PptxSaveFormat, PptxTableCell, PptxTableCellStyle, PptxTableRow, PptxTableData, SvgExportOptions, PptxGridSpacing, RenderedNode, RenderedCircleNode, RenderedPolygonNode, RenderedRectNode, SmartArtLayoutResult, Model3DPptxElement, ZoomPptxElement, ChartPptxElement, SmartArtPptxElement, PptxAnimationTimelineAnchor, MaterialPresetType, Text3DStyle, BevelPresetType, PptxBar3DShape, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartMarker, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, PptxTextStyleLevels, SignatureStatus, ElementAction, PptxImageEffects, MediaBookmark, ColorMapAliasKey, ChartAxisEdit, ChartDataPointLabelEdit, PptxChartLegendPosition, PptxChartStyle, ChartAxisTitleStyleEdit, PptxChartMarkerSymbol, ChartGridlineStyleEdit, PptxSmartArtNode, PptxSmartArtNodeStyle, PptxLayoutPreview, MediaCaptionTrack, PptxMediaType } from 'pptx-viewer-core';
3
3
  export { GroupResult, SWITCHABLE_LAYOUT_TYPES, UngroupResult, addSmartArtNode, addSmartArtNodeAsChild, chartDataChangeType, chartDataUpdatePoint, demoteSmartArtNode, formatAutoNumberMarker as formatAutoNumber, groupElements, promoteSmartArtNode, removeSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, ungroupElements, updateSmartArtNodeText } from 'pptx-viewer-core';
4
4
  import * as _angular_core from '@angular/core';
5
5
  import { Signal, WritableSignal, OnDestroy, OnInit, AfterViewInit, OnChanges, SimpleChanges, InjectionToken, Provider } from '@angular/core';
@@ -4469,7 +4469,7 @@ interface SlideTransitionAnimations {
4469
4469
  * faithful Office 2010 (`p14`) keyframes, so both the classic and exotic / 3-D
4470
4470
  * transitions animate wherever this single string is injected.
4471
4471
  */
4472
- declare const SLIDE_TRANSITION_KEYFRAMES = "\n/* \u2500\u2500 Fade \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fade-in {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n@keyframes pptx-tr-fade-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; }\n}\n\n/* \u2500\u2500 Push \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-push-in-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-push-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-push-in-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-push-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-push-in-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-push-out-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-push-in-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-push-out-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n\n/* \u2500\u2500 Cover (incoming slides over stationary outgoing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-cover-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-cover-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-cover-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-cover-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-cover-from-lu {\n\tfrom { transform: translate(-100%, -100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-ld {\n\tfrom { transform: translate(-100%, 100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-ru {\n\tfrom { transform: translate(100%, -100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-rd {\n\tfrom { transform: translate(100%, 100%); }\n\tto { transform: translate(0, 0); }\n}\n\n/* \u2500\u2500 Uncover (outgoing slides away revealing stationary incoming) \u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-uncover-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-uncover-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-uncover-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-uncover-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n@keyframes pptx-tr-uncover-to-lu {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(-100%, -100%); }\n}\n@keyframes pptx-tr-uncover-to-ld {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(-100%, 100%); }\n}\n@keyframes pptx-tr-uncover-to-ru {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(100%, -100%); }\n}\n@keyframes pptx-tr-uncover-to-rd {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(100%, 100%); }\n}\n\n/* \u2500\u2500 Wipe (clip-path reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wipe-from-left {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-right {\n\tfrom { clip-path: inset(0 0 0 100%); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-top {\n\tfrom { clip-path: inset(0 0 100% 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-bottom {\n\tfrom { clip-path: inset(100% 0 0 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n\n/* \u2500\u2500 Split \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-split-h-out {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-split-v-out {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-split-h-in {\n\tfrom { clip-path: inset(0 0); }\n\tto { clip-path: inset(0 50%); }\n}\n@keyframes pptx-tr-split-v-in {\n\tfrom { clip-path: inset(0 0); }\n\tto { clip-path: inset(50% 0); }\n}\n\n/* \u2500\u2500 Dissolve \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-dissolve-in {\n\tfrom { opacity: 0; filter: blur(4px); }\n\tto { opacity: 1; filter: blur(0px); }\n}\n\n/* \u2500\u2500 Circle / Diamond / Plus (clip-path shapes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-circle-in {\n\tfrom { clip-path: circle(0% at 50% 50%); }\n\tto { clip-path: circle(75% at 50% 50%); }\n}\n@keyframes pptx-tr-diamond-in {\n\tfrom { clip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%); }\n\tto { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); }\n}\n@keyframes pptx-tr-plus-in {\n\tfrom {\n\t\tclip-path: polygon(\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%,\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%,\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%\n\t\t);\n\t}\n\tto {\n\t\tclip-path: polygon(\n\t\t\t33% 0%, 66% 0%, 66% 33%, 100% 33%,\n\t\t\t100% 66%, 66% 66%, 66% 100%, 33% 100%,\n\t\t\t33% 66%, 0% 66%, 0% 33%, 33% 33%\n\t\t);\n\t}\n}\n\n/* \u2500\u2500 Wedge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wedge-in {\n\tfrom { clip-path: polygon(50% 0%, 50% 0%, 50% 0%); }\n\tto { clip-path: polygon(50% 0%, 100% 100%, 0% 100%); }\n}\n\n/* \u2500\u2500 Zoom \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-zoom-in {\n\tfrom { transform: scale(0); opacity: 0; }\n\tto { transform: scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-zoom-out {\n\tfrom { transform: scale(1); opacity: 1; }\n\tto { transform: scale(2); opacity: 0; }\n}\n\n/* \u2500\u2500 Blinds \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-blinds-h {\n\tfrom { clip-path: inset(0 0 100% 0); }\n\tto { clip-path: inset(0); }\n}\n@keyframes pptx-tr-blinds-v {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Checker (approximate with dissolve + contrast) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-checker-in {\n\tfrom { opacity: 0; filter: contrast(2) blur(2px); }\n\tto { opacity: 1; filter: contrast(1) blur(0); }\n}\n\n/* \u2500\u2500 Comb \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-comb-h {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0); }\n}\n@keyframes pptx-tr-comb-v {\n\tfrom { clip-path: inset(100% 0 0 0); }\n\tto { clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Strips (diagonal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-strips-lu {\n\tfrom { clip-path: polygon(0% 0%, 0% 0%, 0% 0%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-ld {\n\tfrom { clip-path: polygon(0% 100%, 0% 100%, 0% 100%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-ru {\n\tfrom { clip-path: polygon(100% 0%, 100% 0%, 100% 0%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-rd {\n\tfrom { clip-path: polygon(100% 100%, 100% 100%, 100% 100%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n\n/* \u2500\u2500 RandomBar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-randombar-h {\n\tfrom { opacity: 0; clip-path: inset(0 0 100% 0); }\n\tto { opacity: 1; clip-path: inset(0); }\n}\n@keyframes pptx-tr-randombar-v {\n\tfrom { opacity: 0; clip-path: inset(0 100% 0 0); }\n\tto { opacity: 1; clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Newsflash \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-newsflash-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n\n/* \u2500\u2500 Wheel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wheel-in {\n\tfrom { clip-path: circle(0% at 50% 50%); transform: rotate(-180deg); }\n\tto { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }\n}\n\n\n/* \u2500\u2500 Conveyor (translate X with staggered timing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-conveyor-in-from-right {\n\tfrom { transform: translateX(100%) rotateY(-30deg); }\n\t60% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-left {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(-100%) rotateY(30deg); }\n}\n@keyframes pptx-tr-conveyor-in-from-left {\n\tfrom { transform: translateX(-100%) rotateY(30deg); }\n\t60% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-right {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(100%) rotateY(-30deg); }\n}\n\n/* \u2500\u2500 Doors (clip-path from center split) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-doors-horz {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-doors-vert {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n\n/* \u2500\u2500 Ferris (rotate elements around center) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-ferris-in-from-right {\n\tfrom { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-left {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n}\n@keyframes pptx-tr-ferris-in-from-left {\n\tfrom { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-right {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n}\n\n/* \u2500\u2500 Flash (bright flash opacity burst) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-flash-white {\n\t0% { opacity: 1; }\n\t30% { opacity: 0; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n@keyframes pptx-tr-flash-in {\n\t0% { opacity: 0; }\n\t50% { opacity: 0; }\n\t70% { opacity: 1; }\n\t100% { opacity: 1; }\n}\n\n/* \u2500\u2500 Flythrough (scale + translate Z-axis feel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-flythrough-in {\n\tfrom { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n}\n@keyframes pptx-tr-flythrough-reverse-in {\n\tfrom { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-reverse-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n}\n\n/* \u2500\u2500 Gallery (translate with perspective) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-gallery-in-from-right {\n\tfrom { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-left {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n}\n@keyframes pptx-tr-gallery-in-from-left {\n\tfrom { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-right {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n}\n\n/* \u2500\u2500 Glitter (particle dissolve effect) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-glitter-in {\n\tfrom { opacity: 0; filter: brightness(1.5) contrast(1.3) blur(2px); }\n\t60% { opacity: 0.7; filter: brightness(1.2) contrast(1.1) blur(1px); }\n\tto { opacity: 1; filter: brightness(1) contrast(1) blur(0); }\n}\n\n/* \u2500\u2500 Honeycomb (hexagonal reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-honeycomb-in {\n\tfrom {\n\t\tclip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%);\n\t\topacity: 0;\n\t}\n\tto {\n\t\tclip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);\n\t\topacity: 1;\n\t}\n}\n@keyframes pptx-tr-honeycomb-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* \u2500\u2500 Pan (large-scale translate) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-pan-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-pan-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-pan-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-pan-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n\n\n/* \u2500\u2500 Prism (3D rotation via perspective transform) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-prism-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-bottom {\n\tfrom { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-top {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-top {\n\tfrom { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-bottom {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n}\n\n/* \u2500\u2500 Reveal (slide away reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-reveal-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-reveal-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-reveal-in {\n\tfrom { opacity: 0.5; }\n\tto { opacity: 1; }\n}\n\n/* \u2500\u2500 Ripple (expanding ring clip-path) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-ripple-in {\n\tfrom { clip-path: circle(0% at 50% 50%); opacity: 0.5; }\n\t30% { clip-path: circle(20% at 50% 50%); opacity: 0.7; }\n\t60% { clip-path: circle(50% at 50% 50%); opacity: 0.9; }\n\tto { clip-path: circle(75% at 50% 50%); opacity: 1; }\n}\n\n/* \u2500\u2500 Shred (fragmented clip-path pieces) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-shred-strips-in {\n\tfrom { clip-path: inset(0 100% 0 0); opacity: 0; }\n\t30% { clip-path: inset(0 60% 0 0); opacity: 0.5; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-rectangles-in {\n\tfrom { clip-path: inset(50%); opacity: 0; }\n\t40% { clip-path: inset(20%); opacity: 0.6; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* \u2500\u2500 Switch (flip/rotate swap) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-switch-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n}\n@keyframes pptx-tr-switch-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n}\n\n/* \u2500\u2500 Vortex (rotate + scale spiral) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-vortex-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-vortex-out {\n\tfrom { transform: rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: rotate(-720deg) scale(0); opacity: 0; }\n}\n\n/* \u2500\u2500 Warp (skew distortion) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-warp-in {\n\tfrom { transform: scale(0.3) skewX(30deg) skewY(15deg); opacity: 0; }\n\t50% { transform: scale(0.8) skewX(-5deg) skewY(-3deg); opacity: 0.7; }\n\tto { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-warp-out {\n\tfrom { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; }\n\t50% { transform: scale(0.8) skewX(5deg) skewY(3deg); opacity: 0.7; }\n\tto { transform: scale(0.3) skewX(-30deg) skewY(-15deg); opacity: 0; }\n}\n@keyframes pptx-tr-warp-reverse-in {\n\tfrom { transform: scale(3) skewX(-20deg) skewY(-10deg); opacity: 0; filter: blur(4px); }\n\tto { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-warp-reverse-out {\n\tfrom { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; filter: blur(0); }\n\tto { transform: scale(3) skewX(20deg) skewY(10deg); opacity: 0; filter: blur(4px); }\n}\n\n/* \u2500\u2500 WheelReverse (reverse wheel rotation) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wheel-reverse-in {\n\tfrom { clip-path: circle(0% at 50% 50%); transform: rotate(180deg); }\n\tto { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }\n}\n\n/* \u2500\u2500 Window (scale from center with border) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-window-horz {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-vert {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-out {\n\tfrom { opacity: 1; transform: scale(1); }\n\tto { opacity: 0; transform: scale(0.9); }\n}\n\n\n/* \u2500\u2500 Cube (rotate off one edge onto the next face) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-cube-out-left { from { transform: perspective(1400px) translateX(0) rotateY(0deg); } to { transform: perspective(1400px) translateX(-50%) rotateY(-90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-left { from { transform: perspective(1400px) translateX(50%) rotateY(90deg); opacity: .5; } to { transform: perspective(1400px) translateX(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-cube-out-right { from { transform: perspective(1400px) translateX(0) rotateY(0deg); } to { transform: perspective(1400px) translateX(50%) rotateY(90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-right { from { transform: perspective(1400px) translateX(-50%) rotateY(-90deg); opacity: .5; } to { transform: perspective(1400px) translateX(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-cube-out-up { from { transform: perspective(1400px) translateY(0) rotateX(0deg); } to { transform: perspective(1400px) translateY(-50%) rotateX(90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-up { from { transform: perspective(1400px) translateY(50%) rotateX(-90deg); opacity: .5; } to { transform: perspective(1400px) translateY(0) rotateX(0deg); opacity: 1; } }\n@keyframes pptx-tr-cube-out-down { from { transform: perspective(1400px) translateY(0) rotateX(0deg); } to { transform: perspective(1400px) translateY(50%) rotateX(-90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-down { from { transform: perspective(1400px) translateY(-50%) rotateX(90deg); opacity: .5; } to { transform: perspective(1400px) translateY(0) rotateX(0deg); opacity: 1; } }\n\n/* \u2500\u2500 Orbit (swing the faces through depth) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-orbit-out-left { from { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateY(-105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-left { from { transform: perspective(1600px) translateZ(-700px) rotateY(105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-orbit-out-right { from { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateY(105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-right { from { transform: perspective(1600px) translateZ(-700px) rotateY(-105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-orbit-out-up { from { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateX(105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-up { from { transform: perspective(1600px) translateZ(-700px) rotateX(-105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } }\n@keyframes pptx-tr-orbit-out-down { from { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateX(-105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-down { from { transform: perspective(1600px) translateZ(-700px) rotateX(105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } }\n\n/* \u2500\u2500 Flip (card flip; opacity hides the back face) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-flip-out-left { from { transform: perspective(1400px) rotateY(0deg); opacity: 1; } to { transform: perspective(1400px) rotateY(90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-left { from { transform: perspective(1400px) rotateY(-90deg); opacity: 0; } to { transform: perspective(1400px) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-flip-out-right { from { transform: perspective(1400px) rotateY(0deg); opacity: 1; } to { transform: perspective(1400px) rotateY(-90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-right { from { transform: perspective(1400px) rotateY(90deg); opacity: 0; } to { transform: perspective(1400px) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-flip-out-up { from { transform: perspective(1400px) rotateX(0deg); opacity: 1; } to { transform: perspective(1400px) rotateX(-90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-up { from { transform: perspective(1400px) rotateX(90deg); opacity: 0; } to { transform: perspective(1400px) rotateX(0deg); opacity: 1; } }\n@keyframes pptx-tr-flip-out-down { from { transform: perspective(1400px) rotateX(0deg); opacity: 1; } to { transform: perspective(1400px) rotateX(90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-down { from { transform: perspective(1400px) rotateX(-90deg); opacity: 0; } to { transform: perspective(1400px) rotateX(0deg); opacity: 1; } }\n\n/* \u2500\u2500 Rotate (in-plane spin + zoom) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-rotate-out-cw { from { transform: rotate(0deg) scale(1); opacity: 1; } to { transform: rotate(90deg) scale(.4); opacity: 0; } }\n@keyframes pptx-tr-rotate-in-cw { from { transform: rotate(-90deg) scale(.4); opacity: 0; } to { transform: rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-rotate-out-ccw { from { transform: rotate(0deg) scale(1); opacity: 1; } to { transform: rotate(-90deg) scale(.4); opacity: 0; } }\n@keyframes pptx-tr-rotate-in-ccw { from { transform: rotate(90deg) scale(.4); opacity: 0; } to { transform: rotate(0deg) scale(1); opacity: 1; } }\n\n/* \u2500\u2500 Fall Over (incoming board topples down over outgoing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fallover-out { from { transform: translateZ(0); opacity: 1; } to { transform: perspective(1400px) rotateX(5deg) scale(.94); opacity: .25; } }\n@keyframes pptx-tr-fallover-in { 0% { transform: perspective(1400px) rotateX(-100deg); transform-origin: top center; opacity: .4; } 70% { transform: perspective(1400px) rotateX(8deg); transform-origin: top center; opacity: 1; } 100% { transform: perspective(1400px) rotateX(0deg); transform-origin: top center; opacity: 1; } }\n\n/* \u2500\u2500 Drape (fabric draping down into place) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-drape-in { from { transform: perspective(1600px) rotateX(-55deg) scale(1.15); transform-origin: top center; opacity: 0; } to { transform: perspective(1600px) rotateX(0deg) scale(1); transform-origin: top center; opacity: 1; } }\n\n/* \u2500\u2500 Curtains (outgoing lifts to reveal incoming) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-curtains-out { from { transform: scaleY(1); transform-origin: top center; opacity: 1; } to { transform: scaleY(0); transform-origin: top center; opacity: .3; } }\n\n/* \u2500\u2500 Wind (outgoing blows away with skew + blur) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wind-out-left { from { transform: translateX(0) skewX(0deg); opacity: 1; filter: blur(0); } to { transform: translateX(-120%) skewX(25deg); opacity: 0; filter: blur(6px); } }\n@keyframes pptx-tr-wind-out-right { from { transform: translateX(0) skewX(0deg); opacity: 1; filter: blur(0); } to { transform: translateX(120%) skewX(-25deg); opacity: 0; filter: blur(6px); } }\n\n/* \u2500\u2500 Prestige (magic vanish then reappear) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-prestige-out { from { transform: scale(1) rotate(0deg); opacity: 1; filter: blur(0); } to { transform: scale(1.4) rotate(6deg); opacity: 0; filter: blur(8px); } }\n@keyframes pptx-tr-prestige-in { from { transform: scale(.6) rotate(-6deg); opacity: 0; filter: blur(8px); } to { transform: scale(1) rotate(0deg); opacity: 1; filter: blur(0); } }\n\n/* \u2500\u2500 Fracture (shatter into contrast + blur) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fracture-out { 0% { transform: scale(1); opacity: 1; filter: contrast(1) blur(0); } 55% { transform: scale(1.04) rotate(1deg); opacity: 1; filter: contrast(1.7) brightness(1.15); } 100% { transform: scale(1.15) rotate(-2deg); opacity: 0; filter: contrast(2.2) blur(4px); } }\n\n/* \u2500\u2500 Crush (squash flat, then new slide expands) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-crush-out { from { transform: scaleY(1); transform-origin: bottom; opacity: 1; } to { transform: scaleY(0); transform-origin: bottom; opacity: .2; } }\n@keyframes pptx-tr-crush-in { from { transform: scaleY(0); transform-origin: bottom; opacity: .2; } to { transform: scaleY(1); transform-origin: bottom; opacity: 1; } }\n\n/* \u2500\u2500 Peel Off (peel away from a corner) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-peeloff-out { from { transform: perspective(1400px) rotate3d(1, 1, 0, 0deg); transform-origin: top right; opacity: 1; } to { transform: perspective(1400px) rotate3d(1, 1, 0, 110deg); transform-origin: top right; opacity: .15; } }\n\n/* \u2500\u2500 Page Curl (curl off the right edge; double curls new in) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-pagecurl-out { from { transform: perspective(1600px) rotateY(0deg); transform-origin: right center; opacity: 1; } to { transform: perspective(1600px) rotateY(-155deg); transform-origin: right center; opacity: .25; } }\n@keyframes pptx-tr-pagecurl-double-in { from { transform: perspective(1600px) rotateY(155deg); transform-origin: left center; opacity: .25; } to { transform: perspective(1600px) rotateY(0deg); transform-origin: left center; opacity: 1; } }\n\n/* \u2500\u2500 Airplane (fly off like a paper plane) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-airplane-out { 0% { transform: perspective(1200px) translate3d(0, 0, 0) rotate3d(1, -1, 0, 0deg) scale(1); opacity: 1; } 40% { transform: perspective(1200px) translate3d(10%, -10%, 0) rotate3d(1, -1, 0, 25deg) scale(.85); opacity: 1; } 100% { transform: perspective(1200px) translate3d(150%, -70%, 0) rotate3d(1, -1, 1, 70deg) scale(.05); opacity: 0; } }\n\n/* \u2500\u2500 Origami (fold the sheet over its top edge; the next unfolds up) \u2500\u2500\n The old single-phase rotateY + scaleX compressed the outgoing slide into a\n narrow vertical sliver for most of the (3+ second) duration, which read as\n \"just a grey line\" instead of paper folding (issue #132). The fold is now\n hinged like a real sheet: the outgoing slide creases over its TOP edge,\n dims as it tips through edge-on, and tumbles away shrinking; the incoming\n slide lies folded at its BOTTOM edge and rises into place. The edge-on\n moment is brief and already mid-fade, so no line artifact survives. */\n@keyframes pptx-tr-origami-out { 0% { transform: perspective(1400px) rotateX(0deg) translateY(0) scale(1); transform-origin: top center; opacity: 1; filter: brightness(1); } 45% { transform: perspective(1400px) rotateX(-52deg) translateY(2%) scale(.96); transform-origin: top center; opacity: 1; filter: brightness(.82); } 70% { transform: perspective(1400px) rotateX(-84deg) translateY(8%) scale(.88); transform-origin: top center; opacity: .8; filter: brightness(.68); } 100% { transform: perspective(1400px) rotateX(-125deg) translateY(30%) scale(.68); transform-origin: top center; opacity: 0; filter: brightness(.55); } }\n@keyframes pptx-tr-origami-in { 0% { transform: perspective(1400px) rotateX(62deg) scale(.94); transform-origin: bottom center; opacity: 0; filter: brightness(.7); } 30% { transform: perspective(1400px) rotateX(62deg) scale(.94); transform-origin: bottom center; opacity: .65; filter: brightness(.75); } 100% { transform: perspective(1400px) rotateX(0deg) scale(1); transform-origin: bottom center; opacity: 1; filter: brightness(1); } }\n";
4472
+ declare const SLIDE_TRANSITION_KEYFRAMES = "\n/* \u2500\u2500 Fade \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fade-in {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n@keyframes pptx-tr-fade-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; }\n}\n\n/* \u2500\u2500 Push \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-push-in-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-push-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-push-in-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-push-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-push-in-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-push-out-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-push-in-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-push-out-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n\n/* \u2500\u2500 Cover (incoming slides over stationary outgoing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-cover-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-cover-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-cover-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-cover-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-cover-from-lu {\n\tfrom { transform: translate(-100%, -100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-ld {\n\tfrom { transform: translate(-100%, 100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-ru {\n\tfrom { transform: translate(100%, -100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-rd {\n\tfrom { transform: translate(100%, 100%); }\n\tto { transform: translate(0, 0); }\n}\n\n/* \u2500\u2500 Uncover (outgoing slides away revealing stationary incoming) \u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-uncover-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-uncover-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-uncover-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-uncover-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n@keyframes pptx-tr-uncover-to-lu {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(-100%, -100%); }\n}\n@keyframes pptx-tr-uncover-to-ld {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(-100%, 100%); }\n}\n@keyframes pptx-tr-uncover-to-ru {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(100%, -100%); }\n}\n@keyframes pptx-tr-uncover-to-rd {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(100%, 100%); }\n}\n\n/* \u2500\u2500 Split \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-split-h-out {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-split-v-out {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-split-h-in {\n\tfrom { clip-path: inset(0 0); }\n\tto { clip-path: inset(0 50%); }\n}\n@keyframes pptx-tr-split-v-in {\n\tfrom { clip-path: inset(0 0); }\n\tto { clip-path: inset(50% 0); }\n}\n\n/* \u2500\u2500 Dissolve \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-dissolve-in {\n\tfrom { opacity: 0; filter: blur(4px); }\n\tto { opacity: 1; filter: blur(0px); }\n}\n\n/* \u2500\u2500 Circle / Diamond / Plus (clip-path shapes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-circle-in {\n\tfrom { clip-path: circle(0% at 50% 50%); }\n\tto { clip-path: circle(75% at 50% 50%); }\n}\n@keyframes pptx-tr-diamond-in {\n\tfrom { clip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%); }\n\tto { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); }\n}\n@keyframes pptx-tr-plus-in {\n\tfrom {\n\t\tclip-path: polygon(\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%,\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%,\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%\n\t\t);\n\t}\n\tto {\n\t\tclip-path: polygon(\n\t\t\t33% 0%, 66% 0%, 66% 33%, 100% 33%,\n\t\t\t100% 66%, 66% 66%, 66% 100%, 33% 100%,\n\t\t\t33% 66%, 0% 66%, 0% 33%, 33% 33%\n\t\t);\n\t}\n}\n\n/* \u2500\u2500 Wedge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wedge-in {\n\tfrom { clip-path: polygon(50% 0%, 50% 0%, 50% 0%); }\n\tto { clip-path: polygon(50% 0%, 100% 100%, 0% 100%); }\n}\n\n/* \u2500\u2500 Zoom \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-zoom-in {\n\tfrom { transform: scale(0); opacity: 0; }\n\tto { transform: scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-zoom-out {\n\tfrom { transform: scale(1); opacity: 1; }\n\tto { transform: scale(2); opacity: 0; }\n}\n\n/* \u2500\u2500 Blinds \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-blinds-h {\n\tfrom { clip-path: inset(0 0 100% 0); }\n\tto { clip-path: inset(0); }\n}\n@keyframes pptx-tr-blinds-v {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Checker (approximate with dissolve + contrast) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-checker-in {\n\tfrom { opacity: 0; filter: contrast(2) blur(2px); }\n\tto { opacity: 1; filter: contrast(1) blur(0); }\n}\n\n/* \u2500\u2500 Comb \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-comb-h {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0); }\n}\n@keyframes pptx-tr-comb-v {\n\tfrom { clip-path: inset(100% 0 0 0); }\n\tto { clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Strips (diagonal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-strips-lu {\n\tfrom { clip-path: polygon(0% 0%, 0% 0%, 0% 0%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-ld {\n\tfrom { clip-path: polygon(0% 100%, 0% 100%, 0% 100%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-ru {\n\tfrom { clip-path: polygon(100% 0%, 100% 0%, 100% 0%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-rd {\n\tfrom { clip-path: polygon(100% 100%, 100% 100%, 100% 100%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n\n/* \u2500\u2500 RandomBar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-randombar-h {\n\tfrom { opacity: 0; clip-path: inset(0 0 100% 0); }\n\tto { opacity: 1; clip-path: inset(0); }\n}\n@keyframes pptx-tr-randombar-v {\n\tfrom { opacity: 0; clip-path: inset(0 100% 0 0); }\n\tto { opacity: 1; clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Newsflash \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-newsflash-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n\n/* \u2500\u2500 Wheel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wheel-in {\n\tfrom { clip-path: circle(0% at 50% 50%); transform: rotate(-180deg); }\n\tto { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }\n}\n\n\n/* \u2500\u2500 Wipe (soft mask reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/* PowerPoint feathers the wipe edge with a WIDE, smooth gradient - the fade\n * zone spans roughly a slide width in real renders, not a narrow band. The\n * incoming layer is masked with a 3x-oversized gradient (fade zone = one slide\n * width) whose position sweeps it across the slide; the band fully exits both\n * edges, so the start is fully hidden and the end fully opaque. */\n@keyframes pptx-tr-wipe-from-left {\n\tfrom {\n\t\t-webkit-mask-image: linear-gradient(to right, #000 33.3%, transparent 66.7%);\n\t\t-webkit-mask-size: 300% 100%;\n\t\t-webkit-mask-repeat: no-repeat;\n\t\t-webkit-mask-position: 100% 0;\n\t\tmask-image: linear-gradient(to right, #000 33.3%, transparent 66.7%);\n\t\tmask-size: 300% 100%;\n\t\tmask-repeat: no-repeat;\n\t\tmask-position: 100% 0;\n\t}\n\tto {\n\t\t-webkit-mask-image: linear-gradient(to right, #000 33.3%, transparent 66.7%);\n\t\t-webkit-mask-size: 300% 100%;\n\t\t-webkit-mask-repeat: no-repeat;\n\t\t-webkit-mask-position: 0% 0;\n\t\tmask-image: linear-gradient(to right, #000 33.3%, transparent 66.7%);\n\t\tmask-size: 300% 100%;\n\t\tmask-repeat: no-repeat;\n\t\tmask-position: 0% 0;\n\t}\n}\n@keyframes pptx-tr-wipe-from-right {\n\tfrom {\n\t\t-webkit-mask-image: linear-gradient(to left, #000 33.3%, transparent 66.7%);\n\t\t-webkit-mask-size: 300% 100%;\n\t\t-webkit-mask-repeat: no-repeat;\n\t\t-webkit-mask-position: 0% 0;\n\t\tmask-image: linear-gradient(to left, #000 33.3%, transparent 66.7%);\n\t\tmask-size: 300% 100%;\n\t\tmask-repeat: no-repeat;\n\t\tmask-position: 0% 0;\n\t}\n\tto {\n\t\t-webkit-mask-image: linear-gradient(to left, #000 33.3%, transparent 66.7%);\n\t\t-webkit-mask-size: 300% 100%;\n\t\t-webkit-mask-repeat: no-repeat;\n\t\t-webkit-mask-position: 100% 0;\n\t\tmask-image: linear-gradient(to left, #000 33.3%, transparent 66.7%);\n\t\tmask-size: 300% 100%;\n\t\tmask-repeat: no-repeat;\n\t\tmask-position: 100% 0;\n\t}\n}\n@keyframes pptx-tr-wipe-from-top {\n\tfrom {\n\t\t-webkit-mask-image: linear-gradient(to bottom, #000 33.3%, transparent 66.7%);\n\t\t-webkit-mask-size: 100% 300%;\n\t\t-webkit-mask-repeat: no-repeat;\n\t\t-webkit-mask-position: 0 100%;\n\t\tmask-image: linear-gradient(to bottom, #000 33.3%, transparent 66.7%);\n\t\tmask-size: 100% 300%;\n\t\tmask-repeat: no-repeat;\n\t\tmask-position: 0 100%;\n\t}\n\tto {\n\t\t-webkit-mask-image: linear-gradient(to bottom, #000 33.3%, transparent 66.7%);\n\t\t-webkit-mask-size: 100% 300%;\n\t\t-webkit-mask-repeat: no-repeat;\n\t\t-webkit-mask-position: 0 0%;\n\t\tmask-image: linear-gradient(to bottom, #000 33.3%, transparent 66.7%);\n\t\tmask-size: 100% 300%;\n\t\tmask-repeat: no-repeat;\n\t\tmask-position: 0 0%;\n\t}\n}\n@keyframes pptx-tr-wipe-from-bottom {\n\tfrom {\n\t\t-webkit-mask-image: linear-gradient(to top, #000 33.3%, transparent 66.7%);\n\t\t-webkit-mask-size: 100% 300%;\n\t\t-webkit-mask-repeat: no-repeat;\n\t\t-webkit-mask-position: 0 0%;\n\t\tmask-image: linear-gradient(to top, #000 33.3%, transparent 66.7%);\n\t\tmask-size: 100% 300%;\n\t\tmask-repeat: no-repeat;\n\t\tmask-position: 0 0%;\n\t}\n\tto {\n\t\t-webkit-mask-image: linear-gradient(to top, #000 33.3%, transparent 66.7%);\n\t\t-webkit-mask-size: 100% 300%;\n\t\t-webkit-mask-repeat: no-repeat;\n\t\t-webkit-mask-position: 0 100%;\n\t\tmask-image: linear-gradient(to top, #000 33.3%, transparent 66.7%);\n\t\tmask-size: 100% 300%;\n\t\tmask-repeat: no-repeat;\n\t\tmask-position: 0 100%;\n\t}\n}\n\n\n/* \u2500\u2500 Conveyor (translate X with staggered timing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-conveyor-in-from-right {\n\tfrom { transform: translateX(100%) rotateY(-30deg); }\n\t60% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-left {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(-100%) rotateY(30deg); }\n}\n@keyframes pptx-tr-conveyor-in-from-left {\n\tfrom { transform: translateX(-100%) rotateY(30deg); }\n\t60% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-right {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(100%) rotateY(-30deg); }\n}\n\n/* \u2500\u2500 Doors (clip-path from center split) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-doors-horz {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-doors-vert {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n\n/* \u2500\u2500 Ferris (rotate elements around center) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-ferris-in-from-right {\n\tfrom { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-left {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n}\n@keyframes pptx-tr-ferris-in-from-left {\n\tfrom { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-right {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n}\n\n/* \u2500\u2500 Flash (bright flash opacity burst) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-flash-white {\n\t0% { opacity: 1; }\n\t30% { opacity: 0; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n@keyframes pptx-tr-flash-in {\n\t0% { opacity: 0; }\n\t50% { opacity: 0; }\n\t70% { opacity: 1; }\n\t100% { opacity: 1; }\n}\n\n/* \u2500\u2500 Flythrough (scale + translate Z-axis feel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-flythrough-in {\n\tfrom { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n}\n@keyframes pptx-tr-flythrough-reverse-in {\n\tfrom { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-reverse-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n}\n\n/* \u2500\u2500 Gallery (translate with perspective) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-gallery-in-from-right {\n\tfrom { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-left {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n}\n@keyframes pptx-tr-gallery-in-from-left {\n\tfrom { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-right {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n}\n\n/* \u2500\u2500 Glitter (particle dissolve effect) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-glitter-in {\n\tfrom { opacity: 0; filter: brightness(1.5) contrast(1.3) blur(2px); }\n\t60% { opacity: 0.7; filter: brightness(1.2) contrast(1.1) blur(1px); }\n\tto { opacity: 1; filter: brightness(1) contrast(1) blur(0); }\n}\n\n/* \u2500\u2500 Honeycomb (hexagonal reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-honeycomb-in {\n\tfrom {\n\t\tclip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%);\n\t\topacity: 0;\n\t}\n\tto {\n\t\tclip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);\n\t\topacity: 1;\n\t}\n}\n@keyframes pptx-tr-honeycomb-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* \u2500\u2500 Pan (large-scale translate) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-pan-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-pan-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-pan-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-pan-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n\n\n/* \u2500\u2500 Prism (3D rotation via perspective transform) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-prism-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-bottom {\n\tfrom { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-top {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-top {\n\tfrom { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-bottom {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n}\n\n/* \u2500\u2500 Reveal (slide away reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-reveal-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-reveal-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-reveal-in {\n\tfrom { opacity: 0.5; }\n\tto { opacity: 1; }\n}\n\n/* \u2500\u2500 Ripple (expanding ring clip-path) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-ripple-in {\n\tfrom { clip-path: circle(0% at 50% 50%); opacity: 0.5; }\n\t30% { clip-path: circle(20% at 50% 50%); opacity: 0.7; }\n\t60% { clip-path: circle(50% at 50% 50%); opacity: 0.9; }\n\tto { clip-path: circle(75% at 50% 50%); opacity: 1; }\n}\n\n/* \u2500\u2500 Shred (fragmented clip-path pieces) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-shred-strips-in {\n\tfrom { clip-path: inset(0 100% 0 0); opacity: 0; }\n\t30% { clip-path: inset(0 60% 0 0); opacity: 0.5; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-rectangles-in {\n\tfrom { clip-path: inset(50%); opacity: 0; }\n\t40% { clip-path: inset(20%); opacity: 0.6; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* \u2500\u2500 Switch (flip/rotate swap) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-switch-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n}\n@keyframes pptx-tr-switch-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n}\n\n/* \u2500\u2500 Vortex (rotate + scale spiral) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-vortex-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-vortex-out {\n\tfrom { transform: rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: rotate(-720deg) scale(0); opacity: 0; }\n}\n\n/* \u2500\u2500 Warp (skew distortion) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-warp-in {\n\tfrom { transform: scale(0.3) skewX(30deg) skewY(15deg); opacity: 0; }\n\t50% { transform: scale(0.8) skewX(-5deg) skewY(-3deg); opacity: 0.7; }\n\tto { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-warp-out {\n\tfrom { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; }\n\t50% { transform: scale(0.8) skewX(5deg) skewY(3deg); opacity: 0.7; }\n\tto { transform: scale(0.3) skewX(-30deg) skewY(-15deg); opacity: 0; }\n}\n@keyframes pptx-tr-warp-reverse-in {\n\tfrom { transform: scale(3) skewX(-20deg) skewY(-10deg); opacity: 0; filter: blur(4px); }\n\tto { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-warp-reverse-out {\n\tfrom { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; filter: blur(0); }\n\tto { transform: scale(3) skewX(20deg) skewY(10deg); opacity: 0; filter: blur(4px); }\n}\n\n/* \u2500\u2500 WheelReverse (reverse wheel rotation) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wheel-reverse-in {\n\tfrom { clip-path: circle(0% at 50% 50%); transform: rotate(180deg); }\n\tto { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }\n}\n\n/* \u2500\u2500 Window (scale from center with border) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-window-horz {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-vert {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-out {\n\tfrom { opacity: 1; transform: scale(1); }\n\tto { opacity: 0; transform: scale(0.9); }\n}\n\n\n/* \u2500\u2500 Cube (rotate off one edge onto the next face) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-cube-out-left { from { transform: perspective(1400px) translateX(0) rotateY(0deg); } to { transform: perspective(1400px) translateX(-50%) rotateY(-90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-left { from { transform: perspective(1400px) translateX(50%) rotateY(90deg); opacity: .5; } to { transform: perspective(1400px) translateX(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-cube-out-right { from { transform: perspective(1400px) translateX(0) rotateY(0deg); } to { transform: perspective(1400px) translateX(50%) rotateY(90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-right { from { transform: perspective(1400px) translateX(-50%) rotateY(-90deg); opacity: .5; } to { transform: perspective(1400px) translateX(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-cube-out-up { from { transform: perspective(1400px) translateY(0) rotateX(0deg); } to { transform: perspective(1400px) translateY(-50%) rotateX(90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-up { from { transform: perspective(1400px) translateY(50%) rotateX(-90deg); opacity: .5; } to { transform: perspective(1400px) translateY(0) rotateX(0deg); opacity: 1; } }\n@keyframes pptx-tr-cube-out-down { from { transform: perspective(1400px) translateY(0) rotateX(0deg); } to { transform: perspective(1400px) translateY(50%) rotateX(-90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-down { from { transform: perspective(1400px) translateY(-50%) rotateX(90deg); opacity: .5; } to { transform: perspective(1400px) translateY(0) rotateX(0deg); opacity: 1; } }\n\n/* \u2500\u2500 Orbit (swing the faces through depth) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-orbit-out-left { from { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateY(-105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-left { from { transform: perspective(1600px) translateZ(-700px) rotateY(105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-orbit-out-right { from { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateY(105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-right { from { transform: perspective(1600px) translateZ(-700px) rotateY(-105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-orbit-out-up { from { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateX(105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-up { from { transform: perspective(1600px) translateZ(-700px) rotateX(-105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } }\n@keyframes pptx-tr-orbit-out-down { from { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateX(-105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-down { from { transform: perspective(1600px) translateZ(-700px) rotateX(105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } }\n\n/* \u2500\u2500 Flip (card flip; opacity hides the back face) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-flip-out-left { from { transform: perspective(1400px) rotateY(0deg); opacity: 1; } to { transform: perspective(1400px) rotateY(90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-left { from { transform: perspective(1400px) rotateY(-90deg); opacity: 0; } to { transform: perspective(1400px) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-flip-out-right { from { transform: perspective(1400px) rotateY(0deg); opacity: 1; } to { transform: perspective(1400px) rotateY(-90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-right { from { transform: perspective(1400px) rotateY(90deg); opacity: 0; } to { transform: perspective(1400px) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-flip-out-up { from { transform: perspective(1400px) rotateX(0deg); opacity: 1; } to { transform: perspective(1400px) rotateX(-90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-up { from { transform: perspective(1400px) rotateX(90deg); opacity: 0; } to { transform: perspective(1400px) rotateX(0deg); opacity: 1; } }\n@keyframes pptx-tr-flip-out-down { from { transform: perspective(1400px) rotateX(0deg); opacity: 1; } to { transform: perspective(1400px) rotateX(90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-down { from { transform: perspective(1400px) rotateX(-90deg); opacity: 0; } to { transform: perspective(1400px) rotateX(0deg); opacity: 1; } }\n\n/* \u2500\u2500 Rotate (in-plane spin + zoom) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-rotate-out-cw { from { transform: rotate(0deg) scale(1); opacity: 1; } to { transform: rotate(90deg) scale(.4); opacity: 0; } }\n@keyframes pptx-tr-rotate-in-cw { from { transform: rotate(-90deg) scale(.4); opacity: 0; } to { transform: rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-rotate-out-ccw { from { transform: rotate(0deg) scale(1); opacity: 1; } to { transform: rotate(-90deg) scale(.4); opacity: 0; } }\n@keyframes pptx-tr-rotate-in-ccw { from { transform: rotate(90deg) scale(.4); opacity: 0; } to { transform: rotate(0deg) scale(1); opacity: 1; } }\n\n/* \u2500\u2500 Fall Over (incoming board topples down over outgoing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fallover-out { from { transform: translateZ(0); opacity: 1; } to { transform: perspective(1400px) rotateX(5deg) scale(.94); opacity: .25; } }\n@keyframes pptx-tr-fallover-in { 0% { transform: perspective(1400px) rotateX(-100deg); transform-origin: top center; opacity: .4; } 70% { transform: perspective(1400px) rotateX(8deg); transform-origin: top center; opacity: 1; } 100% { transform: perspective(1400px) rotateX(0deg); transform-origin: top center; opacity: 1; } }\n\n/* \u2500\u2500 Drape (fabric draping down into place) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-drape-in { from { transform: perspective(1600px) rotateX(-55deg) scale(1.15); transform-origin: top center; opacity: 0; } to { transform: perspective(1600px) rotateX(0deg) scale(1); transform-origin: top center; opacity: 1; } }\n\n/* \u2500\u2500 Curtains (outgoing lifts to reveal incoming) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-curtains-out { from { transform: scaleY(1); transform-origin: top center; opacity: 1; } to { transform: scaleY(0); transform-origin: top center; opacity: .3; } }\n\n/* \u2500\u2500 Wind (outgoing blows away with skew + blur) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wind-out-left { from { transform: translateX(0) skewX(0deg); opacity: 1; filter: blur(0); } to { transform: translateX(-120%) skewX(25deg); opacity: 0; filter: blur(6px); } }\n@keyframes pptx-tr-wind-out-right { from { transform: translateX(0) skewX(0deg); opacity: 1; filter: blur(0); } to { transform: translateX(120%) skewX(-25deg); opacity: 0; filter: blur(6px); } }\n\n/* \u2500\u2500 Prestige (magic vanish then reappear) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-prestige-out { from { transform: scale(1) rotate(0deg); opacity: 1; filter: blur(0); } to { transform: scale(1.4) rotate(6deg); opacity: 0; filter: blur(8px); } }\n@keyframes pptx-tr-prestige-in { from { transform: scale(.6) rotate(-6deg); opacity: 0; filter: blur(8px); } to { transform: scale(1) rotate(0deg); opacity: 1; filter: blur(0); } }\n\n/* \u2500\u2500 Fracture (shatter into contrast + blur) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fracture-out { 0% { transform: scale(1); opacity: 1; filter: contrast(1) blur(0); } 55% { transform: scale(1.04) rotate(1deg); opacity: 1; filter: contrast(1.7) brightness(1.15); } 100% { transform: scale(1.15) rotate(-2deg); opacity: 0; filter: contrast(2.2) blur(4px); } }\n\n/* \u2500\u2500 Crush (squash flat, then new slide expands) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-crush-out { from { transform: scaleY(1); transform-origin: bottom; opacity: 1; } to { transform: scaleY(0); transform-origin: bottom; opacity: .2; } }\n@keyframes pptx-tr-crush-in { from { transform: scaleY(0); transform-origin: bottom; opacity: .2; } to { transform: scaleY(1); transform-origin: bottom; opacity: 1; } }\n\n/* \u2500\u2500 Peel Off (peel away from a corner) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-peeloff-out { from { transform: perspective(1400px) rotate3d(1, 1, 0, 0deg); transform-origin: top right; opacity: 1; } to { transform: perspective(1400px) rotate3d(1, 1, 0, 110deg); transform-origin: top right; opacity: .15; } }\n\n/* \u2500\u2500 Page Curl (curl off the right edge; double curls new in) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-pagecurl-out { from { transform: perspective(1600px) rotateY(0deg); transform-origin: right center; opacity: 1; } to { transform: perspective(1600px) rotateY(-155deg); transform-origin: right center; opacity: .25; } }\n@keyframes pptx-tr-pagecurl-double-in { from { transform: perspective(1600px) rotateY(155deg); transform-origin: left center; opacity: .25; } to { transform: perspective(1600px) rotateY(0deg); transform-origin: left center; opacity: 1; } }\n\n/* \u2500\u2500 Airplane (fly off like a paper plane) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-airplane-out { 0% { transform: perspective(1200px) translate3d(0, 0, 0) rotate3d(1, -1, 0, 0deg) scale(1); opacity: 1; } 40% { transform: perspective(1200px) translate3d(10%, -10%, 0) rotate3d(1, -1, 0, 25deg) scale(.85); opacity: 1; } 100% { transform: perspective(1200px) translate3d(150%, -70%, 0) rotate3d(1, -1, 1, 70deg) scale(.05); opacity: 0; } }\n\n/* \u2500\u2500 Origami (fold the sheet over its top edge; the next unfolds up) \u2500\u2500\n The old single-phase rotateY + scaleX compressed the outgoing slide into a\n narrow vertical sliver for most of the (3+ second) duration, which read as\n \"just a grey line\" instead of paper folding (issue #132). The fold is now\n hinged like a real sheet: the outgoing slide creases over its TOP edge,\n dims as it tips through edge-on, and tumbles away shrinking; the incoming\n slide lies folded at its BOTTOM edge and rises into place. The edge-on\n moment is brief and already mid-fade, so no line artifact survives. */\n@keyframes pptx-tr-origami-out { 0% { transform: perspective(1400px) rotateX(0deg) translateY(0) scale(1); transform-origin: top center; opacity: 1; filter: brightness(1); } 45% { transform: perspective(1400px) rotateX(-52deg) translateY(2%) scale(.96); transform-origin: top center; opacity: 1; filter: brightness(.82); } 70% { transform: perspective(1400px) rotateX(-84deg) translateY(8%) scale(.88); transform-origin: top center; opacity: .8; filter: brightness(.68); } 100% { transform: perspective(1400px) rotateX(-125deg) translateY(30%) scale(.68); transform-origin: top center; opacity: 0; filter: brightness(.55); } }\n@keyframes pptx-tr-origami-in { 0% { transform: perspective(1400px) rotateX(62deg) scale(.94); transform-origin: bottom center; opacity: 0; filter: brightness(.7); } 30% { transform: perspective(1400px) rotateX(62deg) scale(.94); transform-origin: bottom center; opacity: .65; filter: brightness(.75); } 100% { transform: perspective(1400px) rotateX(0deg) scale(1); transform-origin: bottom center; opacity: 1; filter: brightness(1); } }\n";
4473
4473
 
4474
4474
  /**
4475
4475
  * `slide-transition-css` — pure mapping from a {@link PptxSlideTransition}
@@ -6111,10 +6111,11 @@ declare function issueTrackKey(issue: AccessibilityIssue, index: number): string
6111
6111
  * Settings" inspector panel (PowerPoint's Insert > Action dialog).
6112
6112
  *
6113
6113
  * WHY shared: the mapping from `ElementActionType` to a translation key is
6114
- * plain data that every binding's action panel needs verbatim, and the two
6115
- * types that take an extra input (`url`, `slide`) are a rule, not a rendering
6116
- * decision. Keeping the list here means adding a new action kind updates all
6117
- * five bindings at once instead of five hand-typed copies drifting apart.
6114
+ * plain data that every binding's action panel needs verbatim, and the three
6115
+ * types that take an extra input before they can commit (`url`, `slide`,
6116
+ * `customShow`) are a rule, not a rendering decision. Keeping the list here
6117
+ * means adding a new action kind updates all five bindings at once instead of
6118
+ * five hand-typed copies drifting apart.
6118
6119
  *
6119
6120
  * @module render/element-action-options
6120
6121
  */
@@ -6856,6 +6857,59 @@ interface BackstageTemplate {
6856
6857
  }
6857
6858
  declare function formatBackstageSize(bytes: number): string;
6858
6859
 
6860
+ /**
6861
+ * master-view.ts: the framework-neutral rules behind View > Slide Master.
6862
+ *
6863
+ * Every binding had its own copy of "turn the selected master/layout/notes/
6864
+ * handout part into a pseudo-slide the ordinary canvas can paint", and they
6865
+ * had drifted: React and Svelte painted a layout without its master's artwork
6866
+ * behind it, React keyed its pseudo-slide so the save path could never match
6867
+ * it, Angular dropped every edit made on the Slides tab, and Vue offered no
6868
+ * edit at all. The decisions live here instead, and each binding maps the
6869
+ * returned descriptors onto its own state container.
6870
+ *
6871
+ * @module render/master-view
6872
+ */
6873
+
6874
+ /** Which part the master view is currently pointed at. */
6875
+ interface MasterViewTarget {
6876
+ tab: MasterViewTab;
6877
+ masterIndex: number;
6878
+ /** `null` selects the master itself rather than one of its layouts. */
6879
+ layoutIndex: number | null;
6880
+ }
6881
+
6882
+ /**
6883
+ * master-view-crud.ts: the decision layer behind PowerPoint's Slide Master
6884
+ * view sidebar commands (Insert/Duplicate/Delete/Rename Layout and Slide
6885
+ * Master).
6886
+ *
6887
+ * Splits into two pure-ish pieces:
6888
+ * - {@link masterViewCrudActions}: a synchronous, framework-neutral
6889
+ * descriptor of which buttons a binding's sidebar should show, enabled or
6890
+ * disabled, so no binding re-derives PowerPoint's "can't delete the last
6891
+ * master" / "can't delete a layout slides still use" rules itself.
6892
+ * - {@link applyMasterViewCrudAction}: the async bridge to
6893
+ * `pptx-viewer-core`'s `master-layout-crud` module (which performs the
6894
+ * actual ZIP surgery), returning the master-view selection a binding
6895
+ * should move to afterwards (the new layout/master it just created, or the
6896
+ * owning master after a delete).
6897
+ *
6898
+ * @module render/master-view-crud
6899
+ */
6900
+
6901
+ /** One Slide Master view sidebar command. */
6902
+ type MasterViewCrudActionId = 'addLayout' | 'duplicateLayout' | 'deleteLayout' | 'renameLayout' | 'addMaster' | 'duplicateMaster' | 'deleteMaster' | 'renameMaster';
6903
+ /** A framework-neutral descriptor for one sidebar button. */
6904
+ interface MasterViewCrudAction {
6905
+ id: MasterViewCrudActionId;
6906
+ /** i18n key for the button label (`pptx.masterView.<id>`). */
6907
+ labelKey: string;
6908
+ enabled: boolean;
6909
+ /** i18n key explaining why the button is disabled, set only when it is. */
6910
+ disabledReasonKey?: string;
6911
+ }
6912
+
6859
6913
  /** Framework-neutral virtual-list range used by every thumbnail sidebar. */
6860
6914
  interface VirtualizedRange {
6861
6915
  startIndex: number;
@@ -7320,11 +7374,12 @@ declare function computeHandoutLayout(slideIndices: number[], slidesPerPage: Han
7320
7374
  *
7321
7375
  * No DOM side effects and no `window.print()`: everything is deterministic and
7322
7376
  * the binding writes the returned HTML string into a print window. The handout
7323
- * grid geometry lives in `handout-layout`; this module reuses it.
7324
- *
7325
- * ng-packagr constraint honoured here (the Angular binding inlines this source
7326
- * and compiles it through ng-packagr): NO `String.prototype.replaceAll`
7327
- * (`escapeHtml` uses `.split(x).join(y)` instead).
7377
+ * grid geometry lives in `handout-layout`; this module reuses it. Handout
7378
+ * master "chrome" (background/header/footer/date/page-number/positioned slide
7379
+ * rects) is resolved by `handout-master-chrome.ts` and painted by
7380
+ * `handout-chrome-html.ts`; escaping helpers live in `html-escape.ts` (both
7381
+ * split out to keep this file under this repo's per-file LOC guideline and to
7382
+ * avoid a circular import between the two).
7328
7383
  */
7329
7384
 
7330
7385
  /** What to print. */
@@ -7564,6 +7619,70 @@ declare function canSetStrokeWidth(canEdit: boolean, element: PptxElement | null
7564
7619
  /** The stroke width to show for a selection, defaulted for a shape without one. */
7565
7620
  declare function strokeWidthOf(element: PptxElement | null): number;
7566
7621
 
7622
+ /**
7623
+ * slide-size-rescale.ts: what happens to a deck's content when Design > Slide
7624
+ * Size changes the canvas dimensions.
7625
+ *
7626
+ * PowerPoint offers two responses when a slide-size change no longer matches
7627
+ * the existing content's aspect ratio:
7628
+ * - "Maximize": scale content up to fill the new size (by the LARGER of the
7629
+ * two axis ratios), which can push content outside the new slide bounds.
7630
+ * - "Ensure Fit": scale content down to fit inside the new size (by the
7631
+ * SMALLER of the two axis ratios), which can leave margins.
7632
+ *
7633
+ * Both scale uniformly (one factor, not independent X/Y stretch) and both
7634
+ * centre the scaled content in the new canvas, which is why every element's
7635
+ * position is re-derived from the same `(scale, offsetX, offsetY)` triple
7636
+ * rather than each axis being handled independently.
7637
+ *
7638
+ * Framework-agnostic: no React, Vue, Angular, Svelte or DOM imports.
7639
+ */
7640
+
7641
+ type SlideSizeRescaleMode = 'maximize' | 'ensureFit';
7642
+
7643
+ type ReadOnlyRecommendationKind = 'modifyVerifier' | 'markedFinal' | null;
7644
+ interface ReadOnlyRecommendation {
7645
+ readonly kind: ReadOnlyRecommendationKind;
7646
+ /** i18n key for the banner/toast a binding shows for this recommendation. */
7647
+ readonly messageKey: string;
7648
+ /** Whether a binding's "read-only" toggle should default to on. */
7649
+ readonly defaultReadOnly: boolean;
7650
+ }
7651
+
7652
+ interface CompatibilityWarningToast {
7653
+ /** Stable per-code id, since toasts are deduped by code (see module docs). */
7654
+ readonly id: string;
7655
+ readonly code: string;
7656
+ readonly severity: 'info' | 'warning';
7657
+ readonly messageKey: string;
7658
+ /** `{{code}}` for the generic fallback key; `undefined` for a mapped code. */
7659
+ readonly params?: Readonly<Record<string, string>>;
7660
+ }
7661
+
7662
+ /**
7663
+ * Inspector option lists + pure patch builders for the three OOXML chart
7664
+ * subtype flags parsed/serialized in this wave: bar3D column/bar shape
7665
+ * (`c:bar3DChart/c:shape`), radar chart style (`c:radarChart/c:radarStyle`),
7666
+ * and surface wireframe (`c:surfaceChart|surface3DChart/c:wireframe`).
7667
+ *
7668
+ * Each `*_OPTIONS` list is `{ value, labelKey }` for a picker control, in the
7669
+ * order PowerPoint itself lists them; each `*Patch` function is a pure
7670
+ * decision function returning the minimal `Partial<PptxChartData>` patch an
7671
+ * inspector commits back onto the loaded chart data, following this repo's
7672
+ * "shared decides, binding only maps" shape (CLAUDE.md Rule 2: a shared
7673
+ * decision function, five thin bindings). No binding-specific code lives
7674
+ * here; a binding only renders `*_OPTIONS` as a picker and calls the matching
7675
+ * patch function on selection.
7676
+ *
7677
+ * @module chart-subtype-options
7678
+ */
7679
+
7680
+ /** One inspector picker entry: the OOXML value plus its i18n label key. */
7681
+ interface ChartSubtypeOption<T extends string> {
7682
+ value: T;
7683
+ labelKey: string;
7684
+ }
7685
+
7567
7686
  /**
7568
7687
  * Minimal GIF89a encoder (pure JS, no external dependency) plus pure
7569
7688
  * frame-planning helpers — shared by the React, Vue, and Angular bindings.
@@ -8892,6 +9011,55 @@ declare class CollaborationService {
8892
9011
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<CollaborationService>;
8893
9012
  }
8894
9013
 
9014
+ /** The trimmed text plus the mention spans an add/reply submit carries. */
9015
+ interface CommentSubmission {
9016
+ text: string;
9017
+ mentions: PptxCommentMention[];
9018
+ }
9019
+ declare class CommentsPanelComponent {
9020
+ /** The active slide's comments (already filtered to the active slide). */
9021
+ readonly comments: _angular_core.InputSignal<PptxComment[]>;
9022
+ private readonly translate;
9023
+ /** Display name shown in the compose label ("Commenting as …"). */
9024
+ readonly authorName: _angular_core.InputSignal<string>;
9025
+ /** Office 2021 modern comment authors, for the `@`-mention typeahead. */
9026
+ readonly modernCommentAuthors: _angular_core.InputSignal<readonly PptxModernCommentAuthor[]>;
9027
+ /** Emits the trimmed comment text (+ mentions) the user wants to add. */
9028
+ readonly add: _angular_core.OutputEmitterRef<CommentSubmission>;
9029
+ /** Emits the id of a comment the user wants to remove. */
9030
+ readonly remove: _angular_core.OutputEmitterRef<string>;
9031
+ /** Emits the id of a comment whose resolved flag should toggle. */
9032
+ readonly resolve: _angular_core.OutputEmitterRef<string>;
9033
+ /** Emits the parent comment id + trimmed text (+ mentions) of a threaded reply. */
9034
+ readonly reply: _angular_core.OutputEmitterRef<{
9035
+ parentId: string;
9036
+ } & CommentSubmission>;
9037
+ /** Current text typed into the compose textarea. */
9038
+ readonly draft: _angular_core.WritableSignal<string>;
9039
+ /** `@`-mentions recorded in {@link draft} so far. */
9040
+ readonly draftMentions: _angular_core.WritableSignal<PptxCommentMention[]>;
9041
+ /** Whether the draft has non-whitespace content (enables the submit button). */
9042
+ readonly canAdd: _angular_core.Signal<boolean>;
9043
+ /** Id of the comment whose reply composer is open (one at a time). */
9044
+ readonly replyingTo: _angular_core.WritableSignal<string | null>;
9045
+ /** Current text typed into the open reply composer. */
9046
+ readonly replyDraft: _angular_core.WritableSignal<string>;
9047
+ /** `@`-mentions recorded in {@link replyDraft} so far. */
9048
+ readonly replyMentions: _angular_core.WritableSignal<PptxCommentMention[]>;
9049
+ /** Whether the reply draft has content (enables the reply submit button). */
9050
+ readonly canReply: _angular_core.Signal<boolean>;
9051
+ submit(event: Event): void;
9052
+ /** Localized reply-composer placeholder ("Reply to <author>..."). */
9053
+ replyPlaceholder(comment: PptxComment): string;
9054
+ /** Open the reply composer under `parentId` (closing any other composer). */
9055
+ startReply(parentId: string): void;
9056
+ cancelReply(): void;
9057
+ submitReply(parentId: string): void;
9058
+ formatTimestamp(value: string | undefined): string;
9059
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CommentsPanelComponent, never>;
9060
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CommentsPanelComponent, "pptx-comments-panel", never, { "comments": { "alias": "comments"; "required": false; "isSignal": true; }; "authorName": { "alias": "authorName"; "required": false; "isSignal": true; }; "modernCommentAuthors": { "alias": "modernCommentAuthors"; "required": false; "isSignal": true; }; }, { "add": "add"; "remove": "remove"; "resolve": "resolve"; "reply": "reply"; }, never, never, true, never>;
9061
+ }
9062
+
8895
9063
  interface EditorSectionOperations {
8896
9064
  add(afterSlideIndex: number, name: string): void;
8897
9065
  rename(sectionId: string, name: string): void;
@@ -9355,6 +9523,11 @@ declare class LoadContentService {
9355
9523
  * than silently dropped.
9356
9524
  */
9357
9525
  readonly tagCollections: _angular_core.WritableSignal<PptxTagCollection[]>;
9526
+ /**
9527
+ * Office 2021 modern comment authors (`ppt/commentAuthors/`, p188), the
9528
+ * candidate list the comment panel's `@`-mention typeahead matches against.
9529
+ */
9530
+ readonly modernCommentAuthors: _angular_core.WritableSignal<PptxModernCommentAuthor[]>;
9358
9531
  /** Header/footer settings (footer/header/date-time text + format) for field substitution. */
9359
9532
  readonly headerFooter: _angular_core.WritableSignal<PptxHeaderFooter | undefined>;
9360
9533
  /** Whether the presentation contains digital signatures. */
@@ -9413,12 +9586,61 @@ declare class LoadContentService {
9413
9586
  * change is visible to consumers; callers mark the editor dirty.
9414
9587
  */
9415
9588
  setPresentationTheme(themePath: string, applyToAllMasters: boolean): Promise<void>;
9589
+ /**
9590
+ * Adopt a new handler + fully-resolved `PptxData` from a Slide Master view
9591
+ * CRUD action (`applyMasterViewCrudAction`'s insert/duplicate/delete/rename
9592
+ * layout or master). Unlike {@link setPresentationTheme}, those functions
9593
+ * perform ZIP surgery and reload through a FRESH `PptxHandler` (see
9594
+ * `master-layout-crud`'s module doc) rather than mutating this one in
9595
+ * place, so the loaded handler itself must be swapped, not just the
9596
+ * derived signals.
9597
+ *
9598
+ * Media Blob URLs are left untouched: the slide array's own image
9599
+ * references are unaffected by a master/layout CRUD action, and a newly
9600
+ * inserted layout carries no images at all.
9601
+ */
9602
+ adoptMasterViewData(handler: PptxHandler, data: PptxData): void;
9416
9603
  private disposeHandler;
9417
9604
  private revokeBlobUrls;
9418
9605
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LoadContentService, never>;
9419
9606
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<LoadContentService>;
9420
9607
  }
9421
9608
 
9609
+ declare class LoadNoticesService {
9610
+ /** Optional so isolated service tests and stubbed injectors keep working. */
9611
+ private readonly loader;
9612
+ /** Whether the loaded deck recommends opening read-only, and why. */
9613
+ readonly recommendation: _angular_core.Signal<ReadOnlyRecommendation>;
9614
+ /** Whether the banner has been hidden ("Edit anyway" or "Dismiss") this load. */
9615
+ private readonly bannerHidden;
9616
+ /** Whether "Edit anyway" has lifted the recommendation's editing lock this load. */
9617
+ private readonly lockLifted;
9618
+ /** Whether the read-only banner should render. */
9619
+ readonly bannerActive: _angular_core.Signal<boolean>;
9620
+ /**
9621
+ * Whether the recommendation is still actively locking editing. Gates the
9622
+ * host viewer's `canEdit`, the same way the Protected View lock does.
9623
+ */
9624
+ readonly lockActive: _angular_core.Signal<boolean>;
9625
+ /** "Edit anyway": lifts the recommendation's lock and hides the banner. */
9626
+ editAnyway(): void;
9627
+ /** "Dismiss": hides the banner but leaves any lock in place. */
9628
+ dismissBanner(): void;
9629
+ /** Deck-level plus every slide's compatibility warnings, deduped by code. */
9630
+ readonly toasts: _angular_core.Signal<CompatibilityWarningToast[]>;
9631
+ private readonly dismissedToastIds;
9632
+ /** {@link toasts} with per-toast / dismiss-all dismissals applied. */
9633
+ readonly visibleToasts: _angular_core.Signal<CompatibilityWarningToast[]>;
9634
+ /** Dismiss one toast by id. */
9635
+ dismissToast(id: string): void;
9636
+ /** Dismiss every currently-visible toast. */
9637
+ dismissAllToasts(): void;
9638
+ /** Reset both notices' dismissed/lifted state for a newly loaded deck. */
9639
+ resetForLoad(): void;
9640
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LoadNoticesService, never>;
9641
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<LoadNoticesService>;
9642
+ }
9643
+
9422
9644
  /** Which mobile sheet/panel is currently active (highlights its button). */
9423
9645
  type MobileBarSheet = 'slides' | 'inspector' | 'comments' | 'notes' | null;
9424
9646
  /** Internal action descriptor used to build the bar. */
@@ -9580,7 +9802,14 @@ declare class PrintService {
9580
9802
  height: number;
9581
9803
  }>,
9582
9804
  /** Options > Advanced > "Print hidden slides". Defaults to PowerPoint's own default (excluded). */
9583
- includeHiddenSlides?: boolean): Promise<boolean>;
9805
+ includeHiddenSlides?: boolean,
9806
+ /**
9807
+ * The deck's handout master, consumed for its background, header/footer/
9808
+ * date/page-number placeholders, and (when authored) positioned slide
9809
+ * rects, in the `handouts` print mode. Optional and defaulted to
9810
+ * `undefined` so existing callers keep printing the bare grid.
9811
+ */
9812
+ handoutMaster?: PptxHandoutMaster): Promise<boolean>;
9584
9813
  /**
9585
9814
  * Open a print window, write the document, focus, and trigger printing, all
9586
9815
  * in one synchronous call. Used by the outline/slides paths, which never
@@ -9593,6 +9822,25 @@ declare class PrintService {
9593
9822
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<PrintService>;
9594
9823
  }
9595
9824
 
9825
+ declare class RecentColorsService {
9826
+ private readonly loader;
9827
+ /** Most-recently-used colours, most-recent-first, `#RRGGBB` uppercase. */
9828
+ readonly recent: _angular_core.WritableSignal<string[]>;
9829
+ /** Seed the row from the deck's own `p:clrMru`. Call once per load. */
9830
+ seed(data: Pick<PptxData, 'mruColors'> | undefined): void;
9831
+ /**
9832
+ * Record a newly-picked colour: moves it to the front of {@link recent},
9833
+ * and writes it straight into the loaded deck's `presentationProperties`
9834
+ * (`p:clrMru`), NOT through `EditorStateService`'s undo history: which
9835
+ * colours are "recent" is picker chrome, not an undoable document edit
9836
+ * (the same reasoning `PowerPointViewerComponent` already applies to the
9837
+ * grid/snap/guides toggles).
9838
+ */
9839
+ push(hex: string): void;
9840
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RecentColorsService, never>;
9841
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<RecentColorsService>;
9842
+ }
9843
+
9596
9844
  /**
9597
9845
  * Duotone SVG `<filter>` descriptor for Angular templates.
9598
9846
  *
@@ -10357,10 +10605,50 @@ declare class ViewerCustomShowsService {
10357
10605
  */
10358
10606
  readonly presentationStartIndex: _angular_core.Signal<number>;
10359
10607
  /**
10360
- * The slide a show should OPEN on: the first slide the active custom show
10361
- * visits, else the active slide. Read once, when the show starts.
10608
+ * The slide a show should OPEN on: the active slide when the show (the
10609
+ * active custom show plus the deck's authored `p:showPr/p:sldRg` range, if
10610
+ * any) includes it, else the closest show slide at or after it, else the
10611
+ * show's own first slide. Read once, when the show starts.
10612
+ *
10613
+ * This is "From Current Slide" / the status-bar "Slide show" button /
10614
+ * `setMode('present')`. A deck authored `p:sldRg st="2" end="3"` used to
10615
+ * open on the editor's active slide unconditionally, which put a slide the
10616
+ * author took out of the show on screen first.
10617
+ */
10618
+ showEntryIndex(authoredRange?: AuthoredSlideRange | null): number;
10619
+ /**
10620
+ * The show's own first slide ("From Beginning" / F5), honouring the active
10621
+ * custom show and the deck's authored range the same way {@link showEntryIndex}
10622
+ * does. Unlike `showEntryIndex`, this ignores the current active slide
10623
+ * entirely: PowerPoint's "From Beginning" always opens the show's first
10624
+ * slide, even when the editor is parked somewhere else in (or outside) it.
10625
+ */
10626
+ showFirstIndex(authoredRange?: AuthoredSlideRange | null): number;
10627
+ /**
10628
+ * The show a running `ppaction://customshow?id=<id>[&return=true]` action
10629
+ * left pending: the show + slide to restore once the SUB-show it switched
10630
+ * to runs off its end (PowerPoint's "Resume last slide viewed after showing
10631
+ * this custom show"). `null` when no such action is in flight.
10362
10632
  */
10363
- showEntryIndex(): number;
10633
+ private readonly pendingReturn;
10634
+ /**
10635
+ * Run `ppaction://customshow?id=<id>[&return=true]`: switch the active
10636
+ * custom show to `customShowId` (an id naming no surviving show is a
10637
+ * no-op, returning `null`) and resolve the deck index its show should open
10638
+ * on. When `returnAfter` is true, remembers the origin show + slide so
10639
+ * {@link consumeReturnAfterOnEnd} can restore it once the sub-show ends.
10640
+ *
10641
+ * @returns The deck index to navigate to, or `null` for an unresolvable id.
10642
+ */
10643
+ runCustomShow(customShowId: string, returnAfter: boolean): number | null;
10644
+ /**
10645
+ * The running show just reached its end (`endOfShowChange` from the
10646
+ * overlay). If a `runCustomShow(..., returnAfter: true)` is pending,
10647
+ * restores the origin show and reports the origin slide to navigate back
10648
+ * to; otherwise a no-op (`null`), leaving the ordinary end-of-show screen
10649
+ * up.
10650
+ */
10651
+ consumeReturnAfterOnEnd(): number | null;
10364
10652
  /**
10365
10653
  * Adopt the loaded deck's authored show selection.
10366
10654
  *
@@ -11001,6 +11289,8 @@ interface PresentationModeHost {
11001
11289
  readonly canEdit: () => boolean;
11002
11290
  readonly promptKeepAnnotations: (map: SlideAnnotationMap) => void;
11003
11291
  readonly applyRehearsalTimings: (timings: Record<number, number>) => void;
11292
+ /** The deck's authored `p:showPr/p:sldRg` range, or null for the whole deck. */
11293
+ readonly authoredRange: () => AuthoredSlideRange | null;
11004
11294
  }
11005
11295
  declare class ViewerPresentationModeService {
11006
11296
  private readonly presenterWindow;
@@ -11026,11 +11316,25 @@ declare class ViewerPresentationModeService {
11026
11316
  bind(host: PresentationModeHost): void;
11027
11317
  private requireHost;
11028
11318
  /**
11029
- * Open the presentation overlay from the current slide. The overlay itself
11319
+ * Open the presentation overlay at `startIndex`, deselecting first so no
11320
+ * edit chrome (selection outline / resize + rotate "Adjust shape" handles)
11321
+ * leaks over the slideshow. The overlay itself
11030
11322
  * (`PresentationOverlayComponent`) requests real browser fullscreen once it
11031
11323
  * mounts as a result of `presenting` flipping true.
11032
11324
  */
11325
+ private openShow;
11326
+ /**
11327
+ * Open the presentation overlay from the current slide ("From Current
11328
+ * Slide", the status-bar "Slide show" button, `setMode('present')`). Opens
11329
+ * on the active slide when the show (active custom show + the deck's
11330
+ * authored `p:showPr/p:sldRg` range) includes it, else the closest show
11331
+ * slide at or after it, else the show's own first slide.
11332
+ */
11033
11333
  present(): void;
11334
+ /**
11335
+ * "From Beginning" / F5: always opens the show's own first slide, ignoring
11336
+ * where the editor is currently parked.
11337
+ */
11034
11338
  presentFromBeginning(): void;
11035
11339
  presentFromCurrent(): void;
11036
11340
  toggleSubtitles(): void;
@@ -11338,6 +11642,7 @@ declare class PowerPointViewerComponent implements PowerPointViewerAPI {
11338
11642
  /** Fired when the collaboration/broadcast session stops. Mirrors React/Vue. */
11339
11643
  readonly stopCollaboration: _angular_core.OutputEmitterRef<void>;
11340
11644
  protected readonly loader: LoadContentService;
11645
+ protected readonly loadNotices: LoadNoticesService;
11341
11646
  protected readonly editor: EditorStateService;
11342
11647
  private readonly fonts;
11343
11648
  private readonly googleWebfonts;
@@ -11362,6 +11667,7 @@ declare class PowerPointViewerComponent implements PowerPointViewerAPI {
11362
11667
  protected readonly xport: ViewerExportService;
11363
11668
  protected readonly findReplace: ViewerFindReplaceService;
11364
11669
  protected readonly customShowsCtl: ViewerCustomShowsService;
11670
+ protected readonly recentColors: RecentColorsService;
11365
11671
  /**
11366
11672
  * The `p:showPr/p:sldRg` slide-range restriction, when the deck is authored
11367
11673
  * to open into a range (`showSlidesMode === 'range'`) rather than the whole
@@ -11403,9 +11709,11 @@ declare class PowerPointViewerComponent implements PowerPointViewerAPI {
11403
11709
  protected readonly protectedViewDismissed: _angular_core.WritableSignal<boolean>;
11404
11710
  /**
11405
11711
  * Effective edit permission: the host's `canEdit` input gated by Trust
11406
- * Center > "Open presentations in Protected View", which forces the deck
11407
- * read-only while enabled (File > Options wiring, mirrors PowerPoint),
11408
- * unless the user has lifted it via `enableEditing()` for this document.
11712
+ * Center > "Open presentations in Protected View" (forces the deck
11713
+ * read-only while enabled, mirrors PowerPoint, unless the user has lifted
11714
+ * it via `enableEditing()` for this document) and by the deck's own
11715
+ * read-only recommendation (`p:modifyVerifier` / "Mark as Final"; lifted by
11716
+ * the read-only banner's "Edit anyway", see {@link LoadNoticesService}).
11409
11717
  */
11410
11718
  protected readonly canEdit: _angular_core.Signal<boolean>;
11411
11719
  /** Whether the Protected View banner should show: host allows editing, the option still blocks it, and the user hasn't dismissed it yet. */
@@ -11615,6 +11923,42 @@ declare class PowerPointViewerComponent implements PowerPointViewerAPI {
11615
11923
  protected openMasterView(): void;
11616
11924
  protected closeMasterView(): void;
11617
11925
  protected selectMasterTab(tab: MasterViewTab): void;
11926
+ /**
11927
+ * `ppaction://customshow?id=<id>[&return=true]` clicked during a running
11928
+ * show: switch to the named custom show and open its resolved entry slide.
11929
+ * An id naming no surviving show is a no-op (`resolveCustomShowEntry`
11930
+ * returns `null`).
11931
+ */
11932
+ protected onPresentationCustomShow(event: {
11933
+ customShowId: string;
11934
+ returnAfter: boolean;
11935
+ }): void;
11936
+ /**
11937
+ * The presentation overlay's end-of-show flag changed. Only relevant on the
11938
+ * rising edge: if a `ppaction://customshow ... &return=true` is pending,
11939
+ * restore the origin show and slide instead of leaving the black end
11940
+ * screen up (`syncFromHost`'s host-forced jump clears it once the new
11941
+ * index lands).
11942
+ */
11943
+ protected onPresentationEndOfShow(isEnd: boolean): void;
11944
+ /** The Slide Master view sidebar's current selection, in `master-view-crud`'s shape. */
11945
+ protected readonly masterViewTarget: _angular_core.Signal<MasterViewTarget>;
11946
+ /** The Insert/Duplicate/Delete/Rename Layout+Master sidebar commands for the current selection. */
11947
+ protected readonly masterViewCrudActionsList: _angular_core.Signal<MasterViewCrudAction[]>;
11948
+ /**
11949
+ * Run one Slide Master view sidebar CRUD command.
11950
+ *
11951
+ * rename* prompts for a name first (`window.prompt`, matching the pattern
11952
+ * `SlidesPanelComponent`'s section-rename already uses); every command then
11953
+ * runs through `applyMasterViewCrudAction` and, on success, adopts the
11954
+ * returned handler + data through `LoadContentService.adoptMasterViewData`
11955
+ * (that helper reloads through a FRESH `PptxHandler`, so it cannot be
11956
+ * applied as a plain signal patch) and moves the sidebar selection to the
11957
+ * returned target. A failure is surfaced with `window.alert`: Angular has
11958
+ * no generic toast/notice channel for an arbitrary action failure (the
11959
+ * compat-toast stack is load-diagnostics only).
11960
+ */
11961
+ protected onMasterViewCrudAction(id: MasterViewCrudActionId): Promise<void>;
11618
11962
  /**
11619
11963
  * Format Background for whichever master-view part is selected.
11620
11964
  *
@@ -11811,17 +12155,26 @@ declare class PowerPointViewerComponent implements PowerPointViewerAPI {
11811
12155
  * back to Options > General > "User name" before the generic "You".
11812
12156
  */
11813
12157
  private commentAuthorName;
11814
- /** Append a comment to the active slide (one history entry). */
11815
- onCommentAdd(text: string): void;
12158
+ /**
12159
+ * Append a comment to the active slide (one history entry).
12160
+ *
12161
+ * `addCommentToList` (shared) has no `mentions` parameter, so the `@`-mention
12162
+ * spans the typeahead recorded are patched onto the newly-appended comment
12163
+ * (the array's last element) here, rather than in the shared helper.
12164
+ */
12165
+ onCommentAdd(submission: CommentSubmission): void;
11816
12166
  /** Remove a comment from the active slide. */
11817
12167
  onCommentRemove(id: string): void;
11818
12168
  /** Toggle a comment's resolved flag on the active slide. */
11819
12169
  onCommentResolve(id: string): void;
11820
- /** Append a threaded reply under a top-level comment on the active slide. */
12170
+ /**
12171
+ * Append a threaded reply under a top-level comment on the active slide.
12172
+ * See {@link onCommentAdd}: `mentions` is patched on afterwards, since
12173
+ * `replyToCommentInList` (shared) has no `mentions` parameter.
12174
+ */
11821
12175
  onCommentReply(event: {
11822
12176
  parentId: string;
11823
- text: string;
11824
- }): void;
12177
+ } & CommentSubmission): void;
11825
12178
  /**
11826
12179
  * Insert a new SmartArt element built from the dialog's chosen preset + item
11827
12180
  * texts. The element id is left empty so `EditorStateService.addElement`
@@ -12238,6 +12591,7 @@ declare class ViewerKeyboardService {
12238
12591
  private readonly dialogs;
12239
12592
  private readonly formatPainter;
12240
12593
  private readonly findReplace;
12594
+ private readonly presentationMode;
12241
12595
  private host;
12242
12596
  /** Wire the host accessors (called once from the component constructor). */
12243
12597
  bind(host: KeyboardHost): void;
@@ -12360,7 +12714,7 @@ declare class ZoomTargetService {
12360
12714
  * `PowerPointViewerComponent`'s children (ribbon, slide canvas, inspector,
12361
12715
  * dialogs, ...) rely on via `inject()`.
12362
12716
  */
12363
- declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof GoogleWebfontsService, typeof CollaborationService, typeof CustomFontsService, typeof AccessibilityService, typeof AutosaveService, typeof AutosaveRecoveryService, typeof PrintService, typeof IsMobileService, typeof SmartArt3DService, typeof SurfaceChart3DService, typeof BarChart3DService, typeof LineChart3DService, typeof AreaChart3DService, typeof PieChart3DService, typeof FieldContextService, typeof ZoomTargetService, typeof AiPanelStore, typeof ViewerDialogsService, typeof ViewerCompareService, typeof ViewerExportService, typeof ViewerFindReplaceService, typeof ViewerCustomShowsService, typeof ViewerCollaborationSessionService, typeof ViewerCanvasEditingService, typeof ViewerCollabCursorService, typeof ViewerDocumentPropertiesService, typeof ViewerFileIOService, typeof ViewerFormatPainterService, typeof ViewerInspectorPanelService, typeof ViewerKeyboardService, typeof ViewerMobileSheetService, typeof ViewerOptionsService, typeof ViewerPresentationModeService, typeof ViewerThemeGalleryService, typeof ViewerTouchGesturesService, typeof ViewerZoomService];
12717
+ declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof LoadNoticesService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof GoogleWebfontsService, typeof CollaborationService, typeof CustomFontsService, typeof AccessibilityService, typeof AutosaveService, typeof AutosaveRecoveryService, typeof PrintService, typeof IsMobileService, typeof SmartArt3DService, typeof SurfaceChart3DService, typeof BarChart3DService, typeof LineChart3DService, typeof AreaChart3DService, typeof PieChart3DService, typeof FieldContextService, typeof RecentColorsService, typeof ZoomTargetService, typeof AiPanelStore, typeof ViewerDialogsService, typeof ViewerCompareService, typeof ViewerExportService, typeof ViewerFindReplaceService, typeof ViewerCustomShowsService, typeof ViewerCollaborationSessionService, typeof ViewerCanvasEditingService, typeof ViewerCollabCursorService, typeof ViewerDocumentPropertiesService, typeof ViewerFileIOService, typeof ViewerFormatPainterService, typeof ViewerInspectorPanelService, typeof ViewerKeyboardService, typeof ViewerMobileSheetService, typeof ViewerOptionsService, typeof ViewerPresentationModeService, typeof ViewerThemeGalleryService, typeof ViewerTouchGesturesService, typeof ViewerZoomService];
12364
12718
 
12365
12719
  /** Lifecycle of the AI session bootstrap. */
12366
12720
  type AiChatInitState = 'checking' | 'unavailable' | 'ready' | 'error';
@@ -12756,9 +13110,16 @@ declare class RibbonDrawSectionComponent {
12756
13110
  readonly drawingColor: _angular_core.InputSignal<string>;
12757
13111
  readonly drawingWidth: _angular_core.InputSignal<number>;
12758
13112
  readonly drawToolChange: _angular_core.OutputEmitterRef<DrawToolState>;
13113
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
13114
+ private readonly recentColors;
12759
13115
  protected readonly drawTools: readonly DrawToolDef[];
12760
13116
  protected selectTool(tool: DrawTool$1): void;
12761
13117
  protected onColorInput(event: Event): void;
13118
+ /**
13119
+ * Record the committed (native `change`, not the live-preview `input`)
13120
+ * pen colour into the shared "Recent colours" list.
13121
+ */
13122
+ protected onColorCommit(event: Event): void;
12762
13123
  protected onWidthInput(event: Event): void;
12763
13124
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonDrawSectionComponent, never>;
12764
13125
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonDrawSectionComponent, "pptx-ribbon-draw-section", never, { "activeTool": { "alias": "activeTool"; "required": false; "isSignal": true; }; "drawingColor": { "alias": "drawingColor"; "required": false; "isSignal": true; }; "drawingWidth": { "alias": "drawingWidth"; "required": false; "isSignal": true; }; }, { "drawToolChange": "drawToolChange"; }, never, never, true, never>;
@@ -15617,10 +15978,9 @@ interface ShowNavigatorDeps {
15617
15978
  */
15618
15979
  activeCustomShow?: () => ActiveShow;
15619
15980
  /**
15620
- * The `p:showPr/p:sldRg` slide-range restriction, when the deck is authored
15621
- * to open into a range rather than the whole deck or a custom show. Applied
15622
- * the same way `activeCustomShow` is: a filter on the navigable order, not a
15623
- * pre-filtered slide array.
15981
+ * The `p:showPr/p:sldRg` range, when the deck opens into a range rather than
15982
+ * the whole deck or a custom show. Applied like `activeCustomShow`: a filter
15983
+ * on the navigable order, not a pre-filtered slide array.
15624
15984
  */
15625
15985
  authoredRange?: () => AuthoredRange;
15626
15986
  /** The slide at the CURRENT index (a computed over `currentIndex`). */
@@ -15633,16 +15993,14 @@ interface ShowNavigatorDeps {
15633
15993
  /** Ask the host to end the show; the host guards against double-closing. */
15634
15994
  requestClose: () => void;
15635
15995
  /**
15636
- * File > Options > Advanced > "End with black slide". PowerPoint's default
15637
- * is ON: running past the last slide raises a black "End of slide show"
15638
- * screen and only the NEXT forward input ends the show. Turning it off ends
15639
- * the show immediately instead. Undefined means the PowerPoint default.
15996
+ * File > Options > Advanced > "End with black slide". PowerPoint's default is
15997
+ * ON: running past the last slide raises a black end screen and only the NEXT
15998
+ * forward input ends the show; off ends the show immediately instead.
15640
15999
  */
15641
16000
  endWithBlackSlide?: () => boolean | undefined;
15642
16001
  /**
15643
- * Set Up Slide Show > "Loop continuously until 'Esc'". When true, running
15644
- * past the last slide wraps back to the show's first slide instead of
15645
- * raising the end-of-show screen (or exiting, per `endWithBlackSlide`).
16002
+ * Set Up Slide Show > "Loop continuously until 'Esc'": wraps to the show's
16003
+ * first slide instead of raising the end screen (or exiting).
15646
16004
  */
15647
16005
  loopContinuously?: () => boolean | undefined;
15648
16006
  }
@@ -15651,27 +16009,26 @@ declare class PresentationShowNavigator {
15651
16009
  /** Zero-based index into `slides()`. */
15652
16010
  readonly currentIndex: _angular_core.WritableSignal<number>;
15653
16011
  /**
15654
- * True once the show has run past its last slide and the black "End of slide
15655
- * show" screen is up. It MUST be surfaced: while it is up the next input
15656
- * either goes nowhere (backward) or ends the show (forward), so a deck that
15657
- * kept painting its last slide looked stuck and swallowed every advance.
16012
+ * True once the show has run past its last slide and the black end screen is
16013
+ * up: while it is up the next input either goes nowhere (backward) or ends
16014
+ * the show (forward), so a stuck deck must surface this rather than swallow
16015
+ * every advance.
15658
16016
  */
15659
16017
  readonly endOfShow: _angular_core.WritableSignal<boolean>;
15660
16018
  /** Active slide-transition animation, or null when none is playing. */
15661
16019
  readonly activeTransition: _angular_core.WritableSignal<ActiveSlideTransition | null>;
15662
16020
  /**
15663
- * Set just before a BACKWARD slide change so the host's slide effect seeds the
16021
+ * Set just before a BACKWARD change so the host's slide effect seeds the
15664
16022
  * incoming slide as fully built. Read-and-cleared via
15665
16023
  * {@link takePendingCompletedEntry}.
15666
16024
  */
15667
16025
  private pendingCompletedEntry;
15668
16026
  /** Pending `p:transition/@advTm` auto-advance timer for the current slide. */
15669
16027
  private autoAdvanceTimer;
16028
+ /** Deck index before each committed change; backs {@link goToLastViewed}. */
16029
+ private previousIndex;
15670
16030
  constructor(deps: ShowNavigatorDeps);
15671
- /**
15672
- * Consume the "entered backward" flag. The host's per-slide effect asks once
15673
- * per slide change, so this both reads and clears it.
15674
- */
16031
+ /** Consume the "entered backward" flag: reads and clears it in one call. */
15675
16032
  takePendingCompletedEntry(): boolean;
15676
16033
  /**
15677
16034
  * Adopt an index pushed in by the host (its `startIndex` input, which an
@@ -15680,30 +16037,29 @@ declare class PresentationShowNavigator {
15680
16037
  */
15681
16038
  syncFromHost(requestedIndex: number): void;
15682
16039
  /**
15683
- * (Re)arm PowerPoint's "Advance slide: After <n>" timer, cancelling whatever
15684
- * was pending. Always cancelling first is load-bearing: a manual advance must
15685
- * never leave a stale timer running that then skips the slide the presenter
15686
- * just moved to.
16040
+ * Jump back to the slide the show was on immediately before the current one
16041
+ * (`ppaction://hlinkshowjump?jump=lastslideviewed`). A no-op before any
16042
+ * navigation has happened yet.
16043
+ */
16044
+ goToLastViewed(): void;
16045
+ /**
16046
+ * (Re)arm PowerPoint's "Advance slide: After <n>" timer, always cancelling
16047
+ * whatever was pending first: a manual advance must never leave a stale
16048
+ * timer running that skips the slide the presenter just moved to.
15687
16049
  */
15688
16050
  armAutoAdvance(delayMs: number | undefined): void;
15689
16051
  /** Cancel any pending timed auto-advance (also called on teardown). */
15690
16052
  clearAutoAdvance(): void;
15691
16053
  navigate(direction: ShowDirection): void;
15692
16054
  /**
15693
- * Jump directly to `index` (clamped to the slide range). Used by zoom tiles
15694
- * and by on-slide Action Settings (`ppaction://hlinksldjump`).
15695
- *
15696
- * A jump ENTERS the target slide, so PowerPoint plays that slide's
15697
- * transition exactly as a forward step does. Committing with `null` here is
15698
- * why a deck navigated by clicking its own on-slide links showed no morph at
15699
- * all while the same transition played fine on PageDown.
16055
+ * Jump directly to `index` (clamped). Used by zoom tiles and by on-slide
16056
+ * Action Settings (`ppaction://hlinksldjump`); ENTERS the target slide, so
16057
+ * PowerPoint plays its transition exactly as a forward step does.
15700
16058
  */
15701
16059
  goToSlide(index: number): void;
15702
16060
  /**
15703
16061
  * The single place a slide change becomes visible: set the transition, move
15704
- * the index, retarget the annotation layer, and tell the host. Both entry
15705
- * points share it so a change to one can never silently skip a step in the
15706
- * other (they had drifted apart as four repeated statements before).
16062
+ * the index, retarget the annotation layer, and tell the host.
15707
16063
  */
15708
16064
  private commit;
15709
16065
  }
@@ -15754,6 +16110,13 @@ interface PresentationInputDeps {
15754
16110
  * with the option off.
15755
16111
  */
15756
16112
  confirmExternalHyperlink?: (href: string) => boolean;
16113
+ /**
16114
+ * `ppaction://customshow?id=<id>[&return=true]`: run the named custom show.
16115
+ * The host resolves `customShowId` against its own custom-show registry (an
16116
+ * id naming no surviving show is a no-op) and, when `returnAfter` is true,
16117
+ * restores the origin show + slide once the sub-show runs off its end.
16118
+ */
16119
+ runCustomShow?: (customShowId: string, returnAfter: boolean) => void;
15757
16120
  }
15758
16121
  declare class PresentationInputController {
15759
16122
  private readonly deps;
@@ -15889,6 +16252,24 @@ declare class PresentationOverlayComponent implements OnInit {
15889
16252
  * host can offer the keep/discard prompt (mirrors React's exit flow).
15890
16253
  */
15891
16254
  readonly annotationsExit: _angular_core.OutputEmitterRef<SlideAnnotationMap>;
16255
+ /**
16256
+ * `ppaction://customshow?id=<id>[&return=true]`: the host resolves the id
16257
+ * against its own custom-show registry (this overlay only knows the
16258
+ * CURRENTLY active show's membership, via `activeCustomShow`) and, when
16259
+ * `returnAfter` is true, restores the origin show + slide once the
16260
+ * sub-show runs off its end (see `endOfShowChange` below).
16261
+ */
16262
+ readonly customShowRequest: _angular_core.OutputEmitterRef<{
16263
+ customShowId: string;
16264
+ returnAfter: boolean;
16265
+ }>;
16266
+ /**
16267
+ * Mirrors the navigator's `endOfShow` flag. The host listens for this to
16268
+ * implement `ppaction://customshow`'s "return after": ending the show while
16269
+ * a return is pending means restore the origin instead of raising the
16270
+ * black end screen (which `syncFromHost`'s host-forced jump then clears).
16271
+ */
16272
+ readonly endOfShowChange: _angular_core.OutputEmitterRef<boolean>;
15892
16273
  /** PowerPoint's Ctrl+M: hide ink markup without discarding the strokes. */
15893
16274
  protected readonly inkMarkupVisible: _angular_core.WritableSignal<boolean>;
15894
16275
  /** Click-stepped element-animation playback for the current slide. */
@@ -16056,7 +16437,7 @@ declare class PresentationOverlayComponent implements OnInit {
16056
16437
  private runChromeAction;
16057
16438
  private emitClosed;
16058
16439
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PresentationOverlayComponent, never>;
16059
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationOverlayComponent, "pptx-presentation-overlay", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "startIndex": { "alias": "startIndex"; "required": false; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "authoredRange": { "alias": "authoredRange"; "required": false; "isSignal": true; }; "loopContinuously": { "alias": "loopContinuously"; "required": false; "isSignal": true; }; "showWithAnimation": { "alias": "showWithAnimation"; "required": false; "isSignal": true; }; "useTimings": { "alias": "useTimings"; "required": false; "isSignal": true; }; "subtitlesVisible": { "alias": "subtitlesVisible"; "required": false; "isSignal": true; }; "sessionEnded": { "alias": "sessionEnded"; "required": false; "isSignal": true; }; "endWithBlackSlide": { "alias": "endWithBlackSlide"; "required": false; "isSignal": true; }; "presenterMode": { "alias": "presenterMode"; "required": false; "isSignal": true; }; "showMenuOnRightClick": { "alias": "showMenuOnRightClick"; "required": false; "isSignal": true; }; "showPopupToolbar": { "alias": "showPopupToolbar"; "required": false; "isSignal": true; }; }, { "indexChange": "indexChange"; "closed": "closed"; "subtitlesChange": "subtitlesChange"; "presenterViewToggle": "presenterViewToggle"; "annotationsExit": "annotationsExit"; }, never, never, true, never>;
16440
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationOverlayComponent, "pptx-presentation-overlay", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "startIndex": { "alias": "startIndex"; "required": false; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "authoredRange": { "alias": "authoredRange"; "required": false; "isSignal": true; }; "loopContinuously": { "alias": "loopContinuously"; "required": false; "isSignal": true; }; "showWithAnimation": { "alias": "showWithAnimation"; "required": false; "isSignal": true; }; "useTimings": { "alias": "useTimings"; "required": false; "isSignal": true; }; "subtitlesVisible": { "alias": "subtitlesVisible"; "required": false; "isSignal": true; }; "sessionEnded": { "alias": "sessionEnded"; "required": false; "isSignal": true; }; "endWithBlackSlide": { "alias": "endWithBlackSlide"; "required": false; "isSignal": true; }; "presenterMode": { "alias": "presenterMode"; "required": false; "isSignal": true; }; "showMenuOnRightClick": { "alias": "showMenuOnRightClick"; "required": false; "isSignal": true; }; "showPopupToolbar": { "alias": "showPopupToolbar"; "required": false; "isSignal": true; }; }, { "indexChange": "indexChange"; "closed": "closed"; "subtitlesChange": "subtitlesChange"; "presenterViewToggle": "presenterViewToggle"; "annotationsExit": "annotationsExit"; "customShowRequest": "customShowRequest"; "endOfShowChange": "endOfShowChange"; }, never, never, true, never>;
16060
16441
  }
16061
16442
 
16062
16443
  /**
@@ -16267,6 +16648,8 @@ declare class InspectorPanelComponent {
16267
16648
  protected readonly editor: EditorStateService;
16268
16649
  /** Reactive viewport / pointer flags (drives the bottom-sheet layout). */
16269
16650
  protected readonly mobile: IsMobileService;
16651
+ /** "Recent colours" row backing the fill/stroke/text colour pickers below. */
16652
+ protected readonly recentColors: RecentColorsService;
16270
16653
  /**
16271
16654
  * Root class list: gains the `is-mobile` modifier under the mobile
16272
16655
  * breakpoint so the panel becomes a full-width, touch-sized bottom sheet.
@@ -16350,8 +16733,17 @@ declare class InspectorPanelComponent {
16350
16733
  protected onRotationChange(event: Event): void;
16351
16734
  protected onOpacityChange(event: Event): void;
16352
16735
  protected onFillColorChange(event: Event): void;
16736
+ /** Recent-colours row pick: commits through the same path as the native picker. */
16737
+ protected onFillColorPick(color: string): void;
16738
+ private commitFillColor;
16353
16739
  protected onStrokeColorChange(event: Event): void;
16740
+ /** Recent-colours row pick: commits through the same path as the native picker. */
16741
+ protected onStrokeColorPick(color: string): void;
16742
+ private commitStrokeColor;
16354
16743
  protected onTextColorChange(event: Event): void;
16744
+ /** Recent-colours row pick: commits through the same path as the native picker. */
16745
+ protected onTextColorPick(color: string): void;
16746
+ private commitTextColor;
16355
16747
  protected onFontSizeChange(event: Event): void;
16356
16748
  protected onBoldToggle(): void;
16357
16749
  protected onItalicToggle(): void;
@@ -16393,14 +16785,15 @@ declare class SlideDefaultInspectorComponent {
16393
16785
  readonly selectedElement: _angular_core.InputSignal<PptxElement | null>;
16394
16786
  /** The active slide's comments (host-owned; history-aware writes stay there). */
16395
16787
  readonly comments: _angular_core.InputSignal<PptxComment[]>;
16788
+ /** Office 2021 modern comment authors, for the `@`-mention typeahead. */
16789
+ readonly modernCommentAuthors: _angular_core.InputSignal<readonly PptxModernCommentAuthor[]>;
16396
16790
  /** Re-emitted comments-panel events (the host owns the comment writes). */
16397
- readonly commentAdd: _angular_core.OutputEmitterRef<string>;
16791
+ readonly commentAdd: _angular_core.OutputEmitterRef<CommentSubmission>;
16398
16792
  readonly commentRemove: _angular_core.OutputEmitterRef<string>;
16399
16793
  readonly commentResolve: _angular_core.OutputEmitterRef<string>;
16400
16794
  readonly commentReply: _angular_core.OutputEmitterRef<{
16401
16795
  parentId: string;
16402
- text: string;
16403
- }>;
16796
+ } & CommentSubmission>;
16404
16797
  protected readonly editor: EditorStateService;
16405
16798
  protected readonly canvasEditing: ViewerCanvasEditingService;
16406
16799
  protected readonly inspectorPanel: ViewerInspectorPanelService;
@@ -16415,7 +16808,7 @@ declare class SlideDefaultInspectorComponent {
16415
16808
  */
16416
16809
  protected readonly layerRows: _angular_core.Signal<LayerRow[]>;
16417
16810
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideDefaultInspectorComponent, never>;
16418
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideDefaultInspectorComponent, "pptx-slide-default-inspector", never, { "slideIndex": { "alias": "slideIndex"; "required": true; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "selectedElement": { "alias": "selectedElement"; "required": false; "isSignal": true; }; "comments": { "alias": "comments"; "required": false; "isSignal": true; }; }, { "commentAdd": "commentAdd"; "commentRemove": "commentRemove"; "commentResolve": "commentResolve"; "commentReply": "commentReply"; }, never, never, true, never>;
16811
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideDefaultInspectorComponent, "pptx-slide-default-inspector", never, { "slideIndex": { "alias": "slideIndex"; "required": true; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "selectedElement": { "alias": "selectedElement"; "required": false; "isSignal": true; }; "comments": { "alias": "comments"; "required": false; "isSignal": true; }; "modernCommentAuthors": { "alias": "modernCommentAuthors"; "required": false; "isSignal": true; }; }, { "commentAdd": "commentAdd"; "commentRemove": "commentRemove"; "commentResolve": "commentResolve"; "commentReply": "commentReply"; }, never, never, true, never>;
16419
16812
  }
16420
16813
 
16421
16814
  declare class PresentationPropertiesPanelComponent {
@@ -16474,17 +16867,36 @@ declare class SlideSizeCardComponent {
16474
16867
  readonly canEdit: _angular_core.InputSignal<boolean>;
16475
16868
  private readonly loader;
16476
16869
  private readonly editor;
16870
+ private readonly translate;
16477
16871
  protected readonly CUSTOM_PRESET_VALUE = "";
16478
16872
  protected readonly presets: readonly SlideSizePreset[];
16479
16873
  protected readonly orientations: readonly SlideSizeOrientation[];
16480
16874
  protected readonly size: _angular_core.WritableSignal<pptx_angular_viewer.CanvasSize>;
16481
16875
  protected readonly selection: _angular_core.Signal<SlideSizeSelectionDescriptor>;
16482
16876
  protected readonly selectedPresetValue: _angular_core.Signal<string>;
16877
+ /**
16878
+ * A confirmed size that differs from the current one and has at least one
16879
+ * element to rescale, awaiting the user's Maximize/Ensure-Fit choice. `null`
16880
+ * once answered (or when no prompt was needed) so the inline prompt hides.
16881
+ */
16882
+ protected readonly pendingResize: _angular_core.WritableSignal<SlideSizeEmu | null>;
16483
16883
  protected onPresetChange(event: Event): void;
16484
16884
  protected onOrientation(orientation: SlideSizeOrientation): void;
16485
16885
  protected onChange(event: Event, dim: 'width' | 'height'): void;
16486
- /** Commit an EMU size and the canvas size it implies, together. */
16886
+ /**
16887
+ * PowerPoint's Maximize/Ensure-Fit prompt: choosing a mode rescales every
16888
+ * slide's elements (one undoable history entry via
16889
+ * `EditorStateService.applyReplacement`) before the new size itself commits.
16890
+ */
16891
+ protected onRescaleChoice(pending: SlideSizeEmu, mode: SlideSizeRescaleMode): void;
16892
+ /**
16893
+ * Commit a confirmed size, prompting first (PowerPoint's Maximize/Ensure
16894
+ * Fit) when it differs from the current size AND the deck has at least one
16895
+ * element anywhere to rescale; an empty deck commits directly, as before.
16896
+ */
16487
16897
  private apply;
16898
+ /** Commit an EMU size and the canvas size it implies, together. */
16899
+ private commit;
16488
16900
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideSizeCardComponent, never>;
16489
16901
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideSizeCardComponent, "pptx-slide-size-card", never, { "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
16490
16902
  }
@@ -16544,6 +16956,8 @@ declare class SlideBackgroundCardComponent {
16544
16956
  private readonly editor;
16545
16957
  private readonly loader;
16546
16958
  private readonly translate;
16959
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
16960
+ private readonly recentColors;
16547
16961
  protected readonly imageAccept = "image/png,image/jpeg,image/gif,image/webp,image/svg+xml";
16548
16962
  protected readonly slide: _angular_core.Signal<PptxSlide | undefined>;
16549
16963
  /** Stable per-slide key so the colour input reseeds only on slide change. */
@@ -16681,6 +17095,8 @@ declare class GradientPickerComponent {
16681
17095
  * EditorStateService.updateElement(slideIndex, element().id, patch).
16682
17096
  */
16683
17097
  readonly patch: _angular_core.OutputEmitterRef<Partial<PptxElement>>;
17098
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
17099
+ private readonly recentColors;
16684
17100
  /** Derived gradient state from the current element. */
16685
17101
  protected readonly state: _angular_core.Signal<GradientState>;
16686
17102
  /** CSS gradient string for the preview strip. */
@@ -16705,6 +17121,8 @@ declare class EffectsPanelComponent {
16705
17121
  * The orchestrator should call EditorStateService.updateElement(slideIndex, element().id, patch).
16706
17122
  */
16707
17123
  readonly patch: _angular_core.OutputEmitterRef<Partial<PptxElement>>;
17124
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
17125
+ private readonly recentColors;
16708
17126
  /** Derived EffectsState from the current element. */
16709
17127
  protected readonly state: _angular_core.Signal<EffectsState>;
16710
17128
  /** Stable key for keying inputs to the current element (prevents caret-reset). */
@@ -16769,6 +17187,8 @@ declare class Text3DPanelComponent {
16769
17187
  readonly element: _angular_core.InputSignal<PptxElement>;
16770
17188
  /** A partial-element patch for the orchestrator to commit (one history entry). */
16771
17189
  readonly patch: _angular_core.OutputEmitterRef<Partial<PptxElement>>;
17190
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
17191
+ private readonly recentColors;
16772
17192
  protected readonly materialPresets: readonly {
16773
17193
  value: MaterialPresetType | "";
16774
17194
  label: string;
@@ -16953,6 +17373,8 @@ declare class TableCellFormattingComponent {
16953
17373
  /** Emits the fully-updated element after any edit. */
16954
17374
  readonly elementChange: _angular_core.OutputEmitterRef<TablePptxElement>;
16955
17375
  private readonly selection;
17376
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
17377
+ private readonly recentColors;
16956
17378
  protected readonly textToggles: ReadonlyArray<{
16957
17379
  key: 'bold' | 'italic' | 'underline';
16958
17380
  label: string;
@@ -16980,6 +17402,11 @@ declare class TableCellFormattingComponent {
16980
17402
  protected widthOf(key: NumKey): number;
16981
17403
  protected toggle(key: 'bold' | 'italic' | 'underline'): void;
16982
17404
  protected onColor(key: ColorKey, event: Event): void;
17405
+ /**
17406
+ * Record the committed (native `change`, not the live-preview `input`)
17407
+ * colour into the shared "Recent colours" list.
17408
+ */
17409
+ protected pushRecentColor(event: Event): void;
16983
17410
  protected onNumber(key: NumKey, event: Event): void;
16984
17411
  /** Merge a style patch into the selected cell and emit the updated element. */
16985
17412
  protected updateStyle(patch: Partial<PptxTableCellStyle>): void;
@@ -17013,6 +17440,8 @@ declare class TableCellAdvancedFillComponent {
17013
17440
  readonly canEdit: _angular_core.InputSignal<boolean>;
17014
17441
  /** Emits a partial style patch to merge into the cell. */
17015
17442
  readonly styleChange: _angular_core.OutputEmitterRef<Partial<PptxTableCellStyle>>;
17443
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
17444
+ private readonly recentColors;
17016
17445
  protected readonly fillModes: {
17017
17446
  value: "image" | "none" | "solid" | "gradient" | "pattern";
17018
17447
  i18nKey: string;
@@ -17049,6 +17478,11 @@ declare class TableCellAdvancedFillComponent {
17049
17478
  protected onPatternFg(event: Event): void;
17050
17479
  protected onPatternBg(event: Event): void;
17051
17480
  protected onMargin(key: 'marginTop' | 'marginBottom' | 'marginLeft' | 'marginRight', event: Event): void;
17481
+ /**
17482
+ * Record the committed (native `change`, not the live-preview `input`)
17483
+ * colour into the shared "Recent colours" list.
17484
+ */
17485
+ protected pushRecentColor(event: Event): void;
17052
17486
  private updateStop;
17053
17487
  private emitGradient;
17054
17488
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableCellAdvancedFillComponent, never>;
@@ -17098,6 +17532,8 @@ declare class ChartDataEditorComponent {
17098
17532
  private readonly viewerOpts;
17099
17533
  private readonly host;
17100
17534
  private readonly injector;
17535
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
17536
+ private readonly recentColors;
17101
17537
  /**
17102
17538
  * File > Options > Advanced > "Properties follow chart data point for
17103
17539
  * current workbook". Falls back to PowerPoint's own default (`true`) when
@@ -17137,6 +17573,11 @@ declare class ChartDataEditorComponent {
17137
17573
  protected onAddSeries(): void;
17138
17574
  protected onRemoveLastSeries(): void;
17139
17575
  protected onRemoveSeries(seriesIndex: number): void;
17576
+ /**
17577
+ * Record the committed (native `change`, not the live-preview `input`)
17578
+ * series colour into the shared "Recent colours" list.
17579
+ */
17580
+ protected pushRecentColor(event: Event): void;
17140
17581
  protected onAddCategory(): void;
17141
17582
  protected onRemoveLastCategory(): void;
17142
17583
  protected onRemoveCategory(catIndex: number): void;
@@ -17179,7 +17620,14 @@ declare class ChartDisplayOptionsComponent {
17179
17620
  readonly canEdit: _angular_core.InputSignal<boolean>;
17180
17621
  readonly elementChange: _angular_core.OutputEmitterRef<ChartPptxElement>;
17181
17622
  protected readonly legendPositions: readonly ChartOption<string>[];
17623
+ protected readonly bar3DShapeOptions: readonly ChartSubtypeOption<PptxBar3DShape>[];
17624
+ protected readonly radarStyleOptions: readonly ChartSubtypeOption<NonNullable<"marker" | "standard" | "filled" | undefined>>[];
17625
+ protected readonly surfaceWireframeOptions: readonly ChartSubtypeOption<"true" | "false">[];
17182
17626
  protected readonly style: _angular_core.Signal<pptx_viewer_core.PptxChartStyle>;
17627
+ protected readonly chartData: _angular_core.Signal<PptxChartData | undefined>;
17628
+ protected readonly isBar3D: _angular_core.Signal<boolean>;
17629
+ protected readonly isRadar: _angular_core.Signal<boolean>;
17630
+ protected readonly isSurface: _angular_core.Signal<boolean>;
17183
17631
  /**
17184
17632
  * Read from the primary value axis's `majorGridlines`, matching what the
17185
17633
  * cartesian renderer actually draws; `style.hasGridlines` alone is a legacy
@@ -17192,6 +17640,9 @@ declare class ChartDisplayOptionsComponent {
17192
17640
  protected onLegendPosition(event: Event): void;
17193
17641
  protected onToggleGridlines(event: Event): void;
17194
17642
  protected onToggleDataLabels(event: Event): void;
17643
+ protected onBar3DShape(event: Event): void;
17644
+ protected onRadarStyle(event: Event): void;
17645
+ protected onSurfaceWireframe(event: Event): void;
17195
17646
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChartDisplayOptionsComponent, never>;
17196
17647
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartDisplayOptionsComponent, "pptx-chart-display-options", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, { "elementChange": "elementChange"; }, never, never, true, never>;
17197
17648
  }
@@ -17255,11 +17706,19 @@ declare class ChartAxisStyleOptionsComponent {
17255
17706
  readonly element: _angular_core.InputSignal<ChartPptxElement>;
17256
17707
  readonly canEdit: _angular_core.InputSignal<boolean>;
17257
17708
  readonly elementChange: _angular_core.OutputEmitterRef<ChartPptxElement>;
17709
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
17710
+ private readonly recentColors;
17258
17711
  protected readonly dashOptions: readonly ChartOption<ChartGridlineDashValue>[];
17259
17712
  protected readonly gridlineKinds: readonly ["major", "minor"];
17713
+ /**
17714
+ * Record the committed (native `change`, not the live-preview `input`)
17715
+ * colour into the shared "Recent colours" list.
17716
+ */
17717
+ protected pushRecentColor(event: Event): void;
17260
17718
  protected readonly rows: _angular_core.Signal<AxisRow[]>;
17261
17719
  protected gridlineEnabled(axis: PptxChartAxisFormatting, which: 'major' | 'minor'): boolean;
17262
17720
  protected gridlineSpPr(axis: PptxChartAxisFormatting, which: 'major' | 'minor'): pptx_viewer_core.PptxChartShapeProps | undefined;
17721
+ protected gridDash(axis: PptxChartAxisFormatting, which: 'major' | 'minor'): string;
17263
17722
  protected onLogScale(axisType: PptxChartAxisType, axis: PptxChartAxisFormatting, event: Event): void;
17264
17723
  protected onLogBase(axisType: PptxChartAxisType, event: Event): void;
17265
17724
  protected onTitleFont(axisType: PptxChartAxisType, event: Event): void;
@@ -17278,7 +17737,14 @@ declare class ChartMarkerOptionsComponent {
17278
17737
  readonly canEdit: _angular_core.InputSignal<boolean>;
17279
17738
  readonly elementChange: _angular_core.OutputEmitterRef<ChartPptxElement>;
17280
17739
  protected readonly symbolOptions: readonly ChartOption<ChartMarkerSymbolValue>[];
17740
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
17741
+ private readonly recentColors;
17281
17742
  protected readonly series: _angular_core.Signal<PptxChartSeries[]>;
17743
+ /**
17744
+ * Record the committed (native `change`, not the live-preview `input`)
17745
+ * colour into the shared "Recent colours" list.
17746
+ */
17747
+ protected pushRecentColor(event: Event): void;
17282
17748
  protected readonly supported: _angular_core.Signal<boolean>;
17283
17749
  protected onSymbol(index: number, event: Event): void;
17284
17750
  protected onSize(index: number, event: Event): void;
@@ -17304,7 +17770,14 @@ declare class ChartDatapointMarkerOptionsComponent {
17304
17770
  readonly canEdit: _angular_core.InputSignal<boolean>;
17305
17771
  readonly elementChange: _angular_core.OutputEmitterRef<ChartPptxElement>;
17306
17772
  protected readonly symbolOptions: ChartOption<ChartMarkerSymbolValue>[];
17773
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
17774
+ private readonly recentColors;
17307
17775
  private readonly seriesIndex;
17776
+ /**
17777
+ * Record the committed (native `change`, not the live-preview `input`)
17778
+ * colour into the shared "Recent colours" list.
17779
+ */
17780
+ protected pushRecentColor(event: Event): void;
17308
17781
  protected readonly series: _angular_core.Signal<PptxChartSeries[]>;
17309
17782
  protected readonly categories: _angular_core.Signal<string[]>;
17310
17783
  /** Clamp the picker: removing a series must not strand the index past the end. */
@@ -18175,47 +18648,6 @@ declare class CommentMarkersOverlayComponent {
18175
18648
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CommentMarkersOverlayComponent, "pptx-comment-markers-overlay", never, { "comments": { "alias": "comments"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; }, { "markerClick": "markerClick"; }, never, never, true, never>;
18176
18649
  }
18177
18650
 
18178
- declare class CommentsPanelComponent {
18179
- /** The active slide's comments (already filtered to the active slide). */
18180
- readonly comments: _angular_core.InputSignal<PptxComment[]>;
18181
- private readonly translate;
18182
- /** Display name shown in the compose label ("Commenting as …"). */
18183
- readonly authorName: _angular_core.InputSignal<string>;
18184
- /** Emits the trimmed comment text the user wants to add. */
18185
- readonly add: _angular_core.OutputEmitterRef<string>;
18186
- /** Emits the id of a comment the user wants to remove. */
18187
- readonly remove: _angular_core.OutputEmitterRef<string>;
18188
- /** Emits the id of a comment whose resolved flag should toggle. */
18189
- readonly resolve: _angular_core.OutputEmitterRef<string>;
18190
- /** Emits the parent comment id + trimmed text of a threaded reply. */
18191
- readonly reply: _angular_core.OutputEmitterRef<{
18192
- parentId: string;
18193
- text: string;
18194
- }>;
18195
- /** Current text typed into the compose textarea. */
18196
- readonly draft: _angular_core.WritableSignal<string>;
18197
- /** Whether the draft has non-whitespace content (enables the submit button). */
18198
- readonly canAdd: _angular_core.Signal<boolean>;
18199
- /** Id of the comment whose reply composer is open (one at a time). */
18200
- readonly replyingTo: _angular_core.WritableSignal<string | null>;
18201
- /** Current text typed into the open reply composer. */
18202
- readonly replyDraft: _angular_core.WritableSignal<string>;
18203
- /** Whether the reply draft has content (enables the reply submit button). */
18204
- readonly canReply: _angular_core.Signal<boolean>;
18205
- onDraftInput(event: Event): void;
18206
- submit(event: Event): void;
18207
- /** Localized reply-composer placeholder ("Reply to <author>..."). */
18208
- replyPlaceholder(comment: PptxComment): string;
18209
- /** Open the reply composer under `parentId` (closing any other composer). */
18210
- startReply(parentId: string): void;
18211
- cancelReply(): void;
18212
- onReplyInput(event: Event): void;
18213
- submitReply(parentId: string): void;
18214
- formatTimestamp(value: string | undefined): string;
18215
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<CommentsPanelComponent, never>;
18216
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CommentsPanelComponent, "pptx-comments-panel", never, { "comments": { "alias": "comments"; "required": false; "isSignal": true; }; "authorName": { "alias": "authorName"; "required": false; "isSignal": true; }; }, { "add": "add"; "remove": "remove"; "resolve": "resolve"; "reply": "reply"; }, never, never, true, never>;
18217
- }
18218
-
18219
18651
  declare class CommentsService {
18220
18652
  /**
18221
18653
  * The active slide's comments (the deck slice for `activeSlideIndex`).
@@ -18430,10 +18862,15 @@ declare class ActionSettingsPanelComponent {
18430
18862
  protected actionFor(trigger: Trigger): ElementAction | undefined;
18431
18863
  /** The action type this trigger's controls should render right now. */
18432
18864
  protected typeFor(trigger: Trigger): ElementActionType;
18865
+ /** `data.customShows`, for the `customShow` type's target `<select>`. */
18866
+ private readonly loader;
18867
+ protected readonly customShows: _angular_core.Signal<readonly PptxCustomShow[]>;
18433
18868
  private update;
18434
18869
  protected onType(event: Event, trigger: Trigger): void;
18435
- protected onUrl(event: Event, trigger: Trigger): void;
18436
- protected onSlide(event: Event, trigger: Trigger): void;
18870
+ protected onUrl(url: string, trigger: Trigger): void;
18871
+ protected onSlide(oneBasedSlide: number, trigger: Trigger): void;
18872
+ protected onCustomShow(customShowId: string, trigger: Trigger): void;
18873
+ protected onReturnAfter(returnAfter: boolean, trigger: Trigger): void;
18437
18874
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ActionSettingsPanelComponent, never>;
18438
18875
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ActionSettingsPanelComponent, "pptx-action-settings-panel", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; }, { "patch": "patch"; }, never, never, true, never>;
18439
18876
  }
@@ -18445,6 +18882,8 @@ type ImageElement = PptxElement & {
18445
18882
  declare class ImagePropertiesPanelComponent {
18446
18883
  readonly element: _angular_core.InputSignal<PptxElement>;
18447
18884
  readonly patch: _angular_core.OutputEmitterRef<Partial<PptxElement>>;
18885
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
18886
+ private readonly recentColors;
18448
18887
  protected readonly image: _angular_core.Signal<ImageElement>;
18449
18888
  protected readonly effects: _angular_core.Signal<PptxImageEffects>;
18450
18889
  protected readonly artisticEffects: readonly [readonly ["none", "pptx.image.effectNone", ""], readonly ["blur", "pptx.image.effectBlur", "blur(4px)"], readonly ["grayscale", "pptx.image.effectGrayscale", "grayscale(100%)"], readonly ["sepia", "pptx.image.effectSepia", "sepia(100%)"], readonly ["pencilSketch", "pptx.image.effectPencilSketch", "grayscale(100%) contrast(150%) brightness(80%)"], readonly ["lineDrawing", "pptx.image.effectLineDrawing", "grayscale(100%) contrast(150%)"], readonly ["watercolorSponge", "pptx.image.effectWatercolor", "saturate(150%) blur(1px)"], readonly ["paintStrokes", "pptx.image.effectPaintStrokes", "blur(3px) saturate(140%)"], readonly ["glow_edges", "pptx.image.effectGlowEdges", "contrast(180%) invert(5%) brightness(110%)"], readonly ["glowDiffused", "pptx.image.effectGlowDiffused", "blur(3px) brightness(120%)"], readonly ["cement", "pptx.image.effectCement", "contrast(200%) brightness(60%)"], readonly ["photocopy", "pptx.image.effectPhotocopy", "grayscale(100%) contrast(200%) brightness(120%)"], readonly ["filmGrain", "pptx.image.effectFilmGrain", "contrast(110%) brightness(105%)"], readonly ["mosaic", "pptx.image.effectMosaic", "blur(8px) contrast(105%)"], readonly ["chalkSketch", "pptx.image.effectChalk", "grayscale(80%) contrast(140%) brightness(110%)"], readonly ["marker", "pptx.image.effectMarker", "contrast(130%) saturate(130%)"], readonly ["cutout", "pptx.image.effectCutout", "contrast(300%) brightness(120%)"], readonly ["pastelsSmooth", "pptx.image.effectPastels", "blur(4px) saturate(120%)"], readonly ["paint", "pptx.image.effectPaint", "blur(3px) saturate(160%) contrast(110%)"], readonly ["plasticWrap", "pptx.image.effectPlasticWrap", "contrast(150%) brightness(115%) saturate(80%)"], readonly ["lightScreen", "pptx.image.effectLightScreen", "brightness(130%) contrast(80%)"], readonly ["sharpen", "pptx.image.effectSharpen", "contrast(160%) brightness(105%)"], readonly ["texturizer", "pptx.image.effectTexturizer", "contrast(110%) brightness(105%)"], readonly ["crisscrossEtching", "pptx.image.effectCrisscross", "grayscale(60%) contrast(120%)"]];
@@ -19441,7 +19880,7 @@ declare class AccountPageComponent {
19441
19880
  readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
19442
19881
  private readonly translate;
19443
19882
  protected readonly swatches: readonly string[];
19444
- protected readonly version = "3.3.0";
19883
+ protected readonly version = "3.5.0";
19445
19884
  protected readonly profile: _angular_core.WritableSignal<ViewerProfile>;
19446
19885
  protected readonly initial: _angular_core.Signal<string>;
19447
19886
  protected readonly usage: _angular_core.WritableSignal<LocalStorageUsageSummary | null>;
@@ -19866,20 +20305,20 @@ declare class PresentationToolbarComponent {
19866
20305
  * (`getSlideTransitionAnimations`, including the exotic/3-D 2-D approximations
19867
20306
  * that originated here) now lives in shared and is consumed by every binding.
19868
20307
  *
19869
- * Angular keeps its OWN duration policy locally: the presentation overlay floors
19870
- * very short authored durations and uses a smaller default than React/Vue, so
19871
- * `MIN_TRANSITION_DURATION_MS` / `DEFAULT_TRANSITION_DURATION_MS` /
19872
- * `resolveTransitionDuration` are defined here rather than re-exported from
19873
- * shared (whose `DEFAULT_TRANSITION_DURATION_MS` is the larger React/Vue value).
19874
- *
19875
- * `PresentationTransitionOverlayComponent` imports the same symbol names from
19876
- * here unchanged.
20308
+ * The presentation overlay's duration comes from the shared resolver
20309
+ * (`resolveTransitionDurationMs`), exactly as in the other four bindings, so
20310
+ * an authored `p14:dur`, the legacy `spd` token and the COM-verified defaults
20311
+ * all play at PowerPoint's speed here too. The older local floor/default
20312
+ * policy (`MIN_TRANSITION_DURATION_MS` / `DEFAULT_TRANSITION_DURATION_MS` /
20313
+ * `resolveTransitionDuration`) stays exported for callers that adopted it, but
20314
+ * the overlay no longer consults it.
19877
20315
  */
19878
20316
 
19879
20317
  /**
19880
- * Resolve the effective transition duration (ms) from an optional authored
19881
- * value, applying the minimum floor and a sensible default. Mirrors the React
19882
- * `executeSlideTransition` clamping (`Math.max(120, durationMs || 320)`).
20318
+ * Resolve an effective duration (ms) from an optional authored value, applying
20319
+ * the minimum floor and the local default. Kept as a public helper; the
20320
+ * presentation overlay resolves through the shared
20321
+ * {@link resolveOverlayDurationMs} instead, which is what plays on screen.
19883
20322
  */
19884
20323
  declare function resolveTransitionDuration(durationMs: number | undefined): number;
19885
20324
 
@@ -20003,6 +20442,15 @@ declare class PresentationTransitionOverlayComponent {
20003
20442
  protected readonly crossfadeGroups: _angular_core.Signal<MorphCrossfadeGroupSlides[]>;
20004
20443
  /** Layer container style: animation + stacking relative to the stage. */
20005
20444
  protected readonly layerStyle: _angular_core.Signal<StyleMap>;
20445
+ /**
20446
+ * The arriving slide rendered ABOVE the outgoing layer for a classic
20447
+ * transition, carrying the incoming animation (wipe/cover/fade/push), or
20448
+ * `undefined` for morphs and the uncover family (which reveal the live
20449
+ * stage instead).
20450
+ */
20451
+ protected readonly incomingLayerSlide: _angular_core.Signal<PptxSlide | undefined>;
20452
+ /** Style for that arriving layer: the incoming animation + its stacking. */
20453
+ protected readonly incomingLayerStyle: _angular_core.Signal<StyleMap>;
20006
20454
  /**
20007
20455
  * Slide box sized to the ZOOMED slide footprint, matching the stage's own
20008
20456
  * `pptx-slide-canvas`. The inner canvas renders at the same `zoom` with
@@ -20058,6 +20506,12 @@ declare class PresenterViewComponent {
20058
20506
  * forward press lands on is the show's next member, not `index + 1`.
20059
20507
  */
20060
20508
  readonly activeCustomShow: _angular_core.InputSignal<ShowOrderCustomShow | null>;
20509
+ /**
20510
+ * The deck's authored `p:showPr/p:sldRg` slide-range restriction, or null
20511
+ * for the whole deck. The next-slide preview must honour it the same way it
20512
+ * honours {@link activeCustomShow}.
20513
+ */
20514
+ readonly authoredRange: _angular_core.InputSignal<AuthoredSlideRange | null>;
20061
20515
  readonly canvasSize: _angular_core.InputSignal<CanvasSize>;
20062
20516
  readonly templateElements: _angular_core.InputSignal<readonly PptxElement[]>;
20063
20517
  readonly mediaDataUrls: _angular_core.InputSignal<Map<string, string>>;
@@ -20132,7 +20586,7 @@ declare class PresenterViewComponent {
20132
20586
  protected onSwapDisplays(): void;
20133
20587
  private withTemplate;
20134
20588
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PresenterViewComponent, never>;
20135
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresenterViewComponent, "pptx-presenter-view", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "currentSlideIndex": { "alias": "currentSlideIndex"; "required": true; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "presentationStartTime": { "alias": "presentationStartTime"; "required": false; "isSignal": true; }; "isAudienceWindowOpen": { "alias": "isAudienceWindowOpen"; "required": false; "isSignal": true; }; }, { "movePresentationSlide": "movePresentationSlide"; "exit": "exit"; "openAudienceWindow": "openAudienceWindow"; "closeAudienceWindow": "closeAudienceWindow"; "navigateToSlide": "navigateToSlide"; }, never, never, true, never>;
20589
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresenterViewComponent, "pptx-presenter-view", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "currentSlideIndex": { "alias": "currentSlideIndex"; "required": true; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "authoredRange": { "alias": "authoredRange"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "presentationStartTime": { "alias": "presentationStartTime"; "required": false; "isSignal": true; }; "isAudienceWindowOpen": { "alias": "isAudienceWindowOpen"; "required": false; "isSignal": true; }; }, { "movePresentationSlide": "movePresentationSlide"; "exit": "exit"; "openAudienceWindow": "openAudienceWindow"; "closeAudienceWindow": "closeAudienceWindow"; "navigateToSlide": "navigateToSlide"; }, never, never, true, never>;
20136
20590
  }
20137
20591
 
20138
20592
  /**
@@ -20161,6 +20615,12 @@ declare class MobilePresenterViewComponent {
20161
20615
  * forward press lands on is the show's next member, not `index + 1`.
20162
20616
  */
20163
20617
  readonly activeCustomShow: _angular_core.InputSignal<ShowOrderCustomShow | null>;
20618
+ /**
20619
+ * The deck's authored `p:showPr/p:sldRg` slide-range restriction, or null
20620
+ * for the whole deck. The next-slide preview must honour it the same way it
20621
+ * honours {@link activeCustomShow}.
20622
+ */
20623
+ readonly authoredRange: _angular_core.InputSignal<AuthoredSlideRange | null>;
20164
20624
  readonly canvasSize: _angular_core.InputSignal<CanvasSize>;
20165
20625
  readonly templateElements: _angular_core.InputSignal<readonly PptxElement[]>;
20166
20626
  readonly mediaDataUrls: _angular_core.InputSignal<Map<string, string>>;
@@ -20186,7 +20646,7 @@ declare class MobilePresenterViewComponent {
20186
20646
  }>;
20187
20647
  private withTemplate;
20188
20648
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobilePresenterViewComponent, never>;
20189
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobilePresenterViewComponent, "pptx-mobile-presenter-view", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "currentSlideIndex": { "alias": "currentSlideIndex"; "required": true; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "presentationStartTime": { "alias": "presentationStartTime"; "required": false; "isSignal": true; }; }, { "movePresentationSlide": "movePresentationSlide"; "exit": "exit"; }, never, never, true, never>;
20649
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobilePresenterViewComponent, "pptx-mobile-presenter-view", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "currentSlideIndex": { "alias": "currentSlideIndex"; "required": true; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "authoredRange": { "alias": "authoredRange"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "presentationStartTime": { "alias": "presentationStartTime"; "required": false; "isSignal": true; }; }, { "movePresentationSlide": "movePresentationSlide"; "exit": "exit"; }, never, never, true, never>;
20190
20650
  }
20191
20651
 
20192
20652
  /**
@@ -21000,6 +21460,8 @@ declare class SmartArtPropertiesComponent {
21000
21460
  readonly canEdit: _angular_core.InputSignal<boolean>;
21001
21461
  /** Emits a complete new data model after any edit. */
21002
21462
  readonly smartArtDataChange: _angular_core.OutputEmitterRef<PptxSmartArtData>;
21463
+ /** Optional: absent in a standalone unit test with no viewer-level DI tree. */
21464
+ private readonly recentColors;
21003
21465
  protected readonly layoutTypes: readonly SmartArtLayoutType[];
21004
21466
  protected readonly colorSchemes: readonly SmartArtColorScheme[];
21005
21467
  protected readonly styleOptions: readonly SmartArtStyle[];
@@ -21230,6 +21692,9 @@ declare class RibbonColorPopoverComponent {
21230
21692
  readonly titleKey: _angular_core.InputSignal<string>;
21231
21693
  readonly swatchAriaKey: _angular_core.InputSignal<string>;
21232
21694
  readonly pick: _angular_core.OutputEmitterRef<string>;
21695
+ protected readonly recentColors: RecentColorsService;
21696
+ /** Every commit through this popover both fires `pick` and records the colour as recently used. */
21697
+ protected onPick(color: string): void;
21233
21698
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonColorPopoverComponent, never>;
21234
21699
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonColorPopoverComponent, "pptx-ribbon-color-popover", never, { "current": { "alias": "current"; "required": false; "isSignal": true; }; "presets": { "alias": "presets"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "titleKey": { "alias": "titleKey"; "required": false; "isSignal": true; }; "swatchAriaKey": { "alias": "swatchAriaKey"; "required": false; "isSignal": true; }; }, { "pick": "pick"; }, never, ["*"], true, never>;
21235
21700
  }