pptx-angular-viewer 3.12.0 → 3.13.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.
@@ -6,9 +6,9 @@ import { Signal, WritableSignal, OnDestroy, OnInit, AfterViewInit, OnChanges, Si
6
6
  import * as AiSdk from 'ai';
7
7
  import { LanguageModel, ChatTransport, UIMessage, ToolSet } from 'ai';
8
8
  import * as pptx_angular_viewer from 'pptx-angular-viewer';
9
+ import { SafeHtml } from '@angular/platform-browser';
9
10
  import { TranslateService } from '@ngx-translate/core';
10
11
  import { Options } from 'html2canvas-pro';
11
- import { SafeHtml } from '@angular/platform-browser';
12
12
 
13
13
  /**
14
14
  * Theme configuration types for the PowerPoint viewer.
@@ -4591,7 +4591,9 @@ interface SlideTransitionAnimations {
4591
4591
  * The faithful Office 2010 (`p14`) keyframes are appended (via
4592
4592
  * {@link P14_TRANSITION_KEYFRAMES_ALL}) so the exotic / 3-D transitions routed
4593
4593
  * through `getP14TransitionAnimations` animate wherever this block is injected,
4594
- * with no per-binding wiring.
4594
+ * with no per-binding wiring. {@link FRAGMENT_TRANSITION_KEYFRAMES} is appended
4595
+ * last, backing the seven multi-fragment cinematic presets resolved by
4596
+ * `getFragmentedTransitionDescriptor` (`slide-transition-fragments.ts`).
4595
4597
  *
4596
4598
  * @module render/slide-transition-keyframes
4597
4599
  */
@@ -4644,6 +4646,68 @@ declare const SLIDE_TRANSITION_KEYFRAMES: string;
4644
4646
  */
4645
4647
  declare function getSlideTransitionAnimations(type: PptxTransitionType, durationMs: number, direction: string | undefined, orient?: string | undefined, spokes?: number | undefined, pattern?: string | undefined): SlideTransitionAnimations;
4646
4648
 
4649
+ /**
4650
+ * `slide-transition-fragment-types` - shared types and small pure helpers for
4651
+ * the multi-fragment cinematic transitions (`vortex`, `honeycomb`, `glitter`,
4652
+ * `shred`, `fracture`, `curtains`, `airplane`).
4653
+ *
4654
+ * These seven presets render in real PowerPoint as many independent
4655
+ * fragments, tiles, particles, or (for `airplane`) folded panels, not a
4656
+ * single animated layer - see `slide-transition-fragments.ts` for the
4657
+ * COM `CreateVideo` measurement writeup. A `FragmentedTransitionDescriptor`
4658
+ * is the pure, framework-neutral output every binding maps onto N clipped
4659
+ * copies of its own `SlideLayer`/`SlideCanvas` component: each fragment is a
4660
+ * full-size copy of the outgoing or incoming slide, clipped with `clip-path`
4661
+ * to its slice and animated with a shared `@keyframes` block (from
4662
+ * {@link FRAGMENT_TRANSITION_KEYFRAMES}) parameterised per fragment via CSS
4663
+ * custom properties, so the whole set is transform/opacity-only and
4664
+ * GPU-composited with no per-frame JS.
4665
+ *
4666
+ * @module render/slide-transition-fragment-types
4667
+ */
4668
+ /** One fragment: a clipped, independently-animated copy of a slide layer. */
4669
+ interface TransitionFragment {
4670
+ /** Stable id for keys / `data-*` attributes; unique within its layer. */
4671
+ id: string;
4672
+ /** `clip-path` value, in percentages of the full (unscaled) slide box. */
4673
+ clipPath: string;
4674
+ /**
4675
+ * CSS custom properties consumed by the shared `@keyframes` named by the
4676
+ * owning {@link FragmentedLayer.keyframesName}. Values are pre-formatted
4677
+ * (already unit-suffixed, e.g. `'34deg'`, `'-120%'`) so bindings can copy
4678
+ * them verbatim into an inline `style` object.
4679
+ */
4680
+ vars: Readonly<Record<string, string>>;
4681
+ /** `animation-delay`, in ms. */
4682
+ delayMs: number;
4683
+ /** `transform-origin`, e.g. `'50% 50%'`, so rotate/scale pivot correctly. */
4684
+ transformOrigin: string;
4685
+ }
4686
+ /** One layer (outgoing or incoming) rendered as N independent fragments. */
4687
+ interface FragmentedLayer {
4688
+ /** Name of the shared `@keyframes` block every fragment in this layer runs. */
4689
+ keyframesName: string;
4690
+ /** Per-fragment `animation-duration`, in ms. */
4691
+ durationMs: number;
4692
+ /** Per-fragment `animation-timing-function`. */
4693
+ easing: string;
4694
+ fragments: readonly TransitionFragment[];
4695
+ }
4696
+ /**
4697
+ * Resolved fragment plan for a cinematic transition. Either layer may be
4698
+ * absent: a layer with no entry here renders as a single, non-fragmented
4699
+ * copy exactly like every other transition (typically driven by the
4700
+ * existing {@link getCinematicTransitionAnimations} / p14 resolvers, which
4701
+ * remain the single-layer fallback for previews and any consumer that has
4702
+ * not adopted fragment rendering).
4703
+ */
4704
+ interface FragmentedTransitionDescriptor {
4705
+ outgoing?: FragmentedLayer;
4706
+ incoming?: FragmentedLayer;
4707
+ /** Same semantics as `SlideTransitionAnimations.outgoingOnTop`. */
4708
+ outgoingOnTop: boolean;
4709
+ }
4710
+
4647
4711
  /**
4648
4712
  * `slide-transition-options` - the pure option catalogues backing every
4649
4713
  * binding's slide-transition inspector section.
@@ -7651,6 +7715,17 @@ interface ViewerAdvancedOptions {
7651
7715
  * for their machine. See `resolve3DRenderingFlags`.
7652
7716
  */
7653
7717
  disable3DRendering: boolean;
7718
+ /**
7719
+ * `p:animEffect/@filter="pixelate"` defaults to snapping the element to
7720
+ * its end state (`cutIn`/`cutOut`), matching PowerPoint's own behaviour
7721
+ * (COM `CreateVideo` frame-diffing shows PowerPoint performs no animation
7722
+ * at all for this filter value). This turns on the blocky mosaic reveal
7723
+ * this renderer can build instead, for a viewer that would rather show
7724
+ * something animating than PowerPoint's own instant swap. See
7725
+ * `resolveFilterEffect` in `animation-filter-effects.ts` and
7726
+ * `docs/guide/visual-effects.md`.
7727
+ */
7728
+ pixelateMosaicAnimation: boolean;
7654
7729
  openDocumentsView: OpenDocumentsView;
7655
7730
  slideShowShowMenuOnRightClick: boolean;
7656
7731
  slideShowShowPopupToolbar: boolean;
@@ -8062,6 +8137,36 @@ interface CompatibilityWarningToast {
8062
8137
  readonly params?: Readonly<Record<string, string>>;
8063
8138
  }
8064
8139
 
8140
+ /**
8141
+ * run-program-notice.ts: turn a resolved `ppaction://program` command string
8142
+ * into the non-blocking notice a binding should show during a running show.
8143
+ *
8144
+ * PowerPoint's "Run program" action (`a:hlinkClick` -> `ppaction://program`,
8145
+ * `packages/shared/src/render/presentation-action.ts`'s `runProgram` intent)
8146
+ * names a free-text "Program to run:" command the author typed, e.g.
8147
+ * `notepad.exe C:\temp\notes.txt`. Path and arguments are ONE unstructured
8148
+ * string; OOXML has no separate arguments field, so this module does not try
8149
+ * to split one out.
8150
+ *
8151
+ * A browser cannot launch a local executable, so the honest behavior on
8152
+ * click is: show the presenter a small, dismissible notice naming the exact
8153
+ * command PowerPoint would have run, with a Copy button, rather than doing
8154
+ * nothing (silently) or blocking the show with a modal dialog.
8155
+ *
8156
+ * Framework-agnostic: no React, Vue, Angular, Svelte or DOM imports.
8157
+ */
8158
+ /** A run-program notice ready for a binding's toast/notice UI to render. */
8159
+ interface RunProgramNotice {
8160
+ /** Stable id for this invocation, so a binding can dedupe/key a toast list. */
8161
+ readonly id: string;
8162
+ /** The exact resolved command string (path plus whatever arguments the author typed). */
8163
+ readonly target: string;
8164
+ /** i18n key for the notice body. Interpolates `{{target}}`. */
8165
+ readonly messageKey: string;
8166
+ /** i18n key for the Copy button label. */
8167
+ readonly copyLabelKey: string;
8168
+ }
8169
+
8065
8170
  /**
8066
8171
  * Inspector option lists + pure patch builders for the three OOXML chart
8067
8172
  * subtype flags parsed/serialized in this wave: bar3D column/bar shape
@@ -8255,6 +8360,49 @@ declare function fpsToFrameIntervalMs(fps: number): number;
8255
8360
  */
8256
8361
  declare function segmentFrameCount(durationMs: number, fps: number): number;
8257
8362
 
8363
+ /**
8364
+ * Strategy selection for rasterising one export window (the whole slide for
8365
+ * a non-tiled export, or one tile's rectangle for a tiled export). Tries, in
8366
+ * order: the SVG `foreignObject` path (preserves `backdrop-filter`, custom
8367
+ * properties, 3D transforms because the browser's own engine paints it),
8368
+ * then the existing vector-SVG export pipeline rasterised the same way
8369
+ * (covers the case a resource could not be embedded as `data:`, so
8370
+ * `foreignObject` would taint the canvas), then `html2canvas-pro` as the
8371
+ * documented last resort. Every binding's `renderToCanvas` wrapper calls
8372
+ * this once per window; only the `html2canvasFallback` driver (the
8373
+ * `html2canvas-pro` import itself) stays per-binding.
8374
+ */
8375
+
8376
+ /** Which path actually produced the tile, for telemetry/tests. */
8377
+ type RasterStrategy = 'foreignObject' | 'vectorSvg' | 'html2canvas';
8378
+
8379
+ /** One rasterised tile: its full-raster position/size plus the canvas and strategy that produced it. */
8380
+ interface RasterizedTile {
8381
+ /** 0-based column index (tiles in the same row share increasing `col`). */
8382
+ col: number;
8383
+ /** 0-based row index. */
8384
+ row: number;
8385
+ /** Left edge, in full-raster device pixels. */
8386
+ x: number;
8387
+ /** Top edge, in full-raster device pixels. */
8388
+ y: number;
8389
+ width: number;
8390
+ height: number;
8391
+ canvas: HTMLCanvasElement;
8392
+ strategy: RasterStrategy;
8393
+ }
8394
+ /** The full set of tiles covering one element's export, tiled or not. */
8395
+ interface RasterizeElementTilesResult {
8396
+ /** Full raster width in device pixels (sum of every column's width). */
8397
+ fullWidth: number;
8398
+ /** Full raster height in device pixels (sum of every row's height). */
8399
+ fullHeight: number;
8400
+ /** `false` when a single tile already covers the whole export. */
8401
+ tiled: boolean;
8402
+ /** Every tile, row-major order. Exactly one entry when `tiled` is `false`. */
8403
+ tiles: RasterizedTile[];
8404
+ }
8405
+
8258
8406
  /**
8259
8407
  * Thin re-export shim → vendored `pptx-viewer-shared` (`render/embedded-fonts`).
8260
8408
  *
@@ -11230,6 +11378,111 @@ declare class ViewerDocumentPropertiesService {
11230
11378
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<any>;
11231
11379
  }
11232
11380
 
11381
+ declare class ExportService {
11382
+ private static readonly PRESENTATION_MIME;
11383
+ /** Build a resolution-independent SVG string directly from slide data. */
11384
+ exportSlideToSvg(slide: PptxSlide, width: number, height: number, options?: SvgExportOptions): string;
11385
+ /** Build an SVG Blob directly from slide data. */
11386
+ exportSlideToSvgBlob(slide: PptxSlide, width: number, height: number, options?: SvgExportOptions): Blob;
11387
+ /** Build SVG strings for all selected slides in a parsed presentation. */
11388
+ exportAllSlidesToSvg(data: PptxData, options?: SvgExportOptions): string[];
11389
+ /**
11390
+ * Trigger a browser download of serialized `.pptx` bytes.
11391
+ *
11392
+ * @param bytes - The serialized presentation (from the viewer's `getContent`).
11393
+ * @param fileName - Suggested download file name (unsafe chars are stripped).
11394
+ */
11395
+ savePptx(bytes: Uint8Array, fileName: string): void;
11396
+ /** Download serialized presentation bytes using the matching package MIME type. */
11397
+ savePresentation(bytes: Uint8Array, fileName: string, format: PptxSaveFormat): void;
11398
+ /**
11399
+ * Rasterize a single DOM element to PNG and trigger a browser download.
11400
+ *
11401
+ * @param el - The element to capture (e.g. the `.pptx-ng-canvas-stage`).
11402
+ * @param fileName - Suggested download file name (unsafe chars are stripped).
11403
+ * @param scale - Device-pixel ratio multiplier (default 2 for sharp output).
11404
+ */
11405
+ exportElementToPng(el: HTMLElement, fileName: string, scale?: number): Promise<void>;
11406
+ /** Rasterize an element and copy it to the system clipboard as a PNG image. */
11407
+ copyElementAsPng(el: HTMLElement, scale?: number): Promise<void>;
11408
+ /**
11409
+ * Rasterize `el` to a PNG `Blob` via the shared `foreignObject` -> vector-SVG
11410
+ * -> html2canvas fallback chain (preserves backdrop-filter, CSS custom
11411
+ * properties and 3D transforms html2canvas cannot), tiling transparently
11412
+ * for a resolution beyond the browser's canvas cap. Implementation in
11413
+ * `export-raster-tiles.ts`, next to the other shared-driver entry points.
11414
+ */
11415
+ private rasterizeElementToPngBlob;
11416
+ /**
11417
+ * Rasterize a single element to a canvas via the shared `foreignObject`
11418
+ * fidelity pipeline, clamped (scale reduced, never tiled) so the result is
11419
+ * always one canvas - for GIF/video/print, which can only consume one
11420
+ * image per frame/page. `html2canvas-pro` is kept only as the documented
11421
+ * fallback driver. Capture each slide's canvas *while that slide is the
11422
+ * live DOM*: the viewer reuses one stage node, so a deferred capture would
11423
+ * yield the same (last) slide for every page. Implementation in
11424
+ * `export-raster-tiles.ts` (kept this file under the size budget).
11425
+ */
11426
+ renderElement(el: HTMLElement, scale?: number): Promise<HTMLCanvasElement>;
11427
+ /**
11428
+ * Rasterize a single element to its raw per-tile canvases via the shared
11429
+ * `foreignObject` fidelity pipeline, tiling transparently when the
11430
+ * requested resolution exceeds the browser's canvas cap - for PDF pages,
11431
+ * which have no canvas-size limit of their own and so can place several
11432
+ * small tile images instead of needing one oversized canvas.
11433
+ */
11434
+ renderElementToTiles(el: HTMLElement, scale?: number): Promise<RasterizeElementTilesResult>;
11435
+ /**
11436
+ * Assemble a multi-page PDF from pre-rendered per-slide tile sets (one page
11437
+ * per entry) and trigger a download. See `buildTiledPdf` in
11438
+ * `export-raster-tiles.ts` for the full behaviour (placement, degrade to
11439
+ * one-image-per-page for a single-tile slide, cap-escaping rationale).
11440
+ *
11441
+ * @param pages - One entry per slide, in order, each captured while
11442
+ * its slide was the live stage (`renderElementToTiles`).
11443
+ * @param canvasWidth - Slide canvas width in pixels (for aspect ratio).
11444
+ * @param canvasHeight - Slide canvas height in pixels (for aspect ratio).
11445
+ * @param fileName - Suggested download file name (unsafe chars stripped).
11446
+ */
11447
+ exportTiledPagesToPdf(pages: RasterizeElementTilesResult[], canvasWidth: number, canvasHeight: number, fileName: string): void;
11448
+ /**
11449
+ * Assemble an animated GIF from pre-rendered slide canvases (one frame per
11450
+ * slide) and trigger a download. Frame delay is derived from
11451
+ * `slideDurationMs` via the pure {@link planGifFrames} planner.
11452
+ *
11453
+ * @param canvases - One canvas per slide, in order.
11454
+ * @param slideDurationMs - Display time per slide in milliseconds.
11455
+ * @param fileName - Suggested download file name.
11456
+ */
11457
+ exportCanvasesToGif(canvases: HTMLCanvasElement[], slideDurationMs: number, fileName: string): void;
11458
+ /**
11459
+ * Record a WebM video from pre-rendered slide canvases (each held for
11460
+ * `slideDurationMs`) via the browser `MediaRecorder` and trigger a download.
11461
+ *
11462
+ * @param canvases - One canvas per slide, in order.
11463
+ * @param slideDurationMs - Display time per slide in milliseconds.
11464
+ * @param fileName - Suggested download file name.
11465
+ * @param signal - Optional abort signal to cancel recording.
11466
+ * @param onProgress - Optional per-slide recording progress callback
11467
+ * `(currentSlide, totalSlides)`.
11468
+ */
11469
+ exportCanvasesToWebm(canvases: HTMLCanvasElement[], slideDurationMs: number, fileName: string, signal?: AbortSignal, onProgress?: (current: number, total: number) => void): Promise<void>;
11470
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ExportService, never>;
11471
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<any>;
11472
+ }
11473
+
11474
+ /**
11475
+ * Per-slide capture loops for `ViewerExportService`: flip the live stage to
11476
+ * each slide in turn, let it settle, and rasterise it (plain canvas, raw
11477
+ * tiles, or a PNG data URL), reporting progress and honouring cooperative
11478
+ * cancellation. Split out of `viewer-export.service.ts` to keep that file
11479
+ * under the file-size budget.
11480
+ *
11481
+ * Rasterisation itself is `ExportService`'s job (the shared `foreignObject`
11482
+ * fidelity pipeline, see `export-raster-tiles.ts`); this module only owns
11483
+ * the "make slide N the live DOM, then capture it" choreography.
11484
+ */
11485
+
11233
11486
  /** Live accessors the export loop needs from the host component. */
11234
11487
  interface ExportHost {
11235
11488
  /** The component's active-slide index (read + written to flip the live stage). */
@@ -11249,18 +11502,19 @@ interface ExportHost {
11249
11502
  */
11250
11503
  readonly imageExportScale?: () => number;
11251
11504
  }
11505
+
11252
11506
  declare class ViewerExportService {
11253
11507
  private readonly exportSvc;
11254
11508
  private readonly loader;
11255
11509
  private readonly print;
11256
11510
  private readonly translate;
11257
11511
  /** True while a PNG/PDF export is in progress (disables the buttons). */
11258
- readonly exporting: WritableSignal<boolean>;
11512
+ readonly exporting: _angular_core.WritableSignal<boolean>;
11259
11513
  /** Export-progress modal state (PDF / GIF / WebM). */
11260
- readonly modalOpen: WritableSignal<boolean>;
11261
- readonly modalTitle: WritableSignal<string>;
11262
- readonly progress: WritableSignal<number>;
11263
- readonly statusMessage: WritableSignal<string>;
11514
+ readonly modalOpen: _angular_core.WritableSignal<boolean>;
11515
+ readonly modalTitle: _angular_core.WritableSignal<string>;
11516
+ readonly progress: _angular_core.WritableSignal<number>;
11517
+ readonly statusMessage: _angular_core.WritableSignal<string>;
11264
11518
  /** Cooperative cancellation: the capture loop checks `signal.aborted`. */
11265
11519
  private abort;
11266
11520
  private host;
@@ -11296,17 +11550,12 @@ declare class ViewerExportService {
11296
11550
  private beginExport;
11297
11551
  private endExport;
11298
11552
  /**
11299
- * Render every slide to a canvas (each made the live stage in turn), reporting
11300
- * per-slide progress and bailing out cooperatively when `abortSignal.aborted`.
11301
- */
11302
- private captureSlideCanvases;
11303
- /**
11304
- * Flip the live stage to `index`, let it settle, and capture it to a PNG
11305
- * data URL. `scale` defaults to the host's own Image Size/Quality scale
11306
- * (matching PNG/PDF export); the print notes/handouts path passes a higher
11307
- * value when Options > Advanced > "High quality" is on.
11553
+ * Progress-reporting sink handed to the extracted capture-loop functions
11554
+ * in `viewer-export-capture.ts`, called directly at each export call site
11555
+ * (`captureSlideCanvases`/`captureSlideTiles`/`captureSlideDataUrl`) rather
11556
+ * than via a same-named private wrapper per method.
11308
11557
  */
11309
- private captureSlideDataUrl;
11558
+ private readonly progressSinks;
11310
11559
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewerExportService, never>;
11311
11560
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<any>;
11312
11561
  }
@@ -12777,77 +13026,6 @@ declare class EmbeddedFontsService {
12777
13026
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<any>;
12778
13027
  }
12779
13028
 
12780
- declare class ExportService {
12781
- private static readonly PRESENTATION_MIME;
12782
- /** Build a resolution-independent SVG string directly from slide data. */
12783
- exportSlideToSvg(slide: PptxSlide, width: number, height: number, options?: SvgExportOptions): string;
12784
- /** Build an SVG Blob directly from slide data. */
12785
- exportSlideToSvgBlob(slide: PptxSlide, width: number, height: number, options?: SvgExportOptions): Blob;
12786
- /** Build SVG strings for all selected slides in a parsed presentation. */
12787
- exportAllSlidesToSvg(data: PptxData, options?: SvgExportOptions): string[];
12788
- /**
12789
- * Trigger a browser download of serialized `.pptx` bytes.
12790
- *
12791
- * @param bytes - The serialized presentation (from the viewer's `getContent`).
12792
- * @param fileName - Suggested download file name (unsafe chars are stripped).
12793
- */
12794
- savePptx(bytes: Uint8Array, fileName: string): void;
12795
- /** Download serialized presentation bytes using the matching package MIME type. */
12796
- savePresentation(bytes: Uint8Array, fileName: string, format: PptxSaveFormat): void;
12797
- /**
12798
- * Rasterize a single DOM element to PNG and trigger a browser download.
12799
- *
12800
- * @param el - The element to capture (e.g. the `.pptx-ng-canvas-stage`).
12801
- * @param fileName - Suggested download file name (unsafe chars are stripped).
12802
- * @param scale - Device-pixel ratio multiplier (default 2 for sharp output).
12803
- */
12804
- exportElementToPng(el: HTMLElement, fileName: string, scale?: number): Promise<void>;
12805
- /** Rasterize an element and copy it to the system clipboard as a PNG image. */
12806
- copyElementAsPng(el: HTMLElement, scale?: number): Promise<void>;
12807
- /**
12808
- * Rasterize a single element to a canvas (passthrough to html2canvas-pro).
12809
- * Capture each slide's canvas *while that slide is the live DOM*: the
12810
- * viewer reuses one stage node, so a deferred capture would yield the same
12811
- * (last) slide for every page.
12812
- */
12813
- renderElement(el: HTMLElement, scale?: number): Promise<HTMLCanvasElement>;
12814
- /**
12815
- * Assemble a multi-page PDF from pre-rendered slide canvases (one page per
12816
- * canvas, sized to the slide aspect ratio in pt) and trigger a download.
12817
- *
12818
- * @param canvases - One canvas per slide, in order, each captured while
12819
- * its slide was the live stage.
12820
- * @param canvasWidth - Slide canvas width in pixels (for aspect ratio).
12821
- * @param canvasHeight - Slide canvas height in pixels (for aspect ratio).
12822
- * @param fileName - Suggested download file name (unsafe chars stripped).
12823
- */
12824
- exportCanvasesToPdf(canvases: HTMLCanvasElement[], canvasWidth: number, canvasHeight: number, fileName: string): void;
12825
- /**
12826
- * Assemble an animated GIF from pre-rendered slide canvases (one frame per
12827
- * slide) and trigger a download. Frame delay is derived from
12828
- * `slideDurationMs` via the pure {@link planGifFrames} planner.
12829
- *
12830
- * @param canvases - One canvas per slide, in order.
12831
- * @param slideDurationMs - Display time per slide in milliseconds.
12832
- * @param fileName - Suggested download file name.
12833
- */
12834
- exportCanvasesToGif(canvases: HTMLCanvasElement[], slideDurationMs: number, fileName: string): void;
12835
- /**
12836
- * Record a WebM video from pre-rendered slide canvases (each held for
12837
- * `slideDurationMs`) via the browser `MediaRecorder` and trigger a download.
12838
- *
12839
- * @param canvases - One canvas per slide, in order.
12840
- * @param slideDurationMs - Display time per slide in milliseconds.
12841
- * @param fileName - Suggested download file name.
12842
- * @param signal - Optional abort signal to cancel recording.
12843
- * @param onProgress - Optional per-slide recording progress callback
12844
- * `(currentSlide, totalSlides)`.
12845
- */
12846
- exportCanvasesToWebm(canvases: HTMLCanvasElement[], slideDurationMs: number, fileName: string, signal?: AbortSignal, onProgress?: (current: number, total: number) => void): Promise<void>;
12847
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ExportService, never>;
12848
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<any>;
12849
- }
12850
-
12851
13029
  /**
12852
13030
  * `FieldContextService`: viewer-scoped source of the OOXML field-substitution
12853
13031
  * context (slide number, date/time, header/footer, slide title, custom doc
@@ -14523,6 +14701,12 @@ declare class SlideCanvasComponent implements SlideContext {
14523
14701
  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; }; "rulerUnit": { "alias": "rulerUnit"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "gridSpacing": { "alias": "gridSpacing"; "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; }; "transparentBackground": { "alias": "transparentBackground"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "exposeElementIds": { "alias": "exposeElementIds"; "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"; "transformEnd": "transformEnd"; "adjustUpdate": "adjustUpdate"; "connectorEndpointUpdate": "connectorEndpointUpdate"; "contextMenu": "contextMenu"; "textEditStart": "textEditStart"; "textCommit": "textCommit"; "textInput": "textInput"; "textCancel": "textCancel"; "textFormat": "textFormat"; "rotateUpdate": "rotateUpdate"; "marqueeSelect": "marqueeSelect"; "inkStrokeComplete": "inkStrokeComplete"; "eraserHit": "eraserHit"; "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, ["*"], true, never>;
14524
14702
  }
14525
14703
 
14704
+ /** Injectable bevel lighting `<filter>` descriptor: id + sanitized markup. */
14705
+ interface BevelLightingFilterDef {
14706
+ id: string;
14707
+ markup: SafeHtml;
14708
+ }
14709
+
14526
14710
  /**
14527
14711
  * Renderer-injected shape-effect definitions that need a companion DOM node
14528
14712
  * (a soft-edge `<filter>` def, a DAG fill-overlay tint layer), plus the helper
@@ -14578,6 +14762,8 @@ declare class ElementRendererComponent {
14578
14762
  */
14579
14763
  private readonly playback;
14580
14764
  private readonly translate;
14765
+ /** For {@link bevelLightingFilter}'s injected `<filter>` markup. */
14766
+ private readonly sanitizer;
14581
14767
  readonly smartArt3D: _angular_core.Signal<boolean>;
14582
14768
  /** Whether the Selection Pane has hidden this element; see the empty first `@case`. */
14583
14769
  readonly isHidden: _angular_core.Signal<boolean>;
@@ -14687,6 +14873,8 @@ declare class ElementRendererComponent {
14687
14873
  * resolves. Undefined otherwise.
14688
14874
  */
14689
14875
  readonly softEdgeFilter: _angular_core.Signal<SoftEdgeFilterDef | undefined>;
14876
+ /** `a:sp3d` bevel lighting `<filter>` descriptor; see `bevel-lighting-filter.ts`. */
14877
+ readonly bevelLightingFilter: _angular_core.Signal<BevelLightingFilterDef | undefined>;
14690
14878
  /**
14691
14879
  * `a:reflection` mirrored-sibling descriptor, or `undefined`. Used by the
14692
14880
  * `group` branch below (a group reflects its whole composited subtree);
@@ -15851,18 +16039,6 @@ declare class ZoomRendererComponent {
15851
16039
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ZoomRendererComponent, "pptx-zoom-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "markElement": { "alias": "markElement"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
15852
16040
  }
15853
16041
 
15854
- /**
15855
- * presentation-overlay-chrome-styles.ts: the fixed-position inline styles for
15856
- * the slide-show overlay's own chrome (close button, edge navigation buttons,
15857
- * slide counter).
15858
- *
15859
- * These are `[ngStyle]` records rather than CSS classes because they must beat
15860
- * whatever the host page's stylesheet does to a `<button>` inside a fullscreen
15861
- * overlay, and because the safe-area `env()` offsets are read straight back by
15862
- * the mobile e2e specs. They are static data with no dependency on component
15863
- * state, so they live here instead of taking up a third of
15864
- * {@link PresentationOverlayComponent}.
15865
- */
15866
16042
  /** Inline style record as Angular's `[ngStyle]` consumes it. */
15867
16043
  type OverlayStyle = Record<string, string>;
15868
16044
 
@@ -15922,6 +16098,14 @@ declare class AnimationPlaybackService {
15922
16098
  slideHeightPx?: number;
15923
16099
  /** The deck's resolved theme colour map, for a scheme-colour (`a:schemeClr`) animation stop. */
15924
16100
  themeColorMap?: Readonly<Record<string, string>>;
16101
+ /**
16102
+ * `viewerOptions.advanced.pixelateMosaicAnimation`. `true` plays the
16103
+ * blocky mosaic reveal for `p:animEffect/@filter="pixelate"`; omitted
16104
+ * or `false` (the default, matching PowerPoint's own behaviour) snaps
16105
+ * the element to its end state. See `resolveFilterEffect`'s doc in
16106
+ * `pptx-viewer-shared`'s `animation-filter-effects.ts`.
16107
+ */
16108
+ pixelateMosaic?: boolean;
15925
16109
  }): void;
15926
16110
  /**
15927
16111
  * True while the active slide shows its builds as already complete because
@@ -16243,6 +16427,14 @@ interface ShowNavigatorDeps {
16243
16427
  };
16244
16428
  /** The deck's resolved theme colour map, for a scheme-colour (`a:schemeClr`) animation stop. */
16245
16429
  themeColorMap?: () => Readonly<Record<string, string>> | undefined;
16430
+ /**
16431
+ * `viewerOptions.advanced.pixelateMosaicAnimation`. `true` plays the
16432
+ * blocky mosaic reveal for `p:animEffect/@filter="pixelate"`; omitted or
16433
+ * `false` (the default, matching PowerPoint's own behaviour) snaps the
16434
+ * element to its end state. See `resolveFilterEffect`'s doc in
16435
+ * `pptx-viewer-shared`'s `animation-filter-effects.ts`.
16436
+ */
16437
+ pixelateMosaicAnimation?: () => boolean | undefined;
16246
16438
  playback: AnimationPlaybackService;
16247
16439
  annotations: PresentationAnnotationsService;
16248
16440
  /** Publish a committed index change to the host's `indexChange` output. */
@@ -16374,6 +16566,14 @@ interface PresentationInputDeps {
16374
16566
  * restores the origin show + slide once the sub-show runs off its end.
16375
16567
  */
16376
16568
  runCustomShow?: (customShowId: string, returnAfter: boolean) => void;
16569
+ /**
16570
+ * `ppaction://program`: PowerPoint's "Run program" action. A browser cannot
16571
+ * launch a local executable, so the host is expected to surface a
16572
+ * non-blocking notice naming the resolved command (see
16573
+ * `buildRunProgramNotice` in `pptx-viewer-shared`) rather than doing
16574
+ * nothing. Omitted means the click is still consumed, just silently.
16575
+ */
16576
+ runProgram?: (target: string) => void;
16377
16577
  }
16378
16578
  declare class PresentationInputController {
16379
16579
  private readonly deps;
@@ -16420,6 +16620,19 @@ declare class PresentationInputController {
16420
16620
  private toggleBlank;
16421
16621
  }
16422
16622
 
16623
+ declare class RunProgramNoticeStore {
16624
+ /** Notices currently on screen, oldest first. */
16625
+ readonly notices: _angular_core.WritableSignal<readonly RunProgramNotice[]>;
16626
+ /**
16627
+ * Build a fresh notice for `target` and append it. Every call adds a new
16628
+ * notice (even for the same target clicked twice in a row): each click is
16629
+ * its own event the presenter may want to copy independently.
16630
+ */
16631
+ add(target: string): void;
16632
+ /** Dismiss one notice by id. */
16633
+ dismiss(id: string): void;
16634
+ }
16635
+
16423
16636
  /**
16424
16637
  * PresentationOverlayComponent: full-viewport black overlay that renders
16425
16638
  * slides in presentation (kiosk) mode.
@@ -16498,6 +16711,12 @@ declare class PresentationOverlayComponent implements OnInit {
16498
16711
  * once instead of sitting on the last slide swallowing every advance.
16499
16712
  */
16500
16713
  readonly endWithBlackSlide: _angular_core.InputSignal<boolean>;
16714
+ /**
16715
+ * File > Options > Advanced > "Show a mosaic effect for Pixelate
16716
+ * transitions" (default false, matching PowerPoint's own instant-swap
16717
+ * behaviour for `p:animEffect/@filter="pixelate"`).
16718
+ */
16719
+ readonly pixelateMosaicAnimation: _angular_core.InputSignal<boolean>;
16501
16720
  /** Whether presenter view is up (tints the toolbar's presenter-view toggle). */
16502
16721
  readonly presenterMode: _angular_core.InputSignal<boolean>;
16503
16722
  /**
@@ -16545,6 +16764,12 @@ declare class PresentationOverlayComponent implements OnInit {
16545
16764
  protected readonly playback: AnimationPlaybackService;
16546
16765
  /** Ink-annotation state (pen/highlighter/eraser/laser) for the show. */
16547
16766
  protected readonly annotations: PresentationAnnotationsService;
16767
+ /**
16768
+ * `ppaction://program` ("Run program") notices: a browser cannot launch the
16769
+ * command, so the click surfaces a dismissible notice naming it instead.
16770
+ * See `run-program-notice-store.ts`.
16771
+ */
16772
+ protected readonly runProgramNotices: RunProgramNoticeStore;
16548
16773
  /**
16549
16774
  * The show's navigation state machine (index, end-of-show screen, slide
16550
16775
  * transition, timed auto-advance). See `presentation-show-navigator.ts`.
@@ -16716,7 +16941,7 @@ declare class PresentationOverlayComponent implements OnInit {
16716
16941
  private runChromeAction;
16717
16942
  private emitClosed;
16718
16943
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PresentationOverlayComponent, never>;
16719
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationOverlayComponent, "pptx-presentation-overlay", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "startIndex": { "alias": "startIndex"; "required": false; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "authoredRange": { "alias": "authoredRange"; "required": false; "isSignal": true; }; "loopContinuously": { "alias": "loopContinuously"; "required": false; "isSignal": true; }; "showWithAnimation": { "alias": "showWithAnimation"; "required": false; "isSignal": true; }; "useTimings": { "alias": "useTimings"; "required": false; "isSignal": true; }; "subtitlesVisible": { "alias": "subtitlesVisible"; "required": false; "isSignal": true; }; "sessionEnded": { "alias": "sessionEnded"; "required": false; "isSignal": true; }; "endWithBlackSlide": { "alias": "endWithBlackSlide"; "required": false; "isSignal": true; }; "presenterMode": { "alias": "presenterMode"; "required": false; "isSignal": true; }; "showMenuOnRightClick": { "alias": "showMenuOnRightClick"; "required": false; "isSignal": true; }; "showPopupToolbar": { "alias": "showPopupToolbar"; "required": false; "isSignal": true; }; }, { "indexChange": "indexChange"; "closed": "closed"; "subtitlesChange": "subtitlesChange"; "presenterViewToggle": "presenterViewToggle"; "annotationsExit": "annotationsExit"; "customShowRequest": "customShowRequest"; "endOfShowChange": "endOfShowChange"; }, never, never, true, never>;
16944
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationOverlayComponent, "pptx-presentation-overlay", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "startIndex": { "alias": "startIndex"; "required": false; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "authoredRange": { "alias": "authoredRange"; "required": false; "isSignal": true; }; "loopContinuously": { "alias": "loopContinuously"; "required": false; "isSignal": true; }; "showWithAnimation": { "alias": "showWithAnimation"; "required": false; "isSignal": true; }; "useTimings": { "alias": "useTimings"; "required": false; "isSignal": true; }; "subtitlesVisible": { "alias": "subtitlesVisible"; "required": false; "isSignal": true; }; "sessionEnded": { "alias": "sessionEnded"; "required": false; "isSignal": true; }; "endWithBlackSlide": { "alias": "endWithBlackSlide"; "required": false; "isSignal": true; }; "pixelateMosaicAnimation": { "alias": "pixelateMosaicAnimation"; "required": false; "isSignal": true; }; "presenterMode": { "alias": "presenterMode"; "required": false; "isSignal": true; }; "showMenuOnRightClick": { "alias": "showMenuOnRightClick"; "required": false; "isSignal": true; }; "showPopupToolbar": { "alias": "showPopupToolbar"; "required": false; "isSignal": true; }; }, { "indexChange": "indexChange"; "closed": "closed"; "subtitlesChange": "subtitlesChange"; "presenterViewToggle": "presenterViewToggle"; "annotationsExit": "annotationsExit"; "customShowRequest": "customShowRequest"; "endOfShowChange": "endOfShowChange"; }, never, never, true, never>;
16720
16945
  }
16721
16946
 
16722
16947
  /**
@@ -20305,7 +20530,7 @@ declare class AccountPageComponent {
20305
20530
  readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
20306
20531
  private readonly translate;
20307
20532
  protected readonly swatches: readonly string[];
20308
- protected readonly version = "3.11.0";
20533
+ protected readonly version = "3.12.0";
20309
20534
  protected readonly profile: _angular_core.WritableSignal<ViewerProfile>;
20310
20535
  protected readonly initial: _angular_core.Signal<string>;
20311
20536
  protected readonly usage: _angular_core.WritableSignal<LocalStorageUsageSummary | null>;
@@ -20719,34 +20944,6 @@ declare class PresentationToolbarComponent {
20719
20944
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationToolbarComponent, "pptx-presentation-toolbar", never, { "currentSlideIndex": { "alias": "currentSlideIndex"; "required": true; "isSignal": true; }; "totalSlides": { "alias": "totalSlides"; "required": true; "isSignal": true; }; "presentationStartTime": { "alias": "presentationStartTime"; "required": false; "isSignal": true; }; "presenterMode": { "alias": "presenterMode"; "required": false; "isSignal": true; }; "popupToolbarEnabled": { "alias": "popupToolbarEnabled"; "required": false; "isSignal": true; }; }, { "move": "move"; "endPresentation": "endPresentation"; "presenterViewToggle": "presenterViewToggle"; }, never, never, true, never>;
20720
20945
  }
20721
20946
 
20722
- /**
20723
- * transition-helpers.ts
20724
- *
20725
- * Thin re-export shim over the framework-agnostic slide-transition CSS/keyframe
20726
- * generator in `pptx-viewer-shared` (vendored via `../internal/shared`).
20727
- *
20728
- * The pure logic (direction/orientation resolution, the `pptx-tr-*` keyframe
20729
- * block (`SLIDE_TRANSITION_KEYFRAMES`), and the type→`animation` resolver
20730
- * (`getSlideTransitionAnimations`, including the exotic/3-D 2-D approximations
20731
- * that originated here) now lives in shared and is consumed by every binding.
20732
- *
20733
- * The presentation overlay's duration comes from the shared resolver
20734
- * (`resolveTransitionDurationMs`), exactly as in the other four bindings, so
20735
- * an authored `p14:dur`, the legacy `spd` token and the COM-verified defaults
20736
- * all play at PowerPoint's speed here too. The older local floor/default
20737
- * policy (`MIN_TRANSITION_DURATION_MS` / `DEFAULT_TRANSITION_DURATION_MS` /
20738
- * `resolveTransitionDuration`) stays exported for callers that adopted it, but
20739
- * the overlay no longer consults it.
20740
- */
20741
-
20742
- /**
20743
- * Resolve an effective duration (ms) from an optional authored value, applying
20744
- * the minimum floor and the local default. Kept as a public helper; the
20745
- * presentation overlay resolves through the shared
20746
- * {@link resolveOverlayDurationMs} instead, which is what plays on screen.
20747
- */
20748
- declare function resolveTransitionDuration(durationMs: number | undefined): number;
20749
-
20750
20947
  /** One cross-dissolving pair, as the two single-element slides that paint it. */
20751
20948
  interface MorphCrossfadeGroupSlides {
20752
20949
  key: string;
@@ -20765,6 +20962,7 @@ interface MorphCrossfadeGroupSlides {
20765
20962
  outgoing: PptxSlide;
20766
20963
  incoming: PptxSlide;
20767
20964
  }
20965
+
20768
20966
  /**
20769
20967
  * PresentationTransitionOverlayComponent: plays a PowerPoint slide transition
20770
20968
  * over the presentation stage.
@@ -20825,62 +21023,24 @@ declare class PresentationTransitionOverlayComponent {
20825
21023
  /** Owned `<style>` element carrying the active morph rules, if any. */
20826
21024
  private morphStyle;
20827
21025
  private applyMorphStyle;
20828
- /** Effective transition duration (ms), floored/defaulted. */
21026
+ private readonly state;
20829
21027
  protected readonly resolvedDurationMs: _angular_core.Signal<number>;
20830
- /** Resolved CSS animation descriptors for the outgoing/incoming layers. */
20831
- protected readonly animations: _angular_core.Signal<SlideTransitionAnimations>;
20832
- /**
20833
- * Active Morph plan, or `undefined` for every other transition.
20834
- *
20835
- * Morph travels individual shapes between the two slides rather than wiping
20836
- * the surface, so it changes what this overlay paints: a per-shape copy of
20837
- * the outgoing slide, each one gliding onto its counterpart (dissolving into
20838
- * it when its appearance changed) or fading out in place when it has none.
20839
- * The incoming halves are animated on the live stage by document-level rules
20840
- * (see `morphStyleEffect`).
20841
- */
21028
+ protected readonly animations: _angular_core.Signal<pptx_angular_viewer.SlideTransitionAnimations>;
21029
+ protected readonly fragmented: _angular_core.Signal<FragmentedTransitionDescriptor | undefined>;
21030
+ protected readonly fragmentedOutgoing: _angular_core.Signal<FragmentedLayer | undefined>;
21031
+ protected readonly fragmentedIncoming: _angular_core.Signal<FragmentedLayer | undefined>;
21032
+ protected readonly fragmentedOutgoingZIndex: _angular_core.Signal<number>;
21033
+ protected readonly fragmentedIncomingZIndex: _angular_core.Signal<number>;
21034
+ protected readonly incomingFragmentSlide: _angular_core.Signal<PptxSlide | undefined>;
20842
21035
  protected readonly morphPlan: _angular_core.Signal<MorphTransitionPlan | undefined>;
20843
- /**
20844
- * Whether this overlay is playing a morph.
20845
- *
20846
- * A morph layer paints only the departing slide's paired shapes over the live
20847
- * incoming stage, so its stage background must be dropped
20848
- * (`transparentBackground`). Every other transition animates a whole slide
20849
- * surface out and keeps its own background.
20850
- */
20851
21036
  protected readonly isMorph: _angular_core.Signal<boolean>;
20852
- /** The slide rendered in the animated layer (outgoing + its template). */
20853
21037
  protected readonly layerSlide: _angular_core.Signal<PptxSlide>;
20854
- /**
20855
- * The arriving shapes the morph has to paint over its own ghosts, or
20856
- * `undefined` when there are none (issue #146). They sit on the live stage
20857
- * below this overlay, where the departing layer would hide them for the whole
20858
- * transition; the plan holds that copy invisible and hands them here instead.
20859
- */
20860
21038
  protected readonly liftedSlide: _angular_core.Signal<PptxSlide | undefined>;
20861
- /**
20862
- * The cross-dissolving pairs this overlay paints both halves of, each in its
20863
- * own isolated group so the halves are summed rather than stacked.
20864
- */
20865
21039
  protected readonly crossfadeGroups: _angular_core.Signal<MorphCrossfadeGroupSlides[]>;
20866
- /** Layer container style: animation + stacking relative to the stage. */
20867
- protected readonly layerStyle: _angular_core.Signal<StyleMap>;
20868
- /**
20869
- * The arriving slide rendered ABOVE the outgoing layer for a classic
20870
- * transition, carrying the incoming animation (wipe/cover/fade/push), or
20871
- * `undefined` for morphs and the uncover family (which reveal the live
20872
- * stage instead).
20873
- */
21040
+ protected readonly layerStyle: _angular_core.Signal<pptx_angular_viewer.StyleMap>;
20874
21041
  protected readonly incomingLayerSlide: _angular_core.Signal<PptxSlide | undefined>;
20875
- /** Style for that arriving layer: the incoming animation + its stacking. */
20876
- protected readonly incomingLayerStyle: _angular_core.Signal<StyleMap>;
20877
- /**
20878
- * Slide box sized to the ZOOMED slide footprint, matching the stage's own
20879
- * `pptx-slide-canvas`. The inner canvas renders at the same `zoom` with
20880
- * `autoFit` off, so the outgoing slide is pixel-for-pixel the size of the
20881
- * incoming one for the whole animation.
20882
- */
20883
- protected readonly slideBoxStyle: _angular_core.Signal<StyleMap>;
21042
+ protected readonly incomingLayerStyle: _angular_core.Signal<pptx_angular_viewer.StyleMap>;
21043
+ protected readonly slideBoxStyle: _angular_core.Signal<pptx_angular_viewer.StyleMap>;
20884
21044
  private armCompletion;
20885
21045
  private clearTimer;
20886
21046
  /**
@@ -21085,6 +21245,34 @@ declare class MobilePresenterViewComponent {
21085
21245
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobilePresenterViewComponent, "pptx-mobile-presenter-view", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "currentSlideIndex": { "alias": "currentSlideIndex"; "required": true; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "authoredRange": { "alias": "authoredRange"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "presentationStartTime": { "alias": "presentationStartTime"; "required": false; "isSignal": true; }; }, { "movePresentationSlide": "movePresentationSlide"; "exit": "exit"; }, never, never, true, never>;
21086
21246
  }
21087
21247
 
21248
+ /**
21249
+ * transition-helpers.ts
21250
+ *
21251
+ * Thin re-export shim over the framework-agnostic slide-transition CSS/keyframe
21252
+ * generator in `pptx-viewer-shared` (vendored via `../internal/shared`).
21253
+ *
21254
+ * The pure logic (direction/orientation resolution, the `pptx-tr-*` keyframe
21255
+ * block (`SLIDE_TRANSITION_KEYFRAMES`), and the type→`animation` resolver
21256
+ * (`getSlideTransitionAnimations`, including the exotic/3-D 2-D approximations
21257
+ * that originated here) now lives in shared and is consumed by every binding.
21258
+ *
21259
+ * The presentation overlay's duration comes from the shared resolver
21260
+ * (`resolveTransitionDurationMs`), exactly as in the other four bindings, so
21261
+ * an authored `p14:dur`, the legacy `spd` token and the COM-verified defaults
21262
+ * all play at PowerPoint's speed here too. The older local floor/default
21263
+ * policy (`MIN_TRANSITION_DURATION_MS` / `DEFAULT_TRANSITION_DURATION_MS` /
21264
+ * `resolveTransitionDuration`) stays exported for callers that adopted it, but
21265
+ * the overlay no longer consults it.
21266
+ */
21267
+
21268
+ /**
21269
+ * Resolve an effective duration (ms) from an optional authored value, applying
21270
+ * the minimum floor and the local default. Kept as a public helper; the
21271
+ * presentation overlay resolves through the shared
21272
+ * {@link resolveOverlayDurationMs} instead, which is what plays on screen.
21273
+ */
21274
+ declare function resolveTransitionDuration(durationMs: number | undefined): number;
21275
+
21088
21276
  /**
21089
21277
  * presenter-view-helpers.ts
21090
21278
  *