pptx-react-viewer 2.12.1 → 2.13.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 +2 -0
- package/dist/{AiChatPanel-CGGUPVQX.mjs → AiChatPanel-4YS6DEIT.mjs} +3 -3
- package/dist/AiChatPanel-4YS6DEIT.mjs.br +0 -0
- package/dist/AiChatPanel-4YS6DEIT.mjs.gz +0 -0
- package/dist/{AiChatPanel-UEFYTUJN.js → AiChatPanel-DEI3EQFM.js} +22 -22
- package/dist/AiChatPanel-DEI3EQFM.js.br +0 -0
- package/dist/AiChatPanel-DEI3EQFM.js.gz +0 -0
- package/dist/{Model3DScene-TU4NTHRM.mjs → Model3DScene-JSNQCKCJ.mjs} +1 -1
- package/dist/Model3DScene-JSNQCKCJ.mjs.br +0 -0
- package/dist/Model3DScene-JSNQCKCJ.mjs.gz +0 -0
- package/dist/{Model3DScene-QYXJNALP.js → Model3DScene-X4W7GZVY.js} +2 -2
- package/dist/Model3DScene-X4W7GZVY.js.br +0 -0
- package/dist/Model3DScene-X4W7GZVY.js.gz +0 -0
- package/dist/{SurfaceChart3DScene-VTJBKUQY.mjs → SurfaceChart3DScene-3MSU74YH.mjs} +1 -1
- package/dist/{SurfaceChart3DScene-VTJBKUQY.mjs.br → SurfaceChart3DScene-3MSU74YH.mjs.br} +0 -0
- package/dist/SurfaceChart3DScene-3MSU74YH.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-4VCO3DRP.js → SurfaceChart3DScene-IZLUWT27.js} +2 -2
- package/dist/SurfaceChart3DScene-IZLUWT27.js.br +0 -0
- package/dist/SurfaceChart3DScene-IZLUWT27.js.gz +0 -0
- package/dist/{chunk-CABQXGPI.mjs → chunk-4TD7EINA.mjs} +770 -358
- package/dist/chunk-4TD7EINA.mjs.br +0 -0
- package/dist/chunk-4TD7EINA.mjs.gz +0 -0
- package/dist/{chunk-4GYNTY2G.mjs → chunk-6KRNQ2KF.mjs} +2 -2
- package/dist/chunk-6KRNQ2KF.mjs.br +0 -0
- package/dist/chunk-6KRNQ2KF.mjs.gz +0 -0
- package/dist/{chunk-TDUDH7S4.js → chunk-EFSQW6S5.js} +771 -357
- package/dist/chunk-EFSQW6S5.js.br +0 -0
- package/dist/chunk-EFSQW6S5.js.gz +0 -0
- package/dist/{chunk-UIWY4XJT.js → chunk-G2LZT5SV.js} +3 -3
- package/dist/chunk-G2LZT5SV.js.br +0 -0
- package/dist/chunk-G2LZT5SV.js.gz +0 -0
- package/dist/{chunk-YIPR3GKG.mjs → chunk-HRLF4REI.mjs} +34 -15
- package/dist/chunk-HRLF4REI.mjs.br +0 -0
- package/dist/chunk-HRLF4REI.mjs.gz +0 -0
- package/dist/{chunk-LE6YA5WB.js → chunk-IDW5UPXW.js} +264 -245
- package/dist/chunk-IDW5UPXW.js.br +0 -0
- package/dist/chunk-IDW5UPXW.js.gz +0 -0
- package/dist/{chunk-NUDH7TI2.js → chunk-RWIQHVZQ.js} +326 -326
- package/dist/chunk-RWIQHVZQ.js.br +0 -0
- package/dist/chunk-RWIQHVZQ.js.gz +0 -0
- package/dist/{chunk-GBKIWNW6.js → chunk-SHZ3GWOD.js} +1045 -1042
- package/dist/chunk-SHZ3GWOD.js.br +0 -0
- package/dist/chunk-SHZ3GWOD.js.gz +0 -0
- package/dist/{chunk-N3NKU7SC.mjs → chunk-WEU5EMKK.mjs} +1 -1
- package/dist/chunk-WEU5EMKK.mjs.br +0 -0
- package/dist/chunk-WEU5EMKK.mjs.gz +0 -0
- package/dist/{chunk-4SGXEGVL.mjs → chunk-YA7VFYTW.mjs} +17 -14
- package/dist/chunk-YA7VFYTW.mjs.br +0 -0
- package/dist/chunk-YA7VFYTW.mjs.gz +0 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +34 -34
- 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 +18 -0
- package/dist/internals.js +78 -78
- package/dist/internals.js.br +0 -0
- package/dist/internals.js.gz +0 -0
- package/dist/internals.mjs +3 -3
- package/dist/internals.mjs.br +0 -0
- package/dist/internals.mjs.gz +0 -0
- package/dist/viewer/index.d.ts +18 -0
- package/dist/viewer/index.js +21 -21
- package/dist/viewer/index.js.br +0 -0
- package/dist/viewer/index.js.gz +0 -0
- package/dist/viewer/index.mjs +5 -5
- package/dist/viewer/index.mjs.br +0 -0
- package/dist/viewer/index.mjs.gz +0 -0
- package/package.json +1 -1
- package/dist/AiChatPanel-CGGUPVQX.mjs.br +0 -0
- package/dist/AiChatPanel-CGGUPVQX.mjs.gz +0 -0
- package/dist/AiChatPanel-UEFYTUJN.js.br +0 -0
- package/dist/AiChatPanel-UEFYTUJN.js.gz +0 -0
- package/dist/Model3DScene-QYXJNALP.js.br +0 -0
- package/dist/Model3DScene-QYXJNALP.js.gz +0 -0
- package/dist/Model3DScene-TU4NTHRM.mjs.br +0 -0
- package/dist/Model3DScene-TU4NTHRM.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-4VCO3DRP.js.br +0 -0
- package/dist/SurfaceChart3DScene-4VCO3DRP.js.gz +0 -0
- package/dist/SurfaceChart3DScene-VTJBKUQY.mjs.gz +0 -0
- package/dist/chunk-4GYNTY2G.mjs.br +0 -0
- package/dist/chunk-4GYNTY2G.mjs.gz +0 -0
- package/dist/chunk-4SGXEGVL.mjs.br +0 -0
- package/dist/chunk-4SGXEGVL.mjs.gz +0 -0
- package/dist/chunk-CABQXGPI.mjs.br +0 -0
- package/dist/chunk-CABQXGPI.mjs.gz +0 -0
- package/dist/chunk-GBKIWNW6.js.br +0 -0
- package/dist/chunk-GBKIWNW6.js.gz +0 -0
- package/dist/chunk-LE6YA5WB.js.br +0 -0
- package/dist/chunk-LE6YA5WB.js.gz +0 -0
- package/dist/chunk-N3NKU7SC.mjs.br +0 -0
- package/dist/chunk-N3NKU7SC.mjs.gz +0 -0
- package/dist/chunk-NUDH7TI2.js.br +0 -0
- package/dist/chunk-NUDH7TI2.js.gz +0 -0
- package/dist/chunk-TDUDH7S4.js.br +0 -0
- package/dist/chunk-TDUDH7S4.js.gz +0 -0
- package/dist/chunk-UIWY4XJT.js.br +0 -0
- package/dist/chunk-UIWY4XJT.js.gz +0 -0
- package/dist/chunk-YIPR3GKG.mjs.br +0 -0
- package/dist/chunk-YIPR3GKG.mjs.gz +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkIDW5UPXW_js = require('./chunk-IDW5UPXW.js');
|
|
4
4
|
var chunkBXAK3JFM_js = require('./chunk-BXAK3JFM.js');
|
|
5
|
-
var
|
|
5
|
+
var chunkEFSQW6S5_js = require('./chunk-EFSQW6S5.js');
|
|
6
6
|
var react = require('react');
|
|
7
7
|
var JSZip = require('jszip');
|
|
8
8
|
var reactI18next = require('react-i18next');
|
|
@@ -14,7 +14,7 @@ var JSZip__default = /*#__PURE__*/_interopDefault(JSZip);
|
|
|
14
14
|
function useVirtualizedSlides({
|
|
15
15
|
totalItems,
|
|
16
16
|
itemHeight,
|
|
17
|
-
overscan =
|
|
17
|
+
overscan = chunkEFSQW6S5_js.DEFAULT_VIRTUAL_OVERSCAN
|
|
18
18
|
}) {
|
|
19
19
|
const scrollContainerRef = react.useRef(null);
|
|
20
20
|
const [scrollTop, setScrollTop] = react.useState(0);
|
|
@@ -44,7 +44,7 @@ function useVirtualizedSlides({
|
|
|
44
44
|
resizeObserver?.disconnect();
|
|
45
45
|
};
|
|
46
46
|
}, []);
|
|
47
|
-
const range =
|
|
47
|
+
const range = chunkEFSQW6S5_js.computeVirtualRange(totalItems, itemHeight, scrollTop, viewportHeight, overscan);
|
|
48
48
|
const safeItemHeight = Math.max(itemHeight, 1);
|
|
49
49
|
const scrollToIndex = react.useCallback(
|
|
50
50
|
(index, behavior = "smooth") => {
|
|
@@ -107,7 +107,7 @@ function usePresenceTracking({
|
|
|
107
107
|
awareness.setLocalStateField("presence", state);
|
|
108
108
|
lastBroadcastRef.current = Date.now();
|
|
109
109
|
};
|
|
110
|
-
if (elapsed >=
|
|
110
|
+
if (elapsed >= chunkEFSQW6S5_js.BROADCAST_THROTTLE_MS) {
|
|
111
111
|
if (pendingBroadcastRef.current) {
|
|
112
112
|
clearTimeout(pendingBroadcastRef.current);
|
|
113
113
|
pendingBroadcastRef.current = null;
|
|
@@ -117,7 +117,7 @@ function usePresenceTracking({
|
|
|
117
117
|
pendingBroadcastRef.current = setTimeout(() => {
|
|
118
118
|
pendingBroadcastRef.current = null;
|
|
119
119
|
flush();
|
|
120
|
-
},
|
|
120
|
+
}, chunkEFSQW6S5_js.BROADCAST_THROTTLE_MS - elapsed);
|
|
121
121
|
}
|
|
122
122
|
},
|
|
123
123
|
[awareness, userName, userColor, userAvatar, role]
|
|
@@ -142,7 +142,7 @@ function usePresenceTracking({
|
|
|
142
142
|
return;
|
|
143
143
|
}
|
|
144
144
|
const handleChange = () => {
|
|
145
|
-
const users =
|
|
145
|
+
const users = chunkEFSQW6S5_js.derivePresenceList(
|
|
146
146
|
awareness.getStates(),
|
|
147
147
|
localClientId,
|
|
148
148
|
canvasWidth,
|
|
@@ -194,7 +194,7 @@ function useYjsProvider({ config }) {
|
|
|
194
194
|
const departureRef = react.useRef(null);
|
|
195
195
|
const gateRef = react.useRef(null);
|
|
196
196
|
if (!gateRef.current) {
|
|
197
|
-
gateRef.current =
|
|
197
|
+
gateRef.current = chunkEFSQW6S5_js.createSyncGate(() => setSynced(true));
|
|
198
198
|
}
|
|
199
199
|
const teardown = react.useCallback(() => {
|
|
200
200
|
if (timeoutRef.current) {
|
|
@@ -214,7 +214,7 @@ function useYjsProvider({ config }) {
|
|
|
214
214
|
const buildCleanup = react.useCallback(
|
|
215
215
|
(provider, yDoc) => () => {
|
|
216
216
|
announceDeparture();
|
|
217
|
-
|
|
217
|
+
chunkEFSQW6S5_js.clearLocalAwareness(provider.awareness);
|
|
218
218
|
provider.destroy();
|
|
219
219
|
yDoc.destroy();
|
|
220
220
|
setDoc(null);
|
|
@@ -239,9 +239,9 @@ function useYjsProvider({ config }) {
|
|
|
239
239
|
if (config.authToken) {
|
|
240
240
|
opts.password = config.authToken;
|
|
241
241
|
}
|
|
242
|
-
const roomId =
|
|
242
|
+
const roomId = chunkEFSQW6S5_js.validateRoomId(config.roomId);
|
|
243
243
|
const provider = new WebrtcProvider(roomId, yDoc, opts);
|
|
244
|
-
departureRef.current =
|
|
244
|
+
departureRef.current = chunkEFSQW6S5_js.createDepartureChannel(roomId, provider.awareness);
|
|
245
245
|
setDoc(yDoc);
|
|
246
246
|
setAwareness(provider.awareness);
|
|
247
247
|
setClientId(provider.awareness.clientID);
|
|
@@ -283,13 +283,13 @@ function useYjsProvider({ config }) {
|
|
|
283
283
|
if (!config) {
|
|
284
284
|
return;
|
|
285
285
|
}
|
|
286
|
-
const roomId =
|
|
287
|
-
const transport = config.transport ??
|
|
286
|
+
const roomId = chunkEFSQW6S5_js.validateRoomId(config.roomId);
|
|
287
|
+
const transport = config.transport ?? chunkEFSQW6S5_js.resolveTransportForServerUrl(config.serverUrl);
|
|
288
288
|
if (transport === "webrtc") {
|
|
289
289
|
await initWebrtc();
|
|
290
290
|
return;
|
|
291
291
|
}
|
|
292
|
-
if (
|
|
292
|
+
if (chunkEFSQW6S5_js.isMixedContentBlocked(config.serverUrl)) {
|
|
293
293
|
console.warn(
|
|
294
294
|
`[pptx-viewer] Refusing to connect: insecure ws:// server "${config.serverUrl}" is blocked from a secure (https) page. Use a wss:// URL.`
|
|
295
295
|
);
|
|
@@ -303,7 +303,7 @@ function useYjsProvider({ config }) {
|
|
|
303
303
|
const provider = new WebsocketProvider(config.serverUrl, roomId, yDoc, {
|
|
304
304
|
params: config.authToken ? { token: config.authToken } : void 0
|
|
305
305
|
});
|
|
306
|
-
departureRef.current =
|
|
306
|
+
departureRef.current = chunkEFSQW6S5_js.createDepartureChannel(roomId, provider.awareness);
|
|
307
307
|
let connected = false;
|
|
308
308
|
const handleStatus = (event) => {
|
|
309
309
|
if (event.status === "connected") {
|
|
@@ -343,7 +343,7 @@ function useYjsProvider({ config }) {
|
|
|
343
343
|
provider.off("status", handleStatus);
|
|
344
344
|
provider.off("sync", handleSynced);
|
|
345
345
|
announceDeparture();
|
|
346
|
-
|
|
346
|
+
chunkEFSQW6S5_js.clearLocalAwareness(provider.awareness);
|
|
347
347
|
provider.destroy();
|
|
348
348
|
yDoc.destroy();
|
|
349
349
|
setDoc(null);
|
|
@@ -352,7 +352,7 @@ function useYjsProvider({ config }) {
|
|
|
352
352
|
cleanupRef.current = null;
|
|
353
353
|
setStatus("error");
|
|
354
354
|
}
|
|
355
|
-
},
|
|
355
|
+
}, chunkEFSQW6S5_js.CONNECTION_TIMEOUT_MS);
|
|
356
356
|
}
|
|
357
357
|
setDoc(yDoc);
|
|
358
358
|
setAwareness(provider.awareness);
|
|
@@ -361,7 +361,7 @@ function useYjsProvider({ config }) {
|
|
|
361
361
|
provider.off("status", handleStatus);
|
|
362
362
|
provider.off("sync", handleSynced);
|
|
363
363
|
announceDeparture();
|
|
364
|
-
|
|
364
|
+
chunkEFSQW6S5_js.clearLocalAwareness(provider.awareness);
|
|
365
365
|
provider.destroy();
|
|
366
366
|
yDoc.destroy();
|
|
367
367
|
setDoc(null);
|
|
@@ -387,7 +387,7 @@ function useYjsProvider({ config }) {
|
|
|
387
387
|
]);
|
|
388
388
|
react.useEffect(() => {
|
|
389
389
|
init();
|
|
390
|
-
const disposeTeardown =
|
|
390
|
+
const disposeTeardown = chunkEFSQW6S5_js.registerCollaborationTeardown({
|
|
391
391
|
leave: teardown,
|
|
392
392
|
rejoin: init
|
|
393
393
|
});
|
|
@@ -408,7 +408,7 @@ function useCollaborativeState({
|
|
|
408
408
|
canvasWidth,
|
|
409
409
|
canvasHeight
|
|
410
410
|
}) {
|
|
411
|
-
const userColor =
|
|
411
|
+
const userColor = chunkEFSQW6S5_js.sanitizeColor(config?.userColor, "#6366f1");
|
|
412
412
|
const { status, awareness, doc, clientId, synced, retry } = useYjsProvider({ config });
|
|
413
413
|
const { remoteUsers, broadcastPresence } = usePresenceTracking({
|
|
414
414
|
awareness,
|
|
@@ -517,8 +517,8 @@ function useEditorHistory(input) {
|
|
|
517
517
|
width: canvasSize.width,
|
|
518
518
|
height: canvasSize.height,
|
|
519
519
|
activeSlideIndex,
|
|
520
|
-
slides: slides.map(
|
|
521
|
-
templateElementsBySlideId:
|
|
520
|
+
slides: slides.map(chunkEFSQW6S5_js.cloneSlide),
|
|
521
|
+
templateElementsBySlideId: chunkEFSQW6S5_js.cloneTemplateElementsBySlideId(templateElementsBySlideId),
|
|
522
522
|
...actionLabel ? { actionLabel } : {}
|
|
523
523
|
};
|
|
524
524
|
},
|
|
@@ -531,9 +531,9 @@ function useEditorHistory(input) {
|
|
|
531
531
|
width: snapshot.width,
|
|
532
532
|
height: snapshot.height
|
|
533
533
|
});
|
|
534
|
-
setSlides(snapshot.slides.map(
|
|
534
|
+
setSlides(snapshot.slides.map(chunkEFSQW6S5_js.cloneSlide));
|
|
535
535
|
setTemplateElementsBySlideId(
|
|
536
|
-
|
|
536
|
+
chunkEFSQW6S5_js.cloneTemplateElementsBySlideId(snapshot.templateElementsBySlideId)
|
|
537
537
|
);
|
|
538
538
|
setActiveSlideIndex(Math.min(snapshot.activeSlideIndex, maxSlideIndex));
|
|
539
539
|
setSelectedElementIds([]);
|
|
@@ -567,8 +567,8 @@ function useEditorHistory(input) {
|
|
|
567
567
|
const currentSnapshot = buildHistorySnapshot();
|
|
568
568
|
historyFutureRef.current.push(currentSnapshot);
|
|
569
569
|
isApplyingHistoryRef.current = true;
|
|
570
|
-
const nextSnapshot =
|
|
571
|
-
lastHistorySnapshotRef.current =
|
|
570
|
+
const nextSnapshot = chunkIDW5UPXW_js.cloneHistorySnapshot(previousSnapshot);
|
|
571
|
+
lastHistorySnapshotRef.current = chunkIDW5UPXW_js.cloneHistorySnapshot(nextSnapshot);
|
|
572
572
|
lastHistorySerializedRef.current = JSON.stringify(nextSnapshot);
|
|
573
573
|
applyHistorySnapshot(nextSnapshot);
|
|
574
574
|
updateHistoryAvailability();
|
|
@@ -589,8 +589,8 @@ function useEditorHistory(input) {
|
|
|
589
589
|
const currentSnapshot = buildHistorySnapshot();
|
|
590
590
|
historyPastRef.current.push(currentSnapshot);
|
|
591
591
|
isApplyingHistoryRef.current = true;
|
|
592
|
-
const targetSnapshot =
|
|
593
|
-
lastHistorySnapshotRef.current =
|
|
592
|
+
const targetSnapshot = chunkIDW5UPXW_js.cloneHistorySnapshot(nextSnapshot);
|
|
593
|
+
lastHistorySnapshotRef.current = chunkIDW5UPXW_js.cloneHistorySnapshot(targetSnapshot);
|
|
594
594
|
lastHistorySerializedRef.current = JSON.stringify(targetSnapshot);
|
|
595
595
|
applyHistorySnapshot(targetSnapshot);
|
|
596
596
|
updateHistoryAvailability();
|
|
@@ -608,7 +608,7 @@ function useEditorHistory(input) {
|
|
|
608
608
|
historyPastRef.current = [];
|
|
609
609
|
historyFutureRef.current = [];
|
|
610
610
|
if (initialSnapshot) {
|
|
611
|
-
const clonedInitial =
|
|
611
|
+
const clonedInitial = chunkIDW5UPXW_js.cloneHistorySnapshot(initialSnapshot);
|
|
612
612
|
lastHistorySnapshotRef.current = clonedInitial;
|
|
613
613
|
lastHistorySerializedRef.current = JSON.stringify(clonedInitial);
|
|
614
614
|
} else {
|
|
@@ -649,18 +649,18 @@ function useEditorHistory(input) {
|
|
|
649
649
|
}
|
|
650
650
|
const previousSnapshot = lastHistorySnapshotRef.current;
|
|
651
651
|
if (!previousSnapshot) {
|
|
652
|
-
lastHistorySnapshotRef.current =
|
|
652
|
+
lastHistorySnapshotRef.current = chunkIDW5UPXW_js.cloneHistorySnapshot(snapshot);
|
|
653
653
|
lastHistorySerializedRef.current = serialized;
|
|
654
654
|
lastCheapHashRef.current = cheapHash;
|
|
655
655
|
updateHistoryAvailability();
|
|
656
656
|
return;
|
|
657
657
|
}
|
|
658
|
-
historyPastRef.current.push(
|
|
658
|
+
historyPastRef.current.push(chunkIDW5UPXW_js.cloneHistorySnapshot(previousSnapshot));
|
|
659
659
|
while (historyPastRef.current.length > Math.max(1, maxHistoryEntries)) {
|
|
660
660
|
historyPastRef.current.shift();
|
|
661
661
|
}
|
|
662
662
|
historyFutureRef.current = [];
|
|
663
|
-
lastHistorySnapshotRef.current =
|
|
663
|
+
lastHistorySnapshotRef.current = chunkIDW5UPXW_js.cloneHistorySnapshot(snapshot);
|
|
664
664
|
lastHistorySerializedRef.current = serialized;
|
|
665
665
|
lastCheapHashRef.current = cheapHash;
|
|
666
666
|
updateHistoryAvailability();
|
|
@@ -750,7 +750,7 @@ function useZoomViewport({
|
|
|
750
750
|
if (!wrapper || !canvasViewport) {
|
|
751
751
|
return;
|
|
752
752
|
}
|
|
753
|
-
const boundedScale =
|
|
753
|
+
const boundedScale = chunkEFSQW6S5_js.clampZoomScale(nextScale);
|
|
754
754
|
const nextEditorScale = fitScale * boundedScale;
|
|
755
755
|
const centerX = (bounds.minX + bounds.maxX) / 2;
|
|
756
756
|
const centerY = (bounds.minY + bounds.maxY) / 2;
|
|
@@ -765,10 +765,10 @@ function useZoomViewport({
|
|
|
765
765
|
[fitScale]
|
|
766
766
|
);
|
|
767
767
|
const handleZoomIn = react.useCallback(() => {
|
|
768
|
-
setScale((currentScale) =>
|
|
768
|
+
setScale((currentScale) => chunkEFSQW6S5_js.zoomInScale(currentScale));
|
|
769
769
|
}, []);
|
|
770
770
|
const handleZoomOut = react.useCallback(() => {
|
|
771
|
-
setScale((currentScale) =>
|
|
771
|
+
setScale((currentScale) => chunkEFSQW6S5_js.zoomOutScale(currentScale));
|
|
772
772
|
}, []);
|
|
773
773
|
const handleResetZoom = react.useCallback(() => {
|
|
774
774
|
setScale(1);
|
|
@@ -787,29 +787,29 @@ function useZoomViewport({
|
|
|
787
787
|
selectedElements.forEach((element) => {
|
|
788
788
|
minX = Math.min(minX, element.x);
|
|
789
789
|
minY = Math.min(minY, element.y);
|
|
790
|
-
maxX = Math.max(maxX, element.x + Math.max(element.width,
|
|
791
|
-
maxY = Math.max(maxY, element.y + Math.max(element.height,
|
|
790
|
+
maxX = Math.max(maxX, element.x + Math.max(element.width, chunkIDW5UPXW_js.MIN_ELEMENT_SIZE));
|
|
791
|
+
maxY = Math.max(maxY, element.y + Math.max(element.height, chunkIDW5UPXW_js.MIN_ELEMENT_SIZE));
|
|
792
792
|
});
|
|
793
793
|
if (!Number.isFinite(minX) || !Number.isFinite(minY) || !Number.isFinite(maxX) || !Number.isFinite(maxY)) {
|
|
794
794
|
return;
|
|
795
795
|
}
|
|
796
796
|
const selectionBounds = { minX, minY, maxX, maxY };
|
|
797
|
-
const boundsWidth = Math.max(selectionBounds.maxX - selectionBounds.minX,
|
|
798
|
-
const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY,
|
|
797
|
+
const boundsWidth = Math.max(selectionBounds.maxX - selectionBounds.minX, chunkIDW5UPXW_js.MIN_ELEMENT_SIZE);
|
|
798
|
+
const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY, chunkIDW5UPXW_js.MIN_ELEMENT_SIZE);
|
|
799
799
|
const availableWidth = Math.max(
|
|
800
|
-
effectiveEditorDimensions.width -
|
|
801
|
-
|
|
800
|
+
effectiveEditorDimensions.width - chunkIDW5UPXW_js.ZOOM_TO_SELECTION_PADDING,
|
|
801
|
+
chunkIDW5UPXW_js.MIN_ELEMENT_SIZE
|
|
802
802
|
);
|
|
803
803
|
const availableHeight = Math.max(
|
|
804
|
-
effectiveEditorDimensions.height -
|
|
805
|
-
|
|
804
|
+
effectiveEditorDimensions.height - chunkIDW5UPXW_js.ZOOM_TO_SELECTION_PADDING,
|
|
805
|
+
chunkIDW5UPXW_js.MIN_ELEMENT_SIZE
|
|
806
806
|
);
|
|
807
807
|
const targetEditorScale = Math.min(
|
|
808
808
|
availableWidth / boundsWidth,
|
|
809
809
|
availableHeight / boundsHeight
|
|
810
810
|
);
|
|
811
811
|
const safeFitScale = fitScale > Number.EPSILON ? fitScale : Number.EPSILON;
|
|
812
|
-
const nextScale =
|
|
812
|
+
const nextScale = chunkEFSQW6S5_js.clampZoomScale(targetEditorScale / safeFitScale);
|
|
813
813
|
setScale(nextScale);
|
|
814
814
|
window.requestAnimationFrame(() => {
|
|
815
815
|
window.requestAnimationFrame(() => {
|
|
@@ -829,7 +829,7 @@ function useZoomViewport({
|
|
|
829
829
|
}
|
|
830
830
|
event.preventDefault();
|
|
831
831
|
const delta = event.deltaY * -1e-3;
|
|
832
|
-
setScale((currentScale) =>
|
|
832
|
+
setScale((currentScale) => chunkEFSQW6S5_js.clampZoomScale(currentScale + delta));
|
|
833
833
|
}, []);
|
|
834
834
|
react.useEffect(() => {
|
|
835
835
|
const viewport = canvasViewportRef.current;
|
|
@@ -906,7 +906,7 @@ function applyAnimationGroupSteps(group, onPlayActionSound, setPresentationEleme
|
|
|
906
906
|
const command = step.command;
|
|
907
907
|
const timer = window.setTimeout(
|
|
908
908
|
() => {
|
|
909
|
-
|
|
909
|
+
chunkIDW5UPXW_js.executeMediaCommand(command);
|
|
910
910
|
},
|
|
911
911
|
Math.max(0, step.delayMs)
|
|
912
912
|
);
|
|
@@ -1022,7 +1022,7 @@ function useAnimationPlayback(input) {
|
|
|
1022
1022
|
(controller, group) => {
|
|
1023
1023
|
driveBuildReveal(
|
|
1024
1024
|
controller,
|
|
1025
|
-
|
|
1025
|
+
chunkEFSQW6S5_js.PresentationAnimationController.collectBuildStepIds(group),
|
|
1026
1026
|
setPresentationElementStates,
|
|
1027
1027
|
buildRafRef
|
|
1028
1028
|
);
|
|
@@ -1085,7 +1085,7 @@ function useAnimationPlayback(input) {
|
|
|
1085
1085
|
setHoverTriggerShapeIds(/* @__PURE__ */ new Set());
|
|
1086
1086
|
return;
|
|
1087
1087
|
}
|
|
1088
|
-
const controller =
|
|
1088
|
+
const controller = chunkEFSQW6S5_js.PresentationAnimationController.fromSlide(slide);
|
|
1089
1089
|
controllerRef.current = controller;
|
|
1090
1090
|
setPresentationKeyframesCss(controller.keyframesCss);
|
|
1091
1091
|
setInteractiveTriggerShapeIds(controller.interactiveTriggerShapeIds);
|
|
@@ -1233,7 +1233,7 @@ function useAnimationPlayback(input) {
|
|
|
1233
1233
|
}))
|
|
1234
1234
|
);
|
|
1235
1235
|
entranceAnimations.forEach((animation, animationIndex) => {
|
|
1236
|
-
const delay =
|
|
1236
|
+
const delay = chunkEFSQW6S5_js.computeEntranceAnimationDelay(animation.delayMs, animationIndex);
|
|
1237
1237
|
const timer = window.setTimeout(() => {
|
|
1238
1238
|
setPresentationAnimations(
|
|
1239
1239
|
(previousAnimations) => previousAnimations.map(
|
|
@@ -1270,12 +1270,12 @@ function useAnimationPlayback(input) {
|
|
|
1270
1270
|
presentationTimersRef
|
|
1271
1271
|
};
|
|
1272
1272
|
}
|
|
1273
|
-
var PRESENTER_CHANNEL_NAME =
|
|
1274
|
-
var AUDIENCE_HASH =
|
|
1275
|
-
var PRESENTER_MSG_ORIGIN =
|
|
1276
|
-
var AUDIENCE_NONCE_KEY =
|
|
1273
|
+
var PRESENTER_CHANNEL_NAME = chunkEFSQW6S5_js.PRESENTATION_CHANNEL_NAME;
|
|
1274
|
+
var AUDIENCE_HASH = chunkEFSQW6S5_js.PRESENTATION_HASH;
|
|
1275
|
+
var PRESENTER_MSG_ORIGIN = chunkEFSQW6S5_js.PRESENTATION_MESSAGE_ORIGIN;
|
|
1276
|
+
var AUDIENCE_NONCE_KEY = chunkEFSQW6S5_js.PRESENTATION_NONCE_KEY;
|
|
1277
1277
|
function generateSessionId() {
|
|
1278
|
-
return
|
|
1278
|
+
return chunkEFSQW6S5_js.createPresentationSessionId();
|
|
1279
1279
|
}
|
|
1280
1280
|
function parseAudienceNonce() {
|
|
1281
1281
|
const hash = window.location.hash;
|
|
@@ -1311,7 +1311,7 @@ function usePresenterWindow(input) {
|
|
|
1311
1311
|
}, []);
|
|
1312
1312
|
const swapDisplays = react.useCallback(async () => {
|
|
1313
1313
|
const audience = audienceWindowRef.current;
|
|
1314
|
-
return audience && !audience.closed ?
|
|
1314
|
+
return audience && !audience.closed ? chunkEFSQW6S5_js.swapPresentationWindows(window, audience) : false;
|
|
1315
1315
|
}, []);
|
|
1316
1316
|
const syncSlideToAudience = react.useCallback(
|
|
1317
1317
|
(slideIndex) => {
|
|
@@ -1375,7 +1375,7 @@ function usePresenterWindow(input) {
|
|
|
1375
1375
|
pollTimerRef.current = null;
|
|
1376
1376
|
}
|
|
1377
1377
|
if (closingSessionId) {
|
|
1378
|
-
void
|
|
1378
|
+
void chunkEFSQW6S5_js.clearAudienceContent(closingSessionId);
|
|
1379
1379
|
}
|
|
1380
1380
|
}, [getChannel]);
|
|
1381
1381
|
const openAudienceWindow = react.useCallback(() => {
|
|
@@ -1393,10 +1393,10 @@ function usePresenterWindow(input) {
|
|
|
1393
1393
|
audienceWindowRef.current = blankWin;
|
|
1394
1394
|
const sessionId = generateSessionId();
|
|
1395
1395
|
sessionIdRef.current = sessionId;
|
|
1396
|
-
const audienceUrl =
|
|
1397
|
-
void
|
|
1396
|
+
const audienceUrl = chunkEFSQW6S5_js.buildPresentationAudienceUrl(window.location.href, sessionId);
|
|
1397
|
+
void chunkEFSQW6S5_js.resolveAudienceScreenPlacement(window).then((placement) => {
|
|
1398
1398
|
if (placement && audienceWindowRef.current === blankWin && !blankWin.closed) {
|
|
1399
|
-
|
|
1399
|
+
chunkEFSQW6S5_js.placeAudienceWindow(blankWin, placement);
|
|
1400
1400
|
}
|
|
1401
1401
|
return void 0;
|
|
1402
1402
|
});
|
|
@@ -1426,7 +1426,7 @@ function usePresenterWindow(input) {
|
|
|
1426
1426
|
}
|
|
1427
1427
|
};
|
|
1428
1428
|
if (content) {
|
|
1429
|
-
void
|
|
1429
|
+
void chunkEFSQW6S5_js.storeAudienceContent(content, sessionId).then(() => navigateOrClose(true)).catch(() => navigateOrClose(false));
|
|
1430
1430
|
} else {
|
|
1431
1431
|
navigateOrClose(true);
|
|
1432
1432
|
}
|
|
@@ -1452,7 +1452,7 @@ function usePresenterWindow(input) {
|
|
|
1452
1452
|
}
|
|
1453
1453
|
const handleMessage = (event) => {
|
|
1454
1454
|
const message = event.data;
|
|
1455
|
-
if (
|
|
1455
|
+
if (chunkEFSQW6S5_js.isPresentationSessionMessage(message) && message.type === "audience-ready" && message.sessionId === sessionIdRef.current) {
|
|
1456
1456
|
syncStateToAudience(snapshotRef.current);
|
|
1457
1457
|
}
|
|
1458
1458
|
};
|
|
@@ -1481,7 +1481,7 @@ function usePresenterWindow(input) {
|
|
|
1481
1481
|
react.useEffect(() => {
|
|
1482
1482
|
const handleBeforeUnload = () => {
|
|
1483
1483
|
if (sessionIdRef.current) {
|
|
1484
|
-
void
|
|
1484
|
+
void chunkEFSQW6S5_js.clearAudienceContent(sessionIdRef.current);
|
|
1485
1485
|
}
|
|
1486
1486
|
};
|
|
1487
1487
|
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
@@ -1543,7 +1543,7 @@ function useAudienceMode(input) {
|
|
|
1543
1543
|
}
|
|
1544
1544
|
channel.onmessage = (event) => {
|
|
1545
1545
|
const data = event.data;
|
|
1546
|
-
if (!
|
|
1546
|
+
if (!chunkEFSQW6S5_js.isPresentationSessionMessage(data) || data.origin !== PRESENTER_MSG_ORIGIN) {
|
|
1547
1547
|
return;
|
|
1548
1548
|
}
|
|
1549
1549
|
if (expectedSessionId && data.sessionId !== expectedSessionId) {
|
|
@@ -1559,16 +1559,16 @@ function useAudienceMode(input) {
|
|
|
1559
1559
|
}
|
|
1560
1560
|
if (data.type === "presenter-exit") {
|
|
1561
1561
|
if (expectedSessionId) {
|
|
1562
|
-
void
|
|
1562
|
+
void chunkEFSQW6S5_js.clearAudienceContent(expectedSessionId);
|
|
1563
1563
|
}
|
|
1564
|
-
if (
|
|
1564
|
+
if (chunkEFSQW6S5_js.endAudienceDisplay(window)) {
|
|
1565
1565
|
handlers.onPresenterEnded?.();
|
|
1566
1566
|
}
|
|
1567
1567
|
}
|
|
1568
1568
|
};
|
|
1569
1569
|
if (expectedSessionId) {
|
|
1570
1570
|
channel.postMessage({
|
|
1571
|
-
origin:
|
|
1571
|
+
origin: chunkEFSQW6S5_js.PRESENTATION_MESSAGE_ORIGIN,
|
|
1572
1572
|
type: "audience-ready",
|
|
1573
1573
|
sessionId: expectedSessionId
|
|
1574
1574
|
});
|
|
@@ -1601,14 +1601,14 @@ function usePresentationKeyboard(input) {
|
|
|
1601
1601
|
presentationSlideIndex,
|
|
1602
1602
|
setShowRehearsalSummary
|
|
1603
1603
|
} = input;
|
|
1604
|
-
const keyBufferRef = react.useRef(
|
|
1604
|
+
const keyBufferRef = react.useRef(chunkEFSQW6S5_js.createPresentationKeyBuffer());
|
|
1605
1605
|
react.useEffect(() => {
|
|
1606
|
-
if (mode !== "present" || !
|
|
1607
|
-
keyBufferRef.current =
|
|
1606
|
+
if (mode !== "present" || !chunkEFSQW6S5_js.acceptsPresentationInput()) {
|
|
1607
|
+
keyBufferRef.current = chunkEFSQW6S5_js.createPresentationKeyBuffer();
|
|
1608
1608
|
return;
|
|
1609
1609
|
}
|
|
1610
1610
|
const handleKeyDown = (event) => {
|
|
1611
|
-
const mapped =
|
|
1611
|
+
const mapped = chunkEFSQW6S5_js.mapPresentationKey(event, keyBufferRef.current);
|
|
1612
1612
|
if (mapped.action === "none") {
|
|
1613
1613
|
return;
|
|
1614
1614
|
}
|
|
@@ -1628,12 +1628,12 @@ function usePresentationKeyboard(input) {
|
|
|
1628
1628
|
movePresentationSlide(-1);
|
|
1629
1629
|
return;
|
|
1630
1630
|
case "first": {
|
|
1631
|
-
const first =
|
|
1631
|
+
const first = chunkEFSQW6S5_js.firstShowSlideIndex(showSlideIndexes);
|
|
1632
1632
|
navigateToSlide(first ?? 0);
|
|
1633
1633
|
return;
|
|
1634
1634
|
}
|
|
1635
1635
|
case "last": {
|
|
1636
|
-
const last =
|
|
1636
|
+
const last = chunkEFSQW6S5_js.lastShowSlideIndex(showSlideIndexes);
|
|
1637
1637
|
navigateToSlide(last ?? Math.max(0, slideCount - 1));
|
|
1638
1638
|
return;
|
|
1639
1639
|
}
|
|
@@ -1788,7 +1788,7 @@ function useRehearsalTimings(input) {
|
|
|
1788
1788
|
|
|
1789
1789
|
// src/viewer/hooks/presentation-mode/presentation-actions.ts
|
|
1790
1790
|
function handlePresentationActionImpl(action, deps) {
|
|
1791
|
-
|
|
1791
|
+
chunkEFSQW6S5_js.runPresentationAction(
|
|
1792
1792
|
action,
|
|
1793
1793
|
{ slideCount: deps.slidesLength },
|
|
1794
1794
|
{
|
|
@@ -1810,7 +1810,7 @@ function handlePresentationActionImpl(action, deps) {
|
|
|
1810
1810
|
function executeSlideTransition(nextSlideIndex, deps) {
|
|
1811
1811
|
const incomingSlide = deps.slides[nextSlideIndex];
|
|
1812
1812
|
const transition = incomingSlide?.transition;
|
|
1813
|
-
const durationMs = deps.playTransition ?
|
|
1813
|
+
const durationMs = deps.playTransition ? chunkEFSQW6S5_js.resolveTransitionDurationMs(transition) : 0;
|
|
1814
1814
|
deps.clearPresentationTimers();
|
|
1815
1815
|
deps.setPresentationSlideIndex(nextSlideIndex);
|
|
1816
1816
|
deps.onSetActiveSlideIndex(nextSlideIndex);
|
|
@@ -1869,7 +1869,7 @@ function useSlideNavigation(input) {
|
|
|
1869
1869
|
});
|
|
1870
1870
|
const scheduleAutoAdvanceForSlide = react.useCallback(
|
|
1871
1871
|
(slideIndex) => {
|
|
1872
|
-
const delayMs =
|
|
1872
|
+
const delayMs = chunkEFSQW6S5_js.resolveAutoAdvanceDelayMs(slides[slideIndex], { useTimings });
|
|
1873
1873
|
if (delayMs === void 0) {
|
|
1874
1874
|
return;
|
|
1875
1875
|
}
|
|
@@ -1892,7 +1892,7 @@ function useSlideNavigation(input) {
|
|
|
1892
1892
|
if (availableSlideIndexes.length === 0) {
|
|
1893
1893
|
return;
|
|
1894
1894
|
}
|
|
1895
|
-
const pastLastSlide = direction === 1 && !
|
|
1895
|
+
const pastLastSlide = direction === 1 && !chunkEFSQW6S5_js.hasShowSlideAfter(presentationSlideIndex, availableSlideIndexes);
|
|
1896
1896
|
if (rehearsing && pastLastSlide) {
|
|
1897
1897
|
recordCurrentSlideTime(presentationSlideIndex);
|
|
1898
1898
|
try {
|
|
@@ -1910,9 +1910,9 @@ function useSlideNavigation(input) {
|
|
|
1910
1910
|
onAdvancePastLastSlide();
|
|
1911
1911
|
return;
|
|
1912
1912
|
}
|
|
1913
|
-
const nextSlideIndex = direction === 1 ?
|
|
1913
|
+
const nextSlideIndex = direction === 1 ? chunkEFSQW6S5_js.nextShowSlideIndex(presentationSlideIndex, availableSlideIndexes, {
|
|
1914
1914
|
loop: Boolean(loopContinuously) && !rehearsing
|
|
1915
|
-
}) :
|
|
1915
|
+
}) : chunkEFSQW6S5_js.previousShowSlideIndex(presentationSlideIndex, availableSlideIndexes);
|
|
1916
1916
|
if (nextSlideIndex === void 0 || nextSlideIndex === presentationSlideIndex) {
|
|
1917
1917
|
return;
|
|
1918
1918
|
}
|
|
@@ -2053,17 +2053,17 @@ function useZoomNavigation(input) {
|
|
|
2053
2053
|
};
|
|
2054
2054
|
}
|
|
2055
2055
|
function usePresenterConsole(slideIndex) {
|
|
2056
|
-
const timerRef = react.useRef(
|
|
2057
|
-
const [snapshot, setSnapshot] = react.useState(() =>
|
|
2056
|
+
const timerRef = react.useRef(chunkEFSQW6S5_js.createPresenterTimer());
|
|
2057
|
+
const [snapshot, setSnapshot] = react.useState(() => chunkEFSQW6S5_js.createInitialPresentationSnapshot(slideIndex));
|
|
2058
2058
|
const patch = react.useCallback((value) => {
|
|
2059
|
-
setSnapshot((current) =>
|
|
2059
|
+
setSnapshot((current) => chunkEFSQW6S5_js.mergePresentationSnapshot(current, value));
|
|
2060
2060
|
}, []);
|
|
2061
2061
|
react.useEffect(() => patch({ slideIndex }), [patch, slideIndex]);
|
|
2062
2062
|
react.useEffect(() => {
|
|
2063
2063
|
const timer = window.setInterval(() => {
|
|
2064
2064
|
patch({
|
|
2065
2065
|
paused: timerRef.current.paused,
|
|
2066
|
-
elapsedMs:
|
|
2066
|
+
elapsedMs: chunkEFSQW6S5_js.presenterElapsed(timerRef.current)
|
|
2067
2067
|
});
|
|
2068
2068
|
}, 1e3);
|
|
2069
2069
|
return () => window.clearInterval(timer);
|
|
@@ -2073,19 +2073,19 @@ function usePresenterConsole(slideIndex) {
|
|
|
2073
2073
|
applyAudienceSnapshot: setSnapshot,
|
|
2074
2074
|
setBlackout: (blackout) => patch({ blackout }),
|
|
2075
2075
|
toggleTimer: () => {
|
|
2076
|
-
timerRef.current =
|
|
2076
|
+
timerRef.current = chunkEFSQW6S5_js.togglePresenterTimer(timerRef.current);
|
|
2077
2077
|
patch({
|
|
2078
2078
|
paused: timerRef.current.paused,
|
|
2079
|
-
elapsedMs:
|
|
2079
|
+
elapsedMs: chunkEFSQW6S5_js.presenterElapsed(timerRef.current)
|
|
2080
2080
|
});
|
|
2081
2081
|
},
|
|
2082
2082
|
resetTimer: () => {
|
|
2083
|
-
timerRef.current =
|
|
2083
|
+
timerRef.current = chunkEFSQW6S5_js.resetPresenterTimer();
|
|
2084
2084
|
patch({ paused: false, elapsedMs: 0 });
|
|
2085
2085
|
},
|
|
2086
2086
|
stepZoom: (direction) => setSnapshot(
|
|
2087
|
-
(current) =>
|
|
2088
|
-
zoom:
|
|
2087
|
+
(current) => chunkEFSQW6S5_js.mergePresentationSnapshot(current, {
|
|
2088
|
+
zoom: chunkEFSQW6S5_js.stepPresenterZoom(
|
|
2089
2089
|
current.zoom ?? { scale: 1, originX: 0.5, originY: 0.5 },
|
|
2090
2090
|
direction
|
|
2091
2091
|
)
|
|
@@ -2130,7 +2130,7 @@ function usePresentationMode(input) {
|
|
|
2130
2130
|
const [allSlidesOpen, setAllSlidesOpen] = react.useState(false);
|
|
2131
2131
|
const [endOfShowVisible, setEndOfShowVisible] = react.useState(false);
|
|
2132
2132
|
const [presentationStartTime, setPresentationStartTime] = react.useState(null);
|
|
2133
|
-
const showGuard = react.useMemo(() =>
|
|
2133
|
+
const showGuard = react.useMemo(() => chunkEFSQW6S5_js.createPresenterShowGuard(), []);
|
|
2134
2134
|
const {
|
|
2135
2135
|
presentationAnimations,
|
|
2136
2136
|
presentationElementStates,
|
|
@@ -2206,7 +2206,7 @@ function usePresentationMode(input) {
|
|
|
2206
2206
|
});
|
|
2207
2207
|
const movePresentationSlide = react.useCallback(
|
|
2208
2208
|
(direction, trigger = "explicit") => {
|
|
2209
|
-
if (!
|
|
2209
|
+
if (!chunkEFSQW6S5_js.acceptsPresentationInput()) {
|
|
2210
2210
|
return;
|
|
2211
2211
|
}
|
|
2212
2212
|
if (endOfShowVisible) {
|
|
@@ -2409,11 +2409,11 @@ function usePresentationMode(input) {
|
|
|
2409
2409
|
if (!transitionOverlay || transitionOverlay.transition.type !== "morph") {
|
|
2410
2410
|
return void 0;
|
|
2411
2411
|
}
|
|
2412
|
-
return
|
|
2412
|
+
return chunkEFSQW6S5_js.buildMorphTransitionPlan(
|
|
2413
2413
|
slides[transitionOverlay.outgoingSlideIndex],
|
|
2414
2414
|
slides[transitionOverlay.incomingSlideIndex],
|
|
2415
2415
|
transitionOverlay.durationMs,
|
|
2416
|
-
|
|
2416
|
+
chunkEFSQW6S5_js.morphOptionToMode(transitionOverlay.transition.morphOption)
|
|
2417
2417
|
);
|
|
2418
2418
|
}, [transitionOverlay, slides]);
|
|
2419
2419
|
const morphedElementStates = react.useMemo(() => {
|
|
@@ -2719,7 +2719,7 @@ function findInSlides(slides, findQuery, findMatchCase) {
|
|
|
2719
2719
|
const normalised = findMatchCase ? findQuery : findQuery.toLowerCase();
|
|
2720
2720
|
slides.forEach((slide, slideIndex) => {
|
|
2721
2721
|
for (const element of slide.elements || []) {
|
|
2722
|
-
if (!
|
|
2722
|
+
if (!chunkEFSQW6S5_js.hasTextProperties(element)) {
|
|
2723
2723
|
continue;
|
|
2724
2724
|
}
|
|
2725
2725
|
const segments = element.textSegments ?? [];
|
|
@@ -2770,7 +2770,7 @@ function applyFindReplacements(slides, toReplace, replaceQuery) {
|
|
|
2770
2770
|
continue;
|
|
2771
2771
|
}
|
|
2772
2772
|
const element = slide.elements[elIdx];
|
|
2773
|
-
if (!
|
|
2773
|
+
if (!chunkEFSQW6S5_js.hasTextProperties(element)) {
|
|
2774
2774
|
continue;
|
|
2775
2775
|
}
|
|
2776
2776
|
const segments = [...element.textSegments ?? []];
|
|
@@ -3368,7 +3368,7 @@ function useViewerCoreState(_input) {
|
|
|
3368
3368
|
const shapeAdjustmentDragStateRef = react.useRef(null);
|
|
3369
3369
|
const marqueeStateRef = react.useRef(null);
|
|
3370
3370
|
const isDrawingRef = react.useRef(false);
|
|
3371
|
-
const livePatcher = react.useMemo(() =>
|
|
3371
|
+
const livePatcher = react.useMemo(() => chunkEFSQW6S5_js.createCollaborationLivePatcher(), []);
|
|
3372
3372
|
react.useEffect(() => () => livePatcher.dispose(), [livePatcher]);
|
|
3373
3373
|
const slidesRef = react.useRef([]);
|
|
3374
3374
|
const [mode, setMode] = react.useState("edit");
|
|
@@ -3377,8 +3377,8 @@ function useViewerCoreState(_input) {
|
|
|
3377
3377
|
const [slides, setSlides] = react.useState([]);
|
|
3378
3378
|
const [templateElementsBySlideId, setTemplateElementsBySlideId] = react.useState({});
|
|
3379
3379
|
const [canvasSize, setCanvasSize] = react.useState({
|
|
3380
|
-
width:
|
|
3381
|
-
height:
|
|
3380
|
+
width: chunkIDW5UPXW_js.DEFAULT_CANVAS_WIDTH,
|
|
3381
|
+
height: chunkIDW5UPXW_js.DEFAULT_CANVAS_HEIGHT
|
|
3382
3382
|
});
|
|
3383
3383
|
const [activeSlideIndex, setActiveSlideIndex] = react.useState(0);
|
|
3384
3384
|
const [selectedElementId, setSelectedElementId] = react.useState(null);
|
|
@@ -3398,7 +3398,7 @@ function useViewerCoreState(_input) {
|
|
|
3398
3398
|
const resolved = typeof value === "function" ? value(inlineEditingTextRef.current) : value;
|
|
3399
3399
|
inlineEditingTextRef.current = resolved;
|
|
3400
3400
|
setInlineEditingTextBase(value);
|
|
3401
|
-
|
|
3401
|
+
chunkEFSQW6S5_js.publishLiveInlineText(
|
|
3402
3402
|
livePatcher,
|
|
3403
3403
|
slidesRef.current[activeSlideIndexRef.current],
|
|
3404
3404
|
inlineEditingElementIdRef.current,
|
|
@@ -3732,7 +3732,7 @@ function useLoadContent({
|
|
|
3732
3732
|
);
|
|
3733
3733
|
}
|
|
3734
3734
|
const previousHandler = handlerRef.current;
|
|
3735
|
-
const handler = new
|
|
3735
|
+
const handler = new chunkEFSQW6S5_js.PptxHandler();
|
|
3736
3736
|
const parsed = await handler.load(buffer);
|
|
3737
3737
|
if (cancelled || token !== renderTokenRef.current) {
|
|
3738
3738
|
handler.dispose();
|
|
@@ -3744,7 +3744,7 @@ function useLoadContent({
|
|
|
3744
3744
|
handlerRef.current = null;
|
|
3745
3745
|
const mediaElements = [];
|
|
3746
3746
|
for (const slide of parsed.slides) {
|
|
3747
|
-
|
|
3747
|
+
chunkEFSQW6S5_js.collectMediaElements(slide.elements, mediaElements);
|
|
3748
3748
|
}
|
|
3749
3749
|
for (const url of mediaDataUrls.values()) {
|
|
3750
3750
|
if (url.startsWith("blob:")) {
|
|
@@ -3785,7 +3785,7 @@ function useLoadContent({
|
|
|
3785
3785
|
}
|
|
3786
3786
|
})
|
|
3787
3787
|
);
|
|
3788
|
-
const { paths: imagePaths, refs: imageRefs } =
|
|
3788
|
+
const { paths: imagePaths, refs: imageRefs } = chunkEFSQW6S5_js.collectImagePaths(parsed.slides);
|
|
3789
3789
|
let nextSlides = parsed.slides;
|
|
3790
3790
|
if (imagePaths.size > 0) {
|
|
3791
3791
|
const resolvedMap = /* @__PURE__ */ new Map();
|
|
@@ -3840,12 +3840,12 @@ function useLoadContent({
|
|
|
3840
3840
|
}
|
|
3841
3841
|
}
|
|
3842
3842
|
handlerRef.current = handler;
|
|
3843
|
-
const partition =
|
|
3843
|
+
const partition = chunkIDW5UPXW_js.partitionTemplateElements(nextSlides);
|
|
3844
3844
|
setSlides(partition.slides);
|
|
3845
3845
|
setTemplateElementsBySlideId(partition.templateElementsBySlideId);
|
|
3846
3846
|
setCanvasSize({
|
|
3847
|
-
width: parsed.width ??
|
|
3848
|
-
height: parsed.height ??
|
|
3847
|
+
width: parsed.width ?? chunkIDW5UPXW_js.DEFAULT_CANVAS_WIDTH,
|
|
3848
|
+
height: parsed.height ?? chunkIDW5UPXW_js.DEFAULT_CANVAS_HEIGHT
|
|
3849
3849
|
});
|
|
3850
3850
|
setHeaderFooter(parsed.headerFooter ?? {});
|
|
3851
3851
|
setLayoutOptions(parsed.layoutOptions ?? []);
|
|
@@ -3874,7 +3874,7 @@ function useLoadContent({
|
|
|
3874
3874
|
setHasMacros(parsed.hasMacros === true);
|
|
3875
3875
|
setHasDigitalSignatures(parsed.hasDigitalSignatures === true);
|
|
3876
3876
|
setDigitalSignatureCount(parsed.digitalSignatureCount ?? 0);
|
|
3877
|
-
setGuides(
|
|
3877
|
+
setGuides(chunkEFSQW6S5_js.buildInitialGuides(parsed.presentationGuides, parsed.slides[0]?.guides));
|
|
3878
3878
|
setActiveSlideIndex(0);
|
|
3879
3879
|
clearSelection();
|
|
3880
3880
|
setIsDirty(false);
|
|
@@ -3882,7 +3882,7 @@ function useLoadContent({
|
|
|
3882
3882
|
onContentApplied?.();
|
|
3883
3883
|
} catch (err) {
|
|
3884
3884
|
if (!cancelled && token === renderTokenRef.current) {
|
|
3885
|
-
if (err instanceof
|
|
3885
|
+
if (err instanceof chunkEFSQW6S5_js.EncryptedFileError) {
|
|
3886
3886
|
setIsEncrypted(true);
|
|
3887
3887
|
} else {
|
|
3888
3888
|
setError(err instanceof Error ? err.message : String(err));
|
|
@@ -3959,7 +3959,7 @@ function useAutosave(input) {
|
|
|
3959
3959
|
isSavingRef.current = false;
|
|
3960
3960
|
return;
|
|
3961
3961
|
}
|
|
3962
|
-
await
|
|
3962
|
+
await chunkEFSQW6S5_js.saveAutosaveSnapshot(filePathRef.current, data);
|
|
3963
3963
|
setAutosaveStatus({ state: "saved", timestamp: Date.now() });
|
|
3964
3964
|
} catch (err) {
|
|
3965
3965
|
setAutosaveStatus({
|
|
@@ -4024,7 +4024,7 @@ function useElementOperations(input) {
|
|
|
4024
4024
|
}, [applySelection, setInlineEditingElementId, setContextMenuState]);
|
|
4025
4025
|
const updateElementById = react.useCallback(
|
|
4026
4026
|
(elementId, updates) => {
|
|
4027
|
-
if (
|
|
4027
|
+
if (chunkEFSQW6S5_js.isTemplateElementId(elementId)) {
|
|
4028
4028
|
const slideId = activeSlide?.id;
|
|
4029
4029
|
if (slideId) {
|
|
4030
4030
|
setTemplateElementsBySlideId((prev) => ({
|
|
@@ -4064,7 +4064,7 @@ function useElementOperations(input) {
|
|
|
4064
4064
|
);
|
|
4065
4065
|
const updateSelectedShapeStyle = react.useCallback(
|
|
4066
4066
|
(updates) => {
|
|
4067
|
-
if (!selectedElement || !
|
|
4067
|
+
if (!selectedElement || !chunkEFSQW6S5_js.hasShapeProperties(selectedElement)) {
|
|
4068
4068
|
return;
|
|
4069
4069
|
}
|
|
4070
4070
|
updateSelectedElement({
|
|
@@ -4075,17 +4075,17 @@ function useElementOperations(input) {
|
|
|
4075
4075
|
);
|
|
4076
4076
|
const updateSelectedTextStyle = react.useCallback(
|
|
4077
4077
|
(updates) => {
|
|
4078
|
-
if (!selectedElement || !
|
|
4078
|
+
if (!selectedElement || !chunkEFSQW6S5_js.hasTextProperties(selectedElement)) {
|
|
4079
4079
|
return;
|
|
4080
4080
|
}
|
|
4081
|
-
const inlineSel =
|
|
4081
|
+
const inlineSel = chunkEFSQW6S5_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
4082
4082
|
if (inlineSel && selectedElement.textSegments) {
|
|
4083
|
-
const { newSegments: newSegments2, newSelection } =
|
|
4083
|
+
const { newSegments: newSegments2, newSelection } = chunkEFSQW6S5_js.applyStyleToSelectedSegments(
|
|
4084
4084
|
selectedElement.textSegments,
|
|
4085
4085
|
inlineSel,
|
|
4086
4086
|
updates
|
|
4087
4087
|
);
|
|
4088
|
-
|
|
4088
|
+
chunkEFSQW6S5_js.setPendingSelectionRestore(newSelection);
|
|
4089
4089
|
updateSelectedElement({
|
|
4090
4090
|
textSegments: newSegments2
|
|
4091
4091
|
});
|
|
@@ -4105,12 +4105,12 @@ function useElementOperations(input) {
|
|
|
4105
4105
|
);
|
|
4106
4106
|
const updateSelectedTextCase = react.useCallback(
|
|
4107
4107
|
(mode) => {
|
|
4108
|
-
if (!selectedElement || !
|
|
4108
|
+
if (!selectedElement || !chunkEFSQW6S5_js.hasTextProperties(selectedElement)) {
|
|
4109
4109
|
return;
|
|
4110
4110
|
}
|
|
4111
|
-
const inlineSel =
|
|
4111
|
+
const inlineSel = chunkEFSQW6S5_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
4112
4112
|
if (inlineSel && selectedElement.textSegments) {
|
|
4113
|
-
const newSegments =
|
|
4113
|
+
const newSegments = chunkEFSQW6S5_js.applyCaseTransformToSegments(
|
|
4114
4114
|
selectedElement.textSegments,
|
|
4115
4115
|
inlineSel,
|
|
4116
4116
|
mode
|
|
@@ -4120,14 +4120,14 @@ function useElementOperations(input) {
|
|
|
4120
4120
|
}
|
|
4121
4121
|
const updates = {};
|
|
4122
4122
|
if (selectedElement.textSegments && selectedElement.textSegments.length > 0) {
|
|
4123
|
-
updates.textSegments =
|
|
4123
|
+
updates.textSegments = chunkEFSQW6S5_js.applyCaseTransformToSegments(
|
|
4124
4124
|
selectedElement.textSegments,
|
|
4125
4125
|
null,
|
|
4126
4126
|
mode
|
|
4127
4127
|
);
|
|
4128
4128
|
}
|
|
4129
4129
|
if (typeof selectedElement.text === "string") {
|
|
4130
|
-
updates.text =
|
|
4130
|
+
updates.text = chunkEFSQW6S5_js.transformTextCase(selectedElement.text, mode);
|
|
4131
4131
|
}
|
|
4132
4132
|
updateSelectedElement(updates);
|
|
4133
4133
|
},
|
|
@@ -4182,7 +4182,7 @@ function useSectionOperations(input) {
|
|
|
4182
4182
|
const { sections, setSections, slides, setSlides, markDirty } = input;
|
|
4183
4183
|
const addSection2 = react.useCallback(
|
|
4184
4184
|
(name, afterSlideIndex) => {
|
|
4185
|
-
const result =
|
|
4185
|
+
const result = chunkEFSQW6S5_js.addSection(sections, slides, name, afterSlideIndex);
|
|
4186
4186
|
setSlides(result.slides);
|
|
4187
4187
|
setSections(result.sections);
|
|
4188
4188
|
markDirty();
|
|
@@ -4191,7 +4191,7 @@ function useSectionOperations(input) {
|
|
|
4191
4191
|
);
|
|
4192
4192
|
const renameSection2 = react.useCallback(
|
|
4193
4193
|
(sectionId, newName) => {
|
|
4194
|
-
const result =
|
|
4194
|
+
const result = chunkEFSQW6S5_js.renameSection(sections, slides, sectionId, newName);
|
|
4195
4195
|
setSections(result.sections);
|
|
4196
4196
|
setSlides(result.slides);
|
|
4197
4197
|
markDirty();
|
|
@@ -4200,7 +4200,7 @@ function useSectionOperations(input) {
|
|
|
4200
4200
|
);
|
|
4201
4201
|
const deleteSection2 = react.useCallback(
|
|
4202
4202
|
(sectionId) => {
|
|
4203
|
-
const result =
|
|
4203
|
+
const result = chunkEFSQW6S5_js.deleteSection(sections, slides, sectionId);
|
|
4204
4204
|
setSections(result.sections);
|
|
4205
4205
|
setSlides(result.slides);
|
|
4206
4206
|
markDirty();
|
|
@@ -4209,21 +4209,21 @@ function useSectionOperations(input) {
|
|
|
4209
4209
|
);
|
|
4210
4210
|
const moveSectionUp2 = react.useCallback(
|
|
4211
4211
|
(sectionId) => {
|
|
4212
|
-
setSections(
|
|
4212
|
+
setSections(chunkEFSQW6S5_js.moveSectionUp(sections, sectionId));
|
|
4213
4213
|
markDirty();
|
|
4214
4214
|
},
|
|
4215
4215
|
[sections, setSections, markDirty]
|
|
4216
4216
|
);
|
|
4217
4217
|
const moveSectionDown2 = react.useCallback(
|
|
4218
4218
|
(sectionId) => {
|
|
4219
|
-
setSections(
|
|
4219
|
+
setSections(chunkEFSQW6S5_js.moveSectionDown(sections, sectionId));
|
|
4220
4220
|
markDirty();
|
|
4221
4221
|
},
|
|
4222
4222
|
[sections, setSections, markDirty]
|
|
4223
4223
|
);
|
|
4224
4224
|
const moveSlidesToSection2 = react.useCallback(
|
|
4225
4225
|
(slideIndexes, targetSectionId) => {
|
|
4226
|
-
const result =
|
|
4226
|
+
const result = chunkEFSQW6S5_js.moveSlidesToSection(sections, slides, slideIndexes, targetSectionId);
|
|
4227
4227
|
setSlides(result.slides);
|
|
4228
4228
|
setSections(result.sections);
|
|
4229
4229
|
markDirty();
|
|
@@ -4242,19 +4242,19 @@ function useSectionOperations(input) {
|
|
|
4242
4242
|
|
|
4243
4243
|
// src/viewer/hooks/pointer-move-handlers.ts
|
|
4244
4244
|
function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx) {
|
|
4245
|
-
const resized =
|
|
4245
|
+
const resized = chunkEFSQW6S5_js.applyResize(
|
|
4246
4246
|
{ x: startX, y: startY, width: startWidth, height: startHeight },
|
|
4247
4247
|
handle,
|
|
4248
4248
|
dx,
|
|
4249
4249
|
dy,
|
|
4250
4250
|
1,
|
|
4251
|
-
{ minSize:
|
|
4251
|
+
{ minSize: chunkIDW5UPXW_js.MIN_ELEMENT_SIZE }
|
|
4252
4252
|
);
|
|
4253
4253
|
const box = { x: resized.x, y: resized.y, width: resized.width, height: resized.height };
|
|
4254
4254
|
if (!snapToGrid) {
|
|
4255
4255
|
return box;
|
|
4256
4256
|
}
|
|
4257
|
-
return
|
|
4257
|
+
return chunkEFSQW6S5_js.snapBoxToGrid(box, handle, gridSpacingPx, chunkIDW5UPXW_js.MIN_ELEMENT_SIZE);
|
|
4258
4258
|
}
|
|
4259
4259
|
function computeAdjustmentValue(startAdjustment, dx, startWidth) {
|
|
4260
4260
|
const range = startWidth || 200;
|
|
@@ -4372,7 +4372,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4372
4372
|
width: el.width,
|
|
4373
4373
|
height: el.height
|
|
4374
4374
|
}));
|
|
4375
|
-
const snapResult =
|
|
4375
|
+
const snapResult = chunkEFSQW6S5_js.computeSnapToShape(
|
|
4376
4376
|
targetX,
|
|
4377
4377
|
targetY,
|
|
4378
4378
|
primaryEl.width,
|
|
@@ -4411,7 +4411,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4411
4411
|
if (live) {
|
|
4412
4412
|
for (const id of Object.keys(drag.startPositionsById)) {
|
|
4413
4413
|
const start = drag.startPositionsById[id];
|
|
4414
|
-
|
|
4414
|
+
chunkEFSQW6S5_js.publishLiveGeometry(live.patcher, live.slideId, id, {
|
|
4415
4415
|
x: start.x + appliedDx,
|
|
4416
4416
|
y: start.y + appliedDy
|
|
4417
4417
|
});
|
|
@@ -4445,15 +4445,15 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4445
4445
|
if (rs.domEl) {
|
|
4446
4446
|
rs.domEl.style.left = `${geo.x}px`;
|
|
4447
4447
|
rs.domEl.style.top = `${geo.y}px`;
|
|
4448
|
-
rs.domEl.style.width = `${Math.max(geo.width,
|
|
4449
|
-
rs.domEl.style.height = `${Math.max(geo.height,
|
|
4448
|
+
rs.domEl.style.width = `${Math.max(geo.width, chunkIDW5UPXW_js.MIN_ELEMENT_SIZE)}px`;
|
|
4449
|
+
rs.domEl.style.height = `${Math.max(geo.height, chunkIDW5UPXW_js.MIN_ELEMENT_SIZE)}px`;
|
|
4450
4450
|
}
|
|
4451
4451
|
if (live) {
|
|
4452
|
-
|
|
4452
|
+
chunkEFSQW6S5_js.publishLiveGeometry(live.patcher, live.slideId, rs.elementId, {
|
|
4453
4453
|
x: geo.x,
|
|
4454
4454
|
y: geo.y,
|
|
4455
|
-
width: Math.max(geo.width,
|
|
4456
|
-
height: Math.max(geo.height,
|
|
4455
|
+
width: Math.max(geo.width, chunkIDW5UPXW_js.MIN_ELEMENT_SIZE),
|
|
4456
|
+
height: Math.max(geo.height, chunkIDW5UPXW_js.MIN_ELEMENT_SIZE)
|
|
4457
4457
|
});
|
|
4458
4458
|
}
|
|
4459
4459
|
}
|
|
@@ -4533,13 +4533,13 @@ function processPointerUp(input) {
|
|
|
4533
4533
|
if (i !== activeSlideIndex) {
|
|
4534
4534
|
return s;
|
|
4535
4535
|
}
|
|
4536
|
-
const rerouted =
|
|
4536
|
+
const rerouted = chunkEFSQW6S5_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
|
|
4537
4537
|
if (rerouted.length === 0) {
|
|
4538
4538
|
return s;
|
|
4539
4539
|
}
|
|
4540
4540
|
return {
|
|
4541
4541
|
...s,
|
|
4542
|
-
elements:
|
|
4542
|
+
elements: chunkEFSQW6S5_js.applyReroutedConnectors(s.elements, rerouted)
|
|
4543
4543
|
};
|
|
4544
4544
|
})
|
|
4545
4545
|
);
|
|
@@ -4561,9 +4561,9 @@ function processPointerUp(input) {
|
|
|
4561
4561
|
}
|
|
4562
4562
|
function commitMarquee(marquee, editTemplateMode, templateElements, activeSlide, applySelection, clearSelection) {
|
|
4563
4563
|
const sourceElements = editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
4564
|
-
const hitIds =
|
|
4564
|
+
const hitIds = chunkEFSQW6S5_js.computeMarqueeHitIds(marquee, sourceElements);
|
|
4565
4565
|
if (marquee.additive) {
|
|
4566
|
-
const merged =
|
|
4566
|
+
const merged = chunkEFSQW6S5_js.mergeAdditiveSelection(marquee.baseSelectionIds, hitIds);
|
|
4567
4567
|
if (merged.length > 0) {
|
|
4568
4568
|
applySelection(merged[0], merged);
|
|
4569
4569
|
} else {
|
|
@@ -4586,8 +4586,8 @@ function commitDrag(drag, editTemplateMode, activeSlide, activeSlideIndex, setTe
|
|
|
4586
4586
|
}
|
|
4587
4587
|
return { ...el, x: start.x + dx, y: start.y + dy };
|
|
4588
4588
|
});
|
|
4589
|
-
const rerouted =
|
|
4590
|
-
return
|
|
4589
|
+
const rerouted = chunkEFSQW6S5_js.rerouteConnectorsForMovedElements(movedElements, movedIds);
|
|
4590
|
+
return chunkEFSQW6S5_js.applyReroutedConnectors(movedElements, rerouted);
|
|
4591
4591
|
};
|
|
4592
4592
|
if (editTemplateMode) {
|
|
4593
4593
|
const slideId = activeSlide?.id;
|
|
@@ -4743,9 +4743,9 @@ function useCanvasInteractions(input) {
|
|
|
4743
4743
|
return;
|
|
4744
4744
|
}
|
|
4745
4745
|
const el = elementLookup.get(editId);
|
|
4746
|
-
if (el &&
|
|
4746
|
+
if (el && chunkEFSQW6S5_js.hasTextProperties(el)) {
|
|
4747
4747
|
const committedText = transformCommittedText ? transformCommittedText(inlineEditingText) : inlineEditingText;
|
|
4748
|
-
const newSegments =
|
|
4748
|
+
const newSegments = chunkEFSQW6S5_js.remapTextToSegments(committedText, el.textSegments, el.textStyle);
|
|
4749
4749
|
ops.updateElementById(editId, {
|
|
4750
4750
|
text: committedText,
|
|
4751
4751
|
textSegments: newSegments
|
|
@@ -4756,7 +4756,7 @@ function useCanvasInteractions(input) {
|
|
|
4756
4756
|
setInlineEditingText("");
|
|
4757
4757
|
};
|
|
4758
4758
|
const openEquationEditorForElement = (el) => {
|
|
4759
|
-
if (!
|
|
4759
|
+
if (!chunkEFSQW6S5_js.hasTextProperties(el)) {
|
|
4760
4760
|
return false;
|
|
4761
4761
|
}
|
|
4762
4762
|
const eqSeg = el.textSegments?.find((seg) => seg.equationXml);
|
|
@@ -4785,7 +4785,7 @@ function useCanvasInteractions(input) {
|
|
|
4785
4785
|
justSelectedRef.current = false;
|
|
4786
4786
|
} else {
|
|
4787
4787
|
const el = elementLookup.get(elementId);
|
|
4788
|
-
if (el &&
|
|
4788
|
+
if (el && chunkEFSQW6S5_js.hasTextProperties(el) && !el.locks?.noTextEdit) {
|
|
4789
4789
|
if (!openEquationEditorForElement(el)) {
|
|
4790
4790
|
setInlineEditingElementId(elementId);
|
|
4791
4791
|
setInlineEditingText(el.text ?? "");
|
|
@@ -4804,7 +4804,7 @@ function useCanvasInteractions(input) {
|
|
|
4804
4804
|
if (openEquationEditorForElement(el)) {
|
|
4805
4805
|
return;
|
|
4806
4806
|
}
|
|
4807
|
-
if (
|
|
4807
|
+
if (chunkEFSQW6S5_js.hasTextProperties(el)) {
|
|
4808
4808
|
setInlineEditingElementId(elementId);
|
|
4809
4809
|
setInlineEditingText(el.text ?? "");
|
|
4810
4810
|
}
|
|
@@ -4997,7 +4997,7 @@ function createFileHandlers(deps) {
|
|
|
4997
4997
|
h = Math.round(h * scale);
|
|
4998
4998
|
}
|
|
4999
4999
|
addElement({
|
|
5000
|
-
id:
|
|
5000
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5001
5001
|
type: "image",
|
|
5002
5002
|
x: Math.round((canvasSize.width - w) / 2),
|
|
5003
5003
|
y: Math.round((canvasSize.height - h) / 2),
|
|
@@ -5008,7 +5008,7 @@ function createFileHandlers(deps) {
|
|
|
5008
5008
|
};
|
|
5009
5009
|
img.onerror = () => {
|
|
5010
5010
|
addElement({
|
|
5011
|
-
id:
|
|
5011
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5012
5012
|
type: "image",
|
|
5013
5013
|
x: 100,
|
|
5014
5014
|
y: 100,
|
|
@@ -5034,7 +5034,7 @@ function createFileHandlers(deps) {
|
|
|
5034
5034
|
const elFilePath = file.path;
|
|
5035
5035
|
const insertMediaElement = (mediaSourceUrl, width, height) => {
|
|
5036
5036
|
addElement({
|
|
5037
|
-
id:
|
|
5037
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5038
5038
|
type: "media",
|
|
5039
5039
|
mediaType,
|
|
5040
5040
|
mediaMimeType: file.type || void 0,
|
|
@@ -5209,13 +5209,13 @@ function createStructuredElementHandlers(deps) {
|
|
|
5209
5209
|
return;
|
|
5210
5210
|
}
|
|
5211
5211
|
addElement({
|
|
5212
|
-
id:
|
|
5212
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5213
5213
|
type: "smartArt",
|
|
5214
5214
|
x: 100,
|
|
5215
5215
|
y: 120,
|
|
5216
5216
|
width: 600,
|
|
5217
5217
|
height: 340,
|
|
5218
|
-
smartArtData:
|
|
5218
|
+
smartArtData: chunkEFSQW6S5_js.buildSmartArtPresetData(
|
|
5219
5219
|
layout,
|
|
5220
5220
|
defaultItems,
|
|
5221
5221
|
(i) => `node-${Date.now()}-${i}-${Math.random().toString(36).slice(2, 8)}`
|
|
@@ -5227,7 +5227,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5227
5227
|
return;
|
|
5228
5228
|
}
|
|
5229
5229
|
addElement({
|
|
5230
|
-
id:
|
|
5230
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5231
5231
|
type: "shape",
|
|
5232
5232
|
x: 120,
|
|
5233
5233
|
y: 200,
|
|
@@ -5286,7 +5286,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5286
5286
|
const displayText = value || fieldTexts[fieldType] || fieldType;
|
|
5287
5287
|
const fieldGuid = `{${crypto.randomUUID().toUpperCase()}}`;
|
|
5288
5288
|
addElement({
|
|
5289
|
-
id:
|
|
5289
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5290
5290
|
type: "shape",
|
|
5291
5291
|
x: 120,
|
|
5292
5292
|
y: 200,
|
|
@@ -5308,11 +5308,11 @@ function createStructuredElementHandlers(deps) {
|
|
|
5308
5308
|
if (!activeSlide) {
|
|
5309
5309
|
return;
|
|
5310
5310
|
}
|
|
5311
|
-
const preset =
|
|
5311
|
+
const preset = chunkEFSQW6S5_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
|
|
5312
5312
|
if (!preset) {
|
|
5313
5313
|
return;
|
|
5314
5314
|
}
|
|
5315
|
-
const defaultPptxAction =
|
|
5315
|
+
const defaultPptxAction = chunkEFSQW6S5_js.elementActionToPptxAction({
|
|
5316
5316
|
trigger: "click",
|
|
5317
5317
|
type: preset.defaultAction
|
|
5318
5318
|
});
|
|
@@ -5321,7 +5321,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5321
5321
|
defaultPptxAction.highlightClick = true;
|
|
5322
5322
|
}
|
|
5323
5323
|
addElement({
|
|
5324
|
-
id:
|
|
5324
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5325
5325
|
type: "shape",
|
|
5326
5326
|
x: 150,
|
|
5327
5327
|
y: 150,
|
|
@@ -5388,14 +5388,14 @@ function useInsertElements(input) {
|
|
|
5388
5388
|
return;
|
|
5389
5389
|
}
|
|
5390
5390
|
addElement({
|
|
5391
|
-
id:
|
|
5391
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5392
5392
|
type: "text",
|
|
5393
5393
|
x: 100,
|
|
5394
5394
|
y: 100,
|
|
5395
5395
|
width: 300,
|
|
5396
5396
|
height: 60,
|
|
5397
5397
|
text: "",
|
|
5398
|
-
textStyle: { fontSize:
|
|
5398
|
+
textStyle: { fontSize: chunkIDW5UPXW_js.DEFAULT_TEXT_FONT_SIZE }
|
|
5399
5399
|
});
|
|
5400
5400
|
};
|
|
5401
5401
|
const handleAddShape = () => {
|
|
@@ -5403,7 +5403,7 @@ function useInsertElements(input) {
|
|
|
5403
5403
|
return;
|
|
5404
5404
|
}
|
|
5405
5405
|
addElement({
|
|
5406
|
-
id:
|
|
5406
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5407
5407
|
type: "shape",
|
|
5408
5408
|
x: 150,
|
|
5409
5409
|
y: 150,
|
|
@@ -5422,15 +5422,15 @@ function useInsertElements(input) {
|
|
|
5422
5422
|
return;
|
|
5423
5423
|
}
|
|
5424
5424
|
addElement({
|
|
5425
|
-
...
|
|
5426
|
-
id:
|
|
5425
|
+
...chunkEFSQW6S5_js.newTableElement(chunkIDW5UPXW_js.DEFAULT_TABLE_ROWS, chunkIDW5UPXW_js.DEFAULT_TABLE_COLUMNS, 100, 200),
|
|
5426
|
+
id: chunkEFSQW6S5_js.generateElementId()
|
|
5427
5427
|
});
|
|
5428
5428
|
};
|
|
5429
5429
|
const handleAddChart = (chartType) => {
|
|
5430
5430
|
if (!activeSlide) {
|
|
5431
5431
|
return;
|
|
5432
5432
|
}
|
|
5433
|
-
addElement(
|
|
5433
|
+
addElement(chunkEFSQW6S5_js.createDefaultChartElement(chartType));
|
|
5434
5434
|
};
|
|
5435
5435
|
const structured = createStructuredElementHandlers({
|
|
5436
5436
|
activeSlide,
|
|
@@ -5500,7 +5500,7 @@ function useClipboardHandlers(input) {
|
|
|
5500
5500
|
if (!selectedElement) {
|
|
5501
5501
|
return;
|
|
5502
5502
|
}
|
|
5503
|
-
setClipboardPayload(
|
|
5503
|
+
setClipboardPayload(chunkEFSQW6S5_js.buildElementClipboardPayload(selectedElement, editTemplateMode));
|
|
5504
5504
|
};
|
|
5505
5505
|
const handleDelete = () => {
|
|
5506
5506
|
const idsToDelete = effectiveSelectedIds;
|
|
@@ -5517,7 +5517,7 @@ function useClipboardHandlers(input) {
|
|
|
5517
5517
|
handleDelete();
|
|
5518
5518
|
};
|
|
5519
5519
|
const insertClone = (source) => {
|
|
5520
|
-
const clone =
|
|
5520
|
+
const clone = chunkEFSQW6S5_js.cloneElementForPaste(source, { intoTemplate: editTemplateMode });
|
|
5521
5521
|
ops.updateActiveElements((els) => [...els, clone]);
|
|
5522
5522
|
ops.applySelection(clone.id);
|
|
5523
5523
|
history.markDirty();
|
|
@@ -5552,7 +5552,7 @@ function resolveShapePath(el) {
|
|
|
5552
5552
|
return el.pathData;
|
|
5553
5553
|
}
|
|
5554
5554
|
if ("shapeType" in el && typeof el.shapeType === "string") {
|
|
5555
|
-
const clipPath =
|
|
5555
|
+
const clipPath = chunkEFSQW6S5_js.getPresetShapeClipPath(el.shapeType);
|
|
5556
5556
|
if (clipPath) {
|
|
5557
5557
|
const svgPath = clipPathToSvgPath(clipPath, el.width, el.height);
|
|
5558
5558
|
if (svgPath) {
|
|
@@ -5603,7 +5603,7 @@ function clipPathToSvgPath(clipPath, width, height) {
|
|
|
5603
5603
|
return parts.join(" ");
|
|
5604
5604
|
}
|
|
5605
5605
|
function transformPathToGlobal(pathData, el) {
|
|
5606
|
-
const polys =
|
|
5606
|
+
const polys = chunkEFSQW6S5_js.svgPathToPolygons(pathData);
|
|
5607
5607
|
if (polys.length === 0) {
|
|
5608
5608
|
return pathData;
|
|
5609
5609
|
}
|
|
@@ -5623,10 +5623,10 @@ function transformPathToGlobal(pathData, el) {
|
|
|
5623
5623
|
y: pt.y * scaleY + el.y
|
|
5624
5624
|
}))
|
|
5625
5625
|
);
|
|
5626
|
-
return
|
|
5626
|
+
return chunkEFSQW6S5_js.polygonsToSvgPath(transformed);
|
|
5627
5627
|
}
|
|
5628
5628
|
function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
5629
|
-
const polys =
|
|
5629
|
+
const polys = chunkEFSQW6S5_js.svgPathToPolygons(pathData);
|
|
5630
5630
|
if (polys.length === 0) {
|
|
5631
5631
|
return pathData;
|
|
5632
5632
|
}
|
|
@@ -5636,10 +5636,10 @@ function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
|
5636
5636
|
y: pt.y - y
|
|
5637
5637
|
}))
|
|
5638
5638
|
);
|
|
5639
|
-
return
|
|
5639
|
+
return chunkEFSQW6S5_js.polygonsToSvgPath(transformed);
|
|
5640
5640
|
}
|
|
5641
5641
|
function pathBounds(pathData) {
|
|
5642
|
-
const polys =
|
|
5642
|
+
const polys = chunkEFSQW6S5_js.svgPathToPolygons(pathData);
|
|
5643
5643
|
let minX = Infinity;
|
|
5644
5644
|
let minY = Infinity;
|
|
5645
5645
|
let maxX = -Infinity;
|
|
@@ -5698,7 +5698,7 @@ function useMergeShapesHandler(input) {
|
|
|
5698
5698
|
let allFragments = [];
|
|
5699
5699
|
let remaining = globalPaths[0];
|
|
5700
5700
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
5701
|
-
const frags =
|
|
5701
|
+
const frags = chunkEFSQW6S5_js.mergeShapes("fragment", remaining, globalPaths[i]);
|
|
5702
5702
|
if (Array.isArray(frags)) {
|
|
5703
5703
|
allFragments = frags;
|
|
5704
5704
|
}
|
|
@@ -5727,7 +5727,7 @@ function useMergeShapesHandler(input) {
|
|
|
5727
5727
|
bounds.height
|
|
5728
5728
|
);
|
|
5729
5729
|
const newEl = {
|
|
5730
|
-
id:
|
|
5730
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5731
5731
|
type: "shape",
|
|
5732
5732
|
x: bounds.x,
|
|
5733
5733
|
y: bounds.y,
|
|
@@ -5765,7 +5765,7 @@ function useMergeShapesHandler(input) {
|
|
|
5765
5765
|
} else {
|
|
5766
5766
|
let resultPath = globalPaths[0];
|
|
5767
5767
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
5768
|
-
const result =
|
|
5768
|
+
const result = chunkEFSQW6S5_js.mergeShapes(operation, resultPath, globalPaths[i]);
|
|
5769
5769
|
if (typeof result === "string") {
|
|
5770
5770
|
resultPath = result;
|
|
5771
5771
|
}
|
|
@@ -5786,7 +5786,7 @@ function useMergeShapesHandler(input) {
|
|
|
5786
5786
|
);
|
|
5787
5787
|
const primary = targets[0];
|
|
5788
5788
|
const newEl = {
|
|
5789
|
-
id:
|
|
5789
|
+
id: chunkEFSQW6S5_js.generateElementId(),
|
|
5790
5790
|
type: "shape",
|
|
5791
5791
|
x: bounds.x,
|
|
5792
5792
|
y: bounds.y,
|
|
@@ -5849,7 +5849,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5849
5849
|
if (ids.length < 2 || !activeSlide) {
|
|
5850
5850
|
return;
|
|
5851
5851
|
}
|
|
5852
|
-
const { elements, groupId } =
|
|
5852
|
+
const { elements, groupId } = chunkEFSQW6S5_js.groupElements(ops.activeElements, ids, chunkEFSQW6S5_js.generateElementId());
|
|
5853
5853
|
if (groupId === null) {
|
|
5854
5854
|
return;
|
|
5855
5855
|
}
|
|
@@ -5862,12 +5862,12 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5862
5862
|
return;
|
|
5863
5863
|
}
|
|
5864
5864
|
const group = selectedElement;
|
|
5865
|
-
const intoTemplate =
|
|
5865
|
+
const intoTemplate = chunkEFSQW6S5_js.isTemplateElementId(group.id);
|
|
5866
5866
|
const ungrouped = group.children.map((child) => ({
|
|
5867
5867
|
...structuredClone(child),
|
|
5868
5868
|
// Keep child ids in the same store as the group so later edits route
|
|
5869
5869
|
// correctly: template groups yield template-prefixed child ids.
|
|
5870
|
-
id: intoTemplate ?
|
|
5870
|
+
id: intoTemplate ? chunkEFSQW6S5_js.makeCloneId(true, child.id || group.id) : child.id || chunkEFSQW6S5_js.generateElementId(),
|
|
5871
5871
|
x: child.x + group.x,
|
|
5872
5872
|
y: child.y + group.y
|
|
5873
5873
|
}));
|
|
@@ -5891,7 +5891,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5891
5891
|
if (!edge) {
|
|
5892
5892
|
return;
|
|
5893
5893
|
}
|
|
5894
|
-
const positions =
|
|
5894
|
+
const positions = chunkEFSQW6S5_js.alignElements(selectedElements, edge);
|
|
5895
5895
|
for (const [id, pos] of positions) {
|
|
5896
5896
|
const el = elementLookup.get(id);
|
|
5897
5897
|
if (!el) {
|
|
@@ -5909,7 +5909,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5909
5909
|
if (!distAxis) {
|
|
5910
5910
|
return;
|
|
5911
5911
|
}
|
|
5912
|
-
const positions =
|
|
5912
|
+
const positions = chunkEFSQW6S5_js.distributeElements(selectedElements, distAxis);
|
|
5913
5913
|
for (const [id, pos] of positions) {
|
|
5914
5914
|
const el = elementLookup.get(id);
|
|
5915
5915
|
if (!el) {
|
|
@@ -5926,7 +5926,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5926
5926
|
}
|
|
5927
5927
|
const id = selectedElement.id;
|
|
5928
5928
|
ops.updateActiveElements(
|
|
5929
|
-
(els) => direction === "forward" ?
|
|
5929
|
+
(els) => direction === "forward" ? chunkEFSQW6S5_js.bringForward(els, id) : direction === "backward" ? chunkEFSQW6S5_js.sendBackward(els, id) : els
|
|
5930
5930
|
);
|
|
5931
5931
|
history.markDirty();
|
|
5932
5932
|
};
|
|
@@ -5936,7 +5936,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5936
5936
|
}
|
|
5937
5937
|
const id = selectedElement.id;
|
|
5938
5938
|
ops.updateActiveElements(
|
|
5939
|
-
(els) => direction === "front" ?
|
|
5939
|
+
(els) => direction === "front" ? chunkEFSQW6S5_js.bringToFront(els, id) : chunkEFSQW6S5_js.sendToBack(els, id)
|
|
5940
5940
|
);
|
|
5941
5941
|
history.markDirty();
|
|
5942
5942
|
};
|
|
@@ -6058,7 +6058,7 @@ function insertSlideFromLayoutUpdater(slides, activeIndex, draft) {
|
|
|
6058
6058
|
function useSlideManagement(input) {
|
|
6059
6059
|
const { slides, activeSlideIndex, setActiveSlideIndex, ops, history, handlerRef } = input;
|
|
6060
6060
|
const handleAddSlide = () => {
|
|
6061
|
-
const newSlide =
|
|
6061
|
+
const newSlide = chunkEFSQW6S5_js.createBlankSlide(slides.length + 1);
|
|
6062
6062
|
ops.updateSlides((prev) => {
|
|
6063
6063
|
const next = [...prev];
|
|
6064
6064
|
next.splice(activeSlideIndex + 1, 0, newSlide);
|
|
@@ -6121,7 +6121,7 @@ function useSlideManagement(input) {
|
|
|
6121
6121
|
}
|
|
6122
6122
|
const clone = {
|
|
6123
6123
|
...src,
|
|
6124
|
-
id:
|
|
6124
|
+
id: chunkEFSQW6S5_js.makeSlideId(),
|
|
6125
6125
|
elements: src.elements.map((el) => ({
|
|
6126
6126
|
...el,
|
|
6127
6127
|
id: `${el.id}-dup-${Math.random().toString(36).slice(2, 6)}`
|
|
@@ -6153,7 +6153,7 @@ function useSlideManagement(input) {
|
|
|
6153
6153
|
const handleInsertSlideFromLayout = (layoutPath, layoutName) => {
|
|
6154
6154
|
const insertAt = activeSlideIndex + 1;
|
|
6155
6155
|
const draft = {
|
|
6156
|
-
...
|
|
6156
|
+
...chunkEFSQW6S5_js.createBlankSlide(slides.length + 1),
|
|
6157
6157
|
layoutPath,
|
|
6158
6158
|
...layoutName ? { layoutName } : {}
|
|
6159
6159
|
};
|
|
@@ -6214,7 +6214,7 @@ function createTableMergeHandlers(input) {
|
|
|
6214
6214
|
if (!nextCell || nextCell.hMerge || nextCell.vMerge) {
|
|
6215
6215
|
return;
|
|
6216
6216
|
}
|
|
6217
|
-
const newTableData =
|
|
6217
|
+
const newTableData = chunkEFSQW6S5_js.mergeCells(
|
|
6218
6218
|
[
|
|
6219
6219
|
{ row: rowIndex, col: columnIndex },
|
|
6220
6220
|
{ row: rowIndex, col: nextColIdx }
|
|
@@ -6222,7 +6222,7 @@ function createTableMergeHandlers(input) {
|
|
|
6222
6222
|
td
|
|
6223
6223
|
);
|
|
6224
6224
|
const updates = { tableData: newTableData };
|
|
6225
|
-
const newRawXml =
|
|
6225
|
+
const newRawXml = chunkEFSQW6S5_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6226
6226
|
if (newRawXml) {
|
|
6227
6227
|
updates.rawXml = newRawXml;
|
|
6228
6228
|
}
|
|
@@ -6248,7 +6248,7 @@ function createTableMergeHandlers(input) {
|
|
|
6248
6248
|
if (!targetNextCell || targetNextCell.hMerge || targetNextCell.vMerge) {
|
|
6249
6249
|
return;
|
|
6250
6250
|
}
|
|
6251
|
-
const newTableData =
|
|
6251
|
+
const newTableData = chunkEFSQW6S5_js.mergeCells(
|
|
6252
6252
|
[
|
|
6253
6253
|
{ row: rowIndex, col: columnIndex },
|
|
6254
6254
|
{ row: targetNextRowIdx, col: columnIndex }
|
|
@@ -6256,7 +6256,7 @@ function createTableMergeHandlers(input) {
|
|
|
6256
6256
|
td
|
|
6257
6257
|
);
|
|
6258
6258
|
const updates = { tableData: newTableData };
|
|
6259
|
-
const newRawXml =
|
|
6259
|
+
const newRawXml = chunkEFSQW6S5_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6260
6260
|
if (newRawXml) {
|
|
6261
6261
|
updates.rawXml = newRawXml;
|
|
6262
6262
|
}
|
|
@@ -6271,9 +6271,9 @@ function createTableMergeHandlers(input) {
|
|
|
6271
6271
|
return;
|
|
6272
6272
|
}
|
|
6273
6273
|
const td = selectedElement.tableData;
|
|
6274
|
-
const newTableData =
|
|
6274
|
+
const newTableData = chunkEFSQW6S5_js.mergeCells(ts.selectedCells, td);
|
|
6275
6275
|
const updates = { tableData: newTableData };
|
|
6276
|
-
const newRawXml =
|
|
6276
|
+
const newRawXml = chunkEFSQW6S5_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6277
6277
|
if (newRawXml) {
|
|
6278
6278
|
updates.rawXml = newRawXml;
|
|
6279
6279
|
}
|
|
@@ -6290,9 +6290,9 @@ function createTableMergeHandlers(input) {
|
|
|
6290
6290
|
}
|
|
6291
6291
|
const { rowIndex, columnIndex } = ts;
|
|
6292
6292
|
const td = selectedElement.tableData;
|
|
6293
|
-
const newTableData =
|
|
6293
|
+
const newTableData = chunkEFSQW6S5_js.splitCell(rowIndex, columnIndex, td);
|
|
6294
6294
|
const updates = { tableData: newTableData };
|
|
6295
|
-
const newRawXml =
|
|
6295
|
+
const newRawXml = chunkEFSQW6S5_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6296
6296
|
if (newRawXml) {
|
|
6297
6297
|
updates.rawXml = newRawXml;
|
|
6298
6298
|
}
|
|
@@ -6336,7 +6336,7 @@ function createTableStructHandlers(input) {
|
|
|
6336
6336
|
updates.tableData = { ...el.tableData, rows: newRows };
|
|
6337
6337
|
}
|
|
6338
6338
|
if (el.rawXml) {
|
|
6339
|
-
const newRawXml =
|
|
6339
|
+
const newRawXml = chunkEFSQW6S5_js.updateCellTextInRawXml(el, rowIndex, colIndex, text);
|
|
6340
6340
|
if (newRawXml) {
|
|
6341
6341
|
updates.rawXml = newRawXml;
|
|
6342
6342
|
}
|
|
@@ -6360,7 +6360,7 @@ function createTableStructHandlers(input) {
|
|
|
6360
6360
|
const { rowIndex, columnIndex: colIndex } = ts;
|
|
6361
6361
|
const updates = {};
|
|
6362
6362
|
if (selectedElement.rawXml) {
|
|
6363
|
-
const newRawXml =
|
|
6363
|
+
const newRawXml = chunkEFSQW6S5_js.updateCellTextStyleInRawXml(
|
|
6364
6364
|
selectedElement,
|
|
6365
6365
|
rowIndex,
|
|
6366
6366
|
colIndex,
|
|
@@ -6424,9 +6424,9 @@ function createTableStructHandlers(input) {
|
|
|
6424
6424
|
return;
|
|
6425
6425
|
}
|
|
6426
6426
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6427
|
-
const newTableData =
|
|
6427
|
+
const newTableData = chunkEFSQW6S5_js.insertTableRow(selectedElement.tableData, rowIdx, position);
|
|
6428
6428
|
const updates = { tableData: newTableData };
|
|
6429
|
-
const newRawXml =
|
|
6429
|
+
const newRawXml = chunkEFSQW6S5_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6430
6430
|
if (newRawXml) {
|
|
6431
6431
|
updates.rawXml = newRawXml;
|
|
6432
6432
|
}
|
|
@@ -6439,12 +6439,12 @@ function createTableStructHandlers(input) {
|
|
|
6439
6439
|
}
|
|
6440
6440
|
const td = selectedElement.tableData;
|
|
6441
6441
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6442
|
-
const newTableData =
|
|
6442
|
+
const newTableData = chunkEFSQW6S5_js.deleteTableRow(td, rowIdx);
|
|
6443
6443
|
if (newTableData === td) {
|
|
6444
6444
|
return;
|
|
6445
6445
|
}
|
|
6446
6446
|
const updates = { tableData: newTableData };
|
|
6447
|
-
const newRawXml =
|
|
6447
|
+
const newRawXml = chunkEFSQW6S5_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6448
6448
|
if (newRawXml) {
|
|
6449
6449
|
updates.rawXml = newRawXml;
|
|
6450
6450
|
}
|
|
@@ -6456,9 +6456,9 @@ function createTableStructHandlers(input) {
|
|
|
6456
6456
|
return;
|
|
6457
6457
|
}
|
|
6458
6458
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6459
|
-
const newTableData =
|
|
6459
|
+
const newTableData = chunkEFSQW6S5_js.insertTableColumn(selectedElement.tableData, colIdx, position);
|
|
6460
6460
|
const updates = { tableData: newTableData };
|
|
6461
|
-
const newRawXml =
|
|
6461
|
+
const newRawXml = chunkEFSQW6S5_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6462
6462
|
if (newRawXml) {
|
|
6463
6463
|
updates.rawXml = newRawXml;
|
|
6464
6464
|
}
|
|
@@ -6471,12 +6471,12 @@ function createTableStructHandlers(input) {
|
|
|
6471
6471
|
}
|
|
6472
6472
|
const td = selectedElement.tableData;
|
|
6473
6473
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6474
|
-
const newTableData =
|
|
6474
|
+
const newTableData = chunkEFSQW6S5_js.deleteTableColumn(td, colIdx);
|
|
6475
6475
|
if (newTableData === td) {
|
|
6476
6476
|
return;
|
|
6477
6477
|
}
|
|
6478
6478
|
const updates = { tableData: newTableData };
|
|
6479
|
-
const newRawXml =
|
|
6479
|
+
const newRawXml = chunkEFSQW6S5_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6480
6480
|
if (newRawXml) {
|
|
6481
6481
|
updates.rawXml = newRawXml;
|
|
6482
6482
|
}
|
|
@@ -6512,8 +6512,8 @@ async function renderToCanvas(element, options = {}) {
|
|
|
6512
6512
|
return html2canvasPro(element, {
|
|
6513
6513
|
...options,
|
|
6514
6514
|
onclone: async (doc, clonedEl) => {
|
|
6515
|
-
await
|
|
6516
|
-
|
|
6515
|
+
await chunkEFSQW6S5_js.normalizeColorsForCapture(doc, clonedEl);
|
|
6516
|
+
chunkEFSQW6S5_js.preprocessCssForCapture(clonedEl);
|
|
6517
6517
|
if (typeof userOnClone === "function") {
|
|
6518
6518
|
userOnClone(doc, clonedEl);
|
|
6519
6519
|
}
|
|
@@ -6569,7 +6569,7 @@ async function exportSlideToPngBlob(slideElement, options = {}) {
|
|
|
6569
6569
|
}
|
|
6570
6570
|
async function exportSlideAsPng(slideElement, slideIndex, options = {}) {
|
|
6571
6571
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
6572
|
-
|
|
6572
|
+
chunkEFSQW6S5_js.downloadBlob(blob, `slide-${slideIndex + 1}.png`);
|
|
6573
6573
|
}
|
|
6574
6574
|
async function copySlideToClipboard(slideElement, options = {}) {
|
|
6575
6575
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
@@ -6591,15 +6591,15 @@ async function exportAllSlidesAsPdf(slideStageRef, totalSlides, setActiveSlide,
|
|
|
6591
6591
|
continue;
|
|
6592
6592
|
}
|
|
6593
6593
|
const canvas = await renderElementToCanvas(stageEl, scale);
|
|
6594
|
-
images.push(
|
|
6594
|
+
images.push(chunkEFSQW6S5_js.canvasToJpegData(canvas));
|
|
6595
6595
|
}
|
|
6596
6596
|
onProgress?.(totalSlides, totalSlides);
|
|
6597
6597
|
setActiveSlide(currentSlideIndex);
|
|
6598
6598
|
if (images.length === 0) {
|
|
6599
6599
|
throw new Error(chunkBXAK3JFM_js.translationsEn["pptx.export.errorNoSlidesPdf"]);
|
|
6600
6600
|
}
|
|
6601
|
-
const pdfBlobUrl =
|
|
6602
|
-
|
|
6601
|
+
const pdfBlobUrl = chunkIDW5UPXW_js.buildPdfFromImageData(images);
|
|
6602
|
+
chunkEFSQW6S5_js.downloadDataUrl(pdfBlobUrl, filename);
|
|
6603
6603
|
}
|
|
6604
6604
|
async function captureAllSlidesAsPngDataUrls(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, options = {}) {
|
|
6605
6605
|
const { scale = 2, onProgress } = options;
|
|
@@ -6647,8 +6647,8 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
|
|
|
6647
6647
|
if (pages.length === 0) {
|
|
6648
6648
|
throw new Error(chunkBXAK3JFM_js.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
|
|
6649
6649
|
}
|
|
6650
|
-
const pdfDataUrl =
|
|
6651
|
-
|
|
6650
|
+
const pdfDataUrl = chunkIDW5UPXW_js.buildNotesPdf(pages);
|
|
6651
|
+
chunkEFSQW6S5_js.downloadDataUrl(pdfDataUrl, filename);
|
|
6652
6652
|
}
|
|
6653
6653
|
|
|
6654
6654
|
// src/viewer/utils/export-video.ts
|
|
@@ -6692,7 +6692,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
6692
6692
|
const fps = 30;
|
|
6693
6693
|
const stream = recordingCanvas.captureStream(fps);
|
|
6694
6694
|
const recorder = new MediaRecorder(stream, {
|
|
6695
|
-
mimeType:
|
|
6695
|
+
mimeType: chunkEFSQW6S5_js.pickSupportedMimeType([...chunkEFSQW6S5_js.WEBM_MIME_CANDIDATES]),
|
|
6696
6696
|
videoBitsPerSecond: 5e6
|
|
6697
6697
|
});
|
|
6698
6698
|
const chunks = [];
|
|
@@ -6715,8 +6715,8 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
6715
6715
|
const duration = slideTimingsMs?.[i] ?? slideDurationMs;
|
|
6716
6716
|
ctx.clearRect(0, 0, recordingCanvas.width, recordingCanvas.height);
|
|
6717
6717
|
ctx.drawImage(slideCanvases[i], 0, 0);
|
|
6718
|
-
const frameInterval =
|
|
6719
|
-
const framesNeeded =
|
|
6718
|
+
const frameInterval = chunkEFSQW6S5_js.fpsToFrameIntervalMs(fps);
|
|
6719
|
+
const framesNeeded = chunkEFSQW6S5_js.segmentFrameCount(duration, fps);
|
|
6720
6720
|
for (let f = 0; f < framesNeeded; f++) {
|
|
6721
6721
|
if (signal?.aborted) {
|
|
6722
6722
|
recorder.stop();
|
|
@@ -6765,7 +6765,7 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
|
|
|
6765
6765
|
if (frames.length === 0) {
|
|
6766
6766
|
throw new Error(chunkBXAK3JFM_js.translationsEn["pptx.export.errorNoSlidesGif"]);
|
|
6767
6767
|
}
|
|
6768
|
-
const gifBytes =
|
|
6768
|
+
const gifBytes = chunkEFSQW6S5_js.encodeGif(frames, Math.round(slideDurationMs / 10));
|
|
6769
6769
|
onProgress?.(totalSlides, totalSlides);
|
|
6770
6770
|
const buf = new ArrayBuffer(gifBytes.length);
|
|
6771
6771
|
new Uint8Array(buf).set(gifBytes);
|
|
@@ -6819,7 +6819,7 @@ function exportAllSlidesToSvg(data, options = {}) {
|
|
|
6819
6819
|
continue;
|
|
6820
6820
|
}
|
|
6821
6821
|
onProgress?.(processedCount, data.slides.length);
|
|
6822
|
-
let svg =
|
|
6822
|
+
let svg = chunkEFSQW6S5_js.SvgExporter.exportSlide(slide, data.width, data.height, svgOptions);
|
|
6823
6823
|
if (embedFonts && fontFaces?.length) {
|
|
6824
6824
|
svg = injectFontFaces(svg, fontFaces);
|
|
6825
6825
|
}
|
|
@@ -6879,7 +6879,7 @@ function useExportSaveAs(input) {
|
|
|
6879
6879
|
}
|
|
6880
6880
|
setExportProgress(70);
|
|
6881
6881
|
setExportStatusMessage("Writing README...");
|
|
6882
|
-
const readme =
|
|
6882
|
+
const readme = chunkEFSQW6S5_js.generatePackageReadme(pptxFilename);
|
|
6883
6883
|
pkgFolder.file("README.txt", readme);
|
|
6884
6884
|
if (abortCtrl.signal.aborted) {
|
|
6885
6885
|
throw new DOMException("Export cancelled", "AbortError");
|
|
@@ -6890,7 +6890,7 @@ function useExportSaveAs(input) {
|
|
|
6890
6890
|
setExportProgress(95);
|
|
6891
6891
|
setExportStatusMessage("Downloading...");
|
|
6892
6892
|
const baseName = pptxFilename.replace(/\.[^.]+$/u, "");
|
|
6893
|
-
|
|
6893
|
+
chunkEFSQW6S5_js.downloadBlob(zipBlob, `${baseName}-package.zip`);
|
|
6894
6894
|
setExportProgress(100);
|
|
6895
6895
|
} catch (err) {
|
|
6896
6896
|
if (err.name !== "AbortError") {
|
|
@@ -6913,7 +6913,7 @@ function useExportSaveAs(input) {
|
|
|
6913
6913
|
const blob = new Blob([data], {
|
|
6914
6914
|
type: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
|
|
6915
6915
|
});
|
|
6916
|
-
|
|
6916
|
+
chunkEFSQW6S5_js.downloadBlob(blob, `${baseName}.${ext}`);
|
|
6917
6917
|
} catch (err) {
|
|
6918
6918
|
console.error(`[PowerPointViewer] Save as .${ext} failed:`, err);
|
|
6919
6919
|
}
|
|
@@ -6926,14 +6926,14 @@ function useExportSaveAs(input) {
|
|
|
6926
6926
|
const pptxGuides = guides.map((g) => ({
|
|
6927
6927
|
id: g.id,
|
|
6928
6928
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
6929
|
-
positionEmu:
|
|
6929
|
+
positionEmu: chunkEFSQW6S5_js.guidePxToEmu(g.position)
|
|
6930
6930
|
}));
|
|
6931
6931
|
return {
|
|
6932
6932
|
...slide,
|
|
6933
6933
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
6934
6934
|
};
|
|
6935
6935
|
});
|
|
6936
|
-
const slidesToSave =
|
|
6936
|
+
const slidesToSave = chunkIDW5UPXW_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
6937
6937
|
const saveOptions = {
|
|
6938
6938
|
headerFooter,
|
|
6939
6939
|
presentationProperties,
|
|
@@ -6990,7 +6990,7 @@ function safeConfirm(message) {
|
|
|
6990
6990
|
}
|
|
6991
6991
|
}
|
|
6992
6992
|
function downloadBlob2(blob, filename) {
|
|
6993
|
-
|
|
6993
|
+
chunkEFSQW6S5_js.downloadBlob(blob, chunkEFSQW6S5_js.sanitizeDownloadFilename(filename));
|
|
6994
6994
|
}
|
|
6995
6995
|
|
|
6996
6996
|
// src/viewer/hooks/useExportHandlers.ts
|
|
@@ -7091,21 +7091,21 @@ function useExportHandlers(input) {
|
|
|
7091
7091
|
{
|
|
7092
7092
|
scale: 2,
|
|
7093
7093
|
onProgress: (current, total) => {
|
|
7094
|
-
setExportProgress(
|
|
7095
|
-
setExportStatusMessage(
|
|
7094
|
+
setExportProgress(chunkEFSQW6S5_js.slideProgressPercent(current, total));
|
|
7095
|
+
setExportStatusMessage(chunkEFSQW6S5_js.slideStatusLabel("Rendering", current, total));
|
|
7096
7096
|
},
|
|
7097
7097
|
signal: abortCtrl.signal
|
|
7098
7098
|
}
|
|
7099
7099
|
);
|
|
7100
|
-
setExportProgress(
|
|
7100
|
+
setExportProgress(chunkEFSQW6S5_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7101
7101
|
setExportStatusMessage("Building PDF...");
|
|
7102
7102
|
await new Promise((r) => {
|
|
7103
7103
|
setTimeout(r, 100);
|
|
7104
7104
|
});
|
|
7105
|
-
setExportProgress(
|
|
7105
|
+
setExportProgress(chunkEFSQW6S5_js.EXPORT_DONE_PERCENT);
|
|
7106
7106
|
setExportStatusMessage("Done!");
|
|
7107
7107
|
} catch (err) {
|
|
7108
|
-
if (!
|
|
7108
|
+
if (!chunkEFSQW6S5_js.isExportAbortError(err)) {
|
|
7109
7109
|
console.error("[PowerPointViewer] PDF export failed:", err);
|
|
7110
7110
|
}
|
|
7111
7111
|
} finally {
|
|
@@ -7135,21 +7135,21 @@ function useExportHandlers(input) {
|
|
|
7135
7135
|
{
|
|
7136
7136
|
scale: 2,
|
|
7137
7137
|
onProgress: (current, total) => {
|
|
7138
|
-
setExportProgress(
|
|
7139
|
-
setExportStatusMessage(
|
|
7138
|
+
setExportProgress(chunkEFSQW6S5_js.slideProgressPercent(current, total));
|
|
7139
|
+
setExportStatusMessage(chunkEFSQW6S5_js.slideStatusLabel("Rendering", current, total));
|
|
7140
7140
|
},
|
|
7141
7141
|
signal: abortCtrl.signal
|
|
7142
7142
|
}
|
|
7143
7143
|
);
|
|
7144
|
-
setExportProgress(
|
|
7144
|
+
setExportProgress(chunkEFSQW6S5_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7145
7145
|
setExportStatusMessage("Building PDF...");
|
|
7146
7146
|
await new Promise((r) => {
|
|
7147
7147
|
setTimeout(r, 100);
|
|
7148
7148
|
});
|
|
7149
|
-
setExportProgress(
|
|
7149
|
+
setExportProgress(chunkEFSQW6S5_js.EXPORT_DONE_PERCENT);
|
|
7150
7150
|
setExportStatusMessage("Done!");
|
|
7151
7151
|
} catch (err) {
|
|
7152
|
-
if (!
|
|
7152
|
+
if (!chunkEFSQW6S5_js.isExportAbortError(err)) {
|
|
7153
7153
|
console.error("[PowerPointViewer] Notes PDF export failed:", err);
|
|
7154
7154
|
}
|
|
7155
7155
|
} finally {
|
|
@@ -7190,22 +7190,22 @@ function useExportHandlers(input) {
|
|
|
7190
7190
|
scale: 1,
|
|
7191
7191
|
slideDurationMs: 3e3,
|
|
7192
7192
|
onProgress: (current, total) => {
|
|
7193
|
-
setExportProgress(
|
|
7194
|
-
setExportStatusMessage(
|
|
7193
|
+
setExportProgress(chunkEFSQW6S5_js.slideProgressPercent(current, total, 45));
|
|
7194
|
+
setExportStatusMessage(chunkEFSQW6S5_js.slideStatusLabel("Capturing", current, total));
|
|
7195
7195
|
},
|
|
7196
7196
|
onRecordProgress: (current, total) => {
|
|
7197
|
-
setExportProgress(
|
|
7198
|
-
setExportStatusMessage(
|
|
7197
|
+
setExportProgress(chunkEFSQW6S5_js.recordProgressPercent(current, total));
|
|
7198
|
+
setExportStatusMessage(chunkEFSQW6S5_js.slideStatusLabel("Recording", current, total));
|
|
7199
7199
|
},
|
|
7200
7200
|
signal: abortCtrl.signal
|
|
7201
7201
|
}
|
|
7202
7202
|
);
|
|
7203
|
-
setExportProgress(
|
|
7203
|
+
setExportProgress(chunkEFSQW6S5_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7204
7204
|
setExportStatusMessage("Saving file...");
|
|
7205
7205
|
downloadBlob2(blob, "presentation.webm");
|
|
7206
|
-
setExportProgress(
|
|
7206
|
+
setExportProgress(chunkEFSQW6S5_js.EXPORT_DONE_PERCENT);
|
|
7207
7207
|
} catch (err) {
|
|
7208
|
-
if (!
|
|
7208
|
+
if (!chunkEFSQW6S5_js.isExportAbortError(err)) {
|
|
7209
7209
|
console.error("[PowerPointViewer] Video export failed:", err);
|
|
7210
7210
|
}
|
|
7211
7211
|
} finally {
|
|
@@ -7233,18 +7233,18 @@ function useExportHandlers(input) {
|
|
|
7233
7233
|
scale: 0.5,
|
|
7234
7234
|
slideDurationMs: 2e3,
|
|
7235
7235
|
onProgress: (current, total) => {
|
|
7236
|
-
setExportProgress(
|
|
7237
|
-
setExportStatusMessage(
|
|
7236
|
+
setExportProgress(chunkEFSQW6S5_js.slideProgressPercent(current, total));
|
|
7237
|
+
setExportStatusMessage(chunkEFSQW6S5_js.slideStatusLabel("Encoding", current, total));
|
|
7238
7238
|
},
|
|
7239
7239
|
signal: abortCtrl.signal
|
|
7240
7240
|
}
|
|
7241
7241
|
);
|
|
7242
|
-
setExportProgress(
|
|
7242
|
+
setExportProgress(chunkEFSQW6S5_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7243
7243
|
setExportStatusMessage("Saving file...");
|
|
7244
7244
|
downloadBlob2(blob, "presentation.gif");
|
|
7245
|
-
setExportProgress(
|
|
7245
|
+
setExportProgress(chunkEFSQW6S5_js.EXPORT_DONE_PERCENT);
|
|
7246
7246
|
} catch (err) {
|
|
7247
|
-
if (!
|
|
7247
|
+
if (!chunkEFSQW6S5_js.isExportAbortError(err)) {
|
|
7248
7248
|
console.error("[PowerPointViewer] GIF export failed:", err);
|
|
7249
7249
|
}
|
|
7250
7250
|
} finally {
|
|
@@ -7284,7 +7284,7 @@ function openPrintWindow(title, bodyHtml, orientation, colorFilter, frameSlides)
|
|
|
7284
7284
|
}
|
|
7285
7285
|
printWindow.document.open();
|
|
7286
7286
|
printWindow.document.write(
|
|
7287
|
-
|
|
7287
|
+
chunkEFSQW6S5_js.buildPrintHtmlDocument({ title, bodyHtml, orientation, colorFilter, frameSlides })
|
|
7288
7288
|
);
|
|
7289
7289
|
printWindow.document.close();
|
|
7290
7290
|
printWindow.focus();
|
|
@@ -7345,7 +7345,7 @@ function usePrintHandlers(input) {
|
|
|
7345
7345
|
if (svgs.length === 0) {
|
|
7346
7346
|
return;
|
|
7347
7347
|
}
|
|
7348
|
-
const printDoc =
|
|
7348
|
+
const printDoc = chunkEFSQW6S5_js.buildPrintDocument(svgs, pptxData.width, pptxData.height, {
|
|
7349
7349
|
title: "Slides (Vector)",
|
|
7350
7350
|
orientation: settings.orientation,
|
|
7351
7351
|
colorFilter
|
|
@@ -7381,7 +7381,7 @@ function usePrintHandlers(input) {
|
|
|
7381
7381
|
if (settings.printWhat === "outline") {
|
|
7382
7382
|
openPrintWindow(
|
|
7383
7383
|
"Outline",
|
|
7384
|
-
`<div class="outline-page">${
|
|
7384
|
+
`<div class="outline-page">${chunkEFSQW6S5_js.buildOutlineHtml(slideIndices, slides)}</div>`,
|
|
7385
7385
|
settings.orientation,
|
|
7386
7386
|
colorFilter,
|
|
7387
7387
|
settings.frameSlides
|
|
@@ -7406,7 +7406,7 @@ function usePrintHandlers(input) {
|
|
|
7406
7406
|
if (settings.printWhat === "slides") {
|
|
7407
7407
|
openPrintWindow(
|
|
7408
7408
|
"Slides",
|
|
7409
|
-
|
|
7409
|
+
chunkEFSQW6S5_js.buildSlidesHtml(slideImages, slideIndices),
|
|
7410
7410
|
settings.orientation,
|
|
7411
7411
|
colorFilter,
|
|
7412
7412
|
settings.frameSlides
|
|
@@ -7416,7 +7416,7 @@ function usePrintHandlers(input) {
|
|
|
7416
7416
|
if (settings.printWhat === "notes") {
|
|
7417
7417
|
openPrintWindow(
|
|
7418
7418
|
"Notes Pages",
|
|
7419
|
-
|
|
7419
|
+
chunkEFSQW6S5_js.buildNotesHtml(slideImages, slideIndices, slides),
|
|
7420
7420
|
"portrait",
|
|
7421
7421
|
colorFilter,
|
|
7422
7422
|
settings.frameSlides
|
|
@@ -7427,7 +7427,7 @@ function usePrintHandlers(input) {
|
|
|
7427
7427
|
const spp = settings.slidesPerPage;
|
|
7428
7428
|
openPrintWindow(
|
|
7429
7429
|
`Handout ${spp} per page`,
|
|
7430
|
-
|
|
7430
|
+
chunkEFSQW6S5_js.buildHandoutsHtml(slideImages, slideIndices, spp),
|
|
7431
7431
|
"portrait",
|
|
7432
7432
|
colorFilter,
|
|
7433
7433
|
settings.frameSlides
|
|
@@ -7491,8 +7491,8 @@ function useThemeHandlers(input) {
|
|
|
7491
7491
|
return;
|
|
7492
7492
|
}
|
|
7493
7493
|
await handler.updateThemeColorScheme(colorScheme);
|
|
7494
|
-
const previousMap = theme?.colorScheme ?
|
|
7495
|
-
setSlides((prev) =>
|
|
7494
|
+
const previousMap = theme?.colorScheme ? chunkEFSQW6S5_js.buildThemeColorMap(theme.colorScheme) : {};
|
|
7495
|
+
setSlides((prev) => chunkEFSQW6S5_js.reResolveSlideColors(prev, previousMap, colorScheme));
|
|
7496
7496
|
setTheme((prev) => prev ? { ...prev, colorScheme } : { colorScheme });
|
|
7497
7497
|
bumpHistory();
|
|
7498
7498
|
history.markDirty();
|
|
@@ -7597,7 +7597,7 @@ function useThemeSwitching(input) {
|
|
|
7597
7597
|
}
|
|
7598
7598
|
try {
|
|
7599
7599
|
await handler.applyTheme(preset.colorScheme, preset.fontScheme, preset.name);
|
|
7600
|
-
const newData =
|
|
7600
|
+
const newData = chunkEFSQW6S5_js.applyThemeToData(data, preset.colorScheme, preset.fontScheme, preset.name);
|
|
7601
7601
|
onDataChange(newData);
|
|
7602
7602
|
onThemeChanged?.(preset);
|
|
7603
7603
|
} catch (error) {
|
|
@@ -7614,7 +7614,7 @@ function useThemeSwitching(input) {
|
|
|
7614
7614
|
}
|
|
7615
7615
|
try {
|
|
7616
7616
|
await handler.applyTheme(colorScheme, fontScheme ?? {}, themeName);
|
|
7617
|
-
const newData =
|
|
7617
|
+
const newData = chunkEFSQW6S5_js.applyThemeToData(data, colorScheme, fontScheme, themeName);
|
|
7618
7618
|
onDataChange(newData);
|
|
7619
7619
|
} catch (error) {
|
|
7620
7620
|
console.error("Failed to switch to custom theme:", error);
|
|
@@ -7626,12 +7626,12 @@ function useThemeSwitching(input) {
|
|
|
7626
7626
|
if (!data?.theme?.colorScheme) {
|
|
7627
7627
|
return void 0;
|
|
7628
7628
|
}
|
|
7629
|
-
return
|
|
7630
|
-
(p) =>
|
|
7629
|
+
return chunkEFSQW6S5_js.THEME_PRESETS.find(
|
|
7630
|
+
(p) => chunkEFSQW6S5_js.themeColorSchemesEqual(data.theme?.colorScheme, p.colorScheme)
|
|
7631
7631
|
);
|
|
7632
7632
|
}, [data?.theme?.colorScheme]);
|
|
7633
7633
|
return {
|
|
7634
|
-
presets:
|
|
7634
|
+
presets: chunkEFSQW6S5_js.THEME_PRESETS,
|
|
7635
7635
|
switchToPreset,
|
|
7636
7636
|
switchToCustom,
|
|
7637
7637
|
currentPreset
|
|
@@ -7706,7 +7706,7 @@ function usePropertyHandlers(input) {
|
|
|
7706
7706
|
}
|
|
7707
7707
|
try {
|
|
7708
7708
|
const ab = await file.arrayBuffer();
|
|
7709
|
-
const h = new
|
|
7709
|
+
const h = new chunkEFSQW6S5_js.PptxHandler();
|
|
7710
7710
|
const other = await h.load(ab);
|
|
7711
7711
|
if (!other) {
|
|
7712
7712
|
return;
|
|
@@ -7716,7 +7716,7 @@ function usePropertyHandlers(input) {
|
|
|
7716
7716
|
width: canvasSize.width,
|
|
7717
7717
|
height: canvasSize.height
|
|
7718
7718
|
};
|
|
7719
|
-
setCompareResult(
|
|
7719
|
+
setCompareResult(chunkEFSQW6S5_js.comparePresentation(cur, other));
|
|
7720
7720
|
setIsComparePanelOpen(true);
|
|
7721
7721
|
} catch (err) {
|
|
7722
7722
|
console.warn("Compare failed:", err);
|
|
@@ -7733,7 +7733,7 @@ function usePropertyHandlers(input) {
|
|
|
7733
7733
|
if (!diff || diff.status === "unchanged") {
|
|
7734
7734
|
return;
|
|
7735
7735
|
}
|
|
7736
|
-
setSlides((prev) =>
|
|
7736
|
+
setSlides((prev) => chunkEFSQW6S5_js.applyAcceptSlide(prev, diff));
|
|
7737
7737
|
setIsDirty(true);
|
|
7738
7738
|
},
|
|
7739
7739
|
[compareResult, setSlides, setIsDirty]
|
|
@@ -7744,10 +7744,10 @@ function usePropertyHandlers(input) {
|
|
|
7744
7744
|
if (!compareResult) {
|
|
7745
7745
|
return;
|
|
7746
7746
|
}
|
|
7747
|
-
setSlides((prev) =>
|
|
7747
|
+
setSlides((prev) => chunkEFSQW6S5_js.applyAcceptAllSlides(prev, compareResult));
|
|
7748
7748
|
setIsDirty(true);
|
|
7749
7749
|
}, [compareResult, setSlides, setIsDirty]);
|
|
7750
|
-
const usedFontFamilies = react.useMemo(() =>
|
|
7750
|
+
const usedFontFamilies = react.useMemo(() => chunkEFSQW6S5_js.collectUsedFonts(slides), [slides]);
|
|
7751
7751
|
return {
|
|
7752
7752
|
handleUpdateNotes,
|
|
7753
7753
|
handleUpdateSlide,
|
|
@@ -7866,7 +7866,7 @@ function useIsMobile(input) {
|
|
|
7866
7866
|
const containerRef = input?.containerRef;
|
|
7867
7867
|
const isTouchDevice = react.useSyncExternalStore(
|
|
7868
7868
|
subscribeTouchCapability,
|
|
7869
|
-
|
|
7869
|
+
chunkEFSQW6S5_js.detectTouchDevice,
|
|
7870
7870
|
() => false
|
|
7871
7871
|
// server snapshot
|
|
7872
7872
|
);
|
|
@@ -7882,7 +7882,7 @@ function useIsMobile(input) {
|
|
|
7882
7882
|
}
|
|
7883
7883
|
return containerRef?.current?.clientHeight ?? window.innerHeight;
|
|
7884
7884
|
});
|
|
7885
|
-
const [orientation, setOrientation] = react.useState(
|
|
7885
|
+
const [orientation, setOrientation] = react.useState(chunkEFSQW6S5_js.detectOrientation);
|
|
7886
7886
|
const [isVirtualKeyboardOpen, setIsVirtualKeyboardOpen] = react.useState(false);
|
|
7887
7887
|
const [initialViewportHeight] = react.useState(
|
|
7888
7888
|
() => typeof window !== "undefined" ? window.innerHeight : 800
|
|
@@ -7926,7 +7926,7 @@ function useIsMobile(input) {
|
|
|
7926
7926
|
return;
|
|
7927
7927
|
}
|
|
7928
7928
|
const handleOrientationChange = () => {
|
|
7929
|
-
setOrientation(
|
|
7929
|
+
setOrientation(chunkEFSQW6S5_js.detectOrientation());
|
|
7930
7930
|
};
|
|
7931
7931
|
if (screen.orientation) {
|
|
7932
7932
|
screen.orientation.addEventListener("change", handleOrientationChange);
|
|
@@ -7956,9 +7956,9 @@ function useIsMobile(input) {
|
|
|
7956
7956
|
window.addEventListener("resize", handleResize);
|
|
7957
7957
|
return () => window.removeEventListener("resize", handleResize);
|
|
7958
7958
|
}, [isTouchDevice, initialViewportHeight]);
|
|
7959
|
-
const isMobile =
|
|
7960
|
-
const isTablet = !isMobile && containerWidth >=
|
|
7961
|
-
const isDesktop = !isMobile && containerWidth >=
|
|
7959
|
+
const isMobile = chunkEFSQW6S5_js.isMobileViewport(containerWidth, containerHeight, isTouchDevice);
|
|
7960
|
+
const isTablet = !isMobile && containerWidth >= chunkEFSQW6S5_js.MOBILE_BREAKPOINT && containerWidth < chunkEFSQW6S5_js.TABLET_BREAKPOINT;
|
|
7961
|
+
const isDesktop = !isMobile && containerWidth >= chunkEFSQW6S5_js.TABLET_BREAKPOINT;
|
|
7962
7962
|
return {
|
|
7963
7963
|
isMobile,
|
|
7964
7964
|
isTablet,
|
|
@@ -8019,11 +8019,11 @@ function useViewerDialogs(input) {
|
|
|
8019
8019
|
);
|
|
8020
8020
|
const [embedFontsEnabled, setEmbedFontsEnabled] = react.useState(false);
|
|
8021
8021
|
const [isNarrowViewport, setIsNarrowViewport] = react.useState(
|
|
8022
|
-
() => typeof window !== "undefined" ?
|
|
8022
|
+
() => typeof window !== "undefined" ? chunkEFSQW6S5_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch()) : false
|
|
8023
8023
|
);
|
|
8024
8024
|
react.useEffect(() => {
|
|
8025
8025
|
const handleWindow = () => setIsNarrowViewport(
|
|
8026
|
-
|
|
8026
|
+
chunkEFSQW6S5_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch())
|
|
8027
8027
|
);
|
|
8028
8028
|
let observer = null;
|
|
8029
8029
|
let raf = 0;
|
|
@@ -8037,12 +8037,12 @@ function useViewerDialogs(input) {
|
|
|
8037
8037
|
const entry = entries[0];
|
|
8038
8038
|
if (entry) {
|
|
8039
8039
|
setIsNarrowViewport(
|
|
8040
|
-
|
|
8040
|
+
chunkEFSQW6S5_js.isMobileViewport(entry.contentRect.width, entry.contentRect.height, viewportIsTouch())
|
|
8041
8041
|
);
|
|
8042
8042
|
}
|
|
8043
8043
|
});
|
|
8044
8044
|
observer.observe(el);
|
|
8045
|
-
setIsNarrowViewport(
|
|
8045
|
+
setIsNarrowViewport(chunkEFSQW6S5_js.isMobileViewport(el.clientWidth, el.clientHeight, viewportIsTouch()));
|
|
8046
8046
|
};
|
|
8047
8047
|
attach();
|
|
8048
8048
|
window.addEventListener("resize", handleWindow);
|
|
@@ -8200,20 +8200,20 @@ function useViewerDialogs(input) {
|
|
|
8200
8200
|
}
|
|
8201
8201
|
function computeGridSpacingPx(presentationGridSpacing) {
|
|
8202
8202
|
if (presentationGridSpacing) {
|
|
8203
|
-
const px = Math.round(presentationGridSpacing.cx /
|
|
8203
|
+
const px = Math.round(presentationGridSpacing.cx / chunkIDW5UPXW_js.EMU_PER_PX);
|
|
8204
8204
|
if (px > 0) {
|
|
8205
8205
|
return px;
|
|
8206
8206
|
}
|
|
8207
8207
|
}
|
|
8208
|
-
return
|
|
8208
|
+
return chunkIDW5UPXW_js.GRID_SIZE;
|
|
8209
8209
|
}
|
|
8210
8210
|
function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows) {
|
|
8211
8211
|
const activeShow = activeCustomShowId ? customShows.find((show) => show.id === activeCustomShowId) : void 0;
|
|
8212
|
-
return
|
|
8212
|
+
return chunkEFSQW6S5_js.resolveShowSlideIndexes(slides, activeShow);
|
|
8213
8213
|
}
|
|
8214
8214
|
function computeSlideSectionGroups(slides, sections) {
|
|
8215
|
-
return
|
|
8216
|
-
id: group.section?.id ?? (sections.length > 0 ?
|
|
8215
|
+
return chunkEFSQW6S5_js.groupSlidesBySection(sections, slides).map((group) => ({
|
|
8216
|
+
id: group.section?.id ?? (sections.length > 0 ? chunkIDW5UPXW_js.UNGROUPED_SECTION_ID : "default"),
|
|
8217
8217
|
label: group.section?.name ?? (sections.length > 0 ? "Ungrouped Slides" : "Slides"),
|
|
8218
8218
|
slideIndexes: group.slideIndexes,
|
|
8219
8219
|
...group.section?.color !== void 0 ? { color: group.section.color } : {},
|
|
@@ -8268,7 +8268,7 @@ function useDerivedSlideState(input) {
|
|
|
8268
8268
|
);
|
|
8269
8269
|
const slideSectionGroups = react.useMemo(
|
|
8270
8270
|
() => computeSlideSectionGroups(slides, sections).map((group) => {
|
|
8271
|
-
if (group.id ===
|
|
8271
|
+
if (group.id === chunkIDW5UPXW_js.UNGROUPED_SECTION_ID && group.label === "Ungrouped Slides") {
|
|
8272
8272
|
return { ...group, label: t("pptx.slides.ungroupedSlides") };
|
|
8273
8273
|
}
|
|
8274
8274
|
if (group.id === "default" && group.label === "Slides") {
|
|
@@ -8371,13 +8371,13 @@ function useAnnotationHandlers(input) {
|
|
|
8371
8371
|
}, [annotations, setMode, setSlides, history]);
|
|
8372
8372
|
const handleSetMode = react.useCallback(
|
|
8373
8373
|
(nextMode) => {
|
|
8374
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8374
|
+
if (mode === "present" && nextMode !== "present" && !chunkEFSQW6S5_js.mayLeaveSlideShow()) {
|
|
8375
8375
|
return;
|
|
8376
8376
|
}
|
|
8377
8377
|
if (nextMode === "present") {
|
|
8378
8378
|
presentation.enterPresentMode();
|
|
8379
8379
|
} else if (mode === "present" && annotations.hasAnyAnnotations) {
|
|
8380
|
-
|
|
8380
|
+
chunkIDW5UPXW_js.stopAllPersistentAudio();
|
|
8381
8381
|
pendingModeAfterAnnotationsRef.current = nextMode;
|
|
8382
8382
|
if (promptKeepInkAnnotations) {
|
|
8383
8383
|
setShowKeepAnnotationsDialog(true);
|
|
@@ -8386,7 +8386,7 @@ function useAnnotationHandlers(input) {
|
|
|
8386
8386
|
}
|
|
8387
8387
|
} else {
|
|
8388
8388
|
if (mode === "present") {
|
|
8389
|
-
|
|
8389
|
+
chunkIDW5UPXW_js.stopAllPersistentAudio();
|
|
8390
8390
|
}
|
|
8391
8391
|
setMode(nextMode);
|
|
8392
8392
|
}
|
|
@@ -8452,13 +8452,13 @@ function useSerialize(input) {
|
|
|
8452
8452
|
let processedSlide = slide;
|
|
8453
8453
|
if (pendingEditId) {
|
|
8454
8454
|
const updatedElements = slide.elements.map((el) => {
|
|
8455
|
-
if (el.id !== pendingEditId || !
|
|
8455
|
+
if (el.id !== pendingEditId || !chunkEFSQW6S5_js.hasTextProperties(el)) {
|
|
8456
8456
|
return el;
|
|
8457
8457
|
}
|
|
8458
8458
|
return {
|
|
8459
8459
|
...el,
|
|
8460
8460
|
text: pendingEditText,
|
|
8461
|
-
textSegments:
|
|
8461
|
+
textSegments: chunkEFSQW6S5_js.remapTextToSegments(pendingEditText, el.textSegments, el.textStyle)
|
|
8462
8462
|
};
|
|
8463
8463
|
});
|
|
8464
8464
|
if (updatedElements.some((el, i) => el !== slide.elements[i])) {
|
|
@@ -8471,14 +8471,14 @@ function useSerialize(input) {
|
|
|
8471
8471
|
const pptxGuides = guides.map((g) => ({
|
|
8472
8472
|
id: g.id,
|
|
8473
8473
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
8474
|
-
positionEmu:
|
|
8474
|
+
positionEmu: chunkEFSQW6S5_js.guidePxToEmu(g.position)
|
|
8475
8475
|
}));
|
|
8476
8476
|
return {
|
|
8477
8477
|
...processedSlide,
|
|
8478
8478
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
8479
8479
|
};
|
|
8480
8480
|
});
|
|
8481
|
-
const slidesToSave =
|
|
8481
|
+
const slidesToSave = chunkIDW5UPXW_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
8482
8482
|
const saveOptions = {
|
|
8483
8483
|
headerFooter,
|
|
8484
8484
|
presentationProperties,
|
|
@@ -8647,7 +8647,7 @@ function usePresentationSetup(input) {
|
|
|
8647
8647
|
containerRef,
|
|
8648
8648
|
content,
|
|
8649
8649
|
onSetMode: (nextMode) => {
|
|
8650
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8650
|
+
if (mode === "present" && nextMode !== "present" && !chunkEFSQW6S5_js.mayLeaveSlideShow()) {
|
|
8651
8651
|
return;
|
|
8652
8652
|
}
|
|
8653
8653
|
if (mode === "present" && nextMode !== "present" && annotations.hasAnyAnnotations && promptKeepInkAnnotations) {
|
|
@@ -8655,7 +8655,7 @@ function usePresentationSetup(input) {
|
|
|
8655
8655
|
setShowKeepAnnotationsDialog(true);
|
|
8656
8656
|
} else {
|
|
8657
8657
|
if (mode === "present" && nextMode !== "present") {
|
|
8658
|
-
|
|
8658
|
+
chunkIDW5UPXW_js.stopAllPersistentAudio();
|
|
8659
8659
|
stopAnimationSound();
|
|
8660
8660
|
}
|
|
8661
8661
|
setMode(nextMode);
|
|
@@ -8709,10 +8709,10 @@ function usePresentationSetup(input) {
|
|
|
8709
8709
|
onToggleInkMarkup: () => annotations.setInkMarkupVisible(!annotations.inkMarkupVisible),
|
|
8710
8710
|
onToggleToolbar: () => annotations.setToolbarVisible(!annotations.toolbarVisible),
|
|
8711
8711
|
onSaveRehearsalTimings: (timings) => {
|
|
8712
|
-
setSlides((prev) =>
|
|
8712
|
+
setSlides((prev) => chunkEFSQW6S5_js.applyRehearsalTimings(prev, timings));
|
|
8713
8713
|
history.markDirty();
|
|
8714
8714
|
},
|
|
8715
|
-
loopContinuously:
|
|
8715
|
+
loopContinuously: chunkEFSQW6S5_js.shouldLoopContinuously(presentationProperties),
|
|
8716
8716
|
showWithAnimation: presentationProperties.showWithAnimation,
|
|
8717
8717
|
useTimings: presentationProperties.advanceMode !== "manual",
|
|
8718
8718
|
endWithBlackSlide
|
|
@@ -8874,7 +8874,7 @@ function useEditorOperations(input) {
|
|
|
8874
8874
|
const { formatPainterActive, setFormatPainterActive, elementLookup } = state;
|
|
8875
8875
|
react.useEffect(() => {
|
|
8876
8876
|
if (formatPainterActive && !prevFormatPainterRef.current && selectedElement) {
|
|
8877
|
-
copiedFormatRef.current =
|
|
8877
|
+
copiedFormatRef.current = chunkEFSQW6S5_js.copyFormatFromElement(selectedElement);
|
|
8878
8878
|
} else if (!formatPainterActive) {
|
|
8879
8879
|
copiedFormatRef.current = null;
|
|
8880
8880
|
}
|
|
@@ -8900,12 +8900,12 @@ function useEditorOperations(input) {
|
|
|
8900
8900
|
e.stopPropagation();
|
|
8901
8901
|
const element = elementLookup.get(elementId);
|
|
8902
8902
|
if (element) {
|
|
8903
|
-
const updated =
|
|
8903
|
+
const updated = chunkEFSQW6S5_js.applyFormatToElement(element, copiedFormatRef.current);
|
|
8904
8904
|
const updates = {};
|
|
8905
|
-
if (
|
|
8905
|
+
if (chunkEFSQW6S5_js.hasShapeProperties(updated)) {
|
|
8906
8906
|
updates.shapeStyle = updated.shapeStyle;
|
|
8907
8907
|
}
|
|
8908
|
-
if (
|
|
8908
|
+
if (chunkEFSQW6S5_js.hasTextProperties(updated)) {
|
|
8909
8909
|
updates.textStyle = updated.textStyle;
|
|
8910
8910
|
}
|
|
8911
8911
|
ops.updateElementById(elementId, updates);
|
|
@@ -9052,7 +9052,7 @@ function collectReferencedFontFamilies(slides) {
|
|
|
9052
9052
|
const families = /* @__PURE__ */ new Set();
|
|
9053
9053
|
for (const slide of slides) {
|
|
9054
9054
|
for (const el of slide.elements) {
|
|
9055
|
-
if (
|
|
9055
|
+
if (chunkEFSQW6S5_js.hasTextProperties(el) && el.textSegments) {
|
|
9056
9056
|
for (const seg of el.textSegments) {
|
|
9057
9057
|
if (seg.style.fontFamily) {
|
|
9058
9058
|
families.add(seg.style.fontFamily);
|
|
@@ -9264,13 +9264,13 @@ function useKeyboardShortcuts(input) {
|
|
|
9264
9264
|
inputRef.current = input;
|
|
9265
9265
|
const handleKeyDown = react.useCallback((e) => {
|
|
9266
9266
|
const current = inputRef.current;
|
|
9267
|
-
const { action, dx, dy } =
|
|
9267
|
+
const { action, dx, dy } = chunkEFSQW6S5_js.mapEditorKey(e, {
|
|
9268
9268
|
canEdit: current.canEdit,
|
|
9269
9269
|
isPresenting: current.mode !== "edit",
|
|
9270
9270
|
hasSelection: current.hasSelection,
|
|
9271
9271
|
isEditingText: Boolean(current.inlineEditingElementId || current.tableEditorState?.isEditing),
|
|
9272
9272
|
isDrawing: current.activeTool !== "select",
|
|
9273
|
-
isTextInputTarget:
|
|
9273
|
+
isTextInputTarget: chunkEFSQW6S5_js.isEditorTextInputTarget(e.target)
|
|
9274
9274
|
});
|
|
9275
9275
|
if (action === null) {
|
|
9276
9276
|
return;
|
|
@@ -9563,7 +9563,7 @@ function useViewerIntegration(input) {
|
|
|
9563
9563
|
return zoom.scale;
|
|
9564
9564
|
},
|
|
9565
9565
|
setZoom(level) {
|
|
9566
|
-
zoom.setScale(
|
|
9566
|
+
zoom.setScale(chunkEFSQW6S5_js.clampZoomScale(level));
|
|
9567
9567
|
},
|
|
9568
9568
|
zoomIn() {
|
|
9569
9569
|
zoom.handleZoomIn();
|
|
@@ -9778,7 +9778,7 @@ function useReducedMotion() {
|
|
|
9778
9778
|
}
|
|
9779
9779
|
function useViewerOptions() {
|
|
9780
9780
|
const storeRef = react.useRef(null);
|
|
9781
|
-
storeRef.current ??=
|
|
9781
|
+
storeRef.current ??= chunkEFSQW6S5_js.createViewerOptionsStore();
|
|
9782
9782
|
const store = storeRef.current;
|
|
9783
9783
|
const options = react.useSyncExternalStore(
|
|
9784
9784
|
(onStoreChange) => store.subscribe(onStoreChange),
|
|
@@ -9787,9 +9787,9 @@ function useViewerOptions() {
|
|
|
9787
9787
|
);
|
|
9788
9788
|
return { optionsStore: store, options };
|
|
9789
9789
|
}
|
|
9790
|
-
var KNOWN_TAB_IDS = new Set(
|
|
9790
|
+
var KNOWN_TAB_IDS = new Set(chunkEFSQW6S5_js.TOOLBAR_TABS.map((tab) => tab.id));
|
|
9791
9791
|
function computeToolbarVisibility(hiddenActions) {
|
|
9792
|
-
const isHidden = (id) =>
|
|
9792
|
+
const isHidden = (id) => chunkEFSQW6S5_js.isActionHidden(id, hiddenActions);
|
|
9793
9793
|
const isTabVisible = (id) => !KNOWN_TAB_IDS.has(id) || !isHidden(id);
|
|
9794
9794
|
return { isHidden, isTabVisible };
|
|
9795
9795
|
}
|
|
@@ -9874,12 +9874,12 @@ function useYjsDocumentSync({
|
|
|
9874
9874
|
return;
|
|
9875
9875
|
}
|
|
9876
9876
|
try {
|
|
9877
|
-
const handler = new
|
|
9877
|
+
const handler = new chunkEFSQW6S5_js.PptxHandler();
|
|
9878
9878
|
await handler.load(sourceBytes.buffer);
|
|
9879
|
-
const currentSlides =
|
|
9879
|
+
const currentSlides = chunkEFSQW6S5_js.readSlidesFromYDoc(
|
|
9880
9880
|
doc
|
|
9881
9881
|
);
|
|
9882
|
-
const slidesToSave =
|
|
9882
|
+
const slidesToSave = chunkIDW5UPXW_js.buildSaveSlides(currentSlides, templateElementsBySlideId);
|
|
9883
9883
|
const bytes = await handler.save(slidesToSave);
|
|
9884
9884
|
config.onWriteBack(bytes);
|
|
9885
9885
|
} catch {
|
|
@@ -9894,7 +9894,7 @@ function useYjsDocumentSync({
|
|
|
9894
9894
|
if (!doc || !isConnected) {
|
|
9895
9895
|
return;
|
|
9896
9896
|
}
|
|
9897
|
-
const docSlides =
|
|
9897
|
+
const docSlides = chunkEFSQW6S5_js.readSlidesFromYDoc(
|
|
9898
9898
|
doc
|
|
9899
9899
|
);
|
|
9900
9900
|
if (docSlides.length === 0) {
|
|
@@ -9916,11 +9916,11 @@ function useYjsDocumentSync({
|
|
|
9916
9916
|
lastSyncedRef.current = serialized;
|
|
9917
9917
|
void (async () => {
|
|
9918
9918
|
const factories = await getFactories();
|
|
9919
|
-
|
|
9919
|
+
chunkEFSQW6S5_js.reconcileSlidesInYDoc(
|
|
9920
9920
|
slides,
|
|
9921
9921
|
doc,
|
|
9922
9922
|
factories,
|
|
9923
|
-
|
|
9923
|
+
chunkEFSQW6S5_js.LOCAL_SYNC_ORIGIN
|
|
9924
9924
|
);
|
|
9925
9925
|
scheduleWriteBack();
|
|
9926
9926
|
})();
|
|
@@ -9934,10 +9934,10 @@ function useYjsDocumentSync({
|
|
|
9934
9934
|
return;
|
|
9935
9935
|
}
|
|
9936
9936
|
const handleChange = (_events, transaction) => {
|
|
9937
|
-
if (transaction?.origin ===
|
|
9937
|
+
if (transaction?.origin === chunkEFSQW6S5_js.LOCAL_SYNC_ORIGIN) {
|
|
9938
9938
|
return;
|
|
9939
9939
|
}
|
|
9940
|
-
const remoteSlides =
|
|
9940
|
+
const remoteSlides = chunkEFSQW6S5_js.readSlidesFromYDoc(
|
|
9941
9941
|
doc
|
|
9942
9942
|
);
|
|
9943
9943
|
if (remoteSlides.length === 0) {
|
|
@@ -9953,7 +9953,7 @@ function useYjsDocumentSync({
|
|
|
9953
9953
|
isApplyingRemoteRef.current = false;
|
|
9954
9954
|
scheduleWriteBack();
|
|
9955
9955
|
};
|
|
9956
|
-
const unobserve =
|
|
9956
|
+
const unobserve = chunkEFSQW6S5_js.observeYDocSlides(
|
|
9957
9957
|
doc,
|
|
9958
9958
|
handleChange
|
|
9959
9959
|
);
|
|
@@ -9991,7 +9991,7 @@ function useBroadcastFollower({
|
|
|
9991
9991
|
if (!broadcaster) {
|
|
9992
9992
|
return;
|
|
9993
9993
|
}
|
|
9994
|
-
if (!
|
|
9994
|
+
if (!chunkEFSQW6S5_js.shouldAutoFollowBroadcaster({
|
|
9995
9995
|
localRole: collab.config.role,
|
|
9996
9996
|
broadcasterRole: broadcaster.role
|
|
9997
9997
|
})) {
|
|
@@ -10151,10 +10151,10 @@ function useTouchGestures(input) {
|
|
|
10151
10151
|
if (!el || !enabled) {
|
|
10152
10152
|
return;
|
|
10153
10153
|
}
|
|
10154
|
-
const recognizer =
|
|
10154
|
+
const recognizer = chunkEFSQW6S5_js.createTouchGestureRecognizer({
|
|
10155
10155
|
getScale: () => scaleRef.current,
|
|
10156
|
-
minScale:
|
|
10157
|
-
maxScale:
|
|
10156
|
+
minScale: chunkEFSQW6S5_js.MIN_ZOOM_SCALE,
|
|
10157
|
+
maxScale: chunkEFSQW6S5_js.MAX_ZOOM_SCALE,
|
|
10158
10158
|
callbacks: {
|
|
10159
10159
|
onPinchZoom: (newScale) => callbacksRef.current.onPinchZoom?.(newScale),
|
|
10160
10160
|
onSwipe: (direction) => callbacksRef.current.onSwipe?.(direction),
|
|
@@ -10194,7 +10194,7 @@ function scrollFocusedIntoView(keyboardInset) {
|
|
|
10194
10194
|
return;
|
|
10195
10195
|
}
|
|
10196
10196
|
const rect = active.getBoundingClientRect();
|
|
10197
|
-
const delta =
|
|
10197
|
+
const delta = chunkEFSQW6S5_js.computeScrollDelta(
|
|
10198
10198
|
{ top: rect.top, bottom: rect.bottom },
|
|
10199
10199
|
window.innerHeight,
|
|
10200
10200
|
keyboardInset
|
|
@@ -10214,8 +10214,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10214
10214
|
return;
|
|
10215
10215
|
}
|
|
10216
10216
|
const update = () => {
|
|
10217
|
-
const metrics =
|
|
10218
|
-
const inset = metrics ?
|
|
10217
|
+
const metrics = chunkEFSQW6S5_js.readViewportMetrics(window);
|
|
10218
|
+
const inset = metrics ? chunkEFSQW6S5_js.computeKeyboardInset(metrics) : 0;
|
|
10219
10219
|
setKeyboardInset(inset);
|
|
10220
10220
|
if (inset > 0) {
|
|
10221
10221
|
window.requestAnimationFrame(() => scrollFocusedIntoView(inset));
|
|
@@ -10226,8 +10226,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10226
10226
|
vv.addEventListener("scroll", update);
|
|
10227
10227
|
const onFocusIn = () => {
|
|
10228
10228
|
window.requestAnimationFrame(() => {
|
|
10229
|
-
const metrics =
|
|
10230
|
-
const inset = metrics ?
|
|
10229
|
+
const metrics = chunkEFSQW6S5_js.readViewportMetrics(window);
|
|
10230
|
+
const inset = metrics ? chunkEFSQW6S5_js.computeKeyboardInset(metrics) : 0;
|
|
10231
10231
|
if (inset > 0) {
|
|
10232
10232
|
scrollFocusedIntoView(inset);
|
|
10233
10233
|
}
|
|
@@ -10240,7 +10240,7 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10240
10240
|
document.removeEventListener("focusin", onFocusIn);
|
|
10241
10241
|
};
|
|
10242
10242
|
}, [enabled]);
|
|
10243
|
-
return { keyboardInset, isKeyboardOpen:
|
|
10243
|
+
return { keyboardInset, isKeyboardOpen: chunkEFSQW6S5_js.isKeyboardOpen(keyboardInset) };
|
|
10244
10244
|
}
|
|
10245
10245
|
|
|
10246
10246
|
// src/viewer/hooks/useViewerBuildingBlocks-canvas-props.ts
|
|
@@ -10267,7 +10267,7 @@ function buildCanvasProps(input) {
|
|
|
10267
10267
|
} = input;
|
|
10268
10268
|
const effectiveSlide = mode === "master" ? masterPseudoSlide : activeSlide;
|
|
10269
10269
|
const effectiveTemplateElements = mode === "master" ? s.activeLayout ? s.activeMaster?.elements ?? [] : [] : templateElements;
|
|
10270
|
-
const fieldContext =
|
|
10270
|
+
const fieldContext = chunkEFSQW6S5_js.buildFieldSubstitutionContext({
|
|
10271
10271
|
headerFooter: s.headerFooter,
|
|
10272
10272
|
customProperties: s.customProperties,
|
|
10273
10273
|
slide: activeSlide
|
|
@@ -10277,13 +10277,13 @@ function buildCanvasProps(input) {
|
|
|
10277
10277
|
if (mode === "present") {
|
|
10278
10278
|
presentation.handlePresentationAction(action);
|
|
10279
10279
|
} else if (action.url) {
|
|
10280
|
-
|
|
10280
|
+
chunkEFSQW6S5_js.safeOpenUrl(action.url);
|
|
10281
10281
|
}
|
|
10282
10282
|
};
|
|
10283
10283
|
const handleHyperlinkClick = (url) => {
|
|
10284
|
-
if (
|
|
10284
|
+
if (chunkEFSQW6S5_js.isPpactionUrl(url)) {
|
|
10285
10285
|
if (mode === "present") {
|
|
10286
|
-
const parsed =
|
|
10286
|
+
const parsed = chunkEFSQW6S5_js.parsePpactionUrl(url);
|
|
10287
10287
|
if (parsed) {
|
|
10288
10288
|
presentation.handlePresentationAction({
|
|
10289
10289
|
action: parsed.action,
|
|
@@ -10293,7 +10293,7 @@ function buildCanvasProps(input) {
|
|
|
10293
10293
|
}
|
|
10294
10294
|
return;
|
|
10295
10295
|
}
|
|
10296
|
-
|
|
10296
|
+
chunkEFSQW6S5_js.safeOpenUrl(url);
|
|
10297
10297
|
};
|
|
10298
10298
|
return {
|
|
10299
10299
|
activeSlide: effectiveSlide,
|
|
@@ -10436,7 +10436,7 @@ function buildToolbarAnimationHandlers(input) {
|
|
|
10436
10436
|
const current = activeSlide.animations ?? [];
|
|
10437
10437
|
if (group === "motionPath") {
|
|
10438
10438
|
propertyHandlers.handleUpdateSlide({
|
|
10439
|
-
animations:
|
|
10439
|
+
animations: chunkEFSQW6S5_js.applyMotionPathPreset(current, selectedElement.id, preset)
|
|
10440
10440
|
});
|
|
10441
10441
|
return;
|
|
10442
10442
|
}
|
|
@@ -10630,7 +10630,7 @@ function buildToolbarProps(input) {
|
|
|
10630
10630
|
onOpenFile,
|
|
10631
10631
|
onOpenRecentFile,
|
|
10632
10632
|
onCreatePresentation: (templateId) => {
|
|
10633
|
-
s.setSlides(
|
|
10633
|
+
s.setSlides(chunkEFSQW6S5_js.createBackstagePresentation(templateId));
|
|
10634
10634
|
s.setActiveSlideIndex(0);
|
|
10635
10635
|
s.setSelectedElementId(null);
|
|
10636
10636
|
s.setSelectedElementIds([]);
|
|
@@ -10687,7 +10687,7 @@ function buildToolbarProps(input) {
|
|
|
10687
10687
|
isCommentsPanelOpen: s.isInspectorPaneOpen,
|
|
10688
10688
|
slideCommentCount: activeSlide?.comments?.length ?? 0,
|
|
10689
10689
|
formatPainterActive: s.formatPainterActive,
|
|
10690
|
-
canActivateFormatPainter:
|
|
10690
|
+
canActivateFormatPainter: chunkEFSQW6S5_js.hasCopyableFormat(selectedElement),
|
|
10691
10691
|
onToggleFormatPainter: () => s.setFormatPainterActive((p) => !p),
|
|
10692
10692
|
isSelectionPaneOpen: s.isSelectionPaneOpen,
|
|
10693
10693
|
onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
|
|
@@ -10956,7 +10956,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
10956
10956
|
}, [incomingContent]);
|
|
10957
10957
|
const onOpenFile = react.useCallback(() => {
|
|
10958
10958
|
void (async () => {
|
|
10959
|
-
const picked = await
|
|
10959
|
+
const picked = await chunkEFSQW6S5_js.openPptxFile();
|
|
10960
10960
|
if (picked) {
|
|
10961
10961
|
setContent(picked.buffer);
|
|
10962
10962
|
}
|
|
@@ -10964,7 +10964,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
10964
10964
|
}, []);
|
|
10965
10965
|
const onOpenRecentFile = react.useCallback((key) => {
|
|
10966
10966
|
void (async () => {
|
|
10967
|
-
const bytes = await
|
|
10967
|
+
const bytes = await chunkEFSQW6S5_js.readBackstageRecentFile(key);
|
|
10968
10968
|
if (bytes) {
|
|
10969
10969
|
setContent(bytes);
|
|
10970
10970
|
}
|