pptx-angular-viewer 1.7.2 → 1.9.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.
@@ -32150,7 +32150,16 @@ const MATERIAL_PRESETS = [
32150
32150
  * (PowerPoint shows "Saved to this PC" there).
32151
32151
  */
32152
32152
  function resolveTitleBarStatusKey(input) {
32153
- const { autosaveState, isDirty, autosaveEnabled } = input;
32153
+ const { autosaveState, isDirty, autosaveEnabled, disabledReason } = input;
32154
+ if (autosaveState === 'disabled') {
32155
+ if (disabledReason === 'no_file_path') {
32156
+ return 'pptx.autosave.disabledNoFilePath';
32157
+ }
32158
+ if (disabledReason === 'autosave_toggle_off') {
32159
+ return 'pptx.autosave.disabledToggleOff';
32160
+ }
32161
+ return 'pptx.autosave.disabled';
32162
+ }
32154
32163
  if (autosaveEnabled && autosaveState === 'saving') {
32155
32164
  return 'pptx.autosave.saving';
32156
32165
  }
@@ -32207,6 +32216,198 @@ const TAB_ROW_ACTION_CLASSES = {
32207
32216
  recordDot: 'w-2 h-2 rounded-full bg-red-600 shrink-0',
32208
32217
  };
32209
32218
 
32219
+ /**
32220
+ * Command-search data for the PowerPoint-style "Tell me what you want to do"
32221
+ * search bar. Provides searchable command entries grouped by category, each
32222
+ * mapping a label translation key to a command identifier that bindings can
32223
+ * dispatch.
32224
+ */
32225
+ /**
32226
+ * Static catalogue of searchable commands. Bindings filter this list by the
32227
+ * user's typed query (matching against the resolved translation text).
32228
+ */
32229
+ const COMMAND_SEARCH_ENTRIES = [
32230
+ // Format
32231
+ { labelKey: 'pptx.textPanel.bold', command: 'format.bold', icon: 'bold', category: 'format' },
32232
+ {
32233
+ labelKey: 'pptx.textPanel.italic',
32234
+ command: 'format.italic',
32235
+ icon: 'italic',
32236
+ category: 'format',
32237
+ },
32238
+ {
32239
+ labelKey: 'pptx.textPanel.underline',
32240
+ command: 'format.underline',
32241
+ icon: 'underline',
32242
+ category: 'format',
32243
+ },
32244
+ {
32245
+ labelKey: 'pptx.ribbon.alignLeft',
32246
+ command: 'format.alignLeft',
32247
+ icon: 'alignLeft',
32248
+ category: 'format',
32249
+ },
32250
+ {
32251
+ labelKey: 'pptx.ribbon.alignCenter',
32252
+ command: 'format.alignCenter',
32253
+ icon: 'alignCenter',
32254
+ category: 'format',
32255
+ },
32256
+ {
32257
+ labelKey: 'pptx.ribbon.alignRight',
32258
+ command: 'format.alignRight',
32259
+ icon: 'alignRight',
32260
+ category: 'format',
32261
+ },
32262
+ {
32263
+ labelKey: 'pptx.ribbon.clearFormatting',
32264
+ command: 'format.clear',
32265
+ icon: 'eraser',
32266
+ category: 'format',
32267
+ },
32268
+ // Insert
32269
+ {
32270
+ labelKey: 'pptx.insert.addTextBox',
32271
+ command: 'insert.textBox',
32272
+ icon: 'type',
32273
+ category: 'insert',
32274
+ },
32275
+ { labelKey: 'pptx.insert.addShape', command: 'insert.shape', icon: 'square', category: 'insert' },
32276
+ {
32277
+ labelKey: 'pptx.ribbon.insertImage',
32278
+ command: 'insert.image',
32279
+ icon: 'image',
32280
+ category: 'insert',
32281
+ },
32282
+ {
32283
+ labelKey: 'pptx.ribbon.insertMedia',
32284
+ command: 'insert.media',
32285
+ icon: 'video',
32286
+ category: 'insert',
32287
+ },
32288
+ {
32289
+ labelKey: 'pptx.insert.insertTable',
32290
+ command: 'insert.table',
32291
+ icon: 'table',
32292
+ category: 'insert',
32293
+ },
32294
+ {
32295
+ labelKey: 'pptx.ribbon.insertChart',
32296
+ command: 'insert.chart',
32297
+ icon: 'barChart',
32298
+ category: 'insert',
32299
+ },
32300
+ {
32301
+ labelKey: 'pptx.insert.insertSmartArt',
32302
+ command: 'insert.smartArt',
32303
+ icon: 'layers',
32304
+ category: 'insert',
32305
+ },
32306
+ {
32307
+ labelKey: 'pptx.insert.insertEquation',
32308
+ command: 'insert.equation',
32309
+ icon: 'sigma',
32310
+ category: 'insert',
32311
+ },
32312
+ // View
32313
+ { labelKey: 'pptx.grid.grid', command: 'view.toggleGrid', icon: 'grid', category: 'view' },
32314
+ { labelKey: 'pptx.ruler.rulers', command: 'view.toggleRulers', icon: 'ruler', category: 'view' },
32315
+ {
32316
+ labelKey: 'pptx.slideSorter.title',
32317
+ command: 'view.slideSorter',
32318
+ icon: 'layoutGrid',
32319
+ category: 'view',
32320
+ },
32321
+ {
32322
+ labelKey: 'pptx.view.zoomToFit',
32323
+ command: 'view.zoomToFit',
32324
+ icon: 'maximize',
32325
+ category: 'view',
32326
+ },
32327
+ // Slide Show
32328
+ {
32329
+ labelKey: 'pptx.slideShow.fromBeginning',
32330
+ command: 'slideShow.fromBeginning',
32331
+ icon: 'play',
32332
+ category: 'slideShow',
32333
+ },
32334
+ {
32335
+ labelKey: 'pptx.slideShow.presenterView',
32336
+ command: 'slideShow.presenterView',
32337
+ icon: 'monitor',
32338
+ category: 'slideShow',
32339
+ },
32340
+ // Design
32341
+ {
32342
+ labelKey: 'pptx.ribbon.browseThemes',
32343
+ command: 'design.browseThemes',
32344
+ icon: 'palette',
32345
+ category: 'design',
32346
+ },
32347
+ {
32348
+ labelKey: 'pptx.ribbon.slideSize',
32349
+ command: 'design.slideSize',
32350
+ icon: 'monitor',
32351
+ category: 'design',
32352
+ },
32353
+ // Arrange
32354
+ {
32355
+ labelKey: 'pptx.arrange.bringToFront',
32356
+ command: 'arrange.bringToFront',
32357
+ icon: 'layers',
32358
+ category: 'arrange',
32359
+ },
32360
+ {
32361
+ labelKey: 'pptx.arrange.sendToBack',
32362
+ command: 'arrange.sendToBack',
32363
+ icon: 'layers',
32364
+ category: 'arrange',
32365
+ },
32366
+ {
32367
+ labelKey: 'pptx.arrange.duplicate',
32368
+ command: 'arrange.duplicate',
32369
+ icon: 'copy',
32370
+ category: 'arrange',
32371
+ },
32372
+ // Review
32373
+ {
32374
+ labelKey: 'pptx.review.spelling',
32375
+ command: 'review.spelling',
32376
+ icon: 'spellCheck',
32377
+ category: 'format',
32378
+ },
32379
+ {
32380
+ labelKey: 'pptx.review.language',
32381
+ command: 'review.language',
32382
+ icon: 'globe',
32383
+ category: 'format',
32384
+ },
32385
+ {
32386
+ labelKey: 'pptx.review.accessibilityCheck',
32387
+ command: 'review.accessibility',
32388
+ icon: 'shieldCheck',
32389
+ category: 'view',
32390
+ },
32391
+ {
32392
+ labelKey: 'pptx.ribbon.link',
32393
+ command: 'insert.link',
32394
+ icon: 'link',
32395
+ category: 'insert',
32396
+ },
32397
+ ];
32398
+ /**
32399
+ * Filter the command catalogue by a search query (case-insensitive substring
32400
+ * match against the resolved label). The `resolveLabel` callback is provided
32401
+ * by the binding to translate the key into the current locale's text.
32402
+ */
32403
+ function filterCommands(query, resolveLabel) {
32404
+ if (!query.trim()) {
32405
+ return [];
32406
+ }
32407
+ const lowerQuery = query.toLowerCase();
32408
+ return COMMAND_SEARCH_ENTRIES.filter((entry) => resolveLabel(entry.labelKey).toLowerCase().includes(lowerQuery));
32409
+ }
32410
+
32210
32411
  /**
32211
32412
  * IndexedDB-backed autosave recovery store, shared by every binding.
32212
32413
  *
@@ -32304,6 +32505,99 @@ function putAutosaveRecord(filePath, data) {
32304
32505
  };
32305
32506
  }));
32306
32507
  }
32508
+ /**
32509
+ * Retrieve a single autosave snapshot by file path.
32510
+ * Returns undefined when no snapshot exists.
32511
+ */
32512
+ async function getAutosaveSnapshot(filePath) {
32513
+ const db = await openAutosaveDb$1();
32514
+ return new Promise((resolve) => {
32515
+ const tx = db.transaction(AUTOSAVE_STORE_NAME, 'readonly');
32516
+ const store = tx.objectStore(AUTOSAVE_STORE_NAME);
32517
+ const req = store.get(filePath);
32518
+ req.onsuccess = () => {
32519
+ db.close();
32520
+ resolve(req.result);
32521
+ };
32522
+ req.onerror = () => {
32523
+ db.close();
32524
+ resolve(undefined);
32525
+ };
32526
+ });
32527
+ }
32528
+ /**
32529
+ * List all autosave snapshots (without the heavy `data` blob).
32530
+ * Useful for showing a recovery picker on app start.
32531
+ */
32532
+ async function listAutosaveSnapshots() {
32533
+ const db = await openAutosaveDb$1();
32534
+ return new Promise((resolve) => {
32535
+ const results = [];
32536
+ try {
32537
+ const tx = db.transaction(AUTOSAVE_STORE_NAME, 'readonly');
32538
+ const store = tx.objectStore(AUTOSAVE_STORE_NAME);
32539
+ const cursorReq = store.openCursor();
32540
+ cursorReq.onsuccess = () => {
32541
+ const cursor = cursorReq.result;
32542
+ if (cursor) {
32543
+ const val = cursor.value;
32544
+ results.push({ key: val.key, timestamp: val.timestamp, size: val.size });
32545
+ cursor.continue();
32546
+ }
32547
+ };
32548
+ tx.oncomplete = () => {
32549
+ db.close();
32550
+ resolve(results);
32551
+ };
32552
+ tx.onerror = () => {
32553
+ db.close();
32554
+ resolve([]);
32555
+ };
32556
+ }
32557
+ catch {
32558
+ try {
32559
+ db.close();
32560
+ }
32561
+ catch {
32562
+ // Ignore
32563
+ }
32564
+ resolve([]);
32565
+ }
32566
+ });
32567
+ }
32568
+ /**
32569
+ * Delete an autosave snapshot by file path.
32570
+ */
32571
+ async function deleteAutosaveSnapshot(filePath) {
32572
+ const db = await openAutosaveDb$1();
32573
+ return new Promise((resolve) => {
32574
+ try {
32575
+ const tx = db.transaction(AUTOSAVE_STORE_NAME, 'readwrite');
32576
+ const store = tx.objectStore(AUTOSAVE_STORE_NAME);
32577
+ store.delete(filePath);
32578
+ tx.oncomplete = () => {
32579
+ db.close();
32580
+ resolve(true);
32581
+ };
32582
+ tx.onerror = () => {
32583
+ db.close();
32584
+ resolve(false);
32585
+ };
32586
+ }
32587
+ catch {
32588
+ try {
32589
+ db.close();
32590
+ }
32591
+ catch {
32592
+ // Ignore
32593
+ }
32594
+ resolve(false);
32595
+ }
32596
+ });
32597
+ }
32598
+ // ---------------------------------------------------------------------------
32599
+ // Write helpers
32600
+ // ---------------------------------------------------------------------------
32307
32601
  /**
32308
32602
  * Persist a recovery snapshot. On QuotaExceededError the oldest record is
32309
32603
  * dropped and the write retried once.
@@ -35127,9 +35421,18 @@ class AutosaveService {
35127
35421
  const filePath = host.filePath();
35128
35422
  const seconds = host.intervalSeconds?.() ?? AUTOSAVE_DEFAULT_INTERVAL_SECONDS;
35129
35423
  this.clearTimer();
35130
- if (!enabled || !filePath) {
35424
+ if (!enabled) {
35425
+ this.status.set({ state: 'disabled', reason: 'autosave_toggle_off' });
35426
+ return;
35427
+ }
35428
+ if (!filePath) {
35429
+ this.status.set({ state: 'disabled', reason: 'no_file_path' });
35131
35430
  return;
35132
35431
  }
35432
+ // Requirements met; reset to idle if currently disabled.
35433
+ if (this.status().state === 'disabled') {
35434
+ this.status.set({ state: 'idle' });
35435
+ }
35133
35436
  this.timer = setInterval(() => {
35134
35437
  void this.doAutosave();
35135
35438
  }, autosaveIntervalMs(seconds));
@@ -67944,6 +68247,14 @@ const CHAR_SPACING_OPTIONS = [
67944
68247
  { label: 'Loose', value: 300 },
67945
68248
  { label: 'Very Loose', value: 600 },
67946
68249
  ];
68250
+ /** Change Case options matching PowerPoint's Aa dropdown. */
68251
+ const CHANGE_CASE_OPTIONS = [
68252
+ { label: 'Sentence case.', value: 'sentence' },
68253
+ { label: 'lowercase', value: 'lower' },
68254
+ { label: 'UPPERCASE', value: 'upper' },
68255
+ { label: 'Capitalize Each Word', value: 'capitalize' },
68256
+ { label: 'tOGGLE cASE', value: 'toggle' },
68257
+ ];
67947
68258
  class RibbonFontControlsComponent {
67948
68259
  editor = inject(EditorStateService);
67949
68260
  slideIndex = input(0, /* @ts-ignore */
@@ -67955,6 +68266,7 @@ class RibbonFontControlsComponent {
67955
68266
  fontColorPresets = FONT_COLOR_PRESETS;
67956
68267
  highlightColorPresets = HIGHLIGHT_COLOR_PRESETS;
67957
68268
  charSpacingOptions = CHAR_SPACING_OPTIONS;
68269
+ changeCaseOptions = CHANGE_CASE_OPTIONS;
67958
68270
  isText() {
67959
68271
  return isTextElement(this.selectedElement());
67960
68272
  }
@@ -67999,6 +68311,21 @@ class RibbonFontControlsComponent {
67999
68311
  setCharSpacing(event) {
68000
68312
  this.patch({ characterSpacing: Number(event.target.value) });
68001
68313
  }
68314
+ setChangeCase(event) {
68315
+ const value = event.target.value;
68316
+ switch (value) {
68317
+ case 'upper':
68318
+ this.patch({ textCaps: 'all' });
68319
+ break;
68320
+ case 'lower':
68321
+ case 'sentence':
68322
+ case 'capitalize':
68323
+ case 'toggle':
68324
+ this.patch({ textCaps: 'none' });
68325
+ break;
68326
+ }
68327
+ event.target.selectedIndex = 0;
68328
+ }
68002
68329
  toggleStyle(key) {
68003
68330
  this.patch({ [key]: !this.curStyle()?.[key] });
68004
68331
  }
@@ -68153,6 +68480,18 @@ class RibbonFontControlsComponent {
68153
68480
  </option>
68154
68481
  }
68155
68482
  </select>
68483
+ <!-- Change Case -->
68484
+ <select
68485
+ class="pptx-rb-select w-24"
68486
+ [attr.aria-label]="'pptx.text.changeCase' | translate"
68487
+ [disabled]="!isText()"
68488
+ (change)="setChangeCase($event)"
68489
+ >
68490
+ <option value="" selected disabled>Aa</option>
68491
+ @for (opt of changeCaseOptions; track opt.value) {
68492
+ <option [value]="opt.value">{{ opt.label }}</option>
68493
+ }
68494
+ </select>
68156
68495
  <!-- Font colour popover -->
68157
68496
  <pptx-ribbon-color-popover
68158
68497
  [current]="curColor()"
@@ -68313,6 +68652,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68313
68652
  </option>
68314
68653
  }
68315
68654
  </select>
68655
+ <!-- Change Case -->
68656
+ <select
68657
+ class="pptx-rb-select w-24"
68658
+ [attr.aria-label]="'pptx.text.changeCase' | translate"
68659
+ [disabled]="!isText()"
68660
+ (change)="setChangeCase($event)"
68661
+ >
68662
+ <option value="" selected disabled>Aa</option>
68663
+ @for (opt of changeCaseOptions; track opt.value) {
68664
+ <option [value]="opt.value">{{ opt.label }}</option>
68665
+ }
68666
+ </select>
68316
68667
  <!-- Font colour popover -->
68317
68668
  <pptx-ribbon-color-popover
68318
68669
  [current]="curColor()"
@@ -70288,19 +70639,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70288
70639
  class RibbonReviewSectionComponent {
70289
70640
  editor = inject(EditorStateService);
70290
70641
  comments = output();
70642
+ spelling = output();
70291
70643
  a11y = output();
70292
70644
  openCompare = output();
70645
+ language = output();
70293
70646
  link = output();
70294
70647
  hasSel() {
70295
70648
  return this.editor.selectedIds().length > 0;
70296
70649
  }
70297
70650
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonReviewSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
70298
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: RibbonReviewSectionComponent, isStandalone: true, selector: "pptx-ribbon-review-section", outputs: { comments: "comments", a11y: "a11y", openCompare: "openCompare", link: "link" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
70651
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: RibbonReviewSectionComponent, isStandalone: true, selector: "pptx-ribbon-review-section", outputs: { comments: "comments", spelling: "spelling", a11y: "a11y", openCompare: "openCompare", language: "language", link: "link" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
70299
70652
  <button type="button" class="pptx-rb-pill" (click)="comments.emit()">
70300
70653
  {{ 'pptx.toolbar.comments' | translate }}
70301
70654
  </button>
70302
- <button type="button" class="pptx-rb-pill" (click)="a11y.emit()">
70303
- {{ 'pptx.ribbon.accessibility' | translate }}
70655
+ <button
70656
+ type="button"
70657
+ class="pptx-rb-pill"
70658
+ [title]="'pptx.review.toggleSpellCheck' | translate"
70659
+ (click)="spelling.emit()"
70660
+ >
70661
+ {{ 'pptx.review.spelling' | translate }}
70304
70662
  </button>
70305
70663
  <button
70306
70664
  type="button"
@@ -70310,6 +70668,23 @@ class RibbonReviewSectionComponent {
70310
70668
  >
70311
70669
  {{ 'pptx.ribbon.compare' | translate }}
70312
70670
  </button>
70671
+ <span class="pptx-rb-sep"></span>
70672
+ <button
70673
+ type="button"
70674
+ class="pptx-rb-pill"
70675
+ [title]="'pptx.review.languageTooltip' | translate"
70676
+ (click)="language.emit()"
70677
+ >
70678
+ {{ 'pptx.review.language' | translate }}
70679
+ </button>
70680
+ <button
70681
+ type="button"
70682
+ class="pptx-rb-pill"
70683
+ [title]="'pptx.review.accessibilityCheckTooltip' | translate"
70684
+ (click)="a11y.emit()"
70685
+ >
70686
+ {{ 'pptx.review.accessibilityCheck' | translate }}
70687
+ </button>
70313
70688
  @if (hasSel()) {
70314
70689
  <button type="button" class="pptx-rb-pill" (click)="link.emit()">
70315
70690
  {{ 'pptx.ribbon.link' | translate }}
@@ -70329,8 +70704,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70329
70704
  <button type="button" class="pptx-rb-pill" (click)="comments.emit()">
70330
70705
  {{ 'pptx.toolbar.comments' | translate }}
70331
70706
  </button>
70332
- <button type="button" class="pptx-rb-pill" (click)="a11y.emit()">
70333
- {{ 'pptx.ribbon.accessibility' | translate }}
70707
+ <button
70708
+ type="button"
70709
+ class="pptx-rb-pill"
70710
+ [title]="'pptx.review.toggleSpellCheck' | translate"
70711
+ (click)="spelling.emit()"
70712
+ >
70713
+ {{ 'pptx.review.spelling' | translate }}
70334
70714
  </button>
70335
70715
  <button
70336
70716
  type="button"
@@ -70340,6 +70720,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70340
70720
  >
70341
70721
  {{ 'pptx.ribbon.compare' | translate }}
70342
70722
  </button>
70723
+ <span class="pptx-rb-sep"></span>
70724
+ <button
70725
+ type="button"
70726
+ class="pptx-rb-pill"
70727
+ [title]="'pptx.review.languageTooltip' | translate"
70728
+ (click)="language.emit()"
70729
+ >
70730
+ {{ 'pptx.review.language' | translate }}
70731
+ </button>
70732
+ <button
70733
+ type="button"
70734
+ class="pptx-rb-pill"
70735
+ [title]="'pptx.review.accessibilityCheckTooltip' | translate"
70736
+ (click)="a11y.emit()"
70737
+ >
70738
+ {{ 'pptx.review.accessibilityCheck' | translate }}
70739
+ </button>
70343
70740
  @if (hasSel()) {
70344
70741
  <button type="button" class="pptx-rb-pill" (click)="link.emit()">
70345
70742
  {{ 'pptx.ribbon.link' | translate }}
@@ -70347,7 +70744,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70347
70744
  }
70348
70745
  `,
70349
70746
  }]
70350
- }], propDecorators: { comments: [{ type: i0.Output, args: ["comments"] }], a11y: [{ type: i0.Output, args: ["a11y"] }], openCompare: [{ type: i0.Output, args: ["openCompare"] }], link: [{ type: i0.Output, args: ["link"] }] } });
70747
+ }], propDecorators: { comments: [{ type: i0.Output, args: ["comments"] }], spelling: [{ type: i0.Output, args: ["spelling"] }], a11y: [{ type: i0.Output, args: ["a11y"] }], openCompare: [{ type: i0.Output, args: ["openCompare"] }], language: [{ type: i0.Output, args: ["language"] }], link: [{ type: i0.Output, args: ["link"] }] } });
70351
70748
 
70352
70749
  /**
70353
70750
  * ribbon-slideshow-section.component.ts: the Slide Show ribbon tab (From
@@ -70477,6 +70874,12 @@ class RibbonTransitionsSectionComponent {
70477
70874
  transitionChange = output();
70478
70875
  durationChange = output();
70479
70876
  transitionPresets = TRANSITION_PRESETS;
70877
+ advanceOnClick = signal(true, /* @ts-ignore */
70878
+ ...(ngDevMode ? [{ debugName: "advanceOnClick" }] : /* istanbul ignore next */ []));
70879
+ advanceAfter = signal(false, /* @ts-ignore */
70880
+ ...(ngDevMode ? [{ debugName: "advanceAfter" }] : /* istanbul ignore next */ []));
70881
+ advanceAfterSeconds = signal('00:00.00', /* @ts-ignore */
70882
+ ...(ngDevMode ? [{ debugName: "advanceAfterSeconds" }] : /* istanbul ignore next */ []));
70480
70883
  /** Apply the chosen transition to the active slide. */
70481
70884
  setTransition(type) {
70482
70885
  this.transitionChange.emit(type);
@@ -70557,6 +70960,14 @@ class RibbonTransitionsSectionComponent {
70557
70960
  <span>s</span>
70558
70961
  </label>
70559
70962
  <span class="pptx-rb-sep"></span>
70963
+ <!-- Sound -->
70964
+ <label class="inline-flex items-center gap-1.5 text-xs text-muted-foreground">
70965
+ <span class="whitespace-nowrap">{{ 'pptx.ribbon.sound' | translate }}</span>
70966
+ <select class="pptx-rb-select w-24">
70967
+ <option value="none">{{ 'pptx.ribbon.soundNone' | translate }}</option>
70968
+ </select>
70969
+ </label>
70970
+ <span class="pptx-rb-sep"></span>
70560
70971
  <!-- Apply to all -->
70561
70972
  <button
70562
70973
  type="button"
@@ -70567,6 +70978,39 @@ class RibbonTransitionsSectionComponent {
70567
70978
  ⧉ {{ 'pptx.headerFooter.applyToAll' | translate }}
70568
70979
  </button>
70569
70980
  <span class="pptx-rb-sep"></span>
70981
+ <!-- Advance Slide -->
70982
+ <div class="inline-flex flex-col gap-1 text-xs text-muted-foreground">
70983
+ <span class="text-[10px] font-medium text-foreground">{{
70984
+ 'pptx.ribbon.advanceSlide' | translate
70985
+ }}</span>
70986
+ <label class="inline-flex cursor-pointer items-center gap-1.5">
70987
+ <input
70988
+ type="checkbox"
70989
+ [checked]="advanceOnClick()"
70990
+ (change)="advanceOnClick.set($any($event.target).checked)"
70991
+ class="accent-primary h-3 w-3"
70992
+ />
70993
+ <span class="whitespace-nowrap">{{ 'pptx.ribbon.onMouseClick' | translate }}</span>
70994
+ </label>
70995
+ <label class="inline-flex cursor-pointer items-center gap-1.5">
70996
+ <input
70997
+ type="checkbox"
70998
+ [checked]="advanceAfter()"
70999
+ (change)="advanceAfter.set($any($event.target).checked)"
71000
+ class="accent-primary h-3 w-3"
71001
+ />
71002
+ <span class="whitespace-nowrap">{{ 'pptx.ribbon.afterDuration' | translate }}</span>
71003
+ <input
71004
+ type="text"
71005
+ [value]="advanceAfterSeconds()"
71006
+ (input)="advanceAfterSeconds.set($any($event.target).value)"
71007
+ [disabled]="!advanceAfter()"
71008
+ class="pptx-rb-select w-16 text-center disabled:opacity-50"
71009
+ [title]="'pptx.ribbon.advanceAfterSeconds' | translate"
71010
+ />
71011
+ </label>
71012
+ </div>
71013
+ <span class="pptx-rb-sep"></span>
70570
71014
  <!-- Inspector -->
70571
71015
  <button
70572
71016
  type="button"
@@ -70632,6 +71076,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70632
71076
  <span>s</span>
70633
71077
  </label>
70634
71078
  <span class="pptx-rb-sep"></span>
71079
+ <!-- Sound -->
71080
+ <label class="inline-flex items-center gap-1.5 text-xs text-muted-foreground">
71081
+ <span class="whitespace-nowrap">{{ 'pptx.ribbon.sound' | translate }}</span>
71082
+ <select class="pptx-rb-select w-24">
71083
+ <option value="none">{{ 'pptx.ribbon.soundNone' | translate }}</option>
71084
+ </select>
71085
+ </label>
71086
+ <span class="pptx-rb-sep"></span>
70635
71087
  <!-- Apply to all -->
70636
71088
  <button
70637
71089
  type="button"
@@ -70642,6 +71094,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70642
71094
  ⧉ {{ 'pptx.headerFooter.applyToAll' | translate }}
70643
71095
  </button>
70644
71096
  <span class="pptx-rb-sep"></span>
71097
+ <!-- Advance Slide -->
71098
+ <div class="inline-flex flex-col gap-1 text-xs text-muted-foreground">
71099
+ <span class="text-[10px] font-medium text-foreground">{{
71100
+ 'pptx.ribbon.advanceSlide' | translate
71101
+ }}</span>
71102
+ <label class="inline-flex cursor-pointer items-center gap-1.5">
71103
+ <input
71104
+ type="checkbox"
71105
+ [checked]="advanceOnClick()"
71106
+ (change)="advanceOnClick.set($any($event.target).checked)"
71107
+ class="accent-primary h-3 w-3"
71108
+ />
71109
+ <span class="whitespace-nowrap">{{ 'pptx.ribbon.onMouseClick' | translate }}</span>
71110
+ </label>
71111
+ <label class="inline-flex cursor-pointer items-center gap-1.5">
71112
+ <input
71113
+ type="checkbox"
71114
+ [checked]="advanceAfter()"
71115
+ (change)="advanceAfter.set($any($event.target).checked)"
71116
+ class="accent-primary h-3 w-3"
71117
+ />
71118
+ <span class="whitespace-nowrap">{{ 'pptx.ribbon.afterDuration' | translate }}</span>
71119
+ <input
71120
+ type="text"
71121
+ [value]="advanceAfterSeconds()"
71122
+ (input)="advanceAfterSeconds.set($any($event.target).value)"
71123
+ [disabled]="!advanceAfter()"
71124
+ class="pptx-rb-select w-16 text-center disabled:opacity-50"
71125
+ [title]="'pptx.ribbon.advanceAfterSeconds' | translate"
71126
+ />
71127
+ </label>
71128
+ </div>
71129
+ <span class="pptx-rb-sep"></span>
70645
71130
  <!-- Inspector -->
70646
71131
  <button
70647
71132
  type="button"
@@ -71367,7 +71852,7 @@ class RibbonComponent {
71367
71852
  }
71368
71853
  </div>
71369
71854
  </div>
71370
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: RibbonPrimaryRowComponent, selector: "pptx-ribbon-primary-row", inputs: ["slideCount", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount"], outputs: ["toggleSidebar", "toggleComments", "present", "presenter", "broadcast", "openCustomShows", "toggleInspector", "exportPng", "exportPdf", "exportGif", "exportVideo", "print", "info", "a11y", "save"] }, { kind: "component", type: RibbonFileSectionComponent, selector: "pptx-ribbon-file-section", inputs: ["slideCount", "exporting"], outputs: ["openFile", "save", "exportPng", "exportPdf", "exportGif", "exportVideo", "print", "info", "signatures", "replace", "openPassword", "openFontEmbedding", "openVersionHistory"] }, { kind: "component", type: RibbonHomeSectionComponent, selector: "pptx-ribbon-home-section", inputs: ["slideIndex", "selectedElement", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter", "findReplace", "applyLayout", "resetSlide", "addSection"] }, { kind: "component", type: RibbonInsertSectionComponent, selector: "pptx-ribbon-insert-section", inputs: ["slideIndex", "newChartType"], outputs: ["openSmartArtDialog", "openEquationDialog", "chartTypeChange"] }, { kind: "component", type: RibbonFontControlsComponent, selector: "pptx-ribbon-font-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonParagraphControlsComponent, selector: "pptx-ribbon-paragraph-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonArrangeSectionComponent, selector: "pptx-ribbon-arrange-section", inputs: ["slideIndex", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter"] }, { kind: "component", type: RibbonSlideshowSectionComponent, selector: "pptx-ribbon-slideshow-section", inputs: ["slideCount"], outputs: ["present", "presenter", "broadcast", "openCustomShows", "openSetUpSlideShow"] }, { kind: "component", type: RibbonReviewSectionComponent, selector: "pptx-ribbon-review-section", outputs: ["comments", "a11y", "openCompare", "link"] }, { kind: "component", type: RibbonViewSectionComponent, selector: "pptx-ribbon-view-section", inputs: ["canEdit", "showGrid", "showRulers", "showGuides", "snapToGrid", "eyedropperActive"], outputs: ["openSorter", "toggleNotes", "print", "openShortcuts", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "toggleSnapToGrid", "toggleEyedropper"] }, { kind: "component", type: RibbonDrawSectionComponent, selector: "pptx-ribbon-draw-section", inputs: ["activeTool", "drawingColor", "drawingWidth"], outputs: ["drawToolChange"] }, { kind: "component", type: RibbonDrawingGroupComponent, selector: "pptx-ribbon-drawing-group", inputs: ["canEdit"], outputs: ["shapeInsert", "moveLayer", "moveLayerToEdge"] }, { kind: "component", type: RibbonDesignSectionComponent, selector: "pptx-ribbon-design-section", inputs: ["themeGalleryOpen"], outputs: ["toggleThemeGallery", "info", "toggleInspector"] }, { kind: "component", type: RibbonTransitionsSectionComponent, selector: "pptx-ribbon-transitions-section", inputs: ["slideIndex", "selectedTransition", "transitionDurationSec"], outputs: ["present", "toggleInspector", "transitionChange", "durationChange"] }, { kind: "component", type: RibbonAnimationsSectionComponent, selector: "pptx-ribbon-animations-section", inputs: ["slideIndex", "selectedElement"], outputs: ["present", "toggleInspector"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
71855
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: RibbonPrimaryRowComponent, selector: "pptx-ribbon-primary-row", inputs: ["slideCount", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount"], outputs: ["toggleSidebar", "toggleComments", "present", "presenter", "broadcast", "openCustomShows", "toggleInspector", "exportPng", "exportPdf", "exportGif", "exportVideo", "print", "info", "a11y", "save"] }, { kind: "component", type: RibbonFileSectionComponent, selector: "pptx-ribbon-file-section", inputs: ["slideCount", "exporting"], outputs: ["openFile", "save", "exportPng", "exportPdf", "exportGif", "exportVideo", "print", "info", "signatures", "replace", "openPassword", "openFontEmbedding", "openVersionHistory"] }, { kind: "component", type: RibbonHomeSectionComponent, selector: "pptx-ribbon-home-section", inputs: ["slideIndex", "selectedElement", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter", "findReplace", "applyLayout", "resetSlide", "addSection"] }, { kind: "component", type: RibbonInsertSectionComponent, selector: "pptx-ribbon-insert-section", inputs: ["slideIndex", "newChartType"], outputs: ["openSmartArtDialog", "openEquationDialog", "chartTypeChange"] }, { kind: "component", type: RibbonFontControlsComponent, selector: "pptx-ribbon-font-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonParagraphControlsComponent, selector: "pptx-ribbon-paragraph-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonArrangeSectionComponent, selector: "pptx-ribbon-arrange-section", inputs: ["slideIndex", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter"] }, { kind: "component", type: RibbonSlideshowSectionComponent, selector: "pptx-ribbon-slideshow-section", inputs: ["slideCount"], outputs: ["present", "presenter", "broadcast", "openCustomShows", "openSetUpSlideShow"] }, { kind: "component", type: RibbonReviewSectionComponent, selector: "pptx-ribbon-review-section", outputs: ["comments", "spelling", "a11y", "openCompare", "language", "link"] }, { kind: "component", type: RibbonViewSectionComponent, selector: "pptx-ribbon-view-section", inputs: ["canEdit", "showGrid", "showRulers", "showGuides", "snapToGrid", "eyedropperActive"], outputs: ["openSorter", "toggleNotes", "print", "openShortcuts", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "toggleSnapToGrid", "toggleEyedropper"] }, { kind: "component", type: RibbonDrawSectionComponent, selector: "pptx-ribbon-draw-section", inputs: ["activeTool", "drawingColor", "drawingWidth"], outputs: ["drawToolChange"] }, { kind: "component", type: RibbonDrawingGroupComponent, selector: "pptx-ribbon-drawing-group", inputs: ["canEdit"], outputs: ["shapeInsert", "moveLayer", "moveLayerToEdge"] }, { kind: "component", type: RibbonDesignSectionComponent, selector: "pptx-ribbon-design-section", inputs: ["themeGalleryOpen"], outputs: ["toggleThemeGallery", "info", "toggleInspector"] }, { kind: "component", type: RibbonTransitionsSectionComponent, selector: "pptx-ribbon-transitions-section", inputs: ["slideIndex", "selectedTransition", "transitionDurationSec"], outputs: ["present", "toggleInspector", "transitionChange", "durationChange"] }, { kind: "component", type: RibbonAnimationsSectionComponent, selector: "pptx-ribbon-animations-section", inputs: ["slideIndex", "selectedElement"], outputs: ["present", "toggleInspector"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
71371
71856
  }
71372
71857
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonComponent, decorators: [{
71373
71858
  type: Component,
@@ -73859,19 +74344,30 @@ class TitleBarComponent {
73859
74344
  findReplaceOpen = input(false, /* @ts-ignore */
73860
74345
  ...(ngDevMode ? [{ debugName: "findReplaceOpen" }] : /* istanbul ignore next */ []));
73861
74346
  toggleAutosave = output();
73862
- /** Quick-access save (downloads the `.pptx`). */
73863
74347
  save = output();
73864
74348
  undo = output();
73865
74349
  redo = output();
73866
74350
  toggleFindReplace = output();
74351
+ commandSearch = output();
74352
+ translate = inject(TranslateService);
73867
74353
  tb = TITLE_BAR_CLASSES;
73868
74354
  defaultFileKey = TITLE_BAR_DEFAULT_FILE_KEY;
74355
+ searchQuery = signal('', /* @ts-ignore */
74356
+ ...(ngDevMode ? [{ debugName: "searchQuery" }] : /* istanbul ignore next */ []));
74357
+ searchFocused = signal(false, /* @ts-ignore */
74358
+ ...(ngDevMode ? [{ debugName: "searchFocused" }] : /* istanbul ignore next */ []));
74359
+ commandResults = computed(() => filterCommands(this.searchQuery(), (key) => this.translate.instant(key)), /* @ts-ignore */
74360
+ ...(ngDevMode ? [{ debugName: "commandResults" }] : /* istanbul ignore next */ []));
73869
74361
  /** The i18n key for the save-location status text (next to the file name). */
73870
- statusKey = computed(() => resolveTitleBarStatusKey({
73871
- autosaveState: this.autosaveStatus()?.state ?? 'idle',
73872
- isDirty: this.isDirty(),
73873
- autosaveEnabled: this.autosaveEnabled(),
73874
- }), /* @ts-ignore */
74362
+ statusKey = computed(() => {
74363
+ const status = this.autosaveStatus();
74364
+ return resolveTitleBarStatusKey({
74365
+ autosaveState: status?.state ?? 'idle',
74366
+ isDirty: this.isDirty(),
74367
+ autosaveEnabled: this.autosaveEnabled(),
74368
+ disabledReason: status?.state === 'disabled' ? status.reason : undefined,
74369
+ });
74370
+ }, /* @ts-ignore */
73875
74371
  ...(ngDevMode ? [{ debugName: "statusKey" }] : /* istanbul ignore next */ []));
73876
74372
  /** Colour override for the status text on saving/error (when autosave is on). */
73877
74373
  statusStateClass = computed(() => {
@@ -73888,8 +74384,37 @@ class TitleBarComponent {
73888
74384
  return '';
73889
74385
  }, /* @ts-ignore */
73890
74386
  ...(ngDevMode ? [{ debugName: "statusStateClass" }] : /* istanbul ignore next */ []));
74387
+ selectCommand(entry) {
74388
+ this.commandSearch.emit(entry.command);
74389
+ this.searchQuery.set('');
74390
+ this.searchFocused.set(false);
74391
+ }
74392
+ openFindReplace() {
74393
+ this.toggleFindReplace.emit();
74394
+ this.searchFocused.set(false);
74395
+ this.searchQuery.set('');
74396
+ }
74397
+ onSearchBlur() {
74398
+ // Delay to allow mousedown on dropdown items to fire first.
74399
+ setTimeout(() => this.searchFocused.set(false), 150);
74400
+ }
74401
+ onSearchKeyDown(event) {
74402
+ if (event.key === 'Enter' && this.searchQuery().trim()) {
74403
+ const results = this.commandResults();
74404
+ if (results.length > 0) {
74405
+ this.selectCommand(results[0]);
74406
+ }
74407
+ else {
74408
+ this.openFindReplace();
74409
+ }
74410
+ }
74411
+ else if (event.key === 'Escape') {
74412
+ this.searchQuery.set('');
74413
+ this.searchFocused.set(false);
74414
+ }
74415
+ }
73891
74416
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TitleBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
73892
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: TitleBarComponent, isStandalone: true, selector: "pptx-title-bar", inputs: { canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, isDirty: { classPropertyName: "isDirty", publicName: "isDirty", isSignal: true, isRequired: false, transformFunction: null }, autosaveStatus: { classPropertyName: "autosaveStatus", publicName: "autosaveStatus", isSignal: true, isRequired: false, transformFunction: null }, autosaveEnabled: { classPropertyName: "autosaveEnabled", publicName: "autosaveEnabled", isSignal: true, isRequired: false, transformFunction: null }, canUndo: { classPropertyName: "canUndo", publicName: "canUndo", isSignal: true, isRequired: false, transformFunction: null }, canRedo: { classPropertyName: "canRedo", publicName: "canRedo", isSignal: true, isRequired: false, transformFunction: null }, undoLabel: { classPropertyName: "undoLabel", publicName: "undoLabel", isSignal: true, isRequired: false, transformFunction: null }, redoLabel: { classPropertyName: "redoLabel", publicName: "redoLabel", isSignal: true, isRequired: false, transformFunction: null }, findReplaceOpen: { classPropertyName: "findReplaceOpen", publicName: "findReplaceOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggleAutosave: "toggleAutosave", save: "save", undo: "undo", redo: "redo", toggleFindReplace: "toggleFindReplace" }, ngImport: i0, template: `
74417
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: TitleBarComponent, isStandalone: true, selector: "pptx-title-bar", inputs: { canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, isDirty: { classPropertyName: "isDirty", publicName: "isDirty", isSignal: true, isRequired: false, transformFunction: null }, autosaveStatus: { classPropertyName: "autosaveStatus", publicName: "autosaveStatus", isSignal: true, isRequired: false, transformFunction: null }, autosaveEnabled: { classPropertyName: "autosaveEnabled", publicName: "autosaveEnabled", isSignal: true, isRequired: false, transformFunction: null }, canUndo: { classPropertyName: "canUndo", publicName: "canUndo", isSignal: true, isRequired: false, transformFunction: null }, canRedo: { classPropertyName: "canRedo", publicName: "canRedo", isSignal: true, isRequired: false, transformFunction: null }, undoLabel: { classPropertyName: "undoLabel", publicName: "undoLabel", isSignal: true, isRequired: false, transformFunction: null }, redoLabel: { classPropertyName: "redoLabel", publicName: "redoLabel", isSignal: true, isRequired: false, transformFunction: null }, findReplaceOpen: { classPropertyName: "findReplaceOpen", publicName: "findReplaceOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggleAutosave: "toggleAutosave", save: "save", undo: "undo", redo: "redo", toggleFindReplace: "toggleFindReplace", commandSearch: "commandSearch" }, ngImport: i0, template: `
73893
74418
  <div [class]="tb.container" data-pptx-title-bar>
73894
74419
  <span [class]="tb.logo" aria-hidden="true">P</span>
73895
74420
 
@@ -73972,17 +74497,70 @@ class TitleBarComponent {
73972
74497
 
73973
74498
  <span [class]="tb.searchWrap">
73974
74499
  @if (canEdit()) {
73975
- <button
73976
- type="button"
73977
- [class]="tb.searchBox"
73978
- [ngClass]="findReplaceOpen() ? 'text-foreground bg-background' : ''"
73979
- [title]="'pptx.findReplace.title' | translate"
73980
- [attr.aria-label]="'pptx.titleBar.search' | translate"
73981
- (click)="toggleFindReplace.emit()"
73982
- >
73983
- <span [class]="tb.searchIcon" aria-hidden="true">⌕</span>
73984
- <span [class]="tb.searchLabel">{{ 'pptx.titleBar.search' | translate }}</span>
73985
- </button>
74500
+ <div class="relative w-full max-w-md">
74501
+ <div
74502
+ [class]="tb.searchBox"
74503
+ [ngClass]="
74504
+ searchFocused() || findReplaceOpen() ? 'text-foreground bg-background' : ''
74505
+ "
74506
+ >
74507
+ <span [class]="tb.searchIcon" aria-hidden="true">⌕</span>
74508
+ <input
74509
+ type="text"
74510
+ [value]="searchQuery()"
74511
+ (input)="searchQuery.set($any($event.target).value)"
74512
+ (focus)="searchFocused.set(true)"
74513
+ (blur)="onSearchBlur()"
74514
+ (keydown)="onSearchKeyDown($event)"
74515
+ class="flex-1 bg-transparent text-[11px] outline-none placeholder:text-muted-foreground/60"
74516
+ [placeholder]="'pptx.titleBar.searchPlaceholder' | translate"
74517
+ [attr.aria-label]="'pptx.titleBar.search' | translate"
74518
+ />
74519
+ </div>
74520
+ @if (searchFocused() && searchQuery().trim()) {
74521
+ <div
74522
+ class="absolute left-0 right-0 top-full z-50 mt-1 rounded-lg border border-border bg-popover shadow-xl max-h-64 overflow-y-auto"
74523
+ >
74524
+ @if (commandResults().length > 0) {
74525
+ <div
74526
+ class="px-3 py-1.5 text-[10px] font-semibold text-muted-foreground uppercase tracking-wider"
74527
+ >
74528
+ {{ 'pptx.titleBar.searchCommands' | translate }}
74529
+ </div>
74530
+ @for (entry of commandResults().slice(0, 8); track entry.command) {
74531
+ <button
74532
+ type="button"
74533
+ class="flex w-full items-center gap-2 px-3 py-1.5 text-xs text-foreground hover:bg-accent transition-colors"
74534
+ (mousedown)="selectCommand(entry)"
74535
+ >
74536
+ <span class="truncate">{{ entry.labelKey | translate }}</span>
74537
+ <span class="ml-auto text-[10px] text-muted-foreground capitalize">{{
74538
+ entry.category
74539
+ }}</span>
74540
+ </button>
74541
+ }
74542
+ } @else {
74543
+ <div class="px-3 py-2 text-xs text-muted-foreground">
74544
+ {{ 'pptx.titleBar.searchNoResults' | translate }}
74545
+ </div>
74546
+ }
74547
+ <div class="border-t border-border/60">
74548
+ <button
74549
+ type="button"
74550
+ class="flex w-full items-center gap-2 px-3 py-1.5 text-xs text-foreground hover:bg-accent transition-colors"
74551
+ (mousedown)="openFindReplace()"
74552
+ >
74553
+ <span aria-hidden="true">⌕</span>
74554
+ <span
74555
+ >{{ 'pptx.titleBar.searchContent' | translate }} &ldquo;{{
74556
+ searchQuery()
74557
+ }}&rdquo;</span
74558
+ >
74559
+ </button>
74560
+ </div>
74561
+ </div>
74562
+ }
74563
+ </div>
73986
74564
  }
73987
74565
  </span>
73988
74566
 
@@ -74080,17 +74658,70 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74080
74658
 
74081
74659
  <span [class]="tb.searchWrap">
74082
74660
  @if (canEdit()) {
74083
- <button
74084
- type="button"
74085
- [class]="tb.searchBox"
74086
- [ngClass]="findReplaceOpen() ? 'text-foreground bg-background' : ''"
74087
- [title]="'pptx.findReplace.title' | translate"
74088
- [attr.aria-label]="'pptx.titleBar.search' | translate"
74089
- (click)="toggleFindReplace.emit()"
74090
- >
74091
- <span [class]="tb.searchIcon" aria-hidden="true">⌕</span>
74092
- <span [class]="tb.searchLabel">{{ 'pptx.titleBar.search' | translate }}</span>
74093
- </button>
74661
+ <div class="relative w-full max-w-md">
74662
+ <div
74663
+ [class]="tb.searchBox"
74664
+ [ngClass]="
74665
+ searchFocused() || findReplaceOpen() ? 'text-foreground bg-background' : ''
74666
+ "
74667
+ >
74668
+ <span [class]="tb.searchIcon" aria-hidden="true">⌕</span>
74669
+ <input
74670
+ type="text"
74671
+ [value]="searchQuery()"
74672
+ (input)="searchQuery.set($any($event.target).value)"
74673
+ (focus)="searchFocused.set(true)"
74674
+ (blur)="onSearchBlur()"
74675
+ (keydown)="onSearchKeyDown($event)"
74676
+ class="flex-1 bg-transparent text-[11px] outline-none placeholder:text-muted-foreground/60"
74677
+ [placeholder]="'pptx.titleBar.searchPlaceholder' | translate"
74678
+ [attr.aria-label]="'pptx.titleBar.search' | translate"
74679
+ />
74680
+ </div>
74681
+ @if (searchFocused() && searchQuery().trim()) {
74682
+ <div
74683
+ class="absolute left-0 right-0 top-full z-50 mt-1 rounded-lg border border-border bg-popover shadow-xl max-h-64 overflow-y-auto"
74684
+ >
74685
+ @if (commandResults().length > 0) {
74686
+ <div
74687
+ class="px-3 py-1.5 text-[10px] font-semibold text-muted-foreground uppercase tracking-wider"
74688
+ >
74689
+ {{ 'pptx.titleBar.searchCommands' | translate }}
74690
+ </div>
74691
+ @for (entry of commandResults().slice(0, 8); track entry.command) {
74692
+ <button
74693
+ type="button"
74694
+ class="flex w-full items-center gap-2 px-3 py-1.5 text-xs text-foreground hover:bg-accent transition-colors"
74695
+ (mousedown)="selectCommand(entry)"
74696
+ >
74697
+ <span class="truncate">{{ entry.labelKey | translate }}</span>
74698
+ <span class="ml-auto text-[10px] text-muted-foreground capitalize">{{
74699
+ entry.category
74700
+ }}</span>
74701
+ </button>
74702
+ }
74703
+ } @else {
74704
+ <div class="px-3 py-2 text-xs text-muted-foreground">
74705
+ {{ 'pptx.titleBar.searchNoResults' | translate }}
74706
+ </div>
74707
+ }
74708
+ <div class="border-t border-border/60">
74709
+ <button
74710
+ type="button"
74711
+ class="flex w-full items-center gap-2 px-3 py-1.5 text-xs text-foreground hover:bg-accent transition-colors"
74712
+ (mousedown)="openFindReplace()"
74713
+ >
74714
+ <span aria-hidden="true">⌕</span>
74715
+ <span
74716
+ >{{ 'pptx.titleBar.searchContent' | translate }} &ldquo;{{
74717
+ searchQuery()
74718
+ }}&rdquo;</span
74719
+ >
74720
+ </button>
74721
+ </div>
74722
+ </div>
74723
+ }
74724
+ </div>
74094
74725
  }
74095
74726
  </span>
74096
74727
 
@@ -74098,7 +74729,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74098
74729
  </div>
74099
74730
  `,
74100
74731
  }]
74101
- }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], fileName: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileName", required: false }] }], isDirty: [{ type: i0.Input, args: [{ isSignal: true, alias: "isDirty", required: false }] }], autosaveStatus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autosaveStatus", required: false }] }], autosaveEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "autosaveEnabled", required: false }] }], canUndo: [{ type: i0.Input, args: [{ isSignal: true, alias: "canUndo", required: false }] }], canRedo: [{ type: i0.Input, args: [{ isSignal: true, alias: "canRedo", required: false }] }], undoLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "undoLabel", required: false }] }], redoLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "redoLabel", required: false }] }], findReplaceOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "findReplaceOpen", required: false }] }], toggleAutosave: [{ type: i0.Output, args: ["toggleAutosave"] }], save: [{ type: i0.Output, args: ["save"] }], undo: [{ type: i0.Output, args: ["undo"] }], redo: [{ type: i0.Output, args: ["redo"] }], toggleFindReplace: [{ type: i0.Output, args: ["toggleFindReplace"] }] } });
74732
+ }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], fileName: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileName", required: false }] }], isDirty: [{ type: i0.Input, args: [{ isSignal: true, alias: "isDirty", required: false }] }], autosaveStatus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autosaveStatus", required: false }] }], autosaveEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "autosaveEnabled", required: false }] }], canUndo: [{ type: i0.Input, args: [{ isSignal: true, alias: "canUndo", required: false }] }], canRedo: [{ type: i0.Input, args: [{ isSignal: true, alias: "canRedo", required: false }] }], undoLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "undoLabel", required: false }] }], redoLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "redoLabel", required: false }] }], findReplaceOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "findReplaceOpen", required: false }] }], toggleAutosave: [{ type: i0.Output, args: ["toggleAutosave"] }], save: [{ type: i0.Output, args: ["save"] }], undo: [{ type: i0.Output, args: ["undo"] }], redo: [{ type: i0.Output, args: ["redo"] }], toggleFindReplace: [{ type: i0.Output, args: ["toggleFindReplace"] }], commandSearch: [{ type: i0.Output, args: ["commandSearch"] }] } });
74102
74733
 
74103
74734
  /**
74104
74735
  * viewer-dialogs.service.ts: Viewer-scoped open-state + light state for the
@@ -80830,7 +81461,7 @@ class PowerPointViewerComponent {
80830
81461
  />
80831
81462
  }
80832
81463
  </div>
80833
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex"], outputs: ["indexChange", "closed", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select", "closed"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: InspectorPanelComponent, selector: "pptx-inspector-panel", inputs: ["element", "slideIndex"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex"], outputs: ["closed"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName"], outputs: ["add", "remove", "resolve"] }, { kind: "component", type: SignaturesPanelComponent, selector: "pptx-signatures-panel", inputs: ["signatures"] }, { kind: "component", type: AccessibilityPanelComponent, selector: "pptx-accessibility-panel", inputs: ["issues"], outputs: ["selectSlide"] }, { kind: "component", type: CollaborationCursorsComponent, selector: "pptx-collaboration-cursors", inputs: ["cursors", "zoom"] }, { kind: "component", type: RemoteSelectionOverlayComponent, selector: "pptx-remote-selection-overlay", inputs: ["presences", "elements", "activeSlideIndex", "zoom"] }, { kind: "component", type: FollowModeBarComponent, selector: "pptx-follow-mode-bar", inputs: ["presences", "followedClientId"], outputs: ["follow"] }, { kind: "component", type: PropertiesDialogComponent, selector: "pptx-properties-dialog", inputs: ["open", "properties"], outputs: ["save", "close"] }, { kind: "component", type: HyperlinkDialogComponent, selector: "pptx-hyperlink-dialog", inputs: ["open", "element"], outputs: ["save", "close"] }, { kind: "component", type: PrintDialogComponent, selector: "pptx-print-dialog", inputs: ["slides", "activeSlideIndex", "defaultSlidesPerPage", "defaultFrameSlides"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen"], outputs: ["toggleMenu", "undo", "redo", "save", "present"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide"], outputs: ["update"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "showGrid", "showRulers", "showGuides", "snapToGrid", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "share", "broadcast", "openFile", "save", "toggleSidebar", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "shapeInsert", "moveLayer", "moveLayerToEdge"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen"], outputs: ["toggleAutosave", "save", "undo", "redo", "toggleFindReplace"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName"], outputs: ["applyTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden"] }, { kind: "component", type: CustomShowsComponent, selector: "pptx-custom-shows", inputs: ["open", "slides", "customShows", "activeCustomShowId"], outputs: ["create", "remove", "update", "setActive", "close"] }, { kind: "component", type: InsertSmartArtDialogComponent, selector: "pptx-insert-smart-art-dialog", inputs: ["open"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows"], outputs: ["restoreContent"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
81464
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex"], outputs: ["indexChange", "closed", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select", "closed"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: InspectorPanelComponent, selector: "pptx-inspector-panel", inputs: ["element", "slideIndex"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex"], outputs: ["closed"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName"], outputs: ["add", "remove", "resolve"] }, { kind: "component", type: SignaturesPanelComponent, selector: "pptx-signatures-panel", inputs: ["signatures"] }, { kind: "component", type: AccessibilityPanelComponent, selector: "pptx-accessibility-panel", inputs: ["issues"], outputs: ["selectSlide"] }, { kind: "component", type: CollaborationCursorsComponent, selector: "pptx-collaboration-cursors", inputs: ["cursors", "zoom"] }, { kind: "component", type: RemoteSelectionOverlayComponent, selector: "pptx-remote-selection-overlay", inputs: ["presences", "elements", "activeSlideIndex", "zoom"] }, { kind: "component", type: FollowModeBarComponent, selector: "pptx-follow-mode-bar", inputs: ["presences", "followedClientId"], outputs: ["follow"] }, { kind: "component", type: PropertiesDialogComponent, selector: "pptx-properties-dialog", inputs: ["open", "properties"], outputs: ["save", "close"] }, { kind: "component", type: HyperlinkDialogComponent, selector: "pptx-hyperlink-dialog", inputs: ["open", "element"], outputs: ["save", "close"] }, { kind: "component", type: PrintDialogComponent, selector: "pptx-print-dialog", inputs: ["slides", "activeSlideIndex", "defaultSlidesPerPage", "defaultFrameSlides"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen"], outputs: ["toggleMenu", "undo", "redo", "save", "present"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide"], outputs: ["update"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "showGrid", "showRulers", "showGuides", "snapToGrid", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "share", "broadcast", "openFile", "save", "toggleSidebar", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "shapeInsert", "moveLayer", "moveLayerToEdge"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen"], outputs: ["toggleAutosave", "save", "undo", "redo", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName"], outputs: ["applyTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden"] }, { kind: "component", type: CustomShowsComponent, selector: "pptx-custom-shows", inputs: ["open", "slides", "customShows", "activeCustomShowId"], outputs: ["create", "remove", "update", "setActive", "close"] }, { kind: "component", type: InsertSmartArtDialogComponent, selector: "pptx-insert-smart-art-dialog", inputs: ["open"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows"], outputs: ["restoreContent"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
80834
81465
  }
80835
81466
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PowerPointViewerComponent, decorators: [{
80836
81467
  type: Component,
@@ -81924,6 +82555,9 @@ const translationsEn = {
81924
82555
  'pptx.autosave.saving': 'Saving…',
81925
82556
  'pptx.autosave.saved': 'Saved {{time}}',
81926
82557
  'pptx.autosave.error': 'Autosave error',
82558
+ 'pptx.autosave.disabled': 'AutoSave unavailable',
82559
+ 'pptx.autosave.disabledNoFilePath': 'AutoSave disabled: no file path provided',
82560
+ 'pptx.autosave.disabledToggleOff': 'AutoSave off',
81927
82561
  'pptx.autosave.justNow': 'just now',
81928
82562
  'pptx.autosave.oneMinAgo': '1 min ago',
81929
82563
  'pptx.autosave.minutesAgo': '{{count}} min ago',
@@ -81939,7 +82573,13 @@ const translationsEn = {
81939
82573
  'pptx.titleBar.savedToThisPc': 'Saved to this PC',
81940
82574
  'pptx.titleBar.defaultFileName': 'Presentation',
81941
82575
  'pptx.titleBar.search': 'Search',
82576
+ 'pptx.titleBar.searchPlaceholder': 'Tell me what you want to do',
81942
82577
  'pptx.titleBar.record': 'Record',
82578
+ 'pptx.titleBar.searchCommands': 'Actions',
82579
+ 'pptx.titleBar.searchContent': 'Find in Slides',
82580
+ 'pptx.titleBar.searchHelp': 'Get Help on',
82581
+ 'pptx.titleBar.searchNoResults': 'No results',
82582
+ 'pptx.titleBar.searchRecent': 'Recent',
81943
82583
  // Toolbar
81944
82584
  'pptx.toolbar.toggleSlidesPanel': 'Toggle slides panel',
81945
82585
  'pptx.toolbar.undo': 'Undo',
@@ -83556,6 +84196,12 @@ const translationsEn = {
83556
84196
  'pptx.ribbon.duration': 'Duration:',
83557
84197
  'pptx.ribbon.transitionDurationTitle': 'Transition duration in seconds',
83558
84198
  'pptx.ribbon.applyTransitionToAll': 'Apply transition to all slides',
84199
+ 'pptx.ribbon.advanceSlide': 'Advance Slide',
84200
+ 'pptx.ribbon.onMouseClick': 'On Mouse Click',
84201
+ 'pptx.ribbon.afterDuration': 'After:',
84202
+ 'pptx.ribbon.advanceAfterSeconds': 'Advance after specified duration',
84203
+ 'pptx.ribbon.sound': 'Sound:',
84204
+ 'pptx.ribbon.soundNone': '[No Sound]',
83559
84205
  'pptx.ribbon.inspector': 'Inspector',
83560
84206
  'pptx.ribbon.openInspectorTransitions': 'Open Inspector for full transition options',
83561
84207
  'pptx.ribbon.removeAnimation': 'Remove Animation',
@@ -83818,6 +84464,12 @@ const translationsEn = {
83818
84464
  'pptx.review.spelling': 'Spelling',
83819
84465
  'pptx.review.toggleComments': 'Toggle comments panel',
83820
84466
  'pptx.review.toggleSpellCheck': 'Toggle spell check',
84467
+ 'pptx.review.language': 'Language',
84468
+ 'pptx.review.languageTooltip': 'Set proofing language',
84469
+ 'pptx.review.accessibilityCheck': 'Check Accessibility',
84470
+ 'pptx.review.accessibilityCheckTooltip': 'Check for accessibility issues',
84471
+ 'pptx.review.translate': 'Translate',
84472
+ 'pptx.review.translateTooltip': 'Translate selected text',
83821
84473
  'pptx.shortcuts.action.cancelTextEdit': 'Cancel inline text / close menus',
83822
84474
  'pptx.shortcuts.action.clearSelection': 'Clear selection / close menus / cancel edit',
83823
84475
  'pptx.shortcuts.action.commitTextEdit': 'Commit inline text edit',
@@ -83872,6 +84524,12 @@ const translationsEn = {
83872
84524
  'pptx.tableCell.edgeBorderColorAria': '{{edge}} border colour',
83873
84525
  'pptx.tableCell.textColorAria': 'Text colour',
83874
84526
  'pptx.text.bulletList': 'Bullet List',
84527
+ 'pptx.text.changeCase': 'Change Case',
84528
+ 'pptx.text.changeCaseSentence': 'Sentence case.',
84529
+ 'pptx.text.changeCaseLower': 'lowercase',
84530
+ 'pptx.text.changeCaseUpper': 'UPPERCASE',
84531
+ 'pptx.text.changeCaseCapitalize': 'Capitalize Each Word',
84532
+ 'pptx.text.changeCaseToggle': 'tOGGLE cASE',
83875
84533
  'pptx.text.clearFormatting': 'Clear Formatting',
83876
84534
  'pptx.text.decreaseFontSize': 'Decrease Font Size',
83877
84535
  'pptx.text.decreaseIndent': 'Decrease Indent',