pptx-angular-viewer 1.31.5 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,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';
@@ -4931,6 +5800,14 @@ declare class CollaborationService {
4931
5800
  private lastConfig;
4932
5801
  private lastOptions;
4933
5802
  private localPresence;
5803
+ /**
5804
+ * Reentrancy token for {@link connect}: bumped by every connect() and
5805
+ * disconnect(). A connect() whose token no longer matches after an await was
5806
+ * superseded, so it tears down whatever it just created and leaves the
5807
+ * service state to the newer call (a second provider join on the same room
5808
+ * would otherwise throw inside Yjs and kill the surviving session).
5809
+ */
5810
+ private connectToken;
4934
5811
  private readonly refreshPresence;
4935
5812
  constructor();
4936
5813
  connect(config: CollaborationConfig, options?: ConnectOptions): Promise<void>;
@@ -5298,6 +6175,8 @@ declare class LoadContentService {
5298
6175
  readonly theme: _angular_core.WritableSignal<PptxTheme | undefined>;
5299
6176
  /** Resolved colour map for the presentation theme (scheme key → hex). */
5300
6177
  readonly themeColorMap: _angular_core.WritableSignal<Record<string, string> | undefined>;
6178
+ /** Parsed table-style definitions from `ppt/tableStyles.xml` (banding/diagonals). */
6179
+ readonly tableStyleMap: _angular_core.WritableSignal<ParsedTableStyleMap | undefined>;
5301
6180
  /** Slide masters (for placeholder/background resolution). */
5302
6181
  readonly slideMasters: _angular_core.WritableSignal<PptxSlideMaster[]>;
5303
6182
  /** Notes master, including its editable element tree. */
@@ -5344,6 +6223,12 @@ declare class LoadContentService {
5344
6223
  constructor();
5345
6224
  /** Serialise the current (loaded) presentation back to `.pptx` bytes. */
5346
6225
  getContent(): Promise<Uint8Array>;
6226
+ /**
6227
+ * The loaded presentation's core handler, or `undefined` before a deck is
6228
+ * loaded. Exposed for the AI bridge ({@link PptxAiBridge.getHandler}) so the
6229
+ * assistant can reach low-level core APIs when needed.
6230
+ */
6231
+ getHandler(): PptxHandler | undefined;
5347
6232
  /**
5348
6233
  * Serialise an explicit set of slides back to `.pptx` bytes (e.g. the
5349
6234
  * editor's edited deck) using the loaded presentation's handler.
@@ -5713,8 +6598,15 @@ declare function getContainerStyle(el: PptxElement, zIndex: number): StyleMap;
5713
6598
  /**
5714
6599
  * Fill / stroke / corner-radius for shape-like elements. Returns an empty
5715
6600
  * object when the element carries no shape styling.
6601
+ *
6602
+ * `animatesFill` / `animatesStroke` come from an active `p:animClr` colour
6603
+ * animation during presentation playback: when set, the static paint is dropped
6604
+ * so the wrapper's colour keyframes (applied as an `animation` on this same box)
6605
+ * own `background-color` / `border-color`. Mirrors the Vue port's
6606
+ * `getShapeFillStrokeStyle` and React's `getShapeVisualStyle`. Absent/false
6607
+ * keeps the static paint, so editor / read-only rendering is unaffected.
5716
6608
  */
5717
- declare function getShapeFillStrokeStyle(el: PptxElement): StyleMap;
6609
+ declare function getShapeFillStrokeStyle(el: PptxElement, parentGroupFill?: ShapeStyle, animatesFill?: boolean, animatesStroke?: boolean): StyleMap;
5718
6610
  /**
5719
6611
  * Text block style for elements that carry text. Mirrors the essentials of the
5720
6612
  * React `getTextStyleForElement`.
@@ -5821,8 +6713,14 @@ interface TableRowViewModel {
5821
6713
  * resolving spans, applying banding (lowest priority) beneath the explicit cell
5822
6714
  * style, and extracting diagonal-border info. Returns an empty array when
5823
6715
  * `tableData` is absent.
6716
+ *
6717
+ * `styleCtx` (parsed table-style map + theme colour/font scheme) is threaded
6718
+ * into both the banding resolver and the diagonal-border resolver so
6719
+ * table-style-inherited banding, fonts, and section diagonals apply; per-cell
6720
+ * explicit styles still win. When omitted, both fall back to the hardcoded
6721
+ * defaults (unchanged from before).
5824
6722
  */
5825
- declare function buildTableViewModel(el: PptxElement): TableRowViewModel[];
6723
+ declare function buildTableViewModel(el: PptxElement, styleCtx?: TableStyleContext): TableRowViewModel[];
5826
6724
  /** Compute `<col>` width styles from the column-widths array (0-1 fractions). */
5827
6725
  declare function buildColStyles(el: PptxElement): StyleMap[];
5828
6726
 
@@ -5851,6 +6749,13 @@ declare class TableRendererComponent {
5851
6749
  private readonly injector;
5852
6750
  /** Shared cell-selection state (present only inside the editor subtree). */
5853
6751
  private readonly selectionSvc;
6752
+ /**
6753
+ * Deck load state (present in the viewer subtree). Supplies the parsed
6754
+ * table-style map + theme colour/font scheme so table-style-inherited banding,
6755
+ * fonts, and section diagonals resolve. Absent (optional) in standalone
6756
+ * thumbnail/export renderers, where the hardcoded defaults are used.
6757
+ */
6758
+ private readonly loader;
5854
6759
  /** The table element to render. Must be `type === 'table'`. */
5855
6760
  readonly element: _angular_core.InputSignal<PptxElement>;
5856
6761
  /** Whether inline cell editing / selection / resize is enabled. */
@@ -5868,6 +6773,12 @@ declare class TableRendererComponent {
5868
6773
  private readonly cellInput;
5869
6774
  /** Pre-computed `<col>` styles for the colgroup. */
5870
6775
  readonly colStyles: _angular_core.Signal<StyleMap[]>;
6776
+ /**
6777
+ * Table-style context (parsed style map + theme colour/font scheme) from the
6778
+ * deck loader, or `undefined` outside the viewer subtree. `fontScheme` lets a
6779
+ * table style's `a:fontRef@idx` resolve to a concrete font family.
6780
+ */
6781
+ private readonly styleCtx;
5871
6782
  /** Projected view-model rows with merged-cell resolution + banding applied. */
5872
6783
  readonly rows: _angular_core.Signal<TableRowViewModel[]>;
5873
6784
  /** Column widths (0-1 fractions) for the resize overlay. */
@@ -6018,7 +6929,7 @@ declare class ViewerCollabCursorService {
6018
6929
  }
6019
6930
 
6020
6931
  /** Seed values for the Share dialog's start form. */
6021
- interface ShareDefaults$1 {
6932
+ interface ShareDefaults {
6022
6933
  roomId?: string;
6023
6934
  userName?: string;
6024
6935
  serverUrl?: string;
@@ -6026,7 +6937,7 @@ interface ShareDefaults$1 {
6026
6937
  /** Host accessors/emitters a service cannot own (inputs + outputs). */
6027
6938
  interface CollaborationSessionHost {
6028
6939
  readonly authorName: () => string | undefined;
6029
- readonly shareDefaults: () => ShareDefaults$1 | undefined;
6940
+ readonly shareDefaults: () => ShareDefaults | undefined;
6030
6941
  readonly getTemplateElements: () => TemplateElementsBySlideId;
6031
6942
  /** Apply a remote peer's slide set to the editable deck (echo-guarded in the service). */
6032
6943
  readonly applyRemoteSlides: (slides: PptxSlide[]) => void;
@@ -6054,6 +6965,14 @@ declare class ViewerCollaborationSessionService {
6054
6965
  */
6055
6966
  private readonly activeSession;
6056
6967
  private host;
6968
+ /**
6969
+ * Last host `collaboration` config handled by {@link syncHostConfig}
6970
+ * (reference-equal dedup). A re-invocation with the same object (e.g. a
6971
+ * spurious effect re-run) must not reconnect: a second provider join on the
6972
+ * same room throws inside Yjs and tears down the live session. Cleared on
6973
+ * the explicit stop paths so stop + restart with the same object works.
6974
+ */
6975
+ private lastSyncedConfig;
6057
6976
  /** Wire the host inputs/outputs (called once from the component constructor). */
6058
6977
  bind(host: CollaborationSessionHost): void;
6059
6978
  private requireHost;
@@ -6082,7 +7001,7 @@ declare class ViewerCollaborationSessionService {
6082
7001
  * `userName` falling back to `authorName` (then "You") so the local user's
6083
7002
  * name pre-fills the form. Mirrors React/Vue.
6084
7003
  */
6085
- readonly shareDialogDefaults: _angular_core.Signal<ShareDefaults$1>;
7004
+ readonly shareDialogDefaults: _angular_core.Signal<ShareDefaults>;
6086
7005
  /**
6087
7006
  * Connect / disconnect real-time collaboration when the host `collaboration`
6088
7007
  * input changes (called from the component's effect).
@@ -6541,6 +7460,11 @@ declare class ViewerInspectorPanelService {
6541
7460
  readonly visibleInspectorKind: _angular_core.Signal<InspectorContent>;
6542
7461
  /** Accessible-label translation key for the inspector host, by active content. */
6543
7462
  readonly inspectorLabel: _angular_core.Signal<"" | "pptx.toolbar.comments" | "pptx.accessibility.title" | "pptx.viewer.digitalSignatures" | "pptx.selectionPane.title" | "pptx.inspector.properties">;
7463
+ /**
7464
+ * Dismiss the mobile bottom-sheet inspector (backdrop tap or a past-threshold
7465
+ * swipe-down): hide the host until reopened and clear any explicit tool panel.
7466
+ */
7467
+ dismissMobileInspector(): void;
6544
7468
  /** Toggle a right-docked tool panel (clicking the active one closes it). */
6545
7469
  togglePanel(panel: InspectorToolPanel): void;
6546
7470
  /**
@@ -6887,11 +7811,11 @@ declare class PowerPointViewerComponent {
6887
7811
  */
6888
7812
  readonly onOpenFile: _angular_core.InputSignal<(() => void) | undefined>;
6889
7813
  /**
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`.
7814
+ * Opt in to the Three.js SmartArt renderer. When `true`, SmartArt diagrams
7815
+ * render as extruded 3D blocks on a WebGL canvas instead of flat SVG.
7816
+ * Requires the optional `three` peer dependency; when it is not installed
7817
+ * (or the diagram has no geometry), the viewer transparently falls back to
7818
+ * the SVG SmartArt renderer. Default `false`.
6895
7819
  */
6896
7820
  readonly smartArt3D: _angular_core.InputSignal<boolean>;
6897
7821
  /**
@@ -6900,6 +7824,14 @@ declare class PowerPointViewerComponent {
6900
7824
  * ribbon tab id). Default `[]` hides nothing, matching prior behaviour.
6901
7825
  */
6902
7826
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
7827
+ /**
7828
+ * Optional AI assistant configuration. When set, a Sparkles toggle appears in
7829
+ * the ribbon and opens a right-rail chat pane wired to the open deck. The
7830
+ * `ai` SDK is an optional peer; when it is not installed the pane shows an
7831
+ * "unavailable" notice instead. Absent by default (no AI UI). Mirrors React's
7832
+ * `ai` prop.
7833
+ */
7834
+ readonly ai: _angular_core.InputSignal<PptxAiConfig | undefined>;
6903
7835
  /** Fired when the active slide changes. */
6904
7836
  readonly activeSlideChange: _angular_core.OutputEmitterRef<number>;
6905
7837
  /** Fired when the unsaved-changes flag toggles. */
@@ -6953,6 +7885,8 @@ declare class PowerPointViewerComponent {
6953
7885
  protected readonly fileIO: ViewerFileIOService;
6954
7886
  protected readonly themeGallery: ViewerThemeGalleryService;
6955
7887
  protected readonly canvasEditing: ViewerCanvasEditingService;
7888
+ /** Shared AI panel scope + on-canvas highlight store (pick mode, tool focus). */
7889
+ protected readonly aiPanelStore: AiPanelStore;
6956
7890
  protected readonly collabCursor: ViewerCollabCursorService;
6957
7891
  protected readonly docProperties: ViewerDocumentPropertiesService;
6958
7892
  private readonly translateService;
@@ -7068,6 +8002,18 @@ declare class PowerPointViewerComponent {
7068
8002
  protected readonly showSmartArtInsert: _angular_core.WritableSignal<boolean>;
7069
8003
  /** The single selected element on the active slide (for the inspector). */
7070
8004
  protected readonly selectedElement: _angular_core.Signal<PptxElement | null>;
8005
+ /** Whether the AI assistant pane is open (toggled from the ribbon Sparkles). */
8006
+ protected readonly aiPanelOpen: _angular_core.WritableSignal<boolean>;
8007
+ /** Whether the AI assistant toggle is shown (host supplied an `ai` config). */
8008
+ protected readonly aiEnabled: _angular_core.Signal<boolean>;
8009
+ /**
8010
+ * Stable {@link PptxAiBridge} exposing this viewer's live state + editor to
8011
+ * the AI core. Its three write choke points route through
8012
+ * {@link EditorStateService.applyReplacement}, so each AI edit is a single
8013
+ * undoable history entry. Built unconditionally (cheap); only consumed when
8014
+ * the host passes {@link ai}.
8015
+ */
8016
+ protected readonly aiBridge: PptxAiBridge;
7071
8017
  constructor();
7072
8018
  /**
7073
8019
  * Serialise the current presentation to `.pptx` bytes (imperative handle).
@@ -7084,6 +8030,13 @@ declare class PowerPointViewerComponent {
7084
8030
  goTo(index: number): void;
7085
8031
  goPrev(): void;
7086
8032
  protected onCreatePresentation(templateId: string): void;
8033
+ /**
8034
+ * Route an AI theme edit (partial theme update) through the theme-gallery
8035
+ * service so it re-resolves slide colours and records ONE undoable entry,
8036
+ * mirroring how the Design tab applies a theme. Falls back to the current
8037
+ * colour/font scheme for whichever half the update omits.
8038
+ */
8039
+ private applyAiTheme;
7087
8040
  /**
7088
8041
  * File > Options > Appearance selection handler. When a host supplies
7089
8042
  * `onThemeChange` it owns persisting the choice; otherwise this falls back
@@ -7127,6 +8080,19 @@ declare class PowerPointViewerComponent {
7127
8080
  getSlideCount(): number;
7128
8081
  /** Whether the document has unsaved changes. */
7129
8082
  isDirty(): boolean;
8083
+ /**
8084
+ * Canvas element press. While the AI panel is picking, the press hands the
8085
+ * element to the assistant (highlighted + added to the pick set) instead of
8086
+ * selecting it; otherwise it routes to the normal editor selection.
8087
+ */
8088
+ protected onCanvasElementSelect(event: {
8089
+ id: string;
8090
+ additive: boolean;
8091
+ }): void;
8092
+ /** Context-menu "Ask AI about this": scope + open the assistant, empty composer. */
8093
+ protected onContextMenuAskAi(): void;
8094
+ /** Context-menu "Fix with AI": scope + open the assistant with a prefilled directive. */
8095
+ protected onContextMenuFixAi(): void;
7130
8096
  /** Get the IDs of currently selected elements. */
7131
8097
  getSelectedElementIds(): string[];
7132
8098
  /** Programmatically select elements by their IDs. */
@@ -7220,7 +8186,7 @@ declare class PowerPointViewerComponent {
7220
8186
  /** Resolve the live slide-stage element within `<main>`. */
7221
8187
  private stageElement;
7222
8188
  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>;
8189
+ 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
8190
  }
7225
8191
 
7226
8192
  /** A selected chart sub-part, scoped to the chart element that owns it. */
@@ -7575,7 +8541,395 @@ declare class ZoomTargetService {
7575
8541
  * `PowerPointViewerComponent`'s children (ribbon, slide canvas, inspector,
7576
8542
  * dialogs, ...) rely on via `inject()`.
7577
8543
  */
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];
8544
+ 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];
8545
+
8546
+ /** Lifecycle of the AI session bootstrap. */
8547
+ type AiChatInitState = 'checking' | 'unavailable' | 'ready' | 'error';
8548
+ declare class AiChatService {
8549
+ private readonly destroyRef;
8550
+ private controller;
8551
+ private unsubscribe;
8552
+ private started;
8553
+ /**
8554
+ * Tool call ids we have already reported to {@link toolTargetHandler}, so the
8555
+ * live on-canvas focus fires once per call as it first appears (the vanilla
8556
+ * controller has no `onToolCall` hook we can pass, so we derive tool activity
8557
+ * from the streamed snapshot instead).
8558
+ */
8559
+ private readonly reportedToolCalls;
8560
+ private toolTargetHandler;
8561
+ /** Session bootstrap lifecycle. */
8562
+ readonly state: _angular_core.WritableSignal<AiChatInitState>;
8563
+ /** The current transcript. */
8564
+ readonly messages: _angular_core.WritableSignal<readonly PptxAiUIMessage[]>;
8565
+ /** The chat status (`ready` / `submitted` / `streaming` / `error`). */
8566
+ readonly status: _angular_core.WritableSignal<AiSdk.ChatStatus>;
8567
+ /** The last transport / streaming error, when any. */
8568
+ readonly error: _angular_core.WritableSignal<Error | undefined>;
8569
+ /** The bootstrap error (SDK missing / session build failed). */
8570
+ readonly initError: _angular_core.WritableSignal<Error | undefined>;
8571
+ /** The staged, not-yet-applied write proposals. */
8572
+ readonly proposals: _angular_core.WritableSignal<readonly ProposalView[]>;
8573
+ /** Whether a request is in flight (drives the composer send/stop toggle). */
8574
+ readonly isStreaming: _angular_core.Signal<boolean>;
8575
+ constructor();
8576
+ /**
8577
+ * Bootstrap the session for the given bridge + config. Idempotent: only the
8578
+ * first call takes effect (the panel calls it once when it opens).
8579
+ */
8580
+ init(bridge: PptxAiBridge, config: PptxAiConfig): void;
8581
+ /**
8582
+ * Register a handler invoked as each tool call first appears, with the slide /
8583
+ * element(s) it references (or `null` for deck-wide tools). Lets the viewer
8584
+ * navigate + highlight the canvas so it mirrors the assistant in real time.
8585
+ */
8586
+ setToolTargetHandler(handler: (target: ToolCanvasTarget | null) => void): void;
8587
+ /** Send a user message (no-op when empty or not ready). */
8588
+ send(text: string): void;
8589
+ /** Abort the in-flight request. */
8590
+ stop(): void;
8591
+ /** Clear the current error and return to the ready state. */
8592
+ clearError(): void;
8593
+ /** Accept one staged proposal (applies it as one undoable edit). */
8594
+ applyProposal(id: string): void;
8595
+ /** Reject one staged proposal without applying it. */
8596
+ rejectProposal(id: string): void;
8597
+ /** Accept every staged proposal in order (each its own undoable edit). */
8598
+ acceptAllProposals(): void;
8599
+ private applySnapshot;
8600
+ /**
8601
+ * Fire {@link toolTargetHandler} once per tool call as it first appears with a
8602
+ * resolved input, mirroring React's `onToolCall` -> `toolCanvasTarget` path
8603
+ * (the vanilla controller owns `onToolCall`, so we cannot hook it directly).
8604
+ */
8605
+ private reportNewToolTargets;
8606
+ private refreshProposals;
8607
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChatService, never>;
8608
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AiChatService>;
8609
+ }
8610
+
8611
+ declare class AiChatPanelComponent {
8612
+ readonly bridge: _angular_core.InputSignal<PptxAiBridge>;
8613
+ readonly config: _angular_core.InputSignal<PptxAiConfig>;
8614
+ readonly panelWidth: _angular_core.InputSignal<number | undefined>;
8615
+ readonly closed: _angular_core.OutputEmitterRef<void>;
8616
+ protected readonly chat: AiChatService;
8617
+ /** Shared panel scope + on-canvas highlight store (provided by the viewer). */
8618
+ protected readonly store: AiPanelStore;
8619
+ constructor();
8620
+ /**
8621
+ * Apply a suggestion, first enabling the canvas colour tween so the edit fades
8622
+ * in rather than snapping (proposals apply outside the tool loop).
8623
+ */
8624
+ protected applyProposal(id: string): void;
8625
+ protected acceptAllProposals(): void;
8626
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChatPanelComponent, never>;
8627
+ 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>;
8628
+ }
8629
+
8630
+ /**
8631
+ * createAngularAiBridge: builds a {@link PptxAiBridge} that lets the
8632
+ * framework-agnostic AI core (`pptx-viewer-shared/ai`) read the open deck,
8633
+ * navigate it, and route edits through the Angular editor-history layer so
8634
+ * every AI change is a single, undoable Ctrl+Z.
8635
+ *
8636
+ * The bridge is a plain object closing over a small set of accessor callbacks
8637
+ * (mirroring React's `useAiBridge` ref indirection): each read pulls the live
8638
+ * value on demand, and each of the three write choke points funnels through
8639
+ * {@link BridgeDeps.applySlides} -> `EditorStateService.applyReplacement`, which
8640
+ * records ONE history snapshot per commit. Keeping writes funnelled is what lets
8641
+ * the {@link ProposalStore} apply a staged batch atomically.
8642
+ */
8643
+
8644
+ /** Live accessors the bridge closes over, supplied by the viewer component. */
8645
+ interface BridgeDeps {
8646
+ /** The editable (template-free) slide deck. */
8647
+ getSlides(): readonly PptxSlide[];
8648
+ /** Zero-based index of the active slide. */
8649
+ getActiveSlideIndex(): number;
8650
+ /** Slide canvas size in CSS pixels. */
8651
+ getCanvasSize(): {
8652
+ width: number;
8653
+ height: number;
8654
+ };
8655
+ /** The resolved presentation theme, when loaded. */
8656
+ getTheme(): PptxTheme | undefined;
8657
+ /** Host-provided document display name, when set. */
8658
+ getFileName(): string | undefined;
8659
+ /** The loaded core handler, when a deck is open. */
8660
+ getHandler(): PptxHandler | undefined;
8661
+ /** Navigate the viewer to a slide by zero-based index. */
8662
+ goToSlide(index: number): void;
8663
+ /** Select the given elements on a slide (empty clears selection). */
8664
+ selectElements(slideIndex: number, elementIds: readonly string[]): void;
8665
+ /**
8666
+ * Commit a fully-computed next slides array as ONE undoable history entry.
8667
+ * Implemented by the component as `editor.applyReplacement(next, label)`.
8668
+ */
8669
+ applySlides(next: PptxSlide[], label: string): void;
8670
+ /** Apply partial theme updates through the editor's theme handlers. */
8671
+ applyTheme(updates: Partial<PptxTheme>): void;
8672
+ /** Ordered presentation sections (editor-tracked, saved with the deck). */
8673
+ getSections(): readonly PptxSection[];
8674
+ /** Presentation-level properties (`p:presentationPr`), loader-tracked. */
8675
+ getPresentationProperties(): PptxPresentationProperties;
8676
+ /** Custom document properties (`docProps/custom.xml`), loader-tracked. */
8677
+ getCustomProperties(): readonly PptxCustomProperty[];
8678
+ /** Core document properties (`docProps/core.xml`), loader-tracked. */
8679
+ getCoreProperties(): PptxCoreProperties | undefined;
8680
+ /** Extended application properties (`docProps/app.xml`), loader-tracked. */
8681
+ getAppProperties(): PptxAppProperties | undefined;
8682
+ /** Set the slide canvas size (px) and mark the deck dirty. */
8683
+ setCanvasSize(size: {
8684
+ width: number;
8685
+ height: number;
8686
+ }): void;
8687
+ /** Replace the presentation sections and mark the deck dirty. */
8688
+ setSections(sections: readonly PptxSection[]): void;
8689
+ /** Replace the presentation-level properties and mark the deck dirty. */
8690
+ setPresentationProperties(props: PptxPresentationProperties): void;
8691
+ /** Replace the custom document properties and mark the deck dirty. */
8692
+ setCustomProperties(props: readonly PptxCustomProperty[]): void;
8693
+ /** Replace the core document properties and mark the deck dirty. */
8694
+ setCoreProperties(props: PptxCoreProperties | undefined): void;
8695
+ /** Replace the extended application properties and mark the deck dirty. */
8696
+ setAppProperties(props: PptxAppProperties | undefined): void;
8697
+ /**
8698
+ * The slides / elements the assistant should scope its work to (explicit AI
8699
+ * picks, else a pinned focus, else the live canvas selection). When omitted,
8700
+ * the assistant falls back to the whole active slide.
8701
+ */
8702
+ getFocusedTargets?(): PptxAiFocusedTarget[];
8703
+ /** Optional transient host notification (toast / status line). */
8704
+ notify?(message: string, level?: PptxAiNotifyLevel): void;
8705
+ }
8706
+ /** Build a stable {@link PptxAiBridge} over the Angular viewer state/editor. */
8707
+ declare function createAngularAiBridge(deps: BridgeDeps): PptxAiBridge;
8708
+
8709
+ /**
8710
+ * Pure gating predicate for the AI assistant UI. The ribbon Sparkles toggle and
8711
+ * the chat pane are shown only when the host supplies an `ai` config; keeping
8712
+ * this a standalone function makes the rule unit-testable without mounting the
8713
+ * component (the Angular test setup is TestBed-free).
8714
+ */
8715
+
8716
+ /** Whether the AI assistant toggle should be shown for the given config. */
8717
+ declare function aiToggleVisible(config: PptxAiConfig | undefined): boolean;
8718
+
8719
+ declare class AiComposerComponent {
8720
+ readonly isStreaming: _angular_core.InputSignal<boolean>;
8721
+ /**
8722
+ * One-shot composer prefill from "Ask AI" / "Fix with AI". `prefillNonce`
8723
+ * bumps on every request so the composer applies `prefillText` (and focuses)
8724
+ * even when the text is empty and unchanged.
8725
+ */
8726
+ readonly prefillText: _angular_core.InputSignal<string>;
8727
+ readonly prefillNonce: _angular_core.InputSignal<number>;
8728
+ readonly onSend: _angular_core.OutputEmitterRef<string>;
8729
+ readonly onStop: _angular_core.OutputEmitterRef<void>;
8730
+ protected readonly value: _angular_core.WritableSignal<string>;
8731
+ private readonly textarea;
8732
+ private lastPrefillNonce;
8733
+ constructor();
8734
+ protected submit(): void;
8735
+ protected onKeyDown(event: KeyboardEvent): void;
8736
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiComposerComponent, never>;
8737
+ 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>;
8738
+ }
8739
+
8740
+ declare class AiFocusBarComponent {
8741
+ /** Live deck, for resolving element chip labels + the two-table detection. */
8742
+ readonly slides: _angular_core.InputSignal<readonly PptxSlide[]>;
8743
+ /** Emitted with a ready-to-send directive (e.g. the merge-tables request). */
8744
+ readonly sendDirective: _angular_core.OutputEmitterRef<string>;
8745
+ protected readonly store: AiPanelStore;
8746
+ protected readonly chips: _angular_core.Signal<pptx_angular_viewer.FocusChip[]>;
8747
+ protected readonly twoTables: _angular_core.Signal<false | {
8748
+ slideIndex: number;
8749
+ elementIdA: string;
8750
+ elementIdB: string;
8751
+ }>;
8752
+ protected onMerge(tt: {
8753
+ slideIndex: number;
8754
+ elementIdA: string;
8755
+ elementIdB: string;
8756
+ }): void;
8757
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiFocusBarComponent, never>;
8758
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiFocusBarComponent, "pptx-ai-focus-bar", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; }, { "sendDirective": "sendDirective"; }, never, never, true, never>;
8759
+ }
8760
+
8761
+ /** One tool invocation captured with its full technical detail. */
8762
+ interface AiLogToolCall {
8763
+ toolName: string;
8764
+ toolCallId: string;
8765
+ state: string;
8766
+ input: unknown;
8767
+ output: unknown;
8768
+ errorText?: string;
8769
+ }
8770
+ /** One message: its role, concatenated prose, and any tool calls it made. */
8771
+ interface AiLogMessage {
8772
+ role: string;
8773
+ text: string;
8774
+ toolCalls: AiLogToolCall[];
8775
+ }
8776
+ /** One chat conversation in export form. */
8777
+ interface AiLogChat {
8778
+ id: string;
8779
+ title: string;
8780
+ deckId?: string;
8781
+ createdAt: number;
8782
+ updatedAt: number;
8783
+ createdAtIso: string;
8784
+ updatedAtIso: string;
8785
+ messageCount: number;
8786
+ messages: AiLogMessage[];
8787
+ }
8788
+ /** Top-level detailed export document. */
8789
+ interface AiLogExport {
8790
+ format: 'pptx-ai-chat-log';
8791
+ version: 1;
8792
+ exportedAt: string;
8793
+ /** Whether tool inputs/outputs are included (see `detailed` option). */
8794
+ detailed: boolean;
8795
+ chatCount: number;
8796
+ chats: AiLogChat[];
8797
+ }
8798
+ /** Options controlling how the export document is built. */
8799
+ interface BuildChatLogOptions {
8800
+ /** Include tool-call inputs/outputs. Default `true`. When false, tool calls
8801
+ * still list name + state but omit the (potentially large) payloads. */
8802
+ detailed?: boolean;
8803
+ /** Epoch ms stamped as `exportedAt`. Default `Date.now()`. */
8804
+ now?: number;
8805
+ }
8806
+ /** Build the detailed export document from already-loaded chats (pure). */
8807
+ declare function buildChatLogExport(chats: readonly PptxAiStoredChat[], options?: BuildChatLogOptions): AiLogExport;
8808
+ /** Render the same detailed export as a human-readable Markdown transcript. */
8809
+ declare function buildChatLogMarkdown(doc: AiLogExport): string;
8810
+ /** Load every stored chat (newest first) in full detail from a store. */
8811
+ declare function collectStoredChats(store: PptxAiChatStore): Promise<PptxAiStoredChat[]>;
8812
+ /** File format to download. */
8813
+ type AiLogFormat = 'json' | 'markdown';
8814
+ /** Options for {@link exportAiChatLogs}. */
8815
+ interface ExportAiChatLogsOptions {
8816
+ /** Store to read from. Defaults to the shared `createChatHistoryStore()`. */
8817
+ store?: PptxAiChatStore;
8818
+ /** `'json'` (default) or `'markdown'`. */
8819
+ format?: AiLogFormat;
8820
+ /** Include tool inputs/outputs. Default `true`. */
8821
+ detailed?: boolean;
8822
+ /** Epoch ms for the filename + `exportedAt`. Default `Date.now()`. */
8823
+ now?: number;
8824
+ }
8825
+ /**
8826
+ * Read all stored chats and trigger a browser download of the detailed log.
8827
+ *
8828
+ * @returns the number of chats exported. When `0`, no file is downloaded so the
8829
+ * caller can surface an empty-state message instead.
8830
+ */
8831
+ declare function exportAiChatLogs(options?: ExportAiChatLogsOptions): Promise<number>;
8832
+
8833
+ declare class AiSettingsSectionComponent {
8834
+ private readonly store;
8835
+ /** Number of stored chats (null while counting). */
8836
+ protected readonly chatCount: _angular_core.WritableSignal<number | null>;
8837
+ /** Include tool inputs/outputs in the export. */
8838
+ protected readonly detailed: _angular_core.WritableSignal<boolean>;
8839
+ protected readonly busy: _angular_core.WritableSignal<boolean>;
8840
+ /** Result of the last export, or null before any export runs. */
8841
+ protected readonly doneCount: _angular_core.WritableSignal<number | null>;
8842
+ constructor();
8843
+ protected onExport(format: AiLogFormat): void;
8844
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiSettingsSectionComponent, never>;
8845
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiSettingsSectionComponent, "pptx-ai-settings-section", never, {}, {}, never, never, true, never>;
8846
+ }
8847
+
8848
+ declare class AiChangeOverlayComponent {
8849
+ /** The batch of just-applied changes to animate (null when idle). */
8850
+ readonly batch: _angular_core.InputSignal<AiChangeBatch | null>;
8851
+ /** Zero-based active slide index, so the overlay draws only its own slide. */
8852
+ readonly activeSlideIndex: _angular_core.InputSignal<number>;
8853
+ private readonly host;
8854
+ private readonly renderer;
8855
+ private styleEl;
8856
+ /** `start` (pre-flip) then `end` (post-flip) so the CSS transition runs. */
8857
+ private readonly phase;
8858
+ private outerFrame;
8859
+ private innerFrame;
8860
+ /** Monotonic batch id; keys the ghosts + restarts the phase flip per batch. */
8861
+ protected readonly nonce: _angular_core.Signal<number>;
8862
+ /** The changes on the currently visible slide (bounds map 1:1 to the stage). */
8863
+ protected readonly activeChanges: _angular_core.Signal<AiElementChange[]>;
8864
+ constructor();
8865
+ /** Kebab-cased ghost-rect style for one change at the current phase. */
8866
+ protected ghostStyle(change: AiElementChange): StyleMap;
8867
+ private cancelFrames;
8868
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChangeOverlayComponent, never>;
8869
+ 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>;
8870
+ }
8871
+
8872
+ interface HighlightBox extends AiCanvasHighlight {
8873
+ x: number;
8874
+ y: number;
8875
+ width: number;
8876
+ height: number;
8877
+ }
8878
+ declare class AiFocusHighlightOverlayComponent {
8879
+ readonly highlights: _angular_core.InputSignal<readonly AiCanvasHighlight[]>;
8880
+ /** Elements of the currently visible slide, for bounds lookup. */
8881
+ readonly elements: _angular_core.InputSignal<readonly PptxElement[]>;
8882
+ readonly activeSlideIndex: _angular_core.InputSignal<number>;
8883
+ /** Resolve each highlight to a positioned box on the active slide. */
8884
+ protected readonly boxes: _angular_core.Signal<HighlightBox[]>;
8885
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiFocusHighlightOverlayComponent, never>;
8886
+ 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>;
8887
+ }
8888
+
8889
+ /** One rendered transcript row: a message flattened to its renderable parts. */
8890
+ interface MessageRow {
8891
+ id: string;
8892
+ isUser: boolean;
8893
+ parts: RenderablePart[];
8894
+ }
8895
+ declare class AiMessageListComponent {
8896
+ readonly messages: _angular_core.InputSignal<readonly PptxAiUIMessage[]>;
8897
+ readonly isStreaming: _angular_core.InputSignal<boolean>;
8898
+ private readonly endRef;
8899
+ /** Flatten each message into renderable parts, dropping empty assistant turns. */
8900
+ protected readonly rows: _angular_core.Signal<MessageRow[]>;
8901
+ constructor();
8902
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiMessageListComponent, never>;
8903
+ 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>;
8904
+ }
8905
+
8906
+ declare class AiProposalCardComponent {
8907
+ readonly proposal: _angular_core.InputSignal<ProposalView>;
8908
+ readonly accept: _angular_core.OutputEmitterRef<string>;
8909
+ readonly reject: _angular_core.OutputEmitterRef<string>;
8910
+ /** Plain-language description of every staged change (never truncated). */
8911
+ protected readonly lines: _angular_core.Signal<string[]>;
8912
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiProposalCardComponent, never>;
8913
+ 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>;
8914
+ }
8915
+
8916
+ declare class AiToolCallCardComponent {
8917
+ readonly part: _angular_core.InputSignal<RenderableToolPart>;
8918
+ protected readonly failed: _angular_core.Signal<boolean>;
8919
+ protected readonly done: _angular_core.Signal<boolean>;
8920
+ protected readonly running: _angular_core.Signal<boolean>;
8921
+ /** Friendly, non-technical activity ("Looked at slide 5"); never leaks ids. */
8922
+ private readonly activity;
8923
+ protected readonly icon: _angular_core.Signal<ToolActivityIcon>;
8924
+ protected readonly activityLabel: _angular_core.Signal<string>;
8925
+ /** Raw tool name + arg summary, only shown inside the collapsed disclosure. */
8926
+ protected readonly rawSummary: _angular_core.Signal<string>;
8927
+ protected readonly rawLabel: _angular_core.Signal<string>;
8928
+ 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">;
8929
+ protected readonly statusKey: _angular_core.Signal<"pptx.ai.toolFailed" | "pptx.ai.toolDone" | "pptx.ai.toolRunning">;
8930
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiToolCallCardComponent, never>;
8931
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiToolCallCardComponent, "pptx-ai-tool-call-card", never, { "part": { "alias": "part"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
8932
+ }
7579
8933
 
7580
8934
  /** Drawing tool IDs (mirrors React DRAW_TOOLS). */
7581
8935
  type DrawTool$1 = 'select' | 'pen' | 'highlighter' | 'eraser' | 'freeform';
@@ -7661,6 +9015,10 @@ declare class RibbonComponent {
7661
9015
  readonly showSubtitles: _angular_core.InputSignal<boolean>;
7662
9016
  /** Toolbar buttons/tabs the host wants hidden. Default `[]` hides nothing. */
7663
9017
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
9018
+ /** Whether the host enabled the AI assistant (shows the Sparkles toggle). */
9019
+ readonly aiEnabled: _angular_core.InputSignal<boolean>;
9020
+ /** Whether the AI assistant panel is currently open (toggle active state). */
9021
+ readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
7664
9022
  /** Optional sign-in hook point for File > Account. Absent/disabled by default. */
7665
9023
  readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
7666
9024
  readonly prev: _angular_core.OutputEmitterRef<void>;
@@ -7692,6 +9050,8 @@ declare class RibbonComponent {
7692
9050
  readonly packageForSharing: _angular_core.OutputEmitterRef<void>;
7693
9051
  /** Emitted when the user toggles the slides panel from the top bar. */
7694
9052
  readonly toggleSidebar: _angular_core.OutputEmitterRef<void>;
9053
+ /** Emitted when the user clicks the AI assistant Sparkles toggle. */
9054
+ readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
7695
9055
  /** Emitted when the user opens the Digital Signatures panel from the File tab. */
7696
9056
  readonly signatures: _angular_core.OutputEmitterRef<void>;
7697
9057
  readonly info: _angular_core.OutputEmitterRef<void>;
@@ -7758,7 +9118,7 @@ declare class RibbonComponent {
7758
9118
  /** Forward the Review proofing toggle to the viewer-owned live state. */
7759
9119
  protected setSpellCheck(enabled: boolean): void;
7760
9120
  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>;
9121
+ 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
9122
  }
7763
9123
 
7764
9124
  /** The eight resize-handle positions around a selection box. */
@@ -7999,6 +9359,27 @@ declare class SlideCanvasComponent implements SlideContext {
7999
9359
  * slide's own elements; interactive only while {@link editTemplateMode} is on.
8000
9360
  */
8001
9361
  readonly templateElements: _angular_core.InputSignal<readonly PptxElement[]>;
9362
+ /**
9363
+ * On-canvas AI highlight rings (explicit picks + the live tool focus), drawn
9364
+ * inside the scaled stage so element coords map 1:1. Empty on thumbnails.
9365
+ */
9366
+ readonly aiHighlights: _angular_core.InputSignal<readonly AiCanvasHighlight[]>;
9367
+ /** True while the AI is active: enables the colour tween on slide elements. */
9368
+ readonly aiActive: _angular_core.InputSignal<boolean>;
9369
+ /** Zero-based active slide index, so the overlay draws only its own slide. */
9370
+ readonly aiActiveSlideIndex: _angular_core.InputSignal<number>;
9371
+ /**
9372
+ * The batch of just-applied AI element changes to play on the canvas (glide
9373
+ * old->new, fade/scale in-out, glow), or null when idle. Drawn inside the
9374
+ * scaled stage next to the focus overlay so bounds map 1:1. Empty on thumbnails.
9375
+ */
9376
+ readonly aiChangeBatch: _angular_core.InputSignal<AiChangeBatch | null>;
9377
+ /**
9378
+ * When true, the next element click(s) become AI picks (emitted via
9379
+ * {@link elementSelect}) instead of selecting / dragging. mousedown never
9380
+ * starts a drag while picking, mirroring React's pick mode.
9381
+ */
9382
+ readonly aiPickMode: _angular_core.InputSignal<boolean>;
8002
9383
  /** Active draw tool. When not 'select', pointer gestures draw ink strokes. */
8003
9384
  readonly drawTool: _angular_core.InputSignal<"pen" | "highlighter" | "eraser" | "select" | "freeform">;
8004
9385
  /** Active ink stroke colour (CSS colour string). */
@@ -8211,7 +9592,22 @@ declare class SlideCanvasComponent implements SlideContext {
8211
9592
  readonly vRulerTicks: _angular_core.Signal<readonly RulerTick[]>;
8212
9593
  readonly stageStyle: _angular_core.Signal<StyleMap>;
8213
9594
  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>;
9595
+ 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>;
9596
+ }
9597
+
9598
+ /**
9599
+ * Renderer-injected shape-effect definitions that need a companion DOM node
9600
+ * (a soft-edge `<filter>` def, a DAG fill-overlay tint layer), plus the helper
9601
+ * that strips dangling `url(#…)` filter references.
9602
+ *
9603
+ * Kept out of `element-style.ts` so that module stays focused on producing the
9604
+ * base `[ngStyle]` maps. Mirrors the Vue/Svelte `ShapeEffectOverlay` split.
9605
+ */
9606
+
9607
+ /** Injectable soft-edge `<filter>` descriptor (id + feather radius in px). */
9608
+ interface SoftEdgeFilterDef {
9609
+ id: string;
9610
+ radius: number;
8215
9611
  }
8216
9612
 
8217
9613
  /**
@@ -8349,6 +9745,16 @@ interface Paragraph {
8349
9745
  bulletStyle: StyleMap;
8350
9746
  /** Left indent in px derived from the paragraph outline level. */
8351
9747
  indentPx: number;
9748
+ /**
9749
+ * Per-paragraph `line-height` from this paragraph's own `a:lnSpc`: a unitless
9750
+ * multiplier (`a:spcPct`) or a `"<n>pt"` string (`a:spcPts`). Undefined when
9751
+ * the paragraph does not override the body-level line-height.
9752
+ */
9753
+ lineHeight?: number | string;
9754
+ /** `margin-top` in px from `a:spcBef` (space before), when overridden. */
9755
+ spaceBeforePx?: number;
9756
+ /** `margin-bottom` in px from `a:spcAft` (space after), when overridden. */
9757
+ spaceAfterPx?: number;
8352
9758
  }
8353
9759
  /**
8354
9760
  * ElementRendererComponent: Angular port of the React `ElementRenderer.tsx`
@@ -8380,6 +9786,14 @@ declare class ElementRendererComponent {
8380
9786
  * the viewer subtree (thumbnails, export) default to the SVG renderer.
8381
9787
  */
8382
9788
  private readonly smartArt3DService;
9789
+ /**
9790
+ * Native-animation playback (present only inside a running presentation, which
9791
+ * provides {@link AnimationPlaybackService} at the overlay level). Optional so
9792
+ * the same renderer in the editor / thumbnails / export resolves to `null` and
9793
+ * renders with no animation state. Mirrors the Vue `injectPresentationElementStates`
9794
+ * provide/inject and React's threaded `presentationElementStates` prop.
9795
+ */
9796
+ private readonly playback;
8383
9797
  private readonly translate;
8384
9798
  readonly smartArt3D: _angular_core.Signal<boolean>;
8385
9799
  /** Obstacle rects (absolute slide coords) for connector A* routing. */
@@ -8417,6 +9831,12 @@ declare class ElementRendererComponent {
8417
9831
  * no effect at all when false, so default rendering is untouched.
8418
9832
  */
8419
9833
  readonly editTemplateMode: _angular_core.InputSignal<boolean>;
9834
+ /**
9835
+ * The enclosing group's fill (`GroupPptxElement.groupFill`), passed down by
9836
+ * the group render branch so a child painted with `a:grpFill`
9837
+ * (`fillMode === 'group'`) inherits the group's resolved fill.
9838
+ */
9839
+ readonly parentGroupFill: _angular_core.InputSignal<ShapeStyle | undefined>;
8420
9840
  /** Emitted when a table cell's text edit is committed. */
8421
9841
  readonly cellCommit: _angular_core.OutputEmitterRef<{
8422
9842
  id: string;
@@ -8429,12 +9849,30 @@ declare class ElementRendererComponent {
8429
9849
  }>;
8430
9850
  /** Duotone SVG `<filter>` descriptor for this element, if any. */
8431
9851
  readonly duotoneFilter: _angular_core.Signal<pptx_angular_viewer.DuotoneFilterDef | undefined>;
9852
+ /**
9853
+ * Soft-edge feather `<filter>` descriptor (id + radius). The template injects
9854
+ * a matching `<filter>` into a hidden `<defs>` so the `filter:
9855
+ * url(#soft-edge-<id>)` reference on the shape resolves. Undefined otherwise.
9856
+ */
9857
+ readonly softEdgeFilter: _angular_core.Signal<SoftEdgeFilterDef | undefined>;
9858
+ /**
9859
+ * DAG fill-overlay tint (colour + blend mode) painted as a separate blended
9860
+ * layer over the shape. Undefined when the element has no fill overlay.
9861
+ */
9862
+ readonly fillOverlay: _angular_core.Signal<FillOverlayCss | undefined>;
8432
9863
  /**
8433
9864
  * Outline ring + slight transparency applied to inherited template
8434
9865
  * (master/layout) elements while editTemplateMode is on. Empty otherwise, so
8435
9866
  * normal rendering is never altered.
8436
9867
  */
8437
9868
  readonly templateAffordanceStyle: _angular_core.Signal<StyleMap>;
9869
+ /**
9870
+ * This element's native-animation playback state, or `undefined` outside a
9871
+ * running presentation. Drives the staged chart / SmartArt build reveal and the
9872
+ * `p:animClr` fill / stroke relinquish (threaded to the chart / SmartArt /
9873
+ * connector renderers), mirroring React's per-element `animationState`.
9874
+ */
9875
+ readonly animationState: _angular_core.Signal<ElementAnimationState | undefined>;
8438
9876
  readonly containerStyle: _angular_core.Signal<StyleMap>;
8439
9877
  readonly shapeContainerStyle: _angular_core.Signal<StyleMap>;
8440
9878
  readonly textStyle: _angular_core.Signal<StyleMap>;
@@ -8451,13 +9889,20 @@ declare class ElementRendererComponent {
8451
9889
  */
8452
9890
  readonly warpedTextStyle: _angular_core.Signal<StyleMap>;
8453
9891
  readonly children: _angular_core.Signal<PptxElement[]>;
9892
+ /**
9893
+ * This group's own fill, handed to `a:grpFill` children as their
9894
+ * `parentGroupFill`. Undefined for non-group elements. Mirrors the shared
9895
+ * `getGroupChildParentFill` helper (inlined here so the Angular binding does
9896
+ * not depend on a shared symbol that is only vendored at build time).
9897
+ */
9898
+ readonly childParentGroupFill: _angular_core.Signal<ShapeStyle | undefined>;
8454
9899
  readonly isShapeLike: _angular_core.Signal<boolean>;
8455
9900
  readonly isImageLike: _angular_core.Signal<boolean>;
8456
9901
  readonly paragraphs: _angular_core.Signal<Paragraph[]>;
8457
9902
  readonly hasText: _angular_core.Signal<boolean>;
8458
9903
  readonly placeholderLabel: _angular_core.Signal<any>;
8459
9904
  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>;
9905
+ 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
9906
  }
8462
9907
 
8463
9908
  /**
@@ -8492,9 +9937,22 @@ declare class ConnectorRendererComponent {
8492
9937
  readonly canvasHeight: _angular_core.InputSignal<number>;
8493
9938
  /** See ElementRenderer.interactive: gates the data-pptx-element contract attr. */
8494
9939
  readonly interactive: _angular_core.InputSignal<boolean>;
9940
+ /**
9941
+ * Native-animation playback state. When an active `p:animClr` colour animation
9942
+ * targets the stroke (`animatesStroke`), the SVG stroke + arrowheads paint
9943
+ * `inherit` so the wrapper's animated `stroke` keyframes cascade in. Absent
9944
+ * outside a running presentation.
9945
+ */
9946
+ readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
8495
9947
  /** All derived geometry, recomputed on every input change. */
8496
9948
  readonly geo: _angular_core.Signal<ConnectorGeometry>;
8497
9949
  readonly viewBox: _angular_core.Signal<string>;
9950
+ /**
9951
+ * Stroke paint for the line + arrowheads: `inherit` while a `p:animClr` stroke
9952
+ * colour animation is active (so the wrapper keyframes own it), else the
9953
+ * geometry's resolved stroke colour.
9954
+ */
9955
+ readonly strokeColor: _angular_core.Signal<string>;
8498
9956
  private readonly shapeStyle;
8499
9957
  readonly lineShadow: _angular_core.Signal<LineShadowParams | undefined>;
8500
9958
  readonly lineGlow: _angular_core.Signal<string | undefined>;
@@ -8512,7 +9970,7 @@ declare class ConnectorRendererComponent {
8512
9970
  readonly connectorSegments: _angular_core.Signal<TextSegment[] | undefined>;
8513
9971
  readonly connectorTextStyle: _angular_core.Signal<TextStyle | undefined>;
8514
9972
  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>;
9973
+ 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
9974
  }
8517
9975
  /** One parallel stroke of a (possibly compound) connector line. */
8518
9976
  interface ConnectorStrand {
@@ -8610,6 +10068,13 @@ declare class ChartElementViewComponent {
8610
10068
  * editing additionally requires the element to be SELECTED ({@link canEdit}).
8611
10069
  */
8612
10070
  readonly editable: _angular_core.InputSignal<boolean>;
10071
+ /**
10072
+ * Native-animation playback state. When it carries a staged chart build
10073
+ * (`build.kind === 'chart'`) the chart reveals its series / categories / cells
10074
+ * progressively via the shared `applyChartBuildReveal`. Absent outside a
10075
+ * running presentation, so ordinary rendering is unaffected.
10076
+ */
10077
+ readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
8613
10078
  /**
8614
10079
  * The editor state layer. Optional: the renderer is also used outside the
8615
10080
  * editing viewer (thumbnails, export). On-canvas chart edits commit through
@@ -8639,7 +10104,12 @@ declare class ChartElementViewComponent {
8639
10104
  protected readonly canEdit: _angular_core.Signal<boolean>;
8640
10105
  /** VM of the COMMITTED data: drag geometry must not rescale mid-drag. */
8641
10106
  private readonly viewModel;
8642
- /** The element to render: committed data, or the local drag preview. */
10107
+ /**
10108
+ * The element to render: committed data, or the local drag preview, with its
10109
+ * data trimmed to the stages revealed at the current staged-build progress (the
10110
+ * drag preview wins first). Whole-chart / no-build renders return the element
10111
+ * unchanged. Mirrors the Vue `ChartRenderer`'s `revealedElement`.
10112
+ */
8643
10113
  protected readonly renderedElement: _angular_core.Signal<PptxElement>;
8644
10114
  protected readonly dragBadge: _angular_core.Signal<string>;
8645
10115
  /** The part selected for THIS chart, or null. */
@@ -8656,7 +10126,7 @@ declare class ChartElementViewComponent {
8656
10126
  protected onTitleKeydown(event: KeyboardEvent): void;
8657
10127
  protected commitTitle(): void;
8658
10128
  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>;
10129
+ 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
10130
  }
8661
10131
 
8662
10132
  /**
@@ -8818,6 +10288,14 @@ declare class SmartArtRendererComponent {
8818
10288
  * `editable` input). Double-clicking a node only enters edit mode when true.
8819
10289
  */
8820
10290
  readonly editable: _angular_core.InputSignal<boolean>;
10291
+ /**
10292
+ * Native-animation playback state. A staged diagram build
10293
+ * (`build.kind === 'diagram'`) reveals the leading nodes / drawing shapes for
10294
+ * the current progress; absent or non-diagram state renders every node. The
10295
+ * view box is still computed from the FULL shape set so the diagram does not
10296
+ * rescale as it builds. Mirrors the Vue `SmartArtRenderer`'s reveal slice.
10297
+ */
10298
+ readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
8821
10299
  /**
8822
10300
  * The editor state layer. Optional: the renderer is also used outside the
8823
10301
  * editing viewer (thumbnails, export), where this service is not provided.
@@ -8860,6 +10338,13 @@ declare class SmartArtRendererComponent {
8860
10338
  readonly shadowFilter: _angular_core.Signal<string | undefined>;
8861
10339
  private readonly rawDrawingShapes;
8862
10340
  readonly hasDrawingShapes: _angular_core.Signal<boolean>;
10341
+ private readonly diagramBuild;
10342
+ private readonly shownNodeCount;
10343
+ private readonly isPartialBuild;
10344
+ /** Leading node prefix revealed so far (full list when no partial build). */
10345
+ private readonly revealedNodes;
10346
+ /** Leading drawing-shape prefix revealed so far (proportional to nodes). */
10347
+ private readonly revealedShapeList;
8863
10348
  private readonly viewBox;
8864
10349
  /** `viewBox` attribute string for the drawing-shapes `<svg>`. */
8865
10350
  readonly svgViewBox: _angular_core.Signal<string>;
@@ -8934,7 +10419,7 @@ declare class SmartArtRendererComponent {
8934
10419
  private reflow;
8935
10420
  readonly isEmpty: _angular_core.Signal<boolean>;
8936
10421
  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>;
10422
+ 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
10423
  }
8939
10424
 
8940
10425
  /**
@@ -9384,74 +10869,50 @@ declare class ZoomRendererComponent {
9384
10869
 
9385
10870
  declare class AnimationPlaybackService {
9386
10871
  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;
10872
+ /** Per-element native-animation state, keyed by element id. */
10873
+ readonly presentationElementStates: _angular_core.WritableSignal<Map<string, ElementAnimationState>>;
10874
+ /** The `@keyframes` CSS to inject once per slide. */
10875
+ readonly keyframesCss: _angular_core.WritableSignal<string>;
10876
+ /** Shape ids that trigger an interactive (`onShapeClick`) sequence. */
10877
+ readonly interactiveTriggerShapeIds: _angular_core.WritableSignal<ReadonlySet<string>>;
10878
+ /** Shape ids that trigger a hover (`onHover`) sequence. */
10879
+ readonly hoverTriggerShapeIds: _angular_core.WritableSignal<ReadonlySet<string>>;
10880
+ /** True when the main timeline has no more click-groups to reveal. */
10881
+ readonly isComplete: _angular_core.WritableSignal<boolean>;
10882
+ private controller;
10883
+ private readonly timers;
10884
+ private readonly buildHandle;
10885
+ private showWithAnimation;
10886
+ private frameRoot;
10887
+ private onPlayActionSound;
10888
+ private readonly ctx;
9426
10889
  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;
10890
+ /** Scope media-command (`p:cmd`) target lookups to a stage root element. */
10891
+ setFrameRoot(root: () => HTMLElement | null): void;
10892
+ /** Register a host-provided action-sound player (embedded-sound resolution). */
10893
+ setActionSoundHandler(handler: ((soundPath: string) => void) | undefined): void;
10894
+ private animationsEnabled;
10895
+ /** Clear all pending timers + the in-flight staged-build RAF. */
10896
+ clearTimers(): void;
10897
+ private syncComplete;
9441
10898
  /**
9442
- * Jump directly to a given step (clamped to the group count) and take manual
9443
- * control. Useful for scrubbing.
10899
+ * Rebuild the controller for `slide` and seed the initial element state
10900
+ * (entrance-animated elements start hidden). Auto-plays the first click-group
10901
+ * when the slide opens with a withPrevious / afterPrevious / afterDelay build.
9444
10902
  */
9445
- setStep(step: number): void;
10903
+ setSlide(slide: PptxSlide | undefined, showWithAnimation?: boolean): void;
9446
10904
  /**
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).
10905
+ * Reveal the next click-group. Returns `true` if a group was revealed, `false`
10906
+ * when playback is complete or animations are disabled (so the caller can fall
10907
+ * through to slide navigation).
9451
10908
  */
9452
- autoPlay(): void;
9453
- /** Cancel any in-flight rAF auto-advance. */
9454
- cancelAutoPlay(): void;
10909
+ advance(): boolean;
10910
+ /** Play an interactive shape's sequence; `true` when it triggered one. */
10911
+ handleInteractiveShapeClick(shapeId: string): boolean;
10912
+ /** Play a hover shape's sequence; `true` when it triggered one. */
10913
+ handleHoverStart(shapeId: string): boolean;
10914
+ /** Reset a hover shape's sequence so the next hover replays it. */
10915
+ handleHoverEnd(shapeId: string): void;
9455
10916
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AnimationPlaybackService, never>;
9456
10917
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AnimationPlaybackService>;
9457
10918
  }
@@ -9682,13 +11143,34 @@ declare class PresentationOverlayComponent implements OnInit {
9682
11143
  * both fire for one tap.
9683
11144
  */
9684
11145
  private closing;
11146
+ /**
11147
+ * Managed per-slide keyframes `<style>` element (colour animations + staged
11148
+ * text builds). The static preset keyframe library is injected once per
11149
+ * document by {@link ensurePresetAnimationKeyframes}.
11150
+ */
11151
+ private readonly slideKeyframes;
11152
+ /** The hover-trigger shape the pointer is currently over (fires a sequence once). */
11153
+ private currentHoverTriggerId;
9685
11154
  constructor();
9686
11155
  /**
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.
11156
+ * Imperatively apply each tracked element's native-animation state to its DOM
11157
+ * wrapper: visibility (entrance hide-until-revealed / exit), the CSS-animation
11158
+ * shorthand (entrance / emphasis / exit / colour keyframes), and a pointer
11159
+ * cursor on interactive / hover trigger shapes. Mirrors the Vue
11160
+ * `applyAnimationStyles`; every renderer emits a `data-element-id`, so this
11161
+ * needs no per-element renderer plumbing.
9690
11162
  */
9691
11163
  private applyAnimationStyles;
11164
+ /** Resolve the nearest element id above a pointer target, if any. */
11165
+ private closestElementId;
11166
+ /**
11167
+ * Pointer moved over the stage: (re)play a hover-trigger shape's sequence once
11168
+ * on entering it (not on every descendant transition that `mouseover` bubbles
11169
+ * up), resetting the previous trigger on leaving it.
11170
+ */
11171
+ protected onStageHover(event: MouseEvent): void;
11172
+ /** Pointer left the stage subtree entirely: reset any active hover trigger. */
11173
+ protected onStageHoverEnd(event: MouseEvent): void;
9692
11174
  /** Viewport dimensions, updated on resize. */
9693
11175
  private readonly viewportW;
9694
11176
  private readonly viewportH;
@@ -10045,9 +11527,12 @@ declare class PresentationSettingsCardComponent {
10045
11527
  private readonly loader;
10046
11528
  private readonly editor;
10047
11529
  protected readonly props: _angular_core.WritableSignal<PptxPresentationProperties>;
11530
+ protected readonly frameSlides: _angular_core.Signal<boolean>;
11531
+ protected readonly slidesPerPage: _angular_core.Signal<number>;
10048
11532
  private patch;
10049
11533
  protected onShowTypeChange(event: Event): void;
10050
- protected onCheckbox(event: Event, key: 'loopContinuously' | 'showWithNarration' | 'showWithAnimation' | 'printFrameSlides'): void;
11534
+ protected onCheckbox(event: Event, key: 'loopContinuously' | 'showWithNarration' | 'showWithAnimation'): void;
11535
+ protected onFrameSlidesChange(event: Event): void;
10051
11536
  protected onSlidesPerPageChange(event: Event): void;
10052
11537
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PresentationSettingsCardComponent, never>;
10053
11538
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationSettingsCardComponent, "pptx-presentation-settings-card", never, { "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -10184,7 +11669,7 @@ declare class TextAdvancedPanelComponent {
10184
11669
  /** Exposed option arrays for the template. */
10185
11670
  protected readonly alignOptions: [NonNullable<"center" | "left" | "right" | "justify" | "justLow" | "dist" | "thaiDist" | undefined>, string][];
10186
11671
  protected readonly vAlignOptions: [NonNullable<"top" | "bottom" | "middle" | undefined>, string][];
10187
- protected readonly textDirectionOptions: [NonNullable<"eaVert" | "wordArtVert" | "wordArtVertRtl" | "mongolianVert" | "horizontal" | "vertical" | "vertical270" | undefined>, string][];
11672
+ protected readonly textDirectionOptions: [NonNullable<"vertical" | "horizontal" | "eaVert" | "wordArtVert" | "wordArtVertRtl" | "mongolianVert" | "vertical270" | undefined>, string][];
10188
11673
  protected alignLabel(align: NonNullable<TextStyle['align']>): string;
10189
11674
  protected onAlignChange(align: NonNullable<TextStyle['align']>): void;
10190
11675
  protected onVAlignChange(event: Event): void;
@@ -10926,21 +12411,29 @@ declare class MobileToolbarComponent {
10926
12411
  readonly canEdit: _angular_core.InputSignal<boolean>;
10927
12412
  /** Whether the mobile-menu sheet is currently open (highlights the button). */
10928
12413
  readonly menuOpen: _angular_core.InputSignal<boolean>;
12414
+ /** Whether the host opted into the AI assistant (shows the top-right toggle). */
12415
+ readonly aiEnabled: _angular_core.InputSignal<boolean>;
12416
+ /** Whether the AI assistant panel is currently open (highlights the button). */
12417
+ readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
10929
12418
  /** Toolbar buttons the host wants hidden (gates Undo/Redo independently). */
10930
12419
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
10931
12420
  /** User tapped the Menu (hamburger) button. */
10932
12421
  readonly toggleMenu: _angular_core.OutputEmitterRef<void>;
12422
+ /** User tapped the AI assistant toggle. */
12423
+ readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
10933
12424
  /** User tapped Undo. */
10934
12425
  readonly undo: _angular_core.OutputEmitterRef<void>;
10935
12426
  /** User tapped Redo. */
10936
12427
  readonly redo: _angular_core.OutputEmitterRef<void>;
12428
+ /** User tapped Share (opens the collaboration share dialog). */
12429
+ readonly share: _angular_core.OutputEmitterRef<void>;
10937
12430
  /** User tapped Save (download as .pptx). */
10938
12431
  readonly save: _angular_core.OutputEmitterRef<void>;
10939
12432
  /** User tapped Present. */
10940
12433
  readonly present: _angular_core.OutputEmitterRef<void>;
10941
12434
  protected readonly toolbar: ToolbarVisibility;
10942
12435
  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>;
12436
+ 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"; "share": "share"; "save": "save"; "present": "present"; }, never, never, true, never>;
10944
12437
  }
10945
12438
 
10946
12439
  declare class NotesPanelComponent {
@@ -11109,7 +12602,7 @@ declare class StatusBarComponent {
11109
12602
  /** Relative age label for a saved timestamp ("just now" / "N min ago"). */
11110
12603
  private formatAutosaveAge;
11111
12604
  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>;
12605
+ 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
12606
  }
11114
12607
 
11115
12608
  declare class EditorContextMenuComponent {
@@ -11119,8 +12612,17 @@ declare class EditorContextMenuComponent {
11119
12612
  readonly y: _angular_core.InputSignal<number>;
11120
12613
  /** Zero-based index of the slide being edited. */
11121
12614
  readonly slideIndex: _angular_core.InputSignal<number>;
12615
+ /**
12616
+ * Whether to show the "Ask AI about this" / "Fix with AI" items. Gated by the
12617
+ * host on the `ai` config + a single selected element.
12618
+ */
12619
+ readonly showAiActions: _angular_core.InputSignal<boolean>;
11122
12620
  /** Emitted when the menu should close (Escape or outside click). */
11123
12621
  readonly closed: _angular_core.OutputEmitterRef<void>;
12622
+ /** "Ask AI about this": open the assistant scoped to the selection. */
12623
+ readonly askAi: _angular_core.OutputEmitterRef<void>;
12624
+ /** "Fix with AI": open the assistant with a prefilled fix directive. */
12625
+ readonly fixAi: _angular_core.OutputEmitterRef<void>;
11124
12626
  protected readonly editor: EditorStateService;
11125
12627
  private readonly tableSelection;
11126
12628
  private readonly host;
@@ -11135,6 +12637,8 @@ declare class EditorContextMenuComponent {
11135
12637
  } | null>;
11136
12638
  onEscape(): void;
11137
12639
  onDocumentPointerDown(event: PointerEvent): void;
12640
+ protected onAskAi(): void;
12641
+ protected onFixAi(): void;
11138
12642
  protected onCut(): void;
11139
12643
  protected onCopy(): void;
11140
12644
  protected onPaste(): void;
@@ -11160,7 +12664,7 @@ declare class EditorContextMenuComponent {
11160
12664
  */
11161
12665
  private applyTable;
11162
12666
  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>;
12667
+ 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
12668
  }
11165
12669
 
11166
12670
  /**
@@ -11823,35 +13327,20 @@ declare class PropertiesDialogComponent {
11823
13327
  }
11824
13328
 
11825
13329
  /**
11826
- * share-helpers.ts: Pure (no Angular) helpers for the Share dialog.
13330
+ * share-helpers.ts: Share dialog helpers for the Angular viewer.
11827
13331
  *
11828
- * Mirrors the form-validation / config-assembly logic of the Vue
11829
- * `ShareDialog.vue` plus the share-link builder from the React `ShareDialog`.
13332
+ * The shared subset (ShareFormFields / ShareDefaults / seedShareFields /
13333
+ * canStartShare) is re-exported from `pptx-viewer-shared` (`render/share-form`).
13334
+ * Two helpers stay local because they diverge from the shared builders:
13335
+ * - `buildCollaborationConfig` validates with `canStartShare` (non-blank room)
13336
+ * and emits a config WITHOUT `role`/`sessionIntent`, unlike the shared
13337
+ * `buildShareConfig` (which is `buildCreateCollaborationConfig`).
13338
+ * - `buildShareUrl` is Angular-only (no other binding builds a share link).
11830
13339
  *
11831
13340
  * No `any`; all regexes use the `/u` flag; no `String.prototype.replaceAll`,
11832
13341
  * no regex named-capture-groups (ng-packagr lib-target constraints).
11833
13342
  */
11834
13343
 
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
13344
  /**
11856
13345
  * Assemble a {@link CollaborationConfig} from the (trimmed) form fields, or
11857
13346
  * `null` when the form is incomplete. A blank server URL yields
@@ -11871,7 +13360,7 @@ declare class ShareDialogComponent {
11871
13360
  /** Whether the dialog is visible. */
11872
13361
  readonly open: _angular_core.InputSignal<boolean>;
11873
13362
  /** Prefilled values for the form fields. */
11874
- readonly defaults: _angular_core.InputSignal<ShareDefaults | undefined>;
13363
+ readonly defaults: _angular_core.InputSignal<ShareDefaults$1 | undefined>;
11875
13364
  /** Whether a collaboration session is currently active (provider constructed). */
11876
13365
  readonly active: _angular_core.InputSignal<boolean>;
11877
13366
  /** Whether the websocket has reported a `connected` status. */
@@ -11987,6 +13476,8 @@ declare class ViewerExtraDialogsComponent {
11987
13476
  readonly availableThemes: _angular_core.InputSignal<readonly ThemeCatalogEntry[]>;
11988
13477
  readonly localeCode: _angular_core.InputSignal<string>;
11989
13478
  readonly availableLocales: _angular_core.InputSignal<readonly LocaleCatalogEntry[]>;
13479
+ /** Whether the Settings dialog shows the bespoke AI chat-log export category. */
13480
+ readonly aiExportVisible: _angular_core.InputSignal<boolean>;
11990
13481
  /** Fired with a restored `.pptx` version's bytes; the host swaps the deck. */
11991
13482
  readonly restoreContent: _angular_core.OutputEmitterRef<Uint8Array<ArrayBufferLike>>;
11992
13483
  readonly themeKeySelect: _angular_core.OutputEmitterRef<string>;
@@ -12028,7 +13519,7 @@ declare class ViewerExtraDialogsComponent {
12028
13519
  /** Clear any save password. */
12029
13520
  onRemovePassword(): void;
12030
13521
  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>;
13522
+ 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
13523
  }
12033
13524
 
12034
13525
  declare class EquationEditorDialogComponent {
@@ -12433,6 +13924,11 @@ declare class SettingsDialogComponent {
12433
13924
  readonly availableLocales: _angular_core.InputSignal<readonly LocaleCatalogEntry[]>;
12434
13925
  /** Availability flags for the Add-ins pane (unset ids default to active). */
12435
13926
  readonly addinStatus: _angular_core.InputSignal<ViewerAddinStatus | undefined>;
13927
+ /**
13928
+ * Whether to show the bespoke "AI" category (chat-log export), gated by the
13929
+ * host on the `ai` config. Absent by default (no AI category).
13930
+ */
13931
+ readonly aiExportVisible: _angular_core.InputSignal<boolean>;
12436
13932
  readonly optionChange: _angular_core.OutputEmitterRef<OptionValueChange>;
12437
13933
  /** Restore a snapshot wholesale (Cancel semantics). */
12438
13934
  readonly restoreOptions: _angular_core.OutputEmitterRef<ViewerOptions>;
@@ -12445,7 +13941,8 @@ declare class SettingsDialogComponent {
12445
13941
  readonly localeSelect: _angular_core.OutputEmitterRef<string>;
12446
13942
  readonly close: _angular_core.OutputEmitterRef<void>;
12447
13943
  protected readonly tabs: readonly ViewerOptionsTabDefinition[];
12448
- protected readonly activeTabId: _angular_core.WritableSignal<ViewerOptionsTabId>;
13944
+ /** Active category id, or the bespoke `'ai'` sentinel for the AI export pane. */
13945
+ protected readonly activeTabId: _angular_core.WritableSignal<ViewerOptionsTabId | "ai">;
12449
13946
  protected readonly activeTab: _angular_core.Signal<ViewerOptionsTabDefinition>;
12450
13947
  /** Snapshot taken when the dialog opens, restored by Cancel. */
12451
13948
  private snapshot;
@@ -12456,7 +13953,7 @@ declare class SettingsDialogComponent {
12456
13953
  /** Escape confirms (keeps edits), mirroring React's dialog. */
12457
13954
  protected onEscape(): void;
12458
13955
  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>;
13956
+ 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
13957
  }
12461
13958
 
12462
13959
  declare class SettingsAppearanceTabComponent {
@@ -12481,7 +13978,7 @@ declare class AccountPageComponent {
12481
13978
  readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
12482
13979
  private readonly translate;
12483
13980
  protected readonly swatches: readonly string[];
12484
- protected readonly version = "1.31.4";
13981
+ protected readonly version = "2.0.0";
12485
13982
  protected readonly profile: _angular_core.WritableSignal<ViewerProfile>;
12486
13983
  protected readonly initial: _angular_core.Signal<string>;
12487
13984
  protected readonly usage: _angular_core.WritableSignal<LocalStorageUsageSummary | null>;
@@ -12999,38 +14496,6 @@ interface PresenterNotes {
12999
14496
  */
13000
14497
  declare function resolvePresenterNotes(slide: PptxSlide | undefined): PresenterNotes;
13001
14498
 
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
14499
  /**
13035
14500
  * SVG path generators for WordArt text warp presets.
13036
14501
  *
@@ -14214,7 +15679,13 @@ declare class RibbonPrimaryRowComponent {
14214
15679
  readonly commentCount: _angular_core.InputSignal<number>;
14215
15680
  /** Toolbar buttons the host wants hidden (gates Broadcast + the export overflow items). */
14216
15681
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
15682
+ /** Whether the host enabled the AI assistant (shows the Sparkles toggle). */
15683
+ readonly aiEnabled: _angular_core.InputSignal<boolean>;
15684
+ /** Whether the AI assistant panel is currently open (toggle active state). */
15685
+ readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
14217
15686
  readonly toggleSidebar: _angular_core.OutputEmitterRef<void>;
15687
+ /** Emitted when the user clicks the AI assistant Sparkles toggle. */
15688
+ readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
14218
15689
  readonly toggleComments: _angular_core.OutputEmitterRef<void>;
14219
15690
  readonly present: _angular_core.OutputEmitterRef<void>;
14220
15691
  readonly presenter: _angular_core.OutputEmitterRef<void>;
@@ -14247,7 +15718,7 @@ declare class RibbonPrimaryRowComponent {
14247
15718
  protected onDocumentPointerDown(event: PointerEvent): void;
14248
15719
  protected onOverflow(key: string): void;
14249
15720
  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>;
15721
+ 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
15722
  }
14252
15723
 
14253
15724
  declare class RibbonReviewSectionComponent {
@@ -14754,50 +16225,6 @@ declare class ColorChangedImageComponent {
14754
16225
  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
16226
  }
14756
16227
 
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
16228
  declare class CustomShowsComponent {
14802
16229
  private readonly translate;
14803
16230
  /** Whether the dialog is open. */
@@ -15008,31 +16435,6 @@ declare class ThemeGalleryComponent {
15008
16435
  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
16436
  }
15010
16437
 
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
16438
  declare class TitleBarComponent {
15037
16439
  /** Whether the deck is editable (gates the autosave/quick-access/search chrome). */
15038
16440
  readonly canEdit: _angular_core.InputSignal<boolean>;
@@ -15226,5 +16628,5 @@ declare const SEQUENCE_OPTIONS: ReadonlyArray<{
15226
16628
  labelKey: string;
15227
16629
  }>;
15228
16630
 
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 };
16631
+ 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 };
16632
+ 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 };