pptx-react-viewer 1.24.1 → 1.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/{Model3DScene-RYR4SSOM.js → Model3DScene-G434BPF4.js} +2 -2
- package/dist/Model3DScene-G434BPF4.js.br +0 -0
- package/dist/Model3DScene-G434BPF4.js.gz +0 -0
- package/dist/{Model3DScene-E7YIHJ2R.mjs → Model3DScene-GGNUAOGD.mjs} +1 -1
- package/dist/Model3DScene-GGNUAOGD.mjs.br +0 -0
- package/dist/Model3DScene-GGNUAOGD.mjs.gz +0 -0
- package/dist/PowerPointViewer-CnADroqZ.d.ts.map +1 -1
- package/dist/{SurfaceChart3DScene-ZM3J67VQ.mjs → SurfaceChart3DScene-JU737NN5.mjs} +1 -1
- package/dist/SurfaceChart3DScene-JU737NN5.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-JU737NN5.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-PBSZVNAM.js → SurfaceChart3DScene-UFFJ3P6T.js} +2 -2
- package/dist/SurfaceChart3DScene-UFFJ3P6T.js.br +0 -0
- package/dist/SurfaceChart3DScene-UFFJ3P6T.js.gz +0 -0
- package/dist/{chunk-ZISXRMDJ.js → chunk-2EFVXYNA.js} +187 -1
- package/dist/chunk-2EFVXYNA.js.br +0 -0
- package/dist/{chunk-ZISXRMDJ.js.gz → chunk-2EFVXYNA.js.gz} +0 -0
- package/dist/{chunk-KVTSERRP.js → chunk-EM77GISR.js} +1667 -1029
- package/dist/chunk-EM77GISR.js.br +0 -0
- package/dist/chunk-EM77GISR.js.gz +0 -0
- package/dist/{chunk-DPTDFK2L.js → chunk-IHHK6WEQ.js} +520 -441
- package/dist/chunk-IHHK6WEQ.js.br +0 -0
- package/dist/chunk-IHHK6WEQ.js.gz +0 -0
- package/dist/{chunk-E3KJKCSV.mjs → chunk-M3SIFXWD.mjs} +187 -1
- package/dist/chunk-M3SIFXWD.mjs.br +0 -0
- package/dist/{chunk-E3KJKCSV.mjs.gz → chunk-M3SIFXWD.mjs.gz} +0 -0
- package/dist/{chunk-UDM2SYE3.mjs → chunk-NKSIDFYP.mjs} +964 -326
- package/dist/chunk-NKSIDFYP.mjs.br +0 -0
- package/dist/chunk-NKSIDFYP.mjs.gz +0 -0
- package/dist/{chunk-MEVZNYJK.mjs → chunk-QOBKJKLT.mjs} +859 -9
- package/dist/chunk-QOBKJKLT.mjs.br +0 -0
- package/dist/{chunk-MEVZNYJK.mjs.gz → chunk-QOBKJKLT.mjs.gz} +0 -0
- package/dist/{chunk-UCFXE6YS.mjs → chunk-VDALVGDT.mjs} +115 -37
- package/dist/chunk-VDALVGDT.mjs.br +0 -0
- package/dist/chunk-VDALVGDT.mjs.gz +0 -0
- package/dist/{chunk-275WERXZ.js → chunk-VKOVFVDJ.js} +874 -9
- package/dist/chunk-VKOVFVDJ.js.br +0 -0
- package/dist/{chunk-275WERXZ.js.gz → chunk-VKOVFVDJ.js.gz} +0 -0
- package/dist/hooks-unstable.d.ts +207 -2
- package/dist/hooks-unstable.d.ts.map +1 -1
- package/dist/hooks-unstable.js +81 -77
- package/dist/hooks-unstable.js.br +0 -0
- package/dist/hooks-unstable.js.gz +0 -0
- package/dist/hooks-unstable.mjs +3 -3
- package/dist/hooks-unstable.mjs.br +0 -0
- package/dist/hooks-unstable.mjs.gz +0 -0
- package/dist/i18n.js +4 -4
- package/dist/i18n.js.br +0 -0
- package/dist/i18n.js.gz +0 -0
- package/dist/i18n.mjs +1 -1
- package/dist/i18n.mjs.br +0 -0
- package/dist/i18n.mjs.gz +0 -0
- package/dist/{index-waNAYwmr.d.ts → index-DWvM1PBB.d.ts} +16 -1
- package/dist/index-DWvM1PBB.d.ts.map +1 -0
- package/dist/index.d.ts +146 -26
- package/dist/index.js +34 -34
- package/dist/index.js.br +0 -0
- package/dist/index.js.gz +0 -0
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.br +0 -0
- package/dist/index.mjs.gz +0 -0
- package/dist/pptx-viewer.css +1 -1
- package/dist/pptx-viewer.css.br +0 -0
- package/dist/pptx-viewer.css.gz +0 -0
- package/dist/viewer/index.js +20 -20
- package/dist/viewer/index.js.br +0 -0
- package/dist/viewer/index.js.gz +0 -0
- package/dist/viewer/index.mjs +4 -4
- package/dist/viewer/index.mjs.br +0 -0
- package/dist/viewer/index.mjs.gz +0 -0
- package/package.json +1 -1
- package/dist/Model3DScene-E7YIHJ2R.mjs.br +0 -0
- package/dist/Model3DScene-E7YIHJ2R.mjs.gz +0 -0
- package/dist/Model3DScene-RYR4SSOM.js.br +0 -0
- package/dist/Model3DScene-RYR4SSOM.js.gz +0 -0
- package/dist/SurfaceChart3DScene-PBSZVNAM.js.br +0 -0
- package/dist/SurfaceChart3DScene-PBSZVNAM.js.gz +0 -0
- package/dist/SurfaceChart3DScene-ZM3J67VQ.mjs.br +0 -0
- package/dist/SurfaceChart3DScene-ZM3J67VQ.mjs.gz +0 -0
- package/dist/chunk-275WERXZ.js.br +0 -0
- package/dist/chunk-DPTDFK2L.js.br +0 -0
- package/dist/chunk-DPTDFK2L.js.gz +0 -0
- package/dist/chunk-E3KJKCSV.mjs.br +0 -0
- package/dist/chunk-KVTSERRP.js.br +0 -0
- package/dist/chunk-KVTSERRP.js.gz +0 -0
- package/dist/chunk-MEVZNYJK.mjs.br +0 -0
- package/dist/chunk-UCFXE6YS.mjs.br +0 -0
- package/dist/chunk-UCFXE6YS.mjs.gz +0 -0
- package/dist/chunk-UDM2SYE3.mjs.br +0 -0
- package/dist/chunk-UDM2SYE3.mjs.gz +0 -0
- package/dist/chunk-ZISXRMDJ.js.br +0 -0
- package/dist/index-waNAYwmr.d.ts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkVKOVFVDJ_js = require('./chunk-VKOVFVDJ.js');
|
|
4
|
+
var chunk2EFVXYNA_js = require('./chunk-2EFVXYNA.js');
|
|
5
5
|
var chunkKV3EOLP3_js = require('./chunk-KV3EOLP3.js');
|
|
6
6
|
var React3 = require('react');
|
|
7
7
|
var lu = require('react-icons/lu');
|
|
@@ -18,11 +18,11 @@ var JSZip__default = /*#__PURE__*/_interopDefault(JSZip);
|
|
|
18
18
|
|
|
19
19
|
// src/viewer/utils/clone.ts
|
|
20
20
|
function cloneHistorySnapshot2(snapshot) {
|
|
21
|
-
return
|
|
21
|
+
return chunkVKOVFVDJ_js.cloneHistorySnapshot(snapshot);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
// src/viewer/hooks/useEditorHistory.ts
|
|
25
|
-
var
|
|
25
|
+
var DEFAULT_MAX_HISTORY_ENTRIES = 120;
|
|
26
26
|
function useEditorHistory(input) {
|
|
27
27
|
const {
|
|
28
28
|
slides,
|
|
@@ -31,6 +31,7 @@ function useEditorHistory(input) {
|
|
|
31
31
|
templateElementsBySlideId,
|
|
32
32
|
loading,
|
|
33
33
|
error,
|
|
34
|
+
maxHistoryEntries = DEFAULT_MAX_HISTORY_ENTRIES,
|
|
34
35
|
hasActivePointerInteraction,
|
|
35
36
|
pointerCommitNonce,
|
|
36
37
|
setSlides,
|
|
@@ -66,8 +67,8 @@ function useEditorHistory(input) {
|
|
|
66
67
|
width: canvasSize.width,
|
|
67
68
|
height: canvasSize.height,
|
|
68
69
|
activeSlideIndex,
|
|
69
|
-
slides: slides.map(
|
|
70
|
-
templateElementsBySlideId:
|
|
70
|
+
slides: slides.map(chunkVKOVFVDJ_js.cloneSlide),
|
|
71
|
+
templateElementsBySlideId: chunkVKOVFVDJ_js.cloneTemplateElementsBySlideId(templateElementsBySlideId),
|
|
71
72
|
...actionLabel ? { actionLabel } : {}
|
|
72
73
|
};
|
|
73
74
|
},
|
|
@@ -80,9 +81,9 @@ function useEditorHistory(input) {
|
|
|
80
81
|
width: snapshot.width,
|
|
81
82
|
height: snapshot.height
|
|
82
83
|
});
|
|
83
|
-
setSlides(snapshot.slides.map(
|
|
84
|
+
setSlides(snapshot.slides.map(chunkVKOVFVDJ_js.cloneSlide));
|
|
84
85
|
setTemplateElementsBySlideId(
|
|
85
|
-
|
|
86
|
+
chunkVKOVFVDJ_js.cloneTemplateElementsBySlideId(snapshot.templateElementsBySlideId)
|
|
86
87
|
);
|
|
87
88
|
setActiveSlideIndex(Math.min(snapshot.activeSlideIndex, maxSlideIndex));
|
|
88
89
|
setSelectedElementIds([]);
|
|
@@ -205,7 +206,7 @@ function useEditorHistory(input) {
|
|
|
205
206
|
return;
|
|
206
207
|
}
|
|
207
208
|
historyPastRef.current.push(cloneHistorySnapshot2(previousSnapshot));
|
|
208
|
-
|
|
209
|
+
while (historyPastRef.current.length > Math.max(1, maxHistoryEntries)) {
|
|
209
210
|
historyPastRef.current.shift();
|
|
210
211
|
}
|
|
211
212
|
historyFutureRef.current = [];
|
|
@@ -221,6 +222,7 @@ function useEditorHistory(input) {
|
|
|
221
222
|
error,
|
|
222
223
|
hasActivePointerInteraction,
|
|
223
224
|
loading,
|
|
225
|
+
maxHistoryEntries,
|
|
224
226
|
pointerCommitNonce,
|
|
225
227
|
slides,
|
|
226
228
|
updateHistoryAvailability
|
|
@@ -345,7 +347,7 @@ var GLYPH_COMPONENTS = {
|
|
|
345
347
|
plus: lu.LuPlus,
|
|
346
348
|
triangle: lu.LuTriangle
|
|
347
349
|
};
|
|
348
|
-
var SHAPE_PRESETS =
|
|
350
|
+
var SHAPE_PRESETS = chunkVKOVFVDJ_js.SHAPE_PRESET_DEFS.map(
|
|
349
351
|
(def) => ({
|
|
350
352
|
type: def.type,
|
|
351
353
|
label: def.label,
|
|
@@ -662,19 +664,19 @@ function useAnimationPlayback(input) {
|
|
|
662
664
|
if (anim.buildType && anim.buildType !== "allAtOnce" && anim.targetId) {
|
|
663
665
|
const el = slide.elements.find((e) => e.id === anim.targetId);
|
|
664
666
|
if (el && chunkKV3EOLP3_js.hasTextProperties(el) && el.textSegments && el.textSegments.length > 0) {
|
|
665
|
-
segmentCounts.set(anim.targetId,
|
|
667
|
+
segmentCounts.set(anim.targetId, chunkVKOVFVDJ_js.countTextSegments(el.textSegments));
|
|
666
668
|
}
|
|
667
669
|
}
|
|
668
670
|
}
|
|
669
|
-
const expandedAnims = segmentCounts.size > 0 ?
|
|
670
|
-
const engine =
|
|
671
|
+
const expandedAnims = segmentCounts.size > 0 ? chunkVKOVFVDJ_js.expandTextBuildAnimations(nativeAnims, segmentCounts) : nativeAnims;
|
|
672
|
+
const engine = chunkVKOVFVDJ_js.TimelineEngine.fromAnimations(expandedAnims);
|
|
671
673
|
timelineEngineRef.current = engine;
|
|
672
674
|
setPresentationKeyframesCss(engine.getTimeline().keyframesCss);
|
|
673
675
|
setInteractiveTriggerShapeIds(engine.getInteractiveTriggerShapeIds());
|
|
674
676
|
setHoverTriggerShapeIds(engine.getHoverTriggerShapeIds());
|
|
675
677
|
const allIds = slide.elements.map((element) => element.id);
|
|
676
678
|
for (const anim of expandedAnims) {
|
|
677
|
-
if (anim.targetId && anim.targetId.includes(
|
|
679
|
+
if (anim.targetId && anim.targetId.includes(chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP)) {
|
|
678
680
|
allIds.push(anim.targetId);
|
|
679
681
|
}
|
|
680
682
|
}
|
|
@@ -806,7 +808,7 @@ function useAnimationPlayback(input) {
|
|
|
806
808
|
}))
|
|
807
809
|
);
|
|
808
810
|
entranceAnimations.forEach((animation, animationIndex) => {
|
|
809
|
-
const delay =
|
|
811
|
+
const delay = chunkVKOVFVDJ_js.computeEntranceAnimationDelay(animation.delayMs, animationIndex);
|
|
810
812
|
const timer = window.setTimeout(() => {
|
|
811
813
|
setPresentationAnimations(
|
|
812
814
|
(previousAnimations) => previousAnimations.map(
|
|
@@ -863,7 +865,7 @@ function openDb() {
|
|
|
863
865
|
}
|
|
864
866
|
async function storeAudienceContent(content, sessionId) {
|
|
865
867
|
if (sessionId) {
|
|
866
|
-
return
|
|
868
|
+
return chunkVKOVFVDJ_js.storePresentationDeck(sessionId, content);
|
|
867
869
|
}
|
|
868
870
|
const db = await openDb();
|
|
869
871
|
return new Promise((resolve, reject) => {
|
|
@@ -884,7 +886,7 @@ async function storeAudienceContent(content, sessionId) {
|
|
|
884
886
|
}
|
|
885
887
|
async function loadAudienceContent(sessionId) {
|
|
886
888
|
if (sessionId) {
|
|
887
|
-
return
|
|
889
|
+
return chunkVKOVFVDJ_js.loadPresentationDeck(sessionId);
|
|
888
890
|
}
|
|
889
891
|
try {
|
|
890
892
|
const db = await openDb();
|
|
@@ -925,7 +927,7 @@ async function loadAudienceContent(sessionId) {
|
|
|
925
927
|
}
|
|
926
928
|
async function clearAudienceContent(sessionId) {
|
|
927
929
|
if (sessionId) {
|
|
928
|
-
return
|
|
930
|
+
return chunkVKOVFVDJ_js.clearPresentationDeck(sessionId);
|
|
929
931
|
}
|
|
930
932
|
try {
|
|
931
933
|
const db = await openDb();
|
|
@@ -945,12 +947,12 @@ async function clearAudienceContent(sessionId) {
|
|
|
945
947
|
} catch {
|
|
946
948
|
}
|
|
947
949
|
}
|
|
948
|
-
var PRESENTER_CHANNEL_NAME =
|
|
949
|
-
var AUDIENCE_HASH =
|
|
950
|
-
var PRESENTER_MSG_ORIGIN =
|
|
951
|
-
var AUDIENCE_NONCE_KEY =
|
|
950
|
+
var PRESENTER_CHANNEL_NAME = chunkVKOVFVDJ_js.PRESENTATION_CHANNEL_NAME;
|
|
951
|
+
var AUDIENCE_HASH = chunkVKOVFVDJ_js.PRESENTATION_HASH;
|
|
952
|
+
var PRESENTER_MSG_ORIGIN = chunkVKOVFVDJ_js.PRESENTATION_MESSAGE_ORIGIN;
|
|
953
|
+
var AUDIENCE_NONCE_KEY = chunkVKOVFVDJ_js.PRESENTATION_NONCE_KEY;
|
|
952
954
|
function generateSessionId() {
|
|
953
|
-
return
|
|
955
|
+
return chunkVKOVFVDJ_js.createPresentationSessionId();
|
|
954
956
|
}
|
|
955
957
|
function parseAudienceNonce() {
|
|
956
958
|
const hash = window.location.hash;
|
|
@@ -986,7 +988,7 @@ function usePresenterWindow(input) {
|
|
|
986
988
|
}, []);
|
|
987
989
|
const swapDisplays = React3.useCallback(async () => {
|
|
988
990
|
const audience = audienceWindowRef.current;
|
|
989
|
-
return audience && !audience.closed ?
|
|
991
|
+
return audience && !audience.closed ? chunkVKOVFVDJ_js.swapPresentationWindows(window, audience) : false;
|
|
990
992
|
}, []);
|
|
991
993
|
const syncSlideToAudience = React3.useCallback(
|
|
992
994
|
(slideIndex) => {
|
|
@@ -1068,10 +1070,10 @@ function usePresenterWindow(input) {
|
|
|
1068
1070
|
audienceWindowRef.current = blankWin;
|
|
1069
1071
|
const sessionId = generateSessionId();
|
|
1070
1072
|
sessionIdRef.current = sessionId;
|
|
1071
|
-
const audienceUrl =
|
|
1072
|
-
void
|
|
1073
|
+
const audienceUrl = chunkVKOVFVDJ_js.buildPresentationAudienceUrl(window.location.href, sessionId);
|
|
1074
|
+
void chunkVKOVFVDJ_js.resolveAudienceScreenPlacement(window).then((placement) => {
|
|
1073
1075
|
if (placement && audienceWindowRef.current === blankWin && !blankWin.closed) {
|
|
1074
|
-
|
|
1076
|
+
chunkVKOVFVDJ_js.placeAudienceWindow(blankWin, placement);
|
|
1075
1077
|
}
|
|
1076
1078
|
return void 0;
|
|
1077
1079
|
});
|
|
@@ -1127,7 +1129,7 @@ function usePresenterWindow(input) {
|
|
|
1127
1129
|
}
|
|
1128
1130
|
const handleMessage = (event) => {
|
|
1129
1131
|
const message = event.data;
|
|
1130
|
-
if (
|
|
1132
|
+
if (chunkVKOVFVDJ_js.isPresentationSessionMessage(message) && message.type === "audience-ready" && message.sessionId === sessionIdRef.current) {
|
|
1131
1133
|
syncStateToAudience(snapshotRef.current);
|
|
1132
1134
|
}
|
|
1133
1135
|
};
|
|
@@ -1209,7 +1211,7 @@ function useAudienceMode(input) {
|
|
|
1209
1211
|
}
|
|
1210
1212
|
channel.onmessage = (event) => {
|
|
1211
1213
|
const data = event.data;
|
|
1212
|
-
if (!
|
|
1214
|
+
if (!chunkVKOVFVDJ_js.isPresentationSessionMessage(data) || data.origin !== PRESENTER_MSG_ORIGIN) {
|
|
1213
1215
|
return;
|
|
1214
1216
|
}
|
|
1215
1217
|
if (expectedSessionId && data.sessionId !== expectedSessionId) {
|
|
@@ -1235,7 +1237,7 @@ function useAudienceMode(input) {
|
|
|
1235
1237
|
};
|
|
1236
1238
|
if (expectedSessionId) {
|
|
1237
1239
|
channel.postMessage({
|
|
1238
|
-
origin:
|
|
1240
|
+
origin: chunkVKOVFVDJ_js.PRESENTATION_MESSAGE_ORIGIN,
|
|
1239
1241
|
type: "audience-ready",
|
|
1240
1242
|
sessionId: expectedSessionId
|
|
1241
1243
|
});
|
|
@@ -1500,7 +1502,7 @@ function handlePresentationActionImpl(action, deps) {
|
|
|
1500
1502
|
return;
|
|
1501
1503
|
}
|
|
1502
1504
|
if (action.url && !actionStr.includes("hlinksldjump")) {
|
|
1503
|
-
if (
|
|
1505
|
+
if (chunkVKOVFVDJ_js.isUrlSafe(action.url)) {
|
|
1504
1506
|
window.open(action.url, "_blank", "noopener,noreferrer");
|
|
1505
1507
|
}
|
|
1506
1508
|
}
|
|
@@ -1510,7 +1512,7 @@ function handlePresentationActionImpl(action, deps) {
|
|
|
1510
1512
|
function executeSlideTransition(nextSlideIndex, deps) {
|
|
1511
1513
|
const incomingSlide = deps.slides[nextSlideIndex];
|
|
1512
1514
|
const transition = incomingSlide?.transition;
|
|
1513
|
-
const durationMs = deps.playTransition ?
|
|
1515
|
+
const durationMs = deps.playTransition ? chunkVKOVFVDJ_js.resolveTransitionDurationMs(transition) : 0;
|
|
1514
1516
|
deps.clearPresentationTimers();
|
|
1515
1517
|
deps.setPresentationSlideIndex(nextSlideIndex);
|
|
1516
1518
|
deps.onSetActiveSlideIndex(nextSlideIndex);
|
|
@@ -1551,6 +1553,7 @@ function useSlideNavigation(input) {
|
|
|
1551
1553
|
onPlayActionSound,
|
|
1552
1554
|
loopContinuously,
|
|
1553
1555
|
useTimings,
|
|
1556
|
+
onAdvancePastLastSlide,
|
|
1554
1557
|
playNextAnimationGroup,
|
|
1555
1558
|
clearPresentationTimers,
|
|
1556
1559
|
runPresentationEntranceAnimations,
|
|
@@ -1606,6 +1609,10 @@ function useSlideNavigation(input) {
|
|
|
1606
1609
|
setShowRehearsalSummary(true);
|
|
1607
1610
|
return;
|
|
1608
1611
|
}
|
|
1612
|
+
if (!loopContinuously && !rehearsing && direction === 1 && nextPosition >= availableSlideIndexes.length && onAdvancePastLastSlide) {
|
|
1613
|
+
onAdvancePastLastSlide();
|
|
1614
|
+
return;
|
|
1615
|
+
}
|
|
1609
1616
|
let resolvedPosition;
|
|
1610
1617
|
if (loopContinuously && !rehearsing && direction === 1 && nextPosition >= availableSlideIndexes.length) {
|
|
1611
1618
|
resolvedPosition = 0;
|
|
@@ -1638,6 +1645,7 @@ function useSlideNavigation(input) {
|
|
|
1638
1645
|
[
|
|
1639
1646
|
clearPresentationTimers,
|
|
1640
1647
|
loopContinuously,
|
|
1648
|
+
onAdvancePastLastSlide,
|
|
1641
1649
|
onPlayActionSound,
|
|
1642
1650
|
onSetActiveSlideIndex,
|
|
1643
1651
|
onSetMode,
|
|
@@ -1744,17 +1752,17 @@ function useZoomNavigation(input) {
|
|
|
1744
1752
|
};
|
|
1745
1753
|
}
|
|
1746
1754
|
function usePresenterConsole(slideIndex) {
|
|
1747
|
-
const timerRef = React3.useRef(
|
|
1748
|
-
const [snapshot, setSnapshot] = React3.useState(() =>
|
|
1755
|
+
const timerRef = React3.useRef(chunkVKOVFVDJ_js.createPresenterTimer());
|
|
1756
|
+
const [snapshot, setSnapshot] = React3.useState(() => chunkVKOVFVDJ_js.createInitialPresentationSnapshot(slideIndex));
|
|
1749
1757
|
const patch = React3.useCallback((value) => {
|
|
1750
|
-
setSnapshot((current) =>
|
|
1758
|
+
setSnapshot((current) => chunkVKOVFVDJ_js.mergePresentationSnapshot(current, value));
|
|
1751
1759
|
}, []);
|
|
1752
1760
|
React3.useEffect(() => patch({ slideIndex }), [patch, slideIndex]);
|
|
1753
1761
|
React3.useEffect(() => {
|
|
1754
1762
|
const timer = window.setInterval(() => {
|
|
1755
1763
|
patch({
|
|
1756
1764
|
paused: timerRef.current.paused,
|
|
1757
|
-
elapsedMs:
|
|
1765
|
+
elapsedMs: chunkVKOVFVDJ_js.presenterElapsed(timerRef.current)
|
|
1758
1766
|
});
|
|
1759
1767
|
}, 1e3);
|
|
1760
1768
|
return () => window.clearInterval(timer);
|
|
@@ -1764,19 +1772,19 @@ function usePresenterConsole(slideIndex) {
|
|
|
1764
1772
|
applyAudienceSnapshot: setSnapshot,
|
|
1765
1773
|
setBlackout: (blackout) => patch({ blackout }),
|
|
1766
1774
|
toggleTimer: () => {
|
|
1767
|
-
timerRef.current =
|
|
1775
|
+
timerRef.current = chunkVKOVFVDJ_js.togglePresenterTimer(timerRef.current);
|
|
1768
1776
|
patch({
|
|
1769
1777
|
paused: timerRef.current.paused,
|
|
1770
|
-
elapsedMs:
|
|
1778
|
+
elapsedMs: chunkVKOVFVDJ_js.presenterElapsed(timerRef.current)
|
|
1771
1779
|
});
|
|
1772
1780
|
},
|
|
1773
1781
|
resetTimer: () => {
|
|
1774
|
-
timerRef.current =
|
|
1782
|
+
timerRef.current = chunkVKOVFVDJ_js.resetPresenterTimer();
|
|
1775
1783
|
patch({ paused: false, elapsedMs: 0 });
|
|
1776
1784
|
},
|
|
1777
1785
|
stepZoom: (direction) => setSnapshot(
|
|
1778
|
-
(current) =>
|
|
1779
|
-
zoom:
|
|
1786
|
+
(current) => chunkVKOVFVDJ_js.mergePresentationSnapshot(current, {
|
|
1787
|
+
zoom: chunkVKOVFVDJ_js.stepPresenterZoom(
|
|
1780
1788
|
current.zoom ?? { scale: 1, originX: 0.5, originY: 0.5 },
|
|
1781
1789
|
direction
|
|
1782
1790
|
)
|
|
@@ -1808,7 +1816,8 @@ function usePresentationMode(input) {
|
|
|
1808
1816
|
onSaveRehearsalTimings,
|
|
1809
1817
|
loopContinuously,
|
|
1810
1818
|
showWithAnimation,
|
|
1811
|
-
useTimings
|
|
1819
|
+
useTimings,
|
|
1820
|
+
endWithBlackSlide = true
|
|
1812
1821
|
} = input;
|
|
1813
1822
|
const [presentationSlideIndex, setPresentationSlideIndex] = React3.useState(0);
|
|
1814
1823
|
const [presentationSlideVisible, setPresentationSlideVisible] = React3.useState(true);
|
|
@@ -1817,6 +1826,7 @@ function usePresentationMode(input) {
|
|
|
1817
1826
|
setTransitionOverlay(null);
|
|
1818
1827
|
}, []);
|
|
1819
1828
|
const [presenterMode, setPresenterMode] = React3.useState(false);
|
|
1829
|
+
const [endOfShowVisible, setEndOfShowVisible] = React3.useState(false);
|
|
1820
1830
|
const [presentationStartTime, setPresentationStartTime] = React3.useState(null);
|
|
1821
1831
|
const switchingToPresenterRef = React3.useRef(false);
|
|
1822
1832
|
const {
|
|
@@ -1853,8 +1863,15 @@ function usePresentationMode(input) {
|
|
|
1853
1863
|
setPresentationStartTime,
|
|
1854
1864
|
setPresenterMode
|
|
1855
1865
|
});
|
|
1866
|
+
const handleAdvancePastLastSlide = React3.useCallback(() => {
|
|
1867
|
+
if (endWithBlackSlide) {
|
|
1868
|
+
setEndOfShowVisible(true);
|
|
1869
|
+
} else {
|
|
1870
|
+
onSetMode("edit");
|
|
1871
|
+
}
|
|
1872
|
+
}, [endWithBlackSlide, onSetMode]);
|
|
1856
1873
|
const {
|
|
1857
|
-
movePresentationSlide,
|
|
1874
|
+
movePresentationSlide: moveNavigationSlide,
|
|
1858
1875
|
navigateToSlide,
|
|
1859
1876
|
handlePresentationAction,
|
|
1860
1877
|
scheduleAutoAdvanceForSlide
|
|
@@ -1870,6 +1887,7 @@ function usePresentationMode(input) {
|
|
|
1870
1887
|
onPlayActionSound,
|
|
1871
1888
|
loopContinuously,
|
|
1872
1889
|
useTimings,
|
|
1890
|
+
onAdvancePastLastSlide: handleAdvancePastLastSlide,
|
|
1873
1891
|
playNextAnimationGroup,
|
|
1874
1892
|
clearPresentationTimers,
|
|
1875
1893
|
runPresentationEntranceAnimations,
|
|
@@ -1878,6 +1896,19 @@ function usePresentationMode(input) {
|
|
|
1878
1896
|
recordCurrentSlideTime,
|
|
1879
1897
|
setShowRehearsalSummary
|
|
1880
1898
|
});
|
|
1899
|
+
const movePresentationSlide = React3.useCallback(
|
|
1900
|
+
(direction) => {
|
|
1901
|
+
if (endOfShowVisible) {
|
|
1902
|
+
setEndOfShowVisible(false);
|
|
1903
|
+
if (direction === 1) {
|
|
1904
|
+
onSetMode("edit");
|
|
1905
|
+
}
|
|
1906
|
+
return;
|
|
1907
|
+
}
|
|
1908
|
+
moveNavigationSlide(direction);
|
|
1909
|
+
},
|
|
1910
|
+
[endOfShowVisible, moveNavigationSlide, onSetMode]
|
|
1911
|
+
);
|
|
1881
1912
|
const { handleZoomClick, zoomReturnSlideIndex, returnToZoomSlide, clearZoomReturn } = useZoomNavigation({ navigateToSlide });
|
|
1882
1913
|
const presenterConsole = usePresenterConsole(presentationSlideIndex);
|
|
1883
1914
|
const {
|
|
@@ -1983,6 +2014,7 @@ function usePresentationMode(input) {
|
|
|
1983
2014
|
} else {
|
|
1984
2015
|
setTransitionOverlay(null);
|
|
1985
2016
|
}
|
|
2017
|
+
setEndOfShowVisible(false);
|
|
1986
2018
|
}, [mode]);
|
|
1987
2019
|
React3.useEffect(() => {
|
|
1988
2020
|
if (mode !== "present") {
|
|
@@ -2054,6 +2086,7 @@ function usePresentationMode(input) {
|
|
|
2054
2086
|
presentationKeyframesCss,
|
|
2055
2087
|
clearPresentationTimers,
|
|
2056
2088
|
runPresentationEntranceAnimations,
|
|
2089
|
+
endOfShowVisible,
|
|
2057
2090
|
movePresentationSlide,
|
|
2058
2091
|
navigateToSlide,
|
|
2059
2092
|
handlePresentationAction,
|
|
@@ -2107,7 +2140,7 @@ function nextStrokeId() {
|
|
|
2107
2140
|
return `stroke-${strokeIdCounter}`;
|
|
2108
2141
|
}
|
|
2109
2142
|
function usePresentationAnnotations(input) {
|
|
2110
|
-
const { isActive, activeSlideIndex } = input;
|
|
2143
|
+
const { isActive, activeSlideIndex, popupToolbarEnabled = true } = input;
|
|
2111
2144
|
const [presentationTool, setPresentationToolState] = React3.useState("none");
|
|
2112
2145
|
const [penColor, setPenColor] = React3.useState("#ff0000");
|
|
2113
2146
|
const [highlighterColor, setHighlighterColor] = React3.useState("#ffff00");
|
|
@@ -2260,6 +2293,9 @@ function usePresentationAnnotations(input) {
|
|
|
2260
2293
|
setLaserPosition(null);
|
|
2261
2294
|
return;
|
|
2262
2295
|
}
|
|
2296
|
+
if (!popupToolbarEnabled) {
|
|
2297
|
+
return;
|
|
2298
|
+
}
|
|
2263
2299
|
const handleMouseMove = () => {
|
|
2264
2300
|
setToolbarVisible(true);
|
|
2265
2301
|
window.clearTimeout(toolbarTimerRef.current);
|
|
@@ -2272,7 +2308,7 @@ function usePresentationAnnotations(input) {
|
|
|
2272
2308
|
window.removeEventListener("mousemove", handleMouseMove);
|
|
2273
2309
|
window.clearTimeout(toolbarTimerRef.current);
|
|
2274
2310
|
};
|
|
2275
|
-
}, [isActive]);
|
|
2311
|
+
}, [isActive, popupToolbarEnabled]);
|
|
2276
2312
|
const getAllSlideAnnotations = React3.useCallback(() => {
|
|
2277
2313
|
const map = new Map(slideAnnotationsRef.current);
|
|
2278
2314
|
if (annotationStrokes.length > 0) {
|
|
@@ -3292,12 +3328,12 @@ function useViewerState(input) {
|
|
|
3292
3328
|
function partitionTemplateElements(slides) {
|
|
3293
3329
|
const templateElementsBySlideId = {};
|
|
3294
3330
|
const nextSlides = slides.map((slide) => {
|
|
3295
|
-
const template = slide.elements.filter((el) =>
|
|
3331
|
+
const template = slide.elements.filter((el) => chunkVKOVFVDJ_js.isTemplateElement(el));
|
|
3296
3332
|
if (template.length === 0) {
|
|
3297
3333
|
return slide;
|
|
3298
3334
|
}
|
|
3299
3335
|
templateElementsBySlideId[slide.id] = template;
|
|
3300
|
-
return { ...slide, elements: slide.elements.filter((el) => !
|
|
3336
|
+
return { ...slide, elements: slide.elements.filter((el) => !chunkVKOVFVDJ_js.isTemplateElement(el)) };
|
|
3301
3337
|
});
|
|
3302
3338
|
return { slides: nextSlides, templateElementsBySlideId };
|
|
3303
3339
|
}
|
|
@@ -3383,7 +3419,7 @@ function useLoadContent({
|
|
|
3383
3419
|
handlerRef.current = null;
|
|
3384
3420
|
const mediaElements = [];
|
|
3385
3421
|
for (const slide of parsed.slides) {
|
|
3386
|
-
|
|
3422
|
+
chunkVKOVFVDJ_js.collectMediaElements(slide.elements, mediaElements);
|
|
3387
3423
|
}
|
|
3388
3424
|
for (const url of mediaDataUrls.values()) {
|
|
3389
3425
|
if (url.startsWith("blob:")) {
|
|
@@ -3424,7 +3460,7 @@ function useLoadContent({
|
|
|
3424
3460
|
}
|
|
3425
3461
|
})
|
|
3426
3462
|
);
|
|
3427
|
-
const { paths: imagePaths, refs: imageRefs } =
|
|
3463
|
+
const { paths: imagePaths, refs: imageRefs } = chunkVKOVFVDJ_js.collectImagePaths(parsed.slides);
|
|
3428
3464
|
let nextSlides = parsed.slides;
|
|
3429
3465
|
if (imagePaths.size > 0) {
|
|
3430
3466
|
const resolvedMap = /* @__PURE__ */ new Map();
|
|
@@ -3513,7 +3549,7 @@ function useLoadContent({
|
|
|
3513
3549
|
setHasMacros(parsed.hasMacros === true);
|
|
3514
3550
|
setHasDigitalSignatures(parsed.hasDigitalSignatures === true);
|
|
3515
3551
|
setDigitalSignatureCount(parsed.digitalSignatureCount ?? 0);
|
|
3516
|
-
setGuides(
|
|
3552
|
+
setGuides(chunkVKOVFVDJ_js.buildInitialGuides(parsed.presentationGuides, parsed.slides[0]?.guides));
|
|
3517
3553
|
setActiveSlideIndex(0);
|
|
3518
3554
|
clearSelection();
|
|
3519
3555
|
setIsDirty(false);
|
|
@@ -3598,7 +3634,7 @@ function useAutosave(input) {
|
|
|
3598
3634
|
isSavingRef.current = false;
|
|
3599
3635
|
return;
|
|
3600
3636
|
}
|
|
3601
|
-
await
|
|
3637
|
+
await chunkVKOVFVDJ_js.saveAutosaveSnapshot(filePathRef.current, data);
|
|
3602
3638
|
setAutosaveStatus({ state: "saved", timestamp: Date.now() });
|
|
3603
3639
|
} catch (err) {
|
|
3604
3640
|
setAutosaveStatus({
|
|
@@ -3636,7 +3672,7 @@ function useAutosave(input) {
|
|
|
3636
3672
|
|
|
3637
3673
|
// src/viewer/utils/animation-effects.ts
|
|
3638
3674
|
function getAnimationInitialStyle2(preset, nativeAnimation) {
|
|
3639
|
-
return
|
|
3675
|
+
return chunkVKOVFVDJ_js.getAnimationInitialStyle(preset, nativeAnimation);
|
|
3640
3676
|
}
|
|
3641
3677
|
function cn(...inputs) {
|
|
3642
3678
|
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
@@ -3658,20 +3694,20 @@ function getTextStyleForElement(element, fallbackColor) {
|
|
|
3658
3694
|
const textDecorationStyle = isDoubleStrike ? "double" : void 0;
|
|
3659
3695
|
const hasItalicRuns = element.textStyle?.italic || Boolean(element.textSegments?.some((segment) => segment.style?.italic));
|
|
3660
3696
|
const isRtl = element.textStyle?.rtl === true;
|
|
3661
|
-
const resolvedTextColor = element.textStyle?.hyperlink ?
|
|
3697
|
+
const resolvedTextColor = element.textStyle?.hyperlink ? chunkVKOVFVDJ_js.normalizeHexColor(element.textStyle?.color, HYPERLINK_COLOR) : chunkVKOVFVDJ_js.normalizeHexColor(element.textStyle?.color, fallbackColor);
|
|
3662
3698
|
const bodyTop = element.textStyle?.bodyInsetTop ?? DEFAULT_BODY_INSET_TB_PX;
|
|
3663
3699
|
const bodyBottom = element.textStyle?.bodyInsetBottom ?? DEFAULT_BODY_INSET_TB_PX;
|
|
3664
3700
|
const bodyLeft = element.textStyle?.bodyInsetLeft ?? DEFAULT_BODY_INSET_LR_PX;
|
|
3665
3701
|
const bodyRight = element.textStyle?.bodyInsetRight ?? DEFAULT_BODY_INSET_LR_PX;
|
|
3666
|
-
const writingMode =
|
|
3667
|
-
const textOrientation =
|
|
3668
|
-
const verticalDirection =
|
|
3702
|
+
const writingMode = chunkVKOVFVDJ_js.toCssWritingMode(element.textStyle?.textDirection);
|
|
3703
|
+
const textOrientation = chunkVKOVFVDJ_js.toCssTextOrientation(element.textStyle?.textDirection);
|
|
3704
|
+
const verticalDirection = chunkVKOVFVDJ_js.toCssVerticalDirection(element.textStyle?.textDirection);
|
|
3669
3705
|
const resolvedDirection = verticalDirection || (isRtl ? "rtl" : "ltr");
|
|
3670
3706
|
const resolvedUnicodeBidi = isRtl ? "plaintext" : void 0;
|
|
3671
3707
|
const hasSegments = (element.textSegments?.length ?? 0) > 0;
|
|
3672
3708
|
return {
|
|
3673
3709
|
color: resolvedTextColor,
|
|
3674
|
-
backgroundColor: !hasSegments && element.textStyle?.highlightColor ?
|
|
3710
|
+
backgroundColor: !hasSegments && element.textStyle?.highlightColor ? chunkVKOVFVDJ_js.normalizeHexColor(element.textStyle.highlightColor, void 0) : void 0,
|
|
3675
3711
|
textAlign: (() => {
|
|
3676
3712
|
const a = element.textStyle?.align;
|
|
3677
3713
|
if (a === "justLow" || a === "dist" || a === "thaiDist") {
|
|
@@ -3687,7 +3723,7 @@ function getTextStyleForElement(element, fallbackColor) {
|
|
|
3687
3723
|
textDecorationLine: textDecorationTokens.length > 0 ? textDecorationTokens.join(" ") : "none",
|
|
3688
3724
|
textDecorationStyle,
|
|
3689
3725
|
fontFamily: element.textStyle?.fontFamily || DEFAULT_FONT_FAMILY,
|
|
3690
|
-
lineHeight:
|
|
3726
|
+
lineHeight: chunkVKOVFVDJ_js.resolveLineHeight(element.textStyle, hasItalicRuns),
|
|
3691
3727
|
paddingTop: bodyTop + (hasItalicRuns ? 1 : 0),
|
|
3692
3728
|
paddingBottom: bodyBottom + (hasItalicRuns ? 1 : 0),
|
|
3693
3729
|
paddingLeft: bodyLeft + (element.textStyle?.paragraphMarginLeft || 0),
|
|
@@ -3700,7 +3736,7 @@ function getTextStyleForElement(element, fallbackColor) {
|
|
|
3700
3736
|
// Auto-fit: use OOXML-provided fontScale/lnSpcReduction when available,
|
|
3701
3737
|
// otherwise fall back to heuristic estimation. The pure font-scale maths
|
|
3702
3738
|
// now lives in pptx-viewer-shared (computeAutoFitTextStyle).
|
|
3703
|
-
...
|
|
3739
|
+
...chunkVKOVFVDJ_js.computeAutoFitTextStyle({
|
|
3704
3740
|
textStyle: element.textStyle,
|
|
3705
3741
|
text: element.text ?? "",
|
|
3706
3742
|
width: element.width,
|
|
@@ -3737,9 +3773,9 @@ function getTextLayoutStyle(element) {
|
|
|
3737
3773
|
return {};
|
|
3738
3774
|
}
|
|
3739
3775
|
const verticalAlign = element.textStyle?.vAlign || "top";
|
|
3740
|
-
const writingMode =
|
|
3741
|
-
const textOrientation =
|
|
3742
|
-
const verticalDirection =
|
|
3776
|
+
const writingMode = chunkVKOVFVDJ_js.toCssWritingMode(element.textStyle?.textDirection);
|
|
3777
|
+
const textOrientation = chunkVKOVFVDJ_js.toCssTextOrientation(element.textStyle?.textDirection);
|
|
3778
|
+
const verticalDirection = chunkVKOVFVDJ_js.toCssVerticalDirection(element.textStyle?.textDirection);
|
|
3743
3779
|
const parsedColumnCount = Number(element.textStyle?.columnCount);
|
|
3744
3780
|
const columnCount = Number.isFinite(parsedColumnCount) ? Math.max(1, Math.min(16, Math.round(parsedColumnCount))) : 1;
|
|
3745
3781
|
const hasColumns = columnCount > 1;
|
|
@@ -3756,7 +3792,7 @@ function getTextLayoutStyle(element) {
|
|
|
3756
3792
|
const bodyBottom = element.textStyle?.bodyInsetBottom ?? DEFAULT_BODY_INSET_TB_PX;
|
|
3757
3793
|
const parsedColumnSpacing = Number(element.textStyle?.columnSpacing);
|
|
3758
3794
|
const columnGap = Number.isFinite(parsedColumnSpacing) && parsedColumnSpacing > 0 ? `${parsedColumnSpacing}px` : "0.75em";
|
|
3759
|
-
const kinsokuStyles =
|
|
3795
|
+
const kinsokuStyles = chunkVKOVFVDJ_js.getKinsokuLineBreakStyles(element.textStyle);
|
|
3760
3796
|
if (hasColumns) {
|
|
3761
3797
|
return {
|
|
3762
3798
|
display: "block",
|
|
@@ -3799,10 +3835,10 @@ function getTextLayoutStyle(element) {
|
|
|
3799
3835
|
|
|
3800
3836
|
// src/viewer/utils/text-effects.tsx
|
|
3801
3837
|
function buildTextFillCss2(style) {
|
|
3802
|
-
return
|
|
3838
|
+
return chunkVKOVFVDJ_js.buildTextFillCss(style);
|
|
3803
3839
|
}
|
|
3804
3840
|
function buildTextBody3DSceneStyle2(textStyle) {
|
|
3805
|
-
return
|
|
3841
|
+
return chunkVKOVFVDJ_js.buildTextBody3DSceneStyle(textStyle);
|
|
3806
3842
|
}
|
|
3807
3843
|
|
|
3808
3844
|
// src/viewer/utils/text-warp-css.tsx
|
|
@@ -3987,17 +4023,17 @@ function wrapWithTextBuildAnimation(elementId, paraIndex, renderedSegments, para
|
|
|
3987
4023
|
if (!subElementAnimStates || subElementAnimStates.size === 0) {
|
|
3988
4024
|
return renderedSegments;
|
|
3989
4025
|
}
|
|
3990
|
-
const paraKey = `${elementId}${
|
|
4026
|
+
const paraKey = `${elementId}${chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP}p${paraIndex}`;
|
|
3991
4027
|
const paraState = subElementAnimStates.get(paraKey);
|
|
3992
4028
|
if (paraState) {
|
|
3993
4029
|
const style = buildAnimStyle(paraState);
|
|
3994
4030
|
return /* @__PURE__ */ jsxRuntime.jsx("span", { "data-anim-id": paraKey, style: { display: "inline", ...style }, children: renderedSegments }, paraKey);
|
|
3995
4031
|
}
|
|
3996
|
-
const firstWordKey = `${elementId}${
|
|
4032
|
+
const firstWordKey = `${elementId}${chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP}w${paraIndex}-0`;
|
|
3997
4033
|
if (subElementAnimStates.has(firstWordKey)) {
|
|
3998
4034
|
return wrapByWord(elementId, paraIndex, paraSegments, subElementAnimStates);
|
|
3999
4035
|
}
|
|
4000
|
-
const firstCharKey = `${elementId}${
|
|
4036
|
+
const firstCharKey = `${elementId}${chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP}c${paraIndex}-0`;
|
|
4001
4037
|
if (subElementAnimStates.has(firstCharKey)) {
|
|
4002
4038
|
return wrapByChar(elementId, paraIndex, paraSegments, subElementAnimStates);
|
|
4003
4039
|
}
|
|
@@ -4018,7 +4054,7 @@ function wrapByWord(elementId, paraIndex, paraSegments, states) {
|
|
|
4018
4054
|
nodes.push(/* @__PURE__ */ jsxRuntime.jsx(React3__default.default.Fragment, { children: w }, `ws-${i}`));
|
|
4019
4055
|
continue;
|
|
4020
4056
|
}
|
|
4021
|
-
const key = `${elementId}${
|
|
4057
|
+
const key = `${elementId}${chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP}w${paraIndex}-${wordIdx}`;
|
|
4022
4058
|
const state = states.get(key);
|
|
4023
4059
|
const style = buildAnimStyle(state);
|
|
4024
4060
|
nodes.push(
|
|
@@ -4032,7 +4068,7 @@ function wrapByChar(elementId, paraIndex, paraSegments, states) {
|
|
|
4032
4068
|
const fullText = paraSegments.map((e) => e.segment.text).join("");
|
|
4033
4069
|
const nodes = [];
|
|
4034
4070
|
for (let i = 0; i < fullText.length; i++) {
|
|
4035
|
-
const key = `${elementId}${
|
|
4071
|
+
const key = `${elementId}${chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP}c${paraIndex}-${i}`;
|
|
4036
4072
|
const state = states.get(key);
|
|
4037
4073
|
const style = buildAnimStyle(state);
|
|
4038
4074
|
nodes.push(
|
|
@@ -4045,10 +4081,10 @@ function renderScriptAwareText(text, needsScriptFonts, scriptFonts, baseFontFami
|
|
|
4045
4081
|
if (!needsScriptFonts || !text) {
|
|
4046
4082
|
return text;
|
|
4047
4083
|
}
|
|
4048
|
-
const runs =
|
|
4084
|
+
const runs = chunkVKOVFVDJ_js.segmentByScript(text);
|
|
4049
4085
|
if (runs.length <= 1) {
|
|
4050
4086
|
if (runs.length === 1) {
|
|
4051
|
-
const font =
|
|
4087
|
+
const font = chunkVKOVFVDJ_js.resolveFontForScript(runs[0].script, scriptFonts);
|
|
4052
4088
|
if (font && font !== baseFontFamily) {
|
|
4053
4089
|
return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontFamily: font }, children: text });
|
|
4054
4090
|
}
|
|
@@ -4056,7 +4092,7 @@ function renderScriptAwareText(text, needsScriptFonts, scriptFonts, baseFontFami
|
|
|
4056
4092
|
return text;
|
|
4057
4093
|
}
|
|
4058
4094
|
return runs.map((run, i) => {
|
|
4059
|
-
const font =
|
|
4095
|
+
const font = chunkVKOVFVDJ_js.resolveFontForScript(run.script, scriptFonts);
|
|
4060
4096
|
if (!font || font === baseFontFamily) {
|
|
4061
4097
|
return /* @__PURE__ */ jsxRuntime.jsx(React3__default.default.Fragment, { children: run.text }, `${keyPrefix}-r${i}`);
|
|
4062
4098
|
}
|
|
@@ -4130,8 +4166,8 @@ function renderSegmentContent(elementId, segmentIndex, textValue, lines, needsSc
|
|
|
4130
4166
|
);
|
|
4131
4167
|
}
|
|
4132
4168
|
function renderEquationSegment(elementId, segmentIndex, equationXml, equationNumber) {
|
|
4133
|
-
const mathml =
|
|
4134
|
-
const safeMathml = mathml ?
|
|
4169
|
+
const mathml = chunkVKOVFVDJ_js.convertOmmlToMathMl(equationXml);
|
|
4170
|
+
const safeMathml = mathml ? chunkVKOVFVDJ_js.sanitizeMathMl(mathml) : "";
|
|
4135
4171
|
const equationContent = safeMathml ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
4136
4172
|
"span",
|
|
4137
4173
|
{
|
|
@@ -4141,7 +4177,7 @@ function renderEquationSegment(elementId, segmentIndex, equationXml, equationNum
|
|
|
4141
4177
|
},
|
|
4142
4178
|
dangerouslySetInnerHTML: { __html: safeMathml }
|
|
4143
4179
|
}
|
|
4144
|
-
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block px-1 py-0.5 rounded text-xs bg-gray-200/20 text-gray-400 italic", children:
|
|
4180
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block px-1 py-0.5 rounded text-xs bg-gray-200/20 text-gray-400 italic", children: chunk2EFVXYNA_js.translationsEn["pptx.textSegment.equationFallback"] });
|
|
4145
4181
|
if (equationNumber) {
|
|
4146
4182
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4147
4183
|
"span",
|
|
@@ -4181,7 +4217,7 @@ function renderEquationSegment(elementId, segmentIndex, equationXml, equationNum
|
|
|
4181
4217
|
return /* @__PURE__ */ jsxRuntime.jsx("span", { children: equationContent }, `${elementId}-seg-${segmentIndex}`);
|
|
4182
4218
|
}
|
|
4183
4219
|
function renderPictureBullet(elementId, segmentIndex, bulletInfo, baseFontSize) {
|
|
4184
|
-
const picture =
|
|
4220
|
+
const picture = chunkVKOVFVDJ_js.resolvePictureBullet(bulletInfo, baseFontSize) ?? {
|
|
4185
4221
|
sizePx: baseFontSize,
|
|
4186
4222
|
fallbackMarker: "\u2022",
|
|
4187
4223
|
accessibleLabel: "Bullet"
|
|
@@ -4231,7 +4267,7 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
|
|
|
4231
4267
|
);
|
|
4232
4268
|
}
|
|
4233
4269
|
const segmentStyle = segment.style || {};
|
|
4234
|
-
const textValue =
|
|
4270
|
+
const textValue = chunkVKOVFVDJ_js.substituteFieldText(segment.text || "", segment.fieldType, fieldContext);
|
|
4235
4271
|
const lines = textValue.split("\n");
|
|
4236
4272
|
const textDecorationTokens = [];
|
|
4237
4273
|
if (segmentStyle.underline || segmentStyle.hyperlink) {
|
|
@@ -4241,8 +4277,8 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
|
|
|
4241
4277
|
textDecorationTokens.push("line-through");
|
|
4242
4278
|
}
|
|
4243
4279
|
const isDoubleStrike = segmentStyle.strikethrough && segmentStyle.strikeType === "dblStrike";
|
|
4244
|
-
const resolvedSegmentColor = segmentStyle.hyperlink ?
|
|
4245
|
-
const underlineDecoration =
|
|
4280
|
+
const resolvedSegmentColor = segmentStyle.hyperlink ? chunkVKOVFVDJ_js.normalizeHexColor(segmentStyle.color || element.textStyle?.color, HYPERLINK_COLOR) : chunkVKOVFVDJ_js.normalizeHexColor(segmentStyle.color || element.textStyle?.color, fallbackColor);
|
|
4281
|
+
const underlineDecoration = chunkVKOVFVDJ_js.resolveUnderlineDecorationStyle(
|
|
4246
4282
|
Boolean(isDoubleStrike),
|
|
4247
4283
|
segmentStyle.underlineStyle
|
|
4248
4284
|
);
|
|
@@ -4262,7 +4298,7 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
|
|
|
4262
4298
|
complexScript: segmentStyle.complexScriptFont || element.textStyle?.complexScriptFont || baseFontFamily,
|
|
4263
4299
|
symbol: segmentStyle.symbolFont || element.textStyle?.symbolFont || baseFontFamily
|
|
4264
4300
|
};
|
|
4265
|
-
const needsScriptFonts =
|
|
4301
|
+
const needsScriptFonts = chunkVKOVFVDJ_js.hasDistinctScriptFonts(scriptFonts);
|
|
4266
4302
|
const spanStyle = {
|
|
4267
4303
|
color: resolvedSegmentColor,
|
|
4268
4304
|
fontSize: baseFontSize * baselineFontScale,
|
|
@@ -4276,15 +4312,15 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
|
|
|
4276
4312
|
verticalAlign: baselineShift,
|
|
4277
4313
|
letterSpacing,
|
|
4278
4314
|
fontKerning,
|
|
4279
|
-
backgroundColor: textFillStyles ? void 0 : segmentStyle.highlightColor ?
|
|
4315
|
+
backgroundColor: textFillStyles ? void 0 : segmentStyle.highlightColor ? chunkVKOVFVDJ_js.normalizeHexColor(segmentStyle.highlightColor, "transparent") : void 0,
|
|
4280
4316
|
...textFillStyles,
|
|
4281
|
-
textDecorationColor: segmentStyle.underlineColor ?
|
|
4282
|
-
WebkitTextStroke: segmentStyle.textOutlineWidth && segmentStyle.textOutlineColor ? `${segmentStyle.textOutlineWidth}px ${
|
|
4317
|
+
textDecorationColor: segmentStyle.underlineColor ? chunkVKOVFVDJ_js.normalizeHexColor(segmentStyle.underlineColor, void 0) : void 0,
|
|
4318
|
+
WebkitTextStroke: segmentStyle.textOutlineWidth && segmentStyle.textOutlineColor ? `${segmentStyle.textOutlineWidth}px ${chunkVKOVFVDJ_js.normalizeHexColor(segmentStyle.textOutlineColor, "#000000")}` : segmentStyle.textOutlineWidth ? `${segmentStyle.textOutlineWidth}px currentColor` : void 0,
|
|
4283
4319
|
paintOrder: segmentStyle.textOutlineWidth ? "stroke fill" : void 0,
|
|
4284
|
-
textShadow:
|
|
4285
|
-
filter:
|
|
4286
|
-
opacity:
|
|
4287
|
-
WebkitBoxReflect:
|
|
4320
|
+
textShadow: chunkVKOVFVDJ_js.buildTextShadowCss(segmentStyle),
|
|
4321
|
+
filter: chunkVKOVFVDJ_js.buildTextRunFilterChain(segmentStyle),
|
|
4322
|
+
opacity: chunkVKOVFVDJ_js.getTextAlphaOpacity(segmentStyle),
|
|
4323
|
+
WebkitBoxReflect: chunkVKOVFVDJ_js.buildTextReflectionCss(segmentStyle)
|
|
4288
4324
|
};
|
|
4289
4325
|
const runRtl = segmentStyle.rtl;
|
|
4290
4326
|
if (runRtl !== void 0 && runRtl !== paragraphRtl) {
|
|
@@ -4304,7 +4340,7 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
|
|
|
4304
4340
|
spanStyle.fontSize = baseFontSize * (bulletInfo.sizePercent / 100) * baselineFontScale;
|
|
4305
4341
|
}
|
|
4306
4342
|
if (bulletInfo.color) {
|
|
4307
|
-
spanStyle.color =
|
|
4343
|
+
spanStyle.color = chunkVKOVFVDJ_js.normalizeHexColor(bulletInfo.color, resolvedSegmentColor);
|
|
4308
4344
|
}
|
|
4309
4345
|
}
|
|
4310
4346
|
if (bulletInfo?.imageDataUrl || bulletInfo?.imageRelId) {
|
|
@@ -4336,7 +4372,7 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
|
|
|
4336
4372
|
textAlign: segment.rubyAlignment === "l" ? "left" : segment.rubyAlignment === "r" ? "right" : segment.rubyAlignment === "dist" || segment.rubyAlignment === "distCat" || segment.rubyAlignment === "distLetter" ? "justify" : "center"
|
|
4337
4373
|
};
|
|
4338
4374
|
if (segment.rubyStyle?.color) {
|
|
4339
|
-
rubyStyle.color =
|
|
4375
|
+
rubyStyle.color = chunkVKOVFVDJ_js.normalizeHexColor(segment.rubyStyle.color, resolvedSegmentColor);
|
|
4340
4376
|
}
|
|
4341
4377
|
innerContent = /* @__PURE__ */ jsxRuntime.jsxs("ruby", { children: [
|
|
4342
4378
|
baseContent,
|
|
@@ -4443,14 +4479,14 @@ function renderTextSegments(element, fallbackColor, emptyFallback, findHighlight
|
|
|
4443
4479
|
return Boolean(segment.text) && segment.text.trim().length > 0;
|
|
4444
4480
|
});
|
|
4445
4481
|
const hasBullet = bulletInfo && !bulletInfo.none && hasVisibleTextContent;
|
|
4446
|
-
const paraRtl =
|
|
4482
|
+
const paraRtl = chunkVKOVFVDJ_js.resolveParagraphRtl(paraSegments, elementRtl);
|
|
4447
4483
|
const isRtlParagraph = paraRtl === true;
|
|
4448
|
-
const paraAlign =
|
|
4449
|
-
const cssTextAlign =
|
|
4484
|
+
const paraAlign = chunkVKOVFVDJ_js.resolveParagraphAlign(paraSegments, elementAlign);
|
|
4485
|
+
const cssTextAlign = chunkVKOVFVDJ_js.resolveCssTextAlign(paraAlign, isRtlParagraph);
|
|
4450
4486
|
const paraMarginLeft = isRtlParagraph ? void 0 : rawMarginLeft;
|
|
4451
4487
|
const paraMarginRight = isRtlParagraph ? rawMarginLeft : void 0;
|
|
4452
4488
|
const paraTextIndent = rawTextIndent;
|
|
4453
|
-
const paraKinsokuStyle =
|
|
4489
|
+
const paraKinsokuStyle = chunkVKOVFVDJ_js.getKinsokuLineBreakStyles(firstSeg?.segment.style);
|
|
4454
4490
|
const hasParaKinsoku = Object.keys(paraKinsokuStyle).length > 0;
|
|
4455
4491
|
const paraStyle = {
|
|
4456
4492
|
...paraKinsokuStyle
|
|
@@ -4650,8 +4686,8 @@ function buildLineShadowCss(element) {
|
|
|
4650
4686
|
const offsetY = typeof ss.lineShadowOffsetY === "number" ? ss.lineShadowOffsetY : 2;
|
|
4651
4687
|
const blur = typeof ss.lineShadowBlur === "number" ? Math.max(0, ss.lineShadowBlur) : 4;
|
|
4652
4688
|
const opacity = typeof ss.lineShadowOpacity === "number" ? Math.max(0, Math.min(1, ss.lineShadowOpacity)) : 0.35;
|
|
4653
|
-
return `${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${
|
|
4654
|
-
|
|
4689
|
+
return `${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${chunkVKOVFVDJ_js.colorWithOpacity(
|
|
4690
|
+
chunkVKOVFVDJ_js.normalizeHexColor(ss.lineShadowColor, "#000000"),
|
|
4655
4691
|
opacity
|
|
4656
4692
|
)}`;
|
|
4657
4693
|
}
|
|
@@ -4665,7 +4701,7 @@ function buildLineGlowFilter(element) {
|
|
|
4665
4701
|
}
|
|
4666
4702
|
const glowOpacity = typeof ss.lineGlowOpacity === "number" ? ss.lineGlowOpacity : 0.75;
|
|
4667
4703
|
const glowRad = Math.round(Math.max(0, ss.lineGlowRadius));
|
|
4668
|
-
const glowCol =
|
|
4704
|
+
const glowCol = chunkVKOVFVDJ_js.colorWithOpacity(chunkVKOVFVDJ_js.normalizeHexColor(ss.lineGlowColor, "#ffff00"), glowOpacity);
|
|
4669
4705
|
return `drop-shadow(0 0 ${glowRad}px ${glowCol})`;
|
|
4670
4706
|
}
|
|
4671
4707
|
function mapDagBlendModeToCss(blend) {
|
|
@@ -4752,7 +4788,7 @@ function getRoundRectRadiusPx2(element) {
|
|
|
4752
4788
|
|
|
4753
4789
|
// src/viewer/utils/shape-visual-3d.ts
|
|
4754
4790
|
function build3DExtrusionData2(shape3d, scene3d, fillColor, elementWidth, elementHeight) {
|
|
4755
|
-
return
|
|
4791
|
+
return chunkVKOVFVDJ_js.build3DExtrusionData(
|
|
4756
4792
|
shape3d,
|
|
4757
4793
|
scene3d,
|
|
4758
4794
|
fillColor,
|
|
@@ -4761,7 +4797,7 @@ function build3DExtrusionData2(shape3d, scene3d, fillColor, elementWidth, elemen
|
|
|
4761
4797
|
);
|
|
4762
4798
|
}
|
|
4763
4799
|
function apply3dEffects2(base, scene3d, shape3d) {
|
|
4764
|
-
|
|
4800
|
+
chunkVKOVFVDJ_js.apply3dEffects(base, scene3d, shape3d);
|
|
4765
4801
|
}
|
|
4766
4802
|
|
|
4767
4803
|
// src/viewer/utils/shape-visual-style.ts
|
|
@@ -4770,18 +4806,18 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
|
|
|
4770
4806
|
return {};
|
|
4771
4807
|
}
|
|
4772
4808
|
const normalizedShapeType = getShapeType(element.shapeType);
|
|
4773
|
-
const clipPath =
|
|
4809
|
+
const clipPath = chunkVKOVFVDJ_js.getResolvedShapeClipPath(element);
|
|
4774
4810
|
const fillOpacity = element.shapeStyle?.fillOpacity;
|
|
4775
4811
|
const strokeOpacity = element.shapeStyle?.strokeOpacity;
|
|
4776
|
-
const strokeDash =
|
|
4777
|
-
const fillGradient =
|
|
4778
|
-
const shadowCss =
|
|
4779
|
-
const innerShadowCss =
|
|
4780
|
-
const resolvedFillColor =
|
|
4781
|
-
const resolvedStrokeColor =
|
|
4812
|
+
const strokeDash = chunkVKOVFVDJ_js.normalizeStrokeDashType(element.shapeStyle?.strokeDash);
|
|
4813
|
+
const fillGradient = chunkVKOVFVDJ_js.buildCssGradientFromShapeStyle(element.shapeStyle) || element.shapeStyle?.fillGradient;
|
|
4814
|
+
const shadowCss = chunkVKOVFVDJ_js.buildShadowCssFromShapeStyle(element.shapeStyle);
|
|
4815
|
+
const innerShadowCss = chunkVKOVFVDJ_js.buildInnerShadowCssFromShapeStyle(element.shapeStyle);
|
|
4816
|
+
const resolvedFillColor = chunkVKOVFVDJ_js.colorWithOpacity(fillColor, fillOpacity);
|
|
4817
|
+
const resolvedStrokeColor = chunkVKOVFVDJ_js.colorWithOpacity(strokeColor, strokeOpacity);
|
|
4782
4818
|
const ss = element.shapeStyle;
|
|
4783
4819
|
const combinedShadowParts = [];
|
|
4784
|
-
const multiLayerShadow =
|
|
4820
|
+
const multiLayerShadow = chunkVKOVFVDJ_js.buildMultiLayerShadowCss(element.shapeStyle);
|
|
4785
4821
|
if (multiLayerShadow) {
|
|
4786
4822
|
combinedShadowParts.push(multiLayerShadow);
|
|
4787
4823
|
} else if (shadowCss) {
|
|
@@ -4790,7 +4826,7 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
|
|
|
4790
4826
|
if (innerShadowCss) {
|
|
4791
4827
|
combinedShadowParts.push(innerShadowCss);
|
|
4792
4828
|
}
|
|
4793
|
-
const glowBoxShadow =
|
|
4829
|
+
const glowBoxShadow = chunkVKOVFVDJ_js.buildGlowBoxShadow(ss?.glowColor, ss?.glowRadius, ss?.glowOpacity);
|
|
4794
4830
|
if (glowBoxShadow) {
|
|
4795
4831
|
combinedShadowParts.push(glowBoxShadow);
|
|
4796
4832
|
}
|
|
@@ -4798,7 +4834,7 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
|
|
|
4798
4834
|
if (lineShadow) {
|
|
4799
4835
|
combinedShadowParts.push(lineShadow);
|
|
4800
4836
|
}
|
|
4801
|
-
const compoundLineShadow =
|
|
4837
|
+
const compoundLineShadow = chunkVKOVFVDJ_js.getCompoundLineBoxShadow(
|
|
4802
4838
|
element.shapeStyle?.compoundLine,
|
|
4803
4839
|
strokeWidth,
|
|
4804
4840
|
resolvedStrokeColor
|
|
@@ -4811,7 +4847,7 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
|
|
|
4811
4847
|
if (ss?.glowColor && ss.glowColor !== "transparent" && ss.glowRadius) {
|
|
4812
4848
|
const glowOpacity = typeof ss.glowOpacity === "number" ? ss.glowOpacity : 0.75;
|
|
4813
4849
|
const glowRad = Math.round(Math.max(0, ss.glowRadius));
|
|
4814
|
-
const glowCol =
|
|
4850
|
+
const glowCol = chunkVKOVFVDJ_js.colorWithOpacity(chunkVKOVFVDJ_js.normalizeHexColor(ss.glowColor, "#ffff00"), glowOpacity);
|
|
4815
4851
|
filterParts.push(`drop-shadow(0 0 ${glowRad}px ${glowCol})`);
|
|
4816
4852
|
}
|
|
4817
4853
|
if (typeof ss?.softEdgeRadius === "number" && ss.softEdgeRadius > 0) {
|
|
@@ -4824,12 +4860,12 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
|
|
|
4824
4860
|
if (lineGlowCss) {
|
|
4825
4861
|
filterParts.push(lineGlowCss);
|
|
4826
4862
|
}
|
|
4827
|
-
const dagFilter =
|
|
4863
|
+
const dagFilter = chunkVKOVFVDJ_js.getEffectDagFilter(ss, element.id);
|
|
4828
4864
|
if (dagFilter) {
|
|
4829
4865
|
filterParts.push(dagFilter);
|
|
4830
4866
|
}
|
|
4831
4867
|
const lineJoinCss = ss?.lineJoin === "round" ? "round" : ss?.lineJoin === "bevel" ? "bevel" : void 0;
|
|
4832
|
-
const patternFill =
|
|
4868
|
+
const patternFill = chunkVKOVFVDJ_js.buildPatternFillCss(element.shapeStyle);
|
|
4833
4869
|
const imageFillUrl = ss?.fillMode === "image" && ss.fillImageUrl ? ss.fillImageUrl : void 0;
|
|
4834
4870
|
const imageFillMode = ss?.fillImageMode || "stretch";
|
|
4835
4871
|
let reflectCss;
|
|
@@ -4841,7 +4877,7 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
|
|
|
4841
4877
|
const endOpacity = typeof ss.reflectionEndOpacity === "number" ? ss.reflectionEndOpacity : 0;
|
|
4842
4878
|
const fadeLength = typeof ss.reflectionEndPosition === "number" ? Math.round(ss.reflectionEndPosition * Math.max(element.height, 1)) : 100;
|
|
4843
4879
|
const blurRadius = typeof ss.reflectionBlurRadius === "number" ? ss.reflectionBlurRadius : 0;
|
|
4844
|
-
reflectCss =
|
|
4880
|
+
reflectCss = chunkVKOVFVDJ_js.buildReflectionCss(distance, startOpacity, endOpacity, fadeLength, blurRadius);
|
|
4845
4881
|
}
|
|
4846
4882
|
}
|
|
4847
4883
|
const base = {
|
|
@@ -4855,9 +4891,9 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
|
|
|
4855
4891
|
filter: filterParts.length > 0 ? filterParts.join(" ") : void 0,
|
|
4856
4892
|
opacity: typeof ss?.dagAlphaModFix === "number" ? Math.max(0, Math.min(1, ss.dagAlphaModFix / 100)) : void 0,
|
|
4857
4893
|
mixBlendMode: mapDagBlendModeToCss(ss?.dagFillOverlayBlend),
|
|
4858
|
-
borderWidth: strokeWidth > 0 ?
|
|
4894
|
+
borderWidth: strokeWidth > 0 ? chunkVKOVFVDJ_js.getCompoundLineBorderWidth(ss?.compoundLine, strokeWidth) : void 0,
|
|
4859
4895
|
borderColor: strokeWidth > 0 ? resolvedStrokeColor : void 0,
|
|
4860
|
-
borderStyle: strokeWidth > 0 ?
|
|
4896
|
+
borderStyle: strokeWidth > 0 ? chunkVKOVFVDJ_js.getCssBorderDashStyle(strokeDash, ss?.compoundLine) : void 0,
|
|
4861
4897
|
strokeLinejoin: lineJoinCss,
|
|
4862
4898
|
strokeLinecap: ss?.lineCap === "rnd" ? "round" : ss?.lineCap === "sq" ? "square" : void 0
|
|
4863
4899
|
};
|
|
@@ -4898,7 +4934,7 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
|
|
|
4898
4934
|
borderWidth: 0,
|
|
4899
4935
|
borderTopWidth: Math.max(strokeWidth, 2),
|
|
4900
4936
|
borderTopColor: resolvedStrokeColor,
|
|
4901
|
-
borderTopStyle:
|
|
4937
|
+
borderTopStyle: chunkVKOVFVDJ_js.getCssBorderDashStyle(strokeDash)
|
|
4902
4938
|
};
|
|
4903
4939
|
}
|
|
4904
4940
|
if (normalizedShapeType === "cylinder") {
|
|
@@ -4912,13 +4948,13 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
|
|
|
4912
4948
|
function getConnectorAdjustment(element, key, fallback) {
|
|
4913
4949
|
const direct = element.shapeAdjustments?.[key];
|
|
4914
4950
|
if (typeof direct === "number" && Number.isFinite(direct)) {
|
|
4915
|
-
return
|
|
4951
|
+
return chunkVKOVFVDJ_js.clampUnitInterval(direct / 1e5);
|
|
4916
4952
|
}
|
|
4917
4953
|
const fallbackKey = element.shapeAdjustments?.adj;
|
|
4918
4954
|
if (typeof fallbackKey === "number" && Number.isFinite(fallbackKey)) {
|
|
4919
|
-
return
|
|
4955
|
+
return chunkVKOVFVDJ_js.clampUnitInterval(fallbackKey / 1e5);
|
|
4920
4956
|
}
|
|
4921
|
-
return
|
|
4957
|
+
return chunkVKOVFVDJ_js.clampUnitInterval(fallback);
|
|
4922
4958
|
}
|
|
4923
4959
|
function getConnectorPathGeometry(element) {
|
|
4924
4960
|
const width = Math.max(element.width, 1);
|
|
@@ -5049,10 +5085,10 @@ function renderVectorShape(element, hasFill, fillColor, strokeWidth, strokeColor
|
|
|
5049
5085
|
return null;
|
|
5050
5086
|
}
|
|
5051
5087
|
const normalizedType = (element.shapeType || "").toLowerCase();
|
|
5052
|
-
const fillPaint =
|
|
5053
|
-
const strokePaint =
|
|
5054
|
-
const dashType =
|
|
5055
|
-
const dashArray =
|
|
5088
|
+
const fillPaint = chunkVKOVFVDJ_js.colorWithOpacity(fillColor, element.shapeStyle?.fillOpacity);
|
|
5089
|
+
const strokePaint = chunkVKOVFVDJ_js.colorWithOpacity(strokeColor, element.shapeStyle?.strokeOpacity);
|
|
5090
|
+
const dashType = chunkVKOVFVDJ_js.normalizeStrokeDashType(element.shapeStyle?.strokeDash);
|
|
5091
|
+
const dashArray = chunkVKOVFVDJ_js.getSvgStrokeDasharray(
|
|
5056
5092
|
dashType,
|
|
5057
5093
|
Math.max(strokeWidth, 1),
|
|
5058
5094
|
element.shapeStyle?.customDashSegments
|
|
@@ -5211,8 +5247,8 @@ function renderVectorShape(element, hasFill, fillColor, strokeWidth, strokeColor
|
|
|
5211
5247
|
const endArrowL = element.shapeStyle?.connectorEndArrowLength;
|
|
5212
5248
|
const compoundLine = element.shapeStyle?.compoundLine;
|
|
5213
5249
|
const hitTargetWidth = Math.max(strokeWidth * 3, 12);
|
|
5214
|
-
const offsets =
|
|
5215
|
-
const widths =
|
|
5250
|
+
const offsets = chunkVKOVFVDJ_js.getCompoundLineOffsets(compoundLine, strokeWidth);
|
|
5251
|
+
const widths = chunkVKOVFVDJ_js.getCompoundLineWidths(compoundLine, strokeWidth);
|
|
5216
5252
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5217
5253
|
"svg",
|
|
5218
5254
|
{
|
|
@@ -5275,7 +5311,7 @@ function getImageMaskStyle(element) {
|
|
|
5275
5311
|
}
|
|
5276
5312
|
const normalized = shapeType.toLowerCase();
|
|
5277
5313
|
if (normalized === "roundrect" || normalized === "round1rect" || normalized === "round2samerect" || normalized === "round2diagrect" || normalized === "sniproundrect" || normalized === "snip1rect" || normalized === "snip2diagrect") {
|
|
5278
|
-
const radiusPx =
|
|
5314
|
+
const radiusPx = chunkVKOVFVDJ_js.getRoundRectRadiusPx(element);
|
|
5279
5315
|
if (radiusPx <= 0.01) {
|
|
5280
5316
|
return void 0;
|
|
5281
5317
|
}
|
|
@@ -5287,7 +5323,7 @@ function getImageMaskStyle(element) {
|
|
|
5287
5323
|
if (normalized === "can" || normalized === "cylinder") {
|
|
5288
5324
|
return { borderRadius: "48% / 12%" };
|
|
5289
5325
|
}
|
|
5290
|
-
const clipPath =
|
|
5326
|
+
const clipPath = chunkVKOVFVDJ_js.getResolvedShapeClipPath(element);
|
|
5291
5327
|
if (!clipPath) {
|
|
5292
5328
|
return void 0;
|
|
5293
5329
|
}
|
|
@@ -5303,10 +5339,10 @@ function getImageRenderStyle(element) {
|
|
|
5303
5339
|
objectFit: "cover"
|
|
5304
5340
|
};
|
|
5305
5341
|
}
|
|
5306
|
-
const cropLeft =
|
|
5307
|
-
const cropTop =
|
|
5308
|
-
const cropRight =
|
|
5309
|
-
const cropBottom =
|
|
5342
|
+
const cropLeft = chunkVKOVFVDJ_js.clampCropValue(element.cropLeft);
|
|
5343
|
+
const cropTop = chunkVKOVFVDJ_js.clampCropValue(element.cropTop);
|
|
5344
|
+
const cropRight = chunkVKOVFVDJ_js.clampCropValue(element.cropRight);
|
|
5345
|
+
const cropBottom = chunkVKOVFVDJ_js.clampCropValue(element.cropBottom);
|
|
5310
5346
|
const hasCrop = cropLeft + cropRight > 1e-4 || cropTop + cropBottom > 1e-4;
|
|
5311
5347
|
if (!hasCrop) {
|
|
5312
5348
|
return {
|
|
@@ -5318,10 +5354,10 @@ function getImageRenderStyle(element) {
|
|
|
5318
5354
|
}
|
|
5319
5355
|
const safeHorizontalScale = cropLeft + cropRight >= 0.99 ? 0.99 / (cropLeft + cropRight) : 1;
|
|
5320
5356
|
const safeVerticalScale = cropTop + cropBottom >= 0.99 ? 0.99 / (cropTop + cropBottom) : 1;
|
|
5321
|
-
const normalizedLeft =
|
|
5322
|
-
const normalizedRight =
|
|
5323
|
-
const normalizedTop =
|
|
5324
|
-
const normalizedBottom =
|
|
5357
|
+
const normalizedLeft = chunkVKOVFVDJ_js.clampCropValue(cropLeft * safeHorizontalScale);
|
|
5358
|
+
const normalizedRight = chunkVKOVFVDJ_js.clampCropValue(cropRight * safeHorizontalScale);
|
|
5359
|
+
const normalizedTop = chunkVKOVFVDJ_js.clampCropValue(cropTop * safeVerticalScale);
|
|
5360
|
+
const normalizedBottom = chunkVKOVFVDJ_js.clampCropValue(cropBottom * safeVerticalScale);
|
|
5325
5361
|
const remainingWidth = Math.max(0.01, 1 - normalizedLeft - normalizedRight);
|
|
5326
5362
|
const remainingHeight = Math.max(0.01, 1 - normalizedTop - normalizedBottom);
|
|
5327
5363
|
const tx = Math.round(-normalizedLeft / remainingWidth * 1e4) / 100;
|
|
@@ -5461,9 +5497,9 @@ function parseGradientFillCss(gradFill) {
|
|
|
5461
5497
|
}
|
|
5462
5498
|
const parsed = stops.map((gs) => {
|
|
5463
5499
|
const pos = Number.parseInt(String(gs["@_pos"] || "0"), 10) / 1e3;
|
|
5464
|
-
const color =
|
|
5465
|
-
const opacity =
|
|
5466
|
-
return { pos, color:
|
|
5500
|
+
const color = chunkVKOVFVDJ_js.parseDrawingColor(gs) ?? "#888888";
|
|
5501
|
+
const opacity = chunkVKOVFVDJ_js.parseDrawingColorOpacity(gs);
|
|
5502
|
+
return { pos, color: chunkVKOVFVDJ_js.colorWithOpacity(color, opacity) };
|
|
5467
5503
|
}).sort((a, b) => a.pos - b.pos);
|
|
5468
5504
|
const stopStrings = parsed.map((s) => `${s.color} ${s.pos.toFixed(1)}%`).join(", ");
|
|
5469
5505
|
const lin = gradFill["a:lin"];
|
|
@@ -5504,8 +5540,8 @@ function parsePatternFillCss(pattFill) {
|
|
|
5504
5540
|
if (!pattFill) {
|
|
5505
5541
|
return void 0;
|
|
5506
5542
|
}
|
|
5507
|
-
const fgColor =
|
|
5508
|
-
const bgColor =
|
|
5543
|
+
const fgColor = chunkVKOVFVDJ_js.parseDrawingColor(pattFill["a:fgClr"]) ?? "#000000";
|
|
5544
|
+
const bgColor = chunkVKOVFVDJ_js.parseDrawingColor(pattFill["a:bgClr"]) ?? "#ffffff";
|
|
5509
5545
|
const preset = String(pattFill["@_prst"] || "ltDnDiag");
|
|
5510
5546
|
switch (preset) {
|
|
5511
5547
|
case "ltHorz":
|
|
@@ -5616,11 +5652,11 @@ function parseCellBorders(cellProperties) {
|
|
|
5616
5652
|
const prstDash = ln["a:prstDash"];
|
|
5617
5653
|
const dashVal = prstDash ? String(prstDash["@_val"] || "") : void 0;
|
|
5618
5654
|
const cssBorderStyle = ooxmlDashToCss(dashVal);
|
|
5619
|
-
const color =
|
|
5655
|
+
const color = chunkVKOVFVDJ_js.parseDrawingColor(ln["a:solidFill"]);
|
|
5620
5656
|
if (color) {
|
|
5621
|
-
const opacity =
|
|
5657
|
+
const opacity = chunkVKOVFVDJ_js.parseDrawingColorOpacity(ln["a:solidFill"]);
|
|
5622
5658
|
const key = `${edge.prefix}`;
|
|
5623
|
-
borderStyle[key] = `${widthPx}px ${cssBorderStyle} ${
|
|
5659
|
+
borderStyle[key] = `${widthPx}px ${cssBorderStyle} ${chunkVKOVFVDJ_js.colorWithOpacity(color, opacity)}`;
|
|
5624
5660
|
}
|
|
5625
5661
|
}
|
|
5626
5662
|
return borderStyle;
|
|
@@ -5633,7 +5669,7 @@ function parseCellTextEffects(runProps) {
|
|
|
5633
5669
|
const textShadowParts = [];
|
|
5634
5670
|
const outerShdw = effectLst["a:outerShdw"];
|
|
5635
5671
|
if (outerShdw) {
|
|
5636
|
-
const shdwColor =
|
|
5672
|
+
const shdwColor = chunkVKOVFVDJ_js.parseDrawingColor(outerShdw);
|
|
5637
5673
|
if (shdwColor) {
|
|
5638
5674
|
const blurRad = Number.parseInt(String(outerShdw["@_blurRad"] || "0"), 10);
|
|
5639
5675
|
const blurPx = blurRad > 0 ? Math.round(blurRad / 12700) : 0;
|
|
@@ -5651,7 +5687,7 @@ function parseCellTextEffects(runProps) {
|
|
|
5651
5687
|
}
|
|
5652
5688
|
const glow = effectLst["a:glow"];
|
|
5653
5689
|
if (glow) {
|
|
5654
|
-
const glowColor =
|
|
5690
|
+
const glowColor = chunkVKOVFVDJ_js.parseDrawingColor(glow);
|
|
5655
5691
|
if (glowColor) {
|
|
5656
5692
|
const glowRad = Number.parseInt(String(glow["@_rad"] || "0"), 10);
|
|
5657
5693
|
const glowPx = glowRad > 0 ? Math.round(glowRad / 12700) : 2;
|
|
@@ -5730,10 +5766,10 @@ function extractTableCellStyle(cellXml, fallbackStyle, schemeColorOverrides) {
|
|
|
5730
5766
|
if (runProps?.["@_u"] !== void 0) {
|
|
5731
5767
|
cellStyle.textDecorationLine = runProps["@_u"] === "sng" ? "underline" : "none";
|
|
5732
5768
|
}
|
|
5733
|
-
const runColor =
|
|
5769
|
+
const runColor = chunkVKOVFVDJ_js.parseDrawingColor(runProps?.["a:solidFill"], schemeColorOverrides) || chunkVKOVFVDJ_js.parseDrawingColor(runProps?.["a:highlight"], schemeColorOverrides);
|
|
5734
5770
|
if (runColor) {
|
|
5735
|
-
const opacity =
|
|
5736
|
-
cellStyle.color =
|
|
5771
|
+
const opacity = chunkVKOVFVDJ_js.parseDrawingColorOpacity(runProps?.["a:solidFill"]);
|
|
5772
|
+
cellStyle.color = chunkVKOVFVDJ_js.colorWithOpacity(runColor, opacity);
|
|
5737
5773
|
}
|
|
5738
5774
|
const fontFamily = runProps?.["a:latin"]?.["@_typeface"] || runProps?.["a:ea"]?.["@_typeface"] || runProps?.["a:cs"]?.["@_typeface"];
|
|
5739
5775
|
if (fontFamily) {
|
|
@@ -5743,15 +5779,15 @@ function extractTableCellStyle(cellXml, fallbackStyle, schemeColorOverrides) {
|
|
|
5743
5779
|
cellStyle.textAlign = parseParagraphAlignment(paragraphProperties["@_algn"]);
|
|
5744
5780
|
}
|
|
5745
5781
|
const cellProperties = cellXml["a:tcPr"];
|
|
5746
|
-
const cellFill =
|
|
5782
|
+
const cellFill = chunkVKOVFVDJ_js.parseDrawingColor(
|
|
5747
5783
|
cellProperties?.["a:solidFill"],
|
|
5748
5784
|
schemeColorOverrides
|
|
5749
5785
|
);
|
|
5750
5786
|
if (cellFill) {
|
|
5751
|
-
const opacity =
|
|
5787
|
+
const opacity = chunkVKOVFVDJ_js.parseDrawingColorOpacity(
|
|
5752
5788
|
cellProperties?.["a:solidFill"]
|
|
5753
5789
|
);
|
|
5754
|
-
cellStyle.backgroundColor =
|
|
5790
|
+
cellStyle.backgroundColor = chunkVKOVFVDJ_js.colorWithOpacity(cellFill, opacity);
|
|
5755
5791
|
} else {
|
|
5756
5792
|
const gradCss = parseGradientFillCss(cellProperties?.["a:gradFill"]);
|
|
5757
5793
|
if (gradCss) {
|
|
@@ -5766,16 +5802,16 @@ function extractTableCellStyle(cellXml, fallbackStyle, schemeColorOverrides) {
|
|
|
5766
5802
|
const edgeBorders = parseCellBorders(cellProperties);
|
|
5767
5803
|
Object.assign(cellStyle, edgeBorders);
|
|
5768
5804
|
if (!cellStyle.borderLeftColor && !cellStyle.borderRightColor && !cellStyle.borderTopColor && !cellStyle.borderBottomColor) {
|
|
5769
|
-
const borderColor =
|
|
5805
|
+
const borderColor = chunkVKOVFVDJ_js.parseDrawingColor(
|
|
5770
5806
|
cellProperties?.["a:lnL"]?.["a:solidFill"],
|
|
5771
5807
|
schemeColorOverrides
|
|
5772
|
-
) ||
|
|
5808
|
+
) || chunkVKOVFVDJ_js.parseDrawingColor(
|
|
5773
5809
|
cellProperties?.["a:lnR"]?.["a:solidFill"],
|
|
5774
5810
|
schemeColorOverrides
|
|
5775
|
-
) ||
|
|
5811
|
+
) || chunkVKOVFVDJ_js.parseDrawingColor(
|
|
5776
5812
|
cellProperties?.["a:lnT"]?.["a:solidFill"],
|
|
5777
5813
|
schemeColorOverrides
|
|
5778
|
-
) ||
|
|
5814
|
+
) || chunkVKOVFVDJ_js.parseDrawingColor(
|
|
5779
5815
|
cellProperties?.["a:lnB"]?.["a:solidFill"],
|
|
5780
5816
|
schemeColorOverrides
|
|
5781
5817
|
);
|
|
@@ -5854,10 +5890,10 @@ function resolveTableStyleFillColor(fill, colorScheme) {
|
|
|
5854
5890
|
}
|
|
5855
5891
|
let color = base;
|
|
5856
5892
|
if (fill.tint !== void 0 && fill.tint > 0) {
|
|
5857
|
-
color =
|
|
5893
|
+
color = chunkVKOVFVDJ_js.tintColor2(color, fill.tint / 1e5);
|
|
5858
5894
|
}
|
|
5859
5895
|
if (fill.shade !== void 0 && fill.shade > 0) {
|
|
5860
|
-
color =
|
|
5896
|
+
color = chunkVKOVFVDJ_js.shadeColor2(color, 1 - fill.shade / 1e5);
|
|
5861
5897
|
}
|
|
5862
5898
|
return color;
|
|
5863
5899
|
}
|
|
@@ -5879,10 +5915,10 @@ function applyTableStyleText(text, colorScheme, style) {
|
|
|
5879
5915
|
if (base) {
|
|
5880
5916
|
let color = base;
|
|
5881
5917
|
if (text.fontTint !== void 0 && text.fontTint > 0) {
|
|
5882
|
-
color =
|
|
5918
|
+
color = chunkVKOVFVDJ_js.tintColor2(color, text.fontTint / 1e5);
|
|
5883
5919
|
}
|
|
5884
5920
|
if (text.fontShade !== void 0 && text.fontShade > 0) {
|
|
5885
|
-
color =
|
|
5921
|
+
color = chunkVKOVFVDJ_js.shadeColor2(color, 1 - text.fontShade / 1e5);
|
|
5886
5922
|
}
|
|
5887
5923
|
style.color = color;
|
|
5888
5924
|
applied = true;
|
|
@@ -6164,9 +6200,9 @@ function cellStyleToCss(style) {
|
|
|
6164
6200
|
if (style.gradientFillCss) {
|
|
6165
6201
|
css.background = style.gradientFillCss;
|
|
6166
6202
|
} else if (style.fillMode === "pattern" && style.patternFillPreset) {
|
|
6167
|
-
const fg =
|
|
6168
|
-
const bg =
|
|
6169
|
-
const svgPattern =
|
|
6203
|
+
const fg = chunkVKOVFVDJ_js.normalizeHexColor(style.patternFillForeground, "#000000");
|
|
6204
|
+
const bg = chunkVKOVFVDJ_js.normalizeHexColor(style.patternFillBackground, "#ffffff");
|
|
6205
|
+
const svgPattern = chunkVKOVFVDJ_js.getPatternSvg(style.patternFillPreset, fg, bg);
|
|
6170
6206
|
if (svgPattern) {
|
|
6171
6207
|
const encoded = encodeURIComponent(svgPattern);
|
|
6172
6208
|
css.backgroundImage = `url("data:image/svg+xml,${encoded}")`;
|
|
@@ -6235,7 +6271,7 @@ function cellStyleToCss(style) {
|
|
|
6235
6271
|
if (edge.width || edge.color) {
|
|
6236
6272
|
const w = edge.width ?? 1;
|
|
6237
6273
|
const c = edge.color ?? style.borderColor ?? "#000000";
|
|
6238
|
-
const s =
|
|
6274
|
+
const s = chunkVKOVFVDJ_js.ooxmlDashToCssBorderStyle(edge.dash);
|
|
6239
6275
|
css[edge.prefix] = `${w}px ${s} ${c}`;
|
|
6240
6276
|
}
|
|
6241
6277
|
}
|
|
@@ -6277,7 +6313,7 @@ function TableResizeOverlay({
|
|
|
6277
6313
|
const containerRef = React3.useRef(null);
|
|
6278
6314
|
const [rowBounds, setRowBounds] = React3.useState([]);
|
|
6279
6315
|
const dragRef = React3.useRef(null);
|
|
6280
|
-
const colBoundaries = React3.useMemo(() =>
|
|
6316
|
+
const colBoundaries = React3.useMemo(() => chunkVKOVFVDJ_js.computeColumnBoundaries(columnWidths), [columnWidths]);
|
|
6281
6317
|
const measureRows = React3.useCallback(() => {
|
|
6282
6318
|
const container = containerRef.current;
|
|
6283
6319
|
if (!container) {
|
|
@@ -6324,11 +6360,11 @@ function TableResizeOverlay({
|
|
|
6324
6360
|
const rect = containerRef.current.getBoundingClientRect();
|
|
6325
6361
|
if (drag.type === "col" && drag.initialWidths && onResizeColumns) {
|
|
6326
6362
|
const deltaProp = (e.clientX - drag.startPos) / rect.width;
|
|
6327
|
-
onResizeColumns(
|
|
6363
|
+
onResizeColumns(chunkVKOVFVDJ_js.computeResizedColumnWidths(drag.initialWidths, drag.index, deltaProp));
|
|
6328
6364
|
} else if (drag.type === "row" && onResizeRow) {
|
|
6329
6365
|
const deltaY = e.clientY - drag.startPos;
|
|
6330
|
-
const newHeight =
|
|
6331
|
-
drag.initialRowHeight ??
|
|
6366
|
+
const newHeight = chunkVKOVFVDJ_js.computeResizedRowHeight(
|
|
6367
|
+
drag.initialRowHeight ?? chunkVKOVFVDJ_js.DEFAULT_ROW_HEIGHT,
|
|
6332
6368
|
deltaY
|
|
6333
6369
|
);
|
|
6334
6370
|
onResizeRow(drag.index, newHeight);
|
|
@@ -6366,7 +6402,7 @@ function TableResizeOverlay({
|
|
|
6366
6402
|
e.stopPropagation();
|
|
6367
6403
|
const table = containerRef.current?.querySelector("table");
|
|
6368
6404
|
const tr = table?.querySelectorAll("tbody > tr")[index];
|
|
6369
|
-
const actualHeight = tr?.offsetHeight ??
|
|
6405
|
+
const actualHeight = tr?.offsetHeight ?? chunkVKOVFVDJ_js.DEFAULT_ROW_HEIGHT;
|
|
6370
6406
|
document.body.style.cursor = "row-resize";
|
|
6371
6407
|
document.body.style.userSelect = "none";
|
|
6372
6408
|
dragRef.current = {
|
|
@@ -6412,7 +6448,7 @@ function renderTableFromTableData(element, textStyle, options) {
|
|
|
6412
6448
|
}
|
|
6413
6449
|
const first = selectedCell.selectedCells[0];
|
|
6414
6450
|
const last = selectedCell.selectedCells[selectedCell.selectedCells.length - 1];
|
|
6415
|
-
return
|
|
6451
|
+
return chunkVKOVFVDJ_js.computeSelectionRect(first.row, first.col, last.row, last.col, tableData);
|
|
6416
6452
|
})();
|
|
6417
6453
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6418
6454
|
TableResizeOverlay,
|
|
@@ -6445,7 +6481,7 @@ function renderTableFromTableData(element, textStyle, options) {
|
|
|
6445
6481
|
return null;
|
|
6446
6482
|
}
|
|
6447
6483
|
const isCellSelected = selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex;
|
|
6448
|
-
const isInMultiSelection =
|
|
6484
|
+
const isInMultiSelection = chunkVKOVFVDJ_js.isCellInRect(rowIndex, cellIndex, selectionRect);
|
|
6449
6485
|
const isCellEditing = isCellSelected && selectedCell?.isEditing;
|
|
6450
6486
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6451
6487
|
"td",
|
|
@@ -6468,7 +6504,7 @@ function renderTableFromTableData(element, textStyle, options) {
|
|
|
6468
6504
|
}
|
|
6469
6505
|
event.stopPropagation();
|
|
6470
6506
|
if (event.shiftKey && selectedCell) {
|
|
6471
|
-
const rect =
|
|
6507
|
+
const rect = chunkVKOVFVDJ_js.computeSelectionRect(
|
|
6472
6508
|
selectedCell.rowIndex,
|
|
6473
6509
|
selectedCell.columnIndex,
|
|
6474
6510
|
rowIndex,
|
|
@@ -6478,7 +6514,7 @@ function renderTableFromTableData(element, textStyle, options) {
|
|
|
6478
6514
|
options?.onSelectCell?.({
|
|
6479
6515
|
rowIndex: selectedCell.rowIndex,
|
|
6480
6516
|
columnIndex: selectedCell.columnIndex,
|
|
6481
|
-
selectedCells:
|
|
6517
|
+
selectedCells: chunkVKOVFVDJ_js.rectToCells(rect)
|
|
6482
6518
|
});
|
|
6483
6519
|
} else {
|
|
6484
6520
|
options?.onSelectCell?.({
|
|
@@ -6537,7 +6573,7 @@ function renderTableElement(element, textStyle, options) {
|
|
|
6537
6573
|
if (tableEl2.tableData && tableEl2.tableData.rows.length > 0) {
|
|
6538
6574
|
return renderTableFromTableData(tableEl2, textStyle, options);
|
|
6539
6575
|
}
|
|
6540
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children:
|
|
6576
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk2EFVXYNA_js.translationsEn["pptx.table.title"] });
|
|
6541
6577
|
}
|
|
6542
6578
|
const selectedCell = options?.selectedCell || null;
|
|
6543
6579
|
const isEditable2 = Boolean(options?.editable);
|
|
@@ -6552,7 +6588,7 @@ function renderTableElement(element, textStyle, options) {
|
|
|
6552
6588
|
}
|
|
6553
6589
|
const first = selectedCell.selectedCells[0];
|
|
6554
6590
|
const last = selectedCell.selectedCells[selectedCell.selectedCells.length - 1];
|
|
6555
|
-
return
|
|
6591
|
+
return chunkVKOVFVDJ_js.computeSelectionRect(first.row, first.col, last.row, last.col, tableEl.tableData);
|
|
6556
6592
|
})();
|
|
6557
6593
|
const schemeOverrides = options?.styleCtx?.theme?.colorScheme ? options.styleCtx.theme.colorScheme : void 0;
|
|
6558
6594
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -6617,7 +6653,7 @@ function renderTableElement(element, textStyle, options) {
|
|
|
6617
6653
|
"border px-1 py-0.5 align-top",
|
|
6618
6654
|
isEditable2 && hasCellSelectionHandler ? "border-blue-200/70 cursor-cell" : "border-white/30",
|
|
6619
6655
|
selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex ? "ring-1 ring-inset ring-blue-500" : null,
|
|
6620
|
-
|
|
6656
|
+
chunkVKOVFVDJ_js.isCellInRect(rowIndex, cellIndex, xmlSelectionRect) && !(selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex) ? "bg-blue-500/15 ring-1 ring-inset ring-blue-400/50" : null
|
|
6621
6657
|
),
|
|
6622
6658
|
colSpan,
|
|
6623
6659
|
rowSpan: rSpan,
|
|
@@ -6628,7 +6664,7 @@ function renderTableElement(element, textStyle, options) {
|
|
|
6628
6664
|
}
|
|
6629
6665
|
event.stopPropagation();
|
|
6630
6666
|
if (event.shiftKey && selectedCell && tableEl.tableData) {
|
|
6631
|
-
const rect =
|
|
6667
|
+
const rect = chunkVKOVFVDJ_js.computeSelectionRect(
|
|
6632
6668
|
selectedCell.rowIndex,
|
|
6633
6669
|
selectedCell.columnIndex,
|
|
6634
6670
|
rowIndex,
|
|
@@ -6638,7 +6674,7 @@ function renderTableElement(element, textStyle, options) {
|
|
|
6638
6674
|
options?.onSelectCell?.({
|
|
6639
6675
|
rowIndex: selectedCell.rowIndex,
|
|
6640
6676
|
columnIndex: selectedCell.columnIndex,
|
|
6641
|
-
selectedCells:
|
|
6677
|
+
selectedCells: chunkVKOVFVDJ_js.rectToCells(rect)
|
|
6642
6678
|
});
|
|
6643
6679
|
} else {
|
|
6644
6680
|
options?.onSelectCell?.({
|
|
@@ -6690,24 +6726,24 @@ function renderTableElement(element, textStyle, options) {
|
|
|
6690
6726
|
}
|
|
6691
6727
|
var LEGEND_ITEM_WIDTH = 80;
|
|
6692
6728
|
function partAttrs(part) {
|
|
6693
|
-
return part ?
|
|
6729
|
+
return part ? chunkVKOVFVDJ_js.chartPartToAttrs(part) : void 0;
|
|
6694
6730
|
}
|
|
6695
6731
|
function resolveReactPalette(chartData) {
|
|
6696
6732
|
if (chartData.colorPalette && chartData.colorPalette.length > 0) {
|
|
6697
6733
|
return chartData.colorPalette;
|
|
6698
6734
|
}
|
|
6699
|
-
return [...
|
|
6735
|
+
return [...chunkVKOVFVDJ_js.getChartStylePalette(chartData.style?.styleId)];
|
|
6700
6736
|
}
|
|
6701
6737
|
function buildReactChartViewModel(element) {
|
|
6702
6738
|
if (element.type !== "chart" || !element.chartData) {
|
|
6703
|
-
return
|
|
6739
|
+
return chunkVKOVFVDJ_js.buildChartViewModel(element);
|
|
6704
6740
|
}
|
|
6705
6741
|
const palette = resolveReactPalette(element.chartData);
|
|
6706
6742
|
const themedElement = {
|
|
6707
6743
|
...element,
|
|
6708
6744
|
chartData: { ...element.chartData, colorPalette: palette }
|
|
6709
6745
|
};
|
|
6710
|
-
return
|
|
6746
|
+
return chunkVKOVFVDJ_js.buildChartViewModel(themedElement);
|
|
6711
6747
|
}
|
|
6712
6748
|
function renderPrimitive(prim, key) {
|
|
6713
6749
|
switch (prim.kind) {
|
|
@@ -7096,7 +7132,7 @@ function renderMapChart(element, chartData, categoryLabels) {
|
|
|
7096
7132
|
const unmatchedRows = [];
|
|
7097
7133
|
categories.forEach((cat, i) => {
|
|
7098
7134
|
const value = values[i] ?? 0;
|
|
7099
|
-
const code =
|
|
7135
|
+
const code = chunkVKOVFVDJ_js.resolveRegionCode(cat);
|
|
7100
7136
|
if (code) {
|
|
7101
7137
|
regionValueMap.set(code, { value, label: cat });
|
|
7102
7138
|
} else {
|
|
@@ -7134,8 +7170,8 @@ function renderMapChart(element, chartData, categoryLabels) {
|
|
|
7134
7170
|
let fill = "#e2e8f0";
|
|
7135
7171
|
let dataLabel = null;
|
|
7136
7172
|
if (entry) {
|
|
7137
|
-
const t =
|
|
7138
|
-
fill =
|
|
7173
|
+
const t = chunkVKOVFVDJ_js.normalizeValue(entry.value, minVal, maxVal);
|
|
7174
|
+
fill = chunkVKOVFVDJ_js.sequentialColorScale(t);
|
|
7139
7175
|
dataLabel = /* @__PURE__ */ jsxRuntime.jsx(
|
|
7140
7176
|
"text",
|
|
7141
7177
|
{
|
|
@@ -7146,7 +7182,7 @@ function renderMapChart(element, chartData, categoryLabels) {
|
|
|
7146
7182
|
fontWeight: 600,
|
|
7147
7183
|
fill: "#1e293b",
|
|
7148
7184
|
style: { pointerEvents: "none" },
|
|
7149
|
-
children:
|
|
7185
|
+
children: chunkVKOVFVDJ_js.formatAxisValue(entry.value)
|
|
7150
7186
|
},
|
|
7151
7187
|
`${element.id}-map-dl-${region.code}`
|
|
7152
7188
|
);
|
|
@@ -7164,7 +7200,7 @@ function renderMapChart(element, chartData, categoryLabels) {
|
|
|
7164
7200
|
opacity: 0.9,
|
|
7165
7201
|
children: /* @__PURE__ */ jsxRuntime.jsxs("title", { children: [
|
|
7166
7202
|
region.name,
|
|
7167
|
-
entry ? `: ${
|
|
7203
|
+
entry ? `: ${chunkVKOVFVDJ_js.formatAxisValue(entry.value)}` : ""
|
|
7168
7204
|
] })
|
|
7169
7205
|
}
|
|
7170
7206
|
),
|
|
@@ -7202,7 +7238,7 @@ function renderMapChart(element, chartData, categoryLabels) {
|
|
|
7202
7238
|
fontSize: 7,
|
|
7203
7239
|
fill: "#64748b",
|
|
7204
7240
|
textAnchor: "middle",
|
|
7205
|
-
children:
|
|
7241
|
+
children: chunkVKOVFVDJ_js.formatAxisValue(minVal)
|
|
7206
7242
|
},
|
|
7207
7243
|
`${element.id}-map-legend-min`
|
|
7208
7244
|
),
|
|
@@ -7214,7 +7250,7 @@ function renderMapChart(element, chartData, categoryLabels) {
|
|
|
7214
7250
|
fontSize: 7,
|
|
7215
7251
|
fill: "#64748b",
|
|
7216
7252
|
textAnchor: "middle",
|
|
7217
|
-
children:
|
|
7253
|
+
children: chunkVKOVFVDJ_js.formatAxisValue(maxVal)
|
|
7218
7254
|
},
|
|
7219
7255
|
`${element.id}-map-legend-max`
|
|
7220
7256
|
)
|
|
@@ -7233,7 +7269,7 @@ function renderMapChart(element, chartData, categoryLabels) {
|
|
|
7233
7269
|
textAnchor: "middle",
|
|
7234
7270
|
fontSize: 7,
|
|
7235
7271
|
fill: "#94a3b8",
|
|
7236
|
-
children:
|
|
7272
|
+
children: chunk2EFVXYNA_js.translationsEn["pptx.chart.additionalRegionsFallback"]
|
|
7237
7273
|
},
|
|
7238
7274
|
`${element.id}-map-ft-hdr`
|
|
7239
7275
|
)
|
|
@@ -7280,7 +7316,7 @@ function renderMapChart(element, chartData, categoryLabels) {
|
|
|
7280
7316
|
y,
|
|
7281
7317
|
fontSize,
|
|
7282
7318
|
fill: "#475569",
|
|
7283
|
-
children:
|
|
7319
|
+
children: chunkVKOVFVDJ_js.formatAxisValue(row.value)
|
|
7284
7320
|
},
|
|
7285
7321
|
`${element.id}-map-ft-val-${i}`
|
|
7286
7322
|
)
|
|
@@ -7351,7 +7387,7 @@ function renderStackedBarChart(element, _chartData, _categoryLabels) {
|
|
|
7351
7387
|
|
|
7352
7388
|
// src/viewer/utils/chart-overlay-utils.ts
|
|
7353
7389
|
function sColor(series, idx) {
|
|
7354
|
-
return
|
|
7390
|
+
return chunkVKOVFVDJ_js.seriesColor(series, idx);
|
|
7355
7391
|
}
|
|
7356
7392
|
function valToY(val, range, topY, bottomY) {
|
|
7357
7393
|
const usable = bottomY - topY;
|
|
@@ -7846,7 +7882,7 @@ function renderLegend(id, style, series, layout, colorPalette) {
|
|
|
7846
7882
|
width: 10,
|
|
7847
7883
|
height: 10,
|
|
7848
7884
|
rx: 2,
|
|
7849
|
-
fill:
|
|
7885
|
+
fill: chunkVKOVFVDJ_js.seriesColor(s, i, style?.styleId, colorPalette)
|
|
7850
7886
|
},
|
|
7851
7887
|
`${id}-leg-r-${i}`
|
|
7852
7888
|
)
|
|
@@ -7870,7 +7906,7 @@ function renderLegend(id, style, series, layout, colorPalette) {
|
|
|
7870
7906
|
width: 10,
|
|
7871
7907
|
height: 10,
|
|
7872
7908
|
rx: 2,
|
|
7873
|
-
fill:
|
|
7909
|
+
fill: chunkVKOVFVDJ_js.seriesColor(s, i, style?.styleId, colorPalette)
|
|
7874
7910
|
}
|
|
7875
7911
|
),
|
|
7876
7912
|
/* @__PURE__ */ jsxRuntime.jsx("text", { x: x + 14, y: cy + 8, fontSize: 9, fill: "#475569", children: s.name || `Series ${i + 1}` })
|
|
@@ -7883,9 +7919,9 @@ function renderGridlines(id, style, range, layout) {
|
|
|
7883
7919
|
}
|
|
7884
7920
|
const lines = [];
|
|
7885
7921
|
if (range.logScale && range.logBase) {
|
|
7886
|
-
const ticks =
|
|
7922
|
+
const ticks = chunkVKOVFVDJ_js.generateLogTicks(range);
|
|
7887
7923
|
ticks.forEach((tickVal, i) => {
|
|
7888
|
-
const y =
|
|
7924
|
+
const y = chunkVKOVFVDJ_js.valueToY(tickVal, range, layout.plotTop, layout.plotBottom);
|
|
7889
7925
|
lines.push(
|
|
7890
7926
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7891
7927
|
"line",
|
|
@@ -7906,7 +7942,7 @@ function renderGridlines(id, style, range, layout) {
|
|
|
7906
7942
|
const steps = 4;
|
|
7907
7943
|
for (let i = 0; i <= steps; i++) {
|
|
7908
7944
|
const val = range.min + range.span * i / steps;
|
|
7909
|
-
const y =
|
|
7945
|
+
const y = chunkVKOVFVDJ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
|
|
7910
7946
|
lines.push(
|
|
7911
7947
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7912
7948
|
"line",
|
|
@@ -7930,9 +7966,9 @@ function renderValueAxis(id, range, layout, axisFormatting) {
|
|
|
7930
7966
|
const labels = [];
|
|
7931
7967
|
const hasDisplayUnits = Boolean(axisFormatting?.displayUnits);
|
|
7932
7968
|
if (range.logScale && range.logBase) {
|
|
7933
|
-
const ticks =
|
|
7969
|
+
const ticks = chunkVKOVFVDJ_js.generateLogTicks(range);
|
|
7934
7970
|
ticks.forEach((tickVal, i) => {
|
|
7935
|
-
const y =
|
|
7971
|
+
const y = chunkVKOVFVDJ_js.valueToY(tickVal, range, layout.plotTop, layout.plotBottom);
|
|
7936
7972
|
labels.push(
|
|
7937
7973
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7938
7974
|
"text",
|
|
@@ -7942,7 +7978,7 @@ function renderValueAxis(id, range, layout, axisFormatting) {
|
|
|
7942
7978
|
textAnchor: "end",
|
|
7943
7979
|
fontSize: 8,
|
|
7944
7980
|
fill: "#64748b",
|
|
7945
|
-
children: hasDisplayUnits ?
|
|
7981
|
+
children: hasDisplayUnits ? chunkVKOVFVDJ_js.formatAxisValueWithUnits(tickVal, axisFormatting) : chunkVKOVFVDJ_js.formatAxisValue(tickVal)
|
|
7946
7982
|
},
|
|
7947
7983
|
`${id}-vaxis-log-${i}`
|
|
7948
7984
|
)
|
|
@@ -7952,7 +7988,7 @@ function renderValueAxis(id, range, layout, axisFormatting) {
|
|
|
7952
7988
|
const steps = 4;
|
|
7953
7989
|
for (let i = 0; i <= steps; i++) {
|
|
7954
7990
|
const val = range.min + range.span * i / steps;
|
|
7955
|
-
const y =
|
|
7991
|
+
const y = chunkVKOVFVDJ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
|
|
7956
7992
|
labels.push(
|
|
7957
7993
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7958
7994
|
"text",
|
|
@@ -7962,7 +7998,7 @@ function renderValueAxis(id, range, layout, axisFormatting) {
|
|
|
7962
7998
|
textAnchor: "end",
|
|
7963
7999
|
fontSize: 8,
|
|
7964
8000
|
fill: "#64748b",
|
|
7965
|
-
children: hasDisplayUnits ?
|
|
8001
|
+
children: hasDisplayUnits ? chunkVKOVFVDJ_js.formatAxisValueWithUnits(val, axisFormatting) : chunkVKOVFVDJ_js.formatAxisValue(val)
|
|
7966
8002
|
},
|
|
7967
8003
|
`${id}-vaxis-${i}`
|
|
7968
8004
|
)
|
|
@@ -7970,7 +8006,7 @@ function renderValueAxis(id, range, layout, axisFormatting) {
|
|
|
7970
8006
|
}
|
|
7971
8007
|
}
|
|
7972
8008
|
if (hasDisplayUnits) {
|
|
7973
|
-
const unitLabel =
|
|
8009
|
+
const unitLabel = chunkVKOVFVDJ_js.getDisplayUnitLabel(
|
|
7974
8010
|
axisFormatting.displayUnits,
|
|
7975
8011
|
axisFormatting.displayUnitsLabel
|
|
7976
8012
|
);
|
|
@@ -8045,7 +8081,7 @@ function renderZeroLine(id, range, layout) {
|
|
|
8045
8081
|
if (range.min >= 0) {
|
|
8046
8082
|
return null;
|
|
8047
8083
|
}
|
|
8048
|
-
const y =
|
|
8084
|
+
const y = chunkVKOVFVDJ_js.valueToY(0, range, layout.plotTop, layout.plotBottom);
|
|
8049
8085
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8050
8086
|
"line",
|
|
8051
8087
|
{
|
|
@@ -8069,7 +8105,7 @@ function renderSecondaryValueAxis(id, range, layout, axisFormatting) {
|
|
|
8069
8105
|
const hasDisplayUnits = Boolean(axisFormatting?.displayUnits);
|
|
8070
8106
|
for (let i = 0; i <= steps; i++) {
|
|
8071
8107
|
const val = range.min + range.span * i / steps;
|
|
8072
|
-
const y =
|
|
8108
|
+
const y = chunkVKOVFVDJ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
|
|
8073
8109
|
labels.push(
|
|
8074
8110
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8075
8111
|
"text",
|
|
@@ -8081,7 +8117,7 @@ function renderSecondaryValueAxis(id, range, layout, axisFormatting) {
|
|
|
8081
8117
|
fontFamily,
|
|
8082
8118
|
fontWeight,
|
|
8083
8119
|
fill: fontColor,
|
|
8084
|
-
children: hasDisplayUnits ?
|
|
8120
|
+
children: hasDisplayUnits ? chunkVKOVFVDJ_js.formatAxisValueWithUnits(val, axisFormatting) : chunkVKOVFVDJ_js.formatAxisValue(val)
|
|
8085
8121
|
},
|
|
8086
8122
|
`${id}-sec-vaxis-${i}`
|
|
8087
8123
|
)
|
|
@@ -8105,7 +8141,7 @@ function renderSecondaryValueAxis(id, range, layout, axisFormatting) {
|
|
|
8105
8141
|
);
|
|
8106
8142
|
}
|
|
8107
8143
|
if (hasDisplayUnits) {
|
|
8108
|
-
const unitLabel =
|
|
8144
|
+
const unitLabel = chunkVKOVFVDJ_js.getDisplayUnitLabel(
|
|
8109
8145
|
axisFormatting.displayUnits,
|
|
8110
8146
|
axisFormatting.displayUnitsLabel
|
|
8111
8147
|
);
|
|
@@ -8136,7 +8172,7 @@ function renderSecondaryAxisTicks(id, range, layout) {
|
|
|
8136
8172
|
const ticks = [];
|
|
8137
8173
|
for (let i = 0; i <= steps; i++) {
|
|
8138
8174
|
const val = range.min + range.span * i / steps;
|
|
8139
|
-
const y =
|
|
8175
|
+
const y = chunkVKOVFVDJ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
|
|
8140
8176
|
ticks.push(
|
|
8141
8177
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8142
8178
|
"line",
|
|
@@ -8163,7 +8199,7 @@ function renderSecondaryGridlines(id, range, layout, axisFormatting) {
|
|
|
8163
8199
|
const gridColor = axisFormatting.majorGridlinesSpPr?.strokeColor ?? "#e2e8f0";
|
|
8164
8200
|
for (let i = 0; i <= steps; i++) {
|
|
8165
8201
|
const val = range.min + range.span * i / steps;
|
|
8166
|
-
const y =
|
|
8202
|
+
const y = chunkVKOVFVDJ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
|
|
8167
8203
|
lines.push(
|
|
8168
8204
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8169
8205
|
"line",
|
|
@@ -8280,7 +8316,7 @@ function renderChartDataTable(elementId, chartData, svgWidth) {
|
|
|
8280
8316
|
showK && /* @__PURE__ */ jsxRuntime.jsx(
|
|
8281
8317
|
"th",
|
|
8282
8318
|
{
|
|
8283
|
-
"aria-label":
|
|
8319
|
+
"aria-label": chunk2EFVXYNA_js.translationsEn["pptx.chart.rowLabelsAria"],
|
|
8284
8320
|
style: {
|
|
8285
8321
|
padding: "1px 4px",
|
|
8286
8322
|
fontWeight: 400,
|
|
@@ -8324,7 +8360,7 @@ function renderChartDataTable(elementId, chartData, svgWidth) {
|
|
|
8324
8360
|
width: 8,
|
|
8325
8361
|
height: 8,
|
|
8326
8362
|
borderRadius: 2,
|
|
8327
|
-
backgroundColor:
|
|
8363
|
+
backgroundColor: chunkVKOVFVDJ_js.seriesColor(
|
|
8328
8364
|
s,
|
|
8329
8365
|
si,
|
|
8330
8366
|
chartData.style?.styleId,
|
|
@@ -8363,8 +8399,8 @@ function renderChartDataTable(elementId, chartData, svgWidth) {
|
|
|
8363
8399
|
function renderStockChart(element, chartData, categoryLabels) {
|
|
8364
8400
|
const style = chartData.style;
|
|
8365
8401
|
const legendPos = style?.legendPosition || "b";
|
|
8366
|
-
const range =
|
|
8367
|
-
const layout =
|
|
8402
|
+
const range = chunkVKOVFVDJ_js.computeValueRangeForChart(chartData.series, chartData.axes);
|
|
8403
|
+
const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, true, legendPos);
|
|
8368
8404
|
const catCount = Math.max(categoryLabels.length, 1);
|
|
8369
8405
|
const barGroupWidth = layout.plotWidth / catCount;
|
|
8370
8406
|
const candleWidth = barGroupWidth * 0.5;
|
|
@@ -8385,10 +8421,10 @@ function renderStockChart(element, chartData, categoryLabels) {
|
|
|
8385
8421
|
const close = closeSeries.values[ci] ?? high;
|
|
8386
8422
|
const isUp = close >= open;
|
|
8387
8423
|
const cx = layout.plotLeft + barGroupWidth * ci + barGroupWidth / 2;
|
|
8388
|
-
const highY =
|
|
8389
|
-
const lowY =
|
|
8390
|
-
const openY =
|
|
8391
|
-
const closeY =
|
|
8424
|
+
const highY = chunkVKOVFVDJ_js.valueToY(high, range, layout.plotTop, layout.plotBottom);
|
|
8425
|
+
const lowY = chunkVKOVFVDJ_js.valueToY(low, range, layout.plotTop, layout.plotBottom);
|
|
8426
|
+
const openY = chunkVKOVFVDJ_js.valueToY(open, range, layout.plotTop, layout.plotBottom);
|
|
8427
|
+
const closeY = chunkVKOVFVDJ_js.valueToY(close, range, layout.plotTop, layout.plotBottom);
|
|
8392
8428
|
elements.push(
|
|
8393
8429
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8394
8430
|
"line",
|
|
@@ -8431,7 +8467,7 @@ function renderStockChart(element, chartData, categoryLabels) {
|
|
|
8431
8467
|
textAnchor: "middle",
|
|
8432
8468
|
fontSize: 7,
|
|
8433
8469
|
fill: "#334155",
|
|
8434
|
-
children:
|
|
8470
|
+
children: chunkVKOVFVDJ_js.formatAxisValue(close)
|
|
8435
8471
|
},
|
|
8436
8472
|
`${element.id}-stock-dl-${ci}`
|
|
8437
8473
|
)
|
|
@@ -8473,7 +8509,7 @@ function FailedToLoad() {
|
|
|
8473
8509
|
var LazySurfaceChart3DScene = React3__default.default.lazy(
|
|
8474
8510
|
async () => {
|
|
8475
8511
|
try {
|
|
8476
|
-
return await import('./SurfaceChart3DScene-
|
|
8512
|
+
return await import('./SurfaceChart3DScene-UFFJ3P6T.js');
|
|
8477
8513
|
} catch {
|
|
8478
8514
|
return { default: FailedToLoad };
|
|
8479
8515
|
}
|
|
@@ -8497,7 +8533,7 @@ var SurfaceChart3DErrorBoundary = class extends React3__default.default.Componen
|
|
|
8497
8533
|
function buildSurfaceData(chartData, categoryLabels) {
|
|
8498
8534
|
const rows = chartData.series.length;
|
|
8499
8535
|
const cols = Math.max(categoryLabels.length, 1);
|
|
8500
|
-
const range =
|
|
8536
|
+
const range = chunkVKOVFVDJ_js.computeValueRangeForChart(chartData.series, chartData.axes);
|
|
8501
8537
|
const heightMap = new Float32Array(rows * cols);
|
|
8502
8538
|
const colorMap = new Float32Array(rows * cols * 3);
|
|
8503
8539
|
for (let r = 0; r < rows; r++) {
|
|
@@ -8617,8 +8653,8 @@ function darkenRgb(r, g, b, factor) {
|
|
|
8617
8653
|
function renderIsometricSurfaceChart(element, chartData, categoryLabels) {
|
|
8618
8654
|
const style = chartData.style;
|
|
8619
8655
|
const legendPos = style?.legendPosition || "b";
|
|
8620
|
-
const layout =
|
|
8621
|
-
const range =
|
|
8656
|
+
const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, false, legendPos);
|
|
8657
|
+
const range = chunkVKOVFVDJ_js.computeValueRangeForChart(chartData.series, chartData.axes);
|
|
8622
8658
|
const catCount = Math.max(categoryLabels.length, 1);
|
|
8623
8659
|
const seriesCount = chartData.series.length;
|
|
8624
8660
|
const cols = catCount - 1;
|
|
@@ -8708,8 +8744,8 @@ function renderIsometricSurfaceChart(element, chartData, categoryLabels) {
|
|
|
8708
8744
|
function renderFlatSurfaceChart(element, chartData, categoryLabels) {
|
|
8709
8745
|
const style = chartData.style;
|
|
8710
8746
|
const legendPos = style?.legendPosition || "b";
|
|
8711
|
-
const layout =
|
|
8712
|
-
const range =
|
|
8747
|
+
const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, true, legendPos);
|
|
8748
|
+
const range = chunkVKOVFVDJ_js.computeValueRangeForChart(chartData.series, chartData.axes);
|
|
8713
8749
|
const catCount = Math.max(categoryLabels.length, 1);
|
|
8714
8750
|
const seriesCount = chartData.series.length;
|
|
8715
8751
|
const cellW = layout.plotWidth / Math.max(catCount - 1, 1);
|
|
@@ -8772,7 +8808,7 @@ function renderSurfaceChart(element, chartData, categoryLabels) {
|
|
|
8772
8808
|
function renderTreemapChart(element, chartData, categoryLabels) {
|
|
8773
8809
|
const style = chartData.style;
|
|
8774
8810
|
const legendPos = style?.legendPosition || "b";
|
|
8775
|
-
const layout =
|
|
8811
|
+
const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, false, legendPos);
|
|
8776
8812
|
const allValues = chartData.series.flatMap((s) => s.values);
|
|
8777
8813
|
const totalAbs = allValues.reduce((sum, v) => sum + Math.abs(v), 0) || 1;
|
|
8778
8814
|
const rects = [];
|
|
@@ -8795,7 +8831,7 @@ function renderTreemapChart(element, chartData, categoryLabels) {
|
|
|
8795
8831
|
y: curY,
|
|
8796
8832
|
width: Math.max(w - 1, 1),
|
|
8797
8833
|
height: Math.max(h - 1, 1),
|
|
8798
|
-
fill:
|
|
8834
|
+
fill: chunkVKOVFVDJ_js.paletteColor(item.index, chartData.style?.styleId, chartData.colorPalette),
|
|
8799
8835
|
rx: 2,
|
|
8800
8836
|
opacity: 0.85
|
|
8801
8837
|
},
|
|
@@ -8848,8 +8884,8 @@ function renderWaterfallChart(element, chartData, categoryLabels) {
|
|
|
8848
8884
|
const style = chartData.style;
|
|
8849
8885
|
const legendPos = style?.legendPosition || "b";
|
|
8850
8886
|
const values = chartData.series[0]?.values ?? [];
|
|
8851
|
-
const range =
|
|
8852
|
-
const layout =
|
|
8887
|
+
const range = chunkVKOVFVDJ_js.computeValueRangeForChart(chartData.series, chartData.axes);
|
|
8888
|
+
const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, true, legendPos);
|
|
8853
8889
|
const catCount = Math.max(categoryLabels.length, values.length, 1);
|
|
8854
8890
|
const barWidth = layout.plotWidth / catCount * 0.6;
|
|
8855
8891
|
const gap = layout.plotWidth / catCount * 0.2;
|
|
@@ -8860,8 +8896,8 @@ function renderWaterfallChart(element, chartData, categoryLabels) {
|
|
|
8860
8896
|
const isLast = i === values.length - 1;
|
|
8861
8897
|
const startVal = isLast ? 0 : runningTotal;
|
|
8862
8898
|
const endVal = isLast ? runningTotal + val : runningTotal + val;
|
|
8863
|
-
const barStartY =
|
|
8864
|
-
const barEndY =
|
|
8899
|
+
const barStartY = chunkVKOVFVDJ_js.valueToY(startVal, range, layout.plotTop, layout.plotBottom);
|
|
8900
|
+
const barEndY = chunkVKOVFVDJ_js.valueToY(endVal, range, layout.plotTop, layout.plotBottom);
|
|
8865
8901
|
const x = layout.plotLeft + layout.plotWidth / catCount * i + gap;
|
|
8866
8902
|
const y = Math.min(barStartY, barEndY);
|
|
8867
8903
|
const h = Math.max(Math.abs(barEndY - barStartY), 1);
|
|
@@ -8890,7 +8926,7 @@ function renderWaterfallChart(element, chartData, categoryLabels) {
|
|
|
8890
8926
|
textAnchor: "middle",
|
|
8891
8927
|
fontSize: 7,
|
|
8892
8928
|
fill: "#334155",
|
|
8893
|
-
children:
|
|
8929
|
+
children: chunkVKOVFVDJ_js.formatAxisValue(isLast ? endVal : val)
|
|
8894
8930
|
},
|
|
8895
8931
|
`${element.id}-wf-dl-${i}`
|
|
8896
8932
|
)
|
|
@@ -8938,18 +8974,18 @@ function renderWaterfallChart(element, chartData, categoryLabels) {
|
|
|
8938
8974
|
function renderComboChart(element, chartData, categoryLabels) {
|
|
8939
8975
|
const style = chartData.style;
|
|
8940
8976
|
const legendPos = style?.legendPosition || "b";
|
|
8941
|
-
const layoutOpts =
|
|
8977
|
+
const layoutOpts = chunkVKOVFVDJ_js.computeLayoutOptions(
|
|
8942
8978
|
chartData.axes,
|
|
8943
8979
|
chartData.dataTable,
|
|
8944
8980
|
chartData.series.length
|
|
8945
8981
|
);
|
|
8946
|
-
const layout =
|
|
8947
|
-
const { primary, secondary } =
|
|
8982
|
+
const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, true, legendPos, layoutOpts);
|
|
8983
|
+
const { primary, secondary } = chunkVKOVFVDJ_js.splitSeriesByAxis(chartData.series, chartData.axes);
|
|
8948
8984
|
const primarySeries = primary.length > 0 ? primary.map((e) => e.series) : chartData.series;
|
|
8949
8985
|
const secondarySeries = secondary.map((e) => e.series);
|
|
8950
|
-
const range =
|
|
8951
|
-
const secondaryRange = secondarySeries.length > 0 ?
|
|
8952
|
-
const secondaryAxisFmt =
|
|
8986
|
+
const range = chunkVKOVFVDJ_js.computeValueRangeForChart(primarySeries, chartData.axes);
|
|
8987
|
+
const secondaryRange = secondarySeries.length > 0 ? chunkVKOVFVDJ_js.computeValueRange(secondarySeries) : void 0;
|
|
8988
|
+
const secondaryAxisFmt = chunkVKOVFVDJ_js.getSecondaryValueAxis(chartData.axes);
|
|
8953
8989
|
const catCount = Math.max(categoryLabels.length, 1);
|
|
8954
8990
|
const barSeriesCount = 1;
|
|
8955
8991
|
const barGroupWidth = layout.plotWidth / catCount;
|
|
@@ -8965,8 +9001,8 @@ function renderComboChart(element, chartData, categoryLabels) {
|
|
|
8965
9001
|
const barRange = isBarSecondary && secondaryRange ? secondaryRange : range;
|
|
8966
9002
|
barSeries.values.forEach((val, vi) => {
|
|
8967
9003
|
const x = layout.plotLeft + barGroupWidth * vi + barOffset;
|
|
8968
|
-
const zeroY =
|
|
8969
|
-
const valY =
|
|
9004
|
+
const zeroY = chunkVKOVFVDJ_js.valueToY(0, barRange, layout.plotTop, layout.plotBottom);
|
|
9005
|
+
const valY = chunkVKOVFVDJ_js.valueToY(val, barRange, layout.plotTop, layout.plotBottom);
|
|
8970
9006
|
const y = Math.min(zeroY, valY);
|
|
8971
9007
|
const h = Math.max(Math.abs(zeroY - valY), 1);
|
|
8972
9008
|
barElements.push(
|
|
@@ -8977,7 +9013,7 @@ function renderComboChart(element, chartData, categoryLabels) {
|
|
|
8977
9013
|
y,
|
|
8978
9014
|
width: barWidth,
|
|
8979
9015
|
height: h,
|
|
8980
|
-
fill:
|
|
9016
|
+
fill: chunkVKOVFVDJ_js.seriesColor(barSeries, 0, chartData.style?.styleId, chartData.colorPalette),
|
|
8981
9017
|
rx: 1
|
|
8982
9018
|
},
|
|
8983
9019
|
`${element.id}-combo-bar-${vi}`
|
|
@@ -8993,7 +9029,7 @@ function renderComboChart(element, chartData, categoryLabels) {
|
|
|
8993
9029
|
textAnchor: "middle",
|
|
8994
9030
|
fontSize: 7,
|
|
8995
9031
|
fill: "#334155",
|
|
8996
|
-
children:
|
|
9032
|
+
children: chunkVKOVFVDJ_js.formatAxisValue(val)
|
|
8997
9033
|
},
|
|
8998
9034
|
`${element.id}-combo-bar-dl-${vi}`
|
|
8999
9035
|
)
|
|
@@ -9010,10 +9046,10 @@ function renderComboChart(element, chartData, categoryLabels) {
|
|
|
9010
9046
|
const activeRange = isSecondary && secondaryRange ? secondaryRange : range;
|
|
9011
9047
|
const points = series.values.map((val, vi) => {
|
|
9012
9048
|
const x = layout.plotLeft + barGroupWidth * vi + barGroupWidth / 2;
|
|
9013
|
-
const y =
|
|
9049
|
+
const y = chunkVKOVFVDJ_js.valueToY(val, activeRange, layout.plotTop, layout.plotBottom);
|
|
9014
9050
|
return { x, y, val };
|
|
9015
9051
|
});
|
|
9016
|
-
const c =
|
|
9052
|
+
const c = chunkVKOVFVDJ_js.seriesColor(series, seriesIdx, chartData.style?.styleId, chartData.colorPalette);
|
|
9017
9053
|
lineElements.push(
|
|
9018
9054
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9019
9055
|
"polyline",
|
|
@@ -9040,7 +9076,7 @@ function renderComboChart(element, chartData, categoryLabels) {
|
|
|
9040
9076
|
textAnchor: "middle",
|
|
9041
9077
|
fontSize: 7,
|
|
9042
9078
|
fill: "#334155",
|
|
9043
|
-
children:
|
|
9079
|
+
children: chunkVKOVFVDJ_js.formatAxisValue(p.val)
|
|
9044
9080
|
},
|
|
9045
9081
|
`${element.id}-combo-line-dl-${si}-${vi}`
|
|
9046
9082
|
)
|
|
@@ -9078,11 +9114,11 @@ function renderComboChart(element, chartData, categoryLabels) {
|
|
|
9078
9114
|
}
|
|
9079
9115
|
function renderChartElement(element) {
|
|
9080
9116
|
if (element.type !== "chart") {
|
|
9081
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children:
|
|
9117
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk2EFVXYNA_js.translationsEn["pptx.chart.heading"] });
|
|
9082
9118
|
}
|
|
9083
9119
|
const chartData = element.chartData;
|
|
9084
9120
|
if (!chartData || chartData.series.length === 0) {
|
|
9085
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children:
|
|
9121
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk2EFVXYNA_js.translationsEn["pptx.chart.heading"] });
|
|
9086
9122
|
}
|
|
9087
9123
|
const longestSeriesLength = chartData.series.reduce(
|
|
9088
9124
|
(maxLength, series) => Math.max(maxLength, series.values.length),
|
|
@@ -10599,7 +10635,7 @@ function PresentationMediaController({
|
|
|
10599
10635
|
}
|
|
10600
10636
|
function renderMediaElement(element, mediaDataUrls, options) {
|
|
10601
10637
|
if (element.type !== "media") {
|
|
10602
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children:
|
|
10638
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk2EFVXYNA_js.translationsEn["pptx.media.title"] });
|
|
10603
10639
|
}
|
|
10604
10640
|
const mediaType = element.mediaType;
|
|
10605
10641
|
const mediaPath = element.mediaPath;
|
|
@@ -10629,7 +10665,7 @@ function renderMediaElement(element, mediaDataUrls, options) {
|
|
|
10629
10665
|
"img",
|
|
10630
10666
|
{
|
|
10631
10667
|
src: posterUrl,
|
|
10632
|
-
alt:
|
|
10668
|
+
alt: chunk2EFVXYNA_js.translationsEn["pptx.media.posterAlt"],
|
|
10633
10669
|
className: "w-full h-full object-contain opacity-50"
|
|
10634
10670
|
}
|
|
10635
10671
|
),
|
|
@@ -10650,7 +10686,7 @@ function renderMediaElement(element, mediaDataUrls, options) {
|
|
|
10650
10686
|
]
|
|
10651
10687
|
}
|
|
10652
10688
|
),
|
|
10653
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-white/60", children:
|
|
10689
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-white/60", children: chunk2EFVXYNA_js.translationsEn["pptx.media.notFound"] })
|
|
10654
10690
|
] })
|
|
10655
10691
|
] });
|
|
10656
10692
|
}
|
|
@@ -10691,7 +10727,7 @@ function renderMediaElement(element, mediaDataUrls, options) {
|
|
|
10691
10727
|
"img",
|
|
10692
10728
|
{
|
|
10693
10729
|
src: posterUrl,
|
|
10694
|
-
alt:
|
|
10730
|
+
alt: chunk2EFVXYNA_js.translationsEn["pptx.media.videoPosterAlt"],
|
|
10695
10731
|
className: "w-full h-full object-contain"
|
|
10696
10732
|
}
|
|
10697
10733
|
),
|
|
@@ -10794,14 +10830,14 @@ function buildNotesPdf(pages) {
|
|
|
10794
10830
|
notes: page.notes,
|
|
10795
10831
|
slideNumber: page.slideNumber
|
|
10796
10832
|
}));
|
|
10797
|
-
const bytes =
|
|
10833
|
+
const bytes = chunkVKOVFVDJ_js.buildNotesPdfBytes(images, meta);
|
|
10798
10834
|
const blob = new Blob([bytes], { type: "application/pdf" });
|
|
10799
10835
|
return URL.createObjectURL(blob);
|
|
10800
10836
|
}
|
|
10801
10837
|
|
|
10802
10838
|
// src/viewer/utils/pdf-builder-slides.ts
|
|
10803
10839
|
function buildPdfFromImageData(images) {
|
|
10804
|
-
const bytes =
|
|
10840
|
+
const bytes = chunkVKOVFVDJ_js.buildSlidesPdfBytes(images);
|
|
10805
10841
|
const blob = new Blob([bytes], { type: "application/pdf" });
|
|
10806
10842
|
return URL.createObjectURL(blob);
|
|
10807
10843
|
}
|
|
@@ -10810,7 +10846,7 @@ function buildPdfFromImageData(images) {
|
|
|
10810
10846
|
var activePreview = null;
|
|
10811
10847
|
function startPreviewAnimation(elementId, preset, options) {
|
|
10812
10848
|
stopPreviewAnimation();
|
|
10813
|
-
const descriptor =
|
|
10849
|
+
const descriptor = chunkVKOVFVDJ_js.buildPreviewAnimation(preset, options);
|
|
10814
10850
|
if (!descriptor) {
|
|
10815
10851
|
return;
|
|
10816
10852
|
}
|
|
@@ -10888,7 +10924,7 @@ function useElementOperations(input) {
|
|
|
10888
10924
|
}, [applySelection, setInlineEditingElementId, setContextMenuState]);
|
|
10889
10925
|
const updateElementById = React3.useCallback(
|
|
10890
10926
|
(elementId, updates) => {
|
|
10891
|
-
if (
|
|
10927
|
+
if (chunkVKOVFVDJ_js.isTemplateElementId(elementId)) {
|
|
10892
10928
|
const slideId = activeSlide?.id;
|
|
10893
10929
|
if (slideId) {
|
|
10894
10930
|
setTemplateElementsBySlideId((prev) => ({
|
|
@@ -10942,14 +10978,14 @@ function useElementOperations(input) {
|
|
|
10942
10978
|
if (!selectedElement || !chunkKV3EOLP3_js.hasTextProperties(selectedElement)) {
|
|
10943
10979
|
return;
|
|
10944
10980
|
}
|
|
10945
|
-
const inlineSel =
|
|
10981
|
+
const inlineSel = chunkVKOVFVDJ_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
10946
10982
|
if (inlineSel && selectedElement.textSegments) {
|
|
10947
|
-
const { newSegments: newSegments2, newSelection } =
|
|
10983
|
+
const { newSegments: newSegments2, newSelection } = chunkVKOVFVDJ_js.applyStyleToSelectedSegments(
|
|
10948
10984
|
selectedElement.textSegments,
|
|
10949
10985
|
inlineSel,
|
|
10950
10986
|
updates
|
|
10951
10987
|
);
|
|
10952
|
-
|
|
10988
|
+
chunkVKOVFVDJ_js.setPendingSelectionRestore(newSelection);
|
|
10953
10989
|
updateSelectedElement({
|
|
10954
10990
|
textSegments: newSegments2
|
|
10955
10991
|
});
|
|
@@ -10972,9 +11008,9 @@ function useElementOperations(input) {
|
|
|
10972
11008
|
if (!selectedElement || !chunkKV3EOLP3_js.hasTextProperties(selectedElement)) {
|
|
10973
11009
|
return;
|
|
10974
11010
|
}
|
|
10975
|
-
const inlineSel =
|
|
11011
|
+
const inlineSel = chunkVKOVFVDJ_js.getInlineEditorSelection(selectedElement.textSegments);
|
|
10976
11012
|
if (inlineSel && selectedElement.textSegments) {
|
|
10977
|
-
const newSegments =
|
|
11013
|
+
const newSegments = chunkVKOVFVDJ_js.applyCaseTransformToSegments(
|
|
10978
11014
|
selectedElement.textSegments,
|
|
10979
11015
|
inlineSel,
|
|
10980
11016
|
mode
|
|
@@ -10984,14 +11020,14 @@ function useElementOperations(input) {
|
|
|
10984
11020
|
}
|
|
10985
11021
|
const updates = {};
|
|
10986
11022
|
if (selectedElement.textSegments && selectedElement.textSegments.length > 0) {
|
|
10987
|
-
updates.textSegments =
|
|
11023
|
+
updates.textSegments = chunkVKOVFVDJ_js.applyCaseTransformToSegments(
|
|
10988
11024
|
selectedElement.textSegments,
|
|
10989
11025
|
null,
|
|
10990
11026
|
mode
|
|
10991
11027
|
);
|
|
10992
11028
|
}
|
|
10993
11029
|
if (typeof selectedElement.text === "string") {
|
|
10994
|
-
updates.text =
|
|
11030
|
+
updates.text = chunkVKOVFVDJ_js.transformTextCase(selectedElement.text, mode);
|
|
10995
11031
|
}
|
|
10996
11032
|
updateSelectedElement(updates);
|
|
10997
11033
|
},
|
|
@@ -11046,7 +11082,7 @@ function useSectionOperations(input) {
|
|
|
11046
11082
|
const { sections, setSections, slides, setSlides, markDirty } = input;
|
|
11047
11083
|
const addSection2 = React3.useCallback(
|
|
11048
11084
|
(name, afterSlideIndex) => {
|
|
11049
|
-
const result =
|
|
11085
|
+
const result = chunkVKOVFVDJ_js.addSection(sections, slides, name, afterSlideIndex);
|
|
11050
11086
|
setSlides(result.slides);
|
|
11051
11087
|
setSections(result.sections);
|
|
11052
11088
|
markDirty();
|
|
@@ -11055,7 +11091,7 @@ function useSectionOperations(input) {
|
|
|
11055
11091
|
);
|
|
11056
11092
|
const renameSection2 = React3.useCallback(
|
|
11057
11093
|
(sectionId, newName) => {
|
|
11058
|
-
const result =
|
|
11094
|
+
const result = chunkVKOVFVDJ_js.renameSection(sections, slides, sectionId, newName);
|
|
11059
11095
|
setSections(result.sections);
|
|
11060
11096
|
setSlides(result.slides);
|
|
11061
11097
|
markDirty();
|
|
@@ -11064,7 +11100,7 @@ function useSectionOperations(input) {
|
|
|
11064
11100
|
);
|
|
11065
11101
|
const deleteSection2 = React3.useCallback(
|
|
11066
11102
|
(sectionId) => {
|
|
11067
|
-
const result =
|
|
11103
|
+
const result = chunkVKOVFVDJ_js.deleteSection(sections, slides, sectionId);
|
|
11068
11104
|
setSections(result.sections);
|
|
11069
11105
|
setSlides(result.slides);
|
|
11070
11106
|
markDirty();
|
|
@@ -11073,21 +11109,21 @@ function useSectionOperations(input) {
|
|
|
11073
11109
|
);
|
|
11074
11110
|
const moveSectionUp2 = React3.useCallback(
|
|
11075
11111
|
(sectionId) => {
|
|
11076
|
-
setSections(
|
|
11112
|
+
setSections(chunkVKOVFVDJ_js.moveSectionUp(sections, sectionId));
|
|
11077
11113
|
markDirty();
|
|
11078
11114
|
},
|
|
11079
11115
|
[sections, setSections, markDirty]
|
|
11080
11116
|
);
|
|
11081
11117
|
const moveSectionDown2 = React3.useCallback(
|
|
11082
11118
|
(sectionId) => {
|
|
11083
|
-
setSections(
|
|
11119
|
+
setSections(chunkVKOVFVDJ_js.moveSectionDown(sections, sectionId));
|
|
11084
11120
|
markDirty();
|
|
11085
11121
|
},
|
|
11086
11122
|
[sections, setSections, markDirty]
|
|
11087
11123
|
);
|
|
11088
11124
|
const moveSlidesToSection2 = React3.useCallback(
|
|
11089
11125
|
(slideIndexes, targetSectionId) => {
|
|
11090
|
-
const result =
|
|
11126
|
+
const result = chunkVKOVFVDJ_js.moveSlidesToSection(sections, slides, slideIndexes, targetSectionId);
|
|
11091
11127
|
setSlides(result.slides);
|
|
11092
11128
|
setSections(result.sections);
|
|
11093
11129
|
markDirty();
|
|
@@ -11106,7 +11142,7 @@ function useSectionOperations(input) {
|
|
|
11106
11142
|
|
|
11107
11143
|
// src/viewer/hooks/pointer-move-handlers.ts
|
|
11108
11144
|
function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx) {
|
|
11109
|
-
const resized =
|
|
11145
|
+
const resized = chunkVKOVFVDJ_js.applyResize(
|
|
11110
11146
|
{ x: startX, y: startY, width: startWidth, height: startHeight },
|
|
11111
11147
|
handle,
|
|
11112
11148
|
dx,
|
|
@@ -11118,7 +11154,7 @@ function computeResizeGeometry(handle, startX, startY, startWidth, startHeight,
|
|
|
11118
11154
|
if (!snapToGrid) {
|
|
11119
11155
|
return box;
|
|
11120
11156
|
}
|
|
11121
|
-
return
|
|
11157
|
+
return chunkVKOVFVDJ_js.snapBoxToGrid(box, handle, gridSpacingPx, MIN_ELEMENT_SIZE);
|
|
11122
11158
|
}
|
|
11123
11159
|
function computeAdjustmentValue(startAdjustment, dx, startWidth) {
|
|
11124
11160
|
const range = startWidth || 200;
|
|
@@ -11228,7 +11264,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
|
|
|
11228
11264
|
width: el.width,
|
|
11229
11265
|
height: el.height
|
|
11230
11266
|
}));
|
|
11231
|
-
const snapResult =
|
|
11267
|
+
const snapResult = chunkVKOVFVDJ_js.computeSnapToShape(
|
|
11232
11268
|
targetX,
|
|
11233
11269
|
targetY,
|
|
11234
11270
|
primaryEl.width,
|
|
@@ -11371,13 +11407,13 @@ function processPointerUp(input) {
|
|
|
11371
11407
|
if (i !== activeSlideIndex) {
|
|
11372
11408
|
return s;
|
|
11373
11409
|
}
|
|
11374
|
-
const rerouted =
|
|
11410
|
+
const rerouted = chunkVKOVFVDJ_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
|
|
11375
11411
|
if (rerouted.length === 0) {
|
|
11376
11412
|
return s;
|
|
11377
11413
|
}
|
|
11378
11414
|
return {
|
|
11379
11415
|
...s,
|
|
11380
|
-
elements:
|
|
11416
|
+
elements: chunkVKOVFVDJ_js.applyReroutedConnectors(s.elements, rerouted)
|
|
11381
11417
|
};
|
|
11382
11418
|
})
|
|
11383
11419
|
);
|
|
@@ -11396,9 +11432,9 @@ function processPointerUp(input) {
|
|
|
11396
11432
|
}
|
|
11397
11433
|
function commitMarquee(marquee, editTemplateMode, templateElements, activeSlide, applySelection, clearSelection) {
|
|
11398
11434
|
const sourceElements = editTemplateMode ? templateElements : activeSlide?.elements ?? [];
|
|
11399
|
-
const hitIds =
|
|
11435
|
+
const hitIds = chunkVKOVFVDJ_js.computeMarqueeHitIds(marquee, sourceElements);
|
|
11400
11436
|
if (marquee.additive) {
|
|
11401
|
-
const merged =
|
|
11437
|
+
const merged = chunkVKOVFVDJ_js.mergeAdditiveSelection(marquee.baseSelectionIds, hitIds);
|
|
11402
11438
|
if (merged.length > 0) {
|
|
11403
11439
|
applySelection(merged[0], merged);
|
|
11404
11440
|
} else {
|
|
@@ -11421,8 +11457,8 @@ function commitDrag(drag, editTemplateMode, activeSlide, activeSlideIndex, setTe
|
|
|
11421
11457
|
}
|
|
11422
11458
|
return { ...el, x: start.x + dx, y: start.y + dy };
|
|
11423
11459
|
});
|
|
11424
|
-
const rerouted =
|
|
11425
|
-
return
|
|
11460
|
+
const rerouted = chunkVKOVFVDJ_js.rerouteConnectorsForMovedElements(movedElements, movedIds);
|
|
11461
|
+
return chunkVKOVFVDJ_js.applyReroutedConnectors(movedElements, rerouted);
|
|
11426
11462
|
};
|
|
11427
11463
|
if (editTemplateMode) {
|
|
11428
11464
|
const slideId = activeSlide?.id;
|
|
@@ -11563,7 +11599,8 @@ function useCanvasInteractions(input) {
|
|
|
11563
11599
|
presentationHandleAction,
|
|
11564
11600
|
setEditingEquationOmml,
|
|
11565
11601
|
setIsEquationDialogOpen,
|
|
11566
|
-
setPointerCommitNonce
|
|
11602
|
+
setPointerCommitNonce,
|
|
11603
|
+
transformCommittedText
|
|
11567
11604
|
} = input;
|
|
11568
11605
|
const justSelectedRef = React3.useRef(false);
|
|
11569
11606
|
const handleInlineEditCommit = () => {
|
|
@@ -11573,9 +11610,10 @@ function useCanvasInteractions(input) {
|
|
|
11573
11610
|
}
|
|
11574
11611
|
const el = elementLookup.get(editId);
|
|
11575
11612
|
if (el && chunkKV3EOLP3_js.hasTextProperties(el)) {
|
|
11576
|
-
const
|
|
11613
|
+
const committedText = transformCommittedText ? transformCommittedText(inlineEditingText) : inlineEditingText;
|
|
11614
|
+
const newSegments = chunkVKOVFVDJ_js.remapTextToSegments(committedText, el.textSegments, el.textStyle);
|
|
11577
11615
|
ops.updateElementById(editId, {
|
|
11578
|
-
text:
|
|
11616
|
+
text: committedText,
|
|
11579
11617
|
textSegments: newSegments
|
|
11580
11618
|
});
|
|
11581
11619
|
history.markDirty();
|
|
@@ -11677,6 +11715,9 @@ function useCanvasInteractions(input) {
|
|
|
11677
11715
|
setSnapLines([]);
|
|
11678
11716
|
};
|
|
11679
11717
|
const handleElementContextMenu = (elementId, e) => {
|
|
11718
|
+
if (mode === "present") {
|
|
11719
|
+
return;
|
|
11720
|
+
}
|
|
11680
11721
|
e.preventDefault();
|
|
11681
11722
|
e.stopPropagation();
|
|
11682
11723
|
if (!selectedElementIdSet.has(elementId)) {
|
|
@@ -11819,7 +11860,7 @@ function createFileHandlers(deps) {
|
|
|
11819
11860
|
h = Math.round(h * scale);
|
|
11820
11861
|
}
|
|
11821
11862
|
addElement({
|
|
11822
|
-
id:
|
|
11863
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
11823
11864
|
type: "image",
|
|
11824
11865
|
x: Math.round((canvasSize.width - w) / 2),
|
|
11825
11866
|
y: Math.round((canvasSize.height - h) / 2),
|
|
@@ -11830,7 +11871,7 @@ function createFileHandlers(deps) {
|
|
|
11830
11871
|
};
|
|
11831
11872
|
img.onerror = () => {
|
|
11832
11873
|
addElement({
|
|
11833
|
-
id:
|
|
11874
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
11834
11875
|
type: "image",
|
|
11835
11876
|
x: 100,
|
|
11836
11877
|
y: 100,
|
|
@@ -11856,7 +11897,7 @@ function createFileHandlers(deps) {
|
|
|
11856
11897
|
const elFilePath = file.path;
|
|
11857
11898
|
const insertMediaElement = (mediaSourceUrl, width, height) => {
|
|
11858
11899
|
addElement({
|
|
11859
|
-
id:
|
|
11900
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
11860
11901
|
type: "media",
|
|
11861
11902
|
mediaType,
|
|
11862
11903
|
mediaMimeType: file.type || void 0,
|
|
@@ -12031,13 +12072,13 @@ function createStructuredElementHandlers(deps) {
|
|
|
12031
12072
|
return;
|
|
12032
12073
|
}
|
|
12033
12074
|
addElement({
|
|
12034
|
-
id:
|
|
12075
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
12035
12076
|
type: "smartArt",
|
|
12036
12077
|
x: 100,
|
|
12037
12078
|
y: 120,
|
|
12038
12079
|
width: 600,
|
|
12039
12080
|
height: 340,
|
|
12040
|
-
smartArtData:
|
|
12081
|
+
smartArtData: chunkVKOVFVDJ_js.buildSmartArtPresetData(
|
|
12041
12082
|
layout,
|
|
12042
12083
|
defaultItems,
|
|
12043
12084
|
(i) => `node-${Date.now()}-${i}-${Math.random().toString(36).slice(2, 8)}`
|
|
@@ -12049,7 +12090,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
12049
12090
|
return;
|
|
12050
12091
|
}
|
|
12051
12092
|
addElement({
|
|
12052
|
-
id:
|
|
12093
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
12053
12094
|
type: "shape",
|
|
12054
12095
|
x: 120,
|
|
12055
12096
|
y: 200,
|
|
@@ -12108,7 +12149,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
12108
12149
|
const displayText = value || fieldTexts[fieldType] || fieldType;
|
|
12109
12150
|
const fieldGuid = `{${crypto.randomUUID().toUpperCase()}}`;
|
|
12110
12151
|
addElement({
|
|
12111
|
-
id:
|
|
12152
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
12112
12153
|
type: "shape",
|
|
12113
12154
|
x: 120,
|
|
12114
12155
|
y: 200,
|
|
@@ -12130,7 +12171,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
12130
12171
|
if (!activeSlide) {
|
|
12131
12172
|
return;
|
|
12132
12173
|
}
|
|
12133
|
-
const preset =
|
|
12174
|
+
const preset = chunkVKOVFVDJ_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
|
|
12134
12175
|
if (!preset) {
|
|
12135
12176
|
return;
|
|
12136
12177
|
}
|
|
@@ -12143,7 +12184,7 @@ function createStructuredElementHandlers(deps) {
|
|
|
12143
12184
|
defaultPptxAction.highlightClick = true;
|
|
12144
12185
|
}
|
|
12145
12186
|
addElement({
|
|
12146
|
-
id:
|
|
12187
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
12147
12188
|
type: "shape",
|
|
12148
12189
|
x: 150,
|
|
12149
12190
|
y: 150,
|
|
@@ -12210,7 +12251,7 @@ function useInsertElements(input) {
|
|
|
12210
12251
|
return;
|
|
12211
12252
|
}
|
|
12212
12253
|
addElement({
|
|
12213
|
-
id:
|
|
12254
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
12214
12255
|
type: "text",
|
|
12215
12256
|
x: 100,
|
|
12216
12257
|
y: 100,
|
|
@@ -12225,7 +12266,7 @@ function useInsertElements(input) {
|
|
|
12225
12266
|
return;
|
|
12226
12267
|
}
|
|
12227
12268
|
addElement({
|
|
12228
|
-
id:
|
|
12269
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
12229
12270
|
type: "shape",
|
|
12230
12271
|
x: 150,
|
|
12231
12272
|
y: 150,
|
|
@@ -12244,15 +12285,15 @@ function useInsertElements(input) {
|
|
|
12244
12285
|
return;
|
|
12245
12286
|
}
|
|
12246
12287
|
addElement({
|
|
12247
|
-
...
|
|
12248
|
-
id:
|
|
12288
|
+
...chunkVKOVFVDJ_js.newTableElement(DEFAULT_TABLE_ROWS, DEFAULT_TABLE_COLUMNS, 100, 200),
|
|
12289
|
+
id: chunkVKOVFVDJ_js.generateElementId()
|
|
12249
12290
|
});
|
|
12250
12291
|
};
|
|
12251
12292
|
const handleAddChart = (chartType) => {
|
|
12252
12293
|
if (!activeSlide) {
|
|
12253
12294
|
return;
|
|
12254
12295
|
}
|
|
12255
|
-
addElement(
|
|
12296
|
+
addElement(chunkVKOVFVDJ_js.createDefaultChartElement(chartType));
|
|
12256
12297
|
};
|
|
12257
12298
|
const structured = createStructuredElementHandlers({
|
|
12258
12299
|
activeSlide,
|
|
@@ -12322,7 +12363,7 @@ function useClipboardHandlers(input) {
|
|
|
12322
12363
|
if (!selectedElement) {
|
|
12323
12364
|
return;
|
|
12324
12365
|
}
|
|
12325
|
-
setClipboardPayload(
|
|
12366
|
+
setClipboardPayload(chunkVKOVFVDJ_js.buildElementClipboardPayload(selectedElement, editTemplateMode));
|
|
12326
12367
|
};
|
|
12327
12368
|
const handleDelete = () => {
|
|
12328
12369
|
const idsToDelete = effectiveSelectedIds;
|
|
@@ -12339,7 +12380,7 @@ function useClipboardHandlers(input) {
|
|
|
12339
12380
|
handleDelete();
|
|
12340
12381
|
};
|
|
12341
12382
|
const insertClone = (source) => {
|
|
12342
|
-
const clone =
|
|
12383
|
+
const clone = chunkVKOVFVDJ_js.cloneElementForPaste(source, { intoTemplate: editTemplateMode });
|
|
12343
12384
|
ops.updateActiveElements((els) => [...els, clone]);
|
|
12344
12385
|
ops.applySelection(clone.id);
|
|
12345
12386
|
history.markDirty();
|
|
@@ -12549,7 +12590,7 @@ function useMergeShapesHandler(input) {
|
|
|
12549
12590
|
bounds.height
|
|
12550
12591
|
);
|
|
12551
12592
|
const newEl = {
|
|
12552
|
-
id:
|
|
12593
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
12553
12594
|
type: "shape",
|
|
12554
12595
|
x: bounds.x,
|
|
12555
12596
|
y: bounds.y,
|
|
@@ -12608,7 +12649,7 @@ function useMergeShapesHandler(input) {
|
|
|
12608
12649
|
);
|
|
12609
12650
|
const primary = targets[0];
|
|
12610
12651
|
const newEl = {
|
|
12611
|
-
id:
|
|
12652
|
+
id: chunkVKOVFVDJ_js.generateElementId(),
|
|
12612
12653
|
type: "shape",
|
|
12613
12654
|
x: bounds.x,
|
|
12614
12655
|
y: bounds.y,
|
|
@@ -12671,7 +12712,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
12671
12712
|
if (ids.length < 2 || !activeSlide) {
|
|
12672
12713
|
return;
|
|
12673
12714
|
}
|
|
12674
|
-
const { elements, groupId } =
|
|
12715
|
+
const { elements, groupId } = chunkVKOVFVDJ_js.groupElements(ops.activeElements, ids, chunkVKOVFVDJ_js.generateElementId());
|
|
12675
12716
|
if (groupId === null) {
|
|
12676
12717
|
return;
|
|
12677
12718
|
}
|
|
@@ -12684,12 +12725,12 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
12684
12725
|
return;
|
|
12685
12726
|
}
|
|
12686
12727
|
const group = selectedElement;
|
|
12687
|
-
const intoTemplate =
|
|
12728
|
+
const intoTemplate = chunkVKOVFVDJ_js.isTemplateElementId(group.id);
|
|
12688
12729
|
const ungrouped = group.children.map((child) => ({
|
|
12689
12730
|
...structuredClone(child),
|
|
12690
12731
|
// Keep child ids in the same store as the group so later edits route
|
|
12691
12732
|
// correctly: template groups yield template-prefixed child ids.
|
|
12692
|
-
id: intoTemplate ?
|
|
12733
|
+
id: intoTemplate ? chunkVKOVFVDJ_js.makeCloneId(true, child.id || group.id) : child.id || chunkVKOVFVDJ_js.generateElementId(),
|
|
12693
12734
|
x: child.x + group.x,
|
|
12694
12735
|
y: child.y + group.y
|
|
12695
12736
|
}));
|
|
@@ -12713,7 +12754,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
12713
12754
|
if (!edge) {
|
|
12714
12755
|
return;
|
|
12715
12756
|
}
|
|
12716
|
-
const positions =
|
|
12757
|
+
const positions = chunkVKOVFVDJ_js.alignElements(selectedElements, edge);
|
|
12717
12758
|
for (const [id, pos] of positions) {
|
|
12718
12759
|
const el = elementLookup.get(id);
|
|
12719
12760
|
if (!el) {
|
|
@@ -12731,7 +12772,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
12731
12772
|
if (!distAxis) {
|
|
12732
12773
|
return;
|
|
12733
12774
|
}
|
|
12734
|
-
const positions =
|
|
12775
|
+
const positions = chunkVKOVFVDJ_js.distributeElements(selectedElements, distAxis);
|
|
12735
12776
|
for (const [id, pos] of positions) {
|
|
12736
12777
|
const el = elementLookup.get(id);
|
|
12737
12778
|
if (!el) {
|
|
@@ -12748,7 +12789,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
12748
12789
|
}
|
|
12749
12790
|
const id = selectedElement.id;
|
|
12750
12791
|
ops.updateActiveElements(
|
|
12751
|
-
(els) => direction === "forward" ?
|
|
12792
|
+
(els) => direction === "forward" ? chunkVKOVFVDJ_js.bringForward(els, id) : direction === "backward" ? chunkVKOVFVDJ_js.sendBackward(els, id) : els
|
|
12752
12793
|
);
|
|
12753
12794
|
history.markDirty();
|
|
12754
12795
|
};
|
|
@@ -12758,7 +12799,7 @@ function useGroupAlignLayerHandlers(input) {
|
|
|
12758
12799
|
}
|
|
12759
12800
|
const id = selectedElement.id;
|
|
12760
12801
|
ops.updateActiveElements(
|
|
12761
|
-
(els) => direction === "front" ?
|
|
12802
|
+
(els) => direction === "front" ? chunkVKOVFVDJ_js.bringToFront(els, id) : chunkVKOVFVDJ_js.sendToBack(els, id)
|
|
12762
12803
|
);
|
|
12763
12804
|
history.markDirty();
|
|
12764
12805
|
};
|
|
@@ -12880,7 +12921,7 @@ function insertSlideFromLayoutUpdater(slides, activeIndex, draft) {
|
|
|
12880
12921
|
function useSlideManagement(input) {
|
|
12881
12922
|
const { slides, activeSlideIndex, setActiveSlideIndex, ops, history, handlerRef } = input;
|
|
12882
12923
|
const handleAddSlide = () => {
|
|
12883
|
-
const newSlide =
|
|
12924
|
+
const newSlide = chunkVKOVFVDJ_js.createBlankSlide(slides.length + 1);
|
|
12884
12925
|
ops.updateSlides((prev) => {
|
|
12885
12926
|
const next = [...prev];
|
|
12886
12927
|
next.splice(activeSlideIndex + 1, 0, newSlide);
|
|
@@ -12943,7 +12984,7 @@ function useSlideManagement(input) {
|
|
|
12943
12984
|
}
|
|
12944
12985
|
const clone = {
|
|
12945
12986
|
...src,
|
|
12946
|
-
id:
|
|
12987
|
+
id: chunkVKOVFVDJ_js.makeSlideId(),
|
|
12947
12988
|
elements: src.elements.map((el) => ({
|
|
12948
12989
|
...el,
|
|
12949
12990
|
id: `${el.id}-dup-${Math.random().toString(36).slice(2, 6)}`
|
|
@@ -12975,7 +13016,7 @@ function useSlideManagement(input) {
|
|
|
12975
13016
|
const handleInsertSlideFromLayout = (layoutPath, layoutName) => {
|
|
12976
13017
|
const insertAt = activeSlideIndex + 1;
|
|
12977
13018
|
const draft = {
|
|
12978
|
-
...
|
|
13019
|
+
...chunkVKOVFVDJ_js.createBlankSlide(slides.length + 1),
|
|
12979
13020
|
layoutPath,
|
|
12980
13021
|
...layoutName ? { layoutName } : {}
|
|
12981
13022
|
};
|
|
@@ -13036,7 +13077,7 @@ function createTableMergeHandlers(input) {
|
|
|
13036
13077
|
if (!nextCell || nextCell.hMerge || nextCell.vMerge) {
|
|
13037
13078
|
return;
|
|
13038
13079
|
}
|
|
13039
|
-
const newTableData =
|
|
13080
|
+
const newTableData = chunkVKOVFVDJ_js.mergeCells(
|
|
13040
13081
|
[
|
|
13041
13082
|
{ row: rowIndex, col: columnIndex },
|
|
13042
13083
|
{ row: rowIndex, col: nextColIdx }
|
|
@@ -13070,7 +13111,7 @@ function createTableMergeHandlers(input) {
|
|
|
13070
13111
|
if (!targetNextCell || targetNextCell.hMerge || targetNextCell.vMerge) {
|
|
13071
13112
|
return;
|
|
13072
13113
|
}
|
|
13073
|
-
const newTableData =
|
|
13114
|
+
const newTableData = chunkVKOVFVDJ_js.mergeCells(
|
|
13074
13115
|
[
|
|
13075
13116
|
{ row: rowIndex, col: columnIndex },
|
|
13076
13117
|
{ row: targetNextRowIdx, col: columnIndex }
|
|
@@ -13093,7 +13134,7 @@ function createTableMergeHandlers(input) {
|
|
|
13093
13134
|
return;
|
|
13094
13135
|
}
|
|
13095
13136
|
const td = selectedElement.tableData;
|
|
13096
|
-
const newTableData =
|
|
13137
|
+
const newTableData = chunkVKOVFVDJ_js.mergeCells(ts.selectedCells, td);
|
|
13097
13138
|
const updates = { tableData: newTableData };
|
|
13098
13139
|
const newRawXml = chunkKV3EOLP3_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
13099
13140
|
if (newRawXml) {
|
|
@@ -13112,7 +13153,7 @@ function createTableMergeHandlers(input) {
|
|
|
13112
13153
|
}
|
|
13113
13154
|
const { rowIndex, columnIndex } = ts;
|
|
13114
13155
|
const td = selectedElement.tableData;
|
|
13115
|
-
const newTableData =
|
|
13156
|
+
const newTableData = chunkVKOVFVDJ_js.splitCell(rowIndex, columnIndex, td);
|
|
13116
13157
|
const updates = { tableData: newTableData };
|
|
13117
13158
|
const newRawXml = chunkKV3EOLP3_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
|
|
13118
13159
|
if (newRawXml) {
|
|
@@ -13246,7 +13287,7 @@ function createTableStructHandlers(input) {
|
|
|
13246
13287
|
return;
|
|
13247
13288
|
}
|
|
13248
13289
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
13249
|
-
const newTableData =
|
|
13290
|
+
const newTableData = chunkVKOVFVDJ_js.insertTableRow(selectedElement.tableData, rowIdx, position);
|
|
13250
13291
|
const updates = { tableData: newTableData };
|
|
13251
13292
|
const newRawXml = chunkKV3EOLP3_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
13252
13293
|
if (newRawXml) {
|
|
@@ -13261,7 +13302,7 @@ function createTableStructHandlers(input) {
|
|
|
13261
13302
|
}
|
|
13262
13303
|
const td = selectedElement.tableData;
|
|
13263
13304
|
const rowIdx = ts?.rowIndex ?? 0;
|
|
13264
|
-
const newTableData =
|
|
13305
|
+
const newTableData = chunkVKOVFVDJ_js.deleteTableRow(td, rowIdx);
|
|
13265
13306
|
if (newTableData === td) {
|
|
13266
13307
|
return;
|
|
13267
13308
|
}
|
|
@@ -13278,7 +13319,7 @@ function createTableStructHandlers(input) {
|
|
|
13278
13319
|
return;
|
|
13279
13320
|
}
|
|
13280
13321
|
const colIdx = ts?.columnIndex ?? 0;
|
|
13281
|
-
const newTableData =
|
|
13322
|
+
const newTableData = chunkVKOVFVDJ_js.insertTableColumn(selectedElement.tableData, colIdx, position);
|
|
13282
13323
|
const updates = { tableData: newTableData };
|
|
13283
13324
|
const newRawXml = chunkKV3EOLP3_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
|
|
13284
13325
|
if (newRawXml) {
|
|
@@ -13293,7 +13334,7 @@ function createTableStructHandlers(input) {
|
|
|
13293
13334
|
}
|
|
13294
13335
|
const td = selectedElement.tableData;
|
|
13295
13336
|
const colIdx = ts?.columnIndex ?? 0;
|
|
13296
|
-
const newTableData =
|
|
13337
|
+
const newTableData = chunkVKOVFVDJ_js.deleteTableColumn(td, colIdx);
|
|
13297
13338
|
if (newTableData === td) {
|
|
13298
13339
|
return;
|
|
13299
13340
|
}
|
|
@@ -13334,8 +13375,8 @@ async function renderToCanvas(element, options = {}) {
|
|
|
13334
13375
|
return html2canvasPro(element, {
|
|
13335
13376
|
...options,
|
|
13336
13377
|
onclone: async (doc, clonedEl) => {
|
|
13337
|
-
await
|
|
13338
|
-
|
|
13378
|
+
await chunkVKOVFVDJ_js.normalizeColorsForCapture(doc, clonedEl);
|
|
13379
|
+
chunkVKOVFVDJ_js.preprocessCssForCapture(clonedEl);
|
|
13339
13380
|
if (typeof userOnClone === "function") {
|
|
13340
13381
|
userOnClone(doc, clonedEl);
|
|
13341
13382
|
}
|
|
@@ -13391,7 +13432,7 @@ async function exportSlideToPngBlob(slideElement, options = {}) {
|
|
|
13391
13432
|
}
|
|
13392
13433
|
async function exportSlideAsPng(slideElement, slideIndex, options = {}) {
|
|
13393
13434
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
13394
|
-
|
|
13435
|
+
chunkVKOVFVDJ_js.downloadBlob(blob, `slide-${slideIndex + 1}.png`);
|
|
13395
13436
|
}
|
|
13396
13437
|
async function copySlideToClipboard(slideElement, options = {}) {
|
|
13397
13438
|
const blob = await exportSlideToPngBlob(slideElement, options);
|
|
@@ -13413,15 +13454,15 @@ async function exportAllSlidesAsPdf(slideStageRef, totalSlides, setActiveSlide,
|
|
|
13413
13454
|
continue;
|
|
13414
13455
|
}
|
|
13415
13456
|
const canvas = await renderElementToCanvas(stageEl, scale);
|
|
13416
|
-
images.push(
|
|
13457
|
+
images.push(chunkVKOVFVDJ_js.canvasToJpegData(canvas));
|
|
13417
13458
|
}
|
|
13418
13459
|
onProgress?.(totalSlides, totalSlides);
|
|
13419
13460
|
setActiveSlide(currentSlideIndex);
|
|
13420
13461
|
if (images.length === 0) {
|
|
13421
|
-
throw new Error(
|
|
13462
|
+
throw new Error(chunk2EFVXYNA_js.translationsEn["pptx.export.errorNoSlidesPdf"]);
|
|
13422
13463
|
}
|
|
13423
13464
|
const pdfBlobUrl = buildPdfFromImageData(images);
|
|
13424
|
-
|
|
13465
|
+
chunkVKOVFVDJ_js.downloadDataUrl(pdfBlobUrl, filename);
|
|
13425
13466
|
}
|
|
13426
13467
|
async function captureAllSlidesAsPngDataUrls(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, options = {}) {
|
|
13427
13468
|
const { scale = 2, onProgress } = options;
|
|
@@ -13467,10 +13508,10 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
|
|
|
13467
13508
|
onProgress?.(totalSlides, totalSlides);
|
|
13468
13509
|
setActiveSlide(currentSlideIndex);
|
|
13469
13510
|
if (pages.length === 0) {
|
|
13470
|
-
throw new Error(
|
|
13511
|
+
throw new Error(chunk2EFVXYNA_js.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
|
|
13471
13512
|
}
|
|
13472
13513
|
const pdfDataUrl = buildNotesPdf(pages);
|
|
13473
|
-
|
|
13514
|
+
chunkVKOVFVDJ_js.downloadDataUrl(pdfDataUrl, filename);
|
|
13474
13515
|
}
|
|
13475
13516
|
|
|
13476
13517
|
// src/viewer/utils/export-video.ts
|
|
@@ -13501,7 +13542,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
13501
13542
|
}
|
|
13502
13543
|
setActiveSlide(currentSlideIndex);
|
|
13503
13544
|
if (slideCanvases.length === 0) {
|
|
13504
|
-
throw new Error(
|
|
13545
|
+
throw new Error(chunk2EFVXYNA_js.translationsEn["pptx.export.errorNoSlidesVideo"]);
|
|
13505
13546
|
}
|
|
13506
13547
|
const firstCanvas = slideCanvases[0];
|
|
13507
13548
|
const recordingCanvas = document.createElement("canvas");
|
|
@@ -13509,12 +13550,12 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
13509
13550
|
recordingCanvas.height = firstCanvas.height;
|
|
13510
13551
|
const ctx = recordingCanvas.getContext("2d");
|
|
13511
13552
|
if (!ctx) {
|
|
13512
|
-
throw new Error(
|
|
13553
|
+
throw new Error(chunk2EFVXYNA_js.translationsEn["pptx.export.errorNo2dContext"]);
|
|
13513
13554
|
}
|
|
13514
13555
|
const fps = 30;
|
|
13515
13556
|
const stream = recordingCanvas.captureStream(fps);
|
|
13516
13557
|
const recorder = new MediaRecorder(stream, {
|
|
13517
|
-
mimeType:
|
|
13558
|
+
mimeType: chunkVKOVFVDJ_js.pickSupportedMimeType([...chunkVKOVFVDJ_js.WEBM_MIME_CANDIDATES]),
|
|
13518
13559
|
videoBitsPerSecond: 5e6
|
|
13519
13560
|
});
|
|
13520
13561
|
const chunks = [];
|
|
@@ -13537,8 +13578,8 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
|
|
|
13537
13578
|
const duration = slideTimingsMs?.[i] ?? slideDurationMs;
|
|
13538
13579
|
ctx.clearRect(0, 0, recordingCanvas.width, recordingCanvas.height);
|
|
13539
13580
|
ctx.drawImage(slideCanvases[i], 0, 0);
|
|
13540
|
-
const frameInterval =
|
|
13541
|
-
const framesNeeded =
|
|
13581
|
+
const frameInterval = chunkVKOVFVDJ_js.fpsToFrameIntervalMs(fps);
|
|
13582
|
+
const framesNeeded = chunkVKOVFVDJ_js.segmentFrameCount(duration, fps);
|
|
13542
13583
|
for (let f = 0; f < framesNeeded; f++) {
|
|
13543
13584
|
if (signal?.aborted) {
|
|
13544
13585
|
recorder.stop();
|
|
@@ -13585,9 +13626,9 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
|
|
|
13585
13626
|
}
|
|
13586
13627
|
setActiveSlide(currentSlideIndex);
|
|
13587
13628
|
if (frames.length === 0) {
|
|
13588
|
-
throw new Error(
|
|
13629
|
+
throw new Error(chunk2EFVXYNA_js.translationsEn["pptx.export.errorNoSlidesGif"]);
|
|
13589
13630
|
}
|
|
13590
|
-
const gifBytes =
|
|
13631
|
+
const gifBytes = chunkVKOVFVDJ_js.encodeGif(frames, Math.round(slideDurationMs / 10));
|
|
13591
13632
|
onProgress?.(totalSlides, totalSlides);
|
|
13592
13633
|
const buf = new ArrayBuffer(gifBytes.length);
|
|
13593
13634
|
new Uint8Array(buf).set(gifBytes);
|
|
@@ -13701,7 +13742,7 @@ function useExportSaveAs(input) {
|
|
|
13701
13742
|
}
|
|
13702
13743
|
setExportProgress(70);
|
|
13703
13744
|
setExportStatusMessage("Writing README...");
|
|
13704
|
-
const readme =
|
|
13745
|
+
const readme = chunkVKOVFVDJ_js.generatePackageReadme(pptxFilename);
|
|
13705
13746
|
pkgFolder.file("README.txt", readme);
|
|
13706
13747
|
if (abortCtrl.signal.aborted) {
|
|
13707
13748
|
throw new DOMException("Export cancelled", "AbortError");
|
|
@@ -13712,7 +13753,7 @@ function useExportSaveAs(input) {
|
|
|
13712
13753
|
setExportProgress(95);
|
|
13713
13754
|
setExportStatusMessage("Downloading...");
|
|
13714
13755
|
const baseName = pptxFilename.replace(/\.[^.]+$/u, "");
|
|
13715
|
-
|
|
13756
|
+
chunkVKOVFVDJ_js.downloadBlob(zipBlob, `${baseName}-package.zip`);
|
|
13716
13757
|
setExportProgress(100);
|
|
13717
13758
|
} catch (err) {
|
|
13718
13759
|
if (err.name !== "AbortError") {
|
|
@@ -13735,7 +13776,7 @@ function useExportSaveAs(input) {
|
|
|
13735
13776
|
const blob = new Blob([data], {
|
|
13736
13777
|
type: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
|
|
13737
13778
|
});
|
|
13738
|
-
|
|
13779
|
+
chunkVKOVFVDJ_js.downloadBlob(blob, `${baseName}.${ext}`);
|
|
13739
13780
|
} catch (err) {
|
|
13740
13781
|
console.error(`[PowerPointViewer] Save as .${ext} failed:`, err);
|
|
13741
13782
|
}
|
|
@@ -13812,7 +13853,7 @@ function safeConfirm(message) {
|
|
|
13812
13853
|
}
|
|
13813
13854
|
}
|
|
13814
13855
|
function downloadBlob2(blob, filename) {
|
|
13815
|
-
|
|
13856
|
+
chunkVKOVFVDJ_js.downloadBlob(blob, chunkVKOVFVDJ_js.sanitizeDownloadFilename(filename));
|
|
13816
13857
|
}
|
|
13817
13858
|
|
|
13818
13859
|
// src/viewer/hooks/useExportHandlers.ts
|
|
@@ -13913,21 +13954,21 @@ function useExportHandlers(input) {
|
|
|
13913
13954
|
{
|
|
13914
13955
|
scale: 2,
|
|
13915
13956
|
onProgress: (current, total) => {
|
|
13916
|
-
setExportProgress(
|
|
13917
|
-
setExportStatusMessage(
|
|
13957
|
+
setExportProgress(chunkVKOVFVDJ_js.slideProgressPercent(current, total));
|
|
13958
|
+
setExportStatusMessage(chunkVKOVFVDJ_js.slideStatusLabel("Rendering", current, total));
|
|
13918
13959
|
},
|
|
13919
13960
|
signal: abortCtrl.signal
|
|
13920
13961
|
}
|
|
13921
13962
|
);
|
|
13922
|
-
setExportProgress(
|
|
13963
|
+
setExportProgress(chunkVKOVFVDJ_js.EXPORT_ASSEMBLING_PERCENT);
|
|
13923
13964
|
setExportStatusMessage("Building PDF...");
|
|
13924
13965
|
await new Promise((r) => {
|
|
13925
13966
|
setTimeout(r, 100);
|
|
13926
13967
|
});
|
|
13927
|
-
setExportProgress(
|
|
13968
|
+
setExportProgress(chunkVKOVFVDJ_js.EXPORT_DONE_PERCENT);
|
|
13928
13969
|
setExportStatusMessage("Done!");
|
|
13929
13970
|
} catch (err) {
|
|
13930
|
-
if (!
|
|
13971
|
+
if (!chunkVKOVFVDJ_js.isExportAbortError(err)) {
|
|
13931
13972
|
console.error("[PowerPointViewer] PDF export failed:", err);
|
|
13932
13973
|
}
|
|
13933
13974
|
} finally {
|
|
@@ -13957,21 +13998,21 @@ function useExportHandlers(input) {
|
|
|
13957
13998
|
{
|
|
13958
13999
|
scale: 2,
|
|
13959
14000
|
onProgress: (current, total) => {
|
|
13960
|
-
setExportProgress(
|
|
13961
|
-
setExportStatusMessage(
|
|
14001
|
+
setExportProgress(chunkVKOVFVDJ_js.slideProgressPercent(current, total));
|
|
14002
|
+
setExportStatusMessage(chunkVKOVFVDJ_js.slideStatusLabel("Rendering", current, total));
|
|
13962
14003
|
},
|
|
13963
14004
|
signal: abortCtrl.signal
|
|
13964
14005
|
}
|
|
13965
14006
|
);
|
|
13966
|
-
setExportProgress(
|
|
14007
|
+
setExportProgress(chunkVKOVFVDJ_js.EXPORT_ASSEMBLING_PERCENT);
|
|
13967
14008
|
setExportStatusMessage("Building PDF...");
|
|
13968
14009
|
await new Promise((r) => {
|
|
13969
14010
|
setTimeout(r, 100);
|
|
13970
14011
|
});
|
|
13971
|
-
setExportProgress(
|
|
14012
|
+
setExportProgress(chunkVKOVFVDJ_js.EXPORT_DONE_PERCENT);
|
|
13972
14013
|
setExportStatusMessage("Done!");
|
|
13973
14014
|
} catch (err) {
|
|
13974
|
-
if (!
|
|
14015
|
+
if (!chunkVKOVFVDJ_js.isExportAbortError(err)) {
|
|
13975
14016
|
console.error("[PowerPointViewer] Notes PDF export failed:", err);
|
|
13976
14017
|
}
|
|
13977
14018
|
} finally {
|
|
@@ -14012,22 +14053,22 @@ function useExportHandlers(input) {
|
|
|
14012
14053
|
scale: 1,
|
|
14013
14054
|
slideDurationMs: 3e3,
|
|
14014
14055
|
onProgress: (current, total) => {
|
|
14015
|
-
setExportProgress(
|
|
14016
|
-
setExportStatusMessage(
|
|
14056
|
+
setExportProgress(chunkVKOVFVDJ_js.slideProgressPercent(current, total, 45));
|
|
14057
|
+
setExportStatusMessage(chunkVKOVFVDJ_js.slideStatusLabel("Capturing", current, total));
|
|
14017
14058
|
},
|
|
14018
14059
|
onRecordProgress: (current, total) => {
|
|
14019
|
-
setExportProgress(
|
|
14020
|
-
setExportStatusMessage(
|
|
14060
|
+
setExportProgress(chunkVKOVFVDJ_js.recordProgressPercent(current, total));
|
|
14061
|
+
setExportStatusMessage(chunkVKOVFVDJ_js.slideStatusLabel("Recording", current, total));
|
|
14021
14062
|
},
|
|
14022
14063
|
signal: abortCtrl.signal
|
|
14023
14064
|
}
|
|
14024
14065
|
);
|
|
14025
|
-
setExportProgress(
|
|
14066
|
+
setExportProgress(chunkVKOVFVDJ_js.EXPORT_ASSEMBLING_PERCENT);
|
|
14026
14067
|
setExportStatusMessage("Saving file...");
|
|
14027
14068
|
downloadBlob2(blob, "presentation.webm");
|
|
14028
|
-
setExportProgress(
|
|
14069
|
+
setExportProgress(chunkVKOVFVDJ_js.EXPORT_DONE_PERCENT);
|
|
14029
14070
|
} catch (err) {
|
|
14030
|
-
if (!
|
|
14071
|
+
if (!chunkVKOVFVDJ_js.isExportAbortError(err)) {
|
|
14031
14072
|
console.error("[PowerPointViewer] Video export failed:", err);
|
|
14032
14073
|
}
|
|
14033
14074
|
} finally {
|
|
@@ -14055,18 +14096,18 @@ function useExportHandlers(input) {
|
|
|
14055
14096
|
scale: 0.5,
|
|
14056
14097
|
slideDurationMs: 2e3,
|
|
14057
14098
|
onProgress: (current, total) => {
|
|
14058
|
-
setExportProgress(
|
|
14059
|
-
setExportStatusMessage(
|
|
14099
|
+
setExportProgress(chunkVKOVFVDJ_js.slideProgressPercent(current, total));
|
|
14100
|
+
setExportStatusMessage(chunkVKOVFVDJ_js.slideStatusLabel("Encoding", current, total));
|
|
14060
14101
|
},
|
|
14061
14102
|
signal: abortCtrl.signal
|
|
14062
14103
|
}
|
|
14063
14104
|
);
|
|
14064
|
-
setExportProgress(
|
|
14105
|
+
setExportProgress(chunkVKOVFVDJ_js.EXPORT_ASSEMBLING_PERCENT);
|
|
14065
14106
|
setExportStatusMessage("Saving file...");
|
|
14066
14107
|
downloadBlob2(blob, "presentation.gif");
|
|
14067
|
-
setExportProgress(
|
|
14108
|
+
setExportProgress(chunkVKOVFVDJ_js.EXPORT_DONE_PERCENT);
|
|
14068
14109
|
} catch (err) {
|
|
14069
|
-
if (!
|
|
14110
|
+
if (!chunkVKOVFVDJ_js.isExportAbortError(err)) {
|
|
14070
14111
|
console.error("[PowerPointViewer] GIF export failed:", err);
|
|
14071
14112
|
}
|
|
14072
14113
|
} finally {
|
|
@@ -14106,7 +14147,7 @@ function openPrintWindow(title, bodyHtml, orientation, colorFilter, frameSlides)
|
|
|
14106
14147
|
}
|
|
14107
14148
|
printWindow.document.open();
|
|
14108
14149
|
printWindow.document.write(
|
|
14109
|
-
|
|
14150
|
+
chunkVKOVFVDJ_js.buildPrintHtmlDocument({ title, bodyHtml, orientation, colorFilter, frameSlides })
|
|
14110
14151
|
);
|
|
14111
14152
|
printWindow.document.close();
|
|
14112
14153
|
printWindow.focus();
|
|
@@ -14167,7 +14208,7 @@ function usePrintHandlers(input) {
|
|
|
14167
14208
|
if (svgs.length === 0) {
|
|
14168
14209
|
return;
|
|
14169
14210
|
}
|
|
14170
|
-
const printDoc =
|
|
14211
|
+
const printDoc = chunkVKOVFVDJ_js.buildPrintDocument(svgs, pptxData.width, pptxData.height, {
|
|
14171
14212
|
title: "Slides (Vector)",
|
|
14172
14213
|
orientation: settings.orientation,
|
|
14173
14214
|
colorFilter
|
|
@@ -14203,7 +14244,7 @@ function usePrintHandlers(input) {
|
|
|
14203
14244
|
if (settings.printWhat === "outline") {
|
|
14204
14245
|
openPrintWindow(
|
|
14205
14246
|
"Outline",
|
|
14206
|
-
`<div class="outline-page">${
|
|
14247
|
+
`<div class="outline-page">${chunkVKOVFVDJ_js.buildOutlineHtml(slideIndices, slides)}</div>`,
|
|
14207
14248
|
settings.orientation,
|
|
14208
14249
|
colorFilter,
|
|
14209
14250
|
settings.frameSlides
|
|
@@ -14228,7 +14269,7 @@ function usePrintHandlers(input) {
|
|
|
14228
14269
|
if (settings.printWhat === "slides") {
|
|
14229
14270
|
openPrintWindow(
|
|
14230
14271
|
"Slides",
|
|
14231
|
-
|
|
14272
|
+
chunkVKOVFVDJ_js.buildSlidesHtml(slideImages, slideIndices),
|
|
14232
14273
|
settings.orientation,
|
|
14233
14274
|
colorFilter,
|
|
14234
14275
|
settings.frameSlides
|
|
@@ -14238,7 +14279,7 @@ function usePrintHandlers(input) {
|
|
|
14238
14279
|
if (settings.printWhat === "notes") {
|
|
14239
14280
|
openPrintWindow(
|
|
14240
14281
|
"Notes Pages",
|
|
14241
|
-
|
|
14282
|
+
chunkVKOVFVDJ_js.buildNotesHtml(slideImages, slideIndices, slides),
|
|
14242
14283
|
"portrait",
|
|
14243
14284
|
colorFilter,
|
|
14244
14285
|
settings.frameSlides
|
|
@@ -14249,7 +14290,7 @@ function usePrintHandlers(input) {
|
|
|
14249
14290
|
const spp = settings.slidesPerPage;
|
|
14250
14291
|
openPrintWindow(
|
|
14251
14292
|
`Handout ${spp} per page`,
|
|
14252
|
-
|
|
14293
|
+
chunkVKOVFVDJ_js.buildHandoutsHtml(slideImages, slideIndices, spp),
|
|
14253
14294
|
"portrait",
|
|
14254
14295
|
colorFilter,
|
|
14255
14296
|
settings.frameSlides
|
|
@@ -14532,7 +14573,7 @@ function usePropertyHandlers(input) {
|
|
|
14532
14573
|
width: canvasSize.width,
|
|
14533
14574
|
height: canvasSize.height
|
|
14534
14575
|
};
|
|
14535
|
-
setCompareResult(
|
|
14576
|
+
setCompareResult(chunkVKOVFVDJ_js.comparePresentation(cur, other));
|
|
14536
14577
|
setIsComparePanelOpen(true);
|
|
14537
14578
|
} catch (err) {
|
|
14538
14579
|
console.warn("Compare failed:", err);
|
|
@@ -14549,7 +14590,7 @@ function usePropertyHandlers(input) {
|
|
|
14549
14590
|
if (!diff || diff.status === "unchanged") {
|
|
14550
14591
|
return;
|
|
14551
14592
|
}
|
|
14552
|
-
setSlides((prev) =>
|
|
14593
|
+
setSlides((prev) => chunkVKOVFVDJ_js.applyAcceptSlide(prev, diff));
|
|
14553
14594
|
setIsDirty(true);
|
|
14554
14595
|
},
|
|
14555
14596
|
[compareResult, setSlides, setIsDirty]
|
|
@@ -14560,10 +14601,10 @@ function usePropertyHandlers(input) {
|
|
|
14560
14601
|
if (!compareResult) {
|
|
14561
14602
|
return;
|
|
14562
14603
|
}
|
|
14563
|
-
setSlides((prev) =>
|
|
14604
|
+
setSlides((prev) => chunkVKOVFVDJ_js.applyAcceptAllSlides(prev, compareResult));
|
|
14564
14605
|
setIsDirty(true);
|
|
14565
14606
|
}, [compareResult, setSlides, setIsDirty]);
|
|
14566
|
-
const usedFontFamilies = React3.useMemo(() =>
|
|
14607
|
+
const usedFontFamilies = React3.useMemo(() => chunkVKOVFVDJ_js.collectUsedFonts(slides), [slides]);
|
|
14567
14608
|
return {
|
|
14568
14609
|
handleUpdateNotes,
|
|
14569
14610
|
handleUpdateSlide,
|
|
@@ -14682,7 +14723,7 @@ function useIsMobile(input) {
|
|
|
14682
14723
|
const containerRef = input?.containerRef;
|
|
14683
14724
|
const isTouchDevice = React3.useSyncExternalStore(
|
|
14684
14725
|
subscribeTouchCapability,
|
|
14685
|
-
|
|
14726
|
+
chunkVKOVFVDJ_js.detectTouchDevice,
|
|
14686
14727
|
() => false
|
|
14687
14728
|
// server snapshot
|
|
14688
14729
|
);
|
|
@@ -14698,7 +14739,7 @@ function useIsMobile(input) {
|
|
|
14698
14739
|
}
|
|
14699
14740
|
return containerRef?.current?.clientHeight ?? window.innerHeight;
|
|
14700
14741
|
});
|
|
14701
|
-
const [orientation, setOrientation] = React3.useState(
|
|
14742
|
+
const [orientation, setOrientation] = React3.useState(chunkVKOVFVDJ_js.detectOrientation);
|
|
14702
14743
|
const [isVirtualKeyboardOpen, setIsVirtualKeyboardOpen] = React3.useState(false);
|
|
14703
14744
|
const [initialViewportHeight] = React3.useState(
|
|
14704
14745
|
() => typeof window !== "undefined" ? window.innerHeight : 800
|
|
@@ -14742,7 +14783,7 @@ function useIsMobile(input) {
|
|
|
14742
14783
|
return;
|
|
14743
14784
|
}
|
|
14744
14785
|
const handleOrientationChange = () => {
|
|
14745
|
-
setOrientation(
|
|
14786
|
+
setOrientation(chunkVKOVFVDJ_js.detectOrientation());
|
|
14746
14787
|
};
|
|
14747
14788
|
if (screen.orientation) {
|
|
14748
14789
|
screen.orientation.addEventListener("change", handleOrientationChange);
|
|
@@ -14772,9 +14813,9 @@ function useIsMobile(input) {
|
|
|
14772
14813
|
window.addEventListener("resize", handleResize);
|
|
14773
14814
|
return () => window.removeEventListener("resize", handleResize);
|
|
14774
14815
|
}, [isTouchDevice, initialViewportHeight]);
|
|
14775
|
-
const isMobile =
|
|
14776
|
-
const isTablet = !isMobile && containerWidth >=
|
|
14777
|
-
const isDesktop = !isMobile && containerWidth >=
|
|
14816
|
+
const isMobile = chunkVKOVFVDJ_js.isMobileViewport(containerWidth, containerHeight, isTouchDevice);
|
|
14817
|
+
const isTablet = !isMobile && containerWidth >= chunkVKOVFVDJ_js.MOBILE_BREAKPOINT && containerWidth < chunkVKOVFVDJ_js.TABLET_BREAKPOINT;
|
|
14818
|
+
const isDesktop = !isMobile && containerWidth >= chunkVKOVFVDJ_js.TABLET_BREAKPOINT;
|
|
14778
14819
|
return {
|
|
14779
14820
|
isMobile,
|
|
14780
14821
|
isTablet,
|
|
@@ -14835,11 +14876,11 @@ function useViewerDialogs(input) {
|
|
|
14835
14876
|
);
|
|
14836
14877
|
const [embedFontsEnabled, setEmbedFontsEnabled] = React3.useState(false);
|
|
14837
14878
|
const [isNarrowViewport, setIsNarrowViewport] = React3.useState(
|
|
14838
|
-
() => typeof window !== "undefined" ?
|
|
14879
|
+
() => typeof window !== "undefined" ? chunkVKOVFVDJ_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch()) : false
|
|
14839
14880
|
);
|
|
14840
14881
|
React3.useEffect(() => {
|
|
14841
14882
|
const handleWindow = () => setIsNarrowViewport(
|
|
14842
|
-
|
|
14883
|
+
chunkVKOVFVDJ_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch())
|
|
14843
14884
|
);
|
|
14844
14885
|
let observer = null;
|
|
14845
14886
|
let raf = 0;
|
|
@@ -14853,12 +14894,12 @@ function useViewerDialogs(input) {
|
|
|
14853
14894
|
const entry = entries[0];
|
|
14854
14895
|
if (entry) {
|
|
14855
14896
|
setIsNarrowViewport(
|
|
14856
|
-
|
|
14897
|
+
chunkVKOVFVDJ_js.isMobileViewport(entry.contentRect.width, entry.contentRect.height, viewportIsTouch())
|
|
14857
14898
|
);
|
|
14858
14899
|
}
|
|
14859
14900
|
});
|
|
14860
14901
|
observer.observe(el);
|
|
14861
|
-
setIsNarrowViewport(
|
|
14902
|
+
setIsNarrowViewport(chunkVKOVFVDJ_js.isMobileViewport(el.clientWidth, el.clientHeight, viewportIsTouch()));
|
|
14862
14903
|
};
|
|
14863
14904
|
attach();
|
|
14864
14905
|
window.addEventListener("resize", handleWindow);
|
|
@@ -15035,7 +15076,7 @@ function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows) {
|
|
|
15035
15076
|
return slides.map((_, i) => i).filter((i) => !slides[i]?.hidden);
|
|
15036
15077
|
}
|
|
15037
15078
|
function computeSlideSectionGroups(slides, sections) {
|
|
15038
|
-
return
|
|
15079
|
+
return chunkVKOVFVDJ_js.groupSlidesBySection(sections, slides).map((group) => ({
|
|
15039
15080
|
id: group.section?.id ?? (sections.length > 0 ? UNGROUPED_SECTION_ID : "default"),
|
|
15040
15081
|
label: group.section?.name ?? (sections.length > 0 ? "Ungrouped Slides" : "Slides"),
|
|
15041
15082
|
slideIndexes: group.slideIndexes,
|
|
@@ -15113,26 +15154,17 @@ function useDerivedSlideState(input) {
|
|
|
15113
15154
|
};
|
|
15114
15155
|
}
|
|
15115
15156
|
function useAnnotationHandlers(input) {
|
|
15116
|
-
const {
|
|
15157
|
+
const {
|
|
15158
|
+
mode,
|
|
15159
|
+
presentation,
|
|
15160
|
+
annotations,
|
|
15161
|
+
history,
|
|
15162
|
+
setMode,
|
|
15163
|
+
setSlides,
|
|
15164
|
+
promptKeepInkAnnotations = true
|
|
15165
|
+
} = input;
|
|
15117
15166
|
const [showKeepAnnotationsDialog, setShowKeepAnnotationsDialog] = React3.useState(false);
|
|
15118
15167
|
const pendingModeAfterAnnotationsRef = React3.useRef("edit");
|
|
15119
|
-
const handleSetMode = React3.useCallback(
|
|
15120
|
-
(nextMode) => {
|
|
15121
|
-
if (nextMode === "present") {
|
|
15122
|
-
presentation.enterPresentMode();
|
|
15123
|
-
} else if (mode === "present" && annotations.hasAnyAnnotations) {
|
|
15124
|
-
stopAllPersistentAudio();
|
|
15125
|
-
pendingModeAfterAnnotationsRef.current = nextMode;
|
|
15126
|
-
setShowKeepAnnotationsDialog(true);
|
|
15127
|
-
} else {
|
|
15128
|
-
if (mode === "present") {
|
|
15129
|
-
stopAllPersistentAudio();
|
|
15130
|
-
}
|
|
15131
|
-
setMode(nextMode);
|
|
15132
|
-
}
|
|
15133
|
-
},
|
|
15134
|
-
[presentation, mode, annotations.hasAnyAnnotations, setMode]
|
|
15135
|
-
);
|
|
15136
15168
|
const handleKeepAnnotations = React3.useCallback(() => {
|
|
15137
15169
|
const annotationMap = annotations.allSlideAnnotations;
|
|
15138
15170
|
if (annotationMap.size === 0) {
|
|
@@ -15201,6 +15233,34 @@ function useAnnotationHandlers(input) {
|
|
|
15201
15233
|
setShowKeepAnnotationsDialog(false);
|
|
15202
15234
|
setMode(pendingModeAfterAnnotationsRef.current);
|
|
15203
15235
|
}, [annotations, setMode, setSlides, history]);
|
|
15236
|
+
const handleSetMode = React3.useCallback(
|
|
15237
|
+
(nextMode) => {
|
|
15238
|
+
if (nextMode === "present") {
|
|
15239
|
+
presentation.enterPresentMode();
|
|
15240
|
+
} else if (mode === "present" && annotations.hasAnyAnnotations) {
|
|
15241
|
+
stopAllPersistentAudio();
|
|
15242
|
+
pendingModeAfterAnnotationsRef.current = nextMode;
|
|
15243
|
+
if (promptKeepInkAnnotations) {
|
|
15244
|
+
setShowKeepAnnotationsDialog(true);
|
|
15245
|
+
} else {
|
|
15246
|
+
handleKeepAnnotations();
|
|
15247
|
+
}
|
|
15248
|
+
} else {
|
|
15249
|
+
if (mode === "present") {
|
|
15250
|
+
stopAllPersistentAudio();
|
|
15251
|
+
}
|
|
15252
|
+
setMode(nextMode);
|
|
15253
|
+
}
|
|
15254
|
+
},
|
|
15255
|
+
[
|
|
15256
|
+
presentation,
|
|
15257
|
+
mode,
|
|
15258
|
+
annotations.hasAnyAnnotations,
|
|
15259
|
+
promptKeepInkAnnotations,
|
|
15260
|
+
handleKeepAnnotations,
|
|
15261
|
+
setMode
|
|
15262
|
+
]
|
|
15263
|
+
);
|
|
15204
15264
|
const handleDiscardAnnotations = React3.useCallback(() => {
|
|
15205
15265
|
annotations.clearAllAnnotations();
|
|
15206
15266
|
setShowKeepAnnotationsDialog(false);
|
|
@@ -15259,7 +15319,7 @@ function useSerialize(input) {
|
|
|
15259
15319
|
return {
|
|
15260
15320
|
...el,
|
|
15261
15321
|
text: pendingEditText,
|
|
15262
|
-
textSegments:
|
|
15322
|
+
textSegments: chunkVKOVFVDJ_js.remapTextToSegments(pendingEditText, el.textSegments, el.textStyle)
|
|
15263
15323
|
};
|
|
15264
15324
|
});
|
|
15265
15325
|
if (updatedElements.some((el, i) => el !== slide.elements[i])) {
|
|
@@ -15427,14 +15487,18 @@ function usePresentationSetup(input) {
|
|
|
15427
15487
|
setMode,
|
|
15428
15488
|
setActiveSlideIndex,
|
|
15429
15489
|
setSlides,
|
|
15430
|
-
history
|
|
15490
|
+
history,
|
|
15491
|
+
endWithBlackSlide = true,
|
|
15492
|
+
promptKeepInkAnnotations = true,
|
|
15493
|
+
popupToolbarEnabled = true
|
|
15431
15494
|
} = input;
|
|
15432
15495
|
const actionSoundHandlerRef = React3.useRef(null);
|
|
15433
15496
|
const [, setShowKeepAnnotationsDialog] = React3.useState(false);
|
|
15434
15497
|
const pendingModeRef = React3.useRef("edit");
|
|
15435
15498
|
const annotations = usePresentationAnnotations({
|
|
15436
15499
|
isActive: mode === "present",
|
|
15437
|
-
activeSlideIndex
|
|
15500
|
+
activeSlideIndex,
|
|
15501
|
+
popupToolbarEnabled
|
|
15438
15502
|
});
|
|
15439
15503
|
const presentation = usePresentationMode({
|
|
15440
15504
|
mode,
|
|
@@ -15444,7 +15508,7 @@ function usePresentationSetup(input) {
|
|
|
15444
15508
|
containerRef,
|
|
15445
15509
|
content,
|
|
15446
15510
|
onSetMode: (nextMode) => {
|
|
15447
|
-
if (mode === "present" && nextMode !== "present" && annotations.hasAnyAnnotations) {
|
|
15511
|
+
if (mode === "present" && nextMode !== "present" && annotations.hasAnyAnnotations && promptKeepInkAnnotations) {
|
|
15448
15512
|
pendingModeRef.current = nextMode;
|
|
15449
15513
|
setShowKeepAnnotationsDialog(true);
|
|
15450
15514
|
} else {
|
|
@@ -15492,12 +15556,13 @@ function usePresentationSetup(input) {
|
|
|
15492
15556
|
onToggleEraser: () => annotations.setPresentationTool("eraser"),
|
|
15493
15557
|
onToggleToolbar: () => annotations.setToolbarVisible(!annotations.toolbarVisible),
|
|
15494
15558
|
onSaveRehearsalTimings: (timings) => {
|
|
15495
|
-
setSlides((prev) =>
|
|
15559
|
+
setSlides((prev) => chunkVKOVFVDJ_js.applyRehearsalTimings(prev, timings));
|
|
15496
15560
|
history.markDirty();
|
|
15497
15561
|
},
|
|
15498
|
-
loopContinuously:
|
|
15562
|
+
loopContinuously: chunkVKOVFVDJ_js.shouldLoopContinuously(presentationProperties),
|
|
15499
15563
|
showWithAnimation: presentationProperties.showWithAnimation,
|
|
15500
|
-
useTimings: presentationProperties.advanceMode !== "manual"
|
|
15564
|
+
useTimings: presentationProperties.advanceMode !== "manual",
|
|
15565
|
+
endWithBlackSlide
|
|
15501
15566
|
});
|
|
15502
15567
|
return { presentation, annotations, actionSoundHandlerRef };
|
|
15503
15568
|
}
|
|
@@ -15518,7 +15583,8 @@ function useEditorOperations(input) {
|
|
|
15518
15583
|
dialogs,
|
|
15519
15584
|
presentation,
|
|
15520
15585
|
userName,
|
|
15521
|
-
handlerRef
|
|
15586
|
+
handlerRef,
|
|
15587
|
+
transformCommittedText
|
|
15522
15588
|
} = input;
|
|
15523
15589
|
const ops = useElementOperations({
|
|
15524
15590
|
activeSlide,
|
|
@@ -15587,7 +15653,8 @@ function useEditorOperations(input) {
|
|
|
15587
15653
|
presentationHandleAction: presentation.handlePresentationAction,
|
|
15588
15654
|
setEditingEquationOmml: dialogs.setEditingEquationOmml,
|
|
15589
15655
|
setIsEquationDialogOpen: dialogs.setIsEquationDialogOpen,
|
|
15590
|
-
setPointerCommitNonce: state.setPointerCommitNonce
|
|
15656
|
+
setPointerCommitNonce: state.setPointerCommitNonce,
|
|
15657
|
+
transformCommittedText
|
|
15591
15658
|
});
|
|
15592
15659
|
const insertHandlers = useInsertElements({
|
|
15593
15660
|
activeSlide,
|
|
@@ -15654,7 +15721,7 @@ function useEditorOperations(input) {
|
|
|
15654
15721
|
const { formatPainterActive, setFormatPainterActive, elementLookup } = state;
|
|
15655
15722
|
React3.useEffect(() => {
|
|
15656
15723
|
if (formatPainterActive && !prevFormatPainterRef.current && selectedElement) {
|
|
15657
|
-
copiedFormatRef.current =
|
|
15724
|
+
copiedFormatRef.current = chunkVKOVFVDJ_js.copyFormatFromElement(selectedElement);
|
|
15658
15725
|
} else if (!formatPainterActive) {
|
|
15659
15726
|
copiedFormatRef.current = null;
|
|
15660
15727
|
}
|
|
@@ -15680,7 +15747,7 @@ function useEditorOperations(input) {
|
|
|
15680
15747
|
e.stopPropagation();
|
|
15681
15748
|
const element = elementLookup.get(elementId);
|
|
15682
15749
|
if (element) {
|
|
15683
|
-
const updated =
|
|
15750
|
+
const updated = chunkVKOVFVDJ_js.applyFormatToElement(element, copiedFormatRef.current);
|
|
15684
15751
|
const updates = {};
|
|
15685
15752
|
if (chunkKV3EOLP3_js.hasShapeProperties(updated)) {
|
|
15686
15753
|
updates.shapeStyle = updated.shapeStyle;
|
|
@@ -16609,9 +16676,20 @@ function useReducedMotion() {
|
|
|
16609
16676
|
setManualReducedMotion
|
|
16610
16677
|
};
|
|
16611
16678
|
}
|
|
16612
|
-
|
|
16679
|
+
function useViewerOptions() {
|
|
16680
|
+
const storeRef = React3.useRef(null);
|
|
16681
|
+
storeRef.current ??= chunkVKOVFVDJ_js.createViewerOptionsStore();
|
|
16682
|
+
const store = storeRef.current;
|
|
16683
|
+
const options = React3.useSyncExternalStore(
|
|
16684
|
+
(onStoreChange) => store.subscribe(onStoreChange),
|
|
16685
|
+
() => store.getOptions(),
|
|
16686
|
+
() => store.getOptions()
|
|
16687
|
+
);
|
|
16688
|
+
return { optionsStore: store, options };
|
|
16689
|
+
}
|
|
16690
|
+
var KNOWN_TAB_IDS = new Set(chunkVKOVFVDJ_js.TOOLBAR_TABS.map((tab) => tab.id));
|
|
16613
16691
|
function computeToolbarVisibility(hiddenActions) {
|
|
16614
|
-
const isHidden = (id) =>
|
|
16692
|
+
const isHidden = (id) => chunkVKOVFVDJ_js.isActionHidden(id, hiddenActions);
|
|
16615
16693
|
const isTabVisible = (id) => !KNOWN_TAB_IDS.has(id) || !isHidden(id);
|
|
16616
16694
|
return { isHidden, isTabVisible };
|
|
16617
16695
|
}
|
|
@@ -16628,7 +16706,7 @@ function useYjsProvider({ config }) {
|
|
|
16628
16706
|
const timeoutRef = React3.useRef(null);
|
|
16629
16707
|
const gateRef = React3.useRef(null);
|
|
16630
16708
|
if (!gateRef.current) {
|
|
16631
|
-
gateRef.current =
|
|
16709
|
+
gateRef.current = chunkVKOVFVDJ_js.createSyncGate(() => setSynced(true));
|
|
16632
16710
|
}
|
|
16633
16711
|
const teardown = React3.useCallback(() => {
|
|
16634
16712
|
if (timeoutRef.current) {
|
|
@@ -16666,7 +16744,7 @@ function useYjsProvider({ config }) {
|
|
|
16666
16744
|
if (config.authToken) {
|
|
16667
16745
|
opts.password = config.authToken;
|
|
16668
16746
|
}
|
|
16669
|
-
const provider = new WebrtcProvider(
|
|
16747
|
+
const provider = new WebrtcProvider(chunkVKOVFVDJ_js.validateRoomId(config.roomId), yDoc, opts);
|
|
16670
16748
|
setDoc(yDoc);
|
|
16671
16749
|
setAwareness(provider.awareness);
|
|
16672
16750
|
setClientId(provider.awareness.clientID);
|
|
@@ -16708,13 +16786,13 @@ function useYjsProvider({ config }) {
|
|
|
16708
16786
|
if (!config) {
|
|
16709
16787
|
return;
|
|
16710
16788
|
}
|
|
16711
|
-
const roomId =
|
|
16712
|
-
const transport = config.transport ??
|
|
16789
|
+
const roomId = chunkVKOVFVDJ_js.validateRoomId(config.roomId);
|
|
16790
|
+
const transport = config.transport ?? chunkVKOVFVDJ_js.resolveTransportForServerUrl(config.serverUrl);
|
|
16713
16791
|
if (transport === "webrtc") {
|
|
16714
16792
|
await initWebrtc();
|
|
16715
16793
|
return;
|
|
16716
16794
|
}
|
|
16717
|
-
if (
|
|
16795
|
+
if (chunkVKOVFVDJ_js.isMixedContentBlocked(config.serverUrl)) {
|
|
16718
16796
|
console.warn(
|
|
16719
16797
|
`[pptx-viewer] Refusing to connect: insecure ws:// server "${config.serverUrl}" is blocked from a secure (https) page. Use a wss:// URL.`
|
|
16720
16798
|
);
|
|
@@ -16774,7 +16852,7 @@ function useYjsProvider({ config }) {
|
|
|
16774
16852
|
cleanupRef.current = null;
|
|
16775
16853
|
setStatus("error");
|
|
16776
16854
|
}
|
|
16777
|
-
},
|
|
16855
|
+
}, chunkVKOVFVDJ_js.CONNECTION_TIMEOUT_MS);
|
|
16778
16856
|
}
|
|
16779
16857
|
setDoc(yDoc);
|
|
16780
16858
|
setAwareness(provider.awareness);
|
|
@@ -16847,7 +16925,7 @@ function usePresenceTracking({
|
|
|
16847
16925
|
awareness.setLocalStateField("presence", state);
|
|
16848
16926
|
lastBroadcastRef.current = Date.now();
|
|
16849
16927
|
};
|
|
16850
|
-
if (elapsed >=
|
|
16928
|
+
if (elapsed >= chunkVKOVFVDJ_js.BROADCAST_THROTTLE_MS) {
|
|
16851
16929
|
if (pendingBroadcastRef.current) {
|
|
16852
16930
|
clearTimeout(pendingBroadcastRef.current);
|
|
16853
16931
|
pendingBroadcastRef.current = null;
|
|
@@ -16857,7 +16935,7 @@ function usePresenceTracking({
|
|
|
16857
16935
|
pendingBroadcastRef.current = setTimeout(() => {
|
|
16858
16936
|
pendingBroadcastRef.current = null;
|
|
16859
16937
|
flush();
|
|
16860
|
-
},
|
|
16938
|
+
}, chunkVKOVFVDJ_js.BROADCAST_THROTTLE_MS - elapsed);
|
|
16861
16939
|
}
|
|
16862
16940
|
},
|
|
16863
16941
|
[awareness, userName, userColor, userAvatar, role]
|
|
@@ -16882,7 +16960,7 @@ function usePresenceTracking({
|
|
|
16882
16960
|
return;
|
|
16883
16961
|
}
|
|
16884
16962
|
const handleChange = () => {
|
|
16885
|
-
const users =
|
|
16963
|
+
const users = chunkVKOVFVDJ_js.derivePresenceList(
|
|
16886
16964
|
awareness.getStates(),
|
|
16887
16965
|
localClientId,
|
|
16888
16966
|
canvasWidth,
|
|
@@ -16930,7 +17008,7 @@ function useCollaborativeState({
|
|
|
16930
17008
|
canvasWidth,
|
|
16931
17009
|
canvasHeight
|
|
16932
17010
|
}) {
|
|
16933
|
-
const userColor =
|
|
17011
|
+
const userColor = chunkVKOVFVDJ_js.sanitizeColor(config?.userColor, "#6366f1");
|
|
16934
17012
|
const { status, awareness, doc, clientId, synced, retry } = useYjsProvider({ config });
|
|
16935
17013
|
const { remoteUsers, broadcastPresence } = usePresenceTracking({
|
|
16936
17014
|
awareness,
|
|
@@ -17038,7 +17116,7 @@ function useYjsDocumentSync({
|
|
|
17038
17116
|
const { PptxHandler: PptxHandler2 } = await import('./dist-XF3QJAEF.js');
|
|
17039
17117
|
const handler = new PptxHandler2();
|
|
17040
17118
|
await handler.load(sourceBytes.buffer);
|
|
17041
|
-
const currentSlides =
|
|
17119
|
+
const currentSlides = chunkVKOVFVDJ_js.readSlidesFromYDoc(
|
|
17042
17120
|
doc
|
|
17043
17121
|
);
|
|
17044
17122
|
const slidesToSave = buildSaveSlides(currentSlides, templateElementsBySlideId);
|
|
@@ -17056,7 +17134,7 @@ function useYjsDocumentSync({
|
|
|
17056
17134
|
if (!doc || !isConnected) {
|
|
17057
17135
|
return;
|
|
17058
17136
|
}
|
|
17059
|
-
const docSlides =
|
|
17137
|
+
const docSlides = chunkVKOVFVDJ_js.readSlidesFromYDoc(
|
|
17060
17138
|
doc
|
|
17061
17139
|
);
|
|
17062
17140
|
if (docSlides.length === 0) {
|
|
@@ -17080,11 +17158,11 @@ function useYjsDocumentSync({
|
|
|
17080
17158
|
lastSyncedRef.current = serialized;
|
|
17081
17159
|
void (async () => {
|
|
17082
17160
|
const factories = await getFactories();
|
|
17083
|
-
|
|
17161
|
+
chunkVKOVFVDJ_js.reconcileSlidesInYDoc(
|
|
17084
17162
|
slides,
|
|
17085
17163
|
doc,
|
|
17086
17164
|
factories,
|
|
17087
|
-
|
|
17165
|
+
chunkVKOVFVDJ_js.LOCAL_SYNC_ORIGIN
|
|
17088
17166
|
);
|
|
17089
17167
|
scheduleWriteBack();
|
|
17090
17168
|
})();
|
|
@@ -17094,10 +17172,10 @@ function useYjsDocumentSync({
|
|
|
17094
17172
|
return;
|
|
17095
17173
|
}
|
|
17096
17174
|
const handleChange = (_events, transaction) => {
|
|
17097
|
-
if (transaction?.origin ===
|
|
17175
|
+
if (transaction?.origin === chunkVKOVFVDJ_js.LOCAL_SYNC_ORIGIN) {
|
|
17098
17176
|
return;
|
|
17099
17177
|
}
|
|
17100
|
-
const remoteSlides =
|
|
17178
|
+
const remoteSlides = chunkVKOVFVDJ_js.readSlidesFromYDoc(
|
|
17101
17179
|
doc
|
|
17102
17180
|
);
|
|
17103
17181
|
if (remoteSlides.length === 0) {
|
|
@@ -17115,7 +17193,7 @@ function useYjsDocumentSync({
|
|
|
17115
17193
|
});
|
|
17116
17194
|
scheduleWriteBack();
|
|
17117
17195
|
};
|
|
17118
|
-
const unobserve =
|
|
17196
|
+
const unobserve = chunkVKOVFVDJ_js.observeYDocSlides(
|
|
17119
17197
|
doc,
|
|
17120
17198
|
handleChange
|
|
17121
17199
|
);
|
|
@@ -17266,7 +17344,7 @@ function useLayoutSwitching(input) {
|
|
|
17266
17344
|
function useVirtualizedSlides({
|
|
17267
17345
|
totalItems,
|
|
17268
17346
|
itemHeight,
|
|
17269
|
-
overscan =
|
|
17347
|
+
overscan = chunkVKOVFVDJ_js.DEFAULT_VIRTUAL_OVERSCAN
|
|
17270
17348
|
}) {
|
|
17271
17349
|
const scrollContainerRef = React3.useRef(null);
|
|
17272
17350
|
const [scrollTop, setScrollTop] = React3.useState(0);
|
|
@@ -17296,7 +17374,7 @@ function useVirtualizedSlides({
|
|
|
17296
17374
|
resizeObserver?.disconnect();
|
|
17297
17375
|
};
|
|
17298
17376
|
}, []);
|
|
17299
|
-
const range =
|
|
17377
|
+
const range = chunkVKOVFVDJ_js.computeVirtualRange(totalItems, itemHeight, scrollTop, viewportHeight, overscan);
|
|
17300
17378
|
const safeItemHeight = Math.max(itemHeight, 1);
|
|
17301
17379
|
const scrollToIndex = React3.useCallback(
|
|
17302
17380
|
(index, behavior = "smooth") => {
|
|
@@ -17342,7 +17420,7 @@ function useTouchGestures(input) {
|
|
|
17342
17420
|
if (!el || !enabled) {
|
|
17343
17421
|
return;
|
|
17344
17422
|
}
|
|
17345
|
-
const recognizer =
|
|
17423
|
+
const recognizer = chunkVKOVFVDJ_js.createTouchGestureRecognizer({
|
|
17346
17424
|
getScale: () => scaleRef.current,
|
|
17347
17425
|
minScale: MIN_ZOOM_SCALE,
|
|
17348
17426
|
maxScale: MAX_ZOOM_SCALE,
|
|
@@ -17385,7 +17463,7 @@ function scrollFocusedIntoView(keyboardInset) {
|
|
|
17385
17463
|
return;
|
|
17386
17464
|
}
|
|
17387
17465
|
const rect = active.getBoundingClientRect();
|
|
17388
|
-
const delta =
|
|
17466
|
+
const delta = chunkVKOVFVDJ_js.computeScrollDelta(
|
|
17389
17467
|
{ top: rect.top, bottom: rect.bottom },
|
|
17390
17468
|
window.innerHeight,
|
|
17391
17469
|
keyboardInset
|
|
@@ -17405,8 +17483,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
17405
17483
|
return;
|
|
17406
17484
|
}
|
|
17407
17485
|
const update = () => {
|
|
17408
|
-
const metrics =
|
|
17409
|
-
const inset = metrics ?
|
|
17486
|
+
const metrics = chunkVKOVFVDJ_js.readViewportMetrics(window);
|
|
17487
|
+
const inset = metrics ? chunkVKOVFVDJ_js.computeKeyboardInset(metrics) : 0;
|
|
17410
17488
|
setKeyboardInset(inset);
|
|
17411
17489
|
if (inset > 0) {
|
|
17412
17490
|
window.requestAnimationFrame(() => scrollFocusedIntoView(inset));
|
|
@@ -17417,8 +17495,8 @@ function useKeyboardInsets(enabled = true) {
|
|
|
17417
17495
|
vv.addEventListener("scroll", update);
|
|
17418
17496
|
const onFocusIn = () => {
|
|
17419
17497
|
window.requestAnimationFrame(() => {
|
|
17420
|
-
const metrics =
|
|
17421
|
-
const inset = metrics ?
|
|
17498
|
+
const metrics = chunkVKOVFVDJ_js.readViewportMetrics(window);
|
|
17499
|
+
const inset = metrics ? chunkVKOVFVDJ_js.computeKeyboardInset(metrics) : 0;
|
|
17422
17500
|
if (inset > 0) {
|
|
17423
17501
|
scrollFocusedIntoView(inset);
|
|
17424
17502
|
}
|
|
@@ -17431,7 +17509,7 @@ function useKeyboardInsets(enabled = true) {
|
|
|
17431
17509
|
document.removeEventListener("focusin", onFocusIn);
|
|
17432
17510
|
};
|
|
17433
17511
|
}, [enabled]);
|
|
17434
|
-
return { keyboardInset, isKeyboardOpen:
|
|
17512
|
+
return { keyboardInset, isKeyboardOpen: chunkVKOVFVDJ_js.isKeyboardOpen(keyboardInset) };
|
|
17435
17513
|
}
|
|
17436
17514
|
|
|
17437
17515
|
// src/viewer/hooks/useViewerBuildingBlocks-canvas-props.ts
|
|
@@ -17486,13 +17564,13 @@ function buildCanvasProps(input) {
|
|
|
17486
17564
|
if (mode === "present") {
|
|
17487
17565
|
presentation.handlePresentationAction(action);
|
|
17488
17566
|
} else if (action.url) {
|
|
17489
|
-
|
|
17567
|
+
chunkVKOVFVDJ_js.safeOpenUrl(action.url);
|
|
17490
17568
|
}
|
|
17491
17569
|
};
|
|
17492
17570
|
const handleHyperlinkClick = (url) => {
|
|
17493
|
-
if (
|
|
17571
|
+
if (chunkVKOVFVDJ_js.isPpactionUrl(url)) {
|
|
17494
17572
|
if (mode === "present") {
|
|
17495
|
-
const parsed =
|
|
17573
|
+
const parsed = chunkVKOVFVDJ_js.parsePpactionUrl(url);
|
|
17496
17574
|
if (parsed) {
|
|
17497
17575
|
presentation.handlePresentationAction({
|
|
17498
17576
|
action: parsed.action,
|
|
@@ -17502,7 +17580,7 @@ function buildCanvasProps(input) {
|
|
|
17502
17580
|
}
|
|
17503
17581
|
return;
|
|
17504
17582
|
}
|
|
17505
|
-
|
|
17583
|
+
chunkVKOVFVDJ_js.safeOpenUrl(url);
|
|
17506
17584
|
};
|
|
17507
17585
|
return {
|
|
17508
17586
|
activeSlide: effectiveSlide,
|
|
@@ -17822,7 +17900,7 @@ function buildToolbarProps(input) {
|
|
|
17822
17900
|
onOpenFile,
|
|
17823
17901
|
onOpenRecentFile,
|
|
17824
17902
|
onCreatePresentation: (templateId) => {
|
|
17825
|
-
s.setSlides(
|
|
17903
|
+
s.setSlides(chunkVKOVFVDJ_js.createBackstagePresentation(templateId));
|
|
17826
17904
|
s.setActiveSlideIndex(0);
|
|
17827
17905
|
s.setSelectedElementId(null);
|
|
17828
17906
|
s.setSelectedElementIds([]);
|
|
@@ -17877,7 +17955,7 @@ function buildToolbarProps(input) {
|
|
|
17877
17955
|
isCommentsPanelOpen: s.isInspectorPaneOpen,
|
|
17878
17956
|
slideCommentCount: activeSlide?.comments?.length ?? 0,
|
|
17879
17957
|
formatPainterActive: s.formatPainterActive,
|
|
17880
|
-
canActivateFormatPainter:
|
|
17958
|
+
canActivateFormatPainter: chunkVKOVFVDJ_js.hasCopyableFormat(selectedElement),
|
|
17881
17959
|
onToggleFormatPainter: () => s.setFormatPainterActive((p) => !p),
|
|
17882
17960
|
isSelectionPaneOpen: s.isSelectionPaneOpen,
|
|
17883
17961
|
onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
|
|
@@ -18140,7 +18218,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
18140
18218
|
}, [incomingContent]);
|
|
18141
18219
|
const onOpenFile = React3.useCallback(() => {
|
|
18142
18220
|
void (async () => {
|
|
18143
|
-
const picked = await
|
|
18221
|
+
const picked = await chunkVKOVFVDJ_js.openPptxFile();
|
|
18144
18222
|
if (picked) {
|
|
18145
18223
|
setContent(picked.buffer);
|
|
18146
18224
|
}
|
|
@@ -18148,7 +18226,7 @@ function useViewerBuildingBlocks(input) {
|
|
|
18148
18226
|
}, []);
|
|
18149
18227
|
const onOpenRecentFile = React3.useCallback((key) => {
|
|
18150
18228
|
void (async () => {
|
|
18151
|
-
const bytes = await
|
|
18229
|
+
const bytes = await chunkVKOVFVDJ_js.readBackstageRecentFile(key);
|
|
18152
18230
|
if (bytes) {
|
|
18153
18231
|
setContent(bytes);
|
|
18154
18232
|
}
|
|
@@ -18462,6 +18540,7 @@ exports.useViewerBuildingBlocks = useViewerBuildingBlocks;
|
|
|
18462
18540
|
exports.useViewerCoreState = useViewerCoreState;
|
|
18463
18541
|
exports.useViewerDialogs = useViewerDialogs;
|
|
18464
18542
|
exports.useViewerIntegration = useViewerIntegration;
|
|
18543
|
+
exports.useViewerOptions = useViewerOptions;
|
|
18465
18544
|
exports.useViewerState = useViewerState;
|
|
18466
18545
|
exports.useViewerUIState = useViewerUIState;
|
|
18467
18546
|
exports.useVirtualizedSlides = useVirtualizedSlides;
|