pptx-react-viewer 3.10.0 → 3.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/dist/{AiChatPanel-NSVSBJC7.js → AiChatPanel-A3ZMMVUA.js} +24 -24
- package/dist/AiChatPanel-A3ZMMVUA.js.br +0 -0
- package/dist/AiChatPanel-A3ZMMVUA.js.gz +0 -0
- package/dist/{AiChatPanel-BQSUE2OO.mjs → AiChatPanel-L5H455NZ.mjs} +3 -3
- package/dist/AiChatPanel-L5H455NZ.mjs.br +0 -0
- package/dist/AiChatPanel-L5H455NZ.mjs.gz +0 -0
- package/dist/{Area3DChartScene-2FQHPGNE.mjs → Area3DChartScene-OAD36KIX.mjs} +1 -1
- package/dist/{Area3DChartScene-2FQHPGNE.mjs.br → Area3DChartScene-OAD36KIX.mjs.br} +0 -0
- package/dist/Area3DChartScene-OAD36KIX.mjs.gz +0 -0
- package/dist/{Area3DChartScene-V3W2V7N5.js → Area3DChartScene-R2CKCYCB.js} +2 -2
- package/dist/{Area3DChartScene-V3W2V7N5.js.br → Area3DChartScene-R2CKCYCB.js.br} +0 -0
- package/dist/Area3DChartScene-R2CKCYCB.js.gz +0 -0
- package/dist/{Bar3DChartScene-55XMAUC7.js → Bar3DChartScene-CRRPMXGQ.js} +2 -2
- package/dist/Bar3DChartScene-CRRPMXGQ.js.br +0 -0
- package/dist/Bar3DChartScene-CRRPMXGQ.js.gz +0 -0
- package/dist/{Bar3DChartScene-PSJEVANA.mjs → Bar3DChartScene-XNNXF26T.mjs} +1 -1
- package/dist/{Bar3DChartScene-PSJEVANA.mjs.br → Bar3DChartScene-XNNXF26T.mjs.br} +0 -0
- package/dist/Bar3DChartScene-XNNXF26T.mjs.gz +0 -0
- package/dist/{Line3DChartScene-5KACYRSQ.js → Line3DChartScene-44PLZML2.js} +2 -2
- package/dist/Line3DChartScene-44PLZML2.js.br +0 -0
- package/dist/Line3DChartScene-44PLZML2.js.gz +0 -0
- package/dist/{Line3DChartScene-BUVNUFNO.mjs → Line3DChartScene-MNNPB3LZ.mjs} +1 -1
- package/dist/{Line3DChartScene-BUVNUFNO.mjs.br → Line3DChartScene-MNNPB3LZ.mjs.br} +0 -0
- package/dist/Line3DChartScene-MNNPB3LZ.mjs.gz +0 -0
- package/dist/{Model3DScene-REKMR2L6.mjs → Model3DScene-5MUREFLY.mjs} +1 -1
- package/dist/{Model3DScene-REKMR2L6.mjs.br → Model3DScene-5MUREFLY.mjs.br} +0 -0
- package/dist/Model3DScene-5MUREFLY.mjs.gz +0 -0
- package/dist/{Model3DScene-6U6TN36M.js → Model3DScene-RYPYQPJH.js} +2 -2
- package/dist/Model3DScene-RYPYQPJH.js.br +0 -0
- package/dist/Model3DScene-RYPYQPJH.js.gz +0 -0
- package/dist/{PieChart3DScene-MV3JF7EM.js → PieChart3DScene-GACYCSSQ.js} +2 -2
- package/dist/{PieChart3DScene-MV3JF7EM.js.br → PieChart3DScene-GACYCSSQ.js.br} +0 -0
- package/dist/PieChart3DScene-GACYCSSQ.js.gz +0 -0
- package/dist/{PieChart3DScene-4L2VVIUJ.mjs → PieChart3DScene-KYZSSG5X.mjs} +1 -1
- package/dist/PieChart3DScene-KYZSSG5X.mjs.br +0 -0
- package/dist/PieChart3DScene-KYZSSG5X.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-SFIOK3G3.js → SurfaceChart3DScene-RI5G4BHS.js} +2 -2
- package/dist/{SurfaceChart3DScene-SFIOK3G3.js.br → SurfaceChart3DScene-RI5G4BHS.js.br} +0 -0
- package/dist/SurfaceChart3DScene-RI5G4BHS.js.gz +0 -0
- package/dist/{SurfaceChart3DScene-ARE7OBFI.mjs → SurfaceChart3DScene-ZUP4PRUZ.mjs} +1 -1
- package/dist/SurfaceChart3DScene-ZUP4PRUZ.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-ZUP4PRUZ.mjs.gz +0 -0
- package/dist/{chunk-DZ3HWACD.js → chunk-4PL3GBSD.js} +1256 -1256
- package/dist/chunk-4PL3GBSD.js.br +0 -0
- package/dist/chunk-4PL3GBSD.js.gz +0 -0
- package/dist/{chunk-M6GIPAY4.mjs → chunk-5T4Y4QPV.mjs} +1 -1
- package/dist/chunk-5T4Y4QPV.mjs.br +0 -0
- package/dist/chunk-5T4Y4QPV.mjs.gz +0 -0
- package/dist/{chunk-UKPGYJ7G.mjs → chunk-6BNPHEEX.mjs} +998 -549
- package/dist/chunk-6BNPHEEX.mjs.br +0 -0
- package/dist/chunk-6BNPHEEX.mjs.gz +0 -0
- package/dist/{chunk-HYUPPQJW.js → chunk-BX4XVY5X.js} +5 -5
- package/dist/chunk-BX4XVY5X.js.br +0 -0
- package/dist/chunk-BX4XVY5X.js.gz +0 -0
- package/dist/{chunk-XW46A7DN.js → chunk-IK25LY4C.js} +167 -167
- package/dist/chunk-IK25LY4C.js.br +0 -0
- package/dist/chunk-IK25LY4C.js.gz +0 -0
- package/dist/{chunk-2Q2NFPXA.js → chunk-LY5535CF.js} +998 -549
- package/dist/chunk-LY5535CF.js.br +0 -0
- package/dist/chunk-LY5535CF.js.gz +0 -0
- package/dist/{chunk-FHOUTYMB.js → chunk-MRBHJ26I.js} +434 -434
- package/dist/chunk-MRBHJ26I.js.br +0 -0
- package/dist/chunk-MRBHJ26I.js.gz +0 -0
- package/dist/{chunk-KWHURCVT.mjs → chunk-N75WRHON.mjs} +12 -12
- package/dist/chunk-N75WRHON.mjs.br +0 -0
- package/dist/chunk-N75WRHON.mjs.gz +0 -0
- package/dist/{chunk-T4ZRSRQZ.mjs → chunk-SUEZMQRT.mjs} +1 -1
- package/dist/chunk-SUEZMQRT.mjs.br +0 -0
- package/dist/chunk-SUEZMQRT.mjs.gz +0 -0
- package/dist/{chunk-HJZA3O3S.mjs → chunk-VHFPZBUW.mjs} +2 -2
- package/dist/chunk-VHFPZBUW.mjs.br +0 -0
- package/dist/chunk-VHFPZBUW.mjs.gz +0 -0
- package/dist/index.d.ts +30 -17
- 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.d.ts +30 -17
- 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.d.ts +30 -17
- 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 +2 -2
- package/dist/AiChatPanel-BQSUE2OO.mjs.br +0 -0
- package/dist/AiChatPanel-BQSUE2OO.mjs.gz +0 -0
- package/dist/AiChatPanel-NSVSBJC7.js.br +0 -0
- package/dist/AiChatPanel-NSVSBJC7.js.gz +0 -0
- package/dist/Area3DChartScene-2FQHPGNE.mjs.gz +0 -0
- package/dist/Area3DChartScene-V3W2V7N5.js.gz +0 -0
- package/dist/Bar3DChartScene-55XMAUC7.js.br +0 -0
- package/dist/Bar3DChartScene-55XMAUC7.js.gz +0 -0
- package/dist/Bar3DChartScene-PSJEVANA.mjs.gz +0 -0
- package/dist/Line3DChartScene-5KACYRSQ.js.br +0 -0
- package/dist/Line3DChartScene-5KACYRSQ.js.gz +0 -0
- package/dist/Line3DChartScene-BUVNUFNO.mjs.gz +0 -0
- package/dist/Model3DScene-6U6TN36M.js.br +0 -0
- package/dist/Model3DScene-6U6TN36M.js.gz +0 -0
- package/dist/Model3DScene-REKMR2L6.mjs.gz +0 -0
- package/dist/PieChart3DScene-4L2VVIUJ.mjs.br +0 -0
- package/dist/PieChart3DScene-4L2VVIUJ.mjs.gz +0 -0
- package/dist/PieChart3DScene-MV3JF7EM.js.gz +0 -0
- package/dist/SurfaceChart3DScene-ARE7OBFI.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-ARE7OBFI.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-SFIOK3G3.js.gz +0 -0
- package/dist/chunk-2Q2NFPXA.js.br +0 -0
- package/dist/chunk-2Q2NFPXA.js.gz +0 -0
- package/dist/chunk-DZ3HWACD.js.br +0 -0
- package/dist/chunk-DZ3HWACD.js.gz +0 -0
- package/dist/chunk-FHOUTYMB.js.br +0 -0
- package/dist/chunk-FHOUTYMB.js.gz +0 -0
- package/dist/chunk-HJZA3O3S.mjs.br +0 -0
- package/dist/chunk-HJZA3O3S.mjs.gz +0 -0
- package/dist/chunk-HYUPPQJW.js.br +0 -0
- package/dist/chunk-HYUPPQJW.js.gz +0 -0
- package/dist/chunk-KWHURCVT.mjs.br +0 -0
- package/dist/chunk-KWHURCVT.mjs.gz +0 -0
- package/dist/chunk-M6GIPAY4.mjs.br +0 -0
- package/dist/chunk-M6GIPAY4.mjs.gz +0 -0
- package/dist/chunk-T4ZRSRQZ.mjs.br +0 -0
- package/dist/chunk-T4ZRSRQZ.mjs.gz +0 -0
- package/dist/chunk-UKPGYJ7G.mjs.br +0 -0
- package/dist/chunk-UKPGYJ7G.mjs.gz +0 -0
- package/dist/chunk-XW46A7DN.js.br +0 -0
- package/dist/chunk-XW46A7DN.js.gz +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkIK25LY4C_js = require('./chunk-IK25LY4C.js');
|
|
4
|
+
var chunkLY5535CF_js = require('./chunk-LY5535CF.js');
|
|
5
5
|
var chunkY6GG2OOW_js = require('./chunk-Y6GG2OOW.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 = chunkLY5535CF_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 = chunkLY5535CF_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 ??= chunkLY5535CF_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 >= chunkLY5535CF_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
|
+
}, chunkLY5535CF_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 = chunkLY5535CF_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
|
+
chunkLY5535CF_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 = chunkLY5535CF_js.validateRoomId(config.roomId);
|
|
244
244
|
const provider = new WebrtcProvider(roomId, yDoc, opts);
|
|
245
|
-
departureRef.current =
|
|
245
|
+
departureRef.current = chunkLY5535CF_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 = chunkLY5535CF_js.validateRoomId(config.roomId);
|
|
288
|
+
const transport = config.transport ?? chunkLY5535CF_js.resolveTransportForServerUrl(config.serverUrl);
|
|
289
289
|
if (transport === "webrtc") {
|
|
290
290
|
await initWebrtc();
|
|
291
291
|
return;
|
|
292
292
|
}
|
|
293
|
-
if (
|
|
293
|
+
if (chunkLY5535CF_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 = chunkLY5535CF_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
|
+
chunkLY5535CF_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
|
+
}, chunkLY5535CF_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
|
+
chunkLY5535CF_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 = chunkLY5535CF_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 = chunkLY5535CF_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(chunkLY5535CF_js.cloneSlide),
|
|
531
|
+
templateElementsBySlideId: chunkLY5535CF_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(chunkLY5535CF_js.cloneSlide));
|
|
545
545
|
setTemplateElementsBySlideId(
|
|
546
|
-
|
|
546
|
+
chunkLY5535CF_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 = chunkIK25LY4C_js.cloneHistorySnapshot(previousSnapshot);
|
|
586
|
+
lastHistorySnapshotRef.current = chunkIK25LY4C_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 = chunkIK25LY4C_js.cloneHistorySnapshot(nextSnapshot);
|
|
608
|
+
lastHistorySnapshotRef.current = chunkIK25LY4C_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 = chunkIK25LY4C_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 = chunkIK25LY4C_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(chunkIK25LY4C_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 = chunkIK25LY4C_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(chunkLY5535CF_js.createWheelStepBuffer());
|
|
747
747
|
const storeRef = react.useRef(null);
|
|
748
|
-
storeRef.current ??=
|
|
748
|
+
storeRef.current ??= chunkLY5535CF_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 = chunkLY5535CF_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, chunkIK25LY4C_js.MIN_ELEMENT_SIZE));
|
|
847
|
+
maxY = Math.max(maxY, element.y + Math.max(element.height, chunkIK25LY4C_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, chunkIK25LY4C_js.MIN_ELEMENT_SIZE);
|
|
854
|
+
const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY, chunkIK25LY4C_js.MIN_ELEMENT_SIZE);
|
|
855
855
|
const availableWidth = Math.max(
|
|
856
|
-
effectiveEditorDimensions.width -
|
|
857
|
-
|
|
856
|
+
effectiveEditorDimensions.width - chunkIK25LY4C_js.ZOOM_TO_SELECTION_PADDING,
|
|
857
|
+
chunkIK25LY4C_js.MIN_ELEMENT_SIZE
|
|
858
858
|
);
|
|
859
859
|
const availableHeight = Math.max(
|
|
860
|
-
effectiveEditorDimensions.height -
|
|
861
|
-
|
|
860
|
+
effectiveEditorDimensions.height - chunkIK25LY4C_js.ZOOM_TO_SELECTION_PADDING,
|
|
861
|
+
chunkIK25LY4C_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 = chunkLY5535CF_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 = chunkLY5535CF_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: chunkLY5535CF_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
|
+
chunkLY5535CF_js.playGroup(controller, group, ctx);
|
|
988
|
+
chunkLY5535CF_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 = chunkLY5535CF_js.computeEntranceAnimationDelay(animation.delayMs, animationIndex);
|
|
1008
1008
|
const timer = window.setTimeout(() => {
|
|
1009
1009
|
setPresentationAnimations(
|
|
1010
1010
|
(previousAnimations) => previousAnimations.map(
|
|
@@ -1030,7 +1030,7 @@ function useAnimationPlayback(input) {
|
|
|
1030
1030
|
const presentationTimersRef = react.useRef([]);
|
|
1031
1031
|
const controllerRef = react.useRef(null);
|
|
1032
1032
|
const buildRafRef = react.useRef(null);
|
|
1033
|
-
const activeAnimationGroupRef = react.useRef(
|
|
1033
|
+
const activeAnimationGroupRef = react.useRef(chunkLY5535CF_js.createActiveAnimationGroup());
|
|
1034
1034
|
const seededCompletedRef = react.useRef(false);
|
|
1035
1035
|
const mediaTimeNodeElementIdsRef = react.useRef(/* @__PURE__ */ new Map());
|
|
1036
1036
|
const lastSeedCompletedRef = react.useRef(false);
|
|
@@ -1047,15 +1047,15 @@ function useAnimationPlayback(input) {
|
|
|
1047
1047
|
}, [onPlayActionSound]);
|
|
1048
1048
|
react.useEffect(() => {
|
|
1049
1049
|
return () => {
|
|
1050
|
-
|
|
1050
|
+
chunkLY5535CF_js.cancelBuildReveal(buildRafRef);
|
|
1051
1051
|
};
|
|
1052
1052
|
}, []);
|
|
1053
1053
|
const clearPresentationTimers = react.useCallback(() => {
|
|
1054
|
-
|
|
1054
|
+
chunkLY5535CF_js.clearPlaybackTimers(buildPlaybackContext(), activeAnimationGroupRef.current);
|
|
1055
1055
|
}, [buildPlaybackContext]);
|
|
1056
1056
|
const resetSlideTimeline = react.useCallback(
|
|
1057
1057
|
(slideIndex) => {
|
|
1058
|
-
|
|
1058
|
+
chunkLY5535CF_js.cancelBuildReveal(buildRafRef);
|
|
1059
1059
|
const slide = slides[slideIndex];
|
|
1060
1060
|
if (!slide) {
|
|
1061
1061
|
controllerRef.current = null;
|
|
@@ -1066,13 +1066,13 @@ function useAnimationPlayback(input) {
|
|
|
1066
1066
|
setHoverTriggerShapeIds(/* @__PURE__ */ new Set());
|
|
1067
1067
|
return;
|
|
1068
1068
|
}
|
|
1069
|
-
const controller =
|
|
1069
|
+
const controller = chunkLY5535CF_js.PresentationAnimationController.fromSlide(slide, {
|
|
1070
1070
|
slideHeightPx: canvasSize?.height,
|
|
1071
1071
|
slideWidthPx: canvasSize?.width,
|
|
1072
1072
|
themeColorMap
|
|
1073
1073
|
});
|
|
1074
1074
|
controllerRef.current = controller;
|
|
1075
|
-
mediaTimeNodeElementIdsRef.current =
|
|
1075
|
+
mediaTimeNodeElementIdsRef.current = chunkLY5535CF_js.resolveMediaTimeNodeElementIds(
|
|
1076
1076
|
slide.nativeAnimations ?? []
|
|
1077
1077
|
);
|
|
1078
1078
|
setPresentationKeyframesCss(controller.keyframesCss);
|
|
@@ -1086,7 +1086,7 @@ function useAnimationPlayback(input) {
|
|
|
1086
1086
|
if (!animationsEnabled) {
|
|
1087
1087
|
return false;
|
|
1088
1088
|
}
|
|
1089
|
-
return
|
|
1089
|
+
return chunkLY5535CF_js.advanceMainSequence(
|
|
1090
1090
|
controllerRef.current,
|
|
1091
1091
|
buildPlaybackContext(),
|
|
1092
1092
|
activeAnimationGroupRef.current
|
|
@@ -1102,7 +1102,7 @@ function useAnimationPlayback(input) {
|
|
|
1102
1102
|
if (!group) {
|
|
1103
1103
|
return false;
|
|
1104
1104
|
}
|
|
1105
|
-
|
|
1105
|
+
chunkLY5535CF_js.playGroup(controller, group, buildPlaybackContext());
|
|
1106
1106
|
return true;
|
|
1107
1107
|
},
|
|
1108
1108
|
[buildPlaybackContext]
|
|
@@ -1121,7 +1121,7 @@ function useAnimationPlayback(input) {
|
|
|
1121
1121
|
if (!group) {
|
|
1122
1122
|
return false;
|
|
1123
1123
|
}
|
|
1124
|
-
|
|
1124
|
+
chunkLY5535CF_js.playGroup(controller, group, buildPlaybackContext());
|
|
1125
1125
|
return true;
|
|
1126
1126
|
},
|
|
1127
1127
|
[animationsEnabled, buildPlaybackContext]
|
|
@@ -1202,12 +1202,12 @@ function useAnimationPlayback(input) {
|
|
|
1202
1202
|
presentationTimersRef
|
|
1203
1203
|
};
|
|
1204
1204
|
}
|
|
1205
|
-
var PRESENTER_CHANNEL_NAME =
|
|
1206
|
-
var AUDIENCE_HASH =
|
|
1207
|
-
var PRESENTER_MSG_ORIGIN =
|
|
1208
|
-
var AUDIENCE_NONCE_KEY =
|
|
1205
|
+
var PRESENTER_CHANNEL_NAME = chunkLY5535CF_js.PRESENTATION_CHANNEL_NAME;
|
|
1206
|
+
var AUDIENCE_HASH = chunkLY5535CF_js.PRESENTATION_HASH;
|
|
1207
|
+
var PRESENTER_MSG_ORIGIN = chunkLY5535CF_js.PRESENTATION_MESSAGE_ORIGIN;
|
|
1208
|
+
var AUDIENCE_NONCE_KEY = chunkLY5535CF_js.PRESENTATION_NONCE_KEY;
|
|
1209
1209
|
function generateSessionId() {
|
|
1210
|
-
return
|
|
1210
|
+
return chunkLY5535CF_js.createPresentationSessionId();
|
|
1211
1211
|
}
|
|
1212
1212
|
function parseAudienceNonce() {
|
|
1213
1213
|
const hash = window.location.hash;
|
|
@@ -1243,7 +1243,7 @@ function usePresenterWindow(input) {
|
|
|
1243
1243
|
}, []);
|
|
1244
1244
|
const swapDisplays = react.useCallback(async () => {
|
|
1245
1245
|
const audience = audienceWindowRef.current;
|
|
1246
|
-
return audience && !audience.closed ?
|
|
1246
|
+
return audience && !audience.closed ? chunkLY5535CF_js.swapPresentationWindows(window, audience) : false;
|
|
1247
1247
|
}, []);
|
|
1248
1248
|
const syncSlideToAudience = react.useCallback(
|
|
1249
1249
|
(slideIndex) => {
|
|
@@ -1307,7 +1307,7 @@ function usePresenterWindow(input) {
|
|
|
1307
1307
|
pollTimerRef.current = null;
|
|
1308
1308
|
}
|
|
1309
1309
|
if (closingSessionId) {
|
|
1310
|
-
void
|
|
1310
|
+
void chunkLY5535CF_js.clearAudienceContent(closingSessionId);
|
|
1311
1311
|
}
|
|
1312
1312
|
}, [getChannel]);
|
|
1313
1313
|
const openAudienceWindow = react.useCallback(() => {
|
|
@@ -1325,10 +1325,10 @@ function usePresenterWindow(input) {
|
|
|
1325
1325
|
audienceWindowRef.current = blankWin;
|
|
1326
1326
|
const sessionId = generateSessionId();
|
|
1327
1327
|
sessionIdRef.current = sessionId;
|
|
1328
|
-
const audienceUrl =
|
|
1329
|
-
void
|
|
1328
|
+
const audienceUrl = chunkLY5535CF_js.buildPresentationAudienceUrl(window.location.href, sessionId);
|
|
1329
|
+
void chunkLY5535CF_js.resolveAudienceScreenPlacement(window).then((placement) => {
|
|
1330
1330
|
if (placement && audienceWindowRef.current === blankWin && !blankWin.closed) {
|
|
1331
|
-
|
|
1331
|
+
chunkLY5535CF_js.placeAudienceWindow(blankWin, placement);
|
|
1332
1332
|
}
|
|
1333
1333
|
return void 0;
|
|
1334
1334
|
});
|
|
@@ -1358,7 +1358,7 @@ function usePresenterWindow(input) {
|
|
|
1358
1358
|
}
|
|
1359
1359
|
};
|
|
1360
1360
|
if (content) {
|
|
1361
|
-
void
|
|
1361
|
+
void chunkLY5535CF_js.storeAudienceContent(content, sessionId).then(() => navigateOrClose(true)).catch(() => navigateOrClose(false));
|
|
1362
1362
|
} else {
|
|
1363
1363
|
navigateOrClose(true);
|
|
1364
1364
|
}
|
|
@@ -1384,7 +1384,7 @@ function usePresenterWindow(input) {
|
|
|
1384
1384
|
}
|
|
1385
1385
|
const handleMessage = (event) => {
|
|
1386
1386
|
const message = event.data;
|
|
1387
|
-
if (
|
|
1387
|
+
if (chunkLY5535CF_js.isPresentationSessionMessage(message) && message.type === "audience-ready" && message.sessionId === sessionIdRef.current) {
|
|
1388
1388
|
syncStateToAudience(snapshotRef.current);
|
|
1389
1389
|
}
|
|
1390
1390
|
};
|
|
@@ -1413,7 +1413,7 @@ function usePresenterWindow(input) {
|
|
|
1413
1413
|
react.useEffect(() => {
|
|
1414
1414
|
const handleBeforeUnload = () => {
|
|
1415
1415
|
if (sessionIdRef.current) {
|
|
1416
|
-
void
|
|
1416
|
+
void chunkLY5535CF_js.clearAudienceContent(sessionIdRef.current);
|
|
1417
1417
|
}
|
|
1418
1418
|
};
|
|
1419
1419
|
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
@@ -1475,7 +1475,7 @@ function useAudienceMode(input) {
|
|
|
1475
1475
|
}
|
|
1476
1476
|
channel.onmessage = (event) => {
|
|
1477
1477
|
const data = event.data;
|
|
1478
|
-
if (!
|
|
1478
|
+
if (!chunkLY5535CF_js.isPresentationSessionMessage(data) || data.origin !== PRESENTER_MSG_ORIGIN) {
|
|
1479
1479
|
return;
|
|
1480
1480
|
}
|
|
1481
1481
|
if (expectedSessionId && data.sessionId !== expectedSessionId) {
|
|
@@ -1491,16 +1491,16 @@ function useAudienceMode(input) {
|
|
|
1491
1491
|
}
|
|
1492
1492
|
if (data.type === "presenter-exit") {
|
|
1493
1493
|
if (expectedSessionId) {
|
|
1494
|
-
void
|
|
1494
|
+
void chunkLY5535CF_js.clearAudienceContent(expectedSessionId);
|
|
1495
1495
|
}
|
|
1496
|
-
if (
|
|
1496
|
+
if (chunkLY5535CF_js.endAudienceDisplay(window)) {
|
|
1497
1497
|
handlers.onPresenterEnded?.();
|
|
1498
1498
|
}
|
|
1499
1499
|
}
|
|
1500
1500
|
};
|
|
1501
1501
|
if (expectedSessionId) {
|
|
1502
1502
|
channel.postMessage({
|
|
1503
|
-
origin:
|
|
1503
|
+
origin: chunkLY5535CF_js.PRESENTATION_MESSAGE_ORIGIN,
|
|
1504
1504
|
type: "audience-ready",
|
|
1505
1505
|
sessionId: expectedSessionId
|
|
1506
1506
|
});
|
|
@@ -1514,7 +1514,7 @@ function useAudienceMode(input) {
|
|
|
1514
1514
|
}, []);
|
|
1515
1515
|
}
|
|
1516
1516
|
function usePresentationKeyboard(input) {
|
|
1517
|
-
const wheelBufferRef = react.useRef(
|
|
1517
|
+
const wheelBufferRef = react.useRef(chunkLY5535CF_js.createWheelStepBuffer());
|
|
1518
1518
|
const {
|
|
1519
1519
|
mode,
|
|
1520
1520
|
movePresentationSlide,
|
|
@@ -1535,14 +1535,14 @@ function usePresentationKeyboard(input) {
|
|
|
1535
1535
|
presentationSlideIndex,
|
|
1536
1536
|
setShowRehearsalSummary
|
|
1537
1537
|
} = input;
|
|
1538
|
-
const keyBufferRef = react.useRef(
|
|
1538
|
+
const keyBufferRef = react.useRef(chunkLY5535CF_js.createPresentationKeyBuffer());
|
|
1539
1539
|
react.useEffect(() => {
|
|
1540
|
-
if (mode !== "present" || !
|
|
1541
|
-
keyBufferRef.current =
|
|
1540
|
+
if (mode !== "present" || !chunkLY5535CF_js.acceptsPresentationInput()) {
|
|
1541
|
+
keyBufferRef.current = chunkLY5535CF_js.createPresentationKeyBuffer();
|
|
1542
1542
|
return;
|
|
1543
1543
|
}
|
|
1544
1544
|
const handleKeyDown = (event) => {
|
|
1545
|
-
const mapped =
|
|
1545
|
+
const mapped = chunkLY5535CF_js.mapPresentationKey(event, keyBufferRef.current);
|
|
1546
1546
|
if (mapped.action === "none") {
|
|
1547
1547
|
return;
|
|
1548
1548
|
}
|
|
@@ -1562,12 +1562,12 @@ function usePresentationKeyboard(input) {
|
|
|
1562
1562
|
movePresentationSlide(-1);
|
|
1563
1563
|
return;
|
|
1564
1564
|
case "first": {
|
|
1565
|
-
const first =
|
|
1565
|
+
const first = chunkLY5535CF_js.firstShowSlideIndex(showSlideIndexes);
|
|
1566
1566
|
navigateToSlide(first ?? 0);
|
|
1567
1567
|
return;
|
|
1568
1568
|
}
|
|
1569
1569
|
case "last": {
|
|
1570
|
-
const last =
|
|
1570
|
+
const last = chunkLY5535CF_js.lastShowSlideIndex(showSlideIndexes);
|
|
1571
1571
|
navigateToSlide(last ?? Math.max(0, slideCount - 1));
|
|
1572
1572
|
return;
|
|
1573
1573
|
}
|
|
@@ -1605,10 +1605,10 @@ function usePresentationKeyboard(input) {
|
|
|
1605
1605
|
}
|
|
1606
1606
|
};
|
|
1607
1607
|
const handleWheel = (event) => {
|
|
1608
|
-
if (mode !== "present" || !
|
|
1608
|
+
if (mode !== "present" || !chunkLY5535CF_js.acceptsPresentationInput()) {
|
|
1609
1609
|
return;
|
|
1610
1610
|
}
|
|
1611
|
-
const mapped =
|
|
1611
|
+
const mapped = chunkLY5535CF_js.mapPresentationWheel(event, wheelBufferRef.current);
|
|
1612
1612
|
if (mapped.intent === "next-slide") {
|
|
1613
1613
|
event.preventDefault();
|
|
1614
1614
|
movePresentationSlide(1);
|
|
@@ -1741,7 +1741,7 @@ function useRehearsalTimings(input) {
|
|
|
1741
1741
|
|
|
1742
1742
|
// src/viewer/hooks/presentation-mode/presentation-actions.ts
|
|
1743
1743
|
function handlePresentationActionImpl(action, deps) {
|
|
1744
|
-
|
|
1744
|
+
chunkLY5535CF_js.runPresentationAction(
|
|
1745
1745
|
action,
|
|
1746
1746
|
{ slideCount: deps.slidesLength, ...deps.elementId ? { elementId: deps.elementId } : {} },
|
|
1747
1747
|
{
|
|
@@ -1769,13 +1769,13 @@ function handlePresentationActionImpl(action, deps) {
|
|
|
1769
1769
|
function executeSlideTransition(nextSlideIndex, deps) {
|
|
1770
1770
|
const incomingSlide = deps.slides[nextSlideIndex];
|
|
1771
1771
|
const transition = deps.reverse ? deps.slides[deps.currentSlideIndex]?.transition : incomingSlide?.transition;
|
|
1772
|
-
const durationMs = deps.playTransition ?
|
|
1772
|
+
const durationMs = deps.playTransition ? chunkLY5535CF_js.resolveTransitionDurationMs(transition) : 0;
|
|
1773
1773
|
deps.clearPresentationTimers();
|
|
1774
1774
|
deps.setPresentationSlideIndex(nextSlideIndex);
|
|
1775
1775
|
deps.onSetActiveSlideIndex(nextSlideIndex);
|
|
1776
1776
|
deps.setPresentationSlideVisible(true);
|
|
1777
1777
|
deps.seedSlideAnimations(nextSlideIndex, { completed: deps.seedCompleted });
|
|
1778
|
-
const soundAction =
|
|
1778
|
+
const soundAction = chunkLY5535CF_js.resolveTransitionSoundAction(transition);
|
|
1779
1779
|
if (soundAction.kind === "play" && deps.onPlayActionSound) {
|
|
1780
1780
|
deps.onPlayActionSound(soundAction.soundPath, { loop: soundAction.loop });
|
|
1781
1781
|
} else if (soundAction.kind === "stop" && deps.onStopActionSound) {
|
|
@@ -1838,7 +1838,7 @@ function useSlideNavigation(input) {
|
|
|
1838
1838
|
});
|
|
1839
1839
|
const scheduleAutoAdvanceForSlide = react.useCallback(
|
|
1840
1840
|
(slideIndex) => {
|
|
1841
|
-
const delayMs =
|
|
1841
|
+
const delayMs = chunkLY5535CF_js.resolveAutoAdvanceDelayMs(slides[slideIndex], { useTimings });
|
|
1842
1842
|
if (delayMs === void 0) {
|
|
1843
1843
|
return;
|
|
1844
1844
|
}
|
|
@@ -1861,7 +1861,7 @@ function useSlideNavigation(input) {
|
|
|
1861
1861
|
if (availableSlideIndexes.length === 0) {
|
|
1862
1862
|
return;
|
|
1863
1863
|
}
|
|
1864
|
-
const pastLastSlide = direction === 1 && !
|
|
1864
|
+
const pastLastSlide = direction === 1 && !chunkLY5535CF_js.hasShowSlideAfter(presentationSlideIndex, availableSlideIndexes);
|
|
1865
1865
|
if (rehearsing && pastLastSlide) {
|
|
1866
1866
|
recordCurrentSlideTime(presentationSlideIndex);
|
|
1867
1867
|
try {
|
|
@@ -1879,9 +1879,9 @@ function useSlideNavigation(input) {
|
|
|
1879
1879
|
onAdvancePastLastSlide();
|
|
1880
1880
|
return;
|
|
1881
1881
|
}
|
|
1882
|
-
const nextSlideIndex = direction === 1 ?
|
|
1882
|
+
const nextSlideIndex = direction === 1 ? chunkLY5535CF_js.nextShowSlideIndex(presentationSlideIndex, availableSlideIndexes, {
|
|
1883
1883
|
loop: Boolean(loopContinuously) && !rehearsing
|
|
1884
|
-
}) :
|
|
1884
|
+
}) : chunkLY5535CF_js.previousShowSlideIndex(presentationSlideIndex, availableSlideIndexes);
|
|
1885
1885
|
if (nextSlideIndex === void 0 || nextSlideIndex === presentationSlideIndex) {
|
|
1886
1886
|
return;
|
|
1887
1887
|
}
|
|
@@ -2060,7 +2060,7 @@ function createCustomShowRunner(deps) {
|
|
|
2060
2060
|
return;
|
|
2061
2061
|
}
|
|
2062
2062
|
origin = returnAfter ? { showId: deps.getActiveCustomShowId(), slideIndex: deps.getPresentationSlideIndex() } : null;
|
|
2063
|
-
const first =
|
|
2063
|
+
const first = chunkLY5535CF_js.firstShowSlideIndex(chunkLY5535CF_js.resolveShowSlideIndexes(deps.getSlides(), target));
|
|
2064
2064
|
deps.setActiveCustomShowId(customShowId);
|
|
2065
2065
|
if (first !== void 0) {
|
|
2066
2066
|
deps.navigateToSlide(first);
|
|
@@ -2137,27 +2137,27 @@ function usePresentationActionExtensions(input) {
|
|
|
2137
2137
|
}
|
|
2138
2138
|
}, [navigateToSlideViaRef]);
|
|
2139
2139
|
const onOpenFile = react.useCallback((target) => {
|
|
2140
|
-
|
|
2140
|
+
chunkLY5535CF_js.safeOpenUrl(target);
|
|
2141
2141
|
}, []);
|
|
2142
2142
|
const onOpenPresentation = react.useCallback((target) => {
|
|
2143
|
-
|
|
2143
|
+
chunkLY5535CF_js.safeOpenUrl(target);
|
|
2144
2144
|
}, []);
|
|
2145
2145
|
const onPlayMedia = react.useCallback(
|
|
2146
2146
|
(elementId) => {
|
|
2147
|
-
|
|
2147
|
+
chunkLY5535CF_js.toggleStageElementMedia(containerRef.current, elementId);
|
|
2148
2148
|
},
|
|
2149
2149
|
[containerRef]
|
|
2150
2150
|
);
|
|
2151
2151
|
const onOleVerb = react.useCallback(
|
|
2152
2152
|
(verb, elementId) => {
|
|
2153
|
-
const target =
|
|
2153
|
+
const target = chunkLY5535CF_js.resolveOleVerbTarget(slides[presentationSlideIndex], elementId, verb);
|
|
2154
2154
|
if (!target) {
|
|
2155
2155
|
return;
|
|
2156
2156
|
}
|
|
2157
2157
|
if (target.action === "download") {
|
|
2158
|
-
|
|
2158
|
+
chunkLY5535CF_js.downloadDataUrl(target.url, target.fileName ?? "download");
|
|
2159
2159
|
} else {
|
|
2160
|
-
|
|
2160
|
+
chunkLY5535CF_js.openUrlInNewTab(target.url);
|
|
2161
2161
|
}
|
|
2162
2162
|
},
|
|
2163
2163
|
[slides, presentationSlideIndex]
|
|
@@ -2187,22 +2187,22 @@ function usePresentationActionExtensions(input) {
|
|
|
2187
2187
|
};
|
|
2188
2188
|
}
|
|
2189
2189
|
function usePresenterConsole(slideIndex, active) {
|
|
2190
|
-
const timerRef = react.useRef(
|
|
2191
|
-
const [snapshot, setSnapshot] = react.useState(() =>
|
|
2190
|
+
const timerRef = react.useRef(chunkLY5535CF_js.createPresenterTimer());
|
|
2191
|
+
const [snapshot, setSnapshot] = react.useState(() => chunkLY5535CF_js.createInitialPresentationSnapshot(slideIndex));
|
|
2192
2192
|
const patch = react.useCallback((value) => {
|
|
2193
|
-
setSnapshot((current) =>
|
|
2193
|
+
setSnapshot((current) => chunkLY5535CF_js.mergePresentationSnapshot(current, value));
|
|
2194
2194
|
}, []);
|
|
2195
2195
|
react.useEffect(() => patch({ slideIndex }), [patch, slideIndex]);
|
|
2196
2196
|
react.useEffect(() => {
|
|
2197
2197
|
if (!active) {
|
|
2198
2198
|
return;
|
|
2199
2199
|
}
|
|
2200
|
-
timerRef.current =
|
|
2200
|
+
timerRef.current = chunkLY5535CF_js.resetPresenterTimer();
|
|
2201
2201
|
patch({ paused: false, elapsedMs: 0 });
|
|
2202
2202
|
const timer = window.setInterval(() => {
|
|
2203
2203
|
patch({
|
|
2204
2204
|
paused: timerRef.current.paused,
|
|
2205
|
-
elapsedMs:
|
|
2205
|
+
elapsedMs: chunkLY5535CF_js.presenterElapsed(timerRef.current)
|
|
2206
2206
|
});
|
|
2207
2207
|
}, 1e3);
|
|
2208
2208
|
return () => window.clearInterval(timer);
|
|
@@ -2212,19 +2212,19 @@ function usePresenterConsole(slideIndex, active) {
|
|
|
2212
2212
|
applyAudienceSnapshot: setSnapshot,
|
|
2213
2213
|
setBlackout: (blackout) => patch({ blackout }),
|
|
2214
2214
|
toggleTimer: () => {
|
|
2215
|
-
timerRef.current =
|
|
2215
|
+
timerRef.current = chunkLY5535CF_js.togglePresenterTimer(timerRef.current);
|
|
2216
2216
|
patch({
|
|
2217
2217
|
paused: timerRef.current.paused,
|
|
2218
|
-
elapsedMs:
|
|
2218
|
+
elapsedMs: chunkLY5535CF_js.presenterElapsed(timerRef.current)
|
|
2219
2219
|
});
|
|
2220
2220
|
},
|
|
2221
2221
|
resetTimer: () => {
|
|
2222
|
-
timerRef.current =
|
|
2222
|
+
timerRef.current = chunkLY5535CF_js.resetPresenterTimer();
|
|
2223
2223
|
patch({ paused: false, elapsedMs: 0 });
|
|
2224
2224
|
},
|
|
2225
2225
|
stepZoom: (direction) => setSnapshot(
|
|
2226
|
-
(current) =>
|
|
2227
|
-
zoom:
|
|
2226
|
+
(current) => chunkLY5535CF_js.mergePresentationSnapshot(current, {
|
|
2227
|
+
zoom: chunkLY5535CF_js.stepPresenterZoom(
|
|
2228
2228
|
current.zoom ?? { scale: 1, originX: 0.5, originY: 0.5 },
|
|
2229
2229
|
direction
|
|
2230
2230
|
)
|
|
@@ -2277,7 +2277,7 @@ function usePresentationMode(input) {
|
|
|
2277
2277
|
const [allSlidesOpen, setAllSlidesOpen] = react.useState(false);
|
|
2278
2278
|
const [endOfShowVisible, setEndOfShowVisible] = react.useState(false);
|
|
2279
2279
|
const [presentationStartTime, setPresentationStartTime] = react.useState(null);
|
|
2280
|
-
const showGuard = react.useMemo(() =>
|
|
2280
|
+
const showGuard = react.useMemo(() => chunkLY5535CF_js.createPresenterShowGuard(), []);
|
|
2281
2281
|
const {
|
|
2282
2282
|
presentationAnimations,
|
|
2283
2283
|
presentationElementStates,
|
|
@@ -2374,7 +2374,7 @@ function usePresentationMode(input) {
|
|
|
2374
2374
|
actionExtensions.bindNavigateToSlide(navigateToSlide);
|
|
2375
2375
|
const movePresentationSlide = react.useCallback(
|
|
2376
2376
|
(direction, trigger = "explicit") => {
|
|
2377
|
-
if (!
|
|
2377
|
+
if (!chunkLY5535CF_js.acceptsPresentationInput()) {
|
|
2378
2378
|
return;
|
|
2379
2379
|
}
|
|
2380
2380
|
if (endOfShowVisible) {
|
|
@@ -2443,7 +2443,7 @@ function usePresentationMode(input) {
|
|
|
2443
2443
|
onSetMode("present");
|
|
2444
2444
|
}, [containerRef, onSetMode, setRehearsing]);
|
|
2445
2445
|
const enterPresentModeFromBeginning = react.useCallback(() => {
|
|
2446
|
-
const first =
|
|
2446
|
+
const first = chunkLY5535CF_js.firstShowSlideIndex(visibleSlideIndexes);
|
|
2447
2447
|
if (first !== void 0) {
|
|
2448
2448
|
onSetActiveSlideIndex(first);
|
|
2449
2449
|
}
|
|
@@ -2523,7 +2523,7 @@ function usePresentationMode(input) {
|
|
|
2523
2523
|
if (mode !== "present") {
|
|
2524
2524
|
return;
|
|
2525
2525
|
}
|
|
2526
|
-
return
|
|
2526
|
+
return chunkLY5535CF_js.attachPresentationVisibilityPause({
|
|
2527
2527
|
root: containerRef.current ?? void 0,
|
|
2528
2528
|
onHidden: () => clearPresentationTimersRef.current(),
|
|
2529
2529
|
onVisible: () => scheduleAutoAdvanceRef.current(presentationSlideIndexRef.current)
|
|
@@ -2531,7 +2531,7 @@ function usePresentationMode(input) {
|
|
|
2531
2531
|
}, [mode, containerRef]);
|
|
2532
2532
|
react.useLayoutEffect(() => {
|
|
2533
2533
|
if (mode === "present") {
|
|
2534
|
-
const idx =
|
|
2534
|
+
const idx = chunkLY5535CF_js.presentationEntrySlideIndex(
|
|
2535
2535
|
activeSlideIndexRef.current,
|
|
2536
2536
|
visibleSlideIndexesRef.current
|
|
2537
2537
|
);
|
|
@@ -2610,11 +2610,11 @@ function usePresentationMode(input) {
|
|
|
2610
2610
|
return void 0;
|
|
2611
2611
|
}
|
|
2612
2612
|
const incoming = slides[transitionOverlay.incomingSlideIndex];
|
|
2613
|
-
return
|
|
2613
|
+
return chunkLY5535CF_js.buildMorphTransitionPlan(
|
|
2614
2614
|
slides[transitionOverlay.outgoingSlideIndex],
|
|
2615
2615
|
incoming,
|
|
2616
2616
|
transitionOverlay.durationMs,
|
|
2617
|
-
|
|
2617
|
+
chunkLY5535CF_js.morphOptionToMode(transitionOverlay.transition.morphOption),
|
|
2618
2618
|
// `PresentationStage` stacks the incoming slide's elements above its
|
|
2619
2619
|
// template shapes (`zIndex = templateElements.length + index`), so a
|
|
2620
2620
|
// z-index journey has to start counting where the stage does.
|
|
@@ -2639,7 +2639,7 @@ function usePresentationMode(input) {
|
|
|
2639
2639
|
if (!morphPlan) {
|
|
2640
2640
|
return presentationKeyframesCss;
|
|
2641
2641
|
}
|
|
2642
|
-
const imageRules =
|
|
2642
|
+
const imageRules = chunkLY5535CF_js.buildMorphAnimationRules(morphPlan, "", "incoming", "image");
|
|
2643
2643
|
return `${presentationKeyframesCss ?? ""}
|
|
2644
2644
|
${morphPlan.keyframesCss}
|
|
2645
2645
|
${imageRules}`;
|
|
@@ -2936,7 +2936,7 @@ function useFindReplace({
|
|
|
2936
2936
|
const [findResults, setFindResults] = react.useState([]);
|
|
2937
2937
|
const [findResultIndex, setFindResultIndex] = react.useState(-1);
|
|
2938
2938
|
const performFind = react.useCallback(() => {
|
|
2939
|
-
const results =
|
|
2939
|
+
const results = chunkLY5535CF_js.findInSlides(slides, findQuery, { matchCase: findMatchCase });
|
|
2940
2940
|
if (!findQuery) {
|
|
2941
2941
|
setFindResults([]);
|
|
2942
2942
|
setFindResultIndex(-1);
|
|
@@ -2970,7 +2970,7 @@ function useFindReplace({
|
|
|
2970
2970
|
return;
|
|
2971
2971
|
}
|
|
2972
2972
|
onUpdateSlides(
|
|
2973
|
-
(prevSlides) =>
|
|
2973
|
+
(prevSlides) => chunkLY5535CF_js.applyFindReplacements(prevSlides, toReplace, replaceQuery).slides
|
|
2974
2974
|
);
|
|
2975
2975
|
onMarkDirty();
|
|
2976
2976
|
},
|
|
@@ -2992,9 +2992,9 @@ function useFindReplace({
|
|
|
2992
2992
|
}, [findResults, applyReplacements, performFind]);
|
|
2993
2993
|
react.useEffect(() => {
|
|
2994
2994
|
const handler = (event) => {
|
|
2995
|
-
const { action } =
|
|
2995
|
+
const { action } = chunkLY5535CF_js.mapEditorKey(event, {
|
|
2996
2996
|
canEdit: mode === "edit",
|
|
2997
|
-
isTextInputTarget:
|
|
2997
|
+
isTextInputTarget: chunkLY5535CF_js.isEditorTextInputTarget(event.target)
|
|
2998
2998
|
});
|
|
2999
2999
|
if (action !== "find") {
|
|
3000
3000
|
return;
|
|
@@ -3105,7 +3105,7 @@ function addCommentToSlide(slides, slideIndex, text, authorName, elementId, ment
|
|
|
3105
3105
|
if (!slide) {
|
|
3106
3106
|
return { slides, didAdd: false };
|
|
3107
3107
|
}
|
|
3108
|
-
const next =
|
|
3108
|
+
const next = chunkLY5535CF_js.addCommentToList(
|
|
3109
3109
|
slide.comments || [],
|
|
3110
3110
|
text,
|
|
3111
3111
|
authorName,
|
|
@@ -3126,7 +3126,7 @@ function removeCommentFromSlide(slides, slideIndex, commentId) {
|
|
|
3126
3126
|
if (!slide) {
|
|
3127
3127
|
return { slides, didDelete: false };
|
|
3128
3128
|
}
|
|
3129
|
-
const next =
|
|
3129
|
+
const next = chunkLY5535CF_js.removeCommentFromList(slide.comments || [], commentId);
|
|
3130
3130
|
if (!next) {
|
|
3131
3131
|
return { slides, didDelete: false };
|
|
3132
3132
|
}
|
|
@@ -3137,7 +3137,7 @@ function editCommentInSlide(slides, slideIndex, commentId, newText) {
|
|
|
3137
3137
|
if (!slide) {
|
|
3138
3138
|
return { slides, didUpdate: false };
|
|
3139
3139
|
}
|
|
3140
|
-
const next =
|
|
3140
|
+
const next = chunkLY5535CF_js.editCommentInList(slide.comments || [], commentId, newText);
|
|
3141
3141
|
if (!next) {
|
|
3142
3142
|
return { slides, didUpdate: false };
|
|
3143
3143
|
}
|
|
@@ -3148,7 +3148,7 @@ function toggleResolvedInSlide(slides, slideIndex, commentId) {
|
|
|
3148
3148
|
if (!slide) {
|
|
3149
3149
|
return { slides, didUpdate: false };
|
|
3150
3150
|
}
|
|
3151
|
-
const next =
|
|
3151
|
+
const next = chunkLY5535CF_js.toggleCommentResolvedInList(slide.comments || [], commentId);
|
|
3152
3152
|
if (!next) {
|
|
3153
3153
|
return { slides, didUpdate: false };
|
|
3154
3154
|
}
|
|
@@ -3159,7 +3159,7 @@ function addReplyToSlide(slides, slideIndex, parentId, text, authorName, mention
|
|
|
3159
3159
|
if (!slide) {
|
|
3160
3160
|
return { slides, didAdd: false };
|
|
3161
3161
|
}
|
|
3162
|
-
const next =
|
|
3162
|
+
const next = chunkLY5535CF_js.replyToCommentInList(slide.comments || [], parentId, text, authorName);
|
|
3163
3163
|
if (!next) {
|
|
3164
3164
|
return { slides, didAdd: false };
|
|
3165
3165
|
}
|
|
@@ -3546,7 +3546,7 @@ function useDerivedElementState(input) {
|
|
|
3546
3546
|
return [];
|
|
3547
3547
|
}
|
|
3548
3548
|
return [
|
|
3549
|
-
...
|
|
3549
|
+
...chunkLY5535CF_js.visibleTemplateElements(activeSlide, templateElementsBySlideId[activeSlide.id] ?? [])
|
|
3550
3550
|
];
|
|
3551
3551
|
}, [activeSlide, templateElementsBySlideId]);
|
|
3552
3552
|
const activeMaster = slideMasters[activeMasterIndex];
|
|
@@ -3613,7 +3613,7 @@ function useViewerCoreState(_input) {
|
|
|
3613
3613
|
const marqueeStateRef = react.useRef(null);
|
|
3614
3614
|
const isDrawingRef = react.useRef(false);
|
|
3615
3615
|
const justInteractedRef = react.useRef(false);
|
|
3616
|
-
const livePatcher = react.useMemo(() =>
|
|
3616
|
+
const livePatcher = react.useMemo(() => chunkLY5535CF_js.createCollaborationLivePatcher(), []);
|
|
3617
3617
|
react.useEffect(() => () => livePatcher.dispose(), [livePatcher]);
|
|
3618
3618
|
const slidesRef = react.useRef([]);
|
|
3619
3619
|
const [mode, setMode] = react.useState("edit");
|
|
@@ -3622,8 +3622,8 @@ function useViewerCoreState(_input) {
|
|
|
3622
3622
|
const [slides, setSlides] = react.useState([]);
|
|
3623
3623
|
const [templateElementsBySlideId, setTemplateElementsBySlideId] = react.useState({});
|
|
3624
3624
|
const [canvasSize, setCanvasSize] = react.useState({
|
|
3625
|
-
width:
|
|
3626
|
-
height:
|
|
3625
|
+
width: chunkIK25LY4C_js.DEFAULT_CANVAS_WIDTH,
|
|
3626
|
+
height: chunkIK25LY4C_js.DEFAULT_CANVAS_HEIGHT
|
|
3627
3627
|
});
|
|
3628
3628
|
const [slideSizeEmu, setSlideSizeEmu] = react.useState();
|
|
3629
3629
|
const [activeSlideIndex, setActiveSlideIndex] = react.useState(0);
|
|
@@ -3644,7 +3644,7 @@ function useViewerCoreState(_input) {
|
|
|
3644
3644
|
const resolved = typeof value === "function" ? value(inlineEditingTextRef.current) : value;
|
|
3645
3645
|
inlineEditingTextRef.current = resolved;
|
|
3646
3646
|
setInlineEditingTextBase(value);
|
|
3647
|
-
|
|
3647
|
+
chunkLY5535CF_js.publishLiveInlineText(
|
|
3648
3648
|
livePatcher,
|
|
3649
3649
|
slidesRef.current[activeSlideIndexRef.current],
|
|
3650
3650
|
inlineEditingElementIdRef.current,
|
|
@@ -4007,7 +4007,7 @@ function useLoadContent({
|
|
|
4007
4007
|
);
|
|
4008
4008
|
}
|
|
4009
4009
|
const previousHandler = handlerRef.current;
|
|
4010
|
-
const handler = new
|
|
4010
|
+
const handler = new chunkLY5535CF_js.PptxHandler();
|
|
4011
4011
|
const parsed = await handler.load(buffer, { allowExternalImages });
|
|
4012
4012
|
if (cancelled || token !== renderTokenRef.current) {
|
|
4013
4013
|
handler.dispose();
|
|
@@ -4019,7 +4019,7 @@ function useLoadContent({
|
|
|
4019
4019
|
handlerRef.current = null;
|
|
4020
4020
|
const mediaElements = [];
|
|
4021
4021
|
for (const slide of parsed.slides) {
|
|
4022
|
-
|
|
4022
|
+
chunkLY5535CF_js.collectMediaElements(slide.elements, mediaElements);
|
|
4023
4023
|
}
|
|
4024
4024
|
for (const url of mediaDataUrls.values()) {
|
|
4025
4025
|
if (url.startsWith("blob:")) {
|
|
@@ -4029,7 +4029,7 @@ function useLoadContent({
|
|
|
4029
4029
|
mediaDataUrls.clear();
|
|
4030
4030
|
await Promise.all(
|
|
4031
4031
|
mediaElements.map(async (mediaElement) => {
|
|
4032
|
-
const resolved = await
|
|
4032
|
+
const resolved = await chunkLY5535CF_js.resolveMediaElementSource(mediaElement, handler);
|
|
4033
4033
|
if (resolved.missing || !resolved.mediaPath || !resolved.url) {
|
|
4034
4034
|
mediaElement.mediaMissing = true;
|
|
4035
4035
|
return;
|
|
@@ -4040,7 +4040,7 @@ function useLoadContent({
|
|
|
4040
4040
|
}
|
|
4041
4041
|
})
|
|
4042
4042
|
);
|
|
4043
|
-
const { paths: imagePaths, refs: imageRefs } =
|
|
4043
|
+
const { paths: imagePaths, refs: imageRefs } = chunkLY5535CF_js.collectImagePaths(parsed.slides);
|
|
4044
4044
|
let nextSlides = parsed.slides;
|
|
4045
4045
|
if (imagePaths.size > 0) {
|
|
4046
4046
|
const resolvedMap = /* @__PURE__ */ new Map();
|
|
@@ -4056,25 +4056,25 @@ function useLoadContent({
|
|
|
4056
4056
|
})
|
|
4057
4057
|
);
|
|
4058
4058
|
nextSlides = parsed.slides.map((s) => {
|
|
4059
|
-
const newElements =
|
|
4059
|
+
const newElements = chunkLY5535CF_js.applyImagePathPatches(s.elements, resolvedMap, imageRefs);
|
|
4060
4060
|
return newElements === s.elements ? s : { ...s, elements: newElements };
|
|
4061
4061
|
});
|
|
4062
4062
|
}
|
|
4063
|
-
nextSlides = await
|
|
4063
|
+
nextSlides = await chunkLY5535CF_js.resolveTableCellImageUrls(
|
|
4064
4064
|
nextSlides,
|
|
4065
4065
|
(path) => handler.getImageData(path)
|
|
4066
4066
|
);
|
|
4067
|
-
const nextTableStyleMap = await
|
|
4067
|
+
const nextTableStyleMap = await chunkLY5535CF_js.resolveTableStyleImageUrls(
|
|
4068
4068
|
parsed.tableStyleMap,
|
|
4069
4069
|
(path) => handler.getImageData(path)
|
|
4070
4070
|
);
|
|
4071
4071
|
handlerRef.current = handler;
|
|
4072
|
-
const partition =
|
|
4072
|
+
const partition = chunkLY5535CF_js.partitionTemplateElements(nextSlides);
|
|
4073
4073
|
setSlides(partition.slides);
|
|
4074
4074
|
setTemplateElementsBySlideId(partition.templateElementsBySlideId);
|
|
4075
4075
|
setCanvasSize({
|
|
4076
|
-
width: parsed.width ??
|
|
4077
|
-
height: parsed.height ??
|
|
4076
|
+
width: parsed.width ?? chunkIK25LY4C_js.DEFAULT_CANVAS_WIDTH,
|
|
4077
|
+
height: parsed.height ?? chunkIK25LY4C_js.DEFAULT_CANVAS_HEIGHT
|
|
4078
4078
|
});
|
|
4079
4079
|
setSlideSizeEmu(
|
|
4080
4080
|
typeof parsed.widthEmu === "number" && typeof parsed.heightEmu === "number" && parsed.widthEmu > 0 && parsed.heightEmu > 0 ? {
|
|
@@ -4087,7 +4087,7 @@ function useLoadContent({
|
|
|
4087
4087
|
setLayoutOptions(parsed.layoutOptions ?? []);
|
|
4088
4088
|
setSlideMasters(parsed.slideMasters ?? []);
|
|
4089
4089
|
setModernCommentAuthors(parsed.modernCommentAuthors ?? []);
|
|
4090
|
-
setRecentColors(
|
|
4090
|
+
setRecentColors(chunkLY5535CF_js.seedRecentColors({ mruColors: parsed.mruColors }));
|
|
4091
4091
|
setTheme(parsed.theme);
|
|
4092
4092
|
setTableStyleMap(nextTableStyleMap);
|
|
4093
4093
|
setTableStylesDefaultId(parsed.tableStylesDefaultId);
|
|
@@ -4095,7 +4095,7 @@ function useLoadContent({
|
|
|
4095
4095
|
setThemeOptions(parsed.themeOptions ?? []);
|
|
4096
4096
|
setCustomShows(parsed.customShows ?? []);
|
|
4097
4097
|
setActiveCustomShowId(
|
|
4098
|
-
|
|
4098
|
+
chunkLY5535CF_js.resolveAuthoredCustomShowId(parsed.presentationProperties, parsed.customShows) ?? null
|
|
4099
4099
|
);
|
|
4100
4100
|
setSections(parsed.sections ?? []);
|
|
4101
4101
|
setPresentationProperties(parsed.presentationProperties ?? {});
|
|
@@ -4118,11 +4118,11 @@ function useLoadContent({
|
|
|
4118
4118
|
setHasMacros(parsed.hasMacros === true);
|
|
4119
4119
|
setHasDigitalSignatures(parsed.hasDigitalSignatures === true);
|
|
4120
4120
|
setDigitalSignatureCount(parsed.digitalSignatureCount ?? 0);
|
|
4121
|
-
setGuides(
|
|
4122
|
-
setReadOnlyRecommendation(
|
|
4121
|
+
setGuides(chunkLY5535CF_js.buildInitialGuides(parsed.presentationGuides, parsed.slides[0]?.guides));
|
|
4122
|
+
setReadOnlyRecommendation(chunkLY5535CF_js.readOnlyRecommendation(parsed));
|
|
4123
4123
|
setModifyVerifier(parsed.modifyVerifier ?? void 0);
|
|
4124
4124
|
setCompatToasts(
|
|
4125
|
-
|
|
4125
|
+
chunkLY5535CF_js.compatibilityWarningToasts([
|
|
4126
4126
|
...parsed.warnings ?? [],
|
|
4127
4127
|
...parsed.slides.flatMap((slide) => slide.warnings ?? [])
|
|
4128
4128
|
])
|
|
@@ -4134,7 +4134,7 @@ function useLoadContent({
|
|
|
4134
4134
|
onContentApplied?.();
|
|
4135
4135
|
} catch (err) {
|
|
4136
4136
|
if (!cancelled && token === renderTokenRef.current) {
|
|
4137
|
-
if (err instanceof
|
|
4137
|
+
if (err instanceof chunkLY5535CF_js.EncryptedFileError) {
|
|
4138
4138
|
setIsEncrypted(true);
|
|
4139
4139
|
} else {
|
|
4140
4140
|
console.error("[pptx] Failed to load presentation content:", err);
|
|
@@ -4162,7 +4162,7 @@ function useLoadContent({
|
|
|
4162
4162
|
}
|
|
4163
4163
|
function useAutosave(input) {
|
|
4164
4164
|
const { isDirty, filePath, serializeSlides, enabled = true, getChangeSources } = input;
|
|
4165
|
-
const intervalMs =
|
|
4165
|
+
const intervalMs = chunkLY5535CF_js.resolveAutosaveIntervalMs({
|
|
4166
4166
|
hostIntervalMs: input.intervalMs,
|
|
4167
4167
|
optionsIntervalSeconds: input.intervalSeconds
|
|
4168
4168
|
});
|
|
@@ -4193,7 +4193,7 @@ function useAutosave(input) {
|
|
|
4193
4193
|
return;
|
|
4194
4194
|
}
|
|
4195
4195
|
const sources = changeSourcesRef.current?.() ?? [];
|
|
4196
|
-
if (!
|
|
4196
|
+
if (!chunkLY5535CF_js.shouldWriteAutosaveSnapshot({
|
|
4197
4197
|
filePath: path,
|
|
4198
4198
|
isDirty: isDirtyRef.current,
|
|
4199
4199
|
saving: isSavingRef.current,
|
|
@@ -4211,8 +4211,8 @@ function useAutosave(input) {
|
|
|
4211
4211
|
isSavingRef.current = false;
|
|
4212
4212
|
return;
|
|
4213
4213
|
}
|
|
4214
|
-
await
|
|
4215
|
-
lastSnapshotRef.current =
|
|
4214
|
+
await chunkLY5535CF_js.saveAutosaveSnapshot(path, data);
|
|
4215
|
+
lastSnapshotRef.current = chunkLY5535CF_js.autosaveSnapshotMark(path, sources);
|
|
4216
4216
|
setAutosaveStatus({ state: "saved", timestamp: Date.now() });
|
|
4217
4217
|
} catch (err) {
|
|
4218
4218
|
setAutosaveStatus({
|
|
@@ -4266,13 +4266,13 @@ function useElementOperations(input) {
|
|
|
4266
4266
|
inlineEditingText
|
|
4267
4267
|
} = input;
|
|
4268
4268
|
const liveTextSegments = react.useCallback(() => {
|
|
4269
|
-
if (!selectedElement || !
|
|
4269
|
+
if (!selectedElement || !chunkLY5535CF_js.hasTextProperties(selectedElement)) {
|
|
4270
4270
|
return void 0;
|
|
4271
4271
|
}
|
|
4272
4272
|
if (selectedElement.id !== inlineEditingElementId) {
|
|
4273
4273
|
return selectedElement.textSegments;
|
|
4274
4274
|
}
|
|
4275
|
-
return
|
|
4275
|
+
return chunkLY5535CF_js.remapTextToSegments(
|
|
4276
4276
|
inlineEditingText,
|
|
4277
4277
|
selectedElement.textSegments,
|
|
4278
4278
|
selectedElement.textStyle
|
|
@@ -4313,11 +4313,11 @@ function useElementOperations(input) {
|
|
|
4313
4313
|
(elementId, updates) => {
|
|
4314
4314
|
if (masterView?.target) {
|
|
4315
4315
|
applyMasterViewWrite(
|
|
4316
|
-
|
|
4316
|
+
chunkLY5535CF_js.updateMasterViewElement(masterView, masterView.target, elementId, updates)
|
|
4317
4317
|
);
|
|
4318
4318
|
return;
|
|
4319
4319
|
}
|
|
4320
|
-
if (
|
|
4320
|
+
if (chunkLY5535CF_js.isTemplateElementId(elementId)) {
|
|
4321
4321
|
const slideId = activeSlide?.id;
|
|
4322
4322
|
if (slideId) {
|
|
4323
4323
|
setTemplateElementsBySlideId((prev) => ({
|
|
@@ -4328,7 +4328,7 @@ function useElementOperations(input) {
|
|
|
4328
4328
|
}));
|
|
4329
4329
|
}
|
|
4330
4330
|
} else {
|
|
4331
|
-
setSlides((prev) =>
|
|
4331
|
+
setSlides((prev) => chunkLY5535CF_js.updateElement(prev, activeSlideIndex, elementId, updates));
|
|
4332
4332
|
}
|
|
4333
4333
|
history.markDirty();
|
|
4334
4334
|
},
|
|
@@ -4353,7 +4353,7 @@ function useElementOperations(input) {
|
|
|
4353
4353
|
);
|
|
4354
4354
|
const updateSelectedShapeStyle = react.useCallback(
|
|
4355
4355
|
(updates) => {
|
|
4356
|
-
if (!selectedElement || !
|
|
4356
|
+
if (!selectedElement || !chunkLY5535CF_js.hasShapeProperties(selectedElement)) {
|
|
4357
4357
|
return;
|
|
4358
4358
|
}
|
|
4359
4359
|
updateSelectedElement({
|
|
@@ -4364,19 +4364,19 @@ function useElementOperations(input) {
|
|
|
4364
4364
|
);
|
|
4365
4365
|
const updateSelectedTextStyle = react.useCallback(
|
|
4366
4366
|
(updates) => {
|
|
4367
|
-
if (!selectedElement || !
|
|
4367
|
+
if (!selectedElement || !chunkLY5535CF_js.hasTextProperties(selectedElement)) {
|
|
4368
4368
|
return;
|
|
4369
4369
|
}
|
|
4370
4370
|
const isLiveEditing = selectedElement.id === inlineEditingElementId;
|
|
4371
4371
|
const currentSegments = liveTextSegments();
|
|
4372
|
-
const inlineSel =
|
|
4372
|
+
const inlineSel = chunkLY5535CF_js.getInlineEditorSelection(currentSegments);
|
|
4373
4373
|
if (inlineSel && currentSegments) {
|
|
4374
|
-
const { newSegments: newSegments2, newSelection } =
|
|
4374
|
+
const { newSegments: newSegments2, newSelection } = chunkLY5535CF_js.applyStyleToSelectedSegments(
|
|
4375
4375
|
currentSegments,
|
|
4376
4376
|
inlineSel,
|
|
4377
4377
|
updates
|
|
4378
4378
|
);
|
|
4379
|
-
|
|
4379
|
+
chunkLY5535CF_js.setPendingSelectionRestore(newSelection);
|
|
4380
4380
|
updateSelectedElement({
|
|
4381
4381
|
textSegments: newSegments2,
|
|
4382
4382
|
...isLiveEditing ? { text: inlineEditingText } : {}
|
|
@@ -4404,14 +4404,14 @@ function useElementOperations(input) {
|
|
|
4404
4404
|
);
|
|
4405
4405
|
const updateSelectedTextCase = react.useCallback(
|
|
4406
4406
|
(mode) => {
|
|
4407
|
-
if (!selectedElement || !
|
|
4407
|
+
if (!selectedElement || !chunkLY5535CF_js.hasTextProperties(selectedElement)) {
|
|
4408
4408
|
return;
|
|
4409
4409
|
}
|
|
4410
4410
|
const isLiveEditing = selectedElement.id === inlineEditingElementId;
|
|
4411
4411
|
const currentSegments = liveTextSegments();
|
|
4412
|
-
const inlineSel =
|
|
4412
|
+
const inlineSel = chunkLY5535CF_js.getInlineEditorSelection(currentSegments);
|
|
4413
4413
|
if (inlineSel && currentSegments) {
|
|
4414
|
-
const newSegments =
|
|
4414
|
+
const newSegments = chunkLY5535CF_js.applyCaseTransformToSegments(currentSegments, inlineSel, mode);
|
|
4415
4415
|
updateSelectedElement({
|
|
4416
4416
|
textSegments: newSegments,
|
|
4417
4417
|
...isLiveEditing ? { text: inlineEditingText } : {}
|
|
@@ -4420,7 +4420,7 @@ function useElementOperations(input) {
|
|
|
4420
4420
|
}
|
|
4421
4421
|
const updates = {};
|
|
4422
4422
|
if (currentSegments && currentSegments.length > 0) {
|
|
4423
|
-
updates.textSegments =
|
|
4423
|
+
updates.textSegments = chunkLY5535CF_js.applyCaseTransformToSegments(
|
|
4424
4424
|
currentSegments,
|
|
4425
4425
|
null,
|
|
4426
4426
|
mode
|
|
@@ -4428,7 +4428,7 @@ function useElementOperations(input) {
|
|
|
4428
4428
|
}
|
|
4429
4429
|
const baseText = isLiveEditing ? inlineEditingText : selectedElement.text;
|
|
4430
4430
|
if (typeof baseText === "string") {
|
|
4431
|
-
updates.text =
|
|
4431
|
+
updates.text = chunkLY5535CF_js.transformTextCase(baseText, mode);
|
|
4432
4432
|
}
|
|
4433
4433
|
updateSelectedElement(updates);
|
|
4434
4434
|
},
|
|
@@ -4447,15 +4447,15 @@ function useElementOperations(input) {
|
|
|
4447
4447
|
[setSlides]
|
|
4448
4448
|
);
|
|
4449
4449
|
const masterViewTarget = masterView?.target ?? null;
|
|
4450
|
-
const activeElements = masterViewTarget ?
|
|
4450
|
+
const activeElements = masterViewTarget ? chunkLY5535CF_js.masterViewElements(masterView, masterViewTarget) : editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
4451
4451
|
const updateActiveElements = react.useCallback(
|
|
4452
4452
|
(updater) => {
|
|
4453
4453
|
if (masterView?.target) {
|
|
4454
4454
|
applyMasterViewWrite(
|
|
4455
|
-
|
|
4455
|
+
chunkLY5535CF_js.replaceMasterViewElements(
|
|
4456
4456
|
masterView,
|
|
4457
4457
|
masterView.target,
|
|
4458
|
-
updater(
|
|
4458
|
+
updater(chunkLY5535CF_js.masterViewElements(masterView, masterView.target))
|
|
4459
4459
|
)
|
|
4460
4460
|
);
|
|
4461
4461
|
return;
|
|
@@ -4508,7 +4508,7 @@ function useSectionOperations(input) {
|
|
|
4508
4508
|
const { sections, setSections, slides, setSlides, markDirty } = input;
|
|
4509
4509
|
const addSection2 = react.useCallback(
|
|
4510
4510
|
(name, afterSlideIndex) => {
|
|
4511
|
-
const result =
|
|
4511
|
+
const result = chunkLY5535CF_js.addSection(sections, slides, name, afterSlideIndex);
|
|
4512
4512
|
setSlides(result.slides);
|
|
4513
4513
|
setSections(result.sections);
|
|
4514
4514
|
markDirty();
|
|
@@ -4517,7 +4517,7 @@ function useSectionOperations(input) {
|
|
|
4517
4517
|
);
|
|
4518
4518
|
const renameSection2 = react.useCallback(
|
|
4519
4519
|
(sectionId, newName) => {
|
|
4520
|
-
const result =
|
|
4520
|
+
const result = chunkLY5535CF_js.renameSection(sections, slides, sectionId, newName);
|
|
4521
4521
|
setSections(result.sections);
|
|
4522
4522
|
setSlides(result.slides);
|
|
4523
4523
|
markDirty();
|
|
@@ -4526,7 +4526,7 @@ function useSectionOperations(input) {
|
|
|
4526
4526
|
);
|
|
4527
4527
|
const deleteSection2 = react.useCallback(
|
|
4528
4528
|
(sectionId) => {
|
|
4529
|
-
const result =
|
|
4529
|
+
const result = chunkLY5535CF_js.deleteSection(sections, slides, sectionId);
|
|
4530
4530
|
setSections(result.sections);
|
|
4531
4531
|
setSlides(result.slides);
|
|
4532
4532
|
markDirty();
|
|
@@ -4535,21 +4535,21 @@ function useSectionOperations(input) {
|
|
|
4535
4535
|
);
|
|
4536
4536
|
const moveSectionUp2 = react.useCallback(
|
|
4537
4537
|
(sectionId) => {
|
|
4538
|
-
setSections(
|
|
4538
|
+
setSections(chunkLY5535CF_js.moveSectionUp(sections, sectionId));
|
|
4539
4539
|
markDirty();
|
|
4540
4540
|
},
|
|
4541
4541
|
[sections, setSections, markDirty]
|
|
4542
4542
|
);
|
|
4543
4543
|
const moveSectionDown2 = react.useCallback(
|
|
4544
4544
|
(sectionId) => {
|
|
4545
|
-
setSections(
|
|
4545
|
+
setSections(chunkLY5535CF_js.moveSectionDown(sections, sectionId));
|
|
4546
4546
|
markDirty();
|
|
4547
4547
|
},
|
|
4548
4548
|
[sections, setSections, markDirty]
|
|
4549
4549
|
);
|
|
4550
4550
|
const moveSlidesToSection2 = react.useCallback(
|
|
4551
4551
|
(slideIndexes, targetSectionId) => {
|
|
4552
|
-
const result =
|
|
4552
|
+
const result = chunkLY5535CF_js.moveSlidesToSection(sections, slides, slideIndexes, targetSectionId);
|
|
4553
4553
|
setSlides(result.slides);
|
|
4554
4554
|
setSections(result.sections);
|
|
4555
4555
|
markDirty();
|
|
@@ -4615,15 +4615,15 @@ function syncSelectionHandleOverlay(elementNode, elementId, geometry) {
|
|
|
4615
4615
|
// src/viewer/hooks/pointer-move-handlers.ts
|
|
4616
4616
|
function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx, lockAspect = false) {
|
|
4617
4617
|
const startBox = { x: startX, y: startY, width: startWidth, height: startHeight };
|
|
4618
|
-
let resized =
|
|
4618
|
+
let resized = chunkLY5535CF_js.applyResize(startBox, handle, dx, dy, 1, { minSize: chunkIK25LY4C_js.MIN_ELEMENT_SIZE });
|
|
4619
4619
|
if (lockAspect) {
|
|
4620
|
-
resized =
|
|
4620
|
+
resized = chunkLY5535CF_js.lockResizeAspect(resized, startBox, handle, chunkIK25LY4C_js.MIN_ELEMENT_SIZE);
|
|
4621
4621
|
}
|
|
4622
4622
|
const box = { x: resized.x, y: resized.y, width: resized.width, height: resized.height };
|
|
4623
4623
|
if (!snapToGrid) {
|
|
4624
4624
|
return box;
|
|
4625
4625
|
}
|
|
4626
|
-
return
|
|
4626
|
+
return chunkLY5535CF_js.snapBoxToGrid(box, handle, gridSpacingPx, chunkIK25LY4C_js.MIN_ELEMENT_SIZE);
|
|
4627
4627
|
}
|
|
4628
4628
|
function resolveLiveTarget(input) {
|
|
4629
4629
|
const { livePatcher, editTemplateMode, activeSlide } = input;
|
|
@@ -4736,7 +4736,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4736
4736
|
width: el.width,
|
|
4737
4737
|
height: el.height
|
|
4738
4738
|
}));
|
|
4739
|
-
const snapResult =
|
|
4739
|
+
const snapResult = chunkLY5535CF_js.computeSnapToShape(
|
|
4740
4740
|
targetX,
|
|
4741
4741
|
targetY,
|
|
4742
4742
|
primaryEl.width,
|
|
@@ -4778,7 +4778,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4778
4778
|
if (live) {
|
|
4779
4779
|
for (const id of Object.keys(drag.startPositionsById)) {
|
|
4780
4780
|
const start = drag.startPositionsById[id];
|
|
4781
|
-
|
|
4781
|
+
chunkLY5535CF_js.publishLiveGeometry(live.patcher, live.slideId, id, {
|
|
4782
4782
|
x: start.x + appliedDx,
|
|
4783
4783
|
y: start.y + appliedDy
|
|
4784
4784
|
});
|
|
@@ -4810,8 +4810,8 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4810
4810
|
rs.lastY = geo.y;
|
|
4811
4811
|
rs.lastWidth = geo.width;
|
|
4812
4812
|
rs.lastHeight = geo.height;
|
|
4813
|
-
const width = Math.max(geo.width,
|
|
4814
|
-
const height = Math.max(geo.height,
|
|
4813
|
+
const width = Math.max(geo.width, chunkIK25LY4C_js.MIN_ELEMENT_SIZE);
|
|
4814
|
+
const height = Math.max(geo.height, chunkIK25LY4C_js.MIN_ELEMENT_SIZE);
|
|
4815
4815
|
if (rs.domEl) {
|
|
4816
4816
|
rs.domEl.style.left = `${geo.x}px`;
|
|
4817
4817
|
rs.domEl.style.top = `${geo.y}px`;
|
|
@@ -4820,7 +4820,7 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4820
4820
|
syncSelectionHandleOverlay(rs.domEl, rs.elementId, { x: geo.x, y: geo.y, width, height });
|
|
4821
4821
|
}
|
|
4822
4822
|
if (live) {
|
|
4823
|
-
|
|
4823
|
+
chunkLY5535CF_js.publishLiveGeometry(live.patcher, live.slideId, rs.elementId, {
|
|
4824
4824
|
x: geo.x,
|
|
4825
4825
|
y: geo.y,
|
|
4826
4826
|
width,
|
|
@@ -4831,7 +4831,7 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4831
4831
|
function processAdjustmentMove(e, adj, editorScale, updateElementById) {
|
|
4832
4832
|
const dx = (e.clientX - adj.startClientX) / editorScale;
|
|
4833
4833
|
const dy = (e.clientY - adj.startClientY) / editorScale;
|
|
4834
|
-
const adjustments =
|
|
4834
|
+
const adjustments = chunkLY5535CF_js.getDraggedShapeAdjustments(adj, dx, dy);
|
|
4835
4835
|
if (!adj.moved && Math.hypot(dx, dy) > 2) {
|
|
4836
4836
|
adj.moved = true;
|
|
4837
4837
|
}
|
|
@@ -4906,13 +4906,13 @@ function processPointerUp(input) {
|
|
|
4906
4906
|
if (i !== activeSlideIndex) {
|
|
4907
4907
|
return s;
|
|
4908
4908
|
}
|
|
4909
|
-
const rerouted =
|
|
4909
|
+
const rerouted = chunkLY5535CF_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
|
|
4910
4910
|
if (rerouted.length === 0) {
|
|
4911
4911
|
return s;
|
|
4912
4912
|
}
|
|
4913
4913
|
return {
|
|
4914
4914
|
...s,
|
|
4915
|
-
elements:
|
|
4915
|
+
elements: chunkLY5535CF_js.applyReroutedConnectors(s.elements, rerouted)
|
|
4916
4916
|
};
|
|
4917
4917
|
})
|
|
4918
4918
|
);
|
|
@@ -4937,9 +4937,9 @@ function processPointerUp(input) {
|
|
|
4937
4937
|
}
|
|
4938
4938
|
function commitMarquee(marquee, editTemplateMode, templateElements, activeSlide, applySelection, clearSelection) {
|
|
4939
4939
|
const sourceElements = editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
4940
|
-
const hitIds =
|
|
4940
|
+
const hitIds = chunkLY5535CF_js.computeMarqueeHitIds(marquee, sourceElements);
|
|
4941
4941
|
if (marquee.additive) {
|
|
4942
|
-
const merged =
|
|
4942
|
+
const merged = chunkLY5535CF_js.mergeAdditiveSelection(marquee.baseSelectionIds, hitIds);
|
|
4943
4943
|
if (merged.length > 0) {
|
|
4944
4944
|
applySelection(merged[0], merged);
|
|
4945
4945
|
} else {
|
|
@@ -4962,8 +4962,8 @@ function commitDrag(drag, editTemplateMode, activeSlide, activeSlideIndex, setTe
|
|
|
4962
4962
|
}
|
|
4963
4963
|
return { ...el, x: start.x + dx, y: start.y + dy };
|
|
4964
4964
|
});
|
|
4965
|
-
const rerouted =
|
|
4966
|
-
return
|
|
4965
|
+
const rerouted = chunkLY5535CF_js.rerouteConnectorsForMovedElements(movedElements, movedIds);
|
|
4966
|
+
return chunkLY5535CF_js.applyReroutedConnectors(movedElements, rerouted);
|
|
4967
4967
|
};
|
|
4968
4968
|
if (editTemplateMode) {
|
|
4969
4969
|
const slideId = activeSlide?.id;
|
|
@@ -5119,12 +5119,12 @@ function useCanvasInteractions(input) {
|
|
|
5119
5119
|
return;
|
|
5120
5120
|
}
|
|
5121
5121
|
const el = elementLookup.get(editId);
|
|
5122
|
-
if (el &&
|
|
5122
|
+
if (el && chunkLY5535CF_js.hasTextProperties(el)) {
|
|
5123
5123
|
const committedText = transformCommittedText ? transformCommittedText(inlineEditingText) : inlineEditingText;
|
|
5124
|
-
const newSegments =
|
|
5124
|
+
const newSegments = chunkLY5535CF_js.remapTextToSegments(committedText, el.textSegments, el.textStyle);
|
|
5125
5125
|
const editorEl = document.querySelector("[data-inline-editor]");
|
|
5126
|
-
const newHeight =
|
|
5127
|
-
const shrink =
|
|
5126
|
+
const newHeight = chunkLY5535CF_js.resolveInlineEditAutoFitHeight(el.textStyle, el.height, editorEl);
|
|
5127
|
+
const shrink = chunkLY5535CF_js.resolveInlineEditNormAutofitShrink(el.textStyle, el.height, editorEl);
|
|
5128
5128
|
ops.updateElementById(editId, {
|
|
5129
5129
|
text: committedText,
|
|
5130
5130
|
textSegments: newSegments,
|
|
@@ -5143,7 +5143,7 @@ function useCanvasInteractions(input) {
|
|
|
5143
5143
|
setInlineEditingText("");
|
|
5144
5144
|
};
|
|
5145
5145
|
const openEquationEditorForElement = (el) => {
|
|
5146
|
-
if (!
|
|
5146
|
+
if (!chunkLY5535CF_js.hasTextProperties(el)) {
|
|
5147
5147
|
return false;
|
|
5148
5148
|
}
|
|
5149
5149
|
const eqSeg = el.textSegments?.find((seg) => seg.equationXml);
|
|
@@ -5173,7 +5173,7 @@ function useCanvasInteractions(input) {
|
|
|
5173
5173
|
justInteractedRef.current = false;
|
|
5174
5174
|
} else {
|
|
5175
5175
|
const el = elementLookup.get(elementId);
|
|
5176
|
-
if (el &&
|
|
5176
|
+
if (el && chunkLY5535CF_js.hasTextProperties(el) && chunkLY5535CF_js.canInteractWithElement(el, "textEdit")) {
|
|
5177
5177
|
if (!openEquationEditorForElement(el)) {
|
|
5178
5178
|
setInlineEditingElementId(elementId);
|
|
5179
5179
|
setInlineEditingText(el.text ?? "");
|
|
@@ -5192,7 +5192,7 @@ function useCanvasInteractions(input) {
|
|
|
5192
5192
|
if (openEquationEditorForElement(el)) {
|
|
5193
5193
|
return;
|
|
5194
5194
|
}
|
|
5195
|
-
if (
|
|
5195
|
+
if (chunkLY5535CF_js.hasTextProperties(el) && chunkLY5535CF_js.canInteractWithElement(el, "textEdit")) {
|
|
5196
5196
|
setInlineEditingElementId(elementId);
|
|
5197
5197
|
setInlineEditingText(el.text ?? "");
|
|
5198
5198
|
}
|
|
@@ -5215,7 +5215,7 @@ function useCanvasInteractions(input) {
|
|
|
5215
5215
|
justSelectedRef.current = false;
|
|
5216
5216
|
}
|
|
5217
5217
|
const ids = !wasSelected ? [elementId] : effectiveSelectedIds.length ? effectiveSelectedIds : [elementId];
|
|
5218
|
-
const movableIds =
|
|
5218
|
+
const movableIds = chunkLY5535CF_js.filterInteractableIds(ids, (id) => elementLookup.get(id), "move");
|
|
5219
5219
|
if (movableIds.length === 0) {
|
|
5220
5220
|
return;
|
|
5221
5221
|
}
|
|
@@ -5285,7 +5285,7 @@ function useCanvasInteractions(input) {
|
|
|
5285
5285
|
const handleResizePointerDown = (elementId, e, handle) => {
|
|
5286
5286
|
e.stopPropagation();
|
|
5287
5287
|
const el = elementLookup.get(elementId);
|
|
5288
|
-
if (!el || !
|
|
5288
|
+
if (!el || !chunkLY5535CF_js.canInteractWithElement(el, "resize")) {
|
|
5289
5289
|
return;
|
|
5290
5290
|
}
|
|
5291
5291
|
resizeStateRef.current = {
|
|
@@ -5307,7 +5307,7 @@ function useCanvasInteractions(input) {
|
|
|
5307
5307
|
};
|
|
5308
5308
|
const handleRotate = (elementId, rotationDeg) => {
|
|
5309
5309
|
const el = elementLookup.get(elementId);
|
|
5310
|
-
if (!el || !
|
|
5310
|
+
if (!el || !chunkLY5535CF_js.canInteractWithElement(el, "rotate")) {
|
|
5311
5311
|
return;
|
|
5312
5312
|
}
|
|
5313
5313
|
ops.updateElementById(elementId, { rotation: rotationDeg });
|
|
@@ -5327,10 +5327,10 @@ function useCanvasInteractions(input) {
|
|
|
5327
5327
|
const handleAdjustmentPointerDown = (elementId, e, descriptor) => {
|
|
5328
5328
|
e.stopPropagation();
|
|
5329
5329
|
const el = elementLookup.get(elementId);
|
|
5330
|
-
if (!el || !
|
|
5330
|
+
if (!el || !chunkLY5535CF_js.canInteractWithElement(el, "adjustHandle")) {
|
|
5331
5331
|
return;
|
|
5332
5332
|
}
|
|
5333
|
-
shapeAdjustmentDragStateRef.current =
|
|
5333
|
+
shapeAdjustmentDragStateRef.current = chunkLY5535CF_js.beginShapeAdjustment(
|
|
5334
5334
|
el,
|
|
5335
5335
|
descriptor,
|
|
5336
5336
|
e.clientX,
|
|
@@ -5377,7 +5377,7 @@ function createFileHandlers(deps) {
|
|
|
5377
5377
|
h = Math.round(h * scale);
|
|
5378
5378
|
}
|
|
5379
5379
|
addElement({
|
|
5380
|
-
id:
|
|
5380
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
5381
5381
|
type: "image",
|
|
5382
5382
|
x: Math.round((canvasSize.width - w) / 2),
|
|
5383
5383
|
y: Math.round((canvasSize.height - h) / 2),
|
|
@@ -5388,7 +5388,7 @@ function createFileHandlers(deps) {
|
|
|
5388
5388
|
};
|
|
5389
5389
|
img.onerror = () => {
|
|
5390
5390
|
addElement({
|
|
5391
|
-
id:
|
|
5391
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
5392
5392
|
type: "image",
|
|
5393
5393
|
x: 100,
|
|
5394
5394
|
y: 100,
|
|
@@ -5407,14 +5407,14 @@ function createFileHandlers(deps) {
|
|
|
5407
5407
|
return;
|
|
5408
5408
|
}
|
|
5409
5409
|
e.target.value = "";
|
|
5410
|
-
const mediaType =
|
|
5410
|
+
const mediaType = chunkLY5535CF_js.classifyMediaType(file.type);
|
|
5411
5411
|
if (!mediaType) {
|
|
5412
5412
|
return;
|
|
5413
5413
|
}
|
|
5414
5414
|
const elFilePath = file.path;
|
|
5415
5415
|
const insertMediaElement = (mediaSourceUrl, width, height) => {
|
|
5416
5416
|
addElement({
|
|
5417
|
-
id:
|
|
5417
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
5418
5418
|
type: "media",
|
|
5419
5419
|
mediaType,
|
|
5420
5420
|
mediaMimeType: file.type || void 0,
|
|
@@ -5589,13 +5589,13 @@ function createStructuredElementHandlers(deps) {
|
|
|
5589
5589
|
return;
|
|
5590
5590
|
}
|
|
5591
5591
|
addElement({
|
|
5592
|
-
id:
|
|
5592
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
5593
5593
|
type: "smartArt",
|
|
5594
5594
|
x: 100,
|
|
5595
5595
|
y: 120,
|
|
5596
5596
|
width: 600,
|
|
5597
5597
|
height: 340,
|
|
5598
|
-
smartArtData:
|
|
5598
|
+
smartArtData: chunkLY5535CF_js.buildSmartArtPresetData(
|
|
5599
5599
|
layout,
|
|
5600
5600
|
defaultItems,
|
|
5601
5601
|
(i) => `node-${Date.now()}-${i}-${Math.random().toString(36).slice(2, 8)}`
|
|
@@ -5607,7 +5607,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5607
5607
|
return;
|
|
5608
5608
|
}
|
|
5609
5609
|
addElement({
|
|
5610
|
-
id:
|
|
5610
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
5611
5611
|
type: "shape",
|
|
5612
5612
|
x: 120,
|
|
5613
5613
|
y: 200,
|
|
@@ -5645,7 +5645,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5645
5645
|
return;
|
|
5646
5646
|
}
|
|
5647
5647
|
const resolved = resolveHyperlinkEditResult(data);
|
|
5648
|
-
if (resolved.url && !
|
|
5648
|
+
if (resolved.url && !chunkLY5535CF_js.isUrlSafe(resolved.url)) {
|
|
5649
5649
|
return;
|
|
5650
5650
|
}
|
|
5651
5651
|
const actionClick = {
|
|
@@ -5669,7 +5669,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5669
5669
|
const displayText = value || fieldTexts[fieldType] || fieldType;
|
|
5670
5670
|
const fieldGuid = `{${crypto.randomUUID().toUpperCase()}}`;
|
|
5671
5671
|
addElement({
|
|
5672
|
-
id:
|
|
5672
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
5673
5673
|
type: "shape",
|
|
5674
5674
|
x: 120,
|
|
5675
5675
|
y: 200,
|
|
@@ -5691,11 +5691,11 @@ function createStructuredElementHandlers(deps) {
|
|
|
5691
5691
|
if (!activeSlide) {
|
|
5692
5692
|
return;
|
|
5693
5693
|
}
|
|
5694
|
-
const preset =
|
|
5694
|
+
const preset = chunkLY5535CF_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
|
|
5695
5695
|
if (!preset) {
|
|
5696
5696
|
return;
|
|
5697
5697
|
}
|
|
5698
|
-
const defaultPptxAction =
|
|
5698
|
+
const defaultPptxAction = chunkLY5535CF_js.elementActionToPptxAction({
|
|
5699
5699
|
trigger: "click",
|
|
5700
5700
|
type: preset.defaultAction
|
|
5701
5701
|
});
|
|
@@ -5704,7 +5704,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5704
5704
|
defaultPptxAction.highlightClick = true;
|
|
5705
5705
|
}
|
|
5706
5706
|
addElement({
|
|
5707
|
-
id:
|
|
5707
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
5708
5708
|
type: "shape",
|
|
5709
5709
|
x: 150,
|
|
5710
5710
|
y: 150,
|
|
@@ -5771,14 +5771,14 @@ function useInsertElements(input) {
|
|
|
5771
5771
|
return;
|
|
5772
5772
|
}
|
|
5773
5773
|
addElement({
|
|
5774
|
-
id:
|
|
5774
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
5775
5775
|
type: "text",
|
|
5776
5776
|
x: 100,
|
|
5777
5777
|
y: 100,
|
|
5778
5778
|
width: 300,
|
|
5779
5779
|
height: 60,
|
|
5780
5780
|
text: "",
|
|
5781
|
-
textStyle: { fontSize:
|
|
5781
|
+
textStyle: { fontSize: chunkIK25LY4C_js.DEFAULT_TEXT_FONT_SIZE }
|
|
5782
5782
|
});
|
|
5783
5783
|
};
|
|
5784
5784
|
const handleAddShape = () => {
|
|
@@ -5786,7 +5786,7 @@ function useInsertElements(input) {
|
|
|
5786
5786
|
return;
|
|
5787
5787
|
}
|
|
5788
5788
|
addElement({
|
|
5789
|
-
id:
|
|
5789
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
5790
5790
|
type: "shape",
|
|
5791
5791
|
x: 150,
|
|
5792
5792
|
y: 150,
|
|
@@ -5805,15 +5805,15 @@ function useInsertElements(input) {
|
|
|
5805
5805
|
return;
|
|
5806
5806
|
}
|
|
5807
5807
|
addElement({
|
|
5808
|
-
...
|
|
5809
|
-
id:
|
|
5808
|
+
...chunkLY5535CF_js.newTableElement(chunkIK25LY4C_js.DEFAULT_TABLE_ROWS, chunkIK25LY4C_js.DEFAULT_TABLE_COLUMNS, 100, 200),
|
|
5809
|
+
id: chunkLY5535CF_js.generateElementId()
|
|
5810
5810
|
});
|
|
5811
5811
|
};
|
|
5812
5812
|
const handleAddChart = (chartKind) => {
|
|
5813
5813
|
if (!activeSlide) {
|
|
5814
5814
|
return;
|
|
5815
5815
|
}
|
|
5816
|
-
addElement(
|
|
5816
|
+
addElement(chunkLY5535CF_js.createDefaultChartElement(chartKind));
|
|
5817
5817
|
};
|
|
5818
5818
|
const structured = createStructuredElementHandlers({
|
|
5819
5819
|
activeSlide,
|
|
@@ -5883,7 +5883,7 @@ function useClipboardHandlers(input) {
|
|
|
5883
5883
|
if (!selectedElement) {
|
|
5884
5884
|
return;
|
|
5885
5885
|
}
|
|
5886
|
-
setClipboardPayload(
|
|
5886
|
+
setClipboardPayload(chunkLY5535CF_js.buildElementClipboardPayload(selectedElement, editTemplateMode));
|
|
5887
5887
|
};
|
|
5888
5888
|
const handleDelete = () => {
|
|
5889
5889
|
const idsToDelete = effectiveSelectedIds;
|
|
@@ -5900,7 +5900,7 @@ function useClipboardHandlers(input) {
|
|
|
5900
5900
|
handleDelete();
|
|
5901
5901
|
};
|
|
5902
5902
|
const insertClone = (source) => {
|
|
5903
|
-
const clone =
|
|
5903
|
+
const clone = chunkLY5535CF_js.cloneElementForPaste(source, { intoTemplate: editTemplateMode });
|
|
5904
5904
|
ops.updateActiveElements((els) => [...els, clone]);
|
|
5905
5905
|
ops.applySelection(clone.id);
|
|
5906
5906
|
history.markDirty();
|
|
@@ -5935,7 +5935,7 @@ function resolveShapePath(el) {
|
|
|
5935
5935
|
return el.pathData;
|
|
5936
5936
|
}
|
|
5937
5937
|
if ("shapeType" in el && typeof el.shapeType === "string") {
|
|
5938
|
-
const clipPath =
|
|
5938
|
+
const clipPath = chunkLY5535CF_js.getPresetShapeClipPath(el.shapeType);
|
|
5939
5939
|
if (clipPath) {
|
|
5940
5940
|
const svgPath = clipPathToSvgPath(clipPath, el.width, el.height);
|
|
5941
5941
|
if (svgPath) {
|
|
@@ -5986,7 +5986,7 @@ function clipPathToSvgPath(clipPath, width, height) {
|
|
|
5986
5986
|
return parts.join(" ");
|
|
5987
5987
|
}
|
|
5988
5988
|
function transformPathToGlobal(pathData, el) {
|
|
5989
|
-
const polys =
|
|
5989
|
+
const polys = chunkLY5535CF_js.svgPathToPolygons(pathData);
|
|
5990
5990
|
if (polys.length === 0) {
|
|
5991
5991
|
return pathData;
|
|
5992
5992
|
}
|
|
@@ -6006,10 +6006,10 @@ function transformPathToGlobal(pathData, el) {
|
|
|
6006
6006
|
y: pt.y * scaleY + el.y
|
|
6007
6007
|
}))
|
|
6008
6008
|
);
|
|
6009
|
-
return
|
|
6009
|
+
return chunkLY5535CF_js.polygonsToSvgPath(transformed);
|
|
6010
6010
|
}
|
|
6011
6011
|
function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
6012
|
-
const polys =
|
|
6012
|
+
const polys = chunkLY5535CF_js.svgPathToPolygons(pathData);
|
|
6013
6013
|
if (polys.length === 0) {
|
|
6014
6014
|
return pathData;
|
|
6015
6015
|
}
|
|
@@ -6019,10 +6019,10 @@ function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
|
6019
6019
|
y: pt.y - y
|
|
6020
6020
|
}))
|
|
6021
6021
|
);
|
|
6022
|
-
return
|
|
6022
|
+
return chunkLY5535CF_js.polygonsToSvgPath(transformed);
|
|
6023
6023
|
}
|
|
6024
6024
|
function pathBounds(pathData) {
|
|
6025
|
-
const polys =
|
|
6025
|
+
const polys = chunkLY5535CF_js.svgPathToPolygons(pathData);
|
|
6026
6026
|
let minX = Infinity;
|
|
6027
6027
|
let minY = Infinity;
|
|
6028
6028
|
let maxX = -Infinity;
|
|
@@ -6081,7 +6081,7 @@ function useMergeShapesHandler(input) {
|
|
|
6081
6081
|
let allFragments = [];
|
|
6082
6082
|
let remaining = globalPaths[0];
|
|
6083
6083
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
6084
|
-
const frags =
|
|
6084
|
+
const frags = chunkLY5535CF_js.mergeShapes("fragment", remaining, globalPaths[i]);
|
|
6085
6085
|
if (Array.isArray(frags)) {
|
|
6086
6086
|
allFragments = frags;
|
|
6087
6087
|
}
|
|
@@ -6110,7 +6110,7 @@ function useMergeShapesHandler(input) {
|
|
|
6110
6110
|
bounds.height
|
|
6111
6111
|
);
|
|
6112
6112
|
const newEl = {
|
|
6113
|
-
id:
|
|
6113
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
6114
6114
|
type: "shape",
|
|
6115
6115
|
x: bounds.x,
|
|
6116
6116
|
y: bounds.y,
|
|
@@ -6148,7 +6148,7 @@ function useMergeShapesHandler(input) {
|
|
|
6148
6148
|
} else {
|
|
6149
6149
|
let resultPath = globalPaths[0];
|
|
6150
6150
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
6151
|
-
const result =
|
|
6151
|
+
const result = chunkLY5535CF_js.mergeShapes(operation, resultPath, globalPaths[i]);
|
|
6152
6152
|
if (typeof result === "string") {
|
|
6153
6153
|
resultPath = result;
|
|
6154
6154
|
}
|
|
@@ -6169,7 +6169,7 @@ function useMergeShapesHandler(input) {
|
|
|
6169
6169
|
);
|
|
6170
6170
|
const primary = targets[0];
|
|
6171
6171
|
const newEl = {
|
|
6172
|
-
id:
|
|
6172
|
+
id: chunkLY5535CF_js.generateElementId(),
|
|
6173
6173
|
type: "shape",
|
|
6174
6174
|
x: bounds.x,
|
|
6175
6175
|
y: bounds.y,
|
|
@@ -6232,10 +6232,10 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6232
6232
|
if (ids.length < 2 || !activeSlide) {
|
|
6233
6233
|
return;
|
|
6234
6234
|
}
|
|
6235
|
-
if (!selectedElements.every((el) =>
|
|
6235
|
+
if (!selectedElements.every((el) => chunkLY5535CF_js.canInteractWithElement(el, "group"))) {
|
|
6236
6236
|
return;
|
|
6237
6237
|
}
|
|
6238
|
-
const { elements, groupId } =
|
|
6238
|
+
const { elements, groupId } = chunkLY5535CF_js.groupElements(ops.activeElements, ids, chunkLY5535CF_js.generateElementId());
|
|
6239
6239
|
if (groupId === null) {
|
|
6240
6240
|
return;
|
|
6241
6241
|
}
|
|
@@ -6247,15 +6247,15 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6247
6247
|
if (!selectedElement || selectedElement.type !== "group" || !activeSlide) {
|
|
6248
6248
|
return;
|
|
6249
6249
|
}
|
|
6250
|
-
if (!
|
|
6250
|
+
if (!chunkLY5535CF_js.canInteractWithElement(selectedElement, "group")) {
|
|
6251
6251
|
return;
|
|
6252
6252
|
}
|
|
6253
6253
|
const group = selectedElement;
|
|
6254
|
-
const intoTemplate =
|
|
6254
|
+
const intoTemplate = chunkLY5535CF_js.isTemplateElementId(group.id);
|
|
6255
6255
|
const childIds = group.children.map(
|
|
6256
|
-
(child) => intoTemplate ?
|
|
6256
|
+
(child) => intoTemplate ? chunkLY5535CF_js.makeCloneId(true, child.id || group.id) : child.id || chunkLY5535CF_js.generateElementId()
|
|
6257
6257
|
);
|
|
6258
|
-
const { elements, childIds: usedIds } =
|
|
6258
|
+
const { elements, childIds: usedIds } = chunkLY5535CF_js.ungroupElements(
|
|
6259
6259
|
ops.activeElements,
|
|
6260
6260
|
group.id,
|
|
6261
6261
|
childIds,
|
|
@@ -6284,7 +6284,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6284
6284
|
if (!edge) {
|
|
6285
6285
|
return;
|
|
6286
6286
|
}
|
|
6287
|
-
const positions =
|
|
6287
|
+
const positions = chunkLY5535CF_js.alignElements(selectedElements, edge);
|
|
6288
6288
|
for (const [id, pos] of positions) {
|
|
6289
6289
|
const el = elementLookup.get(id);
|
|
6290
6290
|
if (!el) {
|
|
@@ -6302,7 +6302,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6302
6302
|
if (!distAxis) {
|
|
6303
6303
|
return;
|
|
6304
6304
|
}
|
|
6305
|
-
const positions =
|
|
6305
|
+
const positions = chunkLY5535CF_js.distributeElements(selectedElements, distAxis);
|
|
6306
6306
|
for (const [id, pos] of positions) {
|
|
6307
6307
|
const el = elementLookup.get(id);
|
|
6308
6308
|
if (!el) {
|
|
@@ -6313,14 +6313,14 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6313
6313
|
history.markDirty();
|
|
6314
6314
|
};
|
|
6315
6315
|
const canDistribute = selectedElements.length >= 3;
|
|
6316
|
-
const selectionGroupable = selectedElements.every((el) =>
|
|
6316
|
+
const selectionGroupable = selectedElements.every((el) => chunkLY5535CF_js.canInteractWithElement(el, "group"));
|
|
6317
6317
|
const handleMoveLayer = (direction) => {
|
|
6318
6318
|
if (!selectedElement || !activeSlide) {
|
|
6319
6319
|
return;
|
|
6320
6320
|
}
|
|
6321
6321
|
const id = selectedElement.id;
|
|
6322
6322
|
ops.updateActiveElements(
|
|
6323
|
-
(els) => direction === "forward" ?
|
|
6323
|
+
(els) => direction === "forward" ? chunkLY5535CF_js.bringForward(els, id) : direction === "backward" ? chunkLY5535CF_js.sendBackward(els, id) : els
|
|
6324
6324
|
);
|
|
6325
6325
|
history.markDirty();
|
|
6326
6326
|
};
|
|
@@ -6330,7 +6330,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
6330
6330
|
}
|
|
6331
6331
|
const id = selectedElement.id;
|
|
6332
6332
|
ops.updateActiveElements(
|
|
6333
|
-
(els) => direction === "front" ?
|
|
6333
|
+
(els) => direction === "front" ? chunkLY5535CF_js.bringToFront(els, id) : chunkLY5535CF_js.sendToBack(els, id)
|
|
6334
6334
|
);
|
|
6335
6335
|
history.markDirty();
|
|
6336
6336
|
};
|
|
@@ -6464,7 +6464,7 @@ function useSlideManagement(input) {
|
|
|
6464
6464
|
theme
|
|
6465
6465
|
} = input;
|
|
6466
6466
|
const handleAddSlide = () => {
|
|
6467
|
-
const newSlide =
|
|
6467
|
+
const newSlide = chunkLY5535CF_js.createBlankSlide(slides.length + 1);
|
|
6468
6468
|
ops.updateSlides((prev) => {
|
|
6469
6469
|
const next = [...prev];
|
|
6470
6470
|
next.splice(activeSlideIndex + 1, 0, newSlide);
|
|
@@ -6527,7 +6527,7 @@ function useSlideManagement(input) {
|
|
|
6527
6527
|
}
|
|
6528
6528
|
const clone = {
|
|
6529
6529
|
...src,
|
|
6530
|
-
id:
|
|
6530
|
+
id: chunkLY5535CF_js.makeSlideId(),
|
|
6531
6531
|
elements: src.elements.map((el) => ({
|
|
6532
6532
|
...el,
|
|
6533
6533
|
id: `${el.id}-dup-${Math.random().toString(36).slice(2, 6)}`
|
|
@@ -6559,7 +6559,7 @@ function useSlideManagement(input) {
|
|
|
6559
6559
|
const handleInsertSlideFromLayout = (layoutPath, layoutName) => {
|
|
6560
6560
|
const insertAt = activeSlideIndex + 1;
|
|
6561
6561
|
const draft = {
|
|
6562
|
-
...
|
|
6562
|
+
...chunkLY5535CF_js.createBlankSlide(slides.length + 1),
|
|
6563
6563
|
layoutPath,
|
|
6564
6564
|
...layoutName ? { layoutName } : {}
|
|
6565
6565
|
};
|
|
@@ -6592,9 +6592,9 @@ function useSlideManagement(input) {
|
|
|
6592
6592
|
};
|
|
6593
6593
|
const handleInsertSlideFromTemplate = (templateId) => {
|
|
6594
6594
|
const insertAt = activeSlideIndex + 1;
|
|
6595
|
-
const draft =
|
|
6595
|
+
const draft = chunkLY5535CF_js.buildSlideTemplateSlide(templateId, chunkLY5535CF_js.makeSlideId(), slides.length + 1, {
|
|
6596
6596
|
...canvasSize ? { slideWidth: canvasSize.width, slideHeight: canvasSize.height } : {},
|
|
6597
|
-
scheme:
|
|
6597
|
+
scheme: chunkLY5535CF_js.templateSchemeFromTheme(theme?.colorScheme)
|
|
6598
6598
|
});
|
|
6599
6599
|
ops.updateSlides((prev) => insertSlideFromLayoutUpdater(prev, activeSlideIndex, draft));
|
|
6600
6600
|
setActiveSlideIndex(insertAt);
|
|
@@ -6631,7 +6631,7 @@ function createTableMergeHandlers(input) {
|
|
|
6631
6631
|
if (!nextCell || nextCell.hMerge || nextCell.vMerge) {
|
|
6632
6632
|
return;
|
|
6633
6633
|
}
|
|
6634
|
-
const newTableData =
|
|
6634
|
+
const newTableData = chunkLY5535CF_js.mergeCells(
|
|
6635
6635
|
[
|
|
6636
6636
|
{ row: rowIndex, col: columnIndex },
|
|
6637
6637
|
{ row: rowIndex, col: nextColIdx }
|
|
@@ -6639,7 +6639,7 @@ function createTableMergeHandlers(input) {
|
|
|
6639
6639
|
td
|
|
6640
6640
|
);
|
|
6641
6641
|
const updates = { tableData: newTableData };
|
|
6642
|
-
const newRawXml =
|
|
6642
|
+
const newRawXml = chunkLY5535CF_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6643
6643
|
if (newRawXml) {
|
|
6644
6644
|
updates.rawXml = newRawXml;
|
|
6645
6645
|
}
|
|
@@ -6665,7 +6665,7 @@ function createTableMergeHandlers(input) {
|
|
|
6665
6665
|
if (!targetNextCell || targetNextCell.hMerge || targetNextCell.vMerge) {
|
|
6666
6666
|
return;
|
|
6667
6667
|
}
|
|
6668
|
-
const newTableData =
|
|
6668
|
+
const newTableData = chunkLY5535CF_js.mergeCells(
|
|
6669
6669
|
[
|
|
6670
6670
|
{ row: rowIndex, col: columnIndex },
|
|
6671
6671
|
{ row: targetNextRowIdx, col: columnIndex }
|
|
@@ -6673,7 +6673,7 @@ function createTableMergeHandlers(input) {
|
|
|
6673
6673
|
td
|
|
6674
6674
|
);
|
|
6675
6675
|
const updates = { tableData: newTableData };
|
|
6676
|
-
const newRawXml =
|
|
6676
|
+
const newRawXml = chunkLY5535CF_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6677
6677
|
if (newRawXml) {
|
|
6678
6678
|
updates.rawXml = newRawXml;
|
|
6679
6679
|
}
|
|
@@ -6688,9 +6688,9 @@ function createTableMergeHandlers(input) {
|
|
|
6688
6688
|
return;
|
|
6689
6689
|
}
|
|
6690
6690
|
const td = selectedElement.tableData;
|
|
6691
|
-
const newTableData =
|
|
6691
|
+
const newTableData = chunkLY5535CF_js.mergeCells(ts.selectedCells, td);
|
|
6692
6692
|
const updates = { tableData: newTableData };
|
|
6693
|
-
const newRawXml =
|
|
6693
|
+
const newRawXml = chunkLY5535CF_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6694
6694
|
if (newRawXml) {
|
|
6695
6695
|
updates.rawXml = newRawXml;
|
|
6696
6696
|
}
|
|
@@ -6707,9 +6707,9 @@ function createTableMergeHandlers(input) {
|
|
|
6707
6707
|
}
|
|
6708
6708
|
const { rowIndex, columnIndex } = ts;
|
|
6709
6709
|
const td = selectedElement.tableData;
|
|
6710
|
-
const newTableData =
|
|
6710
|
+
const newTableData = chunkLY5535CF_js.splitCell(rowIndex, columnIndex, td);
|
|
6711
6711
|
const updates = { tableData: newTableData };
|
|
6712
|
-
const newRawXml =
|
|
6712
|
+
const newRawXml = chunkLY5535CF_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6713
6713
|
if (newRawXml) {
|
|
6714
6714
|
updates.rawXml = newRawXml;
|
|
6715
6715
|
}
|
|
@@ -6743,10 +6743,10 @@ function createTableStructHandlers(input) {
|
|
|
6743
6743
|
const text = transformCommittedText ? transformCommittedText(rawText) : rawText;
|
|
6744
6744
|
const updates = {};
|
|
6745
6745
|
if (el.tableData) {
|
|
6746
|
-
updates.tableData =
|
|
6746
|
+
updates.tableData = chunkLY5535CF_js.setCellText(el, rowIndex, colIndex, text).tableData;
|
|
6747
6747
|
}
|
|
6748
6748
|
if (el.rawXml) {
|
|
6749
|
-
const newRawXml =
|
|
6749
|
+
const newRawXml = chunkLY5535CF_js.updateCellTextInRawXml(el, rowIndex, colIndex, text);
|
|
6750
6750
|
if (newRawXml) {
|
|
6751
6751
|
updates.rawXml = newRawXml;
|
|
6752
6752
|
}
|
|
@@ -6770,7 +6770,7 @@ function createTableStructHandlers(input) {
|
|
|
6770
6770
|
const { rowIndex, columnIndex: colIndex } = ts;
|
|
6771
6771
|
const updates = {};
|
|
6772
6772
|
if (selectedElement.rawXml) {
|
|
6773
|
-
const newRawXml =
|
|
6773
|
+
const newRawXml = chunkLY5535CF_js.updateCellTextStyleInRawXml(
|
|
6774
6774
|
selectedElement,
|
|
6775
6775
|
rowIndex,
|
|
6776
6776
|
colIndex,
|
|
@@ -6834,9 +6834,9 @@ function createTableStructHandlers(input) {
|
|
|
6834
6834
|
return;
|
|
6835
6835
|
}
|
|
6836
6836
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6837
|
-
const newTableData =
|
|
6837
|
+
const newTableData = chunkLY5535CF_js.insertTableRow(selectedElement.tableData, rowIdx, position);
|
|
6838
6838
|
const updates = { tableData: newTableData };
|
|
6839
|
-
const newRawXml =
|
|
6839
|
+
const newRawXml = chunkLY5535CF_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6840
6840
|
if (newRawXml) {
|
|
6841
6841
|
updates.rawXml = newRawXml;
|
|
6842
6842
|
}
|
|
@@ -6849,12 +6849,12 @@ function createTableStructHandlers(input) {
|
|
|
6849
6849
|
}
|
|
6850
6850
|
const td = selectedElement.tableData;
|
|
6851
6851
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6852
|
-
const newTableData =
|
|
6852
|
+
const newTableData = chunkLY5535CF_js.deleteTableRow(td, rowIdx);
|
|
6853
6853
|
if (newTableData === td) {
|
|
6854
6854
|
return;
|
|
6855
6855
|
}
|
|
6856
6856
|
const updates = { tableData: newTableData };
|
|
6857
|
-
const newRawXml =
|
|
6857
|
+
const newRawXml = chunkLY5535CF_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6858
6858
|
if (newRawXml) {
|
|
6859
6859
|
updates.rawXml = newRawXml;
|
|
6860
6860
|
}
|
|
@@ -6866,9 +6866,9 @@ function createTableStructHandlers(input) {
|
|
|
6866
6866
|
return;
|
|
6867
6867
|
}
|
|
6868
6868
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6869
|
-
const newTableData =
|
|
6869
|
+
const newTableData = chunkLY5535CF_js.insertTableColumn(selectedElement.tableData, colIdx, position);
|
|
6870
6870
|
const updates = { tableData: newTableData };
|
|
6871
|
-
const newRawXml =
|
|
6871
|
+
const newRawXml = chunkLY5535CF_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6872
6872
|
if (newRawXml) {
|
|
6873
6873
|
updates.rawXml = newRawXml;
|
|
6874
6874
|
}
|
|
@@ -6881,12 +6881,12 @@ function createTableStructHandlers(input) {
|
|
|
6881
6881
|
}
|
|
6882
6882
|
const td = selectedElement.tableData;
|
|
6883
6883
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6884
|
-
const newTableData =
|
|
6884
|
+
const newTableData = chunkLY5535CF_js.deleteTableColumn(td, colIdx);
|
|
6885
6885
|
if (newTableData === td) {
|
|
6886
6886
|
return;
|
|
6887
6887
|
}
|
|
6888
6888
|
const updates = { tableData: newTableData };
|
|
6889
|
-
const newRawXml =
|
|
6889
|
+
const newRawXml = chunkLY5535CF_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6890
6890
|
if (newRawXml) {
|
|
6891
6891
|
updates.rawXml = newRawXml;
|
|
6892
6892
|
}
|
|
@@ -6922,8 +6922,8 @@ async function renderToCanvas(element, options = {}) {
|
|
|
6922
6922
|
return html2canvasPro(element, {
|
|
6923
6923
|
...options,
|
|
6924
6924
|
onclone: async (doc, clonedEl) => {
|
|
6925
|
-
await
|
|
6926
|
-
|
|
6925
|
+
await chunkLY5535CF_js.normalizeColorsForCapture(doc, clonedEl);
|
|
6926
|
+
chunkLY5535CF_js.preprocessCssForCapture(clonedEl);
|
|
6927
6927
|
if (typeof userOnClone === "function") {
|
|
6928
6928
|
userOnClone(doc, clonedEl);
|
|
6929
6929
|
}
|
|
@@ -6953,7 +6953,7 @@ function useExportSaveAs(input) {
|
|
|
6953
6953
|
slideSizeEmu
|
|
6954
6954
|
} = input;
|
|
6955
6955
|
const handleSaveAsFormat = async (format) => {
|
|
6956
|
-
const downloadName =
|
|
6956
|
+
const downloadName = chunkLY5535CF_js.savedPresentationFileName(filePath, format);
|
|
6957
6957
|
try {
|
|
6958
6958
|
const data = await serializeSlides(format);
|
|
6959
6959
|
if (!data) {
|
|
@@ -6961,16 +6961,16 @@ function useExportSaveAs(input) {
|
|
|
6961
6961
|
}
|
|
6962
6962
|
const mimeType = format === "ppt" ? "application/vnd.ms-powerpoint" : "application/vnd.openxmlformats-officedocument.presentationml.presentation";
|
|
6963
6963
|
const blob = new Blob([data], { type: mimeType });
|
|
6964
|
-
|
|
6964
|
+
chunkLY5535CF_js.downloadBlob(blob, downloadName);
|
|
6965
6965
|
} catch (err) {
|
|
6966
6966
|
console.error(`[PowerPointViewer] Save as .${format} failed:`, err);
|
|
6967
6967
|
}
|
|
6968
6968
|
};
|
|
6969
6969
|
const handleExportJson = () => {
|
|
6970
6970
|
const sourceName = filePath ? filePath.replace(/\\/gu, "/").split("/").pop() : void 0;
|
|
6971
|
-
const slideSize =
|
|
6971
|
+
const slideSize = chunkLY5535CF_js.resolveSlideSizeSelection({ current: slideSizeEmu, canvas: canvasSize }).size;
|
|
6972
6972
|
const data = {
|
|
6973
|
-
slides:
|
|
6973
|
+
slides: chunkLY5535CF_js.buildSaveSlides(slides, templateElementsBySlideId),
|
|
6974
6974
|
width: canvasSize.width,
|
|
6975
6975
|
height: canvasSize.height,
|
|
6976
6976
|
widthEmu: slideSize.widthEmu,
|
|
@@ -6989,7 +6989,7 @@ function useExportSaveAs(input) {
|
|
|
6989
6989
|
handoutMaster
|
|
6990
6990
|
};
|
|
6991
6991
|
try {
|
|
6992
|
-
|
|
6992
|
+
chunkLY5535CF_js.exportDeckJson(data, sourceName);
|
|
6993
6993
|
} catch (err) {
|
|
6994
6994
|
console.error("[PowerPointViewer] JSON export failed:", err);
|
|
6995
6995
|
}
|
|
@@ -7080,7 +7080,7 @@ async function exportSlideToPngBlob(slideElement, options = {}) {
|
|
|
7080
7080
|
}
|
|
7081
7081
|
async function exportSlideAsPng(slideElement, slideIndex, options = {}) {
|
|
7082
7082
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
7083
|
-
|
|
7083
|
+
chunkLY5535CF_js.downloadBlob(blob, `slide-${slideIndex + 1}.png`);
|
|
7084
7084
|
}
|
|
7085
7085
|
async function copySlideToClipboard(slideElement, options = {}) {
|
|
7086
7086
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
@@ -7102,15 +7102,15 @@ async function exportAllSlidesAsPdf(slideStageRef, totalSlides, setActiveSlide,
|
|
|
7102
7102
|
continue;
|
|
7103
7103
|
}
|
|
7104
7104
|
const canvas = await renderElementToCanvas(stageEl, scale);
|
|
7105
|
-
images.push(
|
|
7105
|
+
images.push(chunkLY5535CF_js.canvasToJpegData(canvas));
|
|
7106
7106
|
}
|
|
7107
7107
|
onProgress?.(totalSlides, totalSlides);
|
|
7108
7108
|
setActiveSlide(currentSlideIndex);
|
|
7109
7109
|
if (images.length === 0) {
|
|
7110
7110
|
throw new Error(chunkY6GG2OOW_js.translationsEn["pptx.export.errorNoSlidesPdf"]);
|
|
7111
7111
|
}
|
|
7112
|
-
const pdfBlobUrl =
|
|
7113
|
-
|
|
7112
|
+
const pdfBlobUrl = chunkIK25LY4C_js.buildPdfFromImageData(images);
|
|
7113
|
+
chunkLY5535CF_js.downloadDataUrl(pdfBlobUrl, filename);
|
|
7114
7114
|
}
|
|
7115
7115
|
async function captureAllSlidesAsPngDataUrls(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, options = {}) {
|
|
7116
7116
|
const { scale = 2, onProgress } = options;
|
|
@@ -7158,8 +7158,8 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
|
|
|
7158
7158
|
if (pages.length === 0) {
|
|
7159
7159
|
throw new Error(chunkY6GG2OOW_js.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
|
|
7160
7160
|
}
|
|
7161
|
-
const pdfDataUrl =
|
|
7162
|
-
|
|
7161
|
+
const pdfDataUrl = chunkIK25LY4C_js.buildNotesPdf(pages);
|
|
7162
|
+
chunkLY5535CF_js.downloadDataUrl(pdfDataUrl, filename);
|
|
7163
7163
|
}
|
|
7164
7164
|
|
|
7165
7165
|
// src/viewer/utils/export-video.ts
|
|
@@ -7203,7 +7203,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
7203
7203
|
const fps = 30;
|
|
7204
7204
|
const stream = recordingCanvas.captureStream(fps);
|
|
7205
7205
|
const recorder = new MediaRecorder(stream, {
|
|
7206
|
-
mimeType:
|
|
7206
|
+
mimeType: chunkLY5535CF_js.pickSupportedMimeType([...chunkLY5535CF_js.WEBM_MIME_CANDIDATES]),
|
|
7207
7207
|
videoBitsPerSecond: 5e6
|
|
7208
7208
|
});
|
|
7209
7209
|
const chunks = [];
|
|
@@ -7226,8 +7226,8 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
7226
7226
|
const duration = slideTimingsMs?.[i] ?? slideDurationMs;
|
|
7227
7227
|
ctx.clearRect(0, 0, recordingCanvas.width, recordingCanvas.height);
|
|
7228
7228
|
ctx.drawImage(slideCanvases[i], 0, 0);
|
|
7229
|
-
const frameInterval =
|
|
7230
|
-
const framesNeeded =
|
|
7229
|
+
const frameInterval = chunkLY5535CF_js.fpsToFrameIntervalMs(fps);
|
|
7230
|
+
const framesNeeded = chunkLY5535CF_js.segmentFrameCount(duration, fps);
|
|
7231
7231
|
for (let f = 0; f < framesNeeded; f++) {
|
|
7232
7232
|
if (signal?.aborted) {
|
|
7233
7233
|
recorder.stop();
|
|
@@ -7276,7 +7276,7 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
|
|
|
7276
7276
|
if (frames.length === 0) {
|
|
7277
7277
|
throw new Error(chunkY6GG2OOW_js.translationsEn["pptx.export.errorNoSlidesGif"]);
|
|
7278
7278
|
}
|
|
7279
|
-
const gifBytes =
|
|
7279
|
+
const gifBytes = chunkLY5535CF_js.encodeGif(frames, Math.round(slideDurationMs / 10));
|
|
7280
7280
|
onProgress?.(totalSlides, totalSlides);
|
|
7281
7281
|
const buf = new ArrayBuffer(gifBytes.length);
|
|
7282
7282
|
new Uint8Array(buf).set(gifBytes);
|
|
@@ -7330,7 +7330,7 @@ function exportAllSlidesToSvg(data, options = {}) {
|
|
|
7330
7330
|
continue;
|
|
7331
7331
|
}
|
|
7332
7332
|
onProgress?.(processedCount, data.slides.length);
|
|
7333
|
-
let svg =
|
|
7333
|
+
let svg = chunkLY5535CF_js.SvgExporter.exportSlide(slide, data.width, data.height, svgOptions);
|
|
7334
7334
|
if (embedFonts && fontFaces?.length) {
|
|
7335
7335
|
svg = injectFontFaces(svg, fontFaces);
|
|
7336
7336
|
}
|
|
@@ -7432,21 +7432,21 @@ function useExportHandlers(input) {
|
|
|
7432
7432
|
{
|
|
7433
7433
|
scale: imageExportScale,
|
|
7434
7434
|
onProgress: (current, total) => {
|
|
7435
|
-
setExportProgress(
|
|
7436
|
-
setExportStatusMessage(
|
|
7435
|
+
setExportProgress(chunkLY5535CF_js.slideProgressPercent(current, total));
|
|
7436
|
+
setExportStatusMessage(chunkLY5535CF_js.slideStatusLabel("Rendering", current, total));
|
|
7437
7437
|
},
|
|
7438
7438
|
signal: abortCtrl.signal
|
|
7439
7439
|
}
|
|
7440
7440
|
);
|
|
7441
|
-
setExportProgress(
|
|
7441
|
+
setExportProgress(chunkLY5535CF_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7442
7442
|
setExportStatusMessage("Building PDF...");
|
|
7443
7443
|
await new Promise((r) => {
|
|
7444
7444
|
setTimeout(r, 100);
|
|
7445
7445
|
});
|
|
7446
|
-
setExportProgress(
|
|
7446
|
+
setExportProgress(chunkLY5535CF_js.EXPORT_DONE_PERCENT);
|
|
7447
7447
|
setExportStatusMessage("Done!");
|
|
7448
7448
|
} catch (err) {
|
|
7449
|
-
if (!
|
|
7449
|
+
if (!chunkLY5535CF_js.isExportAbortError(err)) {
|
|
7450
7450
|
console.error("[PowerPointViewer] PDF export failed:", err);
|
|
7451
7451
|
}
|
|
7452
7452
|
} finally {
|
|
@@ -7476,21 +7476,21 @@ function useExportHandlers(input) {
|
|
|
7476
7476
|
{
|
|
7477
7477
|
scale: imageExportScale,
|
|
7478
7478
|
onProgress: (current, total) => {
|
|
7479
|
-
setExportProgress(
|
|
7480
|
-
setExportStatusMessage(
|
|
7479
|
+
setExportProgress(chunkLY5535CF_js.slideProgressPercent(current, total));
|
|
7480
|
+
setExportStatusMessage(chunkLY5535CF_js.slideStatusLabel("Rendering", current, total));
|
|
7481
7481
|
},
|
|
7482
7482
|
signal: abortCtrl.signal
|
|
7483
7483
|
}
|
|
7484
7484
|
);
|
|
7485
|
-
setExportProgress(
|
|
7485
|
+
setExportProgress(chunkLY5535CF_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7486
7486
|
setExportStatusMessage("Building PDF...");
|
|
7487
7487
|
await new Promise((r) => {
|
|
7488
7488
|
setTimeout(r, 100);
|
|
7489
7489
|
});
|
|
7490
|
-
setExportProgress(
|
|
7490
|
+
setExportProgress(chunkLY5535CF_js.EXPORT_DONE_PERCENT);
|
|
7491
7491
|
setExportStatusMessage("Done!");
|
|
7492
7492
|
} catch (err) {
|
|
7493
|
-
if (!
|
|
7493
|
+
if (!chunkLY5535CF_js.isExportAbortError(err)) {
|
|
7494
7494
|
console.error("[PowerPointViewer] Notes PDF export failed:", err);
|
|
7495
7495
|
}
|
|
7496
7496
|
} finally {
|
|
@@ -7532,22 +7532,22 @@ function useExportHandlers(input) {
|
|
|
7532
7532
|
scale: 1,
|
|
7533
7533
|
slideDurationMs: 3e3,
|
|
7534
7534
|
onProgress: (current, total) => {
|
|
7535
|
-
setExportProgress(
|
|
7536
|
-
setExportStatusMessage(
|
|
7535
|
+
setExportProgress(chunkLY5535CF_js.slideProgressPercent(current, total, 45));
|
|
7536
|
+
setExportStatusMessage(chunkLY5535CF_js.slideStatusLabel("Capturing", current, total));
|
|
7537
7537
|
},
|
|
7538
7538
|
onRecordProgress: (current, total) => {
|
|
7539
|
-
setExportProgress(
|
|
7540
|
-
setExportStatusMessage(
|
|
7539
|
+
setExportProgress(chunkLY5535CF_js.recordProgressPercent(current, total));
|
|
7540
|
+
setExportStatusMessage(chunkLY5535CF_js.slideStatusLabel("Recording", current, total));
|
|
7541
7541
|
},
|
|
7542
7542
|
signal: abortCtrl.signal
|
|
7543
7543
|
}
|
|
7544
7544
|
);
|
|
7545
|
-
setExportProgress(
|
|
7545
|
+
setExportProgress(chunkLY5535CF_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7546
7546
|
setExportStatusMessage("Saving file...");
|
|
7547
|
-
|
|
7548
|
-
setExportProgress(
|
|
7547
|
+
chunkLY5535CF_js.downloadBlob(blob, "presentation.webm");
|
|
7548
|
+
setExportProgress(chunkLY5535CF_js.EXPORT_DONE_PERCENT);
|
|
7549
7549
|
} catch (err) {
|
|
7550
|
-
if (!
|
|
7550
|
+
if (!chunkLY5535CF_js.isExportAbortError(err)) {
|
|
7551
7551
|
console.error("[PowerPointViewer] Video export failed:", err);
|
|
7552
7552
|
}
|
|
7553
7553
|
} finally {
|
|
@@ -7575,18 +7575,18 @@ function useExportHandlers(input) {
|
|
|
7575
7575
|
scale: 0.5,
|
|
7576
7576
|
slideDurationMs: 2e3,
|
|
7577
7577
|
onProgress: (current, total) => {
|
|
7578
|
-
setExportProgress(
|
|
7579
|
-
setExportStatusMessage(
|
|
7578
|
+
setExportProgress(chunkLY5535CF_js.slideProgressPercent(current, total));
|
|
7579
|
+
setExportStatusMessage(chunkLY5535CF_js.slideStatusLabel("Encoding", current, total));
|
|
7580
7580
|
},
|
|
7581
7581
|
signal: abortCtrl.signal
|
|
7582
7582
|
}
|
|
7583
7583
|
);
|
|
7584
|
-
setExportProgress(
|
|
7584
|
+
setExportProgress(chunkLY5535CF_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7585
7585
|
setExportStatusMessage("Saving file...");
|
|
7586
|
-
|
|
7587
|
-
setExportProgress(
|
|
7586
|
+
chunkLY5535CF_js.downloadBlob(blob, "presentation.gif");
|
|
7587
|
+
setExportProgress(chunkLY5535CF_js.EXPORT_DONE_PERCENT);
|
|
7588
7588
|
} catch (err) {
|
|
7589
|
-
if (!
|
|
7589
|
+
if (!chunkLY5535CF_js.isExportAbortError(err)) {
|
|
7590
7590
|
console.error("[PowerPointViewer] GIF export failed:", err);
|
|
7591
7591
|
}
|
|
7592
7592
|
} finally {
|
|
@@ -7620,7 +7620,7 @@ function useExportHandlers(input) {
|
|
|
7620
7620
|
exportStatusMessage
|
|
7621
7621
|
};
|
|
7622
7622
|
}
|
|
7623
|
-
var ViewerOptionsContext = react.createContext(
|
|
7623
|
+
var ViewerOptionsContext = react.createContext(chunkLY5535CF_js.DEFAULT_VIEWER_OPTIONS);
|
|
7624
7624
|
function useViewerOptionsContext() {
|
|
7625
7625
|
return react.useContext(ViewerOptionsContext);
|
|
7626
7626
|
}
|
|
@@ -7632,13 +7632,13 @@ function usePrintHandlers(input) {
|
|
|
7632
7632
|
const { t } = reactI18next.useTranslation();
|
|
7633
7633
|
const viewerOptions = useViewerOptionsContext();
|
|
7634
7634
|
const includeHiddenSlides = viewerOptions.advanced.printHiddenSlides;
|
|
7635
|
-
const printRasterScale = (viewerOptions.advanced.printHighQuality ? 4 : 3) *
|
|
7635
|
+
const printRasterScale = (viewerOptions.advanced.printHighQuality ? 4 : 3) * chunkLY5535CF_js.resolveImageResolutionScale(viewerOptions);
|
|
7636
7636
|
const handlePrint = () => {
|
|
7637
7637
|
setIsPrintDialogOpen(true);
|
|
7638
7638
|
};
|
|
7639
7639
|
const handlePrintSvg = async (settings) => {
|
|
7640
7640
|
setIsPrintDialogOpen(false);
|
|
7641
|
-
const printWindow =
|
|
7641
|
+
const printWindow = chunkLY5535CF_js.openPendingPrintWindow(t("pptx.print.preparingToPrint"));
|
|
7642
7642
|
if (!printWindow) {
|
|
7643
7643
|
console.warn(
|
|
7644
7644
|
"[PowerPointViewer] Print window was blocked by the browser. Allow popups for this site to print."
|
|
@@ -7648,9 +7648,9 @@ function usePrintHandlers(input) {
|
|
|
7648
7648
|
if (!pptxData || settings.printWhat !== "slides") {
|
|
7649
7649
|
return runRasterPrint(printWindow, settings);
|
|
7650
7650
|
}
|
|
7651
|
-
const colorFilter =
|
|
7652
|
-
const slideIndices =
|
|
7653
|
-
|
|
7651
|
+
const colorFilter = chunkLY5535CF_js.computeColorFilter(settings.colorMode);
|
|
7652
|
+
const slideIndices = chunkLY5535CF_js.filterHiddenSlideIndices(
|
|
7653
|
+
chunkLY5535CF_js.computeSlideIndices(
|
|
7654
7654
|
settings.slideRange,
|
|
7655
7655
|
activeSlideIndex,
|
|
7656
7656
|
slides.length,
|
|
@@ -7668,22 +7668,22 @@ function usePrintHandlers(input) {
|
|
|
7668
7668
|
printWindow.close();
|
|
7669
7669
|
return;
|
|
7670
7670
|
}
|
|
7671
|
-
const printDoc =
|
|
7671
|
+
const printDoc = chunkLY5535CF_js.buildPrintDocument(svgs, pptxData.width, pptxData.height, {
|
|
7672
7672
|
title: "Slides (Vector)",
|
|
7673
7673
|
orientation: settings.orientation,
|
|
7674
7674
|
colorFilter,
|
|
7675
7675
|
scaleToFit: settings.scaleToFit
|
|
7676
7676
|
});
|
|
7677
|
-
|
|
7677
|
+
chunkLY5535CF_js.finishPrintWindow(printWindow, printDoc);
|
|
7678
7678
|
} catch (err) {
|
|
7679
7679
|
console.warn("[PowerPointViewer] SVG print path failed, falling back to raster:", err);
|
|
7680
7680
|
return runRasterPrint(printWindow, settings);
|
|
7681
7681
|
}
|
|
7682
7682
|
};
|
|
7683
7683
|
const runRasterPrint = async (printWindow, settings) => {
|
|
7684
|
-
const colorFilter =
|
|
7685
|
-
const slideIndices =
|
|
7686
|
-
|
|
7684
|
+
const colorFilter = chunkLY5535CF_js.computeColorFilter(settings.colorMode);
|
|
7685
|
+
const slideIndices = chunkLY5535CF_js.filterHiddenSlideIndices(
|
|
7686
|
+
chunkLY5535CF_js.computeSlideIndices(
|
|
7687
7687
|
settings.slideRange,
|
|
7688
7688
|
activeSlideIndex,
|
|
7689
7689
|
slides.length,
|
|
@@ -7694,11 +7694,11 @@ function usePrintHandlers(input) {
|
|
|
7694
7694
|
includeHiddenSlides
|
|
7695
7695
|
);
|
|
7696
7696
|
if (settings.printWhat === "outline") {
|
|
7697
|
-
|
|
7697
|
+
chunkLY5535CF_js.finishPrintWindow(
|
|
7698
7698
|
printWindow,
|
|
7699
|
-
|
|
7699
|
+
chunkLY5535CF_js.buildPrintHtmlDocument({
|
|
7700
7700
|
title: "Outline",
|
|
7701
|
-
bodyHtml: `<div class="outline-page">${
|
|
7701
|
+
bodyHtml: `<div class="outline-page">${chunkLY5535CF_js.buildOutlineHtml(slideIndices, slides)}</div>`,
|
|
7702
7702
|
orientation: settings.orientation,
|
|
7703
7703
|
colorFilter,
|
|
7704
7704
|
frameSlides: settings.frameSlides,
|
|
@@ -7725,11 +7725,11 @@ function usePrintHandlers(input) {
|
|
|
7725
7725
|
}
|
|
7726
7726
|
const slideImages = slideIndices.map((idx) => allImages[idx]).filter(Boolean);
|
|
7727
7727
|
if (settings.printWhat === "slides") {
|
|
7728
|
-
|
|
7728
|
+
chunkLY5535CF_js.finishPrintWindow(
|
|
7729
7729
|
printWindow,
|
|
7730
|
-
|
|
7730
|
+
chunkLY5535CF_js.buildPrintHtmlDocument({
|
|
7731
7731
|
title: "Slides",
|
|
7732
|
-
bodyHtml:
|
|
7732
|
+
bodyHtml: chunkLY5535CF_js.buildSlidesHtml(slideImages, slideIndices),
|
|
7733
7733
|
orientation: settings.orientation,
|
|
7734
7734
|
colorFilter,
|
|
7735
7735
|
frameSlides: settings.frameSlides,
|
|
@@ -7739,11 +7739,11 @@ function usePrintHandlers(input) {
|
|
|
7739
7739
|
return;
|
|
7740
7740
|
}
|
|
7741
7741
|
if (settings.printWhat === "notes") {
|
|
7742
|
-
|
|
7742
|
+
chunkLY5535CF_js.finishPrintWindow(
|
|
7743
7743
|
printWindow,
|
|
7744
|
-
|
|
7744
|
+
chunkLY5535CF_js.buildPrintHtmlDocument({
|
|
7745
7745
|
title: "Notes Pages",
|
|
7746
|
-
bodyHtml:
|
|
7746
|
+
bodyHtml: chunkLY5535CF_js.buildNotesHtml(slideImages, slideIndices, slides),
|
|
7747
7747
|
orientation: "portrait",
|
|
7748
7748
|
colorFilter,
|
|
7749
7749
|
frameSlides: settings.frameSlides,
|
|
@@ -7754,11 +7754,11 @@ function usePrintHandlers(input) {
|
|
|
7754
7754
|
}
|
|
7755
7755
|
if (settings.printWhat === "handouts") {
|
|
7756
7756
|
const spp = settings.slidesPerPage;
|
|
7757
|
-
|
|
7757
|
+
chunkLY5535CF_js.finishPrintWindow(
|
|
7758
7758
|
printWindow,
|
|
7759
|
-
|
|
7759
|
+
chunkLY5535CF_js.buildPrintHtmlDocument({
|
|
7760
7760
|
title: `Handout ${spp} per page`,
|
|
7761
|
-
bodyHtml:
|
|
7761
|
+
bodyHtml: chunkLY5535CF_js.buildHandoutsHtml(slideImages, slideIndices, spp, pptxData?.handoutMaster),
|
|
7762
7762
|
orientation: "portrait",
|
|
7763
7763
|
colorFilter,
|
|
7764
7764
|
frameSlides: settings.frameSlides,
|
|
@@ -7772,7 +7772,7 @@ function usePrintHandlers(input) {
|
|
|
7772
7772
|
};
|
|
7773
7773
|
const handlePrintWithSettings = async (settings) => {
|
|
7774
7774
|
setIsPrintDialogOpen(false);
|
|
7775
|
-
const printWindow =
|
|
7775
|
+
const printWindow = chunkLY5535CF_js.openPendingPrintWindow(t("pptx.print.preparingToPrint"));
|
|
7776
7776
|
if (!printWindow) {
|
|
7777
7777
|
console.warn(
|
|
7778
7778
|
"[PowerPointViewer] Print window was blocked by the browser. Allow popups for this site to print."
|
|
@@ -7837,13 +7837,13 @@ function useThemeHandlers(input) {
|
|
|
7837
7837
|
return;
|
|
7838
7838
|
}
|
|
7839
7839
|
await handler.updateThemeColorScheme(colorScheme);
|
|
7840
|
-
const previousMap = theme?.colorScheme ?
|
|
7841
|
-
setSlides((prev) =>
|
|
7840
|
+
const previousMap = theme?.colorScheme ? chunkLY5535CF_js.buildThemeColorMap(theme.colorScheme) : {};
|
|
7841
|
+
setSlides((prev) => chunkLY5535CF_js.reResolveSlideColors(prev, previousMap, colorScheme));
|
|
7842
7842
|
if (Object.keys(templateElementsBySlideId).length > 0) {
|
|
7843
7843
|
setTemplateElementsBySlideId((prev) => {
|
|
7844
7844
|
const next = {};
|
|
7845
7845
|
for (const [slideId, elements] of Object.entries(prev)) {
|
|
7846
|
-
next[slideId] =
|
|
7846
|
+
next[slideId] = chunkLY5535CF_js.reResolveElementColors(elements, previousMap, colorScheme);
|
|
7847
7847
|
}
|
|
7848
7848
|
return next;
|
|
7849
7849
|
});
|
|
@@ -7952,7 +7952,7 @@ function useThemeSwitching(input) {
|
|
|
7952
7952
|
}
|
|
7953
7953
|
try {
|
|
7954
7954
|
await handler.applyTheme(preset.colorScheme, preset.fontScheme, preset.name);
|
|
7955
|
-
const newData =
|
|
7955
|
+
const newData = chunkLY5535CF_js.applyThemeToData(data, preset.colorScheme, preset.fontScheme, preset.name);
|
|
7956
7956
|
onDataChange(newData);
|
|
7957
7957
|
onThemeChanged?.(preset);
|
|
7958
7958
|
} catch (error) {
|
|
@@ -7969,7 +7969,7 @@ function useThemeSwitching(input) {
|
|
|
7969
7969
|
}
|
|
7970
7970
|
try {
|
|
7971
7971
|
await handler.applyTheme(colorScheme, fontScheme ?? {}, themeName);
|
|
7972
|
-
const newData =
|
|
7972
|
+
const newData = chunkLY5535CF_js.applyThemeToData(data, colorScheme, fontScheme, themeName);
|
|
7973
7973
|
onDataChange(newData);
|
|
7974
7974
|
} catch (error) {
|
|
7975
7975
|
console.error("Failed to switch to custom theme:", error);
|
|
@@ -7981,12 +7981,12 @@ function useThemeSwitching(input) {
|
|
|
7981
7981
|
if (!data?.theme?.colorScheme) {
|
|
7982
7982
|
return void 0;
|
|
7983
7983
|
}
|
|
7984
|
-
return
|
|
7985
|
-
(p) =>
|
|
7984
|
+
return chunkLY5535CF_js.THEME_PRESETS.find(
|
|
7985
|
+
(p) => chunkLY5535CF_js.themeColorSchemesEqual(data.theme?.colorScheme, p.colorScheme)
|
|
7986
7986
|
);
|
|
7987
7987
|
}, [data?.theme?.colorScheme]);
|
|
7988
7988
|
return {
|
|
7989
|
-
presets:
|
|
7989
|
+
presets: chunkLY5535CF_js.THEME_PRESETS,
|
|
7990
7990
|
switchToPreset,
|
|
7991
7991
|
switchToCustom,
|
|
7992
7992
|
currentPreset
|
|
@@ -8061,7 +8061,7 @@ function usePropertyHandlers(input) {
|
|
|
8061
8061
|
}
|
|
8062
8062
|
try {
|
|
8063
8063
|
const ab = await file.arrayBuffer();
|
|
8064
|
-
const h = new
|
|
8064
|
+
const h = new chunkLY5535CF_js.PptxHandler();
|
|
8065
8065
|
const other = await h.load(ab);
|
|
8066
8066
|
if (!other) {
|
|
8067
8067
|
return;
|
|
@@ -8071,7 +8071,7 @@ function usePropertyHandlers(input) {
|
|
|
8071
8071
|
width: canvasSize.width,
|
|
8072
8072
|
height: canvasSize.height
|
|
8073
8073
|
};
|
|
8074
|
-
setCompareResult(
|
|
8074
|
+
setCompareResult(chunkLY5535CF_js.comparePresentation(cur, other));
|
|
8075
8075
|
setIsComparePanelOpen(true);
|
|
8076
8076
|
} catch (err) {
|
|
8077
8077
|
console.warn("Compare failed:", err);
|
|
@@ -8088,7 +8088,7 @@ function usePropertyHandlers(input) {
|
|
|
8088
8088
|
if (!diff || diff.status === "unchanged") {
|
|
8089
8089
|
return;
|
|
8090
8090
|
}
|
|
8091
|
-
setSlides((prev) =>
|
|
8091
|
+
setSlides((prev) => chunkLY5535CF_js.applyAcceptSlide(prev, diff));
|
|
8092
8092
|
setIsDirty(true);
|
|
8093
8093
|
},
|
|
8094
8094
|
[compareResult, setSlides, setIsDirty]
|
|
@@ -8099,10 +8099,10 @@ function usePropertyHandlers(input) {
|
|
|
8099
8099
|
if (!compareResult) {
|
|
8100
8100
|
return;
|
|
8101
8101
|
}
|
|
8102
|
-
setSlides((prev) =>
|
|
8102
|
+
setSlides((prev) => chunkLY5535CF_js.applyAcceptAllSlides(prev, compareResult));
|
|
8103
8103
|
setIsDirty(true);
|
|
8104
8104
|
}, [compareResult, setSlides, setIsDirty]);
|
|
8105
|
-
const usedFontFamilies = react.useMemo(() =>
|
|
8105
|
+
const usedFontFamilies = react.useMemo(() => chunkLY5535CF_js.collectUsedFonts(slides), [slides]);
|
|
8106
8106
|
return {
|
|
8107
8107
|
handleUpdateNotes,
|
|
8108
8108
|
handleUpdateSlide,
|
|
@@ -8257,7 +8257,7 @@ function useViewerDialogs(input) {
|
|
|
8257
8257
|
);
|
|
8258
8258
|
const embeddedFontKey = (embeddedFontFamilies ?? []).join("\0");
|
|
8259
8259
|
const fontEmbedding = react.useMemo(
|
|
8260
|
-
() =>
|
|
8260
|
+
() => chunkLY5535CF_js.describeFontEmbedding(embeddedFontKey ? embeddedFontKey.split("\0") : []),
|
|
8261
8261
|
[embeddedFontKey]
|
|
8262
8262
|
);
|
|
8263
8263
|
const [embedFontsEnabled, setEmbedFontsEnabled] = react.useState(fontEmbedding.initialEnabled);
|
|
@@ -8267,11 +8267,11 @@ function useViewerDialogs(input) {
|
|
|
8267
8267
|
setEmbedFontsEnabled(fontEmbedding.initialEnabled);
|
|
8268
8268
|
}
|
|
8269
8269
|
const [isNarrowViewport, setIsNarrowViewport] = react.useState(
|
|
8270
|
-
() => typeof window !== "undefined" ?
|
|
8270
|
+
() => typeof window !== "undefined" ? chunkLY5535CF_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch()) : false
|
|
8271
8271
|
);
|
|
8272
8272
|
react.useEffect(() => {
|
|
8273
8273
|
const handleWindow = () => setIsNarrowViewport(
|
|
8274
|
-
|
|
8274
|
+
chunkLY5535CF_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch())
|
|
8275
8275
|
);
|
|
8276
8276
|
window.addEventListener("resize", handleWindow);
|
|
8277
8277
|
return () => window.removeEventListener("resize", handleWindow);
|
|
@@ -8424,16 +8424,16 @@ function useViewerDialogs(input) {
|
|
|
8424
8424
|
};
|
|
8425
8425
|
}
|
|
8426
8426
|
function computeGridSpacingPx2(documentGridSpacing) {
|
|
8427
|
-
return
|
|
8427
|
+
return chunkLY5535CF_js.computeGridSpacingPx(documentGridSpacing, chunkIK25LY4C_js.GRID_SIZE);
|
|
8428
8428
|
}
|
|
8429
8429
|
function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows, presentationProperties) {
|
|
8430
8430
|
const activeShow = activeCustomShowId ? customShows.find((show) => show.id === activeCustomShowId) : void 0;
|
|
8431
|
-
const authoredRange =
|
|
8432
|
-
return
|
|
8431
|
+
const authoredRange = chunkLY5535CF_js.resolveAuthoredSlideRange(presentationProperties, slides.length);
|
|
8432
|
+
return chunkLY5535CF_js.resolveShowSlideIndexes(slides, activeShow, authoredRange);
|
|
8433
8433
|
}
|
|
8434
8434
|
function computeSlideSectionGroups(slides, sections) {
|
|
8435
|
-
return
|
|
8436
|
-
id: group.section?.id ?? (sections.length > 0 ?
|
|
8435
|
+
return chunkLY5535CF_js.groupSlidesBySection(sections, slides).map((group) => ({
|
|
8436
|
+
id: group.section?.id ?? (sections.length > 0 ? chunkIK25LY4C_js.UNGROUPED_SECTION_ID : chunkIK25LY4C_js.DEFAULT_SECTION_GROUP_ID),
|
|
8437
8437
|
label: group.section?.name ?? (sections.length > 0 ? "Ungrouped Slides" : "Slides"),
|
|
8438
8438
|
slideIndexes: group.slideIndexes,
|
|
8439
8439
|
...group.section?.color !== void 0 ? { color: group.section.color } : {},
|
|
@@ -8445,7 +8445,7 @@ function computeMasterPseudoSlide(mode, activeLayout, activeMaster) {
|
|
|
8445
8445
|
return void 0;
|
|
8446
8446
|
}
|
|
8447
8447
|
const document2 = activeLayout ? { slideMasters: [{ ...activeMaster, layouts: [activeLayout] }] } : { slideMasters: [activeMaster] };
|
|
8448
|
-
return
|
|
8448
|
+
return chunkLY5535CF_js.masterViewPseudoSlide(document2, {
|
|
8449
8449
|
tab: "slides",
|
|
8450
8450
|
masterIndex: 0,
|
|
8451
8451
|
layoutIndex: activeLayout ? 0 : null
|
|
@@ -8473,15 +8473,15 @@ function useDerivedSlideState(input) {
|
|
|
8473
8473
|
[slides, activeCustomShowId, customShows, presentationProperties]
|
|
8474
8474
|
);
|
|
8475
8475
|
const authoredRange = react.useMemo(
|
|
8476
|
-
() =>
|
|
8476
|
+
() => chunkLY5535CF_js.resolveAuthoredSlideRange(presentationProperties, slides.length),
|
|
8477
8477
|
[presentationProperties, slides.length]
|
|
8478
8478
|
);
|
|
8479
8479
|
const slideSectionGroups = react.useMemo(
|
|
8480
8480
|
() => computeSlideSectionGroups(slides, sections).map((group) => {
|
|
8481
|
-
if (group.id ===
|
|
8481
|
+
if (group.id === chunkIK25LY4C_js.UNGROUPED_SECTION_ID && group.label === "Ungrouped Slides") {
|
|
8482
8482
|
return { ...group, label: t("pptx.slides.ungroupedSlides") };
|
|
8483
8483
|
}
|
|
8484
|
-
if (group.id ===
|
|
8484
|
+
if (group.id === chunkIK25LY4C_js.DEFAULT_SECTION_GROUP_ID && group.label === "Slides") {
|
|
8485
8485
|
return { ...group, label: t("pptx.sections.slides") };
|
|
8486
8486
|
}
|
|
8487
8487
|
return group;
|
|
@@ -8582,13 +8582,13 @@ function useAnnotationHandlers(input) {
|
|
|
8582
8582
|
}, [annotations, setMode, setSlides, history]);
|
|
8583
8583
|
const handleSetMode = react.useCallback(
|
|
8584
8584
|
(nextMode) => {
|
|
8585
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8585
|
+
if (mode === "present" && nextMode !== "present" && !chunkLY5535CF_js.mayLeaveSlideShow()) {
|
|
8586
8586
|
return;
|
|
8587
8587
|
}
|
|
8588
8588
|
if (nextMode === "present") {
|
|
8589
8589
|
presentation.enterPresentMode();
|
|
8590
8590
|
} else if (mode === "present" && annotations.hasAnyAnnotations) {
|
|
8591
|
-
|
|
8591
|
+
chunkLY5535CF_js.stopAllPersistentAudio();
|
|
8592
8592
|
if (promptKeepInkAnnotations) {
|
|
8593
8593
|
pendingModeAfterAnnotationsRef.current = nextMode;
|
|
8594
8594
|
setShowKeepAnnotationsDialog(true);
|
|
@@ -8598,7 +8598,7 @@ function useAnnotationHandlers(input) {
|
|
|
8598
8598
|
}
|
|
8599
8599
|
} else {
|
|
8600
8600
|
if (mode === "present") {
|
|
8601
|
-
|
|
8601
|
+
chunkLY5535CF_js.stopAllPersistentAudio();
|
|
8602
8602
|
}
|
|
8603
8603
|
setMode(nextMode);
|
|
8604
8604
|
}
|
|
@@ -8667,13 +8667,13 @@ function useSerialize(input) {
|
|
|
8667
8667
|
let processedSlide = slide;
|
|
8668
8668
|
if (pendingEditId) {
|
|
8669
8669
|
const updatedElements = slide.elements.map((el) => {
|
|
8670
|
-
if (el.id !== pendingEditId || !
|
|
8670
|
+
if (el.id !== pendingEditId || !chunkLY5535CF_js.hasTextProperties(el)) {
|
|
8671
8671
|
return el;
|
|
8672
8672
|
}
|
|
8673
8673
|
return {
|
|
8674
8674
|
...el,
|
|
8675
8675
|
text: pendingEditText,
|
|
8676
|
-
textSegments:
|
|
8676
|
+
textSegments: chunkLY5535CF_js.remapTextToSegments(pendingEditText, el.textSegments, el.textStyle)
|
|
8677
8677
|
};
|
|
8678
8678
|
});
|
|
8679
8679
|
if (updatedElements.some((el, i) => el !== slide.elements[i])) {
|
|
@@ -8686,19 +8686,19 @@ function useSerialize(input) {
|
|
|
8686
8686
|
const pptxGuides = guides.map((g) => ({
|
|
8687
8687
|
id: g.id,
|
|
8688
8688
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
8689
|
-
positionEmu:
|
|
8689
|
+
positionEmu: chunkLY5535CF_js.guidePxToEmu(g.position)
|
|
8690
8690
|
}));
|
|
8691
8691
|
return {
|
|
8692
8692
|
...processedSlide,
|
|
8693
8693
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
8694
8694
|
};
|
|
8695
8695
|
});
|
|
8696
|
-
const slidesToSave =
|
|
8697
|
-
const saveOptions =
|
|
8696
|
+
const slidesToSave = chunkLY5535CF_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
8697
|
+
const saveOptions = chunkLY5535CF_js.buildDeckSaveOptions({
|
|
8698
8698
|
// Without this the Slide Size card edited a viewer-only pixel value and
|
|
8699
8699
|
// the saved `p:sldSz` never moved: passing `slideSize` is the only way a
|
|
8700
8700
|
// slide-size edit reaches the file.
|
|
8701
|
-
slideSize:
|
|
8701
|
+
slideSize: chunkLY5535CF_js.resolveSlideSizeSelection({ current: slideSizeEmu, canvas: canvasSize }).size,
|
|
8702
8702
|
headerFooter,
|
|
8703
8703
|
presentationProperties,
|
|
8704
8704
|
viewProperties,
|
|
@@ -8717,7 +8717,7 @@ function useSerialize(input) {
|
|
|
8717
8717
|
embedFonts,
|
|
8718
8718
|
outputFormat: format
|
|
8719
8719
|
});
|
|
8720
|
-
return
|
|
8720
|
+
return chunkLY5535CF_js.saveDeckWithPassword(handler, slidesToSave, saveOptions, { password, purpose });
|
|
8721
8721
|
},
|
|
8722
8722
|
[
|
|
8723
8723
|
slides,
|
|
@@ -8758,7 +8758,7 @@ function useRecoveryDetection(input) {
|
|
|
8758
8758
|
const onRestore = input.onRestore;
|
|
8759
8759
|
const openVersionHistory = input.openVersionHistory;
|
|
8760
8760
|
react.useEffect(() => {
|
|
8761
|
-
if (!
|
|
8761
|
+
if (!chunkLY5535CF_js.shouldProbeAutosaveRecovery({
|
|
8762
8762
|
alreadyChecked: recoveryCheckedRef.current,
|
|
8763
8763
|
filePath,
|
|
8764
8764
|
loading,
|
|
@@ -8770,7 +8770,7 @@ function useRecoveryDetection(input) {
|
|
|
8770
8770
|
}
|
|
8771
8771
|
recoveryCheckedRef.current = true;
|
|
8772
8772
|
void (async () => {
|
|
8773
|
-
const offer = await
|
|
8773
|
+
const offer = await chunkLY5535CF_js.probeAutosaveRecovery(filePath);
|
|
8774
8774
|
if (!offer) {
|
|
8775
8775
|
return;
|
|
8776
8776
|
}
|
|
@@ -8783,7 +8783,7 @@ function useRecoveryDetection(input) {
|
|
|
8783
8783
|
const record = recordRef.current;
|
|
8784
8784
|
setPrompt(null);
|
|
8785
8785
|
if (record && onRestore) {
|
|
8786
|
-
onRestore(
|
|
8786
|
+
onRestore(chunkLY5535CF_js.acceptAutosaveRecovery(record));
|
|
8787
8787
|
}
|
|
8788
8788
|
recordRef.current = null;
|
|
8789
8789
|
}, [onRestore]);
|
|
@@ -8792,7 +8792,7 @@ function useRecoveryDetection(input) {
|
|
|
8792
8792
|
setPrompt(null);
|
|
8793
8793
|
recordRef.current = null;
|
|
8794
8794
|
if (record) {
|
|
8795
|
-
void
|
|
8795
|
+
void chunkLY5535CF_js.discardAutosaveRecovery(record);
|
|
8796
8796
|
}
|
|
8797
8797
|
}, []);
|
|
8798
8798
|
return { prompt, restore, discard };
|
|
@@ -8840,11 +8840,11 @@ function usePresentationSetup(input) {
|
|
|
8840
8840
|
containerRef,
|
|
8841
8841
|
content,
|
|
8842
8842
|
onSetMode: (nextMode) => {
|
|
8843
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8843
|
+
if (mode === "present" && nextMode !== "present" && !chunkLY5535CF_js.mayLeaveSlideShow()) {
|
|
8844
8844
|
return;
|
|
8845
8845
|
}
|
|
8846
8846
|
if (mode === "present" && nextMode !== "present") {
|
|
8847
|
-
|
|
8847
|
+
chunkLY5535CF_js.stopAllPersistentAudio();
|
|
8848
8848
|
stopAnimationSound();
|
|
8849
8849
|
const exitHandler = exitModeHandlerRef.current;
|
|
8850
8850
|
if (exitHandler) {
|
|
@@ -8912,10 +8912,10 @@ function usePresentationSetup(input) {
|
|
|
8912
8912
|
onToggleToolbar: () => annotations.setToolbarVisible(!annotations.toolbarVisible),
|
|
8913
8913
|
onToggleSubtitles,
|
|
8914
8914
|
onSaveRehearsalTimings: (timings) => {
|
|
8915
|
-
setSlides((prev) =>
|
|
8915
|
+
setSlides((prev) => chunkLY5535CF_js.applyRehearsalTimings(prev, timings));
|
|
8916
8916
|
history.markDirty();
|
|
8917
8917
|
},
|
|
8918
|
-
loopContinuously:
|
|
8918
|
+
loopContinuously: chunkLY5535CF_js.shouldLoopContinuously(presentationProperties),
|
|
8919
8919
|
showWithAnimation: presentationProperties.showWithAnimation,
|
|
8920
8920
|
useTimings: presentationProperties.advanceMode !== "manual",
|
|
8921
8921
|
endWithBlackSlide,
|
|
@@ -9121,7 +9121,7 @@ function useEditorOperations(input) {
|
|
|
9121
9121
|
const { formatPainterActive, setFormatPainterActive, elementLookup } = state;
|
|
9122
9122
|
react.useEffect(() => {
|
|
9123
9123
|
if (formatPainterActive && !prevFormatPainterRef.current && selectedElement) {
|
|
9124
|
-
copiedFormatRef.current =
|
|
9124
|
+
copiedFormatRef.current = chunkLY5535CF_js.copyFormatFromElement(selectedElement);
|
|
9125
9125
|
} else if (!formatPainterActive) {
|
|
9126
9126
|
copiedFormatRef.current = null;
|
|
9127
9127
|
}
|
|
@@ -9147,12 +9147,12 @@ function useEditorOperations(input) {
|
|
|
9147
9147
|
e.stopPropagation();
|
|
9148
9148
|
const element = elementLookup.get(elementId);
|
|
9149
9149
|
if (element) {
|
|
9150
|
-
const updated =
|
|
9150
|
+
const updated = chunkLY5535CF_js.applyFormatToElement(element, copiedFormatRef.current);
|
|
9151
9151
|
const updates = {};
|
|
9152
|
-
if (
|
|
9152
|
+
if (chunkLY5535CF_js.hasShapeProperties(updated)) {
|
|
9153
9153
|
updates.shapeStyle = updated.shapeStyle;
|
|
9154
9154
|
}
|
|
9155
|
-
if (
|
|
9155
|
+
if (chunkLY5535CF_js.hasTextProperties(updated)) {
|
|
9156
9156
|
updates.textStyle = updated.textStyle;
|
|
9157
9157
|
}
|
|
9158
9158
|
ops.updateElementById(elementId, updates);
|
|
@@ -9336,10 +9336,10 @@ function useFontInjection({ embeddedFonts, slides }) {
|
|
|
9336
9336
|
}
|
|
9337
9337
|
};
|
|
9338
9338
|
}, [embeddedFonts]);
|
|
9339
|
-
const referencedFamilies = react.useMemo(() =>
|
|
9339
|
+
const referencedFamilies = react.useMemo(() => chunkLY5535CF_js.collectReferencedFontFamilies(slides), [slides]);
|
|
9340
9340
|
react.useEffect(() => {
|
|
9341
9341
|
let cancelled = false;
|
|
9342
|
-
void
|
|
9342
|
+
void chunkLY5535CF_js.resolveGoogleWebfontHref(slides, embeddedFonts).then((href) => {
|
|
9343
9343
|
if (cancelled) {
|
|
9344
9344
|
return null;
|
|
9345
9345
|
}
|
|
@@ -9529,7 +9529,7 @@ function useKeyboardShortcuts(input) {
|
|
|
9529
9529
|
inputRef.current = input;
|
|
9530
9530
|
const handleKeyDown = react.useCallback((e) => {
|
|
9531
9531
|
const current = inputRef.current;
|
|
9532
|
-
const startAction =
|
|
9532
|
+
const startAction = chunkLY5535CF_js.mapSlideShowStartKey(e, { isPresenting: current.mode === "present" });
|
|
9533
9533
|
if (startAction !== null) {
|
|
9534
9534
|
e.preventDefault();
|
|
9535
9535
|
if (startAction === "fromBeginning") {
|
|
@@ -9539,7 +9539,7 @@ function useKeyboardShortcuts(input) {
|
|
|
9539
9539
|
}
|
|
9540
9540
|
return;
|
|
9541
9541
|
}
|
|
9542
|
-
const { action, dx, dy } =
|
|
9542
|
+
const { action, dx, dy } = chunkLY5535CF_js.mapEditorKey(e, {
|
|
9543
9543
|
canEdit: current.canEdit,
|
|
9544
9544
|
// The Slide Master view is an editing surface, not a viewing one.
|
|
9545
9545
|
// Gating on `mode !== 'edit'` alone made `mapEditorKey` return
|
|
@@ -9552,7 +9552,7 @@ function useKeyboardShortcuts(input) {
|
|
|
9552
9552
|
hasSelection: current.hasSelection,
|
|
9553
9553
|
isEditingText: Boolean(current.inlineEditingElementId || current.tableEditorState?.isEditing),
|
|
9554
9554
|
isDrawing: current.activeTool !== "select",
|
|
9555
|
-
isTextInputTarget:
|
|
9555
|
+
isTextInputTarget: chunkLY5535CF_js.isEditorTextInputTarget(e.target)
|
|
9556
9556
|
});
|
|
9557
9557
|
if (action === null) {
|
|
9558
9558
|
return;
|
|
@@ -9882,7 +9882,7 @@ function useViewerIntegration(input) {
|
|
|
9882
9882
|
return zoom.scale;
|
|
9883
9883
|
},
|
|
9884
9884
|
setZoom(level) {
|
|
9885
|
-
zoom.setScale(
|
|
9885
|
+
zoom.setScale(chunkLY5535CF_js.clampZoomScale(level));
|
|
9886
9886
|
},
|
|
9887
9887
|
zoomIn() {
|
|
9888
9888
|
zoom.handleZoomIn();
|
|
@@ -10100,7 +10100,7 @@ function useReducedMotion() {
|
|
|
10100
10100
|
}
|
|
10101
10101
|
function useViewerOptions() {
|
|
10102
10102
|
const storeRef = react.useRef(null);
|
|
10103
|
-
storeRef.current ??=
|
|
10103
|
+
storeRef.current ??= chunkLY5535CF_js.createViewerOptionsStore();
|
|
10104
10104
|
const store = storeRef.current;
|
|
10105
10105
|
const options = react.useSyncExternalStore(
|
|
10106
10106
|
(onStoreChange) => store.subscribe(onStoreChange),
|
|
@@ -10109,9 +10109,9 @@ function useViewerOptions() {
|
|
|
10109
10109
|
);
|
|
10110
10110
|
return { optionsStore: store, options };
|
|
10111
10111
|
}
|
|
10112
|
-
var KNOWN_TAB_IDS = new Set(
|
|
10112
|
+
var KNOWN_TAB_IDS = new Set(chunkLY5535CF_js.TOOLBAR_TABS.map((tab) => tab.id));
|
|
10113
10113
|
function computeToolbarVisibility(hiddenActions, hiddenTabIds = []) {
|
|
10114
|
-
const isHidden = (id) =>
|
|
10114
|
+
const isHidden = (id) => chunkLY5535CF_js.isActionHidden(id, hiddenActions);
|
|
10115
10115
|
const userHidden = new Set(hiddenTabIds);
|
|
10116
10116
|
userHidden.delete("file");
|
|
10117
10117
|
const isTabVisible = (id) => !KNOWN_TAB_IDS.has(id) || !isHidden(id) && !userHidden.has(id);
|
|
@@ -10204,12 +10204,12 @@ function useYjsDocumentSync({
|
|
|
10204
10204
|
return;
|
|
10205
10205
|
}
|
|
10206
10206
|
try {
|
|
10207
|
-
const handler = new
|
|
10207
|
+
const handler = new chunkLY5535CF_js.PptxHandler();
|
|
10208
10208
|
await handler.load(sourceBytes.buffer);
|
|
10209
|
-
const currentSlides =
|
|
10209
|
+
const currentSlides = chunkLY5535CF_js.readSlidesFromYDoc(
|
|
10210
10210
|
doc
|
|
10211
10211
|
);
|
|
10212
|
-
const slidesToSave =
|
|
10212
|
+
const slidesToSave = chunkLY5535CF_js.buildSaveSlides(currentSlides, templateElementsBySlideId);
|
|
10213
10213
|
const bytes = await handler.save(slidesToSave, getSaveOptions?.());
|
|
10214
10214
|
config.onWriteBack(bytes);
|
|
10215
10215
|
} catch {
|
|
@@ -10224,10 +10224,10 @@ function useYjsDocumentSync({
|
|
|
10224
10224
|
if (!doc || !isConnected) {
|
|
10225
10225
|
return;
|
|
10226
10226
|
}
|
|
10227
|
-
const docSlides =
|
|
10227
|
+
const docSlides = chunkLY5535CF_js.readSlidesFromYDoc(
|
|
10228
10228
|
doc
|
|
10229
10229
|
);
|
|
10230
|
-
if (!
|
|
10230
|
+
if (!chunkLY5535CF_js.shouldRoomSlidesReplaceLoad(loadOrigin, docSlides.length)) {
|
|
10231
10231
|
return;
|
|
10232
10232
|
}
|
|
10233
10233
|
lastSyncedRef.current = JSON.stringify(docSlides);
|
|
@@ -10246,11 +10246,11 @@ function useYjsDocumentSync({
|
|
|
10246
10246
|
lastSyncedRef.current = serialized;
|
|
10247
10247
|
void (async () => {
|
|
10248
10248
|
const factories = await getFactories();
|
|
10249
|
-
|
|
10249
|
+
chunkLY5535CF_js.reconcileSlidesInYDoc(
|
|
10250
10250
|
slides,
|
|
10251
10251
|
doc,
|
|
10252
10252
|
factories,
|
|
10253
|
-
|
|
10253
|
+
chunkLY5535CF_js.LOCAL_SYNC_ORIGIN
|
|
10254
10254
|
);
|
|
10255
10255
|
scheduleWriteBack();
|
|
10256
10256
|
})();
|
|
@@ -10264,10 +10264,10 @@ function useYjsDocumentSync({
|
|
|
10264
10264
|
return;
|
|
10265
10265
|
}
|
|
10266
10266
|
const handleChange = (_events, transaction) => {
|
|
10267
|
-
if (transaction?.origin ===
|
|
10267
|
+
if (transaction?.origin === chunkLY5535CF_js.LOCAL_SYNC_ORIGIN) {
|
|
10268
10268
|
return;
|
|
10269
10269
|
}
|
|
10270
|
-
const remoteSlides =
|
|
10270
|
+
const remoteSlides = chunkLY5535CF_js.readSlidesFromYDoc(
|
|
10271
10271
|
doc
|
|
10272
10272
|
);
|
|
10273
10273
|
if (remoteSlides.length === 0) {
|
|
@@ -10283,7 +10283,7 @@ function useYjsDocumentSync({
|
|
|
10283
10283
|
isApplyingRemoteRef.current = false;
|
|
10284
10284
|
scheduleWriteBack();
|
|
10285
10285
|
};
|
|
10286
|
-
const unobserve =
|
|
10286
|
+
const unobserve = chunkLY5535CF_js.observeYDocSlides(
|
|
10287
10287
|
doc,
|
|
10288
10288
|
handleChange
|
|
10289
10289
|
);
|
|
@@ -10321,7 +10321,7 @@ function useBroadcastFollower({
|
|
|
10321
10321
|
if (!broadcaster) {
|
|
10322
10322
|
return;
|
|
10323
10323
|
}
|
|
10324
|
-
if (!
|
|
10324
|
+
if (!chunkLY5535CF_js.shouldAutoFollowBroadcaster({
|
|
10325
10325
|
localRole: collab.config.role,
|
|
10326
10326
|
broadcasterRole: broadcaster.role
|
|
10327
10327
|
})) {
|
|
@@ -10492,7 +10492,7 @@ function subscribeTouchCapability(callback) {
|
|
|
10492
10492
|
function useIsMobile() {
|
|
10493
10493
|
const isTouchDevice = react.useSyncExternalStore(
|
|
10494
10494
|
subscribeTouchCapability,
|
|
10495
|
-
|
|
10495
|
+
chunkLY5535CF_js.detectTouchDevice,
|
|
10496
10496
|
() => false
|
|
10497
10497
|
// server snapshot
|
|
10498
10498
|
);
|
|
@@ -10502,7 +10502,7 @@ function useIsMobile() {
|
|
|
10502
10502
|
const [viewportHeight, setViewportHeight] = react.useState(
|
|
10503
10503
|
() => typeof window === "undefined" ? 768 : window.innerHeight
|
|
10504
10504
|
);
|
|
10505
|
-
const [orientation, setOrientation] = react.useState(
|
|
10505
|
+
const [orientation, setOrientation] = react.useState(chunkLY5535CF_js.detectOrientation);
|
|
10506
10506
|
const [isVirtualKeyboardOpen, setIsVirtualKeyboardOpen] = react.useState(false);
|
|
10507
10507
|
const [initialViewportHeight] = react.useState(
|
|
10508
10508
|
() => typeof window !== "undefined" ? window.innerHeight : 800
|
|
@@ -10523,7 +10523,7 @@ function useIsMobile() {
|
|
|
10523
10523
|
return;
|
|
10524
10524
|
}
|
|
10525
10525
|
const handleOrientationChange = () => {
|
|
10526
|
-
setOrientation(
|
|
10526
|
+
setOrientation(chunkLY5535CF_js.detectOrientation());
|
|
10527
10527
|
};
|
|
10528
10528
|
if (screen.orientation) {
|
|
10529
10529
|
screen.orientation.addEventListener("change", handleOrientationChange);
|
|
@@ -10553,7 +10553,7 @@ function useIsMobile() {
|
|
|
10553
10553
|
window.addEventListener("resize", handleResize);
|
|
10554
10554
|
return () => window.removeEventListener("resize", handleResize);
|
|
10555
10555
|
}, [isTouchDevice, initialViewportHeight]);
|
|
10556
|
-
const { isMobile, isTablet, isDesktop } =
|
|
10556
|
+
const { isMobile, isTablet, isDesktop } = chunkLY5535CF_js.deriveViewportBreakpoints(
|
|
10557
10557
|
viewportWidth,
|
|
10558
10558
|
viewportHeight,
|
|
10559
10559
|
isTouchDevice
|
|
@@ -10584,10 +10584,10 @@ function useTouchGestures(input) {
|
|
|
10584
10584
|
if (!el || !enabled) {
|
|
10585
10585
|
return;
|
|
10586
10586
|
}
|
|
10587
|
-
const recognizer =
|
|
10587
|
+
const recognizer = chunkLY5535CF_js.createTouchGestureRecognizer({
|
|
10588
10588
|
getScale: () => scaleRef.current,
|
|
10589
|
-
minScale:
|
|
10590
|
-
maxScale:
|
|
10589
|
+
minScale: chunkLY5535CF_js.MIN_ZOOM_SCALE,
|
|
10590
|
+
maxScale: chunkLY5535CF_js.MAX_ZOOM_SCALE,
|
|
10591
10591
|
callbacks: {
|
|
10592
10592
|
onPinchZoom: (newScale) => callbacksRef.current.onPinchZoom?.(newScale),
|
|
10593
10593
|
onSwipe: (direction) => callbacksRef.current.onSwipe?.(direction),
|
|
@@ -10627,7 +10627,7 @@ function scrollFocusedIntoView(keyboardInset) {
|
|
|
10627
10627
|
return;
|
|
10628
10628
|
}
|
|
10629
10629
|
const rect = active.getBoundingClientRect();
|
|
10630
|
-
const delta =
|
|
10630
|
+
const delta = chunkLY5535CF_js.computeScrollDelta(
|
|
10631
10631
|
{ top: rect.top, bottom: rect.bottom },
|
|
10632
10632
|
window.innerHeight,
|
|
10633
10633
|
keyboardInset
|
|
@@ -10647,8 +10647,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10647
10647
|
return;
|
|
10648
10648
|
}
|
|
10649
10649
|
const update = () => {
|
|
10650
|
-
const metrics =
|
|
10651
|
-
const inset = metrics ?
|
|
10650
|
+
const metrics = chunkLY5535CF_js.readViewportMetrics(window);
|
|
10651
|
+
const inset = metrics ? chunkLY5535CF_js.computeKeyboardInset(metrics) : 0;
|
|
10652
10652
|
setKeyboardInset(inset);
|
|
10653
10653
|
if (inset > 0) {
|
|
10654
10654
|
window.requestAnimationFrame(() => scrollFocusedIntoView(inset));
|
|
@@ -10659,8 +10659,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10659
10659
|
vv.addEventListener("scroll", update);
|
|
10660
10660
|
const onFocusIn = () => {
|
|
10661
10661
|
window.requestAnimationFrame(() => {
|
|
10662
|
-
const metrics =
|
|
10663
|
-
const inset = metrics ?
|
|
10662
|
+
const metrics = chunkLY5535CF_js.readViewportMetrics(window);
|
|
10663
|
+
const inset = metrics ? chunkLY5535CF_js.computeKeyboardInset(metrics) : 0;
|
|
10664
10664
|
if (inset > 0) {
|
|
10665
10665
|
scrollFocusedIntoView(inset);
|
|
10666
10666
|
}
|
|
@@ -10673,7 +10673,7 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10673
10673
|
document.removeEventListener("focusin", onFocusIn);
|
|
10674
10674
|
};
|
|
10675
10675
|
}, [enabled]);
|
|
10676
|
-
return { keyboardInset, isKeyboardOpen:
|
|
10676
|
+
return { keyboardInset, isKeyboardOpen: chunkLY5535CF_js.isKeyboardOpen(keyboardInset) };
|
|
10677
10677
|
}
|
|
10678
10678
|
|
|
10679
10679
|
// src/viewer/hooks/useViewerBuildingBlocks-canvas-props.ts
|
|
@@ -10702,21 +10702,21 @@ function buildCanvasProps(input) {
|
|
|
10702
10702
|
} = input;
|
|
10703
10703
|
const effectiveSlide = mode === "master" ? masterPseudoSlide : activeSlide;
|
|
10704
10704
|
const effectiveTemplateElements = mode === "master" ? s.activeLayout ? s.activeMaster?.elements ?? [] : [] : templateElements;
|
|
10705
|
-
const fieldContext =
|
|
10705
|
+
const fieldContext = chunkLY5535CF_js.buildFieldSubstitutionContext({
|
|
10706
10706
|
headerFooter: s.headerFooter,
|
|
10707
10707
|
customProperties: s.customProperties,
|
|
10708
10708
|
slide: activeSlide
|
|
10709
10709
|
});
|
|
10710
10710
|
const tableStyleContext = s.theme || s.tableStyleMap ? { theme: s.theme, tableStyleMap: s.tableStyleMap } : void 0;
|
|
10711
10711
|
const openExternalUrl = (url, target) => {
|
|
10712
|
-
if (
|
|
10712
|
+
if (chunkLY5535CF_js.shouldConfirmExternalHyperlink(viewerOptions, url) && !window.confirm(buildHyperlinkConfirmMessage(url))) {
|
|
10713
10713
|
return;
|
|
10714
10714
|
}
|
|
10715
|
-
|
|
10715
|
+
chunkLY5535CF_js.safeOpenUrl(url, target);
|
|
10716
10716
|
};
|
|
10717
10717
|
const handleActionClick = (elementId, action) => {
|
|
10718
10718
|
if (mode === "present") {
|
|
10719
|
-
const resolved =
|
|
10719
|
+
const resolved = chunkLY5535CF_js.resolvePresentationAction(action, { slideCount: slides.length });
|
|
10720
10720
|
if (resolved.intent.kind === "openUrl") {
|
|
10721
10721
|
openExternalUrl(resolved.intent.url);
|
|
10722
10722
|
return;
|
|
@@ -10727,9 +10727,9 @@ function buildCanvasProps(input) {
|
|
|
10727
10727
|
}
|
|
10728
10728
|
};
|
|
10729
10729
|
const handleHyperlinkClick = (url, target) => {
|
|
10730
|
-
if (
|
|
10730
|
+
if (chunkLY5535CF_js.isPpactionUrl(url)) {
|
|
10731
10731
|
if (mode === "present") {
|
|
10732
|
-
const parsed =
|
|
10732
|
+
const parsed = chunkLY5535CF_js.parsePpactionUrl(url);
|
|
10733
10733
|
if (parsed) {
|
|
10734
10734
|
presentation.handlePresentationAction({
|
|
10735
10735
|
action: parsed.action,
|
|
@@ -10835,7 +10835,7 @@ function buildCanvasProps(input) {
|
|
|
10835
10835
|
|
|
10836
10836
|
// src/viewer/hooks/useScopedLayoutOptions.ts
|
|
10837
10837
|
function scopeLayoutOptionsToActiveSlide(options, activeSlide) {
|
|
10838
|
-
return
|
|
10838
|
+
return chunkLY5535CF_js.scopeLayoutOptionsToSlide(options, activeSlide?.layoutPath);
|
|
10839
10839
|
}
|
|
10840
10840
|
|
|
10841
10841
|
// src/viewer/hooks/useViewerBuildingBlocks-toolbar-handlers.ts
|
|
@@ -10848,7 +10848,7 @@ function buildToolbarAnimationHandlers(input) {
|
|
|
10848
10848
|
const current = activeSlide.animations ?? [];
|
|
10849
10849
|
if (group === "motionPath") {
|
|
10850
10850
|
propertyHandlers.handleUpdateSlide({
|
|
10851
|
-
animations:
|
|
10851
|
+
animations: chunkLY5535CF_js.applyMotionPathPreset(current, selectedElement.id, preset)
|
|
10852
10852
|
});
|
|
10853
10853
|
return;
|
|
10854
10854
|
}
|
|
@@ -11044,7 +11044,7 @@ function buildToolbarProps(input) {
|
|
|
11044
11044
|
onOpenFile,
|
|
11045
11045
|
onOpenRecentFile,
|
|
11046
11046
|
onCreatePresentation: (templateId) => {
|
|
11047
|
-
s.setSlides(
|
|
11047
|
+
s.setSlides(chunkLY5535CF_js.createBackstagePresentation(templateId));
|
|
11048
11048
|
s.setActiveSlideIndex(0);
|
|
11049
11049
|
s.setSelectedElementId(null);
|
|
11050
11050
|
s.setSelectedElementIds([]);
|
|
@@ -11074,7 +11074,7 @@ function buildToolbarProps(input) {
|
|
|
11074
11074
|
loadLayoutPreviews: input.loadLayoutPreviews,
|
|
11075
11075
|
onInsertSlideFromLayout: slideOps.handleInsertSlideFromLayout,
|
|
11076
11076
|
onInsertSlideFromTemplate: slideOps.handleInsertSlideFromTemplate,
|
|
11077
|
-
templateScheme:
|
|
11077
|
+
templateScheme: chunkLY5535CF_js.templateSchemeFromTheme(s.theme?.colorScheme),
|
|
11078
11078
|
customShows: s.customShows,
|
|
11079
11079
|
activeCustomShowId: s.activeCustomShowId,
|
|
11080
11080
|
onSetActiveCustomShowId: s.setActiveCustomShowId,
|
|
@@ -11115,7 +11115,7 @@ function buildToolbarProps(input) {
|
|
|
11115
11115
|
isCommentsPanelOpen: s.isInspectorPaneOpen,
|
|
11116
11116
|
slideCommentCount: activeSlide?.comments?.length ?? 0,
|
|
11117
11117
|
formatPainterActive: s.formatPainterActive,
|
|
11118
|
-
canActivateFormatPainter:
|
|
11118
|
+
canActivateFormatPainter: chunkLY5535CF_js.hasCopyableFormat(selectedElement),
|
|
11119
11119
|
onToggleFormatPainter: () => s.setFormatPainterActive((p) => !p),
|
|
11120
11120
|
isSelectionPaneOpen: s.isSelectionPaneOpen,
|
|
11121
11121
|
onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
|
|
@@ -11193,7 +11193,7 @@ function useViewerBuildingBlocksCore(input) {
|
|
|
11193
11193
|
headerFooter: state.headerFooter,
|
|
11194
11194
|
loading,
|
|
11195
11195
|
error,
|
|
11196
|
-
maxHistoryEntries:
|
|
11196
|
+
maxHistoryEntries: chunkLY5535CF_js.resolveHistoryDepth(viewerOptions),
|
|
11197
11197
|
hasActivePointerInteraction,
|
|
11198
11198
|
pointerCommitNonce: state.pointerCommitNonce,
|
|
11199
11199
|
onDirty: markDocumentDirty,
|
|
@@ -11218,7 +11218,7 @@ function useViewerBuildingBlocksCore(input) {
|
|
|
11218
11218
|
documentGridSpacing: state.viewProperties?.gridSpacing
|
|
11219
11219
|
});
|
|
11220
11220
|
const themeColorMap = react.useMemo(
|
|
11221
|
-
() => state.theme?.colorScheme ?
|
|
11221
|
+
() => state.theme?.colorScheme ? chunkLY5535CF_js.buildThemeColorMap(state.theme.colorScheme) : void 0,
|
|
11222
11222
|
[state.theme?.colorScheme]
|
|
11223
11223
|
);
|
|
11224
11224
|
const { presentation, annotations, actionSoundHandlerRef, setExitModeHandler } = usePresentationSetup({
|
|
@@ -11267,7 +11267,7 @@ function useViewerBuildingBlocksCore(input) {
|
|
|
11267
11267
|
gridSpacingPx,
|
|
11268
11268
|
// Multiplied against the pre-existing 2x baseline; see the matching
|
|
11269
11269
|
// comment in `PowerPointViewer.tsx`.
|
|
11270
|
-
imageExportScale: 2 *
|
|
11270
|
+
imageExportScale: 2 * chunkLY5535CF_js.resolveImageResolutionScale(viewerOptions),
|
|
11271
11271
|
viewerOptions
|
|
11272
11272
|
};
|
|
11273
11273
|
}
|
|
@@ -11283,7 +11283,7 @@ function useCompatibilityToastsState() {
|
|
|
11283
11283
|
}
|
|
11284
11284
|
function useReadOnlyRecommendationState(content) {
|
|
11285
11285
|
const [recommendation, setRecommendation] = react.useState(
|
|
11286
|
-
() =>
|
|
11286
|
+
() => chunkLY5535CF_js.readOnlyRecommendation(void 0)
|
|
11287
11287
|
);
|
|
11288
11288
|
const [modifyVerifier, setModifyVerifier] = react.useState(void 0);
|
|
11289
11289
|
const [bannerHidden, setBannerHidden] = react.useState(false);
|
|
@@ -11323,7 +11323,7 @@ function useReadOnlyRecommendationState(content) {
|
|
|
11323
11323
|
async (password) => {
|
|
11324
11324
|
setCheckingPassword(true);
|
|
11325
11325
|
try {
|
|
11326
|
-
const result = await
|
|
11326
|
+
const result = await chunkLY5535CF_js.checkModifyPassword(modifyVerifier, password);
|
|
11327
11327
|
if (result.ok) {
|
|
11328
11328
|
unlock();
|
|
11329
11329
|
} else {
|
|
@@ -11368,9 +11368,9 @@ function useViewPreferencesSync(input) {
|
|
|
11368
11368
|
setShowGuides
|
|
11369
11369
|
} = input;
|
|
11370
11370
|
react.useEffect(() => {
|
|
11371
|
-
const seeded =
|
|
11371
|
+
const seeded = chunkLY5535CF_js.viewerPreferencesFromViewProperties(
|
|
11372
11372
|
{ viewProperties },
|
|
11373
|
-
{ ...
|
|
11373
|
+
{ ...chunkLY5535CF_js.DEFAULT_VIEWER_PREFERENCES, snapToGrid, snapToObjects: snapToShape, showGuides }
|
|
11374
11374
|
);
|
|
11375
11375
|
setSnapToGrid(seeded.snapToGrid);
|
|
11376
11376
|
setSnapToShape(seeded.snapToObjects ?? snapToShape);
|
|
@@ -11380,7 +11380,7 @@ function useViewPreferencesSync(input) {
|
|
|
11380
11380
|
(prefsOverride) => {
|
|
11381
11381
|
setViewProperties((prev) => {
|
|
11382
11382
|
const merged = {
|
|
11383
|
-
...
|
|
11383
|
+
...chunkLY5535CF_js.DEFAULT_VIEWER_PREFERENCES,
|
|
11384
11384
|
snapToGrid,
|
|
11385
11385
|
snapToObjects: snapToShape,
|
|
11386
11386
|
showGuides,
|
|
@@ -11388,7 +11388,7 @@ function useViewPreferencesSync(input) {
|
|
|
11388
11388
|
gridSpacingCy: prev?.gridSpacing?.cy,
|
|
11389
11389
|
...prefsOverride
|
|
11390
11390
|
};
|
|
11391
|
-
const patch =
|
|
11391
|
+
const patch = chunkLY5535CF_js.viewPropertiesPatchFromPreferences(merged);
|
|
11392
11392
|
return {
|
|
11393
11393
|
...prev,
|
|
11394
11394
|
slideViewPr: { ...prev?.slideViewPr, ...patch.slideViewPr },
|
|
@@ -11607,7 +11607,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
11607
11607
|
}, [incomingContent]);
|
|
11608
11608
|
const onOpenFile = react.useCallback(() => {
|
|
11609
11609
|
void (async () => {
|
|
11610
|
-
const picked = await
|
|
11610
|
+
const picked = await chunkLY5535CF_js.openPptxFile();
|
|
11611
11611
|
if (picked) {
|
|
11612
11612
|
setContent(picked.buffer);
|
|
11613
11613
|
}
|
|
@@ -11615,7 +11615,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
11615
11615
|
}, []);
|
|
11616
11616
|
const onOpenRecentFile = react.useCallback((key) => {
|
|
11617
11617
|
void (async () => {
|
|
11618
|
-
const bytes = await
|
|
11618
|
+
const bytes = await chunkLY5535CF_js.readBackstageRecentFile(key);
|
|
11619
11619
|
if (bytes) {
|
|
11620
11620
|
setContent(bytes);
|
|
11621
11621
|
}
|