pptx-react-viewer 2.12.0 → 2.13.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 (122) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/{AiChatPanel-CS4CONUO.mjs → AiChatPanel-4YS6DEIT.mjs} +4 -4
  3. package/dist/AiChatPanel-4YS6DEIT.mjs.br +0 -0
  4. package/dist/AiChatPanel-4YS6DEIT.mjs.gz +0 -0
  5. package/dist/{AiChatPanel-JIXSOZXN.js → AiChatPanel-DEI3EQFM.js} +23 -23
  6. package/dist/AiChatPanel-DEI3EQFM.js.br +0 -0
  7. package/dist/AiChatPanel-DEI3EQFM.js.gz +0 -0
  8. package/dist/{Model3DScene-RWFPSN6B.mjs → Model3DScene-JSNQCKCJ.mjs} +1 -1
  9. package/dist/Model3DScene-JSNQCKCJ.mjs.br +0 -0
  10. package/dist/Model3DScene-JSNQCKCJ.mjs.gz +0 -0
  11. package/dist/{Model3DScene-5KMJ4JL6.js → Model3DScene-X4W7GZVY.js} +2 -2
  12. package/dist/Model3DScene-X4W7GZVY.js.br +0 -0
  13. package/dist/Model3DScene-X4W7GZVY.js.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-2GZQM3LN.mjs → SurfaceChart3DScene-3MSU74YH.mjs} +1 -1
  15. package/dist/{SurfaceChart3DScene-2GZQM3LN.mjs.br → SurfaceChart3DScene-3MSU74YH.mjs.br} +0 -0
  16. package/dist/SurfaceChart3DScene-3MSU74YH.mjs.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-BIOKIETC.js → SurfaceChart3DScene-IZLUWT27.js} +2 -2
  18. package/dist/SurfaceChart3DScene-IZLUWT27.js.br +0 -0
  19. package/dist/SurfaceChart3DScene-IZLUWT27.js.gz +0 -0
  20. package/dist/{chunk-QGHC65C4.mjs → chunk-4TD7EINA.mjs} +1071 -375
  21. package/dist/chunk-4TD7EINA.mjs.br +0 -0
  22. package/dist/chunk-4TD7EINA.mjs.gz +0 -0
  23. package/dist/{chunk-AOED5MFM.mjs → chunk-6KRNQ2KF.mjs} +13 -12
  24. package/dist/chunk-6KRNQ2KF.mjs.br +0 -0
  25. package/dist/chunk-6KRNQ2KF.mjs.gz +0 -0
  26. package/dist/{chunk-3GNSGGY2.js → chunk-BXAK3JFM.js} +13 -0
  27. package/dist/chunk-BXAK3JFM.js.br +0 -0
  28. package/dist/chunk-BXAK3JFM.js.gz +0 -0
  29. package/dist/{chunk-PJUQQF3I.js → chunk-EFSQW6S5.js} +1091 -376
  30. package/dist/chunk-EFSQW6S5.js.br +0 -0
  31. package/dist/chunk-EFSQW6S5.js.gz +0 -0
  32. package/dist/{chunk-ZIXSSQAZ.js → chunk-G2LZT5SV.js} +3 -3
  33. package/dist/chunk-G2LZT5SV.js.br +0 -0
  34. package/dist/chunk-G2LZT5SV.js.gz +0 -0
  35. package/dist/{chunk-CEUHGUZ4.mjs → chunk-HRLF4REI.mjs} +54 -28
  36. package/dist/chunk-HRLF4REI.mjs.br +0 -0
  37. package/dist/chunk-HRLF4REI.mjs.gz +0 -0
  38. package/dist/{chunk-2VUHJNWM.js → chunk-IDW5UPXW.js} +292 -266
  39. package/dist/chunk-IDW5UPXW.js.br +0 -0
  40. package/dist/chunk-IDW5UPXW.js.gz +0 -0
  41. package/dist/{chunk-PTGTFXPU.js → chunk-RWIQHVZQ.js} +341 -340
  42. package/dist/chunk-RWIQHVZQ.js.br +0 -0
  43. package/dist/chunk-RWIQHVZQ.js.gz +0 -0
  44. package/dist/{chunk-SP7U34QM.js → chunk-SHZ3GWOD.js} +2004 -1943
  45. package/dist/chunk-SHZ3GWOD.js.br +0 -0
  46. package/dist/chunk-SHZ3GWOD.js.gz +0 -0
  47. package/dist/{chunk-ECDKYPQ2.mjs → chunk-TEXIGSA6.mjs} +13 -0
  48. package/dist/chunk-TEXIGSA6.mjs.br +0 -0
  49. package/dist/chunk-TEXIGSA6.mjs.gz +0 -0
  50. package/dist/{chunk-EJRHYYKE.mjs → chunk-WEU5EMKK.mjs} +1 -1
  51. package/dist/chunk-WEU5EMKK.mjs.br +0 -0
  52. package/dist/chunk-WEU5EMKK.mjs.gz +0 -0
  53. package/dist/{chunk-BJQSHVYH.mjs → chunk-YA7VFYTW.mjs} +271 -210
  54. package/dist/chunk-YA7VFYTW.mjs.br +0 -0
  55. package/dist/chunk-YA7VFYTW.mjs.gz +0 -0
  56. package/dist/i18n.js +4 -4
  57. package/dist/i18n.js.br +0 -0
  58. package/dist/i18n.js.gz +0 -0
  59. package/dist/i18n.mjs +1 -1
  60. package/dist/i18n.mjs.br +0 -0
  61. package/dist/i18n.mjs.gz +0 -0
  62. package/dist/index.d.ts +18 -0
  63. package/dist/index.js +36 -36
  64. package/dist/index.js.br +0 -0
  65. package/dist/index.js.gz +0 -0
  66. package/dist/index.mjs +6 -6
  67. package/dist/index.mjs.br +0 -0
  68. package/dist/index.mjs.gz +0 -0
  69. package/dist/internals.d.ts +18 -0
  70. package/dist/internals.d.ts.map +1 -1
  71. package/dist/internals.js +79 -79
  72. package/dist/internals.js.br +0 -0
  73. package/dist/internals.js.gz +0 -0
  74. package/dist/internals.mjs +4 -4
  75. package/dist/internals.mjs.br +0 -0
  76. package/dist/internals.mjs.gz +0 -0
  77. package/dist/pptx-viewer.css +1 -1
  78. package/dist/pptx-viewer.css.br +0 -0
  79. package/dist/pptx-viewer.css.gz +0 -0
  80. package/dist/viewer/index.d.ts +18 -0
  81. package/dist/viewer/index.js +22 -22
  82. package/dist/viewer/index.js.br +0 -0
  83. package/dist/viewer/index.js.gz +0 -0
  84. package/dist/viewer/index.mjs +6 -6
  85. package/dist/viewer/index.mjs.br +0 -0
  86. package/dist/viewer/index.mjs.gz +0 -0
  87. package/package.json +1 -1
  88. package/dist/AiChatPanel-CS4CONUO.mjs.br +0 -0
  89. package/dist/AiChatPanel-CS4CONUO.mjs.gz +0 -0
  90. package/dist/AiChatPanel-JIXSOZXN.js.br +0 -0
  91. package/dist/AiChatPanel-JIXSOZXN.js.gz +0 -0
  92. package/dist/Model3DScene-5KMJ4JL6.js.br +0 -0
  93. package/dist/Model3DScene-5KMJ4JL6.js.gz +0 -0
  94. package/dist/Model3DScene-RWFPSN6B.mjs.br +0 -0
  95. package/dist/Model3DScene-RWFPSN6B.mjs.gz +0 -0
  96. package/dist/SurfaceChart3DScene-2GZQM3LN.mjs.gz +0 -0
  97. package/dist/SurfaceChart3DScene-BIOKIETC.js.br +0 -0
  98. package/dist/SurfaceChart3DScene-BIOKIETC.js.gz +0 -0
  99. package/dist/chunk-2VUHJNWM.js.br +0 -0
  100. package/dist/chunk-2VUHJNWM.js.gz +0 -0
  101. package/dist/chunk-3GNSGGY2.js.br +0 -0
  102. package/dist/chunk-3GNSGGY2.js.gz +0 -0
  103. package/dist/chunk-AOED5MFM.mjs.br +0 -0
  104. package/dist/chunk-AOED5MFM.mjs.gz +0 -0
  105. package/dist/chunk-BJQSHVYH.mjs.br +0 -0
  106. package/dist/chunk-BJQSHVYH.mjs.gz +0 -0
  107. package/dist/chunk-CEUHGUZ4.mjs.br +0 -0
  108. package/dist/chunk-CEUHGUZ4.mjs.gz +0 -0
  109. package/dist/chunk-ECDKYPQ2.mjs.br +0 -0
  110. package/dist/chunk-ECDKYPQ2.mjs.gz +0 -0
  111. package/dist/chunk-EJRHYYKE.mjs.br +0 -0
  112. package/dist/chunk-EJRHYYKE.mjs.gz +0 -0
  113. package/dist/chunk-PJUQQF3I.js.br +0 -0
  114. package/dist/chunk-PJUQQF3I.js.gz +0 -0
  115. package/dist/chunk-PTGTFXPU.js.br +0 -0
  116. package/dist/chunk-PTGTFXPU.js.gz +0 -0
  117. package/dist/chunk-QGHC65C4.mjs.br +0 -0
  118. package/dist/chunk-QGHC65C4.mjs.gz +0 -0
  119. package/dist/chunk-SP7U34QM.js.br +0 -0
  120. package/dist/chunk-SP7U34QM.js.gz +0 -0
  121. package/dist/chunk-ZIXSSQAZ.js.br +0 -0
  122. package/dist/chunk-ZIXSSQAZ.js.gz +0 -0
@@ -2159,9 +2159,9 @@ function getStockObject(index) {
2159
2159
  }
2160
2160
  }
2161
2161
  async function blobToDataUrl(blob) {
2162
- return new Promise((resolve, reject) => {
2162
+ return new Promise((resolve2, reject) => {
2163
2163
  const reader = new FileReader();
2164
- reader.onload = () => resolve(reader.result);
2164
+ reader.onload = () => resolve2(reader.result);
2165
2165
  reader.onerror = () => reject(reader.error);
2166
2166
  reader.readAsDataURL(blob);
2167
2167
  });
@@ -9764,12 +9764,12 @@ function updateSection(section) {
9764
9764
  }
9765
9765
  return node;
9766
9766
  }
9767
- function applySections(presentation, sections, lookup, remap) {
9768
- if (sections === void 0) {
9767
+ function applySections(presentation, sections2, lookup, remap) {
9768
+ if (sections2 === void 0) {
9769
9769
  return;
9770
9770
  }
9771
9771
  let location = findSectionList(presentation, lookup);
9772
- if (sections.length === 0) {
9772
+ if (sections2.length === 0) {
9773
9773
  if (location) {
9774
9774
  delete location.parent[location.key];
9775
9775
  }
@@ -9786,14 +9786,14 @@ function applySections(presentation, sections, lookup, remap) {
9786
9786
  location = { parent: ext, key: "p14:sectionLst", list: ext["p14:sectionLst"] };
9787
9787
  }
9788
9788
  const list = cloneXmlObject(location.list) ?? {};
9789
- const effectiveSections = remap && remap.changed ? sections.map((section) => ({
9789
+ const effectiveSections = remap && remap.changed ? sections2.map((section) => ({
9790
9790
  ...section,
9791
9791
  slideIds: remapReferenceList(
9792
9792
  section.slideIds,
9793
9793
  remap.sldIdByOldSldId,
9794
9794
  remap.removedSldIds
9795
9795
  )
9796
- })) : sections;
9796
+ })) : sections2;
9797
9797
  replaceChildren(list, "section", effectiveSections.map(updateSection), "p14:section");
9798
9798
  location.parent[location.key] = list;
9799
9799
  }
@@ -13837,10 +13837,11 @@ var PptxShapeStyleExtractor = class {
13837
13837
  this.context.resolveThemeFillRef(styleNode["a:fillRef"], style);
13838
13838
  }
13839
13839
  const lineNode = shapeProps["a:ln"];
13840
+ if (styleNode?.["a:lnRef"]) {
13841
+ this.context.resolveThemeLineRef(styleNode["a:lnRef"], style);
13842
+ }
13840
13843
  if (lineNode) {
13841
13844
  applyLineProperties(lineNode, style, this.context);
13842
- } else if (styleNode?.["a:lnRef"]) {
13843
- this.context.resolveThemeLineRef(styleNode["a:lnRef"], style);
13844
13845
  }
13845
13846
  Object.assign(style, this.context.extractShadowStyle(shapeProps));
13846
13847
  Object.assign(style, this.context.extractInnerShadowStyle(shapeProps));
@@ -15166,7 +15167,10 @@ var PptxConnectorParser = class {
15166
15167
  const skewY = transform["@_skewY"] ? parseInt(String(transform["@_skewY"]), 10) / 6e4 : void 0;
15167
15168
  const { flipHorizontal, flipVertical } = this.context.readFlipState(transform);
15168
15169
  const cNvConnectionShapeProperties = connector2?.["p:nvCxnSpPr"]?.["p:cNvCxnSpPr"];
15169
- const shapeStyle = this.context.extractShapeStyle(shapeProperties);
15170
+ const shapeStyle = this.context.extractShapeStyle(
15171
+ shapeProperties,
15172
+ connector2["p:style"]
15173
+ );
15170
15174
  const startConnectionNode = cNvConnectionShapeProperties?.["a:stCxn"];
15171
15175
  if (startConnectionNode) {
15172
15176
  const startConnection = {};
@@ -15316,8 +15320,8 @@ var PptxLoadDataBuilder = class {
15316
15320
  this.customShows = customShows;
15317
15321
  return this;
15318
15322
  }
15319
- withSections(sections) {
15320
- this.sections = sections;
15323
+ withSections(sections2) {
15324
+ this.sections = sections2;
15321
15325
  return this;
15322
15326
  }
15323
15327
  withWarnings(warnings) {
@@ -18979,7 +18983,7 @@ function remapEditorAnimationsToShapeIds(elements2, animations, reservedMaxId =
18979
18983
  byId.set(el.id, el);
18980
18984
  }
18981
18985
  let nextId2 = Math.max(maxShapeId(flat), reservedMaxId) + 1;
18982
- const resolve = (elementId) => {
18986
+ const resolve2 = (elementId) => {
18983
18987
  const el = byId.get(elementId);
18984
18988
  if (!el) {
18985
18989
  return void 0;
@@ -18991,8 +18995,8 @@ function remapEditorAnimationsToShapeIds(elements2, animations, reservedMaxId =
18991
18995
  return el.shapeId;
18992
18996
  };
18993
18997
  return animations.map((anim) => {
18994
- const resolvedElement = resolve(anim.elementId);
18995
- const resolvedTrigger = anim.triggerShapeId !== void 0 ? resolve(anim.triggerShapeId) : void 0;
18998
+ const resolvedElement = resolve2(anim.elementId);
18999
+ const resolvedTrigger = anim.triggerShapeId !== void 0 ? resolve2(anim.triggerShapeId) : void 0;
18996
19000
  if (resolvedElement === void 0 && resolvedTrigger === void 0) {
18997
19001
  return anim;
18998
19002
  }
@@ -19994,7 +19998,7 @@ var PptxNativeAnimationService = class {
19994
19998
  * parent node. See `animation-group-context` for why the flat list
19995
19999
  * needs it.
19996
20000
  */
19997
- walkTimingTree(node, animations, currentTrigger, group = createGroupContext()) {
20001
+ walkTimingTree(node, animations, currentTrigger, group2 = createGroupContext()) {
19998
20002
  if (!node) {
19999
20003
  return;
20000
20004
  }
@@ -20093,8 +20097,8 @@ var PptxNativeAnimationService = class {
20093
20097
  textTarget: textTarget ?? void 0,
20094
20098
  cTnAttributes: roundTripAttrs,
20095
20099
  afterEffect: afterEffectFlag,
20096
- groupAutoStart: group.groupAutoStart,
20097
- parGroupIndex: group.parGroupIndex
20100
+ groupAutoStart: group2.groupAutoStart,
20101
+ parGroupIndex: group2.parGroupIndex
20098
20102
  });
20099
20103
  }
20100
20104
  const childTnList = cTn["p:childTnLst"];
@@ -20108,7 +20112,7 @@ var PptxNativeAnimationService = class {
20108
20112
  parallel,
20109
20113
  animations,
20110
20114
  trigger,
20111
- childGroupContext(group, parallel["p:cTn"], {
20115
+ childGroupContext(group2, parallel["p:cTn"], {
20112
20116
  isClickLevelGroup: isClickLevel
20113
20117
  })
20114
20118
  );
@@ -20117,11 +20121,11 @@ var PptxNativeAnimationService = class {
20117
20121
  if (isInteractiveSequence(sequence)) {
20118
20122
  continue;
20119
20123
  }
20120
- this.walkTimingTree(sequence, animations, trigger, group);
20124
+ this.walkTimingTree(sequence, animations, trigger, group2);
20121
20125
  }
20122
20126
  for (const excl of exclusives) {
20123
20127
  const exclAnims = [];
20124
- this.walkTimingTree(excl, exclAnims, trigger, group);
20128
+ this.walkTimingTree(excl, exclAnims, trigger, group2);
20125
20129
  for (const a of exclAnims) {
20126
20130
  a.exclusive = true;
20127
20131
  animations.push(a);
@@ -20136,7 +20140,7 @@ var PptxNativeAnimationService = class {
20136
20140
  parallel,
20137
20141
  animations,
20138
20142
  currentTrigger,
20139
- childGroupContext(group, parallel["p:cTn"], {
20143
+ childGroupContext(group2, parallel["p:cTn"], {
20140
20144
  isClickLevelGroup: false
20141
20145
  })
20142
20146
  );
@@ -20145,7 +20149,7 @@ var PptxNativeAnimationService = class {
20145
20149
  if (isInteractiveSequence(sequence)) {
20146
20150
  continue;
20147
20151
  }
20148
- this.walkTimingTree(sequence, animations, currentTrigger, group);
20152
+ this.walkTimingTree(sequence, animations, currentTrigger, group2);
20149
20153
  }
20150
20154
  }
20151
20155
  /**
@@ -22048,7 +22052,7 @@ var PptxAnimationWriteService = class {
22048
22052
  if (currentGroup.length > 0) {
22049
22053
  clickGroups.push(currentGroup);
22050
22054
  }
22051
- const nodes = clickGroups.map((group) => {
22055
+ const nodes = clickGroups.map((group2) => {
22052
22056
  const groupId = this.allocateId();
22053
22057
  return {
22054
22058
  "p:cTn": {
@@ -22060,7 +22064,7 @@ var PptxAnimationWriteService = class {
22060
22064
  }
22061
22065
  },
22062
22066
  "p:childTnLst": {
22063
- "p:par": group.length === 1 ? group[0] : group
22067
+ "p:par": group2.length === 1 ? group2[0] : group2
22064
22068
  }
22065
22069
  }
22066
22070
  };
@@ -23851,17 +23855,20 @@ var stripedRightArrow = {
23851
23855
  name: "stripedRightArrow",
23852
23856
  avLst: { adj1: 5e4, adj2: 5e4 },
23853
23857
  gdLst: [
23858
+ // Head length runs off `ss`, the short side, not `w`. See the note on
23859
+ // `rightArrow` in `preset-shape-definitions-table.ts`.
23860
+ gd3("maxAdj2", "*/ 84375 w ss"),
23854
23861
  gd3("a1", "pin 0 adj1 100000"),
23855
- gd3("a2", "pin 0 adj2 100000"),
23862
+ gd3("a2", "pin 0 adj2 maxAdj2"),
23856
23863
  gd3("y1", "*/ hd2 a1 100000"),
23857
23864
  gd3("y2", "+- vc 0 y1"),
23858
23865
  gd3("y3", "+- vc y1 0"),
23859
23866
  gd3("x2", "*/ ss 1 32"),
23860
23867
  gd3("x3", "*/ ss 2 32"),
23861
23868
  gd3("x4", "*/ ss 5 32"),
23862
- gd3("x5", "*/ w a2 100000"),
23869
+ gd3("x5", "*/ ss a2 100000"),
23863
23870
  gd3("x6", "+- r 0 x5"),
23864
- gd3("dx", "*/ hd2 x5 wd2"),
23871
+ gd3("dx", "*/ y1 x5 hd2"),
23865
23872
  gd3("x7", "+- x6 dx 0")
23866
23873
  ],
23867
23874
  rect: { l: "x4", t: "y2", r: "x7", b: "y3" },
@@ -23896,14 +23903,17 @@ var notchedRightArrow = {
23896
23903
  name: "notchedRightArrow",
23897
23904
  avLst: { adj1: 5e4, adj2: 5e4 },
23898
23905
  gdLst: [
23906
+ // Head length runs off `ss`, the short side, not `w`. See the note on
23907
+ // `rightArrow` in `preset-shape-definitions-table.ts`.
23908
+ gd3("maxAdj2", "*/ 100000 w ss"),
23899
23909
  gd3("a1", "pin 0 adj1 100000"),
23900
- gd3("a2", "pin 0 adj2 100000"),
23910
+ gd3("a2", "pin 0 adj2 maxAdj2"),
23901
23911
  gd3("y1", "*/ hd2 a1 100000"),
23902
23912
  gd3("y2", "+- vc 0 y1"),
23903
23913
  gd3("y3", "+- vc y1 0"),
23904
- gd3("x2", "*/ w a2 100000"),
23914
+ gd3("x2", "*/ ss a2 100000"),
23905
23915
  gd3("x1", "+- r 0 x2"),
23906
- gd3("dx2", "*/ hd2 x2 wd2"),
23916
+ gd3("dx2", "*/ y1 x2 hd2"),
23907
23917
  gd3("x3", "+- x1 dx2 0"),
23908
23918
  gd3("nx", "*/ y1 1 1")
23909
23919
  ],
@@ -23927,7 +23937,12 @@ var notchedRightArrow = {
23927
23937
  var homePlate = {
23928
23938
  name: "homePlate",
23929
23939
  avLst: { adj: 5e4 },
23930
- gdLst: [gd3("a", "pin 0 adj 100000"), gd3("x1", "*/ w a 100000")],
23940
+ gdLst: [
23941
+ gd3("maxAdj", "*/ 100000 w ss"),
23942
+ gd3("a", "pin 0 adj maxAdj"),
23943
+ gd3("dx1", "*/ ss a 100000"),
23944
+ gd3("x1", "+- r 0 dx1")
23945
+ ],
23931
23946
  rect: { l: "l", t: "t", r: "x1", b: "b" },
23932
23947
  pathLst: [
23933
23948
  {
@@ -23945,8 +23960,13 @@ var homePlate = {
23945
23960
  var chevron = {
23946
23961
  name: "chevron",
23947
23962
  avLst: { adj: 5e4 },
23948
- gdLst: [gd3("a", "pin 0 adj 100000"), gd3("x1", "*/ w a 100000"), gd3("x2", "+- r 0 x1")],
23949
- rect: { l: "l", t: "t", r: "x2", b: "b" },
23963
+ gdLst: [
23964
+ gd3("maxAdj", "*/ 100000 w ss"),
23965
+ gd3("a", "pin 0 adj maxAdj"),
23966
+ gd3("x1", "*/ ss a 100000"),
23967
+ gd3("x2", "+- r 0 x1")
23968
+ ],
23969
+ rect: { l: "x1", t: "t", r: "x2", b: "b" },
23950
23970
  pathLst: [
23951
23971
  {
23952
23972
  commands: [
@@ -29032,27 +29052,28 @@ var rightArrow = {
29032
29052
  name: "rightArrow",
29033
29053
  avLst: { adj1: 5e4, adj2: 5e4 },
29034
29054
  gdLst: [
29055
+ gd13("maxAdj2", "*/ 100000 w ss"),
29035
29056
  gd13("a1", "pin 0 adj1 100000"),
29036
- gd13("a2", "pin 0 adj2 100000"),
29037
- gd13("y1", "*/ hd2 a1 100000"),
29038
- gd13("y2", "+- vc 0 y1"),
29039
- gd13("y3", "+- vc y1 0"),
29040
- gd13("x2", "*/ w a2 100000"),
29041
- gd13("x1", "+- r 0 x2"),
29042
- gd13("dx2", "*/ hd2 x2 wd2"),
29043
- gd13("x3", "+- x1 dx2 0")
29057
+ gd13("a2", "pin 0 adj2 maxAdj2"),
29058
+ gd13("dx1", "*/ ss a2 100000"),
29059
+ gd13("x1", "+- r 0 dx1"),
29060
+ gd13("dy1", "*/ h a1 200000"),
29061
+ gd13("y1", "+- vc 0 dy1"),
29062
+ gd13("y2", "+- vc dy1 0"),
29063
+ gd13("dx2", "*/ y1 dx1 hd2"),
29064
+ gd13("x2", "+- x1 dx2 0")
29044
29065
  ],
29045
- rect: { l: "l", t: "y2", r: "x3", b: "y3" },
29066
+ rect: { l: "l", t: "y1", r: "x2", b: "y2" },
29046
29067
  pathLst: [
29047
29068
  {
29048
29069
  commands: [
29049
- { kind: "moveTo", x: "l", y: "y2" },
29050
- { kind: "lnTo", x: "x1", y: "y2" },
29070
+ { kind: "moveTo", x: "l", y: "y1" },
29071
+ { kind: "lnTo", x: "x1", y: "y1" },
29051
29072
  { kind: "lnTo", x: "x1", y: "t" },
29052
29073
  { kind: "lnTo", x: "r", y: "vc" },
29053
29074
  { kind: "lnTo", x: "x1", y: "b" },
29054
- { kind: "lnTo", x: "x1", y: "y3" },
29055
- { kind: "lnTo", x: "l", y: "y3" },
29075
+ { kind: "lnTo", x: "x1", y: "y2" },
29076
+ { kind: "lnTo", x: "l", y: "y2" },
29056
29077
  { kind: "close" }
29057
29078
  ]
29058
29079
  }
@@ -29062,26 +29083,28 @@ var leftArrow = {
29062
29083
  name: "leftArrow",
29063
29084
  avLst: { adj1: 5e4, adj2: 5e4 },
29064
29085
  gdLst: [
29086
+ gd13("maxAdj2", "*/ 100000 w ss"),
29065
29087
  gd13("a1", "pin 0 adj1 100000"),
29066
- gd13("a2", "pin 0 adj2 100000"),
29067
- gd13("y1", "*/ hd2 a1 100000"),
29068
- gd13("y2", "+- vc 0 y1"),
29069
- gd13("y3", "+- vc y1 0"),
29070
- gd13("x1", "*/ w a2 100000"),
29071
- gd13("dx2", "*/ hd2 x1 wd2"),
29072
- gd13("x2", "+- l dx2 0")
29088
+ gd13("a2", "pin 0 adj2 maxAdj2"),
29089
+ gd13("dx2", "*/ ss a2 100000"),
29090
+ gd13("x2", "+- l dx2 0"),
29091
+ gd13("dy1", "*/ h a1 200000"),
29092
+ gd13("y1", "+- vc 0 dy1"),
29093
+ gd13("y2", "+- vc dy1 0"),
29094
+ gd13("dx1", "*/ y1 dx2 hd2"),
29095
+ gd13("x1", "+- dx2 0 dx1")
29073
29096
  ],
29074
- rect: { l: "x2", t: "y2", r: "r", b: "y3" },
29097
+ rect: { l: "x1", t: "y1", r: "r", b: "y2" },
29075
29098
  pathLst: [
29076
29099
  {
29077
29100
  commands: [
29078
29101
  { kind: "moveTo", x: "l", y: "vc" },
29079
- { kind: "lnTo", x: "x1", y: "t" },
29080
- { kind: "lnTo", x: "x1", y: "y2" },
29102
+ { kind: "lnTo", x: "x2", y: "t" },
29103
+ { kind: "lnTo", x: "x2", y: "y1" },
29104
+ { kind: "lnTo", x: "r", y: "y1" },
29081
29105
  { kind: "lnTo", x: "r", y: "y2" },
29082
- { kind: "lnTo", x: "r", y: "y3" },
29083
- { kind: "lnTo", x: "x1", y: "y3" },
29084
- { kind: "lnTo", x: "x1", y: "b" },
29106
+ { kind: "lnTo", x: "x2", y: "y2" },
29107
+ { kind: "lnTo", x: "x2", y: "b" },
29085
29108
  { kind: "close" }
29086
29109
  ]
29087
29110
  }
@@ -29091,26 +29114,28 @@ var upArrow = {
29091
29114
  name: "upArrow",
29092
29115
  avLst: { adj1: 5e4, adj2: 5e4 },
29093
29116
  gdLst: [
29117
+ gd13("maxAdj2", "*/ 100000 h ss"),
29094
29118
  gd13("a1", "pin 0 adj1 100000"),
29095
- gd13("a2", "pin 0 adj2 100000"),
29096
- gd13("x1", "*/ wd2 a1 100000"),
29097
- gd13("x2", "+- hc 0 x1"),
29098
- gd13("x3", "+- hc x1 0"),
29099
- gd13("y2", "*/ h a2 100000"),
29100
- gd13("dy2", "*/ wd2 y2 hd2"),
29101
- gd13("y1", "+- t dy2 0")
29119
+ gd13("a2", "pin 0 adj2 maxAdj2"),
29120
+ gd13("dy2", "*/ ss a2 100000"),
29121
+ gd13("y2", "+- t dy2 0"),
29122
+ gd13("dx1", "*/ w a1 200000"),
29123
+ gd13("x1", "+- hc 0 dx1"),
29124
+ gd13("x2", "+- hc dx1 0"),
29125
+ gd13("dy1", "*/ x1 dy2 wd2"),
29126
+ gd13("y1", "+- y2 0 dy1")
29102
29127
  ],
29103
- rect: { l: "x2", t: "y1", r: "x3", b: "b" },
29128
+ rect: { l: "x1", t: "y1", r: "x2", b: "b" },
29104
29129
  pathLst: [
29105
29130
  {
29106
29131
  commands: [
29107
- { kind: "moveTo", x: "hc", y: "t" },
29132
+ { kind: "moveTo", x: "l", y: "y2" },
29133
+ { kind: "lnTo", x: "hc", y: "t" },
29108
29134
  { kind: "lnTo", x: "r", y: "y2" },
29109
- { kind: "lnTo", x: "x3", y: "y2" },
29110
- { kind: "lnTo", x: "x3", y: "b" },
29111
- { kind: "lnTo", x: "x2", y: "b" },
29112
29135
  { kind: "lnTo", x: "x2", y: "y2" },
29113
- { kind: "lnTo", x: "l", y: "y2" },
29136
+ { kind: "lnTo", x: "x2", y: "b" },
29137
+ { kind: "lnTo", x: "x1", y: "b" },
29138
+ { kind: "lnTo", x: "x1", y: "y2" },
29114
29139
  { kind: "close" }
29115
29140
  ]
29116
29141
  }
@@ -29120,26 +29145,27 @@ var downArrow = {
29120
29145
  name: "downArrow",
29121
29146
  avLst: { adj1: 5e4, adj2: 5e4 },
29122
29147
  gdLst: [
29148
+ gd13("maxAdj2", "*/ 100000 h ss"),
29123
29149
  gd13("a1", "pin 0 adj1 100000"),
29124
- gd13("a2", "pin 0 adj2 100000"),
29125
- gd13("x1", "*/ wd2 a1 100000"),
29126
- gd13("x2", "+- hc 0 x1"),
29127
- gd13("x3", "+- hc x1 0"),
29128
- gd13("y1", "*/ h a2 100000"),
29129
- gd13("y2", "+- b 0 y1"),
29130
- gd13("dy2", "*/ wd2 y1 hd2"),
29131
- gd13("y3", "+- b 0 dy2")
29150
+ gd13("a2", "pin 0 adj2 maxAdj2"),
29151
+ gd13("dy1", "*/ ss a2 100000"),
29152
+ gd13("y1", "+- b 0 dy1"),
29153
+ gd13("dx1", "*/ w a1 200000"),
29154
+ gd13("x1", "+- hc 0 dx1"),
29155
+ gd13("x2", "+- hc dx1 0"),
29156
+ gd13("dy2", "*/ x1 dy1 wd2"),
29157
+ gd13("y2", "+- b 0 dy2")
29132
29158
  ],
29133
- rect: { l: "x2", t: "t", r: "x3", b: "y3" },
29159
+ rect: { l: "x1", t: "t", r: "x2", b: "y2" },
29134
29160
  pathLst: [
29135
29161
  {
29136
29162
  commands: [
29137
- { kind: "moveTo", x: "l", y: "y2" },
29138
- { kind: "lnTo", x: "x2", y: "y2" },
29163
+ { kind: "moveTo", x: "l", y: "y1" },
29164
+ { kind: "lnTo", x: "x1", y: "y1" },
29165
+ { kind: "lnTo", x: "x1", y: "t" },
29139
29166
  { kind: "lnTo", x: "x2", y: "t" },
29140
- { kind: "lnTo", x: "x3", y: "t" },
29141
- { kind: "lnTo", x: "x3", y: "y2" },
29142
- { kind: "lnTo", x: "r", y: "y2" },
29167
+ { kind: "lnTo", x: "x2", y: "y1" },
29168
+ { kind: "lnTo", x: "r", y: "y1" },
29143
29169
  { kind: "lnTo", x: "hc", y: "b" },
29144
29170
  { kind: "close" }
29145
29171
  ]
@@ -32319,8 +32345,8 @@ function extractSectionMap(presentationData, lookup) {
32319
32345
  const orderedSections = [];
32320
32346
  const presentation = presentationData ? lookup.getChildByLocalName(presentationData, "presentation") : void 0;
32321
32347
  const sectionList = findSectionList2(presentation, lookup);
32322
- const sections = lookup.getChildrenArrayByLocalName(sectionList, "section");
32323
- sections.forEach((section, index) => {
32348
+ const sections2 = lookup.getChildrenArrayByLocalName(sectionList, "section");
32349
+ sections2.forEach((section, index) => {
32324
32350
  const sectionId = String(section["@_id"] || `section-${index + 1}`);
32325
32351
  const rawName = String(section["@_name"] || "").trim();
32326
32352
  const sectionName = rawName || `Section ${index + 1}`;
@@ -32795,8 +32821,8 @@ function scalar(parent, name, xmlLookup) {
32795
32821
  return node?.["#text"] === void 0 ? void 0 : String(node["#text"]);
32796
32822
  }
32797
32823
  function parseSeriesDataLabels(seriesNode, xmlLookup) {
32798
- const group = xmlLookup.getChildByLocalName(seriesNode, "dLbls");
32799
- const nodes = group ? xmlLookup.getChildrenArrayByLocalName(group, "dLbl") : xmlLookup.getChildrenArrayByLocalName(seriesNode, "dLbl");
32824
+ const group2 = xmlLookup.getChildByLocalName(seriesNode, "dLbls");
32825
+ const nodes = group2 ? xmlLookup.getChildrenArrayByLocalName(group2, "dLbl") : xmlLookup.getChildrenArrayByLocalName(seriesNode, "dLbl");
32800
32826
  return nodes.flatMap((node) => {
32801
32827
  const idx = uint32(xmlLookup.getChildByLocalName(node, "idx")?.["@_val"]);
32802
32828
  if (idx === void 0) {
@@ -32841,7 +32867,7 @@ function parseSeriesDataLabels(seriesNode, xmlLookup) {
32841
32867
  return [result];
32842
32868
  });
32843
32869
  }
32844
- function parseChartDataLabelOptions(group, xmlLookup) {
32870
+ function parseChartDataLabelOptions(group2, xmlLookup) {
32845
32871
  const result = {};
32846
32872
  const fields = [
32847
32873
  ["showVal", "showValue"],
@@ -32853,16 +32879,16 @@ function parseChartDataLabelOptions(group, xmlLookup) {
32853
32879
  ["showLeaderLines", "showLeaderLines"]
32854
32880
  ];
32855
32881
  for (const [xmlName, property] of fields) {
32856
- const value = bool(xmlLookup.getChildByLocalName(group, xmlName));
32882
+ const value = bool(xmlLookup.getChildByLocalName(group2, xmlName));
32857
32883
  if (value !== void 0) {
32858
32884
  result[property] = value;
32859
32885
  }
32860
32886
  }
32861
- const pos2 = position(xmlLookup.getChildByLocalName(group, "dLblPos"));
32887
+ const pos2 = position(xmlLookup.getChildByLocalName(group2, "dLblPos"));
32862
32888
  if (pos2) {
32863
32889
  result.position = pos2;
32864
32890
  }
32865
- const separator = scalar(group, "separator", xmlLookup);
32891
+ const separator = scalar(group2, "separator", xmlLookup);
32866
32892
  if (separator !== void 0) {
32867
32893
  result.separator = separator;
32868
32894
  }
@@ -38182,12 +38208,12 @@ function layoutGroupedList(nodes, bounds, themeColorMap) {
38182
38208
  const usableW = bounds.width - padding * 2;
38183
38209
  const groupW = (usableW - gap * (groups.length - 1)) / groups.length;
38184
38210
  const usableH = bounds.height - padding * 2;
38185
- groups.forEach((group, gi) => {
38211
+ groups.forEach((group2, gi) => {
38186
38212
  const fill = accentColor(gi, themeColorMap);
38187
38213
  const gx = bounds.x + padding + gi * (groupW + gap);
38188
38214
  const headerH = usableH * 0.2;
38189
38215
  const subItemGap = 3;
38190
- const subItemH = (usableH - headerH - 4 - subItemGap * (group.length - 1)) / group.length;
38216
+ const subItemH = (usableH - headerH - 4 - subItemGap * (group2.length - 1)) / group2.length;
38191
38217
  elements2.push(
38192
38218
  makeShapeElement(
38193
38219
  nextId("sa-grp-header"),
@@ -38205,7 +38231,7 @@ function layoutGroupedList(nodes, bounds, themeColorMap) {
38205
38231
  }
38206
38232
  )
38207
38233
  );
38208
- group.forEach((node, si) => {
38234
+ group2.forEach((node, si) => {
38209
38235
  const sy = bounds.y + padding + headerH + 4 + si * (subItemH + subItemGap);
38210
38236
  elements2.push(
38211
38237
  makeShapeElement(
@@ -41486,6 +41512,23 @@ var GENERIC_FAMILY_CONCRETE_FONTS = {
41486
41512
  cursive: ["Comic Sans MS", "cursive"],
41487
41513
  fantasy: ["Impact", "fantasy"]
41488
41514
  };
41515
+ function parsePanoseString(panoseStr) {
41516
+ if (!panoseStr) {
41517
+ return void 0;
41518
+ }
41519
+ const cleaned = panoseStr.trim();
41520
+ if (cleaned.length !== 20) {
41521
+ return void 0;
41522
+ }
41523
+ if (!/^[0-9a-fA-F]{20}$/.test(cleaned)) {
41524
+ return void 0;
41525
+ }
41526
+ const bytes = [];
41527
+ for (let i = 0; i < 20; i += 2) {
41528
+ bytes.push(parseInt(cleaned.substring(i, i + 2), 16));
41529
+ }
41530
+ return bytes;
41531
+ }
41489
41532
  function classifyPanose(panose) {
41490
41533
  if (!panose || panose.length < 4) {
41491
41534
  return "sans-serif";
@@ -49653,6 +49696,29 @@ var PptxHandlerRuntime10 = class extends PptxHandlerRuntime9 {
49653
49696
  return void 0;
49654
49697
  }
49655
49698
  }
49699
+ /**
49700
+ * Resolve the `c:spPr` fill of a chart container (`c:chartSpace` or
49701
+ * `c:plotArea`) to a colour string, or the literal `'none'` for
49702
+ * `<a:noFill/>`. Returns `undefined` when the container declares no fill at
49703
+ * all, which leaves the choice to the renderer.
49704
+ *
49705
+ * `<a:noFill/>` parses to the empty STRING, so presence - not truthiness -
49706
+ * has to decide.
49707
+ */
49708
+ parseChartContainerFill(container) {
49709
+ const shapeProperties = this.xmlLookupService.getChildByLocalName(container, "spPr");
49710
+ if (!shapeProperties) {
49711
+ return void 0;
49712
+ }
49713
+ const hasNoFill = Object.keys(shapeProperties).some(
49714
+ (key) => this.compatibilityService.getXmlLocalName(key) === "noFill"
49715
+ );
49716
+ if (hasNoFill) {
49717
+ return "none";
49718
+ }
49719
+ const solidFill2 = this.xmlLookupService.getChildByLocalName(shapeProperties, "solidFill");
49720
+ return solidFill2 ? this.parseColor(solidFill2) : void 0;
49721
+ }
49656
49722
  /**
49657
49723
  * Extract chart style metadata from chart XML.
49658
49724
  */
@@ -49667,6 +49733,11 @@ var PptxHandlerRuntime10 = class extends PptxHandlerRuntime9 {
49667
49733
  style.styleId = parseInt(String(styleNode["@_val"]));
49668
49734
  hasStyle = true;
49669
49735
  }
49736
+ const chartAreaFill2 = this.parseChartContainerFill(chartSpace);
49737
+ if (chartAreaFill2) {
49738
+ style.chartAreaFill = chartAreaFill2;
49739
+ hasStyle = true;
49740
+ }
49670
49741
  if (chartRoot) {
49671
49742
  const legend = this.xmlLookupService.getChildByLocalName(chartRoot, "legend");
49672
49743
  if (legend) {
@@ -49692,6 +49763,11 @@ var PptxHandlerRuntime10 = class extends PptxHandlerRuntime9 {
49692
49763
  }
49693
49764
  const plotArea = this.xmlLookupService.getChildByLocalName(chartRoot, "plotArea");
49694
49765
  if (plotArea) {
49766
+ const plotAreaFill2 = this.parseChartContainerFill(plotArea);
49767
+ if (plotAreaFill2) {
49768
+ style.plotAreaFill = plotAreaFill2;
49769
+ hasStyle = true;
49770
+ }
49695
49771
  const valAx = this.xmlLookupService.getChildByLocalName(plotArea, "valAx");
49696
49772
  if (valAx) {
49697
49773
  const majorGridlines = this.xmlLookupService.getChildByLocalName(valAx, "majorGridlines");
@@ -51025,32 +51101,32 @@ var PptxHandlerRuntime15 = class _PptxHandlerRuntime3 extends PptxHandlerRuntime
51025
51101
  * Build a p:grpSp XML object from a GroupPptxElement.
51026
51102
  * Children are stored with coordinates relative to the group origin.
51027
51103
  */
51028
- buildGroupShapeXml(group) {
51029
- if (group.rawXml && group.children.length === 0) {
51030
- return group.rawXml;
51104
+ buildGroupShapeXml(group2) {
51105
+ if (group2.rawXml && group2.children.length === 0) {
51106
+ return group2.rawXml;
51031
51107
  }
51032
51108
  const EMU = _PptxHandlerRuntime3.EMU_PER_PX;
51033
- const offX = Math.round(group.x * EMU);
51034
- const offY = Math.round(group.y * EMU);
51035
- const extCx = Math.round(group.width * EMU);
51036
- const extCy = Math.round(group.height * EMU);
51109
+ const offX = Math.round(group2.x * EMU);
51110
+ const offY = Math.round(group2.y * EMU);
51111
+ const extCx = Math.round(group2.width * EMU);
51112
+ const extCy = Math.round(group2.height * EMU);
51037
51113
  const chOffX = 0;
51038
51114
  const chOffY = 0;
51039
51115
  const chExtCx = extCx;
51040
51116
  const chExtCy = extCy;
51041
51117
  const xfrmAttrs = {};
51042
- if (typeof group.rotation === "number" && group.rotation !== 0) {
51043
- xfrmAttrs["@_rot"] = String(Math.round(group.rotation * 6e4));
51118
+ if (typeof group2.rotation === "number" && group2.rotation !== 0) {
51119
+ xfrmAttrs["@_rot"] = String(Math.round(group2.rotation * 6e4));
51044
51120
  }
51045
- if (group.flipHorizontal) {
51121
+ if (group2.flipHorizontal) {
51046
51122
  xfrmAttrs["@_flipH"] = "1";
51047
51123
  }
51048
- if (group.flipVertical) {
51124
+ if (group2.flipVertical) {
51049
51125
  xfrmAttrs["@_flipV"] = "1";
51050
51126
  }
51051
51127
  const grpXml = {
51052
51128
  "p:nvGrpSpPr": {
51053
- "p:cNvPr": { "@_id": "0", "@_name": group.id },
51129
+ "p:cNvPr": { "@_id": "0", "@_name": group2.id },
51054
51130
  "p:cNvGrpSpPr": {},
51055
51131
  "p:nvPr": {}
51056
51132
  },
@@ -51079,7 +51155,7 @@ var PptxHandlerRuntime15 = class _PptxHandlerRuntime3 extends PptxHandlerRuntime
51079
51155
  const childShapes = [];
51080
51156
  const childPics = [];
51081
51157
  const childConnectors = [];
51082
- for (const child202 of group.children) {
51158
+ for (const child202 of group2.children) {
51083
51159
  let xml = child202.rawXml;
51084
51160
  if (!xml && (child202.type === "text" || child202.type === "shape")) {
51085
51161
  xml = this.createElementXml(child202);
@@ -58601,12 +58677,12 @@ var PptxHandlerRuntime37 = class _PptxHandlerRuntime13 extends PptxHandlerRuntim
58601
58677
  updateSummaryFallback(shape, el, targets, relationships) {
58602
58678
  const block = this.alternateContentBlockByRawXml.get(shape);
58603
58679
  const fallback = block?.rawAc["mc:Fallback"];
58604
- const group = fallback?.["p:grpSp"];
58605
- if (!group) {
58680
+ const group2 = fallback?.["p:grpSp"];
58681
+ if (!group2) {
58606
58682
  return;
58607
58683
  }
58608
- const existing = this.ensureArray(group["p:pic"]);
58609
- group["p:pic"] = targets.map((target, index) => {
58684
+ const existing = this.ensureArray(group2["p:pic"]);
58685
+ group2["p:pic"] = targets.map((target, index) => {
58610
58686
  const tile = this.summaryTileElement(el, target, index);
58611
58687
  const picture = existing[index] ?? this.buildZoomFallbackPicture(tile, relationships[index]);
58612
58688
  this.applyZoomTransform(picture["p:spPr"] ??= {}, tile);
@@ -59992,7 +60068,7 @@ var PptxHandlerRuntime42 = class extends PptxHandlerRuntime41 {
59992
60068
  */
59993
60069
  buildFontSchemeObject(schemeName, fontMap, majorScripts, minorScripts) {
59994
60070
  const buildFontGroup = (latinKey, eaKey, csKey, scripts) => {
59995
- const group = {
60071
+ const group2 = {
59996
60072
  "a:latin": { "@_typeface": fontMap[latinKey] || "Calibri" },
59997
60073
  "a:ea": { "@_typeface": fontMap[eaKey] || "" },
59998
60074
  "a:cs": { "@_typeface": fontMap[csKey] || "" }
@@ -60003,9 +60079,9 @@ var PptxHandlerRuntime42 = class extends PptxHandlerRuntime41 {
60003
60079
  "@_script": script,
60004
60080
  "@_typeface": scripts[script]
60005
60081
  }));
60006
- group["a:font"] = fontEntries.length === 1 ? fontEntries[0] : fontEntries;
60082
+ group2["a:font"] = fontEntries.length === 1 ? fontEntries[0] : fontEntries;
60007
60083
  }
60008
- return group;
60084
+ return group2;
60009
60085
  };
60010
60086
  return {
60011
60087
  "@_name": schemeName,
@@ -64638,7 +64714,7 @@ function parseEmuInt2(value) {
64638
64714
  return parsed;
64639
64715
  }
64640
64716
  var PptxHandlerRuntime67 = class _PptxHandlerRuntime30 extends PptxHandlerRuntime66 {
64641
- async parseGroupShape(group, baseId, slidePath, rawXmlStr, depth = 0) {
64717
+ async parseGroupShape(group2, baseId, slidePath, rawXmlStr, depth = 0) {
64642
64718
  if (depth > MAX_GROUP_DEPTH) {
64643
64719
  this.compatibilityService.reportWarning({
64644
64720
  code: "group-depth-exceeded",
@@ -64650,7 +64726,7 @@ var PptxHandlerRuntime67 = class _PptxHandlerRuntime30 extends PptxHandlerRuntim
64650
64726
  });
64651
64727
  return [];
64652
64728
  }
64653
- const grpSpPr = group["p:grpSpPr"];
64729
+ const grpSpPr = group2["p:grpSpPr"];
64654
64730
  const xfrm = grpSpPr?.["a:xfrm"];
64655
64731
  const EMU_PX = _PptxHandlerRuntime30.EMU_PER_PX;
64656
64732
  let parentX = 0, parentY = 0, parentW = 0, parentH = 0;
@@ -64715,16 +64791,16 @@ var PptxHandlerRuntime67 = class _PptxHandlerRuntime30 extends PptxHandlerRuntim
64715
64791
  }
64716
64792
  return el;
64717
64793
  };
64718
- this.unwrapAlternateContent(group);
64794
+ this.unwrapAlternateContent(group2);
64719
64795
  const childOrder3 = this.extractSpTreeChildOrder(
64720
64796
  void 0,
64721
- group,
64797
+ group2,
64722
64798
  "p:grpSp"
64723
64799
  );
64724
64800
  const elements2 = [];
64725
64801
  for (const entry2 of childOrder3) {
64726
64802
  if (entry2.tag === "p:grpSp") {
64727
- const subArr = this.ensureArray(group["p:grpSp"]);
64803
+ const subArr = this.ensureArray(group2["p:grpSp"]);
64728
64804
  const subGroup = subArr[entry2.indexInType];
64729
64805
  if (!subGroup) {
64730
64806
  continue;
@@ -64742,12 +64818,12 @@ var PptxHandlerRuntime67 = class _PptxHandlerRuntime30 extends PptxHandlerRuntim
64742
64818
  const element = await this.parseSpTreeChild(
64743
64819
  entry2.tag,
64744
64820
  entry2.indexInType,
64745
- group,
64821
+ group2,
64746
64822
  slidePath,
64747
64823
  `${baseId}-`
64748
64824
  );
64749
64825
  if (element) {
64750
- const childNode2 = this.ensureArray(group[entry2.tag])[entry2.indexInType];
64826
+ const childNode2 = this.ensureArray(group2[entry2.tag])[entry2.indexInType];
64751
64827
  applyRawChildGeometry(element, childNode2);
64752
64828
  transformElement(element);
64753
64829
  elements2.push(element);
@@ -64760,8 +64836,8 @@ var PptxHandlerRuntime67 = class _PptxHandlerRuntime30 extends PptxHandlerRuntim
64760
64836
  * Parse a p:grpSp element into a GroupPptxElement with children.
64761
64837
  * Children have coordinates relative to the group's position.
64762
64838
  */
64763
- async parseGroupShapeAsGroup(group, baseId, slidePath, rawXmlStr) {
64764
- const grpSpPr = group["p:grpSpPr"];
64839
+ async parseGroupShapeAsGroup(group2, baseId, slidePath, rawXmlStr) {
64840
+ const grpSpPr = group2["p:grpSpPr"];
64765
64841
  const xfrm = grpSpPr?.["a:xfrm"];
64766
64842
  let parentX = 0, parentY = 0, parentW = 0, parentH = 0;
64767
64843
  let groupRotation;
@@ -64787,7 +64863,7 @@ var PptxHandlerRuntime67 = class _PptxHandlerRuntime30 extends PptxHandlerRuntim
64787
64863
  }
64788
64864
  const grpFillStyle = grpSpPr ? this.extractShapeStyle(grpSpPr) : void 0;
64789
64865
  const hasGroupFill = grpFillStyle && grpFillStyle.fillMode && grpFillStyle.fillMode !== "none";
64790
- const children10 = await this.parseGroupShape(group, baseId, slidePath, rawXmlStr);
64866
+ const children10 = await this.parseGroupShape(group2, baseId, slidePath, rawXmlStr);
64791
64867
  if (children10.length === 0) {
64792
64868
  return null;
64793
64869
  }
@@ -64813,7 +64889,7 @@ var PptxHandlerRuntime67 = class _PptxHandlerRuntime30 extends PptxHandlerRuntim
64813
64889
  child202.x -= parentX;
64814
64890
  child202.y -= parentY;
64815
64891
  }
64816
- const grpCNvPr = group?.["p:nvGrpSpPr"]?.["p:cNvPr"];
64892
+ const grpCNvPr = group2?.["p:nvGrpSpPr"]?.["p:cNvPr"];
64817
64893
  const grpSlideRels = this.slideRelsMap.get(slidePath);
64818
64894
  const { actionClick: grpActionClick, actionHover: grpActionHover } = this.parseElementActions(
64819
64895
  grpCNvPr,
@@ -64833,7 +64909,7 @@ var PptxHandlerRuntime67 = class _PptxHandlerRuntime30 extends PptxHandlerRuntim
64833
64909
  flipHorizontal: flipHorizontal || void 0,
64834
64910
  flipVertical: flipVertical || void 0,
64835
64911
  children: children10,
64836
- rawXml: group,
64912
+ rawXml: group2,
64837
64913
  actionClick: grpActionClick,
64838
64914
  actionHover: grpActionHover,
64839
64915
  groupFill: hasGroupFill ? grpFillStyle : void 0
@@ -66300,12 +66376,12 @@ var PptxHandlerRuntime74 = class extends PptxHandlerRuntime73 {
66300
66376
  }
66301
66377
  } else if (entry2.tag === "p:grpSp") {
66302
66378
  const groups = this.ensureArray(spTree["p:grpSp"]);
66303
- const group = groups[entry2.indexInType];
66304
- if (!group) {
66379
+ const group2 = groups[entry2.indexInType];
66380
+ if (!group2) {
66305
66381
  continue;
66306
66382
  }
66307
66383
  const element = await this.parseGroupShapeAsGroup(
66308
- group,
66384
+ group2,
66309
66385
  `master-group-${masterToken}-${entry2.indexInType}`,
66310
66386
  masterPath
66311
66387
  );
@@ -66522,12 +66598,12 @@ var PptxHandlerRuntime76 = class extends PptxHandlerRuntime75 {
66522
66598
  }
66523
66599
  } else if (entry2.tag === "p:grpSp") {
66524
66600
  const groups = this.ensureArray(spTree["p:grpSp"]);
66525
- const group = groups[entry2.indexInType];
66526
- if (!group) {
66601
+ const group2 = groups[entry2.indexInType];
66602
+ if (!group2) {
66527
66603
  continue;
66528
66604
  }
66529
66605
  const element = await this.parseGroupShapeAsGroup(
66530
- group,
66606
+ group2,
66531
66607
  `layout-group-${layoutToken}-${entry2.indexInType}`,
66532
66608
  layoutPath
66533
66609
  );
@@ -68404,16 +68480,16 @@ function extractDrawingShapeTextStyle(txBody, deps) {
68404
68480
  }
68405
68481
  return { fontSize, fontColor };
68406
68482
  }
68407
- function resolveSmartArtTextStyles(paragraphs, resolve) {
68483
+ function resolveSmartArtTextStyles(paragraphs, resolve2) {
68408
68484
  for (const paragraph of paragraphs ?? []) {
68409
68485
  if (paragraph.endParaRPr) {
68410
- paragraph.endParaStyle = resolve(paragraph.endParaRPr);
68486
+ paragraph.endParaStyle = resolve2(paragraph.endParaRPr);
68411
68487
  }
68412
68488
  for (const item of paragraph.items) {
68413
68489
  if (item.kind === "run" && item.run.rPr) {
68414
- item.run.style = resolve(item.run.rPr);
68490
+ item.run.style = resolve2(item.run.rPr);
68415
68491
  } else if ((item.kind === "field" || item.kind === "break") && item.rPr) {
68416
- item.style = resolve(item.rPr);
68492
+ item.style = resolve2(item.rPr);
68417
68493
  }
68418
68494
  }
68419
68495
  }
@@ -69922,6 +69998,20 @@ var PptxHandlerRuntime90 = class extends PptxHandlerRuntime89 {
69922
69998
  const hasBlanks = expanded.some((value) => value === null);
69923
69999
  const values = hasBlanks ? expanded.map((value) => value ?? 0) : this.extractChartPointValues(valNode, true).map((value) => Number.parseFloat(value)).filter((value) => Number.isFinite(value));
69924
70000
  const blanks = hasBlanks ? expanded.map((value) => value === null) : void 0;
70001
+ const seriesNumberFormat = String(
70002
+ this.xmlLookupService.getChildByLocalName(
70003
+ this.xmlLookupService.getChildByLocalName(seriesNode, "dLbls"),
70004
+ "numFmt"
70005
+ )?.["@_formatCode"] ?? ""
70006
+ ).trim() || String(
70007
+ this.xmlLookupService.getScalarChildByLocalName(
70008
+ this.xmlLookupService.getChildByLocalName(
70009
+ this.xmlLookupService.getChildByLocalName(valNode, "numRef") ?? valNode,
70010
+ "numCache"
70011
+ ),
70012
+ "formatCode"
70013
+ ) ?? ""
70014
+ ).trim();
69925
70015
  const seriesShapeProperties = this.xmlLookupService.getChildByLocalName(seriesNode, "spPr");
69926
70016
  const seriesColor23 = this.parseColor(
69927
70017
  this.xmlLookupService.getChildByLocalName(seriesShapeProperties, "solidFill")
@@ -69953,6 +70043,7 @@ var PptxHandlerRuntime90 = class extends PptxHandlerRuntime89 {
69953
70043
  name: seriesName.trim().length > 0 ? seriesName : `Series ${seriesIndex + 1}`,
69954
70044
  values: fallbackValues,
69955
70045
  ...blanks ? { blanks } : {},
70046
+ ...seriesNumberFormat ? { numberFormat: seriesNumberFormat } : {},
69956
70047
  color: seriesColor23,
69957
70048
  ...trendlines.length > 0 ? { trendlines } : {},
69958
70049
  ...errBars.length > 0 ? { errBars } : {},
@@ -79979,9 +80070,9 @@ var SlideMetadataRenderer = class {
79979
80070
  const clickGroups = this.groupByClickSequence(items);
79980
80071
  const lines = ["### Animations"];
79981
80072
  for (let gi = 0; gi < clickGroups.length; gi += 1) {
79982
- const group = clickGroups[gi];
80073
+ const group2 = clickGroups[gi];
79983
80074
  lines.push(`- **Click ${gi + 1}:**`);
79984
- for (const anim of group) {
80075
+ for (const anim of group2) {
79985
80076
  lines.push(` - ${this.summariseAnimation(anim)}`);
79986
80077
  }
79987
80078
  }
@@ -80877,7 +80968,7 @@ var TextSegmentRenderer = class {
80877
80968
  return "";
80878
80969
  }
80879
80970
  const paragraphs = this.groupParagraphs(segments);
80880
- const renderedParagraphs = paragraphs.map((group) => this.renderParagraph(group, options)).filter((paragraph) => paragraph.text.length > 0);
80971
+ const renderedParagraphs = paragraphs.map((group2) => this.renderParagraph(group2, options)).filter((paragraph) => paragraph.text.length > 0);
80881
80972
  if (renderedParagraphs.length === 0) {
80882
80973
  return "";
80883
80974
  }
@@ -80909,7 +81000,7 @@ var TextSegmentRenderer = class {
80909
81000
  plainText(segments, options = {}) {
80910
81001
  const paragraphs = this.groupParagraphs(segments);
80911
81002
  const rendered = paragraphs.map(
80912
- (group) => group.segments.map((segment) => {
81003
+ (group2) => group2.segments.map((segment) => {
80913
81004
  const base = this.resolvePlainSegmentText(segment, options);
80914
81005
  if (segment.rubyText) {
80915
81006
  return `${base}(${segment.rubyText})`;
@@ -80939,8 +81030,8 @@ var TextSegmentRenderer = class {
80939
81030
  }
80940
81031
  return groups;
80941
81032
  }
80942
- renderParagraph(group, options) {
80943
- let rawText = group.segments.map((segment) => this.renderSegment(segment, options)).join("");
81033
+ renderParagraph(group2, options) {
81034
+ let rawText = group2.segments.map((segment) => this.renderSegment(segment, options)).join("");
80944
81035
  if (options.htmlFormatting) {
80945
81036
  rawText = rawText.replace(/<\/strong><strong>/g, "").replace(/<\/em><em>/g, "").replace(/<\/s><s>/g, "");
80946
81037
  } else {
@@ -80954,10 +81045,10 @@ var TextSegmentRenderer = class {
80954
81045
  return { text: "", isListItem: false };
80955
81046
  }
80956
81047
  if (!options.disableLists && !options.inlineMode) {
80957
- const bullet = group.segments.find((segment) => Boolean(segment.bulletInfo))?.bulletInfo;
81048
+ const bullet = group2.segments.find((segment) => Boolean(segment.bulletInfo))?.bulletInfo;
80958
81049
  if (bullet && !bullet.none) {
80959
- const level = resolveListLevel(bullet, group.index, options.paragraphIndents);
80960
- const marker = resolveListMarker(bullet, group.index);
81050
+ const level = resolveListLevel(bullet, group2.index, options.paragraphIndents);
81051
+ const marker = resolveListMarker(bullet, group2.index);
80961
81052
  const alreadyNumbered = bullet.autoNumType && /^\d+[.)]\s/.test(rawText);
80962
81053
  const prefix = alreadyNumbered ? "" : `${marker} `;
80963
81054
  if (options.htmlFormatting) {
@@ -80973,7 +81064,7 @@ var TextSegmentRenderer = class {
80973
81064
  };
80974
81065
  }
80975
81066
  }
80976
- const align = group.segments[0]?.style.align;
81067
+ const align = group2.segments[0]?.style.align;
80977
81068
  if (!options.disableAlignment && !options.inlineMode && align && align !== "left") {
80978
81069
  return {
80979
81070
  text: `<p align="${align}">${rawText}</p>`,
@@ -83822,8 +83913,8 @@ function buildStrokeOutline(element) {
83822
83913
  function suppressesCssBorder(element) {
83823
83914
  return buildStrokeOutline(element) !== void 0;
83824
83915
  }
83825
- function getGroupChildParentFill(group) {
83826
- return group.type === "group" ? group.groupFill : void 0;
83916
+ function getGroupChildParentFill(group2) {
83917
+ return group2.type === "group" ? group2.groupFill : void 0;
83827
83918
  }
83828
83919
  function resolveGroupChildFill(child22, parentGroupFill) {
83829
83920
  if (!parentGroupFill || !hasShapeProperties(child22) || child22.shapeStyle?.fillMode !== "group") {
@@ -86295,11 +86386,11 @@ var LatexParser = class {
86295
86386
  return tryParseScripts(this, base);
86296
86387
  }
86297
86388
  if (tok.type === "group_start") {
86298
- const group = this.parseGroup();
86299
- if (group.length === 0) {
86389
+ const group2 = this.parseGroup();
86390
+ if (group2.length === 0) {
86300
86391
  return null;
86301
86392
  }
86302
- const base = group.length === 1 ? group[0] : this.wrapE(group);
86393
+ const base = group2.length === 1 ? group2[0] : this.wrapE(group2);
86303
86394
  return tryParseScripts(this, base);
86304
86395
  }
86305
86396
  if (tok.type === "command") {
@@ -86707,6 +86798,273 @@ function latexToMathMl(source) {
86707
86798
  function compileEquationTemplateMathMl() {
86708
86799
  return EQUATION_TEMPLATES.map((tmpl) => latexToMathMl(tmpl.latex));
86709
86800
  }
86801
+ var NICE_STEPS = [1, 2, 2.5, 5, 10];
86802
+ var HEADROOM = 0.05;
86803
+ var ZERO_ANCHOR_RATIO = 5 / 6;
86804
+ function niceAxisStep(value) {
86805
+ if (!Number.isFinite(value) || value <= 0) {
86806
+ return 1;
86807
+ }
86808
+ const exponent = Math.floor(Math.log10(value));
86809
+ const power = 10 ** exponent;
86810
+ const mantissa = value / power;
86811
+ const step = NICE_STEPS.find((candidate) => mantissa <= candidate + 1e-12) ?? 10;
86812
+ return step * power;
86813
+ }
86814
+ function snap(value, unit, direction) {
86815
+ const scaled = value / unit;
86816
+ const rounded = direction === "up" ? Math.ceil(scaled - 1e-9) : Math.floor(scaled + 1e-9);
86817
+ return rounded * unit;
86818
+ }
86819
+ function niceValueAxisBounds(dataMin, dataMax, targetIntervals = 4) {
86820
+ if (!Number.isFinite(dataMin) || !Number.isFinite(dataMax)) {
86821
+ return { min: 0, max: 1, majorUnit: 0.5 };
86822
+ }
86823
+ const low = Math.min(dataMin, dataMax);
86824
+ const high = Math.max(dataMin, dataMax);
86825
+ const intervals = Math.max(1, Math.round(targetIntervals));
86826
+ if (low === high) {
86827
+ if (low === 0) {
86828
+ return { min: 0, max: 1, majorUnit: 1 / intervals };
86829
+ }
86830
+ const unit2 = niceAxisStep(Math.abs(low) / intervals);
86831
+ return low > 0 ? { min: 0, max: snap(low, unit2, "up") || unit2, majorUnit: unit2 } : { min: snap(low, unit2, "down"), max: 0, majorUnit: unit2 };
86832
+ }
86833
+ const dataSpan = high - low;
86834
+ const padding = dataSpan * HEADROOM;
86835
+ let paddedMin;
86836
+ let paddedMax;
86837
+ if (low >= 0) {
86838
+ paddedMin = low < high * ZERO_ANCHOR_RATIO ? 0 : low - padding;
86839
+ paddedMax = high + padding;
86840
+ } else if (high <= 0) {
86841
+ paddedMax = high > low * ZERO_ANCHOR_RATIO ? 0 : high + padding;
86842
+ paddedMin = low - padding;
86843
+ } else {
86844
+ paddedMin = low - padding;
86845
+ paddedMax = high + padding;
86846
+ }
86847
+ const unit = niceAxisStep((paddedMax - paddedMin) / intervals);
86848
+ const min = paddedMin === 0 ? 0 : snap(paddedMin, unit, "down");
86849
+ let max = paddedMax === 0 ? 0 : snap(paddedMax, unit, "up");
86850
+ if (max <= min) {
86851
+ max = min + unit;
86852
+ }
86853
+ return { min, max, majorUnit: unit };
86854
+ }
86855
+ var GENERAL = /* @__PURE__ */ new Set(["", "general", "@"]);
86856
+ function sections(code) {
86857
+ const out = [];
86858
+ let current = "";
86859
+ let inQuotes = false;
86860
+ for (let i = 0; i < code.length; i += 1) {
86861
+ const ch = code[i];
86862
+ if (ch === '"') {
86863
+ inQuotes = !inQuotes;
86864
+ current += ch;
86865
+ continue;
86866
+ }
86867
+ if (ch === "\\") {
86868
+ current += ch + (code[i + 1] ?? "");
86869
+ i += 1;
86870
+ continue;
86871
+ }
86872
+ if (ch === ";" && !inQuotes) {
86873
+ out.push(current);
86874
+ current = "";
86875
+ continue;
86876
+ }
86877
+ current += ch;
86878
+ }
86879
+ out.push(current);
86880
+ return out;
86881
+ }
86882
+ function sectionFor(value, parts) {
86883
+ if (parts.length === 1) {
86884
+ return { code: parts[0], forcePositive: false };
86885
+ }
86886
+ if (value < 0 && parts[1] !== void 0) {
86887
+ return { code: parts[1], forcePositive: true };
86888
+ }
86889
+ if (value === 0 && parts[2] !== void 0) {
86890
+ return { code: parts[2], forcePositive: false };
86891
+ }
86892
+ return { code: parts[0], forcePositive: false };
86893
+ }
86894
+ var PLACEHOLDER = /[0#?]/u;
86895
+ function parsePattern(code) {
86896
+ let scale = 1;
86897
+ let scientific = false;
86898
+ const chars = [];
86899
+ let inQuotes = false;
86900
+ for (let i = 0; i < code.length; i += 1) {
86901
+ const ch = code[i];
86902
+ if (ch === '"') {
86903
+ inQuotes = !inQuotes;
86904
+ continue;
86905
+ }
86906
+ if (inQuotes) {
86907
+ chars.push({ ch, literal: true });
86908
+ continue;
86909
+ }
86910
+ if (ch === "\\" || ch === "*" || ch === "_") {
86911
+ const next = code[i + 1];
86912
+ i += 1;
86913
+ if (ch === "\\" && next !== void 0) {
86914
+ chars.push({ ch: next, literal: true });
86915
+ }
86916
+ continue;
86917
+ }
86918
+ if (ch === "%") {
86919
+ scale *= 100;
86920
+ chars.push({ ch, literal: true });
86921
+ continue;
86922
+ }
86923
+ if (ch === "E" && (code[i + 1] === "+" || code[i + 1] === "-")) {
86924
+ scientific = true;
86925
+ chars.push({ ch: "E", literal: false });
86926
+ i += 1;
86927
+ continue;
86928
+ }
86929
+ if (ch === "[") {
86930
+ const close = code.indexOf("]", i);
86931
+ i = close === -1 ? code.length : close;
86932
+ continue;
86933
+ }
86934
+ chars.push({ ch, literal: false });
86935
+ }
86936
+ const firstDigit = chars.findIndex((c) => !c.literal && PLACEHOLDER.test(c.ch));
86937
+ if (firstDigit === -1) {
86938
+ return void 0;
86939
+ }
86940
+ let lastDigit = firstDigit;
86941
+ for (let i = chars.length - 1; i >= firstDigit; i -= 1) {
86942
+ const c = chars[i];
86943
+ if (!c.literal && (PLACEHOLDER.test(c.ch) || c.ch === "." || c.ch === "," || c.ch === "E")) {
86944
+ lastDigit = i;
86945
+ break;
86946
+ }
86947
+ }
86948
+ const numeric = chars.slice(firstDigit, lastDigit + 1);
86949
+ const prefix = chars.slice(0, firstDigit).map((c) => c.ch).join("");
86950
+ const suffix = chars.slice(lastDigit + 1).map((c) => c.ch).join("");
86951
+ let grouped = false;
86952
+ let intDigits = 0;
86953
+ let required = 0;
86954
+ let optional = 0;
86955
+ let afterPoint = false;
86956
+ let inExponent = false;
86957
+ for (let i = 0; i < numeric.length; i += 1) {
86958
+ const { ch, literal } = numeric[i];
86959
+ if (literal) {
86960
+ continue;
86961
+ }
86962
+ if (ch === "E") {
86963
+ inExponent = true;
86964
+ continue;
86965
+ }
86966
+ if (inExponent) {
86967
+ continue;
86968
+ }
86969
+ if (ch === ".") {
86970
+ afterPoint = true;
86971
+ continue;
86972
+ }
86973
+ if (ch === ",") {
86974
+ const next = numeric.slice(i + 1).find((c) => !c.literal);
86975
+ if (!next || next.ch === "." || !PLACEHOLDER.test(next.ch)) {
86976
+ scale /= 1e3;
86977
+ } else {
86978
+ grouped = true;
86979
+ }
86980
+ continue;
86981
+ }
86982
+ if (!PLACEHOLDER.test(ch)) {
86983
+ continue;
86984
+ }
86985
+ if (afterPoint) {
86986
+ if (ch === "0") {
86987
+ required += 1;
86988
+ } else {
86989
+ optional += 1;
86990
+ }
86991
+ } else if (ch === "0") {
86992
+ intDigits += 1;
86993
+ }
86994
+ }
86995
+ return {
86996
+ prefix,
86997
+ suffix,
86998
+ intDigits,
86999
+ decimals: { required, optional },
87000
+ grouped,
87001
+ scale,
87002
+ scientific
87003
+ };
87004
+ }
87005
+ function group(intPart) {
87006
+ return intPart.replace(/\B(?=(\d{3})+(?!\d))/gu, ",");
87007
+ }
87008
+ function applyPattern(value, pattern, forcePositive) {
87009
+ const scaled = value * pattern.scale;
87010
+ const magnitude = forcePositive ? Math.abs(scaled) : scaled;
87011
+ if (pattern.scientific) {
87012
+ const digits = pattern.decimals.required + pattern.decimals.optional;
87013
+ const exponential = magnitude.toExponential(digits);
87014
+ const [mantissa, exponent] = exponential.split("e");
87015
+ const sign = exponent.startsWith("-") ? "-" : "+";
87016
+ const power = Math.abs(Number(exponent)).toString().padStart(2, "0");
87017
+ return `${pattern.prefix}${mantissa}E${sign}${power}${pattern.suffix}`;
87018
+ }
87019
+ const maxDecimals = pattern.decimals.required + pattern.decimals.optional;
87020
+ let body = magnitude.toFixed(maxDecimals);
87021
+ if (pattern.decimals.optional > 0) {
87022
+ body = body.replace(/(\.\d*?)0+$/u, "$1").replace(/\.$/u, "");
87023
+ const [, frac = ""] = body.split(".");
87024
+ if (frac.length < pattern.decimals.required) {
87025
+ body = Number(body).toFixed(pattern.decimals.required);
87026
+ }
87027
+ }
87028
+ const [rawIntPart, fracPart] = body.split(".");
87029
+ let intPart = rawIntPart;
87030
+ const negative = intPart.startsWith("-");
87031
+ if (negative) {
87032
+ intPart = intPart.slice(1);
87033
+ }
87034
+ if (intPart.length < pattern.intDigits) {
87035
+ intPart = intPart.padStart(pattern.intDigits, "0");
87036
+ }
87037
+ if (pattern.intDigits === 0 && intPart === "0" && fracPart !== void 0) {
87038
+ intPart = "";
87039
+ }
87040
+ if (pattern.grouped) {
87041
+ intPart = group(intPart);
87042
+ }
87043
+ const number = fracPart === void 0 ? intPart : `${intPart}.${fracPart}`;
87044
+ return `${negative ? "-" : ""}${pattern.prefix}${number}${pattern.suffix}`;
87045
+ }
87046
+ function formatChartNumber(value, formatCode) {
87047
+ if (!Number.isFinite(value)) {
87048
+ return void 0;
87049
+ }
87050
+ const code = (formatCode ?? "").trim();
87051
+ if (GENERAL.has(code.toLowerCase())) {
87052
+ return void 0;
87053
+ }
87054
+ if (/(?:^|[^\\"])(?:yy|mm?m|dd?|hh|ss)/iu.test(code) && !/[0#?]/u.test(code)) {
87055
+ return void 0;
87056
+ }
87057
+ const { code: section, forcePositive } = sectionFor(value, sections(code));
87058
+ const pattern = parsePattern(section);
87059
+ if (!pattern) {
87060
+ return void 0;
87061
+ }
87062
+ try {
87063
+ return applyPattern(value, pattern, forcePositive);
87064
+ } catch {
87065
+ return void 0;
87066
+ }
87067
+ }
86710
87068
  var ACCENT1 = "#4472C4";
86711
87069
  var ACCENT2 = "#ED7D31";
86712
87070
  var ACCENT3 = "#A5A5A5";
@@ -86837,12 +87195,11 @@ function computeValueRange(series) {
86837
87195
  if (allValues.length === 0) {
86838
87196
  return { min: 0, max: 1, span: 1 };
86839
87197
  }
86840
- const dataMin = Math.min(...allValues);
86841
- const dataMax = Math.max(...allValues);
86842
- const min = Math.min(dataMin, 0);
86843
- const max = Math.max(dataMax, 0);
86844
- const span = Math.max(max - min, 1);
86845
- return { min, max, span };
87198
+ const { min, max, majorUnit } = niceValueAxisBounds(
87199
+ Math.min(...allValues),
87200
+ Math.max(...allValues)
87201
+ );
87202
+ return { min, max, span: Math.max(max - min, Number.EPSILON), majorUnit };
86846
87203
  }
86847
87204
  function valueToY(val2, range, topY, bottomY) {
86848
87205
  const usable = bottomY - topY;
@@ -86858,7 +87215,11 @@ function valueToY(val2, range, topY, bottomY) {
86858
87215
  }
86859
87216
  return range.reverseOrder ? topY + ratio * usable : bottomY - ratio * usable;
86860
87217
  }
86861
- function formatAxisValue(val2) {
87218
+ function formatAxisValue(val2, formatCode) {
87219
+ const formatted = formatChartNumber(val2, formatCode);
87220
+ if (formatted !== void 0) {
87221
+ return formatted;
87222
+ }
86862
87223
  if (Math.abs(val2) >= 1e6) {
86863
87224
  return `${(val2 / 1e6).toFixed(1)}M`;
86864
87225
  }
@@ -86914,6 +87275,19 @@ function computeLayout(elementWidth, elementHeight, style, hasAxes, legendPos, o
86914
87275
  svgHeight
86915
87276
  };
86916
87277
  }
87278
+ var DEFAULT_CHART_AREA_FILL = "#0f172a11";
87279
+ function resolve(fill, fallback) {
87280
+ if (fill === "none") {
87281
+ return void 0;
87282
+ }
87283
+ return fill ?? fallback;
87284
+ }
87285
+ function chartAreaFill(chartData) {
87286
+ return resolve(chartData?.style?.chartAreaFill, DEFAULT_CHART_AREA_FILL);
87287
+ }
87288
+ function plotAreaFill(chartData) {
87289
+ return resolve(chartData?.style?.plotAreaFill, void 0);
87290
+ }
86917
87291
  var LOG_EXPONENT_TOLERANCE = 1e-12;
86918
87292
  function computeLogValueRange(series, logBase) {
86919
87293
  const allValues = series.flatMap((item) => item.values).filter((value) => value > 0);
@@ -86942,6 +87316,7 @@ function computeValueRangeForAxis(series, axis) {
86942
87316
  const validMax = typeof axis?.max === "number" && Number.isFinite(axis.max) && (!logBase || axis.max > 0) ? axis.max : void 0;
86943
87317
  const min = validMin ?? automatic.min;
86944
87318
  let max = validMax ?? automatic.max;
87319
+ const majorUnit = validMin === void 0 && validMax === void 0 ? automatic.majorUnit : void 0;
86945
87320
  if (max <= min) {
86946
87321
  max = logBase ? min * logBase : min + 1;
86947
87322
  }
@@ -86950,6 +87325,7 @@ function computeValueRangeForAxis(series, axis) {
86950
87325
  min,
86951
87326
  max,
86952
87327
  span: Math.max(span, Number.EPSILON),
87328
+ ...majorUnit !== void 0 ? { majorUnit } : {},
86953
87329
  ...logBase ? { logScale: true, logBase } : {},
86954
87330
  ...axis?.orientation === "maxMin" ? { reverseOrder: true } : {}
86955
87331
  };
@@ -86989,6 +87365,10 @@ function generateAxisTicks(range, axis, defaultIntervals) {
86989
87365
  if (explicit.length > 0) {
86990
87366
  return explicit;
86991
87367
  }
87368
+ const automatic = generateIntervalTicks(range, range.majorUnit ?? 0);
87369
+ if (automatic.length > 0) {
87370
+ return automatic;
87371
+ }
86992
87372
  return Array.from(
86993
87373
  { length: defaultIntervals + 1 },
86994
87374
  (_, index) => range.min + range.span / defaultIntervals * index
@@ -87557,7 +87937,7 @@ function formatTick(val2, axis) {
87557
87937
  if (axis?.displayUnits) {
87558
87938
  return formatAxisValueWithUnits(val2, axis);
87559
87939
  }
87560
- return formatAxisValue2(val2);
87940
+ return formatAxisValue2(val2, axis?.numFmt?.formatCode);
87561
87941
  }
87562
87942
  function buildPrimaryAxis(range, layout, axis, axisX = layout.plotLeft) {
87563
87943
  const gridlines = [];
@@ -87754,7 +88134,11 @@ function hasRicherAxisFeatures(chartData) {
87754
88134
  return Boolean(
87755
88135
  chartData.dataTable || chartData.axes?.some(
87756
88136
  (axis) => axis.crosses !== void 0 || axis.crossesAt !== void 0 || axis.crossBetween !== void 0 || axis.axisType === "valAx" && Boolean(
87757
- axis.logScale || axis.displayUnits || axis.axPos === "r" || axis.orientation === "maxMin" || axis.majorUnit !== void 0 || axis.minorUnit !== void 0 || axis.minorGridlines || axis.majorTickMark !== void 0 || axis.minorTickMark !== void 0 || axis.tickLblPos !== void 0
88137
+ axis.logScale || axis.displayUnits || // A `c:numFmt` is only honoured on the `buildPrimaryAxis`
88138
+ // path; the fast path has no axis to read it from. The two
88139
+ // agree tick-for-tick when no log scale or display unit is
88140
+ // in play, so routing a formatted axis here costs nothing.
88141
+ axis.numFmt?.formatCode || axis.axPos === "r" || axis.orientation === "maxMin" || axis.majorUnit !== void 0 || axis.minorUnit !== void 0 || axis.minorGridlines || axis.majorTickMark !== void 0 || axis.minorTickMark !== void 0 || axis.tickLblPos !== void 0
87758
88142
  )
87759
88143
  )
87760
88144
  );
@@ -87864,7 +88248,7 @@ function buildBars(chartData, catCount, layout, primaryRange, secondaryRange, se
87864
88248
  kind: "text",
87865
88249
  x: x + singleBarWidth / 2,
87866
88250
  y: val2 >= 0 ? y - 4 : y + h + 10,
87867
- text: formatAxisValue2(val2),
88251
+ text: formatAxisValue2(val2, series[si].numberFormat),
87868
88252
  fontSize: 7,
87869
88253
  fill: "#334155",
87870
88254
  textAnchor: "middle"
@@ -87969,7 +88353,7 @@ function pushClusteredStackedLabels(series, sourceIndices2, catCount, layout, ra
87969
88353
  kind: "text",
87970
88354
  x,
87971
88355
  y: labelY,
87972
- text: formatAxisValue2(val2),
88356
+ text: formatAxisValue2(val2, series[si].numberFormat),
87973
88357
  fontSize: 7,
87974
88358
  fill: "#334155",
87975
88359
  textAnchor: "middle"
@@ -88255,7 +88639,7 @@ function buildLines(chartData, catCount, layout, primaryRange, secondaryRange, s
88255
88639
  kind: "text",
88256
88640
  x: pt.x,
88257
88641
  y: pt.y - 7,
88258
- text: formatAxisValue2(val2),
88642
+ text: formatAxisValue2(val2, series.numberFormat),
88259
88643
  fontSize: 7,
88260
88644
  fill: "#334155",
88261
88645
  textAnchor: "middle"
@@ -88327,7 +88711,7 @@ function buildAreas(chartData, catCount, layout, range, sourceIndices2, xPositio
88327
88711
  kind: "text",
88328
88712
  x: pt.x,
88329
88713
  y: pt.y - 6,
88330
- text: formatAxisValue2(val2),
88714
+ text: formatAxisValue2(val2, series.numberFormat),
88331
88715
  fontSize: 7,
88332
88716
  fill: "#334155",
88333
88717
  textAnchor: "middle"
@@ -88372,7 +88756,7 @@ function buildScatter(chartData, layout, range) {
88372
88756
  kind: "text",
88373
88757
  x: dot.cx,
88374
88758
  y: dot.cy - 6,
88375
- text: formatAxisValue2(val2),
88759
+ text: formatAxisValue2(val2, series.numberFormat),
88376
88760
  fontSize: 7,
88377
88761
  fill: "#334155",
88378
88762
  textAnchor: "middle"
@@ -88419,7 +88803,7 @@ function buildBubbles(chartData, layout, range) {
88419
88803
  kind: "text",
88420
88804
  x: dot.cx,
88421
88805
  y: dot.cy - 10,
88422
- text: formatAxisValue2(val2),
88806
+ text: formatAxisValue2(val2, series.numberFormat),
88423
88807
  fontSize: 7,
88424
88808
  fill: "#334155",
88425
88809
  textAnchor: "middle"
@@ -88573,18 +88957,18 @@ function buildMultiLevelCategoryLabels(categoryLabels, categoryLevels, sourceInd
88573
88957
  const bandHeight = Math.max(axis?.fontSize ?? 8, 8) + 4;
88574
88958
  return levels.flatMap((level, levelIndex) => {
88575
88959
  const values = sourceIndices2.map((sourceIndex) => level[sourceIndex] ?? "");
88576
- return groupedLabels(values).flatMap((group) => {
88577
- if (!group.text || group.start % skip !== 0) {
88960
+ return groupedLabels(values).flatMap((group2) => {
88961
+ if (!group2.text || group2.start % skip !== 0) {
88578
88962
  return [];
88579
88963
  }
88580
- const startX = categoryX2(group.start, sourceIndices2.length, layout, spacing);
88581
- const endX = categoryX2(group.end, sourceIndices2.length, layout, spacing);
88964
+ const startX = categoryX2(group2.start, sourceIndices2.length, layout, spacing);
88965
+ const endX = categoryX2(group2.end, sourceIndices2.length, layout, spacing);
88582
88966
  return [
88583
88967
  {
88584
88968
  kind: "text",
88585
88969
  x: (startX + endX) / 2,
88586
88970
  y: labelY + direction * (offset + levelIndex * bandHeight),
88587
- text: group.text,
88971
+ text: group2.text,
88588
88972
  textAnchor,
88589
88973
  ...chartAxisTextStyle(axis)
88590
88974
  }
@@ -89829,7 +90213,7 @@ function buildComboViewModel(element, chartData, categoryLabels) {
89829
90213
  kind: "text",
89830
90214
  x: point.x,
89831
90215
  y: point.y - 7,
89832
- text: formatAxisValue2(point.value),
90216
+ text: formatAxisValue2(point.value, series.numberFormat),
89833
90217
  fontSize: 7,
89834
90218
  fill: "#334155",
89835
90219
  textAnchor: "middle"
@@ -89884,7 +90268,7 @@ function appendBarLabels(series, chartData, layout, catCount, range, sourceIndic
89884
90268
  kind: "text",
89885
90269
  x: xPositions?.[displayIndex] ?? layout.plotLeft + groupWidth * displayIndex + offset + barWidth / 2,
89886
90270
  y: value >= 0 ? Math.min(zeroY, valueY) - 4 : Math.max(zeroY, valueY) + 10,
89887
- text: formatAxisValue2(value),
90271
+ text: formatAxisValue2(value, series.numberFormat),
89888
90272
  fontSize: 7,
89889
90273
  fill: "#334155",
89890
90274
  textAnchor: "middle"
@@ -90921,7 +91305,7 @@ function isOutsidePosition(position2) {
90921
91305
  return position2 === "outEnd" || position2 === "bestFit";
90922
91306
  }
90923
91307
  function buildPieDataLabels(params) {
90924
- const { slices, values, cx, cy, outerR, position: position2, showLeaderLines } = params;
91308
+ const { slices, values, cx, cy, outerR, position: position2, showLeaderLines, numberFormat } = params;
90925
91309
  const outside = isOutsidePosition(position2);
90926
91310
  const labels = [];
90927
91311
  const leaderLines = [];
@@ -90935,7 +91319,7 @@ function buildPieDataLabels(params) {
90935
91319
  kind: "text",
90936
91320
  x: slice.labelX,
90937
91321
  y: slice.labelY,
90938
- text: formatAxisValue2(val2),
91322
+ text: formatAxisValue2(val2, numberFormat),
90939
91323
  fontSize: 8,
90940
91324
  fill: "#ffffff",
90941
91325
  textAnchor: "middle",
@@ -90955,7 +91339,7 @@ function buildPieDataLabels(params) {
90955
91339
  kind: "text",
90956
91340
  x: labelX + (cos >= 0 ? 2 : -2),
90957
91341
  y: labelY,
90958
- text: formatAxisValue2(val2),
91342
+ text: formatAxisValue2(val2, numberFormat),
90959
91343
  fontSize: 8,
90960
91344
  fill: "#334155",
90961
91345
  textAnchor: anchor,
@@ -92224,10 +92608,8 @@ function computeValueRange2(series) {
92224
92608
  if (dataMin === Number.POSITIVE_INFINITY) {
92225
92609
  return { min: 0, max: 1, span: 1 };
92226
92610
  }
92227
- const min = Math.min(dataMin, 0);
92228
- const max = Math.max(dataMax, 0);
92229
- const span = Math.max(max - min, 1);
92230
- return { min, max, span };
92611
+ const { min, max, majorUnit } = niceValueAxisBounds(dataMin, dataMax);
92612
+ return { min, max, span: Math.max(max - min, Number.EPSILON), majorUnit };
92231
92613
  }
92232
92614
  function computeStackedValueRange(series, catCount) {
92233
92615
  let maxSum = 0;
@@ -92246,10 +92628,8 @@ function computeStackedValueRange(series, catCount) {
92246
92628
  maxSum = Math.max(maxSum, pos2);
92247
92629
  minSum = Math.min(minSum, neg);
92248
92630
  }
92249
- const min = Math.min(minSum, 0);
92250
- const max = Math.max(maxSum, 0);
92251
- const span = Math.max(max - min, 1);
92252
- return { min, max, span };
92631
+ const { min, max, majorUnit } = niceValueAxisBounds(Math.min(minSum, 0), Math.max(maxSum, 0));
92632
+ return { min, max, span: Math.max(max - min, Number.EPSILON), majorUnit };
92253
92633
  }
92254
92634
  function valueToY2(val2, range, topY, bottomY) {
92255
92635
  const usable = bottomY - topY;
@@ -92265,7 +92645,11 @@ function valueToY2(val2, range, topY, bottomY) {
92265
92645
  }
92266
92646
  return range.reverseOrder ? topY + ratio * usable : bottomY - ratio * usable;
92267
92647
  }
92268
- function formatAxisValue2(val2) {
92648
+ function formatAxisValue2(val2, formatCode) {
92649
+ const formatted = formatChartNumber(val2, formatCode);
92650
+ if (formatted !== void 0) {
92651
+ return formatted;
92652
+ }
92269
92653
  if (Math.abs(val2) >= 1e6) {
92270
92654
  return `${(val2 / 1e6).toFixed(1)}M`;
92271
92655
  }
@@ -92327,11 +92711,23 @@ var GRIDLINE_COLOR2 = "#e2e8f0";
92327
92711
  var AXIS_LABEL_COLOR = "#64748b";
92328
92712
  var ZERO_LINE_COLOR = "#94a3b8";
92329
92713
  var TICK_COUNT2 = 5;
92714
+ function axisTickValues(range) {
92715
+ const unit = range.majorUnit;
92716
+ if (unit !== void 0 && Number.isFinite(unit) && unit > 0 && !range.logScale) {
92717
+ const steps = Math.round((range.max - range.min) / unit);
92718
+ if (steps >= 1 && steps <= 100) {
92719
+ return Array.from({ length: steps + 1 }, (_unused, index) => range.min + unit * index);
92720
+ }
92721
+ }
92722
+ return Array.from(
92723
+ { length: TICK_COUNT2 + 1 },
92724
+ (_unused, index) => range.min + range.span / TICK_COUNT2 * index
92725
+ );
92726
+ }
92330
92727
  function buildGridlinesAndLabels(range, layout) {
92331
92728
  const gridlines = [];
92332
92729
  const axisLabels = [];
92333
- for (let i = 0; i <= TICK_COUNT2; i++) {
92334
- const val2 = range.min + range.span / TICK_COUNT2 * i;
92730
+ for (const val2 of axisTickValues(range)) {
92335
92731
  const y = valueToY2(val2, range, layout.plotTop, layout.plotBottom);
92336
92732
  gridlines.push({
92337
92733
  kind: "line",
@@ -92649,13 +93045,26 @@ function buildChartViewModel(element) {
92649
93045
  const longestLen = chartData.series.reduce((m, s) => Math.max(m, s.values.length), 0);
92650
93046
  const categoryLabels = chartData.categories.length > 0 ? chartData.categories : Array.from({ length: longestLen }, (_, i) => String(i + 1));
92651
93047
  if (chartType === "ofPie") {
92652
- return withUserShapeOverlay(buildOfPieViewModel(element, chartData, categoryLabels), chartData);
93048
+ return withChartAreaFill(
93049
+ withUserShapeOverlay(buildOfPieViewModel(element, chartData, categoryLabels), chartData),
93050
+ chartData
93051
+ );
92653
93052
  }
92654
93053
  const flat = buildFlatViewModel(element, chartData, categoryLabels, kind);
92655
93054
  if (is3DChartType(chartType)) {
92656
- return withUserShapeOverlay(applyChart3DDepth(flat, chartType, chartData.view3D), chartData);
93055
+ return withChartAreaFill(
93056
+ withUserShapeOverlay(applyChart3DDepth(flat, chartType, chartData.view3D), chartData),
93057
+ chartData
93058
+ );
92657
93059
  }
92658
- return withUserShapeOverlay(flat, chartData);
93060
+ return withChartAreaFill(withUserShapeOverlay(flat, chartData), chartData);
93061
+ }
93062
+ function withChartAreaFill(vm, chartData) {
93063
+ return {
93064
+ ...vm,
93065
+ areaFill: chartAreaFill(chartData),
93066
+ plotFill: plotAreaFill(chartData)
93067
+ };
92659
93068
  }
92660
93069
  function withUserShapeOverlay(vm, chartData) {
92661
93070
  const overlay = buildChartUserShapeOverlay(chartData.userShapes, vm.svgWidth, vm.svgHeight);
@@ -92716,6 +93125,8 @@ function buildFallbackViewModel(width, height, label) {
92716
93125
  return {
92717
93126
  svgWidth,
92718
93127
  svgHeight,
93128
+ // No chart data to read a fill from, so the historical wash stands.
93129
+ areaFill: DEFAULT_CHART_AREA_FILL,
92719
93130
  title: void 0,
92720
93131
  titleX: svgWidth / 2,
92721
93132
  titleY: 14,
@@ -92787,7 +93198,8 @@ function buildPieViewModel(element, chartData, categoryLabels, isDoughnut) {
92787
93198
  cy,
92788
93199
  outerR,
92789
93200
  position: chartData.style.dataLabels?.position,
92790
- showLeaderLines: chartData.style.dataLabels?.showLeaderLines
93201
+ showLeaderLines: chartData.style.dataLabels?.showLeaderLines,
93202
+ numberFormat: chartData.series[0]?.numberFormat
92791
93203
  });
92792
93204
  dataLabels.push(...labelResult.labels);
92793
93205
  primitives.push(...labelResult.leaderLines);
@@ -92906,7 +93318,7 @@ function buildRadarViewModel(element, chartData, categoryLabels) {
92906
93318
  kind: "text",
92907
93319
  x: p.x,
92908
93320
  y: p.y - 8,
92909
- text: formatAxisValue2(val2),
93321
+ text: formatAxisValue2(val2, series.numberFormat),
92910
93322
  fontSize: 7,
92911
93323
  fill: "#334155",
92912
93324
  textAnchor: "middle"
@@ -93956,8 +94368,8 @@ function finalizeClickGroup(steps, options) {
93956
94368
  maxEnd = end;
93957
94369
  }
93958
94370
  }
93959
- const group = { steps, totalDurationMs: maxEnd };
93960
- return group;
94371
+ const group2 = { steps, totalDurationMs: maxEnd };
94372
+ return group2;
93961
94373
  }
93962
94374
  var CLICK_EVENTS = /* @__PURE__ */ new Set(["onClick", "onNext"]);
93963
94375
  var HOVER_EVENTS = /* @__PURE__ */ new Set(["onMouseOver"]);
@@ -93976,6 +94388,9 @@ function normalizeDelay(delay) {
93976
94388
  }
93977
94389
  return { ms: delay, indefinite: false };
93978
94390
  }
94391
+ function isInteractiveTrigger(trigger) {
94392
+ return trigger === "onClick" || trigger === "onShapeClick" || trigger === "onHover";
94393
+ }
93979
94394
  function classifyCondition(cond) {
93980
94395
  const evt = cond.event;
93981
94396
  if (evt && CLICK_EVENTS.has(evt)) {
@@ -93995,7 +94410,8 @@ function resolveEffectiveStartCondition(conditions, fallbackTrigger) {
93995
94410
  delayMs: 0,
93996
94411
  hasClickAlternative: false,
93997
94412
  hasHoverAlternative: false,
93998
- indefinite: false
94413
+ indefinite: false,
94414
+ requiresInteraction: isInteractiveTrigger(fallbackTrigger)
93999
94415
  };
94000
94416
  if (!conditions || conditions.length === 0) {
94001
94417
  return base;
@@ -94040,6 +94456,7 @@ function resolveEffectiveStartCondition(conditions, fallbackTrigger) {
94040
94456
  base.indefinite = indefinite;
94041
94457
  base.dependsOnTimeNodeId = timenode.targetTimeNodeId;
94042
94458
  base.dependsOnEvent = timenode.event;
94459
+ base.requiresInteraction = false;
94043
94460
  return base;
94044
94461
  }
94045
94462
  if (delayCond && (delayCond.delay ?? 0) !== 0) {
@@ -94047,19 +94464,23 @@ function resolveEffectiveStartCondition(conditions, fallbackTrigger) {
94047
94464
  base.trigger = clickCond ? "onClick" : "afterDelay";
94048
94465
  base.delayMs = ms;
94049
94466
  base.indefinite = indefinite;
94467
+ base.requiresInteraction = indefinite;
94050
94468
  return base;
94051
94469
  }
94052
94470
  if (clickCond) {
94053
94471
  base.trigger = clickCond.targetShapeId ? "onShapeClick" : "onClick";
94472
+ base.requiresInteraction = true;
94054
94473
  return base;
94055
94474
  }
94056
94475
  if (hoverCond) {
94057
94476
  base.trigger = "onHover";
94477
+ base.requiresInteraction = true;
94058
94478
  return base;
94059
94479
  }
94060
94480
  if (delayCond) {
94061
94481
  base.trigger = fallbackTrigger;
94062
94482
  base.delayMs = 0;
94483
+ base.requiresInteraction = false;
94063
94484
  }
94064
94485
  return base;
94065
94486
  }
@@ -94398,7 +94819,7 @@ function parseMediaCommand(commandString) {
94398
94819
  if (lower === "stop" || lower === "stopmedia") {
94399
94820
  return { verb: "stop" };
94400
94821
  }
94401
- if (lower === "toggleplay") {
94822
+ if (lower === "toggleplay" || lower === "togglepause") {
94402
94823
  return { verb: "togglePlay" };
94403
94824
  }
94404
94825
  return void 0;
@@ -94522,15 +94943,15 @@ function buildTimeline(nativeAnimations) {
94522
94943
  const isFirstAnimation = clickGroups.length === 0 && currentGroup.length === 0;
94523
94944
  if (isOnClick || isFirstAnimation) {
94524
94945
  if (currentGroup.length > 0) {
94525
- const group = finalizeClickGroup(currentGroup);
94946
+ const group2 = finalizeClickGroup(currentGroup);
94526
94947
  if (currentGroupAutoStart || !currentGroupIsClick && clickGroups.length > 0) {
94527
- group.autoAdvance = true;
94948
+ group2.autoAdvance = true;
94528
94949
  }
94529
- clickGroups.push(group);
94950
+ clickGroups.push(group2);
94530
94951
  }
94531
94952
  currentGroup = [];
94532
94953
  currentGroupIsClick = isOnClick || isFirstAnimation;
94533
- currentGroupAutoStart = !isOnClick && singleAnim.groupAutoStart === true;
94954
+ currentGroupAutoStart = singleAnim.groupAutoStart === true && !effective.requiresInteraction;
94534
94955
  subGroupIndex = singleAnim.parGroupIndex;
94535
94956
  subGroupStartMs = 0;
94536
94957
  }
@@ -94570,15 +94991,15 @@ function buildTimeline(nativeAnimations) {
94570
94991
  }
94571
94992
  }
94572
94993
  if (currentGroup.length > 0) {
94573
- const group = finalizeClickGroup(currentGroup);
94994
+ const group2 = finalizeClickGroup(currentGroup);
94574
94995
  if (currentGroupAutoStart || !currentGroupIsClick && clickGroups.length > 0) {
94575
- group.autoAdvance = true;
94996
+ group2.autoAdvance = true;
94576
94997
  }
94577
- clickGroups.push(group);
94998
+ clickGroups.push(group2);
94578
94999
  }
94579
- for (const group of clickGroups) {
94580
- if (group.autoAdvance) {
94581
- group.autoAdvanceDelayMs = 0;
95000
+ for (const group2 of clickGroups) {
95001
+ if (group2.autoAdvance) {
95002
+ group2.autoAdvanceDelayMs = 0;
94582
95003
  }
94583
95004
  }
94584
95005
  const interactiveSequences = buildSequenceGroups(
@@ -94635,25 +95056,26 @@ function buildSequenceGroups(animsByKey, entranceIds, neededKeyframes, dynamicBl
94635
95056
  for (const anim of anims) {
94636
95057
  let effect = resolveEffect(anim);
94637
95058
  const dynamic = effect ? void 0 : buildDynamicKeyframe(anim, dynamicUid++);
94638
- if (!effect && !dynamic) {
95059
+ const isCommand = !effect && !dynamic && isMediaCommandAnimation(anim);
95060
+ if (!effect && !dynamic && !isCommand) {
94639
95061
  effect = fallbackEffectForClass(anim.presetClass);
94640
95062
  if (!effect) {
94641
95063
  continue;
94642
95064
  }
94643
95065
  }
94644
- const keyframe = effect ? cssKeyframeName(effect) : dynamic.keyframeName;
95066
+ const keyframe = isCommand ? "" : effect ? cssKeyframeName(effect) : dynamic.keyframeName;
94645
95067
  if (effect) {
94646
95068
  neededKeyframes.add(effect);
94647
95069
  }
94648
95070
  if (dynamic) {
94649
95071
  dynamicBlocks.push(dynamic.css);
94650
95072
  }
94651
- const elementId = anim.targetId ?? "";
95073
+ const elementId = isCommand ? "" : anim.targetId ?? "";
94652
95074
  const seqTrigger = anim.trigger ?? "onShapeClick";
94653
- const duration = anim.durationMs ?? defaultDuration(anim.presetClass);
95075
+ const duration = isCommand ? 0 : anim.durationMs ?? defaultDuration(anim.presetClass);
94654
95076
  const animDelay = Math.max(anim.delayMs ?? 0, anim.triggerDelayMs ?? 0);
94655
95077
  const triggerDelay = 0;
94656
- const presetClass = anim.presetClass ?? "entr";
95078
+ const presetClass = isCommand ? "emph" : anim.presetClass ?? "entr";
94657
95079
  const fill = fillModeForClass(anim.presetClass);
94658
95080
  const iterCount = anim.repeatCount ?? 1;
94659
95081
  const direction = anim.autoReverse ? "alternate" : "normal";
@@ -94677,7 +95099,7 @@ function buildSequenceGroups(animsByKey, entranceIds, neededKeyframes, dynamicBl
94677
95099
  }
94678
95100
  const iterStr = iterCount === Infinity ? "infinite" : String(iterCount);
94679
95101
  const easing = cssEasingForAnimation(anim);
94680
- const cssAnimation = `${keyframe} ${duration}ms ${easing} ${delayMs}ms ${iterStr} ${direction} ${fill}`;
95102
+ const cssAnimation = isCommand ? "" : `${keyframe} ${duration}ms ${easing} ${delayMs}ms ${iterStr} ${direction} ${fill}`;
94681
95103
  seqGroup.push({
94682
95104
  elementId,
94683
95105
  cssAnimation,
@@ -94689,8 +95111,9 @@ function buildSequenceGroups(animsByKey, entranceIds, neededKeyframes, dynamicBl
94689
95111
  presetClass,
94690
95112
  soundPath: anim.soundPath,
94691
95113
  stopSound: anim.stopSound,
94692
- build: resolveStepBuildDescriptor(anim),
94693
- colorTargets: stepColorTargets(anim)
95114
+ command: isCommand ? buildStepCommand(anim) : void 0,
95115
+ build: isCommand ? void 0 : resolveStepBuildDescriptor(anim),
95116
+ colorTargets: isCommand ? void 0 : stepColorTargets(anim)
94694
95117
  });
94695
95118
  }
94696
95119
  if (seqGroup.length > 0) {
@@ -94804,9 +95227,9 @@ var TimelineEngine = class _TimelineEngine {
94804
95227
  return null;
94805
95228
  }
94806
95229
  this.currentGroupIndex++;
94807
- const group = this.timeline.clickGroups[this.currentGroupIndex];
94808
- this.applyGroupSteps(group);
94809
- return group;
95230
+ const group2 = this.timeline.clickGroups[this.currentGroupIndex];
95231
+ this.applyGroupSteps(group2);
95232
+ return group2;
94810
95233
  }
94811
95234
  /**
94812
95235
  * Peek at the next click-group without advancing.
@@ -94918,9 +95341,9 @@ var TimelineEngine = class _TimelineEngine {
94918
95341
  return null;
94919
95342
  }
94920
95343
  this.interactiveGroupIndexes.set(triggerShapeId, nextIdx);
94921
- const group = groups[nextIdx];
94922
- this.applyGroupSteps(group);
94923
- return group;
95344
+ const group2 = groups[nextIdx];
95345
+ this.applyGroupSteps(group2);
95346
+ return group2;
94924
95347
  }
94925
95348
  /**
94926
95349
  * Advance the hover sequence for a given trigger shape.
@@ -94937,9 +95360,9 @@ var TimelineEngine = class _TimelineEngine {
94937
95360
  return null;
94938
95361
  }
94939
95362
  this.hoverGroupIndexes.set(triggerShapeId, nextIdx);
94940
- const group = groups[nextIdx];
94941
- this.applyGroupSteps(group);
94942
- return group;
95363
+ const group2 = groups[nextIdx];
95364
+ this.applyGroupSteps(group2);
95365
+ return group2;
94943
95366
  }
94944
95367
  /**
94945
95368
  * Reset the hover sequence for a given trigger shape so it can replay
@@ -94961,8 +95384,8 @@ var TimelineEngine = class _TimelineEngine {
94961
95384
  */
94962
95385
  completeAll() {
94963
95386
  this.reset();
94964
- for (const group of this.timeline.clickGroups) {
94965
- for (const step of group.steps) {
95387
+ for (const group2 of this.timeline.clickGroups) {
95388
+ for (const step of group2.steps) {
94966
95389
  if (step.build || step.colorTargets) {
94967
95390
  this.activeSteps.set(step.elementId, step);
94968
95391
  }
@@ -94991,8 +95414,8 @@ var TimelineEngine = class _TimelineEngine {
94991
95414
  /**
94992
95415
  * Apply a group's steps to the internal tracking state.
94993
95416
  */
94994
- applyGroupSteps(group) {
94995
- for (const step of group.steps) {
95417
+ applyGroupSteps(group2) {
95418
+ for (const step of group2.steps) {
94996
95419
  this.activeAnimations.set(step.elementId, step.cssAnimation);
94997
95420
  if (step.build || step.colorTargets) {
94998
95421
  this.activeSteps.set(step.elementId, step);
@@ -95565,9 +95988,9 @@ var PresentationAnimationController = class _PresentationAnimationController {
95565
95988
  * binding the group needs a requestAnimationFrame reveal loop; an empty result
95566
95989
  * means ordinary discrete click-advance is enough.
95567
95990
  */
95568
- static collectBuildStepIds(group) {
95991
+ static collectBuildStepIds(group2) {
95569
95992
  const ids = [];
95570
- for (const step of group.steps) {
95993
+ for (const step of group2.steps) {
95571
95994
  if (step.build) {
95572
95995
  ids.push(step.elementId);
95573
95996
  }
@@ -95634,8 +96057,8 @@ function findMediaElementByElementId(targetId, root) {
95634
96057
  }
95635
96058
  return void 0;
95636
96059
  }
95637
- function runMediaCommand(command, resolve) {
95638
- const el = resolve(command.targetId);
96060
+ function runMediaCommand(command, resolve2) {
96061
+ const el = resolve2(command.targetId);
95639
96062
  if (!el) {
95640
96063
  return false;
95641
96064
  }
@@ -96438,10 +96861,10 @@ function collectSections(entry2, tableData, pos2) {
96438
96861
  const isBottom = rowIndex === rowCount - 1;
96439
96862
  const isLeft = cellIndex === 0;
96440
96863
  const isRight = cellIndex === columnCount - 1;
96441
- const sections = [];
96864
+ const sections2 = [];
96442
96865
  const push2 = (borders, regionTop, regionBottom, regionLeft, regionRight) => {
96443
96866
  if (borders) {
96444
- sections.push({ borders, regionTop, regionBottom, regionLeft, regionRight });
96867
+ sections2.push({ borders, regionTop, regionBottom, regionLeft, regionRight });
96445
96868
  }
96446
96869
  };
96447
96870
  push2(entry2.wholeTblBorders, isTop, isBottom, isLeft, isRight);
@@ -96481,19 +96904,19 @@ function collectSections(entry2, tableData, pos2) {
96481
96904
  if (tableData.lastCol && isRight) {
96482
96905
  push2(entry2.lastColBorders, isTop, isBottom, true, true);
96483
96906
  }
96484
- return sections;
96907
+ return sections2;
96485
96908
  }
96486
- function resolveStyleDiagonalBorders(entry2, tableData, pos2, resolve) {
96909
+ function resolveStyleDiagonalBorders(entry2, tableData, pos2, resolve2) {
96487
96910
  if (!entry2) {
96488
96911
  return void 0;
96489
96912
  }
96490
- const sections = collectSections(entry2, tableData, pos2);
96491
- if (sections.length === 0) {
96913
+ const sections2 = collectSections(entry2, tableData, pos2);
96914
+ if (sections2.length === 0) {
96492
96915
  return void 0;
96493
96916
  }
96494
96917
  let tl2br;
96495
96918
  let bl2tr;
96496
- for (const section of sections) {
96919
+ for (const section of sections2) {
96497
96920
  if (section.borders.tl2br) {
96498
96921
  tl2br = section.borders.tl2br;
96499
96922
  }
@@ -96504,12 +96927,12 @@ function resolveStyleDiagonalBorders(entry2, tableData, pos2, resolve) {
96504
96927
  const info = {};
96505
96928
  let applied = false;
96506
96929
  if (tl2br && !tl2br.noFill) {
96507
- info.diagDownColor = tl2br.color ?? resolve(tl2br.fill) ?? "#000000";
96930
+ info.diagDownColor = tl2br.color ?? resolve2(tl2br.fill) ?? "#000000";
96508
96931
  info.diagDownWidth = tl2br.width ?? 1;
96509
96932
  applied = true;
96510
96933
  }
96511
96934
  if (bl2tr && !bl2tr.noFill) {
96512
- info.diagUpColor = bl2tr.color ?? resolve(bl2tr.fill) ?? "#000000";
96935
+ info.diagUpColor = bl2tr.color ?? resolve2(bl2tr.fill) ?? "#000000";
96513
96936
  info.diagUpWidth = bl2tr.width ?? 1;
96514
96937
  applied = true;
96515
96938
  }
@@ -97916,7 +98339,7 @@ function groupElements(elements, ids, groupId) {
97916
98339
  x: el.x - groupX,
97917
98340
  y: el.y - groupY
97918
98341
  }));
97919
- const group = {
98342
+ const group2 = {
97920
98343
  type: "group",
97921
98344
  id: groupId,
97922
98345
  name: "Group",
@@ -97935,7 +98358,7 @@ function groupElements(elements, ids, groupId) {
97935
98358
  }
97936
98359
  const result = [
97937
98360
  ...remaining.slice(0, adjustedIndex),
97938
- group,
98361
+ group2,
97939
98362
  ...remaining.slice(adjustedIndex)
97940
98363
  ];
97941
98364
  return { elements: result, groupId };
@@ -98167,38 +98590,38 @@ function resolveSlideId(slide, index) {
98167
98590
  const cSld = rawXml?.["p:sld"];
98168
98591
  return String(cSld?.["@_id"] || slide?.slideNumber || index + 1);
98169
98592
  }
98170
- function groupSlidesBySection(sections, slides) {
98593
+ function groupSlidesBySection(sections2, slides) {
98171
98594
  if (slides.length === 0) {
98172
98595
  return [];
98173
98596
  }
98174
- if (sections.length === 0) {
98597
+ if (sections2.length === 0) {
98175
98598
  return [
98176
98599
  { section: void 0, slides: [...slides], slideIndexes: slides.map((_slide, i) => i) }
98177
98600
  ];
98178
98601
  }
98179
- const sectionById = new Map(sections.map((section) => [section.id, section]));
98602
+ const sectionById = new Map(sections2.map((section) => [section.id, section]));
98180
98603
  const grouped = /* @__PURE__ */ new Map();
98181
98604
  const ungrouped = {
98182
98605
  section: void 0,
98183
98606
  slides: [],
98184
98607
  slideIndexes: []
98185
98608
  };
98186
- for (const section of sections) {
98609
+ for (const section of sections2) {
98187
98610
  grouped.set(section.id, { section, slides: [], slideIndexes: [] });
98188
98611
  }
98189
98612
  slides.forEach((slide, index) => {
98190
- const group = slide.sectionId ? grouped.get(slide.sectionId) : void 0;
98191
- const target = group && sectionById.has(slide.sectionId ?? "") ? group : ungrouped;
98613
+ const group2 = slide.sectionId ? grouped.get(slide.sectionId) : void 0;
98614
+ const target = group2 && sectionById.has(slide.sectionId ?? "") ? group2 : ungrouped;
98192
98615
  target.slides.push(slide);
98193
98616
  target.slideIndexes.push(index);
98194
98617
  });
98195
- const result = sections.map((section) => grouped.get(section.id)).filter((group) => group.slides.length > 0);
98618
+ const result = sections2.map((section) => grouped.get(section.id)).filter((group2) => group2.slides.length > 0);
98196
98619
  if (ungrouped.slides.length > 0) {
98197
98620
  result.push(ungrouped);
98198
98621
  }
98199
98622
  return result;
98200
98623
  }
98201
- function addSection(sections, slides, name, afterSlideIndex, idGenerator = generateSectionId) {
98624
+ function addSection(sections2, slides, name, afterSlideIndex, idGenerator = generateSectionId) {
98202
98625
  const newId = idGenerator();
98203
98626
  const slideAtIndex = slides[afterSlideIndex];
98204
98627
  const currentSectionId = slideAtIndex?.sectionId;
@@ -98213,9 +98636,9 @@ function addSection(sections, slides, name, afterSlideIndex, idGenerator = gener
98213
98636
  const nextSlides = slides.map(
98214
98637
  (s, i) => claimedSlideIndexes.includes(i) ? { ...s, sectionId: newId, sectionName: name } : s
98215
98638
  );
98216
- const insertIndex = currentSectionId !== void 0 ? sections.findIndex((sec) => sec.id === currentSectionId) + 1 : sections.length;
98639
+ const insertIndex = currentSectionId !== void 0 ? sections2.findIndex((sec) => sec.id === currentSectionId) + 1 : sections2.length;
98217
98640
  const newSectionSlideIds = claimedSlideIndexes.map((i) => resolveSlideId(slides[i], i));
98218
- const updated = sections.map(
98641
+ const updated = sections2.map(
98219
98642
  (sec) => sec.id === currentSectionId ? { ...sec, slideIds: sec.slideIds.filter((sid) => !newSectionSlideIds.includes(sid)) } : sec
98220
98643
  );
98221
98644
  const newSection = { id: newId, name, slideIds: newSectionSlideIds };
@@ -98223,20 +98646,20 @@ function addSection(sections, slides, name, afterSlideIndex, idGenerator = gener
98223
98646
  nextSections.splice(insertIndex, 0, newSection);
98224
98647
  return { sections: nextSections, slides: nextSlides };
98225
98648
  }
98226
- function renameSection(sections, slides, sectionId, newName) {
98649
+ function renameSection(sections2, slides, sectionId, newName) {
98227
98650
  return {
98228
- sections: sections.map((sec) => sec.id === sectionId ? { ...sec, name: newName } : sec),
98651
+ sections: sections2.map((sec) => sec.id === sectionId ? { ...sec, name: newName } : sec),
98229
98652
  slides: slides.map((s) => s.sectionId === sectionId ? { ...s, sectionName: newName } : s)
98230
98653
  };
98231
98654
  }
98232
- function deleteSection(sections, slides, sectionId) {
98233
- const idx = sections.findIndex((sec) => sec.id === sectionId);
98655
+ function deleteSection(sections2, slides, sectionId) {
98656
+ const idx = sections2.findIndex((sec) => sec.id === sectionId);
98234
98657
  if (idx === -1) {
98235
- return { sections, slides };
98658
+ return { sections: sections2, slides };
98236
98659
  }
98237
- const deletedSection = sections[idx];
98238
- const prevSection = idx > 0 ? sections[idx - 1] : void 0;
98239
- const filtered = sections.filter((sec) => sec.id !== sectionId);
98660
+ const deletedSection = sections2[idx];
98661
+ const prevSection = idx > 0 ? sections2[idx - 1] : void 0;
98662
+ const filtered = sections2.filter((sec) => sec.id !== sectionId);
98240
98663
  const nextSections = prevSection !== void 0 ? filtered.map(
98241
98664
  (sec) => sec.id === prevSection.id ? { ...sec, slideIds: [...sec.slideIds, ...deletedSection.slideIds] } : sec
98242
98665
  ) : filtered;
@@ -98251,34 +98674,34 @@ function deleteSection(sections, slides, sectionId) {
98251
98674
  });
98252
98675
  return { sections: nextSections, slides: nextSlides };
98253
98676
  }
98254
- function moveSectionUp(sections, sectionId) {
98255
- const idx = sections.findIndex((sec) => sec.id === sectionId);
98677
+ function moveSectionUp(sections2, sectionId) {
98678
+ const idx = sections2.findIndex((sec) => sec.id === sectionId);
98256
98679
  if (idx <= 0) {
98257
- return sections;
98680
+ return sections2;
98258
98681
  }
98259
- const next = [...sections];
98682
+ const next = [...sections2];
98260
98683
  [next[idx - 1], next[idx]] = [next[idx], next[idx - 1]];
98261
98684
  return next;
98262
98685
  }
98263
- function moveSectionDown(sections, sectionId) {
98264
- const idx = sections.findIndex((sec) => sec.id === sectionId);
98265
- if (idx === -1 || idx >= sections.length - 1) {
98266
- return sections;
98686
+ function moveSectionDown(sections2, sectionId) {
98687
+ const idx = sections2.findIndex((sec) => sec.id === sectionId);
98688
+ if (idx === -1 || idx >= sections2.length - 1) {
98689
+ return sections2;
98267
98690
  }
98268
- const next = [...sections];
98691
+ const next = [...sections2];
98269
98692
  [next[idx], next[idx + 1]] = [next[idx + 1], next[idx]];
98270
98693
  return next;
98271
98694
  }
98272
- function moveSlidesToSection(sections, slides, slideIndexes, targetSectionId) {
98273
- const targetSection = sections.find((sec) => sec.id === targetSectionId);
98695
+ function moveSlidesToSection(sections2, slides, slideIndexes, targetSectionId) {
98696
+ const targetSection = sections2.find((sec) => sec.id === targetSectionId);
98274
98697
  if (!targetSection) {
98275
- return { sections, slides };
98698
+ return { sections: sections2, slides };
98276
98699
  }
98277
98700
  const nextSlides = slides.map(
98278
98701
  (s, i) => slideIndexes.includes(i) ? { ...s, sectionId: targetSectionId, sectionName: targetSection.name } : s
98279
98702
  );
98280
98703
  const movedSlideIds = slideIndexes.map((i) => resolveSlideId(slides[i], i));
98281
- const nextSections = sections.map((sec) => {
98704
+ const nextSections = sections2.map((sec) => {
98282
98705
  if (sec.id === targetSectionId) {
98283
98706
  return {
98284
98707
  ...sec,
@@ -98853,7 +99276,7 @@ function buildTextBlockStyle(element, options = {}) {
98853
99276
  style.unicodeBidi = "plaintext";
98854
99277
  }
98855
99278
  style.fontSize = ts?.fontSize || DEFAULT_TEXT_FONT_SIZE;
98856
- style.fontFamily = ts?.fontFamily || DEFAULT_FONT_FAMILY;
99279
+ style.fontFamily = ts?.fontFamily ? getSubstituteFontFamily(ts.fontFamily, parsePanoseString(ts.latinFontPanose)) : DEFAULT_FONT_FAMILY;
98857
99280
  style.fontWeight = ts?.bold ? 700 : 400;
98858
99281
  style.fontStyle = ts?.italic ? "italic" : "normal";
98859
99282
  style.textDecorationLine = decorations.length > 0 ? decorations.join(" ") : "none";
@@ -99907,8 +100330,8 @@ function toAbsolute(child22, offsetX, offsetY) {
99907
100330
  function sameBox(a, b) {
99908
100331
  return Math.abs(a.x - b.x) <= 0.5 && Math.abs(a.y - b.y) <= 0.5 && Math.abs(a.width - b.width) <= 0.5 && Math.abs(a.height - b.height) <= 0.5;
99909
100332
  }
99910
- function correspondingGroup(group, candidates) {
99911
- const morphName = getElementMorphName(group);
100333
+ function correspondingGroup(group2, candidates) {
100334
+ const morphName = getElementMorphName(group2);
99912
100335
  return candidates.find((candidate) => {
99913
100336
  if (candidate.type !== "group") {
99914
100337
  return false;
@@ -99916,10 +100339,10 @@ function correspondingGroup(group, candidates) {
99916
100339
  if (morphName !== void 0 && getElementMorphName(candidate) === morphName) {
99917
100340
  return true;
99918
100341
  }
99919
- if (group.name && candidate.name === group.name) {
100342
+ if (group2.name && candidate.name === group2.name) {
99920
100343
  return true;
99921
100344
  }
99922
- return sameBox(group, candidate);
100345
+ return sameBox(group2, candidate);
99923
100346
  });
99924
100347
  }
99925
100348
  function flattenMorphElements(elements, counterpart, offsetX = 0, offsetY = 0) {
@@ -106311,8 +106734,8 @@ async function loadOrbitControlsCtor() {
106311
106734
  }
106312
106735
  }
106313
106736
  function loadGltf(loader, url) {
106314
- return new Promise((resolve, reject) => {
106315
- loader.load(url, resolve, void 0, reject);
106737
+ return new Promise((resolve2, reject) => {
106738
+ loader.load(url, resolve2, void 0, reject);
106316
106739
  });
106317
106740
  }
106318
106741
  function centerAndFit(three, root) {
@@ -106779,9 +107202,9 @@ function isExportAbortError(err) {
106779
107202
  }
106780
107203
  var PPTX_OPEN_ACCEPT = ".pptx,.ppsx,.pptm,.potx";
106781
107204
  function openFilePicker(options = {}) {
106782
- return new Promise((resolve) => {
107205
+ return new Promise((resolve2) => {
106783
107206
  if (typeof document === "undefined") {
106784
- resolve(null);
107207
+ resolve2(null);
106785
107208
  return;
106786
107209
  }
106787
107210
  const input = document.createElement("input");
@@ -106797,7 +107220,7 @@ function openFilePicker(options = {}) {
106797
107220
  }
106798
107221
  settled = true;
106799
107222
  input.remove();
106800
- resolve(file);
107223
+ resolve2(file);
106801
107224
  };
106802
107225
  input.addEventListener("change", () => finish(input.files?.[0] ?? null));
106803
107226
  input.addEventListener("cancel", () => finish(null));
@@ -106823,12 +107246,6 @@ function mobileSlideCounter(currentIndex, total) {
106823
107246
  }
106824
107247
  return `${currentIndex + 1} / ${total}`;
106825
107248
  }
106826
- function isFirstSlide(currentIndex) {
106827
- return currentIndex <= 0;
106828
- }
106829
- function isLastSlide(currentIndex, total) {
106830
- return currentIndex >= total - 1;
106831
- }
106832
107249
  function pad2(value) {
106833
107250
  return String(value).padStart(2, "0");
106834
107251
  }
@@ -107370,7 +107787,7 @@ async function swapPresentationWindows(presenter, audience) {
107370
107787
  }
107371
107788
  }
107372
107789
  function openDeckDb() {
107373
- return new Promise((resolve, reject) => {
107790
+ return new Promise((resolve2, reject) => {
107374
107791
  const request = indexedDB.open(DB_NAME, DB_VERSION);
107375
107792
  request.onupgradeneeded = () => {
107376
107793
  const db = request.result;
@@ -107378,13 +107795,13 @@ function openDeckDb() {
107378
107795
  db.createObjectStore(STORE_NAME);
107379
107796
  }
107380
107797
  };
107381
- request.onsuccess = () => resolve(request.result);
107798
+ request.onsuccess = () => resolve2(request.result);
107382
107799
  request.onerror = () => reject(request.error);
107383
107800
  });
107384
107801
  }
107385
107802
  async function storePresentationDeck(sessionId, content) {
107386
107803
  const db = await openDeckDb();
107387
- return new Promise((resolve, reject) => {
107804
+ return new Promise((resolve2, reject) => {
107388
107805
  const tx = db.transaction(STORE_NAME, "readwrite");
107389
107806
  const bytes = content instanceof Uint8Array ? content : new Uint8Array(content);
107390
107807
  tx.objectStore(STORE_NAME).put(
@@ -107393,7 +107810,7 @@ async function storePresentationDeck(sessionId, content) {
107393
107810
  );
107394
107811
  tx.oncomplete = () => {
107395
107812
  db.close();
107396
- resolve();
107813
+ resolve2();
107397
107814
  };
107398
107815
  tx.onerror = () => {
107399
107816
  db.close();
@@ -107404,17 +107821,17 @@ async function storePresentationDeck(sessionId, content) {
107404
107821
  async function loadPresentationDeck(sessionId) {
107405
107822
  try {
107406
107823
  const db = await openDeckDb();
107407
- return await new Promise((resolve, reject) => {
107824
+ return await new Promise((resolve2, reject) => {
107408
107825
  const request = db.transaction(STORE_NAME, "readonly").objectStore(STORE_NAME).get(sessionId);
107409
107826
  request.onsuccess = () => {
107410
107827
  db.close();
107411
107828
  const record = request.result;
107412
107829
  if (!record || Date.now() - record.createdAt > MAX_DECK_AGE_MS) {
107413
- resolve(null);
107830
+ resolve2(null);
107414
107831
  return;
107415
107832
  }
107416
107833
  const raw = record.bytes;
107417
- resolve(
107834
+ resolve2(
107418
107835
  raw instanceof Uint8Array ? raw : raw instanceof ArrayBuffer ? new Uint8Array(raw) : null
107419
107836
  );
107420
107837
  };
@@ -107430,16 +107847,16 @@ async function loadPresentationDeck(sessionId) {
107430
107847
  async function clearPresentationDeck(sessionId) {
107431
107848
  try {
107432
107849
  const db = await openDeckDb();
107433
- await new Promise((resolve) => {
107850
+ await new Promise((resolve2) => {
107434
107851
  const tx = db.transaction(STORE_NAME, "readwrite");
107435
107852
  tx.objectStore(STORE_NAME).delete(sessionId);
107436
107853
  tx.oncomplete = () => {
107437
107854
  db.close();
107438
- resolve();
107855
+ resolve2();
107439
107856
  };
107440
107857
  tx.onerror = () => {
107441
107858
  db.close();
107442
- resolve();
107859
+ resolve2();
107443
107860
  };
107444
107861
  });
107445
107862
  } catch {
@@ -107451,7 +107868,7 @@ var STORE_NAME2 = "content";
107451
107868
  var CONTENT_KEY = "pptx-bytes";
107452
107869
  var MAX_CONTENT_AGE_MS = 5 * 60 * 1e3;
107453
107870
  function openDb() {
107454
- return new Promise((resolve, reject) => {
107871
+ return new Promise((resolve2, reject) => {
107455
107872
  const request = indexedDB.open(DB_NAME2, DB_VERSION2);
107456
107873
  request.onupgradeneeded = () => {
107457
107874
  const db = request.result;
@@ -107459,7 +107876,7 @@ function openDb() {
107459
107876
  db.createObjectStore(STORE_NAME2);
107460
107877
  }
107461
107878
  };
107462
- request.onsuccess = () => resolve(request.result);
107879
+ request.onsuccess = () => resolve2(request.result);
107463
107880
  request.onerror = () => reject(request.error);
107464
107881
  });
107465
107882
  }
@@ -107468,7 +107885,7 @@ async function storeAudienceContent(content, sessionId) {
107468
107885
  return storePresentationDeck(sessionId, content);
107469
107886
  }
107470
107887
  const db = await openDb();
107471
- return new Promise((resolve, reject) => {
107888
+ return new Promise((resolve2, reject) => {
107472
107889
  const tx = db.transaction(STORE_NAME2, "readwrite");
107473
107890
  const store = tx.objectStore(STORE_NAME2);
107474
107891
  const bytes = content instanceof Uint8Array ? content : new Uint8Array(content);
@@ -107476,7 +107893,7 @@ async function storeAudienceContent(content, sessionId) {
107476
107893
  store.put(record, CONTENT_KEY);
107477
107894
  tx.oncomplete = () => {
107478
107895
  db.close();
107479
- resolve();
107896
+ resolve2();
107480
107897
  };
107481
107898
  tx.onerror = () => {
107482
107899
  db.close();
@@ -107490,7 +107907,7 @@ async function loadAudienceContent(sessionId) {
107490
107907
  }
107491
107908
  try {
107492
107909
  const db = await openDb();
107493
- return new Promise((resolve, reject) => {
107910
+ return new Promise((resolve2, reject) => {
107494
107911
  const tx = db.transaction(STORE_NAME2, "readonly");
107495
107912
  const store = tx.objectStore(STORE_NAME2);
107496
107913
  const request = store.get(CONTENT_KEY);
@@ -107501,20 +107918,20 @@ async function loadAudienceContent(sessionId) {
107501
107918
  const record = result;
107502
107919
  const age = Date.now() - record.createdAt;
107503
107920
  if (age > MAX_CONTENT_AGE_MS) {
107504
- resolve(null);
107921
+ resolve2(null);
107505
107922
  return;
107506
107923
  }
107507
107924
  const raw = record.bytes;
107508
107925
  if (raw instanceof Uint8Array) {
107509
- resolve(raw);
107926
+ resolve2(raw);
107510
107927
  } else if (raw instanceof ArrayBuffer) {
107511
- resolve(new Uint8Array(raw));
107928
+ resolve2(new Uint8Array(raw));
107512
107929
  } else {
107513
- resolve(null);
107930
+ resolve2(null);
107514
107931
  }
107515
107932
  return;
107516
107933
  }
107517
- resolve(null);
107934
+ resolve2(null);
107518
107935
  };
107519
107936
  request.onerror = () => {
107520
107937
  db.close();
@@ -107531,17 +107948,17 @@ async function clearAudienceContent(sessionId) {
107531
107948
  }
107532
107949
  try {
107533
107950
  const db = await openDb();
107534
- return new Promise((resolve) => {
107951
+ return new Promise((resolve2) => {
107535
107952
  const tx = db.transaction(STORE_NAME2, "readwrite");
107536
107953
  const store = tx.objectStore(STORE_NAME2);
107537
107954
  store.delete(CONTENT_KEY);
107538
107955
  tx.oncomplete = () => {
107539
107956
  db.close();
107540
- resolve();
107957
+ resolve2();
107541
107958
  };
107542
107959
  tx.onerror = () => {
107543
107960
  db.close();
107544
- resolve();
107961
+ resolve2();
107545
107962
  };
107546
107963
  });
107547
107964
  } catch {
@@ -107699,6 +108116,149 @@ var PRESENT_TOOLBAR_CLASSES = {
107699
108116
  /** Underline showing a tool's current colour. */
107700
108117
  swatchBar: "absolute bottom-0.5 left-1/2 -translate-x-1/2 w-3 h-0.5 rounded-full"
107701
108118
  };
108119
+ var PRESENTER_CONSOLE_CONTROLS = [
108120
+ {
108121
+ id: "timer-toggle",
108122
+ kind: "button",
108123
+ labelKey: "pptx.presenter.toggleTimer",
108124
+ icon: "circle-pause",
108125
+ activeIcon: "circle-play"
108126
+ },
108127
+ { id: "timer-reset", kind: "button", labelKey: "pptx.presenter.resetTimer", icon: "rotate-ccw" },
108128
+ { id: "divider-timer", kind: "divider" },
108129
+ {
108130
+ id: "all-slides",
108131
+ kind: "button",
108132
+ labelKey: "pptx.presenter.seeAllSlides",
108133
+ icon: "grid-2x2"
108134
+ },
108135
+ { id: "zoom-in", kind: "button", labelKey: "pptx.presenter.zoomIn", icon: "zoom-in" },
108136
+ { id: "zoom-out", kind: "button", labelKey: "pptx.presenter.zoomOut", icon: "zoom-out" },
108137
+ { id: "zoom-reset", kind: "button", labelKey: "pptx.presenter.resetZoom", icon: "scan" },
108138
+ { id: "divider-zoom", kind: "divider" },
108139
+ {
108140
+ id: "laser",
108141
+ kind: "toggle",
108142
+ labelKey: "pptx.presentation.laserPointer",
108143
+ icon: "mouse-pointer-2"
108144
+ },
108145
+ { id: "pen", kind: "toggle", labelKey: "pptx.presentation.pen", icon: "pen-tool" },
108146
+ {
108147
+ id: "highlighter",
108148
+ kind: "toggle",
108149
+ labelKey: "pptx.presentation.highlighter",
108150
+ icon: "highlighter"
108151
+ },
108152
+ { id: "eraser", kind: "toggle", labelKey: "pptx.presentation.eraser", icon: "eraser" },
108153
+ { id: "divider-tools", kind: "divider" },
108154
+ { id: "blackout-black", kind: "toggle", labelKey: "pptx.presenter.blackScreen", glyph: "B" },
108155
+ { id: "blackout-white", kind: "toggle", labelKey: "pptx.presenter.whiteScreen", glyph: "W" },
108156
+ {
108157
+ id: "captions",
108158
+ kind: "toggle",
108159
+ labelKey: "pptx.slideShow.subtitlesTooltip",
108160
+ icon: "captions"
108161
+ },
108162
+ { id: "spacer", kind: "spacer" },
108163
+ {
108164
+ id: "audience",
108165
+ kind: "toggle",
108166
+ labelKey: "pptx.presenter.openAudienceWindow",
108167
+ activeLabelKey: "pptx.presenter.closeAudienceWindow",
108168
+ icon: "monitor",
108169
+ activeIcon: "monitor-off"
108170
+ },
108171
+ {
108172
+ id: "swap-displays",
108173
+ kind: "button",
108174
+ labelKey: "pptx.presenter.swapDisplays",
108175
+ icon: "arrow-left-right"
108176
+ },
108177
+ { id: "end", kind: "button", labelKey: "pptx.presenter.endPresentation", icon: "x" }
108178
+ ];
108179
+ PRESENTER_CONSOLE_CONTROLS.map(
108180
+ (control) => control.id
108181
+ );
108182
+ PRESENTER_CONSOLE_CONTROLS.flatMap(
108183
+ (control) => control.labelKey === void 0 ? [] : [control.labelKey]
108184
+ );
108185
+ var PRESENTER_NAVIGATOR_LABEL_KEYS = {
108186
+ title: "pptx.presenter.slideNavigator",
108187
+ subtitle: "pptx.presenter.seeAllSlides",
108188
+ close: "pptx.presenter.closeNavigator"
108189
+ };
108190
+ function presenterNextDisabled() {
108191
+ return false;
108192
+ }
108193
+ function presenterPrevDisabled(currentIndex) {
108194
+ return currentIndex <= 0;
108195
+ }
108196
+ var PRESENTER_TIMER_SEGMENT_MS = 5 * 60 * 1e3;
108197
+ function presenterTimerProgress(elapsedMs) {
108198
+ const elapsed = Math.max(0, elapsedMs);
108199
+ return {
108200
+ percent: Math.min(
108201
+ 100,
108202
+ elapsed % PRESENTER_TIMER_SEGMENT_MS / PRESENTER_TIMER_SEGMENT_MS * 100
108203
+ ),
108204
+ segment: Math.floor(elapsed / PRESENTER_TIMER_SEGMENT_MS)
108205
+ };
108206
+ }
108207
+ var PRESENTER_CONSOLE_CLASSES = {
108208
+ /** The console root, laid over the show stage. */
108209
+ root: "absolute inset-0 z-50 flex flex-col bg-card text-foreground",
108210
+ /** The control strip across the top. */
108211
+ strip: "flex flex-wrap items-center gap-1 border-b border-border bg-card px-3 py-2",
108212
+ /** A strip control, inactive. */
108213
+ control: "inline-flex h-9 min-w-9 items-center justify-center gap-2 rounded-md px-2 text-xs transition-colors bg-muted text-foreground hover:bg-accent",
108214
+ /** A strip control, active. */
108215
+ controlActive: "inline-flex h-9 min-w-9 items-center justify-center gap-2 rounded-md px-2 text-xs transition-colors bg-primary text-primary-foreground",
108216
+ /** Vertical hairline between strip groups. */
108217
+ divider: "mx-1 h-6 w-px bg-border",
108218
+ /** Flexible gap pushing the trailing group right. */
108219
+ spacer: "flex-1",
108220
+ /** The body row: current-slide pane plus rail. */
108221
+ body: "flex flex-1 min-h-0",
108222
+ /** The current-slide pane. */
108223
+ main: "relative flex-[7] flex flex-col items-center justify-center bg-black p-6 min-w-0 overflow-hidden",
108224
+ /** The right-hand rail. */
108225
+ rail: "flex flex-[3] min-w-[260px] max-w-[440px] flex-col border-l border-border bg-background",
108226
+ /** Rail section heading (Current Time / Next Slide / Speaker Notes). */
108227
+ railHeading: "text-[10px] uppercase tracking-wider text-muted-foreground",
108228
+ /** Timer progress bar track. */
108229
+ progressTrack: "h-1.5 w-full bg-muted/60 flex-shrink-0",
108230
+ /** Timer progress bar fill. */
108231
+ progressFill: "h-full bg-primary transition-[width] duration-1000 ease-linear",
108232
+ /** The "all slides" navigator overlay. */
108233
+ navigator: "absolute inset-0 z-[120] overflow-auto bg-card p-6",
108234
+ /** The navigator's tile grid. */
108235
+ navigatorGrid: "grid gap-5 [grid-template-columns:repeat(auto-fill,minmax(220px,1fr))]"
108236
+ };
108237
+ var AUDIENCE_FULLSCREEN_BOUNCE_MS = 1e3;
108238
+ function createPresenterShowGuard(options) {
108239
+ const graceMs = options?.graceMs ?? AUDIENCE_FULLSCREEN_BOUNCE_MS;
108240
+ let armedAt;
108241
+ const stillArmed = (now) => armedAt !== void 0 && now - armedAt >= 0 && now - armedAt <= graceMs;
108242
+ return {
108243
+ expectAudienceBounce(now = Date.now()) {
108244
+ armedAt = now;
108245
+ },
108246
+ classifyFullscreenExit(now = Date.now()) {
108247
+ if (!stillArmed(now)) {
108248
+ armedAt = void 0;
108249
+ return "end-show";
108250
+ }
108251
+ armedAt = void 0;
108252
+ return "restore-show";
108253
+ },
108254
+ isExpectingBounce(now = Date.now()) {
108255
+ return stillArmed(now);
108256
+ },
108257
+ disarm() {
108258
+ armedAt = void 0;
108259
+ }
108260
+ };
108261
+ }
107702
108262
  function createPresentationKeyBuffer() {
107703
108263
  return { digits: "" };
107704
108264
  }
@@ -107953,19 +108513,19 @@ function groupElementParagraphs(element) {
107953
108513
  }
107954
108514
  return groups;
107955
108515
  }
107956
- function paragraphGroupText(group) {
107957
- return group.content.map((segment) => segment.isLineBreak ? " " : segment.text).join("");
108516
+ function paragraphGroupText(group2) {
108517
+ return group2.content.map((segment) => segment.isLineBreak ? " " : segment.text).join("");
107958
108518
  }
107959
- function paragraphGroupLevel(group) {
107960
- const first = group.marker ?? group.content[0];
108519
+ function paragraphGroupLevel(group2) {
108520
+ const first = group2.marker ?? group2.content[0];
107961
108521
  const level = first?.paragraphLevel;
107962
108522
  return typeof level === "number" && level > 0 ? Math.min(level, MAX_PARAGRAPH_LEVEL) : 0;
107963
108523
  }
107964
108524
  function readElementParagraphs(element) {
107965
108525
  const groups = groupElementParagraphs(element);
107966
- const paragraphs = groups.map((group) => ({
107967
- text: paragraphGroupText(group),
107968
- level: paragraphGroupLevel(group)
108526
+ const paragraphs = groups.map((group2) => ({
108527
+ text: paragraphGroupText(group2),
108528
+ level: paragraphGroupLevel(group2)
107969
108529
  }));
107970
108530
  let last = paragraphs.length - 1;
107971
108531
  while (last >= 0 && paragraphs[last].text.length === 0) {
@@ -108080,11 +108640,11 @@ function withLevel(segments, level) {
108080
108640
  return next;
108081
108641
  });
108082
108642
  }
108083
- function rebuildParagraph(group, donor, text2, elementStyle) {
108084
- if (group && paragraphGroupText(group) === text2) {
108085
- return [...group.marker ? [group.marker] : [], ...group.content];
108643
+ function rebuildParagraph(group2, donor, text2, elementStyle) {
108644
+ if (group2 && paragraphGroupText(group2) === text2) {
108645
+ return [...group2.marker ? [group2.marker] : [], ...group2.content];
108086
108646
  }
108087
- const source = group ?? donor;
108647
+ const source = group2 ?? donor;
108088
108648
  const marker = source?.marker ? [source.marker] : [];
108089
108649
  const content = remapTextToSegments(text2, source?.content, elementStyle);
108090
108650
  return [...marker, ...content];
@@ -108867,7 +109427,7 @@ function replacePixels(data, fromColor, toColor, threshold, toTransparent) {
108867
109427
  }
108868
109428
  var DEFAULT_COLOR_CHANGE_TOLERANCE = 12;
108869
109429
  function applyColorChange(imageDataUrl, fromHex, toHex22, tolerancePct = DEFAULT_COLOR_CHANGE_TOLERANCE, toTransparent = false) {
108870
- return new Promise((resolve, reject) => {
109430
+ return new Promise((resolve2, reject) => {
108871
109431
  const fromColor = parseHexToRgb(fromHex);
108872
109432
  const toColor = parseHexToRgb(toHex22);
108873
109433
  if (!fromColor || !toColor) {
@@ -108895,7 +109455,7 @@ function applyColorChange(imageDataUrl, fromHex, toHex22, tolerancePct = DEFAULT
108895
109455
  const threshold = toleranceToThreshold(tolerancePct);
108896
109456
  replacePixels(imageData.data, fromColor, toColor, threshold, toTransparent);
108897
109457
  ctx.putImageData(imageData, 0, 0);
108898
- resolve({
109458
+ resolve2({
108899
109459
  dataUrl: canvas.toDataURL("image/png"),
108900
109460
  width: w,
108901
109461
  height: h
@@ -108946,7 +109506,7 @@ function mapDuotonePixels(data, shadow, highlight) {
108946
109506
  }
108947
109507
  }
108948
109508
  function applyDuotone(imageDataUrl, shadowHex, highlightHex) {
108949
- return new Promise((resolve, reject) => {
109509
+ return new Promise((resolve2, reject) => {
108950
109510
  const shadow = parseHexToRgb(shadowHex);
108951
109511
  const highlight = parseHexToRgb(highlightHex);
108952
109512
  if (!shadow || !highlight) {
@@ -108973,7 +109533,7 @@ function applyDuotone(imageDataUrl, shadowHex, highlightHex) {
108973
109533
  const imageData = ctx.getImageData(0, 0, w, h);
108974
109534
  mapDuotonePixels(imageData.data, shadow, highlight);
108975
109535
  ctx.putImageData(imageData, 0, 0);
108976
- resolve({
109536
+ resolve2({
108977
109537
  dataUrl: canvas.toDataURL("image/png"),
108978
109538
  width: w,
108979
109539
  height: h
@@ -109347,6 +109907,129 @@ function isElementActionable(element, options = {}) {
109347
109907
  }
109348
109908
  return element.type === "zoom" && hasZoomHandler;
109349
109909
  }
109910
+ var LINK_TOOLTIP_HOST_CLASS = "pptx-link-host";
109911
+ var LINK_TOOLTIP_CLASS = "pptx-link-tooltip";
109912
+ var LINK_TOOLTIP_PANEL_CLASS = "pptx-link-tooltip-panel";
109913
+ var LINK_TOOLTIP_LABEL_CLASS = "pptx-link-tooltip-label";
109914
+ var LINK_TOOLTIP_HINT_CLASS = "pptx-link-tooltip-hint";
109915
+ var ACTION_INDICATOR_CLASS = "pptx-action-indicator";
109916
+ var ACTION_INDICATOR_ICON_PATH = "M13 2L3 14h9l-1 8 10-12h-9l1-8z";
109917
+ var ACTION_AFFORDANCE_CSS = `
109918
+ .${ACTION_INDICATOR_CLASS} {
109919
+ position: absolute;
109920
+ top: -4px;
109921
+ right: -4px;
109922
+ z-index: 20;
109923
+ display: flex;
109924
+ width: 16px;
109925
+ height: 16px;
109926
+ align-items: center;
109927
+ justify-content: center;
109928
+ border-radius: 9999px;
109929
+ background: #f59e0b;
109930
+ /* Left pointer-interactive on purpose: the badge's native title attribute is
109931
+ the only place the deck's screen tip is readable, and a title on a
109932
+ pointer-transparent node never fires. Clicks still reach the element
109933
+ underneath by bubbling, so nothing is swallowed. */
109934
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 10%), 0 1px 2px -1px rgb(0 0 0 / 10%);
109935
+ }
109936
+ .${ACTION_INDICATOR_CLASS} svg {
109937
+ width: 10px;
109938
+ height: 10px;
109939
+ color: #fff;
109940
+ }
109941
+ .${LINK_TOOLTIP_CLASS} {
109942
+ position: absolute;
109943
+ top: 100%;
109944
+ left: 4px;
109945
+ z-index: 9999;
109946
+ max-width: 16rem;
109947
+ margin-top: 4px;
109948
+ opacity: 0;
109949
+ transition: opacity 150ms;
109950
+ pointer-events: none;
109951
+ font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
109952
+ text-align: left;
109953
+ }
109954
+ .${LINK_TOOLTIP_HOST_CLASS}:hover > .${LINK_TOOLTIP_CLASS} {
109955
+ opacity: 1;
109956
+ }
109957
+ .${LINK_TOOLTIP_PANEL_CLASS} {
109958
+ border: 1px solid var(--pptx-border, #374151);
109959
+ border-radius: 0.25rem;
109960
+ background: var(--pptx-popover, #111827);
109961
+ padding: 6px 10px;
109962
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 10%), 0 4px 6px -4px rgb(0 0 0 / 10%);
109963
+ }
109964
+ .${LINK_TOOLTIP_LABEL_CLASS} {
109965
+ overflow: hidden;
109966
+ color: var(--pptx-foreground, #f3f4f6);
109967
+ font-size: 12px;
109968
+ font-weight: 400;
109969
+ font-style: normal;
109970
+ line-height: 16px;
109971
+ letter-spacing: normal;
109972
+ text-decoration: none;
109973
+ text-overflow: ellipsis;
109974
+ text-transform: none;
109975
+ white-space: nowrap;
109976
+ }
109977
+ .${LINK_TOOLTIP_HINT_CLASS} {
109978
+ margin-top: 2px;
109979
+ color: var(--pptx-muted-foreground, #9ca3af);
109980
+ font-size: 10px;
109981
+ font-weight: 400;
109982
+ font-style: normal;
109983
+ line-height: 12px;
109984
+ letter-spacing: normal;
109985
+ text-decoration: none;
109986
+ text-transform: none;
109987
+ }
109988
+ `;
109989
+ var AFFORDANCE_STYLE_ELEMENT_ID = "pptx-action-affordance-styles";
109990
+ function ensureActionAffordanceStyles(doc) {
109991
+ const target = doc ?? (typeof document === "undefined" ? void 0 : document);
109992
+ if (!target || target.getElementById(AFFORDANCE_STYLE_ELEMENT_ID)) {
109993
+ return;
109994
+ }
109995
+ const style = target.createElement("style");
109996
+ style.id = AFFORDANCE_STYLE_ELEMENT_ID;
109997
+ style.textContent = ACTION_AFFORDANCE_CSS;
109998
+ (target.head ?? target.documentElement).appendChild(style);
109999
+ }
110000
+ function actionAffordanceLabels(translate) {
110001
+ return {
110002
+ hasAction: translate("pptx.element.hasAction"),
110003
+ link: translate("pptx.element.linkFallback"),
110004
+ followLink: translate("pptx.linkTooltip.followLink"),
110005
+ presentationMode: translate("pptx.linkTooltip.presentationMode")
110006
+ };
110007
+ }
110008
+ var NO_AFFORDANCE = Object.freeze({
110009
+ showIndicator: false,
110010
+ indicatorTitle: "",
110011
+ showLinkTooltip: false,
110012
+ linkTooltipLabel: "",
110013
+ linkTooltipHint: ""
110014
+ });
110015
+ function resolveElementActionAffordance(element, context) {
110016
+ const { canInteract, presenting = false, labels } = context;
110017
+ const click = element.actionClick;
110018
+ const hover = element.actionHover;
110019
+ if (!canInteract || presenting || !click && !hover) {
110020
+ return NO_AFFORDANCE;
110021
+ }
110022
+ const hasUrl = Boolean(click?.url);
110023
+ return {
110024
+ showIndicator: true,
110025
+ indicatorTitle: click?.tooltip || hover?.tooltip || labels.hasAction,
110026
+ // The tooltip names a CLICK destination, so a hover-only action gets the
110027
+ // badge but no popover: there is nothing to follow and no key to press.
110028
+ showLinkTooltip: Boolean(click),
110029
+ linkTooltipLabel: click?.tooltip || click?.url || click?.action || labels.link,
110030
+ linkTooltipHint: hasUrl ? labels.followLink : labels.presentationMode
110031
+ };
110032
+ }
109350
110033
  var ELEMENT_ACTION_TYPE_OPTIONS = [
109351
110034
  { value: "none", labelKey: "pptx.hyperlink.actionNone" },
109352
110035
  { value: "url", labelKey: "pptx.action.gotoUrl" },
@@ -109835,6 +110518,19 @@ function rebuildDrawingShapesIfCleared(smartArtData, layout, palette, style, ele
109835
110518
  drawingShapes: reflowToDrawingShapes(layoutResult, smartArtData.nodes)
109836
110519
  };
109837
110520
  }
110521
+ function mediaPlaybackAttributes(source) {
110522
+ return {
110523
+ loop: source.loop === true,
110524
+ volume: Math.max(0, Math.min(1, source.volume ?? 1)),
110525
+ playbackRate: Math.max(0.25, Math.min(4, source.playbackSpeed ?? 1))
110526
+ };
110527
+ }
110528
+ function mediaTransportVisible(surface) {
110529
+ if (surface.presenting || surface.preview) {
110530
+ return false;
110531
+ }
110532
+ return surface.canvasTransport;
110533
+ }
109838
110534
  function buildSummaryZoomView(element, lookup) {
109839
110535
  if (element.zoomType !== "summary" || !element.summaryTargets?.length) {
109840
110536
  return void 0;
@@ -110926,7 +111622,7 @@ var AUTOSAVE_DB_NAME = "pptx-viewer-autosave";
110926
111622
  var AUTOSAVE_DB_VERSION = 1;
110927
111623
  var AUTOSAVE_STORE_NAME = "recoveryVersions";
110928
111624
  function openAutosaveDb() {
110929
- return new Promise((resolve, reject) => {
111625
+ return new Promise((resolve2, reject) => {
110930
111626
  const req = indexedDB.open(AUTOSAVE_DB_NAME, AUTOSAVE_DB_VERSION);
110931
111627
  req.onupgradeneeded = () => {
110932
111628
  const db = req.result;
@@ -110934,13 +111630,13 @@ function openAutosaveDb() {
110934
111630
  db.createObjectStore(AUTOSAVE_STORE_NAME, { keyPath: "key" });
110935
111631
  }
110936
111632
  };
110937
- req.onsuccess = () => resolve(req.result);
111633
+ req.onsuccess = () => resolve2(req.result);
110938
111634
  req.onerror = () => reject(req.error);
110939
111635
  });
110940
111636
  }
110941
111637
  async function deleteOldestAutosaveEntry() {
110942
111638
  const db = await openAutosaveDb();
110943
- return new Promise((resolve) => {
111639
+ return new Promise((resolve2) => {
110944
111640
  try {
110945
111641
  const tx = db.transaction(AUTOSAVE_STORE_NAME, "readwrite");
110946
111642
  const store = tx.objectStore(AUTOSAVE_STORE_NAME);
@@ -110962,24 +111658,24 @@ async function deleteOldestAutosaveEntry() {
110962
111658
  };
110963
111659
  tx.oncomplete = () => {
110964
111660
  db.close();
110965
- resolve(oldestKey !== null);
111661
+ resolve2(oldestKey !== null);
110966
111662
  };
110967
111663
  tx.onerror = () => {
110968
111664
  db.close();
110969
- resolve(false);
111665
+ resolve2(false);
110970
111666
  };
110971
111667
  } catch {
110972
111668
  try {
110973
111669
  db.close();
110974
111670
  } catch {
110975
111671
  }
110976
- resolve(false);
111672
+ resolve2(false);
110977
111673
  }
110978
111674
  });
110979
111675
  }
110980
111676
  function putAutosaveRecord(filePath, data) {
110981
111677
  return openAutosaveDb().then(
110982
- (db) => new Promise((resolve, reject) => {
111678
+ (db) => new Promise((resolve2, reject) => {
110983
111679
  const tx = db.transaction(AUTOSAVE_STORE_NAME, "readwrite");
110984
111680
  const store = tx.objectStore(AUTOSAVE_STORE_NAME);
110985
111681
  store.put({
@@ -110990,7 +111686,7 @@ function putAutosaveRecord(filePath, data) {
110990
111686
  });
110991
111687
  tx.oncomplete = () => {
110992
111688
  db.close();
110993
- resolve(true);
111689
+ resolve2(true);
110994
111690
  };
110995
111691
  tx.onerror = () => {
110996
111692
  db.close();
@@ -111001,23 +111697,23 @@ function putAutosaveRecord(filePath, data) {
111001
111697
  }
111002
111698
  async function getAutosaveSnapshot(filePath) {
111003
111699
  const db = await openAutosaveDb();
111004
- return new Promise((resolve) => {
111700
+ return new Promise((resolve2) => {
111005
111701
  const tx = db.transaction(AUTOSAVE_STORE_NAME, "readonly");
111006
111702
  const store = tx.objectStore(AUTOSAVE_STORE_NAME);
111007
111703
  const req = store.get(filePath);
111008
111704
  req.onsuccess = () => {
111009
111705
  db.close();
111010
- resolve(req.result);
111706
+ resolve2(req.result);
111011
111707
  };
111012
111708
  req.onerror = () => {
111013
111709
  db.close();
111014
- resolve(void 0);
111710
+ resolve2(void 0);
111015
111711
  };
111016
111712
  });
111017
111713
  }
111018
111714
  async function listAutosaveSnapshots() {
111019
111715
  const db = await openAutosaveDb();
111020
- return new Promise((resolve) => {
111716
+ return new Promise((resolve2) => {
111021
111717
  const results = [];
111022
111718
  try {
111023
111719
  const tx = db.transaction(AUTOSAVE_STORE_NAME, "readonly");
@@ -111033,42 +111729,42 @@ async function listAutosaveSnapshots() {
111033
111729
  };
111034
111730
  tx.oncomplete = () => {
111035
111731
  db.close();
111036
- resolve(results);
111732
+ resolve2(results);
111037
111733
  };
111038
111734
  tx.onerror = () => {
111039
111735
  db.close();
111040
- resolve([]);
111736
+ resolve2([]);
111041
111737
  };
111042
111738
  } catch {
111043
111739
  try {
111044
111740
  db.close();
111045
111741
  } catch {
111046
111742
  }
111047
- resolve([]);
111743
+ resolve2([]);
111048
111744
  }
111049
111745
  });
111050
111746
  }
111051
111747
  async function deleteAutosaveSnapshot(filePath) {
111052
111748
  const db = await openAutosaveDb();
111053
- return new Promise((resolve) => {
111749
+ return new Promise((resolve2) => {
111054
111750
  try {
111055
111751
  const tx = db.transaction(AUTOSAVE_STORE_NAME, "readwrite");
111056
111752
  const store = tx.objectStore(AUTOSAVE_STORE_NAME);
111057
111753
  store.delete(filePath);
111058
111754
  tx.oncomplete = () => {
111059
111755
  db.close();
111060
- resolve(true);
111756
+ resolve2(true);
111061
111757
  };
111062
111758
  tx.onerror = () => {
111063
111759
  db.close();
111064
- resolve(false);
111760
+ resolve2(false);
111065
111761
  };
111066
111762
  } catch {
111067
111763
  try {
111068
111764
  db.close();
111069
111765
  } catch {
111070
111766
  }
111071
- resolve(false);
111767
+ resolve2(false);
111072
111768
  }
111073
111769
  });
111074
111770
  }
@@ -111901,17 +112597,17 @@ function shouldConfirmExternalHyperlink(options, href) {
111901
112597
  }
111902
112598
  return /^https?:/i.test(href);
111903
112599
  }
111904
- function toggle(group, key, labelKey, extra) {
111905
- return { kind: "toggle", group, key, labelKey, ...extra };
112600
+ function toggle(group2, key, labelKey, extra) {
112601
+ return { kind: "toggle", group: group2, key, labelKey, ...extra };
111906
112602
  }
111907
- function select(group, key, labelKey, choiceList) {
111908
- return { kind: "select", group, key, labelKey, choices: choiceList };
112603
+ function select(group2, key, labelKey, choiceList) {
112604
+ return { kind: "select", group: group2, key, labelKey, choices: choiceList };
111909
112605
  }
111910
- function numberControl(group, key, labelKey, min, max, unitKey) {
111911
- return { kind: "number", group, key, labelKey, min, max, unitKey };
112606
+ function numberControl(group2, key, labelKey, min, max, unitKey) {
112607
+ return { kind: "number", group: group2, key, labelKey, min, max, unitKey };
111912
112608
  }
111913
- function textControl(group, key, labelKey) {
111914
- return { kind: "text", group, key, labelKey, maxLength: 64 };
112609
+ function textControl(group2, key, labelKey) {
112610
+ return { kind: "text", group: group2, key, labelKey, maxLength: 64 };
111915
112611
  }
111916
112612
  function choices(prefix, values) {
111917
112613
  return values.map((value) => ({ value, labelKey: `${prefix}.${value}` }));
@@ -112393,17 +113089,17 @@ function createViewerOptionsStore(init) {
112393
113089
  return {
112394
113090
  getOptions: () => options,
112395
113091
  setOptions: (next) => commit(cloneOptions(next)),
112396
- setValue: (group, key, value) => {
112397
- const defaults = DEFAULT_VIEWER_OPTIONS[group];
113092
+ setValue: (group2, key, value) => {
113093
+ const defaults = DEFAULT_VIEWER_OPTIONS[group2];
112398
113094
  if (!(key in defaults) || typeof defaults[key] !== typeof value) {
112399
113095
  return;
112400
113096
  }
112401
113097
  const next = cloneOptions(options);
112402
- next[group][key] = value;
113098
+ next[group2][key] = value;
112403
113099
  commit(next);
112404
113100
  },
112405
- getValue: (group, key) => {
112406
- const record = options[group];
113101
+ getValue: (group2, key) => {
113102
+ const record = options[group2];
112407
113103
  const value = record[key];
112408
113104
  return typeof value === "boolean" || typeof value === "number" || typeof value === "string" ? value : void 0;
112409
113105
  },
@@ -112425,14 +113121,14 @@ function createViewerOptionsStore(init) {
112425
113121
  next.quickAccess.commandIds = [...commandIds];
112426
113122
  commit(next);
112427
113123
  },
112428
- reset: (group) => {
112429
- if (!group) {
113124
+ reset: (group2) => {
113125
+ if (!group2) {
112430
113126
  commit(cloneOptions(DEFAULT_VIEWER_OPTIONS));
112431
113127
  return;
112432
113128
  }
112433
113129
  const next = cloneOptions(options);
112434
113130
  const defaults = cloneOptions(DEFAULT_VIEWER_OPTIONS);
112435
- next[group] = defaults[group];
113131
+ next[group2] = defaults[group2];
112436
113132
  commit(next);
112437
113133
  },
112438
113134
  subscribe: (listener) => {
@@ -113382,7 +114078,7 @@ var VAR_DEPENDENT_PROPERTIES = [
113382
114078
  function resolveCustomProperties(root) {
113383
114079
  const elements = root.querySelectorAll("*");
113384
114080
  const view = root.ownerDocument?.defaultView ?? window;
113385
- const resolve = (el) => {
114081
+ const resolve2 = (el) => {
113386
114082
  const htmlEl = el;
113387
114083
  if (!htmlEl.style) {
113388
114084
  return;
@@ -113398,8 +114094,8 @@ function resolveCustomProperties(root) {
113398
114094
  }
113399
114095
  }
113400
114096
  };
113401
- resolve(root);
113402
- elements.forEach(resolve);
114097
+ resolve2(root);
114098
+ elements.forEach(resolve2);
113403
114099
  }
113404
114100
  function preprocessCssForCapture(root, options = {}) {
113405
114101
  const {
@@ -113437,9 +114133,9 @@ async function blobUrlToDataUrl(blobUrl) {
113437
114133
  try {
113438
114134
  const response = await fetch(blobUrl);
113439
114135
  const blob = await response.blob();
113440
- return await new Promise((resolve, reject) => {
114136
+ return await new Promise((resolve2, reject) => {
113441
114137
  const reader = new FileReader();
113442
- reader.onloadend = () => resolve(reader.result);
114138
+ reader.onloadend = () => resolve2(reader.result);
113443
114139
  reader.onerror = reject;
113444
114140
  reader.readAsDataURL(blob);
113445
114141
  });
@@ -113558,7 +114254,7 @@ var COMPLEX_COLOR_PROPERTIES = [
113558
114254
  ];
113559
114255
  function resolveUnsupportedColours(root) {
113560
114256
  const elements = root.querySelectorAll("*");
113561
- const resolve = (el) => {
114257
+ const resolve2 = (el) => {
113562
114258
  const htmlEl = el;
113563
114259
  if (!htmlEl.style) {
113564
114260
  return;
@@ -113588,8 +114284,8 @@ function resolveUnsupportedColours(root) {
113588
114284
  }
113589
114285
  }
113590
114286
  };
113591
- resolve(root);
113592
- elements.forEach(resolve);
114287
+ resolve2(root);
114288
+ elements.forEach(resolve2);
113593
114289
  }
113594
114290
  function resolveRootCustomProperties(doc) {
113595
114291
  const targets = [doc.documentElement, doc.body];
@@ -114106,6 +114802,8 @@ function segmentFrameCount(durationMs, fps) {
114106
114802
  */
114107
114803
 
114108
114804
  exports.ACTION_BUTTON_PRESETS = ACTION_BUTTON_PRESETS;
114805
+ exports.ACTION_INDICATOR_CLASS = ACTION_INDICATOR_CLASS;
114806
+ exports.ACTION_INDICATOR_ICON_PATH = ACTION_INDICATOR_ICON_PATH;
114109
114807
  exports.ARTISTIC_EFFECTS = ARTISTIC_EFFECTS;
114110
114808
  exports.AVATAR_COLOR_SWATCHES = AVATAR_COLOR_SWATCHES;
114111
114809
  exports.BACKSTAGE_NAV = BACKSTAGE_NAV;
@@ -114146,6 +114844,11 @@ exports.HIGHLIGHTER_COLORS = HIGHLIGHTER_COLORS;
114146
114844
  exports.INK_REPLAY_KEYFRAMES = INK_REPLAY_KEYFRAMES;
114147
114845
  exports.INSERT_CHART_TYPES = INSERT_CHART_TYPES;
114148
114846
  exports.LBL = LBL;
114847
+ exports.LINK_TOOLTIP_CLASS = LINK_TOOLTIP_CLASS;
114848
+ exports.LINK_TOOLTIP_HINT_CLASS = LINK_TOOLTIP_HINT_CLASS;
114849
+ exports.LINK_TOOLTIP_HOST_CLASS = LINK_TOOLTIP_HOST_CLASS;
114850
+ exports.LINK_TOOLTIP_LABEL_CLASS = LINK_TOOLTIP_LABEL_CLASS;
114851
+ exports.LINK_TOOLTIP_PANEL_CLASS = LINK_TOOLTIP_PANEL_CLASS;
114149
114852
  exports.LOCAL_SYNC_ORIGIN = LOCAL_SYNC_ORIGIN;
114150
114853
  exports.MATERIAL_PRESETS = MATERIAL_PRESETS;
114151
114854
  exports.MAX_ZOOM_SCALE = MAX_ZOOM_SCALE;
@@ -114167,6 +114870,9 @@ exports.PRESENTATION_CHANNEL_NAME = PRESENTATION_CHANNEL_NAME;
114167
114870
  exports.PRESENTATION_HASH = PRESENTATION_HASH;
114168
114871
  exports.PRESENTATION_MESSAGE_ORIGIN = PRESENTATION_MESSAGE_ORIGIN;
114169
114872
  exports.PRESENTATION_NONCE_KEY = PRESENTATION_NONCE_KEY;
114873
+ exports.PRESENTER_CONSOLE_CLASSES = PRESENTER_CONSOLE_CLASSES;
114874
+ exports.PRESENTER_CONSOLE_CONTROLS = PRESENTER_CONSOLE_CONTROLS;
114875
+ exports.PRESENTER_NAVIGATOR_LABEL_KEYS = PRESENTER_NAVIGATOR_LABEL_KEYS;
114170
114876
  exports.PRESENT_TOOLBAR_CLASSES = PRESENT_TOOLBAR_CLASSES;
114171
114877
  exports.PRESETS = PRESETS;
114172
114878
  exports.PRESET_THEMES = PRESET_THEMES;
@@ -114214,6 +114920,7 @@ exports.VIEWER_PREFS_STORAGE_KEY = VIEWER_PREFS_STORAGE_KEY;
114214
114920
  exports.VIEWER_SHORTCUT_REFERENCE = VIEWER_SHORTCUT_REFERENCE;
114215
114921
  exports.WEBM_MIME_CANDIDATES = WEBM_MIME_CANDIDATES;
114216
114922
  exports.acceptsPresentationInput = acceptsPresentationInput;
114923
+ exports.actionAffordanceLabels = actionAffordanceLabels;
114217
114924
  exports.activateModalFocus = activateModalFocus;
114218
114925
  exports.addChartCategory = addChartCategory;
114219
114926
  exports.addChartSeries = addChartSeries;
@@ -114306,6 +115013,7 @@ exports.canGoNext = canGoNext;
114306
115013
  exports.canGoPrevious = canGoPrevious;
114307
115014
  exports.canvasToJpegData = canvasToJpegData;
114308
115015
  exports.cell3DBevelCss = cell3DBevelCss;
115016
+ exports.chartAreaFill = chartAreaFill;
114309
115017
  exports.chartDataChangeType = chartDataChangeType;
114310
115018
  exports.chartPartToAttrs = chartPartToAttrs;
114311
115019
  exports.clampCropValue = clampCropValue;
@@ -114363,6 +115071,7 @@ exports.createDepartureChannel = createDepartureChannel;
114363
115071
  exports.createInitialPresentationSnapshot = createInitialPresentationSnapshot;
114364
115072
  exports.createPresentationKeyBuffer = createPresentationKeyBuffer;
114365
115073
  exports.createPresentationSessionId = createPresentationSessionId;
115074
+ exports.createPresenterShowGuard = createPresenterShowGuard;
114366
115075
  exports.createPresenterTimer = createPresenterTimer;
114367
115076
  exports.createSyncGate = createSyncGate;
114368
115077
  exports.createTouchGestureRecognizer = createTouchGestureRecognizer;
@@ -114389,6 +115098,7 @@ exports.dragValueForPart = dragValueForPart;
114389
115098
  exports.elementActionToPptxAction = elementActionToPptxAction;
114390
115099
  exports.encodeGif = encodeGif;
114391
115100
  exports.endAudienceDisplay = endAudienceDisplay;
115101
+ exports.ensureActionAffordanceStyles = ensureActionAffordanceStyles;
114392
115102
  exports.erasePresentationInkAt = erasePresentationInkAt;
114393
115103
  exports.evaluatePresetShape = evaluatePresetShape;
114394
115104
  exports.extraQuickAccessCommands = extraQuickAccessCommands;
@@ -114504,11 +115214,9 @@ exports.isEditorTextInputTarget = isEditorTextInputTarget;
114504
115214
  exports.isElementActionable = isElementActionable;
114505
115215
  exports.isElementRendered = isElementRendered;
114506
115216
  exports.isExportAbortError = isExportAbortError;
114507
- exports.isFirstSlide = isFirstSlide;
114508
115217
  exports.isImageLikeElement = isImageLikeElement;
114509
115218
  exports.isInkElement = isInkElement;
114510
115219
  exports.isKeyboardOpen = isKeyboardOpen;
114511
- exports.isLastSlide = isLastSlide;
114512
115220
  exports.isLinkedTextBox = isLinkedTextBox;
114513
115221
  exports.isMixedContentBlocked = isMixedContentBlocked;
114514
115222
  exports.isMobileViewport = isMobileViewport;
@@ -114528,6 +115236,8 @@ exports.mapEditorKey = mapEditorKey;
114528
115236
  exports.mapOutlineKey = mapOutlineKey;
114529
115237
  exports.mapPresentationKey = mapPresentationKey;
114530
115238
  exports.mayLeaveSlideShow = mayLeaveSlideShow;
115239
+ exports.mediaPlaybackAttributes = mediaPlaybackAttributes;
115240
+ exports.mediaTransportVisible = mediaTransportVisible;
114531
115241
  exports.mergeAdditiveSelection = mergeAdditiveSelection;
114532
115242
  exports.mergeCells = mergeCells;
114533
115243
  exports.mergePresentationSnapshot = mergePresentationSnapshot;
@@ -114568,6 +115278,7 @@ exports.openUrlInNewTab = openUrlInNewTab;
114568
115278
  exports.paletteColor = paletteColor;
114569
115279
  exports.parseDrawingColor = parseDrawingColor;
114570
115280
  exports.parseDrawingColorOpacity = parseDrawingColorOpacity;
115281
+ exports.parsePanoseString = parsePanoseString;
114571
115282
  exports.parsePpactionUrl = parsePpactionUrl;
114572
115283
  exports.pickSupportedMimeType = pickSupportedMimeType;
114573
115284
  exports.placeAudienceWindow = placeAudienceWindow;
@@ -114576,7 +115287,10 @@ exports.pptxActionToElementAction = pptxActionToElementAction;
114576
115287
  exports.preprocessCssForCapture = preprocessCssForCapture;
114577
115288
  exports.presentationInkPath = presentationInkPath;
114578
115289
  exports.presenterElapsed = presenterElapsed;
115290
+ exports.presenterNextDisabled = presenterNextDisabled;
114579
115291
  exports.presenterPaneAdvancesOnClick = presenterPaneAdvancesOnClick;
115292
+ exports.presenterPrevDisabled = presenterPrevDisabled;
115293
+ exports.presenterTimerProgress = presenterTimerProgress;
114580
115294
  exports.pressuresToWidths = pressuresToWidths;
114581
115295
  exports.previousShowSlideIndex = previousShowSlideIndex;
114582
115296
  exports.printPropertiesFrameSlides = printPropertiesFrameSlides;
@@ -114616,6 +115330,7 @@ exports.resolveAutoAdvanceDelayMs = resolveAutoAdvanceDelayMs;
114616
115330
  exports.resolveAutoFitFontScale = resolveAutoFitFontScale;
114617
115331
  exports.resolveCssTextAlign = resolveCssTextAlign;
114618
115332
  exports.resolveDrawingShapeNodeId = resolveDrawingShapeNodeId;
115333
+ exports.resolveElementActionAffordance = resolveElementActionAffordance;
114619
115334
  exports.resolveFontForScript = resolveFontForScript;
114620
115335
  exports.resolveFontRefIdx = resolveFontRefIdx;
114621
115336
  exports.resolveGroupChildFill = resolveGroupChildFill;