pptx-angular-viewer 1.1.59 → 1.1.61

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.
@@ -22215,6 +22215,14 @@ function getDraggedShapeAdjustmentValue(state, deltaX) {
22215
22215
  */
22216
22216
  /** Maximum time (ms) to wait for an initial WebSocket connection before giving up. */
22217
22217
  const CONNECTION_TIMEOUT_MS = 30_000;
22218
+ /**
22219
+ * Grace period (ms) before the first local doc write when the provider has not
22220
+ * signalled initial sync. Websocket providers emit 'synced' reliably; webrtc
22221
+ * only syncs once a peer is present, so a lone (fresh-room) peer seeds the doc
22222
+ * after this delay instead. Gating the first write prevents a late joiner's
22223
+ * bootstrap deck from merging into a room whose real content has not arrived.
22224
+ */
22225
+ const INITIAL_SYNC_GRACE_MS = 3_000;
22218
22226
  /** Heartbeat interval (ms): re-publish presence so peers don't time us out. */
22219
22227
  const PRESENCE_HEARTBEAT_MS = 10_000;
22220
22228
  /** Minimum interval (ms) between outgoing presence broadcasts (rate limiting). */
@@ -23174,6 +23182,58 @@ function reconcileSlidesInYDoc(slides, ydoc, factories, origin = LOCAL_SYNC_ORIG
23174
23182
  }, origin);
23175
23183
  }
23176
23184
 
23185
+ /**
23186
+ * collaboration-sync-gate.ts: first-write gate for collaborative sessions.
23187
+ *
23188
+ * Until a provider confirms its initial document sync, local state must not
23189
+ * be written into the shared doc: a late joiner bootstrapped with a
23190
+ * placeholder deck would otherwise merge that placeholder into the room's
23191
+ * real content. Websocket providers emit a reliable 'synced' event; y-webrtc
23192
+ * only syncs when a peer is present, so a lone fresh-room peer opens the gate
23193
+ * after {@link INITIAL_SYNC_GRACE_MS} instead and seeds the empty doc.
23194
+ *
23195
+ * Usage per binding: create the gate with an `onOpen` callback that performs
23196
+ * the deferred first write, call `arm()` when the provider is created (and on
23197
+ * (re)connect), `open()` from the provider's sync event, gate local writes on
23198
+ * `isOpen()`, and `reset()` on session teardown.
23199
+ */
23200
+ /**
23201
+ * Create a first-write gate. `onOpen` fires exactly once per session (until
23202
+ * `reset()`), from either the provider sync signal or the grace timer.
23203
+ */
23204
+ function createSyncGate(onOpen, graceMs = INITIAL_SYNC_GRACE_MS) {
23205
+ let opened = false;
23206
+ let timer = null;
23207
+ const clear = () => {
23208
+ if (timer !== null) {
23209
+ clearTimeout(timer);
23210
+ timer = null;
23211
+ }
23212
+ };
23213
+ const open = () => {
23214
+ clear();
23215
+ if (opened) {
23216
+ return;
23217
+ }
23218
+ opened = true;
23219
+ onOpen();
23220
+ };
23221
+ return {
23222
+ isOpen: () => opened,
23223
+ arm: () => {
23224
+ clear();
23225
+ if (!opened) {
23226
+ timer = setTimeout(open, graceMs);
23227
+ }
23228
+ },
23229
+ open,
23230
+ reset: () => {
23231
+ clear();
23232
+ opened = false;
23233
+ },
23234
+ };
23235
+ }
23236
+
23177
23237
  // ---------------------------------------------------------------------------
23178
23238
  // Tuning constants (px tolerances for position / size changes)
23179
23239
  // ---------------------------------------------------------------------------
@@ -35818,6 +35878,14 @@ class CollaborationService {
35818
35878
  connectTimer = null;
35819
35879
  unobserveSlides = null;
35820
35880
  writeBack = new WriteBackScheduler();
35881
+ /**
35882
+ * First-write gate: local broadcasts are suppressed (captured as pending)
35883
+ * until the provider confirms its initial sync or the grace period lifts
35884
+ * the gate, so a late joiner never seeds its placeholder deck into a room
35885
+ * whose real content has not arrived yet.
35886
+ */
35887
+ syncGate = createSyncGate(() => this.flushPendingBroadcast());
35888
+ pendingBroadcast = null;
35821
35889
  onRemoteSlides = null;
35822
35890
  canvasWidth = DEFAULT_CANVAS_BOUND;
35823
35891
  canvasHeight = DEFAULT_CANVAS_BOUND;
@@ -35881,6 +35949,8 @@ class CollaborationService {
35881
35949
  this.awareness.on('change', this.refreshPresence);
35882
35950
  this.awareness.on('update', this.refreshPresence);
35883
35951
  this.wireStatus(config);
35952
+ this.syncGate.reset();
35953
+ this.wireSynced();
35884
35954
  this.unobserveSlides = observeYDocSlides(this.ydoc, (_events, transaction) => this.onRemoteChange(transaction));
35885
35955
  this.active.set(true);
35886
35956
  this.refreshPresence();
@@ -35937,6 +36007,50 @@ class CollaborationService {
35937
36007
  }
35938
36008
  }, CONNECTION_TIMEOUT_MS);
35939
36009
  }
36010
+ /**
36011
+ * Open the first-write gate on the provider's initial-sync confirmation.
36012
+ * y-websocket emits 'sync' with a boolean; y-webrtc emits 'synced' with an
36013
+ * object carrying a `synced` flag (and only once a peer syncs, hence the
36014
+ * grace timer). Listen to both; opening is idempotent.
36015
+ */
36016
+ wireSynced() {
36017
+ const provider = this.provider;
36018
+ if (!provider) {
36019
+ return;
36020
+ }
36021
+ const handle = (payload) => {
36022
+ const flag = payload;
36023
+ const isSynced = typeof flag === 'boolean' ? flag : flag?.synced !== false;
36024
+ if (isSynced) {
36025
+ this.syncGate.open();
36026
+ }
36027
+ };
36028
+ provider.on('sync', handle);
36029
+ provider.on('synced', handle);
36030
+ if (provider.synced === true) {
36031
+ this.syncGate.open();
36032
+ }
36033
+ else {
36034
+ this.syncGate.arm();
36035
+ }
36036
+ }
36037
+ /**
36038
+ * Perform the deferred first broadcast once the gate opens. When the doc is
36039
+ * still empty (fresh room, or nobody else present), clear the baseline so
36040
+ * the pending deck actually seeds it; when remote content already arrived,
36041
+ * the pending deck matches the applied baseline and the write is a no-op.
36042
+ */
36043
+ flushPendingBroadcast() {
36044
+ const pending = this.pendingBroadcast;
36045
+ this.pendingBroadcast = null;
36046
+ if (!pending || !this.ydoc || !this.yFactories) {
36047
+ return;
36048
+ }
36049
+ if (this.ydoc.getArray(YDOC_SLIDES_KEY).length === 0) {
36050
+ this.lastSynced = '';
36051
+ }
36052
+ this.broadcastSlides(pending);
36053
+ }
35940
36054
  /** Handle a remote Y.Doc change, skipping our own local-origin transactions. */
35941
36055
  onRemoteChange(transaction) {
35942
36056
  if (transaction?.origin === LOCAL_SYNC_ORIGIN || this.applyingRemote || !this.ydoc) {
@@ -35956,6 +36070,8 @@ class CollaborationService {
35956
36070
  }
35957
36071
  disconnect() {
35958
36072
  this.clearConnectTimer();
36073
+ this.syncGate.reset();
36074
+ this.pendingBroadcast = null;
35959
36075
  this.writeBack.cancel();
35960
36076
  this.unobserveSlides?.();
35961
36077
  this.unobserveSlides = null;
@@ -35999,6 +36115,12 @@ class CollaborationService {
35999
36115
  if (!this.ydoc || !this.yFactories || this.applyingRemote || slides.length === 0) {
36000
36116
  return;
36001
36117
  }
36118
+ if (!this.syncGate.isOpen()) {
36119
+ // Defer until the initial sync confirms; the gate flushes the latest
36120
+ // pending deck when it opens.
36121
+ this.pendingBroadcast = slides;
36122
+ return;
36123
+ }
36002
36124
  const s = JSON.stringify(slides);
36003
36125
  if (s === this.lastSynced) {
36004
36126
  return;
@@ -45267,7 +45389,7 @@ class EffectsPanelComponent {
45267
45389
  (change)="onOuterShadowField('color', $event)"
45268
45390
  />
45269
45391
  <label class="pptx-ng-fx__label" for="fx-os-opacity">{{
45270
- 'pptx.effects.opacity' | translate
45392
+ 'pptx.inspector.opacity' | translate
45271
45393
  }}</label>
45272
45394
  <input
45273
45395
  id="fx-os-opacity"
@@ -45350,7 +45472,7 @@ class EffectsPanelComponent {
45350
45472
  (change)="onInnerShadowField('color', $event)"
45351
45473
  />
45352
45474
  <label class="pptx-ng-fx__label" for="fx-is-opacity">{{
45353
- 'pptx.effects.opacity' | translate
45475
+ 'pptx.inspector.opacity' | translate
45354
45476
  }}</label>
45355
45477
  <input
45356
45478
  id="fx-is-opacity"
@@ -45443,7 +45565,7 @@ class EffectsPanelComponent {
45443
45565
  (change)="onGlowField('radius', $event)"
45444
45566
  />
45445
45567
  <label class="pptx-ng-fx__label" for="fx-glow-opacity">{{
45446
- 'pptx.effects.opacity' | translate
45568
+ 'pptx.inspector.opacity' | translate
45447
45569
  }}</label>
45448
45570
  <input
45449
45571
  id="fx-glow-opacity"
@@ -45605,7 +45727,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
45605
45727
  (change)="onOuterShadowField('color', $event)"
45606
45728
  />
45607
45729
  <label class="pptx-ng-fx__label" for="fx-os-opacity">{{
45608
- 'pptx.effects.opacity' | translate
45730
+ 'pptx.inspector.opacity' | translate
45609
45731
  }}</label>
45610
45732
  <input
45611
45733
  id="fx-os-opacity"
@@ -45688,7 +45810,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
45688
45810
  (change)="onInnerShadowField('color', $event)"
45689
45811
  />
45690
45812
  <label class="pptx-ng-fx__label" for="fx-is-opacity">{{
45691
- 'pptx.effects.opacity' | translate
45813
+ 'pptx.inspector.opacity' | translate
45692
45814
  }}</label>
45693
45815
  <input
45694
45816
  id="fx-is-opacity"
@@ -45781,7 +45903,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
45781
45903
  (change)="onGlowField('radius', $event)"
45782
45904
  />
45783
45905
  <label class="pptx-ng-fx__label" for="fx-glow-opacity">{{
45784
- 'pptx.effects.opacity' | translate
45906
+ 'pptx.inspector.opacity' | translate
45785
45907
  }}</label>
45786
45908
  <input
45787
45909
  id="fx-glow-opacity"
@@ -46668,7 +46790,7 @@ class SmartArtPropertiesComponent {
46668
46790
 
46669
46791
  <!-- ── Layout switcher ──────────────────────────────────────────── -->
46670
46792
  <div class="pptx-sa-props__field">
46671
- <span class="pptx-sa-props__label">{{ 'pptx.smartart.layout' | translate }}</span>
46793
+ <span class="pptx-sa-props__label">{{ 'pptx.master.layout' | translate }}</span>
46672
46794
  <div
46673
46795
  class="pptx-sa-props__layouts"
46674
46796
  role="group"
@@ -46760,7 +46882,7 @@ class SmartArtPropertiesComponent {
46760
46882
  class="pptx-sa-props__node-input"
46761
46883
  [disabled]="!canEdit()"
46762
46884
  [value]="node.text"
46763
- [attr.placeholder]="'pptx.smartart.typeHere' | translate"
46885
+ [attr.placeholder]="'pptx.smartArt.nodePlaceholder' | translate"
46764
46886
  (change)="onNodeText($event, node.id)"
46765
46887
  (keydown)="onNodeKeydown($event, node.id)"
46766
46888
  />
@@ -46769,7 +46891,7 @@ class SmartArtPropertiesComponent {
46769
46891
  <button
46770
46892
  type="button"
46771
46893
  class="pptx-sa-props__icon"
46772
- [title]="'pptx.smartart.addSubItem' | translate"
46894
+ [title]="'pptx.smartArt.addSubItem' | translate"
46773
46895
  [disabled]="!canEdit()"
46774
46896
  (click)="onAddSubItem(node.id)"
46775
46897
  >
@@ -46797,7 +46919,7 @@ class SmartArtPropertiesComponent {
46797
46919
  <button
46798
46920
  type="button"
46799
46921
  class="pptx-sa-props__icon"
46800
- [title]="'pptx.smartart.moveUp' | translate"
46922
+ [title]="'pptx.smartArt.moveUp' | translate"
46801
46923
  [disabled]="!canEdit()"
46802
46924
  (click)="onMoveUp(node.id)"
46803
46925
  >
@@ -46806,7 +46928,7 @@ class SmartArtPropertiesComponent {
46806
46928
  <button
46807
46929
  type="button"
46808
46930
  class="pptx-sa-props__icon"
46809
- [title]="'pptx.smartart.moveDown' | translate"
46931
+ [title]="'pptx.smartArt.moveDown' | translate"
46810
46932
  [disabled]="!canEdit()"
46811
46933
  (click)="onMoveDown(node.id)"
46812
46934
  >
@@ -46818,7 +46940,7 @@ class SmartArtPropertiesComponent {
46818
46940
  [title]="
46819
46941
  !isChild(node) && !canRemoveItem()
46820
46942
  ? boundsHint()
46821
- : ('pptx.smartart.remove' | translate)
46943
+ : ('pptx.smartArt.remove' | translate)
46822
46944
  "
46823
46945
  [disabled]="
46824
46946
  !canEdit() || nodes().length <= 1 || (!isChild(node) && !canRemoveItem())
@@ -46833,7 +46955,7 @@ class SmartArtPropertiesComponent {
46833
46955
  <div class="pptx-sa-props__node-style">
46834
46956
  <label class="pptx-sa-props__swatch" [title]="'pptx.smartart.nodeFill' | translate">
46835
46957
  <span class="pptx-sa-props__swatch-label">{{
46836
- 'pptx.smartart.fill' | translate
46958
+ 'pptx.smartArt.fill' | translate
46837
46959
  }}</span>
46838
46960
  <input
46839
46961
  type="color"
@@ -46845,7 +46967,7 @@ class SmartArtPropertiesComponent {
46845
46967
  </label>
46846
46968
  <label class="pptx-sa-props__swatch" [title]="'pptx.smartart.nodeFont' | translate">
46847
46969
  <span class="pptx-sa-props__swatch-label">{{
46848
- 'pptx.smartart.font' | translate
46970
+ 'pptx.textPanel.font' | translate
46849
46971
  }}</span>
46850
46972
  <input
46851
46973
  type="color"
@@ -46858,7 +46980,7 @@ class SmartArtPropertiesComponent {
46858
46980
  <button
46859
46981
  type="button"
46860
46982
  class="pptx-sa-props__icon pptx-sa-props__style-toggle"
46861
- [title]="'pptx.smartart.bold' | translate"
46983
+ [title]="'pptx.inspector.bold' | translate"
46862
46984
  [class.is-active]="nodeIsBold(node)"
46863
46985
  [attr.aria-pressed]="nodeIsBold(node)"
46864
46986
  [disabled]="!canEdit()"
@@ -46869,7 +46991,7 @@ class SmartArtPropertiesComponent {
46869
46991
  <button
46870
46992
  type="button"
46871
46993
  class="pptx-sa-props__icon pptx-sa-props__style-toggle"
46872
- [title]="'pptx.smartart.italic' | translate"
46994
+ [title]="'pptx.inspector.italic' | translate"
46873
46995
  [class.is-active]="nodeIsItalic(node)"
46874
46996
  [attr.aria-pressed]="nodeIsItalic(node)"
46875
46997
  [disabled]="!canEdit()"
@@ -46894,7 +47016,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
46894
47016
 
46895
47017
  <!-- ── Layout switcher ──────────────────────────────────────────── -->
46896
47018
  <div class="pptx-sa-props__field">
46897
- <span class="pptx-sa-props__label">{{ 'pptx.smartart.layout' | translate }}</span>
47019
+ <span class="pptx-sa-props__label">{{ 'pptx.master.layout' | translate }}</span>
46898
47020
  <div
46899
47021
  class="pptx-sa-props__layouts"
46900
47022
  role="group"
@@ -46986,7 +47108,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
46986
47108
  class="pptx-sa-props__node-input"
46987
47109
  [disabled]="!canEdit()"
46988
47110
  [value]="node.text"
46989
- [attr.placeholder]="'pptx.smartart.typeHere' | translate"
47111
+ [attr.placeholder]="'pptx.smartArt.nodePlaceholder' | translate"
46990
47112
  (change)="onNodeText($event, node.id)"
46991
47113
  (keydown)="onNodeKeydown($event, node.id)"
46992
47114
  />
@@ -46995,7 +47117,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
46995
47117
  <button
46996
47118
  type="button"
46997
47119
  class="pptx-sa-props__icon"
46998
- [title]="'pptx.smartart.addSubItem' | translate"
47120
+ [title]="'pptx.smartArt.addSubItem' | translate"
46999
47121
  [disabled]="!canEdit()"
47000
47122
  (click)="onAddSubItem(node.id)"
47001
47123
  >
@@ -47023,7 +47145,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47023
47145
  <button
47024
47146
  type="button"
47025
47147
  class="pptx-sa-props__icon"
47026
- [title]="'pptx.smartart.moveUp' | translate"
47148
+ [title]="'pptx.smartArt.moveUp' | translate"
47027
47149
  [disabled]="!canEdit()"
47028
47150
  (click)="onMoveUp(node.id)"
47029
47151
  >
@@ -47032,7 +47154,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47032
47154
  <button
47033
47155
  type="button"
47034
47156
  class="pptx-sa-props__icon"
47035
- [title]="'pptx.smartart.moveDown' | translate"
47157
+ [title]="'pptx.smartArt.moveDown' | translate"
47036
47158
  [disabled]="!canEdit()"
47037
47159
  (click)="onMoveDown(node.id)"
47038
47160
  >
@@ -47044,7 +47166,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47044
47166
  [title]="
47045
47167
  !isChild(node) && !canRemoveItem()
47046
47168
  ? boundsHint()
47047
- : ('pptx.smartart.remove' | translate)
47169
+ : ('pptx.smartArt.remove' | translate)
47048
47170
  "
47049
47171
  [disabled]="
47050
47172
  !canEdit() || nodes().length <= 1 || (!isChild(node) && !canRemoveItem())
@@ -47059,7 +47181,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47059
47181
  <div class="pptx-sa-props__node-style">
47060
47182
  <label class="pptx-sa-props__swatch" [title]="'pptx.smartart.nodeFill' | translate">
47061
47183
  <span class="pptx-sa-props__swatch-label">{{
47062
- 'pptx.smartart.fill' | translate
47184
+ 'pptx.smartArt.fill' | translate
47063
47185
  }}</span>
47064
47186
  <input
47065
47187
  type="color"
@@ -47071,7 +47193,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47071
47193
  </label>
47072
47194
  <label class="pptx-sa-props__swatch" [title]="'pptx.smartart.nodeFont' | translate">
47073
47195
  <span class="pptx-sa-props__swatch-label">{{
47074
- 'pptx.smartart.font' | translate
47196
+ 'pptx.textPanel.font' | translate
47075
47197
  }}</span>
47076
47198
  <input
47077
47199
  type="color"
@@ -47084,7 +47206,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47084
47206
  <button
47085
47207
  type="button"
47086
47208
  class="pptx-sa-props__icon pptx-sa-props__style-toggle"
47087
- [title]="'pptx.smartart.bold' | translate"
47209
+ [title]="'pptx.inspector.bold' | translate"
47088
47210
  [class.is-active]="nodeIsBold(node)"
47089
47211
  [attr.aria-pressed]="nodeIsBold(node)"
47090
47212
  [disabled]="!canEdit()"
@@ -47095,7 +47217,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47095
47217
  <button
47096
47218
  type="button"
47097
47219
  class="pptx-sa-props__icon pptx-sa-props__style-toggle"
47098
- [title]="'pptx.smartart.italic' | translate"
47220
+ [title]="'pptx.inspector.italic' | translate"
47099
47221
  [class.is-active]="nodeIsItalic(node)"
47100
47222
  [attr.aria-pressed]="nodeIsItalic(node)"
47101
47223
  [disabled]="!canEdit()"
@@ -47901,7 +48023,7 @@ class TableCellFormattingComponent {
47901
48023
  [disabled]="!canEdit()"
47902
48024
  (click)="onMergeRange()"
47903
48025
  >
47904
- {{ 'pptx.table.mergeSelected' | translate }}
48026
+ {{ 'pptx.contextMenu.mergeSelectedCells' | translate }}
47905
48027
  </button>
47906
48028
  }
47907
48029
  </div>
@@ -48047,7 +48169,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
48047
48169
  [disabled]="!canEdit()"
48048
48170
  (click)="onMergeRange()"
48049
48171
  >
48050
- {{ 'pptx.table.mergeSelected' | translate }}
48172
+ {{ 'pptx.contextMenu.mergeSelectedCells' | translate }}
48051
48173
  </button>
48052
48174
  }
48053
48175
  </div>
@@ -54886,7 +55008,7 @@ class SmartArtRendererComponent {
54886
55008
  >
54887
55009
  @if (isEmpty()) {
54888
55010
  <div class="pptx-ng-smartart-placeholder">
54889
- {{ 'pptx.smartart.placeholder' | translate }}
55011
+ {{ 'pptx.smartArt.placeholder' | translate }}
54890
55012
  </div>
54891
55013
  } @else if (hasDrawingShapes()) {
54892
55014
  <svg
@@ -55047,7 +55169,7 @@ class SmartArtRendererComponent {
55047
55169
  </svg>
55048
55170
  } @else {
55049
55171
  <div class="pptx-ng-smartart-placeholder">
55050
- {{ 'pptx.smartart.placeholder' | translate }}
55172
+ {{ 'pptx.smartArt.placeholder' | translate }}
55051
55173
  </div>
55052
55174
  }
55053
55175
 
@@ -55062,7 +55184,7 @@ class SmartArtRendererComponent {
55062
55184
  <button
55063
55185
  type="button"
55064
55186
  class="pptx-ng-smartart-swatch"
55065
- [attr.aria-label]="'pptx.smartart.setFillTo' | translate: { color: color }"
55187
+ [attr.aria-label]="'pptx.smartArt.setFill' | translate: { color: color }"
55066
55188
  [style.background]="color"
55067
55189
  (click)="handleChangeNodeStyle(hoveredNodeId()!, color)"
55068
55190
  ></button>
@@ -55119,7 +55241,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55119
55241
  >
55120
55242
  @if (isEmpty()) {
55121
55243
  <div class="pptx-ng-smartart-placeholder">
55122
- {{ 'pptx.smartart.placeholder' | translate }}
55244
+ {{ 'pptx.smartArt.placeholder' | translate }}
55123
55245
  </div>
55124
55246
  } @else if (hasDrawingShapes()) {
55125
55247
  <svg
@@ -55280,7 +55402,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55280
55402
  </svg>
55281
55403
  } @else {
55282
55404
  <div class="pptx-ng-smartart-placeholder">
55283
- {{ 'pptx.smartart.placeholder' | translate }}
55405
+ {{ 'pptx.smartArt.placeholder' | translate }}
55284
55406
  </div>
55285
55407
  }
55286
55408
 
@@ -55295,7 +55417,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55295
55417
  <button
55296
55418
  type="button"
55297
55419
  class="pptx-ng-smartart-swatch"
55298
- [attr.aria-label]="'pptx.smartart.setFillTo' | translate: { color: color }"
55420
+ [attr.aria-label]="'pptx.smartArt.setFill' | translate: { color: color }"
55299
55421
  [style.background]="color"
55300
55422
  (click)="handleChangeNodeStyle(hoveredNodeId()!, color)"
55301
55423
  ></button>
@@ -55584,7 +55706,7 @@ class SmartArt3DRendererComponent {
55584
55706
  [style.height.px]="editState()!.box.height"
55585
55707
  [value]="editState()!.text"
55586
55708
  spellcheck="false"
55587
- [attr.aria-label]="'pptx.smartart.editNodeText' | translate"
55709
+ [attr.aria-label]="'pptx.smartArt.editNodeText' | translate"
55588
55710
  (input)="updateDraft($event)"
55589
55711
  (blur)="commitEdit()"
55590
55712
  (keydown)="onEditorKeydown($event)"
@@ -55626,7 +55748,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55626
55748
  [style.height.px]="editState()!.box.height"
55627
55749
  [value]="editState()!.text"
55628
55750
  spellcheck="false"
55629
- [attr.aria-label]="'pptx.smartart.editNodeText' | translate"
55751
+ [attr.aria-label]="'pptx.smartArt.editNodeText' | translate"
55630
55752
  (input)="updateDraft($event)"
55631
55753
  (blur)="commitEdit()"
55632
55754
  (keydown)="onEditorKeydown($event)"
@@ -57243,7 +57365,7 @@ class ElementRendererComponent {
57243
57365
  }, /* @ts-ignore */
57244
57366
  ...(ngDevMode ? [{ debugName: "placeholderLabel" }] : /* istanbul ignore next */ []));
57245
57367
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: ElementRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
57246
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: ElementRendererComponent, isStandalone: true, selector: "pptx-element-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, obstacles: { classPropertyName: "obstacles", publicName: "obstacles", isSignal: true, isRequired: false, transformFunction: null }, canvasWidth: { classPropertyName: "canvasWidth", publicName: "canvasWidth", isSignal: true, isRequired: false, transformFunction: null }, canvasHeight: { classPropertyName: "canvasHeight", publicName: "canvasHeight", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, fieldContext: { classPropertyName: "fieldContext", publicName: "fieldContext", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellCommit: "cellCommit", tableChange: "tableChange" }, ngImport: i0, template: `
57368
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: ElementRendererComponent, isStandalone: true, selector: "pptx-element-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, obstacles: { classPropertyName: "obstacles", publicName: "obstacles", isSignal: true, isRequired: false, transformFunction: null }, canvasWidth: { classPropertyName: "canvasWidth", publicName: "canvasWidth", isSignal: true, isRequired: false, transformFunction: null }, canvasHeight: { classPropertyName: "canvasHeight", publicName: "canvasHeight", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, fieldContext: { classPropertyName: "fieldContext", publicName: "fieldContext", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellCommit: "cellCommit", tableChange: "tableChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
57247
57369
  @switch (true) {
57248
57370
  @case (element().type === 'connector') {
57249
57371
  <pptx-connector-renderer
@@ -57517,6 +57639,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
57517
57639
  selector: 'pptx-element-renderer',
57518
57640
  standalone: true,
57519
57641
  changeDetection: ChangeDetectionStrategy.OnPush,
57642
+ host: { class: 'contents' },
57520
57643
  imports: [
57521
57644
  NgStyle,
57522
57645
  ConnectorRendererComponent,
@@ -58950,7 +59073,7 @@ class SlideCanvasComponent {
58950
59073
  <div
58951
59074
  class="pptx-ng-rotate-handle"
58952
59075
  role="button"
58953
- [attr.aria-label]="'pptx.canvas.rotate' | translate"
59076
+ [attr.aria-label]="'pptx.selectionOverlay.rotate' | translate"
58954
59077
  [style.left.px]="rh.left"
58955
59078
  [style.top.px]="rh.top"
58956
59079
  [style.width.px]="rh.size"
@@ -59324,7 +59447,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
59324
59447
  <div
59325
59448
  class="pptx-ng-rotate-handle"
59326
59449
  role="button"
59327
- [attr.aria-label]="'pptx.canvas.rotate' | translate"
59450
+ [attr.aria-label]="'pptx.selectionOverlay.rotate' | translate"
59328
59451
  [style.left.px]="rh.left"
59329
59452
  [style.top.px]="rh.top"
59330
59453
  [style.width.px]="rh.size"
@@ -65103,7 +65226,7 @@ class PropertiesDialogComponent {
65103
65226
  <div class="pptx-ng-props-form">
65104
65227
  <div class="pptx-ng-props-field">
65105
65228
  <label for="pptx-ng-props-title" class="pptx-ng-props-label">{{
65106
- 'pptx.documentProperties.summary.title' | translate
65229
+ 'pptx.properties.titleLabel' | translate
65107
65230
  }}</label>
65108
65231
  <input
65109
65232
  id="pptx-ng-props-title"
@@ -65116,7 +65239,7 @@ class PropertiesDialogComponent {
65116
65239
 
65117
65240
  <div class="pptx-ng-props-field">
65118
65241
  <label for="pptx-ng-props-creator" class="pptx-ng-props-label">{{
65119
- 'pptx.documentProperties.summary.author' | translate
65242
+ 'pptx.properties.author' | translate
65120
65243
  }}</label>
65121
65244
  <input
65122
65245
  id="pptx-ng-props-creator"
@@ -65129,7 +65252,7 @@ class PropertiesDialogComponent {
65129
65252
 
65130
65253
  <div class="pptx-ng-props-field">
65131
65254
  <label for="pptx-ng-props-subject" class="pptx-ng-props-label">{{
65132
- 'pptx.documentProperties.summary.subject' | translate
65255
+ 'pptx.properties.subject' | translate
65133
65256
  }}</label>
65134
65257
  <input
65135
65258
  id="pptx-ng-props-subject"
@@ -65142,7 +65265,7 @@ class PropertiesDialogComponent {
65142
65265
 
65143
65266
  <div class="pptx-ng-props-field">
65144
65267
  <label for="pptx-ng-props-keywords" class="pptx-ng-props-label">{{
65145
- 'pptx.documentProperties.summary.keywords' | translate
65268
+ 'pptx.properties.keywords' | translate
65146
65269
  }}</label>
65147
65270
  <input
65148
65271
  id="pptx-ng-props-keywords"
@@ -65195,7 +65318,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
65195
65318
  <div class="pptx-ng-props-form">
65196
65319
  <div class="pptx-ng-props-field">
65197
65320
  <label for="pptx-ng-props-title" class="pptx-ng-props-label">{{
65198
- 'pptx.documentProperties.summary.title' | translate
65321
+ 'pptx.properties.titleLabel' | translate
65199
65322
  }}</label>
65200
65323
  <input
65201
65324
  id="pptx-ng-props-title"
@@ -65208,7 +65331,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
65208
65331
 
65209
65332
  <div class="pptx-ng-props-field">
65210
65333
  <label for="pptx-ng-props-creator" class="pptx-ng-props-label">{{
65211
- 'pptx.documentProperties.summary.author' | translate
65334
+ 'pptx.properties.author' | translate
65212
65335
  }}</label>
65213
65336
  <input
65214
65337
  id="pptx-ng-props-creator"
@@ -65221,7 +65344,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
65221
65344
 
65222
65345
  <div class="pptx-ng-props-field">
65223
65346
  <label for="pptx-ng-props-subject" class="pptx-ng-props-label">{{
65224
- 'pptx.documentProperties.summary.subject' | translate
65347
+ 'pptx.properties.subject' | translate
65225
65348
  }}</label>
65226
65349
  <input
65227
65350
  id="pptx-ng-props-subject"
@@ -65234,7 +65357,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
65234
65357
 
65235
65358
  <div class="pptx-ng-props-field">
65236
65359
  <label for="pptx-ng-props-keywords" class="pptx-ng-props-label">{{
65237
- 'pptx.documentProperties.summary.keywords' | translate
65360
+ 'pptx.properties.keywords' | translate
65238
65361
  }}</label>
65239
65362
  <input
65240
65363
  id="pptx-ng-props-keywords"
@@ -67869,7 +67992,7 @@ class RibbonInsertFieldsComponent {
67869
67992
  class="flex w-full items-center gap-2 px-3 py-1.5 text-xs text-foreground transition-colors hover:bg-muted"
67870
67993
  (click)="openDatePicker()"
67871
67994
  >
67872
- {{ 'pptx.field.dateAndTime' | translate }}
67995
+ {{ 'pptx.headerFooter.dateAndTime' | translate }}
67873
67996
  </button>
67874
67997
  <button
67875
67998
  type="button"
@@ -67897,7 +68020,7 @@ class RibbonInsertFieldsComponent {
67897
68020
  >
67898
68021
  <div class="w-72 space-y-3 rounded-lg border border-border bg-card p-4 shadow-2xl">
67899
68022
  <div class="text-sm font-medium text-foreground">
67900
- {{ 'pptx.field.dateAndTime' | translate }}
68023
+ {{ 'pptx.headerFooter.dateAndTime' | translate }}
67901
68024
  </div>
67902
68025
  <input
67903
68026
  type="datetime-local"
@@ -68030,7 +68153,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68030
68153
  class="flex w-full items-center gap-2 px-3 py-1.5 text-xs text-foreground transition-colors hover:bg-muted"
68031
68154
  (click)="openDatePicker()"
68032
68155
  >
68033
- {{ 'pptx.field.dateAndTime' | translate }}
68156
+ {{ 'pptx.headerFooter.dateAndTime' | translate }}
68034
68157
  </button>
68035
68158
  <button
68036
68159
  type="button"
@@ -68058,7 +68181,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68058
68181
  >
68059
68182
  <div class="w-72 space-y-3 rounded-lg border border-border bg-card p-4 shadow-2xl">
68060
68183
  <div class="text-sm font-medium text-foreground">
68061
- {{ 'pptx.field.dateAndTime' | translate }}
68184
+ {{ 'pptx.headerFooter.dateAndTime' | translate }}
68062
68185
  </div>
68063
68186
  <input
68064
68187
  type="datetime-local"
@@ -70325,7 +70448,7 @@ class SelectionPaneComponent {
70325
70448
  }
70326
70449
  </ul>
70327
70450
  } @else {
70328
- <p class="pptx-ng-sel-pane__empty">{{ 'pptx.selectionPane.emptySlide' | translate }}</p>
70451
+ <p class="pptx-ng-sel-pane__empty">{{ 'pptx.selectionPane.empty' | translate }}</p>
70329
70452
  }
70330
70453
  </aside>
70331
70454
  `, isInline: true, styles: [":host{display:block;height:100%;width:100%}.pptx-ng-sel-pane{display:flex;flex-direction:column;min-height:0;height:100%;width:100%;background:var(--pptx-card, #111827);color:var(--pptx-foreground, #f3f4f6);border-left:1px solid var(--pptx-border, #374151);font-family:system-ui,sans-serif}.pptx-ng-sel-pane__header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--pptx-border, #374151);flex-shrink:0}.pptx-ng-sel-pane__title{margin:0;font-size:14px;font-weight:600}.pptx-ng-sel-pane__count{font-size:12px;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-sel-pane__list{list-style:none;margin:0;padding:8px;overflow-y:auto;flex:1 1 auto;min-height:0}.pptx-ng-sel-pane__row{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:6px;border:1px solid transparent;cursor:pointer;margin-bottom:2px;transition:background .1s;-webkit-user-select:none;user-select:none}.pptx-ng-sel-pane__row:hover{background:var(--pptx-accent, #1f2937)}.pptx-ng-sel-pane__row--selected{border-color:var(--pptx-primary, #6366f1);background:color-mix(in srgb,var(--pptx-primary, #6366f1) 15%,transparent)}.pptx-ng-sel-pane__row--hidden{opacity:.5}.pptx-ng-sel-pane__icon{flex-shrink:0;width:20px;text-align:center;font-size:12px;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-sel-pane__label{flex:1 1 auto;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.pptx-ng-sel-pane__actions{display:flex;gap:2px;flex-shrink:0}.pptx-ng-sel-pane__btn{background:transparent;border:1px solid var(--pptx-border, #374151);color:inherit;border-radius:4px;padding:2px 5px;font-size:11px;cursor:pointer;line-height:1.2}.pptx-ng-sel-pane__btn:hover{background:var(--pptx-accent, #1f2937)}.pptx-ng-sel-pane__empty{padding:16px;font-size:13px;color:var(--pptx-muted-foreground, #9ca3af)}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -70396,7 +70519,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70396
70519
  }
70397
70520
  </ul>
70398
70521
  } @else {
70399
- <p class="pptx-ng-sel-pane__empty">{{ 'pptx.selectionPane.emptySlide' | translate }}</p>
70522
+ <p class="pptx-ng-sel-pane__empty">{{ 'pptx.selectionPane.empty' | translate }}</p>
70400
70523
  }
70401
70524
  </aside>
70402
70525
  `, styles: [":host{display:block;height:100%;width:100%}.pptx-ng-sel-pane{display:flex;flex-direction:column;min-height:0;height:100%;width:100%;background:var(--pptx-card, #111827);color:var(--pptx-foreground, #f3f4f6);border-left:1px solid var(--pptx-border, #374151);font-family:system-ui,sans-serif}.pptx-ng-sel-pane__header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--pptx-border, #374151);flex-shrink:0}.pptx-ng-sel-pane__title{margin:0;font-size:14px;font-weight:600}.pptx-ng-sel-pane__count{font-size:12px;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-sel-pane__list{list-style:none;margin:0;padding:8px;overflow-y:auto;flex:1 1 auto;min-height:0}.pptx-ng-sel-pane__row{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:6px;border:1px solid transparent;cursor:pointer;margin-bottom:2px;transition:background .1s;-webkit-user-select:none;user-select:none}.pptx-ng-sel-pane__row:hover{background:var(--pptx-accent, #1f2937)}.pptx-ng-sel-pane__row--selected{border-color:var(--pptx-primary, #6366f1);background:color-mix(in srgb,var(--pptx-primary, #6366f1) 15%,transparent)}.pptx-ng-sel-pane__row--hidden{opacity:.5}.pptx-ng-sel-pane__icon{flex-shrink:0;width:20px;text-align:center;font-size:12px;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-sel-pane__label{flex:1 1 auto;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.pptx-ng-sel-pane__actions{display:flex;gap:2px;flex-shrink:0}.pptx-ng-sel-pane__btn{background:transparent;border:1px solid var(--pptx-border, #374151);color:inherit;border-radius:4px;padding:2px 5px;font-size:11px;cursor:pointer;line-height:1.2}.pptx-ng-sel-pane__btn:hover{background:var(--pptx-accent, #1f2937)}.pptx-ng-sel-pane__empty{padding:16px;font-size:13px;color:var(--pptx-muted-foreground, #9ca3af)}\n"] }]
@@ -70602,9 +70725,7 @@ class ShareDialogComponent {
70602
70725
 
70603
70726
  @if (shareUrl()) {
70604
70727
  <div class="pptx-ng-share-field">
70605
- <label class="pptx-ng-share-label">{{
70606
- 'pptx.share.shareLinkLabel' | translate
70607
- }}</label>
70728
+ <label class="pptx-ng-share-label">{{ 'pptx.share.shareLink' | translate }}</label>
70608
70729
  <div class="pptx-ng-share-link-row">
70609
70730
  <input
70610
70731
  class="pptx-ng-share-input"
@@ -70622,12 +70743,12 @@ class ShareDialogComponent {
70622
70743
  {{ (copied() ? 'pptx.share.copied' : 'pptx.share.copyLinkButton') | translate }}
70623
70744
  </button>
70624
70745
  </div>
70625
- <p class="pptx-ng-share-hint">{{ 'pptx.share.copyLinkHint' | translate }}</p>
70746
+ <p class="pptx-ng-share-hint">{{ 'pptx.share.shareHint' | translate }}</p>
70626
70747
  </div>
70627
70748
  }
70628
70749
 
70629
70750
  <button type="button" class="pptx-ng-share-stop" (click)="handleStop()">
70630
- {{ 'pptx.share.stopSharingButton' | translate }}
70751
+ {{ 'pptx.share.stopSharing' | translate }}
70631
70752
  </button>
70632
70753
  </div>
70633
70754
  } @else {
@@ -70694,7 +70815,7 @@ class ShareDialogComponent {
70694
70815
  [disabled]="!canStart()"
70695
70816
  (click)="handleStart()"
70696
70817
  >
70697
- {{ 'pptx.share.startSharingButton' | translate }}
70818
+ {{ 'pptx.share.startSharing' | translate }}
70698
70819
  </button>
70699
70820
  }
70700
70821
  </div>
@@ -70740,9 +70861,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70740
70861
 
70741
70862
  @if (shareUrl()) {
70742
70863
  <div class="pptx-ng-share-field">
70743
- <label class="pptx-ng-share-label">{{
70744
- 'pptx.share.shareLinkLabel' | translate
70745
- }}</label>
70864
+ <label class="pptx-ng-share-label">{{ 'pptx.share.shareLink' | translate }}</label>
70746
70865
  <div class="pptx-ng-share-link-row">
70747
70866
  <input
70748
70867
  class="pptx-ng-share-input"
@@ -70760,12 +70879,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70760
70879
  {{ (copied() ? 'pptx.share.copied' : 'pptx.share.copyLinkButton') | translate }}
70761
70880
  </button>
70762
70881
  </div>
70763
- <p class="pptx-ng-share-hint">{{ 'pptx.share.copyLinkHint' | translate }}</p>
70882
+ <p class="pptx-ng-share-hint">{{ 'pptx.share.shareHint' | translate }}</p>
70764
70883
  </div>
70765
70884
  }
70766
70885
 
70767
70886
  <button type="button" class="pptx-ng-share-stop" (click)="handleStop()">
70768
- {{ 'pptx.share.stopSharingButton' | translate }}
70887
+ {{ 'pptx.share.stopSharing' | translate }}
70769
70888
  </button>
70770
70889
  </div>
70771
70890
  } @else {
@@ -70832,7 +70951,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70832
70951
  [disabled]="!canStart()"
70833
70952
  (click)="handleStart()"
70834
70953
  >
70835
- {{ 'pptx.share.startSharingButton' | translate }}
70954
+ {{ 'pptx.share.startSharing' | translate }}
70836
70955
  </button>
70837
70956
  }
70838
70957
  </div>
@@ -71014,7 +71133,10 @@ class SignaturesPanelComponent {
71014
71133
  }
71015
71134
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SignaturesPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
71016
71135
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SignaturesPanelComponent, isStandalone: true, selector: "pptx-signatures-panel", inputs: { signatures: { classPropertyName: "signatures", publicName: "signatures", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
71017
- <section class="pptx-ng-signatures" [attr.aria-label]="'pptx.signatures.ariaLabel' | translate">
71136
+ <section
71137
+ class="pptx-ng-signatures"
71138
+ [attr.aria-label]="'pptx.digitalSignatures.ariaLabel' | translate"
71139
+ >
71018
71140
  <header
71019
71141
  class="pptx-ng-signatures__header"
71020
71142
  [class]="'pptx-ng-signatures__header--' + overall()"
@@ -71027,7 +71149,9 @@ class SignaturesPanelComponent {
71027
71149
  </header>
71028
71150
 
71029
71151
  @if (!signed()) {
71030
- <p class="pptx-ng-signatures__empty">{{ 'pptx.signatures.empty' | translate }}</p>
71152
+ <p class="pptx-ng-signatures__empty">
71153
+ {{ 'pptx.digitalSignatures.noSignatures' | translate }}
71154
+ </p>
71031
71155
  } @else {
71032
71156
  <ul class="pptx-ng-signatures__list">
71033
71157
  @for (sig of signatures(); track key(sig, $index)) {
@@ -71044,20 +71168,20 @@ class SignaturesPanelComponent {
71044
71168
 
71045
71169
  <dl class="pptx-ng-signatures__meta">
71046
71170
  @if (sig.certificate?.issuer; as issuer) {
71047
- <dt>{{ 'pptx.signatures.issuer' | translate }}</dt>
71171
+ <dt>{{ 'pptx.digitalSignatures.issuer' | translate }}</dt>
71048
71172
  <dd>{{ issuer }}</dd>
71049
71173
  }
71050
71174
  @if (sig.certificate?.serialNumber; as serial) {
71051
- <dt>{{ 'pptx.signatures.serial' | translate }}</dt>
71175
+ <dt>{{ 'pptx.digitalSignatures.serial' | translate }}</dt>
71052
71176
  <dd>{{ serial }}</dd>
71053
71177
  }
71054
71178
  @if (timestamp(sig); as ts) {
71055
- <dt>{{ 'pptx.signatures.signed' | translate }}</dt>
71179
+ <dt>{{ 'pptx.digitalSignatures.signed' | translate }}</dt>
71056
71180
  <dd>{{ ts }}</dd>
71057
71181
  }
71058
71182
  @if (!sig.certificate) {
71059
- <dt>{{ 'pptx.signatures.certificate' | translate }}</dt>
71060
- <dd>{{ 'pptx.signatures.notAvailable' | translate }}</dd>
71183
+ <dt>{{ 'pptx.digitalSignatures.certificate' | translate }}</dt>
71184
+ <dd>{{ 'pptx.digitalSignatures.notAvailable' | translate }}</dd>
71061
71185
  }
71062
71186
  </dl>
71063
71187
  </li>
@@ -71070,7 +71194,10 @@ class SignaturesPanelComponent {
71070
71194
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SignaturesPanelComponent, decorators: [{
71071
71195
  type: Component,
71072
71196
  args: [{ selector: 'pptx-signatures-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe], template: `
71073
- <section class="pptx-ng-signatures" [attr.aria-label]="'pptx.signatures.ariaLabel' | translate">
71197
+ <section
71198
+ class="pptx-ng-signatures"
71199
+ [attr.aria-label]="'pptx.digitalSignatures.ariaLabel' | translate"
71200
+ >
71074
71201
  <header
71075
71202
  class="pptx-ng-signatures__header"
71076
71203
  [class]="'pptx-ng-signatures__header--' + overall()"
@@ -71083,7 +71210,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71083
71210
  </header>
71084
71211
 
71085
71212
  @if (!signed()) {
71086
- <p class="pptx-ng-signatures__empty">{{ 'pptx.signatures.empty' | translate }}</p>
71213
+ <p class="pptx-ng-signatures__empty">
71214
+ {{ 'pptx.digitalSignatures.noSignatures' | translate }}
71215
+ </p>
71087
71216
  } @else {
71088
71217
  <ul class="pptx-ng-signatures__list">
71089
71218
  @for (sig of signatures(); track key(sig, $index)) {
@@ -71100,20 +71229,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71100
71229
 
71101
71230
  <dl class="pptx-ng-signatures__meta">
71102
71231
  @if (sig.certificate?.issuer; as issuer) {
71103
- <dt>{{ 'pptx.signatures.issuer' | translate }}</dt>
71232
+ <dt>{{ 'pptx.digitalSignatures.issuer' | translate }}</dt>
71104
71233
  <dd>{{ issuer }}</dd>
71105
71234
  }
71106
71235
  @if (sig.certificate?.serialNumber; as serial) {
71107
- <dt>{{ 'pptx.signatures.serial' | translate }}</dt>
71236
+ <dt>{{ 'pptx.digitalSignatures.serial' | translate }}</dt>
71108
71237
  <dd>{{ serial }}</dd>
71109
71238
  }
71110
71239
  @if (timestamp(sig); as ts) {
71111
- <dt>{{ 'pptx.signatures.signed' | translate }}</dt>
71240
+ <dt>{{ 'pptx.digitalSignatures.signed' | translate }}</dt>
71112
71241
  <dd>{{ ts }}</dd>
71113
71242
  }
71114
71243
  @if (!sig.certificate) {
71115
- <dt>{{ 'pptx.signatures.certificate' | translate }}</dt>
71116
- <dd>{{ 'pptx.signatures.notAvailable' | translate }}</dd>
71244
+ <dt>{{ 'pptx.digitalSignatures.certificate' | translate }}</dt>
71245
+ <dd>{{ 'pptx.digitalSignatures.notAvailable' | translate }}</dd>
71117
71246
  }
71118
71247
  </dl>
71119
71248
  </li>
@@ -71474,12 +71603,12 @@ class SlidesPanelComponent {
71474
71603
  <div
71475
71604
  class="pptx-ng-spanel-actions"
71476
71605
  role="toolbar"
71477
- [attr.aria-label]="'pptx.slidesPanel.slideActions' | translate: { n: i + 1 }"
71606
+ [attr.aria-label]="'pptx.slideMenu.slideActions' | translate: { n: i + 1 }"
71478
71607
  >
71479
71608
  <button
71480
71609
  type="button"
71481
71610
  class="pptx-ng-spanel-action"
71482
- [title]="'pptx.slidesPanel.duplicateSlide' | translate"
71611
+ [title]="'pptx.ribbon.duplicateSlide' | translate"
71483
71612
  [attr.aria-label]="'pptx.arrange.duplicate' | translate"
71484
71613
  (click)="onDuplicate(i)"
71485
71614
  >
@@ -71581,12 +71710,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71581
71710
  <div
71582
71711
  class="pptx-ng-spanel-actions"
71583
71712
  role="toolbar"
71584
- [attr.aria-label]="'pptx.slidesPanel.slideActions' | translate: { n: i + 1 }"
71713
+ [attr.aria-label]="'pptx.slideMenu.slideActions' | translate: { n: i + 1 }"
71585
71714
  >
71586
71715
  <button
71587
71716
  type="button"
71588
71717
  class="pptx-ng-spanel-action"
71589
- [title]="'pptx.slidesPanel.duplicateSlide' | translate"
71718
+ [title]="'pptx.ribbon.duplicateSlide' | translate"
71590
71719
  [attr.aria-label]="'pptx.arrange.duplicate' | translate"
71591
71720
  (click)="onDuplicate(i)"
71592
71721
  >
@@ -74119,7 +74248,7 @@ class FontEmbeddingListComponent {
74119
74248
  missingCount = input(0, /* @ts-ignore */
74120
74249
  ...(ngDevMode ? [{ debugName: "missingCount" }] : /* istanbul ignore next */ []));
74121
74250
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FontEmbeddingListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
74122
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FontEmbeddingListComponent, isStandalone: true, selector: "pptx-font-embedding-list", inputs: { usedFontFamilies: { classPropertyName: "usedFontFamilies", publicName: "usedFontFamilies", isSignal: true, isRequired: false, transformFunction: null }, availableFamilies: { classPropertyName: "availableFamilies", publicName: "availableFamilies", isSignal: true, isRequired: false, transformFunction: null }, embeddedSet: { classPropertyName: "embeddedSet", publicName: "embeddedSet", isSignal: true, isRequired: false, transformFunction: null }, scanning: { classPropertyName: "scanning", publicName: "scanning", isSignal: true, isRequired: false, transformFunction: null }, missingCount: { classPropertyName: "missingCount", publicName: "missingCount", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
74251
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FontEmbeddingListComponent, isStandalone: true, selector: "pptx-font-embedding-list", inputs: { usedFontFamilies: { classPropertyName: "usedFontFamilies", publicName: "usedFontFamilies", isSignal: true, isRequired: false, transformFunction: null }, availableFamilies: { classPropertyName: "availableFamilies", publicName: "availableFamilies", isSignal: true, isRequired: false, transformFunction: null }, embeddedSet: { classPropertyName: "embeddedSet", publicName: "embeddedSet", isSignal: true, isRequired: false, transformFunction: null }, scanning: { classPropertyName: "scanning", publicName: "scanning", isSignal: true, isRequired: false, transformFunction: null }, missingCount: { classPropertyName: "missingCount", publicName: "missingCount", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
74123
74252
  <div class="pptx-ng-fonts-section">
74124
74253
  <h3 class="pptx-ng-fonts-section-title">
74125
74254
  {{ 'pptx.fontEmbedding.usedFonts' | translate: { count: usedFontFamilies().length } }}
@@ -74168,7 +74297,7 @@ class FontEmbeddingListComponent {
74168
74297
  }
74169
74298
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FontEmbeddingListComponent, decorators: [{
74170
74299
  type: Component,
74171
- args: [{ selector: 'pptx-font-embedding-list', standalone: true, imports: [TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: `
74300
+ args: [{ selector: 'pptx-font-embedding-list', standalone: true, imports: [TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'contents' }, template: `
74172
74301
  <div class="pptx-ng-fonts-section">
74173
74302
  <h3 class="pptx-ng-fonts-section-title">
74174
74303
  {{ 'pptx.fontEmbedding.usedFonts' | translate: { count: usedFontFamilies().length } }}
@@ -76039,7 +76168,7 @@ class ViewerExtraDialogsComponent {
76039
76168
  this.svc.showPassword.set(false);
76040
76169
  }
76041
76170
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: ViewerExtraDialogsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
76042
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.5", type: ViewerExtraDialogsComponent, isStandalone: true, selector: "pptx-viewer-extra-dialogs", inputs: { activeSlideIndex: { classPropertyName: "activeSlideIndex", publicName: "activeSlideIndex", isSignal: true, isRequired: false, transformFunction: null }, selectedElementId: { classPropertyName: "selectedElementId", publicName: "selectedElementId", isSignal: true, isRequired: false, transformFunction: null }, filePath: { classPropertyName: "filePath", publicName: "filePath", isSignal: true, isRequired: false, transformFunction: null }, customShows: { classPropertyName: "customShows", publicName: "customShows", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { restoreContent: "restoreContent" }, ngImport: i0, template: `
76171
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.5", type: ViewerExtraDialogsComponent, isStandalone: true, selector: "pptx-viewer-extra-dialogs", inputs: { activeSlideIndex: { classPropertyName: "activeSlideIndex", publicName: "activeSlideIndex", isSignal: true, isRequired: false, transformFunction: null }, selectedElementId: { classPropertyName: "selectedElementId", publicName: "selectedElementId", isSignal: true, isRequired: false, transformFunction: null }, filePath: { classPropertyName: "filePath", publicName: "filePath", isSignal: true, isRequired: false, transformFunction: null }, customShows: { classPropertyName: "customShows", publicName: "customShows", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { restoreContent: "restoreContent" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
76043
76172
  <pptx-equation-editor-dialog
76044
76173
  [open]="svc.showEquation()"
76045
76174
  [existingOmml]="svc.editingEquationOmml()"
@@ -76120,6 +76249,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
76120
76249
  selector: 'pptx-viewer-extra-dialogs',
76121
76250
  standalone: true,
76122
76251
  changeDetection: ChangeDetectionStrategy.OnPush,
76252
+ host: { class: 'contents' },
76123
76253
  imports: [
76124
76254
  EquationEditorDialogComponent,
76125
76255
  SetUpSlideShowDialogComponent,
@@ -81222,6 +81352,260 @@ const translationsEn = {
81222
81352
  'pptx.animation.sequence.byParagraph': 'By Paragraph',
81223
81353
  'pptx.animation.sequence.byWord': 'By Word',
81224
81354
  'pptx.animation.sequence.byLetter': 'By Letter',
81355
+ // --- 2026-07-03 missing-key sweep: keys used by Vue/Angular with no
81356
+ // existing dictionary entry (React has 0 such gaps and is the ground-
81357
+ // truth reference these were derived from). Appended flat rather than
81358
+ // interleaved into their semantic sections above, to keep this batch
81359
+ // change safe/reviewable as one block.
81360
+ 'pptx.align.toolbarLabel': 'Align and distribute',
81361
+ 'pptx.arrange.deleteSelection': 'Delete selection',
81362
+ 'pptx.arrange.duplicateSelection': 'Duplicate selection',
81363
+ 'pptx.arrange.groupLabel': 'Arrange',
81364
+ 'pptx.canvas.adjustShape': 'Adjust shape',
81365
+ 'pptx.canvas.guideTooltip': 'Drag to move guide, double-click to remove',
81366
+ 'pptx.customShows.none': 'None',
81367
+ 'pptx.customShows.noSlidesYet': 'No slides in this show yet.',
81368
+ 'pptx.customShows.renameNameLabel': 'Show name',
81369
+ 'pptx.customShows.renameShow': 'Rename show',
81370
+ 'pptx.customShows.slidesInShow': 'Slides in show',
81371
+ 'pptx.design.editThemeTooltip': 'Edit presentation theme colors and fonts',
81372
+ 'pptx.design.formatBackgroundTooltip': 'Open inspector to edit slide background',
81373
+ 'pptx.design.slideSizeTooltip': 'Change slide dimensions (16:9, 4:3, custom)',
81374
+ 'pptx.documentProperties.summary.company': 'Company',
81375
+ 'pptx.documentProperties.summary.manager': 'Manager',
81376
+ 'pptx.editorToolbar.addShape': 'Add {{shape}}',
81377
+ 'pptx.editorToolbar.addTextBox': 'Add text box',
81378
+ 'pptx.editorToolbar.history': 'History',
81379
+ 'pptx.editorToolbar.resetZoom': 'Reset zoom',
81380
+ 'pptx.editorToolbar.resetZoomTo100': 'Reset zoom to 100%',
81381
+ 'pptx.effects.innerShadow': 'Inner Shadow',
81382
+ 'pptx.element.linkFallback': 'Link',
81383
+ 'pptx.export.export': 'Export',
81384
+ 'pptx.export.gifAnimated': 'Animated GIF',
81385
+ 'pptx.export.pdfAllSlides': 'PDF (all slides)',
81386
+ 'pptx.export.pngCurrentSlide': 'PNG (current slide)',
81387
+ 'pptx.export.webmVideo': 'WebM video',
81388
+ 'pptx.file.copyImage': 'Copy Image',
81389
+ 'pptx.file.copyImageTooltip': 'Copy Slide as Image',
81390
+ 'pptx.file.fonts': 'Fonts',
81391
+ 'pptx.file.gif': 'GIF',
81392
+ 'pptx.file.package': 'Package',
81393
+ 'pptx.file.packageTooltip': 'Package for Sharing',
81394
+ 'pptx.file.pdf': 'PDF',
81395
+ 'pptx.file.png': 'PNG',
81396
+ 'pptx.file.saveAsPpsx': 'Save .ppsx',
81397
+ 'pptx.file.saveAsPpsxTooltip': 'Save as Slide Show (.ppsx)',
81398
+ 'pptx.file.saveAsPptm': 'Save .pptm',
81399
+ 'pptx.file.saveAsPptmTooltip': 'Save as Macro-Enabled (.pptm)',
81400
+ 'pptx.file.saveAsPptx': 'Save .pptx',
81401
+ 'pptx.file.saveAsPptxTooltip': 'Save as Presentation (.pptx)',
81402
+ 'pptx.file.video': 'Video',
81403
+ 'pptx.fontEmbedding.embedInFile': 'Embed fonts in file',
81404
+ 'pptx.fontEmbedding.noCustomFonts': 'No custom fonts to embed.',
81405
+ 'pptx.guides.dragHint': 'Drag to move guide',
81406
+ 'pptx.handout.cornerDate': 'Date',
81407
+ 'pptx.handout.pageNumber': '#',
81408
+ 'pptx.headerFooter.fixedDate': 'Fixed date',
81409
+ 'pptx.headerFooter.headerText': 'Enter header text…',
81410
+ 'pptx.headerFooter.updateAutomatically': 'Update automatically',
81411
+ 'pptx.home.chooseLayout': 'Choose layout',
81412
+ 'pptx.home.newSlide': 'New Slide',
81413
+ 'pptx.hyperlink.linkTo': 'Link to',
81414
+ 'pptx.hyperlink.urlPlaceholder': 'https://example.com',
81415
+ 'pptx.insert.addShape': 'Add shape',
81416
+ 'pptx.insert.addTextBox': 'Add text box',
81417
+ 'pptx.insert.insertEquation': 'Insert Equation',
81418
+ 'pptx.insert.insertSmartArt': 'Insert SmartArt',
81419
+ 'pptx.insert.insertTable': 'Insert table',
81420
+ 'pptx.insert.shape': 'Shape',
81421
+ 'pptx.insert.shapeType': 'Shape type',
81422
+ 'pptx.mode.closeMasterViewTooltip': 'Close master view',
81423
+ 'pptx.mode.masterView': 'Master View',
81424
+ 'pptx.overflow.closeMenu': 'Close menu',
81425
+ 'pptx.present.optionsTooltip': 'Presentation options',
81426
+ 'pptx.present.presentOnline': 'Present Online',
81427
+ 'pptx.present.presentTooltip': 'Present (fullscreen)',
81428
+ 'pptx.review.spelling': 'Spelling',
81429
+ 'pptx.review.toggleComments': 'Toggle comments panel',
81430
+ 'pptx.review.toggleSpellCheck': 'Toggle spell check',
81431
+ 'pptx.shortcuts.title': 'Keyboard shortcuts',
81432
+ 'pptx.slideInspector.horizontal': 'Horizontal',
81433
+ 'pptx.slideInspector.presentation': 'Presentation',
81434
+ 'pptx.slideInspector.slideTransition': 'Slide transition',
81435
+ 'pptx.slideInspector.themeColours': 'Theme colours',
81436
+ 'pptx.slideInspector.vertical': 'Vertical',
81437
+ 'pptx.slidesPanel.deleteSlide': 'Delete slide',
81438
+ 'pptx.slidesPanel.goToSlide': 'Go to slide {{n}}',
81439
+ 'pptx.smartart.demote': 'Demote',
81440
+ 'pptx.smartart.item': 'Item',
81441
+ 'pptx.smartart.nodeCleared': 'Node cleared',
81442
+ 'pptx.smartart.nodeFill': 'Node fill',
81443
+ 'pptx.smartart.nodeFont': 'Node font',
81444
+ 'pptx.smartart.nodeUpdated': 'Node updated to "{{text}}"',
81445
+ 'pptx.smartart.promote': 'Promote',
81446
+ 'pptx.smartart.subItemShort': 'Sub-item',
81447
+ 'pptx.stroke.dash': 'Dash',
81448
+ 'pptx.stroke.noBorderProperties': 'This element has no border properties.',
81449
+ 'pptx.stroke.widthPx': 'Width (px)',
81450
+ 'pptx.table.columns': 'Columns',
81451
+ 'pptx.table.columnsCount': '{{count}} columns',
81452
+ 'pptx.table.deleteColumn': 'Delete column',
81453
+ 'pptx.table.deleteRow': 'Delete row',
81454
+ 'pptx.table.insertAbove': 'Insert above',
81455
+ 'pptx.table.insertBelow': 'Insert below',
81456
+ 'pptx.table.insertLeft': 'Insert left',
81457
+ 'pptx.table.insertRight': 'Insert right',
81458
+ 'pptx.table.mergeSelected': 'Merge selected',
81459
+ 'pptx.table.noEditableData': 'This table has no editable data.',
81460
+ 'pptx.table.rows': 'Rows',
81461
+ 'pptx.table.rowsCount': '{{count}} rows',
81462
+ 'pptx.table.selectTablePrompt': 'Select a table to edit its properties.',
81463
+ 'pptx.tableCell.backgroundColorAria': 'Background colour',
81464
+ 'pptx.tableCell.edgeBorderColorAria': '{{edge}} border colour',
81465
+ 'pptx.tableCell.textColorAria': 'Text colour',
81466
+ 'pptx.text.bulletList': 'Bullet List',
81467
+ 'pptx.text.clearFormatting': 'Clear Formatting',
81468
+ 'pptx.text.decreaseFontSize': 'Decrease Font Size',
81469
+ 'pptx.text.decreaseIndent': 'Decrease Indent',
81470
+ 'pptx.text.fontColor': 'Font Color',
81471
+ 'pptx.text.highlightColor': 'Text Highlight Color',
81472
+ 'pptx.text.increaseFontSize': 'Increase Font Size',
81473
+ 'pptx.text.increaseIndent': 'Increase Indent',
81474
+ 'pptx.text.numberedList': 'Numbered List',
81475
+ 'pptx.view.addHorizontalGuide': 'Add horizontal guide',
81476
+ 'pptx.view.addVerticalGuide': 'Add vertical guide',
81477
+ 'pptx.view.eyedropperTooltip': 'Eyedropper: sample a colour from the slide',
81478
+ 'pptx.view.hGuide': 'H Guide',
81479
+ 'pptx.view.masterViews': 'Master Views',
81480
+ 'pptx.view.normal': 'Normal',
81481
+ 'pptx.view.presentationViews': 'Presentation Views',
81482
+ 'pptx.view.readingView': 'Reading View',
81483
+ 'pptx.view.selection': 'Selection',
81484
+ 'pptx.view.slideMasterTooltip': 'Edit slide masters and layouts',
81485
+ 'pptx.view.slideSorterTooltip': 'Slide Sorter view',
81486
+ 'pptx.view.spell': 'Spell',
81487
+ 'pptx.view.templateEditingTooltip': 'Toggle template/master element editing',
81488
+ 'pptx.view.toggleSpellCheck': 'Toggle spell check',
81489
+ 'pptx.view.vGuide': 'V Guide',
81490
+ 'pptx.view.zoomToFit': 'Zoom to Fit',
81491
+ 'pptx.view.zoomToFitTooltip': 'Zoom to fit slide in window',
81492
+ // --- 2026-07-03 missing-key sweep, wave 2: keys referenced indirectly
81493
+ // (via a variable/array 'labelKey', not a literal t('...') call - e.g.
81494
+ // shape-preset lists, equation templates, artistic-effect catalogues,
81495
+ // table style-option checkboxes) that the first wave's literal-call
81496
+ // grep could not see. Same appended-flat approach as wave 1.
81497
+ 'pptx.accessibility.severityErrors': 'Errors',
81498
+ 'pptx.accessibility.severityTips': 'Tips',
81499
+ 'pptx.accessibility.severityWarnings': 'Warnings',
81500
+ 'pptx.accessibility.typeBlankSlide': 'Blank slide',
81501
+ 'pptx.accessibility.typeComplexTable': 'Complex table',
81502
+ 'pptx.accessibility.typeDuplicateTitle': 'Duplicate slide title',
81503
+ 'pptx.accessibility.typeLowContrast': 'Low contrast',
81504
+ 'pptx.accessibility.typeMissingAltText': 'Missing alt text',
81505
+ 'pptx.accessibility.typeMissingSlideTitle': 'Missing slide title',
81506
+ 'pptx.align.bottom': 'Align bottom',
81507
+ 'pptx.align.centerH': 'Align center',
81508
+ 'pptx.align.left': 'Align left',
81509
+ 'pptx.align.middle': 'Align middle',
81510
+ 'pptx.align.right': 'Align right',
81511
+ 'pptx.align.top': 'Align top',
81512
+ 'pptx.documentProperties.custom.typeDate': 'Date',
81513
+ 'pptx.documentProperties.custom.typeNumber': 'Number',
81514
+ 'pptx.documentProperties.custom.typeText': 'Text',
81515
+ 'pptx.documentProperties.custom.typeYesNo': 'Yes or No',
81516
+ 'pptx.documentProperties.statistics.elements': 'Elements',
81517
+ 'pptx.documentProperties.statistics.hiddenSlides': 'Hidden Slides',
81518
+ 'pptx.documentProperties.statistics.lastModifiedBy': 'Last Modified By',
81519
+ 'pptx.documentProperties.statistics.notes': 'Notes',
81520
+ 'pptx.documentProperties.statistics.paragraphs': 'Paragraphs',
81521
+ 'pptx.documentProperties.statistics.revision': 'Revision',
81522
+ 'pptx.documentProperties.statistics.slides': 'Slides',
81523
+ 'pptx.documentProperties.statistics.words': 'Words',
81524
+ 'pptx.documentProperties.summary.category': 'Category',
81525
+ 'pptx.documentProperties.summary.description': 'Description',
81526
+ 'pptx.documentProperties.tabs.custom': 'Custom',
81527
+ 'pptx.documentProperties.tabs.general': 'General',
81528
+ 'pptx.documentProperties.tabs.statistics': 'Statistics',
81529
+ 'pptx.editorToolbar.shapeEllipse': 'Ellipse',
81530
+ 'pptx.editorToolbar.shapeRectangle': 'Rectangle',
81531
+ 'pptx.editorToolbar.shapeRoundedRectangle': 'Rounded rectangle',
81532
+ 'pptx.editorToolbar.shapeTriangle': 'Triangle',
81533
+ 'pptx.equation.template.binomial': 'Binomial',
81534
+ 'pptx.equation.template.derivative': 'Derivative',
81535
+ 'pptx.equation.template.euler': "Euler's",
81536
+ 'pptx.equation.template.fraction': 'Fraction',
81537
+ 'pptx.equation.template.integral': 'Integral',
81538
+ 'pptx.equation.template.limit': 'Limit',
81539
+ 'pptx.equation.template.matrix': 'Matrix 2x2',
81540
+ 'pptx.equation.template.pythagorean': 'Pythagorean',
81541
+ 'pptx.equation.template.quadratic': 'Quadratic',
81542
+ 'pptx.equation.template.squareRoot': 'Square Root',
81543
+ 'pptx.equation.template.sum': 'Sum',
81544
+ 'pptx.equation.template.trigIdentity': 'Trig Identity',
81545
+ 'pptx.hyperlink.actionNone': 'None',
81546
+ 'pptx.hyperlink.actionSlide': 'Slide',
81547
+ 'pptx.hyperlink.actionUrl': 'URL',
81548
+ 'pptx.image.duotonePresetBlackWhite': 'Black, White',
81549
+ 'pptx.image.duotonePresetBlueOrange': 'Blue, Orange',
81550
+ 'pptx.image.duotonePresetGreenYellow': 'Green, Yellow',
81551
+ 'pptx.image.duotonePresetNavyGold': 'Navy, Gold',
81552
+ 'pptx.image.duotonePresetPurplePink': 'Purple, Pink',
81553
+ 'pptx.image.duotonePresetRedCream': 'Red, Cream',
81554
+ 'pptx.image.duotonePresetSepiaWarm': 'Sepia, Warm',
81555
+ 'pptx.image.duotonePresetTealWhite': 'Teal, White',
81556
+ 'pptx.image.effectBlur': 'Blur',
81557
+ 'pptx.image.effectCement': 'Cement',
81558
+ 'pptx.image.effectChalk': 'Chalk Sketch',
81559
+ 'pptx.image.effectCrisscross': 'Crisscross Etching',
81560
+ 'pptx.image.effectCutout': 'Cutout',
81561
+ 'pptx.image.effectFilmGrain': 'Film Grain',
81562
+ 'pptx.image.effectGlowDiffused': 'Glow Diffused',
81563
+ 'pptx.image.effectGlowEdges': 'Glow Edges',
81564
+ 'pptx.image.effectGrayscale': 'Grayscale',
81565
+ 'pptx.image.effectLightScreen': 'Light Screen',
81566
+ 'pptx.image.effectLineDrawing': 'Line Drawing',
81567
+ 'pptx.image.effectMarker': 'Marker',
81568
+ 'pptx.image.effectMosaic': 'Mosaic Bubbles',
81569
+ 'pptx.image.effectNone': 'None',
81570
+ 'pptx.image.effectPaint': 'Paint Brush',
81571
+ 'pptx.image.effectPaintStrokes': 'Paint Strokes',
81572
+ 'pptx.image.effectPastels': 'Pastels Smooth',
81573
+ 'pptx.image.effectPencilSketch': 'Pencil Sketch',
81574
+ 'pptx.image.effectPhotocopy': 'Photocopy',
81575
+ 'pptx.image.effectPlasticWrap': 'Plastic Wrap',
81576
+ 'pptx.image.effectSepia': 'Sepia',
81577
+ 'pptx.image.effectSharpen': 'Sharpen',
81578
+ 'pptx.image.effectTexturizer': 'Texturizer',
81579
+ 'pptx.image.effectWatercolor': 'Watercolor Sponge',
81580
+ 'pptx.share.copyLinkButton': 'Copy Link',
81581
+ 'pptx.stroke.dashDash': 'Dash',
81582
+ 'pptx.stroke.dashDashDot': 'Dash Dot',
81583
+ 'pptx.stroke.dashDot': 'Dot',
81584
+ 'pptx.stroke.dashSolid': 'Solid',
81585
+ 'pptx.stroke.dashSysDash': 'System Dash',
81586
+ 'pptx.stroke.dashSysDot': 'System Dot',
81587
+ 'pptx.table.bandedColumns': 'Banded Columns',
81588
+ 'pptx.table.bandedRows': 'Banded Rows',
81589
+ 'pptx.table.borderBottom': 'Bottom',
81590
+ 'pptx.table.borderDiagDown': 'Diagonal Down',
81591
+ 'pptx.table.borderDiagUp': 'Diagonal Up',
81592
+ 'pptx.table.borderLeft': 'Left',
81593
+ 'pptx.table.borderRight': 'Right',
81594
+ 'pptx.table.borderTop': 'Top',
81595
+ 'pptx.table.fillGradient': 'Gradient',
81596
+ 'pptx.table.fillNone': 'None',
81597
+ 'pptx.table.fillPattern': 'Pattern',
81598
+ 'pptx.table.fillSolid': 'Solid',
81599
+ 'pptx.table.firstColumn': 'First Column',
81600
+ 'pptx.table.gradientLinear': 'Linear',
81601
+ 'pptx.table.gradientRadial': 'Radial',
81602
+ 'pptx.table.headerRow': 'Header Row',
81603
+ 'pptx.table.lastColumn': 'Last Column',
81604
+ 'pptx.table.lastRow': 'Last Row',
81605
+ 'pptx.table.marginBottom': 'Bottom',
81606
+ 'pptx.table.marginLeft': 'Left',
81607
+ 'pptx.table.marginRight': 'Right',
81608
+ 'pptx.table.marginTop': 'Top',
81225
81609
  };
81226
81610
  /**
81227
81611
  * Convert a dotted translation key to a human-readable label when no