pptx-react-viewer 1.17.0 → 1.18.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.
Files changed (120) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +1 -1
  3. package/dist/{Model3DScene-YA4F63DT.js → Model3DScene-GVWQ6SOM.js} +3 -3
  4. package/dist/Model3DScene-GVWQ6SOM.js.br +0 -0
  5. package/dist/Model3DScene-GVWQ6SOM.js.gz +0 -0
  6. package/dist/{Model3DScene-QHDYQXL2.mjs → Model3DScene-JGVLIDLD.mjs} +2 -2
  7. package/dist/Model3DScene-JGVLIDLD.mjs.br +0 -0
  8. package/dist/Model3DScene-JGVLIDLD.mjs.gz +0 -0
  9. package/dist/{SurfaceChart3DScene-GUAS2NWQ.mjs → SurfaceChart3DScene-DBWSDSKI.mjs} +2 -2
  10. package/dist/SurfaceChart3DScene-DBWSDSKI.mjs.br +0 -0
  11. package/dist/SurfaceChart3DScene-DBWSDSKI.mjs.gz +0 -0
  12. package/dist/{SurfaceChart3DScene-TGNJHTJQ.js → SurfaceChart3DScene-ZOTOHOIE.js} +3 -3
  13. package/dist/SurfaceChart3DScene-ZOTOHOIE.js.br +0 -0
  14. package/dist/SurfaceChart3DScene-ZOTOHOIE.js.gz +0 -0
  15. package/dist/{chunk-XW5OMXW6.js → chunk-73ST7AC6.js} +2269 -1651
  16. package/dist/chunk-73ST7AC6.js.br +0 -0
  17. package/dist/chunk-73ST7AC6.js.gz +0 -0
  18. package/dist/{chunk-WGLJ32FW.js → chunk-AALZCSY4.js} +8 -1
  19. package/dist/chunk-AALZCSY4.js.br +0 -0
  20. package/dist/chunk-AALZCSY4.js.gz +0 -0
  21. package/dist/{chunk-MGLRKGCH.js → chunk-EXDUEXTO.js} +26101 -15360
  22. package/dist/chunk-EXDUEXTO.js.br +0 -0
  23. package/dist/chunk-EXDUEXTO.js.gz +0 -0
  24. package/dist/{chunk-JWS3RQKN.js → chunk-HBXPK572.js} +584 -144
  25. package/dist/chunk-HBXPK572.js.br +0 -0
  26. package/dist/chunk-HBXPK572.js.gz +0 -0
  27. package/dist/{chunk-G22EWPLH.mjs → chunk-HHTZQHKZ.mjs} +532 -119
  28. package/dist/chunk-HHTZQHKZ.mjs.br +0 -0
  29. package/dist/chunk-HHTZQHKZ.mjs.gz +0 -0
  30. package/dist/{chunk-3P6O7ZDM.js → chunk-JDRC3PSY.js} +655 -491
  31. package/dist/chunk-JDRC3PSY.js.br +0 -0
  32. package/dist/chunk-JDRC3PSY.js.gz +0 -0
  33. package/dist/{chunk-LNSHC2Z5.mjs → chunk-KMLIWCNL.mjs} +1460 -842
  34. package/dist/chunk-KMLIWCNL.mjs.br +0 -0
  35. package/dist/chunk-KMLIWCNL.mjs.gz +0 -0
  36. package/dist/{chunk-HJQZJ3VE.mjs → chunk-RIRK64DM.mjs} +8 -1
  37. package/dist/chunk-RIRK64DM.mjs.br +0 -0
  38. package/dist/chunk-RIRK64DM.mjs.gz +0 -0
  39. package/dist/{chunk-XRYREYXC.mjs → chunk-SBNTEQUA.mjs} +26062 -15360
  40. package/dist/chunk-SBNTEQUA.mjs.br +0 -0
  41. package/dist/chunk-SBNTEQUA.mjs.gz +0 -0
  42. package/dist/{chunk-LLHFNGAF.mjs → chunk-Z4MDCPAY.mjs} +223 -59
  43. package/dist/chunk-Z4MDCPAY.mjs.br +0 -0
  44. package/dist/chunk-Z4MDCPAY.mjs.gz +0 -0
  45. package/dist/{dist-2ZAH7U6U.js → dist-KRRXYUGI.js} +663 -507
  46. package/dist/dist-KRRXYUGI.js.br +0 -0
  47. package/dist/dist-KRRXYUGI.js.gz +0 -0
  48. package/dist/dist-N6PAPXK6.mjs +2 -0
  49. package/dist/dist-N6PAPXK6.mjs.br +0 -0
  50. package/dist/dist-N6PAPXK6.mjs.gz +0 -0
  51. package/dist/hooks-unstable.d.ts +484 -117
  52. package/dist/hooks-unstable.d.ts.map +1 -1
  53. package/dist/hooks-unstable.js +75 -75
  54. package/dist/hooks-unstable.js.br +0 -0
  55. package/dist/hooks-unstable.js.gz +0 -0
  56. package/dist/hooks-unstable.mjs +4 -4
  57. package/dist/hooks-unstable.mjs.br +0 -0
  58. package/dist/hooks-unstable.mjs.gz +0 -0
  59. package/dist/i18n.js +3 -3
  60. package/dist/i18n.js.br +0 -0
  61. package/dist/i18n.js.gz +0 -0
  62. package/dist/i18n.mjs +1 -1
  63. package/dist/i18n.mjs.br +0 -0
  64. package/dist/i18n.mjs.gz +0 -0
  65. package/dist/{index-XGt7MZpa.d.ts → index-DmHVR48M.d.ts} +25 -3
  66. package/dist/index-DmHVR48M.d.ts.map +1 -0
  67. package/dist/index.d.ts +412 -117
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +19 -19
  70. package/dist/index.js.br +3 -1
  71. package/dist/index.js.gz +0 -0
  72. package/dist/index.mjs +5 -5
  73. package/dist/index.mjs.br +3 -4
  74. package/dist/index.mjs.gz +0 -0
  75. package/dist/pptx-viewer.css +1 -1
  76. package/dist/pptx-viewer.css.br +0 -0
  77. package/dist/pptx-viewer.css.gz +0 -0
  78. package/dist/viewer/index.d.ts +438 -121
  79. package/dist/viewer/index.d.ts.map +1 -1
  80. package/dist/viewer/index.js +24 -20
  81. package/dist/viewer/index.js.br +0 -0
  82. package/dist/viewer/index.js.gz +0 -0
  83. package/dist/viewer/index.mjs +5 -5
  84. package/dist/viewer/index.mjs.br +0 -0
  85. package/dist/viewer/index.mjs.gz +0 -0
  86. package/package.json +1 -1
  87. package/dist/Model3DScene-QHDYQXL2.mjs.br +0 -0
  88. package/dist/Model3DScene-QHDYQXL2.mjs.gz +0 -0
  89. package/dist/Model3DScene-YA4F63DT.js.br +0 -0
  90. package/dist/Model3DScene-YA4F63DT.js.gz +0 -0
  91. package/dist/SurfaceChart3DScene-GUAS2NWQ.mjs.br +0 -0
  92. package/dist/SurfaceChart3DScene-GUAS2NWQ.mjs.gz +0 -0
  93. package/dist/SurfaceChart3DScene-TGNJHTJQ.js.br +0 -0
  94. package/dist/SurfaceChart3DScene-TGNJHTJQ.js.gz +0 -0
  95. package/dist/chunk-3P6O7ZDM.js.br +0 -0
  96. package/dist/chunk-3P6O7ZDM.js.gz +0 -0
  97. package/dist/chunk-G22EWPLH.mjs.br +0 -0
  98. package/dist/chunk-G22EWPLH.mjs.gz +0 -0
  99. package/dist/chunk-HJQZJ3VE.mjs.br +0 -0
  100. package/dist/chunk-HJQZJ3VE.mjs.gz +0 -0
  101. package/dist/chunk-JWS3RQKN.js.br +0 -0
  102. package/dist/chunk-JWS3RQKN.js.gz +0 -0
  103. package/dist/chunk-LLHFNGAF.mjs.br +0 -0
  104. package/dist/chunk-LLHFNGAF.mjs.gz +0 -0
  105. package/dist/chunk-LNSHC2Z5.mjs.br +0 -0
  106. package/dist/chunk-LNSHC2Z5.mjs.gz +0 -0
  107. package/dist/chunk-MGLRKGCH.js.br +0 -0
  108. package/dist/chunk-MGLRKGCH.js.gz +0 -0
  109. package/dist/chunk-WGLJ32FW.js.br +0 -0
  110. package/dist/chunk-WGLJ32FW.js.gz +0 -0
  111. package/dist/chunk-XRYREYXC.mjs.br +0 -0
  112. package/dist/chunk-XRYREYXC.mjs.gz +0 -0
  113. package/dist/chunk-XW5OMXW6.js.br +0 -0
  114. package/dist/chunk-XW5OMXW6.js.gz +0 -0
  115. package/dist/dist-2ZAH7U6U.js.br +0 -0
  116. package/dist/dist-2ZAH7U6U.js.gz +0 -0
  117. package/dist/dist-MXDC6YTS.mjs +0 -2
  118. package/dist/dist-MXDC6YTS.mjs.br +0 -0
  119. package/dist/dist-MXDC6YTS.mjs.gz +0 -0
  120. package/dist/index-XGt7MZpa.d.ts.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkMGLRKGCH_js = require('./chunk-MGLRKGCH.js');
3
+ var chunkEXDUEXTO_js = require('./chunk-EXDUEXTO.js');
4
4
  var DOMPurify = require('dompurify');
5
5
 
6
6
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -222,7 +222,7 @@ function buildInitialGuides(presentationGuides, firstSlideGuides) {
222
222
  guides.push({
223
223
  id: g.id,
224
224
  axis: g.orientation === "horz" ? "h" : "v",
225
- position: chunkMGLRKGCH_js.guideEmuToPx(g.positionEmu)
225
+ position: chunkEXDUEXTO_js.guideEmuToPx(g.positionEmu)
226
226
  });
227
227
  }
228
228
  }
@@ -231,7 +231,7 @@ function buildInitialGuides(presentationGuides, firstSlideGuides) {
231
231
  guides.push({
232
232
  id: g.id,
233
233
  axis: g.orientation === "horz" ? "h" : "v",
234
- position: chunkMGLRKGCH_js.guideEmuToPx(g.positionEmu)
234
+ position: chunkEXDUEXTO_js.guideEmuToPx(g.positionEmu)
235
235
  });
236
236
  }
237
237
  }
@@ -244,23 +244,23 @@ function getResolvedShapeClipPathFor(shapeType, width, height, adjustments) {
244
244
  return void 0;
245
245
  }
246
246
  if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {
247
- return chunkMGLRKGCH_js.getShapeClipPath(shapeType);
247
+ return chunkEXDUEXTO_js.getShapeClipPath(shapeType);
248
248
  }
249
249
  if (adjustments && Object.keys(adjustments).length > 0) {
250
- const adjusted = chunkMGLRKGCH_js.getAdjustmentAwareShapeClipPath(shapeType, width, height, adjustments);
250
+ const adjusted = chunkEXDUEXTO_js.getAdjustmentAwareShapeClipPath(shapeType, width, height, adjustments);
251
251
  if (adjusted !== void 0) {
252
252
  return adjusted;
253
253
  }
254
254
  }
255
- const fromPreset = chunkMGLRKGCH_js.getShapeClipPathFromPreset(shapeType, width, height, adjustments);
255
+ const fromPreset = chunkEXDUEXTO_js.getShapeClipPathFromPreset(shapeType, width, height, adjustments);
256
256
  if (fromPreset !== void 0) {
257
257
  return fromPreset;
258
258
  }
259
- const cloud = chunkMGLRKGCH_js.getCloudPathForRendering(shapeType, width, height);
259
+ const cloud = chunkEXDUEXTO_js.getCloudPathForRendering(shapeType, width, height);
260
260
  if (cloud !== void 0) {
261
261
  return cloud;
262
262
  }
263
- return chunkMGLRKGCH_js.getShapeClipPath(shapeType);
263
+ return chunkEXDUEXTO_js.getShapeClipPath(shapeType);
264
264
  }
265
265
  function getResolvedShapeClipPath(element, width, height) {
266
266
  const shapeType = element.shapeType;
@@ -975,7 +975,7 @@ var DEFAULT_SCHEME_COLOR_MAP = {
975
975
  phclr: "#4472C4"
976
976
  };
977
977
  function applyDrawingColorTransforms2(baseColor, colorNode) {
978
- return chunkMGLRKGCH_js.applyDrawingColorTransforms(baseColor, colorNode);
978
+ return chunkEXDUEXTO_js.applyDrawingColorTransforms(baseColor, colorNode);
979
979
  }
980
980
  function parseDrawingColorChoice(colorNode, schemeColorOverrides) {
981
981
  if (!colorNode) {
@@ -1027,7 +1027,7 @@ function parseDrawingColorChoice(colorNode, schemeColorOverrides) {
1027
1027
  const h = hueRaw / 6e4;
1028
1028
  const s = clampUnitInterval(satRaw / 1e5);
1029
1029
  const l = clampUnitInterval(lumRaw / 1e5);
1030
- const rgb = chunkMGLRKGCH_js.hslToRgb(h, s, l);
1030
+ const rgb = chunkEXDUEXTO_js.hslToRgb(h, s, l);
1031
1031
  const toHex = (value) => Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
1032
1032
  const base = `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;
1033
1033
  return applyDrawingColorTransforms2(base, hslNode);
@@ -1037,7 +1037,7 @@ function parseDrawingColorChoice(colorNode, schemeColorOverrides) {
1037
1037
  const preset = String(
1038
1038
  colorNode["a:prstClr"]?.["@_val"] || ""
1039
1039
  ).toLowerCase();
1040
- const mapped = chunkMGLRKGCH_js.PRESET_COLOR_MAP[preset];
1040
+ const mapped = chunkEXDUEXTO_js.PRESET_COLOR_MAP[preset];
1041
1041
  if (!mapped) {
1042
1042
  return void 0;
1043
1043
  }
@@ -1370,7 +1370,7 @@ function normalizeRadius01(radius) {
1370
1370
  return clamp(radius / 100, 0, 1);
1371
1371
  }
1372
1372
  function getEffects(element) {
1373
- if (!chunkMGLRKGCH_js.isImageLikeElement(element)) {
1373
+ if (!chunkEXDUEXTO_js.isImageLikeElement(element)) {
1374
1374
  return void 0;
1375
1375
  }
1376
1376
  return element.imageEffects;
@@ -3543,9 +3543,15 @@ function getDisplayUnitDivisor(unit, customValue) {
3543
3543
  return DISPLAY_UNIT_DIVISORS[unit] ?? 1;
3544
3544
  }
3545
3545
  function getDisplayUnitLabel(unit, customLabel) {
3546
- if (customLabel) {
3546
+ if (typeof customLabel === "string") {
3547
3547
  return customLabel;
3548
3548
  }
3549
+ if (customLabel === null) {
3550
+ return "";
3551
+ }
3552
+ if (customLabel?.text) {
3553
+ return customLabel.text;
3554
+ }
3549
3555
  if (!unit || unit === "custom") {
3550
3556
  return "";
3551
3557
  }
@@ -6237,12 +6243,21 @@ function seriesColor2(series, index, colorPalette) {
6237
6243
  return series.color ?? paletteColor2(index, colorPalette);
6238
6244
  }
6239
6245
  function computeValueRange2(series) {
6240
- const all = series.flatMap((s) => s.values);
6241
- if (all.length === 0) {
6246
+ let dataMin = Number.POSITIVE_INFINITY;
6247
+ let dataMax = Number.NEGATIVE_INFINITY;
6248
+ for (const item of series) {
6249
+ for (const value of item.values) {
6250
+ if (value < dataMin) {
6251
+ dataMin = value;
6252
+ }
6253
+ if (value > dataMax) {
6254
+ dataMax = value;
6255
+ }
6256
+ }
6257
+ }
6258
+ if (dataMin === Number.POSITIVE_INFINITY) {
6242
6259
  return { min: 0, max: 1, span: 1 };
6243
6260
  }
6244
- const dataMin = Math.min(...all);
6245
- const dataMax = Math.max(...all);
6246
6261
  const min = Math.min(dataMin, 0);
6247
6262
  const max = Math.max(dataMax, 0);
6248
6263
  const span = Math.max(max - min, 1);
@@ -10191,7 +10206,7 @@ function rotateDelta(dx, dy, rotationDeg) {
10191
10206
  }
10192
10207
  function applyResize(box, handle, dxScreen, dyScreen, zoom, opts = {}) {
10193
10208
  const scale = zoom || 1;
10194
- const minSize = opts.minSize ?? chunkMGLRKGCH_js.MIN_ELEMENT_SIZE;
10209
+ const minSize = opts.minSize ?? chunkEXDUEXTO_js.MIN_ELEMENT_SIZE;
10195
10210
  const rotation = rotationOf(box);
10196
10211
  const local = rotateDelta(dxScreen / scale, dyScreen / scale, rotation);
10197
10212
  const dx = local.x;
@@ -10218,7 +10233,7 @@ function applyResize(box, handle, dxScreen, dyScreen, zoom, opts = {}) {
10218
10233
  }
10219
10234
  return { x: newX, y: newY, width: newW, height: newH, rotation };
10220
10235
  }
10221
- function snapBoxToGrid(box, handle, gridSpacingPx, minSize = chunkMGLRKGCH_js.MIN_ELEMENT_SIZE) {
10236
+ function snapBoxToGrid(box, handle, gridSpacingPx, minSize = chunkEXDUEXTO_js.MIN_ELEMENT_SIZE) {
10222
10237
  if (handle === null || gridSpacingPx <= 0) {
10223
10238
  return box;
10224
10239
  }
@@ -10248,7 +10263,7 @@ function snapBoxToGrid(box, handle, gridSpacingPx, minSize = chunkMGLRKGCH_js.MI
10248
10263
  }
10249
10264
  return { x, y, width, height };
10250
10265
  }
10251
- function computeMarqueeHitIds(marquee, elements, minSize = chunkMGLRKGCH_js.MIN_ELEMENT_SIZE) {
10266
+ function computeMarqueeHitIds(marquee, elements, minSize = chunkEXDUEXTO_js.MIN_ELEMENT_SIZE) {
10252
10267
  const minX = Math.min(marquee.startX, marquee.currentX);
10253
10268
  const minY = Math.min(marquee.startY, marquee.currentY);
10254
10269
  const maxX = Math.max(marquee.startX, marquee.currentX);
@@ -10354,6 +10369,111 @@ function getSlideBackgroundStyle(slide) {
10354
10369
  }
10355
10370
  return style;
10356
10371
  }
10372
+ var DATETIME_TYPE_FORMATS = {
10373
+ datetime1: "M/d/yyyy",
10374
+ datetime2: "EEEE, MMMM d, yyyy",
10375
+ datetime3: "d MMMM yyyy",
10376
+ datetime4: "MMMM d, yyyy",
10377
+ datetime5: "dd-MMM-yy",
10378
+ datetime6: "MMMM yy",
10379
+ datetime7: "MMM-yy",
10380
+ datetime8: "M/d/yyyy h:mm a",
10381
+ datetime9: "M/d/yyyy h:mm:ss a",
10382
+ datetime10: "H:mm",
10383
+ datetime11: "H:mm:ss",
10384
+ datetime12: "h:mm a",
10385
+ datetime13: "h:mm:ss a"
10386
+ };
10387
+ function formatDateWithPattern(date, pattern) {
10388
+ const months = [
10389
+ "January",
10390
+ "February",
10391
+ "March",
10392
+ "April",
10393
+ "May",
10394
+ "June",
10395
+ "July",
10396
+ "August",
10397
+ "September",
10398
+ "October",
10399
+ "November",
10400
+ "December"
10401
+ ];
10402
+ const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
10403
+ const pad = (n) => String(n).padStart(2, "0");
10404
+ const h12 = (h) => h === 0 ? 12 : h > 12 ? h - 12 : h;
10405
+ const hours = date.getHours();
10406
+ let result = pattern;
10407
+ result = result.replace(/yyyy/gu, String(date.getFullYear()));
10408
+ result = result.replace(/EEEE/gu, days[date.getDay()]);
10409
+ result = result.replace(/MMMM/gu, months[date.getMonth()]);
10410
+ result = result.replace(/EEE/gu, days[date.getDay()].slice(0, 3));
10411
+ result = result.replace(/MMM/gu, months[date.getMonth()].slice(0, 3));
10412
+ result = result.replace(/yy/gu, String(date.getFullYear()).slice(2));
10413
+ result = result.replace(/MM/gu, pad(date.getMonth() + 1));
10414
+ result = result.replace(/dd/gu, pad(date.getDate()));
10415
+ result = result.replace(/HH/gu, pad(hours));
10416
+ result = result.replace(/hh/gu, pad(h12(hours)));
10417
+ result = result.replace(/mm/gu, pad(date.getMinutes()));
10418
+ result = result.replace(/ss/gu, pad(date.getSeconds()));
10419
+ result = result.replace(/(?<![A-Za-z])M(?![A-Za-z])/gu, String(date.getMonth() + 1));
10420
+ result = result.replace(/(?<![A-Za-z])d(?![A-Za-z])/gu, String(date.getDate()));
10421
+ result = result.replace(/(?<![A-Za-z])H(?![A-Za-z])/gu, String(hours));
10422
+ result = result.replace(/(?<![A-Za-z])h(?![A-Za-z])/gu, String(h12(hours)));
10423
+ result = result.replace(/\ba\b/gu, hours >= 12 ? "PM" : "AM");
10424
+ return result;
10425
+ }
10426
+ function resolveFieldDateText(fieldType, dateFormat) {
10427
+ const now = /* @__PURE__ */ new Date();
10428
+ if (dateFormat) {
10429
+ return formatDateWithPattern(now, dateFormat);
10430
+ }
10431
+ const knownFormat = DATETIME_TYPE_FORMATS[fieldType.toLowerCase()];
10432
+ if (knownFormat) {
10433
+ return formatDateWithPattern(now, knownFormat);
10434
+ }
10435
+ return now.toLocaleDateString();
10436
+ }
10437
+ function substituteFieldText(segmentText, fieldType, ctx) {
10438
+ if (!fieldType || !ctx) {
10439
+ return segmentText;
10440
+ }
10441
+ const fl = fieldType.toLowerCase();
10442
+ if (fl === "slidenum" && ctx.slideNumber !== void 0) {
10443
+ return String(ctx.slideNumber);
10444
+ }
10445
+ if (fl.startsWith("datetime")) {
10446
+ return resolveFieldDateText(fl, ctx.dateFormat);
10447
+ }
10448
+ if (fl === "footer" && ctx.footerText !== void 0) {
10449
+ return ctx.footerText;
10450
+ }
10451
+ if (fl === "header" && ctx.headerText !== void 0) {
10452
+ return ctx.headerText;
10453
+ }
10454
+ if (fl === "currentdate") {
10455
+ return (/* @__PURE__ */ new Date()).toLocaleDateString(ctx.locale);
10456
+ }
10457
+ if (fl === "currenttime") {
10458
+ return (/* @__PURE__ */ new Date()).toLocaleTimeString(ctx.locale);
10459
+ }
10460
+ if (fl === "slidetitle" && ctx.slideTitle !== void 0) {
10461
+ return ctx.slideTitle;
10462
+ }
10463
+ if (fl.startsWith("docproperty") && ctx.customProperties) {
10464
+ const dotIdx = fieldType.indexOf(".");
10465
+ const propName = dotIdx >= 0 ? fieldType.substring(dotIdx + 1).trim() : "";
10466
+ if (propName) {
10467
+ const prop = ctx.customProperties.find(
10468
+ (p) => p.name.toLowerCase() === propName.toLowerCase()
10469
+ );
10470
+ if (prop) {
10471
+ return prop.value;
10472
+ }
10473
+ }
10474
+ }
10475
+ return segmentText;
10476
+ }
10357
10477
  var DEFAULT_X = 100;
10358
10478
  var TABLE_WIDTH = 600;
10359
10479
  var TABLE_HEIGHT = 250;
@@ -11055,111 +11175,6 @@ function resolveCssTextAlign(align, isRtl) {
11055
11175
  }
11056
11176
  return isRtl ? "right" : void 0;
11057
11177
  }
11058
- var DATETIME_TYPE_FORMATS = {
11059
- datetime1: "M/d/yyyy",
11060
- datetime2: "EEEE, MMMM d, yyyy",
11061
- datetime3: "d MMMM yyyy",
11062
- datetime4: "MMMM d, yyyy",
11063
- datetime5: "dd-MMM-yy",
11064
- datetime6: "MMMM yy",
11065
- datetime7: "MMM-yy",
11066
- datetime8: "M/d/yyyy h:mm a",
11067
- datetime9: "M/d/yyyy h:mm:ss a",
11068
- datetime10: "H:mm",
11069
- datetime11: "H:mm:ss",
11070
- datetime12: "h:mm a",
11071
- datetime13: "h:mm:ss a"
11072
- };
11073
- function formatDateWithPattern(date, pattern) {
11074
- const months = [
11075
- "January",
11076
- "February",
11077
- "March",
11078
- "April",
11079
- "May",
11080
- "June",
11081
- "July",
11082
- "August",
11083
- "September",
11084
- "October",
11085
- "November",
11086
- "December"
11087
- ];
11088
- const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
11089
- const pad = (n) => String(n).padStart(2, "0");
11090
- const h12 = (h) => h === 0 ? 12 : h > 12 ? h - 12 : h;
11091
- const hours = date.getHours();
11092
- let result = pattern;
11093
- result = result.replace(/yyyy/gu, String(date.getFullYear()));
11094
- result = result.replace(/EEEE/gu, days[date.getDay()]);
11095
- result = result.replace(/MMMM/gu, months[date.getMonth()]);
11096
- result = result.replace(/EEE/gu, days[date.getDay()].slice(0, 3));
11097
- result = result.replace(/MMM/gu, months[date.getMonth()].slice(0, 3));
11098
- result = result.replace(/yy/gu, String(date.getFullYear()).slice(2));
11099
- result = result.replace(/MM/gu, pad(date.getMonth() + 1));
11100
- result = result.replace(/dd/gu, pad(date.getDate()));
11101
- result = result.replace(/HH/gu, pad(hours));
11102
- result = result.replace(/hh/gu, pad(h12(hours)));
11103
- result = result.replace(/mm/gu, pad(date.getMinutes()));
11104
- result = result.replace(/ss/gu, pad(date.getSeconds()));
11105
- result = result.replace(/(?<![A-Za-z])M(?![A-Za-z])/gu, String(date.getMonth() + 1));
11106
- result = result.replace(/(?<![A-Za-z])d(?![A-Za-z])/gu, String(date.getDate()));
11107
- result = result.replace(/(?<![A-Za-z])H(?![A-Za-z])/gu, String(hours));
11108
- result = result.replace(/(?<![A-Za-z])h(?![A-Za-z])/gu, String(h12(hours)));
11109
- result = result.replace(/\ba\b/gu, hours >= 12 ? "PM" : "AM");
11110
- return result;
11111
- }
11112
- function resolveFieldDateText(fieldType, dateFormat) {
11113
- const now = /* @__PURE__ */ new Date();
11114
- if (dateFormat) {
11115
- return formatDateWithPattern(now, dateFormat);
11116
- }
11117
- const knownFormat = DATETIME_TYPE_FORMATS[fieldType.toLowerCase()];
11118
- if (knownFormat) {
11119
- return formatDateWithPattern(now, knownFormat);
11120
- }
11121
- return now.toLocaleDateString();
11122
- }
11123
- function substituteFieldText(segmentText, fieldType, ctx) {
11124
- if (!fieldType || !ctx) {
11125
- return segmentText;
11126
- }
11127
- const fl = fieldType.toLowerCase();
11128
- if (fl === "slidenum" && ctx.slideNumber !== void 0) {
11129
- return String(ctx.slideNumber);
11130
- }
11131
- if (fl.startsWith("datetime")) {
11132
- return resolveFieldDateText(fl, ctx.dateFormat);
11133
- }
11134
- if (fl === "footer" && ctx.footerText !== void 0) {
11135
- return ctx.footerText;
11136
- }
11137
- if (fl === "header" && ctx.headerText !== void 0) {
11138
- return ctx.headerText;
11139
- }
11140
- if (fl === "currentdate") {
11141
- return (/* @__PURE__ */ new Date()).toLocaleDateString(ctx.locale);
11142
- }
11143
- if (fl === "currenttime") {
11144
- return (/* @__PURE__ */ new Date()).toLocaleTimeString(ctx.locale);
11145
- }
11146
- if (fl === "slidetitle" && ctx.slideTitle !== void 0) {
11147
- return ctx.slideTitle;
11148
- }
11149
- if (fl.startsWith("docproperty") && ctx.customProperties) {
11150
- const dotIdx = fieldType.indexOf(".");
11151
- const propName = dotIdx >= 0 ? fieldType.substring(dotIdx + 1).trim() : "";
11152
- if (propName) {
11153
- const prop = ctx.customProperties.find(
11154
- (p) => p.name.toLowerCase() === propName.toLowerCase()
11155
- );
11156
- if (prop) {
11157
- return prop.value;
11158
- }
11159
- }
11160
- }
11161
- return segmentText;
11162
- }
11163
11178
  function buildTextFillCss(style) {
11164
11179
  if (style.textFillGradient) {
11165
11180
  return {
@@ -11753,7 +11768,7 @@ var THEME_COLOR_LABELS = {
11753
11768
  };
11754
11769
  function buildThemeColorGrid(colorScheme) {
11755
11770
  return THEME_COLOR_TINT_ROWS.map(
11756
- (row) => chunkMGLRKGCH_js.THEME_COLOR_SCHEME_KEYS.map((key) => ({
11771
+ (row) => chunkEXDUEXTO_js.THEME_COLOR_SCHEME_KEYS.map((key) => ({
11757
11772
  hex: row.transform(colorScheme[key]),
11758
11773
  schemeKey: key,
11759
11774
  rowLabel: row.label,
@@ -12229,7 +12244,7 @@ function svgLineCap(lineCap) {
12229
12244
  }
12230
12245
  function copyFormatFromElement(element) {
12231
12246
  const result = {};
12232
- if (chunkMGLRKGCH_js.hasShapeProperties(element) && element.shapeStyle) {
12247
+ if (chunkEXDUEXTO_js.hasShapeProperties(element) && element.shapeStyle) {
12233
12248
  const s = element.shapeStyle;
12234
12249
  result.shapeStyle = {
12235
12250
  fillColor: s.fillColor,
@@ -12258,7 +12273,7 @@ function copyFormatFromElement(element) {
12258
12273
  softEdgeRadius: s.softEdgeRadius
12259
12274
  };
12260
12275
  }
12261
- if (chunkMGLRKGCH_js.hasTextProperties(element) && element.textStyle) {
12276
+ if (chunkEXDUEXTO_js.hasTextProperties(element) && element.textStyle) {
12262
12277
  const t = element.textStyle;
12263
12278
  result.textStyle = {
12264
12279
  fontFamily: t.fontFamily,
@@ -12289,7 +12304,7 @@ function definedEntries(obj) {
12289
12304
  }
12290
12305
  function applyFormatToElement(element, format) {
12291
12306
  let updated = { ...element };
12292
- if (format.shapeStyle && chunkMGLRKGCH_js.hasShapeProperties(updated)) {
12307
+ if (format.shapeStyle && chunkEXDUEXTO_js.hasShapeProperties(updated)) {
12293
12308
  updated = {
12294
12309
  ...updated,
12295
12310
  shapeStyle: {
@@ -12298,7 +12313,7 @@ function applyFormatToElement(element, format) {
12298
12313
  }
12299
12314
  };
12300
12315
  }
12301
- if (format.textStyle && chunkMGLRKGCH_js.hasTextProperties(updated)) {
12316
+ if (format.textStyle && chunkEXDUEXTO_js.hasTextProperties(updated)) {
12302
12317
  updated = {
12303
12318
  ...updated,
12304
12319
  textStyle: {
@@ -12313,7 +12328,7 @@ function hasCopyableFormat(element) {
12313
12328
  if (!element) {
12314
12329
  return false;
12315
12330
  }
12316
- return chunkMGLRKGCH_js.hasShapeProperties(element) || chunkMGLRKGCH_js.hasTextProperties(element);
12331
+ return chunkEXDUEXTO_js.hasShapeProperties(element) || chunkEXDUEXTO_js.hasTextProperties(element);
12317
12332
  }
12318
12333
  function copySegmentMetadata(from, to) {
12319
12334
  if (from.equationXml !== void 0) {
@@ -12450,7 +12465,7 @@ function getRoundRectRadiusPx(element) {
12450
12465
  return Math.min(Math.max(element.width, 1), Math.max(element.height, 1)) * 0.5 * normalizedAdjustment;
12451
12466
  }
12452
12467
  function getShapeAdjustmentHandleDescriptor(element) {
12453
- if (!chunkMGLRKGCH_js.hasShapeProperties(element)) {
12468
+ if (!chunkEXDUEXTO_js.hasShapeProperties(element)) {
12454
12469
  return null;
12455
12470
  }
12456
12471
  const normalizedShapeType = String(element.shapeType || "").toLowerCase();
@@ -12901,6 +12916,8 @@ var SCALAR_ELEMENT_KEYS = /* @__PURE__ */ new Set([
12901
12916
  "mediaType",
12902
12917
  "mediaPath",
12903
12918
  "mediaMimeType",
12919
+ "mediaReferenceKind",
12920
+ "mediaReferenceName",
12904
12921
  "trimStartMs",
12905
12922
  "trimEndMs",
12906
12923
  "posterFramePath",
@@ -12964,6 +12981,9 @@ var COMPLEX_ELEMENT_FIELDS = {
12964
12981
  cropShape: "_cr",
12965
12982
  bookmarks: "_mb",
12966
12983
  captionTracks: "_ct",
12984
+ audioCdStart: "_acd1",
12985
+ audioCdEnd: "_acd2",
12986
+ rawMediaReferenceXml: "_mrx",
12967
12987
  metadata: "_md",
12968
12988
  groupFill: "_gf",
12969
12989
  inkPointPressures: "_ipp",
@@ -13016,7 +13036,9 @@ var COMPLEX_SLIDE_FIELDS = {
13016
13036
  customerData: "_cu",
13017
13037
  activeXControls: "_ax",
13018
13038
  backgroundPattern: "_bp",
13019
- headerFooterFlags: "_hff"
13039
+ modernCommentPart: "_mc",
13040
+ headerFooterFlags: "_hff",
13041
+ slideSynchronization: "_sync"
13020
13042
  };
13021
13043
  var REV_COMPLEX_SLIDE = Object.fromEntries(
13022
13044
  Object.entries(COMPLEX_SLIDE_FIELDS).map(([k, v]) => [v, k])
@@ -13429,7 +13451,7 @@ function createSyncGate(onOpen, graceMs = INITIAL_SYNC_GRACE_MS) {
13429
13451
  var POSITION_THRESHOLD = 2;
13430
13452
  var SIZE_THRESHOLD = 2;
13431
13453
  function getElementText(element) {
13432
- if (!chunkMGLRKGCH_js.hasTextProperties(element)) {
13454
+ if (!chunkEXDUEXTO_js.hasTextProperties(element)) {
13433
13455
  return "";
13434
13456
  }
13435
13457
  if (element.textSegments && element.textSegments.length > 0) {
@@ -15979,6 +16001,72 @@ function buildBroadcastViewerUrl(roomId, serverUrl, location) {
15979
16001
  const server = encodeURIComponent(trimmed);
15980
16002
  return `${location.origin}${location.pathname}?broadcast=${room}&server=${server}`;
15981
16003
  }
16004
+ function canCreateCollaborationSession(fields) {
16005
+ return isValidRoomId(fields.roomId.trim()) && fields.userName.trim().length > 0;
16006
+ }
16007
+ function buildCreateCollaborationConfig(fields) {
16008
+ if (!canCreateCollaborationSession(fields)) {
16009
+ return null;
16010
+ }
16011
+ const serverUrl = fields.serverUrl.trim();
16012
+ return {
16013
+ roomId: fields.roomId.trim(),
16014
+ userName: fields.userName.trim(),
16015
+ serverUrl,
16016
+ transport: resolveTransportForServerUrl(serverUrl),
16017
+ role: "collaborator",
16018
+ sessionIntent: "create"
16019
+ };
16020
+ }
16021
+ function parseInvitationUrl(value) {
16022
+ try {
16023
+ return new URL(value);
16024
+ } catch {
16025
+ return null;
16026
+ }
16027
+ }
16028
+ function buildJoinCollaborationConfig(fields) {
16029
+ const invitation = fields.invitation.trim();
16030
+ const userName = fields.userName.trim();
16031
+ if (!invitation || !userName) {
16032
+ return null;
16033
+ }
16034
+ const url = parseInvitationUrl(invitation);
16035
+ const roomId = (url?.searchParams.get("room") ?? (url ? "" : invitation)).trim();
16036
+ if (!isValidRoomId(roomId)) {
16037
+ return null;
16038
+ }
16039
+ const requestedTransport = url?.searchParams.get("transport");
16040
+ const serverUrl = (url?.searchParams.get("server") ?? fields.serverUrl).trim();
16041
+ const transport = requestedTransport === "webrtc" ? "webrtc" : resolveTransportForServerUrl(serverUrl);
16042
+ const signalingValue = url?.searchParams.get("signaling");
16043
+ const signaling = signalingValue?.split(",").map((entry) => entry.trim()).filter((entry) => entry.length > 0);
16044
+ return {
16045
+ roomId,
16046
+ userName,
16047
+ serverUrl: transport === "webrtc" ? "" : serverUrl,
16048
+ transport,
16049
+ ...signaling?.length ? { signaling } : {},
16050
+ role: "collaborator",
16051
+ sessionIntent: "join"
16052
+ };
16053
+ }
16054
+ function buildCollaborationShareUrl(config, location) {
16055
+ if (!location) {
16056
+ return config.roomId;
16057
+ }
16058
+ const url = new URL(location.pathname, location.origin);
16059
+ url.searchParams.set("room", config.roomId);
16060
+ if (config.transport === "webrtc" || !config.serverUrl.trim()) {
16061
+ url.searchParams.set("transport", "webrtc");
16062
+ if (config.signaling?.length) {
16063
+ url.searchParams.set("signaling", config.signaling.join(","));
16064
+ }
16065
+ } else {
16066
+ url.searchParams.set("server", config.serverUrl.trim());
16067
+ }
16068
+ return url.toString();
16069
+ }
15982
16070
  var NOTES_FONT_SIZE_MIN = 10;
15983
16071
  var NOTES_FONT_SIZE_MAX = 32;
15984
16072
  var NOTES_FONT_SIZE_STEP = 2;
@@ -16033,6 +16121,263 @@ function notesSegmentsToSpans(segments) {
16033
16121
  return { kind: "text", key: `seg-${index}`, text: segment.text, style };
16034
16122
  });
16035
16123
  }
16124
+ var PRESENTER_ZOOM_MIN = 1;
16125
+ var PRESENTER_ZOOM_MAX = 4;
16126
+ var PRESENTER_ZOOM_STEP = 0.5;
16127
+ function createPresenterTimer(now = Date.now()) {
16128
+ return { elapsedMs: 0, paused: false, lastStartedAt: now };
16129
+ }
16130
+ function presenterElapsed(timer, now = Date.now()) {
16131
+ return timer.elapsedMs + (timer.paused ? 0 : Math.max(0, now - timer.lastStartedAt));
16132
+ }
16133
+ function togglePresenterTimer(timer, now = Date.now()) {
16134
+ if (timer.paused) {
16135
+ return { ...timer, paused: false, lastStartedAt: now };
16136
+ }
16137
+ return { elapsedMs: presenterElapsed(timer, now), paused: true, lastStartedAt: now };
16138
+ }
16139
+ function resetPresenterTimer(now = Date.now()) {
16140
+ return createPresenterTimer(now);
16141
+ }
16142
+ function clampPresenterZoom(zoom) {
16143
+ return {
16144
+ scale: Math.min(PRESENTER_ZOOM_MAX, Math.max(PRESENTER_ZOOM_MIN, zoom.scale ?? 1)),
16145
+ originX: Math.min(1, Math.max(0, zoom.originX ?? 0.5)),
16146
+ originY: Math.min(1, Math.max(0, zoom.originY ?? 0.5))
16147
+ };
16148
+ }
16149
+ function stepPresenterZoom(zoom, direction) {
16150
+ return clampPresenterZoom({ ...zoom, scale: zoom.scale + direction * PRESENTER_ZOOM_STEP });
16151
+ }
16152
+ function movePresenterPointer(pointer, x, y) {
16153
+ return { ...pointer, x: Math.min(1, Math.max(0, x)), y: Math.min(1, Math.max(0, y)) };
16154
+ }
16155
+ function appendPresentationInkPoint(stroke, point) {
16156
+ const clamped = {
16157
+ x: Math.min(1, Math.max(0, point.x)),
16158
+ y: Math.min(1, Math.max(0, point.y))
16159
+ };
16160
+ return { ...stroke, points: [...stroke.points, clamped] };
16161
+ }
16162
+ function erasePresentationInkAt(strokes, slideIndex, point, radius = 0.035) {
16163
+ const radiusSquared = radius * radius;
16164
+ return strokes.filter(
16165
+ (stroke) => stroke.slideIndex !== slideIndex || !stroke.points.some((candidate) => {
16166
+ const dx = candidate.x - point.x;
16167
+ const dy = candidate.y - point.y;
16168
+ return dx * dx + dy * dy <= radiusSquared;
16169
+ })
16170
+ );
16171
+ }
16172
+ function mergePresentationSnapshot(current, patch) {
16173
+ return {
16174
+ ...current,
16175
+ ...patch,
16176
+ sequence: Math.max(current.sequence + 1, patch.sequence ?? 0),
16177
+ zoom: patch.zoom ? clampPresenterZoom(patch.zoom) : current.zoom
16178
+ };
16179
+ }
16180
+ function presentationInkPath(points) {
16181
+ if (points.length === 0) {
16182
+ return "";
16183
+ }
16184
+ return points.reduce(
16185
+ (path, point, index) => `${path}${index === 0 ? "M" : " L"} ${point.x * 100} ${point.y * 100}`,
16186
+ ""
16187
+ );
16188
+ }
16189
+ var PRESENTATION_CHANNEL_NAME = "pptx-viewer-presenter";
16190
+ var PRESENTATION_HASH = "#pptx-audience";
16191
+ var PRESENTATION_NONCE_KEY = "nonce";
16192
+ var PRESENTATION_MESSAGE_ORIGIN = "pptx-viewer-presenter";
16193
+ var DB_NAME = "pptx-viewer-presentation";
16194
+ var DB_VERSION = 1;
16195
+ var STORE_NAME = "decks";
16196
+ var MAX_DECK_AGE_MS = 5 * 60 * 1e3;
16197
+ function createPresentationSessionId() {
16198
+ return secureRandomUuid();
16199
+ }
16200
+ function createInitialPresentationSnapshot(slideIndex = 0) {
16201
+ return {
16202
+ slideIndex: Math.max(0, Math.trunc(slideIndex)),
16203
+ buildStep: 0,
16204
+ sequence: 0,
16205
+ blackout: "none",
16206
+ paused: false,
16207
+ elapsedMs: 0,
16208
+ zoom: { scale: 1, originX: 0.5, originY: 0.5 },
16209
+ pointer: { tool: "none", x: 0.5, y: 0.5, color: "#ef4444" },
16210
+ inkStrokes: [],
16211
+ caption: "",
16212
+ subtitlesVisible: false
16213
+ };
16214
+ }
16215
+ function buildPresentationAudienceUrl(source, sessionId) {
16216
+ const url = new URL(source);
16217
+ const params = new URLSearchParams();
16218
+ params.set(PRESENTATION_NONCE_KEY, sessionId);
16219
+ url.hash = `${PRESENTATION_HASH}&${params.toString()}`;
16220
+ return url.toString();
16221
+ }
16222
+ function isPresentationSessionMessage(value) {
16223
+ if (!value || typeof value !== "object") {
16224
+ return false;
16225
+ }
16226
+ const message = value;
16227
+ if (message.origin !== PRESENTATION_MESSAGE_ORIGIN || typeof message.sessionId !== "string") {
16228
+ return false;
16229
+ }
16230
+ if (message.type === "audience-ready" || message.type === "presenter-exit") {
16231
+ return true;
16232
+ }
16233
+ if (message.type === "presenter-slide-change") {
16234
+ return typeof message.slideIndex === "number";
16235
+ }
16236
+ if (message.type !== "presenter-state" || !message.snapshot || typeof message.snapshot !== "object") {
16237
+ return false;
16238
+ }
16239
+ const snapshot = message.snapshot;
16240
+ const zoom = snapshot.zoom;
16241
+ const pointer = snapshot.pointer;
16242
+ const inkStrokes = snapshot.inkStrokes;
16243
+ return typeof snapshot.slideIndex === "number" && typeof snapshot.buildStep === "number" && typeof snapshot.sequence === "number" && (snapshot.blackout === "none" || snapshot.blackout === "black" || snapshot.blackout === "white") && typeof snapshot.paused === "boolean" && typeof snapshot.elapsedMs === "number" && (!zoom || typeof zoom.scale === "number" && typeof zoom.originX === "number" && typeof zoom.originY === "number") && (!pointer || typeof pointer.tool === "string" && typeof pointer.x === "number" && typeof pointer.y === "number" && typeof pointer.color === "string") && (inkStrokes === void 0 || Array.isArray(inkStrokes)) && (snapshot.caption === void 0 || typeof snapshot.caption === "string") && (snapshot.subtitlesVisible === void 0 || typeof snapshot.subtitlesVisible === "boolean");
16244
+ }
16245
+ async function resolveAudienceScreenPlacement(sourceWindow = window) {
16246
+ const managedWindow = sourceWindow;
16247
+ if (typeof managedWindow.getScreenDetails !== "function") {
16248
+ return null;
16249
+ }
16250
+ try {
16251
+ const details = await managedWindow.getScreenDetails();
16252
+ const target = details.screens.find((screen2) => screen2 !== details.currentScreen && !screen2.isPrimary) ?? details.screens.find((screen2) => screen2 !== details.currentScreen);
16253
+ if (!target) {
16254
+ return null;
16255
+ }
16256
+ return {
16257
+ left: target.availLeft,
16258
+ top: target.availTop,
16259
+ width: target.availWidth,
16260
+ height: target.availHeight,
16261
+ label: target.label
16262
+ };
16263
+ } catch {
16264
+ return null;
16265
+ }
16266
+ }
16267
+ function placeAudienceWindow(target, placement) {
16268
+ try {
16269
+ target.moveTo(placement.left, placement.top);
16270
+ target.resizeTo(placement.width, placement.height);
16271
+ target.focus();
16272
+ } catch {
16273
+ }
16274
+ }
16275
+ async function swapPresentationWindows(presenter, audience) {
16276
+ const managedWindow = presenter;
16277
+ if (typeof managedWindow.getScreenDetails !== "function") {
16278
+ return false;
16279
+ }
16280
+ try {
16281
+ const details = await managedWindow.getScreenDetails();
16282
+ const contains = (screen2, target) => target.screenX >= screen2.availLeft && target.screenX < screen2.availLeft + screen2.availWidth && target.screenY >= screen2.availTop && target.screenY < screen2.availTop + screen2.availHeight;
16283
+ const presenterScreen = details.screens.find((screen2) => contains(screen2, presenter));
16284
+ const audienceScreen = details.screens.find((screen2) => contains(screen2, audience));
16285
+ if (!presenterScreen || !audienceScreen || presenterScreen === audienceScreen) {
16286
+ return false;
16287
+ }
16288
+ placeAudienceWindow(audience, {
16289
+ left: presenterScreen.availLeft,
16290
+ top: presenterScreen.availTop,
16291
+ width: presenterScreen.availWidth,
16292
+ height: presenterScreen.availHeight
16293
+ });
16294
+ placeAudienceWindow(presenter, {
16295
+ left: audienceScreen.availLeft,
16296
+ top: audienceScreen.availTop,
16297
+ width: audienceScreen.availWidth,
16298
+ height: audienceScreen.availHeight
16299
+ });
16300
+ return true;
16301
+ } catch {
16302
+ return false;
16303
+ }
16304
+ }
16305
+ function openDeckDb() {
16306
+ return new Promise((resolve, reject) => {
16307
+ const request = indexedDB.open(DB_NAME, DB_VERSION);
16308
+ request.onupgradeneeded = () => {
16309
+ const db = request.result;
16310
+ if (!db.objectStoreNames.contains(STORE_NAME)) {
16311
+ db.createObjectStore(STORE_NAME);
16312
+ }
16313
+ };
16314
+ request.onsuccess = () => resolve(request.result);
16315
+ request.onerror = () => reject(request.error);
16316
+ });
16317
+ }
16318
+ async function storePresentationDeck(sessionId, content) {
16319
+ const db = await openDeckDb();
16320
+ return new Promise((resolve, reject) => {
16321
+ const tx = db.transaction(STORE_NAME, "readwrite");
16322
+ const bytes = content instanceof Uint8Array ? content : new Uint8Array(content);
16323
+ tx.objectStore(STORE_NAME).put(
16324
+ { bytes, createdAt: Date.now() },
16325
+ sessionId
16326
+ );
16327
+ tx.oncomplete = () => {
16328
+ db.close();
16329
+ resolve();
16330
+ };
16331
+ tx.onerror = () => {
16332
+ db.close();
16333
+ reject(tx.error);
16334
+ };
16335
+ });
16336
+ }
16337
+ async function loadPresentationDeck(sessionId) {
16338
+ try {
16339
+ const db = await openDeckDb();
16340
+ return await new Promise((resolve, reject) => {
16341
+ const request = db.transaction(STORE_NAME, "readonly").objectStore(STORE_NAME).get(sessionId);
16342
+ request.onsuccess = () => {
16343
+ db.close();
16344
+ const record = request.result;
16345
+ if (!record || Date.now() - record.createdAt > MAX_DECK_AGE_MS) {
16346
+ resolve(null);
16347
+ return;
16348
+ }
16349
+ const raw = record.bytes;
16350
+ resolve(
16351
+ raw instanceof Uint8Array ? raw : raw instanceof ArrayBuffer ? new Uint8Array(raw) : null
16352
+ );
16353
+ };
16354
+ request.onerror = () => {
16355
+ db.close();
16356
+ reject(request.error);
16357
+ };
16358
+ });
16359
+ } catch {
16360
+ return null;
16361
+ }
16362
+ }
16363
+ async function clearPresentationDeck(sessionId) {
16364
+ try {
16365
+ const db = await openDeckDb();
16366
+ await new Promise((resolve) => {
16367
+ const tx = db.transaction(STORE_NAME, "readwrite");
16368
+ tx.objectStore(STORE_NAME).delete(sessionId);
16369
+ tx.oncomplete = () => {
16370
+ db.close();
16371
+ resolve();
16372
+ };
16373
+ tx.onerror = () => {
16374
+ db.close();
16375
+ resolve();
16376
+ };
16377
+ });
16378
+ } catch {
16379
+ }
16380
+ }
16036
16381
  function formatSlideCounter(currentSlide, totalSlides) {
16037
16382
  return `${currentSlide + 1} / ${totalSlides}`;
16038
16383
  }
@@ -16622,7 +16967,10 @@ function getAriaRole(element) {
16622
16967
  case "picture":
16623
16968
  return "img";
16624
16969
  case "table":
16625
- return "table";
16970
+ case "media":
16971
+ case "text":
16972
+ case "ole":
16973
+ case "contentPart":
16626
16974
  case "group":
16627
16975
  return "group";
16628
16976
  case "chart":
@@ -16631,17 +16979,13 @@ function getAriaRole(element) {
16631
16979
  return "img";
16632
16980
  case "connector":
16633
16981
  return "img";
16634
- case "media":
16635
- return "application";
16636
16982
  case "ink":
16637
16983
  return "img";
16638
16984
  case "model3d":
16639
16985
  return "img";
16640
- case "text":
16641
- return void 0;
16642
16986
  case "shape": {
16643
- if (chunkMGLRKGCH_js.hasTextProperties(element) && element.text) {
16644
- return void 0;
16987
+ if (chunkEXDUEXTO_js.hasTextProperties(element) && element.text) {
16988
+ return "group";
16645
16989
  }
16646
16990
  return "img";
16647
16991
  }
@@ -16653,7 +16997,7 @@ function getAriaLabel(element) {
16653
16997
  if ((element.type === "image" || element.type === "picture") && "altText" in element && typeof element.altText === "string" && element.altText.trim()) {
16654
16998
  return element.altText.trim();
16655
16999
  }
16656
- if (chunkMGLRKGCH_js.hasTextProperties(element) && element.text) {
17000
+ if (chunkEXDUEXTO_js.hasTextProperties(element) && element.text) {
16657
17001
  const text = element.text.trim();
16658
17002
  if (text) {
16659
17003
  return text.length > 120 ? `${text.slice(0, 117)}...` : text;
@@ -16760,6 +17104,75 @@ function getAriaRoleDescription(element) {
16760
17104
  return void 0;
16761
17105
  }
16762
17106
  }
17107
+ var MODAL_FOCUSABLE_SELECTOR = [
17108
+ "a[href]",
17109
+ "button:not([disabled])",
17110
+ 'input:not([disabled]):not([type="hidden"])',
17111
+ "select:not([disabled])",
17112
+ "textarea:not([disabled])",
17113
+ '[contenteditable="true"]',
17114
+ '[tabindex]:not([tabindex="-1"])'
17115
+ ].join(",");
17116
+ function isAvailable(element) {
17117
+ if (element.hidden || element.getAttribute("aria-hidden") === "true") {
17118
+ return false;
17119
+ }
17120
+ const style = element.ownerDocument.defaultView?.getComputedStyle(element);
17121
+ return style?.display !== "none" && style?.visibility !== "hidden";
17122
+ }
17123
+ function focusableElements(panel) {
17124
+ return Array.from(panel.querySelectorAll(MODAL_FOCUSABLE_SELECTOR)).filter(
17125
+ isAvailable
17126
+ );
17127
+ }
17128
+ function activateModalFocus(panel, options = {}) {
17129
+ const doc = panel.ownerDocument;
17130
+ const opener = doc.activeElement instanceof HTMLElement ? doc.activeElement : null;
17131
+ const restoreFocus = options.restoreFocus ?? true;
17132
+ function focusInitial() {
17133
+ const candidate = options.initialFocus ?? focusableElements(panel)[0] ?? panel;
17134
+ candidate.focus();
17135
+ }
17136
+ function onKeydown(event) {
17137
+ if (!panel.isConnected) {
17138
+ doc.removeEventListener("keydown", onKeydown, true);
17139
+ return;
17140
+ }
17141
+ if (event.key === "Escape" && options.onEscape) {
17142
+ event.preventDefault();
17143
+ event.stopPropagation();
17144
+ options.onEscape();
17145
+ return;
17146
+ }
17147
+ if (event.key !== "Tab") {
17148
+ return;
17149
+ }
17150
+ const focusable = focusableElements(panel);
17151
+ if (focusable.length === 0) {
17152
+ event.preventDefault();
17153
+ panel.focus();
17154
+ return;
17155
+ }
17156
+ const first = focusable[0];
17157
+ const last = focusable[focusable.length - 1];
17158
+ const active = doc.activeElement;
17159
+ if (event.shiftKey && (active === first || !panel.contains(active))) {
17160
+ event.preventDefault();
17161
+ last.focus();
17162
+ } else if (!event.shiftKey && (active === last || !panel.contains(active))) {
17163
+ event.preventDefault();
17164
+ first.focus();
17165
+ }
17166
+ }
17167
+ doc.addEventListener("keydown", onKeydown, true);
17168
+ queueMicrotask(focusInitial);
17169
+ return () => {
17170
+ doc.removeEventListener("keydown", onKeydown, true);
17171
+ if (restoreFocus && opener?.isConnected) {
17172
+ opener.focus();
17173
+ }
17174
+ };
17175
+ }
16763
17176
  function extractPathPoints(d) {
16764
17177
  const points = [];
16765
17178
  const numberRegex = /-?\d+(?:\.\d+)?(?:e[+-]?\d+)?/giu;
@@ -16991,7 +17404,7 @@ var DEFAULT_CHART_POSITION = { x: 120, y: 120, width: 480, height: 320 };
16991
17404
  var DEFAULT_CATEGORIES = ["Category 1", "Category 2", "Category 3"];
16992
17405
  var DEFAULT_SERIES_VALUES = [4, 3, 5];
16993
17406
  function createDefaultChartElement(chartType = DEFAULT_INSERT_CHART_TYPE, position) {
16994
- return chunkMGLRKGCH_js.createChartElement(
17407
+ return chunkEXDUEXTO_js.createChartElement(
16995
17408
  chartType,
16996
17409
  {
16997
17410
  categories: [...DEFAULT_CATEGORIES],
@@ -19361,6 +19774,10 @@ exports.NOTES_FONT_SIZE_MIN = NOTES_FONT_SIZE_MIN;
19361
19774
  exports.NOTES_FONT_SIZE_STEP = NOTES_FONT_SIZE_STEP;
19362
19775
  exports.NUM = NUM;
19363
19776
  exports.PATTERN_OPTIONS = PATTERN_OPTIONS;
19777
+ exports.PRESENTATION_CHANNEL_NAME = PRESENTATION_CHANNEL_NAME;
19778
+ exports.PRESENTATION_HASH = PRESENTATION_HASH;
19779
+ exports.PRESENTATION_MESSAGE_ORIGIN = PRESENTATION_MESSAGE_ORIGIN;
19780
+ exports.PRESENTATION_NONCE_KEY = PRESENTATION_NONCE_KEY;
19364
19781
  exports.PRESETS = PRESETS;
19365
19782
  exports.RULER_FONT_SIZE = RULER_FONT_SIZE;
19366
19783
  exports.RULER_THICKNESS = RULER_THICKNESS;
@@ -19377,8 +19794,10 @@ exports.TITLE_BAR_CLASSES = TITLE_BAR_CLASSES;
19377
19794
  exports.TITLE_BAR_DEFAULT_FILE_KEY = TITLE_BAR_DEFAULT_FILE_KEY;
19378
19795
  exports.TimelineEngine = TimelineEngine;
19379
19796
  exports.WEBM_MIME_CANDIDATES = WEBM_MIME_CANDIDATES;
19797
+ exports.activateModalFocus = activateModalFocus;
19380
19798
  exports.addSection = addSection;
19381
19799
  exports.alignElements = alignElements;
19800
+ exports.appendPresentationInkPoint = appendPresentationInkPoint;
19382
19801
  exports.apply3dEffects = apply3dEffects;
19383
19802
  exports.applyCaseTransformToSegments = applyCaseTransformToSegments;
19384
19803
  exports.applyColorChange = applyColorChange;
@@ -19393,6 +19812,8 @@ exports.build3DExtrusionData = build3DExtrusionData;
19393
19812
  exports.buildBroadcastViewerUrl = buildBroadcastViewerUrl;
19394
19813
  exports.buildCacheKey = buildCacheKey;
19395
19814
  exports.buildChartViewModel = buildChartViewModel;
19815
+ exports.buildCollaborationShareUrl = buildCollaborationShareUrl;
19816
+ exports.buildCreateCollaborationConfig = buildCreateCollaborationConfig;
19396
19817
  exports.buildCssGradientFromShapeStyle = buildCssGradientFromShapeStyle;
19397
19818
  exports.buildDuotoneCacheKey = buildDuotoneCacheKey;
19398
19819
  exports.buildElementClipboardPayload = buildElementClipboardPayload;
@@ -19400,11 +19821,13 @@ exports.buildGlowBoxShadow = buildGlowBoxShadow;
19400
19821
  exports.buildHandoutsHtml = buildHandoutsHtml;
19401
19822
  exports.buildInitialGuides = buildInitialGuides;
19402
19823
  exports.buildInnerShadowCssFromShapeStyle = buildInnerShadowCssFromShapeStyle;
19824
+ exports.buildJoinCollaborationConfig = buildJoinCollaborationConfig;
19403
19825
  exports.buildMultiLayerShadowCss = buildMultiLayerShadowCss;
19404
19826
  exports.buildNotesHtml = buildNotesHtml;
19405
19827
  exports.buildNotesPdfBytes = buildNotesPdfBytes;
19406
19828
  exports.buildOutlineHtml = buildOutlineHtml;
19407
19829
  exports.buildPatternFillCss = buildPatternFillCss;
19830
+ exports.buildPresentationAudienceUrl = buildPresentationAudienceUrl;
19408
19831
  exports.buildPreviewAnimation = buildPreviewAnimation;
19409
19832
  exports.buildPrintDocument = buildPrintDocument;
19410
19833
  exports.buildPrintHtmlDocument = buildPrintHtmlDocument;
@@ -19428,6 +19851,7 @@ exports.clampCropValue = clampCropValue;
19428
19851
  exports.clampNotesFontSize = clampNotesFontSize;
19429
19852
  exports.clampPercent = clampPercent;
19430
19853
  exports.clampUnitInterval = clampUnitInterval;
19854
+ exports.clearPresentationDeck = clearPresentationDeck;
19431
19855
  exports.cloneElementForPaste = cloneElementForPaste;
19432
19856
  exports.cloneHistorySnapshot = cloneHistorySnapshot;
19433
19857
  exports.cloneSlide = cloneSlide;
@@ -19463,6 +19887,9 @@ exports.copyFormatFromElement = copyFormatFromElement;
19463
19887
  exports.countTextSegments = countTextSegments;
19464
19888
  exports.createBlankSlide = createBlankSlide;
19465
19889
  exports.createDefaultChartElement = createDefaultChartElement;
19890
+ exports.createInitialPresentationSnapshot = createInitialPresentationSnapshot;
19891
+ exports.createPresentationSessionId = createPresentationSessionId;
19892
+ exports.createPresenterTimer = createPresenterTimer;
19466
19893
  exports.createSyncGate = createSyncGate;
19467
19894
  exports.createTouchGestureRecognizer = createTouchGestureRecognizer;
19468
19895
  exports.defaultCssVars = defaultCssVars;
@@ -19480,6 +19907,7 @@ exports.downloadDataUrl = downloadDataUrl;
19480
19907
  exports.dragAnchorViewY = dragAnchorViewY;
19481
19908
  exports.dragValueForPart = dragValueForPart;
19482
19909
  exports.encodeGif = encodeGif;
19910
+ exports.erasePresentationInkAt = erasePresentationInkAt;
19483
19911
  exports.expandTextBuildAnimations = expandTextBuildAnimations;
19484
19912
  exports.extractPathPoints = extractPathPoints;
19485
19913
  exports.filterCommands = filterCommands;
@@ -19561,17 +19989,21 @@ exports.isLastSlide = isLastSlide;
19561
19989
  exports.isMixedContentBlocked = isMixedContentBlocked;
19562
19990
  exports.isMobileViewport = isMobileViewport;
19563
19991
  exports.isPpactionUrl = isPpactionUrl;
19992
+ exports.isPresentationSessionMessage = isPresentationSessionMessage;
19564
19993
  exports.isTemplateElement = isTemplateElement;
19565
19994
  exports.isTemplateElementId = isTemplateElementId;
19566
19995
  exports.isUrlSafe = isUrlSafe;
19996
+ exports.loadPresentationDeck = loadPresentationDeck;
19567
19997
  exports.makeCloneId = makeCloneId;
19568
19998
  exports.makeSlideId = makeSlideId;
19569
19999
  exports.mergeAdditiveSelection = mergeAdditiveSelection;
19570
20000
  exports.mergeCells = mergeCells;
20001
+ exports.mergePresentationSnapshot = mergePresentationSnapshot;
19571
20002
  exports.mobileElapsedSince = mobileElapsedSince;
19572
20003
  exports.mobileSlideCounter = mobileSlideCounter;
19573
20004
  exports.mountModel3D = mountModel3D;
19574
20005
  exports.mountSurfaceChart3D = mountSurfaceChart3D;
20006
+ exports.movePresenterPointer = movePresenterPointer;
19575
20007
  exports.moveSectionDown = moveSectionDown;
19576
20008
  exports.moveSectionUp = moveSectionUp;
19577
20009
  exports.moveSlidesToSection = moveSlidesToSection;
@@ -19590,7 +20022,10 @@ exports.parseDrawingColor = parseDrawingColor;
19590
20022
  exports.parseDrawingColorOpacity = parseDrawingColorOpacity;
19591
20023
  exports.parsePpactionUrl = parsePpactionUrl;
19592
20024
  exports.pickSupportedMimeType = pickSupportedMimeType;
20025
+ exports.placeAudienceWindow = placeAudienceWindow;
19593
20026
  exports.preprocessCssForCapture = preprocessCssForCapture;
20027
+ exports.presentationInkPath = presentationInkPath;
20028
+ exports.presenterElapsed = presenterElapsed;
19594
20029
  exports.pressuresToWidths = pressuresToWidths;
19595
20030
  exports.readSlidesFromYDoc = readSlidesFromYDoc;
19596
20031
  exports.readViewportMetrics = readViewportMetrics;
@@ -19601,6 +20036,8 @@ exports.rectToCells = rectToCells;
19601
20036
  exports.remapTextToSegments = remapTextToSegments;
19602
20037
  exports.renameSection = renameSection;
19603
20038
  exports.rerouteConnectorsForMovedElements = rerouteConnectorsForMovedElements;
20039
+ exports.resetPresenterTimer = resetPresenterTimer;
20040
+ exports.resolveAudienceScreenPlacement = resolveAudienceScreenPlacement;
19604
20041
  exports.resolveCssTextAlign = resolveCssTextAlign;
19605
20042
  exports.resolveDrawingShapeNodeId = resolveDrawingShapeNodeId;
19606
20043
  exports.resolveFontForScript = resolveFontForScript;
@@ -19622,7 +20059,6 @@ exports.sanitizeColor = sanitizeColor;
19622
20059
  exports.sanitizeDownloadFilename = sanitizeDownloadFilename;
19623
20060
  exports.sanitizeMathMl = sanitizeMathMl;
19624
20061
  exports.saveAutosaveSnapshot = saveAutosaveSnapshot;
19625
- exports.secureRandomUuid = secureRandomUuid;
19626
20062
  exports.segmentByScript = segmentByScript;
19627
20063
  exports.segmentFrameCount = segmentFrameCount;
19628
20064
  exports.sendBackward = sendBackward;
@@ -19640,13 +20076,17 @@ exports.slideStatusLabel = slideStatusLabel;
19640
20076
  exports.snapBoxToGrid = snapBoxToGrid;
19641
20077
  exports.splitCell = splitCell;
19642
20078
  exports.splitSeriesByAxis = splitSeriesByAxis;
20079
+ exports.stepPresenterZoom = stepPresenterZoom;
20080
+ exports.storePresentationDeck = storePresentationDeck;
19643
20081
  exports.substituteFieldText = substituteFieldText;
19644
20082
  exports.svgLineCap = svgLineCap;
20083
+ exports.swapPresentationWindows = swapPresentationWindows;
19645
20084
  exports.themeToCssVars = themeToCssVars;
19646
20085
  exports.tintColor2 = tintColor2;
19647
20086
  exports.toCssTextOrientation = toCssTextOrientation;
19648
20087
  exports.toCssVerticalDirection = toCssVerticalDirection;
19649
20088
  exports.toCssWritingMode = toCssWritingMode;
20089
+ exports.togglePresenterTimer = togglePresenterTimer;
19650
20090
  exports.transformTextCase = transformTextCase;
19651
20091
  exports.validateRoomId = validateRoomId;
19652
20092
  exports.valueToY = valueToY;