pptx-react-viewer 2.9.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/{AiChatPanel-6W6ZBAGU.mjs → AiChatPanel-EX2TBRJM.mjs} +4 -4
- package/dist/AiChatPanel-EX2TBRJM.mjs.br +0 -0
- package/dist/AiChatPanel-EX2TBRJM.mjs.gz +0 -0
- package/dist/{AiChatPanel-MALC32TM.js → AiChatPanel-PJPSDMN4.js} +23 -23
- package/dist/AiChatPanel-PJPSDMN4.js.br +0 -0
- package/dist/AiChatPanel-PJPSDMN4.js.gz +0 -0
- package/dist/{Model3DScene-57HZ4NVD.mjs → Model3DScene-TTQFV7OS.mjs} +1 -1
- package/dist/Model3DScene-TTQFV7OS.mjs.br +0 -0
- package/dist/Model3DScene-TTQFV7OS.mjs.gz +0 -0
- package/dist/{Model3DScene-76R2YXSO.js → Model3DScene-UCBPTEAY.js} +2 -2
- package/dist/Model3DScene-UCBPTEAY.js.br +0 -0
- package/dist/Model3DScene-UCBPTEAY.js.gz +0 -0
- package/dist/{SurfaceChart3DScene-JGOQNHSU.mjs → SurfaceChart3DScene-5SZCRHZI.mjs} +1 -1
- package/dist/{SurfaceChart3DScene-JGOQNHSU.mjs.br → SurfaceChart3DScene-5SZCRHZI.mjs.br} +0 -0
- package/dist/SurfaceChart3DScene-5SZCRHZI.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-2QZZTBV4.js → SurfaceChart3DScene-ADKCYYOQ.js} +2 -2
- package/dist/SurfaceChart3DScene-ADKCYYOQ.js.br +0 -0
- package/dist/SurfaceChart3DScene-ADKCYYOQ.js.gz +0 -0
- package/dist/{chunk-D6SHCB4V.js → chunk-4J7SPY64.js} +338 -324
- package/dist/chunk-4J7SPY64.js.br +0 -0
- package/dist/chunk-4J7SPY64.js.gz +0 -0
- package/dist/{chunk-CD434OFE.mjs → chunk-53NXKDMZ.mjs} +48 -0
- package/dist/chunk-53NXKDMZ.mjs.br +0 -0
- package/dist/chunk-53NXKDMZ.mjs.gz +0 -0
- package/dist/{chunk-L47Y62L6.mjs → chunk-C2UWTH42.mjs} +1168 -118
- package/dist/chunk-C2UWTH42.mjs.br +0 -0
- package/dist/chunk-C2UWTH42.mjs.gz +0 -0
- package/dist/{chunk-6UXRNLHD.js → chunk-E367QIKR.js} +2526 -1738
- package/dist/chunk-E367QIKR.js.br +0 -0
- package/dist/chunk-E367QIKR.js.gz +0 -0
- package/dist/{chunk-4FO4JMTN.mjs → chunk-HK2UERUX.mjs} +17 -3
- package/dist/chunk-HK2UERUX.mjs.br +0 -0
- package/dist/chunk-HK2UERUX.mjs.gz +0 -0
- package/dist/{chunk-IKISUZKE.js → chunk-HMQVOPQH.js} +1210 -118
- package/dist/chunk-HMQVOPQH.js.br +0 -0
- package/dist/chunk-HMQVOPQH.js.gz +0 -0
- package/dist/{chunk-NQLVK23T.mjs → chunk-L2CM5EUD.mjs} +885 -97
- package/dist/chunk-L2CM5EUD.mjs.br +0 -0
- package/dist/chunk-L2CM5EUD.mjs.gz +0 -0
- package/dist/{chunk-34BUZNKO.js → chunk-MM5RMRSP.js} +278 -291
- package/dist/chunk-MM5RMRSP.js.br +0 -0
- package/dist/chunk-MM5RMRSP.js.gz +0 -0
- package/dist/{chunk-2JDWFMIK.js → chunk-N6IHR6PS.js} +48 -0
- package/dist/chunk-N6IHR6PS.js.br +0 -0
- package/dist/chunk-N6IHR6PS.js.gz +0 -0
- package/dist/{chunk-JPTO6P5K.mjs → chunk-RJEY2KZH.mjs} +34 -48
- package/dist/chunk-RJEY2KZH.mjs.br +0 -0
- package/dist/chunk-RJEY2KZH.mjs.gz +0 -0
- package/dist/{chunk-6OLS3EJW.mjs → chunk-UZVRM6LD.mjs} +1 -1
- package/dist/chunk-UZVRM6LD.mjs.br +0 -0
- package/dist/chunk-UZVRM6LD.mjs.gz +0 -0
- package/dist/{chunk-YEM2VOAP.js → chunk-VNP627O5.js} +3 -3
- package/dist/chunk-VNP627O5.js.br +0 -0
- package/dist/chunk-VNP627O5.js.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 +26 -3
- package/dist/index.d.ts.map +1 -1
- 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 +30 -2
- 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-Rqxm0pRS.d.ts} +19 -5
- package/dist/useViewerBuildingBlocks-Rqxm0pRS.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-2JDWFMIK.js.gz +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-CD434OFE.mjs.gz +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-IKISUZKE.js.gz +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-L47Y62L6.mjs.gz +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 chunkMM5RMRSP_js = require('./chunk-MM5RMRSP.js');
|
|
4
|
+
var chunkN6IHR6PS_js = require('./chunk-N6IHR6PS.js');
|
|
5
|
+
var chunkHMQVOPQH_js = require('./chunk-HMQVOPQH.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 = chunkHMQVOPQH_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 = chunkHMQVOPQH_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 >= chunkHMQVOPQH_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
|
+
}, chunkHMQVOPQH_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 = chunkHMQVOPQH_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 = chunkHMQVOPQH_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
|
+
chunkHMQVOPQH_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 = chunkHMQVOPQH_js.validateRoomId(config.roomId);
|
|
243
243
|
const provider = new WebrtcProvider(roomId, yDoc, opts);
|
|
244
|
-
departureRef.current =
|
|
244
|
+
departureRef.current = chunkHMQVOPQH_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 = chunkHMQVOPQH_js.validateRoomId(config.roomId);
|
|
287
|
+
const transport = config.transport ?? chunkHMQVOPQH_js.resolveTransportForServerUrl(config.serverUrl);
|
|
288
288
|
if (transport === "webrtc") {
|
|
289
289
|
await initWebrtc();
|
|
290
290
|
return;
|
|
291
291
|
}
|
|
292
|
-
if (
|
|
292
|
+
if (chunkHMQVOPQH_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 = chunkHMQVOPQH_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
|
+
chunkHMQVOPQH_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
|
+
}, chunkHMQVOPQH_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
|
+
chunkHMQVOPQH_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 = chunkHMQVOPQH_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 = chunkHMQVOPQH_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(chunkHMQVOPQH_js.cloneSlide),
|
|
521
|
+
templateElementsBySlideId: chunkHMQVOPQH_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(chunkHMQVOPQH_js.cloneSlide));
|
|
535
535
|
setTemplateElementsBySlideId(
|
|
536
|
-
|
|
536
|
+
chunkHMQVOPQH_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 = chunkMM5RMRSP_js.cloneHistorySnapshot(previousSnapshot);
|
|
571
|
+
lastHistorySnapshotRef.current = chunkMM5RMRSP_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 = chunkMM5RMRSP_js.cloneHistorySnapshot(nextSnapshot);
|
|
593
|
+
lastHistorySnapshotRef.current = chunkMM5RMRSP_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 = chunkMM5RMRSP_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 = chunkMM5RMRSP_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(chunkMM5RMRSP_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 = chunkMM5RMRSP_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 = chunkHMQVOPQH_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) => chunkHMQVOPQH_js.zoomInScale(currentScale));
|
|
768
768
|
}, []);
|
|
769
769
|
const handleZoomOut = react.useCallback(() => {
|
|
770
|
-
setScale((currentScale) =>
|
|
770
|
+
setScale((currentScale) => chunkHMQVOPQH_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, chunkMM5RMRSP_js.MIN_ELEMENT_SIZE));
|
|
790
|
+
maxY = Math.max(maxY, element.y + Math.max(element.height, chunkMM5RMRSP_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, chunkMM5RMRSP_js.MIN_ELEMENT_SIZE);
|
|
797
|
+
const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY, chunkMM5RMRSP_js.MIN_ELEMENT_SIZE);
|
|
798
798
|
const availableWidth = Math.max(
|
|
799
|
-
effectiveEditorDimensions.width -
|
|
800
|
-
|
|
799
|
+
effectiveEditorDimensions.width - chunkMM5RMRSP_js.ZOOM_TO_SELECTION_PADDING,
|
|
800
|
+
chunkMM5RMRSP_js.MIN_ELEMENT_SIZE
|
|
801
801
|
);
|
|
802
802
|
const availableHeight = Math.max(
|
|
803
|
-
effectiveEditorDimensions.height -
|
|
804
|
-
|
|
803
|
+
effectiveEditorDimensions.height - chunkMM5RMRSP_js.ZOOM_TO_SELECTION_PADDING,
|
|
804
|
+
chunkMM5RMRSP_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 = chunkHMQVOPQH_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) => chunkHMQVOPQH_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
|
+
chunkMM5RMRSP_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
|
+
chunkHMQVOPQH_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 = chunkHMQVOPQH_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 = chunkHMQVOPQH_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 = chunkHMQVOPQH_js.PRESENTATION_CHANNEL_NAME;
|
|
1273
|
+
var AUDIENCE_HASH = chunkHMQVOPQH_js.PRESENTATION_HASH;
|
|
1274
|
+
var PRESENTER_MSG_ORIGIN = chunkHMQVOPQH_js.PRESENTATION_MESSAGE_ORIGIN;
|
|
1275
|
+
var AUDIENCE_NONCE_KEY = chunkHMQVOPQH_js.PRESENTATION_NONCE_KEY;
|
|
1276
1276
|
function generateSessionId() {
|
|
1277
|
-
return
|
|
1277
|
+
return chunkHMQVOPQH_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 ? chunkHMQVOPQH_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 chunkHMQVOPQH_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 = chunkHMQVOPQH_js.buildPresentationAudienceUrl(window.location.href, sessionId);
|
|
1396
|
+
void chunkHMQVOPQH_js.resolveAudienceScreenPlacement(window).then((placement) => {
|
|
1397
1397
|
if (placement && audienceWindowRef.current === blankWin && !blankWin.closed) {
|
|
1398
|
-
|
|
1398
|
+
chunkHMQVOPQH_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 chunkHMQVOPQH_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 (chunkHMQVOPQH_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 chunkHMQVOPQH_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 (!chunkHMQVOPQH_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 chunkHMQVOPQH_js.clearAudienceContent(expectedSessionId);
|
|
1562
1562
|
}
|
|
1563
|
-
if (
|
|
1563
|
+
if (chunkHMQVOPQH_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: chunkHMQVOPQH_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(chunkHMQVOPQH_js.createPresentationKeyBuffer());
|
|
1603
1603
|
react.useEffect(() => {
|
|
1604
|
-
if (mode !== "present" || !
|
|
1605
|
-
keyBufferRef.current =
|
|
1604
|
+
if (mode !== "present" || !chunkHMQVOPQH_js.acceptsPresentationInput()) {
|
|
1605
|
+
keyBufferRef.current = chunkHMQVOPQH_js.createPresentationKeyBuffer();
|
|
1606
1606
|
return;
|
|
1607
1607
|
}
|
|
1608
1608
|
const handleKeyDown = (event) => {
|
|
1609
|
-
const mapped =
|
|
1609
|
+
const mapped = chunkHMQVOPQH_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 (chunkHMQVOPQH_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 ? chunkHMQVOPQH_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 = chunkHMQVOPQH_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(chunkHMQVOPQH_js.createPresenterTimer());
|
|
2077
|
+
const [snapshot, setSnapshot] = react.useState(() => chunkHMQVOPQH_js.createInitialPresentationSnapshot(slideIndex));
|
|
2078
2078
|
const patch = react.useCallback((value) => {
|
|
2079
|
-
setSnapshot((current) =>
|
|
2079
|
+
setSnapshot((current) => chunkHMQVOPQH_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: chunkHMQVOPQH_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 = chunkHMQVOPQH_js.togglePresenterTimer(timerRef.current);
|
|
2097
2097
|
patch({
|
|
2098
2098
|
paused: timerRef.current.paused,
|
|
2099
|
-
elapsedMs:
|
|
2099
|
+
elapsedMs: chunkHMQVOPQH_js.presenterElapsed(timerRef.current)
|
|
2100
2100
|
});
|
|
2101
2101
|
},
|
|
2102
2102
|
resetTimer: () => {
|
|
2103
|
-
timerRef.current =
|
|
2103
|
+
timerRef.current = chunkHMQVOPQH_js.resetPresenterTimer();
|
|
2104
2104
|
patch({ paused: false, elapsedMs: 0 });
|
|
2105
2105
|
},
|
|
2106
2106
|
stepZoom: (direction) => setSnapshot(
|
|
2107
|
-
(current) =>
|
|
2108
|
-
zoom:
|
|
2107
|
+
(current) => chunkHMQVOPQH_js.mergePresentationSnapshot(current, {
|
|
2108
|
+
zoom: chunkHMQVOPQH_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 (!chunkHMQVOPQH_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 chunkHMQVOPQH_js.buildMorphTransitionPlan(
|
|
2432
2432
|
slides[transitionOverlay.outgoingSlideIndex],
|
|
2433
2433
|
slides[transitionOverlay.incomingSlideIndex],
|
|
2434
2434
|
transitionOverlay.durationMs,
|
|
2435
|
-
|
|
2435
|
+
chunkHMQVOPQH_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 (!chunkHMQVOPQH_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 (!chunkHMQVOPQH_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(() => chunkHMQVOPQH_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: chunkMM5RMRSP_js.DEFAULT_CANVAS_WIDTH,
|
|
3400
|
+
height: chunkMM5RMRSP_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
|
+
chunkHMQVOPQH_js.publishLiveInlineText(
|
|
3421
3421
|
livePatcher,
|
|
3422
3422
|
slidesRef.current[activeSlideIndexRef.current],
|
|
3423
3423
|
inlineEditingElementIdRef.current,
|
|
@@ -3585,6 +3585,8 @@ 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);
|
|
3589
|
+
const [showOutlineView, setShowOutlineView] = react.useState(false);
|
|
3588
3590
|
const [isShortcutHelpOpen, setIsShortcutHelpOpen] = react.useState(false);
|
|
3589
3591
|
const [isAccessibilityPanelOpen, setIsAccessibilityPanelOpen] = react.useState(false);
|
|
3590
3592
|
const [accessibilityIssues, setAccessibilityIssues] = react.useState([]);
|
|
@@ -3631,6 +3633,10 @@ function useViewerUIState() {
|
|
|
3631
3633
|
setSidebarPanelMode,
|
|
3632
3634
|
showSlideSorter,
|
|
3633
3635
|
setShowSlideSorter,
|
|
3636
|
+
showReadingView,
|
|
3637
|
+
setShowReadingView,
|
|
3638
|
+
showOutlineView,
|
|
3639
|
+
setShowOutlineView,
|
|
3634
3640
|
isShortcutHelpOpen,
|
|
3635
3641
|
setIsShortcutHelpOpen,
|
|
3636
3642
|
isAccessibilityPanelOpen,
|
|
@@ -3745,7 +3751,7 @@ function useLoadContent({
|
|
|
3745
3751
|
);
|
|
3746
3752
|
}
|
|
3747
3753
|
const previousHandler = handlerRef.current;
|
|
3748
|
-
const handler = new
|
|
3754
|
+
const handler = new chunkHMQVOPQH_js.PptxHandler();
|
|
3749
3755
|
const parsed = await handler.load(buffer);
|
|
3750
3756
|
if (cancelled || token !== renderTokenRef.current) {
|
|
3751
3757
|
handler.dispose();
|
|
@@ -3757,7 +3763,7 @@ function useLoadContent({
|
|
|
3757
3763
|
handlerRef.current = null;
|
|
3758
3764
|
const mediaElements = [];
|
|
3759
3765
|
for (const slide of parsed.slides) {
|
|
3760
|
-
|
|
3766
|
+
chunkHMQVOPQH_js.collectMediaElements(slide.elements, mediaElements);
|
|
3761
3767
|
}
|
|
3762
3768
|
for (const url of mediaDataUrls.values()) {
|
|
3763
3769
|
if (url.startsWith("blob:")) {
|
|
@@ -3798,7 +3804,7 @@ function useLoadContent({
|
|
|
3798
3804
|
}
|
|
3799
3805
|
})
|
|
3800
3806
|
);
|
|
3801
|
-
const { paths: imagePaths, refs: imageRefs } =
|
|
3807
|
+
const { paths: imagePaths, refs: imageRefs } = chunkHMQVOPQH_js.collectImagePaths(parsed.slides);
|
|
3802
3808
|
let nextSlides = parsed.slides;
|
|
3803
3809
|
if (imagePaths.size > 0) {
|
|
3804
3810
|
const resolvedMap = /* @__PURE__ */ new Map();
|
|
@@ -3853,12 +3859,12 @@ function useLoadContent({
|
|
|
3853
3859
|
}
|
|
3854
3860
|
}
|
|
3855
3861
|
handlerRef.current = handler;
|
|
3856
|
-
const partition =
|
|
3862
|
+
const partition = chunkMM5RMRSP_js.partitionTemplateElements(nextSlides);
|
|
3857
3863
|
setSlides(partition.slides);
|
|
3858
3864
|
setTemplateElementsBySlideId(partition.templateElementsBySlideId);
|
|
3859
3865
|
setCanvasSize({
|
|
3860
|
-
width: parsed.width ??
|
|
3861
|
-
height: parsed.height ??
|
|
3866
|
+
width: parsed.width ?? chunkMM5RMRSP_js.DEFAULT_CANVAS_WIDTH,
|
|
3867
|
+
height: parsed.height ?? chunkMM5RMRSP_js.DEFAULT_CANVAS_HEIGHT
|
|
3862
3868
|
});
|
|
3863
3869
|
setHeaderFooter(parsed.headerFooter ?? {});
|
|
3864
3870
|
setLayoutOptions(parsed.layoutOptions ?? []);
|
|
@@ -3887,7 +3893,7 @@ function useLoadContent({
|
|
|
3887
3893
|
setHasMacros(parsed.hasMacros === true);
|
|
3888
3894
|
setHasDigitalSignatures(parsed.hasDigitalSignatures === true);
|
|
3889
3895
|
setDigitalSignatureCount(parsed.digitalSignatureCount ?? 0);
|
|
3890
|
-
setGuides(
|
|
3896
|
+
setGuides(chunkHMQVOPQH_js.buildInitialGuides(parsed.presentationGuides, parsed.slides[0]?.guides));
|
|
3891
3897
|
setActiveSlideIndex(0);
|
|
3892
3898
|
clearSelection();
|
|
3893
3899
|
setIsDirty(false);
|
|
@@ -3895,7 +3901,7 @@ function useLoadContent({
|
|
|
3895
3901
|
onContentApplied?.();
|
|
3896
3902
|
} catch (err) {
|
|
3897
3903
|
if (!cancelled && token === renderTokenRef.current) {
|
|
3898
|
-
if (err instanceof
|
|
3904
|
+
if (err instanceof chunkHMQVOPQH_js.EncryptedFileError) {
|
|
3899
3905
|
setIsEncrypted(true);
|
|
3900
3906
|
} else {
|
|
3901
3907
|
setError(err instanceof Error ? err.message : String(err));
|
|
@@ -3972,7 +3978,7 @@ function useAutosave(input) {
|
|
|
3972
3978
|
isSavingRef.current = false;
|
|
3973
3979
|
return;
|
|
3974
3980
|
}
|
|
3975
|
-
await
|
|
3981
|
+
await chunkHMQVOPQH_js.saveAutosaveSnapshot(filePathRef.current, data);
|
|
3976
3982
|
setAutosaveStatus({ state: "saved", timestamp: Date.now() });
|
|
3977
3983
|
} catch (err) {
|
|
3978
3984
|
setAutosaveStatus({
|
|
@@ -4037,7 +4043,7 @@ function useElementOperations(input) {
|
|
|
4037
4043
|
}, [applySelection, setInlineEditingElementId, setContextMenuState]);
|
|
4038
4044
|
const updateElementById = react.useCallback(
|
|
4039
4045
|
(elementId, updates) => {
|
|
4040
|
-
if (
|
|
4046
|
+
if (chunkHMQVOPQH_js.isTemplateElementId(elementId)) {
|
|
4041
4047
|
const slideId = activeSlide?.id;
|
|
4042
4048
|
if (slideId) {
|
|
4043
4049
|
setTemplateElementsBySlideId((prev) => ({
|
|
@@ -4077,7 +4083,7 @@ function useElementOperations(input) {
|
|
|
4077
4083
|
);
|
|
4078
4084
|
const updateSelectedShapeStyle = react.useCallback(
|
|
4079
4085
|
(updates) => {
|
|
4080
|
-
if (!selectedElement || !
|
|
4086
|
+
if (!selectedElement || !chunkHMQVOPQH_js.hasShapeProperties(selectedElement)) {
|
|
4081
4087
|
return;
|
|
4082
4088
|
}
|
|
4083
4089
|
updateSelectedElement({
|
|
@@ -4088,17 +4094,17 @@ function useElementOperations(input) {
|
|
|
4088
4094
|
);
|
|
4089
4095
|
const updateSelectedTextStyle = react.useCallback(
|
|
4090
4096
|
(updates) => {
|
|
4091
|
-
if (!selectedElement || !
|
|
4097
|
+
if (!selectedElement || !chunkHMQVOPQH_js.hasTextProperties(selectedElement)) {
|
|
4092
4098
|
return;
|
|
4093
4099
|
}
|
|
4094
|
-
const inlineSel =
|
|
4100
|
+
const inlineSel = chunkHMQVOPQH_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
4095
4101
|
if (inlineSel && selectedElement.textSegments) {
|
|
4096
|
-
const { newSegments: newSegments2, newSelection } =
|
|
4102
|
+
const { newSegments: newSegments2, newSelection } = chunkHMQVOPQH_js.applyStyleToSelectedSegments(
|
|
4097
4103
|
selectedElement.textSegments,
|
|
4098
4104
|
inlineSel,
|
|
4099
4105
|
updates
|
|
4100
4106
|
);
|
|
4101
|
-
|
|
4107
|
+
chunkHMQVOPQH_js.setPendingSelectionRestore(newSelection);
|
|
4102
4108
|
updateSelectedElement({
|
|
4103
4109
|
textSegments: newSegments2
|
|
4104
4110
|
});
|
|
@@ -4118,12 +4124,12 @@ function useElementOperations(input) {
|
|
|
4118
4124
|
);
|
|
4119
4125
|
const updateSelectedTextCase = react.useCallback(
|
|
4120
4126
|
(mode) => {
|
|
4121
|
-
if (!selectedElement || !
|
|
4127
|
+
if (!selectedElement || !chunkHMQVOPQH_js.hasTextProperties(selectedElement)) {
|
|
4122
4128
|
return;
|
|
4123
4129
|
}
|
|
4124
|
-
const inlineSel =
|
|
4130
|
+
const inlineSel = chunkHMQVOPQH_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
4125
4131
|
if (inlineSel && selectedElement.textSegments) {
|
|
4126
|
-
const newSegments =
|
|
4132
|
+
const newSegments = chunkHMQVOPQH_js.applyCaseTransformToSegments(
|
|
4127
4133
|
selectedElement.textSegments,
|
|
4128
4134
|
inlineSel,
|
|
4129
4135
|
mode
|
|
@@ -4133,14 +4139,14 @@ function useElementOperations(input) {
|
|
|
4133
4139
|
}
|
|
4134
4140
|
const updates = {};
|
|
4135
4141
|
if (selectedElement.textSegments && selectedElement.textSegments.length > 0) {
|
|
4136
|
-
updates.textSegments =
|
|
4142
|
+
updates.textSegments = chunkHMQVOPQH_js.applyCaseTransformToSegments(
|
|
4137
4143
|
selectedElement.textSegments,
|
|
4138
4144
|
null,
|
|
4139
4145
|
mode
|
|
4140
4146
|
);
|
|
4141
4147
|
}
|
|
4142
4148
|
if (typeof selectedElement.text === "string") {
|
|
4143
|
-
updates.text =
|
|
4149
|
+
updates.text = chunkHMQVOPQH_js.transformTextCase(selectedElement.text, mode);
|
|
4144
4150
|
}
|
|
4145
4151
|
updateSelectedElement(updates);
|
|
4146
4152
|
},
|
|
@@ -4195,7 +4201,7 @@ function useSectionOperations(input) {
|
|
|
4195
4201
|
const { sections, setSections, slides, setSlides, markDirty } = input;
|
|
4196
4202
|
const addSection2 = react.useCallback(
|
|
4197
4203
|
(name, afterSlideIndex) => {
|
|
4198
|
-
const result =
|
|
4204
|
+
const result = chunkHMQVOPQH_js.addSection(sections, slides, name, afterSlideIndex);
|
|
4199
4205
|
setSlides(result.slides);
|
|
4200
4206
|
setSections(result.sections);
|
|
4201
4207
|
markDirty();
|
|
@@ -4204,7 +4210,7 @@ function useSectionOperations(input) {
|
|
|
4204
4210
|
);
|
|
4205
4211
|
const renameSection2 = react.useCallback(
|
|
4206
4212
|
(sectionId, newName) => {
|
|
4207
|
-
const result =
|
|
4213
|
+
const result = chunkHMQVOPQH_js.renameSection(sections, slides, sectionId, newName);
|
|
4208
4214
|
setSections(result.sections);
|
|
4209
4215
|
setSlides(result.slides);
|
|
4210
4216
|
markDirty();
|
|
@@ -4213,7 +4219,7 @@ function useSectionOperations(input) {
|
|
|
4213
4219
|
);
|
|
4214
4220
|
const deleteSection2 = react.useCallback(
|
|
4215
4221
|
(sectionId) => {
|
|
4216
|
-
const result =
|
|
4222
|
+
const result = chunkHMQVOPQH_js.deleteSection(sections, slides, sectionId);
|
|
4217
4223
|
setSections(result.sections);
|
|
4218
4224
|
setSlides(result.slides);
|
|
4219
4225
|
markDirty();
|
|
@@ -4222,21 +4228,21 @@ function useSectionOperations(input) {
|
|
|
4222
4228
|
);
|
|
4223
4229
|
const moveSectionUp2 = react.useCallback(
|
|
4224
4230
|
(sectionId) => {
|
|
4225
|
-
setSections(
|
|
4231
|
+
setSections(chunkHMQVOPQH_js.moveSectionUp(sections, sectionId));
|
|
4226
4232
|
markDirty();
|
|
4227
4233
|
},
|
|
4228
4234
|
[sections, setSections, markDirty]
|
|
4229
4235
|
);
|
|
4230
4236
|
const moveSectionDown2 = react.useCallback(
|
|
4231
4237
|
(sectionId) => {
|
|
4232
|
-
setSections(
|
|
4238
|
+
setSections(chunkHMQVOPQH_js.moveSectionDown(sections, sectionId));
|
|
4233
4239
|
markDirty();
|
|
4234
4240
|
},
|
|
4235
4241
|
[sections, setSections, markDirty]
|
|
4236
4242
|
);
|
|
4237
4243
|
const moveSlidesToSection2 = react.useCallback(
|
|
4238
4244
|
(slideIndexes, targetSectionId) => {
|
|
4239
|
-
const result =
|
|
4245
|
+
const result = chunkHMQVOPQH_js.moveSlidesToSection(sections, slides, slideIndexes, targetSectionId);
|
|
4240
4246
|
setSlides(result.slides);
|
|
4241
4247
|
setSections(result.sections);
|
|
4242
4248
|
markDirty();
|
|
@@ -4255,19 +4261,19 @@ function useSectionOperations(input) {
|
|
|
4255
4261
|
|
|
4256
4262
|
// src/viewer/hooks/pointer-move-handlers.ts
|
|
4257
4263
|
function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx) {
|
|
4258
|
-
const resized =
|
|
4264
|
+
const resized = chunkHMQVOPQH_js.applyResize(
|
|
4259
4265
|
{ x: startX, y: startY, width: startWidth, height: startHeight },
|
|
4260
4266
|
handle,
|
|
4261
4267
|
dx,
|
|
4262
4268
|
dy,
|
|
4263
4269
|
1,
|
|
4264
|
-
{ minSize:
|
|
4270
|
+
{ minSize: chunkMM5RMRSP_js.MIN_ELEMENT_SIZE }
|
|
4265
4271
|
);
|
|
4266
4272
|
const box = { x: resized.x, y: resized.y, width: resized.width, height: resized.height };
|
|
4267
4273
|
if (!snapToGrid) {
|
|
4268
4274
|
return box;
|
|
4269
4275
|
}
|
|
4270
|
-
return
|
|
4276
|
+
return chunkHMQVOPQH_js.snapBoxToGrid(box, handle, gridSpacingPx, chunkMM5RMRSP_js.MIN_ELEMENT_SIZE);
|
|
4271
4277
|
}
|
|
4272
4278
|
function computeAdjustmentValue(startAdjustment, dx, startWidth) {
|
|
4273
4279
|
const range = startWidth || 200;
|
|
@@ -4385,7 +4391,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4385
4391
|
width: el.width,
|
|
4386
4392
|
height: el.height
|
|
4387
4393
|
}));
|
|
4388
|
-
const snapResult =
|
|
4394
|
+
const snapResult = chunkHMQVOPQH_js.computeSnapToShape(
|
|
4389
4395
|
targetX,
|
|
4390
4396
|
targetY,
|
|
4391
4397
|
primaryEl.width,
|
|
@@ -4424,7 +4430,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4424
4430
|
if (live) {
|
|
4425
4431
|
for (const id of Object.keys(drag.startPositionsById)) {
|
|
4426
4432
|
const start = drag.startPositionsById[id];
|
|
4427
|
-
|
|
4433
|
+
chunkHMQVOPQH_js.publishLiveGeometry(live.patcher, live.slideId, id, {
|
|
4428
4434
|
x: start.x + appliedDx,
|
|
4429
4435
|
y: start.y + appliedDy
|
|
4430
4436
|
});
|
|
@@ -4458,15 +4464,15 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4458
4464
|
if (rs.domEl) {
|
|
4459
4465
|
rs.domEl.style.left = `${geo.x}px`;
|
|
4460
4466
|
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,
|
|
4467
|
+
rs.domEl.style.width = `${Math.max(geo.width, chunkMM5RMRSP_js.MIN_ELEMENT_SIZE)}px`;
|
|
4468
|
+
rs.domEl.style.height = `${Math.max(geo.height, chunkMM5RMRSP_js.MIN_ELEMENT_SIZE)}px`;
|
|
4463
4469
|
}
|
|
4464
4470
|
if (live) {
|
|
4465
|
-
|
|
4471
|
+
chunkHMQVOPQH_js.publishLiveGeometry(live.patcher, live.slideId, rs.elementId, {
|
|
4466
4472
|
x: geo.x,
|
|
4467
4473
|
y: geo.y,
|
|
4468
|
-
width: Math.max(geo.width,
|
|
4469
|
-
height: Math.max(geo.height,
|
|
4474
|
+
width: Math.max(geo.width, chunkMM5RMRSP_js.MIN_ELEMENT_SIZE),
|
|
4475
|
+
height: Math.max(geo.height, chunkMM5RMRSP_js.MIN_ELEMENT_SIZE)
|
|
4470
4476
|
});
|
|
4471
4477
|
}
|
|
4472
4478
|
}
|
|
@@ -4546,13 +4552,13 @@ function processPointerUp(input) {
|
|
|
4546
4552
|
if (i !== activeSlideIndex) {
|
|
4547
4553
|
return s;
|
|
4548
4554
|
}
|
|
4549
|
-
const rerouted =
|
|
4555
|
+
const rerouted = chunkHMQVOPQH_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
|
|
4550
4556
|
if (rerouted.length === 0) {
|
|
4551
4557
|
return s;
|
|
4552
4558
|
}
|
|
4553
4559
|
return {
|
|
4554
4560
|
...s,
|
|
4555
|
-
elements:
|
|
4561
|
+
elements: chunkHMQVOPQH_js.applyReroutedConnectors(s.elements, rerouted)
|
|
4556
4562
|
};
|
|
4557
4563
|
})
|
|
4558
4564
|
);
|
|
@@ -4574,9 +4580,9 @@ function processPointerUp(input) {
|
|
|
4574
4580
|
}
|
|
4575
4581
|
function commitMarquee(marquee, editTemplateMode, templateElements, activeSlide, applySelection, clearSelection) {
|
|
4576
4582
|
const sourceElements = editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
4577
|
-
const hitIds =
|
|
4583
|
+
const hitIds = chunkHMQVOPQH_js.computeMarqueeHitIds(marquee, sourceElements);
|
|
4578
4584
|
if (marquee.additive) {
|
|
4579
|
-
const merged =
|
|
4585
|
+
const merged = chunkHMQVOPQH_js.mergeAdditiveSelection(marquee.baseSelectionIds, hitIds);
|
|
4580
4586
|
if (merged.length > 0) {
|
|
4581
4587
|
applySelection(merged[0], merged);
|
|
4582
4588
|
} else {
|
|
@@ -4599,8 +4605,8 @@ function commitDrag(drag, editTemplateMode, activeSlide, activeSlideIndex, setTe
|
|
|
4599
4605
|
}
|
|
4600
4606
|
return { ...el, x: start.x + dx, y: start.y + dy };
|
|
4601
4607
|
});
|
|
4602
|
-
const rerouted =
|
|
4603
|
-
return
|
|
4608
|
+
const rerouted = chunkHMQVOPQH_js.rerouteConnectorsForMovedElements(movedElements, movedIds);
|
|
4609
|
+
return chunkHMQVOPQH_js.applyReroutedConnectors(movedElements, rerouted);
|
|
4604
4610
|
};
|
|
4605
4611
|
if (editTemplateMode) {
|
|
4606
4612
|
const slideId = activeSlide?.id;
|
|
@@ -4756,9 +4762,9 @@ function useCanvasInteractions(input) {
|
|
|
4756
4762
|
return;
|
|
4757
4763
|
}
|
|
4758
4764
|
const el = elementLookup.get(editId);
|
|
4759
|
-
if (el &&
|
|
4765
|
+
if (el && chunkHMQVOPQH_js.hasTextProperties(el)) {
|
|
4760
4766
|
const committedText = transformCommittedText ? transformCommittedText(inlineEditingText) : inlineEditingText;
|
|
4761
|
-
const newSegments =
|
|
4767
|
+
const newSegments = chunkHMQVOPQH_js.remapTextToSegments(committedText, el.textSegments, el.textStyle);
|
|
4762
4768
|
ops.updateElementById(editId, {
|
|
4763
4769
|
text: committedText,
|
|
4764
4770
|
textSegments: newSegments
|
|
@@ -4769,7 +4775,7 @@ function useCanvasInteractions(input) {
|
|
|
4769
4775
|
setInlineEditingText("");
|
|
4770
4776
|
};
|
|
4771
4777
|
const openEquationEditorForElement = (el) => {
|
|
4772
|
-
if (!
|
|
4778
|
+
if (!chunkHMQVOPQH_js.hasTextProperties(el)) {
|
|
4773
4779
|
return false;
|
|
4774
4780
|
}
|
|
4775
4781
|
const eqSeg = el.textSegments?.find((seg) => seg.equationXml);
|
|
@@ -4798,7 +4804,7 @@ function useCanvasInteractions(input) {
|
|
|
4798
4804
|
justSelectedRef.current = false;
|
|
4799
4805
|
} else {
|
|
4800
4806
|
const el = elementLookup.get(elementId);
|
|
4801
|
-
if (el &&
|
|
4807
|
+
if (el && chunkHMQVOPQH_js.hasTextProperties(el) && !el.locks?.noTextEdit) {
|
|
4802
4808
|
if (!openEquationEditorForElement(el)) {
|
|
4803
4809
|
setInlineEditingElementId(elementId);
|
|
4804
4810
|
setInlineEditingText(el.text ?? "");
|
|
@@ -4817,7 +4823,7 @@ function useCanvasInteractions(input) {
|
|
|
4817
4823
|
if (openEquationEditorForElement(el)) {
|
|
4818
4824
|
return;
|
|
4819
4825
|
}
|
|
4820
|
-
if (
|
|
4826
|
+
if (chunkHMQVOPQH_js.hasTextProperties(el)) {
|
|
4821
4827
|
setInlineEditingElementId(elementId);
|
|
4822
4828
|
setInlineEditingText(el.text ?? "");
|
|
4823
4829
|
}
|
|
@@ -5010,7 +5016,7 @@ function createFileHandlers(deps) {
|
|
|
5010
5016
|
h = Math.round(h * scale);
|
|
5011
5017
|
}
|
|
5012
5018
|
addElement({
|
|
5013
|
-
id:
|
|
5019
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5014
5020
|
type: "image",
|
|
5015
5021
|
x: Math.round((canvasSize.width - w) / 2),
|
|
5016
5022
|
y: Math.round((canvasSize.height - h) / 2),
|
|
@@ -5021,7 +5027,7 @@ function createFileHandlers(deps) {
|
|
|
5021
5027
|
};
|
|
5022
5028
|
img.onerror = () => {
|
|
5023
5029
|
addElement({
|
|
5024
|
-
id:
|
|
5030
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5025
5031
|
type: "image",
|
|
5026
5032
|
x: 100,
|
|
5027
5033
|
y: 100,
|
|
@@ -5047,7 +5053,7 @@ function createFileHandlers(deps) {
|
|
|
5047
5053
|
const elFilePath = file.path;
|
|
5048
5054
|
const insertMediaElement = (mediaSourceUrl, width, height) => {
|
|
5049
5055
|
addElement({
|
|
5050
|
-
id:
|
|
5056
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5051
5057
|
type: "media",
|
|
5052
5058
|
mediaType,
|
|
5053
5059
|
mediaMimeType: file.type || void 0,
|
|
@@ -5222,13 +5228,13 @@ function createStructuredElementHandlers(deps) {
|
|
|
5222
5228
|
return;
|
|
5223
5229
|
}
|
|
5224
5230
|
addElement({
|
|
5225
|
-
id:
|
|
5231
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5226
5232
|
type: "smartArt",
|
|
5227
5233
|
x: 100,
|
|
5228
5234
|
y: 120,
|
|
5229
5235
|
width: 600,
|
|
5230
5236
|
height: 340,
|
|
5231
|
-
smartArtData:
|
|
5237
|
+
smartArtData: chunkHMQVOPQH_js.buildSmartArtPresetData(
|
|
5232
5238
|
layout,
|
|
5233
5239
|
defaultItems,
|
|
5234
5240
|
(i) => `node-${Date.now()}-${i}-${Math.random().toString(36).slice(2, 8)}`
|
|
@@ -5240,7 +5246,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5240
5246
|
return;
|
|
5241
5247
|
}
|
|
5242
5248
|
addElement({
|
|
5243
|
-
id:
|
|
5249
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5244
5250
|
type: "shape",
|
|
5245
5251
|
x: 120,
|
|
5246
5252
|
y: 200,
|
|
@@ -5299,7 +5305,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5299
5305
|
const displayText = value || fieldTexts[fieldType] || fieldType;
|
|
5300
5306
|
const fieldGuid = `{${crypto.randomUUID().toUpperCase()}}`;
|
|
5301
5307
|
addElement({
|
|
5302
|
-
id:
|
|
5308
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5303
5309
|
type: "shape",
|
|
5304
5310
|
x: 120,
|
|
5305
5311
|
y: 200,
|
|
@@ -5321,11 +5327,11 @@ function createStructuredElementHandlers(deps) {
|
|
|
5321
5327
|
if (!activeSlide) {
|
|
5322
5328
|
return;
|
|
5323
5329
|
}
|
|
5324
|
-
const preset =
|
|
5330
|
+
const preset = chunkHMQVOPQH_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
|
|
5325
5331
|
if (!preset) {
|
|
5326
5332
|
return;
|
|
5327
5333
|
}
|
|
5328
|
-
const defaultPptxAction =
|
|
5334
|
+
const defaultPptxAction = chunkHMQVOPQH_js.elementActionToPptxAction({
|
|
5329
5335
|
trigger: "click",
|
|
5330
5336
|
type: preset.defaultAction
|
|
5331
5337
|
});
|
|
@@ -5334,7 +5340,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5334
5340
|
defaultPptxAction.highlightClick = true;
|
|
5335
5341
|
}
|
|
5336
5342
|
addElement({
|
|
5337
|
-
id:
|
|
5343
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5338
5344
|
type: "shape",
|
|
5339
5345
|
x: 150,
|
|
5340
5346
|
y: 150,
|
|
@@ -5401,14 +5407,14 @@ function useInsertElements(input) {
|
|
|
5401
5407
|
return;
|
|
5402
5408
|
}
|
|
5403
5409
|
addElement({
|
|
5404
|
-
id:
|
|
5410
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5405
5411
|
type: "text",
|
|
5406
5412
|
x: 100,
|
|
5407
5413
|
y: 100,
|
|
5408
5414
|
width: 300,
|
|
5409
5415
|
height: 60,
|
|
5410
5416
|
text: "",
|
|
5411
|
-
textStyle: { fontSize:
|
|
5417
|
+
textStyle: { fontSize: chunkMM5RMRSP_js.DEFAULT_TEXT_FONT_SIZE }
|
|
5412
5418
|
});
|
|
5413
5419
|
};
|
|
5414
5420
|
const handleAddShape = () => {
|
|
@@ -5416,7 +5422,7 @@ function useInsertElements(input) {
|
|
|
5416
5422
|
return;
|
|
5417
5423
|
}
|
|
5418
5424
|
addElement({
|
|
5419
|
-
id:
|
|
5425
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5420
5426
|
type: "shape",
|
|
5421
5427
|
x: 150,
|
|
5422
5428
|
y: 150,
|
|
@@ -5435,15 +5441,15 @@ function useInsertElements(input) {
|
|
|
5435
5441
|
return;
|
|
5436
5442
|
}
|
|
5437
5443
|
addElement({
|
|
5438
|
-
...
|
|
5439
|
-
id:
|
|
5444
|
+
...chunkHMQVOPQH_js.newTableElement(chunkMM5RMRSP_js.DEFAULT_TABLE_ROWS, chunkMM5RMRSP_js.DEFAULT_TABLE_COLUMNS, 100, 200),
|
|
5445
|
+
id: chunkHMQVOPQH_js.generateElementId()
|
|
5440
5446
|
});
|
|
5441
5447
|
};
|
|
5442
5448
|
const handleAddChart = (chartType) => {
|
|
5443
5449
|
if (!activeSlide) {
|
|
5444
5450
|
return;
|
|
5445
5451
|
}
|
|
5446
|
-
addElement(
|
|
5452
|
+
addElement(chunkHMQVOPQH_js.createDefaultChartElement(chartType));
|
|
5447
5453
|
};
|
|
5448
5454
|
const structured = createStructuredElementHandlers({
|
|
5449
5455
|
activeSlide,
|
|
@@ -5513,7 +5519,7 @@ function useClipboardHandlers(input) {
|
|
|
5513
5519
|
if (!selectedElement) {
|
|
5514
5520
|
return;
|
|
5515
5521
|
}
|
|
5516
|
-
setClipboardPayload(
|
|
5522
|
+
setClipboardPayload(chunkHMQVOPQH_js.buildElementClipboardPayload(selectedElement, editTemplateMode));
|
|
5517
5523
|
};
|
|
5518
5524
|
const handleDelete = () => {
|
|
5519
5525
|
const idsToDelete = effectiveSelectedIds;
|
|
@@ -5530,7 +5536,7 @@ function useClipboardHandlers(input) {
|
|
|
5530
5536
|
handleDelete();
|
|
5531
5537
|
};
|
|
5532
5538
|
const insertClone = (source) => {
|
|
5533
|
-
const clone =
|
|
5539
|
+
const clone = chunkHMQVOPQH_js.cloneElementForPaste(source, { intoTemplate: editTemplateMode });
|
|
5534
5540
|
ops.updateActiveElements((els) => [...els, clone]);
|
|
5535
5541
|
ops.applySelection(clone.id);
|
|
5536
5542
|
history.markDirty();
|
|
@@ -5565,7 +5571,7 @@ function resolveShapePath(el) {
|
|
|
5565
5571
|
return el.pathData;
|
|
5566
5572
|
}
|
|
5567
5573
|
if ("shapeType" in el && typeof el.shapeType === "string") {
|
|
5568
|
-
const clipPath =
|
|
5574
|
+
const clipPath = chunkHMQVOPQH_js.getPresetShapeClipPath(el.shapeType);
|
|
5569
5575
|
if (clipPath) {
|
|
5570
5576
|
const svgPath = clipPathToSvgPath(clipPath, el.width, el.height);
|
|
5571
5577
|
if (svgPath) {
|
|
@@ -5616,7 +5622,7 @@ function clipPathToSvgPath(clipPath, width, height) {
|
|
|
5616
5622
|
return parts.join(" ");
|
|
5617
5623
|
}
|
|
5618
5624
|
function transformPathToGlobal(pathData, el) {
|
|
5619
|
-
const polys =
|
|
5625
|
+
const polys = chunkHMQVOPQH_js.svgPathToPolygons(pathData);
|
|
5620
5626
|
if (polys.length === 0) {
|
|
5621
5627
|
return pathData;
|
|
5622
5628
|
}
|
|
@@ -5636,10 +5642,10 @@ function transformPathToGlobal(pathData, el) {
|
|
|
5636
5642
|
y: pt.y * scaleY + el.y
|
|
5637
5643
|
}))
|
|
5638
5644
|
);
|
|
5639
|
-
return
|
|
5645
|
+
return chunkHMQVOPQH_js.polygonsToSvgPath(transformed);
|
|
5640
5646
|
}
|
|
5641
5647
|
function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
5642
|
-
const polys =
|
|
5648
|
+
const polys = chunkHMQVOPQH_js.svgPathToPolygons(pathData);
|
|
5643
5649
|
if (polys.length === 0) {
|
|
5644
5650
|
return pathData;
|
|
5645
5651
|
}
|
|
@@ -5649,10 +5655,10 @@ function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
|
5649
5655
|
y: pt.y - y
|
|
5650
5656
|
}))
|
|
5651
5657
|
);
|
|
5652
|
-
return
|
|
5658
|
+
return chunkHMQVOPQH_js.polygonsToSvgPath(transformed);
|
|
5653
5659
|
}
|
|
5654
5660
|
function pathBounds(pathData) {
|
|
5655
|
-
const polys =
|
|
5661
|
+
const polys = chunkHMQVOPQH_js.svgPathToPolygons(pathData);
|
|
5656
5662
|
let minX = Infinity;
|
|
5657
5663
|
let minY = Infinity;
|
|
5658
5664
|
let maxX = -Infinity;
|
|
@@ -5711,7 +5717,7 @@ function useMergeShapesHandler(input) {
|
|
|
5711
5717
|
let allFragments = [];
|
|
5712
5718
|
let remaining = globalPaths[0];
|
|
5713
5719
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
5714
|
-
const frags =
|
|
5720
|
+
const frags = chunkHMQVOPQH_js.mergeShapes("fragment", remaining, globalPaths[i]);
|
|
5715
5721
|
if (Array.isArray(frags)) {
|
|
5716
5722
|
allFragments = frags;
|
|
5717
5723
|
}
|
|
@@ -5740,7 +5746,7 @@ function useMergeShapesHandler(input) {
|
|
|
5740
5746
|
bounds.height
|
|
5741
5747
|
);
|
|
5742
5748
|
const newEl = {
|
|
5743
|
-
id:
|
|
5749
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5744
5750
|
type: "shape",
|
|
5745
5751
|
x: bounds.x,
|
|
5746
5752
|
y: bounds.y,
|
|
@@ -5778,7 +5784,7 @@ function useMergeShapesHandler(input) {
|
|
|
5778
5784
|
} else {
|
|
5779
5785
|
let resultPath = globalPaths[0];
|
|
5780
5786
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
5781
|
-
const result =
|
|
5787
|
+
const result = chunkHMQVOPQH_js.mergeShapes(operation, resultPath, globalPaths[i]);
|
|
5782
5788
|
if (typeof result === "string") {
|
|
5783
5789
|
resultPath = result;
|
|
5784
5790
|
}
|
|
@@ -5799,7 +5805,7 @@ function useMergeShapesHandler(input) {
|
|
|
5799
5805
|
);
|
|
5800
5806
|
const primary = targets[0];
|
|
5801
5807
|
const newEl = {
|
|
5802
|
-
id:
|
|
5808
|
+
id: chunkHMQVOPQH_js.generateElementId(),
|
|
5803
5809
|
type: "shape",
|
|
5804
5810
|
x: bounds.x,
|
|
5805
5811
|
y: bounds.y,
|
|
@@ -5862,7 +5868,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5862
5868
|
if (ids.length < 2 || !activeSlide) {
|
|
5863
5869
|
return;
|
|
5864
5870
|
}
|
|
5865
|
-
const { elements, groupId } =
|
|
5871
|
+
const { elements, groupId } = chunkHMQVOPQH_js.groupElements(ops.activeElements, ids, chunkHMQVOPQH_js.generateElementId());
|
|
5866
5872
|
if (groupId === null) {
|
|
5867
5873
|
return;
|
|
5868
5874
|
}
|
|
@@ -5875,12 +5881,12 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5875
5881
|
return;
|
|
5876
5882
|
}
|
|
5877
5883
|
const group = selectedElement;
|
|
5878
|
-
const intoTemplate =
|
|
5884
|
+
const intoTemplate = chunkHMQVOPQH_js.isTemplateElementId(group.id);
|
|
5879
5885
|
const ungrouped = group.children.map((child) => ({
|
|
5880
5886
|
...structuredClone(child),
|
|
5881
5887
|
// Keep child ids in the same store as the group so later edits route
|
|
5882
5888
|
// correctly: template groups yield template-prefixed child ids.
|
|
5883
|
-
id: intoTemplate ?
|
|
5889
|
+
id: intoTemplate ? chunkHMQVOPQH_js.makeCloneId(true, child.id || group.id) : child.id || chunkHMQVOPQH_js.generateElementId(),
|
|
5884
5890
|
x: child.x + group.x,
|
|
5885
5891
|
y: child.y + group.y
|
|
5886
5892
|
}));
|
|
@@ -5904,7 +5910,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5904
5910
|
if (!edge) {
|
|
5905
5911
|
return;
|
|
5906
5912
|
}
|
|
5907
|
-
const positions =
|
|
5913
|
+
const positions = chunkHMQVOPQH_js.alignElements(selectedElements, edge);
|
|
5908
5914
|
for (const [id, pos] of positions) {
|
|
5909
5915
|
const el = elementLookup.get(id);
|
|
5910
5916
|
if (!el) {
|
|
@@ -5922,7 +5928,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5922
5928
|
if (!distAxis) {
|
|
5923
5929
|
return;
|
|
5924
5930
|
}
|
|
5925
|
-
const positions =
|
|
5931
|
+
const positions = chunkHMQVOPQH_js.distributeElements(selectedElements, distAxis);
|
|
5926
5932
|
for (const [id, pos] of positions) {
|
|
5927
5933
|
const el = elementLookup.get(id);
|
|
5928
5934
|
if (!el) {
|
|
@@ -5939,7 +5945,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5939
5945
|
}
|
|
5940
5946
|
const id = selectedElement.id;
|
|
5941
5947
|
ops.updateActiveElements(
|
|
5942
|
-
(els) => direction === "forward" ?
|
|
5948
|
+
(els) => direction === "forward" ? chunkHMQVOPQH_js.bringForward(els, id) : direction === "backward" ? chunkHMQVOPQH_js.sendBackward(els, id) : els
|
|
5943
5949
|
);
|
|
5944
5950
|
history.markDirty();
|
|
5945
5951
|
};
|
|
@@ -5949,7 +5955,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5949
5955
|
}
|
|
5950
5956
|
const id = selectedElement.id;
|
|
5951
5957
|
ops.updateActiveElements(
|
|
5952
|
-
(els) => direction === "front" ?
|
|
5958
|
+
(els) => direction === "front" ? chunkHMQVOPQH_js.bringToFront(els, id) : chunkHMQVOPQH_js.sendToBack(els, id)
|
|
5953
5959
|
);
|
|
5954
5960
|
history.markDirty();
|
|
5955
5961
|
};
|
|
@@ -6071,7 +6077,7 @@ function insertSlideFromLayoutUpdater(slides, activeIndex, draft) {
|
|
|
6071
6077
|
function useSlideManagement(input) {
|
|
6072
6078
|
const { slides, activeSlideIndex, setActiveSlideIndex, ops, history, handlerRef } = input;
|
|
6073
6079
|
const handleAddSlide = () => {
|
|
6074
|
-
const newSlide =
|
|
6080
|
+
const newSlide = chunkHMQVOPQH_js.createBlankSlide(slides.length + 1);
|
|
6075
6081
|
ops.updateSlides((prev) => {
|
|
6076
6082
|
const next = [...prev];
|
|
6077
6083
|
next.splice(activeSlideIndex + 1, 0, newSlide);
|
|
@@ -6134,7 +6140,7 @@ function useSlideManagement(input) {
|
|
|
6134
6140
|
}
|
|
6135
6141
|
const clone = {
|
|
6136
6142
|
...src,
|
|
6137
|
-
id:
|
|
6143
|
+
id: chunkHMQVOPQH_js.makeSlideId(),
|
|
6138
6144
|
elements: src.elements.map((el) => ({
|
|
6139
6145
|
...el,
|
|
6140
6146
|
id: `${el.id}-dup-${Math.random().toString(36).slice(2, 6)}`
|
|
@@ -6166,7 +6172,7 @@ function useSlideManagement(input) {
|
|
|
6166
6172
|
const handleInsertSlideFromLayout = (layoutPath, layoutName) => {
|
|
6167
6173
|
const insertAt = activeSlideIndex + 1;
|
|
6168
6174
|
const draft = {
|
|
6169
|
-
...
|
|
6175
|
+
...chunkHMQVOPQH_js.createBlankSlide(slides.length + 1),
|
|
6170
6176
|
layoutPath,
|
|
6171
6177
|
...layoutName ? { layoutName } : {}
|
|
6172
6178
|
};
|
|
@@ -6227,7 +6233,7 @@ function createTableMergeHandlers(input) {
|
|
|
6227
6233
|
if (!nextCell || nextCell.hMerge || nextCell.vMerge) {
|
|
6228
6234
|
return;
|
|
6229
6235
|
}
|
|
6230
|
-
const newTableData =
|
|
6236
|
+
const newTableData = chunkHMQVOPQH_js.mergeCells(
|
|
6231
6237
|
[
|
|
6232
6238
|
{ row: rowIndex, col: columnIndex },
|
|
6233
6239
|
{ row: rowIndex, col: nextColIdx }
|
|
@@ -6235,7 +6241,7 @@ function createTableMergeHandlers(input) {
|
|
|
6235
6241
|
td
|
|
6236
6242
|
);
|
|
6237
6243
|
const updates = { tableData: newTableData };
|
|
6238
|
-
const newRawXml =
|
|
6244
|
+
const newRawXml = chunkHMQVOPQH_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6239
6245
|
if (newRawXml) {
|
|
6240
6246
|
updates.rawXml = newRawXml;
|
|
6241
6247
|
}
|
|
@@ -6261,7 +6267,7 @@ function createTableMergeHandlers(input) {
|
|
|
6261
6267
|
if (!targetNextCell || targetNextCell.hMerge || targetNextCell.vMerge) {
|
|
6262
6268
|
return;
|
|
6263
6269
|
}
|
|
6264
|
-
const newTableData =
|
|
6270
|
+
const newTableData = chunkHMQVOPQH_js.mergeCells(
|
|
6265
6271
|
[
|
|
6266
6272
|
{ row: rowIndex, col: columnIndex },
|
|
6267
6273
|
{ row: targetNextRowIdx, col: columnIndex }
|
|
@@ -6269,7 +6275,7 @@ function createTableMergeHandlers(input) {
|
|
|
6269
6275
|
td
|
|
6270
6276
|
);
|
|
6271
6277
|
const updates = { tableData: newTableData };
|
|
6272
|
-
const newRawXml =
|
|
6278
|
+
const newRawXml = chunkHMQVOPQH_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6273
6279
|
if (newRawXml) {
|
|
6274
6280
|
updates.rawXml = newRawXml;
|
|
6275
6281
|
}
|
|
@@ -6284,9 +6290,9 @@ function createTableMergeHandlers(input) {
|
|
|
6284
6290
|
return;
|
|
6285
6291
|
}
|
|
6286
6292
|
const td = selectedElement.tableData;
|
|
6287
|
-
const newTableData =
|
|
6293
|
+
const newTableData = chunkHMQVOPQH_js.mergeCells(ts.selectedCells, td);
|
|
6288
6294
|
const updates = { tableData: newTableData };
|
|
6289
|
-
const newRawXml =
|
|
6295
|
+
const newRawXml = chunkHMQVOPQH_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6290
6296
|
if (newRawXml) {
|
|
6291
6297
|
updates.rawXml = newRawXml;
|
|
6292
6298
|
}
|
|
@@ -6303,9 +6309,9 @@ function createTableMergeHandlers(input) {
|
|
|
6303
6309
|
}
|
|
6304
6310
|
const { rowIndex, columnIndex } = ts;
|
|
6305
6311
|
const td = selectedElement.tableData;
|
|
6306
|
-
const newTableData =
|
|
6312
|
+
const newTableData = chunkHMQVOPQH_js.splitCell(rowIndex, columnIndex, td);
|
|
6307
6313
|
const updates = { tableData: newTableData };
|
|
6308
|
-
const newRawXml =
|
|
6314
|
+
const newRawXml = chunkHMQVOPQH_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6309
6315
|
if (newRawXml) {
|
|
6310
6316
|
updates.rawXml = newRawXml;
|
|
6311
6317
|
}
|
|
@@ -6349,7 +6355,7 @@ function createTableStructHandlers(input) {
|
|
|
6349
6355
|
updates.tableData = { ...el.tableData, rows: newRows };
|
|
6350
6356
|
}
|
|
6351
6357
|
if (el.rawXml) {
|
|
6352
|
-
const newRawXml =
|
|
6358
|
+
const newRawXml = chunkHMQVOPQH_js.updateCellTextInRawXml(el, rowIndex, colIndex, text);
|
|
6353
6359
|
if (newRawXml) {
|
|
6354
6360
|
updates.rawXml = newRawXml;
|
|
6355
6361
|
}
|
|
@@ -6373,7 +6379,7 @@ function createTableStructHandlers(input) {
|
|
|
6373
6379
|
const { rowIndex, columnIndex: colIndex } = ts;
|
|
6374
6380
|
const updates = {};
|
|
6375
6381
|
if (selectedElement.rawXml) {
|
|
6376
|
-
const newRawXml =
|
|
6382
|
+
const newRawXml = chunkHMQVOPQH_js.updateCellTextStyleInRawXml(
|
|
6377
6383
|
selectedElement,
|
|
6378
6384
|
rowIndex,
|
|
6379
6385
|
colIndex,
|
|
@@ -6437,9 +6443,9 @@ function createTableStructHandlers(input) {
|
|
|
6437
6443
|
return;
|
|
6438
6444
|
}
|
|
6439
6445
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6440
|
-
const newTableData =
|
|
6446
|
+
const newTableData = chunkHMQVOPQH_js.insertTableRow(selectedElement.tableData, rowIdx, position);
|
|
6441
6447
|
const updates = { tableData: newTableData };
|
|
6442
|
-
const newRawXml =
|
|
6448
|
+
const newRawXml = chunkHMQVOPQH_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6443
6449
|
if (newRawXml) {
|
|
6444
6450
|
updates.rawXml = newRawXml;
|
|
6445
6451
|
}
|
|
@@ -6452,12 +6458,12 @@ function createTableStructHandlers(input) {
|
|
|
6452
6458
|
}
|
|
6453
6459
|
const td = selectedElement.tableData;
|
|
6454
6460
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6455
|
-
const newTableData =
|
|
6461
|
+
const newTableData = chunkHMQVOPQH_js.deleteTableRow(td, rowIdx);
|
|
6456
6462
|
if (newTableData === td) {
|
|
6457
6463
|
return;
|
|
6458
6464
|
}
|
|
6459
6465
|
const updates = { tableData: newTableData };
|
|
6460
|
-
const newRawXml =
|
|
6466
|
+
const newRawXml = chunkHMQVOPQH_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6461
6467
|
if (newRawXml) {
|
|
6462
6468
|
updates.rawXml = newRawXml;
|
|
6463
6469
|
}
|
|
@@ -6469,9 +6475,9 @@ function createTableStructHandlers(input) {
|
|
|
6469
6475
|
return;
|
|
6470
6476
|
}
|
|
6471
6477
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6472
|
-
const newTableData =
|
|
6478
|
+
const newTableData = chunkHMQVOPQH_js.insertTableColumn(selectedElement.tableData, colIdx, position);
|
|
6473
6479
|
const updates = { tableData: newTableData };
|
|
6474
|
-
const newRawXml =
|
|
6480
|
+
const newRawXml = chunkHMQVOPQH_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6475
6481
|
if (newRawXml) {
|
|
6476
6482
|
updates.rawXml = newRawXml;
|
|
6477
6483
|
}
|
|
@@ -6484,12 +6490,12 @@ function createTableStructHandlers(input) {
|
|
|
6484
6490
|
}
|
|
6485
6491
|
const td = selectedElement.tableData;
|
|
6486
6492
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6487
|
-
const newTableData =
|
|
6493
|
+
const newTableData = chunkHMQVOPQH_js.deleteTableColumn(td, colIdx);
|
|
6488
6494
|
if (newTableData === td) {
|
|
6489
6495
|
return;
|
|
6490
6496
|
}
|
|
6491
6497
|
const updates = { tableData: newTableData };
|
|
6492
|
-
const newRawXml =
|
|
6498
|
+
const newRawXml = chunkHMQVOPQH_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6493
6499
|
if (newRawXml) {
|
|
6494
6500
|
updates.rawXml = newRawXml;
|
|
6495
6501
|
}
|
|
@@ -6525,8 +6531,8 @@ async function renderToCanvas(element, options = {}) {
|
|
|
6525
6531
|
return html2canvasPro(element, {
|
|
6526
6532
|
...options,
|
|
6527
6533
|
onclone: async (doc, clonedEl) => {
|
|
6528
|
-
await
|
|
6529
|
-
|
|
6534
|
+
await chunkHMQVOPQH_js.normalizeColorsForCapture(doc, clonedEl);
|
|
6535
|
+
chunkHMQVOPQH_js.preprocessCssForCapture(clonedEl);
|
|
6530
6536
|
if (typeof userOnClone === "function") {
|
|
6531
6537
|
userOnClone(doc, clonedEl);
|
|
6532
6538
|
}
|
|
@@ -6582,7 +6588,7 @@ async function exportSlideToPngBlob(slideElement, options = {}) {
|
|
|
6582
6588
|
}
|
|
6583
6589
|
async function exportSlideAsPng(slideElement, slideIndex, options = {}) {
|
|
6584
6590
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
6585
|
-
|
|
6591
|
+
chunkHMQVOPQH_js.downloadBlob(blob, `slide-${slideIndex + 1}.png`);
|
|
6586
6592
|
}
|
|
6587
6593
|
async function copySlideToClipboard(slideElement, options = {}) {
|
|
6588
6594
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
@@ -6604,15 +6610,15 @@ async function exportAllSlidesAsPdf(slideStageRef, totalSlides, setActiveSlide,
|
|
|
6604
6610
|
continue;
|
|
6605
6611
|
}
|
|
6606
6612
|
const canvas = await renderElementToCanvas(stageEl, scale);
|
|
6607
|
-
images.push(
|
|
6613
|
+
images.push(chunkHMQVOPQH_js.canvasToJpegData(canvas));
|
|
6608
6614
|
}
|
|
6609
6615
|
onProgress?.(totalSlides, totalSlides);
|
|
6610
6616
|
setActiveSlide(currentSlideIndex);
|
|
6611
6617
|
if (images.length === 0) {
|
|
6612
|
-
throw new Error(
|
|
6618
|
+
throw new Error(chunkN6IHR6PS_js.translationsEn["pptx.export.errorNoSlidesPdf"]);
|
|
6613
6619
|
}
|
|
6614
|
-
const pdfBlobUrl =
|
|
6615
|
-
|
|
6620
|
+
const pdfBlobUrl = chunkMM5RMRSP_js.buildPdfFromImageData(images);
|
|
6621
|
+
chunkHMQVOPQH_js.downloadDataUrl(pdfBlobUrl, filename);
|
|
6616
6622
|
}
|
|
6617
6623
|
async function captureAllSlidesAsPngDataUrls(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, options = {}) {
|
|
6618
6624
|
const { scale = 2, onProgress } = options;
|
|
@@ -6658,10 +6664,10 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
|
|
|
6658
6664
|
onProgress?.(totalSlides, totalSlides);
|
|
6659
6665
|
setActiveSlide(currentSlideIndex);
|
|
6660
6666
|
if (pages.length === 0) {
|
|
6661
|
-
throw new Error(
|
|
6667
|
+
throw new Error(chunkN6IHR6PS_js.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
|
|
6662
6668
|
}
|
|
6663
|
-
const pdfDataUrl =
|
|
6664
|
-
|
|
6669
|
+
const pdfDataUrl = chunkMM5RMRSP_js.buildNotesPdf(pages);
|
|
6670
|
+
chunkHMQVOPQH_js.downloadDataUrl(pdfDataUrl, filename);
|
|
6665
6671
|
}
|
|
6666
6672
|
|
|
6667
6673
|
// src/viewer/utils/export-video.ts
|
|
@@ -6692,7 +6698,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
6692
6698
|
}
|
|
6693
6699
|
setActiveSlide(currentSlideIndex);
|
|
6694
6700
|
if (slideCanvases.length === 0) {
|
|
6695
|
-
throw new Error(
|
|
6701
|
+
throw new Error(chunkN6IHR6PS_js.translationsEn["pptx.export.errorNoSlidesVideo"]);
|
|
6696
6702
|
}
|
|
6697
6703
|
const firstCanvas = slideCanvases[0];
|
|
6698
6704
|
const recordingCanvas = document.createElement("canvas");
|
|
@@ -6700,12 +6706,12 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
6700
6706
|
recordingCanvas.height = firstCanvas.height;
|
|
6701
6707
|
const ctx = recordingCanvas.getContext("2d");
|
|
6702
6708
|
if (!ctx) {
|
|
6703
|
-
throw new Error(
|
|
6709
|
+
throw new Error(chunkN6IHR6PS_js.translationsEn["pptx.export.errorNo2dContext"]);
|
|
6704
6710
|
}
|
|
6705
6711
|
const fps = 30;
|
|
6706
6712
|
const stream = recordingCanvas.captureStream(fps);
|
|
6707
6713
|
const recorder = new MediaRecorder(stream, {
|
|
6708
|
-
mimeType:
|
|
6714
|
+
mimeType: chunkHMQVOPQH_js.pickSupportedMimeType([...chunkHMQVOPQH_js.WEBM_MIME_CANDIDATES]),
|
|
6709
6715
|
videoBitsPerSecond: 5e6
|
|
6710
6716
|
});
|
|
6711
6717
|
const chunks = [];
|
|
@@ -6728,8 +6734,8 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
6728
6734
|
const duration = slideTimingsMs?.[i] ?? slideDurationMs;
|
|
6729
6735
|
ctx.clearRect(0, 0, recordingCanvas.width, recordingCanvas.height);
|
|
6730
6736
|
ctx.drawImage(slideCanvases[i], 0, 0);
|
|
6731
|
-
const frameInterval =
|
|
6732
|
-
const framesNeeded =
|
|
6737
|
+
const frameInterval = chunkHMQVOPQH_js.fpsToFrameIntervalMs(fps);
|
|
6738
|
+
const framesNeeded = chunkHMQVOPQH_js.segmentFrameCount(duration, fps);
|
|
6733
6739
|
for (let f = 0; f < framesNeeded; f++) {
|
|
6734
6740
|
if (signal?.aborted) {
|
|
6735
6741
|
recorder.stop();
|
|
@@ -6776,9 +6782,9 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
|
|
|
6776
6782
|
}
|
|
6777
6783
|
setActiveSlide(currentSlideIndex);
|
|
6778
6784
|
if (frames.length === 0) {
|
|
6779
|
-
throw new Error(
|
|
6785
|
+
throw new Error(chunkN6IHR6PS_js.translationsEn["pptx.export.errorNoSlidesGif"]);
|
|
6780
6786
|
}
|
|
6781
|
-
const gifBytes =
|
|
6787
|
+
const gifBytes = chunkHMQVOPQH_js.encodeGif(frames, Math.round(slideDurationMs / 10));
|
|
6782
6788
|
onProgress?.(totalSlides, totalSlides);
|
|
6783
6789
|
const buf = new ArrayBuffer(gifBytes.length);
|
|
6784
6790
|
new Uint8Array(buf).set(gifBytes);
|
|
@@ -6832,7 +6838,7 @@ function exportAllSlidesToSvg(data, options = {}) {
|
|
|
6832
6838
|
continue;
|
|
6833
6839
|
}
|
|
6834
6840
|
onProgress?.(processedCount, data.slides.length);
|
|
6835
|
-
let svg =
|
|
6841
|
+
let svg = chunkHMQVOPQH_js.SvgExporter.exportSlide(slide, data.width, data.height, svgOptions);
|
|
6836
6842
|
if (embedFonts && fontFaces?.length) {
|
|
6837
6843
|
svg = injectFontFaces(svg, fontFaces);
|
|
6838
6844
|
}
|
|
@@ -6892,7 +6898,7 @@ function useExportSaveAs(input) {
|
|
|
6892
6898
|
}
|
|
6893
6899
|
setExportProgress(70);
|
|
6894
6900
|
setExportStatusMessage("Writing README...");
|
|
6895
|
-
const readme =
|
|
6901
|
+
const readme = chunkHMQVOPQH_js.generatePackageReadme(pptxFilename);
|
|
6896
6902
|
pkgFolder.file("README.txt", readme);
|
|
6897
6903
|
if (abortCtrl.signal.aborted) {
|
|
6898
6904
|
throw new DOMException("Export cancelled", "AbortError");
|
|
@@ -6903,7 +6909,7 @@ function useExportSaveAs(input) {
|
|
|
6903
6909
|
setExportProgress(95);
|
|
6904
6910
|
setExportStatusMessage("Downloading...");
|
|
6905
6911
|
const baseName = pptxFilename.replace(/\.[^.]+$/u, "");
|
|
6906
|
-
|
|
6912
|
+
chunkHMQVOPQH_js.downloadBlob(zipBlob, `${baseName}-package.zip`);
|
|
6907
6913
|
setExportProgress(100);
|
|
6908
6914
|
} catch (err) {
|
|
6909
6915
|
if (err.name !== "AbortError") {
|
|
@@ -6926,7 +6932,7 @@ function useExportSaveAs(input) {
|
|
|
6926
6932
|
const blob = new Blob([data], {
|
|
6927
6933
|
type: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
|
|
6928
6934
|
});
|
|
6929
|
-
|
|
6935
|
+
chunkHMQVOPQH_js.downloadBlob(blob, `${baseName}.${ext}`);
|
|
6930
6936
|
} catch (err) {
|
|
6931
6937
|
console.error(`[PowerPointViewer] Save as .${ext} failed:`, err);
|
|
6932
6938
|
}
|
|
@@ -6939,14 +6945,14 @@ function useExportSaveAs(input) {
|
|
|
6939
6945
|
const pptxGuides = guides.map((g) => ({
|
|
6940
6946
|
id: g.id,
|
|
6941
6947
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
6942
|
-
positionEmu:
|
|
6948
|
+
positionEmu: chunkHMQVOPQH_js.guidePxToEmu(g.position)
|
|
6943
6949
|
}));
|
|
6944
6950
|
return {
|
|
6945
6951
|
...slide,
|
|
6946
6952
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
6947
6953
|
};
|
|
6948
6954
|
});
|
|
6949
|
-
const slidesToSave =
|
|
6955
|
+
const slidesToSave = chunkMM5RMRSP_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
6950
6956
|
const saveOptions = {
|
|
6951
6957
|
headerFooter,
|
|
6952
6958
|
presentationProperties,
|
|
@@ -7003,7 +7009,7 @@ function safeConfirm(message) {
|
|
|
7003
7009
|
}
|
|
7004
7010
|
}
|
|
7005
7011
|
function downloadBlob2(blob, filename) {
|
|
7006
|
-
|
|
7012
|
+
chunkHMQVOPQH_js.downloadBlob(blob, chunkHMQVOPQH_js.sanitizeDownloadFilename(filename));
|
|
7007
7013
|
}
|
|
7008
7014
|
|
|
7009
7015
|
// src/viewer/hooks/useExportHandlers.ts
|
|
@@ -7104,21 +7110,21 @@ function useExportHandlers(input) {
|
|
|
7104
7110
|
{
|
|
7105
7111
|
scale: 2,
|
|
7106
7112
|
onProgress: (current, total) => {
|
|
7107
|
-
setExportProgress(
|
|
7108
|
-
setExportStatusMessage(
|
|
7113
|
+
setExportProgress(chunkHMQVOPQH_js.slideProgressPercent(current, total));
|
|
7114
|
+
setExportStatusMessage(chunkHMQVOPQH_js.slideStatusLabel("Rendering", current, total));
|
|
7109
7115
|
},
|
|
7110
7116
|
signal: abortCtrl.signal
|
|
7111
7117
|
}
|
|
7112
7118
|
);
|
|
7113
|
-
setExportProgress(
|
|
7119
|
+
setExportProgress(chunkHMQVOPQH_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7114
7120
|
setExportStatusMessage("Building PDF...");
|
|
7115
7121
|
await new Promise((r) => {
|
|
7116
7122
|
setTimeout(r, 100);
|
|
7117
7123
|
});
|
|
7118
|
-
setExportProgress(
|
|
7124
|
+
setExportProgress(chunkHMQVOPQH_js.EXPORT_DONE_PERCENT);
|
|
7119
7125
|
setExportStatusMessage("Done!");
|
|
7120
7126
|
} catch (err) {
|
|
7121
|
-
if (!
|
|
7127
|
+
if (!chunkHMQVOPQH_js.isExportAbortError(err)) {
|
|
7122
7128
|
console.error("[PowerPointViewer] PDF export failed:", err);
|
|
7123
7129
|
}
|
|
7124
7130
|
} finally {
|
|
@@ -7148,21 +7154,21 @@ function useExportHandlers(input) {
|
|
|
7148
7154
|
{
|
|
7149
7155
|
scale: 2,
|
|
7150
7156
|
onProgress: (current, total) => {
|
|
7151
|
-
setExportProgress(
|
|
7152
|
-
setExportStatusMessage(
|
|
7157
|
+
setExportProgress(chunkHMQVOPQH_js.slideProgressPercent(current, total));
|
|
7158
|
+
setExportStatusMessage(chunkHMQVOPQH_js.slideStatusLabel("Rendering", current, total));
|
|
7153
7159
|
},
|
|
7154
7160
|
signal: abortCtrl.signal
|
|
7155
7161
|
}
|
|
7156
7162
|
);
|
|
7157
|
-
setExportProgress(
|
|
7163
|
+
setExportProgress(chunkHMQVOPQH_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7158
7164
|
setExportStatusMessage("Building PDF...");
|
|
7159
7165
|
await new Promise((r) => {
|
|
7160
7166
|
setTimeout(r, 100);
|
|
7161
7167
|
});
|
|
7162
|
-
setExportProgress(
|
|
7168
|
+
setExportProgress(chunkHMQVOPQH_js.EXPORT_DONE_PERCENT);
|
|
7163
7169
|
setExportStatusMessage("Done!");
|
|
7164
7170
|
} catch (err) {
|
|
7165
|
-
if (!
|
|
7171
|
+
if (!chunkHMQVOPQH_js.isExportAbortError(err)) {
|
|
7166
7172
|
console.error("[PowerPointViewer] Notes PDF export failed:", err);
|
|
7167
7173
|
}
|
|
7168
7174
|
} finally {
|
|
@@ -7203,22 +7209,22 @@ function useExportHandlers(input) {
|
|
|
7203
7209
|
scale: 1,
|
|
7204
7210
|
slideDurationMs: 3e3,
|
|
7205
7211
|
onProgress: (current, total) => {
|
|
7206
|
-
setExportProgress(
|
|
7207
|
-
setExportStatusMessage(
|
|
7212
|
+
setExportProgress(chunkHMQVOPQH_js.slideProgressPercent(current, total, 45));
|
|
7213
|
+
setExportStatusMessage(chunkHMQVOPQH_js.slideStatusLabel("Capturing", current, total));
|
|
7208
7214
|
},
|
|
7209
7215
|
onRecordProgress: (current, total) => {
|
|
7210
|
-
setExportProgress(
|
|
7211
|
-
setExportStatusMessage(
|
|
7216
|
+
setExportProgress(chunkHMQVOPQH_js.recordProgressPercent(current, total));
|
|
7217
|
+
setExportStatusMessage(chunkHMQVOPQH_js.slideStatusLabel("Recording", current, total));
|
|
7212
7218
|
},
|
|
7213
7219
|
signal: abortCtrl.signal
|
|
7214
7220
|
}
|
|
7215
7221
|
);
|
|
7216
|
-
setExportProgress(
|
|
7222
|
+
setExportProgress(chunkHMQVOPQH_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7217
7223
|
setExportStatusMessage("Saving file...");
|
|
7218
7224
|
downloadBlob2(blob, "presentation.webm");
|
|
7219
|
-
setExportProgress(
|
|
7225
|
+
setExportProgress(chunkHMQVOPQH_js.EXPORT_DONE_PERCENT);
|
|
7220
7226
|
} catch (err) {
|
|
7221
|
-
if (!
|
|
7227
|
+
if (!chunkHMQVOPQH_js.isExportAbortError(err)) {
|
|
7222
7228
|
console.error("[PowerPointViewer] Video export failed:", err);
|
|
7223
7229
|
}
|
|
7224
7230
|
} finally {
|
|
@@ -7246,18 +7252,18 @@ function useExportHandlers(input) {
|
|
|
7246
7252
|
scale: 0.5,
|
|
7247
7253
|
slideDurationMs: 2e3,
|
|
7248
7254
|
onProgress: (current, total) => {
|
|
7249
|
-
setExportProgress(
|
|
7250
|
-
setExportStatusMessage(
|
|
7255
|
+
setExportProgress(chunkHMQVOPQH_js.slideProgressPercent(current, total));
|
|
7256
|
+
setExportStatusMessage(chunkHMQVOPQH_js.slideStatusLabel("Encoding", current, total));
|
|
7251
7257
|
},
|
|
7252
7258
|
signal: abortCtrl.signal
|
|
7253
7259
|
}
|
|
7254
7260
|
);
|
|
7255
|
-
setExportProgress(
|
|
7261
|
+
setExportProgress(chunkHMQVOPQH_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7256
7262
|
setExportStatusMessage("Saving file...");
|
|
7257
7263
|
downloadBlob2(blob, "presentation.gif");
|
|
7258
|
-
setExportProgress(
|
|
7264
|
+
setExportProgress(chunkHMQVOPQH_js.EXPORT_DONE_PERCENT);
|
|
7259
7265
|
} catch (err) {
|
|
7260
|
-
if (!
|
|
7266
|
+
if (!chunkHMQVOPQH_js.isExportAbortError(err)) {
|
|
7261
7267
|
console.error("[PowerPointViewer] GIF export failed:", err);
|
|
7262
7268
|
}
|
|
7263
7269
|
} finally {
|
|
@@ -7297,7 +7303,7 @@ function openPrintWindow(title, bodyHtml, orientation, colorFilter, frameSlides)
|
|
|
7297
7303
|
}
|
|
7298
7304
|
printWindow.document.open();
|
|
7299
7305
|
printWindow.document.write(
|
|
7300
|
-
|
|
7306
|
+
chunkHMQVOPQH_js.buildPrintHtmlDocument({ title, bodyHtml, orientation, colorFilter, frameSlides })
|
|
7301
7307
|
);
|
|
7302
7308
|
printWindow.document.close();
|
|
7303
7309
|
printWindow.focus();
|
|
@@ -7358,7 +7364,7 @@ function usePrintHandlers(input) {
|
|
|
7358
7364
|
if (svgs.length === 0) {
|
|
7359
7365
|
return;
|
|
7360
7366
|
}
|
|
7361
|
-
const printDoc =
|
|
7367
|
+
const printDoc = chunkHMQVOPQH_js.buildPrintDocument(svgs, pptxData.width, pptxData.height, {
|
|
7362
7368
|
title: "Slides (Vector)",
|
|
7363
7369
|
orientation: settings.orientation,
|
|
7364
7370
|
colorFilter
|
|
@@ -7394,7 +7400,7 @@ function usePrintHandlers(input) {
|
|
|
7394
7400
|
if (settings.printWhat === "outline") {
|
|
7395
7401
|
openPrintWindow(
|
|
7396
7402
|
"Outline",
|
|
7397
|
-
`<div class="outline-page">${
|
|
7403
|
+
`<div class="outline-page">${chunkHMQVOPQH_js.buildOutlineHtml(slideIndices, slides)}</div>`,
|
|
7398
7404
|
settings.orientation,
|
|
7399
7405
|
colorFilter,
|
|
7400
7406
|
settings.frameSlides
|
|
@@ -7419,7 +7425,7 @@ function usePrintHandlers(input) {
|
|
|
7419
7425
|
if (settings.printWhat === "slides") {
|
|
7420
7426
|
openPrintWindow(
|
|
7421
7427
|
"Slides",
|
|
7422
|
-
|
|
7428
|
+
chunkHMQVOPQH_js.buildSlidesHtml(slideImages, slideIndices),
|
|
7423
7429
|
settings.orientation,
|
|
7424
7430
|
colorFilter,
|
|
7425
7431
|
settings.frameSlides
|
|
@@ -7429,7 +7435,7 @@ function usePrintHandlers(input) {
|
|
|
7429
7435
|
if (settings.printWhat === "notes") {
|
|
7430
7436
|
openPrintWindow(
|
|
7431
7437
|
"Notes Pages",
|
|
7432
|
-
|
|
7438
|
+
chunkHMQVOPQH_js.buildNotesHtml(slideImages, slideIndices, slides),
|
|
7433
7439
|
"portrait",
|
|
7434
7440
|
colorFilter,
|
|
7435
7441
|
settings.frameSlides
|
|
@@ -7440,7 +7446,7 @@ function usePrintHandlers(input) {
|
|
|
7440
7446
|
const spp = settings.slidesPerPage;
|
|
7441
7447
|
openPrintWindow(
|
|
7442
7448
|
`Handout ${spp} per page`,
|
|
7443
|
-
|
|
7449
|
+
chunkHMQVOPQH_js.buildHandoutsHtml(slideImages, slideIndices, spp),
|
|
7444
7450
|
"portrait",
|
|
7445
7451
|
colorFilter,
|
|
7446
7452
|
settings.frameSlides
|
|
@@ -7504,8 +7510,8 @@ function useThemeHandlers(input) {
|
|
|
7504
7510
|
return;
|
|
7505
7511
|
}
|
|
7506
7512
|
await handler.updateThemeColorScheme(colorScheme);
|
|
7507
|
-
const previousMap = theme?.colorScheme ?
|
|
7508
|
-
setSlides((prev) =>
|
|
7513
|
+
const previousMap = theme?.colorScheme ? chunkHMQVOPQH_js.buildThemeColorMap(theme.colorScheme) : {};
|
|
7514
|
+
setSlides((prev) => chunkHMQVOPQH_js.reResolveSlideColors(prev, previousMap, colorScheme));
|
|
7509
7515
|
setTheme((prev) => prev ? { ...prev, colorScheme } : { colorScheme });
|
|
7510
7516
|
bumpHistory();
|
|
7511
7517
|
history.markDirty();
|
|
@@ -7610,7 +7616,7 @@ function useThemeSwitching(input) {
|
|
|
7610
7616
|
}
|
|
7611
7617
|
try {
|
|
7612
7618
|
await handler.applyTheme(preset.colorScheme, preset.fontScheme, preset.name);
|
|
7613
|
-
const newData =
|
|
7619
|
+
const newData = chunkHMQVOPQH_js.applyThemeToData(data, preset.colorScheme, preset.fontScheme, preset.name);
|
|
7614
7620
|
onDataChange(newData);
|
|
7615
7621
|
onThemeChanged?.(preset);
|
|
7616
7622
|
} catch (error) {
|
|
@@ -7627,7 +7633,7 @@ function useThemeSwitching(input) {
|
|
|
7627
7633
|
}
|
|
7628
7634
|
try {
|
|
7629
7635
|
await handler.applyTheme(colorScheme, fontScheme ?? {}, themeName);
|
|
7630
|
-
const newData =
|
|
7636
|
+
const newData = chunkHMQVOPQH_js.applyThemeToData(data, colorScheme, fontScheme, themeName);
|
|
7631
7637
|
onDataChange(newData);
|
|
7632
7638
|
} catch (error) {
|
|
7633
7639
|
console.error("Failed to switch to custom theme:", error);
|
|
@@ -7639,12 +7645,12 @@ function useThemeSwitching(input) {
|
|
|
7639
7645
|
if (!data?.theme?.colorScheme) {
|
|
7640
7646
|
return void 0;
|
|
7641
7647
|
}
|
|
7642
|
-
return
|
|
7643
|
-
(p) =>
|
|
7648
|
+
return chunkHMQVOPQH_js.THEME_PRESETS.find(
|
|
7649
|
+
(p) => chunkHMQVOPQH_js.themeColorSchemesEqual(data.theme?.colorScheme, p.colorScheme)
|
|
7644
7650
|
);
|
|
7645
7651
|
}, [data?.theme?.colorScheme]);
|
|
7646
7652
|
return {
|
|
7647
|
-
presets:
|
|
7653
|
+
presets: chunkHMQVOPQH_js.THEME_PRESETS,
|
|
7648
7654
|
switchToPreset,
|
|
7649
7655
|
switchToCustom,
|
|
7650
7656
|
currentPreset
|
|
@@ -7719,7 +7725,7 @@ function usePropertyHandlers(input) {
|
|
|
7719
7725
|
}
|
|
7720
7726
|
try {
|
|
7721
7727
|
const ab = await file.arrayBuffer();
|
|
7722
|
-
const h = new
|
|
7728
|
+
const h = new chunkHMQVOPQH_js.PptxHandler();
|
|
7723
7729
|
const other = await h.load(ab);
|
|
7724
7730
|
if (!other) {
|
|
7725
7731
|
return;
|
|
@@ -7729,7 +7735,7 @@ function usePropertyHandlers(input) {
|
|
|
7729
7735
|
width: canvasSize.width,
|
|
7730
7736
|
height: canvasSize.height
|
|
7731
7737
|
};
|
|
7732
|
-
setCompareResult(
|
|
7738
|
+
setCompareResult(chunkHMQVOPQH_js.comparePresentation(cur, other));
|
|
7733
7739
|
setIsComparePanelOpen(true);
|
|
7734
7740
|
} catch (err) {
|
|
7735
7741
|
console.warn("Compare failed:", err);
|
|
@@ -7746,7 +7752,7 @@ function usePropertyHandlers(input) {
|
|
|
7746
7752
|
if (!diff || diff.status === "unchanged") {
|
|
7747
7753
|
return;
|
|
7748
7754
|
}
|
|
7749
|
-
setSlides((prev) =>
|
|
7755
|
+
setSlides((prev) => chunkHMQVOPQH_js.applyAcceptSlide(prev, diff));
|
|
7750
7756
|
setIsDirty(true);
|
|
7751
7757
|
},
|
|
7752
7758
|
[compareResult, setSlides, setIsDirty]
|
|
@@ -7757,10 +7763,10 @@ function usePropertyHandlers(input) {
|
|
|
7757
7763
|
if (!compareResult) {
|
|
7758
7764
|
return;
|
|
7759
7765
|
}
|
|
7760
|
-
setSlides((prev) =>
|
|
7766
|
+
setSlides((prev) => chunkHMQVOPQH_js.applyAcceptAllSlides(prev, compareResult));
|
|
7761
7767
|
setIsDirty(true);
|
|
7762
7768
|
}, [compareResult, setSlides, setIsDirty]);
|
|
7763
|
-
const usedFontFamilies = react.useMemo(() =>
|
|
7769
|
+
const usedFontFamilies = react.useMemo(() => chunkHMQVOPQH_js.collectUsedFonts(slides), [slides]);
|
|
7764
7770
|
return {
|
|
7765
7771
|
handleUpdateNotes,
|
|
7766
7772
|
handleUpdateSlide,
|
|
@@ -7879,7 +7885,7 @@ function useIsMobile(input) {
|
|
|
7879
7885
|
const containerRef = input?.containerRef;
|
|
7880
7886
|
const isTouchDevice = react.useSyncExternalStore(
|
|
7881
7887
|
subscribeTouchCapability,
|
|
7882
|
-
|
|
7888
|
+
chunkHMQVOPQH_js.detectTouchDevice,
|
|
7883
7889
|
() => false
|
|
7884
7890
|
// server snapshot
|
|
7885
7891
|
);
|
|
@@ -7895,7 +7901,7 @@ function useIsMobile(input) {
|
|
|
7895
7901
|
}
|
|
7896
7902
|
return containerRef?.current?.clientHeight ?? window.innerHeight;
|
|
7897
7903
|
});
|
|
7898
|
-
const [orientation, setOrientation] = react.useState(
|
|
7904
|
+
const [orientation, setOrientation] = react.useState(chunkHMQVOPQH_js.detectOrientation);
|
|
7899
7905
|
const [isVirtualKeyboardOpen, setIsVirtualKeyboardOpen] = react.useState(false);
|
|
7900
7906
|
const [initialViewportHeight] = react.useState(
|
|
7901
7907
|
() => typeof window !== "undefined" ? window.innerHeight : 800
|
|
@@ -7939,7 +7945,7 @@ function useIsMobile(input) {
|
|
|
7939
7945
|
return;
|
|
7940
7946
|
}
|
|
7941
7947
|
const handleOrientationChange = () => {
|
|
7942
|
-
setOrientation(
|
|
7948
|
+
setOrientation(chunkHMQVOPQH_js.detectOrientation());
|
|
7943
7949
|
};
|
|
7944
7950
|
if (screen.orientation) {
|
|
7945
7951
|
screen.orientation.addEventListener("change", handleOrientationChange);
|
|
@@ -7969,9 +7975,9 @@ function useIsMobile(input) {
|
|
|
7969
7975
|
window.addEventListener("resize", handleResize);
|
|
7970
7976
|
return () => window.removeEventListener("resize", handleResize);
|
|
7971
7977
|
}, [isTouchDevice, initialViewportHeight]);
|
|
7972
|
-
const isMobile =
|
|
7973
|
-
const isTablet = !isMobile && containerWidth >=
|
|
7974
|
-
const isDesktop = !isMobile && containerWidth >=
|
|
7978
|
+
const isMobile = chunkHMQVOPQH_js.isMobileViewport(containerWidth, containerHeight, isTouchDevice);
|
|
7979
|
+
const isTablet = !isMobile && containerWidth >= chunkHMQVOPQH_js.MOBILE_BREAKPOINT && containerWidth < chunkHMQVOPQH_js.TABLET_BREAKPOINT;
|
|
7980
|
+
const isDesktop = !isMobile && containerWidth >= chunkHMQVOPQH_js.TABLET_BREAKPOINT;
|
|
7975
7981
|
return {
|
|
7976
7982
|
isMobile,
|
|
7977
7983
|
isTablet,
|
|
@@ -8032,11 +8038,11 @@ function useViewerDialogs(input) {
|
|
|
8032
8038
|
);
|
|
8033
8039
|
const [embedFontsEnabled, setEmbedFontsEnabled] = react.useState(false);
|
|
8034
8040
|
const [isNarrowViewport, setIsNarrowViewport] = react.useState(
|
|
8035
|
-
() => typeof window !== "undefined" ?
|
|
8041
|
+
() => typeof window !== "undefined" ? chunkHMQVOPQH_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch()) : false
|
|
8036
8042
|
);
|
|
8037
8043
|
react.useEffect(() => {
|
|
8038
8044
|
const handleWindow = () => setIsNarrowViewport(
|
|
8039
|
-
|
|
8045
|
+
chunkHMQVOPQH_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch())
|
|
8040
8046
|
);
|
|
8041
8047
|
let observer = null;
|
|
8042
8048
|
let raf = 0;
|
|
@@ -8050,12 +8056,12 @@ function useViewerDialogs(input) {
|
|
|
8050
8056
|
const entry = entries[0];
|
|
8051
8057
|
if (entry) {
|
|
8052
8058
|
setIsNarrowViewport(
|
|
8053
|
-
|
|
8059
|
+
chunkHMQVOPQH_js.isMobileViewport(entry.contentRect.width, entry.contentRect.height, viewportIsTouch())
|
|
8054
8060
|
);
|
|
8055
8061
|
}
|
|
8056
8062
|
});
|
|
8057
8063
|
observer.observe(el);
|
|
8058
|
-
setIsNarrowViewport(
|
|
8064
|
+
setIsNarrowViewport(chunkHMQVOPQH_js.isMobileViewport(el.clientWidth, el.clientHeight, viewportIsTouch()));
|
|
8059
8065
|
};
|
|
8060
8066
|
attach();
|
|
8061
8067
|
window.addEventListener("resize", handleWindow);
|
|
@@ -8213,12 +8219,12 @@ function useViewerDialogs(input) {
|
|
|
8213
8219
|
}
|
|
8214
8220
|
function computeGridSpacingPx(presentationGridSpacing) {
|
|
8215
8221
|
if (presentationGridSpacing) {
|
|
8216
|
-
const px = Math.round(presentationGridSpacing.cx /
|
|
8222
|
+
const px = Math.round(presentationGridSpacing.cx / chunkMM5RMRSP_js.EMU_PER_PX);
|
|
8217
8223
|
if (px > 0) {
|
|
8218
8224
|
return px;
|
|
8219
8225
|
}
|
|
8220
8226
|
}
|
|
8221
|
-
return
|
|
8227
|
+
return chunkMM5RMRSP_js.GRID_SIZE;
|
|
8222
8228
|
}
|
|
8223
8229
|
function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows) {
|
|
8224
8230
|
if (activeCustomShowId) {
|
|
@@ -8232,8 +8238,8 @@ function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows) {
|
|
|
8232
8238
|
return slides.map((_, i) => i).filter((i) => !slides[i]?.hidden);
|
|
8233
8239
|
}
|
|
8234
8240
|
function computeSlideSectionGroups(slides, sections) {
|
|
8235
|
-
return
|
|
8236
|
-
id: group.section?.id ?? (sections.length > 0 ?
|
|
8241
|
+
return chunkHMQVOPQH_js.groupSlidesBySection(sections, slides).map((group) => ({
|
|
8242
|
+
id: group.section?.id ?? (sections.length > 0 ? chunkMM5RMRSP_js.UNGROUPED_SECTION_ID : "default"),
|
|
8237
8243
|
label: group.section?.name ?? (sections.length > 0 ? "Ungrouped Slides" : "Slides"),
|
|
8238
8244
|
slideIndexes: group.slideIndexes,
|
|
8239
8245
|
...group.section?.color !== void 0 ? { color: group.section.color } : {},
|
|
@@ -8288,7 +8294,7 @@ function useDerivedSlideState(input) {
|
|
|
8288
8294
|
);
|
|
8289
8295
|
const slideSectionGroups = react.useMemo(
|
|
8290
8296
|
() => computeSlideSectionGroups(slides, sections).map((group) => {
|
|
8291
|
-
if (group.id ===
|
|
8297
|
+
if (group.id === chunkMM5RMRSP_js.UNGROUPED_SECTION_ID && group.label === "Ungrouped Slides") {
|
|
8292
8298
|
return { ...group, label: t("pptx.slides.ungroupedSlides") };
|
|
8293
8299
|
}
|
|
8294
8300
|
if (group.id === "default" && group.label === "Slides") {
|
|
@@ -8391,13 +8397,13 @@ function useAnnotationHandlers(input) {
|
|
|
8391
8397
|
}, [annotations, setMode, setSlides, history]);
|
|
8392
8398
|
const handleSetMode = react.useCallback(
|
|
8393
8399
|
(nextMode) => {
|
|
8394
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8400
|
+
if (mode === "present" && nextMode !== "present" && !chunkHMQVOPQH_js.mayLeaveSlideShow()) {
|
|
8395
8401
|
return;
|
|
8396
8402
|
}
|
|
8397
8403
|
if (nextMode === "present") {
|
|
8398
8404
|
presentation.enterPresentMode();
|
|
8399
8405
|
} else if (mode === "present" && annotations.hasAnyAnnotations) {
|
|
8400
|
-
|
|
8406
|
+
chunkMM5RMRSP_js.stopAllPersistentAudio();
|
|
8401
8407
|
pendingModeAfterAnnotationsRef.current = nextMode;
|
|
8402
8408
|
if (promptKeepInkAnnotations) {
|
|
8403
8409
|
setShowKeepAnnotationsDialog(true);
|
|
@@ -8406,7 +8412,7 @@ function useAnnotationHandlers(input) {
|
|
|
8406
8412
|
}
|
|
8407
8413
|
} else {
|
|
8408
8414
|
if (mode === "present") {
|
|
8409
|
-
|
|
8415
|
+
chunkMM5RMRSP_js.stopAllPersistentAudio();
|
|
8410
8416
|
}
|
|
8411
8417
|
setMode(nextMode);
|
|
8412
8418
|
}
|
|
@@ -8472,13 +8478,13 @@ function useSerialize(input) {
|
|
|
8472
8478
|
let processedSlide = slide;
|
|
8473
8479
|
if (pendingEditId) {
|
|
8474
8480
|
const updatedElements = slide.elements.map((el) => {
|
|
8475
|
-
if (el.id !== pendingEditId || !
|
|
8481
|
+
if (el.id !== pendingEditId || !chunkHMQVOPQH_js.hasTextProperties(el)) {
|
|
8476
8482
|
return el;
|
|
8477
8483
|
}
|
|
8478
8484
|
return {
|
|
8479
8485
|
...el,
|
|
8480
8486
|
text: pendingEditText,
|
|
8481
|
-
textSegments:
|
|
8487
|
+
textSegments: chunkHMQVOPQH_js.remapTextToSegments(pendingEditText, el.textSegments, el.textStyle)
|
|
8482
8488
|
};
|
|
8483
8489
|
});
|
|
8484
8490
|
if (updatedElements.some((el, i) => el !== slide.elements[i])) {
|
|
@@ -8491,14 +8497,14 @@ function useSerialize(input) {
|
|
|
8491
8497
|
const pptxGuides = guides.map((g) => ({
|
|
8492
8498
|
id: g.id,
|
|
8493
8499
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
8494
|
-
positionEmu:
|
|
8500
|
+
positionEmu: chunkHMQVOPQH_js.guidePxToEmu(g.position)
|
|
8495
8501
|
}));
|
|
8496
8502
|
return {
|
|
8497
8503
|
...processedSlide,
|
|
8498
8504
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
8499
8505
|
};
|
|
8500
8506
|
});
|
|
8501
|
-
const slidesToSave =
|
|
8507
|
+
const slidesToSave = chunkMM5RMRSP_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
8502
8508
|
const saveOptions = {
|
|
8503
8509
|
headerFooter,
|
|
8504
8510
|
presentationProperties,
|
|
@@ -8667,7 +8673,7 @@ function usePresentationSetup(input) {
|
|
|
8667
8673
|
containerRef,
|
|
8668
8674
|
content,
|
|
8669
8675
|
onSetMode: (nextMode) => {
|
|
8670
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8676
|
+
if (mode === "present" && nextMode !== "present" && !chunkHMQVOPQH_js.mayLeaveSlideShow()) {
|
|
8671
8677
|
return;
|
|
8672
8678
|
}
|
|
8673
8679
|
if (mode === "present" && nextMode !== "present" && annotations.hasAnyAnnotations && promptKeepInkAnnotations) {
|
|
@@ -8675,7 +8681,7 @@ function usePresentationSetup(input) {
|
|
|
8675
8681
|
setShowKeepAnnotationsDialog(true);
|
|
8676
8682
|
} else {
|
|
8677
8683
|
if (mode === "present" && nextMode !== "present") {
|
|
8678
|
-
|
|
8684
|
+
chunkMM5RMRSP_js.stopAllPersistentAudio();
|
|
8679
8685
|
stopAnimationSound();
|
|
8680
8686
|
}
|
|
8681
8687
|
setMode(nextMode);
|
|
@@ -8729,10 +8735,10 @@ function usePresentationSetup(input) {
|
|
|
8729
8735
|
onToggleInkMarkup: () => annotations.setInkMarkupVisible(!annotations.inkMarkupVisible),
|
|
8730
8736
|
onToggleToolbar: () => annotations.setToolbarVisible(!annotations.toolbarVisible),
|
|
8731
8737
|
onSaveRehearsalTimings: (timings) => {
|
|
8732
|
-
setSlides((prev) =>
|
|
8738
|
+
setSlides((prev) => chunkHMQVOPQH_js.applyRehearsalTimings(prev, timings));
|
|
8733
8739
|
history.markDirty();
|
|
8734
8740
|
},
|
|
8735
|
-
loopContinuously:
|
|
8741
|
+
loopContinuously: chunkHMQVOPQH_js.shouldLoopContinuously(presentationProperties),
|
|
8736
8742
|
showWithAnimation: presentationProperties.showWithAnimation,
|
|
8737
8743
|
useTimings: presentationProperties.advanceMode !== "manual",
|
|
8738
8744
|
endWithBlackSlide
|
|
@@ -8894,7 +8900,7 @@ function useEditorOperations(input) {
|
|
|
8894
8900
|
const { formatPainterActive, setFormatPainterActive, elementLookup } = state;
|
|
8895
8901
|
react.useEffect(() => {
|
|
8896
8902
|
if (formatPainterActive && !prevFormatPainterRef.current && selectedElement) {
|
|
8897
|
-
copiedFormatRef.current =
|
|
8903
|
+
copiedFormatRef.current = chunkHMQVOPQH_js.copyFormatFromElement(selectedElement);
|
|
8898
8904
|
} else if (!formatPainterActive) {
|
|
8899
8905
|
copiedFormatRef.current = null;
|
|
8900
8906
|
}
|
|
@@ -8920,12 +8926,12 @@ function useEditorOperations(input) {
|
|
|
8920
8926
|
e.stopPropagation();
|
|
8921
8927
|
const element = elementLookup.get(elementId);
|
|
8922
8928
|
if (element) {
|
|
8923
|
-
const updated =
|
|
8929
|
+
const updated = chunkHMQVOPQH_js.applyFormatToElement(element, copiedFormatRef.current);
|
|
8924
8930
|
const updates = {};
|
|
8925
|
-
if (
|
|
8931
|
+
if (chunkHMQVOPQH_js.hasShapeProperties(updated)) {
|
|
8926
8932
|
updates.shapeStyle = updated.shapeStyle;
|
|
8927
8933
|
}
|
|
8928
|
-
if (
|
|
8934
|
+
if (chunkHMQVOPQH_js.hasTextProperties(updated)) {
|
|
8929
8935
|
updates.textStyle = updated.textStyle;
|
|
8930
8936
|
}
|
|
8931
8937
|
ops.updateElementById(elementId, updates);
|
|
@@ -9072,7 +9078,7 @@ function collectReferencedFontFamilies(slides) {
|
|
|
9072
9078
|
const families = /* @__PURE__ */ new Set();
|
|
9073
9079
|
for (const slide of slides) {
|
|
9074
9080
|
for (const el of slide.elements) {
|
|
9075
|
-
if (
|
|
9081
|
+
if (chunkHMQVOPQH_js.hasTextProperties(el) && el.textSegments) {
|
|
9076
9082
|
for (const seg of el.textSegments) {
|
|
9077
9083
|
if (seg.style.fontFamily) {
|
|
9078
9084
|
families.add(seg.style.fontFamily);
|
|
@@ -9284,13 +9290,13 @@ function useKeyboardShortcuts(input) {
|
|
|
9284
9290
|
inputRef.current = input;
|
|
9285
9291
|
const handleKeyDown = react.useCallback((e) => {
|
|
9286
9292
|
const current = inputRef.current;
|
|
9287
|
-
const { action, dx, dy } =
|
|
9293
|
+
const { action, dx, dy } = chunkHMQVOPQH_js.mapEditorKey(e, {
|
|
9288
9294
|
canEdit: current.canEdit,
|
|
9289
9295
|
isPresenting: current.mode !== "edit",
|
|
9290
9296
|
hasSelection: current.hasSelection,
|
|
9291
9297
|
isEditingText: Boolean(current.inlineEditingElementId || current.tableEditorState?.isEditing),
|
|
9292
9298
|
isDrawing: current.activeTool !== "select",
|
|
9293
|
-
isTextInputTarget:
|
|
9299
|
+
isTextInputTarget: chunkHMQVOPQH_js.isEditorTextInputTarget(e.target)
|
|
9294
9300
|
});
|
|
9295
9301
|
if (action === null) {
|
|
9296
9302
|
return;
|
|
@@ -9583,7 +9589,7 @@ function useViewerIntegration(input) {
|
|
|
9583
9589
|
return zoom.scale;
|
|
9584
9590
|
},
|
|
9585
9591
|
setZoom(level) {
|
|
9586
|
-
zoom.setScale(
|
|
9592
|
+
zoom.setScale(chunkHMQVOPQH_js.clampZoomScale(level));
|
|
9587
9593
|
},
|
|
9588
9594
|
zoomIn() {
|
|
9589
9595
|
zoom.handleZoomIn();
|
|
@@ -9798,7 +9804,7 @@ function useReducedMotion() {
|
|
|
9798
9804
|
}
|
|
9799
9805
|
function useViewerOptions() {
|
|
9800
9806
|
const storeRef = react.useRef(null);
|
|
9801
|
-
storeRef.current ??=
|
|
9807
|
+
storeRef.current ??= chunkHMQVOPQH_js.createViewerOptionsStore();
|
|
9802
9808
|
const store = storeRef.current;
|
|
9803
9809
|
const options = react.useSyncExternalStore(
|
|
9804
9810
|
(onStoreChange) => store.subscribe(onStoreChange),
|
|
@@ -9807,9 +9813,9 @@ function useViewerOptions() {
|
|
|
9807
9813
|
);
|
|
9808
9814
|
return { optionsStore: store, options };
|
|
9809
9815
|
}
|
|
9810
|
-
var KNOWN_TAB_IDS = new Set(
|
|
9816
|
+
var KNOWN_TAB_IDS = new Set(chunkHMQVOPQH_js.TOOLBAR_TABS.map((tab) => tab.id));
|
|
9811
9817
|
function computeToolbarVisibility(hiddenActions) {
|
|
9812
|
-
const isHidden = (id) =>
|
|
9818
|
+
const isHidden = (id) => chunkHMQVOPQH_js.isActionHidden(id, hiddenActions);
|
|
9813
9819
|
const isTabVisible = (id) => !KNOWN_TAB_IDS.has(id) || !isHidden(id);
|
|
9814
9820
|
return { isHidden, isTabVisible };
|
|
9815
9821
|
}
|
|
@@ -9894,12 +9900,12 @@ function useYjsDocumentSync({
|
|
|
9894
9900
|
return;
|
|
9895
9901
|
}
|
|
9896
9902
|
try {
|
|
9897
|
-
const handler = new
|
|
9903
|
+
const handler = new chunkHMQVOPQH_js.PptxHandler();
|
|
9898
9904
|
await handler.load(sourceBytes.buffer);
|
|
9899
|
-
const currentSlides =
|
|
9905
|
+
const currentSlides = chunkHMQVOPQH_js.readSlidesFromYDoc(
|
|
9900
9906
|
doc
|
|
9901
9907
|
);
|
|
9902
|
-
const slidesToSave =
|
|
9908
|
+
const slidesToSave = chunkMM5RMRSP_js.buildSaveSlides(currentSlides, templateElementsBySlideId);
|
|
9903
9909
|
const bytes = await handler.save(slidesToSave);
|
|
9904
9910
|
config.onWriteBack(bytes);
|
|
9905
9911
|
} catch {
|
|
@@ -9914,7 +9920,7 @@ function useYjsDocumentSync({
|
|
|
9914
9920
|
if (!doc || !isConnected) {
|
|
9915
9921
|
return;
|
|
9916
9922
|
}
|
|
9917
|
-
const docSlides =
|
|
9923
|
+
const docSlides = chunkHMQVOPQH_js.readSlidesFromYDoc(
|
|
9918
9924
|
doc
|
|
9919
9925
|
);
|
|
9920
9926
|
if (docSlides.length === 0) {
|
|
@@ -9936,11 +9942,11 @@ function useYjsDocumentSync({
|
|
|
9936
9942
|
lastSyncedRef.current = serialized;
|
|
9937
9943
|
void (async () => {
|
|
9938
9944
|
const factories = await getFactories();
|
|
9939
|
-
|
|
9945
|
+
chunkHMQVOPQH_js.reconcileSlidesInYDoc(
|
|
9940
9946
|
slides,
|
|
9941
9947
|
doc,
|
|
9942
9948
|
factories,
|
|
9943
|
-
|
|
9949
|
+
chunkHMQVOPQH_js.LOCAL_SYNC_ORIGIN
|
|
9944
9950
|
);
|
|
9945
9951
|
scheduleWriteBack();
|
|
9946
9952
|
})();
|
|
@@ -9954,10 +9960,10 @@ function useYjsDocumentSync({
|
|
|
9954
9960
|
return;
|
|
9955
9961
|
}
|
|
9956
9962
|
const handleChange = (_events, transaction) => {
|
|
9957
|
-
if (transaction?.origin ===
|
|
9963
|
+
if (transaction?.origin === chunkHMQVOPQH_js.LOCAL_SYNC_ORIGIN) {
|
|
9958
9964
|
return;
|
|
9959
9965
|
}
|
|
9960
|
-
const remoteSlides =
|
|
9966
|
+
const remoteSlides = chunkHMQVOPQH_js.readSlidesFromYDoc(
|
|
9961
9967
|
doc
|
|
9962
9968
|
);
|
|
9963
9969
|
if (remoteSlides.length === 0) {
|
|
@@ -9973,7 +9979,7 @@ function useYjsDocumentSync({
|
|
|
9973
9979
|
isApplyingRemoteRef.current = false;
|
|
9974
9980
|
scheduleWriteBack();
|
|
9975
9981
|
};
|
|
9976
|
-
const unobserve =
|
|
9982
|
+
const unobserve = chunkHMQVOPQH_js.observeYDocSlides(
|
|
9977
9983
|
doc,
|
|
9978
9984
|
handleChange
|
|
9979
9985
|
);
|
|
@@ -10011,7 +10017,7 @@ function useBroadcastFollower({
|
|
|
10011
10017
|
if (!broadcaster) {
|
|
10012
10018
|
return;
|
|
10013
10019
|
}
|
|
10014
|
-
if (!
|
|
10020
|
+
if (!chunkHMQVOPQH_js.shouldAutoFollowBroadcaster({
|
|
10015
10021
|
localRole: collab.config.role,
|
|
10016
10022
|
broadcasterRole: broadcaster.role
|
|
10017
10023
|
})) {
|
|
@@ -10171,10 +10177,10 @@ function useTouchGestures(input) {
|
|
|
10171
10177
|
if (!el || !enabled) {
|
|
10172
10178
|
return;
|
|
10173
10179
|
}
|
|
10174
|
-
const recognizer =
|
|
10180
|
+
const recognizer = chunkHMQVOPQH_js.createTouchGestureRecognizer({
|
|
10175
10181
|
getScale: () => scaleRef.current,
|
|
10176
|
-
minScale:
|
|
10177
|
-
maxScale:
|
|
10182
|
+
minScale: chunkHMQVOPQH_js.MIN_ZOOM_SCALE,
|
|
10183
|
+
maxScale: chunkHMQVOPQH_js.MAX_ZOOM_SCALE,
|
|
10178
10184
|
callbacks: {
|
|
10179
10185
|
onPinchZoom: (newScale) => callbacksRef.current.onPinchZoom?.(newScale),
|
|
10180
10186
|
onSwipe: (direction) => callbacksRef.current.onSwipe?.(direction),
|
|
@@ -10214,7 +10220,7 @@ function scrollFocusedIntoView(keyboardInset) {
|
|
|
10214
10220
|
return;
|
|
10215
10221
|
}
|
|
10216
10222
|
const rect = active.getBoundingClientRect();
|
|
10217
|
-
const delta =
|
|
10223
|
+
const delta = chunkHMQVOPQH_js.computeScrollDelta(
|
|
10218
10224
|
{ top: rect.top, bottom: rect.bottom },
|
|
10219
10225
|
window.innerHeight,
|
|
10220
10226
|
keyboardInset
|
|
@@ -10234,8 +10240,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10234
10240
|
return;
|
|
10235
10241
|
}
|
|
10236
10242
|
const update = () => {
|
|
10237
|
-
const metrics =
|
|
10238
|
-
const inset = metrics ?
|
|
10243
|
+
const metrics = chunkHMQVOPQH_js.readViewportMetrics(window);
|
|
10244
|
+
const inset = metrics ? chunkHMQVOPQH_js.computeKeyboardInset(metrics) : 0;
|
|
10239
10245
|
setKeyboardInset(inset);
|
|
10240
10246
|
if (inset > 0) {
|
|
10241
10247
|
window.requestAnimationFrame(() => scrollFocusedIntoView(inset));
|
|
@@ -10246,8 +10252,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10246
10252
|
vv.addEventListener("scroll", update);
|
|
10247
10253
|
const onFocusIn = () => {
|
|
10248
10254
|
window.requestAnimationFrame(() => {
|
|
10249
|
-
const metrics =
|
|
10250
|
-
const inset = metrics ?
|
|
10255
|
+
const metrics = chunkHMQVOPQH_js.readViewportMetrics(window);
|
|
10256
|
+
const inset = metrics ? chunkHMQVOPQH_js.computeKeyboardInset(metrics) : 0;
|
|
10251
10257
|
if (inset > 0) {
|
|
10252
10258
|
scrollFocusedIntoView(inset);
|
|
10253
10259
|
}
|
|
@@ -10260,7 +10266,7 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10260
10266
|
document.removeEventListener("focusin", onFocusIn);
|
|
10261
10267
|
};
|
|
10262
10268
|
}, [enabled]);
|
|
10263
|
-
return { keyboardInset, isKeyboardOpen:
|
|
10269
|
+
return { keyboardInset, isKeyboardOpen: chunkHMQVOPQH_js.isKeyboardOpen(keyboardInset) };
|
|
10264
10270
|
}
|
|
10265
10271
|
|
|
10266
10272
|
// src/viewer/hooks/useViewerBuildingBlocks-canvas-props.ts
|
|
@@ -10287,7 +10293,7 @@ function buildCanvasProps(input) {
|
|
|
10287
10293
|
} = input;
|
|
10288
10294
|
const effectiveSlide = mode === "master" ? masterPseudoSlide : activeSlide;
|
|
10289
10295
|
const effectiveTemplateElements = mode === "master" ? s.activeLayout ? s.activeMaster?.elements ?? [] : [] : templateElements;
|
|
10290
|
-
const fieldContext =
|
|
10296
|
+
const fieldContext = chunkHMQVOPQH_js.buildFieldSubstitutionContext({
|
|
10291
10297
|
headerFooter: s.headerFooter,
|
|
10292
10298
|
customProperties: s.customProperties,
|
|
10293
10299
|
slide: activeSlide
|
|
@@ -10297,13 +10303,13 @@ function buildCanvasProps(input) {
|
|
|
10297
10303
|
if (mode === "present") {
|
|
10298
10304
|
presentation.handlePresentationAction(action);
|
|
10299
10305
|
} else if (action.url) {
|
|
10300
|
-
|
|
10306
|
+
chunkHMQVOPQH_js.safeOpenUrl(action.url);
|
|
10301
10307
|
}
|
|
10302
10308
|
};
|
|
10303
10309
|
const handleHyperlinkClick = (url) => {
|
|
10304
|
-
if (
|
|
10310
|
+
if (chunkHMQVOPQH_js.isPpactionUrl(url)) {
|
|
10305
10311
|
if (mode === "present") {
|
|
10306
|
-
const parsed =
|
|
10312
|
+
const parsed = chunkHMQVOPQH_js.parsePpactionUrl(url);
|
|
10307
10313
|
if (parsed) {
|
|
10308
10314
|
presentation.handlePresentationAction({
|
|
10309
10315
|
action: parsed.action,
|
|
@@ -10313,7 +10319,7 @@ function buildCanvasProps(input) {
|
|
|
10313
10319
|
}
|
|
10314
10320
|
return;
|
|
10315
10321
|
}
|
|
10316
|
-
|
|
10322
|
+
chunkHMQVOPQH_js.safeOpenUrl(url);
|
|
10317
10323
|
};
|
|
10318
10324
|
return {
|
|
10319
10325
|
activeSlide: effectiveSlide,
|
|
@@ -10454,6 +10460,12 @@ function buildToolbarAnimationHandlers(input) {
|
|
|
10454
10460
|
return;
|
|
10455
10461
|
}
|
|
10456
10462
|
const current = activeSlide.animations ?? [];
|
|
10463
|
+
if (group === "motionPath") {
|
|
10464
|
+
propertyHandlers.handleUpdateSlide({
|
|
10465
|
+
animations: chunkHMQVOPQH_js.applyMotionPathPreset(current, selectedElement.id, preset)
|
|
10466
|
+
});
|
|
10467
|
+
return;
|
|
10468
|
+
}
|
|
10457
10469
|
const existing = current.find((a) => a.elementId === selectedElement.id);
|
|
10458
10470
|
const presetValue = preset;
|
|
10459
10471
|
if (existing) {
|
|
@@ -10643,7 +10655,7 @@ function buildToolbarProps(input) {
|
|
|
10643
10655
|
onOpenFile,
|
|
10644
10656
|
onOpenRecentFile,
|
|
10645
10657
|
onCreatePresentation: (templateId) => {
|
|
10646
|
-
s.setSlides(
|
|
10658
|
+
s.setSlides(chunkHMQVOPQH_js.createBackstagePresentation(templateId));
|
|
10647
10659
|
s.setActiveSlideIndex(0);
|
|
10648
10660
|
s.setSelectedElementId(null);
|
|
10649
10661
|
s.setSelectedElementIds([]);
|
|
@@ -10661,6 +10673,8 @@ function buildToolbarProps(input) {
|
|
|
10661
10673
|
onOpenSettings,
|
|
10662
10674
|
onRunAccessibilityCheck: dialogs.handleRunAccessibilityCheck,
|
|
10663
10675
|
onToggleSlideSorter: () => s.setShowSlideSorter((p) => !p),
|
|
10676
|
+
onOpenReadingView: () => s.setShowReadingView(true),
|
|
10677
|
+
onOpenOutlineView: () => s.setShowOutlineView(true),
|
|
10664
10678
|
onUpdateTextStyle: ops.updateSelectedTextStyle,
|
|
10665
10679
|
onTransformTextCase: ops.updateSelectedTextCase,
|
|
10666
10680
|
isOverflowMenuOpen: s.isOverflowMenuOpen,
|
|
@@ -10698,7 +10712,7 @@ function buildToolbarProps(input) {
|
|
|
10698
10712
|
isCommentsPanelOpen: s.isInspectorPaneOpen,
|
|
10699
10713
|
slideCommentCount: activeSlide?.comments?.length ?? 0,
|
|
10700
10714
|
formatPainterActive: s.formatPainterActive,
|
|
10701
|
-
canActivateFormatPainter:
|
|
10715
|
+
canActivateFormatPainter: chunkHMQVOPQH_js.hasCopyableFormat(selectedElement),
|
|
10702
10716
|
onToggleFormatPainter: () => s.setFormatPainterActive((p) => !p),
|
|
10703
10717
|
isSelectionPaneOpen: s.isSelectionPaneOpen,
|
|
10704
10718
|
onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
|
|
@@ -10961,7 +10975,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
10961
10975
|
}, [incomingContent]);
|
|
10962
10976
|
const onOpenFile = react.useCallback(() => {
|
|
10963
10977
|
void (async () => {
|
|
10964
|
-
const picked = await
|
|
10978
|
+
const picked = await chunkHMQVOPQH_js.openPptxFile();
|
|
10965
10979
|
if (picked) {
|
|
10966
10980
|
setContent(picked.buffer);
|
|
10967
10981
|
}
|
|
@@ -10969,7 +10983,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
10969
10983
|
}, []);
|
|
10970
10984
|
const onOpenRecentFile = react.useCallback((key) => {
|
|
10971
10985
|
void (async () => {
|
|
10972
|
-
const bytes = await
|
|
10986
|
+
const bytes = await chunkHMQVOPQH_js.readBackstageRecentFile(key);
|
|
10973
10987
|
if (bytes) {
|
|
10974
10988
|
setContent(bytes);
|
|
10975
10989
|
}
|