pptx-react-viewer 2.5.2 → 2.6.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 +13 -0
- package/dist/{AiChatPanel-OHSLJNYG.js → AiChatPanel-53W2JG6G.js} +22 -22
- package/dist/AiChatPanel-53W2JG6G.js.br +0 -0
- package/dist/AiChatPanel-53W2JG6G.js.gz +0 -0
- package/dist/{AiChatPanel-EMF3UYCE.mjs → AiChatPanel-L5IOO72H.mjs} +3 -3
- package/dist/AiChatPanel-L5IOO72H.mjs.br +0 -0
- package/dist/AiChatPanel-L5IOO72H.mjs.gz +0 -0
- package/dist/{Model3DScene-ULHIJPMU.js → Model3DScene-E7JGXNJN.js} +2 -2
- package/dist/Model3DScene-E7JGXNJN.js.br +0 -0
- package/dist/Model3DScene-E7JGXNJN.js.gz +0 -0
- package/dist/{Model3DScene-X6QJTWHV.mjs → Model3DScene-EW7OWRJK.mjs} +1 -1
- package/dist/Model3DScene-EW7OWRJK.mjs.br +0 -0
- package/dist/Model3DScene-EW7OWRJK.mjs.gz +0 -0
- package/dist/{SurfaceChart3DScene-K7Q5NYZ4.js → SurfaceChart3DScene-3QB6NVKD.js} +2 -2
- package/dist/SurfaceChart3DScene-3QB6NVKD.js.br +0 -0
- package/dist/SurfaceChart3DScene-3QB6NVKD.js.gz +0 -0
- package/dist/{SurfaceChart3DScene-PRCKQJQQ.mjs → SurfaceChart3DScene-64HI3U7Y.mjs} +1 -1
- package/dist/{SurfaceChart3DScene-PRCKQJQQ.mjs.br → SurfaceChart3DScene-64HI3U7Y.mjs.br} +0 -0
- package/dist/SurfaceChart3DScene-64HI3U7Y.mjs.gz +0 -0
- package/dist/{chunk-VOV2N3NY.mjs → chunk-34ZW32XK.mjs} +919 -65
- package/dist/chunk-34ZW32XK.mjs.br +0 -0
- package/dist/chunk-34ZW32XK.mjs.gz +0 -0
- package/dist/{chunk-TGVID6BB.mjs → chunk-DWQJW3UM.mjs} +19 -4
- package/dist/chunk-DWQJW3UM.mjs.br +0 -0
- package/dist/chunk-DWQJW3UM.mjs.gz +0 -0
- package/dist/{chunk-7Q7AEPO7.js → chunk-EJ24IFPL.js} +346 -315
- package/dist/chunk-EJ24IFPL.js.br +0 -0
- package/dist/chunk-EJ24IFPL.js.gz +0 -0
- package/dist/{chunk-NVH3RIN7.js → chunk-NXSAYLYI.js} +251 -236
- package/dist/chunk-NXSAYLYI.js.br +0 -0
- package/dist/chunk-NXSAYLYI.js.gz +0 -0
- package/dist/{chunk-WJKMTDXS.mjs → chunk-PENV7S7Z.mjs} +1 -1
- package/dist/chunk-PENV7S7Z.mjs.br +0 -0
- package/dist/{chunk-WJKMTDXS.mjs.gz → chunk-PENV7S7Z.mjs.gz} +0 -0
- package/dist/{chunk-HDKHZKSW.mjs → chunk-UO55N46T.mjs} +91 -13
- package/dist/chunk-UO55N46T.mjs.br +0 -0
- package/dist/chunk-UO55N46T.mjs.gz +0 -0
- package/dist/{chunk-LTEDT475.js → chunk-UVA55CRK.js} +921 -64
- package/dist/chunk-UVA55CRK.js.br +0 -0
- package/dist/chunk-UVA55CRK.js.gz +0 -0
- package/dist/{chunk-OSSVKJGF.js → chunk-V5XVTKFS.js} +925 -847
- package/dist/chunk-V5XVTKFS.js.br +0 -0
- package/dist/chunk-V5XVTKFS.js.gz +0 -0
- package/dist/{chunk-MJAEB43A.js → chunk-VBWWICDF.js} +3 -3
- package/dist/chunk-VBWWICDF.js.br +0 -0
- package/dist/chunk-VBWWICDF.js.gz +0 -0
- package/dist/{chunk-LIQGO45T.mjs → chunk-WCO3NEH5.mjs} +35 -4
- package/dist/chunk-WCO3NEH5.mjs.br +0 -0
- package/dist/chunk-WCO3NEH5.mjs.gz +0 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +34 -34
- package/dist/index.js.br +0 -0
- package/dist/index.js.gz +0 -0
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.br +0 -0
- package/dist/index.mjs.gz +0 -0
- package/dist/internals.d.ts +42 -0
- package/dist/internals.d.ts.map +1 -1
- package/dist/internals.js +78 -78
- package/dist/internals.js.br +0 -0
- package/dist/internals.js.gz +0 -0
- package/dist/internals.mjs +3 -3
- package/dist/internals.mjs.br +0 -0
- package/dist/internals.mjs.gz +0 -0
- package/dist/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.d.ts +15 -0
- package/dist/viewer/index.js +21 -21
- package/dist/viewer/index.js.br +0 -0
- package/dist/viewer/index.js.gz +0 -0
- package/dist/viewer/index.mjs +5 -5
- package/dist/viewer/index.mjs.br +0 -0
- package/dist/viewer/index.mjs.gz +0 -0
- package/package.json +3 -3
- package/dist/AiChatPanel-EMF3UYCE.mjs.br +0 -0
- package/dist/AiChatPanel-EMF3UYCE.mjs.gz +0 -0
- package/dist/AiChatPanel-OHSLJNYG.js.br +0 -0
- package/dist/AiChatPanel-OHSLJNYG.js.gz +0 -0
- package/dist/Model3DScene-ULHIJPMU.js.br +0 -0
- package/dist/Model3DScene-ULHIJPMU.js.gz +0 -0
- package/dist/Model3DScene-X6QJTWHV.mjs.br +0 -0
- package/dist/Model3DScene-X6QJTWHV.mjs.gz +0 -0
- package/dist/SurfaceChart3DScene-K7Q5NYZ4.js.br +0 -0
- package/dist/SurfaceChart3DScene-K7Q5NYZ4.js.gz +0 -0
- package/dist/SurfaceChart3DScene-PRCKQJQQ.mjs.gz +0 -0
- package/dist/chunk-7Q7AEPO7.js.br +0 -0
- package/dist/chunk-7Q7AEPO7.js.gz +0 -0
- package/dist/chunk-HDKHZKSW.mjs.br +0 -0
- package/dist/chunk-HDKHZKSW.mjs.gz +0 -0
- package/dist/chunk-LIQGO45T.mjs.br +0 -0
- package/dist/chunk-LIQGO45T.mjs.gz +0 -0
- package/dist/chunk-LTEDT475.js.br +0 -0
- package/dist/chunk-LTEDT475.js.gz +0 -0
- package/dist/chunk-MJAEB43A.js.br +0 -0
- package/dist/chunk-MJAEB43A.js.gz +0 -0
- package/dist/chunk-NVH3RIN7.js.br +0 -0
- package/dist/chunk-NVH3RIN7.js.gz +0 -0
- package/dist/chunk-OSSVKJGF.js.br +0 -0
- package/dist/chunk-OSSVKJGF.js.gz +0 -0
- package/dist/chunk-TGVID6BB.mjs.br +0 -0
- package/dist/chunk-TGVID6BB.mjs.gz +0 -0
- package/dist/chunk-VOV2N3NY.mjs.br +0 -0
- package/dist/chunk-VOV2N3NY.mjs.gz +0 -0
- package/dist/chunk-WJKMTDXS.mjs.br +0 -0
|
@@ -1627,7 +1627,7 @@ function decompressEotFont(fontData, compressed, encrypted) {
|
|
|
1627
1627
|
return decompressMtx(fontData, { encrypted});
|
|
1628
1628
|
}
|
|
1629
1629
|
|
|
1630
|
-
// ../../node_modules/.bun/emf-converter@2.0.
|
|
1630
|
+
// ../../node_modules/.bun/emf-converter@2.0.2/node_modules/emf-converter/dist/index.mjs
|
|
1631
1631
|
function colorRefToHex(r, g, b) {
|
|
1632
1632
|
const toHex4 = (v) => v.toString(16).padStart(2, "0");
|
|
1633
1633
|
return `#${toHex4(r & 255)}${toHex4(g & 255)}${toHex4(b & 255)}`;
|
|
@@ -2046,19 +2046,22 @@ function mapFontFamily(face, map) {
|
|
|
2046
2046
|
}
|
|
2047
2047
|
return resolved;
|
|
2048
2048
|
}
|
|
2049
|
-
function
|
|
2049
|
+
function fontSizePx(state, scale = 1) {
|
|
2050
|
+
return Math.max(Math.abs(state.fontHeight) * Math.abs(scale || 1), 8);
|
|
2051
|
+
}
|
|
2052
|
+
function applyFont(ctx, state, scale = 1) {
|
|
2050
2053
|
const italic = state.fontItalic ? "italic " : "";
|
|
2051
2054
|
const weight = cssFontWeight(state.fontWeight);
|
|
2052
2055
|
const weightPart = weight ? `${weight} ` : "";
|
|
2053
|
-
const size =
|
|
2056
|
+
const size = fontSizePx(state, scale);
|
|
2054
2057
|
const family = mapFontFamily(state.fontFamily, state.fontFamilyMap);
|
|
2055
2058
|
ctx.font = `${italic}${weightPart}${size}px ${family}`;
|
|
2056
2059
|
}
|
|
2057
|
-
function drawTextDecorations(ctx, state, x, y, width) {
|
|
2060
|
+
function drawTextDecorations(ctx, state, x, y, width, scale = 1) {
|
|
2058
2061
|
if (!state.fontUnderline && !state.fontStrikeOut) {
|
|
2059
2062
|
return;
|
|
2060
2063
|
}
|
|
2061
|
-
const size =
|
|
2064
|
+
const size = fontSizePx(state, scale);
|
|
2062
2065
|
const thickness = Math.max(1, Math.round(size / 14));
|
|
2063
2066
|
const prevFill = ctx.fillStyle;
|
|
2064
2067
|
ctx.fillStyle = state.textColor;
|
|
@@ -3007,7 +3010,8 @@ function handleExtTextOutW(rCtx, offset, dataOff, recSize) {
|
|
|
3007
3010
|
if (nChars > 0 && offString > 0 && offset + offString + nChars * 2 <= maxOffset) {
|
|
3008
3011
|
const text2 = readUtf16LE(view, offset + offString, nChars);
|
|
3009
3012
|
if (text2.length > 0) {
|
|
3010
|
-
|
|
3013
|
+
const fontScale = Math.abs(gmh(rCtx, 1));
|
|
3014
|
+
applyFont(ctx, state, fontScale);
|
|
3011
3015
|
ctx.fillStyle = state.textColor;
|
|
3012
3016
|
const vAlign = state.textAlign & 24;
|
|
3013
3017
|
const alignBaseline = vAlign === 24 ? "alphabetic" : vAlign === 8 ? "bottom" : "top";
|
|
@@ -3022,7 +3026,7 @@ function handleExtTextOutW(rCtx, offset, dataOff, recSize) {
|
|
|
3022
3026
|
ctx.textAlign = alignHoriz;
|
|
3023
3027
|
if (state.bkMode === 2) {
|
|
3024
3028
|
const measured = ctx.measureText(text2);
|
|
3025
|
-
const bgH = state
|
|
3029
|
+
const bgH = fontSizePx(state, fontScale);
|
|
3026
3030
|
ctx.fillStyle = state.bkColor;
|
|
3027
3031
|
ctx.fillRect(gmx(rCtx, refX), gmy(rCtx, refY) - bgH, measured.width, bgH);
|
|
3028
3032
|
ctx.fillStyle = state.textColor;
|
|
@@ -3032,7 +3036,7 @@ function handleExtTextOutW(rCtx, offset, dataOff, recSize) {
|
|
|
3032
3036
|
const w = ctx.measureText(text2).width;
|
|
3033
3037
|
const baseX = gmx(rCtx, refX);
|
|
3034
3038
|
const startX = alignHoriz === "center" ? baseX - w / 2 : alignHoriz === "right" ? baseX - w : baseX;
|
|
3035
|
-
drawTextDecorations(ctx, state, startX, gmy(rCtx, refY), w);
|
|
3039
|
+
drawTextDecorations(ctx, state, startX, gmy(rCtx, refY), w, fontScale);
|
|
3036
3040
|
}
|
|
3037
3041
|
}
|
|
3038
3042
|
}
|
|
@@ -6186,7 +6190,7 @@ function handleWmfDrawRecord(wCtx, recType, offset, dataOff, recSize) {
|
|
|
6186
6190
|
if (txOff + 4 <= offset + recSize) {
|
|
6187
6191
|
const ty2 = view.getInt16(txOff, true);
|
|
6188
6192
|
const txCoord = view.getInt16(txOff + 2, true);
|
|
6189
|
-
applyFont(ctx, state);
|
|
6193
|
+
applyFont(ctx, state, Math.abs(mh(1)));
|
|
6190
6194
|
ctx.fillStyle = state.textColor;
|
|
6191
6195
|
ctx.fillText(text2, mx(txCoord), my(ty2));
|
|
6192
6196
|
}
|
|
@@ -6209,7 +6213,7 @@ function handleWmfDrawRecord(wCtx, recType, offset, dataOff, recSize) {
|
|
|
6209
6213
|
}
|
|
6210
6214
|
text2 += String.fromCharCode(ch);
|
|
6211
6215
|
}
|
|
6212
|
-
applyFont(ctx, state);
|
|
6216
|
+
applyFont(ctx, state, Math.abs(mh(1)));
|
|
6213
6217
|
ctx.fillStyle = state.textColor;
|
|
6214
6218
|
ctx.fillText(text2, mx(txCoord), my(ty2));
|
|
6215
6219
|
}
|
|
@@ -12650,9 +12654,9 @@ var PptxEffectDagExtractor = class {
|
|
|
12650
12654
|
if (Number.isFinite(endPos)) {
|
|
12651
12655
|
style.reflectionEndPosition = endPos / 1e5;
|
|
12652
12656
|
}
|
|
12653
|
-
const
|
|
12654
|
-
if (Number.isFinite(
|
|
12655
|
-
style.reflectionDistance =
|
|
12657
|
+
const dist2 = parseInt(String(refl["@_dist"] || ""), 10);
|
|
12658
|
+
if (Number.isFinite(dist2) && dist2 >= 0) {
|
|
12659
|
+
style.reflectionDistance = dist2 / this.context.emuPerPx;
|
|
12656
12660
|
}
|
|
12657
12661
|
}
|
|
12658
12662
|
extractDagBlur(dag, style) {
|
|
@@ -13799,10 +13803,7 @@ var PptxShapeStyleExtractor = class {
|
|
|
13799
13803
|
}
|
|
13800
13804
|
const lineNode = shapeProps["a:ln"];
|
|
13801
13805
|
if (lineNode) {
|
|
13802
|
-
|
|
13803
|
-
if (earlyReturn) {
|
|
13804
|
-
return style;
|
|
13805
|
-
}
|
|
13806
|
+
applyLineProperties(lineNode, style, this.context);
|
|
13806
13807
|
} else if (styleNode?.["a:lnRef"]) {
|
|
13807
13808
|
this.context.resolveThemeLineRef(styleNode["a:lnRef"], style);
|
|
13808
13809
|
}
|
|
@@ -20383,6 +20384,11 @@ var STANDARD_TRANSITION_TYPES = /* @__PURE__ */ new Set([
|
|
|
20383
20384
|
]);
|
|
20384
20385
|
var SPEEDS = /* @__PURE__ */ new Set(["slow", "med", "fast"]);
|
|
20385
20386
|
var UINT_MAX = 4294967295;
|
|
20387
|
+
var MORPH_OPTIONS = /* @__PURE__ */ new Set(["byObject", "byWord", "byChar"]);
|
|
20388
|
+
function normalizeMorphOption(value) {
|
|
20389
|
+
const candidate = token(value);
|
|
20390
|
+
return MORPH_OPTIONS.has(candidate) ? candidate : void 0;
|
|
20391
|
+
}
|
|
20386
20392
|
function parseTransitionDetails(node, localName22) {
|
|
20387
20393
|
const result = { type: "cut" };
|
|
20388
20394
|
for (const [key, value] of Object.entries(node)) {
|
|
@@ -20398,6 +20404,11 @@ function parseTransitionDetails(node, localName22) {
|
|
|
20398
20404
|
result.rawExtLst = value;
|
|
20399
20405
|
continue;
|
|
20400
20406
|
}
|
|
20407
|
+
if (name === "morph") {
|
|
20408
|
+
result.type = "morph";
|
|
20409
|
+
result.morphOption = normalizeMorphOption(value?.["@_option"]);
|
|
20410
|
+
continue;
|
|
20411
|
+
}
|
|
20401
20412
|
if (STANDARD_TRANSITION_TYPES.has(name)) {
|
|
20402
20413
|
result.type = name;
|
|
20403
20414
|
}
|
|
@@ -20597,6 +20608,7 @@ var PptxSlideTransitionService = class {
|
|
|
20597
20608
|
let transitionType = details.type;
|
|
20598
20609
|
let { direction, orient, pattern } = details;
|
|
20599
20610
|
const { spokes, thruBlk, rawSoundAction, rawExtLst } = details;
|
|
20611
|
+
let { morphOption } = details;
|
|
20600
20612
|
if (rawExtLst && transitionType === "cut") {
|
|
20601
20613
|
const p14Result = parseP14FromExtLst(rawExtLst, this.xmlLookupService, this.getXmlLocalName);
|
|
20602
20614
|
const p15Result = p14Result ? void 0 : parseP15FromExtLst(rawExtLst, this.xmlLookupService, this.getXmlLocalName);
|
|
@@ -20613,8 +20625,12 @@ var PptxSlideTransitionService = class {
|
|
|
20613
20625
|
}
|
|
20614
20626
|
} else if (p15Result) {
|
|
20615
20627
|
transitionType = p15Result.type;
|
|
20616
|
-
} else
|
|
20617
|
-
|
|
20628
|
+
} else {
|
|
20629
|
+
const morphResult = this.parseMorphFromExtLst(rawExtLst);
|
|
20630
|
+
if (morphResult) {
|
|
20631
|
+
transitionType = "morph";
|
|
20632
|
+
morphOption = morphResult.morphOption;
|
|
20633
|
+
}
|
|
20618
20634
|
}
|
|
20619
20635
|
}
|
|
20620
20636
|
const attributes = parseTransitionAttributes(transitionNode);
|
|
@@ -20627,6 +20643,7 @@ var PptxSlideTransitionService = class {
|
|
|
20627
20643
|
spokes,
|
|
20628
20644
|
pattern,
|
|
20629
20645
|
thruBlk,
|
|
20646
|
+
morphOption,
|
|
20630
20647
|
...sound,
|
|
20631
20648
|
rawSoundAction,
|
|
20632
20649
|
rawExtLst,
|
|
@@ -20672,21 +20689,18 @@ var PptxSlideTransitionService = class {
|
|
|
20672
20689
|
if (!ext) {
|
|
20673
20690
|
continue;
|
|
20674
20691
|
}
|
|
20675
|
-
const
|
|
20676
|
-
const matchesUri = uri.toUpperCase() === MORPH_EXT_URI.toUpperCase();
|
|
20677
|
-
for (const key of Object.keys(ext)) {
|
|
20692
|
+
for (const [key, value] of Object.entries(ext)) {
|
|
20678
20693
|
if (key.startsWith("@_")) {
|
|
20679
20694
|
continue;
|
|
20680
20695
|
}
|
|
20681
20696
|
if (this.getXmlLocalName(key) === "morph") {
|
|
20682
|
-
|
|
20683
|
-
|
|
20684
|
-
}
|
|
20685
|
-
return true;
|
|
20697
|
+
return {
|
|
20698
|
+
morphOption: normalizeMorphOption(value?.["@_option"])
|
|
20699
|
+
};
|
|
20686
20700
|
}
|
|
20687
20701
|
}
|
|
20688
20702
|
}
|
|
20689
|
-
return
|
|
20703
|
+
return void 0;
|
|
20690
20704
|
}
|
|
20691
20705
|
buildSlideTransitionXml(transition) {
|
|
20692
20706
|
if (!transition || transition.type === "none") {
|
|
@@ -20710,7 +20724,9 @@ var PptxSlideTransitionService = class {
|
|
|
20710
20724
|
} else if (isP15Type) {
|
|
20711
20725
|
node["p:extLst"] = transition.rawExtLst ?? buildP15ExtLst(transitionType);
|
|
20712
20726
|
} else if (isMorphType) {
|
|
20713
|
-
|
|
20727
|
+
if (!this.hasDirectMorphChild(node)) {
|
|
20728
|
+
node["p:extLst"] = this.buildMorphExtLst(transition.rawExtLst, transition.morphOption);
|
|
20729
|
+
}
|
|
20714
20730
|
} else {
|
|
20715
20731
|
node[`p:${transitionType}`] = buildStandardTransitionChild(transition);
|
|
20716
20732
|
}
|
|
@@ -20724,16 +20740,32 @@ var PptxSlideTransitionService = class {
|
|
|
20724
20740
|
}
|
|
20725
20741
|
return node;
|
|
20726
20742
|
}
|
|
20743
|
+
/**
|
|
20744
|
+
* True when the (preserved) transition node already carries a `morph`
|
|
20745
|
+
* element as a direct child, in any namespace prefix.
|
|
20746
|
+
*/
|
|
20747
|
+
hasDirectMorphChild(node) {
|
|
20748
|
+
for (const key of Object.keys(node)) {
|
|
20749
|
+
if (!key.startsWith("@_") && this.getXmlLocalName(key) === "morph") {
|
|
20750
|
+
return true;
|
|
20751
|
+
}
|
|
20752
|
+
}
|
|
20753
|
+
return false;
|
|
20754
|
+
}
|
|
20727
20755
|
/**
|
|
20728
20756
|
* Build the extLst XML node for a morph (p159) transition, preserving any
|
|
20729
20757
|
* non-morph extensions from rawExtLst.
|
|
20730
20758
|
*/
|
|
20731
|
-
buildMorphExtLst(rawExtLst) {
|
|
20759
|
+
buildMorphExtLst(rawExtLst, morphOption) {
|
|
20760
|
+
const morphNode = {
|
|
20761
|
+
"@_xmlns:p159": "http://schemas.microsoft.com/office/powerpoint/2015/09/main"
|
|
20762
|
+
};
|
|
20763
|
+
if (morphOption) {
|
|
20764
|
+
morphNode["@_option"] = morphOption;
|
|
20765
|
+
}
|
|
20732
20766
|
const morphExt = {
|
|
20733
20767
|
"@_uri": MORPH_EXT_URI,
|
|
20734
|
-
"p159:morph":
|
|
20735
|
-
"@_xmlns:p159": "http://schemas.microsoft.com/office/powerpoint/2015/09/main"
|
|
20736
|
-
}
|
|
20768
|
+
"p159:morph": morphNode
|
|
20737
20769
|
};
|
|
20738
20770
|
if (!rawExtLst) {
|
|
20739
20771
|
return { "p:ext": morphExt };
|
|
@@ -40950,12 +40982,12 @@ function estimateTextBoxCapacity(element) {
|
|
|
40950
40982
|
if (fontSizePt <= 0) {
|
|
40951
40983
|
fontSizePt = DEFAULT_FONT_SIZE_PT;
|
|
40952
40984
|
}
|
|
40953
|
-
const
|
|
40985
|
+
const fontSizePx2 = fontSizePt * (4 / 3);
|
|
40954
40986
|
const lineHeightMultiplier = style?.lineSpacing ?? DEFAULT_LINE_HEIGHT_MULTIPLIER;
|
|
40955
|
-
const lineHeightPx =
|
|
40987
|
+
const lineHeightPx = fontSizePx2 * lineHeightMultiplier;
|
|
40956
40988
|
const charsPerLine = Math.max(
|
|
40957
40989
|
1,
|
|
40958
|
-
Math.floor(availableWidth / (
|
|
40990
|
+
Math.floor(availableWidth / (fontSizePx2 * AVG_CHAR_WIDTH_RATIO))
|
|
40959
40991
|
);
|
|
40960
40992
|
const numLines = Math.max(1, Math.floor(availableHeight / lineHeightPx));
|
|
40961
40993
|
return charsPerLine * numLines;
|
|
@@ -49654,17 +49686,17 @@ function buildShadowColorNode(hex10, opacity2) {
|
|
|
49654
49686
|
};
|
|
49655
49687
|
}
|
|
49656
49688
|
function distAndDir(ox, oy) {
|
|
49657
|
-
const
|
|
49689
|
+
const dist2 = Math.sqrt(ox * ox + oy * oy);
|
|
49658
49690
|
const dir = Math.atan2(oy, ox) * 180 / Math.PI;
|
|
49659
|
-
return { dist, dir };
|
|
49691
|
+
return { dist: dist2, dir };
|
|
49660
49692
|
}
|
|
49661
49693
|
function buildOuterShadowNode(style) {
|
|
49662
49694
|
const ox = style.textShadowOffsetX ?? 0;
|
|
49663
49695
|
const oy = style.textShadowOffsetY ?? 0;
|
|
49664
|
-
const { dist, dir } = distAndDir(ox, oy);
|
|
49696
|
+
const { dist: dist2, dir } = distAndDir(ox, oy);
|
|
49665
49697
|
return {
|
|
49666
49698
|
"@_blurRad": String(Math.round((style.textShadowBlur ?? 4) * EMU_PER_PX8)),
|
|
49667
|
-
"@_dist": String(Math.round(
|
|
49699
|
+
"@_dist": String(Math.round(dist2 * EMU_PER_PX8)),
|
|
49668
49700
|
"@_dir": String(Math.round(dir * 6e4)),
|
|
49669
49701
|
"a:srgbClr": buildShadowColorNode(style.textShadowColor || "#000000", style.textShadowOpacity)
|
|
49670
49702
|
};
|
|
@@ -49672,10 +49704,10 @@ function buildOuterShadowNode(style) {
|
|
|
49672
49704
|
function buildInnerShadowNode(style) {
|
|
49673
49705
|
const ox = style.textInnerShadowOffsetX ?? 0;
|
|
49674
49706
|
const oy = style.textInnerShadowOffsetY ?? 0;
|
|
49675
|
-
const { dist, dir } = distAndDir(ox, oy);
|
|
49707
|
+
const { dist: dist2, dir } = distAndDir(ox, oy);
|
|
49676
49708
|
return {
|
|
49677
49709
|
"@_blurRad": String(Math.round((style.textInnerShadowBlur ?? 3) * EMU_PER_PX8)),
|
|
49678
|
-
"@_dist": String(Math.round(
|
|
49710
|
+
"@_dist": String(Math.round(dist2 * EMU_PER_PX8)),
|
|
49679
49711
|
"@_dir": String(Math.round(dir * 6e4)),
|
|
49680
49712
|
"a:srgbClr": buildShadowColorNode(
|
|
49681
49713
|
style.textInnerShadowColor || "#000000",
|
|
@@ -51301,10 +51333,10 @@ var PptxHandlerRuntime18 = class extends PptxHandlerRuntime17 {
|
|
|
51301
51333
|
const distRaw = Number.parseInt(String(outerShdw["@_dist"] || ""), 10);
|
|
51302
51334
|
const dirRaw = Number.parseInt(String(outerShdw["@_dir"] || ""), 10);
|
|
51303
51335
|
if (Number.isFinite(distRaw) && distRaw >= 0) {
|
|
51304
|
-
const
|
|
51336
|
+
const dist2 = distRaw / PptxHandlerRuntime17.EMU_PER_PX;
|
|
51305
51337
|
const dirRad = (Number.isFinite(dirRaw) ? dirRaw / 6e4 : 0) * Math.PI / 180;
|
|
51306
|
-
style.textShadowOffsetX = Math.round(Math.cos(dirRad) *
|
|
51307
|
-
style.textShadowOffsetY = Math.round(Math.sin(dirRad) *
|
|
51338
|
+
style.textShadowOffsetX = Math.round(Math.cos(dirRad) * dist2 * 100) / 100;
|
|
51339
|
+
style.textShadowOffsetY = Math.round(Math.sin(dirRad) * dist2 * 100) / 100;
|
|
51308
51340
|
}
|
|
51309
51341
|
}
|
|
51310
51342
|
const glowNode = runEffectList["a:glow"];
|
|
@@ -62894,6 +62926,12 @@ var PptxHandlerRuntime62 = class _PptxHandlerRuntime26 extends PptxHandlerRuntim
|
|
|
62894
62926
|
...endParagraphStyle,
|
|
62895
62927
|
...defaultRunStyle
|
|
62896
62928
|
};
|
|
62929
|
+
if (mergedDefaultRunStyle.color === void 0 && ctx.styleFontRefColor !== void 0) {
|
|
62930
|
+
mergedDefaultRunStyle.color = ctx.styleFontRefColor;
|
|
62931
|
+
}
|
|
62932
|
+
if (mergedDefaultRunStyle.fontFamily === void 0 && ctx.styleFontRefTypeface !== void 0) {
|
|
62933
|
+
mergedDefaultRunStyle.fontFamily = ctx.styleFontRefTypeface;
|
|
62934
|
+
}
|
|
62897
62935
|
if (ctx.effectiveLevelStyles) {
|
|
62898
62936
|
const normalizedLevel = level === -1 ? -1 : Number.isFinite(level) ? Math.min(Math.max(level, 0), 8) : 0;
|
|
62899
62937
|
const phLevel = ctx.effectiveLevelStyles[normalizedLevel] ?? ctx.effectiveLevelStyles[-1] ?? (normalizedLevel === -1 ? ctx.effectiveLevelStyles[0] : void 0);
|
|
@@ -62966,10 +63004,17 @@ var PptxHandlerRuntime63 = class extends PptxHandlerRuntime62 {
|
|
|
62966
63004
|
} else {
|
|
62967
63005
|
bulletText = "\u2022 ";
|
|
62968
63006
|
}
|
|
63007
|
+
const bulletStyle = { ...mergedDefaultRunStyle };
|
|
63008
|
+
if (paragraphBulletInfo.sizePercent === void 0 && paragraphBulletInfo.sizePts === void 0) {
|
|
63009
|
+
const firstRunSize = this.resolveFirstRunFontSize(p, paraAlign, ctx);
|
|
63010
|
+
if (firstRunSize !== void 0) {
|
|
63011
|
+
bulletStyle.fontSize = firstRunSize;
|
|
63012
|
+
}
|
|
63013
|
+
}
|
|
62969
63014
|
parts.push(bulletText);
|
|
62970
63015
|
segments.push({
|
|
62971
63016
|
text: bulletText,
|
|
62972
|
-
style:
|
|
63017
|
+
style: bulletStyle,
|
|
62973
63018
|
bulletInfo: paragraphBulletInfo
|
|
62974
63019
|
});
|
|
62975
63020
|
maybeSeed(mergedDefaultRunStyle);
|
|
@@ -63179,6 +63224,32 @@ var PptxHandlerRuntime63 = class extends PptxHandlerRuntime62 {
|
|
|
63179
63224
|
}
|
|
63180
63225
|
return { parts, segments, seedStyle };
|
|
63181
63226
|
}
|
|
63227
|
+
/**
|
|
63228
|
+
* Font size (px) of the first text run in a paragraph, or `undefined` when
|
|
63229
|
+
* the paragraph has no run that declares one.
|
|
63230
|
+
*
|
|
63231
|
+
* Used to size an unsized bullet the way PowerPoint does: `a:buChar` /
|
|
63232
|
+
* `a:buAutoNum` with no `a:buSzPct`/`a:buSzPts` inherits the first run's
|
|
63233
|
+
* size. Only `a:r` and `a:fld` carry renderable text; `a:br` does not.
|
|
63234
|
+
*/
|
|
63235
|
+
resolveFirstRunFontSize(p, paraAlign, ctx) {
|
|
63236
|
+
for (const key of ["a:r", "a:fld"]) {
|
|
63237
|
+
const node = p[key];
|
|
63238
|
+
if (!node) {
|
|
63239
|
+
continue;
|
|
63240
|
+
}
|
|
63241
|
+
const first = this.ensureArray(node)[0];
|
|
63242
|
+
const runProps = first?.["a:rPr"];
|
|
63243
|
+
if (!runProps) {
|
|
63244
|
+
continue;
|
|
63245
|
+
}
|
|
63246
|
+
const style = this.extractTextRunStyle(runProps, paraAlign, ctx.slideRelationshipMap);
|
|
63247
|
+
if (typeof style.fontSize === "number") {
|
|
63248
|
+
return style.fontSize;
|
|
63249
|
+
}
|
|
63250
|
+
}
|
|
63251
|
+
return void 0;
|
|
63252
|
+
}
|
|
63182
63253
|
/**
|
|
63183
63254
|
* Parse an `a:ruby` element into a {@link TextSegment} with ruby annotation metadata.
|
|
63184
63255
|
*
|
|
@@ -63400,15 +63471,13 @@ var PptxHandlerRuntime64 = class _PptxHandlerRuntime27 extends PptxHandlerRuntim
|
|
|
63400
63471
|
Object.assign(textStyle, bodyDefaultRunStyle);
|
|
63401
63472
|
const fontRef = styleNode?.["a:fontRef"];
|
|
63402
63473
|
const fontRefIdx = String(fontRef?.["@_idx"] || "").toLowerCase();
|
|
63403
|
-
|
|
63404
|
-
|
|
63405
|
-
|
|
63406
|
-
|
|
63407
|
-
textStyle.fontFamily = resolved;
|
|
63408
|
-
}
|
|
63474
|
+
const styleFontRefTypeface = fontRefIdx.length > 0 ? this.resolveThemeTypeface(fontRefIdx.includes("minor") ? "+mn-lt" : "+mj-lt") : void 0;
|
|
63475
|
+
const styleFontRefColor = fontRef ? this.parseColor(fontRef) : void 0;
|
|
63476
|
+
if (!textStyle.fontFamily && styleFontRefTypeface) {
|
|
63477
|
+
textStyle.fontFamily = styleFontRefTypeface;
|
|
63409
63478
|
}
|
|
63410
63479
|
if (!textStyle.color) {
|
|
63411
|
-
textStyle.color =
|
|
63480
|
+
textStyle.color = styleFontRefColor;
|
|
63412
63481
|
}
|
|
63413
63482
|
const bodyPr = txBody?.["a:bodyPr"] || inheritedTxBody?.["a:bodyPr"];
|
|
63414
63483
|
const bodyPropResult = this.applyBodyProperties(
|
|
@@ -63439,7 +63508,9 @@ var PptxHandlerRuntime64 = class _PptxHandlerRuntime27 extends PptxHandlerRuntim
|
|
|
63439
63508
|
placeholderInfo: placeholderInfo ?? void 0,
|
|
63440
63509
|
phDefaults,
|
|
63441
63510
|
slidePath,
|
|
63442
|
-
effectiveLevelStyles
|
|
63511
|
+
effectiveLevelStyles,
|
|
63512
|
+
styleFontRefColor,
|
|
63513
|
+
styleFontRefTypeface
|
|
63443
63514
|
};
|
|
63444
63515
|
paras.forEach((p, pIdx) => {
|
|
63445
63516
|
const styleResult = this.resolveShapeParagraphStyle(p, textStyle, ctx);
|
|
@@ -66349,12 +66420,12 @@ var PptxHandlerRuntime77 = class _PptxHandlerRuntime33 extends PptxHandlerRuntim
|
|
|
66349
66420
|
if (Number.isFinite(blurRad) && blurRad > 0) {
|
|
66350
66421
|
result.shadowBlur = blurRad / _PptxHandlerRuntime33.EMU_PER_PX;
|
|
66351
66422
|
}
|
|
66352
|
-
const
|
|
66423
|
+
const dist2 = parseInt(String(outerShdw["@_dist"] || "0"));
|
|
66353
66424
|
const dir = parseInt(String(outerShdw["@_dir"] || "0"));
|
|
66354
|
-
if (Number.isFinite(
|
|
66425
|
+
if (Number.isFinite(dist2) && dist2 > 0 && Number.isFinite(dir)) {
|
|
66355
66426
|
const angleRad = dir / 6e4 * (Math.PI / 180);
|
|
66356
|
-
result.shadowOffsetX = Math.cos(angleRad) *
|
|
66357
|
-
result.shadowOffsetY = Math.sin(angleRad) *
|
|
66427
|
+
result.shadowOffsetX = Math.cos(angleRad) * dist2 / _PptxHandlerRuntime33.EMU_PER_PX;
|
|
66428
|
+
result.shadowOffsetY = Math.sin(angleRad) * dist2 / _PptxHandlerRuntime33.EMU_PER_PX;
|
|
66358
66429
|
}
|
|
66359
66430
|
}
|
|
66360
66431
|
const innerShdw = effectLst["a:innerShdw"];
|
|
@@ -66365,12 +66436,12 @@ var PptxHandlerRuntime77 = class _PptxHandlerRuntime33 extends PptxHandlerRuntim
|
|
|
66365
66436
|
if (Number.isFinite(blurRad) && blurRad > 0) {
|
|
66366
66437
|
result.innerShadowBlur = blurRad / _PptxHandlerRuntime33.EMU_PER_PX;
|
|
66367
66438
|
}
|
|
66368
|
-
const
|
|
66439
|
+
const dist2 = parseInt(String(innerShdw["@_dist"] || "0"));
|
|
66369
66440
|
const dir = parseInt(String(innerShdw["@_dir"] || "0"));
|
|
66370
|
-
if (Number.isFinite(
|
|
66441
|
+
if (Number.isFinite(dist2) && dist2 > 0 && Number.isFinite(dir)) {
|
|
66371
66442
|
const angleRad = dir / 6e4 * (Math.PI / 180);
|
|
66372
|
-
result.innerShadowOffsetX = Math.cos(angleRad) *
|
|
66373
|
-
result.innerShadowOffsetY = Math.sin(angleRad) *
|
|
66443
|
+
result.innerShadowOffsetX = Math.cos(angleRad) * dist2 / _PptxHandlerRuntime33.EMU_PER_PX;
|
|
66444
|
+
result.innerShadowOffsetY = Math.sin(angleRad) * dist2 / _PptxHandlerRuntime33.EMU_PER_PX;
|
|
66374
66445
|
}
|
|
66375
66446
|
}
|
|
66376
66447
|
const glow = effectLst["a:glow"];
|
|
@@ -66415,9 +66486,9 @@ var PptxHandlerRuntime77 = class _PptxHandlerRuntime33 extends PptxHandlerRuntim
|
|
|
66415
66486
|
if (Number.isFinite(rot)) {
|
|
66416
66487
|
result.reflectionRotation = rot / 6e4;
|
|
66417
66488
|
}
|
|
66418
|
-
const
|
|
66419
|
-
if (Number.isFinite(
|
|
66420
|
-
result.reflectionDistance =
|
|
66489
|
+
const dist2 = parseInt(String(reflection["@_dist"] || "0"));
|
|
66490
|
+
if (Number.isFinite(dist2) && dist2 >= 0) {
|
|
66491
|
+
result.reflectionDistance = dist2 / _PptxHandlerRuntime33.EMU_PER_PX;
|
|
66421
66492
|
}
|
|
66422
66493
|
}
|
|
66423
66494
|
const scene3dNode = es["a:scene3d"];
|
|
@@ -97937,6 +98008,789 @@ function sanitizeMathMl(markup) {
|
|
|
97937
98008
|
}
|
|
97938
98009
|
return sanitized;
|
|
97939
98010
|
}
|
|
98011
|
+
function resolveParagraphStrutFontSize(segments, bodyFontSize) {
|
|
98012
|
+
let largest;
|
|
98013
|
+
for (const segment of segments) {
|
|
98014
|
+
if (segment.bulletInfo) {
|
|
98015
|
+
continue;
|
|
98016
|
+
}
|
|
98017
|
+
const size = segment.style?.fontSize;
|
|
98018
|
+
if (typeof size !== "number" || !Number.isFinite(size) || size <= 0) {
|
|
98019
|
+
continue;
|
|
98020
|
+
}
|
|
98021
|
+
if (largest === void 0 || size > largest) {
|
|
98022
|
+
largest = size;
|
|
98023
|
+
}
|
|
98024
|
+
}
|
|
98025
|
+
if (largest === void 0) {
|
|
98026
|
+
return void 0;
|
|
98027
|
+
}
|
|
98028
|
+
if (typeof bodyFontSize === "number" && Math.abs(largest - bodyFontSize) < 0.01) {
|
|
98029
|
+
return void 0;
|
|
98030
|
+
}
|
|
98031
|
+
return largest;
|
|
98032
|
+
}
|
|
98033
|
+
function parseHexColor(hex10) {
|
|
98034
|
+
if (!hex10 || typeof hex10 !== "string") {
|
|
98035
|
+
return null;
|
|
98036
|
+
}
|
|
98037
|
+
let cleaned = hex10.replace(/^#/u, "");
|
|
98038
|
+
if (cleaned.length === 3) {
|
|
98039
|
+
cleaned = cleaned[0] + cleaned[0] + cleaned[1] + cleaned[1] + cleaned[2] + cleaned[2];
|
|
98040
|
+
} else if (cleaned.length === 4) {
|
|
98041
|
+
cleaned = cleaned[0] + cleaned[0] + cleaned[1] + cleaned[1] + cleaned[2] + cleaned[2] + cleaned[3] + cleaned[3];
|
|
98042
|
+
}
|
|
98043
|
+
if (cleaned.length !== 6 && cleaned.length !== 8) {
|
|
98044
|
+
return null;
|
|
98045
|
+
}
|
|
98046
|
+
const r = Number.parseInt(cleaned.slice(0, 2), 16);
|
|
98047
|
+
const g = Number.parseInt(cleaned.slice(2, 4), 16);
|
|
98048
|
+
const b = Number.parseInt(cleaned.slice(4, 6), 16);
|
|
98049
|
+
const a = cleaned.length === 8 ? Number.parseInt(cleaned.slice(6, 8), 16) / 255 : 1;
|
|
98050
|
+
if ([r, g, b].some((v) => Number.isNaN(v))) {
|
|
98051
|
+
return null;
|
|
98052
|
+
}
|
|
98053
|
+
return { r, g, b, a: Number.isNaN(a) ? 1 : a };
|
|
98054
|
+
}
|
|
98055
|
+
function lerpColor2(from, to, t) {
|
|
98056
|
+
const clamped = Math.max(0, Math.min(1, t));
|
|
98057
|
+
const r = Math.round(from.r + (to.r - from.r) * clamped);
|
|
98058
|
+
const g = Math.round(from.g + (to.g - from.g) * clamped);
|
|
98059
|
+
const b = Math.round(from.b + (to.b - from.b) * clamped);
|
|
98060
|
+
const a = Number((from.a + (to.a - from.a) * clamped).toFixed(3));
|
|
98061
|
+
return `rgba(${r}, ${g}, ${b}, ${a})`;
|
|
98062
|
+
}
|
|
98063
|
+
var OUTLINE_SAMPLE_COUNT = 64;
|
|
98064
|
+
var ELLIPSE_SAMPLE_COUNT = 48;
|
|
98065
|
+
function resolveLength(token2, axis) {
|
|
98066
|
+
const trimmed = token2.trim();
|
|
98067
|
+
if (trimmed.endsWith("%")) {
|
|
98068
|
+
const pct = Number.parseFloat(trimmed.slice(0, -1));
|
|
98069
|
+
return Number.isFinite(pct) ? pct / 100 * axis : 0;
|
|
98070
|
+
}
|
|
98071
|
+
const px3 = Number.parseFloat(trimmed.replace(/px$/u, ""));
|
|
98072
|
+
return Number.isFinite(px3) ? px3 : 0;
|
|
98073
|
+
}
|
|
98074
|
+
function polygonClipToPoints(value, width, height) {
|
|
98075
|
+
const inner = value.slice(value.indexOf("(") + 1, value.lastIndexOf(")"));
|
|
98076
|
+
const points3 = [];
|
|
98077
|
+
for (const pairStr of inner.split(",")) {
|
|
98078
|
+
const parts = pairStr.trim().split(/\s+/u);
|
|
98079
|
+
if (parts.length < 2) {
|
|
98080
|
+
continue;
|
|
98081
|
+
}
|
|
98082
|
+
points3.push({
|
|
98083
|
+
x: resolveLength(parts[0], width),
|
|
98084
|
+
y: resolveLength(parts[1], height)
|
|
98085
|
+
});
|
|
98086
|
+
}
|
|
98087
|
+
return points3;
|
|
98088
|
+
}
|
|
98089
|
+
function insetClipToPoints(value, width, height) {
|
|
98090
|
+
const inner = value.slice(value.indexOf("(") + 1, value.lastIndexOf(")"));
|
|
98091
|
+
const tokens = inner.split(/round/u)[0].trim().split(/\s+/u);
|
|
98092
|
+
const top = resolveLength(tokens[0] ?? "0", height);
|
|
98093
|
+
const right = resolveLength(tokens[1] ?? tokens[0] ?? "0", width);
|
|
98094
|
+
const bottom = resolveLength(tokens[2] ?? tokens[0] ?? "0", height);
|
|
98095
|
+
const left = resolveLength(tokens[3] ?? tokens[1] ?? tokens[0] ?? "0", width);
|
|
98096
|
+
return [
|
|
98097
|
+
{ x: left, y: top },
|
|
98098
|
+
{ x: width - right, y: top },
|
|
98099
|
+
{ x: width - right, y: height - bottom },
|
|
98100
|
+
{ x: left, y: height - bottom }
|
|
98101
|
+
];
|
|
98102
|
+
}
|
|
98103
|
+
function ellipseClipToPoints(value, width, height) {
|
|
98104
|
+
const isCircle = value.startsWith("circle");
|
|
98105
|
+
const inner = value.slice(value.indexOf("(") + 1, value.lastIndexOf(")"));
|
|
98106
|
+
const [radii, position2] = inner.split(/\s+at\s+/u);
|
|
98107
|
+
const radiusTokens = radii.trim().split(/\s+/u).filter(Boolean);
|
|
98108
|
+
let rx = width / 2;
|
|
98109
|
+
let ry = height / 2;
|
|
98110
|
+
if (isCircle) {
|
|
98111
|
+
const r = resolveLength(radiusTokens[0] ?? "50%", Math.min(width, height));
|
|
98112
|
+
rx = r;
|
|
98113
|
+
ry = r;
|
|
98114
|
+
} else {
|
|
98115
|
+
rx = resolveLength(radiusTokens[0] ?? "50%", width);
|
|
98116
|
+
ry = resolveLength(radiusTokens[1] ?? radiusTokens[0] ?? "50%", height);
|
|
98117
|
+
}
|
|
98118
|
+
let cx = width / 2;
|
|
98119
|
+
let cy = height / 2;
|
|
98120
|
+
if (position2) {
|
|
98121
|
+
const posTokens = position2.trim().split(/\s+/u);
|
|
98122
|
+
cx = resolveLength(posTokens[0] ?? "50%", width);
|
|
98123
|
+
cy = resolveLength(posTokens[1] ?? posTokens[0] ?? "50%", height);
|
|
98124
|
+
}
|
|
98125
|
+
const points3 = [];
|
|
98126
|
+
for (let i = 0; i < ELLIPSE_SAMPLE_COUNT; i++) {
|
|
98127
|
+
const a = i / ELLIPSE_SAMPLE_COUNT * Math.PI * 2;
|
|
98128
|
+
points3.push({ x: cx + Math.cos(a) * rx, y: cy + Math.sin(a) * ry });
|
|
98129
|
+
}
|
|
98130
|
+
return points3;
|
|
98131
|
+
}
|
|
98132
|
+
function clipPathToPolygon(value, width, height) {
|
|
98133
|
+
const v = value.trim();
|
|
98134
|
+
if (v.startsWith("polygon")) {
|
|
98135
|
+
return polygonClipToPoints(v, width, height);
|
|
98136
|
+
}
|
|
98137
|
+
if (v.startsWith("inset")) {
|
|
98138
|
+
return insetClipToPoints(v, width, height);
|
|
98139
|
+
}
|
|
98140
|
+
if (v.startsWith("ellipse") || v.startsWith("circle")) {
|
|
98141
|
+
return ellipseClipToPoints(v, width, height);
|
|
98142
|
+
}
|
|
98143
|
+
if (v.startsWith("path")) {
|
|
98144
|
+
const start = v.indexOf("'") >= 0 ? v.indexOf("'") : v.indexOf('"');
|
|
98145
|
+
const end = v.lastIndexOf("'") >= 0 ? v.lastIndexOf("'") : v.lastIndexOf('"');
|
|
98146
|
+
if (start >= 0 && end > start) {
|
|
98147
|
+
const d = v.slice(start + 1, end);
|
|
98148
|
+
const polys = svgPathToPolygons(d);
|
|
98149
|
+
if (polys.length === 0) {
|
|
98150
|
+
return [];
|
|
98151
|
+
}
|
|
98152
|
+
return polys.reduce((a, b) => b.length > a.length ? b : a);
|
|
98153
|
+
}
|
|
98154
|
+
}
|
|
98155
|
+
return [];
|
|
98156
|
+
}
|
|
98157
|
+
function resolveElementOutline(element) {
|
|
98158
|
+
const width = Math.max(element.width, 1);
|
|
98159
|
+
const height = Math.max(element.height, 1);
|
|
98160
|
+
const shapeType = element.shapeType;
|
|
98161
|
+
const adjustments = element.shapeAdjustments;
|
|
98162
|
+
const clip = getResolvedShapeClipPathFor(shapeType, width, height, adjustments);
|
|
98163
|
+
if (clip) {
|
|
98164
|
+
const poly = clipPathToPolygon(clip, width, height);
|
|
98165
|
+
if (poly.length >= 3) {
|
|
98166
|
+
return poly;
|
|
98167
|
+
}
|
|
98168
|
+
}
|
|
98169
|
+
return [
|
|
98170
|
+
{ x: 0, y: 0 },
|
|
98171
|
+
{ x: width, y: 0 },
|
|
98172
|
+
{ x: width, y: height },
|
|
98173
|
+
{ x: 0, y: height }
|
|
98174
|
+
];
|
|
98175
|
+
}
|
|
98176
|
+
function dist(a, b) {
|
|
98177
|
+
return Math.hypot(a.x - b.x, a.y - b.y);
|
|
98178
|
+
}
|
|
98179
|
+
function resamplePolygon(poly, count) {
|
|
98180
|
+
if (poly.length < 2) {
|
|
98181
|
+
return Array.from({ length: count }, () => ({ x: poly[0]?.x ?? 0, y: poly[0]?.y ?? 0 }));
|
|
98182
|
+
}
|
|
98183
|
+
const ring = [...poly, poly[0]];
|
|
98184
|
+
const segLen = [];
|
|
98185
|
+
let total = 0;
|
|
98186
|
+
for (let i = 0; i < ring.length - 1; i++) {
|
|
98187
|
+
const d = dist(ring[i], ring[i + 1]);
|
|
98188
|
+
segLen.push(d);
|
|
98189
|
+
total += d;
|
|
98190
|
+
}
|
|
98191
|
+
if (total === 0) {
|
|
98192
|
+
return Array.from({ length: count }, () => ({ x: poly[0].x, y: poly[0].y }));
|
|
98193
|
+
}
|
|
98194
|
+
const result = [];
|
|
98195
|
+
const step = total / count;
|
|
98196
|
+
let seg = 0;
|
|
98197
|
+
let segStart = 0;
|
|
98198
|
+
for (let i = 0; i < count; i++) {
|
|
98199
|
+
const target = i * step;
|
|
98200
|
+
while (seg < segLen.length - 1 && segStart + segLen[seg] < target) {
|
|
98201
|
+
segStart += segLen[seg];
|
|
98202
|
+
seg++;
|
|
98203
|
+
}
|
|
98204
|
+
const within = segLen[seg] > 0 ? (target - segStart) / segLen[seg] : 0;
|
|
98205
|
+
const a = ring[seg];
|
|
98206
|
+
const b = ring[seg + 1];
|
|
98207
|
+
result.push({ x: a.x + (b.x - a.x) * within, y: a.y + (b.y - a.y) * within });
|
|
98208
|
+
}
|
|
98209
|
+
return result;
|
|
98210
|
+
}
|
|
98211
|
+
function signedArea2(poly) {
|
|
98212
|
+
let area = 0;
|
|
98213
|
+
for (let i = 0; i < poly.length; i++) {
|
|
98214
|
+
const a = poly[i];
|
|
98215
|
+
const b = poly[(i + 1) % poly.length];
|
|
98216
|
+
area += a.x * b.y - b.x * a.y;
|
|
98217
|
+
}
|
|
98218
|
+
return area / 2;
|
|
98219
|
+
}
|
|
98220
|
+
function rotateRing(poly, offset) {
|
|
98221
|
+
const n = poly.length;
|
|
98222
|
+
const o = (offset % n + n) % n;
|
|
98223
|
+
return poly.slice(o).concat(poly.slice(0, o));
|
|
98224
|
+
}
|
|
98225
|
+
function bestRotation(from, to) {
|
|
98226
|
+
let bestOffset = 0;
|
|
98227
|
+
let bestCost = Infinity;
|
|
98228
|
+
for (let offset = 0; offset < to.length; offset++) {
|
|
98229
|
+
let cost = 0;
|
|
98230
|
+
for (let i = 0; i < from.length; i++) {
|
|
98231
|
+
const t = to[(i + offset) % to.length];
|
|
98232
|
+
const dx = from[i].x - t.x;
|
|
98233
|
+
const dy = from[i].y - t.y;
|
|
98234
|
+
cost += dx * dx + dy * dy;
|
|
98235
|
+
if (cost >= bestCost) {
|
|
98236
|
+
break;
|
|
98237
|
+
}
|
|
98238
|
+
}
|
|
98239
|
+
if (cost < bestCost) {
|
|
98240
|
+
bestCost = cost;
|
|
98241
|
+
bestOffset = offset;
|
|
98242
|
+
}
|
|
98243
|
+
}
|
|
98244
|
+
return bestOffset;
|
|
98245
|
+
}
|
|
98246
|
+
function normalizeOutlinePair(fromPoly, toPoly, count = OUTLINE_SAMPLE_COUNT) {
|
|
98247
|
+
const from = resamplePolygon(fromPoly, count);
|
|
98248
|
+
let to = resamplePolygon(toPoly, count);
|
|
98249
|
+
if (Math.sign(signedArea2(from)) !== Math.sign(signedArea2(to))) {
|
|
98250
|
+
to = [...to].reverse();
|
|
98251
|
+
}
|
|
98252
|
+
const offset = bestRotation(from, to);
|
|
98253
|
+
to = rotateRing(to, offset);
|
|
98254
|
+
return [from, to];
|
|
98255
|
+
}
|
|
98256
|
+
function interpolateOutline(from, to, t) {
|
|
98257
|
+
const clamped = Math.max(0, Math.min(1, t));
|
|
98258
|
+
const len = Math.min(from.length, to.length);
|
|
98259
|
+
if (len === 0) {
|
|
98260
|
+
return "";
|
|
98261
|
+
}
|
|
98262
|
+
const parts = [];
|
|
98263
|
+
for (let i = 0; i < len; i++) {
|
|
98264
|
+
const x = from[i].x + (to[i].x - from[i].x) * clamped;
|
|
98265
|
+
const y = from[i].y + (to[i].y - from[i].y) * clamped;
|
|
98266
|
+
parts.push(`${i === 0 ? "M" : "L"}${Number(x.toFixed(2))} ${Number(y.toFixed(2))}`);
|
|
98267
|
+
}
|
|
98268
|
+
parts.push("Z");
|
|
98269
|
+
return parts.join(" ");
|
|
98270
|
+
}
|
|
98271
|
+
var MORPH_EASING = "cubic-bezier(0.4, 0, 0.2, 1)";
|
|
98272
|
+
var PROXIMITY_THRESHOLD = 300;
|
|
98273
|
+
var GEOMETRY_MORPH_STEPS = 8;
|
|
98274
|
+
function shouldGeometryMorph(pair) {
|
|
98275
|
+
const fromType = pair.fromElement.shapeType;
|
|
98276
|
+
const toType = pair.toElement.shapeType;
|
|
98277
|
+
if (!fromType || !toType) {
|
|
98278
|
+
return false;
|
|
98279
|
+
}
|
|
98280
|
+
if (fromType.toLowerCase() !== toType.toLowerCase()) {
|
|
98281
|
+
return true;
|
|
98282
|
+
}
|
|
98283
|
+
const fromAdj = JSON.stringify(
|
|
98284
|
+
pair.fromElement.shapeAdjustments ?? {}
|
|
98285
|
+
);
|
|
98286
|
+
const toAdj = JSON.stringify(
|
|
98287
|
+
pair.toElement.shapeAdjustments ?? {}
|
|
98288
|
+
);
|
|
98289
|
+
return fromAdj !== toAdj;
|
|
98290
|
+
}
|
|
98291
|
+
function buildClipKeyframeBody(from, to, steps) {
|
|
98292
|
+
const [fromRing, toRing] = normalizeOutlinePair(
|
|
98293
|
+
resolveElementOutline(from),
|
|
98294
|
+
resolveElementOutline(to)
|
|
98295
|
+
);
|
|
98296
|
+
if (fromRing.length === 0 || toRing.length === 0) {
|
|
98297
|
+
return null;
|
|
98298
|
+
}
|
|
98299
|
+
const lines = [];
|
|
98300
|
+
for (let s = 0; s <= steps; s++) {
|
|
98301
|
+
const t = s / steps;
|
|
98302
|
+
const d = interpolateOutline(fromRing, toRing, t);
|
|
98303
|
+
if (!d) {
|
|
98304
|
+
return null;
|
|
98305
|
+
}
|
|
98306
|
+
const pct = Number((s / steps * 100).toFixed(2));
|
|
98307
|
+
lines.push(` ${pct}% {
|
|
98308
|
+
clip-path: path('${d}');
|
|
98309
|
+
}`);
|
|
98310
|
+
}
|
|
98311
|
+
return lines.join("\n");
|
|
98312
|
+
}
|
|
98313
|
+
function generateGeometryMorphAnimation(pair, durationMs, pairIndex, steps = GEOMETRY_MORPH_STEPS) {
|
|
98314
|
+
if (!shouldGeometryMorph(pair)) {
|
|
98315
|
+
return null;
|
|
98316
|
+
}
|
|
98317
|
+
const body = buildClipKeyframeBody(pair.fromElement, pair.toElement, steps);
|
|
98318
|
+
if (!body) {
|
|
98319
|
+
return null;
|
|
98320
|
+
}
|
|
98321
|
+
const safeName = `pptx-morph-geo-${pairIndex}-${pair.toElement.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
|
|
98322
|
+
const keyframes = `
|
|
98323
|
+
@keyframes ${safeName} {
|
|
98324
|
+
${body}
|
|
98325
|
+
}`;
|
|
98326
|
+
return {
|
|
98327
|
+
elementId: pair.toElement.id,
|
|
98328
|
+
animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
|
|
98329
|
+
keyframes
|
|
98330
|
+
};
|
|
98331
|
+
}
|
|
98332
|
+
function getElementMorphName(element) {
|
|
98333
|
+
if (element.name) {
|
|
98334
|
+
const name = element.name.trim();
|
|
98335
|
+
if (name.startsWith("!!")) {
|
|
98336
|
+
return name;
|
|
98337
|
+
}
|
|
98338
|
+
}
|
|
98339
|
+
if (hasTextProperties(element) && element.text) {
|
|
98340
|
+
const text2 = element.text.trim();
|
|
98341
|
+
if (text2.startsWith("!!")) {
|
|
98342
|
+
return text2;
|
|
98343
|
+
}
|
|
98344
|
+
}
|
|
98345
|
+
return void 0;
|
|
98346
|
+
}
|
|
98347
|
+
function matchMorphElementsFull(fromSlide, toSlide) {
|
|
98348
|
+
const pairs2 = [];
|
|
98349
|
+
const usedFrom = /* @__PURE__ */ new Set();
|
|
98350
|
+
const usedTo = /* @__PURE__ */ new Set();
|
|
98351
|
+
for (const fromEl of fromSlide.elements) {
|
|
98352
|
+
const fromName = getElementMorphName(fromEl);
|
|
98353
|
+
if (!fromName) {
|
|
98354
|
+
continue;
|
|
98355
|
+
}
|
|
98356
|
+
for (const toEl of toSlide.elements) {
|
|
98357
|
+
if (usedTo.has(toEl.id)) {
|
|
98358
|
+
continue;
|
|
98359
|
+
}
|
|
98360
|
+
const toName = getElementMorphName(toEl);
|
|
98361
|
+
if (toName === fromName) {
|
|
98362
|
+
pairs2.push({ fromElement: fromEl, toElement: toEl });
|
|
98363
|
+
usedFrom.add(fromEl.id);
|
|
98364
|
+
usedTo.add(toEl.id);
|
|
98365
|
+
break;
|
|
98366
|
+
}
|
|
98367
|
+
}
|
|
98368
|
+
}
|
|
98369
|
+
for (const fromEl of fromSlide.elements) {
|
|
98370
|
+
if (usedFrom.has(fromEl.id)) {
|
|
98371
|
+
continue;
|
|
98372
|
+
}
|
|
98373
|
+
for (const toEl of toSlide.elements) {
|
|
98374
|
+
if (usedTo.has(toEl.id)) {
|
|
98375
|
+
continue;
|
|
98376
|
+
}
|
|
98377
|
+
if (fromEl.id === toEl.id) {
|
|
98378
|
+
pairs2.push({ fromElement: fromEl, toElement: toEl });
|
|
98379
|
+
usedFrom.add(fromEl.id);
|
|
98380
|
+
usedTo.add(toEl.id);
|
|
98381
|
+
break;
|
|
98382
|
+
}
|
|
98383
|
+
}
|
|
98384
|
+
}
|
|
98385
|
+
for (const fromEl of fromSlide.elements) {
|
|
98386
|
+
if (usedFrom.has(fromEl.id)) {
|
|
98387
|
+
continue;
|
|
98388
|
+
}
|
|
98389
|
+
let bestMatch = null;
|
|
98390
|
+
let bestDist = Infinity;
|
|
98391
|
+
for (const toEl of toSlide.elements) {
|
|
98392
|
+
if (usedTo.has(toEl.id)) {
|
|
98393
|
+
continue;
|
|
98394
|
+
}
|
|
98395
|
+
if (fromEl.type !== toEl.type) {
|
|
98396
|
+
continue;
|
|
98397
|
+
}
|
|
98398
|
+
const dx = fromEl.x - toEl.x;
|
|
98399
|
+
const dy = fromEl.y - toEl.y;
|
|
98400
|
+
const dist2 = Math.sqrt(dx * dx + dy * dy);
|
|
98401
|
+
if (dist2 < bestDist && dist2 < PROXIMITY_THRESHOLD) {
|
|
98402
|
+
bestDist = dist2;
|
|
98403
|
+
bestMatch = toEl;
|
|
98404
|
+
}
|
|
98405
|
+
}
|
|
98406
|
+
if (bestMatch) {
|
|
98407
|
+
pairs2.push({ fromElement: fromEl, toElement: bestMatch });
|
|
98408
|
+
usedFrom.add(fromEl.id);
|
|
98409
|
+
usedTo.add(bestMatch.id);
|
|
98410
|
+
}
|
|
98411
|
+
}
|
|
98412
|
+
const unmatchedFrom = fromSlide.elements.filter((el) => !usedFrom.has(el.id));
|
|
98413
|
+
const unmatchedTo = toSlide.elements.filter((el) => !usedTo.has(el.id));
|
|
98414
|
+
return { pairs: pairs2, unmatchedFrom, unmatchedTo };
|
|
98415
|
+
}
|
|
98416
|
+
function tokenizeText(element, mode) {
|
|
98417
|
+
if (!hasTextProperties(element) || !element.text) {
|
|
98418
|
+
return [];
|
|
98419
|
+
}
|
|
98420
|
+
const text2 = element.text;
|
|
98421
|
+
const style = element.textStyle;
|
|
98422
|
+
const fontSize = style?.fontSize ?? 14;
|
|
98423
|
+
const fontWeight = style?.bold ? "bold" : "normal";
|
|
98424
|
+
const color2 = style?.color ?? "#000000";
|
|
98425
|
+
const tokens = [];
|
|
98426
|
+
if (mode === "character") {
|
|
98427
|
+
const chars = Array.from(text2);
|
|
98428
|
+
const totalChars = chars.length;
|
|
98429
|
+
if (totalChars === 0) {
|
|
98430
|
+
return [];
|
|
98431
|
+
}
|
|
98432
|
+
for (let i = 0; i < chars.length; i++) {
|
|
98433
|
+
if (chars[i] === "\n") {
|
|
98434
|
+
continue;
|
|
98435
|
+
}
|
|
98436
|
+
tokens.push({
|
|
98437
|
+
text: chars[i],
|
|
98438
|
+
x: totalChars > 1 ? i / (totalChars - 1) : 0.5,
|
|
98439
|
+
y: 0.5,
|
|
98440
|
+
fontSize,
|
|
98441
|
+
fontWeight,
|
|
98442
|
+
color: color2
|
|
98443
|
+
});
|
|
98444
|
+
}
|
|
98445
|
+
} else {
|
|
98446
|
+
const words = text2.split(/\s+/u);
|
|
98447
|
+
const nonEmptyWords = words.filter((w) => w.trim().length > 0);
|
|
98448
|
+
const totalWords = nonEmptyWords.length;
|
|
98449
|
+
if (totalWords === 0) {
|
|
98450
|
+
return [];
|
|
98451
|
+
}
|
|
98452
|
+
let wordIndex = 0;
|
|
98453
|
+
for (const word of words) {
|
|
98454
|
+
if (word.trim().length === 0) {
|
|
98455
|
+
continue;
|
|
98456
|
+
}
|
|
98457
|
+
tokens.push({
|
|
98458
|
+
text: word,
|
|
98459
|
+
x: totalWords > 1 ? wordIndex / (totalWords - 1) : 0.5,
|
|
98460
|
+
y: 0.5,
|
|
98461
|
+
fontSize,
|
|
98462
|
+
fontWeight,
|
|
98463
|
+
color: color2
|
|
98464
|
+
});
|
|
98465
|
+
wordIndex++;
|
|
98466
|
+
}
|
|
98467
|
+
}
|
|
98468
|
+
return tokens;
|
|
98469
|
+
}
|
|
98470
|
+
function diffTokens(fromTokens, toTokens) {
|
|
98471
|
+
const n = fromTokens.length;
|
|
98472
|
+
const m = toTokens.length;
|
|
98473
|
+
const lcs = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
|
|
98474
|
+
for (let i2 = n - 1; i2 >= 0; i2--) {
|
|
98475
|
+
for (let j2 = m - 1; j2 >= 0; j2--) {
|
|
98476
|
+
lcs[i2][j2] = fromTokens[i2].text === toTokens[j2].text ? lcs[i2 + 1][j2 + 1] + 1 : Math.max(lcs[i2 + 1][j2], lcs[i2][j2 + 1]);
|
|
98477
|
+
}
|
|
98478
|
+
}
|
|
98479
|
+
const ops = [];
|
|
98480
|
+
let i = 0;
|
|
98481
|
+
let j = 0;
|
|
98482
|
+
while (i < n && j < m) {
|
|
98483
|
+
if (fromTokens[i].text === toTokens[j].text) {
|
|
98484
|
+
ops.push({
|
|
98485
|
+
change: "shared",
|
|
98486
|
+
from: fromTokens[i],
|
|
98487
|
+
to: toTokens[j],
|
|
98488
|
+
fromIndex: i,
|
|
98489
|
+
toIndex: j
|
|
98490
|
+
});
|
|
98491
|
+
i++;
|
|
98492
|
+
j++;
|
|
98493
|
+
} else if (lcs[i + 1][j] >= lcs[i][j + 1]) {
|
|
98494
|
+
ops.push({ change: "removed", from: fromTokens[i], to: null, fromIndex: i, toIndex: -1 });
|
|
98495
|
+
i++;
|
|
98496
|
+
} else {
|
|
98497
|
+
ops.push({ change: "added", from: null, to: toTokens[j], fromIndex: -1, toIndex: j });
|
|
98498
|
+
j++;
|
|
98499
|
+
}
|
|
98500
|
+
}
|
|
98501
|
+
while (i < n) {
|
|
98502
|
+
ops.push({ change: "removed", from: fromTokens[i], to: null, fromIndex: i, toIndex: -1 });
|
|
98503
|
+
i++;
|
|
98504
|
+
}
|
|
98505
|
+
while (j < m) {
|
|
98506
|
+
ops.push({ change: "added", from: null, to: toTokens[j], fromIndex: -1, toIndex: j });
|
|
98507
|
+
j++;
|
|
98508
|
+
}
|
|
98509
|
+
return ops;
|
|
98510
|
+
}
|
|
98511
|
+
function tokenColor(token2) {
|
|
98512
|
+
const parsed = parseHexColor(token2.color);
|
|
98513
|
+
return parsed ? lerpColor2(parsed, parsed, 0) : token2.color;
|
|
98514
|
+
}
|
|
98515
|
+
function sharedKeyframes(name, op) {
|
|
98516
|
+
const from = op.from;
|
|
98517
|
+
const to = op.to;
|
|
98518
|
+
return `
|
|
98519
|
+
@keyframes ${name} {
|
|
98520
|
+
from {
|
|
98521
|
+
left: ${Number((from.x * 100).toFixed(2))}%;
|
|
98522
|
+
top: ${Number((from.y * 100).toFixed(2))}%;
|
|
98523
|
+
font-size: ${from.fontSize}pt;
|
|
98524
|
+
font-weight: ${from.fontWeight};
|
|
98525
|
+
color: ${tokenColor(from)};
|
|
98526
|
+
opacity: 1;
|
|
98527
|
+
}
|
|
98528
|
+
to {
|
|
98529
|
+
left: ${Number((to.x * 100).toFixed(2))}%;
|
|
98530
|
+
top: ${Number((to.y * 100).toFixed(2))}%;
|
|
98531
|
+
font-size: ${to.fontSize}pt;
|
|
98532
|
+
font-weight: ${to.fontWeight};
|
|
98533
|
+
color: ${tokenColor(to)};
|
|
98534
|
+
opacity: 1;
|
|
98535
|
+
}
|
|
98536
|
+
}`;
|
|
98537
|
+
}
|
|
98538
|
+
function fadeKeyframes(name, fadeIn) {
|
|
98539
|
+
const a = fadeIn ? 0 : 1;
|
|
98540
|
+
const b = fadeIn ? 1 : 0;
|
|
98541
|
+
return `
|
|
98542
|
+
@keyframes ${name} {
|
|
98543
|
+
from { opacity: ${a}; }
|
|
98544
|
+
to { opacity: ${b}; }
|
|
98545
|
+
}`;
|
|
98546
|
+
}
|
|
98547
|
+
function buildTokenMorphAnimations(ops, fromId, toId, durationMs, pairIndex) {
|
|
98548
|
+
const animations = [];
|
|
98549
|
+
for (let k = 0; k < ops.length; k++) {
|
|
98550
|
+
const op = ops[k];
|
|
98551
|
+
const name = `pptx-morph-tok-${pairIndex}-${k}`;
|
|
98552
|
+
const anim = `${name} ${durationMs}ms ${MORPH_EASING} forwards`;
|
|
98553
|
+
if (op.change === "shared") {
|
|
98554
|
+
animations.push({
|
|
98555
|
+
elementId: `${toId}__token_${op.toIndex}`,
|
|
98556
|
+
animation: anim,
|
|
98557
|
+
keyframes: sharedKeyframes(name, op)
|
|
98558
|
+
});
|
|
98559
|
+
} else if (op.change === "added") {
|
|
98560
|
+
animations.push({
|
|
98561
|
+
elementId: `${toId}__token_${op.toIndex}`,
|
|
98562
|
+
animation: anim,
|
|
98563
|
+
keyframes: fadeKeyframes(name, true)
|
|
98564
|
+
});
|
|
98565
|
+
} else {
|
|
98566
|
+
animations.push({
|
|
98567
|
+
elementId: `${fromId}__token_${op.fromIndex}`,
|
|
98568
|
+
animation: anim,
|
|
98569
|
+
keyframes: fadeKeyframes(name, false)
|
|
98570
|
+
});
|
|
98571
|
+
}
|
|
98572
|
+
}
|
|
98573
|
+
return animations;
|
|
98574
|
+
}
|
|
98575
|
+
function buildColorInterpolationProps(fromElement, toElement) {
|
|
98576
|
+
const fromFill = hasShapeProperties(fromElement) ? fromElement.shapeStyle?.fillColor : void 0;
|
|
98577
|
+
const toFill = hasShapeProperties(toElement) ? toElement.shapeStyle?.fillColor : void 0;
|
|
98578
|
+
if (!fromFill && !toFill) {
|
|
98579
|
+
return null;
|
|
98580
|
+
}
|
|
98581
|
+
if (fromFill === toFill) {
|
|
98582
|
+
return null;
|
|
98583
|
+
}
|
|
98584
|
+
const fromColor = parseHexColor(fromFill);
|
|
98585
|
+
const toColor = parseHexColor(toFill);
|
|
98586
|
+
if (!fromColor && !toColor) {
|
|
98587
|
+
return null;
|
|
98588
|
+
}
|
|
98589
|
+
const from = fromColor ?? { r: 255, g: 255, b: 255, a: 0 };
|
|
98590
|
+
const to = toColor ?? { r: 255, g: 255, b: 255, a: 0 };
|
|
98591
|
+
return {
|
|
98592
|
+
fromBg: lerpColor2(from, from, 0),
|
|
98593
|
+
toBg: lerpColor2(to, to, 0)
|
|
98594
|
+
};
|
|
98595
|
+
}
|
|
98596
|
+
function buildStrokeInterpolationProps(fromElement, toElement) {
|
|
98597
|
+
const fromStyle = hasShapeProperties(fromElement) ? fromElement.shapeStyle : void 0;
|
|
98598
|
+
const toStyle = hasShapeProperties(toElement) ? toElement.shapeStyle : void 0;
|
|
98599
|
+
const fromColor = fromStyle?.strokeColor;
|
|
98600
|
+
const toColor = toStyle?.strokeColor;
|
|
98601
|
+
const fromWidth = fromStyle?.strokeWidth ?? 0;
|
|
98602
|
+
const toWidth = toStyle?.strokeWidth ?? 0;
|
|
98603
|
+
if (!fromColor && !toColor && fromWidth === 0 && toWidth === 0) {
|
|
98604
|
+
return null;
|
|
98605
|
+
}
|
|
98606
|
+
if (fromColor === toColor && fromWidth === toWidth) {
|
|
98607
|
+
return null;
|
|
98608
|
+
}
|
|
98609
|
+
const fc = parseHexColor(fromColor) ?? { r: 0, g: 0, b: 0, a: 1 };
|
|
98610
|
+
const tc = parseHexColor(toColor) ?? { r: 0, g: 0, b: 0, a: 1 };
|
|
98611
|
+
return {
|
|
98612
|
+
fromStroke: lerpColor2(fc, fc, 0),
|
|
98613
|
+
toStroke: lerpColor2(tc, tc, 0),
|
|
98614
|
+
fromWidth,
|
|
98615
|
+
toWidth
|
|
98616
|
+
};
|
|
98617
|
+
}
|
|
98618
|
+
function generateMorphAnimations(pairs2, durationMs, _mode = "object") {
|
|
98619
|
+
const animations = [];
|
|
98620
|
+
for (let index = 0; index < pairs2.length; index++) {
|
|
98621
|
+
const { fromElement, toElement } = pairs2[index];
|
|
98622
|
+
const safeName = `pptx-morph-${index}-${toElement.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
|
|
98623
|
+
const dx = fromElement.x - toElement.x;
|
|
98624
|
+
const dy = fromElement.y - toElement.y;
|
|
98625
|
+
const sx = Math.max(fromElement.width, 1) / Math.max(toElement.width, 1);
|
|
98626
|
+
const sy = Math.max(fromElement.height, 1) / Math.max(toElement.height, 1);
|
|
98627
|
+
const dr = (fromElement.rotation ?? 0) - (toElement.rotation ?? 0);
|
|
98628
|
+
const fromOpacity = fromElement.opacity ?? 1;
|
|
98629
|
+
const toOpacity = toElement.opacity ?? 1;
|
|
98630
|
+
const fromProps = [
|
|
98631
|
+
` transform: translate(${dx}px, ${dy}px) scale(${sx}, ${sy}) rotate(${dr}deg);`,
|
|
98632
|
+
` opacity: ${fromOpacity};`
|
|
98633
|
+
];
|
|
98634
|
+
const toProps = [
|
|
98635
|
+
" transform: translate(0, 0) scale(1, 1) rotate(0deg);",
|
|
98636
|
+
` opacity: ${toOpacity};`
|
|
98637
|
+
];
|
|
98638
|
+
const colorInterp = buildColorInterpolationProps(fromElement, toElement);
|
|
98639
|
+
if (colorInterp) {
|
|
98640
|
+
fromProps.push(` background-color: ${colorInterp.fromBg};`);
|
|
98641
|
+
toProps.push(` background-color: ${colorInterp.toBg};`);
|
|
98642
|
+
}
|
|
98643
|
+
const strokeInterp = buildStrokeInterpolationProps(fromElement, toElement);
|
|
98644
|
+
if (strokeInterp) {
|
|
98645
|
+
fromProps.push(` outline: ${strokeInterp.fromWidth}px solid ${strokeInterp.fromStroke};`);
|
|
98646
|
+
toProps.push(` outline: ${strokeInterp.toWidth}px solid ${strokeInterp.toStroke};`);
|
|
98647
|
+
}
|
|
98648
|
+
const keyframes = `
|
|
98649
|
+
@keyframes ${safeName} {
|
|
98650
|
+
from {
|
|
98651
|
+
${fromProps.join("\n")}
|
|
98652
|
+
}
|
|
98653
|
+
to {
|
|
98654
|
+
${toProps.join("\n")}
|
|
98655
|
+
}
|
|
98656
|
+
}`;
|
|
98657
|
+
animations.push({
|
|
98658
|
+
elementId: toElement.id,
|
|
98659
|
+
animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
|
|
98660
|
+
keyframes
|
|
98661
|
+
});
|
|
98662
|
+
}
|
|
98663
|
+
return animations;
|
|
98664
|
+
}
|
|
98665
|
+
function generateUnmatchedFadeOutAnimations(elements, durationMs, startIndex) {
|
|
98666
|
+
return elements.map((el, i) => {
|
|
98667
|
+
const safeName = `pptx-morph-fadeout-${startIndex + i}-${el.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
|
|
98668
|
+
const keyframes = `
|
|
98669
|
+
@keyframes ${safeName} {
|
|
98670
|
+
from {
|
|
98671
|
+
opacity: ${el.opacity ?? 1};
|
|
98672
|
+
transform: scale(1);
|
|
98673
|
+
}
|
|
98674
|
+
to {
|
|
98675
|
+
opacity: 0;
|
|
98676
|
+
transform: scale(0.95);
|
|
98677
|
+
}
|
|
98678
|
+
}`;
|
|
98679
|
+
return {
|
|
98680
|
+
elementId: el.id,
|
|
98681
|
+
animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
|
|
98682
|
+
keyframes
|
|
98683
|
+
};
|
|
98684
|
+
});
|
|
98685
|
+
}
|
|
98686
|
+
function generateUnmatchedFadeInAnimations(elements, durationMs, startIndex) {
|
|
98687
|
+
return elements.map((el, i) => {
|
|
98688
|
+
const safeName = `pptx-morph-fadein-${startIndex + i}-${el.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
|
|
98689
|
+
const keyframes = `
|
|
98690
|
+
@keyframes ${safeName} {
|
|
98691
|
+
from {
|
|
98692
|
+
opacity: 0;
|
|
98693
|
+
transform: scale(0.95);
|
|
98694
|
+
}
|
|
98695
|
+
to {
|
|
98696
|
+
opacity: ${el.opacity ?? 1};
|
|
98697
|
+
transform: scale(1);
|
|
98698
|
+
}
|
|
98699
|
+
}`;
|
|
98700
|
+
return {
|
|
98701
|
+
elementId: el.id,
|
|
98702
|
+
animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
|
|
98703
|
+
keyframes
|
|
98704
|
+
};
|
|
98705
|
+
});
|
|
98706
|
+
}
|
|
98707
|
+
function generateTextMorphAnimations(pair, durationMs, mode, pairIndex) {
|
|
98708
|
+
const fromTokens = tokenizeText(pair.fromElement, mode);
|
|
98709
|
+
const toTokens = tokenizeText(pair.toElement, mode);
|
|
98710
|
+
if (fromTokens.length === 0 && toTokens.length === 0) {
|
|
98711
|
+
return [];
|
|
98712
|
+
}
|
|
98713
|
+
const ops = diffTokens(fromTokens, toTokens);
|
|
98714
|
+
return buildTokenMorphAnimations(
|
|
98715
|
+
ops,
|
|
98716
|
+
pair.fromElement.id,
|
|
98717
|
+
pair.toElement.id,
|
|
98718
|
+
durationMs,
|
|
98719
|
+
pairIndex
|
|
98720
|
+
);
|
|
98721
|
+
}
|
|
98722
|
+
function generateFullMorphTransition(fromSlide, toSlide, durationMs, mode = "object") {
|
|
98723
|
+
const matchResult = matchMorphElementsFull(fromSlide, toSlide);
|
|
98724
|
+
const allAnimations = [];
|
|
98725
|
+
const pairAnims = generateMorphAnimations(matchResult.pairs, durationMs, mode);
|
|
98726
|
+
allAnimations.push(...pairAnims);
|
|
98727
|
+
for (let i = 0; i < matchResult.pairs.length; i++) {
|
|
98728
|
+
const geo = generateGeometryMorphAnimation(matchResult.pairs[i], durationMs, i);
|
|
98729
|
+
if (geo) {
|
|
98730
|
+
allAnimations.push(geo);
|
|
98731
|
+
}
|
|
98732
|
+
}
|
|
98733
|
+
if (mode === "word" || mode === "character") {
|
|
98734
|
+
for (let i = 0; i < matchResult.pairs.length; i++) {
|
|
98735
|
+
const pair = matchResult.pairs[i];
|
|
98736
|
+
if (hasTextProperties(pair.fromElement) && hasTextProperties(pair.toElement)) {
|
|
98737
|
+
const textAnims = generateTextMorphAnimations(pair, durationMs, mode, i);
|
|
98738
|
+
allAnimations.push(...textAnims);
|
|
98739
|
+
}
|
|
98740
|
+
}
|
|
98741
|
+
}
|
|
98742
|
+
const fadeOuts = generateUnmatchedFadeOutAnimations(
|
|
98743
|
+
matchResult.unmatchedFrom,
|
|
98744
|
+
durationMs,
|
|
98745
|
+
pairAnims.length
|
|
98746
|
+
);
|
|
98747
|
+
allAnimations.push(...fadeOuts);
|
|
98748
|
+
const fadeIns = generateUnmatchedFadeInAnimations(
|
|
98749
|
+
matchResult.unmatchedTo,
|
|
98750
|
+
durationMs,
|
|
98751
|
+
pairAnims.length + fadeOuts.length
|
|
98752
|
+
);
|
|
98753
|
+
allAnimations.push(...fadeIns);
|
|
98754
|
+
return allAnimations;
|
|
98755
|
+
}
|
|
98756
|
+
function morphOptionToMode(option) {
|
|
98757
|
+
if (option === "byWord") {
|
|
98758
|
+
return "word";
|
|
98759
|
+
}
|
|
98760
|
+
if (option === "byChar") {
|
|
98761
|
+
return "character";
|
|
98762
|
+
}
|
|
98763
|
+
return "object";
|
|
98764
|
+
}
|
|
98765
|
+
function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = "object") {
|
|
98766
|
+
if (!fromSlide || !toSlide) {
|
|
98767
|
+
return void 0;
|
|
98768
|
+
}
|
|
98769
|
+
const match = matchMorphElementsFull(fromSlide, toSlide);
|
|
98770
|
+
if (match.pairs.length === 0 && match.unmatchedFrom.length === 0 && match.unmatchedTo.length === 0) {
|
|
98771
|
+
return void 0;
|
|
98772
|
+
}
|
|
98773
|
+
const animations = generateFullMorphTransition(fromSlide, toSlide, durationMs, mode);
|
|
98774
|
+
const outgoingIds = new Set(match.unmatchedFrom.map((element) => element.id));
|
|
98775
|
+
const incomingAnimations = /* @__PURE__ */ new Map();
|
|
98776
|
+
const outgoingAnimations = /* @__PURE__ */ new Map();
|
|
98777
|
+
const keyframes = [];
|
|
98778
|
+
for (const animation of animations) {
|
|
98779
|
+
keyframes.push(animation.keyframes);
|
|
98780
|
+
if (outgoingIds.has(animation.elementId)) {
|
|
98781
|
+
outgoingAnimations.set(animation.elementId, animation.animation);
|
|
98782
|
+
} else {
|
|
98783
|
+
incomingAnimations.set(animation.elementId, animation.animation);
|
|
98784
|
+
}
|
|
98785
|
+
}
|
|
98786
|
+
return {
|
|
98787
|
+
keyframesCss: keyframes.join("\n"),
|
|
98788
|
+
incomingAnimations,
|
|
98789
|
+
outgoingAnimations,
|
|
98790
|
+
outgoingElements: match.unmatchedFrom,
|
|
98791
|
+
durationMs
|
|
98792
|
+
};
|
|
98793
|
+
}
|
|
97940
98794
|
function hexToRgb6(hex10) {
|
|
97941
98795
|
const clean = hex10.replace(/^#/u, "");
|
|
97942
98796
|
return {
|
|
@@ -109711,4 +110565,4 @@ function segmentFrameCount(durationMs, fps) {
|
|
|
109711
110565
|
* `<p:extLst>` (optional)
|
|
109712
110566
|
*/
|
|
109713
110567
|
|
|
109714
|
-
export { ACTION_BUTTON_PRESETS, ARTISTIC_EFFECTS, AVATAR_COLOR_SWATCHES, BACKSTAGE_NAV, BACKSTAGE_TEMPLATES, BROADCAST_THROTTLE_MS, CATEGORIES, COLOR_MAP_ALIAS_KEYS, CONNECTION_TIMEOUT_MS, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_COLOR_CHANGE_TOLERANCE, DEFAULT_COLOR_MAP, DEFAULT_INSERT_CHART_TYPE, DEFAULT_QUICK_ACCESS_COMMAND_IDS, DEFAULT_ROW_HEIGHT, DEFAULT_VIEWER_OPTIONS, DEFAULT_VIEWER_PROFILE, DEFAULT_VIRTUAL_OVERSCAN, DIRECTIONAL_PRESETS, DUOTONE_PRESETS, EQUATION_TEMPLATES, EXPORT_ASSEMBLING_PERCENT, EXPORT_DONE_PERCENT, EncryptedFileError, FILL_MODE_OPTIONS, GRADIENT_TYPE_OPTIONS, HANDOUT_OPTIONS, INK_REPLAY_KEYFRAMES, INSERT_CHART_TYPES, LBL, LOCAL_SYNC_ORIGIN, MOBILE_BREAKPOINT, NOTES_FONT_SIZE_DEFAULT, NOTES_FONT_SIZE_MAX, NOTES_FONT_SIZE_MIN, NOTES_FONT_SIZE_STEP, NUM, PATTERN_OPTIONS, PRESENTATION_CHANNEL_NAME, PRESENTATION_HASH, PRESENTATION_MESSAGE_ORIGIN, PRESENTATION_NONCE_KEY, PRESETS, PptxHandler, PptxMarkdownConverter, PresentationAnimationController, QUICK_ACCESS_COMMAND_CATALOG, RULER_FONT_SIZE, RULER_THICKNESS, SECTION_HEADING, SEL, SHAPE_PRESET_DEFS, SHORTCUT_REFERENCE_ITEMS, SLIDE_TRANSITION_KEYFRAMES, SLIDE_VIRTUALIZATION_THRESHOLD, SWITCHABLE_LAYOUT_TYPES, SvgExporter, TABLET_BREAKPOINT, TABLE_STYLE_PRESETS, TAB_ROW_ACTION_CLASSES, TEXT_BUILD_ID_SEP, THEME_CATALOG, THEME_COLOR_LABELS, THEME_COLOR_SCHEME_KEYS, THEME_PRESETS, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, TOOLBAR_TABS, ThemePresets, VIEWER_OPTIONS_TABS, VIEWER_PREFS_STORAGE_KEY, WEBM_MIME_CANDIDATES, acceptsPresentationInput, activateModalFocus, addQuickAccessCommand, addSection, addSmartArtNode, addSmartArtNodeAsChild, alignElements, appendPresentationInkPoint, apply3dEffects, applyAcceptAllSlides, applyAcceptSlide, applyCaseTransformToSegments, applyChartBuildReveal, applyColorChange, applyDuotone, applyFormatToElement, applyPreferenceToOptions, applyRehearsalTimings, applyReroutedConnectors, applyResize, applyStyleToSelectedSegments, applyThemeOverrideToSlide, applyThemeToData, availableQuickAccessCommands, bringForward, bringToFront, build3DExtrusionData, buildBroadcastViewerUrl, buildCacheKey, buildCalloutLeaderLineSvgPath, buildChartViewModel, buildCollaborationShareUrl, buildCreateCollaborationConfig, buildCssGradientFromShapeStyle, buildDuotoneCacheKey, buildElementClipboardPayload, buildGlowBoxShadow, buildHandoutsHtml, buildInitialGuides, buildInnerShadowCssFromShapeStyle, buildJoinCollaborationConfig, buildMultiLayerShadowCss, buildNotesHtml, buildNotesPdfBytes, buildOutlineHtml, buildPatternFillCss, buildPresentationAudienceUrl, buildPreviewAnimation, buildPreviewElements, buildPrintDocument, buildPrintHtmlDocument, buildReflectionCss, buildShadowCssFromShapeStyle, buildSlidesHtml, buildSlidesPdfBytes, buildSmartArt3DModel, buildSmartArtA11y, buildSmartArtPresetData, buildSummaryZoomView, buildTextBody3DSceneStyle, buildTextBuildSpec, buildTextFillCss, buildTextReflectionCss, buildTextRunFilterChain, buildTextShadowCss, buildThemeColorGrid, buildThemeColorMap, buildUserFontFaceStyles, canvasToJpegData, cell3DBevelCss, chartDataAddCategory, chartDataAddSeries, chartDataChangeType, chartDataRemoveCategory, chartDataRemoveSeries, chartDataUpdatePoint, chartPartToAttrs, clampCropValue, clampNotesFontSize, clampPercent, clampUnitInterval2 as clampUnitInterval, clearAllLocalViewerData, clearAudienceContent, clearLocalAwareness, clearStoredViewerPrefs, cloneElementForPaste, cloneHistorySnapshot, cloneSlide, cloneTemplateElementsBySlideId, collectImagePaths, collectMediaElements, collectUsedFonts, colorWithOpacity, comparePresentation, computeAllNotesPages, computeAutoFitTextStyle, computeColumnBoundaries, computeEntranceAnimationDelay, computeHandoutLayout, computeInlineEditorRect, computeKeyboardInset, computeLayout, computeLayoutOptions, computeMarqueeHitIds, computeMergeCellDown, computeMergeCellRight, computeResizedColumnWidths, computeResizedRowHeight, computeScrollDelta, computeSelectionRect, computeSmartArtLayout2 as computeSmartArtLayout, computeSnapToShape, computeSplitCell, computeValueRange, computeValueRangeForChart, computeVirtualRange, convertLatexToOmml, convertOmmlToLatex, convertOmmlToMathMl, copyFormatFromElement, createBackstagePresentation, createBlankSlide, createCollaborationLivePatcher, createDefaultChartElement, createDepartureChannel, createInitialPresentationSnapshot, createPresentationKeyBuffer, createPresentationSessionId, createPresenterTimer, createSyncGate, createTouchGestureRecognizer, createViewerOptionsStore, customGeometryPathsToSvgSubpaths, defaultCssVars, defaultRadius, defaultThemeColors, deleteAutosaveSnapshot, deleteSection, deleteTableColumn, deleteTableRow, demoteSmartArtNode, derivePresenceList, detectOrientation, detectTouchDevice, distributeElements, downloadBlob, downloadDataUrl, dragAnchorViewY, dragValueForPart, elementActionToPptxAction, encodeGif, endAudienceDisplay, erasePresentationInkAt, evaluatePresetShape, extractPathPoints, filterCommands, findChartPartTarget, findSmartArtNodeText, formatAxisValue, formatAxisValueWithUnits, formatBackstageDate, formatBackstageSize, formatBytes, formatCommentTimestamp, formatElapsed, formatMobileElapsed, formatRelativeTime, formatSlideCounter, formatTime, formatVersionTimestamp, fpsToFrameIntervalMs, generateBroadcastRoomId, generateElementId, generateLogTicks, generateNoteLineCount, generatePackageReadme, generatePressureCircles, generateTicks, getAnimationInitialStyle, getAriaLabel, getAriaRole, getAriaRoleDescription, getCachedResult, getCalloutLeaderLineGeometry, getCalloutViewBoxBounds, getCellDiagonalBorders, getChartStylePalette, getCommentMarkerPosition, getCompoundLineBorderWidth, getCompoundLineBoxShadow, getCompoundLineOffsets, getCompoundLineWidths, getComputedEffectStyle, getConnectionSites, getContentPartReplayStyles, getCssBorderDashStyle, getDisplayUnitLabel, getDuotoneCachedResult, getEffectDagFilter, getElementLabel, getElementTransform, getElementTransformWithoutRotation, getGroupChildParentFill, getImageColorWashStyle, getImageEffectsFilter, getImageEffectsOpacity, getImageSvgFilters, getInkReplayStyles, getInlineEditorSelection, getKinsokuLineBreakStyles, getLinkedTextBoxSegments, getLocalStorageUsageSummary, getNotesPrintableArea, getOleBadgeLabel, getOleObjectTypeLabel, getOleTypeColor, getOleTypeLabel, getPatternSvg, getPendingSelectionRestore, getPresetShapeClipPath, getPrintableArea, getResolvedShapeClipPath, getRoundRectRadiusPx, getSecondaryValueAxis, getShapeAdjustmentHandleDescriptor, getSlideBackgroundStyle, getSlideTransitionAnimations, getSoftEdgeFilterId, getSoftEdgeSvgFilter, getSubstituteFontFamily, getSvgStrokeDasharray, getTextAlphaOpacity, getTextCompensationTransform, getWarpPath, groupElements, groupIntoParagraphs, groupSlidesBySection, guidePxToEmu, hasCopyableFormat, hasDistinctScriptFonts, hasPressureVariation, hasShapeProperties, hasTextProperties, hexToRgbChannels2 as hexToRgbChannels, insertTableColumn, insertTableRow, isActionHidden, isBrowserOpenableMime, isCalloutShape, isCellInRect, isEditableTextElement, isExportAbortError, isFirstSlide, isImageLikeElement, isInkElement, isKeyboardOpen, isLastSlide, isMixedContentBlocked, isMobileViewport, isPpactionUrl, isPresentationSessionMessage, isTemplateElement, isTemplateElementId2 as isTemplateElementId, isUrlSafe, listAutosaveSnapshots, listBackstageRecentFiles, loadAudienceContent, makeCloneId, makeSlideId, mapPresentationKey, mayLeaveSlideShow, mergeAdditiveSelection, mergeCells, mergePresentationSnapshot, mergeShapes, mobileElapsedSince, mobileSlideCounter, mountModel3D, mountSurfaceChart3D, movePresenterPointer, moveQuickAccessCommand, moveSectionDown, moveSectionUp, moveSlidesToSection, newTableElement, normalizeColorsForCapture, normalizeHexColor, normalizeStrokeDashType, normalizeValue, notesSegmentsToSpans, observeYDocSlides, ooxmlDashToCssBorderStyle, ooxmlGradientAngleToCssDegrees, openPptxFile, openUrlInNewTab, paletteColor, parseDrawingColor, parseDrawingColorOpacity, parseMediaCommand, parsePpactionUrl, pickSupportedMimeType, placeAudienceWindow, polygonsToSvgPath, pptxActionToElementAction, preprocessCssForCapture, presentationInkPath, presenterElapsed, presenterPaneAdvancesOnClick, pressuresToWidths, printPropertiesFrameSlides, printPropertiesSlidesPerPage, promoteSmartArtNode, publishLiveGeometry, publishLiveInlineText, reResolveSlideColors, readBackstageRecentFile, readSlidesFromYDoc, readStoredViewerPrefs, readViewportMetrics, rebuildDrawingShapesIfCleared, rebuildTableStructureInRawXml, reconcileSlidesInYDoc, recordProgressPercent, rectToCells, registerCollaborationTeardown, remapTextToSegments, removeQuickAccessCommand, removeSmartArtNode, renameSection, reorderSmartArtNode, rerouteConnectorsForMovedElements, resetPresenterTimer, resolveAudienceScreenPlacement, resolveCssTextAlign, resolveDrawingShapeNodeId, resolveFontForScript, resolveFontRefIdx, resolveGroupChildFill, resolveInkColor, resolveInkOpacity, resolveInkWidth, resolveLineHeight, resolveOleType, resolveParagraphAlign, resolveParagraphRtl, resolvePictureBullet, resolveProfileInitial, resolveRegionCode, resolveThemeCatalogEntry, resolveTitleBarStatusKey, resolveTransitionDurationMs, resolveTransportForServerUrl, resolveUnderlineDecorationStyle, resolveViewerAddinRows, restoreSegmentSelection, revealedSmartArtNodeCount, safeOpenUrl, sanitizeColor, sanitizeDownloadFilename, sanitizeMathMl, saveAutosaveSnapshot, saveViewerProfile, scanAvailableFontFamilies, segmentByScript, segmentFrameCount, sendBackward, sendToBack, sequentialColorScale, seriesColor2 as seriesColor, setCachedResult, setChartAxisGridlineStyle, setChartAxisLogScale, setChartAxisTitleStyle, setChartDataPointExplosion, setChartDataPointFill, setChartDataPointLabel, setChartDataPointMarker, setChartSeriesChartType, setChartSeriesMarker, setDuotoneCachedResult, setPendingSelectionRestore, setSmartArtNodeStyle, shadeColor2, shouldAutoFollowBroadcaster, shouldCommitSmartArtNodeText, shouldConfirmExternalHyperlink, shouldLoopContinuously, shouldUseSvgWarp, slideProgressPercent, slideStatusLabel, snapBoxToGrid, splitCell, splitSeriesByAxis, stepPresenterZoom, storeAudienceContent, substituteFieldText, svgLineCap, svgPathToPolygons, swapPresentationWindows, switchSmartArtLayout, textBuildSpanStyle, themeColorSchemesEqual, themeToCssVars, tintColor2, toCssTextOrientation, toCssVerticalDirection, toCssWritingMode, togglePresenterTimer, transformTextCase, updateCellTextInRawXml, updateCellTextStyleInRawXml, updateMergeAttrsInRawXml, updateSmartArtNodeText, validateRoomId, valueToY, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, viewerOptionsToPreferences, withChartPointValue, withChartTitle, withFrameSlides, withSlidesPerPage, writeStoredViewerPrefs };
|
|
110568
|
+
export { ACTION_BUTTON_PRESETS, ARTISTIC_EFFECTS, AVATAR_COLOR_SWATCHES, BACKSTAGE_NAV, BACKSTAGE_TEMPLATES, BROADCAST_THROTTLE_MS, CATEGORIES, COLOR_MAP_ALIAS_KEYS, CONNECTION_TIMEOUT_MS, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_COLOR_CHANGE_TOLERANCE, DEFAULT_COLOR_MAP, DEFAULT_INSERT_CHART_TYPE, DEFAULT_QUICK_ACCESS_COMMAND_IDS, DEFAULT_ROW_HEIGHT, DEFAULT_VIEWER_OPTIONS, DEFAULT_VIEWER_PROFILE, DEFAULT_VIRTUAL_OVERSCAN, DIRECTIONAL_PRESETS, DUOTONE_PRESETS, EQUATION_TEMPLATES, EXPORT_ASSEMBLING_PERCENT, EXPORT_DONE_PERCENT, EncryptedFileError, FILL_MODE_OPTIONS, GRADIENT_TYPE_OPTIONS, HANDOUT_OPTIONS, INK_REPLAY_KEYFRAMES, INSERT_CHART_TYPES, LBL, LOCAL_SYNC_ORIGIN, MOBILE_BREAKPOINT, NOTES_FONT_SIZE_DEFAULT, NOTES_FONT_SIZE_MAX, NOTES_FONT_SIZE_MIN, NOTES_FONT_SIZE_STEP, NUM, PATTERN_OPTIONS, PRESENTATION_CHANNEL_NAME, PRESENTATION_HASH, PRESENTATION_MESSAGE_ORIGIN, PRESENTATION_NONCE_KEY, PRESETS, PptxHandler, PptxMarkdownConverter, PresentationAnimationController, QUICK_ACCESS_COMMAND_CATALOG, RULER_FONT_SIZE, RULER_THICKNESS, SECTION_HEADING, SEL, SHAPE_PRESET_DEFS, SHORTCUT_REFERENCE_ITEMS, SLIDE_TRANSITION_KEYFRAMES, SLIDE_VIRTUALIZATION_THRESHOLD, SWITCHABLE_LAYOUT_TYPES, SvgExporter, TABLET_BREAKPOINT, TABLE_STYLE_PRESETS, TAB_ROW_ACTION_CLASSES, TEXT_BUILD_ID_SEP, THEME_CATALOG, THEME_COLOR_LABELS, THEME_COLOR_SCHEME_KEYS, THEME_PRESETS, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, TOOLBAR_TABS, ThemePresets, VIEWER_OPTIONS_TABS, VIEWER_PREFS_STORAGE_KEY, WEBM_MIME_CANDIDATES, acceptsPresentationInput, activateModalFocus, addQuickAccessCommand, addSection, addSmartArtNode, addSmartArtNodeAsChild, alignElements, appendPresentationInkPoint, apply3dEffects, applyAcceptAllSlides, applyAcceptSlide, applyCaseTransformToSegments, applyChartBuildReveal, applyColorChange, applyDuotone, applyFormatToElement, applyPreferenceToOptions, applyRehearsalTimings, applyReroutedConnectors, applyResize, applyStyleToSelectedSegments, applyThemeOverrideToSlide, applyThemeToData, availableQuickAccessCommands, bringForward, bringToFront, build3DExtrusionData, buildBroadcastViewerUrl, buildCacheKey, buildCalloutLeaderLineSvgPath, buildChartViewModel, buildCollaborationShareUrl, buildCreateCollaborationConfig, buildCssGradientFromShapeStyle, buildDuotoneCacheKey, buildElementClipboardPayload, buildGlowBoxShadow, buildHandoutsHtml, buildInitialGuides, buildInnerShadowCssFromShapeStyle, buildJoinCollaborationConfig, buildMorphTransitionPlan, buildMultiLayerShadowCss, buildNotesHtml, buildNotesPdfBytes, buildOutlineHtml, buildPatternFillCss, buildPresentationAudienceUrl, buildPreviewAnimation, buildPreviewElements, buildPrintDocument, buildPrintHtmlDocument, buildReflectionCss, buildShadowCssFromShapeStyle, buildSlidesHtml, buildSlidesPdfBytes, buildSmartArt3DModel, buildSmartArtA11y, buildSmartArtPresetData, buildSummaryZoomView, buildTextBody3DSceneStyle, buildTextBuildSpec, buildTextFillCss, buildTextReflectionCss, buildTextRunFilterChain, buildTextShadowCss, buildThemeColorGrid, buildThemeColorMap, buildUserFontFaceStyles, canvasToJpegData, cell3DBevelCss, chartDataAddCategory, chartDataAddSeries, chartDataChangeType, chartDataRemoveCategory, chartDataRemoveSeries, chartDataUpdatePoint, chartPartToAttrs, clampCropValue, clampNotesFontSize, clampPercent, clampUnitInterval2 as clampUnitInterval, clearAllLocalViewerData, clearAudienceContent, clearLocalAwareness, clearStoredViewerPrefs, cloneElementForPaste, cloneHistorySnapshot, cloneSlide, cloneTemplateElementsBySlideId, collectImagePaths, collectMediaElements, collectUsedFonts, colorWithOpacity, comparePresentation, computeAllNotesPages, computeAutoFitTextStyle, computeColumnBoundaries, computeEntranceAnimationDelay, computeHandoutLayout, computeInlineEditorRect, computeKeyboardInset, computeLayout, computeLayoutOptions, computeMarqueeHitIds, computeMergeCellDown, computeMergeCellRight, computeResizedColumnWidths, computeResizedRowHeight, computeScrollDelta, computeSelectionRect, computeSmartArtLayout2 as computeSmartArtLayout, computeSnapToShape, computeSplitCell, computeValueRange, computeValueRangeForChart, computeVirtualRange, convertLatexToOmml, convertOmmlToLatex, convertOmmlToMathMl, copyFormatFromElement, createBackstagePresentation, createBlankSlide, createCollaborationLivePatcher, createDefaultChartElement, createDepartureChannel, createInitialPresentationSnapshot, createPresentationKeyBuffer, createPresentationSessionId, createPresenterTimer, createSyncGate, createTouchGestureRecognizer, createViewerOptionsStore, customGeometryPathsToSvgSubpaths, defaultCssVars, defaultRadius, defaultThemeColors, deleteAutosaveSnapshot, deleteSection, deleteTableColumn, deleteTableRow, demoteSmartArtNode, derivePresenceList, detectOrientation, detectTouchDevice, distributeElements, downloadBlob, downloadDataUrl, dragAnchorViewY, dragValueForPart, elementActionToPptxAction, encodeGif, endAudienceDisplay, erasePresentationInkAt, evaluatePresetShape, extractPathPoints, filterCommands, findChartPartTarget, findSmartArtNodeText, formatAxisValue, formatAxisValueWithUnits, formatBackstageDate, formatBackstageSize, formatBytes, formatCommentTimestamp, formatElapsed, formatMobileElapsed, formatRelativeTime, formatSlideCounter, formatTime, formatVersionTimestamp, fpsToFrameIntervalMs, generateBroadcastRoomId, generateElementId, generateLogTicks, generateNoteLineCount, generatePackageReadme, generatePressureCircles, generateTicks, getAnimationInitialStyle, getAriaLabel, getAriaRole, getAriaRoleDescription, getCachedResult, getCalloutLeaderLineGeometry, getCalloutViewBoxBounds, getCellDiagonalBorders, getChartStylePalette, getCommentMarkerPosition, getCompoundLineBorderWidth, getCompoundLineBoxShadow, getCompoundLineOffsets, getCompoundLineWidths, getComputedEffectStyle, getConnectionSites, getContentPartReplayStyles, getCssBorderDashStyle, getDisplayUnitLabel, getDuotoneCachedResult, getEffectDagFilter, getElementLabel, getElementTransform, getElementTransformWithoutRotation, getGroupChildParentFill, getImageColorWashStyle, getImageEffectsFilter, getImageEffectsOpacity, getImageSvgFilters, getInkReplayStyles, getInlineEditorSelection, getKinsokuLineBreakStyles, getLinkedTextBoxSegments, getLocalStorageUsageSummary, getNotesPrintableArea, getOleBadgeLabel, getOleObjectTypeLabel, getOleTypeColor, getOleTypeLabel, getPatternSvg, getPendingSelectionRestore, getPresetShapeClipPath, getPrintableArea, getResolvedShapeClipPath, getRoundRectRadiusPx, getSecondaryValueAxis, getShapeAdjustmentHandleDescriptor, getSlideBackgroundStyle, getSlideTransitionAnimations, getSoftEdgeFilterId, getSoftEdgeSvgFilter, getSubstituteFontFamily, getSvgStrokeDasharray, getTextAlphaOpacity, getTextCompensationTransform, getWarpPath, groupElements, groupIntoParagraphs, groupSlidesBySection, guidePxToEmu, hasCopyableFormat, hasDistinctScriptFonts, hasPressureVariation, hasShapeProperties, hasTextProperties, hexToRgbChannels2 as hexToRgbChannels, insertTableColumn, insertTableRow, isActionHidden, isBrowserOpenableMime, isCalloutShape, isCellInRect, isEditableTextElement, isExportAbortError, isFirstSlide, isImageLikeElement, isInkElement, isKeyboardOpen, isLastSlide, isMixedContentBlocked, isMobileViewport, isPpactionUrl, isPresentationSessionMessage, isTemplateElement, isTemplateElementId2 as isTemplateElementId, isUrlSafe, listAutosaveSnapshots, listBackstageRecentFiles, loadAudienceContent, makeCloneId, makeSlideId, mapPresentationKey, mayLeaveSlideShow, mergeAdditiveSelection, mergeCells, mergePresentationSnapshot, mergeShapes, mobileElapsedSince, mobileSlideCounter, morphOptionToMode, mountModel3D, mountSurfaceChart3D, movePresenterPointer, moveQuickAccessCommand, moveSectionDown, moveSectionUp, moveSlidesToSection, newTableElement, normalizeColorsForCapture, normalizeHexColor, normalizeStrokeDashType, normalizeValue, notesSegmentsToSpans, observeYDocSlides, ooxmlDashToCssBorderStyle, ooxmlGradientAngleToCssDegrees, openPptxFile, openUrlInNewTab, paletteColor, parseDrawingColor, parseDrawingColorOpacity, parseMediaCommand, parsePpactionUrl, pickSupportedMimeType, placeAudienceWindow, polygonsToSvgPath, pptxActionToElementAction, preprocessCssForCapture, presentationInkPath, presenterElapsed, presenterPaneAdvancesOnClick, pressuresToWidths, printPropertiesFrameSlides, printPropertiesSlidesPerPage, promoteSmartArtNode, publishLiveGeometry, publishLiveInlineText, reResolveSlideColors, readBackstageRecentFile, readSlidesFromYDoc, readStoredViewerPrefs, readViewportMetrics, rebuildDrawingShapesIfCleared, rebuildTableStructureInRawXml, reconcileSlidesInYDoc, recordProgressPercent, rectToCells, registerCollaborationTeardown, remapTextToSegments, removeQuickAccessCommand, removeSmartArtNode, renameSection, reorderSmartArtNode, rerouteConnectorsForMovedElements, resetPresenterTimer, resolveAudienceScreenPlacement, resolveCssTextAlign, resolveDrawingShapeNodeId, resolveFontForScript, resolveFontRefIdx, resolveGroupChildFill, resolveInkColor, resolveInkOpacity, resolveInkWidth, resolveLineHeight, resolveOleType, resolveParagraphAlign, resolveParagraphRtl, resolveParagraphStrutFontSize, resolvePictureBullet, resolveProfileInitial, resolveRegionCode, resolveThemeCatalogEntry, resolveTitleBarStatusKey, resolveTransitionDurationMs, resolveTransportForServerUrl, resolveUnderlineDecorationStyle, resolveViewerAddinRows, restoreSegmentSelection, revealedSmartArtNodeCount, safeOpenUrl, sanitizeColor, sanitizeDownloadFilename, sanitizeMathMl, saveAutosaveSnapshot, saveViewerProfile, scanAvailableFontFamilies, segmentByScript, segmentFrameCount, sendBackward, sendToBack, sequentialColorScale, seriesColor2 as seriesColor, setCachedResult, setChartAxisGridlineStyle, setChartAxisLogScale, setChartAxisTitleStyle, setChartDataPointExplosion, setChartDataPointFill, setChartDataPointLabel, setChartDataPointMarker, setChartSeriesChartType, setChartSeriesMarker, setDuotoneCachedResult, setPendingSelectionRestore, setSmartArtNodeStyle, shadeColor2, shouldAutoFollowBroadcaster, shouldCommitSmartArtNodeText, shouldConfirmExternalHyperlink, shouldLoopContinuously, shouldUseSvgWarp, slideProgressPercent, slideStatusLabel, snapBoxToGrid, splitCell, splitSeriesByAxis, stepPresenterZoom, storeAudienceContent, substituteFieldText, svgLineCap, svgPathToPolygons, swapPresentationWindows, switchSmartArtLayout, textBuildSpanStyle, themeColorSchemesEqual, themeToCssVars, tintColor2, toCssTextOrientation, toCssVerticalDirection, toCssWritingMode, togglePresenterTimer, transformTextCase, updateCellTextInRawXml, updateCellTextStyleInRawXml, updateMergeAttrsInRawXml, updateSmartArtNodeText, validateRoomId, valueToY, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, viewerOptionsToPreferences, withChartPointValue, withChartTitle, withFrameSlides, withSlidesPerPage, writeStoredViewerPrefs };
|