pptx-react-viewer 2.9.0 → 2.10.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-6W6ZBAGU.mjs → AiChatPanel-35CHYS5N.mjs} +4 -4
- package/dist/AiChatPanel-35CHYS5N.mjs.br +0 -0
- package/dist/AiChatPanel-35CHYS5N.mjs.gz +0 -0
- package/dist/{AiChatPanel-MALC32TM.js → AiChatPanel-KTMWRUD5.js} +23 -23
- package/dist/AiChatPanel-KTMWRUD5.js.br +0 -0
- package/dist/AiChatPanel-KTMWRUD5.js.gz +0 -0
- package/dist/{Model3DScene-57HZ4NVD.mjs → Model3DScene-2VMN3B65.mjs} +1 -1
- package/dist/Model3DScene-2VMN3B65.mjs.br +0 -0
- package/dist/Model3DScene-2VMN3B65.mjs.gz +0 -0
- package/dist/{Model3DScene-76R2YXSO.js → Model3DScene-TMNUKCL6.js} +2 -2
- package/dist/Model3DScene-TMNUKCL6.js.br +0 -0
- package/dist/Model3DScene-TMNUKCL6.js.gz +0 -0
- package/dist/{SurfaceChart3DScene-JGOQNHSU.mjs → SurfaceChart3DScene-GKRDDN2U.mjs} +1 -1
- package/dist/{SurfaceChart3DScene-JGOQNHSU.mjs.br → SurfaceChart3DScene-GKRDDN2U.mjs.br} +0 -0
- package/dist/SurfaceChart3DScene-GKRDDN2U.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-2QZZTBV4.js → SurfaceChart3DScene-KPNP3QD5.js} +2 -2
- package/dist/SurfaceChart3DScene-KPNP3QD5.js.br +0 -0
- package/dist/SurfaceChart3DScene-KPNP3QD5.js.gz +0 -0
- package/dist/{chunk-D6SHCB4V.js → chunk-A7HLINZU.js} +328 -324
- package/dist/chunk-A7HLINZU.js.br +0 -0
- package/dist/chunk-A7HLINZU.js.gz +0 -0
- package/dist/{chunk-JPTO6P5K.mjs → chunk-FY2AFXKP.mjs} +8 -47
- package/dist/chunk-FY2AFXKP.mjs.br +0 -0
- package/dist/chunk-FY2AFXKP.mjs.gz +0 -0
- package/dist/{chunk-IKISUZKE.js → chunk-H74UXL4Q.js} +340 -17
- package/dist/chunk-H74UXL4Q.js.br +0 -0
- package/dist/{chunk-IKISUZKE.js.gz → chunk-H74UXL4Q.js.gz} +0 -0
- package/dist/{chunk-34BUZNKO.js → chunk-IJVDNQLG.js} +252 -291
- package/dist/chunk-IJVDNQLG.js.br +0 -0
- package/dist/chunk-IJVDNQLG.js.gz +0 -0
- package/dist/{chunk-6UXRNLHD.js → chunk-JWMXOYSX.js} +1330 -968
- package/dist/chunk-JWMXOYSX.js.br +0 -0
- package/dist/chunk-JWMXOYSX.js.gz +0 -0
- package/dist/{chunk-NQLVK23T.mjs → chunk-LCG7WBAG.mjs} +403 -41
- package/dist/chunk-LCG7WBAG.mjs.br +0 -0
- package/dist/chunk-LCG7WBAG.mjs.gz +0 -0
- package/dist/{chunk-6OLS3EJW.mjs → chunk-LXTKPSIG.mjs} +1 -1
- package/dist/chunk-LXTKPSIG.mjs.br +0 -0
- package/dist/chunk-LXTKPSIG.mjs.gz +0 -0
- package/dist/{chunk-2JDWFMIK.js → chunk-MMK4K3QI.js} +1 -0
- package/dist/chunk-MMK4K3QI.js.br +0 -0
- package/dist/{chunk-2JDWFMIK.js.gz → chunk-MMK4K3QI.js.gz} +0 -0
- package/dist/{chunk-4FO4JMTN.mjs → chunk-OHPF2HTP.mjs} +7 -3
- package/dist/chunk-OHPF2HTP.mjs.br +0 -0
- package/dist/chunk-OHPF2HTP.mjs.gz +0 -0
- package/dist/{chunk-CD434OFE.mjs → chunk-SL3XPERE.mjs} +1 -0
- package/dist/chunk-SL3XPERE.mjs.br +0 -0
- package/dist/{chunk-CD434OFE.mjs.gz → chunk-SL3XPERE.mjs.gz} +0 -0
- package/dist/{chunk-YEM2VOAP.js → chunk-SPJR6MPI.js} +3 -3
- package/dist/chunk-SPJR6MPI.js.br +0 -0
- package/dist/chunk-SPJR6MPI.js.gz +0 -0
- package/dist/{chunk-L47Y62L6.mjs → chunk-TJ55KUWH.mjs} +320 -17
- package/dist/chunk-TJ55KUWH.mjs.br +0 -0
- package/dist/{chunk-L47Y62L6.mjs.gz → chunk-TJ55KUWH.mjs.gz} +0 -0
- package/dist/i18n.js +4 -4
- package/dist/i18n.js.br +0 -0
- package/dist/i18n.js.gz +0 -0
- package/dist/i18n.mjs +1 -1
- package/dist/i18n.mjs.br +0 -0
- package/dist/i18n.mjs.gz +0 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +36 -36
- package/dist/index.js.br +0 -0
- package/dist/index.js.gz +0 -0
- package/dist/index.mjs +6 -6
- package/dist/index.mjs.br +0 -0
- package/dist/index.mjs.gz +0 -0
- package/dist/internals.d.ts +4 -0
- package/dist/internals.d.ts.map +1 -1
- package/dist/internals.js +79 -79
- package/dist/internals.js.br +0 -0
- package/dist/internals.js.gz +0 -0
- package/dist/internals.mjs +4 -4
- package/dist/internals.mjs.br +0 -0
- package/dist/internals.mjs.gz +0 -0
- package/dist/pptx-viewer.css +1 -1
- package/dist/pptx-viewer.css.br +0 -0
- package/dist/pptx-viewer.css.gz +0 -0
- package/dist/{useViewerBuildingBlocks-C59NY1qZ.d.ts → useViewerBuildingBlocks-CpUwhBD5.d.ts} +3 -1
- package/dist/useViewerBuildingBlocks-CpUwhBD5.d.ts.map +1 -0
- package/dist/viewer/index.js +22 -22
- package/dist/viewer/index.js.br +0 -0
- package/dist/viewer/index.js.gz +0 -0
- package/dist/viewer/index.mjs +6 -6
- package/dist/viewer/index.mjs.br +0 -0
- package/dist/viewer/index.mjs.gz +0 -0
- package/package.json +1 -1
- package/dist/AiChatPanel-6W6ZBAGU.mjs.br +0 -0
- package/dist/AiChatPanel-6W6ZBAGU.mjs.gz +0 -0
- package/dist/AiChatPanel-MALC32TM.js.br +0 -0
- package/dist/AiChatPanel-MALC32TM.js.gz +0 -0
- package/dist/Model3DScene-57HZ4NVD.mjs.br +0 -0
- package/dist/Model3DScene-57HZ4NVD.mjs.gz +0 -0
- package/dist/Model3DScene-76R2YXSO.js.br +0 -0
- package/dist/Model3DScene-76R2YXSO.js.gz +0 -0
- package/dist/SurfaceChart3DScene-2QZZTBV4.js.br +0 -0
- package/dist/SurfaceChart3DScene-2QZZTBV4.js.gz +0 -0
- package/dist/SurfaceChart3DScene-JGOQNHSU.mjs.gz +0 -0
- package/dist/chunk-2JDWFMIK.js.br +0 -0
- package/dist/chunk-34BUZNKO.js.br +0 -0
- package/dist/chunk-34BUZNKO.js.gz +0 -0
- package/dist/chunk-4FO4JMTN.mjs.br +0 -0
- package/dist/chunk-4FO4JMTN.mjs.gz +0 -0
- package/dist/chunk-6OLS3EJW.mjs.br +0 -0
- package/dist/chunk-6OLS3EJW.mjs.gz +0 -0
- package/dist/chunk-6UXRNLHD.js.br +0 -0
- package/dist/chunk-6UXRNLHD.js.gz +0 -0
- package/dist/chunk-CD434OFE.mjs.br +0 -0
- package/dist/chunk-D6SHCB4V.js.br +0 -0
- package/dist/chunk-D6SHCB4V.js.gz +0 -0
- package/dist/chunk-IKISUZKE.js.br +0 -0
- package/dist/chunk-JPTO6P5K.mjs.br +0 -0
- package/dist/chunk-JPTO6P5K.mjs.gz +0 -0
- package/dist/chunk-L47Y62L6.mjs.br +0 -0
- package/dist/chunk-NQLVK23T.mjs.br +0 -0
- package/dist/chunk-NQLVK23T.mjs.gz +0 -0
- package/dist/chunk-YEM2VOAP.js.br +0 -0
- package/dist/chunk-YEM2VOAP.js.gz +0 -0
- package/dist/useViewerBuildingBlocks-C59NY1qZ.d.ts.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var chunkIJVDNQLG_js = require('./chunk-IJVDNQLG.js');
|
|
4
|
+
var chunkMMK4K3QI_js = require('./chunk-MMK4K3QI.js');
|
|
5
|
+
var chunkH74UXL4Q_js = require('./chunk-H74UXL4Q.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 = chunkH74UXL4Q_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 = chunkH74UXL4Q_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 >= chunkH74UXL4Q_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
|
+
}, chunkH74UXL4Q_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 = chunkH74UXL4Q_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 = chunkH74UXL4Q_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
|
+
chunkH74UXL4Q_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 = chunkH74UXL4Q_js.validateRoomId(config.roomId);
|
|
243
243
|
const provider = new WebrtcProvider(roomId, yDoc, opts);
|
|
244
|
-
departureRef.current =
|
|
244
|
+
departureRef.current = chunkH74UXL4Q_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 = chunkH74UXL4Q_js.validateRoomId(config.roomId);
|
|
287
|
+
const transport = config.transport ?? chunkH74UXL4Q_js.resolveTransportForServerUrl(config.serverUrl);
|
|
288
288
|
if (transport === "webrtc") {
|
|
289
289
|
await initWebrtc();
|
|
290
290
|
return;
|
|
291
291
|
}
|
|
292
|
-
if (
|
|
292
|
+
if (chunkH74UXL4Q_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 = chunkH74UXL4Q_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
|
+
chunkH74UXL4Q_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
|
+
}, chunkH74UXL4Q_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
|
+
chunkH74UXL4Q_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 = chunkH74UXL4Q_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 = chunkH74UXL4Q_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(chunkH74UXL4Q_js.cloneSlide),
|
|
521
|
+
templateElementsBySlideId: chunkH74UXL4Q_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(chunkH74UXL4Q_js.cloneSlide));
|
|
535
535
|
setTemplateElementsBySlideId(
|
|
536
|
-
|
|
536
|
+
chunkH74UXL4Q_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 = chunkIJVDNQLG_js.cloneHistorySnapshot(previousSnapshot);
|
|
571
|
+
lastHistorySnapshotRef.current = chunkIJVDNQLG_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 = chunkIJVDNQLG_js.cloneHistorySnapshot(nextSnapshot);
|
|
593
|
+
lastHistorySnapshotRef.current = chunkIJVDNQLG_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 = chunkIJVDNQLG_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 = chunkIJVDNQLG_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(chunkIJVDNQLG_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 = chunkIJVDNQLG_js.cloneHistorySnapshot(snapshot);
|
|
664
664
|
lastHistorySerializedRef.current = serialized;
|
|
665
665
|
lastCheapHashRef.current = cheapHash;
|
|
666
666
|
updateHistoryAvailability();
|
|
@@ -749,7 +749,7 @@ function useZoomViewport({
|
|
|
749
749
|
if (!wrapper || !canvasViewport) {
|
|
750
750
|
return;
|
|
751
751
|
}
|
|
752
|
-
const boundedScale =
|
|
752
|
+
const boundedScale = chunkH74UXL4Q_js.clampZoomScale(nextScale);
|
|
753
753
|
const nextEditorScale = fitScale * boundedScale;
|
|
754
754
|
const centerX = (bounds.minX + bounds.maxX) / 2;
|
|
755
755
|
const centerY = (bounds.minY + bounds.maxY) / 2;
|
|
@@ -764,10 +764,10 @@ function useZoomViewport({
|
|
|
764
764
|
[fitScale]
|
|
765
765
|
);
|
|
766
766
|
const handleZoomIn = react.useCallback(() => {
|
|
767
|
-
setScale((currentScale) =>
|
|
767
|
+
setScale((currentScale) => chunkH74UXL4Q_js.zoomInScale(currentScale));
|
|
768
768
|
}, []);
|
|
769
769
|
const handleZoomOut = react.useCallback(() => {
|
|
770
|
-
setScale((currentScale) =>
|
|
770
|
+
setScale((currentScale) => chunkH74UXL4Q_js.zoomOutScale(currentScale));
|
|
771
771
|
}, []);
|
|
772
772
|
const handleResetZoom = react.useCallback(() => {
|
|
773
773
|
setScale(1);
|
|
@@ -786,29 +786,29 @@ function useZoomViewport({
|
|
|
786
786
|
selectedElements.forEach((element) => {
|
|
787
787
|
minX = Math.min(minX, element.x);
|
|
788
788
|
minY = Math.min(minY, element.y);
|
|
789
|
-
maxX = Math.max(maxX, element.x + Math.max(element.width,
|
|
790
|
-
maxY = Math.max(maxY, element.y + Math.max(element.height,
|
|
789
|
+
maxX = Math.max(maxX, element.x + Math.max(element.width, chunkIJVDNQLG_js.MIN_ELEMENT_SIZE));
|
|
790
|
+
maxY = Math.max(maxY, element.y + Math.max(element.height, chunkIJVDNQLG_js.MIN_ELEMENT_SIZE));
|
|
791
791
|
});
|
|
792
792
|
if (!Number.isFinite(minX) || !Number.isFinite(minY) || !Number.isFinite(maxX) || !Number.isFinite(maxY)) {
|
|
793
793
|
return;
|
|
794
794
|
}
|
|
795
795
|
const selectionBounds = { minX, minY, maxX, maxY };
|
|
796
|
-
const boundsWidth = Math.max(selectionBounds.maxX - selectionBounds.minX,
|
|
797
|
-
const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY,
|
|
796
|
+
const boundsWidth = Math.max(selectionBounds.maxX - selectionBounds.minX, chunkIJVDNQLG_js.MIN_ELEMENT_SIZE);
|
|
797
|
+
const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY, chunkIJVDNQLG_js.MIN_ELEMENT_SIZE);
|
|
798
798
|
const availableWidth = Math.max(
|
|
799
|
-
effectiveEditorDimensions.width -
|
|
800
|
-
|
|
799
|
+
effectiveEditorDimensions.width - chunkIJVDNQLG_js.ZOOM_TO_SELECTION_PADDING,
|
|
800
|
+
chunkIJVDNQLG_js.MIN_ELEMENT_SIZE
|
|
801
801
|
);
|
|
802
802
|
const availableHeight = Math.max(
|
|
803
|
-
effectiveEditorDimensions.height -
|
|
804
|
-
|
|
803
|
+
effectiveEditorDimensions.height - chunkIJVDNQLG_js.ZOOM_TO_SELECTION_PADDING,
|
|
804
|
+
chunkIJVDNQLG_js.MIN_ELEMENT_SIZE
|
|
805
805
|
);
|
|
806
806
|
const targetEditorScale = Math.min(
|
|
807
807
|
availableWidth / boundsWidth,
|
|
808
808
|
availableHeight / boundsHeight
|
|
809
809
|
);
|
|
810
810
|
const safeFitScale = fitScale > Number.EPSILON ? fitScale : Number.EPSILON;
|
|
811
|
-
const nextScale =
|
|
811
|
+
const nextScale = chunkH74UXL4Q_js.clampZoomScale(targetEditorScale / safeFitScale);
|
|
812
812
|
setScale(nextScale);
|
|
813
813
|
window.requestAnimationFrame(() => {
|
|
814
814
|
window.requestAnimationFrame(() => {
|
|
@@ -828,7 +828,7 @@ function useZoomViewport({
|
|
|
828
828
|
}
|
|
829
829
|
event.preventDefault();
|
|
830
830
|
const delta = event.deltaY * -1e-3;
|
|
831
|
-
setScale((currentScale) =>
|
|
831
|
+
setScale((currentScale) => chunkH74UXL4Q_js.clampZoomScale(currentScale + delta));
|
|
832
832
|
}, []);
|
|
833
833
|
react.useEffect(() => {
|
|
834
834
|
const viewport = canvasViewportRef.current;
|
|
@@ -905,7 +905,7 @@ function applyAnimationGroupSteps(group, onPlayActionSound, setPresentationEleme
|
|
|
905
905
|
const command = step.command;
|
|
906
906
|
const timer = window.setTimeout(
|
|
907
907
|
() => {
|
|
908
|
-
|
|
908
|
+
chunkIJVDNQLG_js.executeMediaCommand(command);
|
|
909
909
|
},
|
|
910
910
|
Math.max(0, step.delayMs)
|
|
911
911
|
);
|
|
@@ -1021,7 +1021,7 @@ function useAnimationPlayback(input) {
|
|
|
1021
1021
|
(controller, group) => {
|
|
1022
1022
|
driveBuildReveal(
|
|
1023
1023
|
controller,
|
|
1024
|
-
|
|
1024
|
+
chunkH74UXL4Q_js.PresentationAnimationController.collectBuildStepIds(group),
|
|
1025
1025
|
setPresentationElementStates,
|
|
1026
1026
|
buildRafRef
|
|
1027
1027
|
);
|
|
@@ -1084,7 +1084,7 @@ function useAnimationPlayback(input) {
|
|
|
1084
1084
|
setHoverTriggerShapeIds(/* @__PURE__ */ new Set());
|
|
1085
1085
|
return;
|
|
1086
1086
|
}
|
|
1087
|
-
const controller =
|
|
1087
|
+
const controller = chunkH74UXL4Q_js.PresentationAnimationController.fromSlide(slide);
|
|
1088
1088
|
controllerRef.current = controller;
|
|
1089
1089
|
setPresentationKeyframesCss(controller.keyframesCss);
|
|
1090
1090
|
setInteractiveTriggerShapeIds(controller.interactiveTriggerShapeIds);
|
|
@@ -1232,7 +1232,7 @@ function useAnimationPlayback(input) {
|
|
|
1232
1232
|
}))
|
|
1233
1233
|
);
|
|
1234
1234
|
entranceAnimations.forEach((animation, animationIndex) => {
|
|
1235
|
-
const delay =
|
|
1235
|
+
const delay = chunkH74UXL4Q_js.computeEntranceAnimationDelay(animation.delayMs, animationIndex);
|
|
1236
1236
|
const timer = window.setTimeout(() => {
|
|
1237
1237
|
setPresentationAnimations(
|
|
1238
1238
|
(previousAnimations) => previousAnimations.map(
|
|
@@ -1269,12 +1269,12 @@ function useAnimationPlayback(input) {
|
|
|
1269
1269
|
presentationTimersRef
|
|
1270
1270
|
};
|
|
1271
1271
|
}
|
|
1272
|
-
var PRESENTER_CHANNEL_NAME =
|
|
1273
|
-
var AUDIENCE_HASH =
|
|
1274
|
-
var PRESENTER_MSG_ORIGIN =
|
|
1275
|
-
var AUDIENCE_NONCE_KEY =
|
|
1272
|
+
var PRESENTER_CHANNEL_NAME = chunkH74UXL4Q_js.PRESENTATION_CHANNEL_NAME;
|
|
1273
|
+
var AUDIENCE_HASH = chunkH74UXL4Q_js.PRESENTATION_HASH;
|
|
1274
|
+
var PRESENTER_MSG_ORIGIN = chunkH74UXL4Q_js.PRESENTATION_MESSAGE_ORIGIN;
|
|
1275
|
+
var AUDIENCE_NONCE_KEY = chunkH74UXL4Q_js.PRESENTATION_NONCE_KEY;
|
|
1276
1276
|
function generateSessionId() {
|
|
1277
|
-
return
|
|
1277
|
+
return chunkH74UXL4Q_js.createPresentationSessionId();
|
|
1278
1278
|
}
|
|
1279
1279
|
function parseAudienceNonce() {
|
|
1280
1280
|
const hash = window.location.hash;
|
|
@@ -1310,7 +1310,7 @@ function usePresenterWindow(input) {
|
|
|
1310
1310
|
}, []);
|
|
1311
1311
|
const swapDisplays = react.useCallback(async () => {
|
|
1312
1312
|
const audience = audienceWindowRef.current;
|
|
1313
|
-
return audience && !audience.closed ?
|
|
1313
|
+
return audience && !audience.closed ? chunkH74UXL4Q_js.swapPresentationWindows(window, audience) : false;
|
|
1314
1314
|
}, []);
|
|
1315
1315
|
const syncSlideToAudience = react.useCallback(
|
|
1316
1316
|
(slideIndex) => {
|
|
@@ -1374,7 +1374,7 @@ function usePresenterWindow(input) {
|
|
|
1374
1374
|
pollTimerRef.current = null;
|
|
1375
1375
|
}
|
|
1376
1376
|
if (closingSessionId) {
|
|
1377
|
-
void
|
|
1377
|
+
void chunkH74UXL4Q_js.clearAudienceContent(closingSessionId);
|
|
1378
1378
|
}
|
|
1379
1379
|
}, [getChannel]);
|
|
1380
1380
|
const openAudienceWindow = react.useCallback(() => {
|
|
@@ -1392,10 +1392,10 @@ function usePresenterWindow(input) {
|
|
|
1392
1392
|
audienceWindowRef.current = blankWin;
|
|
1393
1393
|
const sessionId = generateSessionId();
|
|
1394
1394
|
sessionIdRef.current = sessionId;
|
|
1395
|
-
const audienceUrl =
|
|
1396
|
-
void
|
|
1395
|
+
const audienceUrl = chunkH74UXL4Q_js.buildPresentationAudienceUrl(window.location.href, sessionId);
|
|
1396
|
+
void chunkH74UXL4Q_js.resolveAudienceScreenPlacement(window).then((placement) => {
|
|
1397
1397
|
if (placement && audienceWindowRef.current === blankWin && !blankWin.closed) {
|
|
1398
|
-
|
|
1398
|
+
chunkH74UXL4Q_js.placeAudienceWindow(blankWin, placement);
|
|
1399
1399
|
}
|
|
1400
1400
|
return void 0;
|
|
1401
1401
|
});
|
|
@@ -1425,7 +1425,7 @@ function usePresenterWindow(input) {
|
|
|
1425
1425
|
}
|
|
1426
1426
|
};
|
|
1427
1427
|
if (content) {
|
|
1428
|
-
void
|
|
1428
|
+
void chunkH74UXL4Q_js.storeAudienceContent(content, sessionId).then(() => navigateOrClose(true)).catch(() => navigateOrClose(false));
|
|
1429
1429
|
} else {
|
|
1430
1430
|
navigateOrClose(true);
|
|
1431
1431
|
}
|
|
@@ -1451,7 +1451,7 @@ function usePresenterWindow(input) {
|
|
|
1451
1451
|
}
|
|
1452
1452
|
const handleMessage = (event) => {
|
|
1453
1453
|
const message = event.data;
|
|
1454
|
-
if (
|
|
1454
|
+
if (chunkH74UXL4Q_js.isPresentationSessionMessage(message) && message.type === "audience-ready" && message.sessionId === sessionIdRef.current) {
|
|
1455
1455
|
syncStateToAudience(snapshotRef.current);
|
|
1456
1456
|
}
|
|
1457
1457
|
};
|
|
@@ -1480,7 +1480,7 @@ function usePresenterWindow(input) {
|
|
|
1480
1480
|
react.useEffect(() => {
|
|
1481
1481
|
const handleBeforeUnload = () => {
|
|
1482
1482
|
if (sessionIdRef.current) {
|
|
1483
|
-
void
|
|
1483
|
+
void chunkH74UXL4Q_js.clearAudienceContent(sessionIdRef.current);
|
|
1484
1484
|
}
|
|
1485
1485
|
};
|
|
1486
1486
|
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
@@ -1542,7 +1542,7 @@ function useAudienceMode(input) {
|
|
|
1542
1542
|
}
|
|
1543
1543
|
channel.onmessage = (event) => {
|
|
1544
1544
|
const data = event.data;
|
|
1545
|
-
if (!
|
|
1545
|
+
if (!chunkH74UXL4Q_js.isPresentationSessionMessage(data) || data.origin !== PRESENTER_MSG_ORIGIN) {
|
|
1546
1546
|
return;
|
|
1547
1547
|
}
|
|
1548
1548
|
if (expectedSessionId && data.sessionId !== expectedSessionId) {
|
|
@@ -1558,16 +1558,16 @@ function useAudienceMode(input) {
|
|
|
1558
1558
|
}
|
|
1559
1559
|
if (data.type === "presenter-exit") {
|
|
1560
1560
|
if (expectedSessionId) {
|
|
1561
|
-
void
|
|
1561
|
+
void chunkH74UXL4Q_js.clearAudienceContent(expectedSessionId);
|
|
1562
1562
|
}
|
|
1563
|
-
if (
|
|
1563
|
+
if (chunkH74UXL4Q_js.endAudienceDisplay(window)) {
|
|
1564
1564
|
handlers.onPresenterEnded?.();
|
|
1565
1565
|
}
|
|
1566
1566
|
}
|
|
1567
1567
|
};
|
|
1568
1568
|
if (expectedSessionId) {
|
|
1569
1569
|
channel.postMessage({
|
|
1570
|
-
origin:
|
|
1570
|
+
origin: chunkH74UXL4Q_js.PRESENTATION_MESSAGE_ORIGIN,
|
|
1571
1571
|
type: "audience-ready",
|
|
1572
1572
|
sessionId: expectedSessionId
|
|
1573
1573
|
});
|
|
@@ -1599,14 +1599,14 @@ function usePresentationKeyboard(input) {
|
|
|
1599
1599
|
presentationSlideIndex,
|
|
1600
1600
|
setShowRehearsalSummary
|
|
1601
1601
|
} = input;
|
|
1602
|
-
const keyBufferRef = react.useRef(
|
|
1602
|
+
const keyBufferRef = react.useRef(chunkH74UXL4Q_js.createPresentationKeyBuffer());
|
|
1603
1603
|
react.useEffect(() => {
|
|
1604
|
-
if (mode !== "present" || !
|
|
1605
|
-
keyBufferRef.current =
|
|
1604
|
+
if (mode !== "present" || !chunkH74UXL4Q_js.acceptsPresentationInput()) {
|
|
1605
|
+
keyBufferRef.current = chunkH74UXL4Q_js.createPresentationKeyBuffer();
|
|
1606
1606
|
return;
|
|
1607
1607
|
}
|
|
1608
1608
|
const handleKeyDown = (event) => {
|
|
1609
|
-
const mapped =
|
|
1609
|
+
const mapped = chunkH74UXL4Q_js.mapPresentationKey(event, keyBufferRef.current);
|
|
1610
1610
|
if (mapped.action === "none") {
|
|
1611
1611
|
return;
|
|
1612
1612
|
}
|
|
@@ -1814,7 +1814,7 @@ function handlePresentationActionImpl(action, deps) {
|
|
|
1814
1814
|
return;
|
|
1815
1815
|
}
|
|
1816
1816
|
if (action.url && !actionStr.includes("hlinksldjump")) {
|
|
1817
|
-
if (
|
|
1817
|
+
if (chunkH74UXL4Q_js.isUrlSafe(action.url)) {
|
|
1818
1818
|
window.open(action.url, "_blank", "noopener,noreferrer");
|
|
1819
1819
|
}
|
|
1820
1820
|
}
|
|
@@ -1824,7 +1824,7 @@ function handlePresentationActionImpl(action, deps) {
|
|
|
1824
1824
|
function executeSlideTransition(nextSlideIndex, deps) {
|
|
1825
1825
|
const incomingSlide = deps.slides[nextSlideIndex];
|
|
1826
1826
|
const transition = incomingSlide?.transition;
|
|
1827
|
-
const durationMs = deps.playTransition ?
|
|
1827
|
+
const durationMs = deps.playTransition ? chunkH74UXL4Q_js.resolveTransitionDurationMs(transition) : 0;
|
|
1828
1828
|
deps.clearPresentationTimers();
|
|
1829
1829
|
deps.setPresentationSlideIndex(nextSlideIndex);
|
|
1830
1830
|
deps.onSetActiveSlideIndex(nextSlideIndex);
|
|
@@ -1883,7 +1883,7 @@ function useSlideNavigation(input) {
|
|
|
1883
1883
|
});
|
|
1884
1884
|
const scheduleAutoAdvanceForSlide = react.useCallback(
|
|
1885
1885
|
(slideIndex) => {
|
|
1886
|
-
const delayMs =
|
|
1886
|
+
const delayMs = chunkH74UXL4Q_js.resolveAutoAdvanceDelayMs(slides[slideIndex], { useTimings });
|
|
1887
1887
|
if (delayMs === void 0) {
|
|
1888
1888
|
return;
|
|
1889
1889
|
}
|
|
@@ -2073,17 +2073,17 @@ function useZoomNavigation(input) {
|
|
|
2073
2073
|
};
|
|
2074
2074
|
}
|
|
2075
2075
|
function usePresenterConsole(slideIndex) {
|
|
2076
|
-
const timerRef = react.useRef(
|
|
2077
|
-
const [snapshot, setSnapshot] = react.useState(() =>
|
|
2076
|
+
const timerRef = react.useRef(chunkH74UXL4Q_js.createPresenterTimer());
|
|
2077
|
+
const [snapshot, setSnapshot] = react.useState(() => chunkH74UXL4Q_js.createInitialPresentationSnapshot(slideIndex));
|
|
2078
2078
|
const patch = react.useCallback((value) => {
|
|
2079
|
-
setSnapshot((current) =>
|
|
2079
|
+
setSnapshot((current) => chunkH74UXL4Q_js.mergePresentationSnapshot(current, value));
|
|
2080
2080
|
}, []);
|
|
2081
2081
|
react.useEffect(() => patch({ slideIndex }), [patch, slideIndex]);
|
|
2082
2082
|
react.useEffect(() => {
|
|
2083
2083
|
const timer = window.setInterval(() => {
|
|
2084
2084
|
patch({
|
|
2085
2085
|
paused: timerRef.current.paused,
|
|
2086
|
-
elapsedMs:
|
|
2086
|
+
elapsedMs: chunkH74UXL4Q_js.presenterElapsed(timerRef.current)
|
|
2087
2087
|
});
|
|
2088
2088
|
}, 1e3);
|
|
2089
2089
|
return () => window.clearInterval(timer);
|
|
@@ -2093,19 +2093,19 @@ function usePresenterConsole(slideIndex) {
|
|
|
2093
2093
|
applyAudienceSnapshot: setSnapshot,
|
|
2094
2094
|
setBlackout: (blackout) => patch({ blackout }),
|
|
2095
2095
|
toggleTimer: () => {
|
|
2096
|
-
timerRef.current =
|
|
2096
|
+
timerRef.current = chunkH74UXL4Q_js.togglePresenterTimer(timerRef.current);
|
|
2097
2097
|
patch({
|
|
2098
2098
|
paused: timerRef.current.paused,
|
|
2099
|
-
elapsedMs:
|
|
2099
|
+
elapsedMs: chunkH74UXL4Q_js.presenterElapsed(timerRef.current)
|
|
2100
2100
|
});
|
|
2101
2101
|
},
|
|
2102
2102
|
resetTimer: () => {
|
|
2103
|
-
timerRef.current =
|
|
2103
|
+
timerRef.current = chunkH74UXL4Q_js.resetPresenterTimer();
|
|
2104
2104
|
patch({ paused: false, elapsedMs: 0 });
|
|
2105
2105
|
},
|
|
2106
2106
|
stepZoom: (direction) => setSnapshot(
|
|
2107
|
-
(current) =>
|
|
2108
|
-
zoom:
|
|
2107
|
+
(current) => chunkH74UXL4Q_js.mergePresentationSnapshot(current, {
|
|
2108
|
+
zoom: chunkH74UXL4Q_js.stepPresenterZoom(
|
|
2109
2109
|
current.zoom ?? { scale: 1, originX: 0.5, originY: 0.5 },
|
|
2110
2110
|
direction
|
|
2111
2111
|
)
|
|
@@ -2226,7 +2226,7 @@ function usePresentationMode(input) {
|
|
|
2226
2226
|
});
|
|
2227
2227
|
const movePresentationSlide = react.useCallback(
|
|
2228
2228
|
(direction, trigger = "explicit") => {
|
|
2229
|
-
if (!
|
|
2229
|
+
if (!chunkH74UXL4Q_js.acceptsPresentationInput()) {
|
|
2230
2230
|
return;
|
|
2231
2231
|
}
|
|
2232
2232
|
if (endOfShowVisible) {
|
|
@@ -2428,11 +2428,11 @@ function usePresentationMode(input) {
|
|
|
2428
2428
|
if (!transitionOverlay || transitionOverlay.transition.type !== "morph") {
|
|
2429
2429
|
return void 0;
|
|
2430
2430
|
}
|
|
2431
|
-
return
|
|
2431
|
+
return chunkH74UXL4Q_js.buildMorphTransitionPlan(
|
|
2432
2432
|
slides[transitionOverlay.outgoingSlideIndex],
|
|
2433
2433
|
slides[transitionOverlay.incomingSlideIndex],
|
|
2434
2434
|
transitionOverlay.durationMs,
|
|
2435
|
-
|
|
2435
|
+
chunkH74UXL4Q_js.morphOptionToMode(transitionOverlay.transition.morphOption)
|
|
2436
2436
|
);
|
|
2437
2437
|
}, [transitionOverlay, slides]);
|
|
2438
2438
|
const morphedElementStates = react.useMemo(() => {
|
|
@@ -2738,7 +2738,7 @@ function findInSlides(slides, findQuery, findMatchCase) {
|
|
|
2738
2738
|
const normalised = findMatchCase ? findQuery : findQuery.toLowerCase();
|
|
2739
2739
|
slides.forEach((slide, slideIndex) => {
|
|
2740
2740
|
for (const element of slide.elements || []) {
|
|
2741
|
-
if (!
|
|
2741
|
+
if (!chunkH74UXL4Q_js.hasTextProperties(element)) {
|
|
2742
2742
|
continue;
|
|
2743
2743
|
}
|
|
2744
2744
|
const segments = element.textSegments ?? [];
|
|
@@ -2789,7 +2789,7 @@ function applyFindReplacements(slides, toReplace, replaceQuery) {
|
|
|
2789
2789
|
continue;
|
|
2790
2790
|
}
|
|
2791
2791
|
const element = slide.elements[elIdx];
|
|
2792
|
-
if (!
|
|
2792
|
+
if (!chunkH74UXL4Q_js.hasTextProperties(element)) {
|
|
2793
2793
|
continue;
|
|
2794
2794
|
}
|
|
2795
2795
|
const segments = [...element.textSegments ?? []];
|
|
@@ -3387,7 +3387,7 @@ function useViewerCoreState(_input) {
|
|
|
3387
3387
|
const shapeAdjustmentDragStateRef = react.useRef(null);
|
|
3388
3388
|
const marqueeStateRef = react.useRef(null);
|
|
3389
3389
|
const isDrawingRef = react.useRef(false);
|
|
3390
|
-
const livePatcher = react.useMemo(() =>
|
|
3390
|
+
const livePatcher = react.useMemo(() => chunkH74UXL4Q_js.createCollaborationLivePatcher(), []);
|
|
3391
3391
|
react.useEffect(() => () => livePatcher.dispose(), [livePatcher]);
|
|
3392
3392
|
const slidesRef = react.useRef([]);
|
|
3393
3393
|
const [mode, setMode] = react.useState("edit");
|
|
@@ -3396,8 +3396,8 @@ function useViewerCoreState(_input) {
|
|
|
3396
3396
|
const [slides, setSlides] = react.useState([]);
|
|
3397
3397
|
const [templateElementsBySlideId, setTemplateElementsBySlideId] = react.useState({});
|
|
3398
3398
|
const [canvasSize, setCanvasSize] = react.useState({
|
|
3399
|
-
width:
|
|
3400
|
-
height:
|
|
3399
|
+
width: chunkIJVDNQLG_js.DEFAULT_CANVAS_WIDTH,
|
|
3400
|
+
height: chunkIJVDNQLG_js.DEFAULT_CANVAS_HEIGHT
|
|
3401
3401
|
});
|
|
3402
3402
|
const [activeSlideIndex, setActiveSlideIndex] = react.useState(0);
|
|
3403
3403
|
const [selectedElementId, setSelectedElementId] = react.useState(null);
|
|
@@ -3417,7 +3417,7 @@ function useViewerCoreState(_input) {
|
|
|
3417
3417
|
const resolved = typeof value === "function" ? value(inlineEditingTextRef.current) : value;
|
|
3418
3418
|
inlineEditingTextRef.current = resolved;
|
|
3419
3419
|
setInlineEditingTextBase(value);
|
|
3420
|
-
|
|
3420
|
+
chunkH74UXL4Q_js.publishLiveInlineText(
|
|
3421
3421
|
livePatcher,
|
|
3422
3422
|
slidesRef.current[activeSlideIndexRef.current],
|
|
3423
3423
|
inlineEditingElementIdRef.current,
|
|
@@ -3585,6 +3585,7 @@ function useViewerUIState() {
|
|
|
3585
3585
|
const [isSidebarCollapsed, setIsSidebarCollapsed] = react.useState(false);
|
|
3586
3586
|
const [sidebarPanelMode, setSidebarPanelMode] = react.useState("properties");
|
|
3587
3587
|
const [showSlideSorter, setShowSlideSorter] = react.useState(false);
|
|
3588
|
+
const [showReadingView, setShowReadingView] = react.useState(false);
|
|
3588
3589
|
const [isShortcutHelpOpen, setIsShortcutHelpOpen] = react.useState(false);
|
|
3589
3590
|
const [isAccessibilityPanelOpen, setIsAccessibilityPanelOpen] = react.useState(false);
|
|
3590
3591
|
const [accessibilityIssues, setAccessibilityIssues] = react.useState([]);
|
|
@@ -3631,6 +3632,8 @@ function useViewerUIState() {
|
|
|
3631
3632
|
setSidebarPanelMode,
|
|
3632
3633
|
showSlideSorter,
|
|
3633
3634
|
setShowSlideSorter,
|
|
3635
|
+
showReadingView,
|
|
3636
|
+
setShowReadingView,
|
|
3634
3637
|
isShortcutHelpOpen,
|
|
3635
3638
|
setIsShortcutHelpOpen,
|
|
3636
3639
|
isAccessibilityPanelOpen,
|
|
@@ -3745,7 +3748,7 @@ function useLoadContent({
|
|
|
3745
3748
|
);
|
|
3746
3749
|
}
|
|
3747
3750
|
const previousHandler = handlerRef.current;
|
|
3748
|
-
const handler = new
|
|
3751
|
+
const handler = new chunkH74UXL4Q_js.PptxHandler();
|
|
3749
3752
|
const parsed = await handler.load(buffer);
|
|
3750
3753
|
if (cancelled || token !== renderTokenRef.current) {
|
|
3751
3754
|
handler.dispose();
|
|
@@ -3757,7 +3760,7 @@ function useLoadContent({
|
|
|
3757
3760
|
handlerRef.current = null;
|
|
3758
3761
|
const mediaElements = [];
|
|
3759
3762
|
for (const slide of parsed.slides) {
|
|
3760
|
-
|
|
3763
|
+
chunkH74UXL4Q_js.collectMediaElements(slide.elements, mediaElements);
|
|
3761
3764
|
}
|
|
3762
3765
|
for (const url of mediaDataUrls.values()) {
|
|
3763
3766
|
if (url.startsWith("blob:")) {
|
|
@@ -3798,7 +3801,7 @@ function useLoadContent({
|
|
|
3798
3801
|
}
|
|
3799
3802
|
})
|
|
3800
3803
|
);
|
|
3801
|
-
const { paths: imagePaths, refs: imageRefs } =
|
|
3804
|
+
const { paths: imagePaths, refs: imageRefs } = chunkH74UXL4Q_js.collectImagePaths(parsed.slides);
|
|
3802
3805
|
let nextSlides = parsed.slides;
|
|
3803
3806
|
if (imagePaths.size > 0) {
|
|
3804
3807
|
const resolvedMap = /* @__PURE__ */ new Map();
|
|
@@ -3853,12 +3856,12 @@ function useLoadContent({
|
|
|
3853
3856
|
}
|
|
3854
3857
|
}
|
|
3855
3858
|
handlerRef.current = handler;
|
|
3856
|
-
const partition =
|
|
3859
|
+
const partition = chunkIJVDNQLG_js.partitionTemplateElements(nextSlides);
|
|
3857
3860
|
setSlides(partition.slides);
|
|
3858
3861
|
setTemplateElementsBySlideId(partition.templateElementsBySlideId);
|
|
3859
3862
|
setCanvasSize({
|
|
3860
|
-
width: parsed.width ??
|
|
3861
|
-
height: parsed.height ??
|
|
3863
|
+
width: parsed.width ?? chunkIJVDNQLG_js.DEFAULT_CANVAS_WIDTH,
|
|
3864
|
+
height: parsed.height ?? chunkIJVDNQLG_js.DEFAULT_CANVAS_HEIGHT
|
|
3862
3865
|
});
|
|
3863
3866
|
setHeaderFooter(parsed.headerFooter ?? {});
|
|
3864
3867
|
setLayoutOptions(parsed.layoutOptions ?? []);
|
|
@@ -3887,7 +3890,7 @@ function useLoadContent({
|
|
|
3887
3890
|
setHasMacros(parsed.hasMacros === true);
|
|
3888
3891
|
setHasDigitalSignatures(parsed.hasDigitalSignatures === true);
|
|
3889
3892
|
setDigitalSignatureCount(parsed.digitalSignatureCount ?? 0);
|
|
3890
|
-
setGuides(
|
|
3893
|
+
setGuides(chunkH74UXL4Q_js.buildInitialGuides(parsed.presentationGuides, parsed.slides[0]?.guides));
|
|
3891
3894
|
setActiveSlideIndex(0);
|
|
3892
3895
|
clearSelection();
|
|
3893
3896
|
setIsDirty(false);
|
|
@@ -3895,7 +3898,7 @@ function useLoadContent({
|
|
|
3895
3898
|
onContentApplied?.();
|
|
3896
3899
|
} catch (err) {
|
|
3897
3900
|
if (!cancelled && token === renderTokenRef.current) {
|
|
3898
|
-
if (err instanceof
|
|
3901
|
+
if (err instanceof chunkH74UXL4Q_js.EncryptedFileError) {
|
|
3899
3902
|
setIsEncrypted(true);
|
|
3900
3903
|
} else {
|
|
3901
3904
|
setError(err instanceof Error ? err.message : String(err));
|
|
@@ -3972,7 +3975,7 @@ function useAutosave(input) {
|
|
|
3972
3975
|
isSavingRef.current = false;
|
|
3973
3976
|
return;
|
|
3974
3977
|
}
|
|
3975
|
-
await
|
|
3978
|
+
await chunkH74UXL4Q_js.saveAutosaveSnapshot(filePathRef.current, data);
|
|
3976
3979
|
setAutosaveStatus({ state: "saved", timestamp: Date.now() });
|
|
3977
3980
|
} catch (err) {
|
|
3978
3981
|
setAutosaveStatus({
|
|
@@ -4037,7 +4040,7 @@ function useElementOperations(input) {
|
|
|
4037
4040
|
}, [applySelection, setInlineEditingElementId, setContextMenuState]);
|
|
4038
4041
|
const updateElementById = react.useCallback(
|
|
4039
4042
|
(elementId, updates) => {
|
|
4040
|
-
if (
|
|
4043
|
+
if (chunkH74UXL4Q_js.isTemplateElementId(elementId)) {
|
|
4041
4044
|
const slideId = activeSlide?.id;
|
|
4042
4045
|
if (slideId) {
|
|
4043
4046
|
setTemplateElementsBySlideId((prev) => ({
|
|
@@ -4077,7 +4080,7 @@ function useElementOperations(input) {
|
|
|
4077
4080
|
);
|
|
4078
4081
|
const updateSelectedShapeStyle = react.useCallback(
|
|
4079
4082
|
(updates) => {
|
|
4080
|
-
if (!selectedElement || !
|
|
4083
|
+
if (!selectedElement || !chunkH74UXL4Q_js.hasShapeProperties(selectedElement)) {
|
|
4081
4084
|
return;
|
|
4082
4085
|
}
|
|
4083
4086
|
updateSelectedElement({
|
|
@@ -4088,17 +4091,17 @@ function useElementOperations(input) {
|
|
|
4088
4091
|
);
|
|
4089
4092
|
const updateSelectedTextStyle = react.useCallback(
|
|
4090
4093
|
(updates) => {
|
|
4091
|
-
if (!selectedElement || !
|
|
4094
|
+
if (!selectedElement || !chunkH74UXL4Q_js.hasTextProperties(selectedElement)) {
|
|
4092
4095
|
return;
|
|
4093
4096
|
}
|
|
4094
|
-
const inlineSel =
|
|
4097
|
+
const inlineSel = chunkH74UXL4Q_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
4095
4098
|
if (inlineSel && selectedElement.textSegments) {
|
|
4096
|
-
const { newSegments: newSegments2, newSelection } =
|
|
4099
|
+
const { newSegments: newSegments2, newSelection } = chunkH74UXL4Q_js.applyStyleToSelectedSegments(
|
|
4097
4100
|
selectedElement.textSegments,
|
|
4098
4101
|
inlineSel,
|
|
4099
4102
|
updates
|
|
4100
4103
|
);
|
|
4101
|
-
|
|
4104
|
+
chunkH74UXL4Q_js.setPendingSelectionRestore(newSelection);
|
|
4102
4105
|
updateSelectedElement({
|
|
4103
4106
|
textSegments: newSegments2
|
|
4104
4107
|
});
|
|
@@ -4118,12 +4121,12 @@ function useElementOperations(input) {
|
|
|
4118
4121
|
);
|
|
4119
4122
|
const updateSelectedTextCase = react.useCallback(
|
|
4120
4123
|
(mode) => {
|
|
4121
|
-
if (!selectedElement || !
|
|
4124
|
+
if (!selectedElement || !chunkH74UXL4Q_js.hasTextProperties(selectedElement)) {
|
|
4122
4125
|
return;
|
|
4123
4126
|
}
|
|
4124
|
-
const inlineSel =
|
|
4127
|
+
const inlineSel = chunkH74UXL4Q_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
4125
4128
|
if (inlineSel && selectedElement.textSegments) {
|
|
4126
|
-
const newSegments =
|
|
4129
|
+
const newSegments = chunkH74UXL4Q_js.applyCaseTransformToSegments(
|
|
4127
4130
|
selectedElement.textSegments,
|
|
4128
4131
|
inlineSel,
|
|
4129
4132
|
mode
|
|
@@ -4133,14 +4136,14 @@ function useElementOperations(input) {
|
|
|
4133
4136
|
}
|
|
4134
4137
|
const updates = {};
|
|
4135
4138
|
if (selectedElement.textSegments && selectedElement.textSegments.length > 0) {
|
|
4136
|
-
updates.textSegments =
|
|
4139
|
+
updates.textSegments = chunkH74UXL4Q_js.applyCaseTransformToSegments(
|
|
4137
4140
|
selectedElement.textSegments,
|
|
4138
4141
|
null,
|
|
4139
4142
|
mode
|
|
4140
4143
|
);
|
|
4141
4144
|
}
|
|
4142
4145
|
if (typeof selectedElement.text === "string") {
|
|
4143
|
-
updates.text =
|
|
4146
|
+
updates.text = chunkH74UXL4Q_js.transformTextCase(selectedElement.text, mode);
|
|
4144
4147
|
}
|
|
4145
4148
|
updateSelectedElement(updates);
|
|
4146
4149
|
},
|
|
@@ -4195,7 +4198,7 @@ function useSectionOperations(input) {
|
|
|
4195
4198
|
const { sections, setSections, slides, setSlides, markDirty } = input;
|
|
4196
4199
|
const addSection2 = react.useCallback(
|
|
4197
4200
|
(name, afterSlideIndex) => {
|
|
4198
|
-
const result =
|
|
4201
|
+
const result = chunkH74UXL4Q_js.addSection(sections, slides, name, afterSlideIndex);
|
|
4199
4202
|
setSlides(result.slides);
|
|
4200
4203
|
setSections(result.sections);
|
|
4201
4204
|
markDirty();
|
|
@@ -4204,7 +4207,7 @@ function useSectionOperations(input) {
|
|
|
4204
4207
|
);
|
|
4205
4208
|
const renameSection2 = react.useCallback(
|
|
4206
4209
|
(sectionId, newName) => {
|
|
4207
|
-
const result =
|
|
4210
|
+
const result = chunkH74UXL4Q_js.renameSection(sections, slides, sectionId, newName);
|
|
4208
4211
|
setSections(result.sections);
|
|
4209
4212
|
setSlides(result.slides);
|
|
4210
4213
|
markDirty();
|
|
@@ -4213,7 +4216,7 @@ function useSectionOperations(input) {
|
|
|
4213
4216
|
);
|
|
4214
4217
|
const deleteSection2 = react.useCallback(
|
|
4215
4218
|
(sectionId) => {
|
|
4216
|
-
const result =
|
|
4219
|
+
const result = chunkH74UXL4Q_js.deleteSection(sections, slides, sectionId);
|
|
4217
4220
|
setSections(result.sections);
|
|
4218
4221
|
setSlides(result.slides);
|
|
4219
4222
|
markDirty();
|
|
@@ -4222,21 +4225,21 @@ function useSectionOperations(input) {
|
|
|
4222
4225
|
);
|
|
4223
4226
|
const moveSectionUp2 = react.useCallback(
|
|
4224
4227
|
(sectionId) => {
|
|
4225
|
-
setSections(
|
|
4228
|
+
setSections(chunkH74UXL4Q_js.moveSectionUp(sections, sectionId));
|
|
4226
4229
|
markDirty();
|
|
4227
4230
|
},
|
|
4228
4231
|
[sections, setSections, markDirty]
|
|
4229
4232
|
);
|
|
4230
4233
|
const moveSectionDown2 = react.useCallback(
|
|
4231
4234
|
(sectionId) => {
|
|
4232
|
-
setSections(
|
|
4235
|
+
setSections(chunkH74UXL4Q_js.moveSectionDown(sections, sectionId));
|
|
4233
4236
|
markDirty();
|
|
4234
4237
|
},
|
|
4235
4238
|
[sections, setSections, markDirty]
|
|
4236
4239
|
);
|
|
4237
4240
|
const moveSlidesToSection2 = react.useCallback(
|
|
4238
4241
|
(slideIndexes, targetSectionId) => {
|
|
4239
|
-
const result =
|
|
4242
|
+
const result = chunkH74UXL4Q_js.moveSlidesToSection(sections, slides, slideIndexes, targetSectionId);
|
|
4240
4243
|
setSlides(result.slides);
|
|
4241
4244
|
setSections(result.sections);
|
|
4242
4245
|
markDirty();
|
|
@@ -4255,19 +4258,19 @@ function useSectionOperations(input) {
|
|
|
4255
4258
|
|
|
4256
4259
|
// src/viewer/hooks/pointer-move-handlers.ts
|
|
4257
4260
|
function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx) {
|
|
4258
|
-
const resized =
|
|
4261
|
+
const resized = chunkH74UXL4Q_js.applyResize(
|
|
4259
4262
|
{ x: startX, y: startY, width: startWidth, height: startHeight },
|
|
4260
4263
|
handle,
|
|
4261
4264
|
dx,
|
|
4262
4265
|
dy,
|
|
4263
4266
|
1,
|
|
4264
|
-
{ minSize:
|
|
4267
|
+
{ minSize: chunkIJVDNQLG_js.MIN_ELEMENT_SIZE }
|
|
4265
4268
|
);
|
|
4266
4269
|
const box = { x: resized.x, y: resized.y, width: resized.width, height: resized.height };
|
|
4267
4270
|
if (!snapToGrid) {
|
|
4268
4271
|
return box;
|
|
4269
4272
|
}
|
|
4270
|
-
return
|
|
4273
|
+
return chunkH74UXL4Q_js.snapBoxToGrid(box, handle, gridSpacingPx, chunkIJVDNQLG_js.MIN_ELEMENT_SIZE);
|
|
4271
4274
|
}
|
|
4272
4275
|
function computeAdjustmentValue(startAdjustment, dx, startWidth) {
|
|
4273
4276
|
const range = startWidth || 200;
|
|
@@ -4385,7 +4388,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4385
4388
|
width: el.width,
|
|
4386
4389
|
height: el.height
|
|
4387
4390
|
}));
|
|
4388
|
-
const snapResult =
|
|
4391
|
+
const snapResult = chunkH74UXL4Q_js.computeSnapToShape(
|
|
4389
4392
|
targetX,
|
|
4390
4393
|
targetY,
|
|
4391
4394
|
primaryEl.width,
|
|
@@ -4424,7 +4427,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4424
4427
|
if (live) {
|
|
4425
4428
|
for (const id of Object.keys(drag.startPositionsById)) {
|
|
4426
4429
|
const start = drag.startPositionsById[id];
|
|
4427
|
-
|
|
4430
|
+
chunkH74UXL4Q_js.publishLiveGeometry(live.patcher, live.slideId, id, {
|
|
4428
4431
|
x: start.x + appliedDx,
|
|
4429
4432
|
y: start.y + appliedDy
|
|
4430
4433
|
});
|
|
@@ -4458,15 +4461,15 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4458
4461
|
if (rs.domEl) {
|
|
4459
4462
|
rs.domEl.style.left = `${geo.x}px`;
|
|
4460
4463
|
rs.domEl.style.top = `${geo.y}px`;
|
|
4461
|
-
rs.domEl.style.width = `${Math.max(geo.width,
|
|
4462
|
-
rs.domEl.style.height = `${Math.max(geo.height,
|
|
4464
|
+
rs.domEl.style.width = `${Math.max(geo.width, chunkIJVDNQLG_js.MIN_ELEMENT_SIZE)}px`;
|
|
4465
|
+
rs.domEl.style.height = `${Math.max(geo.height, chunkIJVDNQLG_js.MIN_ELEMENT_SIZE)}px`;
|
|
4463
4466
|
}
|
|
4464
4467
|
if (live) {
|
|
4465
|
-
|
|
4468
|
+
chunkH74UXL4Q_js.publishLiveGeometry(live.patcher, live.slideId, rs.elementId, {
|
|
4466
4469
|
x: geo.x,
|
|
4467
4470
|
y: geo.y,
|
|
4468
|
-
width: Math.max(geo.width,
|
|
4469
|
-
height: Math.max(geo.height,
|
|
4471
|
+
width: Math.max(geo.width, chunkIJVDNQLG_js.MIN_ELEMENT_SIZE),
|
|
4472
|
+
height: Math.max(geo.height, chunkIJVDNQLG_js.MIN_ELEMENT_SIZE)
|
|
4470
4473
|
});
|
|
4471
4474
|
}
|
|
4472
4475
|
}
|
|
@@ -4546,13 +4549,13 @@ function processPointerUp(input) {
|
|
|
4546
4549
|
if (i !== activeSlideIndex) {
|
|
4547
4550
|
return s;
|
|
4548
4551
|
}
|
|
4549
|
-
const rerouted =
|
|
4552
|
+
const rerouted = chunkH74UXL4Q_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
|
|
4550
4553
|
if (rerouted.length === 0) {
|
|
4551
4554
|
return s;
|
|
4552
4555
|
}
|
|
4553
4556
|
return {
|
|
4554
4557
|
...s,
|
|
4555
|
-
elements:
|
|
4558
|
+
elements: chunkH74UXL4Q_js.applyReroutedConnectors(s.elements, rerouted)
|
|
4556
4559
|
};
|
|
4557
4560
|
})
|
|
4558
4561
|
);
|
|
@@ -4574,9 +4577,9 @@ function processPointerUp(input) {
|
|
|
4574
4577
|
}
|
|
4575
4578
|
function commitMarquee(marquee, editTemplateMode, templateElements, activeSlide, applySelection, clearSelection) {
|
|
4576
4579
|
const sourceElements = editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
4577
|
-
const hitIds =
|
|
4580
|
+
const hitIds = chunkH74UXL4Q_js.computeMarqueeHitIds(marquee, sourceElements);
|
|
4578
4581
|
if (marquee.additive) {
|
|
4579
|
-
const merged =
|
|
4582
|
+
const merged = chunkH74UXL4Q_js.mergeAdditiveSelection(marquee.baseSelectionIds, hitIds);
|
|
4580
4583
|
if (merged.length > 0) {
|
|
4581
4584
|
applySelection(merged[0], merged);
|
|
4582
4585
|
} else {
|
|
@@ -4599,8 +4602,8 @@ function commitDrag(drag, editTemplateMode, activeSlide, activeSlideIndex, setTe
|
|
|
4599
4602
|
}
|
|
4600
4603
|
return { ...el, x: start.x + dx, y: start.y + dy };
|
|
4601
4604
|
});
|
|
4602
|
-
const rerouted =
|
|
4603
|
-
return
|
|
4605
|
+
const rerouted = chunkH74UXL4Q_js.rerouteConnectorsForMovedElements(movedElements, movedIds);
|
|
4606
|
+
return chunkH74UXL4Q_js.applyReroutedConnectors(movedElements, rerouted);
|
|
4604
4607
|
};
|
|
4605
4608
|
if (editTemplateMode) {
|
|
4606
4609
|
const slideId = activeSlide?.id;
|
|
@@ -4756,9 +4759,9 @@ function useCanvasInteractions(input) {
|
|
|
4756
4759
|
return;
|
|
4757
4760
|
}
|
|
4758
4761
|
const el = elementLookup.get(editId);
|
|
4759
|
-
if (el &&
|
|
4762
|
+
if (el && chunkH74UXL4Q_js.hasTextProperties(el)) {
|
|
4760
4763
|
const committedText = transformCommittedText ? transformCommittedText(inlineEditingText) : inlineEditingText;
|
|
4761
|
-
const newSegments =
|
|
4764
|
+
const newSegments = chunkH74UXL4Q_js.remapTextToSegments(committedText, el.textSegments, el.textStyle);
|
|
4762
4765
|
ops.updateElementById(editId, {
|
|
4763
4766
|
text: committedText,
|
|
4764
4767
|
textSegments: newSegments
|
|
@@ -4769,7 +4772,7 @@ function useCanvasInteractions(input) {
|
|
|
4769
4772
|
setInlineEditingText("");
|
|
4770
4773
|
};
|
|
4771
4774
|
const openEquationEditorForElement = (el) => {
|
|
4772
|
-
if (!
|
|
4775
|
+
if (!chunkH74UXL4Q_js.hasTextProperties(el)) {
|
|
4773
4776
|
return false;
|
|
4774
4777
|
}
|
|
4775
4778
|
const eqSeg = el.textSegments?.find((seg) => seg.equationXml);
|
|
@@ -4798,7 +4801,7 @@ function useCanvasInteractions(input) {
|
|
|
4798
4801
|
justSelectedRef.current = false;
|
|
4799
4802
|
} else {
|
|
4800
4803
|
const el = elementLookup.get(elementId);
|
|
4801
|
-
if (el &&
|
|
4804
|
+
if (el && chunkH74UXL4Q_js.hasTextProperties(el) && !el.locks?.noTextEdit) {
|
|
4802
4805
|
if (!openEquationEditorForElement(el)) {
|
|
4803
4806
|
setInlineEditingElementId(elementId);
|
|
4804
4807
|
setInlineEditingText(el.text ?? "");
|
|
@@ -4817,7 +4820,7 @@ function useCanvasInteractions(input) {
|
|
|
4817
4820
|
if (openEquationEditorForElement(el)) {
|
|
4818
4821
|
return;
|
|
4819
4822
|
}
|
|
4820
|
-
if (
|
|
4823
|
+
if (chunkH74UXL4Q_js.hasTextProperties(el)) {
|
|
4821
4824
|
setInlineEditingElementId(elementId);
|
|
4822
4825
|
setInlineEditingText(el.text ?? "");
|
|
4823
4826
|
}
|
|
@@ -5010,7 +5013,7 @@ function createFileHandlers(deps) {
|
|
|
5010
5013
|
h = Math.round(h * scale);
|
|
5011
5014
|
}
|
|
5012
5015
|
addElement({
|
|
5013
|
-
id:
|
|
5016
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5014
5017
|
type: "image",
|
|
5015
5018
|
x: Math.round((canvasSize.width - w) / 2),
|
|
5016
5019
|
y: Math.round((canvasSize.height - h) / 2),
|
|
@@ -5021,7 +5024,7 @@ function createFileHandlers(deps) {
|
|
|
5021
5024
|
};
|
|
5022
5025
|
img.onerror = () => {
|
|
5023
5026
|
addElement({
|
|
5024
|
-
id:
|
|
5027
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5025
5028
|
type: "image",
|
|
5026
5029
|
x: 100,
|
|
5027
5030
|
y: 100,
|
|
@@ -5047,7 +5050,7 @@ function createFileHandlers(deps) {
|
|
|
5047
5050
|
const elFilePath = file.path;
|
|
5048
5051
|
const insertMediaElement = (mediaSourceUrl, width, height) => {
|
|
5049
5052
|
addElement({
|
|
5050
|
-
id:
|
|
5053
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5051
5054
|
type: "media",
|
|
5052
5055
|
mediaType,
|
|
5053
5056
|
mediaMimeType: file.type || void 0,
|
|
@@ -5222,13 +5225,13 @@ function createStructuredElementHandlers(deps) {
|
|
|
5222
5225
|
return;
|
|
5223
5226
|
}
|
|
5224
5227
|
addElement({
|
|
5225
|
-
id:
|
|
5228
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5226
5229
|
type: "smartArt",
|
|
5227
5230
|
x: 100,
|
|
5228
5231
|
y: 120,
|
|
5229
5232
|
width: 600,
|
|
5230
5233
|
height: 340,
|
|
5231
|
-
smartArtData:
|
|
5234
|
+
smartArtData: chunkH74UXL4Q_js.buildSmartArtPresetData(
|
|
5232
5235
|
layout,
|
|
5233
5236
|
defaultItems,
|
|
5234
5237
|
(i) => `node-${Date.now()}-${i}-${Math.random().toString(36).slice(2, 8)}`
|
|
@@ -5240,7 +5243,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5240
5243
|
return;
|
|
5241
5244
|
}
|
|
5242
5245
|
addElement({
|
|
5243
|
-
id:
|
|
5246
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5244
5247
|
type: "shape",
|
|
5245
5248
|
x: 120,
|
|
5246
5249
|
y: 200,
|
|
@@ -5299,7 +5302,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5299
5302
|
const displayText = value || fieldTexts[fieldType] || fieldType;
|
|
5300
5303
|
const fieldGuid = `{${crypto.randomUUID().toUpperCase()}}`;
|
|
5301
5304
|
addElement({
|
|
5302
|
-
id:
|
|
5305
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5303
5306
|
type: "shape",
|
|
5304
5307
|
x: 120,
|
|
5305
5308
|
y: 200,
|
|
@@ -5321,11 +5324,11 @@ function createStructuredElementHandlers(deps) {
|
|
|
5321
5324
|
if (!activeSlide) {
|
|
5322
5325
|
return;
|
|
5323
5326
|
}
|
|
5324
|
-
const preset =
|
|
5327
|
+
const preset = chunkH74UXL4Q_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
|
|
5325
5328
|
if (!preset) {
|
|
5326
5329
|
return;
|
|
5327
5330
|
}
|
|
5328
|
-
const defaultPptxAction =
|
|
5331
|
+
const defaultPptxAction = chunkH74UXL4Q_js.elementActionToPptxAction({
|
|
5329
5332
|
trigger: "click",
|
|
5330
5333
|
type: preset.defaultAction
|
|
5331
5334
|
});
|
|
@@ -5334,7 +5337,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5334
5337
|
defaultPptxAction.highlightClick = true;
|
|
5335
5338
|
}
|
|
5336
5339
|
addElement({
|
|
5337
|
-
id:
|
|
5340
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5338
5341
|
type: "shape",
|
|
5339
5342
|
x: 150,
|
|
5340
5343
|
y: 150,
|
|
@@ -5401,14 +5404,14 @@ function useInsertElements(input) {
|
|
|
5401
5404
|
return;
|
|
5402
5405
|
}
|
|
5403
5406
|
addElement({
|
|
5404
|
-
id:
|
|
5407
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5405
5408
|
type: "text",
|
|
5406
5409
|
x: 100,
|
|
5407
5410
|
y: 100,
|
|
5408
5411
|
width: 300,
|
|
5409
5412
|
height: 60,
|
|
5410
5413
|
text: "",
|
|
5411
|
-
textStyle: { fontSize:
|
|
5414
|
+
textStyle: { fontSize: chunkIJVDNQLG_js.DEFAULT_TEXT_FONT_SIZE }
|
|
5412
5415
|
});
|
|
5413
5416
|
};
|
|
5414
5417
|
const handleAddShape = () => {
|
|
@@ -5416,7 +5419,7 @@ function useInsertElements(input) {
|
|
|
5416
5419
|
return;
|
|
5417
5420
|
}
|
|
5418
5421
|
addElement({
|
|
5419
|
-
id:
|
|
5422
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5420
5423
|
type: "shape",
|
|
5421
5424
|
x: 150,
|
|
5422
5425
|
y: 150,
|
|
@@ -5435,15 +5438,15 @@ function useInsertElements(input) {
|
|
|
5435
5438
|
return;
|
|
5436
5439
|
}
|
|
5437
5440
|
addElement({
|
|
5438
|
-
...
|
|
5439
|
-
id:
|
|
5441
|
+
...chunkH74UXL4Q_js.newTableElement(chunkIJVDNQLG_js.DEFAULT_TABLE_ROWS, chunkIJVDNQLG_js.DEFAULT_TABLE_COLUMNS, 100, 200),
|
|
5442
|
+
id: chunkH74UXL4Q_js.generateElementId()
|
|
5440
5443
|
});
|
|
5441
5444
|
};
|
|
5442
5445
|
const handleAddChart = (chartType) => {
|
|
5443
5446
|
if (!activeSlide) {
|
|
5444
5447
|
return;
|
|
5445
5448
|
}
|
|
5446
|
-
addElement(
|
|
5449
|
+
addElement(chunkH74UXL4Q_js.createDefaultChartElement(chartType));
|
|
5447
5450
|
};
|
|
5448
5451
|
const structured = createStructuredElementHandlers({
|
|
5449
5452
|
activeSlide,
|
|
@@ -5513,7 +5516,7 @@ function useClipboardHandlers(input) {
|
|
|
5513
5516
|
if (!selectedElement) {
|
|
5514
5517
|
return;
|
|
5515
5518
|
}
|
|
5516
|
-
setClipboardPayload(
|
|
5519
|
+
setClipboardPayload(chunkH74UXL4Q_js.buildElementClipboardPayload(selectedElement, editTemplateMode));
|
|
5517
5520
|
};
|
|
5518
5521
|
const handleDelete = () => {
|
|
5519
5522
|
const idsToDelete = effectiveSelectedIds;
|
|
@@ -5530,7 +5533,7 @@ function useClipboardHandlers(input) {
|
|
|
5530
5533
|
handleDelete();
|
|
5531
5534
|
};
|
|
5532
5535
|
const insertClone = (source) => {
|
|
5533
|
-
const clone =
|
|
5536
|
+
const clone = chunkH74UXL4Q_js.cloneElementForPaste(source, { intoTemplate: editTemplateMode });
|
|
5534
5537
|
ops.updateActiveElements((els) => [...els, clone]);
|
|
5535
5538
|
ops.applySelection(clone.id);
|
|
5536
5539
|
history.markDirty();
|
|
@@ -5565,7 +5568,7 @@ function resolveShapePath(el) {
|
|
|
5565
5568
|
return el.pathData;
|
|
5566
5569
|
}
|
|
5567
5570
|
if ("shapeType" in el && typeof el.shapeType === "string") {
|
|
5568
|
-
const clipPath =
|
|
5571
|
+
const clipPath = chunkH74UXL4Q_js.getPresetShapeClipPath(el.shapeType);
|
|
5569
5572
|
if (clipPath) {
|
|
5570
5573
|
const svgPath = clipPathToSvgPath(clipPath, el.width, el.height);
|
|
5571
5574
|
if (svgPath) {
|
|
@@ -5616,7 +5619,7 @@ function clipPathToSvgPath(clipPath, width, height) {
|
|
|
5616
5619
|
return parts.join(" ");
|
|
5617
5620
|
}
|
|
5618
5621
|
function transformPathToGlobal(pathData, el) {
|
|
5619
|
-
const polys =
|
|
5622
|
+
const polys = chunkH74UXL4Q_js.svgPathToPolygons(pathData);
|
|
5620
5623
|
if (polys.length === 0) {
|
|
5621
5624
|
return pathData;
|
|
5622
5625
|
}
|
|
@@ -5636,10 +5639,10 @@ function transformPathToGlobal(pathData, el) {
|
|
|
5636
5639
|
y: pt.y * scaleY + el.y
|
|
5637
5640
|
}))
|
|
5638
5641
|
);
|
|
5639
|
-
return
|
|
5642
|
+
return chunkH74UXL4Q_js.polygonsToSvgPath(transformed);
|
|
5640
5643
|
}
|
|
5641
5644
|
function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
5642
|
-
const polys =
|
|
5645
|
+
const polys = chunkH74UXL4Q_js.svgPathToPolygons(pathData);
|
|
5643
5646
|
if (polys.length === 0) {
|
|
5644
5647
|
return pathData;
|
|
5645
5648
|
}
|
|
@@ -5649,10 +5652,10 @@ function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
|
5649
5652
|
y: pt.y - y
|
|
5650
5653
|
}))
|
|
5651
5654
|
);
|
|
5652
|
-
return
|
|
5655
|
+
return chunkH74UXL4Q_js.polygonsToSvgPath(transformed);
|
|
5653
5656
|
}
|
|
5654
5657
|
function pathBounds(pathData) {
|
|
5655
|
-
const polys =
|
|
5658
|
+
const polys = chunkH74UXL4Q_js.svgPathToPolygons(pathData);
|
|
5656
5659
|
let minX = Infinity;
|
|
5657
5660
|
let minY = Infinity;
|
|
5658
5661
|
let maxX = -Infinity;
|
|
@@ -5711,7 +5714,7 @@ function useMergeShapesHandler(input) {
|
|
|
5711
5714
|
let allFragments = [];
|
|
5712
5715
|
let remaining = globalPaths[0];
|
|
5713
5716
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
5714
|
-
const frags =
|
|
5717
|
+
const frags = chunkH74UXL4Q_js.mergeShapes("fragment", remaining, globalPaths[i]);
|
|
5715
5718
|
if (Array.isArray(frags)) {
|
|
5716
5719
|
allFragments = frags;
|
|
5717
5720
|
}
|
|
@@ -5740,7 +5743,7 @@ function useMergeShapesHandler(input) {
|
|
|
5740
5743
|
bounds.height
|
|
5741
5744
|
);
|
|
5742
5745
|
const newEl = {
|
|
5743
|
-
id:
|
|
5746
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5744
5747
|
type: "shape",
|
|
5745
5748
|
x: bounds.x,
|
|
5746
5749
|
y: bounds.y,
|
|
@@ -5778,7 +5781,7 @@ function useMergeShapesHandler(input) {
|
|
|
5778
5781
|
} else {
|
|
5779
5782
|
let resultPath = globalPaths[0];
|
|
5780
5783
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
5781
|
-
const result =
|
|
5784
|
+
const result = chunkH74UXL4Q_js.mergeShapes(operation, resultPath, globalPaths[i]);
|
|
5782
5785
|
if (typeof result === "string") {
|
|
5783
5786
|
resultPath = result;
|
|
5784
5787
|
}
|
|
@@ -5799,7 +5802,7 @@ function useMergeShapesHandler(input) {
|
|
|
5799
5802
|
);
|
|
5800
5803
|
const primary = targets[0];
|
|
5801
5804
|
const newEl = {
|
|
5802
|
-
id:
|
|
5805
|
+
id: chunkH74UXL4Q_js.generateElementId(),
|
|
5803
5806
|
type: "shape",
|
|
5804
5807
|
x: bounds.x,
|
|
5805
5808
|
y: bounds.y,
|
|
@@ -5862,7 +5865,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5862
5865
|
if (ids.length < 2 || !activeSlide) {
|
|
5863
5866
|
return;
|
|
5864
5867
|
}
|
|
5865
|
-
const { elements, groupId } =
|
|
5868
|
+
const { elements, groupId } = chunkH74UXL4Q_js.groupElements(ops.activeElements, ids, chunkH74UXL4Q_js.generateElementId());
|
|
5866
5869
|
if (groupId === null) {
|
|
5867
5870
|
return;
|
|
5868
5871
|
}
|
|
@@ -5875,12 +5878,12 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5875
5878
|
return;
|
|
5876
5879
|
}
|
|
5877
5880
|
const group = selectedElement;
|
|
5878
|
-
const intoTemplate =
|
|
5881
|
+
const intoTemplate = chunkH74UXL4Q_js.isTemplateElementId(group.id);
|
|
5879
5882
|
const ungrouped = group.children.map((child) => ({
|
|
5880
5883
|
...structuredClone(child),
|
|
5881
5884
|
// Keep child ids in the same store as the group so later edits route
|
|
5882
5885
|
// correctly: template groups yield template-prefixed child ids.
|
|
5883
|
-
id: intoTemplate ?
|
|
5886
|
+
id: intoTemplate ? chunkH74UXL4Q_js.makeCloneId(true, child.id || group.id) : child.id || chunkH74UXL4Q_js.generateElementId(),
|
|
5884
5887
|
x: child.x + group.x,
|
|
5885
5888
|
y: child.y + group.y
|
|
5886
5889
|
}));
|
|
@@ -5904,7 +5907,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5904
5907
|
if (!edge) {
|
|
5905
5908
|
return;
|
|
5906
5909
|
}
|
|
5907
|
-
const positions =
|
|
5910
|
+
const positions = chunkH74UXL4Q_js.alignElements(selectedElements, edge);
|
|
5908
5911
|
for (const [id, pos] of positions) {
|
|
5909
5912
|
const el = elementLookup.get(id);
|
|
5910
5913
|
if (!el) {
|
|
@@ -5922,7 +5925,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5922
5925
|
if (!distAxis) {
|
|
5923
5926
|
return;
|
|
5924
5927
|
}
|
|
5925
|
-
const positions =
|
|
5928
|
+
const positions = chunkH74UXL4Q_js.distributeElements(selectedElements, distAxis);
|
|
5926
5929
|
for (const [id, pos] of positions) {
|
|
5927
5930
|
const el = elementLookup.get(id);
|
|
5928
5931
|
if (!el) {
|
|
@@ -5939,7 +5942,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5939
5942
|
}
|
|
5940
5943
|
const id = selectedElement.id;
|
|
5941
5944
|
ops.updateActiveElements(
|
|
5942
|
-
(els) => direction === "forward" ?
|
|
5945
|
+
(els) => direction === "forward" ? chunkH74UXL4Q_js.bringForward(els, id) : direction === "backward" ? chunkH74UXL4Q_js.sendBackward(els, id) : els
|
|
5943
5946
|
);
|
|
5944
5947
|
history.markDirty();
|
|
5945
5948
|
};
|
|
@@ -5949,7 +5952,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5949
5952
|
}
|
|
5950
5953
|
const id = selectedElement.id;
|
|
5951
5954
|
ops.updateActiveElements(
|
|
5952
|
-
(els) => direction === "front" ?
|
|
5955
|
+
(els) => direction === "front" ? chunkH74UXL4Q_js.bringToFront(els, id) : chunkH74UXL4Q_js.sendToBack(els, id)
|
|
5953
5956
|
);
|
|
5954
5957
|
history.markDirty();
|
|
5955
5958
|
};
|
|
@@ -6071,7 +6074,7 @@ function insertSlideFromLayoutUpdater(slides, activeIndex, draft) {
|
|
|
6071
6074
|
function useSlideManagement(input) {
|
|
6072
6075
|
const { slides, activeSlideIndex, setActiveSlideIndex, ops, history, handlerRef } = input;
|
|
6073
6076
|
const handleAddSlide = () => {
|
|
6074
|
-
const newSlide =
|
|
6077
|
+
const newSlide = chunkH74UXL4Q_js.createBlankSlide(slides.length + 1);
|
|
6075
6078
|
ops.updateSlides((prev) => {
|
|
6076
6079
|
const next = [...prev];
|
|
6077
6080
|
next.splice(activeSlideIndex + 1, 0, newSlide);
|
|
@@ -6134,7 +6137,7 @@ function useSlideManagement(input) {
|
|
|
6134
6137
|
}
|
|
6135
6138
|
const clone = {
|
|
6136
6139
|
...src,
|
|
6137
|
-
id:
|
|
6140
|
+
id: chunkH74UXL4Q_js.makeSlideId(),
|
|
6138
6141
|
elements: src.elements.map((el) => ({
|
|
6139
6142
|
...el,
|
|
6140
6143
|
id: `${el.id}-dup-${Math.random().toString(36).slice(2, 6)}`
|
|
@@ -6166,7 +6169,7 @@ function useSlideManagement(input) {
|
|
|
6166
6169
|
const handleInsertSlideFromLayout = (layoutPath, layoutName) => {
|
|
6167
6170
|
const insertAt = activeSlideIndex + 1;
|
|
6168
6171
|
const draft = {
|
|
6169
|
-
...
|
|
6172
|
+
...chunkH74UXL4Q_js.createBlankSlide(slides.length + 1),
|
|
6170
6173
|
layoutPath,
|
|
6171
6174
|
...layoutName ? { layoutName } : {}
|
|
6172
6175
|
};
|
|
@@ -6227,7 +6230,7 @@ function createTableMergeHandlers(input) {
|
|
|
6227
6230
|
if (!nextCell || nextCell.hMerge || nextCell.vMerge) {
|
|
6228
6231
|
return;
|
|
6229
6232
|
}
|
|
6230
|
-
const newTableData =
|
|
6233
|
+
const newTableData = chunkH74UXL4Q_js.mergeCells(
|
|
6231
6234
|
[
|
|
6232
6235
|
{ row: rowIndex, col: columnIndex },
|
|
6233
6236
|
{ row: rowIndex, col: nextColIdx }
|
|
@@ -6235,7 +6238,7 @@ function createTableMergeHandlers(input) {
|
|
|
6235
6238
|
td
|
|
6236
6239
|
);
|
|
6237
6240
|
const updates = { tableData: newTableData };
|
|
6238
|
-
const newRawXml =
|
|
6241
|
+
const newRawXml = chunkH74UXL4Q_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6239
6242
|
if (newRawXml) {
|
|
6240
6243
|
updates.rawXml = newRawXml;
|
|
6241
6244
|
}
|
|
@@ -6261,7 +6264,7 @@ function createTableMergeHandlers(input) {
|
|
|
6261
6264
|
if (!targetNextCell || targetNextCell.hMerge || targetNextCell.vMerge) {
|
|
6262
6265
|
return;
|
|
6263
6266
|
}
|
|
6264
|
-
const newTableData =
|
|
6267
|
+
const newTableData = chunkH74UXL4Q_js.mergeCells(
|
|
6265
6268
|
[
|
|
6266
6269
|
{ row: rowIndex, col: columnIndex },
|
|
6267
6270
|
{ row: targetNextRowIdx, col: columnIndex }
|
|
@@ -6269,7 +6272,7 @@ function createTableMergeHandlers(input) {
|
|
|
6269
6272
|
td
|
|
6270
6273
|
);
|
|
6271
6274
|
const updates = { tableData: newTableData };
|
|
6272
|
-
const newRawXml =
|
|
6275
|
+
const newRawXml = chunkH74UXL4Q_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6273
6276
|
if (newRawXml) {
|
|
6274
6277
|
updates.rawXml = newRawXml;
|
|
6275
6278
|
}
|
|
@@ -6284,9 +6287,9 @@ function createTableMergeHandlers(input) {
|
|
|
6284
6287
|
return;
|
|
6285
6288
|
}
|
|
6286
6289
|
const td = selectedElement.tableData;
|
|
6287
|
-
const newTableData =
|
|
6290
|
+
const newTableData = chunkH74UXL4Q_js.mergeCells(ts.selectedCells, td);
|
|
6288
6291
|
const updates = { tableData: newTableData };
|
|
6289
|
-
const newRawXml =
|
|
6292
|
+
const newRawXml = chunkH74UXL4Q_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6290
6293
|
if (newRawXml) {
|
|
6291
6294
|
updates.rawXml = newRawXml;
|
|
6292
6295
|
}
|
|
@@ -6303,9 +6306,9 @@ function createTableMergeHandlers(input) {
|
|
|
6303
6306
|
}
|
|
6304
6307
|
const { rowIndex, columnIndex } = ts;
|
|
6305
6308
|
const td = selectedElement.tableData;
|
|
6306
|
-
const newTableData =
|
|
6309
|
+
const newTableData = chunkH74UXL4Q_js.splitCell(rowIndex, columnIndex, td);
|
|
6307
6310
|
const updates = { tableData: newTableData };
|
|
6308
|
-
const newRawXml =
|
|
6311
|
+
const newRawXml = chunkH74UXL4Q_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6309
6312
|
if (newRawXml) {
|
|
6310
6313
|
updates.rawXml = newRawXml;
|
|
6311
6314
|
}
|
|
@@ -6349,7 +6352,7 @@ function createTableStructHandlers(input) {
|
|
|
6349
6352
|
updates.tableData = { ...el.tableData, rows: newRows };
|
|
6350
6353
|
}
|
|
6351
6354
|
if (el.rawXml) {
|
|
6352
|
-
const newRawXml =
|
|
6355
|
+
const newRawXml = chunkH74UXL4Q_js.updateCellTextInRawXml(el, rowIndex, colIndex, text);
|
|
6353
6356
|
if (newRawXml) {
|
|
6354
6357
|
updates.rawXml = newRawXml;
|
|
6355
6358
|
}
|
|
@@ -6373,7 +6376,7 @@ function createTableStructHandlers(input) {
|
|
|
6373
6376
|
const { rowIndex, columnIndex: colIndex } = ts;
|
|
6374
6377
|
const updates = {};
|
|
6375
6378
|
if (selectedElement.rawXml) {
|
|
6376
|
-
const newRawXml =
|
|
6379
|
+
const newRawXml = chunkH74UXL4Q_js.updateCellTextStyleInRawXml(
|
|
6377
6380
|
selectedElement,
|
|
6378
6381
|
rowIndex,
|
|
6379
6382
|
colIndex,
|
|
@@ -6437,9 +6440,9 @@ function createTableStructHandlers(input) {
|
|
|
6437
6440
|
return;
|
|
6438
6441
|
}
|
|
6439
6442
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6440
|
-
const newTableData =
|
|
6443
|
+
const newTableData = chunkH74UXL4Q_js.insertTableRow(selectedElement.tableData, rowIdx, position);
|
|
6441
6444
|
const updates = { tableData: newTableData };
|
|
6442
|
-
const newRawXml =
|
|
6445
|
+
const newRawXml = chunkH74UXL4Q_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6443
6446
|
if (newRawXml) {
|
|
6444
6447
|
updates.rawXml = newRawXml;
|
|
6445
6448
|
}
|
|
@@ -6452,12 +6455,12 @@ function createTableStructHandlers(input) {
|
|
|
6452
6455
|
}
|
|
6453
6456
|
const td = selectedElement.tableData;
|
|
6454
6457
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6455
|
-
const newTableData =
|
|
6458
|
+
const newTableData = chunkH74UXL4Q_js.deleteTableRow(td, rowIdx);
|
|
6456
6459
|
if (newTableData === td) {
|
|
6457
6460
|
return;
|
|
6458
6461
|
}
|
|
6459
6462
|
const updates = { tableData: newTableData };
|
|
6460
|
-
const newRawXml =
|
|
6463
|
+
const newRawXml = chunkH74UXL4Q_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6461
6464
|
if (newRawXml) {
|
|
6462
6465
|
updates.rawXml = newRawXml;
|
|
6463
6466
|
}
|
|
@@ -6469,9 +6472,9 @@ function createTableStructHandlers(input) {
|
|
|
6469
6472
|
return;
|
|
6470
6473
|
}
|
|
6471
6474
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6472
|
-
const newTableData =
|
|
6475
|
+
const newTableData = chunkH74UXL4Q_js.insertTableColumn(selectedElement.tableData, colIdx, position);
|
|
6473
6476
|
const updates = { tableData: newTableData };
|
|
6474
|
-
const newRawXml =
|
|
6477
|
+
const newRawXml = chunkH74UXL4Q_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6475
6478
|
if (newRawXml) {
|
|
6476
6479
|
updates.rawXml = newRawXml;
|
|
6477
6480
|
}
|
|
@@ -6484,12 +6487,12 @@ function createTableStructHandlers(input) {
|
|
|
6484
6487
|
}
|
|
6485
6488
|
const td = selectedElement.tableData;
|
|
6486
6489
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6487
|
-
const newTableData =
|
|
6490
|
+
const newTableData = chunkH74UXL4Q_js.deleteTableColumn(td, colIdx);
|
|
6488
6491
|
if (newTableData === td) {
|
|
6489
6492
|
return;
|
|
6490
6493
|
}
|
|
6491
6494
|
const updates = { tableData: newTableData };
|
|
6492
|
-
const newRawXml =
|
|
6495
|
+
const newRawXml = chunkH74UXL4Q_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6493
6496
|
if (newRawXml) {
|
|
6494
6497
|
updates.rawXml = newRawXml;
|
|
6495
6498
|
}
|
|
@@ -6525,8 +6528,8 @@ async function renderToCanvas(element, options = {}) {
|
|
|
6525
6528
|
return html2canvasPro(element, {
|
|
6526
6529
|
...options,
|
|
6527
6530
|
onclone: async (doc, clonedEl) => {
|
|
6528
|
-
await
|
|
6529
|
-
|
|
6531
|
+
await chunkH74UXL4Q_js.normalizeColorsForCapture(doc, clonedEl);
|
|
6532
|
+
chunkH74UXL4Q_js.preprocessCssForCapture(clonedEl);
|
|
6530
6533
|
if (typeof userOnClone === "function") {
|
|
6531
6534
|
userOnClone(doc, clonedEl);
|
|
6532
6535
|
}
|
|
@@ -6582,7 +6585,7 @@ async function exportSlideToPngBlob(slideElement, options = {}) {
|
|
|
6582
6585
|
}
|
|
6583
6586
|
async function exportSlideAsPng(slideElement, slideIndex, options = {}) {
|
|
6584
6587
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
6585
|
-
|
|
6588
|
+
chunkH74UXL4Q_js.downloadBlob(blob, `slide-${slideIndex + 1}.png`);
|
|
6586
6589
|
}
|
|
6587
6590
|
async function copySlideToClipboard(slideElement, options = {}) {
|
|
6588
6591
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
@@ -6604,15 +6607,15 @@ async function exportAllSlidesAsPdf(slideStageRef, totalSlides, setActiveSlide,
|
|
|
6604
6607
|
continue;
|
|
6605
6608
|
}
|
|
6606
6609
|
const canvas = await renderElementToCanvas(stageEl, scale);
|
|
6607
|
-
images.push(
|
|
6610
|
+
images.push(chunkH74UXL4Q_js.canvasToJpegData(canvas));
|
|
6608
6611
|
}
|
|
6609
6612
|
onProgress?.(totalSlides, totalSlides);
|
|
6610
6613
|
setActiveSlide(currentSlideIndex);
|
|
6611
6614
|
if (images.length === 0) {
|
|
6612
|
-
throw new Error(
|
|
6615
|
+
throw new Error(chunkMMK4K3QI_js.translationsEn["pptx.export.errorNoSlidesPdf"]);
|
|
6613
6616
|
}
|
|
6614
|
-
const pdfBlobUrl =
|
|
6615
|
-
|
|
6617
|
+
const pdfBlobUrl = chunkIJVDNQLG_js.buildPdfFromImageData(images);
|
|
6618
|
+
chunkH74UXL4Q_js.downloadDataUrl(pdfBlobUrl, filename);
|
|
6616
6619
|
}
|
|
6617
6620
|
async function captureAllSlidesAsPngDataUrls(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, options = {}) {
|
|
6618
6621
|
const { scale = 2, onProgress } = options;
|
|
@@ -6658,10 +6661,10 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
|
|
|
6658
6661
|
onProgress?.(totalSlides, totalSlides);
|
|
6659
6662
|
setActiveSlide(currentSlideIndex);
|
|
6660
6663
|
if (pages.length === 0) {
|
|
6661
|
-
throw new Error(
|
|
6664
|
+
throw new Error(chunkMMK4K3QI_js.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
|
|
6662
6665
|
}
|
|
6663
|
-
const pdfDataUrl =
|
|
6664
|
-
|
|
6666
|
+
const pdfDataUrl = chunkIJVDNQLG_js.buildNotesPdf(pages);
|
|
6667
|
+
chunkH74UXL4Q_js.downloadDataUrl(pdfDataUrl, filename);
|
|
6665
6668
|
}
|
|
6666
6669
|
|
|
6667
6670
|
// src/viewer/utils/export-video.ts
|
|
@@ -6692,7 +6695,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
6692
6695
|
}
|
|
6693
6696
|
setActiveSlide(currentSlideIndex);
|
|
6694
6697
|
if (slideCanvases.length === 0) {
|
|
6695
|
-
throw new Error(
|
|
6698
|
+
throw new Error(chunkMMK4K3QI_js.translationsEn["pptx.export.errorNoSlidesVideo"]);
|
|
6696
6699
|
}
|
|
6697
6700
|
const firstCanvas = slideCanvases[0];
|
|
6698
6701
|
const recordingCanvas = document.createElement("canvas");
|
|
@@ -6700,12 +6703,12 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
6700
6703
|
recordingCanvas.height = firstCanvas.height;
|
|
6701
6704
|
const ctx = recordingCanvas.getContext("2d");
|
|
6702
6705
|
if (!ctx) {
|
|
6703
|
-
throw new Error(
|
|
6706
|
+
throw new Error(chunkMMK4K3QI_js.translationsEn["pptx.export.errorNo2dContext"]);
|
|
6704
6707
|
}
|
|
6705
6708
|
const fps = 30;
|
|
6706
6709
|
const stream = recordingCanvas.captureStream(fps);
|
|
6707
6710
|
const recorder = new MediaRecorder(stream, {
|
|
6708
|
-
mimeType:
|
|
6711
|
+
mimeType: chunkH74UXL4Q_js.pickSupportedMimeType([...chunkH74UXL4Q_js.WEBM_MIME_CANDIDATES]),
|
|
6709
6712
|
videoBitsPerSecond: 5e6
|
|
6710
6713
|
});
|
|
6711
6714
|
const chunks = [];
|
|
@@ -6728,8 +6731,8 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
6728
6731
|
const duration = slideTimingsMs?.[i] ?? slideDurationMs;
|
|
6729
6732
|
ctx.clearRect(0, 0, recordingCanvas.width, recordingCanvas.height);
|
|
6730
6733
|
ctx.drawImage(slideCanvases[i], 0, 0);
|
|
6731
|
-
const frameInterval =
|
|
6732
|
-
const framesNeeded =
|
|
6734
|
+
const frameInterval = chunkH74UXL4Q_js.fpsToFrameIntervalMs(fps);
|
|
6735
|
+
const framesNeeded = chunkH74UXL4Q_js.segmentFrameCount(duration, fps);
|
|
6733
6736
|
for (let f = 0; f < framesNeeded; f++) {
|
|
6734
6737
|
if (signal?.aborted) {
|
|
6735
6738
|
recorder.stop();
|
|
@@ -6776,9 +6779,9 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
|
|
|
6776
6779
|
}
|
|
6777
6780
|
setActiveSlide(currentSlideIndex);
|
|
6778
6781
|
if (frames.length === 0) {
|
|
6779
|
-
throw new Error(
|
|
6782
|
+
throw new Error(chunkMMK4K3QI_js.translationsEn["pptx.export.errorNoSlidesGif"]);
|
|
6780
6783
|
}
|
|
6781
|
-
const gifBytes =
|
|
6784
|
+
const gifBytes = chunkH74UXL4Q_js.encodeGif(frames, Math.round(slideDurationMs / 10));
|
|
6782
6785
|
onProgress?.(totalSlides, totalSlides);
|
|
6783
6786
|
const buf = new ArrayBuffer(gifBytes.length);
|
|
6784
6787
|
new Uint8Array(buf).set(gifBytes);
|
|
@@ -6832,7 +6835,7 @@ function exportAllSlidesToSvg(data, options = {}) {
|
|
|
6832
6835
|
continue;
|
|
6833
6836
|
}
|
|
6834
6837
|
onProgress?.(processedCount, data.slides.length);
|
|
6835
|
-
let svg =
|
|
6838
|
+
let svg = chunkH74UXL4Q_js.SvgExporter.exportSlide(slide, data.width, data.height, svgOptions);
|
|
6836
6839
|
if (embedFonts && fontFaces?.length) {
|
|
6837
6840
|
svg = injectFontFaces(svg, fontFaces);
|
|
6838
6841
|
}
|
|
@@ -6892,7 +6895,7 @@ function useExportSaveAs(input) {
|
|
|
6892
6895
|
}
|
|
6893
6896
|
setExportProgress(70);
|
|
6894
6897
|
setExportStatusMessage("Writing README...");
|
|
6895
|
-
const readme =
|
|
6898
|
+
const readme = chunkH74UXL4Q_js.generatePackageReadme(pptxFilename);
|
|
6896
6899
|
pkgFolder.file("README.txt", readme);
|
|
6897
6900
|
if (abortCtrl.signal.aborted) {
|
|
6898
6901
|
throw new DOMException("Export cancelled", "AbortError");
|
|
@@ -6903,7 +6906,7 @@ function useExportSaveAs(input) {
|
|
|
6903
6906
|
setExportProgress(95);
|
|
6904
6907
|
setExportStatusMessage("Downloading...");
|
|
6905
6908
|
const baseName = pptxFilename.replace(/\.[^.]+$/u, "");
|
|
6906
|
-
|
|
6909
|
+
chunkH74UXL4Q_js.downloadBlob(zipBlob, `${baseName}-package.zip`);
|
|
6907
6910
|
setExportProgress(100);
|
|
6908
6911
|
} catch (err) {
|
|
6909
6912
|
if (err.name !== "AbortError") {
|
|
@@ -6926,7 +6929,7 @@ function useExportSaveAs(input) {
|
|
|
6926
6929
|
const blob = new Blob([data], {
|
|
6927
6930
|
type: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
|
|
6928
6931
|
});
|
|
6929
|
-
|
|
6932
|
+
chunkH74UXL4Q_js.downloadBlob(blob, `${baseName}.${ext}`);
|
|
6930
6933
|
} catch (err) {
|
|
6931
6934
|
console.error(`[PowerPointViewer] Save as .${ext} failed:`, err);
|
|
6932
6935
|
}
|
|
@@ -6939,14 +6942,14 @@ function useExportSaveAs(input) {
|
|
|
6939
6942
|
const pptxGuides = guides.map((g) => ({
|
|
6940
6943
|
id: g.id,
|
|
6941
6944
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
6942
|
-
positionEmu:
|
|
6945
|
+
positionEmu: chunkH74UXL4Q_js.guidePxToEmu(g.position)
|
|
6943
6946
|
}));
|
|
6944
6947
|
return {
|
|
6945
6948
|
...slide,
|
|
6946
6949
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
6947
6950
|
};
|
|
6948
6951
|
});
|
|
6949
|
-
const slidesToSave =
|
|
6952
|
+
const slidesToSave = chunkIJVDNQLG_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
6950
6953
|
const saveOptions = {
|
|
6951
6954
|
headerFooter,
|
|
6952
6955
|
presentationProperties,
|
|
@@ -7003,7 +7006,7 @@ function safeConfirm(message) {
|
|
|
7003
7006
|
}
|
|
7004
7007
|
}
|
|
7005
7008
|
function downloadBlob2(blob, filename) {
|
|
7006
|
-
|
|
7009
|
+
chunkH74UXL4Q_js.downloadBlob(blob, chunkH74UXL4Q_js.sanitizeDownloadFilename(filename));
|
|
7007
7010
|
}
|
|
7008
7011
|
|
|
7009
7012
|
// src/viewer/hooks/useExportHandlers.ts
|
|
@@ -7104,21 +7107,21 @@ function useExportHandlers(input) {
|
|
|
7104
7107
|
{
|
|
7105
7108
|
scale: 2,
|
|
7106
7109
|
onProgress: (current, total) => {
|
|
7107
|
-
setExportProgress(
|
|
7108
|
-
setExportStatusMessage(
|
|
7110
|
+
setExportProgress(chunkH74UXL4Q_js.slideProgressPercent(current, total));
|
|
7111
|
+
setExportStatusMessage(chunkH74UXL4Q_js.slideStatusLabel("Rendering", current, total));
|
|
7109
7112
|
},
|
|
7110
7113
|
signal: abortCtrl.signal
|
|
7111
7114
|
}
|
|
7112
7115
|
);
|
|
7113
|
-
setExportProgress(
|
|
7116
|
+
setExportProgress(chunkH74UXL4Q_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7114
7117
|
setExportStatusMessage("Building PDF...");
|
|
7115
7118
|
await new Promise((r) => {
|
|
7116
7119
|
setTimeout(r, 100);
|
|
7117
7120
|
});
|
|
7118
|
-
setExportProgress(
|
|
7121
|
+
setExportProgress(chunkH74UXL4Q_js.EXPORT_DONE_PERCENT);
|
|
7119
7122
|
setExportStatusMessage("Done!");
|
|
7120
7123
|
} catch (err) {
|
|
7121
|
-
if (!
|
|
7124
|
+
if (!chunkH74UXL4Q_js.isExportAbortError(err)) {
|
|
7122
7125
|
console.error("[PowerPointViewer] PDF export failed:", err);
|
|
7123
7126
|
}
|
|
7124
7127
|
} finally {
|
|
@@ -7148,21 +7151,21 @@ function useExportHandlers(input) {
|
|
|
7148
7151
|
{
|
|
7149
7152
|
scale: 2,
|
|
7150
7153
|
onProgress: (current, total) => {
|
|
7151
|
-
setExportProgress(
|
|
7152
|
-
setExportStatusMessage(
|
|
7154
|
+
setExportProgress(chunkH74UXL4Q_js.slideProgressPercent(current, total));
|
|
7155
|
+
setExportStatusMessage(chunkH74UXL4Q_js.slideStatusLabel("Rendering", current, total));
|
|
7153
7156
|
},
|
|
7154
7157
|
signal: abortCtrl.signal
|
|
7155
7158
|
}
|
|
7156
7159
|
);
|
|
7157
|
-
setExportProgress(
|
|
7160
|
+
setExportProgress(chunkH74UXL4Q_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7158
7161
|
setExportStatusMessage("Building PDF...");
|
|
7159
7162
|
await new Promise((r) => {
|
|
7160
7163
|
setTimeout(r, 100);
|
|
7161
7164
|
});
|
|
7162
|
-
setExportProgress(
|
|
7165
|
+
setExportProgress(chunkH74UXL4Q_js.EXPORT_DONE_PERCENT);
|
|
7163
7166
|
setExportStatusMessage("Done!");
|
|
7164
7167
|
} catch (err) {
|
|
7165
|
-
if (!
|
|
7168
|
+
if (!chunkH74UXL4Q_js.isExportAbortError(err)) {
|
|
7166
7169
|
console.error("[PowerPointViewer] Notes PDF export failed:", err);
|
|
7167
7170
|
}
|
|
7168
7171
|
} finally {
|
|
@@ -7203,22 +7206,22 @@ function useExportHandlers(input) {
|
|
|
7203
7206
|
scale: 1,
|
|
7204
7207
|
slideDurationMs: 3e3,
|
|
7205
7208
|
onProgress: (current, total) => {
|
|
7206
|
-
setExportProgress(
|
|
7207
|
-
setExportStatusMessage(
|
|
7209
|
+
setExportProgress(chunkH74UXL4Q_js.slideProgressPercent(current, total, 45));
|
|
7210
|
+
setExportStatusMessage(chunkH74UXL4Q_js.slideStatusLabel("Capturing", current, total));
|
|
7208
7211
|
},
|
|
7209
7212
|
onRecordProgress: (current, total) => {
|
|
7210
|
-
setExportProgress(
|
|
7211
|
-
setExportStatusMessage(
|
|
7213
|
+
setExportProgress(chunkH74UXL4Q_js.recordProgressPercent(current, total));
|
|
7214
|
+
setExportStatusMessage(chunkH74UXL4Q_js.slideStatusLabel("Recording", current, total));
|
|
7212
7215
|
},
|
|
7213
7216
|
signal: abortCtrl.signal
|
|
7214
7217
|
}
|
|
7215
7218
|
);
|
|
7216
|
-
setExportProgress(
|
|
7219
|
+
setExportProgress(chunkH74UXL4Q_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7217
7220
|
setExportStatusMessage("Saving file...");
|
|
7218
7221
|
downloadBlob2(blob, "presentation.webm");
|
|
7219
|
-
setExportProgress(
|
|
7222
|
+
setExportProgress(chunkH74UXL4Q_js.EXPORT_DONE_PERCENT);
|
|
7220
7223
|
} catch (err) {
|
|
7221
|
-
if (!
|
|
7224
|
+
if (!chunkH74UXL4Q_js.isExportAbortError(err)) {
|
|
7222
7225
|
console.error("[PowerPointViewer] Video export failed:", err);
|
|
7223
7226
|
}
|
|
7224
7227
|
} finally {
|
|
@@ -7246,18 +7249,18 @@ function useExportHandlers(input) {
|
|
|
7246
7249
|
scale: 0.5,
|
|
7247
7250
|
slideDurationMs: 2e3,
|
|
7248
7251
|
onProgress: (current, total) => {
|
|
7249
|
-
setExportProgress(
|
|
7250
|
-
setExportStatusMessage(
|
|
7252
|
+
setExportProgress(chunkH74UXL4Q_js.slideProgressPercent(current, total));
|
|
7253
|
+
setExportStatusMessage(chunkH74UXL4Q_js.slideStatusLabel("Encoding", current, total));
|
|
7251
7254
|
},
|
|
7252
7255
|
signal: abortCtrl.signal
|
|
7253
7256
|
}
|
|
7254
7257
|
);
|
|
7255
|
-
setExportProgress(
|
|
7258
|
+
setExportProgress(chunkH74UXL4Q_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7256
7259
|
setExportStatusMessage("Saving file...");
|
|
7257
7260
|
downloadBlob2(blob, "presentation.gif");
|
|
7258
|
-
setExportProgress(
|
|
7261
|
+
setExportProgress(chunkH74UXL4Q_js.EXPORT_DONE_PERCENT);
|
|
7259
7262
|
} catch (err) {
|
|
7260
|
-
if (!
|
|
7263
|
+
if (!chunkH74UXL4Q_js.isExportAbortError(err)) {
|
|
7261
7264
|
console.error("[PowerPointViewer] GIF export failed:", err);
|
|
7262
7265
|
}
|
|
7263
7266
|
} finally {
|
|
@@ -7297,7 +7300,7 @@ function openPrintWindow(title, bodyHtml, orientation, colorFilter, frameSlides)
|
|
|
7297
7300
|
}
|
|
7298
7301
|
printWindow.document.open();
|
|
7299
7302
|
printWindow.document.write(
|
|
7300
|
-
|
|
7303
|
+
chunkH74UXL4Q_js.buildPrintHtmlDocument({ title, bodyHtml, orientation, colorFilter, frameSlides })
|
|
7301
7304
|
);
|
|
7302
7305
|
printWindow.document.close();
|
|
7303
7306
|
printWindow.focus();
|
|
@@ -7358,7 +7361,7 @@ function usePrintHandlers(input) {
|
|
|
7358
7361
|
if (svgs.length === 0) {
|
|
7359
7362
|
return;
|
|
7360
7363
|
}
|
|
7361
|
-
const printDoc =
|
|
7364
|
+
const printDoc = chunkH74UXL4Q_js.buildPrintDocument(svgs, pptxData.width, pptxData.height, {
|
|
7362
7365
|
title: "Slides (Vector)",
|
|
7363
7366
|
orientation: settings.orientation,
|
|
7364
7367
|
colorFilter
|
|
@@ -7394,7 +7397,7 @@ function usePrintHandlers(input) {
|
|
|
7394
7397
|
if (settings.printWhat === "outline") {
|
|
7395
7398
|
openPrintWindow(
|
|
7396
7399
|
"Outline",
|
|
7397
|
-
`<div class="outline-page">${
|
|
7400
|
+
`<div class="outline-page">${chunkH74UXL4Q_js.buildOutlineHtml(slideIndices, slides)}</div>`,
|
|
7398
7401
|
settings.orientation,
|
|
7399
7402
|
colorFilter,
|
|
7400
7403
|
settings.frameSlides
|
|
@@ -7419,7 +7422,7 @@ function usePrintHandlers(input) {
|
|
|
7419
7422
|
if (settings.printWhat === "slides") {
|
|
7420
7423
|
openPrintWindow(
|
|
7421
7424
|
"Slides",
|
|
7422
|
-
|
|
7425
|
+
chunkH74UXL4Q_js.buildSlidesHtml(slideImages, slideIndices),
|
|
7423
7426
|
settings.orientation,
|
|
7424
7427
|
colorFilter,
|
|
7425
7428
|
settings.frameSlides
|
|
@@ -7429,7 +7432,7 @@ function usePrintHandlers(input) {
|
|
|
7429
7432
|
if (settings.printWhat === "notes") {
|
|
7430
7433
|
openPrintWindow(
|
|
7431
7434
|
"Notes Pages",
|
|
7432
|
-
|
|
7435
|
+
chunkH74UXL4Q_js.buildNotesHtml(slideImages, slideIndices, slides),
|
|
7433
7436
|
"portrait",
|
|
7434
7437
|
colorFilter,
|
|
7435
7438
|
settings.frameSlides
|
|
@@ -7440,7 +7443,7 @@ function usePrintHandlers(input) {
|
|
|
7440
7443
|
const spp = settings.slidesPerPage;
|
|
7441
7444
|
openPrintWindow(
|
|
7442
7445
|
`Handout ${spp} per page`,
|
|
7443
|
-
|
|
7446
|
+
chunkH74UXL4Q_js.buildHandoutsHtml(slideImages, slideIndices, spp),
|
|
7444
7447
|
"portrait",
|
|
7445
7448
|
colorFilter,
|
|
7446
7449
|
settings.frameSlides
|
|
@@ -7504,8 +7507,8 @@ function useThemeHandlers(input) {
|
|
|
7504
7507
|
return;
|
|
7505
7508
|
}
|
|
7506
7509
|
await handler.updateThemeColorScheme(colorScheme);
|
|
7507
|
-
const previousMap = theme?.colorScheme ?
|
|
7508
|
-
setSlides((prev) =>
|
|
7510
|
+
const previousMap = theme?.colorScheme ? chunkH74UXL4Q_js.buildThemeColorMap(theme.colorScheme) : {};
|
|
7511
|
+
setSlides((prev) => chunkH74UXL4Q_js.reResolveSlideColors(prev, previousMap, colorScheme));
|
|
7509
7512
|
setTheme((prev) => prev ? { ...prev, colorScheme } : { colorScheme });
|
|
7510
7513
|
bumpHistory();
|
|
7511
7514
|
history.markDirty();
|
|
@@ -7610,7 +7613,7 @@ function useThemeSwitching(input) {
|
|
|
7610
7613
|
}
|
|
7611
7614
|
try {
|
|
7612
7615
|
await handler.applyTheme(preset.colorScheme, preset.fontScheme, preset.name);
|
|
7613
|
-
const newData =
|
|
7616
|
+
const newData = chunkH74UXL4Q_js.applyThemeToData(data, preset.colorScheme, preset.fontScheme, preset.name);
|
|
7614
7617
|
onDataChange(newData);
|
|
7615
7618
|
onThemeChanged?.(preset);
|
|
7616
7619
|
} catch (error) {
|
|
@@ -7627,7 +7630,7 @@ function useThemeSwitching(input) {
|
|
|
7627
7630
|
}
|
|
7628
7631
|
try {
|
|
7629
7632
|
await handler.applyTheme(colorScheme, fontScheme ?? {}, themeName);
|
|
7630
|
-
const newData =
|
|
7633
|
+
const newData = chunkH74UXL4Q_js.applyThemeToData(data, colorScheme, fontScheme, themeName);
|
|
7631
7634
|
onDataChange(newData);
|
|
7632
7635
|
} catch (error) {
|
|
7633
7636
|
console.error("Failed to switch to custom theme:", error);
|
|
@@ -7639,12 +7642,12 @@ function useThemeSwitching(input) {
|
|
|
7639
7642
|
if (!data?.theme?.colorScheme) {
|
|
7640
7643
|
return void 0;
|
|
7641
7644
|
}
|
|
7642
|
-
return
|
|
7643
|
-
(p) =>
|
|
7645
|
+
return chunkH74UXL4Q_js.THEME_PRESETS.find(
|
|
7646
|
+
(p) => chunkH74UXL4Q_js.themeColorSchemesEqual(data.theme?.colorScheme, p.colorScheme)
|
|
7644
7647
|
);
|
|
7645
7648
|
}, [data?.theme?.colorScheme]);
|
|
7646
7649
|
return {
|
|
7647
|
-
presets:
|
|
7650
|
+
presets: chunkH74UXL4Q_js.THEME_PRESETS,
|
|
7648
7651
|
switchToPreset,
|
|
7649
7652
|
switchToCustom,
|
|
7650
7653
|
currentPreset
|
|
@@ -7719,7 +7722,7 @@ function usePropertyHandlers(input) {
|
|
|
7719
7722
|
}
|
|
7720
7723
|
try {
|
|
7721
7724
|
const ab = await file.arrayBuffer();
|
|
7722
|
-
const h = new
|
|
7725
|
+
const h = new chunkH74UXL4Q_js.PptxHandler();
|
|
7723
7726
|
const other = await h.load(ab);
|
|
7724
7727
|
if (!other) {
|
|
7725
7728
|
return;
|
|
@@ -7729,7 +7732,7 @@ function usePropertyHandlers(input) {
|
|
|
7729
7732
|
width: canvasSize.width,
|
|
7730
7733
|
height: canvasSize.height
|
|
7731
7734
|
};
|
|
7732
|
-
setCompareResult(
|
|
7735
|
+
setCompareResult(chunkH74UXL4Q_js.comparePresentation(cur, other));
|
|
7733
7736
|
setIsComparePanelOpen(true);
|
|
7734
7737
|
} catch (err) {
|
|
7735
7738
|
console.warn("Compare failed:", err);
|
|
@@ -7746,7 +7749,7 @@ function usePropertyHandlers(input) {
|
|
|
7746
7749
|
if (!diff || diff.status === "unchanged") {
|
|
7747
7750
|
return;
|
|
7748
7751
|
}
|
|
7749
|
-
setSlides((prev) =>
|
|
7752
|
+
setSlides((prev) => chunkH74UXL4Q_js.applyAcceptSlide(prev, diff));
|
|
7750
7753
|
setIsDirty(true);
|
|
7751
7754
|
},
|
|
7752
7755
|
[compareResult, setSlides, setIsDirty]
|
|
@@ -7757,10 +7760,10 @@ function usePropertyHandlers(input) {
|
|
|
7757
7760
|
if (!compareResult) {
|
|
7758
7761
|
return;
|
|
7759
7762
|
}
|
|
7760
|
-
setSlides((prev) =>
|
|
7763
|
+
setSlides((prev) => chunkH74UXL4Q_js.applyAcceptAllSlides(prev, compareResult));
|
|
7761
7764
|
setIsDirty(true);
|
|
7762
7765
|
}, [compareResult, setSlides, setIsDirty]);
|
|
7763
|
-
const usedFontFamilies = react.useMemo(() =>
|
|
7766
|
+
const usedFontFamilies = react.useMemo(() => chunkH74UXL4Q_js.collectUsedFonts(slides), [slides]);
|
|
7764
7767
|
return {
|
|
7765
7768
|
handleUpdateNotes,
|
|
7766
7769
|
handleUpdateSlide,
|
|
@@ -7879,7 +7882,7 @@ function useIsMobile(input) {
|
|
|
7879
7882
|
const containerRef = input?.containerRef;
|
|
7880
7883
|
const isTouchDevice = react.useSyncExternalStore(
|
|
7881
7884
|
subscribeTouchCapability,
|
|
7882
|
-
|
|
7885
|
+
chunkH74UXL4Q_js.detectTouchDevice,
|
|
7883
7886
|
() => false
|
|
7884
7887
|
// server snapshot
|
|
7885
7888
|
);
|
|
@@ -7895,7 +7898,7 @@ function useIsMobile(input) {
|
|
|
7895
7898
|
}
|
|
7896
7899
|
return containerRef?.current?.clientHeight ?? window.innerHeight;
|
|
7897
7900
|
});
|
|
7898
|
-
const [orientation, setOrientation] = react.useState(
|
|
7901
|
+
const [orientation, setOrientation] = react.useState(chunkH74UXL4Q_js.detectOrientation);
|
|
7899
7902
|
const [isVirtualKeyboardOpen, setIsVirtualKeyboardOpen] = react.useState(false);
|
|
7900
7903
|
const [initialViewportHeight] = react.useState(
|
|
7901
7904
|
() => typeof window !== "undefined" ? window.innerHeight : 800
|
|
@@ -7939,7 +7942,7 @@ function useIsMobile(input) {
|
|
|
7939
7942
|
return;
|
|
7940
7943
|
}
|
|
7941
7944
|
const handleOrientationChange = () => {
|
|
7942
|
-
setOrientation(
|
|
7945
|
+
setOrientation(chunkH74UXL4Q_js.detectOrientation());
|
|
7943
7946
|
};
|
|
7944
7947
|
if (screen.orientation) {
|
|
7945
7948
|
screen.orientation.addEventListener("change", handleOrientationChange);
|
|
@@ -7969,9 +7972,9 @@ function useIsMobile(input) {
|
|
|
7969
7972
|
window.addEventListener("resize", handleResize);
|
|
7970
7973
|
return () => window.removeEventListener("resize", handleResize);
|
|
7971
7974
|
}, [isTouchDevice, initialViewportHeight]);
|
|
7972
|
-
const isMobile =
|
|
7973
|
-
const isTablet = !isMobile && containerWidth >=
|
|
7974
|
-
const isDesktop = !isMobile && containerWidth >=
|
|
7975
|
+
const isMobile = chunkH74UXL4Q_js.isMobileViewport(containerWidth, containerHeight, isTouchDevice);
|
|
7976
|
+
const isTablet = !isMobile && containerWidth >= chunkH74UXL4Q_js.MOBILE_BREAKPOINT && containerWidth < chunkH74UXL4Q_js.TABLET_BREAKPOINT;
|
|
7977
|
+
const isDesktop = !isMobile && containerWidth >= chunkH74UXL4Q_js.TABLET_BREAKPOINT;
|
|
7975
7978
|
return {
|
|
7976
7979
|
isMobile,
|
|
7977
7980
|
isTablet,
|
|
@@ -8032,11 +8035,11 @@ function useViewerDialogs(input) {
|
|
|
8032
8035
|
);
|
|
8033
8036
|
const [embedFontsEnabled, setEmbedFontsEnabled] = react.useState(false);
|
|
8034
8037
|
const [isNarrowViewport, setIsNarrowViewport] = react.useState(
|
|
8035
|
-
() => typeof window !== "undefined" ?
|
|
8038
|
+
() => typeof window !== "undefined" ? chunkH74UXL4Q_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch()) : false
|
|
8036
8039
|
);
|
|
8037
8040
|
react.useEffect(() => {
|
|
8038
8041
|
const handleWindow = () => setIsNarrowViewport(
|
|
8039
|
-
|
|
8042
|
+
chunkH74UXL4Q_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch())
|
|
8040
8043
|
);
|
|
8041
8044
|
let observer = null;
|
|
8042
8045
|
let raf = 0;
|
|
@@ -8050,12 +8053,12 @@ function useViewerDialogs(input) {
|
|
|
8050
8053
|
const entry = entries[0];
|
|
8051
8054
|
if (entry) {
|
|
8052
8055
|
setIsNarrowViewport(
|
|
8053
|
-
|
|
8056
|
+
chunkH74UXL4Q_js.isMobileViewport(entry.contentRect.width, entry.contentRect.height, viewportIsTouch())
|
|
8054
8057
|
);
|
|
8055
8058
|
}
|
|
8056
8059
|
});
|
|
8057
8060
|
observer.observe(el);
|
|
8058
|
-
setIsNarrowViewport(
|
|
8061
|
+
setIsNarrowViewport(chunkH74UXL4Q_js.isMobileViewport(el.clientWidth, el.clientHeight, viewportIsTouch()));
|
|
8059
8062
|
};
|
|
8060
8063
|
attach();
|
|
8061
8064
|
window.addEventListener("resize", handleWindow);
|
|
@@ -8213,12 +8216,12 @@ function useViewerDialogs(input) {
|
|
|
8213
8216
|
}
|
|
8214
8217
|
function computeGridSpacingPx(presentationGridSpacing) {
|
|
8215
8218
|
if (presentationGridSpacing) {
|
|
8216
|
-
const px = Math.round(presentationGridSpacing.cx /
|
|
8219
|
+
const px = Math.round(presentationGridSpacing.cx / chunkIJVDNQLG_js.EMU_PER_PX);
|
|
8217
8220
|
if (px > 0) {
|
|
8218
8221
|
return px;
|
|
8219
8222
|
}
|
|
8220
8223
|
}
|
|
8221
|
-
return
|
|
8224
|
+
return chunkIJVDNQLG_js.GRID_SIZE;
|
|
8222
8225
|
}
|
|
8223
8226
|
function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows) {
|
|
8224
8227
|
if (activeCustomShowId) {
|
|
@@ -8232,8 +8235,8 @@ function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows) {
|
|
|
8232
8235
|
return slides.map((_, i) => i).filter((i) => !slides[i]?.hidden);
|
|
8233
8236
|
}
|
|
8234
8237
|
function computeSlideSectionGroups(slides, sections) {
|
|
8235
|
-
return
|
|
8236
|
-
id: group.section?.id ?? (sections.length > 0 ?
|
|
8238
|
+
return chunkH74UXL4Q_js.groupSlidesBySection(sections, slides).map((group) => ({
|
|
8239
|
+
id: group.section?.id ?? (sections.length > 0 ? chunkIJVDNQLG_js.UNGROUPED_SECTION_ID : "default"),
|
|
8237
8240
|
label: group.section?.name ?? (sections.length > 0 ? "Ungrouped Slides" : "Slides"),
|
|
8238
8241
|
slideIndexes: group.slideIndexes,
|
|
8239
8242
|
...group.section?.color !== void 0 ? { color: group.section.color } : {},
|
|
@@ -8288,7 +8291,7 @@ function useDerivedSlideState(input) {
|
|
|
8288
8291
|
);
|
|
8289
8292
|
const slideSectionGroups = react.useMemo(
|
|
8290
8293
|
() => computeSlideSectionGroups(slides, sections).map((group) => {
|
|
8291
|
-
if (group.id ===
|
|
8294
|
+
if (group.id === chunkIJVDNQLG_js.UNGROUPED_SECTION_ID && group.label === "Ungrouped Slides") {
|
|
8292
8295
|
return { ...group, label: t("pptx.slides.ungroupedSlides") };
|
|
8293
8296
|
}
|
|
8294
8297
|
if (group.id === "default" && group.label === "Slides") {
|
|
@@ -8391,13 +8394,13 @@ function useAnnotationHandlers(input) {
|
|
|
8391
8394
|
}, [annotations, setMode, setSlides, history]);
|
|
8392
8395
|
const handleSetMode = react.useCallback(
|
|
8393
8396
|
(nextMode) => {
|
|
8394
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8397
|
+
if (mode === "present" && nextMode !== "present" && !chunkH74UXL4Q_js.mayLeaveSlideShow()) {
|
|
8395
8398
|
return;
|
|
8396
8399
|
}
|
|
8397
8400
|
if (nextMode === "present") {
|
|
8398
8401
|
presentation.enterPresentMode();
|
|
8399
8402
|
} else if (mode === "present" && annotations.hasAnyAnnotations) {
|
|
8400
|
-
|
|
8403
|
+
chunkIJVDNQLG_js.stopAllPersistentAudio();
|
|
8401
8404
|
pendingModeAfterAnnotationsRef.current = nextMode;
|
|
8402
8405
|
if (promptKeepInkAnnotations) {
|
|
8403
8406
|
setShowKeepAnnotationsDialog(true);
|
|
@@ -8406,7 +8409,7 @@ function useAnnotationHandlers(input) {
|
|
|
8406
8409
|
}
|
|
8407
8410
|
} else {
|
|
8408
8411
|
if (mode === "present") {
|
|
8409
|
-
|
|
8412
|
+
chunkIJVDNQLG_js.stopAllPersistentAudio();
|
|
8410
8413
|
}
|
|
8411
8414
|
setMode(nextMode);
|
|
8412
8415
|
}
|
|
@@ -8472,13 +8475,13 @@ function useSerialize(input) {
|
|
|
8472
8475
|
let processedSlide = slide;
|
|
8473
8476
|
if (pendingEditId) {
|
|
8474
8477
|
const updatedElements = slide.elements.map((el) => {
|
|
8475
|
-
if (el.id !== pendingEditId || !
|
|
8478
|
+
if (el.id !== pendingEditId || !chunkH74UXL4Q_js.hasTextProperties(el)) {
|
|
8476
8479
|
return el;
|
|
8477
8480
|
}
|
|
8478
8481
|
return {
|
|
8479
8482
|
...el,
|
|
8480
8483
|
text: pendingEditText,
|
|
8481
|
-
textSegments:
|
|
8484
|
+
textSegments: chunkH74UXL4Q_js.remapTextToSegments(pendingEditText, el.textSegments, el.textStyle)
|
|
8482
8485
|
};
|
|
8483
8486
|
});
|
|
8484
8487
|
if (updatedElements.some((el, i) => el !== slide.elements[i])) {
|
|
@@ -8491,14 +8494,14 @@ function useSerialize(input) {
|
|
|
8491
8494
|
const pptxGuides = guides.map((g) => ({
|
|
8492
8495
|
id: g.id,
|
|
8493
8496
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
8494
|
-
positionEmu:
|
|
8497
|
+
positionEmu: chunkH74UXL4Q_js.guidePxToEmu(g.position)
|
|
8495
8498
|
}));
|
|
8496
8499
|
return {
|
|
8497
8500
|
...processedSlide,
|
|
8498
8501
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
8499
8502
|
};
|
|
8500
8503
|
});
|
|
8501
|
-
const slidesToSave =
|
|
8504
|
+
const slidesToSave = chunkIJVDNQLG_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
8502
8505
|
const saveOptions = {
|
|
8503
8506
|
headerFooter,
|
|
8504
8507
|
presentationProperties,
|
|
@@ -8667,7 +8670,7 @@ function usePresentationSetup(input) {
|
|
|
8667
8670
|
containerRef,
|
|
8668
8671
|
content,
|
|
8669
8672
|
onSetMode: (nextMode) => {
|
|
8670
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8673
|
+
if (mode === "present" && nextMode !== "present" && !chunkH74UXL4Q_js.mayLeaveSlideShow()) {
|
|
8671
8674
|
return;
|
|
8672
8675
|
}
|
|
8673
8676
|
if (mode === "present" && nextMode !== "present" && annotations.hasAnyAnnotations && promptKeepInkAnnotations) {
|
|
@@ -8675,7 +8678,7 @@ function usePresentationSetup(input) {
|
|
|
8675
8678
|
setShowKeepAnnotationsDialog(true);
|
|
8676
8679
|
} else {
|
|
8677
8680
|
if (mode === "present" && nextMode !== "present") {
|
|
8678
|
-
|
|
8681
|
+
chunkIJVDNQLG_js.stopAllPersistentAudio();
|
|
8679
8682
|
stopAnimationSound();
|
|
8680
8683
|
}
|
|
8681
8684
|
setMode(nextMode);
|
|
@@ -8729,10 +8732,10 @@ function usePresentationSetup(input) {
|
|
|
8729
8732
|
onToggleInkMarkup: () => annotations.setInkMarkupVisible(!annotations.inkMarkupVisible),
|
|
8730
8733
|
onToggleToolbar: () => annotations.setToolbarVisible(!annotations.toolbarVisible),
|
|
8731
8734
|
onSaveRehearsalTimings: (timings) => {
|
|
8732
|
-
setSlides((prev) =>
|
|
8735
|
+
setSlides((prev) => chunkH74UXL4Q_js.applyRehearsalTimings(prev, timings));
|
|
8733
8736
|
history.markDirty();
|
|
8734
8737
|
},
|
|
8735
|
-
loopContinuously:
|
|
8738
|
+
loopContinuously: chunkH74UXL4Q_js.shouldLoopContinuously(presentationProperties),
|
|
8736
8739
|
showWithAnimation: presentationProperties.showWithAnimation,
|
|
8737
8740
|
useTimings: presentationProperties.advanceMode !== "manual",
|
|
8738
8741
|
endWithBlackSlide
|
|
@@ -8894,7 +8897,7 @@ function useEditorOperations(input) {
|
|
|
8894
8897
|
const { formatPainterActive, setFormatPainterActive, elementLookup } = state;
|
|
8895
8898
|
react.useEffect(() => {
|
|
8896
8899
|
if (formatPainterActive && !prevFormatPainterRef.current && selectedElement) {
|
|
8897
|
-
copiedFormatRef.current =
|
|
8900
|
+
copiedFormatRef.current = chunkH74UXL4Q_js.copyFormatFromElement(selectedElement);
|
|
8898
8901
|
} else if (!formatPainterActive) {
|
|
8899
8902
|
copiedFormatRef.current = null;
|
|
8900
8903
|
}
|
|
@@ -8920,12 +8923,12 @@ function useEditorOperations(input) {
|
|
|
8920
8923
|
e.stopPropagation();
|
|
8921
8924
|
const element = elementLookup.get(elementId);
|
|
8922
8925
|
if (element) {
|
|
8923
|
-
const updated =
|
|
8926
|
+
const updated = chunkH74UXL4Q_js.applyFormatToElement(element, copiedFormatRef.current);
|
|
8924
8927
|
const updates = {};
|
|
8925
|
-
if (
|
|
8928
|
+
if (chunkH74UXL4Q_js.hasShapeProperties(updated)) {
|
|
8926
8929
|
updates.shapeStyle = updated.shapeStyle;
|
|
8927
8930
|
}
|
|
8928
|
-
if (
|
|
8931
|
+
if (chunkH74UXL4Q_js.hasTextProperties(updated)) {
|
|
8929
8932
|
updates.textStyle = updated.textStyle;
|
|
8930
8933
|
}
|
|
8931
8934
|
ops.updateElementById(elementId, updates);
|
|
@@ -9072,7 +9075,7 @@ function collectReferencedFontFamilies(slides) {
|
|
|
9072
9075
|
const families = /* @__PURE__ */ new Set();
|
|
9073
9076
|
for (const slide of slides) {
|
|
9074
9077
|
for (const el of slide.elements) {
|
|
9075
|
-
if (
|
|
9078
|
+
if (chunkH74UXL4Q_js.hasTextProperties(el) && el.textSegments) {
|
|
9076
9079
|
for (const seg of el.textSegments) {
|
|
9077
9080
|
if (seg.style.fontFamily) {
|
|
9078
9081
|
families.add(seg.style.fontFamily);
|
|
@@ -9284,13 +9287,13 @@ function useKeyboardShortcuts(input) {
|
|
|
9284
9287
|
inputRef.current = input;
|
|
9285
9288
|
const handleKeyDown = react.useCallback((e) => {
|
|
9286
9289
|
const current = inputRef.current;
|
|
9287
|
-
const { action, dx, dy } =
|
|
9290
|
+
const { action, dx, dy } = chunkH74UXL4Q_js.mapEditorKey(e, {
|
|
9288
9291
|
canEdit: current.canEdit,
|
|
9289
9292
|
isPresenting: current.mode !== "edit",
|
|
9290
9293
|
hasSelection: current.hasSelection,
|
|
9291
9294
|
isEditingText: Boolean(current.inlineEditingElementId || current.tableEditorState?.isEditing),
|
|
9292
9295
|
isDrawing: current.activeTool !== "select",
|
|
9293
|
-
isTextInputTarget:
|
|
9296
|
+
isTextInputTarget: chunkH74UXL4Q_js.isEditorTextInputTarget(e.target)
|
|
9294
9297
|
});
|
|
9295
9298
|
if (action === null) {
|
|
9296
9299
|
return;
|
|
@@ -9583,7 +9586,7 @@ function useViewerIntegration(input) {
|
|
|
9583
9586
|
return zoom.scale;
|
|
9584
9587
|
},
|
|
9585
9588
|
setZoom(level) {
|
|
9586
|
-
zoom.setScale(
|
|
9589
|
+
zoom.setScale(chunkH74UXL4Q_js.clampZoomScale(level));
|
|
9587
9590
|
},
|
|
9588
9591
|
zoomIn() {
|
|
9589
9592
|
zoom.handleZoomIn();
|
|
@@ -9798,7 +9801,7 @@ function useReducedMotion() {
|
|
|
9798
9801
|
}
|
|
9799
9802
|
function useViewerOptions() {
|
|
9800
9803
|
const storeRef = react.useRef(null);
|
|
9801
|
-
storeRef.current ??=
|
|
9804
|
+
storeRef.current ??= chunkH74UXL4Q_js.createViewerOptionsStore();
|
|
9802
9805
|
const store = storeRef.current;
|
|
9803
9806
|
const options = react.useSyncExternalStore(
|
|
9804
9807
|
(onStoreChange) => store.subscribe(onStoreChange),
|
|
@@ -9807,9 +9810,9 @@ function useViewerOptions() {
|
|
|
9807
9810
|
);
|
|
9808
9811
|
return { optionsStore: store, options };
|
|
9809
9812
|
}
|
|
9810
|
-
var KNOWN_TAB_IDS = new Set(
|
|
9813
|
+
var KNOWN_TAB_IDS = new Set(chunkH74UXL4Q_js.TOOLBAR_TABS.map((tab) => tab.id));
|
|
9811
9814
|
function computeToolbarVisibility(hiddenActions) {
|
|
9812
|
-
const isHidden = (id) =>
|
|
9815
|
+
const isHidden = (id) => chunkH74UXL4Q_js.isActionHidden(id, hiddenActions);
|
|
9813
9816
|
const isTabVisible = (id) => !KNOWN_TAB_IDS.has(id) || !isHidden(id);
|
|
9814
9817
|
return { isHidden, isTabVisible };
|
|
9815
9818
|
}
|
|
@@ -9894,12 +9897,12 @@ function useYjsDocumentSync({
|
|
|
9894
9897
|
return;
|
|
9895
9898
|
}
|
|
9896
9899
|
try {
|
|
9897
|
-
const handler = new
|
|
9900
|
+
const handler = new chunkH74UXL4Q_js.PptxHandler();
|
|
9898
9901
|
await handler.load(sourceBytes.buffer);
|
|
9899
|
-
const currentSlides =
|
|
9902
|
+
const currentSlides = chunkH74UXL4Q_js.readSlidesFromYDoc(
|
|
9900
9903
|
doc
|
|
9901
9904
|
);
|
|
9902
|
-
const slidesToSave =
|
|
9905
|
+
const slidesToSave = chunkIJVDNQLG_js.buildSaveSlides(currentSlides, templateElementsBySlideId);
|
|
9903
9906
|
const bytes = await handler.save(slidesToSave);
|
|
9904
9907
|
config.onWriteBack(bytes);
|
|
9905
9908
|
} catch {
|
|
@@ -9914,7 +9917,7 @@ function useYjsDocumentSync({
|
|
|
9914
9917
|
if (!doc || !isConnected) {
|
|
9915
9918
|
return;
|
|
9916
9919
|
}
|
|
9917
|
-
const docSlides =
|
|
9920
|
+
const docSlides = chunkH74UXL4Q_js.readSlidesFromYDoc(
|
|
9918
9921
|
doc
|
|
9919
9922
|
);
|
|
9920
9923
|
if (docSlides.length === 0) {
|
|
@@ -9936,11 +9939,11 @@ function useYjsDocumentSync({
|
|
|
9936
9939
|
lastSyncedRef.current = serialized;
|
|
9937
9940
|
void (async () => {
|
|
9938
9941
|
const factories = await getFactories();
|
|
9939
|
-
|
|
9942
|
+
chunkH74UXL4Q_js.reconcileSlidesInYDoc(
|
|
9940
9943
|
slides,
|
|
9941
9944
|
doc,
|
|
9942
9945
|
factories,
|
|
9943
|
-
|
|
9946
|
+
chunkH74UXL4Q_js.LOCAL_SYNC_ORIGIN
|
|
9944
9947
|
);
|
|
9945
9948
|
scheduleWriteBack();
|
|
9946
9949
|
})();
|
|
@@ -9954,10 +9957,10 @@ function useYjsDocumentSync({
|
|
|
9954
9957
|
return;
|
|
9955
9958
|
}
|
|
9956
9959
|
const handleChange = (_events, transaction) => {
|
|
9957
|
-
if (transaction?.origin ===
|
|
9960
|
+
if (transaction?.origin === chunkH74UXL4Q_js.LOCAL_SYNC_ORIGIN) {
|
|
9958
9961
|
return;
|
|
9959
9962
|
}
|
|
9960
|
-
const remoteSlides =
|
|
9963
|
+
const remoteSlides = chunkH74UXL4Q_js.readSlidesFromYDoc(
|
|
9961
9964
|
doc
|
|
9962
9965
|
);
|
|
9963
9966
|
if (remoteSlides.length === 0) {
|
|
@@ -9973,7 +9976,7 @@ function useYjsDocumentSync({
|
|
|
9973
9976
|
isApplyingRemoteRef.current = false;
|
|
9974
9977
|
scheduleWriteBack();
|
|
9975
9978
|
};
|
|
9976
|
-
const unobserve =
|
|
9979
|
+
const unobserve = chunkH74UXL4Q_js.observeYDocSlides(
|
|
9977
9980
|
doc,
|
|
9978
9981
|
handleChange
|
|
9979
9982
|
);
|
|
@@ -10011,7 +10014,7 @@ function useBroadcastFollower({
|
|
|
10011
10014
|
if (!broadcaster) {
|
|
10012
10015
|
return;
|
|
10013
10016
|
}
|
|
10014
|
-
if (!
|
|
10017
|
+
if (!chunkH74UXL4Q_js.shouldAutoFollowBroadcaster({
|
|
10015
10018
|
localRole: collab.config.role,
|
|
10016
10019
|
broadcasterRole: broadcaster.role
|
|
10017
10020
|
})) {
|
|
@@ -10171,10 +10174,10 @@ function useTouchGestures(input) {
|
|
|
10171
10174
|
if (!el || !enabled) {
|
|
10172
10175
|
return;
|
|
10173
10176
|
}
|
|
10174
|
-
const recognizer =
|
|
10177
|
+
const recognizer = chunkH74UXL4Q_js.createTouchGestureRecognizer({
|
|
10175
10178
|
getScale: () => scaleRef.current,
|
|
10176
|
-
minScale:
|
|
10177
|
-
maxScale:
|
|
10179
|
+
minScale: chunkH74UXL4Q_js.MIN_ZOOM_SCALE,
|
|
10180
|
+
maxScale: chunkH74UXL4Q_js.MAX_ZOOM_SCALE,
|
|
10178
10181
|
callbacks: {
|
|
10179
10182
|
onPinchZoom: (newScale) => callbacksRef.current.onPinchZoom?.(newScale),
|
|
10180
10183
|
onSwipe: (direction) => callbacksRef.current.onSwipe?.(direction),
|
|
@@ -10214,7 +10217,7 @@ function scrollFocusedIntoView(keyboardInset) {
|
|
|
10214
10217
|
return;
|
|
10215
10218
|
}
|
|
10216
10219
|
const rect = active.getBoundingClientRect();
|
|
10217
|
-
const delta =
|
|
10220
|
+
const delta = chunkH74UXL4Q_js.computeScrollDelta(
|
|
10218
10221
|
{ top: rect.top, bottom: rect.bottom },
|
|
10219
10222
|
window.innerHeight,
|
|
10220
10223
|
keyboardInset
|
|
@@ -10234,8 +10237,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10234
10237
|
return;
|
|
10235
10238
|
}
|
|
10236
10239
|
const update = () => {
|
|
10237
|
-
const metrics =
|
|
10238
|
-
const inset = metrics ?
|
|
10240
|
+
const metrics = chunkH74UXL4Q_js.readViewportMetrics(window);
|
|
10241
|
+
const inset = metrics ? chunkH74UXL4Q_js.computeKeyboardInset(metrics) : 0;
|
|
10239
10242
|
setKeyboardInset(inset);
|
|
10240
10243
|
if (inset > 0) {
|
|
10241
10244
|
window.requestAnimationFrame(() => scrollFocusedIntoView(inset));
|
|
@@ -10246,8 +10249,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10246
10249
|
vv.addEventListener("scroll", update);
|
|
10247
10250
|
const onFocusIn = () => {
|
|
10248
10251
|
window.requestAnimationFrame(() => {
|
|
10249
|
-
const metrics =
|
|
10250
|
-
const inset = metrics ?
|
|
10252
|
+
const metrics = chunkH74UXL4Q_js.readViewportMetrics(window);
|
|
10253
|
+
const inset = metrics ? chunkH74UXL4Q_js.computeKeyboardInset(metrics) : 0;
|
|
10251
10254
|
if (inset > 0) {
|
|
10252
10255
|
scrollFocusedIntoView(inset);
|
|
10253
10256
|
}
|
|
@@ -10260,7 +10263,7 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10260
10263
|
document.removeEventListener("focusin", onFocusIn);
|
|
10261
10264
|
};
|
|
10262
10265
|
}, [enabled]);
|
|
10263
|
-
return { keyboardInset, isKeyboardOpen:
|
|
10266
|
+
return { keyboardInset, isKeyboardOpen: chunkH74UXL4Q_js.isKeyboardOpen(keyboardInset) };
|
|
10264
10267
|
}
|
|
10265
10268
|
|
|
10266
10269
|
// src/viewer/hooks/useViewerBuildingBlocks-canvas-props.ts
|
|
@@ -10287,7 +10290,7 @@ function buildCanvasProps(input) {
|
|
|
10287
10290
|
} = input;
|
|
10288
10291
|
const effectiveSlide = mode === "master" ? masterPseudoSlide : activeSlide;
|
|
10289
10292
|
const effectiveTemplateElements = mode === "master" ? s.activeLayout ? s.activeMaster?.elements ?? [] : [] : templateElements;
|
|
10290
|
-
const fieldContext =
|
|
10293
|
+
const fieldContext = chunkH74UXL4Q_js.buildFieldSubstitutionContext({
|
|
10291
10294
|
headerFooter: s.headerFooter,
|
|
10292
10295
|
customProperties: s.customProperties,
|
|
10293
10296
|
slide: activeSlide
|
|
@@ -10297,13 +10300,13 @@ function buildCanvasProps(input) {
|
|
|
10297
10300
|
if (mode === "present") {
|
|
10298
10301
|
presentation.handlePresentationAction(action);
|
|
10299
10302
|
} else if (action.url) {
|
|
10300
|
-
|
|
10303
|
+
chunkH74UXL4Q_js.safeOpenUrl(action.url);
|
|
10301
10304
|
}
|
|
10302
10305
|
};
|
|
10303
10306
|
const handleHyperlinkClick = (url) => {
|
|
10304
|
-
if (
|
|
10307
|
+
if (chunkH74UXL4Q_js.isPpactionUrl(url)) {
|
|
10305
10308
|
if (mode === "present") {
|
|
10306
|
-
const parsed =
|
|
10309
|
+
const parsed = chunkH74UXL4Q_js.parsePpactionUrl(url);
|
|
10307
10310
|
if (parsed) {
|
|
10308
10311
|
presentation.handlePresentationAction({
|
|
10309
10312
|
action: parsed.action,
|
|
@@ -10313,7 +10316,7 @@ function buildCanvasProps(input) {
|
|
|
10313
10316
|
}
|
|
10314
10317
|
return;
|
|
10315
10318
|
}
|
|
10316
|
-
|
|
10319
|
+
chunkH74UXL4Q_js.safeOpenUrl(url);
|
|
10317
10320
|
};
|
|
10318
10321
|
return {
|
|
10319
10322
|
activeSlide: effectiveSlide,
|
|
@@ -10643,7 +10646,7 @@ function buildToolbarProps(input) {
|
|
|
10643
10646
|
onOpenFile,
|
|
10644
10647
|
onOpenRecentFile,
|
|
10645
10648
|
onCreatePresentation: (templateId) => {
|
|
10646
|
-
s.setSlides(
|
|
10649
|
+
s.setSlides(chunkH74UXL4Q_js.createBackstagePresentation(templateId));
|
|
10647
10650
|
s.setActiveSlideIndex(0);
|
|
10648
10651
|
s.setSelectedElementId(null);
|
|
10649
10652
|
s.setSelectedElementIds([]);
|
|
@@ -10661,6 +10664,7 @@ function buildToolbarProps(input) {
|
|
|
10661
10664
|
onOpenSettings,
|
|
10662
10665
|
onRunAccessibilityCheck: dialogs.handleRunAccessibilityCheck,
|
|
10663
10666
|
onToggleSlideSorter: () => s.setShowSlideSorter((p) => !p),
|
|
10667
|
+
onOpenReadingView: () => s.setShowReadingView(true),
|
|
10664
10668
|
onUpdateTextStyle: ops.updateSelectedTextStyle,
|
|
10665
10669
|
onTransformTextCase: ops.updateSelectedTextCase,
|
|
10666
10670
|
isOverflowMenuOpen: s.isOverflowMenuOpen,
|
|
@@ -10698,7 +10702,7 @@ function buildToolbarProps(input) {
|
|
|
10698
10702
|
isCommentsPanelOpen: s.isInspectorPaneOpen,
|
|
10699
10703
|
slideCommentCount: activeSlide?.comments?.length ?? 0,
|
|
10700
10704
|
formatPainterActive: s.formatPainterActive,
|
|
10701
|
-
canActivateFormatPainter:
|
|
10705
|
+
canActivateFormatPainter: chunkH74UXL4Q_js.hasCopyableFormat(selectedElement),
|
|
10702
10706
|
onToggleFormatPainter: () => s.setFormatPainterActive((p) => !p),
|
|
10703
10707
|
isSelectionPaneOpen: s.isSelectionPaneOpen,
|
|
10704
10708
|
onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
|
|
@@ -10961,7 +10965,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
10961
10965
|
}, [incomingContent]);
|
|
10962
10966
|
const onOpenFile = react.useCallback(() => {
|
|
10963
10967
|
void (async () => {
|
|
10964
|
-
const picked = await
|
|
10968
|
+
const picked = await chunkH74UXL4Q_js.openPptxFile();
|
|
10965
10969
|
if (picked) {
|
|
10966
10970
|
setContent(picked.buffer);
|
|
10967
10971
|
}
|
|
@@ -10969,7 +10973,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
10969
10973
|
}, []);
|
|
10970
10974
|
const onOpenRecentFile = react.useCallback((key) => {
|
|
10971
10975
|
void (async () => {
|
|
10972
|
-
const bytes = await
|
|
10976
|
+
const bytes = await chunkH74UXL4Q_js.readBackstageRecentFile(key);
|
|
10973
10977
|
if (bytes) {
|
|
10974
10978
|
setContent(bytes);
|
|
10975
10979
|
}
|