pptx-angular-viewer 2.1.0 → 2.1.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 +6 -0
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-DuJ08L_k.mjs → pptx-angular-viewer-chat-history-idb-wNAwjS8U.mjs} +2 -2
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-DuJ08L_k.mjs.map → pptx-angular-viewer-chat-history-idb-wNAwjS8U.mjs.map} +1 -1
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-X944WpER.mjs → pptx-angular-viewer-pptx-angular-viewer-BwaiF7Nf.mjs} +387 -286
- package/fesm2022/pptx-angular-viewer-pptx-angular-viewer-BwaiF7Nf.mjs.map +1 -0
- package/fesm2022/pptx-angular-viewer.mjs +1 -1
- package/package.json +1 -1
- package/types/pptx-angular-viewer.d.ts +117 -150
- package/fesm2022/pptx-angular-viewer-pptx-angular-viewer-X944WpER.mjs.map +0 -1
|
@@ -51743,7 +51743,7 @@ function createLocalStorageBackend(namespace) {
|
|
|
51743
51743
|
/** Try IndexedDB first; fall back to localStorage on any failure. */
|
|
51744
51744
|
async function resolveBackend(dbName, namespace) {
|
|
51745
51745
|
try {
|
|
51746
|
-
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-
|
|
51746
|
+
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-wNAwjS8U.mjs');
|
|
51747
51747
|
const db = await openChatDb(dbName);
|
|
51748
51748
|
return createIdbBackend(db);
|
|
51749
51749
|
}
|
|
@@ -53974,54 +53974,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
53974
53974
|
`, styles: [":host{position:absolute;inset:0;pointer-events:none;overflow:visible;z-index:9999}.pptx-ng-collab-cursor{position:absolute;top:0;left:0;pointer-events:none;will-change:transform;transition:transform 90ms linear}.pptx-ng-collab-pointer{display:block;filter:drop-shadow(0 1px 1px rgba(0,0,0,.35))}.pptx-ng-collab-label{position:absolute;top:16px;left:12px;max-width:150px;padding:2px 6px;border-radius:4px;color:#fff;font-family:system-ui,sans-serif;font-size:10px;font-weight:500;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-shadow:0 1px 2px #0000004d}\n"] }]
|
|
53975
53975
|
}], propDecorators: { cursors: [{ type: i0.Input, args: [{ isSignal: true, alias: "cursors", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }] } });
|
|
53976
53976
|
|
|
53977
|
-
/**
|
|
53978
|
-
* collaboration-local-presence.ts: publishes the local user's presence into a
|
|
53979
|
-
* single awareness `presence` field.
|
|
53980
|
-
*
|
|
53981
|
-
* Cursor, selection, and active-slide updates all merge into one record so a
|
|
53982
|
-
* later cursor move never clobbers the selection (or vice versa). The remote
|
|
53983
|
-
* side reads this shape via the shared `derivePresenceList`.
|
|
53984
|
-
*/
|
|
53985
|
-
class LocalPresencePublisher {
|
|
53986
|
-
awareness;
|
|
53987
|
-
identity;
|
|
53988
|
-
activeSlide = 0;
|
|
53989
|
-
cursor = { x: 0, y: 0 };
|
|
53990
|
-
selection;
|
|
53991
|
-
constructor(awareness, identity) {
|
|
53992
|
-
this.awareness = awareness;
|
|
53993
|
-
this.identity = identity;
|
|
53994
|
-
}
|
|
53995
|
-
/** Re-emit the merged presence record (also used as a heartbeat). */
|
|
53996
|
-
publish() {
|
|
53997
|
-
this.awareness.setLocalStateField('presence', {
|
|
53998
|
-
userName: this.identity.userName,
|
|
53999
|
-
userColor: this.identity.userColor,
|
|
54000
|
-
userAvatar: this.identity.userAvatar,
|
|
54001
|
-
role: this.identity.role,
|
|
54002
|
-
activeSlideIndex: this.activeSlide,
|
|
54003
|
-
cursorX: this.cursor.x,
|
|
54004
|
-
cursorY: this.cursor.y,
|
|
54005
|
-
selectedElementId: this.selection,
|
|
54006
|
-
lastUpdated: new Date().toISOString(),
|
|
54007
|
-
});
|
|
54008
|
-
}
|
|
54009
|
-
setCursor(x, y, activeSlideIndex = this.activeSlide) {
|
|
54010
|
-
this.cursor = { x, y };
|
|
54011
|
-
this.activeSlide = activeSlideIndex;
|
|
54012
|
-
this.publish();
|
|
54013
|
-
}
|
|
54014
|
-
setSelection(selectedElementId, activeSlideIndex = this.activeSlide) {
|
|
54015
|
-
this.selection = selectedElementId;
|
|
54016
|
-
this.activeSlide = activeSlideIndex;
|
|
54017
|
-
this.publish();
|
|
54018
|
-
}
|
|
54019
|
-
setActiveSlide(index) {
|
|
54020
|
-
this.activeSlide = Math.max(0, Math.floor(index));
|
|
54021
|
-
this.publish();
|
|
54022
|
-
}
|
|
54023
|
-
}
|
|
54024
|
-
|
|
54025
53977
|
/**
|
|
54026
53978
|
* collaboration-providers.ts: transport factories for the Angular
|
|
54027
53979
|
* collaboration service.
|
|
@@ -54083,6 +54035,346 @@ async function createWebrtcBundle(config) {
|
|
|
54083
54035
|
};
|
|
54084
54036
|
}
|
|
54085
54037
|
|
|
54038
|
+
/**
|
|
54039
|
+
* collaboration-connection.ts: provider connection-status wiring for the
|
|
54040
|
+
* Angular `CollaborationService`. Owns the websocket connect timeout and drives
|
|
54041
|
+
* the status transitions plus the sync-gate re-arm on drops; extracted from
|
|
54042
|
+
* `collaboration.service.ts` so the service stays within the file-size budget.
|
|
54043
|
+
*
|
|
54044
|
+
* Mirrors the vanilla binding's module of the same name, but over Angular's
|
|
54045
|
+
* `ProviderLike` event surface (`on('status', payload)` with
|
|
54046
|
+
* `payload.connected` for webrtc / `payload.status` for websocket).
|
|
54047
|
+
*/
|
|
54048
|
+
/**
|
|
54049
|
+
* Subscribe to the provider's status events, driving `setStatus` and the
|
|
54050
|
+
* sync-gate re-arm. For websocket transports this also arms a one-shot connect
|
|
54051
|
+
* timeout when the socket is not open yet.
|
|
54052
|
+
*/
|
|
54053
|
+
function wireConnectionStatus(deps) {
|
|
54054
|
+
const { provider, transport } = deps;
|
|
54055
|
+
let connectTimer = null;
|
|
54056
|
+
function cancelConnectTimer() {
|
|
54057
|
+
if (connectTimer !== null) {
|
|
54058
|
+
clearTimeout(connectTimer);
|
|
54059
|
+
connectTimer = null;
|
|
54060
|
+
}
|
|
54061
|
+
}
|
|
54062
|
+
if (transport === 'webrtc') {
|
|
54063
|
+
// P2P: no server round-trip to wait on. Treat "created" as connected, and
|
|
54064
|
+
// reflect explicit disconnect events (re-arming the gate on a drop).
|
|
54065
|
+
deps.setStatus('connected');
|
|
54066
|
+
provider.on('status', (payload) => {
|
|
54067
|
+
if (payload.connected === false && deps.isActive()) {
|
|
54068
|
+
deps.setStatus('disconnected');
|
|
54069
|
+
deps.reArmGate();
|
|
54070
|
+
}
|
|
54071
|
+
else if (payload.connected === true) {
|
|
54072
|
+
deps.setStatus('connected');
|
|
54073
|
+
}
|
|
54074
|
+
});
|
|
54075
|
+
return { cancelConnectTimer };
|
|
54076
|
+
}
|
|
54077
|
+
provider.on('status', (payload) => {
|
|
54078
|
+
if (payload.status === 'connected') {
|
|
54079
|
+
cancelConnectTimer();
|
|
54080
|
+
deps.setStatus('connected');
|
|
54081
|
+
}
|
|
54082
|
+
else if (payload.status === 'disconnected' && deps.isActive()) {
|
|
54083
|
+
deps.setStatus('disconnected');
|
|
54084
|
+
deps.reArmGate();
|
|
54085
|
+
}
|
|
54086
|
+
});
|
|
54087
|
+
if (provider.wsconnected) {
|
|
54088
|
+
deps.setStatus('connected');
|
|
54089
|
+
return { cancelConnectTimer };
|
|
54090
|
+
}
|
|
54091
|
+
connectTimer = setTimeout(() => {
|
|
54092
|
+
connectTimer = null;
|
|
54093
|
+
if (deps.getStatus() !== 'connected') {
|
|
54094
|
+
deps.onConnectTimeout();
|
|
54095
|
+
}
|
|
54096
|
+
}, CONNECTION_TIMEOUT_MS);
|
|
54097
|
+
return { cancelConnectTimer };
|
|
54098
|
+
}
|
|
54099
|
+
|
|
54100
|
+
/**
|
|
54101
|
+
* collaboration-local-presence.ts: publishes the local user's presence into a
|
|
54102
|
+
* single awareness `presence` field.
|
|
54103
|
+
*
|
|
54104
|
+
* Cursor, selection, and active-slide updates all merge into one record so a
|
|
54105
|
+
* later cursor move never clobbers the selection (or vice versa). The remote
|
|
54106
|
+
* side reads this shape via the shared `derivePresenceList`.
|
|
54107
|
+
*/
|
|
54108
|
+
class LocalPresencePublisher {
|
|
54109
|
+
awareness;
|
|
54110
|
+
identity;
|
|
54111
|
+
activeSlide = 0;
|
|
54112
|
+
cursor = { x: 0, y: 0 };
|
|
54113
|
+
selection;
|
|
54114
|
+
constructor(awareness, identity) {
|
|
54115
|
+
this.awareness = awareness;
|
|
54116
|
+
this.identity = identity;
|
|
54117
|
+
}
|
|
54118
|
+
/** Re-emit the merged presence record (also used as a heartbeat). */
|
|
54119
|
+
publish() {
|
|
54120
|
+
this.awareness.setLocalStateField('presence', {
|
|
54121
|
+
userName: this.identity.userName,
|
|
54122
|
+
userColor: this.identity.userColor,
|
|
54123
|
+
userAvatar: this.identity.userAvatar,
|
|
54124
|
+
role: this.identity.role,
|
|
54125
|
+
activeSlideIndex: this.activeSlide,
|
|
54126
|
+
cursorX: this.cursor.x,
|
|
54127
|
+
cursorY: this.cursor.y,
|
|
54128
|
+
selectedElementId: this.selection,
|
|
54129
|
+
lastUpdated: new Date().toISOString(),
|
|
54130
|
+
});
|
|
54131
|
+
}
|
|
54132
|
+
setCursor(x, y, activeSlideIndex = this.activeSlide) {
|
|
54133
|
+
this.cursor = { x, y };
|
|
54134
|
+
this.activeSlide = activeSlideIndex;
|
|
54135
|
+
this.publish();
|
|
54136
|
+
}
|
|
54137
|
+
setSelection(selectedElementId, activeSlideIndex = this.activeSlide) {
|
|
54138
|
+
this.selection = selectedElementId;
|
|
54139
|
+
this.activeSlide = activeSlideIndex;
|
|
54140
|
+
this.publish();
|
|
54141
|
+
}
|
|
54142
|
+
setActiveSlide(index) {
|
|
54143
|
+
this.activeSlide = Math.max(0, Math.floor(index));
|
|
54144
|
+
this.publish();
|
|
54145
|
+
}
|
|
54146
|
+
}
|
|
54147
|
+
|
|
54148
|
+
/**
|
|
54149
|
+
* collaboration-session-setup.ts: build up and tear down a live collaboration
|
|
54150
|
+
* session for the Angular `CollaborationService`.
|
|
54151
|
+
*
|
|
54152
|
+
* Extracted from `collaboration.service.ts` so the service keeps only its
|
|
54153
|
+
* reactive state and public API. `activateSession` wires a freshly-created
|
|
54154
|
+
* provider bundle into a running session and returns the {@link ActiveSession}
|
|
54155
|
+
* the service holds as a single atomic handle; `teardownSession` disposes it.
|
|
54156
|
+
*/
|
|
54157
|
+
/**
|
|
54158
|
+
* Wire `bundle` into an active session: configure the live-patch channel, bind
|
|
54159
|
+
* the slide-sync engine, publish local presence, subscribe to awareness +
|
|
54160
|
+
* connection-status + remote-slide changes, then open the first-write gate.
|
|
54161
|
+
*/
|
|
54162
|
+
function activateSession(bundle, config, transport, deps) {
|
|
54163
|
+
deps.livePatcher.configure(bundle.doc, bundle.factories);
|
|
54164
|
+
deps.slideSync.bind({
|
|
54165
|
+
ydoc: bundle.doc,
|
|
54166
|
+
factories: bundle.factories,
|
|
54167
|
+
onRemoteSlides: deps.onRemoteSlides,
|
|
54168
|
+
scheduleWriteBack: deps.scheduleWriteBack,
|
|
54169
|
+
});
|
|
54170
|
+
const localPresence = new LocalPresencePublisher(bundle.awareness, {
|
|
54171
|
+
userName: config.userName,
|
|
54172
|
+
userColor: config.userColor ?? DEFAULT_CURSOR_COLOR,
|
|
54173
|
+
userAvatar: config.userAvatar,
|
|
54174
|
+
role: config.role,
|
|
54175
|
+
});
|
|
54176
|
+
localPresence.publish();
|
|
54177
|
+
bundle.awareness.on('change', deps.refreshPresence);
|
|
54178
|
+
bundle.awareness.on('update', deps.refreshPresence);
|
|
54179
|
+
deps.slideSync.gate.reset();
|
|
54180
|
+
const connection = wireConnectionStatus({
|
|
54181
|
+
provider: bundle.provider,
|
|
54182
|
+
transport,
|
|
54183
|
+
setStatus: deps.setStatus,
|
|
54184
|
+
getStatus: deps.getStatus,
|
|
54185
|
+
isActive: deps.isActive,
|
|
54186
|
+
reArmGate: () => {
|
|
54187
|
+
deps.slideSync.gate.reset();
|
|
54188
|
+
deps.slideSync.gate.arm();
|
|
54189
|
+
},
|
|
54190
|
+
onConnectTimeout: deps.failConnection,
|
|
54191
|
+
});
|
|
54192
|
+
deps.slideSync.wireSynced(bundle.provider);
|
|
54193
|
+
const unobserve = observeYDocSlides(bundle.doc, (_events, transaction) => deps.slideSync.onRemoteChange(transaction));
|
|
54194
|
+
return {
|
|
54195
|
+
ydoc: bundle.doc,
|
|
54196
|
+
provider: bundle.provider,
|
|
54197
|
+
awareness: bundle.awareness,
|
|
54198
|
+
departure: bundle.departure,
|
|
54199
|
+
factories: bundle.factories,
|
|
54200
|
+
selfId: bundle.awareness.clientID ?? -1,
|
|
54201
|
+
localPresence,
|
|
54202
|
+
connection,
|
|
54203
|
+
unobserve,
|
|
54204
|
+
};
|
|
54205
|
+
}
|
|
54206
|
+
/**
|
|
54207
|
+
* Dispose a live session. Announces the departure synchronously first: the
|
|
54208
|
+
* provider's own awareness removal is broadcast a microtask later and would be
|
|
54209
|
+
* dropped when this runs from a document being destroyed, leaving a ghost
|
|
54210
|
+
* collaborator until the 30s awareness timeout.
|
|
54211
|
+
*/
|
|
54212
|
+
function teardownSession(session, refreshPresence) {
|
|
54213
|
+
session.connection.cancelConnectTimer();
|
|
54214
|
+
session.unobserve();
|
|
54215
|
+
session.awareness.off?.('change', refreshPresence);
|
|
54216
|
+
session.awareness.off?.('update', refreshPresence);
|
|
54217
|
+
session.departure.announce();
|
|
54218
|
+
session.departure.dispose();
|
|
54219
|
+
clearLocalAwareness(session.awareness);
|
|
54220
|
+
session.provider.disconnect();
|
|
54221
|
+
session.provider.destroy();
|
|
54222
|
+
session.ydoc.destroy();
|
|
54223
|
+
}
|
|
54224
|
+
|
|
54225
|
+
/**
|
|
54226
|
+
* collaboration-slide-sync.ts: the granular local<->doc slide sync engine for
|
|
54227
|
+
* the Angular `CollaborationService`, extracted so the service stays within the
|
|
54228
|
+
* repo's 300 LOC ceiling.
|
|
54229
|
+
*
|
|
54230
|
+
* Owns the first-write gate plus the echo-dedupe bookkeeping (`lastSynced`,
|
|
54231
|
+
* `applyingRemote`, `pendingBroadcast`) and the broadcast / remote-apply /
|
|
54232
|
+
* post-load-adoption logic. The service keeps provider + awareness ownership
|
|
54233
|
+
* and binds this engine to the live doc for the duration of a session.
|
|
54234
|
+
*/
|
|
54235
|
+
class SlideSyncEngine {
|
|
54236
|
+
/**
|
|
54237
|
+
* First-write gate: local broadcasts are suppressed (captured as pending)
|
|
54238
|
+
* until the provider confirms its initial sync or the grace period lifts the
|
|
54239
|
+
* gate, so a late joiner never seeds its placeholder deck into a room whose
|
|
54240
|
+
* real content has not arrived yet.
|
|
54241
|
+
*/
|
|
54242
|
+
gate = createSyncGate(() => this.#flushPending());
|
|
54243
|
+
#binding = null;
|
|
54244
|
+
#lastSynced = '';
|
|
54245
|
+
#applyingRemote = false;
|
|
54246
|
+
#pending = null;
|
|
54247
|
+
/** Attach the engine to a freshly connected session's doc. */
|
|
54248
|
+
bind(binding) {
|
|
54249
|
+
this.#binding = binding;
|
|
54250
|
+
}
|
|
54251
|
+
/** Clear all per-session state (call on disconnect). */
|
|
54252
|
+
reset() {
|
|
54253
|
+
this.gate.reset();
|
|
54254
|
+
this.#binding = null;
|
|
54255
|
+
this.#pending = null;
|
|
54256
|
+
this.#lastSynced = '';
|
|
54257
|
+
this.#applyingRemote = false;
|
|
54258
|
+
}
|
|
54259
|
+
/**
|
|
54260
|
+
* Record the current local deck as the sync baseline so the first (unchanged)
|
|
54261
|
+
* broadcast after connecting is suppressed. Call right after connect for a
|
|
54262
|
+
* joiner whose local deck is a placeholder awaiting remote sync, so it never
|
|
54263
|
+
* overwrites the shared document before receiving it.
|
|
54264
|
+
*/
|
|
54265
|
+
seedBaseline(slides) {
|
|
54266
|
+
this.#lastSynced = JSON.stringify(slides);
|
|
54267
|
+
}
|
|
54268
|
+
/**
|
|
54269
|
+
* Open the first-write gate on the provider's initial-sync confirmation.
|
|
54270
|
+
* y-websocket emits 'sync' with a boolean; y-webrtc emits 'synced' with an
|
|
54271
|
+
* object carrying a `synced` flag (and only once a peer syncs, hence the
|
|
54272
|
+
* grace timer). Listen to both; opening is idempotent.
|
|
54273
|
+
*/
|
|
54274
|
+
wireSynced(provider) {
|
|
54275
|
+
const handle = (payload) => {
|
|
54276
|
+
const flag = payload;
|
|
54277
|
+
const isSynced = typeof flag === 'boolean' ? flag : flag?.synced !== false;
|
|
54278
|
+
if (isSynced) {
|
|
54279
|
+
this.gate.open();
|
|
54280
|
+
}
|
|
54281
|
+
};
|
|
54282
|
+
provider.on('sync', handle);
|
|
54283
|
+
provider.on('synced', handle);
|
|
54284
|
+
if (provider.synced === true) {
|
|
54285
|
+
this.gate.open();
|
|
54286
|
+
}
|
|
54287
|
+
else {
|
|
54288
|
+
this.gate.arm();
|
|
54289
|
+
}
|
|
54290
|
+
}
|
|
54291
|
+
/**
|
|
54292
|
+
* Broadcast the local slide set to peers, reconciling only what changed into
|
|
54293
|
+
* the pptx:slides Y.Array. An empty deck is never written (so a late-joiner
|
|
54294
|
+
* that has not yet received the doc cannot clobber it), an unchanged deck is
|
|
54295
|
+
* skipped, and while the gate is shut the deck is held as pending.
|
|
54296
|
+
*/
|
|
54297
|
+
broadcast(slides) {
|
|
54298
|
+
const b = this.#binding;
|
|
54299
|
+
if (!b || this.#applyingRemote || slides.length === 0) {
|
|
54300
|
+
return;
|
|
54301
|
+
}
|
|
54302
|
+
if (!this.gate.isOpen()) {
|
|
54303
|
+
this.#pending = slides;
|
|
54304
|
+
return;
|
|
54305
|
+
}
|
|
54306
|
+
const s = JSON.stringify(slides);
|
|
54307
|
+
if (s === this.#lastSynced) {
|
|
54308
|
+
return;
|
|
54309
|
+
}
|
|
54310
|
+
this.#lastSynced = s;
|
|
54311
|
+
reconcileSlidesInYDoc([...slides], b.ydoc, b.factories, LOCAL_SYNC_ORIGIN);
|
|
54312
|
+
b.scheduleWriteBack();
|
|
54313
|
+
}
|
|
54314
|
+
/** Handle a remote Y.Doc change, skipping our own local-origin transactions. */
|
|
54315
|
+
onRemoteChange(transaction) {
|
|
54316
|
+
const b = this.#binding;
|
|
54317
|
+
if (transaction?.origin === LOCAL_SYNC_ORIGIN || this.#applyingRemote || !b) {
|
|
54318
|
+
return;
|
|
54319
|
+
}
|
|
54320
|
+
const remote = readSlidesFromYDoc(b.ydoc);
|
|
54321
|
+
if (remote.length === 0) {
|
|
54322
|
+
return;
|
|
54323
|
+
}
|
|
54324
|
+
// Suppress the echo: record what we just applied so the subsequent local
|
|
54325
|
+
// broadcast (driven by the editor signal) is a no-op.
|
|
54326
|
+
this.#lastSynced = JSON.stringify(remote);
|
|
54327
|
+
this.#applyingRemote = true;
|
|
54328
|
+
b.onRemoteSlides?.(remote);
|
|
54329
|
+
this.#applyingRemote = false;
|
|
54330
|
+
b.scheduleWriteBack();
|
|
54331
|
+
}
|
|
54332
|
+
/**
|
|
54333
|
+
* Re-adopt the shared document's slides after a local content load committed
|
|
54334
|
+
* a parsed deck to viewer state. The load pipeline applies its deck
|
|
54335
|
+
* unconditionally, so a load finishing AFTER the room's slides were applied
|
|
54336
|
+
* (a late joiner's bootstrap deck parsing slower than the doc sync) would
|
|
54337
|
+
* clobber the synced state, and with the doc itself unchanged the observer
|
|
54338
|
+
* never re-fires. When the room already has slides they win, re-applied
|
|
54339
|
+
* through `onRemoteSlides` and recorded as the baseline (bypassing the JSON
|
|
54340
|
+
* dedupe) so the follow-up local broadcast is a no-op. An empty room means
|
|
54341
|
+
* this client is the seeder. Returns true when the doc was adopted.
|
|
54342
|
+
*/
|
|
54343
|
+
adoptDocAfterLoad() {
|
|
54344
|
+
const b = this.#binding;
|
|
54345
|
+
if (!b) {
|
|
54346
|
+
return false;
|
|
54347
|
+
}
|
|
54348
|
+
const docSlides = readSlidesFromYDoc(b.ydoc);
|
|
54349
|
+
if (docSlides.length === 0) {
|
|
54350
|
+
return false;
|
|
54351
|
+
}
|
|
54352
|
+
this.#lastSynced = JSON.stringify(docSlides);
|
|
54353
|
+
this.#applyingRemote = true;
|
|
54354
|
+
b.onRemoteSlides?.(docSlides);
|
|
54355
|
+
this.#applyingRemote = false;
|
|
54356
|
+
return true;
|
|
54357
|
+
}
|
|
54358
|
+
/**
|
|
54359
|
+
* Perform the deferred first broadcast once the gate opens. When the doc is
|
|
54360
|
+
* still empty (fresh room, or nobody else present), clear the baseline so the
|
|
54361
|
+
* pending deck actually seeds it; when remote content already arrived, the
|
|
54362
|
+
* pending deck matches the applied baseline and the write is a no-op.
|
|
54363
|
+
*/
|
|
54364
|
+
#flushPending() {
|
|
54365
|
+
const b = this.#binding;
|
|
54366
|
+
const pending = this.#pending;
|
|
54367
|
+
this.#pending = null;
|
|
54368
|
+
if (!pending || !b) {
|
|
54369
|
+
return;
|
|
54370
|
+
}
|
|
54371
|
+
if (b.ydoc.getArray(YDOC_SLIDES_KEY).length === 0) {
|
|
54372
|
+
this.#lastSynced = '';
|
|
54373
|
+
}
|
|
54374
|
+
this.broadcast(pending);
|
|
54375
|
+
}
|
|
54376
|
+
}
|
|
54377
|
+
|
|
54086
54378
|
/**
|
|
54087
54379
|
* Split inherited template (master/layout) elements out of each loaded slide.
|
|
54088
54380
|
*
|
|
@@ -54217,6 +54509,7 @@ class WriteBackScheduler {
|
|
|
54217
54509
|
*
|
|
54218
54510
|
* Provide at the component level: `@Component({ providers: [CollaborationService] })`.
|
|
54219
54511
|
*/
|
|
54512
|
+
/** Sentinel canvas bound used until the host reports real dimensions. */
|
|
54220
54513
|
const DEFAULT_CANVAS_BOUND = 100_000;
|
|
54221
54514
|
class CollaborationService {
|
|
54222
54515
|
// Reactive state
|
|
@@ -54256,26 +54549,13 @@ class CollaborationService {
|
|
|
54256
54549
|
* as it happens instead of on commit. Dormant outside a session.
|
|
54257
54550
|
*/
|
|
54258
54551
|
livePatcher = createCollaborationLivePatcher();
|
|
54259
|
-
//
|
|
54260
|
-
|
|
54261
|
-
|
|
54262
|
-
|
|
54263
|
-
departure = null;
|
|
54264
|
-
selfId = -1;
|
|
54265
|
-
applyingRemote = false;
|
|
54266
|
-
yFactories = null;
|
|
54267
|
-
lastSynced = '';
|
|
54268
|
-
connectTimer = null;
|
|
54269
|
-
unobserveSlides = null;
|
|
54552
|
+
// The live session's transport objects + wiring handles, owned as one atomic
|
|
54553
|
+
// unit: null when disconnected, assigned by connect(), disposed by
|
|
54554
|
+
// disconnect(). See collaboration-session-setup.ts.
|
|
54555
|
+
session = null;
|
|
54270
54556
|
writeBack = new WriteBackScheduler();
|
|
54271
|
-
/**
|
|
54272
|
-
|
|
54273
|
-
* until the provider confirms its initial sync or the grace period lifts
|
|
54274
|
-
* the gate, so a late joiner never seeds its placeholder deck into a room
|
|
54275
|
-
* whose real content has not arrived yet.
|
|
54276
|
-
*/
|
|
54277
|
-
syncGate = createSyncGate(() => this.flushPendingBroadcast());
|
|
54278
|
-
pendingBroadcast = null;
|
|
54557
|
+
/** Granular local<->doc slide sync (gate + echo dedupe + broadcast/adopt). */
|
|
54558
|
+
slideSync = new SlideSyncEngine();
|
|
54279
54559
|
onRemoteSlides = null;
|
|
54280
54560
|
canvasWidth = DEFAULT_CANVAS_BOUND;
|
|
54281
54561
|
canvasHeight = DEFAULT_CANVAS_BOUND;
|
|
@@ -54284,7 +54564,6 @@ class CollaborationService {
|
|
|
54284
54564
|
currentConfig = null;
|
|
54285
54565
|
lastConfig = null;
|
|
54286
54566
|
lastOptions = {};
|
|
54287
|
-
localPresence = null;
|
|
54288
54567
|
/**
|
|
54289
54568
|
* Reentrancy token for {@link connect}: bumped by every connect() and
|
|
54290
54569
|
* disconnect(). A connect() whose token no longer matches after an await was
|
|
@@ -54294,11 +54573,12 @@ class CollaborationService {
|
|
|
54294
54573
|
*/
|
|
54295
54574
|
connectToken = 0;
|
|
54296
54575
|
refreshPresence = () => {
|
|
54297
|
-
|
|
54576
|
+
const s = this.session;
|
|
54577
|
+
if (!s) {
|
|
54298
54578
|
this.presence.set([]);
|
|
54299
54579
|
return;
|
|
54300
54580
|
}
|
|
54301
|
-
this.presence.set(derivePresenceList(
|
|
54581
|
+
this.presence.set(derivePresenceList(s.awareness.getStates(), s.selfId, this.canvasWidth, this.canvasHeight));
|
|
54302
54582
|
};
|
|
54303
54583
|
constructor() {
|
|
54304
54584
|
// Service destruction is not the only way a session ends: a tab close, a
|
|
@@ -54359,26 +54639,20 @@ class CollaborationService {
|
|
|
54359
54639
|
bundle.doc.destroy();
|
|
54360
54640
|
return;
|
|
54361
54641
|
}
|
|
54362
|
-
this.
|
|
54363
|
-
|
|
54364
|
-
|
|
54365
|
-
|
|
54366
|
-
|
|
54367
|
-
|
|
54368
|
-
|
|
54369
|
-
|
|
54370
|
-
|
|
54371
|
-
|
|
54372
|
-
|
|
54373
|
-
|
|
54642
|
+
this.session = activateSession(bundle, config, transport, {
|
|
54643
|
+
slideSync: this.slideSync,
|
|
54644
|
+
livePatcher: this.livePatcher,
|
|
54645
|
+
onRemoteSlides: this.onRemoteSlides,
|
|
54646
|
+
refreshPresence: this.refreshPresence,
|
|
54647
|
+
scheduleWriteBack: () => this.scheduleWriteBack(),
|
|
54648
|
+
setStatus: (status) => this.status.set(status),
|
|
54649
|
+
getStatus: () => this.status(),
|
|
54650
|
+
isActive: () => this.active(),
|
|
54651
|
+
failConnection: () => {
|
|
54652
|
+
this.disconnect();
|
|
54653
|
+
this.status.set('error');
|
|
54654
|
+
},
|
|
54374
54655
|
});
|
|
54375
|
-
this.localPresence.publish();
|
|
54376
|
-
this.awareness.on('change', this.refreshPresence);
|
|
54377
|
-
this.awareness.on('update', this.refreshPresence);
|
|
54378
|
-
this.wireStatus(transport);
|
|
54379
|
-
this.syncGate.reset();
|
|
54380
|
-
this.wireSynced();
|
|
54381
|
-
this.unobserveSlides = observeYDocSlides(this.ydoc, (_events, transaction) => this.onRemoteChange(transaction));
|
|
54382
54656
|
this.active.set(true);
|
|
54383
54657
|
this.refreshPresence();
|
|
54384
54658
|
}
|
|
@@ -54397,147 +54671,16 @@ class CollaborationService {
|
|
|
54397
54671
|
await this.connect(this.lastConfig, this.lastOptions);
|
|
54398
54672
|
}
|
|
54399
54673
|
}
|
|
54400
|
-
/** Wire the provider status events + (websocket-only) connection timeout. */
|
|
54401
|
-
wireStatus(transport) {
|
|
54402
|
-
const provider = this.provider;
|
|
54403
|
-
if (!provider) {
|
|
54404
|
-
return;
|
|
54405
|
-
}
|
|
54406
|
-
if (transport === 'webrtc') {
|
|
54407
|
-
// P2P: no server round-trip to wait on. Treat "created" as connected,
|
|
54408
|
-
// and reflect explicit disconnect events.
|
|
54409
|
-
this.status.set('connected');
|
|
54410
|
-
provider.on('status', (payload) => {
|
|
54411
|
-
if (payload.connected === false && this.active()) {
|
|
54412
|
-
this.status.set('disconnected');
|
|
54413
|
-
// Re-arm on (re)connect: without this, a peer that drops and
|
|
54414
|
-
// rejoins keeps the gate permanently open from the first
|
|
54415
|
-
// connection and can clobber the room with a stale local doc.
|
|
54416
|
-
this.syncGate.reset();
|
|
54417
|
-
this.syncGate.arm();
|
|
54418
|
-
}
|
|
54419
|
-
else if (payload.connected === true) {
|
|
54420
|
-
this.status.set('connected');
|
|
54421
|
-
}
|
|
54422
|
-
});
|
|
54423
|
-
return;
|
|
54424
|
-
}
|
|
54425
|
-
provider.on('status', (payload) => {
|
|
54426
|
-
if (payload.status === 'connected') {
|
|
54427
|
-
this.clearConnectTimer();
|
|
54428
|
-
this.status.set('connected');
|
|
54429
|
-
}
|
|
54430
|
-
else if (payload.status === 'disconnected' && this.active()) {
|
|
54431
|
-
this.status.set('disconnected');
|
|
54432
|
-
this.syncGate.reset();
|
|
54433
|
-
this.syncGate.arm();
|
|
54434
|
-
}
|
|
54435
|
-
});
|
|
54436
|
-
if (provider.wsconnected) {
|
|
54437
|
-
this.status.set('connected');
|
|
54438
|
-
return;
|
|
54439
|
-
}
|
|
54440
|
-
this.connectTimer = setTimeout(() => {
|
|
54441
|
-
this.connectTimer = null;
|
|
54442
|
-
if (this.status() !== 'connected') {
|
|
54443
|
-
this.disconnect();
|
|
54444
|
-
this.status.set('error');
|
|
54445
|
-
}
|
|
54446
|
-
}, CONNECTION_TIMEOUT_MS);
|
|
54447
|
-
}
|
|
54448
|
-
/**
|
|
54449
|
-
* Open the first-write gate on the provider's initial-sync confirmation.
|
|
54450
|
-
* y-websocket emits 'sync' with a boolean; y-webrtc emits 'synced' with an
|
|
54451
|
-
* object carrying a `synced` flag (and only once a peer syncs, hence the
|
|
54452
|
-
* grace timer). Listen to both; opening is idempotent.
|
|
54453
|
-
*/
|
|
54454
|
-
wireSynced() {
|
|
54455
|
-
const provider = this.provider;
|
|
54456
|
-
if (!provider) {
|
|
54457
|
-
return;
|
|
54458
|
-
}
|
|
54459
|
-
const handle = (payload) => {
|
|
54460
|
-
const flag = payload;
|
|
54461
|
-
const isSynced = typeof flag === 'boolean' ? flag : flag?.synced !== false;
|
|
54462
|
-
if (isSynced) {
|
|
54463
|
-
this.syncGate.open();
|
|
54464
|
-
}
|
|
54465
|
-
};
|
|
54466
|
-
provider.on('sync', handle);
|
|
54467
|
-
provider.on('synced', handle);
|
|
54468
|
-
if (provider.synced === true) {
|
|
54469
|
-
this.syncGate.open();
|
|
54470
|
-
}
|
|
54471
|
-
else {
|
|
54472
|
-
this.syncGate.arm();
|
|
54473
|
-
}
|
|
54474
|
-
}
|
|
54475
|
-
/**
|
|
54476
|
-
* Perform the deferred first broadcast once the gate opens. When the doc is
|
|
54477
|
-
* still empty (fresh room, or nobody else present), clear the baseline so
|
|
54478
|
-
* the pending deck actually seeds it; when remote content already arrived,
|
|
54479
|
-
* the pending deck matches the applied baseline and the write is a no-op.
|
|
54480
|
-
*/
|
|
54481
|
-
flushPendingBroadcast() {
|
|
54482
|
-
const pending = this.pendingBroadcast;
|
|
54483
|
-
this.pendingBroadcast = null;
|
|
54484
|
-
if (!pending || !this.ydoc || !this.yFactories) {
|
|
54485
|
-
return;
|
|
54486
|
-
}
|
|
54487
|
-
if (this.ydoc.getArray(YDOC_SLIDES_KEY).length === 0) {
|
|
54488
|
-
this.lastSynced = '';
|
|
54489
|
-
}
|
|
54490
|
-
this.broadcastSlides(pending);
|
|
54491
|
-
}
|
|
54492
|
-
/** Handle a remote Y.Doc change, skipping our own local-origin transactions. */
|
|
54493
|
-
onRemoteChange(transaction) {
|
|
54494
|
-
if (transaction?.origin === LOCAL_SYNC_ORIGIN || this.applyingRemote || !this.ydoc) {
|
|
54495
|
-
return;
|
|
54496
|
-
}
|
|
54497
|
-
const remote = readSlidesFromYDoc(this.ydoc);
|
|
54498
|
-
if (remote.length === 0) {
|
|
54499
|
-
return;
|
|
54500
|
-
}
|
|
54501
|
-
// Suppress the echo: record what we just applied so the subsequent local
|
|
54502
|
-
// broadcast (driven by the editor signal) is a no-op.
|
|
54503
|
-
this.lastSynced = JSON.stringify(remote);
|
|
54504
|
-
this.applyingRemote = true;
|
|
54505
|
-
this.onRemoteSlides?.(remote);
|
|
54506
|
-
this.applyingRemote = false;
|
|
54507
|
-
this.scheduleWriteBack();
|
|
54508
|
-
}
|
|
54509
54674
|
disconnect() {
|
|
54510
54675
|
// Invalidate any in-flight connect() so it discards its bundle on resume.
|
|
54511
54676
|
this.connectToken += 1;
|
|
54512
|
-
this.
|
|
54513
|
-
this.syncGate.reset();
|
|
54514
|
-
this.pendingBroadcast = null;
|
|
54677
|
+
this.slideSync.reset();
|
|
54515
54678
|
this.writeBack.cancel();
|
|
54516
|
-
this.
|
|
54517
|
-
|
|
54518
|
-
|
|
54519
|
-
|
|
54520
|
-
// Announce first: it is synchronous, so it still reaches same-browser
|
|
54521
|
-
// peers when this runs from a document that is being destroyed. The
|
|
54522
|
-
// provider's own awareness removal is broadcast a microtask later and
|
|
54523
|
-
// would be dropped, leaving us a ghost collaborator until the 30s
|
|
54524
|
-
// awareness timeout.
|
|
54525
|
-
this.departure?.announce();
|
|
54526
|
-
this.departure?.dispose();
|
|
54527
|
-
this.departure = null;
|
|
54528
|
-
clearLocalAwareness(this.awareness);
|
|
54529
|
-
this.provider?.disconnect();
|
|
54530
|
-
this.provider?.destroy();
|
|
54531
|
-
this.ydoc?.destroy();
|
|
54532
|
-
this.provider = null;
|
|
54533
|
-
this.ydoc = null;
|
|
54534
|
-
this.awareness = null;
|
|
54535
|
-
this.localPresence = null;
|
|
54536
|
-
this.selfId = -1;
|
|
54537
|
-
this.applyingRemote = false;
|
|
54538
|
-
this.yFactories = null;
|
|
54679
|
+
if (this.session) {
|
|
54680
|
+
teardownSession(this.session, this.refreshPresence);
|
|
54681
|
+
this.session = null;
|
|
54682
|
+
}
|
|
54539
54683
|
this.livePatcher.configure(null, null);
|
|
54540
|
-
this.lastSynced = '';
|
|
54541
54684
|
this.onRemoteSlides = null;
|
|
54542
54685
|
this.currentConfig = null;
|
|
54543
54686
|
this.status.set('disconnected');
|
|
@@ -54546,88 +54689,46 @@ class CollaborationService {
|
|
|
54546
54689
|
this.presence.set([]);
|
|
54547
54690
|
this.followedClientId.set(null);
|
|
54548
54691
|
}
|
|
54549
|
-
/**
|
|
54550
|
-
* Broadcast the local slide set to peers, reconciling only what changed into
|
|
54551
|
-
* the pptx:slides Y.Array. An empty deck is never written (so a late-joiner
|
|
54552
|
-
* that has not yet received the doc cannot clobber it), and an unchanged deck
|
|
54553
|
-
* is skipped.
|
|
54554
|
-
*/
|
|
54555
54692
|
/**
|
|
54556
54693
|
* Record the current local deck as the sync baseline so the first (unchanged)
|
|
54557
54694
|
* broadcast after connecting is suppressed. Call right after {@link connect}
|
|
54558
|
-
* for a joiner whose local deck is a placeholder awaiting remote sync
|
|
54559
|
-
* never overwrites the shared document before receiving it.
|
|
54695
|
+
* for a joiner whose local deck is a placeholder awaiting remote sync.
|
|
54560
54696
|
*/
|
|
54561
54697
|
seedBaseline(slides) {
|
|
54562
|
-
this.
|
|
54698
|
+
this.slideSync.seedBaseline(slides);
|
|
54563
54699
|
}
|
|
54564
54700
|
/**
|
|
54565
|
-
* Re-adopt the shared document's slides after a local content load
|
|
54566
|
-
*
|
|
54567
|
-
*
|
|
54568
|
-
* already applied (a late joiner's bootstrap deck parsing slower than the
|
|
54569
|
-
* doc sync) silently clobbers the synced state and, with the doc itself
|
|
54570
|
-
* unchanged, the remote observer never re-fires. When the room already has
|
|
54571
|
-
* slides they win: the doc content is re-applied through `onRemoteSlides`
|
|
54572
|
-
* and recorded as the sync baseline (bypassing the usual JSON dedupe) so
|
|
54573
|
-
* the follow-up local broadcast of the adopted deck is a no-op. An empty
|
|
54574
|
-
* room means this client is the seeder and the loaded deck stands, written
|
|
54575
|
-
* by the normal gated broadcast path. Returns true when the doc was adopted.
|
|
54701
|
+
* Re-adopt the shared document's slides after a local content load committed
|
|
54702
|
+
* a parsed deck to viewer state (see {@link SlideSyncEngine.adoptDocAfterLoad}).
|
|
54703
|
+
* Returns true when the room's slides were adopted over the loaded deck.
|
|
54576
54704
|
*/
|
|
54577
54705
|
adoptDocSlidesAfterLoad() {
|
|
54578
|
-
|
|
54579
|
-
return false;
|
|
54580
|
-
}
|
|
54581
|
-
const docSlides = readSlidesFromYDoc(this.ydoc);
|
|
54582
|
-
if (docSlides.length === 0) {
|
|
54583
|
-
return false;
|
|
54584
|
-
}
|
|
54585
|
-
this.lastSynced = JSON.stringify(docSlides);
|
|
54586
|
-
this.applyingRemote = true;
|
|
54587
|
-
this.onRemoteSlides?.(docSlides);
|
|
54588
|
-
this.applyingRemote = false;
|
|
54589
|
-
return true;
|
|
54706
|
+
return this.connected() ? this.slideSync.adoptDocAfterLoad() : false;
|
|
54590
54707
|
}
|
|
54708
|
+
/**
|
|
54709
|
+
* Broadcast the local slide set to peers, reconciling only what changed into
|
|
54710
|
+
* the pptx:slides Y.Array. Empty/unchanged decks are skipped; while the gate
|
|
54711
|
+
* is shut the deck is held pending until the initial sync confirms.
|
|
54712
|
+
*/
|
|
54591
54713
|
broadcastSlides(slides) {
|
|
54592
|
-
|
|
54593
|
-
return;
|
|
54594
|
-
}
|
|
54595
|
-
if (!this.syncGate.isOpen()) {
|
|
54596
|
-
// Defer until the initial sync confirms; the gate flushes the latest
|
|
54597
|
-
// pending deck when it opens.
|
|
54598
|
-
this.pendingBroadcast = slides;
|
|
54599
|
-
return;
|
|
54600
|
-
}
|
|
54601
|
-
const s = JSON.stringify(slides);
|
|
54602
|
-
if (s === this.lastSynced) {
|
|
54603
|
-
return;
|
|
54604
|
-
}
|
|
54605
|
-
this.lastSynced = s;
|
|
54606
|
-
reconcileSlidesInYDoc([...slides], this.ydoc, this.yFactories, LOCAL_SYNC_ORIGIN);
|
|
54607
|
-
this.scheduleWriteBack();
|
|
54714
|
+
this.slideSync.broadcast(slides);
|
|
54608
54715
|
}
|
|
54609
54716
|
setCursor(x, y, activeSlideIndex) {
|
|
54610
|
-
this.localPresence
|
|
54717
|
+
this.session?.localPresence.setCursor(x, y, activeSlideIndex);
|
|
54611
54718
|
}
|
|
54612
54719
|
setSelection(selectedElementId, activeSlideIndex) {
|
|
54613
|
-
this.localPresence
|
|
54720
|
+
this.session?.localPresence.setSelection(selectedElementId, activeSlideIndex);
|
|
54614
54721
|
}
|
|
54615
54722
|
/** Publish the local active-slide index (drives follow-along). */
|
|
54616
54723
|
setActiveSlide(index) {
|
|
54617
|
-
this.localPresence
|
|
54724
|
+
this.session?.localPresence.setActiveSlide(index);
|
|
54618
54725
|
}
|
|
54619
54726
|
/** Follow the given peer's active slide, or `null` to stop following. */
|
|
54620
54727
|
followUser(clientId) {
|
|
54621
54728
|
this.followedClientId.set(clientId);
|
|
54622
54729
|
}
|
|
54623
|
-
clearConnectTimer() {
|
|
54624
|
-
if (this.connectTimer !== null) {
|
|
54625
|
-
clearTimeout(this.connectTimer);
|
|
54626
|
-
this.connectTimer = null;
|
|
54627
|
-
}
|
|
54628
|
-
}
|
|
54629
54730
|
scheduleWriteBack() {
|
|
54630
|
-
this.writeBack.schedule(this.currentConfig, this.ydoc, this.getSourceBytes, this.getTemplateElements);
|
|
54731
|
+
this.writeBack.schedule(this.currentConfig, this.session?.ydoc ?? null, this.getSourceBytes, this.getTemplateElements);
|
|
54631
54732
|
}
|
|
54632
54733
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: CollaborationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
54633
54734
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: CollaborationService });
|
|
@@ -83739,7 +83840,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
83739
83840
|
}], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
|
|
83740
83841
|
|
|
83741
83842
|
// Generated by scripts/inline-shared.mjs from package.json. Do not edit.
|
|
83742
|
-
const PPTX_ANGULAR_VIEWER_VERSION = "2.0
|
|
83843
|
+
const PPTX_ANGULAR_VIEWER_VERSION = "2.1.0";
|
|
83743
83844
|
|
|
83744
83845
|
/**
|
|
83745
83846
|
* account-page.component.ts: File > Account content.
|
|
@@ -112553,4 +112654,4 @@ function cn(...values) {
|
|
|
112553
112654
|
*/
|
|
112554
112655
|
|
|
112555
112656
|
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, numFromEvent as h$, hasCopyableFormat as h0, hasExistingLink as h1, hasExitedFullscreen as h2, hasGradientFill as h3, hasPressureVariation as h4, headerLabel as h5, inkViewBox as h6, insertColumn as h7, insertRow as h8, interpolateWidth as h9, mergeRight as hA, mergeSelection as hB, moveElementBy as hC, moveNodeDown as hD, moveNodeUp as hE, msToFrameDelayCs as hF, narrowToCircle as hG, narrowToPolygon as hH, narrowToRect as hI, newChartElement as hJ, newEquationElement as hK, newPresetShapeElement as hL, newShapeElement as hM, newSmartArtElement as hN, newTableElement as hO, newTextElement as hP, nextVisibleIndex as hQ, nodeBold as hR, nodeEditBox as hS, nodeFillColor as hT, nodeFontColor as hU, nodeIdFromKey as hV, nodeItalic as hW, nodeStyle as hX, normalizeFontFormat as hY, normalizeSlidesPerPage as hZ, normalizeValue as h_, isAudienceTab as ha, isBold as hb, isBrowserOpenableMime as hc, isChildNode as hd, isElementInteractive as he, isInjectableUrl as hf, isItalic as hg, isPpactionUrl as hh, isPresenterMessage as hi, isSigned as hj, isTextElement as hk, isTwoTableFocus as hl, isUnderline as hm, isUrlSafe as hn, isValidRoomId as ho, isViewportBackgroundPressTarget as hp, isZoomActivationKey as hq, issueTrackKey as hr, issueTypeLabel as hs, keyToLabel as ht, latexToMathml as hu, linePointsToSvgString as hv, lineSpacingPatch as hw, loadAudienceContent as hx, mergeCaptionResults as hy, mergeDown as hz, AiChangeOverlayComponent as i, routeOrthogonalConnector as i$, ommlToMathml as i0, ooxmlDashToCssBorderStyle as i1, openNativeEyeDropper as i2, overallStatus as i3, paletteColor as i4, parseAudienceNonce as i5, parseNodeTextarea as i6, partitionSlides as i7, patchChartData as i8, patchChartStyle as i9, removeElementAnimation as iA, removeGradientStopPatch as iB, removeNode as iC, removeRow as iD, removeSeries as iE, renderToCanvas as iF, reorderAnimationDown as iG, reorderAnimationUp as iH, replaceInSlides as iI, replaceMatch as iJ, requestPresentationFullscreen as iK, resizeElement as iL, resolveCaptionTracks as iM, resolveChartKind as iN, resolveFontVariant as iO, resolveHyperlinkHref as iP, resolveInteractiveElementId as iQ, resolveMediaSrc as iR, resolveOleType as iS, resolveParagraphBullet as iT, resolvePresenterNotes as iU, resolveProfileInitial as iV, resolveRegionCode as iW, resolvePalette as iX, resolveThemeCatalogEntry as iY, resolveTransitionDuration as iZ, revealedElementStyles as i_, patchTableData as ia, patchTextStyle as ib, pendingElementStyles as ic, pickColorByClickFallback as id, pickSupportedMimeType as ie, planGifFrames as ig, planVideoSegments as ih, pointsToSvgPathD as ii, presenceToCursors as ij, presetByLayout as ik, presetsForCategory as il, pressuresToWidths as im, prevVisibleIndex as io, projectDrawingShapes as ip, promoteNode as iq, provideViewerTheme as ir, radarAngle as is, radarRingPoints as it, recordWebm as iu, redistributeColumnWidth as iv, removeAnimation as iw, removeCategory as ix, removeColumn as iy, removeCommentFromList as iz, AiChatPanelComponent as j, signatureKey as j$, rowStyle as j0, sampleColorFromSlide as j1, sanitizeColor as j2, sanitizeSlideIndex as j3, sanitizeUserName as j4, saveViewerProfile as j5, scanAvailableFonts as j6, searchSlides as j7, seedBroadcastFields as j8, seedHyperlinkDraft as j9, setGridlineStyle as jA, setLayout as jB, setLegend as jC, setNodeStyle as jD, setNodeText as jE, setRepeatCount as jF, setRepeatMode as jG, setSequence as jH, setSeriesChartType as jI, setSeriesColor as jJ, setSeriesErrorBars as jK, setSeriesMarker as jL, setSeriesName as jM, setSeriesTrendline as jN, setSeriesValue as jO, setStyle as jP, setTimingCurve as jQ, setTitle as jR, setTrigger as jS, setTriggerShapeId as jT, shapeStylePatch as jU, sheetAfterNavigate as jV, shouldBlockClickAdvance as jW, shouldUseSvgWarp as jX, showDirectionPicker as jY, showsTemplateAffordance as jZ, signatureCountLabel as j_, seedPropertiesDraft as ja, seedShareFields as jb, segmentFrameCount as jc, selectValue$2 as jd, sendBackward as je, sendToBack as jf, sequentialColorScale as jg, serializeWriteBack as jh, seriesColor as ji, setAnimationEmphasis as jj, setAnimationEntrance as jk, setAnimationExit as jl, setAxis as jm, setAxisLogScale as jn, setAxisTitleStyle as jo, setCategoryLabel as jp, setCellText as jq, setColorScheme as jr, setDataLabels as js, setDataPointExplosion as jt, setDataPointFill as ju, setDataPointLabel as jv, setDelay as jw, setDirection as jx, setDuration as jy, setElementPosition as jz, AiChatService as k, signatureTimestamp as k0, signerName as k1, statusLabel as k2, slideNumberOf as k3, smartArtNodes as k4, paletteColour as k5, snapToGridStep as k6, splitCursorCell as k7, splitMergedCell as k8, statusKind as k9, updateGlowPatch as kA, updateGradientStopPatch as kB, updateInnerShadowPatch as kC, updateOuterShadowPatch as kD, updateReflectionPatch as kE, vAlignPatch as kF, validatePassword as kG, validatePrintSettings as kH, validateRoomId as kI, valueToY as kJ, vermilionDarkColors as kK, vermilionDarkTheme as kL, vermilionLightColors as kM, vermilionLightTheme as kN, vermilionRadius as kO, waypointsToPathD as kP, worstStatus as kQ, zoomTargetSlideIndex as kR, statusLabel$1 as ka, storeAudienceContent as kb, stringFromEvent$5 as kc, strokeColorOf as kd, strokeToInkElement as ke, styleShadowFilter as kf, textAdvancedPatch as kg, textAdvancedStateFromStyle as kh, textAdvancedStateOf as ki, textColorOf as kj, textDirectionPatch as kk, textStyleOf as kl, textStylePatch as km, themeStyle as kn, themeToCssVars as ko, thumbnailHeight as kp, thumbnailZoom as kq, toggleCommentResolvedInList as kr, toggleNodeBold as ks, toggleNodeItalic as kt, toggleSheet as ku, topLevelNodeCount as kv, transformSelectedTextCase as kw, translationsEn as kx, ungroupElements as ky, updateElementById 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 };
|
|
112556
|
-
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-
|
|
112657
|
+
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-BwaiF7Nf.mjs.map
|