pptx-react-viewer 3.4.0 → 3.4.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 +35 -0
- package/dist/{AiChatPanel-NQZBZIRM.mjs → AiChatPanel-AIM55U76.mjs} +3 -3
- package/dist/AiChatPanel-AIM55U76.mjs.br +0 -0
- package/dist/AiChatPanel-AIM55U76.mjs.gz +0 -0
- package/dist/{AiChatPanel-3Q4STA5E.js → AiChatPanel-Q2ZVO4RR.js} +24 -24
- package/dist/AiChatPanel-Q2ZVO4RR.js.br +0 -0
- package/dist/AiChatPanel-Q2ZVO4RR.js.gz +0 -0
- package/dist/{Area3DChartScene-7PARQDOZ.mjs → Area3DChartScene-DNLGOR5F.mjs} +1 -1
- package/dist/Area3DChartScene-DNLGOR5F.mjs.br +0 -0
- package/dist/Area3DChartScene-DNLGOR5F.mjs.gz +0 -0
- package/dist/{Area3DChartScene-THLG74CM.js → Area3DChartScene-W5HVINQ6.js} +2 -2
- package/dist/Area3DChartScene-W5HVINQ6.js.br +0 -0
- package/dist/Area3DChartScene-W5HVINQ6.js.gz +0 -0
- package/dist/{Bar3DChartScene-OLZ2V56I.js → Bar3DChartScene-SOO62TCP.js} +2 -2
- package/dist/Bar3DChartScene-SOO62TCP.js.br +0 -0
- package/dist/Bar3DChartScene-SOO62TCP.js.gz +0 -0
- package/dist/{Bar3DChartScene-QUU6RUXM.mjs → Bar3DChartScene-VYKQAY6X.mjs} +1 -1
- package/dist/Bar3DChartScene-VYKQAY6X.mjs.br +0 -0
- package/dist/Bar3DChartScene-VYKQAY6X.mjs.gz +0 -0
- package/dist/{Line3DChartScene-2VZS52IB.js → Line3DChartScene-BAP3YA3R.js} +2 -2
- package/dist/Line3DChartScene-BAP3YA3R.js.br +0 -0
- package/dist/Line3DChartScene-BAP3YA3R.js.gz +0 -0
- package/dist/{Line3DChartScene-D77ORA4K.mjs → Line3DChartScene-ZVELPNOD.mjs} +1 -1
- package/dist/Line3DChartScene-ZVELPNOD.mjs.br +0 -0
- package/dist/Line3DChartScene-ZVELPNOD.mjs.gz +0 -0
- package/dist/{Model3DScene-3WCALTXO.js → Model3DScene-BWNVCCAZ.js} +2 -2
- package/dist/Model3DScene-BWNVCCAZ.js.br +0 -0
- package/dist/Model3DScene-BWNVCCAZ.js.gz +0 -0
- package/dist/{Model3DScene-ZEGWNILH.mjs → Model3DScene-ZJWU5IUY.mjs} +1 -1
- package/dist/Model3DScene-ZJWU5IUY.mjs.br +0 -0
- package/dist/Model3DScene-ZJWU5IUY.mjs.gz +0 -0
- package/dist/{PieChart3DScene-7C3ACGKN.js → PieChart3DScene-2DJE4BM3.js} +2 -2
- package/dist/PieChart3DScene-2DJE4BM3.js.br +0 -0
- package/dist/PieChart3DScene-2DJE4BM3.js.gz +0 -0
- package/dist/{PieChart3DScene-DGD4PZVV.mjs → PieChart3DScene-NNLKJ6LN.mjs} +1 -1
- package/dist/PieChart3DScene-NNLKJ6LN.mjs.br +0 -0
- package/dist/PieChart3DScene-NNLKJ6LN.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-QGH3OLJV.mjs → SurfaceChart3DScene-NWB4QAOI.mjs} +1 -1
- package/dist/SurfaceChart3DScene-NWB4QAOI.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-NWB4QAOI.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-SJPQGGGE.js → SurfaceChart3DScene-WRSCQKJV.js} +2 -2
- package/dist/SurfaceChart3DScene-WRSCQKJV.js.br +0 -0
- package/dist/SurfaceChart3DScene-WRSCQKJV.js.gz +0 -0
- package/dist/{chunk-SFMATKNJ.mjs → chunk-4YGGPPJZ.mjs} +1 -1
- package/dist/chunk-4YGGPPJZ.mjs.br +0 -0
- package/dist/chunk-4YGGPPJZ.mjs.gz +0 -0
- package/dist/{chunk-L5MRKDRM.mjs → chunk-EM3D67TB.mjs} +45 -13
- package/dist/chunk-EM3D67TB.mjs.br +0 -0
- package/dist/chunk-EM3D67TB.mjs.gz +0 -0
- package/dist/{chunk-XBTHWXNO.js → chunk-GKRE7272.js} +160 -160
- package/dist/chunk-GKRE7272.js.br +0 -0
- package/dist/chunk-GKRE7272.js.gz +0 -0
- package/dist/{chunk-C4WTQIC6.mjs → chunk-IJLTDBXT.mjs} +1 -1
- package/dist/chunk-IJLTDBXT.mjs.br +0 -0
- package/dist/{chunk-C4WTQIC6.mjs.gz → chunk-IJLTDBXT.mjs.gz} +0 -0
- package/dist/{chunk-B7WAGQW4.mjs → chunk-PADP3NUM.mjs} +101 -22
- package/dist/chunk-PADP3NUM.mjs.br +0 -0
- package/dist/{chunk-B7WAGQW4.mjs.gz → chunk-PADP3NUM.mjs.gz} +0 -0
- package/dist/{chunk-KY6JQJXK.js → chunk-PDVJNNWP.js} +5 -5
- package/dist/chunk-PDVJNNWP.js.br +0 -0
- package/dist/chunk-PDVJNNWP.js.gz +0 -0
- package/dist/{chunk-MSUUPLQ7.mjs → chunk-QEAU2XTI.mjs} +2 -2
- package/dist/chunk-QEAU2XTI.mjs.br +0 -0
- package/dist/chunk-QEAU2XTI.mjs.gz +0 -0
- package/dist/{chunk-PCW2KT7Z.js → chunk-SEJEVNXW.js} +101 -22
- package/dist/chunk-SEJEVNXW.js.br +0 -0
- package/dist/{chunk-PCW2KT7Z.js.gz → chunk-SEJEVNXW.js.gz} +0 -0
- package/dist/{chunk-7E6SM42A.js → chunk-WXQQ43IA.js} +1199 -1167
- package/dist/chunk-WXQQ43IA.js.br +0 -0
- package/dist/chunk-WXQQ43IA.js.gz +0 -0
- package/dist/{chunk-TJNG5VEK.js → chunk-Y2B5EZEV.js} +426 -426
- package/dist/chunk-Y2B5EZEV.js.br +0 -0
- package/dist/chunk-Y2B5EZEV.js.gz +0 -0
- package/dist/index.js +45 -45
- package/dist/index.js.br +0 -0
- package/dist/index.js.gz +0 -0
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.br +0 -0
- package/dist/index.mjs.gz +0 -0
- package/dist/internals.js +78 -78
- package/dist/internals.js.br +0 -0
- package/dist/internals.js.gz +0 -0
- package/dist/internals.mjs +3 -3
- package/dist/internals.mjs.br +0 -0
- package/dist/internals.mjs.gz +0 -0
- package/dist/viewer/index.js +26 -26
- package/dist/viewer/index.js.br +0 -0
- package/dist/viewer/index.js.gz +0 -0
- package/dist/viewer/index.mjs +5 -5
- package/dist/viewer/index.mjs.br +0 -0
- package/dist/viewer/index.mjs.gz +0 -0
- package/package.json +1 -1
- package/dist/AiChatPanel-3Q4STA5E.js.br +0 -0
- package/dist/AiChatPanel-3Q4STA5E.js.gz +0 -0
- package/dist/AiChatPanel-NQZBZIRM.mjs.br +0 -0
- package/dist/AiChatPanel-NQZBZIRM.mjs.gz +0 -0
- package/dist/Area3DChartScene-7PARQDOZ.mjs.br +0 -3
- package/dist/Area3DChartScene-7PARQDOZ.mjs.gz +0 -0
- package/dist/Area3DChartScene-THLG74CM.js.br +0 -0
- package/dist/Area3DChartScene-THLG74CM.js.gz +0 -0
- package/dist/Bar3DChartScene-OLZ2V56I.js.br +0 -2
- package/dist/Bar3DChartScene-OLZ2V56I.js.gz +0 -0
- package/dist/Bar3DChartScene-QUU6RUXM.mjs.br +0 -0
- package/dist/Bar3DChartScene-QUU6RUXM.mjs.gz +0 -0
- package/dist/Line3DChartScene-2VZS52IB.js.br +0 -0
- package/dist/Line3DChartScene-2VZS52IB.js.gz +0 -0
- package/dist/Line3DChartScene-D77ORA4K.mjs.br +0 -3
- package/dist/Line3DChartScene-D77ORA4K.mjs.gz +0 -0
- package/dist/Model3DScene-3WCALTXO.js.br +0 -0
- package/dist/Model3DScene-3WCALTXO.js.gz +0 -0
- package/dist/Model3DScene-ZEGWNILH.mjs.br +0 -0
- package/dist/Model3DScene-ZEGWNILH.mjs.gz +0 -0
- package/dist/PieChart3DScene-7C3ACGKN.js.br +0 -0
- package/dist/PieChart3DScene-7C3ACGKN.js.gz +0 -0
- package/dist/PieChart3DScene-DGD4PZVV.mjs.br +0 -0
- package/dist/PieChart3DScene-DGD4PZVV.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-QGH3OLJV.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-QGH3OLJV.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-SJPQGGGE.js.br +0 -0
- package/dist/SurfaceChart3DScene-SJPQGGGE.js.gz +0 -0
- package/dist/chunk-7E6SM42A.js.br +0 -0
- package/dist/chunk-7E6SM42A.js.gz +0 -0
- package/dist/chunk-B7WAGQW4.mjs.br +0 -0
- package/dist/chunk-C4WTQIC6.mjs.br +0 -0
- package/dist/chunk-KY6JQJXK.js.br +0 -0
- package/dist/chunk-KY6JQJXK.js.gz +0 -0
- package/dist/chunk-L5MRKDRM.mjs.br +0 -0
- package/dist/chunk-L5MRKDRM.mjs.gz +0 -0
- package/dist/chunk-MSUUPLQ7.mjs.br +0 -0
- package/dist/chunk-MSUUPLQ7.mjs.gz +0 -0
- package/dist/chunk-PCW2KT7Z.js.br +0 -0
- package/dist/chunk-SFMATKNJ.mjs.br +0 -0
- package/dist/chunk-SFMATKNJ.mjs.gz +0 -0
- package/dist/chunk-TJNG5VEK.js.br +0 -0
- package/dist/chunk-TJNG5VEK.js.gz +0 -0
- package/dist/chunk-XBTHWXNO.js.br +0 -0
- package/dist/chunk-XBTHWXNO.js.gz +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkGKRE7272_js = require('./chunk-GKRE7272.js');
|
|
4
|
+
var chunkSEJEVNXW_js = require('./chunk-SEJEVNXW.js');
|
|
5
5
|
var chunkUNIJUD5C_js = require('./chunk-UNIJUD5C.js');
|
|
6
6
|
var react = require('react');
|
|
7
7
|
var reactI18next = require('react-i18next');
|
|
@@ -9,7 +9,7 @@ var reactI18next = require('react-i18next');
|
|
|
9
9
|
function useVirtualizedSlides({
|
|
10
10
|
totalItems,
|
|
11
11
|
itemHeight,
|
|
12
|
-
overscan =
|
|
12
|
+
overscan = chunkSEJEVNXW_js.DEFAULT_VIRTUAL_OVERSCAN
|
|
13
13
|
}) {
|
|
14
14
|
const scrollContainerRef = react.useRef(null);
|
|
15
15
|
const [scrollTop, setScrollTop] = react.useState(0);
|
|
@@ -39,7 +39,7 @@ function useVirtualizedSlides({
|
|
|
39
39
|
resizeObserver?.disconnect();
|
|
40
40
|
};
|
|
41
41
|
}, []);
|
|
42
|
-
const range =
|
|
42
|
+
const range = chunkSEJEVNXW_js.computeVirtualRange(totalItems, itemHeight, scrollTop, viewportHeight, overscan);
|
|
43
43
|
const safeItemHeight = Math.max(itemHeight, 1);
|
|
44
44
|
const scrollToIndex = react.useCallback(
|
|
45
45
|
(index, behavior = "smooth") => {
|
|
@@ -80,7 +80,7 @@ function usePresenceTracking({
|
|
|
80
80
|
}) {
|
|
81
81
|
const [remoteUsers, setRemoteUsers] = react.useState([]);
|
|
82
82
|
const projectorRef = react.useRef(null);
|
|
83
|
-
projectorRef.current ??=
|
|
83
|
+
projectorRef.current ??= chunkSEJEVNXW_js.createPresenceProjector();
|
|
84
84
|
const projector = projectorRef.current;
|
|
85
85
|
const lastBroadcastRef = react.useRef(0);
|
|
86
86
|
const pendingBroadcastRef = react.useRef(null);
|
|
@@ -105,7 +105,7 @@ function usePresenceTracking({
|
|
|
105
105
|
awareness.setLocalStateField("presence", state);
|
|
106
106
|
lastBroadcastRef.current = Date.now();
|
|
107
107
|
};
|
|
108
|
-
if (elapsed >=
|
|
108
|
+
if (elapsed >= chunkSEJEVNXW_js.BROADCAST_THROTTLE_MS) {
|
|
109
109
|
if (pendingBroadcastRef.current) {
|
|
110
110
|
clearTimeout(pendingBroadcastRef.current);
|
|
111
111
|
pendingBroadcastRef.current = null;
|
|
@@ -115,7 +115,7 @@ function usePresenceTracking({
|
|
|
115
115
|
pendingBroadcastRef.current = setTimeout(() => {
|
|
116
116
|
pendingBroadcastRef.current = null;
|
|
117
117
|
flush();
|
|
118
|
-
},
|
|
118
|
+
}, chunkSEJEVNXW_js.BROADCAST_THROTTLE_MS - elapsed);
|
|
119
119
|
}
|
|
120
120
|
},
|
|
121
121
|
[awareness, userName, userColor, userAvatar, role]
|
|
@@ -195,7 +195,7 @@ function useYjsProvider({ config }) {
|
|
|
195
195
|
const departureRef = react.useRef(null);
|
|
196
196
|
const gateRef = react.useRef(null);
|
|
197
197
|
if (!gateRef.current) {
|
|
198
|
-
gateRef.current =
|
|
198
|
+
gateRef.current = chunkSEJEVNXW_js.createSyncGate(() => setSynced(true));
|
|
199
199
|
}
|
|
200
200
|
const teardown = react.useCallback(() => {
|
|
201
201
|
if (timeoutRef.current) {
|
|
@@ -215,7 +215,7 @@ function useYjsProvider({ config }) {
|
|
|
215
215
|
const buildCleanup = react.useCallback(
|
|
216
216
|
(provider, yDoc) => () => {
|
|
217
217
|
announceDeparture();
|
|
218
|
-
|
|
218
|
+
chunkSEJEVNXW_js.clearLocalAwareness(provider.awareness);
|
|
219
219
|
provider.destroy();
|
|
220
220
|
yDoc.destroy();
|
|
221
221
|
setDoc(null);
|
|
@@ -240,9 +240,9 @@ function useYjsProvider({ config }) {
|
|
|
240
240
|
if (config.authToken) {
|
|
241
241
|
opts.password = config.authToken;
|
|
242
242
|
}
|
|
243
|
-
const roomId =
|
|
243
|
+
const roomId = chunkSEJEVNXW_js.validateRoomId(config.roomId);
|
|
244
244
|
const provider = new WebrtcProvider(roomId, yDoc, opts);
|
|
245
|
-
departureRef.current =
|
|
245
|
+
departureRef.current = chunkSEJEVNXW_js.createDepartureChannel(roomId, provider.awareness);
|
|
246
246
|
setDoc(yDoc);
|
|
247
247
|
setAwareness(provider.awareness);
|
|
248
248
|
setClientId(provider.awareness.clientID);
|
|
@@ -284,13 +284,13 @@ function useYjsProvider({ config }) {
|
|
|
284
284
|
if (!config) {
|
|
285
285
|
return;
|
|
286
286
|
}
|
|
287
|
-
const roomId =
|
|
288
|
-
const transport = config.transport ??
|
|
287
|
+
const roomId = chunkSEJEVNXW_js.validateRoomId(config.roomId);
|
|
288
|
+
const transport = config.transport ?? chunkSEJEVNXW_js.resolveTransportForServerUrl(config.serverUrl);
|
|
289
289
|
if (transport === "webrtc") {
|
|
290
290
|
await initWebrtc();
|
|
291
291
|
return;
|
|
292
292
|
}
|
|
293
|
-
if (
|
|
293
|
+
if (chunkSEJEVNXW_js.isMixedContentBlocked(config.serverUrl)) {
|
|
294
294
|
console.warn(
|
|
295
295
|
`[pptx-viewer] Refusing to connect: insecure ws:// server "${config.serverUrl}" is blocked from a secure (https) page. Use a wss:// URL.`
|
|
296
296
|
);
|
|
@@ -304,7 +304,7 @@ function useYjsProvider({ config }) {
|
|
|
304
304
|
const provider = new WebsocketProvider(config.serverUrl, roomId, yDoc, {
|
|
305
305
|
params: config.authToken ? { token: config.authToken } : void 0
|
|
306
306
|
});
|
|
307
|
-
departureRef.current =
|
|
307
|
+
departureRef.current = chunkSEJEVNXW_js.createDepartureChannel(roomId, provider.awareness);
|
|
308
308
|
let connected = false;
|
|
309
309
|
const handleStatus = (event) => {
|
|
310
310
|
if (event.status === "connected") {
|
|
@@ -344,7 +344,7 @@ function useYjsProvider({ config }) {
|
|
|
344
344
|
provider.off("status", handleStatus);
|
|
345
345
|
provider.off("sync", handleSynced);
|
|
346
346
|
announceDeparture();
|
|
347
|
-
|
|
347
|
+
chunkSEJEVNXW_js.clearLocalAwareness(provider.awareness);
|
|
348
348
|
provider.destroy();
|
|
349
349
|
yDoc.destroy();
|
|
350
350
|
setDoc(null);
|
|
@@ -353,7 +353,7 @@ function useYjsProvider({ config }) {
|
|
|
353
353
|
cleanupRef.current = null;
|
|
354
354
|
setStatus("error");
|
|
355
355
|
}
|
|
356
|
-
},
|
|
356
|
+
}, chunkSEJEVNXW_js.CONNECTION_TIMEOUT_MS);
|
|
357
357
|
}
|
|
358
358
|
setDoc(yDoc);
|
|
359
359
|
setAwareness(provider.awareness);
|
|
@@ -362,7 +362,7 @@ function useYjsProvider({ config }) {
|
|
|
362
362
|
provider.off("status", handleStatus);
|
|
363
363
|
provider.off("sync", handleSynced);
|
|
364
364
|
announceDeparture();
|
|
365
|
-
|
|
365
|
+
chunkSEJEVNXW_js.clearLocalAwareness(provider.awareness);
|
|
366
366
|
provider.destroy();
|
|
367
367
|
yDoc.destroy();
|
|
368
368
|
setDoc(null);
|
|
@@ -388,7 +388,7 @@ function useYjsProvider({ config }) {
|
|
|
388
388
|
]);
|
|
389
389
|
react.useEffect(() => {
|
|
390
390
|
init();
|
|
391
|
-
const disposeTeardown =
|
|
391
|
+
const disposeTeardown = chunkSEJEVNXW_js.registerCollaborationTeardown({
|
|
392
392
|
leave: teardown,
|
|
393
393
|
rejoin: init
|
|
394
394
|
});
|
|
@@ -409,7 +409,7 @@ function useCollaborativeState({
|
|
|
409
409
|
canvasWidth,
|
|
410
410
|
canvasHeight
|
|
411
411
|
}) {
|
|
412
|
-
const userColor =
|
|
412
|
+
const userColor = chunkSEJEVNXW_js.sanitizeColor(config?.userColor, "#6366f1");
|
|
413
413
|
const { status, awareness, doc, clientId, synced, retry } = useYjsProvider({ config });
|
|
414
414
|
const { remoteUsers, broadcastPresence } = usePresenceTracking({
|
|
415
415
|
awareness,
|
|
@@ -527,8 +527,8 @@ function useEditorHistory(input) {
|
|
|
527
527
|
width: canvasSize.width,
|
|
528
528
|
height: canvasSize.height,
|
|
529
529
|
activeSlideIndex,
|
|
530
|
-
slides: slides.map(
|
|
531
|
-
templateElementsBySlideId:
|
|
530
|
+
slides: slides.map(chunkSEJEVNXW_js.cloneSlide),
|
|
531
|
+
templateElementsBySlideId: chunkSEJEVNXW_js.cloneTemplateElementsBySlideId(templateElementsBySlideId),
|
|
532
532
|
...actionLabel ? { actionLabel } : {}
|
|
533
533
|
};
|
|
534
534
|
},
|
|
@@ -541,9 +541,9 @@ function useEditorHistory(input) {
|
|
|
541
541
|
width: snapshot.width,
|
|
542
542
|
height: snapshot.height
|
|
543
543
|
});
|
|
544
|
-
setSlides(snapshot.slides.map(
|
|
544
|
+
setSlides(snapshot.slides.map(chunkSEJEVNXW_js.cloneSlide));
|
|
545
545
|
setTemplateElementsBySlideId(
|
|
546
|
-
|
|
546
|
+
chunkSEJEVNXW_js.cloneTemplateElementsBySlideId(snapshot.templateElementsBySlideId)
|
|
547
547
|
);
|
|
548
548
|
setActiveSlideIndex(Math.min(snapshot.activeSlideIndex, maxSlideIndex));
|
|
549
549
|
setSelectedElementIds([]);
|
|
@@ -582,8 +582,8 @@ function useEditorHistory(input) {
|
|
|
582
582
|
const currentSnapshot = buildHistorySnapshot();
|
|
583
583
|
historyFutureRef.current.push(currentSnapshot);
|
|
584
584
|
isApplyingHistoryRef.current = true;
|
|
585
|
-
const nextSnapshot =
|
|
586
|
-
lastHistorySnapshotRef.current =
|
|
585
|
+
const nextSnapshot = chunkGKRE7272_js.cloneHistorySnapshot(previousSnapshot);
|
|
586
|
+
lastHistorySnapshotRef.current = chunkGKRE7272_js.cloneHistorySnapshot(nextSnapshot);
|
|
587
587
|
lastHistorySerializedRef.current = serializeDocument(nextSnapshot);
|
|
588
588
|
applyHistorySnapshot(nextSnapshot);
|
|
589
589
|
updateHistoryAvailability();
|
|
@@ -604,8 +604,8 @@ function useEditorHistory(input) {
|
|
|
604
604
|
const currentSnapshot = buildHistorySnapshot();
|
|
605
605
|
historyPastRef.current.push(currentSnapshot);
|
|
606
606
|
isApplyingHistoryRef.current = true;
|
|
607
|
-
const targetSnapshot =
|
|
608
|
-
lastHistorySnapshotRef.current =
|
|
607
|
+
const targetSnapshot = chunkGKRE7272_js.cloneHistorySnapshot(nextSnapshot);
|
|
608
|
+
lastHistorySnapshotRef.current = chunkGKRE7272_js.cloneHistorySnapshot(targetSnapshot);
|
|
609
609
|
lastHistorySerializedRef.current = serializeDocument(targetSnapshot);
|
|
610
610
|
applyHistorySnapshot(targetSnapshot);
|
|
611
611
|
updateHistoryAvailability();
|
|
@@ -623,7 +623,7 @@ function useEditorHistory(input) {
|
|
|
623
623
|
historyPastRef.current = [];
|
|
624
624
|
historyFutureRef.current = [];
|
|
625
625
|
if (initialSnapshot) {
|
|
626
|
-
const clonedInitial =
|
|
626
|
+
const clonedInitial = chunkGKRE7272_js.cloneHistorySnapshot(initialSnapshot);
|
|
627
627
|
lastHistorySnapshotRef.current = clonedInitial;
|
|
628
628
|
lastHistorySerializedRef.current = serializeDocument(clonedInitial);
|
|
629
629
|
} else {
|
|
@@ -671,19 +671,19 @@ function useEditorHistory(input) {
|
|
|
671
671
|
}
|
|
672
672
|
const previousSnapshot = lastHistorySnapshotRef.current;
|
|
673
673
|
if (!previousSnapshot) {
|
|
674
|
-
lastHistorySnapshotRef.current =
|
|
674
|
+
lastHistorySnapshotRef.current = chunkGKRE7272_js.cloneHistorySnapshot(snapshot);
|
|
675
675
|
lastHistorySerializedRef.current = serialized;
|
|
676
676
|
lastCheapHashRef.current = cheapHash;
|
|
677
677
|
updateHistoryAvailability();
|
|
678
678
|
return;
|
|
679
679
|
}
|
|
680
680
|
onDirtyRef.current?.();
|
|
681
|
-
historyPastRef.current.push(
|
|
681
|
+
historyPastRef.current.push(chunkGKRE7272_js.cloneHistorySnapshot(previousSnapshot));
|
|
682
682
|
while (historyPastRef.current.length > Math.max(1, maxHistoryEntries)) {
|
|
683
683
|
historyPastRef.current.shift();
|
|
684
684
|
}
|
|
685
685
|
historyFutureRef.current = [];
|
|
686
|
-
lastHistorySnapshotRef.current =
|
|
686
|
+
lastHistorySnapshotRef.current = chunkGKRE7272_js.cloneHistorySnapshot(snapshot);
|
|
687
687
|
lastHistorySerializedRef.current = serialized;
|
|
688
688
|
lastCheapHashRef.current = cheapHash;
|
|
689
689
|
updateHistoryAvailability();
|
|
@@ -743,9 +743,9 @@ function useZoomViewport({
|
|
|
743
743
|
const canvasStageRef = react.useRef(null);
|
|
744
744
|
const canvasViewportRef = react.useRef(null);
|
|
745
745
|
const renderScaleRef = react.useRef(1);
|
|
746
|
-
const wheelBufferRef = react.useRef(
|
|
746
|
+
const wheelBufferRef = react.useRef(chunkSEJEVNXW_js.createWheelStepBuffer());
|
|
747
747
|
const storeRef = react.useRef(null);
|
|
748
|
-
storeRef.current ??=
|
|
748
|
+
storeRef.current ??= chunkSEJEVNXW_js.createViewerZoomStore();
|
|
749
749
|
const store = storeRef.current;
|
|
750
750
|
const scale = useViewerStore(store, selectZoom);
|
|
751
751
|
const setScale = react.useCallback(
|
|
@@ -806,7 +806,7 @@ function useZoomViewport({
|
|
|
806
806
|
if (!wrapper || !canvasViewport) {
|
|
807
807
|
return;
|
|
808
808
|
}
|
|
809
|
-
const boundedScale =
|
|
809
|
+
const boundedScale = chunkSEJEVNXW_js.clampZoomScale(nextScale);
|
|
810
810
|
const nextEditorScale = fitScale * boundedScale;
|
|
811
811
|
const centerX = (bounds.minX + bounds.maxX) / 2;
|
|
812
812
|
const centerY = (bounds.minY + bounds.maxY) / 2;
|
|
@@ -843,29 +843,29 @@ function useZoomViewport({
|
|
|
843
843
|
selectedElements.forEach((element) => {
|
|
844
844
|
minX = Math.min(minX, element.x);
|
|
845
845
|
minY = Math.min(minY, element.y);
|
|
846
|
-
maxX = Math.max(maxX, element.x + Math.max(element.width,
|
|
847
|
-
maxY = Math.max(maxY, element.y + Math.max(element.height,
|
|
846
|
+
maxX = Math.max(maxX, element.x + Math.max(element.width, chunkGKRE7272_js.MIN_ELEMENT_SIZE));
|
|
847
|
+
maxY = Math.max(maxY, element.y + Math.max(element.height, chunkGKRE7272_js.MIN_ELEMENT_SIZE));
|
|
848
848
|
});
|
|
849
849
|
if (!Number.isFinite(minX) || !Number.isFinite(minY) || !Number.isFinite(maxX) || !Number.isFinite(maxY)) {
|
|
850
850
|
return;
|
|
851
851
|
}
|
|
852
852
|
const selectionBounds = { minX, minY, maxX, maxY };
|
|
853
|
-
const boundsWidth = Math.max(selectionBounds.maxX - selectionBounds.minX,
|
|
854
|
-
const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY,
|
|
853
|
+
const boundsWidth = Math.max(selectionBounds.maxX - selectionBounds.minX, chunkGKRE7272_js.MIN_ELEMENT_SIZE);
|
|
854
|
+
const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY, chunkGKRE7272_js.MIN_ELEMENT_SIZE);
|
|
855
855
|
const availableWidth = Math.max(
|
|
856
|
-
effectiveEditorDimensions.width -
|
|
857
|
-
|
|
856
|
+
effectiveEditorDimensions.width - chunkGKRE7272_js.ZOOM_TO_SELECTION_PADDING,
|
|
857
|
+
chunkGKRE7272_js.MIN_ELEMENT_SIZE
|
|
858
858
|
);
|
|
859
859
|
const availableHeight = Math.max(
|
|
860
|
-
effectiveEditorDimensions.height -
|
|
861
|
-
|
|
860
|
+
effectiveEditorDimensions.height - chunkGKRE7272_js.ZOOM_TO_SELECTION_PADDING,
|
|
861
|
+
chunkGKRE7272_js.MIN_ELEMENT_SIZE
|
|
862
862
|
);
|
|
863
863
|
const targetEditorScale = Math.min(
|
|
864
864
|
availableWidth / boundsWidth,
|
|
865
865
|
availableHeight / boundsHeight
|
|
866
866
|
);
|
|
867
867
|
const safeFitScale = fitScale > Number.EPSILON ? fitScale : Number.EPSILON;
|
|
868
|
-
const nextScale =
|
|
868
|
+
const nextScale = chunkSEJEVNXW_js.clampZoomScale(targetEditorScale / safeFitScale);
|
|
869
869
|
setScale(nextScale);
|
|
870
870
|
window.requestAnimationFrame(() => {
|
|
871
871
|
window.requestAnimationFrame(() => {
|
|
@@ -882,14 +882,14 @@ function useZoomViewport({
|
|
|
882
882
|
]);
|
|
883
883
|
const handleWheel = react.useCallback(
|
|
884
884
|
(event) => {
|
|
885
|
-
const mapped =
|
|
885
|
+
const mapped = chunkSEJEVNXW_js.mapEditingWheel(event, wheelBufferRef.current, true);
|
|
886
886
|
if (mapped.intent !== "zoom") {
|
|
887
887
|
return;
|
|
888
888
|
}
|
|
889
889
|
event.preventDefault();
|
|
890
890
|
store.dispatch({
|
|
891
891
|
type: "set-zoom",
|
|
892
|
-
zoom:
|
|
892
|
+
zoom: chunkSEJEVNXW_js.clampZoomScale(store.getState().zoom + mapped.deltaScale)
|
|
893
893
|
});
|
|
894
894
|
},
|
|
895
895
|
[store]
|
|
@@ -1057,8 +1057,8 @@ function scheduleOpeningAutoPlayGroup(controller, ctx) {
|
|
|
1057
1057
|
if (!group) {
|
|
1058
1058
|
return;
|
|
1059
1059
|
}
|
|
1060
|
-
|
|
1061
|
-
|
|
1060
|
+
chunkSEJEVNXW_js.playGroup(controller, group, ctx);
|
|
1061
|
+
chunkSEJEVNXW_js.scheduleAutoAdvanceChain(controller, ctx);
|
|
1062
1062
|
}, firstGroup.autoAdvanceDelayMs ?? 0);
|
|
1063
1063
|
ctx.timers.push(timer);
|
|
1064
1064
|
}
|
|
@@ -1077,7 +1077,7 @@ function scheduleEntranceAnimationTimers(slide, setPresentationAnimations, prese
|
|
|
1077
1077
|
}))
|
|
1078
1078
|
);
|
|
1079
1079
|
entranceAnimations.forEach((animation, animationIndex) => {
|
|
1080
|
-
const delay =
|
|
1080
|
+
const delay = chunkSEJEVNXW_js.computeEntranceAnimationDelay(animation.delayMs, animationIndex);
|
|
1081
1081
|
const timer = window.setTimeout(() => {
|
|
1082
1082
|
setPresentationAnimations(
|
|
1083
1083
|
(previousAnimations) => previousAnimations.map(
|
|
@@ -1119,7 +1119,7 @@ function useAnimationPlayback(input) {
|
|
|
1119
1119
|
}, [onPlayActionSound]);
|
|
1120
1120
|
react.useEffect(() => {
|
|
1121
1121
|
return () => {
|
|
1122
|
-
|
|
1122
|
+
chunkSEJEVNXW_js.cancelBuildReveal(buildRafRef);
|
|
1123
1123
|
};
|
|
1124
1124
|
}, []);
|
|
1125
1125
|
const clearPresentationTimers = react.useCallback(() => {
|
|
@@ -1127,7 +1127,7 @@ function useAnimationPlayback(input) {
|
|
|
1127
1127
|
window.clearTimeout(timer);
|
|
1128
1128
|
});
|
|
1129
1129
|
presentationTimersRef.current = [];
|
|
1130
|
-
|
|
1130
|
+
chunkSEJEVNXW_js.cancelBuildReveal(buildRafRef);
|
|
1131
1131
|
activeAnimationGroupRef.current = null;
|
|
1132
1132
|
activeAnimationEndAtRef.current = 0;
|
|
1133
1133
|
}, []);
|
|
@@ -1137,7 +1137,7 @@ function useAnimationPlayback(input) {
|
|
|
1137
1137
|
}, []);
|
|
1138
1138
|
const resetSlideTimeline = react.useCallback(
|
|
1139
1139
|
(slideIndex) => {
|
|
1140
|
-
|
|
1140
|
+
chunkSEJEVNXW_js.cancelBuildReveal(buildRafRef);
|
|
1141
1141
|
const slide = slides[slideIndex];
|
|
1142
1142
|
if (!slide) {
|
|
1143
1143
|
controllerRef.current = null;
|
|
@@ -1147,7 +1147,7 @@ function useAnimationPlayback(input) {
|
|
|
1147
1147
|
setHoverTriggerShapeIds(/* @__PURE__ */ new Set());
|
|
1148
1148
|
return;
|
|
1149
1149
|
}
|
|
1150
|
-
const controller =
|
|
1150
|
+
const controller = chunkSEJEVNXW_js.PresentationAnimationController.fromSlide(slide);
|
|
1151
1151
|
controllerRef.current = controller;
|
|
1152
1152
|
setPresentationKeyframesCss(controller.keyframesCss);
|
|
1153
1153
|
setInteractiveTriggerShapeIds(controller.interactiveTriggerShapeIds);
|
|
@@ -1164,11 +1164,11 @@ function useAnimationPlayback(input) {
|
|
|
1164
1164
|
const activeGroup = activeAnimationGroupRef.current;
|
|
1165
1165
|
if (controller && controller.hasMoreSteps() && shouldSeekAnimationGroup(activeGroup, activeAnimationEndAtRef.current, performance.now())) {
|
|
1166
1166
|
finishDomAnimationsForGroup(activeGroup);
|
|
1167
|
-
const buildIds =
|
|
1167
|
+
const buildIds = chunkSEJEVNXW_js.PresentationAnimationController.collectBuildStepIds(activeGroup);
|
|
1168
1168
|
const completedStates = controller.computeStatesFor(buildIds);
|
|
1169
1169
|
clearPresentationTimers();
|
|
1170
1170
|
finishAnimationGroupSteps(activeGroup, setPresentationElementStates, completedStates);
|
|
1171
|
-
|
|
1171
|
+
chunkSEJEVNXW_js.scheduleAutoAdvanceChain(controller, buildPlaybackContext());
|
|
1172
1172
|
return true;
|
|
1173
1173
|
}
|
|
1174
1174
|
if (!controller || !controller.hasMoreSteps()) {
|
|
@@ -1179,9 +1179,9 @@ function useAnimationPlayback(input) {
|
|
|
1179
1179
|
return false;
|
|
1180
1180
|
}
|
|
1181
1181
|
const ctx = buildPlaybackContext();
|
|
1182
|
-
|
|
1182
|
+
chunkSEJEVNXW_js.playGroup(controller, group, ctx);
|
|
1183
1183
|
markAnimationGroupActive(group);
|
|
1184
|
-
|
|
1184
|
+
chunkSEJEVNXW_js.scheduleAutoAdvanceChain(controller, ctx);
|
|
1185
1185
|
return true;
|
|
1186
1186
|
}, [animationsEnabled, buildPlaybackContext, clearPresentationTimers, markAnimationGroupActive]);
|
|
1187
1187
|
const handleInteractiveShapeClick = react.useCallback(
|
|
@@ -1194,7 +1194,7 @@ function useAnimationPlayback(input) {
|
|
|
1194
1194
|
if (!group) {
|
|
1195
1195
|
return false;
|
|
1196
1196
|
}
|
|
1197
|
-
|
|
1197
|
+
chunkSEJEVNXW_js.playGroup(controller, group, buildPlaybackContext());
|
|
1198
1198
|
return true;
|
|
1199
1199
|
},
|
|
1200
1200
|
[buildPlaybackContext]
|
|
@@ -1213,7 +1213,7 @@ function useAnimationPlayback(input) {
|
|
|
1213
1213
|
if (!group) {
|
|
1214
1214
|
return false;
|
|
1215
1215
|
}
|
|
1216
|
-
|
|
1216
|
+
chunkSEJEVNXW_js.playGroup(controller, group, buildPlaybackContext());
|
|
1217
1217
|
return true;
|
|
1218
1218
|
},
|
|
1219
1219
|
[animationsEnabled, buildPlaybackContext]
|
|
@@ -1294,12 +1294,12 @@ function useAnimationPlayback(input) {
|
|
|
1294
1294
|
presentationTimersRef
|
|
1295
1295
|
};
|
|
1296
1296
|
}
|
|
1297
|
-
var PRESENTER_CHANNEL_NAME =
|
|
1298
|
-
var AUDIENCE_HASH =
|
|
1299
|
-
var PRESENTER_MSG_ORIGIN =
|
|
1300
|
-
var AUDIENCE_NONCE_KEY =
|
|
1297
|
+
var PRESENTER_CHANNEL_NAME = chunkSEJEVNXW_js.PRESENTATION_CHANNEL_NAME;
|
|
1298
|
+
var AUDIENCE_HASH = chunkSEJEVNXW_js.PRESENTATION_HASH;
|
|
1299
|
+
var PRESENTER_MSG_ORIGIN = chunkSEJEVNXW_js.PRESENTATION_MESSAGE_ORIGIN;
|
|
1300
|
+
var AUDIENCE_NONCE_KEY = chunkSEJEVNXW_js.PRESENTATION_NONCE_KEY;
|
|
1301
1301
|
function generateSessionId() {
|
|
1302
|
-
return
|
|
1302
|
+
return chunkSEJEVNXW_js.createPresentationSessionId();
|
|
1303
1303
|
}
|
|
1304
1304
|
function parseAudienceNonce() {
|
|
1305
1305
|
const hash = window.location.hash;
|
|
@@ -1335,7 +1335,7 @@ function usePresenterWindow(input) {
|
|
|
1335
1335
|
}, []);
|
|
1336
1336
|
const swapDisplays = react.useCallback(async () => {
|
|
1337
1337
|
const audience = audienceWindowRef.current;
|
|
1338
|
-
return audience && !audience.closed ?
|
|
1338
|
+
return audience && !audience.closed ? chunkSEJEVNXW_js.swapPresentationWindows(window, audience) : false;
|
|
1339
1339
|
}, []);
|
|
1340
1340
|
const syncSlideToAudience = react.useCallback(
|
|
1341
1341
|
(slideIndex) => {
|
|
@@ -1399,7 +1399,7 @@ function usePresenterWindow(input) {
|
|
|
1399
1399
|
pollTimerRef.current = null;
|
|
1400
1400
|
}
|
|
1401
1401
|
if (closingSessionId) {
|
|
1402
|
-
void
|
|
1402
|
+
void chunkSEJEVNXW_js.clearAudienceContent(closingSessionId);
|
|
1403
1403
|
}
|
|
1404
1404
|
}, [getChannel]);
|
|
1405
1405
|
const openAudienceWindow = react.useCallback(() => {
|
|
@@ -1417,10 +1417,10 @@ function usePresenterWindow(input) {
|
|
|
1417
1417
|
audienceWindowRef.current = blankWin;
|
|
1418
1418
|
const sessionId = generateSessionId();
|
|
1419
1419
|
sessionIdRef.current = sessionId;
|
|
1420
|
-
const audienceUrl =
|
|
1421
|
-
void
|
|
1420
|
+
const audienceUrl = chunkSEJEVNXW_js.buildPresentationAudienceUrl(window.location.href, sessionId);
|
|
1421
|
+
void chunkSEJEVNXW_js.resolveAudienceScreenPlacement(window).then((placement) => {
|
|
1422
1422
|
if (placement && audienceWindowRef.current === blankWin && !blankWin.closed) {
|
|
1423
|
-
|
|
1423
|
+
chunkSEJEVNXW_js.placeAudienceWindow(blankWin, placement);
|
|
1424
1424
|
}
|
|
1425
1425
|
return void 0;
|
|
1426
1426
|
});
|
|
@@ -1450,7 +1450,7 @@ function usePresenterWindow(input) {
|
|
|
1450
1450
|
}
|
|
1451
1451
|
};
|
|
1452
1452
|
if (content) {
|
|
1453
|
-
void
|
|
1453
|
+
void chunkSEJEVNXW_js.storeAudienceContent(content, sessionId).then(() => navigateOrClose(true)).catch(() => navigateOrClose(false));
|
|
1454
1454
|
} else {
|
|
1455
1455
|
navigateOrClose(true);
|
|
1456
1456
|
}
|
|
@@ -1476,7 +1476,7 @@ function usePresenterWindow(input) {
|
|
|
1476
1476
|
}
|
|
1477
1477
|
const handleMessage = (event) => {
|
|
1478
1478
|
const message = event.data;
|
|
1479
|
-
if (
|
|
1479
|
+
if (chunkSEJEVNXW_js.isPresentationSessionMessage(message) && message.type === "audience-ready" && message.sessionId === sessionIdRef.current) {
|
|
1480
1480
|
syncStateToAudience(snapshotRef.current);
|
|
1481
1481
|
}
|
|
1482
1482
|
};
|
|
@@ -1505,7 +1505,7 @@ function usePresenterWindow(input) {
|
|
|
1505
1505
|
react.useEffect(() => {
|
|
1506
1506
|
const handleBeforeUnload = () => {
|
|
1507
1507
|
if (sessionIdRef.current) {
|
|
1508
|
-
void
|
|
1508
|
+
void chunkSEJEVNXW_js.clearAudienceContent(sessionIdRef.current);
|
|
1509
1509
|
}
|
|
1510
1510
|
};
|
|
1511
1511
|
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
@@ -1567,7 +1567,7 @@ function useAudienceMode(input) {
|
|
|
1567
1567
|
}
|
|
1568
1568
|
channel.onmessage = (event) => {
|
|
1569
1569
|
const data = event.data;
|
|
1570
|
-
if (!
|
|
1570
|
+
if (!chunkSEJEVNXW_js.isPresentationSessionMessage(data) || data.origin !== PRESENTER_MSG_ORIGIN) {
|
|
1571
1571
|
return;
|
|
1572
1572
|
}
|
|
1573
1573
|
if (expectedSessionId && data.sessionId !== expectedSessionId) {
|
|
@@ -1583,16 +1583,16 @@ function useAudienceMode(input) {
|
|
|
1583
1583
|
}
|
|
1584
1584
|
if (data.type === "presenter-exit") {
|
|
1585
1585
|
if (expectedSessionId) {
|
|
1586
|
-
void
|
|
1586
|
+
void chunkSEJEVNXW_js.clearAudienceContent(expectedSessionId);
|
|
1587
1587
|
}
|
|
1588
|
-
if (
|
|
1588
|
+
if (chunkSEJEVNXW_js.endAudienceDisplay(window)) {
|
|
1589
1589
|
handlers.onPresenterEnded?.();
|
|
1590
1590
|
}
|
|
1591
1591
|
}
|
|
1592
1592
|
};
|
|
1593
1593
|
if (expectedSessionId) {
|
|
1594
1594
|
channel.postMessage({
|
|
1595
|
-
origin:
|
|
1595
|
+
origin: chunkSEJEVNXW_js.PRESENTATION_MESSAGE_ORIGIN,
|
|
1596
1596
|
type: "audience-ready",
|
|
1597
1597
|
sessionId: expectedSessionId
|
|
1598
1598
|
});
|
|
@@ -1606,7 +1606,7 @@ function useAudienceMode(input) {
|
|
|
1606
1606
|
}, []);
|
|
1607
1607
|
}
|
|
1608
1608
|
function usePresentationKeyboard(input) {
|
|
1609
|
-
const wheelBufferRef = react.useRef(
|
|
1609
|
+
const wheelBufferRef = react.useRef(chunkSEJEVNXW_js.createWheelStepBuffer());
|
|
1610
1610
|
const {
|
|
1611
1611
|
mode,
|
|
1612
1612
|
movePresentationSlide,
|
|
@@ -1627,14 +1627,14 @@ function usePresentationKeyboard(input) {
|
|
|
1627
1627
|
presentationSlideIndex,
|
|
1628
1628
|
setShowRehearsalSummary
|
|
1629
1629
|
} = input;
|
|
1630
|
-
const keyBufferRef = react.useRef(
|
|
1630
|
+
const keyBufferRef = react.useRef(chunkSEJEVNXW_js.createPresentationKeyBuffer());
|
|
1631
1631
|
react.useEffect(() => {
|
|
1632
|
-
if (mode !== "present" || !
|
|
1633
|
-
keyBufferRef.current =
|
|
1632
|
+
if (mode !== "present" || !chunkSEJEVNXW_js.acceptsPresentationInput()) {
|
|
1633
|
+
keyBufferRef.current = chunkSEJEVNXW_js.createPresentationKeyBuffer();
|
|
1634
1634
|
return;
|
|
1635
1635
|
}
|
|
1636
1636
|
const handleKeyDown = (event) => {
|
|
1637
|
-
const mapped =
|
|
1637
|
+
const mapped = chunkSEJEVNXW_js.mapPresentationKey(event, keyBufferRef.current);
|
|
1638
1638
|
if (mapped.action === "none") {
|
|
1639
1639
|
return;
|
|
1640
1640
|
}
|
|
@@ -1654,12 +1654,12 @@ function usePresentationKeyboard(input) {
|
|
|
1654
1654
|
movePresentationSlide(-1);
|
|
1655
1655
|
return;
|
|
1656
1656
|
case "first": {
|
|
1657
|
-
const first =
|
|
1657
|
+
const first = chunkSEJEVNXW_js.firstShowSlideIndex(showSlideIndexes);
|
|
1658
1658
|
navigateToSlide(first ?? 0);
|
|
1659
1659
|
return;
|
|
1660
1660
|
}
|
|
1661
1661
|
case "last": {
|
|
1662
|
-
const last =
|
|
1662
|
+
const last = chunkSEJEVNXW_js.lastShowSlideIndex(showSlideIndexes);
|
|
1663
1663
|
navigateToSlide(last ?? Math.max(0, slideCount - 1));
|
|
1664
1664
|
return;
|
|
1665
1665
|
}
|
|
@@ -1697,10 +1697,10 @@ function usePresentationKeyboard(input) {
|
|
|
1697
1697
|
}
|
|
1698
1698
|
};
|
|
1699
1699
|
const handleWheel = (event) => {
|
|
1700
|
-
if (mode !== "present" || !
|
|
1700
|
+
if (mode !== "present" || !chunkSEJEVNXW_js.acceptsPresentationInput()) {
|
|
1701
1701
|
return;
|
|
1702
1702
|
}
|
|
1703
|
-
const mapped =
|
|
1703
|
+
const mapped = chunkSEJEVNXW_js.mapPresentationWheel(event, wheelBufferRef.current);
|
|
1704
1704
|
if (mapped.intent === "next-slide") {
|
|
1705
1705
|
event.preventDefault();
|
|
1706
1706
|
movePresentationSlide(1);
|
|
@@ -1833,7 +1833,7 @@ function useRehearsalTimings(input) {
|
|
|
1833
1833
|
|
|
1834
1834
|
// src/viewer/hooks/presentation-mode/presentation-actions.ts
|
|
1835
1835
|
function handlePresentationActionImpl(action, deps) {
|
|
1836
|
-
|
|
1836
|
+
chunkSEJEVNXW_js.runPresentationAction(
|
|
1837
1837
|
action,
|
|
1838
1838
|
{ slideCount: deps.slidesLength, ...deps.elementId ? { elementId: deps.elementId } : {} },
|
|
1839
1839
|
{
|
|
@@ -1861,7 +1861,7 @@ function handlePresentationActionImpl(action, deps) {
|
|
|
1861
1861
|
function executeSlideTransition(nextSlideIndex, deps) {
|
|
1862
1862
|
const incomingSlide = deps.slides[nextSlideIndex];
|
|
1863
1863
|
const transition = deps.reverse ? deps.slides[deps.currentSlideIndex]?.transition : incomingSlide?.transition;
|
|
1864
|
-
const durationMs = deps.playTransition ?
|
|
1864
|
+
const durationMs = deps.playTransition ? chunkSEJEVNXW_js.resolveTransitionDurationMs(transition) : 0;
|
|
1865
1865
|
deps.clearPresentationTimers();
|
|
1866
1866
|
deps.setPresentationSlideIndex(nextSlideIndex);
|
|
1867
1867
|
deps.onSetActiveSlideIndex(nextSlideIndex);
|
|
@@ -1926,7 +1926,7 @@ function useSlideNavigation(input) {
|
|
|
1926
1926
|
});
|
|
1927
1927
|
const scheduleAutoAdvanceForSlide = react.useCallback(
|
|
1928
1928
|
(slideIndex) => {
|
|
1929
|
-
const delayMs =
|
|
1929
|
+
const delayMs = chunkSEJEVNXW_js.resolveAutoAdvanceDelayMs(slides[slideIndex], { useTimings });
|
|
1930
1930
|
if (delayMs === void 0) {
|
|
1931
1931
|
return;
|
|
1932
1932
|
}
|
|
@@ -1949,7 +1949,7 @@ function useSlideNavigation(input) {
|
|
|
1949
1949
|
if (availableSlideIndexes.length === 0) {
|
|
1950
1950
|
return;
|
|
1951
1951
|
}
|
|
1952
|
-
const pastLastSlide = direction === 1 && !
|
|
1952
|
+
const pastLastSlide = direction === 1 && !chunkSEJEVNXW_js.hasShowSlideAfter(presentationSlideIndex, availableSlideIndexes);
|
|
1953
1953
|
if (rehearsing && pastLastSlide) {
|
|
1954
1954
|
recordCurrentSlideTime(presentationSlideIndex);
|
|
1955
1955
|
try {
|
|
@@ -1967,9 +1967,9 @@ function useSlideNavigation(input) {
|
|
|
1967
1967
|
onAdvancePastLastSlide();
|
|
1968
1968
|
return;
|
|
1969
1969
|
}
|
|
1970
|
-
const nextSlideIndex = direction === 1 ?
|
|
1970
|
+
const nextSlideIndex = direction === 1 ? chunkSEJEVNXW_js.nextShowSlideIndex(presentationSlideIndex, availableSlideIndexes, {
|
|
1971
1971
|
loop: Boolean(loopContinuously) && !rehearsing
|
|
1972
|
-
}) :
|
|
1972
|
+
}) : chunkSEJEVNXW_js.previousShowSlideIndex(presentationSlideIndex, availableSlideIndexes);
|
|
1973
1973
|
if (nextSlideIndex === void 0 || nextSlideIndex === presentationSlideIndex) {
|
|
1974
1974
|
return;
|
|
1975
1975
|
}
|
|
@@ -2144,7 +2144,7 @@ function createCustomShowRunner(deps) {
|
|
|
2144
2144
|
return;
|
|
2145
2145
|
}
|
|
2146
2146
|
origin = returnAfter ? { showId: deps.getActiveCustomShowId(), slideIndex: deps.getPresentationSlideIndex() } : null;
|
|
2147
|
-
const first =
|
|
2147
|
+
const first = chunkSEJEVNXW_js.firstShowSlideIndex(chunkSEJEVNXW_js.resolveShowSlideIndexes(deps.getSlides(), target));
|
|
2148
2148
|
deps.setActiveCustomShowId(customShowId);
|
|
2149
2149
|
if (first !== void 0) {
|
|
2150
2150
|
deps.navigateToSlide(first);
|
|
@@ -2221,22 +2221,22 @@ function usePresentationActionExtensions(input) {
|
|
|
2221
2221
|
}
|
|
2222
2222
|
}, [navigateToSlideViaRef]);
|
|
2223
2223
|
const onOpenFile = react.useCallback((target) => {
|
|
2224
|
-
|
|
2224
|
+
chunkSEJEVNXW_js.safeOpenUrl(target);
|
|
2225
2225
|
}, []);
|
|
2226
2226
|
const onOpenPresentation = react.useCallback((target) => {
|
|
2227
|
-
|
|
2227
|
+
chunkSEJEVNXW_js.safeOpenUrl(target);
|
|
2228
2228
|
}, []);
|
|
2229
2229
|
const onPlayMedia = react.useCallback(
|
|
2230
2230
|
(elementId) => {
|
|
2231
|
-
|
|
2231
|
+
chunkSEJEVNXW_js.toggleStageElementMedia(containerRef.current, elementId);
|
|
2232
2232
|
},
|
|
2233
2233
|
[containerRef]
|
|
2234
2234
|
);
|
|
2235
2235
|
const onOleVerb = react.useCallback(
|
|
2236
2236
|
(verb, elementId) => {
|
|
2237
|
-
const target =
|
|
2237
|
+
const target = chunkSEJEVNXW_js.resolveOleVerbTarget(slides[presentationSlideIndex], elementId, verb);
|
|
2238
2238
|
if (target) {
|
|
2239
|
-
|
|
2239
|
+
chunkSEJEVNXW_js.openUrlInNewTab(target.url);
|
|
2240
2240
|
}
|
|
2241
2241
|
},
|
|
2242
2242
|
[slides, presentationSlideIndex]
|
|
@@ -2266,22 +2266,22 @@ function usePresentationActionExtensions(input) {
|
|
|
2266
2266
|
};
|
|
2267
2267
|
}
|
|
2268
2268
|
function usePresenterConsole(slideIndex, active) {
|
|
2269
|
-
const timerRef = react.useRef(
|
|
2270
|
-
const [snapshot, setSnapshot] = react.useState(() =>
|
|
2269
|
+
const timerRef = react.useRef(chunkSEJEVNXW_js.createPresenterTimer());
|
|
2270
|
+
const [snapshot, setSnapshot] = react.useState(() => chunkSEJEVNXW_js.createInitialPresentationSnapshot(slideIndex));
|
|
2271
2271
|
const patch = react.useCallback((value) => {
|
|
2272
|
-
setSnapshot((current) =>
|
|
2272
|
+
setSnapshot((current) => chunkSEJEVNXW_js.mergePresentationSnapshot(current, value));
|
|
2273
2273
|
}, []);
|
|
2274
2274
|
react.useEffect(() => patch({ slideIndex }), [patch, slideIndex]);
|
|
2275
2275
|
react.useEffect(() => {
|
|
2276
2276
|
if (!active) {
|
|
2277
2277
|
return;
|
|
2278
2278
|
}
|
|
2279
|
-
timerRef.current =
|
|
2279
|
+
timerRef.current = chunkSEJEVNXW_js.resetPresenterTimer();
|
|
2280
2280
|
patch({ paused: false, elapsedMs: 0 });
|
|
2281
2281
|
const timer = window.setInterval(() => {
|
|
2282
2282
|
patch({
|
|
2283
2283
|
paused: timerRef.current.paused,
|
|
2284
|
-
elapsedMs:
|
|
2284
|
+
elapsedMs: chunkSEJEVNXW_js.presenterElapsed(timerRef.current)
|
|
2285
2285
|
});
|
|
2286
2286
|
}, 1e3);
|
|
2287
2287
|
return () => window.clearInterval(timer);
|
|
@@ -2291,19 +2291,19 @@ function usePresenterConsole(slideIndex, active) {
|
|
|
2291
2291
|
applyAudienceSnapshot: setSnapshot,
|
|
2292
2292
|
setBlackout: (blackout) => patch({ blackout }),
|
|
2293
2293
|
toggleTimer: () => {
|
|
2294
|
-
timerRef.current =
|
|
2294
|
+
timerRef.current = chunkSEJEVNXW_js.togglePresenterTimer(timerRef.current);
|
|
2295
2295
|
patch({
|
|
2296
2296
|
paused: timerRef.current.paused,
|
|
2297
|
-
elapsedMs:
|
|
2297
|
+
elapsedMs: chunkSEJEVNXW_js.presenterElapsed(timerRef.current)
|
|
2298
2298
|
});
|
|
2299
2299
|
},
|
|
2300
2300
|
resetTimer: () => {
|
|
2301
|
-
timerRef.current =
|
|
2301
|
+
timerRef.current = chunkSEJEVNXW_js.resetPresenterTimer();
|
|
2302
2302
|
patch({ paused: false, elapsedMs: 0 });
|
|
2303
2303
|
},
|
|
2304
2304
|
stepZoom: (direction) => setSnapshot(
|
|
2305
|
-
(current) =>
|
|
2306
|
-
zoom:
|
|
2305
|
+
(current) => chunkSEJEVNXW_js.mergePresentationSnapshot(current, {
|
|
2306
|
+
zoom: chunkSEJEVNXW_js.stepPresenterZoom(
|
|
2307
2307
|
current.zoom ?? { scale: 1, originX: 0.5, originY: 0.5 },
|
|
2308
2308
|
direction
|
|
2309
2309
|
)
|
|
@@ -2353,7 +2353,7 @@ function usePresentationMode(input) {
|
|
|
2353
2353
|
const [allSlidesOpen, setAllSlidesOpen] = react.useState(false);
|
|
2354
2354
|
const [endOfShowVisible, setEndOfShowVisible] = react.useState(false);
|
|
2355
2355
|
const [presentationStartTime, setPresentationStartTime] = react.useState(null);
|
|
2356
|
-
const showGuard = react.useMemo(() =>
|
|
2356
|
+
const showGuard = react.useMemo(() => chunkSEJEVNXW_js.createPresenterShowGuard(), []);
|
|
2357
2357
|
const {
|
|
2358
2358
|
presentationAnimations,
|
|
2359
2359
|
presentationElementStates,
|
|
@@ -2443,7 +2443,7 @@ function usePresentationMode(input) {
|
|
|
2443
2443
|
actionExtensions.bindNavigateToSlide(navigateToSlide);
|
|
2444
2444
|
const movePresentationSlide = react.useCallback(
|
|
2445
2445
|
(direction, trigger = "explicit") => {
|
|
2446
|
-
if (!
|
|
2446
|
+
if (!chunkSEJEVNXW_js.acceptsPresentationInput()) {
|
|
2447
2447
|
return;
|
|
2448
2448
|
}
|
|
2449
2449
|
if (endOfShowVisible) {
|
|
@@ -2512,7 +2512,7 @@ function usePresentationMode(input) {
|
|
|
2512
2512
|
onSetMode("present");
|
|
2513
2513
|
}, [containerRef, onSetMode, setRehearsing]);
|
|
2514
2514
|
const enterPresentModeFromBeginning = react.useCallback(() => {
|
|
2515
|
-
const first =
|
|
2515
|
+
const first = chunkSEJEVNXW_js.firstShowSlideIndex(visibleSlideIndexes);
|
|
2516
2516
|
if (first !== void 0) {
|
|
2517
2517
|
onSetActiveSlideIndex(first);
|
|
2518
2518
|
}
|
|
@@ -2592,7 +2592,7 @@ function usePresentationMode(input) {
|
|
|
2592
2592
|
if (mode !== "present") {
|
|
2593
2593
|
return;
|
|
2594
2594
|
}
|
|
2595
|
-
return
|
|
2595
|
+
return chunkSEJEVNXW_js.attachPresentationVisibilityPause({
|
|
2596
2596
|
root: containerRef.current ?? void 0,
|
|
2597
2597
|
onHidden: () => clearPresentationTimersRef.current(),
|
|
2598
2598
|
onVisible: () => scheduleAutoAdvanceRef.current(presentationSlideIndexRef.current)
|
|
@@ -2600,7 +2600,7 @@ function usePresentationMode(input) {
|
|
|
2600
2600
|
}, [mode, containerRef]);
|
|
2601
2601
|
react.useLayoutEffect(() => {
|
|
2602
2602
|
if (mode === "present") {
|
|
2603
|
-
const idx =
|
|
2603
|
+
const idx = chunkSEJEVNXW_js.presentationEntrySlideIndex(
|
|
2604
2604
|
activeSlideIndexRef.current,
|
|
2605
2605
|
visibleSlideIndexesRef.current
|
|
2606
2606
|
);
|
|
@@ -2679,11 +2679,11 @@ function usePresentationMode(input) {
|
|
|
2679
2679
|
return void 0;
|
|
2680
2680
|
}
|
|
2681
2681
|
const incoming = slides[transitionOverlay.incomingSlideIndex];
|
|
2682
|
-
return
|
|
2682
|
+
return chunkSEJEVNXW_js.buildMorphTransitionPlan(
|
|
2683
2683
|
slides[transitionOverlay.outgoingSlideIndex],
|
|
2684
2684
|
incoming,
|
|
2685
2685
|
transitionOverlay.durationMs,
|
|
2686
|
-
|
|
2686
|
+
chunkSEJEVNXW_js.morphOptionToMode(transitionOverlay.transition.morphOption),
|
|
2687
2687
|
// `PresentationStage` stacks the incoming slide's elements above its
|
|
2688
2688
|
// template shapes (`zIndex = templateElements.length + index`), so a
|
|
2689
2689
|
// z-index journey has to start counting where the stage does.
|
|
@@ -2708,7 +2708,7 @@ function usePresentationMode(input) {
|
|
|
2708
2708
|
if (!morphPlan) {
|
|
2709
2709
|
return presentationKeyframesCss;
|
|
2710
2710
|
}
|
|
2711
|
-
const imageRules =
|
|
2711
|
+
const imageRules = chunkSEJEVNXW_js.buildMorphAnimationRules(morphPlan, "", "incoming", "image");
|
|
2712
2712
|
return `${presentationKeyframesCss ?? ""}
|
|
2713
2713
|
${morphPlan.keyframesCss}
|
|
2714
2714
|
${imageRules}`;
|
|
@@ -3005,7 +3005,7 @@ function useFindReplace({
|
|
|
3005
3005
|
const [findResults, setFindResults] = react.useState([]);
|
|
3006
3006
|
const [findResultIndex, setFindResultIndex] = react.useState(-1);
|
|
3007
3007
|
const performFind = react.useCallback(() => {
|
|
3008
|
-
const results =
|
|
3008
|
+
const results = chunkSEJEVNXW_js.findInSlides(slides, findQuery, { matchCase: findMatchCase });
|
|
3009
3009
|
if (!findQuery) {
|
|
3010
3010
|
setFindResults([]);
|
|
3011
3011
|
setFindResultIndex(-1);
|
|
@@ -3039,7 +3039,7 @@ function useFindReplace({
|
|
|
3039
3039
|
return;
|
|
3040
3040
|
}
|
|
3041
3041
|
onUpdateSlides(
|
|
3042
|
-
(prevSlides) =>
|
|
3042
|
+
(prevSlides) => chunkSEJEVNXW_js.applyFindReplacements(prevSlides, toReplace, replaceQuery).slides
|
|
3043
3043
|
);
|
|
3044
3044
|
onMarkDirty();
|
|
3045
3045
|
},
|
|
@@ -3061,9 +3061,9 @@ function useFindReplace({
|
|
|
3061
3061
|
}, [findResults, applyReplacements, performFind]);
|
|
3062
3062
|
react.useEffect(() => {
|
|
3063
3063
|
const handler = (event) => {
|
|
3064
|
-
const { action } =
|
|
3064
|
+
const { action } = chunkSEJEVNXW_js.mapEditorKey(event, {
|
|
3065
3065
|
canEdit: mode === "edit",
|
|
3066
|
-
isTextInputTarget:
|
|
3066
|
+
isTextInputTarget: chunkSEJEVNXW_js.isEditorTextInputTarget(event.target)
|
|
3067
3067
|
});
|
|
3068
3068
|
if (action !== "find") {
|
|
3069
3069
|
return;
|
|
@@ -3174,7 +3174,7 @@ function addCommentToSlide(slides, slideIndex, text, authorName, elementId, ment
|
|
|
3174
3174
|
if (!slide) {
|
|
3175
3175
|
return { slides, didAdd: false };
|
|
3176
3176
|
}
|
|
3177
|
-
const next =
|
|
3177
|
+
const next = chunkSEJEVNXW_js.addCommentToList(
|
|
3178
3178
|
slide.comments || [],
|
|
3179
3179
|
text,
|
|
3180
3180
|
authorName,
|
|
@@ -3195,7 +3195,7 @@ function removeCommentFromSlide(slides, slideIndex, commentId) {
|
|
|
3195
3195
|
if (!slide) {
|
|
3196
3196
|
return { slides, didDelete: false };
|
|
3197
3197
|
}
|
|
3198
|
-
const next =
|
|
3198
|
+
const next = chunkSEJEVNXW_js.removeCommentFromList(slide.comments || [], commentId);
|
|
3199
3199
|
if (!next) {
|
|
3200
3200
|
return { slides, didDelete: false };
|
|
3201
3201
|
}
|
|
@@ -3206,7 +3206,7 @@ function editCommentInSlide(slides, slideIndex, commentId, newText) {
|
|
|
3206
3206
|
if (!slide) {
|
|
3207
3207
|
return { slides, didUpdate: false };
|
|
3208
3208
|
}
|
|
3209
|
-
const next =
|
|
3209
|
+
const next = chunkSEJEVNXW_js.editCommentInList(slide.comments || [], commentId, newText);
|
|
3210
3210
|
if (!next) {
|
|
3211
3211
|
return { slides, didUpdate: false };
|
|
3212
3212
|
}
|
|
@@ -3217,7 +3217,7 @@ function toggleResolvedInSlide(slides, slideIndex, commentId) {
|
|
|
3217
3217
|
if (!slide) {
|
|
3218
3218
|
return { slides, didUpdate: false };
|
|
3219
3219
|
}
|
|
3220
|
-
const next =
|
|
3220
|
+
const next = chunkSEJEVNXW_js.toggleCommentResolvedInList(slide.comments || [], commentId);
|
|
3221
3221
|
if (!next) {
|
|
3222
3222
|
return { slides, didUpdate: false };
|
|
3223
3223
|
}
|
|
@@ -3228,7 +3228,7 @@ function addReplyToSlide(slides, slideIndex, parentId, text, authorName, mention
|
|
|
3228
3228
|
if (!slide) {
|
|
3229
3229
|
return { slides, didAdd: false };
|
|
3230
3230
|
}
|
|
3231
|
-
const next =
|
|
3231
|
+
const next = chunkSEJEVNXW_js.replyToCommentInList(slide.comments || [], parentId, text, authorName);
|
|
3232
3232
|
if (!next) {
|
|
3233
3233
|
return { slides, didAdd: false };
|
|
3234
3234
|
}
|
|
@@ -3680,7 +3680,7 @@ function useViewerCoreState(_input) {
|
|
|
3680
3680
|
const marqueeStateRef = react.useRef(null);
|
|
3681
3681
|
const isDrawingRef = react.useRef(false);
|
|
3682
3682
|
const justInteractedRef = react.useRef(false);
|
|
3683
|
-
const livePatcher = react.useMemo(() =>
|
|
3683
|
+
const livePatcher = react.useMemo(() => chunkSEJEVNXW_js.createCollaborationLivePatcher(), []);
|
|
3684
3684
|
react.useEffect(() => () => livePatcher.dispose(), [livePatcher]);
|
|
3685
3685
|
const slidesRef = react.useRef([]);
|
|
3686
3686
|
const [mode, setMode] = react.useState("edit");
|
|
@@ -3689,8 +3689,8 @@ function useViewerCoreState(_input) {
|
|
|
3689
3689
|
const [slides, setSlides] = react.useState([]);
|
|
3690
3690
|
const [templateElementsBySlideId, setTemplateElementsBySlideId] = react.useState({});
|
|
3691
3691
|
const [canvasSize, setCanvasSize] = react.useState({
|
|
3692
|
-
width:
|
|
3693
|
-
height:
|
|
3692
|
+
width: chunkGKRE7272_js.DEFAULT_CANVAS_WIDTH,
|
|
3693
|
+
height: chunkGKRE7272_js.DEFAULT_CANVAS_HEIGHT
|
|
3694
3694
|
});
|
|
3695
3695
|
const [slideSizeEmu, setSlideSizeEmu] = react.useState();
|
|
3696
3696
|
const [activeSlideIndex, setActiveSlideIndex] = react.useState(0);
|
|
@@ -3711,7 +3711,7 @@ function useViewerCoreState(_input) {
|
|
|
3711
3711
|
const resolved = typeof value === "function" ? value(inlineEditingTextRef.current) : value;
|
|
3712
3712
|
inlineEditingTextRef.current = resolved;
|
|
3713
3713
|
setInlineEditingTextBase(value);
|
|
3714
|
-
|
|
3714
|
+
chunkSEJEVNXW_js.publishLiveInlineText(
|
|
3715
3715
|
livePatcher,
|
|
3716
3716
|
slidesRef.current[activeSlideIndexRef.current],
|
|
3717
3717
|
inlineEditingElementIdRef.current,
|
|
@@ -4065,7 +4065,7 @@ function useLoadContent({
|
|
|
4065
4065
|
);
|
|
4066
4066
|
}
|
|
4067
4067
|
const previousHandler = handlerRef.current;
|
|
4068
|
-
const handler = new
|
|
4068
|
+
const handler = new chunkSEJEVNXW_js.PptxHandler();
|
|
4069
4069
|
const parsed = await handler.load(buffer, { allowExternalImages });
|
|
4070
4070
|
if (cancelled || token !== renderTokenRef.current) {
|
|
4071
4071
|
handler.dispose();
|
|
@@ -4077,7 +4077,7 @@ function useLoadContent({
|
|
|
4077
4077
|
handlerRef.current = null;
|
|
4078
4078
|
const mediaElements = [];
|
|
4079
4079
|
for (const slide of parsed.slides) {
|
|
4080
|
-
|
|
4080
|
+
chunkSEJEVNXW_js.collectMediaElements(slide.elements, mediaElements);
|
|
4081
4081
|
}
|
|
4082
4082
|
for (const url of mediaDataUrls.values()) {
|
|
4083
4083
|
if (url.startsWith("blob:")) {
|
|
@@ -4118,7 +4118,7 @@ function useLoadContent({
|
|
|
4118
4118
|
}
|
|
4119
4119
|
})
|
|
4120
4120
|
);
|
|
4121
|
-
const { paths: imagePaths, refs: imageRefs } =
|
|
4121
|
+
const { paths: imagePaths, refs: imageRefs } = chunkSEJEVNXW_js.collectImagePaths(parsed.slides);
|
|
4122
4122
|
let nextSlides = parsed.slides;
|
|
4123
4123
|
if (imagePaths.size > 0) {
|
|
4124
4124
|
const resolvedMap = /* @__PURE__ */ new Map();
|
|
@@ -4134,25 +4134,25 @@ function useLoadContent({
|
|
|
4134
4134
|
})
|
|
4135
4135
|
);
|
|
4136
4136
|
nextSlides = parsed.slides.map((s) => {
|
|
4137
|
-
const newElements =
|
|
4137
|
+
const newElements = chunkSEJEVNXW_js.applyImagePathPatches(s.elements, resolvedMap, imageRefs);
|
|
4138
4138
|
return newElements === s.elements ? s : { ...s, elements: newElements };
|
|
4139
4139
|
});
|
|
4140
4140
|
}
|
|
4141
|
-
nextSlides = await
|
|
4141
|
+
nextSlides = await chunkSEJEVNXW_js.resolveTableCellImageUrls(
|
|
4142
4142
|
nextSlides,
|
|
4143
4143
|
(path) => handler.getImageData(path)
|
|
4144
4144
|
);
|
|
4145
|
-
const nextTableStyleMap = await
|
|
4145
|
+
const nextTableStyleMap = await chunkSEJEVNXW_js.resolveTableStyleImageUrls(
|
|
4146
4146
|
parsed.tableStyleMap,
|
|
4147
4147
|
(path) => handler.getImageData(path)
|
|
4148
4148
|
);
|
|
4149
4149
|
handlerRef.current = handler;
|
|
4150
|
-
const partition =
|
|
4150
|
+
const partition = chunkSEJEVNXW_js.partitionTemplateElements(nextSlides);
|
|
4151
4151
|
setSlides(partition.slides);
|
|
4152
4152
|
setTemplateElementsBySlideId(partition.templateElementsBySlideId);
|
|
4153
4153
|
setCanvasSize({
|
|
4154
|
-
width: parsed.width ??
|
|
4155
|
-
height: parsed.height ??
|
|
4154
|
+
width: parsed.width ?? chunkGKRE7272_js.DEFAULT_CANVAS_WIDTH,
|
|
4155
|
+
height: parsed.height ?? chunkGKRE7272_js.DEFAULT_CANVAS_HEIGHT
|
|
4156
4156
|
});
|
|
4157
4157
|
setSlideSizeEmu(
|
|
4158
4158
|
typeof parsed.widthEmu === "number" && typeof parsed.heightEmu === "number" && parsed.widthEmu > 0 && parsed.heightEmu > 0 ? {
|
|
@@ -4165,13 +4165,13 @@ function useLoadContent({
|
|
|
4165
4165
|
setLayoutOptions(parsed.layoutOptions ?? []);
|
|
4166
4166
|
setSlideMasters(parsed.slideMasters ?? []);
|
|
4167
4167
|
setModernCommentAuthors(parsed.modernCommentAuthors ?? []);
|
|
4168
|
-
setRecentColors(
|
|
4168
|
+
setRecentColors(chunkSEJEVNXW_js.seedRecentColors({ mruColors: parsed.mruColors }));
|
|
4169
4169
|
setTheme(parsed.theme);
|
|
4170
4170
|
setTableStyleMap(nextTableStyleMap);
|
|
4171
4171
|
setThemeOptions(parsed.themeOptions ?? []);
|
|
4172
4172
|
setCustomShows(parsed.customShows ?? []);
|
|
4173
4173
|
setActiveCustomShowId(
|
|
4174
|
-
|
|
4174
|
+
chunkSEJEVNXW_js.resolveAuthoredCustomShowId(parsed.presentationProperties, parsed.customShows) ?? null
|
|
4175
4175
|
);
|
|
4176
4176
|
setSections(parsed.sections ?? []);
|
|
4177
4177
|
setPresentationProperties(parsed.presentationProperties ?? {});
|
|
@@ -4194,10 +4194,10 @@ function useLoadContent({
|
|
|
4194
4194
|
setHasMacros(parsed.hasMacros === true);
|
|
4195
4195
|
setHasDigitalSignatures(parsed.hasDigitalSignatures === true);
|
|
4196
4196
|
setDigitalSignatureCount(parsed.digitalSignatureCount ?? 0);
|
|
4197
|
-
setGuides(
|
|
4198
|
-
setReadOnlyRecommendation(
|
|
4197
|
+
setGuides(chunkSEJEVNXW_js.buildInitialGuides(parsed.presentationGuides, parsed.slides[0]?.guides));
|
|
4198
|
+
setReadOnlyRecommendation(chunkSEJEVNXW_js.readOnlyRecommendation(parsed));
|
|
4199
4199
|
setCompatToasts(
|
|
4200
|
-
|
|
4200
|
+
chunkSEJEVNXW_js.compatibilityWarningToasts([
|
|
4201
4201
|
...parsed.warnings ?? [],
|
|
4202
4202
|
...parsed.slides.flatMap((slide) => slide.warnings ?? [])
|
|
4203
4203
|
])
|
|
@@ -4209,7 +4209,7 @@ function useLoadContent({
|
|
|
4209
4209
|
onContentApplied?.();
|
|
4210
4210
|
} catch (err) {
|
|
4211
4211
|
if (!cancelled && token === renderTokenRef.current) {
|
|
4212
|
-
if (err instanceof
|
|
4212
|
+
if (err instanceof chunkSEJEVNXW_js.EncryptedFileError) {
|
|
4213
4213
|
setIsEncrypted(true);
|
|
4214
4214
|
} else {
|
|
4215
4215
|
console.error("[pptx] Failed to load presentation content:", err);
|
|
@@ -4237,7 +4237,7 @@ function useLoadContent({
|
|
|
4237
4237
|
}
|
|
4238
4238
|
function useAutosave(input) {
|
|
4239
4239
|
const { isDirty, filePath, serializeSlides, enabled = true, getChangeSources } = input;
|
|
4240
|
-
const intervalMs =
|
|
4240
|
+
const intervalMs = chunkSEJEVNXW_js.resolveAutosaveIntervalMs({
|
|
4241
4241
|
hostIntervalMs: input.intervalMs,
|
|
4242
4242
|
optionsIntervalSeconds: input.intervalSeconds
|
|
4243
4243
|
});
|
|
@@ -4268,7 +4268,7 @@ function useAutosave(input) {
|
|
|
4268
4268
|
return;
|
|
4269
4269
|
}
|
|
4270
4270
|
const sources = changeSourcesRef.current?.() ?? [];
|
|
4271
|
-
if (!
|
|
4271
|
+
if (!chunkSEJEVNXW_js.shouldWriteAutosaveSnapshot({
|
|
4272
4272
|
filePath: path,
|
|
4273
4273
|
isDirty: isDirtyRef.current,
|
|
4274
4274
|
saving: isSavingRef.current,
|
|
@@ -4286,8 +4286,8 @@ function useAutosave(input) {
|
|
|
4286
4286
|
isSavingRef.current = false;
|
|
4287
4287
|
return;
|
|
4288
4288
|
}
|
|
4289
|
-
await
|
|
4290
|
-
lastSnapshotRef.current =
|
|
4289
|
+
await chunkSEJEVNXW_js.saveAutosaveSnapshot(path, data);
|
|
4290
|
+
lastSnapshotRef.current = chunkSEJEVNXW_js.autosaveSnapshotMark(path, sources);
|
|
4291
4291
|
setAutosaveStatus({ state: "saved", timestamp: Date.now() });
|
|
4292
4292
|
} catch (err) {
|
|
4293
4293
|
setAutosaveStatus({
|
|
@@ -4373,11 +4373,11 @@ function useElementOperations(input) {
|
|
|
4373
4373
|
(elementId, updates) => {
|
|
4374
4374
|
if (masterView?.target) {
|
|
4375
4375
|
applyMasterViewWrite(
|
|
4376
|
-
|
|
4376
|
+
chunkSEJEVNXW_js.updateMasterViewElement(masterView, masterView.target, elementId, updates)
|
|
4377
4377
|
);
|
|
4378
4378
|
return;
|
|
4379
4379
|
}
|
|
4380
|
-
if (
|
|
4380
|
+
if (chunkSEJEVNXW_js.isTemplateElementId(elementId)) {
|
|
4381
4381
|
const slideId = activeSlide?.id;
|
|
4382
4382
|
if (slideId) {
|
|
4383
4383
|
setTemplateElementsBySlideId((prev) => ({
|
|
@@ -4388,7 +4388,7 @@ function useElementOperations(input) {
|
|
|
4388
4388
|
}));
|
|
4389
4389
|
}
|
|
4390
4390
|
} else {
|
|
4391
|
-
setSlides((prev) =>
|
|
4391
|
+
setSlides((prev) => chunkSEJEVNXW_js.updateElement(prev, activeSlideIndex, elementId, updates));
|
|
4392
4392
|
}
|
|
4393
4393
|
history.markDirty();
|
|
4394
4394
|
},
|
|
@@ -4413,7 +4413,7 @@ function useElementOperations(input) {
|
|
|
4413
4413
|
);
|
|
4414
4414
|
const updateSelectedShapeStyle = react.useCallback(
|
|
4415
4415
|
(updates) => {
|
|
4416
|
-
if (!selectedElement || !
|
|
4416
|
+
if (!selectedElement || !chunkSEJEVNXW_js.hasShapeProperties(selectedElement)) {
|
|
4417
4417
|
return;
|
|
4418
4418
|
}
|
|
4419
4419
|
updateSelectedElement({
|
|
@@ -4424,17 +4424,17 @@ function useElementOperations(input) {
|
|
|
4424
4424
|
);
|
|
4425
4425
|
const updateSelectedTextStyle = react.useCallback(
|
|
4426
4426
|
(updates) => {
|
|
4427
|
-
if (!selectedElement || !
|
|
4427
|
+
if (!selectedElement || !chunkSEJEVNXW_js.hasTextProperties(selectedElement)) {
|
|
4428
4428
|
return;
|
|
4429
4429
|
}
|
|
4430
|
-
const inlineSel =
|
|
4430
|
+
const inlineSel = chunkSEJEVNXW_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
4431
4431
|
if (inlineSel && selectedElement.textSegments) {
|
|
4432
|
-
const { newSegments: newSegments2, newSelection } =
|
|
4432
|
+
const { newSegments: newSegments2, newSelection } = chunkSEJEVNXW_js.applyStyleToSelectedSegments(
|
|
4433
4433
|
selectedElement.textSegments,
|
|
4434
4434
|
inlineSel,
|
|
4435
4435
|
updates
|
|
4436
4436
|
);
|
|
4437
|
-
|
|
4437
|
+
chunkSEJEVNXW_js.setPendingSelectionRestore(newSelection);
|
|
4438
4438
|
updateSelectedElement({
|
|
4439
4439
|
textSegments: newSegments2
|
|
4440
4440
|
});
|
|
@@ -4454,12 +4454,12 @@ function useElementOperations(input) {
|
|
|
4454
4454
|
);
|
|
4455
4455
|
const updateSelectedTextCase = react.useCallback(
|
|
4456
4456
|
(mode) => {
|
|
4457
|
-
if (!selectedElement || !
|
|
4457
|
+
if (!selectedElement || !chunkSEJEVNXW_js.hasTextProperties(selectedElement)) {
|
|
4458
4458
|
return;
|
|
4459
4459
|
}
|
|
4460
|
-
const inlineSel =
|
|
4460
|
+
const inlineSel = chunkSEJEVNXW_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
4461
4461
|
if (inlineSel && selectedElement.textSegments) {
|
|
4462
|
-
const newSegments =
|
|
4462
|
+
const newSegments = chunkSEJEVNXW_js.applyCaseTransformToSegments(
|
|
4463
4463
|
selectedElement.textSegments,
|
|
4464
4464
|
inlineSel,
|
|
4465
4465
|
mode
|
|
@@ -4469,14 +4469,14 @@ function useElementOperations(input) {
|
|
|
4469
4469
|
}
|
|
4470
4470
|
const updates = {};
|
|
4471
4471
|
if (selectedElement.textSegments && selectedElement.textSegments.length > 0) {
|
|
4472
|
-
updates.textSegments =
|
|
4472
|
+
updates.textSegments = chunkSEJEVNXW_js.applyCaseTransformToSegments(
|
|
4473
4473
|
selectedElement.textSegments,
|
|
4474
4474
|
null,
|
|
4475
4475
|
mode
|
|
4476
4476
|
);
|
|
4477
4477
|
}
|
|
4478
4478
|
if (typeof selectedElement.text === "string") {
|
|
4479
|
-
updates.text =
|
|
4479
|
+
updates.text = chunkSEJEVNXW_js.transformTextCase(selectedElement.text, mode);
|
|
4480
4480
|
}
|
|
4481
4481
|
updateSelectedElement(updates);
|
|
4482
4482
|
},
|
|
@@ -4489,15 +4489,15 @@ function useElementOperations(input) {
|
|
|
4489
4489
|
[setSlides]
|
|
4490
4490
|
);
|
|
4491
4491
|
const masterViewTarget = masterView?.target ?? null;
|
|
4492
|
-
const activeElements = masterViewTarget ?
|
|
4492
|
+
const activeElements = masterViewTarget ? chunkSEJEVNXW_js.masterViewElements(masterView, masterViewTarget) : editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
4493
4493
|
const updateActiveElements = react.useCallback(
|
|
4494
4494
|
(updater) => {
|
|
4495
4495
|
if (masterView?.target) {
|
|
4496
4496
|
applyMasterViewWrite(
|
|
4497
|
-
|
|
4497
|
+
chunkSEJEVNXW_js.replaceMasterViewElements(
|
|
4498
4498
|
masterView,
|
|
4499
4499
|
masterView.target,
|
|
4500
|
-
updater(
|
|
4500
|
+
updater(chunkSEJEVNXW_js.masterViewElements(masterView, masterView.target))
|
|
4501
4501
|
)
|
|
4502
4502
|
);
|
|
4503
4503
|
return;
|
|
@@ -4550,7 +4550,7 @@ function useSectionOperations(input) {
|
|
|
4550
4550
|
const { sections, setSections, slides, setSlides, markDirty } = input;
|
|
4551
4551
|
const addSection2 = react.useCallback(
|
|
4552
4552
|
(name, afterSlideIndex) => {
|
|
4553
|
-
const result =
|
|
4553
|
+
const result = chunkSEJEVNXW_js.addSection(sections, slides, name, afterSlideIndex);
|
|
4554
4554
|
setSlides(result.slides);
|
|
4555
4555
|
setSections(result.sections);
|
|
4556
4556
|
markDirty();
|
|
@@ -4559,7 +4559,7 @@ function useSectionOperations(input) {
|
|
|
4559
4559
|
);
|
|
4560
4560
|
const renameSection2 = react.useCallback(
|
|
4561
4561
|
(sectionId, newName) => {
|
|
4562
|
-
const result =
|
|
4562
|
+
const result = chunkSEJEVNXW_js.renameSection(sections, slides, sectionId, newName);
|
|
4563
4563
|
setSections(result.sections);
|
|
4564
4564
|
setSlides(result.slides);
|
|
4565
4565
|
markDirty();
|
|
@@ -4568,7 +4568,7 @@ function useSectionOperations(input) {
|
|
|
4568
4568
|
);
|
|
4569
4569
|
const deleteSection2 = react.useCallback(
|
|
4570
4570
|
(sectionId) => {
|
|
4571
|
-
const result =
|
|
4571
|
+
const result = chunkSEJEVNXW_js.deleteSection(sections, slides, sectionId);
|
|
4572
4572
|
setSections(result.sections);
|
|
4573
4573
|
setSlides(result.slides);
|
|
4574
4574
|
markDirty();
|
|
@@ -4577,21 +4577,21 @@ function useSectionOperations(input) {
|
|
|
4577
4577
|
);
|
|
4578
4578
|
const moveSectionUp2 = react.useCallback(
|
|
4579
4579
|
(sectionId) => {
|
|
4580
|
-
setSections(
|
|
4580
|
+
setSections(chunkSEJEVNXW_js.moveSectionUp(sections, sectionId));
|
|
4581
4581
|
markDirty();
|
|
4582
4582
|
},
|
|
4583
4583
|
[sections, setSections, markDirty]
|
|
4584
4584
|
);
|
|
4585
4585
|
const moveSectionDown2 = react.useCallback(
|
|
4586
4586
|
(sectionId) => {
|
|
4587
|
-
setSections(
|
|
4587
|
+
setSections(chunkSEJEVNXW_js.moveSectionDown(sections, sectionId));
|
|
4588
4588
|
markDirty();
|
|
4589
4589
|
},
|
|
4590
4590
|
[sections, setSections, markDirty]
|
|
4591
4591
|
);
|
|
4592
4592
|
const moveSlidesToSection2 = react.useCallback(
|
|
4593
4593
|
(slideIndexes, targetSectionId) => {
|
|
4594
|
-
const result =
|
|
4594
|
+
const result = chunkSEJEVNXW_js.moveSlidesToSection(sections, slides, slideIndexes, targetSectionId);
|
|
4595
4595
|
setSlides(result.slides);
|
|
4596
4596
|
setSections(result.sections);
|
|
4597
4597
|
markDirty();
|
|
@@ -4657,15 +4657,15 @@ function syncSelectionHandleOverlay(elementNode, elementId, geometry) {
|
|
|
4657
4657
|
// src/viewer/hooks/pointer-move-handlers.ts
|
|
4658
4658
|
function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx, lockAspect = false) {
|
|
4659
4659
|
const startBox = { x: startX, y: startY, width: startWidth, height: startHeight };
|
|
4660
|
-
let resized =
|
|
4660
|
+
let resized = chunkSEJEVNXW_js.applyResize(startBox, handle, dx, dy, 1, { minSize: chunkGKRE7272_js.MIN_ELEMENT_SIZE });
|
|
4661
4661
|
if (lockAspect) {
|
|
4662
|
-
resized =
|
|
4662
|
+
resized = chunkSEJEVNXW_js.lockResizeAspect(resized, startBox, handle, chunkGKRE7272_js.MIN_ELEMENT_SIZE);
|
|
4663
4663
|
}
|
|
4664
4664
|
const box = { x: resized.x, y: resized.y, width: resized.width, height: resized.height };
|
|
4665
4665
|
if (!snapToGrid) {
|
|
4666
4666
|
return box;
|
|
4667
4667
|
}
|
|
4668
|
-
return
|
|
4668
|
+
return chunkSEJEVNXW_js.snapBoxToGrid(box, handle, gridSpacingPx, chunkGKRE7272_js.MIN_ELEMENT_SIZE);
|
|
4669
4669
|
}
|
|
4670
4670
|
function resolveLiveTarget(input) {
|
|
4671
4671
|
const { livePatcher, editTemplateMode, activeSlide } = input;
|
|
@@ -4778,7 +4778,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4778
4778
|
width: el.width,
|
|
4779
4779
|
height: el.height
|
|
4780
4780
|
}));
|
|
4781
|
-
const snapResult =
|
|
4781
|
+
const snapResult = chunkSEJEVNXW_js.computeSnapToShape(
|
|
4782
4782
|
targetX,
|
|
4783
4783
|
targetY,
|
|
4784
4784
|
primaryEl.width,
|
|
@@ -4820,7 +4820,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4820
4820
|
if (live) {
|
|
4821
4821
|
for (const id of Object.keys(drag.startPositionsById)) {
|
|
4822
4822
|
const start = drag.startPositionsById[id];
|
|
4823
|
-
|
|
4823
|
+
chunkSEJEVNXW_js.publishLiveGeometry(live.patcher, live.slideId, id, {
|
|
4824
4824
|
x: start.x + appliedDx,
|
|
4825
4825
|
y: start.y + appliedDy
|
|
4826
4826
|
});
|
|
@@ -4852,8 +4852,8 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4852
4852
|
rs.lastY = geo.y;
|
|
4853
4853
|
rs.lastWidth = geo.width;
|
|
4854
4854
|
rs.lastHeight = geo.height;
|
|
4855
|
-
const width = Math.max(geo.width,
|
|
4856
|
-
const height = Math.max(geo.height,
|
|
4855
|
+
const width = Math.max(geo.width, chunkGKRE7272_js.MIN_ELEMENT_SIZE);
|
|
4856
|
+
const height = Math.max(geo.height, chunkGKRE7272_js.MIN_ELEMENT_SIZE);
|
|
4857
4857
|
if (rs.domEl) {
|
|
4858
4858
|
rs.domEl.style.left = `${geo.x}px`;
|
|
4859
4859
|
rs.domEl.style.top = `${geo.y}px`;
|
|
@@ -4862,7 +4862,7 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4862
4862
|
syncSelectionHandleOverlay(rs.domEl, rs.elementId, { x: geo.x, y: geo.y, width, height });
|
|
4863
4863
|
}
|
|
4864
4864
|
if (live) {
|
|
4865
|
-
|
|
4865
|
+
chunkSEJEVNXW_js.publishLiveGeometry(live.patcher, live.slideId, rs.elementId, {
|
|
4866
4866
|
x: geo.x,
|
|
4867
4867
|
y: geo.y,
|
|
4868
4868
|
width,
|
|
@@ -4873,7 +4873,7 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4873
4873
|
function processAdjustmentMove(e, adj, editorScale, updateElementById) {
|
|
4874
4874
|
const dx = (e.clientX - adj.startClientX) / editorScale;
|
|
4875
4875
|
const dy = (e.clientY - adj.startClientY) / editorScale;
|
|
4876
|
-
const adjustments =
|
|
4876
|
+
const adjustments = chunkSEJEVNXW_js.getDraggedShapeAdjustments(adj, dx, dy);
|
|
4877
4877
|
if (!adj.moved && Math.hypot(dx, dy) > 2) {
|
|
4878
4878
|
adj.moved = true;
|
|
4879
4879
|
}
|
|
@@ -4948,13 +4948,13 @@ function processPointerUp(input) {
|
|
|
4948
4948
|
if (i !== activeSlideIndex) {
|
|
4949
4949
|
return s;
|
|
4950
4950
|
}
|
|
4951
|
-
const rerouted =
|
|
4951
|
+
const rerouted = chunkSEJEVNXW_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
|
|
4952
4952
|
if (rerouted.length === 0) {
|
|
4953
4953
|
return s;
|
|
4954
4954
|
}
|
|
4955
4955
|
return {
|
|
4956
4956
|
...s,
|
|
4957
|
-
elements:
|
|
4957
|
+
elements: chunkSEJEVNXW_js.applyReroutedConnectors(s.elements, rerouted)
|
|
4958
4958
|
};
|
|
4959
4959
|
})
|
|
4960
4960
|
);
|
|
@@ -4979,9 +4979,9 @@ function processPointerUp(input) {
|
|
|
4979
4979
|
}
|
|
4980
4980
|
function commitMarquee(marquee, editTemplateMode, templateElements, activeSlide, applySelection, clearSelection) {
|
|
4981
4981
|
const sourceElements = editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
4982
|
-
const hitIds =
|
|
4982
|
+
const hitIds = chunkSEJEVNXW_js.computeMarqueeHitIds(marquee, sourceElements);
|
|
4983
4983
|
if (marquee.additive) {
|
|
4984
|
-
const merged =
|
|
4984
|
+
const merged = chunkSEJEVNXW_js.mergeAdditiveSelection(marquee.baseSelectionIds, hitIds);
|
|
4985
4985
|
if (merged.length > 0) {
|
|
4986
4986
|
applySelection(merged[0], merged);
|
|
4987
4987
|
} else {
|
|
@@ -5004,8 +5004,8 @@ function commitDrag(drag, editTemplateMode, activeSlide, activeSlideIndex, setTe
|
|
|
5004
5004
|
}
|
|
5005
5005
|
return { ...el, x: start.x + dx, y: start.y + dy };
|
|
5006
5006
|
});
|
|
5007
|
-
const rerouted =
|
|
5008
|
-
return
|
|
5007
|
+
const rerouted = chunkSEJEVNXW_js.rerouteConnectorsForMovedElements(movedElements, movedIds);
|
|
5008
|
+
return chunkSEJEVNXW_js.applyReroutedConnectors(movedElements, rerouted);
|
|
5009
5009
|
};
|
|
5010
5010
|
if (editTemplateMode) {
|
|
5011
5011
|
const slideId = activeSlide?.id;
|
|
@@ -5161,11 +5161,11 @@ function useCanvasInteractions(input) {
|
|
|
5161
5161
|
return;
|
|
5162
5162
|
}
|
|
5163
5163
|
const el = elementLookup.get(editId);
|
|
5164
|
-
if (el &&
|
|
5164
|
+
if (el && chunkSEJEVNXW_js.hasTextProperties(el)) {
|
|
5165
5165
|
const committedText = transformCommittedText ? transformCommittedText(inlineEditingText) : inlineEditingText;
|
|
5166
|
-
const newSegments =
|
|
5166
|
+
const newSegments = chunkSEJEVNXW_js.remapTextToSegments(committedText, el.textSegments, el.textStyle);
|
|
5167
5167
|
const editorEl = document.querySelector("[data-inline-editor]");
|
|
5168
|
-
const newHeight =
|
|
5168
|
+
const newHeight = chunkSEJEVNXW_js.resolveInlineEditAutoFitHeight(el.textStyle, el.height, editorEl);
|
|
5169
5169
|
ops.updateElementById(editId, {
|
|
5170
5170
|
text: committedText,
|
|
5171
5171
|
textSegments: newSegments,
|
|
@@ -5177,7 +5177,7 @@ function useCanvasInteractions(input) {
|
|
|
5177
5177
|
setInlineEditingText("");
|
|
5178
5178
|
};
|
|
5179
5179
|
const openEquationEditorForElement = (el) => {
|
|
5180
|
-
if (!
|
|
5180
|
+
if (!chunkSEJEVNXW_js.hasTextProperties(el)) {
|
|
5181
5181
|
return false;
|
|
5182
5182
|
}
|
|
5183
5183
|
const eqSeg = el.textSegments?.find((seg) => seg.equationXml);
|
|
@@ -5207,7 +5207,7 @@ function useCanvasInteractions(input) {
|
|
|
5207
5207
|
justInteractedRef.current = false;
|
|
5208
5208
|
} else {
|
|
5209
5209
|
const el = elementLookup.get(elementId);
|
|
5210
|
-
if (el &&
|
|
5210
|
+
if (el && chunkSEJEVNXW_js.hasTextProperties(el) && chunkSEJEVNXW_js.canInteractWithElement(el, "textEdit")) {
|
|
5211
5211
|
if (!openEquationEditorForElement(el)) {
|
|
5212
5212
|
setInlineEditingElementId(elementId);
|
|
5213
5213
|
setInlineEditingText(el.text ?? "");
|
|
@@ -5226,7 +5226,7 @@ function useCanvasInteractions(input) {
|
|
|
5226
5226
|
if (openEquationEditorForElement(el)) {
|
|
5227
5227
|
return;
|
|
5228
5228
|
}
|
|
5229
|
-
if (
|
|
5229
|
+
if (chunkSEJEVNXW_js.hasTextProperties(el) && chunkSEJEVNXW_js.canInteractWithElement(el, "textEdit")) {
|
|
5230
5230
|
setInlineEditingElementId(elementId);
|
|
5231
5231
|
setInlineEditingText(el.text ?? "");
|
|
5232
5232
|
}
|
|
@@ -5249,7 +5249,7 @@ function useCanvasInteractions(input) {
|
|
|
5249
5249
|
justSelectedRef.current = false;
|
|
5250
5250
|
}
|
|
5251
5251
|
const ids = !wasSelected ? [elementId] : effectiveSelectedIds.length ? effectiveSelectedIds : [elementId];
|
|
5252
|
-
const movableIds =
|
|
5252
|
+
const movableIds = chunkSEJEVNXW_js.filterInteractableIds(ids, (id) => elementLookup.get(id), "move");
|
|
5253
5253
|
if (movableIds.length === 0) {
|
|
5254
5254
|
return;
|
|
5255
5255
|
}
|
|
@@ -5319,7 +5319,7 @@ function useCanvasInteractions(input) {
|
|
|
5319
5319
|
const handleResizePointerDown = (elementId, e, handle) => {
|
|
5320
5320
|
e.stopPropagation();
|
|
5321
5321
|
const el = elementLookup.get(elementId);
|
|
5322
|
-
if (!el || !
|
|
5322
|
+
if (!el || !chunkSEJEVNXW_js.canInteractWithElement(el, "resize")) {
|
|
5323
5323
|
return;
|
|
5324
5324
|
}
|
|
5325
5325
|
resizeStateRef.current = {
|
|
@@ -5341,7 +5341,7 @@ function useCanvasInteractions(input) {
|
|
|
5341
5341
|
};
|
|
5342
5342
|
const handleRotate = (elementId, rotationDeg) => {
|
|
5343
5343
|
const el = elementLookup.get(elementId);
|
|
5344
|
-
if (!el || !
|
|
5344
|
+
if (!el || !chunkSEJEVNXW_js.canInteractWithElement(el, "rotate")) {
|
|
5345
5345
|
return;
|
|
5346
5346
|
}
|
|
5347
5347
|
ops.updateElementById(elementId, { rotation: rotationDeg });
|
|
@@ -5361,10 +5361,10 @@ function useCanvasInteractions(input) {
|
|
|
5361
5361
|
const handleAdjustmentPointerDown = (elementId, e, descriptor) => {
|
|
5362
5362
|
e.stopPropagation();
|
|
5363
5363
|
const el = elementLookup.get(elementId);
|
|
5364
|
-
if (!el || !
|
|
5364
|
+
if (!el || !chunkSEJEVNXW_js.canInteractWithElement(el, "adjustHandle")) {
|
|
5365
5365
|
return;
|
|
5366
5366
|
}
|
|
5367
|
-
shapeAdjustmentDragStateRef.current =
|
|
5367
|
+
shapeAdjustmentDragStateRef.current = chunkSEJEVNXW_js.beginShapeAdjustment(
|
|
5368
5368
|
el,
|
|
5369
5369
|
descriptor,
|
|
5370
5370
|
e.clientX,
|
|
@@ -5411,7 +5411,7 @@ function createFileHandlers(deps) {
|
|
|
5411
5411
|
h = Math.round(h * scale);
|
|
5412
5412
|
}
|
|
5413
5413
|
addElement({
|
|
5414
|
-
id:
|
|
5414
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
5415
5415
|
type: "image",
|
|
5416
5416
|
x: Math.round((canvasSize.width - w) / 2),
|
|
5417
5417
|
y: Math.round((canvasSize.height - h) / 2),
|
|
@@ -5422,7 +5422,7 @@ function createFileHandlers(deps) {
|
|
|
5422
5422
|
};
|
|
5423
5423
|
img.onerror = () => {
|
|
5424
5424
|
addElement({
|
|
5425
|
-
id:
|
|
5425
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
5426
5426
|
type: "image",
|
|
5427
5427
|
x: 100,
|
|
5428
5428
|
y: 100,
|
|
@@ -5441,14 +5441,14 @@ function createFileHandlers(deps) {
|
|
|
5441
5441
|
return;
|
|
5442
5442
|
}
|
|
5443
5443
|
e.target.value = "";
|
|
5444
|
-
const mediaType =
|
|
5444
|
+
const mediaType = chunkSEJEVNXW_js.classifyMediaType(file.type);
|
|
5445
5445
|
if (!mediaType) {
|
|
5446
5446
|
return;
|
|
5447
5447
|
}
|
|
5448
5448
|
const elFilePath = file.path;
|
|
5449
5449
|
const insertMediaElement = (mediaSourceUrl, width, height) => {
|
|
5450
5450
|
addElement({
|
|
5451
|
-
id:
|
|
5451
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
5452
5452
|
type: "media",
|
|
5453
5453
|
mediaType,
|
|
5454
5454
|
mediaMimeType: file.type || void 0,
|
|
@@ -5623,13 +5623,13 @@ function createStructuredElementHandlers(deps) {
|
|
|
5623
5623
|
return;
|
|
5624
5624
|
}
|
|
5625
5625
|
addElement({
|
|
5626
|
-
id:
|
|
5626
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
5627
5627
|
type: "smartArt",
|
|
5628
5628
|
x: 100,
|
|
5629
5629
|
y: 120,
|
|
5630
5630
|
width: 600,
|
|
5631
5631
|
height: 340,
|
|
5632
|
-
smartArtData:
|
|
5632
|
+
smartArtData: chunkSEJEVNXW_js.buildSmartArtPresetData(
|
|
5633
5633
|
layout,
|
|
5634
5634
|
defaultItems,
|
|
5635
5635
|
(i) => `node-${Date.now()}-${i}-${Math.random().toString(36).slice(2, 8)}`
|
|
@@ -5641,7 +5641,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5641
5641
|
return;
|
|
5642
5642
|
}
|
|
5643
5643
|
addElement({
|
|
5644
|
-
id:
|
|
5644
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
5645
5645
|
type: "shape",
|
|
5646
5646
|
x: 120,
|
|
5647
5647
|
y: 200,
|
|
@@ -5679,7 +5679,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5679
5679
|
return;
|
|
5680
5680
|
}
|
|
5681
5681
|
const resolved = resolveHyperlinkEditResult(data);
|
|
5682
|
-
if (resolved.url && !
|
|
5682
|
+
if (resolved.url && !chunkSEJEVNXW_js.isUrlSafe(resolved.url)) {
|
|
5683
5683
|
return;
|
|
5684
5684
|
}
|
|
5685
5685
|
const actionClick = {
|
|
@@ -5703,7 +5703,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5703
5703
|
const displayText = value || fieldTexts[fieldType] || fieldType;
|
|
5704
5704
|
const fieldGuid = `{${crypto.randomUUID().toUpperCase()}}`;
|
|
5705
5705
|
addElement({
|
|
5706
|
-
id:
|
|
5706
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
5707
5707
|
type: "shape",
|
|
5708
5708
|
x: 120,
|
|
5709
5709
|
y: 200,
|
|
@@ -5725,11 +5725,11 @@ function createStructuredElementHandlers(deps) {
|
|
|
5725
5725
|
if (!activeSlide) {
|
|
5726
5726
|
return;
|
|
5727
5727
|
}
|
|
5728
|
-
const preset =
|
|
5728
|
+
const preset = chunkSEJEVNXW_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
|
|
5729
5729
|
if (!preset) {
|
|
5730
5730
|
return;
|
|
5731
5731
|
}
|
|
5732
|
-
const defaultPptxAction =
|
|
5732
|
+
const defaultPptxAction = chunkSEJEVNXW_js.elementActionToPptxAction({
|
|
5733
5733
|
trigger: "click",
|
|
5734
5734
|
type: preset.defaultAction
|
|
5735
5735
|
});
|
|
@@ -5738,7 +5738,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5738
5738
|
defaultPptxAction.highlightClick = true;
|
|
5739
5739
|
}
|
|
5740
5740
|
addElement({
|
|
5741
|
-
id:
|
|
5741
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
5742
5742
|
type: "shape",
|
|
5743
5743
|
x: 150,
|
|
5744
5744
|
y: 150,
|
|
@@ -5805,14 +5805,14 @@ function useInsertElements(input) {
|
|
|
5805
5805
|
return;
|
|
5806
5806
|
}
|
|
5807
5807
|
addElement({
|
|
5808
|
-
id:
|
|
5808
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
5809
5809
|
type: "text",
|
|
5810
5810
|
x: 100,
|
|
5811
5811
|
y: 100,
|
|
5812
5812
|
width: 300,
|
|
5813
5813
|
height: 60,
|
|
5814
5814
|
text: "",
|
|
5815
|
-
textStyle: { fontSize:
|
|
5815
|
+
textStyle: { fontSize: chunkGKRE7272_js.DEFAULT_TEXT_FONT_SIZE }
|
|
5816
5816
|
});
|
|
5817
5817
|
};
|
|
5818
5818
|
const handleAddShape = () => {
|
|
@@ -5820,7 +5820,7 @@ function useInsertElements(input) {
|
|
|
5820
5820
|
return;
|
|
5821
5821
|
}
|
|
5822
5822
|
addElement({
|
|
5823
|
-
id:
|
|
5823
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
5824
5824
|
type: "shape",
|
|
5825
5825
|
x: 150,
|
|
5826
5826
|
y: 150,
|
|
@@ -5839,15 +5839,15 @@ function useInsertElements(input) {
|
|
|
5839
5839
|
return;
|
|
5840
5840
|
}
|
|
5841
5841
|
addElement({
|
|
5842
|
-
...
|
|
5843
|
-
id:
|
|
5842
|
+
...chunkSEJEVNXW_js.newTableElement(chunkGKRE7272_js.DEFAULT_TABLE_ROWS, chunkGKRE7272_js.DEFAULT_TABLE_COLUMNS, 100, 200),
|
|
5843
|
+
id: chunkSEJEVNXW_js.generateElementId()
|
|
5844
5844
|
});
|
|
5845
5845
|
};
|
|
5846
5846
|
const handleAddChart = (chartKind) => {
|
|
5847
5847
|
if (!activeSlide) {
|
|
5848
5848
|
return;
|
|
5849
5849
|
}
|
|
5850
|
-
addElement(
|
|
5850
|
+
addElement(chunkSEJEVNXW_js.createDefaultChartElement(chartKind));
|
|
5851
5851
|
};
|
|
5852
5852
|
const structured = createStructuredElementHandlers({
|
|
5853
5853
|
activeSlide,
|
|
@@ -5917,7 +5917,7 @@ function useClipboardHandlers(input) {
|
|
|
5917
5917
|
if (!selectedElement) {
|
|
5918
5918
|
return;
|
|
5919
5919
|
}
|
|
5920
|
-
setClipboardPayload(
|
|
5920
|
+
setClipboardPayload(chunkSEJEVNXW_js.buildElementClipboardPayload(selectedElement, editTemplateMode));
|
|
5921
5921
|
};
|
|
5922
5922
|
const handleDelete = () => {
|
|
5923
5923
|
const idsToDelete = effectiveSelectedIds;
|
|
@@ -5934,7 +5934,7 @@ function useClipboardHandlers(input) {
|
|
|
5934
5934
|
handleDelete();
|
|
5935
5935
|
};
|
|
5936
5936
|
const insertClone = (source) => {
|
|
5937
|
-
const clone =
|
|
5937
|
+
const clone = chunkSEJEVNXW_js.cloneElementForPaste(source, { intoTemplate: editTemplateMode });
|
|
5938
5938
|
ops.updateActiveElements((els) => [...els, clone]);
|
|
5939
5939
|
ops.applySelection(clone.id);
|
|
5940
5940
|
history.markDirty();
|
|
@@ -5969,7 +5969,7 @@ function resolveShapePath(el) {
|
|
|
5969
5969
|
return el.pathData;
|
|
5970
5970
|
}
|
|
5971
5971
|
if ("shapeType" in el && typeof el.shapeType === "string") {
|
|
5972
|
-
const clipPath =
|
|
5972
|
+
const clipPath = chunkSEJEVNXW_js.getPresetShapeClipPath(el.shapeType);
|
|
5973
5973
|
if (clipPath) {
|
|
5974
5974
|
const svgPath = clipPathToSvgPath(clipPath, el.width, el.height);
|
|
5975
5975
|
if (svgPath) {
|
|
@@ -6020,7 +6020,7 @@ function clipPathToSvgPath(clipPath, width, height) {
|
|
|
6020
6020
|
return parts.join(" ");
|
|
6021
6021
|
}
|
|
6022
6022
|
function transformPathToGlobal(pathData, el) {
|
|
6023
|
-
const polys =
|
|
6023
|
+
const polys = chunkSEJEVNXW_js.svgPathToPolygons(pathData);
|
|
6024
6024
|
if (polys.length === 0) {
|
|
6025
6025
|
return pathData;
|
|
6026
6026
|
}
|
|
@@ -6040,10 +6040,10 @@ function transformPathToGlobal(pathData, el) {
|
|
|
6040
6040
|
y: pt.y * scaleY + el.y
|
|
6041
6041
|
}))
|
|
6042
6042
|
);
|
|
6043
|
-
return
|
|
6043
|
+
return chunkSEJEVNXW_js.polygonsToSvgPath(transformed);
|
|
6044
6044
|
}
|
|
6045
6045
|
function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
6046
|
-
const polys =
|
|
6046
|
+
const polys = chunkSEJEVNXW_js.svgPathToPolygons(pathData);
|
|
6047
6047
|
if (polys.length === 0) {
|
|
6048
6048
|
return pathData;
|
|
6049
6049
|
}
|
|
@@ -6053,10 +6053,10 @@ function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
|
6053
6053
|
y: pt.y - y
|
|
6054
6054
|
}))
|
|
6055
6055
|
);
|
|
6056
|
-
return
|
|
6056
|
+
return chunkSEJEVNXW_js.polygonsToSvgPath(transformed);
|
|
6057
6057
|
}
|
|
6058
6058
|
function pathBounds(pathData) {
|
|
6059
|
-
const polys =
|
|
6059
|
+
const polys = chunkSEJEVNXW_js.svgPathToPolygons(pathData);
|
|
6060
6060
|
let minX = Infinity;
|
|
6061
6061
|
let minY = Infinity;
|
|
6062
6062
|
let maxX = -Infinity;
|
|
@@ -6115,7 +6115,7 @@ function useMergeShapesHandler(input) {
|
|
|
6115
6115
|
let allFragments = [];
|
|
6116
6116
|
let remaining = globalPaths[0];
|
|
6117
6117
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
6118
|
-
const frags =
|
|
6118
|
+
const frags = chunkSEJEVNXW_js.mergeShapes("fragment", remaining, globalPaths[i]);
|
|
6119
6119
|
if (Array.isArray(frags)) {
|
|
6120
6120
|
allFragments = frags;
|
|
6121
6121
|
}
|
|
@@ -6144,7 +6144,7 @@ function useMergeShapesHandler(input) {
|
|
|
6144
6144
|
bounds.height
|
|
6145
6145
|
);
|
|
6146
6146
|
const newEl = {
|
|
6147
|
-
id:
|
|
6147
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
6148
6148
|
type: "shape",
|
|
6149
6149
|
x: bounds.x,
|
|
6150
6150
|
y: bounds.y,
|
|
@@ -6182,7 +6182,7 @@ function useMergeShapesHandler(input) {
|
|
|
6182
6182
|
} else {
|
|
6183
6183
|
let resultPath = globalPaths[0];
|
|
6184
6184
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
6185
|
-
const result =
|
|
6185
|
+
const result = chunkSEJEVNXW_js.mergeShapes(operation, resultPath, globalPaths[i]);
|
|
6186
6186
|
if (typeof result === "string") {
|
|
6187
6187
|
resultPath = result;
|
|
6188
6188
|
}
|
|
@@ -6203,7 +6203,7 @@ function useMergeShapesHandler(input) {
|
|
|
6203
6203
|
);
|
|
6204
6204
|
const primary = targets[0];
|
|
6205
6205
|
const newEl = {
|
|
6206
|
-
id:
|
|
6206
|
+
id: chunkSEJEVNXW_js.generateElementId(),
|
|
6207
6207
|
type: "shape",
|
|
6208
6208
|
x: bounds.x,
|
|
6209
6209
|
y: bounds.y,
|
|
@@ -6266,7 +6266,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6266
6266
|
if (ids.length < 2 || !activeSlide) {
|
|
6267
6267
|
return;
|
|
6268
6268
|
}
|
|
6269
|
-
const { elements, groupId } =
|
|
6269
|
+
const { elements, groupId } = chunkSEJEVNXW_js.groupElements(ops.activeElements, ids, chunkSEJEVNXW_js.generateElementId());
|
|
6270
6270
|
if (groupId === null) {
|
|
6271
6271
|
return;
|
|
6272
6272
|
}
|
|
@@ -6279,11 +6279,11 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6279
6279
|
return;
|
|
6280
6280
|
}
|
|
6281
6281
|
const group = selectedElement;
|
|
6282
|
-
const intoTemplate =
|
|
6282
|
+
const intoTemplate = chunkSEJEVNXW_js.isTemplateElementId(group.id);
|
|
6283
6283
|
const childIds = group.children.map(
|
|
6284
|
-
(child) => intoTemplate ?
|
|
6284
|
+
(child) => intoTemplate ? chunkSEJEVNXW_js.makeCloneId(true, child.id || group.id) : child.id || chunkSEJEVNXW_js.generateElementId()
|
|
6285
6285
|
);
|
|
6286
|
-
const { elements, childIds: usedIds } =
|
|
6286
|
+
const { elements, childIds: usedIds } = chunkSEJEVNXW_js.ungroupElements(
|
|
6287
6287
|
ops.activeElements,
|
|
6288
6288
|
group.id,
|
|
6289
6289
|
childIds,
|
|
@@ -6312,7 +6312,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6312
6312
|
if (!edge) {
|
|
6313
6313
|
return;
|
|
6314
6314
|
}
|
|
6315
|
-
const positions =
|
|
6315
|
+
const positions = chunkSEJEVNXW_js.alignElements(selectedElements, edge);
|
|
6316
6316
|
for (const [id, pos] of positions) {
|
|
6317
6317
|
const el = elementLookup.get(id);
|
|
6318
6318
|
if (!el) {
|
|
@@ -6330,7 +6330,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6330
6330
|
if (!distAxis) {
|
|
6331
6331
|
return;
|
|
6332
6332
|
}
|
|
6333
|
-
const positions =
|
|
6333
|
+
const positions = chunkSEJEVNXW_js.distributeElements(selectedElements, distAxis);
|
|
6334
6334
|
for (const [id, pos] of positions) {
|
|
6335
6335
|
const el = elementLookup.get(id);
|
|
6336
6336
|
if (!el) {
|
|
@@ -6347,7 +6347,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6347
6347
|
}
|
|
6348
6348
|
const id = selectedElement.id;
|
|
6349
6349
|
ops.updateActiveElements(
|
|
6350
|
-
(els) => direction === "forward" ?
|
|
6350
|
+
(els) => direction === "forward" ? chunkSEJEVNXW_js.bringForward(els, id) : direction === "backward" ? chunkSEJEVNXW_js.sendBackward(els, id) : els
|
|
6351
6351
|
);
|
|
6352
6352
|
history.markDirty();
|
|
6353
6353
|
};
|
|
@@ -6357,7 +6357,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6357
6357
|
}
|
|
6358
6358
|
const id = selectedElement.id;
|
|
6359
6359
|
ops.updateActiveElements(
|
|
6360
|
-
(els) => direction === "front" ?
|
|
6360
|
+
(els) => direction === "front" ? chunkSEJEVNXW_js.bringToFront(els, id) : chunkSEJEVNXW_js.sendToBack(els, id)
|
|
6361
6361
|
);
|
|
6362
6362
|
history.markDirty();
|
|
6363
6363
|
};
|
|
@@ -6488,7 +6488,7 @@ function useSlideManagement(input) {
|
|
|
6488
6488
|
theme
|
|
6489
6489
|
} = input;
|
|
6490
6490
|
const handleAddSlide = () => {
|
|
6491
|
-
const newSlide =
|
|
6491
|
+
const newSlide = chunkSEJEVNXW_js.createBlankSlide(slides.length + 1);
|
|
6492
6492
|
ops.updateSlides((prev) => {
|
|
6493
6493
|
const next = [...prev];
|
|
6494
6494
|
next.splice(activeSlideIndex + 1, 0, newSlide);
|
|
@@ -6551,7 +6551,7 @@ function useSlideManagement(input) {
|
|
|
6551
6551
|
}
|
|
6552
6552
|
const clone = {
|
|
6553
6553
|
...src,
|
|
6554
|
-
id:
|
|
6554
|
+
id: chunkSEJEVNXW_js.makeSlideId(),
|
|
6555
6555
|
elements: src.elements.map((el) => ({
|
|
6556
6556
|
...el,
|
|
6557
6557
|
id: `${el.id}-dup-${Math.random().toString(36).slice(2, 6)}`
|
|
@@ -6583,7 +6583,7 @@ function useSlideManagement(input) {
|
|
|
6583
6583
|
const handleInsertSlideFromLayout = (layoutPath, layoutName) => {
|
|
6584
6584
|
const insertAt = activeSlideIndex + 1;
|
|
6585
6585
|
const draft = {
|
|
6586
|
-
...
|
|
6586
|
+
...chunkSEJEVNXW_js.createBlankSlide(slides.length + 1),
|
|
6587
6587
|
layoutPath,
|
|
6588
6588
|
...layoutName ? { layoutName } : {}
|
|
6589
6589
|
};
|
|
@@ -6616,9 +6616,9 @@ function useSlideManagement(input) {
|
|
|
6616
6616
|
};
|
|
6617
6617
|
const handleInsertSlideFromTemplate = (templateId) => {
|
|
6618
6618
|
const insertAt = activeSlideIndex + 1;
|
|
6619
|
-
const draft =
|
|
6619
|
+
const draft = chunkSEJEVNXW_js.buildSlideTemplateSlide(templateId, chunkSEJEVNXW_js.makeSlideId(), slides.length + 1, {
|
|
6620
6620
|
...canvasSize ? { slideWidth: canvasSize.width, slideHeight: canvasSize.height } : {},
|
|
6621
|
-
scheme:
|
|
6621
|
+
scheme: chunkSEJEVNXW_js.templateSchemeFromTheme(theme?.colorScheme)
|
|
6622
6622
|
});
|
|
6623
6623
|
ops.updateSlides((prev) => insertSlideFromLayoutUpdater(prev, activeSlideIndex, draft));
|
|
6624
6624
|
setActiveSlideIndex(insertAt);
|
|
@@ -6655,7 +6655,7 @@ function createTableMergeHandlers(input) {
|
|
|
6655
6655
|
if (!nextCell || nextCell.hMerge || nextCell.vMerge) {
|
|
6656
6656
|
return;
|
|
6657
6657
|
}
|
|
6658
|
-
const newTableData =
|
|
6658
|
+
const newTableData = chunkSEJEVNXW_js.mergeCells(
|
|
6659
6659
|
[
|
|
6660
6660
|
{ row: rowIndex, col: columnIndex },
|
|
6661
6661
|
{ row: rowIndex, col: nextColIdx }
|
|
@@ -6663,7 +6663,7 @@ function createTableMergeHandlers(input) {
|
|
|
6663
6663
|
td
|
|
6664
6664
|
);
|
|
6665
6665
|
const updates = { tableData: newTableData };
|
|
6666
|
-
const newRawXml =
|
|
6666
|
+
const newRawXml = chunkSEJEVNXW_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6667
6667
|
if (newRawXml) {
|
|
6668
6668
|
updates.rawXml = newRawXml;
|
|
6669
6669
|
}
|
|
@@ -6689,7 +6689,7 @@ function createTableMergeHandlers(input) {
|
|
|
6689
6689
|
if (!targetNextCell || targetNextCell.hMerge || targetNextCell.vMerge) {
|
|
6690
6690
|
return;
|
|
6691
6691
|
}
|
|
6692
|
-
const newTableData =
|
|
6692
|
+
const newTableData = chunkSEJEVNXW_js.mergeCells(
|
|
6693
6693
|
[
|
|
6694
6694
|
{ row: rowIndex, col: columnIndex },
|
|
6695
6695
|
{ row: targetNextRowIdx, col: columnIndex }
|
|
@@ -6697,7 +6697,7 @@ function createTableMergeHandlers(input) {
|
|
|
6697
6697
|
td
|
|
6698
6698
|
);
|
|
6699
6699
|
const updates = { tableData: newTableData };
|
|
6700
|
-
const newRawXml =
|
|
6700
|
+
const newRawXml = chunkSEJEVNXW_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6701
6701
|
if (newRawXml) {
|
|
6702
6702
|
updates.rawXml = newRawXml;
|
|
6703
6703
|
}
|
|
@@ -6712,9 +6712,9 @@ function createTableMergeHandlers(input) {
|
|
|
6712
6712
|
return;
|
|
6713
6713
|
}
|
|
6714
6714
|
const td = selectedElement.tableData;
|
|
6715
|
-
const newTableData =
|
|
6715
|
+
const newTableData = chunkSEJEVNXW_js.mergeCells(ts.selectedCells, td);
|
|
6716
6716
|
const updates = { tableData: newTableData };
|
|
6717
|
-
const newRawXml =
|
|
6717
|
+
const newRawXml = chunkSEJEVNXW_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6718
6718
|
if (newRawXml) {
|
|
6719
6719
|
updates.rawXml = newRawXml;
|
|
6720
6720
|
}
|
|
@@ -6731,9 +6731,9 @@ function createTableMergeHandlers(input) {
|
|
|
6731
6731
|
}
|
|
6732
6732
|
const { rowIndex, columnIndex } = ts;
|
|
6733
6733
|
const td = selectedElement.tableData;
|
|
6734
|
-
const newTableData =
|
|
6734
|
+
const newTableData = chunkSEJEVNXW_js.splitCell(rowIndex, columnIndex, td);
|
|
6735
6735
|
const updates = { tableData: newTableData };
|
|
6736
|
-
const newRawXml =
|
|
6736
|
+
const newRawXml = chunkSEJEVNXW_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6737
6737
|
if (newRawXml) {
|
|
6738
6738
|
updates.rawXml = newRawXml;
|
|
6739
6739
|
}
|
|
@@ -6767,10 +6767,10 @@ function createTableStructHandlers(input) {
|
|
|
6767
6767
|
const text = transformCommittedText ? transformCommittedText(rawText) : rawText;
|
|
6768
6768
|
const updates = {};
|
|
6769
6769
|
if (el.tableData) {
|
|
6770
|
-
updates.tableData =
|
|
6770
|
+
updates.tableData = chunkSEJEVNXW_js.setCellText(el, rowIndex, colIndex, text).tableData;
|
|
6771
6771
|
}
|
|
6772
6772
|
if (el.rawXml) {
|
|
6773
|
-
const newRawXml =
|
|
6773
|
+
const newRawXml = chunkSEJEVNXW_js.updateCellTextInRawXml(el, rowIndex, colIndex, text);
|
|
6774
6774
|
if (newRawXml) {
|
|
6775
6775
|
updates.rawXml = newRawXml;
|
|
6776
6776
|
}
|
|
@@ -6794,7 +6794,7 @@ function createTableStructHandlers(input) {
|
|
|
6794
6794
|
const { rowIndex, columnIndex: colIndex } = ts;
|
|
6795
6795
|
const updates = {};
|
|
6796
6796
|
if (selectedElement.rawXml) {
|
|
6797
|
-
const newRawXml =
|
|
6797
|
+
const newRawXml = chunkSEJEVNXW_js.updateCellTextStyleInRawXml(
|
|
6798
6798
|
selectedElement,
|
|
6799
6799
|
rowIndex,
|
|
6800
6800
|
colIndex,
|
|
@@ -6858,9 +6858,9 @@ function createTableStructHandlers(input) {
|
|
|
6858
6858
|
return;
|
|
6859
6859
|
}
|
|
6860
6860
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6861
|
-
const newTableData =
|
|
6861
|
+
const newTableData = chunkSEJEVNXW_js.insertTableRow(selectedElement.tableData, rowIdx, position);
|
|
6862
6862
|
const updates = { tableData: newTableData };
|
|
6863
|
-
const newRawXml =
|
|
6863
|
+
const newRawXml = chunkSEJEVNXW_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6864
6864
|
if (newRawXml) {
|
|
6865
6865
|
updates.rawXml = newRawXml;
|
|
6866
6866
|
}
|
|
@@ -6873,12 +6873,12 @@ function createTableStructHandlers(input) {
|
|
|
6873
6873
|
}
|
|
6874
6874
|
const td = selectedElement.tableData;
|
|
6875
6875
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6876
|
-
const newTableData =
|
|
6876
|
+
const newTableData = chunkSEJEVNXW_js.deleteTableRow(td, rowIdx);
|
|
6877
6877
|
if (newTableData === td) {
|
|
6878
6878
|
return;
|
|
6879
6879
|
}
|
|
6880
6880
|
const updates = { tableData: newTableData };
|
|
6881
|
-
const newRawXml =
|
|
6881
|
+
const newRawXml = chunkSEJEVNXW_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6882
6882
|
if (newRawXml) {
|
|
6883
6883
|
updates.rawXml = newRawXml;
|
|
6884
6884
|
}
|
|
@@ -6890,9 +6890,9 @@ function createTableStructHandlers(input) {
|
|
|
6890
6890
|
return;
|
|
6891
6891
|
}
|
|
6892
6892
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6893
|
-
const newTableData =
|
|
6893
|
+
const newTableData = chunkSEJEVNXW_js.insertTableColumn(selectedElement.tableData, colIdx, position);
|
|
6894
6894
|
const updates = { tableData: newTableData };
|
|
6895
|
-
const newRawXml =
|
|
6895
|
+
const newRawXml = chunkSEJEVNXW_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6896
6896
|
if (newRawXml) {
|
|
6897
6897
|
updates.rawXml = newRawXml;
|
|
6898
6898
|
}
|
|
@@ -6905,12 +6905,12 @@ function createTableStructHandlers(input) {
|
|
|
6905
6905
|
}
|
|
6906
6906
|
const td = selectedElement.tableData;
|
|
6907
6907
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6908
|
-
const newTableData =
|
|
6908
|
+
const newTableData = chunkSEJEVNXW_js.deleteTableColumn(td, colIdx);
|
|
6909
6909
|
if (newTableData === td) {
|
|
6910
6910
|
return;
|
|
6911
6911
|
}
|
|
6912
6912
|
const updates = { tableData: newTableData };
|
|
6913
|
-
const newRawXml =
|
|
6913
|
+
const newRawXml = chunkSEJEVNXW_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6914
6914
|
if (newRawXml) {
|
|
6915
6915
|
updates.rawXml = newRawXml;
|
|
6916
6916
|
}
|
|
@@ -6946,8 +6946,8 @@ async function renderToCanvas(element, options = {}) {
|
|
|
6946
6946
|
return html2canvasPro(element, {
|
|
6947
6947
|
...options,
|
|
6948
6948
|
onclone: async (doc, clonedEl) => {
|
|
6949
|
-
await
|
|
6950
|
-
|
|
6949
|
+
await chunkSEJEVNXW_js.normalizeColorsForCapture(doc, clonedEl);
|
|
6950
|
+
chunkSEJEVNXW_js.preprocessCssForCapture(clonedEl);
|
|
6951
6951
|
if (typeof userOnClone === "function") {
|
|
6952
6952
|
userOnClone(doc, clonedEl);
|
|
6953
6953
|
}
|
|
@@ -6985,13 +6985,13 @@ function useExportSaveAs(input) {
|
|
|
6985
6985
|
if (!handler) {
|
|
6986
6986
|
return;
|
|
6987
6987
|
}
|
|
6988
|
-
const downloadName =
|
|
6988
|
+
const downloadName = chunkSEJEVNXW_js.savedPresentationFileName(filePath, format);
|
|
6989
6989
|
try {
|
|
6990
6990
|
const data = await buildSaveAsData(handler, format);
|
|
6991
6991
|
const blob = new Blob([data], {
|
|
6992
6992
|
type: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
|
|
6993
6993
|
});
|
|
6994
|
-
|
|
6994
|
+
chunkSEJEVNXW_js.downloadBlob(blob, downloadName);
|
|
6995
6995
|
} catch (err) {
|
|
6996
6996
|
console.error(`[PowerPointViewer] Save as .${format} failed:`, err);
|
|
6997
6997
|
}
|
|
@@ -7004,18 +7004,18 @@ function useExportSaveAs(input) {
|
|
|
7004
7004
|
const pptxGuides = guides.map((g) => ({
|
|
7005
7005
|
id: g.id,
|
|
7006
7006
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
7007
|
-
positionEmu:
|
|
7007
|
+
positionEmu: chunkSEJEVNXW_js.guidePxToEmu(g.position)
|
|
7008
7008
|
}));
|
|
7009
7009
|
return {
|
|
7010
7010
|
...slide,
|
|
7011
7011
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
7012
7012
|
};
|
|
7013
7013
|
});
|
|
7014
|
-
const slidesToSave =
|
|
7014
|
+
const slidesToSave = chunkSEJEVNXW_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
7015
7015
|
const saveOptions = {
|
|
7016
7016
|
// Save As shares Save's slide-size decision; leaving it out here is how
|
|
7017
7017
|
// a preset picked in the inspector reached one save path and not the other.
|
|
7018
|
-
slideSize:
|
|
7018
|
+
slideSize: chunkSEJEVNXW_js.resolveSlideSizeSelection({ current: slideSizeEmu, canvas: canvasSize }).size,
|
|
7019
7019
|
headerFooter,
|
|
7020
7020
|
presentationProperties,
|
|
7021
7021
|
customShows: customShows.length > 0 ? customShows : void 0,
|
|
@@ -7029,13 +7029,13 @@ function useExportSaveAs(input) {
|
|
|
7029
7029
|
handoutMaster,
|
|
7030
7030
|
outputFormat: format
|
|
7031
7031
|
};
|
|
7032
|
-
return
|
|
7032
|
+
return chunkSEJEVNXW_js.saveDeckWithPassword(handler, slidesToSave, saveOptions, password);
|
|
7033
7033
|
};
|
|
7034
7034
|
const handleExportJson = () => {
|
|
7035
7035
|
const sourceName = filePath ? filePath.replace(/\\/gu, "/").split("/").pop() : void 0;
|
|
7036
|
-
const slideSize =
|
|
7036
|
+
const slideSize = chunkSEJEVNXW_js.resolveSlideSizeSelection({ current: slideSizeEmu, canvas: canvasSize }).size;
|
|
7037
7037
|
const data = {
|
|
7038
|
-
slides:
|
|
7038
|
+
slides: chunkSEJEVNXW_js.buildSaveSlides(slides, templateElementsBySlideId),
|
|
7039
7039
|
width: canvasSize.width,
|
|
7040
7040
|
height: canvasSize.height,
|
|
7041
7041
|
widthEmu: slideSize.widthEmu,
|
|
@@ -7054,7 +7054,7 @@ function useExportSaveAs(input) {
|
|
|
7054
7054
|
handoutMaster
|
|
7055
7055
|
};
|
|
7056
7056
|
try {
|
|
7057
|
-
|
|
7057
|
+
chunkSEJEVNXW_js.exportDeckJson(data, sourceName);
|
|
7058
7058
|
} catch (err) {
|
|
7059
7059
|
console.error("[PowerPointViewer] JSON export failed:", err);
|
|
7060
7060
|
}
|
|
@@ -7141,7 +7141,7 @@ async function exportSlideToPngBlob(slideElement, options = {}) {
|
|
|
7141
7141
|
}
|
|
7142
7142
|
async function exportSlideAsPng(slideElement, slideIndex, options = {}) {
|
|
7143
7143
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
7144
|
-
|
|
7144
|
+
chunkSEJEVNXW_js.downloadBlob(blob, `slide-${slideIndex + 1}.png`);
|
|
7145
7145
|
}
|
|
7146
7146
|
async function copySlideToClipboard(slideElement, options = {}) {
|
|
7147
7147
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
@@ -7163,15 +7163,15 @@ async function exportAllSlidesAsPdf(slideStageRef, totalSlides, setActiveSlide,
|
|
|
7163
7163
|
continue;
|
|
7164
7164
|
}
|
|
7165
7165
|
const canvas = await renderElementToCanvas(stageEl, scale);
|
|
7166
|
-
images.push(
|
|
7166
|
+
images.push(chunkSEJEVNXW_js.canvasToJpegData(canvas));
|
|
7167
7167
|
}
|
|
7168
7168
|
onProgress?.(totalSlides, totalSlides);
|
|
7169
7169
|
setActiveSlide(currentSlideIndex);
|
|
7170
7170
|
if (images.length === 0) {
|
|
7171
7171
|
throw new Error(chunkUNIJUD5C_js.translationsEn["pptx.export.errorNoSlidesPdf"]);
|
|
7172
7172
|
}
|
|
7173
|
-
const pdfBlobUrl =
|
|
7174
|
-
|
|
7173
|
+
const pdfBlobUrl = chunkGKRE7272_js.buildPdfFromImageData(images);
|
|
7174
|
+
chunkSEJEVNXW_js.downloadDataUrl(pdfBlobUrl, filename);
|
|
7175
7175
|
}
|
|
7176
7176
|
async function captureAllSlidesAsPngDataUrls(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, options = {}) {
|
|
7177
7177
|
const { scale = 2, onProgress } = options;
|
|
@@ -7219,8 +7219,8 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
|
|
|
7219
7219
|
if (pages.length === 0) {
|
|
7220
7220
|
throw new Error(chunkUNIJUD5C_js.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
|
|
7221
7221
|
}
|
|
7222
|
-
const pdfDataUrl =
|
|
7223
|
-
|
|
7222
|
+
const pdfDataUrl = chunkGKRE7272_js.buildNotesPdf(pages);
|
|
7223
|
+
chunkSEJEVNXW_js.downloadDataUrl(pdfDataUrl, filename);
|
|
7224
7224
|
}
|
|
7225
7225
|
|
|
7226
7226
|
// src/viewer/utils/export-video.ts
|
|
@@ -7264,7 +7264,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
7264
7264
|
const fps = 30;
|
|
7265
7265
|
const stream = recordingCanvas.captureStream(fps);
|
|
7266
7266
|
const recorder = new MediaRecorder(stream, {
|
|
7267
|
-
mimeType:
|
|
7267
|
+
mimeType: chunkSEJEVNXW_js.pickSupportedMimeType([...chunkSEJEVNXW_js.WEBM_MIME_CANDIDATES]),
|
|
7268
7268
|
videoBitsPerSecond: 5e6
|
|
7269
7269
|
});
|
|
7270
7270
|
const chunks = [];
|
|
@@ -7287,8 +7287,8 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
7287
7287
|
const duration = slideTimingsMs?.[i] ?? slideDurationMs;
|
|
7288
7288
|
ctx.clearRect(0, 0, recordingCanvas.width, recordingCanvas.height);
|
|
7289
7289
|
ctx.drawImage(slideCanvases[i], 0, 0);
|
|
7290
|
-
const frameInterval =
|
|
7291
|
-
const framesNeeded =
|
|
7290
|
+
const frameInterval = chunkSEJEVNXW_js.fpsToFrameIntervalMs(fps);
|
|
7291
|
+
const framesNeeded = chunkSEJEVNXW_js.segmentFrameCount(duration, fps);
|
|
7292
7292
|
for (let f = 0; f < framesNeeded; f++) {
|
|
7293
7293
|
if (signal?.aborted) {
|
|
7294
7294
|
recorder.stop();
|
|
@@ -7337,7 +7337,7 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
|
|
|
7337
7337
|
if (frames.length === 0) {
|
|
7338
7338
|
throw new Error(chunkUNIJUD5C_js.translationsEn["pptx.export.errorNoSlidesGif"]);
|
|
7339
7339
|
}
|
|
7340
|
-
const gifBytes =
|
|
7340
|
+
const gifBytes = chunkSEJEVNXW_js.encodeGif(frames, Math.round(slideDurationMs / 10));
|
|
7341
7341
|
onProgress?.(totalSlides, totalSlides);
|
|
7342
7342
|
const buf = new ArrayBuffer(gifBytes.length);
|
|
7343
7343
|
new Uint8Array(buf).set(gifBytes);
|
|
@@ -7391,7 +7391,7 @@ function exportAllSlidesToSvg(data, options = {}) {
|
|
|
7391
7391
|
continue;
|
|
7392
7392
|
}
|
|
7393
7393
|
onProgress?.(processedCount, data.slides.length);
|
|
7394
|
-
let svg =
|
|
7394
|
+
let svg = chunkSEJEVNXW_js.SvgExporter.exportSlide(slide, data.width, data.height, svgOptions);
|
|
7395
7395
|
if (embedFonts && fontFaces?.length) {
|
|
7396
7396
|
svg = injectFontFaces(svg, fontFaces);
|
|
7397
7397
|
}
|
|
@@ -7500,21 +7500,21 @@ function useExportHandlers(input) {
|
|
|
7500
7500
|
{
|
|
7501
7501
|
scale: imageExportScale,
|
|
7502
7502
|
onProgress: (current, total) => {
|
|
7503
|
-
setExportProgress(
|
|
7504
|
-
setExportStatusMessage(
|
|
7503
|
+
setExportProgress(chunkSEJEVNXW_js.slideProgressPercent(current, total));
|
|
7504
|
+
setExportStatusMessage(chunkSEJEVNXW_js.slideStatusLabel("Rendering", current, total));
|
|
7505
7505
|
},
|
|
7506
7506
|
signal: abortCtrl.signal
|
|
7507
7507
|
}
|
|
7508
7508
|
);
|
|
7509
|
-
setExportProgress(
|
|
7509
|
+
setExportProgress(chunkSEJEVNXW_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7510
7510
|
setExportStatusMessage("Building PDF...");
|
|
7511
7511
|
await new Promise((r) => {
|
|
7512
7512
|
setTimeout(r, 100);
|
|
7513
7513
|
});
|
|
7514
|
-
setExportProgress(
|
|
7514
|
+
setExportProgress(chunkSEJEVNXW_js.EXPORT_DONE_PERCENT);
|
|
7515
7515
|
setExportStatusMessage("Done!");
|
|
7516
7516
|
} catch (err) {
|
|
7517
|
-
if (!
|
|
7517
|
+
if (!chunkSEJEVNXW_js.isExportAbortError(err)) {
|
|
7518
7518
|
console.error("[PowerPointViewer] PDF export failed:", err);
|
|
7519
7519
|
}
|
|
7520
7520
|
} finally {
|
|
@@ -7544,21 +7544,21 @@ function useExportHandlers(input) {
|
|
|
7544
7544
|
{
|
|
7545
7545
|
scale: imageExportScale,
|
|
7546
7546
|
onProgress: (current, total) => {
|
|
7547
|
-
setExportProgress(
|
|
7548
|
-
setExportStatusMessage(
|
|
7547
|
+
setExportProgress(chunkSEJEVNXW_js.slideProgressPercent(current, total));
|
|
7548
|
+
setExportStatusMessage(chunkSEJEVNXW_js.slideStatusLabel("Rendering", current, total));
|
|
7549
7549
|
},
|
|
7550
7550
|
signal: abortCtrl.signal
|
|
7551
7551
|
}
|
|
7552
7552
|
);
|
|
7553
|
-
setExportProgress(
|
|
7553
|
+
setExportProgress(chunkSEJEVNXW_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7554
7554
|
setExportStatusMessage("Building PDF...");
|
|
7555
7555
|
await new Promise((r) => {
|
|
7556
7556
|
setTimeout(r, 100);
|
|
7557
7557
|
});
|
|
7558
|
-
setExportProgress(
|
|
7558
|
+
setExportProgress(chunkSEJEVNXW_js.EXPORT_DONE_PERCENT);
|
|
7559
7559
|
setExportStatusMessage("Done!");
|
|
7560
7560
|
} catch (err) {
|
|
7561
|
-
if (!
|
|
7561
|
+
if (!chunkSEJEVNXW_js.isExportAbortError(err)) {
|
|
7562
7562
|
console.error("[PowerPointViewer] Notes PDF export failed:", err);
|
|
7563
7563
|
}
|
|
7564
7564
|
} finally {
|
|
@@ -7600,22 +7600,22 @@ function useExportHandlers(input) {
|
|
|
7600
7600
|
scale: 1,
|
|
7601
7601
|
slideDurationMs: 3e3,
|
|
7602
7602
|
onProgress: (current, total) => {
|
|
7603
|
-
setExportProgress(
|
|
7604
|
-
setExportStatusMessage(
|
|
7603
|
+
setExportProgress(chunkSEJEVNXW_js.slideProgressPercent(current, total, 45));
|
|
7604
|
+
setExportStatusMessage(chunkSEJEVNXW_js.slideStatusLabel("Capturing", current, total));
|
|
7605
7605
|
},
|
|
7606
7606
|
onRecordProgress: (current, total) => {
|
|
7607
|
-
setExportProgress(
|
|
7608
|
-
setExportStatusMessage(
|
|
7607
|
+
setExportProgress(chunkSEJEVNXW_js.recordProgressPercent(current, total));
|
|
7608
|
+
setExportStatusMessage(chunkSEJEVNXW_js.slideStatusLabel("Recording", current, total));
|
|
7609
7609
|
},
|
|
7610
7610
|
signal: abortCtrl.signal
|
|
7611
7611
|
}
|
|
7612
7612
|
);
|
|
7613
|
-
setExportProgress(
|
|
7613
|
+
setExportProgress(chunkSEJEVNXW_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7614
7614
|
setExportStatusMessage("Saving file...");
|
|
7615
|
-
|
|
7616
|
-
setExportProgress(
|
|
7615
|
+
chunkSEJEVNXW_js.downloadBlob(blob, "presentation.webm");
|
|
7616
|
+
setExportProgress(chunkSEJEVNXW_js.EXPORT_DONE_PERCENT);
|
|
7617
7617
|
} catch (err) {
|
|
7618
|
-
if (!
|
|
7618
|
+
if (!chunkSEJEVNXW_js.isExportAbortError(err)) {
|
|
7619
7619
|
console.error("[PowerPointViewer] Video export failed:", err);
|
|
7620
7620
|
}
|
|
7621
7621
|
} finally {
|
|
@@ -7643,18 +7643,18 @@ function useExportHandlers(input) {
|
|
|
7643
7643
|
scale: 0.5,
|
|
7644
7644
|
slideDurationMs: 2e3,
|
|
7645
7645
|
onProgress: (current, total) => {
|
|
7646
|
-
setExportProgress(
|
|
7647
|
-
setExportStatusMessage(
|
|
7646
|
+
setExportProgress(chunkSEJEVNXW_js.slideProgressPercent(current, total));
|
|
7647
|
+
setExportStatusMessage(chunkSEJEVNXW_js.slideStatusLabel("Encoding", current, total));
|
|
7648
7648
|
},
|
|
7649
7649
|
signal: abortCtrl.signal
|
|
7650
7650
|
}
|
|
7651
7651
|
);
|
|
7652
|
-
setExportProgress(
|
|
7652
|
+
setExportProgress(chunkSEJEVNXW_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7653
7653
|
setExportStatusMessage("Saving file...");
|
|
7654
|
-
|
|
7655
|
-
setExportProgress(
|
|
7654
|
+
chunkSEJEVNXW_js.downloadBlob(blob, "presentation.gif");
|
|
7655
|
+
setExportProgress(chunkSEJEVNXW_js.EXPORT_DONE_PERCENT);
|
|
7656
7656
|
} catch (err) {
|
|
7657
|
-
if (!
|
|
7657
|
+
if (!chunkSEJEVNXW_js.isExportAbortError(err)) {
|
|
7658
7658
|
console.error("[PowerPointViewer] GIF export failed:", err);
|
|
7659
7659
|
}
|
|
7660
7660
|
} finally {
|
|
@@ -7687,7 +7687,7 @@ function useExportHandlers(input) {
|
|
|
7687
7687
|
exportStatusMessage
|
|
7688
7688
|
};
|
|
7689
7689
|
}
|
|
7690
|
-
var ViewerOptionsContext = react.createContext(
|
|
7690
|
+
var ViewerOptionsContext = react.createContext(chunkSEJEVNXW_js.DEFAULT_VIEWER_OPTIONS);
|
|
7691
7691
|
function useViewerOptionsContext() {
|
|
7692
7692
|
return react.useContext(ViewerOptionsContext);
|
|
7693
7693
|
}
|
|
@@ -7699,13 +7699,13 @@ function usePrintHandlers(input) {
|
|
|
7699
7699
|
const { t } = reactI18next.useTranslation();
|
|
7700
7700
|
const viewerOptions = useViewerOptionsContext();
|
|
7701
7701
|
const includeHiddenSlides = viewerOptions.advanced.printHiddenSlides;
|
|
7702
|
-
const printRasterScale = (viewerOptions.advanced.printHighQuality ? 4 : 3) *
|
|
7702
|
+
const printRasterScale = (viewerOptions.advanced.printHighQuality ? 4 : 3) * chunkSEJEVNXW_js.resolveImageResolutionScale(viewerOptions);
|
|
7703
7703
|
const handlePrint = () => {
|
|
7704
7704
|
setIsPrintDialogOpen(true);
|
|
7705
7705
|
};
|
|
7706
7706
|
const handlePrintSvg = async (settings) => {
|
|
7707
7707
|
setIsPrintDialogOpen(false);
|
|
7708
|
-
const printWindow =
|
|
7708
|
+
const printWindow = chunkSEJEVNXW_js.openPendingPrintWindow(t("pptx.print.preparingToPrint"));
|
|
7709
7709
|
if (!printWindow) {
|
|
7710
7710
|
console.warn(
|
|
7711
7711
|
"[PowerPointViewer] Print window was blocked by the browser. Allow popups for this site to print."
|
|
@@ -7715,9 +7715,9 @@ function usePrintHandlers(input) {
|
|
|
7715
7715
|
if (!pptxData || settings.printWhat !== "slides") {
|
|
7716
7716
|
return runRasterPrint(printWindow, settings);
|
|
7717
7717
|
}
|
|
7718
|
-
const colorFilter =
|
|
7719
|
-
const slideIndices =
|
|
7720
|
-
|
|
7718
|
+
const colorFilter = chunkSEJEVNXW_js.computeColorFilter(settings.colorMode);
|
|
7719
|
+
const slideIndices = chunkSEJEVNXW_js.filterHiddenSlideIndices(
|
|
7720
|
+
chunkSEJEVNXW_js.computeSlideIndices(
|
|
7721
7721
|
settings.slideRange,
|
|
7722
7722
|
activeSlideIndex,
|
|
7723
7723
|
slides.length,
|
|
@@ -7735,22 +7735,22 @@ function usePrintHandlers(input) {
|
|
|
7735
7735
|
printWindow.close();
|
|
7736
7736
|
return;
|
|
7737
7737
|
}
|
|
7738
|
-
const printDoc =
|
|
7738
|
+
const printDoc = chunkSEJEVNXW_js.buildPrintDocument(svgs, pptxData.width, pptxData.height, {
|
|
7739
7739
|
title: "Slides (Vector)",
|
|
7740
7740
|
orientation: settings.orientation,
|
|
7741
7741
|
colorFilter,
|
|
7742
7742
|
scaleToFit: settings.scaleToFit
|
|
7743
7743
|
});
|
|
7744
|
-
|
|
7744
|
+
chunkSEJEVNXW_js.finishPrintWindow(printWindow, printDoc);
|
|
7745
7745
|
} catch (err) {
|
|
7746
7746
|
console.warn("[PowerPointViewer] SVG print path failed, falling back to raster:", err);
|
|
7747
7747
|
return runRasterPrint(printWindow, settings);
|
|
7748
7748
|
}
|
|
7749
7749
|
};
|
|
7750
7750
|
const runRasterPrint = async (printWindow, settings) => {
|
|
7751
|
-
const colorFilter =
|
|
7752
|
-
const slideIndices =
|
|
7753
|
-
|
|
7751
|
+
const colorFilter = chunkSEJEVNXW_js.computeColorFilter(settings.colorMode);
|
|
7752
|
+
const slideIndices = chunkSEJEVNXW_js.filterHiddenSlideIndices(
|
|
7753
|
+
chunkSEJEVNXW_js.computeSlideIndices(
|
|
7754
7754
|
settings.slideRange,
|
|
7755
7755
|
activeSlideIndex,
|
|
7756
7756
|
slides.length,
|
|
@@ -7761,11 +7761,11 @@ function usePrintHandlers(input) {
|
|
|
7761
7761
|
includeHiddenSlides
|
|
7762
7762
|
);
|
|
7763
7763
|
if (settings.printWhat === "outline") {
|
|
7764
|
-
|
|
7764
|
+
chunkSEJEVNXW_js.finishPrintWindow(
|
|
7765
7765
|
printWindow,
|
|
7766
|
-
|
|
7766
|
+
chunkSEJEVNXW_js.buildPrintHtmlDocument({
|
|
7767
7767
|
title: "Outline",
|
|
7768
|
-
bodyHtml: `<div class="outline-page">${
|
|
7768
|
+
bodyHtml: `<div class="outline-page">${chunkSEJEVNXW_js.buildOutlineHtml(slideIndices, slides)}</div>`,
|
|
7769
7769
|
orientation: settings.orientation,
|
|
7770
7770
|
colorFilter,
|
|
7771
7771
|
frameSlides: settings.frameSlides,
|
|
@@ -7792,11 +7792,11 @@ function usePrintHandlers(input) {
|
|
|
7792
7792
|
}
|
|
7793
7793
|
const slideImages = slideIndices.map((idx) => allImages[idx]).filter(Boolean);
|
|
7794
7794
|
if (settings.printWhat === "slides") {
|
|
7795
|
-
|
|
7795
|
+
chunkSEJEVNXW_js.finishPrintWindow(
|
|
7796
7796
|
printWindow,
|
|
7797
|
-
|
|
7797
|
+
chunkSEJEVNXW_js.buildPrintHtmlDocument({
|
|
7798
7798
|
title: "Slides",
|
|
7799
|
-
bodyHtml:
|
|
7799
|
+
bodyHtml: chunkSEJEVNXW_js.buildSlidesHtml(slideImages, slideIndices),
|
|
7800
7800
|
orientation: settings.orientation,
|
|
7801
7801
|
colorFilter,
|
|
7802
7802
|
frameSlides: settings.frameSlides,
|
|
@@ -7806,11 +7806,11 @@ function usePrintHandlers(input) {
|
|
|
7806
7806
|
return;
|
|
7807
7807
|
}
|
|
7808
7808
|
if (settings.printWhat === "notes") {
|
|
7809
|
-
|
|
7809
|
+
chunkSEJEVNXW_js.finishPrintWindow(
|
|
7810
7810
|
printWindow,
|
|
7811
|
-
|
|
7811
|
+
chunkSEJEVNXW_js.buildPrintHtmlDocument({
|
|
7812
7812
|
title: "Notes Pages",
|
|
7813
|
-
bodyHtml:
|
|
7813
|
+
bodyHtml: chunkSEJEVNXW_js.buildNotesHtml(slideImages, slideIndices, slides),
|
|
7814
7814
|
orientation: "portrait",
|
|
7815
7815
|
colorFilter,
|
|
7816
7816
|
frameSlides: settings.frameSlides,
|
|
@@ -7821,11 +7821,11 @@ function usePrintHandlers(input) {
|
|
|
7821
7821
|
}
|
|
7822
7822
|
if (settings.printWhat === "handouts") {
|
|
7823
7823
|
const spp = settings.slidesPerPage;
|
|
7824
|
-
|
|
7824
|
+
chunkSEJEVNXW_js.finishPrintWindow(
|
|
7825
7825
|
printWindow,
|
|
7826
|
-
|
|
7826
|
+
chunkSEJEVNXW_js.buildPrintHtmlDocument({
|
|
7827
7827
|
title: `Handout ${spp} per page`,
|
|
7828
|
-
bodyHtml:
|
|
7828
|
+
bodyHtml: chunkSEJEVNXW_js.buildHandoutsHtml(slideImages, slideIndices, spp, pptxData?.handoutMaster),
|
|
7829
7829
|
orientation: "portrait",
|
|
7830
7830
|
colorFilter,
|
|
7831
7831
|
frameSlides: settings.frameSlides,
|
|
@@ -7839,7 +7839,7 @@ function usePrintHandlers(input) {
|
|
|
7839
7839
|
};
|
|
7840
7840
|
const handlePrintWithSettings = async (settings) => {
|
|
7841
7841
|
setIsPrintDialogOpen(false);
|
|
7842
|
-
const printWindow =
|
|
7842
|
+
const printWindow = chunkSEJEVNXW_js.openPendingPrintWindow(t("pptx.print.preparingToPrint"));
|
|
7843
7843
|
if (!printWindow) {
|
|
7844
7844
|
console.warn(
|
|
7845
7845
|
"[PowerPointViewer] Print window was blocked by the browser. Allow popups for this site to print."
|
|
@@ -7902,8 +7902,8 @@ function useThemeHandlers(input) {
|
|
|
7902
7902
|
return;
|
|
7903
7903
|
}
|
|
7904
7904
|
await handler.updateThemeColorScheme(colorScheme);
|
|
7905
|
-
const previousMap = theme?.colorScheme ?
|
|
7906
|
-
setSlides((prev) =>
|
|
7905
|
+
const previousMap = theme?.colorScheme ? chunkSEJEVNXW_js.buildThemeColorMap(theme.colorScheme) : {};
|
|
7906
|
+
setSlides((prev) => chunkSEJEVNXW_js.reResolveSlideColors(prev, previousMap, colorScheme));
|
|
7907
7907
|
setTheme((prev) => prev ? { ...prev, colorScheme } : { colorScheme });
|
|
7908
7908
|
bumpHistory();
|
|
7909
7909
|
history.markDirty();
|
|
@@ -8008,7 +8008,7 @@ function useThemeSwitching(input) {
|
|
|
8008
8008
|
}
|
|
8009
8009
|
try {
|
|
8010
8010
|
await handler.applyTheme(preset.colorScheme, preset.fontScheme, preset.name);
|
|
8011
|
-
const newData =
|
|
8011
|
+
const newData = chunkSEJEVNXW_js.applyThemeToData(data, preset.colorScheme, preset.fontScheme, preset.name);
|
|
8012
8012
|
onDataChange(newData);
|
|
8013
8013
|
onThemeChanged?.(preset);
|
|
8014
8014
|
} catch (error) {
|
|
@@ -8025,7 +8025,7 @@ function useThemeSwitching(input) {
|
|
|
8025
8025
|
}
|
|
8026
8026
|
try {
|
|
8027
8027
|
await handler.applyTheme(colorScheme, fontScheme ?? {}, themeName);
|
|
8028
|
-
const newData =
|
|
8028
|
+
const newData = chunkSEJEVNXW_js.applyThemeToData(data, colorScheme, fontScheme, themeName);
|
|
8029
8029
|
onDataChange(newData);
|
|
8030
8030
|
} catch (error) {
|
|
8031
8031
|
console.error("Failed to switch to custom theme:", error);
|
|
@@ -8037,12 +8037,12 @@ function useThemeSwitching(input) {
|
|
|
8037
8037
|
if (!data?.theme?.colorScheme) {
|
|
8038
8038
|
return void 0;
|
|
8039
8039
|
}
|
|
8040
|
-
return
|
|
8041
|
-
(p) =>
|
|
8040
|
+
return chunkSEJEVNXW_js.THEME_PRESETS.find(
|
|
8041
|
+
(p) => chunkSEJEVNXW_js.themeColorSchemesEqual(data.theme?.colorScheme, p.colorScheme)
|
|
8042
8042
|
);
|
|
8043
8043
|
}, [data?.theme?.colorScheme]);
|
|
8044
8044
|
return {
|
|
8045
|
-
presets:
|
|
8045
|
+
presets: chunkSEJEVNXW_js.THEME_PRESETS,
|
|
8046
8046
|
switchToPreset,
|
|
8047
8047
|
switchToCustom,
|
|
8048
8048
|
currentPreset
|
|
@@ -8117,7 +8117,7 @@ function usePropertyHandlers(input) {
|
|
|
8117
8117
|
}
|
|
8118
8118
|
try {
|
|
8119
8119
|
const ab = await file.arrayBuffer();
|
|
8120
|
-
const h = new
|
|
8120
|
+
const h = new chunkSEJEVNXW_js.PptxHandler();
|
|
8121
8121
|
const other = await h.load(ab);
|
|
8122
8122
|
if (!other) {
|
|
8123
8123
|
return;
|
|
@@ -8127,7 +8127,7 @@ function usePropertyHandlers(input) {
|
|
|
8127
8127
|
width: canvasSize.width,
|
|
8128
8128
|
height: canvasSize.height
|
|
8129
8129
|
};
|
|
8130
|
-
setCompareResult(
|
|
8130
|
+
setCompareResult(chunkSEJEVNXW_js.comparePresentation(cur, other));
|
|
8131
8131
|
setIsComparePanelOpen(true);
|
|
8132
8132
|
} catch (err) {
|
|
8133
8133
|
console.warn("Compare failed:", err);
|
|
@@ -8144,7 +8144,7 @@ function usePropertyHandlers(input) {
|
|
|
8144
8144
|
if (!diff || diff.status === "unchanged") {
|
|
8145
8145
|
return;
|
|
8146
8146
|
}
|
|
8147
|
-
setSlides((prev) =>
|
|
8147
|
+
setSlides((prev) => chunkSEJEVNXW_js.applyAcceptSlide(prev, diff));
|
|
8148
8148
|
setIsDirty(true);
|
|
8149
8149
|
},
|
|
8150
8150
|
[compareResult, setSlides, setIsDirty]
|
|
@@ -8155,10 +8155,10 @@ function usePropertyHandlers(input) {
|
|
|
8155
8155
|
if (!compareResult) {
|
|
8156
8156
|
return;
|
|
8157
8157
|
}
|
|
8158
|
-
setSlides((prev) =>
|
|
8158
|
+
setSlides((prev) => chunkSEJEVNXW_js.applyAcceptAllSlides(prev, compareResult));
|
|
8159
8159
|
setIsDirty(true);
|
|
8160
8160
|
}, [compareResult, setSlides, setIsDirty]);
|
|
8161
|
-
const usedFontFamilies = react.useMemo(() =>
|
|
8161
|
+
const usedFontFamilies = react.useMemo(() => chunkSEJEVNXW_js.collectUsedFonts(slides), [slides]);
|
|
8162
8162
|
return {
|
|
8163
8163
|
handleUpdateNotes,
|
|
8164
8164
|
handleUpdateSlide,
|
|
@@ -8313,7 +8313,7 @@ function useViewerDialogs(input) {
|
|
|
8313
8313
|
);
|
|
8314
8314
|
const embeddedFontKey = (embeddedFontFamilies ?? []).join("\0");
|
|
8315
8315
|
const fontEmbedding = react.useMemo(
|
|
8316
|
-
() =>
|
|
8316
|
+
() => chunkSEJEVNXW_js.describeFontEmbedding(embeddedFontKey ? embeddedFontKey.split("\0") : []),
|
|
8317
8317
|
[embeddedFontKey]
|
|
8318
8318
|
);
|
|
8319
8319
|
const [embedFontsEnabled, setEmbedFontsEnabled] = react.useState(fontEmbedding.initialEnabled);
|
|
@@ -8323,11 +8323,11 @@ function useViewerDialogs(input) {
|
|
|
8323
8323
|
setEmbedFontsEnabled(fontEmbedding.initialEnabled);
|
|
8324
8324
|
}
|
|
8325
8325
|
const [isNarrowViewport, setIsNarrowViewport] = react.useState(
|
|
8326
|
-
() => typeof window !== "undefined" ?
|
|
8326
|
+
() => typeof window !== "undefined" ? chunkSEJEVNXW_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch()) : false
|
|
8327
8327
|
);
|
|
8328
8328
|
react.useEffect(() => {
|
|
8329
8329
|
const handleWindow = () => setIsNarrowViewport(
|
|
8330
|
-
|
|
8330
|
+
chunkSEJEVNXW_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch())
|
|
8331
8331
|
);
|
|
8332
8332
|
window.addEventListener("resize", handleWindow);
|
|
8333
8333
|
return () => window.removeEventListener("resize", handleWindow);
|
|
@@ -8480,16 +8480,16 @@ function useViewerDialogs(input) {
|
|
|
8480
8480
|
};
|
|
8481
8481
|
}
|
|
8482
8482
|
function computeGridSpacingPx2(documentGridSpacing) {
|
|
8483
|
-
return
|
|
8483
|
+
return chunkSEJEVNXW_js.computeGridSpacingPx(documentGridSpacing, chunkGKRE7272_js.GRID_SIZE);
|
|
8484
8484
|
}
|
|
8485
8485
|
function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows, presentationProperties) {
|
|
8486
8486
|
const activeShow = activeCustomShowId ? customShows.find((show) => show.id === activeCustomShowId) : void 0;
|
|
8487
|
-
const authoredRange =
|
|
8488
|
-
return
|
|
8487
|
+
const authoredRange = chunkSEJEVNXW_js.resolveAuthoredSlideRange(presentationProperties, slides.length);
|
|
8488
|
+
return chunkSEJEVNXW_js.resolveShowSlideIndexes(slides, activeShow, authoredRange);
|
|
8489
8489
|
}
|
|
8490
8490
|
function computeSlideSectionGroups(slides, sections) {
|
|
8491
|
-
return
|
|
8492
|
-
id: group.section?.id ?? (sections.length > 0 ?
|
|
8491
|
+
return chunkSEJEVNXW_js.groupSlidesBySection(sections, slides).map((group) => ({
|
|
8492
|
+
id: group.section?.id ?? (sections.length > 0 ? chunkGKRE7272_js.UNGROUPED_SECTION_ID : chunkGKRE7272_js.DEFAULT_SECTION_GROUP_ID),
|
|
8493
8493
|
label: group.section?.name ?? (sections.length > 0 ? "Ungrouped Slides" : "Slides"),
|
|
8494
8494
|
slideIndexes: group.slideIndexes,
|
|
8495
8495
|
...group.section?.color !== void 0 ? { color: group.section.color } : {},
|
|
@@ -8501,7 +8501,7 @@ function computeMasterPseudoSlide(mode, activeLayout, activeMaster) {
|
|
|
8501
8501
|
return void 0;
|
|
8502
8502
|
}
|
|
8503
8503
|
const document2 = activeLayout ? { slideMasters: [{ ...activeMaster, layouts: [activeLayout] }] } : { slideMasters: [activeMaster] };
|
|
8504
|
-
return
|
|
8504
|
+
return chunkSEJEVNXW_js.masterViewPseudoSlide(document2, {
|
|
8505
8505
|
tab: "slides",
|
|
8506
8506
|
masterIndex: 0,
|
|
8507
8507
|
layoutIndex: activeLayout ? 0 : null
|
|
@@ -8529,15 +8529,15 @@ function useDerivedSlideState(input) {
|
|
|
8529
8529
|
[slides, activeCustomShowId, customShows, presentationProperties]
|
|
8530
8530
|
);
|
|
8531
8531
|
const authoredRange = react.useMemo(
|
|
8532
|
-
() =>
|
|
8532
|
+
() => chunkSEJEVNXW_js.resolveAuthoredSlideRange(presentationProperties, slides.length),
|
|
8533
8533
|
[presentationProperties, slides.length]
|
|
8534
8534
|
);
|
|
8535
8535
|
const slideSectionGroups = react.useMemo(
|
|
8536
8536
|
() => computeSlideSectionGroups(slides, sections).map((group) => {
|
|
8537
|
-
if (group.id ===
|
|
8537
|
+
if (group.id === chunkGKRE7272_js.UNGROUPED_SECTION_ID && group.label === "Ungrouped Slides") {
|
|
8538
8538
|
return { ...group, label: t("pptx.slides.ungroupedSlides") };
|
|
8539
8539
|
}
|
|
8540
|
-
if (group.id ===
|
|
8540
|
+
if (group.id === chunkGKRE7272_js.DEFAULT_SECTION_GROUP_ID && group.label === "Slides") {
|
|
8541
8541
|
return { ...group, label: t("pptx.sections.slides") };
|
|
8542
8542
|
}
|
|
8543
8543
|
return group;
|
|
@@ -8638,13 +8638,13 @@ function useAnnotationHandlers(input) {
|
|
|
8638
8638
|
}, [annotations, setMode, setSlides, history]);
|
|
8639
8639
|
const handleSetMode = react.useCallback(
|
|
8640
8640
|
(nextMode) => {
|
|
8641
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8641
|
+
if (mode === "present" && nextMode !== "present" && !chunkSEJEVNXW_js.mayLeaveSlideShow()) {
|
|
8642
8642
|
return;
|
|
8643
8643
|
}
|
|
8644
8644
|
if (nextMode === "present") {
|
|
8645
8645
|
presentation.enterPresentMode();
|
|
8646
8646
|
} else if (mode === "present" && annotations.hasAnyAnnotations) {
|
|
8647
|
-
|
|
8647
|
+
chunkSEJEVNXW_js.stopAllPersistentAudio();
|
|
8648
8648
|
if (promptKeepInkAnnotations) {
|
|
8649
8649
|
pendingModeAfterAnnotationsRef.current = nextMode;
|
|
8650
8650
|
setShowKeepAnnotationsDialog(true);
|
|
@@ -8654,7 +8654,7 @@ function useAnnotationHandlers(input) {
|
|
|
8654
8654
|
}
|
|
8655
8655
|
} else {
|
|
8656
8656
|
if (mode === "present") {
|
|
8657
|
-
|
|
8657
|
+
chunkSEJEVNXW_js.stopAllPersistentAudio();
|
|
8658
8658
|
}
|
|
8659
8659
|
setMode(nextMode);
|
|
8660
8660
|
}
|
|
@@ -8719,13 +8719,13 @@ function useSerialize(input) {
|
|
|
8719
8719
|
let processedSlide = slide;
|
|
8720
8720
|
if (pendingEditId) {
|
|
8721
8721
|
const updatedElements = slide.elements.map((el) => {
|
|
8722
|
-
if (el.id !== pendingEditId || !
|
|
8722
|
+
if (el.id !== pendingEditId || !chunkSEJEVNXW_js.hasTextProperties(el)) {
|
|
8723
8723
|
return el;
|
|
8724
8724
|
}
|
|
8725
8725
|
return {
|
|
8726
8726
|
...el,
|
|
8727
8727
|
text: pendingEditText,
|
|
8728
|
-
textSegments:
|
|
8728
|
+
textSegments: chunkSEJEVNXW_js.remapTextToSegments(pendingEditText, el.textSegments, el.textStyle)
|
|
8729
8729
|
};
|
|
8730
8730
|
});
|
|
8731
8731
|
if (updatedElements.some((el, i) => el !== slide.elements[i])) {
|
|
@@ -8738,19 +8738,19 @@ function useSerialize(input) {
|
|
|
8738
8738
|
const pptxGuides = guides.map((g) => ({
|
|
8739
8739
|
id: g.id,
|
|
8740
8740
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
8741
|
-
positionEmu:
|
|
8741
|
+
positionEmu: chunkSEJEVNXW_js.guidePxToEmu(g.position)
|
|
8742
8742
|
}));
|
|
8743
8743
|
return {
|
|
8744
8744
|
...processedSlide,
|
|
8745
8745
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
8746
8746
|
};
|
|
8747
8747
|
});
|
|
8748
|
-
const slidesToSave =
|
|
8748
|
+
const slidesToSave = chunkSEJEVNXW_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
8749
8749
|
const saveOptions = {
|
|
8750
8750
|
// Without this the Slide Size card edited a viewer-only pixel value and
|
|
8751
8751
|
// the saved `p:sldSz` never moved: passing `slideSize` is the only way a
|
|
8752
8752
|
// slide-size edit reaches the file.
|
|
8753
|
-
slideSize:
|
|
8753
|
+
slideSize: chunkSEJEVNXW_js.resolveSlideSizeSelection({ current: slideSizeEmu, canvas: canvasSize }).size,
|
|
8754
8754
|
headerFooter,
|
|
8755
8755
|
presentationProperties,
|
|
8756
8756
|
viewProperties,
|
|
@@ -8763,9 +8763,9 @@ function useSerialize(input) {
|
|
|
8763
8763
|
slideMasters,
|
|
8764
8764
|
notesMaster,
|
|
8765
8765
|
handoutMaster,
|
|
8766
|
-
...
|
|
8766
|
+
...chunkSEJEVNXW_js.embeddedFontSaveOptions(embedFonts)
|
|
8767
8767
|
};
|
|
8768
|
-
return
|
|
8768
|
+
return chunkSEJEVNXW_js.saveDeckWithPassword(handler, slidesToSave, saveOptions, { password, purpose });
|
|
8769
8769
|
}, [
|
|
8770
8770
|
slides,
|
|
8771
8771
|
templateElementsBySlideId,
|
|
@@ -8801,7 +8801,7 @@ function useRecoveryDetection(input) {
|
|
|
8801
8801
|
const onRestore = input.onRestore;
|
|
8802
8802
|
const openVersionHistory = input.openVersionHistory;
|
|
8803
8803
|
react.useEffect(() => {
|
|
8804
|
-
if (!
|
|
8804
|
+
if (!chunkSEJEVNXW_js.shouldProbeAutosaveRecovery({
|
|
8805
8805
|
alreadyChecked: recoveryCheckedRef.current,
|
|
8806
8806
|
filePath,
|
|
8807
8807
|
loading,
|
|
@@ -8813,7 +8813,7 @@ function useRecoveryDetection(input) {
|
|
|
8813
8813
|
}
|
|
8814
8814
|
recoveryCheckedRef.current = true;
|
|
8815
8815
|
void (async () => {
|
|
8816
|
-
const offer = await
|
|
8816
|
+
const offer = await chunkSEJEVNXW_js.probeAutosaveRecovery(filePath);
|
|
8817
8817
|
if (!offer) {
|
|
8818
8818
|
return;
|
|
8819
8819
|
}
|
|
@@ -8826,7 +8826,7 @@ function useRecoveryDetection(input) {
|
|
|
8826
8826
|
const record = recordRef.current;
|
|
8827
8827
|
setPrompt(null);
|
|
8828
8828
|
if (record && onRestore) {
|
|
8829
|
-
onRestore(
|
|
8829
|
+
onRestore(chunkSEJEVNXW_js.acceptAutosaveRecovery(record));
|
|
8830
8830
|
}
|
|
8831
8831
|
recordRef.current = null;
|
|
8832
8832
|
}, [onRestore]);
|
|
@@ -8835,7 +8835,7 @@ function useRecoveryDetection(input) {
|
|
|
8835
8835
|
setPrompt(null);
|
|
8836
8836
|
recordRef.current = null;
|
|
8837
8837
|
if (record) {
|
|
8838
|
-
void
|
|
8838
|
+
void chunkSEJEVNXW_js.discardAutosaveRecovery(record);
|
|
8839
8839
|
}
|
|
8840
8840
|
}, []);
|
|
8841
8841
|
return { prompt, restore, discard };
|
|
@@ -8879,11 +8879,11 @@ function usePresentationSetup(input) {
|
|
|
8879
8879
|
containerRef,
|
|
8880
8880
|
content,
|
|
8881
8881
|
onSetMode: (nextMode) => {
|
|
8882
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8882
|
+
if (mode === "present" && nextMode !== "present" && !chunkSEJEVNXW_js.mayLeaveSlideShow()) {
|
|
8883
8883
|
return;
|
|
8884
8884
|
}
|
|
8885
8885
|
if (mode === "present" && nextMode !== "present") {
|
|
8886
|
-
|
|
8886
|
+
chunkSEJEVNXW_js.stopAllPersistentAudio();
|
|
8887
8887
|
stopAnimationSound();
|
|
8888
8888
|
const exitHandler = exitModeHandlerRef.current;
|
|
8889
8889
|
if (exitHandler) {
|
|
@@ -8945,10 +8945,10 @@ function usePresentationSetup(input) {
|
|
|
8945
8945
|
onToggleToolbar: () => annotations.setToolbarVisible(!annotations.toolbarVisible),
|
|
8946
8946
|
onToggleSubtitles,
|
|
8947
8947
|
onSaveRehearsalTimings: (timings) => {
|
|
8948
|
-
setSlides((prev) =>
|
|
8948
|
+
setSlides((prev) => chunkSEJEVNXW_js.applyRehearsalTimings(prev, timings));
|
|
8949
8949
|
history.markDirty();
|
|
8950
8950
|
},
|
|
8951
|
-
loopContinuously:
|
|
8951
|
+
loopContinuously: chunkSEJEVNXW_js.shouldLoopContinuously(presentationProperties),
|
|
8952
8952
|
showWithAnimation: presentationProperties.showWithAnimation,
|
|
8953
8953
|
useTimings: presentationProperties.advanceMode !== "manual",
|
|
8954
8954
|
endWithBlackSlide,
|
|
@@ -9152,7 +9152,7 @@ function useEditorOperations(input) {
|
|
|
9152
9152
|
const { formatPainterActive, setFormatPainterActive, elementLookup } = state;
|
|
9153
9153
|
react.useEffect(() => {
|
|
9154
9154
|
if (formatPainterActive && !prevFormatPainterRef.current && selectedElement) {
|
|
9155
|
-
copiedFormatRef.current =
|
|
9155
|
+
copiedFormatRef.current = chunkSEJEVNXW_js.copyFormatFromElement(selectedElement);
|
|
9156
9156
|
} else if (!formatPainterActive) {
|
|
9157
9157
|
copiedFormatRef.current = null;
|
|
9158
9158
|
}
|
|
@@ -9178,12 +9178,12 @@ function useEditorOperations(input) {
|
|
|
9178
9178
|
e.stopPropagation();
|
|
9179
9179
|
const element = elementLookup.get(elementId);
|
|
9180
9180
|
if (element) {
|
|
9181
|
-
const updated =
|
|
9181
|
+
const updated = chunkSEJEVNXW_js.applyFormatToElement(element, copiedFormatRef.current);
|
|
9182
9182
|
const updates = {};
|
|
9183
|
-
if (
|
|
9183
|
+
if (chunkSEJEVNXW_js.hasShapeProperties(updated)) {
|
|
9184
9184
|
updates.shapeStyle = updated.shapeStyle;
|
|
9185
9185
|
}
|
|
9186
|
-
if (
|
|
9186
|
+
if (chunkSEJEVNXW_js.hasTextProperties(updated)) {
|
|
9187
9187
|
updates.textStyle = updated.textStyle;
|
|
9188
9188
|
}
|
|
9189
9189
|
ops.updateElementById(elementId, updates);
|
|
@@ -9369,10 +9369,10 @@ function useFontInjection({ embeddedFonts, slides }) {
|
|
|
9369
9369
|
}
|
|
9370
9370
|
};
|
|
9371
9371
|
}, [embeddedFonts]);
|
|
9372
|
-
const referencedFamilies = react.useMemo(() =>
|
|
9372
|
+
const referencedFamilies = react.useMemo(() => chunkSEJEVNXW_js.collectReferencedFontFamilies(slides), [slides]);
|
|
9373
9373
|
react.useEffect(() => {
|
|
9374
9374
|
let cancelled = false;
|
|
9375
|
-
void
|
|
9375
|
+
void chunkSEJEVNXW_js.resolveGoogleWebfontHref(slides, embeddedFonts).then((href) => {
|
|
9376
9376
|
if (cancelled) {
|
|
9377
9377
|
return null;
|
|
9378
9378
|
}
|
|
@@ -9555,7 +9555,7 @@ function useKeyboardShortcuts(input) {
|
|
|
9555
9555
|
inputRef.current = input;
|
|
9556
9556
|
const handleKeyDown = react.useCallback((e) => {
|
|
9557
9557
|
const current = inputRef.current;
|
|
9558
|
-
const startAction =
|
|
9558
|
+
const startAction = chunkSEJEVNXW_js.mapSlideShowStartKey(e, { isPresenting: current.mode === "present" });
|
|
9559
9559
|
if (startAction !== null) {
|
|
9560
9560
|
e.preventDefault();
|
|
9561
9561
|
if (startAction === "fromBeginning") {
|
|
@@ -9565,7 +9565,7 @@ function useKeyboardShortcuts(input) {
|
|
|
9565
9565
|
}
|
|
9566
9566
|
return;
|
|
9567
9567
|
}
|
|
9568
|
-
const { action, dx, dy } =
|
|
9568
|
+
const { action, dx, dy } = chunkSEJEVNXW_js.mapEditorKey(e, {
|
|
9569
9569
|
canEdit: current.canEdit,
|
|
9570
9570
|
// The Slide Master view is an editing surface, not a viewing one.
|
|
9571
9571
|
// Gating on `mode !== 'edit'` alone made `mapEditorKey` return
|
|
@@ -9578,7 +9578,7 @@ function useKeyboardShortcuts(input) {
|
|
|
9578
9578
|
hasSelection: current.hasSelection,
|
|
9579
9579
|
isEditingText: Boolean(current.inlineEditingElementId || current.tableEditorState?.isEditing),
|
|
9580
9580
|
isDrawing: current.activeTool !== "select",
|
|
9581
|
-
isTextInputTarget:
|
|
9581
|
+
isTextInputTarget: chunkSEJEVNXW_js.isEditorTextInputTarget(e.target)
|
|
9582
9582
|
});
|
|
9583
9583
|
if (action === null) {
|
|
9584
9584
|
return;
|
|
@@ -9906,7 +9906,7 @@ function useViewerIntegration(input) {
|
|
|
9906
9906
|
return zoom.scale;
|
|
9907
9907
|
},
|
|
9908
9908
|
setZoom(level) {
|
|
9909
|
-
zoom.setScale(
|
|
9909
|
+
zoom.setScale(chunkSEJEVNXW_js.clampZoomScale(level));
|
|
9910
9910
|
},
|
|
9911
9911
|
zoomIn() {
|
|
9912
9912
|
zoom.handleZoomIn();
|
|
@@ -10124,7 +10124,7 @@ function useReducedMotion() {
|
|
|
10124
10124
|
}
|
|
10125
10125
|
function useViewerOptions() {
|
|
10126
10126
|
const storeRef = react.useRef(null);
|
|
10127
|
-
storeRef.current ??=
|
|
10127
|
+
storeRef.current ??= chunkSEJEVNXW_js.createViewerOptionsStore();
|
|
10128
10128
|
const store = storeRef.current;
|
|
10129
10129
|
const options = react.useSyncExternalStore(
|
|
10130
10130
|
(onStoreChange) => store.subscribe(onStoreChange),
|
|
@@ -10133,9 +10133,9 @@ function useViewerOptions() {
|
|
|
10133
10133
|
);
|
|
10134
10134
|
return { optionsStore: store, options };
|
|
10135
10135
|
}
|
|
10136
|
-
var KNOWN_TAB_IDS = new Set(
|
|
10136
|
+
var KNOWN_TAB_IDS = new Set(chunkSEJEVNXW_js.TOOLBAR_TABS.map((tab) => tab.id));
|
|
10137
10137
|
function computeToolbarVisibility(hiddenActions, hiddenTabIds = []) {
|
|
10138
|
-
const isHidden = (id) =>
|
|
10138
|
+
const isHidden = (id) => chunkSEJEVNXW_js.isActionHidden(id, hiddenActions);
|
|
10139
10139
|
const userHidden = new Set(hiddenTabIds);
|
|
10140
10140
|
userHidden.delete("file");
|
|
10141
10141
|
const isTabVisible = (id) => !KNOWN_TAB_IDS.has(id) || !isHidden(id) && !userHidden.has(id);
|
|
@@ -10227,12 +10227,12 @@ function useYjsDocumentSync({
|
|
|
10227
10227
|
return;
|
|
10228
10228
|
}
|
|
10229
10229
|
try {
|
|
10230
|
-
const handler = new
|
|
10230
|
+
const handler = new chunkSEJEVNXW_js.PptxHandler();
|
|
10231
10231
|
await handler.load(sourceBytes.buffer);
|
|
10232
|
-
const currentSlides =
|
|
10232
|
+
const currentSlides = chunkSEJEVNXW_js.readSlidesFromYDoc(
|
|
10233
10233
|
doc
|
|
10234
10234
|
);
|
|
10235
|
-
const slidesToSave =
|
|
10235
|
+
const slidesToSave = chunkSEJEVNXW_js.buildSaveSlides(currentSlides, templateElementsBySlideId);
|
|
10236
10236
|
const bytes = await handler.save(slidesToSave);
|
|
10237
10237
|
config.onWriteBack(bytes);
|
|
10238
10238
|
} catch {
|
|
@@ -10247,10 +10247,10 @@ function useYjsDocumentSync({
|
|
|
10247
10247
|
if (!doc || !isConnected) {
|
|
10248
10248
|
return;
|
|
10249
10249
|
}
|
|
10250
|
-
const docSlides =
|
|
10250
|
+
const docSlides = chunkSEJEVNXW_js.readSlidesFromYDoc(
|
|
10251
10251
|
doc
|
|
10252
10252
|
);
|
|
10253
|
-
if (!
|
|
10253
|
+
if (!chunkSEJEVNXW_js.shouldRoomSlidesReplaceLoad(loadOrigin, docSlides.length)) {
|
|
10254
10254
|
return;
|
|
10255
10255
|
}
|
|
10256
10256
|
lastSyncedRef.current = JSON.stringify(docSlides);
|
|
@@ -10269,11 +10269,11 @@ function useYjsDocumentSync({
|
|
|
10269
10269
|
lastSyncedRef.current = serialized;
|
|
10270
10270
|
void (async () => {
|
|
10271
10271
|
const factories = await getFactories();
|
|
10272
|
-
|
|
10272
|
+
chunkSEJEVNXW_js.reconcileSlidesInYDoc(
|
|
10273
10273
|
slides,
|
|
10274
10274
|
doc,
|
|
10275
10275
|
factories,
|
|
10276
|
-
|
|
10276
|
+
chunkSEJEVNXW_js.LOCAL_SYNC_ORIGIN
|
|
10277
10277
|
);
|
|
10278
10278
|
scheduleWriteBack();
|
|
10279
10279
|
})();
|
|
@@ -10287,10 +10287,10 @@ function useYjsDocumentSync({
|
|
|
10287
10287
|
return;
|
|
10288
10288
|
}
|
|
10289
10289
|
const handleChange = (_events, transaction) => {
|
|
10290
|
-
if (transaction?.origin ===
|
|
10290
|
+
if (transaction?.origin === chunkSEJEVNXW_js.LOCAL_SYNC_ORIGIN) {
|
|
10291
10291
|
return;
|
|
10292
10292
|
}
|
|
10293
|
-
const remoteSlides =
|
|
10293
|
+
const remoteSlides = chunkSEJEVNXW_js.readSlidesFromYDoc(
|
|
10294
10294
|
doc
|
|
10295
10295
|
);
|
|
10296
10296
|
if (remoteSlides.length === 0) {
|
|
@@ -10306,7 +10306,7 @@ function useYjsDocumentSync({
|
|
|
10306
10306
|
isApplyingRemoteRef.current = false;
|
|
10307
10307
|
scheduleWriteBack();
|
|
10308
10308
|
};
|
|
10309
|
-
const unobserve =
|
|
10309
|
+
const unobserve = chunkSEJEVNXW_js.observeYDocSlides(
|
|
10310
10310
|
doc,
|
|
10311
10311
|
handleChange
|
|
10312
10312
|
);
|
|
@@ -10344,7 +10344,7 @@ function useBroadcastFollower({
|
|
|
10344
10344
|
if (!broadcaster) {
|
|
10345
10345
|
return;
|
|
10346
10346
|
}
|
|
10347
|
-
if (!
|
|
10347
|
+
if (!chunkSEJEVNXW_js.shouldAutoFollowBroadcaster({
|
|
10348
10348
|
localRole: collab.config.role,
|
|
10349
10349
|
broadcasterRole: broadcaster.role
|
|
10350
10350
|
})) {
|
|
@@ -10515,7 +10515,7 @@ function subscribeTouchCapability(callback) {
|
|
|
10515
10515
|
function useIsMobile() {
|
|
10516
10516
|
const isTouchDevice = react.useSyncExternalStore(
|
|
10517
10517
|
subscribeTouchCapability,
|
|
10518
|
-
|
|
10518
|
+
chunkSEJEVNXW_js.detectTouchDevice,
|
|
10519
10519
|
() => false
|
|
10520
10520
|
// server snapshot
|
|
10521
10521
|
);
|
|
@@ -10525,7 +10525,7 @@ function useIsMobile() {
|
|
|
10525
10525
|
const [viewportHeight, setViewportHeight] = react.useState(
|
|
10526
10526
|
() => typeof window === "undefined" ? 768 : window.innerHeight
|
|
10527
10527
|
);
|
|
10528
|
-
const [orientation, setOrientation] = react.useState(
|
|
10528
|
+
const [orientation, setOrientation] = react.useState(chunkSEJEVNXW_js.detectOrientation);
|
|
10529
10529
|
const [isVirtualKeyboardOpen, setIsVirtualKeyboardOpen] = react.useState(false);
|
|
10530
10530
|
const [initialViewportHeight] = react.useState(
|
|
10531
10531
|
() => typeof window !== "undefined" ? window.innerHeight : 800
|
|
@@ -10546,7 +10546,7 @@ function useIsMobile() {
|
|
|
10546
10546
|
return;
|
|
10547
10547
|
}
|
|
10548
10548
|
const handleOrientationChange = () => {
|
|
10549
|
-
setOrientation(
|
|
10549
|
+
setOrientation(chunkSEJEVNXW_js.detectOrientation());
|
|
10550
10550
|
};
|
|
10551
10551
|
if (screen.orientation) {
|
|
10552
10552
|
screen.orientation.addEventListener("change", handleOrientationChange);
|
|
@@ -10576,7 +10576,7 @@ function useIsMobile() {
|
|
|
10576
10576
|
window.addEventListener("resize", handleResize);
|
|
10577
10577
|
return () => window.removeEventListener("resize", handleResize);
|
|
10578
10578
|
}, [isTouchDevice, initialViewportHeight]);
|
|
10579
|
-
const { isMobile, isTablet, isDesktop } =
|
|
10579
|
+
const { isMobile, isTablet, isDesktop } = chunkSEJEVNXW_js.deriveViewportBreakpoints(
|
|
10580
10580
|
viewportWidth,
|
|
10581
10581
|
viewportHeight,
|
|
10582
10582
|
isTouchDevice
|
|
@@ -10607,10 +10607,10 @@ function useTouchGestures(input) {
|
|
|
10607
10607
|
if (!el || !enabled) {
|
|
10608
10608
|
return;
|
|
10609
10609
|
}
|
|
10610
|
-
const recognizer =
|
|
10610
|
+
const recognizer = chunkSEJEVNXW_js.createTouchGestureRecognizer({
|
|
10611
10611
|
getScale: () => scaleRef.current,
|
|
10612
|
-
minScale:
|
|
10613
|
-
maxScale:
|
|
10612
|
+
minScale: chunkSEJEVNXW_js.MIN_ZOOM_SCALE,
|
|
10613
|
+
maxScale: chunkSEJEVNXW_js.MAX_ZOOM_SCALE,
|
|
10614
10614
|
callbacks: {
|
|
10615
10615
|
onPinchZoom: (newScale) => callbacksRef.current.onPinchZoom?.(newScale),
|
|
10616
10616
|
onSwipe: (direction) => callbacksRef.current.onSwipe?.(direction),
|
|
@@ -10650,7 +10650,7 @@ function scrollFocusedIntoView(keyboardInset) {
|
|
|
10650
10650
|
return;
|
|
10651
10651
|
}
|
|
10652
10652
|
const rect = active.getBoundingClientRect();
|
|
10653
|
-
const delta =
|
|
10653
|
+
const delta = chunkSEJEVNXW_js.computeScrollDelta(
|
|
10654
10654
|
{ top: rect.top, bottom: rect.bottom },
|
|
10655
10655
|
window.innerHeight,
|
|
10656
10656
|
keyboardInset
|
|
@@ -10670,8 +10670,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10670
10670
|
return;
|
|
10671
10671
|
}
|
|
10672
10672
|
const update = () => {
|
|
10673
|
-
const metrics =
|
|
10674
|
-
const inset = metrics ?
|
|
10673
|
+
const metrics = chunkSEJEVNXW_js.readViewportMetrics(window);
|
|
10674
|
+
const inset = metrics ? chunkSEJEVNXW_js.computeKeyboardInset(metrics) : 0;
|
|
10675
10675
|
setKeyboardInset(inset);
|
|
10676
10676
|
if (inset > 0) {
|
|
10677
10677
|
window.requestAnimationFrame(() => scrollFocusedIntoView(inset));
|
|
@@ -10682,8 +10682,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10682
10682
|
vv.addEventListener("scroll", update);
|
|
10683
10683
|
const onFocusIn = () => {
|
|
10684
10684
|
window.requestAnimationFrame(() => {
|
|
10685
|
-
const metrics =
|
|
10686
|
-
const inset = metrics ?
|
|
10685
|
+
const metrics = chunkSEJEVNXW_js.readViewportMetrics(window);
|
|
10686
|
+
const inset = metrics ? chunkSEJEVNXW_js.computeKeyboardInset(metrics) : 0;
|
|
10687
10687
|
if (inset > 0) {
|
|
10688
10688
|
scrollFocusedIntoView(inset);
|
|
10689
10689
|
}
|
|
@@ -10696,7 +10696,7 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10696
10696
|
document.removeEventListener("focusin", onFocusIn);
|
|
10697
10697
|
};
|
|
10698
10698
|
}, [enabled]);
|
|
10699
|
-
return { keyboardInset, isKeyboardOpen:
|
|
10699
|
+
return { keyboardInset, isKeyboardOpen: chunkSEJEVNXW_js.isKeyboardOpen(keyboardInset) };
|
|
10700
10700
|
}
|
|
10701
10701
|
|
|
10702
10702
|
// src/viewer/hooks/useViewerBuildingBlocks-canvas-props.ts
|
|
@@ -10725,21 +10725,21 @@ function buildCanvasProps(input) {
|
|
|
10725
10725
|
} = input;
|
|
10726
10726
|
const effectiveSlide = mode === "master" ? masterPseudoSlide : activeSlide;
|
|
10727
10727
|
const effectiveTemplateElements = mode === "master" ? s.activeLayout ? s.activeMaster?.elements ?? [] : [] : templateElements;
|
|
10728
|
-
const fieldContext =
|
|
10728
|
+
const fieldContext = chunkSEJEVNXW_js.buildFieldSubstitutionContext({
|
|
10729
10729
|
headerFooter: s.headerFooter,
|
|
10730
10730
|
customProperties: s.customProperties,
|
|
10731
10731
|
slide: activeSlide
|
|
10732
10732
|
});
|
|
10733
10733
|
const tableStyleContext = s.theme || s.tableStyleMap ? { theme: s.theme, tableStyleMap: s.tableStyleMap } : void 0;
|
|
10734
10734
|
const openExternalUrl = (url) => {
|
|
10735
|
-
if (
|
|
10735
|
+
if (chunkSEJEVNXW_js.shouldConfirmExternalHyperlink(viewerOptions, url) && !window.confirm(buildHyperlinkConfirmMessage(url))) {
|
|
10736
10736
|
return;
|
|
10737
10737
|
}
|
|
10738
|
-
|
|
10738
|
+
chunkSEJEVNXW_js.safeOpenUrl(url);
|
|
10739
10739
|
};
|
|
10740
10740
|
const handleActionClick = (elementId, action) => {
|
|
10741
10741
|
if (mode === "present") {
|
|
10742
|
-
const resolved =
|
|
10742
|
+
const resolved = chunkSEJEVNXW_js.resolvePresentationAction(action, { slideCount: slides.length });
|
|
10743
10743
|
if (resolved.intent.kind === "openUrl") {
|
|
10744
10744
|
openExternalUrl(resolved.intent.url);
|
|
10745
10745
|
return;
|
|
@@ -10750,9 +10750,9 @@ function buildCanvasProps(input) {
|
|
|
10750
10750
|
}
|
|
10751
10751
|
};
|
|
10752
10752
|
const handleHyperlinkClick = (url) => {
|
|
10753
|
-
if (
|
|
10753
|
+
if (chunkSEJEVNXW_js.isPpactionUrl(url)) {
|
|
10754
10754
|
if (mode === "present") {
|
|
10755
|
-
const parsed =
|
|
10755
|
+
const parsed = chunkSEJEVNXW_js.parsePpactionUrl(url);
|
|
10756
10756
|
if (parsed) {
|
|
10757
10757
|
presentation.handlePresentationAction({
|
|
10758
10758
|
action: parsed.action,
|
|
@@ -10858,7 +10858,7 @@ function buildCanvasProps(input) {
|
|
|
10858
10858
|
|
|
10859
10859
|
// src/viewer/hooks/useScopedLayoutOptions.ts
|
|
10860
10860
|
function scopeLayoutOptionsToActiveSlide(options, activeSlide) {
|
|
10861
|
-
return
|
|
10861
|
+
return chunkSEJEVNXW_js.scopeLayoutOptionsToSlide(options, activeSlide?.layoutPath);
|
|
10862
10862
|
}
|
|
10863
10863
|
|
|
10864
10864
|
// src/viewer/hooks/useViewerBuildingBlocks-toolbar-handlers.ts
|
|
@@ -10871,7 +10871,7 @@ function buildToolbarAnimationHandlers(input) {
|
|
|
10871
10871
|
const current = activeSlide.animations ?? [];
|
|
10872
10872
|
if (group === "motionPath") {
|
|
10873
10873
|
propertyHandlers.handleUpdateSlide({
|
|
10874
|
-
animations:
|
|
10874
|
+
animations: chunkSEJEVNXW_js.applyMotionPathPreset(current, selectedElement.id, preset)
|
|
10875
10875
|
});
|
|
10876
10876
|
return;
|
|
10877
10877
|
}
|
|
@@ -11066,7 +11066,7 @@ function buildToolbarProps(input) {
|
|
|
11066
11066
|
onOpenFile,
|
|
11067
11067
|
onOpenRecentFile,
|
|
11068
11068
|
onCreatePresentation: (templateId) => {
|
|
11069
|
-
s.setSlides(
|
|
11069
|
+
s.setSlides(chunkSEJEVNXW_js.createBackstagePresentation(templateId));
|
|
11070
11070
|
s.setActiveSlideIndex(0);
|
|
11071
11071
|
s.setSelectedElementId(null);
|
|
11072
11072
|
s.setSelectedElementIds([]);
|
|
@@ -11095,7 +11095,7 @@ function buildToolbarProps(input) {
|
|
|
11095
11095
|
loadLayoutPreviews: input.loadLayoutPreviews,
|
|
11096
11096
|
onInsertSlideFromLayout: slideOps.handleInsertSlideFromLayout,
|
|
11097
11097
|
onInsertSlideFromTemplate: slideOps.handleInsertSlideFromTemplate,
|
|
11098
|
-
templateScheme:
|
|
11098
|
+
templateScheme: chunkSEJEVNXW_js.templateSchemeFromTheme(s.theme?.colorScheme),
|
|
11099
11099
|
customShows: s.customShows,
|
|
11100
11100
|
activeCustomShowId: s.activeCustomShowId,
|
|
11101
11101
|
onSetActiveCustomShowId: s.setActiveCustomShowId,
|
|
@@ -11136,7 +11136,7 @@ function buildToolbarProps(input) {
|
|
|
11136
11136
|
isCommentsPanelOpen: s.isInspectorPaneOpen,
|
|
11137
11137
|
slideCommentCount: activeSlide?.comments?.length ?? 0,
|
|
11138
11138
|
formatPainterActive: s.formatPainterActive,
|
|
11139
|
-
canActivateFormatPainter:
|
|
11139
|
+
canActivateFormatPainter: chunkSEJEVNXW_js.hasCopyableFormat(selectedElement),
|
|
11140
11140
|
onToggleFormatPainter: () => s.setFormatPainterActive((p) => !p),
|
|
11141
11141
|
isSelectionPaneOpen: s.isSelectionPaneOpen,
|
|
11142
11142
|
onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
|
|
@@ -11210,7 +11210,7 @@ function useViewerBuildingBlocksCore(input) {
|
|
|
11210
11210
|
headerFooter: state.headerFooter,
|
|
11211
11211
|
loading,
|
|
11212
11212
|
error,
|
|
11213
|
-
maxHistoryEntries:
|
|
11213
|
+
maxHistoryEntries: chunkSEJEVNXW_js.resolveHistoryDepth(viewerOptions),
|
|
11214
11214
|
hasActivePointerInteraction,
|
|
11215
11215
|
pointerCommitNonce: state.pointerCommitNonce,
|
|
11216
11216
|
setSlides: state.setSlides,
|
|
@@ -11277,7 +11277,7 @@ function useViewerBuildingBlocksCore(input) {
|
|
|
11277
11277
|
gridSpacingPx,
|
|
11278
11278
|
// Multiplied against the pre-existing 2x baseline; see the matching
|
|
11279
11279
|
// comment in `PowerPointViewer.tsx`.
|
|
11280
|
-
imageExportScale: 2 *
|
|
11280
|
+
imageExportScale: 2 * chunkSEJEVNXW_js.resolveImageResolutionScale(viewerOptions),
|
|
11281
11281
|
viewerOptions
|
|
11282
11282
|
};
|
|
11283
11283
|
}
|
|
@@ -11293,7 +11293,7 @@ function useCompatibilityToastsState() {
|
|
|
11293
11293
|
}
|
|
11294
11294
|
function useReadOnlyRecommendationState(content) {
|
|
11295
11295
|
const [recommendation, setRecommendation] = react.useState(
|
|
11296
|
-
() =>
|
|
11296
|
+
() => chunkSEJEVNXW_js.readOnlyRecommendation(void 0)
|
|
11297
11297
|
);
|
|
11298
11298
|
const [bannerHidden, setBannerHidden] = react.useState(false);
|
|
11299
11299
|
const [editAnywayActive, setEditAnywayActive] = react.useState(false);
|
|
@@ -11331,9 +11331,9 @@ function useViewPreferencesSync(input) {
|
|
|
11331
11331
|
setShowGuides
|
|
11332
11332
|
} = input;
|
|
11333
11333
|
react.useEffect(() => {
|
|
11334
|
-
const seeded =
|
|
11334
|
+
const seeded = chunkSEJEVNXW_js.viewerPreferencesFromViewProperties(
|
|
11335
11335
|
{ viewProperties },
|
|
11336
|
-
{ ...
|
|
11336
|
+
{ ...chunkSEJEVNXW_js.DEFAULT_VIEWER_PREFERENCES, snapToGrid, snapToObjects: snapToShape, showGuides }
|
|
11337
11337
|
);
|
|
11338
11338
|
setSnapToGrid(seeded.snapToGrid);
|
|
11339
11339
|
setSnapToShape(seeded.snapToObjects ?? snapToShape);
|
|
@@ -11343,7 +11343,7 @@ function useViewPreferencesSync(input) {
|
|
|
11343
11343
|
(prefsOverride) => {
|
|
11344
11344
|
setViewProperties((prev) => {
|
|
11345
11345
|
const merged = {
|
|
11346
|
-
...
|
|
11346
|
+
...chunkSEJEVNXW_js.DEFAULT_VIEWER_PREFERENCES,
|
|
11347
11347
|
snapToGrid,
|
|
11348
11348
|
snapToObjects: snapToShape,
|
|
11349
11349
|
showGuides,
|
|
@@ -11351,7 +11351,7 @@ function useViewPreferencesSync(input) {
|
|
|
11351
11351
|
gridSpacingCy: prev?.gridSpacing?.cy,
|
|
11352
11352
|
...prefsOverride
|
|
11353
11353
|
};
|
|
11354
|
-
const patch =
|
|
11354
|
+
const patch = chunkSEJEVNXW_js.viewPropertiesPatchFromPreferences(merged);
|
|
11355
11355
|
return {
|
|
11356
11356
|
...prev,
|
|
11357
11357
|
slideViewPr: { ...prev?.slideViewPr, ...patch.slideViewPr },
|
|
@@ -11569,7 +11569,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
11569
11569
|
}, [incomingContent]);
|
|
11570
11570
|
const onOpenFile = react.useCallback(() => {
|
|
11571
11571
|
void (async () => {
|
|
11572
|
-
const picked = await
|
|
11572
|
+
const picked = await chunkSEJEVNXW_js.openPptxFile();
|
|
11573
11573
|
if (picked) {
|
|
11574
11574
|
setContent(picked.buffer);
|
|
11575
11575
|
}
|
|
@@ -11577,7 +11577,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
11577
11577
|
}, []);
|
|
11578
11578
|
const onOpenRecentFile = react.useCallback((key) => {
|
|
11579
11579
|
void (async () => {
|
|
11580
|
-
const bytes = await
|
|
11580
|
+
const bytes = await chunkSEJEVNXW_js.readBackstageRecentFile(key);
|
|
11581
11581
|
if (bytes) {
|
|
11582
11582
|
setContent(bytes);
|
|
11583
11583
|
}
|