pptx-angular-viewer 2.6.6 → 2.7.1

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.
@@ -26408,6 +26408,36 @@ function interpolateOutline(from, to, t) {
26408
26408
  // ---------------------------------------------------------------------------
26409
26409
  /** PowerPoint's morph transition uses a specific cubic-bezier easing. */
26410
26410
  const MORPH_EASING = 'cubic-bezier(0.4, 0, 0.2, 1)';
26411
+ /**
26412
+ * When an unmatched OUTGOING shape has finished dissolving, as a percentage of
26413
+ * the morph's duration, and when it starts.
26414
+ *
26415
+ * PowerPoint does not simply cross-fade the two slides over the whole
26416
+ * transition: a shape with no counterpart is gone well before its replacement
26417
+ * appears, so the middle of a morph shows neither. Measured on PowerPoint 16
26418
+ * with a two-slide deck whose only shape exists on the first slide (a 1s
26419
+ * morph, frames sampled ~25ms apart, alpha read off the pixels of a pure-red
26420
+ * rectangle over white): alpha 0.98 at 3ms, 0.88 at 64ms, 0.62 at 112ms, 0.29
26421
+ * at 175ms, 0.13 at 210ms, gone by 238ms. That is a LINEAR ramp from 35ms to
26422
+ * 235ms (fit RMS 0.024, better than any eased curve). The box never moves or
26423
+ * changes size across those frames, which is why nothing here scales.
26424
+ */
26425
+ const MORPH_FADE_OUT_HOLD_PERCENT = 4;
26426
+ /** @see MORPH_FADE_OUT_HOLD_PERCENT */
26427
+ const MORPH_FADE_OUT_END_PERCENT = 23;
26428
+ /**
26429
+ * When an unmatched INCOMING shape starts dissolving in, as a percentage of the
26430
+ * morph's duration, and the curve it follows from there to full opacity.
26431
+ *
26432
+ * Same measurement, with the shape only on the SECOND slide: nothing at all
26433
+ * until 401ms, then alpha 0.18 at 464ms, 0.48 at 561ms, 0.72 at 652ms, 0.90 at
26434
+ * 776ms, 0.99 at 935ms. Fitting start and duration jointly puts the ramp at
26435
+ * 425ms with a decelerating curve (`cubic-bezier(0, 0, 0.35, 1)`, fit RMS
26436
+ * 0.008); `linear` over the same window is 9x worse.
26437
+ */
26438
+ const MORPH_FADE_IN_START_PERCENT = 42;
26439
+ /** @see MORPH_FADE_IN_START_PERCENT */
26440
+ const MORPH_FADE_IN_EASING = 'cubic-bezier(0, 0, 0.35, 1)';
26411
26441
  /** Maximum pixel distance for proximity-based element matching. */
26412
26442
  const PROXIMITY_THRESHOLD = 300;
26413
26443
  /**
@@ -26492,9 +26522,18 @@ function generateGeometryMorphAnimation(pair, durationMs, pairIndex, steps = GEO
26492
26522
  };
26493
26523
  }
26494
26524
 
26495
- // ---------------------------------------------------------------------------
26496
- // Element name extraction
26497
- // ---------------------------------------------------------------------------
26525
+ /**
26526
+ * The `!!` morph-name convention, in its own module.
26527
+ *
26528
+ * Both `morph-matching` (which pairs shapes by this name) and `morph-flatten`
26529
+ * (which decomposes a group that CONTAINS such a shape) need it. Leaving it on
26530
+ * `morph-matching` made the two import each other, and a cycle that dev ESM
26531
+ * tolerates can leave one side undefined at module-init time once the graph is
26532
+ * bundled - which took the morph code, and with it presentation mode, down in
26533
+ * every production build.
26534
+ *
26535
+ * @module render/morph-name
26536
+ */
26498
26537
  /**
26499
26538
  * Extract the morph-matching name from an element.
26500
26539
  *
@@ -26510,14 +26549,14 @@ function generateGeometryMorphAnimation(pair, durationMs, pairIndex, steps = GEO
26510
26549
  * @returns The morph name string, or undefined if none found.
26511
26550
  */
26512
26551
  function getElementMorphName(element) {
26513
- // Check !! naming convention on element name (cNvPr/@name) primary source
26552
+ // Check !! naming convention on element name (cNvPr/@name) - primary source
26514
26553
  if (element.name) {
26515
26554
  const name = element.name.trim();
26516
26555
  if (name.startsWith('!!')) {
26517
26556
  return name;
26518
26557
  }
26519
26558
  }
26520
- // Check !! naming convention in text content fallback
26559
+ // Check !! naming convention in text content - fallback
26521
26560
  if (hasTextProperties(element) && element.text) {
26522
26561
  const text = element.text.trim();
26523
26562
  if (text.startsWith('!!')) {
@@ -26526,6 +26565,142 @@ function getElementMorphName(element) {
26526
26565
  }
26527
26566
  return undefined;
26528
26567
  }
26568
+
26569
+ /**
26570
+ * Decompose the groups that take part in a morph, so the shapes INSIDE two
26571
+ * corresponding groups can be paired with each other.
26572
+ *
26573
+ * PowerPoint matches a morph level by level: it pairs the two slides' top-level
26574
+ * objects first, and only looks inside a group once that group itself has been
26575
+ * paired. A group is one object until then, so a shape nested in a group on one
26576
+ * slide and sitting top-level on the other is NOT carried through, even under
26577
+ * the `!!` naming convention.
26578
+ *
26579
+ * That was measured, not assumed. Driving PowerPoint 16 through a windowed
26580
+ * slide show and sampling the rendered frames (25ms apart) over the issue #131
26581
+ * wheel deck shows the centre disc, which is `!!Content` top-level on the
26582
+ * overview slide and `!!Content` inside a `!!Circle` group on every topic
26583
+ * slide:
26584
+ *
26585
+ * - overview -> topic (3->4): the disc dissolves out and back in. The pixel
26586
+ * at the disc's centre reads RGB 39,40,42 (opaque) at 0ms, 174,194,204
26587
+ * (the artwork BEHIND it) from 324ms to 449ms, and 39,40,42 again by 983ms.
26588
+ * PowerPoint did not pair the two halves.
26589
+ * - topic -> topic (4->5, 5->9): the same pixel holds 39,40,42 for the whole
26590
+ * transition. The two `!!Circle` groups paired, so their contents did too.
26591
+ *
26592
+ * So a group is decomposed only when the OTHER slide has a group it would pair
26593
+ * with, which reproduces both halves of that measurement. Groups without a
26594
+ * counterpart stay whole and dissolve as one object, and ordinary grouped
26595
+ * artwork keeps animating as a single unit exactly as before.
26596
+ *
26597
+ * Decomposed children are returned with ABSOLUTE slide coordinates, because
26598
+ * that is the space every downstream geometry calculation (deltas, proximity)
26599
+ * works in. A binding renders group children as absolutely positioned boxes
26600
+ * inside the group's own box, and the group carries no extra scale, so a
26601
+ * translation delta in slide space is also correct inside the group - which is
26602
+ * what lets the incoming half animate the child's own node in place.
26603
+ *
26604
+ * @module render/morph-flatten
26605
+ */
26606
+ /** Children of `element` when it is a group, else `undefined`. */
26607
+ function groupChildren(element) {
26608
+ if (element.type !== 'group') {
26609
+ return undefined;
26610
+ }
26611
+ const children = element.children;
26612
+ return Array.isArray(children) && children.length > 0 ? children : undefined;
26613
+ }
26614
+ /** Whether `element` or any descendant carries a `!!` morph name. */
26615
+ function containsMorphNamedDescendant(element) {
26616
+ const children = groupChildren(element);
26617
+ if (!children) {
26618
+ return false;
26619
+ }
26620
+ for (const child of children) {
26621
+ if (getElementMorphName(child) !== undefined || containsMorphNamedDescendant(child)) {
26622
+ return true;
26623
+ }
26624
+ }
26625
+ return false;
26626
+ }
26627
+ /**
26628
+ * Re-express a group child in absolute slide coordinates.
26629
+ *
26630
+ * Group children are stored relative to their group's box origin, already in
26631
+ * the group's rendered scale, so an absolute position is the running sum of the
26632
+ * ancestors' origins.
26633
+ */
26634
+ function toAbsolute(child, offsetX, offsetY) {
26635
+ if (offsetX === 0 && offsetY === 0) {
26636
+ return child;
26637
+ }
26638
+ return { ...child, x: child.x + offsetX, y: child.y + offsetY };
26639
+ }
26640
+ /** Boxes agree on all four numbers to within a sub-pixel tolerance. */
26641
+ function sameBox(a, b) {
26642
+ return (Math.abs(a.x - b.x) <= 0.5 &&
26643
+ Math.abs(a.y - b.y) <= 0.5 &&
26644
+ Math.abs(a.width - b.width) <= 0.5 &&
26645
+ Math.abs(a.height - b.height) <= 0.5);
26646
+ }
26647
+ /**
26648
+ * The group among `candidates` that a morph would pair `group` with, if any.
26649
+ *
26650
+ * Only signals strong enough to mean "the same container, restyled or moved"
26651
+ * count: the `!!` morph name, the Selection Pane name, or an identical box.
26652
+ * Proximity deliberately does not, because two unrelated groups that merely sit
26653
+ * near each other must keep animating as whole objects.
26654
+ */
26655
+ function correspondingGroup(group, candidates) {
26656
+ const morphName = getElementMorphName(group);
26657
+ return candidates.find((candidate) => {
26658
+ if (candidate.type !== 'group') {
26659
+ return false;
26660
+ }
26661
+ if (morphName !== undefined && getElementMorphName(candidate) === morphName) {
26662
+ return true;
26663
+ }
26664
+ if (group.name && candidate.name === group.name) {
26665
+ return true;
26666
+ }
26667
+ return sameBox(group, candidate);
26668
+ });
26669
+ }
26670
+ /**
26671
+ * The elements of `elements` that a morph should treat as individual units,
26672
+ * given the `counterpart` slide's elements at the same level of the tree.
26673
+ *
26674
+ * A group is replaced by its children (in document order, recursively, in
26675
+ * absolute coordinates) when it holds a `!!`-named descendant AND `counterpart`
26676
+ * holds a group it would pair with; everything else is passed through
26677
+ * untouched. See the module comment for why both conditions are required.
26678
+ */
26679
+ function flattenMorphElements(elements, counterpart, offsetX = 0, offsetY = 0) {
26680
+ const out = [];
26681
+ for (const element of elements) {
26682
+ const children = groupChildren(element);
26683
+ if (children && containsMorphNamedDescendant(element)) {
26684
+ const twin = correspondingGroup(element, counterpart);
26685
+ const twinChildren = twin ? (groupChildren(twin) ?? []) : undefined;
26686
+ if (twinChildren) {
26687
+ out.push(...flattenMorphElements(children, twinChildren, offsetX + element.x, offsetY + element.y));
26688
+ continue;
26689
+ }
26690
+ }
26691
+ out.push(toAbsolute(element, offsetX, offsetY));
26692
+ }
26693
+ return out;
26694
+ }
26695
+ /**
26696
+ * True when `elements` holds a group that {@link flattenMorphElements} could
26697
+ * decompose against some counterpart. Lets a caller skip the copy entirely for
26698
+ * the overwhelmingly common case of a slide with no `!!`-named group content.
26699
+ */
26700
+ function needsMorphFlattening(elements) {
26701
+ return elements.some((element) => containsMorphNamedDescendant(element));
26702
+ }
26703
+
26529
26704
  // ---------------------------------------------------------------------------
26530
26705
  // Creation identity (`a16:creationId`)
26531
26706
  // ---------------------------------------------------------------------------
@@ -26583,6 +26758,10 @@ function getElementCreationId(element) {
26583
26758
  * 2b. Native shape id from `p:cNvPr/@id` (only when creationIds are absent)
26584
26759
  * 3. Type + proximity + size matching (same type within 300px, similar box)
26585
26760
  *
26761
+ * Matching is per level of the shape tree: two groups that pair are decomposed
26762
+ * so their contents can pair too, and a group with no counterpart stays one
26763
+ * object (see `morph-flatten`).
26764
+ *
26586
26765
  * Returns only matched pairs (no unmatched elements).
26587
26766
  *
26588
26767
  * @param fromSlide - The outgoing slide.
@@ -26604,13 +26783,20 @@ function matchMorphElementsFull(fromSlide, toSlide) {
26604
26783
  const pairs = [];
26605
26784
  const usedFrom = new Set();
26606
26785
  const usedTo = new Set();
26786
+ // Two groups that pair with each other are decomposed into their children
26787
+ // (in absolute coordinates) so the contents can pair too, which is how
26788
+ // PowerPoint descends a matched container. A group with no counterpart -
26789
+ // including one whose `!!`-named shape sits top-level on the other slide -
26790
+ // stays whole and animates (or dissolves) as one unit. See `morph-flatten`.
26791
+ const fromElements = flattenMorphElements(fromSlide.elements, toSlide.elements);
26792
+ const toElements = flattenMorphElements(toSlide.elements, fromSlide.elements);
26607
26793
  // Pass 1: match by !! naming convention
26608
- for (const fromEl of fromSlide.elements) {
26794
+ for (const fromEl of fromElements) {
26609
26795
  const fromName = getElementMorphName(fromEl);
26610
26796
  if (!fromName) {
26611
26797
  continue;
26612
26798
  }
26613
- for (const toEl of toSlide.elements) {
26799
+ for (const toEl of toElements) {
26614
26800
  if (usedTo.has(toEl.id)) {
26615
26801
  continue;
26616
26802
  }
@@ -26634,7 +26820,7 @@ function matchMorphElementsFull(fromSlide, toSlide) {
26634
26820
  }
26635
26821
  return creationIds.get(el.id);
26636
26822
  };
26637
- for (const fromEl of fromSlide.elements) {
26823
+ for (const fromEl of fromElements) {
26638
26824
  if (usedFrom.has(fromEl.id)) {
26639
26825
  continue;
26640
26826
  }
@@ -26642,7 +26828,7 @@ function matchMorphElementsFull(fromSlide, toSlide) {
26642
26828
  if (!fromGuid) {
26643
26829
  continue;
26644
26830
  }
26645
- for (const toEl of toSlide.elements) {
26831
+ for (const toEl of toElements) {
26646
26832
  if (usedTo.has(toEl.id) || fromEl.type !== toEl.type) {
26647
26833
  continue;
26648
26834
  }
@@ -26671,11 +26857,11 @@ function matchMorphElementsFull(fromSlide, toSlide) {
26671
26857
  // and label gliding one sector around the wheel - the reporter's "phantom
26672
26858
  // arrow to another selected item". Such shapes must fall through to the
26673
26859
  // proximity pass (which pairs the same-position counterparts) instead.
26674
- for (const fromEl of fromSlide.elements) {
26860
+ for (const fromEl of fromElements) {
26675
26861
  if (usedFrom.has(fromEl.id) || !fromEl.shapeId) {
26676
26862
  continue;
26677
26863
  }
26678
- for (const toEl of toSlide.elements) {
26864
+ for (const toEl of toElements) {
26679
26865
  if (usedTo.has(toEl.id)) {
26680
26866
  continue;
26681
26867
  }
@@ -26702,13 +26888,13 @@ function matchMorphElementsFull(fromSlide, toSlide) {
26702
26888
  // selection marker mid-glide. Same-shaped counterparts pass at ratio 1;
26703
26889
  // anything more than 2x apart on either axis dissolves in place instead,
26704
26890
  // which is what PowerPoint does with shapes it cannot confidently pair.
26705
- for (const fromEl of fromSlide.elements) {
26891
+ for (const fromEl of fromElements) {
26706
26892
  if (usedFrom.has(fromEl.id)) {
26707
26893
  continue;
26708
26894
  }
26709
26895
  let bestMatch = null;
26710
26896
  let bestDist = Infinity;
26711
- for (const toEl of toSlide.elements) {
26897
+ for (const toEl of toElements) {
26712
26898
  if (usedTo.has(toEl.id)) {
26713
26899
  continue;
26714
26900
  }
@@ -26734,9 +26920,20 @@ function matchMorphElementsFull(fromSlide, toSlide) {
26734
26920
  usedTo.add(bestMatch.id);
26735
26921
  }
26736
26922
  }
26923
+ // There is deliberately no further pass pairing leftovers that merely
26924
+ // occupy the same box across element types. One used to exist, to carry the
26925
+ // issue #131 wheel's centre through as one object where the overview slide
26926
+ // holds it as a bare `!!Content` shape and the topic slides wrap the same
26927
+ // artwork in a `!!Circle` group of the identical box. PowerPoint does not:
26928
+ // sampled frames of the real transition show that centre dissolving out to
26929
+ // the artwork behind it (RGB 39,40,42 -> 174,194,204 by 324ms) and back in,
26930
+ // which is what an UNMATCHED pair looks like. Pairing a shape with a group
26931
+ // held it solid instead, so the ghost never dissolved and the incoming half
26932
+ // popped.
26933
+ //
26737
26934
  // Collect unmatched elements
26738
- const unmatchedFrom = fromSlide.elements.filter((el) => !usedFrom.has(el.id));
26739
- const unmatchedTo = toSlide.elements.filter((el) => !usedTo.has(el.id));
26935
+ const unmatchedFrom = fromElements.filter((el) => !usedFrom.has(el.id));
26936
+ const unmatchedTo = toElements.filter((el) => !usedTo.has(el.id));
26740
26937
  return { pairs, unmatchedFrom, unmatchedTo };
26741
26938
  }
26742
26939
 
@@ -27197,17 +27394,25 @@ function generateMorphAnimations(pairs, durationMs, _mode = 'object') {
27197
27394
  // instead of `rotate(from)->rotate(to)`, sweeping giant arcs across the
27198
27395
  // slide. Flips use the incoming element's, stated after the rotation to
27199
27396
  // match the static order (right-to-left: flip first, then rotate).
27200
- const fromRot = fromElement.rotation ?? 0;
27397
+ // Animate FROM an equivalent start angle that reaches the element's own
27398
+ // authored rotation over the shorter arc; the `to` frame must keep the
27399
+ // authored value so the element lands exactly on its static transform.
27201
27400
  const toRot = toElement.rotation ?? 0;
27401
+ const fromRot = shortestRotationTarget(toRot, fromElement.rotation ?? 0);
27202
27402
  const flips = `${toElement.flipHorizontal ? ' scaleX(-1)' : ''}${toElement.flipVertical ? ' scaleY(-1)' : ''}`;
27203
- // A pair whose appearance changes fades IN over its outgoing ghost (see
27204
- // `generateMorphGhostAnimations`); one that only moves stays fully
27205
- // opaque so the glide reads as a single continuous object.
27206
- const crossfades = morphPairNeedsCrossfade(fromElement, toElement);
27403
+ // A restyled pair dissolves via its outgoing GHOST, which is painted in
27404
+ // the overlay directly above this element and fades 1 -> 0 (see
27405
+ // `generateMorphGhostAnimations`). This half therefore has to stay at its
27406
+ // final opacity for the whole flight: fading it IN as well left both
27407
+ // layers part-transparent in the middle of the transition, so the
27408
+ // background showed straight through what should be a solid object and
27409
+ // both states were legible at once (issue #131: the wheel's centre disc
27410
+ // went see-through mid-morph where PowerPoint keeps it solid and only
27411
+ // dissolves the content on top of it).
27207
27412
  // Build from/to property blocks
27208
27413
  const fromProps = [
27209
27414
  `\t\ttransform: translate(${dx}px, ${dy}px) scale(${sx}, ${sy}) rotate(${fromRot}deg)${flips};`,
27210
- `\t\topacity: ${crossfades ? 0 : fromOpacity};`,
27415
+ `\t\topacity: ${fromOpacity};`,
27211
27416
  ];
27212
27417
  const toProps = [
27213
27418
  `\t\ttransform: translate(0, 0) scale(1, 1) rotate(${toRot}deg)${flips};`,
@@ -27280,8 +27485,10 @@ function generateMorphGhostAnimations(pairs, durationMs, startIndex) {
27280
27485
  const dy = toElement.y + toElement.height / 2 - (fromElement.y + fromElement.height / 2);
27281
27486
  const sx = Math.max(toElement.width, 1) / Math.max(fromElement.width, 1);
27282
27487
  const sy = Math.max(toElement.height, 1) / Math.max(fromElement.height, 1);
27488
+ // The ghost starts on its own authored rotation, so the SHORTEST-arc
27489
+ // adjustment goes on the target angle here (mirror of the incoming half).
27283
27490
  const fromRot = fromElement.rotation ?? 0;
27284
- const toRot = toElement.rotation ?? 0;
27491
+ const toRot = shortestRotationTarget(fromRot, toElement.rotation ?? 0);
27285
27492
  const flips = `${fromElement.flipHorizontal ? ' scaleX(-1)' : ''}${fromElement.flipVertical ? ' scaleY(-1)' : ''}`;
27286
27493
  const keyframes = `
27287
27494
  @keyframes ${safeName} {
@@ -27304,6 +27511,43 @@ function generateMorphGhostAnimations(pairs, durationMs, startIndex) {
27304
27511
  }
27305
27512
  return animations;
27306
27513
  }
27514
+ /**
27515
+ * The target angle to animate TO so the element turns the short way round.
27516
+ *
27517
+ * CSS interpolates `rotate(a)` -> `rotate(b)` numerically, so a pair authored
27518
+ * at 315deg and 0deg spins -315deg (almost a full turn anti-clockwise) when
27519
+ * the shapes are only 45deg apart. PowerPoint always takes the shorter arc.
27520
+ * Returns `fromDeg` plus the delta wrapped into (-180, 180], which is the same
27521
+ * final orientation modulo 360 but the rotation a viewer expects: the issue
27522
+ * #131 deck's wheel points its arrow at the selected wedge by rotating a ring
27523
+ * in 45deg steps, so clicking the neighbouring wedge sent the arrow the long
27524
+ * way around the dial.
27525
+ *
27526
+ * An exact half turn has no shorter arc, and PowerPoint's choice there is not
27527
+ * a fixed sign: it turns CLOCKWISE when the shape starts anywhere in
27528
+ * [90, 270) and ANTI-clockwise otherwise. Measured on PowerPoint 16 by
27529
+ * sampling the rendered frames of a half-turn morph, both on the issue #131
27530
+ * wheel (0->180 anti, 45->225 anti, 90->270 clock, 135->315 clock, 180->360
27531
+ * clock, 270->90 anti) and on a synthetic two-slide deck built for the purpose
27532
+ * (0->180 anti, 45->225 anti, 90->270 clock, 270->90 anti), which agrees on
27533
+ * every case. Always taking +180 sent the wheel's arrow round the wrong side
27534
+ * for the wedge diametrically opposite the one on screen, so one click in
27535
+ * seven looked nothing like the others.
27536
+ */
27537
+ function shortestRotationTarget(fromDeg, toDeg) {
27538
+ let delta = (toDeg - fromDeg) % 360;
27539
+ if (delta > 180) {
27540
+ delta -= 360;
27541
+ }
27542
+ else if (delta < -180) {
27543
+ delta += 360;
27544
+ }
27545
+ if (Math.abs(Math.abs(delta) - 180) < 1e-9) {
27546
+ const start = ((fromDeg % 360) + 360) % 360;
27547
+ delta = start >= 90 && start < 270 ? 180 : -180;
27548
+ }
27549
+ return fromDeg + delta;
27550
+ }
27307
27551
  /**
27308
27552
  * Restated static transform suffix (`rotate(N) scaleX(-1) scaleY(-1)`) for an
27309
27553
  * element. Keyframe `transform`s REPLACE the container's static transform, so
@@ -27317,6 +27561,15 @@ function staticTransformSuffix(el) {
27317
27561
  /**
27318
27562
  * Generate fade-out animations for elements that only exist on the outgoing slide.
27319
27563
  *
27564
+ * The shape dissolves in the FIRST quarter of the morph rather than across the
27565
+ * whole of it, and holds at zero from there (see
27566
+ * {@link MORPH_FADE_OUT_END_PERCENT} for the frames that were measured). Fading
27567
+ * it over the full duration left it half-visible at the midpoint, on top of an
27568
+ * incoming replacement that was itself half-visible, so the middle of every
27569
+ * morph read as a double exposure where PowerPoint shows a clean gap.
27570
+ *
27571
+ * Nothing scales: PowerPoint's dissolve keeps the box exactly where it is.
27572
+ *
27320
27573
  * @param elements - Unmatched elements from the outgoing slide.
27321
27574
  * @param durationMs - Animation duration in milliseconds.
27322
27575
  * @param startIndex - Index offset for unique keyframe naming.
@@ -27325,20 +27578,29 @@ function staticTransformSuffix(el) {
27325
27578
  function generateUnmatchedFadeOutAnimations(elements, durationMs, startIndex) {
27326
27579
  return elements.map((el, i) => {
27327
27580
  const safeName = `pptx-morph-fadeout-${startIndex + i}-${el.id.replace(/[^a-zA-Z0-9]/gu, '')}`;
27581
+ const transform = `\t\ttransform: scale(1)${staticTransformSuffix(el)};`;
27328
27582
  const keyframes = `
27329
27583
  @keyframes ${safeName} {
27330
- \tfrom {
27584
+ \t0% {
27331
27585
  \t\topacity: ${el.opacity ?? 1};
27332
- \t\ttransform: scale(1)${staticTransformSuffix(el)};
27586
+ ${transform}
27333
27587
  \t}
27334
- \tto {
27588
+ \t${MORPH_FADE_OUT_HOLD_PERCENT}% {
27589
+ \t\topacity: ${el.opacity ?? 1};
27590
+ ${transform}
27591
+ \t}
27592
+ \t${MORPH_FADE_OUT_END_PERCENT}% {
27335
27593
  \t\topacity: 0;
27336
- \t\ttransform: scale(0.95)${staticTransformSuffix(el)};
27594
+ ${transform}
27595
+ \t}
27596
+ \t100% {
27597
+ \t\topacity: 0;
27598
+ ${transform}
27337
27599
  \t}
27338
27600
  }`;
27339
27601
  return {
27340
27602
  elementId: el.id,
27341
- animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
27603
+ animation: `${safeName} ${durationMs}ms linear forwards`,
27342
27604
  keyframes,
27343
27605
  };
27344
27606
  });
@@ -27346,6 +27608,12 @@ function generateUnmatchedFadeOutAnimations(elements, durationMs, startIndex) {
27346
27608
  /**
27347
27609
  * Generate fade-in animations for elements that only exist on the incoming slide.
27348
27610
  *
27611
+ * The shape stays completely invisible until the morph is
27612
+ * {@link MORPH_FADE_IN_START_PERCENT}% through, then dissolves in on a
27613
+ * decelerating curve. See that constant for the frames that were measured.
27614
+ *
27615
+ * Nothing scales: PowerPoint's dissolve keeps the box exactly where it is.
27616
+ *
27349
27617
  * @param elements - Unmatched elements from the incoming slide.
27350
27618
  * @param durationMs - Animation duration in milliseconds.
27351
27619
  * @param startIndex - Index offset for unique keyframe naming.
@@ -27354,20 +27622,26 @@ function generateUnmatchedFadeOutAnimations(elements, durationMs, startIndex) {
27354
27622
  function generateUnmatchedFadeInAnimations(elements, durationMs, startIndex) {
27355
27623
  return elements.map((el, i) => {
27356
27624
  const safeName = `pptx-morph-fadein-${startIndex + i}-${el.id.replace(/[^a-zA-Z0-9]/gu, '')}`;
27625
+ const transform = `\t\ttransform: scale(1)${staticTransformSuffix(el)};`;
27357
27626
  const keyframes = `
27358
27627
  @keyframes ${safeName} {
27359
- \tfrom {
27628
+ \t0% {
27360
27629
  \t\topacity: 0;
27361
- \t\ttransform: scale(0.95)${staticTransformSuffix(el)};
27630
+ ${transform}
27362
27631
  \t}
27363
- \tto {
27632
+ \t${MORPH_FADE_IN_START_PERCENT}% {
27633
+ \t\topacity: 0;
27634
+ \t\tanimation-timing-function: ${MORPH_FADE_IN_EASING};
27635
+ ${transform}
27636
+ \t}
27637
+ \t100% {
27364
27638
  \t\topacity: ${el.opacity ?? 1};
27365
- \t\ttransform: scale(1)${staticTransformSuffix(el)};
27639
+ ${transform}
27366
27640
  \t}
27367
27641
  }`;
27368
27642
  return {
27369
27643
  elementId: el.id,
27370
- animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
27644
+ animation: `${safeName} ${durationMs}ms linear forwards`,
27371
27645
  keyframes,
27372
27646
  };
27373
27647
  });
@@ -27492,7 +27766,14 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = 'object
27492
27766
  // Element ids embed their slide path, so the two id spaces do not overlap,
27493
27767
  // but partitioning on this set (rather than on id shape) keeps that an
27494
27768
  // implementation detail of core rather than an assumption here.
27495
- const outgoingElements = [...fromSlide.elements];
27769
+ //
27770
+ // The list is FLATTENED the same way the matcher flattens it (see
27771
+ // `morph-flatten`), against the SAME counterpart, so the two agree on which
27772
+ // groups were decomposed: the animations are keyed by the decomposed
27773
+ // children's ids. Painting the undecomposed group here instead would paint
27774
+ // the children twice over - once inside the group, once as their own ghosts
27775
+ // - and leave the group itself without an animation.
27776
+ const outgoingElements = flattenMorphElements(fromSlide.elements, toSlide.elements);
27496
27777
  const outgoingIds = new Set(outgoingElements.map((element) => element.id));
27497
27778
  const incomingAnimations = new Map();
27498
27779
  const outgoingAnimations = new Map();
@@ -32276,11 +32557,28 @@ const INSTANT = {
32276
32557
  */
32277
32558
  const DEFAULT_TRANSITION_DURATION_MS$1 = 1000;
32278
32559
  /**
32279
- * Default Morph duration (ms). PowerPoint's Morph defaults to 2.00s and does
32280
- * not honour the legacy `spd` speed for it; an authored override arrives as
32281
- * `p14:dur` and lands in `durationMs`, which always wins over this.
32560
+ * Default Morph duration (ms) for a transition that declares NEITHER an
32561
+ * explicit `p14:dur` (which lands in `durationMs` and always wins) NOR a legacy
32562
+ * `spd` speed (see {@link TRANSITION_SPEED_DURATION_MS}). Applying Morph in the
32563
+ * PowerPoint UI writes an explicit duration, so this only covers decks that
32564
+ * declare nothing at all.
32282
32565
  */
32283
32566
  const DEFAULT_MORPH_DURATION_MS = 2000;
32567
+ /**
32568
+ * Duration (ms) for each legacy `p:transition/@spd` speed.
32569
+ *
32570
+ * Measured against PowerPoint itself: the issue #131 deck's morph slides carry
32571
+ * `spd="slow"` and no `p14:dur`, and PowerPoint reports
32572
+ * `SlideShowTransition.Duration = 1.0`. Re-authoring that attribute and
32573
+ * re-reading it through COM gives fast=0.5s, med=0.75s, slow=1.0s - and the
32574
+ * same values for Morph as for every other effect, contradicting the earlier
32575
+ * assumption that Morph ignores `spd`.
32576
+ */
32577
+ const TRANSITION_SPEED_DURATION_MS = {
32578
+ fast: 500,
32579
+ med: 750,
32580
+ slow: 1000,
32581
+ };
32284
32582
  /** Easing applied to every transition animation. */
32285
32583
  const EASE = 'ease-in-out';
32286
32584
 
@@ -33706,10 +34004,15 @@ function resolveTransitionDurationMs(transition) {
33706
34004
  if (typeof transition.durationMs === 'number' && transition.durationMs > 0) {
33707
34005
  return transition.durationMs;
33708
34006
  }
33709
- // PowerPoint's Morph defaults to 2.00s and IGNORES the legacy `spd`
33710
- // attribute for it (the real override lives in `p14:dur`, which core parses
33711
- // into `durationMs` when present). Playing morphs at the generic 1s default
33712
- // made every dissolve feel abrupt next to PowerPoint (issue #131).
34007
+ // The legacy `spd` speed is the next authority, for EVERY effect including
34008
+ // Morph. Verified against PowerPoint via COM (see
34009
+ // `TRANSITION_SPEED_DURATION_MS`): the issue #131 deck's morphs declare
34010
+ // `spd="slow"` and no `p14:dur`, and PowerPoint plays them at 1.0s - we were
34011
+ // playing them at 2.0s, so every transition in that deck ran at half speed.
34012
+ const speedMs = transition.speed ? TRANSITION_SPEED_DURATION_MS[transition.speed] : undefined;
34013
+ if (typeof speedMs === 'number') {
34014
+ return speedMs;
34015
+ }
33713
34016
  if (transition.type === 'morph') {
33714
34017
  return DEFAULT_MORPH_DURATION_MS;
33715
34018
  }
@@ -44107,6 +44410,33 @@ function shouldLoopContinuously(input) {
44107
44410
  function isClickAdvanceAllowed(slide) {
44108
44411
  return slide?.transition?.advanceOnClick !== false;
44109
44412
  }
44413
+ /**
44414
+ * PowerPoint's "After: <n>" timed advance (`p:transition/@advTm`, milliseconds).
44415
+ *
44416
+ * Returns the delay a slide show must wait before stepping to the next slide on
44417
+ * its own, or `undefined` when the slide waits for input instead. Timings are
44418
+ * honoured unless the show is explicitly set to manual advance
44419
+ * (`PptxPresentationProperties.advanceMode === 'manual'`, surfaced here as
44420
+ * `useTimings: false`); an unset flag keeps them, matching PowerPoint's default
44421
+ * "Using timings, if present".
44422
+ *
44423
+ * This pairs with {@link isClickAdvanceAllowed}: a slide authored with
44424
+ * `advClick="0" advTm="…"` is advanced ONLY by this timer, so a binding that
44425
+ * honours the click gate without also running the timer leaves the show
44426
+ * permanently stuck on that slide with no visible response to input.
44427
+ */
44428
+ function resolveAutoAdvanceDelayMs(slide, options) {
44429
+ if (options?.useTimings === false) {
44430
+ return undefined;
44431
+ }
44432
+ const advanceAfterMs = slide?.transition?.advanceAfterMs;
44433
+ if (typeof advanceAfterMs !== 'number' ||
44434
+ !Number.isFinite(advanceAfterMs) ||
44435
+ advanceAfterMs < 0) {
44436
+ return undefined;
44437
+ }
44438
+ return advanceAfterMs;
44439
+ }
44110
44440
  function applyRehearsalTimings(slides, timings) {
44111
44441
  return slides.map((slide, index) => {
44112
44442
  const advanceAfterMs = timings[index];
@@ -52853,7 +53183,7 @@ function createLocalStorageBackend(namespace) {
52853
53183
  /** Try IndexedDB first; fall back to localStorage on any failure. */
52854
53184
  async function resolveBackend(dbName, namespace) {
52855
53185
  try {
52856
- const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-RyyNYkYb.mjs');
53186
+ const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-CiJHyQZ_.mjs');
52857
53187
  const db = await openChatDb(dbName);
52858
53188
  return createIdbBackend(db);
52859
53189
  }
@@ -60427,46 +60757,6 @@ function parseNodeTextarea(value, fallback) {
60427
60757
  return lines.length > 0 ? lines : [...fallback];
60428
60758
  }
60429
60759
 
60430
- /**
60431
- * Gradient fill CSS builders.
60432
- *
60433
- * Thin re-export shim. The implementation now lives in the framework-agnostic
60434
- * `pptx-viewer-shared` package (`render/fill-style.ts`), vendored into this
60435
- * library via `../internal/shared`. This file preserves the historical
60436
- * `./color-gradient` import surface so existing consumers and colocated tests
60437
- * keep importing the same symbols unchanged.
60438
- *
60439
- * Gradient rendering follows ECMA-376 Part 1, §20.1.8.35 (gradFill) and
60440
- * §20.1.8.49 (pathFill).
60441
- */
60442
-
60443
- /**
60444
- * SVG pattern generation for OOXML pattern fill presets.
60445
- *
60446
- * Thin re-export shim. The implementation now lives in the framework-agnostic
60447
- * `pptx-viewer-shared` package (`render/fill-style.ts`), vendored into this
60448
- * library via `../internal/shared`. This file preserves the historical
60449
- * `./color-patterns` import surface.
60450
- *
60451
- * Deliberate divergence: shared `getPatternSvg` returns `string | null` for an
60452
- * unknown preset, whereas the Angular binding's public contract (and its
60453
- * colocated tests) expect `string | undefined`. This shim normalises `null` to
60454
- * `undefined` so that contract is preserved.
60455
- *
60456
- * Reference: ECMA-376 Part 1, §20.1.10.33 (ST_PresetPatternVal).
60457
- */
60458
- /**
60459
- * Generate an inline SVG string for an OOXML preset pattern fill.
60460
- *
60461
- * @param preset - DrawingML `ST_PresetPatternVal` string (e.g. `"pct5"`).
60462
- * @param fgColor - Foreground hex colour (e.g. `"#000000"`).
60463
- * @param bgColor - Background hex colour (e.g. `"#ffffff"`).
60464
- * @returns An SVG string, or `undefined` when the preset is not implemented.
60465
- */
60466
- function getPatternSvg(preset, fgColor, bgColor) {
60467
- return getPatternSvg$1(preset, fgColor, bgColor) ?? undefined;
60468
- }
60469
-
60470
60760
  /**
60471
60761
  * Duotone SVG `<filter>` descriptor for Angular templates.
60472
60762
  *
@@ -60712,55 +61002,35 @@ function getShapeFillStrokeStyle(el, parentGroupFill, animatesFill, animatesStro
60712
61002
  const ss = el.shapeStyle;
60713
61003
  const style = {};
60714
61004
  if (ss) {
60715
- // `a:grpFill` child (fillMode 'group'): inherit the enclosing group's
60716
- // resolved fill (threaded down by the group render branch). The shared
60717
- // resolver paints the parent group's fill in this child's own box.
60718
- const inheritedGroupFill = ss.fillMode === 'group' && parentGroupFill
60719
- ? getComputedFillStyle(el, parentGroupFill)
60720
- : undefined;
60721
- // Fill resolution order mirrors the React `getShapeVisualStyle`:
60722
- // image pattern (SVG preset) gradient (structured builder, with the
60723
- // parser's prebuilt CSS string as fallback) → solid colour. Skipped
60724
- // entirely while a `p:animClr` fill animation owns the colour.
60725
- const imageFillUrl = ss.fillMode === 'image' && ss.fillImageUrl ? ss.fillImageUrl : undefined;
60726
- const patternCss = ss.fillMode === 'pattern' ? buildPatternFillCss(ss) : undefined;
60727
- const gradient = ss.fillMode === 'gradient'
60728
- ? (buildCssGradientFromShapeStyle(ss) ?? ss.fillGradient)
60729
- : ss.fillGradient;
60730
- if (animatesFill) {
60731
- // Leave `background-color` / `background-image` to the animated keyframes.
60732
- }
60733
- else if (inheritedGroupFill) {
60734
- if (inheritedGroupFill.backgroundColor !== undefined) {
60735
- style['background-color'] = inheritedGroupFill.backgroundColor;
60736
- }
60737
- if (inheritedGroupFill.backgroundImage !== undefined) {
60738
- style['background-image'] = inheritedGroupFill.backgroundImage;
60739
- }
60740
- if (inheritedGroupFill.backgroundRepeat !== undefined) {
60741
- style['background-repeat'] = inheritedGroupFill.backgroundRepeat;
60742
- }
60743
- if (inheritedGroupFill.backgroundSize !== undefined) {
60744
- style['background-size'] = inheritedGroupFill.backgroundSize;
60745
- }
60746
- }
60747
- else if (imageFillUrl) {
60748
- style['background-color'] = 'transparent';
60749
- style['background-image'] = `url(${imageFillUrl})`;
60750
- style['background-repeat'] = ss.fillImageMode === 'tile' ? 'repeat' : 'no-repeat';
60751
- style['background-size'] = ss.fillImageMode === 'tile' ? 'auto' : '100% 100%';
60752
- }
60753
- else if (patternCss) {
60754
- style['background-image'] = patternCss.backgroundImage;
60755
- style['background-color'] = patternCss.backgroundColor;
60756
- style['background-repeat'] = 'repeat';
60757
- style['background-size'] = 'auto';
60758
- }
60759
- else if (gradient) {
60760
- style['background-image'] = gradient;
60761
- }
60762
- else if (ss.fillColor && ss.fillColor !== 'transparent' && ss.fillMode !== 'none') {
60763
- style['background-color'] = ss.fillColor;
61005
+ // Fill: resolved entirely by the shared builder, in React's order
61006
+ // image structured gradient (falling back to the parser's prebuilt
61007
+ // `fillGradient` string) preset pattern solid colour WITH
61008
+ // `fillOpacity` applied. A `a:grpFill` child (fillMode 'group') inherits
61009
+ // `parentGroupFill`, painted in this child's own box.
61010
+ //
61011
+ // This deliberately delegates instead of re-deriving the cascade locally:
61012
+ // the local copy dropped `ss.fillOpacity`, so a shape authored
61013
+ // `<a:solidFill><a:schemeClr …><a:alpha val="0"/></a:schemeClr></a:solidFill>`
61014
+ // (a fully TRANSPARENT overlay, common over a full-bleed background video)
61015
+ // painted as an opaque block of colour and hid everything beneath it.
61016
+ // Skipped entirely while a `p:animClr` fill animation owns the colour.
61017
+ const fill = animatesFill ? undefined : getComputedFillStyle(el, parentGroupFill);
61018
+ if (fill) {
61019
+ if (fill.backgroundColor !== undefined) {
61020
+ style['background-color'] = fill.backgroundColor;
61021
+ }
61022
+ if (fill.backgroundImage !== undefined) {
61023
+ style['background-image'] = fill.backgroundImage;
61024
+ }
61025
+ if (fill.backgroundRepeat !== undefined) {
61026
+ style['background-repeat'] = fill.backgroundRepeat;
61027
+ }
61028
+ if (fill.backgroundSize !== undefined) {
61029
+ style['background-size'] = fill.backgroundSize;
61030
+ }
61031
+ if (fill.backgroundPosition !== undefined) {
61032
+ style['background-position'] = fill.backgroundPosition;
61033
+ }
60764
61034
  }
60765
61035
  // Stroke.
60766
61036
  const strokeWidth = Math.max(0, ss.strokeWidth ?? 0);
@@ -79171,6 +79441,23 @@ function createSlideKeyframesStyle() {
79171
79441
  function shouldBlockClickAdvance(playbackComplete, slide) {
79172
79442
  return playbackComplete && !isClickAdvanceAllowed(slide);
79173
79443
  }
79444
+ /**
79445
+ * Delay in ms before the show steps to the next slide on its own, or
79446
+ * `undefined` when the current slide waits for input.
79447
+ *
79448
+ * The counterpart to {@link shouldBlockClickAdvance}: PowerPoint's
79449
+ * `p:transition/@advTm` ("Advance slide: After <n>"). A slide authored
79450
+ * `advClick="0" advTm="…"` is advanced ONLY by this timer, so honouring the
79451
+ * click gate without also arming the timer strands the show on that slide with
79452
+ * no visible response to any input. Nothing is scheduled once the end-of-show
79453
+ * screen is up, or when the show is set to advance manually.
79454
+ */
79455
+ function resolveSlideAutoAdvanceMs(slide, useTimings, endOfShow) {
79456
+ if (endOfShow) {
79457
+ return undefined;
79458
+ }
79459
+ return resolveAutoAdvanceDelayMs(slide, { useTimings });
79460
+ }
79174
79461
  /**
79175
79462
  * Clamp `index` to the valid range [0, count - 1].
79176
79463
  * Returns 0 when `count` is 0 to avoid -1 states.
@@ -79824,6 +80111,14 @@ class PresentationOverlayComponent {
79824
80111
  ...(ngDevMode ? [{ debugName: "startIndex" }] : /* istanbul ignore next */ []));
79825
80112
  showWithAnimation = input(undefined, /* @ts-ignore */
79826
80113
  ...(ngDevMode ? [{ debugName: "showWithAnimation" }] : /* istanbul ignore next */ []));
80114
+ /**
80115
+ * Whether authored slide timings (`p:transition/@advTm`) advance the show on
80116
+ * their own. False is PowerPoint's "Advance slides: Manually"
80117
+ * (`PptxPresentationProperties.advanceMode === 'manual'`); the default keeps
80118
+ * timings, matching "Using timings, if present".
80119
+ */
80120
+ useTimings = input(true, /* @ts-ignore */
80121
+ ...(ngDevMode ? [{ debugName: "useTimings" }] : /* istanbul ignore next */ []));
79827
80122
  subtitlesVisible = input(false, /* @ts-ignore */
79828
80123
  ...(ngDevMode ? [{ debugName: "subtitlesVisible" }] : /* istanbul ignore next */ []));
79829
80124
  /**
@@ -79926,11 +80221,38 @@ class PresentationOverlayComponent {
79926
80221
  slideKeyframes = createSlideKeyframesStyle();
79927
80222
  /** The hover-trigger shape the pointer is currently over (fires a sequence once). */
79928
80223
  currentHoverTriggerId;
80224
+ /** Pending `p:transition/@advTm` auto-advance timer for the current slide. */
80225
+ autoAdvanceTimer;
79929
80226
  constructor() {
79930
80227
  this.setupTouchGestures();
79931
80228
  this.setupFullscreen();
79932
80229
  ensurePresetAnimationKeyframes();
79933
- inject(DestroyRef).onDestroy(() => this.slideKeyframes.dispose());
80230
+ inject(DestroyRef).onDestroy(() => {
80231
+ this.slideKeyframes.dispose();
80232
+ this.clearAutoAdvanceTimer();
80233
+ });
80234
+ // PowerPoint's "Advance slide: After <n>" timing (`p:transition/@advTm`).
80235
+ // Re-armed on every slide change; the previous slide's pending timer is
80236
+ // always cancelled first so a manual advance can never leave a stale timer
80237
+ // running that skips the slide the presenter just moved to.
80238
+ //
80239
+ // Without this the show is not merely missing an auto-advance: a slide
80240
+ // authored `advClick="0" advTm="…"` (PowerPoint's "on click OFF, after N")
80241
+ // is advanced ONLY by this timer, and `shouldBlockClickAdvance` correctly
80242
+ // swallows every click on it. The show then sits on that slide for ever
80243
+ // with no visible response to input, which reads as "presentation mode
80244
+ // does nothing at all".
80245
+ effect(() => {
80246
+ const delayMs = resolveSlideAutoAdvanceMs(this.currentSlide(), this.useTimings(), this.endOfShow());
80247
+ this.clearAutoAdvanceTimer();
80248
+ if (delayMs === undefined) {
80249
+ return;
80250
+ }
80251
+ this.autoAdvanceTimer = setTimeout(() => {
80252
+ this.autoAdvanceTimer = undefined;
80253
+ this.navigate('next');
80254
+ }, delayMs);
80255
+ });
79934
80256
  // Scope media-command (`p:cmd`) target lookups to the slide stage.
79935
80257
  this.playback.setFrameRoot(() => this.stageRef()?.nativeElement ?? null);
79936
80258
  // Wire the zoom-navigation context to this overlay's slide navigation so a
@@ -80397,6 +80719,13 @@ class PresentationOverlayComponent {
80397
80719
  // ------------------------------------------------------------------
80398
80720
  // Navigation helpers
80399
80721
  // ------------------------------------------------------------------
80722
+ /** Cancel any pending timed auto-advance. */
80723
+ clearAutoAdvanceTimer() {
80724
+ if (this.autoAdvanceTimer !== undefined) {
80725
+ clearTimeout(this.autoAdvanceTimer);
80726
+ this.autoAdvanceTimer = undefined;
80727
+ }
80728
+ }
80400
80729
  navigate(direction) {
80401
80730
  const slides = this.slides();
80402
80731
  const count = slides.length;
@@ -80505,7 +80834,7 @@ class PresentationOverlayComponent {
80505
80834
  this.closed.emit();
80506
80835
  }
80507
80836
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PresentationOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
80508
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: PresentationOverlayComponent, isStandalone: true, selector: "pptx-presentation-overlay", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: true, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, startIndex: { classPropertyName: "startIndex", publicName: "startIndex", isSignal: true, isRequired: false, transformFunction: null }, showWithAnimation: { classPropertyName: "showWithAnimation", publicName: "showWithAnimation", isSignal: true, isRequired: false, transformFunction: null }, subtitlesVisible: { classPropertyName: "subtitlesVisible", publicName: "subtitlesVisible", isSignal: true, isRequired: false, transformFunction: null }, sessionEnded: { classPropertyName: "sessionEnded", publicName: "sessionEnded", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed", subtitlesChange: "subtitlesChange", annotationsExit: "annotationsExit" }, host: { listeners: { "document:fullscreenchange": "onFullscreenChange()", "window:resize": "onWindowResize()", "document:keydown": "onKeyDown($event)" } }, providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], viewQueries: [{ propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "rootRef", first: true, predicate: ["root"], descendants: true, isSignal: true }], ngImport: i0, template: `
80837
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: PresentationOverlayComponent, isStandalone: true, selector: "pptx-presentation-overlay", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: true, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, startIndex: { classPropertyName: "startIndex", publicName: "startIndex", isSignal: true, isRequired: false, transformFunction: null }, showWithAnimation: { classPropertyName: "showWithAnimation", publicName: "showWithAnimation", isSignal: true, isRequired: false, transformFunction: null }, useTimings: { classPropertyName: "useTimings", publicName: "useTimings", isSignal: true, isRequired: false, transformFunction: null }, subtitlesVisible: { classPropertyName: "subtitlesVisible", publicName: "subtitlesVisible", isSignal: true, isRequired: false, transformFunction: null }, sessionEnded: { classPropertyName: "sessionEnded", publicName: "sessionEnded", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed", subtitlesChange: "subtitlesChange", annotationsExit: "annotationsExit" }, host: { listeners: { "document:fullscreenchange": "onFullscreenChange()", "window:resize": "onWindowResize()", "document:keydown": "onKeyDown($event)" } }, providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], viewQueries: [{ propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "rootRef", first: true, predicate: ["root"], descendants: true, isSignal: true }], ngImport: i0, template: `
80509
80838
  <div #root class="pptx-ng-presentation-root">
80510
80839
  <!--
80511
80840
  Slide counter, rendered first in DOM (before slide content) so a
@@ -80865,7 +81194,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
80865
81194
  </button>
80866
81195
  </div>
80867
81196
  `, styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}.pptx-ng-presentation-tools{position:absolute;bottom:max(1rem,env(safe-area-inset-bottom));left:1rem;display:flex;gap:.25rem;padding:.25rem;border-radius:.5rem;background:#0000008c;z-index:80}.pptx-ng-presentation-tools button{width:2rem;height:2rem;border:none;border-radius:.35rem;background:transparent;color:#fff;font-size:1rem;cursor:pointer}.pptx-ng-presentation-tools button:hover{background:#ffffff26}.pptx-ng-presentation-tools button.is-active{background:#ffffff4d}.presenter-blank{position:absolute;inset:0;z-index:75}.pptx-ng-presentation-end{position:absolute;inset:0;z-index:90;display:flex;align-items:flex-start;border:0;padding:0;background:#000;text-align:left;cursor:default}.pptx-ng-presentation-end span{padding:.75rem 1rem;color:#ffffffb3;font-size:12px}.presenter-laser{position:absolute;z-index:76;width:20px;height:20px;transform:translate(-50%,-50%);border-radius:50%;background:#ef4444;box-shadow:0 0 20px 8px #ef444488;pointer-events:none}.presenter-caption{position:absolute;z-index:77;left:10%;right:10%;bottom:2rem;padding:.75rem 1.5rem;border-radius:.5rem;background:#000c;color:#fff;text-align:center;font-size:1.25rem;pointer-events:none}\n"] }]
80868
- }], ctorParameters: () => [], propDecorators: { slides: [{ type: i0.Input, args: [{ isSignal: true, alias: "slides", required: true }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], startIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIndex", required: false }] }], showWithAnimation: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWithAnimation", required: false }] }], subtitlesVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitlesVisible", required: false }] }], sessionEnded: [{ type: i0.Input, args: [{ isSignal: true, alias: "sessionEnded", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], subtitlesChange: [{ type: i0.Output, args: ["subtitlesChange"] }], annotationsExit: [{ type: i0.Output, args: ["annotationsExit"] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], rootRef: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }], onFullscreenChange: [{
81197
+ }], ctorParameters: () => [], propDecorators: { slides: [{ type: i0.Input, args: [{ isSignal: true, alias: "slides", required: true }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], startIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIndex", required: false }] }], showWithAnimation: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWithAnimation", required: false }] }], useTimings: [{ type: i0.Input, args: [{ isSignal: true, alias: "useTimings", required: false }] }], subtitlesVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitlesVisible", required: false }] }], sessionEnded: [{ type: i0.Input, args: [{ isSignal: true, alias: "sessionEnded", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], subtitlesChange: [{ type: i0.Output, args: ["subtitlesChange"] }], annotationsExit: [{ type: i0.Output, args: ["annotationsExit"] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], rootRef: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }], onFullscreenChange: [{
80869
81198
  type: HostListener,
80870
81199
  args: ['document:fullscreenchange']
80871
81200
  }], onWindowResize: [{
@@ -85515,7 +85844,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
85515
85844
  }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
85516
85845
 
85517
85846
  // Generated by scripts/inline-shared.mjs from package.json. Do not edit.
85518
- const PPTX_ANGULAR_VIEWER_VERSION = "2.6.5";
85847
+ const PPTX_ANGULAR_VIEWER_VERSION = "2.7.0";
85519
85848
 
85520
85849
  /**
85521
85850
  * account-page.component.ts: File > Account content.
@@ -111440,6 +111769,7 @@ class PowerPointViewerComponent {
111440
111769
  [mediaDataUrls]="loader.mediaDataUrls()"
111441
111770
  [startIndex]="customShowsCtl.presentationStartIndex()"
111442
111771
  [showWithAnimation]="loader.presentationProperties().showWithAnimation"
111772
+ [useTimings]="loader.presentationProperties().advanceMode !== 'manual'"
111443
111773
  [subtitlesVisible]="presentationMode.subtitlesVisible()"
111444
111774
  [sessionEnded]="audienceSessionEnded()"
111445
111775
  (subtitlesChange)="presentationMode.subtitlesVisible.set($event)"
@@ -111720,7 +112050,7 @@ class PowerPointViewerComponent {
111720
112050
  />
111721
112051
  }
111722
112052
  </div>
111723
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex", "showWithAnimation", "subtitlesVisible", "sessionEnded"], outputs: ["indexChange", "closed", "subtitlesChange", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow", "navigateToSlide"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select", "closed"] }, { kind: "component", type: SlideDefaultInspectorComponent, selector: "pptx-slide-default-inspector", inputs: ["slideIndex", "canEdit", "selectedElement", "comments"], outputs: ["commentAdd", "commentRemove", "commentResolve"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting", "hiddenActions"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex", "showAiActions"], outputs: ["closed", "askAi", "fixAi"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName"], outputs: ["add", "remove", "resolve"] }, { kind: "component", type: SignaturesPanelComponent, selector: "pptx-signatures-panel", inputs: ["signatures"] }, { kind: "component", type: AccessibilityPanelComponent, selector: "pptx-accessibility-panel", inputs: ["issues"], outputs: ["selectSlide"] }, { kind: "component", type: CollaborationCursorsComponent, selector: "pptx-collaboration-cursors", inputs: ["cursors", "zoom"] }, { kind: "component", type: RemoteSelectionOverlayComponent, selector: "pptx-remote-selection-overlay", inputs: ["presences", "elements", "activeSlideIndex", "zoom"] }, { kind: "component", type: FollowModeBarComponent, selector: "pptx-follow-mode-bar", inputs: ["presences", "followedClientId"], outputs: ["follow"] }, { kind: "component", type: PropertiesDialogComponent, selector: "pptx-properties-dialog", inputs: ["open", "properties"], outputs: ["save", "close"] }, { kind: "component", type: HyperlinkDialogComponent, selector: "pptx-hyperlink-dialog", inputs: ["open", "element"], outputs: ["save", "close"] }, { kind: "component", type: PrintDialogComponent, selector: "pptx-print-dialog", inputs: ["slides", "activeSlideIndex", "defaultSlidesPerPage", "defaultFrameSlides"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit", "hiddenActions"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen", "aiEnabled", "aiPanelOpen", "hiddenActions"], outputs: ["toggleMenu", "toggleAiPanel", "undo", "redo", "share", "save", "present"] }, { kind: "component", type: MasterViewCanvasComponent, selector: "pptx-master-view-canvas", inputs: ["tab", "slideMasters", "activeMasterIndex", "activeLayoutIndex", "notesMaster", "handoutMaster", "canvasSize", "notesCanvasSize", "mediaDataUrls", "editable"], outputs: ["notesMasterChange", "handoutMasterChange"] }, { kind: "component", type: MasterViewSidebarComponent, selector: "pptx-master-view-sidebar", inputs: ["tab", "slideMasters", "notesMaster", "handoutMaster", "activeMasterIndex", "activeLayoutIndex", "handoutSlidesPerPage"], outputs: ["tabChange", "selectMaster", "selectLayout", "slidesPerPageChange", "backgroundChange", "close"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide", "expanded"], outputs: ["update", "notesToggle"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "hasMacros", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount", "spellCheckEnabled", "showSubtitles", "hiddenActions", "aiEnabled", "aiPanelOpen", "accountAuth"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "presentFromBeginning", "rehearseTimings", "toggleSubtitles", "openSubtitleSettings", "recordFromBeginning", "recordFromCurrent", "spellCheckChange", "share", "broadcast", "openFile", "openRecentFile", "createPresentation", "save", "savePpsx", "savePptm", "packageForSharing", "toggleSidebar", "toggleAiPanel", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "openMasterView", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "copySlideAsImage", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "openSettings"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen", "hiddenActions", "quickAccess"], outputs: ["toggleAutosave", "save", "undo", "redo", "quickCommand", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName", "theme"], outputs: ["applyTheme", "applyCustomTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden"] }, { kind: "component", type: CustomShowsComponent, selector: "pptx-custom-shows", inputs: ["open", "slides", "customShows", "activeCustomShowId"], outputs: ["create", "remove", "update", "setActive", "close"] }, { kind: "component", type: InsertSmartArtDialogComponent, selector: "pptx-insert-smart-art-dialog", inputs: ["open"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows", "themeKey", "availableThemes", "localeCode", "availableLocales", "aiExportVisible"], outputs: ["restoreContent", "themeKeySelect", "localeSelect"] }, { kind: "component", type: RehearseTimingsComponent, selector: "pptx-rehearse-timings", inputs: ["summary", "paused", "slideStartedAt", "presentationStartedAt", "timings"], outputs: ["togglePause", "save", "discard"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
112053
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex", "showWithAnimation", "useTimings", "subtitlesVisible", "sessionEnded"], outputs: ["indexChange", "closed", "subtitlesChange", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow", "navigateToSlide"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select", "closed"] }, { kind: "component", type: SlideDefaultInspectorComponent, selector: "pptx-slide-default-inspector", inputs: ["slideIndex", "canEdit", "selectedElement", "comments"], outputs: ["commentAdd", "commentRemove", "commentResolve"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting", "hiddenActions"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex", "showAiActions"], outputs: ["closed", "askAi", "fixAi"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName"], outputs: ["add", "remove", "resolve"] }, { kind: "component", type: SignaturesPanelComponent, selector: "pptx-signatures-panel", inputs: ["signatures"] }, { kind: "component", type: AccessibilityPanelComponent, selector: "pptx-accessibility-panel", inputs: ["issues"], outputs: ["selectSlide"] }, { kind: "component", type: CollaborationCursorsComponent, selector: "pptx-collaboration-cursors", inputs: ["cursors", "zoom"] }, { kind: "component", type: RemoteSelectionOverlayComponent, selector: "pptx-remote-selection-overlay", inputs: ["presences", "elements", "activeSlideIndex", "zoom"] }, { kind: "component", type: FollowModeBarComponent, selector: "pptx-follow-mode-bar", inputs: ["presences", "followedClientId"], outputs: ["follow"] }, { kind: "component", type: PropertiesDialogComponent, selector: "pptx-properties-dialog", inputs: ["open", "properties"], outputs: ["save", "close"] }, { kind: "component", type: HyperlinkDialogComponent, selector: "pptx-hyperlink-dialog", inputs: ["open", "element"], outputs: ["save", "close"] }, { kind: "component", type: PrintDialogComponent, selector: "pptx-print-dialog", inputs: ["slides", "activeSlideIndex", "defaultSlidesPerPage", "defaultFrameSlides"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit", "hiddenActions"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen", "aiEnabled", "aiPanelOpen", "hiddenActions"], outputs: ["toggleMenu", "toggleAiPanel", "undo", "redo", "share", "save", "present"] }, { kind: "component", type: MasterViewCanvasComponent, selector: "pptx-master-view-canvas", inputs: ["tab", "slideMasters", "activeMasterIndex", "activeLayoutIndex", "notesMaster", "handoutMaster", "canvasSize", "notesCanvasSize", "mediaDataUrls", "editable"], outputs: ["notesMasterChange", "handoutMasterChange"] }, { kind: "component", type: MasterViewSidebarComponent, selector: "pptx-master-view-sidebar", inputs: ["tab", "slideMasters", "notesMaster", "handoutMaster", "activeMasterIndex", "activeLayoutIndex", "handoutSlidesPerPage"], outputs: ["tabChange", "selectMaster", "selectLayout", "slidesPerPageChange", "backgroundChange", "close"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide", "expanded"], outputs: ["update", "notesToggle"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "hasMacros", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount", "spellCheckEnabled", "showSubtitles", "hiddenActions", "aiEnabled", "aiPanelOpen", "accountAuth"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "presentFromBeginning", "rehearseTimings", "toggleSubtitles", "openSubtitleSettings", "recordFromBeginning", "recordFromCurrent", "spellCheckChange", "share", "broadcast", "openFile", "openRecentFile", "createPresentation", "save", "savePpsx", "savePptm", "packageForSharing", "toggleSidebar", "toggleAiPanel", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "openMasterView", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "copySlideAsImage", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "openSettings"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen", "hiddenActions", "quickAccess"], outputs: ["toggleAutosave", "save", "undo", "redo", "quickCommand", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName", "theme"], outputs: ["applyTheme", "applyCustomTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden"] }, { kind: "component", type: CustomShowsComponent, selector: "pptx-custom-shows", inputs: ["open", "slides", "customShows", "activeCustomShowId"], outputs: ["create", "remove", "update", "setActive", "close"] }, { kind: "component", type: InsertSmartArtDialogComponent, selector: "pptx-insert-smart-art-dialog", inputs: ["open"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows", "themeKey", "availableThemes", "localeCode", "availableLocales", "aiExportVisible"], outputs: ["restoreContent", "themeKeySelect", "localeSelect"] }, { kind: "component", type: RehearseTimingsComponent, selector: "pptx-rehearse-timings", inputs: ["summary", "paused", "slideStartedAt", "presentationStartedAt", "timings"], outputs: ["togglePause", "save", "discard"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
111724
112054
  Promise.resolve().then(function () { return aiChatPanel_component; }).then(m => m.AiChatPanelComponent)]] });
111725
112055
  }
111726
112056
  i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ngImport: i0, type: PowerPointViewerComponent, resolveDeferredDeps: () => [/* @ts-ignore */
@@ -112235,6 +112565,7 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ng
112235
112565
  [mediaDataUrls]="loader.mediaDataUrls()"
112236
112566
  [startIndex]="customShowsCtl.presentationStartIndex()"
112237
112567
  [showWithAnimation]="loader.presentationProperties().showWithAnimation"
112568
+ [useTimings]="loader.presentationProperties().advanceMode !== 'manual'"
112238
112569
  [subtitlesVisible]="presentationMode.subtitlesVisible()"
112239
112570
  [sessionEnded]="audienceSessionEnded()"
112240
112571
  (subtitlesChange)="presentationMode.subtitlesVisible.set($event)"
@@ -114300,6 +114631,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
114300
114631
  * stateful service (signals + RAF/timers) stays Angular-local.
114301
114632
  */
114302
114633
 
114634
+ /**
114635
+ * Gradient fill CSS builders.
114636
+ *
114637
+ * Thin re-export shim. The implementation now lives in the framework-agnostic
114638
+ * `pptx-viewer-shared` package (`render/fill-style.ts`), vendored into this
114639
+ * library via `../internal/shared`. This file preserves the historical
114640
+ * `./color-gradient` import surface so existing consumers and colocated tests
114641
+ * keep importing the same symbols unchanged.
114642
+ *
114643
+ * Gradient rendering follows ECMA-376 Part 1, §20.1.8.35 (gradFill) and
114644
+ * §20.1.8.49 (pathFill).
114645
+ */
114646
+
114647
+ /**
114648
+ * SVG pattern generation for OOXML pattern fill presets.
114649
+ *
114650
+ * Thin re-export shim. The implementation now lives in the framework-agnostic
114651
+ * `pptx-viewer-shared` package (`render/fill-style.ts`), vendored into this
114652
+ * library via `../internal/shared`. This file preserves the historical
114653
+ * `./color-patterns` import surface.
114654
+ *
114655
+ * Deliberate divergence: shared `getPatternSvg` returns `string | null` for an
114656
+ * unknown preset, whereas the Angular binding's public contract (and its
114657
+ * colocated tests) expect `string | undefined`. This shim normalises `null` to
114658
+ * `undefined` so that contract is preserved.
114659
+ *
114660
+ * Reference: ECMA-376 Part 1, §20.1.10.33 (ST_PresetPatternVal).
114661
+ */
114662
+ /**
114663
+ * Generate an inline SVG string for an OOXML preset pattern fill.
114664
+ *
114665
+ * @param preset - DrawingML `ST_PresetPatternVal` string (e.g. `"pct5"`).
114666
+ * @param fgColor - Foreground hex colour (e.g. `"#000000"`).
114667
+ * @param bgColor - Background hex colour (e.g. `"#ffffff"`).
114668
+ * @returns An SVG string, or `undefined` when the preset is not implemented.
114669
+ */
114670
+ function getPatternSvg(preset, fgColor, bgColor) {
114671
+ return getPatternSvg$1(preset, fgColor, bgColor) ?? undefined;
114672
+ }
114673
+
114303
114674
  function cn(...values) {
114304
114675
  return values.filter((v) => Boolean(v)).join(' ');
114305
114676
  }
@@ -114368,5 +114739,5 @@ function cn(...values) {
114368
114739
  * Generated bundle index. Do not edit.
114369
114740
  */
114370
114741
 
114371
- export { DATA_TABLE_KEY_W as $, ALIGN_OPTIONS as A, BroadcastDialogComponent as B, CHART_EDITOR_STYLES as C, ChartAxisOptionsComponent as D, ChartAxisStyleOptionsComponent as E, ChartComboTypeOptionsComponent as F, ChartDataEditorComponent as G, ChartDataLabelOptionsComponent as H, ChartDatapointOptionsComponent as I, ChartDisplayOptionsComponent as J, ChartElementViewComponent as K, ChartErrorBarOptionsComponent as L, ChartMarkerOptionsComponent as M, ChartPartSelectionService as N, ChartPrimitivesComponent as O, ChartRendererComponent as P, ChartTrendlineOptionsComponent as Q, CollaborationCursorsComponent as R, CollaborationService as S, ColorChangedImageComponent as T, CommentsPanelComponent as U, CommentsService as V, ComparePanelComponent as W, ConnectorRendererComponent as X, ConnectorTextOverlayComponent as Y, CustomShowsComponent as Z, DATA_TABLE_HEADER_H as _, AUDIENCE_HASH as a, MIN_ZOOM_SCALE as a$, DATA_TABLE_PADDING as a0, DATA_TABLE_ROW_H as a1, DEFAULT_BOUNDS as a2, DEFAULT_BROADCAST_SERVER_URL as a3, DEFAULT_CANVAS_HEIGHT as a4, DEFAULT_CANVAS_WIDTH as a5, DEFAULT_COLOR_SCHEME as a6, DEFAULT_FILL_COLOR as a7, DEFAULT_LAYOUT as a8, DEFAULT_PALETTE$1 as a9, ExportProgressModalComponent as aA, ExportService as aB, FieldContextService as aC, FindBarComponent as aD, FindReplaceBarComponent as aE, FollowModeBarComponent as aF, FontEmbeddingListComponent as aG, FontEmbeddingPanelComponent as aH, GALLERY_THEME_PRESETS as aI, GradientPickerComponent as aJ, HANDOUT_OPTIONS as aK, HeaderFooterDialogComponent as aL, HyperlinkDialogComponent as aM, ImagePropertiesPanelComponent as aN, InkDrawingService as aO, InkRendererComponent as aP, InsertSmartArtDialogComponent as aQ, InspectorPaneHeaderComponent as aR, InspectorPanelComponent as aS, IsMobileService as aT, KeepAnnotationsDialogComponent as aU, LOCALE_CATALOG as aV, LONG_PRESS_DURATION_MS as aW, LONG_PRESS_MOVE_TOLERANCE_PX as aX, LoadContentService as aY, LocalPresencePublisher as aZ, MAX_ZOOM_SCALE as a_, DEFAULT_PRINT_SETTINGS as aa, DEFAULT_SLIDE_BACKGROUND as ab, DEFAULT_STROKE_COLOR as ac, DEFAULT_STYLE as ad, DEFAULT_TABLE_ROW_HEIGHT as ae, DEFAULT_TEXT_COLOR$1 as af, DEFAULT_VIEWER_PROFILE as ag, DIRECTIONAL_PRESETS as ah, DIRECTION_OPTIONS as ai, DocumentPropertiesCardComponent as aj, EMBEDDED_FONTS_STYLE_ID as ak, EMPHASIS_PRESETS as al, ENTRANCE_PRESETS as am, TEMPLATES as an, EXIT_PRESETS as ao, EditorContextMenuComponent as ap, EditorHistory as aq, EditorStateService as ar, EditorToolbarComponent as as, EffectsPanelComponent as at, ElementRendererComponent as au, EmbeddedFontsService as av, EncryptedFileDialogComponent as aw, EquationEditorDialogComponent as ax, EquationRendererComponent as ay, EquationTemplateGalleryComponent as az, AUDIENCE_NONCE_KEY as b, SLIDE_PX_PER_INCH as b$, MediaPreviewComponent as b0, MediaPropertiesPanelComponent as b1, MediaRendererComponent as b2, MediaTrimTimelineComponent as b3, MobileBottomBarComponent as b4, MobileMenuSheetComponent as b5, MobilePresenterViewComponent as b6, MobileSheetComponent as b7, MobileSlidesSheetComponent as b8, MobileToolbarComponent as b9, RESIZE_HANDLES as bA, RULER_THICKNESS as bB, RemoteSelectionOverlayComponent as bC, RibbonAnimationsSectionComponent as bD, RibbonArrangeSectionComponent as bE, RibbonColorPopoverComponent as bF, RibbonComponent as bG, RibbonDesignSectionComponent as bH, RibbonDrawSectionComponent as bI, RibbonDrawingGroupComponent as bJ, RibbonEditingSectionComponent as bK, RibbonFileSectionComponent as bL, RibbonFontControlsComponent as bM, RibbonHomeSectionComponent as bN, RibbonInsertFieldsComponent as bO, RibbonInsertSectionComponent as bP, RibbonParagraphControlsComponent as bQ, RibbonPrimaryRowComponent as bR, RibbonReviewSectionComponent as bS, RibbonSlideshowSectionComponent as bT, RibbonTransitionsSectionComponent as bU, RibbonViewSectionComponent as bV, RulerGuidesService as bW, SEQUENCE_OPTIONS as bX, SEVERITY_GROUPS as bY, SEVERITY_LABELS as bZ, SHORTCUT_REFERENCE_ITEMS as b_, ModalDialogComponent as ba, Model3DRendererComponent as bb, NotesHandoutCardComponent as bc, NotesPanelComponent as bd, NotesToolbarComponent as be, OleRendererComponent as bf, POWER_POINT_VIEWER_PROVIDERS as bg, PRESENTER_CHANNEL_NAME as bh, PRESENTER_MSG_ORIGIN as bi, PasswordProtectionDialogComponent as bj, PasswordStrengthMeterComponent as bk, PowerPointViewerComponent as bl, PresentationAnnotationOverlayComponent as bm, PresentationAnnotationsService as bn, PresentationOverlayComponent as bo, PresentationPropertiesPanelComponent as bp, PresentationSettingsCardComponent as bq, PresentationSubtitleBarComponent as br, PresentationTransitionOverlayComponent as bs, PresenterViewComponent as bt, PresenterWindowService as bu, PrintDialogComponent as bv, PrintService as bw, PrintSettingsPanelComponent as bx, PropertiesDialogComponent as by, REPEAT_MODE_OPTIONS as bz, AVATAR_COLOR_SWATCHES as c, ViewerDocumentPropertiesService as c$, SLIDE_TRANSITION_KEYFRAMES as c0, DEFAULT_PALETTE as c1, PALETTES$1 as c2, SMART_ART_COLOR_SCHEMES as c3, SMART_ART_STYLE_OPTIONS as c4, SUB_ITEM_LABEL as c5, SVG_WARP_PRESETS as c6, SWIPE_MAX_VERTICAL_PX as c7, SWIPE_THRESHOLD_PX as c8, SelectionPaneComponent as c9, TABLE_STRUCTURE_TOGGLES as cA, TEXT_DIRECTION_OPTIONS$1 as cB, THEME_CATALOG as cC, TIMING_CURVE_OPTIONS as cD, TRIGGER_OPTIONS as cE, TYPE_LABELS as cF, TableCellAdvancedFillComponent as cG, TableCellFormattingComponent as cH, TableDataEditorComponent as cI, TablePropertiesComponent as cJ, TableRendererComponent as cK, TableResizeOverlayComponent as cL, TableSelectionService as cM, TextAdvancedPanelComponent as cN, ThemeEditorFieldsComponent as cO, ThemeGalleryComponent as cP, ThemeSelectorCardComponent as cQ, TitleBarComponent as cR, VALIGN_OPTIONS as cS, VIEWER_THEME as cT, VersionHistoryPanelComponent as cU, ViewerCanvasEditingService as cV, ViewerCollabCursorService as cW, ViewerCollaborationSessionService as cX, ViewerCompareService as cY, ViewerCustomShowsService as cZ, ViewerDialogsService as c_, SetUpSlideShowDialogComponent as ca, SettingsAppearanceTabComponent as cb, SettingsDialogComponent as cc, SettingsLanguageTabComponent as cd, ShareDialogComponent as ce, ShortcutPanelComponent as cf, ShowOptionsFieldsetComponent as cg, ShowSlidesFieldsetComponent as ch, SignatureStrippedDialogComponent as ci, SignaturesPanelComponent as cj, SignaturesService as ck, SlideCanvasComponent as cl, SlideDefaultInspectorComponent as cm, SlideDiffChangesComponent as cn, SlideDiffRowComponent as co, SlideDiffThumbnailsComponent as cp, SlideSizeCardComponent as cq, SlideSorterOverlayComponent as cr, SlideThemeOverridePanelComponent as cs, SlidesPanelComponent as ct, SmartArt3DRendererComponent as cu, SmartArt3DService as cv, SmartArtPreviewComponent as cw, SmartArtPropertiesComponent as cx, SmartArtRendererComponent as cy, StatusBarComponent as cz, AccessibilityPanelComponent as d, buildFallbackViewModel as d$, ViewerExportService as d0, ViewerExtraDialogsComponent as d1, ViewerFileIOService as d2, ViewerFindReplaceService as d3, ViewerFormatPainterService as d4, ViewerInspectorPanelService as d5, ViewerKeyboardService as d6, ViewerMobileSheetService as d7, ViewerPresentationModeService as d8, ViewerThemeGalleryService as d9, asMediaElement as dA, assignUserColor as dB, attachTouchGestures as dC, beginNodeEdit as dD, boolFromEvent as dE, bringForward as dF, bringToFront as dG, buildBarActions as dH, buildBroadcastConfig as dI, buildBroadcastViewerUrl as dJ, buildCategoryLabels as dK, buildCellParagraphs as dL, buildChartViewModel as dM, buildChatLogExport as dN, buildChatLogMarkdown as dO, buildChromeStyle as dP, buildClearHyperlinkPatch as dQ, buildClickGroups as dR, buildColStyles as dS, buildCollaborationConfig as dT, buildComboViewModel as dU, buildCssGradientFromShapeStyle as dV, buildDuotoneFilter as dW, buildDuotoneFilterId as dX, buildEmbeddedFontStyles as dY, buildEquationElement as dZ, buildEquationSegment as d_, ViewerTouchGesturesService as da, ViewerZoomService as db, WEBM_MIME_CANDIDATES as dc, WriteBackScheduler as dd, ZoomNavigationService as de, ZoomRendererComponent as df, ZoomTargetService as dg, addCategory as dh, addCommentToList as di, addGradientStopPatch as dj, addItem as dk, addSeries as dl, addSubItem as dm, advanceStep as dn, aiToggleVisible as dp, alignPatch as dq, animationFor as dr, annotationMapToInkInserts as ds, applyAcceptedDiff as dt, applyAnimationPreset as du, applyFindReplacements as dv, applyFormatToElement as dw, applyMove as dx, applyResize as dy, applyTableStylePreset as dz, AccessibilityService as e, computeDataTablePrimitives as e$, buildFontFaceRule as e0, buildGradientFillCss as e1, buildGridlinesAndLabels as e2, buildHyperlinkPatch as e3, buildInkContainerStyle as e4, buildInkStrokes as e5, buildLegend as e6, buildModel3DContainerStyle as e7, buildModel3DViewModel as e8, buildOleActionModel as e9, cellStyleToStyleMap as eA, cellTdStyle as eB, changeCountLabel as eC, changeIcon as eD, characterSpacingPatch as eE, checkFontAvailable as eF, clampCursorPosition as eG, clampGifDimensions as eH, clampIndex as eI, clampNotesFontSize as eJ, clampScale as eK, clampStep as eL, clearAllLocalViewerData as eM, clearAudienceContent as eN, cn as eO, collectAccessibilityIssues as eP, collectElementText as eQ, collectSlideText as eR, collectStoredChats as eS, collectUsedFontFamilies as eT, columnWidthStyle as eU, commitNodeText as eV, computeAlign as eW, computeAxisTitlePrimitives as eX, computeBarRects as eY, computeBubbleRadius as eZ, computeCornerHandle as e_, buildOleInfoRows as ea, buildPatternFillCss as eb, buildPrintHtmlDocument as ec, buildPropertiesPatch as ed, buildRegionMapViewModel as ee, buildSaveSlides as ef, buildShareUrl as eg, buildSmartArtInsertElement as eh, buildSmartArtNodes as ei, buildStockViewModel as ej, buildSurfaceViewModel as ek, buildTableViewModel as el, buildTreemapViewModel as em, buildTrimFragment as en, buildWaterfallViewModel as eo, buildZeroLine as ep, buildZoomContainerStyle as eq, buildZoomViewModel as er, bulletIndentPx as es, canAddTopLevelNode as et, canRemoveTopLevelNode as eu, canStartBroadcast as ev, canStartShare as ew, canUseClipboard as ex, captionDisplayText as ey, cellRunStyle as ez, AccountPageComponent as f, encodeGif as f$, computeDistribute as f0, computeDrawingViewBox as f1, computeErrorBarPrimitives as f2, computeFocusTargets as f3, computeHandleBoxes as f4, computeHandoutLayout as f5, computeIsMobile as f6, computeIsTablet as f7, computeLinePoints as f8, computeLinearRegression as f9, createWebsocketBundle as fA, cssObjectToStyleMap as fB, currentColorScheme as fC, currentLayout as fD, currentStyle as fE, defaultCssVars as fF, defaultRadius as fG, defaultThemeColors as fH, deleteElementsByIds as fI, deleteVersion as fJ, demoteNode as fK, deriveModel3DBlobUrl as fL, derivePresenceList as fM, describeSmartArtBounds as fN, disableGlowPatch as fO, disableInnerShadowPatch as fP, disableOuterShadowPatch as fQ, disableReflectionPatch as fR, disableSoftEdgePatch as fS, duplicateElementById as fT, durationOf as fU, effectsStateOf as fV, enableGlowPatch as fW, enableInnerShadowPatch as fX, enableOuterShadowPatch as fY, enableReflectionPatch as fZ, enableSoftEdgePatch as f_, computePageCount as fa, computePieLayout as fb, computePieSlicePath as fc, computePieSlices as fd, computePlotLayout as fe, computeRSquared as ff, computeRadarPoints as fg, computeScatterDots as fh, computeSelectionBoxes as fi, computeSingleSelected as fj, computeSlideIndices as fk, computeSnap as fl, computeStackedBarRects as fm, computeStackedValueRange as fn, computeTextLines as fo, computeTimerProgress as fp, computeTrendlinePrimitives as fq, computeValueRange as fr, convertOmmlToMathMl as fs, copyFormatFromElement as ft, countAccessibilityIssues as fu, countAnnotationStrokes as fv, createAngularAiBridge as fw, createCustomShow as fx, createSwipeDismissDrag as fy, createWebrtcBundle as fz, ActionSettingsPanelComponent as g, hasAnimation as g$, estimatePageCount as g0, evenColumnWidths as g1, evenRowHeights as g2, exitPresentationFullscreen as g3, exportAiChatLogs as g4, extractPathPoints as g5, eyedropperAvailable as g6, fillColorOf as g7, findInSlides as g8, findOwningSlideIndex as g9, getOleBadgeLabel as gA, getOleDisplayName as gB, getOleDownloadFileName as gC, getOleTypeColor as gD, getOleTypeLabel as gE, getPasswordStrength as gF, getPatternSvg as gG, getPlaceholderStyle as gH, getVersions as gI, getResolvedShapeClipPath as gJ, getResolvedShapeClipPathFor as gK, getShapeFillStrokeStyle as gL, getSlideBackgroundStyle as gM, getSlideTransitionAnimations as gN, getSmartArtNodeBounds as gO, getSpeechRecognitionCtor as gP, getTextBlockStyle as gQ, getTextWarp as gR, getTouchDistance as gS, getWarpCategory as gT, getWarpPath as gU, gradientStateFromStyle as gV, gradientStateOf as gW, gradientStatePatch as gX, gridColumns as gY, groupElements as gZ, groupIssuesBySeverity as g_, findSlideIndexByElementId as ga, fitPolynomial as gb, fitZoom as gc, focusTargetChips as gd, fontMimeForFormat as ge, fontSizeOf as gf, formatAutoNumber as gg, formatAxisValue as gh, formatBytes as gi, formatCursorLabel as gj, formatElapsed as gk, formatFileSize as gl, formatPropertyDate as gm, formatTime as gn, fpsToFrameIntervalMs as go, generateBroadcastRoomId as gp, generateCommentId as gq, generateCustomShowId as gr, generatePressureCircles as gs, generateRulerTicks as gt, getClrChangeParams as gu, getContainerStyle as gv, getDuotoneFilterDef as gw, getImageSrc as gx, getLocalStorageUsageSummary as gy, getOleAriaLabel as gz, AdvancedChartEditorComponent as h, normalizeValue as h$, hasCopyableFormat as h0, hasExistingLink as h1, hasExitedFullscreen as h2, hasGradientFill as h3, hasPressureVariation as h4, hasVisibleSlideAfter as h5, headerLabel as h6, inkViewBox as h7, insertColumn as h8, insertRow as h9, mergeDown as hA, mergeRight as hB, mergeSelection as hC, moveElementBy as hD, moveNodeDown as hE, moveNodeUp as hF, msToFrameDelayCs as hG, narrowToCircle as hH, narrowToPolygon as hI, narrowToRect as hJ, newChartElement as hK, newEquationElement as hL, newPresetShapeElement as hM, newShapeElement as hN, newSmartArtElement as hO, newTableElement as hP, newTextElement as hQ, nextVisibleIndex as hR, nodeBold as hS, nodeEditBox as hT, nodeFillColor as hU, nodeFontColor as hV, nodeIdFromKey as hW, nodeItalic as hX, nodeStyle as hY, normalizeFontFormat as hZ, normalizeSlidesPerPage as h_, interpolateWidth as ha, isAudienceTab as hb, isBold as hc, isBrowserOpenableMime as hd, isChildNode as he, isElementInteractive as hf, isInjectableUrl as hg, isItalic as hh, isPpactionUrl as hi, isPresenterMessage as hj, isSigned as hk, isTextElement as hl, isTwoTableFocus as hm, isUnderline as hn, isUrlSafe as ho, isValidRoomId as hp, isViewportBackgroundPressTarget as hq, isZoomActivationKey as hr, issueTrackKey as hs, issueTypeLabel as ht, keyToLabel as hu, latexToMathml as hv, linePointsToSvgString as hw, lineSpacingPatch as hx, loadAudienceContent as hy, mergeCaptionResults as hz, AiChangeOverlayComponent as i, revealedElementStyles as i$, numFromEvent as i0, ommlToMathml as i1, ooxmlDashToCssBorderStyle as i2, openNativeEyeDropper as i3, overallStatus as i4, paletteColor as i5, parseAudienceNonce as i6, parseNodeTextarea as i7, partitionSlides as i8, patchChartData as i9, removeCommentFromList as iA, removeElementAnimation as iB, removeGradientStopPatch as iC, removeNode as iD, removeRow as iE, removeSeries as iF, renderToCanvas as iG, reorderAnimationDown as iH, reorderAnimationUp as iI, replaceInSlides as iJ, replaceMatch as iK, requestPresentationFullscreen as iL, resizeElement as iM, resolveCaptionTracks as iN, resolveChartKind as iO, resolveFontVariant as iP, resolveHyperlinkHref as iQ, resolveInteractiveElementId as iR, resolveMediaSrc as iS, resolveOleType as iT, resolveParagraphBullet as iU, resolvePresenterNotes as iV, resolveProfileInitial as iW, resolveRegionCode as iX, resolvePalette as iY, resolveThemeCatalogEntry as iZ, resolveTransitionDuration as i_, patchChartStyle as ia, patchTableData as ib, patchTextStyle as ic, pendingElementStyles as id, pickColorByClickFallback as ie, pickSupportedMimeType as ig, planGifFrames as ih, planVideoSegments as ii, pointsToSvgPathD as ij, presenceToCursors as ik, presetByLayout as il, presetsForCategory as im, pressuresToWidths as io, prevVisibleIndex as ip, projectDrawingShapes as iq, promoteNode as ir, provideViewerTheme as is, radarAngle as it, radarRingPoints as iu, recordWebm as iv, redistributeColumnWidth as iw, removeAnimation as ix, removeCategory as iy, removeColumn as iz, AiChatPanelComponent as j, signatureCountLabel as j$, routeOrthogonalConnector as j0, rowStyle as j1, sampleColorFromSlide as j2, sanitizeColor as j3, sanitizeSlideIndex as j4, sanitizeUserName as j5, saveViewerProfile as j6, scanAvailableFonts as j7, searchSlides as j8, seedBroadcastFields as j9, setElementPosition as jA, setGridlineStyle as jB, setLayout as jC, setLegend as jD, setNodeStyle as jE, setNodeText as jF, setRepeatCount as jG, setRepeatMode as jH, setSequence as jI, setSeriesChartType as jJ, setSeriesColor as jK, setSeriesErrorBars as jL, setSeriesMarker as jM, setSeriesName as jN, setSeriesTrendline as jO, setSeriesValue as jP, setStyle as jQ, setTimingCurve as jR, setTitle as jS, setTrigger as jT, setTriggerShapeId as jU, shapeStylePatch as jV, sheetAfterNavigate as jW, shouldBlockClickAdvance as jX, shouldUseSvgWarp as jY, showDirectionPicker as jZ, showsTemplateAffordance as j_, seedHyperlinkDraft as ja, seedPropertiesDraft as jb, seedShareFields as jc, segmentFrameCount as jd, selectValue$2 as je, sendBackward as jf, sendToBack as jg, sequentialColorScale as jh, serializeWriteBack as ji, seriesColor as jj, setAnimationEmphasis as jk, setAnimationEntrance as jl, setAnimationExit as jm, setAxis as jn, setAxisLogScale as jo, setAxisTitleStyle as jp, setCategoryLabel as jq, setCellText as jr, setColorScheme as js, setDataLabels as jt, setDataPointExplosion as ju, setDataPointFill as jv, setDataPointLabel as jw, setDelay as jx, setDirection as jy, setDuration as jz, AiChatService as k, signatureKey as k0, signatureTimestamp as k1, signerName as k2, statusLabel as k3, slideNumberOf as k4, smartArtNodes as k5, paletteColour as k6, snapToGridStep as k7, splitCursorCell as k8, splitMergedCell as k9, updateElementById as kA, updateGlowPatch as kB, updateGradientStopPatch as kC, updateInnerShadowPatch as kD, updateOuterShadowPatch as kE, updateReflectionPatch as kF, vAlignPatch as kG, validatePassword as kH, validatePrintSettings as kI, validateRoomId as kJ, valueToY as kK, vermilionDarkColors as kL, vermilionDarkTheme as kM, vermilionLightColors as kN, vermilionLightTheme as kO, vermilionRadius as kP, waypointsToPathD as kQ, worstStatus as kR, zoomTargetSlideIndex as kS, statusKind as ka, statusLabel$1 as kb, storeAudienceContent as kc, stringFromEvent$5 as kd, strokeColorOf as ke, strokeToInkElement as kf, styleShadowFilter as kg, textAdvancedPatch as kh, textAdvancedStateFromStyle as ki, textAdvancedStateOf as kj, textColorOf as kk, textDirectionPatch as kl, textStyleOf as km, textStylePatch as kn, themeStyle as ko, themeToCssVars as kp, thumbnailHeight as kq, thumbnailZoom as kr, toggleCommentResolvedInList as ks, toggleNodeBold as kt, toggleNodeItalic as ku, toggleSheet as kv, topLevelNodeCount as kw, transformSelectedTextCase as kx, translationsEn as ky, ungroupElements as kz, AiComposerComponent as l, AiFocusBarComponent as m, AiFocusHighlightOverlayComponent as n, AiMessageListComponent as o, AiPanelStore as p, AiProposalCardComponent as q, AiSettingsSectionComponent as r, AiToolCallCardComponent as s, toChatSummary as t, AnimationAuthorPanelComponent as u, AnimationPanelComponent as v, AnimationPlaybackService as w, AutosaveService as x, CURSOR_PALETTE as y, CanvasFitService as z };
114372
- //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-DY-f2Dk9.mjs.map
114742
+ export { DATA_TABLE_KEY_W as $, ALIGN_OPTIONS as A, BroadcastDialogComponent as B, CHART_EDITOR_STYLES as C, ChartAxisOptionsComponent as D, ChartAxisStyleOptionsComponent as E, ChartComboTypeOptionsComponent as F, ChartDataEditorComponent as G, ChartDataLabelOptionsComponent as H, ChartDatapointOptionsComponent as I, ChartDisplayOptionsComponent as J, ChartElementViewComponent as K, ChartErrorBarOptionsComponent as L, ChartMarkerOptionsComponent as M, ChartPartSelectionService as N, ChartPrimitivesComponent as O, ChartRendererComponent as P, ChartTrendlineOptionsComponent as Q, CollaborationCursorsComponent as R, CollaborationService as S, ColorChangedImageComponent as T, CommentsPanelComponent as U, CommentsService as V, ComparePanelComponent as W, ConnectorRendererComponent as X, ConnectorTextOverlayComponent as Y, CustomShowsComponent as Z, DATA_TABLE_HEADER_H as _, AUDIENCE_HASH as a, MIN_ZOOM_SCALE as a$, DATA_TABLE_PADDING as a0, DATA_TABLE_ROW_H as a1, DEFAULT_BOUNDS as a2, DEFAULT_BROADCAST_SERVER_URL as a3, DEFAULT_CANVAS_HEIGHT as a4, DEFAULT_CANVAS_WIDTH as a5, DEFAULT_COLOR_SCHEME as a6, DEFAULT_FILL_COLOR as a7, DEFAULT_LAYOUT as a8, DEFAULT_PALETTE$1 as a9, ExportProgressModalComponent as aA, ExportService as aB, FieldContextService as aC, FindBarComponent as aD, FindReplaceBarComponent as aE, FollowModeBarComponent as aF, FontEmbeddingListComponent as aG, FontEmbeddingPanelComponent as aH, GALLERY_THEME_PRESETS as aI, GradientPickerComponent as aJ, HANDOUT_OPTIONS as aK, HeaderFooterDialogComponent as aL, HyperlinkDialogComponent as aM, ImagePropertiesPanelComponent as aN, InkDrawingService as aO, InkRendererComponent as aP, InsertSmartArtDialogComponent as aQ, InspectorPaneHeaderComponent as aR, InspectorPanelComponent as aS, IsMobileService as aT, KeepAnnotationsDialogComponent as aU, LOCALE_CATALOG as aV, LONG_PRESS_DURATION_MS as aW, LONG_PRESS_MOVE_TOLERANCE_PX as aX, LoadContentService as aY, LocalPresencePublisher as aZ, MAX_ZOOM_SCALE as a_, DEFAULT_PRINT_SETTINGS as aa, DEFAULT_SLIDE_BACKGROUND as ab, DEFAULT_STROKE_COLOR as ac, DEFAULT_STYLE as ad, DEFAULT_TABLE_ROW_HEIGHT as ae, DEFAULT_TEXT_COLOR$1 as af, DEFAULT_VIEWER_PROFILE as ag, DIRECTIONAL_PRESETS as ah, DIRECTION_OPTIONS as ai, DocumentPropertiesCardComponent as aj, EMBEDDED_FONTS_STYLE_ID as ak, EMPHASIS_PRESETS as al, ENTRANCE_PRESETS as am, TEMPLATES as an, EXIT_PRESETS as ao, EditorContextMenuComponent as ap, EditorHistory as aq, EditorStateService as ar, EditorToolbarComponent as as, EffectsPanelComponent as at, ElementRendererComponent as au, EmbeddedFontsService as av, EncryptedFileDialogComponent as aw, EquationEditorDialogComponent as ax, EquationRendererComponent as ay, EquationTemplateGalleryComponent as az, AUDIENCE_NONCE_KEY as b, SLIDE_PX_PER_INCH as b$, MediaPreviewComponent as b0, MediaPropertiesPanelComponent as b1, MediaRendererComponent as b2, MediaTrimTimelineComponent as b3, MobileBottomBarComponent as b4, MobileMenuSheetComponent as b5, MobilePresenterViewComponent as b6, MobileSheetComponent as b7, MobileSlidesSheetComponent as b8, MobileToolbarComponent as b9, RESIZE_HANDLES as bA, RULER_THICKNESS as bB, RemoteSelectionOverlayComponent as bC, RibbonAnimationsSectionComponent as bD, RibbonArrangeSectionComponent as bE, RibbonColorPopoverComponent as bF, RibbonComponent as bG, RibbonDesignSectionComponent as bH, RibbonDrawSectionComponent as bI, RibbonDrawingGroupComponent as bJ, RibbonEditingSectionComponent as bK, RibbonFileSectionComponent as bL, RibbonFontControlsComponent as bM, RibbonHomeSectionComponent as bN, RibbonInsertFieldsComponent as bO, RibbonInsertSectionComponent as bP, RibbonParagraphControlsComponent as bQ, RibbonPrimaryRowComponent as bR, RibbonReviewSectionComponent as bS, RibbonSlideshowSectionComponent as bT, RibbonTransitionsSectionComponent as bU, RibbonViewSectionComponent as bV, RulerGuidesService as bW, SEQUENCE_OPTIONS as bX, SEVERITY_GROUPS as bY, SEVERITY_LABELS as bZ, SHORTCUT_REFERENCE_ITEMS as b_, ModalDialogComponent as ba, Model3DRendererComponent as bb, NotesHandoutCardComponent as bc, NotesPanelComponent as bd, NotesToolbarComponent as be, OleRendererComponent as bf, POWER_POINT_VIEWER_PROVIDERS as bg, PRESENTER_CHANNEL_NAME as bh, PRESENTER_MSG_ORIGIN as bi, PasswordProtectionDialogComponent as bj, PasswordStrengthMeterComponent as bk, PowerPointViewerComponent as bl, PresentationAnnotationOverlayComponent as bm, PresentationAnnotationsService as bn, PresentationOverlayComponent as bo, PresentationPropertiesPanelComponent as bp, PresentationSettingsCardComponent as bq, PresentationSubtitleBarComponent as br, PresentationTransitionOverlayComponent as bs, PresenterViewComponent as bt, PresenterWindowService as bu, PrintDialogComponent as bv, PrintService as bw, PrintSettingsPanelComponent as bx, PropertiesDialogComponent as by, REPEAT_MODE_OPTIONS as bz, AVATAR_COLOR_SWATCHES as c, ViewerDocumentPropertiesService as c$, SLIDE_TRANSITION_KEYFRAMES as c0, DEFAULT_PALETTE as c1, PALETTES$1 as c2, SMART_ART_COLOR_SCHEMES as c3, SMART_ART_STYLE_OPTIONS as c4, SUB_ITEM_LABEL as c5, SVG_WARP_PRESETS as c6, SWIPE_MAX_VERTICAL_PX as c7, SWIPE_THRESHOLD_PX as c8, SelectionPaneComponent as c9, TABLE_STRUCTURE_TOGGLES as cA, TEXT_DIRECTION_OPTIONS$1 as cB, THEME_CATALOG as cC, TIMING_CURVE_OPTIONS as cD, TRIGGER_OPTIONS as cE, TYPE_LABELS as cF, TableCellAdvancedFillComponent as cG, TableCellFormattingComponent as cH, TableDataEditorComponent as cI, TablePropertiesComponent as cJ, TableRendererComponent as cK, TableResizeOverlayComponent as cL, TableSelectionService as cM, TextAdvancedPanelComponent as cN, ThemeEditorFieldsComponent as cO, ThemeGalleryComponent as cP, ThemeSelectorCardComponent as cQ, TitleBarComponent as cR, VALIGN_OPTIONS as cS, VIEWER_THEME as cT, VersionHistoryPanelComponent as cU, ViewerCanvasEditingService as cV, ViewerCollabCursorService as cW, ViewerCollaborationSessionService as cX, ViewerCompareService as cY, ViewerCustomShowsService as cZ, ViewerDialogsService as c_, SetUpSlideShowDialogComponent as ca, SettingsAppearanceTabComponent as cb, SettingsDialogComponent as cc, SettingsLanguageTabComponent as cd, ShareDialogComponent as ce, ShortcutPanelComponent as cf, ShowOptionsFieldsetComponent as cg, ShowSlidesFieldsetComponent as ch, SignatureStrippedDialogComponent as ci, SignaturesPanelComponent as cj, SignaturesService as ck, SlideCanvasComponent as cl, SlideDefaultInspectorComponent as cm, SlideDiffChangesComponent as cn, SlideDiffRowComponent as co, SlideDiffThumbnailsComponent as cp, SlideSizeCardComponent as cq, SlideSorterOverlayComponent as cr, SlideThemeOverridePanelComponent as cs, SlidesPanelComponent as ct, SmartArt3DRendererComponent as cu, SmartArt3DService as cv, SmartArtPreviewComponent as cw, SmartArtPropertiesComponent as cx, SmartArtRendererComponent as cy, StatusBarComponent as cz, AccessibilityPanelComponent as d, buildFallbackViewModel as d$, ViewerExportService as d0, ViewerExtraDialogsComponent as d1, ViewerFileIOService as d2, ViewerFindReplaceService as d3, ViewerFormatPainterService as d4, ViewerInspectorPanelService as d5, ViewerKeyboardService as d6, ViewerMobileSheetService as d7, ViewerPresentationModeService as d8, ViewerThemeGalleryService as d9, asMediaElement as dA, assignUserColor as dB, attachTouchGestures as dC, beginNodeEdit as dD, boolFromEvent as dE, bringForward as dF, bringToFront as dG, buildBarActions as dH, buildBroadcastConfig as dI, buildBroadcastViewerUrl as dJ, buildCategoryLabels as dK, buildCellParagraphs as dL, buildChartViewModel as dM, buildChatLogExport as dN, buildChatLogMarkdown as dO, buildChromeStyle as dP, buildClearHyperlinkPatch as dQ, buildClickGroups as dR, buildColStyles as dS, buildCollaborationConfig as dT, buildComboViewModel as dU, buildCssGradientFromShapeStyle as dV, buildDuotoneFilter as dW, buildDuotoneFilterId as dX, buildEmbeddedFontStyles as dY, buildEquationElement as dZ, buildEquationSegment as d_, ViewerTouchGesturesService as da, ViewerZoomService as db, WEBM_MIME_CANDIDATES as dc, WriteBackScheduler as dd, ZoomNavigationService as de, ZoomRendererComponent as df, ZoomTargetService as dg, addCategory as dh, addCommentToList as di, addGradientStopPatch as dj, addItem as dk, addSeries as dl, addSubItem as dm, advanceStep as dn, aiToggleVisible as dp, alignPatch as dq, animationFor as dr, annotationMapToInkInserts as ds, applyAcceptedDiff as dt, applyAnimationPreset as du, applyFindReplacements as dv, applyFormatToElement as dw, applyMove as dx, applyResize as dy, applyTableStylePreset as dz, AccessibilityService as e, computeDataTablePrimitives as e$, buildFontFaceRule as e0, buildGradientFillCss as e1, buildGridlinesAndLabels as e2, buildHyperlinkPatch as e3, buildInkContainerStyle as e4, buildInkStrokes as e5, buildLegend as e6, buildModel3DContainerStyle as e7, buildModel3DViewModel as e8, buildOleActionModel as e9, cellStyleToStyleMap as eA, cellTdStyle as eB, changeCountLabel as eC, changeIcon as eD, characterSpacingPatch as eE, checkFontAvailable as eF, clampCursorPosition as eG, clampGifDimensions as eH, clampIndex as eI, clampNotesFontSize as eJ, clampScale as eK, clampStep as eL, clearAllLocalViewerData as eM, clearAudienceContent as eN, cn as eO, collectAccessibilityIssues as eP, collectElementText as eQ, collectSlideText as eR, collectStoredChats as eS, collectUsedFontFamilies as eT, columnWidthStyle as eU, commitNodeText as eV, computeAlign as eW, computeAxisTitlePrimitives as eX, computeBarRects as eY, computeBubbleRadius as eZ, computeCornerHandle as e_, buildOleInfoRows as ea, buildPatternFillCss as eb, buildPrintHtmlDocument as ec, buildPropertiesPatch as ed, buildRegionMapViewModel as ee, buildSaveSlides as ef, buildShareUrl as eg, buildSmartArtInsertElement as eh, buildSmartArtNodes as ei, buildStockViewModel as ej, buildSurfaceViewModel as ek, buildTableViewModel as el, buildTreemapViewModel as em, buildTrimFragment as en, buildWaterfallViewModel as eo, buildZeroLine as ep, buildZoomContainerStyle as eq, buildZoomViewModel as er, bulletIndentPx as es, canAddTopLevelNode as et, canRemoveTopLevelNode as eu, canStartBroadcast as ev, canStartShare as ew, canUseClipboard as ex, captionDisplayText as ey, cellRunStyle as ez, AccountPageComponent as f, encodeGif as f$, computeDistribute as f0, computeDrawingViewBox as f1, computeErrorBarPrimitives as f2, computeFocusTargets as f3, computeHandleBoxes as f4, computeHandoutLayout as f5, computeIsMobile as f6, computeIsTablet as f7, computeLinePoints as f8, computeLinearRegression as f9, createWebsocketBundle as fA, cssObjectToStyleMap as fB, currentColorScheme as fC, currentLayout as fD, currentStyle as fE, defaultCssVars as fF, defaultRadius as fG, defaultThemeColors as fH, deleteElementsByIds as fI, deleteVersion as fJ, demoteNode as fK, deriveModel3DBlobUrl as fL, derivePresenceList as fM, describeSmartArtBounds as fN, disableGlowPatch as fO, disableInnerShadowPatch as fP, disableOuterShadowPatch as fQ, disableReflectionPatch as fR, disableSoftEdgePatch as fS, duplicateElementById as fT, durationOf as fU, effectsStateOf as fV, enableGlowPatch as fW, enableInnerShadowPatch as fX, enableOuterShadowPatch as fY, enableReflectionPatch as fZ, enableSoftEdgePatch as f_, computePageCount as fa, computePieLayout as fb, computePieSlicePath as fc, computePieSlices as fd, computePlotLayout as fe, computeRSquared as ff, computeRadarPoints as fg, computeScatterDots as fh, computeSelectionBoxes as fi, computeSingleSelected as fj, computeSlideIndices as fk, computeSnap as fl, computeStackedBarRects as fm, computeStackedValueRange as fn, computeTextLines as fo, computeTimerProgress as fp, computeTrendlinePrimitives as fq, computeValueRange as fr, convertOmmlToMathMl as fs, copyFormatFromElement as ft, countAccessibilityIssues as fu, countAnnotationStrokes as fv, createAngularAiBridge as fw, createCustomShow as fx, createSwipeDismissDrag as fy, createWebrtcBundle as fz, ActionSettingsPanelComponent as g, hasAnimation as g$, estimatePageCount as g0, evenColumnWidths as g1, evenRowHeights as g2, exitPresentationFullscreen as g3, exportAiChatLogs as g4, extractPathPoints as g5, eyedropperAvailable as g6, fillColorOf as g7, findInSlides as g8, findOwningSlideIndex as g9, getOleBadgeLabel as gA, getOleDisplayName as gB, getOleDownloadFileName as gC, getOleTypeColor as gD, getOleTypeLabel as gE, getPasswordStrength as gF, getPatternSvg as gG, getPlaceholderStyle as gH, getVersions as gI, getResolvedShapeClipPath as gJ, getResolvedShapeClipPathFor as gK, getShapeFillStrokeStyle as gL, getSlideBackgroundStyle as gM, getSlideTransitionAnimations as gN, getSmartArtNodeBounds as gO, getSpeechRecognitionCtor as gP, getTextBlockStyle as gQ, getTextWarp as gR, getTouchDistance as gS, getWarpCategory as gT, getWarpPath as gU, gradientStateFromStyle as gV, gradientStateOf as gW, gradientStatePatch as gX, gridColumns as gY, groupElements as gZ, groupIssuesBySeverity as g_, findSlideIndexByElementId as ga, fitPolynomial as gb, fitZoom as gc, focusTargetChips as gd, fontMimeForFormat as ge, fontSizeOf as gf, formatAutoNumber as gg, formatAxisValue as gh, formatBytes as gi, formatCursorLabel as gj, formatElapsed as gk, formatFileSize as gl, formatPropertyDate as gm, formatTime as gn, fpsToFrameIntervalMs as go, generateBroadcastRoomId as gp, generateCommentId as gq, generateCustomShowId as gr, generatePressureCircles as gs, generateRulerTicks as gt, getClrChangeParams as gu, getContainerStyle as gv, getDuotoneFilterDef as gw, getImageSrc as gx, getLocalStorageUsageSummary as gy, getOleAriaLabel as gz, AdvancedChartEditorComponent as h, normalizeValue as h$, hasCopyableFormat as h0, hasExistingLink as h1, hasExitedFullscreen as h2, hasGradientFill as h3, hasPressureVariation as h4, hasVisibleSlideAfter as h5, headerLabel as h6, inkViewBox as h7, insertColumn as h8, insertRow as h9, mergeDown as hA, mergeRight as hB, mergeSelection as hC, moveElementBy as hD, moveNodeDown as hE, moveNodeUp as hF, msToFrameDelayCs as hG, narrowToCircle as hH, narrowToPolygon as hI, narrowToRect as hJ, newChartElement as hK, newEquationElement as hL, newPresetShapeElement as hM, newShapeElement as hN, newSmartArtElement as hO, newTableElement as hP, newTextElement as hQ, nextVisibleIndex as hR, nodeBold as hS, nodeEditBox as hT, nodeFillColor as hU, nodeFontColor as hV, nodeIdFromKey as hW, nodeItalic as hX, nodeStyle as hY, normalizeFontFormat as hZ, normalizeSlidesPerPage as h_, interpolateWidth as ha, isAudienceTab as hb, isBold as hc, isBrowserOpenableMime as hd, isChildNode as he, isElementInteractive as hf, isInjectableUrl as hg, isItalic as hh, isPpactionUrl as hi, isPresenterMessage as hj, isSigned as hk, isTextElement as hl, isTwoTableFocus as hm, isUnderline as hn, isUrlSafe as ho, isValidRoomId as hp, isViewportBackgroundPressTarget as hq, isZoomActivationKey as hr, issueTrackKey as hs, issueTypeLabel as ht, keyToLabel as hu, latexToMathml as hv, linePointsToSvgString as hw, lineSpacingPatch as hx, loadAudienceContent as hy, mergeCaptionResults as hz, AiChangeOverlayComponent as i, resolveTransitionDuration as i$, numFromEvent as i0, ommlToMathml as i1, ooxmlDashToCssBorderStyle as i2, openNativeEyeDropper as i3, overallStatus as i4, paletteColor as i5, parseAudienceNonce as i6, parseNodeTextarea as i7, partitionSlides as i8, patchChartData as i9, removeCommentFromList as iA, removeElementAnimation as iB, removeGradientStopPatch as iC, removeNode as iD, removeRow as iE, removeSeries as iF, renderToCanvas as iG, reorderAnimationDown as iH, reorderAnimationUp as iI, replaceInSlides as iJ, replaceMatch as iK, requestPresentationFullscreen as iL, resizeElement as iM, resolveCaptionTracks as iN, resolveChartKind as iO, resolveFontVariant as iP, resolveHyperlinkHref as iQ, resolveInteractiveElementId as iR, resolveMediaSrc as iS, resolveOleType as iT, resolveParagraphBullet as iU, resolvePresenterNotes as iV, resolveProfileInitial as iW, resolveRegionCode as iX, resolveSlideAutoAdvanceMs as iY, resolvePalette as iZ, resolveThemeCatalogEntry as i_, patchChartStyle as ia, patchTableData as ib, patchTextStyle as ic, pendingElementStyles as id, pickColorByClickFallback as ie, pickSupportedMimeType as ig, planGifFrames as ih, planVideoSegments as ii, pointsToSvgPathD as ij, presenceToCursors as ik, presetByLayout as il, presetsForCategory as im, pressuresToWidths as io, prevVisibleIndex as ip, projectDrawingShapes as iq, promoteNode as ir, provideViewerTheme as is, radarAngle as it, radarRingPoints as iu, recordWebm as iv, redistributeColumnWidth as iw, removeAnimation as ix, removeCategory as iy, removeColumn as iz, AiChatPanelComponent as j, showsTemplateAffordance as j$, revealedElementStyles as j0, routeOrthogonalConnector as j1, rowStyle as j2, sampleColorFromSlide as j3, sanitizeColor as j4, sanitizeSlideIndex as j5, sanitizeUserName as j6, saveViewerProfile as j7, scanAvailableFonts as j8, searchSlides as j9, setDuration as jA, setElementPosition as jB, setGridlineStyle as jC, setLayout as jD, setLegend as jE, setNodeStyle as jF, setNodeText as jG, setRepeatCount as jH, setRepeatMode as jI, setSequence as jJ, setSeriesChartType as jK, setSeriesColor as jL, setSeriesErrorBars as jM, setSeriesMarker as jN, setSeriesName as jO, setSeriesTrendline as jP, setSeriesValue as jQ, setStyle as jR, setTimingCurve as jS, setTitle as jT, setTrigger as jU, setTriggerShapeId as jV, shapeStylePatch as jW, sheetAfterNavigate as jX, shouldBlockClickAdvance as jY, shouldUseSvgWarp as jZ, showDirectionPicker as j_, seedBroadcastFields as ja, seedHyperlinkDraft as jb, seedPropertiesDraft as jc, seedShareFields as jd, segmentFrameCount as je, selectValue$2 as jf, sendBackward as jg, sendToBack as jh, sequentialColorScale as ji, serializeWriteBack as jj, seriesColor as jk, setAnimationEmphasis as jl, setAnimationEntrance as jm, setAnimationExit as jn, setAxis as jo, setAxisLogScale as jp, setAxisTitleStyle as jq, setCategoryLabel as jr, setCellText as js, setColorScheme as jt, setDataLabels as ju, setDataPointExplosion as jv, setDataPointFill as jw, setDataPointLabel as jx, setDelay as jy, setDirection as jz, AiChatService as k, signatureCountLabel as k0, signatureKey as k1, signatureTimestamp as k2, signerName as k3, statusLabel as k4, slideNumberOf as k5, smartArtNodes as k6, paletteColour as k7, snapToGridStep as k8, splitCursorCell as k9, ungroupElements as kA, updateElementById as kB, updateGlowPatch as kC, updateGradientStopPatch as kD, updateInnerShadowPatch as kE, updateOuterShadowPatch as kF, updateReflectionPatch as kG, vAlignPatch as kH, validatePassword as kI, validatePrintSettings as kJ, validateRoomId as kK, valueToY as kL, vermilionDarkColors as kM, vermilionDarkTheme as kN, vermilionLightColors as kO, vermilionLightTheme as kP, vermilionRadius as kQ, waypointsToPathD as kR, worstStatus as kS, zoomTargetSlideIndex as kT, splitMergedCell as ka, statusKind as kb, statusLabel$1 as kc, storeAudienceContent as kd, stringFromEvent$5 as ke, strokeColorOf as kf, strokeToInkElement as kg, styleShadowFilter as kh, textAdvancedPatch as ki, textAdvancedStateFromStyle as kj, textAdvancedStateOf as kk, textColorOf as kl, textDirectionPatch as km, textStyleOf as kn, textStylePatch as ko, themeStyle as kp, themeToCssVars as kq, thumbnailHeight as kr, thumbnailZoom as ks, toggleCommentResolvedInList as kt, toggleNodeBold as ku, toggleNodeItalic as kv, toggleSheet as kw, topLevelNodeCount as kx, transformSelectedTextCase as ky, translationsEn as kz, AiComposerComponent as l, AiFocusBarComponent as m, AiFocusHighlightOverlayComponent as n, AiMessageListComponent as o, AiPanelStore as p, AiProposalCardComponent as q, AiSettingsSectionComponent as r, AiToolCallCardComponent as s, toChatSummary as t, AnimationAuthorPanelComponent as u, AnimationPanelComponent as v, AnimationPlaybackService as w, AutosaveService as x, CURSOR_PALETTE as y, CanvasFitService as z };
114743
+ //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-BYT0JAxP.mjs.map