pptx-react-viewer 3.16.3 → 3.16.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/{AiChatPanel-G33WODR7.js → AiChatPanel-QJKB2BL3.js} +24 -24
- package/dist/AiChatPanel-QJKB2BL3.js.br +0 -0
- package/dist/AiChatPanel-QJKB2BL3.js.gz +0 -0
- package/dist/{AiChatPanel-X7NUNEJO.mjs → AiChatPanel-YWYME2RM.mjs} +3 -3
- package/dist/AiChatPanel-YWYME2RM.mjs.br +0 -0
- package/dist/AiChatPanel-YWYME2RM.mjs.gz +0 -0
- package/dist/{Area3DChartScene-HBTW5EQP.mjs → Area3DChartScene-47SQRQTD.mjs} +1 -1
- package/dist/Area3DChartScene-47SQRQTD.mjs.br +0 -0
- package/dist/Area3DChartScene-47SQRQTD.mjs.gz +0 -0
- package/dist/{Area3DChartScene-R3P4NSR5.js → Area3DChartScene-DEWKUQUS.js} +2 -2
- package/dist/{Area3DChartScene-R3P4NSR5.js.br → Area3DChartScene-DEWKUQUS.js.br} +0 -0
- package/dist/Area3DChartScene-DEWKUQUS.js.gz +0 -0
- package/dist/{Bar3DChartScene-6IKIGGD7.js → Bar3DChartScene-HRCZHDNT.js} +2 -2
- package/dist/Bar3DChartScene-HRCZHDNT.js.br +0 -0
- package/dist/Bar3DChartScene-HRCZHDNT.js.gz +0 -0
- package/dist/{Bar3DChartScene-RTHG6TVC.mjs → Bar3DChartScene-JXXBIKLB.mjs} +1 -1
- package/dist/{Bar3DChartScene-RTHG6TVC.mjs.br → Bar3DChartScene-JXXBIKLB.mjs.br} +0 -0
- package/dist/Bar3DChartScene-JXXBIKLB.mjs.gz +0 -0
- package/dist/{Line3DChartScene-HNNC2O66.js → Line3DChartScene-JPHU2WGC.js} +2 -2
- package/dist/{Line3DChartScene-HNNC2O66.js.br → Line3DChartScene-JPHU2WGC.js.br} +0 -0
- package/dist/Line3DChartScene-JPHU2WGC.js.gz +0 -0
- package/dist/{Line3DChartScene-WQIUFVLB.mjs → Line3DChartScene-S2SV5HCH.mjs} +1 -1
- package/dist/{Line3DChartScene-WQIUFVLB.mjs.br → Line3DChartScene-S2SV5HCH.mjs.br} +0 -0
- package/dist/Line3DChartScene-S2SV5HCH.mjs.gz +0 -0
- package/dist/{Model3DScene-BPHGVJQG.mjs → Model3DScene-4MOLASW6.mjs} +1 -1
- package/dist/Model3DScene-4MOLASW6.mjs.br +0 -0
- package/dist/Model3DScene-4MOLASW6.mjs.gz +0 -0
- package/dist/{Model3DScene-AAMDGTRI.js → Model3DScene-JP4ICMLY.js} +2 -2
- package/dist/Model3DScene-JP4ICMLY.js.br +0 -0
- package/dist/Model3DScene-JP4ICMLY.js.gz +0 -0
- package/dist/{PieChart3DScene-S5OWDFJN.mjs → PieChart3DScene-PV7BN7MS.mjs} +1 -1
- package/dist/{PieChart3DScene-S5OWDFJN.mjs.br → PieChart3DScene-PV7BN7MS.mjs.br} +0 -0
- package/dist/PieChart3DScene-PV7BN7MS.mjs.gz +0 -0
- package/dist/{PieChart3DScene-LO6IJAWY.js → PieChart3DScene-QYWGHJGG.js} +2 -2
- package/dist/{PieChart3DScene-LO6IJAWY.js.br → PieChart3DScene-QYWGHJGG.js.br} +0 -0
- package/dist/PieChart3DScene-QYWGHJGG.js.gz +0 -0
- package/dist/{SurfaceChart3DScene-7CKYX5HW.mjs → SurfaceChart3DScene-7ONY7OIY.mjs} +1 -1
- package/dist/SurfaceChart3DScene-7ONY7OIY.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-7ONY7OIY.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-FLQRXC6F.js → SurfaceChart3DScene-KAD2GVBY.js} +2 -2
- package/dist/{SurfaceChart3DScene-FLQRXC6F.js.br → SurfaceChart3DScene-KAD2GVBY.js.br} +0 -0
- package/dist/SurfaceChart3DScene-KAD2GVBY.js.gz +0 -0
- package/dist/{chunk-CVS2CHLU.js → chunk-4WGGCKLD.js} +5 -5
- package/dist/chunk-4WGGCKLD.js.br +0 -0
- package/dist/chunk-4WGGCKLD.js.gz +0 -0
- package/dist/{chunk-VA2JFII4.mjs → chunk-6TGJ5RGQ.mjs} +1 -1
- package/dist/chunk-6TGJ5RGQ.mjs.br +0 -0
- package/dist/{chunk-VA2JFII4.mjs.gz → chunk-6TGJ5RGQ.mjs.gz} +0 -0
- package/dist/{chunk-QMLJFL7G.js → chunk-EDCU5EK5.js} +451 -451
- package/dist/chunk-EDCU5EK5.js.br +0 -0
- package/dist/chunk-EDCU5EK5.js.gz +0 -0
- package/dist/{chunk-WTPGQ3K7.mjs → chunk-IKQY2ZU2.mjs} +1 -1
- package/dist/chunk-IKQY2ZU2.mjs.br +0 -0
- package/dist/chunk-IKQY2ZU2.mjs.gz +0 -0
- package/dist/{chunk-VVAXSNG5.mjs → chunk-ISXUHV3L.mjs} +2 -2
- package/dist/chunk-ISXUHV3L.mjs.br +0 -0
- package/dist/chunk-ISXUHV3L.mjs.gz +0 -0
- package/dist/{chunk-4CLG3TRU.js → chunk-NMSZ3NSG.js} +169 -169
- package/dist/chunk-NMSZ3NSG.js.br +0 -0
- package/dist/chunk-NMSZ3NSG.js.gz +0 -0
- package/dist/{chunk-3TPQY6WR.js → chunk-PABSSYRA.js} +134 -103
- package/dist/chunk-PABSSYRA.js.br +0 -0
- package/dist/chunk-PABSSYRA.js.gz +0 -0
- package/dist/{chunk-4U3OI6J3.mjs → chunk-R5CW64K4.mjs} +134 -103
- package/dist/chunk-R5CW64K4.mjs.br +0 -0
- package/dist/chunk-R5CW64K4.mjs.gz +0 -0
- package/dist/{chunk-2G2MMJRA.mjs → chunk-USQGKC4A.mjs} +12 -12
- package/dist/chunk-USQGKC4A.mjs.br +0 -0
- package/dist/chunk-USQGKC4A.mjs.gz +0 -0
- package/dist/{chunk-AAVKRMQA.js → chunk-ZWZGKJ4E.js} +1290 -1290
- package/dist/chunk-ZWZGKJ4E.js.br +0 -0
- package/dist/chunk-ZWZGKJ4E.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-G33WODR7.js.br +0 -0
- package/dist/AiChatPanel-G33WODR7.js.gz +0 -0
- package/dist/AiChatPanel-X7NUNEJO.mjs.br +0 -0
- package/dist/AiChatPanel-X7NUNEJO.mjs.gz +0 -0
- package/dist/Area3DChartScene-HBTW5EQP.mjs.br +0 -0
- package/dist/Area3DChartScene-HBTW5EQP.mjs.gz +0 -0
- package/dist/Area3DChartScene-R3P4NSR5.js.gz +0 -0
- package/dist/Bar3DChartScene-6IKIGGD7.js.br +0 -0
- package/dist/Bar3DChartScene-6IKIGGD7.js.gz +0 -0
- package/dist/Bar3DChartScene-RTHG6TVC.mjs.gz +0 -0
- package/dist/Line3DChartScene-HNNC2O66.js.gz +0 -0
- package/dist/Line3DChartScene-WQIUFVLB.mjs.gz +0 -0
- package/dist/Model3DScene-AAMDGTRI.js.br +0 -0
- package/dist/Model3DScene-AAMDGTRI.js.gz +0 -0
- package/dist/Model3DScene-BPHGVJQG.mjs.br +0 -0
- package/dist/Model3DScene-BPHGVJQG.mjs.gz +0 -0
- package/dist/PieChart3DScene-LO6IJAWY.js.gz +0 -0
- package/dist/PieChart3DScene-S5OWDFJN.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-7CKYX5HW.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-7CKYX5HW.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-FLQRXC6F.js.gz +0 -0
- package/dist/chunk-2G2MMJRA.mjs.br +0 -0
- package/dist/chunk-2G2MMJRA.mjs.gz +0 -0
- package/dist/chunk-3TPQY6WR.js.br +0 -0
- package/dist/chunk-3TPQY6WR.js.gz +0 -0
- package/dist/chunk-4CLG3TRU.js.br +0 -0
- package/dist/chunk-4CLG3TRU.js.gz +0 -0
- package/dist/chunk-4U3OI6J3.mjs.br +0 -0
- package/dist/chunk-4U3OI6J3.mjs.gz +0 -0
- package/dist/chunk-AAVKRMQA.js.br +0 -0
- package/dist/chunk-AAVKRMQA.js.gz +0 -0
- package/dist/chunk-CVS2CHLU.js.br +0 -0
- package/dist/chunk-CVS2CHLU.js.gz +0 -0
- package/dist/chunk-QMLJFL7G.js.br +0 -0
- package/dist/chunk-QMLJFL7G.js.gz +0 -0
- package/dist/chunk-VA2JFII4.mjs.br +0 -0
- package/dist/chunk-VVAXSNG5.mjs.br +0 -0
- package/dist/chunk-VVAXSNG5.mjs.gz +0 -0
- package/dist/chunk-WTPGQ3K7.mjs.br +0 -0
- package/dist/chunk-WTPGQ3K7.mjs.gz +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkNMSZ3NSG_js = require('./chunk-NMSZ3NSG.js');
|
|
4
|
+
var chunkPABSSYRA_js = require('./chunk-PABSSYRA.js');
|
|
5
5
|
var chunk3AJ54EAB_js = require('./chunk-3AJ54EAB.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 = chunkPABSSYRA_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 = chunkPABSSYRA_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 ??= chunkPABSSYRA_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 >= chunkPABSSYRA_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
|
+
}, chunkPABSSYRA_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 = chunkPABSSYRA_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
|
+
chunkPABSSYRA_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 = chunkPABSSYRA_js.validateRoomId(config.roomId);
|
|
244
244
|
const provider = new WebrtcProvider(roomId, yDoc, opts);
|
|
245
|
-
departureRef.current =
|
|
245
|
+
departureRef.current = chunkPABSSYRA_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 = chunkPABSSYRA_js.validateRoomId(config.roomId);
|
|
288
|
+
const transport = config.transport ?? chunkPABSSYRA_js.resolveTransportForServerUrl(config.serverUrl);
|
|
289
289
|
if (transport === "webrtc") {
|
|
290
290
|
await initWebrtc();
|
|
291
291
|
return;
|
|
292
292
|
}
|
|
293
|
-
if (
|
|
293
|
+
if (chunkPABSSYRA_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 = chunkPABSSYRA_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
|
+
chunkPABSSYRA_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
|
+
}, chunkPABSSYRA_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
|
+
chunkPABSSYRA_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 = chunkPABSSYRA_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 = chunkPABSSYRA_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(chunkPABSSYRA_js.cloneSlide),
|
|
531
|
+
templateElementsBySlideId: chunkPABSSYRA_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(chunkPABSSYRA_js.cloneSlide));
|
|
545
545
|
setTemplateElementsBySlideId(
|
|
546
|
-
|
|
546
|
+
chunkPABSSYRA_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 = chunkNMSZ3NSG_js.cloneHistorySnapshot(previousSnapshot);
|
|
586
|
+
lastHistorySnapshotRef.current = chunkNMSZ3NSG_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 = chunkNMSZ3NSG_js.cloneHistorySnapshot(nextSnapshot);
|
|
608
|
+
lastHistorySnapshotRef.current = chunkNMSZ3NSG_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 = chunkNMSZ3NSG_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 = chunkNMSZ3NSG_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(chunkNMSZ3NSG_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 = chunkNMSZ3NSG_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(chunkPABSSYRA_js.createWheelStepBuffer());
|
|
747
747
|
const storeRef = react.useRef(null);
|
|
748
|
-
storeRef.current ??=
|
|
748
|
+
storeRef.current ??= chunkPABSSYRA_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 = chunkPABSSYRA_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, chunkNMSZ3NSG_js.MIN_ELEMENT_SIZE));
|
|
847
|
+
maxY = Math.max(maxY, element.y + Math.max(element.height, chunkNMSZ3NSG_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, chunkNMSZ3NSG_js.MIN_ELEMENT_SIZE);
|
|
854
|
+
const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY, chunkNMSZ3NSG_js.MIN_ELEMENT_SIZE);
|
|
855
855
|
const availableWidth = Math.max(
|
|
856
|
-
effectiveEditorDimensions.width -
|
|
857
|
-
|
|
856
|
+
effectiveEditorDimensions.width - chunkNMSZ3NSG_js.ZOOM_TO_SELECTION_PADDING,
|
|
857
|
+
chunkNMSZ3NSG_js.MIN_ELEMENT_SIZE
|
|
858
858
|
);
|
|
859
859
|
const availableHeight = Math.max(
|
|
860
|
-
effectiveEditorDimensions.height -
|
|
861
|
-
|
|
860
|
+
effectiveEditorDimensions.height - chunkNMSZ3NSG_js.ZOOM_TO_SELECTION_PADDING,
|
|
861
|
+
chunkNMSZ3NSG_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 = chunkPABSSYRA_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 = chunkPABSSYRA_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: chunkPABSSYRA_js.clampZoomScale(store.getState().zoom + mapped.deltaScale)
|
|
893
893
|
});
|
|
894
894
|
},
|
|
895
895
|
[store]
|
|
@@ -984,8 +984,8 @@ function scheduleOpeningAutoPlayGroup(controller, ctx) {
|
|
|
984
984
|
if (!group) {
|
|
985
985
|
return;
|
|
986
986
|
}
|
|
987
|
-
|
|
988
|
-
|
|
987
|
+
chunkPABSSYRA_js.playGroup(controller, group, ctx);
|
|
988
|
+
chunkPABSSYRA_js.scheduleAutoAdvanceChain(controller, ctx);
|
|
989
989
|
}, firstGroup.autoAdvanceDelayMs ?? 0);
|
|
990
990
|
ctx.timers.push(timer);
|
|
991
991
|
}
|
|
@@ -1004,7 +1004,7 @@ function scheduleEntranceAnimationTimers(slide, setPresentationAnimations, prese
|
|
|
1004
1004
|
}))
|
|
1005
1005
|
);
|
|
1006
1006
|
entranceAnimations.forEach((animation, animationIndex) => {
|
|
1007
|
-
const delay =
|
|
1007
|
+
const delay = chunkPABSSYRA_js.computeEntranceAnimationDelay(animation.delayMs, animationIndex);
|
|
1008
1008
|
const timer = window.setTimeout(() => {
|
|
1009
1009
|
setPresentationAnimations(
|
|
1010
1010
|
(previousAnimations) => previousAnimations.map(
|
|
@@ -1037,7 +1037,7 @@ function useAnimationPlayback(input) {
|
|
|
1037
1037
|
const presentationTimersRef = react.useRef([]);
|
|
1038
1038
|
const controllerRef = react.useRef(null);
|
|
1039
1039
|
const buildRafRef = react.useRef(null);
|
|
1040
|
-
const activeAnimationGroupRef = react.useRef(
|
|
1040
|
+
const activeAnimationGroupRef = react.useRef(chunkPABSSYRA_js.createActiveAnimationGroup());
|
|
1041
1041
|
const seededCompletedRef = react.useRef(false);
|
|
1042
1042
|
const mediaTimeNodeElementIdsRef = react.useRef(/* @__PURE__ */ new Map());
|
|
1043
1043
|
const lastSeedCompletedRef = react.useRef(false);
|
|
@@ -1054,15 +1054,15 @@ function useAnimationPlayback(input) {
|
|
|
1054
1054
|
}, [onPlayActionSound]);
|
|
1055
1055
|
react.useEffect(() => {
|
|
1056
1056
|
return () => {
|
|
1057
|
-
|
|
1057
|
+
chunkPABSSYRA_js.cancelBuildReveal(buildRafRef);
|
|
1058
1058
|
};
|
|
1059
1059
|
}, []);
|
|
1060
1060
|
const clearPresentationTimers = react.useCallback(() => {
|
|
1061
|
-
|
|
1061
|
+
chunkPABSSYRA_js.clearPlaybackTimers(buildPlaybackContext(), activeAnimationGroupRef.current);
|
|
1062
1062
|
}, [buildPlaybackContext]);
|
|
1063
1063
|
const resetSlideTimeline = react.useCallback(
|
|
1064
1064
|
(slideIndex) => {
|
|
1065
|
-
|
|
1065
|
+
chunkPABSSYRA_js.cancelBuildReveal(buildRafRef);
|
|
1066
1066
|
const slide = slides[slideIndex];
|
|
1067
1067
|
if (!slide) {
|
|
1068
1068
|
controllerRef.current = null;
|
|
@@ -1073,14 +1073,14 @@ function useAnimationPlayback(input) {
|
|
|
1073
1073
|
setHoverTriggerShapeIds(/* @__PURE__ */ new Set());
|
|
1074
1074
|
return;
|
|
1075
1075
|
}
|
|
1076
|
-
const controller =
|
|
1076
|
+
const controller = chunkPABSSYRA_js.PresentationAnimationController.fromSlide(slide, {
|
|
1077
1077
|
slideHeightPx: canvasSize?.height,
|
|
1078
1078
|
slideWidthPx: canvasSize?.width,
|
|
1079
1079
|
themeColorMap,
|
|
1080
1080
|
pixelateMosaic: pixelateMosaicAnimation
|
|
1081
1081
|
});
|
|
1082
1082
|
controllerRef.current = controller;
|
|
1083
|
-
mediaTimeNodeElementIdsRef.current =
|
|
1083
|
+
mediaTimeNodeElementIdsRef.current = chunkPABSSYRA_js.resolveMediaTimeNodeElementIds(
|
|
1084
1084
|
slide.nativeAnimations ?? []
|
|
1085
1085
|
);
|
|
1086
1086
|
setPresentationKeyframesCss(controller.keyframesCss);
|
|
@@ -1094,7 +1094,7 @@ function useAnimationPlayback(input) {
|
|
|
1094
1094
|
if (!animationsEnabled) {
|
|
1095
1095
|
return false;
|
|
1096
1096
|
}
|
|
1097
|
-
return
|
|
1097
|
+
return chunkPABSSYRA_js.advanceMainSequence(
|
|
1098
1098
|
controllerRef.current,
|
|
1099
1099
|
buildPlaybackContext(),
|
|
1100
1100
|
activeAnimationGroupRef.current
|
|
@@ -1110,7 +1110,7 @@ function useAnimationPlayback(input) {
|
|
|
1110
1110
|
if (!group) {
|
|
1111
1111
|
return false;
|
|
1112
1112
|
}
|
|
1113
|
-
|
|
1113
|
+
chunkPABSSYRA_js.playGroup(controller, group, buildPlaybackContext());
|
|
1114
1114
|
return true;
|
|
1115
1115
|
},
|
|
1116
1116
|
[buildPlaybackContext]
|
|
@@ -1129,7 +1129,7 @@ function useAnimationPlayback(input) {
|
|
|
1129
1129
|
if (!group) {
|
|
1130
1130
|
return false;
|
|
1131
1131
|
}
|
|
1132
|
-
|
|
1132
|
+
chunkPABSSYRA_js.playGroup(controller, group, buildPlaybackContext());
|
|
1133
1133
|
return true;
|
|
1134
1134
|
},
|
|
1135
1135
|
[animationsEnabled, buildPlaybackContext]
|
|
@@ -1210,12 +1210,12 @@ function useAnimationPlayback(input) {
|
|
|
1210
1210
|
presentationTimersRef
|
|
1211
1211
|
};
|
|
1212
1212
|
}
|
|
1213
|
-
var PRESENTER_CHANNEL_NAME =
|
|
1214
|
-
var AUDIENCE_HASH =
|
|
1215
|
-
var PRESENTER_MSG_ORIGIN =
|
|
1216
|
-
var AUDIENCE_NONCE_KEY =
|
|
1213
|
+
var PRESENTER_CHANNEL_NAME = chunkPABSSYRA_js.PRESENTATION_CHANNEL_NAME;
|
|
1214
|
+
var AUDIENCE_HASH = chunkPABSSYRA_js.PRESENTATION_HASH;
|
|
1215
|
+
var PRESENTER_MSG_ORIGIN = chunkPABSSYRA_js.PRESENTATION_MESSAGE_ORIGIN;
|
|
1216
|
+
var AUDIENCE_NONCE_KEY = chunkPABSSYRA_js.PRESENTATION_NONCE_KEY;
|
|
1217
1217
|
function generateSessionId() {
|
|
1218
|
-
return
|
|
1218
|
+
return chunkPABSSYRA_js.createPresentationSessionId();
|
|
1219
1219
|
}
|
|
1220
1220
|
function parseAudienceNonce() {
|
|
1221
1221
|
const hash = window.location.hash;
|
|
@@ -1251,7 +1251,7 @@ function usePresenterWindow(input) {
|
|
|
1251
1251
|
}, []);
|
|
1252
1252
|
const swapDisplays = react.useCallback(async () => {
|
|
1253
1253
|
const audience = audienceWindowRef.current;
|
|
1254
|
-
return audience && !audience.closed ?
|
|
1254
|
+
return audience && !audience.closed ? chunkPABSSYRA_js.swapPresentationWindows(window, audience) : false;
|
|
1255
1255
|
}, []);
|
|
1256
1256
|
const syncSlideToAudience = react.useCallback(
|
|
1257
1257
|
(slideIndex) => {
|
|
@@ -1315,7 +1315,7 @@ function usePresenterWindow(input) {
|
|
|
1315
1315
|
pollTimerRef.current = null;
|
|
1316
1316
|
}
|
|
1317
1317
|
if (closingSessionId) {
|
|
1318
|
-
void
|
|
1318
|
+
void chunkPABSSYRA_js.clearAudienceContent(closingSessionId);
|
|
1319
1319
|
}
|
|
1320
1320
|
}, [getChannel]);
|
|
1321
1321
|
const openAudienceWindow = react.useCallback(() => {
|
|
@@ -1333,10 +1333,10 @@ function usePresenterWindow(input) {
|
|
|
1333
1333
|
audienceWindowRef.current = blankWin;
|
|
1334
1334
|
const sessionId = generateSessionId();
|
|
1335
1335
|
sessionIdRef.current = sessionId;
|
|
1336
|
-
const audienceUrl =
|
|
1337
|
-
void
|
|
1336
|
+
const audienceUrl = chunkPABSSYRA_js.buildPresentationAudienceUrl(window.location.href, sessionId);
|
|
1337
|
+
void chunkPABSSYRA_js.resolveAudienceScreenPlacement(window).then((placement) => {
|
|
1338
1338
|
if (placement && audienceWindowRef.current === blankWin && !blankWin.closed) {
|
|
1339
|
-
|
|
1339
|
+
chunkPABSSYRA_js.placeAudienceWindow(blankWin, placement);
|
|
1340
1340
|
}
|
|
1341
1341
|
return void 0;
|
|
1342
1342
|
});
|
|
@@ -1366,7 +1366,7 @@ function usePresenterWindow(input) {
|
|
|
1366
1366
|
}
|
|
1367
1367
|
};
|
|
1368
1368
|
if (content) {
|
|
1369
|
-
void
|
|
1369
|
+
void chunkPABSSYRA_js.storeAudienceContent(content, sessionId).then(() => navigateOrClose(true)).catch(() => navigateOrClose(false));
|
|
1370
1370
|
} else {
|
|
1371
1371
|
navigateOrClose(true);
|
|
1372
1372
|
}
|
|
@@ -1392,7 +1392,7 @@ function usePresenterWindow(input) {
|
|
|
1392
1392
|
}
|
|
1393
1393
|
const handleMessage = (event) => {
|
|
1394
1394
|
const message = event.data;
|
|
1395
|
-
if (
|
|
1395
|
+
if (chunkPABSSYRA_js.isPresentationSessionMessage(message) && message.type === "audience-ready" && message.sessionId === sessionIdRef.current) {
|
|
1396
1396
|
syncStateToAudience(snapshotRef.current);
|
|
1397
1397
|
}
|
|
1398
1398
|
};
|
|
@@ -1421,7 +1421,7 @@ function usePresenterWindow(input) {
|
|
|
1421
1421
|
react.useEffect(() => {
|
|
1422
1422
|
const handleBeforeUnload = () => {
|
|
1423
1423
|
if (sessionIdRef.current) {
|
|
1424
|
-
void
|
|
1424
|
+
void chunkPABSSYRA_js.clearAudienceContent(sessionIdRef.current);
|
|
1425
1425
|
}
|
|
1426
1426
|
};
|
|
1427
1427
|
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
@@ -1483,7 +1483,7 @@ function useAudienceMode(input) {
|
|
|
1483
1483
|
}
|
|
1484
1484
|
channel.onmessage = (event) => {
|
|
1485
1485
|
const data = event.data;
|
|
1486
|
-
if (!
|
|
1486
|
+
if (!chunkPABSSYRA_js.isPresentationSessionMessage(data) || data.origin !== PRESENTER_MSG_ORIGIN) {
|
|
1487
1487
|
return;
|
|
1488
1488
|
}
|
|
1489
1489
|
if (expectedSessionId && data.sessionId !== expectedSessionId) {
|
|
@@ -1499,16 +1499,16 @@ function useAudienceMode(input) {
|
|
|
1499
1499
|
}
|
|
1500
1500
|
if (data.type === "presenter-exit") {
|
|
1501
1501
|
if (expectedSessionId) {
|
|
1502
|
-
void
|
|
1502
|
+
void chunkPABSSYRA_js.clearAudienceContent(expectedSessionId);
|
|
1503
1503
|
}
|
|
1504
|
-
if (
|
|
1504
|
+
if (chunkPABSSYRA_js.endAudienceDisplay(window)) {
|
|
1505
1505
|
handlers.onPresenterEnded?.();
|
|
1506
1506
|
}
|
|
1507
1507
|
}
|
|
1508
1508
|
};
|
|
1509
1509
|
if (expectedSessionId) {
|
|
1510
1510
|
channel.postMessage({
|
|
1511
|
-
origin:
|
|
1511
|
+
origin: chunkPABSSYRA_js.PRESENTATION_MESSAGE_ORIGIN,
|
|
1512
1512
|
type: "audience-ready",
|
|
1513
1513
|
sessionId: expectedSessionId
|
|
1514
1514
|
});
|
|
@@ -1522,7 +1522,7 @@ function useAudienceMode(input) {
|
|
|
1522
1522
|
}, []);
|
|
1523
1523
|
}
|
|
1524
1524
|
function usePresentationKeyboard(input) {
|
|
1525
|
-
const wheelBufferRef = react.useRef(
|
|
1525
|
+
const wheelBufferRef = react.useRef(chunkPABSSYRA_js.createWheelStepBuffer());
|
|
1526
1526
|
const {
|
|
1527
1527
|
mode,
|
|
1528
1528
|
movePresentationSlide,
|
|
@@ -1543,14 +1543,14 @@ function usePresentationKeyboard(input) {
|
|
|
1543
1543
|
presentationSlideIndex,
|
|
1544
1544
|
setShowRehearsalSummary
|
|
1545
1545
|
} = input;
|
|
1546
|
-
const keyBufferRef = react.useRef(
|
|
1546
|
+
const keyBufferRef = react.useRef(chunkPABSSYRA_js.createPresentationKeyBuffer());
|
|
1547
1547
|
react.useEffect(() => {
|
|
1548
|
-
if (mode !== "present" || !
|
|
1549
|
-
keyBufferRef.current =
|
|
1548
|
+
if (mode !== "present" || !chunkPABSSYRA_js.acceptsPresentationInput()) {
|
|
1549
|
+
keyBufferRef.current = chunkPABSSYRA_js.createPresentationKeyBuffer();
|
|
1550
1550
|
return;
|
|
1551
1551
|
}
|
|
1552
1552
|
const handleKeyDown = (event) => {
|
|
1553
|
-
const mapped =
|
|
1553
|
+
const mapped = chunkPABSSYRA_js.mapPresentationKey(event, keyBufferRef.current);
|
|
1554
1554
|
if (mapped.action === "none") {
|
|
1555
1555
|
return;
|
|
1556
1556
|
}
|
|
@@ -1570,12 +1570,12 @@ function usePresentationKeyboard(input) {
|
|
|
1570
1570
|
movePresentationSlide(-1);
|
|
1571
1571
|
return;
|
|
1572
1572
|
case "first": {
|
|
1573
|
-
const first =
|
|
1573
|
+
const first = chunkPABSSYRA_js.firstShowSlideIndex(showSlideIndexes);
|
|
1574
1574
|
navigateToSlide(first ?? 0);
|
|
1575
1575
|
return;
|
|
1576
1576
|
}
|
|
1577
1577
|
case "last": {
|
|
1578
|
-
const last =
|
|
1578
|
+
const last = chunkPABSSYRA_js.lastShowSlideIndex(showSlideIndexes);
|
|
1579
1579
|
navigateToSlide(last ?? Math.max(0, slideCount - 1));
|
|
1580
1580
|
return;
|
|
1581
1581
|
}
|
|
@@ -1613,10 +1613,10 @@ function usePresentationKeyboard(input) {
|
|
|
1613
1613
|
}
|
|
1614
1614
|
};
|
|
1615
1615
|
const handleWheel = (event) => {
|
|
1616
|
-
if (mode !== "present" || !
|
|
1616
|
+
if (mode !== "present" || !chunkPABSSYRA_js.acceptsPresentationInput()) {
|
|
1617
1617
|
return;
|
|
1618
1618
|
}
|
|
1619
|
-
const mapped =
|
|
1619
|
+
const mapped = chunkPABSSYRA_js.mapPresentationWheel(event, wheelBufferRef.current);
|
|
1620
1620
|
if (mapped.intent === "next-slide") {
|
|
1621
1621
|
event.preventDefault();
|
|
1622
1622
|
movePresentationSlide(1);
|
|
@@ -1749,7 +1749,7 @@ function useRehearsalTimings(input) {
|
|
|
1749
1749
|
|
|
1750
1750
|
// src/viewer/hooks/presentation-mode/presentation-actions.ts
|
|
1751
1751
|
function handlePresentationActionImpl(action, deps) {
|
|
1752
|
-
|
|
1752
|
+
chunkPABSSYRA_js.runPresentationAction(
|
|
1753
1753
|
action,
|
|
1754
1754
|
{ slideCount: deps.slidesLength, ...deps.elementId ? { elementId: deps.elementId } : {} },
|
|
1755
1755
|
{
|
|
@@ -1778,13 +1778,13 @@ function handlePresentationActionImpl(action, deps) {
|
|
|
1778
1778
|
function executeSlideTransition(nextSlideIndex, deps) {
|
|
1779
1779
|
const incomingSlide = deps.slides[nextSlideIndex];
|
|
1780
1780
|
const transition = deps.reverse ? deps.slides[deps.currentSlideIndex]?.transition : incomingSlide?.transition;
|
|
1781
|
-
const durationMs = deps.playTransition ?
|
|
1781
|
+
const durationMs = deps.playTransition ? chunkPABSSYRA_js.resolveTransitionDurationMs(transition) : 0;
|
|
1782
1782
|
deps.clearPresentationTimers();
|
|
1783
1783
|
deps.setPresentationSlideIndex(nextSlideIndex);
|
|
1784
1784
|
deps.onSetActiveSlideIndex(nextSlideIndex);
|
|
1785
1785
|
deps.setPresentationSlideVisible(true);
|
|
1786
1786
|
deps.seedSlideAnimations(nextSlideIndex, { completed: deps.seedCompleted });
|
|
1787
|
-
const soundAction =
|
|
1787
|
+
const soundAction = chunkPABSSYRA_js.resolveTransitionSoundAction(transition);
|
|
1788
1788
|
if (soundAction.kind === "play" && deps.onPlayActionSound) {
|
|
1789
1789
|
deps.onPlayActionSound(soundAction.soundPath, { loop: soundAction.loop });
|
|
1790
1790
|
} else if (soundAction.kind === "stop" && deps.onStopActionSound) {
|
|
@@ -1848,7 +1848,7 @@ function useSlideNavigation(input) {
|
|
|
1848
1848
|
});
|
|
1849
1849
|
const scheduleAutoAdvanceForSlide = react.useCallback(
|
|
1850
1850
|
(slideIndex) => {
|
|
1851
|
-
const delayMs =
|
|
1851
|
+
const delayMs = chunkPABSSYRA_js.resolveAutoAdvanceDelayMs(slides[slideIndex], { useTimings });
|
|
1852
1852
|
if (delayMs === void 0) {
|
|
1853
1853
|
return;
|
|
1854
1854
|
}
|
|
@@ -1871,7 +1871,7 @@ function useSlideNavigation(input) {
|
|
|
1871
1871
|
if (availableSlideIndexes.length === 0) {
|
|
1872
1872
|
return;
|
|
1873
1873
|
}
|
|
1874
|
-
const pastLastSlide = direction === 1 && !
|
|
1874
|
+
const pastLastSlide = direction === 1 && !chunkPABSSYRA_js.hasShowSlideAfter(presentationSlideIndex, availableSlideIndexes);
|
|
1875
1875
|
if (rehearsing && pastLastSlide) {
|
|
1876
1876
|
recordCurrentSlideTime(presentationSlideIndex);
|
|
1877
1877
|
try {
|
|
@@ -1889,9 +1889,9 @@ function useSlideNavigation(input) {
|
|
|
1889
1889
|
onAdvancePastLastSlide();
|
|
1890
1890
|
return;
|
|
1891
1891
|
}
|
|
1892
|
-
const nextSlideIndex = direction === 1 ?
|
|
1892
|
+
const nextSlideIndex = direction === 1 ? chunkPABSSYRA_js.nextShowSlideIndex(presentationSlideIndex, availableSlideIndexes, {
|
|
1893
1893
|
loop: Boolean(loopContinuously) && !rehearsing
|
|
1894
|
-
}) :
|
|
1894
|
+
}) : chunkPABSSYRA_js.previousShowSlideIndex(presentationSlideIndex, availableSlideIndexes);
|
|
1895
1895
|
if (nextSlideIndex === void 0 || nextSlideIndex === presentationSlideIndex) {
|
|
1896
1896
|
return;
|
|
1897
1897
|
}
|
|
@@ -2072,7 +2072,7 @@ function createCustomShowRunner(deps) {
|
|
|
2072
2072
|
return;
|
|
2073
2073
|
}
|
|
2074
2074
|
origin = returnAfter ? { showId: deps.getActiveCustomShowId(), slideIndex: deps.getPresentationSlideIndex() } : null;
|
|
2075
|
-
const first =
|
|
2075
|
+
const first = chunkPABSSYRA_js.firstShowSlideIndex(chunkPABSSYRA_js.resolveShowSlideIndexes(deps.getSlides(), target));
|
|
2076
2076
|
deps.setActiveCustomShowId(customShowId);
|
|
2077
2077
|
if (first !== void 0) {
|
|
2078
2078
|
deps.navigateToSlide(first);
|
|
@@ -2150,33 +2150,33 @@ function usePresentationActionExtensions(input) {
|
|
|
2150
2150
|
}
|
|
2151
2151
|
}, [navigateToSlideViaRef]);
|
|
2152
2152
|
const onOpenFile = react.useCallback((target) => {
|
|
2153
|
-
|
|
2153
|
+
chunkPABSSYRA_js.safeOpenUrl(target);
|
|
2154
2154
|
}, []);
|
|
2155
2155
|
const onOpenPresentation = react.useCallback((target) => {
|
|
2156
|
-
|
|
2156
|
+
chunkPABSSYRA_js.safeOpenUrl(target);
|
|
2157
2157
|
}, []);
|
|
2158
2158
|
const onRunProgram = react.useCallback(
|
|
2159
2159
|
(target) => {
|
|
2160
|
-
onAddRunProgramNotice?.(
|
|
2160
|
+
onAddRunProgramNotice?.(chunkPABSSYRA_js.buildRunProgramNotice(target));
|
|
2161
2161
|
},
|
|
2162
2162
|
[onAddRunProgramNotice]
|
|
2163
2163
|
);
|
|
2164
2164
|
const onPlayMedia = react.useCallback(
|
|
2165
2165
|
(elementId) => {
|
|
2166
|
-
|
|
2166
|
+
chunkPABSSYRA_js.toggleStageElementMedia(containerRef.current, elementId);
|
|
2167
2167
|
},
|
|
2168
2168
|
[containerRef]
|
|
2169
2169
|
);
|
|
2170
2170
|
const onOleVerb = react.useCallback(
|
|
2171
2171
|
(verb, elementId) => {
|
|
2172
|
-
const target =
|
|
2172
|
+
const target = chunkPABSSYRA_js.resolveOleVerbTarget(slides[presentationSlideIndex], elementId, verb);
|
|
2173
2173
|
if (!target) {
|
|
2174
2174
|
return;
|
|
2175
2175
|
}
|
|
2176
2176
|
if (target.action === "download") {
|
|
2177
|
-
|
|
2177
|
+
chunkPABSSYRA_js.downloadDataUrl(target.url, target.fileName ?? "download");
|
|
2178
2178
|
} else {
|
|
2179
|
-
|
|
2179
|
+
chunkPABSSYRA_js.openUrlInNewTab(target.url);
|
|
2180
2180
|
}
|
|
2181
2181
|
},
|
|
2182
2182
|
[slides, presentationSlideIndex]
|
|
@@ -2207,22 +2207,22 @@ function usePresentationActionExtensions(input) {
|
|
|
2207
2207
|
};
|
|
2208
2208
|
}
|
|
2209
2209
|
function usePresenterConsole(slideIndex, active) {
|
|
2210
|
-
const timerRef = react.useRef(
|
|
2211
|
-
const [snapshot, setSnapshot] = react.useState(() =>
|
|
2210
|
+
const timerRef = react.useRef(chunkPABSSYRA_js.createPresenterTimer());
|
|
2211
|
+
const [snapshot, setSnapshot] = react.useState(() => chunkPABSSYRA_js.createInitialPresentationSnapshot(slideIndex));
|
|
2212
2212
|
const patch = react.useCallback((value) => {
|
|
2213
|
-
setSnapshot((current) =>
|
|
2213
|
+
setSnapshot((current) => chunkPABSSYRA_js.mergePresentationSnapshot(current, value));
|
|
2214
2214
|
}, []);
|
|
2215
2215
|
react.useEffect(() => patch({ slideIndex }), [patch, slideIndex]);
|
|
2216
2216
|
react.useEffect(() => {
|
|
2217
2217
|
if (!active) {
|
|
2218
2218
|
return;
|
|
2219
2219
|
}
|
|
2220
|
-
timerRef.current =
|
|
2220
|
+
timerRef.current = chunkPABSSYRA_js.resetPresenterTimer();
|
|
2221
2221
|
patch({ paused: false, elapsedMs: 0 });
|
|
2222
2222
|
const timer = window.setInterval(() => {
|
|
2223
2223
|
patch({
|
|
2224
2224
|
paused: timerRef.current.paused,
|
|
2225
|
-
elapsedMs:
|
|
2225
|
+
elapsedMs: chunkPABSSYRA_js.presenterElapsed(timerRef.current)
|
|
2226
2226
|
});
|
|
2227
2227
|
}, 1e3);
|
|
2228
2228
|
return () => window.clearInterval(timer);
|
|
@@ -2232,19 +2232,19 @@ function usePresenterConsole(slideIndex, active) {
|
|
|
2232
2232
|
applyAudienceSnapshot: setSnapshot,
|
|
2233
2233
|
setBlackout: (blackout) => patch({ blackout }),
|
|
2234
2234
|
toggleTimer: () => {
|
|
2235
|
-
timerRef.current =
|
|
2235
|
+
timerRef.current = chunkPABSSYRA_js.togglePresenterTimer(timerRef.current);
|
|
2236
2236
|
patch({
|
|
2237
2237
|
paused: timerRef.current.paused,
|
|
2238
|
-
elapsedMs:
|
|
2238
|
+
elapsedMs: chunkPABSSYRA_js.presenterElapsed(timerRef.current)
|
|
2239
2239
|
});
|
|
2240
2240
|
},
|
|
2241
2241
|
resetTimer: () => {
|
|
2242
|
-
timerRef.current =
|
|
2242
|
+
timerRef.current = chunkPABSSYRA_js.resetPresenterTimer();
|
|
2243
2243
|
patch({ paused: false, elapsedMs: 0 });
|
|
2244
2244
|
},
|
|
2245
2245
|
stepZoom: (direction) => setSnapshot(
|
|
2246
|
-
(current) =>
|
|
2247
|
-
zoom:
|
|
2246
|
+
(current) => chunkPABSSYRA_js.mergePresentationSnapshot(current, {
|
|
2247
|
+
zoom: chunkPABSSYRA_js.stepPresenterZoom(
|
|
2248
2248
|
current.zoom ?? { scale: 1, originX: 0.5, originY: 0.5 },
|
|
2249
2249
|
direction
|
|
2250
2250
|
)
|
|
@@ -2299,7 +2299,7 @@ function usePresentationMode(input) {
|
|
|
2299
2299
|
const [allSlidesOpen, setAllSlidesOpen] = react.useState(false);
|
|
2300
2300
|
const [endOfShowVisible, setEndOfShowVisible] = react.useState(false);
|
|
2301
2301
|
const [presentationStartTime, setPresentationStartTime] = react.useState(null);
|
|
2302
|
-
const showGuard = react.useMemo(() =>
|
|
2302
|
+
const showGuard = react.useMemo(() => chunkPABSSYRA_js.createPresenterShowGuard(), []);
|
|
2303
2303
|
const {
|
|
2304
2304
|
presentationAnimations,
|
|
2305
2305
|
presentationElementStates,
|
|
@@ -2399,7 +2399,7 @@ function usePresentationMode(input) {
|
|
|
2399
2399
|
actionExtensions.bindNavigateToSlide(navigateToSlide);
|
|
2400
2400
|
const movePresentationSlide = react.useCallback(
|
|
2401
2401
|
(direction, trigger = "explicit") => {
|
|
2402
|
-
if (!
|
|
2402
|
+
if (!chunkPABSSYRA_js.acceptsPresentationInput()) {
|
|
2403
2403
|
return;
|
|
2404
2404
|
}
|
|
2405
2405
|
if (endOfShowVisible) {
|
|
@@ -2468,7 +2468,7 @@ function usePresentationMode(input) {
|
|
|
2468
2468
|
onSetMode("present");
|
|
2469
2469
|
}, [containerRef, onSetMode, setRehearsing]);
|
|
2470
2470
|
const enterPresentModeFromBeginning = react.useCallback(() => {
|
|
2471
|
-
const first =
|
|
2471
|
+
const first = chunkPABSSYRA_js.firstShowSlideIndex(visibleSlideIndexes);
|
|
2472
2472
|
if (first !== void 0) {
|
|
2473
2473
|
onSetActiveSlideIndex(first);
|
|
2474
2474
|
}
|
|
@@ -2548,7 +2548,7 @@ function usePresentationMode(input) {
|
|
|
2548
2548
|
if (mode !== "present") {
|
|
2549
2549
|
return;
|
|
2550
2550
|
}
|
|
2551
|
-
return
|
|
2551
|
+
return chunkPABSSYRA_js.attachPresentationVisibilityPause({
|
|
2552
2552
|
root: containerRef.current ?? void 0,
|
|
2553
2553
|
onHidden: () => clearPresentationTimersRef.current(),
|
|
2554
2554
|
onVisible: () => scheduleAutoAdvanceRef.current(presentationSlideIndexRef.current)
|
|
@@ -2556,7 +2556,7 @@ function usePresentationMode(input) {
|
|
|
2556
2556
|
}, [mode, containerRef]);
|
|
2557
2557
|
react.useLayoutEffect(() => {
|
|
2558
2558
|
if (mode === "present") {
|
|
2559
|
-
const idx =
|
|
2559
|
+
const idx = chunkPABSSYRA_js.presentationEntrySlideIndex(
|
|
2560
2560
|
activeSlideIndexRef.current,
|
|
2561
2561
|
visibleSlideIndexesRef.current
|
|
2562
2562
|
);
|
|
@@ -2635,11 +2635,11 @@ function usePresentationMode(input) {
|
|
|
2635
2635
|
return void 0;
|
|
2636
2636
|
}
|
|
2637
2637
|
const incoming = slides[transitionOverlay.incomingSlideIndex];
|
|
2638
|
-
return
|
|
2638
|
+
return chunkPABSSYRA_js.buildMorphTransitionPlan(
|
|
2639
2639
|
slides[transitionOverlay.outgoingSlideIndex],
|
|
2640
2640
|
incoming,
|
|
2641
2641
|
transitionOverlay.durationMs,
|
|
2642
|
-
|
|
2642
|
+
chunkPABSSYRA_js.morphOptionToMode(transitionOverlay.transition.morphOption),
|
|
2643
2643
|
// `PresentationStage` stacks the incoming slide's elements above its
|
|
2644
2644
|
// template shapes (`zIndex = templateElements.length + index`), so a
|
|
2645
2645
|
// z-index journey has to start counting where the stage does.
|
|
@@ -2664,7 +2664,7 @@ function usePresentationMode(input) {
|
|
|
2664
2664
|
if (!morphPlan) {
|
|
2665
2665
|
return presentationKeyframesCss;
|
|
2666
2666
|
}
|
|
2667
|
-
const imageRules =
|
|
2667
|
+
const imageRules = chunkPABSSYRA_js.buildMorphAnimationRules(morphPlan, "", "incoming", "image");
|
|
2668
2668
|
return `${presentationKeyframesCss ?? ""}
|
|
2669
2669
|
${morphPlan.keyframesCss}
|
|
2670
2670
|
${imageRules}`;
|
|
@@ -2961,7 +2961,7 @@ function useFindReplace({
|
|
|
2961
2961
|
const [findResults, setFindResults] = react.useState([]);
|
|
2962
2962
|
const [findResultIndex, setFindResultIndex] = react.useState(-1);
|
|
2963
2963
|
const performFind = react.useCallback(() => {
|
|
2964
|
-
const results =
|
|
2964
|
+
const results = chunkPABSSYRA_js.findInSlides(slides, findQuery, { matchCase: findMatchCase });
|
|
2965
2965
|
if (!findQuery) {
|
|
2966
2966
|
setFindResults([]);
|
|
2967
2967
|
setFindResultIndex(-1);
|
|
@@ -2995,7 +2995,7 @@ function useFindReplace({
|
|
|
2995
2995
|
return;
|
|
2996
2996
|
}
|
|
2997
2997
|
onUpdateSlides(
|
|
2998
|
-
(prevSlides) =>
|
|
2998
|
+
(prevSlides) => chunkPABSSYRA_js.applyFindReplacements(prevSlides, toReplace, replaceQuery).slides
|
|
2999
2999
|
);
|
|
3000
3000
|
onMarkDirty();
|
|
3001
3001
|
},
|
|
@@ -3017,9 +3017,9 @@ function useFindReplace({
|
|
|
3017
3017
|
}, [findResults, applyReplacements, performFind]);
|
|
3018
3018
|
react.useEffect(() => {
|
|
3019
3019
|
const handler = (event) => {
|
|
3020
|
-
const { action } =
|
|
3020
|
+
const { action } = chunkPABSSYRA_js.mapEditorKey(event, {
|
|
3021
3021
|
canEdit: mode === "edit",
|
|
3022
|
-
isTextInputTarget:
|
|
3022
|
+
isTextInputTarget: chunkPABSSYRA_js.isEditorTextInputTarget(event.target)
|
|
3023
3023
|
});
|
|
3024
3024
|
if (action !== "find") {
|
|
3025
3025
|
return;
|
|
@@ -3130,7 +3130,7 @@ function addCommentToSlide(slides, slideIndex, text, authorName, elementId, ment
|
|
|
3130
3130
|
if (!slide) {
|
|
3131
3131
|
return { slides, didAdd: false };
|
|
3132
3132
|
}
|
|
3133
|
-
const next =
|
|
3133
|
+
const next = chunkPABSSYRA_js.addCommentToList(
|
|
3134
3134
|
slide.comments || [],
|
|
3135
3135
|
text,
|
|
3136
3136
|
authorName,
|
|
@@ -3151,7 +3151,7 @@ function removeCommentFromSlide(slides, slideIndex, commentId) {
|
|
|
3151
3151
|
if (!slide) {
|
|
3152
3152
|
return { slides, didDelete: false };
|
|
3153
3153
|
}
|
|
3154
|
-
const next =
|
|
3154
|
+
const next = chunkPABSSYRA_js.removeCommentFromList(slide.comments || [], commentId);
|
|
3155
3155
|
if (!next) {
|
|
3156
3156
|
return { slides, didDelete: false };
|
|
3157
3157
|
}
|
|
@@ -3162,7 +3162,7 @@ function editCommentInSlide(slides, slideIndex, commentId, newText) {
|
|
|
3162
3162
|
if (!slide) {
|
|
3163
3163
|
return { slides, didUpdate: false };
|
|
3164
3164
|
}
|
|
3165
|
-
const next =
|
|
3165
|
+
const next = chunkPABSSYRA_js.editCommentInList(slide.comments || [], commentId, newText);
|
|
3166
3166
|
if (!next) {
|
|
3167
3167
|
return { slides, didUpdate: false };
|
|
3168
3168
|
}
|
|
@@ -3173,7 +3173,7 @@ function toggleResolvedInSlide(slides, slideIndex, commentId) {
|
|
|
3173
3173
|
if (!slide) {
|
|
3174
3174
|
return { slides, didUpdate: false };
|
|
3175
3175
|
}
|
|
3176
|
-
const next =
|
|
3176
|
+
const next = chunkPABSSYRA_js.toggleCommentResolvedInList(slide.comments || [], commentId);
|
|
3177
3177
|
if (!next) {
|
|
3178
3178
|
return { slides, didUpdate: false };
|
|
3179
3179
|
}
|
|
@@ -3184,7 +3184,7 @@ function addReplyToSlide(slides, slideIndex, parentId, text, authorName, mention
|
|
|
3184
3184
|
if (!slide) {
|
|
3185
3185
|
return { slides, didAdd: false };
|
|
3186
3186
|
}
|
|
3187
|
-
const next =
|
|
3187
|
+
const next = chunkPABSSYRA_js.replyToCommentInList(slide.comments || [], parentId, text, authorName);
|
|
3188
3188
|
if (!next) {
|
|
3189
3189
|
return { slides, didAdd: false };
|
|
3190
3190
|
}
|
|
@@ -3571,7 +3571,7 @@ function useDerivedElementState(input) {
|
|
|
3571
3571
|
return [];
|
|
3572
3572
|
}
|
|
3573
3573
|
return [
|
|
3574
|
-
...
|
|
3574
|
+
...chunkPABSSYRA_js.visibleTemplateElements(activeSlide, templateElementsBySlideId[activeSlide.id] ?? [])
|
|
3575
3575
|
];
|
|
3576
3576
|
}, [activeSlide, templateElementsBySlideId]);
|
|
3577
3577
|
const activeMaster = slideMasters[activeMasterIndex];
|
|
@@ -3638,7 +3638,7 @@ function useViewerCoreState(_input) {
|
|
|
3638
3638
|
const marqueeStateRef = react.useRef(null);
|
|
3639
3639
|
const isDrawingRef = react.useRef(false);
|
|
3640
3640
|
const justInteractedRef = react.useRef(false);
|
|
3641
|
-
const livePatcher = react.useMemo(() =>
|
|
3641
|
+
const livePatcher = react.useMemo(() => chunkPABSSYRA_js.createCollaborationLivePatcher(), []);
|
|
3642
3642
|
react.useEffect(() => () => livePatcher.dispose(), [livePatcher]);
|
|
3643
3643
|
const slidesRef = react.useRef([]);
|
|
3644
3644
|
const [mode, setMode] = react.useState("edit");
|
|
@@ -3647,8 +3647,8 @@ function useViewerCoreState(_input) {
|
|
|
3647
3647
|
const [slides, setSlides] = react.useState([]);
|
|
3648
3648
|
const [templateElementsBySlideId, setTemplateElementsBySlideId] = react.useState({});
|
|
3649
3649
|
const [canvasSize, setCanvasSize] = react.useState({
|
|
3650
|
-
width:
|
|
3651
|
-
height:
|
|
3650
|
+
width: chunkNMSZ3NSG_js.DEFAULT_CANVAS_WIDTH,
|
|
3651
|
+
height: chunkNMSZ3NSG_js.DEFAULT_CANVAS_HEIGHT
|
|
3652
3652
|
});
|
|
3653
3653
|
const [slideSizeEmu, setSlideSizeEmu] = react.useState();
|
|
3654
3654
|
const [activeSlideIndex, setActiveSlideIndex] = react.useState(0);
|
|
@@ -3669,7 +3669,7 @@ function useViewerCoreState(_input) {
|
|
|
3669
3669
|
const resolved = typeof value === "function" ? value(inlineEditingTextRef.current) : value;
|
|
3670
3670
|
inlineEditingTextRef.current = resolved;
|
|
3671
3671
|
setInlineEditingTextBase(value);
|
|
3672
|
-
|
|
3672
|
+
chunkPABSSYRA_js.publishLiveInlineText(
|
|
3673
3673
|
livePatcher,
|
|
3674
3674
|
slidesRef.current[activeSlideIndexRef.current],
|
|
3675
3675
|
inlineEditingElementIdRef.current,
|
|
@@ -3964,8 +3964,8 @@ function useViewerState(input) {
|
|
|
3964
3964
|
}
|
|
3965
3965
|
|
|
3966
3966
|
// src/viewer/utils/glyph-outline-cache.ts
|
|
3967
|
-
var glyphOutlineFontCache = new
|
|
3968
|
-
var getGlyphOutline =
|
|
3967
|
+
var glyphOutlineFontCache = new chunkPABSSYRA_js.GlyphOutlineFontCache();
|
|
3968
|
+
var getGlyphOutline = chunkPABSSYRA_js.createGlyphOutlineLookup(glyphOutlineFontCache);
|
|
3969
3969
|
|
|
3970
3970
|
// src/viewer/hooks/useLoadContent.ts
|
|
3971
3971
|
function useLoadContent({
|
|
@@ -4024,8 +4024,8 @@ function useLoadContent({
|
|
|
4024
4024
|
}
|
|
4025
4025
|
let cancelled = false;
|
|
4026
4026
|
const token = ++renderTokenRef.current;
|
|
4027
|
-
const handler = new
|
|
4028
|
-
const resources =
|
|
4027
|
+
const handler = new chunkPABSSYRA_js.PptxHandler();
|
|
4028
|
+
const resources = chunkPABSSYRA_js.createPresentationLoadResources(handler);
|
|
4029
4029
|
const loadBlobUrls = resources.blobUrls;
|
|
4030
4030
|
(async () => {
|
|
4031
4031
|
try {
|
|
@@ -4046,12 +4046,12 @@ function useLoadContent({
|
|
|
4046
4046
|
}
|
|
4047
4047
|
const mediaElements = [];
|
|
4048
4048
|
for (const slide of parsed.slides) {
|
|
4049
|
-
|
|
4049
|
+
chunkPABSSYRA_js.collectMediaElements(slide.elements, mediaElements);
|
|
4050
4050
|
}
|
|
4051
4051
|
const nextMediaUrls = /* @__PURE__ */ new Map();
|
|
4052
4052
|
await Promise.all(
|
|
4053
4053
|
mediaElements.map(async (mediaElement) => {
|
|
4054
|
-
const resolved = await
|
|
4054
|
+
const resolved = await chunkPABSSYRA_js.resolveMediaElementSource(mediaElement, handler);
|
|
4055
4055
|
if (resolved.missing || !resolved.mediaPath || !resolved.url) {
|
|
4056
4056
|
mediaElement.mediaMissing = true;
|
|
4057
4057
|
return;
|
|
@@ -4062,7 +4062,7 @@ function useLoadContent({
|
|
|
4062
4062
|
}
|
|
4063
4063
|
})
|
|
4064
4064
|
);
|
|
4065
|
-
const { paths: imagePaths, refs: imageRefs } =
|
|
4065
|
+
const { paths: imagePaths, refs: imageRefs } = chunkPABSSYRA_js.collectImagePaths(parsed.slides);
|
|
4066
4066
|
let nextSlides = parsed.slides;
|
|
4067
4067
|
if (imagePaths.size > 0) {
|
|
4068
4068
|
const resolvedMap = /* @__PURE__ */ new Map();
|
|
@@ -4078,15 +4078,15 @@ function useLoadContent({
|
|
|
4078
4078
|
})
|
|
4079
4079
|
);
|
|
4080
4080
|
nextSlides = parsed.slides.map((s) => {
|
|
4081
|
-
const newElements =
|
|
4081
|
+
const newElements = chunkPABSSYRA_js.applyImagePathPatches(s.elements, resolvedMap, imageRefs);
|
|
4082
4082
|
return newElements === s.elements ? s : { ...s, elements: newElements };
|
|
4083
4083
|
});
|
|
4084
4084
|
}
|
|
4085
|
-
nextSlides = await
|
|
4085
|
+
nextSlides = await chunkPABSSYRA_js.resolveTableCellImageUrls(
|
|
4086
4086
|
nextSlides,
|
|
4087
4087
|
(path) => handler.getImageData(path)
|
|
4088
4088
|
);
|
|
4089
|
-
const nextTableStyleMap = await
|
|
4089
|
+
const nextTableStyleMap = await chunkPABSSYRA_js.resolveTableStyleImageUrls(
|
|
4090
4090
|
parsed.tableStyleMap,
|
|
4091
4091
|
(path) => handler.getImageData(path)
|
|
4092
4092
|
);
|
|
@@ -4105,12 +4105,12 @@ function useLoadContent({
|
|
|
4105
4105
|
}
|
|
4106
4106
|
resources.commit();
|
|
4107
4107
|
handlerRef.current = handler;
|
|
4108
|
-
const partition =
|
|
4108
|
+
const partition = chunkPABSSYRA_js.partitionTemplateElements(nextSlides);
|
|
4109
4109
|
setSlides(partition.slides);
|
|
4110
4110
|
setTemplateElementsBySlideId(partition.templateElementsBySlideId);
|
|
4111
4111
|
setCanvasSize({
|
|
4112
|
-
width: parsed.width ??
|
|
4113
|
-
height: parsed.height ??
|
|
4112
|
+
width: parsed.width ?? chunkNMSZ3NSG_js.DEFAULT_CANVAS_WIDTH,
|
|
4113
|
+
height: parsed.height ?? chunkNMSZ3NSG_js.DEFAULT_CANVAS_HEIGHT
|
|
4114
4114
|
});
|
|
4115
4115
|
setSlideSizeEmu(
|
|
4116
4116
|
typeof parsed.widthEmu === "number" && typeof parsed.heightEmu === "number" && parsed.widthEmu > 0 && parsed.heightEmu > 0 ? {
|
|
@@ -4123,7 +4123,7 @@ function useLoadContent({
|
|
|
4123
4123
|
setLayoutOptions(parsed.layoutOptions ?? []);
|
|
4124
4124
|
setSlideMasters(parsed.slideMasters ?? []);
|
|
4125
4125
|
setModernCommentAuthors(parsed.modernCommentAuthors ?? []);
|
|
4126
|
-
setRecentColors(
|
|
4126
|
+
setRecentColors(chunkPABSSYRA_js.seedRecentColors({ mruColors: parsed.mruColors }));
|
|
4127
4127
|
setTheme(parsed.theme);
|
|
4128
4128
|
setTableStyleMap(nextTableStyleMap);
|
|
4129
4129
|
setTableStylesDefaultId(parsed.tableStylesDefaultId);
|
|
@@ -4131,7 +4131,7 @@ function useLoadContent({
|
|
|
4131
4131
|
setThemeOptions(parsed.themeOptions ?? []);
|
|
4132
4132
|
setCustomShows(parsed.customShows ?? []);
|
|
4133
4133
|
setActiveCustomShowId(
|
|
4134
|
-
|
|
4134
|
+
chunkPABSSYRA_js.resolveAuthoredCustomShowId(parsed.presentationProperties, parsed.customShows) ?? null
|
|
4135
4135
|
);
|
|
4136
4136
|
setSections(parsed.sections ?? []);
|
|
4137
4137
|
setPresentationProperties(parsed.presentationProperties ?? {});
|
|
@@ -4155,11 +4155,11 @@ function useLoadContent({
|
|
|
4155
4155
|
setHasMacros(parsed.hasMacros === true);
|
|
4156
4156
|
setHasDigitalSignatures(parsed.hasDigitalSignatures === true);
|
|
4157
4157
|
setDigitalSignatureCount(parsed.digitalSignatureCount ?? 0);
|
|
4158
|
-
setGuides(
|
|
4159
|
-
setReadOnlyRecommendation(
|
|
4158
|
+
setGuides(chunkPABSSYRA_js.buildInitialGuides(parsed.presentationGuides, parsed.slides[0]?.guides));
|
|
4159
|
+
setReadOnlyRecommendation(chunkPABSSYRA_js.readOnlyRecommendation(parsed));
|
|
4160
4160
|
setModifyVerifier(parsed.modifyVerifier ?? void 0);
|
|
4161
4161
|
setCompatToasts(
|
|
4162
|
-
|
|
4162
|
+
chunkPABSSYRA_js.compatibilityWarningToasts([
|
|
4163
4163
|
...parsed.warnings ?? [],
|
|
4164
4164
|
...parsed.slides.flatMap((slide) => slide.warnings ?? [])
|
|
4165
4165
|
])
|
|
@@ -4171,7 +4171,7 @@ function useLoadContent({
|
|
|
4171
4171
|
onContentApplied?.();
|
|
4172
4172
|
} catch (err) {
|
|
4173
4173
|
if (!cancelled && token === renderTokenRef.current) {
|
|
4174
|
-
if (err instanceof
|
|
4174
|
+
if (err instanceof chunkPABSSYRA_js.EncryptedFileError) {
|
|
4175
4175
|
setIsEncrypted(true);
|
|
4176
4176
|
} else {
|
|
4177
4177
|
console.error("[pptx] Failed to load presentation content:", err);
|
|
@@ -4200,7 +4200,7 @@ function useLoadContent({
|
|
|
4200
4200
|
}
|
|
4201
4201
|
function useAutosave(input) {
|
|
4202
4202
|
const { isDirty, filePath, serializeSlides, enabled = true, getChangeSources } = input;
|
|
4203
|
-
const intervalMs =
|
|
4203
|
+
const intervalMs = chunkPABSSYRA_js.resolveAutosaveIntervalMs({
|
|
4204
4204
|
hostIntervalMs: input.intervalMs,
|
|
4205
4205
|
optionsIntervalSeconds: input.intervalSeconds
|
|
4206
4206
|
});
|
|
@@ -4231,7 +4231,7 @@ function useAutosave(input) {
|
|
|
4231
4231
|
return;
|
|
4232
4232
|
}
|
|
4233
4233
|
const sources = changeSourcesRef.current?.() ?? [];
|
|
4234
|
-
if (!
|
|
4234
|
+
if (!chunkPABSSYRA_js.shouldWriteAutosaveSnapshot({
|
|
4235
4235
|
filePath: path,
|
|
4236
4236
|
isDirty: isDirtyRef.current,
|
|
4237
4237
|
saving: isSavingRef.current,
|
|
@@ -4249,8 +4249,8 @@ function useAutosave(input) {
|
|
|
4249
4249
|
isSavingRef.current = false;
|
|
4250
4250
|
return;
|
|
4251
4251
|
}
|
|
4252
|
-
await
|
|
4253
|
-
lastSnapshotRef.current =
|
|
4252
|
+
await chunkPABSSYRA_js.saveAutosaveSnapshot(path, data);
|
|
4253
|
+
lastSnapshotRef.current = chunkPABSSYRA_js.autosaveSnapshotMark(path, sources);
|
|
4254
4254
|
setAutosaveStatus({ state: "saved", timestamp: Date.now() });
|
|
4255
4255
|
} catch (err) {
|
|
4256
4256
|
setAutosaveStatus({
|
|
@@ -4304,13 +4304,13 @@ function useElementOperations(input) {
|
|
|
4304
4304
|
inlineEditingText
|
|
4305
4305
|
} = input;
|
|
4306
4306
|
const liveTextSegments = react.useCallback(() => {
|
|
4307
|
-
if (!selectedElement || !
|
|
4307
|
+
if (!selectedElement || !chunkPABSSYRA_js.hasTextProperties(selectedElement)) {
|
|
4308
4308
|
return void 0;
|
|
4309
4309
|
}
|
|
4310
4310
|
if (selectedElement.id !== inlineEditingElementId) {
|
|
4311
4311
|
return selectedElement.textSegments;
|
|
4312
4312
|
}
|
|
4313
|
-
return
|
|
4313
|
+
return chunkPABSSYRA_js.remapTextToSegments(
|
|
4314
4314
|
inlineEditingText,
|
|
4315
4315
|
selectedElement.textSegments,
|
|
4316
4316
|
selectedElement.textStyle
|
|
@@ -4351,11 +4351,11 @@ function useElementOperations(input) {
|
|
|
4351
4351
|
(elementId, updates) => {
|
|
4352
4352
|
if (masterView?.target) {
|
|
4353
4353
|
applyMasterViewWrite(
|
|
4354
|
-
|
|
4354
|
+
chunkPABSSYRA_js.updateMasterViewElement(masterView, masterView.target, elementId, updates)
|
|
4355
4355
|
);
|
|
4356
4356
|
return;
|
|
4357
4357
|
}
|
|
4358
|
-
if (
|
|
4358
|
+
if (chunkPABSSYRA_js.isTemplateElementId(elementId)) {
|
|
4359
4359
|
const slideId = activeSlide?.id;
|
|
4360
4360
|
if (slideId) {
|
|
4361
4361
|
setTemplateElementsBySlideId((prev) => ({
|
|
@@ -4366,7 +4366,7 @@ function useElementOperations(input) {
|
|
|
4366
4366
|
}));
|
|
4367
4367
|
}
|
|
4368
4368
|
} else {
|
|
4369
|
-
setSlides((prev) =>
|
|
4369
|
+
setSlides((prev) => chunkPABSSYRA_js.updateElement(prev, activeSlideIndex, elementId, updates));
|
|
4370
4370
|
}
|
|
4371
4371
|
history.markDirty();
|
|
4372
4372
|
},
|
|
@@ -4391,7 +4391,7 @@ function useElementOperations(input) {
|
|
|
4391
4391
|
);
|
|
4392
4392
|
const updateSelectedShapeStyle = react.useCallback(
|
|
4393
4393
|
(updates) => {
|
|
4394
|
-
if (!selectedElement || !
|
|
4394
|
+
if (!selectedElement || !chunkPABSSYRA_js.hasShapeProperties(selectedElement)) {
|
|
4395
4395
|
return;
|
|
4396
4396
|
}
|
|
4397
4397
|
updateSelectedElement({
|
|
@@ -4402,19 +4402,19 @@ function useElementOperations(input) {
|
|
|
4402
4402
|
);
|
|
4403
4403
|
const updateSelectedTextStyle = react.useCallback(
|
|
4404
4404
|
(updates) => {
|
|
4405
|
-
if (!selectedElement || !
|
|
4405
|
+
if (!selectedElement || !chunkPABSSYRA_js.hasTextProperties(selectedElement)) {
|
|
4406
4406
|
return;
|
|
4407
4407
|
}
|
|
4408
4408
|
const isLiveEditing = selectedElement.id === inlineEditingElementId;
|
|
4409
4409
|
const currentSegments = liveTextSegments();
|
|
4410
|
-
const inlineSel =
|
|
4410
|
+
const inlineSel = chunkPABSSYRA_js.getInlineEditorSelection(currentSegments);
|
|
4411
4411
|
if (inlineSel && currentSegments) {
|
|
4412
|
-
const { newSegments: newSegments2, newSelection } =
|
|
4412
|
+
const { newSegments: newSegments2, newSelection } = chunkPABSSYRA_js.applyStyleToSelectedSegments(
|
|
4413
4413
|
currentSegments,
|
|
4414
4414
|
inlineSel,
|
|
4415
4415
|
updates
|
|
4416
4416
|
);
|
|
4417
|
-
|
|
4417
|
+
chunkPABSSYRA_js.setPendingSelectionRestore(newSelection);
|
|
4418
4418
|
updateSelectedElement({
|
|
4419
4419
|
textSegments: newSegments2,
|
|
4420
4420
|
...isLiveEditing ? { text: inlineEditingText } : {}
|
|
@@ -4442,14 +4442,14 @@ function useElementOperations(input) {
|
|
|
4442
4442
|
);
|
|
4443
4443
|
const updateSelectedTextCase = react.useCallback(
|
|
4444
4444
|
(mode) => {
|
|
4445
|
-
if (!selectedElement || !
|
|
4445
|
+
if (!selectedElement || !chunkPABSSYRA_js.hasTextProperties(selectedElement)) {
|
|
4446
4446
|
return;
|
|
4447
4447
|
}
|
|
4448
4448
|
const isLiveEditing = selectedElement.id === inlineEditingElementId;
|
|
4449
4449
|
const currentSegments = liveTextSegments();
|
|
4450
|
-
const inlineSel =
|
|
4450
|
+
const inlineSel = chunkPABSSYRA_js.getInlineEditorSelection(currentSegments);
|
|
4451
4451
|
if (inlineSel && currentSegments) {
|
|
4452
|
-
const newSegments =
|
|
4452
|
+
const newSegments = chunkPABSSYRA_js.applyCaseTransformToSegments(currentSegments, inlineSel, mode);
|
|
4453
4453
|
updateSelectedElement({
|
|
4454
4454
|
textSegments: newSegments,
|
|
4455
4455
|
...isLiveEditing ? { text: inlineEditingText } : {}
|
|
@@ -4458,7 +4458,7 @@ function useElementOperations(input) {
|
|
|
4458
4458
|
}
|
|
4459
4459
|
const updates = {};
|
|
4460
4460
|
if (currentSegments && currentSegments.length > 0) {
|
|
4461
|
-
updates.textSegments =
|
|
4461
|
+
updates.textSegments = chunkPABSSYRA_js.applyCaseTransformToSegments(
|
|
4462
4462
|
currentSegments,
|
|
4463
4463
|
null,
|
|
4464
4464
|
mode
|
|
@@ -4466,7 +4466,7 @@ function useElementOperations(input) {
|
|
|
4466
4466
|
}
|
|
4467
4467
|
const baseText = isLiveEditing ? inlineEditingText : selectedElement.text;
|
|
4468
4468
|
if (typeof baseText === "string") {
|
|
4469
|
-
updates.text =
|
|
4469
|
+
updates.text = chunkPABSSYRA_js.transformTextCase(baseText, mode);
|
|
4470
4470
|
}
|
|
4471
4471
|
updateSelectedElement(updates);
|
|
4472
4472
|
},
|
|
@@ -4485,15 +4485,15 @@ function useElementOperations(input) {
|
|
|
4485
4485
|
[setSlides]
|
|
4486
4486
|
);
|
|
4487
4487
|
const masterViewTarget = masterView?.target ?? null;
|
|
4488
|
-
const activeElements = masterViewTarget ?
|
|
4488
|
+
const activeElements = masterViewTarget ? chunkPABSSYRA_js.masterViewElements(masterView, masterViewTarget) : editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
4489
4489
|
const updateActiveElements = react.useCallback(
|
|
4490
4490
|
(updater) => {
|
|
4491
4491
|
if (masterView?.target) {
|
|
4492
4492
|
applyMasterViewWrite(
|
|
4493
|
-
|
|
4493
|
+
chunkPABSSYRA_js.replaceMasterViewElements(
|
|
4494
4494
|
masterView,
|
|
4495
4495
|
masterView.target,
|
|
4496
|
-
updater(
|
|
4496
|
+
updater(chunkPABSSYRA_js.masterViewElements(masterView, masterView.target))
|
|
4497
4497
|
)
|
|
4498
4498
|
);
|
|
4499
4499
|
return;
|
|
@@ -4546,7 +4546,7 @@ function useSectionOperations(input) {
|
|
|
4546
4546
|
const { sections, setSections, slides, setSlides, markDirty } = input;
|
|
4547
4547
|
const addSection2 = react.useCallback(
|
|
4548
4548
|
(name, afterSlideIndex) => {
|
|
4549
|
-
const result =
|
|
4549
|
+
const result = chunkPABSSYRA_js.addSection(sections, slides, name, afterSlideIndex);
|
|
4550
4550
|
setSlides(result.slides);
|
|
4551
4551
|
setSections(result.sections);
|
|
4552
4552
|
markDirty();
|
|
@@ -4555,7 +4555,7 @@ function useSectionOperations(input) {
|
|
|
4555
4555
|
);
|
|
4556
4556
|
const renameSection2 = react.useCallback(
|
|
4557
4557
|
(sectionId, newName) => {
|
|
4558
|
-
const result =
|
|
4558
|
+
const result = chunkPABSSYRA_js.renameSection(sections, slides, sectionId, newName);
|
|
4559
4559
|
setSections(result.sections);
|
|
4560
4560
|
setSlides(result.slides);
|
|
4561
4561
|
markDirty();
|
|
@@ -4564,7 +4564,7 @@ function useSectionOperations(input) {
|
|
|
4564
4564
|
);
|
|
4565
4565
|
const deleteSection2 = react.useCallback(
|
|
4566
4566
|
(sectionId) => {
|
|
4567
|
-
const result =
|
|
4567
|
+
const result = chunkPABSSYRA_js.deleteSection(sections, slides, sectionId);
|
|
4568
4568
|
setSections(result.sections);
|
|
4569
4569
|
setSlides(result.slides);
|
|
4570
4570
|
markDirty();
|
|
@@ -4573,21 +4573,21 @@ function useSectionOperations(input) {
|
|
|
4573
4573
|
);
|
|
4574
4574
|
const moveSectionUp2 = react.useCallback(
|
|
4575
4575
|
(sectionId) => {
|
|
4576
|
-
setSections(
|
|
4576
|
+
setSections(chunkPABSSYRA_js.moveSectionUp(sections, sectionId));
|
|
4577
4577
|
markDirty();
|
|
4578
4578
|
},
|
|
4579
4579
|
[sections, setSections, markDirty]
|
|
4580
4580
|
);
|
|
4581
4581
|
const moveSectionDown2 = react.useCallback(
|
|
4582
4582
|
(sectionId) => {
|
|
4583
|
-
setSections(
|
|
4583
|
+
setSections(chunkPABSSYRA_js.moveSectionDown(sections, sectionId));
|
|
4584
4584
|
markDirty();
|
|
4585
4585
|
},
|
|
4586
4586
|
[sections, setSections, markDirty]
|
|
4587
4587
|
);
|
|
4588
4588
|
const moveSlidesToSection2 = react.useCallback(
|
|
4589
4589
|
(slideIndexes, targetSectionId) => {
|
|
4590
|
-
const result =
|
|
4590
|
+
const result = chunkPABSSYRA_js.moveSlidesToSection(sections, slides, slideIndexes, targetSectionId);
|
|
4591
4591
|
setSlides(result.slides);
|
|
4592
4592
|
setSections(result.sections);
|
|
4593
4593
|
markDirty();
|
|
@@ -4653,15 +4653,15 @@ function syncSelectionHandleOverlay(elementNode, elementId, geometry) {
|
|
|
4653
4653
|
// src/viewer/hooks/pointer-move-handlers.ts
|
|
4654
4654
|
function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx, lockAspect = false) {
|
|
4655
4655
|
const startBox = { x: startX, y: startY, width: startWidth, height: startHeight };
|
|
4656
|
-
let resized =
|
|
4656
|
+
let resized = chunkPABSSYRA_js.applyResize(startBox, handle, dx, dy, 1, { minSize: chunkNMSZ3NSG_js.MIN_ELEMENT_SIZE });
|
|
4657
4657
|
if (lockAspect) {
|
|
4658
|
-
resized =
|
|
4658
|
+
resized = chunkPABSSYRA_js.lockResizeAspect(resized, startBox, handle, chunkNMSZ3NSG_js.MIN_ELEMENT_SIZE);
|
|
4659
4659
|
}
|
|
4660
4660
|
const box = { x: resized.x, y: resized.y, width: resized.width, height: resized.height };
|
|
4661
4661
|
if (!snapToGrid) {
|
|
4662
4662
|
return box;
|
|
4663
4663
|
}
|
|
4664
|
-
return
|
|
4664
|
+
return chunkPABSSYRA_js.snapBoxToGrid(box, handle, gridSpacingPx, chunkNMSZ3NSG_js.MIN_ELEMENT_SIZE);
|
|
4665
4665
|
}
|
|
4666
4666
|
function resolveLiveTarget(input) {
|
|
4667
4667
|
const { livePatcher, editTemplateMode, activeSlide } = input;
|
|
@@ -4774,7 +4774,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4774
4774
|
width: el.width,
|
|
4775
4775
|
height: el.height
|
|
4776
4776
|
}));
|
|
4777
|
-
const snapResult =
|
|
4777
|
+
const snapResult = chunkPABSSYRA_js.computeSnapToShape(
|
|
4778
4778
|
targetX,
|
|
4779
4779
|
targetY,
|
|
4780
4780
|
primaryEl.width,
|
|
@@ -4816,7 +4816,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4816
4816
|
if (live) {
|
|
4817
4817
|
for (const id of Object.keys(drag.startPositionsById)) {
|
|
4818
4818
|
const start = drag.startPositionsById[id];
|
|
4819
|
-
|
|
4819
|
+
chunkPABSSYRA_js.publishLiveGeometry(live.patcher, live.slideId, id, {
|
|
4820
4820
|
x: start.x + appliedDx,
|
|
4821
4821
|
y: start.y + appliedDy
|
|
4822
4822
|
});
|
|
@@ -4848,8 +4848,8 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4848
4848
|
rs.lastY = geo.y;
|
|
4849
4849
|
rs.lastWidth = geo.width;
|
|
4850
4850
|
rs.lastHeight = geo.height;
|
|
4851
|
-
const width = Math.max(geo.width,
|
|
4852
|
-
const height = Math.max(geo.height,
|
|
4851
|
+
const width = Math.max(geo.width, chunkNMSZ3NSG_js.MIN_ELEMENT_SIZE);
|
|
4852
|
+
const height = Math.max(geo.height, chunkNMSZ3NSG_js.MIN_ELEMENT_SIZE);
|
|
4853
4853
|
if (rs.domEl) {
|
|
4854
4854
|
rs.domEl.style.left = `${geo.x}px`;
|
|
4855
4855
|
rs.domEl.style.top = `${geo.y}px`;
|
|
@@ -4858,7 +4858,7 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4858
4858
|
syncSelectionHandleOverlay(rs.domEl, rs.elementId, { x: geo.x, y: geo.y, width, height });
|
|
4859
4859
|
}
|
|
4860
4860
|
if (live) {
|
|
4861
|
-
|
|
4861
|
+
chunkPABSSYRA_js.publishLiveGeometry(live.patcher, live.slideId, rs.elementId, {
|
|
4862
4862
|
x: geo.x,
|
|
4863
4863
|
y: geo.y,
|
|
4864
4864
|
width,
|
|
@@ -4869,7 +4869,7 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4869
4869
|
function processAdjustmentMove(e, adj, editorScale, updateElementById) {
|
|
4870
4870
|
const dx = (e.clientX - adj.startClientX) / editorScale;
|
|
4871
4871
|
const dy = (e.clientY - adj.startClientY) / editorScale;
|
|
4872
|
-
const adjustments =
|
|
4872
|
+
const adjustments = chunkPABSSYRA_js.getDraggedShapeAdjustments(adj, dx, dy);
|
|
4873
4873
|
if (!adj.moved && Math.hypot(dx, dy) > 2) {
|
|
4874
4874
|
adj.moved = true;
|
|
4875
4875
|
}
|
|
@@ -4944,13 +4944,13 @@ function processPointerUp(input) {
|
|
|
4944
4944
|
if (i !== activeSlideIndex) {
|
|
4945
4945
|
return s;
|
|
4946
4946
|
}
|
|
4947
|
-
const rerouted =
|
|
4947
|
+
const rerouted = chunkPABSSYRA_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
|
|
4948
4948
|
if (rerouted.length === 0) {
|
|
4949
4949
|
return s;
|
|
4950
4950
|
}
|
|
4951
4951
|
return {
|
|
4952
4952
|
...s,
|
|
4953
|
-
elements:
|
|
4953
|
+
elements: chunkPABSSYRA_js.applyReroutedConnectors(s.elements, rerouted)
|
|
4954
4954
|
};
|
|
4955
4955
|
})
|
|
4956
4956
|
);
|
|
@@ -4975,9 +4975,9 @@ function processPointerUp(input) {
|
|
|
4975
4975
|
}
|
|
4976
4976
|
function commitMarquee(marquee, editTemplateMode, templateElements, activeSlide, applySelection, clearSelection) {
|
|
4977
4977
|
const sourceElements = editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
4978
|
-
const hitIds =
|
|
4978
|
+
const hitIds = chunkPABSSYRA_js.computeMarqueeHitIds(marquee, sourceElements);
|
|
4979
4979
|
if (marquee.additive) {
|
|
4980
|
-
const merged =
|
|
4980
|
+
const merged = chunkPABSSYRA_js.mergeAdditiveSelection(marquee.baseSelectionIds, hitIds);
|
|
4981
4981
|
if (merged.length > 0) {
|
|
4982
4982
|
applySelection(merged[0], merged);
|
|
4983
4983
|
} else {
|
|
@@ -5000,8 +5000,8 @@ function commitDrag(drag, editTemplateMode, activeSlide, activeSlideIndex, setTe
|
|
|
5000
5000
|
}
|
|
5001
5001
|
return { ...el, x: start.x + dx, y: start.y + dy };
|
|
5002
5002
|
});
|
|
5003
|
-
const rerouted =
|
|
5004
|
-
return
|
|
5003
|
+
const rerouted = chunkPABSSYRA_js.rerouteConnectorsForMovedElements(movedElements, movedIds);
|
|
5004
|
+
return chunkPABSSYRA_js.applyReroutedConnectors(movedElements, rerouted);
|
|
5005
5005
|
};
|
|
5006
5006
|
if (editTemplateMode) {
|
|
5007
5007
|
const slideId = activeSlide?.id;
|
|
@@ -5157,17 +5157,17 @@ function useCanvasInteractions(input) {
|
|
|
5157
5157
|
return;
|
|
5158
5158
|
}
|
|
5159
5159
|
const el = elementLookup.get(editId);
|
|
5160
|
-
if (el &&
|
|
5160
|
+
if (el && chunkPABSSYRA_js.hasTextProperties(el)) {
|
|
5161
5161
|
const committedText = transformCommittedText ? transformCommittedText(inlineEditingText) : inlineEditingText;
|
|
5162
|
-
const textPatch =
|
|
5162
|
+
const textPatch = chunkPABSSYRA_js.buildInlineTextCommitPatch(el, committedText);
|
|
5163
5163
|
if (!textPatch) {
|
|
5164
5164
|
setInlineEditingElementId(null);
|
|
5165
5165
|
setInlineEditingText("");
|
|
5166
5166
|
return;
|
|
5167
5167
|
}
|
|
5168
5168
|
const editorEl = document.querySelector("[data-inline-editor]");
|
|
5169
|
-
const newHeight =
|
|
5170
|
-
const shrink =
|
|
5169
|
+
const newHeight = chunkPABSSYRA_js.resolveInlineEditAutoFitHeight(el.textStyle, el.height, editorEl);
|
|
5170
|
+
const shrink = chunkPABSSYRA_js.resolveInlineEditNormAutofitShrink(el.textStyle, el.height, editorEl);
|
|
5171
5171
|
ops.updateElementById(editId, {
|
|
5172
5172
|
...textPatch,
|
|
5173
5173
|
...newHeight !== void 0 ? { height: newHeight } : {},
|
|
@@ -5185,7 +5185,7 @@ function useCanvasInteractions(input) {
|
|
|
5185
5185
|
setInlineEditingText("");
|
|
5186
5186
|
};
|
|
5187
5187
|
const openEquationEditorForElement = (el) => {
|
|
5188
|
-
if (!
|
|
5188
|
+
if (!chunkPABSSYRA_js.hasTextProperties(el)) {
|
|
5189
5189
|
return false;
|
|
5190
5190
|
}
|
|
5191
5191
|
const eqSeg = el.textSegments?.find((seg) => seg.equationXml);
|
|
@@ -5215,7 +5215,7 @@ function useCanvasInteractions(input) {
|
|
|
5215
5215
|
justInteractedRef.current = false;
|
|
5216
5216
|
} else {
|
|
5217
5217
|
const el = elementLookup.get(elementId);
|
|
5218
|
-
if (el &&
|
|
5218
|
+
if (el && chunkPABSSYRA_js.hasTextProperties(el) && chunkPABSSYRA_js.canInteractWithElement(el, "textEdit")) {
|
|
5219
5219
|
if (!openEquationEditorForElement(el)) {
|
|
5220
5220
|
setInlineEditingElementId(elementId);
|
|
5221
5221
|
setInlineEditingText(el.text ?? "");
|
|
@@ -5234,7 +5234,7 @@ function useCanvasInteractions(input) {
|
|
|
5234
5234
|
if (openEquationEditorForElement(el)) {
|
|
5235
5235
|
return;
|
|
5236
5236
|
}
|
|
5237
|
-
if (
|
|
5237
|
+
if (chunkPABSSYRA_js.hasTextProperties(el) && chunkPABSSYRA_js.canInteractWithElement(el, "textEdit")) {
|
|
5238
5238
|
setInlineEditingElementId(elementId);
|
|
5239
5239
|
setInlineEditingText(el.text ?? "");
|
|
5240
5240
|
}
|
|
@@ -5257,7 +5257,7 @@ function useCanvasInteractions(input) {
|
|
|
5257
5257
|
justSelectedRef.current = false;
|
|
5258
5258
|
}
|
|
5259
5259
|
const ids = !wasSelected ? [elementId] : effectiveSelectedIds.length ? effectiveSelectedIds : [elementId];
|
|
5260
|
-
const movableIds =
|
|
5260
|
+
const movableIds = chunkPABSSYRA_js.filterInteractableIds(ids, (id) => elementLookup.get(id), "move");
|
|
5261
5261
|
if (movableIds.length === 0) {
|
|
5262
5262
|
return;
|
|
5263
5263
|
}
|
|
@@ -5327,7 +5327,7 @@ function useCanvasInteractions(input) {
|
|
|
5327
5327
|
const handleResizePointerDown = (elementId, e, handle) => {
|
|
5328
5328
|
e.stopPropagation();
|
|
5329
5329
|
const el = elementLookup.get(elementId);
|
|
5330
|
-
if (!el || !
|
|
5330
|
+
if (!el || !chunkPABSSYRA_js.canInteractWithElement(el, "resize")) {
|
|
5331
5331
|
return;
|
|
5332
5332
|
}
|
|
5333
5333
|
resizeStateRef.current = {
|
|
@@ -5349,7 +5349,7 @@ function useCanvasInteractions(input) {
|
|
|
5349
5349
|
};
|
|
5350
5350
|
const handleRotate = (elementId, rotationDeg) => {
|
|
5351
5351
|
const el = elementLookup.get(elementId);
|
|
5352
|
-
if (!el || !
|
|
5352
|
+
if (!el || !chunkPABSSYRA_js.canInteractWithElement(el, "rotate")) {
|
|
5353
5353
|
return;
|
|
5354
5354
|
}
|
|
5355
5355
|
ops.updateElementById(elementId, { rotation: rotationDeg });
|
|
@@ -5369,10 +5369,10 @@ function useCanvasInteractions(input) {
|
|
|
5369
5369
|
const handleAdjustmentPointerDown = (elementId, e, descriptor) => {
|
|
5370
5370
|
e.stopPropagation();
|
|
5371
5371
|
const el = elementLookup.get(elementId);
|
|
5372
|
-
if (!el || !
|
|
5372
|
+
if (!el || !chunkPABSSYRA_js.canInteractWithElement(el, "adjustHandle")) {
|
|
5373
5373
|
return;
|
|
5374
5374
|
}
|
|
5375
|
-
shapeAdjustmentDragStateRef.current =
|
|
5375
|
+
shapeAdjustmentDragStateRef.current = chunkPABSSYRA_js.beginShapeAdjustment(
|
|
5376
5376
|
el,
|
|
5377
5377
|
descriptor,
|
|
5378
5378
|
e.clientX,
|
|
@@ -5419,7 +5419,7 @@ function createFileHandlers(deps) {
|
|
|
5419
5419
|
h = Math.round(h * scale);
|
|
5420
5420
|
}
|
|
5421
5421
|
addElement({
|
|
5422
|
-
id:
|
|
5422
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
5423
5423
|
type: "image",
|
|
5424
5424
|
x: Math.round((canvasSize.width - w) / 2),
|
|
5425
5425
|
y: Math.round((canvasSize.height - h) / 2),
|
|
@@ -5430,7 +5430,7 @@ function createFileHandlers(deps) {
|
|
|
5430
5430
|
};
|
|
5431
5431
|
img.onerror = () => {
|
|
5432
5432
|
addElement({
|
|
5433
|
-
id:
|
|
5433
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
5434
5434
|
type: "image",
|
|
5435
5435
|
x: 100,
|
|
5436
5436
|
y: 100,
|
|
@@ -5449,14 +5449,14 @@ function createFileHandlers(deps) {
|
|
|
5449
5449
|
return;
|
|
5450
5450
|
}
|
|
5451
5451
|
e.target.value = "";
|
|
5452
|
-
const mediaType =
|
|
5452
|
+
const mediaType = chunkPABSSYRA_js.classifyMediaType(file.type);
|
|
5453
5453
|
if (!mediaType) {
|
|
5454
5454
|
return;
|
|
5455
5455
|
}
|
|
5456
5456
|
const elFilePath = file.path;
|
|
5457
5457
|
const insertMediaElement = (mediaSourceUrl, width, height) => {
|
|
5458
5458
|
addElement({
|
|
5459
|
-
id:
|
|
5459
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
5460
5460
|
type: "media",
|
|
5461
5461
|
mediaType,
|
|
5462
5462
|
mediaMimeType: file.type || void 0,
|
|
@@ -5631,13 +5631,13 @@ function createStructuredElementHandlers(deps) {
|
|
|
5631
5631
|
return;
|
|
5632
5632
|
}
|
|
5633
5633
|
addElement({
|
|
5634
|
-
id:
|
|
5634
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
5635
5635
|
type: "smartArt",
|
|
5636
5636
|
x: 100,
|
|
5637
5637
|
y: 120,
|
|
5638
5638
|
width: 600,
|
|
5639
5639
|
height: 340,
|
|
5640
|
-
smartArtData:
|
|
5640
|
+
smartArtData: chunkPABSSYRA_js.buildSmartArtPresetData(
|
|
5641
5641
|
layout,
|
|
5642
5642
|
defaultItems,
|
|
5643
5643
|
(i) => `node-${Date.now()}-${i}-${Math.random().toString(36).slice(2, 8)}`
|
|
@@ -5649,7 +5649,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5649
5649
|
return;
|
|
5650
5650
|
}
|
|
5651
5651
|
addElement({
|
|
5652
|
-
id:
|
|
5652
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
5653
5653
|
type: "shape",
|
|
5654
5654
|
x: 120,
|
|
5655
5655
|
y: 200,
|
|
@@ -5687,7 +5687,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5687
5687
|
return;
|
|
5688
5688
|
}
|
|
5689
5689
|
const resolved = resolveHyperlinkEditResult(data);
|
|
5690
|
-
if (resolved.url && !
|
|
5690
|
+
if (resolved.url && !chunkPABSSYRA_js.isUrlSafe(resolved.url)) {
|
|
5691
5691
|
return;
|
|
5692
5692
|
}
|
|
5693
5693
|
const actionClick = {
|
|
@@ -5711,7 +5711,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5711
5711
|
const displayText = value || fieldTexts[fieldType] || fieldType;
|
|
5712
5712
|
const fieldGuid = `{${crypto.randomUUID().toUpperCase()}}`;
|
|
5713
5713
|
addElement({
|
|
5714
|
-
id:
|
|
5714
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
5715
5715
|
type: "shape",
|
|
5716
5716
|
x: 120,
|
|
5717
5717
|
y: 200,
|
|
@@ -5733,11 +5733,11 @@ function createStructuredElementHandlers(deps) {
|
|
|
5733
5733
|
if (!activeSlide) {
|
|
5734
5734
|
return;
|
|
5735
5735
|
}
|
|
5736
|
-
const preset =
|
|
5736
|
+
const preset = chunkPABSSYRA_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
|
|
5737
5737
|
if (!preset) {
|
|
5738
5738
|
return;
|
|
5739
5739
|
}
|
|
5740
|
-
const defaultPptxAction =
|
|
5740
|
+
const defaultPptxAction = chunkPABSSYRA_js.elementActionToPptxAction({
|
|
5741
5741
|
trigger: "click",
|
|
5742
5742
|
type: preset.defaultAction
|
|
5743
5743
|
});
|
|
@@ -5746,7 +5746,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5746
5746
|
defaultPptxAction.highlightClick = true;
|
|
5747
5747
|
}
|
|
5748
5748
|
addElement({
|
|
5749
|
-
id:
|
|
5749
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
5750
5750
|
type: "shape",
|
|
5751
5751
|
x: 150,
|
|
5752
5752
|
y: 150,
|
|
@@ -5813,14 +5813,14 @@ function useInsertElements(input) {
|
|
|
5813
5813
|
return;
|
|
5814
5814
|
}
|
|
5815
5815
|
addElement({
|
|
5816
|
-
id:
|
|
5816
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
5817
5817
|
type: "text",
|
|
5818
5818
|
x: 100,
|
|
5819
5819
|
y: 100,
|
|
5820
5820
|
width: 300,
|
|
5821
5821
|
height: 60,
|
|
5822
5822
|
text: "",
|
|
5823
|
-
textStyle: { fontSize:
|
|
5823
|
+
textStyle: { fontSize: chunkNMSZ3NSG_js.DEFAULT_TEXT_FONT_SIZE }
|
|
5824
5824
|
});
|
|
5825
5825
|
};
|
|
5826
5826
|
const handleAddShape = () => {
|
|
@@ -5828,7 +5828,7 @@ function useInsertElements(input) {
|
|
|
5828
5828
|
return;
|
|
5829
5829
|
}
|
|
5830
5830
|
addElement({
|
|
5831
|
-
id:
|
|
5831
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
5832
5832
|
type: "shape",
|
|
5833
5833
|
x: 150,
|
|
5834
5834
|
y: 150,
|
|
@@ -5847,15 +5847,15 @@ function useInsertElements(input) {
|
|
|
5847
5847
|
return;
|
|
5848
5848
|
}
|
|
5849
5849
|
addElement({
|
|
5850
|
-
...
|
|
5851
|
-
id:
|
|
5850
|
+
...chunkPABSSYRA_js.newTableElement(chunkNMSZ3NSG_js.DEFAULT_TABLE_ROWS, chunkNMSZ3NSG_js.DEFAULT_TABLE_COLUMNS, 100, 200),
|
|
5851
|
+
id: chunkPABSSYRA_js.generateElementId()
|
|
5852
5852
|
});
|
|
5853
5853
|
};
|
|
5854
5854
|
const handleAddChart = (chartKind) => {
|
|
5855
5855
|
if (!activeSlide) {
|
|
5856
5856
|
return;
|
|
5857
5857
|
}
|
|
5858
|
-
addElement(
|
|
5858
|
+
addElement(chunkPABSSYRA_js.createDefaultChartElement(chartKind));
|
|
5859
5859
|
};
|
|
5860
5860
|
const structured = createStructuredElementHandlers({
|
|
5861
5861
|
activeSlide,
|
|
@@ -5925,7 +5925,7 @@ function useClipboardHandlers(input) {
|
|
|
5925
5925
|
if (!selectedElement) {
|
|
5926
5926
|
return;
|
|
5927
5927
|
}
|
|
5928
|
-
setClipboardPayload(
|
|
5928
|
+
setClipboardPayload(chunkPABSSYRA_js.buildElementClipboardPayload(selectedElement, editTemplateMode));
|
|
5929
5929
|
};
|
|
5930
5930
|
const handleDelete = () => {
|
|
5931
5931
|
const idsToDelete = effectiveSelectedIds;
|
|
@@ -5942,7 +5942,7 @@ function useClipboardHandlers(input) {
|
|
|
5942
5942
|
handleDelete();
|
|
5943
5943
|
};
|
|
5944
5944
|
const insertClone = (source) => {
|
|
5945
|
-
const clone =
|
|
5945
|
+
const clone = chunkPABSSYRA_js.cloneElementForPaste(source, { intoTemplate: editTemplateMode });
|
|
5946
5946
|
ops.updateActiveElements((els) => [...els, clone]);
|
|
5947
5947
|
ops.applySelection(clone.id);
|
|
5948
5948
|
history.markDirty();
|
|
@@ -5977,7 +5977,7 @@ function resolveShapePath(el) {
|
|
|
5977
5977
|
return el.pathData;
|
|
5978
5978
|
}
|
|
5979
5979
|
if ("shapeType" in el && typeof el.shapeType === "string") {
|
|
5980
|
-
const clipPath =
|
|
5980
|
+
const clipPath = chunkPABSSYRA_js.getPresetShapeClipPath(el.shapeType);
|
|
5981
5981
|
if (clipPath) {
|
|
5982
5982
|
const svgPath = clipPathToSvgPath(clipPath, el.width, el.height);
|
|
5983
5983
|
if (svgPath) {
|
|
@@ -6028,7 +6028,7 @@ function clipPathToSvgPath(clipPath, width, height) {
|
|
|
6028
6028
|
return parts.join(" ");
|
|
6029
6029
|
}
|
|
6030
6030
|
function transformPathToGlobal(pathData, el) {
|
|
6031
|
-
const polys =
|
|
6031
|
+
const polys = chunkPABSSYRA_js.svgPathToPolygons(pathData);
|
|
6032
6032
|
if (polys.length === 0) {
|
|
6033
6033
|
return pathData;
|
|
6034
6034
|
}
|
|
@@ -6048,10 +6048,10 @@ function transformPathToGlobal(pathData, el) {
|
|
|
6048
6048
|
y: pt.y * scaleY + el.y
|
|
6049
6049
|
}))
|
|
6050
6050
|
);
|
|
6051
|
-
return
|
|
6051
|
+
return chunkPABSSYRA_js.polygonsToSvgPath(transformed);
|
|
6052
6052
|
}
|
|
6053
6053
|
function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
6054
|
-
const polys =
|
|
6054
|
+
const polys = chunkPABSSYRA_js.svgPathToPolygons(pathData);
|
|
6055
6055
|
if (polys.length === 0) {
|
|
6056
6056
|
return pathData;
|
|
6057
6057
|
}
|
|
@@ -6061,10 +6061,10 @@ function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
|
6061
6061
|
y: pt.y - y
|
|
6062
6062
|
}))
|
|
6063
6063
|
);
|
|
6064
|
-
return
|
|
6064
|
+
return chunkPABSSYRA_js.polygonsToSvgPath(transformed);
|
|
6065
6065
|
}
|
|
6066
6066
|
function pathBounds(pathData) {
|
|
6067
|
-
const polys =
|
|
6067
|
+
const polys = chunkPABSSYRA_js.svgPathToPolygons(pathData);
|
|
6068
6068
|
let minX = Infinity;
|
|
6069
6069
|
let minY = Infinity;
|
|
6070
6070
|
let maxX = -Infinity;
|
|
@@ -6123,7 +6123,7 @@ function useMergeShapesHandler(input) {
|
|
|
6123
6123
|
let allFragments = [];
|
|
6124
6124
|
let remaining = globalPaths[0];
|
|
6125
6125
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
6126
|
-
const frags =
|
|
6126
|
+
const frags = chunkPABSSYRA_js.mergeShapes("fragment", remaining, globalPaths[i]);
|
|
6127
6127
|
if (Array.isArray(frags)) {
|
|
6128
6128
|
allFragments = frags;
|
|
6129
6129
|
}
|
|
@@ -6152,7 +6152,7 @@ function useMergeShapesHandler(input) {
|
|
|
6152
6152
|
bounds.height
|
|
6153
6153
|
);
|
|
6154
6154
|
const newEl = {
|
|
6155
|
-
id:
|
|
6155
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
6156
6156
|
type: "shape",
|
|
6157
6157
|
x: bounds.x,
|
|
6158
6158
|
y: bounds.y,
|
|
@@ -6190,7 +6190,7 @@ function useMergeShapesHandler(input) {
|
|
|
6190
6190
|
} else {
|
|
6191
6191
|
let resultPath = globalPaths[0];
|
|
6192
6192
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
6193
|
-
const result =
|
|
6193
|
+
const result = chunkPABSSYRA_js.mergeShapes(operation, resultPath, globalPaths[i]);
|
|
6194
6194
|
if (typeof result === "string") {
|
|
6195
6195
|
resultPath = result;
|
|
6196
6196
|
}
|
|
@@ -6211,7 +6211,7 @@ function useMergeShapesHandler(input) {
|
|
|
6211
6211
|
);
|
|
6212
6212
|
const primary = targets[0];
|
|
6213
6213
|
const newEl = {
|
|
6214
|
-
id:
|
|
6214
|
+
id: chunkPABSSYRA_js.generateElementId(),
|
|
6215
6215
|
type: "shape",
|
|
6216
6216
|
x: bounds.x,
|
|
6217
6217
|
y: bounds.y,
|
|
@@ -6274,10 +6274,10 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6274
6274
|
if (ids.length < 2 || !activeSlide) {
|
|
6275
6275
|
return;
|
|
6276
6276
|
}
|
|
6277
|
-
if (!selectedElements.every((el) =>
|
|
6277
|
+
if (!selectedElements.every((el) => chunkPABSSYRA_js.canInteractWithElement(el, "group"))) {
|
|
6278
6278
|
return;
|
|
6279
6279
|
}
|
|
6280
|
-
const { elements, groupId } =
|
|
6280
|
+
const { elements, groupId } = chunkPABSSYRA_js.groupElements(ops.activeElements, ids, chunkPABSSYRA_js.generateElementId());
|
|
6281
6281
|
if (groupId === null) {
|
|
6282
6282
|
return;
|
|
6283
6283
|
}
|
|
@@ -6289,15 +6289,15 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6289
6289
|
if (!selectedElement || selectedElement.type !== "group" || !activeSlide) {
|
|
6290
6290
|
return;
|
|
6291
6291
|
}
|
|
6292
|
-
if (!
|
|
6292
|
+
if (!chunkPABSSYRA_js.canInteractWithElement(selectedElement, "group")) {
|
|
6293
6293
|
return;
|
|
6294
6294
|
}
|
|
6295
6295
|
const group = selectedElement;
|
|
6296
|
-
const intoTemplate =
|
|
6296
|
+
const intoTemplate = chunkPABSSYRA_js.isTemplateElementId(group.id);
|
|
6297
6297
|
const childIds = group.children.map(
|
|
6298
|
-
(child) => intoTemplate ?
|
|
6298
|
+
(child) => intoTemplate ? chunkPABSSYRA_js.makeCloneId(true, child.id || group.id) : child.id || chunkPABSSYRA_js.generateElementId()
|
|
6299
6299
|
);
|
|
6300
|
-
const { elements, childIds: usedIds } =
|
|
6300
|
+
const { elements, childIds: usedIds } = chunkPABSSYRA_js.ungroupElements(
|
|
6301
6301
|
ops.activeElements,
|
|
6302
6302
|
group.id,
|
|
6303
6303
|
childIds,
|
|
@@ -6326,7 +6326,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6326
6326
|
if (!edge) {
|
|
6327
6327
|
return;
|
|
6328
6328
|
}
|
|
6329
|
-
const positions =
|
|
6329
|
+
const positions = chunkPABSSYRA_js.alignElements(selectedElements, edge);
|
|
6330
6330
|
for (const [id, pos] of positions) {
|
|
6331
6331
|
const el = elementLookup.get(id);
|
|
6332
6332
|
if (!el) {
|
|
@@ -6344,7 +6344,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6344
6344
|
if (!distAxis) {
|
|
6345
6345
|
return;
|
|
6346
6346
|
}
|
|
6347
|
-
const positions =
|
|
6347
|
+
const positions = chunkPABSSYRA_js.distributeElements(selectedElements, distAxis);
|
|
6348
6348
|
for (const [id, pos] of positions) {
|
|
6349
6349
|
const el = elementLookup.get(id);
|
|
6350
6350
|
if (!el) {
|
|
@@ -6355,14 +6355,14 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6355
6355
|
history.markDirty();
|
|
6356
6356
|
};
|
|
6357
6357
|
const canDistribute = selectedElements.length >= 3;
|
|
6358
|
-
const selectionGroupable = selectedElements.every((el) =>
|
|
6358
|
+
const selectionGroupable = selectedElements.every((el) => chunkPABSSYRA_js.canInteractWithElement(el, "group"));
|
|
6359
6359
|
const handleMoveLayer = (direction) => {
|
|
6360
6360
|
if (!selectedElement || !activeSlide) {
|
|
6361
6361
|
return;
|
|
6362
6362
|
}
|
|
6363
6363
|
const id = selectedElement.id;
|
|
6364
6364
|
ops.updateActiveElements(
|
|
6365
|
-
(els) => direction === "forward" ?
|
|
6365
|
+
(els) => direction === "forward" ? chunkPABSSYRA_js.bringForward(els, id) : direction === "backward" ? chunkPABSSYRA_js.sendBackward(els, id) : els
|
|
6366
6366
|
);
|
|
6367
6367
|
history.markDirty();
|
|
6368
6368
|
};
|
|
@@ -6372,7 +6372,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6372
6372
|
}
|
|
6373
6373
|
const id = selectedElement.id;
|
|
6374
6374
|
ops.updateActiveElements(
|
|
6375
|
-
(els) => direction === "front" ?
|
|
6375
|
+
(els) => direction === "front" ? chunkPABSSYRA_js.bringToFront(els, id) : chunkPABSSYRA_js.sendToBack(els, id)
|
|
6376
6376
|
);
|
|
6377
6377
|
history.markDirty();
|
|
6378
6378
|
};
|
|
@@ -6507,7 +6507,7 @@ function useSlideManagement(input) {
|
|
|
6507
6507
|
} = input;
|
|
6508
6508
|
const handleAddSlideAfter = (afterIndex) => {
|
|
6509
6509
|
const insertAt = Math.max(0, Math.min(afterIndex + 1, slides.length));
|
|
6510
|
-
const newSlide =
|
|
6510
|
+
const newSlide = chunkPABSSYRA_js.createBlankSlide(slides.length + 1);
|
|
6511
6511
|
ops.updateSlides((prev) => {
|
|
6512
6512
|
const next = [...prev];
|
|
6513
6513
|
next.splice(insertAt, 0, newSlide);
|
|
@@ -6571,7 +6571,7 @@ function useSlideManagement(input) {
|
|
|
6571
6571
|
}
|
|
6572
6572
|
const clone = {
|
|
6573
6573
|
...src,
|
|
6574
|
-
id:
|
|
6574
|
+
id: chunkPABSSYRA_js.makeSlideId(),
|
|
6575
6575
|
elements: src.elements.map((el) => ({
|
|
6576
6576
|
...el,
|
|
6577
6577
|
id: `${el.id}-dup-${Math.random().toString(36).slice(2, 6)}`
|
|
@@ -6603,7 +6603,7 @@ function useSlideManagement(input) {
|
|
|
6603
6603
|
const handleInsertSlideFromLayout = (layoutPath, layoutName) => {
|
|
6604
6604
|
const insertAt = activeSlideIndex + 1;
|
|
6605
6605
|
const draft = {
|
|
6606
|
-
...
|
|
6606
|
+
...chunkPABSSYRA_js.createBlankSlide(slides.length + 1),
|
|
6607
6607
|
layoutPath,
|
|
6608
6608
|
...layoutName ? { layoutName } : {}
|
|
6609
6609
|
};
|
|
@@ -6636,9 +6636,9 @@ function useSlideManagement(input) {
|
|
|
6636
6636
|
};
|
|
6637
6637
|
const handleInsertSlideFromTemplate = (templateId) => {
|
|
6638
6638
|
const insertAt = activeSlideIndex + 1;
|
|
6639
|
-
const draft =
|
|
6639
|
+
const draft = chunkPABSSYRA_js.buildSlideTemplateSlide(templateId, chunkPABSSYRA_js.makeSlideId(), slides.length + 1, {
|
|
6640
6640
|
...canvasSize ? { slideWidth: canvasSize.width, slideHeight: canvasSize.height } : {},
|
|
6641
|
-
scheme:
|
|
6641
|
+
scheme: chunkPABSSYRA_js.templateSchemeFromTheme(theme?.colorScheme)
|
|
6642
6642
|
});
|
|
6643
6643
|
ops.updateSlides((prev) => insertSlideFromLayoutUpdater(prev, activeSlideIndex, draft));
|
|
6644
6644
|
setActiveSlideIndex(insertAt);
|
|
@@ -6676,7 +6676,7 @@ function createTableMergeHandlers(input) {
|
|
|
6676
6676
|
if (!nextCell || nextCell.hMerge || nextCell.vMerge) {
|
|
6677
6677
|
return;
|
|
6678
6678
|
}
|
|
6679
|
-
const newTableData =
|
|
6679
|
+
const newTableData = chunkPABSSYRA_js.mergeCells(
|
|
6680
6680
|
[
|
|
6681
6681
|
{ row: rowIndex, col: columnIndex },
|
|
6682
6682
|
{ row: rowIndex, col: nextColIdx }
|
|
@@ -6684,7 +6684,7 @@ function createTableMergeHandlers(input) {
|
|
|
6684
6684
|
td
|
|
6685
6685
|
);
|
|
6686
6686
|
const updates = { tableData: newTableData };
|
|
6687
|
-
const newRawXml =
|
|
6687
|
+
const newRawXml = chunkPABSSYRA_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6688
6688
|
if (newRawXml) {
|
|
6689
6689
|
updates.rawXml = newRawXml;
|
|
6690
6690
|
}
|
|
@@ -6710,7 +6710,7 @@ function createTableMergeHandlers(input) {
|
|
|
6710
6710
|
if (!targetNextCell || targetNextCell.hMerge || targetNextCell.vMerge) {
|
|
6711
6711
|
return;
|
|
6712
6712
|
}
|
|
6713
|
-
const newTableData =
|
|
6713
|
+
const newTableData = chunkPABSSYRA_js.mergeCells(
|
|
6714
6714
|
[
|
|
6715
6715
|
{ row: rowIndex, col: columnIndex },
|
|
6716
6716
|
{ row: targetNextRowIdx, col: columnIndex }
|
|
@@ -6718,7 +6718,7 @@ function createTableMergeHandlers(input) {
|
|
|
6718
6718
|
td
|
|
6719
6719
|
);
|
|
6720
6720
|
const updates = { tableData: newTableData };
|
|
6721
|
-
const newRawXml =
|
|
6721
|
+
const newRawXml = chunkPABSSYRA_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6722
6722
|
if (newRawXml) {
|
|
6723
6723
|
updates.rawXml = newRawXml;
|
|
6724
6724
|
}
|
|
@@ -6733,9 +6733,9 @@ function createTableMergeHandlers(input) {
|
|
|
6733
6733
|
return;
|
|
6734
6734
|
}
|
|
6735
6735
|
const td = selectedElement.tableData;
|
|
6736
|
-
const newTableData =
|
|
6736
|
+
const newTableData = chunkPABSSYRA_js.mergeCells(ts.selectedCells, td);
|
|
6737
6737
|
const updates = { tableData: newTableData };
|
|
6738
|
-
const newRawXml =
|
|
6738
|
+
const newRawXml = chunkPABSSYRA_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6739
6739
|
if (newRawXml) {
|
|
6740
6740
|
updates.rawXml = newRawXml;
|
|
6741
6741
|
}
|
|
@@ -6752,9 +6752,9 @@ function createTableMergeHandlers(input) {
|
|
|
6752
6752
|
}
|
|
6753
6753
|
const { rowIndex, columnIndex } = ts;
|
|
6754
6754
|
const td = selectedElement.tableData;
|
|
6755
|
-
const newTableData =
|
|
6755
|
+
const newTableData = chunkPABSSYRA_js.splitCell(rowIndex, columnIndex, td);
|
|
6756
6756
|
const updates = { tableData: newTableData };
|
|
6757
|
-
const newRawXml =
|
|
6757
|
+
const newRawXml = chunkPABSSYRA_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6758
6758
|
if (newRawXml) {
|
|
6759
6759
|
updates.rawXml = newRawXml;
|
|
6760
6760
|
}
|
|
@@ -6788,10 +6788,10 @@ function createTableStructHandlers(input) {
|
|
|
6788
6788
|
const text = transformCommittedText ? transformCommittedText(rawText) : rawText;
|
|
6789
6789
|
const updates = {};
|
|
6790
6790
|
if (el.tableData) {
|
|
6791
|
-
updates.tableData =
|
|
6791
|
+
updates.tableData = chunkPABSSYRA_js.setCellText(el, rowIndex, colIndex, text).tableData;
|
|
6792
6792
|
}
|
|
6793
6793
|
if (el.rawXml) {
|
|
6794
|
-
const newRawXml =
|
|
6794
|
+
const newRawXml = chunkPABSSYRA_js.updateCellTextInRawXml(el, rowIndex, colIndex, text);
|
|
6795
6795
|
if (newRawXml) {
|
|
6796
6796
|
updates.rawXml = newRawXml;
|
|
6797
6797
|
}
|
|
@@ -6815,7 +6815,7 @@ function createTableStructHandlers(input) {
|
|
|
6815
6815
|
const { rowIndex, columnIndex: colIndex } = ts;
|
|
6816
6816
|
const updates = {};
|
|
6817
6817
|
if (selectedElement.rawXml) {
|
|
6818
|
-
const newRawXml =
|
|
6818
|
+
const newRawXml = chunkPABSSYRA_js.updateCellTextStyleInRawXml(
|
|
6819
6819
|
selectedElement,
|
|
6820
6820
|
rowIndex,
|
|
6821
6821
|
colIndex,
|
|
@@ -6879,7 +6879,7 @@ function createTableStructHandlers(input) {
|
|
|
6879
6879
|
return;
|
|
6880
6880
|
}
|
|
6881
6881
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6882
|
-
const next =
|
|
6882
|
+
const next = chunkPABSSYRA_js.insertTableElementRow(selectedElement, rowIdx, position);
|
|
6883
6883
|
ops.updateSelectedElement({ tableData: next.tableData, rawXml: next.rawXml });
|
|
6884
6884
|
history.markDirty();
|
|
6885
6885
|
};
|
|
@@ -6888,7 +6888,7 @@ function createTableStructHandlers(input) {
|
|
|
6888
6888
|
return;
|
|
6889
6889
|
}
|
|
6890
6890
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6891
|
-
const next =
|
|
6891
|
+
const next = chunkPABSSYRA_js.removeTableElementRow(selectedElement, rowIdx);
|
|
6892
6892
|
if (next === selectedElement) {
|
|
6893
6893
|
return;
|
|
6894
6894
|
}
|
|
@@ -6900,7 +6900,7 @@ function createTableStructHandlers(input) {
|
|
|
6900
6900
|
return;
|
|
6901
6901
|
}
|
|
6902
6902
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6903
|
-
const next =
|
|
6903
|
+
const next = chunkPABSSYRA_js.insertTableElementColumn(selectedElement, colIdx, position);
|
|
6904
6904
|
ops.updateSelectedElement({ tableData: next.tableData, rawXml: next.rawXml });
|
|
6905
6905
|
history.markDirty();
|
|
6906
6906
|
};
|
|
@@ -6909,7 +6909,7 @@ function createTableStructHandlers(input) {
|
|
|
6909
6909
|
return;
|
|
6910
6910
|
}
|
|
6911
6911
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6912
|
-
const next =
|
|
6912
|
+
const next = chunkPABSSYRA_js.removeTableElementColumn(selectedElement, colIdx);
|
|
6913
6913
|
if (next === selectedElement) {
|
|
6914
6914
|
return;
|
|
6915
6915
|
}
|
|
@@ -6945,8 +6945,8 @@ async function renderToCanvas(element, options = {}) {
|
|
|
6945
6945
|
return html2canvasPro(element, {
|
|
6946
6946
|
...options,
|
|
6947
6947
|
onclone: async (doc, clonedEl) => {
|
|
6948
|
-
await
|
|
6949
|
-
|
|
6948
|
+
await chunkPABSSYRA_js.normalizeColorsForCapture(doc, clonedEl);
|
|
6949
|
+
chunkPABSSYRA_js.preprocessCssForCapture(clonedEl);
|
|
6950
6950
|
if (typeof userOnClone === "function") {
|
|
6951
6951
|
userOnClone(doc, clonedEl);
|
|
6952
6952
|
}
|
|
@@ -6976,7 +6976,7 @@ function useExportSaveAs(input) {
|
|
|
6976
6976
|
slideSizeEmu
|
|
6977
6977
|
} = input;
|
|
6978
6978
|
const handleSaveAsFormat = async (format) => {
|
|
6979
|
-
const downloadName =
|
|
6979
|
+
const downloadName = chunkPABSSYRA_js.savedPresentationFileName(filePath, format);
|
|
6980
6980
|
try {
|
|
6981
6981
|
const data = await serializeSlides(format);
|
|
6982
6982
|
if (!data) {
|
|
@@ -6984,16 +6984,16 @@ function useExportSaveAs(input) {
|
|
|
6984
6984
|
}
|
|
6985
6985
|
const mimeType = format === "ppt" ? "application/vnd.ms-powerpoint" : "application/vnd.openxmlformats-officedocument.presentationml.presentation";
|
|
6986
6986
|
const blob = new Blob([data], { type: mimeType });
|
|
6987
|
-
|
|
6987
|
+
chunkPABSSYRA_js.downloadBlob(blob, downloadName);
|
|
6988
6988
|
} catch (err) {
|
|
6989
6989
|
console.error(`[PowerPointViewer] Save as .${format} failed:`, err);
|
|
6990
6990
|
}
|
|
6991
6991
|
};
|
|
6992
6992
|
const handleExportJson = () => {
|
|
6993
6993
|
const sourceName = filePath ? filePath.replace(/\\/gu, "/").split("/").pop() : void 0;
|
|
6994
|
-
const slideSize =
|
|
6994
|
+
const slideSize = chunkPABSSYRA_js.resolveSlideSizeSelection({ current: slideSizeEmu, canvas: canvasSize }).size;
|
|
6995
6995
|
const data = {
|
|
6996
|
-
slides:
|
|
6996
|
+
slides: chunkPABSSYRA_js.buildSaveSlides(slides, templateElementsBySlideId),
|
|
6997
6997
|
width: canvasSize.width,
|
|
6998
6998
|
height: canvasSize.height,
|
|
6999
6999
|
widthEmu: slideSize.widthEmu,
|
|
@@ -7012,7 +7012,7 @@ function useExportSaveAs(input) {
|
|
|
7012
7012
|
handoutMaster
|
|
7013
7013
|
};
|
|
7014
7014
|
try {
|
|
7015
|
-
|
|
7015
|
+
chunkPABSSYRA_js.exportDeckJson(data, sourceName);
|
|
7016
7016
|
} catch (err) {
|
|
7017
7017
|
console.error("[PowerPointViewer] JSON export failed:", err);
|
|
7018
7018
|
}
|
|
@@ -7077,7 +7077,7 @@ function buildRasterOptions(element, scale, backgroundColor, mode) {
|
|
|
7077
7077
|
}
|
|
7078
7078
|
async function renderElementToRaster(element, scale = 2, backgroundColor, mode = "auto") {
|
|
7079
7079
|
const { width, height } = measureNaturalSize(element);
|
|
7080
|
-
return
|
|
7080
|
+
return chunkPABSSYRA_js.rasterizeElement(
|
|
7081
7081
|
element,
|
|
7082
7082
|
width,
|
|
7083
7083
|
height,
|
|
@@ -7087,7 +7087,7 @@ async function renderElementToRaster(element, scale = 2, backgroundColor, mode =
|
|
|
7087
7087
|
}
|
|
7088
7088
|
async function renderElementToTiles(element, scale = 2, backgroundColor, mode = "auto") {
|
|
7089
7089
|
const { width, height } = measureNaturalSize(element);
|
|
7090
|
-
return
|
|
7090
|
+
return chunkPABSSYRA_js.rasterizeElementTiles(
|
|
7091
7091
|
element,
|
|
7092
7092
|
width,
|
|
7093
7093
|
height,
|
|
@@ -7097,7 +7097,7 @@ async function renderElementToTiles(element, scale = 2, backgroundColor, mode =
|
|
|
7097
7097
|
}
|
|
7098
7098
|
async function renderElementToTiledCanvas(element, scale = 2, backgroundColor, mode = "auto") {
|
|
7099
7099
|
const { width, height } = measureNaturalSize(element);
|
|
7100
|
-
return
|
|
7100
|
+
return chunkPABSSYRA_js.rasterizeElementTiledToCanvas(
|
|
7101
7101
|
element,
|
|
7102
7102
|
width,
|
|
7103
7103
|
height,
|
|
@@ -7119,11 +7119,11 @@ function waitForRender(ms = 100) {
|
|
|
7119
7119
|
async function exportSlideToPngBlob(slideElement, options = {}) {
|
|
7120
7120
|
const { scale = 2, backgroundColor } = options;
|
|
7121
7121
|
const result = await renderElementToRaster(slideElement, scale, backgroundColor);
|
|
7122
|
-
return
|
|
7122
|
+
return chunkPABSSYRA_js.rasterResultToPngBlob(result);
|
|
7123
7123
|
}
|
|
7124
7124
|
async function exportSlideAsPng(slideElement, slideIndex, options = {}) {
|
|
7125
7125
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
7126
|
-
|
|
7126
|
+
chunkPABSSYRA_js.downloadBlob(blob, `slide-${slideIndex + 1}.png`);
|
|
7127
7127
|
}
|
|
7128
7128
|
async function copySlideToClipboard(slideElement, options = {}) {
|
|
7129
7129
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
@@ -7152,13 +7152,13 @@ async function captureAllSlidesAsPngDataUrls(slideStageRef, totalSlides, setActi
|
|
|
7152
7152
|
// src/viewer/utils/export-pdf.ts
|
|
7153
7153
|
function tilesToPdfPage(tilesResult) {
|
|
7154
7154
|
return tilesResult.tiles.map((tile) => ({
|
|
7155
|
-
image:
|
|
7156
|
-
placement:
|
|
7155
|
+
image: chunkPABSSYRA_js.canvasToJpegData(tile.canvas),
|
|
7156
|
+
placement: chunkPABSSYRA_js.placeTileOnPage(
|
|
7157
7157
|
tile,
|
|
7158
7158
|
tilesResult.fullWidth,
|
|
7159
7159
|
tilesResult.fullHeight,
|
|
7160
|
-
|
|
7161
|
-
|
|
7160
|
+
chunkPABSSYRA_js.PDF_SLIDES_PAGE_WIDTH_PT,
|
|
7161
|
+
chunkPABSSYRA_js.PDF_SLIDES_PAGE_HEIGHT_PT
|
|
7162
7162
|
)
|
|
7163
7163
|
}));
|
|
7164
7164
|
}
|
|
@@ -7185,8 +7185,8 @@ async function exportAllSlidesAsPdf(slideStageRef, totalSlides, setActiveSlide,
|
|
|
7185
7185
|
if (pages.length === 0) {
|
|
7186
7186
|
throw new Error(chunk3AJ54EAB_js.translationsEn["pptx.export.errorNoSlidesPdf"]);
|
|
7187
7187
|
}
|
|
7188
|
-
const pdfBlobUrl =
|
|
7189
|
-
|
|
7188
|
+
const pdfBlobUrl = chunkNMSZ3NSG_js.buildPdfFromTiledImageData(pages);
|
|
7189
|
+
chunkPABSSYRA_js.downloadDataUrl(pdfBlobUrl, filename);
|
|
7190
7190
|
}
|
|
7191
7191
|
async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, slideNotes, filename = "presentation-notes.pdf", options = {}) {
|
|
7192
7192
|
const { scale = 2, onProgress, signal } = options;
|
|
@@ -7215,8 +7215,8 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
|
|
|
7215
7215
|
if (pages.length === 0) {
|
|
7216
7216
|
throw new Error(chunk3AJ54EAB_js.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
|
|
7217
7217
|
}
|
|
7218
|
-
const pdfDataUrl =
|
|
7219
|
-
|
|
7218
|
+
const pdfDataUrl = chunkNMSZ3NSG_js.buildNotesPdf(pages);
|
|
7219
|
+
chunkPABSSYRA_js.downloadDataUrl(pdfDataUrl, filename);
|
|
7220
7220
|
}
|
|
7221
7221
|
|
|
7222
7222
|
// src/viewer/utils/export-video.ts
|
|
@@ -7260,7 +7260,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
7260
7260
|
const fps = 30;
|
|
7261
7261
|
const stream = recordingCanvas.captureStream(fps);
|
|
7262
7262
|
const recorder = new MediaRecorder(stream, {
|
|
7263
|
-
mimeType:
|
|
7263
|
+
mimeType: chunkPABSSYRA_js.pickSupportedMimeType([...chunkPABSSYRA_js.WEBM_MIME_CANDIDATES]),
|
|
7264
7264
|
videoBitsPerSecond: 5e6
|
|
7265
7265
|
});
|
|
7266
7266
|
const chunks = [];
|
|
@@ -7283,8 +7283,8 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
7283
7283
|
const duration = slideTimingsMs?.[i] ?? slideDurationMs;
|
|
7284
7284
|
ctx.clearRect(0, 0, recordingCanvas.width, recordingCanvas.height);
|
|
7285
7285
|
ctx.drawImage(slideCanvases[i], 0, 0);
|
|
7286
|
-
const frameInterval =
|
|
7287
|
-
const framesNeeded =
|
|
7286
|
+
const frameInterval = chunkPABSSYRA_js.fpsToFrameIntervalMs(fps);
|
|
7287
|
+
const framesNeeded = chunkPABSSYRA_js.segmentFrameCount(duration, fps);
|
|
7288
7288
|
for (let f = 0; f < framesNeeded; f++) {
|
|
7289
7289
|
if (signal?.aborted) {
|
|
7290
7290
|
recorder.stop();
|
|
@@ -7304,7 +7304,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
7304
7304
|
|
|
7305
7305
|
// src/viewer/utils/export-gif.ts
|
|
7306
7306
|
function frameFromCanvas(canvas, maxSide) {
|
|
7307
|
-
const { width, height } =
|
|
7307
|
+
const { width, height } = chunkPABSSYRA_js.clampGifDimensions(canvas.width, canvas.height, maxSide);
|
|
7308
7308
|
let source = canvas;
|
|
7309
7309
|
if (width !== canvas.width || height !== canvas.height) {
|
|
7310
7310
|
const scaled = canvas.ownerDocument.createElement("canvas");
|
|
@@ -7327,7 +7327,7 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
|
|
|
7327
7327
|
const {
|
|
7328
7328
|
scale = 0.5,
|
|
7329
7329
|
slideDurationMs = 2e3,
|
|
7330
|
-
maxSide =
|
|
7330
|
+
maxSide = chunkPABSSYRA_js.GIF_POST_CAPTURE_MAX_SIDE,
|
|
7331
7331
|
onProgress,
|
|
7332
7332
|
signal
|
|
7333
7333
|
} = options;
|
|
@@ -7354,7 +7354,7 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
|
|
|
7354
7354
|
if (frames.length === 0) {
|
|
7355
7355
|
throw new Error(chunk3AJ54EAB_js.translationsEn["pptx.export.errorNoSlidesGif"]);
|
|
7356
7356
|
}
|
|
7357
|
-
const gifBytes =
|
|
7357
|
+
const gifBytes = chunkPABSSYRA_js.encodeGif(frames, Math.round(slideDurationMs / 10));
|
|
7358
7358
|
onProgress?.(totalSlides, totalSlides);
|
|
7359
7359
|
const buf = new ArrayBuffer(gifBytes.length);
|
|
7360
7360
|
new Uint8Array(buf).set(gifBytes);
|
|
@@ -7408,7 +7408,7 @@ function exportAllSlidesToSvg(data, options = {}) {
|
|
|
7408
7408
|
continue;
|
|
7409
7409
|
}
|
|
7410
7410
|
onProgress?.(processedCount, data.slides.length);
|
|
7411
|
-
let svg =
|
|
7411
|
+
let svg = chunkPABSSYRA_js.SvgExporter.exportSlide(slide, data.width, data.height, svgOptions);
|
|
7412
7412
|
if (embedFonts && fontFaces?.length) {
|
|
7413
7413
|
svg = injectFontFaces(svg, fontFaces);
|
|
7414
7414
|
}
|
|
@@ -7460,7 +7460,7 @@ function useExportMediaHandlers(input) {
|
|
|
7460
7460
|
setExportProgress(0);
|
|
7461
7461
|
setExportModalOpen(true);
|
|
7462
7462
|
try {
|
|
7463
|
-
const { scale } =
|
|
7463
|
+
const { scale } = chunkPABSSYRA_js.resolveExportCaptureDecision(imageResolutionScale, "video");
|
|
7464
7464
|
const blob = await exportAllSlidesAsVideo(
|
|
7465
7465
|
canvasStageRef,
|
|
7466
7466
|
slides.length,
|
|
@@ -7470,22 +7470,22 @@ function useExportMediaHandlers(input) {
|
|
|
7470
7470
|
scale,
|
|
7471
7471
|
slideDurationMs: 3e3,
|
|
7472
7472
|
onProgress: (current, total) => {
|
|
7473
|
-
setExportProgress(
|
|
7474
|
-
setExportStatusMessage(
|
|
7473
|
+
setExportProgress(chunkPABSSYRA_js.slideProgressPercent(current, total, 45));
|
|
7474
|
+
setExportStatusMessage(chunkPABSSYRA_js.slideStatusLabel("Capturing", current, total));
|
|
7475
7475
|
},
|
|
7476
7476
|
onRecordProgress: (current, total) => {
|
|
7477
|
-
setExportProgress(
|
|
7478
|
-
setExportStatusMessage(
|
|
7477
|
+
setExportProgress(chunkPABSSYRA_js.recordProgressPercent(current, total));
|
|
7478
|
+
setExportStatusMessage(chunkPABSSYRA_js.slideStatusLabel("Recording", current, total));
|
|
7479
7479
|
},
|
|
7480
7480
|
signal: abortCtrl.signal
|
|
7481
7481
|
}
|
|
7482
7482
|
);
|
|
7483
|
-
setExportProgress(
|
|
7483
|
+
setExportProgress(chunkPABSSYRA_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7484
7484
|
setExportStatusMessage("Saving file...");
|
|
7485
|
-
|
|
7486
|
-
setExportProgress(
|
|
7485
|
+
chunkPABSSYRA_js.downloadBlob(blob, "presentation.webm");
|
|
7486
|
+
setExportProgress(chunkPABSSYRA_js.EXPORT_DONE_PERCENT);
|
|
7487
7487
|
} catch (err) {
|
|
7488
|
-
if (!
|
|
7488
|
+
if (!chunkPABSSYRA_js.isExportAbortError(err)) {
|
|
7489
7489
|
console.error("[PowerPointViewer] Video export failed:", err);
|
|
7490
7490
|
}
|
|
7491
7491
|
} finally {
|
|
@@ -7515,7 +7515,7 @@ function useExportMediaHandlers(input) {
|
|
|
7515
7515
|
setExportProgress(0);
|
|
7516
7516
|
setExportModalOpen(true);
|
|
7517
7517
|
try {
|
|
7518
|
-
const { scale, postCaptureMaxSide } =
|
|
7518
|
+
const { scale, postCaptureMaxSide } = chunkPABSSYRA_js.resolveExportCaptureDecision(
|
|
7519
7519
|
imageResolutionScale,
|
|
7520
7520
|
"gif"
|
|
7521
7521
|
);
|
|
@@ -7529,18 +7529,18 @@ function useExportMediaHandlers(input) {
|
|
|
7529
7529
|
maxSide: postCaptureMaxSide,
|
|
7530
7530
|
slideDurationMs: 2e3,
|
|
7531
7531
|
onProgress: (current, total) => {
|
|
7532
|
-
setExportProgress(
|
|
7533
|
-
setExportStatusMessage(
|
|
7532
|
+
setExportProgress(chunkPABSSYRA_js.slideProgressPercent(current, total));
|
|
7533
|
+
setExportStatusMessage(chunkPABSSYRA_js.slideStatusLabel("Encoding", current, total));
|
|
7534
7534
|
},
|
|
7535
7535
|
signal: abortCtrl.signal
|
|
7536
7536
|
}
|
|
7537
7537
|
);
|
|
7538
|
-
setExportProgress(
|
|
7538
|
+
setExportProgress(chunkPABSSYRA_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7539
7539
|
setExportStatusMessage("Saving file...");
|
|
7540
|
-
|
|
7541
|
-
setExportProgress(
|
|
7540
|
+
chunkPABSSYRA_js.downloadBlob(blob, "presentation.gif");
|
|
7541
|
+
setExportProgress(chunkPABSSYRA_js.EXPORT_DONE_PERCENT);
|
|
7542
7542
|
} catch (err) {
|
|
7543
|
-
if (!
|
|
7543
|
+
if (!chunkPABSSYRA_js.isExportAbortError(err)) {
|
|
7544
7544
|
console.error("[PowerPointViewer] GIF export failed:", err);
|
|
7545
7545
|
}
|
|
7546
7546
|
} finally {
|
|
@@ -7666,21 +7666,21 @@ function useExportHandlers(input) {
|
|
|
7666
7666
|
{
|
|
7667
7667
|
scale: imageExportScale,
|
|
7668
7668
|
onProgress: (current, total) => {
|
|
7669
|
-
setExportProgress(
|
|
7670
|
-
setExportStatusMessage(
|
|
7669
|
+
setExportProgress(chunkPABSSYRA_js.slideProgressPercent(current, total));
|
|
7670
|
+
setExportStatusMessage(chunkPABSSYRA_js.slideStatusLabel("Rendering", current, total));
|
|
7671
7671
|
},
|
|
7672
7672
|
signal: abortCtrl.signal
|
|
7673
7673
|
}
|
|
7674
7674
|
);
|
|
7675
|
-
setExportProgress(
|
|
7675
|
+
setExportProgress(chunkPABSSYRA_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7676
7676
|
setExportStatusMessage("Building PDF...");
|
|
7677
7677
|
await new Promise((r) => {
|
|
7678
7678
|
setTimeout(r, 100);
|
|
7679
7679
|
});
|
|
7680
|
-
setExportProgress(
|
|
7680
|
+
setExportProgress(chunkPABSSYRA_js.EXPORT_DONE_PERCENT);
|
|
7681
7681
|
setExportStatusMessage("Done!");
|
|
7682
7682
|
} catch (err) {
|
|
7683
|
-
if (!
|
|
7683
|
+
if (!chunkPABSSYRA_js.isExportAbortError(err)) {
|
|
7684
7684
|
console.error("[PowerPointViewer] PDF export failed:", err);
|
|
7685
7685
|
}
|
|
7686
7686
|
} finally {
|
|
@@ -7710,21 +7710,21 @@ function useExportHandlers(input) {
|
|
|
7710
7710
|
{
|
|
7711
7711
|
scale: imageExportScale,
|
|
7712
7712
|
onProgress: (current, total) => {
|
|
7713
|
-
setExportProgress(
|
|
7714
|
-
setExportStatusMessage(
|
|
7713
|
+
setExportProgress(chunkPABSSYRA_js.slideProgressPercent(current, total));
|
|
7714
|
+
setExportStatusMessage(chunkPABSSYRA_js.slideStatusLabel("Rendering", current, total));
|
|
7715
7715
|
},
|
|
7716
7716
|
signal: abortCtrl.signal
|
|
7717
7717
|
}
|
|
7718
7718
|
);
|
|
7719
|
-
setExportProgress(
|
|
7719
|
+
setExportProgress(chunkPABSSYRA_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7720
7720
|
setExportStatusMessage("Building PDF...");
|
|
7721
7721
|
await new Promise((r) => {
|
|
7722
7722
|
setTimeout(r, 100);
|
|
7723
7723
|
});
|
|
7724
|
-
setExportProgress(
|
|
7724
|
+
setExportProgress(chunkPABSSYRA_js.EXPORT_DONE_PERCENT);
|
|
7725
7725
|
setExportStatusMessage("Done!");
|
|
7726
7726
|
} catch (err) {
|
|
7727
|
-
if (!
|
|
7727
|
+
if (!chunkPABSSYRA_js.isExportAbortError(err)) {
|
|
7728
7728
|
console.error("[PowerPointViewer] Notes PDF export failed:", err);
|
|
7729
7729
|
}
|
|
7730
7730
|
} finally {
|
|
@@ -7772,7 +7772,7 @@ function useExportHandlers(input) {
|
|
|
7772
7772
|
exportStatusMessage
|
|
7773
7773
|
};
|
|
7774
7774
|
}
|
|
7775
|
-
var ViewerOptionsContext = react.createContext(
|
|
7775
|
+
var ViewerOptionsContext = react.createContext(chunkPABSSYRA_js.DEFAULT_VIEWER_OPTIONS);
|
|
7776
7776
|
function useViewerOptionsContext() {
|
|
7777
7777
|
return react.useContext(ViewerOptionsContext);
|
|
7778
7778
|
}
|
|
@@ -7784,13 +7784,13 @@ function usePrintHandlers(input) {
|
|
|
7784
7784
|
const { t } = reactI18next.useTranslation();
|
|
7785
7785
|
const viewerOptions = useViewerOptionsContext();
|
|
7786
7786
|
const includeHiddenSlides = viewerOptions.advanced.printHiddenSlides;
|
|
7787
|
-
const printRasterScale = (viewerOptions.advanced.printHighQuality ? 4 : 3) *
|
|
7787
|
+
const printRasterScale = (viewerOptions.advanced.printHighQuality ? 4 : 3) * chunkPABSSYRA_js.resolveImageResolutionScale(viewerOptions);
|
|
7788
7788
|
const handlePrint = () => {
|
|
7789
7789
|
setIsPrintDialogOpen(true);
|
|
7790
7790
|
};
|
|
7791
7791
|
const handlePrintSvg = async (settings) => {
|
|
7792
7792
|
setIsPrintDialogOpen(false);
|
|
7793
|
-
const printWindow =
|
|
7793
|
+
const printWindow = chunkPABSSYRA_js.openPendingPrintWindow(t("pptx.print.preparingToPrint"));
|
|
7794
7794
|
if (!printWindow) {
|
|
7795
7795
|
console.warn(
|
|
7796
7796
|
"[PowerPointViewer] Print window was blocked by the browser. Allow popups for this site to print."
|
|
@@ -7800,9 +7800,9 @@ function usePrintHandlers(input) {
|
|
|
7800
7800
|
if (!pptxData || settings.printWhat !== "slides") {
|
|
7801
7801
|
return runRasterPrint(printWindow, settings);
|
|
7802
7802
|
}
|
|
7803
|
-
const colorFilter =
|
|
7804
|
-
const slideIndices =
|
|
7805
|
-
|
|
7803
|
+
const colorFilter = chunkPABSSYRA_js.computeColorFilter(settings.colorMode);
|
|
7804
|
+
const slideIndices = chunkPABSSYRA_js.filterHiddenSlideIndices(
|
|
7805
|
+
chunkPABSSYRA_js.computeSlideIndices(
|
|
7806
7806
|
settings.slideRange,
|
|
7807
7807
|
activeSlideIndex,
|
|
7808
7808
|
slides.length,
|
|
@@ -7820,22 +7820,22 @@ function usePrintHandlers(input) {
|
|
|
7820
7820
|
printWindow.close();
|
|
7821
7821
|
return;
|
|
7822
7822
|
}
|
|
7823
|
-
const printDoc =
|
|
7823
|
+
const printDoc = chunkPABSSYRA_js.buildPrintDocument(svgs, pptxData.width, pptxData.height, {
|
|
7824
7824
|
title: "Slides (Vector)",
|
|
7825
7825
|
orientation: settings.orientation,
|
|
7826
7826
|
colorFilter,
|
|
7827
7827
|
scaleToFit: settings.scaleToFit
|
|
7828
7828
|
});
|
|
7829
|
-
|
|
7829
|
+
chunkPABSSYRA_js.finishPrintWindow(printWindow, printDoc);
|
|
7830
7830
|
} catch (err) {
|
|
7831
7831
|
console.warn("[PowerPointViewer] SVG print path failed, falling back to raster:", err);
|
|
7832
7832
|
return runRasterPrint(printWindow, settings);
|
|
7833
7833
|
}
|
|
7834
7834
|
};
|
|
7835
7835
|
const runRasterPrint = async (printWindow, settings) => {
|
|
7836
|
-
const colorFilter =
|
|
7837
|
-
const slideIndices =
|
|
7838
|
-
|
|
7836
|
+
const colorFilter = chunkPABSSYRA_js.computeColorFilter(settings.colorMode);
|
|
7837
|
+
const slideIndices = chunkPABSSYRA_js.filterHiddenSlideIndices(
|
|
7838
|
+
chunkPABSSYRA_js.computeSlideIndices(
|
|
7839
7839
|
settings.slideRange,
|
|
7840
7840
|
activeSlideIndex,
|
|
7841
7841
|
slides.length,
|
|
@@ -7846,11 +7846,11 @@ function usePrintHandlers(input) {
|
|
|
7846
7846
|
includeHiddenSlides
|
|
7847
7847
|
);
|
|
7848
7848
|
if (settings.printWhat === "outline") {
|
|
7849
|
-
|
|
7849
|
+
chunkPABSSYRA_js.finishPrintWindow(
|
|
7850
7850
|
printWindow,
|
|
7851
|
-
|
|
7851
|
+
chunkPABSSYRA_js.buildPrintHtmlDocument({
|
|
7852
7852
|
title: "Outline",
|
|
7853
|
-
bodyHtml: `<div class="outline-page">${
|
|
7853
|
+
bodyHtml: `<div class="outline-page">${chunkPABSSYRA_js.buildOutlineHtml(slideIndices, slides)}</div>`,
|
|
7854
7854
|
orientation: settings.orientation,
|
|
7855
7855
|
colorFilter,
|
|
7856
7856
|
frameSlides: settings.frameSlides,
|
|
@@ -7877,11 +7877,11 @@ function usePrintHandlers(input) {
|
|
|
7877
7877
|
}
|
|
7878
7878
|
const slideImages = slideIndices.map((idx) => allImages[idx]).filter(Boolean);
|
|
7879
7879
|
if (settings.printWhat === "slides") {
|
|
7880
|
-
|
|
7880
|
+
chunkPABSSYRA_js.finishPrintWindow(
|
|
7881
7881
|
printWindow,
|
|
7882
|
-
|
|
7882
|
+
chunkPABSSYRA_js.buildPrintHtmlDocument({
|
|
7883
7883
|
title: "Slides",
|
|
7884
|
-
bodyHtml:
|
|
7884
|
+
bodyHtml: chunkPABSSYRA_js.buildSlidesHtml(slideImages, slideIndices),
|
|
7885
7885
|
orientation: settings.orientation,
|
|
7886
7886
|
colorFilter,
|
|
7887
7887
|
frameSlides: settings.frameSlides,
|
|
@@ -7891,11 +7891,11 @@ function usePrintHandlers(input) {
|
|
|
7891
7891
|
return;
|
|
7892
7892
|
}
|
|
7893
7893
|
if (settings.printWhat === "notes") {
|
|
7894
|
-
|
|
7894
|
+
chunkPABSSYRA_js.finishPrintWindow(
|
|
7895
7895
|
printWindow,
|
|
7896
|
-
|
|
7896
|
+
chunkPABSSYRA_js.buildPrintHtmlDocument({
|
|
7897
7897
|
title: "Notes Pages",
|
|
7898
|
-
bodyHtml:
|
|
7898
|
+
bodyHtml: chunkPABSSYRA_js.buildNotesHtml(slideImages, slideIndices, slides),
|
|
7899
7899
|
orientation: "portrait",
|
|
7900
7900
|
colorFilter,
|
|
7901
7901
|
frameSlides: settings.frameSlides,
|
|
@@ -7906,11 +7906,11 @@ function usePrintHandlers(input) {
|
|
|
7906
7906
|
}
|
|
7907
7907
|
if (settings.printWhat === "handouts") {
|
|
7908
7908
|
const spp = settings.slidesPerPage;
|
|
7909
|
-
|
|
7909
|
+
chunkPABSSYRA_js.finishPrintWindow(
|
|
7910
7910
|
printWindow,
|
|
7911
|
-
|
|
7911
|
+
chunkPABSSYRA_js.buildPrintHtmlDocument({
|
|
7912
7912
|
title: `Handout ${spp} per page`,
|
|
7913
|
-
bodyHtml:
|
|
7913
|
+
bodyHtml: chunkPABSSYRA_js.buildHandoutsHtml(slideImages, slideIndices, spp, pptxData?.handoutMaster),
|
|
7914
7914
|
orientation: "portrait",
|
|
7915
7915
|
colorFilter,
|
|
7916
7916
|
frameSlides: settings.frameSlides,
|
|
@@ -7924,7 +7924,7 @@ function usePrintHandlers(input) {
|
|
|
7924
7924
|
};
|
|
7925
7925
|
const handlePrintWithSettings = async (settings) => {
|
|
7926
7926
|
setIsPrintDialogOpen(false);
|
|
7927
|
-
const printWindow =
|
|
7927
|
+
const printWindow = chunkPABSSYRA_js.openPendingPrintWindow(t("pptx.print.preparingToPrint"));
|
|
7928
7928
|
if (!printWindow) {
|
|
7929
7929
|
console.warn(
|
|
7930
7930
|
"[PowerPointViewer] Print window was blocked by the browser. Allow popups for this site to print."
|
|
@@ -7989,13 +7989,13 @@ function useThemeHandlers(input) {
|
|
|
7989
7989
|
return;
|
|
7990
7990
|
}
|
|
7991
7991
|
await handler.updateThemeColorScheme(colorScheme);
|
|
7992
|
-
const previousMap = theme?.colorScheme ?
|
|
7993
|
-
setSlides((prev) =>
|
|
7992
|
+
const previousMap = theme?.colorScheme ? chunkPABSSYRA_js.buildThemeColorMap(theme.colorScheme) : {};
|
|
7993
|
+
setSlides((prev) => chunkPABSSYRA_js.reResolveSlideColors(prev, previousMap, colorScheme));
|
|
7994
7994
|
if (Object.keys(templateElementsBySlideId).length > 0) {
|
|
7995
7995
|
setTemplateElementsBySlideId((prev) => {
|
|
7996
7996
|
const next = {};
|
|
7997
7997
|
for (const [slideId, elements] of Object.entries(prev)) {
|
|
7998
|
-
next[slideId] =
|
|
7998
|
+
next[slideId] = chunkPABSSYRA_js.reResolveElementColors(elements, previousMap, colorScheme);
|
|
7999
7999
|
}
|
|
8000
8000
|
return next;
|
|
8001
8001
|
});
|
|
@@ -8104,7 +8104,7 @@ function useThemeSwitching(input) {
|
|
|
8104
8104
|
}
|
|
8105
8105
|
try {
|
|
8106
8106
|
await handler.applyTheme(preset.colorScheme, preset.fontScheme, preset.name);
|
|
8107
|
-
const newData =
|
|
8107
|
+
const newData = chunkPABSSYRA_js.applyThemeToData(data, preset.colorScheme, preset.fontScheme, preset.name);
|
|
8108
8108
|
onDataChange(newData);
|
|
8109
8109
|
onThemeChanged?.(preset);
|
|
8110
8110
|
} catch (error) {
|
|
@@ -8121,7 +8121,7 @@ function useThemeSwitching(input) {
|
|
|
8121
8121
|
}
|
|
8122
8122
|
try {
|
|
8123
8123
|
await handler.applyTheme(colorScheme, fontScheme ?? {}, themeName);
|
|
8124
|
-
const newData =
|
|
8124
|
+
const newData = chunkPABSSYRA_js.applyThemeToData(data, colorScheme, fontScheme, themeName);
|
|
8125
8125
|
onDataChange(newData);
|
|
8126
8126
|
} catch (error) {
|
|
8127
8127
|
console.error("Failed to switch to custom theme:", error);
|
|
@@ -8133,12 +8133,12 @@ function useThemeSwitching(input) {
|
|
|
8133
8133
|
if (!data?.theme?.colorScheme) {
|
|
8134
8134
|
return void 0;
|
|
8135
8135
|
}
|
|
8136
|
-
return
|
|
8137
|
-
(p) =>
|
|
8136
|
+
return chunkPABSSYRA_js.THEME_PRESETS.find(
|
|
8137
|
+
(p) => chunkPABSSYRA_js.themeColorSchemesEqual(data.theme?.colorScheme, p.colorScheme)
|
|
8138
8138
|
);
|
|
8139
8139
|
}, [data?.theme?.colorScheme]);
|
|
8140
8140
|
return {
|
|
8141
|
-
presets:
|
|
8141
|
+
presets: chunkPABSSYRA_js.THEME_PRESETS,
|
|
8142
8142
|
switchToPreset,
|
|
8143
8143
|
switchToCustom,
|
|
8144
8144
|
currentPreset
|
|
@@ -8213,7 +8213,7 @@ function usePropertyHandlers(input) {
|
|
|
8213
8213
|
}
|
|
8214
8214
|
try {
|
|
8215
8215
|
const ab = await file.arrayBuffer();
|
|
8216
|
-
const h = new
|
|
8216
|
+
const h = new chunkPABSSYRA_js.PptxHandler();
|
|
8217
8217
|
const other = await h.load(ab);
|
|
8218
8218
|
if (!other) {
|
|
8219
8219
|
return;
|
|
@@ -8223,7 +8223,7 @@ function usePropertyHandlers(input) {
|
|
|
8223
8223
|
width: canvasSize.width,
|
|
8224
8224
|
height: canvasSize.height
|
|
8225
8225
|
};
|
|
8226
|
-
setCompareResult(
|
|
8226
|
+
setCompareResult(chunkPABSSYRA_js.comparePresentation(cur, other));
|
|
8227
8227
|
setIsComparePanelOpen(true);
|
|
8228
8228
|
} catch (err) {
|
|
8229
8229
|
console.warn("Compare failed:", err);
|
|
@@ -8240,7 +8240,7 @@ function usePropertyHandlers(input) {
|
|
|
8240
8240
|
if (!diff || diff.status === "unchanged") {
|
|
8241
8241
|
return;
|
|
8242
8242
|
}
|
|
8243
|
-
setSlides((prev) =>
|
|
8243
|
+
setSlides((prev) => chunkPABSSYRA_js.applyAcceptSlide(prev, diff));
|
|
8244
8244
|
setIsDirty(true);
|
|
8245
8245
|
},
|
|
8246
8246
|
[compareResult, setSlides, setIsDirty]
|
|
@@ -8251,10 +8251,10 @@ function usePropertyHandlers(input) {
|
|
|
8251
8251
|
if (!compareResult) {
|
|
8252
8252
|
return;
|
|
8253
8253
|
}
|
|
8254
|
-
setSlides((prev) =>
|
|
8254
|
+
setSlides((prev) => chunkPABSSYRA_js.applyAcceptAllSlides(prev, compareResult));
|
|
8255
8255
|
setIsDirty(true);
|
|
8256
8256
|
}, [compareResult, setSlides, setIsDirty]);
|
|
8257
|
-
const usedFontFamilies = react.useMemo(() =>
|
|
8257
|
+
const usedFontFamilies = react.useMemo(() => chunkPABSSYRA_js.collectUsedFonts(slides), [slides]);
|
|
8258
8258
|
return {
|
|
8259
8259
|
handleUpdateNotes,
|
|
8260
8260
|
handleUpdateSlide,
|
|
@@ -8409,7 +8409,7 @@ function useViewerDialogs(input) {
|
|
|
8409
8409
|
);
|
|
8410
8410
|
const embeddedFontKey = (embeddedFontFamilies ?? []).join("\0");
|
|
8411
8411
|
const fontEmbedding = react.useMemo(
|
|
8412
|
-
() =>
|
|
8412
|
+
() => chunkPABSSYRA_js.describeFontEmbedding(embeddedFontKey ? embeddedFontKey.split("\0") : []),
|
|
8413
8413
|
[embeddedFontKey]
|
|
8414
8414
|
);
|
|
8415
8415
|
const [embedFontsEnabled, setEmbedFontsEnabled] = react.useState(fontEmbedding.initialEnabled);
|
|
@@ -8419,11 +8419,11 @@ function useViewerDialogs(input) {
|
|
|
8419
8419
|
setEmbedFontsEnabled(fontEmbedding.initialEnabled);
|
|
8420
8420
|
}
|
|
8421
8421
|
const [isNarrowViewport, setIsNarrowViewport] = react.useState(
|
|
8422
|
-
() => typeof window !== "undefined" ?
|
|
8422
|
+
() => typeof window !== "undefined" ? chunkPABSSYRA_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch()) : false
|
|
8423
8423
|
);
|
|
8424
8424
|
react.useEffect(() => {
|
|
8425
8425
|
const handleWindow = () => setIsNarrowViewport(
|
|
8426
|
-
|
|
8426
|
+
chunkPABSSYRA_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch())
|
|
8427
8427
|
);
|
|
8428
8428
|
window.addEventListener("resize", handleWindow);
|
|
8429
8429
|
return () => window.removeEventListener("resize", handleWindow);
|
|
@@ -8576,16 +8576,16 @@ function useViewerDialogs(input) {
|
|
|
8576
8576
|
};
|
|
8577
8577
|
}
|
|
8578
8578
|
function computeGridSpacingPx2(documentGridSpacing) {
|
|
8579
|
-
return
|
|
8579
|
+
return chunkPABSSYRA_js.computeGridSpacingPx(documentGridSpacing, chunkNMSZ3NSG_js.GRID_SIZE);
|
|
8580
8580
|
}
|
|
8581
8581
|
function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows, presentationProperties) {
|
|
8582
8582
|
const activeShow = activeCustomShowId ? customShows.find((show) => show.id === activeCustomShowId) : void 0;
|
|
8583
|
-
const authoredRange =
|
|
8584
|
-
return
|
|
8583
|
+
const authoredRange = chunkPABSSYRA_js.resolveAuthoredSlideRange(presentationProperties, slides.length);
|
|
8584
|
+
return chunkPABSSYRA_js.resolveShowSlideIndexes(slides, activeShow, authoredRange);
|
|
8585
8585
|
}
|
|
8586
8586
|
function computeSlideSectionGroups(slides, sections) {
|
|
8587
|
-
return
|
|
8588
|
-
id: group.section?.id ?? (sections.length > 0 ?
|
|
8587
|
+
return chunkPABSSYRA_js.groupSlidesBySection(sections, slides).map((group) => ({
|
|
8588
|
+
id: group.section?.id ?? (sections.length > 0 ? chunkNMSZ3NSG_js.UNGROUPED_SECTION_ID : chunkNMSZ3NSG_js.DEFAULT_SECTION_GROUP_ID),
|
|
8589
8589
|
label: group.section?.name ?? (sections.length > 0 ? "Ungrouped Slides" : "Slides"),
|
|
8590
8590
|
slideIndexes: group.slideIndexes,
|
|
8591
8591
|
...group.section?.color !== void 0 ? { color: group.section.color } : {},
|
|
@@ -8597,7 +8597,7 @@ function computeMasterPseudoSlide(mode, activeLayout, activeMaster) {
|
|
|
8597
8597
|
return void 0;
|
|
8598
8598
|
}
|
|
8599
8599
|
const document2 = activeLayout ? { slideMasters: [{ ...activeMaster, layouts: [activeLayout] }] } : { slideMasters: [activeMaster] };
|
|
8600
|
-
return
|
|
8600
|
+
return chunkPABSSYRA_js.masterViewPseudoSlide(document2, {
|
|
8601
8601
|
tab: "slides",
|
|
8602
8602
|
masterIndex: 0,
|
|
8603
8603
|
layoutIndex: activeLayout ? 0 : null
|
|
@@ -8625,15 +8625,15 @@ function useDerivedSlideState(input) {
|
|
|
8625
8625
|
[slides, activeCustomShowId, customShows, presentationProperties]
|
|
8626
8626
|
);
|
|
8627
8627
|
const authoredRange = react.useMemo(
|
|
8628
|
-
() =>
|
|
8628
|
+
() => chunkPABSSYRA_js.resolveAuthoredSlideRange(presentationProperties, slides.length),
|
|
8629
8629
|
[presentationProperties, slides.length]
|
|
8630
8630
|
);
|
|
8631
8631
|
const slideSectionGroups = react.useMemo(
|
|
8632
8632
|
() => computeSlideSectionGroups(slides, sections).map((group) => {
|
|
8633
|
-
if (group.id ===
|
|
8633
|
+
if (group.id === chunkNMSZ3NSG_js.UNGROUPED_SECTION_ID && group.label === "Ungrouped Slides") {
|
|
8634
8634
|
return { ...group, label: t("pptx.slides.ungroupedSlides") };
|
|
8635
8635
|
}
|
|
8636
|
-
if (group.id ===
|
|
8636
|
+
if (group.id === chunkNMSZ3NSG_js.DEFAULT_SECTION_GROUP_ID && group.label === "Slides") {
|
|
8637
8637
|
return { ...group, label: t("pptx.sections.slides") };
|
|
8638
8638
|
}
|
|
8639
8639
|
return group;
|
|
@@ -8734,13 +8734,13 @@ function useAnnotationHandlers(input) {
|
|
|
8734
8734
|
}, [annotations, setMode, setSlides, history]);
|
|
8735
8735
|
const handleSetMode = react.useCallback(
|
|
8736
8736
|
(nextMode) => {
|
|
8737
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8737
|
+
if (mode === "present" && nextMode !== "present" && !chunkPABSSYRA_js.mayLeaveSlideShow()) {
|
|
8738
8738
|
return;
|
|
8739
8739
|
}
|
|
8740
8740
|
if (nextMode === "present") {
|
|
8741
8741
|
presentation.enterPresentMode();
|
|
8742
8742
|
} else if (mode === "present" && annotations.hasAnyAnnotations) {
|
|
8743
|
-
|
|
8743
|
+
chunkPABSSYRA_js.stopAllPersistentAudio();
|
|
8744
8744
|
if (promptKeepInkAnnotations) {
|
|
8745
8745
|
pendingModeAfterAnnotationsRef.current = nextMode;
|
|
8746
8746
|
setShowKeepAnnotationsDialog(true);
|
|
@@ -8750,7 +8750,7 @@ function useAnnotationHandlers(input) {
|
|
|
8750
8750
|
}
|
|
8751
8751
|
} else {
|
|
8752
8752
|
if (mode === "present") {
|
|
8753
|
-
|
|
8753
|
+
chunkPABSSYRA_js.stopAllPersistentAudio();
|
|
8754
8754
|
}
|
|
8755
8755
|
setMode(nextMode);
|
|
8756
8756
|
}
|
|
@@ -8819,13 +8819,13 @@ function useSerialize(input) {
|
|
|
8819
8819
|
let processedSlide = slide;
|
|
8820
8820
|
if (pendingEditId) {
|
|
8821
8821
|
const updatedElements = slide.elements.map((el) => {
|
|
8822
|
-
if (el.id !== pendingEditId || !
|
|
8822
|
+
if (el.id !== pendingEditId || !chunkPABSSYRA_js.hasTextProperties(el)) {
|
|
8823
8823
|
return el;
|
|
8824
8824
|
}
|
|
8825
8825
|
return {
|
|
8826
8826
|
...el,
|
|
8827
8827
|
text: pendingEditText,
|
|
8828
|
-
textSegments:
|
|
8828
|
+
textSegments: chunkPABSSYRA_js.remapTextToSegments(pendingEditText, el.textSegments, el.textStyle)
|
|
8829
8829
|
};
|
|
8830
8830
|
});
|
|
8831
8831
|
if (updatedElements.some((el, i) => el !== slide.elements[i])) {
|
|
@@ -8838,19 +8838,19 @@ function useSerialize(input) {
|
|
|
8838
8838
|
const pptxGuides = guides.map((g) => ({
|
|
8839
8839
|
id: g.id,
|
|
8840
8840
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
8841
|
-
positionEmu:
|
|
8841
|
+
positionEmu: chunkPABSSYRA_js.guidePxToEmu(g.position)
|
|
8842
8842
|
}));
|
|
8843
8843
|
return {
|
|
8844
8844
|
...processedSlide,
|
|
8845
8845
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
8846
8846
|
};
|
|
8847
8847
|
});
|
|
8848
|
-
const slidesToSave =
|
|
8849
|
-
const saveOptions =
|
|
8848
|
+
const slidesToSave = chunkPABSSYRA_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
8849
|
+
const saveOptions = chunkPABSSYRA_js.buildDeckSaveOptions({
|
|
8850
8850
|
// Without this the Slide Size card edited a viewer-only pixel value and
|
|
8851
8851
|
// the saved `p:sldSz` never moved: passing `slideSize` is the only way a
|
|
8852
8852
|
// slide-size edit reaches the file.
|
|
8853
|
-
slideSize:
|
|
8853
|
+
slideSize: chunkPABSSYRA_js.resolveSlideSizeSelection({ current: slideSizeEmu, canvas: canvasSize }).size,
|
|
8854
8854
|
headerFooter,
|
|
8855
8855
|
presentationProperties,
|
|
8856
8856
|
viewProperties,
|
|
@@ -8869,7 +8869,7 @@ function useSerialize(input) {
|
|
|
8869
8869
|
embedFonts,
|
|
8870
8870
|
outputFormat: format
|
|
8871
8871
|
});
|
|
8872
|
-
return
|
|
8872
|
+
return chunkPABSSYRA_js.saveDeckWithPassword(handler, slidesToSave, saveOptions, { password, purpose });
|
|
8873
8873
|
},
|
|
8874
8874
|
[
|
|
8875
8875
|
slides,
|
|
@@ -8910,7 +8910,7 @@ function useRecoveryDetection(input) {
|
|
|
8910
8910
|
const onRestore = input.onRestore;
|
|
8911
8911
|
const openVersionHistory = input.openVersionHistory;
|
|
8912
8912
|
react.useEffect(() => {
|
|
8913
|
-
if (!
|
|
8913
|
+
if (!chunkPABSSYRA_js.shouldProbeAutosaveRecovery({
|
|
8914
8914
|
alreadyChecked: recoveryCheckedRef.current,
|
|
8915
8915
|
filePath,
|
|
8916
8916
|
loading,
|
|
@@ -8922,7 +8922,7 @@ function useRecoveryDetection(input) {
|
|
|
8922
8922
|
}
|
|
8923
8923
|
recoveryCheckedRef.current = true;
|
|
8924
8924
|
void (async () => {
|
|
8925
|
-
const offer = await
|
|
8925
|
+
const offer = await chunkPABSSYRA_js.probeAutosaveRecovery(filePath);
|
|
8926
8926
|
if (!offer) {
|
|
8927
8927
|
return;
|
|
8928
8928
|
}
|
|
@@ -8935,7 +8935,7 @@ function useRecoveryDetection(input) {
|
|
|
8935
8935
|
const record = recordRef.current;
|
|
8936
8936
|
setPrompt(null);
|
|
8937
8937
|
if (record && onRestore) {
|
|
8938
|
-
onRestore(
|
|
8938
|
+
onRestore(chunkPABSSYRA_js.acceptAutosaveRecovery(record));
|
|
8939
8939
|
}
|
|
8940
8940
|
recordRef.current = null;
|
|
8941
8941
|
}, [onRestore]);
|
|
@@ -8944,7 +8944,7 @@ function useRecoveryDetection(input) {
|
|
|
8944
8944
|
setPrompt(null);
|
|
8945
8945
|
recordRef.current = null;
|
|
8946
8946
|
if (record) {
|
|
8947
|
-
void
|
|
8947
|
+
void chunkPABSSYRA_js.discardAutosaveRecovery(record);
|
|
8948
8948
|
}
|
|
8949
8949
|
}, []);
|
|
8950
8950
|
return { prompt, restore, discard };
|
|
@@ -8995,11 +8995,11 @@ function usePresentationSetup(input) {
|
|
|
8995
8995
|
containerRef,
|
|
8996
8996
|
content,
|
|
8997
8997
|
onSetMode: (nextMode) => {
|
|
8998
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8998
|
+
if (mode === "present" && nextMode !== "present" && !chunkPABSSYRA_js.mayLeaveSlideShow()) {
|
|
8999
8999
|
return;
|
|
9000
9000
|
}
|
|
9001
9001
|
if (mode === "present" && nextMode !== "present") {
|
|
9002
|
-
|
|
9002
|
+
chunkPABSSYRA_js.stopAllPersistentAudio();
|
|
9003
9003
|
stopAnimationSound();
|
|
9004
9004
|
const exitHandler = exitModeHandlerRef.current;
|
|
9005
9005
|
if (exitHandler) {
|
|
@@ -9067,10 +9067,10 @@ function usePresentationSetup(input) {
|
|
|
9067
9067
|
onToggleToolbar: () => annotations.setToolbarVisible(!annotations.toolbarVisible),
|
|
9068
9068
|
onToggleSubtitles,
|
|
9069
9069
|
onSaveRehearsalTimings: (timings) => {
|
|
9070
|
-
setSlides((prev) =>
|
|
9070
|
+
setSlides((prev) => chunkPABSSYRA_js.applyRehearsalTimings(prev, timings));
|
|
9071
9071
|
history.markDirty();
|
|
9072
9072
|
},
|
|
9073
|
-
loopContinuously:
|
|
9073
|
+
loopContinuously: chunkPABSSYRA_js.shouldLoopContinuously(presentationProperties),
|
|
9074
9074
|
showWithAnimation: presentationProperties.showWithAnimation,
|
|
9075
9075
|
useTimings: presentationProperties.advanceMode !== "manual",
|
|
9076
9076
|
endWithBlackSlide,
|
|
@@ -9277,7 +9277,7 @@ function useEditorOperations(input) {
|
|
|
9277
9277
|
const { formatPainterActive, setFormatPainterActive, elementLookup } = state;
|
|
9278
9278
|
react.useEffect(() => {
|
|
9279
9279
|
if (formatPainterActive && !prevFormatPainterRef.current && selectedElement) {
|
|
9280
|
-
copiedFormatRef.current =
|
|
9280
|
+
copiedFormatRef.current = chunkPABSSYRA_js.copyFormatFromElement(selectedElement);
|
|
9281
9281
|
} else if (!formatPainterActive) {
|
|
9282
9282
|
copiedFormatRef.current = null;
|
|
9283
9283
|
}
|
|
@@ -9303,12 +9303,12 @@ function useEditorOperations(input) {
|
|
|
9303
9303
|
e.stopPropagation();
|
|
9304
9304
|
const element = elementLookup.get(elementId);
|
|
9305
9305
|
if (element) {
|
|
9306
|
-
const updated =
|
|
9306
|
+
const updated = chunkPABSSYRA_js.applyFormatToElement(element, copiedFormatRef.current);
|
|
9307
9307
|
const updates = {};
|
|
9308
|
-
if (
|
|
9308
|
+
if (chunkPABSSYRA_js.hasShapeProperties(updated)) {
|
|
9309
9309
|
updates.shapeStyle = updated.shapeStyle;
|
|
9310
9310
|
}
|
|
9311
|
-
if (
|
|
9311
|
+
if (chunkPABSSYRA_js.hasTextProperties(updated)) {
|
|
9312
9312
|
updates.textStyle = updated.textStyle;
|
|
9313
9313
|
}
|
|
9314
9314
|
ops.updateElementById(elementId, updates);
|
|
@@ -9494,10 +9494,10 @@ function useFontInjection({ embeddedFonts, slides }) {
|
|
|
9494
9494
|
}
|
|
9495
9495
|
};
|
|
9496
9496
|
}, [embeddedFonts]);
|
|
9497
|
-
const referencedFamilies = react.useMemo(() =>
|
|
9497
|
+
const referencedFamilies = react.useMemo(() => chunkPABSSYRA_js.collectReferencedFontFamilies(slides), [slides]);
|
|
9498
9498
|
react.useEffect(() => {
|
|
9499
9499
|
let cancelled = false;
|
|
9500
|
-
void
|
|
9500
|
+
void chunkPABSSYRA_js.resolveGoogleWebfontHref(slides, embeddedFonts).then((href) => {
|
|
9501
9501
|
if (cancelled) {
|
|
9502
9502
|
return null;
|
|
9503
9503
|
}
|
|
@@ -9522,15 +9522,15 @@ function useFontInjection({ embeddedFonts, slides }) {
|
|
|
9522
9522
|
const [, setOutlineFontsTick] = react.useState(0);
|
|
9523
9523
|
react.useEffect(() => {
|
|
9524
9524
|
let cancelled = false;
|
|
9525
|
-
const referenced =
|
|
9526
|
-
const candidates =
|
|
9525
|
+
const referenced = chunkPABSSYRA_js.collectReferencedFontFamilies(slides);
|
|
9526
|
+
const candidates = chunkPABSSYRA_js.selectGoogleWebfontFamilies(
|
|
9527
9527
|
referenced,
|
|
9528
9528
|
embeddedFonts.map((font) => font.name)
|
|
9529
9529
|
);
|
|
9530
9530
|
if (candidates.length === 0) {
|
|
9531
9531
|
return;
|
|
9532
9532
|
}
|
|
9533
|
-
void
|
|
9533
|
+
void chunkPABSSYRA_js.resolveGoogleWebfontHref(slides, embeddedFonts).then(async (href) => {
|
|
9534
9534
|
if (cancelled || !href) {
|
|
9535
9535
|
return;
|
|
9536
9536
|
}
|
|
@@ -9544,7 +9544,7 @@ function useFontInjection({ embeddedFonts, slides }) {
|
|
|
9544
9544
|
if (cancelled) {
|
|
9545
9545
|
return;
|
|
9546
9546
|
}
|
|
9547
|
-
const bytes = await
|
|
9547
|
+
const bytes = await chunkPABSSYRA_js.fetchGoogleWebfontOutlineBytes(
|
|
9548
9548
|
href,
|
|
9549
9549
|
family,
|
|
9550
9550
|
variant.bold,
|
|
@@ -9733,7 +9733,7 @@ function useKeyboardShortcuts(input) {
|
|
|
9733
9733
|
inputRef.current = input;
|
|
9734
9734
|
const handleKeyDown = react.useCallback((e) => {
|
|
9735
9735
|
const current = inputRef.current;
|
|
9736
|
-
const startAction =
|
|
9736
|
+
const startAction = chunkPABSSYRA_js.mapSlideShowStartKey(e, { isPresenting: current.mode === "present" });
|
|
9737
9737
|
if (startAction !== null) {
|
|
9738
9738
|
e.preventDefault();
|
|
9739
9739
|
if (startAction === "fromBeginning") {
|
|
@@ -9743,7 +9743,7 @@ function useKeyboardShortcuts(input) {
|
|
|
9743
9743
|
}
|
|
9744
9744
|
return;
|
|
9745
9745
|
}
|
|
9746
|
-
const { action, dx, dy } =
|
|
9746
|
+
const { action, dx, dy } = chunkPABSSYRA_js.mapEditorKey(e, {
|
|
9747
9747
|
canEdit: current.canEdit,
|
|
9748
9748
|
// The Slide Master view is an editing surface, not a viewing one.
|
|
9749
9749
|
// Gating on `mode !== 'edit'` alone made `mapEditorKey` return
|
|
@@ -9756,7 +9756,7 @@ function useKeyboardShortcuts(input) {
|
|
|
9756
9756
|
hasSelection: current.hasSelection,
|
|
9757
9757
|
isEditingText: Boolean(current.inlineEditingElementId || current.tableEditorState?.isEditing),
|
|
9758
9758
|
isDrawing: current.activeTool !== "select",
|
|
9759
|
-
isTextInputTarget:
|
|
9759
|
+
isTextInputTarget: chunkPABSSYRA_js.isEditorTextInputTarget(e.target)
|
|
9760
9760
|
});
|
|
9761
9761
|
if (action === null) {
|
|
9762
9762
|
return;
|
|
@@ -10088,7 +10088,7 @@ function useViewerIntegration(input) {
|
|
|
10088
10088
|
return zoom.scale;
|
|
10089
10089
|
},
|
|
10090
10090
|
setZoom(level) {
|
|
10091
|
-
zoom.setScale(
|
|
10091
|
+
zoom.setScale(chunkPABSSYRA_js.clampZoomScale(level));
|
|
10092
10092
|
},
|
|
10093
10093
|
zoomIn() {
|
|
10094
10094
|
zoom.handleZoomIn();
|
|
@@ -10310,7 +10310,7 @@ function useReducedMotion() {
|
|
|
10310
10310
|
}
|
|
10311
10311
|
function useViewerOptions() {
|
|
10312
10312
|
const storeRef = react.useRef(null);
|
|
10313
|
-
storeRef.current ??=
|
|
10313
|
+
storeRef.current ??= chunkPABSSYRA_js.createViewerOptionsStore();
|
|
10314
10314
|
const store = storeRef.current;
|
|
10315
10315
|
const options = react.useSyncExternalStore(
|
|
10316
10316
|
(onStoreChange) => store.subscribe(onStoreChange),
|
|
@@ -10319,9 +10319,9 @@ function useViewerOptions() {
|
|
|
10319
10319
|
);
|
|
10320
10320
|
return { optionsStore: store, options };
|
|
10321
10321
|
}
|
|
10322
|
-
var KNOWN_TAB_IDS = new Set(
|
|
10322
|
+
var KNOWN_TAB_IDS = new Set(chunkPABSSYRA_js.TOOLBAR_TABS.map((tab) => tab.id));
|
|
10323
10323
|
function computeToolbarVisibility(hiddenActions, hiddenTabIds = []) {
|
|
10324
|
-
const isHidden = (id) =>
|
|
10324
|
+
const isHidden = (id) => chunkPABSSYRA_js.isActionHidden(id, hiddenActions);
|
|
10325
10325
|
const userHidden = new Set(hiddenTabIds);
|
|
10326
10326
|
userHidden.delete("file");
|
|
10327
10327
|
const isTabVisible = (id) => !KNOWN_TAB_IDS.has(id) || !isHidden(id) && !userHidden.has(id);
|
|
@@ -10414,12 +10414,12 @@ function useYjsDocumentSync({
|
|
|
10414
10414
|
return;
|
|
10415
10415
|
}
|
|
10416
10416
|
try {
|
|
10417
|
-
const handler = new
|
|
10417
|
+
const handler = new chunkPABSSYRA_js.PptxHandler();
|
|
10418
10418
|
await handler.load(sourceBytes.buffer);
|
|
10419
|
-
const currentSlides =
|
|
10419
|
+
const currentSlides = chunkPABSSYRA_js.readSlidesFromYDoc(
|
|
10420
10420
|
doc
|
|
10421
10421
|
);
|
|
10422
|
-
const slidesToSave =
|
|
10422
|
+
const slidesToSave = chunkPABSSYRA_js.buildSaveSlides(currentSlides, templateElementsBySlideId);
|
|
10423
10423
|
const bytes = await handler.save(slidesToSave, getSaveOptions?.());
|
|
10424
10424
|
config.onWriteBack(bytes);
|
|
10425
10425
|
} catch {
|
|
@@ -10434,10 +10434,10 @@ function useYjsDocumentSync({
|
|
|
10434
10434
|
if (!doc || !isConnected) {
|
|
10435
10435
|
return;
|
|
10436
10436
|
}
|
|
10437
|
-
const docSlides =
|
|
10437
|
+
const docSlides = chunkPABSSYRA_js.readSlidesFromYDoc(
|
|
10438
10438
|
doc
|
|
10439
10439
|
);
|
|
10440
|
-
if (!
|
|
10440
|
+
if (!chunkPABSSYRA_js.shouldRoomSlidesReplaceLoad(loadOrigin, docSlides.length)) {
|
|
10441
10441
|
return;
|
|
10442
10442
|
}
|
|
10443
10443
|
lastSyncedRef.current = JSON.stringify(docSlides);
|
|
@@ -10456,11 +10456,11 @@ function useYjsDocumentSync({
|
|
|
10456
10456
|
lastSyncedRef.current = serialized;
|
|
10457
10457
|
void (async () => {
|
|
10458
10458
|
const factories = await getFactories();
|
|
10459
|
-
|
|
10459
|
+
chunkPABSSYRA_js.reconcileSlidesInYDoc(
|
|
10460
10460
|
slides,
|
|
10461
10461
|
doc,
|
|
10462
10462
|
factories,
|
|
10463
|
-
|
|
10463
|
+
chunkPABSSYRA_js.LOCAL_SYNC_ORIGIN
|
|
10464
10464
|
);
|
|
10465
10465
|
scheduleWriteBack();
|
|
10466
10466
|
})();
|
|
@@ -10474,10 +10474,10 @@ function useYjsDocumentSync({
|
|
|
10474
10474
|
return;
|
|
10475
10475
|
}
|
|
10476
10476
|
const handleChange = (_events, transaction) => {
|
|
10477
|
-
if (transaction?.origin ===
|
|
10477
|
+
if (transaction?.origin === chunkPABSSYRA_js.LOCAL_SYNC_ORIGIN) {
|
|
10478
10478
|
return;
|
|
10479
10479
|
}
|
|
10480
|
-
const remoteSlides =
|
|
10480
|
+
const remoteSlides = chunkPABSSYRA_js.readSlidesFromYDoc(
|
|
10481
10481
|
doc
|
|
10482
10482
|
);
|
|
10483
10483
|
if (remoteSlides.length === 0) {
|
|
@@ -10493,7 +10493,7 @@ function useYjsDocumentSync({
|
|
|
10493
10493
|
isApplyingRemoteRef.current = false;
|
|
10494
10494
|
scheduleWriteBack();
|
|
10495
10495
|
};
|
|
10496
|
-
const unobserve =
|
|
10496
|
+
const unobserve = chunkPABSSYRA_js.observeYDocSlides(
|
|
10497
10497
|
doc,
|
|
10498
10498
|
handleChange
|
|
10499
10499
|
);
|
|
@@ -10531,7 +10531,7 @@ function useBroadcastFollower({
|
|
|
10531
10531
|
if (!broadcaster) {
|
|
10532
10532
|
return;
|
|
10533
10533
|
}
|
|
10534
|
-
if (!
|
|
10534
|
+
if (!chunkPABSSYRA_js.shouldAutoFollowBroadcaster({
|
|
10535
10535
|
localRole: collab.config.role,
|
|
10536
10536
|
broadcasterRole: broadcaster.role
|
|
10537
10537
|
})) {
|
|
@@ -10689,7 +10689,7 @@ function useLayoutSwitching(input) {
|
|
|
10689
10689
|
currentLayoutPath
|
|
10690
10690
|
};
|
|
10691
10691
|
}
|
|
10692
|
-
var MIN_TOUCH_TARGET =
|
|
10692
|
+
var MIN_TOUCH_TARGET = chunkPABSSYRA_js.MIN_TOUCH_TARGET_PX;
|
|
10693
10693
|
function subscribeTouchCapability(callback) {
|
|
10694
10694
|
if (typeof window === "undefined") {
|
|
10695
10695
|
return () => {
|
|
@@ -10702,7 +10702,7 @@ function subscribeTouchCapability(callback) {
|
|
|
10702
10702
|
function useIsMobile() {
|
|
10703
10703
|
const isTouchDevice = react.useSyncExternalStore(
|
|
10704
10704
|
subscribeTouchCapability,
|
|
10705
|
-
|
|
10705
|
+
chunkPABSSYRA_js.detectTouchDevice,
|
|
10706
10706
|
() => false
|
|
10707
10707
|
// server snapshot
|
|
10708
10708
|
);
|
|
@@ -10712,7 +10712,7 @@ function useIsMobile() {
|
|
|
10712
10712
|
const [viewportHeight, setViewportHeight] = react.useState(
|
|
10713
10713
|
() => typeof window === "undefined" ? 768 : window.innerHeight
|
|
10714
10714
|
);
|
|
10715
|
-
const [orientation, setOrientation] = react.useState(
|
|
10715
|
+
const [orientation, setOrientation] = react.useState(chunkPABSSYRA_js.detectOrientation);
|
|
10716
10716
|
const [isVirtualKeyboardOpen, setIsVirtualKeyboardOpen] = react.useState(false);
|
|
10717
10717
|
const [initialViewportHeight] = react.useState(
|
|
10718
10718
|
() => typeof window !== "undefined" ? window.innerHeight : 800
|
|
@@ -10733,7 +10733,7 @@ function useIsMobile() {
|
|
|
10733
10733
|
return;
|
|
10734
10734
|
}
|
|
10735
10735
|
const handleOrientationChange = () => {
|
|
10736
|
-
setOrientation(
|
|
10736
|
+
setOrientation(chunkPABSSYRA_js.detectOrientation());
|
|
10737
10737
|
};
|
|
10738
10738
|
if (screen.orientation) {
|
|
10739
10739
|
screen.orientation.addEventListener("change", handleOrientationChange);
|
|
@@ -10763,7 +10763,7 @@ function useIsMobile() {
|
|
|
10763
10763
|
window.addEventListener("resize", handleResize);
|
|
10764
10764
|
return () => window.removeEventListener("resize", handleResize);
|
|
10765
10765
|
}, [isTouchDevice, initialViewportHeight]);
|
|
10766
|
-
const { isMobile, isTablet, isDesktop } =
|
|
10766
|
+
const { isMobile, isTablet, isDesktop } = chunkPABSSYRA_js.deriveViewportBreakpoints(
|
|
10767
10767
|
viewportWidth,
|
|
10768
10768
|
viewportHeight,
|
|
10769
10769
|
isTouchDevice
|
|
@@ -10796,10 +10796,10 @@ function useTouchGestures(input) {
|
|
|
10796
10796
|
if (!el || !enabled) {
|
|
10797
10797
|
return;
|
|
10798
10798
|
}
|
|
10799
|
-
const recognizer =
|
|
10799
|
+
const recognizer = chunkPABSSYRA_js.createTouchGestureRecognizer({
|
|
10800
10800
|
getScale: () => scaleRef.current,
|
|
10801
|
-
minScale:
|
|
10802
|
-
maxScale:
|
|
10801
|
+
minScale: chunkPABSSYRA_js.MIN_ZOOM_SCALE,
|
|
10802
|
+
maxScale: chunkPABSSYRA_js.MAX_ZOOM_SCALE,
|
|
10803
10803
|
callbacks: {
|
|
10804
10804
|
onPinchZoom: (newScale) => callbacksRef.current.onPinchZoom?.(newScale),
|
|
10805
10805
|
onSwipe: (direction) => callbacksRef.current.onSwipe?.(direction),
|
|
@@ -10839,7 +10839,7 @@ function scrollFocusedIntoView(keyboardInset) {
|
|
|
10839
10839
|
return;
|
|
10840
10840
|
}
|
|
10841
10841
|
const rect = active.getBoundingClientRect();
|
|
10842
|
-
const delta =
|
|
10842
|
+
const delta = chunkPABSSYRA_js.computeScrollDelta(
|
|
10843
10843
|
{ top: rect.top, bottom: rect.bottom },
|
|
10844
10844
|
window.innerHeight,
|
|
10845
10845
|
keyboardInset
|
|
@@ -10859,8 +10859,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10859
10859
|
return;
|
|
10860
10860
|
}
|
|
10861
10861
|
const update = () => {
|
|
10862
|
-
const metrics =
|
|
10863
|
-
const inset = metrics ?
|
|
10862
|
+
const metrics = chunkPABSSYRA_js.readViewportMetrics(window);
|
|
10863
|
+
const inset = metrics ? chunkPABSSYRA_js.computeKeyboardInset(metrics) : 0;
|
|
10864
10864
|
setKeyboardInset(inset);
|
|
10865
10865
|
if (inset > 0) {
|
|
10866
10866
|
window.requestAnimationFrame(() => scrollFocusedIntoView(inset));
|
|
@@ -10871,8 +10871,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10871
10871
|
vv.addEventListener("scroll", update);
|
|
10872
10872
|
const onFocusIn = () => {
|
|
10873
10873
|
window.requestAnimationFrame(() => {
|
|
10874
|
-
const metrics =
|
|
10875
|
-
const inset = metrics ?
|
|
10874
|
+
const metrics = chunkPABSSYRA_js.readViewportMetrics(window);
|
|
10875
|
+
const inset = metrics ? chunkPABSSYRA_js.computeKeyboardInset(metrics) : 0;
|
|
10876
10876
|
if (inset > 0) {
|
|
10877
10877
|
scrollFocusedIntoView(inset);
|
|
10878
10878
|
}
|
|
@@ -10885,7 +10885,7 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10885
10885
|
document.removeEventListener("focusin", onFocusIn);
|
|
10886
10886
|
};
|
|
10887
10887
|
}, [enabled]);
|
|
10888
|
-
return { keyboardInset, isKeyboardOpen:
|
|
10888
|
+
return { keyboardInset, isKeyboardOpen: chunkPABSSYRA_js.isKeyboardOpen(keyboardInset) };
|
|
10889
10889
|
}
|
|
10890
10890
|
|
|
10891
10891
|
// src/viewer/hooks/useViewerBuildingBlocks-canvas-props.ts
|
|
@@ -10914,21 +10914,21 @@ function buildCanvasProps(input) {
|
|
|
10914
10914
|
} = input;
|
|
10915
10915
|
const effectiveSlide = mode === "master" ? masterPseudoSlide : activeSlide;
|
|
10916
10916
|
const effectiveTemplateElements = mode === "master" ? s.activeLayout ? s.activeMaster?.elements ?? [] : [] : templateElements;
|
|
10917
|
-
const fieldContext =
|
|
10917
|
+
const fieldContext = chunkPABSSYRA_js.buildFieldSubstitutionContext({
|
|
10918
10918
|
headerFooter: s.headerFooter,
|
|
10919
10919
|
customProperties: s.customProperties,
|
|
10920
10920
|
slide: activeSlide
|
|
10921
10921
|
});
|
|
10922
10922
|
const tableStyleContext = s.theme || s.tableStyleMap ? { theme: s.theme, tableStyleMap: s.tableStyleMap } : void 0;
|
|
10923
10923
|
const openExternalUrl = (url, target) => {
|
|
10924
|
-
if (
|
|
10924
|
+
if (chunkPABSSYRA_js.shouldConfirmExternalHyperlink(viewerOptions, url) && !window.confirm(buildHyperlinkConfirmMessage(url))) {
|
|
10925
10925
|
return;
|
|
10926
10926
|
}
|
|
10927
|
-
|
|
10927
|
+
chunkPABSSYRA_js.safeOpenUrl(url, target);
|
|
10928
10928
|
};
|
|
10929
10929
|
const handleActionClick = (elementId, action) => {
|
|
10930
10930
|
if (mode === "present") {
|
|
10931
|
-
const resolved =
|
|
10931
|
+
const resolved = chunkPABSSYRA_js.resolvePresentationAction(action, { slideCount: slides.length });
|
|
10932
10932
|
if (resolved.intent.kind === "openUrl") {
|
|
10933
10933
|
openExternalUrl(resolved.intent.url);
|
|
10934
10934
|
return;
|
|
@@ -10939,9 +10939,9 @@ function buildCanvasProps(input) {
|
|
|
10939
10939
|
}
|
|
10940
10940
|
};
|
|
10941
10941
|
const handleHyperlinkClick = (url, target) => {
|
|
10942
|
-
if (
|
|
10942
|
+
if (chunkPABSSYRA_js.isPpactionUrl(url)) {
|
|
10943
10943
|
if (mode === "present") {
|
|
10944
|
-
const parsed =
|
|
10944
|
+
const parsed = chunkPABSSYRA_js.parsePpactionUrl(url);
|
|
10945
10945
|
if (parsed) {
|
|
10946
10946
|
presentation.handlePresentationAction({
|
|
10947
10947
|
action: parsed.action,
|
|
@@ -11047,7 +11047,7 @@ function buildCanvasProps(input) {
|
|
|
11047
11047
|
|
|
11048
11048
|
// src/viewer/hooks/useScopedLayoutOptions.ts
|
|
11049
11049
|
function scopeLayoutOptionsToActiveSlide(options, activeSlide) {
|
|
11050
|
-
return
|
|
11050
|
+
return chunkPABSSYRA_js.scopeLayoutOptionsToSlide(options, activeSlide?.layoutPath);
|
|
11051
11051
|
}
|
|
11052
11052
|
|
|
11053
11053
|
// src/viewer/hooks/useViewerBuildingBlocks-toolbar-handlers.ts
|
|
@@ -11060,7 +11060,7 @@ function buildToolbarAnimationHandlers(input) {
|
|
|
11060
11060
|
const current = activeSlide.animations ?? [];
|
|
11061
11061
|
if (group === "motionPath") {
|
|
11062
11062
|
propertyHandlers.handleUpdateSlide({
|
|
11063
|
-
animations:
|
|
11063
|
+
animations: chunkPABSSYRA_js.applyMotionPathPreset(current, selectedElement.id, preset)
|
|
11064
11064
|
});
|
|
11065
11065
|
return;
|
|
11066
11066
|
}
|
|
@@ -11256,7 +11256,7 @@ function buildToolbarProps(input) {
|
|
|
11256
11256
|
onOpenFile,
|
|
11257
11257
|
onOpenRecentFile,
|
|
11258
11258
|
onCreatePresentation: (templateId) => {
|
|
11259
|
-
s.setSlides(
|
|
11259
|
+
s.setSlides(chunkPABSSYRA_js.createBackstagePresentation(templateId));
|
|
11260
11260
|
s.setActiveSlideIndex(0);
|
|
11261
11261
|
s.setSelectedElementId(null);
|
|
11262
11262
|
s.setSelectedElementIds([]);
|
|
@@ -11286,7 +11286,7 @@ function buildToolbarProps(input) {
|
|
|
11286
11286
|
loadLayoutPreviews: input.loadLayoutPreviews,
|
|
11287
11287
|
onInsertSlideFromLayout: slideOps.handleInsertSlideFromLayout,
|
|
11288
11288
|
onInsertSlideFromTemplate: slideOps.handleInsertSlideFromTemplate,
|
|
11289
|
-
templateScheme:
|
|
11289
|
+
templateScheme: chunkPABSSYRA_js.templateSchemeFromTheme(s.theme?.colorScheme),
|
|
11290
11290
|
customShows: s.customShows,
|
|
11291
11291
|
activeCustomShowId: s.activeCustomShowId,
|
|
11292
11292
|
onSetActiveCustomShowId: s.setActiveCustomShowId,
|
|
@@ -11327,7 +11327,7 @@ function buildToolbarProps(input) {
|
|
|
11327
11327
|
isCommentsPanelOpen: s.isInspectorPaneOpen,
|
|
11328
11328
|
slideCommentCount: activeSlide?.comments?.length ?? 0,
|
|
11329
11329
|
formatPainterActive: s.formatPainterActive,
|
|
11330
|
-
canActivateFormatPainter:
|
|
11330
|
+
canActivateFormatPainter: chunkPABSSYRA_js.hasCopyableFormat(selectedElement),
|
|
11331
11331
|
onToggleFormatPainter: () => s.setFormatPainterActive((p) => !p),
|
|
11332
11332
|
isSelectionPaneOpen: s.isSelectionPaneOpen,
|
|
11333
11333
|
onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
|
|
@@ -11405,7 +11405,7 @@ function useViewerBuildingBlocksCore(input) {
|
|
|
11405
11405
|
headerFooter: state.headerFooter,
|
|
11406
11406
|
loading,
|
|
11407
11407
|
error,
|
|
11408
|
-
maxHistoryEntries:
|
|
11408
|
+
maxHistoryEntries: chunkPABSSYRA_js.resolveHistoryDepth(viewerOptions),
|
|
11409
11409
|
hasActivePointerInteraction,
|
|
11410
11410
|
pointerCommitNonce: state.pointerCommitNonce,
|
|
11411
11411
|
onDirty: markDocumentDirty,
|
|
@@ -11430,7 +11430,7 @@ function useViewerBuildingBlocksCore(input) {
|
|
|
11430
11430
|
documentGridSpacing: state.viewProperties?.gridSpacing
|
|
11431
11431
|
});
|
|
11432
11432
|
const themeColorMap = react.useMemo(
|
|
11433
|
-
() => state.theme?.colorScheme ?
|
|
11433
|
+
() => state.theme?.colorScheme ? chunkPABSSYRA_js.buildThemeColorMap(state.theme.colorScheme) : void 0,
|
|
11434
11434
|
[state.theme?.colorScheme]
|
|
11435
11435
|
);
|
|
11436
11436
|
const { presentation, annotations, actionSoundHandlerRef, setExitModeHandler } = usePresentationSetup({
|
|
@@ -11479,8 +11479,8 @@ function useViewerBuildingBlocksCore(input) {
|
|
|
11479
11479
|
gridSpacingPx,
|
|
11480
11480
|
// Multiplied against the pre-existing 2x baseline; see the matching
|
|
11481
11481
|
// comment in `PowerPointViewer.tsx`.
|
|
11482
|
-
imageExportScale: 2 *
|
|
11483
|
-
imageResolutionScale:
|
|
11482
|
+
imageExportScale: 2 * chunkPABSSYRA_js.resolveImageResolutionScale(viewerOptions),
|
|
11483
|
+
imageResolutionScale: chunkPABSSYRA_js.resolveImageResolutionScale(viewerOptions),
|
|
11484
11484
|
viewerOptions
|
|
11485
11485
|
};
|
|
11486
11486
|
}
|
|
@@ -11496,7 +11496,7 @@ function useCompatibilityToastsState() {
|
|
|
11496
11496
|
}
|
|
11497
11497
|
function useReadOnlyRecommendationState(content) {
|
|
11498
11498
|
const [recommendation, setRecommendation] = react.useState(
|
|
11499
|
-
() =>
|
|
11499
|
+
() => chunkPABSSYRA_js.readOnlyRecommendation(void 0)
|
|
11500
11500
|
);
|
|
11501
11501
|
const [modifyVerifier, setModifyVerifier] = react.useState(void 0);
|
|
11502
11502
|
const [bannerHidden, setBannerHidden] = react.useState(false);
|
|
@@ -11536,7 +11536,7 @@ function useReadOnlyRecommendationState(content) {
|
|
|
11536
11536
|
async (password) => {
|
|
11537
11537
|
setCheckingPassword(true);
|
|
11538
11538
|
try {
|
|
11539
|
-
const result = await
|
|
11539
|
+
const result = await chunkPABSSYRA_js.checkModifyPassword(modifyVerifier, password);
|
|
11540
11540
|
if (result.ok) {
|
|
11541
11541
|
unlock();
|
|
11542
11542
|
} else {
|
|
@@ -11581,9 +11581,9 @@ function useViewPreferencesSync(input) {
|
|
|
11581
11581
|
setShowGuides
|
|
11582
11582
|
} = input;
|
|
11583
11583
|
react.useEffect(() => {
|
|
11584
|
-
const seeded =
|
|
11584
|
+
const seeded = chunkPABSSYRA_js.viewerPreferencesFromViewProperties(
|
|
11585
11585
|
{ viewProperties },
|
|
11586
|
-
{ ...
|
|
11586
|
+
{ ...chunkPABSSYRA_js.DEFAULT_VIEWER_PREFERENCES, snapToGrid, snapToObjects: snapToShape, showGuides }
|
|
11587
11587
|
);
|
|
11588
11588
|
setSnapToGrid(seeded.snapToGrid);
|
|
11589
11589
|
setSnapToShape(seeded.snapToObjects ?? snapToShape);
|
|
@@ -11593,7 +11593,7 @@ function useViewPreferencesSync(input) {
|
|
|
11593
11593
|
(prefsOverride) => {
|
|
11594
11594
|
setViewProperties((prev) => {
|
|
11595
11595
|
const merged = {
|
|
11596
|
-
...
|
|
11596
|
+
...chunkPABSSYRA_js.DEFAULT_VIEWER_PREFERENCES,
|
|
11597
11597
|
snapToGrid,
|
|
11598
11598
|
snapToObjects: snapToShape,
|
|
11599
11599
|
showGuides,
|
|
@@ -11601,7 +11601,7 @@ function useViewPreferencesSync(input) {
|
|
|
11601
11601
|
gridSpacingCy: prev?.gridSpacing?.cy,
|
|
11602
11602
|
...prefsOverride
|
|
11603
11603
|
};
|
|
11604
|
-
const patch =
|
|
11604
|
+
const patch = chunkPABSSYRA_js.viewPropertiesPatchFromPreferences(merged);
|
|
11605
11605
|
return {
|
|
11606
11606
|
...prev,
|
|
11607
11607
|
slideViewPr: { ...prev?.slideViewPr, ...patch.slideViewPr },
|
|
@@ -11822,7 +11822,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
11822
11822
|
}, [incomingContent]);
|
|
11823
11823
|
const onOpenFile = react.useCallback(() => {
|
|
11824
11824
|
void (async () => {
|
|
11825
|
-
const picked = await
|
|
11825
|
+
const picked = await chunkPABSSYRA_js.openPptxFile();
|
|
11826
11826
|
if (picked) {
|
|
11827
11827
|
setContent(picked.buffer);
|
|
11828
11828
|
}
|
|
@@ -11830,7 +11830,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
11830
11830
|
}, []);
|
|
11831
11831
|
const onOpenRecentFile = react.useCallback((key) => {
|
|
11832
11832
|
void (async () => {
|
|
11833
|
-
const bytes = await
|
|
11833
|
+
const bytes = await chunkPABSSYRA_js.readBackstageRecentFile(key);
|
|
11834
11834
|
if (bytes) {
|
|
11835
11835
|
setContent(bytes);
|
|
11836
11836
|
}
|