pptx-angular-viewer 1.31.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,10 @@
1
1
  import * as pptx_viewer_core from 'pptx-viewer-core';
2
- import { PptxSlide, PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxChartSeries, PptxChartData, PptxElementAnimation, PptxAnimationPreset, PptxAnimationDirection, PptxAnimationRepeatMode, PptxAnimationSequence, PptxAnimationTimingCurve, PptxAnimationTrigger, TablePptxElement, PptxSection, OlePptxElement, TextSegment, TextStyle, PptxTransitionType, SmartArtColorScheme, PptxSmartArtChrome, PptxSmartArtDrawingShape, SmartArtStyle, PptxSmartArtData, PptxEmbeddedFont, SmartArtLayout, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, InkPptxElement, PptxComment, PptxChartType, PptxHeaderFooter, PptxTheme, PptxSlideMaster, PptxNotesMaster, PptxHandoutMaster, PptxPresentationProperties, PptxCoreProperties, PptxAppProperties, PptxThemeOption, PptxCustomProperty, ParsedSignature, PptxSaveFormat, PptxTableCell, PptxTableCellStyle, PptxTableRow, PptxTableData, PptxCustomShow, PptxThemePreset, PptxThemeColorScheme, PptxThemeFontScheme, MasterViewTab, SvgExportOptions, PptxData, Model3DPptxElement, ZoomPptxElement, PptxSlideTransition, ChartPptxElement, MediaPptxElement, SmartArtPptxElement, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, SignatureStatus, ElementActionType, ElementAction, PptxImageEffects, MediaBookmark, ColorMapAliasKey, ChartAxisEdit, ChartDataPointLabelEdit, PptxChartLegendPosition, PptxChartStyle, ChartAxisTitleStyleEdit, ChartGridlineStyleEdit, PptxChartMarkerSymbol, PptxSmartArtNode, SmartArtLayoutType, PptxSmartArtNodeStyle, MediaCaptionTrack, PptxMediaType } from 'pptx-viewer-core';
2
+ import { PptxThemePreset, PptxSlide, PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxChartSeries, PptxChartData, PptxElementAnimation, PptxAnimationPreset, PptxAnimationDirection, PptxAnimationRepeatMode, PptxAnimationSequence, PptxAnimationTimingCurve, PptxAnimationTrigger, ParsedTableStyleMap, PptxThemeColorScheme, PptxThemeFontScheme, TablePptxElement, PptxSection, OlePptxElement, TextSegment, TextStyle, PptxTransitionType, SmartArtColorScheme, PptxSmartArtChrome, PptxSmartArtDrawingShape, SmartArtStyle, PptxSmartArtData, PptxEmbeddedFont, SmartArtLayout, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, InkPptxElement, PptxComment, PptxChartType, PptxTheme, PptxHandler, PptxData, PptxHeaderFooter, PptxSlideMaster, PptxNotesMaster, PptxHandoutMaster, PptxPresentationProperties, PptxCoreProperties, PptxAppProperties, PptxThemeOption, PptxCustomProperty, ParsedSignature, PptxSaveFormat, PptxTableCell, PptxTableCellStyle, PptxTableRow, PptxTableData, PptxCustomShow, MasterViewTab, SvgExportOptions, Model3DPptxElement, ZoomPptxElement, PptxSlideTransition, ChartPptxElement, MediaPptxElement, SmartArtPptxElement, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, SignatureStatus, ElementActionType, ElementAction, PptxImageEffects, MediaBookmark, ColorMapAliasKey, ChartAxisEdit, ChartDataPointLabelEdit, PptxChartLegendPosition, PptxChartStyle, ChartAxisTitleStyleEdit, ChartGridlineStyleEdit, PptxChartMarkerSymbol, PptxSmartArtNode, SmartArtLayoutType, PptxSmartArtNodeStyle, MediaCaptionTrack, PptxMediaType } from 'pptx-viewer-core';
3
3
  export { SWITCHABLE_LAYOUT_TYPES, addSmartArtNode, addSmartArtNodeAsChild, chartDataAddCategory, chartDataAddSeries, chartDataChangeType, chartDataRemoveCategory, chartDataRemoveSeries, chartDataUpdatePoint, demoteSmartArtNode, promoteSmartArtNode, removeSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, updateSmartArtNodeText } from 'pptx-viewer-core';
4
4
  import * as _angular_core from '@angular/core';
5
5
  import { Signal, WritableSignal, OnDestroy, OnInit, OnChanges, SimpleChanges, InjectionToken, Provider } from '@angular/core';
6
+ import * as AiSdk from 'ai';
7
+ import { LanguageModel, ChatTransport, UIMessage, ToolSet } from 'ai';
6
8
  import * as pptx_angular_viewer from 'pptx-angular-viewer';
7
9
  import { TranslateService } from '@ngx-translate/core';
8
10
  import { Options } from 'html2canvas-pro';
@@ -152,6 +154,29 @@ declare const THEME_CATALOG: readonly ThemeCatalogEntry[];
152
154
  /** Look up a catalog entry by key, falling back to `undefined` (the built-in default) if not found. */
153
155
  declare function resolveThemeCatalogEntry(key: string | undefined, catalog?: readonly ThemeCatalogEntry[]): ViewerTheme | undefined;
154
156
 
157
+ /**
158
+ * theme-gallery-presets: the exact theme set shown in the Design tab's Browse
159
+ * Themes gallery, shared by every binding.
160
+ *
161
+ * This is a DIFFERENT set from core's `THEME_PRESETS`: it adds Wisp, Berlin,
162
+ * Slice, and Dividend and omits Slate and Metropolitan, in this order:
163
+ *
164
+ * office, facet, integral, ion, retrospect, organic,
165
+ * wisp, berlin, slice, dividend
166
+ *
167
+ * The six themes that also exist in core (office, facet, integral, ion,
168
+ * organic, retrospect) are reused verbatim from core's `THEME_PRESETS` (looked
169
+ * up by id) so their colour/font schemes stay canonical. The four gallery-only
170
+ * themes are defined here as `PptxThemePreset` values with core's nested
171
+ * `{ majorFont: { latin }, minorFont: { latin } }` font-scheme shape.
172
+ */
173
+
174
+ /**
175
+ * The gallery theme set, in canonical order. Six canonical core presets plus
176
+ * the four gallery-only additions.
177
+ */
178
+ declare const GALLERY_THEME_PRESETS: readonly PptxThemePreset[];
179
+
155
180
  /**
156
181
  * Framework-agnostic public types shared by the viewer bindings.
157
182
  *
@@ -532,6 +557,20 @@ interface LineShadowParams {
532
557
  color: string;
533
558
  opacity: number;
534
559
  }
560
+ /**
561
+ * A fill-overlay tint layer: the overlay {@link https://developer.mozilla.org/en-US/docs/Web/CSS/color colour}
562
+ * (an `rgba()` string carrying the overlay's alpha) plus the `mix-blend-mode`
563
+ * used to composite it over the element. Unlike the whole-element
564
+ * {@link getEffectDagBlendMode} proxy, this describes a *separate* coloured
565
+ * layer the integrator should paint on top of the element (e.g. an absolutely
566
+ * positioned pseudo-element / child), so the tint colour is actually rendered.
567
+ */
568
+ interface FillOverlayCss {
569
+ /** Overlay colour as an `rgba()`/hex string (already includes opacity). */
570
+ color: string;
571
+ /** `mix-blend-mode` for the overlay layer (`normal` for the `over` blend). */
572
+ blendMode: string;
573
+ }
535
574
 
536
575
  /**
537
576
  * Text warp / WordArt logic — Vue port of the React
@@ -933,6 +972,13 @@ interface ChartViewModel {
933
972
  * hierarchical kinds, where a vertical drag has no single-value meaning.
934
973
  */
935
974
  valueDrag?: ChartValueDrag;
975
+ /**
976
+ * Drawing-overlay primitives resolved from the chart's `c:userShapes`
977
+ * (shapes/text drawn on top of the plot). Already appended to `primitives`;
978
+ * surfaced separately so projectors can segregate them if desired. Absent
979
+ * when the chart has no overlay.
980
+ */
981
+ userShapes?: SvgPrimitive[];
936
982
  }
937
983
  declare function buildGridlinesAndLabels(range: ValueRange, layout: PlotLayout): {
938
984
  gridlines: SvgLine[];
@@ -1459,6 +1505,83 @@ declare function revealedElementStyles(groups: readonly AnimationClickGroup[], s
1459
1505
  */
1460
1506
  declare function pendingElementStyles(groups: readonly AnimationClickGroup[], step: number): Map<string, CSSProperties>;
1461
1507
 
1508
+ /**
1509
+ * `animation-timeline-types` — pure interfaces for the native-animation
1510
+ * (OOXML `p:timing` tree) playback engine shared by every binding.
1511
+ *
1512
+ * These describe the *parsed* native animation model (`PptxNativeAnimation`,
1513
+ * driven by `presetClass` / `presetId`), as opposed to the editor-level
1514
+ * {@link import('./animation-css').AnimationCssResult} model in `animation-css`
1515
+ * (driven by `PptxElementAnimation` preset strings). Both coexist in shared.
1516
+ *
1517
+ * @module render/animation-timeline-types
1518
+ */
1519
+
1520
+ /**
1521
+ * Normalized staged-reveal mode for a chart graphic frame, derived from the
1522
+ * OOXML `a:bldChart/@bld` (or `p:bldOleChart/@bld`) token:
1523
+ * - `asOne` the whole chart appears at once (`allAtOnce`).
1524
+ * - `bySeries` one data series is revealed per stage (`series`).
1525
+ * - `byCategory` one category is revealed per stage (`category`).
1526
+ * - `byElement` one series/category ELEMENT is revealed per stage
1527
+ * (`seriesElement` / `categoryElement`).
1528
+ */
1529
+ type ChartBuildMode = 'asOne' | 'bySeries' | 'byCategory' | 'byElement';
1530
+ /**
1531
+ * Normalized staged-reveal mode for a SmartArt diagram, derived from the OOXML
1532
+ * `a:bldDgm/@bld` or `p:bldDgm/@bld` token:
1533
+ * - `asOne` the whole diagram appears at once (`whole` / `allAtOnce`).
1534
+ * - `byOne` one node is revealed per stage (`one`, and the assorted
1535
+ * `depthBy*` / `breadthBy*` / directional traversals).
1536
+ * - `byLvl` levels are revealed one element at a time (`lvlOne`).
1537
+ * - `byLvlAtOnce` a whole level is revealed per stage (`lvlAtOnce`).
1538
+ */
1539
+ type DiagramBuildMode = 'asOne' | 'byOne' | 'byLvl' | 'byLvlAtOnce';
1540
+ /**
1541
+ * Playback-time staged-build state surfaced on {@link ElementAnimationState}.
1542
+ * `progress` is the 0..1 fraction of the build revealed at the current playback
1543
+ * time; a consumer maps it to its own item COUNT (see `revealedStageCount`).
1544
+ */
1545
+ type ElementBuildState = {
1546
+ kind: 'chart';
1547
+ mode: ChartBuildMode;
1548
+ progress: number;
1549
+ } | {
1550
+ kind: 'diagram';
1551
+ mode: DiagramBuildMode;
1552
+ progress: number;
1553
+ };
1554
+ /** Snapshot of a single element's animation state at a point in the timeline. */
1555
+ interface ElementAnimationState {
1556
+ /** Whether the element should be visible. */
1557
+ visible: boolean;
1558
+ /** CSS animation shorthand to apply (undefined = no active animation). */
1559
+ cssAnimation: string | undefined;
1560
+ /**
1561
+ * Staged-build reveal state, present only when the active animation builds a
1562
+ * chart or SmartArt diagram in stages (`p:bldChart` / `p:bldDgm`) rather than
1563
+ * revealing the whole element at once. A staged renderer multiplies
1564
+ * `build.progress` (0..1) by its own series / category / level COUNT to
1565
+ * decide how many stages are revealed at the current playback time; see
1566
+ * {@link import('./animation-build').revealedStageCount}. Absent for ordinary
1567
+ * whole-element entrances, so existing renderers are unaffected.
1568
+ */
1569
+ build?: ElementBuildState;
1570
+ /**
1571
+ * True when an active `p:animClr` color animation targets this shape's fill.
1572
+ * A vector renderer should then paint the fill with `fill: inherit` so the
1573
+ * wrapper-level colour keyframes cascade to the SVG path. Absent/false means
1574
+ * no active fill-colour animation.
1575
+ */
1576
+ animatesFill?: boolean;
1577
+ /**
1578
+ * True when an active `p:animClr` color animation targets this shape's
1579
+ * stroke. A vector renderer should then paint the stroke with
1580
+ * `stroke: inherit`. Absent/false means no active stroke-colour animation.
1581
+ */
1582
+ animatesStroke?: boolean;
1583
+ }
1584
+
1462
1585
  /**
1463
1586
  * table-style.ts — framework-agnostic table render helpers.
1464
1587
  *
@@ -1481,6 +1604,25 @@ declare function pendingElementStyles(groups: readonly AnimationClickGroup[], st
1481
1604
  * passed to {@link getTableCellBandStyle}.
1482
1605
  */
1483
1606
 
1607
+ /**
1608
+ * Context for resolving table style section fills and text properties from
1609
+ * the PPTX theme's colour scheme.
1610
+ *
1611
+ * Both fields are optional so callers that don't have the theme wired in yet
1612
+ * can omit the context and the function falls back to hardcoded colours.
1613
+ */
1614
+ interface TableStyleContext {
1615
+ /** Parsed table style map (from `ppt/tableStyles.xml`). */
1616
+ tableStyleMap?: ParsedTableStyleMap;
1617
+ /** Theme colour scheme from the active PPTX theme. */
1618
+ colorScheme?: PptxThemeColorScheme;
1619
+ /**
1620
+ * Theme font scheme from the active PPTX theme. Supplied so a table
1621
+ * style's `a:fontRef@idx` (`minor`/`major`) can resolve to a concrete
1622
+ * font family. Optional: when absent, `fontRefIdx` is left unresolved.
1623
+ */
1624
+ fontScheme?: PptxThemeFontScheme;
1625
+ }
1484
1626
  /** Map an OOXML `a:prstDash/@val` value to a CSS `border-style` keyword. */
1485
1627
  declare function ooxmlDashToCssBorderStyle(dashVal: string | undefined): string;
1486
1628
  /**
@@ -2490,6 +2632,14 @@ interface ConnectorRouting {
2490
2632
  interface MarkerShape {
2491
2633
  shape: 'path' | 'circle';
2492
2634
  d?: string;
2635
+ /**
2636
+ * Suggested `markerWidth` (along the line: arrow *length*). Derived from the
2637
+ * connector's `@len` size token. Bindings should apply this instead of a
2638
+ * hard-coded value so `sm`/`lg` arrows scale. Defaults to the historical `4`.
2639
+ */
2640
+ markerWidth: number;
2641
+ /** Suggested `markerHeight` (perpendicular: arrow *width*, from `@w`). */
2642
+ markerHeight: number;
2493
2643
  }
2494
2644
  /** All derived connector rendering values, computed from a `PptxElement`. */
2495
2645
  interface ConnectorGeometry {
@@ -2864,7 +3014,7 @@ interface SlideTransitionAnimations {
2864
3014
  * faithful Office 2010 (`p14`) keyframes, so both the classic and exotic / 3-D
2865
3015
  * transitions animate wherever this single string is injected.
2866
3016
  */
2867
- 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";
3017
+ 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 out / unfold in) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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-origami-out { from { transform: perspective(1600px) rotateY(0deg) scaleX(1); transform-origin: left center; opacity: 1; } to { transform: perspective(1600px) rotateY(75deg) scaleX(.25); transform-origin: left center; opacity: .2; } }\n@keyframes pptx-tr-origami-in { from { transform: perspective(1600px) rotateY(-75deg) scaleX(.25); transform-origin: right center; opacity: .2; } to { transform: perspective(1600px) rotateY(0deg) scaleX(1); transform-origin: right center; opacity: 1; } }\n";
2868
3018
 
2869
3019
  /**
2870
3020
  * `slide-transition-css` — pure mapping from a {@link PptxSlideTransition}
@@ -2887,10 +3037,13 @@ declare const SLIDE_TRANSITION_KEYFRAMES = "\n/* \u2500\u2500 Fade \u2500\u2500\
2887
3037
  * `honeycomb`/`glitter`/`shred`/`flash`/`vortex`/`warp`/`wheelReverse`/`window`)
2888
3038
  * is rendered faithfully by delegating to {@link getP14TransitionAnimations}
2889
3039
  * (its `@keyframes` live in `p14-transition-keyframes` and are folded into
2890
- * `SLIDE_TRANSITION_KEYFRAMES`). The classic set and the newer p15 cinematic
2891
- * types with no dedicated keyframes (`cube`/`flip`/`rotate`/`orbit`/`fracture`/
2892
- * `peelOff`/`pageCurl*`/`airplane`/`origami`, etc.) fall back to a symmetrical
2893
- * cross-fade.
3040
+ * `SLIDE_TRANSITION_KEYFRAMES`). The newer Office 2013+ (p15) cinematic family
3041
+ * (`cube`/`flip`/`rotate`/`orbit`/`fallOver`/`drape`/`curtains`/`wind`/
3042
+ * `prestige`/`fracture`/`crush`/`peelOff`/`pageCurlSingle`/`pageCurlDouble`/
3043
+ * `airplane`/`origami`) is likewise rendered faithfully via
3044
+ * {@link getCinematicTransitionAnimations} (its `@keyframes` live in
3045
+ * `slide-transition-cinematic` as `CINEMATIC_TRANSITION_KEYFRAMES`). Only truly
3046
+ * unknown types fall back to a symmetrical cross-fade.
2894
3047
  *
2895
3048
  * Everything here is pure and unit-testable: no framework imports, no DOM.
2896
3049
  *
@@ -3463,6 +3616,35 @@ declare function buildBroadcastViewerUrl(roomId: string, serverUrl: string, loca
3463
3616
  /** Whether the runtime exposes a usable async clipboard write API. */
3464
3617
  declare function canUseClipboard(nav: Navigator | undefined): boolean;
3465
3618
 
3619
+ /**
3620
+ * share-form: framework-free helpers for the Share dialog's start/join form
3621
+ * (field seeding, validity, and CollaborationConfig assembly). Thin sugar over
3622
+ * the neutral session builders in `share-session`, exposing the binding-facing
3623
+ * names the Share dialogs already used. Shared by every binding; each re-exports
3624
+ * these through a thin shim so the SFC/DOM layer stays presentation-only.
3625
+ */
3626
+
3627
+ /** The share form's editable fields. */
3628
+ interface ShareFormFields {
3629
+ roomId: string;
3630
+ userName: string;
3631
+ serverUrl: string;
3632
+ }
3633
+ /** Optional seed values for the share start form. */
3634
+ interface ShareDefaults$1 {
3635
+ roomId?: string;
3636
+ userName?: string;
3637
+ serverUrl?: string;
3638
+ }
3639
+ /** Seed the form fields from the (optional) host-supplied defaults. */
3640
+ declare function seedShareFields(defaults?: ShareDefaults$1): ShareFormFields;
3641
+ /**
3642
+ * Whether the form can start a session: room id and display name are required
3643
+ * (after trimming); the server URL may be blank, which selects the serverless
3644
+ * webrtc peer-to-peer transport.
3645
+ */
3646
+ declare function canStartShare(fields: ShareFormFields): boolean;
3647
+
3466
3648
  /**
3467
3649
  * presenter-view.ts: pure presenter-view helpers shared across bindings.
3468
3650
  *
@@ -3514,6 +3696,82 @@ interface PresentationInkStroke {
3514
3696
  points: PresentationInkPoint[];
3515
3697
  }
3516
3698
 
3699
+ /**
3700
+ * audience-content-store: IndexedDB-based storage for sharing PPTX content
3701
+ * between the presenter tab and audience tab.
3702
+ *
3703
+ * When the presenter opens an audience window, the PPTX bytes are stored in
3704
+ * IndexedDB. The audience tab retrieves them on load and then cleans up.
3705
+ *
3706
+ * Framework-agnostic: every binding (React/Vue/Angular) re-exports these
3707
+ * symbols through a thin shim. The database, store, and key names are kept
3708
+ * identical across bindings so the cross-tab handoff stays wire-compatible
3709
+ * regardless of which binding opened the presenter window or renders the
3710
+ * audience tab.
3711
+ */
3712
+ /** URL hash that marks the current tab as the audience display. */
3713
+ declare const AUDIENCE_HASH = "#pptx-audience";
3714
+ /** Returns true if the current page was opened as an audience tab. */
3715
+ declare function isAudienceTab(): boolean;
3716
+ /**
3717
+ * Store PPTX content bytes so the audience tab can retrieve them.
3718
+ * Called by the presenter before opening the audience window.
3719
+ */
3720
+ declare function storeAudienceContent(content: ArrayBuffer | Uint8Array, sessionId?: string): Promise<void>;
3721
+ /**
3722
+ * Load PPTX content bytes stored by the presenter tab.
3723
+ * Returns `null` if nothing is stored.
3724
+ */
3725
+ declare function loadAudienceContent(sessionId?: string): Promise<Uint8Array | null>;
3726
+ /**
3727
+ * Remove stored audience content (cleanup).
3728
+ */
3729
+ declare function clearAudienceContent(sessionId?: string): Promise<void>;
3730
+
3731
+ /**
3732
+ * EyeDropper colour sampler (framework-agnostic).
3733
+ *
3734
+ * Prefers the native browser EyeDropper API (Chrome 95+ / Edge 95+). For
3735
+ * browsers without it (Firefox, Safari) a DOM-sampling fallback reads the
3736
+ * colour under the pointer via `elementFromPoint` + `getComputedStyle`, so the
3737
+ * eyedropper still works everywhere. Shared by every binding; each re-exports
3738
+ * these symbols through a thin shim.
3739
+ */
3740
+ /** A sampled colour, as hex plus its RGB channels. */
3741
+ interface EyedropperResult {
3742
+ hex: string;
3743
+ r: number;
3744
+ g: number;
3745
+ b: number;
3746
+ }
3747
+ /**
3748
+ * Returns true when the native EyeDropper API is available in this browser.
3749
+ * Guards against SSR / headless environments without `window`.
3750
+ */
3751
+ declare function eyedropperAvailable(): boolean;
3752
+ /**
3753
+ * Open the native EyeDropper and return the picked sRGB hex colour string
3754
+ * (e.g. `"#a3b4c5"`), or `null` when the user cancels or the API is absent.
3755
+ */
3756
+ declare function openNativeEyeDropper(): Promise<string | null>;
3757
+ /**
3758
+ * Sample the colour at a client-space point by inspecting the topmost element's
3759
+ * computed paint. Tries, in order: a real `<canvas>` pixel read (sharp for
3760
+ * rasterised content), then the element's `background-color`, SVG `fill`, and
3761
+ * finally text `color`. Returns `null` when nothing paintable is found.
3762
+ *
3763
+ * This is the DOM fallback used when the native EyeDropper API is unavailable;
3764
+ * it needs no canvas plumbing, so it works against the live slide DOM.
3765
+ */
3766
+ declare function sampleColorFromSlide(clientX: number, clientY: number): EyedropperResult | null;
3767
+ /**
3768
+ * Run the eyedropper fallback: arm a one-shot pointer listener and resolve with
3769
+ * the hex colour of the next click (or `null` if the user presses Escape). Used
3770
+ * only when {@link eyedropperAvailable} is false. The caller is responsible for
3771
+ * any "armed" UI affordance; this just manages the listeners.
3772
+ */
3773
+ declare function pickColorByClickFallback(): Promise<string | null>;
3774
+
3517
3775
  /**
3518
3776
  * smart-art-presets.ts: the SmartArt insert-gallery catalogue, shared across
3519
3777
  * bindings. Pure data + types; consumed by each binding's insert dialog and
@@ -4694,6 +4952,466 @@ declare function segmentFrameCount(durationMs: number, fps: number): number;
4694
4952
  /** DOM id of the managed `<style>` element the service injects into `<head>`. */
4695
4953
  declare const EMBEDDED_FONTS_STYLE_ID = "pptx-angular-embedded-fonts";
4696
4954
 
4955
+ /**
4956
+ * Structured element-level diff for AI change animations. Given the deck's
4957
+ * slides before and after an AI edit, {@link diffChangedElements} returns a flat
4958
+ * list of what changed per element (added / removed / moved / resized /
4959
+ * restyled / text), with the old and new bounds where relevant. A binding turns
4960
+ * that list into on-canvas motion (glide old->new, fade/scale in-out) plus a
4961
+ * glow-pulse highlight, so the user watches the edit happen.
4962
+ *
4963
+ * Pure and framework-agnostic: no DOM, no timing. The animator
4964
+ * ({@link createAiChangeAnimator}) owns timing; the binding owns rendering.
4965
+ */
4966
+
4967
+ /** What kind of change an element underwent. */
4968
+ type AiChangeKind = 'added' | 'removed' | 'moved' | 'resized' | 'restyled' | 'text';
4969
+ /** Axis-aligned bounds in slide (CSS pixel) coordinates. */
4970
+ interface AiChangeBounds {
4971
+ x: number;
4972
+ y: number;
4973
+ width: number;
4974
+ height: number;
4975
+ }
4976
+ /** One element's change, with old/new bounds for motion. */
4977
+ interface AiElementChange {
4978
+ slideIndex: number;
4979
+ elementId: string;
4980
+ kind: AiChangeKind;
4981
+ /** Bounds before the edit (present for removed / moved / resized). */
4982
+ from?: AiChangeBounds;
4983
+ /** Bounds after the edit (present for added / moved / resized / restyled / text). */
4984
+ to?: AiChangeBounds;
4985
+ }
4986
+
4987
+ /**
4988
+ * The AI change animator: the framework-agnostic bus that carries "these
4989
+ * elements just changed, animate them" from the AI apply path to whichever
4990
+ * binding is rendering the canvas. The AI write choke points call
4991
+ * {@link AiChangeAnimator.publish} with the slides before and after an edit; the
4992
+ * binding subscribes, reveals the affected slide, and plays the motion + glow
4993
+ * for {@link ResolvedAiChangeAnimationConfig.durationMs}, then the batch clears.
4994
+ *
4995
+ * Timing (setTimeout) and the frame clock live here so bindings stay thin. A
4996
+ * `schedule` hook is injectable so tests can drive time deterministically.
4997
+ */
4998
+
4999
+ /** Host-tunable options for how AI edits are animated on the canvas. */
5000
+ interface AiChangeAnimationConfig {
5001
+ /** Master switch. Default true. */
5002
+ enabled?: boolean;
5003
+ /** How long the motion + glow plays, in ms. Default 900. */
5004
+ durationMs?: number;
5005
+ /** Draw the pulsing glow highlight on changed elements. Default true. */
5006
+ glow?: boolean;
5007
+ /** Glide old->new bounds and cross-fade colours. Default true. */
5008
+ tween?: boolean;
5009
+ /** Accent colour (any CSS colour) for the glow/ghosts. Default a blue. */
5010
+ color?: string;
5011
+ }
5012
+ /** Config with every field resolved to a concrete value. */
5013
+ interface ResolvedAiChangeAnimationConfig {
5014
+ enabled: boolean;
5015
+ durationMs: number;
5016
+ glow: boolean;
5017
+ tween: boolean;
5018
+ color: string;
5019
+ }
5020
+ /** One batch of changes to animate, plus the slide to reveal for it. */
5021
+ interface AiChangeBatch {
5022
+ changes: AiElementChange[];
5023
+ /** Slide index the first change lives on (reveal this to show the edit). */
5024
+ slideIndex: number;
5025
+ /** Monotonic id so a binding can restart its animation on each new batch. */
5026
+ nonce: number;
5027
+ config: ResolvedAiChangeAnimationConfig;
5028
+ }
5029
+ /** Subscribe/publish bus for AI change animations. */
5030
+ interface AiChangeAnimator {
5031
+ /**
5032
+ * Diff `before` -> `after` and, when something visible changed and animations
5033
+ * are enabled, broadcast a batch and schedule its clear. Returns the batch
5034
+ * (so the caller can also navigate to `slideIndex`), or null on a no-op.
5035
+ */
5036
+ publish(before: PptxSlide[], after: PptxSlide[]): AiChangeBatch | null;
5037
+ subscribe(listener: (batch: AiChangeBatch | null) => void): () => void;
5038
+ current(): AiChangeBatch | null;
5039
+ /** Update the resolved config (e.g. when the host toggles it live). */
5040
+ configure(config?: AiChangeAnimationConfig): void;
5041
+ dispose(): void;
5042
+ }
5043
+
5044
+ /**
5045
+ * Host-facing configuration types for the framework-agnostic AI assistant, plus
5046
+ * {@link resolveChatTransport}, which turns a declarative {@link PptxAiConnection}
5047
+ * into a concrete AI SDK `ChatTransport`.
5048
+ *
5049
+ * All `ai` imports here are type-only; the runtime SDK is threaded in by the
5050
+ * caller (see {@link loadAiSdk}) so this module never forces the optional peer
5051
+ * to be present.
5052
+ */
5053
+
5054
+ /** The UI message shape exchanged with the assistant. Alias of the SDK type. */
5055
+ type PptxAiUIMessage = UIMessage;
5056
+ /**
5057
+ * Canonical name of every tool the assistant can call. Document tools mirror the
5058
+ * `pptx-viewer-mcp` server exactly (they ARE the same functions, run against the
5059
+ * live deck); the viewer-only tools (navigation, deck outline, element/notes
5060
+ * readers, table merge) have no MCP counterpart.
5061
+ */
5062
+ type PptxAiToolName = 'get_deck_overview' | 'get_slide' | 'get_element' | 'get_speaker_notes' | 'find_text' | 'get_theme' | 'go_to_slide' | 'select_elements' | 'merge_tables' | 'get_metadata' | 'get_layouts' | 'find_placeholders' | 'get_presentation_properties' | 'run_accessibility_check' | 'convert_to_markdown' | 'add_element' | 'update_element' | 'delete_elements' | 'arrange_elements' | 'clone_element' | 'set_element_animation' | 'group_elements' | 'ungroup_elements' | 'batch_update_elements' | 'update_element_style' | 'replace_geometry' | 'set_element_lock' | 'manage_hyperlinks' | 'replace_text' | 'manage_comments' | 'update_table_cells' | 'manage_table_structure' | 'create_chart' | 'update_chart' | 'add_chart_series' | 'remove_chart_series' | 'update_chart_series_data' | 'manage_smart_art' | 'apply_template' | 'add_slide' | 'duplicate_slide' | 'delete_slides' | 'reorder_slides' | 'update_slide_properties' | 'set_slide_transition' | 'apply_theme_preset' | 'update_theme_colors' | 'update_theme_fonts' | 'set_canvas_size' | 'update_metadata' | 'manage_sections' | 'update_presentation_properties' | 'apply_layout';
5063
+ type Resolvable<T> = T | (() => T | Promise<T>);
5064
+ /** How the assistant reaches a language model. */
5065
+ type PptxAiConnection =
5066
+ /**
5067
+ * Post messages to a host backend route (recommended for production so the
5068
+ * provider API key stays server-side). Maps to `DefaultChatTransport`.
5069
+ */
5070
+ {
5071
+ kind: 'endpoint';
5072
+ api: string;
5073
+ headers?: Resolvable<Record<string, string>>;
5074
+ body?: Resolvable<Record<string, unknown>>;
5075
+ credentials?: RequestCredentials;
5076
+ fetch?: typeof globalThis.fetch;
5077
+ }
5078
+ /**
5079
+ * Run a language model in-process in the browser (bring-your-own key /
5080
+ * local model). Maps to a `ToolLoopAgent` behind a `DirectChatTransport`.
5081
+ */
5082
+ | {
5083
+ kind: 'model';
5084
+ model: LanguageModel;
5085
+ system?: string;
5086
+ maxSteps?: number;
5087
+ }
5088
+ /** Provide a fully-constructed transport (advanced / testing escape hatch). */
5089
+ | {
5090
+ kind: 'transport';
5091
+ transport: ChatTransport<PptxAiUIMessage>;
5092
+ };
5093
+ /** How writes proposed by the assistant reach the document. */
5094
+ type PptxAiWritePolicy = 'stage' | 'approve' | 'auto';
5095
+ /** Which deck context is fed to the model with each turn. */
5096
+ type PptxAiContextStrategy = 'outline' | 'current-slide' | 'none';
5097
+ /** Optional per-session history persistence hooks. */
5098
+ interface PptxAiHistoryHooks {
5099
+ load?(id: string): Promise<PptxAiUIMessage[]>;
5100
+ save?(id: string, messages: PptxAiUIMessage[]): Promise<void>;
5101
+ }
5102
+ /** Complete host configuration for an AI chat session. */
5103
+ interface PptxAiConfig {
5104
+ connection: PptxAiConnection;
5105
+ /** Extra host instructions appended to the base system prompt. */
5106
+ systemPromptExtras?: string;
5107
+ tools?: {
5108
+ /** Allowlist. When set, only these tools are exposed. */
5109
+ enabled?: PptxAiToolName[];
5110
+ /** Denylist, applied after `enabled`. */
5111
+ disabled?: PptxAiToolName[];
5112
+ /** Additional host-defined tools merged into the tool set. */
5113
+ extra?: ToolSet;
5114
+ };
5115
+ /** Default `'stage'`. */
5116
+ writePolicy?: PptxAiWritePolicy;
5117
+ /** Default `'outline'`. */
5118
+ contextStrategy?: PptxAiContextStrategy;
5119
+ history?: PptxAiHistoryHooks;
5120
+ /**
5121
+ * How AI edits are animated on the canvas so the user can watch them land
5122
+ * (glide old->new, fade/scale in-out, glow-pulse). Omit for the defaults;
5123
+ * set `{ enabled: false }` to turn it off.
5124
+ */
5125
+ changeAnimation?: AiChangeAnimationConfig;
5126
+ onError?(error: Error): void;
5127
+ }
5128
+
5129
+ /**
5130
+ * The {@link PptxAiBridge} contract each UI binding (React / Vue / Angular /
5131
+ * Svelte / Vanilla) implements so the framework-agnostic AI core can read the
5132
+ * open deck, navigate it, and route edits through the binding's own history /
5133
+ * undo stack.
5134
+ *
5135
+ * The bridge is the single seam between the AI core and a live editor: every
5136
+ * read goes through a getter, every mutation goes through one of the three
5137
+ * write choke points ({@link PptxAiBridge.applySlidesUpdate},
5138
+ * {@link PptxAiBridge.updateElement}, {@link PptxAiBridge.applyTheme}). Keeping
5139
+ * writes funnelled lets the {@link ProposalStore} commit a batch as a single
5140
+ * undoable history entry.
5141
+ */
5142
+
5143
+ /** Lightweight, model-friendly summary of the whole deck. */
5144
+ interface PptxAiDeckMeta {
5145
+ /** Total number of slides. */
5146
+ slideCount: number;
5147
+ /** Zero-based index of the currently active slide. */
5148
+ activeSlideIndex: number;
5149
+ /** Deck title, when known (first slide title / core properties). */
5150
+ title?: string;
5151
+ /** Slide canvas width in CSS pixels. */
5152
+ width: number;
5153
+ /** Slide canvas height in CSS pixels. */
5154
+ height: number;
5155
+ }
5156
+ /** Severity hint for {@link PptxAiBridge.notify}. */
5157
+ type PptxAiNotifyLevel = 'info' | 'success' | 'warning' | 'error';
5158
+ /**
5159
+ * A target the user has scoped the assistant to: either a whole slide or a
5160
+ * single element on a slide. Returned by {@link PptxAiBridge.getFocusedTargets}
5161
+ * so the context builder can tell the model exactly what to focus on.
5162
+ */
5163
+ type PptxAiFocusedTarget = {
5164
+ kind: 'slide';
5165
+ slideIndex: number;
5166
+ } | {
5167
+ kind: 'element';
5168
+ slideIndex: number;
5169
+ elementId: string;
5170
+ };
5171
+ /**
5172
+ * A pure updater over the deck's slides. It receives a deep clone of the
5173
+ * current slides (mutation-safe) and returns the next slides array. The bridge
5174
+ * commits the returned array as ONE history entry.
5175
+ */
5176
+ type PptxAiSlidesUpdater = (slides: PptxSlide[]) => PptxSlide[];
5177
+ /**
5178
+ * A pure updater over the whole parsed deck ({@link PptxData}). Mirrors the
5179
+ * `pptx-viewer-mcp` tool model (data in, mutated data out) so presentation-level
5180
+ * MCP tools (metadata, sections, canvas size, presentation properties, layouts)
5181
+ * can be committed as ONE undoable history entry through {@link
5182
+ * PptxAiBridge.applyDeckData}. Optional: bindings that only track slide/theme
5183
+ * state can omit it, in which case those presentation-level tools report that
5184
+ * they are unavailable in this viewer while every slide/theme tool still works.
5185
+ */
5186
+ type PptxAiDataUpdater = (data: PptxData) => PptxData;
5187
+ /** Field-level updates for a single element, mirroring the MCP update vocab. */
5188
+ interface PptxAiElementUpdate {
5189
+ x?: number;
5190
+ y?: number;
5191
+ width?: number;
5192
+ height?: number;
5193
+ rotation?: number;
5194
+ opacity?: number;
5195
+ hidden?: boolean;
5196
+ flipHorizontal?: boolean;
5197
+ flipVertical?: boolean;
5198
+ text?: string;
5199
+ fontSize?: number;
5200
+ fontFamily?: string;
5201
+ fontColor?: string;
5202
+ bold?: boolean;
5203
+ italic?: boolean;
5204
+ underline?: boolean;
5205
+ align?: 'left' | 'center' | 'right' | 'justify';
5206
+ fillColor?: string;
5207
+ strokeColor?: string;
5208
+ strokeWidth?: number;
5209
+ }
5210
+ /**
5211
+ * Implemented by each binding to expose its live editor to the AI core.
5212
+ *
5213
+ * Read methods must be cheap and synchronous. Write methods must route through
5214
+ * the binding's editor-history layer so AI edits are undoable like manual ones.
5215
+ */
5216
+ interface PptxAiBridge {
5217
+ /** Return a summary of the whole deck. */
5218
+ getDeckMeta(): PptxAiDeckMeta;
5219
+ /** Return the deck's slides. Callers must not mutate the returned array. */
5220
+ getSlides(): PptxSlide[];
5221
+ /** Return the zero-based index of the active slide. */
5222
+ getActiveSlideIndex(): number;
5223
+ /** Return the resolved presentation theme, when available. */
5224
+ getTheme(): PptxTheme | undefined;
5225
+ /** Return the underlying core handler, when the binding exposes one. */
5226
+ getHandler(): PptxHandler | undefined;
5227
+ /** Navigate the viewer to a slide by zero-based index. */
5228
+ goToSlide(index: number): void;
5229
+ /** Select the given elements on a slide (empty array clears selection). */
5230
+ selectElements(slideIndex: number, elementIds: string[]): void;
5231
+ /**
5232
+ * Apply a slides updater as a single, atomic, undoable history entry. The
5233
+ * binding is responsible for cloning current slides before calling
5234
+ * `updater` and for installing the result.
5235
+ */
5236
+ applySlidesUpdate(updater: PptxAiSlidesUpdater, label: string): void;
5237
+ /** Apply field updates to one element as a single history entry. */
5238
+ updateElement(slideIndex: number, elementId: string, updates: PptxAiElementUpdate): void;
5239
+ /** Apply partial theme updates as a single history entry. */
5240
+ applyTheme(updates: Partial<PptxTheme>): void;
5241
+ /**
5242
+ * Return the full parsed {@link PptxData} for the open deck, with the live
5243
+ * (edited) slides and theme overlaid. Enables `pptx-viewer-mcp` tools that
5244
+ * read presentation-level state (metadata, sections, layouts, presentation
5245
+ * properties). Optional: when absent, the AI core synthesises a minimal
5246
+ * PptxData from slides + dimensions, which is enough for every slide/theme
5247
+ * tool but not for presentation-level reads.
5248
+ */
5249
+ getDeckData?(): PptxData | undefined;
5250
+ /**
5251
+ * Commit a whole-deck {@link PptxData} mutation as one undoable history entry.
5252
+ * Used to apply presentation-level MCP tool results (metadata, sections,
5253
+ * canvas size, presentation properties, layouts). Optional: when absent,
5254
+ * those tools report they are not supported in this viewer; slide/theme tools
5255
+ * are unaffected (they route through {@link PptxAiBridge.applySlidesUpdate}
5256
+ * and {@link PptxAiBridge.applyTheme}).
5257
+ */
5258
+ applyDeckData?(updater: PptxAiDataUpdater, label: string): void;
5259
+ /**
5260
+ * Return the slides / elements the user has scoped the assistant to, if any.
5261
+ * When present and non-empty, the context builder tells the model to focus on
5262
+ * exactly these targets. Optional so existing bridges satisfy the contract
5263
+ * without change; a bridge that does not implement it behaves as before (no
5264
+ * focus scoping).
5265
+ */
5266
+ getFocusedTargets?(): PptxAiFocusedTarget[];
5267
+ /** Surface a transient message in the host UI (toast / status line). */
5268
+ notify?(message: string, level?: PptxAiNotifyLevel): void;
5269
+ }
5270
+
5271
+ /**
5272
+ * {@link ProposalStore} - the staging area for AI-proposed writes.
5273
+ *
5274
+ * When the write policy is `'stage'` / `'approve'`, an edit tool does not touch
5275
+ * the document directly. Instead it registers a {@link PptxAiSlidesUpdater} here
5276
+ * as a {@link StagedProposal}, together with a human-readable diff summary. The
5277
+ * host UI can then present the pending change and, on accept, apply it through
5278
+ * {@link PptxAiBridge.applySlidesUpdate} as ONE undoable history entry (or drop
5279
+ * it on revert). This keeps AI edits reviewable and atomic.
5280
+ */
5281
+
5282
+ /** A pending, not-yet-applied write. */
5283
+ interface StagedProposal {
5284
+ /** Stable id for accept/revert. */
5285
+ id: string;
5286
+ /** Short label used as the history-entry name when applied. */
5287
+ label: string;
5288
+ /** Human-readable change lines (from {@link diffSlides}). */
5289
+ summary: string[];
5290
+ /** Epoch ms when staged. */
5291
+ createdAt: number;
5292
+ /** The updater to run against the live deck on apply. */
5293
+ updater: PptxAiSlidesUpdater;
5294
+ }
5295
+ /** Public (serialisable) view of a proposal, without the updater closure. */
5296
+ interface ProposalView {
5297
+ id: string;
5298
+ label: string;
5299
+ summary: string[];
5300
+ createdAt: number;
5301
+ }
5302
+
5303
+ /**
5304
+ * Persistent chat-history store for the AI assistant panel.
5305
+ *
5306
+ * The store is IndexedDB-first: {@link createChatHistoryStore} opens IndexedDB
5307
+ * on first use and, when that global is missing or fails to open (private mode,
5308
+ * blocked, or a non-DOM environment), transparently falls back to localStorage.
5309
+ * Both backends expose the identical {@link PptxAiChatStore} surface so callers
5310
+ * never branch on which one is live.
5311
+ *
5312
+ * All browser globals are read lazily from inside methods, so importing this
5313
+ * module in Node (SSR / tests) never throws.
5314
+ */
5315
+
5316
+ /** A chat conversation persisted for later resumption. */
5317
+ interface PptxAiStoredChat {
5318
+ /** Stable id (also the storage key). */
5319
+ id: string;
5320
+ /** Human-readable title (usually derived from the first user message). */
5321
+ title: string;
5322
+ /** Deck this chat is scoped to, when known. Enables per-deck listing. */
5323
+ deckId?: string;
5324
+ /** Full UI-message transcript. */
5325
+ messages: PptxAiUIMessage[];
5326
+ /** Epoch ms when first saved. */
5327
+ createdAt: number;
5328
+ /** Epoch ms of the most recent save. */
5329
+ updatedAt: number;
5330
+ }
5331
+ /** Lightweight listing entry (no message bodies) for the history sidebar. */
5332
+ interface PptxAiChatSummary {
5333
+ id: string;
5334
+ title: string;
5335
+ deckId?: string;
5336
+ createdAt: number;
5337
+ updatedAt: number;
5338
+ messageCount: number;
5339
+ }
5340
+ /** Storage-agnostic chat history API. */
5341
+ interface PptxAiChatStore {
5342
+ /** List chat summaries newest-first, optionally filtered by deck. */
5343
+ listChats(opts?: {
5344
+ deckId?: string;
5345
+ }): Promise<PptxAiChatSummary[]>;
5346
+ /** Load one full chat, or null when it does not exist. */
5347
+ loadChat(id: string): Promise<PptxAiStoredChat | null>;
5348
+ /** Upsert a chat. Always refreshes `updatedAt` (and `createdAt` if unset). */
5349
+ saveChat(chat: PptxAiStoredChat): Promise<void>;
5350
+ /** Delete one chat by id (no-op when absent). */
5351
+ deleteChat(id: string): Promise<void>;
5352
+ /** Delete every chat, or every chat for one deck when `deckId` is given. */
5353
+ clearChats(opts?: {
5354
+ deckId?: string;
5355
+ }): Promise<void>;
5356
+ }
5357
+
5358
+ /**
5359
+ * Framework-agnostic helpers that flatten an AI SDK `UIMessage` into the small
5360
+ * set of parts a chat panel actually renders: assistant/user text and tool-call
5361
+ * cards. Every binding's panel (React, Vue, Angular, Svelte, Vanilla) consumes
5362
+ * these so the transcript model stays identical across bindings.
5363
+ *
5364
+ * The part-kind checks are pure structural facts of the AI SDK UI message
5365
+ * protocol (a text part has `type === 'text'`; a tool part's `type` is
5366
+ * `tool-<name>`; a dynamic tool part has `type === 'dynamic-tool'`), so this
5367
+ * module needs only a type-only import of `UIMessage` and NEVER pulls the `ai`
5368
+ * runtime. It is therefore safe to expose from the main `pptx-viewer-shared/ai`
5369
+ * barrel without forcing the optional peer to load.
5370
+ */
5371
+
5372
+ /** A run of assistant/user prose. */
5373
+ interface RenderableTextPart {
5374
+ kind: 'text';
5375
+ text: string;
5376
+ }
5377
+ /** One tool invocation, in any of its streaming states. */
5378
+ interface RenderableToolPart {
5379
+ kind: 'tool';
5380
+ toolName: string;
5381
+ toolCallId: string;
5382
+ state: 'input-streaming' | 'input-available' | 'output-available' | 'output-error' | string;
5383
+ input: unknown;
5384
+ output: unknown;
5385
+ errorText?: string;
5386
+ }
5387
+ type RenderablePart = RenderableTextPart | RenderableToolPart;
5388
+
5389
+ /**
5390
+ * A coarse icon category for a tool activity, so every binding can pick a
5391
+ * matching icon from its own icon set (React uses lucide, etc.) without the
5392
+ * shared layer depending on any icon library.
5393
+ */
5394
+ type ToolActivityIcon = 'view' | 'text' | 'shape' | 'theme' | 'table' | 'slide' | 'chart' | 'move' | 'delete' | 'search' | 'nav' | 'animation' | 'notes' | 'tool';
5395
+
5396
+ /**
5397
+ * Pure derivation of the on-canvas focus target a running tool refers to, so
5398
+ * the viewer can behave like a live collaborator: as the assistant reads or
5399
+ * edits the deck, the canvas navigates to the relevant slide and highlights the
5400
+ * element(s) the tool is touching.
5401
+ *
5402
+ * The mapping is intentionally structural (it reads well-known input fields:
5403
+ * `slideIndex`, `elementId`, `elementIdA/B`, `elementIds`, `slideIndexes`,
5404
+ * `newOrder`) and framework-agnostic, so every binding drives the same live
5405
+ * focus. It NEVER performs navigation itself; it only says "what to look at".
5406
+ */
5407
+ /** The slide / element(s) a tool invocation is focused on. */
5408
+ interface ToolCanvasTarget {
5409
+ /** Zero-based slide index to navigate to, when the tool names one. */
5410
+ slideIndex?: number;
5411
+ /** Element ids on that slide to highlight (may be empty for slide-level tools). */
5412
+ elementIds: string[];
5413
+ }
5414
+
4697
5415
  /**
4698
5416
  * The canonical English UI-string dictionary for pptx-viewer. None of the
4699
5417
  * React/Vue/Angular binding packages ship translations themselves - each
@@ -4760,6 +5478,157 @@ declare class AccessibilityService {
4760
5478
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AccessibilityService>;
4761
5479
  }
4762
5480
 
5481
+ /**
5482
+ * Pure helpers that turn the live canvas selection into AI "focused targets"
5483
+ * (the slides / elements the assistant should scope its work to) and into the
5484
+ * short chip labels shown in the AI panel. Angular replica of React's
5485
+ * `hooks/ai/focus-targets.ts`; kept in-binding (rather than in shared) because
5486
+ * it is a tiny pure helper and the shared package is consumed read-only here.
5487
+ *
5488
+ * Shared by {@link AiPanelStore} (so `getFocusedTargets` reflects live
5489
+ * selection) and by the focus-chip bar, so both agree on "the current focus".
5490
+ */
5491
+
5492
+ /** The selection inputs the focus derivation reads. */
5493
+ interface FocusSelectionInput {
5494
+ activeSlideIndex: number;
5495
+ selectedElementIds: readonly string[];
5496
+ selectedElementId: string | null;
5497
+ }
5498
+ /** One element ring to draw on the canvas: an explicit pick or a live-tool focus. */
5499
+ interface AiCanvasHighlight {
5500
+ slideIndex: number;
5501
+ elementId: string;
5502
+ /** `pick` = persistent user pick; `active` = transient AI-is-working ring. */
5503
+ variant: 'pick' | 'active';
5504
+ }
5505
+ /**
5506
+ * Derive focused targets from the live selection: one `element` target per
5507
+ * selected element on the active slide, or a single whole-`slide` target when
5508
+ * nothing is selected. Order and multiplicity are preserved (multi-select and
5509
+ * tables included) so callers can detect e.g. "exactly two tables".
5510
+ */
5511
+ declare function computeFocusTargets(input: FocusSelectionInput): PptxAiFocusedTarget[];
5512
+ /** A renderable focus chip. `title` carries the full element id for hover. */
5513
+ interface FocusChip {
5514
+ key: string;
5515
+ label: string;
5516
+ title: string;
5517
+ }
5518
+ /**
5519
+ * Build display chips for the given targets. Slide targets read `Slide N`;
5520
+ * element targets read `<Type> <n>` (a friendly short label, full id on hover),
5521
+ * or `<Type> (missing)` when the element is no longer on the slide.
5522
+ */
5523
+ declare function focusTargetChips(targets: readonly PptxAiFocusedTarget[], slides: readonly PptxSlide[]): FocusChip[];
5524
+ /** Whether the focus is exactly two table elements (drives the merge action). */
5525
+ declare function isTwoTableFocus(targets: readonly PptxAiFocusedTarget[], slides: readonly PptxSlide[]): false | {
5526
+ slideIndex: number;
5527
+ elementIdA: string;
5528
+ elementIdB: string;
5529
+ };
5530
+
5531
+ /** Live selection accessors the store reads to derive the follow-selection focus. */
5532
+ interface AiPanelSelectionAccessors {
5533
+ activeSlideIndex(): number;
5534
+ selectedElementIds(): readonly string[];
5535
+ selectedElementId(): string | null;
5536
+ /** The primary selected element, for building the "Fix with AI" directive. */
5537
+ selectedElement(): PptxElement | null;
5538
+ }
5539
+ declare class AiPanelStore {
5540
+ /**
5541
+ * Optional: `inject()` needs an active injection context, which plain
5542
+ * `new AiPanelStore()` (used by this store's unit tests, deliberately
5543
+ * bypassing TestBed for speed) does not provide. Falls back to no automatic
5544
+ * timer cleanup when constructed outside DI, which is fine for tests.
5545
+ */
5546
+ private readonly destroyRef;
5547
+ private accessors;
5548
+ /** Pinned focus override (null follows the live selection). */
5549
+ readonly pinnedFocus: _angular_core.WritableSignal<PptxAiFocusedTarget[] | null>;
5550
+ /**
5551
+ * One-shot composer prefill. `nonce` bumps on every ask/fix so the composer
5552
+ * applies `text` (and focuses) even when `text` is empty and unchanged.
5553
+ */
5554
+ readonly prefill: _angular_core.WritableSignal<{
5555
+ text: string;
5556
+ nonce: number;
5557
+ }>;
5558
+ /** True while the user is picking element(s) on the canvas for the assistant. */
5559
+ readonly pickMode: _angular_core.WritableSignal<boolean>;
5560
+ /** The elements the user has explicitly handed to the assistant. */
5561
+ readonly pickTargets: _angular_core.WritableSignal<PptxAiFocusedTarget[]>;
5562
+ /** The element(s) a running tool is currently touching (transient). */
5563
+ private readonly toolFocus;
5564
+ private readonly flashTick;
5565
+ private flashTimer;
5566
+ /**
5567
+ * Canvas change animator: the shared subscribe/publish bus that carries "these
5568
+ * elements just changed, animate them" from the AI apply path (the bridge's
5569
+ * write choke point calls {@link publishAiChange}) to the panel, which reveals
5570
+ * the slide and hands the batch to the on-canvas overlay via
5571
+ * {@link showChangeBatch}. Owned here (viewer-scoped) so it survives the panel
5572
+ * opening/closing while the write path stays alive. Mirrors React's
5573
+ * `session.changeAnimator`; Angular drives the same shared animator from the
5574
+ * bridge because its vanilla-chat controller does not surface the session.
5575
+ */
5576
+ readonly changeAnimator: AiChangeAnimator;
5577
+ /** The batch of just-applied element changes the canvas overlay should play. */
5578
+ readonly changeBatch: _angular_core.WritableSignal<AiChangeBatch | null>;
5579
+ constructor();
5580
+ /** Wire the live selection accessors (called once by the viewer component). */
5581
+ bind(accessors: AiPanelSelectionAccessors): void;
5582
+ /** Focused targets derived live from the current canvas selection. */
5583
+ readonly liveFocusTargets: _angular_core.Signal<PptxAiFocusedTarget[]>;
5584
+ /** Whether there are explicit picks (they win over a pin / live selection). */
5585
+ readonly hasPicks: _angular_core.Signal<boolean>;
5586
+ /** The targets the panel + bridge should actually scope to. */
5587
+ readonly effectiveTargets: _angular_core.Signal<PptxAiFocusedTarget[]>;
5588
+ /** True when a pin is in force (and no picks override it). */
5589
+ readonly isPinned: _angular_core.Signal<boolean>;
5590
+ /**
5591
+ * Focused targets for the bridge's `getFocusedTargets`: picks beat a pin,
5592
+ * which beats the live selection.
5593
+ */
5594
+ getFocusedTargets(): PptxAiFocusedTarget[];
5595
+ pinFocus(): void;
5596
+ clearPinnedFocus(): void;
5597
+ /** Open the panel scoped to the current selection, empty composer (focused). */
5598
+ askAboutSelection(): void;
5599
+ /** Open the panel scoped to the current selection, prefilled fix directive. */
5600
+ fixSelection(): void;
5601
+ startPicking(): void;
5602
+ stopPicking(): void;
5603
+ /** Add one clicked canvas element to the pick set (dedupe by id). */
5604
+ addPick(slideIndex: number, elementId: string): void;
5605
+ /** Empty the pick set and leave pick mode. */
5606
+ clearPicks(): void;
5607
+ /**
5608
+ * Flash a transient "the AI is working on this" highlight for a running tool,
5609
+ * and enable colour tweening for a short settle window. Pass `null` to just
5610
+ * enable tweening (e.g. a theme-colour edit with no single element target).
5611
+ */
5612
+ flashToolTarget(target: ToolCanvasTarget | null): void;
5613
+ /** Element rings the canvas should draw (picks + the live tool focus). */
5614
+ readonly canvasHighlights: _angular_core.Signal<AiCanvasHighlight[]>;
5615
+ /** True while the canvas should tween colour changes (AI is active). */
5616
+ readonly canvasAnimating: _angular_core.Signal<boolean>;
5617
+ /** Apply (or clear) the change batch the panel wants the canvas to animate. */
5618
+ showChangeBatch(batch: AiChangeBatch | null): void;
5619
+ /**
5620
+ * Publish an applied AI edit to the change animator (called from the bridge's
5621
+ * write choke point with the deck slides before + after the edit). The panel's
5622
+ * subscription reveals the slide and plays the overlay; a no-op edit or the
5623
+ * host disabling the animation publishes nothing.
5624
+ */
5625
+ publishAiChange(before: readonly PptxSlide[], after: readonly PptxSlide[]): void;
5626
+ /** Apply the host's change-animation config (duration / colour / toggles). */
5627
+ configureChangeAnimation(config?: AiChangeAnimationConfig): void;
5628
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiPanelStore, never>;
5629
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AiPanelStore>;
5630
+ }
5631
+
4763
5632
  /** Lifecycle status of the autosave engine (mirrors React's `AutosaveStatus`). */
4764
5633
  type AutosaveStatus = {
4765
5634
  state: 'idle';
@@ -5298,6 +6167,8 @@ declare class LoadContentService {
5298
6167
  readonly theme: _angular_core.WritableSignal<PptxTheme | undefined>;
5299
6168
  /** Resolved colour map for the presentation theme (scheme key → hex). */
5300
6169
  readonly themeColorMap: _angular_core.WritableSignal<Record<string, string> | undefined>;
6170
+ /** Parsed table-style definitions from `ppt/tableStyles.xml` (banding/diagonals). */
6171
+ readonly tableStyleMap: _angular_core.WritableSignal<ParsedTableStyleMap | undefined>;
5301
6172
  /** Slide masters (for placeholder/background resolution). */
5302
6173
  readonly slideMasters: _angular_core.WritableSignal<PptxSlideMaster[]>;
5303
6174
  /** Notes master, including its editable element tree. */
@@ -5344,6 +6215,12 @@ declare class LoadContentService {
5344
6215
  constructor();
5345
6216
  /** Serialise the current (loaded) presentation back to `.pptx` bytes. */
5346
6217
  getContent(): Promise<Uint8Array>;
6218
+ /**
6219
+ * The loaded presentation's core handler, or `undefined` before a deck is
6220
+ * loaded. Exposed for the AI bridge ({@link PptxAiBridge.getHandler}) so the
6221
+ * assistant can reach low-level core APIs when needed.
6222
+ */
6223
+ getHandler(): PptxHandler | undefined;
5347
6224
  /**
5348
6225
  * Serialise an explicit set of slides back to `.pptx` bytes (e.g. the
5349
6226
  * editor's edited deck) using the loaded presentation's handler.
@@ -5713,8 +6590,15 @@ declare function getContainerStyle(el: PptxElement, zIndex: number): StyleMap;
5713
6590
  /**
5714
6591
  * Fill / stroke / corner-radius for shape-like elements. Returns an empty
5715
6592
  * object when the element carries no shape styling.
6593
+ *
6594
+ * `animatesFill` / `animatesStroke` come from an active `p:animClr` colour
6595
+ * animation during presentation playback: when set, the static paint is dropped
6596
+ * so the wrapper's colour keyframes (applied as an `animation` on this same box)
6597
+ * own `background-color` / `border-color`. Mirrors the Vue port's
6598
+ * `getShapeFillStrokeStyle` and React's `getShapeVisualStyle`. Absent/false
6599
+ * keeps the static paint, so editor / read-only rendering is unaffected.
5716
6600
  */
5717
- declare function getShapeFillStrokeStyle(el: PptxElement): StyleMap;
6601
+ declare function getShapeFillStrokeStyle(el: PptxElement, parentGroupFill?: ShapeStyle, animatesFill?: boolean, animatesStroke?: boolean): StyleMap;
5718
6602
  /**
5719
6603
  * Text block style for elements that carry text. Mirrors the essentials of the
5720
6604
  * React `getTextStyleForElement`.
@@ -5821,8 +6705,14 @@ interface TableRowViewModel {
5821
6705
  * resolving spans, applying banding (lowest priority) beneath the explicit cell
5822
6706
  * style, and extracting diagonal-border info. Returns an empty array when
5823
6707
  * `tableData` is absent.
6708
+ *
6709
+ * `styleCtx` (parsed table-style map + theme colour/font scheme) is threaded
6710
+ * into both the banding resolver and the diagonal-border resolver so
6711
+ * table-style-inherited banding, fonts, and section diagonals apply; per-cell
6712
+ * explicit styles still win. When omitted, both fall back to the hardcoded
6713
+ * defaults (unchanged from before).
5824
6714
  */
5825
- declare function buildTableViewModel(el: PptxElement): TableRowViewModel[];
6715
+ declare function buildTableViewModel(el: PptxElement, styleCtx?: TableStyleContext): TableRowViewModel[];
5826
6716
  /** Compute `<col>` width styles from the column-widths array (0-1 fractions). */
5827
6717
  declare function buildColStyles(el: PptxElement): StyleMap[];
5828
6718
 
@@ -5851,6 +6741,13 @@ declare class TableRendererComponent {
5851
6741
  private readonly injector;
5852
6742
  /** Shared cell-selection state (present only inside the editor subtree). */
5853
6743
  private readonly selectionSvc;
6744
+ /**
6745
+ * Deck load state (present in the viewer subtree). Supplies the parsed
6746
+ * table-style map + theme colour/font scheme so table-style-inherited banding,
6747
+ * fonts, and section diagonals resolve. Absent (optional) in standalone
6748
+ * thumbnail/export renderers, where the hardcoded defaults are used.
6749
+ */
6750
+ private readonly loader;
5854
6751
  /** The table element to render. Must be `type === 'table'`. */
5855
6752
  readonly element: _angular_core.InputSignal<PptxElement>;
5856
6753
  /** Whether inline cell editing / selection / resize is enabled. */
@@ -5868,6 +6765,12 @@ declare class TableRendererComponent {
5868
6765
  private readonly cellInput;
5869
6766
  /** Pre-computed `<col>` styles for the colgroup. */
5870
6767
  readonly colStyles: _angular_core.Signal<StyleMap[]>;
6768
+ /**
6769
+ * Table-style context (parsed style map + theme colour/font scheme) from the
6770
+ * deck loader, or `undefined` outside the viewer subtree. `fontScheme` lets a
6771
+ * table style's `a:fontRef@idx` resolve to a concrete font family.
6772
+ */
6773
+ private readonly styleCtx;
5871
6774
  /** Projected view-model rows with merged-cell resolution + banding applied. */
5872
6775
  readonly rows: _angular_core.Signal<TableRowViewModel[]>;
5873
6776
  /** Column widths (0-1 fractions) for the resize overlay. */
@@ -6018,7 +6921,7 @@ declare class ViewerCollabCursorService {
6018
6921
  }
6019
6922
 
6020
6923
  /** Seed values for the Share dialog's start form. */
6021
- interface ShareDefaults$1 {
6924
+ interface ShareDefaults {
6022
6925
  roomId?: string;
6023
6926
  userName?: string;
6024
6927
  serverUrl?: string;
@@ -6026,7 +6929,7 @@ interface ShareDefaults$1 {
6026
6929
  /** Host accessors/emitters a service cannot own (inputs + outputs). */
6027
6930
  interface CollaborationSessionHost {
6028
6931
  readonly authorName: () => string | undefined;
6029
- readonly shareDefaults: () => ShareDefaults$1 | undefined;
6932
+ readonly shareDefaults: () => ShareDefaults | undefined;
6030
6933
  readonly getTemplateElements: () => TemplateElementsBySlideId;
6031
6934
  /** Apply a remote peer's slide set to the editable deck (echo-guarded in the service). */
6032
6935
  readonly applyRemoteSlides: (slides: PptxSlide[]) => void;
@@ -6082,7 +6985,7 @@ declare class ViewerCollaborationSessionService {
6082
6985
  * `userName` falling back to `authorName` (then "You") so the local user's
6083
6986
  * name pre-fills the form. Mirrors React/Vue.
6084
6987
  */
6085
- readonly shareDialogDefaults: _angular_core.Signal<ShareDefaults$1>;
6988
+ readonly shareDialogDefaults: _angular_core.Signal<ShareDefaults>;
6086
6989
  /**
6087
6990
  * Connect / disconnect real-time collaboration when the host `collaboration`
6088
6991
  * input changes (called from the component's effect).
@@ -6887,11 +7790,11 @@ declare class PowerPointViewerComponent {
6887
7790
  */
6888
7791
  readonly onOpenFile: _angular_core.InputSignal<(() => void) | undefined>;
6889
7792
  /**
6890
- * Opt in to the experimental Three.js SmartArt renderer. When `true`,
6891
- * SmartArt diagrams render as extruded 3D blocks on a WebGL canvas instead
6892
- * of flat SVG. Requires the optional `three` peer dependency; when it is not
6893
- * installed (or the diagram has no geometry), the viewer transparently falls
6894
- * back to the SVG SmartArt renderer. Default `false`.
7793
+ * Opt in to the Three.js SmartArt renderer. When `true`, SmartArt diagrams
7794
+ * render as extruded 3D blocks on a WebGL canvas instead of flat SVG.
7795
+ * Requires the optional `three` peer dependency; when it is not installed
7796
+ * (or the diagram has no geometry), the viewer transparently falls back to
7797
+ * the SVG SmartArt renderer. Default `false`.
6895
7798
  */
6896
7799
  readonly smartArt3D: _angular_core.InputSignal<boolean>;
6897
7800
  /**
@@ -6900,6 +7803,14 @@ declare class PowerPointViewerComponent {
6900
7803
  * ribbon tab id). Default `[]` hides nothing, matching prior behaviour.
6901
7804
  */
6902
7805
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
7806
+ /**
7807
+ * Optional AI assistant configuration. When set, a Sparkles toggle appears in
7808
+ * the ribbon and opens a right-rail chat pane wired to the open deck. The
7809
+ * `ai` SDK is an optional peer; when it is not installed the pane shows an
7810
+ * "unavailable" notice instead. Absent by default (no AI UI). Mirrors React's
7811
+ * `ai` prop.
7812
+ */
7813
+ readonly ai: _angular_core.InputSignal<PptxAiConfig | undefined>;
6903
7814
  /** Fired when the active slide changes. */
6904
7815
  readonly activeSlideChange: _angular_core.OutputEmitterRef<number>;
6905
7816
  /** Fired when the unsaved-changes flag toggles. */
@@ -6953,6 +7864,8 @@ declare class PowerPointViewerComponent {
6953
7864
  protected readonly fileIO: ViewerFileIOService;
6954
7865
  protected readonly themeGallery: ViewerThemeGalleryService;
6955
7866
  protected readonly canvasEditing: ViewerCanvasEditingService;
7867
+ /** Shared AI panel scope + on-canvas highlight store (pick mode, tool focus). */
7868
+ protected readonly aiPanelStore: AiPanelStore;
6956
7869
  protected readonly collabCursor: ViewerCollabCursorService;
6957
7870
  protected readonly docProperties: ViewerDocumentPropertiesService;
6958
7871
  private readonly translateService;
@@ -7068,6 +7981,18 @@ declare class PowerPointViewerComponent {
7068
7981
  protected readonly showSmartArtInsert: _angular_core.WritableSignal<boolean>;
7069
7982
  /** The single selected element on the active slide (for the inspector). */
7070
7983
  protected readonly selectedElement: _angular_core.Signal<PptxElement | null>;
7984
+ /** Whether the AI assistant pane is open (toggled from the ribbon Sparkles). */
7985
+ protected readonly aiPanelOpen: _angular_core.WritableSignal<boolean>;
7986
+ /** Whether the AI assistant toggle is shown (host supplied an `ai` config). */
7987
+ protected readonly aiEnabled: _angular_core.Signal<boolean>;
7988
+ /**
7989
+ * Stable {@link PptxAiBridge} exposing this viewer's live state + editor to
7990
+ * the AI core. Its three write choke points route through
7991
+ * {@link EditorStateService.applyReplacement}, so each AI edit is a single
7992
+ * undoable history entry. Built unconditionally (cheap); only consumed when
7993
+ * the host passes {@link ai}.
7994
+ */
7995
+ protected readonly aiBridge: PptxAiBridge;
7071
7996
  constructor();
7072
7997
  /**
7073
7998
  * Serialise the current presentation to `.pptx` bytes (imperative handle).
@@ -7084,6 +8009,13 @@ declare class PowerPointViewerComponent {
7084
8009
  goTo(index: number): void;
7085
8010
  goPrev(): void;
7086
8011
  protected onCreatePresentation(templateId: string): void;
8012
+ /**
8013
+ * Route an AI theme edit (partial theme update) through the theme-gallery
8014
+ * service so it re-resolves slide colours and records ONE undoable entry,
8015
+ * mirroring how the Design tab applies a theme. Falls back to the current
8016
+ * colour/font scheme for whichever half the update omits.
8017
+ */
8018
+ private applyAiTheme;
7087
8019
  /**
7088
8020
  * File > Options > Appearance selection handler. When a host supplies
7089
8021
  * `onThemeChange` it owns persisting the choice; otherwise this falls back
@@ -7127,6 +8059,19 @@ declare class PowerPointViewerComponent {
7127
8059
  getSlideCount(): number;
7128
8060
  /** Whether the document has unsaved changes. */
7129
8061
  isDirty(): boolean;
8062
+ /**
8063
+ * Canvas element press. While the AI panel is picking, the press hands the
8064
+ * element to the assistant (highlighted + added to the pick set) instead of
8065
+ * selecting it; otherwise it routes to the normal editor selection.
8066
+ */
8067
+ protected onCanvasElementSelect(event: {
8068
+ id: string;
8069
+ additive: boolean;
8070
+ }): void;
8071
+ /** Context-menu "Ask AI about this": scope + open the assistant, empty composer. */
8072
+ protected onContextMenuAskAi(): void;
8073
+ /** Context-menu "Fix with AI": scope + open the assistant with a prefilled directive. */
8074
+ protected onContextMenuFixAi(): void;
7130
8075
  /** Get the IDs of currently selected elements. */
7131
8076
  getSelectedElementIds(): string[];
7132
8077
  /** Programmatically select elements by their IDs. */
@@ -7220,7 +8165,7 @@ declare class PowerPointViewerComponent {
7220
8165
  /** Resolve the live slide-stage element within `<main>`. */
7221
8166
  private stageElement;
7222
8167
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PowerPointViewerComponent, never>;
7223
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PowerPointViewerComponent, "pptx-viewer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "fontsInput": { "alias": "fonts"; "required": false; "isSignal": true; }; "canEditInput": { "alias": "canEdit"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "defaultThemeKey": { "alias": "defaultThemeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "onThemeChange": { "alias": "onThemeChange"; "required": false; "isSignal": true; }; "defaultLocale": { "alias": "defaultLocale"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "onLocaleChange": { "alias": "onLocaleChange"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "collaboration": { "alias": "collaboration"; "required": false; "isSignal": true; }; "authorName": { "alias": "authorName"; "required": false; "isSignal": true; }; "shareDefaults": { "alias": "shareDefaults"; "required": false; "isSignal": true; }; "onOpenFile": { "alias": "onOpenFile"; "required": false; "isSignal": true; }; "smartArt3D": { "alias": "smartArt3D"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "activeSlideChange": "activeSlideChange"; "dirtyChange": "dirtyChange"; "contentChange": "contentChange"; "propertiesChange": "propertiesChange"; "modeChange": "modeChange"; "zoomChange": "zoomChange"; "selectionChange": "selectionChange"; "slideCountChange": "slideCountChange"; "startCollaboration": "startCollaboration"; "stopCollaboration": "stopCollaboration"; }, never, never, true, never>;
8168
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PowerPointViewerComponent, "pptx-viewer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "fontsInput": { "alias": "fonts"; "required": false; "isSignal": true; }; "canEditInput": { "alias": "canEdit"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "defaultThemeKey": { "alias": "defaultThemeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "onThemeChange": { "alias": "onThemeChange"; "required": false; "isSignal": true; }; "defaultLocale": { "alias": "defaultLocale"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "onLocaleChange": { "alias": "onLocaleChange"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "collaboration": { "alias": "collaboration"; "required": false; "isSignal": true; }; "authorName": { "alias": "authorName"; "required": false; "isSignal": true; }; "shareDefaults": { "alias": "shareDefaults"; "required": false; "isSignal": true; }; "onOpenFile": { "alias": "onOpenFile"; "required": false; "isSignal": true; }; "smartArt3D": { "alias": "smartArt3D"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "ai": { "alias": "ai"; "required": false; "isSignal": true; }; }, { "activeSlideChange": "activeSlideChange"; "dirtyChange": "dirtyChange"; "contentChange": "contentChange"; "propertiesChange": "propertiesChange"; "modeChange": "modeChange"; "zoomChange": "zoomChange"; "selectionChange": "selectionChange"; "slideCountChange": "slideCountChange"; "startCollaboration": "startCollaboration"; "stopCollaboration": "stopCollaboration"; }, never, never, true, never>;
7224
8169
  }
7225
8170
 
7226
8171
  /** A selected chart sub-part, scoped to the chart element that owns it. */
@@ -7575,7 +8520,395 @@ declare class ZoomTargetService {
7575
8520
  * `PowerPointViewerComponent`'s children (ribbon, slide canvas, inspector,
7576
8521
  * dialogs, ...) rely on via `inject()`.
7577
8522
  */
7578
- declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof CollaborationService, typeof AccessibilityService, typeof AutosaveService, typeof PrintService, typeof IsMobileService, typeof SmartArt3DService, typeof FieldContextService, typeof ZoomTargetService, 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];
8523
+ declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof CollaborationService, typeof AccessibilityService, typeof AutosaveService, typeof PrintService, typeof IsMobileService, typeof SmartArt3DService, 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];
8524
+
8525
+ /** Lifecycle of the AI session bootstrap. */
8526
+ type AiChatInitState = 'checking' | 'unavailable' | 'ready' | 'error';
8527
+ declare class AiChatService {
8528
+ private readonly destroyRef;
8529
+ private controller;
8530
+ private unsubscribe;
8531
+ private started;
8532
+ /**
8533
+ * Tool call ids we have already reported to {@link toolTargetHandler}, so the
8534
+ * live on-canvas focus fires once per call as it first appears (the vanilla
8535
+ * controller has no `onToolCall` hook we can pass, so we derive tool activity
8536
+ * from the streamed snapshot instead).
8537
+ */
8538
+ private readonly reportedToolCalls;
8539
+ private toolTargetHandler;
8540
+ /** Session bootstrap lifecycle. */
8541
+ readonly state: _angular_core.WritableSignal<AiChatInitState>;
8542
+ /** The current transcript. */
8543
+ readonly messages: _angular_core.WritableSignal<readonly PptxAiUIMessage[]>;
8544
+ /** The chat status (`ready` / `submitted` / `streaming` / `error`). */
8545
+ readonly status: _angular_core.WritableSignal<AiSdk.ChatStatus>;
8546
+ /** The last transport / streaming error, when any. */
8547
+ readonly error: _angular_core.WritableSignal<Error | undefined>;
8548
+ /** The bootstrap error (SDK missing / session build failed). */
8549
+ readonly initError: _angular_core.WritableSignal<Error | undefined>;
8550
+ /** The staged, not-yet-applied write proposals. */
8551
+ readonly proposals: _angular_core.WritableSignal<readonly ProposalView[]>;
8552
+ /** Whether a request is in flight (drives the composer send/stop toggle). */
8553
+ readonly isStreaming: _angular_core.Signal<boolean>;
8554
+ constructor();
8555
+ /**
8556
+ * Bootstrap the session for the given bridge + config. Idempotent: only the
8557
+ * first call takes effect (the panel calls it once when it opens).
8558
+ */
8559
+ init(bridge: PptxAiBridge, config: PptxAiConfig): void;
8560
+ /**
8561
+ * Register a handler invoked as each tool call first appears, with the slide /
8562
+ * element(s) it references (or `null` for deck-wide tools). Lets the viewer
8563
+ * navigate + highlight the canvas so it mirrors the assistant in real time.
8564
+ */
8565
+ setToolTargetHandler(handler: (target: ToolCanvasTarget | null) => void): void;
8566
+ /** Send a user message (no-op when empty or not ready). */
8567
+ send(text: string): void;
8568
+ /** Abort the in-flight request. */
8569
+ stop(): void;
8570
+ /** Clear the current error and return to the ready state. */
8571
+ clearError(): void;
8572
+ /** Accept one staged proposal (applies it as one undoable edit). */
8573
+ applyProposal(id: string): void;
8574
+ /** Reject one staged proposal without applying it. */
8575
+ rejectProposal(id: string): void;
8576
+ /** Accept every staged proposal in order (each its own undoable edit). */
8577
+ acceptAllProposals(): void;
8578
+ private applySnapshot;
8579
+ /**
8580
+ * Fire {@link toolTargetHandler} once per tool call as it first appears with a
8581
+ * resolved input, mirroring React's `onToolCall` -> `toolCanvasTarget` path
8582
+ * (the vanilla controller owns `onToolCall`, so we cannot hook it directly).
8583
+ */
8584
+ private reportNewToolTargets;
8585
+ private refreshProposals;
8586
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChatService, never>;
8587
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AiChatService>;
8588
+ }
8589
+
8590
+ declare class AiChatPanelComponent {
8591
+ readonly bridge: _angular_core.InputSignal<PptxAiBridge>;
8592
+ readonly config: _angular_core.InputSignal<PptxAiConfig>;
8593
+ readonly panelWidth: _angular_core.InputSignal<number | undefined>;
8594
+ readonly closed: _angular_core.OutputEmitterRef<void>;
8595
+ protected readonly chat: AiChatService;
8596
+ /** Shared panel scope + on-canvas highlight store (provided by the viewer). */
8597
+ protected readonly store: AiPanelStore;
8598
+ constructor();
8599
+ /**
8600
+ * Apply a suggestion, first enabling the canvas colour tween so the edit fades
8601
+ * in rather than snapping (proposals apply outside the tool loop).
8602
+ */
8603
+ protected applyProposal(id: string): void;
8604
+ protected acceptAllProposals(): void;
8605
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChatPanelComponent, never>;
8606
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiChatPanelComponent, "pptx-ai-chat-panel", never, { "bridge": { "alias": "bridge"; "required": true; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
8607
+ }
8608
+
8609
+ /**
8610
+ * createAngularAiBridge: builds a {@link PptxAiBridge} that lets the
8611
+ * framework-agnostic AI core (`pptx-viewer-shared/ai`) read the open deck,
8612
+ * navigate it, and route edits through the Angular editor-history layer so
8613
+ * every AI change is a single, undoable Ctrl+Z.
8614
+ *
8615
+ * The bridge is a plain object closing over a small set of accessor callbacks
8616
+ * (mirroring React's `useAiBridge` ref indirection): each read pulls the live
8617
+ * value on demand, and each of the three write choke points funnels through
8618
+ * {@link BridgeDeps.applySlides} -> `EditorStateService.applyReplacement`, which
8619
+ * records ONE history snapshot per commit. Keeping writes funnelled is what lets
8620
+ * the {@link ProposalStore} apply a staged batch atomically.
8621
+ */
8622
+
8623
+ /** Live accessors the bridge closes over, supplied by the viewer component. */
8624
+ interface BridgeDeps {
8625
+ /** The editable (template-free) slide deck. */
8626
+ getSlides(): readonly PptxSlide[];
8627
+ /** Zero-based index of the active slide. */
8628
+ getActiveSlideIndex(): number;
8629
+ /** Slide canvas size in CSS pixels. */
8630
+ getCanvasSize(): {
8631
+ width: number;
8632
+ height: number;
8633
+ };
8634
+ /** The resolved presentation theme, when loaded. */
8635
+ getTheme(): PptxTheme | undefined;
8636
+ /** Host-provided document display name, when set. */
8637
+ getFileName(): string | undefined;
8638
+ /** The loaded core handler, when a deck is open. */
8639
+ getHandler(): PptxHandler | undefined;
8640
+ /** Navigate the viewer to a slide by zero-based index. */
8641
+ goToSlide(index: number): void;
8642
+ /** Select the given elements on a slide (empty clears selection). */
8643
+ selectElements(slideIndex: number, elementIds: readonly string[]): void;
8644
+ /**
8645
+ * Commit a fully-computed next slides array as ONE undoable history entry.
8646
+ * Implemented by the component as `editor.applyReplacement(next, label)`.
8647
+ */
8648
+ applySlides(next: PptxSlide[], label: string): void;
8649
+ /** Apply partial theme updates through the editor's theme handlers. */
8650
+ applyTheme(updates: Partial<PptxTheme>): void;
8651
+ /** Ordered presentation sections (editor-tracked, saved with the deck). */
8652
+ getSections(): readonly PptxSection[];
8653
+ /** Presentation-level properties (`p:presentationPr`), loader-tracked. */
8654
+ getPresentationProperties(): PptxPresentationProperties;
8655
+ /** Custom document properties (`docProps/custom.xml`), loader-tracked. */
8656
+ getCustomProperties(): readonly PptxCustomProperty[];
8657
+ /** Core document properties (`docProps/core.xml`), loader-tracked. */
8658
+ getCoreProperties(): PptxCoreProperties | undefined;
8659
+ /** Extended application properties (`docProps/app.xml`), loader-tracked. */
8660
+ getAppProperties(): PptxAppProperties | undefined;
8661
+ /** Set the slide canvas size (px) and mark the deck dirty. */
8662
+ setCanvasSize(size: {
8663
+ width: number;
8664
+ height: number;
8665
+ }): void;
8666
+ /** Replace the presentation sections and mark the deck dirty. */
8667
+ setSections(sections: readonly PptxSection[]): void;
8668
+ /** Replace the presentation-level properties and mark the deck dirty. */
8669
+ setPresentationProperties(props: PptxPresentationProperties): void;
8670
+ /** Replace the custom document properties and mark the deck dirty. */
8671
+ setCustomProperties(props: readonly PptxCustomProperty[]): void;
8672
+ /** Replace the core document properties and mark the deck dirty. */
8673
+ setCoreProperties(props: PptxCoreProperties | undefined): void;
8674
+ /** Replace the extended application properties and mark the deck dirty. */
8675
+ setAppProperties(props: PptxAppProperties | undefined): void;
8676
+ /**
8677
+ * The slides / elements the assistant should scope its work to (explicit AI
8678
+ * picks, else a pinned focus, else the live canvas selection). When omitted,
8679
+ * the assistant falls back to the whole active slide.
8680
+ */
8681
+ getFocusedTargets?(): PptxAiFocusedTarget[];
8682
+ /** Optional transient host notification (toast / status line). */
8683
+ notify?(message: string, level?: PptxAiNotifyLevel): void;
8684
+ }
8685
+ /** Build a stable {@link PptxAiBridge} over the Angular viewer state/editor. */
8686
+ declare function createAngularAiBridge(deps: BridgeDeps): PptxAiBridge;
8687
+
8688
+ /**
8689
+ * Pure gating predicate for the AI assistant UI. The ribbon Sparkles toggle and
8690
+ * the chat pane are shown only when the host supplies an `ai` config; keeping
8691
+ * this a standalone function makes the rule unit-testable without mounting the
8692
+ * component (the Angular test setup is TestBed-free).
8693
+ */
8694
+
8695
+ /** Whether the AI assistant toggle should be shown for the given config. */
8696
+ declare function aiToggleVisible(config: PptxAiConfig | undefined): boolean;
8697
+
8698
+ declare class AiComposerComponent {
8699
+ readonly isStreaming: _angular_core.InputSignal<boolean>;
8700
+ /**
8701
+ * One-shot composer prefill from "Ask AI" / "Fix with AI". `prefillNonce`
8702
+ * bumps on every request so the composer applies `prefillText` (and focuses)
8703
+ * even when the text is empty and unchanged.
8704
+ */
8705
+ readonly prefillText: _angular_core.InputSignal<string>;
8706
+ readonly prefillNonce: _angular_core.InputSignal<number>;
8707
+ readonly onSend: _angular_core.OutputEmitterRef<string>;
8708
+ readonly onStop: _angular_core.OutputEmitterRef<void>;
8709
+ protected readonly value: _angular_core.WritableSignal<string>;
8710
+ private readonly textarea;
8711
+ private lastPrefillNonce;
8712
+ constructor();
8713
+ protected submit(): void;
8714
+ protected onKeyDown(event: KeyboardEvent): void;
8715
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiComposerComponent, never>;
8716
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiComposerComponent, "pptx-ai-composer", never, { "isStreaming": { "alias": "isStreaming"; "required": false; "isSignal": true; }; "prefillText": { "alias": "prefillText"; "required": false; "isSignal": true; }; "prefillNonce": { "alias": "prefillNonce"; "required": false; "isSignal": true; }; }, { "onSend": "onSend"; "onStop": "onStop"; }, never, never, true, never>;
8717
+ }
8718
+
8719
+ declare class AiFocusBarComponent {
8720
+ /** Live deck, for resolving element chip labels + the two-table detection. */
8721
+ readonly slides: _angular_core.InputSignal<readonly PptxSlide[]>;
8722
+ /** Emitted with a ready-to-send directive (e.g. the merge-tables request). */
8723
+ readonly sendDirective: _angular_core.OutputEmitterRef<string>;
8724
+ protected readonly store: AiPanelStore;
8725
+ protected readonly chips: _angular_core.Signal<pptx_angular_viewer.FocusChip[]>;
8726
+ protected readonly twoTables: _angular_core.Signal<false | {
8727
+ slideIndex: number;
8728
+ elementIdA: string;
8729
+ elementIdB: string;
8730
+ }>;
8731
+ protected onMerge(tt: {
8732
+ slideIndex: number;
8733
+ elementIdA: string;
8734
+ elementIdB: string;
8735
+ }): void;
8736
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiFocusBarComponent, never>;
8737
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiFocusBarComponent, "pptx-ai-focus-bar", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; }, { "sendDirective": "sendDirective"; }, never, never, true, never>;
8738
+ }
8739
+
8740
+ /** One tool invocation captured with its full technical detail. */
8741
+ interface AiLogToolCall {
8742
+ toolName: string;
8743
+ toolCallId: string;
8744
+ state: string;
8745
+ input: unknown;
8746
+ output: unknown;
8747
+ errorText?: string;
8748
+ }
8749
+ /** One message: its role, concatenated prose, and any tool calls it made. */
8750
+ interface AiLogMessage {
8751
+ role: string;
8752
+ text: string;
8753
+ toolCalls: AiLogToolCall[];
8754
+ }
8755
+ /** One chat conversation in export form. */
8756
+ interface AiLogChat {
8757
+ id: string;
8758
+ title: string;
8759
+ deckId?: string;
8760
+ createdAt: number;
8761
+ updatedAt: number;
8762
+ createdAtIso: string;
8763
+ updatedAtIso: string;
8764
+ messageCount: number;
8765
+ messages: AiLogMessage[];
8766
+ }
8767
+ /** Top-level detailed export document. */
8768
+ interface AiLogExport {
8769
+ format: 'pptx-ai-chat-log';
8770
+ version: 1;
8771
+ exportedAt: string;
8772
+ /** Whether tool inputs/outputs are included (see `detailed` option). */
8773
+ detailed: boolean;
8774
+ chatCount: number;
8775
+ chats: AiLogChat[];
8776
+ }
8777
+ /** Options controlling how the export document is built. */
8778
+ interface BuildChatLogOptions {
8779
+ /** Include tool-call inputs/outputs. Default `true`. When false, tool calls
8780
+ * still list name + state but omit the (potentially large) payloads. */
8781
+ detailed?: boolean;
8782
+ /** Epoch ms stamped as `exportedAt`. Default `Date.now()`. */
8783
+ now?: number;
8784
+ }
8785
+ /** Build the detailed export document from already-loaded chats (pure). */
8786
+ declare function buildChatLogExport(chats: readonly PptxAiStoredChat[], options?: BuildChatLogOptions): AiLogExport;
8787
+ /** Render the same detailed export as a human-readable Markdown transcript. */
8788
+ declare function buildChatLogMarkdown(doc: AiLogExport): string;
8789
+ /** Load every stored chat (newest first) in full detail from a store. */
8790
+ declare function collectStoredChats(store: PptxAiChatStore): Promise<PptxAiStoredChat[]>;
8791
+ /** File format to download. */
8792
+ type AiLogFormat = 'json' | 'markdown';
8793
+ /** Options for {@link exportAiChatLogs}. */
8794
+ interface ExportAiChatLogsOptions {
8795
+ /** Store to read from. Defaults to the shared `createChatHistoryStore()`. */
8796
+ store?: PptxAiChatStore;
8797
+ /** `'json'` (default) or `'markdown'`. */
8798
+ format?: AiLogFormat;
8799
+ /** Include tool inputs/outputs. Default `true`. */
8800
+ detailed?: boolean;
8801
+ /** Epoch ms for the filename + `exportedAt`. Default `Date.now()`. */
8802
+ now?: number;
8803
+ }
8804
+ /**
8805
+ * Read all stored chats and trigger a browser download of the detailed log.
8806
+ *
8807
+ * @returns the number of chats exported. When `0`, no file is downloaded so the
8808
+ * caller can surface an empty-state message instead.
8809
+ */
8810
+ declare function exportAiChatLogs(options?: ExportAiChatLogsOptions): Promise<number>;
8811
+
8812
+ declare class AiSettingsSectionComponent {
8813
+ private readonly store;
8814
+ /** Number of stored chats (null while counting). */
8815
+ protected readonly chatCount: _angular_core.WritableSignal<number | null>;
8816
+ /** Include tool inputs/outputs in the export. */
8817
+ protected readonly detailed: _angular_core.WritableSignal<boolean>;
8818
+ protected readonly busy: _angular_core.WritableSignal<boolean>;
8819
+ /** Result of the last export, or null before any export runs. */
8820
+ protected readonly doneCount: _angular_core.WritableSignal<number | null>;
8821
+ constructor();
8822
+ protected onExport(format: AiLogFormat): void;
8823
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiSettingsSectionComponent, never>;
8824
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiSettingsSectionComponent, "pptx-ai-settings-section", never, {}, {}, never, never, true, never>;
8825
+ }
8826
+
8827
+ declare class AiChangeOverlayComponent {
8828
+ /** The batch of just-applied changes to animate (null when idle). */
8829
+ readonly batch: _angular_core.InputSignal<AiChangeBatch | null>;
8830
+ /** Zero-based active slide index, so the overlay draws only its own slide. */
8831
+ readonly activeSlideIndex: _angular_core.InputSignal<number>;
8832
+ private readonly host;
8833
+ private readonly renderer;
8834
+ private styleEl;
8835
+ /** `start` (pre-flip) then `end` (post-flip) so the CSS transition runs. */
8836
+ private readonly phase;
8837
+ private outerFrame;
8838
+ private innerFrame;
8839
+ /** Monotonic batch id; keys the ghosts + restarts the phase flip per batch. */
8840
+ protected readonly nonce: _angular_core.Signal<number>;
8841
+ /** The changes on the currently visible slide (bounds map 1:1 to the stage). */
8842
+ protected readonly activeChanges: _angular_core.Signal<AiElementChange[]>;
8843
+ constructor();
8844
+ /** Kebab-cased ghost-rect style for one change at the current phase. */
8845
+ protected ghostStyle(change: AiElementChange): StyleMap;
8846
+ private cancelFrames;
8847
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChangeOverlayComponent, never>;
8848
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiChangeOverlayComponent, "pptx-ai-change-overlay", never, { "batch": { "alias": "batch"; "required": false; "isSignal": true; }; "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8849
+ }
8850
+
8851
+ interface HighlightBox extends AiCanvasHighlight {
8852
+ x: number;
8853
+ y: number;
8854
+ width: number;
8855
+ height: number;
8856
+ }
8857
+ declare class AiFocusHighlightOverlayComponent {
8858
+ readonly highlights: _angular_core.InputSignal<readonly AiCanvasHighlight[]>;
8859
+ /** Elements of the currently visible slide, for bounds lookup. */
8860
+ readonly elements: _angular_core.InputSignal<readonly PptxElement[]>;
8861
+ readonly activeSlideIndex: _angular_core.InputSignal<number>;
8862
+ /** Resolve each highlight to a positioned box on the active slide. */
8863
+ protected readonly boxes: _angular_core.Signal<HighlightBox[]>;
8864
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiFocusHighlightOverlayComponent, never>;
8865
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiFocusHighlightOverlayComponent, "pptx-ai-focus-highlight-overlay", never, { "highlights": { "alias": "highlights"; "required": false; "isSignal": true; }; "elements": { "alias": "elements"; "required": false; "isSignal": true; }; "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8866
+ }
8867
+
8868
+ /** One rendered transcript row: a message flattened to its renderable parts. */
8869
+ interface MessageRow {
8870
+ id: string;
8871
+ isUser: boolean;
8872
+ parts: RenderablePart[];
8873
+ }
8874
+ declare class AiMessageListComponent {
8875
+ readonly messages: _angular_core.InputSignal<readonly PptxAiUIMessage[]>;
8876
+ readonly isStreaming: _angular_core.InputSignal<boolean>;
8877
+ private readonly endRef;
8878
+ /** Flatten each message into renderable parts, dropping empty assistant turns. */
8879
+ protected readonly rows: _angular_core.Signal<MessageRow[]>;
8880
+ constructor();
8881
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiMessageListComponent, never>;
8882
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiMessageListComponent, "pptx-ai-message-list", never, { "messages": { "alias": "messages"; "required": true; "isSignal": true; }; "isStreaming": { "alias": "isStreaming"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8883
+ }
8884
+
8885
+ declare class AiProposalCardComponent {
8886
+ readonly proposal: _angular_core.InputSignal<ProposalView>;
8887
+ readonly accept: _angular_core.OutputEmitterRef<string>;
8888
+ readonly reject: _angular_core.OutputEmitterRef<string>;
8889
+ /** Plain-language description of every staged change (never truncated). */
8890
+ protected readonly lines: _angular_core.Signal<string[]>;
8891
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiProposalCardComponent, never>;
8892
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiProposalCardComponent, "pptx-ai-proposal-card", never, { "proposal": { "alias": "proposal"; "required": true; "isSignal": true; }; }, { "accept": "accept"; "reject": "reject"; }, never, never, true, never>;
8893
+ }
8894
+
8895
+ declare class AiToolCallCardComponent {
8896
+ readonly part: _angular_core.InputSignal<RenderableToolPart>;
8897
+ protected readonly failed: _angular_core.Signal<boolean>;
8898
+ protected readonly done: _angular_core.Signal<boolean>;
8899
+ protected readonly running: _angular_core.Signal<boolean>;
8900
+ /** Friendly, non-technical activity ("Looked at slide 5"); never leaks ids. */
8901
+ private readonly activity;
8902
+ protected readonly icon: _angular_core.Signal<ToolActivityIcon>;
8903
+ protected readonly activityLabel: _angular_core.Signal<string>;
8904
+ /** Raw tool name + arg summary, only shown inside the collapsed disclosure. */
8905
+ protected readonly rawSummary: _angular_core.Signal<string>;
8906
+ protected readonly rawLabel: _angular_core.Signal<string>;
8907
+ protected readonly iconClass: _angular_core.Signal<"h-3.5 w-3.5 shrink-0 text-destructive" | "h-3.5 w-3.5 shrink-0 text-muted-foreground">;
8908
+ protected readonly statusKey: _angular_core.Signal<"pptx.ai.toolFailed" | "pptx.ai.toolDone" | "pptx.ai.toolRunning">;
8909
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiToolCallCardComponent, never>;
8910
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiToolCallCardComponent, "pptx-ai-tool-call-card", never, { "part": { "alias": "part"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
8911
+ }
7579
8912
 
7580
8913
  /** Drawing tool IDs (mirrors React DRAW_TOOLS). */
7581
8914
  type DrawTool$1 = 'select' | 'pen' | 'highlighter' | 'eraser' | 'freeform';
@@ -7661,6 +8994,10 @@ declare class RibbonComponent {
7661
8994
  readonly showSubtitles: _angular_core.InputSignal<boolean>;
7662
8995
  /** Toolbar buttons/tabs the host wants hidden. Default `[]` hides nothing. */
7663
8996
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
8997
+ /** Whether the host enabled the AI assistant (shows the Sparkles toggle). */
8998
+ readonly aiEnabled: _angular_core.InputSignal<boolean>;
8999
+ /** Whether the AI assistant panel is currently open (toggle active state). */
9000
+ readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
7664
9001
  /** Optional sign-in hook point for File > Account. Absent/disabled by default. */
7665
9002
  readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
7666
9003
  readonly prev: _angular_core.OutputEmitterRef<void>;
@@ -7692,6 +9029,8 @@ declare class RibbonComponent {
7692
9029
  readonly packageForSharing: _angular_core.OutputEmitterRef<void>;
7693
9030
  /** Emitted when the user toggles the slides panel from the top bar. */
7694
9031
  readonly toggleSidebar: _angular_core.OutputEmitterRef<void>;
9032
+ /** Emitted when the user clicks the AI assistant Sparkles toggle. */
9033
+ readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
7695
9034
  /** Emitted when the user opens the Digital Signatures panel from the File tab. */
7696
9035
  readonly signatures: _angular_core.OutputEmitterRef<void>;
7697
9036
  readonly info: _angular_core.OutputEmitterRef<void>;
@@ -7758,7 +9097,7 @@ declare class RibbonComponent {
7758
9097
  /** Forward the Review proofing toggle to the viewer-owned live state. */
7759
9098
  protected setSpellCheck(enabled: boolean): void;
7760
9099
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonComponent, never>;
7761
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonComponent, "pptx-ribbon", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "selectedElement": { "alias": "selectedElement"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "formatPainterActive": { "alias": "formatPainterActive"; "required": false; "isSignal": true; }; "canActivateFormatPainter": { "alias": "canActivateFormatPainter"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "hasMacros": { "alias": "hasMacros"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "eyedropperActive": { "alias": "eyedropperActive"; "required": false; "isSignal": true; }; "themeGalleryOpen": { "alias": "themeGalleryOpen"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "findOpen": { "alias": "findOpen"; "required": false; "isSignal": true; }; "collabConnected": { "alias": "collabConnected"; "required": false; "isSignal": true; }; "connectedCount": { "alias": "connectedCount"; "required": false; "isSignal": true; }; "spellCheckEnabled": { "alias": "spellCheckEnabled"; "required": false; "isSignal": true; }; "showSubtitles": { "alias": "showSubtitles"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; }, { "prev": "prev"; "next": "next"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; "find": "find"; "present": "present"; "presenter": "presenter"; "record": "record"; "presentFromBeginning": "presentFromBeginning"; "rehearseTimings": "rehearseTimings"; "toggleSubtitles": "toggleSubtitles"; "openSubtitleSettings": "openSubtitleSettings"; "recordFromBeginning": "recordFromBeginning"; "recordFromCurrent": "recordFromCurrent"; "spellCheckChange": "spellCheckChange"; "share": "share"; "broadcast": "broadcast"; "openFile": "openFile"; "openRecentFile": "openRecentFile"; "createPresentation": "createPresentation"; "save": "save"; "savePpsx": "savePpsx"; "savePptm": "savePptm"; "packageForSharing": "packageForSharing"; "toggleSidebar": "toggleSidebar"; "signatures": "signatures"; "info": "info"; "print": "print"; "comments": "comments"; "a11y": "a11y"; "link": "link"; "openSorter": "openSorter"; "openMasterView": "openMasterView"; "toggleNotes": "toggleNotes"; "toggleFormatPainter": "toggleFormatPainter"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "copySlideAsImage": "copySlideAsImage"; "replace": "replace"; "toggleInspector": "toggleInspector"; "drawToolChange": "drawToolChange"; "toggleThemeGallery": "toggleThemeGallery"; "toggleGrid": "toggleGrid"; "toggleRulers": "toggleRulers"; "toggleGuides": "toggleGuides"; "toggleSelectionPane": "toggleSelectionPane"; "openCustomShows": "openCustomShows"; "toggleSnapToGrid": "toggleSnapToGrid"; "toggleSnapToShape": "toggleSnapToShape"; "addGuide": "addGuide"; "zoomToFit": "zoomToFit"; "toggleEyedropper": "toggleEyedropper"; "openSmartArtDialog": "openSmartArtDialog"; "openEquationDialog": "openEquationDialog"; "openSetUpSlideShow": "openSetUpSlideShow"; "openCompare": "openCompare"; "openPassword": "openPassword"; "openFontEmbedding": "openFontEmbedding"; "openVersionHistory": "openVersionHistory"; "openShortcuts": "openShortcuts"; "openSettings": "openSettings"; }, never, never, true, never>;
9100
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonComponent, "pptx-ribbon", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "selectedElement": { "alias": "selectedElement"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "formatPainterActive": { "alias": "formatPainterActive"; "required": false; "isSignal": true; }; "canActivateFormatPainter": { "alias": "canActivateFormatPainter"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "hasMacros": { "alias": "hasMacros"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "eyedropperActive": { "alias": "eyedropperActive"; "required": false; "isSignal": true; }; "themeGalleryOpen": { "alias": "themeGalleryOpen"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "findOpen": { "alias": "findOpen"; "required": false; "isSignal": true; }; "collabConnected": { "alias": "collabConnected"; "required": false; "isSignal": true; }; "connectedCount": { "alias": "connectedCount"; "required": false; "isSignal": true; }; "spellCheckEnabled": { "alias": "spellCheckEnabled"; "required": false; "isSignal": true; }; "showSubtitles": { "alias": "showSubtitles"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "aiEnabled": { "alias": "aiEnabled"; "required": false; "isSignal": true; }; "aiPanelOpen": { "alias": "aiPanelOpen"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; }, { "prev": "prev"; "next": "next"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; "find": "find"; "present": "present"; "presenter": "presenter"; "record": "record"; "presentFromBeginning": "presentFromBeginning"; "rehearseTimings": "rehearseTimings"; "toggleSubtitles": "toggleSubtitles"; "openSubtitleSettings": "openSubtitleSettings"; "recordFromBeginning": "recordFromBeginning"; "recordFromCurrent": "recordFromCurrent"; "spellCheckChange": "spellCheckChange"; "share": "share"; "broadcast": "broadcast"; "openFile": "openFile"; "openRecentFile": "openRecentFile"; "createPresentation": "createPresentation"; "save": "save"; "savePpsx": "savePpsx"; "savePptm": "savePptm"; "packageForSharing": "packageForSharing"; "toggleSidebar": "toggleSidebar"; "toggleAiPanel": "toggleAiPanel"; "signatures": "signatures"; "info": "info"; "print": "print"; "comments": "comments"; "a11y": "a11y"; "link": "link"; "openSorter": "openSorter"; "openMasterView": "openMasterView"; "toggleNotes": "toggleNotes"; "toggleFormatPainter": "toggleFormatPainter"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "copySlideAsImage": "copySlideAsImage"; "replace": "replace"; "toggleInspector": "toggleInspector"; "drawToolChange": "drawToolChange"; "toggleThemeGallery": "toggleThemeGallery"; "toggleGrid": "toggleGrid"; "toggleRulers": "toggleRulers"; "toggleGuides": "toggleGuides"; "toggleSelectionPane": "toggleSelectionPane"; "openCustomShows": "openCustomShows"; "toggleSnapToGrid": "toggleSnapToGrid"; "toggleSnapToShape": "toggleSnapToShape"; "addGuide": "addGuide"; "zoomToFit": "zoomToFit"; "toggleEyedropper": "toggleEyedropper"; "openSmartArtDialog": "openSmartArtDialog"; "openEquationDialog": "openEquationDialog"; "openSetUpSlideShow": "openSetUpSlideShow"; "openCompare": "openCompare"; "openPassword": "openPassword"; "openFontEmbedding": "openFontEmbedding"; "openVersionHistory": "openVersionHistory"; "openShortcuts": "openShortcuts"; "openSettings": "openSettings"; }, never, never, true, never>;
7762
9101
  }
7763
9102
 
7764
9103
  /** The eight resize-handle positions around a selection box. */
@@ -7999,6 +9338,27 @@ declare class SlideCanvasComponent implements SlideContext {
7999
9338
  * slide's own elements; interactive only while {@link editTemplateMode} is on.
8000
9339
  */
8001
9340
  readonly templateElements: _angular_core.InputSignal<readonly PptxElement[]>;
9341
+ /**
9342
+ * On-canvas AI highlight rings (explicit picks + the live tool focus), drawn
9343
+ * inside the scaled stage so element coords map 1:1. Empty on thumbnails.
9344
+ */
9345
+ readonly aiHighlights: _angular_core.InputSignal<readonly AiCanvasHighlight[]>;
9346
+ /** True while the AI is active: enables the colour tween on slide elements. */
9347
+ readonly aiActive: _angular_core.InputSignal<boolean>;
9348
+ /** Zero-based active slide index, so the overlay draws only its own slide. */
9349
+ readonly aiActiveSlideIndex: _angular_core.InputSignal<number>;
9350
+ /**
9351
+ * The batch of just-applied AI element changes to play on the canvas (glide
9352
+ * old->new, fade/scale in-out, glow), or null when idle. Drawn inside the
9353
+ * scaled stage next to the focus overlay so bounds map 1:1. Empty on thumbnails.
9354
+ */
9355
+ readonly aiChangeBatch: _angular_core.InputSignal<AiChangeBatch | null>;
9356
+ /**
9357
+ * When true, the next element click(s) become AI picks (emitted via
9358
+ * {@link elementSelect}) instead of selecting / dragging. mousedown never
9359
+ * starts a drag while picking, mirroring React's pick mode.
9360
+ */
9361
+ readonly aiPickMode: _angular_core.InputSignal<boolean>;
8002
9362
  /** Active draw tool. When not 'select', pointer gestures draw ink strokes. */
8003
9363
  readonly drawTool: _angular_core.InputSignal<"pen" | "highlighter" | "eraser" | "select" | "freeform">;
8004
9364
  /** Active ink stroke colour (CSS colour string). */
@@ -8211,7 +9571,22 @@ declare class SlideCanvasComponent implements SlideContext {
8211
9571
  readonly vRulerTicks: _angular_core.Signal<readonly RulerTick[]>;
8212
9572
  readonly stageStyle: _angular_core.Signal<StyleMap>;
8213
9573
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideCanvasComponent, never>;
8214
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideCanvasComponent, "pptx-slide-canvas", never, { "slide": { "alias": "slide"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "guideCommand": { "alias": "guideCommand"; "required": false; "isSignal": true; }; "spellCheck": { "alias": "spellCheck"; "required": false; "isSignal": true; }; "snapToGuides": { "alias": "snapToGuides"; "required": false; "isSignal": true; }; "autoFit": { "alias": "autoFit"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; "editingId": { "alias": "editingId"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "drawTool": { "alias": "drawTool"; "required": false; "isSignal": true; }; "drawColor": { "alias": "drawColor"; "required": false; "isSignal": true; }; "drawWidth": { "alias": "drawWidth"; "required": false; "isSignal": true; }; }, { "elementSelect": "elementSelect"; "backgroundClick": "backgroundClick"; "transformStart": "transformStart"; "transformUpdate": "transformUpdate"; "contextMenu": "contextMenu"; "textEditStart": "textEditStart"; "textCommit": "textCommit"; "textCancel": "textCancel"; "textFormat": "textFormat"; "rotateUpdate": "rotateUpdate"; "marqueeSelect": "marqueeSelect"; "inkStrokeComplete": "inkStrokeComplete"; "eraserHit": "eraserHit"; "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
9574
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideCanvasComponent, "pptx-slide-canvas", never, { "slide": { "alias": "slide"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "guideCommand": { "alias": "guideCommand"; "required": false; "isSignal": true; }; "spellCheck": { "alias": "spellCheck"; "required": false; "isSignal": true; }; "snapToGuides": { "alias": "snapToGuides"; "required": false; "isSignal": true; }; "autoFit": { "alias": "autoFit"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; "editingId": { "alias": "editingId"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "aiHighlights": { "alias": "aiHighlights"; "required": false; "isSignal": true; }; "aiActive": { "alias": "aiActive"; "required": false; "isSignal": true; }; "aiActiveSlideIndex": { "alias": "aiActiveSlideIndex"; "required": false; "isSignal": true; }; "aiChangeBatch": { "alias": "aiChangeBatch"; "required": false; "isSignal": true; }; "aiPickMode": { "alias": "aiPickMode"; "required": false; "isSignal": true; }; "drawTool": { "alias": "drawTool"; "required": false; "isSignal": true; }; "drawColor": { "alias": "drawColor"; "required": false; "isSignal": true; }; "drawWidth": { "alias": "drawWidth"; "required": false; "isSignal": true; }; }, { "elementSelect": "elementSelect"; "backgroundClick": "backgroundClick"; "transformStart": "transformStart"; "transformUpdate": "transformUpdate"; "contextMenu": "contextMenu"; "textEditStart": "textEditStart"; "textCommit": "textCommit"; "textCancel": "textCancel"; "textFormat": "textFormat"; "rotateUpdate": "rotateUpdate"; "marqueeSelect": "marqueeSelect"; "inkStrokeComplete": "inkStrokeComplete"; "eraserHit": "eraserHit"; "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
9575
+ }
9576
+
9577
+ /**
9578
+ * Renderer-injected shape-effect definitions that need a companion DOM node
9579
+ * (a soft-edge `<filter>` def, a DAG fill-overlay tint layer), plus the helper
9580
+ * that strips dangling `url(#…)` filter references.
9581
+ *
9582
+ * Kept out of `element-style.ts` so that module stays focused on producing the
9583
+ * base `[ngStyle]` maps. Mirrors the Vue/Svelte `ShapeEffectOverlay` split.
9584
+ */
9585
+
9586
+ /** Injectable soft-edge `<filter>` descriptor (id + feather radius in px). */
9587
+ interface SoftEdgeFilterDef {
9588
+ id: string;
9589
+ radius: number;
8215
9590
  }
8216
9591
 
8217
9592
  /**
@@ -8349,6 +9724,16 @@ interface Paragraph {
8349
9724
  bulletStyle: StyleMap;
8350
9725
  /** Left indent in px derived from the paragraph outline level. */
8351
9726
  indentPx: number;
9727
+ /**
9728
+ * Per-paragraph `line-height` from this paragraph's own `a:lnSpc`: a unitless
9729
+ * multiplier (`a:spcPct`) or a `"<n>pt"` string (`a:spcPts`). Undefined when
9730
+ * the paragraph does not override the body-level line-height.
9731
+ */
9732
+ lineHeight?: number | string;
9733
+ /** `margin-top` in px from `a:spcBef` (space before), when overridden. */
9734
+ spaceBeforePx?: number;
9735
+ /** `margin-bottom` in px from `a:spcAft` (space after), when overridden. */
9736
+ spaceAfterPx?: number;
8352
9737
  }
8353
9738
  /**
8354
9739
  * ElementRendererComponent: Angular port of the React `ElementRenderer.tsx`
@@ -8380,6 +9765,14 @@ declare class ElementRendererComponent {
8380
9765
  * the viewer subtree (thumbnails, export) default to the SVG renderer.
8381
9766
  */
8382
9767
  private readonly smartArt3DService;
9768
+ /**
9769
+ * Native-animation playback (present only inside a running presentation, which
9770
+ * provides {@link AnimationPlaybackService} at the overlay level). Optional so
9771
+ * the same renderer in the editor / thumbnails / export resolves to `null` and
9772
+ * renders with no animation state. Mirrors the Vue `injectPresentationElementStates`
9773
+ * provide/inject and React's threaded `presentationElementStates` prop.
9774
+ */
9775
+ private readonly playback;
8383
9776
  private readonly translate;
8384
9777
  readonly smartArt3D: _angular_core.Signal<boolean>;
8385
9778
  /** Obstacle rects (absolute slide coords) for connector A* routing. */
@@ -8417,6 +9810,12 @@ declare class ElementRendererComponent {
8417
9810
  * no effect at all when false, so default rendering is untouched.
8418
9811
  */
8419
9812
  readonly editTemplateMode: _angular_core.InputSignal<boolean>;
9813
+ /**
9814
+ * The enclosing group's fill (`GroupPptxElement.groupFill`), passed down by
9815
+ * the group render branch so a child painted with `a:grpFill`
9816
+ * (`fillMode === 'group'`) inherits the group's resolved fill.
9817
+ */
9818
+ readonly parentGroupFill: _angular_core.InputSignal<ShapeStyle | undefined>;
8420
9819
  /** Emitted when a table cell's text edit is committed. */
8421
9820
  readonly cellCommit: _angular_core.OutputEmitterRef<{
8422
9821
  id: string;
@@ -8429,12 +9828,30 @@ declare class ElementRendererComponent {
8429
9828
  }>;
8430
9829
  /** Duotone SVG `<filter>` descriptor for this element, if any. */
8431
9830
  readonly duotoneFilter: _angular_core.Signal<pptx_angular_viewer.DuotoneFilterDef | undefined>;
9831
+ /**
9832
+ * Soft-edge feather `<filter>` descriptor (id + radius). The template injects
9833
+ * a matching `<filter>` into a hidden `<defs>` so the `filter:
9834
+ * url(#soft-edge-<id>)` reference on the shape resolves. Undefined otherwise.
9835
+ */
9836
+ readonly softEdgeFilter: _angular_core.Signal<SoftEdgeFilterDef | undefined>;
9837
+ /**
9838
+ * DAG fill-overlay tint (colour + blend mode) painted as a separate blended
9839
+ * layer over the shape. Undefined when the element has no fill overlay.
9840
+ */
9841
+ readonly fillOverlay: _angular_core.Signal<FillOverlayCss | undefined>;
8432
9842
  /**
8433
9843
  * Outline ring + slight transparency applied to inherited template
8434
9844
  * (master/layout) elements while editTemplateMode is on. Empty otherwise, so
8435
9845
  * normal rendering is never altered.
8436
9846
  */
8437
9847
  readonly templateAffordanceStyle: _angular_core.Signal<StyleMap>;
9848
+ /**
9849
+ * This element's native-animation playback state, or `undefined` outside a
9850
+ * running presentation. Drives the staged chart / SmartArt build reveal and the
9851
+ * `p:animClr` fill / stroke relinquish (threaded to the chart / SmartArt /
9852
+ * connector renderers), mirroring React's per-element `animationState`.
9853
+ */
9854
+ readonly animationState: _angular_core.Signal<ElementAnimationState | undefined>;
8438
9855
  readonly containerStyle: _angular_core.Signal<StyleMap>;
8439
9856
  readonly shapeContainerStyle: _angular_core.Signal<StyleMap>;
8440
9857
  readonly textStyle: _angular_core.Signal<StyleMap>;
@@ -8451,13 +9868,20 @@ declare class ElementRendererComponent {
8451
9868
  */
8452
9869
  readonly warpedTextStyle: _angular_core.Signal<StyleMap>;
8453
9870
  readonly children: _angular_core.Signal<PptxElement[]>;
9871
+ /**
9872
+ * This group's own fill, handed to `a:grpFill` children as their
9873
+ * `parentGroupFill`. Undefined for non-group elements. Mirrors the shared
9874
+ * `getGroupChildParentFill` helper (inlined here so the Angular binding does
9875
+ * not depend on a shared symbol that is only vendored at build time).
9876
+ */
9877
+ readonly childParentGroupFill: _angular_core.Signal<ShapeStyle | undefined>;
8454
9878
  readonly isShapeLike: _angular_core.Signal<boolean>;
8455
9879
  readonly isImageLike: _angular_core.Signal<boolean>;
8456
9880
  readonly paragraphs: _angular_core.Signal<Paragraph[]>;
8457
9881
  readonly hasText: _angular_core.Signal<boolean>;
8458
9882
  readonly placeholderLabel: _angular_core.Signal<any>;
8459
9883
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementRendererComponent, never>;
8460
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementRendererComponent, "pptx-element-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "fieldContext": { "alias": "fieldContext"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; }, { "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
9884
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementRendererComponent, "pptx-element-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "fieldContext": { "alias": "fieldContext"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; "parentGroupFill": { "alias": "parentGroupFill"; "required": false; "isSignal": true; }; }, { "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
8461
9885
  }
8462
9886
 
8463
9887
  /**
@@ -8492,9 +9916,22 @@ declare class ConnectorRendererComponent {
8492
9916
  readonly canvasHeight: _angular_core.InputSignal<number>;
8493
9917
  /** See ElementRenderer.interactive: gates the data-pptx-element contract attr. */
8494
9918
  readonly interactive: _angular_core.InputSignal<boolean>;
9919
+ /**
9920
+ * Native-animation playback state. When an active `p:animClr` colour animation
9921
+ * targets the stroke (`animatesStroke`), the SVG stroke + arrowheads paint
9922
+ * `inherit` so the wrapper's animated `stroke` keyframes cascade in. Absent
9923
+ * outside a running presentation.
9924
+ */
9925
+ readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
8495
9926
  /** All derived geometry, recomputed on every input change. */
8496
9927
  readonly geo: _angular_core.Signal<ConnectorGeometry>;
8497
9928
  readonly viewBox: _angular_core.Signal<string>;
9929
+ /**
9930
+ * Stroke paint for the line + arrowheads: `inherit` while a `p:animClr` stroke
9931
+ * colour animation is active (so the wrapper keyframes own it), else the
9932
+ * geometry's resolved stroke colour.
9933
+ */
9934
+ readonly strokeColor: _angular_core.Signal<string>;
8498
9935
  private readonly shapeStyle;
8499
9936
  readonly lineShadow: _angular_core.Signal<LineShadowParams | undefined>;
8500
9937
  readonly lineGlow: _angular_core.Signal<string | undefined>;
@@ -8512,7 +9949,7 @@ declare class ConnectorRendererComponent {
8512
9949
  readonly connectorSegments: _angular_core.Signal<TextSegment[] | undefined>;
8513
9950
  readonly connectorTextStyle: _angular_core.Signal<TextStyle | undefined>;
8514
9951
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConnectorRendererComponent, never>;
8515
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConnectorRendererComponent, "pptx-connector-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
9952
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConnectorRendererComponent, "pptx-connector-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8516
9953
  }
8517
9954
  /** One parallel stroke of a (possibly compound) connector line. */
8518
9955
  interface ConnectorStrand {
@@ -8610,6 +10047,13 @@ declare class ChartElementViewComponent {
8610
10047
  * editing additionally requires the element to be SELECTED ({@link canEdit}).
8611
10048
  */
8612
10049
  readonly editable: _angular_core.InputSignal<boolean>;
10050
+ /**
10051
+ * Native-animation playback state. When it carries a staged chart build
10052
+ * (`build.kind === 'chart'`) the chart reveals its series / categories / cells
10053
+ * progressively via the shared `applyChartBuildReveal`. Absent outside a
10054
+ * running presentation, so ordinary rendering is unaffected.
10055
+ */
10056
+ readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
8613
10057
  /**
8614
10058
  * The editor state layer. Optional: the renderer is also used outside the
8615
10059
  * editing viewer (thumbnails, export). On-canvas chart edits commit through
@@ -8639,7 +10083,12 @@ declare class ChartElementViewComponent {
8639
10083
  protected readonly canEdit: _angular_core.Signal<boolean>;
8640
10084
  /** VM of the COMMITTED data: drag geometry must not rescale mid-drag. */
8641
10085
  private readonly viewModel;
8642
- /** The element to render: committed data, or the local drag preview. */
10086
+ /**
10087
+ * The element to render: committed data, or the local drag preview, with its
10088
+ * data trimmed to the stages revealed at the current staged-build progress (the
10089
+ * drag preview wins first). Whole-chart / no-build renders return the element
10090
+ * unchanged. Mirrors the Vue `ChartRenderer`'s `revealedElement`.
10091
+ */
8643
10092
  protected readonly renderedElement: _angular_core.Signal<PptxElement>;
8644
10093
  protected readonly dragBadge: _angular_core.Signal<string>;
8645
10094
  /** The part selected for THIS chart, or null. */
@@ -8656,7 +10105,7 @@ declare class ChartElementViewComponent {
8656
10105
  protected onTitleKeydown(event: KeyboardEvent): void;
8657
10106
  protected commitTitle(): void;
8658
10107
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChartElementViewComponent, never>;
8659
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartElementViewComponent, "pptx-chart-element-view", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
10108
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartElementViewComponent, "pptx-chart-element-view", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8660
10109
  }
8661
10110
 
8662
10111
  /**
@@ -8818,6 +10267,14 @@ declare class SmartArtRendererComponent {
8818
10267
  * `editable` input). Double-clicking a node only enters edit mode when true.
8819
10268
  */
8820
10269
  readonly editable: _angular_core.InputSignal<boolean>;
10270
+ /**
10271
+ * Native-animation playback state. A staged diagram build
10272
+ * (`build.kind === 'diagram'`) reveals the leading nodes / drawing shapes for
10273
+ * the current progress; absent or non-diagram state renders every node. The
10274
+ * view box is still computed from the FULL shape set so the diagram does not
10275
+ * rescale as it builds. Mirrors the Vue `SmartArtRenderer`'s reveal slice.
10276
+ */
10277
+ readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
8821
10278
  /**
8822
10279
  * The editor state layer. Optional: the renderer is also used outside the
8823
10280
  * editing viewer (thumbnails, export), where this service is not provided.
@@ -8860,6 +10317,13 @@ declare class SmartArtRendererComponent {
8860
10317
  readonly shadowFilter: _angular_core.Signal<string | undefined>;
8861
10318
  private readonly rawDrawingShapes;
8862
10319
  readonly hasDrawingShapes: _angular_core.Signal<boolean>;
10320
+ private readonly diagramBuild;
10321
+ private readonly shownNodeCount;
10322
+ private readonly isPartialBuild;
10323
+ /** Leading node prefix revealed so far (full list when no partial build). */
10324
+ private readonly revealedNodes;
10325
+ /** Leading drawing-shape prefix revealed so far (proportional to nodes). */
10326
+ private readonly revealedShapeList;
8863
10327
  private readonly viewBox;
8864
10328
  /** `viewBox` attribute string for the drawing-shapes `<svg>`. */
8865
10329
  readonly svgViewBox: _angular_core.Signal<string>;
@@ -8934,7 +10398,7 @@ declare class SmartArtRendererComponent {
8934
10398
  private reflow;
8935
10399
  readonly isEmpty: _angular_core.Signal<boolean>;
8936
10400
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SmartArtRendererComponent, never>;
8937
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartArtRendererComponent, "pptx-smart-art-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
10401
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartArtRendererComponent, "pptx-smart-art-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8938
10402
  }
8939
10403
 
8940
10404
  /**
@@ -9384,74 +10848,50 @@ declare class ZoomRendererComponent {
9384
10848
 
9385
10849
  declare class AnimationPlaybackService {
9386
10850
  private readonly destroyRef;
9387
- /** The current slide's animations, in document/timeline order. */
9388
- private readonly animations;
9389
- private readonly showWithAnimation;
9390
- /**
9391
- * Externally-controlled playback step (e.g. derived from a parent click
9392
- * counter). `undefined` means there is no external driver. The internal
9393
- * manual step (set via advance/play/reset) takes precedence when present.
9394
- */
9395
- private readonly externalIndex;
9396
- /**
9397
- * Internal, unclamped step. `null` means "follow the external index"; any
9398
- * number means the host has taken manual control via advance/play/reset.
9399
- */
9400
- private readonly manualStep;
9401
- /** Click groups for the current slide's animations. */
9402
- readonly groups: _angular_core.Signal<AnimationClickGroup[]>;
9403
- /** Number of click groups on this slide (i.e. how many `advance()` steps). */
9404
- readonly groupCount: _angular_core.Signal<number>;
9405
- /**
9406
- * The current playback step: how many click groups have been revealed.
9407
- * Always clamped to the current group count. The manual override wins;
9408
- * otherwise it follows the external index, defaulting to 0.
9409
- */
9410
- readonly step: _angular_core.Signal<number>;
9411
- /** True when every click group has been revealed. */
9412
- readonly isComplete: _angular_core.Signal<boolean>;
9413
- /**
9414
- * Reactive map of `elementId → CSS properties` to apply for the current step.
9415
- * Only elements in revealed click groups appear.
9416
- */
9417
- readonly elementStyles: _angular_core.Signal<Map<string, CSSProperties>>;
9418
- /**
9419
- * Reactive map of `elementId → CSS properties` for elements whose entrance
9420
- * has not yet been revealed (they should be hidden so they don't flash
9421
- * visible before their group plays).
9422
- */
9423
- readonly pendingStyles: _angular_core.Signal<Map<string, CSSProperties>>;
9424
- /** Handle of the scheduled rAF auto-advance, or null when idle. */
9425
- private rafHandle;
10851
+ /** Per-element native-animation state, keyed by element id. */
10852
+ readonly presentationElementStates: _angular_core.WritableSignal<Map<string, ElementAnimationState>>;
10853
+ /** The `@keyframes` CSS to inject once per slide. */
10854
+ readonly keyframesCss: _angular_core.WritableSignal<string>;
10855
+ /** Shape ids that trigger an interactive (`onShapeClick`) sequence. */
10856
+ readonly interactiveTriggerShapeIds: _angular_core.WritableSignal<ReadonlySet<string>>;
10857
+ /** Shape ids that trigger a hover (`onHover`) sequence. */
10858
+ readonly hoverTriggerShapeIds: _angular_core.WritableSignal<ReadonlySet<string>>;
10859
+ /** True when the main timeline has no more click-groups to reveal. */
10860
+ readonly isComplete: _angular_core.WritableSignal<boolean>;
10861
+ private controller;
10862
+ private readonly timers;
10863
+ private readonly buildHandle;
10864
+ private showWithAnimation;
10865
+ private frameRoot;
10866
+ private onPlayActionSound;
10867
+ private readonly ctx;
9426
10868
  constructor();
9427
- /** Feed the current slide's animation list. Resets manual control. */
9428
- setAnimations(animations: readonly PptxElementAnimation[] | undefined, showWithAnimation?: boolean): void;
9429
- /** Update the external playback index (parent-driven build counter). */
9430
- setExternalIndex(index: number | undefined): void;
9431
- /**
9432
- * Reveal the next click group. Returns `true` if a group was revealed,
9433
- * `false` if playback was already complete (so the caller can fall through
9434
- * to slide navigation).
9435
- */
9436
- advance(): boolean;
9437
- /** Reveal every click group at once (jump to the slide's final state). */
9438
- play(): void;
9439
- /** Reset playback to before the first click group. */
9440
- reset(): void;
10869
+ /** Scope media-command (`p:cmd`) target lookups to a stage root element. */
10870
+ setFrameRoot(root: () => HTMLElement | null): void;
10871
+ /** Register a host-provided action-sound player (embedded-sound resolution). */
10872
+ setActionSoundHandler(handler: ((soundPath: string) => void) | undefined): void;
10873
+ private animationsEnabled;
10874
+ /** Clear all pending timers + the in-flight staged-build RAF. */
10875
+ clearTimers(): void;
10876
+ private syncComplete;
9441
10877
  /**
9442
- * Jump directly to a given step (clamped to the group count) and take manual
9443
- * control. Useful for scrubbing.
10878
+ * Rebuild the controller for `slide` and seed the initial element state
10879
+ * (entrance-animated elements start hidden). Auto-plays the first click-group
10880
+ * when the slide opens with a withPrevious / afterPrevious / afterDelay build.
9444
10881
  */
9445
- setStep(step: number): void;
10882
+ setSlide(slide: PptxSlide | undefined, showWithAnimation?: boolean): void;
9446
10883
  /**
9447
- * Auto-advance through every remaining click group on the animation frame,
9448
- * one group per frame. Stops automatically once playback completes or the
9449
- * service is destroyed. A no-op when already complete or when
9450
- * `requestAnimationFrame` is unavailable (SSR).
10884
+ * Reveal the next click-group. Returns `true` if a group was revealed, `false`
10885
+ * when playback is complete or animations are disabled (so the caller can fall
10886
+ * through to slide navigation).
9451
10887
  */
9452
- autoPlay(): void;
9453
- /** Cancel any in-flight rAF auto-advance. */
9454
- cancelAutoPlay(): void;
10888
+ advance(): boolean;
10889
+ /** Play an interactive shape's sequence; `true` when it triggered one. */
10890
+ handleInteractiveShapeClick(shapeId: string): boolean;
10891
+ /** Play a hover shape's sequence; `true` when it triggered one. */
10892
+ handleHoverStart(shapeId: string): boolean;
10893
+ /** Reset a hover shape's sequence so the next hover replays it. */
10894
+ handleHoverEnd(shapeId: string): void;
9455
10895
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AnimationPlaybackService, never>;
9456
10896
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AnimationPlaybackService>;
9457
10897
  }
@@ -9682,13 +11122,34 @@ declare class PresentationOverlayComponent implements OnInit {
9682
11122
  * both fire for one tap.
9683
11123
  */
9684
11124
  private closing;
11125
+ /**
11126
+ * Managed per-slide keyframes `<style>` element (colour animations + staged
11127
+ * text builds). The static preset keyframe library is injected once per
11128
+ * document by {@link ensurePresetAnimationKeyframes}.
11129
+ */
11130
+ private readonly slideKeyframes;
11131
+ /** The hover-trigger shape the pointer is currently over (fires a sequence once). */
11132
+ private currentHoverTriggerId;
9685
11133
  constructor();
9686
11134
  /**
9687
- * Imperatively apply animation reveal / pending CSS to the slide's element
9688
- * nodes (mirrors the Vue `applyAnimationStyles`). Every renderer emits a
9689
- * `data-element-id`, so this needs no per-element renderer plumbing.
11135
+ * Imperatively apply each tracked element's native-animation state to its DOM
11136
+ * wrapper: visibility (entrance hide-until-revealed / exit), the CSS-animation
11137
+ * shorthand (entrance / emphasis / exit / colour keyframes), and a pointer
11138
+ * cursor on interactive / hover trigger shapes. Mirrors the Vue
11139
+ * `applyAnimationStyles`; every renderer emits a `data-element-id`, so this
11140
+ * needs no per-element renderer plumbing.
9690
11141
  */
9691
11142
  private applyAnimationStyles;
11143
+ /** Resolve the nearest element id above a pointer target, if any. */
11144
+ private closestElementId;
11145
+ /**
11146
+ * Pointer moved over the stage: (re)play a hover-trigger shape's sequence once
11147
+ * on entering it (not on every descendant transition that `mouseover` bubbles
11148
+ * up), resetting the previous trigger on leaving it.
11149
+ */
11150
+ protected onStageHover(event: MouseEvent): void;
11151
+ /** Pointer left the stage subtree entirely: reset any active hover trigger. */
11152
+ protected onStageHoverEnd(event: MouseEvent): void;
9692
11153
  /** Viewport dimensions, updated on resize. */
9693
11154
  private readonly viewportW;
9694
11155
  private readonly viewportH;
@@ -10045,9 +11506,12 @@ declare class PresentationSettingsCardComponent {
10045
11506
  private readonly loader;
10046
11507
  private readonly editor;
10047
11508
  protected readonly props: _angular_core.WritableSignal<PptxPresentationProperties>;
11509
+ protected readonly frameSlides: _angular_core.Signal<boolean>;
11510
+ protected readonly slidesPerPage: _angular_core.Signal<number>;
10048
11511
  private patch;
10049
11512
  protected onShowTypeChange(event: Event): void;
10050
- protected onCheckbox(event: Event, key: 'loopContinuously' | 'showWithNarration' | 'showWithAnimation' | 'printFrameSlides'): void;
11513
+ protected onCheckbox(event: Event, key: 'loopContinuously' | 'showWithNarration' | 'showWithAnimation'): void;
11514
+ protected onFrameSlidesChange(event: Event): void;
10051
11515
  protected onSlidesPerPageChange(event: Event): void;
10052
11516
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PresentationSettingsCardComponent, never>;
10053
11517
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationSettingsCardComponent, "pptx-presentation-settings-card", never, { "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -10184,7 +11648,7 @@ declare class TextAdvancedPanelComponent {
10184
11648
  /** Exposed option arrays for the template. */
10185
11649
  protected readonly alignOptions: [NonNullable<"center" | "left" | "right" | "justify" | "justLow" | "dist" | "thaiDist" | undefined>, string][];
10186
11650
  protected readonly vAlignOptions: [NonNullable<"top" | "bottom" | "middle" | undefined>, string][];
10187
- protected readonly textDirectionOptions: [NonNullable<"eaVert" | "wordArtVert" | "wordArtVertRtl" | "mongolianVert" | "horizontal" | "vertical" | "vertical270" | undefined>, string][];
11651
+ protected readonly textDirectionOptions: [NonNullable<"vertical" | "horizontal" | "eaVert" | "wordArtVert" | "wordArtVertRtl" | "mongolianVert" | "vertical270" | undefined>, string][];
10188
11652
  protected alignLabel(align: NonNullable<TextStyle['align']>): string;
10189
11653
  protected onAlignChange(align: NonNullable<TextStyle['align']>): void;
10190
11654
  protected onVAlignChange(event: Event): void;
@@ -10926,10 +12390,16 @@ declare class MobileToolbarComponent {
10926
12390
  readonly canEdit: _angular_core.InputSignal<boolean>;
10927
12391
  /** Whether the mobile-menu sheet is currently open (highlights the button). */
10928
12392
  readonly menuOpen: _angular_core.InputSignal<boolean>;
12393
+ /** Whether the host opted into the AI assistant (shows the top-right toggle). */
12394
+ readonly aiEnabled: _angular_core.InputSignal<boolean>;
12395
+ /** Whether the AI assistant panel is currently open (highlights the button). */
12396
+ readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
10929
12397
  /** Toolbar buttons the host wants hidden (gates Undo/Redo independently). */
10930
12398
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
10931
12399
  /** User tapped the Menu (hamburger) button. */
10932
12400
  readonly toggleMenu: _angular_core.OutputEmitterRef<void>;
12401
+ /** User tapped the AI assistant toggle. */
12402
+ readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
10933
12403
  /** User tapped Undo. */
10934
12404
  readonly undo: _angular_core.OutputEmitterRef<void>;
10935
12405
  /** User tapped Redo. */
@@ -10940,7 +12410,7 @@ declare class MobileToolbarComponent {
10940
12410
  readonly present: _angular_core.OutputEmitterRef<void>;
10941
12411
  protected readonly toolbar: ToolbarVisibility;
10942
12412
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileToolbarComponent, never>;
10943
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileToolbarComponent, "pptx-mobile-toolbar", never, { "canUndo": { "alias": "canUndo"; "required": false; "isSignal": true; }; "canRedo": { "alias": "canRedo"; "required": false; "isSignal": true; }; "canPresent": { "alias": "canPresent"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "menuOpen": { "alias": "menuOpen"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleMenu": "toggleMenu"; "undo": "undo"; "redo": "redo"; "save": "save"; "present": "present"; }, never, never, true, never>;
12413
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileToolbarComponent, "pptx-mobile-toolbar", never, { "canUndo": { "alias": "canUndo"; "required": false; "isSignal": true; }; "canRedo": { "alias": "canRedo"; "required": false; "isSignal": true; }; "canPresent": { "alias": "canPresent"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "menuOpen": { "alias": "menuOpen"; "required": false; "isSignal": true; }; "aiEnabled": { "alias": "aiEnabled"; "required": false; "isSignal": true; }; "aiPanelOpen": { "alias": "aiPanelOpen"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleMenu": "toggleMenu"; "toggleAiPanel": "toggleAiPanel"; "undo": "undo"; "redo": "redo"; "save": "save"; "present": "present"; }, never, never, true, never>;
10944
12414
  }
10945
12415
 
10946
12416
  declare class NotesPanelComponent {
@@ -11109,7 +12579,7 @@ declare class StatusBarComponent {
11109
12579
  /** Relative age label for a saved timestamp ("just now" / "N min ago"). */
11110
12580
  private formatAutosaveAge;
11111
12581
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusBarComponent, never>;
11112
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusBarComponent, "pptx-status-bar", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "autosaveStatus": { "alias": "autosaveStatus"; "required": false; "isSignal": true; }; "notesOpen": { "alias": "notesOpen"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "sorterActive": { "alias": "sorterActive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleNotes": "toggleNotes"; "normalView": "normalView"; "openSorter": "openSorter"; "slideShow": "slideShow"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; }, never, never, true, never>;
12582
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusBarComponent, "pptx-status-bar", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "autosaveStatus": { "alias": "autosaveStatus"; "required": false; "isSignal": true; }; "notesOpen": { "alias": "notesOpen"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "sorterActive": { "alias": "sorterActive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleNotes": "toggleNotes"; "normalView": "normalView"; "openSorter": "openSorter"; "slideShow": "slideShow"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; }, never, ["[pptxCollabStatus]"], true, never>;
11113
12583
  }
11114
12584
 
11115
12585
  declare class EditorContextMenuComponent {
@@ -11119,8 +12589,17 @@ declare class EditorContextMenuComponent {
11119
12589
  readonly y: _angular_core.InputSignal<number>;
11120
12590
  /** Zero-based index of the slide being edited. */
11121
12591
  readonly slideIndex: _angular_core.InputSignal<number>;
12592
+ /**
12593
+ * Whether to show the "Ask AI about this" / "Fix with AI" items. Gated by the
12594
+ * host on the `ai` config + a single selected element.
12595
+ */
12596
+ readonly showAiActions: _angular_core.InputSignal<boolean>;
11122
12597
  /** Emitted when the menu should close (Escape or outside click). */
11123
12598
  readonly closed: _angular_core.OutputEmitterRef<void>;
12599
+ /** "Ask AI about this": open the assistant scoped to the selection. */
12600
+ readonly askAi: _angular_core.OutputEmitterRef<void>;
12601
+ /** "Fix with AI": open the assistant with a prefilled fix directive. */
12602
+ readonly fixAi: _angular_core.OutputEmitterRef<void>;
11124
12603
  protected readonly editor: EditorStateService;
11125
12604
  private readonly tableSelection;
11126
12605
  private readonly host;
@@ -11135,6 +12614,8 @@ declare class EditorContextMenuComponent {
11135
12614
  } | null>;
11136
12615
  onEscape(): void;
11137
12616
  onDocumentPointerDown(event: PointerEvent): void;
12617
+ protected onAskAi(): void;
12618
+ protected onFixAi(): void;
11138
12619
  protected onCut(): void;
11139
12620
  protected onCopy(): void;
11140
12621
  protected onPaste(): void;
@@ -11160,7 +12641,7 @@ declare class EditorContextMenuComponent {
11160
12641
  */
11161
12642
  private applyTable;
11162
12643
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EditorContextMenuComponent, never>;
11163
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EditorContextMenuComponent, "pptx-editor-context-menu", never, { "x": { "alias": "x"; "required": true; "isSignal": true; }; "y": { "alias": "y"; "required": true; "isSignal": true; }; "slideIndex": { "alias": "slideIndex"; "required": true; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
12644
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EditorContextMenuComponent, "pptx-editor-context-menu", never, { "x": { "alias": "x"; "required": true; "isSignal": true; }; "y": { "alias": "y"; "required": true; "isSignal": true; }; "slideIndex": { "alias": "slideIndex"; "required": true; "isSignal": true; }; "showAiActions": { "alias": "showAiActions"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "askAi": "askAi"; "fixAi": "fixAi"; }, never, never, true, never>;
11164
12645
  }
11165
12646
 
11166
12647
  /**
@@ -11823,35 +13304,20 @@ declare class PropertiesDialogComponent {
11823
13304
  }
11824
13305
 
11825
13306
  /**
11826
- * share-helpers.ts: Pure (no Angular) helpers for the Share dialog.
13307
+ * share-helpers.ts: Share dialog helpers for the Angular viewer.
11827
13308
  *
11828
- * Mirrors the form-validation / config-assembly logic of the Vue
11829
- * `ShareDialog.vue` plus the share-link builder from the React `ShareDialog`.
13309
+ * The shared subset (ShareFormFields / ShareDefaults / seedShareFields /
13310
+ * canStartShare) is re-exported from `pptx-viewer-shared` (`render/share-form`).
13311
+ * Two helpers stay local because they diverge from the shared builders:
13312
+ * - `buildCollaborationConfig` validates with `canStartShare` (non-blank room)
13313
+ * and emits a config WITHOUT `role`/`sessionIntent`, unlike the shared
13314
+ * `buildShareConfig` (which is `buildCreateCollaborationConfig`).
13315
+ * - `buildShareUrl` is Angular-only (no other binding builds a share link).
11830
13316
  *
11831
13317
  * No `any`; all regexes use the `/u` flag; no `String.prototype.replaceAll`,
11832
13318
  * no regex named-capture-groups (ng-packagr lib-target constraints).
11833
13319
  */
11834
13320
 
11835
- /** Prefilled values for the Share form fields. */
11836
- interface ShareDefaults {
11837
- roomId?: string;
11838
- userName?: string;
11839
- serverUrl?: string;
11840
- }
11841
- /** The Share form's editable fields. */
11842
- interface ShareFormFields {
11843
- roomId: string;
11844
- userName: string;
11845
- serverUrl: string;
11846
- }
11847
- /** Seed the form fields from the (optional) defaults, coercing absent values. */
11848
- declare function seedShareFields(defaults?: ShareDefaults): ShareFormFields;
11849
- /**
11850
- * Whether the required fields are non-blank (after trimming). The server URL is
11851
- * optional: a blank server selects the serverless (webrtc) peer-to-peer
11852
- * transport, so only the room id and display name are required.
11853
- */
11854
- declare function canStartShare(fields: ShareFormFields): boolean;
11855
13321
  /**
11856
13322
  * Assemble a {@link CollaborationConfig} from the (trimmed) form fields, or
11857
13323
  * `null` when the form is incomplete. A blank server URL yields
@@ -11871,7 +13337,7 @@ declare class ShareDialogComponent {
11871
13337
  /** Whether the dialog is visible. */
11872
13338
  readonly open: _angular_core.InputSignal<boolean>;
11873
13339
  /** Prefilled values for the form fields. */
11874
- readonly defaults: _angular_core.InputSignal<ShareDefaults | undefined>;
13340
+ readonly defaults: _angular_core.InputSignal<ShareDefaults$1 | undefined>;
11875
13341
  /** Whether a collaboration session is currently active (provider constructed). */
11876
13342
  readonly active: _angular_core.InputSignal<boolean>;
11877
13343
  /** Whether the websocket has reported a `connected` status. */
@@ -11987,6 +13453,8 @@ declare class ViewerExtraDialogsComponent {
11987
13453
  readonly availableThemes: _angular_core.InputSignal<readonly ThemeCatalogEntry[]>;
11988
13454
  readonly localeCode: _angular_core.InputSignal<string>;
11989
13455
  readonly availableLocales: _angular_core.InputSignal<readonly LocaleCatalogEntry[]>;
13456
+ /** Whether the Settings dialog shows the bespoke AI chat-log export category. */
13457
+ readonly aiExportVisible: _angular_core.InputSignal<boolean>;
11990
13458
  /** Fired with a restored `.pptx` version's bytes; the host swaps the deck. */
11991
13459
  readonly restoreContent: _angular_core.OutputEmitterRef<Uint8Array<ArrayBufferLike>>;
11992
13460
  readonly themeKeySelect: _angular_core.OutputEmitterRef<string>;
@@ -12028,7 +13496,7 @@ declare class ViewerExtraDialogsComponent {
12028
13496
  /** Clear any save password. */
12029
13497
  onRemovePassword(): void;
12030
13498
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewerExtraDialogsComponent, never>;
12031
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ViewerExtraDialogsComponent, "pptx-viewer-extra-dialogs", never, { "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; "selectedElementId": { "alias": "selectedElementId"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "customShows": { "alias": "customShows"; "required": false; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; }, { "restoreContent": "restoreContent"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; }, never, never, true, never>;
13499
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ViewerExtraDialogsComponent, "pptx-viewer-extra-dialogs", never, { "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; "selectedElementId": { "alias": "selectedElementId"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "customShows": { "alias": "customShows"; "required": false; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "aiExportVisible": { "alias": "aiExportVisible"; "required": false; "isSignal": true; }; }, { "restoreContent": "restoreContent"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; }, never, never, true, never>;
12032
13500
  }
12033
13501
 
12034
13502
  declare class EquationEditorDialogComponent {
@@ -12098,7 +13566,7 @@ declare class SetUpSlideShowDialogComponent {
12098
13566
  readonly close: _angular_core.OutputEmitterRef<void>;
12099
13567
  /** Working copy of the properties; seeded from `properties` on open. */
12100
13568
  readonly draft: _angular_core.WritableSignal<PptxPresentationProperties>;
12101
- readonly showType: _angular_core.Signal<"kiosk" | "presented" | "browsed">;
13569
+ readonly showType: _angular_core.Signal<"kiosk" | "browsed" | "presented">;
12102
13570
  readonly showSlidesMode: _angular_core.Signal<"range" | "all" | "customShow">;
12103
13571
  constructor();
12104
13572
  /** Merge a partial patch into the current draft. */
@@ -12433,6 +13901,11 @@ declare class SettingsDialogComponent {
12433
13901
  readonly availableLocales: _angular_core.InputSignal<readonly LocaleCatalogEntry[]>;
12434
13902
  /** Availability flags for the Add-ins pane (unset ids default to active). */
12435
13903
  readonly addinStatus: _angular_core.InputSignal<ViewerAddinStatus | undefined>;
13904
+ /**
13905
+ * Whether to show the bespoke "AI" category (chat-log export), gated by the
13906
+ * host on the `ai` config. Absent by default (no AI category).
13907
+ */
13908
+ readonly aiExportVisible: _angular_core.InputSignal<boolean>;
12436
13909
  readonly optionChange: _angular_core.OutputEmitterRef<OptionValueChange>;
12437
13910
  /** Restore a snapshot wholesale (Cancel semantics). */
12438
13911
  readonly restoreOptions: _angular_core.OutputEmitterRef<ViewerOptions>;
@@ -12445,7 +13918,8 @@ declare class SettingsDialogComponent {
12445
13918
  readonly localeSelect: _angular_core.OutputEmitterRef<string>;
12446
13919
  readonly close: _angular_core.OutputEmitterRef<void>;
12447
13920
  protected readonly tabs: readonly ViewerOptionsTabDefinition[];
12448
- protected readonly activeTabId: _angular_core.WritableSignal<ViewerOptionsTabId>;
13921
+ /** Active category id, or the bespoke `'ai'` sentinel for the AI export pane. */
13922
+ protected readonly activeTabId: _angular_core.WritableSignal<ViewerOptionsTabId | "ai">;
12449
13923
  protected readonly activeTab: _angular_core.Signal<ViewerOptionsTabDefinition>;
12450
13924
  /** Snapshot taken when the dialog opens, restored by Cancel. */
12451
13925
  private snapshot;
@@ -12456,7 +13930,7 @@ declare class SettingsDialogComponent {
12456
13930
  /** Escape confirms (keeps edits), mirroring React's dialog. */
12457
13931
  protected onEscape(): void;
12458
13932
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SettingsDialogComponent, never>;
12459
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SettingsDialogComponent, "pptx-settings-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "addinStatus": { "alias": "addinStatus"; "required": false; "isSignal": true; }; }, { "optionChange": "optionChange"; "restoreOptions": "restoreOptions"; "ribbonTabHiddenChange": "ribbonTabHiddenChange"; "quickAccessCommandsChange": "quickAccessCommandsChange"; "resetOptions": "resetOptions"; "clearCache": "clearCache"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; "close": "close"; }, never, never, true, never>;
13933
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SettingsDialogComponent, "pptx-settings-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "addinStatus": { "alias": "addinStatus"; "required": false; "isSignal": true; }; "aiExportVisible": { "alias": "aiExportVisible"; "required": false; "isSignal": true; }; }, { "optionChange": "optionChange"; "restoreOptions": "restoreOptions"; "ribbonTabHiddenChange": "ribbonTabHiddenChange"; "quickAccessCommandsChange": "quickAccessCommandsChange"; "resetOptions": "resetOptions"; "clearCache": "clearCache"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; "close": "close"; }, never, never, true, never>;
12460
13934
  }
12461
13935
 
12462
13936
  declare class SettingsAppearanceTabComponent {
@@ -12481,7 +13955,7 @@ declare class AccountPageComponent {
12481
13955
  readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
12482
13956
  private readonly translate;
12483
13957
  protected readonly swatches: readonly string[];
12484
- protected readonly version = "1.31.4";
13958
+ protected readonly version = "1.31.5";
12485
13959
  protected readonly profile: _angular_core.WritableSignal<ViewerProfile>;
12486
13960
  protected readonly initial: _angular_core.Signal<string>;
12487
13961
  protected readonly usage: _angular_core.WritableSignal<LocalStorageUsageSummary | null>;
@@ -12999,38 +14473,6 @@ interface PresenterNotes {
12999
14473
  */
13000
14474
  declare function resolvePresenterNotes(slide: PptxSlide | undefined): PresenterNotes;
13001
14475
 
13002
- /**
13003
- * audience-content-store: IndexedDB-based storage for sharing PPTX content
13004
- * between the presenter tab and audience tab.
13005
- *
13006
- * When the presenter opens an audience window, the PPTX bytes are stored in
13007
- * IndexedDB. The audience tab retrieves them on load and then cleans up.
13008
- *
13009
- * Framework-agnostic port of the React store
13010
- * (packages/react/src/viewer/hooks/presentation-mode/audience-content-store.ts).
13011
- * The database, store, and key names are kept identical to React/Vue so the
13012
- * cross-tab handoff stays wire-compatible regardless of which binding opened
13013
- * the presenter window or which one renders the audience tab.
13014
- */
13015
- /** URL hash that marks the current tab as the audience display. */
13016
- declare const AUDIENCE_HASH = "#pptx-audience";
13017
- /** Returns true if the current page was opened as an audience tab. */
13018
- declare function isAudienceTab(): boolean;
13019
- /**
13020
- * Store PPTX content bytes so the audience tab can retrieve them.
13021
- * Called by the presenter before opening the audience window.
13022
- */
13023
- declare function storeAudienceContent(content: ArrayBuffer | Uint8Array, sessionId?: string): Promise<void>;
13024
- /**
13025
- * Load PPTX content bytes stored by the presenter tab.
13026
- * Returns `null` if nothing is stored.
13027
- */
13028
- declare function loadAudienceContent(sessionId?: string): Promise<Uint8Array | null>;
13029
- /**
13030
- * Remove stored audience content (cleanup).
13031
- */
13032
- declare function clearAudienceContent(sessionId?: string): Promise<void>;
13033
-
13034
14476
  /**
13035
14477
  * SVG path generators for WordArt text warp presets.
13036
14478
  *
@@ -14214,7 +15656,13 @@ declare class RibbonPrimaryRowComponent {
14214
15656
  readonly commentCount: _angular_core.InputSignal<number>;
14215
15657
  /** Toolbar buttons the host wants hidden (gates Broadcast + the export overflow items). */
14216
15658
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
15659
+ /** Whether the host enabled the AI assistant (shows the Sparkles toggle). */
15660
+ readonly aiEnabled: _angular_core.InputSignal<boolean>;
15661
+ /** Whether the AI assistant panel is currently open (toggle active state). */
15662
+ readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
14217
15663
  readonly toggleSidebar: _angular_core.OutputEmitterRef<void>;
15664
+ /** Emitted when the user clicks the AI assistant Sparkles toggle. */
15665
+ readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
14218
15666
  readonly toggleComments: _angular_core.OutputEmitterRef<void>;
14219
15667
  readonly present: _angular_core.OutputEmitterRef<void>;
14220
15668
  readonly presenter: _angular_core.OutputEmitterRef<void>;
@@ -14247,7 +15695,7 @@ declare class RibbonPrimaryRowComponent {
14247
15695
  protected onDocumentPointerDown(event: PointerEvent): void;
14248
15696
  protected onOverflow(key: string): void;
14249
15697
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonPrimaryRowComponent, never>;
14250
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonPrimaryRowComponent, "pptx-ribbon-primary-row", never, { "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleSidebar": "toggleSidebar"; "toggleComments": "toggleComments"; "present": "present"; "presenter": "presenter"; "broadcast": "broadcast"; "openCustomShows": "openCustomShows"; "toggleInspector": "toggleInspector"; "openSettings": "openSettings"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "print": "print"; "info": "info"; "a11y": "a11y"; "save": "save"; }, never, never, true, never>;
15698
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonPrimaryRowComponent, "pptx-ribbon-primary-row", never, { "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "aiEnabled": { "alias": "aiEnabled"; "required": false; "isSignal": true; }; "aiPanelOpen": { "alias": "aiPanelOpen"; "required": false; "isSignal": true; }; }, { "toggleSidebar": "toggleSidebar"; "toggleAiPanel": "toggleAiPanel"; "toggleComments": "toggleComments"; "present": "present"; "presenter": "presenter"; "broadcast": "broadcast"; "openCustomShows": "openCustomShows"; "toggleInspector": "toggleInspector"; "openSettings": "openSettings"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "print": "print"; "info": "info"; "a11y": "a11y"; "save": "save"; }, never, never, true, never>;
14251
15699
  }
14252
15700
 
14253
15701
  declare class RibbonReviewSectionComponent {
@@ -14754,50 +16202,6 @@ declare class ColorChangedImageComponent {
14754
16202
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ColorChangedImageComponent, "pptx-color-changed-image", never, { "src": { "alias": "src"; "required": true; "isSignal": true; }; "clrChange": { "alias": "clrChange"; "required": true; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "imgClass": { "alias": "imgClass"; "required": false; "isSignal": true; }; "imgStyle": { "alias": "imgStyle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
14755
16203
  }
14756
16204
 
14757
- /**
14758
- * EyeDropper colour sampler for the Angular viewer.
14759
- *
14760
- * Prefers the native browser EyeDropper API (Chrome 95+ / Edge 95+). For
14761
- * browsers without it (Firefox, Safari) a DOM-sampling fallback reads the
14762
- * colour under the pointer via `elementFromPoint` + `getComputedStyle`, so the
14763
- * eyedropper still works everywhere. Mirrors the React viewer's
14764
- * `viewer/utils/eyedropper.ts`.
14765
- */
14766
- /** A sampled colour, as hex plus its RGB channels. */
14767
- interface EyedropperResult {
14768
- hex: string;
14769
- r: number;
14770
- g: number;
14771
- b: number;
14772
- }
14773
- /**
14774
- * Returns true when the native EyeDropper API is available in this browser.
14775
- * Guards against SSR / headless environments without `window`.
14776
- */
14777
- declare function eyedropperAvailable(): boolean;
14778
- /**
14779
- * Open the native EyeDropper and return the picked sRGB hex colour string
14780
- * (e.g. `"#a3b4c5"`), or `null` when the user cancels or the API is absent.
14781
- */
14782
- declare function openNativeEyeDropper(): Promise<string | null>;
14783
- /**
14784
- * Sample the colour at a client-space point by inspecting the topmost element's
14785
- * computed paint. Tries, in order: a real `<canvas>` pixel read (sharp for
14786
- * rasterised content), then the element's `background-color`, SVG `fill`, and
14787
- * finally text `color`. Returns `null` when nothing paintable is found.
14788
- *
14789
- * This is the DOM fallback used when the native EyeDropper API is unavailable;
14790
- * it needs no canvas plumbing, so it works against the live slide DOM.
14791
- */
14792
- declare function sampleColorFromSlide(clientX: number, clientY: number): EyedropperResult | null;
14793
- /**
14794
- * Run the eyedropper fallback: arm a one-shot pointer listener and resolve with
14795
- * the hex colour of the next click (or `null` if the user presses Escape). Used
14796
- * only when {@link eyedropperAvailable} is false. The caller is responsible for
14797
- * any "armed" UI affordance; this just manages the listeners.
14798
- */
14799
- declare function pickColorByClickFallback(): Promise<string | null>;
14800
-
14801
16205
  declare class CustomShowsComponent {
14802
16206
  private readonly translate;
14803
16207
  /** Whether the dialog is open. */
@@ -15008,31 +16412,6 @@ declare class ThemeGalleryComponent {
15008
16412
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ThemeGalleryComponent, "pptx-theme-gallery", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "activeName": { "alias": "activeName"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; }, { "applyTheme": "applyTheme"; "applyCustomTheme": "applyCustomTheme"; "close": "close"; }, never, never, true, never>;
15009
16413
  }
15010
16414
 
15011
- /**
15012
- * theme-gallery-presets.ts: the exact theme set shown in the Design tab's
15013
- * Theme Gallery, at parity with React's `BUILT_IN_THEMES`
15014
- * (packages/react/src/viewer/components/toolbar/theme-gallery-data.ts).
15015
- *
15016
- * This is a DIFFERENT set from core's `THEME_PRESETS`: it adds Wisp, Berlin,
15017
- * Slice, and Dividend and omits Slate and Metropolitan, in React's order
15018
- * (office, facet, integral, ion, retrospect, organic, wisp, berlin, slice,
15019
- * dividend).
15020
- *
15021
- * The six themes that also exist in core (`office`, `facet`, `integral`,
15022
- * `ion`, `organic`, `retrospect`) are reused verbatim from core's
15023
- * `THEME_PRESETS` (looked up by id) so their colour/font schemes stay
15024
- * canonical. The four gallery-only themes are defined here, with colour
15025
- * schemes copied from React's data and React's flat `{ majorFont, minorFont }`
15026
- * fontScheme converted to core's nested `{ majorFont: { latin }, minorFont:
15027
- * { latin } }` shape.
15028
- */
15029
-
15030
- /**
15031
- * The gallery theme set, in React's order. Six canonical core presets plus the
15032
- * four gallery-only additions.
15033
- */
15034
- declare const GALLERY_THEME_PRESETS: readonly PptxThemePreset[];
15035
-
15036
16415
  declare class TitleBarComponent {
15037
16416
  /** Whether the deck is editable (gates the autosave/quick-access/search chrome). */
15038
16417
  readonly canEdit: _angular_core.InputSignal<boolean>;
@@ -15226,5 +16605,5 @@ declare const SEQUENCE_OPTIONS: ReadonlyArray<{
15226
16605
  labelKey: string;
15227
16606
  }>;
15228
16607
 
15229
- export { ALIGN_OPTIONS, AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AVATAR_COLOR_SWATCHES, AccessibilityPanelComponent, AccessibilityService, AccountPageComponent, ActionSettingsPanelComponent, AdvancedChartEditorComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, AutosaveService, BroadcastDialogComponent, CHART_EDITOR_STYLES, CURSOR_PALETTE, CanvasFitService, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartElementViewComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartPartSelectionService, ChartPrimitivesComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, ColorChangedImageComponent, CommentsPanelComponent, CommentsService, ComparePanelComponent, ConnectorRendererComponent, ConnectorTextOverlayComponent, CustomShowsComponent, DATA_TABLE_HEADER_H, DATA_TABLE_KEY_W, DATA_TABLE_PADDING, DATA_TABLE_ROW_H, DEFAULT_BOUNDS, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, DEFAULT_COLOR_SCHEME, DEFAULT_FILL_COLOR, DEFAULT_LAYOUT, DEFAULT_PALETTE$1 as DEFAULT_PALETTE, DEFAULT_PRINT_SETTINGS, DEFAULT_SLIDE_BACKGROUND, DEFAULT_STROKE_COLOR, DEFAULT_STYLE, DEFAULT_TABLE_ROW_HEIGHT, DEFAULT_TEXT_COLOR, DEFAULT_VIEWER_PROFILE, DIRECTIONAL_PRESETS, DIRECTION_OPTIONS, DocumentPropertiesCardComponent, EMBEDDED_FONTS_STYLE_ID, EMPHASIS_PRESETS, ENTRANCE_PRESETS, TEMPLATES as EQUATION_TEMPLATES, EXIT_PRESETS, EditorContextMenuComponent, EditorHistory, EditorStateService, EditorToolbarComponent, EffectsPanelComponent, ElementRendererComponent, EmbeddedFontsService, EncryptedFileDialogComponent, EquationEditorDialogComponent, EquationRendererComponent, EquationTemplateGalleryComponent, ExportProgressModalComponent, ExportService, FieldContextService, FindBarComponent, FindReplaceBarComponent, FollowModeBarComponent, FontEmbeddingListComponent, FontEmbeddingPanelComponent, GALLERY_THEME_PRESETS, GradientPickerComponent, HANDOUT_OPTIONS, HeaderFooterDialogComponent, HyperlinkDialogComponent, ImagePropertiesPanelComponent, InkDrawingService, InkRendererComponent, InsertSmartArtDialogComponent, InspectorPaneHeaderComponent, InspectorPanelComponent, IsMobileService, KeepAnnotationsDialogComponent, LOCALE_CATALOG, LONG_PRESS_DURATION_MS, LONG_PRESS_MOVE_TOLERANCE_PX, LoadContentService, LocalPresencePublisher, MAX_ZOOM_SCALE, MIN_ZOOM_SCALE, MediaPreviewComponent, MediaPropertiesPanelComponent, MediaRendererComponent, MediaTrimTimelineComponent, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesHandoutCardComponent, NotesPanelComponent, NotesToolbarComponent, OleRendererComponent, POWER_POINT_VIEWER_PROVIDERS, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PasswordProtectionDialogComponent, PasswordStrengthMeterComponent, PowerPointViewerComponent, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationPropertiesPanelComponent, PresentationSettingsCardComponent, PresentationSubtitleBarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, REPEAT_MODE_OPTIONS, RESIZE_HANDLES, RULER_THICKNESS, RemoteSelectionOverlayComponent, RibbonAnimationsSectionComponent, RibbonArrangeSectionComponent, RibbonColorPopoverComponent, RibbonComponent, RibbonDesignSectionComponent, RibbonDrawSectionComponent, RibbonDrawingGroupComponent, RibbonEditingSectionComponent, RibbonFileSectionComponent, RibbonFontControlsComponent, RibbonHomeSectionComponent, RibbonInsertFieldsComponent, RibbonInsertSectionComponent, RibbonParagraphControlsComponent, RibbonPrimaryRowComponent, RibbonReviewSectionComponent, RibbonSlideshowSectionComponent, RibbonTransitionsSectionComponent, RibbonViewSectionComponent, RulerGuidesService, SEQUENCE_OPTIONS, SEVERITY_GROUPS, SEVERITY_LABELS, SHORTCUT_REFERENCE_ITEMS, SLIDE_PX_PER_INCH, SLIDE_TRANSITION_KEYFRAMES, DEFAULT_PALETTE as SMARTART_DEFAULT_PALETTE, PALETTES as SMARTART_PALETTES, SMART_ART_COLOR_SCHEMES, SMART_ART_STYLE_OPTIONS, SUB_ITEM_LABEL, SVG_WARP_PRESETS, SWIPE_MAX_VERTICAL_PX, SWIPE_THRESHOLD_PX, SelectionPaneComponent, SetUpSlideShowDialogComponent, SettingsAppearanceTabComponent, SettingsDialogComponent, SettingsLanguageTabComponent, ShareDialogComponent, ShortcutPanelComponent, ShowOptionsFieldsetComponent, ShowSlidesFieldsetComponent, SignatureStrippedDialogComponent, SignaturesPanelComponent, SignaturesService, SlideCanvasComponent, SlideDefaultInspectorComponent, SlideDiffChangesComponent, SlideDiffRowComponent, SlideDiffThumbnailsComponent, SlideSizeCardComponent, SlideSorterOverlayComponent, SlideThemeOverridePanelComponent, SlidesPanelComponent, SmartArt3DRendererComponent, SmartArt3DService, SmartArtPreviewComponent, SmartArtPropertiesComponent, SmartArtRendererComponent, StatusBarComponent, TABLE_STRUCTURE_TOGGLES, TEXT_DIRECTION_OPTIONS, THEME_CATALOG, TIMING_CURVE_OPTIONS, TRIGGER_OPTIONS, TYPE_LABELS, TableCellAdvancedFillComponent, TableCellFormattingComponent, TableDataEditorComponent, TablePropertiesComponent, TableRendererComponent, TableResizeOverlayComponent, TableSelectionService, TextAdvancedPanelComponent, ThemeEditorFieldsComponent, ThemeGalleryComponent, ThemeSelectorCardComponent, TitleBarComponent, VALIGN_OPTIONS, VIEWER_THEME, VersionHistoryPanelComponent, ViewerCanvasEditingService, ViewerCollabCursorService, ViewerCollaborationSessionService, ViewerCompareService, ViewerCustomShowsService, ViewerDialogsService, ViewerDocumentPropertiesService, ViewerExportService, ViewerExtraDialogsComponent, ViewerFileIOService, ViewerFindReplaceService, ViewerFormatPainterService, ViewerInspectorPanelService, ViewerKeyboardService, ViewerMobileSheetService, ViewerPresentationModeService, ViewerThemeGalleryService, ViewerTouchGesturesService, ViewerZoomService, WEBM_MIME_CANDIDATES, WriteBackScheduler, ZoomNavigationService, ZoomRendererComponent, ZoomTargetService, addCategory, addCommentToList, addGradientStopPatch, addItem, addSeries, addSubItem, advanceStep, alignPatch, animationFor, annotationMapToInkInserts, applyAcceptedDiff, applyAnimationPreset, applyFindReplacements, applyFormatToElement, applyMove, applyResize, applyTableStylePreset, asMediaElement, assignUserColor, attachTouchGestures, beginNodeEdit, boolFromEvent, bringForward, bringToFront, buildBarActions, buildBroadcastConfig, buildBroadcastViewerUrl, buildCategoryLabels, buildCellParagraphs, buildChartViewModel, buildChromeStyle, buildClearHyperlinkPatch, buildClickGroups, buildColStyles, buildCollaborationConfig, buildComboViewModel, buildCssGradientFromShapeStyle, buildDuotoneFilter, buildDuotoneFilterId, buildEmbeddedFontStyles, buildEquationElement, buildEquationSegment, buildFallbackViewModel, buildFontFaceRule, buildGradientFillCss, buildGridlinesAndLabels, buildHyperlinkPatch, buildInkContainerStyle, buildInkStrokes, buildLegend, buildModel3DContainerStyle, buildModel3DViewModel, buildOleActionModel, buildOleInfoRows, buildPatternFillCss, buildPrintHtmlDocument as buildPrintDocument, buildPropertiesPatch, buildRegionMapViewModel, buildSaveSlides, buildShareUrl, buildSmartArtInsertElement, buildSmartArtNodes, buildStockViewModel, buildSurfaceViewModel, buildTableViewModel, buildTreemapViewModel, buildTrimFragment, buildWaterfallViewModel, buildZeroLine, buildZoomContainerStyle, buildZoomViewModel, bulletIndentPx, canAddTopLevelNode, canRemoveTopLevelNode, canStartBroadcast, canStartShare, canUseClipboard, captionDisplayText, cellRunStyle, cellStyleToStyleMap, cellTdStyle, changeCountLabel, changeIcon, characterSpacingPatch, checkFontAvailable, clampCursorPosition, clampGifDimensions, clampIndex, clampNotesFontSize, clampScale, clampStep, clearAllLocalViewerData, clearAudienceContent, cn, collectAccessibilityIssues, collectElementText, collectSlideText, collectUsedFontFamilies, columnWidthStyle, commitNodeText, computeAlign, computeAxisTitlePrimitives, computeBarRects, computeBubbleRadius, computeCornerHandle, computeDataTablePrimitives, computeDistribute, computeDrawingViewBox, computeErrorBarPrimitives, computeHandleBoxes, computeHandoutLayout, computeIsMobile, computeIsTablet, computeLinePoints, computeLinearRegression, computePageCount, computePieLayout, computePieSlicePath, computePieSlices, computePlotLayout, computeRSquared, computeRadarPoints, computeScatterDots, computeSelectionBoxes, computeSingleSelected, computeSlideIndices, computeSnap, computeStackedBarRects, computeStackedValueRange, computeTextLines, computeTimerProgress, computeTrendlinePrimitives, computeValueRange, convertOmmlToMathMl, copyFormatFromElement, countAccessibilityIssues, countAnnotationStrokes, createCustomShow, createSwipeDismissDrag, createWebrtcBundle, createWebsocketBundle, cssObjectToStyleMap, currentColorScheme, currentLayout, currentStyle, defaultCssVars, defaultRadius, defaultThemeColors, deleteElementsByIds, deleteVersion as deleteRecoveryVersion, demoteNode, deriveModel3DBlobUrl, derivePresenceList, describeSmartArtBounds, disableGlowPatch, disableInnerShadowPatch, disableOuterShadowPatch, disableReflectionPatch, disableSoftEdgePatch, duplicateElementById, durationOf, effectsStateOf, enableGlowPatch, enableInnerShadowPatch, enableOuterShadowPatch, enableReflectionPatch, enableSoftEdgePatch, encodeGif, estimatePageCount, evenColumnWidths, evenRowHeights, exitPresentationFullscreen, extractPathPoints, eyedropperAvailable, fillColorOf, findInSlides, findOwningSlideIndex, findSlideIndexByElementId, fitPolynomial, fitZoom, fontMimeForFormat, fontSizeOf, formatAutoNumber, formatAxisValue, formatBytes, formatCursorLabel, formatElapsed, formatFileSize, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, generateCustomShowId, generatePressureCircles, generateRulerTicks, getClrChangeParams, getContainerStyle, getDuotoneFilterDef, getImageSrc, getLocalStorageUsageSummary, getOleAriaLabel, getOleBadgeLabel, getOleDisplayName, getOleDownloadFileName, getOleTypeColor, getOleTypeLabel, getPasswordStrength, getPatternSvg, getPlaceholderStyle, getVersions as getRecoveryVersions, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getSmartArtNodeBounds, getSpeechRecognitionCtor, getTextBlockStyle, getTextWarp, getTouchDistance, getWarpCategory, getWarpPath, gradientStateFromStyle, gradientStateOf, gradientStatePatch, gridColumns, groupElements, groupIssuesBySeverity, hasAnimation, hasCopyableFormat, hasExistingLink, hasExitedFullscreen, hasGradientFill, hasPressureVariation, headerLabel, inkViewBox, insertColumn, insertRow, interpolateWidth, isAudienceTab, isBold, isBrowserOpenableMime, isChildNode, isElementInteractive, isInjectableUrl, isItalic, isPpactionUrl, isPresenterMessage, isSigned, isTextElement, isUnderline, isUrlSafe, isValidRoomId, isViewportBackgroundPressTarget, isZoomActivationKey, issueTrackKey, issueTypeLabel, keyToLabel, latexToMathml, linePointsToSvgString, lineSpacingPatch, loadAudienceContent, mergeCaptionResults, mergeDown, mergeRight, mergeSelection, moveElementBy, moveNodeDown, moveNodeUp, msToFrameDelayCs, narrowToCircle, narrowToPolygon, narrowToRect, newChartElement, newEquationElement, newPresetShapeElement, newShapeElement, newSmartArtElement, newTableElement, newTextElement, nextVisibleIndex, nodeBold, nodeEditBox, nodeFillColor, nodeFontColor, nodeIdFromKey, nodeItalic, nodeStyle, normalizeFontFormat, normalizeSlidesPerPage, normalizeValue, numFromEvent, ommlToMathml, ooxmlDashToCssBorderStyle, openNativeEyeDropper, overallStatus, paletteColor, parseAudienceNonce, parseNodeTextarea, partitionSlides, patchChartData, patchChartStyle, patchTableData, patchTextStyle, pendingElementStyles, pickColorByClickFallback, pickSupportedMimeType, planGifFrames, planVideoSegments, pointsToSvgPathD, presenceToCursors, presetByLayout, presetsForCategory, pressuresToWidths, prevVisibleIndex, projectDrawingShapes, promoteNode, provideViewerTheme, radarAngle, radarRingPoints, recordWebm, redistributeColumnWidth, removeAnimation, removeCategory, removeColumn, removeCommentFromList, removeElementAnimation, removeGradientStopPatch, removeNode, removeRow, removeSeries, renderToCanvas, reorderAnimationDown, reorderAnimationUp, replaceInSlides, replaceMatch, requestPresentationFullscreen, resizeElement, resolveCaptionTracks, resolveChartKind, resolveFontVariant, resolveHyperlinkHref, resolveInteractiveElementId, resolveMediaSrc, resolveOleType, resolveParagraphBullet, resolvePresenterNotes, resolveProfileInitial, resolveRegionCode, resolvePalette as resolveSmartArtPalette, resolveThemeCatalogEntry, resolveTransitionDuration, revealedElementStyles, routeOrthogonalConnector, rowStyle, sampleColorFromSlide, sanitizeColor, sanitizeSlideIndex, sanitizeUserName, saveViewerProfile, scanAvailableFonts, searchSlides, seedBroadcastFields, seedHyperlinkDraft, seedPropertiesDraft, seedShareFields, segmentFrameCount, selectValue, sendBackward, sendToBack, sequentialColorScale, serializeWriteBack, seriesColor, setAnimationEmphasis, setAnimationEntrance, setAnimationExit, setAxis, setAxisLogScale, setAxisTitleStyle, setCategoryLabel, setCellText, setColorScheme, setDataLabels, setDataPointExplosion, setDataPointFill, setDataPointLabel, setDelay, setDirection, setDuration, setElementPosition, setGridlineStyle, setLayout, setLegend, setNodeStyle, setNodeText, setRepeatCount, setRepeatMode, setSequence, setSeriesChartType, setSeriesColor, setSeriesErrorBars, setSeriesMarker, setSeriesName, setSeriesTrendline, setSeriesValue, setStyle, setTimingCurve, setTitle, setTrigger, setTriggerShapeId, shapeStylePatch, sheetAfterNavigate, shouldBlockClickAdvance, shouldUseSvgWarp, showDirectionPicker, showsTemplateAffordance, signatureCountLabel, signatureKey, signatureTimestamp, signerName, statusLabel as slideDiffStatusLabel, slideNumberOf, smartArtNodes, paletteColour as smartArtPaletteColour, snapToGridStep, splitCursorCell, splitMergedCell, statusKind, statusLabel$1 as statusLabel, storeAudienceContent, stringFromEvent, strokeColorOf, strokeToInkElement, styleShadowFilter, textAdvancedPatch, textAdvancedStateFromStyle, textAdvancedStateOf, textColorOf, textDirectionPatch, textStyleOf, textStylePatch, themeStyle, themeToCssVars, thumbnailHeight, thumbnailZoom, toggleCommentResolvedInList, toggleNodeBold, toggleNodeItalic, toggleSheet, topLevelNodeCount, transformSelectedTextCase, translationsEn, ungroupElements, updateElementById, updateGlowPatch, updateGradientStopPatch, updateInnerShadowPatch, updateOuterShadowPatch, updateReflectionPatch, vAlignPatch, validatePassword, validatePrintSettings, validateRoomId, valueToY, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, waypointsToPathD, worstStatus, zoomTargetSlideIndex };
15230
- export type { AccessibilityIssueGroup, AccountAuthConfig, ActionDescriptor, AlignBox, AlignMode, AnimationClickGroup, AnimationGroup, AnnotationInkInsert, AnnotationStroke, AttachTouchGesturesConfig, AwarenessLike, BarRect, Box, BroadcastConfig, BroadcastDefaults, CSSProperties, CanvasSize, CellCoord, CellParagraph, CellTextRun, ChartPartRef, ChartPartSelection, ChartValueDrag, ChartViewModel, ClassValue, ClrChangeParams, CollaborationConfig, CollaborationRole, RouterRect as ConnectorObstacle, RouterPoint as ConnectorPoint, ConnectorRouting, CopiedFormat, CornerHandleBox, CustomShow, CustomThemeEdit, DestroyableYDoc, DiagonalBorderInfo, DistributeMode, DocumentProperties, DrawingViewBox, DuotoneFilterDef, EffectsState, EmbeddedFontStyles, EquationTemplate, EyedropperResult, FindOptions, FindResult, GifFrame, GifFramePlan, GifPlanOptions, GlowState, GradientState, GradientStop$1 as GradientStop, GroupResult, HandleBox, HandoutSlidesPerPage, HyperlinkDraft, InkPoint, InkStroke, InlineEditState, InnerShadowState, LegendEntry, LinePoint, LinearFit, LocalIdentity, LocalStorageUsageSummary, LocaleCatalogEntry, MobileSheetKey, Model3DViewModel, NodeEditBox, NotesSegmentViewModel, ObjectUrlFactory, OleActionModel, OleInfoRow, OuterShadowState, OverallSignatureStatus, PartitionedSlides, PathPoint, PieSliceGeometry, PieSliceOptions, PlotLayout, PlotLayoutOptions, PositionUpdate, PowerPointViewerAPI, PresentationTool, PresenterExitMessage, PresenterMessage, PresenterNotes, PresenterSlideChangeMessage, PressureCircle, PrintColorMode, PrintHtmlDocumentOptions as PrintDocumentOptions, PrintOrientation, PrintSettings, PrintSlideRange, PrintWhat, PropertiesDraft, ProviderBundle, ProviderLike, RadarPoint, RecordWebmOptions, RecoveryVersion, ReflectionState, RemoteCursor, SanitizedPresence as RemotePresence, RenderedShape, ReplaceResult, ResizeHandle, ResolvedCaptionTrack, ResolvedFontVariant, ResolvedOleType, RulerTick, ScatterDot, SelectionBox, ShapeStyleChanges, ShareDefaults, ShareFormFields, ShortcutReferenceItem, SignatureStatusKind, SlideInspectorTab, SlideTransitionAnimations, SmartArtInsertEvent, SmartArtNodeBounds, SnapBox, SnapGuide, SnapResult, SoftEdgeState, SpeechAlternative, SpeechRecognitionCtor, SpeechRecognitionEventLite, SpeechRecognitionLite, SpeechResult, SpeechResultList, SpeechSupportState, StrokeToInkElementOpts, StyleMap, SupportedChartKind, SvgAreaGradient, SvgCircle, SvgLine, SvgPath, SvgPolygon, SvgPolyline, SvgPrimitive, SvgRect, SvgText, SwipeDismissDrag, TableBooleanFlag, TableCellSelection, TableCellViewModel, TableRowViewModel, TemplateElementsBySlideId, TextAdvancedChanges, TextAdvancedState, TextStyleChanges, TextWarpCssDef, TextWarpDef, TextWarpPathDef, ThemeCatalogEntry, TimerProgress, ToolbarActionId, TouchGestureCallbacks, TranslationKey, UngroupResult, ValueRange, VideoPlanOptions, VideoSegmentPlan, ViewerMode, ViewerProfile, ViewerSettings, ViewerTheme, ViewerThemeColors, ZoomViewModel };
16608
+ export { ALIGN_OPTIONS, AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AVATAR_COLOR_SWATCHES, AccessibilityPanelComponent, AccessibilityService, AccountPageComponent, ActionSettingsPanelComponent, AdvancedChartEditorComponent, AiChangeOverlayComponent, AiChatPanelComponent, AiChatService, AiComposerComponent, AiFocusBarComponent, AiFocusHighlightOverlayComponent, AiMessageListComponent, AiPanelStore, AiProposalCardComponent, AiSettingsSectionComponent, AiToolCallCardComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, AutosaveService, BroadcastDialogComponent, CHART_EDITOR_STYLES, CURSOR_PALETTE, CanvasFitService, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartElementViewComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartPartSelectionService, ChartPrimitivesComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, ColorChangedImageComponent, CommentsPanelComponent, CommentsService, ComparePanelComponent, ConnectorRendererComponent, ConnectorTextOverlayComponent, CustomShowsComponent, DATA_TABLE_HEADER_H, DATA_TABLE_KEY_W, DATA_TABLE_PADDING, DATA_TABLE_ROW_H, DEFAULT_BOUNDS, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, DEFAULT_COLOR_SCHEME, DEFAULT_FILL_COLOR, DEFAULT_LAYOUT, DEFAULT_PALETTE$1 as DEFAULT_PALETTE, DEFAULT_PRINT_SETTINGS, DEFAULT_SLIDE_BACKGROUND, DEFAULT_STROKE_COLOR, DEFAULT_STYLE, DEFAULT_TABLE_ROW_HEIGHT, DEFAULT_TEXT_COLOR, DEFAULT_VIEWER_PROFILE, DIRECTIONAL_PRESETS, DIRECTION_OPTIONS, DocumentPropertiesCardComponent, EMBEDDED_FONTS_STYLE_ID, EMPHASIS_PRESETS, ENTRANCE_PRESETS, TEMPLATES as EQUATION_TEMPLATES, EXIT_PRESETS, EditorContextMenuComponent, EditorHistory, EditorStateService, EditorToolbarComponent, EffectsPanelComponent, ElementRendererComponent, EmbeddedFontsService, EncryptedFileDialogComponent, EquationEditorDialogComponent, EquationRendererComponent, EquationTemplateGalleryComponent, ExportProgressModalComponent, ExportService, FieldContextService, FindBarComponent, FindReplaceBarComponent, FollowModeBarComponent, FontEmbeddingListComponent, FontEmbeddingPanelComponent, GALLERY_THEME_PRESETS, GradientPickerComponent, HANDOUT_OPTIONS, HeaderFooterDialogComponent, HyperlinkDialogComponent, ImagePropertiesPanelComponent, InkDrawingService, InkRendererComponent, InsertSmartArtDialogComponent, InspectorPaneHeaderComponent, InspectorPanelComponent, IsMobileService, KeepAnnotationsDialogComponent, LOCALE_CATALOG, LONG_PRESS_DURATION_MS, LONG_PRESS_MOVE_TOLERANCE_PX, LoadContentService, LocalPresencePublisher, MAX_ZOOM_SCALE, MIN_ZOOM_SCALE, MediaPreviewComponent, MediaPropertiesPanelComponent, MediaRendererComponent, MediaTrimTimelineComponent, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesHandoutCardComponent, NotesPanelComponent, NotesToolbarComponent, OleRendererComponent, POWER_POINT_VIEWER_PROVIDERS, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PasswordProtectionDialogComponent, PasswordStrengthMeterComponent, PowerPointViewerComponent, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationPropertiesPanelComponent, PresentationSettingsCardComponent, PresentationSubtitleBarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, REPEAT_MODE_OPTIONS, RESIZE_HANDLES, RULER_THICKNESS, RemoteSelectionOverlayComponent, RibbonAnimationsSectionComponent, RibbonArrangeSectionComponent, RibbonColorPopoverComponent, RibbonComponent, RibbonDesignSectionComponent, RibbonDrawSectionComponent, RibbonDrawingGroupComponent, RibbonEditingSectionComponent, RibbonFileSectionComponent, RibbonFontControlsComponent, RibbonHomeSectionComponent, RibbonInsertFieldsComponent, RibbonInsertSectionComponent, RibbonParagraphControlsComponent, RibbonPrimaryRowComponent, RibbonReviewSectionComponent, RibbonSlideshowSectionComponent, RibbonTransitionsSectionComponent, RibbonViewSectionComponent, RulerGuidesService, SEQUENCE_OPTIONS, SEVERITY_GROUPS, SEVERITY_LABELS, SHORTCUT_REFERENCE_ITEMS, SLIDE_PX_PER_INCH, SLIDE_TRANSITION_KEYFRAMES, DEFAULT_PALETTE as SMARTART_DEFAULT_PALETTE, PALETTES as SMARTART_PALETTES, SMART_ART_COLOR_SCHEMES, SMART_ART_STYLE_OPTIONS, SUB_ITEM_LABEL, SVG_WARP_PRESETS, SWIPE_MAX_VERTICAL_PX, SWIPE_THRESHOLD_PX, SelectionPaneComponent, SetUpSlideShowDialogComponent, SettingsAppearanceTabComponent, SettingsDialogComponent, SettingsLanguageTabComponent, ShareDialogComponent, ShortcutPanelComponent, ShowOptionsFieldsetComponent, ShowSlidesFieldsetComponent, SignatureStrippedDialogComponent, SignaturesPanelComponent, SignaturesService, SlideCanvasComponent, SlideDefaultInspectorComponent, SlideDiffChangesComponent, SlideDiffRowComponent, SlideDiffThumbnailsComponent, SlideSizeCardComponent, SlideSorterOverlayComponent, SlideThemeOverridePanelComponent, SlidesPanelComponent, SmartArt3DRendererComponent, SmartArt3DService, SmartArtPreviewComponent, SmartArtPropertiesComponent, SmartArtRendererComponent, StatusBarComponent, TABLE_STRUCTURE_TOGGLES, TEXT_DIRECTION_OPTIONS, THEME_CATALOG, TIMING_CURVE_OPTIONS, TRIGGER_OPTIONS, TYPE_LABELS, TableCellAdvancedFillComponent, TableCellFormattingComponent, TableDataEditorComponent, TablePropertiesComponent, TableRendererComponent, TableResizeOverlayComponent, TableSelectionService, TextAdvancedPanelComponent, ThemeEditorFieldsComponent, ThemeGalleryComponent, ThemeSelectorCardComponent, TitleBarComponent, VALIGN_OPTIONS, VIEWER_THEME, VersionHistoryPanelComponent, ViewerCanvasEditingService, ViewerCollabCursorService, ViewerCollaborationSessionService, ViewerCompareService, ViewerCustomShowsService, ViewerDialogsService, ViewerDocumentPropertiesService, ViewerExportService, ViewerExtraDialogsComponent, ViewerFileIOService, ViewerFindReplaceService, ViewerFormatPainterService, ViewerInspectorPanelService, ViewerKeyboardService, ViewerMobileSheetService, ViewerPresentationModeService, ViewerThemeGalleryService, ViewerTouchGesturesService, ViewerZoomService, WEBM_MIME_CANDIDATES, WriteBackScheduler, ZoomNavigationService, ZoomRendererComponent, ZoomTargetService, addCategory, addCommentToList, addGradientStopPatch, addItem, addSeries, addSubItem, advanceStep, aiToggleVisible, alignPatch, animationFor, annotationMapToInkInserts, applyAcceptedDiff, applyAnimationPreset, applyFindReplacements, applyFormatToElement, applyMove, applyResize, applyTableStylePreset, asMediaElement, assignUserColor, attachTouchGestures, beginNodeEdit, boolFromEvent, bringForward, bringToFront, buildBarActions, buildBroadcastConfig, buildBroadcastViewerUrl, buildCategoryLabels, buildCellParagraphs, buildChartViewModel, buildChatLogExport, buildChatLogMarkdown, buildChromeStyle, buildClearHyperlinkPatch, buildClickGroups, buildColStyles, buildCollaborationConfig, buildComboViewModel, buildCssGradientFromShapeStyle, buildDuotoneFilter, buildDuotoneFilterId, buildEmbeddedFontStyles, buildEquationElement, buildEquationSegment, buildFallbackViewModel, buildFontFaceRule, buildGradientFillCss, buildGridlinesAndLabels, buildHyperlinkPatch, buildInkContainerStyle, buildInkStrokes, buildLegend, buildModel3DContainerStyle, buildModel3DViewModel, buildOleActionModel, buildOleInfoRows, buildPatternFillCss, buildPrintHtmlDocument as buildPrintDocument, buildPropertiesPatch, buildRegionMapViewModel, buildSaveSlides, buildShareUrl, buildSmartArtInsertElement, buildSmartArtNodes, buildStockViewModel, buildSurfaceViewModel, buildTableViewModel, buildTreemapViewModel, buildTrimFragment, buildWaterfallViewModel, buildZeroLine, buildZoomContainerStyle, buildZoomViewModel, bulletIndentPx, canAddTopLevelNode, canRemoveTopLevelNode, canStartBroadcast, canStartShare, canUseClipboard, captionDisplayText, cellRunStyle, cellStyleToStyleMap, cellTdStyle, changeCountLabel, changeIcon, characterSpacingPatch, checkFontAvailable, clampCursorPosition, clampGifDimensions, clampIndex, clampNotesFontSize, clampScale, clampStep, clearAllLocalViewerData, clearAudienceContent, cn, collectAccessibilityIssues, collectElementText, collectSlideText, collectStoredChats, collectUsedFontFamilies, columnWidthStyle, commitNodeText, computeAlign, computeAxisTitlePrimitives, computeBarRects, computeBubbleRadius, computeCornerHandle, computeDataTablePrimitives, computeDistribute, computeDrawingViewBox, computeErrorBarPrimitives, computeFocusTargets, computeHandleBoxes, computeHandoutLayout, computeIsMobile, computeIsTablet, computeLinePoints, computeLinearRegression, computePageCount, computePieLayout, computePieSlicePath, computePieSlices, computePlotLayout, computeRSquared, computeRadarPoints, computeScatterDots, computeSelectionBoxes, computeSingleSelected, computeSlideIndices, computeSnap, computeStackedBarRects, computeStackedValueRange, computeTextLines, computeTimerProgress, computeTrendlinePrimitives, computeValueRange, convertOmmlToMathMl, copyFormatFromElement, countAccessibilityIssues, countAnnotationStrokes, createAngularAiBridge, createCustomShow, createSwipeDismissDrag, createWebrtcBundle, createWebsocketBundle, cssObjectToStyleMap, currentColorScheme, currentLayout, currentStyle, defaultCssVars, defaultRadius, defaultThemeColors, deleteElementsByIds, deleteVersion as deleteRecoveryVersion, demoteNode, deriveModel3DBlobUrl, derivePresenceList, describeSmartArtBounds, disableGlowPatch, disableInnerShadowPatch, disableOuterShadowPatch, disableReflectionPatch, disableSoftEdgePatch, duplicateElementById, durationOf, effectsStateOf, enableGlowPatch, enableInnerShadowPatch, enableOuterShadowPatch, enableReflectionPatch, enableSoftEdgePatch, encodeGif, estimatePageCount, evenColumnWidths, evenRowHeights, exitPresentationFullscreen, exportAiChatLogs, extractPathPoints, eyedropperAvailable, fillColorOf, findInSlides, findOwningSlideIndex, findSlideIndexByElementId, fitPolynomial, fitZoom, focusTargetChips, fontMimeForFormat, fontSizeOf, formatAutoNumber, formatAxisValue, formatBytes, formatCursorLabel, formatElapsed, formatFileSize, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, generateCustomShowId, generatePressureCircles, generateRulerTicks, getClrChangeParams, getContainerStyle, getDuotoneFilterDef, getImageSrc, getLocalStorageUsageSummary, getOleAriaLabel, getOleBadgeLabel, getOleDisplayName, getOleDownloadFileName, getOleTypeColor, getOleTypeLabel, getPasswordStrength, getPatternSvg, getPlaceholderStyle, getVersions as getRecoveryVersions, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getSmartArtNodeBounds, getSpeechRecognitionCtor, getTextBlockStyle, getTextWarp, getTouchDistance, getWarpCategory, getWarpPath, gradientStateFromStyle, gradientStateOf, gradientStatePatch, gridColumns, groupElements, groupIssuesBySeverity, hasAnimation, hasCopyableFormat, hasExistingLink, hasExitedFullscreen, hasGradientFill, hasPressureVariation, headerLabel, inkViewBox, insertColumn, insertRow, interpolateWidth, isAudienceTab, isBold, isBrowserOpenableMime, isChildNode, isElementInteractive, isInjectableUrl, isItalic, isPpactionUrl, isPresenterMessage, isSigned, isTextElement, isTwoTableFocus, isUnderline, isUrlSafe, isValidRoomId, isViewportBackgroundPressTarget, isZoomActivationKey, issueTrackKey, issueTypeLabel, keyToLabel, latexToMathml, linePointsToSvgString, lineSpacingPatch, loadAudienceContent, mergeCaptionResults, mergeDown, mergeRight, mergeSelection, moveElementBy, moveNodeDown, moveNodeUp, msToFrameDelayCs, narrowToCircle, narrowToPolygon, narrowToRect, newChartElement, newEquationElement, newPresetShapeElement, newShapeElement, newSmartArtElement, newTableElement, newTextElement, nextVisibleIndex, nodeBold, nodeEditBox, nodeFillColor, nodeFontColor, nodeIdFromKey, nodeItalic, nodeStyle, normalizeFontFormat, normalizeSlidesPerPage, normalizeValue, numFromEvent, ommlToMathml, ooxmlDashToCssBorderStyle, openNativeEyeDropper, overallStatus, paletteColor, parseAudienceNonce, parseNodeTextarea, partitionSlides, patchChartData, patchChartStyle, patchTableData, patchTextStyle, pendingElementStyles, pickColorByClickFallback, pickSupportedMimeType, planGifFrames, planVideoSegments, pointsToSvgPathD, presenceToCursors, presetByLayout, presetsForCategory, pressuresToWidths, prevVisibleIndex, projectDrawingShapes, promoteNode, provideViewerTheme, radarAngle, radarRingPoints, recordWebm, redistributeColumnWidth, removeAnimation, removeCategory, removeColumn, removeCommentFromList, removeElementAnimation, removeGradientStopPatch, removeNode, removeRow, removeSeries, renderToCanvas, reorderAnimationDown, reorderAnimationUp, replaceInSlides, replaceMatch, requestPresentationFullscreen, resizeElement, resolveCaptionTracks, resolveChartKind, resolveFontVariant, resolveHyperlinkHref, resolveInteractiveElementId, resolveMediaSrc, resolveOleType, resolveParagraphBullet, resolvePresenterNotes, resolveProfileInitial, resolveRegionCode, resolvePalette as resolveSmartArtPalette, resolveThemeCatalogEntry, resolveTransitionDuration, revealedElementStyles, routeOrthogonalConnector, rowStyle, sampleColorFromSlide, sanitizeColor, sanitizeSlideIndex, sanitizeUserName, saveViewerProfile, scanAvailableFonts, searchSlides, seedBroadcastFields, seedHyperlinkDraft, seedPropertiesDraft, seedShareFields, segmentFrameCount, selectValue, sendBackward, sendToBack, sequentialColorScale, serializeWriteBack, seriesColor, setAnimationEmphasis, setAnimationEntrance, setAnimationExit, setAxis, setAxisLogScale, setAxisTitleStyle, setCategoryLabel, setCellText, setColorScheme, setDataLabels, setDataPointExplosion, setDataPointFill, setDataPointLabel, setDelay, setDirection, setDuration, setElementPosition, setGridlineStyle, setLayout, setLegend, setNodeStyle, setNodeText, setRepeatCount, setRepeatMode, setSequence, setSeriesChartType, setSeriesColor, setSeriesErrorBars, setSeriesMarker, setSeriesName, setSeriesTrendline, setSeriesValue, setStyle, setTimingCurve, setTitle, setTrigger, setTriggerShapeId, shapeStylePatch, sheetAfterNavigate, shouldBlockClickAdvance, shouldUseSvgWarp, showDirectionPicker, showsTemplateAffordance, signatureCountLabel, signatureKey, signatureTimestamp, signerName, statusLabel as slideDiffStatusLabel, slideNumberOf, smartArtNodes, paletteColour as smartArtPaletteColour, snapToGridStep, splitCursorCell, splitMergedCell, statusKind, statusLabel$1 as statusLabel, storeAudienceContent, stringFromEvent, strokeColorOf, strokeToInkElement, styleShadowFilter, textAdvancedPatch, textAdvancedStateFromStyle, textAdvancedStateOf, textColorOf, textDirectionPatch, textStyleOf, textStylePatch, themeStyle, themeToCssVars, thumbnailHeight, thumbnailZoom, toggleCommentResolvedInList, toggleNodeBold, toggleNodeItalic, toggleSheet, topLevelNodeCount, transformSelectedTextCase, translationsEn, ungroupElements, updateElementById, updateGlowPatch, updateGradientStopPatch, updateInnerShadowPatch, updateOuterShadowPatch, updateReflectionPatch, vAlignPatch, validatePassword, validatePrintSettings, validateRoomId, valueToY, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, waypointsToPathD, worstStatus, zoomTargetSlideIndex };
16609
+ export type { AccessibilityIssueGroup, AccountAuthConfig, ActionDescriptor, AiCanvasHighlight, AiChatInitState, AiLogChat, AiLogExport, AiLogFormat, AiLogMessage, AiPanelSelectionAccessors, AlignBox, AlignMode, AnimationClickGroup, AnimationGroup, AnnotationInkInsert, AnnotationStroke, AttachTouchGesturesConfig, AwarenessLike, BarRect, Box, BridgeDeps, BroadcastConfig, BroadcastDefaults, CSSProperties, CanvasSize, CellCoord, CellParagraph, CellTextRun, ChartPartRef, ChartPartSelection, ChartValueDrag, ChartViewModel, ClassValue, ClrChangeParams, CollaborationConfig, CollaborationRole, RouterRect as ConnectorObstacle, RouterPoint as ConnectorPoint, ConnectorRouting, CopiedFormat, CornerHandleBox, CustomShow, CustomThemeEdit, DestroyableYDoc, DiagonalBorderInfo, DistributeMode, DocumentProperties, DrawingViewBox, DuotoneFilterDef, EffectsState, EmbeddedFontStyles, EquationTemplate, EyedropperResult, FindOptions, FindResult, FocusChip, FocusSelectionInput, GifFrame, GifFramePlan, GifPlanOptions, GlowState, GradientState, GradientStop$1 as GradientStop, GroupResult, HandleBox, HandoutSlidesPerPage, HyperlinkDraft, InkPoint, InkStroke, InlineEditState, InnerShadowState, LegendEntry, LinePoint, LinearFit, LocalIdentity, LocalStorageUsageSummary, LocaleCatalogEntry, MobileSheetKey, Model3DViewModel, NodeEditBox, NotesSegmentViewModel, ObjectUrlFactory, OleActionModel, OleInfoRow, OuterShadowState, OverallSignatureStatus, PartitionedSlides, PathPoint, PieSliceGeometry, PieSliceOptions, PlotLayout, PlotLayoutOptions, PositionUpdate, PowerPointViewerAPI, PptxAiBridge, PptxAiConfig, PptxAiConnection, PptxAiContextStrategy, PptxAiElementUpdate, PptxAiToolName, PptxAiUIMessage, PptxAiWritePolicy, PresentationTool, PresenterExitMessage, PresenterMessage, PresenterNotes, PresenterSlideChangeMessage, PressureCircle, PrintColorMode, PrintHtmlDocumentOptions as PrintDocumentOptions, PrintOrientation, PrintSettings, PrintSlideRange, PrintWhat, PropertiesDraft, ProposalView, ProviderBundle, ProviderLike, RadarPoint, RecordWebmOptions, RecoveryVersion, ReflectionState, RemoteCursor, SanitizedPresence as RemotePresence, RenderedShape, ReplaceResult, ResizeHandle, ResolvedCaptionTrack, ResolvedFontVariant, ResolvedOleType, RulerTick, ScatterDot, SelectionBox, ShapeStyleChanges, ShareDefaults$1 as ShareDefaults, ShareFormFields, ShortcutReferenceItem, SignatureStatusKind, SlideInspectorTab, SlideTransitionAnimations, SmartArtInsertEvent, SmartArtNodeBounds, SnapBox, SnapGuide, SnapResult, SoftEdgeState, SpeechAlternative, SpeechRecognitionCtor, SpeechRecognitionEventLite, SpeechRecognitionLite, SpeechResult, SpeechResultList, SpeechSupportState, StagedProposal, StrokeToInkElementOpts, StyleMap, SupportedChartKind, SvgAreaGradient, SvgCircle, SvgLine, SvgPath, SvgPolygon, SvgPolyline, SvgPrimitive, SvgRect, SvgText, SwipeDismissDrag, TableBooleanFlag, TableCellSelection, TableCellViewModel, TableRowViewModel, TemplateElementsBySlideId, TextAdvancedChanges, TextAdvancedState, TextStyleChanges, TextWarpCssDef, TextWarpDef, TextWarpPathDef, ThemeCatalogEntry, TimerProgress, ToolbarActionId, TouchGestureCallbacks, TranslationKey, UngroupResult, ValueRange, VideoPlanOptions, VideoSegmentPlan, ViewerMode, ViewerProfile, ViewerSettings, ViewerTheme, ViewerThemeColors, ZoomViewModel };