pptx-angular-viewer 1.31.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,10 @@
1
1
  import * as pptx_viewer_core from 'pptx-viewer-core';
2
- import { PptxSlide, PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxChartSeries, PptxChartData, PptxElementAnimation, PptxAnimationPreset, PptxAnimationDirection, PptxAnimationRepeatMode, PptxAnimationSequence, PptxAnimationTimingCurve, PptxAnimationTrigger, TablePptxElement, PptxSection, OlePptxElement, TextSegment, TextStyle, PptxTransitionType, SmartArtColorScheme, PptxSmartArtChrome, PptxSmartArtDrawingShape, SmartArtStyle, PptxSmartArtData, PptxEmbeddedFont, SmartArtLayout, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, InkPptxElement, PptxComment, PptxChartType, PptxHeaderFooter, PptxTheme, PptxSlideMaster, PptxNotesMaster, PptxHandoutMaster, PptxPresentationProperties, PptxCoreProperties, PptxAppProperties, PptxThemeOption, PptxCustomProperty, ParsedSignature, PptxSaveFormat, PptxTableCell, PptxTableCellStyle, PptxTableRow, PptxTableData, PptxCustomShow, PptxThemePreset, PptxThemeColorScheme, PptxThemeFontScheme, MasterViewTab, SvgExportOptions, PptxData, Model3DPptxElement, ZoomPptxElement, PptxSlideTransition, ChartPptxElement, MediaPptxElement, SmartArtPptxElement, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, SignatureStatus, ElementActionType, ElementAction, PptxImageEffects, MediaBookmark, ColorMapAliasKey, ChartAxisEdit, ChartDataPointLabelEdit, PptxChartLegendPosition, PptxChartStyle, ChartAxisTitleStyleEdit, ChartGridlineStyleEdit, PptxChartMarkerSymbol, PptxSmartArtNode, SmartArtLayoutType, PptxSmartArtNodeStyle, MediaCaptionTrack, PptxMediaType } from 'pptx-viewer-core';
2
+ import { PptxThemePreset, PptxSlide, PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxChartSeries, PptxChartData, PptxElementAnimation, PptxAnimationPreset, PptxAnimationDirection, PptxAnimationRepeatMode, PptxAnimationSequence, PptxAnimationTimingCurve, PptxAnimationTrigger, ParsedTableStyleMap, PptxThemeColorScheme, PptxThemeFontScheme, TablePptxElement, PptxSection, OlePptxElement, TextSegment, TextStyle, PptxTransitionType, SmartArtColorScheme, PptxSmartArtChrome, PptxSmartArtDrawingShape, SmartArtStyle, PptxSmartArtData, PptxEmbeddedFont, SmartArtLayout, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, InkPptxElement, PptxComment, PptxChartType, PptxTheme, PptxHandler, PptxData, PptxHeaderFooter, PptxSlideMaster, PptxNotesMaster, PptxHandoutMaster, PptxPresentationProperties, PptxCoreProperties, PptxAppProperties, PptxThemeOption, PptxCustomProperty, ParsedSignature, PptxSaveFormat, PptxTableCell, PptxTableCellStyle, PptxTableRow, PptxTableData, PptxCustomShow, MasterViewTab, SvgExportOptions, Model3DPptxElement, ZoomPptxElement, PptxSlideTransition, ChartPptxElement, MediaPptxElement, SmartArtPptxElement, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, SignatureStatus, ElementActionType, ElementAction, PptxImageEffects, MediaBookmark, ColorMapAliasKey, ChartAxisEdit, ChartDataPointLabelEdit, PptxChartLegendPosition, PptxChartStyle, ChartAxisTitleStyleEdit, ChartGridlineStyleEdit, PptxChartMarkerSymbol, PptxSmartArtNode, SmartArtLayoutType, PptxSmartArtNodeStyle, MediaCaptionTrack, PptxMediaType } from 'pptx-viewer-core';
3
3
  export { SWITCHABLE_LAYOUT_TYPES, addSmartArtNode, addSmartArtNodeAsChild, chartDataAddCategory, chartDataAddSeries, chartDataChangeType, chartDataRemoveCategory, chartDataRemoveSeries, chartDataUpdatePoint, demoteSmartArtNode, promoteSmartArtNode, removeSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, updateSmartArtNodeText } from 'pptx-viewer-core';
4
4
  import * as _angular_core from '@angular/core';
5
5
  import { Signal, WritableSignal, OnDestroy, OnInit, OnChanges, SimpleChanges, InjectionToken, Provider } from '@angular/core';
6
+ import * as AiSdk from 'ai';
7
+ import { LanguageModel, ChatTransport, UIMessage, ToolSet } from 'ai';
6
8
  import * as pptx_angular_viewer from 'pptx-angular-viewer';
7
9
  import { TranslateService } from '@ngx-translate/core';
8
10
  import { Options } from 'html2canvas-pro';
@@ -152,6 +154,29 @@ declare const THEME_CATALOG: readonly ThemeCatalogEntry[];
152
154
  /** Look up a catalog entry by key, falling back to `undefined` (the built-in default) if not found. */
153
155
  declare function resolveThemeCatalogEntry(key: string | undefined, catalog?: readonly ThemeCatalogEntry[]): ViewerTheme | undefined;
154
156
 
157
+ /**
158
+ * theme-gallery-presets: the exact theme set shown in the Design tab's Browse
159
+ * Themes gallery, shared by every binding.
160
+ *
161
+ * This is a DIFFERENT set from core's `THEME_PRESETS`: it adds Wisp, Berlin,
162
+ * Slice, and Dividend and omits Slate and Metropolitan, in this order:
163
+ *
164
+ * office, facet, integral, ion, retrospect, organic,
165
+ * wisp, berlin, slice, dividend
166
+ *
167
+ * The six themes that also exist in core (office, facet, integral, ion,
168
+ * organic, retrospect) are reused verbatim from core's `THEME_PRESETS` (looked
169
+ * up by id) so their colour/font schemes stay canonical. The four gallery-only
170
+ * themes are defined here as `PptxThemePreset` values with core's nested
171
+ * `{ majorFont: { latin }, minorFont: { latin } }` font-scheme shape.
172
+ */
173
+
174
+ /**
175
+ * The gallery theme set, in canonical order. Six canonical core presets plus
176
+ * the four gallery-only additions.
177
+ */
178
+ declare const GALLERY_THEME_PRESETS: readonly PptxThemePreset[];
179
+
155
180
  /**
156
181
  * Framework-agnostic public types shared by the viewer bindings.
157
182
  *
@@ -421,6 +446,24 @@ declare function getResolvedShapeClipPath(element: PptxElement, width?: number,
421
446
  * (ST_PresetPatternVal).
422
447
  */
423
448
 
449
+ /**
450
+ * Optional geometry context for {@link buildGradientCss}. Supplying it lets the
451
+ * resolver apply the two OOXML linear-gradient attributes that depend on the
452
+ * owning shape:
453
+ * - `a:lin/@scaled` (default true): the angle is measured in the shape's unit
454
+ * square then stretched to the box, so the visual angle depends on the
455
+ * width/height aspect ratio.
456
+ * - `a:gradFill/@rotWithShape=false`: the gradient must stay fixed to the page
457
+ * frame, so it is counter-rotated by the element's own rotation.
458
+ */
459
+ interface GradientRenderContext {
460
+ /** Element rotation in degrees (`PptxElementBase.rotation`). */
461
+ rotation?: number;
462
+ /** Element width in px. */
463
+ width?: number;
464
+ /** Element height in px. */
465
+ height?: number;
466
+ }
424
467
  /**
425
468
  * Converts a structured OOXML gradient on a `ShapeStyle` to a CSS
426
469
  * `linear-gradient(...)` / `radial-gradient(...)` string.
@@ -435,9 +478,11 @@ declare function getResolvedShapeClipPath(element: PptxElement, width?: number,
435
478
  * a radial), matching the React port.
436
479
  *
437
480
  * @param gradient - The shape style carrying gradient configuration.
481
+ * @param context - Optional element geometry enabling `@scaled` /
482
+ * `@rotWithShape` angle corrections (linear only).
438
483
  * @returns A CSS gradient string, or `undefined`.
439
484
  */
440
- declare function buildGradientCss(gradient: ShapeStyle | undefined): string | undefined;
485
+ declare function buildGradientCss(gradient: ShapeStyle | undefined, context?: GradientRenderContext): string | undefined;
441
486
  /**
442
487
  * Alias of {@link buildGradientCss} preserved for the per-binding gradient
443
488
  * modules (React/Angular `color-gradient.ts`) whose public symbol was named
@@ -512,6 +557,20 @@ interface LineShadowParams {
512
557
  color: string;
513
558
  opacity: number;
514
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
+ }
515
574
 
516
575
  /**
517
576
  * Text warp / WordArt logic — Vue port of the React
@@ -913,6 +972,13 @@ interface ChartViewModel {
913
972
  * hierarchical kinds, where a vertical drag has no single-value meaning.
914
973
  */
915
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[];
916
982
  }
917
983
  declare function buildGridlinesAndLabels(range: ValueRange, layout: PlotLayout): {
918
984
  gridlines: SvgLine[];
@@ -959,7 +1025,14 @@ declare function computePieLayout(elementWidth: number, elementHeight: number, c
959
1025
  innerR: number;
960
1026
  size: number;
961
1027
  };
962
- declare function computePieSlices(values: ReadonlyArray<number>, cx: number, cy: number, outerR: number, innerR: number): PieSliceGeometry[];
1028
+ /** Options for {@link computePieSlices}: start-angle rotation and per-slice explosion. */
1029
+ interface PieSliceOptions {
1030
+ /** Absolute start angle (radians). Defaults to -PI/2 (12 o'clock). */
1031
+ startAngle?: number;
1032
+ /** Per-slice pull-out distance as a percentage of the outer radius (0-100). */
1033
+ explosions?: ReadonlyArray<number>;
1034
+ }
1035
+ declare function computePieSlices(values: ReadonlyArray<number>, cx: number, cy: number, outerR: number, innerR: number, options?: PieSliceOptions): PieSliceGeometry[];
963
1036
  interface ScatterDot {
964
1037
  cx: number;
965
1038
  cy: number;
@@ -1432,6 +1505,83 @@ declare function revealedElementStyles(groups: readonly AnimationClickGroup[], s
1432
1505
  */
1433
1506
  declare function pendingElementStyles(groups: readonly AnimationClickGroup[], step: number): Map<string, CSSProperties>;
1434
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
+
1435
1585
  /**
1436
1586
  * table-style.ts — framework-agnostic table render helpers.
1437
1587
  *
@@ -1454,6 +1604,25 @@ declare function pendingElementStyles(groups: readonly AnimationClickGroup[], st
1454
1604
  * passed to {@link getTableCellBandStyle}.
1455
1605
  */
1456
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
+ }
1457
1626
  /** Map an OOXML `a:prstDash/@val` value to a CSS `border-style` keyword. */
1458
1627
  declare function ooxmlDashToCssBorderStyle(dashVal: string | undefined): string;
1459
1628
  /**
@@ -2463,6 +2632,14 @@ interface ConnectorRouting {
2463
2632
  interface MarkerShape {
2464
2633
  shape: 'path' | 'circle';
2465
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;
2466
2643
  }
2467
2644
  /** All derived connector rendering values, computed from a `PptxElement`. */
2468
2645
  interface ConnectorGeometry {
@@ -2825,9 +3002,19 @@ interface SlideTransitionAnimations {
2825
3002
  * same string — the bindings historically exported it under both names, so the
2826
3003
  * alias preserves their public surface.
2827
3004
  *
3005
+ * The faithful Office 2010 (`p14`) keyframes are appended (via
3006
+ * {@link P14_TRANSITION_KEYFRAMES_ALL}) so the exotic / 3-D transitions routed
3007
+ * through `getP14TransitionAnimations` animate wherever this block is injected,
3008
+ * with no per-binding wiring.
3009
+ *
2828
3010
  * @module render/slide-transition-keyframes
2829
3011
  */
2830
- 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";
3012
+ /**
3013
+ * The full slide-transition `@keyframes` block: the classic set plus the
3014
+ * faithful Office 2010 (`p14`) keyframes, so both the classic and exotic / 3-D
3015
+ * transitions animate wherever this single string is injected.
3016
+ */
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";
2831
3018
 
2832
3019
  /**
2833
3020
  * `slide-transition-css` — pure mapping from a {@link PptxSlideTransition}
@@ -2847,11 +3034,16 @@ declare const SLIDE_TRANSITION_KEYFRAMES = "\n/* \u2500\u2500 Fade \u2500\u2500\
2847
3034
  *
2848
3035
  * Superset note: the exotic / 3-D transition family (`pan`/`gallery`/
2849
3036
  * `conveyor`/`reveal`/`doors`/`switch`/`flythrough`/`ferris`/`prism`/`ripple`/
2850
- * `honeycomb`/`glitter`/`shred`/`flash`) is approximated with the closest
2851
- * well-tested 2-D case (originally an Angular-only refinement) rather than a
2852
- * plain fade. Truly-unknown types still fall back to a symmetrical cross-fade.
2853
- * A more faithful per-effect p14 keyframe set is available separately via
2854
- * `p14-transition-keyframes` + {@link getP14TransitionAnimations}.
3037
+ * `honeycomb`/`glitter`/`shred`/`flash`/`vortex`/`warp`/`wheelReverse`/`window`)
3038
+ * is rendered faithfully by delegating to {@link getP14TransitionAnimations}
3039
+ * (its `@keyframes` live in `p14-transition-keyframes` and are folded into
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.
2855
3047
  *
2856
3048
  * Everything here is pure and unit-testable: no framework imports, no DOM.
2857
3049
  *
@@ -3424,6 +3616,35 @@ declare function buildBroadcastViewerUrl(roomId: string, serverUrl: string, loca
3424
3616
  /** Whether the runtime exposes a usable async clipboard write API. */
3425
3617
  declare function canUseClipboard(nav: Navigator | undefined): boolean;
3426
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
+
3427
3648
  /**
3428
3649
  * presenter-view.ts: pure presenter-view helpers shared across bindings.
3429
3650
  *
@@ -3475,6 +3696,82 @@ interface PresentationInkStroke {
3475
3696
  points: PresentationInkPoint[];
3476
3697
  }
3477
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
+
3478
3775
  /**
3479
3776
  * smart-art-presets.ts: the SmartArt insert-gallery catalogue, shared across
3480
3777
  * bindings. Pure data + types; consumed by each binding's insert dialog and
@@ -4655,6 +4952,466 @@ declare function segmentFrameCount(durationMs: number, fps: number): number;
4655
4952
  /** DOM id of the managed `<style>` element the service injects into `<head>`. */
4656
4953
  declare const EMBEDDED_FONTS_STYLE_ID = "pptx-angular-embedded-fonts";
4657
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
+
4658
5415
  /**
4659
5416
  * The canonical English UI-string dictionary for pptx-viewer. None of the
4660
5417
  * React/Vue/Angular binding packages ship translations themselves - each
@@ -4721,6 +5478,157 @@ declare class AccessibilityService {
4721
5478
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AccessibilityService>;
4722
5479
  }
4723
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
+
4724
5632
  /** Lifecycle status of the autosave engine (mirrors React's `AutosaveStatus`). */
4725
5633
  type AutosaveStatus = {
4726
5634
  state: 'idle';
@@ -5259,6 +6167,8 @@ declare class LoadContentService {
5259
6167
  readonly theme: _angular_core.WritableSignal<PptxTheme | undefined>;
5260
6168
  /** Resolved colour map for the presentation theme (scheme key → hex). */
5261
6169
  readonly themeColorMap: _angular_core.WritableSignal<Record<string, string> | undefined>;
6170
+ /** Parsed table-style definitions from `ppt/tableStyles.xml` (banding/diagonals). */
6171
+ readonly tableStyleMap: _angular_core.WritableSignal<ParsedTableStyleMap | undefined>;
5262
6172
  /** Slide masters (for placeholder/background resolution). */
5263
6173
  readonly slideMasters: _angular_core.WritableSignal<PptxSlideMaster[]>;
5264
6174
  /** Notes master, including its editable element tree. */
@@ -5305,6 +6215,12 @@ declare class LoadContentService {
5305
6215
  constructor();
5306
6216
  /** Serialise the current (loaded) presentation back to `.pptx` bytes. */
5307
6217
  getContent(): Promise<Uint8Array>;
6218
+ /**
6219
+ * The loaded presentation's core handler, or `undefined` before a deck is
6220
+ * loaded. Exposed for the AI bridge ({@link PptxAiBridge.getHandler}) so the
6221
+ * assistant can reach low-level core APIs when needed.
6222
+ */
6223
+ getHandler(): PptxHandler | undefined;
5308
6224
  /**
5309
6225
  * Serialise an explicit set of slides back to `.pptx` bytes (e.g. the
5310
6226
  * editor's edited deck) using the loaded presentation's handler.
@@ -5674,8 +6590,15 @@ declare function getContainerStyle(el: PptxElement, zIndex: number): StyleMap;
5674
6590
  /**
5675
6591
  * Fill / stroke / corner-radius for shape-like elements. Returns an empty
5676
6592
  * object when the element carries no shape styling.
6593
+ *
6594
+ * `animatesFill` / `animatesStroke` come from an active `p:animClr` colour
6595
+ * animation during presentation playback: when set, the static paint is dropped
6596
+ * so the wrapper's colour keyframes (applied as an `animation` on this same box)
6597
+ * own `background-color` / `border-color`. Mirrors the Vue port's
6598
+ * `getShapeFillStrokeStyle` and React's `getShapeVisualStyle`. Absent/false
6599
+ * keeps the static paint, so editor / read-only rendering is unaffected.
5677
6600
  */
5678
- declare function getShapeFillStrokeStyle(el: PptxElement): StyleMap;
6601
+ declare function getShapeFillStrokeStyle(el: PptxElement, parentGroupFill?: ShapeStyle, animatesFill?: boolean, animatesStroke?: boolean): StyleMap;
5679
6602
  /**
5680
6603
  * Text block style for elements that carry text. Mirrors the essentials of the
5681
6604
  * React `getTextStyleForElement`.
@@ -5782,8 +6705,14 @@ interface TableRowViewModel {
5782
6705
  * resolving spans, applying banding (lowest priority) beneath the explicit cell
5783
6706
  * style, and extracting diagonal-border info. Returns an empty array when
5784
6707
  * `tableData` is absent.
6708
+ *
6709
+ * `styleCtx` (parsed table-style map + theme colour/font scheme) is threaded
6710
+ * into both the banding resolver and the diagonal-border resolver so
6711
+ * table-style-inherited banding, fonts, and section diagonals apply; per-cell
6712
+ * explicit styles still win. When omitted, both fall back to the hardcoded
6713
+ * defaults (unchanged from before).
5785
6714
  */
5786
- declare function buildTableViewModel(el: PptxElement): TableRowViewModel[];
6715
+ declare function buildTableViewModel(el: PptxElement, styleCtx?: TableStyleContext): TableRowViewModel[];
5787
6716
  /** Compute `<col>` width styles from the column-widths array (0-1 fractions). */
5788
6717
  declare function buildColStyles(el: PptxElement): StyleMap[];
5789
6718
 
@@ -5812,6 +6741,13 @@ declare class TableRendererComponent {
5812
6741
  private readonly injector;
5813
6742
  /** Shared cell-selection state (present only inside the editor subtree). */
5814
6743
  private readonly selectionSvc;
6744
+ /**
6745
+ * Deck load state (present in the viewer subtree). Supplies the parsed
6746
+ * table-style map + theme colour/font scheme so table-style-inherited banding,
6747
+ * fonts, and section diagonals resolve. Absent (optional) in standalone
6748
+ * thumbnail/export renderers, where the hardcoded defaults are used.
6749
+ */
6750
+ private readonly loader;
5815
6751
  /** The table element to render. Must be `type === 'table'`. */
5816
6752
  readonly element: _angular_core.InputSignal<PptxElement>;
5817
6753
  /** Whether inline cell editing / selection / resize is enabled. */
@@ -5829,6 +6765,12 @@ declare class TableRendererComponent {
5829
6765
  private readonly cellInput;
5830
6766
  /** Pre-computed `<col>` styles for the colgroup. */
5831
6767
  readonly colStyles: _angular_core.Signal<StyleMap[]>;
6768
+ /**
6769
+ * Table-style context (parsed style map + theme colour/font scheme) from the
6770
+ * deck loader, or `undefined` outside the viewer subtree. `fontScheme` lets a
6771
+ * table style's `a:fontRef@idx` resolve to a concrete font family.
6772
+ */
6773
+ private readonly styleCtx;
5832
6774
  /** Projected view-model rows with merged-cell resolution + banding applied. */
5833
6775
  readonly rows: _angular_core.Signal<TableRowViewModel[]>;
5834
6776
  /** Column widths (0-1 fractions) for the resize overlay. */
@@ -5979,7 +6921,7 @@ declare class ViewerCollabCursorService {
5979
6921
  }
5980
6922
 
5981
6923
  /** Seed values for the Share dialog's start form. */
5982
- interface ShareDefaults$1 {
6924
+ interface ShareDefaults {
5983
6925
  roomId?: string;
5984
6926
  userName?: string;
5985
6927
  serverUrl?: string;
@@ -5987,7 +6929,7 @@ interface ShareDefaults$1 {
5987
6929
  /** Host accessors/emitters a service cannot own (inputs + outputs). */
5988
6930
  interface CollaborationSessionHost {
5989
6931
  readonly authorName: () => string | undefined;
5990
- readonly shareDefaults: () => ShareDefaults$1 | undefined;
6932
+ readonly shareDefaults: () => ShareDefaults | undefined;
5991
6933
  readonly getTemplateElements: () => TemplateElementsBySlideId;
5992
6934
  /** Apply a remote peer's slide set to the editable deck (echo-guarded in the service). */
5993
6935
  readonly applyRemoteSlides: (slides: PptxSlide[]) => void;
@@ -6043,7 +6985,7 @@ declare class ViewerCollaborationSessionService {
6043
6985
  * `userName` falling back to `authorName` (then "You") so the local user's
6044
6986
  * name pre-fills the form. Mirrors React/Vue.
6045
6987
  */
6046
- readonly shareDialogDefaults: _angular_core.Signal<ShareDefaults$1>;
6988
+ readonly shareDialogDefaults: _angular_core.Signal<ShareDefaults>;
6047
6989
  /**
6048
6990
  * Connect / disconnect real-time collaboration when the host `collaboration`
6049
6991
  * input changes (called from the component's effect).
@@ -6848,11 +7790,11 @@ declare class PowerPointViewerComponent {
6848
7790
  */
6849
7791
  readonly onOpenFile: _angular_core.InputSignal<(() => void) | undefined>;
6850
7792
  /**
6851
- * Opt in to the experimental Three.js SmartArt renderer. When `true`,
6852
- * SmartArt diagrams render as extruded 3D blocks on a WebGL canvas instead
6853
- * of flat SVG. Requires the optional `three` peer dependency; when it is not
6854
- * installed (or the diagram has no geometry), the viewer transparently falls
6855
- * back to the SVG SmartArt renderer. Default `false`.
7793
+ * Opt in to the Three.js SmartArt renderer. When `true`, SmartArt diagrams
7794
+ * render as extruded 3D blocks on a WebGL canvas instead of flat SVG.
7795
+ * Requires the optional `three` peer dependency; when it is not installed
7796
+ * (or the diagram has no geometry), the viewer transparently falls back to
7797
+ * the SVG SmartArt renderer. Default `false`.
6856
7798
  */
6857
7799
  readonly smartArt3D: _angular_core.InputSignal<boolean>;
6858
7800
  /**
@@ -6861,6 +7803,14 @@ declare class PowerPointViewerComponent {
6861
7803
  * ribbon tab id). Default `[]` hides nothing, matching prior behaviour.
6862
7804
  */
6863
7805
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
7806
+ /**
7807
+ * Optional AI assistant configuration. When set, a Sparkles toggle appears in
7808
+ * the ribbon and opens a right-rail chat pane wired to the open deck. The
7809
+ * `ai` SDK is an optional peer; when it is not installed the pane shows an
7810
+ * "unavailable" notice instead. Absent by default (no AI UI). Mirrors React's
7811
+ * `ai` prop.
7812
+ */
7813
+ readonly ai: _angular_core.InputSignal<PptxAiConfig | undefined>;
6864
7814
  /** Fired when the active slide changes. */
6865
7815
  readonly activeSlideChange: _angular_core.OutputEmitterRef<number>;
6866
7816
  /** Fired when the unsaved-changes flag toggles. */
@@ -6914,6 +7864,8 @@ declare class PowerPointViewerComponent {
6914
7864
  protected readonly fileIO: ViewerFileIOService;
6915
7865
  protected readonly themeGallery: ViewerThemeGalleryService;
6916
7866
  protected readonly canvasEditing: ViewerCanvasEditingService;
7867
+ /** Shared AI panel scope + on-canvas highlight store (pick mode, tool focus). */
7868
+ protected readonly aiPanelStore: AiPanelStore;
6917
7869
  protected readonly collabCursor: ViewerCollabCursorService;
6918
7870
  protected readonly docProperties: ViewerDocumentPropertiesService;
6919
7871
  private readonly translateService;
@@ -7029,6 +7981,18 @@ declare class PowerPointViewerComponent {
7029
7981
  protected readonly showSmartArtInsert: _angular_core.WritableSignal<boolean>;
7030
7982
  /** The single selected element on the active slide (for the inspector). */
7031
7983
  protected readonly selectedElement: _angular_core.Signal<PptxElement | null>;
7984
+ /** Whether the AI assistant pane is open (toggled from the ribbon Sparkles). */
7985
+ protected readonly aiPanelOpen: _angular_core.WritableSignal<boolean>;
7986
+ /** Whether the AI assistant toggle is shown (host supplied an `ai` config). */
7987
+ protected readonly aiEnabled: _angular_core.Signal<boolean>;
7988
+ /**
7989
+ * Stable {@link PptxAiBridge} exposing this viewer's live state + editor to
7990
+ * the AI core. Its three write choke points route through
7991
+ * {@link EditorStateService.applyReplacement}, so each AI edit is a single
7992
+ * undoable history entry. Built unconditionally (cheap); only consumed when
7993
+ * the host passes {@link ai}.
7994
+ */
7995
+ protected readonly aiBridge: PptxAiBridge;
7032
7996
  constructor();
7033
7997
  /**
7034
7998
  * Serialise the current presentation to `.pptx` bytes (imperative handle).
@@ -7045,6 +8009,13 @@ declare class PowerPointViewerComponent {
7045
8009
  goTo(index: number): void;
7046
8010
  goPrev(): void;
7047
8011
  protected onCreatePresentation(templateId: string): void;
8012
+ /**
8013
+ * Route an AI theme edit (partial theme update) through the theme-gallery
8014
+ * service so it re-resolves slide colours and records ONE undoable entry,
8015
+ * mirroring how the Design tab applies a theme. Falls back to the current
8016
+ * colour/font scheme for whichever half the update omits.
8017
+ */
8018
+ private applyAiTheme;
7048
8019
  /**
7049
8020
  * File > Options > Appearance selection handler. When a host supplies
7050
8021
  * `onThemeChange` it owns persisting the choice; otherwise this falls back
@@ -7088,6 +8059,19 @@ declare class PowerPointViewerComponent {
7088
8059
  getSlideCount(): number;
7089
8060
  /** Whether the document has unsaved changes. */
7090
8061
  isDirty(): boolean;
8062
+ /**
8063
+ * Canvas element press. While the AI panel is picking, the press hands the
8064
+ * element to the assistant (highlighted + added to the pick set) instead of
8065
+ * selecting it; otherwise it routes to the normal editor selection.
8066
+ */
8067
+ protected onCanvasElementSelect(event: {
8068
+ id: string;
8069
+ additive: boolean;
8070
+ }): void;
8071
+ /** Context-menu "Ask AI about this": scope + open the assistant, empty composer. */
8072
+ protected onContextMenuAskAi(): void;
8073
+ /** Context-menu "Fix with AI": scope + open the assistant with a prefilled directive. */
8074
+ protected onContextMenuFixAi(): void;
7091
8075
  /** Get the IDs of currently selected elements. */
7092
8076
  getSelectedElementIds(): string[];
7093
8077
  /** Programmatically select elements by their IDs. */
@@ -7181,7 +8165,7 @@ declare class PowerPointViewerComponent {
7181
8165
  /** Resolve the live slide-stage element within `<main>`. */
7182
8166
  private stageElement;
7183
8167
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PowerPointViewerComponent, never>;
7184
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PowerPointViewerComponent, "pptx-viewer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "fontsInput": { "alias": "fonts"; "required": false; "isSignal": true; }; "canEditInput": { "alias": "canEdit"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "defaultThemeKey": { "alias": "defaultThemeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "onThemeChange": { "alias": "onThemeChange"; "required": false; "isSignal": true; }; "defaultLocale": { "alias": "defaultLocale"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "onLocaleChange": { "alias": "onLocaleChange"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "collaboration": { "alias": "collaboration"; "required": false; "isSignal": true; }; "authorName": { "alias": "authorName"; "required": false; "isSignal": true; }; "shareDefaults": { "alias": "shareDefaults"; "required": false; "isSignal": true; }; "onOpenFile": { "alias": "onOpenFile"; "required": false; "isSignal": true; }; "smartArt3D": { "alias": "smartArt3D"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "activeSlideChange": "activeSlideChange"; "dirtyChange": "dirtyChange"; "contentChange": "contentChange"; "propertiesChange": "propertiesChange"; "modeChange": "modeChange"; "zoomChange": "zoomChange"; "selectionChange": "selectionChange"; "slideCountChange": "slideCountChange"; "startCollaboration": "startCollaboration"; "stopCollaboration": "stopCollaboration"; }, never, never, true, never>;
8168
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PowerPointViewerComponent, "pptx-viewer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "fontsInput": { "alias": "fonts"; "required": false; "isSignal": true; }; "canEditInput": { "alias": "canEdit"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "defaultThemeKey": { "alias": "defaultThemeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "onThemeChange": { "alias": "onThemeChange"; "required": false; "isSignal": true; }; "defaultLocale": { "alias": "defaultLocale"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "onLocaleChange": { "alias": "onLocaleChange"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "collaboration": { "alias": "collaboration"; "required": false; "isSignal": true; }; "authorName": { "alias": "authorName"; "required": false; "isSignal": true; }; "shareDefaults": { "alias": "shareDefaults"; "required": false; "isSignal": true; }; "onOpenFile": { "alias": "onOpenFile"; "required": false; "isSignal": true; }; "smartArt3D": { "alias": "smartArt3D"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "ai": { "alias": "ai"; "required": false; "isSignal": true; }; }, { "activeSlideChange": "activeSlideChange"; "dirtyChange": "dirtyChange"; "contentChange": "contentChange"; "propertiesChange": "propertiesChange"; "modeChange": "modeChange"; "zoomChange": "zoomChange"; "selectionChange": "selectionChange"; "slideCountChange": "slideCountChange"; "startCollaboration": "startCollaboration"; "stopCollaboration": "stopCollaboration"; }, never, never, true, never>;
7185
8169
  }
7186
8170
 
7187
8171
  /** A selected chart sub-part, scoped to the chart element that owns it. */
@@ -7536,7 +8520,395 @@ declare class ZoomTargetService {
7536
8520
  * `PowerPointViewerComponent`'s children (ribbon, slide canvas, inspector,
7537
8521
  * dialogs, ...) rely on via `inject()`.
7538
8522
  */
7539
- declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof CollaborationService, typeof AccessibilityService, typeof AutosaveService, typeof PrintService, typeof IsMobileService, typeof SmartArt3DService, typeof FieldContextService, typeof ZoomTargetService, typeof ViewerDialogsService, typeof ViewerCompareService, typeof ViewerExportService, typeof ViewerFindReplaceService, typeof ViewerCustomShowsService, typeof ViewerCollaborationSessionService, typeof ViewerCanvasEditingService, typeof ViewerCollabCursorService, typeof ViewerDocumentPropertiesService, typeof ViewerFileIOService, typeof ViewerFormatPainterService, typeof ViewerInspectorPanelService, typeof ViewerKeyboardService, typeof ViewerMobileSheetService, typeof ViewerOptionsService, typeof ViewerPresentationModeService, typeof ViewerThemeGalleryService, typeof ViewerTouchGesturesService, typeof ViewerZoomService];
8523
+ declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof CollaborationService, typeof AccessibilityService, typeof AutosaveService, typeof PrintService, typeof IsMobileService, typeof SmartArt3DService, typeof FieldContextService, typeof ZoomTargetService, typeof AiPanelStore, typeof ViewerDialogsService, typeof ViewerCompareService, typeof ViewerExportService, typeof ViewerFindReplaceService, typeof ViewerCustomShowsService, typeof ViewerCollaborationSessionService, typeof ViewerCanvasEditingService, typeof ViewerCollabCursorService, typeof ViewerDocumentPropertiesService, typeof ViewerFileIOService, typeof ViewerFormatPainterService, typeof ViewerInspectorPanelService, typeof ViewerKeyboardService, typeof ViewerMobileSheetService, typeof ViewerOptionsService, typeof ViewerPresentationModeService, typeof ViewerThemeGalleryService, typeof ViewerTouchGesturesService, typeof ViewerZoomService];
8524
+
8525
+ /** Lifecycle of the AI session bootstrap. */
8526
+ type AiChatInitState = 'checking' | 'unavailable' | 'ready' | 'error';
8527
+ declare class AiChatService {
8528
+ private readonly destroyRef;
8529
+ private controller;
8530
+ private unsubscribe;
8531
+ private started;
8532
+ /**
8533
+ * Tool call ids we have already reported to {@link toolTargetHandler}, so the
8534
+ * live on-canvas focus fires once per call as it first appears (the vanilla
8535
+ * controller has no `onToolCall` hook we can pass, so we derive tool activity
8536
+ * from the streamed snapshot instead).
8537
+ */
8538
+ private readonly reportedToolCalls;
8539
+ private toolTargetHandler;
8540
+ /** Session bootstrap lifecycle. */
8541
+ readonly state: _angular_core.WritableSignal<AiChatInitState>;
8542
+ /** The current transcript. */
8543
+ readonly messages: _angular_core.WritableSignal<readonly PptxAiUIMessage[]>;
8544
+ /** The chat status (`ready` / `submitted` / `streaming` / `error`). */
8545
+ readonly status: _angular_core.WritableSignal<AiSdk.ChatStatus>;
8546
+ /** The last transport / streaming error, when any. */
8547
+ readonly error: _angular_core.WritableSignal<Error | undefined>;
8548
+ /** The bootstrap error (SDK missing / session build failed). */
8549
+ readonly initError: _angular_core.WritableSignal<Error | undefined>;
8550
+ /** The staged, not-yet-applied write proposals. */
8551
+ readonly proposals: _angular_core.WritableSignal<readonly ProposalView[]>;
8552
+ /** Whether a request is in flight (drives the composer send/stop toggle). */
8553
+ readonly isStreaming: _angular_core.Signal<boolean>;
8554
+ constructor();
8555
+ /**
8556
+ * Bootstrap the session for the given bridge + config. Idempotent: only the
8557
+ * first call takes effect (the panel calls it once when it opens).
8558
+ */
8559
+ init(bridge: PptxAiBridge, config: PptxAiConfig): void;
8560
+ /**
8561
+ * Register a handler invoked as each tool call first appears, with the slide /
8562
+ * element(s) it references (or `null` for deck-wide tools). Lets the viewer
8563
+ * navigate + highlight the canvas so it mirrors the assistant in real time.
8564
+ */
8565
+ setToolTargetHandler(handler: (target: ToolCanvasTarget | null) => void): void;
8566
+ /** Send a user message (no-op when empty or not ready). */
8567
+ send(text: string): void;
8568
+ /** Abort the in-flight request. */
8569
+ stop(): void;
8570
+ /** Clear the current error and return to the ready state. */
8571
+ clearError(): void;
8572
+ /** Accept one staged proposal (applies it as one undoable edit). */
8573
+ applyProposal(id: string): void;
8574
+ /** Reject one staged proposal without applying it. */
8575
+ rejectProposal(id: string): void;
8576
+ /** Accept every staged proposal in order (each its own undoable edit). */
8577
+ acceptAllProposals(): void;
8578
+ private applySnapshot;
8579
+ /**
8580
+ * Fire {@link toolTargetHandler} once per tool call as it first appears with a
8581
+ * resolved input, mirroring React's `onToolCall` -> `toolCanvasTarget` path
8582
+ * (the vanilla controller owns `onToolCall`, so we cannot hook it directly).
8583
+ */
8584
+ private reportNewToolTargets;
8585
+ private refreshProposals;
8586
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChatService, never>;
8587
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AiChatService>;
8588
+ }
8589
+
8590
+ declare class AiChatPanelComponent {
8591
+ readonly bridge: _angular_core.InputSignal<PptxAiBridge>;
8592
+ readonly config: _angular_core.InputSignal<PptxAiConfig>;
8593
+ readonly panelWidth: _angular_core.InputSignal<number | undefined>;
8594
+ readonly closed: _angular_core.OutputEmitterRef<void>;
8595
+ protected readonly chat: AiChatService;
8596
+ /** Shared panel scope + on-canvas highlight store (provided by the viewer). */
8597
+ protected readonly store: AiPanelStore;
8598
+ constructor();
8599
+ /**
8600
+ * Apply a suggestion, first enabling the canvas colour tween so the edit fades
8601
+ * in rather than snapping (proposals apply outside the tool loop).
8602
+ */
8603
+ protected applyProposal(id: string): void;
8604
+ protected acceptAllProposals(): void;
8605
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChatPanelComponent, never>;
8606
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiChatPanelComponent, "pptx-ai-chat-panel", never, { "bridge": { "alias": "bridge"; "required": true; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
8607
+ }
8608
+
8609
+ /**
8610
+ * createAngularAiBridge: builds a {@link PptxAiBridge} that lets the
8611
+ * framework-agnostic AI core (`pptx-viewer-shared/ai`) read the open deck,
8612
+ * navigate it, and route edits through the Angular editor-history layer so
8613
+ * every AI change is a single, undoable Ctrl+Z.
8614
+ *
8615
+ * The bridge is a plain object closing over a small set of accessor callbacks
8616
+ * (mirroring React's `useAiBridge` ref indirection): each read pulls the live
8617
+ * value on demand, and each of the three write choke points funnels through
8618
+ * {@link BridgeDeps.applySlides} -> `EditorStateService.applyReplacement`, which
8619
+ * records ONE history snapshot per commit. Keeping writes funnelled is what lets
8620
+ * the {@link ProposalStore} apply a staged batch atomically.
8621
+ */
8622
+
8623
+ /** Live accessors the bridge closes over, supplied by the viewer component. */
8624
+ interface BridgeDeps {
8625
+ /** The editable (template-free) slide deck. */
8626
+ getSlides(): readonly PptxSlide[];
8627
+ /** Zero-based index of the active slide. */
8628
+ getActiveSlideIndex(): number;
8629
+ /** Slide canvas size in CSS pixels. */
8630
+ getCanvasSize(): {
8631
+ width: number;
8632
+ height: number;
8633
+ };
8634
+ /** The resolved presentation theme, when loaded. */
8635
+ getTheme(): PptxTheme | undefined;
8636
+ /** Host-provided document display name, when set. */
8637
+ getFileName(): string | undefined;
8638
+ /** The loaded core handler, when a deck is open. */
8639
+ getHandler(): PptxHandler | undefined;
8640
+ /** Navigate the viewer to a slide by zero-based index. */
8641
+ goToSlide(index: number): void;
8642
+ /** Select the given elements on a slide (empty clears selection). */
8643
+ selectElements(slideIndex: number, elementIds: readonly string[]): void;
8644
+ /**
8645
+ * Commit a fully-computed next slides array as ONE undoable history entry.
8646
+ * Implemented by the component as `editor.applyReplacement(next, label)`.
8647
+ */
8648
+ applySlides(next: PptxSlide[], label: string): void;
8649
+ /** Apply partial theme updates through the editor's theme handlers. */
8650
+ applyTheme(updates: Partial<PptxTheme>): void;
8651
+ /** Ordered presentation sections (editor-tracked, saved with the deck). */
8652
+ getSections(): readonly PptxSection[];
8653
+ /** Presentation-level properties (`p:presentationPr`), loader-tracked. */
8654
+ getPresentationProperties(): PptxPresentationProperties;
8655
+ /** Custom document properties (`docProps/custom.xml`), loader-tracked. */
8656
+ getCustomProperties(): readonly PptxCustomProperty[];
8657
+ /** Core document properties (`docProps/core.xml`), loader-tracked. */
8658
+ getCoreProperties(): PptxCoreProperties | undefined;
8659
+ /** Extended application properties (`docProps/app.xml`), loader-tracked. */
8660
+ getAppProperties(): PptxAppProperties | undefined;
8661
+ /** Set the slide canvas size (px) and mark the deck dirty. */
8662
+ setCanvasSize(size: {
8663
+ width: number;
8664
+ height: number;
8665
+ }): void;
8666
+ /** Replace the presentation sections and mark the deck dirty. */
8667
+ setSections(sections: readonly PptxSection[]): void;
8668
+ /** Replace the presentation-level properties and mark the deck dirty. */
8669
+ setPresentationProperties(props: PptxPresentationProperties): void;
8670
+ /** Replace the custom document properties and mark the deck dirty. */
8671
+ setCustomProperties(props: readonly PptxCustomProperty[]): void;
8672
+ /** Replace the core document properties and mark the deck dirty. */
8673
+ setCoreProperties(props: PptxCoreProperties | undefined): void;
8674
+ /** Replace the extended application properties and mark the deck dirty. */
8675
+ setAppProperties(props: PptxAppProperties | undefined): void;
8676
+ /**
8677
+ * The slides / elements the assistant should scope its work to (explicit AI
8678
+ * picks, else a pinned focus, else the live canvas selection). When omitted,
8679
+ * the assistant falls back to the whole active slide.
8680
+ */
8681
+ getFocusedTargets?(): PptxAiFocusedTarget[];
8682
+ /** Optional transient host notification (toast / status line). */
8683
+ notify?(message: string, level?: PptxAiNotifyLevel): void;
8684
+ }
8685
+ /** Build a stable {@link PptxAiBridge} over the Angular viewer state/editor. */
8686
+ declare function createAngularAiBridge(deps: BridgeDeps): PptxAiBridge;
8687
+
8688
+ /**
8689
+ * Pure gating predicate for the AI assistant UI. The ribbon Sparkles toggle and
8690
+ * the chat pane are shown only when the host supplies an `ai` config; keeping
8691
+ * this a standalone function makes the rule unit-testable without mounting the
8692
+ * component (the Angular test setup is TestBed-free).
8693
+ */
8694
+
8695
+ /** Whether the AI assistant toggle should be shown for the given config. */
8696
+ declare function aiToggleVisible(config: PptxAiConfig | undefined): boolean;
8697
+
8698
+ declare class AiComposerComponent {
8699
+ readonly isStreaming: _angular_core.InputSignal<boolean>;
8700
+ /**
8701
+ * One-shot composer prefill from "Ask AI" / "Fix with AI". `prefillNonce`
8702
+ * bumps on every request so the composer applies `prefillText` (and focuses)
8703
+ * even when the text is empty and unchanged.
8704
+ */
8705
+ readonly prefillText: _angular_core.InputSignal<string>;
8706
+ readonly prefillNonce: _angular_core.InputSignal<number>;
8707
+ readonly onSend: _angular_core.OutputEmitterRef<string>;
8708
+ readonly onStop: _angular_core.OutputEmitterRef<void>;
8709
+ protected readonly value: _angular_core.WritableSignal<string>;
8710
+ private readonly textarea;
8711
+ private lastPrefillNonce;
8712
+ constructor();
8713
+ protected submit(): void;
8714
+ protected onKeyDown(event: KeyboardEvent): void;
8715
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiComposerComponent, never>;
8716
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiComposerComponent, "pptx-ai-composer", never, { "isStreaming": { "alias": "isStreaming"; "required": false; "isSignal": true; }; "prefillText": { "alias": "prefillText"; "required": false; "isSignal": true; }; "prefillNonce": { "alias": "prefillNonce"; "required": false; "isSignal": true; }; }, { "onSend": "onSend"; "onStop": "onStop"; }, never, never, true, never>;
8717
+ }
8718
+
8719
+ declare class AiFocusBarComponent {
8720
+ /** Live deck, for resolving element chip labels + the two-table detection. */
8721
+ readonly slides: _angular_core.InputSignal<readonly PptxSlide[]>;
8722
+ /** Emitted with a ready-to-send directive (e.g. the merge-tables request). */
8723
+ readonly sendDirective: _angular_core.OutputEmitterRef<string>;
8724
+ protected readonly store: AiPanelStore;
8725
+ protected readonly chips: _angular_core.Signal<pptx_angular_viewer.FocusChip[]>;
8726
+ protected readonly twoTables: _angular_core.Signal<false | {
8727
+ slideIndex: number;
8728
+ elementIdA: string;
8729
+ elementIdB: string;
8730
+ }>;
8731
+ protected onMerge(tt: {
8732
+ slideIndex: number;
8733
+ elementIdA: string;
8734
+ elementIdB: string;
8735
+ }): void;
8736
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiFocusBarComponent, never>;
8737
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiFocusBarComponent, "pptx-ai-focus-bar", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; }, { "sendDirective": "sendDirective"; }, never, never, true, never>;
8738
+ }
8739
+
8740
+ /** One tool invocation captured with its full technical detail. */
8741
+ interface AiLogToolCall {
8742
+ toolName: string;
8743
+ toolCallId: string;
8744
+ state: string;
8745
+ input: unknown;
8746
+ output: unknown;
8747
+ errorText?: string;
8748
+ }
8749
+ /** One message: its role, concatenated prose, and any tool calls it made. */
8750
+ interface AiLogMessage {
8751
+ role: string;
8752
+ text: string;
8753
+ toolCalls: AiLogToolCall[];
8754
+ }
8755
+ /** One chat conversation in export form. */
8756
+ interface AiLogChat {
8757
+ id: string;
8758
+ title: string;
8759
+ deckId?: string;
8760
+ createdAt: number;
8761
+ updatedAt: number;
8762
+ createdAtIso: string;
8763
+ updatedAtIso: string;
8764
+ messageCount: number;
8765
+ messages: AiLogMessage[];
8766
+ }
8767
+ /** Top-level detailed export document. */
8768
+ interface AiLogExport {
8769
+ format: 'pptx-ai-chat-log';
8770
+ version: 1;
8771
+ exportedAt: string;
8772
+ /** Whether tool inputs/outputs are included (see `detailed` option). */
8773
+ detailed: boolean;
8774
+ chatCount: number;
8775
+ chats: AiLogChat[];
8776
+ }
8777
+ /** Options controlling how the export document is built. */
8778
+ interface BuildChatLogOptions {
8779
+ /** Include tool-call inputs/outputs. Default `true`. When false, tool calls
8780
+ * still list name + state but omit the (potentially large) payloads. */
8781
+ detailed?: boolean;
8782
+ /** Epoch ms stamped as `exportedAt`. Default `Date.now()`. */
8783
+ now?: number;
8784
+ }
8785
+ /** Build the detailed export document from already-loaded chats (pure). */
8786
+ declare function buildChatLogExport(chats: readonly PptxAiStoredChat[], options?: BuildChatLogOptions): AiLogExport;
8787
+ /** Render the same detailed export as a human-readable Markdown transcript. */
8788
+ declare function buildChatLogMarkdown(doc: AiLogExport): string;
8789
+ /** Load every stored chat (newest first) in full detail from a store. */
8790
+ declare function collectStoredChats(store: PptxAiChatStore): Promise<PptxAiStoredChat[]>;
8791
+ /** File format to download. */
8792
+ type AiLogFormat = 'json' | 'markdown';
8793
+ /** Options for {@link exportAiChatLogs}. */
8794
+ interface ExportAiChatLogsOptions {
8795
+ /** Store to read from. Defaults to the shared `createChatHistoryStore()`. */
8796
+ store?: PptxAiChatStore;
8797
+ /** `'json'` (default) or `'markdown'`. */
8798
+ format?: AiLogFormat;
8799
+ /** Include tool inputs/outputs. Default `true`. */
8800
+ detailed?: boolean;
8801
+ /** Epoch ms for the filename + `exportedAt`. Default `Date.now()`. */
8802
+ now?: number;
8803
+ }
8804
+ /**
8805
+ * Read all stored chats and trigger a browser download of the detailed log.
8806
+ *
8807
+ * @returns the number of chats exported. When `0`, no file is downloaded so the
8808
+ * caller can surface an empty-state message instead.
8809
+ */
8810
+ declare function exportAiChatLogs(options?: ExportAiChatLogsOptions): Promise<number>;
8811
+
8812
+ declare class AiSettingsSectionComponent {
8813
+ private readonly store;
8814
+ /** Number of stored chats (null while counting). */
8815
+ protected readonly chatCount: _angular_core.WritableSignal<number | null>;
8816
+ /** Include tool inputs/outputs in the export. */
8817
+ protected readonly detailed: _angular_core.WritableSignal<boolean>;
8818
+ protected readonly busy: _angular_core.WritableSignal<boolean>;
8819
+ /** Result of the last export, or null before any export runs. */
8820
+ protected readonly doneCount: _angular_core.WritableSignal<number | null>;
8821
+ constructor();
8822
+ protected onExport(format: AiLogFormat): void;
8823
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiSettingsSectionComponent, never>;
8824
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiSettingsSectionComponent, "pptx-ai-settings-section", never, {}, {}, never, never, true, never>;
8825
+ }
8826
+
8827
+ declare class AiChangeOverlayComponent {
8828
+ /** The batch of just-applied changes to animate (null when idle). */
8829
+ readonly batch: _angular_core.InputSignal<AiChangeBatch | null>;
8830
+ /** Zero-based active slide index, so the overlay draws only its own slide. */
8831
+ readonly activeSlideIndex: _angular_core.InputSignal<number>;
8832
+ private readonly host;
8833
+ private readonly renderer;
8834
+ private styleEl;
8835
+ /** `start` (pre-flip) then `end` (post-flip) so the CSS transition runs. */
8836
+ private readonly phase;
8837
+ private outerFrame;
8838
+ private innerFrame;
8839
+ /** Monotonic batch id; keys the ghosts + restarts the phase flip per batch. */
8840
+ protected readonly nonce: _angular_core.Signal<number>;
8841
+ /** The changes on the currently visible slide (bounds map 1:1 to the stage). */
8842
+ protected readonly activeChanges: _angular_core.Signal<AiElementChange[]>;
8843
+ constructor();
8844
+ /** Kebab-cased ghost-rect style for one change at the current phase. */
8845
+ protected ghostStyle(change: AiElementChange): StyleMap;
8846
+ private cancelFrames;
8847
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChangeOverlayComponent, never>;
8848
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiChangeOverlayComponent, "pptx-ai-change-overlay", never, { "batch": { "alias": "batch"; "required": false; "isSignal": true; }; "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8849
+ }
8850
+
8851
+ interface HighlightBox extends AiCanvasHighlight {
8852
+ x: number;
8853
+ y: number;
8854
+ width: number;
8855
+ height: number;
8856
+ }
8857
+ declare class AiFocusHighlightOverlayComponent {
8858
+ readonly highlights: _angular_core.InputSignal<readonly AiCanvasHighlight[]>;
8859
+ /** Elements of the currently visible slide, for bounds lookup. */
8860
+ readonly elements: _angular_core.InputSignal<readonly PptxElement[]>;
8861
+ readonly activeSlideIndex: _angular_core.InputSignal<number>;
8862
+ /** Resolve each highlight to a positioned box on the active slide. */
8863
+ protected readonly boxes: _angular_core.Signal<HighlightBox[]>;
8864
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiFocusHighlightOverlayComponent, never>;
8865
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiFocusHighlightOverlayComponent, "pptx-ai-focus-highlight-overlay", never, { "highlights": { "alias": "highlights"; "required": false; "isSignal": true; }; "elements": { "alias": "elements"; "required": false; "isSignal": true; }; "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8866
+ }
8867
+
8868
+ /** One rendered transcript row: a message flattened to its renderable parts. */
8869
+ interface MessageRow {
8870
+ id: string;
8871
+ isUser: boolean;
8872
+ parts: RenderablePart[];
8873
+ }
8874
+ declare class AiMessageListComponent {
8875
+ readonly messages: _angular_core.InputSignal<readonly PptxAiUIMessage[]>;
8876
+ readonly isStreaming: _angular_core.InputSignal<boolean>;
8877
+ private readonly endRef;
8878
+ /** Flatten each message into renderable parts, dropping empty assistant turns. */
8879
+ protected readonly rows: _angular_core.Signal<MessageRow[]>;
8880
+ constructor();
8881
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiMessageListComponent, never>;
8882
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiMessageListComponent, "pptx-ai-message-list", never, { "messages": { "alias": "messages"; "required": true; "isSignal": true; }; "isStreaming": { "alias": "isStreaming"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8883
+ }
8884
+
8885
+ declare class AiProposalCardComponent {
8886
+ readonly proposal: _angular_core.InputSignal<ProposalView>;
8887
+ readonly accept: _angular_core.OutputEmitterRef<string>;
8888
+ readonly reject: _angular_core.OutputEmitterRef<string>;
8889
+ /** Plain-language description of every staged change (never truncated). */
8890
+ protected readonly lines: _angular_core.Signal<string[]>;
8891
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiProposalCardComponent, never>;
8892
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiProposalCardComponent, "pptx-ai-proposal-card", never, { "proposal": { "alias": "proposal"; "required": true; "isSignal": true; }; }, { "accept": "accept"; "reject": "reject"; }, never, never, true, never>;
8893
+ }
8894
+
8895
+ declare class AiToolCallCardComponent {
8896
+ readonly part: _angular_core.InputSignal<RenderableToolPart>;
8897
+ protected readonly failed: _angular_core.Signal<boolean>;
8898
+ protected readonly done: _angular_core.Signal<boolean>;
8899
+ protected readonly running: _angular_core.Signal<boolean>;
8900
+ /** Friendly, non-technical activity ("Looked at slide 5"); never leaks ids. */
8901
+ private readonly activity;
8902
+ protected readonly icon: _angular_core.Signal<ToolActivityIcon>;
8903
+ protected readonly activityLabel: _angular_core.Signal<string>;
8904
+ /** Raw tool name + arg summary, only shown inside the collapsed disclosure. */
8905
+ protected readonly rawSummary: _angular_core.Signal<string>;
8906
+ protected readonly rawLabel: _angular_core.Signal<string>;
8907
+ protected readonly iconClass: _angular_core.Signal<"h-3.5 w-3.5 shrink-0 text-destructive" | "h-3.5 w-3.5 shrink-0 text-muted-foreground">;
8908
+ protected readonly statusKey: _angular_core.Signal<"pptx.ai.toolFailed" | "pptx.ai.toolDone" | "pptx.ai.toolRunning">;
8909
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiToolCallCardComponent, never>;
8910
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiToolCallCardComponent, "pptx-ai-tool-call-card", never, { "part": { "alias": "part"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
8911
+ }
7540
8912
 
7541
8913
  /** Drawing tool IDs (mirrors React DRAW_TOOLS). */
7542
8914
  type DrawTool$1 = 'select' | 'pen' | 'highlighter' | 'eraser' | 'freeform';
@@ -7622,6 +8994,10 @@ declare class RibbonComponent {
7622
8994
  readonly showSubtitles: _angular_core.InputSignal<boolean>;
7623
8995
  /** Toolbar buttons/tabs the host wants hidden. Default `[]` hides nothing. */
7624
8996
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
8997
+ /** Whether the host enabled the AI assistant (shows the Sparkles toggle). */
8998
+ readonly aiEnabled: _angular_core.InputSignal<boolean>;
8999
+ /** Whether the AI assistant panel is currently open (toggle active state). */
9000
+ readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
7625
9001
  /** Optional sign-in hook point for File > Account. Absent/disabled by default. */
7626
9002
  readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
7627
9003
  readonly prev: _angular_core.OutputEmitterRef<void>;
@@ -7653,6 +9029,8 @@ declare class RibbonComponent {
7653
9029
  readonly packageForSharing: _angular_core.OutputEmitterRef<void>;
7654
9030
  /** Emitted when the user toggles the slides panel from the top bar. */
7655
9031
  readonly toggleSidebar: _angular_core.OutputEmitterRef<void>;
9032
+ /** Emitted when the user clicks the AI assistant Sparkles toggle. */
9033
+ readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
7656
9034
  /** Emitted when the user opens the Digital Signatures panel from the File tab. */
7657
9035
  readonly signatures: _angular_core.OutputEmitterRef<void>;
7658
9036
  readonly info: _angular_core.OutputEmitterRef<void>;
@@ -7719,7 +9097,7 @@ declare class RibbonComponent {
7719
9097
  /** Forward the Review proofing toggle to the viewer-owned live state. */
7720
9098
  protected setSpellCheck(enabled: boolean): void;
7721
9099
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonComponent, never>;
7722
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonComponent, "pptx-ribbon", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "selectedElement": { "alias": "selectedElement"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "formatPainterActive": { "alias": "formatPainterActive"; "required": false; "isSignal": true; }; "canActivateFormatPainter": { "alias": "canActivateFormatPainter"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "hasMacros": { "alias": "hasMacros"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "eyedropperActive": { "alias": "eyedropperActive"; "required": false; "isSignal": true; }; "themeGalleryOpen": { "alias": "themeGalleryOpen"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "findOpen": { "alias": "findOpen"; "required": false; "isSignal": true; }; "collabConnected": { "alias": "collabConnected"; "required": false; "isSignal": true; }; "connectedCount": { "alias": "connectedCount"; "required": false; "isSignal": true; }; "spellCheckEnabled": { "alias": "spellCheckEnabled"; "required": false; "isSignal": true; }; "showSubtitles": { "alias": "showSubtitles"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; }, { "prev": "prev"; "next": "next"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; "find": "find"; "present": "present"; "presenter": "presenter"; "record": "record"; "presentFromBeginning": "presentFromBeginning"; "rehearseTimings": "rehearseTimings"; "toggleSubtitles": "toggleSubtitles"; "openSubtitleSettings": "openSubtitleSettings"; "recordFromBeginning": "recordFromBeginning"; "recordFromCurrent": "recordFromCurrent"; "spellCheckChange": "spellCheckChange"; "share": "share"; "broadcast": "broadcast"; "openFile": "openFile"; "openRecentFile": "openRecentFile"; "createPresentation": "createPresentation"; "save": "save"; "savePpsx": "savePpsx"; "savePptm": "savePptm"; "packageForSharing": "packageForSharing"; "toggleSidebar": "toggleSidebar"; "signatures": "signatures"; "info": "info"; "print": "print"; "comments": "comments"; "a11y": "a11y"; "link": "link"; "openSorter": "openSorter"; "openMasterView": "openMasterView"; "toggleNotes": "toggleNotes"; "toggleFormatPainter": "toggleFormatPainter"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "copySlideAsImage": "copySlideAsImage"; "replace": "replace"; "toggleInspector": "toggleInspector"; "drawToolChange": "drawToolChange"; "toggleThemeGallery": "toggleThemeGallery"; "toggleGrid": "toggleGrid"; "toggleRulers": "toggleRulers"; "toggleGuides": "toggleGuides"; "toggleSelectionPane": "toggleSelectionPane"; "openCustomShows": "openCustomShows"; "toggleSnapToGrid": "toggleSnapToGrid"; "toggleSnapToShape": "toggleSnapToShape"; "addGuide": "addGuide"; "zoomToFit": "zoomToFit"; "toggleEyedropper": "toggleEyedropper"; "openSmartArtDialog": "openSmartArtDialog"; "openEquationDialog": "openEquationDialog"; "openSetUpSlideShow": "openSetUpSlideShow"; "openCompare": "openCompare"; "openPassword": "openPassword"; "openFontEmbedding": "openFontEmbedding"; "openVersionHistory": "openVersionHistory"; "openShortcuts": "openShortcuts"; "openSettings": "openSettings"; }, never, never, true, never>;
9100
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonComponent, "pptx-ribbon", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "selectedElement": { "alias": "selectedElement"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "formatPainterActive": { "alias": "formatPainterActive"; "required": false; "isSignal": true; }; "canActivateFormatPainter": { "alias": "canActivateFormatPainter"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "hasMacros": { "alias": "hasMacros"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "eyedropperActive": { "alias": "eyedropperActive"; "required": false; "isSignal": true; }; "themeGalleryOpen": { "alias": "themeGalleryOpen"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "findOpen": { "alias": "findOpen"; "required": false; "isSignal": true; }; "collabConnected": { "alias": "collabConnected"; "required": false; "isSignal": true; }; "connectedCount": { "alias": "connectedCount"; "required": false; "isSignal": true; }; "spellCheckEnabled": { "alias": "spellCheckEnabled"; "required": false; "isSignal": true; }; "showSubtitles": { "alias": "showSubtitles"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "aiEnabled": { "alias": "aiEnabled"; "required": false; "isSignal": true; }; "aiPanelOpen": { "alias": "aiPanelOpen"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; }, { "prev": "prev"; "next": "next"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; "find": "find"; "present": "present"; "presenter": "presenter"; "record": "record"; "presentFromBeginning": "presentFromBeginning"; "rehearseTimings": "rehearseTimings"; "toggleSubtitles": "toggleSubtitles"; "openSubtitleSettings": "openSubtitleSettings"; "recordFromBeginning": "recordFromBeginning"; "recordFromCurrent": "recordFromCurrent"; "spellCheckChange": "spellCheckChange"; "share": "share"; "broadcast": "broadcast"; "openFile": "openFile"; "openRecentFile": "openRecentFile"; "createPresentation": "createPresentation"; "save": "save"; "savePpsx": "savePpsx"; "savePptm": "savePptm"; "packageForSharing": "packageForSharing"; "toggleSidebar": "toggleSidebar"; "toggleAiPanel": "toggleAiPanel"; "signatures": "signatures"; "info": "info"; "print": "print"; "comments": "comments"; "a11y": "a11y"; "link": "link"; "openSorter": "openSorter"; "openMasterView": "openMasterView"; "toggleNotes": "toggleNotes"; "toggleFormatPainter": "toggleFormatPainter"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "copySlideAsImage": "copySlideAsImage"; "replace": "replace"; "toggleInspector": "toggleInspector"; "drawToolChange": "drawToolChange"; "toggleThemeGallery": "toggleThemeGallery"; "toggleGrid": "toggleGrid"; "toggleRulers": "toggleRulers"; "toggleGuides": "toggleGuides"; "toggleSelectionPane": "toggleSelectionPane"; "openCustomShows": "openCustomShows"; "toggleSnapToGrid": "toggleSnapToGrid"; "toggleSnapToShape": "toggleSnapToShape"; "addGuide": "addGuide"; "zoomToFit": "zoomToFit"; "toggleEyedropper": "toggleEyedropper"; "openSmartArtDialog": "openSmartArtDialog"; "openEquationDialog": "openEquationDialog"; "openSetUpSlideShow": "openSetUpSlideShow"; "openCompare": "openCompare"; "openPassword": "openPassword"; "openFontEmbedding": "openFontEmbedding"; "openVersionHistory": "openVersionHistory"; "openShortcuts": "openShortcuts"; "openSettings": "openSettings"; }, never, never, true, never>;
7723
9101
  }
7724
9102
 
7725
9103
  /** The eight resize-handle positions around a selection box. */
@@ -7960,6 +9338,27 @@ declare class SlideCanvasComponent implements SlideContext {
7960
9338
  * slide's own elements; interactive only while {@link editTemplateMode} is on.
7961
9339
  */
7962
9340
  readonly templateElements: _angular_core.InputSignal<readonly PptxElement[]>;
9341
+ /**
9342
+ * On-canvas AI highlight rings (explicit picks + the live tool focus), drawn
9343
+ * inside the scaled stage so element coords map 1:1. Empty on thumbnails.
9344
+ */
9345
+ readonly aiHighlights: _angular_core.InputSignal<readonly AiCanvasHighlight[]>;
9346
+ /** True while the AI is active: enables the colour tween on slide elements. */
9347
+ readonly aiActive: _angular_core.InputSignal<boolean>;
9348
+ /** Zero-based active slide index, so the overlay draws only its own slide. */
9349
+ readonly aiActiveSlideIndex: _angular_core.InputSignal<number>;
9350
+ /**
9351
+ * The batch of just-applied AI element changes to play on the canvas (glide
9352
+ * old->new, fade/scale in-out, glow), or null when idle. Drawn inside the
9353
+ * scaled stage next to the focus overlay so bounds map 1:1. Empty on thumbnails.
9354
+ */
9355
+ readonly aiChangeBatch: _angular_core.InputSignal<AiChangeBatch | null>;
9356
+ /**
9357
+ * When true, the next element click(s) become AI picks (emitted via
9358
+ * {@link elementSelect}) instead of selecting / dragging. mousedown never
9359
+ * starts a drag while picking, mirroring React's pick mode.
9360
+ */
9361
+ readonly aiPickMode: _angular_core.InputSignal<boolean>;
7963
9362
  /** Active draw tool. When not 'select', pointer gestures draw ink strokes. */
7964
9363
  readonly drawTool: _angular_core.InputSignal<"pen" | "highlighter" | "eraser" | "select" | "freeform">;
7965
9364
  /** Active ink stroke colour (CSS colour string). */
@@ -8172,7 +9571,22 @@ declare class SlideCanvasComponent implements SlideContext {
8172
9571
  readonly vRulerTicks: _angular_core.Signal<readonly RulerTick[]>;
8173
9572
  readonly stageStyle: _angular_core.Signal<StyleMap>;
8174
9573
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideCanvasComponent, never>;
8175
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideCanvasComponent, "pptx-slide-canvas", never, { "slide": { "alias": "slide"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "guideCommand": { "alias": "guideCommand"; "required": false; "isSignal": true; }; "spellCheck": { "alias": "spellCheck"; "required": false; "isSignal": true; }; "snapToGuides": { "alias": "snapToGuides"; "required": false; "isSignal": true; }; "autoFit": { "alias": "autoFit"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; "editingId": { "alias": "editingId"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "drawTool": { "alias": "drawTool"; "required": false; "isSignal": true; }; "drawColor": { "alias": "drawColor"; "required": false; "isSignal": true; }; "drawWidth": { "alias": "drawWidth"; "required": false; "isSignal": true; }; }, { "elementSelect": "elementSelect"; "backgroundClick": "backgroundClick"; "transformStart": "transformStart"; "transformUpdate": "transformUpdate"; "contextMenu": "contextMenu"; "textEditStart": "textEditStart"; "textCommit": "textCommit"; "textCancel": "textCancel"; "textFormat": "textFormat"; "rotateUpdate": "rotateUpdate"; "marqueeSelect": "marqueeSelect"; "inkStrokeComplete": "inkStrokeComplete"; "eraserHit": "eraserHit"; "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
9574
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideCanvasComponent, "pptx-slide-canvas", never, { "slide": { "alias": "slide"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "guideCommand": { "alias": "guideCommand"; "required": false; "isSignal": true; }; "spellCheck": { "alias": "spellCheck"; "required": false; "isSignal": true; }; "snapToGuides": { "alias": "snapToGuides"; "required": false; "isSignal": true; }; "autoFit": { "alias": "autoFit"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; "editingId": { "alias": "editingId"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "aiHighlights": { "alias": "aiHighlights"; "required": false; "isSignal": true; }; "aiActive": { "alias": "aiActive"; "required": false; "isSignal": true; }; "aiActiveSlideIndex": { "alias": "aiActiveSlideIndex"; "required": false; "isSignal": true; }; "aiChangeBatch": { "alias": "aiChangeBatch"; "required": false; "isSignal": true; }; "aiPickMode": { "alias": "aiPickMode"; "required": false; "isSignal": true; }; "drawTool": { "alias": "drawTool"; "required": false; "isSignal": true; }; "drawColor": { "alias": "drawColor"; "required": false; "isSignal": true; }; "drawWidth": { "alias": "drawWidth"; "required": false; "isSignal": true; }; }, { "elementSelect": "elementSelect"; "backgroundClick": "backgroundClick"; "transformStart": "transformStart"; "transformUpdate": "transformUpdate"; "contextMenu": "contextMenu"; "textEditStart": "textEditStart"; "textCommit": "textCommit"; "textCancel": "textCancel"; "textFormat": "textFormat"; "rotateUpdate": "rotateUpdate"; "marqueeSelect": "marqueeSelect"; "inkStrokeComplete": "inkStrokeComplete"; "eraserHit": "eraserHit"; "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
9575
+ }
9576
+
9577
+ /**
9578
+ * Renderer-injected shape-effect definitions that need a companion DOM node
9579
+ * (a soft-edge `<filter>` def, a DAG fill-overlay tint layer), plus the helper
9580
+ * that strips dangling `url(#…)` filter references.
9581
+ *
9582
+ * Kept out of `element-style.ts` so that module stays focused on producing the
9583
+ * base `[ngStyle]` maps. Mirrors the Vue/Svelte `ShapeEffectOverlay` split.
9584
+ */
9585
+
9586
+ /** Injectable soft-edge `<filter>` descriptor (id + feather radius in px). */
9587
+ interface SoftEdgeFilterDef {
9588
+ id: string;
9589
+ radius: number;
8176
9590
  }
8177
9591
 
8178
9592
  /**
@@ -8310,6 +9724,16 @@ interface Paragraph {
8310
9724
  bulletStyle: StyleMap;
8311
9725
  /** Left indent in px derived from the paragraph outline level. */
8312
9726
  indentPx: number;
9727
+ /**
9728
+ * Per-paragraph `line-height` from this paragraph's own `a:lnSpc`: a unitless
9729
+ * multiplier (`a:spcPct`) or a `"<n>pt"` string (`a:spcPts`). Undefined when
9730
+ * the paragraph does not override the body-level line-height.
9731
+ */
9732
+ lineHeight?: number | string;
9733
+ /** `margin-top` in px from `a:spcBef` (space before), when overridden. */
9734
+ spaceBeforePx?: number;
9735
+ /** `margin-bottom` in px from `a:spcAft` (space after), when overridden. */
9736
+ spaceAfterPx?: number;
8313
9737
  }
8314
9738
  /**
8315
9739
  * ElementRendererComponent: Angular port of the React `ElementRenderer.tsx`
@@ -8341,6 +9765,14 @@ declare class ElementRendererComponent {
8341
9765
  * the viewer subtree (thumbnails, export) default to the SVG renderer.
8342
9766
  */
8343
9767
  private readonly smartArt3DService;
9768
+ /**
9769
+ * Native-animation playback (present only inside a running presentation, which
9770
+ * provides {@link AnimationPlaybackService} at the overlay level). Optional so
9771
+ * the same renderer in the editor / thumbnails / export resolves to `null` and
9772
+ * renders with no animation state. Mirrors the Vue `injectPresentationElementStates`
9773
+ * provide/inject and React's threaded `presentationElementStates` prop.
9774
+ */
9775
+ private readonly playback;
8344
9776
  private readonly translate;
8345
9777
  readonly smartArt3D: _angular_core.Signal<boolean>;
8346
9778
  /** Obstacle rects (absolute slide coords) for connector A* routing. */
@@ -8378,6 +9810,12 @@ declare class ElementRendererComponent {
8378
9810
  * no effect at all when false, so default rendering is untouched.
8379
9811
  */
8380
9812
  readonly editTemplateMode: _angular_core.InputSignal<boolean>;
9813
+ /**
9814
+ * The enclosing group's fill (`GroupPptxElement.groupFill`), passed down by
9815
+ * the group render branch so a child painted with `a:grpFill`
9816
+ * (`fillMode === 'group'`) inherits the group's resolved fill.
9817
+ */
9818
+ readonly parentGroupFill: _angular_core.InputSignal<ShapeStyle | undefined>;
8381
9819
  /** Emitted when a table cell's text edit is committed. */
8382
9820
  readonly cellCommit: _angular_core.OutputEmitterRef<{
8383
9821
  id: string;
@@ -8390,12 +9828,30 @@ declare class ElementRendererComponent {
8390
9828
  }>;
8391
9829
  /** Duotone SVG `<filter>` descriptor for this element, if any. */
8392
9830
  readonly duotoneFilter: _angular_core.Signal<pptx_angular_viewer.DuotoneFilterDef | undefined>;
9831
+ /**
9832
+ * Soft-edge feather `<filter>` descriptor (id + radius). The template injects
9833
+ * a matching `<filter>` into a hidden `<defs>` so the `filter:
9834
+ * url(#soft-edge-<id>)` reference on the shape resolves. Undefined otherwise.
9835
+ */
9836
+ readonly softEdgeFilter: _angular_core.Signal<SoftEdgeFilterDef | undefined>;
9837
+ /**
9838
+ * DAG fill-overlay tint (colour + blend mode) painted as a separate blended
9839
+ * layer over the shape. Undefined when the element has no fill overlay.
9840
+ */
9841
+ readonly fillOverlay: _angular_core.Signal<FillOverlayCss | undefined>;
8393
9842
  /**
8394
9843
  * Outline ring + slight transparency applied to inherited template
8395
9844
  * (master/layout) elements while editTemplateMode is on. Empty otherwise, so
8396
9845
  * normal rendering is never altered.
8397
9846
  */
8398
9847
  readonly templateAffordanceStyle: _angular_core.Signal<StyleMap>;
9848
+ /**
9849
+ * This element's native-animation playback state, or `undefined` outside a
9850
+ * running presentation. Drives the staged chart / SmartArt build reveal and the
9851
+ * `p:animClr` fill / stroke relinquish (threaded to the chart / SmartArt /
9852
+ * connector renderers), mirroring React's per-element `animationState`.
9853
+ */
9854
+ readonly animationState: _angular_core.Signal<ElementAnimationState | undefined>;
8399
9855
  readonly containerStyle: _angular_core.Signal<StyleMap>;
8400
9856
  readonly shapeContainerStyle: _angular_core.Signal<StyleMap>;
8401
9857
  readonly textStyle: _angular_core.Signal<StyleMap>;
@@ -8412,13 +9868,20 @@ declare class ElementRendererComponent {
8412
9868
  */
8413
9869
  readonly warpedTextStyle: _angular_core.Signal<StyleMap>;
8414
9870
  readonly children: _angular_core.Signal<PptxElement[]>;
9871
+ /**
9872
+ * This group's own fill, handed to `a:grpFill` children as their
9873
+ * `parentGroupFill`. Undefined for non-group elements. Mirrors the shared
9874
+ * `getGroupChildParentFill` helper (inlined here so the Angular binding does
9875
+ * not depend on a shared symbol that is only vendored at build time).
9876
+ */
9877
+ readonly childParentGroupFill: _angular_core.Signal<ShapeStyle | undefined>;
8415
9878
  readonly isShapeLike: _angular_core.Signal<boolean>;
8416
9879
  readonly isImageLike: _angular_core.Signal<boolean>;
8417
9880
  readonly paragraphs: _angular_core.Signal<Paragraph[]>;
8418
9881
  readonly hasText: _angular_core.Signal<boolean>;
8419
9882
  readonly placeholderLabel: _angular_core.Signal<any>;
8420
9883
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementRendererComponent, never>;
8421
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementRendererComponent, "pptx-element-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "fieldContext": { "alias": "fieldContext"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; }, { "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
9884
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementRendererComponent, "pptx-element-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "fieldContext": { "alias": "fieldContext"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; "parentGroupFill": { "alias": "parentGroupFill"; "required": false; "isSignal": true; }; }, { "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
8422
9885
  }
8423
9886
 
8424
9887
  /**
@@ -8453,9 +9916,22 @@ declare class ConnectorRendererComponent {
8453
9916
  readonly canvasHeight: _angular_core.InputSignal<number>;
8454
9917
  /** See ElementRenderer.interactive: gates the data-pptx-element contract attr. */
8455
9918
  readonly interactive: _angular_core.InputSignal<boolean>;
9919
+ /**
9920
+ * Native-animation playback state. When an active `p:animClr` colour animation
9921
+ * targets the stroke (`animatesStroke`), the SVG stroke + arrowheads paint
9922
+ * `inherit` so the wrapper's animated `stroke` keyframes cascade in. Absent
9923
+ * outside a running presentation.
9924
+ */
9925
+ readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
8456
9926
  /** All derived geometry, recomputed on every input change. */
8457
9927
  readonly geo: _angular_core.Signal<ConnectorGeometry>;
8458
9928
  readonly viewBox: _angular_core.Signal<string>;
9929
+ /**
9930
+ * Stroke paint for the line + arrowheads: `inherit` while a `p:animClr` stroke
9931
+ * colour animation is active (so the wrapper keyframes own it), else the
9932
+ * geometry's resolved stroke colour.
9933
+ */
9934
+ readonly strokeColor: _angular_core.Signal<string>;
8459
9935
  private readonly shapeStyle;
8460
9936
  readonly lineShadow: _angular_core.Signal<LineShadowParams | undefined>;
8461
9937
  readonly lineGlow: _angular_core.Signal<string | undefined>;
@@ -8473,7 +9949,7 @@ declare class ConnectorRendererComponent {
8473
9949
  readonly connectorSegments: _angular_core.Signal<TextSegment[] | undefined>;
8474
9950
  readonly connectorTextStyle: _angular_core.Signal<TextStyle | undefined>;
8475
9951
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConnectorRendererComponent, never>;
8476
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConnectorRendererComponent, "pptx-connector-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
9952
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConnectorRendererComponent, "pptx-connector-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8477
9953
  }
8478
9954
  /** One parallel stroke of a (possibly compound) connector line. */
8479
9955
  interface ConnectorStrand {
@@ -8571,6 +10047,13 @@ declare class ChartElementViewComponent {
8571
10047
  * editing additionally requires the element to be SELECTED ({@link canEdit}).
8572
10048
  */
8573
10049
  readonly editable: _angular_core.InputSignal<boolean>;
10050
+ /**
10051
+ * Native-animation playback state. When it carries a staged chart build
10052
+ * (`build.kind === 'chart'`) the chart reveals its series / categories / cells
10053
+ * progressively via the shared `applyChartBuildReveal`. Absent outside a
10054
+ * running presentation, so ordinary rendering is unaffected.
10055
+ */
10056
+ readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
8574
10057
  /**
8575
10058
  * The editor state layer. Optional: the renderer is also used outside the
8576
10059
  * editing viewer (thumbnails, export). On-canvas chart edits commit through
@@ -8600,7 +10083,12 @@ declare class ChartElementViewComponent {
8600
10083
  protected readonly canEdit: _angular_core.Signal<boolean>;
8601
10084
  /** VM of the COMMITTED data: drag geometry must not rescale mid-drag. */
8602
10085
  private readonly viewModel;
8603
- /** The element to render: committed data, or the local drag preview. */
10086
+ /**
10087
+ * The element to render: committed data, or the local drag preview, with its
10088
+ * data trimmed to the stages revealed at the current staged-build progress (the
10089
+ * drag preview wins first). Whole-chart / no-build renders return the element
10090
+ * unchanged. Mirrors the Vue `ChartRenderer`'s `revealedElement`.
10091
+ */
8604
10092
  protected readonly renderedElement: _angular_core.Signal<PptxElement>;
8605
10093
  protected readonly dragBadge: _angular_core.Signal<string>;
8606
10094
  /** The part selected for THIS chart, or null. */
@@ -8617,7 +10105,7 @@ declare class ChartElementViewComponent {
8617
10105
  protected onTitleKeydown(event: KeyboardEvent): void;
8618
10106
  protected commitTitle(): void;
8619
10107
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChartElementViewComponent, never>;
8620
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartElementViewComponent, "pptx-chart-element-view", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
10108
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartElementViewComponent, "pptx-chart-element-view", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8621
10109
  }
8622
10110
 
8623
10111
  /**
@@ -8779,6 +10267,14 @@ declare class SmartArtRendererComponent {
8779
10267
  * `editable` input). Double-clicking a node only enters edit mode when true.
8780
10268
  */
8781
10269
  readonly editable: _angular_core.InputSignal<boolean>;
10270
+ /**
10271
+ * Native-animation playback state. A staged diagram build
10272
+ * (`build.kind === 'diagram'`) reveals the leading nodes / drawing shapes for
10273
+ * the current progress; absent or non-diagram state renders every node. The
10274
+ * view box is still computed from the FULL shape set so the diagram does not
10275
+ * rescale as it builds. Mirrors the Vue `SmartArtRenderer`'s reveal slice.
10276
+ */
10277
+ readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
8782
10278
  /**
8783
10279
  * The editor state layer. Optional: the renderer is also used outside the
8784
10280
  * editing viewer (thumbnails, export), where this service is not provided.
@@ -8821,6 +10317,13 @@ declare class SmartArtRendererComponent {
8821
10317
  readonly shadowFilter: _angular_core.Signal<string | undefined>;
8822
10318
  private readonly rawDrawingShapes;
8823
10319
  readonly hasDrawingShapes: _angular_core.Signal<boolean>;
10320
+ private readonly diagramBuild;
10321
+ private readonly shownNodeCount;
10322
+ private readonly isPartialBuild;
10323
+ /** Leading node prefix revealed so far (full list when no partial build). */
10324
+ private readonly revealedNodes;
10325
+ /** Leading drawing-shape prefix revealed so far (proportional to nodes). */
10326
+ private readonly revealedShapeList;
8824
10327
  private readonly viewBox;
8825
10328
  /** `viewBox` attribute string for the drawing-shapes `<svg>`. */
8826
10329
  readonly svgViewBox: _angular_core.Signal<string>;
@@ -8895,7 +10398,7 @@ declare class SmartArtRendererComponent {
8895
10398
  private reflow;
8896
10399
  readonly isEmpty: _angular_core.Signal<boolean>;
8897
10400
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SmartArtRendererComponent, never>;
8898
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartArtRendererComponent, "pptx-smart-art-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
10401
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartArtRendererComponent, "pptx-smart-art-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8899
10402
  }
8900
10403
 
8901
10404
  /**
@@ -9345,74 +10848,50 @@ declare class ZoomRendererComponent {
9345
10848
 
9346
10849
  declare class AnimationPlaybackService {
9347
10850
  private readonly destroyRef;
9348
- /** The current slide's animations, in document/timeline order. */
9349
- private readonly animations;
9350
- private readonly showWithAnimation;
9351
- /**
9352
- * Externally-controlled playback step (e.g. derived from a parent click
9353
- * counter). `undefined` means there is no external driver. The internal
9354
- * manual step (set via advance/play/reset) takes precedence when present.
9355
- */
9356
- private readonly externalIndex;
9357
- /**
9358
- * Internal, unclamped step. `null` means "follow the external index"; any
9359
- * number means the host has taken manual control via advance/play/reset.
9360
- */
9361
- private readonly manualStep;
9362
- /** Click groups for the current slide's animations. */
9363
- readonly groups: _angular_core.Signal<AnimationClickGroup[]>;
9364
- /** Number of click groups on this slide (i.e. how many `advance()` steps). */
9365
- readonly groupCount: _angular_core.Signal<number>;
9366
- /**
9367
- * The current playback step: how many click groups have been revealed.
9368
- * Always clamped to the current group count. The manual override wins;
9369
- * otherwise it follows the external index, defaulting to 0.
9370
- */
9371
- readonly step: _angular_core.Signal<number>;
9372
- /** True when every click group has been revealed. */
9373
- readonly isComplete: _angular_core.Signal<boolean>;
9374
- /**
9375
- * Reactive map of `elementId → CSS properties` to apply for the current step.
9376
- * Only elements in revealed click groups appear.
9377
- */
9378
- readonly elementStyles: _angular_core.Signal<Map<string, CSSProperties>>;
9379
- /**
9380
- * Reactive map of `elementId → CSS properties` for elements whose entrance
9381
- * has not yet been revealed (they should be hidden so they don't flash
9382
- * visible before their group plays).
9383
- */
9384
- readonly pendingStyles: _angular_core.Signal<Map<string, CSSProperties>>;
9385
- /** Handle of the scheduled rAF auto-advance, or null when idle. */
9386
- private rafHandle;
10851
+ /** Per-element native-animation state, keyed by element id. */
10852
+ readonly presentationElementStates: _angular_core.WritableSignal<Map<string, ElementAnimationState>>;
10853
+ /** The `@keyframes` CSS to inject once per slide. */
10854
+ readonly keyframesCss: _angular_core.WritableSignal<string>;
10855
+ /** Shape ids that trigger an interactive (`onShapeClick`) sequence. */
10856
+ readonly interactiveTriggerShapeIds: _angular_core.WritableSignal<ReadonlySet<string>>;
10857
+ /** Shape ids that trigger a hover (`onHover`) sequence. */
10858
+ readonly hoverTriggerShapeIds: _angular_core.WritableSignal<ReadonlySet<string>>;
10859
+ /** True when the main timeline has no more click-groups to reveal. */
10860
+ readonly isComplete: _angular_core.WritableSignal<boolean>;
10861
+ private controller;
10862
+ private readonly timers;
10863
+ private readonly buildHandle;
10864
+ private showWithAnimation;
10865
+ private frameRoot;
10866
+ private onPlayActionSound;
10867
+ private readonly ctx;
9387
10868
  constructor();
9388
- /** Feed the current slide's animation list. Resets manual control. */
9389
- setAnimations(animations: readonly PptxElementAnimation[] | undefined, showWithAnimation?: boolean): void;
9390
- /** Update the external playback index (parent-driven build counter). */
9391
- setExternalIndex(index: number | undefined): void;
10869
+ /** Scope media-command (`p:cmd`) target lookups to a stage root element. */
10870
+ setFrameRoot(root: () => HTMLElement | null): void;
10871
+ /** Register a host-provided action-sound player (embedded-sound resolution). */
10872
+ setActionSoundHandler(handler: ((soundPath: string) => void) | undefined): void;
10873
+ private animationsEnabled;
10874
+ /** Clear all pending timers + the in-flight staged-build RAF. */
10875
+ clearTimers(): void;
10876
+ private syncComplete;
9392
10877
  /**
9393
- * Reveal the next click group. Returns `true` if a group was revealed,
9394
- * `false` if playback was already complete (so the caller can fall through
9395
- * to slide navigation).
10878
+ * Rebuild the controller for `slide` and seed the initial element state
10879
+ * (entrance-animated elements start hidden). Auto-plays the first click-group
10880
+ * when the slide opens with a withPrevious / afterPrevious / afterDelay build.
9396
10881
  */
9397
- advance(): boolean;
9398
- /** Reveal every click group at once (jump to the slide's final state). */
9399
- play(): void;
9400
- /** Reset playback to before the first click group. */
9401
- reset(): void;
9402
- /**
9403
- * Jump directly to a given step (clamped to the group count) and take manual
9404
- * control. Useful for scrubbing.
9405
- */
9406
- setStep(step: number): void;
10882
+ setSlide(slide: PptxSlide | undefined, showWithAnimation?: boolean): void;
9407
10883
  /**
9408
- * Auto-advance through every remaining click group on the animation frame,
9409
- * one group per frame. Stops automatically once playback completes or the
9410
- * service is destroyed. A no-op when already complete or when
9411
- * `requestAnimationFrame` is unavailable (SSR).
10884
+ * Reveal the next click-group. Returns `true` if a group was revealed, `false`
10885
+ * when playback is complete or animations are disabled (so the caller can fall
10886
+ * through to slide navigation).
9412
10887
  */
9413
- autoPlay(): void;
9414
- /** Cancel any in-flight rAF auto-advance. */
9415
- cancelAutoPlay(): void;
10888
+ advance(): boolean;
10889
+ /** Play an interactive shape's sequence; `true` when it triggered one. */
10890
+ handleInteractiveShapeClick(shapeId: string): boolean;
10891
+ /** Play a hover shape's sequence; `true` when it triggered one. */
10892
+ handleHoverStart(shapeId: string): boolean;
10893
+ /** Reset a hover shape's sequence so the next hover replays it. */
10894
+ handleHoverEnd(shapeId: string): void;
9416
10895
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AnimationPlaybackService, never>;
9417
10896
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AnimationPlaybackService>;
9418
10897
  }
@@ -9643,13 +11122,34 @@ declare class PresentationOverlayComponent implements OnInit {
9643
11122
  * both fire for one tap.
9644
11123
  */
9645
11124
  private closing;
11125
+ /**
11126
+ * Managed per-slide keyframes `<style>` element (colour animations + staged
11127
+ * text builds). The static preset keyframe library is injected once per
11128
+ * document by {@link ensurePresetAnimationKeyframes}.
11129
+ */
11130
+ private readonly slideKeyframes;
11131
+ /** The hover-trigger shape the pointer is currently over (fires a sequence once). */
11132
+ private currentHoverTriggerId;
9646
11133
  constructor();
9647
11134
  /**
9648
- * Imperatively apply animation reveal / pending CSS to the slide's element
9649
- * nodes (mirrors the Vue `applyAnimationStyles`). Every renderer emits a
9650
- * `data-element-id`, so this needs no per-element renderer plumbing.
11135
+ * Imperatively apply each tracked element's native-animation state to its DOM
11136
+ * wrapper: visibility (entrance hide-until-revealed / exit), the CSS-animation
11137
+ * shorthand (entrance / emphasis / exit / colour keyframes), and a pointer
11138
+ * cursor on interactive / hover trigger shapes. Mirrors the Vue
11139
+ * `applyAnimationStyles`; every renderer emits a `data-element-id`, so this
11140
+ * needs no per-element renderer plumbing.
9651
11141
  */
9652
11142
  private applyAnimationStyles;
11143
+ /** Resolve the nearest element id above a pointer target, if any. */
11144
+ private closestElementId;
11145
+ /**
11146
+ * Pointer moved over the stage: (re)play a hover-trigger shape's sequence once
11147
+ * on entering it (not on every descendant transition that `mouseover` bubbles
11148
+ * up), resetting the previous trigger on leaving it.
11149
+ */
11150
+ protected onStageHover(event: MouseEvent): void;
11151
+ /** Pointer left the stage subtree entirely: reset any active hover trigger. */
11152
+ protected onStageHoverEnd(event: MouseEvent): void;
9653
11153
  /** Viewport dimensions, updated on resize. */
9654
11154
  private readonly viewportW;
9655
11155
  private readonly viewportH;
@@ -9705,6 +11205,14 @@ declare class PresentationOverlayComponent implements OnInit {
9705
11205
  onKeyDown(event: KeyboardEvent): void;
9706
11206
  /** Left-click on the slide area advances to the next visible slide. */
9707
11207
  protected onBodyClick(event: MouseEvent): void;
11208
+ /**
11209
+ * Click/tap/swipe advance. Like every forward step it first reveals the
11210
+ * current slide's next animation build; only once the builds are exhausted
11211
+ * does it advance the slide, and then only when the slide's transition allows
11212
+ * click-advance (advanceOnClick !== false). Keyboard and the on-screen
11213
+ * next/prev buttons call navigate() directly and are never gated.
11214
+ */
11215
+ private advanceFromClick;
9708
11216
  /** Toggle an annotation tool (clicking the active one disarms it). */
9709
11217
  protected selectTool(tool: 'pen' | 'highlighter' | 'eraser' | 'laser'): void;
9710
11218
  /** Toggle the live-caption (subtitle) bar. */
@@ -9998,9 +11506,12 @@ declare class PresentationSettingsCardComponent {
9998
11506
  private readonly loader;
9999
11507
  private readonly editor;
10000
11508
  protected readonly props: _angular_core.WritableSignal<PptxPresentationProperties>;
11509
+ protected readonly frameSlides: _angular_core.Signal<boolean>;
11510
+ protected readonly slidesPerPage: _angular_core.Signal<number>;
10001
11511
  private patch;
10002
11512
  protected onShowTypeChange(event: Event): void;
10003
- protected onCheckbox(event: Event, key: 'loopContinuously' | 'showWithNarration' | 'showWithAnimation' | 'printFrameSlides'): void;
11513
+ protected onCheckbox(event: Event, key: 'loopContinuously' | 'showWithNarration' | 'showWithAnimation'): void;
11514
+ protected onFrameSlidesChange(event: Event): void;
10004
11515
  protected onSlidesPerPageChange(event: Event): void;
10005
11516
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PresentationSettingsCardComponent, never>;
10006
11517
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationSettingsCardComponent, "pptx-presentation-settings-card", never, { "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -10137,7 +11648,7 @@ declare class TextAdvancedPanelComponent {
10137
11648
  /** Exposed option arrays for the template. */
10138
11649
  protected readonly alignOptions: [NonNullable<"center" | "left" | "right" | "justify" | "justLow" | "dist" | "thaiDist" | undefined>, string][];
10139
11650
  protected readonly vAlignOptions: [NonNullable<"top" | "bottom" | "middle" | undefined>, string][];
10140
- protected readonly textDirectionOptions: [NonNullable<"eaVert" | "wordArtVert" | "wordArtVertRtl" | "mongolianVert" | "horizontal" | "vertical" | "vertical270" | undefined>, string][];
11651
+ protected readonly textDirectionOptions: [NonNullable<"vertical" | "horizontal" | "eaVert" | "wordArtVert" | "wordArtVertRtl" | "mongolianVert" | "vertical270" | undefined>, string][];
10141
11652
  protected alignLabel(align: NonNullable<TextStyle['align']>): string;
10142
11653
  protected onAlignChange(align: NonNullable<TextStyle['align']>): void;
10143
11654
  protected onVAlignChange(event: Event): void;
@@ -10879,10 +12390,16 @@ declare class MobileToolbarComponent {
10879
12390
  readonly canEdit: _angular_core.InputSignal<boolean>;
10880
12391
  /** Whether the mobile-menu sheet is currently open (highlights the button). */
10881
12392
  readonly menuOpen: _angular_core.InputSignal<boolean>;
12393
+ /** Whether the host opted into the AI assistant (shows the top-right toggle). */
12394
+ readonly aiEnabled: _angular_core.InputSignal<boolean>;
12395
+ /** Whether the AI assistant panel is currently open (highlights the button). */
12396
+ readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
10882
12397
  /** Toolbar buttons the host wants hidden (gates Undo/Redo independently). */
10883
12398
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
10884
12399
  /** User tapped the Menu (hamburger) button. */
10885
12400
  readonly toggleMenu: _angular_core.OutputEmitterRef<void>;
12401
+ /** User tapped the AI assistant toggle. */
12402
+ readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
10886
12403
  /** User tapped Undo. */
10887
12404
  readonly undo: _angular_core.OutputEmitterRef<void>;
10888
12405
  /** User tapped Redo. */
@@ -10893,7 +12410,7 @@ declare class MobileToolbarComponent {
10893
12410
  readonly present: _angular_core.OutputEmitterRef<void>;
10894
12411
  protected readonly toolbar: ToolbarVisibility;
10895
12412
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileToolbarComponent, never>;
10896
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileToolbarComponent, "pptx-mobile-toolbar", never, { "canUndo": { "alias": "canUndo"; "required": false; "isSignal": true; }; "canRedo": { "alias": "canRedo"; "required": false; "isSignal": true; }; "canPresent": { "alias": "canPresent"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "menuOpen": { "alias": "menuOpen"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleMenu": "toggleMenu"; "undo": "undo"; "redo": "redo"; "save": "save"; "present": "present"; }, never, never, true, never>;
12413
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileToolbarComponent, "pptx-mobile-toolbar", never, { "canUndo": { "alias": "canUndo"; "required": false; "isSignal": true; }; "canRedo": { "alias": "canRedo"; "required": false; "isSignal": true; }; "canPresent": { "alias": "canPresent"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "menuOpen": { "alias": "menuOpen"; "required": false; "isSignal": true; }; "aiEnabled": { "alias": "aiEnabled"; "required": false; "isSignal": true; }; "aiPanelOpen": { "alias": "aiPanelOpen"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleMenu": "toggleMenu"; "toggleAiPanel": "toggleAiPanel"; "undo": "undo"; "redo": "redo"; "save": "save"; "present": "present"; }, never, never, true, never>;
10897
12414
  }
10898
12415
 
10899
12416
  declare class NotesPanelComponent {
@@ -11062,7 +12579,7 @@ declare class StatusBarComponent {
11062
12579
  /** Relative age label for a saved timestamp ("just now" / "N min ago"). */
11063
12580
  private formatAutosaveAge;
11064
12581
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusBarComponent, never>;
11065
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusBarComponent, "pptx-status-bar", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "autosaveStatus": { "alias": "autosaveStatus"; "required": false; "isSignal": true; }; "notesOpen": { "alias": "notesOpen"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "sorterActive": { "alias": "sorterActive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleNotes": "toggleNotes"; "normalView": "normalView"; "openSorter": "openSorter"; "slideShow": "slideShow"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; }, never, never, true, never>;
12582
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusBarComponent, "pptx-status-bar", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "autosaveStatus": { "alias": "autosaveStatus"; "required": false; "isSignal": true; }; "notesOpen": { "alias": "notesOpen"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "sorterActive": { "alias": "sorterActive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleNotes": "toggleNotes"; "normalView": "normalView"; "openSorter": "openSorter"; "slideShow": "slideShow"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; }, never, ["[pptxCollabStatus]"], true, never>;
11066
12583
  }
11067
12584
 
11068
12585
  declare class EditorContextMenuComponent {
@@ -11072,8 +12589,17 @@ declare class EditorContextMenuComponent {
11072
12589
  readonly y: _angular_core.InputSignal<number>;
11073
12590
  /** Zero-based index of the slide being edited. */
11074
12591
  readonly slideIndex: _angular_core.InputSignal<number>;
12592
+ /**
12593
+ * Whether to show the "Ask AI about this" / "Fix with AI" items. Gated by the
12594
+ * host on the `ai` config + a single selected element.
12595
+ */
12596
+ readonly showAiActions: _angular_core.InputSignal<boolean>;
11075
12597
  /** Emitted when the menu should close (Escape or outside click). */
11076
12598
  readonly closed: _angular_core.OutputEmitterRef<void>;
12599
+ /** "Ask AI about this": open the assistant scoped to the selection. */
12600
+ readonly askAi: _angular_core.OutputEmitterRef<void>;
12601
+ /** "Fix with AI": open the assistant with a prefilled fix directive. */
12602
+ readonly fixAi: _angular_core.OutputEmitterRef<void>;
11077
12603
  protected readonly editor: EditorStateService;
11078
12604
  private readonly tableSelection;
11079
12605
  private readonly host;
@@ -11088,6 +12614,8 @@ declare class EditorContextMenuComponent {
11088
12614
  } | null>;
11089
12615
  onEscape(): void;
11090
12616
  onDocumentPointerDown(event: PointerEvent): void;
12617
+ protected onAskAi(): void;
12618
+ protected onFixAi(): void;
11091
12619
  protected onCut(): void;
11092
12620
  protected onCopy(): void;
11093
12621
  protected onPaste(): void;
@@ -11113,7 +12641,7 @@ declare class EditorContextMenuComponent {
11113
12641
  */
11114
12642
  private applyTable;
11115
12643
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EditorContextMenuComponent, never>;
11116
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EditorContextMenuComponent, "pptx-editor-context-menu", never, { "x": { "alias": "x"; "required": true; "isSignal": true; }; "y": { "alias": "y"; "required": true; "isSignal": true; }; "slideIndex": { "alias": "slideIndex"; "required": true; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
12644
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EditorContextMenuComponent, "pptx-editor-context-menu", never, { "x": { "alias": "x"; "required": true; "isSignal": true; }; "y": { "alias": "y"; "required": true; "isSignal": true; }; "slideIndex": { "alias": "slideIndex"; "required": true; "isSignal": true; }; "showAiActions": { "alias": "showAiActions"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "askAi": "askAi"; "fixAi": "fixAi"; }, never, never, true, never>;
11117
12645
  }
11118
12646
 
11119
12647
  /**
@@ -11776,35 +13304,20 @@ declare class PropertiesDialogComponent {
11776
13304
  }
11777
13305
 
11778
13306
  /**
11779
- * share-helpers.ts: Pure (no Angular) helpers for the Share dialog.
13307
+ * share-helpers.ts: Share dialog helpers for the Angular viewer.
11780
13308
  *
11781
- * Mirrors the form-validation / config-assembly logic of the Vue
11782
- * `ShareDialog.vue` plus the share-link builder from the React `ShareDialog`.
13309
+ * The shared subset (ShareFormFields / ShareDefaults / seedShareFields /
13310
+ * canStartShare) is re-exported from `pptx-viewer-shared` (`render/share-form`).
13311
+ * Two helpers stay local because they diverge from the shared builders:
13312
+ * - `buildCollaborationConfig` validates with `canStartShare` (non-blank room)
13313
+ * and emits a config WITHOUT `role`/`sessionIntent`, unlike the shared
13314
+ * `buildShareConfig` (which is `buildCreateCollaborationConfig`).
13315
+ * - `buildShareUrl` is Angular-only (no other binding builds a share link).
11783
13316
  *
11784
13317
  * No `any`; all regexes use the `/u` flag; no `String.prototype.replaceAll`,
11785
13318
  * no regex named-capture-groups (ng-packagr lib-target constraints).
11786
13319
  */
11787
13320
 
11788
- /** Prefilled values for the Share form fields. */
11789
- interface ShareDefaults {
11790
- roomId?: string;
11791
- userName?: string;
11792
- serverUrl?: string;
11793
- }
11794
- /** The Share form's editable fields. */
11795
- interface ShareFormFields {
11796
- roomId: string;
11797
- userName: string;
11798
- serverUrl: string;
11799
- }
11800
- /** Seed the form fields from the (optional) defaults, coercing absent values. */
11801
- declare function seedShareFields(defaults?: ShareDefaults): ShareFormFields;
11802
- /**
11803
- * Whether the required fields are non-blank (after trimming). The server URL is
11804
- * optional: a blank server selects the serverless (webrtc) peer-to-peer
11805
- * transport, so only the room id and display name are required.
11806
- */
11807
- declare function canStartShare(fields: ShareFormFields): boolean;
11808
13321
  /**
11809
13322
  * Assemble a {@link CollaborationConfig} from the (trimmed) form fields, or
11810
13323
  * `null` when the form is incomplete. A blank server URL yields
@@ -11824,7 +13337,7 @@ declare class ShareDialogComponent {
11824
13337
  /** Whether the dialog is visible. */
11825
13338
  readonly open: _angular_core.InputSignal<boolean>;
11826
13339
  /** Prefilled values for the form fields. */
11827
- readonly defaults: _angular_core.InputSignal<ShareDefaults | undefined>;
13340
+ readonly defaults: _angular_core.InputSignal<ShareDefaults$1 | undefined>;
11828
13341
  /** Whether a collaboration session is currently active (provider constructed). */
11829
13342
  readonly active: _angular_core.InputSignal<boolean>;
11830
13343
  /** Whether the websocket has reported a `connected` status. */
@@ -11940,6 +13453,8 @@ declare class ViewerExtraDialogsComponent {
11940
13453
  readonly availableThemes: _angular_core.InputSignal<readonly ThemeCatalogEntry[]>;
11941
13454
  readonly localeCode: _angular_core.InputSignal<string>;
11942
13455
  readonly availableLocales: _angular_core.InputSignal<readonly LocaleCatalogEntry[]>;
13456
+ /** Whether the Settings dialog shows the bespoke AI chat-log export category. */
13457
+ readonly aiExportVisible: _angular_core.InputSignal<boolean>;
11943
13458
  /** Fired with a restored `.pptx` version's bytes; the host swaps the deck. */
11944
13459
  readonly restoreContent: _angular_core.OutputEmitterRef<Uint8Array<ArrayBufferLike>>;
11945
13460
  readonly themeKeySelect: _angular_core.OutputEmitterRef<string>;
@@ -11981,7 +13496,7 @@ declare class ViewerExtraDialogsComponent {
11981
13496
  /** Clear any save password. */
11982
13497
  onRemovePassword(): void;
11983
13498
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewerExtraDialogsComponent, never>;
11984
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ViewerExtraDialogsComponent, "pptx-viewer-extra-dialogs", never, { "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; "selectedElementId": { "alias": "selectedElementId"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "customShows": { "alias": "customShows"; "required": false; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; }, { "restoreContent": "restoreContent"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; }, never, never, true, never>;
13499
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ViewerExtraDialogsComponent, "pptx-viewer-extra-dialogs", never, { "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; "selectedElementId": { "alias": "selectedElementId"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "customShows": { "alias": "customShows"; "required": false; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "aiExportVisible": { "alias": "aiExportVisible"; "required": false; "isSignal": true; }; }, { "restoreContent": "restoreContent"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; }, never, never, true, never>;
11985
13500
  }
11986
13501
 
11987
13502
  declare class EquationEditorDialogComponent {
@@ -12051,7 +13566,7 @@ declare class SetUpSlideShowDialogComponent {
12051
13566
  readonly close: _angular_core.OutputEmitterRef<void>;
12052
13567
  /** Working copy of the properties; seeded from `properties` on open. */
12053
13568
  readonly draft: _angular_core.WritableSignal<PptxPresentationProperties>;
12054
- readonly showType: _angular_core.Signal<"kiosk" | "presented" | "browsed">;
13569
+ readonly showType: _angular_core.Signal<"kiosk" | "browsed" | "presented">;
12055
13570
  readonly showSlidesMode: _angular_core.Signal<"range" | "all" | "customShow">;
12056
13571
  constructor();
12057
13572
  /** Merge a partial patch into the current draft. */
@@ -12386,6 +13901,11 @@ declare class SettingsDialogComponent {
12386
13901
  readonly availableLocales: _angular_core.InputSignal<readonly LocaleCatalogEntry[]>;
12387
13902
  /** Availability flags for the Add-ins pane (unset ids default to active). */
12388
13903
  readonly addinStatus: _angular_core.InputSignal<ViewerAddinStatus | undefined>;
13904
+ /**
13905
+ * Whether to show the bespoke "AI" category (chat-log export), gated by the
13906
+ * host on the `ai` config. Absent by default (no AI category).
13907
+ */
13908
+ readonly aiExportVisible: _angular_core.InputSignal<boolean>;
12389
13909
  readonly optionChange: _angular_core.OutputEmitterRef<OptionValueChange>;
12390
13910
  /** Restore a snapshot wholesale (Cancel semantics). */
12391
13911
  readonly restoreOptions: _angular_core.OutputEmitterRef<ViewerOptions>;
@@ -12398,7 +13918,8 @@ declare class SettingsDialogComponent {
12398
13918
  readonly localeSelect: _angular_core.OutputEmitterRef<string>;
12399
13919
  readonly close: _angular_core.OutputEmitterRef<void>;
12400
13920
  protected readonly tabs: readonly ViewerOptionsTabDefinition[];
12401
- protected readonly activeTabId: _angular_core.WritableSignal<ViewerOptionsTabId>;
13921
+ /** Active category id, or the bespoke `'ai'` sentinel for the AI export pane. */
13922
+ protected readonly activeTabId: _angular_core.WritableSignal<ViewerOptionsTabId | "ai">;
12402
13923
  protected readonly activeTab: _angular_core.Signal<ViewerOptionsTabDefinition>;
12403
13924
  /** Snapshot taken when the dialog opens, restored by Cancel. */
12404
13925
  private snapshot;
@@ -12409,7 +13930,7 @@ declare class SettingsDialogComponent {
12409
13930
  /** Escape confirms (keeps edits), mirroring React's dialog. */
12410
13931
  protected onEscape(): void;
12411
13932
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SettingsDialogComponent, never>;
12412
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SettingsDialogComponent, "pptx-settings-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "addinStatus": { "alias": "addinStatus"; "required": false; "isSignal": true; }; }, { "optionChange": "optionChange"; "restoreOptions": "restoreOptions"; "ribbonTabHiddenChange": "ribbonTabHiddenChange"; "quickAccessCommandsChange": "quickAccessCommandsChange"; "resetOptions": "resetOptions"; "clearCache": "clearCache"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; "close": "close"; }, never, never, true, never>;
13933
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SettingsDialogComponent, "pptx-settings-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "addinStatus": { "alias": "addinStatus"; "required": false; "isSignal": true; }; "aiExportVisible": { "alias": "aiExportVisible"; "required": false; "isSignal": true; }; }, { "optionChange": "optionChange"; "restoreOptions": "restoreOptions"; "ribbonTabHiddenChange": "ribbonTabHiddenChange"; "quickAccessCommandsChange": "quickAccessCommandsChange"; "resetOptions": "resetOptions"; "clearCache": "clearCache"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; "close": "close"; }, never, never, true, never>;
12413
13934
  }
12414
13935
 
12415
13936
  declare class SettingsAppearanceTabComponent {
@@ -12434,7 +13955,7 @@ declare class AccountPageComponent {
12434
13955
  readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
12435
13956
  private readonly translate;
12436
13957
  protected readonly swatches: readonly string[];
12437
- protected readonly version = "1.31.3";
13958
+ protected readonly version = "1.31.5";
12438
13959
  protected readonly profile: _angular_core.WritableSignal<ViewerProfile>;
12439
13960
  protected readonly initial: _angular_core.Signal<string>;
12440
13961
  protected readonly usage: _angular_core.WritableSignal<LocalStorageUsageSummary | null>;
@@ -12952,38 +14473,6 @@ interface PresenterNotes {
12952
14473
  */
12953
14474
  declare function resolvePresenterNotes(slide: PptxSlide | undefined): PresenterNotes;
12954
14475
 
12955
- /**
12956
- * audience-content-store: IndexedDB-based storage for sharing PPTX content
12957
- * between the presenter tab and audience tab.
12958
- *
12959
- * When the presenter opens an audience window, the PPTX bytes are stored in
12960
- * IndexedDB. The audience tab retrieves them on load and then cleans up.
12961
- *
12962
- * Framework-agnostic port of the React store
12963
- * (packages/react/src/viewer/hooks/presentation-mode/audience-content-store.ts).
12964
- * The database, store, and key names are kept identical to React/Vue so the
12965
- * cross-tab handoff stays wire-compatible regardless of which binding opened
12966
- * the presenter window or which one renders the audience tab.
12967
- */
12968
- /** URL hash that marks the current tab as the audience display. */
12969
- declare const AUDIENCE_HASH = "#pptx-audience";
12970
- /** Returns true if the current page was opened as an audience tab. */
12971
- declare function isAudienceTab(): boolean;
12972
- /**
12973
- * Store PPTX content bytes so the audience tab can retrieve them.
12974
- * Called by the presenter before opening the audience window.
12975
- */
12976
- declare function storeAudienceContent(content: ArrayBuffer | Uint8Array, sessionId?: string): Promise<void>;
12977
- /**
12978
- * Load PPTX content bytes stored by the presenter tab.
12979
- * Returns `null` if nothing is stored.
12980
- */
12981
- declare function loadAudienceContent(sessionId?: string): Promise<Uint8Array | null>;
12982
- /**
12983
- * Remove stored audience content (cleanup).
12984
- */
12985
- declare function clearAudienceContent(sessionId?: string): Promise<void>;
12986
-
12987
14476
  /**
12988
14477
  * SVG path generators for WordArt text warp presets.
12989
14478
  *
@@ -14167,7 +15656,13 @@ declare class RibbonPrimaryRowComponent {
14167
15656
  readonly commentCount: _angular_core.InputSignal<number>;
14168
15657
  /** Toolbar buttons the host wants hidden (gates Broadcast + the export overflow items). */
14169
15658
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
15659
+ /** Whether the host enabled the AI assistant (shows the Sparkles toggle). */
15660
+ readonly aiEnabled: _angular_core.InputSignal<boolean>;
15661
+ /** Whether the AI assistant panel is currently open (toggle active state). */
15662
+ readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
14170
15663
  readonly toggleSidebar: _angular_core.OutputEmitterRef<void>;
15664
+ /** Emitted when the user clicks the AI assistant Sparkles toggle. */
15665
+ readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
14171
15666
  readonly toggleComments: _angular_core.OutputEmitterRef<void>;
14172
15667
  readonly present: _angular_core.OutputEmitterRef<void>;
14173
15668
  readonly presenter: _angular_core.OutputEmitterRef<void>;
@@ -14200,7 +15695,7 @@ declare class RibbonPrimaryRowComponent {
14200
15695
  protected onDocumentPointerDown(event: PointerEvent): void;
14201
15696
  protected onOverflow(key: string): void;
14202
15697
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonPrimaryRowComponent, never>;
14203
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonPrimaryRowComponent, "pptx-ribbon-primary-row", never, { "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleSidebar": "toggleSidebar"; "toggleComments": "toggleComments"; "present": "present"; "presenter": "presenter"; "broadcast": "broadcast"; "openCustomShows": "openCustomShows"; "toggleInspector": "toggleInspector"; "openSettings": "openSettings"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "print": "print"; "info": "info"; "a11y": "a11y"; "save": "save"; }, never, never, true, never>;
15698
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonPrimaryRowComponent, "pptx-ribbon-primary-row", never, { "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "aiEnabled": { "alias": "aiEnabled"; "required": false; "isSignal": true; }; "aiPanelOpen": { "alias": "aiPanelOpen"; "required": false; "isSignal": true; }; }, { "toggleSidebar": "toggleSidebar"; "toggleAiPanel": "toggleAiPanel"; "toggleComments": "toggleComments"; "present": "present"; "presenter": "presenter"; "broadcast": "broadcast"; "openCustomShows": "openCustomShows"; "toggleInspector": "toggleInspector"; "openSettings": "openSettings"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "print": "print"; "info": "info"; "a11y": "a11y"; "save": "save"; }, never, never, true, never>;
14204
15699
  }
14205
15700
 
14206
15701
  declare class RibbonReviewSectionComponent {
@@ -14346,6 +15841,14 @@ declare function hasExitedFullscreen(doc: Document | null | undefined): boolean;
14346
15841
  * Exported separately so they can be unit-tested without TestBed.
14347
15842
  */
14348
15843
 
15844
+ /**
15845
+ * Whether a click/tap/swipe advance must be swallowed instead of moving to the
15846
+ * next slide. A click still steps the current slide's remaining animation
15847
+ * builds, so this only blocks once they are exhausted (`playbackComplete`) and
15848
+ * only when the slide's transition sets advanceOnClick to false. Keyboard and
15849
+ * the on-screen next/prev buttons never consult this.
15850
+ */
15851
+ declare function shouldBlockClickAdvance(playbackComplete: boolean, slide: PptxSlide | undefined): boolean;
14349
15852
  /**
14350
15853
  * Clamp `index` to the valid range [0, count - 1].
14351
15854
  * Returns 0 when `count` is 0 to avoid -1 states.
@@ -14699,50 +16202,6 @@ declare class ColorChangedImageComponent {
14699
16202
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ColorChangedImageComponent, "pptx-color-changed-image", never, { "src": { "alias": "src"; "required": true; "isSignal": true; }; "clrChange": { "alias": "clrChange"; "required": true; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "imgClass": { "alias": "imgClass"; "required": false; "isSignal": true; }; "imgStyle": { "alias": "imgStyle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
14700
16203
  }
14701
16204
 
14702
- /**
14703
- * EyeDropper colour sampler for the Angular viewer.
14704
- *
14705
- * Prefers the native browser EyeDropper API (Chrome 95+ / Edge 95+). For
14706
- * browsers without it (Firefox, Safari) a DOM-sampling fallback reads the
14707
- * colour under the pointer via `elementFromPoint` + `getComputedStyle`, so the
14708
- * eyedropper still works everywhere. Mirrors the React viewer's
14709
- * `viewer/utils/eyedropper.ts`.
14710
- */
14711
- /** A sampled colour, as hex plus its RGB channels. */
14712
- interface EyedropperResult {
14713
- hex: string;
14714
- r: number;
14715
- g: number;
14716
- b: number;
14717
- }
14718
- /**
14719
- * Returns true when the native EyeDropper API is available in this browser.
14720
- * Guards against SSR / headless environments without `window`.
14721
- */
14722
- declare function eyedropperAvailable(): boolean;
14723
- /**
14724
- * Open the native EyeDropper and return the picked sRGB hex colour string
14725
- * (e.g. `"#a3b4c5"`), or `null` when the user cancels or the API is absent.
14726
- */
14727
- declare function openNativeEyeDropper(): Promise<string | null>;
14728
- /**
14729
- * Sample the colour at a client-space point by inspecting the topmost element's
14730
- * computed paint. Tries, in order: a real `<canvas>` pixel read (sharp for
14731
- * rasterised content), then the element's `background-color`, SVG `fill`, and
14732
- * finally text `color`. Returns `null` when nothing paintable is found.
14733
- *
14734
- * This is the DOM fallback used when the native EyeDropper API is unavailable;
14735
- * it needs no canvas plumbing, so it works against the live slide DOM.
14736
- */
14737
- declare function sampleColorFromSlide(clientX: number, clientY: number): EyedropperResult | null;
14738
- /**
14739
- * Run the eyedropper fallback: arm a one-shot pointer listener and resolve with
14740
- * the hex colour of the next click (or `null` if the user presses Escape). Used
14741
- * only when {@link eyedropperAvailable} is false. The caller is responsible for
14742
- * any "armed" UI affordance; this just manages the listeners.
14743
- */
14744
- declare function pickColorByClickFallback(): Promise<string | null>;
14745
-
14746
16205
  declare class CustomShowsComponent {
14747
16206
  private readonly translate;
14748
16207
  /** Whether the dialog is open. */
@@ -14953,31 +16412,6 @@ declare class ThemeGalleryComponent {
14953
16412
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ThemeGalleryComponent, "pptx-theme-gallery", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "activeName": { "alias": "activeName"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; }, { "applyTheme": "applyTheme"; "applyCustomTheme": "applyCustomTheme"; "close": "close"; }, never, never, true, never>;
14954
16413
  }
14955
16414
 
14956
- /**
14957
- * theme-gallery-presets.ts: the exact theme set shown in the Design tab's
14958
- * Theme Gallery, at parity with React's `BUILT_IN_THEMES`
14959
- * (packages/react/src/viewer/components/toolbar/theme-gallery-data.ts).
14960
- *
14961
- * This is a DIFFERENT set from core's `THEME_PRESETS`: it adds Wisp, Berlin,
14962
- * Slice, and Dividend and omits Slate and Metropolitan, in React's order
14963
- * (office, facet, integral, ion, retrospect, organic, wisp, berlin, slice,
14964
- * dividend).
14965
- *
14966
- * The six themes that also exist in core (`office`, `facet`, `integral`,
14967
- * `ion`, `organic`, `retrospect`) are reused verbatim from core's
14968
- * `THEME_PRESETS` (looked up by id) so their colour/font schemes stay
14969
- * canonical. The four gallery-only themes are defined here, with colour
14970
- * schemes copied from React's data and React's flat `{ majorFont, minorFont }`
14971
- * fontScheme converted to core's nested `{ majorFont: { latin }, minorFont:
14972
- * { latin } }` shape.
14973
- */
14974
-
14975
- /**
14976
- * The gallery theme set, in React's order. Six canonical core presets plus the
14977
- * four gallery-only additions.
14978
- */
14979
- declare const GALLERY_THEME_PRESETS: readonly PptxThemePreset[];
14980
-
14981
16415
  declare class TitleBarComponent {
14982
16416
  /** Whether the deck is editable (gates the autosave/quick-access/search chrome). */
14983
16417
  readonly canEdit: _angular_core.InputSignal<boolean>;
@@ -15171,5 +16605,5 @@ declare const SEQUENCE_OPTIONS: ReadonlyArray<{
15171
16605
  labelKey: string;
15172
16606
  }>;
15173
16607
 
15174
- 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, 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 };
15175
- 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, PlotLayout, PlotLayoutOptions, PositionUpdate, PowerPointViewerAPI, PresentationTool, PresenterExitMessage, PresenterMessage, PresenterNotes, PresenterSlideChangeMessage, PressureCircle, PrintColorMode, PrintHtmlDocumentOptions as PrintDocumentOptions, PrintOrientation, PrintSettings, PrintSlideRange, PrintWhat, PropertiesDraft, ProviderBundle, ProviderLike, RadarPoint, RecordWebmOptions, RecoveryVersion, ReflectionState, RemoteCursor, SanitizedPresence as RemotePresence, RenderedShape, ReplaceResult, ResizeHandle, ResolvedCaptionTrack, ResolvedFontVariant, ResolvedOleType, RulerTick, ScatterDot, SelectionBox, ShapeStyleChanges, ShareDefaults, ShareFormFields, ShortcutReferenceItem, SignatureStatusKind, SlideInspectorTab, SlideTransitionAnimations, SmartArtInsertEvent, SmartArtNodeBounds, SnapBox, SnapGuide, SnapResult, SoftEdgeState, SpeechAlternative, SpeechRecognitionCtor, SpeechRecognitionEventLite, SpeechRecognitionLite, SpeechResult, SpeechResultList, SpeechSupportState, StrokeToInkElementOpts, StyleMap, SupportedChartKind, SvgAreaGradient, SvgCircle, SvgLine, SvgPath, SvgPolygon, SvgPolyline, SvgPrimitive, SvgRect, SvgText, SwipeDismissDrag, TableBooleanFlag, TableCellSelection, TableCellViewModel, TableRowViewModel, TemplateElementsBySlideId, TextAdvancedChanges, TextAdvancedState, TextStyleChanges, TextWarpCssDef, TextWarpDef, TextWarpPathDef, ThemeCatalogEntry, TimerProgress, ToolbarActionId, TouchGestureCallbacks, TranslationKey, UngroupResult, ValueRange, VideoPlanOptions, VideoSegmentPlan, ViewerMode, ViewerProfile, ViewerSettings, ViewerTheme, ViewerThemeColors, ZoomViewModel };
16608
+ export { ALIGN_OPTIONS, AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AVATAR_COLOR_SWATCHES, AccessibilityPanelComponent, AccessibilityService, AccountPageComponent, ActionSettingsPanelComponent, AdvancedChartEditorComponent, AiChangeOverlayComponent, AiChatPanelComponent, AiChatService, AiComposerComponent, AiFocusBarComponent, AiFocusHighlightOverlayComponent, AiMessageListComponent, AiPanelStore, AiProposalCardComponent, AiSettingsSectionComponent, AiToolCallCardComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, AutosaveService, BroadcastDialogComponent, CHART_EDITOR_STYLES, CURSOR_PALETTE, CanvasFitService, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartElementViewComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartPartSelectionService, ChartPrimitivesComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, ColorChangedImageComponent, CommentsPanelComponent, CommentsService, ComparePanelComponent, ConnectorRendererComponent, ConnectorTextOverlayComponent, CustomShowsComponent, DATA_TABLE_HEADER_H, DATA_TABLE_KEY_W, DATA_TABLE_PADDING, DATA_TABLE_ROW_H, DEFAULT_BOUNDS, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, DEFAULT_COLOR_SCHEME, DEFAULT_FILL_COLOR, DEFAULT_LAYOUT, DEFAULT_PALETTE$1 as DEFAULT_PALETTE, DEFAULT_PRINT_SETTINGS, DEFAULT_SLIDE_BACKGROUND, DEFAULT_STROKE_COLOR, DEFAULT_STYLE, DEFAULT_TABLE_ROW_HEIGHT, DEFAULT_TEXT_COLOR, DEFAULT_VIEWER_PROFILE, DIRECTIONAL_PRESETS, DIRECTION_OPTIONS, DocumentPropertiesCardComponent, EMBEDDED_FONTS_STYLE_ID, EMPHASIS_PRESETS, ENTRANCE_PRESETS, TEMPLATES as EQUATION_TEMPLATES, EXIT_PRESETS, EditorContextMenuComponent, EditorHistory, EditorStateService, EditorToolbarComponent, EffectsPanelComponent, ElementRendererComponent, EmbeddedFontsService, EncryptedFileDialogComponent, EquationEditorDialogComponent, EquationRendererComponent, EquationTemplateGalleryComponent, ExportProgressModalComponent, ExportService, FieldContextService, FindBarComponent, FindReplaceBarComponent, FollowModeBarComponent, FontEmbeddingListComponent, FontEmbeddingPanelComponent, GALLERY_THEME_PRESETS, GradientPickerComponent, HANDOUT_OPTIONS, HeaderFooterDialogComponent, HyperlinkDialogComponent, ImagePropertiesPanelComponent, InkDrawingService, InkRendererComponent, InsertSmartArtDialogComponent, InspectorPaneHeaderComponent, InspectorPanelComponent, IsMobileService, KeepAnnotationsDialogComponent, LOCALE_CATALOG, LONG_PRESS_DURATION_MS, LONG_PRESS_MOVE_TOLERANCE_PX, LoadContentService, LocalPresencePublisher, MAX_ZOOM_SCALE, MIN_ZOOM_SCALE, MediaPreviewComponent, MediaPropertiesPanelComponent, MediaRendererComponent, MediaTrimTimelineComponent, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesHandoutCardComponent, NotesPanelComponent, NotesToolbarComponent, OleRendererComponent, POWER_POINT_VIEWER_PROVIDERS, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PasswordProtectionDialogComponent, PasswordStrengthMeterComponent, PowerPointViewerComponent, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationPropertiesPanelComponent, PresentationSettingsCardComponent, PresentationSubtitleBarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, REPEAT_MODE_OPTIONS, RESIZE_HANDLES, RULER_THICKNESS, RemoteSelectionOverlayComponent, RibbonAnimationsSectionComponent, RibbonArrangeSectionComponent, RibbonColorPopoverComponent, RibbonComponent, RibbonDesignSectionComponent, RibbonDrawSectionComponent, RibbonDrawingGroupComponent, RibbonEditingSectionComponent, RibbonFileSectionComponent, RibbonFontControlsComponent, RibbonHomeSectionComponent, RibbonInsertFieldsComponent, RibbonInsertSectionComponent, RibbonParagraphControlsComponent, RibbonPrimaryRowComponent, RibbonReviewSectionComponent, RibbonSlideshowSectionComponent, RibbonTransitionsSectionComponent, RibbonViewSectionComponent, RulerGuidesService, SEQUENCE_OPTIONS, SEVERITY_GROUPS, SEVERITY_LABELS, SHORTCUT_REFERENCE_ITEMS, SLIDE_PX_PER_INCH, SLIDE_TRANSITION_KEYFRAMES, DEFAULT_PALETTE as SMARTART_DEFAULT_PALETTE, PALETTES as SMARTART_PALETTES, SMART_ART_COLOR_SCHEMES, SMART_ART_STYLE_OPTIONS, SUB_ITEM_LABEL, SVG_WARP_PRESETS, SWIPE_MAX_VERTICAL_PX, SWIPE_THRESHOLD_PX, SelectionPaneComponent, SetUpSlideShowDialogComponent, SettingsAppearanceTabComponent, SettingsDialogComponent, SettingsLanguageTabComponent, ShareDialogComponent, ShortcutPanelComponent, ShowOptionsFieldsetComponent, ShowSlidesFieldsetComponent, SignatureStrippedDialogComponent, SignaturesPanelComponent, SignaturesService, SlideCanvasComponent, SlideDefaultInspectorComponent, SlideDiffChangesComponent, SlideDiffRowComponent, SlideDiffThumbnailsComponent, SlideSizeCardComponent, SlideSorterOverlayComponent, SlideThemeOverridePanelComponent, SlidesPanelComponent, SmartArt3DRendererComponent, SmartArt3DService, SmartArtPreviewComponent, SmartArtPropertiesComponent, SmartArtRendererComponent, StatusBarComponent, TABLE_STRUCTURE_TOGGLES, TEXT_DIRECTION_OPTIONS, THEME_CATALOG, TIMING_CURVE_OPTIONS, TRIGGER_OPTIONS, TYPE_LABELS, TableCellAdvancedFillComponent, TableCellFormattingComponent, TableDataEditorComponent, TablePropertiesComponent, TableRendererComponent, TableResizeOverlayComponent, TableSelectionService, TextAdvancedPanelComponent, ThemeEditorFieldsComponent, ThemeGalleryComponent, ThemeSelectorCardComponent, TitleBarComponent, VALIGN_OPTIONS, VIEWER_THEME, VersionHistoryPanelComponent, ViewerCanvasEditingService, ViewerCollabCursorService, ViewerCollaborationSessionService, ViewerCompareService, ViewerCustomShowsService, ViewerDialogsService, ViewerDocumentPropertiesService, ViewerExportService, ViewerExtraDialogsComponent, ViewerFileIOService, ViewerFindReplaceService, ViewerFormatPainterService, ViewerInspectorPanelService, ViewerKeyboardService, ViewerMobileSheetService, ViewerPresentationModeService, ViewerThemeGalleryService, ViewerTouchGesturesService, ViewerZoomService, WEBM_MIME_CANDIDATES, WriteBackScheduler, ZoomNavigationService, ZoomRendererComponent, ZoomTargetService, addCategory, addCommentToList, addGradientStopPatch, addItem, addSeries, addSubItem, advanceStep, aiToggleVisible, alignPatch, animationFor, annotationMapToInkInserts, applyAcceptedDiff, applyAnimationPreset, applyFindReplacements, applyFormatToElement, applyMove, applyResize, applyTableStylePreset, asMediaElement, assignUserColor, attachTouchGestures, beginNodeEdit, boolFromEvent, bringForward, bringToFront, buildBarActions, buildBroadcastConfig, buildBroadcastViewerUrl, buildCategoryLabels, buildCellParagraphs, buildChartViewModel, buildChatLogExport, buildChatLogMarkdown, buildChromeStyle, buildClearHyperlinkPatch, buildClickGroups, buildColStyles, buildCollaborationConfig, buildComboViewModel, buildCssGradientFromShapeStyle, buildDuotoneFilter, buildDuotoneFilterId, buildEmbeddedFontStyles, buildEquationElement, buildEquationSegment, buildFallbackViewModel, buildFontFaceRule, buildGradientFillCss, buildGridlinesAndLabels, buildHyperlinkPatch, buildInkContainerStyle, buildInkStrokes, buildLegend, buildModel3DContainerStyle, buildModel3DViewModel, buildOleActionModel, buildOleInfoRows, buildPatternFillCss, buildPrintHtmlDocument as buildPrintDocument, buildPropertiesPatch, buildRegionMapViewModel, buildSaveSlides, buildShareUrl, buildSmartArtInsertElement, buildSmartArtNodes, buildStockViewModel, buildSurfaceViewModel, buildTableViewModel, buildTreemapViewModel, buildTrimFragment, buildWaterfallViewModel, buildZeroLine, buildZoomContainerStyle, buildZoomViewModel, bulletIndentPx, canAddTopLevelNode, canRemoveTopLevelNode, canStartBroadcast, canStartShare, canUseClipboard, captionDisplayText, cellRunStyle, cellStyleToStyleMap, cellTdStyle, changeCountLabel, changeIcon, characterSpacingPatch, checkFontAvailable, clampCursorPosition, clampGifDimensions, clampIndex, clampNotesFontSize, clampScale, clampStep, clearAllLocalViewerData, clearAudienceContent, cn, collectAccessibilityIssues, collectElementText, collectSlideText, collectStoredChats, collectUsedFontFamilies, columnWidthStyle, commitNodeText, computeAlign, computeAxisTitlePrimitives, computeBarRects, computeBubbleRadius, computeCornerHandle, computeDataTablePrimitives, computeDistribute, computeDrawingViewBox, computeErrorBarPrimitives, computeFocusTargets, computeHandleBoxes, computeHandoutLayout, computeIsMobile, computeIsTablet, computeLinePoints, computeLinearRegression, computePageCount, computePieLayout, computePieSlicePath, computePieSlices, computePlotLayout, computeRSquared, computeRadarPoints, computeScatterDots, computeSelectionBoxes, computeSingleSelected, computeSlideIndices, computeSnap, computeStackedBarRects, computeStackedValueRange, computeTextLines, computeTimerProgress, computeTrendlinePrimitives, computeValueRange, convertOmmlToMathMl, copyFormatFromElement, countAccessibilityIssues, countAnnotationStrokes, createAngularAiBridge, createCustomShow, createSwipeDismissDrag, createWebrtcBundle, createWebsocketBundle, cssObjectToStyleMap, currentColorScheme, currentLayout, currentStyle, defaultCssVars, defaultRadius, defaultThemeColors, deleteElementsByIds, deleteVersion as deleteRecoveryVersion, demoteNode, deriveModel3DBlobUrl, derivePresenceList, describeSmartArtBounds, disableGlowPatch, disableInnerShadowPatch, disableOuterShadowPatch, disableReflectionPatch, disableSoftEdgePatch, duplicateElementById, durationOf, effectsStateOf, enableGlowPatch, enableInnerShadowPatch, enableOuterShadowPatch, enableReflectionPatch, enableSoftEdgePatch, encodeGif, estimatePageCount, evenColumnWidths, evenRowHeights, exitPresentationFullscreen, exportAiChatLogs, extractPathPoints, eyedropperAvailable, fillColorOf, findInSlides, findOwningSlideIndex, findSlideIndexByElementId, fitPolynomial, fitZoom, focusTargetChips, fontMimeForFormat, fontSizeOf, formatAutoNumber, formatAxisValue, formatBytes, formatCursorLabel, formatElapsed, formatFileSize, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, generateCustomShowId, generatePressureCircles, generateRulerTicks, getClrChangeParams, getContainerStyle, getDuotoneFilterDef, getImageSrc, getLocalStorageUsageSummary, getOleAriaLabel, getOleBadgeLabel, getOleDisplayName, getOleDownloadFileName, getOleTypeColor, getOleTypeLabel, getPasswordStrength, getPatternSvg, getPlaceholderStyle, getVersions as getRecoveryVersions, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getSmartArtNodeBounds, getSpeechRecognitionCtor, getTextBlockStyle, getTextWarp, getTouchDistance, getWarpCategory, getWarpPath, gradientStateFromStyle, gradientStateOf, gradientStatePatch, gridColumns, groupElements, groupIssuesBySeverity, hasAnimation, hasCopyableFormat, hasExistingLink, hasExitedFullscreen, hasGradientFill, hasPressureVariation, headerLabel, inkViewBox, insertColumn, insertRow, interpolateWidth, isAudienceTab, isBold, isBrowserOpenableMime, isChildNode, isElementInteractive, isInjectableUrl, isItalic, isPpactionUrl, isPresenterMessage, isSigned, isTextElement, isTwoTableFocus, isUnderline, isUrlSafe, isValidRoomId, isViewportBackgroundPressTarget, isZoomActivationKey, issueTrackKey, issueTypeLabel, keyToLabel, latexToMathml, linePointsToSvgString, lineSpacingPatch, loadAudienceContent, mergeCaptionResults, mergeDown, mergeRight, mergeSelection, moveElementBy, moveNodeDown, moveNodeUp, msToFrameDelayCs, narrowToCircle, narrowToPolygon, narrowToRect, newChartElement, newEquationElement, newPresetShapeElement, newShapeElement, newSmartArtElement, newTableElement, newTextElement, nextVisibleIndex, nodeBold, nodeEditBox, nodeFillColor, nodeFontColor, nodeIdFromKey, nodeItalic, nodeStyle, normalizeFontFormat, normalizeSlidesPerPage, normalizeValue, numFromEvent, ommlToMathml, ooxmlDashToCssBorderStyle, openNativeEyeDropper, overallStatus, paletteColor, parseAudienceNonce, parseNodeTextarea, partitionSlides, patchChartData, patchChartStyle, patchTableData, patchTextStyle, pendingElementStyles, pickColorByClickFallback, pickSupportedMimeType, planGifFrames, planVideoSegments, pointsToSvgPathD, presenceToCursors, presetByLayout, presetsForCategory, pressuresToWidths, prevVisibleIndex, projectDrawingShapes, promoteNode, provideViewerTheme, radarAngle, radarRingPoints, recordWebm, redistributeColumnWidth, removeAnimation, removeCategory, removeColumn, removeCommentFromList, removeElementAnimation, removeGradientStopPatch, removeNode, removeRow, removeSeries, renderToCanvas, reorderAnimationDown, reorderAnimationUp, replaceInSlides, replaceMatch, requestPresentationFullscreen, resizeElement, resolveCaptionTracks, resolveChartKind, resolveFontVariant, resolveHyperlinkHref, resolveInteractiveElementId, resolveMediaSrc, resolveOleType, resolveParagraphBullet, resolvePresenterNotes, resolveProfileInitial, resolveRegionCode, resolvePalette as resolveSmartArtPalette, resolveThemeCatalogEntry, resolveTransitionDuration, revealedElementStyles, routeOrthogonalConnector, rowStyle, sampleColorFromSlide, sanitizeColor, sanitizeSlideIndex, sanitizeUserName, saveViewerProfile, scanAvailableFonts, searchSlides, seedBroadcastFields, seedHyperlinkDraft, seedPropertiesDraft, seedShareFields, segmentFrameCount, selectValue, sendBackward, sendToBack, sequentialColorScale, serializeWriteBack, seriesColor, setAnimationEmphasis, setAnimationEntrance, setAnimationExit, setAxis, setAxisLogScale, setAxisTitleStyle, setCategoryLabel, setCellText, setColorScheme, setDataLabels, setDataPointExplosion, setDataPointFill, setDataPointLabel, setDelay, setDirection, setDuration, setElementPosition, setGridlineStyle, setLayout, setLegend, setNodeStyle, setNodeText, setRepeatCount, setRepeatMode, setSequence, setSeriesChartType, setSeriesColor, setSeriesErrorBars, setSeriesMarker, setSeriesName, setSeriesTrendline, setSeriesValue, setStyle, setTimingCurve, setTitle, setTrigger, setTriggerShapeId, shapeStylePatch, sheetAfterNavigate, shouldBlockClickAdvance, shouldUseSvgWarp, showDirectionPicker, showsTemplateAffordance, signatureCountLabel, signatureKey, signatureTimestamp, signerName, statusLabel as slideDiffStatusLabel, slideNumberOf, smartArtNodes, paletteColour as smartArtPaletteColour, snapToGridStep, splitCursorCell, splitMergedCell, statusKind, statusLabel$1 as statusLabel, storeAudienceContent, stringFromEvent, strokeColorOf, strokeToInkElement, styleShadowFilter, textAdvancedPatch, textAdvancedStateFromStyle, textAdvancedStateOf, textColorOf, textDirectionPatch, textStyleOf, textStylePatch, themeStyle, themeToCssVars, thumbnailHeight, thumbnailZoom, toggleCommentResolvedInList, toggleNodeBold, toggleNodeItalic, toggleSheet, topLevelNodeCount, transformSelectedTextCase, translationsEn, ungroupElements, updateElementById, updateGlowPatch, updateGradientStopPatch, updateInnerShadowPatch, updateOuterShadowPatch, updateReflectionPatch, vAlignPatch, validatePassword, validatePrintSettings, validateRoomId, valueToY, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, waypointsToPathD, worstStatus, zoomTargetSlideIndex };
16609
+ export type { AccessibilityIssueGroup, AccountAuthConfig, ActionDescriptor, AiCanvasHighlight, AiChatInitState, AiLogChat, AiLogExport, AiLogFormat, AiLogMessage, AiPanelSelectionAccessors, AlignBox, AlignMode, AnimationClickGroup, AnimationGroup, AnnotationInkInsert, AnnotationStroke, AttachTouchGesturesConfig, AwarenessLike, BarRect, Box, BridgeDeps, BroadcastConfig, BroadcastDefaults, CSSProperties, CanvasSize, CellCoord, CellParagraph, CellTextRun, ChartPartRef, ChartPartSelection, ChartValueDrag, ChartViewModel, ClassValue, ClrChangeParams, CollaborationConfig, CollaborationRole, RouterRect as ConnectorObstacle, RouterPoint as ConnectorPoint, ConnectorRouting, CopiedFormat, CornerHandleBox, CustomShow, CustomThemeEdit, DestroyableYDoc, DiagonalBorderInfo, DistributeMode, DocumentProperties, DrawingViewBox, DuotoneFilterDef, EffectsState, EmbeddedFontStyles, EquationTemplate, EyedropperResult, FindOptions, FindResult, FocusChip, FocusSelectionInput, GifFrame, GifFramePlan, GifPlanOptions, GlowState, GradientState, GradientStop$1 as GradientStop, GroupResult, HandleBox, HandoutSlidesPerPage, HyperlinkDraft, InkPoint, InkStroke, InlineEditState, InnerShadowState, LegendEntry, LinePoint, LinearFit, LocalIdentity, LocalStorageUsageSummary, LocaleCatalogEntry, MobileSheetKey, Model3DViewModel, NodeEditBox, NotesSegmentViewModel, ObjectUrlFactory, OleActionModel, OleInfoRow, OuterShadowState, OverallSignatureStatus, PartitionedSlides, PathPoint, PieSliceGeometry, PieSliceOptions, PlotLayout, PlotLayoutOptions, PositionUpdate, PowerPointViewerAPI, PptxAiBridge, PptxAiConfig, PptxAiConnection, PptxAiContextStrategy, PptxAiElementUpdate, PptxAiToolName, PptxAiUIMessage, PptxAiWritePolicy, PresentationTool, PresenterExitMessage, PresenterMessage, PresenterNotes, PresenterSlideChangeMessage, PressureCircle, PrintColorMode, PrintHtmlDocumentOptions as PrintDocumentOptions, PrintOrientation, PrintSettings, PrintSlideRange, PrintWhat, PropertiesDraft, ProposalView, ProviderBundle, ProviderLike, RadarPoint, RecordWebmOptions, RecoveryVersion, ReflectionState, RemoteCursor, SanitizedPresence as RemotePresence, RenderedShape, ReplaceResult, ResizeHandle, ResolvedCaptionTrack, ResolvedFontVariant, ResolvedOleType, RulerTick, ScatterDot, SelectionBox, ShapeStyleChanges, ShareDefaults$1 as ShareDefaults, ShareFormFields, ShortcutReferenceItem, SignatureStatusKind, SlideInspectorTab, SlideTransitionAnimations, SmartArtInsertEvent, SmartArtNodeBounds, SnapBox, SnapGuide, SnapResult, SoftEdgeState, SpeechAlternative, SpeechRecognitionCtor, SpeechRecognitionEventLite, SpeechRecognitionLite, SpeechResult, SpeechResultList, SpeechSupportState, StagedProposal, StrokeToInkElementOpts, StyleMap, SupportedChartKind, SvgAreaGradient, SvgCircle, SvgLine, SvgPath, SvgPolygon, SvgPolyline, SvgPrimitive, SvgRect, SvgText, SwipeDismissDrag, TableBooleanFlag, TableCellSelection, TableCellViewModel, TableRowViewModel, TemplateElementsBySlideId, TextAdvancedChanges, TextAdvancedState, TextStyleChanges, TextWarpCssDef, TextWarpDef, TextWarpPathDef, ThemeCatalogEntry, TimerProgress, ToolbarActionId, TouchGestureCallbacks, TranslationKey, UngroupResult, ValueRange, VideoPlanOptions, VideoSegmentPlan, ViewerMode, ViewerProfile, ViewerSettings, ViewerTheme, ViewerThemeColors, ZoomViewModel };