pptx-angular-viewer 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15911,13 +15911,109 @@ function expandTextBuildAnimations(animations, segmentCounts) {
15911
15911
  }
15912
15912
  return result;
15913
15913
  }
15914
+ /**
15915
+ * The within-paragraph granularity an effect's own `p:iterate` asks for, or
15916
+ * `undefined` when it animates the text as one object (`type="el"`, or absent).
15917
+ *
15918
+ * This is INDEPENDENT of `p:bldP/@build`: the slide build says how the text is
15919
+ * grouped into steps ("by paragraph"), while `p:iterate` says how each step is
15920
+ * subdivided in time ("by letter"). PowerPoint composes the two; reading only
15921
+ * the build type made a by-paragraph credit line authored to ripple in letter by
15922
+ * letter appear as one solid block (issue #106).
15923
+ */
15924
+ function iterateGranularity(anim) {
15925
+ if (anim.iterate?.type === 'lt') {
15926
+ return 'byChar';
15927
+ }
15928
+ if (anim.iterate?.type === 'wd') {
15929
+ return 'byWord';
15930
+ }
15931
+ return undefined;
15932
+ }
15933
+ /** Per-piece sub-element id prefix and per-paragraph piece count for a split. */
15934
+ function pieceCounts(kind, counts) {
15935
+ return kind === 'byChar'
15936
+ ? { token: 'c', perParagraph: counts.charCounts ?? [] }
15937
+ : { token: 'w', perParagraph: counts.wordCounts ?? [] };
15938
+ }
15939
+ /**
15940
+ * Emit one staggered sub-animation per letter / word.
15941
+ *
15942
+ * An `p:iterate` build overlaps: every piece runs the FULL effect duration and
15943
+ * merely starts `stagger` later than the one before, which is what makes
15944
+ * PowerPoint's "by letter" read as a ripple. `withPrevious` steps accumulate
15945
+ * their delay from the previous step's START, so passing the bare interval as
15946
+ * each step's delay yields `base + i * stagger`. The slide-build (`p:bldP`) path
15947
+ * keeps its original end-to-end pacing.
15948
+ *
15949
+ * `newClickStepPerParagraph` reproduces a by-paragraph build: paragraph 0 starts
15950
+ * with the parent effect, and every later paragraph waits for its own click,
15951
+ * with its pieces rippling from there.
15952
+ */
15953
+ function emitStaggeredPieces(anim, kind, counts, output, newClickStepPerParagraph) {
15954
+ const targetId = anim.targetId ?? '';
15955
+ const baseDuration = anim.durationMs ?? 500;
15956
+ const stagger = iterateStaggerMs(anim, baseDuration);
15957
+ const { token, perParagraph } = pieceCounts(kind, counts);
15958
+ const fallbackDuration = kind === 'byChar'
15959
+ ? Math.max(50, Math.round(baseDuration / 4))
15960
+ : Math.max(100, Math.round(baseDuration / 2));
15961
+ const fallbackStagger = kind === 'byChar' ? 20 : 50;
15962
+ let stepIndex = 0;
15963
+ for (let pIdx = 0; pIdx < counts.paragraphCount; pIdx++) {
15964
+ const pieces = perParagraph[pIdx] ?? 0;
15965
+ for (let i = 0; i < pieces; i++) {
15966
+ const opensParagraph = i === 0;
15967
+ const isFirstStep = stepIndex === 0;
15968
+ const startsClickStep = newClickStepPerParagraph && opensParagraph && !isFirstStep;
15969
+ output.push({
15970
+ ...anim,
15971
+ targetId: `${targetId}${TEXT_BUILD_ID_SEP}${token}${pIdx}-${i}`,
15972
+ trigger: isFirstStep
15973
+ ? anim.trigger
15974
+ : startsClickStep
15975
+ ? 'onClick'
15976
+ : stagger !== undefined
15977
+ ? 'withPrevious'
15978
+ : 'afterPrevious',
15979
+ durationMs: stagger !== undefined ? baseDuration : fallbackDuration,
15980
+ delayMs: isFirstStep
15981
+ ? (anim.delayMs ?? 0)
15982
+ : startsClickStep
15983
+ ? 0
15984
+ : (stagger ?? fallbackStagger),
15985
+ // Only the first sub-step inherits the parent's start delay; the
15986
+ // rest carry the bare stagger, so these must not re-apply it.
15987
+ // They are synthetic chain steps rather than OOXML `p:par`
15988
+ // siblings, so they also drop the wrapper index: their delay is
15989
+ // an interval off the step before, not an offset from the group.
15990
+ ...(isFirstStep
15991
+ ? {}
15992
+ : {
15993
+ triggerDelayMs: undefined,
15994
+ startConditions: undefined,
15995
+ parGroupIndex: undefined,
15996
+ }),
15997
+ buildType: undefined,
15998
+ iterate: undefined,
15999
+ });
16000
+ stepIndex++;
16001
+ }
16002
+ }
16003
+ }
15914
16004
  /**
15915
16005
  * Expand a single text-build animation into sub-element animations.
15916
16006
  */
15917
16007
  function expandSingleBuildAnimation(anim, buildType, counts, output) {
15918
16008
  const targetId = anim.targetId ?? '';
15919
- const baseDuration = anim.durationMs ?? 500;
15920
16009
  if (buildType === 'byParagraph') {
16010
+ // A by-paragraph build whose effect also iterates by letter / word still
16011
+ // ripples inside each paragraph; only the step boundaries are paragraphs.
16012
+ const granularity = iterateGranularity(anim);
16013
+ if (granularity) {
16014
+ emitStaggeredPieces(anim, granularity, counts, output, true);
16015
+ return;
16016
+ }
15921
16017
  for (let i = 0; i < counts.paragraphCount; i++) {
15922
16018
  output.push({
15923
16019
  ...anim,
@@ -15928,65 +16024,8 @@ function expandSingleBuildAnimation(anim, buildType, counts, output) {
15928
16024
  }
15929
16025
  return;
15930
16026
  }
15931
- // An `p:iterate` build overlaps: every letter/word runs the FULL effect
15932
- // duration and merely starts `stagger` later than the one before, which is
15933
- // what makes PowerPoint's "by letter" read as a ripple. `withPrevious` steps
15934
- // accumulate their delay from the previous step's START, so passing the bare
15935
- // interval as each step's delay yields `base + i * stagger`. The slide-build
15936
- // (`p:bldP`) path keeps its original end-to-end pacing.
15937
- const stagger = iterateStaggerMs(anim, baseDuration);
15938
- if (buildType === 'byWord') {
15939
- const wordCounts = counts.wordCounts ?? [];
15940
- let stepIndex = 0;
15941
- for (let pIdx = 0; pIdx < counts.paragraphCount; pIdx++) {
15942
- const wc = wordCounts[pIdx] ?? 0;
15943
- for (let wIdx = 0; wIdx < wc; wIdx++) {
15944
- output.push({
15945
- ...anim,
15946
- targetId: `${targetId}${TEXT_BUILD_ID_SEP}w${pIdx}-${wIdx}`,
15947
- trigger: stepIndex === 0
15948
- ? anim.trigger
15949
- : stagger !== undefined
15950
- ? 'withPrevious'
15951
- : 'afterPrevious',
15952
- durationMs: stagger !== undefined ? baseDuration : Math.max(100, Math.round(baseDuration / 2)),
15953
- delayMs: stepIndex === 0 ? (anim.delayMs ?? 0) : (stagger ?? 50),
15954
- // Only the first sub-step inherits the parent's start delay; the
15955
- // rest carry the bare stagger, so these must not re-apply it.
15956
- ...(stepIndex === 0 ? {} : { triggerDelayMs: undefined, startConditions: undefined }),
15957
- buildType: undefined,
15958
- iterate: undefined,
15959
- });
15960
- stepIndex++;
15961
- }
15962
- }
15963
- return;
15964
- }
15965
- if (buildType === 'byChar') {
15966
- const charCounts = counts.charCounts ?? [];
15967
- let stepIndex = 0;
15968
- for (let pIdx = 0; pIdx < counts.paragraphCount; pIdx++) {
15969
- const cc = charCounts[pIdx] ?? 0;
15970
- for (let cIdx = 0; cIdx < cc; cIdx++) {
15971
- output.push({
15972
- ...anim,
15973
- targetId: `${targetId}${TEXT_BUILD_ID_SEP}c${pIdx}-${cIdx}`,
15974
- trigger: stepIndex === 0
15975
- ? anim.trigger
15976
- : stagger !== undefined
15977
- ? 'withPrevious'
15978
- : 'afterPrevious',
15979
- durationMs: stagger !== undefined ? baseDuration : Math.max(50, Math.round(baseDuration / 4)),
15980
- delayMs: stepIndex === 0 ? (anim.delayMs ?? 0) : (stagger ?? 20),
15981
- // Only the first sub-step inherits the parent's start delay; the
15982
- // rest carry the bare stagger, so these must not re-apply it.
15983
- ...(stepIndex === 0 ? {} : { triggerDelayMs: undefined, startConditions: undefined }),
15984
- buildType: undefined,
15985
- iterate: undefined,
15986
- });
15987
- stepIndex++;
15988
- }
15989
- }
16027
+ if (buildType === 'byWord' || buildType === 'byChar') {
16028
+ emitStaggeredPieces(anim, buildType, counts, output, false);
15990
16029
  return;
15991
16030
  }
15992
16031
  // Unknown build type — keep original
@@ -16592,6 +16631,19 @@ function buildTimeline(nativeAnimations) {
16592
16631
  let currentGroup = [];
16593
16632
  /** Whether the current group was started by an onClick trigger. */
16594
16633
  let currentGroupIsClick = false;
16634
+ /**
16635
+ * Whether the current group's OOXML click step begins on slide entry rather
16636
+ * than on a click (`groupAutoStart` from the parse layer).
16637
+ */
16638
+ let currentGroupAutoStart = false;
16639
+ /**
16640
+ * Effect-wrapper (`p:par`) index of the sub-group being filled, and the time
16641
+ * that wrapper starts relative to the click group. Siblings of one wrapper all
16642
+ * measure their delay from `subGroupStartMs`; a new wrapper chains off the
16643
+ * previous step instead.
16644
+ */
16645
+ let subGroupIndex;
16646
+ let subGroupStartMs = 0;
16595
16647
  for (const anim of regularAnims) {
16596
16648
  const expandedSteps = expandIterateAnimation(anim);
16597
16649
  for (const singleAnim of expandedSteps) {
@@ -16671,24 +16723,41 @@ function buildTimeline(nativeAnimations) {
16671
16723
  // Flush current group if non-empty
16672
16724
  if (currentGroup.length > 0) {
16673
16725
  const group = finalizeClickGroup(currentGroup);
16674
- if (!currentGroupIsClick && clickGroups.length > 0) {
16726
+ if (currentGroupAutoStart || (!currentGroupIsClick && clickGroups.length > 0)) {
16675
16727
  group.autoAdvance = true;
16676
16728
  }
16677
16729
  clickGroups.push(group);
16678
16730
  }
16679
16731
  currentGroup = [];
16680
16732
  currentGroupIsClick = isOnClick || isFirstAnimation;
16733
+ // A group the deck marks as auto-starting plays on slide entry. This
16734
+ // is how PowerPoint renders a deck whose opening effects are "With
16735
+ // Previous"; without it the first group was always click-gated and
16736
+ // the slide showed nothing until the viewer clicked.
16737
+ currentGroupAutoStart = !isOnClick && singleAnim.groupAutoStart === true;
16738
+ subGroupIndex = singleAnim.parGroupIndex;
16739
+ subGroupStartMs = 0;
16681
16740
  }
16682
16741
  // Compute delay relative to start of this click-group
16742
+ const prevStep = currentGroup.length > 0 ? currentGroup[currentGroup.length - 1] : undefined;
16683
16743
  let delayMs;
16684
- if (trigger === 'withPrevious' && currentGroup.length > 0) {
16685
- const prev = currentGroup[currentGroup.length - 1];
16686
- delayMs = prev.delayMs + animDelay + triggerDelay;
16744
+ if (singleAnim.parGroupIndex !== undefined && prevStep) {
16745
+ if (singleAnim.parGroupIndex !== subGroupIndex) {
16746
+ // New effect wrapper: it starts with (withPrevious) or after
16747
+ // (afterPrevious / afterDelay) the step that came before it.
16748
+ subGroupIndex = singleAnim.parGroupIndex;
16749
+ subGroupStartMs =
16750
+ trigger === 'withPrevious' ? prevStep.delayMs : prevStep.delayMs + prevStep.durationMs;
16751
+ }
16752
+ // Siblings of one wrapper are simultaneous in OOXML: each `@delay` is
16753
+ // an offset from the wrapper, never a chain off the previous effect.
16754
+ delayMs = subGroupStartMs + animDelay + triggerDelay;
16687
16755
  }
16688
- else if ((trigger === 'afterPrevious' || trigger === 'afterDelay') &&
16689
- currentGroup.length > 0) {
16690
- const prev = currentGroup[currentGroup.length - 1];
16691
- delayMs = prev.delayMs + prev.durationMs + animDelay + triggerDelay;
16756
+ else if (trigger === 'withPrevious' && prevStep) {
16757
+ delayMs = prevStep.delayMs + animDelay + triggerDelay;
16758
+ }
16759
+ else if ((trigger === 'afterPrevious' || trigger === 'afterDelay') && prevStep) {
16760
+ delayMs = prevStep.delayMs + prevStep.durationMs + animDelay + triggerDelay;
16692
16761
  }
16693
16762
  else {
16694
16763
  delayMs = animDelay + triggerDelay;
@@ -16718,15 +16787,15 @@ function buildTimeline(nativeAnimations) {
16718
16787
  // Flush last group
16719
16788
  if (currentGroup.length > 0) {
16720
16789
  const group = finalizeClickGroup(currentGroup);
16721
- if (!currentGroupIsClick && clickGroups.length > 0) {
16790
+ if (currentGroupAutoStart || (!currentGroupIsClick && clickGroups.length > 0)) {
16722
16791
  group.autoAdvance = true;
16723
16792
  }
16724
16793
  clickGroups.push(group);
16725
16794
  }
16726
16795
  // Compute auto-advance delay for auto-advance groups
16727
- for (let i = 1; i < clickGroups.length; i++) {
16728
- if (clickGroups[i].autoAdvance) {
16729
- clickGroups[i].autoAdvanceDelayMs = 0;
16796
+ for (const group of clickGroups) {
16797
+ if (group.autoAdvance) {
16798
+ group.autoAdvanceDelayMs = 0;
16730
16799
  }
16731
16800
  }
16732
16801
  // Build interactive sequence click-groups
@@ -17137,6 +17206,34 @@ class TimelineEngine {
17137
17206
  resetHover(triggerShapeId) {
17138
17207
  this.hoverGroupIndexes.delete(triggerShapeId);
17139
17208
  }
17209
+ /**
17210
+ * Jump to the END of the timeline: every click-group counted as played, every
17211
+ * entrance revealed and every exit applied, with no CSS animation attached so
17212
+ * nothing replays.
17213
+ *
17214
+ * This is what PowerPoint shows when you step BACKWARD onto a slide: it
17215
+ * appears with its builds already complete, and a further back press walks
17216
+ * them off again. Re-running the timeline from zero instead made a deck whose
17217
+ * opening build auto-starts restart its animation every time the presenter
17218
+ * stepped back onto it.
17219
+ */
17220
+ completeAll() {
17221
+ this.reset();
17222
+ for (const group of this.timeline.clickGroups) {
17223
+ for (const step of group.steps) {
17224
+ if (step.build || step.colorTargets) {
17225
+ this.activeSteps.set(step.elementId, step);
17226
+ }
17227
+ if (step.presetClass === 'entr') {
17228
+ this.revealedElements.add(step.elementId);
17229
+ }
17230
+ if (step.presetClass === 'exit') {
17231
+ this.exitedElements.add(step.elementId);
17232
+ }
17233
+ }
17234
+ }
17235
+ this.currentGroupIndex = this.timeline.clickGroups.length - 1;
17236
+ }
17140
17237
  /**
17141
17238
  * Reset the engine to its initial state (no animations played).
17142
17239
  */
@@ -17300,6 +17397,14 @@ class PresentationAnimationController {
17300
17397
  reset() {
17301
17398
  this.engine.reset();
17302
17399
  }
17400
+ /**
17401
+ * Seed the slide as fully built: every group counted as played, nothing
17402
+ * animating. Bindings use it when the presenter steps BACKWARD onto a slide,
17403
+ * which PowerPoint shows with its builds already complete.
17404
+ */
17405
+ completeAll() {
17406
+ this.engine.completeAll();
17407
+ }
17303
17408
  // -----------------------------------------------------------------------
17304
17409
  // Interactive + hover sequences (delegated to the engine)
17305
17410
  // -----------------------------------------------------------------------
@@ -38468,6 +38573,92 @@ async function clearAudienceContent(sessionId) {
38468
38573
  }
38469
38574
  }
38470
38575
 
38576
+ /**
38577
+ * `audience-display`: the policy that governs a tab opened as a presenter's
38578
+ * **audience display** (the second window a presenter puts on the projector).
38579
+ *
38580
+ * That tab is a mirror of the presenter's screen, not an editor. It is the same
38581
+ * viewer application as the presenter's, so without an explicit policy every
38582
+ * ordinary "leave the slide show" path (Escape, the exit button, leaving
38583
+ * fullscreen, the presenter's end-of-session signal) drops the audience into
38584
+ * the full editing chrome: ribbon, thumbnails and inspector, live in front of
38585
+ * the room (issue #106).
38586
+ *
38587
+ * The rule is therefore absolute: **an audience display never returns to edit
38588
+ * mode.** When the presenter ends the show the tab closes itself; browsers that
38589
+ * refuse `window.close()` (a tab the script did not open, or one the user
38590
+ * re-navigated) leave the end-of-slide-show screen up instead.
38591
+ *
38592
+ * Framework-agnostic: every binding routes its exit paths through
38593
+ * {@link mayLeaveSlideShow} and its presenter-exit handler through
38594
+ * {@link endAudienceDisplay}.
38595
+ *
38596
+ * @module render/audience-display
38597
+ */
38598
+ /**
38599
+ * Whether a URL hash marks the tab as an audience display.
38600
+ *
38601
+ * Accepts the bare hash and the `#pptx-audience&nonce=<uuid>` form the
38602
+ * presenter opens. Safe to call with `undefined` (non-browser contexts).
38603
+ */
38604
+ function isAudienceDisplayHash(hash) {
38605
+ return typeof hash === 'string' && hash.startsWith(PRESENTATION_HASH);
38606
+ }
38607
+ /** Whether the current tab is an audience display. False outside a browser. */
38608
+ function isAudienceDisplayTab() {
38609
+ if (typeof window === 'undefined') {
38610
+ return false;
38611
+ }
38612
+ return isAudienceDisplayHash(window.location.hash);
38613
+ }
38614
+ /**
38615
+ * Whether a tab may leave the slide show for the editor.
38616
+ *
38617
+ * Bindings call this from EVERY exit path (Escape, the toolbar's end button,
38618
+ * the advance past the end-of-show screen, fullscreen change). An audience
38619
+ * display always answers `false`, so its editing chrome is unreachable.
38620
+ *
38621
+ * @param isAudienceDisplay - Pass the binding's audience-tab check; defaults to
38622
+ * {@link isAudienceDisplayTab} so callers with no state can omit it.
38623
+ */
38624
+ function mayLeaveSlideShow(isAudienceDisplay = isAudienceDisplayTab()) {
38625
+ return !isAudienceDisplay;
38626
+ }
38627
+ /**
38628
+ * Whether this tab may drive the deck from its own input.
38629
+ *
38630
+ * An audience display mirrors the presenter's screen, so its keyboard, clicks,
38631
+ * taps and swipes must not navigate. When they did, a stray key moved the
38632
+ * audience off the presenter's slide and the next presenter snapshot yanked it
38633
+ * straight back, which reads as the display refusing to turn the page.
38634
+ *
38635
+ * @param isAudienceDisplay - Pass the binding's audience-tab check; defaults to
38636
+ * {@link isAudienceDisplayTab} so callers with no state can omit it.
38637
+ */
38638
+ function acceptsPresentationInput(isAudienceDisplay = isAudienceDisplayTab()) {
38639
+ return !isAudienceDisplay;
38640
+ }
38641
+ /**
38642
+ * Act on the presenter's `presenter-exit` signal inside an audience tab.
38643
+ *
38644
+ * Attempts to close the tab. Returns `true` when the binding must raise its
38645
+ * end-of-slide-show screen because the tab is still open: `window.close()` is
38646
+ * refused for tabs the script did not open, and closing is asynchronous, so the
38647
+ * caller always shows the screen and simply never sees it if the tab goes away.
38648
+ */
38649
+ function endAudienceDisplay(win = globalThis.window) {
38650
+ if (!win) {
38651
+ return true;
38652
+ }
38653
+ try {
38654
+ win.close();
38655
+ }
38656
+ catch {
38657
+ // Browsers refuse close() for tabs they did not script-open.
38658
+ }
38659
+ return !win.closed;
38660
+ }
38661
+
38471
38662
  /**
38472
38663
  * EyeDropper colour sampler (framework-agnostic).
38473
38664
  *
@@ -52175,7 +52366,7 @@ function createLocalStorageBackend(namespace) {
52175
52366
  /** Try IndexedDB first; fall back to localStorage on any failure. */
52176
52367
  async function resolveBackend(dbName, namespace) {
52177
52368
  try {
52178
- const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-B1LY08QA.mjs');
52369
+ const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-DzzfR5jW.mjs');
52179
52370
  const db = await openChatDb(dbName);
52180
52371
  return createIdbBackend(db);
52181
52372
  }
@@ -62412,9 +62603,10 @@ class AnimationPlaybackService {
62412
62603
  * (entrance-animated elements start hidden). Auto-plays the first click-group
62413
62604
  * when the slide opens with a withPrevious / afterPrevious / afterDelay build.
62414
62605
  */
62415
- setSlide(slide, showWithAnimation) {
62606
+ setSlide(slide, showWithAnimation, options) {
62416
62607
  this.showWithAnimation = showWithAnimation;
62417
62608
  this.clearTimers();
62609
+ this.seededCompleted = false;
62418
62610
  if (!slide || !this.animationsEnabled()) {
62419
62611
  this.controller = null;
62420
62612
  this.presentationElementStates.set(new Map());
@@ -62434,6 +62626,16 @@ class AnimationPlaybackService {
62434
62626
  this.hoverTriggerShapeIds.set(controller.hoverTriggerShapeIds);
62435
62627
  this.presentationElementStates.set(controller.computeStates());
62436
62628
  this.syncComplete();
62629
+ // Stepping backward onto a slide shows it with every build already
62630
+ // complete, the way PowerPoint does: nothing plays, nothing is scheduled,
62631
+ // and a further back press replays the slide from the start.
62632
+ if (options?.completed) {
62633
+ this.seededCompleted = controller.hasMoreSteps();
62634
+ controller.completeAll();
62635
+ this.presentationElementStates.set(controller.computeStates());
62636
+ this.syncComplete();
62637
+ return;
62638
+ }
62437
62639
  // Auto-play the first group when the slide opens with a withPrevious /
62438
62640
  // afterPrevious / afterDelay build (mirrors React's entrance auto-play).
62439
62641
  if (controller.hasMoreSteps()) {
@@ -62451,6 +62653,16 @@ class AnimationPlaybackService {
62451
62653
  }
62452
62654
  }
62453
62655
  }
62656
+ /**
62657
+ * True while the active slide shows its builds as already complete because
62658
+ * the presenter stepped BACKWARD onto it. The next back press replays the
62659
+ * slide instead of leaving it (PowerPoint's behaviour).
62660
+ */
62661
+ seededCompleted = false;
62662
+ /** Whether the active slide was seeded as fully built (backward entry). */
62663
+ isSeededCompleted() {
62664
+ return this.seededCompleted;
62665
+ }
62454
62666
  // ------------------------------------------------------------------
62455
62667
  // Playback controls
62456
62668
  // ------------------------------------------------------------------
@@ -76831,8 +77043,9 @@ class PresenterWindowService {
76831
77043
  onSlide(message.slideIndex);
76832
77044
  }
76833
77045
  else if (message.type === 'presenter-exit') {
77046
+ // The host decides what an ended session looks like (close the tab,
77047
+ // else show the end screen). It must never land in the editor.
76834
77048
  onExit();
76835
- window.close();
76836
77049
  }
76837
77050
  };
76838
77051
  channel.addEventListener('message', onMessage);
@@ -78862,6 +79075,13 @@ class PresentationOverlayComponent {
78862
79075
  ...(ngDevMode ? [{ debugName: "showWithAnimation" }] : /* istanbul ignore next */ []));
78863
79076
  subtitlesVisible = input(false, /* @ts-ignore */
78864
79077
  ...(ngDevMode ? [{ debugName: "subtitlesVisible" }] : /* istanbul ignore next */ []));
79078
+ /**
79079
+ * Set by an audience display when the presenter ends the session and the
79080
+ * browser refuses to close the tab. It raises the black end-of-slide-show
79081
+ * screen so the room never sees the editing chrome.
79082
+ */
79083
+ sessionEnded = input(false, /* @ts-ignore */
79084
+ ...(ngDevMode ? [{ debugName: "sessionEnded" }] : /* istanbul ignore next */ []));
78865
79085
  // ------------------------------------------------------------------
78866
79086
  // Outputs
78867
79087
  // ------------------------------------------------------------------
@@ -78890,6 +79110,18 @@ class PresentationOverlayComponent {
78890
79110
  */
78891
79111
  endOfShow = signal(false, /* @ts-ignore */
78892
79112
  ...(ngDevMode ? [{ debugName: "endOfShow" }] : /* istanbul ignore next */ []));
79113
+ /**
79114
+ * Set just before a BACKWARD slide change so the slide effect seeds the
79115
+ * incoming slide as fully built.
79116
+ */
79117
+ pendingCompletedEntry = false;
79118
+ /** Mirror the host's audience "session ended" flag onto the end screen. */
79119
+ syncSessionEnded = effect(() => {
79120
+ if (this.sessionEnded()) {
79121
+ this.endOfShow.set(true);
79122
+ }
79123
+ }, /* @ts-ignore */
79124
+ ...(ngDevMode ? [{ debugName: "syncSessionEnded" }] : /* istanbul ignore next */ []));
78893
79125
  syncExternalIndex = effect(() => {
78894
79126
  const count = this.slides().length;
78895
79127
  if (count === 0) {
@@ -78957,7 +79189,9 @@ class PresentationOverlayComponent {
78957
79189
  // pre-build state so entrance-animated elements start hidden) and publish its
78958
79190
  // per-slide keyframes CSS.
78959
79191
  effect(() => {
78960
- this.playback.setSlide(this.currentSlide(), this.showWithAnimation());
79192
+ const completed = this.pendingCompletedEntry;
79193
+ this.pendingCompletedEntry = false;
79194
+ this.playback.setSlide(this.currentSlide(), this.showWithAnimation(), { completed });
78961
79195
  this.slideKeyframes.set(this.playback.keyframesCss());
78962
79196
  });
78963
79197
  // Apply each element's native-animation state (visibility, CSS animation,
@@ -79258,6 +79492,12 @@ class PresentationOverlayComponent {
79258
79492
  /** Digit buffer backing PowerPoint's "type a slide number, then Enter" jump. */
79259
79493
  keyBuffer = createPresentationKeyBuffer();
79260
79494
  onKeyDown(event) {
79495
+ // An audience display mirrors the presenter's screen. If its own keyboard
79496
+ // navigated, a stray key moved it off the presenter's slide and the next
79497
+ // snapshot yanked it back, which reads as the display refusing to advance.
79498
+ if (!acceptsPresentationInput()) {
79499
+ return;
79500
+ }
79261
79501
  const mapped = mapPresentationKey(event, this.keyBuffer);
79262
79502
  if (mapped.action === 'none') {
79263
79503
  return;
@@ -79345,6 +79585,11 @@ class PresentationOverlayComponent {
79345
79585
  * next/prev buttons call navigate() directly and are never gated.
79346
79586
  */
79347
79587
  advanceFromClick() {
79588
+ // An audience display never drives itself: a tap or swipe of its own would
79589
+ // move it off the presenter's slide, and the next snapshot would drag it back.
79590
+ if (!acceptsPresentationInput()) {
79591
+ return;
79592
+ }
79348
79593
  if (shouldBlockClickAdvance(this.playback.isComplete(), this.currentSlide())) {
79349
79594
  return;
79350
79595
  }
@@ -79421,6 +79666,17 @@ class PresentationOverlayComponent {
79421
79666
  if (direction === 'next' && this.playback.advance()) {
79422
79667
  return;
79423
79668
  }
79669
+ if (direction === 'prev') {
79670
+ // A slide entered backward shows its builds already complete. The next
79671
+ // back press replays them from the start rather than leaving the slide,
79672
+ // so a presenter who overshot can watch the build again (PowerPoint).
79673
+ if (this.playback.isSeededCompleted()) {
79674
+ this.playback.setSlide(this.currentSlide(), this.showWithAnimation());
79675
+ return;
79676
+ }
79677
+ // PowerPoint shows a slide you step BACK onto with its builds played.
79678
+ this.pendingCompletedEntry = true;
79679
+ }
79424
79680
  const current = this.currentIndex();
79425
79681
  let next;
79426
79682
  switch (direction) {
@@ -79482,6 +79738,12 @@ class PresentationOverlayComponent {
79482
79738
  this.indexChange.emit(next);
79483
79739
  }
79484
79740
  emitClosed() {
79741
+ // An audience display mirrors the presenter's screen: Escape, leaving
79742
+ // fullscreen and the advance past the end screen must never hand the room
79743
+ // the editing chrome.
79744
+ if (!mayLeaveSlideShow()) {
79745
+ return;
79746
+ }
79485
79747
  if (this.closing) {
79486
79748
  return;
79487
79749
  }
@@ -79492,7 +79754,7 @@ class PresentationOverlayComponent {
79492
79754
  this.closed.emit();
79493
79755
  }
79494
79756
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PresentationOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
79495
- 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 } }, 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: `
79757
+ 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: `
79496
79758
  <div #root class="pptx-ng-presentation-root">
79497
79759
  <!--
79498
79760
  Slide counter, rendered first in DOM (before slide content) so a
@@ -79850,7 +80112,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
79850
80112
  </button>
79851
80113
  </div>
79852
80114
  `, 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"] }]
79853
- }], 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 }] }], 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: [{
80115
+ }], 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: [{
79854
80116
  type: HostListener,
79855
80117
  args: ['document:fullscreenchange']
79856
80118
  }], onWindowResize: [{
@@ -84515,7 +84777,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
84515
84777
  }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
84516
84778
 
84517
84779
  // Generated by scripts/inline-shared.mjs from package.json. Do not edit.
84518
- const PPTX_ANGULAR_VIEWER_VERSION = "2.3.0";
84780
+ const PPTX_ANGULAR_VIEWER_VERSION = "2.4.0";
84519
84781
 
84520
84782
  /**
84521
84783
  * account-page.component.ts: File > Account content.
@@ -108732,6 +108994,13 @@ class PowerPointViewerComponent {
108732
108994
  ...(ngDevMode ? [{ debugName: "canEdit" }] : /* istanbul ignore next */ []));
108733
108995
  activeSlideIndex = signal(0, /* @ts-ignore */
108734
108996
  ...(ngDevMode ? [{ debugName: "activeSlideIndex" }] : /* istanbul ignore next */ []));
108997
+ /**
108998
+ * True in an audience display once the presenter ended the session and the
108999
+ * browser refused to close this tab: the overlay then shows the black
109000
+ * end-of-slide-show screen rather than falling back to the editor.
109001
+ */
109002
+ audienceSessionEnded = signal(false, /* @ts-ignore */
109003
+ ...(ngDevMode ? [{ debugName: "audienceSessionEnded" }] : /* istanbul ignore next */ []));
108735
109004
  /** Slides to display: the editable deck when `canEdit`, else the loaded deck. */
108736
109005
  displaySlides = computed(() => this.canEdit() ? this.editor.slides() : this.loader.slides(), /* @ts-ignore */
108737
109006
  ...(ngDevMode ? [{ debugName: "displaySlides" }] : /* istanbul ignore next */ []));
@@ -109311,7 +109580,15 @@ class PowerPointViewerComponent {
109311
109580
  },
109312
109581
  });
109313
109582
  if (parseAudienceNonce()) {
109314
- const disconnectAudience = this.presenterWindow.connectAudience((index) => this.activeSlideIndex.set(index), () => this.presentationMode.presenting.set(false));
109583
+ const disconnectAudience = this.presenterWindow.connectAudience((index) => this.activeSlideIndex.set(index),
109584
+ // The presenter ended the session. Close this tab; when the browser
109585
+ // refuses, raise the end-of-slide-show screen. Leaving presentation
109586
+ // mode would drop the room into the editor.
109587
+ () => {
109588
+ if (endAudienceDisplay(window)) {
109589
+ this.audienceSessionEnded.set(true);
109590
+ }
109591
+ });
109315
109592
  this.presentationMode.presenting.set(true);
109316
109593
  this.destroyRef.onDestroy(disconnectAudience);
109317
109594
  }
@@ -110418,6 +110695,7 @@ class PowerPointViewerComponent {
110418
110695
  [startIndex]="customShowsCtl.presentationStartIndex()"
110419
110696
  [showWithAnimation]="loader.presentationProperties().showWithAnimation"
110420
110697
  [subtitlesVisible]="presentationMode.subtitlesVisible()"
110698
+ [sessionEnded]="audienceSessionEnded()"
110421
110699
  (subtitlesChange)="presentationMode.subtitlesVisible.set($event)"
110422
110700
  (indexChange)="presentationMode.onPresentationIndexChange($event)"
110423
110701
  (annotationsExit)="presentationMode.onPresentationAnnotationsExit($event)"
@@ -110696,7 +110974,7 @@ class PowerPointViewerComponent {
110696
110974
  />
110697
110975
  }
110698
110976
  </div>
110699
- `, 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"], 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 */
110977
+ `, 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 */
110700
110978
  Promise.resolve().then(function () { return aiChatPanel_component; }).then(m => m.AiChatPanelComponent)]] });
110701
110979
  }
110702
110980
  i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ngImport: i0, type: PowerPointViewerComponent, resolveDeferredDeps: () => [/* @ts-ignore */
@@ -111203,6 +111481,7 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ng
111203
111481
  [startIndex]="customShowsCtl.presentationStartIndex()"
111204
111482
  [showWithAnimation]="loader.presentationProperties().showWithAnimation"
111205
111483
  [subtitlesVisible]="presentationMode.subtitlesVisible()"
111484
+ [sessionEnded]="audienceSessionEnded()"
111206
111485
  (subtitlesChange)="presentationMode.subtitlesVisible.set($event)"
111207
111486
  (indexChange)="presentationMode.onPresentationIndexChange($event)"
111208
111487
  (annotationsExit)="presentationMode.onPresentationAnnotationsExit($event)"
@@ -113335,4 +113614,4 @@ function cn(...values) {
113335
113614
  */
113336
113615
 
113337
113616
  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 };
113338
- //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-Dora2fol.mjs.map
113617
+ //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-bV0DbHDY.mjs.map