pptx-angular-viewer 1.1.52 → 1.1.54

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,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { Signal, OnDestroy, OnInit, OnChanges, SimpleChanges, InjectionToken, Provider } from '@angular/core';
3
3
  import * as pptx_viewer_core from 'pptx-viewer-core';
4
- import { PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxElementAnimation, PptxSlide, TextSegment, TextStyle, PptxTransitionType, PptxEmbeddedFont, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, PptxComment, SmartArtLayout, PptxTheme, PptxSlideMaster, PptxCoreProperties, PptxCustomProperty, PptxHeaderFooter, ParsedSignature, PptxTableCell, PptxThemePreset, InkPptxElement, Model3DPptxElement, ZoomPptxElement, PptxSlideTransition, TablePptxElement, ChartPptxElement, SmartArtPptxElement, PptxSmartArtData, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartSeries, PptxChartType, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, PptxAnimationPreset, PptxAnimationTrigger, PptxAnimationTimingCurve, PptxAnimationRepeatMode, PptxAnimationDirection, PptxAnimationSequence, SignatureStatus } from 'pptx-viewer-core';
4
+ import { PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxElementAnimation, PptxSlide, TextSegment, TextStyle, PptxTransitionType, PptxEmbeddedFont, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, PptxComment, SmartArtLayout, PptxTheme, PptxSlideMaster, PptxCoreProperties, PptxCustomProperty, PptxHeaderFooter, ParsedSignature, PptxTableCell, PptxTableData, PptxPresentationProperties, PptxCustomShow, PptxThemePreset, InkPptxElement, Model3DPptxElement, ZoomPptxElement, PptxSlideTransition, TablePptxElement, ChartPptxElement, SmartArtPptxElement, PptxSmartArtData, PptxTableCellStyle, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartSeries, PptxChartType, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, PptxAnimationPreset, PptxAnimationTrigger, PptxAnimationTimingCurve, PptxAnimationRepeatMode, PptxAnimationDirection, PptxAnimationSequence, SignatureStatus } from 'pptx-viewer-core';
5
5
  import * as pptx_angular_viewer from 'pptx-angular-viewer';
6
6
  import { Options } from 'html2canvas-pro';
7
7
  import { SafeHtml } from '@angular/platform-browser';
@@ -649,6 +649,81 @@ declare function revealedElementStyles(groups: readonly AnimationClickGroup[], s
649
649
  */
650
650
  declare function pendingElementStyles(groups: readonly AnimationClickGroup[], step: number): Map<string, CSSProperties>;
651
651
 
652
+ /**
653
+ * table-style.ts — framework-agnostic table render helpers.
654
+ *
655
+ * A focused port of the React table render helpers that operate on the
656
+ * structured {@link PptxTableData} model (not raw OOXML). The renderer is
657
+ * viewer-first: it consumes the already-parsed cell styles, banding flags,
658
+ * and column widths that `pptx-viewer-core` produces, and maps them to CSS.
659
+ *
660
+ * Returns plain {@link TableCellCss} objects (no framework `CSSProperties`
661
+ * type) so React, Vue, and Angular can each apply them to their own style
662
+ * binding.
663
+ *
664
+ * Ports of:
665
+ * - `viewer/utils/table-render-helpers.ts` → {@link cellStyleToCss}
666
+ * - `viewer/utils/table-band-style.tsx` → {@link getTableCellBandStyle}
667
+ *
668
+ * Pattern fills are rendered as tiled inline SVG using {@link getPatternSvg}
669
+ * from `fill-style.ts`, which is already part of the shared barrel.
670
+ * Scheme-colour band resolution uses the optional {@link TableStyleContext}
671
+ * passed to {@link getTableCellBandStyle}.
672
+ */
673
+
674
+ /**
675
+ * Diagonal border info derived from a {@link PptxTableCellStyle}, for the SVG
676
+ * overlay drawn inside a cell. Mirrors the React `DiagonalBorderInfo`.
677
+ */
678
+ interface DiagonalBorderInfo {
679
+ diagDownColor?: string;
680
+ diagDownWidth?: number;
681
+ diagUpColor?: string;
682
+ diagUpWidth?: number;
683
+ }
684
+
685
+ /**
686
+ * table-merge.ts — framework-agnostic table cell merge / split / selection math.
687
+ *
688
+ * Pure operations over the structured {@link PptxTableData} model: compute the
689
+ * bounding rectangle of a cell selection, expand it to cover any merge groups
690
+ * it overlaps, validate whether a selection can be merged or a cell split, and
691
+ * produce new (immutable) `PptxTableData` copies with the merge/split applied.
692
+ *
693
+ * Consolidated from the React viewer's:
694
+ * - `viewer/utils/table-merge-core.ts` → merge / split + rect helpers
695
+ * - `viewer/utils/table-selection-utils.ts` → selection rect / enumeration
696
+ *
697
+ * No framework imports — consumed by every binding (each re-exports these
698
+ * symbols through its own thin shim so colocated consumers keep their import
699
+ * paths unchanged).
700
+ */
701
+
702
+ /** A cell coordinate within a table (0-based). */
703
+ interface CellCoord {
704
+ row: number;
705
+ col: number;
706
+ }
707
+
708
+ /**
709
+ * table-style-presets.ts - framework-agnostic table style preset catalogue.
710
+ *
711
+ * Pure data: the quick-style swatches (light / medium / dark families) shown in
712
+ * every binding's table properties panel. Each preset carries the header fill /
713
+ * foreground, banded-row background, and border colour applied when the user
714
+ * picks it. Ported from the React viewer's `constants/table-styles.ts` so React,
715
+ * Vue, and Angular consume one copy.
716
+ */
717
+ /** A single table quick-style swatch. */
718
+ interface TableStylePreset {
719
+ id: string;
720
+ label: string;
721
+ headerBg: string;
722
+ headerFg: string;
723
+ bandBg: string;
724
+ borderColor: string;
725
+ }
726
+
652
727
  /**
653
728
  * Framework-agnostic helpers for inline (on-canvas) SmartArt node text editing.
654
729
  *
@@ -1379,6 +1454,51 @@ declare function derivePresenceList(states: Map<number, Record<string, unknown>>
1379
1454
  */
1380
1455
  declare function presenceToCursors(presence: readonly SanitizedPresence[], activeSlideIndex?: number): RemoteCursor[];
1381
1456
 
1457
+ /**
1458
+ * slide-compare — pure, framework-agnostic slide-diff engine shared by every
1459
+ * binding (React / Vue / Angular).
1460
+ *
1461
+ * Provides two entry points over the same element-diff core:
1462
+ * - `comparePresentation(base, compare)` — diffs two full `PptxData` documents
1463
+ * (the React surface).
1464
+ * - `compareSlides(base, compare)` — diffs two `PptxSlide[]` arrays directly
1465
+ * (the Vue editor-foundation surface), plus `compareSlide` for a single
1466
+ * slide pair and `diffSlideElements` for the flattened element trees.
1467
+ *
1468
+ * DOM-free and side-effect-free.
1469
+ */
1470
+
1471
+ type SlideDiffStatus = 'added' | 'removed' | 'changed' | 'unchanged';
1472
+ type ElementChangeKind = 'added' | 'removed' | 'moved' | 'resized' | 'textChanged';
1473
+ interface ElementChange {
1474
+ elementId: string;
1475
+ label: string;
1476
+ kind: ElementChangeKind;
1477
+ description: string;
1478
+ }
1479
+ interface SlideDiff {
1480
+ status: SlideDiffStatus;
1481
+ /** Index in the base (current) presentation, or -1 for added slides. */
1482
+ baseIndex: number;
1483
+ /** Index in the compare (other) presentation, or -1 for removed slides. */
1484
+ compareIndex: number;
1485
+ /** The base slide data (undefined for added slides). */
1486
+ baseSlide?: PptxSlide;
1487
+ /** The compare slide data (undefined for removed slides). */
1488
+ compareSlide?: PptxSlide;
1489
+ /** Per-element changes when status is `changed`. */
1490
+ changes: ElementChange[];
1491
+ }
1492
+ interface CompareResult {
1493
+ diffs: SlideDiff[];
1494
+ baseSlideCount: number;
1495
+ compareSlideCount: number;
1496
+ addedCount: number;
1497
+ removedCount: number;
1498
+ changedCount: number;
1499
+ unchangedCount: number;
1500
+ }
1501
+
1382
1502
  /**
1383
1503
  * `slide-transition-types` — pure types, direction/orientation resolution, and
1384
1504
  * shared constants backing the slide-transition CSS resolver.
@@ -1807,6 +1927,17 @@ interface CustomShow {
1807
1927
  slideIds: readonly string[];
1808
1928
  }
1809
1929
 
1930
+ /**
1931
+ * Format an epoch-ms timestamp as a short month / day / time label, e.g.
1932
+ * "Jun 25, 02:14", for the version-history panels.
1933
+ */
1934
+ declare function formatVersionTimestamp(ts: number): string;
1935
+ /**
1936
+ * Format an epoch-ms timestamp as a coarse relative label ("Just now", "5m
1937
+ * ago", "3h ago", "2d ago").
1938
+ */
1939
+ declare function formatRelativeTime(ts: number): string;
1940
+
1810
1941
  /**
1811
1942
  * broadcast-helpers.ts: framework-agnostic helpers for the Broadcast dialog,
1812
1943
  * shared by the React, Vue and Angular bindings.
@@ -2043,7 +2174,7 @@ declare function issueTrackKey(issue: AccessibilityIssue, index: number): string
2043
2174
  */
2044
2175
 
2045
2176
  /** A single gradient stop, mirroring the ShapeStyle array item shape. */
2046
- interface GradientStop {
2177
+ interface GradientStop$1 {
2047
2178
  color: string;
2048
2179
  position: number;
2049
2180
  opacity?: number;
@@ -2053,7 +2184,7 @@ interface GradientState {
2053
2184
  type: 'linear' | 'radial';
2054
2185
  /** Angle in degrees (only meaningful for linear). */
2055
2186
  angle: number;
2056
- stops: GradientStop[];
2187
+ stops: GradientStop$1[];
2057
2188
  }
2058
2189
 
2059
2190
  /**
@@ -2880,6 +3011,41 @@ declare class MobileBottomBarComponent {
2880
3011
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileBottomBarComponent, "pptx-mobile-bottom-bar", never, { "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "activeSheet": { "alias": "activeSheet"; "required": false; "isSignal": true; }; }, { "openSlides": "openSlides"; "insert": "insert"; "openFormat": "openFormat"; "openComments": "openComments"; "notes": "notes"; }, never, never, true, never>;
2881
3012
  }
2882
3013
 
3014
+ /**
3015
+ * presentation-annotations-helpers.ts: Pure geometry helpers for presentation
3016
+ * ink annotations (pen, highlighter, eraser, laser).
3017
+ *
3018
+ * Ported from React:
3019
+ * packages/react/src/viewer/components/PresentationAnnotationOverlay.tsx
3020
+ * packages/react/src/viewer/hooks/usePresentationAnnotations.ts
3021
+ *
3022
+ * No Angular dependencies; all functions are pure so they can be unit-tested
3023
+ * without TestBed.
3024
+ */
3025
+ /** A single {x, y} coordinate in slide-space pixels. */
3026
+ interface AnnotationPoint {
3027
+ x: number;
3028
+ y: number;
3029
+ }
3030
+ /** An ink stroke: a sequence of points with visual properties. */
3031
+ interface AnnotationStroke {
3032
+ id: string;
3033
+ points: AnnotationPoint[];
3034
+ color: string;
3035
+ width: number;
3036
+ /** 1 = opaque (pen); 0.4 = semi-transparent (highlighter). */
3037
+ opacity: number;
3038
+ }
3039
+ /** The tool currently armed in presentation mode. */
3040
+ type PresentationTool = 'none' | 'pen' | 'highlighter' | 'eraser' | 'laser';
3041
+ /** Per-slide annotation storage: slide index → strokes. */
3042
+ type SlideAnnotationMap = Map<number, AnnotationStroke[]>;
3043
+ /** Transient laser-pointer position in slide-space pixels. */
3044
+ interface LaserPosition {
3045
+ x: number;
3046
+ y: number;
3047
+ }
3048
+
2883
3049
  /** BroadcastChannel name shared between presenter and audience tabs. */
2884
3050
  declare const PRESENTER_CHANNEL_NAME = "pptx-viewer-presenter";
2885
3051
  /** Unique origin identifier so we only react to our own messages. */
@@ -3189,74 +3355,55 @@ declare function getTextBlockStyle(el: PptxElement): StyleMap;
3189
3355
  declare function getImageSrc(el: PptxElement, mediaDataUrls: Map<string, string>): string | undefined;
3190
3356
 
3191
3357
  /**
3192
- * Pure, framework-agnostic helpers for table rendering.
3358
+ * table-cell-style.ts: pure cell/run style projection for table rendering.
3359
+ *
3360
+ * Extracted from `table-renderer-helpers.ts` (which now re-exports these for a
3361
+ * stable public surface) to keep each module focused and under the repo's
3362
+ * per-file line budget.
3193
3363
  *
3194
3364
  * Ported from:
3195
3365
  * - packages/react/src/viewer/utils/table-render-helpers.ts (cellStyleToCss,
3196
3366
  * ooxmlDashToCssBorderStyle)
3197
- * - packages/react/src/viewer/utils/table-render-data.tsx (row / cell
3198
- * view-model projection)
3199
3367
  *
3200
3368
  * All functions are pure (no Angular dependencies) so they can be unit-tested
3201
3369
  * with plain vitest without TestBed or the Angular compiler.
3202
3370
  */
3203
3371
 
3204
- /**
3205
- * A single styled text run inside a cell paragraph.
3206
- *
3207
- * The `style` map is an `[ngStyle]`-compatible object derived from the cell's
3208
- * `PptxTableCellStyle` (bold, italic, underline, color, fontSize). When the
3209
- * cell has no style the map is empty ({}) and CSS inherits.
3210
- *
3211
- * `isLineBreak` is true for soft line-break runs. The template renders them
3212
- * as `<br>`.
3213
- */
3372
+ /** A single styled text run inside a cell paragraph. */
3214
3373
  interface CellTextRun {
3215
3374
  text: string;
3216
3375
  style: StyleMap;
3217
3376
  isLineBreak?: true;
3218
3377
  }
3219
- /**
3220
- * A single paragraph inside a table cell, made up of one or more `CellTextRun`s.
3221
- *
3222
- * In the current implementation each paragraph has exactly one run (styled by
3223
- * the cell-level `PptxTableCellStyle`). When the core later exposes per-run
3224
- * segments on `PptxTableCell`, additional runs per paragraph will be populated.
3225
- */
3378
+ /** A single paragraph inside a table cell, made up of one or more `CellTextRun`s. */
3226
3379
  type CellParagraph = CellTextRun[];
3380
+
3227
3381
  /**
3228
- * A flattened cell descriptor ready for template iteration. Cells flagged
3229
- * `hMerge` or `vMerge` are excluded; the template produces no `<td>` for
3230
- * them (the origin cell's colspan/rowspan expands to cover the gap).
3382
+ * Pure, framework-agnostic helpers for table rendering (view-model projection).
3383
+ *
3384
+ * Cell/run style projection lives in `table-cell-style.ts`; it is re-exported
3385
+ * here so the public surface (and colocated tests) keep importing the style
3386
+ * helpers from `table-renderer-helpers` unchanged.
3387
+ *
3388
+ * Ported from:
3389
+ * - packages/react/src/viewer/utils/table-render-data.tsx (row / cell
3390
+ * view-model projection)
3391
+ * - packages/react/src/viewer/utils/table-band-style.tsx (banding)
3392
+ * - packages/react/src/viewer/utils/table-diagonal-borders.tsx (diagonals)
3231
3393
  */
3394
+
3395
+ /** A flattened cell descriptor ready for template iteration. */
3232
3396
  interface TableCellViewModel {
3233
3397
  cell: PptxTableCell;
3234
- /** Original row index of this cell in `tableData.rows` (for inline edit). */
3235
3398
  rowIndex: number;
3236
- /** Original column index of this cell in its row (for inline edit). */
3237
3399
  colIndex: number;
3238
- /** Resolved colspan from `gridSpan` (>= 2) or undefined. */
3239
3400
  colSpan: number | undefined;
3240
- /** Resolved rowspan from `rowSpan` (>= 2) or undefined. */
3241
3401
  rowSpan: number | undefined;
3242
- /** Pre-computed `[ngStyle]` map for this cell's `<td>`. */
3243
3402
  tdStyle: StyleMap;
3244
- /**
3245
- * Display text: non-breaking space when the cell is empty to keep the row
3246
- * height. Used as fallback when `paragraphs` is empty (no text AND no style).
3247
- */
3248
3403
  displayText: string;
3249
- /**
3250
- * Rich-text paragraphs built from the cell's text content and cell-level
3251
- * style. When non-empty the template renders this instead of `displayText`.
3252
- * Each entry is a paragraph (array of styled runs); runs with `isLineBreak`
3253
- * render as `<br>`.
3254
- *
3255
- * When this array is empty (cell is completely empty + unstyled) the template
3256
- * falls back to rendering `displayText` (a non-breaking space) so the row
3257
- * retains its height.
3258
- */
3259
3404
  paragraphs: CellParagraph[];
3405
+ /** Diagonal border overlay info, or null when the cell has none. */
3406
+ diagonal: DiagonalBorderInfo | null;
3260
3407
  }
3261
3408
  interface TableRowViewModel {
3262
3409
  rowStyle: StyleMap;
@@ -3271,56 +3418,116 @@ interface TableCellCommit {
3271
3418
  }
3272
3419
  /**
3273
3420
  * TableRendererComponent: Angular port of the React `renderTableFromTableData`
3274
- * (packages/react/src/viewer/utils/table-render-data.tsx).
3275
- *
3276
- * Renders a `<table>` from the typed `PptxTableData` structure that the core
3277
- * parser populates on every `TablePptxElement`. This is the viewer-first path:
3278
- * editing, resize overlays, and inline cell input are not yet ported.
3279
- *
3280
- * Key behaviours:
3281
- * - Merged cells: cells with `hMerge`/`vMerge` are skipped; the origin cell
3282
- * receives `[attr.colspan]`/`[attr.rowspan]` from `gridSpan`/`rowSpan`.
3283
- * - Column widths: a `<colgroup>` drives proportional widths from
3284
- * `PptxTableData.columnWidths` (0–1 fractions).
3285
- * - Row heights: `[ngStyle]` on `<tr>` sets an explicit pixel height when
3286
- * `PptxTableRow.height` is present.
3287
- * - Cell fill: solid `backgroundColor` or the parser's pre-built
3288
- * `gradientFillCss` string (gradient). Pattern fills are deferred.
3289
- * - Cell borders: per-edge (top/bottom/left/right) width + colour.
3290
- * - Cell text: rich-text paragraphs of styled `<span>` runs when the cell
3291
- * carries text or formatting; falls back to a non-breaking-space placeholder
3292
- * for empty+unstyled cells (preserves row height).
3293
- *
3294
- * Pure helpers (view-model projection, style maps) live in
3295
- * `table-renderer-helpers.ts` so tests can exercise them without TestBed.
3421
+ * (packages/react/src/viewer/utils/table-render-data.tsx) plus the editor
3422
+ * overlays (`table-render.tsx` selection, `table-render-resize.tsx` handles).
3423
+ *
3424
+ * Renders a `<table>` from the typed `PptxTableData` structure. Behaviours:
3425
+ * - Merged cells resolve to `colspan`/`rowspan`; banding is baked into the
3426
+ * per-cell style; diagonal borders render as an SVG overlay.
3427
+ * - Editing (when `editable`): single click selects a cell, Shift+Click extends
3428
+ * a rectangular range (both via {@link TableSelectionService}, shared with the
3429
+ * inspector), double click opens an inline text input, and drag handles on the
3430
+ * column / row boundaries resize the table (emitted through `tableChange`).
3431
+ *
3432
+ * Pure helpers live in `table-renderer-helpers.ts` / `table-cell-style.ts`.
3296
3433
  */
3297
3434
  declare class TableRendererComponent {
3298
3435
  private readonly injector;
3436
+ /** Shared cell-selection state (present only inside the editor subtree). */
3437
+ private readonly selectionSvc;
3299
3438
  /** The table element to render. Must be `type === 'table'`. */
3300
3439
  readonly element: _angular_core.InputSignal<PptxElement>;
3301
- /** Whether inline cell editing (double-tap text input) is enabled. */
3440
+ /** Whether inline cell editing / selection / resize is enabled. */
3302
3441
  readonly editable: _angular_core.InputSignal<boolean>;
3303
3442
  /** Emitted when a cell edit is committed (Enter / blur). */
3304
3443
  readonly cellCommit: _angular_core.OutputEmitterRef<TableCellCommit>;
3444
+ /** Emitted when a structural table change (resize) should be persisted. */
3445
+ readonly tableChange: _angular_core.OutputEmitterRef<{
3446
+ id: string;
3447
+ tableData: PptxTableData;
3448
+ }>;
3305
3449
  /** The cell currently being edited (original grid coords), or null. */
3306
3450
  private readonly editingCell;
3307
3451
  /** The mounted `<input>` for the active cell edit, if any. */
3308
3452
  private readonly cellInput;
3309
3453
  /** Pre-computed `<col>` styles for the colgroup. */
3310
3454
  readonly colStyles: _angular_core.Signal<StyleMap[]>;
3311
- /** Projected view-model rows with merged-cell resolution applied. */
3455
+ /** Projected view-model rows with merged-cell resolution + banding applied. */
3312
3456
  readonly rows: _angular_core.Signal<TableRowViewModel[]>;
3457
+ /** Column widths (0-1 fractions) for the resize overlay. */
3458
+ readonly columnWidths: _angular_core.Signal<number[]>;
3313
3459
  constructor();
3460
+ private tableData;
3314
3461
  /** True when the given cell (original grid coords) is being edited. */
3315
3462
  isEditing(rowIndex: number, colIndex: number): boolean;
3316
- /** Double-tap / double-click on a cell enters inline edit mode. */
3463
+ /** True when the cell is the current selection anchor for this element. */
3464
+ isSelectedAnchor(rowIndex: number, colIndex: number): boolean;
3465
+ /** True when the cell falls inside the active Shift+Click range. */
3466
+ isInRange(rowIndex: number, colIndex: number): boolean;
3467
+ /** Single click selects the cell; Shift+Click extends a rectangular range. */
3468
+ onCellClick(event: MouseEvent, rowIndex: number, colIndex: number): void;
3469
+ /** Double-click on a cell enters inline edit mode. */
3317
3470
  onCellDblClick(event: Event, rowIndex: number, colIndex: number): void;
3318
3471
  /** Commit the current edit (called on blur). */
3319
3472
  commitCellEdit(event: Event): void;
3320
- /** Enter commits, Escape cancels. Stops propagation so the canvas ignores it. */
3473
+ /** Enter/Tab commits, Escape cancels. Stops propagation so the canvas ignores it. */
3321
3474
  onCellInputKeydown(event: KeyboardEvent): void;
3475
+ /** Persist a column-width drag by emitting new table data. */
3476
+ onResizeColumns(newWidths: number[]): void;
3477
+ /** Persist a row-height drag by emitting new table data. */
3478
+ onResizeRow(event: {
3479
+ index: number;
3480
+ height: number;
3481
+ }): void;
3322
3482
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableRendererComponent, never>;
3323
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableRendererComponent, "pptx-table-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; }, { "cellCommit": "cellCommit"; }, never, never, true, never>;
3483
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableRendererComponent, "pptx-table-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; }, { "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
3484
+ }
3485
+
3486
+ declare class ViewerDialogsService {
3487
+ /** Equation editor dialog visibility. */
3488
+ readonly showEquation: _angular_core.WritableSignal<boolean>;
3489
+ /** OMML of the equation being edited (null when inserting a fresh one). */
3490
+ readonly editingEquationOmml: _angular_core.WritableSignal<Record<string, unknown> | null>;
3491
+ /** Id of the element whose equation is being edited (null when inserting). */
3492
+ readonly editingEquationElementId: _angular_core.WritableSignal<string | null>;
3493
+ /** Set-up-slide-show dialog visibility. */
3494
+ readonly showSetUpSlideShow: _angular_core.WritableSignal<boolean>;
3495
+ /** In-session presentation properties (advance mode, loop, subtitles, ...). */
3496
+ readonly presentationProperties: _angular_core.WritableSignal<PptxPresentationProperties>;
3497
+ /** Password-protection dialog visibility. */
3498
+ readonly showPassword: _angular_core.WritableSignal<boolean>;
3499
+ /** Whether a save password is currently set. */
3500
+ readonly isPasswordProtected: _angular_core.WritableSignal<boolean>;
3501
+ /** The password applied on the next save (null when none). */
3502
+ readonly presentationPassword: _angular_core.WritableSignal<string | null>;
3503
+ /** Encrypted-file information dialog visibility. */
3504
+ readonly showEncrypted: _angular_core.WritableSignal<boolean>;
3505
+ /** Compare side panel visibility. */
3506
+ readonly showCompare: _angular_core.WritableSignal<boolean>;
3507
+ /** Slide-diff result shown in the compare panel (null when none loaded). */
3508
+ readonly compareResult: _angular_core.WritableSignal<CompareResult | null>;
3509
+ /** Font-embedding panel visibility. */
3510
+ readonly showFontEmbedding: _angular_core.WritableSignal<boolean>;
3511
+ /** Whether embedding used fonts on save is enabled. */
3512
+ readonly embedFontsEnabled: _angular_core.WritableSignal<boolean>;
3513
+ /** Version-history side panel visibility. */
3514
+ readonly showVersionHistory: _angular_core.WritableSignal<boolean>;
3515
+ /** Keyboard-shortcuts help overlay visibility. */
3516
+ readonly showShortcuts: _angular_core.WritableSignal<boolean>;
3517
+ /** Keep-annotations dialog visibility. */
3518
+ readonly showKeepAnnotations: _angular_core.WritableSignal<boolean>;
3519
+ /** Total ink annotation stroke count carried into the prompt. */
3520
+ readonly keepAnnotationCount: _angular_core.WritableSignal<number>;
3521
+ /** Number of slides that carry annotations. */
3522
+ readonly keepSlideCount: _angular_core.WritableSignal<number>;
3523
+ /** Signature-stripped warning dialog visibility. */
3524
+ readonly showSignatureStripped: _angular_core.WritableSignal<boolean>;
3525
+ /** Open the equation editor for a fresh insert. */
3526
+ openEquationInsert(): void;
3527
+ /** Open the equation editor to edit an existing element's equation. */
3528
+ openEquationEdit(elementId: string, omml: Record<string, unknown>): void;
3529
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewerDialogsService, never>;
3530
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ViewerDialogsService>;
3324
3531
  }
3325
3532
 
3326
3533
  /**
@@ -3349,6 +3556,12 @@ declare class PowerPointViewerComponent {
3349
3556
  readonly class: _angular_core.InputSignal<string>;
3350
3557
  /** Theme configuration for customising the viewer's appearance. */
3351
3558
  readonly theme: _angular_core.InputSignal<ViewerTheme | undefined>;
3559
+ /**
3560
+ * Host file path/identifier keying the version-history store. When omitted
3561
+ * the version-history panel shows its empty state. Mirrors React's
3562
+ * `filePath` prop.
3563
+ */
3564
+ readonly filePath: _angular_core.InputSignal<string | undefined>;
3352
3565
  /** Optional real-time collaboration config; when set, connects and shows remote cursors. */
3353
3566
  readonly collaboration: _angular_core.InputSignal<CollaborationConfig | undefined>;
3354
3567
  /**
@@ -3409,6 +3622,14 @@ declare class PowerPointViewerComponent {
3409
3622
  private readonly smartArt3DSvc;
3410
3623
  private readonly zoomTarget;
3411
3624
  protected readonly presenterWindow: PresenterWindowService;
3625
+ protected readonly dialogs: ViewerDialogsService;
3626
+ private readonly compareSvc;
3627
+ /** Handle on the secondary-dialog host (keep-annotations prompt). */
3628
+ private readonly extraDialogs;
3629
+ /** Surface the encrypted-file notice dialog alongside the inline fallback. */
3630
+ private readonly encryptedNotice;
3631
+ /** Custom shows mapped to the core shape consumed by set-up-slide-show. */
3632
+ protected readonly pptxCustomShows: _angular_core.Signal<PptxCustomShow[]>;
3412
3633
  /** The `<main>` host; used to locate the live `.pptx-ng-canvas-stage`. */
3413
3634
  private readonly mainEl;
3414
3635
  /** True while a PNG/PDF export is in progress (disables the buttons). */
@@ -3665,6 +3886,22 @@ declare class PowerPointViewerComponent {
3665
3886
  presentPresenter(): void;
3666
3887
  /** Close the presenter view (and any audience overlay/window it opened). */
3667
3888
  exitPresenter(): void;
3889
+ /** Review ▸ Compare: pick a `.pptx` and diff it against the current deck. */
3890
+ protected onOpenCompare(): void;
3891
+ /**
3892
+ * Double-click text edit entry: equations open the equation editor instead
3893
+ * of the inline text editor (mirrors React's dbl-click-to-edit-equation).
3894
+ */
3895
+ protected onTextEditStart(id: string): void;
3896
+ /** Apply a Ctrl/Cmd+B/I/U toggle from the inline editor (undoable). */
3897
+ protected onTextFormat(event: {
3898
+ id: string;
3899
+ updates: Partial<TextStyle>;
3900
+ }): void;
3901
+ /** Presentation exited with ink on it: offer the keep/discard prompt. */
3902
+ protected onPresentationAnnotationsExit(map: SlideAnnotationMap): void;
3903
+ /** Swap the deck for a restored version-history snapshot. */
3904
+ protected onRestoreVersion(bytes: Uint8Array): void;
3668
3905
  /** Toggle the speaker-notes strip. */
3669
3906
  toggleNotes(): void;
3670
3907
  /**
@@ -3807,6 +4044,14 @@ declare class PowerPointViewerComponent {
3807
4044
  id: string;
3808
4045
  commit: TableCellCommit;
3809
4046
  }): void;
4047
+ /**
4048
+ * Persist a structural table change originating on the canvas (column / row
4049
+ * drag-resize) as one undoable history entry.
4050
+ */
4051
+ protected onTableChange(event: {
4052
+ id: string;
4053
+ tableData: PptxTableData;
4054
+ }): void;
3810
4055
  /**
3811
4056
  * Editing keyboard shortcuts (only when `canEdit` and not typing in a
3812
4057
  * field or presenting): Delete, Ctrl/Cmd+Z/Y undo/redo, Ctrl/Cmd+D
@@ -3842,7 +4087,7 @@ declare class PowerPointViewerComponent {
3842
4087
  /** Export every slide as a WebM video (3s per slide) via MediaRecorder. */
3843
4088
  exportVideo(): Promise<void>;
3844
4089
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PowerPointViewerComponent, never>;
3845
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PowerPointViewerComponent, "pptx-viewer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "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; }; }, { "activeSlideChange": "activeSlideChange"; "dirtyChange": "dirtyChange"; "contentChange": "contentChange"; "propertiesChange": "propertiesChange"; "startCollaboration": "startCollaboration"; "stopCollaboration": "stopCollaboration"; }, never, never, true, never>;
4090
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PowerPointViewerComponent, "pptx-viewer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "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; }; }, { "activeSlideChange": "activeSlideChange"; "dirtyChange": "dirtyChange"; "contentChange": "contentChange"; "propertiesChange": "propertiesChange"; "startCollaboration": "startCollaboration"; "stopCollaboration": "stopCollaboration"; }, never, never, true, never>;
3846
4091
  }
3847
4092
 
3848
4093
  /** The eight resize-handle positions around a selection box. */
@@ -3996,6 +4241,11 @@ declare class SlideCanvasComponent {
3996
4241
  }>;
3997
4242
  /** Emitted when an inline edit is cancelled (Escape). */
3998
4243
  readonly textCancel: _angular_core.OutputEmitterRef<void>;
4244
+ /** Emitted on Ctrl/Cmd+B/I/U while inline-editing (parity with React/Vue). */
4245
+ readonly textFormat: _angular_core.OutputEmitterRef<{
4246
+ id: string;
4247
+ updates: Partial<TextStyle>;
4248
+ }>;
3999
4249
  /** Emitted during a rotate gesture with the new rotation (degrees). */
4000
4250
  readonly rotateUpdate: _angular_core.OutputEmitterRef<{
4001
4251
  id: string;
@@ -4012,6 +4262,11 @@ declare class SlideCanvasComponent {
4012
4262
  id: string;
4013
4263
  commit: TableCellCommit;
4014
4264
  }>;
4265
+ /** Emitted when a structural table change (drag-resize) should be persisted. */
4266
+ readonly tableChange: _angular_core.OutputEmitterRef<{
4267
+ id: string;
4268
+ tableData: PptxTableData;
4269
+ }>;
4015
4270
  private drag;
4016
4271
  private editCancelled;
4017
4272
  /** Active guide-drag state (id + axis only), or null when nothing is being dragged. */
@@ -4156,6 +4411,8 @@ declare class SlideCanvasComponent {
4156
4411
  } | null>;
4157
4412
  onDblClick(event: MouseEvent): void;
4158
4413
  onEditorKeydown(event: KeyboardEvent): void;
4414
+ /** Toggle bold/italic/underline for the element under inline edit. */
4415
+ private emitTextFormat;
4159
4416
  commitText(event: Event, id: string): void;
4160
4417
  onContextMenu(event: MouseEvent): void;
4161
4418
  onHandlePointerDown(event: PointerEvent, handle: ResizeHandle): void;
@@ -4191,7 +4448,7 @@ declare class SlideCanvasComponent {
4191
4448
  readonly vRulerTicks: _angular_core.Signal<readonly RulerTick[]>;
4192
4449
  readonly stageStyle: _angular_core.Signal<StyleMap>;
4193
4450
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideCanvasComponent, never>;
4194
- 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; }; "snapToGuides": { "alias": "snapToGuides"; "required": false; "isSignal": true; }; "autoFit": { "alias": "autoFit"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "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"; "rotateUpdate": "rotateUpdate"; "marqueeSelect": "marqueeSelect"; "inkStrokeComplete": "inkStrokeComplete"; "eraserHit": "eraserHit"; "cellCommit": "cellCommit"; }, never, never, true, never>;
4451
+ 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; }; "snapToGuides": { "alias": "snapToGuides"; "required": false; "isSignal": true; }; "autoFit": { "alias": "autoFit"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "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>;
4195
4452
  }
4196
4453
 
4197
4454
  /**
@@ -4410,6 +4667,11 @@ declare class ElementRendererComponent {
4410
4667
  id: string;
4411
4668
  commit: TableCellCommit;
4412
4669
  }>;
4670
+ /** Emitted when a structural table change (drag-resize) should be persisted. */
4671
+ readonly tableChange: _angular_core.OutputEmitterRef<{
4672
+ id: string;
4673
+ tableData: PptxTableData;
4674
+ }>;
4413
4675
  /** Duotone SVG `<filter>` descriptor for this element, if any. */
4414
4676
  readonly duotoneFilter: _angular_core.Signal<pptx_angular_viewer.DuotoneFilterDef | undefined>;
4415
4677
  /**
@@ -4448,7 +4710,7 @@ declare class ElementRendererComponent {
4448
4710
  readonly hasText: _angular_core.Signal<boolean>;
4449
4711
  readonly placeholderLabel: _angular_core.Signal<string>;
4450
4712
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementRendererComponent, never>;
4451
- 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; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "fieldContext": { "alias": "fieldContext"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; }, { "cellCommit": "cellCommit"; }, never, never, true, never>;
4713
+ 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; }; "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>;
4452
4714
  }
4453
4715
 
4454
4716
  /**
@@ -5117,41 +5379,6 @@ declare class AnimationPlaybackService {
5117
5379
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AnimationPlaybackService>;
5118
5380
  }
5119
5381
 
5120
- /**
5121
- * presentation-annotations-helpers.ts: Pure geometry helpers for presentation
5122
- * ink annotations (pen, highlighter, eraser, laser).
5123
- *
5124
- * Ported from React:
5125
- * packages/react/src/viewer/components/PresentationAnnotationOverlay.tsx
5126
- * packages/react/src/viewer/hooks/usePresentationAnnotations.ts
5127
- *
5128
- * No Angular dependencies; all functions are pure so they can be unit-tested
5129
- * without TestBed.
5130
- */
5131
- /** A single {x, y} coordinate in slide-space pixels. */
5132
- interface AnnotationPoint {
5133
- x: number;
5134
- y: number;
5135
- }
5136
- /** An ink stroke: a sequence of points with visual properties. */
5137
- interface AnnotationStroke {
5138
- id: string;
5139
- points: AnnotationPoint[];
5140
- color: string;
5141
- width: number;
5142
- /** 1 = opaque (pen); 0.4 = semi-transparent (highlighter). */
5143
- opacity: number;
5144
- }
5145
- /** The tool currently armed in presentation mode. */
5146
- type PresentationTool = 'none' | 'pen' | 'highlighter' | 'eraser' | 'laser';
5147
- /** Per-slide annotation storage: slide index → strokes. */
5148
- type SlideAnnotationMap = Map<number, AnnotationStroke[]>;
5149
- /** Transient laser-pointer position in slide-space pixels. */
5150
- interface LaserPosition {
5151
- x: number;
5152
- y: number;
5153
- }
5154
-
5155
5382
  declare class PresentationAnnotationsService {
5156
5383
  private readonly destroyRef;
5157
5384
  private readonly _tool;
@@ -5322,6 +5549,11 @@ declare class PresentationOverlayComponent implements OnInit {
5322
5549
  readonly startIndex: _angular_core.InputSignal<number>;
5323
5550
  readonly indexChange: _angular_core.OutputEmitterRef<number>;
5324
5551
  readonly closed: _angular_core.OutputEmitterRef<void>;
5552
+ /**
5553
+ * Fired just before `closed` when the show carries ink annotations, so the
5554
+ * host can offer the keep/discard prompt (mirrors React's exit flow).
5555
+ */
5556
+ readonly annotationsExit: _angular_core.OutputEmitterRef<SlideAnnotationMap>;
5325
5557
  /** Zero-based index into `slides()`. */
5326
5558
  protected readonly currentIndex: _angular_core.WritableSignal<number>;
5327
5559
  /**
@@ -5419,7 +5651,7 @@ declare class PresentationOverlayComponent implements OnInit {
5419
5651
  private goToSlide;
5420
5652
  private emitClosed;
5421
5653
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PresentationOverlayComponent, never>;
5422
- 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; }; }, { "indexChange": "indexChange"; "closed": "closed"; }, never, never, true, never>;
5654
+ 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; }; }, { "indexChange": "indexChange"; "closed": "closed"; "annotationsExit": "annotationsExit"; }, never, never, true, never>;
5423
5655
  }
5424
5656
 
5425
5657
  /**
@@ -5702,11 +5934,15 @@ declare class TableDataEditorComponent {
5702
5934
  readonly canEdit: _angular_core.InputSignal<boolean>;
5703
5935
  /** Emits the updated element after any edit operation. */
5704
5936
  readonly elementChange: _angular_core.OutputEmitterRef<TablePptxElement>;
5937
+ /** Shared cell selection (drives the cell-formatting panel + context menu). */
5938
+ private readonly selection;
5705
5939
  protected readonly rows: _angular_core.Signal<pptx_viewer_core.PptxTableRow[]>;
5706
5940
  protected readonly rowCount: _angular_core.Signal<number>;
5707
5941
  protected readonly colCount: _angular_core.Signal<number>;
5708
5942
  protected readonly colIndices: _angular_core.Signal<number[]>;
5709
5943
  protected onCellChange(event: Event, rowIndex: number, colIndex: number): void;
5944
+ /** Focusing a cell selects it so the cell-formatting panel targets it. */
5945
+ protected onCellFocus(rowIndex: number, colIndex: number): void;
5710
5946
  protected onAddRow(): void;
5711
5947
  protected onRemoveLastRow(): void;
5712
5948
  protected onRemoveRow(rowIndex: number): void;
@@ -5717,6 +5953,222 @@ declare class TableDataEditorComponent {
5717
5953
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableDataEditorComponent, "pptx-table-data-editor", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, { "elementChange": "elementChange"; }, never, never, true, never>;
5718
5954
  }
5719
5955
 
5956
+ /**
5957
+ * table-properties-helpers.ts: pure helpers for the table properties inspector.
5958
+ *
5959
+ * The small immutable transforms behind the Angular port of the React
5960
+ * `TablePropertiesPanel` / `TableCellAdvancedFill`: applying a quick-style
5961
+ * preset, redistributing a single column's width across its neighbours,
5962
+ * even-distributing column widths / row heights, and building a CSS gradient
5963
+ * string from structured stops so the renderer shows edited gradients live.
5964
+ *
5965
+ * No Angular imports, so they are unit-testable with plain vitest.
5966
+ */
5967
+
5968
+ /** The boolean structure/style flags on `PptxTableData` the toggles can flip. */
5969
+ type TableBooleanFlag = 'bandedRows' | 'firstRowHeader' | 'bandedColumns' | 'firstCol' | 'lastCol' | 'lastRow';
5970
+
5971
+ declare class TablePropertiesComponent {
5972
+ /** The table element being edited. */
5973
+ readonly element: _angular_core.InputSignal<TablePptxElement>;
5974
+ /** Whether editing is enabled. */
5975
+ readonly canEdit: _angular_core.InputSignal<boolean>;
5976
+ /** Emits the fully-updated element after any edit. */
5977
+ readonly elementChange: _angular_core.OutputEmitterRef<TablePptxElement>;
5978
+ protected readonly toggles: readonly {
5979
+ key: TableBooleanFlag;
5980
+ label: string;
5981
+ }[];
5982
+ protected readonly presets: TableStylePreset[];
5983
+ protected readonly defaultRowHeight = 32;
5984
+ protected readonly td: _angular_core.Signal<PptxTableData | undefined>;
5985
+ protected readonly colCount: _angular_core.Signal<number>;
5986
+ protected pct(fraction: number): number;
5987
+ protected onToggle(key: TableBooleanFlag, event: Event): void;
5988
+ protected onCycle(key: 'bandRowCycle' | 'bandColCycle', event: Event): void;
5989
+ protected onPreset(preset: TableStylePreset): void;
5990
+ protected onEvenCols(): void;
5991
+ protected onEvenRows(): void;
5992
+ protected onColWidth(index: number, event: Event): void;
5993
+ protected onRowHeight(index: number, event: Event): void;
5994
+ private emit;
5995
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TablePropertiesComponent, never>;
5996
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TablePropertiesComponent, "pptx-table-properties", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, { "elementChange": "elementChange"; }, never, never, true, never>;
5997
+ }
5998
+
5999
+ /** A selected table cell (and optional Shift+Click range) on one table element. */
6000
+ interface TableCellSelection {
6001
+ /** Id of the table element the selection belongs to. */
6002
+ elementId: string;
6003
+ /** Anchor cell row (0-based). */
6004
+ rowIndex: number;
6005
+ /** Anchor cell column (0-based). */
6006
+ columnIndex: number;
6007
+ /** When true, the anchor cell has an active inline text input. */
6008
+ isEditing?: boolean;
6009
+ /** Optional multi-cell rectangular selection (Shift+Click range). */
6010
+ selectedCells?: CellCoord[];
6011
+ }
6012
+ declare class TableSelectionService {
6013
+ /** The current table-cell selection, or null when nothing is selected. */
6014
+ readonly selection: _angular_core.WritableSignal<TableCellSelection | null>;
6015
+ /** The element id of the current selection (or undefined). */
6016
+ readonly elementId: _angular_core.Signal<string | undefined>;
6017
+ /**
6018
+ * Select a single cell (clears any range). Passing the element id keeps the
6019
+ * selection scoped so a stale selection from a different table is ignored.
6020
+ */
6021
+ selectCell(elementId: string, rowIndex: number, columnIndex: number): void;
6022
+ /**
6023
+ * Extend the selection from the current anchor to `(rowIndex, columnIndex)`
6024
+ * as a rectangular range (Shift+Click). Expands to cover any merge groups it
6025
+ * overlaps. When there is no existing anchor on this element it falls back to
6026
+ * a single-cell selection.
6027
+ */
6028
+ extendTo(elementId: string, rowIndex: number, columnIndex: number, tableData: PptxTableData): void;
6029
+ /** Mark the anchor cell as actively editing (inline text input open). */
6030
+ beginEditing(elementId: string, rowIndex: number, columnIndex: number): void;
6031
+ /** Clear the editing flag while keeping the cell selected. */
6032
+ endEditing(): void;
6033
+ /** Clear the selection entirely. */
6034
+ clear(): void;
6035
+ /** Clear the selection when it belongs to `elementId` (e.g. element deleted). */
6036
+ clearFor(elementId: string): void;
6037
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableSelectionService, never>;
6038
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<TableSelectionService>;
6039
+ }
6040
+
6041
+ /** Cell-style keys whose value is a colour string (edited via `<input type=color>`). */
6042
+ type ColorKey = 'color' | 'backgroundColor' | 'borderTopColor' | 'borderBottomColor' | 'borderLeftColor' | 'borderRightColor';
6043
+ /** Cell-style keys whose value is a number (edited via `<input type=number>`). */
6044
+ type NumKey = 'fontSize' | 'borderTopWidth' | 'borderBottomWidth' | 'borderLeftWidth' | 'borderRightWidth';
6045
+ declare class TableCellFormattingComponent {
6046
+ /** The table element being edited. */
6047
+ readonly element: _angular_core.InputSignal<TablePptxElement>;
6048
+ /** Whether editing is enabled. */
6049
+ readonly canEdit: _angular_core.InputSignal<boolean>;
6050
+ /** Emits the fully-updated element after any edit. */
6051
+ readonly elementChange: _angular_core.OutputEmitterRef<TablePptxElement>;
6052
+ private readonly selection;
6053
+ protected readonly textToggles: ReadonlyArray<{
6054
+ key: 'bold' | 'italic' | 'underline';
6055
+ label: string;
6056
+ }>;
6057
+ protected readonly hAligns: ReadonlyArray<{
6058
+ value: 'left' | 'center' | 'right';
6059
+ label: string;
6060
+ }>;
6061
+ protected readonly vAligns: ReadonlyArray<{
6062
+ value: 'top' | 'middle' | 'bottom';
6063
+ label: string;
6064
+ }>;
6065
+ protected readonly borderEdges: ReadonlyArray<{
6066
+ label: string;
6067
+ colorKey: 'borderTopColor' | 'borderBottomColor' | 'borderLeftColor' | 'borderRightColor';
6068
+ widthKey: 'borderTopWidth' | 'borderBottomWidth' | 'borderLeftWidth' | 'borderRightWidth';
6069
+ }>;
6070
+ /** The selection when it targets THIS element, else null. */
6071
+ protected readonly sel: _angular_core.Signal<TableCellSelection | null>;
6072
+ /** The selected cell, or undefined when the selection is out of range. */
6073
+ protected readonly cell: _angular_core.Signal<pptx_viewer_core.PptxTableCell | undefined>;
6074
+ protected readonly style: _angular_core.Signal<PptxTableCellStyle>;
6075
+ protected readonly hasRange: _angular_core.Signal<boolean>;
6076
+ protected colorOf(key: ColorKey): string;
6077
+ protected widthOf(key: NumKey): number;
6078
+ protected toggle(key: 'bold' | 'italic' | 'underline'): void;
6079
+ protected onColor(key: ColorKey, event: Event): void;
6080
+ protected onNumber(key: NumKey, event: Event): void;
6081
+ /** Merge a style patch into the selected cell and emit the updated element. */
6082
+ protected updateStyle(patch: Partial<PptxTableCellStyle>): void;
6083
+ protected onMergeRight(): void;
6084
+ protected onMergeDown(): void;
6085
+ protected onSplit(): void;
6086
+ protected onMergeRange(): void;
6087
+ private applyMerge;
6088
+ private commit;
6089
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableCellFormattingComponent, never>;
6090
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableCellFormattingComponent, "pptx-table-cell-formatting", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, { "elementChange": "elementChange"; }, never, never, true, never>;
6091
+ }
6092
+
6093
+ type GradientStop = {
6094
+ color: string;
6095
+ position: number;
6096
+ };
6097
+ declare class TableCellAdvancedFillComponent {
6098
+ /** The selected cell's style. */
6099
+ readonly cellStyle: _angular_core.InputSignal<PptxTableCellStyle>;
6100
+ /** Whether editing is enabled. */
6101
+ readonly canEdit: _angular_core.InputSignal<boolean>;
6102
+ /** Emits a partial style patch to merge into the cell. */
6103
+ readonly styleChange: _angular_core.OutputEmitterRef<Partial<PptxTableCellStyle>>;
6104
+ protected readonly fillModes: {
6105
+ value: "none" | "solid" | "gradient" | "pattern";
6106
+ label: string;
6107
+ }[];
6108
+ protected readonly gradientTypes: {
6109
+ value: string;
6110
+ label: string;
6111
+ }[];
6112
+ protected readonly patterns: ("horz" | "vert" | "pct5" | "pct10" | "pct20" | "pct25" | "pct30" | "pct40" | "pct50" | "pct60" | "pct70" | "pct75" | "pct80" | "pct90" | "ltHorz" | "dkHorz" | "narHorz" | "wdHorz" | "ltVert" | "dkVert" | "narVert" | "wdVert" | "dashHorz" | "dashVert" | "cross" | "dnDiag" | "ltDnDiag" | "dkDnDiag" | "wdDnDiag" | "dashDnDiag" | "upDiag" | "ltUpDiag" | "dkUpDiag" | "wdUpDiag" | "dashUpDiag" | "diagCross" | "smCheck" | "lgCheck" | "smGrid" | "lgGrid" | "dotGrid" | "smConfetti" | "lgConfetti" | "horzBrick" | "diagBrick" | "solidDmnd" | "openDmnd" | "dotDmnd" | "plaid" | "sphere" | "weave" | "divot" | "shingle" | "wave" | "trellis" | "zigZag")[];
6113
+ protected readonly margins: ReadonlyArray<{
6114
+ key: 'marginTop' | 'marginBottom' | 'marginLeft' | 'marginRight';
6115
+ label: string;
6116
+ }>;
6117
+ protected readonly fillMode: _angular_core.Signal<"none" | "solid" | "gradient" | "pattern">;
6118
+ protected readonly gradType: _angular_core.Signal<"linear" | "radial">;
6119
+ protected readonly stops: _angular_core.Signal<GradientStop[]>;
6120
+ protected marginValue(key: 'marginTop' | 'marginBottom' | 'marginLeft' | 'marginRight'): number;
6121
+ protected onFillModeChange(event: Event): void;
6122
+ protected onGradTypeChange(event: Event): void;
6123
+ protected onAngleChange(event: Event): void;
6124
+ protected onStopColor(index: number, event: Event): void;
6125
+ protected onStopPos(index: number, event: Event): void;
6126
+ protected onAddStop(): void;
6127
+ protected onPatternPreset(event: Event): void;
6128
+ protected onPatternFg(event: Event): void;
6129
+ protected onPatternBg(event: Event): void;
6130
+ protected onMargin(key: 'marginTop' | 'marginBottom' | 'marginLeft' | 'marginRight', event: Event): void;
6131
+ private updateStop;
6132
+ private emitGradient;
6133
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableCellAdvancedFillComponent, never>;
6134
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableCellAdvancedFillComponent, "pptx-table-cell-advanced-fill", never, { "cellStyle": { "alias": "cellStyle"; "required": true; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, { "styleChange": "styleChange"; }, never, never, true, never>;
6135
+ }
6136
+
6137
+ declare class TableResizeOverlayComponent {
6138
+ /** Column widths as proportions summing to ~1. */
6139
+ readonly columnWidths: _angular_core.InputSignal<number[]>;
6140
+ /** Whether the resize handles are active. */
6141
+ readonly editable: _angular_core.InputSignal<boolean>;
6142
+ /** Emitted on column-boundary drop with the renormalised width array. */
6143
+ readonly resizeColumns: _angular_core.OutputEmitterRef<number[]>;
6144
+ /** Emitted on row-boundary drop with the resized row's index + new height. */
6145
+ readonly resizeRow: _angular_core.OutputEmitterRef<{
6146
+ index: number;
6147
+ height: number;
6148
+ }>;
6149
+ private readonly host;
6150
+ private readonly injector;
6151
+ /** Cumulative internal column-boundary positions as percentages (0-100). */
6152
+ readonly colBoundaries: _angular_core.Signal<number[]>;
6153
+ /** Measured internal row-boundary offsets (px from the table top). */
6154
+ readonly rowBounds: _angular_core.WritableSignal<number[]>;
6155
+ private drag;
6156
+ private readonly onMove;
6157
+ private readonly onUp;
6158
+ constructor();
6159
+ /** Observe the container so row-height changes re-measure the boundaries. */
6160
+ private observeResize;
6161
+ private container;
6162
+ private measureRows;
6163
+ onColDown(event: PointerEvent, index: number): void;
6164
+ onRowDown(event: PointerEvent, index: number): void;
6165
+ private beginDrag;
6166
+ private handleMove;
6167
+ private handleUp;
6168
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableResizeOverlayComponent, never>;
6169
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableResizeOverlayComponent, "pptx-table-resize-overlay", never, { "columnWidths": { "alias": "columnWidths"; "required": true; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; }, { "resizeColumns": "resizeColumns"; "resizeRow": "resizeRow"; }, never, ["*"], true, never>;
6170
+ }
6171
+
5720
6172
  declare class ChartDataEditorComponent {
5721
6173
  /** The chart element being edited. */
5722
6174
  readonly element: _angular_core.InputSignal<ChartPptxElement>;
@@ -6314,7 +6766,17 @@ declare class EditorContextMenuComponent {
6314
6766
  /** Emitted when the menu should close (Escape or outside click). */
6315
6767
  readonly closed: _angular_core.OutputEmitterRef<void>;
6316
6768
  protected readonly editor: EditorStateService;
6769
+ private readonly tableSelection;
6317
6770
  private readonly host;
6771
+ /**
6772
+ * The table element + cell selection the menu should act on, or null when the
6773
+ * current selection is not a single table with a selected cell. Drives the
6774
+ * table row/column/merge section of the menu.
6775
+ */
6776
+ protected readonly tableCtx: _angular_core.Signal<{
6777
+ element: TablePptxElement;
6778
+ sel: TableCellSelection;
6779
+ } | null>;
6318
6780
  onEscape(): void;
6319
6781
  onDocumentPointerDown(event: PointerEvent): void;
6320
6782
  protected onCut(): void;
@@ -6326,6 +6788,21 @@ declare class EditorContextMenuComponent {
6326
6788
  protected onSendToBack(): void;
6327
6789
  protected onBringForward(): void;
6328
6790
  protected onSendBackward(): void;
6791
+ protected onInsertRowAbove(): void;
6792
+ protected onInsertRowBelow(): void;
6793
+ protected onInsertColLeft(): void;
6794
+ protected onInsertColRight(): void;
6795
+ protected onDeleteRow(): void;
6796
+ protected onDeleteColumn(): void;
6797
+ protected onMergeRight(): void;
6798
+ protected onMergeDown(): void;
6799
+ protected onSplitCell(): void;
6800
+ protected onMergeSelected(): void;
6801
+ /**
6802
+ * Run a pure table transform on the current table context and commit the
6803
+ * result through the editor (one undoable history entry), then close the menu.
6804
+ */
6805
+ private applyTable;
6329
6806
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EditorContextMenuComponent, never>;
6330
6807
  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>;
6331
6808
  }
@@ -6609,7 +7086,7 @@ declare function overallStatus(signatures: readonly ParsedSignature[]): OverallS
6609
7086
  /** Header label for the panel given the overall package status. */
6610
7087
  declare function headerLabel(overall: OverallSignatureStatus): string;
6611
7088
  /** Human-readable label for a per-signature status. */
6612
- declare function statusLabel(status: SignatureStatus): string;
7089
+ declare function statusLabel$1(status: SignatureStatus): string;
6613
7090
  /** Coarse validity bucket for styling: valid / invalid / unknown. */
6614
7091
  declare function statusKind(status: SignatureStatus): SignatureStatusKind;
6615
7092
  /** Best-effort signer name: certificate subject, else issuer, else path. */
@@ -6998,6 +7475,539 @@ declare class BroadcastDialogComponent {
6998
7475
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BroadcastDialogComponent, "pptx-broadcast-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "defaults": { "alias": "defaults"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "connected": { "alias": "connected"; "required": false; "isSignal": true; }; "viewerCount": { "alias": "viewerCount"; "required": false; "isSignal": true; }; "viewerUrl": { "alias": "viewerUrl"; "required": false; "isSignal": true; }; }, { "start": "start"; "stop": "stop"; "close": "close"; }, never, never, true, never>;
6999
7476
  }
7000
7477
 
7478
+ declare class ViewerCompareService {
7479
+ private readonly svc;
7480
+ private readonly editor;
7481
+ /**
7482
+ * Open a `.pptx` picker and diff it against the current deck, opening the
7483
+ * compare panel with the result. Invoked from the ribbon.
7484
+ */
7485
+ startCompare(): void;
7486
+ /** Parse the chosen file and compute the slide-level diff. */
7487
+ private runCompare;
7488
+ /** Accept a single slide diff, adopting the incoming slide. */
7489
+ acceptSlide(diffIndex: number): void;
7490
+ /** Reject a diff: keep the current slide (no deck change). */
7491
+ rejectSlide(_diffIndex: number): void;
7492
+ /** Accept every non-trivial diff at once. */
7493
+ acceptAll(): void;
7494
+ private diffAt;
7495
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewerCompareService, never>;
7496
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ViewerCompareService>;
7497
+ }
7498
+
7499
+ declare class ViewerExtraDialogsComponent {
7500
+ /** Active slide index (equation inserts land on this slide). */
7501
+ readonly activeSlideIndex: _angular_core.InputSignal<number>;
7502
+ /** Id of the single selected element (target for an equation edit). */
7503
+ readonly selectedElementId: _angular_core.InputSignal<string | null>;
7504
+ /** Host file path used by the version-history panel to key IndexedDB. */
7505
+ readonly filePath: _angular_core.InputSignal<string | undefined>;
7506
+ /** Custom shows offered in the set-up-slide-show "show slides" fieldset. */
7507
+ readonly customShows: _angular_core.InputSignal<PptxCustomShow[]>;
7508
+ /** Fired with a restored `.pptx` version's bytes; the host swaps the deck. */
7509
+ readonly restoreContent: _angular_core.OutputEmitterRef<Uint8Array<ArrayBufferLike>>;
7510
+ protected readonly svc: ViewerDialogsService;
7511
+ protected readonly compare: ViewerCompareService;
7512
+ protected readonly editor: EditorStateService;
7513
+ protected readonly loader: LoadContentService;
7514
+ private readonly fonts;
7515
+ /** Distinct font families used across the editable deck. */
7516
+ protected readonly usedFontFamilies: _angular_core.Signal<string[]>;
7517
+ /** Families backed by an embedded @font-face rule. */
7518
+ protected readonly embeddedFamilies: _angular_core.Signal<string[]>;
7519
+ /** Media data-URL map as a plain record for the compare thumbnails. */
7520
+ protected readonly mediaRecord: _angular_core.Signal<Record<string, string>>;
7521
+ /** Guards the one-shot signature-stripped warning on first edit. */
7522
+ private signatureWarningShown;
7523
+ /** Presentation-mode ink pending the keep/discard decision. */
7524
+ private readonly pendingAnnotations;
7525
+ constructor();
7526
+ /**
7527
+ * Offer the keep/discard prompt for ink drawn during a presentation.
7528
+ * Called by the viewer when the presentation overlay exits with annotations.
7529
+ */
7530
+ promptKeepAnnotations(map: SlideAnnotationMap): void;
7531
+ /** Persist the pending presentation ink as `ink` elements on their slides. */
7532
+ onKeepAnnotations(): void;
7533
+ /** Drop the pending presentation ink. */
7534
+ onDiscardAnnotations(): void;
7535
+ /** Insert a new equation element, or update the one currently being edited. */
7536
+ onEquationInsert(omml: Record<string, unknown>): void;
7537
+ /** Persist the slide-show settings for this session. */
7538
+ onSlideShowSave(properties: PptxPresentationProperties): void;
7539
+ /** Record a save password (applied by the save pipeline). */
7540
+ onSetPassword(password: string): void;
7541
+ /** Clear any save password. */
7542
+ onRemovePassword(): void;
7543
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewerExtraDialogsComponent, never>;
7544
+ 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; }; }, { "restoreContent": "restoreContent"; }, never, never, true, never>;
7545
+ }
7546
+
7547
+ declare class EquationEditorDialogComponent {
7548
+ /** Whether the dialog is visible. */
7549
+ readonly open: _angular_core.InputSignal<boolean>;
7550
+ /** When editing an existing equation, its OMML tree (null for a fresh insert). */
7551
+ readonly existingOmml: _angular_core.InputSignal<Record<string, unknown> | null>;
7552
+ /** Fired with the OMML object to insert / update on the slide. */
7553
+ readonly insert: _angular_core.OutputEmitterRef<Record<string, unknown>>;
7554
+ /** Fired when the dialog is dismissed. */
7555
+ readonly close: _angular_core.OutputEmitterRef<void>;
7556
+ private readonly sanitizer;
7557
+ /** Current LaTeX source in the textarea. */
7558
+ readonly latex: _angular_core.WritableSignal<string>;
7559
+ /** True when editing an existing equation (drives the title / button label). */
7560
+ readonly isEditing: _angular_core.Signal<boolean>;
7561
+ /** Header title: edit vs insert. */
7562
+ readonly dialogTitle: _angular_core.Signal<"Edit Equation" | "Insert Equation">;
7563
+ /** Live OMML compiled from the current LaTeX ({} on failure / empty input). */
7564
+ private readonly omml;
7565
+ /** Whether there is a renderable equation (drives preview + insert enabling). */
7566
+ readonly hasContent: _angular_core.Signal<boolean>;
7567
+ /** Sanitized MathML preview for the current LaTeX. */
7568
+ readonly previewMathml: _angular_core.Signal<SafeHtml>;
7569
+ constructor();
7570
+ asValue(event: Event): string;
7571
+ onKeyDown(event: KeyboardEvent): void;
7572
+ onInsert(): void;
7573
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EquationEditorDialogComponent, never>;
7574
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EquationEditorDialogComponent, "pptx-equation-editor-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "existingOmml": { "alias": "existingOmml"; "required": false; "isSignal": true; }; }, { "insert": "insert"; "close": "close"; }, never, never, true, never>;
7575
+ }
7576
+
7577
+ /**
7578
+ * equation-editor-helpers.ts: Pure helpers backing the equation editor dialog
7579
+ * and its template gallery. Kept framework-free (no Angular / DOM) so the
7580
+ * LaTeX -> MathML conversion and the template catalogue are unit testable in
7581
+ * isolation.
7582
+ */
7583
+ /** Describes a pre-built equation template shown in the template gallery. */
7584
+ interface EquationTemplate {
7585
+ /** Human-readable label (English fallback). */
7586
+ label: string;
7587
+ /** LaTeX source for the template equation. */
7588
+ latex: string;
7589
+ }
7590
+ /** Pre-defined equation templates covering common mathematical formulas. */
7591
+ declare const TEMPLATES: EquationTemplate[];
7592
+ /** Convert a LaTeX string to a MathML markup string, empty on any failure. */
7593
+ declare function latexToMathml(latex: string): string;
7594
+
7595
+ declare class EquationTemplateGalleryComponent {
7596
+ /** Current LaTeX source (drives the active-template highlight). */
7597
+ readonly activeLatex: _angular_core.InputSignal<string>;
7598
+ /** Fired with the chosen template's LaTeX when a tile is clicked. */
7599
+ readonly select: _angular_core.OutputEmitterRef<string>;
7600
+ private readonly sanitizer;
7601
+ /** Templates with pre-computed MathML previews (built once). */
7602
+ protected readonly templates: ReadonlyArray<EquationTemplate & {
7603
+ mathml: SafeHtml;
7604
+ }>;
7605
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EquationTemplateGalleryComponent, never>;
7606
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EquationTemplateGalleryComponent, "pptx-equation-template-gallery", never, { "activeLatex": { "alias": "activeLatex"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, never, true, never>;
7607
+ }
7608
+
7609
+ declare class SetUpSlideShowDialogComponent {
7610
+ /** Whether the dialog is visible. */
7611
+ readonly open: _angular_core.InputSignal<boolean>;
7612
+ /** Persisted slide-show properties used to seed the draft on open. */
7613
+ readonly properties: _angular_core.InputSignal<PptxPresentationProperties>;
7614
+ /** Named custom shows defined by the deck (may be empty). */
7615
+ readonly customShows: _angular_core.InputSignal<PptxCustomShow[]>;
7616
+ /** Total number of slides in the deck (clamps the range inputs). */
7617
+ readonly slideCount: _angular_core.InputSignal<number>;
7618
+ /** Fired with the final draft when the user confirms with OK. */
7619
+ readonly save: _angular_core.OutputEmitterRef<PptxPresentationProperties>;
7620
+ /** Fired when the dialog is dismissed (Cancel, backdrop, Escape). */
7621
+ readonly close: _angular_core.OutputEmitterRef<void>;
7622
+ /** Working copy of the properties; seeded from `properties` on open. */
7623
+ readonly draft: _angular_core.WritableSignal<PptxPresentationProperties>;
7624
+ readonly showType: _angular_core.Signal<"presented" | "browsed" | "kiosk">;
7625
+ readonly showSlidesMode: _angular_core.Signal<"all" | "customShow" | "range">;
7626
+ constructor();
7627
+ /** Merge a partial patch into the current draft. */
7628
+ update(patch: Partial<PptxPresentationProperties>): void;
7629
+ onClose(): void;
7630
+ onOk(): void;
7631
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SetUpSlideShowDialogComponent, never>;
7632
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SetUpSlideShowDialogComponent, "pptx-set-up-slide-show-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "properties": { "alias": "properties"; "required": false; "isSignal": true; }; "customShows": { "alias": "customShows"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; }, { "save": "save"; "close": "close"; }, never, never, true, never>;
7633
+ }
7634
+
7635
+ declare class ShowOptionsFieldsetComponent {
7636
+ /** Current slide-show properties draft (source of the checkbox states). */
7637
+ readonly draft: _angular_core.InputSignal<PptxPresentationProperties>;
7638
+ /** Emits a partial patch to merge into the host draft. */
7639
+ readonly patch: _angular_core.OutputEmitterRef<Partial<PptxPresentationProperties>>;
7640
+ protected isChecked(event: Event): boolean;
7641
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShowOptionsFieldsetComponent, never>;
7642
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShowOptionsFieldsetComponent, "pptx-show-options-fieldset", never, { "draft": { "alias": "draft"; "required": false; "isSignal": true; }; }, { "patch": "patch"; }, never, never, true, never>;
7643
+ }
7644
+
7645
+ declare class ShowSlidesFieldsetComponent {
7646
+ /** Current slide-show properties draft. */
7647
+ readonly draft: _angular_core.InputSignal<PptxPresentationProperties>;
7648
+ /** Derived active mode (falls back to 'all' upstream). */
7649
+ readonly showSlidesMode: _angular_core.InputSignal<"all" | "customShow" | "range">;
7650
+ /** Total number of slides in the deck (clamps the range inputs). */
7651
+ readonly slideCount: _angular_core.InputSignal<number>;
7652
+ /** Named custom shows defined by the deck (may be empty). */
7653
+ readonly customShows: _angular_core.InputSignal<PptxCustomShow[]>;
7654
+ /** Emits a partial patch to merge into the host draft. */
7655
+ readonly patch: _angular_core.OutputEmitterRef<Partial<PptxPresentationProperties>>;
7656
+ protected onSelectRange(): void;
7657
+ protected onFromInput(event: Event): void;
7658
+ protected onToInput(event: Event): void;
7659
+ protected onSelectCustomShow(): void;
7660
+ protected onSelectCustomShowId(event: Event): void;
7661
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShowSlidesFieldsetComponent, never>;
7662
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShowSlidesFieldsetComponent, "pptx-show-slides-fieldset", never, { "draft": { "alias": "draft"; "required": false; "isSignal": true; }; "showSlidesMode": { "alias": "showSlidesMode"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "customShows": { "alias": "customShows"; "required": false; "isSignal": true; }; }, { "patch": "patch"; }, never, never, true, never>;
7663
+ }
7664
+
7665
+ declare class PasswordProtectionDialogComponent {
7666
+ /** Whether the dialog is visible. */
7667
+ readonly open: _angular_core.InputSignal<boolean>;
7668
+ /** Whether the presentation already has a password. */
7669
+ readonly isCurrentlyProtected: _angular_core.InputSignal<boolean>;
7670
+ /** Fired with the new password when the user confirms. */
7671
+ readonly setPassword: _angular_core.OutputEmitterRef<string>;
7672
+ /** Fired when the user removes the existing password. */
7673
+ readonly removePassword: _angular_core.OutputEmitterRef<void>;
7674
+ /** Fired when the dialog is dismissed. */
7675
+ readonly close: _angular_core.OutputEmitterRef<void>;
7676
+ readonly password: _angular_core.WritableSignal<string>;
7677
+ readonly confirmPassword: _angular_core.WritableSignal<string>;
7678
+ readonly showPassword: _angular_core.WritableSignal<boolean>;
7679
+ readonly error: _angular_core.WritableSignal<string>;
7680
+ constructor();
7681
+ onPasswordInput(event: Event): void;
7682
+ onConfirmInput(event: Event): void;
7683
+ onSubmit(): void;
7684
+ onRemove(): void;
7685
+ onClose(): void;
7686
+ private resetFields;
7687
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PasswordProtectionDialogComponent, never>;
7688
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PasswordProtectionDialogComponent, "pptx-password-protection-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "isCurrentlyProtected": { "alias": "isCurrentlyProtected"; "required": false; "isSignal": true; }; }, { "setPassword": "setPassword"; "removePassword": "removePassword"; "close": "close"; }, never, never, true, never>;
7689
+ }
7690
+
7691
+ declare class PasswordStrengthMeterComponent {
7692
+ /** Current password (source of the derived strength). */
7693
+ readonly password: _angular_core.InputSignal<string>;
7694
+ readonly bars: number[];
7695
+ readonly strength: _angular_core.Signal<number>;
7696
+ readonly strengthColor: _angular_core.Signal<string>;
7697
+ readonly strengthLabel: _angular_core.Signal<string>;
7698
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PasswordStrengthMeterComponent, never>;
7699
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PasswordStrengthMeterComponent, "pptx-password-strength-meter", never, { "password": { "alias": "password"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
7700
+ }
7701
+
7702
+ /**
7703
+ * password-protection-helpers.ts: Pure helpers backing the password-protection
7704
+ * dialog. Framework-free (no Angular / DOM) so the strength scoring, its
7705
+ * colour/label lookup, and the submit validation are unit testable in
7706
+ * isolation.
7707
+ */
7708
+ /** Returns a strength score 0-4 for a password. Ported verbatim from React. */
7709
+ declare function getPasswordStrength(password: string): number;
7710
+ /**
7711
+ * Validate the two password fields for the submit action. Returns an English
7712
+ * error message, or the empty string when the pair is acceptable. Mirrors the
7713
+ * React dialog's inline checks (non-empty, matching, >= 4 chars).
7714
+ */
7715
+ declare function validatePassword(password: string, confirmPassword: string): string;
7716
+
7717
+ declare class EncryptedFileDialogComponent {
7718
+ /** Whether the dialog is visible. */
7719
+ readonly open: _angular_core.InputSignal<boolean>;
7720
+ /** Fired when the dialog is dismissed. */
7721
+ readonly close: _angular_core.OutputEmitterRef<void>;
7722
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EncryptedFileDialogComponent, never>;
7723
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EncryptedFileDialogComponent, "pptx-encrypted-file-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, never, true, never>;
7724
+ }
7725
+
7726
+ declare class ComparePanelComponent {
7727
+ readonly open: _angular_core.InputSignal<boolean>;
7728
+ readonly compareResult: _angular_core.InputSignal<CompareResult | null>;
7729
+ readonly canvasSize: _angular_core.InputSignal<CanvasSize>;
7730
+ readonly mediaDataUrls: _angular_core.InputSignal<Record<string, string>>;
7731
+ readonly close: _angular_core.OutputEmitterRef<void>;
7732
+ readonly acceptSlide: _angular_core.OutputEmitterRef<number>;
7733
+ readonly rejectSlide: _angular_core.OutputEmitterRef<number>;
7734
+ readonly acceptAll: _angular_core.OutputEmitterRef<void>;
7735
+ /** Diff indices the user has accepted. */
7736
+ private readonly accepted;
7737
+ /** Diff indices the user has rejected. */
7738
+ private readonly rejected;
7739
+ /** Count of diffs worth reviewing (everything except `unchanged`). */
7740
+ readonly nonTrivialCount: _angular_core.Signal<number>;
7741
+ isAccepted(index: number): boolean;
7742
+ isRejected(index: number): boolean;
7743
+ handleAccept(index: number): void;
7744
+ handleReject(index: number): void;
7745
+ handleAcceptAll(): void;
7746
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComparePanelComponent, never>;
7747
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ComparePanelComponent, "pptx-compare-panel", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "compareResult": { "alias": "compareResult"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; }, { "close": "close"; "acceptSlide": "acceptSlide"; "rejectSlide": "rejectSlide"; "acceptAll": "acceptAll"; }, never, never, true, never>;
7748
+ }
7749
+
7750
+ declare class SlideDiffRowComponent {
7751
+ readonly diff: _angular_core.InputSignal<SlideDiff>;
7752
+ readonly diffIndex: _angular_core.InputSignal<number>;
7753
+ readonly canvasSize: _angular_core.InputSignal<CanvasSize>;
7754
+ readonly mediaDataUrls: _angular_core.InputSignal<Record<string, string>>;
7755
+ readonly accepted: _angular_core.InputSignal<boolean>;
7756
+ readonly rejected: _angular_core.InputSignal<boolean>;
7757
+ readonly accept: _angular_core.OutputEmitterRef<number>;
7758
+ readonly reject: _angular_core.OutputEmitterRef<number>;
7759
+ /** null = follow the default (expanded when status is `changed`). */
7760
+ private readonly expandedOverride;
7761
+ readonly expanded: _angular_core.Signal<boolean>;
7762
+ readonly isResolved: _angular_core.Signal<boolean>;
7763
+ readonly slideNumber: _angular_core.Signal<number>;
7764
+ readonly statusLabel: _angular_core.Signal<string>;
7765
+ readonly changeCountLabel: _angular_core.Signal<string>;
7766
+ toggle(): void;
7767
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideDiffRowComponent, never>;
7768
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideDiffRowComponent, "pptx-slide-diff-row", never, { "diff": { "alias": "diff"; "required": true; "isSignal": true; }; "diffIndex": { "alias": "diffIndex"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "accepted": { "alias": "accepted"; "required": false; "isSignal": true; }; "rejected": { "alias": "rejected"; "required": false; "isSignal": true; }; }, { "accept": "accept"; "reject": "reject"; }, never, never, true, never>;
7769
+ }
7770
+
7771
+ declare class SlideDiffThumbnailsComponent {
7772
+ /** Exposed to the template for the fixed thumbnail box width. */
7773
+ protected readonly THUMB_W = 180;
7774
+ readonly diff: _angular_core.InputSignal<SlideDiff>;
7775
+ readonly canvasSize: _angular_core.InputSignal<CanvasSize>;
7776
+ readonly mediaDataUrls: _angular_core.InputSignal<Record<string, string>>;
7777
+ /** SlideCanvas expects a Map; convert the Record input once per change. */
7778
+ readonly mediaMap: _angular_core.Signal<Map<string, string>>;
7779
+ readonly thumbZoom: _angular_core.Signal<number>;
7780
+ readonly thumbH: _angular_core.Signal<number>;
7781
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideDiffThumbnailsComponent, never>;
7782
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideDiffThumbnailsComponent, "pptx-slide-diff-thumbnails", never, { "diff": { "alias": "diff"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
7783
+ }
7784
+
7785
+ /**
7786
+ * slide-diff-helpers.ts: Pure label / icon helpers for the slide-diff row and
7787
+ * its change list. Framework-free so they are unit testable in isolation.
7788
+ */
7789
+
7790
+ /** Single-character glyph for a per-element change kind. */
7791
+ declare function changeIcon(kind: ElementChange['kind']): string;
7792
+ /** Human-readable status pill label for a slide diff. */
7793
+ declare function statusLabel(status: SlideDiff['status']): string;
7794
+ /** "N change" / "N changes" summary for a diff's change count. */
7795
+ declare function changeCountLabel(count: number): string;
7796
+ /** 1-based slide number for a diff, preferring the base index when present. */
7797
+ declare function slideNumberOf(diff: SlideDiff): number;
7798
+
7799
+ declare class SlideDiffChangesComponent {
7800
+ readonly changes: _angular_core.InputSignal<readonly ElementChange[]>;
7801
+ protected readonly icon: typeof changeIcon;
7802
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideDiffChangesComponent, never>;
7803
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideDiffChangesComponent, "pptx-slide-diff-changes", never, { "changes": { "alias": "changes"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
7804
+ }
7805
+
7806
+ declare class FontEmbeddingPanelComponent {
7807
+ /** Whether the dialog is visible. */
7808
+ readonly open: _angular_core.InputSignal<boolean>;
7809
+ /** Whether font embedding is currently enabled. */
7810
+ readonly embedFontsEnabled: _angular_core.InputSignal<boolean>;
7811
+ /** Font families referenced by the presentation. */
7812
+ readonly usedFontFamilies: _angular_core.InputSignal<string[]>;
7813
+ /** Font families already embedded in the file. */
7814
+ readonly embeddedFonts: _angular_core.InputSignal<string[]>;
7815
+ /** Fired when the dialog is dismissed. */
7816
+ readonly close: _angular_core.OutputEmitterRef<void>;
7817
+ /** Fired when the embed toggle changes; carries the new checked state. */
7818
+ readonly toggleEmbedFonts: _angular_core.OutputEmitterRef<boolean>;
7819
+ /** Families that resolve in the current browser (populated by the scan). */
7820
+ readonly availableFamilies: _angular_core.WritableSignal<Set<string>>;
7821
+ /** True while the font-availability scan is running. */
7822
+ readonly scanning: _angular_core.WritableSignal<boolean>;
7823
+ /** True once a scan has completed for the current open cycle. */
7824
+ readonly scanned: _angular_core.WritableSignal<boolean>;
7825
+ /** Set view of {@link embeddedFonts} for fast membership checks. */
7826
+ readonly embeddedSet: _angular_core.Signal<Set<string>>;
7827
+ /** How many used families failed to resolve in the browser. */
7828
+ readonly missingCount: _angular_core.Signal<number>;
7829
+ constructor();
7830
+ onToggle(event: Event): void;
7831
+ private scanFonts;
7832
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FontEmbeddingPanelComponent, never>;
7833
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FontEmbeddingPanelComponent, "pptx-font-embedding-panel", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "embedFontsEnabled": { "alias": "embedFontsEnabled"; "required": false; "isSignal": true; }; "usedFontFamilies": { "alias": "usedFontFamilies"; "required": false; "isSignal": true; }; "embeddedFonts": { "alias": "embeddedFonts"; "required": false; "isSignal": true; }; }, { "close": "close"; "toggleEmbedFonts": "toggleEmbedFonts"; }, never, never, true, never>;
7834
+ }
7835
+
7836
+ declare class FontEmbeddingListComponent {
7837
+ /** Font families referenced by the presentation. */
7838
+ readonly usedFontFamilies: _angular_core.InputSignal<string[]>;
7839
+ /** Families that resolve in the current browser. */
7840
+ readonly availableFamilies: _angular_core.InputSignal<Set<string>>;
7841
+ /** Families already embedded in the file. */
7842
+ readonly embeddedSet: _angular_core.InputSignal<Set<string>>;
7843
+ /** True while the font-availability scan is running. */
7844
+ readonly scanning: _angular_core.InputSignal<boolean>;
7845
+ /** How many used families failed to resolve in the browser. */
7846
+ readonly missingCount: _angular_core.InputSignal<number>;
7847
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FontEmbeddingListComponent, never>;
7848
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FontEmbeddingListComponent, "pptx-font-embedding-list", never, { "usedFontFamilies": { "alias": "usedFontFamilies"; "required": false; "isSignal": true; }; "availableFamilies": { "alias": "availableFamilies"; "required": false; "isSignal": true; }; "embeddedSet": { "alias": "embeddedSet"; "required": false; "isSignal": true; }; "scanning": { "alias": "scanning"; "required": false; "isSignal": true; }; "missingCount": { "alias": "missingCount"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
7849
+ }
7850
+
7851
+ /**
7852
+ * font-embedding-helpers.ts: font-availability probing for the font-embedding
7853
+ * panel. Thin wrappers around `document.fonts` kept in one module so the panel
7854
+ * component stays a thin view + wiring layer.
7855
+ */
7856
+ /**
7857
+ * Whether a font family resolves in the current browser. Pure guard around
7858
+ * `document.fonts.check`; returns false in non-DOM environments or on error.
7859
+ */
7860
+ declare function checkFontAvailable(family: string): boolean;
7861
+ /**
7862
+ * Wait for fonts to settle, then return the subset of `families` that resolve
7863
+ * in the current browser. Never throws; returns an empty set on failure.
7864
+ */
7865
+ declare function scanAvailableFonts(families: readonly string[]): Promise<Set<string>>;
7866
+
7867
+ /**
7868
+ * version-history-helpers.ts: IndexedDB access and formatting for the version-
7869
+ * history panel. Split out of the component so the DOM-free `formatFileSize`
7870
+ * formatter is unit testable and the IndexedDB plumbing (which mirrors the
7871
+ * autosave store) lives in one focused module.
7872
+ */
7873
+ /** A single autosaved recovery snapshot. */
7874
+ interface RecoveryVersion {
7875
+ key: string;
7876
+ timestamp: number;
7877
+ size: number;
7878
+ data: Uint8Array;
7879
+ }
7880
+ /** Read the recovery snapshots stored for a given file path (empty on error). */
7881
+ declare function getVersions(filePath: string): Promise<RecoveryVersion[]>;
7882
+ /** Delete the recovery snapshot stored under `filePath` (best-effort). */
7883
+ declare function deleteVersion(filePath: string): Promise<void>;
7884
+ /** Format a byte count as a human-readable size (B / KB / MB). */
7885
+ declare function formatFileSize(bytes: number): string;
7886
+
7887
+ declare class VersionHistoryPanelComponent {
7888
+ /** Whether the side panel is visible. */
7889
+ readonly open: _angular_core.InputSignal<boolean>;
7890
+ /** The current file's key into the recovery store. */
7891
+ readonly filePath: _angular_core.InputSignal<string | undefined>;
7892
+ /** Fired when the panel is dismissed. */
7893
+ readonly close: _angular_core.OutputEmitterRef<void>;
7894
+ /** Fired with the restored version's bytes. */
7895
+ readonly restore: _angular_core.OutputEmitterRef<Uint8Array<ArrayBufferLike>>;
7896
+ readonly versions: _angular_core.WritableSignal<RecoveryVersion[]>;
7897
+ readonly loading: _angular_core.WritableSignal<boolean>;
7898
+ readonly restoringKey: _angular_core.WritableSignal<string | null>;
7899
+ readonly deletingKey: _angular_core.WritableSignal<string | null>;
7900
+ /** Template-facing bindings for the vendored shared formatters. */
7901
+ protected readonly formatTimestamp: typeof formatVersionTimestamp;
7902
+ protected readonly formatRelative: typeof formatRelativeTime;
7903
+ protected readonly formatSize: typeof formatFileSize;
7904
+ constructor();
7905
+ private fetchVersions;
7906
+ onRestore(version: RecoveryVersion): void;
7907
+ onDelete(version: RecoveryVersion): void;
7908
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<VersionHistoryPanelComponent, never>;
7909
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<VersionHistoryPanelComponent, "pptx-version-history-panel", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; }, { "close": "close"; "restore": "restore"; }, never, never, true, never>;
7910
+ }
7911
+
7912
+ /**
7913
+ * shortcut-reference.ts: Keyboard shortcut cheat-sheet data.
7914
+ *
7915
+ * Angular copy of the React constant `SHORTCUT_REFERENCE_ITEMS` from
7916
+ * `packages/react/src/viewer/constants/toolbar.ts`. Kept as a tiny, purely
7917
+ * declarative data module so the `pptx-shortcut-panel` component stays thin.
7918
+ * Entries are copied verbatim from the React source and must stay in sync.
7919
+ */
7920
+ /** A single row in the keyboard-shortcut reference list. */
7921
+ interface ShortcutReferenceItem {
7922
+ action: string;
7923
+ shortcut: string;
7924
+ }
7925
+
7926
+ declare class ShortcutPanelComponent {
7927
+ /** Whether the popover is visible. */
7928
+ readonly open: _angular_core.InputSignal<boolean>;
7929
+ /** Fired when the Close button is clicked. */
7930
+ readonly close: _angular_core.OutputEmitterRef<void>;
7931
+ /** Static shortcut reference rows. */
7932
+ protected readonly items: ShortcutReferenceItem[];
7933
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShortcutPanelComponent, never>;
7934
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShortcutPanelComponent, "pptx-shortcut-panel", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, never, true, never>;
7935
+ }
7936
+
7937
+ declare class KeepAnnotationsDialogComponent {
7938
+ /** Whether the dialog is visible. */
7939
+ readonly open: _angular_core.InputSignal<boolean>;
7940
+ /** How many ink annotations were drawn. */
7941
+ readonly annotationCount: _angular_core.InputSignal<number>;
7942
+ /** How many slides carry those annotations. */
7943
+ readonly slideCount: _angular_core.InputSignal<number>;
7944
+ /** Fired when the user keeps the annotations as ink on the slides. */
7945
+ readonly keep: _angular_core.OutputEmitterRef<void>;
7946
+ /** Fired when the user discards the annotations (also on dismiss). */
7947
+ readonly discard: _angular_core.OutputEmitterRef<void>;
7948
+ readonly description: _angular_core.Signal<string>;
7949
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KeepAnnotationsDialogComponent, never>;
7950
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KeepAnnotationsDialogComponent, "pptx-keep-annotations-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "annotationCount": { "alias": "annotationCount"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; }, { "keep": "keep"; "discard": "discard"; }, never, never, true, never>;
7951
+ }
7952
+
7953
+ declare class SignatureStrippedDialogComponent {
7954
+ /** Whether the dialog is visible. */
7955
+ readonly open: _angular_core.InputSignal<boolean>;
7956
+ /** How many digital signatures the document carries. */
7957
+ readonly signatureCount: _angular_core.InputSignal<number>;
7958
+ /** Fired when the user accepts that signatures will be removed. */
7959
+ readonly confirm: _angular_core.OutputEmitterRef<void>;
7960
+ /** Fired when the user backs out (also on dismiss). */
7961
+ readonly cancel: _angular_core.OutputEmitterRef<void>;
7962
+ readonly message: _angular_core.Signal<string>;
7963
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SignatureStrippedDialogComponent, never>;
7964
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SignatureStrippedDialogComponent, "pptx-signature-stripped-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "signatureCount": { "alias": "signatureCount"; "required": false; "isSignal": true; }; }, { "confirm": "confirm"; "cancel": "cancel"; }, never, never, true, never>;
7965
+ }
7966
+
7967
+ /**
7968
+ * viewer-extra-dialogs-helpers.ts: Pure helpers backing
7969
+ * {@link ViewerExtraDialogsComponent}. Kept framework-free (no Angular / DOM)
7970
+ * so the container stays a thin view + wiring layer and this logic is unit
7971
+ * testable in isolation.
7972
+ */
7973
+
7974
+ /**
7975
+ * Build the single equation `TextSegment` carrying the supplied OMML payload.
7976
+ * Mirrors the structure produced by `newEquationElement` / the React equation
7977
+ * insert handler so the equation renderer consumes it identically.
7978
+ */
7979
+ declare function buildEquationSegment(omml: Record<string, unknown>): TextSegment;
7980
+ /**
7981
+ * Build a fresh equation `shape` element (id left empty for the editor to
7982
+ * assign) whose text segment carries the supplied OMML. Matches the React
7983
+ * `handleInsertEquation` shape.
7984
+ */
7985
+ declare function buildEquationElement(omml: Record<string, unknown>, x?: number, y?: number): PptxElement;
7986
+ /**
7987
+ * Collect the distinct font families referenced by every element on the deck,
7988
+ * scanning element-level `textStyle` and each `textSegments` entry. Used to
7989
+ * seed the font-embedding panel's "used fonts" list.
7990
+ */
7991
+ declare function collectUsedFontFamilies(slides: readonly PptxSlide[]): string[];
7992
+ /** Total stroke count across a per-slide annotation map. */
7993
+ declare function countAnnotationStrokes(map: SlideAnnotationMap): number;
7994
+ /** A presentation-ink stroke converted to an ink element on its target slide. */
7995
+ interface AnnotationInkInsert {
7996
+ slideIndex: number;
7997
+ ink: InkPptxElement;
7998
+ }
7999
+ /**
8000
+ * Convert every kept presentation-mode stroke into an `ink` element insert.
8001
+ * Highlighter strokes are recognised by their semi-transparent opacity.
8002
+ */
8003
+ declare function annotationMapToInkInserts(map: SlideAnnotationMap): AnnotationInkInsert[];
8004
+ /**
8005
+ * Return a new slide array with the accepted diff applied: an `added` slide is
8006
+ * appended, a `changed`/`removed` slide adopts the incoming (`compareSlide`)
8007
+ * version at its base index. Diffs without an incoming slide are ignored.
8008
+ */
8009
+ declare function applyAcceptedDiff(slides: readonly PptxSlide[], diff: SlideDiff): PptxSlide[];
8010
+
7001
8011
  declare class PrintDialogComponent {
7002
8012
  /** All slides in the current presentation. */
7003
8013
  readonly slides: _angular_core.InputSignal<PptxSlide[]>;
@@ -7582,5 +8592,5 @@ declare function themeStyle(theme: ViewerTheme | undefined): Record<string, stri
7582
8592
  type ClassValue = string | number | false | null | undefined;
7583
8593
  declare function cn(...values: ClassValue[]): string;
7584
8594
 
7585
- export { AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AccessibilityPanelComponent, AccessibilityService, AdvancedChartEditorComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, BroadcastDialogComponent, CURSOR_PALETTE, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, CommentsPanelComponent, CommentsService, ConnectorRendererComponent, ConnectorTextOverlayComponent, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, DEFAULT_FILL_COLOR, DEFAULT_PRINT_SETTINGS, DEFAULT_SLIDE_BACKGROUND, DEFAULT_STROKE_COLOR, DEFAULT_TEXT_COLOR, EMBEDDED_FONTS_STYLE_ID, EditorContextMenuComponent, EditorHistory, EditorStateService, EditorToolbarComponent, EffectsPanelComponent, ElementRendererComponent, EmbeddedFontsService, EquationRendererComponent, ExportService, FindBarComponent, FindReplaceBarComponent, GradientPickerComponent, HANDOUT_OPTIONS, HyperlinkDialogComponent, InkRendererComponent, InspectorPanelComponent, IsMobileService, LoadContentService, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesPanelComponent, OleRendererComponent, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PowerPointViewerComponent, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationSubtitleBarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, RESIZE_HANDLES, SEVERITY_GROUPS, SEVERITY_LABELS, SLIDE_TRANSITION_KEYFRAMES, SVG_WARP_PRESETS, ShareDialogComponent, SignaturesPanelComponent, SignaturesService, SlideCanvasComponent, SlideSorterOverlayComponent, SlidesPanelComponent, SmartArtRendererComponent, StatusBarComponent, TYPE_LABELS, TableDataEditorComponent, TableRendererComponent, TextAdvancedPanelComponent, VIEWER_THEME, WEBM_MIME_CANDIDATES, ZoomRendererComponent, addCommentToList, advanceStep, applyFindReplacements, applyFormatToElement, applyMove, applyResize, assignUserColor, bringForward, bringToFront, buildBroadcastConfig, buildBroadcastViewerUrl, buildClearHyperlinkPatch, buildClickGroups, buildCollaborationConfig, buildCssGradientFromShapeStyle, buildDuotoneFilter, buildDuotoneFilterId, buildEmbeddedFontStyles, buildFontFaceRule, buildHyperlinkPatch, buildPatternFillCss, buildPrintHtmlDocument as buildPrintDocument, buildPropertiesPatch, buildShareUrl, bulletIndentPx, canStartBroadcast, canStartShare, canUseClipboard, clampCursorPosition, clampGifDimensions, clampNotesFontSize, clampStep, clearAudienceContent, cn, collectAccessibilityIssues, collectElementText, collectSlideText, computeHandoutLayout, computeIsMobile, computeIsTablet, computePageCount, computeSlideIndices, computeTimerProgress, convertOmmlToMathMl, copyFormatFromElement, countAccessibilityIssues, defaultCssVars, defaultRadius, defaultThemeColors, deleteElementsByIds, derivePresenceList, duplicateElementById, durationOf, encodeGif, estimatePageCount, findInSlides, fontMimeForFormat, formatAutoNumber, formatCursorLabel, formatElapsed, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, getContainerStyle, getDuotoneFilterDef, getImageSrc, getPatternSvg, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getTextBlockStyle, getTextWarp, getWarpCategory, getWarpPath, groupIssuesBySeverity, hasCopyableFormat, hasExistingLink, headerLabel, isAudienceTab, isInjectableUrl, isPpactionUrl, isPresenterMessage, isSigned, isUrlSafe, isValidRoomId, issueTrackKey, issueTypeLabel, loadAudienceContent, moveElementBy, msToFrameDelayCs, normalizeFontFormat, normalizeSlidesPerPage, ommlToMathml, overallStatus, parseAudienceNonce, pendingElementStyles, pickSupportedMimeType, planGifFrames, planVideoSegments, presenceToCursors, provideViewerTheme, recordWebm, removeCommentFromList, renderToCanvas, replaceInSlides, replaceMatch, resizeElement, resolveFontVariant, resolveHyperlinkHref, resolveParagraphBullet, resolvePresenterNotes, resolveTransitionDuration, revealedElementStyles, routeOrthogonalConnector, sanitizeColor, sanitizeSlideIndex, sanitizeUserName, searchSlides, seedBroadcastFields, seedHyperlinkDraft, seedPropertiesDraft, seedShareFields, segmentFrameCount, sendBackward, sendToBack, setElementPosition, shouldUseSvgWarp, signatureCountLabel, signatureKey, signatureTimestamp, signerName, statusKind, statusLabel, storeAudienceContent, themeStyle, themeToCssVars, toggleCommentResolvedInList, updateElementById, validatePrintSettings, validateRoomId, waypointsToPathD, worstStatus };
7586
- export type { AccessibilityIssueGroup, AnimationClickGroup, AnnotationStroke, Box, BroadcastConfig, BroadcastDefaults, CSSProperties, CanvasSize, ClassValue, CollaborationConfig, CollaborationRole, RouterRect as ConnectorObstacle, RouterPoint as ConnectorPoint, ConnectorRouting, CopiedFormat, DocumentProperties, DuotoneFilterDef, EmbeddedFontStyles, FindOptions, FindResult, GifFrame, GifFramePlan, GifPlanOptions, HandoutSlidesPerPage, HyperlinkDraft, NotesSegmentViewModel, ObjectUrlFactory, OverallSignatureStatus, PresentationTool, PresenterExitMessage, PresenterMessage, PresenterNotes, PresenterSlideChangeMessage, PrintColorMode, PrintHtmlDocumentOptions as PrintDocumentOptions, PrintOrientation, PrintSettings, PrintSlideRange, PrintWhat, PropertiesDraft, RecordWebmOptions, RemoteCursor, SanitizedPresence as RemotePresence, ReplaceResult, ResizeHandle, ResolvedFontVariant, ShareDefaults, ShareFormFields, SignatureStatusKind, SlideTransitionAnimations, StyleMap, TextWarpCssDef, TextWarpDef, TextWarpPathDef, TimerProgress, VideoPlanOptions, VideoSegmentPlan, ViewerTheme, ViewerThemeColors };
8595
+ export { AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AccessibilityPanelComponent, AccessibilityService, AdvancedChartEditorComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, BroadcastDialogComponent, CURSOR_PALETTE, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, CommentsPanelComponent, CommentsService, ComparePanelComponent, ConnectorRendererComponent, ConnectorTextOverlayComponent, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, DEFAULT_FILL_COLOR, DEFAULT_PRINT_SETTINGS, DEFAULT_SLIDE_BACKGROUND, DEFAULT_STROKE_COLOR, DEFAULT_TEXT_COLOR, EMBEDDED_FONTS_STYLE_ID, TEMPLATES as EQUATION_TEMPLATES, EditorContextMenuComponent, EditorHistory, EditorStateService, EditorToolbarComponent, EffectsPanelComponent, ElementRendererComponent, EmbeddedFontsService, EncryptedFileDialogComponent, EquationEditorDialogComponent, EquationRendererComponent, EquationTemplateGalleryComponent, ExportService, FindBarComponent, FindReplaceBarComponent, FontEmbeddingListComponent, FontEmbeddingPanelComponent, GradientPickerComponent, HANDOUT_OPTIONS, HyperlinkDialogComponent, InkRendererComponent, InspectorPanelComponent, IsMobileService, KeepAnnotationsDialogComponent, LoadContentService, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesPanelComponent, OleRendererComponent, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PasswordProtectionDialogComponent, PasswordStrengthMeterComponent, PowerPointViewerComponent, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationSubtitleBarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, RESIZE_HANDLES, SEVERITY_GROUPS, SEVERITY_LABELS, SLIDE_TRANSITION_KEYFRAMES, SVG_WARP_PRESETS, SetUpSlideShowDialogComponent, ShareDialogComponent, ShortcutPanelComponent, ShowOptionsFieldsetComponent, ShowSlidesFieldsetComponent, SignatureStrippedDialogComponent, SignaturesPanelComponent, SignaturesService, SlideCanvasComponent, SlideDiffChangesComponent, SlideDiffRowComponent, SlideDiffThumbnailsComponent, SlideSorterOverlayComponent, SlidesPanelComponent, SmartArtRendererComponent, StatusBarComponent, TYPE_LABELS, TableCellAdvancedFillComponent, TableCellFormattingComponent, TableDataEditorComponent, TablePropertiesComponent, TableRendererComponent, TableResizeOverlayComponent, TableSelectionService, TextAdvancedPanelComponent, VIEWER_THEME, VersionHistoryPanelComponent, ViewerCompareService, ViewerDialogsService, ViewerExtraDialogsComponent, WEBM_MIME_CANDIDATES, ZoomRendererComponent, addCommentToList, advanceStep, annotationMapToInkInserts, applyAcceptedDiff, applyFindReplacements, applyFormatToElement, applyMove, applyResize, assignUserColor, bringForward, bringToFront, buildBroadcastConfig, buildBroadcastViewerUrl, buildClearHyperlinkPatch, buildClickGroups, buildCollaborationConfig, buildCssGradientFromShapeStyle, buildDuotoneFilter, buildDuotoneFilterId, buildEmbeddedFontStyles, buildEquationElement, buildEquationSegment, buildFontFaceRule, buildHyperlinkPatch, buildPatternFillCss, buildPrintHtmlDocument as buildPrintDocument, buildPropertiesPatch, buildShareUrl, bulletIndentPx, canStartBroadcast, canStartShare, canUseClipboard, changeCountLabel, changeIcon, checkFontAvailable, clampCursorPosition, clampGifDimensions, clampNotesFontSize, clampStep, clearAudienceContent, cn, collectAccessibilityIssues, collectElementText, collectSlideText, collectUsedFontFamilies, computeHandoutLayout, computeIsMobile, computeIsTablet, computePageCount, computeSlideIndices, computeTimerProgress, convertOmmlToMathMl, copyFormatFromElement, countAccessibilityIssues, countAnnotationStrokes, defaultCssVars, defaultRadius, defaultThemeColors, deleteElementsByIds, deleteVersion as deleteRecoveryVersion, derivePresenceList, duplicateElementById, durationOf, encodeGif, estimatePageCount, findInSlides, fontMimeForFormat, formatAutoNumber, formatCursorLabel, formatElapsed, formatFileSize, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, getContainerStyle, getDuotoneFilterDef, getImageSrc, getPasswordStrength, getPatternSvg, getVersions as getRecoveryVersions, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getTextBlockStyle, getTextWarp, getWarpCategory, getWarpPath, groupIssuesBySeverity, hasCopyableFormat, hasExistingLink, headerLabel, isAudienceTab, isInjectableUrl, isPpactionUrl, isPresenterMessage, isSigned, isUrlSafe, isValidRoomId, issueTrackKey, issueTypeLabel, latexToMathml, loadAudienceContent, moveElementBy, msToFrameDelayCs, normalizeFontFormat, normalizeSlidesPerPage, ommlToMathml, overallStatus, parseAudienceNonce, pendingElementStyles, pickSupportedMimeType, planGifFrames, planVideoSegments, presenceToCursors, provideViewerTheme, recordWebm, removeCommentFromList, renderToCanvas, replaceInSlides, replaceMatch, resizeElement, resolveFontVariant, resolveHyperlinkHref, resolveParagraphBullet, resolvePresenterNotes, resolveTransitionDuration, revealedElementStyles, routeOrthogonalConnector, sanitizeColor, sanitizeSlideIndex, sanitizeUserName, scanAvailableFonts, searchSlides, seedBroadcastFields, seedHyperlinkDraft, seedPropertiesDraft, seedShareFields, segmentFrameCount, sendBackward, sendToBack, setElementPosition, shouldUseSvgWarp, signatureCountLabel, signatureKey, signatureTimestamp, signerName, statusLabel as slideDiffStatusLabel, slideNumberOf, statusKind, statusLabel$1 as statusLabel, storeAudienceContent, themeStyle, themeToCssVars, toggleCommentResolvedInList, updateElementById, validatePassword, validatePrintSettings, validateRoomId, waypointsToPathD, worstStatus };
8596
+ export type { AccessibilityIssueGroup, AnimationClickGroup, AnnotationInkInsert, AnnotationStroke, Box, BroadcastConfig, BroadcastDefaults, CSSProperties, CanvasSize, ClassValue, CollaborationConfig, CollaborationRole, RouterRect as ConnectorObstacle, RouterPoint as ConnectorPoint, ConnectorRouting, CopiedFormat, DocumentProperties, DuotoneFilterDef, EmbeddedFontStyles, EquationTemplate, FindOptions, FindResult, GifFrame, GifFramePlan, GifPlanOptions, HandoutSlidesPerPage, HyperlinkDraft, NotesSegmentViewModel, ObjectUrlFactory, OverallSignatureStatus, PresentationTool, PresenterExitMessage, PresenterMessage, PresenterNotes, PresenterSlideChangeMessage, PrintColorMode, PrintHtmlDocumentOptions as PrintDocumentOptions, PrintOrientation, PrintSettings, PrintSlideRange, PrintWhat, PropertiesDraft, RecordWebmOptions, RecoveryVersion, RemoteCursor, SanitizedPresence as RemotePresence, ReplaceResult, ResizeHandle, ResolvedFontVariant, ShareDefaults, ShareFormFields, SignatureStatusKind, SlideTransitionAnimations, StyleMap, TableCellSelection, TextWarpCssDef, TextWarpDef, TextWarpPathDef, TimerProgress, VideoPlanOptions, VideoSegmentPlan, ViewerTheme, ViewerThemeColors };