pptx-react-viewer 2.6.2 → 2.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/dist/{AiChatPanel-5IAXQYGH.mjs → AiChatPanel-XT26Z3KM.mjs} +3 -3
- package/dist/AiChatPanel-XT26Z3KM.mjs.br +0 -0
- package/dist/AiChatPanel-XT26Z3KM.mjs.gz +0 -0
- package/dist/{AiChatPanel-IC2Q3H3N.js → AiChatPanel-Y4XJ4THX.js} +22 -22
- package/dist/AiChatPanel-Y4XJ4THX.js.br +0 -0
- package/dist/AiChatPanel-Y4XJ4THX.js.gz +0 -0
- package/dist/{Model3DScene-UEU7L4QY.mjs → Model3DScene-IQDJJZAM.mjs} +1 -1
- package/dist/{Model3DScene-UEU7L4QY.mjs.br → Model3DScene-IQDJJZAM.mjs.br} +0 -0
- package/dist/Model3DScene-IQDJJZAM.mjs.gz +0 -0
- package/dist/{Model3DScene-GOFY2PQS.js → Model3DScene-OBG67YKJ.js} +2 -2
- package/dist/{Model3DScene-GOFY2PQS.js.br → Model3DScene-OBG67YKJ.js.br} +0 -0
- package/dist/Model3DScene-OBG67YKJ.js.gz +0 -0
- package/dist/{SurfaceChart3DScene-KCJUDJUK.mjs → SurfaceChart3DScene-KFIHKHEB.mjs} +1 -1
- package/dist/{SurfaceChart3DScene-KCJUDJUK.mjs.br → SurfaceChart3DScene-KFIHKHEB.mjs.br} +0 -0
- package/dist/SurfaceChart3DScene-KFIHKHEB.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-5TILKZMY.js → SurfaceChart3DScene-OJR7PBUU.js} +2 -2
- package/dist/SurfaceChart3DScene-OJR7PBUU.js.br +0 -0
- package/dist/SurfaceChart3DScene-OJR7PBUU.js.gz +0 -0
- package/dist/{chunk-XROVGBFQ.js → chunk-5ZI2ZG5E.js} +236 -236
- package/dist/chunk-5ZI2ZG5E.js.br +0 -0
- package/dist/chunk-5ZI2ZG5E.js.gz +0 -0
- package/dist/{chunk-TMU7Z3CU.js → chunk-6W4AEXA3.js} +843 -843
- package/dist/chunk-6W4AEXA3.js.br +0 -0
- package/dist/chunk-6W4AEXA3.js.gz +0 -0
- package/dist/{chunk-UV5R7IQY.mjs → chunk-77XK7DJE.mjs} +2 -2
- package/dist/chunk-77XK7DJE.mjs.br +0 -0
- package/dist/chunk-77XK7DJE.mjs.gz +0 -0
- package/dist/{chunk-IGYK3NK5.js → chunk-AH5DPIY2.js} +3 -3
- package/dist/chunk-AH5DPIY2.js.br +0 -0
- package/dist/chunk-AH5DPIY2.js.gz +0 -0
- package/dist/{chunk-Y6H2RSLB.mjs → chunk-FV5GXJ4L.mjs} +14 -1
- package/dist/chunk-FV5GXJ4L.mjs.br +0 -0
- package/dist/{chunk-Y6H2RSLB.mjs.gz → chunk-FV5GXJ4L.mjs.gz} +0 -0
- package/dist/{chunk-G7PJSVUS.js → chunk-HHQRYCLW.js} +14 -1
- package/dist/chunk-HHQRYCLW.js.br +0 -0
- package/dist/{chunk-G7PJSVUS.js.gz → chunk-HHQRYCLW.js.gz} +0 -0
- package/dist/{chunk-MQYNBEOY.mjs → chunk-I6XL525L.mjs} +10 -4
- package/dist/chunk-I6XL525L.mjs.br +0 -0
- package/dist/chunk-I6XL525L.mjs.gz +0 -0
- package/dist/{chunk-W27U3GQS.js → chunk-JPACC7ZB.js} +323 -317
- package/dist/chunk-JPACC7ZB.js.br +0 -0
- package/dist/chunk-JPACC7ZB.js.gz +0 -0
- package/dist/{chunk-Y4TIW2MM.mjs → chunk-KYAV5V7C.mjs} +1 -1
- package/dist/chunk-KYAV5V7C.mjs.br +0 -0
- package/dist/chunk-KYAV5V7C.mjs.gz +0 -0
- package/dist/{chunk-LJPRMPNA.mjs → chunk-V6HOH4XZ.mjs} +7 -7
- package/dist/chunk-V6HOH4XZ.mjs.br +0 -0
- package/dist/chunk-V6HOH4XZ.mjs.gz +0 -0
- package/dist/index.js +34 -34
- package/dist/index.js.br +0 -0
- package/dist/index.js.gz +0 -0
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.br +0 -0
- package/dist/index.mjs.gz +0 -0
- package/dist/internals.js +78 -78
- package/dist/internals.js.br +0 -0
- package/dist/internals.js.gz +0 -0
- package/dist/internals.mjs +3 -3
- package/dist/internals.mjs.br +0 -0
- package/dist/internals.mjs.gz +0 -0
- package/dist/viewer/index.js +21 -21
- package/dist/viewer/index.js.br +0 -0
- package/dist/viewer/index.js.gz +0 -0
- package/dist/viewer/index.mjs +5 -5
- package/dist/viewer/index.mjs.br +0 -0
- package/dist/viewer/index.mjs.gz +0 -0
- package/package.json +1 -1
- package/dist/AiChatPanel-5IAXQYGH.mjs.br +0 -0
- package/dist/AiChatPanel-5IAXQYGH.mjs.gz +0 -0
- package/dist/AiChatPanel-IC2Q3H3N.js.br +0 -0
- package/dist/AiChatPanel-IC2Q3H3N.js.gz +0 -0
- package/dist/Model3DScene-GOFY2PQS.js.gz +0 -0
- package/dist/Model3DScene-UEU7L4QY.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-5TILKZMY.js.br +0 -0
- package/dist/SurfaceChart3DScene-5TILKZMY.js.gz +0 -0
- package/dist/SurfaceChart3DScene-KCJUDJUK.mjs.gz +0 -0
- package/dist/chunk-G7PJSVUS.js.br +0 -0
- package/dist/chunk-IGYK3NK5.js.br +0 -0
- package/dist/chunk-IGYK3NK5.js.gz +0 -0
- package/dist/chunk-LJPRMPNA.mjs.br +0 -0
- package/dist/chunk-LJPRMPNA.mjs.gz +0 -0
- package/dist/chunk-MQYNBEOY.mjs.br +0 -0
- package/dist/chunk-MQYNBEOY.mjs.gz +0 -0
- package/dist/chunk-TMU7Z3CU.js.br +0 -0
- package/dist/chunk-TMU7Z3CU.js.gz +0 -0
- package/dist/chunk-UV5R7IQY.mjs.br +0 -0
- package/dist/chunk-UV5R7IQY.mjs.gz +0 -0
- package/dist/chunk-W27U3GQS.js.br +0 -0
- package/dist/chunk-W27U3GQS.js.gz +0 -0
- package/dist/chunk-XROVGBFQ.js.br +0 -0
- package/dist/chunk-XROVGBFQ.js.gz +0 -0
- package/dist/chunk-Y4TIW2MM.mjs.br +0 -0
- package/dist/chunk-Y4TIW2MM.mjs.gz +0 -0
- package/dist/chunk-Y6H2RSLB.mjs.br +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk5ZI2ZG5E_js = require('./chunk-5ZI2ZG5E.js');
|
|
4
4
|
var chunk25VSL2BB_js = require('./chunk-25VSL2BB.js');
|
|
5
|
-
var
|
|
5
|
+
var chunkHHQRYCLW_js = require('./chunk-HHQRYCLW.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 = chunkHHQRYCLW_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 = chunkHHQRYCLW_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 >= chunkHHQRYCLW_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
|
+
}, chunkHHQRYCLW_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 = chunkHHQRYCLW_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 = chunkHHQRYCLW_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
|
+
chunkHHQRYCLW_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 = chunkHHQRYCLW_js.validateRoomId(config.roomId);
|
|
243
243
|
const provider = new WebrtcProvider(roomId, yDoc, opts);
|
|
244
|
-
departureRef.current =
|
|
244
|
+
departureRef.current = chunkHHQRYCLW_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 = chunkHHQRYCLW_js.validateRoomId(config.roomId);
|
|
287
|
+
const transport = config.transport ?? chunkHHQRYCLW_js.resolveTransportForServerUrl(config.serverUrl);
|
|
288
288
|
if (transport === "webrtc") {
|
|
289
289
|
await initWebrtc();
|
|
290
290
|
return;
|
|
291
291
|
}
|
|
292
|
-
if (
|
|
292
|
+
if (chunkHHQRYCLW_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 = chunkHHQRYCLW_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
|
+
chunkHHQRYCLW_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
|
+
}, chunkHHQRYCLW_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
|
+
chunkHHQRYCLW_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 = chunkHHQRYCLW_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 = chunkHHQRYCLW_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(chunkHHQRYCLW_js.cloneSlide),
|
|
521
|
+
templateElementsBySlideId: chunkHHQRYCLW_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(chunkHHQRYCLW_js.cloneSlide));
|
|
535
535
|
setTemplateElementsBySlideId(
|
|
536
|
-
|
|
536
|
+
chunkHHQRYCLW_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 = chunk5ZI2ZG5E_js.cloneHistorySnapshot(previousSnapshot);
|
|
571
|
+
lastHistorySnapshotRef.current = chunk5ZI2ZG5E_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 = chunk5ZI2ZG5E_js.cloneHistorySnapshot(nextSnapshot);
|
|
593
|
+
lastHistorySnapshotRef.current = chunk5ZI2ZG5E_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 = chunk5ZI2ZG5E_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 = chunk5ZI2ZG5E_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(chunk5ZI2ZG5E_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 = chunk5ZI2ZG5E_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 = Math.min(Math.max(nextScale,
|
|
752
|
+
const boundedScale = Math.min(Math.max(nextScale, chunk5ZI2ZG5E_js.MIN_ZOOM_SCALE), chunk5ZI2ZG5E_js.MAX_ZOOM_SCALE);
|
|
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) => Math.min(currentScale + 0.1,
|
|
767
|
+
setScale((currentScale) => Math.min(currentScale + 0.1, chunk5ZI2ZG5E_js.MAX_ZOOM_SCALE));
|
|
768
768
|
}, []);
|
|
769
769
|
const handleZoomOut = react.useCallback(() => {
|
|
770
|
-
setScale((currentScale) => Math.max(currentScale - 0.1,
|
|
770
|
+
setScale((currentScale) => Math.max(currentScale - 0.1, chunk5ZI2ZG5E_js.MIN_ZOOM_SCALE));
|
|
771
771
|
}, []);
|
|
772
772
|
const handleResetZoom = react.useCallback(() => {
|
|
773
773
|
setScale(1);
|
|
@@ -786,22 +786,22 @@ 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, chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE));
|
|
790
|
+
maxY = Math.max(maxY, element.y + Math.max(element.height, chunk5ZI2ZG5E_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, chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE);
|
|
797
|
+
const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY, chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE);
|
|
798
798
|
const availableWidth = Math.max(
|
|
799
|
-
effectiveEditorDimensions.width -
|
|
800
|
-
|
|
799
|
+
effectiveEditorDimensions.width - chunk5ZI2ZG5E_js.ZOOM_TO_SELECTION_PADDING,
|
|
800
|
+
chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE
|
|
801
801
|
);
|
|
802
802
|
const availableHeight = Math.max(
|
|
803
|
-
effectiveEditorDimensions.height -
|
|
804
|
-
|
|
803
|
+
effectiveEditorDimensions.height - chunk5ZI2ZG5E_js.ZOOM_TO_SELECTION_PADDING,
|
|
804
|
+
chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE
|
|
805
805
|
);
|
|
806
806
|
const targetEditorScale = Math.min(
|
|
807
807
|
availableWidth / boundsWidth,
|
|
@@ -809,8 +809,8 @@ function useZoomViewport({
|
|
|
809
809
|
);
|
|
810
810
|
const safeFitScale = fitScale > Number.EPSILON ? fitScale : Number.EPSILON;
|
|
811
811
|
const nextScale = Math.min(
|
|
812
|
-
Math.max(targetEditorScale / safeFitScale,
|
|
813
|
-
|
|
812
|
+
Math.max(targetEditorScale / safeFitScale, chunk5ZI2ZG5E_js.MIN_ZOOM_SCALE),
|
|
813
|
+
chunk5ZI2ZG5E_js.MAX_ZOOM_SCALE
|
|
814
814
|
);
|
|
815
815
|
setScale(nextScale);
|
|
816
816
|
window.requestAnimationFrame(() => {
|
|
@@ -832,7 +832,7 @@ function useZoomViewport({
|
|
|
832
832
|
event.preventDefault();
|
|
833
833
|
const delta = event.deltaY * -1e-3;
|
|
834
834
|
setScale(
|
|
835
|
-
(currentScale) => Math.min(Math.max(currentScale + delta,
|
|
835
|
+
(currentScale) => Math.min(Math.max(currentScale + delta, chunk5ZI2ZG5E_js.MIN_ZOOM_SCALE), chunk5ZI2ZG5E_js.MAX_ZOOM_SCALE)
|
|
836
836
|
);
|
|
837
837
|
}, []);
|
|
838
838
|
react.useEffect(() => {
|
|
@@ -910,7 +910,7 @@ function applyAnimationGroupSteps(group, onPlayActionSound, setPresentationEleme
|
|
|
910
910
|
const command = step.command;
|
|
911
911
|
const timer = window.setTimeout(
|
|
912
912
|
() => {
|
|
913
|
-
|
|
913
|
+
chunk5ZI2ZG5E_js.executeMediaCommand(command);
|
|
914
914
|
},
|
|
915
915
|
Math.max(0, step.delayMs)
|
|
916
916
|
);
|
|
@@ -1026,7 +1026,7 @@ function useAnimationPlayback(input) {
|
|
|
1026
1026
|
(controller, group) => {
|
|
1027
1027
|
driveBuildReveal(
|
|
1028
1028
|
controller,
|
|
1029
|
-
|
|
1029
|
+
chunkHHQRYCLW_js.PresentationAnimationController.collectBuildStepIds(group),
|
|
1030
1030
|
setPresentationElementStates,
|
|
1031
1031
|
buildRafRef
|
|
1032
1032
|
);
|
|
@@ -1089,7 +1089,7 @@ function useAnimationPlayback(input) {
|
|
|
1089
1089
|
setHoverTriggerShapeIds(/* @__PURE__ */ new Set());
|
|
1090
1090
|
return;
|
|
1091
1091
|
}
|
|
1092
|
-
const controller =
|
|
1092
|
+
const controller = chunkHHQRYCLW_js.PresentationAnimationController.fromSlide(slide);
|
|
1093
1093
|
controllerRef.current = controller;
|
|
1094
1094
|
setPresentationKeyframesCss(controller.keyframesCss);
|
|
1095
1095
|
setInteractiveTriggerShapeIds(controller.interactiveTriggerShapeIds);
|
|
@@ -1237,7 +1237,7 @@ function useAnimationPlayback(input) {
|
|
|
1237
1237
|
}))
|
|
1238
1238
|
);
|
|
1239
1239
|
entranceAnimations.forEach((animation, animationIndex) => {
|
|
1240
|
-
const delay =
|
|
1240
|
+
const delay = chunkHHQRYCLW_js.computeEntranceAnimationDelay(animation.delayMs, animationIndex);
|
|
1241
1241
|
const timer = window.setTimeout(() => {
|
|
1242
1242
|
setPresentationAnimations(
|
|
1243
1243
|
(previousAnimations) => previousAnimations.map(
|
|
@@ -1274,12 +1274,12 @@ function useAnimationPlayback(input) {
|
|
|
1274
1274
|
presentationTimersRef
|
|
1275
1275
|
};
|
|
1276
1276
|
}
|
|
1277
|
-
var PRESENTER_CHANNEL_NAME =
|
|
1278
|
-
var AUDIENCE_HASH =
|
|
1279
|
-
var PRESENTER_MSG_ORIGIN =
|
|
1280
|
-
var AUDIENCE_NONCE_KEY =
|
|
1277
|
+
var PRESENTER_CHANNEL_NAME = chunkHHQRYCLW_js.PRESENTATION_CHANNEL_NAME;
|
|
1278
|
+
var AUDIENCE_HASH = chunkHHQRYCLW_js.PRESENTATION_HASH;
|
|
1279
|
+
var PRESENTER_MSG_ORIGIN = chunkHHQRYCLW_js.PRESENTATION_MESSAGE_ORIGIN;
|
|
1280
|
+
var AUDIENCE_NONCE_KEY = chunkHHQRYCLW_js.PRESENTATION_NONCE_KEY;
|
|
1281
1281
|
function generateSessionId() {
|
|
1282
|
-
return
|
|
1282
|
+
return chunkHHQRYCLW_js.createPresentationSessionId();
|
|
1283
1283
|
}
|
|
1284
1284
|
function parseAudienceNonce() {
|
|
1285
1285
|
const hash = window.location.hash;
|
|
@@ -1315,7 +1315,7 @@ function usePresenterWindow(input) {
|
|
|
1315
1315
|
}, []);
|
|
1316
1316
|
const swapDisplays = react.useCallback(async () => {
|
|
1317
1317
|
const audience = audienceWindowRef.current;
|
|
1318
|
-
return audience && !audience.closed ?
|
|
1318
|
+
return audience && !audience.closed ? chunkHHQRYCLW_js.swapPresentationWindows(window, audience) : false;
|
|
1319
1319
|
}, []);
|
|
1320
1320
|
const syncSlideToAudience = react.useCallback(
|
|
1321
1321
|
(slideIndex) => {
|
|
@@ -1379,7 +1379,7 @@ function usePresenterWindow(input) {
|
|
|
1379
1379
|
pollTimerRef.current = null;
|
|
1380
1380
|
}
|
|
1381
1381
|
if (closingSessionId) {
|
|
1382
|
-
void
|
|
1382
|
+
void chunkHHQRYCLW_js.clearAudienceContent(closingSessionId);
|
|
1383
1383
|
}
|
|
1384
1384
|
}, [getChannel]);
|
|
1385
1385
|
const openAudienceWindow = react.useCallback(() => {
|
|
@@ -1397,10 +1397,10 @@ function usePresenterWindow(input) {
|
|
|
1397
1397
|
audienceWindowRef.current = blankWin;
|
|
1398
1398
|
const sessionId = generateSessionId();
|
|
1399
1399
|
sessionIdRef.current = sessionId;
|
|
1400
|
-
const audienceUrl =
|
|
1401
|
-
void
|
|
1400
|
+
const audienceUrl = chunkHHQRYCLW_js.buildPresentationAudienceUrl(window.location.href, sessionId);
|
|
1401
|
+
void chunkHHQRYCLW_js.resolveAudienceScreenPlacement(window).then((placement) => {
|
|
1402
1402
|
if (placement && audienceWindowRef.current === blankWin && !blankWin.closed) {
|
|
1403
|
-
|
|
1403
|
+
chunkHHQRYCLW_js.placeAudienceWindow(blankWin, placement);
|
|
1404
1404
|
}
|
|
1405
1405
|
return void 0;
|
|
1406
1406
|
});
|
|
@@ -1430,7 +1430,7 @@ function usePresenterWindow(input) {
|
|
|
1430
1430
|
}
|
|
1431
1431
|
};
|
|
1432
1432
|
if (content) {
|
|
1433
|
-
void
|
|
1433
|
+
void chunkHHQRYCLW_js.storeAudienceContent(content, sessionId).then(() => navigateOrClose(true)).catch(() => navigateOrClose(false));
|
|
1434
1434
|
} else {
|
|
1435
1435
|
navigateOrClose(true);
|
|
1436
1436
|
}
|
|
@@ -1456,7 +1456,7 @@ function usePresenterWindow(input) {
|
|
|
1456
1456
|
}
|
|
1457
1457
|
const handleMessage = (event) => {
|
|
1458
1458
|
const message = event.data;
|
|
1459
|
-
if (
|
|
1459
|
+
if (chunkHHQRYCLW_js.isPresentationSessionMessage(message) && message.type === "audience-ready" && message.sessionId === sessionIdRef.current) {
|
|
1460
1460
|
syncStateToAudience(snapshotRef.current);
|
|
1461
1461
|
}
|
|
1462
1462
|
};
|
|
@@ -1485,7 +1485,7 @@ function usePresenterWindow(input) {
|
|
|
1485
1485
|
react.useEffect(() => {
|
|
1486
1486
|
const handleBeforeUnload = () => {
|
|
1487
1487
|
if (sessionIdRef.current) {
|
|
1488
|
-
void
|
|
1488
|
+
void chunkHHQRYCLW_js.clearAudienceContent(sessionIdRef.current);
|
|
1489
1489
|
}
|
|
1490
1490
|
};
|
|
1491
1491
|
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
@@ -1547,7 +1547,7 @@ function useAudienceMode(input) {
|
|
|
1547
1547
|
}
|
|
1548
1548
|
channel.onmessage = (event) => {
|
|
1549
1549
|
const data = event.data;
|
|
1550
|
-
if (!
|
|
1550
|
+
if (!chunkHHQRYCLW_js.isPresentationSessionMessage(data) || data.origin !== PRESENTER_MSG_ORIGIN) {
|
|
1551
1551
|
return;
|
|
1552
1552
|
}
|
|
1553
1553
|
if (expectedSessionId && data.sessionId !== expectedSessionId) {
|
|
@@ -1563,16 +1563,16 @@ function useAudienceMode(input) {
|
|
|
1563
1563
|
}
|
|
1564
1564
|
if (data.type === "presenter-exit") {
|
|
1565
1565
|
if (expectedSessionId) {
|
|
1566
|
-
void
|
|
1566
|
+
void chunkHHQRYCLW_js.clearAudienceContent(expectedSessionId);
|
|
1567
1567
|
}
|
|
1568
|
-
if (
|
|
1568
|
+
if (chunkHHQRYCLW_js.endAudienceDisplay(window)) {
|
|
1569
1569
|
handlers.onPresenterEnded?.();
|
|
1570
1570
|
}
|
|
1571
1571
|
}
|
|
1572
1572
|
};
|
|
1573
1573
|
if (expectedSessionId) {
|
|
1574
1574
|
channel.postMessage({
|
|
1575
|
-
origin:
|
|
1575
|
+
origin: chunkHHQRYCLW_js.PRESENTATION_MESSAGE_ORIGIN,
|
|
1576
1576
|
type: "audience-ready",
|
|
1577
1577
|
sessionId: expectedSessionId
|
|
1578
1578
|
});
|
|
@@ -1604,14 +1604,14 @@ function usePresentationKeyboard(input) {
|
|
|
1604
1604
|
presentationSlideIndex,
|
|
1605
1605
|
setShowRehearsalSummary
|
|
1606
1606
|
} = input;
|
|
1607
|
-
const keyBufferRef = react.useRef(
|
|
1607
|
+
const keyBufferRef = react.useRef(chunkHHQRYCLW_js.createPresentationKeyBuffer());
|
|
1608
1608
|
react.useEffect(() => {
|
|
1609
|
-
if (mode !== "present" || !
|
|
1610
|
-
keyBufferRef.current =
|
|
1609
|
+
if (mode !== "present" || !chunkHHQRYCLW_js.acceptsPresentationInput()) {
|
|
1610
|
+
keyBufferRef.current = chunkHHQRYCLW_js.createPresentationKeyBuffer();
|
|
1611
1611
|
return;
|
|
1612
1612
|
}
|
|
1613
1613
|
const handleKeyDown = (event) => {
|
|
1614
|
-
const mapped =
|
|
1614
|
+
const mapped = chunkHHQRYCLW_js.mapPresentationKey(event, keyBufferRef.current);
|
|
1615
1615
|
if (mapped.action === "none") {
|
|
1616
1616
|
return;
|
|
1617
1617
|
}
|
|
@@ -1819,7 +1819,7 @@ function handlePresentationActionImpl(action, deps) {
|
|
|
1819
1819
|
return;
|
|
1820
1820
|
}
|
|
1821
1821
|
if (action.url && !actionStr.includes("hlinksldjump")) {
|
|
1822
|
-
if (
|
|
1822
|
+
if (chunkHHQRYCLW_js.isUrlSafe(action.url)) {
|
|
1823
1823
|
window.open(action.url, "_blank", "noopener,noreferrer");
|
|
1824
1824
|
}
|
|
1825
1825
|
}
|
|
@@ -1829,7 +1829,7 @@ function handlePresentationActionImpl(action, deps) {
|
|
|
1829
1829
|
function executeSlideTransition(nextSlideIndex, deps) {
|
|
1830
1830
|
const incomingSlide = deps.slides[nextSlideIndex];
|
|
1831
1831
|
const transition = incomingSlide?.transition;
|
|
1832
|
-
const durationMs = deps.playTransition ?
|
|
1832
|
+
const durationMs = deps.playTransition ? chunkHHQRYCLW_js.resolveTransitionDurationMs(transition) : 0;
|
|
1833
1833
|
deps.clearPresentationTimers();
|
|
1834
1834
|
deps.setPresentationSlideIndex(nextSlideIndex);
|
|
1835
1835
|
deps.onSetActiveSlideIndex(nextSlideIndex);
|
|
@@ -2012,8 +2012,14 @@ function useSlideNavigation(input) {
|
|
|
2012
2012
|
scheduleAutoAdvanceForSlide,
|
|
2013
2013
|
presentationTimersRef,
|
|
2014
2014
|
setTransitionOverlay,
|
|
2015
|
-
//
|
|
2016
|
-
|
|
2015
|
+
// A jump ENTERS the target slide, so PowerPoint plays that slide's
|
|
2016
|
+
// transition exactly as it does for a forward advance - hyperlinks,
|
|
2017
|
+
// action buttons, Home/End and "type a number + Enter" all animate.
|
|
2018
|
+
// Suppressing it here is why a deck navigated by clicking its own
|
|
2019
|
+
// on-slide links (this is how the issue #131 reporter drives their
|
|
2020
|
+
// wheel menu) appeared to have no morph at all, while the same
|
|
2021
|
+
// transition played fine on PageDown.
|
|
2022
|
+
playTransition: true
|
|
2017
2023
|
});
|
|
2018
2024
|
},
|
|
2019
2025
|
[
|
|
@@ -2079,17 +2085,17 @@ function useZoomNavigation(input) {
|
|
|
2079
2085
|
};
|
|
2080
2086
|
}
|
|
2081
2087
|
function usePresenterConsole(slideIndex) {
|
|
2082
|
-
const timerRef = react.useRef(
|
|
2083
|
-
const [snapshot, setSnapshot] = react.useState(() =>
|
|
2088
|
+
const timerRef = react.useRef(chunkHHQRYCLW_js.createPresenterTimer());
|
|
2089
|
+
const [snapshot, setSnapshot] = react.useState(() => chunkHHQRYCLW_js.createInitialPresentationSnapshot(slideIndex));
|
|
2084
2090
|
const patch = react.useCallback((value) => {
|
|
2085
|
-
setSnapshot((current) =>
|
|
2091
|
+
setSnapshot((current) => chunkHHQRYCLW_js.mergePresentationSnapshot(current, value));
|
|
2086
2092
|
}, []);
|
|
2087
2093
|
react.useEffect(() => patch({ slideIndex }), [patch, slideIndex]);
|
|
2088
2094
|
react.useEffect(() => {
|
|
2089
2095
|
const timer = window.setInterval(() => {
|
|
2090
2096
|
patch({
|
|
2091
2097
|
paused: timerRef.current.paused,
|
|
2092
|
-
elapsedMs:
|
|
2098
|
+
elapsedMs: chunkHHQRYCLW_js.presenterElapsed(timerRef.current)
|
|
2093
2099
|
});
|
|
2094
2100
|
}, 1e3);
|
|
2095
2101
|
return () => window.clearInterval(timer);
|
|
@@ -2099,19 +2105,19 @@ function usePresenterConsole(slideIndex) {
|
|
|
2099
2105
|
applyAudienceSnapshot: setSnapshot,
|
|
2100
2106
|
setBlackout: (blackout) => patch({ blackout }),
|
|
2101
2107
|
toggleTimer: () => {
|
|
2102
|
-
timerRef.current =
|
|
2108
|
+
timerRef.current = chunkHHQRYCLW_js.togglePresenterTimer(timerRef.current);
|
|
2103
2109
|
patch({
|
|
2104
2110
|
paused: timerRef.current.paused,
|
|
2105
|
-
elapsedMs:
|
|
2111
|
+
elapsedMs: chunkHHQRYCLW_js.presenterElapsed(timerRef.current)
|
|
2106
2112
|
});
|
|
2107
2113
|
},
|
|
2108
2114
|
resetTimer: () => {
|
|
2109
|
-
timerRef.current =
|
|
2115
|
+
timerRef.current = chunkHHQRYCLW_js.resetPresenterTimer();
|
|
2110
2116
|
patch({ paused: false, elapsedMs: 0 });
|
|
2111
2117
|
},
|
|
2112
2118
|
stepZoom: (direction) => setSnapshot(
|
|
2113
|
-
(current) =>
|
|
2114
|
-
zoom:
|
|
2119
|
+
(current) => chunkHHQRYCLW_js.mergePresentationSnapshot(current, {
|
|
2120
|
+
zoom: chunkHHQRYCLW_js.stepPresenterZoom(
|
|
2115
2121
|
current.zoom ?? { scale: 1, originX: 0.5, originY: 0.5 },
|
|
2116
2122
|
direction
|
|
2117
2123
|
)
|
|
@@ -2232,7 +2238,7 @@ function usePresentationMode(input) {
|
|
|
2232
2238
|
});
|
|
2233
2239
|
const movePresentationSlide = react.useCallback(
|
|
2234
2240
|
(direction, trigger = "explicit") => {
|
|
2235
|
-
if (!
|
|
2241
|
+
if (!chunkHHQRYCLW_js.acceptsPresentationInput()) {
|
|
2236
2242
|
return;
|
|
2237
2243
|
}
|
|
2238
2244
|
if (endOfShowVisible) {
|
|
@@ -2434,11 +2440,11 @@ function usePresentationMode(input) {
|
|
|
2434
2440
|
if (!transitionOverlay || transitionOverlay.transition.type !== "morph") {
|
|
2435
2441
|
return void 0;
|
|
2436
2442
|
}
|
|
2437
|
-
return
|
|
2443
|
+
return chunkHHQRYCLW_js.buildMorphTransitionPlan(
|
|
2438
2444
|
slides[transitionOverlay.outgoingSlideIndex],
|
|
2439
2445
|
slides[transitionOverlay.incomingSlideIndex],
|
|
2440
2446
|
transitionOverlay.durationMs,
|
|
2441
|
-
|
|
2447
|
+
chunkHHQRYCLW_js.morphOptionToMode(transitionOverlay.transition.morphOption)
|
|
2442
2448
|
);
|
|
2443
2449
|
}, [transitionOverlay, slides]);
|
|
2444
2450
|
const morphedElementStates = react.useMemo(() => {
|
|
@@ -2744,7 +2750,7 @@ function findInSlides(slides, findQuery, findMatchCase) {
|
|
|
2744
2750
|
const normalised = findMatchCase ? findQuery : findQuery.toLowerCase();
|
|
2745
2751
|
slides.forEach((slide, slideIndex) => {
|
|
2746
2752
|
for (const element of slide.elements || []) {
|
|
2747
|
-
if (!
|
|
2753
|
+
if (!chunkHHQRYCLW_js.hasTextProperties(element)) {
|
|
2748
2754
|
continue;
|
|
2749
2755
|
}
|
|
2750
2756
|
const segments = element.textSegments ?? [];
|
|
@@ -2795,7 +2801,7 @@ function applyFindReplacements(slides, toReplace, replaceQuery) {
|
|
|
2795
2801
|
continue;
|
|
2796
2802
|
}
|
|
2797
2803
|
const element = slide.elements[elIdx];
|
|
2798
|
-
if (!
|
|
2804
|
+
if (!chunkHHQRYCLW_js.hasTextProperties(element)) {
|
|
2799
2805
|
continue;
|
|
2800
2806
|
}
|
|
2801
2807
|
const segments = [...element.textSegments ?? []];
|
|
@@ -3393,7 +3399,7 @@ function useViewerCoreState(_input) {
|
|
|
3393
3399
|
const shapeAdjustmentDragStateRef = react.useRef(null);
|
|
3394
3400
|
const marqueeStateRef = react.useRef(null);
|
|
3395
3401
|
const isDrawingRef = react.useRef(false);
|
|
3396
|
-
const livePatcher = react.useMemo(() =>
|
|
3402
|
+
const livePatcher = react.useMemo(() => chunkHHQRYCLW_js.createCollaborationLivePatcher(), []);
|
|
3397
3403
|
react.useEffect(() => () => livePatcher.dispose(), [livePatcher]);
|
|
3398
3404
|
const slidesRef = react.useRef([]);
|
|
3399
3405
|
const [mode, setMode] = react.useState("edit");
|
|
@@ -3402,8 +3408,8 @@ function useViewerCoreState(_input) {
|
|
|
3402
3408
|
const [slides, setSlides] = react.useState([]);
|
|
3403
3409
|
const [templateElementsBySlideId, setTemplateElementsBySlideId] = react.useState({});
|
|
3404
3410
|
const [canvasSize, setCanvasSize] = react.useState({
|
|
3405
|
-
width:
|
|
3406
|
-
height:
|
|
3411
|
+
width: chunk5ZI2ZG5E_js.DEFAULT_CANVAS_WIDTH,
|
|
3412
|
+
height: chunk5ZI2ZG5E_js.DEFAULT_CANVAS_HEIGHT
|
|
3407
3413
|
});
|
|
3408
3414
|
const [activeSlideIndex, setActiveSlideIndex] = react.useState(0);
|
|
3409
3415
|
const [selectedElementId, setSelectedElementId] = react.useState(null);
|
|
@@ -3423,7 +3429,7 @@ function useViewerCoreState(_input) {
|
|
|
3423
3429
|
const resolved = typeof value === "function" ? value(inlineEditingTextRef.current) : value;
|
|
3424
3430
|
inlineEditingTextRef.current = resolved;
|
|
3425
3431
|
setInlineEditingTextBase(value);
|
|
3426
|
-
|
|
3432
|
+
chunkHHQRYCLW_js.publishLiveInlineText(
|
|
3427
3433
|
livePatcher,
|
|
3428
3434
|
slidesRef.current[activeSlideIndexRef.current],
|
|
3429
3435
|
inlineEditingElementIdRef.current,
|
|
@@ -3748,7 +3754,7 @@ function useLoadContent({
|
|
|
3748
3754
|
);
|
|
3749
3755
|
}
|
|
3750
3756
|
const previousHandler = handlerRef.current;
|
|
3751
|
-
const handler = new
|
|
3757
|
+
const handler = new chunkHHQRYCLW_js.PptxHandler();
|
|
3752
3758
|
const parsed = await handler.load(buffer);
|
|
3753
3759
|
if (cancelled || token !== renderTokenRef.current) {
|
|
3754
3760
|
handler.dispose();
|
|
@@ -3760,7 +3766,7 @@ function useLoadContent({
|
|
|
3760
3766
|
handlerRef.current = null;
|
|
3761
3767
|
const mediaElements = [];
|
|
3762
3768
|
for (const slide of parsed.slides) {
|
|
3763
|
-
|
|
3769
|
+
chunkHHQRYCLW_js.collectMediaElements(slide.elements, mediaElements);
|
|
3764
3770
|
}
|
|
3765
3771
|
for (const url of mediaDataUrls.values()) {
|
|
3766
3772
|
if (url.startsWith("blob:")) {
|
|
@@ -3801,7 +3807,7 @@ function useLoadContent({
|
|
|
3801
3807
|
}
|
|
3802
3808
|
})
|
|
3803
3809
|
);
|
|
3804
|
-
const { paths: imagePaths, refs: imageRefs } =
|
|
3810
|
+
const { paths: imagePaths, refs: imageRefs } = chunkHHQRYCLW_js.collectImagePaths(parsed.slides);
|
|
3805
3811
|
let nextSlides = parsed.slides;
|
|
3806
3812
|
if (imagePaths.size > 0) {
|
|
3807
3813
|
const resolvedMap = /* @__PURE__ */ new Map();
|
|
@@ -3856,12 +3862,12 @@ function useLoadContent({
|
|
|
3856
3862
|
}
|
|
3857
3863
|
}
|
|
3858
3864
|
handlerRef.current = handler;
|
|
3859
|
-
const partition =
|
|
3865
|
+
const partition = chunk5ZI2ZG5E_js.partitionTemplateElements(nextSlides);
|
|
3860
3866
|
setSlides(partition.slides);
|
|
3861
3867
|
setTemplateElementsBySlideId(partition.templateElementsBySlideId);
|
|
3862
3868
|
setCanvasSize({
|
|
3863
|
-
width: parsed.width ??
|
|
3864
|
-
height: parsed.height ??
|
|
3869
|
+
width: parsed.width ?? chunk5ZI2ZG5E_js.DEFAULT_CANVAS_WIDTH,
|
|
3870
|
+
height: parsed.height ?? chunk5ZI2ZG5E_js.DEFAULT_CANVAS_HEIGHT
|
|
3865
3871
|
});
|
|
3866
3872
|
setHeaderFooter(parsed.headerFooter ?? {});
|
|
3867
3873
|
setLayoutOptions(parsed.layoutOptions ?? []);
|
|
@@ -3890,7 +3896,7 @@ function useLoadContent({
|
|
|
3890
3896
|
setHasMacros(parsed.hasMacros === true);
|
|
3891
3897
|
setHasDigitalSignatures(parsed.hasDigitalSignatures === true);
|
|
3892
3898
|
setDigitalSignatureCount(parsed.digitalSignatureCount ?? 0);
|
|
3893
|
-
setGuides(
|
|
3899
|
+
setGuides(chunkHHQRYCLW_js.buildInitialGuides(parsed.presentationGuides, parsed.slides[0]?.guides));
|
|
3894
3900
|
setActiveSlideIndex(0);
|
|
3895
3901
|
clearSelection();
|
|
3896
3902
|
setIsDirty(false);
|
|
@@ -3898,7 +3904,7 @@ function useLoadContent({
|
|
|
3898
3904
|
onContentApplied?.();
|
|
3899
3905
|
} catch (err) {
|
|
3900
3906
|
if (!cancelled && token === renderTokenRef.current) {
|
|
3901
|
-
if (err instanceof
|
|
3907
|
+
if (err instanceof chunkHHQRYCLW_js.EncryptedFileError) {
|
|
3902
3908
|
setIsEncrypted(true);
|
|
3903
3909
|
} else {
|
|
3904
3910
|
setError(err instanceof Error ? err.message : String(err));
|
|
@@ -3975,7 +3981,7 @@ function useAutosave(input) {
|
|
|
3975
3981
|
isSavingRef.current = false;
|
|
3976
3982
|
return;
|
|
3977
3983
|
}
|
|
3978
|
-
await
|
|
3984
|
+
await chunkHHQRYCLW_js.saveAutosaveSnapshot(filePathRef.current, data);
|
|
3979
3985
|
setAutosaveStatus({ state: "saved", timestamp: Date.now() });
|
|
3980
3986
|
} catch (err) {
|
|
3981
3987
|
setAutosaveStatus({
|
|
@@ -4040,7 +4046,7 @@ function useElementOperations(input) {
|
|
|
4040
4046
|
}, [applySelection, setInlineEditingElementId, setContextMenuState]);
|
|
4041
4047
|
const updateElementById = react.useCallback(
|
|
4042
4048
|
(elementId, updates) => {
|
|
4043
|
-
if (
|
|
4049
|
+
if (chunkHHQRYCLW_js.isTemplateElementId(elementId)) {
|
|
4044
4050
|
const slideId = activeSlide?.id;
|
|
4045
4051
|
if (slideId) {
|
|
4046
4052
|
setTemplateElementsBySlideId((prev) => ({
|
|
@@ -4080,7 +4086,7 @@ function useElementOperations(input) {
|
|
|
4080
4086
|
);
|
|
4081
4087
|
const updateSelectedShapeStyle = react.useCallback(
|
|
4082
4088
|
(updates) => {
|
|
4083
|
-
if (!selectedElement || !
|
|
4089
|
+
if (!selectedElement || !chunkHHQRYCLW_js.hasShapeProperties(selectedElement)) {
|
|
4084
4090
|
return;
|
|
4085
4091
|
}
|
|
4086
4092
|
updateSelectedElement({
|
|
@@ -4091,17 +4097,17 @@ function useElementOperations(input) {
|
|
|
4091
4097
|
);
|
|
4092
4098
|
const updateSelectedTextStyle = react.useCallback(
|
|
4093
4099
|
(updates) => {
|
|
4094
|
-
if (!selectedElement || !
|
|
4100
|
+
if (!selectedElement || !chunkHHQRYCLW_js.hasTextProperties(selectedElement)) {
|
|
4095
4101
|
return;
|
|
4096
4102
|
}
|
|
4097
|
-
const inlineSel =
|
|
4103
|
+
const inlineSel = chunkHHQRYCLW_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
4098
4104
|
if (inlineSel && selectedElement.textSegments) {
|
|
4099
|
-
const { newSegments: newSegments2, newSelection } =
|
|
4105
|
+
const { newSegments: newSegments2, newSelection } = chunkHHQRYCLW_js.applyStyleToSelectedSegments(
|
|
4100
4106
|
selectedElement.textSegments,
|
|
4101
4107
|
inlineSel,
|
|
4102
4108
|
updates
|
|
4103
4109
|
);
|
|
4104
|
-
|
|
4110
|
+
chunkHHQRYCLW_js.setPendingSelectionRestore(newSelection);
|
|
4105
4111
|
updateSelectedElement({
|
|
4106
4112
|
textSegments: newSegments2
|
|
4107
4113
|
});
|
|
@@ -4121,12 +4127,12 @@ function useElementOperations(input) {
|
|
|
4121
4127
|
);
|
|
4122
4128
|
const updateSelectedTextCase = react.useCallback(
|
|
4123
4129
|
(mode) => {
|
|
4124
|
-
if (!selectedElement || !
|
|
4130
|
+
if (!selectedElement || !chunkHHQRYCLW_js.hasTextProperties(selectedElement)) {
|
|
4125
4131
|
return;
|
|
4126
4132
|
}
|
|
4127
|
-
const inlineSel =
|
|
4133
|
+
const inlineSel = chunkHHQRYCLW_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
4128
4134
|
if (inlineSel && selectedElement.textSegments) {
|
|
4129
|
-
const newSegments =
|
|
4135
|
+
const newSegments = chunkHHQRYCLW_js.applyCaseTransformToSegments(
|
|
4130
4136
|
selectedElement.textSegments,
|
|
4131
4137
|
inlineSel,
|
|
4132
4138
|
mode
|
|
@@ -4136,14 +4142,14 @@ function useElementOperations(input) {
|
|
|
4136
4142
|
}
|
|
4137
4143
|
const updates = {};
|
|
4138
4144
|
if (selectedElement.textSegments && selectedElement.textSegments.length > 0) {
|
|
4139
|
-
updates.textSegments =
|
|
4145
|
+
updates.textSegments = chunkHHQRYCLW_js.applyCaseTransformToSegments(
|
|
4140
4146
|
selectedElement.textSegments,
|
|
4141
4147
|
null,
|
|
4142
4148
|
mode
|
|
4143
4149
|
);
|
|
4144
4150
|
}
|
|
4145
4151
|
if (typeof selectedElement.text === "string") {
|
|
4146
|
-
updates.text =
|
|
4152
|
+
updates.text = chunkHHQRYCLW_js.transformTextCase(selectedElement.text, mode);
|
|
4147
4153
|
}
|
|
4148
4154
|
updateSelectedElement(updates);
|
|
4149
4155
|
},
|
|
@@ -4198,7 +4204,7 @@ function useSectionOperations(input) {
|
|
|
4198
4204
|
const { sections, setSections, slides, setSlides, markDirty } = input;
|
|
4199
4205
|
const addSection2 = react.useCallback(
|
|
4200
4206
|
(name, afterSlideIndex) => {
|
|
4201
|
-
const result =
|
|
4207
|
+
const result = chunkHHQRYCLW_js.addSection(sections, slides, name, afterSlideIndex);
|
|
4202
4208
|
setSlides(result.slides);
|
|
4203
4209
|
setSections(result.sections);
|
|
4204
4210
|
markDirty();
|
|
@@ -4207,7 +4213,7 @@ function useSectionOperations(input) {
|
|
|
4207
4213
|
);
|
|
4208
4214
|
const renameSection2 = react.useCallback(
|
|
4209
4215
|
(sectionId, newName) => {
|
|
4210
|
-
const result =
|
|
4216
|
+
const result = chunkHHQRYCLW_js.renameSection(sections, slides, sectionId, newName);
|
|
4211
4217
|
setSections(result.sections);
|
|
4212
4218
|
setSlides(result.slides);
|
|
4213
4219
|
markDirty();
|
|
@@ -4216,7 +4222,7 @@ function useSectionOperations(input) {
|
|
|
4216
4222
|
);
|
|
4217
4223
|
const deleteSection2 = react.useCallback(
|
|
4218
4224
|
(sectionId) => {
|
|
4219
|
-
const result =
|
|
4225
|
+
const result = chunkHHQRYCLW_js.deleteSection(sections, slides, sectionId);
|
|
4220
4226
|
setSections(result.sections);
|
|
4221
4227
|
setSlides(result.slides);
|
|
4222
4228
|
markDirty();
|
|
@@ -4225,21 +4231,21 @@ function useSectionOperations(input) {
|
|
|
4225
4231
|
);
|
|
4226
4232
|
const moveSectionUp2 = react.useCallback(
|
|
4227
4233
|
(sectionId) => {
|
|
4228
|
-
setSections(
|
|
4234
|
+
setSections(chunkHHQRYCLW_js.moveSectionUp(sections, sectionId));
|
|
4229
4235
|
markDirty();
|
|
4230
4236
|
},
|
|
4231
4237
|
[sections, setSections, markDirty]
|
|
4232
4238
|
);
|
|
4233
4239
|
const moveSectionDown2 = react.useCallback(
|
|
4234
4240
|
(sectionId) => {
|
|
4235
|
-
setSections(
|
|
4241
|
+
setSections(chunkHHQRYCLW_js.moveSectionDown(sections, sectionId));
|
|
4236
4242
|
markDirty();
|
|
4237
4243
|
},
|
|
4238
4244
|
[sections, setSections, markDirty]
|
|
4239
4245
|
);
|
|
4240
4246
|
const moveSlidesToSection2 = react.useCallback(
|
|
4241
4247
|
(slideIndexes, targetSectionId) => {
|
|
4242
|
-
const result =
|
|
4248
|
+
const result = chunkHHQRYCLW_js.moveSlidesToSection(sections, slides, slideIndexes, targetSectionId);
|
|
4243
4249
|
setSlides(result.slides);
|
|
4244
4250
|
setSections(result.sections);
|
|
4245
4251
|
markDirty();
|
|
@@ -4258,19 +4264,19 @@ function useSectionOperations(input) {
|
|
|
4258
4264
|
|
|
4259
4265
|
// src/viewer/hooks/pointer-move-handlers.ts
|
|
4260
4266
|
function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx) {
|
|
4261
|
-
const resized =
|
|
4267
|
+
const resized = chunkHHQRYCLW_js.applyResize(
|
|
4262
4268
|
{ x: startX, y: startY, width: startWidth, height: startHeight },
|
|
4263
4269
|
handle,
|
|
4264
4270
|
dx,
|
|
4265
4271
|
dy,
|
|
4266
4272
|
1,
|
|
4267
|
-
{ minSize:
|
|
4273
|
+
{ minSize: chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE }
|
|
4268
4274
|
);
|
|
4269
4275
|
const box = { x: resized.x, y: resized.y, width: resized.width, height: resized.height };
|
|
4270
4276
|
if (!snapToGrid) {
|
|
4271
4277
|
return box;
|
|
4272
4278
|
}
|
|
4273
|
-
return
|
|
4279
|
+
return chunkHHQRYCLW_js.snapBoxToGrid(box, handle, gridSpacingPx, chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE);
|
|
4274
4280
|
}
|
|
4275
4281
|
function computeAdjustmentValue(startAdjustment, dx, startWidth) {
|
|
4276
4282
|
const range = startWidth || 200;
|
|
@@ -4388,7 +4394,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4388
4394
|
width: el.width,
|
|
4389
4395
|
height: el.height
|
|
4390
4396
|
}));
|
|
4391
|
-
const snapResult =
|
|
4397
|
+
const snapResult = chunkHHQRYCLW_js.computeSnapToShape(
|
|
4392
4398
|
targetX,
|
|
4393
4399
|
targetY,
|
|
4394
4400
|
primaryEl.width,
|
|
@@ -4427,7 +4433,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
4427
4433
|
if (live) {
|
|
4428
4434
|
for (const id of Object.keys(drag.startPositionsById)) {
|
|
4429
4435
|
const start = drag.startPositionsById[id];
|
|
4430
|
-
|
|
4436
|
+
chunkHHQRYCLW_js.publishLiveGeometry(live.patcher, live.slideId, id, {
|
|
4431
4437
|
x: start.x + appliedDx,
|
|
4432
4438
|
y: start.y + appliedDy
|
|
4433
4439
|
});
|
|
@@ -4461,15 +4467,15 @@ function processResizeMove(e, rs, editorScale, snapToGrid, gridSpacingPx, live)
|
|
|
4461
4467
|
if (rs.domEl) {
|
|
4462
4468
|
rs.domEl.style.left = `${geo.x}px`;
|
|
4463
4469
|
rs.domEl.style.top = `${geo.y}px`;
|
|
4464
|
-
rs.domEl.style.width = `${Math.max(geo.width,
|
|
4465
|
-
rs.domEl.style.height = `${Math.max(geo.height,
|
|
4470
|
+
rs.domEl.style.width = `${Math.max(geo.width, chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE)}px`;
|
|
4471
|
+
rs.domEl.style.height = `${Math.max(geo.height, chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE)}px`;
|
|
4466
4472
|
}
|
|
4467
4473
|
if (live) {
|
|
4468
|
-
|
|
4474
|
+
chunkHHQRYCLW_js.publishLiveGeometry(live.patcher, live.slideId, rs.elementId, {
|
|
4469
4475
|
x: geo.x,
|
|
4470
4476
|
y: geo.y,
|
|
4471
|
-
width: Math.max(geo.width,
|
|
4472
|
-
height: Math.max(geo.height,
|
|
4477
|
+
width: Math.max(geo.width, chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE),
|
|
4478
|
+
height: Math.max(geo.height, chunk5ZI2ZG5E_js.MIN_ELEMENT_SIZE)
|
|
4473
4479
|
});
|
|
4474
4480
|
}
|
|
4475
4481
|
}
|
|
@@ -4549,13 +4555,13 @@ function processPointerUp(input) {
|
|
|
4549
4555
|
if (i !== activeSlideIndex) {
|
|
4550
4556
|
return s;
|
|
4551
4557
|
}
|
|
4552
|
-
const rerouted =
|
|
4558
|
+
const rerouted = chunkHHQRYCLW_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
|
|
4553
4559
|
if (rerouted.length === 0) {
|
|
4554
4560
|
return s;
|
|
4555
4561
|
}
|
|
4556
4562
|
return {
|
|
4557
4563
|
...s,
|
|
4558
|
-
elements:
|
|
4564
|
+
elements: chunkHHQRYCLW_js.applyReroutedConnectors(s.elements, rerouted)
|
|
4559
4565
|
};
|
|
4560
4566
|
})
|
|
4561
4567
|
);
|
|
@@ -4577,9 +4583,9 @@ function processPointerUp(input) {
|
|
|
4577
4583
|
}
|
|
4578
4584
|
function commitMarquee(marquee, editTemplateMode, templateElements, activeSlide, applySelection, clearSelection) {
|
|
4579
4585
|
const sourceElements = editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
4580
|
-
const hitIds =
|
|
4586
|
+
const hitIds = chunkHHQRYCLW_js.computeMarqueeHitIds(marquee, sourceElements);
|
|
4581
4587
|
if (marquee.additive) {
|
|
4582
|
-
const merged =
|
|
4588
|
+
const merged = chunkHHQRYCLW_js.mergeAdditiveSelection(marquee.baseSelectionIds, hitIds);
|
|
4583
4589
|
if (merged.length > 0) {
|
|
4584
4590
|
applySelection(merged[0], merged);
|
|
4585
4591
|
} else {
|
|
@@ -4602,8 +4608,8 @@ function commitDrag(drag, editTemplateMode, activeSlide, activeSlideIndex, setTe
|
|
|
4602
4608
|
}
|
|
4603
4609
|
return { ...el, x: start.x + dx, y: start.y + dy };
|
|
4604
4610
|
});
|
|
4605
|
-
const rerouted =
|
|
4606
|
-
return
|
|
4611
|
+
const rerouted = chunkHHQRYCLW_js.rerouteConnectorsForMovedElements(movedElements, movedIds);
|
|
4612
|
+
return chunkHHQRYCLW_js.applyReroutedConnectors(movedElements, rerouted);
|
|
4607
4613
|
};
|
|
4608
4614
|
if (editTemplateMode) {
|
|
4609
4615
|
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 && chunkHHQRYCLW_js.hasTextProperties(el)) {
|
|
4760
4766
|
const committedText = transformCommittedText ? transformCommittedText(inlineEditingText) : inlineEditingText;
|
|
4761
|
-
const newSegments =
|
|
4767
|
+
const newSegments = chunkHHQRYCLW_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 (!chunkHHQRYCLW_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 && chunkHHQRYCLW_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 (chunkHHQRYCLW_js.hasTextProperties(el)) {
|
|
4821
4827
|
setInlineEditingElementId(elementId);
|
|
4822
4828
|
setInlineEditingText(el.text ?? "");
|
|
4823
4829
|
}
|
|
@@ -5007,7 +5013,7 @@ function createFileHandlers(deps) {
|
|
|
5007
5013
|
h = Math.round(h * scale);
|
|
5008
5014
|
}
|
|
5009
5015
|
addElement({
|
|
5010
|
-
id:
|
|
5016
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5011
5017
|
type: "image",
|
|
5012
5018
|
x: Math.round((canvasSize.width - w) / 2),
|
|
5013
5019
|
y: Math.round((canvasSize.height - h) / 2),
|
|
@@ -5018,7 +5024,7 @@ function createFileHandlers(deps) {
|
|
|
5018
5024
|
};
|
|
5019
5025
|
img.onerror = () => {
|
|
5020
5026
|
addElement({
|
|
5021
|
-
id:
|
|
5027
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5022
5028
|
type: "image",
|
|
5023
5029
|
x: 100,
|
|
5024
5030
|
y: 100,
|
|
@@ -5044,7 +5050,7 @@ function createFileHandlers(deps) {
|
|
|
5044
5050
|
const elFilePath = file.path;
|
|
5045
5051
|
const insertMediaElement = (mediaSourceUrl, width, height) => {
|
|
5046
5052
|
addElement({
|
|
5047
|
-
id:
|
|
5053
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5048
5054
|
type: "media",
|
|
5049
5055
|
mediaType,
|
|
5050
5056
|
mediaMimeType: file.type || void 0,
|
|
@@ -5219,13 +5225,13 @@ function createStructuredElementHandlers(deps) {
|
|
|
5219
5225
|
return;
|
|
5220
5226
|
}
|
|
5221
5227
|
addElement({
|
|
5222
|
-
id:
|
|
5228
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5223
5229
|
type: "smartArt",
|
|
5224
5230
|
x: 100,
|
|
5225
5231
|
y: 120,
|
|
5226
5232
|
width: 600,
|
|
5227
5233
|
height: 340,
|
|
5228
|
-
smartArtData:
|
|
5234
|
+
smartArtData: chunkHHQRYCLW_js.buildSmartArtPresetData(
|
|
5229
5235
|
layout,
|
|
5230
5236
|
defaultItems,
|
|
5231
5237
|
(i) => `node-${Date.now()}-${i}-${Math.random().toString(36).slice(2, 8)}`
|
|
@@ -5237,7 +5243,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5237
5243
|
return;
|
|
5238
5244
|
}
|
|
5239
5245
|
addElement({
|
|
5240
|
-
id:
|
|
5246
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5241
5247
|
type: "shape",
|
|
5242
5248
|
x: 120,
|
|
5243
5249
|
y: 200,
|
|
@@ -5296,7 +5302,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5296
5302
|
const displayText = value || fieldTexts[fieldType] || fieldType;
|
|
5297
5303
|
const fieldGuid = `{${crypto.randomUUID().toUpperCase()}}`;
|
|
5298
5304
|
addElement({
|
|
5299
|
-
id:
|
|
5305
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5300
5306
|
type: "shape",
|
|
5301
5307
|
x: 120,
|
|
5302
5308
|
y: 200,
|
|
@@ -5318,11 +5324,11 @@ function createStructuredElementHandlers(deps) {
|
|
|
5318
5324
|
if (!activeSlide) {
|
|
5319
5325
|
return;
|
|
5320
5326
|
}
|
|
5321
|
-
const preset =
|
|
5327
|
+
const preset = chunkHHQRYCLW_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
|
|
5322
5328
|
if (!preset) {
|
|
5323
5329
|
return;
|
|
5324
5330
|
}
|
|
5325
|
-
const defaultPptxAction =
|
|
5331
|
+
const defaultPptxAction = chunkHHQRYCLW_js.elementActionToPptxAction({
|
|
5326
5332
|
trigger: "click",
|
|
5327
5333
|
type: preset.defaultAction
|
|
5328
5334
|
});
|
|
@@ -5331,7 +5337,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
5331
5337
|
defaultPptxAction.highlightClick = true;
|
|
5332
5338
|
}
|
|
5333
5339
|
addElement({
|
|
5334
|
-
id:
|
|
5340
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5335
5341
|
type: "shape",
|
|
5336
5342
|
x: 150,
|
|
5337
5343
|
y: 150,
|
|
@@ -5398,14 +5404,14 @@ function useInsertElements(input) {
|
|
|
5398
5404
|
return;
|
|
5399
5405
|
}
|
|
5400
5406
|
addElement({
|
|
5401
|
-
id:
|
|
5407
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5402
5408
|
type: "text",
|
|
5403
5409
|
x: 100,
|
|
5404
5410
|
y: 100,
|
|
5405
5411
|
width: 300,
|
|
5406
5412
|
height: 60,
|
|
5407
5413
|
text: "",
|
|
5408
|
-
textStyle: { fontSize:
|
|
5414
|
+
textStyle: { fontSize: chunk5ZI2ZG5E_js.DEFAULT_TEXT_FONT_SIZE }
|
|
5409
5415
|
});
|
|
5410
5416
|
};
|
|
5411
5417
|
const handleAddShape = () => {
|
|
@@ -5413,7 +5419,7 @@ function useInsertElements(input) {
|
|
|
5413
5419
|
return;
|
|
5414
5420
|
}
|
|
5415
5421
|
addElement({
|
|
5416
|
-
id:
|
|
5422
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5417
5423
|
type: "shape",
|
|
5418
5424
|
x: 150,
|
|
5419
5425
|
y: 150,
|
|
@@ -5432,15 +5438,15 @@ function useInsertElements(input) {
|
|
|
5432
5438
|
return;
|
|
5433
5439
|
}
|
|
5434
5440
|
addElement({
|
|
5435
|
-
...
|
|
5436
|
-
id:
|
|
5441
|
+
...chunkHHQRYCLW_js.newTableElement(chunk5ZI2ZG5E_js.DEFAULT_TABLE_ROWS, chunk5ZI2ZG5E_js.DEFAULT_TABLE_COLUMNS, 100, 200),
|
|
5442
|
+
id: chunkHHQRYCLW_js.generateElementId()
|
|
5437
5443
|
});
|
|
5438
5444
|
};
|
|
5439
5445
|
const handleAddChart = (chartType) => {
|
|
5440
5446
|
if (!activeSlide) {
|
|
5441
5447
|
return;
|
|
5442
5448
|
}
|
|
5443
|
-
addElement(
|
|
5449
|
+
addElement(chunkHHQRYCLW_js.createDefaultChartElement(chartType));
|
|
5444
5450
|
};
|
|
5445
5451
|
const structured = createStructuredElementHandlers({
|
|
5446
5452
|
activeSlide,
|
|
@@ -5510,7 +5516,7 @@ function useClipboardHandlers(input) {
|
|
|
5510
5516
|
if (!selectedElement) {
|
|
5511
5517
|
return;
|
|
5512
5518
|
}
|
|
5513
|
-
setClipboardPayload(
|
|
5519
|
+
setClipboardPayload(chunkHHQRYCLW_js.buildElementClipboardPayload(selectedElement, editTemplateMode));
|
|
5514
5520
|
};
|
|
5515
5521
|
const handleDelete = () => {
|
|
5516
5522
|
const idsToDelete = effectiveSelectedIds;
|
|
@@ -5527,7 +5533,7 @@ function useClipboardHandlers(input) {
|
|
|
5527
5533
|
handleDelete();
|
|
5528
5534
|
};
|
|
5529
5535
|
const insertClone = (source) => {
|
|
5530
|
-
const clone =
|
|
5536
|
+
const clone = chunkHHQRYCLW_js.cloneElementForPaste(source, { intoTemplate: editTemplateMode });
|
|
5531
5537
|
ops.updateActiveElements((els) => [...els, clone]);
|
|
5532
5538
|
ops.applySelection(clone.id);
|
|
5533
5539
|
history.markDirty();
|
|
@@ -5562,7 +5568,7 @@ function resolveShapePath(el) {
|
|
|
5562
5568
|
return el.pathData;
|
|
5563
5569
|
}
|
|
5564
5570
|
if ("shapeType" in el && typeof el.shapeType === "string") {
|
|
5565
|
-
const clipPath =
|
|
5571
|
+
const clipPath = chunkHHQRYCLW_js.getPresetShapeClipPath(el.shapeType);
|
|
5566
5572
|
if (clipPath) {
|
|
5567
5573
|
const svgPath = clipPathToSvgPath(clipPath, el.width, el.height);
|
|
5568
5574
|
if (svgPath) {
|
|
@@ -5613,7 +5619,7 @@ function clipPathToSvgPath(clipPath, width, height) {
|
|
|
5613
5619
|
return parts.join(" ");
|
|
5614
5620
|
}
|
|
5615
5621
|
function transformPathToGlobal(pathData, el) {
|
|
5616
|
-
const polys =
|
|
5622
|
+
const polys = chunkHHQRYCLW_js.svgPathToPolygons(pathData);
|
|
5617
5623
|
if (polys.length === 0) {
|
|
5618
5624
|
return pathData;
|
|
5619
5625
|
}
|
|
@@ -5633,10 +5639,10 @@ function transformPathToGlobal(pathData, el) {
|
|
|
5633
5639
|
y: pt.y * scaleY + el.y
|
|
5634
5640
|
}))
|
|
5635
5641
|
);
|
|
5636
|
-
return
|
|
5642
|
+
return chunkHHQRYCLW_js.polygonsToSvgPath(transformed);
|
|
5637
5643
|
}
|
|
5638
5644
|
function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
5639
|
-
const polys =
|
|
5645
|
+
const polys = chunkHHQRYCLW_js.svgPathToPolygons(pathData);
|
|
5640
5646
|
if (polys.length === 0) {
|
|
5641
5647
|
return pathData;
|
|
5642
5648
|
}
|
|
@@ -5646,10 +5652,10 @@ function transformPathToLocal(pathData, x, y, _width, _height) {
|
|
|
5646
5652
|
y: pt.y - y
|
|
5647
5653
|
}))
|
|
5648
5654
|
);
|
|
5649
|
-
return
|
|
5655
|
+
return chunkHHQRYCLW_js.polygonsToSvgPath(transformed);
|
|
5650
5656
|
}
|
|
5651
5657
|
function pathBounds(pathData) {
|
|
5652
|
-
const polys =
|
|
5658
|
+
const polys = chunkHHQRYCLW_js.svgPathToPolygons(pathData);
|
|
5653
5659
|
let minX = Infinity;
|
|
5654
5660
|
let minY = Infinity;
|
|
5655
5661
|
let maxX = -Infinity;
|
|
@@ -5708,7 +5714,7 @@ function useMergeShapesHandler(input) {
|
|
|
5708
5714
|
let allFragments = [];
|
|
5709
5715
|
let remaining = globalPaths[0];
|
|
5710
5716
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
5711
|
-
const frags =
|
|
5717
|
+
const frags = chunkHHQRYCLW_js.mergeShapes("fragment", remaining, globalPaths[i]);
|
|
5712
5718
|
if (Array.isArray(frags)) {
|
|
5713
5719
|
allFragments = frags;
|
|
5714
5720
|
}
|
|
@@ -5737,7 +5743,7 @@ function useMergeShapesHandler(input) {
|
|
|
5737
5743
|
bounds.height
|
|
5738
5744
|
);
|
|
5739
5745
|
const newEl = {
|
|
5740
|
-
id:
|
|
5746
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5741
5747
|
type: "shape",
|
|
5742
5748
|
x: bounds.x,
|
|
5743
5749
|
y: bounds.y,
|
|
@@ -5775,7 +5781,7 @@ function useMergeShapesHandler(input) {
|
|
|
5775
5781
|
} else {
|
|
5776
5782
|
let resultPath = globalPaths[0];
|
|
5777
5783
|
for (let i = 1; i < globalPaths.length; i++) {
|
|
5778
|
-
const result =
|
|
5784
|
+
const result = chunkHHQRYCLW_js.mergeShapes(operation, resultPath, globalPaths[i]);
|
|
5779
5785
|
if (typeof result === "string") {
|
|
5780
5786
|
resultPath = result;
|
|
5781
5787
|
}
|
|
@@ -5796,7 +5802,7 @@ function useMergeShapesHandler(input) {
|
|
|
5796
5802
|
);
|
|
5797
5803
|
const primary = targets[0];
|
|
5798
5804
|
const newEl = {
|
|
5799
|
-
id:
|
|
5805
|
+
id: chunkHHQRYCLW_js.generateElementId(),
|
|
5800
5806
|
type: "shape",
|
|
5801
5807
|
x: bounds.x,
|
|
5802
5808
|
y: bounds.y,
|
|
@@ -5859,7 +5865,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5859
5865
|
if (ids.length < 2 || !activeSlide) {
|
|
5860
5866
|
return;
|
|
5861
5867
|
}
|
|
5862
|
-
const { elements, groupId } =
|
|
5868
|
+
const { elements, groupId } = chunkHHQRYCLW_js.groupElements(ops.activeElements, ids, chunkHHQRYCLW_js.generateElementId());
|
|
5863
5869
|
if (groupId === null) {
|
|
5864
5870
|
return;
|
|
5865
5871
|
}
|
|
@@ -5872,12 +5878,12 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5872
5878
|
return;
|
|
5873
5879
|
}
|
|
5874
5880
|
const group = selectedElement;
|
|
5875
|
-
const intoTemplate =
|
|
5881
|
+
const intoTemplate = chunkHHQRYCLW_js.isTemplateElementId(group.id);
|
|
5876
5882
|
const ungrouped = group.children.map((child) => ({
|
|
5877
5883
|
...structuredClone(child),
|
|
5878
5884
|
// Keep child ids in the same store as the group so later edits route
|
|
5879
5885
|
// correctly: template groups yield template-prefixed child ids.
|
|
5880
|
-
id: intoTemplate ?
|
|
5886
|
+
id: intoTemplate ? chunkHHQRYCLW_js.makeCloneId(true, child.id || group.id) : child.id || chunkHHQRYCLW_js.generateElementId(),
|
|
5881
5887
|
x: child.x + group.x,
|
|
5882
5888
|
y: child.y + group.y
|
|
5883
5889
|
}));
|
|
@@ -5901,7 +5907,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5901
5907
|
if (!edge) {
|
|
5902
5908
|
return;
|
|
5903
5909
|
}
|
|
5904
|
-
const positions =
|
|
5910
|
+
const positions = chunkHHQRYCLW_js.alignElements(selectedElements, edge);
|
|
5905
5911
|
for (const [id, pos] of positions) {
|
|
5906
5912
|
const el = elementLookup.get(id);
|
|
5907
5913
|
if (!el) {
|
|
@@ -5919,7 +5925,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5919
5925
|
if (!distAxis) {
|
|
5920
5926
|
return;
|
|
5921
5927
|
}
|
|
5922
|
-
const positions =
|
|
5928
|
+
const positions = chunkHHQRYCLW_js.distributeElements(selectedElements, distAxis);
|
|
5923
5929
|
for (const [id, pos] of positions) {
|
|
5924
5930
|
const el = elementLookup.get(id);
|
|
5925
5931
|
if (!el) {
|
|
@@ -5936,7 +5942,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5936
5942
|
}
|
|
5937
5943
|
const id = selectedElement.id;
|
|
5938
5944
|
ops.updateActiveElements(
|
|
5939
|
-
(els) => direction === "forward" ?
|
|
5945
|
+
(els) => direction === "forward" ? chunkHHQRYCLW_js.bringForward(els, id) : direction === "backward" ? chunkHHQRYCLW_js.sendBackward(els, id) : els
|
|
5940
5946
|
);
|
|
5941
5947
|
history.markDirty();
|
|
5942
5948
|
};
|
|
@@ -5946,7 +5952,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
5946
5952
|
}
|
|
5947
5953
|
const id = selectedElement.id;
|
|
5948
5954
|
ops.updateActiveElements(
|
|
5949
|
-
(els) => direction === "front" ?
|
|
5955
|
+
(els) => direction === "front" ? chunkHHQRYCLW_js.bringToFront(els, id) : chunkHHQRYCLW_js.sendToBack(els, id)
|
|
5950
5956
|
);
|
|
5951
5957
|
history.markDirty();
|
|
5952
5958
|
};
|
|
@@ -6068,7 +6074,7 @@ function insertSlideFromLayoutUpdater(slides, activeIndex, draft) {
|
|
|
6068
6074
|
function useSlideManagement(input) {
|
|
6069
6075
|
const { slides, activeSlideIndex, setActiveSlideIndex, ops, history, handlerRef } = input;
|
|
6070
6076
|
const handleAddSlide = () => {
|
|
6071
|
-
const newSlide =
|
|
6077
|
+
const newSlide = chunkHHQRYCLW_js.createBlankSlide(slides.length + 1);
|
|
6072
6078
|
ops.updateSlides((prev) => {
|
|
6073
6079
|
const next = [...prev];
|
|
6074
6080
|
next.splice(activeSlideIndex + 1, 0, newSlide);
|
|
@@ -6131,7 +6137,7 @@ function useSlideManagement(input) {
|
|
|
6131
6137
|
}
|
|
6132
6138
|
const clone = {
|
|
6133
6139
|
...src,
|
|
6134
|
-
id:
|
|
6140
|
+
id: chunkHHQRYCLW_js.makeSlideId(),
|
|
6135
6141
|
elements: src.elements.map((el) => ({
|
|
6136
6142
|
...el,
|
|
6137
6143
|
id: `${el.id}-dup-${Math.random().toString(36).slice(2, 6)}`
|
|
@@ -6163,7 +6169,7 @@ function useSlideManagement(input) {
|
|
|
6163
6169
|
const handleInsertSlideFromLayout = (layoutPath, layoutName) => {
|
|
6164
6170
|
const insertAt = activeSlideIndex + 1;
|
|
6165
6171
|
const draft = {
|
|
6166
|
-
...
|
|
6172
|
+
...chunkHHQRYCLW_js.createBlankSlide(slides.length + 1),
|
|
6167
6173
|
layoutPath,
|
|
6168
6174
|
...layoutName ? { layoutName } : {}
|
|
6169
6175
|
};
|
|
@@ -6224,7 +6230,7 @@ function createTableMergeHandlers(input) {
|
|
|
6224
6230
|
if (!nextCell || nextCell.hMerge || nextCell.vMerge) {
|
|
6225
6231
|
return;
|
|
6226
6232
|
}
|
|
6227
|
-
const newTableData =
|
|
6233
|
+
const newTableData = chunkHHQRYCLW_js.mergeCells(
|
|
6228
6234
|
[
|
|
6229
6235
|
{ row: rowIndex, col: columnIndex },
|
|
6230
6236
|
{ row: rowIndex, col: nextColIdx }
|
|
@@ -6232,7 +6238,7 @@ function createTableMergeHandlers(input) {
|
|
|
6232
6238
|
td
|
|
6233
6239
|
);
|
|
6234
6240
|
const updates = { tableData: newTableData };
|
|
6235
|
-
const newRawXml =
|
|
6241
|
+
const newRawXml = chunkHHQRYCLW_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6236
6242
|
if (newRawXml) {
|
|
6237
6243
|
updates.rawXml = newRawXml;
|
|
6238
6244
|
}
|
|
@@ -6258,7 +6264,7 @@ function createTableMergeHandlers(input) {
|
|
|
6258
6264
|
if (!targetNextCell || targetNextCell.hMerge || targetNextCell.vMerge) {
|
|
6259
6265
|
return;
|
|
6260
6266
|
}
|
|
6261
|
-
const newTableData =
|
|
6267
|
+
const newTableData = chunkHHQRYCLW_js.mergeCells(
|
|
6262
6268
|
[
|
|
6263
6269
|
{ row: rowIndex, col: columnIndex },
|
|
6264
6270
|
{ row: targetNextRowIdx, col: columnIndex }
|
|
@@ -6266,7 +6272,7 @@ function createTableMergeHandlers(input) {
|
|
|
6266
6272
|
td
|
|
6267
6273
|
);
|
|
6268
6274
|
const updates = { tableData: newTableData };
|
|
6269
|
-
const newRawXml =
|
|
6275
|
+
const newRawXml = chunkHHQRYCLW_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6270
6276
|
if (newRawXml) {
|
|
6271
6277
|
updates.rawXml = newRawXml;
|
|
6272
6278
|
}
|
|
@@ -6281,9 +6287,9 @@ function createTableMergeHandlers(input) {
|
|
|
6281
6287
|
return;
|
|
6282
6288
|
}
|
|
6283
6289
|
const td = selectedElement.tableData;
|
|
6284
|
-
const newTableData =
|
|
6290
|
+
const newTableData = chunkHHQRYCLW_js.mergeCells(ts.selectedCells, td);
|
|
6285
6291
|
const updates = { tableData: newTableData };
|
|
6286
|
-
const newRawXml =
|
|
6292
|
+
const newRawXml = chunkHHQRYCLW_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6287
6293
|
if (newRawXml) {
|
|
6288
6294
|
updates.rawXml = newRawXml;
|
|
6289
6295
|
}
|
|
@@ -6300,9 +6306,9 @@ function createTableMergeHandlers(input) {
|
|
|
6300
6306
|
}
|
|
6301
6307
|
const { rowIndex, columnIndex } = ts;
|
|
6302
6308
|
const td = selectedElement.tableData;
|
|
6303
|
-
const newTableData =
|
|
6309
|
+
const newTableData = chunkHHQRYCLW_js.splitCell(rowIndex, columnIndex, td);
|
|
6304
6310
|
const updates = { tableData: newTableData };
|
|
6305
|
-
const newRawXml =
|
|
6311
|
+
const newRawXml = chunkHHQRYCLW_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
6306
6312
|
if (newRawXml) {
|
|
6307
6313
|
updates.rawXml = newRawXml;
|
|
6308
6314
|
}
|
|
@@ -6346,7 +6352,7 @@ function createTableStructHandlers(input) {
|
|
|
6346
6352
|
updates.tableData = { ...el.tableData, rows: newRows };
|
|
6347
6353
|
}
|
|
6348
6354
|
if (el.rawXml) {
|
|
6349
|
-
const newRawXml =
|
|
6355
|
+
const newRawXml = chunkHHQRYCLW_js.updateCellTextInRawXml(el, rowIndex, colIndex, text);
|
|
6350
6356
|
if (newRawXml) {
|
|
6351
6357
|
updates.rawXml = newRawXml;
|
|
6352
6358
|
}
|
|
@@ -6370,7 +6376,7 @@ function createTableStructHandlers(input) {
|
|
|
6370
6376
|
const { rowIndex, columnIndex: colIndex } = ts;
|
|
6371
6377
|
const updates = {};
|
|
6372
6378
|
if (selectedElement.rawXml) {
|
|
6373
|
-
const newRawXml =
|
|
6379
|
+
const newRawXml = chunkHHQRYCLW_js.updateCellTextStyleInRawXml(
|
|
6374
6380
|
selectedElement,
|
|
6375
6381
|
rowIndex,
|
|
6376
6382
|
colIndex,
|
|
@@ -6434,9 +6440,9 @@ function createTableStructHandlers(input) {
|
|
|
6434
6440
|
return;
|
|
6435
6441
|
}
|
|
6436
6442
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6437
|
-
const newTableData =
|
|
6443
|
+
const newTableData = chunkHHQRYCLW_js.insertTableRow(selectedElement.tableData, rowIdx, position);
|
|
6438
6444
|
const updates = { tableData: newTableData };
|
|
6439
|
-
const newRawXml =
|
|
6445
|
+
const newRawXml = chunkHHQRYCLW_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6440
6446
|
if (newRawXml) {
|
|
6441
6447
|
updates.rawXml = newRawXml;
|
|
6442
6448
|
}
|
|
@@ -6449,12 +6455,12 @@ function createTableStructHandlers(input) {
|
|
|
6449
6455
|
}
|
|
6450
6456
|
const td = selectedElement.tableData;
|
|
6451
6457
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
6452
|
-
const newTableData =
|
|
6458
|
+
const newTableData = chunkHHQRYCLW_js.deleteTableRow(td, rowIdx);
|
|
6453
6459
|
if (newTableData === td) {
|
|
6454
6460
|
return;
|
|
6455
6461
|
}
|
|
6456
6462
|
const updates = { tableData: newTableData };
|
|
6457
|
-
const newRawXml =
|
|
6463
|
+
const newRawXml = chunkHHQRYCLW_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6458
6464
|
if (newRawXml) {
|
|
6459
6465
|
updates.rawXml = newRawXml;
|
|
6460
6466
|
}
|
|
@@ -6466,9 +6472,9 @@ function createTableStructHandlers(input) {
|
|
|
6466
6472
|
return;
|
|
6467
6473
|
}
|
|
6468
6474
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6469
|
-
const newTableData =
|
|
6475
|
+
const newTableData = chunkHHQRYCLW_js.insertTableColumn(selectedElement.tableData, colIdx, position);
|
|
6470
6476
|
const updates = { tableData: newTableData };
|
|
6471
|
-
const newRawXml =
|
|
6477
|
+
const newRawXml = chunkHHQRYCLW_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6472
6478
|
if (newRawXml) {
|
|
6473
6479
|
updates.rawXml = newRawXml;
|
|
6474
6480
|
}
|
|
@@ -6481,12 +6487,12 @@ function createTableStructHandlers(input) {
|
|
|
6481
6487
|
}
|
|
6482
6488
|
const td = selectedElement.tableData;
|
|
6483
6489
|
const colIdx = ts?.columnIndex ?? 0;
|
|
6484
|
-
const newTableData =
|
|
6490
|
+
const newTableData = chunkHHQRYCLW_js.deleteTableColumn(td, colIdx);
|
|
6485
6491
|
if (newTableData === td) {
|
|
6486
6492
|
return;
|
|
6487
6493
|
}
|
|
6488
6494
|
const updates = { tableData: newTableData };
|
|
6489
|
-
const newRawXml =
|
|
6495
|
+
const newRawXml = chunkHHQRYCLW_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
6490
6496
|
if (newRawXml) {
|
|
6491
6497
|
updates.rawXml = newRawXml;
|
|
6492
6498
|
}
|
|
@@ -6522,8 +6528,8 @@ async function renderToCanvas(element, options = {}) {
|
|
|
6522
6528
|
return html2canvasPro(element, {
|
|
6523
6529
|
...options,
|
|
6524
6530
|
onclone: async (doc, clonedEl) => {
|
|
6525
|
-
await
|
|
6526
|
-
|
|
6531
|
+
await chunkHHQRYCLW_js.normalizeColorsForCapture(doc, clonedEl);
|
|
6532
|
+
chunkHHQRYCLW_js.preprocessCssForCapture(clonedEl);
|
|
6527
6533
|
if (typeof userOnClone === "function") {
|
|
6528
6534
|
userOnClone(doc, clonedEl);
|
|
6529
6535
|
}
|
|
@@ -6579,7 +6585,7 @@ async function exportSlideToPngBlob(slideElement, options = {}) {
|
|
|
6579
6585
|
}
|
|
6580
6586
|
async function exportSlideAsPng(slideElement, slideIndex, options = {}) {
|
|
6581
6587
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
6582
|
-
|
|
6588
|
+
chunkHHQRYCLW_js.downloadBlob(blob, `slide-${slideIndex + 1}.png`);
|
|
6583
6589
|
}
|
|
6584
6590
|
async function copySlideToClipboard(slideElement, options = {}) {
|
|
6585
6591
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
@@ -6601,15 +6607,15 @@ async function exportAllSlidesAsPdf(slideStageRef, totalSlides, setActiveSlide,
|
|
|
6601
6607
|
continue;
|
|
6602
6608
|
}
|
|
6603
6609
|
const canvas = await renderElementToCanvas(stageEl, scale);
|
|
6604
|
-
images.push(
|
|
6610
|
+
images.push(chunkHHQRYCLW_js.canvasToJpegData(canvas));
|
|
6605
6611
|
}
|
|
6606
6612
|
onProgress?.(totalSlides, totalSlides);
|
|
6607
6613
|
setActiveSlide(currentSlideIndex);
|
|
6608
6614
|
if (images.length === 0) {
|
|
6609
6615
|
throw new Error(chunk25VSL2BB_js.translationsEn["pptx.export.errorNoSlidesPdf"]);
|
|
6610
6616
|
}
|
|
6611
|
-
const pdfBlobUrl =
|
|
6612
|
-
|
|
6617
|
+
const pdfBlobUrl = chunk5ZI2ZG5E_js.buildPdfFromImageData(images);
|
|
6618
|
+
chunkHHQRYCLW_js.downloadDataUrl(pdfBlobUrl, filename);
|
|
6613
6619
|
}
|
|
6614
6620
|
async function captureAllSlidesAsPngDataUrls(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, options = {}) {
|
|
6615
6621
|
const { scale = 2, onProgress } = options;
|
|
@@ -6657,8 +6663,8 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
|
|
|
6657
6663
|
if (pages.length === 0) {
|
|
6658
6664
|
throw new Error(chunk25VSL2BB_js.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
|
|
6659
6665
|
}
|
|
6660
|
-
const pdfDataUrl =
|
|
6661
|
-
|
|
6666
|
+
const pdfDataUrl = chunk5ZI2ZG5E_js.buildNotesPdf(pages);
|
|
6667
|
+
chunkHHQRYCLW_js.downloadDataUrl(pdfDataUrl, filename);
|
|
6662
6668
|
}
|
|
6663
6669
|
|
|
6664
6670
|
// src/viewer/utils/export-video.ts
|
|
@@ -6702,7 +6708,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
6702
6708
|
const fps = 30;
|
|
6703
6709
|
const stream = recordingCanvas.captureStream(fps);
|
|
6704
6710
|
const recorder = new MediaRecorder(stream, {
|
|
6705
|
-
mimeType:
|
|
6711
|
+
mimeType: chunkHHQRYCLW_js.pickSupportedMimeType([...chunkHHQRYCLW_js.WEBM_MIME_CANDIDATES]),
|
|
6706
6712
|
videoBitsPerSecond: 5e6
|
|
6707
6713
|
});
|
|
6708
6714
|
const chunks = [];
|
|
@@ -6725,8 +6731,8 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
6725
6731
|
const duration = slideTimingsMs?.[i] ?? slideDurationMs;
|
|
6726
6732
|
ctx.clearRect(0, 0, recordingCanvas.width, recordingCanvas.height);
|
|
6727
6733
|
ctx.drawImage(slideCanvases[i], 0, 0);
|
|
6728
|
-
const frameInterval =
|
|
6729
|
-
const framesNeeded =
|
|
6734
|
+
const frameInterval = chunkHHQRYCLW_js.fpsToFrameIntervalMs(fps);
|
|
6735
|
+
const framesNeeded = chunkHHQRYCLW_js.segmentFrameCount(duration, fps);
|
|
6730
6736
|
for (let f = 0; f < framesNeeded; f++) {
|
|
6731
6737
|
if (signal?.aborted) {
|
|
6732
6738
|
recorder.stop();
|
|
@@ -6775,7 +6781,7 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
|
|
|
6775
6781
|
if (frames.length === 0) {
|
|
6776
6782
|
throw new Error(chunk25VSL2BB_js.translationsEn["pptx.export.errorNoSlidesGif"]);
|
|
6777
6783
|
}
|
|
6778
|
-
const gifBytes =
|
|
6784
|
+
const gifBytes = chunkHHQRYCLW_js.encodeGif(frames, Math.round(slideDurationMs / 10));
|
|
6779
6785
|
onProgress?.(totalSlides, totalSlides);
|
|
6780
6786
|
const buf = new ArrayBuffer(gifBytes.length);
|
|
6781
6787
|
new Uint8Array(buf).set(gifBytes);
|
|
@@ -6829,7 +6835,7 @@ function exportAllSlidesToSvg(data, options = {}) {
|
|
|
6829
6835
|
continue;
|
|
6830
6836
|
}
|
|
6831
6837
|
onProgress?.(processedCount, data.slides.length);
|
|
6832
|
-
let svg =
|
|
6838
|
+
let svg = chunkHHQRYCLW_js.SvgExporter.exportSlide(slide, data.width, data.height, svgOptions);
|
|
6833
6839
|
if (embedFonts && fontFaces?.length) {
|
|
6834
6840
|
svg = injectFontFaces(svg, fontFaces);
|
|
6835
6841
|
}
|
|
@@ -6889,7 +6895,7 @@ function useExportSaveAs(input) {
|
|
|
6889
6895
|
}
|
|
6890
6896
|
setExportProgress(70);
|
|
6891
6897
|
setExportStatusMessage("Writing README...");
|
|
6892
|
-
const readme =
|
|
6898
|
+
const readme = chunkHHQRYCLW_js.generatePackageReadme(pptxFilename);
|
|
6893
6899
|
pkgFolder.file("README.txt", readme);
|
|
6894
6900
|
if (abortCtrl.signal.aborted) {
|
|
6895
6901
|
throw new DOMException("Export cancelled", "AbortError");
|
|
@@ -6900,7 +6906,7 @@ function useExportSaveAs(input) {
|
|
|
6900
6906
|
setExportProgress(95);
|
|
6901
6907
|
setExportStatusMessage("Downloading...");
|
|
6902
6908
|
const baseName = pptxFilename.replace(/\.[^.]+$/u, "");
|
|
6903
|
-
|
|
6909
|
+
chunkHHQRYCLW_js.downloadBlob(zipBlob, `${baseName}-package.zip`);
|
|
6904
6910
|
setExportProgress(100);
|
|
6905
6911
|
} catch (err) {
|
|
6906
6912
|
if (err.name !== "AbortError") {
|
|
@@ -6923,7 +6929,7 @@ function useExportSaveAs(input) {
|
|
|
6923
6929
|
const blob = new Blob([data], {
|
|
6924
6930
|
type: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
|
|
6925
6931
|
});
|
|
6926
|
-
|
|
6932
|
+
chunkHHQRYCLW_js.downloadBlob(blob, `${baseName}.${ext}`);
|
|
6927
6933
|
} catch (err) {
|
|
6928
6934
|
console.error(`[PowerPointViewer] Save as .${ext} failed:`, err);
|
|
6929
6935
|
}
|
|
@@ -6936,14 +6942,14 @@ function useExportSaveAs(input) {
|
|
|
6936
6942
|
const pptxGuides = guides.map((g) => ({
|
|
6937
6943
|
id: g.id,
|
|
6938
6944
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
6939
|
-
positionEmu:
|
|
6945
|
+
positionEmu: chunkHHQRYCLW_js.guidePxToEmu(g.position)
|
|
6940
6946
|
}));
|
|
6941
6947
|
return {
|
|
6942
6948
|
...slide,
|
|
6943
6949
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
6944
6950
|
};
|
|
6945
6951
|
});
|
|
6946
|
-
const slidesToSave =
|
|
6952
|
+
const slidesToSave = chunk5ZI2ZG5E_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
6947
6953
|
const saveOptions = {
|
|
6948
6954
|
headerFooter,
|
|
6949
6955
|
presentationProperties,
|
|
@@ -7000,7 +7006,7 @@ function safeConfirm(message) {
|
|
|
7000
7006
|
}
|
|
7001
7007
|
}
|
|
7002
7008
|
function downloadBlob2(blob, filename) {
|
|
7003
|
-
|
|
7009
|
+
chunkHHQRYCLW_js.downloadBlob(blob, chunkHHQRYCLW_js.sanitizeDownloadFilename(filename));
|
|
7004
7010
|
}
|
|
7005
7011
|
|
|
7006
7012
|
// src/viewer/hooks/useExportHandlers.ts
|
|
@@ -7101,21 +7107,21 @@ function useExportHandlers(input) {
|
|
|
7101
7107
|
{
|
|
7102
7108
|
scale: 2,
|
|
7103
7109
|
onProgress: (current, total) => {
|
|
7104
|
-
setExportProgress(
|
|
7105
|
-
setExportStatusMessage(
|
|
7110
|
+
setExportProgress(chunkHHQRYCLW_js.slideProgressPercent(current, total));
|
|
7111
|
+
setExportStatusMessage(chunkHHQRYCLW_js.slideStatusLabel("Rendering", current, total));
|
|
7106
7112
|
},
|
|
7107
7113
|
signal: abortCtrl.signal
|
|
7108
7114
|
}
|
|
7109
7115
|
);
|
|
7110
|
-
setExportProgress(
|
|
7116
|
+
setExportProgress(chunkHHQRYCLW_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7111
7117
|
setExportStatusMessage("Building PDF...");
|
|
7112
7118
|
await new Promise((r) => {
|
|
7113
7119
|
setTimeout(r, 100);
|
|
7114
7120
|
});
|
|
7115
|
-
setExportProgress(
|
|
7121
|
+
setExportProgress(chunkHHQRYCLW_js.EXPORT_DONE_PERCENT);
|
|
7116
7122
|
setExportStatusMessage("Done!");
|
|
7117
7123
|
} catch (err) {
|
|
7118
|
-
if (!
|
|
7124
|
+
if (!chunkHHQRYCLW_js.isExportAbortError(err)) {
|
|
7119
7125
|
console.error("[PowerPointViewer] PDF export failed:", err);
|
|
7120
7126
|
}
|
|
7121
7127
|
} finally {
|
|
@@ -7145,21 +7151,21 @@ function useExportHandlers(input) {
|
|
|
7145
7151
|
{
|
|
7146
7152
|
scale: 2,
|
|
7147
7153
|
onProgress: (current, total) => {
|
|
7148
|
-
setExportProgress(
|
|
7149
|
-
setExportStatusMessage(
|
|
7154
|
+
setExportProgress(chunkHHQRYCLW_js.slideProgressPercent(current, total));
|
|
7155
|
+
setExportStatusMessage(chunkHHQRYCLW_js.slideStatusLabel("Rendering", current, total));
|
|
7150
7156
|
},
|
|
7151
7157
|
signal: abortCtrl.signal
|
|
7152
7158
|
}
|
|
7153
7159
|
);
|
|
7154
|
-
setExportProgress(
|
|
7160
|
+
setExportProgress(chunkHHQRYCLW_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7155
7161
|
setExportStatusMessage("Building PDF...");
|
|
7156
7162
|
await new Promise((r) => {
|
|
7157
7163
|
setTimeout(r, 100);
|
|
7158
7164
|
});
|
|
7159
|
-
setExportProgress(
|
|
7165
|
+
setExportProgress(chunkHHQRYCLW_js.EXPORT_DONE_PERCENT);
|
|
7160
7166
|
setExportStatusMessage("Done!");
|
|
7161
7167
|
} catch (err) {
|
|
7162
|
-
if (!
|
|
7168
|
+
if (!chunkHHQRYCLW_js.isExportAbortError(err)) {
|
|
7163
7169
|
console.error("[PowerPointViewer] Notes PDF export failed:", err);
|
|
7164
7170
|
}
|
|
7165
7171
|
} finally {
|
|
@@ -7200,22 +7206,22 @@ function useExportHandlers(input) {
|
|
|
7200
7206
|
scale: 1,
|
|
7201
7207
|
slideDurationMs: 3e3,
|
|
7202
7208
|
onProgress: (current, total) => {
|
|
7203
|
-
setExportProgress(
|
|
7204
|
-
setExportStatusMessage(
|
|
7209
|
+
setExportProgress(chunkHHQRYCLW_js.slideProgressPercent(current, total, 45));
|
|
7210
|
+
setExportStatusMessage(chunkHHQRYCLW_js.slideStatusLabel("Capturing", current, total));
|
|
7205
7211
|
},
|
|
7206
7212
|
onRecordProgress: (current, total) => {
|
|
7207
|
-
setExportProgress(
|
|
7208
|
-
setExportStatusMessage(
|
|
7213
|
+
setExportProgress(chunkHHQRYCLW_js.recordProgressPercent(current, total));
|
|
7214
|
+
setExportStatusMessage(chunkHHQRYCLW_js.slideStatusLabel("Recording", current, total));
|
|
7209
7215
|
},
|
|
7210
7216
|
signal: abortCtrl.signal
|
|
7211
7217
|
}
|
|
7212
7218
|
);
|
|
7213
|
-
setExportProgress(
|
|
7219
|
+
setExportProgress(chunkHHQRYCLW_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7214
7220
|
setExportStatusMessage("Saving file...");
|
|
7215
7221
|
downloadBlob2(blob, "presentation.webm");
|
|
7216
|
-
setExportProgress(
|
|
7222
|
+
setExportProgress(chunkHHQRYCLW_js.EXPORT_DONE_PERCENT);
|
|
7217
7223
|
} catch (err) {
|
|
7218
|
-
if (!
|
|
7224
|
+
if (!chunkHHQRYCLW_js.isExportAbortError(err)) {
|
|
7219
7225
|
console.error("[PowerPointViewer] Video export failed:", err);
|
|
7220
7226
|
}
|
|
7221
7227
|
} finally {
|
|
@@ -7243,18 +7249,18 @@ function useExportHandlers(input) {
|
|
|
7243
7249
|
scale: 0.5,
|
|
7244
7250
|
slideDurationMs: 2e3,
|
|
7245
7251
|
onProgress: (current, total) => {
|
|
7246
|
-
setExportProgress(
|
|
7247
|
-
setExportStatusMessage(
|
|
7252
|
+
setExportProgress(chunkHHQRYCLW_js.slideProgressPercent(current, total));
|
|
7253
|
+
setExportStatusMessage(chunkHHQRYCLW_js.slideStatusLabel("Encoding", current, total));
|
|
7248
7254
|
},
|
|
7249
7255
|
signal: abortCtrl.signal
|
|
7250
7256
|
}
|
|
7251
7257
|
);
|
|
7252
|
-
setExportProgress(
|
|
7258
|
+
setExportProgress(chunkHHQRYCLW_js.EXPORT_ASSEMBLING_PERCENT);
|
|
7253
7259
|
setExportStatusMessage("Saving file...");
|
|
7254
7260
|
downloadBlob2(blob, "presentation.gif");
|
|
7255
|
-
setExportProgress(
|
|
7261
|
+
setExportProgress(chunkHHQRYCLW_js.EXPORT_DONE_PERCENT);
|
|
7256
7262
|
} catch (err) {
|
|
7257
|
-
if (!
|
|
7263
|
+
if (!chunkHHQRYCLW_js.isExportAbortError(err)) {
|
|
7258
7264
|
console.error("[PowerPointViewer] GIF export failed:", err);
|
|
7259
7265
|
}
|
|
7260
7266
|
} finally {
|
|
@@ -7294,7 +7300,7 @@ function openPrintWindow(title, bodyHtml, orientation, colorFilter, frameSlides)
|
|
|
7294
7300
|
}
|
|
7295
7301
|
printWindow.document.open();
|
|
7296
7302
|
printWindow.document.write(
|
|
7297
|
-
|
|
7303
|
+
chunkHHQRYCLW_js.buildPrintHtmlDocument({ title, bodyHtml, orientation, colorFilter, frameSlides })
|
|
7298
7304
|
);
|
|
7299
7305
|
printWindow.document.close();
|
|
7300
7306
|
printWindow.focus();
|
|
@@ -7355,7 +7361,7 @@ function usePrintHandlers(input) {
|
|
|
7355
7361
|
if (svgs.length === 0) {
|
|
7356
7362
|
return;
|
|
7357
7363
|
}
|
|
7358
|
-
const printDoc =
|
|
7364
|
+
const printDoc = chunkHHQRYCLW_js.buildPrintDocument(svgs, pptxData.width, pptxData.height, {
|
|
7359
7365
|
title: "Slides (Vector)",
|
|
7360
7366
|
orientation: settings.orientation,
|
|
7361
7367
|
colorFilter
|
|
@@ -7391,7 +7397,7 @@ function usePrintHandlers(input) {
|
|
|
7391
7397
|
if (settings.printWhat === "outline") {
|
|
7392
7398
|
openPrintWindow(
|
|
7393
7399
|
"Outline",
|
|
7394
|
-
`<div class="outline-page">${
|
|
7400
|
+
`<div class="outline-page">${chunkHHQRYCLW_js.buildOutlineHtml(slideIndices, slides)}</div>`,
|
|
7395
7401
|
settings.orientation,
|
|
7396
7402
|
colorFilter,
|
|
7397
7403
|
settings.frameSlides
|
|
@@ -7416,7 +7422,7 @@ function usePrintHandlers(input) {
|
|
|
7416
7422
|
if (settings.printWhat === "slides") {
|
|
7417
7423
|
openPrintWindow(
|
|
7418
7424
|
"Slides",
|
|
7419
|
-
|
|
7425
|
+
chunkHHQRYCLW_js.buildSlidesHtml(slideImages, slideIndices),
|
|
7420
7426
|
settings.orientation,
|
|
7421
7427
|
colorFilter,
|
|
7422
7428
|
settings.frameSlides
|
|
@@ -7426,7 +7432,7 @@ function usePrintHandlers(input) {
|
|
|
7426
7432
|
if (settings.printWhat === "notes") {
|
|
7427
7433
|
openPrintWindow(
|
|
7428
7434
|
"Notes Pages",
|
|
7429
|
-
|
|
7435
|
+
chunkHHQRYCLW_js.buildNotesHtml(slideImages, slideIndices, slides),
|
|
7430
7436
|
"portrait",
|
|
7431
7437
|
colorFilter,
|
|
7432
7438
|
settings.frameSlides
|
|
@@ -7437,7 +7443,7 @@ function usePrintHandlers(input) {
|
|
|
7437
7443
|
const spp = settings.slidesPerPage;
|
|
7438
7444
|
openPrintWindow(
|
|
7439
7445
|
`Handout ${spp} per page`,
|
|
7440
|
-
|
|
7446
|
+
chunkHHQRYCLW_js.buildHandoutsHtml(slideImages, slideIndices, spp),
|
|
7441
7447
|
"portrait",
|
|
7442
7448
|
colorFilter,
|
|
7443
7449
|
settings.frameSlides
|
|
@@ -7501,8 +7507,8 @@ function useThemeHandlers(input) {
|
|
|
7501
7507
|
return;
|
|
7502
7508
|
}
|
|
7503
7509
|
await handler.updateThemeColorScheme(colorScheme);
|
|
7504
|
-
const previousMap = theme?.colorScheme ?
|
|
7505
|
-
setSlides((prev) =>
|
|
7510
|
+
const previousMap = theme?.colorScheme ? chunkHHQRYCLW_js.buildThemeColorMap(theme.colorScheme) : {};
|
|
7511
|
+
setSlides((prev) => chunkHHQRYCLW_js.reResolveSlideColors(prev, previousMap, colorScheme));
|
|
7506
7512
|
setTheme((prev) => prev ? { ...prev, colorScheme } : { colorScheme });
|
|
7507
7513
|
bumpHistory();
|
|
7508
7514
|
history.markDirty();
|
|
@@ -7607,7 +7613,7 @@ function useThemeSwitching(input) {
|
|
|
7607
7613
|
}
|
|
7608
7614
|
try {
|
|
7609
7615
|
await handler.applyTheme(preset.colorScheme, preset.fontScheme, preset.name);
|
|
7610
|
-
const newData =
|
|
7616
|
+
const newData = chunkHHQRYCLW_js.applyThemeToData(data, preset.colorScheme, preset.fontScheme, preset.name);
|
|
7611
7617
|
onDataChange(newData);
|
|
7612
7618
|
onThemeChanged?.(preset);
|
|
7613
7619
|
} catch (error) {
|
|
@@ -7624,7 +7630,7 @@ function useThemeSwitching(input) {
|
|
|
7624
7630
|
}
|
|
7625
7631
|
try {
|
|
7626
7632
|
await handler.applyTheme(colorScheme, fontScheme ?? {}, themeName);
|
|
7627
|
-
const newData =
|
|
7633
|
+
const newData = chunkHHQRYCLW_js.applyThemeToData(data, colorScheme, fontScheme, themeName);
|
|
7628
7634
|
onDataChange(newData);
|
|
7629
7635
|
} catch (error) {
|
|
7630
7636
|
console.error("Failed to switch to custom theme:", error);
|
|
@@ -7636,12 +7642,12 @@ function useThemeSwitching(input) {
|
|
|
7636
7642
|
if (!data?.theme?.colorScheme) {
|
|
7637
7643
|
return void 0;
|
|
7638
7644
|
}
|
|
7639
|
-
return
|
|
7640
|
-
(p) =>
|
|
7645
|
+
return chunkHHQRYCLW_js.THEME_PRESETS.find(
|
|
7646
|
+
(p) => chunkHHQRYCLW_js.themeColorSchemesEqual(data.theme?.colorScheme, p.colorScheme)
|
|
7641
7647
|
);
|
|
7642
7648
|
}, [data?.theme?.colorScheme]);
|
|
7643
7649
|
return {
|
|
7644
|
-
presets:
|
|
7650
|
+
presets: chunkHHQRYCLW_js.THEME_PRESETS,
|
|
7645
7651
|
switchToPreset,
|
|
7646
7652
|
switchToCustom,
|
|
7647
7653
|
currentPreset
|
|
@@ -7716,7 +7722,7 @@ function usePropertyHandlers(input) {
|
|
|
7716
7722
|
}
|
|
7717
7723
|
try {
|
|
7718
7724
|
const ab = await file.arrayBuffer();
|
|
7719
|
-
const h = new
|
|
7725
|
+
const h = new chunkHHQRYCLW_js.PptxHandler();
|
|
7720
7726
|
const other = await h.load(ab);
|
|
7721
7727
|
if (!other) {
|
|
7722
7728
|
return;
|
|
@@ -7726,7 +7732,7 @@ function usePropertyHandlers(input) {
|
|
|
7726
7732
|
width: canvasSize.width,
|
|
7727
7733
|
height: canvasSize.height
|
|
7728
7734
|
};
|
|
7729
|
-
setCompareResult(
|
|
7735
|
+
setCompareResult(chunkHHQRYCLW_js.comparePresentation(cur, other));
|
|
7730
7736
|
setIsComparePanelOpen(true);
|
|
7731
7737
|
} catch (err) {
|
|
7732
7738
|
console.warn("Compare failed:", err);
|
|
@@ -7743,7 +7749,7 @@ function usePropertyHandlers(input) {
|
|
|
7743
7749
|
if (!diff || diff.status === "unchanged") {
|
|
7744
7750
|
return;
|
|
7745
7751
|
}
|
|
7746
|
-
setSlides((prev) =>
|
|
7752
|
+
setSlides((prev) => chunkHHQRYCLW_js.applyAcceptSlide(prev, diff));
|
|
7747
7753
|
setIsDirty(true);
|
|
7748
7754
|
},
|
|
7749
7755
|
[compareResult, setSlides, setIsDirty]
|
|
@@ -7754,10 +7760,10 @@ function usePropertyHandlers(input) {
|
|
|
7754
7760
|
if (!compareResult) {
|
|
7755
7761
|
return;
|
|
7756
7762
|
}
|
|
7757
|
-
setSlides((prev) =>
|
|
7763
|
+
setSlides((prev) => chunkHHQRYCLW_js.applyAcceptAllSlides(prev, compareResult));
|
|
7758
7764
|
setIsDirty(true);
|
|
7759
7765
|
}, [compareResult, setSlides, setIsDirty]);
|
|
7760
|
-
const usedFontFamilies = react.useMemo(() =>
|
|
7766
|
+
const usedFontFamilies = react.useMemo(() => chunkHHQRYCLW_js.collectUsedFonts(slides), [slides]);
|
|
7761
7767
|
return {
|
|
7762
7768
|
handleUpdateNotes,
|
|
7763
7769
|
handleUpdateSlide,
|
|
@@ -7876,7 +7882,7 @@ function useIsMobile(input) {
|
|
|
7876
7882
|
const containerRef = input?.containerRef;
|
|
7877
7883
|
const isTouchDevice = react.useSyncExternalStore(
|
|
7878
7884
|
subscribeTouchCapability,
|
|
7879
|
-
|
|
7885
|
+
chunkHHQRYCLW_js.detectTouchDevice,
|
|
7880
7886
|
() => false
|
|
7881
7887
|
// server snapshot
|
|
7882
7888
|
);
|
|
@@ -7892,7 +7898,7 @@ function useIsMobile(input) {
|
|
|
7892
7898
|
}
|
|
7893
7899
|
return containerRef?.current?.clientHeight ?? window.innerHeight;
|
|
7894
7900
|
});
|
|
7895
|
-
const [orientation, setOrientation] = react.useState(
|
|
7901
|
+
const [orientation, setOrientation] = react.useState(chunkHHQRYCLW_js.detectOrientation);
|
|
7896
7902
|
const [isVirtualKeyboardOpen, setIsVirtualKeyboardOpen] = react.useState(false);
|
|
7897
7903
|
const [initialViewportHeight] = react.useState(
|
|
7898
7904
|
() => typeof window !== "undefined" ? window.innerHeight : 800
|
|
@@ -7936,7 +7942,7 @@ function useIsMobile(input) {
|
|
|
7936
7942
|
return;
|
|
7937
7943
|
}
|
|
7938
7944
|
const handleOrientationChange = () => {
|
|
7939
|
-
setOrientation(
|
|
7945
|
+
setOrientation(chunkHHQRYCLW_js.detectOrientation());
|
|
7940
7946
|
};
|
|
7941
7947
|
if (screen.orientation) {
|
|
7942
7948
|
screen.orientation.addEventListener("change", handleOrientationChange);
|
|
@@ -7966,9 +7972,9 @@ function useIsMobile(input) {
|
|
|
7966
7972
|
window.addEventListener("resize", handleResize);
|
|
7967
7973
|
return () => window.removeEventListener("resize", handleResize);
|
|
7968
7974
|
}, [isTouchDevice, initialViewportHeight]);
|
|
7969
|
-
const isMobile =
|
|
7970
|
-
const isTablet = !isMobile && containerWidth >=
|
|
7971
|
-
const isDesktop = !isMobile && containerWidth >=
|
|
7975
|
+
const isMobile = chunkHHQRYCLW_js.isMobileViewport(containerWidth, containerHeight, isTouchDevice);
|
|
7976
|
+
const isTablet = !isMobile && containerWidth >= chunkHHQRYCLW_js.MOBILE_BREAKPOINT && containerWidth < chunkHHQRYCLW_js.TABLET_BREAKPOINT;
|
|
7977
|
+
const isDesktop = !isMobile && containerWidth >= chunkHHQRYCLW_js.TABLET_BREAKPOINT;
|
|
7972
7978
|
return {
|
|
7973
7979
|
isMobile,
|
|
7974
7980
|
isTablet,
|
|
@@ -8029,11 +8035,11 @@ function useViewerDialogs(input) {
|
|
|
8029
8035
|
);
|
|
8030
8036
|
const [embedFontsEnabled, setEmbedFontsEnabled] = react.useState(false);
|
|
8031
8037
|
const [isNarrowViewport, setIsNarrowViewport] = react.useState(
|
|
8032
|
-
() => typeof window !== "undefined" ?
|
|
8038
|
+
() => typeof window !== "undefined" ? chunkHHQRYCLW_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch()) : false
|
|
8033
8039
|
);
|
|
8034
8040
|
react.useEffect(() => {
|
|
8035
8041
|
const handleWindow = () => setIsNarrowViewport(
|
|
8036
|
-
|
|
8042
|
+
chunkHHQRYCLW_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch())
|
|
8037
8043
|
);
|
|
8038
8044
|
let observer = null;
|
|
8039
8045
|
let raf = 0;
|
|
@@ -8047,12 +8053,12 @@ function useViewerDialogs(input) {
|
|
|
8047
8053
|
const entry = entries[0];
|
|
8048
8054
|
if (entry) {
|
|
8049
8055
|
setIsNarrowViewport(
|
|
8050
|
-
|
|
8056
|
+
chunkHHQRYCLW_js.isMobileViewport(entry.contentRect.width, entry.contentRect.height, viewportIsTouch())
|
|
8051
8057
|
);
|
|
8052
8058
|
}
|
|
8053
8059
|
});
|
|
8054
8060
|
observer.observe(el);
|
|
8055
|
-
setIsNarrowViewport(
|
|
8061
|
+
setIsNarrowViewport(chunkHHQRYCLW_js.isMobileViewport(el.clientWidth, el.clientHeight, viewportIsTouch()));
|
|
8056
8062
|
};
|
|
8057
8063
|
attach();
|
|
8058
8064
|
window.addEventListener("resize", handleWindow);
|
|
@@ -8210,12 +8216,12 @@ function useViewerDialogs(input) {
|
|
|
8210
8216
|
}
|
|
8211
8217
|
function computeGridSpacingPx(presentationGridSpacing) {
|
|
8212
8218
|
if (presentationGridSpacing) {
|
|
8213
|
-
const px = Math.round(presentationGridSpacing.cx /
|
|
8219
|
+
const px = Math.round(presentationGridSpacing.cx / chunk5ZI2ZG5E_js.EMU_PER_PX);
|
|
8214
8220
|
if (px > 0) {
|
|
8215
8221
|
return px;
|
|
8216
8222
|
}
|
|
8217
8223
|
}
|
|
8218
|
-
return
|
|
8224
|
+
return chunk5ZI2ZG5E_js.GRID_SIZE;
|
|
8219
8225
|
}
|
|
8220
8226
|
function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows) {
|
|
8221
8227
|
if (activeCustomShowId) {
|
|
@@ -8229,8 +8235,8 @@ function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows) {
|
|
|
8229
8235
|
return slides.map((_, i) => i).filter((i) => !slides[i]?.hidden);
|
|
8230
8236
|
}
|
|
8231
8237
|
function computeSlideSectionGroups(slides, sections) {
|
|
8232
|
-
return
|
|
8233
|
-
id: group.section?.id ?? (sections.length > 0 ?
|
|
8238
|
+
return chunkHHQRYCLW_js.groupSlidesBySection(sections, slides).map((group) => ({
|
|
8239
|
+
id: group.section?.id ?? (sections.length > 0 ? chunk5ZI2ZG5E_js.UNGROUPED_SECTION_ID : "default"),
|
|
8234
8240
|
label: group.section?.name ?? (sections.length > 0 ? "Ungrouped Slides" : "Slides"),
|
|
8235
8241
|
slideIndexes: group.slideIndexes,
|
|
8236
8242
|
...group.section?.color !== void 0 ? { color: group.section.color } : {},
|
|
@@ -8285,7 +8291,7 @@ function useDerivedSlideState(input) {
|
|
|
8285
8291
|
);
|
|
8286
8292
|
const slideSectionGroups = react.useMemo(
|
|
8287
8293
|
() => computeSlideSectionGroups(slides, sections).map((group) => {
|
|
8288
|
-
if (group.id ===
|
|
8294
|
+
if (group.id === chunk5ZI2ZG5E_js.UNGROUPED_SECTION_ID && group.label === "Ungrouped Slides") {
|
|
8289
8295
|
return { ...group, label: t("pptx.slides.ungroupedSlides") };
|
|
8290
8296
|
}
|
|
8291
8297
|
if (group.id === "default" && group.label === "Slides") {
|
|
@@ -8388,13 +8394,13 @@ function useAnnotationHandlers(input) {
|
|
|
8388
8394
|
}, [annotations, setMode, setSlides, history]);
|
|
8389
8395
|
const handleSetMode = react.useCallback(
|
|
8390
8396
|
(nextMode) => {
|
|
8391
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8397
|
+
if (mode === "present" && nextMode !== "present" && !chunkHHQRYCLW_js.mayLeaveSlideShow()) {
|
|
8392
8398
|
return;
|
|
8393
8399
|
}
|
|
8394
8400
|
if (nextMode === "present") {
|
|
8395
8401
|
presentation.enterPresentMode();
|
|
8396
8402
|
} else if (mode === "present" && annotations.hasAnyAnnotations) {
|
|
8397
|
-
|
|
8403
|
+
chunk5ZI2ZG5E_js.stopAllPersistentAudio();
|
|
8398
8404
|
pendingModeAfterAnnotationsRef.current = nextMode;
|
|
8399
8405
|
if (promptKeepInkAnnotations) {
|
|
8400
8406
|
setShowKeepAnnotationsDialog(true);
|
|
@@ -8403,7 +8409,7 @@ function useAnnotationHandlers(input) {
|
|
|
8403
8409
|
}
|
|
8404
8410
|
} else {
|
|
8405
8411
|
if (mode === "present") {
|
|
8406
|
-
|
|
8412
|
+
chunk5ZI2ZG5E_js.stopAllPersistentAudio();
|
|
8407
8413
|
}
|
|
8408
8414
|
setMode(nextMode);
|
|
8409
8415
|
}
|
|
@@ -8469,13 +8475,13 @@ function useSerialize(input) {
|
|
|
8469
8475
|
let processedSlide = slide;
|
|
8470
8476
|
if (pendingEditId) {
|
|
8471
8477
|
const updatedElements = slide.elements.map((el) => {
|
|
8472
|
-
if (el.id !== pendingEditId || !
|
|
8478
|
+
if (el.id !== pendingEditId || !chunkHHQRYCLW_js.hasTextProperties(el)) {
|
|
8473
8479
|
return el;
|
|
8474
8480
|
}
|
|
8475
8481
|
return {
|
|
8476
8482
|
...el,
|
|
8477
8483
|
text: pendingEditText,
|
|
8478
|
-
textSegments:
|
|
8484
|
+
textSegments: chunkHHQRYCLW_js.remapTextToSegments(pendingEditText, el.textSegments, el.textStyle)
|
|
8479
8485
|
};
|
|
8480
8486
|
});
|
|
8481
8487
|
if (updatedElements.some((el, i) => el !== slide.elements[i])) {
|
|
@@ -8488,14 +8494,14 @@ function useSerialize(input) {
|
|
|
8488
8494
|
const pptxGuides = guides.map((g) => ({
|
|
8489
8495
|
id: g.id,
|
|
8490
8496
|
orientation: g.axis === "h" ? "horz" : "vert",
|
|
8491
|
-
positionEmu:
|
|
8497
|
+
positionEmu: chunkHHQRYCLW_js.guidePxToEmu(g.position)
|
|
8492
8498
|
}));
|
|
8493
8499
|
return {
|
|
8494
8500
|
...processedSlide,
|
|
8495
8501
|
guides: pptxGuides.length > 0 ? pptxGuides : void 0
|
|
8496
8502
|
};
|
|
8497
8503
|
});
|
|
8498
|
-
const slidesToSave =
|
|
8504
|
+
const slidesToSave = chunk5ZI2ZG5E_js.buildSaveSlides(slidesWithGuides, templateElementsBySlideId);
|
|
8499
8505
|
const saveOptions = {
|
|
8500
8506
|
headerFooter,
|
|
8501
8507
|
presentationProperties,
|
|
@@ -8664,7 +8670,7 @@ function usePresentationSetup(input) {
|
|
|
8664
8670
|
containerRef,
|
|
8665
8671
|
content,
|
|
8666
8672
|
onSetMode: (nextMode) => {
|
|
8667
|
-
if (mode === "present" && nextMode !== "present" && !
|
|
8673
|
+
if (mode === "present" && nextMode !== "present" && !chunkHHQRYCLW_js.mayLeaveSlideShow()) {
|
|
8668
8674
|
return;
|
|
8669
8675
|
}
|
|
8670
8676
|
if (mode === "present" && nextMode !== "present" && annotations.hasAnyAnnotations && promptKeepInkAnnotations) {
|
|
@@ -8672,7 +8678,7 @@ function usePresentationSetup(input) {
|
|
|
8672
8678
|
setShowKeepAnnotationsDialog(true);
|
|
8673
8679
|
} else {
|
|
8674
8680
|
if (mode === "present" && nextMode !== "present") {
|
|
8675
|
-
|
|
8681
|
+
chunk5ZI2ZG5E_js.stopAllPersistentAudio();
|
|
8676
8682
|
stopAnimationSound();
|
|
8677
8683
|
}
|
|
8678
8684
|
setMode(nextMode);
|
|
@@ -8726,10 +8732,10 @@ function usePresentationSetup(input) {
|
|
|
8726
8732
|
onToggleInkMarkup: () => annotations.setInkMarkupVisible(!annotations.inkMarkupVisible),
|
|
8727
8733
|
onToggleToolbar: () => annotations.setToolbarVisible(!annotations.toolbarVisible),
|
|
8728
8734
|
onSaveRehearsalTimings: (timings) => {
|
|
8729
|
-
setSlides((prev) =>
|
|
8735
|
+
setSlides((prev) => chunkHHQRYCLW_js.applyRehearsalTimings(prev, timings));
|
|
8730
8736
|
history.markDirty();
|
|
8731
8737
|
},
|
|
8732
|
-
loopContinuously:
|
|
8738
|
+
loopContinuously: chunkHHQRYCLW_js.shouldLoopContinuously(presentationProperties),
|
|
8733
8739
|
showWithAnimation: presentationProperties.showWithAnimation,
|
|
8734
8740
|
useTimings: presentationProperties.advanceMode !== "manual",
|
|
8735
8741
|
endWithBlackSlide
|
|
@@ -8891,7 +8897,7 @@ function useEditorOperations(input) {
|
|
|
8891
8897
|
const { formatPainterActive, setFormatPainterActive, elementLookup } = state;
|
|
8892
8898
|
react.useEffect(() => {
|
|
8893
8899
|
if (formatPainterActive && !prevFormatPainterRef.current && selectedElement) {
|
|
8894
|
-
copiedFormatRef.current =
|
|
8900
|
+
copiedFormatRef.current = chunkHHQRYCLW_js.copyFormatFromElement(selectedElement);
|
|
8895
8901
|
} else if (!formatPainterActive) {
|
|
8896
8902
|
copiedFormatRef.current = null;
|
|
8897
8903
|
}
|
|
@@ -8917,12 +8923,12 @@ function useEditorOperations(input) {
|
|
|
8917
8923
|
e.stopPropagation();
|
|
8918
8924
|
const element = elementLookup.get(elementId);
|
|
8919
8925
|
if (element) {
|
|
8920
|
-
const updated =
|
|
8926
|
+
const updated = chunkHHQRYCLW_js.applyFormatToElement(element, copiedFormatRef.current);
|
|
8921
8927
|
const updates = {};
|
|
8922
|
-
if (
|
|
8928
|
+
if (chunkHHQRYCLW_js.hasShapeProperties(updated)) {
|
|
8923
8929
|
updates.shapeStyle = updated.shapeStyle;
|
|
8924
8930
|
}
|
|
8925
|
-
if (
|
|
8931
|
+
if (chunkHHQRYCLW_js.hasTextProperties(updated)) {
|
|
8926
8932
|
updates.textStyle = updated.textStyle;
|
|
8927
8933
|
}
|
|
8928
8934
|
ops.updateElementById(elementId, updates);
|
|
@@ -9069,7 +9075,7 @@ function collectReferencedFontFamilies(slides) {
|
|
|
9069
9075
|
const families = /* @__PURE__ */ new Set();
|
|
9070
9076
|
for (const slide of slides) {
|
|
9071
9077
|
for (const el of slide.elements) {
|
|
9072
|
-
if (
|
|
9078
|
+
if (chunkHHQRYCLW_js.hasTextProperties(el) && el.textSegments) {
|
|
9073
9079
|
for (const seg of el.textSegments) {
|
|
9074
9080
|
if (seg.style.fontFamily) {
|
|
9075
9081
|
families.add(seg.style.fontFamily);
|
|
@@ -9638,7 +9644,7 @@ function useViewerIntegration(input) {
|
|
|
9638
9644
|
return zoom.scale;
|
|
9639
9645
|
},
|
|
9640
9646
|
setZoom(level) {
|
|
9641
|
-
zoom.setScale(Math.min(Math.max(level,
|
|
9647
|
+
zoom.setScale(Math.min(Math.max(level, chunk5ZI2ZG5E_js.MIN_ZOOM_SCALE), chunk5ZI2ZG5E_js.MAX_ZOOM_SCALE));
|
|
9642
9648
|
},
|
|
9643
9649
|
zoomIn() {
|
|
9644
9650
|
zoom.handleZoomIn();
|
|
@@ -9853,7 +9859,7 @@ function useReducedMotion() {
|
|
|
9853
9859
|
}
|
|
9854
9860
|
function useViewerOptions() {
|
|
9855
9861
|
const storeRef = react.useRef(null);
|
|
9856
|
-
storeRef.current ??=
|
|
9862
|
+
storeRef.current ??= chunkHHQRYCLW_js.createViewerOptionsStore();
|
|
9857
9863
|
const store = storeRef.current;
|
|
9858
9864
|
const options = react.useSyncExternalStore(
|
|
9859
9865
|
(onStoreChange) => store.subscribe(onStoreChange),
|
|
@@ -9862,9 +9868,9 @@ function useViewerOptions() {
|
|
|
9862
9868
|
);
|
|
9863
9869
|
return { optionsStore: store, options };
|
|
9864
9870
|
}
|
|
9865
|
-
var KNOWN_TAB_IDS = new Set(
|
|
9871
|
+
var KNOWN_TAB_IDS = new Set(chunkHHQRYCLW_js.TOOLBAR_TABS.map((tab) => tab.id));
|
|
9866
9872
|
function computeToolbarVisibility(hiddenActions) {
|
|
9867
|
-
const isHidden = (id) =>
|
|
9873
|
+
const isHidden = (id) => chunkHHQRYCLW_js.isActionHidden(id, hiddenActions);
|
|
9868
9874
|
const isTabVisible = (id) => !KNOWN_TAB_IDS.has(id) || !isHidden(id);
|
|
9869
9875
|
return { isHidden, isTabVisible };
|
|
9870
9876
|
}
|
|
@@ -9949,12 +9955,12 @@ function useYjsDocumentSync({
|
|
|
9949
9955
|
return;
|
|
9950
9956
|
}
|
|
9951
9957
|
try {
|
|
9952
|
-
const handler = new
|
|
9958
|
+
const handler = new chunkHHQRYCLW_js.PptxHandler();
|
|
9953
9959
|
await handler.load(sourceBytes.buffer);
|
|
9954
|
-
const currentSlides =
|
|
9960
|
+
const currentSlides = chunkHHQRYCLW_js.readSlidesFromYDoc(
|
|
9955
9961
|
doc
|
|
9956
9962
|
);
|
|
9957
|
-
const slidesToSave =
|
|
9963
|
+
const slidesToSave = chunk5ZI2ZG5E_js.buildSaveSlides(currentSlides, templateElementsBySlideId);
|
|
9958
9964
|
const bytes = await handler.save(slidesToSave);
|
|
9959
9965
|
config.onWriteBack(bytes);
|
|
9960
9966
|
} catch {
|
|
@@ -9969,7 +9975,7 @@ function useYjsDocumentSync({
|
|
|
9969
9975
|
if (!doc || !isConnected) {
|
|
9970
9976
|
return;
|
|
9971
9977
|
}
|
|
9972
|
-
const docSlides =
|
|
9978
|
+
const docSlides = chunkHHQRYCLW_js.readSlidesFromYDoc(
|
|
9973
9979
|
doc
|
|
9974
9980
|
);
|
|
9975
9981
|
if (docSlides.length === 0) {
|
|
@@ -9991,11 +9997,11 @@ function useYjsDocumentSync({
|
|
|
9991
9997
|
lastSyncedRef.current = serialized;
|
|
9992
9998
|
void (async () => {
|
|
9993
9999
|
const factories = await getFactories();
|
|
9994
|
-
|
|
10000
|
+
chunkHHQRYCLW_js.reconcileSlidesInYDoc(
|
|
9995
10001
|
slides,
|
|
9996
10002
|
doc,
|
|
9997
10003
|
factories,
|
|
9998
|
-
|
|
10004
|
+
chunkHHQRYCLW_js.LOCAL_SYNC_ORIGIN
|
|
9999
10005
|
);
|
|
10000
10006
|
scheduleWriteBack();
|
|
10001
10007
|
})();
|
|
@@ -10009,10 +10015,10 @@ function useYjsDocumentSync({
|
|
|
10009
10015
|
return;
|
|
10010
10016
|
}
|
|
10011
10017
|
const handleChange = (_events, transaction) => {
|
|
10012
|
-
if (transaction?.origin ===
|
|
10018
|
+
if (transaction?.origin === chunkHHQRYCLW_js.LOCAL_SYNC_ORIGIN) {
|
|
10013
10019
|
return;
|
|
10014
10020
|
}
|
|
10015
|
-
const remoteSlides =
|
|
10021
|
+
const remoteSlides = chunkHHQRYCLW_js.readSlidesFromYDoc(
|
|
10016
10022
|
doc
|
|
10017
10023
|
);
|
|
10018
10024
|
if (remoteSlides.length === 0) {
|
|
@@ -10028,7 +10034,7 @@ function useYjsDocumentSync({
|
|
|
10028
10034
|
isApplyingRemoteRef.current = false;
|
|
10029
10035
|
scheduleWriteBack();
|
|
10030
10036
|
};
|
|
10031
|
-
const unobserve =
|
|
10037
|
+
const unobserve = chunkHHQRYCLW_js.observeYDocSlides(
|
|
10032
10038
|
doc,
|
|
10033
10039
|
handleChange
|
|
10034
10040
|
);
|
|
@@ -10066,7 +10072,7 @@ function useBroadcastFollower({
|
|
|
10066
10072
|
if (!broadcaster) {
|
|
10067
10073
|
return;
|
|
10068
10074
|
}
|
|
10069
|
-
if (!
|
|
10075
|
+
if (!chunkHHQRYCLW_js.shouldAutoFollowBroadcaster({
|
|
10070
10076
|
localRole: collab.config.role,
|
|
10071
10077
|
broadcasterRole: broadcaster.role
|
|
10072
10078
|
})) {
|
|
@@ -10226,10 +10232,10 @@ function useTouchGestures(input) {
|
|
|
10226
10232
|
if (!el || !enabled) {
|
|
10227
10233
|
return;
|
|
10228
10234
|
}
|
|
10229
|
-
const recognizer =
|
|
10235
|
+
const recognizer = chunkHHQRYCLW_js.createTouchGestureRecognizer({
|
|
10230
10236
|
getScale: () => scaleRef.current,
|
|
10231
|
-
minScale:
|
|
10232
|
-
maxScale:
|
|
10237
|
+
minScale: chunk5ZI2ZG5E_js.MIN_ZOOM_SCALE,
|
|
10238
|
+
maxScale: chunk5ZI2ZG5E_js.MAX_ZOOM_SCALE,
|
|
10233
10239
|
callbacks: {
|
|
10234
10240
|
onPinchZoom: (newScale) => callbacksRef.current.onPinchZoom?.(newScale),
|
|
10235
10241
|
onSwipe: (direction) => callbacksRef.current.onSwipe?.(direction),
|
|
@@ -10269,7 +10275,7 @@ function scrollFocusedIntoView(keyboardInset) {
|
|
|
10269
10275
|
return;
|
|
10270
10276
|
}
|
|
10271
10277
|
const rect = active.getBoundingClientRect();
|
|
10272
|
-
const delta =
|
|
10278
|
+
const delta = chunkHHQRYCLW_js.computeScrollDelta(
|
|
10273
10279
|
{ top: rect.top, bottom: rect.bottom },
|
|
10274
10280
|
window.innerHeight,
|
|
10275
10281
|
keyboardInset
|
|
@@ -10289,8 +10295,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10289
10295
|
return;
|
|
10290
10296
|
}
|
|
10291
10297
|
const update = () => {
|
|
10292
|
-
const metrics =
|
|
10293
|
-
const inset = metrics ?
|
|
10298
|
+
const metrics = chunkHHQRYCLW_js.readViewportMetrics(window);
|
|
10299
|
+
const inset = metrics ? chunkHHQRYCLW_js.computeKeyboardInset(metrics) : 0;
|
|
10294
10300
|
setKeyboardInset(inset);
|
|
10295
10301
|
if (inset > 0) {
|
|
10296
10302
|
window.requestAnimationFrame(() => scrollFocusedIntoView(inset));
|
|
@@ -10301,8 +10307,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10301
10307
|
vv.addEventListener("scroll", update);
|
|
10302
10308
|
const onFocusIn = () => {
|
|
10303
10309
|
window.requestAnimationFrame(() => {
|
|
10304
|
-
const metrics =
|
|
10305
|
-
const inset = metrics ?
|
|
10310
|
+
const metrics = chunkHHQRYCLW_js.readViewportMetrics(window);
|
|
10311
|
+
const inset = metrics ? chunkHHQRYCLW_js.computeKeyboardInset(metrics) : 0;
|
|
10306
10312
|
if (inset > 0) {
|
|
10307
10313
|
scrollFocusedIntoView(inset);
|
|
10308
10314
|
}
|
|
@@ -10315,7 +10321,7 @@ function useKeyboardInsets(enabled = true) {
|
|
|
10315
10321
|
document.removeEventListener("focusin", onFocusIn);
|
|
10316
10322
|
};
|
|
10317
10323
|
}, [enabled]);
|
|
10318
|
-
return { keyboardInset, isKeyboardOpen:
|
|
10324
|
+
return { keyboardInset, isKeyboardOpen: chunkHHQRYCLW_js.isKeyboardOpen(keyboardInset) };
|
|
10319
10325
|
}
|
|
10320
10326
|
|
|
10321
10327
|
// src/viewer/hooks/useViewerBuildingBlocks-canvas-props.ts
|
|
@@ -10370,13 +10376,13 @@ function buildCanvasProps(input) {
|
|
|
10370
10376
|
if (mode === "present") {
|
|
10371
10377
|
presentation.handlePresentationAction(action);
|
|
10372
10378
|
} else if (action.url) {
|
|
10373
|
-
|
|
10379
|
+
chunkHHQRYCLW_js.safeOpenUrl(action.url);
|
|
10374
10380
|
}
|
|
10375
10381
|
};
|
|
10376
10382
|
const handleHyperlinkClick = (url) => {
|
|
10377
|
-
if (
|
|
10383
|
+
if (chunkHHQRYCLW_js.isPpactionUrl(url)) {
|
|
10378
10384
|
if (mode === "present") {
|
|
10379
|
-
const parsed =
|
|
10385
|
+
const parsed = chunkHHQRYCLW_js.parsePpactionUrl(url);
|
|
10380
10386
|
if (parsed) {
|
|
10381
10387
|
presentation.handlePresentationAction({
|
|
10382
10388
|
action: parsed.action,
|
|
@@ -10386,7 +10392,7 @@ function buildCanvasProps(input) {
|
|
|
10386
10392
|
}
|
|
10387
10393
|
return;
|
|
10388
10394
|
}
|
|
10389
|
-
|
|
10395
|
+
chunkHHQRYCLW_js.safeOpenUrl(url);
|
|
10390
10396
|
};
|
|
10391
10397
|
return {
|
|
10392
10398
|
activeSlide: effectiveSlide,
|
|
@@ -10706,7 +10712,7 @@ function buildToolbarProps(input) {
|
|
|
10706
10712
|
onOpenFile,
|
|
10707
10713
|
onOpenRecentFile,
|
|
10708
10714
|
onCreatePresentation: (templateId) => {
|
|
10709
|
-
s.setSlides(
|
|
10715
|
+
s.setSlides(chunkHHQRYCLW_js.createBackstagePresentation(templateId));
|
|
10710
10716
|
s.setActiveSlideIndex(0);
|
|
10711
10717
|
s.setSelectedElementId(null);
|
|
10712
10718
|
s.setSelectedElementIds([]);
|
|
@@ -10761,7 +10767,7 @@ function buildToolbarProps(input) {
|
|
|
10761
10767
|
isCommentsPanelOpen: s.isInspectorPaneOpen,
|
|
10762
10768
|
slideCommentCount: activeSlide?.comments?.length ?? 0,
|
|
10763
10769
|
formatPainterActive: s.formatPainterActive,
|
|
10764
|
-
canActivateFormatPainter:
|
|
10770
|
+
canActivateFormatPainter: chunkHHQRYCLW_js.hasCopyableFormat(selectedElement),
|
|
10765
10771
|
onToggleFormatPainter: () => s.setFormatPainterActive((p) => !p),
|
|
10766
10772
|
isSelectionPaneOpen: s.isSelectionPaneOpen,
|
|
10767
10773
|
onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
|
|
@@ -11024,7 +11030,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
11024
11030
|
}, [incomingContent]);
|
|
11025
11031
|
const onOpenFile = react.useCallback(() => {
|
|
11026
11032
|
void (async () => {
|
|
11027
|
-
const picked = await
|
|
11033
|
+
const picked = await chunkHHQRYCLW_js.openPptxFile();
|
|
11028
11034
|
if (picked) {
|
|
11029
11035
|
setContent(picked.buffer);
|
|
11030
11036
|
}
|
|
@@ -11032,7 +11038,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
11032
11038
|
}, []);
|
|
11033
11039
|
const onOpenRecentFile = react.useCallback((key) => {
|
|
11034
11040
|
void (async () => {
|
|
11035
|
-
const bytes = await
|
|
11041
|
+
const bytes = await chunkHHQRYCLW_js.readBackstageRecentFile(key);
|
|
11036
11042
|
if (bytes) {
|
|
11037
11043
|
setContent(bytes);
|
|
11038
11044
|
}
|