pptx-angular-viewer 1.1.60 → 1.1.62

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.
@@ -4946,15 +4946,15 @@ function convertOmmlToLatex(omml) {
4946
4946
  }
4947
4947
 
4948
4948
  /**
4949
- * Framework-agnostic chart helpers a focused Vue port of the React package's
4949
+ * Framework-agnostic chart helpers, a focused Vue port of the React package's
4950
4950
  * `viewer/utils/chart-helpers.ts`, `chart-layout.ts`, and
4951
4951
  * `chart-style-palettes.ts`.
4952
4952
  *
4953
- * Only the pieces the common-type renderers (bar / column / stacked / line /
4954
- * area / pie / doughnut) and the shared chrome need are ported here. Advanced
4955
- * features (log axes, secondary axes, display units, data tables, overlays)
4956
- * are intentionally omitted see the `// TODO(vue):` markers in
4957
- * `ChartRenderer.vue`.
4953
+ * This module only covers the common-type renderers (bar / column / stacked /
4954
+ * line / area / pie / doughnut) and the shared chrome. Advanced axis/overlay
4955
+ * features (log axes, secondary axes, display units, trendlines, error bars,
4956
+ * data tables) live in `chart-axis.ts` / `chart-axis-render.ts` /
4957
+ * `chart-cartesian.ts` and are consumed via `chart/ChartViewModelSvg.vue`.
4958
4958
  *
4959
4959
  * These small pure helpers are an extraction candidate: long-term they (and
4960
4960
  * their React counterparts) should live in a shared, framework-agnostic
@@ -22992,6 +22992,164 @@ function observeYDocSlides(ydoc, onChange) {
22992
22992
  return () => arr.unobserveDeep(onChange);
22993
22993
  }
22994
22994
 
22995
+ /**
22996
+ * collaboration-text-merge.ts: character-level in-place merging of a desired
22997
+ * text state into a live Y.Text.
22998
+ *
22999
+ * `reconcileTextBody` used to replace the whole Y.Text whenever the canonical
23000
+ * decoded form differed, which made concurrent edits to the SAME text element
23001
+ * collide at element granularity (last writer wins). This module instead
23002
+ * applies a minimal edit script to the existing Y.Text:
23003
+ *
23004
+ * - plain-text diff via common prefix/suffix (surrogate-pair safe): one
23005
+ * delete + attributed inserts for the changed middle span
23006
+ * - attribute reconcile: walk the current and desired attribute runs by
23007
+ * position and `format()` only the ranges whose attributes differ
23008
+ *
23009
+ * Because each peer submits a minimal delta, Yjs merges concurrent edits to
23010
+ * the same run at character granularity (e.g. one peer prepends while another
23011
+ * appends, both survive).
23012
+ */
23013
+ function isYTextEditable(value) {
23014
+ return (isYTextLike(value) &&
23015
+ typeof value.delete === 'function' &&
23016
+ typeof value.format === 'function');
23017
+ }
23018
+ const isHighSurrogate = (code) => code >= 0xd800 && code <= 0xdbff;
23019
+ const isLowSurrogate = (code) => code >= 0xdc00 && code <= 0xdfff;
23020
+ function opsText(ops) {
23021
+ let text = '';
23022
+ for (const op of ops) {
23023
+ if (typeof op.insert === 'string') {
23024
+ text += op.insert;
23025
+ }
23026
+ }
23027
+ return text;
23028
+ }
23029
+ function commonPrefixLength(a, b) {
23030
+ const max = Math.min(a.length, b.length);
23031
+ let i = 0;
23032
+ while (i < max && a.charCodeAt(i) === b.charCodeAt(i)) {
23033
+ i++;
23034
+ }
23035
+ // Never cut between a surrogate pair.
23036
+ if (i > 0 && isHighSurrogate(a.charCodeAt(i - 1))) {
23037
+ i--;
23038
+ }
23039
+ return i;
23040
+ }
23041
+ function commonSuffixLength(a, b, prefix) {
23042
+ const max = Math.min(a.length, b.length) - prefix;
23043
+ let i = 0;
23044
+ while (i < max && a.charCodeAt(a.length - i - 1) === b.charCodeAt(b.length - i - 1)) {
23045
+ i++;
23046
+ }
23047
+ if (i > 0 && isLowSurrogate(a.charCodeAt(a.length - i))) {
23048
+ i--;
23049
+ }
23050
+ return i;
23051
+ }
23052
+ /**
23053
+ * Insert the desired-text span [from, to) into `ytext`, carrying each desired
23054
+ * op's attributes so no character inherits formatting from its neighbour.
23055
+ */
23056
+ function insertSpanWithAttrs(ytext, desiredOps, from, to) {
23057
+ let opStart = 0;
23058
+ let index = from;
23059
+ for (const op of desiredOps) {
23060
+ if (typeof op.insert !== 'string') {
23061
+ continue;
23062
+ }
23063
+ const opEnd = opStart + op.insert.length;
23064
+ const start = Math.max(opStart, from);
23065
+ const end = Math.min(opEnd, to);
23066
+ if (start < end) {
23067
+ const chunk = op.insert.slice(start - opStart, end - opStart);
23068
+ // Explicit attrs always: attribute-less inserts inherit the previous
23069
+ // character's formatting in Yjs (the style-bleed bug).
23070
+ ytext.insert(index, chunk, (op.attributes ?? {}));
23071
+ index += chunk.length;
23072
+ }
23073
+ opStart = opEnd;
23074
+ }
23075
+ }
23076
+ function attrsEqual(a, b) {
23077
+ const aKeys = Object.keys(a);
23078
+ if (aKeys.length !== Object.keys(b).length) {
23079
+ return false;
23080
+ }
23081
+ return aKeys.every((k) => a[k] === b[k]);
23082
+ }
23083
+ /**
23084
+ * Bring the attribute runs of `ytext` (whose plain text already matches the
23085
+ * desired ops) in line with the desired attributes, formatting only the
23086
+ * ranges that differ.
23087
+ */
23088
+ function reconcileAttributeRuns(ytext, desiredOps) {
23089
+ const currentOps = ytext.toDelta().filter((op) => typeof op.insert === 'string');
23090
+ let ci = 0;
23091
+ let cOff = 0;
23092
+ let pos = 0;
23093
+ for (const dop of desiredOps) {
23094
+ if (typeof dop.insert !== 'string') {
23095
+ continue;
23096
+ }
23097
+ const dAttrs = (dop.attributes ?? {});
23098
+ let remaining = dop.insert.length;
23099
+ while (remaining > 0 && ci < currentOps.length) {
23100
+ const cText = currentOps[ci].insert;
23101
+ const len = Math.min(cText.length - cOff, remaining);
23102
+ const cAttrs = (currentOps[ci].attributes ?? {});
23103
+ if (!attrsEqual(cAttrs, dAttrs)) {
23104
+ const patch = {};
23105
+ for (const key of Object.keys(dAttrs)) {
23106
+ if (cAttrs[key] !== dAttrs[key]) {
23107
+ patch[key] = dAttrs[key];
23108
+ }
23109
+ }
23110
+ for (const key of Object.keys(cAttrs)) {
23111
+ if (!(key in dAttrs)) {
23112
+ patch[key] = null;
23113
+ }
23114
+ }
23115
+ ytext.format(pos, len, patch);
23116
+ }
23117
+ pos += len;
23118
+ remaining -= len;
23119
+ cOff += len;
23120
+ if (cOff >= cText.length) {
23121
+ ci++;
23122
+ cOff = 0;
23123
+ }
23124
+ }
23125
+ }
23126
+ }
23127
+ /**
23128
+ * Apply the minimal edit script that turns the live `ytext` into the state
23129
+ * described by `desiredOps`. Returns false (leaving the caller to fall back
23130
+ * to wholesale replacement) if the text diff did not converge.
23131
+ *
23132
+ * Must be called inside a Y.Doc transaction when the text is integrated.
23133
+ */
23134
+ function mergeDeltaIntoYText(ytext, desiredOps) {
23135
+ const currentText = opsText(ytext.toDelta());
23136
+ const desiredText = opsText(desiredOps);
23137
+ if (currentText !== desiredText) {
23138
+ const prefix = commonPrefixLength(currentText, desiredText);
23139
+ const suffix = commonSuffixLength(currentText, desiredText, prefix);
23140
+ const deleteLen = currentText.length - prefix - suffix;
23141
+ if (deleteLen > 0) {
23142
+ ytext.delete(prefix, deleteLen);
23143
+ }
23144
+ insertSpanWithAttrs(ytext, desiredOps, prefix, desiredText.length - suffix);
23145
+ if (opsText(ytext.toDelta()) !== desiredText) {
23146
+ return false;
23147
+ }
23148
+ }
23149
+ reconcileAttributeRuns(ytext, desiredOps);
23150
+ return true;
23151
+ }
23152
+
22995
23153
  /**
22996
23154
  * collaboration-reconcile.ts: Granular Y.Doc reconciliation for collaborative
22997
23155
  * editing.
@@ -23004,7 +23162,9 @@ function observeYDocSlides(ydoc, onChange) {
23004
23162
  * - slides and elements are matched by `id`; unchanged ones keep their Y.Map
23005
23163
  * instance so concurrent field edits merge via Yjs
23006
23164
  * - scalar / complex fields are compared and only set when different
23007
- * - textBody is only replaced when its canonical decoded form differs
23165
+ * - textBody is edited in place (minimal char-level diff via
23166
+ * collaboration-text-merge.ts) when its canonical decoded form differs;
23167
+ * wholesale replacement is only a fallback
23008
23168
  * - removed items are deleted, new ones inserted at their position; moves
23009
23169
  * are delete+reinsert (Yjs has no move primitive)
23010
23170
  *
@@ -23053,11 +23213,17 @@ function reconcileTextBody(ymap, rec, factories) {
23053
23213
  }
23054
23214
  return;
23055
23215
  }
23056
- const desired = decodeDelta(encodeSegmentsToDelta(segments));
23216
+ const desiredDelta = encodeSegmentsToDelta(segments);
23217
+ const desired = decodeDelta(desiredDelta);
23057
23218
  const existing = isYTextLike(current) ? decodeDelta(current.toDelta()) : undefined;
23058
23219
  if (existing !== undefined && jsonEqual(existing, desired)) {
23059
23220
  return;
23060
23221
  }
23222
+ // Prefer an in-place minimal edit so concurrent edits to the same text
23223
+ // element merge at character granularity instead of element-level LWW.
23224
+ if (isYTextEditable(current) && mergeDeltaIntoYText(current, desiredDelta)) {
23225
+ return;
23226
+ }
23061
23227
  const ytext = factories.createText();
23062
23228
  encodeTextBody(segments, ytext);
23063
23229
  ymap.set('textBody', ytext);
@@ -45389,7 +45555,7 @@ class EffectsPanelComponent {
45389
45555
  (change)="onOuterShadowField('color', $event)"
45390
45556
  />
45391
45557
  <label class="pptx-ng-fx__label" for="fx-os-opacity">{{
45392
- 'pptx.effects.opacity' | translate
45558
+ 'pptx.inspector.opacity' | translate
45393
45559
  }}</label>
45394
45560
  <input
45395
45561
  id="fx-os-opacity"
@@ -45472,7 +45638,7 @@ class EffectsPanelComponent {
45472
45638
  (change)="onInnerShadowField('color', $event)"
45473
45639
  />
45474
45640
  <label class="pptx-ng-fx__label" for="fx-is-opacity">{{
45475
- 'pptx.effects.opacity' | translate
45641
+ 'pptx.inspector.opacity' | translate
45476
45642
  }}</label>
45477
45643
  <input
45478
45644
  id="fx-is-opacity"
@@ -45565,7 +45731,7 @@ class EffectsPanelComponent {
45565
45731
  (change)="onGlowField('radius', $event)"
45566
45732
  />
45567
45733
  <label class="pptx-ng-fx__label" for="fx-glow-opacity">{{
45568
- 'pptx.effects.opacity' | translate
45734
+ 'pptx.inspector.opacity' | translate
45569
45735
  }}</label>
45570
45736
  <input
45571
45737
  id="fx-glow-opacity"
@@ -45727,7 +45893,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
45727
45893
  (change)="onOuterShadowField('color', $event)"
45728
45894
  />
45729
45895
  <label class="pptx-ng-fx__label" for="fx-os-opacity">{{
45730
- 'pptx.effects.opacity' | translate
45896
+ 'pptx.inspector.opacity' | translate
45731
45897
  }}</label>
45732
45898
  <input
45733
45899
  id="fx-os-opacity"
@@ -45810,7 +45976,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
45810
45976
  (change)="onInnerShadowField('color', $event)"
45811
45977
  />
45812
45978
  <label class="pptx-ng-fx__label" for="fx-is-opacity">{{
45813
- 'pptx.effects.opacity' | translate
45979
+ 'pptx.inspector.opacity' | translate
45814
45980
  }}</label>
45815
45981
  <input
45816
45982
  id="fx-is-opacity"
@@ -45903,7 +46069,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
45903
46069
  (change)="onGlowField('radius', $event)"
45904
46070
  />
45905
46071
  <label class="pptx-ng-fx__label" for="fx-glow-opacity">{{
45906
- 'pptx.effects.opacity' | translate
46072
+ 'pptx.inspector.opacity' | translate
45907
46073
  }}</label>
45908
46074
  <input
45909
46075
  id="fx-glow-opacity"
@@ -46790,7 +46956,7 @@ class SmartArtPropertiesComponent {
46790
46956
 
46791
46957
  <!-- ── Layout switcher ──────────────────────────────────────────── -->
46792
46958
  <div class="pptx-sa-props__field">
46793
- <span class="pptx-sa-props__label">{{ 'pptx.smartart.layout' | translate }}</span>
46959
+ <span class="pptx-sa-props__label">{{ 'pptx.master.layout' | translate }}</span>
46794
46960
  <div
46795
46961
  class="pptx-sa-props__layouts"
46796
46962
  role="group"
@@ -46882,7 +47048,7 @@ class SmartArtPropertiesComponent {
46882
47048
  class="pptx-sa-props__node-input"
46883
47049
  [disabled]="!canEdit()"
46884
47050
  [value]="node.text"
46885
- [attr.placeholder]="'pptx.smartart.typeHere' | translate"
47051
+ [attr.placeholder]="'pptx.smartArt.nodePlaceholder' | translate"
46886
47052
  (change)="onNodeText($event, node.id)"
46887
47053
  (keydown)="onNodeKeydown($event, node.id)"
46888
47054
  />
@@ -46891,7 +47057,7 @@ class SmartArtPropertiesComponent {
46891
47057
  <button
46892
47058
  type="button"
46893
47059
  class="pptx-sa-props__icon"
46894
- [title]="'pptx.smartart.addSubItem' | translate"
47060
+ [title]="'pptx.smartArt.addSubItem' | translate"
46895
47061
  [disabled]="!canEdit()"
46896
47062
  (click)="onAddSubItem(node.id)"
46897
47063
  >
@@ -46919,7 +47085,7 @@ class SmartArtPropertiesComponent {
46919
47085
  <button
46920
47086
  type="button"
46921
47087
  class="pptx-sa-props__icon"
46922
- [title]="'pptx.smartart.moveUp' | translate"
47088
+ [title]="'pptx.smartArt.moveUp' | translate"
46923
47089
  [disabled]="!canEdit()"
46924
47090
  (click)="onMoveUp(node.id)"
46925
47091
  >
@@ -46928,7 +47094,7 @@ class SmartArtPropertiesComponent {
46928
47094
  <button
46929
47095
  type="button"
46930
47096
  class="pptx-sa-props__icon"
46931
- [title]="'pptx.smartart.moveDown' | translate"
47097
+ [title]="'pptx.smartArt.moveDown' | translate"
46932
47098
  [disabled]="!canEdit()"
46933
47099
  (click)="onMoveDown(node.id)"
46934
47100
  >
@@ -46940,7 +47106,7 @@ class SmartArtPropertiesComponent {
46940
47106
  [title]="
46941
47107
  !isChild(node) && !canRemoveItem()
46942
47108
  ? boundsHint()
46943
- : ('pptx.smartart.remove' | translate)
47109
+ : ('pptx.smartArt.remove' | translate)
46944
47110
  "
46945
47111
  [disabled]="
46946
47112
  !canEdit() || nodes().length <= 1 || (!isChild(node) && !canRemoveItem())
@@ -46955,7 +47121,7 @@ class SmartArtPropertiesComponent {
46955
47121
  <div class="pptx-sa-props__node-style">
46956
47122
  <label class="pptx-sa-props__swatch" [title]="'pptx.smartart.nodeFill' | translate">
46957
47123
  <span class="pptx-sa-props__swatch-label">{{
46958
- 'pptx.smartart.fill' | translate
47124
+ 'pptx.smartArt.fill' | translate
46959
47125
  }}</span>
46960
47126
  <input
46961
47127
  type="color"
@@ -46967,7 +47133,7 @@ class SmartArtPropertiesComponent {
46967
47133
  </label>
46968
47134
  <label class="pptx-sa-props__swatch" [title]="'pptx.smartart.nodeFont' | translate">
46969
47135
  <span class="pptx-sa-props__swatch-label">{{
46970
- 'pptx.smartart.font' | translate
47136
+ 'pptx.textPanel.font' | translate
46971
47137
  }}</span>
46972
47138
  <input
46973
47139
  type="color"
@@ -46980,7 +47146,7 @@ class SmartArtPropertiesComponent {
46980
47146
  <button
46981
47147
  type="button"
46982
47148
  class="pptx-sa-props__icon pptx-sa-props__style-toggle"
46983
- [title]="'pptx.smartart.bold' | translate"
47149
+ [title]="'pptx.inspector.bold' | translate"
46984
47150
  [class.is-active]="nodeIsBold(node)"
46985
47151
  [attr.aria-pressed]="nodeIsBold(node)"
46986
47152
  [disabled]="!canEdit()"
@@ -46991,7 +47157,7 @@ class SmartArtPropertiesComponent {
46991
47157
  <button
46992
47158
  type="button"
46993
47159
  class="pptx-sa-props__icon pptx-sa-props__style-toggle"
46994
- [title]="'pptx.smartart.italic' | translate"
47160
+ [title]="'pptx.inspector.italic' | translate"
46995
47161
  [class.is-active]="nodeIsItalic(node)"
46996
47162
  [attr.aria-pressed]="nodeIsItalic(node)"
46997
47163
  [disabled]="!canEdit()"
@@ -47016,7 +47182,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47016
47182
 
47017
47183
  <!-- ── Layout switcher ──────────────────────────────────────────── -->
47018
47184
  <div class="pptx-sa-props__field">
47019
- <span class="pptx-sa-props__label">{{ 'pptx.smartart.layout' | translate }}</span>
47185
+ <span class="pptx-sa-props__label">{{ 'pptx.master.layout' | translate }}</span>
47020
47186
  <div
47021
47187
  class="pptx-sa-props__layouts"
47022
47188
  role="group"
@@ -47108,7 +47274,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47108
47274
  class="pptx-sa-props__node-input"
47109
47275
  [disabled]="!canEdit()"
47110
47276
  [value]="node.text"
47111
- [attr.placeholder]="'pptx.smartart.typeHere' | translate"
47277
+ [attr.placeholder]="'pptx.smartArt.nodePlaceholder' | translate"
47112
47278
  (change)="onNodeText($event, node.id)"
47113
47279
  (keydown)="onNodeKeydown($event, node.id)"
47114
47280
  />
@@ -47117,7 +47283,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47117
47283
  <button
47118
47284
  type="button"
47119
47285
  class="pptx-sa-props__icon"
47120
- [title]="'pptx.smartart.addSubItem' | translate"
47286
+ [title]="'pptx.smartArt.addSubItem' | translate"
47121
47287
  [disabled]="!canEdit()"
47122
47288
  (click)="onAddSubItem(node.id)"
47123
47289
  >
@@ -47145,7 +47311,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47145
47311
  <button
47146
47312
  type="button"
47147
47313
  class="pptx-sa-props__icon"
47148
- [title]="'pptx.smartart.moveUp' | translate"
47314
+ [title]="'pptx.smartArt.moveUp' | translate"
47149
47315
  [disabled]="!canEdit()"
47150
47316
  (click)="onMoveUp(node.id)"
47151
47317
  >
@@ -47154,7 +47320,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47154
47320
  <button
47155
47321
  type="button"
47156
47322
  class="pptx-sa-props__icon"
47157
- [title]="'pptx.smartart.moveDown' | translate"
47323
+ [title]="'pptx.smartArt.moveDown' | translate"
47158
47324
  [disabled]="!canEdit()"
47159
47325
  (click)="onMoveDown(node.id)"
47160
47326
  >
@@ -47166,7 +47332,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47166
47332
  [title]="
47167
47333
  !isChild(node) && !canRemoveItem()
47168
47334
  ? boundsHint()
47169
- : ('pptx.smartart.remove' | translate)
47335
+ : ('pptx.smartArt.remove' | translate)
47170
47336
  "
47171
47337
  [disabled]="
47172
47338
  !canEdit() || nodes().length <= 1 || (!isChild(node) && !canRemoveItem())
@@ -47181,7 +47347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47181
47347
  <div class="pptx-sa-props__node-style">
47182
47348
  <label class="pptx-sa-props__swatch" [title]="'pptx.smartart.nodeFill' | translate">
47183
47349
  <span class="pptx-sa-props__swatch-label">{{
47184
- 'pptx.smartart.fill' | translate
47350
+ 'pptx.smartArt.fill' | translate
47185
47351
  }}</span>
47186
47352
  <input
47187
47353
  type="color"
@@ -47193,7 +47359,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47193
47359
  </label>
47194
47360
  <label class="pptx-sa-props__swatch" [title]="'pptx.smartart.nodeFont' | translate">
47195
47361
  <span class="pptx-sa-props__swatch-label">{{
47196
- 'pptx.smartart.font' | translate
47362
+ 'pptx.textPanel.font' | translate
47197
47363
  }}</span>
47198
47364
  <input
47199
47365
  type="color"
@@ -47206,7 +47372,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47206
47372
  <button
47207
47373
  type="button"
47208
47374
  class="pptx-sa-props__icon pptx-sa-props__style-toggle"
47209
- [title]="'pptx.smartart.bold' | translate"
47375
+ [title]="'pptx.inspector.bold' | translate"
47210
47376
  [class.is-active]="nodeIsBold(node)"
47211
47377
  [attr.aria-pressed]="nodeIsBold(node)"
47212
47378
  [disabled]="!canEdit()"
@@ -47217,7 +47383,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
47217
47383
  <button
47218
47384
  type="button"
47219
47385
  class="pptx-sa-props__icon pptx-sa-props__style-toggle"
47220
- [title]="'pptx.smartart.italic' | translate"
47386
+ [title]="'pptx.inspector.italic' | translate"
47221
47387
  [class.is-active]="nodeIsItalic(node)"
47222
47388
  [attr.aria-pressed]="nodeIsItalic(node)"
47223
47389
  [disabled]="!canEdit()"
@@ -48023,7 +48189,7 @@ class TableCellFormattingComponent {
48023
48189
  [disabled]="!canEdit()"
48024
48190
  (click)="onMergeRange()"
48025
48191
  >
48026
- {{ 'pptx.table.mergeSelected' | translate }}
48192
+ {{ 'pptx.contextMenu.mergeSelectedCells' | translate }}
48027
48193
  </button>
48028
48194
  }
48029
48195
  </div>
@@ -48169,7 +48335,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
48169
48335
  [disabled]="!canEdit()"
48170
48336
  (click)="onMergeRange()"
48171
48337
  >
48172
- {{ 'pptx.table.mergeSelected' | translate }}
48338
+ {{ 'pptx.contextMenu.mergeSelectedCells' | translate }}
48173
48339
  </button>
48174
48340
  }
48175
48341
  </div>
@@ -55008,7 +55174,7 @@ class SmartArtRendererComponent {
55008
55174
  >
55009
55175
  @if (isEmpty()) {
55010
55176
  <div class="pptx-ng-smartart-placeholder">
55011
- {{ 'pptx.smartart.placeholder' | translate }}
55177
+ {{ 'pptx.smartArt.placeholder' | translate }}
55012
55178
  </div>
55013
55179
  } @else if (hasDrawingShapes()) {
55014
55180
  <svg
@@ -55169,7 +55335,7 @@ class SmartArtRendererComponent {
55169
55335
  </svg>
55170
55336
  } @else {
55171
55337
  <div class="pptx-ng-smartart-placeholder">
55172
- {{ 'pptx.smartart.placeholder' | translate }}
55338
+ {{ 'pptx.smartArt.placeholder' | translate }}
55173
55339
  </div>
55174
55340
  }
55175
55341
 
@@ -55184,7 +55350,7 @@ class SmartArtRendererComponent {
55184
55350
  <button
55185
55351
  type="button"
55186
55352
  class="pptx-ng-smartart-swatch"
55187
- [attr.aria-label]="'pptx.smartart.setFillTo' | translate: { color: color }"
55353
+ [attr.aria-label]="'pptx.smartArt.setFill' | translate: { color: color }"
55188
55354
  [style.background]="color"
55189
55355
  (click)="handleChangeNodeStyle(hoveredNodeId()!, color)"
55190
55356
  ></button>
@@ -55241,7 +55407,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55241
55407
  >
55242
55408
  @if (isEmpty()) {
55243
55409
  <div class="pptx-ng-smartart-placeholder">
55244
- {{ 'pptx.smartart.placeholder' | translate }}
55410
+ {{ 'pptx.smartArt.placeholder' | translate }}
55245
55411
  </div>
55246
55412
  } @else if (hasDrawingShapes()) {
55247
55413
  <svg
@@ -55402,7 +55568,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55402
55568
  </svg>
55403
55569
  } @else {
55404
55570
  <div class="pptx-ng-smartart-placeholder">
55405
- {{ 'pptx.smartart.placeholder' | translate }}
55571
+ {{ 'pptx.smartArt.placeholder' | translate }}
55406
55572
  </div>
55407
55573
  }
55408
55574
 
@@ -55417,7 +55583,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55417
55583
  <button
55418
55584
  type="button"
55419
55585
  class="pptx-ng-smartart-swatch"
55420
- [attr.aria-label]="'pptx.smartart.setFillTo' | translate: { color: color }"
55586
+ [attr.aria-label]="'pptx.smartArt.setFill' | translate: { color: color }"
55421
55587
  [style.background]="color"
55422
55588
  (click)="handleChangeNodeStyle(hoveredNodeId()!, color)"
55423
55589
  ></button>
@@ -55706,7 +55872,7 @@ class SmartArt3DRendererComponent {
55706
55872
  [style.height.px]="editState()!.box.height"
55707
55873
  [value]="editState()!.text"
55708
55874
  spellcheck="false"
55709
- [attr.aria-label]="'pptx.smartart.editNodeText' | translate"
55875
+ [attr.aria-label]="'pptx.smartArt.editNodeText' | translate"
55710
55876
  (input)="updateDraft($event)"
55711
55877
  (blur)="commitEdit()"
55712
55878
  (keydown)="onEditorKeydown($event)"
@@ -55748,7 +55914,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55748
55914
  [style.height.px]="editState()!.box.height"
55749
55915
  [value]="editState()!.text"
55750
55916
  spellcheck="false"
55751
- [attr.aria-label]="'pptx.smartart.editNodeText' | translate"
55917
+ [attr.aria-label]="'pptx.smartArt.editNodeText' | translate"
55752
55918
  (input)="updateDraft($event)"
55753
55919
  (blur)="commitEdit()"
55754
55920
  (keydown)="onEditorKeydown($event)"
@@ -59073,7 +59239,7 @@ class SlideCanvasComponent {
59073
59239
  <div
59074
59240
  class="pptx-ng-rotate-handle"
59075
59241
  role="button"
59076
- [attr.aria-label]="'pptx.canvas.rotate' | translate"
59242
+ [attr.aria-label]="'pptx.selectionOverlay.rotate' | translate"
59077
59243
  [style.left.px]="rh.left"
59078
59244
  [style.top.px]="rh.top"
59079
59245
  [style.width.px]="rh.size"
@@ -59447,7 +59613,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
59447
59613
  <div
59448
59614
  class="pptx-ng-rotate-handle"
59449
59615
  role="button"
59450
- [attr.aria-label]="'pptx.canvas.rotate' | translate"
59616
+ [attr.aria-label]="'pptx.selectionOverlay.rotate' | translate"
59451
59617
  [style.left.px]="rh.left"
59452
59618
  [style.top.px]="rh.top"
59453
59619
  [style.width.px]="rh.size"
@@ -65226,7 +65392,7 @@ class PropertiesDialogComponent {
65226
65392
  <div class="pptx-ng-props-form">
65227
65393
  <div class="pptx-ng-props-field">
65228
65394
  <label for="pptx-ng-props-title" class="pptx-ng-props-label">{{
65229
- 'pptx.documentProperties.summary.title' | translate
65395
+ 'pptx.properties.titleLabel' | translate
65230
65396
  }}</label>
65231
65397
  <input
65232
65398
  id="pptx-ng-props-title"
@@ -65239,7 +65405,7 @@ class PropertiesDialogComponent {
65239
65405
 
65240
65406
  <div class="pptx-ng-props-field">
65241
65407
  <label for="pptx-ng-props-creator" class="pptx-ng-props-label">{{
65242
- 'pptx.documentProperties.summary.author' | translate
65408
+ 'pptx.properties.author' | translate
65243
65409
  }}</label>
65244
65410
  <input
65245
65411
  id="pptx-ng-props-creator"
@@ -65252,7 +65418,7 @@ class PropertiesDialogComponent {
65252
65418
 
65253
65419
  <div class="pptx-ng-props-field">
65254
65420
  <label for="pptx-ng-props-subject" class="pptx-ng-props-label">{{
65255
- 'pptx.documentProperties.summary.subject' | translate
65421
+ 'pptx.properties.subject' | translate
65256
65422
  }}</label>
65257
65423
  <input
65258
65424
  id="pptx-ng-props-subject"
@@ -65265,7 +65431,7 @@ class PropertiesDialogComponent {
65265
65431
 
65266
65432
  <div class="pptx-ng-props-field">
65267
65433
  <label for="pptx-ng-props-keywords" class="pptx-ng-props-label">{{
65268
- 'pptx.documentProperties.summary.keywords' | translate
65434
+ 'pptx.properties.keywords' | translate
65269
65435
  }}</label>
65270
65436
  <input
65271
65437
  id="pptx-ng-props-keywords"
@@ -65318,7 +65484,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
65318
65484
  <div class="pptx-ng-props-form">
65319
65485
  <div class="pptx-ng-props-field">
65320
65486
  <label for="pptx-ng-props-title" class="pptx-ng-props-label">{{
65321
- 'pptx.documentProperties.summary.title' | translate
65487
+ 'pptx.properties.titleLabel' | translate
65322
65488
  }}</label>
65323
65489
  <input
65324
65490
  id="pptx-ng-props-title"
@@ -65331,7 +65497,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
65331
65497
 
65332
65498
  <div class="pptx-ng-props-field">
65333
65499
  <label for="pptx-ng-props-creator" class="pptx-ng-props-label">{{
65334
- 'pptx.documentProperties.summary.author' | translate
65500
+ 'pptx.properties.author' | translate
65335
65501
  }}</label>
65336
65502
  <input
65337
65503
  id="pptx-ng-props-creator"
@@ -65344,7 +65510,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
65344
65510
 
65345
65511
  <div class="pptx-ng-props-field">
65346
65512
  <label for="pptx-ng-props-subject" class="pptx-ng-props-label">{{
65347
- 'pptx.documentProperties.summary.subject' | translate
65513
+ 'pptx.properties.subject' | translate
65348
65514
  }}</label>
65349
65515
  <input
65350
65516
  id="pptx-ng-props-subject"
@@ -65357,7 +65523,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
65357
65523
 
65358
65524
  <div class="pptx-ng-props-field">
65359
65525
  <label for="pptx-ng-props-keywords" class="pptx-ng-props-label">{{
65360
- 'pptx.documentProperties.summary.keywords' | translate
65526
+ 'pptx.properties.keywords' | translate
65361
65527
  }}</label>
65362
65528
  <input
65363
65529
  id="pptx-ng-props-keywords"
@@ -67992,7 +68158,7 @@ class RibbonInsertFieldsComponent {
67992
68158
  class="flex w-full items-center gap-2 px-3 py-1.5 text-xs text-foreground transition-colors hover:bg-muted"
67993
68159
  (click)="openDatePicker()"
67994
68160
  >
67995
- {{ 'pptx.field.dateAndTime' | translate }}
68161
+ {{ 'pptx.headerFooter.dateAndTime' | translate }}
67996
68162
  </button>
67997
68163
  <button
67998
68164
  type="button"
@@ -68020,7 +68186,7 @@ class RibbonInsertFieldsComponent {
68020
68186
  >
68021
68187
  <div class="w-72 space-y-3 rounded-lg border border-border bg-card p-4 shadow-2xl">
68022
68188
  <div class="text-sm font-medium text-foreground">
68023
- {{ 'pptx.field.dateAndTime' | translate }}
68189
+ {{ 'pptx.headerFooter.dateAndTime' | translate }}
68024
68190
  </div>
68025
68191
  <input
68026
68192
  type="datetime-local"
@@ -68153,7 +68319,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68153
68319
  class="flex w-full items-center gap-2 px-3 py-1.5 text-xs text-foreground transition-colors hover:bg-muted"
68154
68320
  (click)="openDatePicker()"
68155
68321
  >
68156
- {{ 'pptx.field.dateAndTime' | translate }}
68322
+ {{ 'pptx.headerFooter.dateAndTime' | translate }}
68157
68323
  </button>
68158
68324
  <button
68159
68325
  type="button"
@@ -68181,7 +68347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68181
68347
  >
68182
68348
  <div class="w-72 space-y-3 rounded-lg border border-border bg-card p-4 shadow-2xl">
68183
68349
  <div class="text-sm font-medium text-foreground">
68184
- {{ 'pptx.field.dateAndTime' | translate }}
68350
+ {{ 'pptx.headerFooter.dateAndTime' | translate }}
68185
68351
  </div>
68186
68352
  <input
68187
68353
  type="datetime-local"
@@ -70448,7 +70614,7 @@ class SelectionPaneComponent {
70448
70614
  }
70449
70615
  </ul>
70450
70616
  } @else {
70451
- <p class="pptx-ng-sel-pane__empty">{{ 'pptx.selectionPane.emptySlide' | translate }}</p>
70617
+ <p class="pptx-ng-sel-pane__empty">{{ 'pptx.selectionPane.empty' | translate }}</p>
70452
70618
  }
70453
70619
  </aside>
70454
70620
  `, 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 });
@@ -70519,7 +70685,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70519
70685
  }
70520
70686
  </ul>
70521
70687
  } @else {
70522
- <p class="pptx-ng-sel-pane__empty">{{ 'pptx.selectionPane.emptySlide' | translate }}</p>
70688
+ <p class="pptx-ng-sel-pane__empty">{{ 'pptx.selectionPane.empty' | translate }}</p>
70523
70689
  }
70524
70690
  </aside>
70525
70691
  `, 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"] }]
@@ -70725,9 +70891,7 @@ class ShareDialogComponent {
70725
70891
 
70726
70892
  @if (shareUrl()) {
70727
70893
  <div class="pptx-ng-share-field">
70728
- <label class="pptx-ng-share-label">{{
70729
- 'pptx.share.shareLinkLabel' | translate
70730
- }}</label>
70894
+ <label class="pptx-ng-share-label">{{ 'pptx.share.shareLink' | translate }}</label>
70731
70895
  <div class="pptx-ng-share-link-row">
70732
70896
  <input
70733
70897
  class="pptx-ng-share-input"
@@ -70745,12 +70909,12 @@ class ShareDialogComponent {
70745
70909
  {{ (copied() ? 'pptx.share.copied' : 'pptx.share.copyLinkButton') | translate }}
70746
70910
  </button>
70747
70911
  </div>
70748
- <p class="pptx-ng-share-hint">{{ 'pptx.share.copyLinkHint' | translate }}</p>
70912
+ <p class="pptx-ng-share-hint">{{ 'pptx.share.shareHint' | translate }}</p>
70749
70913
  </div>
70750
70914
  }
70751
70915
 
70752
70916
  <button type="button" class="pptx-ng-share-stop" (click)="handleStop()">
70753
- {{ 'pptx.share.stopSharingButton' | translate }}
70917
+ {{ 'pptx.share.stopSharing' | translate }}
70754
70918
  </button>
70755
70919
  </div>
70756
70920
  } @else {
@@ -70817,7 +70981,7 @@ class ShareDialogComponent {
70817
70981
  [disabled]="!canStart()"
70818
70982
  (click)="handleStart()"
70819
70983
  >
70820
- {{ 'pptx.share.startSharingButton' | translate }}
70984
+ {{ 'pptx.share.startSharing' | translate }}
70821
70985
  </button>
70822
70986
  }
70823
70987
  </div>
@@ -70863,9 +71027,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70863
71027
 
70864
71028
  @if (shareUrl()) {
70865
71029
  <div class="pptx-ng-share-field">
70866
- <label class="pptx-ng-share-label">{{
70867
- 'pptx.share.shareLinkLabel' | translate
70868
- }}</label>
71030
+ <label class="pptx-ng-share-label">{{ 'pptx.share.shareLink' | translate }}</label>
70869
71031
  <div class="pptx-ng-share-link-row">
70870
71032
  <input
70871
71033
  class="pptx-ng-share-input"
@@ -70883,12 +71045,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70883
71045
  {{ (copied() ? 'pptx.share.copied' : 'pptx.share.copyLinkButton') | translate }}
70884
71046
  </button>
70885
71047
  </div>
70886
- <p class="pptx-ng-share-hint">{{ 'pptx.share.copyLinkHint' | translate }}</p>
71048
+ <p class="pptx-ng-share-hint">{{ 'pptx.share.shareHint' | translate }}</p>
70887
71049
  </div>
70888
71050
  }
70889
71051
 
70890
71052
  <button type="button" class="pptx-ng-share-stop" (click)="handleStop()">
70891
- {{ 'pptx.share.stopSharingButton' | translate }}
71053
+ {{ 'pptx.share.stopSharing' | translate }}
70892
71054
  </button>
70893
71055
  </div>
70894
71056
  } @else {
@@ -70955,7 +71117,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70955
71117
  [disabled]="!canStart()"
70956
71118
  (click)="handleStart()"
70957
71119
  >
70958
- {{ 'pptx.share.startSharingButton' | translate }}
71120
+ {{ 'pptx.share.startSharing' | translate }}
70959
71121
  </button>
70960
71122
  }
70961
71123
  </div>
@@ -71137,7 +71299,10 @@ class SignaturesPanelComponent {
71137
71299
  }
71138
71300
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SignaturesPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
71139
71301
  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: `
71140
- <section class="pptx-ng-signatures" [attr.aria-label]="'pptx.signatures.ariaLabel' | translate">
71302
+ <section
71303
+ class="pptx-ng-signatures"
71304
+ [attr.aria-label]="'pptx.digitalSignatures.ariaLabel' | translate"
71305
+ >
71141
71306
  <header
71142
71307
  class="pptx-ng-signatures__header"
71143
71308
  [class]="'pptx-ng-signatures__header--' + overall()"
@@ -71150,7 +71315,9 @@ class SignaturesPanelComponent {
71150
71315
  </header>
71151
71316
 
71152
71317
  @if (!signed()) {
71153
- <p class="pptx-ng-signatures__empty">{{ 'pptx.signatures.empty' | translate }}</p>
71318
+ <p class="pptx-ng-signatures__empty">
71319
+ {{ 'pptx.digitalSignatures.noSignatures' | translate }}
71320
+ </p>
71154
71321
  } @else {
71155
71322
  <ul class="pptx-ng-signatures__list">
71156
71323
  @for (sig of signatures(); track key(sig, $index)) {
@@ -71167,20 +71334,20 @@ class SignaturesPanelComponent {
71167
71334
 
71168
71335
  <dl class="pptx-ng-signatures__meta">
71169
71336
  @if (sig.certificate?.issuer; as issuer) {
71170
- <dt>{{ 'pptx.signatures.issuer' | translate }}</dt>
71337
+ <dt>{{ 'pptx.digitalSignatures.issuer' | translate }}</dt>
71171
71338
  <dd>{{ issuer }}</dd>
71172
71339
  }
71173
71340
  @if (sig.certificate?.serialNumber; as serial) {
71174
- <dt>{{ 'pptx.signatures.serial' | translate }}</dt>
71341
+ <dt>{{ 'pptx.digitalSignatures.serial' | translate }}</dt>
71175
71342
  <dd>{{ serial }}</dd>
71176
71343
  }
71177
71344
  @if (timestamp(sig); as ts) {
71178
- <dt>{{ 'pptx.signatures.signed' | translate }}</dt>
71345
+ <dt>{{ 'pptx.digitalSignatures.signed' | translate }}</dt>
71179
71346
  <dd>{{ ts }}</dd>
71180
71347
  }
71181
71348
  @if (!sig.certificate) {
71182
- <dt>{{ 'pptx.signatures.certificate' | translate }}</dt>
71183
- <dd>{{ 'pptx.signatures.notAvailable' | translate }}</dd>
71349
+ <dt>{{ 'pptx.digitalSignatures.certificate' | translate }}</dt>
71350
+ <dd>{{ 'pptx.digitalSignatures.notAvailable' | translate }}</dd>
71184
71351
  }
71185
71352
  </dl>
71186
71353
  </li>
@@ -71193,7 +71360,10 @@ class SignaturesPanelComponent {
71193
71360
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SignaturesPanelComponent, decorators: [{
71194
71361
  type: Component,
71195
71362
  args: [{ selector: 'pptx-signatures-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe], template: `
71196
- <section class="pptx-ng-signatures" [attr.aria-label]="'pptx.signatures.ariaLabel' | translate">
71363
+ <section
71364
+ class="pptx-ng-signatures"
71365
+ [attr.aria-label]="'pptx.digitalSignatures.ariaLabel' | translate"
71366
+ >
71197
71367
  <header
71198
71368
  class="pptx-ng-signatures__header"
71199
71369
  [class]="'pptx-ng-signatures__header--' + overall()"
@@ -71206,7 +71376,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71206
71376
  </header>
71207
71377
 
71208
71378
  @if (!signed()) {
71209
- <p class="pptx-ng-signatures__empty">{{ 'pptx.signatures.empty' | translate }}</p>
71379
+ <p class="pptx-ng-signatures__empty">
71380
+ {{ 'pptx.digitalSignatures.noSignatures' | translate }}
71381
+ </p>
71210
71382
  } @else {
71211
71383
  <ul class="pptx-ng-signatures__list">
71212
71384
  @for (sig of signatures(); track key(sig, $index)) {
@@ -71223,20 +71395,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71223
71395
 
71224
71396
  <dl class="pptx-ng-signatures__meta">
71225
71397
  @if (sig.certificate?.issuer; as issuer) {
71226
- <dt>{{ 'pptx.signatures.issuer' | translate }}</dt>
71398
+ <dt>{{ 'pptx.digitalSignatures.issuer' | translate }}</dt>
71227
71399
  <dd>{{ issuer }}</dd>
71228
71400
  }
71229
71401
  @if (sig.certificate?.serialNumber; as serial) {
71230
- <dt>{{ 'pptx.signatures.serial' | translate }}</dt>
71402
+ <dt>{{ 'pptx.digitalSignatures.serial' | translate }}</dt>
71231
71403
  <dd>{{ serial }}</dd>
71232
71404
  }
71233
71405
  @if (timestamp(sig); as ts) {
71234
- <dt>{{ 'pptx.signatures.signed' | translate }}</dt>
71406
+ <dt>{{ 'pptx.digitalSignatures.signed' | translate }}</dt>
71235
71407
  <dd>{{ ts }}</dd>
71236
71408
  }
71237
71409
  @if (!sig.certificate) {
71238
- <dt>{{ 'pptx.signatures.certificate' | translate }}</dt>
71239
- <dd>{{ 'pptx.signatures.notAvailable' | translate }}</dd>
71410
+ <dt>{{ 'pptx.digitalSignatures.certificate' | translate }}</dt>
71411
+ <dd>{{ 'pptx.digitalSignatures.notAvailable' | translate }}</dd>
71240
71412
  }
71241
71413
  </dl>
71242
71414
  </li>
@@ -71597,12 +71769,12 @@ class SlidesPanelComponent {
71597
71769
  <div
71598
71770
  class="pptx-ng-spanel-actions"
71599
71771
  role="toolbar"
71600
- [attr.aria-label]="'pptx.slidesPanel.slideActions' | translate: { n: i + 1 }"
71772
+ [attr.aria-label]="'pptx.slideMenu.slideActions' | translate: { n: i + 1 }"
71601
71773
  >
71602
71774
  <button
71603
71775
  type="button"
71604
71776
  class="pptx-ng-spanel-action"
71605
- [title]="'pptx.slidesPanel.duplicateSlide' | translate"
71777
+ [title]="'pptx.ribbon.duplicateSlide' | translate"
71606
71778
  [attr.aria-label]="'pptx.arrange.duplicate' | translate"
71607
71779
  (click)="onDuplicate(i)"
71608
71780
  >
@@ -71704,12 +71876,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71704
71876
  <div
71705
71877
  class="pptx-ng-spanel-actions"
71706
71878
  role="toolbar"
71707
- [attr.aria-label]="'pptx.slidesPanel.slideActions' | translate: { n: i + 1 }"
71879
+ [attr.aria-label]="'pptx.slideMenu.slideActions' | translate: { n: i + 1 }"
71708
71880
  >
71709
71881
  <button
71710
71882
  type="button"
71711
71883
  class="pptx-ng-spanel-action"
71712
- [title]="'pptx.slidesPanel.duplicateSlide' | translate"
71884
+ [title]="'pptx.ribbon.duplicateSlide' | translate"
71713
71885
  [attr.aria-label]="'pptx.arrange.duplicate' | translate"
71714
71886
  (click)="onDuplicate(i)"
71715
71887
  >
@@ -80252,6 +80424,8 @@ const translationsEn = {
80252
80424
  'pptx.inspector.fill': 'Fill',
80253
80425
  'pptx.inspector.line': 'Line',
80254
80426
  'pptx.inspector.effects': 'Effects',
80427
+ 'pptx.inspector.softEdge': 'Soft Edge',
80428
+ 'pptx.inspector.softEdgeRadius': 'Soft Edge Radius',
80255
80429
  'pptx.arrange.positionSize': 'Position & Size',
80256
80430
  'pptx.arrange.lockElement': 'Lock element',
80257
80431
  'pptx.arrange.unlockElement': 'Unlock element',
@@ -80273,6 +80447,9 @@ const translationsEn = {
80273
80447
  'pptx.media.trimEndTime': 'End (mm:ss)',
80274
80448
  'pptx.media.trimmedDuration': 'Trimmed duration',
80275
80449
  'pptx.media.resetTrim': 'Reset trim',
80450
+ 'pptx.media.trimErrorNegative': 'Trim times cannot be negative.',
80451
+ 'pptx.media.trimErrorStartAfterEnd': 'Trim start must be before trim end.',
80452
+ 'pptx.media.trimErrorBeyondDuration': 'Trim times cannot exceed the clip duration.',
80276
80453
  'pptx.media.playback': 'Playback',
80277
80454
  'pptx.media.volume': 'Volume',
80278
80455
  'pptx.media.speed': 'Speed',
@@ -81346,6 +81523,265 @@ const translationsEn = {
81346
81523
  'pptx.animation.sequence.byParagraph': 'By Paragraph',
81347
81524
  'pptx.animation.sequence.byWord': 'By Word',
81348
81525
  'pptx.animation.sequence.byLetter': 'By Letter',
81526
+ // --- 2026-07-03 missing-key sweep: keys used by Vue/Angular with no
81527
+ // existing dictionary entry (React has 0 such gaps and is the ground-
81528
+ // truth reference these were derived from). Appended flat rather than
81529
+ // interleaved into their semantic sections above, to keep this batch
81530
+ // change safe/reviewable as one block.
81531
+ 'pptx.align.toolbarLabel': 'Align and distribute',
81532
+ 'pptx.arrange.deleteSelection': 'Delete selection',
81533
+ 'pptx.arrange.duplicateSelection': 'Duplicate selection',
81534
+ 'pptx.arrange.groupLabel': 'Arrange',
81535
+ 'pptx.canvas.adjustShape': 'Adjust shape',
81536
+ 'pptx.canvas.guideTooltip': 'Drag to move guide, double-click to remove',
81537
+ 'pptx.customShows.none': 'None',
81538
+ 'pptx.customShows.noSlidesYet': 'No slides in this show yet.',
81539
+ 'pptx.customShows.renameNameLabel': 'Show name',
81540
+ 'pptx.customShows.renameShow': 'Rename show',
81541
+ 'pptx.customShows.slidesInShow': 'Slides in show',
81542
+ 'pptx.design.editThemeTooltip': 'Edit presentation theme colors and fonts',
81543
+ 'pptx.design.formatBackgroundTooltip': 'Open inspector to edit slide background',
81544
+ 'pptx.design.slideSizeTooltip': 'Change slide dimensions (16:9, 4:3, custom)',
81545
+ 'pptx.documentProperties.summary.company': 'Company',
81546
+ 'pptx.documentProperties.summary.manager': 'Manager',
81547
+ 'pptx.editorToolbar.addShape': 'Add {{shape}}',
81548
+ 'pptx.editorToolbar.addTextBox': 'Add text box',
81549
+ 'pptx.editorToolbar.history': 'History',
81550
+ 'pptx.editorToolbar.resetZoom': 'Reset zoom',
81551
+ 'pptx.editorToolbar.resetZoomTo100': 'Reset zoom to 100%',
81552
+ 'pptx.effects.innerShadow': 'Inner Shadow',
81553
+ 'pptx.element.linkFallback': 'Link',
81554
+ 'pptx.export.export': 'Export',
81555
+ 'pptx.export.gifAnimated': 'Animated GIF',
81556
+ 'pptx.export.pdfAllSlides': 'PDF (all slides)',
81557
+ 'pptx.export.pngCurrentSlide': 'PNG (current slide)',
81558
+ 'pptx.export.webmVideo': 'WebM video',
81559
+ 'pptx.file.copyImage': 'Copy Image',
81560
+ 'pptx.file.copyImageTooltip': 'Copy Slide as Image',
81561
+ 'pptx.file.fonts': 'Fonts',
81562
+ 'pptx.file.gif': 'GIF',
81563
+ 'pptx.file.package': 'Package',
81564
+ 'pptx.file.packageTooltip': 'Package for Sharing',
81565
+ 'pptx.file.pdf': 'PDF',
81566
+ 'pptx.file.png': 'PNG',
81567
+ 'pptx.file.saveAsPpsx': 'Save .ppsx',
81568
+ 'pptx.file.saveAsPpsxTooltip': 'Save as Slide Show (.ppsx)',
81569
+ 'pptx.file.saveAsPptm': 'Save .pptm',
81570
+ 'pptx.file.saveAsPptmTooltip': 'Save as Macro-Enabled (.pptm)',
81571
+ 'pptx.file.saveAsPptx': 'Save .pptx',
81572
+ 'pptx.file.saveAsPptxTooltip': 'Save as Presentation (.pptx)',
81573
+ 'pptx.file.video': 'Video',
81574
+ 'pptx.fontEmbedding.embedInFile': 'Embed fonts in file',
81575
+ 'pptx.fontEmbedding.noCustomFonts': 'No custom fonts to embed.',
81576
+ 'pptx.guides.dragHint': 'Drag to move guide',
81577
+ 'pptx.handout.cornerDate': 'Date',
81578
+ 'pptx.handout.pageNumber': '#',
81579
+ 'pptx.headerFooter.fixedDate': 'Fixed date',
81580
+ 'pptx.headerFooter.headerText': 'Enter header text…',
81581
+ 'pptx.headerFooter.updateAutomatically': 'Update automatically',
81582
+ 'pptx.home.chooseLayout': 'Choose layout',
81583
+ 'pptx.home.newSlide': 'New Slide',
81584
+ 'pptx.hyperlink.linkTo': 'Link to',
81585
+ 'pptx.hyperlink.urlPlaceholder': 'https://example.com',
81586
+ 'pptx.insert.addShape': 'Add shape',
81587
+ 'pptx.insert.addTextBox': 'Add text box',
81588
+ 'pptx.insert.insertEquation': 'Insert Equation',
81589
+ 'pptx.insert.insertSmartArt': 'Insert SmartArt',
81590
+ 'pptx.insert.insertTable': 'Insert table',
81591
+ 'pptx.insert.shape': 'Shape',
81592
+ 'pptx.insert.shapeType': 'Shape type',
81593
+ 'pptx.mode.closeMasterViewTooltip': 'Close master view',
81594
+ 'pptx.mode.masterView': 'Master View',
81595
+ 'pptx.overflow.closeMenu': 'Close menu',
81596
+ 'pptx.present.optionsTooltip': 'Presentation options',
81597
+ 'pptx.present.presentOnline': 'Present Online',
81598
+ 'pptx.present.presentTooltip': 'Present (fullscreen)',
81599
+ 'pptx.review.spelling': 'Spelling',
81600
+ 'pptx.review.toggleComments': 'Toggle comments panel',
81601
+ 'pptx.review.toggleSpellCheck': 'Toggle spell check',
81602
+ 'pptx.shortcuts.title': 'Keyboard shortcuts',
81603
+ 'pptx.slideInspector.horizontal': 'Horizontal',
81604
+ 'pptx.slideInspector.presentation': 'Presentation',
81605
+ 'pptx.slideInspector.slideTransition': 'Slide transition',
81606
+ 'pptx.slideInspector.themeColours': 'Theme colours',
81607
+ 'pptx.slideInspector.vertical': 'Vertical',
81608
+ 'pptx.slidesPanel.deleteSlide': 'Delete slide',
81609
+ 'pptx.slidesPanel.goToSlide': 'Go to slide {{n}}',
81610
+ 'pptx.smartart.demote': 'Demote',
81611
+ 'pptx.smartart.item': 'Item',
81612
+ 'pptx.smartart.nodeCleared': 'Node cleared',
81613
+ 'pptx.smartart.nodeFill': 'Node fill',
81614
+ 'pptx.smartart.nodeFont': 'Node font',
81615
+ 'pptx.smartart.nodeUpdated': 'Node updated to "{{text}}"',
81616
+ 'pptx.smartart.promote': 'Promote',
81617
+ 'pptx.smartart.subItemShort': 'Sub-item',
81618
+ 'pptx.stroke.dash': 'Dash',
81619
+ 'pptx.stroke.noBorderProperties': 'This element has no border properties.',
81620
+ 'pptx.stroke.widthPx': 'Width (px)',
81621
+ 'pptx.table.columns': 'Columns',
81622
+ 'pptx.table.columnsCount': '{{count}} columns',
81623
+ 'pptx.table.deleteColumn': 'Delete column',
81624
+ 'pptx.table.deleteRow': 'Delete row',
81625
+ 'pptx.table.insertAbove': 'Insert above',
81626
+ 'pptx.table.insertBelow': 'Insert below',
81627
+ 'pptx.table.insertLeft': 'Insert left',
81628
+ 'pptx.table.insertRight': 'Insert right',
81629
+ 'pptx.table.mergeSelected': 'Merge selected',
81630
+ 'pptx.table.noEditableData': 'This table has no editable data.',
81631
+ 'pptx.table.rows': 'Rows',
81632
+ 'pptx.table.rowsCount': '{{count}} rows',
81633
+ 'pptx.table.selectTablePrompt': 'Select a table to edit its properties.',
81634
+ 'pptx.tableCell.backgroundColorAria': 'Background colour',
81635
+ 'pptx.tableCell.edgeBorderColorAria': '{{edge}} border colour',
81636
+ 'pptx.tableCell.textColorAria': 'Text colour',
81637
+ 'pptx.text.bulletList': 'Bullet List',
81638
+ 'pptx.text.clearFormatting': 'Clear Formatting',
81639
+ 'pptx.text.decreaseFontSize': 'Decrease Font Size',
81640
+ 'pptx.text.decreaseIndent': 'Decrease Indent',
81641
+ 'pptx.text.fontColor': 'Font Color',
81642
+ 'pptx.text.highlightColor': 'Text Highlight Color',
81643
+ 'pptx.text.increaseFontSize': 'Increase Font Size',
81644
+ 'pptx.text.increaseIndent': 'Increase Indent',
81645
+ 'pptx.text.numberedList': 'Numbered List',
81646
+ 'pptx.view.addHorizontalGuide': 'Add horizontal guide',
81647
+ 'pptx.view.addVerticalGuide': 'Add vertical guide',
81648
+ 'pptx.view.eyedropperTooltip': 'Eyedropper: sample a colour from the slide',
81649
+ 'pptx.view.hGuide': 'H Guide',
81650
+ 'pptx.view.masterViews': 'Master Views',
81651
+ 'pptx.view.normal': 'Normal',
81652
+ 'pptx.view.presentationViews': 'Presentation Views',
81653
+ 'pptx.view.readingView': 'Reading View',
81654
+ 'pptx.view.selection': 'Selection',
81655
+ 'pptx.view.slideMasterTooltip': 'Edit slide masters and layouts',
81656
+ 'pptx.view.slideSorterTooltip': 'Slide Sorter view',
81657
+ 'pptx.view.spell': 'Spell',
81658
+ 'pptx.view.templateEditingTooltip': 'Toggle template/master element editing',
81659
+ 'pptx.view.toggleSpellCheck': 'Toggle spell check',
81660
+ 'pptx.view.vGuide': 'V Guide',
81661
+ 'pptx.view.zoomToFit': 'Zoom to Fit',
81662
+ 'pptx.view.zoomToFitTooltip': 'Zoom to fit slide in window',
81663
+ // --- 2026-07-03 missing-key sweep, wave 2: keys referenced indirectly
81664
+ // (via a variable/array 'labelKey', not a literal t('...') call - e.g.
81665
+ // shape-preset lists, equation templates, artistic-effect catalogues,
81666
+ // table style-option checkboxes) that the first wave's literal-call
81667
+ // grep could not see. Same appended-flat approach as wave 1.
81668
+ 'pptx.accessibility.severityErrors': 'Errors',
81669
+ 'pptx.accessibility.severityTips': 'Tips',
81670
+ 'pptx.accessibility.severityWarnings': 'Warnings',
81671
+ 'pptx.accessibility.typeBlankSlide': 'Blank slide',
81672
+ 'pptx.accessibility.typeComplexTable': 'Complex table',
81673
+ 'pptx.accessibility.typeDuplicateTitle': 'Duplicate slide title',
81674
+ 'pptx.accessibility.typeLowContrast': 'Low contrast',
81675
+ 'pptx.accessibility.typeMissingAltText': 'Missing alt text',
81676
+ 'pptx.accessibility.typeMissingSlideTitle': 'Missing slide title',
81677
+ 'pptx.align.bottom': 'Align bottom',
81678
+ 'pptx.align.centerH': 'Align center',
81679
+ 'pptx.align.left': 'Align left',
81680
+ 'pptx.align.middle': 'Align middle',
81681
+ 'pptx.align.right': 'Align right',
81682
+ 'pptx.align.top': 'Align top',
81683
+ 'pptx.documentProperties.custom.typeDate': 'Date',
81684
+ 'pptx.documentProperties.custom.typeNumber': 'Number',
81685
+ 'pptx.documentProperties.custom.typeText': 'Text',
81686
+ 'pptx.documentProperties.custom.typeYesNo': 'Yes or No',
81687
+ 'pptx.documentProperties.statistics.application': 'Application',
81688
+ 'pptx.documentProperties.statistics.appVersion': 'Application Version',
81689
+ 'pptx.documentProperties.statistics.elements': 'Elements',
81690
+ 'pptx.documentProperties.statistics.hiddenSlides': 'Hidden Slides',
81691
+ 'pptx.documentProperties.statistics.lastModifiedBy': 'Last Modified By',
81692
+ 'pptx.documentProperties.statistics.notes': 'Notes',
81693
+ 'pptx.documentProperties.statistics.paragraphs': 'Paragraphs',
81694
+ 'pptx.documentProperties.statistics.presentationFormat': 'Presentation Format',
81695
+ 'pptx.documentProperties.statistics.revision': 'Revision',
81696
+ 'pptx.documentProperties.statistics.slides': 'Slides',
81697
+ 'pptx.documentProperties.statistics.template': 'Template',
81698
+ 'pptx.documentProperties.statistics.totalTime': 'Total Editing Time',
81699
+ 'pptx.documentProperties.statistics.words': 'Words',
81700
+ 'pptx.documentProperties.summary.category': 'Category',
81701
+ 'pptx.documentProperties.summary.description': 'Description',
81702
+ 'pptx.documentProperties.tabs.custom': 'Custom',
81703
+ 'pptx.documentProperties.tabs.general': 'General',
81704
+ 'pptx.documentProperties.tabs.statistics': 'Statistics',
81705
+ 'pptx.editorToolbar.shapeEllipse': 'Ellipse',
81706
+ 'pptx.editorToolbar.shapeRectangle': 'Rectangle',
81707
+ 'pptx.editorToolbar.shapeRoundedRectangle': 'Rounded rectangle',
81708
+ 'pptx.editorToolbar.shapeTriangle': 'Triangle',
81709
+ 'pptx.equation.template.binomial': 'Binomial',
81710
+ 'pptx.equation.template.derivative': 'Derivative',
81711
+ 'pptx.equation.template.euler': "Euler's",
81712
+ 'pptx.equation.template.fraction': 'Fraction',
81713
+ 'pptx.equation.template.integral': 'Integral',
81714
+ 'pptx.equation.template.limit': 'Limit',
81715
+ 'pptx.equation.template.matrix': 'Matrix 2x2',
81716
+ 'pptx.equation.template.pythagorean': 'Pythagorean',
81717
+ 'pptx.equation.template.quadratic': 'Quadratic',
81718
+ 'pptx.equation.template.squareRoot': 'Square Root',
81719
+ 'pptx.equation.template.sum': 'Sum',
81720
+ 'pptx.equation.template.trigIdentity': 'Trig Identity',
81721
+ 'pptx.hyperlink.actionNone': 'None',
81722
+ 'pptx.hyperlink.actionSlide': 'Slide',
81723
+ 'pptx.hyperlink.actionUrl': 'URL',
81724
+ 'pptx.image.duotonePresetBlackWhite': 'Black, White',
81725
+ 'pptx.image.duotonePresetBlueOrange': 'Blue, Orange',
81726
+ 'pptx.image.duotonePresetGreenYellow': 'Green, Yellow',
81727
+ 'pptx.image.duotonePresetNavyGold': 'Navy, Gold',
81728
+ 'pptx.image.duotonePresetPurplePink': 'Purple, Pink',
81729
+ 'pptx.image.duotonePresetRedCream': 'Red, Cream',
81730
+ 'pptx.image.duotonePresetSepiaWarm': 'Sepia, Warm',
81731
+ 'pptx.image.duotonePresetTealWhite': 'Teal, White',
81732
+ 'pptx.image.effectBlur': 'Blur',
81733
+ 'pptx.image.effectCement': 'Cement',
81734
+ 'pptx.image.effectChalk': 'Chalk Sketch',
81735
+ 'pptx.image.effectCrisscross': 'Crisscross Etching',
81736
+ 'pptx.image.effectCutout': 'Cutout',
81737
+ 'pptx.image.effectFilmGrain': 'Film Grain',
81738
+ 'pptx.image.effectGlowDiffused': 'Glow Diffused',
81739
+ 'pptx.image.effectGlowEdges': 'Glow Edges',
81740
+ 'pptx.image.effectGrayscale': 'Grayscale',
81741
+ 'pptx.image.effectLightScreen': 'Light Screen',
81742
+ 'pptx.image.effectLineDrawing': 'Line Drawing',
81743
+ 'pptx.image.effectMarker': 'Marker',
81744
+ 'pptx.image.effectMosaic': 'Mosaic Bubbles',
81745
+ 'pptx.image.effectNone': 'None',
81746
+ 'pptx.image.effectPaint': 'Paint Brush',
81747
+ 'pptx.image.effectPaintStrokes': 'Paint Strokes',
81748
+ 'pptx.image.effectPastels': 'Pastels Smooth',
81749
+ 'pptx.image.effectPencilSketch': 'Pencil Sketch',
81750
+ 'pptx.image.effectPhotocopy': 'Photocopy',
81751
+ 'pptx.image.effectPlasticWrap': 'Plastic Wrap',
81752
+ 'pptx.image.effectSepia': 'Sepia',
81753
+ 'pptx.image.effectSharpen': 'Sharpen',
81754
+ 'pptx.image.effectTexturizer': 'Texturizer',
81755
+ 'pptx.image.effectWatercolor': 'Watercolor Sponge',
81756
+ 'pptx.share.copyLinkButton': 'Copy Link',
81757
+ 'pptx.stroke.dashDash': 'Dash',
81758
+ 'pptx.stroke.dashDashDot': 'Dash Dot',
81759
+ 'pptx.stroke.dashDot': 'Dot',
81760
+ 'pptx.stroke.dashSolid': 'Solid',
81761
+ 'pptx.stroke.dashSysDash': 'System Dash',
81762
+ 'pptx.stroke.dashSysDot': 'System Dot',
81763
+ 'pptx.table.bandedColumns': 'Banded Columns',
81764
+ 'pptx.table.bandedRows': 'Banded Rows',
81765
+ 'pptx.table.borderBottom': 'Bottom',
81766
+ 'pptx.table.borderDiagDown': 'Diagonal Down',
81767
+ 'pptx.table.borderDiagUp': 'Diagonal Up',
81768
+ 'pptx.table.borderLeft': 'Left',
81769
+ 'pptx.table.borderRight': 'Right',
81770
+ 'pptx.table.borderTop': 'Top',
81771
+ 'pptx.table.fillGradient': 'Gradient',
81772
+ 'pptx.table.fillNone': 'None',
81773
+ 'pptx.table.fillPattern': 'Pattern',
81774
+ 'pptx.table.fillSolid': 'Solid',
81775
+ 'pptx.table.firstColumn': 'First Column',
81776
+ 'pptx.table.gradientLinear': 'Linear',
81777
+ 'pptx.table.gradientRadial': 'Radial',
81778
+ 'pptx.table.headerRow': 'Header Row',
81779
+ 'pptx.table.lastColumn': 'Last Column',
81780
+ 'pptx.table.lastRow': 'Last Row',
81781
+ 'pptx.table.marginBottom': 'Bottom',
81782
+ 'pptx.table.marginLeft': 'Left',
81783
+ 'pptx.table.marginRight': 'Right',
81784
+ 'pptx.table.marginTop': 'Top',
81349
81785
  };
81350
81786
  /**
81351
81787
  * Convert a dotted translation key to a human-readable label when no