pptx-angular-viewer 2.4.0 → 2.5.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.
- package/CHANGELOG.md +15 -0
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-B1LY08QA.mjs → pptx-angular-viewer-chat-history-idb-C-_VN3xq.mjs} +2 -2
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-B1LY08QA.mjs.map → pptx-angular-viewer-chat-history-idb-C-_VN3xq.mjs.map} +1 -1
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-Dora2fol.mjs → pptx-angular-viewer-pptx-angular-viewer-DjJtbCWJ.mjs} +531 -169
- package/fesm2022/pptx-angular-viewer-pptx-angular-viewer-DjJtbCWJ.mjs.map +1 -0
- package/fesm2022/pptx-angular-viewer.mjs +1 -1
- package/package.json +3 -3
- package/types/pptx-angular-viewer.d.ts +55 -14
- package/fesm2022/pptx-angular-viewer-pptx-angular-viewer-Dora2fol.mjs.map +0 -1
|
@@ -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
|
-
|
|
15932
|
-
|
|
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 (
|
|
16685
|
-
|
|
16686
|
-
|
|
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 (
|
|
16689
|
-
|
|
16690
|
-
|
|
16691
|
-
|
|
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 (
|
|
16728
|
-
if (
|
|
16729
|
-
|
|
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-
|
|
52369
|
+
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-C-_VN3xq.mjs');
|
|
52179
52370
|
const db = await openChatDb(dbName);
|
|
52180
52371
|
return createIdbBackend(db);
|
|
52181
52372
|
}
|
|
@@ -54309,38 +54500,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
54309
54500
|
*
|
|
54310
54501
|
* Renders remote collaborators' cursors above the slide stage. This component
|
|
54311
54502
|
* is purely visual: it owns no network/Yjs logic. The host supplies a reactive
|
|
54312
|
-
* list of {@link RemoteCursor} entries (from `CollaborationService.cursors`)
|
|
54313
|
-
*
|
|
54314
|
-
*
|
|
54315
|
-
* `(x * zoom, y * zoom)`.
|
|
54503
|
+
* list of {@link RemoteCursor} entries (from `CollaborationService.cursors`);
|
|
54504
|
+
* each entry is drawn as an absolutely-positioned pointer SVG plus a name-label
|
|
54505
|
+
* chip in the user's colour, placed at `(x, y)`.
|
|
54316
54506
|
*
|
|
54317
|
-
* `x`/`y` are *unscaled* slide coordinates (px)
|
|
54318
|
-
*
|
|
54319
|
-
*
|
|
54507
|
+
* `x`/`y` are *unscaled* slide coordinates (px) and are used as-is: the overlay
|
|
54508
|
+
* is projected into the scaled slide stage, so the stage's CSS
|
|
54509
|
+
* `transform: scale()` applies the on-screen scale exactly once. Multiplying by
|
|
54510
|
+
* zoom here as well would double-apply the scale and misplace the cursors.
|
|
54320
54511
|
*
|
|
54321
54512
|
* The overlay sets `pointer-events: none` so it never intercepts canvas input.
|
|
54322
54513
|
*
|
|
54323
54514
|
* Inputs:
|
|
54324
54515
|
* - `cursors`: remote collaborators to render (unscaled slide coords)
|
|
54325
|
-
* - `zoom`: current canvas zoom factor (default: 1)
|
|
54326
54516
|
*/
|
|
54327
54517
|
class CollaborationCursorsComponent {
|
|
54328
54518
|
/** Remote collaborators to render, in unscaled slide coordinates. */
|
|
54329
54519
|
cursors = input([], /* @ts-ignore */
|
|
54330
54520
|
...(ngDevMode ? [{ debugName: "cursors" }] : /* istanbul ignore next */ []));
|
|
54331
|
-
/**
|
|
54521
|
+
/**
|
|
54522
|
+
* @deprecated Unused. The scaled slide stage this overlay is projected into
|
|
54523
|
+
* already applies the zoom via its CSS transform, so cursor coordinates are
|
|
54524
|
+
* rendered in raw slide space.
|
|
54525
|
+
*/
|
|
54332
54526
|
zoom = input(1, /* @ts-ignore */
|
|
54333
54527
|
...(ngDevMode ? [{ debugName: "zoom" }] : /* istanbul ignore next */ []));
|
|
54334
54528
|
/** Precompute positions + labels so the template stays declarative. */
|
|
54335
|
-
positioned = computed(() => {
|
|
54336
|
-
|
|
54337
|
-
|
|
54338
|
-
|
|
54339
|
-
|
|
54340
|
-
|
|
54341
|
-
transform: `translate(${cursor.x * z}px, ${cursor.y * z}px)`,
|
|
54342
|
-
}));
|
|
54343
|
-
}, /* @ts-ignore */
|
|
54529
|
+
positioned = computed(() => this.cursors().map((cursor) => ({
|
|
54530
|
+
clientId: cursor.clientId,
|
|
54531
|
+
color: cursor.color,
|
|
54532
|
+
label: formatCursorLabel(cursor.userName, MAX_LABEL_CHARS),
|
|
54533
|
+
transform: `translate(${cursor.x}px, ${cursor.y}px)`,
|
|
54534
|
+
})), /* @ts-ignore */
|
|
54344
54535
|
...(ngDevMode ? [{ debugName: "positioned" }] : /* istanbul ignore next */ []));
|
|
54345
54536
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: CollaborationCursorsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
54346
54537
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: CollaborationCursorsComponent, isStandalone: true, selector: "pptx-collaboration-cursors", inputs: { cursors: { classPropertyName: "cursors", publicName: "cursors", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
@@ -54349,6 +54540,7 @@ class CollaborationCursorsComponent {
|
|
|
54349
54540
|
<div
|
|
54350
54541
|
class="pptx-ng-collab-cursor"
|
|
54351
54542
|
[attr.data-client-id]="cursor.clientId"
|
|
54543
|
+
[attr.data-pptx-remote-cursor]="cursor.clientId"
|
|
54352
54544
|
[style.transform]="cursor.transform"
|
|
54353
54545
|
>
|
|
54354
54546
|
<svg
|
|
@@ -54381,6 +54573,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
54381
54573
|
<div
|
|
54382
54574
|
class="pptx-ng-collab-cursor"
|
|
54383
54575
|
[attr.data-client-id]="cursor.clientId"
|
|
54576
|
+
[attr.data-pptx-remote-cursor]="cursor.clientId"
|
|
54384
54577
|
[style.transform]="cursor.transform"
|
|
54385
54578
|
>
|
|
54386
54579
|
<svg
|
|
@@ -62412,9 +62605,10 @@ class AnimationPlaybackService {
|
|
|
62412
62605
|
* (entrance-animated elements start hidden). Auto-plays the first click-group
|
|
62413
62606
|
* when the slide opens with a withPrevious / afterPrevious / afterDelay build.
|
|
62414
62607
|
*/
|
|
62415
|
-
setSlide(slide, showWithAnimation) {
|
|
62608
|
+
setSlide(slide, showWithAnimation, options) {
|
|
62416
62609
|
this.showWithAnimation = showWithAnimation;
|
|
62417
62610
|
this.clearTimers();
|
|
62611
|
+
this.seededCompleted = false;
|
|
62418
62612
|
if (!slide || !this.animationsEnabled()) {
|
|
62419
62613
|
this.controller = null;
|
|
62420
62614
|
this.presentationElementStates.set(new Map());
|
|
@@ -62434,6 +62628,16 @@ class AnimationPlaybackService {
|
|
|
62434
62628
|
this.hoverTriggerShapeIds.set(controller.hoverTriggerShapeIds);
|
|
62435
62629
|
this.presentationElementStates.set(controller.computeStates());
|
|
62436
62630
|
this.syncComplete();
|
|
62631
|
+
// Stepping backward onto a slide shows it with every build already
|
|
62632
|
+
// complete, the way PowerPoint does: nothing plays, nothing is scheduled,
|
|
62633
|
+
// and a further back press replays the slide from the start.
|
|
62634
|
+
if (options?.completed) {
|
|
62635
|
+
this.seededCompleted = controller.hasMoreSteps();
|
|
62636
|
+
controller.completeAll();
|
|
62637
|
+
this.presentationElementStates.set(controller.computeStates());
|
|
62638
|
+
this.syncComplete();
|
|
62639
|
+
return;
|
|
62640
|
+
}
|
|
62437
62641
|
// Auto-play the first group when the slide opens with a withPrevious /
|
|
62438
62642
|
// afterPrevious / afterDelay build (mirrors React's entrance auto-play).
|
|
62439
62643
|
if (controller.hasMoreSteps()) {
|
|
@@ -62451,6 +62655,16 @@ class AnimationPlaybackService {
|
|
|
62451
62655
|
}
|
|
62452
62656
|
}
|
|
62453
62657
|
}
|
|
62658
|
+
/**
|
|
62659
|
+
* True while the active slide shows its builds as already complete because
|
|
62660
|
+
* the presenter stepped BACKWARD onto it. The next back press replays the
|
|
62661
|
+
* slide instead of leaving it (PowerPoint's behaviour).
|
|
62662
|
+
*/
|
|
62663
|
+
seededCompleted = false;
|
|
62664
|
+
/** Whether the active slide was seeded as fully built (backward entry). */
|
|
62665
|
+
isSeededCompleted() {
|
|
62666
|
+
return this.seededCompleted;
|
|
62667
|
+
}
|
|
62454
62668
|
// ------------------------------------------------------------------
|
|
62455
62669
|
// Playback controls
|
|
62456
62670
|
// ------------------------------------------------------------------
|
|
@@ -70691,6 +70905,15 @@ class SlideCanvasComponent {
|
|
|
70691
70905
|
/>
|
|
70692
70906
|
</svg>
|
|
70693
70907
|
}
|
|
70908
|
+
|
|
70909
|
+
<!--
|
|
70910
|
+
Projected overlays (collaboration cursors + remote selections).
|
|
70911
|
+
They live INSIDE the scaled stage so the stage's CSS
|
|
70912
|
+
transform:scale() applies the on-screen scale exactly once and
|
|
70913
|
+
they can be authored in raw, unscaled slide coordinates, exactly
|
|
70914
|
+
like the React/Vue overlays.
|
|
70915
|
+
-->
|
|
70916
|
+
<ng-content />
|
|
70694
70917
|
</div>
|
|
70695
70918
|
|
|
70696
70919
|
<!--
|
|
@@ -71099,6 +71322,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
71099
71322
|
/>
|
|
71100
71323
|
</svg>
|
|
71101
71324
|
}
|
|
71325
|
+
|
|
71326
|
+
<!--
|
|
71327
|
+
Projected overlays (collaboration cursors + remote selections).
|
|
71328
|
+
They live INSIDE the scaled stage so the stage's CSS
|
|
71329
|
+
transform:scale() applies the on-screen scale exactly once and
|
|
71330
|
+
they can be authored in raw, unscaled slide coordinates, exactly
|
|
71331
|
+
like the React/Vue overlays.
|
|
71332
|
+
-->
|
|
71333
|
+
<ng-content />
|
|
71102
71334
|
</div>
|
|
71103
71335
|
|
|
71104
71336
|
<!--
|
|
@@ -74910,12 +75142,77 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
74910
75142
|
type: Injectable
|
|
74911
75143
|
}] });
|
|
74912
75144
|
|
|
75145
|
+
/**
|
|
75146
|
+
* collaboration-overlay-geometry.ts: pure geometry for the collaboration
|
|
75147
|
+
* overlays (remote cursors + remote selection boxes).
|
|
75148
|
+
*
|
|
75149
|
+
* Kept out of the components/services so it can be unit-tested without the
|
|
75150
|
+
* Angular compiler (the package has no TestBed harness), matching the
|
|
75151
|
+
* convention used by `connector-path.ts` and the Svelte binding's
|
|
75152
|
+
* `collab/components/remote-selection.ts`.
|
|
75153
|
+
*
|
|
75154
|
+
* Coordinate contract: everything here is *unscaled slide space* (px). The
|
|
75155
|
+
* overlays are projected into the scaled slide stage, whose CSS
|
|
75156
|
+
* `transform: scale()` applies the on-screen scale exactly once, so no helper
|
|
75157
|
+
* in this module multiplies by zoom.
|
|
75158
|
+
*/
|
|
75159
|
+
/**
|
|
75160
|
+
* Resolve every remote peer's selection on the active slide into drawable
|
|
75161
|
+
* boxes. Only peers whose `activeSlideIndex` matches are considered, and only
|
|
75162
|
+
* selected ids that resolve to an element on the slide produce a box.
|
|
75163
|
+
*/
|
|
75164
|
+
function resolveRemoteSelectionBoxes(presences, elements, activeSlideIndex, formatLabel) {
|
|
75165
|
+
const elementById = new Map();
|
|
75166
|
+
for (const element of elements) {
|
|
75167
|
+
elementById.set(element.id, element);
|
|
75168
|
+
}
|
|
75169
|
+
const boxes = [];
|
|
75170
|
+
for (const peer of presences) {
|
|
75171
|
+
if (peer.activeSlideIndex !== activeSlideIndex || !peer.selectedElementId) {
|
|
75172
|
+
continue;
|
|
75173
|
+
}
|
|
75174
|
+
const element = elementById.get(peer.selectedElementId);
|
|
75175
|
+
if (!element) {
|
|
75176
|
+
continue;
|
|
75177
|
+
}
|
|
75178
|
+
boxes.push({
|
|
75179
|
+
key: `${peer.clientId}-${peer.selectedElementId}`,
|
|
75180
|
+
elementId: element.id,
|
|
75181
|
+
label: formatLabel(peer.userName),
|
|
75182
|
+
color: peer.userColor,
|
|
75183
|
+
x: element.x,
|
|
75184
|
+
y: element.y,
|
|
75185
|
+
width: element.width,
|
|
75186
|
+
height: element.height,
|
|
75187
|
+
});
|
|
75188
|
+
}
|
|
75189
|
+
return boxes;
|
|
75190
|
+
}
|
|
75191
|
+
/**
|
|
75192
|
+
* Map a pointer's client-space position into unscaled slide coordinates,
|
|
75193
|
+
* clamped to the canvas.
|
|
75194
|
+
*
|
|
75195
|
+
* `rect` must be the *stage* rect (`.pptx-ng-canvas-stage`), which is already
|
|
75196
|
+
* post-transform: `rect.width / size.width` is therefore the live on-screen
|
|
75197
|
+
* scale (the auto-fit folded with the user's zoom). Measuring against the
|
|
75198
|
+
* `<main>` scroll host instead offsets the result by the stage origin, and
|
|
75199
|
+
* dividing by the user's zoom alone drops the auto-fit factor: that pairing is
|
|
75200
|
+
* what put remote cursors and selection boxes in the wrong place in Angular.
|
|
75201
|
+
*/
|
|
75202
|
+
function clientPointToSlide(rect, size, clientX, clientY) {
|
|
75203
|
+
const scale = size.width > 0 && rect.width > 0 ? rect.width / size.width : 1;
|
|
75204
|
+
return {
|
|
75205
|
+
x: clampCursorPosition((clientX - rect.left) / scale, 0, size.width),
|
|
75206
|
+
y: clampCursorPosition((clientY - rect.top) / scale, 0, size.height),
|
|
75207
|
+
};
|
|
75208
|
+
}
|
|
75209
|
+
|
|
74913
75210
|
/**
|
|
74914
75211
|
* viewer-collab-cursor.service.ts: Viewer-scoped logic for the local
|
|
74915
75212
|
* collaboration cursor broadcast and the derived remote-cursor overlay list.
|
|
74916
75213
|
*
|
|
74917
75214
|
* Extracted from {@link PowerPointViewerComponent}: the component binds the
|
|
74918
|
-
* few accessors it alone owns (the
|
|
75215
|
+
* few accessors it alone owns (the slide-stage element, canvas size, and
|
|
74919
75216
|
* active-slide-index) via {@link bind}. `CollaborationService` is already
|
|
74920
75217
|
* provided on the component, so it is injected directly rather than passed
|
|
74921
75218
|
* through the host.
|
|
@@ -74946,8 +75243,8 @@ class ViewerCollabCursorService {
|
|
|
74946
75243
|
/**
|
|
74947
75244
|
* Publish the local cursor while the pointer moves over the canvas. Throttled
|
|
74948
75245
|
* to {@link BROADCAST_THROTTLE_MS}; coordinates are mapped from client space
|
|
74949
|
-
* into unscaled slide space
|
|
74950
|
-
*
|
|
75246
|
+
* into unscaled slide space by {@link clientPointToSlide}, measured against
|
|
75247
|
+
* the stage rect (see that helper for why `<main>` + the user zoom is wrong).
|
|
74951
75248
|
*/
|
|
74952
75249
|
onPointerMove(event) {
|
|
74953
75250
|
if (!this.collab.active()) {
|
|
@@ -74959,16 +75256,12 @@ class ViewerCollabCursorService {
|
|
|
74959
75256
|
}
|
|
74960
75257
|
this.lastCursorBroadcast = now;
|
|
74961
75258
|
const host = this.requireHost();
|
|
74962
|
-
const el = host.
|
|
75259
|
+
const el = host.stageElement();
|
|
74963
75260
|
if (!el) {
|
|
74964
75261
|
return;
|
|
74965
75262
|
}
|
|
74966
|
-
const
|
|
74967
|
-
|
|
74968
|
-
const size = host.canvasSize();
|
|
74969
|
-
const x = clampCursorPosition((event.clientX - rect.left) / zoom, 0, size.width);
|
|
74970
|
-
const y = clampCursorPosition((event.clientY - rect.top) / zoom, 0, size.height);
|
|
74971
|
-
this.collab.setCursor(x, y, host.activeSlideIndex());
|
|
75263
|
+
const point = clientPointToSlide(el.getBoundingClientRect(), host.canvasSize(), event.clientX, event.clientY);
|
|
75264
|
+
this.collab.setCursor(point.x, point.y, host.activeSlideIndex());
|
|
74972
75265
|
}
|
|
74973
75266
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ViewerCollabCursorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
74974
75267
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ViewerCollabCursorService });
|
|
@@ -76831,8 +77124,9 @@ class PresenterWindowService {
|
|
|
76831
77124
|
onSlide(message.slideIndex);
|
|
76832
77125
|
}
|
|
76833
77126
|
else if (message.type === 'presenter-exit') {
|
|
77127
|
+
// The host decides what an ended session looks like (close the tab,
|
|
77128
|
+
// else show the end screen). It must never land in the editor.
|
|
76834
77129
|
onExit();
|
|
76835
|
-
window.close();
|
|
76836
77130
|
}
|
|
76837
77131
|
};
|
|
76838
77132
|
channel.addEventListener('message', onMessage);
|
|
@@ -78862,6 +79156,13 @@ class PresentationOverlayComponent {
|
|
|
78862
79156
|
...(ngDevMode ? [{ debugName: "showWithAnimation" }] : /* istanbul ignore next */ []));
|
|
78863
79157
|
subtitlesVisible = input(false, /* @ts-ignore */
|
|
78864
79158
|
...(ngDevMode ? [{ debugName: "subtitlesVisible" }] : /* istanbul ignore next */ []));
|
|
79159
|
+
/**
|
|
79160
|
+
* Set by an audience display when the presenter ends the session and the
|
|
79161
|
+
* browser refuses to close the tab. It raises the black end-of-slide-show
|
|
79162
|
+
* screen so the room never sees the editing chrome.
|
|
79163
|
+
*/
|
|
79164
|
+
sessionEnded = input(false, /* @ts-ignore */
|
|
79165
|
+
...(ngDevMode ? [{ debugName: "sessionEnded" }] : /* istanbul ignore next */ []));
|
|
78865
79166
|
// ------------------------------------------------------------------
|
|
78866
79167
|
// Outputs
|
|
78867
79168
|
// ------------------------------------------------------------------
|
|
@@ -78890,6 +79191,18 @@ class PresentationOverlayComponent {
|
|
|
78890
79191
|
*/
|
|
78891
79192
|
endOfShow = signal(false, /* @ts-ignore */
|
|
78892
79193
|
...(ngDevMode ? [{ debugName: "endOfShow" }] : /* istanbul ignore next */ []));
|
|
79194
|
+
/**
|
|
79195
|
+
* Set just before a BACKWARD slide change so the slide effect seeds the
|
|
79196
|
+
* incoming slide as fully built.
|
|
79197
|
+
*/
|
|
79198
|
+
pendingCompletedEntry = false;
|
|
79199
|
+
/** Mirror the host's audience "session ended" flag onto the end screen. */
|
|
79200
|
+
syncSessionEnded = effect(() => {
|
|
79201
|
+
if (this.sessionEnded()) {
|
|
79202
|
+
this.endOfShow.set(true);
|
|
79203
|
+
}
|
|
79204
|
+
}, /* @ts-ignore */
|
|
79205
|
+
...(ngDevMode ? [{ debugName: "syncSessionEnded" }] : /* istanbul ignore next */ []));
|
|
78893
79206
|
syncExternalIndex = effect(() => {
|
|
78894
79207
|
const count = this.slides().length;
|
|
78895
79208
|
if (count === 0) {
|
|
@@ -78957,7 +79270,9 @@ class PresentationOverlayComponent {
|
|
|
78957
79270
|
// pre-build state so entrance-animated elements start hidden) and publish its
|
|
78958
79271
|
// per-slide keyframes CSS.
|
|
78959
79272
|
effect(() => {
|
|
78960
|
-
|
|
79273
|
+
const completed = this.pendingCompletedEntry;
|
|
79274
|
+
this.pendingCompletedEntry = false;
|
|
79275
|
+
this.playback.setSlide(this.currentSlide(), this.showWithAnimation(), { completed });
|
|
78961
79276
|
this.slideKeyframes.set(this.playback.keyframesCss());
|
|
78962
79277
|
});
|
|
78963
79278
|
// Apply each element's native-animation state (visibility, CSS animation,
|
|
@@ -79258,6 +79573,12 @@ class PresentationOverlayComponent {
|
|
|
79258
79573
|
/** Digit buffer backing PowerPoint's "type a slide number, then Enter" jump. */
|
|
79259
79574
|
keyBuffer = createPresentationKeyBuffer();
|
|
79260
79575
|
onKeyDown(event) {
|
|
79576
|
+
// An audience display mirrors the presenter's screen. If its own keyboard
|
|
79577
|
+
// navigated, a stray key moved it off the presenter's slide and the next
|
|
79578
|
+
// snapshot yanked it back, which reads as the display refusing to advance.
|
|
79579
|
+
if (!acceptsPresentationInput()) {
|
|
79580
|
+
return;
|
|
79581
|
+
}
|
|
79261
79582
|
const mapped = mapPresentationKey(event, this.keyBuffer);
|
|
79262
79583
|
if (mapped.action === 'none') {
|
|
79263
79584
|
return;
|
|
@@ -79345,6 +79666,11 @@ class PresentationOverlayComponent {
|
|
|
79345
79666
|
* next/prev buttons call navigate() directly and are never gated.
|
|
79346
79667
|
*/
|
|
79347
79668
|
advanceFromClick() {
|
|
79669
|
+
// An audience display never drives itself: a tap or swipe of its own would
|
|
79670
|
+
// move it off the presenter's slide, and the next snapshot would drag it back.
|
|
79671
|
+
if (!acceptsPresentationInput()) {
|
|
79672
|
+
return;
|
|
79673
|
+
}
|
|
79348
79674
|
if (shouldBlockClickAdvance(this.playback.isComplete(), this.currentSlide())) {
|
|
79349
79675
|
return;
|
|
79350
79676
|
}
|
|
@@ -79421,6 +79747,17 @@ class PresentationOverlayComponent {
|
|
|
79421
79747
|
if (direction === 'next' && this.playback.advance()) {
|
|
79422
79748
|
return;
|
|
79423
79749
|
}
|
|
79750
|
+
if (direction === 'prev') {
|
|
79751
|
+
// A slide entered backward shows its builds already complete. The next
|
|
79752
|
+
// back press replays them from the start rather than leaving the slide,
|
|
79753
|
+
// so a presenter who overshot can watch the build again (PowerPoint).
|
|
79754
|
+
if (this.playback.isSeededCompleted()) {
|
|
79755
|
+
this.playback.setSlide(this.currentSlide(), this.showWithAnimation());
|
|
79756
|
+
return;
|
|
79757
|
+
}
|
|
79758
|
+
// PowerPoint shows a slide you step BACK onto with its builds played.
|
|
79759
|
+
this.pendingCompletedEntry = true;
|
|
79760
|
+
}
|
|
79424
79761
|
const current = this.currentIndex();
|
|
79425
79762
|
let next;
|
|
79426
79763
|
switch (direction) {
|
|
@@ -79482,6 +79819,12 @@ class PresentationOverlayComponent {
|
|
|
79482
79819
|
this.indexChange.emit(next);
|
|
79483
79820
|
}
|
|
79484
79821
|
emitClosed() {
|
|
79822
|
+
// An audience display mirrors the presenter's screen: Escape, leaving
|
|
79823
|
+
// fullscreen and the advance past the end screen must never hand the room
|
|
79824
|
+
// the editing chrome.
|
|
79825
|
+
if (!mayLeaveSlideShow()) {
|
|
79826
|
+
return;
|
|
79827
|
+
}
|
|
79485
79828
|
if (this.closing) {
|
|
79486
79829
|
return;
|
|
79487
79830
|
}
|
|
@@ -79492,7 +79835,7 @@ class PresentationOverlayComponent {
|
|
|
79492
79835
|
this.closed.emit();
|
|
79493
79836
|
}
|
|
79494
79837
|
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: `
|
|
79838
|
+
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
79839
|
<div #root class="pptx-ng-presentation-root">
|
|
79497
79840
|
<!--
|
|
79498
79841
|
Slide counter, rendered first in DOM (before slide content) so a
|
|
@@ -79850,7 +80193,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
79850
80193
|
</button>
|
|
79851
80194
|
</div>
|
|
79852
80195
|
`, 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: [{
|
|
80196
|
+
}], 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
80197
|
type: HostListener,
|
|
79855
80198
|
args: ['document:fullscreenchange']
|
|
79856
80199
|
}], onWindowResize: [{
|
|
@@ -81607,9 +81950,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
81607
81950
|
* `activeSlideIndex` matches are drawn, and only for a selected id that resolves
|
|
81608
81951
|
* to an element on the slide.
|
|
81609
81952
|
*
|
|
81610
|
-
* Element geometry is in unscaled slide coordinates (px)
|
|
81611
|
-
*
|
|
81612
|
-
* `
|
|
81953
|
+
* Element geometry is in unscaled slide coordinates (px) and is rendered as-is:
|
|
81954
|
+
* the overlay is projected into the scaled slide stage, so the stage's CSS
|
|
81955
|
+
* `transform: scale()` applies the on-screen scale exactly once. Multiplying by
|
|
81956
|
+
* zoom here as well would double-apply the scale and misplace the boxes. It
|
|
81957
|
+
* sets `pointer-events: none` so it never intercepts canvas input.
|
|
81613
81958
|
*/
|
|
81614
81959
|
class RemoteSelectionOverlayComponent {
|
|
81615
81960
|
/** Remote collaborators' presence (cursor + selection + active slide). */
|
|
@@ -81621,41 +81966,22 @@ class RemoteSelectionOverlayComponent {
|
|
|
81621
81966
|
/** The current slide index: only peers on this slide are drawn. */
|
|
81622
81967
|
activeSlideIndex = input(0, /* @ts-ignore */
|
|
81623
81968
|
...(ngDevMode ? [{ debugName: "activeSlideIndex" }] : /* istanbul ignore next */ []));
|
|
81624
|
-
/**
|
|
81969
|
+
/**
|
|
81970
|
+
* @deprecated Unused. The scaled slide stage this overlay is projected into
|
|
81971
|
+
* already applies the zoom via its CSS transform, so selection geometry is
|
|
81972
|
+
* rendered in raw slide coordinates.
|
|
81973
|
+
*/
|
|
81625
81974
|
zoom = input(1, /* @ts-ignore */
|
|
81626
81975
|
...(ngDevMode ? [{ debugName: "zoom" }] : /* istanbul ignore next */ []));
|
|
81627
|
-
|
|
81628
|
-
|
|
81629
|
-
|
|
81630
|
-
|
|
81631
|
-
|
|
81632
|
-
|
|
81633
|
-
|
|
81634
|
-
|
|
81635
|
-
|
|
81636
|
-
const slide = this.activeSlideIndex();
|
|
81637
|
-
const z = this.zoom();
|
|
81638
|
-
const lookup = this.elementMap();
|
|
81639
|
-
const result = [];
|
|
81640
|
-
for (const peer of this.presences()) {
|
|
81641
|
-
if (peer.activeSlideIndex !== slide || !peer.selectedElementId) {
|
|
81642
|
-
continue;
|
|
81643
|
-
}
|
|
81644
|
-
const el = lookup.get(peer.selectedElementId);
|
|
81645
|
-
if (!el) {
|
|
81646
|
-
continue;
|
|
81647
|
-
}
|
|
81648
|
-
result.push({
|
|
81649
|
-
key: `${peer.clientId}-${peer.selectedElementId}`,
|
|
81650
|
-
label: formatCursorLabel(peer.userName, MAX_LABEL_CHARS),
|
|
81651
|
-
color: peer.userColor,
|
|
81652
|
-
transform: `translate(${el.x * z}px, ${el.y * z}px)`,
|
|
81653
|
-
width: el.width * z,
|
|
81654
|
-
height: el.height * z,
|
|
81655
|
-
});
|
|
81656
|
-
}
|
|
81657
|
-
return result;
|
|
81658
|
-
}, /* @ts-ignore */
|
|
81976
|
+
boxes = computed(() => resolveRemoteSelectionBoxes(this.presences(), this.elements(), this.activeSlideIndex(), (userName) => formatCursorLabel(userName, MAX_LABEL_CHARS)).map((box) => ({
|
|
81977
|
+
key: box.key,
|
|
81978
|
+
elementId: box.elementId,
|
|
81979
|
+
label: box.label,
|
|
81980
|
+
color: box.color,
|
|
81981
|
+
transform: `translate(${box.x}px, ${box.y}px)`,
|
|
81982
|
+
width: box.width,
|
|
81983
|
+
height: box.height,
|
|
81984
|
+
})), /* @ts-ignore */
|
|
81659
81985
|
...(ngDevMode ? [{ debugName: "boxes" }] : /* istanbul ignore next */ []));
|
|
81660
81986
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RemoteSelectionOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
81661
81987
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: RemoteSelectionOverlayComponent, isStandalone: true, selector: "pptx-remote-selection-overlay", inputs: { presences: { classPropertyName: "presences", publicName: "presences", isSignal: true, isRequired: false, transformFunction: null }, elements: { classPropertyName: "elements", publicName: "elements", isSignal: true, isRequired: false, transformFunction: null }, activeSlideIndex: { classPropertyName: "activeSlideIndex", publicName: "activeSlideIndex", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
@@ -81664,6 +81990,7 @@ class RemoteSelectionOverlayComponent {
|
|
|
81664
81990
|
<div
|
|
81665
81991
|
class="pptx-ng-remote-selection"
|
|
81666
81992
|
[attr.data-element-id]="box.key"
|
|
81993
|
+
[attr.data-pptx-remote-selection]="box.elementId"
|
|
81667
81994
|
[style.transform]="box.transform"
|
|
81668
81995
|
[style.width.px]="box.width"
|
|
81669
81996
|
[style.height.px]="box.height"
|
|
@@ -81685,6 +82012,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
81685
82012
|
<div
|
|
81686
82013
|
class="pptx-ng-remote-selection"
|
|
81687
82014
|
[attr.data-element-id]="box.key"
|
|
82015
|
+
[attr.data-pptx-remote-selection]="box.elementId"
|
|
81688
82016
|
[style.transform]="box.transform"
|
|
81689
82017
|
[style.width.px]="box.width"
|
|
81690
82018
|
[style.height.px]="box.height"
|
|
@@ -84515,7 +84843,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
84515
84843
|
}], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
|
|
84516
84844
|
|
|
84517
84845
|
// Generated by scripts/inline-shared.mjs from package.json. Do not edit.
|
|
84518
|
-
const PPTX_ANGULAR_VIEWER_VERSION = "2.
|
|
84846
|
+
const PPTX_ANGULAR_VIEWER_VERSION = "2.5.0";
|
|
84519
84847
|
|
|
84520
84848
|
/**
|
|
84521
84849
|
* account-page.component.ts: File > Account content.
|
|
@@ -108732,6 +109060,13 @@ class PowerPointViewerComponent {
|
|
|
108732
109060
|
...(ngDevMode ? [{ debugName: "canEdit" }] : /* istanbul ignore next */ []));
|
|
108733
109061
|
activeSlideIndex = signal(0, /* @ts-ignore */
|
|
108734
109062
|
...(ngDevMode ? [{ debugName: "activeSlideIndex" }] : /* istanbul ignore next */ []));
|
|
109063
|
+
/**
|
|
109064
|
+
* True in an audience display once the presenter ended the session and the
|
|
109065
|
+
* browser refused to close this tab: the overlay then shows the black
|
|
109066
|
+
* end-of-slide-show screen rather than falling back to the editor.
|
|
109067
|
+
*/
|
|
109068
|
+
audienceSessionEnded = signal(false, /* @ts-ignore */
|
|
109069
|
+
...(ngDevMode ? [{ debugName: "audienceSessionEnded" }] : /* istanbul ignore next */ []));
|
|
108735
109070
|
/** Slides to display: the editable deck when `canEdit`, else the loaded deck. */
|
|
108736
109071
|
displaySlides = computed(() => this.canEdit() ? this.editor.slides() : this.loader.slides(), /* @ts-ignore */
|
|
108737
109072
|
...(ngDevMode ? [{ debugName: "displaySlides" }] : /* istanbul ignore next */ []));
|
|
@@ -109311,7 +109646,15 @@ class PowerPointViewerComponent {
|
|
|
109311
109646
|
},
|
|
109312
109647
|
});
|
|
109313
109648
|
if (parseAudienceNonce()) {
|
|
109314
|
-
const disconnectAudience = this.presenterWindow.connectAudience((index) => this.activeSlideIndex.set(index),
|
|
109649
|
+
const disconnectAudience = this.presenterWindow.connectAudience((index) => this.activeSlideIndex.set(index),
|
|
109650
|
+
// The presenter ended the session. Close this tab; when the browser
|
|
109651
|
+
// refuses, raise the end-of-slide-show screen. Leaving presentation
|
|
109652
|
+
// mode would drop the room into the editor.
|
|
109653
|
+
() => {
|
|
109654
|
+
if (endAudienceDisplay(window)) {
|
|
109655
|
+
this.audienceSessionEnded.set(true);
|
|
109656
|
+
}
|
|
109657
|
+
});
|
|
109315
109658
|
this.presentationMode.presenting.set(true);
|
|
109316
109659
|
this.destroyRef.onDestroy(disconnectAudience);
|
|
109317
109660
|
}
|
|
@@ -109349,10 +109692,9 @@ class PowerPointViewerComponent {
|
|
|
109349
109692
|
activeSlideIndex: () => this.activeSlideIndex(),
|
|
109350
109693
|
});
|
|
109351
109694
|
// Hand the collab-cursor controller the accessors it alone needs from the
|
|
109352
|
-
// component (the
|
|
109695
|
+
// component (the slide stage, canvas size, active-slide-index).
|
|
109353
109696
|
this.collabCursor.bind({
|
|
109354
|
-
|
|
109355
|
-
zoom: () => this.zoomSvc.zoom(),
|
|
109697
|
+
stageElement: () => this.stageElement(),
|
|
109356
109698
|
canvasSize: () => this.loader.canvasSize(),
|
|
109357
109699
|
activeSlideIndex: () => this.activeSlideIndex(),
|
|
109358
109700
|
});
|
|
@@ -110197,16 +110539,25 @@ class PowerPointViewerComponent {
|
|
|
110197
110539
|
(eraserHit)="canvasEditing.onEraserHit($event)"
|
|
110198
110540
|
(cellCommit)="canvasEditing.onTableCellCommit($event)"
|
|
110199
110541
|
(tableChange)="canvasEditing.onTableChange($event)"
|
|
110200
|
-
|
|
110201
|
-
|
|
110202
|
-
|
|
110203
|
-
|
|
110204
|
-
|
|
110205
|
-
|
|
110206
|
-
|
|
110207
|
-
|
|
110208
|
-
|
|
110209
|
-
|
|
110542
|
+
>
|
|
110543
|
+
<!--
|
|
110544
|
+
Collaboration overlays are PROJECTED INTO the slide canvas so they
|
|
110545
|
+
render inside the scaled stage: the stage transform applies the
|
|
110546
|
+
on-screen scale (auto-fit folded with the user's zoom) exactly
|
|
110547
|
+
once, and both overlays are authored in raw slide coordinates.
|
|
110548
|
+
Rendering them as siblings of the canvas instead put them in
|
|
110549
|
+
main-element space, which offset every cursor/selection box by
|
|
110550
|
+
the stage origin and scaled it by the user zoom alone.
|
|
110551
|
+
-->
|
|
110552
|
+
@if (collab.connected()) {
|
|
110553
|
+
<pptx-collaboration-cursors [cursors]="collabCursor.cursors()" />
|
|
110554
|
+
<pptx-remote-selection-overlay
|
|
110555
|
+
[presences]="collab.presence()"
|
|
110556
|
+
[elements]="activeSlide()?.elements ?? []"
|
|
110557
|
+
[activeSlideIndex]="activeSlideIndex()"
|
|
110558
|
+
/>
|
|
110559
|
+
}
|
|
110560
|
+
</pptx-slide-canvas>
|
|
110210
110561
|
@if (collab.active() && collab.presence().length > 0) {
|
|
110211
110562
|
<div class="pptx-ng-collab-follow">
|
|
110212
110563
|
<pptx-follow-mode-bar
|
|
@@ -110418,6 +110769,7 @@ class PowerPointViewerComponent {
|
|
|
110418
110769
|
[startIndex]="customShowsCtl.presentationStartIndex()"
|
|
110419
110770
|
[showWithAnimation]="loader.presentationProperties().showWithAnimation"
|
|
110420
110771
|
[subtitlesVisible]="presentationMode.subtitlesVisible()"
|
|
110772
|
+
[sessionEnded]="audienceSessionEnded()"
|
|
110421
110773
|
(subtitlesChange)="presentationMode.subtitlesVisible.set($event)"
|
|
110422
110774
|
(indexChange)="presentationMode.onPresentationIndexChange($event)"
|
|
110423
110775
|
(annotationsExit)="presentationMode.onPresentationAnnotationsExit($event)"
|
|
@@ -110696,7 +111048,7 @@ class PowerPointViewerComponent {
|
|
|
110696
111048
|
/>
|
|
110697
111049
|
}
|
|
110698
111050
|
</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 */
|
|
111051
|
+
`, 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
111052
|
Promise.resolve().then(function () { return aiChatPanel_component; }).then(m => m.AiChatPanelComponent)]] });
|
|
110701
111053
|
}
|
|
110702
111054
|
i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ngImport: i0, type: PowerPointViewerComponent, resolveDeferredDeps: () => [/* @ts-ignore */
|
|
@@ -110982,16 +111334,25 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ng
|
|
|
110982
111334
|
(eraserHit)="canvasEditing.onEraserHit($event)"
|
|
110983
111335
|
(cellCommit)="canvasEditing.onTableCellCommit($event)"
|
|
110984
111336
|
(tableChange)="canvasEditing.onTableChange($event)"
|
|
110985
|
-
|
|
110986
|
-
|
|
110987
|
-
|
|
110988
|
-
|
|
110989
|
-
|
|
110990
|
-
|
|
110991
|
-
|
|
110992
|
-
|
|
110993
|
-
|
|
110994
|
-
|
|
111337
|
+
>
|
|
111338
|
+
<!--
|
|
111339
|
+
Collaboration overlays are PROJECTED INTO the slide canvas so they
|
|
111340
|
+
render inside the scaled stage: the stage transform applies the
|
|
111341
|
+
on-screen scale (auto-fit folded with the user's zoom) exactly
|
|
111342
|
+
once, and both overlays are authored in raw slide coordinates.
|
|
111343
|
+
Rendering them as siblings of the canvas instead put them in
|
|
111344
|
+
main-element space, which offset every cursor/selection box by
|
|
111345
|
+
the stage origin and scaled it by the user zoom alone.
|
|
111346
|
+
-->
|
|
111347
|
+
@if (collab.connected()) {
|
|
111348
|
+
<pptx-collaboration-cursors [cursors]="collabCursor.cursors()" />
|
|
111349
|
+
<pptx-remote-selection-overlay
|
|
111350
|
+
[presences]="collab.presence()"
|
|
111351
|
+
[elements]="activeSlide()?.elements ?? []"
|
|
111352
|
+
[activeSlideIndex]="activeSlideIndex()"
|
|
111353
|
+
/>
|
|
111354
|
+
}
|
|
111355
|
+
</pptx-slide-canvas>
|
|
110995
111356
|
@if (collab.active() && collab.presence().length > 0) {
|
|
110996
111357
|
<div class="pptx-ng-collab-follow">
|
|
110997
111358
|
<pptx-follow-mode-bar
|
|
@@ -111203,6 +111564,7 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ng
|
|
|
111203
111564
|
[startIndex]="customShowsCtl.presentationStartIndex()"
|
|
111204
111565
|
[showWithAnimation]="loader.presentationProperties().showWithAnimation"
|
|
111205
111566
|
[subtitlesVisible]="presentationMode.subtitlesVisible()"
|
|
111567
|
+
[sessionEnded]="audienceSessionEnded()"
|
|
111206
111568
|
(subtitlesChange)="presentationMode.subtitlesVisible.set($event)"
|
|
111207
111569
|
(indexChange)="presentationMode.onPresentationIndexChange($event)"
|
|
111208
111570
|
(annotationsExit)="presentationMode.onPresentationAnnotationsExit($event)"
|
|
@@ -113335,4 +113697,4 @@ function cn(...values) {
|
|
|
113335
113697
|
*/
|
|
113336
113698
|
|
|
113337
113699
|
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-
|
|
113700
|
+
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-DjJtbCWJ.mjs.map
|