pptx-angular-viewer 2.18.0 → 2.18.2

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.
@@ -23988,6 +23988,70 @@ function tableCellPointerIntent(input) {
23988
23988
  return 'anchor';
23989
23989
  }
23990
23990
 
23991
+ /**
23992
+ * Replace one cell's plain text, DROPPING the per-run model that described the
23993
+ * text it used to hold.
23994
+ *
23995
+ * `PptxTableCell` carries the same content twice: `text`, a flat `\n`-joined
23996
+ * string, and `textRuns`, the styled run sequence core parses out of the cell's
23997
+ * `a:txBody`. Every binding's table renderer paints `textRuns` when it is
23998
+ * present and only falls back to `text` when it is not, so spreading a cell and
23999
+ * overwriting `text` alone leaves the OLD wording painted: the edit lands in the
24000
+ * model, `updateCellTextInRawXml` lands it in the markup, and the canvas keeps
24001
+ * showing what was there before. That is precisely what `desktop-manipulation`
24002
+ * and `mobile-table` caught in four of the five bindings; Vanilla passed only
24003
+ * because its editor had spelled out `textRuns: undefined` locally, which is the
24004
+ * usual signal that a shared decision was missing.
24005
+ *
24006
+ * Dropping the runs rather than rebuilding them is also what the markup does:
24007
+ * `rebuildCellTextBody` collapses the cell to a SINGLE run carrying the first
24008
+ * run's `a:rPr`, and `PptxTableCell.style` is that same first-run style, so the
24009
+ * flat-text fallback and the rewritten `a:txBody` paint the same thing.
24010
+ *
24011
+ * @param cell - The cell to re-text (not mutated).
24012
+ * @param text - New plain-text content.
24013
+ * @returns A new cell holding `text` and no stale run model.
24014
+ */
24015
+ function withCellText(cell, text) {
24016
+ const next = { ...cell, text };
24017
+ delete next.textRuns;
24018
+ return next;
24019
+ }
24020
+ /**
24021
+ * Return a new `TablePptxElement` with the text of a single cell replaced.
24022
+ *
24023
+ * The element is not mutated: the affected row and cell are shallow-cloned and
24024
+ * every other row/cell is reused by reference. Returns the original element
24025
+ * unchanged when it carries no `tableData`.
24026
+ *
24027
+ * @param element - The source table element (not mutated).
24028
+ * @param rowIndex - Zero-based row index of the cell.
24029
+ * @param colIndex - Zero-based column index of the cell.
24030
+ * @param text - New plain-text content for the cell.
24031
+ * @returns A new `TablePptxElement` with the cell text applied.
24032
+ *
24033
+ * @example
24034
+ * ```ts
24035
+ * const updated = setCellText(el, 0, 1, "Revenue");
24036
+ * ```
24037
+ */
24038
+ function setCellText(element, rowIndex, colIndex, text) {
24039
+ const tableData = element.tableData;
24040
+ if (!tableData) {
24041
+ return element;
24042
+ }
24043
+ const rows = tableData.rows.map((row, ri) => {
24044
+ if (ri !== rowIndex) {
24045
+ return row;
24046
+ }
24047
+ return {
24048
+ ...row,
24049
+ cells: row.cells.map((cell, ci) => (ci === colIndex ? withCellText(cell, text) : cell)),
24050
+ };
24051
+ });
24052
+ return { ...element, tableData: { ...tableData, rows } };
24053
+ }
24054
+
23991
24055
  // ---------------------------------------------------------------------------
23992
24056
  // Rect helpers
23993
24057
  // ---------------------------------------------------------------------------
@@ -24195,11 +24259,15 @@ function mergeCells(cells, tableData) {
24195
24259
  if (ci < rect.startCol || ci > rect.endCol) {
24196
24260
  return cell;
24197
24261
  }
24262
+ // Every branch below re-texts the cell, so each goes through
24263
+ // `withCellText`: the anchor takes the CONCATENATION of the group and
24264
+ // the absorbed cells are emptied, and a cell that kept the `textRuns`
24265
+ // describing its old content would paint that content instead (the
24266
+ // renderers prefer the run model over the flat string).
24198
24267
  // Top-left anchor cell
24199
24268
  if (ri === rect.startRow && ci === rect.startCol) {
24200
24269
  return {
24201
- ...cell,
24202
- text: combinedText,
24270
+ ...withCellText(cell, combinedText),
24203
24271
  gridSpan: colCount > 1 ? colCount : undefined,
24204
24272
  rowSpan: rowCount > 1 ? rowCount : undefined,
24205
24273
  hMerge: undefined,
@@ -24209,8 +24277,7 @@ function mergeCells(cells, tableData) {
24209
24277
  // Same row as anchor, different column → hMerge
24210
24278
  if (ri === rect.startRow) {
24211
24279
  return {
24212
- ...cell,
24213
- text: '',
24280
+ ...withCellText(cell, ''),
24214
24281
  hMerge: true,
24215
24282
  vMerge: undefined,
24216
24283
  gridSpan: undefined,
@@ -24220,8 +24287,7 @@ function mergeCells(cells, tableData) {
24220
24287
  // Different row, same column as anchor → vMerge
24221
24288
  if (ci === rect.startCol) {
24222
24289
  return {
24223
- ...cell,
24224
- text: '',
24290
+ ...withCellText(cell, ''),
24225
24291
  vMerge: true,
24226
24292
  hMerge: undefined,
24227
24293
  gridSpan: undefined,
@@ -24231,8 +24297,7 @@ function mergeCells(cells, tableData) {
24231
24297
  // Interior cell (both hMerge and vMerge apply, but OpenXML uses vMerge for rows
24232
24298
  // below the first row and hMerge for columns after the first column in that row)
24233
24299
  return {
24234
- ...cell,
24235
- text: '',
24300
+ ...withCellText(cell, ''),
24236
24301
  hMerge: true,
24237
24302
  vMerge: true,
24238
24303
  gridSpan: undefined,
@@ -24599,41 +24664,6 @@ function deleteTableColumn(tableData, colIdx) {
24599
24664
  return { ...tableData, rows: newRows, columnWidths: newWidths };
24600
24665
  }
24601
24666
 
24602
- /**
24603
- * Return a new `TablePptxElement` with the text of a single cell replaced.
24604
- *
24605
- * The element is not mutated: the affected row and cell are shallow-cloned and
24606
- * every other row/cell is reused by reference. Returns the original element
24607
- * unchanged when it carries no `tableData`.
24608
- *
24609
- * @param element - The source table element (not mutated).
24610
- * @param rowIndex - Zero-based row index of the cell.
24611
- * @param colIndex - Zero-based column index of the cell.
24612
- * @param text - New plain-text content for the cell.
24613
- * @returns A new `TablePptxElement` with the cell text applied.
24614
- *
24615
- * @example
24616
- * ```ts
24617
- * const updated = setCellText(el, 0, 1, "Revenue");
24618
- * ```
24619
- */
24620
- function setCellText(element, rowIndex, colIndex, text) {
24621
- const tableData = element.tableData;
24622
- if (!tableData) {
24623
- return element;
24624
- }
24625
- const rows = tableData.rows.map((row, ri) => {
24626
- if (ri !== rowIndex) {
24627
- return row;
24628
- }
24629
- return {
24630
- ...row,
24631
- cells: row.cells.map((cell, ci) => (ci === colIndex ? { ...cell, text } : cell)),
24632
- };
24633
- });
24634
- return { ...element, tableData: { ...tableData, rows } };
24635
- }
24636
-
24637
24667
  /**
24638
24668
  * Build the render model for a table element's inspector data grid.
24639
24669
  *
@@ -35387,6 +35417,39 @@ function hollowTextFillStyle(s, painted = {}) {
35387
35417
  }
35388
35418
  return hollow;
35389
35419
  }
35420
+ /**
35421
+ * The decoration properties a NESTED span inside a run has to repeat.
35422
+ *
35423
+ * `text-decoration-line` and its colour / style / thickness companions do not
35424
+ * inherit: an ancestor's underline is *drawn through* its inline descendants,
35425
+ * but each descendant still computes `none` of its own. Four bindings never
35426
+ * notice, because shared's per-word split (`splitStyledRun`) clones the whole
35427
+ * run style onto every piece, so the element that directly parents the text
35428
+ * carries the underline. React renders one span per run and nests its per-word
35429
+ * metric pieces and per-script font spans INSIDE it, so the text's own parent
35430
+ * declared no decoration and a hyperlink (underlined by PowerPoint's default,
35431
+ * see {@link segmentStyleToCss}) reported `text-decoration-line: none` where
35432
+ * the other four reported `underline`.
35433
+ *
35434
+ * @returns The decoration subset to merge onto a nested span, or `undefined`
35435
+ * when the run carries no decoration and the span needs nothing.
35436
+ */
35437
+ function nestedTextDecorationStyle(style) {
35438
+ const nested = {};
35439
+ for (const key of [
35440
+ 'textDecoration',
35441
+ 'textDecorationLine',
35442
+ 'textDecorationColor',
35443
+ 'textDecorationStyle',
35444
+ 'textDecorationThickness',
35445
+ ]) {
35446
+ const value = style[key];
35447
+ if (value !== undefined) {
35448
+ nested[key] = value;
35449
+ }
35450
+ }
35451
+ return Object.keys(nested).length > 0 ? nested : undefined;
35452
+ }
35390
35453
  function segmentStyleToCss(seg, fontScale = 1, context = {}) {
35391
35454
  const s = seg.style ?? {};
35392
35455
  const style = {};
@@ -36232,6 +36295,16 @@ function getElementMorphName(element) {
36232
36295
  * counterpart stay whole and dissolve as one object, and ordinary grouped
36233
36296
  * artwork keeps animating as a single unit exactly as before.
36234
36297
  *
36298
+ * "Level" means a level the two slides AGREE on. Real decks wrap the same cast
36299
+ * differently from slide to slide, and the loader used to hide it by flattening
36300
+ * a nested `p:grpSp` into its parent's child list; it no longer does, because
36301
+ * the wrapper's name, fill, locks and animation identity have to survive a
36302
+ * round-trip. A wrapper the counterpart has no group for is therefore taken out
36303
+ * of the way when, and only when, that is what stops the two casts lining up
36304
+ * ({@link expandUnpairedWrappers}); a wrapper both slides have is a real level
36305
+ * and is descended into on its own correspondence, `!!` name or not
36306
+ * ({@link flattenMorphLevel}).
36307
+ *
36235
36308
  * Decomposed children are returned with ABSOLUTE slide coordinates, because
36236
36309
  * that is the space every downstream geometry calculation (deltas, proximity)
36237
36310
  * works in. A binding renders group children as absolutely positioned boxes
@@ -36379,6 +36452,69 @@ function correspondingChildren(a, b) {
36379
36452
  }
36380
36453
  return paired;
36381
36454
  }
36455
+ /**
36456
+ * Replace every group in `children` that `counterpart` has no group to pair
36457
+ * with by its OWN children, offset into the parent's space (recursively).
36458
+ *
36459
+ * Two slides can express the same cast with different WRAPPING. In the issue
36460
+ * #131 deck the hub-adjacent topic slide keeps the panel's disc, button and
36461
+ * three paragraphs as five children of `!!Circle`, while the next topic slide
36462
+ * wraps the three paragraphs in a plain `Group 3` inside the same `!!Circle`:
36463
+ * five objects against three. That wrapper is not an object either slide draws,
36464
+ * it is authoring debris, and PowerPoint carries the disc through the morph
36465
+ * regardless (measured: the disc's centre pixel holds RGB 39,40,42 for the
36466
+ * whole of 4 -> 5, where an unpaired dissolve shows the artwork behind it).
36467
+ *
36468
+ * The loader used to hide this by flattening a nested `p:grpSp` into its
36469
+ * parent's child list, so a morph never saw one. It no longer does - the
36470
+ * wrapper's name, fill, locks and animation identity are real and have to
36471
+ * survive a round-trip - so the morph has to see past the wrapper itself.
36472
+ *
36473
+ * Only a wrapper with NO counterpart group is expanded, and only as a fallback
36474
+ * (see {@link correspondingCast}): a nested group the other slide also has is a
36475
+ * real level of the tree and pairs with its own twin.
36476
+ */
36477
+ function expandUnpairedWrappers(children, counterpart) {
36478
+ let expanded = false;
36479
+ const out = [];
36480
+ for (const child of children) {
36481
+ const nested = groupChildren(child);
36482
+ if (nested && !correspondingGroup(child, counterpart)) {
36483
+ expanded = true;
36484
+ for (const leaf of expandUnpairedWrappers(nested, counterpart) ?? nested) {
36485
+ out.push(toAbsolute(leaf, child.x, child.y));
36486
+ }
36487
+ continue;
36488
+ }
36489
+ out.push(child);
36490
+ }
36491
+ return expanded ? out : undefined;
36492
+ }
36493
+ /**
36494
+ * The correspondence between two paired groups' contents, or `undefined` when
36495
+ * they hold different casts and so must dissolve as whole objects.
36496
+ *
36497
+ * Tried as authored first, so a group that lines up level for level keeps its
36498
+ * levels: a nested group facing a flat shape of the same box is one object
36499
+ * against one object and stays whole. Only when the two casts do NOT line up is
36500
+ * an unpaired wrapper taken out of the way ({@link expandUnpairedWrappers}),
36501
+ * which is the one case where it can be the wrapper that is in the way.
36502
+ */
36503
+ function correspondingCast(children, twinChildren) {
36504
+ const direct = correspondingChildren(children, twinChildren);
36505
+ if (direct) {
36506
+ return { from: [...children], to: [...twinChildren], paired: direct };
36507
+ }
36508
+ const expandedFrom = expandUnpairedWrappers(children, twinChildren);
36509
+ const expandedTo = expandUnpairedWrappers(twinChildren, children);
36510
+ if (!expandedFrom && !expandedTo) {
36511
+ return undefined;
36512
+ }
36513
+ const from = expandedFrom ?? [...children];
36514
+ const to = expandedTo ?? [...twinChildren];
36515
+ const paired = correspondingChildren(from, to);
36516
+ return paired ? { from, to, paired } : undefined;
36517
+ }
36382
36518
  /**
36383
36519
  * The elements of `elements` that a morph should treat as individual units,
36384
36520
  * given the `counterpart` slide's elements at the same level of the tree.
@@ -36387,18 +36523,36 @@ function correspondingChildren(a, b) {
36387
36523
  * absolute coordinates) when it holds a `!!`-named descendant, `counterpart`
36388
36524
  * holds a group it would pair with, AND the two groups hold the same cast of
36389
36525
  * objects; everything else is passed through untouched. See the module comment
36390
- * for why the first two are required and {@link childrenCorrespond} for the
36526
+ * for why the first two are required and {@link correspondingCast} for the
36391
36527
  * third.
36392
36528
  */
36393
36529
  function flattenMorphElements(elements, counterpart, offsetX = 0, offsetY = 0) {
36530
+ return flattenMorphLevel(elements, counterpart, offsetX, offsetY, true);
36531
+ }
36532
+ /**
36533
+ * One level of {@link flattenMorphElements}.
36534
+ *
36535
+ * `topLevel` carries the `!!` requirement, and only the slide's own top level
36536
+ * has it. The prefix is the author naming the containers that take part in the
36537
+ * morph, which is a statement about what the slide shows - not about the
36538
+ * authoring wrappers inside it. Once a group's cast has been shown to
36539
+ * correspond one for one, its members ARE each other's counterparts, and a
36540
+ * nested group among them is descended into on the strength of that
36541
+ * correspondence alone. PowerPoint's own render of the deck's 5 -> 6 crossfades
36542
+ * the three paragraphs inside the unnamed `Group 3` individually (issue #160,
36543
+ * `CreateVideo` at 62.5fps: every frame of the panel is a blend of the two end
36544
+ * states summing to 1.000), which requiring `!!` all the way down would refuse.
36545
+ */
36546
+ function flattenMorphLevel(elements, counterpart, offsetX, offsetY, topLevel) {
36394
36547
  const out = [];
36395
36548
  for (const element of elements) {
36396
36549
  const children = groupChildren(element);
36397
- if (children && containsMorphNamedDescendant(element)) {
36550
+ if (children && (!topLevel || containsMorphNamedDescendant(element))) {
36398
36551
  const twin = correspondingGroup(element, counterpart);
36399
36552
  const twinChildren = twin ? (groupChildren(twin) ?? []) : undefined;
36400
- if (twinChildren && correspondingChildren(children, twinChildren)) {
36401
- out.push(...flattenMorphElements(children, twinChildren, offsetX + element.x, offsetY + element.y));
36553
+ const cast = twinChildren ? correspondingCast(children, twinChildren) : undefined;
36554
+ if (cast) {
36555
+ out.push(...flattenMorphLevel(cast.from, cast.to, offsetX + element.x, offsetY + element.y, false));
36402
36556
  continue;
36403
36557
  }
36404
36558
  }
@@ -36433,26 +36587,26 @@ function flattenMorphElements(elements, counterpart, offsetX = 0, offsetY = 0) {
36433
36587
  */
36434
36588
  function morphGroupChildPairs(elements, counterpart) {
36435
36589
  const pairs = new Map();
36436
- collectGroupChildPairs(elements, counterpart, pairs);
36590
+ collectGroupChildPairs(elements, counterpart, pairs, true);
36437
36591
  return pairs;
36438
36592
  }
36439
36593
  /** Walk both trees the way {@link flattenMorphElements} does, recording pairs. */
36440
- function collectGroupChildPairs(elements, counterpart, into) {
36594
+ function collectGroupChildPairs(elements, counterpart, into, topLevel) {
36441
36595
  for (const element of elements) {
36442
36596
  const children = groupChildren(element);
36443
- if (!children || !containsMorphNamedDescendant(element)) {
36597
+ if (!children || (topLevel && !containsMorphNamedDescendant(element))) {
36444
36598
  continue;
36445
36599
  }
36446
36600
  const twin = correspondingGroup(element, counterpart);
36447
36601
  const twinChildren = twin ? (groupChildren(twin) ?? []) : undefined;
36448
- const corresponded = twinChildren ? correspondingChildren(children, twinChildren) : undefined;
36449
- if (!corresponded) {
36602
+ const cast = twinChildren ? correspondingCast(children, twinChildren) : undefined;
36603
+ if (!cast) {
36450
36604
  continue;
36451
36605
  }
36452
- for (const [child, twinChild] of corresponded) {
36606
+ for (const [child, twinChild] of cast.paired) {
36453
36607
  into.set(child.id, twinChild.id);
36454
36608
  }
36455
- collectGroupChildPairs(children, twinChildren ?? [], into);
36609
+ collectGroupChildPairs(cast.from, cast.to, into, false);
36456
36610
  }
36457
36611
  }
36458
36612
  /**
@@ -38590,6 +38744,60 @@ function generateFullMorphTransition(fromSlide, toSlide, durationMs, mode = 'obj
38590
38744
  return allAnimations;
38591
38745
  }
38592
38746
 
38747
+ /**
38748
+ * The container both halves go in.
38749
+ *
38750
+ * `isolation: isolate` is the load-bearing part: it confines
38751
+ * {@link MORPH_CROSSFADE_HALF_BLEND_MODE} to the pair. The box spans the slide
38752
+ * because each half is positioned within the slide's own coordinate space.
38753
+ */
38754
+ const MORPH_CROSSFADE_GROUP_STYLE = {
38755
+ position: 'absolute',
38756
+ inset: '0',
38757
+ isolation: 'isolate',
38758
+ };
38759
+ /** {@link MORPH_CROSSFADE_GROUP_STYLE} as a `style` attribute value. */
38760
+ const MORPH_CROSSFADE_GROUP_CSS_TEXT = 'position: absolute; inset: 0; isolation: isolate;';
38761
+ /** The blend each half of a grouped pair is painted with. */
38762
+ const MORPH_CROSSFADE_HALF_BLEND_MODE = 'plus-lighter';
38763
+ /** A half's own box: it fills the group, and blends with the other half only. */
38764
+ const MORPH_CROSSFADE_HALF_STYLE = {
38765
+ position: 'absolute',
38766
+ inset: '0',
38767
+ mixBlendMode: MORPH_CROSSFADE_HALF_BLEND_MODE,
38768
+ };
38769
+ /** {@link MORPH_CROSSFADE_HALF_STYLE} as a `style` attribute value. */
38770
+ const MORPH_CROSSFADE_HALF_CSS_TEXT = `position: absolute; inset: 0; mix-blend-mode: ${MORPH_CROSSFADE_HALF_BLEND_MODE};`;
38771
+ /**
38772
+ * Pair up the crossfades the overlay paints both halves of.
38773
+ *
38774
+ * @param pairs - The matched pairs.
38775
+ * @param ghostIds - Outgoing ids the overlay paints (see `resolveMorphGhostIds`).
38776
+ * @param liftedIds - Incoming ids the overlay paints above those ghosts (see
38777
+ * `resolveMorphOverlayArrivals`). Only a LIFTED half is in the same tree as
38778
+ * its ghost, so only these can be grouped.
38779
+ * @param incomingOrder - The incoming slide's elements, flattened, in document
38780
+ * order; the groups come back in that order so the overlay paints them in the
38781
+ * order the slide stacks them.
38782
+ * @returns One group per qualifying pair; empty when none qualify.
38783
+ */
38784
+ function resolveMorphCrossfadeGroups(pairs, ghostIds, liftedIds, incomingOrder) {
38785
+ const byIncomingId = new Map();
38786
+ for (const pair of pairs) {
38787
+ if (ghostIds.has(pair.fromElement.id) && liftedIds.has(pair.toElement.id)) {
38788
+ byIncomingId.set(pair.toElement.id, pair);
38789
+ }
38790
+ }
38791
+ const groups = [];
38792
+ for (const element of incomingOrder) {
38793
+ const pair = byIncomingId.get(element.id);
38794
+ if (pair) {
38795
+ groups.push({ outgoing: pair.fromElement, incoming: pair.toElement });
38796
+ }
38797
+ }
38798
+ return groups;
38799
+ }
38800
+
38593
38801
  /**
38594
38802
  * Keyframes for an incoming shape whose dissolve has been lifted into the
38595
38803
  * overlay: the copy left on the live stage holds at nothing for the whole
@@ -38705,7 +38913,7 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = 'object
38705
38913
  // put it on its own compositing layer and shift its raster by up to a pixel
38706
38914
  // for the duration (issue #161); it still has to be painted, so this asks
38707
38915
  // the ghost set directly rather than reading it off the animation map.
38708
- const outgoingElements = flattenedOutgoing.filter((element) => ghostIds.has(element.id));
38916
+ const ghostElements = flattenedOutgoing.filter((element) => ghostIds.has(element.id));
38709
38917
  // Everything the overlay paints hides whatever the live stage is doing
38710
38918
  // underneath, which is wrong for a shape that ARRIVES on top of a ghost:
38711
38919
  // it dissolves in where nobody can see it and appears in one frame when the
@@ -38743,7 +38951,16 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = 'object
38743
38951
  if (overlayIncomingAnimations.size > 0) {
38744
38952
  keyframes.push(LIFTED_HIDDEN_KEYFRAMES);
38745
38953
  }
38746
- const overlayIncomingElements = flattenedIncoming.filter((element) => overlayIncomingAnimations.has(element.id));
38954
+ // A lifted half whose ghost is painted too is one end of a cross-dissolve
38955
+ // with both ends in this overlay, so the two are handed over as a pair and
38956
+ // taken out of the flat layers. Stacking them there composites them
38957
+ // source-over, which dips their shared ink toward the backdrop instead of
38958
+ // summing it the way PowerPoint's own blend does (issue #161).
38959
+ const crossfadeGroups = resolveMorphCrossfadeGroups(match.pairs, ghostIds, new Set(overlayIncomingAnimations.keys()), flattenedIncoming);
38960
+ const groupedOutgoingIds = new Set(crossfadeGroups.map((group) => group.outgoing.id));
38961
+ const groupedIncomingIds = new Set(crossfadeGroups.map((group) => group.incoming.id));
38962
+ const outgoingElements = ghostElements.filter((element) => !groupedOutgoingIds.has(element.id));
38963
+ const overlayIncomingElements = flattenedIncoming.filter((element) => overlayIncomingAnimations.has(element.id) && !groupedIncomingIds.has(element.id));
38747
38964
  return {
38748
38965
  keyframesCss: keyframes.join('\n'),
38749
38966
  incomingAnimations,
@@ -38753,6 +38970,7 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = 'object
38753
38970
  overlayIncomingAnimations,
38754
38971
  outgoingElements,
38755
38972
  overlayIncomingElements,
38973
+ crossfadeGroups,
38756
38974
  durationMs,
38757
38975
  };
38758
38976
  }
@@ -70412,7 +70630,7 @@ function createLocalStorageBackend(namespace) {
70412
70630
  /** Try IndexedDB first; fall back to localStorage on any failure. */
70413
70631
  async function resolveBackend(dbName, namespace) {
70414
70632
  try {
70415
- const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-AerX-Co2.mjs');
70633
+ const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-DMh0BnTV.mjs');
70416
70634
  const db = await openChatDb(dbName);
70417
70635
  return createIdbBackend(db);
70418
70636
  }
@@ -79777,6 +79995,18 @@ class AnimationPlaybackService {
79777
79995
  this.ctx = {
79778
79996
  setStates: (updater) => {
79779
79997
  this.presentationElementStates.set(updater(this.presentationElementStates()));
79998
+ // Stamp the DOM NOW, in the same task as the input that caused the step.
79999
+ // The overlay also applies the state reactively (effect -> afterNextRender),
80000
+ // but that lands one change-detection cycle plus one render hook later:
80001
+ // measured at ~24ms (1.5 frames) after the ArrowRight that starts a
80002
+ // click-group, where React / Vue / Svelte / Vanilla all have the
80003
+ // animation on the element within the key handler's own task. The delay
80004
+ // is a real dropped frame at the start of every entrance, and it makes
80005
+ // the show observably lag its own input (`e2e/animation-entry-state.spec.ts`
80006
+ // reads the inline `animation` right after the key press and saw nothing).
80007
+ // Only playback steps route through here; the per-slide seed in
80008
+ // `setSlide` deliberately does not (see `onlyWhenStaged`).
80009
+ this.applyStyles?.();
79780
80010
  },
79781
80011
  timers: this.timers,
79782
80012
  buildHandle: this.buildHandle,
@@ -79802,6 +80032,17 @@ class AnimationPlaybackService {
79802
80032
  setActionSoundHandler(handler) {
79803
80033
  this.onPlayActionSound = handler;
79804
80034
  }
80035
+ /**
80036
+ * Register the DOM applier that stamps the element states onto the rendered
80037
+ * stage ({@link PresentationStageAnimator.applyAnimationStyles}). It is run
80038
+ * SYNCHRONOUSLY on every playback state change, so a click-advance starts its
80039
+ * entrance in the same task as the key press instead of waiting for Angular's
80040
+ * next change-detection + render pass. Pass an applier that no-ops while the
80041
+ * stage still shows another slide (`onlyWhenStaged`).
80042
+ */
80043
+ setStyleApplier(apply) {
80044
+ this.applyStyles = apply;
80045
+ }
79805
80046
  animationsEnabled() {
79806
80047
  return this.showWithAnimation !== false;
79807
80048
  }
@@ -95291,6 +95532,16 @@ function hasExitedFullscreen(doc) {
95291
95532
  return !d?.fullscreenElement;
95292
95533
  }
95293
95534
 
95535
+ /** True when at least one staged node belongs to the tracked element states. */
95536
+ function stageHoldsTrackedElement(nodes, states) {
95537
+ for (let i = 0; i < nodes.length; i++) {
95538
+ const id = nodes[i].dataset['elementId'];
95539
+ if (id && states.has(id)) {
95540
+ return true;
95541
+ }
95542
+ }
95543
+ return false;
95544
+ }
95294
95545
  /** Resolve the nearest element id above a pointer target, if any. */
95295
95546
  function closestElementId(target) {
95296
95547
  if (!(target instanceof Element)) {
@@ -95315,8 +95566,17 @@ class PresentationStageAnimator {
95315
95566
  * cursor on interactive / hover trigger shapes. Mirrors the Vue
95316
95567
  * `applyAnimationStyles`. Structural reveals (chart / SmartArt build, fill /
95317
95568
  * stroke inherit) are applied declaratively by the renderers themselves.
95569
+ *
95570
+ * @param options.onlyWhenStaged - Skip entirely unless the stage already holds
95571
+ * a node for at least one tracked element id. Used by the SYNCHRONOUS apply
95572
+ * the playback service fires the instant a click-group's states change
95573
+ * (see {@link AnimationPlaybackService.setStyleApplier}): on a slide change
95574
+ * the states describe the INCOMING slide while the stage still holds the
95575
+ * outgoing one, and clearing the outgoing nodes' `visibility` mid-transition
95576
+ * would reveal shapes whose entrance never played. In that case the
95577
+ * `afterNextRender` pass in the overlay is the correct (and only) applier.
95318
95578
  */
95319
- applyAnimationStyles() {
95579
+ applyAnimationStyles(options) {
95320
95580
  const root = this.stageRoot();
95321
95581
  if (!root) {
95322
95582
  return;
@@ -95325,6 +95585,9 @@ class PresentationStageAnimator {
95325
95585
  const interactive = this.playback.interactiveTriggerShapeIds();
95326
95586
  const hover = this.playback.hoverTriggerShapeIds();
95327
95587
  const nodes = root.querySelectorAll('[data-element-id]');
95588
+ if (options?.onlyWhenStaged && !stageHoldsTrackedElement(nodes, states)) {
95589
+ return;
95590
+ }
95328
95591
  nodes.forEach((el) => {
95329
95592
  const id = el.dataset['elementId'];
95330
95593
  if (!id) {
@@ -96598,6 +96861,36 @@ function morphLiftedSlide(plan, incomingSlide) {
96598
96861
  }
96599
96862
  return { ...incomingSlide, elements: [...plan.overlayIncomingElements] };
96600
96863
  }
96864
+ /**
96865
+ * The pairs the overlay paints BOTH halves of, as one isolated group each.
96866
+ *
96867
+ * Stacking the halves composites them source-over, which leaves the ink they
96868
+ * share at 0.75 of full strength halfway through instead of summing it, biting
96869
+ * chunks out of glyphs that cross during a text dissolve. PowerPoint's own
96870
+ * render holds the two blend coefficients at a sum of 1.0 for every frame
96871
+ * (issue #161), which `isolation: isolate` plus `mix-blend-mode: plus-lighter`
96872
+ * on the two halves reproduces.
96873
+ *
96874
+ * Exported and pure so it can be unit-tested: this package renders no component
96875
+ * under test (see `action-settings-panel.component.test.ts`).
96876
+ */
96877
+ function morphCrossfadeGroupSlides(plan, outgoingSlide, incomingSlide) {
96878
+ if (!plan || !outgoingSlide || !incomingSlide) {
96879
+ return [];
96880
+ }
96881
+ return plan.crossfadeGroups.map((group, index) => ({
96882
+ key: group.incoming.id,
96883
+ style: {
96884
+ ...MORPH_CROSSFADE_GROUP_STYLE,
96885
+ // `isolation` makes the group a stacking context, so it carries a
96886
+ // z-index of its own to stay above the ghost layer (40) and the lifted
96887
+ // layer (41) its halves came from.
96888
+ 'z-index': String(42 + index),
96889
+ },
96890
+ outgoing: { ...outgoingSlide, elements: [group.outgoing] },
96891
+ incoming: { ...incomingSlide, elements: [group.incoming] },
96892
+ }));
96893
+ }
96601
96894
  /**
96602
96895
  * PresentationTransitionOverlayComponent: plays a PowerPoint slide transition
96603
96896
  * over the presentation stage.
@@ -96746,6 +97039,16 @@ class PresentationTransitionOverlayComponent {
96746
97039
  */
96747
97040
  this.liftedSlide = computed(() => morphLiftedSlide(this.morphPlan(), this.incomingSlide()), /* @ts-ignore */
96748
97041
  ...(ngDevMode ? [{ debugName: "liftedSlide" }] : /* istanbul ignore next */ []));
97042
+ /**
97043
+ * The cross-dissolving pairs this overlay paints both halves of, each in its
97044
+ * own isolated group so the halves are summed rather than stacked.
97045
+ */
97046
+ this.crossfadeGroups = computed(() => morphCrossfadeGroupSlides(this.morphPlan(), this.outgoingSlide(), this.incomingSlide()), /* @ts-ignore */
97047
+ ...(ngDevMode ? [{ debugName: "crossfadeGroups" }] : /* istanbul ignore next */ []));
97048
+ /** Both halves of a grouped pair blend additively, and only with each other. */
97049
+ this.crossfadeHalfStyle = {
97050
+ 'mix-blend-mode': MORPH_CROSSFADE_HALF_BLEND_MODE,
97051
+ };
96749
97052
  /** Layer container style: animation + stacking relative to the stage. */
96750
97053
  this.layerStyle = computed(() => {
96751
97054
  const anims = this.animations();
@@ -96907,6 +97210,49 @@ class PresentationTransitionOverlayComponent {
96907
97210
  </div>
96908
97211
  </div>
96909
97212
  }
97213
+
97214
+ <!-- A pair dissolving in place, painted as ONE isolated group whose two
97215
+ halves sum instead of stacking (issue #161). -->
97216
+ @for (group of crossfadeGroups(); track group.key) {
97217
+ <div [attr.data-pptx-morph-crossfade]="group.key" [ngStyle]="group.style">
97218
+ <div
97219
+ class="pptx-ng-transition-layer"
97220
+ data-pptx-transition-layer="outgoing"
97221
+ data-pptx-morph-outgoing="true"
97222
+ [ngStyle]="crossfadeHalfStyle"
97223
+ >
97224
+ <div [ngStyle]="slideBoxStyle()">
97225
+ <pptx-slide-canvas
97226
+ [slide]="group.outgoing"
97227
+ [canvasSize]="canvasSize()"
97228
+ [mediaDataUrls]="mediaDataUrls()"
97229
+ [zoom]="zoom()"
97230
+ [autoFit]="false"
97231
+ [interactive]="false"
97232
+ [transparentBackground]="true"
97233
+ />
97234
+ </div>
97235
+ </div>
97236
+ <div
97237
+ class="pptx-ng-transition-layer"
97238
+ data-pptx-transition-layer="lifted"
97239
+ data-pptx-morph-lifted="true"
97240
+ [ngStyle]="crossfadeHalfStyle"
97241
+ >
97242
+ <div [ngStyle]="slideBoxStyle()">
97243
+ <pptx-slide-canvas
97244
+ [slide]="group.incoming"
97245
+ [canvasSize]="canvasSize()"
97246
+ [mediaDataUrls]="mediaDataUrls()"
97247
+ [zoom]="zoom()"
97248
+ [autoFit]="false"
97249
+ [interactive]="false"
97250
+ [transparentBackground]="true"
97251
+ />
97252
+ </div>
97253
+ </div>
97254
+ </div>
97255
+ }
96910
97256
  `, isInline: true, styles: [":host{display:block;position:absolute;inset:0;overflow:hidden;pointer-events:none}.pptx-ng-transition-layer{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
96911
97257
  }
96912
97258
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: PresentationTransitionOverlayComponent, decorators: [{
@@ -96954,6 +97300,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
96954
97300
  </div>
96955
97301
  </div>
96956
97302
  }
97303
+
97304
+ <!-- A pair dissolving in place, painted as ONE isolated group whose two
97305
+ halves sum instead of stacking (issue #161). -->
97306
+ @for (group of crossfadeGroups(); track group.key) {
97307
+ <div [attr.data-pptx-morph-crossfade]="group.key" [ngStyle]="group.style">
97308
+ <div
97309
+ class="pptx-ng-transition-layer"
97310
+ data-pptx-transition-layer="outgoing"
97311
+ data-pptx-morph-outgoing="true"
97312
+ [ngStyle]="crossfadeHalfStyle"
97313
+ >
97314
+ <div [ngStyle]="slideBoxStyle()">
97315
+ <pptx-slide-canvas
97316
+ [slide]="group.outgoing"
97317
+ [canvasSize]="canvasSize()"
97318
+ [mediaDataUrls]="mediaDataUrls()"
97319
+ [zoom]="zoom()"
97320
+ [autoFit]="false"
97321
+ [interactive]="false"
97322
+ [transparentBackground]="true"
97323
+ />
97324
+ </div>
97325
+ </div>
97326
+ <div
97327
+ class="pptx-ng-transition-layer"
97328
+ data-pptx-transition-layer="lifted"
97329
+ data-pptx-morph-lifted="true"
97330
+ [ngStyle]="crossfadeHalfStyle"
97331
+ >
97332
+ <div [ngStyle]="slideBoxStyle()">
97333
+ <pptx-slide-canvas
97334
+ [slide]="group.incoming"
97335
+ [canvasSize]="canvasSize()"
97336
+ [mediaDataUrls]="mediaDataUrls()"
97337
+ [zoom]="zoom()"
97338
+ [autoFit]="false"
97339
+ [interactive]="false"
97340
+ [transparentBackground]="true"
97341
+ />
97342
+ </div>
97343
+ </div>
97344
+ </div>
97345
+ }
96957
97346
  `, styles: [":host{display:block;position:absolute;inset:0;overflow:hidden;pointer-events:none}.pptx-ng-transition-layer{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}\n"] }]
96958
97347
  }], ctorParameters: () => [], propDecorators: { outgoingSlide: [{ type: i0.Input, args: [{ isSignal: true, alias: "outgoingSlide", required: true }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], transition: [{ type: i0.Input, args: [{ isSignal: true, alias: "transition", required: true }] }], templateElements: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateElements", required: false }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], durationMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "durationMs", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], incomingSlide: [{ type: i0.Input, args: [{ isSignal: true, alias: "incomingSlide", required: false }] }], complete: [{ type: i0.Output, args: ["complete"] }] } });
96959
97348
 
@@ -97428,6 +97817,13 @@ class PresentationOverlayComponent {
97428
97817
  });
97429
97818
  // Scope media-command (`p:cmd`) target lookups to the slide stage.
97430
97819
  this.playback.setFrameRoot(() => this.stageRef()?.nativeElement ?? null);
97820
+ // Stamp a playback step onto the DOM in the SAME task as the input that
97821
+ // caused it. The reactive path below (effect -> afterNextRender) is still
97822
+ // the applier for a slide change, but it lands ~24ms after a click-advance,
97823
+ // so the first frame of every entrance was dropped and the show visibly
97824
+ // lagged its own key press. `onlyWhenStaged` keeps this out of the slide
97825
+ // swap, where the states describe a slide the stage has not rendered yet.
97826
+ this.playback.setStyleApplier(() => this.stageAnimator.applyAnimationStyles({ onlyWhenStaged: true }));
97431
97827
  // Wire the zoom-navigation context to this overlay's slide navigation so a
97432
97828
  // descendant zoom tile can jump to its target slide on click.
97433
97829
  this.zoomNavigation.setHandler((index) => this.navigator.goToSlide(index));
@@ -103690,7 +104086,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
103690
104086
  }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
103691
104087
 
103692
104088
  // Generated by scripts/inline-shared.mjs from package.json. Do not edit.
103693
- const PPTX_ANGULAR_VIEWER_VERSION = "2.17.9";
104089
+ const PPTX_ANGULAR_VIEWER_VERSION = "2.18.1";
103694
104090
 
103695
104091
  /**
103696
104092
  * account-page.component.ts: File > Account content.
@@ -136834,4 +137230,4 @@ function cn(...values) {
136834
137230
  */
136835
137231
 
136836
137232
  export { CommentsPanelComponent as $, ALIGN_OPTIONS as A, AnimationPlaybackService as B, AutosaveRecoveryDialogComponent as C, AutosaveService as D, BroadcastDialogComponent as E, CHART_EDITOR_STYLES as F, CURSOR_PALETTE as G, CanvasFitService as H, ChartAxisOptionsComponent as I, ChartAxisStyleOptionsComponent as J, ChartComboTypeOptionsComponent as K, ChartDataEditorComponent as L, ChartDataLabelOptionsComponent as M, ChartDatapointMarkerOptionsComponent as N, ChartDatapointOptionsComponent as O, ChartDisplayOptionsComponent as P, ChartElementViewComponent as Q, ChartErrorBarOptionsComponent as R, ChartMarkerOptionsComponent as S, ChartPartSelectionService as T, ChartPrimitivesComponent as U, ChartRendererComponent as V, ChartTrendlineOptionsComponent as W, CollaborationCursorsComponent as X, CollaborationService as Y, ColorChangedImageComponent as Z, CommentMarkersOverlayComponent as _, ANIMATION_PRESET_CATEGORIES as a, InspectorPanelComponent as a$, CommentsService as a0, ComparePanelComponent as a1, ConnectorRendererComponent as a2, ConnectorTextOverlayComponent as a3, CustomShowsComponent as a4, DATA_TABLE_HEADER_H as a5, DATA_TABLE_KEY_W as a6, DATA_TABLE_PADDING as a7, DATA_TABLE_ROW_H as a8, DEFAULT_BOUNDS as a9, EditorToolbarComponent as aA, EffectsPanelComponent as aB, ElementRendererComponent as aC, EmbeddedFontsService as aD, EncryptedFileDialogComponent as aE, EquationEditorDialogComponent as aF, EquationRendererComponent as aG, EquationTemplateGalleryComponent as aH, ExportProgressModalComponent as aI, ExportService as aJ, FieldContextService as aK, FindBarComponent as aL, FindReplaceBarComponent as aM, FollowModeBarComponent as aN, FontEmbeddingListComponent as aO, FontEmbeddingPanelComponent as aP, GALLERY_THEME_PRESETS as aQ, GRIDLINE_COLOR as aR, GradientPickerComponent as aS, HANDOUT_OPTIONS as aT, HeaderFooterDialogComponent as aU, HyperlinkDialogComponent as aV, ImagePropertiesPanelComponent as aW, InkDrawingService as aX, InkRendererComponent as aY, InsertSmartArtDialogComponent as aZ, InspectorPaneHeaderComponent as a_, DEFAULT_BROADCAST_SERVER_URL as aa, DEFAULT_CANVAS_HEIGHT as ab, DEFAULT_CANVAS_WIDTH as ac, DEFAULT_COLOR_SCHEME as ad, DEFAULT_FILL_COLOR as ae, DEFAULT_LAYOUT as af, DEFAULT_PALETTE$1 as ag, DEFAULT_PATTERN_FILL_PRESET as ah, DEFAULT_PRINT_SETTINGS as ai, DEFAULT_SLIDE_BACKGROUND as aj, DEFAULT_STROKE_COLOR as ak, DEFAULT_STYLE as al, DEFAULT_TABLE_ROW_HEIGHT as am, DEFAULT_TEXT_COLOR$1 as an, DEFAULT_VIEWER_PROFILE as ao, DIRECTIONAL_PRESETS as ap, DIRECTION_OPTIONS as aq, DocumentPropertiesCardComponent as ar, EMBEDDED_FONTS_STYLE_ID as as, EMPHASIS_PRESETS as at, ENTRANCE_PRESETS as au, TEMPLATES as av, EXIT_PRESETS as aw, EditorContextMenuComponent as ax, EditorHistory as ay, EditorStateService as az, AUDIENCE_HASH as b, RibbonComponent as b$, IsMobileService as b0, KeepAnnotationsDialogComponent as b1, LOCALE_CATALOG as b2, LONG_PRESS_DURATION_MS as b3, LONG_PRESS_MOVE_TOLERANCE_PX as b4, LoadContentService as b5, LocalPresencePublisher as b6, MAX_ZOOM_SCALE as b7, MIN_ZOOM_SCALE as b8, MOTION_PATH_COLUMNS as b9, PasswordStrengthMeterComponent as bA, PowerPointViewerComponent as bB, PresentToolbarAutoHide as bC, PresentationAnnotationOverlayComponent as bD, PresentationAnnotationsService as bE, PresentationOverlayComponent as bF, PresentationPropertiesPanelComponent as bG, PresentationSettingsCardComponent as bH, PresentationSubtitleBarComponent as bI, PresentationToolbarComponent as bJ, PresentationTransitionOverlayComponent as bK, PresenterViewComponent as bL, PresenterWindowService as bM, PrintDialogComponent as bN, PrintService as bO, PrintSettingsPanelComponent as bP, PropertiesDialogComponent as bQ, REPEAT_MODE_OPTIONS as bR, RESIZE_HANDLES as bS, RULER_FONT_SIZE as bT, RULER_THICKNESS as bU, ReadingViewOverlayComponent as bV, RemoteSelectionOverlayComponent as bW, RibbonAnimationGalleryComponent as bX, RibbonAnimationsSectionComponent as bY, RibbonArrangeSectionComponent as bZ, RibbonColorPopoverComponent as b_, MediaPreviewComponent as ba, MediaPropertiesPanelComponent as bb, MediaRendererComponent as bc, MediaTrimTimelineComponent as bd, MobileBottomBarComponent as be, MobileMenuSheetComponent as bf, MobilePresenterViewComponent as bg, MobileSheetComponent as bh, MobileSlidesSheetComponent as bi, MobileToolbarComponent as bj, ModalDialogComponent as bk, Model3DRendererComponent as bl, NotesHandoutCardComponent as bm, NotesPanelComponent as bn, NotesToolbarComponent as bo, OleRendererComponent as bp, OutlineViewOverlayComponent as bq, POWER_POINT_VIEWER_PROVIDERS as br, PPTX_OPEN_ACCEPT as bs, PRESENTATION_OPEN_EXTENSIONS as bt, PRESENTER_CHANNEL_NAME as bu, PRESENTER_MSG_ORIGIN as bv, PRESENTER_TIMER_SEGMENT_MS as bw, PX_PER_CM as bx, PX_PER_INCH as by, PasswordProtectionDialogComponent as bz, AUDIENCE_NONCE_KEY as c, TEXT_3D_TOP_BEVEL_KEYS as c$, RibbonDesignSectionComponent as c0, RibbonDrawSectionComponent as c1, RibbonDrawingGroupComponent as c2, RibbonEditingSectionComponent as c3, RibbonFileSectionComponent as c4, RibbonFontControlsComponent as c5, RibbonHomeSectionComponent as c6, RibbonHyperlinkButtonComponent as c7, RibbonInsertFieldsComponent as c8, RibbonInsertSectionComponent as c9, SettingsLanguageTabComponent as cA, ShareDialogComponent as cB, ShortcutPanelComponent as cC, ShowOptionsFieldsetComponent as cD, ShowSlidesFieldsetComponent as cE, SignatureStrippedDialogComponent as cF, SignaturesPanelComponent as cG, SignaturesService as cH, SlideBackgroundCardComponent as cI, SlideCanvasComponent as cJ, SlideDefaultInspectorComponent as cK, SlideDiffChangesComponent as cL, SlideDiffRowComponent as cM, SlideDiffThumbnailsComponent as cN, SlideSizeCardComponent as cO, SlideSorterOverlayComponent as cP, SlideThemeOverridePanelComponent as cQ, SlideTransitionCardComponent as cR, SlidesPanelComponent as cS, SmartArt3DRendererComponent as cT, SmartArt3DService as cU, SmartArtPreviewComponent as cV, SmartArtPropertiesComponent as cW, SmartArtRendererComponent as cX, StatusBarComponent as cY, TABLE_STRUCTURE_TOGGLES as cZ, TEXT_3D_BOTTOM_BEVEL_KEYS as c_, RibbonMotionPathGalleryComponent as ca, RibbonParagraphControlsComponent as cb, RibbonPrimaryRowComponent as cc, RibbonReviewSectionComponent as cd, RibbonShapeExtrasComponent as ce, RibbonSlideshowSectionComponent as cf, RibbonTransitionsSectionComponent as cg, RibbonViewSectionComponent as ch, RulerGuidesService as ci, SEQUENCE_OPTIONS as cj, SEVERITY_GROUPS as ck, SEVERITY_LABELS as cl, SHORTCUT_REFERENCE_ITEMS as cm, SLIDE_TRANSITION_KEYFRAMES as cn, DEFAULT_PALETTE as co, PALETTES$1 as cp, SMART_ART_COLOR_SCHEMES as cq, SMART_ART_STYLE_OPTIONS as cr, SUB_ITEM_LABEL as cs, SVG_WARP_PRESETS as ct, SWIPE_MAX_VERTICAL_PX as cu, SWIPE_THRESHOLD_PX as cv, SelectionPaneComponent as cw, SetUpSlideShowDialogComponent as cx, SettingsAppearanceTabComponent as cy, SettingsDialogComponent as cz, AVATAR_COLOR_SWATCHES as d, animationPresetLabelKey as d$, TEXT_DIRECTION_OPTIONS$1 as d0, THEME_CATALOG as d1, TIMING_CURVE_OPTIONS as d2, TRIGGER_OPTIONS as d3, TYPE_LABELS as d4, TableCellAdvancedFillComponent as d5, TableCellFormattingComponent as d6, TableDataEditorComponent as d7, TablePropertiesComponent as d8, TableRendererComponent as d9, ViewerFileIOService as dA, ViewerFindReplaceService as dB, ViewerFormatPainterService as dC, ViewerInspectorPanelService as dD, ViewerKeyboardService as dE, ViewerMobileSheetService as dF, ViewerPresentationModeService as dG, ViewerThemeGalleryService as dH, ViewerTouchGesturesService as dI, ViewerZoomService as dJ, WEBM_MIME_CANDIDATES as dK, WriteBackScheduler as dL, ZERO_LINE_COLOR as dM, ZoomNavigationService as dN, ZoomRendererComponent as dO, ZoomTargetService as dP, addCategory as dQ, addCommentToList as dR, addGradientStopPatch as dS, addItem as dT, addSeries as dU, addSubItem as dV, advanceStep as dW, affordanceElements as dX, aiToggleVisible as dY, alignPatch as dZ, animationFor as d_, TableResizeOverlayComponent as da, TableSelectionService as db, TagsCardComponent as dc, Text3DBevelSectionComponent as dd, Text3DPanelComponent as de, TextAdvancedPanelComponent as df, ThemeEditorFieldsComponent as dg, ThemeGalleryComponent as dh, ThemeSelectorCardComponent as di, TitleBarComponent as dj, TitleBarSearchComponent as dk, TransitionDirectionPickerComponent as dl, TransitionPreviewComponent as dm, VALIGN_OPTIONS as dn, VIEWER_THEME as dp, VersionHistoryPanelComponent as dq, ViewerCanvasEditingService as dr, ViewerCollabCursorService as ds, ViewerCollaborationSessionService as dt, ViewerCompareService as du, ViewerCustomShowsService as dv, ViewerDialogsService as dw, ViewerDocumentPropertiesService as dx, ViewerExportService as dy, ViewerExtraDialogsComponent as dz, AXIS_LABEL_COLOR as e, buildWaterfallViewModel as e$, annotationMapToInkInserts as e0, applyAcceptedDiff as e1, applyAnimationPreset as e2, applyFindReplacements as e3, applyFormatToElement as e4, applyMove as e5, applyResize as e6, applyTableStylePreset as e7, asMediaElement as e8, assignUserColor as e9, buildEquationElement as eA, buildEquationSegment as eB, buildFallbackViewModel as eC, buildFontFaceRule as eD, buildGradientFillCss as eE, buildGridlinesAndLabels as eF, buildHyperlinkPatch as eG, buildInkContainerStyle as eH, buildInkStrokes as eI, buildLegend as eJ, buildModel3DContainerStyle as eK, buildModel3DViewModel as eL, buildOleActionModel as eM, buildOleInfoRows as eN, buildPatternFillCss as eO, buildPrintHtmlDocument as eP, buildPropertiesPatch as eQ, buildRegionMapViewModel as eR, buildSaveSlides as eS, buildShareUrl as eT, buildSmartArtInsertElement as eU, buildSmartArtNodes as eV, buildStockViewModel as eW, buildSurfaceViewModel as eX, buildTableViewModel as eY, buildTreemapViewModel as eZ, buildTrimFragment as e_, attachShowVisibilityPause as ea, attachTouchGestures as eb, axisTickValues as ec, beginNodeEdit as ed, bevelSizePatch as ee, boolFromEvent as ef, bringForward as eg, bringToFront as eh, buildBarActions as ei, buildBroadcastConfig as ej, buildBroadcastViewerUrl as ek, buildCategoryLabels as el, buildCellParagraphs as em, buildChartViewModel as en, buildChatLogExport as eo, buildChatLogMarkdown as ep, buildChromeStyle as eq, buildClearHyperlinkPatch as er, buildClickGroups as es, buildColStyles as et, buildCollaborationConfig as eu, buildComboViewModel as ev, buildCssGradientFromShapeStyle as ew, buildDuotoneFilter as ex, buildDuotoneFilterId as ey, buildEmbeddedFontStyles as ez, AccessibilityPanelComponent as f, computeScatterXDomain as f$, buildZeroLine as f0, buildZoomContainerStyle as f1, buildZoomViewModel as f2, bulletIndentPx as f3, canAddTopLevelNode as f4, canGroupSelection as f5, canRemoveTopLevelNode as f6, canSetStrokeWidth as f7, canStartBroadcast as f8, canStartShare as f9, commitNodeText as fA, computeAlign as fB, computeAxisTitlePrimitives as fC, computeBarRects as fD, computeBubbleRadius as fE, computeCornerHandle as fF, computeDataTablePrimitives as fG, computeDistribute as fH, computeDrawingViewBox as fI, computeErrorBarPrimitives as fJ, computeFocusTargets as fK, computeHandleBoxes as fL, computeHandoutLayout as fM, computeIsMobile as fN, computeIsTablet as fO, computeLinePoints as fP, computeLinearRegression as fQ, computePageCount as fR, computePieLayout as fS, computePieSlicePath as fT, computePieSlices as fU, computePlotLayout as fV, computeRSquared as fW, computeRadarPoints as fX, computeResizeHandleBoxes as fY, computeRotateHandleBox as fZ, computeScatterDots as f_, canUngroupSelection as fa, canUseClipboard as fb, captionDisplayText as fc, cellRunStyle as fd, cellStyleToStyleMap as fe, cellTdStyle as ff, changeCountLabel as fg, changeIcon as fh, characterSpacingPatch as fi, chartPreserveAspectRatio as fj, checkFontAvailable as fk, clampCursorPosition as fl, clampGifDimensions as fm, clampIndex as fn, clampNotesFontSize as fo, clampScale as fp, clampStep as fq, clearAllLocalViewerData as fr, clearAudienceContent as fs, cn as ft, collectAccessibilityIssues as fu, collectElementText as fv, collectSlideText as fw, collectStoredChats as fx, collectUsedFontFamilies as fy, columnWidthStyle as fz, AccessibilityService as g, formatAxisValue as g$, computeSelectionBoxes as g0, computeSingleSelected as g1, computeSlideIndices as g2, computeSnap as g3, computeStackedBarRects as g4, computeStackedValueRange as g5, computeTrendlinePrimitives as g6, computeValueRange as g7, convertOmmlToMathMl as g8, copyFormatFromElement as g9, durationOf as gA, effectsStateOf as gB, enableGlowPatch as gC, enableInnerShadowPatch as gD, enableOuterShadowPatch as gE, enableReflectionPatch as gF, enableSoftEdgePatch as gG, encodeGif as gH, endShowMediaCleanup as gI, estimatePageCount as gJ, evenColumnWidths as gK, evenRowHeights as gL, exitPresentationFullscreen as gM, exportAiChatLogs as gN, extractPathPoints as gO, eyedropperAvailable as gP, fillColorOf as gQ, findInSlides as gR, findOwningSlideIndex as gS, findSlideIndexByElementId as gT, firstVisibleIndex as gU, fitPolynomial as gV, fitZoom as gW, focusTargetChips as gX, fontMimeForFormat as gY, fontSizeOf as gZ, forgetSessionDeck as g_, countAccessibilityIssues as ga, countAnnotationStrokes as gb, createAngularAiBridge as gc, createCustomShow as gd, createSwipeDismissDrag as ge, createWebrtcBundle as gf, createWebsocketBundle as gg, cssObjectToStyleMap as gh, currentColorScheme as gi, currentLayout as gj, currentStyle as gk, defaultCssVars as gl, defaultRadius as gm, defaultThemeColors as gn, deleteElementsByIds as go, deleteVersion as gp, demoteNode as gq, deriveModel3DBlobUrl as gr, derivePresenceList as gs, describeSmartArtBounds as gt, disableGlowPatch as gu, disableInnerShadowPatch as gv, disableOuterShadowPatch as gw, disableReflectionPatch as gx, disableSoftEdgePatch as gy, duplicateElementById as gz, AccountPageComponent as h, isInjectableUrl as h$, formatBytes as h0, formatCursorLabel as h1, formatElapsed as h2, formatFileSize as h3, formatPropertyDate as h4, formatTime as h5, fpsToFrameIntervalMs as h6, generateBroadcastRoomId as h7, generateCommentId as h8, generateCustomShowId as h9, getTextWarp as hA, getTouchDistance as hB, getWarpCategory as hC, getWarpPath as hD, gradientStateFromStyle as hE, gradientStateOf as hF, gradientStatePatch as hG, gridColumns as hH, groupIssuesBySeverity as hI, hasAnimation as hJ, hasCopyableFormat as hK, hasExistingLink as hL, hasExitedFullscreen as hM, hasGradientFill as hN, hasPressureVariation as hO, hasVisibleSlideAfter as hP, headerLabel as hQ, imageDimensions as hR, inkViewBox as hS, insertTableElementColumn as hT, insertTableElementRow as hU, interpolateWidth as hV, isAudienceTab as hW, isBold as hX, isBrowserOpenableMime as hY, isChildNode as hZ, isElementInteractive as h_, generatePressureCircles as ha, generateTicks as hb, getClrChangeParams as hc, getContainerStyle as hd, getDuotoneFilterDef as he, getImageSrc as hf, getLocalStorageUsageSummary as hg, getOleAriaLabel as hh, getOleBadgeLabel as hi, getOleDisplayName as hj, getOleDownloadFileName as hk, getOleTypeColor as hl, getOleTypeLabel as hm, getPasswordStrength as hn, getPatternSvg as ho, getPlaceholderStyle as hp, getVersions as hq, getResolvedShapeClipPath as hr, getResolvedShapeClipPathFor as hs, getSessionTabId as ht, getShapeFillStrokeStyle as hu, getSlideBackgroundStyle as hv, getSlideTransitionAnimations as hw, getSmartArtNodeBounds as hx, getSpeechRecognitionCtor as hy, getTextBlockStyle as hz, ActionSettingsPanelComponent as i, parseAudienceNonce as i$, isItalic as i0, isLegacyBinaryPresentation as i1, isPpactionUrl as i2, isPresenterMessage as i3, isSigned as i4, isSupportedPresentationFile as i5, isTextElement as i6, isTwoTableFocus as i7, isUnderline as i8, isUrlSafe as i9, narrowToCircle as iA, narrowToPolygon as iB, narrowToRect as iC, newChartElement as iD, newEquationElement as iE, newPresetShapeElement as iF, newShapeElement as iG, newSmartArtElement as iH, newTableElement as iI, newTextElement as iJ, nextVisibleIndex as iK, nodeBold as iL, nodeEditBox as iM, nodeFillColor as iN, nodeFontColor as iO, nodeIdFromKey as iP, nodeItalic as iQ, nodeStyle as iR, normalizeFontFormat as iS, normalizeSlidesPerPage as iT, normalizeValue as iU, numFromEvent as iV, ommlToMathml as iW, ooxmlDashToCssBorderStyle as iX, openNativeEyeDropper as iY, overallStatus as iZ, paletteColor as i_, isValidRoomId as ia, isViewportBackgroundPressTarget as ib, isZoomActivationKey as ic, issueTrackKey as id, issueTypeLabel as ie, keyToLabel as ig, lastVisibleIndex as ih, latexToMathml as ii, layoutConnectorPaints as ij, layoutNodeLabels as ik, linePointsToSvgString as il, lineSpacingPatch as im, loadAudienceContent as io, loadSessionDeck as ip, mediaFallbackFor as iq, mediaSurfaceFor as ir, mergeCaptionResults as is, mergeDown as it, mergeRight as iu, mergeSelection as iv, moveElementBy as iw, moveNodeDown as ix, moveNodeUp as iy, msToFrameDelayCs as iz, AdvancedChartEditorComponent as j, restoreSessionDeck as j$, parseNodeTextarea as j0, partitionSlides as j1, patchChartData as j2, patchChartStyle as j3, patchTableData as j4, patchTextStyle as j5, patternPresetOptions as j6, pendingElementStyles as j7, pickColorByClickFallback as j8, pickFile as j9, removeElementAnimation as jA, removeGradientStopPatch as jB, removeNode as jC, removeTableElementRow as jD, removeSeries as jE, renderToCanvas as jF, reorderAnimationDown as jG, reorderAnimationUp as jH, replaceInSlides as jI, replaceMatch as jJ, requestPresentationFullscreen as jK, resizeElement as jL, resolveCaptionTracks as jM, resolveChartKind as jN, resolveFontVariant as jO, resolveHyperlinkHref as jP, resolveInteractiveElementId as jQ, resolveMediaSrc as jR, resolveOleType as jS, resolveParagraphBullet as jT, resolvePresenterNotes as jU, resolveProfileInitial as jV, resolveRegionCode as jW, resolveSlideAutoAdvanceMs as jX, resolvePalette as jY, resolveThemeCatalogEntry as jZ, resolveTransitionDuration as j_, pickSupportedMimeType as ja, planGifFrames as jb, planVideoSegments as jc, pointsToSvgPathD as jd, presenceToCursors as je, presentationBaseName as jf, presentationStageStyle as jg, presenterTimerProgress as jh, presetByLayout as ji, presetsForCategory as jj, pressuresToWidths as jk, prevVisibleIndex as jl, projectDrawingShapes as jm, promoteNode as jn, provideViewerTheme as jo, radarAngle as jp, radarRingPoints as jq, readAsDataUrl as jr, recordWebm as js, redistributeColumnWidth as jt, registerCrossSlideAudio as ju, rememberSessionDeck as jv, removeAnimation as jw, removeCategory as jx, removeTableElementColumn as jy, removeCommentFromList as jz, AiChangeOverlayComponent as k, shapeStylePatch as k$, revealedElementStyles as k0, routeOrthogonalConnector as k1, rowStyle as k2, rulerDragToGuidePosition as k3, rulerHighlight as k4, rulerStripTicks as k5, sampleColorFromSlide as k6, sanitizeColor as k7, sanitizeSlideIndex as k8, sanitizeUserName as k9, setDataPointFill as kA, setDataPointLabel as kB, setDataPointMarker as kC, setDelay as kD, setDirection as kE, setDuration as kF, setElementPosition as kG, setGridlineStyle as kH, setLayout as kI, setLegend as kJ, setNodeStyle as kK, setNodeText as kL, setRepeatCount as kM, setRepeatMode as kN, setSequence as kO, setSeriesChartType as kP, setSeriesColor as kQ, setSeriesErrorBars as kR, setSeriesMarker as kS, setSeriesName as kT, setSeriesTrendline as kU, setSeriesValue as kV, setStyle as kW, setTimingCurve as kX, setTitle as kY, setTrigger as kZ, setTriggerShapeId as k_, saveViewerProfile as ka, savedPresentationFileName as kb, scanAvailableFonts as kc, searchSlides as kd, seedBroadcastFields as ke, seedHyperlinkDraft as kf, seedPropertiesDraft as kg, seedShareFields as kh, segmentFrameCount as ki, selectValue$2 as kj, sendBackward as kk, sendToBack as kl, sequentialColorScale as km, serializeWriteBack as kn, seriesColor as ko, setAnimationEmphasis as kp, setAnimationEntrance as kq, setAnimationExit as kr, setAxis as ks, setAxisLogScale as kt, setAxisTitleStyle as ku, setCategoryLabel as kv, setCellText as kw, setColorScheme as kx, setDataLabels as ky, setDataPointExplosion as kz, AiChatPanelComponent as l, sheetAfterNavigate as l0, shouldBlockClickAdvance as l1, shouldUseSvgWarp as l2, showDirectionPicker as l3, showsTemplateAffordance as l4, signatureCountLabel as l5, signatureKey as l6, signatureTimestamp as l7, signerName as l8, statusLabel as l9, toggleCommentResolvedInList as lA, toggleNodeBold as lB, toggleNodeItalic as lC, toggleSheet as lD, topLevelNodeCount as lE, transformSelectedTextCase as lF, translationsEn as lG, updateElementById as lH, updateGlowPatch as lI, updateGradientStopPatch as lJ, updateInnerShadowPatch as lK, updateOuterShadowPatch as lL, updateReflectionPatch as lM, vAlignPatch as lN, validatePassword as lO, validatePrintSettings as lP, validateRoomId as lQ, valueToY as lR, vermilionDarkColors as lS, vermilionDarkTheme as lT, vermilionLightColors as lU, vermilionLightTheme as lV, vermilionRadius as lW, waypointsToPathD as lX, worstStatus as lY, zoomTargetSlideIndex as lZ, slideNumberOf as la, slidesWithReappliedLayout as lb, smartArtNodes as lc, paletteColour as ld, snapToGridStep as le, splitCursorCell as lf, splitMergedCell as lg, statusKind as lh, statusLabel$1 as li, storeAudienceContent as lj, stringFromEvent$5 as lk, strokeColorOf as ll, strokeToInkElement as lm, strokeWidthOf as ln, styleShadowFilter as lo, textAdvancedPatch as lp, textAdvancedStateFromStyle as lq, textAdvancedStateOf as lr, textColorOf as ls, textDirectionPatch as lt, textStyleOf as lu, textStylePatch as lv, themeStyle as lw, themeToCssVars as lx, thumbnailHeight as ly, thumbnailZoom as lz, AiChatService as m, AiComposerComponent as n, AiFocusBarComponent as o, AiFocusHighlightOverlayComponent as p, AiHistoryMenuComponent as q, AiHistoryService as r, AiMessageListComponent as s, toChatSummary as t, AiPanelStore as u, AiProposalCardComponent as v, AiSettingsSectionComponent as w, AiToolCallCardComponent as x, AnimationAuthorPanelComponent as y, AnimationPanelComponent as z };
136837
- //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-mSstONYy.mjs.map
137233
+ //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-DGJ2T7gN.mjs.map