pptx-angular-viewer 1.30.0 → 1.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1914,10 +1914,16 @@ interface EditorHistoryOptions {
1914
1914
  * already-cloned snapshots.
1915
1915
  */
1916
1916
  declare class EditorHistory<T> {
1917
- private readonly _maxDepth;
1917
+ private _maxDepth;
1918
1918
  private readonly _past;
1919
1919
  private readonly _future;
1920
1920
  constructor(options?: EditorHistoryOptions);
1921
+ /**
1922
+ * Change the maximum undo depth at runtime (File > Options > Advanced >
1923
+ * "Maximum number of undos"). Trims the past stack immediately if the new
1924
+ * limit is smaller.
1925
+ */
1926
+ setMaxDepth(maxDepth: number): void;
1921
1927
  /** True when at least one undo step is available. */
1922
1928
  get canUndo(): boolean;
1923
1929
  /** True when at least one redo step is available. */
@@ -4018,10 +4024,6 @@ interface ShortcutReferenceItem {
4018
4024
  shortcut: string;
4019
4025
  }
4020
4026
  declare const SHORTCUT_REFERENCE_ITEMS: readonly ShortcutReferenceItem[];
4021
- interface ViewerPreferenceToggle {
4022
- key: keyof ViewerPreferences;
4023
- labelKey: string;
4024
- }
4025
4027
 
4026
4028
  interface SpeechAlternative {
4027
4029
  readonly transcript: string;
@@ -4127,95 +4129,140 @@ type ToolbarTabId = 'file' | 'home' | 'insert' | 'draw' | 'design' | 'transition
4127
4129
  type ToolbarActionId = ToolbarButtonId | ToolbarTabId;
4128
4130
 
4129
4131
  /**
4130
- * Minimal GIF89a encoder (pure JS, no external dependency) plus pure
4131
- * frame-planning helpers — shared by the React, Vue, and Angular bindings.
4132
- *
4133
- * The encoder uses median-cut colour quantisation (256 colours per frame) and
4134
- * LZW compression. It carries no DOM/browser dependency — it operates on
4135
- * pre-extracted `ImageData` objects so each binding owns the rasterisation
4136
- * (grabbing a canvas, calling `getImageData`) and the `Blob` wrapping, while
4137
- * the byte encoding lives here once.
4138
- *
4139
- * No npm GIF library is depended on; this self-contained source replaces the
4140
- * three previously-duplicated copies (React `export-gif-encoder.ts`, Vue
4141
- * `gif-encoder.ts`, Angular `gif-export-helpers.ts`).
4142
- */
4143
- /** A single GIF frame descriptor produced by the planning helpers. */
4144
- interface GifFramePlan {
4145
- /** 0-based slide index this frame corresponds to. */
4146
- slideIndex: number;
4147
- /** Frame delay in **centiseconds** (1 cs = 10 ms), as required by GIF89a. */
4148
- delayCs: number;
4149
- }
4150
- /** Options controlling GIF frame planning. */
4151
- interface GifPlanOptions {
4152
- /** Total number of slides in the presentation. */
4153
- totalSlides: number;
4154
- /**
4155
- * Duration each slide is shown, in **milliseconds** (default: 2000).
4156
- * Per-slide overrides can be supplied via {@link slideTimingsMs}.
4157
- */
4158
- slideDurationMs?: number;
4159
- /**
4160
- * Per-slide duration overrides in milliseconds (index maps to slide index).
4161
- * When a slide's index is present here its value takes precedence over
4162
- * {@link slideDurationMs}.
4163
- */
4164
- slideTimingsMs?: number[];
4132
+ * Full PowerPoint "File > Options" parity model.
4133
+ *
4134
+ * Groups mirror the ten categories of PowerPoint's Options dialog. Values are
4135
+ * flat primitives per group so the dialog panes can be rendered generically
4136
+ * from `VIEWER_OPTIONS_SCHEMA` in every binding. The legacy six-toggle
4137
+ * `ViewerPreferences` surface stays supported via the mapping helpers below.
4138
+ */
4139
+ type ScreenTipStyle = 'descriptions' | 'plain' | 'off';
4140
+ type DisplayOptimization = 'appearance' | 'compatibility';
4141
+ type ImageResolutionPreset = 'highFidelity' | 'ppi330' | 'ppi220' | 'ppi150' | 'ppi96';
4142
+ type OpenDocumentsView = 'savedView' | 'normal' | 'outline' | 'slideSorter' | 'notes';
4143
+ type DefaultExportFormat = 'pptx' | 'pdf' | 'png';
4144
+ type QuickAccessPosition = 'above' | 'below';
4145
+ type FeedbackSoundScheme = 'modern' | 'classic';
4146
+ type OptionsPrintWhat = 'slides' | 'handouts' | 'notes' | 'outline';
4147
+ type OptionsPrintColorMode = 'color' | 'grayscale' | 'blackAndWhite';
4148
+ interface ViewerGeneralOptions {
4149
+ displayOptimization: DisplayOptimization;
4150
+ showMiniToolbar: boolean;
4151
+ enableLivePreview: boolean;
4152
+ collapseRibbonAutomatically: boolean;
4153
+ collapseSearchByDefault: boolean;
4154
+ screenTipStyle: ScreenTipStyle;
4155
+ userName: string;
4156
+ userInitials: string;
4157
+ showStartScreen: boolean;
4158
+ }
4159
+ interface ViewerProofingOptions {
4160
+ autoCorrectTwoInitialCapitals: boolean;
4161
+ autoCorrectCapitalizeFirstLetter: boolean;
4162
+ autoCorrectCapitalizeDayNames: boolean;
4163
+ autoCorrectSmartQuotes: boolean;
4164
+ autoCorrectHyphensToDash: boolean;
4165
+ autoCorrectFractions: boolean;
4166
+ autoCorrectOrdinals: boolean;
4167
+ ignoreUppercase: boolean;
4168
+ ignoreWordsWithNumbers: boolean;
4169
+ ignoreInternetAddresses: boolean;
4170
+ flagRepeatedWords: boolean;
4171
+ checkSpellingAsYouType: boolean;
4172
+ hideSpellingErrors: boolean;
4173
+ }
4174
+ interface ViewerSaveOptions {
4175
+ autoSave: boolean;
4176
+ autoRecoverIntervalMinutes: number;
4177
+ keepLastAutoRecoveredVersion: boolean;
4178
+ defaultExportFormat: DefaultExportFormat;
4179
+ embedFonts: boolean;
4180
+ embedAllFontCharacters: boolean;
4181
+ cacheRetentionDays: number;
4182
+ clearCacheOnClose: boolean;
4183
+ }
4184
+ interface ViewerAccessibilityOptions {
4185
+ showAccessibilityStatus: boolean;
4186
+ feedbackWithSound: boolean;
4187
+ soundScheme: FeedbackSoundScheme;
4188
+ showShortcutKeysInScreenTips: boolean;
4189
+ reducedMotion: boolean;
4165
4190
  }
4166
- /**
4167
- * Compute the ordered list of {@link GifFramePlan} objects for a presentation.
4168
- * All timing is derived here; nothing browser-specific is touched.
4169
- */
4170
- declare function planGifFrames(opts: GifPlanOptions): GifFramePlan[];
4171
- /**
4172
- * Convert a slide duration in milliseconds to a GIF89a frame delay in
4173
- * centiseconds (1 cs = 10 ms), clamped to a minimum of 1 cs.
4174
- */
4175
- declare function msToFrameDelayCs(ms: number): number;
4176
- /**
4177
- * Clamp canvas/image dimensions so neither side exceeds `maxSide` pixels while
4178
- * preserving the aspect ratio. When both dimensions are already within the
4179
- * limit the original values are returned unchanged.
4180
- */
4181
- declare function clampGifDimensions(width: number, height: number, maxSide?: number): {
4182
- width: number;
4183
- height: number;
4184
- };
4185
- /** A single animated-GIF frame: raw RGBA pixels plus its dimensions. */
4186
- interface GifFrame {
4187
- imageData: ImageData;
4188
- width: number;
4189
- height: number;
4190
- /**
4191
- * Optional per-frame delay in **centiseconds** (1 cs = 10 ms). When set it
4192
- * overrides the encoder-level delay for this frame only, which is how
4193
- * per-slide durations from {@link planGifFrames} flow into the encoder.
4194
- */
4195
- delayCs?: number;
4191
+ interface ViewerAdvancedOptions {
4192
+ autoSelectEntireWord: boolean;
4193
+ allowTextDragAndDrop: boolean;
4194
+ maximumUndoSteps: number;
4195
+ useSmartCutAndPaste: boolean;
4196
+ showPasteOptionsButton: boolean;
4197
+ imageDefaultResolution: ImageResolutionPreset;
4198
+ doNotCompressImages: boolean;
4199
+ chartPropertiesFollowDataPoint: boolean;
4200
+ recentPresentationsCount: number;
4201
+ showVerticalRuler: boolean;
4202
+ showGrid: boolean;
4203
+ snapToGrid: boolean;
4204
+ disableHardwareAcceleration: boolean;
4205
+ openDocumentsView: OpenDocumentsView;
4206
+ slideShowShowMenuOnRightClick: boolean;
4207
+ slideShowShowPopupToolbar: boolean;
4208
+ slideShowPromptKeepInkAnnotations: boolean;
4209
+ slideShowEndWithBlackSlide: boolean;
4210
+ printInBackground: boolean;
4211
+ printHighQuality: boolean;
4212
+ printUseMostRecentSettings: boolean;
4213
+ printWhat: OptionsPrintWhat;
4214
+ printColorMode: OptionsPrintColorMode;
4215
+ printHiddenSlides: boolean;
4216
+ printScaleToFit: boolean;
4217
+ printFrameSlides: boolean;
4218
+ }
4219
+ interface ViewerRibbonOptions {
4220
+ /** Ribbon tabs unticked in Customize Ribbon. The File tab can never be hidden. */
4221
+ hiddenTabIds: ToolbarTabId[];
4222
+ }
4223
+ interface ViewerQuickAccessOptions {
4224
+ visible: boolean;
4225
+ position: QuickAccessPosition;
4226
+ showCommandLabels: boolean;
4227
+ /** Ordered ids from `QUICK_ACCESS_COMMAND_CATALOG`. */
4228
+ commandIds: string[];
4229
+ }
4230
+ interface ViewerTrustOptions {
4231
+ openInProtectedView: boolean;
4232
+ allowExternalContent: boolean;
4233
+ confirmExternalHyperlinks: boolean;
4234
+ }
4235
+ interface ViewerOptions {
4236
+ general: ViewerGeneralOptions;
4237
+ proofing: ViewerProofingOptions;
4238
+ save: ViewerSaveOptions;
4239
+ accessibility: ViewerAccessibilityOptions;
4240
+ advanced: ViewerAdvancedOptions;
4241
+ ribbon: ViewerRibbonOptions;
4242
+ quickAccess: ViewerQuickAccessOptions;
4243
+ trust: ViewerTrustOptions;
4244
+ }
4245
+ type ViewerOptionsGroupId = keyof ViewerOptions;
4246
+ type ViewerOptionPrimitive = boolean | number | string;
4247
+
4248
+ /**
4249
+ * Quick Access Toolbar command catalog and list-editing helpers, backing the
4250
+ * Options > Quick Access Toolbar pane and the title-bar QAT strip.
4251
+ *
4252
+ * Ids map onto actions every binding already exposes; each binding resolves
4253
+ * an id to its own icon + handler when rendering the strip.
4254
+ */
4255
+ interface QuickAccessCommandDefinition {
4256
+ id: string;
4257
+ labelKey: string;
4258
+ /** Logical icon name bindings map to their icon set. */
4259
+ icon: string;
4196
4260
  }
4197
- /** Options for {@link encodeGif}. */
4198
- interface EncodeGifOptions {
4199
- /**
4200
- * Frame delay in **centiseconds** (1 cs = 10 ms). Applies to every frame
4201
- * that does not carry its own {@link GifFrame.delayCs} override.
4202
- * Default: 200 cs (2 s).
4203
- */
4204
- delayCs?: number;
4205
- /** Number of times the animation loops (0 = loop forever, default). */
4206
- loopCount?: number;
4261
+
4262
+ interface ViewerAddinStatus {
4263
+ /** Addin id -> whether the capability is active in this host. */
4264
+ [addinId: string]: boolean | undefined;
4207
4265
  }
4208
- /**
4209
- * Encode an ordered list of RGBA frames into an animated GIF89a byte sequence.
4210
- *
4211
- * Accepts either a bare `delayCs` number (React/Vue call style) or an
4212
- * {@link EncodeGifOptions} object (Angular call style) as the second argument.
4213
- *
4214
- * @param frames Ordered frame descriptors (all must share identical dimensions).
4215
- * @param delay Per-frame delay in centiseconds, or an options object.
4216
- * @returns Raw GIF89a bytes.
4217
- */
4218
- declare function encodeGif(frames: GifFrame[], delay?: number | EncodeGifOptions): Uint8Array;
4219
4266
 
4220
4267
  /**
4221
4268
  * Pure handout layout calculations, shared by every binding's print path.
@@ -4339,6 +4386,176 @@ interface PrintHtmlDocumentOptions {
4339
4386
  */
4340
4387
  declare function buildPrintHtmlDocument(options: PrintHtmlDocumentOptions): string;
4341
4388
 
4389
+ /**
4390
+ * Control/section/tab descriptor types for the File > Options schema, plus
4391
+ * the terse constructors the tab-definition modules build panes with.
4392
+ */
4393
+ type ViewerOptionsTabId = 'general' | 'proofing' | 'save' | 'language' | 'accessibility' | 'advanced' | 'ribbon' | 'quickAccess' | 'addIns' | 'trust';
4394
+ interface ViewerOptionsSelectChoice {
4395
+ value: string;
4396
+ labelKey: string;
4397
+ }
4398
+ interface ControlBase {
4399
+ group: ViewerOptionsGroupId;
4400
+ key: string;
4401
+ labelKey: string;
4402
+ /** Optional "(i)" tooltip body, mirroring PowerPoint's info bubbles. */
4403
+ infoKey?: string;
4404
+ /** Renders indented under the preceding control, PowerPoint-style. */
4405
+ indent?: boolean;
4406
+ }
4407
+ interface ViewerOptionsToggleControl extends ControlBase {
4408
+ kind: 'toggle';
4409
+ }
4410
+ interface ViewerOptionsSelectControl extends ControlBase {
4411
+ kind: 'select';
4412
+ choices: readonly ViewerOptionsSelectChoice[];
4413
+ }
4414
+ interface ViewerOptionsNumberControl extends ControlBase {
4415
+ kind: 'number';
4416
+ min: number;
4417
+ max: number;
4418
+ step?: number;
4419
+ unitKey?: string;
4420
+ }
4421
+ interface ViewerOptionsTextControl extends ControlBase {
4422
+ kind: 'text';
4423
+ maxLength?: number;
4424
+ }
4425
+ type ViewerOptionsControl = ViewerOptionsToggleControl | ViewerOptionsSelectControl | ViewerOptionsNumberControl | ViewerOptionsTextControl;
4426
+ interface ViewerOptionsSection {
4427
+ id: string;
4428
+ titleKey: string;
4429
+ /** Optional explanatory paragraph under the section title. */
4430
+ descriptionKey?: string;
4431
+ /** Marks a bespoke block a binding renders itself (e.g. the theme picker). */
4432
+ special?: 'themePicker' | 'clearCache' | 'shortcutReference';
4433
+ controls: readonly ViewerOptionsControl[];
4434
+ }
4435
+ interface ViewerOptionsTabDefinition {
4436
+ id: ViewerOptionsTabId;
4437
+ labelKey: string;
4438
+ /** Headline shown at the top of the pane. */
4439
+ descriptionKey: string;
4440
+ /** Pane needing a bespoke view instead of (or on top of) `sections`. */
4441
+ custom?: 'language' | 'ribbon' | 'quickAccess' | 'addIns';
4442
+ sections: readonly ViewerOptionsSection[];
4443
+ }
4444
+
4445
+ /**
4446
+ * Framework-neutral store behind the File > Options dialog.
4447
+ *
4448
+ * Holds a `ViewerOptions` snapshot, notifies subscribers on change, and
4449
+ * persists a sparse diff into the shared `pptx-viewer-prefs` localStorage
4450
+ * entry so choices survive reloads in every binding.
4451
+ */
4452
+ type ViewerOptionsListener = (options: ViewerOptions) => void;
4453
+ interface ViewerOptionsStore {
4454
+ getOptions(): ViewerOptions;
4455
+ /** Replace the whole snapshot (e.g. hydrating from a host prop). */
4456
+ setOptions(next: ViewerOptions): void;
4457
+ /** Set one primitive value; ignores unknown keys and mismatched types. */
4458
+ setValue(group: ViewerOptionsGroupId, key: string, value: ViewerOptionPrimitive): void;
4459
+ getValue(group: ViewerOptionsGroupId, key: string): ViewerOptionPrimitive | undefined;
4460
+ /** Toggle a ribbon tab's visibility. The File tab is always kept visible. */
4461
+ setRibbonTabHidden(tabId: ToolbarTabId, hidden: boolean): void;
4462
+ setQuickAccessCommands(commandIds: readonly string[]): void;
4463
+ /** Reset every option (or one tab-group) back to defaults. */
4464
+ reset(group?: ViewerOptionsGroupId): void;
4465
+ subscribe(listener: ViewerOptionsListener): () => void;
4466
+ }
4467
+
4468
+ /**
4469
+ * Minimal GIF89a encoder (pure JS, no external dependency) plus pure
4470
+ * frame-planning helpers — shared by the React, Vue, and Angular bindings.
4471
+ *
4472
+ * The encoder uses median-cut colour quantisation (256 colours per frame) and
4473
+ * LZW compression. It carries no DOM/browser dependency — it operates on
4474
+ * pre-extracted `ImageData` objects — so each binding owns the rasterisation
4475
+ * (grabbing a canvas, calling `getImageData`) and the `Blob` wrapping, while
4476
+ * the byte encoding lives here once.
4477
+ *
4478
+ * No npm GIF library is depended on; this self-contained source replaces the
4479
+ * three previously-duplicated copies (React `export-gif-encoder.ts`, Vue
4480
+ * `gif-encoder.ts`, Angular `gif-export-helpers.ts`).
4481
+ */
4482
+ /** A single GIF frame descriptor produced by the planning helpers. */
4483
+ interface GifFramePlan {
4484
+ /** 0-based slide index this frame corresponds to. */
4485
+ slideIndex: number;
4486
+ /** Frame delay in **centiseconds** (1 cs = 10 ms), as required by GIF89a. */
4487
+ delayCs: number;
4488
+ }
4489
+ /** Options controlling GIF frame planning. */
4490
+ interface GifPlanOptions {
4491
+ /** Total number of slides in the presentation. */
4492
+ totalSlides: number;
4493
+ /**
4494
+ * Duration each slide is shown, in **milliseconds** (default: 2000).
4495
+ * Per-slide overrides can be supplied via {@link slideTimingsMs}.
4496
+ */
4497
+ slideDurationMs?: number;
4498
+ /**
4499
+ * Per-slide duration overrides in milliseconds (index maps to slide index).
4500
+ * When a slide's index is present here its value takes precedence over
4501
+ * {@link slideDurationMs}.
4502
+ */
4503
+ slideTimingsMs?: number[];
4504
+ }
4505
+ /**
4506
+ * Compute the ordered list of {@link GifFramePlan} objects for a presentation.
4507
+ * All timing is derived here; nothing browser-specific is touched.
4508
+ */
4509
+ declare function planGifFrames(opts: GifPlanOptions): GifFramePlan[];
4510
+ /**
4511
+ * Convert a slide duration in milliseconds to a GIF89a frame delay in
4512
+ * centiseconds (1 cs = 10 ms), clamped to a minimum of 1 cs.
4513
+ */
4514
+ declare function msToFrameDelayCs(ms: number): number;
4515
+ /**
4516
+ * Clamp canvas/image dimensions so neither side exceeds `maxSide` pixels while
4517
+ * preserving the aspect ratio. When both dimensions are already within the
4518
+ * limit the original values are returned unchanged.
4519
+ */
4520
+ declare function clampGifDimensions(width: number, height: number, maxSide?: number): {
4521
+ width: number;
4522
+ height: number;
4523
+ };
4524
+ /** A single animated-GIF frame: raw RGBA pixels plus its dimensions. */
4525
+ interface GifFrame {
4526
+ imageData: ImageData;
4527
+ width: number;
4528
+ height: number;
4529
+ /**
4530
+ * Optional per-frame delay in **centiseconds** (1 cs = 10 ms). When set it
4531
+ * overrides the encoder-level delay for this frame only, which is how
4532
+ * per-slide durations from {@link planGifFrames} flow into the encoder.
4533
+ */
4534
+ delayCs?: number;
4535
+ }
4536
+ /** Options for {@link encodeGif}. */
4537
+ interface EncodeGifOptions {
4538
+ /**
4539
+ * Frame delay in **centiseconds** (1 cs = 10 ms). Applies to every frame
4540
+ * that does not carry its own {@link GifFrame.delayCs} override.
4541
+ * Default: 200 cs (2 s).
4542
+ */
4543
+ delayCs?: number;
4544
+ /** Number of times the animation loops (0 = loop forever, default). */
4545
+ loopCount?: number;
4546
+ }
4547
+ /**
4548
+ * Encode an ordered list of RGBA frames into an animated GIF89a byte sequence.
4549
+ *
4550
+ * Accepts either a bare `delayCs` number (React/Vue call style) or an
4551
+ * {@link EncodeGifOptions} object (Angular call style) as the second argument.
4552
+ *
4553
+ * @param frames Ordered frame descriptors (all must share identical dimensions).
4554
+ * @param delay Per-frame delay in centiseconds, or an options object.
4555
+ * @returns Raw GIF89a bytes.
4556
+ */
4557
+ declare function encodeGif(frames: GifFrame[], delay?: number | EncodeGifOptions): Uint8Array;
4558
+
4342
4559
  /**
4343
4560
  * Pure video (WebM) export planning helpers shared by every binding's video
4344
4561
  * export. Frame-segment timing, fps -> frame-interval maths, and MediaRecorder
@@ -4707,6 +4924,20 @@ declare class CollaborationService {
4707
4924
  * never overwrites the shared document before receiving it.
4708
4925
  */
4709
4926
  seedBaseline(slides: readonly PptxSlide[]): void;
4927
+ /**
4928
+ * Re-adopt the shared document's slides after a local content load has been
4929
+ * committed to viewer state. The load pipeline applies its parsed deck
4930
+ * unconditionally, so a load that finishes AFTER the room's slides were
4931
+ * already applied (a late joiner's bootstrap deck parsing slower than the
4932
+ * doc sync) silently clobbers the synced state and, with the doc itself
4933
+ * unchanged, the remote observer never re-fires. When the room already has
4934
+ * slides they win: the doc content is re-applied through `onRemoteSlides`
4935
+ * and recorded as the sync baseline (bypassing the usual JSON dedupe) so
4936
+ * the follow-up local broadcast of the adopted deck is a no-op. An empty
4937
+ * room means this client is the seeder and the loaded deck stands, written
4938
+ * by the normal gated broadcast path. Returns true when the doc was adopted.
4939
+ */
4940
+ adoptDocSlidesAfterLoad(): boolean;
4710
4941
  broadcastSlides(slides: readonly PptxSlide[]): void;
4711
4942
  setCursor(x: number, y: number, activeSlideIndex?: number): void;
4712
4943
  setSelection(selectedElementId: string | undefined, activeSlideIndex?: number): void;
@@ -6320,6 +6551,56 @@ declare class ViewerMobileSheetService {
6320
6551
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ViewerMobileSheetService>;
6321
6552
  }
6322
6553
 
6554
+ declare class ViewerOptionsService {
6555
+ /**
6556
+ * Optional: `inject()` needs an active injection context, which plain
6557
+ * `new ViewerOptionsService()` (used by the colocated unit tests) does not
6558
+ * provide. Outside DI the subscription simply lives as long as the instance.
6559
+ */
6560
+ private readonly destroyRef;
6561
+ private readonly translate;
6562
+ /** Imperative store: hydrates from and persists to `pptx-viewer-prefs`. */
6563
+ readonly store: ViewerOptionsStore;
6564
+ private readonly _options;
6565
+ /** Reactive File > Options snapshot; a new object per change. */
6566
+ readonly options: _angular_core.Signal<ViewerOptions>;
6567
+ constructor();
6568
+ setValue(group: ViewerOptionsGroupId, key: string, value: ViewerOptionPrimitive): void;
6569
+ setRibbonTabHidden(tabId: ToolbarTabId, hidden: boolean): void;
6570
+ setQuickAccessCommands(commandIds: readonly string[]): void;
6571
+ reset(group?: ViewerOptionsGroupId): void;
6572
+ /** Restore a snapshot wholesale (the dialog's Cancel semantics). */
6573
+ restore(snapshot: ViewerOptions): void;
6574
+ /** Undo-stack depth for `new EditorHistory({ maxDepth })`. */
6575
+ historyDepth(): number;
6576
+ /** AutoRecover cadence in seconds for the autosave engine. */
6577
+ autosaveIntervalSeconds(): number;
6578
+ /** Print-dialog seed; `undefined` keeps the dialog's own recents. */
6579
+ printDefaults(): Partial<PrintSettings> | undefined;
6580
+ /** Option-driven CSS classes for the viewer root (`pptx-ng-*` prefixed). */
6581
+ rootClasses(): string[];
6582
+ /** Tooltip text under the current ScreenTip style (undefined = suppress). */
6583
+ screenTip(label: string, description?: string, shortcut?: string): string | undefined;
6584
+ /** Run the enabled AutoCorrect rules over a committed run of text. */
6585
+ autoCorrect(text: string): string;
6586
+ /** Play the Accessibility "feedback with sound" cue for a completed action. */
6587
+ playFeedback(): void;
6588
+ /** Whether Trust Center forces the deck to open read-only. */
6589
+ protectedView(): boolean;
6590
+ /**
6591
+ * Gate an external hyperlink activation. Returns `true` when navigation may
6592
+ * proceed (no confirmation required, or the user confirmed the prompt).
6593
+ */
6594
+ confirmExternalHyperlink(href: string): boolean;
6595
+ /**
6596
+ * Options > Save > "Delete cached files": purge every autosave recovery
6597
+ * snapshot from the shared IndexedDB store. Resolves with the purge count.
6598
+ */
6599
+ clearCache(): Promise<number>;
6600
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewerOptionsService, never>;
6601
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ViewerOptionsService>;
6602
+ }
6603
+
6323
6604
  /**
6324
6605
  * presentation-annotations-helpers.ts: Pure geometry helpers for presentation
6325
6606
  * ink annotations (pen, highlighter, eraser, laser).
@@ -6486,8 +6767,8 @@ declare class PowerPointViewerComponent {
6486
6767
  readonly content: _angular_core.InputSignal<ArrayBuffer | Uint8Array<ArrayBufferLike> | null>;
6487
6768
  /** Licensed fonts supplied by the host application. No fonts are bundled. */
6488
6769
  readonly fontsInput: _angular_core.InputSignal<ViewerFontSource[]>;
6489
- /** Whether editing actions are enabled. (Editor chrome not yet ported.) */
6490
- readonly canEdit: _angular_core.InputSignal<boolean>;
6770
+ /** Whether editing actions are enabled (host input; see {@link canEdit}). */
6771
+ readonly canEditInput: _angular_core.InputSignal<boolean>;
6491
6772
  /** Optional class applied to the root element. */
6492
6773
  readonly class: _angular_core.InputSignal<string>;
6493
6774
  /** Theme configuration for customising the viewer's appearance. Always wins over a File > Options > Appearance selection; see {@link defaultThemeKey}. */
@@ -6612,6 +6893,7 @@ declare class PowerPointViewerComponent {
6612
6893
  protected readonly presenterWindow: PresenterWindowService;
6613
6894
  private readonly destroyRef;
6614
6895
  protected readonly dialogs: ViewerDialogsService;
6896
+ protected readonly viewerOpts: ViewerOptionsService;
6615
6897
  private readonly compareSvc;
6616
6898
  protected readonly xport: ViewerExportService;
6617
6899
  protected readonly findReplace: ViewerFindReplaceService;
@@ -6636,6 +6918,12 @@ declare class PowerPointViewerComponent {
6636
6918
  private readonly encryptedNotice;
6637
6919
  /** The `<main>` host; used to locate the live `.pptx-ng-canvas-stage`. */
6638
6920
  private readonly mainEl;
6921
+ /**
6922
+ * Effective edit permission: the host's `canEdit` input gated by Trust
6923
+ * Center > "Open presentations in Protected View", which forces the deck
6924
+ * read-only while enabled (File > Options wiring, mirrors PowerPoint).
6925
+ */
6926
+ protected readonly canEdit: _angular_core.Signal<boolean>;
6639
6927
  protected readonly activeSlideIndex: _angular_core.WritableSignal<number>;
6640
6928
  /** Slides to display: the editable deck when `canEdit`, else the loaded deck. */
6641
6929
  protected readonly displaySlides: _angular_core.Signal<readonly PptxSlide[]>;
@@ -6721,8 +7009,17 @@ declare class PowerPointViewerComponent {
6721
7009
  protected readonly spellCheck: _angular_core.WritableSignal<boolean>;
6722
7010
  /** User override that suppresses viewer animations and transitions. */
6723
7011
  protected readonly reducedMotion: _angular_core.WritableSignal<boolean>;
6724
- /** Snapshot consumed by the settings dialog. */
7012
+ /**
7013
+ * The six legacy preference toggles as a snapshot, kept in a guarded
7014
+ * two-way sync with the File > Options store (see the constructor).
7015
+ */
6725
7016
  protected readonly viewerSettings: _angular_core.Signal<ViewerPreferences>;
7017
+ /**
7018
+ * Root class list: the host `class` input, the reduced-motion override, and
7019
+ * the option-driven display classes (`resolveOptionRootClasses`, so e.g.
7020
+ * hardware-acceleration and compatibility-display choices are styleable).
7021
+ */
7022
+ protected readonly rootClasses: _angular_core.Signal<string[]>;
6726
7023
  /** Whether the Insert SmartArt gallery dialog is open. */
6727
7024
  protected readonly showSmartArtInsert: _angular_core.WritableSignal<boolean>;
6728
7025
  /** The single selected element on the active slide (for the inspector). */
@@ -6841,8 +7138,10 @@ declare class PowerPointViewerComponent {
6841
7138
  protected addGuide(axis: 'x' | 'y'): void;
6842
7139
  /** Swap the deck for a restored version-history snapshot. */
6843
7140
  protected onRestoreVersion(bytes: Uint8Array): void;
6844
- /** Apply Settings dialog changes to the live editor state. */
6845
- protected onSettingsChange(settings: ViewerSettings): void;
7141
+ /** Apply one legacy preference snapshot onto the scattered live signals. */
7142
+ private applyPreferenceSnapshot;
7143
+ /** Dispatch a Quick Access Toolbar command id to its existing handler. */
7144
+ protected onQuickAccessCommand(id: string): void;
6846
7145
  /**
6847
7146
  * Mobile "Format" slot: surface the inspector for the current selection.
6848
7147
  * On mobile the format pane starts closed (React parity: the canvas owns
@@ -6877,7 +7176,7 @@ declare class PowerPointViewerComponent {
6877
7176
  /** Resolve the live slide-stage element within `<main>`. */
6878
7177
  private stageElement;
6879
7178
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PowerPointViewerComponent, never>;
6880
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PowerPointViewerComponent, "pptx-viewer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "fontsInput": { "alias": "fonts"; "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; }; "defaultThemeKey": { "alias": "defaultThemeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "onThemeChange": { "alias": "onThemeChange"; "required": false; "isSignal": true; }; "defaultLocale": { "alias": "defaultLocale"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "onLocaleChange": { "alias": "onLocaleChange"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "collaboration": { "alias": "collaboration"; "required": false; "isSignal": true; }; "authorName": { "alias": "authorName"; "required": false; "isSignal": true; }; "shareDefaults": { "alias": "shareDefaults"; "required": false; "isSignal": true; }; "onOpenFile": { "alias": "onOpenFile"; "required": false; "isSignal": true; }; "smartArt3D": { "alias": "smartArt3D"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "activeSlideChange": "activeSlideChange"; "dirtyChange": "dirtyChange"; "contentChange": "contentChange"; "propertiesChange": "propertiesChange"; "modeChange": "modeChange"; "zoomChange": "zoomChange"; "selectionChange": "selectionChange"; "slideCountChange": "slideCountChange"; "startCollaboration": "startCollaboration"; "stopCollaboration": "stopCollaboration"; }, never, never, true, never>;
7179
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PowerPointViewerComponent, "pptx-viewer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "fontsInput": { "alias": "fonts"; "required": false; "isSignal": true; }; "canEditInput": { "alias": "canEdit"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "defaultThemeKey": { "alias": "defaultThemeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "onThemeChange": { "alias": "onThemeChange"; "required": false; "isSignal": true; }; "defaultLocale": { "alias": "defaultLocale"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "onLocaleChange": { "alias": "onLocaleChange"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "collaboration": { "alias": "collaboration"; "required": false; "isSignal": true; }; "authorName": { "alias": "authorName"; "required": false; "isSignal": true; }; "shareDefaults": { "alias": "shareDefaults"; "required": false; "isSignal": true; }; "onOpenFile": { "alias": "onOpenFile"; "required": false; "isSignal": true; }; "smartArt3D": { "alias": "smartArt3D"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "activeSlideChange": "activeSlideChange"; "dirtyChange": "dirtyChange"; "contentChange": "contentChange"; "propertiesChange": "propertiesChange"; "modeChange": "modeChange"; "zoomChange": "zoomChange"; "selectionChange": "selectionChange"; "slideCountChange": "slideCountChange"; "startCollaboration": "startCollaboration"; "stopCollaboration": "stopCollaboration"; }, never, never, true, never>;
6881
7180
  }
6882
7181
 
6883
7182
  /** A selected chart sub-part, scoped to the chart element that owns it. */
@@ -7232,7 +7531,7 @@ declare class ZoomTargetService {
7232
7531
  * `PowerPointViewerComponent`'s children (ribbon, slide canvas, inspector,
7233
7532
  * dialogs, ...) rely on via `inject()`.
7234
7533
  */
7235
- declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof CollaborationService, typeof AccessibilityService, typeof AutosaveService, typeof PrintService, typeof IsMobileService, typeof SmartArt3DService, typeof FieldContextService, typeof ZoomTargetService, typeof ViewerDialogsService, typeof ViewerCompareService, typeof ViewerExportService, typeof ViewerFindReplaceService, typeof ViewerCustomShowsService, typeof ViewerCollaborationSessionService, typeof ViewerCanvasEditingService, typeof ViewerCollabCursorService, typeof ViewerDocumentPropertiesService, typeof ViewerFileIOService, typeof ViewerFormatPainterService, typeof ViewerInspectorPanelService, typeof ViewerKeyboardService, typeof ViewerMobileSheetService, typeof ViewerPresentationModeService, typeof ViewerThemeGalleryService, typeof ViewerTouchGesturesService, typeof ViewerZoomService];
7534
+ declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof CollaborationService, typeof AccessibilityService, typeof AutosaveService, typeof PrintService, typeof IsMobileService, typeof SmartArt3DService, typeof FieldContextService, typeof ZoomTargetService, typeof ViewerDialogsService, typeof ViewerCompareService, typeof ViewerExportService, typeof ViewerFindReplaceService, typeof ViewerCustomShowsService, typeof ViewerCollaborationSessionService, typeof ViewerCanvasEditingService, typeof ViewerCollabCursorService, typeof ViewerDocumentPropertiesService, typeof ViewerFileIOService, typeof ViewerFormatPainterService, typeof ViewerInspectorPanelService, typeof ViewerKeyboardService, typeof ViewerMobileSheetService, typeof ViewerOptionsService, typeof ViewerPresentationModeService, typeof ViewerThemeGalleryService, typeof ViewerTouchGesturesService, typeof ViewerZoomService];
7236
7535
 
7237
7536
  /** Drawing tool IDs (mirrors React DRAW_TOOLS). */
7238
7537
  type DrawTool$1 = 'select' | 'pen' | 'highlighter' | 'eraser' | 'freeform';
@@ -11632,19 +11931,16 @@ declare class ViewerExtraDialogsComponent {
11632
11931
  readonly filePath: _angular_core.InputSignal<string | undefined>;
11633
11932
  /** Custom shows offered in the set-up-slide-show "show slides" fieldset. */
11634
11933
  readonly customShows: _angular_core.InputSignal<PptxCustomShow[]>;
11635
- /** Live viewer preferences surfaced by the settings dialog. */
11636
- readonly settings: _angular_core.InputSignal<ViewerPreferences>;
11637
11934
  readonly themeKey: _angular_core.InputSignal<string>;
11638
11935
  readonly availableThemes: _angular_core.InputSignal<readonly ThemeCatalogEntry[]>;
11639
11936
  readonly localeCode: _angular_core.InputSignal<string>;
11640
11937
  readonly availableLocales: _angular_core.InputSignal<readonly LocaleCatalogEntry[]>;
11641
11938
  /** Fired with a restored `.pptx` version's bytes; the host swaps the deck. */
11642
11939
  readonly restoreContent: _angular_core.OutputEmitterRef<Uint8Array<ArrayBufferLike>>;
11643
- /** Fired whenever a settings toggle changes. */
11644
- readonly settingsChange: _angular_core.OutputEmitterRef<ViewerPreferences>;
11645
11940
  readonly themeKeySelect: _angular_core.OutputEmitterRef<string>;
11646
11941
  readonly localeSelect: _angular_core.OutputEmitterRef<string>;
11647
11942
  protected readonly svc: ViewerDialogsService;
11943
+ protected readonly viewerOpts: ViewerOptionsService;
11648
11944
  protected readonly compare: ViewerCompareService;
11649
11945
  protected readonly editor: EditorStateService;
11650
11946
  protected readonly loader: LoadContentService;
@@ -11667,6 +11963,8 @@ declare class ViewerExtraDialogsComponent {
11667
11963
  promptKeepAnnotations(map: SlideAnnotationMap): void;
11668
11964
  /** Persist the pending presentation ink as `ink` elements on their slides. */
11669
11965
  onKeepAnnotations(): void;
11966
+ /** Options > Save > "Delete cached files": purge autosave recovery snapshots. */
11967
+ protected onClearOptionsCache(): void;
11670
11968
  /** Drop the pending presentation ink. */
11671
11969
  onDiscardAnnotations(): void;
11672
11970
  /** Insert a new equation element, or update the one currently being edited. */
@@ -11678,7 +11976,7 @@ declare class ViewerExtraDialogsComponent {
11678
11976
  /** Clear any save password. */
11679
11977
  onRemovePassword(): void;
11680
11978
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewerExtraDialogsComponent, never>;
11681
- 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; }; "settings": { "alias": "settings"; "required": true; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; }, { "restoreContent": "restoreContent"; "settingsChange": "settingsChange"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; }, never, never, true, never>;
11979
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ViewerExtraDialogsComponent, "pptx-viewer-extra-dialogs", never, { "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; "selectedElementId": { "alias": "selectedElementId"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "customShows": { "alias": "customShows"; "required": false; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; }, { "restoreContent": "restoreContent"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; }, never, never, true, never>;
11682
11980
  }
11683
11981
 
11684
11982
  declare class EquationEditorDialogComponent {
@@ -12058,29 +12356,55 @@ declare class ShortcutPanelComponent {
12058
12356
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShortcutPanelComponent, "pptx-shortcut-panel", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, never, true, never>;
12059
12357
  }
12060
12358
 
12359
+ /** One dialog-level option edit (group + key + new primitive value). */
12360
+ interface OptionValueChange {
12361
+ group: ViewerOptionsGroupId;
12362
+ key: string;
12363
+ value: ViewerOptionPrimitive;
12364
+ }
12365
+
12366
+ /** One Customize Ribbon checkbox edit. */
12367
+ interface RibbonTabHiddenChange {
12368
+ tabId: ToolbarTabId;
12369
+ hidden: boolean;
12370
+ }
12371
+
12061
12372
  declare class SettingsDialogComponent {
12062
12373
  readonly open: _angular_core.InputSignal<boolean>;
12063
- readonly settings: _angular_core.InputSignal<ViewerPreferences>;
12064
- /** Selected `THEME_CATALOG` (or `availableThemes`) key, for the Appearance tab. */
12374
+ /** Full File > Options snapshot rendered by every pane. */
12375
+ readonly options: _angular_core.InputSignal<ViewerOptions>;
12376
+ /** Selected theme catalog key, for General > Appearance. */
12065
12377
  readonly themeKey: _angular_core.InputSignal<string>;
12066
- /** Theme choices offered by the Appearance tab. Defaults to the built-in `THEME_CATALOG`. */
12067
12378
  readonly availableThemes: _angular_core.InputSignal<readonly ThemeCatalogEntry[]>;
12068
- /** Active locale code, for the Language tab. */
12379
+ /** Active locale code, for the Language category. */
12069
12380
  readonly localeCode: _angular_core.InputSignal<string>;
12070
- /** Locale choices offered by the Language tab. Defaults to the built-in `LOCALE_CATALOG`. */
12071
12381
  readonly availableLocales: _angular_core.InputSignal<readonly LocaleCatalogEntry[]>;
12072
- readonly settingsChange: _angular_core.OutputEmitterRef<ViewerPreferences>;
12073
- /** Fired when the user picks an Appearance tab swatch. */
12382
+ /** Availability flags for the Add-ins pane (unset ids default to active). */
12383
+ readonly addinStatus: _angular_core.InputSignal<ViewerAddinStatus | undefined>;
12384
+ readonly optionChange: _angular_core.OutputEmitterRef<OptionValueChange>;
12385
+ /** Restore a snapshot wholesale (Cancel semantics). */
12386
+ readonly restoreOptions: _angular_core.OutputEmitterRef<ViewerOptions>;
12387
+ readonly ribbonTabHiddenChange: _angular_core.OutputEmitterRef<RibbonTabHiddenChange>;
12388
+ readonly quickAccessCommandsChange: _angular_core.OutputEmitterRef<string[]>;
12389
+ /** Reset one tab-group (or everything when `undefined`). */
12390
+ readonly resetOptions: _angular_core.OutputEmitterRef<keyof ViewerOptions | undefined>;
12391
+ readonly clearCache: _angular_core.OutputEmitterRef<void>;
12074
12392
  readonly themeKeySelect: _angular_core.OutputEmitterRef<string>;
12075
- /** Fired when the user picks a Language tab entry. */
12076
12393
  readonly localeSelect: _angular_core.OutputEmitterRef<string>;
12077
12394
  readonly close: _angular_core.OutputEmitterRef<void>;
12078
- protected readonly activeTab: _angular_core.WritableSignal<"language" | "general" | "appearance" | "shortcuts">;
12079
- protected readonly specs: readonly ViewerPreferenceToggle[];
12080
- protected readonly shortcuts: readonly pptx_angular_viewer.ShortcutReferenceItem[];
12081
- protected toggle(key: keyof ViewerSettings): void;
12395
+ protected readonly tabs: readonly ViewerOptionsTabDefinition[];
12396
+ protected readonly activeTabId: _angular_core.WritableSignal<ViewerOptionsTabId>;
12397
+ protected readonly activeTab: _angular_core.Signal<ViewerOptionsTabDefinition>;
12398
+ /** Snapshot taken when the dialog opens, restored by Cancel. */
12399
+ private snapshot;
12400
+ private wasOpen;
12401
+ constructor();
12402
+ /** Cancel: restore the on-open snapshot, then close. */
12403
+ protected cancel(): void;
12404
+ /** Escape confirms (keeps edits), mirroring React's dialog. */
12405
+ protected onEscape(): void;
12082
12406
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SettingsDialogComponent, never>;
12083
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SettingsDialogComponent, "pptx-settings-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "settings": { "alias": "settings"; "required": true; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; }, { "settingsChange": "settingsChange"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; "close": "close"; }, never, never, true, never>;
12407
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SettingsDialogComponent, "pptx-settings-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "addinStatus": { "alias": "addinStatus"; "required": false; "isSignal": true; }; }, { "optionChange": "optionChange"; "restoreOptions": "restoreOptions"; "ribbonTabHiddenChange": "ribbonTabHiddenChange"; "quickAccessCommandsChange": "quickAccessCommandsChange"; "resetOptions": "resetOptions"; "clearCache": "clearCache"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; "close": "close"; }, never, never, true, never>;
12084
12408
  }
12085
12409
 
12086
12410
  declare class SettingsAppearanceTabComponent {
@@ -12105,7 +12429,7 @@ declare class AccountPageComponent {
12105
12429
  readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
12106
12430
  private readonly translate;
12107
12431
  protected readonly swatches: readonly string[];
12108
- protected readonly version = "1.29.0";
12432
+ protected readonly version = "1.30.1";
12109
12433
  protected readonly profile: _angular_core.WritableSignal<ViewerProfile>;
12110
12434
  protected readonly initial: _angular_core.Signal<string>;
12111
12435
  protected readonly usage: _angular_core.WritableSignal<LocalStorageUsageSummary | null>;
@@ -14668,10 +14992,14 @@ declare class TitleBarComponent {
14668
14992
  readonly findReplaceOpen: _angular_core.InputSignal<boolean>;
14669
14993
  /** Toolbar buttons the host wants hidden (gates Undo/Redo independently). */
14670
14994
  readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
14995
+ /** Live Quick Access Toolbar options (File > Options > Quick Access). */
14996
+ readonly quickAccess: _angular_core.InputSignal<ViewerQuickAccessOptions | null>;
14671
14997
  readonly toggleAutosave: _angular_core.OutputEmitterRef<void>;
14672
14998
  readonly save: _angular_core.OutputEmitterRef<void>;
14673
14999
  readonly undo: _angular_core.OutputEmitterRef<void>;
14674
15000
  readonly redo: _angular_core.OutputEmitterRef<void>;
15001
+ /** A configured Quick Access command was pressed (catalog id). */
15002
+ readonly quickCommand: _angular_core.OutputEmitterRef<string>;
14675
15003
  readonly toggleFindReplace: _angular_core.OutputEmitterRef<void>;
14676
15004
  readonly commandSearch: _angular_core.OutputEmitterRef<string>;
14677
15005
  private readonly translate;
@@ -14704,6 +15032,20 @@ declare class TitleBarComponent {
14704
15032
  protected readonly toolbar: ToolbarVisibility;
14705
15033
  protected readonly searchQuery: _angular_core.WritableSignal<string>;
14706
15034
  protected readonly searchFocused: _angular_core.WritableSignal<boolean>;
15035
+ /** Resolved Quick Access options (host-supplied, or the default trio+). */
15036
+ protected readonly qat: _angular_core.Signal<ViewerQuickAccessOptions>;
15037
+ /**
15038
+ * Configured Quick Access commands beyond the dedicated save/undo/redo
15039
+ * buttons (which keep their own gating + labels). Rendered as text-label
15040
+ * buttons routed through {@link onQuickCommand}.
15041
+ */
15042
+ protected readonly extraQuickCommands: _angular_core.Signal<QuickAccessCommandDefinition[]>;
15043
+ /**
15044
+ * Route a Quick Access press: keep the dedicated save/undo/redo outputs
15045
+ * (existing host wiring, `hiddenActions` gating) and forward everything
15046
+ * else through the generic {@link quickCommand} output.
15047
+ */
15048
+ protected onQuickCommand(id: string): void;
14707
15049
  protected readonly commandResults: _angular_core.Signal<CommandSearchEntry[]>;
14708
15050
  /** The i18n key for the save-location status text (next to the file name). */
14709
15051
  protected readonly statusKey: _angular_core.Signal<string>;
@@ -14714,7 +15056,7 @@ declare class TitleBarComponent {
14714
15056
  protected onSearchBlur(): void;
14715
15057
  protected onSearchKeyDown(event: KeyboardEvent): void;
14716
15058
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TitleBarComponent, never>;
14717
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TitleBarComponent, "pptx-title-bar", never, { "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "isDirty": { "alias": "isDirty"; "required": false; "isSignal": true; }; "autosaveStatus": { "alias": "autosaveStatus"; "required": false; "isSignal": true; }; "autosaveEnabled": { "alias": "autosaveEnabled"; "required": false; "isSignal": true; }; "canUndo": { "alias": "canUndo"; "required": false; "isSignal": true; }; "canRedo": { "alias": "canRedo"; "required": false; "isSignal": true; }; "undoLabel": { "alias": "undoLabel"; "required": false; "isSignal": true; }; "redoLabel": { "alias": "redoLabel"; "required": false; "isSignal": true; }; "findReplaceOpen": { "alias": "findReplaceOpen"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleAutosave": "toggleAutosave"; "save": "save"; "undo": "undo"; "redo": "redo"; "toggleFindReplace": "toggleFindReplace"; "commandSearch": "commandSearch"; }, never, never, true, never>;
15059
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TitleBarComponent, "pptx-title-bar", never, { "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "isDirty": { "alias": "isDirty"; "required": false; "isSignal": true; }; "autosaveStatus": { "alias": "autosaveStatus"; "required": false; "isSignal": true; }; "autosaveEnabled": { "alias": "autosaveEnabled"; "required": false; "isSignal": true; }; "canUndo": { "alias": "canUndo"; "required": false; "isSignal": true; }; "canRedo": { "alias": "canRedo"; "required": false; "isSignal": true; }; "undoLabel": { "alias": "undoLabel"; "required": false; "isSignal": true; }; "redoLabel": { "alias": "redoLabel"; "required": false; "isSignal": true; }; "findReplaceOpen": { "alias": "findReplaceOpen"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "quickAccess": { "alias": "quickAccess"; "required": false; "isSignal": true; }; }, { "toggleAutosave": "toggleAutosave"; "save": "save"; "undo": "undo"; "redo": "redo"; "quickCommand": "quickCommand"; "toggleFindReplace": "toggleFindReplace"; "commandSearch": "commandSearch"; }, never, never, true, never>;
14718
15060
  }
14719
15061
 
14720
15062
  /**