pptx-react-viewer 1.25.4 → 1.25.5

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.
Files changed (98) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/{Model3DScene-DZFYJPUH.mjs → Model3DScene-XVYOISVJ.mjs} +2 -2
  3. package/dist/Model3DScene-XVYOISVJ.mjs.br +0 -0
  4. package/dist/Model3DScene-XVYOISVJ.mjs.gz +0 -0
  5. package/dist/{Model3DScene-SP6WOKSX.js → Model3DScene-Y5ABLO7K.js} +3 -3
  6. package/dist/Model3DScene-Y5ABLO7K.js.br +0 -0
  7. package/dist/Model3DScene-Y5ABLO7K.js.gz +0 -0
  8. package/dist/{SurfaceChart3DScene-54BRNPQ5.mjs → SurfaceChart3DScene-RXZADECL.mjs} +2 -2
  9. package/dist/SurfaceChart3DScene-RXZADECL.mjs.br +0 -0
  10. package/dist/SurfaceChart3DScene-RXZADECL.mjs.gz +0 -0
  11. package/dist/{SurfaceChart3DScene-GISPZ4C2.js → SurfaceChart3DScene-WMY5JTW4.js} +3 -3
  12. package/dist/SurfaceChart3DScene-WMY5JTW4.js.br +0 -0
  13. package/dist/SurfaceChart3DScene-WMY5JTW4.js.gz +0 -0
  14. package/dist/{chunk-5VYVKFMS.js → chunk-7CSBUYRN.js} +808 -808
  15. package/dist/chunk-7CSBUYRN.js.br +0 -0
  16. package/dist/chunk-7CSBUYRN.js.gz +0 -0
  17. package/dist/{chunk-7FE27DDH.js → chunk-E55Q4AC7.js} +556 -476
  18. package/dist/chunk-E55Q4AC7.js.br +0 -0
  19. package/dist/chunk-E55Q4AC7.js.gz +0 -0
  20. package/dist/{chunk-P72VQ7WE.mjs → chunk-F4WPQRZU.mjs} +96 -16
  21. package/dist/chunk-F4WPQRZU.mjs.br +0 -0
  22. package/dist/chunk-F4WPQRZU.mjs.gz +0 -0
  23. package/dist/{chunk-UYNOPUSG.mjs → chunk-FOMF7POV.mjs} +1658 -353
  24. package/dist/chunk-FOMF7POV.mjs.br +0 -0
  25. package/dist/chunk-FOMF7POV.mjs.gz +0 -0
  26. package/dist/{chunk-VUC3UPLM.mjs → chunk-FVQDRA5N.mjs} +1044 -108
  27. package/dist/chunk-FVQDRA5N.mjs.br +0 -0
  28. package/dist/chunk-FVQDRA5N.mjs.gz +0 -0
  29. package/dist/{chunk-FWF2SP6N.js → chunk-IPYAN574.js} +1660 -352
  30. package/dist/chunk-IPYAN574.js.br +0 -0
  31. package/dist/chunk-IPYAN574.js.gz +0 -0
  32. package/dist/{chunk-TPG2WKHQ.mjs → chunk-L4ZADJOM.mjs} +6 -6
  33. package/dist/chunk-L4ZADJOM.mjs.br +0 -0
  34. package/dist/chunk-L4ZADJOM.mjs.gz +0 -0
  35. package/dist/{chunk-6F4WVHS3.js → chunk-TEN35NUX.js} +1077 -141
  36. package/dist/chunk-TEN35NUX.js.br +0 -0
  37. package/dist/chunk-TEN35NUX.js.gz +0 -0
  38. package/dist/{dist-QU6JIDAF.js → dist-755SJ3ZH.js} +574 -562
  39. package/dist/dist-755SJ3ZH.js.br +0 -0
  40. package/dist/dist-755SJ3ZH.js.gz +0 -0
  41. package/dist/dist-FFWP5NQZ.mjs +2 -0
  42. package/dist/dist-FFWP5NQZ.mjs.br +0 -0
  43. package/dist/dist-FFWP5NQZ.mjs.gz +0 -0
  44. package/dist/hooks-unstable.d.ts +243 -4
  45. package/dist/hooks-unstable.d.ts.map +1 -1
  46. package/dist/hooks-unstable.js +78 -78
  47. package/dist/hooks-unstable.js.br +0 -0
  48. package/dist/hooks-unstable.js.gz +0 -0
  49. package/dist/hooks-unstable.mjs +3 -3
  50. package/dist/hooks-unstable.mjs.br +0 -0
  51. package/dist/hooks-unstable.mjs.gz +0 -0
  52. package/dist/{index-DWvM1PBB.d.ts → index-J6IuHQ2_.d.ts} +21 -4
  53. package/dist/index-J6IuHQ2_.d.ts.map +1 -0
  54. package/dist/index.d.ts +223 -1
  55. package/dist/index.js +33 -33
  56. package/dist/index.js.br +0 -0
  57. package/dist/index.js.gz +0 -0
  58. package/dist/index.mjs +4 -4
  59. package/dist/index.mjs.br +0 -0
  60. package/dist/index.mjs.gz +0 -0
  61. package/dist/viewer/index.d.ts +223 -1
  62. package/dist/viewer/index.js +20 -20
  63. package/dist/viewer/index.js.br +0 -0
  64. package/dist/viewer/index.js.gz +0 -0
  65. package/dist/viewer/index.mjs +4 -4
  66. package/dist/viewer/index.mjs.br +0 -0
  67. package/dist/viewer/index.mjs.gz +0 -0
  68. package/package.json +1 -1
  69. package/dist/Model3DScene-DZFYJPUH.mjs.br +0 -0
  70. package/dist/Model3DScene-DZFYJPUH.mjs.gz +0 -0
  71. package/dist/Model3DScene-SP6WOKSX.js.br +0 -0
  72. package/dist/Model3DScene-SP6WOKSX.js.gz +0 -0
  73. package/dist/SurfaceChart3DScene-54BRNPQ5.mjs.br +0 -0
  74. package/dist/SurfaceChart3DScene-54BRNPQ5.mjs.gz +0 -0
  75. package/dist/SurfaceChart3DScene-GISPZ4C2.js.br +0 -0
  76. package/dist/SurfaceChart3DScene-GISPZ4C2.js.gz +0 -0
  77. package/dist/chunk-5VYVKFMS.js.br +0 -0
  78. package/dist/chunk-5VYVKFMS.js.gz +0 -0
  79. package/dist/chunk-6F4WVHS3.js.br +0 -0
  80. package/dist/chunk-6F4WVHS3.js.gz +0 -0
  81. package/dist/chunk-7FE27DDH.js.br +0 -0
  82. package/dist/chunk-7FE27DDH.js.gz +0 -0
  83. package/dist/chunk-FWF2SP6N.js.br +0 -0
  84. package/dist/chunk-FWF2SP6N.js.gz +0 -0
  85. package/dist/chunk-P72VQ7WE.mjs.br +0 -0
  86. package/dist/chunk-P72VQ7WE.mjs.gz +0 -0
  87. package/dist/chunk-TPG2WKHQ.mjs.br +0 -0
  88. package/dist/chunk-TPG2WKHQ.mjs.gz +0 -0
  89. package/dist/chunk-UYNOPUSG.mjs.br +0 -0
  90. package/dist/chunk-UYNOPUSG.mjs.gz +0 -0
  91. package/dist/chunk-VUC3UPLM.mjs.br +0 -0
  92. package/dist/chunk-VUC3UPLM.mjs.gz +0 -0
  93. package/dist/dist-QNYKM7YS.mjs +0 -2
  94. package/dist/dist-QNYKM7YS.mjs.br +0 -0
  95. package/dist/dist-QNYKM7YS.mjs.gz +0 -0
  96. package/dist/dist-QU6JIDAF.js.br +0 -0
  97. package/dist/dist-QU6JIDAF.js.gz +0 -0
  98. package/dist/index-DWvM1PBB.d.ts.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkFWF2SP6N_js = require('./chunk-FWF2SP6N.js');
3
+ var chunkIPYAN574_js = require('./chunk-IPYAN574.js');
4
4
  var DOMPurify = require('dompurify');
5
5
 
6
6
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -307,7 +307,7 @@ function buildInitialGuides(presentationGuides, firstSlideGuides) {
307
307
  guides.push({
308
308
  id: g.id,
309
309
  axis: g.orientation === "horz" ? "h" : "v",
310
- position: chunkFWF2SP6N_js.guideEmuToPx(g.positionEmu)
310
+ position: chunkIPYAN574_js.guideEmuToPx(g.positionEmu)
311
311
  });
312
312
  }
313
313
  }
@@ -316,7 +316,7 @@ function buildInitialGuides(presentationGuides, firstSlideGuides) {
316
316
  guides.push({
317
317
  id: g.id,
318
318
  axis: g.orientation === "horz" ? "h" : "v",
319
- position: chunkFWF2SP6N_js.guideEmuToPx(g.positionEmu)
319
+ position: chunkIPYAN574_js.guideEmuToPx(g.positionEmu)
320
320
  });
321
321
  }
322
322
  }
@@ -329,23 +329,23 @@ function getResolvedShapeClipPathFor(shapeType, width, height, adjustments) {
329
329
  return void 0;
330
330
  }
331
331
  if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {
332
- return chunkFWF2SP6N_js.getShapeClipPath(shapeType);
332
+ return chunkIPYAN574_js.getShapeClipPath(shapeType);
333
333
  }
334
334
  if (adjustments && Object.keys(adjustments).length > 0) {
335
- const adjusted = chunkFWF2SP6N_js.getAdjustmentAwareShapeClipPath(shapeType, width, height, adjustments);
335
+ const adjusted = chunkIPYAN574_js.getAdjustmentAwareShapeClipPath(shapeType, width, height, adjustments);
336
336
  if (adjusted !== void 0) {
337
337
  return adjusted;
338
338
  }
339
339
  }
340
- const fromPreset = chunkFWF2SP6N_js.getShapeClipPathFromPreset(shapeType, width, height, adjustments);
340
+ const fromPreset = chunkIPYAN574_js.getShapeClipPathFromPreset(shapeType, width, height, adjustments);
341
341
  if (fromPreset !== void 0) {
342
342
  return fromPreset;
343
343
  }
344
- const cloud = chunkFWF2SP6N_js.getCloudPathForRendering(shapeType, width, height);
344
+ const cloud = chunkIPYAN574_js.getCloudPathForRendering(shapeType, width, height);
345
345
  if (cloud !== void 0) {
346
346
  return cloud;
347
347
  }
348
- return chunkFWF2SP6N_js.getShapeClipPath(shapeType);
348
+ return chunkIPYAN574_js.getShapeClipPath(shapeType);
349
349
  }
350
350
  function buildCustomGeometryClipPath(pathData, pathWidth, pathHeight, elemWidth, elemHeight) {
351
351
  if (!pathData || !Number.isFinite(pathWidth) || !Number.isFinite(pathHeight) || pathWidth <= 0 || pathHeight <= 0 || !Number.isFinite(elemWidth) || !Number.isFinite(elemHeight) || elemWidth <= 0 || elemHeight <= 0) {
@@ -562,7 +562,27 @@ function buildReflectedGradientStops(stops) {
562
562
  }));
563
563
  return [...forward, ...reversed];
564
564
  }
565
- function buildGradientCss(gradient) {
565
+ function normalizeDegrees(deg) {
566
+ return (deg % 360 + 360) % 360;
567
+ }
568
+ function adjustLinearGradientAngle(angle, gradient, context) {
569
+ if (!context) {
570
+ return angle;
571
+ }
572
+ let result = angle;
573
+ const { width, height, rotation } = context;
574
+ if (gradient.fillGradientScaled !== false && typeof width === "number" && typeof height === "number" && width > 0 && height > 0 && width !== height) {
575
+ const rad = result * Math.PI / 180;
576
+ result = normalizeDegrees(
577
+ Math.atan2(height * Math.sin(rad), width * Math.cos(rad)) * 180 / Math.PI
578
+ );
579
+ }
580
+ if (gradient.fillGradientRotWithShape === false && typeof rotation === "number") {
581
+ result = normalizeDegrees(result - rotation);
582
+ }
583
+ return result;
584
+ }
585
+ function buildGradientCss(gradient, context) {
566
586
  if (!gradient || gradient.fillMode !== "gradient") {
567
587
  return void 0;
568
588
  }
@@ -584,9 +604,10 @@ function buildGradientCss(gradient) {
584
604
  return buildCirclePathGradient(stops, fp, ftr);
585
605
  }
586
606
  const normalizedAngle = typeof gradient.fillGradientAngle === "number" && Number.isFinite(gradient.fillGradientAngle) ? gradient.fillGradientAngle : 90;
607
+ const effectiveAngle = adjustLinearGradientAngle(normalizedAngle, gradient, context);
587
608
  const flip = gradient.fillGradientFlip;
588
609
  const linearStops = flip && flip !== "none" ? buildReflectedGradientStops(stops) : stops;
589
- return `linear-gradient(${Math.round(normalizedAngle)}deg, ${linearStops.map(toCssGradientStop).join(", ")})`;
610
+ return `linear-gradient(${Math.round(effectiveAngle)}deg, ${linearStops.map(toCssGradientStop).join(", ")})`;
590
611
  }
591
612
  var buildCssGradientFromShapeStyle = buildGradientCss;
592
613
  function getPatternSvg(preset, fg, bg) {
@@ -1117,7 +1138,7 @@ var DEFAULT_SCHEME_COLOR_MAP = {
1117
1138
  phclr: "#4472C4"
1118
1139
  };
1119
1140
  function applyDrawingColorTransforms2(baseColor, colorNode) {
1120
- return chunkFWF2SP6N_js.applyDrawingColorTransforms(baseColor, colorNode);
1141
+ return chunkIPYAN574_js.applyDrawingColorTransforms(baseColor, colorNode);
1121
1142
  }
1122
1143
  function parseDrawingColorChoice(colorNode, schemeColorOverrides) {
1123
1144
  if (!colorNode) {
@@ -1169,7 +1190,7 @@ function parseDrawingColorChoice(colorNode, schemeColorOverrides) {
1169
1190
  const h = hueRaw / 6e4;
1170
1191
  const s = clampUnitInterval(satRaw / 1e5);
1171
1192
  const l = clampUnitInterval(lumRaw / 1e5);
1172
- const rgb = chunkFWF2SP6N_js.hslToRgb(h, s, l);
1193
+ const rgb = chunkIPYAN574_js.hslToRgb(h, s, l);
1173
1194
  const toHex = (value) => Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
1174
1195
  const base = `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;
1175
1196
  return applyDrawingColorTransforms2(base, hslNode);
@@ -1179,7 +1200,7 @@ function parseDrawingColorChoice(colorNode, schemeColorOverrides) {
1179
1200
  const preset = String(
1180
1201
  colorNode["a:prstClr"]?.["@_val"] || ""
1181
1202
  ).toLowerCase();
1182
- const mapped = chunkFWF2SP6N_js.PRESET_COLOR_MAP[preset];
1203
+ const mapped = chunkIPYAN574_js.PRESET_COLOR_MAP[preset];
1183
1204
  if (!mapped) {
1184
1205
  return void 0;
1185
1206
  }
@@ -1534,7 +1555,7 @@ function hexToRgbUnit2(hex) {
1534
1555
  };
1535
1556
  }
1536
1557
  function getEffects(element) {
1537
- if (!chunkFWF2SP6N_js.isImageLikeElement(element)) {
1558
+ if (!chunkIPYAN574_js.isImageLikeElement(element)) {
1538
1559
  return void 0;
1539
1560
  }
1540
1561
  return element.imageEffects;
@@ -1723,7 +1744,7 @@ function buildDuotoneFilterMarkup(color1, color2) {
1723
1744
  const c2 = hexToRgbUnit2(color2);
1724
1745
  return `<feColorMatrix type="matrix" values="${GRAYSCALE_LUMINANCE_MATRIX}"/><feComponentTransfer><feFuncR type="linear" slope="${c2.r - c1.r}" intercept="${c1.r}"/><feFuncG type="linear" slope="${c2.g - c1.g}" intercept="${c1.g}"/><feFuncB type="linear" slope="${c2.b - c1.b}" intercept="${c1.b}"/></feComponentTransfer>`;
1725
1746
  }
1726
- function getDuotoneImageFilter(element, elementId = chunkFWF2SP6N_js.isImageLikeElement(element) ? element.id : "") {
1747
+ function getDuotoneImageFilter(element, elementId = chunkIPYAN574_js.isImageLikeElement(element) ? element.id : "") {
1727
1748
  const effects = getEffects(element);
1728
1749
  if (!effects?.duotone) {
1729
1750
  return void 0;
@@ -1825,7 +1846,7 @@ function buildImageAlphaFilterMarkup(effects) {
1825
1846
  }
1826
1847
  return parts.length > 0 ? parts.join("") : void 0;
1827
1848
  }
1828
- function getImageAlphaFilter(element, elementId = chunkFWF2SP6N_js.isImageLikeElement(element) ? element.id : "") {
1849
+ function getImageAlphaFilter(element, elementId = chunkIPYAN574_js.isImageLikeElement(element) ? element.id : "") {
1829
1850
  const effects = getEffects(element);
1830
1851
  if (!effects || !hasAdvancedImageAlphaEffects(element)) {
1831
1852
  return void 0;
@@ -1915,7 +1936,7 @@ function buildArtisticFilterMarkup(effectName, radius) {
1915
1936
  return void 0;
1916
1937
  }
1917
1938
  }
1918
- function getArtisticImageFilter(element, elementId = chunkFWF2SP6N_js.isImageLikeElement(element) ? element.id : "") {
1939
+ function getArtisticImageFilter(element, elementId = chunkIPYAN574_js.isImageLikeElement(element) ? element.id : "") {
1919
1940
  const effects = getEffects(element);
1920
1941
  if (!effects?.artisticEffect || !needsSvgArtisticFilter(effects.artisticEffect)) {
1921
1942
  return void 0;
@@ -2874,7 +2895,7 @@ function convertChildren(node) {
2874
2895
  if (key.startsWith("@_")) {
2875
2896
  continue;
2876
2897
  }
2877
- const tag = chunkFWF2SP6N_js.stripXmlOrderSuffix(key);
2898
+ const tag = chunkIPYAN574_js.stripXmlOrderSuffix(key);
2878
2899
  if (tag === "m:oMathPara") {
2879
2900
  continue;
2880
2901
  }
@@ -2946,7 +2967,7 @@ function findOmathRoots(node) {
2946
2967
  }
2947
2968
  }
2948
2969
  const contentTags = /* @__PURE__ */ new Set(["m:r", "m:f", "m:rad", "m:sSup", "m:sSub", "m:box"]);
2949
- if (Object.keys(node).some((key) => contentTags.has(chunkFWF2SP6N_js.stripXmlOrderSuffix(key)))) {
2970
+ if (Object.keys(node).some((key) => contentTags.has(chunkIPYAN574_js.stripXmlOrderSuffix(key)))) {
2950
2971
  return [node];
2951
2972
  }
2952
2973
  return [];
@@ -3156,7 +3177,7 @@ function mergeSiblings(nodes) {
3156
3177
  }
3157
3178
  const ordered = {};
3158
3179
  for (const [position, [key, value]] of entries.entries()) {
3159
- ordered[(counts.get(key) ?? 0) > 1 ? chunkFWF2SP6N_js.orderedXmlKey(key, position) : key] = value;
3180
+ ordered[(counts.get(key) ?? 0) > 1 ? chunkIPYAN574_js.orderedXmlKey(key, position) : key] = value;
3160
3181
  }
3161
3182
  return ordered;
3162
3183
  }
@@ -3560,7 +3581,7 @@ function ommlChildrenToLatex(node) {
3560
3581
  if (key.startsWith("@_")) {
3561
3582
  continue;
3562
3583
  }
3563
- const tag = chunkFWF2SP6N_js.stripXmlOrderSuffix(key);
3584
+ const tag = chunkIPYAN574_js.stripXmlOrderSuffix(key);
3564
3585
  const items = ensureArr(node[key]);
3565
3586
  for (const item of items) {
3566
3587
  const result = ommlElementToLatex(tag, item);
@@ -4179,6 +4200,10 @@ function resolveDataPointFill(series, pointIndex, fallbackColor) {
4179
4200
  function resolveVaryColorFill(series, pointIndex, paletteColor3) {
4180
4201
  return findDataPoint(series, pointIndex)?.spPr?.fillColor ?? paletteColor3;
4181
4202
  }
4203
+ function resolveDataPointExplosion(series, pointIndex) {
4204
+ const point = findDataPoint(series, pointIndex);
4205
+ return point?.explosion ?? series.explosion ?? 0;
4206
+ }
4182
4207
  function clamp3(value, min, max) {
4183
4208
  return Math.min(Math.max(value, min), max);
4184
4209
  }
@@ -4551,34 +4576,59 @@ function categoryTotals(series, catCount) {
4551
4576
  (_, ci) => series.reduce((sum, s) => sum + Math.abs(s.values[ci] ?? 0), 0)
4552
4577
  );
4553
4578
  }
4579
+ function blendToWhite(color) {
4580
+ const match = /^#?([0-9a-f]{6})$/iu.exec(color.trim());
4581
+ if (!match) {
4582
+ return color;
4583
+ }
4584
+ const value = Number.parseInt(match[1], 16);
4585
+ const mix = (channel) => Math.round(channel + (255 - channel) * 0.5);
4586
+ const r = mix(value >> 16 & 255);
4587
+ const g = mix(value >> 8 & 255);
4588
+ const b = mix(value & 255);
4589
+ return `#${(r << 16 | g << 8 | b).toString(16).padStart(6, "0").toUpperCase()}`;
4590
+ }
4591
+ function invertNegativeFill(series, pointIndex, value, baseFill) {
4592
+ if (value >= 0) {
4593
+ return baseFill;
4594
+ }
4595
+ const point = series.dataPoints?.find((p) => p.idx === pointIndex);
4596
+ const invert = point?.invertIfNegative ?? series.invertIfNegative ?? false;
4597
+ return invert ? blendToWhite(baseFill) : baseFill;
4598
+ }
4554
4599
  function buildBars(chartData, catCount, layout, primaryRange, secondaryRange, secondaryIdx, grouping, sourceIndices2) {
4555
4600
  const primitives = [];
4556
4601
  const dataLabels = [];
4557
4602
  const series = chartData.series;
4558
4603
  const palette = chartData.colorPalette;
4559
4604
  const showLabels = chartData.style?.hasDataLabels;
4605
+ const varyColorsSingle = chartData.varyColors === true && series.length === 1;
4560
4606
  if (grouping === "clustered") {
4561
4607
  const seriesCount = Math.max(series.length, 1);
4562
4608
  const barGroupWidth2 = layout.plotWidth / Math.max(catCount, 1);
4563
- const singleBarWidth = barGroupWidth2 * 0.7 / seriesCount;
4564
- const groupOffset = (barGroupWidth2 - singleBarWidth * seriesCount) / 2;
4609
+ const singleBarWidth = chartData.barGapWidth !== void 0 ? barGroupWidth2 / (seriesCount + Math.max(chartData.barGapWidth, 0) / 100) : barGroupWidth2 * 0.7 / seriesCount;
4610
+ const overlap = chartData.barOverlap ?? 0;
4611
+ const step = singleBarWidth * (1 - overlap / 100);
4612
+ const clusterWidth = singleBarWidth + step * (seriesCount - 1);
4613
+ const groupOffset = (barGroupWidth2 - clusterWidth) / 2;
4565
4614
  for (let displayIndex = 0; displayIndex < catCount; displayIndex++) {
4566
4615
  const sourceIndex = sourceIndices2[displayIndex] ?? displayIndex;
4567
4616
  for (let si = 0; si < series.length; si++) {
4568
4617
  const val2 = series[si].values[sourceIndex] ?? 0;
4569
- const x = layout.plotLeft + barGroupWidth2 * displayIndex + groupOffset + singleBarWidth * si;
4618
+ const x = layout.plotLeft + barGroupWidth2 * displayIndex + groupOffset + step * si;
4570
4619
  const activeRange = secondaryIdx.has(si) && secondaryRange ? secondaryRange : primaryRange;
4571
4620
  const zeroY = valueToY2(0, activeRange, layout.plotTop, layout.plotBottom);
4572
4621
  const valY = valueToY2(val2, activeRange, layout.plotTop, layout.plotBottom);
4573
4622
  const y = Math.min(zeroY, valY);
4574
4623
  const h = Math.max(Math.abs(zeroY - valY), 1);
4624
+ const baseFill = varyColorsSingle ? resolveVaryColorFill(series[si], sourceIndex, paletteColor2(sourceIndex, palette)) : resolveDataPointFill(series[si], sourceIndex, paletteColor2(si, palette)) ?? seriesColor2(series[si], si, palette);
4575
4625
  primitives.push({
4576
4626
  kind: "rect",
4577
4627
  x,
4578
4628
  y,
4579
4629
  w: singleBarWidth,
4580
4630
  h,
4581
- fill: resolveDataPointFill(series[si], sourceIndex, paletteColor2(si, palette)) ?? seriesColor2(series[si], si, palette),
4631
+ fill: invertNegativeFill(series[si], sourceIndex, val2, baseFill),
4582
4632
  rx: 1,
4583
4633
  part: { role: "dataPoint", seriesIndex: si, pointIndex: sourceIndex }
4584
4634
  });
@@ -4609,6 +4659,8 @@ function buildBars(chartData, catCount, layout, primaryRange, secondaryRange, se
4609
4659
  if (r.seriesIndex !== void 0 && r.pointIndex !== void 0) {
4610
4660
  const sourcePointIndex = sourceIndices2[r.pointIndex] ?? r.pointIndex;
4611
4661
  fill = resolveDataPointFill(series[r.seriesIndex], sourcePointIndex, r.fill) ?? r.fill;
4662
+ const value = series[r.seriesIndex].values[sourcePointIndex] ?? 0;
4663
+ fill = invertNegativeFill(series[r.seriesIndex], sourcePointIndex, value, fill);
4612
4664
  part = { role: "dataPoint", seriesIndex: r.seriesIndex, pointIndex: sourcePointIndex };
4613
4665
  }
4614
4666
  primitives.push({ kind: "rect", x: r.x, y: r.y, w: r.w, h: r.h, fill, rx: 1, part });
@@ -4642,13 +4694,14 @@ function buildBars(chartData, catCount, layout, primaryRange, secondaryRange, se
4642
4694
  const topY = valueToY2(top, primaryRange, layout.plotTop, layout.plotBottom);
4643
4695
  const y = Math.min(baseY, topY);
4644
4696
  const h = Math.max(Math.abs(baseY - topY), 0.5);
4697
+ const pctBaseFill = resolveDataPointFill(series[si], sourceIndex, paletteColor2(si, palette)) ?? seriesColor2(series[si], si, palette);
4645
4698
  primitives.push({
4646
4699
  kind: "rect",
4647
4700
  x,
4648
4701
  y,
4649
4702
  w: barW,
4650
4703
  h,
4651
- fill: resolveDataPointFill(series[si], sourceIndex, paletteColor2(si, palette)) ?? seriesColor2(series[si], si, palette),
4704
+ fill: invertNegativeFill(series[si], sourceIndex, rawVal, pctBaseFill),
4652
4705
  part: { role: "dataPoint", seriesIndex: si, pointIndex: sourceIndex }
4653
4706
  });
4654
4707
  if (showLabels && Math.abs(val2) > 0) {
@@ -4697,6 +4750,139 @@ function pushClusteredStackedLabels(series, sourceIndices2, catCount, layout, ra
4697
4750
  }
4698
4751
  }
4699
4752
  }
4753
+ function smoothLinePath(points) {
4754
+ if (points.length === 0) {
4755
+ return "";
4756
+ }
4757
+ if (points.length === 1) {
4758
+ return `M${points[0].x.toFixed(2)},${points[0].y.toFixed(2)}`;
4759
+ }
4760
+ if (points.length === 2) {
4761
+ return `M${points[0].x.toFixed(2)},${points[0].y.toFixed(2)} L${points[1].x.toFixed(2)},${points[1].y.toFixed(2)}`;
4762
+ }
4763
+ let d = `M${points[0].x.toFixed(2)},${points[0].y.toFixed(2)}`;
4764
+ for (let i = 0; i < points.length - 1; i++) {
4765
+ const p0 = points[i - 1] ?? points[i];
4766
+ const p1 = points[i];
4767
+ const p2 = points[i + 1];
4768
+ const p3 = points[i + 2] ?? p2;
4769
+ const cp1x = p1.x + (p2.x - p0.x) / 6;
4770
+ const cp1y = p1.y + (p2.y - p0.y) / 6;
4771
+ const cp2x = p2.x - (p3.x - p1.x) / 6;
4772
+ const cp2y = p2.y - (p3.y - p1.y) / 6;
4773
+ d += ` C${cp1x.toFixed(2)},${cp1y.toFixed(2)} ${cp2x.toFixed(2)},${cp2y.toFixed(2)} ${p2.x.toFixed(2)},${p2.y.toFixed(2)}`;
4774
+ }
4775
+ return d;
4776
+ }
4777
+ function markerRadius(size, defaultRadius2) {
4778
+ if (size === void 0 || !Number.isFinite(size) || size <= 0) {
4779
+ return defaultRadius2;
4780
+ }
4781
+ return size / 2;
4782
+ }
4783
+ function polygonPoints(vertices) {
4784
+ return vertices.map(([x, y]) => `${x.toFixed(2)},${y.toFixed(2)}`).join(" ");
4785
+ }
4786
+ function starVertices(cx, cy, r) {
4787
+ const inner = r * 0.5;
4788
+ const out = [];
4789
+ for (let i = 0; i < 10; i++) {
4790
+ const radius = i % 2 === 0 ? r : inner;
4791
+ const angle = -Math.PI / 2 + Math.PI * i / 5;
4792
+ out.push([cx + radius * Math.cos(angle), cy + radius * Math.sin(angle)]);
4793
+ }
4794
+ return out;
4795
+ }
4796
+ function buildMarkerPrimitive(input) {
4797
+ const { symbol, cx, cy, fill, part } = input;
4798
+ if (symbol === "none") {
4799
+ return null;
4800
+ }
4801
+ const r = markerRadius(input.size, input.defaultRadius);
4802
+ const stroke = fill;
4803
+ switch (symbol) {
4804
+ case "square":
4805
+ return { kind: "rect", x: cx - r, y: cy - r, w: r * 2, h: r * 2, fill, part };
4806
+ case "dash":
4807
+ return { kind: "rect", x: cx - r, y: cy - r * 0.32, w: r * 2, h: r * 0.64, fill, part };
4808
+ case "diamond":
4809
+ return {
4810
+ kind: "polygon",
4811
+ points: polygonPoints([
4812
+ [cx, cy - r],
4813
+ [cx + r, cy],
4814
+ [cx, cy + r],
4815
+ [cx - r, cy]
4816
+ ]),
4817
+ fill,
4818
+ stroke,
4819
+ strokeWidth: 0,
4820
+ part
4821
+ };
4822
+ case "triangle":
4823
+ return {
4824
+ kind: "polygon",
4825
+ points: polygonPoints([
4826
+ [cx, cy - r],
4827
+ [cx + r * 0.9, cy + r * 0.75],
4828
+ [cx - r * 0.9, cy + r * 0.75]
4829
+ ]),
4830
+ fill,
4831
+ stroke,
4832
+ strokeWidth: 0,
4833
+ part
4834
+ };
4835
+ case "star":
4836
+ return {
4837
+ kind: "polygon",
4838
+ points: polygonPoints(starVertices(cx, cy, r)),
4839
+ fill,
4840
+ stroke,
4841
+ strokeWidth: 0,
4842
+ part
4843
+ };
4844
+ case "plus":
4845
+ return {
4846
+ kind: "path",
4847
+ d: `M${(cx - r).toFixed(2)},${cy.toFixed(2)} L${(cx + r).toFixed(2)},${cy.toFixed(2)} M${cx.toFixed(2)},${(cy - r).toFixed(2)} L${cx.toFixed(2)},${(cy + r).toFixed(2)}`,
4848
+ fill: "none",
4849
+ stroke,
4850
+ strokeWidth: Math.max(1, r * 0.4),
4851
+ part
4852
+ };
4853
+ case "x":
4854
+ return {
4855
+ kind: "path",
4856
+ d: `M${(cx - r).toFixed(2)},${(cy - r).toFixed(2)} L${(cx + r).toFixed(2)},${(cy + r).toFixed(2)} M${(cx + r).toFixed(2)},${(cy - r).toFixed(2)} L${(cx - r).toFixed(2)},${(cy + r).toFixed(2)}`,
4857
+ fill: "none",
4858
+ stroke,
4859
+ strokeWidth: Math.max(1, r * 0.4),
4860
+ part
4861
+ };
4862
+ case "dot":
4863
+ return { kind: "circle", cx, cy, r: Math.max(r * 0.6, 1), fill, part };
4864
+ default:
4865
+ return { kind: "circle", cx, cy, r, fill, part };
4866
+ }
4867
+ }
4868
+ function pushMarker(out, series, cx, cy, fill, defaultRadius2, part, opacity) {
4869
+ const m = buildMarkerPrimitive({
4870
+ symbol: series.marker?.symbol,
4871
+ size: series.marker?.size,
4872
+ cx,
4873
+ cy,
4874
+ fill,
4875
+ defaultRadius: defaultRadius2,
4876
+ part
4877
+ });
4878
+ if (!m) {
4879
+ return;
4880
+ }
4881
+ if (opacity !== void 0) {
4882
+ m.opacity = opacity;
4883
+ }
4884
+ out.push(m);
4885
+ }
4700
4886
  function buildLines(chartData, catCount, layout, primaryRange, secondaryRange, secondaryIdx, sourceIndices2, xPositions) {
4701
4887
  const primitives = [];
4702
4888
  const dataLabels = [];
@@ -4715,24 +4901,36 @@ function buildLines(chartData, catCount, layout, primaryRange, secondaryRange, s
4715
4901
  })
4716
4902
  );
4717
4903
  const c = seriesColor2(series, si, chartData.colorPalette);
4718
- primitives.push({
4719
- kind: "polyline",
4720
- points: linePointsToSvgString(pts),
4721
- stroke: c,
4722
- strokeWidth: 2.4,
4723
- fill: "none",
4724
- part: { role: "series", seriesIndex: si }
4725
- });
4904
+ const seriesPart = { role: "series", seriesIndex: si };
4905
+ primitives.push(
4906
+ series.smooth ? {
4907
+ kind: "path",
4908
+ d: smoothLinePath(pts),
4909
+ stroke: c,
4910
+ strokeWidth: 2.4,
4911
+ fill: "none",
4912
+ part: seriesPart
4913
+ } : {
4914
+ kind: "polyline",
4915
+ points: linePointsToSvgString(pts),
4916
+ stroke: c,
4917
+ strokeWidth: 2.4,
4918
+ fill: "none",
4919
+ part: seriesPart
4920
+ }
4921
+ );
4726
4922
  pts.forEach((pt, displayIndex) => {
4727
- const sourceIndex = sourceIndices2[displayIndex] ?? displayIndex;
4728
- primitives.push({
4729
- kind: "circle",
4730
- cx: pt.x,
4731
- cy: pt.y,
4732
- r: 2.5,
4733
- fill: resolveDataPointFill(series, sourceIndex, c) ?? c,
4734
- part: { role: "dataPoint", seriesIndex: si, pointIndex: sourceIndex }
4735
- });
4923
+ const idx = sourceIndices2[displayIndex] ?? displayIndex;
4924
+ const part = { role: "dataPoint", seriesIndex: si, pointIndex: idx };
4925
+ pushMarker(
4926
+ primitives,
4927
+ series,
4928
+ pt.x,
4929
+ pt.y,
4930
+ resolveDataPointFill(series, idx, c) ?? c,
4931
+ 2.5,
4932
+ part
4933
+ );
4736
4934
  });
4737
4935
  if (showLabels) {
4738
4936
  displayValues.forEach((val2, displayIndex) => {
@@ -4793,19 +4991,17 @@ function buildAreas(chartData, catCount, layout, range, sourceIndices2, xPositio
4793
4991
  part: { role: "series", seriesIndex: si }
4794
4992
  });
4795
4993
  pts.forEach((pt, displayIndex) => {
4796
- const sourceIndex = sourceIndices2[displayIndex] ?? displayIndex;
4797
- primitives.push({
4798
- kind: "circle",
4799
- cx: pt.x,
4800
- cy: pt.y,
4801
- r: 2,
4802
- fill: resolveDataPointFill(series, sourceIndex, c) ?? c,
4803
- part: {
4804
- role: "dataPoint",
4805
- seriesIndex: si,
4806
- pointIndex: sourceIndex
4807
- }
4808
- });
4994
+ const idx = sourceIndices2[displayIndex] ?? displayIndex;
4995
+ const part = { role: "dataPoint", seriesIndex: si, pointIndex: idx };
4996
+ pushMarker(
4997
+ primitives,
4998
+ series,
4999
+ pt.x,
5000
+ pt.y,
5001
+ resolveDataPointFill(series, idx, c) ?? c,
5002
+ 2,
5003
+ part
5004
+ );
4809
5005
  });
4810
5006
  if (showLabels) {
4811
5007
  displayValues.forEach((val2, displayIndex) => {
@@ -4839,15 +5035,17 @@ function buildScatter(chartData, layout, range) {
4839
5035
  const c = seriesColor2(series, si, chartData.colorPalette);
4840
5036
  const dots = computeScatterDots(series.values, maxXIndex, layout, range, xValues);
4841
5037
  dots.forEach((dot, vi) => {
4842
- primitives.push({
4843
- kind: "circle",
4844
- cx: dot.cx,
4845
- cy: dot.cy,
4846
- r: 4,
4847
- fill: resolveDataPointFill(series, vi, c) ?? c,
4848
- opacity: 0.85,
4849
- part: { role: "dataPoint", seriesIndex: si, pointIndex: vi }
4850
- });
5038
+ const part = { role: "dataPoint", seriesIndex: si, pointIndex: vi };
5039
+ pushMarker(
5040
+ primitives,
5041
+ series,
5042
+ dot.cx,
5043
+ dot.cy,
5044
+ resolveDataPointFill(series, vi, c) ?? c,
5045
+ 4,
5046
+ part,
5047
+ 0.85
5048
+ );
4851
5049
  });
4852
5050
  if (showLabels) {
4853
5051
  series.values.forEach((val2, vi) => {
@@ -4916,7 +5114,124 @@ function buildBubbles(chartData, layout, range) {
4916
5114
  }
4917
5115
  return { primitives, dataLabels };
4918
5116
  }
4919
- function categoryX(displayIndex, count, layout, spacing) {
5117
+ function categoryX(index, catCount, layout, options) {
5118
+ const explicit = options.xPositions?.[index];
5119
+ if (explicit !== void 0) {
5120
+ return explicit;
5121
+ }
5122
+ if (options.mode === "bar") {
5123
+ const slot = layout.plotWidth / Math.max(catCount, 1);
5124
+ return layout.plotLeft + slot * index + slot / 2;
5125
+ }
5126
+ const maxIdx = Math.max(catCount - 1, 1);
5127
+ return layout.plotLeft + index / maxIdx * layout.plotWidth;
5128
+ }
5129
+ function dashFor(dashStyle) {
5130
+ if (!dashStyle || dashStyle === "solid") {
5131
+ return void 0;
5132
+ }
5133
+ return dashStyle === "dot" || dashStyle === "sysDot" ? "1 2" : "4 3";
5134
+ }
5135
+ function computeDropLinePrimitives(chartData, layout, range, catCount, options) {
5136
+ const style = chartData.dropLines;
5137
+ if (!style) {
5138
+ return [];
5139
+ }
5140
+ const baselineY = valueToY2(range.min, range, layout.plotTop, layout.plotBottom);
5141
+ const dashArray2 = dashFor(style.dashStyle);
5142
+ const out = [];
5143
+ for (const series of chartData.series) {
5144
+ series.values.forEach((val2, vi) => {
5145
+ const x = categoryX(vi, catCount, layout, options);
5146
+ out.push({
5147
+ kind: "line",
5148
+ x1: x,
5149
+ y1: valueToY2(val2, range, layout.plotTop, layout.plotBottom),
5150
+ x2: x,
5151
+ y2: baselineY,
5152
+ stroke: style.color ?? "#94a3b8",
5153
+ strokeWidth: style.width ?? 0.8,
5154
+ dashArray: dashArray2
5155
+ });
5156
+ });
5157
+ }
5158
+ return out;
5159
+ }
5160
+ function computeHiLowLinePrimitives(chartData, layout, range, catCount, options) {
5161
+ const style = chartData.hiLowLines;
5162
+ if (!style || chartData.series.length < 2) {
5163
+ return [];
5164
+ }
5165
+ const dashArray2 = dashFor(style.dashStyle);
5166
+ const out = [];
5167
+ for (let vi = 0; vi < catCount; vi++) {
5168
+ let high = Number.NEGATIVE_INFINITY;
5169
+ let low = Number.POSITIVE_INFINITY;
5170
+ for (const series of chartData.series) {
5171
+ const v = series.values[vi];
5172
+ if (v !== void 0) {
5173
+ high = Math.max(high, v);
5174
+ low = Math.min(low, v);
5175
+ }
5176
+ }
5177
+ if (!Number.isFinite(high) || !Number.isFinite(low)) {
5178
+ continue;
5179
+ }
5180
+ const x = categoryX(vi, catCount, layout, options);
5181
+ out.push({
5182
+ kind: "line",
5183
+ x1: x,
5184
+ y1: valueToY2(high, range, layout.plotTop, layout.plotBottom),
5185
+ x2: x,
5186
+ y2: valueToY2(low, range, layout.plotTop, layout.plotBottom),
5187
+ stroke: style.color ?? "#334155",
5188
+ strokeWidth: style.width ?? 1,
5189
+ dashArray: dashArray2
5190
+ });
5191
+ }
5192
+ return out;
5193
+ }
5194
+ function computeUpDownBarPrimitives(chartData, layout, range, catCount, options) {
5195
+ const bars = chartData.upDownBars;
5196
+ if (!bars || chartData.series.length < 2) {
5197
+ return [];
5198
+ }
5199
+ const first = chartData.series[0];
5200
+ const last = chartData.series[chartData.series.length - 1];
5201
+ const slot = layout.plotWidth / Math.max(catCount, 1);
5202
+ const gapWidth = bars.gapWidth ?? 150;
5203
+ const barW = Math.max(slot / (1 + Math.max(gapWidth, 0) / 100), 1);
5204
+ const upFill = bars.upBars?.fillColor ?? "#e2e8f0";
5205
+ const downFill = bars.downBars?.fillColor ?? "#334155";
5206
+ const out = [];
5207
+ for (let vi = 0; vi < catCount; vi++) {
5208
+ const firstVal = first.values[vi];
5209
+ const lastVal = last.values[vi];
5210
+ if (firstVal === void 0 || lastVal === void 0) {
5211
+ continue;
5212
+ }
5213
+ const firstY = valueToY2(firstVal, range, layout.plotTop, layout.plotBottom);
5214
+ const lastY = valueToY2(lastVal, range, layout.plotTop, layout.plotBottom);
5215
+ const x = categoryX(vi, catCount, layout, options) - barW / 2;
5216
+ out.push({
5217
+ kind: "rect",
5218
+ x,
5219
+ y: Math.min(firstY, lastY),
5220
+ w: barW,
5221
+ h: Math.max(Math.abs(firstY - lastY), 1),
5222
+ fill: lastVal >= firstVal ? upFill : downFill
5223
+ });
5224
+ }
5225
+ return out;
5226
+ }
5227
+ function computeHelperLinePrimitives(chartData, layout, range, catCount, options) {
5228
+ return [
5229
+ ...computeUpDownBarPrimitives(chartData, layout, range, catCount, options),
5230
+ ...computeDropLinePrimitives(chartData, layout, range, catCount, options),
5231
+ ...computeHiLowLinePrimitives(chartData, layout, range, catCount, options)
5232
+ ];
5233
+ }
5234
+ function categoryX2(displayIndex, count, layout, spacing) {
4920
5235
  if (spacing === "bar") {
4921
5236
  return layout.plotLeft + layout.plotWidth / Math.max(count, 1) * (displayIndex + 0.5);
4922
5237
  }
@@ -4947,8 +5262,8 @@ function buildMultiLevelCategoryLabels(categoryLabels, categoryLevels, sourceInd
4947
5262
  if (!group.text || group.start % skip !== 0) {
4948
5263
  return [];
4949
5264
  }
4950
- const startX = categoryX(group.start, sourceIndices2.length, layout, spacing);
4951
- const endX = categoryX(group.end, sourceIndices2.length, layout, spacing);
5265
+ const startX = categoryX2(group.start, sourceIndices2.length, layout, spacing);
5266
+ const endX = categoryX2(group.end, sourceIndices2.length, layout, spacing);
4952
5267
  return [
4953
5268
  {
4954
5269
  kind: "text",
@@ -5003,13 +5318,13 @@ function buildTickMarks(axis, sourceCount, layout, spacing, axisY) {
5003
5318
  }
5004
5319
  const majorSkip = Math.max(1, axis.tickMarkSkip ?? 1);
5005
5320
  for (let displayIndex = 0; displayIndex < sourceCount; displayIndex += majorSkip) {
5006
- const x = categoryX(displayIndex, sourceCount, layout, spacing);
5321
+ const x = categoryX2(displayIndex, sourceCount, layout, spacing);
5007
5322
  const major = tickLine(x, y, axis.majorTickMark, topAxis, 4, axis);
5008
5323
  if (major) {
5009
5324
  result.push(major);
5010
5325
  }
5011
5326
  if (axis.minorTickMark !== void 0 && displayIndex + majorSkip < sourceCount) {
5012
- const nextX = categoryX(displayIndex + majorSkip, sourceCount, layout, spacing);
5327
+ const nextX = categoryX2(displayIndex + majorSkip, sourceCount, layout, spacing);
5013
5328
  const minor = tickLine((x + nextX) / 2, y, axis.minorTickMark, topAxis, 2.5, axis);
5014
5329
  if (minor) {
5015
5330
  result.push(minor);
@@ -5287,7 +5602,7 @@ function buildCartesianHorizontalAxis(chartData, categoryLabels, layout, kind, p
5287
5602
  catAxisStyle,
5288
5603
  sourceIndices: sourceIndices2,
5289
5604
  xPositions: datePlan?.xPositions ?? categoryPlan?.sourceIndices.map(
5290
- (_sourceIndex, displayIndex) => categoryX(displayIndex, categoryPlan.sourceIndices.length, layout, catAxisStyle)
5605
+ (_sourceIndex, displayIndex) => categoryX2(displayIndex, categoryPlan.sourceIndices.length, layout, catAxisStyle)
5291
5606
  ),
5292
5607
  labels: [
5293
5608
  ...datePlan?.labels ?? categoryPlan?.labels ?? buildCategoryLabels(categoryLabels, layout, catAxisStyle),
@@ -5302,7 +5617,7 @@ function buildCartesianHorizontalAxis(chartData, categoryLabels, layout, kind, p
5302
5617
  }
5303
5618
  var DEFAULT_COLOR3 = "#334155";
5304
5619
  var CAP_HALF_WIDTH = 4;
5305
- function categoryX2(value, count, layout, mode) {
5620
+ function categoryX3(value, count, layout, mode) {
5306
5621
  if (mode === "bar") {
5307
5622
  const slot = layout.plotWidth / Math.max(count, 1);
5308
5623
  return layout.plotLeft + slot * value + slot / 2;
@@ -5409,7 +5724,7 @@ function computeErrorBarPrimitives(chartData, catCount, layout, range, mode = "l
5409
5724
  const categoryMapper = (value) => positionedCategoryX(
5410
5725
  value,
5411
5726
  options.xPositions,
5412
- (index) => categoryX2(index, indexes.length || catCount, layout, seriesMode)
5727
+ (index) => categoryX3(index, indexes.length || catCount, layout, seriesMode)
5413
5728
  );
5414
5729
  const toPixel = xValues.numeric ? (value) => numericX(value, xRange, layout) : categoryMapper;
5415
5730
  const x = toPixel(baseXValue);
@@ -5983,7 +6298,15 @@ function buildCartesianViewModel(element, chartData, categoryLabels, kind) {
5983
6298
  } else {
5984
6299
  plot = buildBubbles(chartData, layout, primaryRange);
5985
6300
  }
5986
- const primitives = [...plot.primitives, ...horizontalAxis.tickMarks];
6301
+ const helperLines = kind === "line" || kind === "area" ? computeHelperLinePrimitives(chartData, layout, primaryRange, catCount, {
6302
+ mode: "line",
6303
+ xPositions: horizontalAxis.xPositions
6304
+ }) : [];
6305
+ const primitives = [
6306
+ ...helperLines,
6307
+ ...plot.primitives,
6308
+ ...horizontalAxis.tickMarks
6309
+ ];
5987
6310
  const overlays = [
5988
6311
  ...computeTrendlinePrimitives(
5989
6312
  displayChartData,
@@ -6109,6 +6432,10 @@ function buildComboViewModel(element, chartData, categoryLabels) {
6109
6432
  );
6110
6433
  const primitives = [];
6111
6434
  const dataLabels = [];
6435
+ const helperOpts = { mode: "line", xPositions: horizontalAxis.xPositions };
6436
+ primitives.push(
6437
+ ...computeHelperLinePrimitives(chartData, layout, primaryRange, catCount, helperOpts)
6438
+ );
6112
6439
  const barSeries = chartData.series.slice(0, 1);
6113
6440
  if (barSeries[0]) {
6114
6441
  const barRange = rangeForSeries(0, primaryRange, secondaryRange, secondaryIndexes);
@@ -8516,16 +8843,30 @@ function computePieLayout(elementWidth, elementHeight, chartData, isDoughnut) {
8516
8843
  const cx = size / 2;
8517
8844
  const cy = titleOffset + (size - titleOffset - legendOffset) / 2;
8518
8845
  const outerR = Math.max((size - titleOffset - legendOffset) * 0.42, 0);
8519
- const innerR = isDoughnut ? outerR * 0.55 : 0;
8846
+ const holeRatio = isDoughnut && chartData.doughnutHoleSize !== void 0 ? Math.min(Math.max(chartData.doughnutHoleSize, 10), 90) / 100 : 0.55;
8847
+ const innerR = isDoughnut ? outerR * holeRatio : 0;
8520
8848
  return { cx, cy, outerR, innerR, size };
8521
8849
  }
8522
- function computePieSlices(values, cx, cy, outerR, innerR) {
8850
+ function computePieSlices(values, cx, cy, outerR, innerR, options) {
8523
8851
  const total = values.reduce((s, v) => s + Math.abs(v), 0) || 1;
8524
- let cumAngle = -Math.PI / 2;
8525
- return values.map((val2) => {
8852
+ let cumAngle = options?.startAngle ?? -Math.PI / 2;
8853
+ return values.map((val2, i) => {
8526
8854
  const sliceAngle = Math.abs(val2) / total * Math.PI * 2;
8527
8855
  const startAngle = cumAngle;
8528
8856
  cumAngle += sliceAngle;
8857
+ const explosion = options?.explosions?.[i] ?? 0;
8858
+ if (explosion > 0) {
8859
+ const mid = (startAngle + cumAngle) / 2;
8860
+ const offset = outerR * (explosion / 100);
8861
+ return computePieSlicePath(
8862
+ cx + Math.cos(mid) * offset,
8863
+ cy + Math.sin(mid) * offset,
8864
+ outerR,
8865
+ innerR,
8866
+ startAngle,
8867
+ cumAngle
8868
+ );
8869
+ }
8529
8870
  return computePieSlicePath(cx, cy, outerR, innerR, startAngle, cumAngle);
8530
8871
  });
8531
8872
  }
@@ -8720,7 +9061,9 @@ function buildPieViewModel(element, chartData, categoryLabels, isDoughnut) {
8720
9061
  const svgHeight = Math.max(size, 60);
8721
9062
  const pieSeries = chartData.series[0];
8722
9063
  const values = pieSeries?.values ?? [];
8723
- const slices = computePieSlices(values, cx, cy, outerR, innerR);
9064
+ const startAngle = -Math.PI / 2 + (chartData.firstSliceAngle ?? 0) * Math.PI / 180;
9065
+ const explosions = pieSeries ? values.map((_v, i) => resolveDataPointExplosion(pieSeries, i)) : void 0;
9066
+ const slices = computePieSlices(values, cx, cy, outerR, innerR, { startAngle, explosions });
8724
9067
  const primitives = slices.map(
8725
9068
  ({ d }, i) => ({
8726
9069
  kind: "path",
@@ -9865,6 +10208,29 @@ function getAnimationInitialStyle(preset, nativeAnimation) {
9865
10208
  }
9866
10209
  return {};
9867
10210
  }
10211
+ function cssEasingForAnimation(anim) {
10212
+ const hasAccel = anim.accel !== void 0 && anim.accel > 0;
10213
+ const hasDecel = anim.decel !== void 0 && anim.decel > 0;
10214
+ if (hasAccel && hasDecel) {
10215
+ return "ease-in-out";
10216
+ }
10217
+ if (hasAccel) {
10218
+ return "ease-in";
10219
+ }
10220
+ if (hasDecel) {
10221
+ return "ease-out";
10222
+ }
10223
+ return "ease";
10224
+ }
10225
+ function fallbackEffectForClass(presetClass) {
10226
+ if (presetClass === "entr") {
10227
+ return "fadeIn";
10228
+ }
10229
+ if (presetClass === "exit") {
10230
+ return "fadeOut";
10231
+ }
10232
+ return void 0;
10233
+ }
9868
10234
  function buildTimeline(nativeAnimations) {
9869
10235
  if (nativeAnimations.length === 0) {
9870
10236
  return {
@@ -9899,10 +10265,13 @@ function buildTimeline(nativeAnimations) {
9899
10265
  for (const anim of regularAnims) {
9900
10266
  const expandedSteps = expandIterateAnimation(anim);
9901
10267
  for (const singleAnim of expandedSteps) {
9902
- const effect = resolveEffect(singleAnim);
10268
+ let effect = resolveEffect(singleAnim);
9903
10269
  const dynamic = effect ? void 0 : buildDynamicKeyframe(singleAnim, dynamicUid++);
9904
10270
  if (!effect && !dynamic) {
9905
- continue;
10271
+ effect = fallbackEffectForClass(singleAnim.presetClass);
10272
+ if (!effect) {
10273
+ continue;
10274
+ }
9906
10275
  }
9907
10276
  const keyframe = effect ? cssKeyframeName(effect) : dynamic.keyframeName;
9908
10277
  if (effect) {
@@ -9948,7 +10317,8 @@ function buildTimeline(nativeAnimations) {
9948
10317
  delayMs = animDelay + triggerDelay;
9949
10318
  }
9950
10319
  const iterStr = iterCount === Infinity ? "infinite" : String(iterCount);
9951
- const cssAnimation = `${keyframe} ${duration}ms ease ${delayMs}ms ${iterStr} ${direction} ${fill}`;
10320
+ const easing = cssEasingForAnimation(singleAnim);
10321
+ const cssAnimation = `${keyframe} ${duration}ms ${easing} ${delayMs}ms ${iterStr} ${direction} ${fill}`;
9952
10322
  currentGroup.push({
9953
10323
  elementId,
9954
10324
  cssAnimation,
@@ -10031,10 +10401,13 @@ function buildSequenceGroups(animsByKey, entranceIds, neededKeyframes, dynamicBl
10031
10401
  const seqGroups = [];
10032
10402
  let seqGroup = [];
10033
10403
  for (const anim of anims) {
10034
- const effect = resolveEffect(anim);
10404
+ let effect = resolveEffect(anim);
10035
10405
  const dynamic = effect ? void 0 : buildDynamicKeyframe(anim, dynamicUid++);
10036
10406
  if (!effect && !dynamic) {
10037
- continue;
10407
+ effect = fallbackEffectForClass(anim.presetClass);
10408
+ if (!effect) {
10409
+ continue;
10410
+ }
10038
10411
  }
10039
10412
  const keyframe = effect ? cssKeyframeName(effect) : dynamic.keyframeName;
10040
10413
  if (effect) {
@@ -10071,7 +10444,8 @@ function buildSequenceGroups(animsByKey, entranceIds, neededKeyframes, dynamicBl
10071
10444
  delayMs = animDelay + triggerDelay;
10072
10445
  }
10073
10446
  const iterStr = iterCount === Infinity ? "infinite" : String(iterCount);
10074
- const cssAnimation = `${keyframe} ${duration}ms ease ${delayMs}ms ${iterStr} ${direction} ${fill}`;
10447
+ const easing = cssEasingForAnimation(anim);
10448
+ const cssAnimation = `${keyframe} ${duration}ms ${easing} ${delayMs}ms ${iterStr} ${direction} ${fill}`;
10075
10449
  seqGroup.push({
10076
10450
  elementId,
10077
10451
  cssAnimation,
@@ -12207,7 +12581,7 @@ function rotateDelta(dx, dy, rotationDeg) {
12207
12581
  }
12208
12582
  function applyResize(box, handle, dxScreen, dyScreen, zoom, opts = {}) {
12209
12583
  const scale = zoom || 1;
12210
- const minSize = opts.minSize ?? chunkFWF2SP6N_js.MIN_ELEMENT_SIZE;
12584
+ const minSize = opts.minSize ?? chunkIPYAN574_js.MIN_ELEMENT_SIZE;
12211
12585
  const rotation = rotationOf(box);
12212
12586
  const local = rotateDelta(dxScreen / scale, dyScreen / scale, rotation);
12213
12587
  const dx = local.x;
@@ -12234,7 +12608,7 @@ function applyResize(box, handle, dxScreen, dyScreen, zoom, opts = {}) {
12234
12608
  }
12235
12609
  return { x: newX, y: newY, width: newW, height: newH, rotation };
12236
12610
  }
12237
- function snapBoxToGrid(box, handle, gridSpacingPx, minSize = chunkFWF2SP6N_js.MIN_ELEMENT_SIZE) {
12611
+ function snapBoxToGrid(box, handle, gridSpacingPx, minSize = chunkIPYAN574_js.MIN_ELEMENT_SIZE) {
12238
12612
  if (handle === null || gridSpacingPx <= 0) {
12239
12613
  return box;
12240
12614
  }
@@ -12264,7 +12638,7 @@ function snapBoxToGrid(box, handle, gridSpacingPx, minSize = chunkFWF2SP6N_js.MI
12264
12638
  }
12265
12639
  return { x, y, width, height };
12266
12640
  }
12267
- function computeMarqueeHitIds(marquee, elements, minSize = chunkFWF2SP6N_js.MIN_ELEMENT_SIZE) {
12641
+ function computeMarqueeHitIds(marquee, elements, minSize = chunkIPYAN574_js.MIN_ELEMENT_SIZE) {
12268
12642
  const minX = Math.min(marquee.startX, marquee.currentX);
12269
12643
  const minY = Math.min(marquee.startY, marquee.currentY);
12270
12644
  const maxX = Math.max(marquee.startX, marquee.currentX);
@@ -13819,7 +14193,7 @@ var THEME_COLOR_LABELS = {
13819
14193
  };
13820
14194
  function buildThemeColorGrid(colorScheme) {
13821
14195
  return THEME_COLOR_TINT_ROWS.map(
13822
- (row) => chunkFWF2SP6N_js.THEME_COLOR_SCHEME_KEYS.map((key) => ({
14196
+ (row) => chunkIPYAN574_js.THEME_COLOR_SCHEME_KEYS.map((key) => ({
13823
14197
  hex: row.transform(colorScheme[key]),
13824
14198
  schemeKey: key,
13825
14199
  rowLabel: row.label,
@@ -14147,6 +14521,23 @@ function getConnectionSites(width, height) {
14147
14521
  // left center
14148
14522
  ];
14149
14523
  }
14524
+ function getShapeConnectionSites(shape) {
14525
+ const geo = shape;
14526
+ const cxn = geo.customGeometryConnectionSites;
14527
+ if (!cxn || cxn.length === 0) {
14528
+ return getConnectionSites(shape.width, shape.height);
14529
+ }
14530
+ const pathW = geo.pathWidth && geo.pathWidth > 0 ? geo.pathWidth : shape.width;
14531
+ const pathH = geo.pathHeight && geo.pathHeight > 0 ? geo.pathHeight : shape.height;
14532
+ const vars = chunkIPYAN574_js.createBuiltinVariables({ w: pathW, h: pathH });
14533
+ const scaleX = pathW > 0 ? shape.width / pathW : 1;
14534
+ const scaleY = pathH > 0 ? shape.height / pathH : 1;
14535
+ return cxn.map((site, index) => ({
14536
+ x: chunkIPYAN574_js.resolveCoordinate(site.posX, vars) * scaleX,
14537
+ y: chunkIPYAN574_js.resolveCoordinate(site.posY, vars) * scaleY,
14538
+ index
14539
+ }));
14540
+ }
14150
14541
  function rerouteConnectorsForMovedElements(elements, movedElementIds) {
14151
14542
  if (movedElementIds.size === 0) {
14152
14543
  return [];
@@ -14190,7 +14581,7 @@ function computeConnectorGeometry(connector, startConn, endConn, elementMap) {
14190
14581
  if (!startShape) {
14191
14582
  return null;
14192
14583
  }
14193
- const sites = getConnectionSites(startShape.width, startShape.height);
14584
+ const sites = getShapeConnectionSites(startShape);
14194
14585
  const siteIndex = startConn.connectionSiteIndex ?? 0;
14195
14586
  const site = sites[siteIndex] ?? sites[0];
14196
14587
  sx = startShape.x + site.x;
@@ -14206,7 +14597,7 @@ function computeConnectorGeometry(connector, startConn, endConn, elementMap) {
14206
14597
  if (!endShape) {
14207
14598
  return null;
14208
14599
  }
14209
- const sites = getConnectionSites(endShape.width, endShape.height);
14600
+ const sites = getShapeConnectionSites(endShape);
14210
14601
  const siteIndex = endConn.connectionSiteIndex ?? 0;
14211
14602
  const site = sites[siteIndex] ?? sites[0];
14212
14603
  ex = endShape.x + site.x;
@@ -14215,12 +14606,16 @@ function computeConnectorGeometry(connector, startConn, endConn, elementMap) {
14215
14606
  ex = connector.x + connector.width;
14216
14607
  ey = connector.y + connector.height;
14217
14608
  }
14609
+ const flipHorizontal = ex < sx;
14610
+ const flipVertical = ey < sy;
14218
14611
  return {
14219
14612
  id: connector.id,
14220
14613
  x: Math.min(sx, ex),
14221
14614
  y: Math.min(sy, ey),
14222
14615
  width: Math.abs(ex - sx) || 1,
14223
- height: Math.abs(ey - sy) || 1
14616
+ height: Math.abs(ey - sy) || 1,
14617
+ flipHorizontal,
14618
+ flipVertical
14224
14619
  };
14225
14620
  }
14226
14621
  function applyReroutedConnectors(elements, rerouted) {
@@ -14236,13 +14631,20 @@ function applyReroutedConnectors(elements, rerouted) {
14236
14631
  if (!update) {
14237
14632
  return el;
14238
14633
  }
14239
- return {
14634
+ const next = {
14240
14635
  ...el,
14241
14636
  x: update.x,
14242
14637
  y: update.y,
14243
14638
  width: update.width,
14244
14639
  height: update.height
14245
14640
  };
14641
+ if (update.flipHorizontal !== void 0) {
14642
+ next.flipHorizontal = update.flipHorizontal;
14643
+ }
14644
+ if (update.flipVertical !== void 0) {
14645
+ next.flipVertical = update.flipVertical;
14646
+ }
14647
+ return next;
14246
14648
  });
14247
14649
  }
14248
14650
  function getCompoundLineOffsets(compoundLine, strokeWidth) {
@@ -14295,7 +14697,7 @@ function svgLineCap(lineCap) {
14295
14697
  }
14296
14698
  function copyFormatFromElement(element) {
14297
14699
  const result = {};
14298
- if (chunkFWF2SP6N_js.hasShapeProperties(element) && element.shapeStyle) {
14700
+ if (chunkIPYAN574_js.hasShapeProperties(element) && element.shapeStyle) {
14299
14701
  const s = element.shapeStyle;
14300
14702
  result.shapeStyle = {
14301
14703
  fillColor: s.fillColor,
@@ -14324,7 +14726,7 @@ function copyFormatFromElement(element) {
14324
14726
  softEdgeRadius: s.softEdgeRadius
14325
14727
  };
14326
14728
  }
14327
- if (chunkFWF2SP6N_js.hasTextProperties(element) && element.textStyle) {
14729
+ if (chunkIPYAN574_js.hasTextProperties(element) && element.textStyle) {
14328
14730
  const t = element.textStyle;
14329
14731
  result.textStyle = {
14330
14732
  fontFamily: t.fontFamily,
@@ -14355,7 +14757,7 @@ function definedEntries(obj) {
14355
14757
  }
14356
14758
  function applyFormatToElement(element, format) {
14357
14759
  let updated = { ...element };
14358
- if (format.shapeStyle && chunkFWF2SP6N_js.hasShapeProperties(updated)) {
14760
+ if (format.shapeStyle && chunkIPYAN574_js.hasShapeProperties(updated)) {
14359
14761
  updated = {
14360
14762
  ...updated,
14361
14763
  shapeStyle: {
@@ -14364,7 +14766,7 @@ function applyFormatToElement(element, format) {
14364
14766
  }
14365
14767
  };
14366
14768
  }
14367
- if (format.textStyle && chunkFWF2SP6N_js.hasTextProperties(updated)) {
14769
+ if (format.textStyle && chunkIPYAN574_js.hasTextProperties(updated)) {
14368
14770
  updated = {
14369
14771
  ...updated,
14370
14772
  textStyle: {
@@ -14379,7 +14781,7 @@ function hasCopyableFormat(element) {
14379
14781
  if (!element) {
14380
14782
  return false;
14381
14783
  }
14382
- return chunkFWF2SP6N_js.hasShapeProperties(element) || chunkFWF2SP6N_js.hasTextProperties(element);
14784
+ return chunkIPYAN574_js.hasShapeProperties(element) || chunkIPYAN574_js.hasTextProperties(element);
14383
14785
  }
14384
14786
  function copySegmentMetadata(from, to) {
14385
14787
  if (from.equationXml !== void 0) {
@@ -14516,7 +14918,7 @@ function getRoundRectRadiusPx(element) {
14516
14918
  return Math.min(Math.max(element.width, 1), Math.max(element.height, 1)) * 0.5 * normalizedAdjustment;
14517
14919
  }
14518
14920
  function getShapeAdjustmentHandleDescriptor(element) {
14519
- if (!chunkFWF2SP6N_js.hasShapeProperties(element)) {
14921
+ if (!chunkIPYAN574_js.hasShapeProperties(element)) {
14520
14922
  return null;
14521
14923
  }
14522
14924
  const normalizedShapeType = String(element.shapeType || "").toLowerCase();
@@ -15508,7 +15910,7 @@ function createSyncGate(onOpen, graceMs = INITIAL_SYNC_GRACE_MS) {
15508
15910
  var POSITION_THRESHOLD = 2;
15509
15911
  var SIZE_THRESHOLD = 2;
15510
15912
  function getElementText(element) {
15511
- if (!chunkFWF2SP6N_js.hasTextProperties(element)) {
15913
+ if (!chunkIPYAN574_js.hasTextProperties(element)) {
15512
15914
  return "";
15513
15915
  }
15514
15916
  if (element.textSegments && element.textSegments.length > 0) {
@@ -15776,7 +16178,308 @@ var INSTANT = {
15776
16178
  };
15777
16179
  var DEFAULT_TRANSITION_DURATION_MS = 1e3;
15778
16180
  var EASE = "ease-in-out";
15779
- var SLIDE_TRANSITION_KEYFRAMES = `
16181
+ var P14_TRANSITION_KEYFRAMES = `
16182
+ /* \u2500\u2500 Conveyor (translate X with staggered timing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16183
+ @keyframes pptx-tr-conveyor-in-from-right {
16184
+ from { transform: translateX(100%) rotateY(-30deg); }
16185
+ 60% { transform: translateX(20%) rotateY(-10deg); }
16186
+ to { transform: translateX(0) rotateY(0deg); }
16187
+ }
16188
+ @keyframes pptx-tr-conveyor-out-to-left {
16189
+ from { transform: translateX(0) rotateY(0deg); }
16190
+ 40% { transform: translateX(-20%) rotateY(10deg); }
16191
+ to { transform: translateX(-100%) rotateY(30deg); }
16192
+ }
16193
+ @keyframes pptx-tr-conveyor-in-from-left {
16194
+ from { transform: translateX(-100%) rotateY(30deg); }
16195
+ 60% { transform: translateX(-20%) rotateY(10deg); }
16196
+ to { transform: translateX(0) rotateY(0deg); }
16197
+ }
16198
+ @keyframes pptx-tr-conveyor-out-to-right {
16199
+ from { transform: translateX(0) rotateY(0deg); }
16200
+ 40% { transform: translateX(20%) rotateY(-10deg); }
16201
+ to { transform: translateX(100%) rotateY(-30deg); }
16202
+ }
16203
+
16204
+ /* \u2500\u2500 Doors (clip-path from center split) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16205
+ @keyframes pptx-tr-doors-horz {
16206
+ from { clip-path: inset(0 50%); }
16207
+ to { clip-path: inset(0 0); }
16208
+ }
16209
+ @keyframes pptx-tr-doors-vert {
16210
+ from { clip-path: inset(50% 0); }
16211
+ to { clip-path: inset(0 0); }
16212
+ }
16213
+
16214
+ /* \u2500\u2500 Ferris (rotate elements around center) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16215
+ @keyframes pptx-tr-ferris-in-from-right {
16216
+ from { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }
16217
+ to { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }
16218
+ }
16219
+ @keyframes pptx-tr-ferris-out-to-left {
16220
+ from { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }
16221
+ to { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }
16222
+ }
16223
+ @keyframes pptx-tr-ferris-in-from-left {
16224
+ from { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }
16225
+ to { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }
16226
+ }
16227
+ @keyframes pptx-tr-ferris-out-to-right {
16228
+ from { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }
16229
+ to { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }
16230
+ }
16231
+
16232
+ /* \u2500\u2500 Flash (bright flash opacity burst) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16233
+ @keyframes pptx-tr-flash-white {
16234
+ 0% { opacity: 1; }
16235
+ 30% { opacity: 0; }
16236
+ 50% { opacity: 0; }
16237
+ 100% { opacity: 1; }
16238
+ }
16239
+ @keyframes pptx-tr-flash-in {
16240
+ 0% { opacity: 0; }
16241
+ 50% { opacity: 0; }
16242
+ 70% { opacity: 1; }
16243
+ 100% { opacity: 1; }
16244
+ }
16245
+
16246
+ /* \u2500\u2500 Flythrough (scale + translate Z-axis feel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16247
+ @keyframes pptx-tr-flythrough-in {
16248
+ from { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }
16249
+ to { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }
16250
+ }
16251
+ @keyframes pptx-tr-flythrough-out {
16252
+ from { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }
16253
+ to { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }
16254
+ }
16255
+ @keyframes pptx-tr-flythrough-reverse-in {
16256
+ from { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }
16257
+ to { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }
16258
+ }
16259
+ @keyframes pptx-tr-flythrough-reverse-out {
16260
+ from { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }
16261
+ to { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }
16262
+ }
16263
+
16264
+ /* \u2500\u2500 Gallery (translate with perspective) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16265
+ @keyframes pptx-tr-gallery-in-from-right {
16266
+ from { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }
16267
+ to { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }
16268
+ }
16269
+ @keyframes pptx-tr-gallery-out-to-left {
16270
+ from { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }
16271
+ to { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }
16272
+ }
16273
+ @keyframes pptx-tr-gallery-in-from-left {
16274
+ from { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }
16275
+ to { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }
16276
+ }
16277
+ @keyframes pptx-tr-gallery-out-to-right {
16278
+ from { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }
16279
+ to { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }
16280
+ }
16281
+
16282
+ /* \u2500\u2500 Glitter (particle dissolve effect) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16283
+ @keyframes pptx-tr-glitter-in {
16284
+ from { opacity: 0; filter: brightness(1.5) contrast(1.3) blur(2px); }
16285
+ 60% { opacity: 0.7; filter: brightness(1.2) contrast(1.1) blur(1px); }
16286
+ to { opacity: 1; filter: brightness(1) contrast(1) blur(0); }
16287
+ }
16288
+
16289
+ /* \u2500\u2500 Honeycomb (hexagonal reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16290
+ @keyframes pptx-tr-honeycomb-in {
16291
+ from {
16292
+ clip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%);
16293
+ opacity: 0;
16294
+ }
16295
+ to {
16296
+ clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
16297
+ opacity: 1;
16298
+ }
16299
+ }
16300
+ @keyframes pptx-tr-honeycomb-out {
16301
+ from { opacity: 1; }
16302
+ to { opacity: 0; filter: blur(2px); }
16303
+ }
16304
+
16305
+ /* \u2500\u2500 Pan (large-scale translate) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16306
+ @keyframes pptx-tr-pan-from-right {
16307
+ from { transform: translateX(100%); }
16308
+ to { transform: translateX(0); }
16309
+ }
16310
+ @keyframes pptx-tr-pan-to-left {
16311
+ from { transform: translateX(0); }
16312
+ to { transform: translateX(-100%); }
16313
+ }
16314
+ @keyframes pptx-tr-pan-from-left {
16315
+ from { transform: translateX(-100%); }
16316
+ to { transform: translateX(0); }
16317
+ }
16318
+ @keyframes pptx-tr-pan-to-right {
16319
+ from { transform: translateX(0); }
16320
+ to { transform: translateX(100%); }
16321
+ }
16322
+ @keyframes pptx-tr-pan-from-bottom {
16323
+ from { transform: translateY(100%); }
16324
+ to { transform: translateY(0); }
16325
+ }
16326
+ @keyframes pptx-tr-pan-to-top {
16327
+ from { transform: translateY(0); }
16328
+ to { transform: translateY(-100%); }
16329
+ }
16330
+ @keyframes pptx-tr-pan-from-top {
16331
+ from { transform: translateY(-100%); }
16332
+ to { transform: translateY(0); }
16333
+ }
16334
+ @keyframes pptx-tr-pan-to-bottom {
16335
+ from { transform: translateY(0); }
16336
+ to { transform: translateY(100%); }
16337
+ }
16338
+ `;
16339
+ var P14_TRANSITION_KEYFRAMES_2 = `
16340
+ /* \u2500\u2500 Prism (3D rotation via perspective transform) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16341
+ @keyframes pptx-tr-prism-in-from-right {
16342
+ from { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }
16343
+ to { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }
16344
+ }
16345
+ @keyframes pptx-tr-prism-out-to-left {
16346
+ from { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }
16347
+ to { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }
16348
+ }
16349
+ @keyframes pptx-tr-prism-in-from-left {
16350
+ from { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }
16351
+ to { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }
16352
+ }
16353
+ @keyframes pptx-tr-prism-out-to-right {
16354
+ from { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }
16355
+ to { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }
16356
+ }
16357
+ @keyframes pptx-tr-prism-in-from-bottom {
16358
+ from { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }
16359
+ to { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }
16360
+ }
16361
+ @keyframes pptx-tr-prism-out-to-top {
16362
+ from { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }
16363
+ to { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }
16364
+ }
16365
+ @keyframes pptx-tr-prism-in-from-top {
16366
+ from { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }
16367
+ to { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }
16368
+ }
16369
+ @keyframes pptx-tr-prism-out-to-bottom {
16370
+ from { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }
16371
+ to { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }
16372
+ }
16373
+
16374
+ /* \u2500\u2500 Reveal (slide away reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16375
+ @keyframes pptx-tr-reveal-out-to-right {
16376
+ from { transform: translateX(0); }
16377
+ to { transform: translateX(100%); }
16378
+ }
16379
+ @keyframes pptx-tr-reveal-out-to-left {
16380
+ from { transform: translateX(0); }
16381
+ to { transform: translateX(-100%); }
16382
+ }
16383
+ @keyframes pptx-tr-reveal-in {
16384
+ from { opacity: 0.5; }
16385
+ to { opacity: 1; }
16386
+ }
16387
+
16388
+ /* \u2500\u2500 Ripple (expanding ring clip-path) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16389
+ @keyframes pptx-tr-ripple-in {
16390
+ from { clip-path: circle(0% at 50% 50%); opacity: 0.5; }
16391
+ 30% { clip-path: circle(20% at 50% 50%); opacity: 0.7; }
16392
+ 60% { clip-path: circle(50% at 50% 50%); opacity: 0.9; }
16393
+ to { clip-path: circle(75% at 50% 50%); opacity: 1; }
16394
+ }
16395
+
16396
+ /* \u2500\u2500 Shred (fragmented clip-path pieces) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16397
+ @keyframes pptx-tr-shred-strips-in {
16398
+ from { clip-path: inset(0 100% 0 0); opacity: 0; }
16399
+ 30% { clip-path: inset(0 60% 0 0); opacity: 0.5; }
16400
+ to { clip-path: inset(0); opacity: 1; }
16401
+ }
16402
+ @keyframes pptx-tr-shred-rectangles-in {
16403
+ from { clip-path: inset(50%); opacity: 0; }
16404
+ 40% { clip-path: inset(20%); opacity: 0.6; }
16405
+ to { clip-path: inset(0); opacity: 1; }
16406
+ }
16407
+ @keyframes pptx-tr-shred-out {
16408
+ from { opacity: 1; }
16409
+ to { opacity: 0; filter: blur(2px); }
16410
+ }
16411
+
16412
+ /* \u2500\u2500 Switch (flip/rotate swap) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16413
+ @keyframes pptx-tr-switch-in-from-right {
16414
+ from { transform: perspective(800px) rotateY(-180deg); opacity: 0; }
16415
+ to { transform: perspective(800px) rotateY(0deg); opacity: 1; }
16416
+ }
16417
+ @keyframes pptx-tr-switch-out-to-left {
16418
+ from { transform: perspective(800px) rotateY(0deg); opacity: 1; }
16419
+ to { transform: perspective(800px) rotateY(180deg); opacity: 0; }
16420
+ }
16421
+ @keyframes pptx-tr-switch-in-from-left {
16422
+ from { transform: perspective(800px) rotateY(180deg); opacity: 0; }
16423
+ to { transform: perspective(800px) rotateY(0deg); opacity: 1; }
16424
+ }
16425
+ @keyframes pptx-tr-switch-out-to-right {
16426
+ from { transform: perspective(800px) rotateY(0deg); opacity: 1; }
16427
+ to { transform: perspective(800px) rotateY(-180deg); opacity: 0; }
16428
+ }
16429
+
16430
+ /* \u2500\u2500 Vortex (rotate + scale spiral) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16431
+ @keyframes pptx-tr-vortex-in {
16432
+ from { transform: rotate(720deg) scale(0); opacity: 0; }
16433
+ to { transform: rotate(0deg) scale(1); opacity: 1; }
16434
+ }
16435
+ @keyframes pptx-tr-vortex-out {
16436
+ from { transform: rotate(0deg) scale(1); opacity: 1; }
16437
+ to { transform: rotate(-720deg) scale(0); opacity: 0; }
16438
+ }
16439
+
16440
+ /* \u2500\u2500 Warp (skew distortion) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16441
+ @keyframes pptx-tr-warp-in {
16442
+ from { transform: scale(0.3) skewX(30deg) skewY(15deg); opacity: 0; }
16443
+ 50% { transform: scale(0.8) skewX(-5deg) skewY(-3deg); opacity: 0.7; }
16444
+ to { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; }
16445
+ }
16446
+ @keyframes pptx-tr-warp-out {
16447
+ from { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; }
16448
+ 50% { transform: scale(0.8) skewX(5deg) skewY(3deg); opacity: 0.7; }
16449
+ to { transform: scale(0.3) skewX(-30deg) skewY(-15deg); opacity: 0; }
16450
+ }
16451
+ @keyframes pptx-tr-warp-reverse-in {
16452
+ from { transform: scale(3) skewX(-20deg) skewY(-10deg); opacity: 0; filter: blur(4px); }
16453
+ to { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; filter: blur(0); }
16454
+ }
16455
+ @keyframes pptx-tr-warp-reverse-out {
16456
+ from { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; filter: blur(0); }
16457
+ to { transform: scale(3) skewX(20deg) skewY(10deg); opacity: 0; filter: blur(4px); }
16458
+ }
16459
+
16460
+ /* \u2500\u2500 WheelReverse (reverse wheel rotation) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16461
+ @keyframes pptx-tr-wheel-reverse-in {
16462
+ from { clip-path: circle(0% at 50% 50%); transform: rotate(180deg); }
16463
+ to { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }
16464
+ }
16465
+
16466
+ /* \u2500\u2500 Window (scale from center with border) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
16467
+ @keyframes pptx-tr-window-horz {
16468
+ from { clip-path: inset(0 50%); }
16469
+ to { clip-path: inset(0 0); }
16470
+ }
16471
+ @keyframes pptx-tr-window-vert {
16472
+ from { clip-path: inset(50% 0); }
16473
+ to { clip-path: inset(0 0); }
16474
+ }
16475
+ @keyframes pptx-tr-window-out {
16476
+ from { opacity: 1; transform: scale(1); }
16477
+ to { opacity: 0; transform: scale(0.9); }
16478
+ }
16479
+ `;
16480
+ var P14_TRANSITION_KEYFRAMES_ALL = `${P14_TRANSITION_KEYFRAMES}
16481
+ ${P14_TRANSITION_KEYFRAMES_2}`;
16482
+ var CORE_SLIDE_TRANSITION_KEYFRAMES = `
15780
16483
  /* \u2500\u2500 Fade \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
15781
16484
  @keyframes pptx-tr-fade-in {
15782
16485
  from { opacity: 0; }
@@ -16039,8 +16742,243 @@ var SLIDE_TRANSITION_KEYFRAMES = `
16039
16742
  to { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }
16040
16743
  }
16041
16744
  `;
16745
+ var SLIDE_TRANSITION_KEYFRAMES = `${CORE_SLIDE_TRANSITION_KEYFRAMES}
16746
+ ${P14_TRANSITION_KEYFRAMES_ALL}`;
16747
+ function resolveLR(direction) {
16748
+ if (direction === "l" || direction === "r") {
16749
+ return direction;
16750
+ }
16751
+ return "l";
16752
+ }
16753
+ function resolveP14Orientation(direction, orient) {
16754
+ if (orient === "horz" || orient === "vert") {
16755
+ return orient;
16756
+ }
16757
+ if (direction === "horz" || direction === "vert") {
16758
+ return direction;
16759
+ }
16760
+ return "horz";
16761
+ }
16762
+ function resolveCardinal(direction) {
16763
+ switch (direction) {
16764
+ case "l":
16765
+ return "left";
16766
+ case "r":
16767
+ return "right";
16768
+ case "u":
16769
+ return "up";
16770
+ case "d":
16771
+ return "down";
16772
+ default:
16773
+ return "left";
16774
+ }
16775
+ }
16776
+ function directionalPair(direction, prefix, dur, ease) {
16777
+ const dir = resolveCardinal(direction);
16778
+ const opposites = {
16779
+ left: ["to-left", "from-right"],
16780
+ right: ["to-right", "from-left"],
16781
+ up: ["to-top", "from-bottom"],
16782
+ down: ["to-bottom", "from-top"]
16783
+ };
16784
+ const [outSuffix, inSuffix] = opposites[dir];
16785
+ return {
16786
+ outgoing: `${prefix}-${outSuffix} ${dur} ${ease} forwards`,
16787
+ incoming: `${prefix}-${inSuffix} ${dur} ${ease} forwards`,
16788
+ outgoingOnTop: false
16789
+ };
16790
+ }
16791
+ function cardinalOutInPair(direction, prefix, dur, ease) {
16792
+ const dir = resolveCardinal(direction);
16793
+ const map = {
16794
+ left: ["out-to-left", "in-from-right"],
16795
+ right: ["out-to-right", "in-from-left"],
16796
+ up: ["out-to-top", "in-from-bottom"],
16797
+ down: ["out-to-bottom", "in-from-top"]
16798
+ };
16799
+ const [outSuffix, inSuffix] = map[dir];
16800
+ return {
16801
+ outgoing: `${prefix}-${outSuffix} ${dur} ${ease} forwards`,
16802
+ incoming: `${prefix}-${inSuffix} ${dur} ${ease} forwards`,
16803
+ outgoingOnTop: false
16804
+ };
16805
+ }
16806
+ function getP14TransitionAnimations(type, durationMs, direction, orient) {
16807
+ const dur = `${durationMs}ms`;
16808
+ const ease = EASE;
16809
+ switch (type) {
16810
+ case "conveyor": {
16811
+ const lr = resolveLR(direction);
16812
+ if (lr === "l") {
16813
+ return {
16814
+ outgoing: `pptx-tr-conveyor-out-to-left ${dur} ${ease} forwards`,
16815
+ incoming: `pptx-tr-conveyor-in-from-right ${dur} ${ease} forwards`,
16816
+ outgoingOnTop: false
16817
+ };
16818
+ }
16819
+ return {
16820
+ outgoing: `pptx-tr-conveyor-out-to-right ${dur} ${ease} forwards`,
16821
+ incoming: `pptx-tr-conveyor-in-from-left ${dur} ${ease} forwards`,
16822
+ outgoingOnTop: false
16823
+ };
16824
+ }
16825
+ case "doors": {
16826
+ const o = resolveP14Orientation(direction, orient);
16827
+ return {
16828
+ outgoing: "none",
16829
+ incoming: o === "vert" ? `pptx-tr-doors-vert ${dur} ${ease} forwards` : `pptx-tr-doors-horz ${dur} ${ease} forwards`,
16830
+ outgoingOnTop: false
16831
+ };
16832
+ }
16833
+ case "ferris": {
16834
+ const lr = resolveLR(direction);
16835
+ if (lr === "l") {
16836
+ return {
16837
+ outgoing: `pptx-tr-ferris-out-to-left ${dur} ${ease} forwards`,
16838
+ incoming: `pptx-tr-ferris-in-from-right ${dur} ${ease} forwards`,
16839
+ outgoingOnTop: false
16840
+ };
16841
+ }
16842
+ return {
16843
+ outgoing: `pptx-tr-ferris-out-to-right ${dur} ${ease} forwards`,
16844
+ incoming: `pptx-tr-ferris-in-from-left ${dur} ${ease} forwards`,
16845
+ outgoingOnTop: false
16846
+ };
16847
+ }
16848
+ case "flash":
16849
+ return {
16850
+ outgoing: `pptx-tr-flash-white ${dur} ${ease} forwards`,
16851
+ incoming: `pptx-tr-flash-in ${dur} ${ease} forwards`,
16852
+ outgoingOnTop: true
16853
+ };
16854
+ case "flythrough": {
16855
+ const isOut = direction === "out";
16856
+ if (isOut) {
16857
+ return {
16858
+ outgoing: `pptx-tr-flythrough-reverse-out ${dur} ${ease} forwards`,
16859
+ incoming: `pptx-tr-flythrough-reverse-in ${dur} ${ease} forwards`,
16860
+ outgoingOnTop: true
16861
+ };
16862
+ }
16863
+ return {
16864
+ outgoing: `pptx-tr-flythrough-out ${dur} ${ease} forwards`,
16865
+ incoming: `pptx-tr-flythrough-in ${dur} ${ease} forwards`,
16866
+ outgoingOnTop: true
16867
+ };
16868
+ }
16869
+ case "gallery": {
16870
+ const lr = resolveLR(direction);
16871
+ if (lr === "l") {
16872
+ return {
16873
+ outgoing: `pptx-tr-gallery-out-to-left ${dur} ${ease} forwards`,
16874
+ incoming: `pptx-tr-gallery-in-from-right ${dur} ${ease} forwards`,
16875
+ outgoingOnTop: false
16876
+ };
16877
+ }
16878
+ return {
16879
+ outgoing: `pptx-tr-gallery-out-to-right ${dur} ${ease} forwards`,
16880
+ incoming: `pptx-tr-gallery-in-from-left ${dur} ${ease} forwards`,
16881
+ outgoingOnTop: false
16882
+ };
16883
+ }
16884
+ case "glitter":
16885
+ return {
16886
+ outgoing: `pptx-tr-fade-out ${dur} ${ease} forwards`,
16887
+ incoming: `pptx-tr-glitter-in ${dur} ${ease} forwards`,
16888
+ outgoingOnTop: true
16889
+ };
16890
+ case "honeycomb":
16891
+ return {
16892
+ outgoing: `pptx-tr-honeycomb-out ${dur} ${ease} forwards`,
16893
+ incoming: `pptx-tr-honeycomb-in ${dur} ${ease} forwards`,
16894
+ outgoingOnTop: true
16895
+ };
16896
+ case "pan":
16897
+ return directionalPair(direction, "pptx-tr-pan", dur, ease);
16898
+ case "prism":
16899
+ return cardinalOutInPair(direction, "pptx-tr-prism", dur, ease);
16900
+ case "reveal": {
16901
+ const lr = resolveLR(direction);
16902
+ return {
16903
+ outgoing: lr === "l" ? `pptx-tr-reveal-out-to-left ${dur} ${ease} forwards` : `pptx-tr-reveal-out-to-right ${dur} ${ease} forwards`,
16904
+ incoming: `pptx-tr-reveal-in ${dur} ${ease} forwards`,
16905
+ outgoingOnTop: true
16906
+ };
16907
+ }
16908
+ case "ripple":
16909
+ return {
16910
+ outgoing: "none",
16911
+ incoming: `pptx-tr-ripple-in ${dur} ${ease} forwards`,
16912
+ outgoingOnTop: false
16913
+ };
16914
+ case "shred": {
16915
+ const pattern = direction === "rectangles" ? "rectangles" : "strips";
16916
+ return {
16917
+ outgoing: `pptx-tr-shred-out ${dur} ${ease} forwards`,
16918
+ incoming: pattern === "rectangles" ? `pptx-tr-shred-rectangles-in ${dur} ${ease} forwards` : `pptx-tr-shred-strips-in ${dur} ${ease} forwards`,
16919
+ outgoingOnTop: true
16920
+ };
16921
+ }
16922
+ case "switch": {
16923
+ const lr = resolveLR(direction);
16924
+ if (lr === "l") {
16925
+ return {
16926
+ outgoing: `pptx-tr-switch-out-to-left ${dur} ${ease} forwards`,
16927
+ incoming: `pptx-tr-switch-in-from-right ${dur} ${ease} forwards`,
16928
+ outgoingOnTop: false
16929
+ };
16930
+ }
16931
+ return {
16932
+ outgoing: `pptx-tr-switch-out-to-right ${dur} ${ease} forwards`,
16933
+ incoming: `pptx-tr-switch-in-from-left ${dur} ${ease} forwards`,
16934
+ outgoingOnTop: false
16935
+ };
16936
+ }
16937
+ case "vortex":
16938
+ return {
16939
+ outgoing: `pptx-tr-vortex-out ${dur} ${ease} forwards`,
16940
+ incoming: `pptx-tr-vortex-in ${dur} ${ease} forwards`,
16941
+ outgoingOnTop: true
16942
+ };
16943
+ case "warp": {
16944
+ const isOut = direction === "out";
16945
+ if (isOut) {
16946
+ return {
16947
+ outgoing: `pptx-tr-warp-reverse-out ${dur} ${ease} forwards`,
16948
+ incoming: `pptx-tr-warp-reverse-in ${dur} ${ease} forwards`,
16949
+ outgoingOnTop: true
16950
+ };
16951
+ }
16952
+ return {
16953
+ outgoing: `pptx-tr-warp-out ${dur} ${ease} forwards`,
16954
+ incoming: `pptx-tr-warp-in ${dur} ${ease} forwards`,
16955
+ outgoingOnTop: true
16956
+ };
16957
+ }
16958
+ case "wheelReverse":
16959
+ return {
16960
+ outgoing: "none",
16961
+ incoming: `pptx-tr-wheel-reverse-in ${dur} ${ease} forwards`,
16962
+ outgoingOnTop: false
16963
+ };
16964
+ case "window": {
16965
+ const o = resolveP14Orientation(direction, orient);
16966
+ return {
16967
+ outgoing: `pptx-tr-window-out ${dur} ${ease} forwards`,
16968
+ incoming: o === "vert" ? `pptx-tr-window-vert ${dur} ${ease} forwards` : `pptx-tr-window-horz ${dur} ${ease} forwards`,
16969
+ outgoingOnTop: true
16970
+ };
16971
+ }
16972
+ default:
16973
+ return void 0;
16974
+ }
16975
+ }
16042
16976
  function getSlideTransitionAnimations(type, durationMs, direction, orient, spokes) {
16043
16977
  const dur = `${durationMs}ms`;
16978
+ const p14 = getP14TransitionAnimations(type, durationMs, direction, orient);
16979
+ if (p14) {
16980
+ return p14;
16981
+ }
16044
16982
  switch (type) {
16045
16983
  case "none":
16046
16984
  case "cut":
@@ -16242,31 +17180,13 @@ function getSlideTransitionAnimations(type, durationMs, direction, orient, spoke
16242
17180
  const randomType = RANDOM_ELIGIBLE_TYPES[Math.floor(Math.random() * RANDOM_ELIGIBLE_TYPES.length)];
16243
17181
  return getSlideTransitionAnimations(randomType, durationMs, direction, orient);
16244
17182
  }
16245
- // ── Exotic / 3-D transitions approximated with the closest well-tested
16246
- // 2-D CSS behaviour (delegates to an existing case rather than emitting a
16247
- // plain fade). A faithful per-effect keyframe set is available via
16248
- // `getP14TransitionAnimations`.
16249
- case "pan":
16250
- case "gallery":
16251
- case "conveyor":
16252
- return getSlideTransitionAnimations("push", durationMs, direction, orient);
16253
- case "reveal":
16254
- return getSlideTransitionAnimations("wipe", durationMs, direction, orient);
16255
- case "doors":
16256
- return getSlideTransitionAnimations("split", durationMs, direction, orient);
16257
- case "switch":
16258
- case "flythrough":
16259
- case "ferris":
16260
- case "prism":
16261
- return getSlideTransitionAnimations("zoom", durationMs, direction, orient);
16262
- case "ripple":
16263
- case "honeycomb":
16264
- case "glitter":
16265
- case "shred":
16266
- return getSlideTransitionAnimations("dissolve", durationMs, direction, orient);
16267
- case "flash":
16268
- return getSlideTransitionAnimations("fade", durationMs, direction, orient);
16269
- // Fallback (unknown / not-yet-mapped type) — symmetrical cross-fade.
17183
+ // The exotic / 3-D transition family (conveyor/doors/ferris/flash/
17184
+ // flythrough/gallery/glitter/honeycomb/pan/prism/reveal/ripple/shred/
17185
+ // switch/vortex/warp/wheelReverse/window) is handled faithfully above via
17186
+ // `getP14TransitionAnimations` and never reaches this switch.
17187
+ // Fallback (unknown / not-yet-mapped type, e.g. the p15 cinematic set:
17188
+ // cube/flip/rotate/orbit/fracture/peelOff/pageCurl*/airplane/origami)
17189
+ // — symmetrical cross-fade.
16270
17190
  default:
16271
17191
  return {
16272
17192
  outgoing: `pptx-tr-fade-out ${dur} ${EASE} forwards`,
@@ -16991,30 +17911,46 @@ function computeTargetLayout(nodes, box, palette, style, elementId) {
16991
17911
  family: "target"
16992
17912
  };
16993
17913
  }
16994
- function computeSmartArtLayout(nodes, box, palette, style, elementId, resolvedLayoutType, layout) {
17914
+ function interpolateSmartArtPalette(palette, count, method, hueDirection) {
17915
+ if (count <= 0 || palette.length === 0) {
17916
+ return [];
17917
+ }
17918
+ if (palette.length < 2 || count <= palette.length) {
17919
+ return Array.from({ length: count }, (_, i) => palette[i % palette.length]);
17920
+ }
17921
+ const segments = palette.length - 1;
17922
+ return Array.from({ length: count }, (_, i) => {
17923
+ const pos = i / (count - 1) * segments;
17924
+ const lower = Math.min(Math.floor(pos), segments - 1);
17925
+ const frac = pos - lower;
17926
+ return interpolateColor(palette[lower], palette[lower + 1], frac, "hsl", hueDirection);
17927
+ });
17928
+ }
17929
+ function computeSmartArtLayout(nodes, box, palette, style, elementId, resolvedLayoutType, layout, interpolation) {
16995
17930
  const flat = flattenNodes(nodes);
16996
17931
  const family = resolveLayoutFamily(nodes, resolvedLayoutType, layout);
17932
+ const pal = interpolation?.method === "span" ? interpolateSmartArtPalette(palette, flat.length, "span", interpolation.hueDirection) : palette;
16997
17933
  switch (family) {
16998
17934
  case "list":
16999
- return computeListLayout(flat, box, palette, style, elementId);
17935
+ return computeListLayout(flat, box, pal, style, elementId);
17000
17936
  case "process":
17001
- return computeProcessLayout(flat, box, palette, style, elementId);
17937
+ return computeProcessLayout(flat, box, pal, style, elementId);
17002
17938
  case "cycle":
17003
- return computeCycleLayout(flat, box, palette, style, elementId);
17939
+ return computeCycleLayout(flat, box, pal, style, elementId);
17004
17940
  case "hierarchy":
17005
- return computeHierarchyLayout(nodes, box, palette, style, elementId);
17941
+ return computeHierarchyLayout(nodes, box, pal, style, elementId);
17006
17942
  case "matrix":
17007
- return computeMatrixLayout(flat, box, palette, style, elementId);
17943
+ return computeMatrixLayout(flat, box, pal, style, elementId);
17008
17944
  case "radial":
17009
- return computeRadialLayout(flat, box, palette, style, elementId);
17945
+ return computeRadialLayout(flat, box, pal, style, elementId);
17010
17946
  case "pyramid":
17011
- return computePyramidLayout(flat, box, palette, style, elementId);
17947
+ return computePyramidLayout(flat, box, pal, style, elementId);
17012
17948
  case "venn":
17013
- return computeVennLayout(flat, box, palette, style, elementId);
17949
+ return computeVennLayout(flat, box, pal, style, elementId);
17014
17950
  case "funnel":
17015
- return computeFunnelLayout(flat, box, palette, style, elementId);
17951
+ return computeFunnelLayout(flat, box, pal, style, elementId);
17016
17952
  case "target":
17017
- return computeTargetLayout(flat, box, palette, style, elementId);
17953
+ return computeTargetLayout(flat, box, pal, style, elementId);
17018
17954
  }
17019
17955
  }
17020
17956
  function parseViewBox(viewBox) {
@@ -19082,7 +20018,7 @@ function getAriaRole(element) {
19082
20018
  case "model3d":
19083
20019
  return "img";
19084
20020
  case "shape": {
19085
- if (chunkFWF2SP6N_js.hasTextProperties(element) && element.text) {
20021
+ if (chunkIPYAN574_js.hasTextProperties(element) && element.text) {
19086
20022
  return "group";
19087
20023
  }
19088
20024
  return "img";
@@ -19095,7 +20031,7 @@ function getAriaLabel(element) {
19095
20031
  if ((element.type === "image" || element.type === "picture") && "altText" in element && typeof element.altText === "string" && element.altText.trim()) {
19096
20032
  return element.altText.trim();
19097
20033
  }
19098
- if (chunkFWF2SP6N_js.hasTextProperties(element) && element.text) {
20034
+ if (chunkIPYAN574_js.hasTextProperties(element) && element.text) {
19099
20035
  const text = element.text.trim();
19100
20036
  if (text) {
19101
20037
  return text.length > 120 ? `${text.slice(0, 117)}...` : text;
@@ -19502,7 +20438,7 @@ var DEFAULT_CHART_POSITION = { x: 120, y: 120, width: 480, height: 320 };
19502
20438
  var DEFAULT_CATEGORIES = ["Category 1", "Category 2", "Category 3"];
19503
20439
  var DEFAULT_SERIES_VALUES = [4, 3, 5];
19504
20440
  function createDefaultChartElement(chartType = DEFAULT_INSERT_CHART_TYPE, position) {
19505
- return chunkFWF2SP6N_js.createChartElement(
20441
+ return chunkIPYAN574_js.createChartElement(
19506
20442
  chartType,
19507
20443
  {
19508
20444
  categories: [...DEFAULT_CATEGORIES],
@@ -20522,7 +21458,7 @@ function computeVirtualRange(totalItems, itemHeight, scrollTop, viewportHeight,
20522
21458
  };
20523
21459
  }
20524
21460
  function collectFontsFromElement(element, fonts) {
20525
- if (chunkFWF2SP6N_js.hasTextProperties(element)) {
21461
+ if (chunkIPYAN574_js.hasTextProperties(element)) {
20526
21462
  if (element.textStyle?.fontFamily) {
20527
21463
  fonts.add(element.textStyle.fontFamily);
20528
21464
  }