pptx-react-viewer 3.20.0 → 3.21.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 (222) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/{AiChatPanel-NBKG2CWE.js → AiChatPanel-B3QM7MIC.js} +25 -25
  3. package/dist/AiChatPanel-B3QM7MIC.js.br +0 -0
  4. package/dist/AiChatPanel-B3QM7MIC.js.gz +0 -0
  5. package/dist/{AiChatPanel-OXCJVBUS.mjs → AiChatPanel-UD756KAU.mjs} +4 -4
  6. package/dist/AiChatPanel-UD756KAU.mjs.br +0 -0
  7. package/dist/AiChatPanel-UD756KAU.mjs.gz +0 -0
  8. package/dist/{Area3DChartScene-7QPDPVR6.js → Area3DChartScene-435BFPLY.js} +2 -2
  9. package/dist/{Area3DChartScene-7QPDPVR6.js.br → Area3DChartScene-435BFPLY.js.br} +0 -0
  10. package/dist/Area3DChartScene-435BFPLY.js.gz +0 -0
  11. package/dist/{Area3DChartScene-5M3LEY6M.mjs → Area3DChartScene-MQKUWVMS.mjs} +1 -1
  12. package/dist/Area3DChartScene-MQKUWVMS.mjs.br +0 -0
  13. package/dist/Area3DChartScene-MQKUWVMS.mjs.gz +0 -0
  14. package/dist/{Bar3DChartScene-NNSTLO4V.mjs → Bar3DChartScene-D4GMQGPN.mjs} +1 -1
  15. package/dist/Bar3DChartScene-D4GMQGPN.mjs.br +0 -0
  16. package/dist/Bar3DChartScene-D4GMQGPN.mjs.gz +0 -0
  17. package/dist/{Bar3DChartScene-TAMPS6ZS.js → Bar3DChartScene-KEYLVYJA.js} +2 -2
  18. package/dist/Bar3DChartScene-KEYLVYJA.js.br +0 -0
  19. package/dist/Bar3DChartScene-KEYLVYJA.js.gz +0 -0
  20. package/dist/{Line3DChartScene-7S2DD45T.mjs → Line3DChartScene-B3AWFXE4.mjs} +1 -1
  21. package/dist/Line3DChartScene-B3AWFXE4.mjs.br +0 -0
  22. package/dist/Line3DChartScene-B3AWFXE4.mjs.gz +0 -0
  23. package/dist/{Line3DChartScene-T4SH37NU.js → Line3DChartScene-JYGXLE56.js} +2 -2
  24. package/dist/Line3DChartScene-JYGXLE56.js.br +0 -0
  25. package/dist/Line3DChartScene-JYGXLE56.js.gz +0 -0
  26. package/dist/{Model3DScene-CXRM7D3J.mjs → Model3DScene-4TG4YRVM.mjs} +1 -1
  27. package/dist/Model3DScene-4TG4YRVM.mjs.br +0 -0
  28. package/dist/Model3DScene-4TG4YRVM.mjs.gz +0 -0
  29. package/dist/{Model3DScene-IDRM7EZD.js → Model3DScene-JF5J6N6W.js} +2 -2
  30. package/dist/Model3DScene-JF5J6N6W.js.br +0 -0
  31. package/dist/Model3DScene-JF5J6N6W.js.gz +0 -0
  32. package/dist/{PieChart3DScene-VSCSEY2G.mjs → PieChart3DScene-4BQ6PR7P.mjs} +1 -1
  33. package/dist/PieChart3DScene-4BQ6PR7P.mjs.br +0 -0
  34. package/dist/PieChart3DScene-4BQ6PR7P.mjs.gz +0 -0
  35. package/dist/{PieChart3DScene-66Y5UP64.js → PieChart3DScene-CCQWSH3W.js} +2 -2
  36. package/dist/{PieChart3DScene-66Y5UP64.js.br → PieChart3DScene-CCQWSH3W.js.br} +0 -0
  37. package/dist/PieChart3DScene-CCQWSH3W.js.gz +0 -0
  38. package/dist/{SurfaceChart3DScene-NSHDK657.mjs → SurfaceChart3DScene-FRQC5HBG.mjs} +1 -1
  39. package/dist/SurfaceChart3DScene-FRQC5HBG.mjs.br +0 -0
  40. package/dist/SurfaceChart3DScene-FRQC5HBG.mjs.gz +0 -0
  41. package/dist/{SurfaceChart3DScene-6J4A6XUH.js → SurfaceChart3DScene-UVZPT6OD.js} +2 -2
  42. package/dist/{SurfaceChart3DScene-6J4A6XUH.js.br → SurfaceChart3DScene-UVZPT6OD.js.br} +0 -0
  43. package/dist/SurfaceChart3DScene-UVZPT6OD.js.gz +0 -0
  44. package/dist/{chunk-W3RBIIZW.js → chunk-BFPIMU6Q.js} +1227 -1032
  45. package/dist/chunk-BFPIMU6Q.js.br +0 -0
  46. package/dist/chunk-BFPIMU6Q.js.gz +0 -0
  47. package/dist/{chunk-5PDGHTRJ.mjs → chunk-BXMPXKV5.mjs} +453 -258
  48. package/dist/chunk-BXMPXKV5.mjs.br +0 -0
  49. package/dist/chunk-BXMPXKV5.mjs.gz +0 -0
  50. package/dist/{chunk-2IBDKMY2.mjs → chunk-EJMDD4VV.mjs} +115 -69
  51. package/dist/chunk-EJMDD4VV.mjs.br +0 -0
  52. package/dist/chunk-EJMDD4VV.mjs.gz +0 -0
  53. package/dist/{chunk-WRXXPCZ7.js → chunk-H7QPQ4OR.js} +5 -5
  54. package/dist/chunk-H7QPQ4OR.js.br +0 -0
  55. package/dist/chunk-H7QPQ4OR.js.gz +0 -0
  56. package/dist/{chunk-FE4L26FT.mjs → chunk-HZEOZUUH.mjs} +7 -3
  57. package/dist/chunk-HZEOZUUH.mjs.br +0 -0
  58. package/dist/chunk-HZEOZUUH.mjs.gz +0 -0
  59. package/dist/{chunk-I5LPYESF.js → chunk-M24DEOP6.js} +4 -0
  60. package/dist/chunk-M24DEOP6.js.br +0 -0
  61. package/dist/chunk-M24DEOP6.js.gz +0 -0
  62. package/dist/{chunk-7SFA4A2E.js → chunk-M6QJKPU2.js} +1160 -1114
  63. package/dist/chunk-M6QJKPU2.js.br +0 -0
  64. package/dist/chunk-M6QJKPU2.js.gz +0 -0
  65. package/dist/chunk-MRWGWKA2.mjs +1076 -0
  66. package/dist/chunk-MRWGWKA2.mjs.br +0 -0
  67. package/dist/chunk-MRWGWKA2.mjs.gz +0 -0
  68. package/dist/{chunk-AVTH627G.mjs → chunk-R664EPDC.mjs} +4 -0
  69. package/dist/chunk-R664EPDC.mjs.br +0 -0
  70. package/dist/chunk-R664EPDC.mjs.gz +0 -0
  71. package/dist/{chunk-DW66NEST.js → chunk-SUZIFHXI.js} +187 -183
  72. package/dist/chunk-SUZIFHXI.js.br +0 -0
  73. package/dist/chunk-SUZIFHXI.js.gz +0 -0
  74. package/dist/{chunk-NGWA6L3N.js → chunk-T6V342NP.js} +448 -114
  75. package/dist/chunk-T6V342NP.js.br +0 -0
  76. package/dist/{chunk-NGWA6L3N.js.gz → chunk-T6V342NP.js.gz} +0 -0
  77. package/dist/{chunk-N4FLKADC.mjs → chunk-TMTQJAGK.mjs} +445 -115
  78. package/dist/chunk-TMTQJAGK.mjs.br +0 -0
  79. package/dist/{chunk-N4FLKADC.mjs.gz → chunk-TMTQJAGK.mjs.gz} +0 -0
  80. package/dist/{chunk-AYH6XSE7.mjs → chunk-TOOKJUPG.mjs} +1 -1
  81. package/dist/chunk-TOOKJUPG.mjs.br +0 -0
  82. package/dist/chunk-TOOKJUPG.mjs.gz +0 -0
  83. package/dist/chunk-YQQXFRZT.js +1160 -0
  84. package/dist/chunk-YQQXFRZT.js.br +0 -0
  85. package/dist/chunk-YQQXFRZT.js.gz +0 -0
  86. package/dist/i18n/de.cjs +4 -0
  87. package/dist/i18n/de.cjs.br +0 -0
  88. package/dist/i18n/de.cjs.gz +0 -0
  89. package/dist/i18n/de.mjs +4 -0
  90. package/dist/i18n/de.mjs.br +0 -0
  91. package/dist/i18n/de.mjs.gz +0 -0
  92. package/dist/i18n/es.cjs +4 -0
  93. package/dist/i18n/es.cjs.br +0 -0
  94. package/dist/i18n/es.cjs.gz +0 -0
  95. package/dist/i18n/es.mjs +4 -0
  96. package/dist/i18n/es.mjs.br +0 -0
  97. package/dist/i18n/es.mjs.gz +0 -0
  98. package/dist/i18n/fr.cjs +4 -0
  99. package/dist/i18n/fr.cjs.br +0 -0
  100. package/dist/i18n/fr.cjs.gz +0 -0
  101. package/dist/i18n/fr.mjs +4 -0
  102. package/dist/i18n/fr.mjs.br +0 -0
  103. package/dist/i18n/fr.mjs.gz +0 -0
  104. package/dist/i18n/zh-CN.cjs +4 -0
  105. package/dist/i18n/zh-CN.cjs.br +0 -0
  106. package/dist/i18n/zh-CN.cjs.gz +0 -0
  107. package/dist/i18n/zh-CN.mjs +4 -0
  108. package/dist/i18n/zh-CN.mjs.br +0 -0
  109. package/dist/i18n/zh-CN.mjs.gz +0 -0
  110. package/dist/i18n.js +4 -4
  111. package/dist/i18n.js.br +0 -0
  112. package/dist/i18n.js.gz +0 -0
  113. package/dist/i18n.mjs +1 -1
  114. package/dist/i18n.mjs.br +0 -0
  115. package/dist/i18n.mjs.gz +0 -0
  116. package/dist/index.d.ts +60 -2
  117. package/dist/index.js +48 -48
  118. package/dist/index.js.br +0 -0
  119. package/dist/index.js.gz +0 -0
  120. package/dist/index.mjs +6 -6
  121. package/dist/index.mjs.br +0 -0
  122. package/dist/index.mjs.gz +0 -0
  123. package/dist/internals.d.ts +75 -43
  124. package/dist/internals.js +105 -105
  125. package/dist/internals.js.br +0 -0
  126. package/dist/internals.js.gz +0 -0
  127. package/dist/internals.mjs +4 -4
  128. package/dist/internals.mjs.br +0 -0
  129. package/dist/internals.mjs.gz +0 -0
  130. package/dist/viewer/index.d.ts +70 -6
  131. package/dist/viewer/index.js +27 -27
  132. package/dist/viewer/index.js.br +0 -0
  133. package/dist/viewer/index.js.gz +0 -0
  134. package/dist/viewer/index.mjs +6 -6
  135. package/dist/viewer/index.mjs.br +0 -0
  136. package/dist/viewer/index.mjs.gz +0 -0
  137. package/dist/{y-webrtc-TAJBJIKH.js → y-webrtc-6H3ROPRC.js} +1079 -128
  138. package/dist/y-webrtc-6H3ROPRC.js.br +0 -0
  139. package/dist/y-webrtc-6H3ROPRC.js.gz +0 -0
  140. package/dist/{y-webrtc-7DLWG3LJ.mjs → y-webrtc-XJDH2YTR.mjs} +984 -33
  141. package/dist/y-webrtc-XJDH2YTR.mjs.br +0 -0
  142. package/dist/y-webrtc-XJDH2YTR.mjs.gz +0 -0
  143. package/dist/{y-websocket-YRPS7AFF.js → y-websocket-6ISNPON7.js} +79 -80
  144. package/dist/y-websocket-6ISNPON7.js.br +0 -0
  145. package/dist/y-websocket-6ISNPON7.js.gz +0 -0
  146. package/dist/{y-websocket-HUEA7LH7.mjs → y-websocket-SJ3NCLBZ.mjs} +3 -4
  147. package/dist/y-websocket-SJ3NCLBZ.mjs.br +0 -0
  148. package/dist/y-websocket-SJ3NCLBZ.mjs.gz +0 -0
  149. package/package.json +7 -4
  150. package/dist/AiChatPanel-NBKG2CWE.js.br +0 -0
  151. package/dist/AiChatPanel-NBKG2CWE.js.gz +0 -0
  152. package/dist/AiChatPanel-OXCJVBUS.mjs.br +0 -0
  153. package/dist/AiChatPanel-OXCJVBUS.mjs.gz +0 -0
  154. package/dist/Area3DChartScene-5M3LEY6M.mjs.br +0 -0
  155. package/dist/Area3DChartScene-5M3LEY6M.mjs.gz +0 -0
  156. package/dist/Area3DChartScene-7QPDPVR6.js.gz +0 -0
  157. package/dist/Bar3DChartScene-NNSTLO4V.mjs.br +0 -0
  158. package/dist/Bar3DChartScene-NNSTLO4V.mjs.gz +0 -0
  159. package/dist/Bar3DChartScene-TAMPS6ZS.js.br +0 -0
  160. package/dist/Bar3DChartScene-TAMPS6ZS.js.gz +0 -0
  161. package/dist/Line3DChartScene-7S2DD45T.mjs.br +0 -0
  162. package/dist/Line3DChartScene-7S2DD45T.mjs.gz +0 -0
  163. package/dist/Line3DChartScene-T4SH37NU.js.br +0 -0
  164. package/dist/Line3DChartScene-T4SH37NU.js.gz +0 -0
  165. package/dist/Model3DScene-CXRM7D3J.mjs.br +0 -0
  166. package/dist/Model3DScene-CXRM7D3J.mjs.gz +0 -0
  167. package/dist/Model3DScene-IDRM7EZD.js.br +0 -0
  168. package/dist/Model3DScene-IDRM7EZD.js.gz +0 -0
  169. package/dist/PieChart3DScene-66Y5UP64.js.gz +0 -0
  170. package/dist/PieChart3DScene-VSCSEY2G.mjs.br +0 -0
  171. package/dist/PieChart3DScene-VSCSEY2G.mjs.gz +0 -0
  172. package/dist/SurfaceChart3DScene-6J4A6XUH.js.gz +0 -0
  173. package/dist/SurfaceChart3DScene-NSHDK657.mjs.br +0 -0
  174. package/dist/SurfaceChart3DScene-NSHDK657.mjs.gz +0 -0
  175. package/dist/chunk-2IBDKMY2.mjs.br +0 -0
  176. package/dist/chunk-2IBDKMY2.mjs.gz +0 -0
  177. package/dist/chunk-5PDGHTRJ.mjs.br +0 -0
  178. package/dist/chunk-5PDGHTRJ.mjs.gz +0 -0
  179. package/dist/chunk-7SFA4A2E.js.br +0 -0
  180. package/dist/chunk-7SFA4A2E.js.gz +0 -0
  181. package/dist/chunk-AVTH627G.mjs.br +0 -0
  182. package/dist/chunk-AVTH627G.mjs.gz +0 -0
  183. package/dist/chunk-AYH6XSE7.mjs.br +0 -0
  184. package/dist/chunk-AYH6XSE7.mjs.gz +0 -0
  185. package/dist/chunk-DW66NEST.js.br +0 -0
  186. package/dist/chunk-DW66NEST.js.gz +0 -0
  187. package/dist/chunk-DWIIYEOG.mjs +0 -9596
  188. package/dist/chunk-DWIIYEOG.mjs.br +0 -0
  189. package/dist/chunk-DWIIYEOG.mjs.gz +0 -0
  190. package/dist/chunk-FE4L26FT.mjs.br +0 -0
  191. package/dist/chunk-FE4L26FT.mjs.gz +0 -0
  192. package/dist/chunk-FXGO5KLU.mjs +0 -304
  193. package/dist/chunk-FXGO5KLU.mjs.br +0 -0
  194. package/dist/chunk-FXGO5KLU.mjs.gz +0 -0
  195. package/dist/chunk-I5LPYESF.js.br +0 -0
  196. package/dist/chunk-I5LPYESF.js.gz +0 -0
  197. package/dist/chunk-N4FLKADC.mjs.br +0 -0
  198. package/dist/chunk-NB7M4XBG.js +0 -318
  199. package/dist/chunk-NB7M4XBG.js.br +0 -0
  200. package/dist/chunk-NB7M4XBG.js.gz +0 -0
  201. package/dist/chunk-NGWA6L3N.js.br +0 -0
  202. package/dist/chunk-W3RBIIZW.js.br +0 -0
  203. package/dist/chunk-W3RBIIZW.js.gz +0 -0
  204. package/dist/chunk-WRXXPCZ7.js.br +0 -0
  205. package/dist/chunk-WRXXPCZ7.js.gz +0 -0
  206. package/dist/chunk-ZYQT7I5C.js +0 -9743
  207. package/dist/chunk-ZYQT7I5C.js.br +0 -0
  208. package/dist/chunk-ZYQT7I5C.js.gz +0 -0
  209. package/dist/y-webrtc-7DLWG3LJ.mjs.br +0 -0
  210. package/dist/y-webrtc-7DLWG3LJ.mjs.gz +0 -0
  211. package/dist/y-webrtc-TAJBJIKH.js.br +0 -0
  212. package/dist/y-webrtc-TAJBJIKH.js.gz +0 -0
  213. package/dist/y-websocket-HUEA7LH7.mjs.br +0 -0
  214. package/dist/y-websocket-HUEA7LH7.mjs.gz +0 -0
  215. package/dist/y-websocket-YRPS7AFF.js.br +0 -0
  216. package/dist/y-websocket-YRPS7AFF.js.gz +0 -0
  217. package/dist/yjs-4ED7E5CZ.mjs +0 -2
  218. package/dist/yjs-4ED7E5CZ.mjs.br +0 -0
  219. package/dist/yjs-4ED7E5CZ.mjs.gz +0 -0
  220. package/dist/yjs-OWUA3UHD.js +0 -419
  221. package/dist/yjs-OWUA3UHD.js.br +0 -0
  222. package/dist/yjs-OWUA3UHD.js.gz +0 -0
@@ -138592,6 +138592,7 @@ var GroupElementProcessor = class {
138592
138592
  return children13.join("\n\n");
138593
138593
  }
138594
138594
  };
138595
+ init_blob_url_to_data_url();
138595
138596
  init_type_guards();
138596
138597
  var ImageElementProcessor = class {
138597
138598
  supportedTypes = ["image", "picture"];
@@ -138632,14 +138633,37 @@ var ImageElementProcessor = class {
138632
138633
  return { w: maxW, h: Math.round(origH * scale2) };
138633
138634
  }
138634
138635
  async extractImage(imageElement, ctx) {
138635
- if (imageElement.imageData && imageElement.imageData.startsWith("data:")) {
138636
- return await ctx.mediaContext.saveImage(imageElement.imageData, `slide${ctx.slideNumber}`);
138636
+ const imageData = await this.resolveToDataUrl(imageElement.imageData, "image/png");
138637
+ if (imageData) {
138638
+ return await ctx.mediaContext.saveImage(imageData, `slide${ctx.slideNumber}`);
138637
138639
  }
138638
- if (imageElement.svgData && imageElement.svgData.startsWith("data:")) {
138639
- return await ctx.mediaContext.saveImage(imageElement.svgData, `slide${ctx.slideNumber}`);
138640
+ const svgData = await this.resolveToDataUrl(imageElement.svgData, "image/svg+xml");
138641
+ if (svgData) {
138642
+ return await ctx.mediaContext.saveImage(svgData, `slide${ctx.slideNumber}`);
138640
138643
  }
138641
138644
  return null;
138642
138645
  }
138646
+ /**
138647
+ * Accepts an already-decoded `data:` URI as-is. A `blob:` URL (e.g. a
138648
+ * Node `blob:nodedata:...` Object URL minted by `eagerDecodeImages` in a
138649
+ * non-browser runtime) is re-fetched and re-encoded, since only its own
138650
+ * process can resolve it and it would otherwise never satisfy the
138651
+ * `data:` check below. Anything else (undefined, an unresolved relative
138652
+ * path) is not extractable.
138653
+ */
138654
+ async resolveToDataUrl(value, fallbackMimeType) {
138655
+ if (!value) {
138656
+ return void 0;
138657
+ }
138658
+ if (value.startsWith("data:")) {
138659
+ return value;
138660
+ }
138661
+ if (value.startsWith("blob:")) {
138662
+ const resolved = await blobUrlToDataUrl(value, fallbackMimeType);
138663
+ return resolved.startsWith("data:") ? resolved : void 0;
138664
+ }
138665
+ return void 0;
138666
+ }
138643
138667
  /** Clean and truncate image alt text for readable markdown output. */
138644
138668
  sanitiseAltText(raw) {
138645
138669
  if (!raw) {
@@ -155049,17 +155073,17 @@ function buildCartesianViewModel(element, chartData, categoryLabels, kind) {
155049
155073
  (axis) => axis.axisType === "valAx" && axis.axPos !== "r"
155050
155074
  );
155051
155075
  const primaryRange = isStacked ? {
155052
- ...stackedRange(chartData, catCount, isPercent, layout.plotHeight),
155076
+ ...stackedRange(chartData, catCount, isPercent, layout.autoPlotHeight),
155053
155077
  ...primaryAxis?.orientation === "maxMin" ? { reverseOrder: true } : {}
155054
155078
  } : computeValueRangeForChart(
155055
155079
  primaryPlotSeries.length > 0 ? primaryPlotSeries : chartData.series,
155056
155080
  chartData.axes,
155057
- layout.plotHeight
155081
+ layout.autoPlotHeight
155058
155082
  );
155059
155083
  const secondaryRange = useSecondary && secondaryPlotSeries.length > 0 ? computeValueRangeForAxis(
155060
155084
  secondaryPlotSeries,
155061
155085
  chartData.axes?.find((axis) => axis.axisType === "valAx" && axis.axPos === "r"),
155062
- layout.plotHeight
155086
+ layout.autoPlotHeight
155063
155087
  ) : void 0;
155064
155088
  const axisRes = buildCartesianAxes(chartData, layout, primaryRange, secondaryRange, catCount);
155065
155089
  const zeroLine = primaryRange.logScale ? void 0 : buildZeroLine(primaryRange, layout);
@@ -155325,11 +155349,11 @@ function buildComboViewModel(element, chartData, categoryLabels) {
155325
155349
  const primaryAxisId = getPrimaryValueAxisId(chartData.axes);
155326
155350
  const primaryAxis = chartData.axes?.find((axis) => axis.axisId === primaryAxisId);
155327
155351
  const secondaryAxisFormatting = getSecondaryValueAxis(chartData.axes);
155328
- const primaryRange = computeValueRangeForAxis(primarySeries, primaryAxis, layout.plotHeight);
155352
+ const primaryRange = computeValueRangeForAxis(primarySeries, primaryAxis, layout.autoPlotHeight);
155329
155353
  const secondaryRange = secondary.length > 0 ? computeValueRangeForAxis(
155330
155354
  secondary.map((entry2) => entry2.series),
155331
155355
  secondaryAxisFormatting,
155332
- layout.plotHeight
155356
+ layout.autoPlotHeight
155333
155357
  ) : void 0;
155334
155358
  const primaryCategoryAxis2 = chartData.axes?.find(
155335
155359
  (axis) => (axis.axisType === "catAx" || axis.axisType === "dateAx") && axis.axisId === primaryAxis?.crossAxisId
@@ -156657,7 +156681,7 @@ function buildSurfaceWallPanels(cols, rows, cellSize, zScale, offsetX, offsetY,
156657
156681
  }
156658
156682
  function buildIsometricSurfaceViewModel(element, chartData, categoryLabels) {
156659
156683
  const layout = computePlotLayout(element.width, element.height, chartData, false);
156660
- const range = computeValueRange2(chartData.series, layout.plotHeight);
156684
+ const range = computeValueRange2(chartData.series, layout.autoPlotHeight);
156661
156685
  const catCount = Math.max(categoryLabels.length, 1);
156662
156686
  const seriesCount = chartData.series.length;
156663
156687
  const cols = Math.max(catCount - 1, 1);
@@ -156776,7 +156800,7 @@ function buildIsometricSurfaceViewModel(element, chartData, categoryLabels) {
156776
156800
  }
156777
156801
  function buildFlatSurfaceViewModel(element, chartData, categoryLabels) {
156778
156802
  const layout = computePlotLayout(element.width, element.height, chartData, false);
156779
- const range = computeValueRange2(chartData.series, layout.plotHeight);
156803
+ const range = computeValueRange2(chartData.series, layout.autoPlotHeight);
156780
156804
  const catCount = Math.max(categoryLabels.length, 1);
156781
156805
  const seriesCount = chartData.series.length;
156782
156806
  const cellW = layout.plotWidth / Math.max(catCount - 1, 1);
@@ -157664,6 +157688,7 @@ function computePlotLayout(elementWidth, elementHeight, chartData, hasAxes, opti
157664
157688
  const rowCount = options.dataTableRowCount ?? 1;
157665
157689
  plotBottom -= 14 + rowCount * 14;
157666
157690
  }
157691
+ const autoPlotHeight = Math.max(plotBottom - plotTop, 1);
157667
157692
  const plotLayout = manualLayoutOf(chartData, "plotArea"), manual = resolveManualLayoutRect(
157668
157693
  plotLayout,
157669
157694
  { width: svgWidth, height: svgHeight },
@@ -157688,7 +157713,8 @@ function computePlotLayout(elementWidth, elementHeight, chartData, hasAxes, opti
157688
157713
  plotRight: plotLeft + plotWidth,
157689
157714
  plotBottom: plotTop + plotHeight,
157690
157715
  plotWidth,
157691
- plotHeight
157716
+ plotHeight,
157717
+ autoPlotHeight
157692
157718
  };
157693
157719
  }
157694
157720
  var RADAR_RINGS = 4;
@@ -158554,7 +158580,7 @@ function buildWaterfallViewModel(element, chartData, categoryLabels) {
158554
158580
  const series = chartData.series[0];
158555
158581
  const values = series?.values ?? [];
158556
158582
  const steps = buildWaterfallSteps(values, series?.waterfallOptions);
158557
- const range = computeWaterfallRange(steps, layout.plotHeight);
158583
+ const range = computeWaterfallRange(steps, layout.autoPlotHeight);
158558
158584
  const catCount = Math.max(categoryLabels.length, values.length, 1);
158559
158585
  const barWidth = layout.plotWidth / catCount * 0.6;
158560
158586
  const gap = layout.plotWidth / catCount * 0.2;
@@ -159823,7 +159849,7 @@ function buildStackedDragGeometry(element, chartData, seriesIndex, pointIndex) {
159823
159849
  ), plots = computeStackedSeriesPlots(seriesValues, catCount, percent3), baseValue = plots[seriesIndex]?.base[pointIndex] ?? 0, otherAbsSum = seriesValues.reduce(
159824
159850
  (sum, values, si) => si === seriesIndex ? sum : sum + Math.abs(values[pointIndex] ?? 0),
159825
159851
  0
159826
- ), layoutOpts = computeLayoutOptions(chartData.axes, chartData.dataTable, chartData.series.length), layout = computePlotLayout(element.width, element.height, chartData, true, layoutOpts), range = percent3 ? { min: 0, max: 100, span: 100 } : computeStackedValueRange(chartData.series, catCount, layout.plotHeight);
159852
+ ), layoutOpts = computeLayoutOptions(chartData.axes, chartData.dataTable, chartData.series.length), layout = computePlotLayout(element.width, element.height, chartData, true, layoutOpts), range = percent3 ? { min: 0, max: 100, span: 100 } : computeStackedValueRange(chartData.series, catCount, layout.autoPlotHeight);
159827
159853
  return {
159828
159854
  range,
159829
159855
  plotTop: layout.plotTop,
@@ -173124,6 +173150,7 @@ var translationsEn = {
173124
173150
  "pptx.sections.addAfter": "Add Section After",
173125
173151
  // Notes
173126
173152
  "pptx.notes.title": "Notes",
173153
+ "pptx.notes.hasNotes": "(has notes)",
173127
173154
  "pptx.notes.slideN": "Slide {{n}}",
173128
173155
  "pptx.notes.noSlide": "No slide selected",
173129
173156
  "pptx.notes.clickToAddNotes": "Click to add notes",
@@ -173479,6 +173506,8 @@ var translationsEn = {
173479
173506
  "pptx.slideShow.subtitles": "Subtitles",
173480
173507
  // Record tab (camera overlay placeholders)
173481
173508
  "pptx.record.cameo": "Cameo",
173509
+ "pptx.record.manage": "Manage",
173510
+ "pptx.record.camera": "Camera",
173482
173511
  "pptx.record.clear": "Clear",
173483
173512
  "pptx.record.learnMore": "Learn More",
173484
173513
  "pptx.record.resetToCameo": "Reset to Cameo",
@@ -175588,6 +175617,7 @@ var translationsEn = {
175588
175617
  "pptx.textFormatting.paragraphBefore": "Paragraph Before",
175589
175618
  "pptx.textFormatting.textFlow": "Text Flow",
175590
175619
  "pptx.textProperties.advancedTextHeading": "Advanced Text",
175620
+ "pptx.textProperties.autoFitToShape": "Auto-fit text to shape",
175591
175621
  "pptx.textProperties.defaultFontOption": "Default ({{font}})",
175592
175622
  "pptx.textProperties.firstIndent": "First Indent",
175593
175623
  "pptx.textProperties.leftMargin": "Left Margin",
@@ -185705,105 +185735,90 @@ function presenceToCursors(presence, activeSlideIndex) {
185705
185735
  }
185706
185736
  return cursors;
185707
185737
  }
185708
- function zoomEqual(a, b) {
185709
- if (a === b) {
185710
- return true;
185711
- }
185712
- if (!a || !b) {
185713
- return false;
185714
- }
185715
- return a.scale === b.scale && a.originX === b.originX && a.originY === b.originY;
185716
- }
185717
- function pointerEqual(a, b) {
185718
- if (a === b) {
185719
- return true;
185720
- }
185721
- if (!a || !b) {
185722
- return false;
185723
- }
185724
- return a.tool === b.tool && a.x === b.x && a.y === b.y && a.color === b.color;
185725
- }
185726
- function presentationSnapshotsEqual(a, b) {
185727
- if (a === b) {
185728
- return true;
185729
- }
185730
- return a.slideIndex === b.slideIndex && a.buildStep === b.buildStep && a.blackout === b.blackout && a.paused === b.paused && a.elapsedMs === b.elapsedMs && a.caption === b.caption && a.subtitlesVisible === b.subtitlesVisible && a.inkMarkupVisible === b.inkMarkupVisible && a.inkStrokes === b.inkStrokes && zoomEqual(a.zoom, b.zoom) && pointerEqual(a.pointer, b.pointer);
185731
- }
185732
- function presenceEntriesEqual(a, b) {
185733
- if (a === b) {
185734
- return true;
185735
- }
185736
- return a.clientId === b.clientId && a.userName === b.userName && a.userColor === b.userColor && a.userAvatar === b.userAvatar && a.role === b.role && a.activeSlideIndex === b.activeSlideIndex && a.cursorX === b.cursorX && a.cursorY === b.cursorY && a.selectedElementId === b.selectedElementId;
185737
- }
185738
- function presenceListsEqual(a, b) {
185739
- if (a === b) {
185740
- return true;
185741
- }
185742
- if (a.length !== b.length) {
185743
- return false;
185738
+ function observeExternalCollaborationSession(session, onSnapshot) {
185739
+ let active2 = true;
185740
+ let subscribing = true;
185741
+ let previous;
185742
+ let unsubscribe;
185743
+ const notify = () => {
185744
+ if (!active2 || subscribing) {
185745
+ return;
185746
+ }
185747
+ const snapshot = session.getSnapshot();
185748
+ if (previous?.status === snapshot.status && previous.synced === snapshot.synced) {
185749
+ return;
185750
+ }
185751
+ previous = { status: snapshot.status, synced: snapshot.synced };
185752
+ onSnapshot(previous);
185753
+ };
185754
+ const dispose = () => {
185755
+ if (!active2) {
185756
+ return;
185757
+ }
185758
+ active2 = false;
185759
+ unsubscribe?.();
185760
+ };
185761
+ try {
185762
+ unsubscribe = session.subscribe(notify);
185763
+ subscribing = false;
185764
+ notify();
185765
+ } catch (error) {
185766
+ dispose();
185767
+ throw error;
185744
185768
  }
185745
- return a.every((entry2, index) => {
185746
- const other = b[index];
185747
- return other !== void 0 && presenceEntriesEqual(entry2, other);
185748
- });
185769
+ return dispose;
185749
185770
  }
185750
- function createPresenceProjector() {
185751
- let lastList = [];
185752
- let lastCursors = [];
185753
- let lastActiveSlideIndex;
185754
- let primed = false;
185771
+ function borrowExternalCollaborationAwareness(host) {
185772
+ let disposed = false;
185773
+ let ownsPresence = false;
185774
+ let hadPresence = false;
185775
+ let previousPresence;
185776
+ let lastPresence;
185777
+ const awareness = {
185778
+ clientID: host.clientID,
185779
+ getStates: () => host.getStates(),
185780
+ on: (event, callback) => host.on(event, callback),
185781
+ off: (event, callback) => host.off(event, callback),
185782
+ setLocalStateField: (field, value) => {
185783
+ if (disposed) {
185784
+ return;
185785
+ }
185786
+ const state = host.getLocalState();
185787
+ if (state === null) {
185788
+ return;
185789
+ }
185790
+ if (field === "presence") {
185791
+ if (!ownsPresence || state.presence !== lastPresence) {
185792
+ hadPresence = Object.hasOwn(state, "presence");
185793
+ previousPresence = state.presence;
185794
+ }
185795
+ lastPresence = value;
185796
+ ownsPresence = true;
185797
+ }
185798
+ host.setLocalStateField(field, value);
185799
+ }
185800
+ };
185755
185801
  return {
185756
- project(states, localClientId, canvasWidth, canvasHeight, localActiveSlideIndex, now) {
185757
- const list = derivePresenceList(
185758
- states,
185759
- localClientId,
185760
- canvasWidth,
185761
- canvasHeight,
185762
- now ?? Date.now()
185763
- );
185764
- if (primed && localActiveSlideIndex === lastActiveSlideIndex && presenceListsEqual(lastList, list)) {
185765
- return { list: lastList, cursors: lastCursors, changed: false };
185802
+ awareness,
185803
+ dispose: () => {
185804
+ if (disposed) {
185805
+ return;
185766
185806
  }
185767
- lastList = list;
185768
- lastCursors = presenceToCursors(list, localActiveSlideIndex);
185769
- lastActiveSlideIndex = localActiveSlideIndex;
185770
- primed = true;
185771
- return { list, cursors: lastCursors, changed: true };
185772
- },
185773
- reset() {
185774
- lastList = [];
185775
- lastCursors = [];
185776
- lastActiveSlideIndex = void 0;
185777
- primed = false;
185807
+ disposed = true;
185808
+ const current = host.getLocalState();
185809
+ if (!ownsPresence || current === null || current.presence !== lastPresence) {
185810
+ return;
185811
+ }
185812
+ const restored = { ...current };
185813
+ if (hadPresence) {
185814
+ restored.presence = previousPresence;
185815
+ } else {
185816
+ delete restored.presence;
185817
+ }
185818
+ host.setLocalState(restored);
185778
185819
  }
185779
185820
  };
185780
185821
  }
185781
- var DEFAULT_LOCAL_COLOR = "#6366f1";
185782
- function getUserInitials(name) {
185783
- const trimmed = name.trim(), parts = trimmed.split(/\s+/u).filter(Boolean), first = parts[0], last = parts[parts.length - 1];
185784
- if (parts.length >= 2 && first && last) {
185785
- return (first[0] + last[0]).toUpperCase();
185786
- }
185787
- return trimmed.slice(0, 2).toUpperCase();
185788
- }
185789
- function buildActiveSessionUsers(params) {
185790
- const local = {
185791
- id: "local",
185792
- name: params.localUserName,
185793
- initials: params.localUserInitials?.trim() ? params.localUserInitials.trim().slice(0, 2).toUpperCase() : getUserInitials(params.localUserName),
185794
- color: params.localUserColor ?? DEFAULT_LOCAL_COLOR,
185795
- isLocal: true
185796
- }, remote = params.remoteUsers.map((user) => ({
185797
- id: String(user.clientId),
185798
- name: user.userName,
185799
- initials: getUserInitials(user.userName),
185800
- color: user.userColor,
185801
- avatarUrl: user.userAvatar,
185802
- isLocal: false,
185803
- slideNumber: user.activeSlideIndex + 1
185804
- }));
185805
- return [local, ...remote];
185806
- }
185807
185822
  var YDOC_ASSETS_KEY = "pptx:assets";
185808
185823
  var ASSET_ELEMENT_FIELDS = /* @__PURE__ */ new Set([
185809
185824
  "mediaData",
@@ -186072,8 +186087,14 @@ function decodeDelta(delta) {
186072
186087
  } catch {
186073
186088
  }
186074
186089
  }
186075
- const isBreakMarker = op2.insert === "\n" && (a.pb === "1" || a.lb === "1");
186076
- if (!isBreakMarker && op2.insert !== "\u200B") {
186090
+ const isBreakMarker = /^\n+$/u.test(op2.insert) && (a.pb === "1" || a.lb === "1");
186091
+ if (isBreakMarker) {
186092
+ for (let index = 0; index < op2.insert.length; index++) {
186093
+ segments.push(structuredClone(seg));
186094
+ }
186095
+ continue;
186096
+ }
186097
+ if (op2.insert !== "\u200B") {
186077
186098
  seg.text = op2.insert;
186078
186099
  }
186079
186100
  segments.push(seg);
@@ -186399,9 +186420,6 @@ function observeYDocSlides(ydoc, onChange) {
186399
186420
  arr.observeDeep(onChange);
186400
186421
  return () => arr.unobserveDeep(onChange);
186401
186422
  }
186402
- function shouldAutoFollowBroadcaster(input) {
186403
- return input.localRole === "viewer" && input.broadcasterRole === "owner";
186404
- }
186405
186423
  function isYTextEditable(value) {
186406
186424
  return isYTextLike(value) && typeof value.delete === "function" && typeof value.format === "function";
186407
186425
  }
@@ -186674,6 +186692,231 @@ function reconcileSlidesInYDoc(slides, ydoc, factories, origin = LOCAL_SYNC_ORIG
186674
186692
  });
186675
186693
  }, origin);
186676
186694
  }
186695
+ function observeExternalCollaborationReadiness(session, options) {
186696
+ let active2 = true;
186697
+ let established = false;
186698
+ let awaitingJoin = options.sessionIntent === "join";
186699
+ let lastAdopted;
186700
+ let lastReadOnly;
186701
+ let unsubscribe;
186702
+ const canWrite = () => active2 && options.gate.isOpen() && session.getSnapshot().synced && options.role !== "viewer";
186703
+ const notifyReadOnly = () => {
186704
+ const readOnly = !canWrite();
186705
+ if (lastReadOnly !== readOnly) {
186706
+ lastReadOnly = readOnly;
186707
+ options.onReadOnlyChange?.(readOnly);
186708
+ }
186709
+ };
186710
+ const suspend = () => {
186711
+ options.gate.reset();
186712
+ options.livePatcher?.configure(null, null);
186713
+ options.onSuspend?.();
186714
+ notifyReadOnly();
186715
+ };
186716
+ const adopt = (slides) => {
186717
+ const serialized = JSON.stringify(slides);
186718
+ if (serialized !== lastAdopted) {
186719
+ lastAdopted = serialized;
186720
+ options.adoptSlides(slides);
186721
+ }
186722
+ };
186723
+ const refresh = () => {
186724
+ if (!active2) {
186725
+ return;
186726
+ }
186727
+ const snapshot = session.getSnapshot();
186728
+ options.onStatus(snapshot.status);
186729
+ if (!snapshot.synced) {
186730
+ suspend();
186731
+ return;
186732
+ }
186733
+ if (options.gate.isOpen()) {
186734
+ return;
186735
+ }
186736
+ lastAdopted = void 0;
186737
+ const slides = readSlidesFromYDoc(session.doc);
186738
+ if (slides.length > 0) {
186739
+ established = true;
186740
+ awaitingJoin = false;
186741
+ adopt(slides);
186742
+ } else if (established) {
186743
+ adopt(slides);
186744
+ } else if (awaitingJoin) {
186745
+ suspend();
186746
+ return;
186747
+ }
186748
+ options.livePatcher?.configure(
186749
+ options.role === "viewer" ? null : session.doc,
186750
+ options.role === "viewer" ? null : options.factories,
186751
+ // The host owns readiness, so accepted edits cannot wait in our timer.
186752
+ true
186753
+ );
186754
+ options.gate.open();
186755
+ notifyReadOnly();
186756
+ options.onReady?.({ seedEmptyRoom: slides.length === 0 && !established });
186757
+ };
186758
+ const unobserve = observeYDocSlides(session.doc, (_events, transaction) => {
186759
+ if (!active2 || !session.getSnapshot().synced) {
186760
+ return;
186761
+ }
186762
+ const slides = readSlidesFromYDoc(session.doc);
186763
+ if (slides.length > 0) {
186764
+ established = true;
186765
+ awaitingJoin = false;
186766
+ }
186767
+ if (transaction?.origin === LOCAL_SYNC_ORIGIN) {
186768
+ lastAdopted = JSON.stringify(slides);
186769
+ return;
186770
+ }
186771
+ if (!options.gate.isOpen()) {
186772
+ refresh();
186773
+ } else if (slides.length > 0 || established) {
186774
+ adopt(slides);
186775
+ }
186776
+ });
186777
+ const dispose = () => {
186778
+ if (!active2) {
186779
+ return;
186780
+ }
186781
+ active2 = false;
186782
+ unsubscribe?.();
186783
+ unobserve();
186784
+ suspend();
186785
+ };
186786
+ try {
186787
+ unsubscribe = observeExternalCollaborationSession(session, refresh);
186788
+ } catch (error) {
186789
+ dispose();
186790
+ throw error;
186791
+ }
186792
+ return Object.assign(dispose, {
186793
+ refresh,
186794
+ canWrite,
186795
+ handleLoad: (origin) => {
186796
+ if (!active2) {
186797
+ return false;
186798
+ }
186799
+ if (origin === "user") {
186800
+ awaitingJoin = false;
186801
+ refresh();
186802
+ } else if (session.getSnapshot().synced) {
186803
+ const slides = readSlidesFromYDoc(session.doc);
186804
+ if (slides.length > 0) {
186805
+ lastAdopted = void 0;
186806
+ adopt(slides);
186807
+ return true;
186808
+ }
186809
+ }
186810
+ return false;
186811
+ },
186812
+ allowLocalLoad: () => {
186813
+ awaitingJoin = false;
186814
+ refresh();
186815
+ }
186816
+ });
186817
+ }
186818
+ function zoomEqual(a, b) {
186819
+ if (a === b) {
186820
+ return true;
186821
+ }
186822
+ if (!a || !b) {
186823
+ return false;
186824
+ }
186825
+ return a.scale === b.scale && a.originX === b.originX && a.originY === b.originY;
186826
+ }
186827
+ function pointerEqual(a, b) {
186828
+ if (a === b) {
186829
+ return true;
186830
+ }
186831
+ if (!a || !b) {
186832
+ return false;
186833
+ }
186834
+ return a.tool === b.tool && a.x === b.x && a.y === b.y && a.color === b.color;
186835
+ }
186836
+ function presentationSnapshotsEqual(a, b) {
186837
+ if (a === b) {
186838
+ return true;
186839
+ }
186840
+ return a.slideIndex === b.slideIndex && a.buildStep === b.buildStep && a.blackout === b.blackout && a.paused === b.paused && a.elapsedMs === b.elapsedMs && a.caption === b.caption && a.subtitlesVisible === b.subtitlesVisible && a.inkMarkupVisible === b.inkMarkupVisible && a.inkStrokes === b.inkStrokes && zoomEqual(a.zoom, b.zoom) && pointerEqual(a.pointer, b.pointer);
186841
+ }
186842
+ function presenceEntriesEqual(a, b) {
186843
+ if (a === b) {
186844
+ return true;
186845
+ }
186846
+ return a.clientId === b.clientId && a.userName === b.userName && a.userColor === b.userColor && a.userAvatar === b.userAvatar && a.role === b.role && a.activeSlideIndex === b.activeSlideIndex && a.cursorX === b.cursorX && a.cursorY === b.cursorY && a.selectedElementId === b.selectedElementId;
186847
+ }
186848
+ function presenceListsEqual(a, b) {
186849
+ if (a === b) {
186850
+ return true;
186851
+ }
186852
+ if (a.length !== b.length) {
186853
+ return false;
186854
+ }
186855
+ return a.every((entry2, index) => {
186856
+ const other = b[index];
186857
+ return other !== void 0 && presenceEntriesEqual(entry2, other);
186858
+ });
186859
+ }
186860
+ function createPresenceProjector() {
186861
+ let lastList = [];
186862
+ let lastCursors = [];
186863
+ let lastActiveSlideIndex;
186864
+ let primed = false;
186865
+ return {
186866
+ project(states, localClientId, canvasWidth, canvasHeight, localActiveSlideIndex, now) {
186867
+ const list = derivePresenceList(
186868
+ states,
186869
+ localClientId,
186870
+ canvasWidth,
186871
+ canvasHeight,
186872
+ now ?? Date.now()
186873
+ );
186874
+ if (primed && localActiveSlideIndex === lastActiveSlideIndex && presenceListsEqual(lastList, list)) {
186875
+ return { list: lastList, cursors: lastCursors, changed: false };
186876
+ }
186877
+ lastList = list;
186878
+ lastCursors = presenceToCursors(list, localActiveSlideIndex);
186879
+ lastActiveSlideIndex = localActiveSlideIndex;
186880
+ primed = true;
186881
+ return { list, cursors: lastCursors, changed: true };
186882
+ },
186883
+ reset() {
186884
+ lastList = [];
186885
+ lastCursors = [];
186886
+ lastActiveSlideIndex = void 0;
186887
+ primed = false;
186888
+ }
186889
+ };
186890
+ }
186891
+ var DEFAULT_LOCAL_COLOR = "#6366f1";
186892
+ function getUserInitials(name) {
186893
+ const trimmed = name.trim(), parts = trimmed.split(/\s+/u).filter(Boolean), first = parts[0], last = parts[parts.length - 1];
186894
+ if (parts.length >= 2 && first && last) {
186895
+ return (first[0] + last[0]).toUpperCase();
186896
+ }
186897
+ return trimmed.slice(0, 2).toUpperCase();
186898
+ }
186899
+ function buildActiveSessionUsers(params) {
186900
+ const local = {
186901
+ id: "local",
186902
+ name: params.localUserName,
186903
+ initials: params.localUserInitials?.trim() ? params.localUserInitials.trim().slice(0, 2).toUpperCase() : getUserInitials(params.localUserName),
186904
+ color: params.localUserColor ?? DEFAULT_LOCAL_COLOR,
186905
+ isLocal: true
186906
+ }, remote = params.remoteUsers.map((user) => ({
186907
+ id: String(user.clientId),
186908
+ name: user.userName,
186909
+ initials: getUserInitials(user.userName),
186910
+ color: user.userColor,
186911
+ avatarUrl: user.userAvatar,
186912
+ isLocal: false,
186913
+ slideNumber: user.activeSlideIndex + 1
186914
+ }));
186915
+ return [local, ...remote];
186916
+ }
186917
+ function shouldAutoFollowBroadcaster(input) {
186918
+ return input.localRole === "viewer" && input.broadcasterRole === "owner";
186919
+ }
186677
186920
  var GEOMETRY_KEYS = ["x", "y", "width", "height", "rotation"];
186678
186921
  var MAX_LIVE_TEXT_LENGTH = 1e5;
186679
186922
  var asMap = (value) => typeof value === "object" && value !== null && typeof value.get === "function" ? value : void 0;
@@ -186731,6 +186974,7 @@ function createCollaborationLivePatcher(options = {}) {
186731
186974
  let factories = null;
186732
186975
  let timer = null;
186733
186976
  let lastWriteAt = Number.NEGATIVE_INFINITY;
186977
+ let immediate = false;
186734
186978
  const cancelTimer = () => {
186735
186979
  if (timer !== null) {
186736
186980
  clearTimeout(timer);
@@ -186757,6 +187001,10 @@ function createCollaborationLivePatcher(options = {}) {
186757
187001
  }
186758
187002
  };
186759
187003
  const schedule = () => {
187004
+ if (immediate) {
187005
+ writePending();
187006
+ return;
187007
+ }
186760
187008
  if (timer !== null) {
186761
187009
  return;
186762
187010
  }
@@ -186783,14 +187031,15 @@ function createCollaborationLivePatcher(options = {}) {
186783
187031
  return entry2;
186784
187032
  };
186785
187033
  return {
186786
- configure(nextDoc, nextFactories) {
186787
- if (nextDoc === doc && nextFactories === factories) {
187034
+ configure(nextDoc, nextFactories, nextImmediate = false) {
187035
+ if (nextDoc === doc && nextFactories === factories && nextImmediate === immediate) {
186788
187036
  return;
186789
187037
  }
186790
187038
  cancelTimer();
186791
187039
  pending.clear();
186792
187040
  doc = nextDoc;
186793
187041
  factories = nextFactories;
187042
+ immediate = nextImmediate;
186794
187043
  lastWriteAt = Number.NEGATIVE_INFINITY;
186795
187044
  },
186796
187045
  isActive() {
@@ -186917,7 +187166,10 @@ function registerCollaborationTeardown(options) {
186917
187166
  doLeave();
186918
187167
  };
186919
187168
  const onBeforeUnload = () => {
186920
- doLeave();
187169
+ const allowed = typeof options.leaveOnBeforeUnload === "function" ? options.leaveOnBeforeUnload() : options.leaveOnBeforeUnload !== false;
187170
+ if (allowed) {
187171
+ doLeave();
187172
+ }
186921
187173
  };
186922
187174
  const onPageShow = (event) => {
186923
187175
  if (event.persisted !== true || !left || !rejoin) {
@@ -187016,6 +187268,84 @@ function createDepartureChannel(roomId, awareness, factory) {
187016
187268
  }
187017
187269
  };
187018
187270
  }
187271
+ var DEFAULT_DEBOUNCE_MS = 5e3;
187272
+ function createWriteBackScheduler(deps) {
187273
+ let timer = null;
187274
+ let generation = 0;
187275
+ let unsubscribe = null;
187276
+ function cancel() {
187277
+ generation++;
187278
+ unsubscribe?.();
187279
+ unsubscribe = null;
187280
+ if (timer !== null) {
187281
+ clearTimeout(timer);
187282
+ timer = null;
187283
+ }
187284
+ }
187285
+ function schedule(config) {
187286
+ const isReady = () => config.externalSession?.getSnapshot().synced ?? true;
187287
+ if (!config.onWriteBack || config.role !== "owner" || !deps.getYDoc()) {
187288
+ return;
187289
+ }
187290
+ cancel();
187291
+ if (!isReady()) {
187292
+ return;
187293
+ }
187294
+ const token2 = generation;
187295
+ if (config.externalSession) {
187296
+ const detach2 = config.externalSession.subscribe(() => {
187297
+ if (!isReady()) {
187298
+ cancel();
187299
+ }
187300
+ });
187301
+ if (token2 !== generation || !isReady()) {
187302
+ detach2();
187303
+ return;
187304
+ }
187305
+ unsubscribe = detach2;
187306
+ }
187307
+ const debounceMs = config.writeBackDebounceMs ?? DEFAULT_DEBOUNCE_MS;
187308
+ timer = setTimeout(async () => {
187309
+ timer = null;
187310
+ const ydoc = deps.getYDoc();
187311
+ const isCurrent = () => token2 === generation && isReady() && deps.getYDoc() === ydoc;
187312
+ try {
187313
+ if (!ydoc || !config.onWriteBack || !isReady()) {
187314
+ return;
187315
+ }
187316
+ if (deps.serialize) {
187317
+ const bytes2 = await deps.serialize(isCurrent);
187318
+ if (bytes2 && isCurrent()) {
187319
+ await config.onWriteBack(bytes2);
187320
+ }
187321
+ return;
187322
+ }
187323
+ const sourceBytes = deps.getSourceBytes?.();
187324
+ if (!sourceBytes) {
187325
+ return;
187326
+ }
187327
+ const handler = new exports.PptxHandler();
187328
+ await handler.load(sourceBytes.buffer);
187329
+ if (!isCurrent()) {
187330
+ return;
187331
+ }
187332
+ const slides = readSlidesFromYDoc(ydoc);
187333
+ const merged = deps.mergeTemplateElements ? deps.mergeTemplateElements(slides, deps.getTemplateElements?.() ?? {}) : slides;
187334
+ const bytes = await handler.save(merged, deps.getSaveOptions?.());
187335
+ if (isCurrent()) {
187336
+ await config.onWriteBack(bytes);
187337
+ }
187338
+ } catch {
187339
+ } finally {
187340
+ if (token2 === generation) {
187341
+ unsubscribe?.();
187342
+ unsubscribe = null;
187343
+ }
187344
+ }
187345
+ }, debounceMs);
187346
+ }
187347
+ return { schedule, cancel };
187348
+ }
187019
187349
  var POSITION_THRESHOLD = 2;
187020
187350
  var SIZE_THRESHOLD = 2;
187021
187351
  function getElementText(element) {
@@ -207972,6 +208302,7 @@ exports.beginChartValueDrag = beginChartValueDrag;
207972
208302
  exports.beginShapeAdjustment = beginShapeAdjustment;
207973
208303
  exports.bindInlineListParagraph = bindInlineListParagraph;
207974
208304
  exports.bindInlineListRun = bindInlineListRun;
208305
+ exports.borrowExternalCollaborationAwareness = borrowExternalCollaborationAwareness;
207975
208306
  exports.bringForward = bringForward;
207976
208307
  exports.bringToFront = bringToFront;
207977
208308
  exports.build3DExtrusionData = build3DExtrusionData;
@@ -208174,6 +208505,7 @@ exports.createTouchGestureRecognizer = createTouchGestureRecognizer;
208174
208505
  exports.createViewerOptionsStore = createViewerOptionsStore;
208175
208506
  exports.createViewerZoomStore = createViewerZoomStore;
208176
208507
  exports.createWheelStepBuffer = createWheelStepBuffer;
208508
+ exports.createWriteBackScheduler = createWriteBackScheduler;
208177
208509
  exports.cursorForTool = cursorForTool;
208178
208510
  exports.customGeometryPathsToSvgSubpaths = customGeometryPathsToSvgSubpaths;
208179
208511
  exports.defaultCssVars = defaultCssVars;
@@ -208452,6 +208784,8 @@ exports.normalizeHexColor = normalizeHexColor2;
208452
208784
  exports.normalizeStrokeDashType = normalizeStrokeDashType;
208453
208785
  exports.normalizeTableStyleGuid = normalizeTableStyleGuid;
208454
208786
  exports.notesSegmentsToSpans = notesSegmentsToSpans;
208787
+ exports.observeExternalCollaborationReadiness = observeExternalCollaborationReadiness;
208788
+ exports.observeExternalCollaborationSession = observeExternalCollaborationSession;
208455
208789
  exports.observeYDocSlides = observeYDocSlides;
208456
208790
  exports.ooxmlGradientAngleToCssDegrees = ooxmlGradientAngleToCssDegrees;
208457
208791
  exports.openNativeEyeDropper = openNativeEyeDropper;