pptx-react-viewer 4.3.0 → 4.4.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 (135) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/dist/{AiChatPanel-UCEK3ZTD.mjs → AiChatPanel-QJHUDIWT.mjs} +4 -4
  3. package/dist/AiChatPanel-QJHUDIWT.mjs.br +0 -0
  4. package/dist/AiChatPanel-QJHUDIWT.mjs.gz +0 -0
  5. package/dist/{AiChatPanel-7UQA25FA.js → AiChatPanel-UFMSTNCB.js} +28 -28
  6. package/dist/AiChatPanel-UFMSTNCB.js.br +0 -0
  7. package/dist/AiChatPanel-UFMSTNCB.js.gz +0 -0
  8. package/dist/{Model3DScene-AI2JTBQM.mjs → Model3DScene-3GOC5HUS.mjs} +1 -1
  9. package/dist/Model3DScene-3GOC5HUS.mjs.br +0 -0
  10. package/dist/Model3DScene-3GOC5HUS.mjs.gz +0 -0
  11. package/dist/{Model3DScene-X3DS3ELB.js → Model3DScene-KXNJBAQD.js} +2 -2
  12. package/dist/{Model3DScene-X3DS3ELB.js.br → Model3DScene-KXNJBAQD.js.br} +0 -0
  13. package/dist/Model3DScene-KXNJBAQD.js.gz +0 -0
  14. package/dist/{chunk-UTI4CLYJ.js → chunk-7WWINBGF.js} +1133 -418
  15. package/dist/chunk-7WWINBGF.js.br +0 -0
  16. package/dist/chunk-7WWINBGF.js.gz +0 -0
  17. package/dist/{chunk-42XEZVUQ.js → chunk-AI6K5EAE.js} +1261 -1077
  18. package/dist/chunk-AI6K5EAE.js.br +0 -0
  19. package/dist/chunk-AI6K5EAE.js.gz +0 -0
  20. package/dist/{chunk-KAO5USPE.js → chunk-CSY422LU.js} +5 -5
  21. package/dist/chunk-CSY422LU.js.br +0 -0
  22. package/dist/chunk-CSY422LU.js.gz +0 -0
  23. package/dist/{chunk-3UWJWJCR.mjs → chunk-D3TZOCQP.mjs} +1118 -419
  24. package/dist/chunk-D3TZOCQP.mjs.br +0 -0
  25. package/dist/chunk-D3TZOCQP.mjs.gz +0 -0
  26. package/dist/{chunk-W5KLLGVH.js → chunk-I4D6JQOI.js} +25 -0
  27. package/dist/chunk-I4D6JQOI.js.br +0 -0
  28. package/dist/chunk-I4D6JQOI.js.gz +0 -0
  29. package/dist/{chunk-OBQ453H6.mjs → chunk-JQXN6PO7.mjs} +25 -0
  30. package/dist/chunk-JQXN6PO7.mjs.br +0 -0
  31. package/dist/chunk-JQXN6PO7.mjs.gz +0 -0
  32. package/dist/{chunk-RXYLPESV.mjs → chunk-LUHUYBGW.mjs} +201 -17
  33. package/dist/chunk-LUHUYBGW.mjs.br +0 -0
  34. package/dist/chunk-LUHUYBGW.mjs.gz +0 -0
  35. package/dist/{chunk-E7O4HTS5.js → chunk-OWTHF5N4.js} +197 -183
  36. package/dist/chunk-OWTHF5N4.js.br +0 -0
  37. package/dist/chunk-OWTHF5N4.js.gz +0 -0
  38. package/dist/{chunk-SKTZSG7Q.mjs → chunk-WCHKDZP6.mjs} +305 -47
  39. package/dist/chunk-WCHKDZP6.mjs.br +0 -0
  40. package/dist/chunk-WCHKDZP6.mjs.gz +0 -0
  41. package/dist/{chunk-PLDG3CXW.mjs → chunk-WNFHFFYE.mjs} +16 -2
  42. package/dist/chunk-WNFHFFYE.mjs.br +0 -0
  43. package/dist/chunk-WNFHFFYE.mjs.gz +0 -0
  44. package/dist/{chunk-YQJOCGOK.mjs → chunk-XMKLY2SE.mjs} +1 -1
  45. package/dist/chunk-XMKLY2SE.mjs.br +0 -0
  46. package/dist/chunk-XMKLY2SE.mjs.gz +0 -0
  47. package/dist/{chunk-Y7LI2JIR.js → chunk-YJKR7Z3X.js} +1103 -845
  48. package/dist/chunk-YJKR7Z3X.js.br +0 -0
  49. package/dist/chunk-YJKR7Z3X.js.gz +0 -0
  50. package/dist/i18n/de.cjs +23 -0
  51. package/dist/i18n/de.cjs.br +0 -0
  52. package/dist/i18n/de.cjs.gz +0 -0
  53. package/dist/i18n/de.mjs +23 -0
  54. package/dist/i18n/de.mjs.br +0 -0
  55. package/dist/i18n/de.mjs.gz +0 -0
  56. package/dist/i18n/es.cjs +23 -0
  57. package/dist/i18n/es.cjs.br +0 -0
  58. package/dist/i18n/es.cjs.gz +0 -0
  59. package/dist/i18n/es.mjs +23 -0
  60. package/dist/i18n/es.mjs.br +0 -0
  61. package/dist/i18n/es.mjs.gz +0 -0
  62. package/dist/i18n/fr.cjs +23 -0
  63. package/dist/i18n/fr.cjs.br +0 -0
  64. package/dist/i18n/fr.cjs.gz +0 -0
  65. package/dist/i18n/fr.mjs +23 -0
  66. package/dist/i18n/fr.mjs.br +0 -0
  67. package/dist/i18n/fr.mjs.gz +0 -0
  68. package/dist/i18n/zh-CN.cjs +23 -0
  69. package/dist/i18n/zh-CN.cjs.br +0 -0
  70. package/dist/i18n/zh-CN.cjs.gz +0 -0
  71. package/dist/i18n/zh-CN.mjs +23 -0
  72. package/dist/i18n/zh-CN.mjs.br +0 -0
  73. package/dist/i18n/zh-CN.mjs.gz +0 -0
  74. package/dist/i18n.js +4 -4
  75. package/dist/i18n.js.br +0 -0
  76. package/dist/i18n.js.gz +0 -0
  77. package/dist/i18n.mjs +1 -1
  78. package/dist/i18n.mjs.br +0 -0
  79. package/dist/i18n.mjs.gz +0 -0
  80. package/dist/index.d.ts +71 -7
  81. package/dist/index.js +49 -49
  82. package/dist/index.js.br +0 -0
  83. package/dist/index.js.gz +0 -0
  84. package/dist/index.mjs +6 -6
  85. package/dist/index.mjs.br +0 -0
  86. package/dist/index.mjs.gz +0 -0
  87. package/dist/internals.d.ts +173 -43
  88. package/dist/internals.js +105 -105
  89. package/dist/internals.js.br +0 -0
  90. package/dist/internals.js.gz +0 -0
  91. package/dist/internals.mjs +4 -4
  92. package/dist/internals.mjs.br +0 -0
  93. package/dist/internals.mjs.gz +0 -0
  94. package/dist/pptx-viewer.css +1 -1
  95. package/dist/pptx-viewer.css.br +0 -0
  96. package/dist/pptx-viewer.css.gz +0 -0
  97. package/dist/viewer/index.d.ts +49 -7
  98. package/dist/viewer/index.js +27 -27
  99. package/dist/viewer/index.js.br +0 -0
  100. package/dist/viewer/index.js.gz +0 -0
  101. package/dist/viewer/index.mjs +6 -6
  102. package/dist/viewer/index.mjs.br +0 -0
  103. package/dist/viewer/index.mjs.gz +0 -0
  104. package/package.json +1 -1
  105. package/dist/AiChatPanel-7UQA25FA.js.br +0 -0
  106. package/dist/AiChatPanel-7UQA25FA.js.gz +0 -0
  107. package/dist/AiChatPanel-UCEK3ZTD.mjs.br +0 -0
  108. package/dist/AiChatPanel-UCEK3ZTD.mjs.gz +0 -0
  109. package/dist/Model3DScene-AI2JTBQM.mjs.br +0 -0
  110. package/dist/Model3DScene-AI2JTBQM.mjs.gz +0 -0
  111. package/dist/Model3DScene-X3DS3ELB.js.gz +0 -0
  112. package/dist/chunk-3UWJWJCR.mjs.br +0 -0
  113. package/dist/chunk-3UWJWJCR.mjs.gz +0 -0
  114. package/dist/chunk-42XEZVUQ.js.br +0 -0
  115. package/dist/chunk-42XEZVUQ.js.gz +0 -0
  116. package/dist/chunk-E7O4HTS5.js.br +0 -0
  117. package/dist/chunk-E7O4HTS5.js.gz +0 -0
  118. package/dist/chunk-KAO5USPE.js.br +0 -0
  119. package/dist/chunk-KAO5USPE.js.gz +0 -0
  120. package/dist/chunk-OBQ453H6.mjs.br +0 -0
  121. package/dist/chunk-OBQ453H6.mjs.gz +0 -0
  122. package/dist/chunk-PLDG3CXW.mjs.br +0 -0
  123. package/dist/chunk-PLDG3CXW.mjs.gz +0 -0
  124. package/dist/chunk-RXYLPESV.mjs.br +0 -0
  125. package/dist/chunk-RXYLPESV.mjs.gz +0 -0
  126. package/dist/chunk-SKTZSG7Q.mjs.br +0 -0
  127. package/dist/chunk-SKTZSG7Q.mjs.gz +0 -0
  128. package/dist/chunk-UTI4CLYJ.js.br +0 -0
  129. package/dist/chunk-UTI4CLYJ.js.gz +0 -0
  130. package/dist/chunk-W5KLLGVH.js.br +0 -0
  131. package/dist/chunk-W5KLLGVH.js.gz +0 -0
  132. package/dist/chunk-Y7LI2JIR.js.br +0 -0
  133. package/dist/chunk-Y7LI2JIR.js.gz +0 -0
  134. package/dist/chunk-YQJOCGOK.mjs.br +0 -0
  135. package/dist/chunk-YQJOCGOK.mjs.gz +0 -0
@@ -8766,6 +8766,8 @@ var init_table_style_edit = __esm({
8766
8766
  }
8767
8767
  });
8768
8768
  exports.TRANSITION_VALID_DIRECTIONS = void 0;
8769
+ exports.TRANSITION_PATTERN_OPTIONS = void 0;
8770
+ exports.TRANSITION_THRUBLK_TYPES = void 0;
8769
8771
  var init_transition = __esm({
8770
8772
  "src/core/types/transition.ts"() {
8771
8773
  exports.TRANSITION_VALID_DIRECTIONS = {
@@ -8779,8 +8781,40 @@ var init_transition = __esm({
8779
8781
  blinds: ["horz", "vert"],
8780
8782
  checker: ["horz", "vert"],
8781
8783
  comb: ["horz", "vert"],
8782
- randomBar: ["horz", "vert"]
8783
- };
8784
+ randomBar: ["horz", "vert"],
8785
+ // p14 (Office 2010+) extended transitions, COM-verified (see doc comment above).
8786
+ vortex: ["l", "u", "r", "d"],
8787
+ ripple: ["lu", "ld", "ru", "rd"],
8788
+ glitter: ["l", "u", "r", "d"],
8789
+ gallery: ["l", "r"],
8790
+ conveyor: ["l", "r"],
8791
+ ferris: ["l", "r"],
8792
+ switch: ["l", "r"],
8793
+ flip: ["l", "r"],
8794
+ shred: ["in", "out"],
8795
+ cube: ["l", "u", "r", "d"],
8796
+ rotate: ["l", "u", "r", "d"],
8797
+ box: ["l", "u", "r", "d"],
8798
+ orbit: ["l", "u", "r", "d"],
8799
+ pan: ["l", "u", "r", "d"],
8800
+ // p15 (Office 2013+) preset transitions: only the eight `P15_INVX_PRESETS`
8801
+ // (see `p15-transition-parser`) have an effect-options axis at all, and it
8802
+ // is a two-state `invX` toggle mapped onto `l`/`r` (curtains/prestige/
8803
+ // fracture/crush have no direction axis in PowerPoint at all).
8804
+ fallOver: ["l", "r"],
8805
+ drape: ["l", "r"],
8806
+ wind: ["l", "r"],
8807
+ peelOff: ["l", "r"],
8808
+ pageCurlSingle: ["l", "r"],
8809
+ pageCurlDouble: ["l", "r"],
8810
+ airplane: ["l", "r"],
8811
+ origami: ["l", "r"]
8812
+ };
8813
+ exports.TRANSITION_PATTERN_OPTIONS = {
8814
+ glitter: ["diamond", "hexagon"],
8815
+ shred: ["strip", "rectangle"]
8816
+ };
8817
+ exports.TRANSITION_THRUBLK_TYPES = /* @__PURE__ */ new Set(["cut", "fade"]);
8784
8818
  }
8785
8819
  });
8786
8820
  var init_animation = __esm({
@@ -54567,7 +54601,11 @@ function readP14Details(localName29, value) {
54567
54601
  if (detail) {
54568
54602
  const rawDir = String(detail["@_dir"] || "").trim();
54569
54603
  if (rawDir.length > 0) {
54570
- direction = rawDir;
54604
+ if (P14_DIR_IS_ORIENTATION_TYPE.has(localName29) && (rawDir === "horz" || rawDir === "vert")) {
54605
+ orient = rawDir;
54606
+ } else {
54607
+ direction = rawDir;
54608
+ }
54571
54609
  }
54572
54610
  const rawOrient = String(detail["@_orient"] || "").trim();
54573
54611
  if (rawOrient === "horz" || rawOrient === "vert") {
@@ -54612,6 +54650,7 @@ function parseP14FromExtLst(extLstNode, xmlLookupService, getXmlLocalName) {
54612
54650
  return void 0;
54613
54651
  }
54614
54652
  var P14_TRANSITION_TYPES;
54653
+ var P14_DIR_IS_ORIENTATION_TYPE;
54615
54654
  var init_p14_transition_parser = __esm({
54616
54655
  "src/core/services/p14-transition-parser.ts"() {
54617
54656
  init_p14_prism_family();
@@ -54643,6 +54682,7 @@ var init_p14_transition_parser = __esm({
54643
54682
  // through the p14 path", so leaving it out would write `<p:box/>`.
54644
54683
  "box"
54645
54684
  ]);
54685
+ P14_DIR_IS_ORIENTATION_TYPE = /* @__PURE__ */ new Set(["doors", "window"]);
54646
54686
  }
54647
54687
  });
54648
54688
  function chartExPrefixCapabilities() {
@@ -76004,10 +76044,6 @@ var init_PptxDocumentPropertiesUpdater = __esm({
76004
76044
  "#text": nowIso
76005
76045
  };
76006
76046
  }
76007
- const lastModifiedBy = this.extractXmlNodeText(coreProps["cp:lastModifiedBy"]);
76008
- if (!lastModifiedBy) {
76009
- coreProps["cp:lastModifiedBy"] = "pptx";
76010
- }
76011
76047
  this.ensureDatePropertyNamespaces(coreProps);
76012
76048
  coreData["cp:coreProperties"] = coreProps;
76013
76049
  this.context.zip.file("docProps/core.xml", this.context.builder.build(coreData));
@@ -78908,6 +78944,7 @@ var init_PptxSlideLoaderService = __esm({
78908
78944
  );
78909
78945
  if (chartData) {
78910
78946
  element.chartData = chartData;
78947
+ params.rememberChartDataBaseline(chartData);
78911
78948
  }
78912
78949
  } catch {
78913
78950
  }
@@ -80260,6 +80297,97 @@ var init_native_animation_timing_walk = __esm({
80260
80297
  init_native_animation_timing_node_extract();
80261
80298
  }
80262
80299
  });
80300
+ function optionalBoolean2(value) {
80301
+ const valueToken = value === void 0 || value === null ? "" : String(value).trim().toLowerCase();
80302
+ if (valueToken === "1" || valueToken === "true") {
80303
+ return true;
80304
+ }
80305
+ if (valueToken === "0" || valueToken === "false") {
80306
+ return false;
80307
+ }
80308
+ return void 0;
80309
+ }
80310
+ function readPrstTrans(value) {
80311
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
80312
+ return void 0;
80313
+ }
80314
+ const detail = value;
80315
+ const prst = String(detail["@_prst"] || "").trim();
80316
+ if (!P15_TRANSITION_PRESETS.has(prst)) {
80317
+ return void 0;
80318
+ }
80319
+ return {
80320
+ type: prst,
80321
+ invX: optionalBoolean2(detail["@_invX"]),
80322
+ invY: optionalBoolean2(detail["@_invY"])
80323
+ };
80324
+ }
80325
+ function parseP15DirectChild(transitionNode, getXmlLocalName) {
80326
+ for (const [key2, value] of Object.entries(transitionNode)) {
80327
+ if (key2.startsWith("@_")) {
80328
+ continue;
80329
+ }
80330
+ if (getXmlLocalName(key2) !== "prstTrans") {
80331
+ continue;
80332
+ }
80333
+ const result = readPrstTrans(value);
80334
+ if (result) {
80335
+ return result;
80336
+ }
80337
+ }
80338
+ return void 0;
80339
+ }
80340
+ function parseP15FromExtLst(extLstNode, xmlLookupService, getXmlLocalName) {
80341
+ const extEntries = xmlLookupService.getChildrenArrayByLocalName(extLstNode, "ext");
80342
+ for (const ext of extEntries) {
80343
+ if (!ext) {
80344
+ continue;
80345
+ }
80346
+ for (const [key2, value] of Object.entries(ext)) {
80347
+ if (key2.startsWith("@_")) {
80348
+ continue;
80349
+ }
80350
+ if (getXmlLocalName(key2) !== "prstTrans") {
80351
+ continue;
80352
+ }
80353
+ const result = readPrstTrans(value);
80354
+ if (result) {
80355
+ return result;
80356
+ }
80357
+ }
80358
+ }
80359
+ return void 0;
80360
+ }
80361
+ var P15_TRANSITION_PRESETS;
80362
+ var P15_INVX_PRESETS;
80363
+ var init_p15_transition_parser = __esm({
80364
+ "src/core/services/p15-transition-parser.ts"() {
80365
+ P15_TRANSITION_PRESETS = /* @__PURE__ */ new Set([
80366
+ "fallOver",
80367
+ "drape",
80368
+ "curtains",
80369
+ "wind",
80370
+ "prestige",
80371
+ "fracture",
80372
+ "crush",
80373
+ "peelOff",
80374
+ "pageCurlDouble",
80375
+ "pageCurlSingle",
80376
+ "airplane",
80377
+ "origami"
80378
+ ]);
80379
+ P15_INVX_PRESETS = /* @__PURE__ */ new Set([
80380
+ "fallOver",
80381
+ "drape",
80382
+ "wind",
80383
+ "peelOff",
80384
+ "pageCurlSingle",
80385
+ "pageCurlDouble",
80386
+ "airplane",
80387
+ "origami"
80388
+ ]);
80389
+ }
80390
+ });
80263
80391
  function resolveSlideTimingNode(slideRoot) {
80264
80392
  const direct = slideRoot?.["p:timing"];
80265
80393
  if (direct && typeof direct === "object" && !Array.isArray(direct)) {
@@ -80317,7 +80445,8 @@ function preservedP14ChildKey(node, transitionType, getXmlLocalName) {
80317
80445
  }
80318
80446
  return void 0;
80319
80447
  }
80320
- function preservedP15ChildKey(node, transitionType, getXmlLocalName) {
80448
+ function preservedP15ChildKey(node, transitionType, getXmlLocalName, direction) {
80449
+ const wantsInvX = P15_INVX_PRESETS.has(transitionType) && direction === "r";
80321
80450
  for (const [key2, value] of Object.entries(node)) {
80322
80451
  if (key2.startsWith("@_") || getXmlLocalName(key2) !== "prstTrans") {
80323
80452
  continue;
@@ -80325,7 +80454,12 @@ function preservedP15ChildKey(node, transitionType, getXmlLocalName) {
80325
80454
  if (!value || typeof value !== "object" || Array.isArray(value)) {
80326
80455
  continue;
80327
80456
  }
80328
- if (String(value["@_prst"] || "").trim() === transitionType) {
80457
+ const detail = value;
80458
+ if (String(detail["@_prst"] || "").trim() !== transitionType) {
80459
+ continue;
80460
+ }
80461
+ const hasInvX = String(detail["@_invX"] || "").trim() === "1";
80462
+ if (hasInvX === wantsInvX) {
80329
80463
  return key2;
80330
80464
  }
80331
80465
  }
@@ -80348,6 +80482,7 @@ var init_slide_transition_envelope = __esm({
80348
80482
  init_mc_capabilities();
80349
80483
  init_p14_prism_family();
80350
80484
  init_p14_transition_parser();
80485
+ init_p15_transition_parser();
80351
80486
  init_PptxXmlLookupService();
80352
80487
  defaultLookup = new PptxXmlLookupService();
80353
80488
  }
@@ -80445,86 +80580,6 @@ var init_PptxNativeAnimationService = __esm({
80445
80580
  };
80446
80581
  }
80447
80582
  });
80448
- function optionalBoolean2(value) {
80449
- const valueToken = value === void 0 || value === null ? "" : String(value).trim().toLowerCase();
80450
- if (valueToken === "1" || valueToken === "true") {
80451
- return true;
80452
- }
80453
- if (valueToken === "0" || valueToken === "false") {
80454
- return false;
80455
- }
80456
- return void 0;
80457
- }
80458
- function readPrstTrans(value) {
80459
- if (!value || typeof value !== "object" || Array.isArray(value)) {
80460
- return void 0;
80461
- }
80462
- const detail = value;
80463
- const prst = String(detail["@_prst"] || "").trim();
80464
- if (!P15_TRANSITION_PRESETS.has(prst)) {
80465
- return void 0;
80466
- }
80467
- return {
80468
- type: prst,
80469
- invX: optionalBoolean2(detail["@_invX"]),
80470
- invY: optionalBoolean2(detail["@_invY"])
80471
- };
80472
- }
80473
- function parseP15DirectChild(transitionNode, getXmlLocalName) {
80474
- for (const [key2, value] of Object.entries(transitionNode)) {
80475
- if (key2.startsWith("@_")) {
80476
- continue;
80477
- }
80478
- if (getXmlLocalName(key2) !== "prstTrans") {
80479
- continue;
80480
- }
80481
- const result = readPrstTrans(value);
80482
- if (result) {
80483
- return result;
80484
- }
80485
- }
80486
- return void 0;
80487
- }
80488
- function parseP15FromExtLst(extLstNode, xmlLookupService, getXmlLocalName) {
80489
- const extEntries = xmlLookupService.getChildrenArrayByLocalName(extLstNode, "ext");
80490
- for (const ext of extEntries) {
80491
- if (!ext) {
80492
- continue;
80493
- }
80494
- for (const [key2, value] of Object.entries(ext)) {
80495
- if (key2.startsWith("@_")) {
80496
- continue;
80497
- }
80498
- if (getXmlLocalName(key2) !== "prstTrans") {
80499
- continue;
80500
- }
80501
- const result = readPrstTrans(value);
80502
- if (result) {
80503
- return result;
80504
- }
80505
- }
80506
- }
80507
- return void 0;
80508
- }
80509
- var P15_TRANSITION_PRESETS;
80510
- var init_p15_transition_parser = __esm({
80511
- "src/core/services/p15-transition-parser.ts"() {
80512
- P15_TRANSITION_PRESETS = /* @__PURE__ */ new Set([
80513
- "fallOver",
80514
- "drape",
80515
- "curtains",
80516
- "wind",
80517
- "prestige",
80518
- "fracture",
80519
- "crush",
80520
- "peelOff",
80521
- "pageCurlDouble",
80522
- "pageCurlSingle",
80523
- "airplane",
80524
- "origami"
80525
- ]);
80526
- }
80527
- });
80528
80583
  function normalizeMorphOption(value) {
80529
80584
  const candidate = token(value);
80530
80585
  return MORPH_OPTIONS.has(candidate) ? candidate : void 0;
@@ -80556,9 +80611,13 @@ function parseTransitionDetails(node, localName29) {
80556
80611
  continue;
80557
80612
  }
80558
80613
  const detail = value;
80559
- const direction = token(detail["@_dir"]);
80560
- if (direction) {
80561
- result.direction = direction;
80614
+ const rawDir = token(detail["@_dir"]);
80615
+ if (rawDir) {
80616
+ if (DIR_IS_ORIENTATION_TYPE.has(name) && (rawDir === "horz" || rawDir === "vert")) {
80617
+ result.orient = rawDir;
80618
+ } else {
80619
+ result.direction = rawDir;
80620
+ }
80562
80621
  }
80563
80622
  const orient = token(detail["@_orient"]);
80564
80623
  if (orient === "horz" || orient === "vert") {
@@ -80622,11 +80681,15 @@ function createPreservedTransitionNode(raw, localName29) {
80622
80681
  }
80623
80682
  function buildStandardTransitionChild(transition) {
80624
80683
  const child262 = {};
80625
- if (transition.direction) {
80626
- child262["@_dir"] = transition.direction;
80627
- }
80628
- if (transition.orient) {
80629
- child262["@_orient"] = transition.orient;
80684
+ if (DIR_IS_ORIENTATION_TYPE.has(transition.type) && transition.orient) {
80685
+ child262["@_dir"] = transition.orient;
80686
+ } else {
80687
+ if (transition.direction) {
80688
+ child262["@_dir"] = transition.direction;
80689
+ }
80690
+ if (transition.orient) {
80691
+ child262["@_orient"] = transition.orient;
80692
+ }
80630
80693
  }
80631
80694
  if (validUnsignedInteger(transition.spokes, 1)) {
80632
80695
  child262["@_spokes"] = String(transition.spokes);
@@ -80733,6 +80796,7 @@ function validUnsignedInteger(value, min = 0) {
80733
80796
  var STANDARD_TRANSITION_TYPES;
80734
80797
  var SPEEDS;
80735
80798
  var UINT_MAX2;
80799
+ var DIR_IS_ORIENTATION_TYPE;
80736
80800
  var MORPH_OPTIONS;
80737
80801
  var init_slide_transition_xml = __esm({
80738
80802
  "src/core/services/slide-transition-xml.ts"() {
@@ -80762,6 +80826,7 @@ var init_slide_transition_xml = __esm({
80762
80826
  ]);
80763
80827
  SPEEDS = /* @__PURE__ */ new Set(["slow", "med", "fast"]);
80764
80828
  UINT_MAX2 = 4294967295;
80829
+ DIR_IS_ORIENTATION_TYPE = /* @__PURE__ */ new Set(["blinds", "checker", "comb", "randomBar"]);
80765
80830
  MORPH_OPTIONS = /* @__PURE__ */ new Set(["byObject", "byWord", "byChar"]);
80766
80831
  }
80767
80832
  });
@@ -80848,13 +80913,17 @@ function buildP14DirectChild(transitionType, details, context) {
80848
80913
  delete node["@_isInverted"];
80849
80914
  }
80850
80915
  const direction = String(details.direction ?? "").trim();
80851
- if (P14_REQUIRED_LEFT_RIGHT.has(elementName)) {
80852
- node["@_dir"] = direction === "r" ? "r" : "l";
80853
- } else if (direction.length > 0) {
80854
- node["@_dir"] = direction;
80855
- }
80856
- if (details.orient) {
80857
- node["@_orient"] = details.orient;
80916
+ if (P14_DIR_IS_ORIENTATION_TYPE.has(elementName) && details.orient) {
80917
+ node["@_dir"] = details.orient;
80918
+ } else {
80919
+ if (P14_REQUIRED_LEFT_RIGHT.has(elementName)) {
80920
+ node["@_dir"] = direction === "r" ? "r" : "l";
80921
+ } else if (direction.length > 0) {
80922
+ node["@_dir"] = direction;
80923
+ }
80924
+ if (details.orient) {
80925
+ node["@_orient"] = details.orient;
80926
+ }
80858
80927
  }
80859
80928
  if (details.pattern) {
80860
80929
  node["@_pattern"] = details.pattern;
@@ -80870,15 +80939,20 @@ function buildP14DirectChild(transitionType, details, context) {
80870
80939
  }
80871
80940
  return { key: `p14:${elementName}`, node };
80872
80941
  }
80873
- function buildP15DirectChild(transitionType, context) {
80874
- return {
80875
- key: "p15:prstTrans",
80876
- node: {
80877
- "@_xmlns:p15": P15_NAMESPACE_URI2,
80878
- ...inheritedAttributes(findInExtensions(context, "prstTrans")),
80879
- "@_prst": transitionType
80880
- }
80942
+ function buildP15DirectChild(transitionType, context, direction) {
80943
+ const node = {
80944
+ "@_xmlns:p15": P15_NAMESPACE_URI2,
80945
+ ...inheritedAttributes(findInExtensions(context, "prstTrans")),
80946
+ "@_prst": transitionType
80881
80947
  };
80948
+ if (P15_INVX_PRESETS.has(transitionType)) {
80949
+ if (direction === "r") {
80950
+ node["@_invX"] = "1";
80951
+ } else {
80952
+ delete node["@_invX"];
80953
+ }
80954
+ }
80955
+ return { key: "p15:prstTrans", node };
80882
80956
  }
80883
80957
  function buildMorphDirectChild(morphOption, context) {
80884
80958
  const node = {
@@ -80907,6 +80981,8 @@ var P14_REQUIRED_LEFT_RIGHT;
80907
80981
  var init_transition_extension_child = __esm({
80908
80982
  "src/core/services/transition-extension-child.ts"() {
80909
80983
  init_p14_prism_family();
80984
+ init_p14_transition_parser();
80985
+ init_p15_transition_parser();
80910
80986
  P14_NAMESPACE_URI = "http://schemas.microsoft.com/office/powerpoint/2010/main";
80911
80987
  P15_NAMESPACE_URI2 = "http://schemas.microsoft.com/office/powerpoint/2012/main";
80912
80988
  P159_NAMESPACE_URI = "http://schemas.microsoft.com/office/powerpoint/2015/09/main";
@@ -80954,11 +81030,14 @@ var init_PptxSlideTransitionService = __esm({
80954
81030
  const p15Direct = p14Direct ? void 0 : parseP15DirectChild(transitionNode, this.getXmlLocalName);
80955
81031
  if (p14Direct) {
80956
81032
  transitionType = p14Direct.type;
80957
- direction = p14Direct.direction ?? direction;
80958
- orient = p14Direct.orient ?? orient;
80959
- pattern = p14Direct.pattern ?? pattern;
81033
+ direction = p14Direct.direction;
81034
+ orient = p14Direct.orient;
81035
+ pattern = p14Direct.pattern;
80960
81036
  } else if (p15Direct) {
80961
81037
  transitionType = p15Direct.type;
81038
+ if (p15Direct.invX) {
81039
+ direction = "r";
81040
+ }
80962
81041
  }
80963
81042
  }
80964
81043
  if (rawExtLst && transitionType === "cut") {
@@ -80977,6 +81056,9 @@ var init_PptxSlideTransitionService = __esm({
80977
81056
  }
80978
81057
  } else if (p15Result) {
80979
81058
  transitionType = p15Result.type;
81059
+ if (p15Result.invX) {
81060
+ direction = "r";
81061
+ }
80980
81062
  } else {
80981
81063
  const morphResult = parseMorphFromExtLst(
80982
81064
  rawExtLst,
@@ -81016,7 +81098,7 @@ var init_PptxSlideTransitionService = __esm({
81016
81098
  const isMorphType = transitionType === "morph";
81017
81099
  const node = createPreservedTransitionNode(transition.rawTransition, this.getXmlLocalName);
81018
81100
  const p14ChildKey = isP14Type ? preservedP14ChildKey(node, transitionType, this.getXmlLocalName) : void 0;
81019
- const p15ChildKey = isP15Type ? preservedP15ChildKey(node, transitionType, this.getXmlLocalName) : void 0;
81101
+ const p15ChildKey = isP15Type ? preservedP15ChildKey(node, transitionType, this.getXmlLocalName, transition.direction) : void 0;
81020
81102
  pruneDirectExtensionChildren(node, this.getXmlLocalName, p14ChildKey ?? p15ChildKey);
81021
81103
  const extensionContext = {
81022
81104
  rawExtLst: transition.rawExtLst,
@@ -81040,7 +81122,7 @@ var init_PptxSlideTransitionService = __esm({
81040
81122
  }
81041
81123
  } else if (isP15Type) {
81042
81124
  if (!p15ChildKey) {
81043
- const child262 = buildP15DirectChild(transitionType, extensionContext);
81125
+ const child262 = buildP15DirectChild(transitionType, extensionContext, transition.direction);
81044
81126
  node[child262.key] = child262.node;
81045
81127
  }
81046
81128
  } else if (isMorphType) {
@@ -99439,9 +99521,19 @@ function applyBulletProperties(paragraphProps, bulletInfo) {
99439
99521
  if (bulletInfo.fontInherit) {
99440
99522
  paragraphProps["a:buFontTx"] = {};
99441
99523
  } else if (bulletInfo.fontFamily) {
99442
- paragraphProps["a:buFont"] = {
99524
+ const buFont = {
99443
99525
  "@_typeface": bulletInfo.fontFamily
99444
99526
  };
99527
+ if (bulletInfo.fontPanose) {
99528
+ buFont["@_panose"] = bulletInfo.fontPanose;
99529
+ }
99530
+ if (bulletInfo.fontPitchFamily !== void 0) {
99531
+ buFont["@_pitchFamily"] = String(bulletInfo.fontPitchFamily);
99532
+ }
99533
+ if (bulletInfo.fontCharset !== void 0) {
99534
+ buFont["@_charset"] = String(bulletInfo.fontCharset);
99535
+ }
99536
+ paragraphProps["a:buFont"] = buFont;
99445
99537
  }
99446
99538
  if (bulletInfo.none) {
99447
99539
  paragraphProps["a:buNone"] = {};
@@ -100876,6 +100968,20 @@ var init_PptxHandlerRuntimeState = __esm({
100876
100968
  * @see fingerprintSlide in `./slide-fingerprint`
100877
100969
  */
100878
100970
  savedSlideFingerprints = /* @__PURE__ */ new Map();
100971
+ /**
100972
+ * `chartData` exactly as it stood right after `enrichChartData` parsed it,
100973
+ * serialized to JSON and keyed by `chartPartPath`. The save pipeline used
100974
+ * to re-serialize EVERY chart part on any slide rewrite regardless of
100975
+ * whether the chart itself was touched, which materializes the load-time
100976
+ * resolved model back into the file: an inherited title font/color gets
100977
+ * pinned onto the title run, radar series colours that were following the
100978
+ * palette cycle get pinned per-point, and fields this engine does not
100979
+ * model on `PptxChartData` (e.g. a chartex series' `cx:f` formula or its
100980
+ * `uniqueId`) are silently dropped because the rebuild only knows what it
100981
+ * modeled. Comparing the current `chartData` against this baseline lets an
100982
+ * untouched chart part pass through byte-for-byte instead.
100983
+ */
100984
+ chartDataBaselines = /* @__PURE__ */ new Map();
100879
100985
  /** Per-slide relationship maps: slide path -> (rId -> target path). */
100880
100986
  slideRelsMap = /* @__PURE__ */ new Map();
100881
100987
  /** Tracks relationship IDs with TargetMode="External" per slide/part path. */
@@ -101762,9 +101868,7 @@ var init_PptxHandlerRuntimeElementActions = __esm({
101762
101868
  );
101763
101869
  rId = resolveHyperlinkRelationshipId(action.url, forceExternal) ?? void 0;
101764
101870
  }
101765
- if (rId) {
101766
- node["@_r:id"] = rId;
101767
- }
101871
+ node["@_r:id"] = rId ?? "";
101768
101872
  if (action.action) {
101769
101873
  node["@_action"] = action.action;
101770
101874
  }
@@ -103896,7 +104000,7 @@ var init_PptxHandlerRuntimeSaveSlideUtils = __esm({
103896
104000
  };
103897
104001
  }
103898
104002
  });
103899
- function buildTextRunEffectListXml(style) {
104003
+ function buildTextRunEffectListXml(style, parseColor) {
103900
104004
  const hasTextShadow = Boolean(style.textShadowColor) || typeof style.textShadowBlur === "number" && style.textShadowBlur > 0;
103901
104005
  const hasTextInnerShadow = Boolean(style.textInnerShadowColor) || typeof style.textInnerShadowBlur === "number" && style.textInnerShadowBlur > 0;
103902
104006
  const hasTextPresetShadow = Boolean(style.textPresetShadowName);
@@ -103923,7 +104027,7 @@ function buildTextRunEffectListXml(style) {
103923
104027
  effectLst["a:prstShdw"] = buildPresetShadowNode(style);
103924
104028
  }
103925
104029
  if (hasTextGlow) {
103926
- effectLst["a:glow"] = buildGlowNode(style);
104030
+ effectLst["a:glow"] = buildGlowNode(style, parseColor);
103927
104031
  }
103928
104032
  if (hasTextReflection) {
103929
104033
  effectLst["a:reflection"] = buildReflectionNode(style);
@@ -104010,10 +104114,18 @@ function buildPresetShadowNode(style) {
104010
104114
  }
104011
104115
  return node;
104012
104116
  }
104013
- function buildGlowNode(style) {
104117
+ function buildGlowNode(style, parseColor) {
104118
+ const fallbackHex = style.textGlowColor || "#ffff00";
104119
+ const resolvedOriginal = style.textGlowColorXml ? parseColor?.(style.textGlowColorXml) : void 0;
104014
104120
  return {
104015
104121
  "@_rad": String(Math.round((style.textGlowRadius ?? 6) * EMU_PER_PX9)),
104016
- "a:srgbClr": buildShadowColorNode(style.textGlowColor || "#ffff00", style.textGlowOpacity)
104122
+ ...serializeColorChoiceWithRef(
104123
+ style.textGlowColorRef,
104124
+ style.textGlowColorXml,
104125
+ resolvedOriginal,
104126
+ fallbackHex,
104127
+ style.textGlowOpacity
104128
+ )
104017
104129
  };
104018
104130
  }
104019
104131
  function buildReflectionNode(style) {
@@ -104083,6 +104195,7 @@ function buildClrChangeNode(style) {
104083
104195
  var EMU_PER_PX9;
104084
104196
  var init_text_run_effect_xml_builder = __esm({
104085
104197
  "src/core/core/runtime/text-run-effect-xml-builder.ts"() {
104198
+ init_color_xml_preservation();
104086
104199
  init_positive_fixed_angle();
104087
104200
  EMU_PER_PX9 = 9525;
104088
104201
  }
@@ -104283,7 +104396,10 @@ var init_PptxHandlerRuntimeSaveRunProperties = __esm({
104283
104396
  }
104284
104397
  runProps["a:pattFill"] = pattFill;
104285
104398
  }
104286
- const textEffectLst = buildTextRunEffectListXml(style);
104399
+ const textEffectLst = buildTextRunEffectListXml(
104400
+ style,
104401
+ (colorNode) => this.parseColor(colorNode)
104402
+ );
104287
104403
  if (textEffectLst) {
104288
104404
  runProps["a:effectLst"] = textEffectLst;
104289
104405
  }
@@ -104421,6 +104537,9 @@ var init_PptxHandlerRuntimeSaveRunProperties = __esm({
104421
104537
  if (style.hyperlinkSoundXml && typeof style.hyperlinkSoundXml === "object") {
104422
104538
  hlinkNode["a:snd"] = style.hyperlinkSoundXml;
104423
104539
  }
104540
+ if (style.hyperlinkExtensionXml && typeof style.hyperlinkExtensionXml === "object") {
104541
+ hlinkNode["a:extLst"] = style.hyperlinkExtensionXml;
104542
+ }
104424
104543
  }
104425
104544
  };
104426
104545
  }
@@ -105566,6 +105685,10 @@ var init_PptxHandlerRuntimeSaveImageEffects = __esm({
105566
105685
  if (!blipFill) {
105567
105686
  return;
105568
105687
  }
105688
+ const hasCropOpinion = element.cropLeft !== void 0 || element.cropTop !== void 0 || element.cropRight !== void 0 || element.cropBottom !== void 0;
105689
+ if (!hasCropOpinion) {
105690
+ return;
105691
+ }
105569
105692
  const srcRect = buildSrcRectXml(element);
105570
105693
  if (!srcRect) {
105571
105694
  delete blipFill["a:srcRect"];
@@ -105874,7 +105997,56 @@ var init_PptxHandlerRuntimeTextStyleUtils = __esm({
105874
105997
  "align",
105875
105998
  "vAlign",
105876
105999
  "textDirection",
105877
- "columnCount"
106000
+ "columnCount",
106001
+ // Round-trip-only `a:rPr` attributes that carry no visual difference
106002
+ // but ARE distinct authored content: two adjacent runs differing only
106003
+ // in one of these were still "the same style" by the keys above, so
106004
+ // they were folded into a single merged run and every one of these
106005
+ // attributes on every run but the first was silently dropped.
106006
+ // Measured on `issue-132-hr-deck.pptx`: 34 authored runs (mixed
106007
+ // `lang`/`altLang` from pasted multi-language text) collapsed to 4 on
106008
+ // a no-edit round-trip.
106009
+ "language",
106010
+ "altLanguage",
106011
+ "dirty",
106012
+ "smartTagClean",
106013
+ "smartTagId",
106014
+ "bookmark",
106015
+ "kumimoji",
106016
+ "normalizeHeight",
106017
+ "noProof",
106018
+ "spellingError",
106019
+ "underlineColor",
106020
+ "underlineStyle",
106021
+ "underlineExplicitNone",
106022
+ "underlineLineFollowsText",
106023
+ "underlineFillFollowsText",
106024
+ "strikeType",
106025
+ "baseline",
106026
+ "characterSpacing",
106027
+ "kerning",
106028
+ "highlightColor",
106029
+ "textCaps",
106030
+ "textCapsExplicitNone",
106031
+ "hyperlinkRId",
106032
+ "hyperlinkTooltip",
106033
+ "hyperlinkAction",
106034
+ "hyperlinkTargetSlideIndex",
106035
+ "hyperlinkMouseOver",
106036
+ "hyperlinkInvalidUrl",
106037
+ "hyperlinkTargetFrame",
106038
+ "hyperlinkHistory",
106039
+ "hyperlinkHighlightClick",
106040
+ "hyperlinkEndSound",
106041
+ "hyperlinkExtensionXml",
106042
+ "textGlowColor",
106043
+ "textGlowRadius",
106044
+ "textGlowOpacity",
106045
+ "textShadowColor",
106046
+ "textShadowBlur",
106047
+ "textShadowOffsetX",
106048
+ "textShadowOffsetY",
106049
+ "textShadowOpacity"
105878
106050
  ];
105879
106051
  return keys.every((key2) => left?.[key2] === right?.[key2]);
105880
106052
  }
@@ -105996,6 +106168,8 @@ var init_PptxHandlerRuntimeTextStyleUtils = __esm({
105996
106168
  var PptxHandlerRuntime18;
105997
106169
  var init_PptxHandlerRuntimeTextRunEffects = __esm({
105998
106170
  "src/core/core/runtime/PptxHandlerRuntimeTextRunEffects.ts"() {
106171
+ init_theme_color_ref();
106172
+ init_color_xml_preservation();
105999
106173
  init_effect_dag_containers();
106000
106174
  init_effect_style_extractor_reflection();
106001
106175
  init_PptxHandlerRuntimeTextStyleUtils();
@@ -106048,6 +106222,10 @@ var init_PptxHandlerRuntimeTextRunEffects = __esm({
106048
106222
  if (clickSnd && typeof clickSnd === "object") {
106049
106223
  style.hyperlinkSoundXml = clickSnd;
106050
106224
  }
106225
+ const extLst = hyperlinkNode["a:extLst"];
106226
+ if (extLst && typeof extLst === "object") {
106227
+ style.hyperlinkExtensionXml = extLst;
106228
+ }
106051
106229
  }
106052
106230
  const actionStr = String(hyperlinkNode?.["@_action"] || "").trim();
106053
106231
  if (actionStr) {
@@ -106122,6 +106300,14 @@ var init_PptxHandlerRuntimeTextRunEffects = __esm({
106122
106300
  if (glowColor) {
106123
106301
  style.textGlowColor = glowColor;
106124
106302
  }
106303
+ const glowColorXml = extractColorChoiceXml(glowNode);
106304
+ if (glowColorXml) {
106305
+ style.textGlowColorXml = glowColorXml;
106306
+ }
106307
+ const glowColorRef = themeColorRefFromColorChoice(glowNode);
106308
+ if (glowColorRef) {
106309
+ style.textGlowColorRef = glowColorRef;
106310
+ }
106125
106311
  const glowOpacity = this.extractColorOpacity(glowNode);
106126
106312
  if (glowOpacity !== void 0) {
106127
106313
  style.textGlowOpacity = glowOpacity;
@@ -108944,6 +109130,16 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
108944
109130
  }
108945
109131
  /** Pending chart data updates to process in the async save method. */
108946
109132
  pendingChartUpdates;
109133
+ /**
109134
+ * Record `chartData` as parsed, straight off `enrichChartData`, as this
109135
+ * chart's load-time baseline. See {@link chartDataBaselines}.
109136
+ */
109137
+ rememberChartDataBaseline(chartData) {
109138
+ if (!chartData.chartPartPath) {
109139
+ return;
109140
+ }
109141
+ this.chartDataBaselines.set(chartData.chartPartPath, JSON.stringify(chartData));
109142
+ }
108947
109143
  /**
108948
109144
  * Collect chart data for deferred async processing during save.
108949
109145
  */
@@ -108964,6 +109160,9 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
108964
109160
  return;
108965
109161
  }
108966
109162
  for (const { chartData, slidePath } of this.pendingChartUpdates) {
109163
+ if (chartData.chartPartPath && this.chartDataBaselines.get(chartData.chartPartPath) === JSON.stringify(chartData)) {
109164
+ continue;
109165
+ }
108967
109166
  if (chartData.colorPalette && chartData.colorStylePartPath) {
108968
109167
  const paletteChanged = JSON.stringify(chartData.colorPalette) !== JSON.stringify(chartData.colorStyleOriginalPalette);
108969
109168
  const method = chartData.colorMethod ?? "cycle";
@@ -112018,6 +112217,9 @@ function writeShapeFill(spPr, shapeStyle, ctx) {
112018
112217
  if (fillIsPurelyStyleMatrix(shapeStyle)) {
112019
112218
  return;
112020
112219
  }
112220
+ if (requestedFillMode === "image") {
112221
+ return;
112222
+ }
112021
112223
  if (requestedFillMode === "none" || shapeStyle.fillColor === "transparent") {
112022
112224
  setFillChoice(spPr, "a:noFill", {});
112023
112225
  return;
@@ -119777,6 +119979,7 @@ var PptxHandlerRuntime61;
119777
119979
  var init_PptxHandlerRuntimeShapeImageFill = __esm({
119778
119980
  "src/core/core/runtime/PptxHandlerRuntimeShapeImageFill.ts"() {
119779
119981
  init_xml_access();
119982
+ init_group_shape_geometry();
119780
119983
  init_PptxHandlerRuntimeGeometryParsing();
119781
119984
  PptxHandlerRuntime61 = class _PptxHandlerRuntime extends PptxHandlerRuntime60 {
119782
119985
  /**
@@ -119799,12 +120002,14 @@ var init_PptxHandlerRuntimeShapeImageFill = __esm({
119799
120002
  if (!off || !ext) {
119800
120003
  return null;
119801
120004
  }
119802
- const x = Math.round(parseInt(xmlAttr(off, "x") || "0") / _PptxHandlerRuntime.EMU_PER_PX);
119803
- const y = Math.round(parseInt(xmlAttr(off, "y") || "0") / _PptxHandlerRuntime.EMU_PER_PX);
119804
- const width = Math.round(parseInt(xmlAttr(ext, "cx") || "0") / _PptxHandlerRuntime.EMU_PER_PX);
119805
- const height = Math.round(
119806
- parseInt(xmlAttr(ext, "cy") || "0") / _PptxHandlerRuntime.EMU_PER_PX
119807
- );
120005
+ const xEmu = parseEmuInt(xmlAttr(off, "x"));
120006
+ const yEmu = parseEmuInt(xmlAttr(off, "y"));
120007
+ const widthEmu = parseEmuInt(xmlAttr(ext, "cx"));
120008
+ const heightEmu = parseEmuInt(xmlAttr(ext, "cy"));
120009
+ const x = Math.round(xEmu / _PptxHandlerRuntime.EMU_PER_PX);
120010
+ const y = Math.round(yEmu / _PptxHandlerRuntime.EMU_PER_PX);
120011
+ const width = Math.round(widthEmu / _PptxHandlerRuntime.EMU_PER_PX);
120012
+ const height = Math.round(heightEmu / _PptxHandlerRuntime.EMU_PER_PX);
119808
120013
  const rotation = xfrm["@_rot"] ? parseInt(xfrm["@_rot"]) / 6e4 : void 0;
119809
120014
  const skewX = xfrm["@_skewX"] ? parseInt(String(xfrm["@_skewX"]), 10) / 6e4 : void 0;
119810
120015
  const skewY = xfrm["@_skewY"] ? parseInt(String(xfrm["@_skewY"]), 10) / 6e4 : void 0;
@@ -119913,6 +120118,10 @@ var init_PptxHandlerRuntimeShapeImageFill = __esm({
119913
120118
  y,
119914
120119
  width,
119915
120120
  height,
120121
+ xEmu,
120122
+ yEmu,
120123
+ widthEmu,
120124
+ heightEmu,
119916
120125
  imageData,
119917
120126
  imagePath,
119918
120127
  imageEffects: imageEffects || void 0,
@@ -120242,6 +120451,11 @@ var init_PptxHandlerRuntimeBulletParsing = __esm({
120242
120451
  }
120243
120452
  const buFont = resolvedBulletProps["a:buFont"];
120244
120453
  const fontFamily = buFont?.["@_typeface"] ? String(buFont["@_typeface"]) : void 0;
120454
+ const fontPanose = buFont?.["@_panose"] ? String(buFont["@_panose"]) : void 0;
120455
+ const pitchFamilyRaw = Number.parseInt(String(buFont?.["@_pitchFamily"] ?? ""), 10);
120456
+ const fontPitchFamily = Number.isFinite(pitchFamilyRaw) ? pitchFamilyRaw : void 0;
120457
+ const charsetRaw = Number.parseInt(String(buFont?.["@_charset"] ?? ""), 10);
120458
+ const fontCharset = Number.isFinite(charsetRaw) ? charsetRaw : void 0;
120245
120459
  const fontInherit = resolvedBulletProps["a:buFontTx"] !== void 0;
120246
120460
  const sizePercent = parseBulletSizePercent(
120247
120461
  resolvedBulletProps["a:buSzPct"]
@@ -120273,6 +120487,9 @@ var init_PptxHandlerRuntimeBulletParsing = __esm({
120273
120487
  return {
120274
120488
  char: bulletChar,
120275
120489
  fontFamily,
120490
+ fontPanose,
120491
+ fontPitchFamily,
120492
+ fontCharset,
120276
120493
  sizePercent,
120277
120494
  sizePts,
120278
120495
  color: color2,
@@ -120294,6 +120511,9 @@ var init_PptxHandlerRuntimeBulletParsing = __esm({
120294
120511
  autoNumStartAt,
120295
120512
  paragraphIndex,
120296
120513
  fontFamily,
120514
+ fontPanose,
120515
+ fontPitchFamily,
120516
+ fontCharset,
120297
120517
  sizePercent,
120298
120518
  sizePts,
120299
120519
  color: color2,
@@ -120330,6 +120550,9 @@ var init_PptxHandlerRuntimeBulletParsing = __esm({
120330
120550
  imageDataUrl,
120331
120551
  imageBlipFillXml,
120332
120552
  fontFamily,
120553
+ fontPanose,
120554
+ fontPitchFamily,
120555
+ fontCharset,
120333
120556
  sizePercent,
120334
120557
  sizePts,
120335
120558
  color: color2,
@@ -120341,6 +120564,9 @@ var init_PptxHandlerRuntimeBulletParsing = __esm({
120341
120564
  return {
120342
120565
  imageBlipFillXml,
120343
120566
  fontFamily,
120567
+ fontPanose,
120568
+ fontPitchFamily,
120569
+ fontCharset,
120344
120570
  sizePercent,
120345
120571
  sizePts,
120346
120572
  color: color2,
@@ -121101,9 +121327,9 @@ var init_PptxHandlerRuntimeShapeParagraphContentParsing = __esm({
121101
121327
  if (fldGuidAttr) {
121102
121328
  fieldSegment.fieldGuidAttr = fldGuidAttr;
121103
121329
  }
121104
- const fieldPPr = field["a:pPr"];
121105
- if (fieldPPr && typeof fieldPPr === "object") {
121106
- fieldSegment.fieldParagraphPropertiesXml = fieldPPr;
121330
+ if (field["a:pPr"] !== void 0) {
121331
+ const fieldPPr = field["a:pPr"];
121332
+ fieldSegment.fieldParagraphPropertiesXml = typeof fieldPPr === "object" && fieldPPr !== null ? fieldPPr : {};
121107
121333
  }
121108
121334
  segments.push(fieldSegment);
121109
121335
  maybeSeed(fieldRunStyle);
@@ -121645,7 +121871,18 @@ var init_PptxHandlerRuntimeShapeParsing = __esm({
121645
121871
  yEmu,
121646
121872
  widthEmu,
121647
121873
  heightEmu,
121648
- text: text22,
121874
+ // A shape with no `p:txBody` at all (own or inherited) - a bare
121875
+ // decorative rectangle, say - has no textual capability, and
121876
+ // `text` must stay `undefined` to say so. `text` was unconditionally
121877
+ // initialized to `''` above and only ever reassigned when a txBody
121878
+ // WAS found, so a bare shape's `''` was indistinguishable from an
121879
+ // authored-but-empty text box; the save writer's
121880
+ // `typeof el.text === 'string'` check then created a brand-new empty
121881
+ // `<p:txBody/>` on that shape's `rawXml` the moment it was rewritten
121882
+ // (any edit on a slide master/layout element rewrites its whole
121883
+ // shape node), which real PowerPoint never authors on a shape with
121884
+ // no text.
121885
+ text: txBody !== void 0 ? text22 : void 0,
121649
121886
  // A text-less shape (only an empty `a:endParaRPr`, or no `a:p` at
121650
121887
  // all) still has its own `a:bodyPr`: PowerPoint applies the
121651
121888
  // vertical anchor, insets and autofit of an EMPTY text box just
@@ -121772,6 +122009,8 @@ var init_PptxHandlerRuntimePictureParsing = __esm({
121772
122009
  const mediaCNvPr = pic?.["p:nvPicPr"]?.["p:cNvPr"];
121773
122010
  const mediaAltText = String(mediaCNvPr?.["@_descr"] || "").trim() || void 0;
121774
122011
  const mediaTitle = String(mediaCNvPr?.["@_title"] || "").trim() || void 0;
122012
+ const mediaSlideRels = this.slideRelsMap.get(slidePath);
122013
+ const { actionClick: mediaActionClick, actionHover: mediaActionHover } = this.parseElementActions(mediaCNvPr, mediaSlideRels, this.orderedSlidePaths);
121775
122014
  this.compatibilityService.inspectMediaReferenceCompatibility(
121776
122015
  mediaReference.kind,
121777
122016
  slidePath,
@@ -121860,6 +122099,8 @@ var init_PptxHandlerRuntimePictureParsing = __esm({
121860
122099
  posterFrameData,
121861
122100
  ...mediaAltText !== void 0 ? { altText: mediaAltText } : {},
121862
122101
  ...mediaTitle !== void 0 ? { title: mediaTitle } : {},
122102
+ ...mediaActionClick !== void 0 ? { actionClick: mediaActionClick } : {},
122103
+ ...mediaActionHover !== void 0 ? { actionHover: mediaActionHover } : {},
121863
122104
  ...this.readImageCropFromBlipFill(posterBlipFill),
121864
122105
  // Real PowerPoint media is `p:pic`-shaped even though the
121865
122106
  // `media` type buckets as `p:graphicFrame`, so its locks live
@@ -129788,6 +130029,7 @@ var init_PptxHandlerRuntimeLoadSession = __esm({
129788
130029
  this.externalRelsMap.clear();
129789
130030
  this.slideMap.clear();
129790
130031
  this.savedSlideFingerprints.clear();
130032
+ this.chartDataBaselines.clear();
129791
130033
  this.layoutCache.clear();
129792
130034
  this.masterCache.clear();
129793
130035
  this.templateElementBaselines.reset();
@@ -130093,6 +130335,7 @@ var init_PptxHandlerRuntimeLoadSession = __esm({
130093
130335
  parseNativeAnimations: (slideXml3, slidePath) => this.parseNativeAnimations(slideXml3, slidePath),
130094
130336
  getSmartArtDataForGraphicFrame: (slidePath, graphicFrame) => this.getSmartArtDataForGraphicFrame(slidePath, graphicFrame),
130095
130337
  getChartDataForGraphicFrame: (slidePath, graphicFrame) => this.getChartDataForGraphicFrame(slidePath, graphicFrame),
130338
+ rememberChartDataBaseline: (chartData) => this.rememberChartDataBaseline(chartData),
130096
130339
  parseSlideCustomerData: (slideXml3, slidePath) => this.parseSlideCustomerData(slideXml3, slidePath),
130097
130340
  parseSlideActiveXControls: (slideXml3) => this.parseSlideActiveXControls(slideXml3)
130098
130341
  });
@@ -130273,6 +130516,7 @@ var init_PptxHandlerRuntimeLoadPipeline = __esm({
130273
130516
  this.imageDataCache.clear();
130274
130517
  this.slideMap.clear();
130275
130518
  this.savedSlideFingerprints.clear();
130519
+ this.chartDataBaselines.clear();
130276
130520
  this.slideRelsMap.clear();
130277
130521
  this.externalRelsMap.clear();
130278
130522
  this.layoutCache.clear();
@@ -148953,7 +149197,7 @@ var init_fill_style = __esm2({
148953
149197
  }
148954
149198
  });
148955
149199
  function isTextOrientationMatrix2(value) {
148956
- return Array.isArray(value) && value.length === 4 && value.every((entry2) => typeof entry2 === "number" && Number.isFinite(entry2));
149200
+ return Array.isArray(value) && value.length === 4 && value.every((entry3) => typeof entry3 === "number" && Number.isFinite(entry3));
148957
149201
  }
148958
149202
  function multiplyTextOrientationMatrices2(left, right) {
148959
149203
  return [
@@ -149681,11 +149925,11 @@ var init_chart_font = __esm2({
149681
149925
  DEFAULT_CHART_DATA_LABEL_PX = chartFontPx(9);
149682
149926
  }
149683
149927
  });
149684
- function sizePx(entry2, fallbackPx) {
149685
- return entry2?.fontSize !== void 0 ? chartFontPx(entry2.fontSize) : fallbackPx;
149928
+ function sizePx(entry3, fallbackPx) {
149929
+ return entry3?.fontSize !== void 0 ? chartFontPx(entry3.fontSize) : fallbackPx;
149686
149930
  }
149687
- function colorOr(entry2, fallback) {
149688
- return entry2?.color ?? fallback;
149931
+ function colorOr(entry3, fallback) {
149932
+ return entry3?.color ?? fallback;
149689
149933
  }
149690
149934
  function resolveChartStyleDefaults(chartData) {
149691
149935
  const def = chartData?.chartStyleDefinition;
@@ -150418,19 +150662,19 @@ var init_chart_bar3d_face_picture = __esm2({
150418
150662
  });
150419
150663
  function computeChartLegendLayout(vm) {
150420
150664
  const vertical = vm.legendAnchor === "start";
150421
- return vm.legend.map((entry2, i2) => {
150422
- const x = vertical ? vm.legendX : vm.legendX - vm.legend.length * LEGEND_ITEM_WIDTH / 2 + i2 * LEGEND_ITEM_WIDTH, y = vertical ? vm.legendY + i2 * LEGEND_ITEM_HEIGHT : vm.legendY, textStyle = entry2.textStyle;
150665
+ return vm.legend.map((entry3, i2) => {
150666
+ const x = vertical ? vm.legendX : vm.legendX - vm.legend.length * LEGEND_ITEM_WIDTH / 2 + i2 * LEGEND_ITEM_WIDTH, y = vertical ? vm.legendY + i2 * LEGEND_ITEM_HEIGHT : vm.legendY, textStyle = entry3.textStyle;
150423
150667
  return {
150424
150668
  x,
150425
150669
  y,
150426
- color: entry2.color,
150427
- label: entry2.label,
150670
+ color: entry3.color,
150671
+ label: entry3.label,
150428
150672
  fontSize: textStyle?.fontSize !== void 0 ? chartFontPx(textStyle.fontSize) : DEFAULT_LEGEND_FONT_SIZE,
150429
150673
  fill: textStyle?.color ?? DEFAULT_LEGEND_TEXT_COLOR,
150430
150674
  fontWeight: textStyle?.bold ? "bold" : "normal",
150431
150675
  fontStyle: textStyle?.italic ? "italic" : "normal",
150432
150676
  fontFamily: textStyle?.fontFamily,
150433
- ...entry2.lineSwatch ? { lineSwatch: entry2.lineSwatch } : {}
150677
+ ...entry3.lineSwatch ? { lineSwatch: entry3.lineSwatch } : {}
150434
150678
  };
150435
150679
  });
150436
150680
  }
@@ -151451,7 +151695,7 @@ function buildDataLabelText(params) {
151451
151695
  valueColor = formatted?.color;
151452
151696
  }
151453
151697
  if (content.showPercent) {
151454
- const base = percentBase ?? series.values.reduce((total, entry2) => total + Math.abs(entry2), 0);
151698
+ const base = percentBase ?? series.values.reduce((total, entry3) => total + Math.abs(entry3), 0);
151455
151699
  parts.push(base > 0 ? `${Math.round(Math.abs(value) / base * 100)}%` : "0%");
151456
151700
  }
151457
151701
  if (content.showBubbleSize) {
@@ -152217,9 +152461,9 @@ function categoryTotals(series, catCount) {
152217
152461
  );
152218
152462
  }
152219
152463
  function buildPercentStackedBars(chartData, catCount, layout, primaryRange, sourceIndices2, invertNegativeFill2) {
152220
- const primitives = [], dataLabels = [], series = chartData.series, palette = chartData.colorPalette, showLabels = chartData.style?.hasDataLabels, barGroupWidth = layout.plotWidth / Math.max(catCount, 1), barW = barGroupWidth * 0.6, barOffset = (barGroupWidth - barW) / 2, displaySeries = series.map((entry2) => ({
152221
- ...entry2,
152222
- values: sourceIndices2.map((sourceIndex) => entry2.values[sourceIndex] ?? 0)
152464
+ const primitives = [], dataLabels = [], series = chartData.series, palette = chartData.colorPalette, showLabels = chartData.style?.hasDataLabels, barGroupWidth = layout.plotWidth / Math.max(catCount, 1), barW = barGroupWidth * 0.6, barOffset = (barGroupWidth - barW) / 2, displaySeries = series.map((entry3) => ({
152465
+ ...entry3,
152466
+ values: sourceIndices2.map((sourceIndex) => entry3.values[sourceIndex] ?? 0)
152223
152467
  })), totals = categoryTotals(displaySeries, catCount);
152224
152468
  for (let ci = 0; ci < catCount; ci++) {
152225
152469
  let posRunning = 0, negRunning = 0;
@@ -152392,9 +152636,9 @@ function buildBars(chartData, catCount, layout, primaryRange, secondaryRange, se
152392
152636
  return { primitives, dataLabels };
152393
152637
  }
152394
152638
  if (grouping === "stacked") {
152395
- const displaySeries = series.map((entry2) => ({
152396
- ...entry2,
152397
- values: sourceIndices2.map((sourceIndex) => entry2.values[sourceIndex] ?? 0)
152639
+ const displaySeries = series.map((entry3) => ({
152640
+ ...entry3,
152641
+ values: sourceIndices2.map((sourceIndex) => entry3.values[sourceIndex] ?? 0)
152398
152642
  })), rects = computeStackedBarRects(displaySeries, catCount, layout, primaryRange, palette);
152399
152643
  for (const r of rects) {
152400
152644
  let fill = r.fill, part, title;
@@ -152592,16 +152836,16 @@ function buildLines(chartData, catCount, layout, primaryRange, secondaryRange, s
152592
152836
  );
152593
152837
  return { displayValues, visible };
152594
152838
  }), stackedPlots = isStackedMode ? computeStackedSeriesPlots(
152595
- resolved.map((entry2) => entry2?.displayValues ?? []),
152839
+ resolved.map((entry3) => entry3?.displayValues ?? []),
152596
152840
  catCount,
152597
152841
  isPercent
152598
152842
  ) : void 0;
152599
152843
  for (let si = 0; si < chartData.series.length; si++) {
152600
- const series = chartData.series[si], entry2 = resolved[si];
152601
- if (!entry2) {
152844
+ const series = chartData.series[si], entry3 = resolved[si];
152845
+ if (!entry3) {
152602
152846
  continue;
152603
152847
  }
152604
- const { displayValues, visible } = entry2, activeRange = isStackedMode ? primaryRange : secondaryIdx.has(si) && secondaryRange ? secondaryRange : primaryRange, plotValues = stackedPlots ? stackedPlots[si].cumulative : displayValues, pts = computeLinePoints(plotValues, catCount, layout, activeRange).map((point, index) => ({
152848
+ const { displayValues, visible } = entry3, activeRange = isStackedMode ? primaryRange : secondaryIdx.has(si) && secondaryRange ? secondaryRange : primaryRange, plotValues = stackedPlots ? stackedPlots[si].cumulative : displayValues, pts = computeLinePoints(plotValues, catCount, layout, activeRange).map((point, index) => ({
152605
152849
  ...point,
152606
152850
  x: xPositions?.[index] ?? point.x
152607
152851
  })), c = seriesColor22(series, si, chartData.colorPalette), seriesPart = { role: "series", seriesIndex: si }, allVisible = visible.every(Boolean);
@@ -154608,7 +154852,7 @@ function computeStockCandlePrimitives(seriesSet, chartData, layout, range, catCo
154608
154852
  return primitives;
154609
154853
  }
154610
154854
  function findComboStockSeries(series) {
154611
- return series.map((s, index) => ({ series: s, index })).filter((entry2) => entry2.series.seriesChartType === "stock");
154855
+ return series.map((s, index) => ({ series: s, index })).filter((entry3) => entry3.series.seriesChartType === "stock");
154612
154856
  }
154613
154857
  function computeComboStockOverlay(stockEntries, chartData, layout, range, catCount, sourceIndices2, xPositions) {
154614
154858
  if (stockEntries.length < 3) {
@@ -154688,8 +154932,8 @@ function groupComboSeriesIndices(series) {
154688
154932
  const barIndices = [];
154689
154933
  const lineIndices = [];
154690
154934
  const areaIndices = [];
154691
- series.forEach((entry2, index) => {
154692
- const kind = classifyComboSeries(entry2, index);
154935
+ series.forEach((entry3, index) => {
154936
+ const kind = classifyComboSeries(entry3, index);
154693
154937
  const target = kind === "bar" ? barIndices : kind === "area" ? areaIndices : lineIndices;
154694
154938
  target.push(index);
154695
154939
  });
@@ -154914,14 +155158,14 @@ function buildComboViewModel(element, chartData, categoryLabels) {
154914
155158
  );
154915
155159
  const catCount = Math.max(categoryLabels.length, 1);
154916
155160
  const { primary, secondary } = splitSeriesByAxis(chartData.series, chartData.axes);
154917
- const secondaryIndexes = new Set(secondary.map((entry2) => entry2.index));
154918
- const primarySeries = primary.length > 0 ? primary.map((entry2) => entry2.series) : chartData.series;
155161
+ const secondaryIndexes = new Set(secondary.map((entry3) => entry3.index));
155162
+ const primarySeries = primary.length > 0 ? primary.map((entry3) => entry3.series) : chartData.series;
154919
155163
  const primaryAxisId = getPrimaryValueAxisId(chartData.axes);
154920
155164
  const primaryAxis = chartData.axes?.find((axis) => axis.axisId === primaryAxisId);
154921
155165
  const secondaryAxisFormatting = getSecondaryValueAxis(chartData.axes);
154922
155166
  const primaryRange = computeValueRangeForAxis(primarySeries, primaryAxis, layout.autoPlotHeight);
154923
155167
  const secondaryRange = secondary.length > 0 ? computeValueRangeForAxis(
154924
- secondary.map((entry2) => entry2.series),
155168
+ secondary.map((entry3) => entry3.series),
154925
155169
  secondaryAxisFormatting,
154926
155170
  layout.autoPlotHeight
154927
155171
  ) : void 0;
@@ -154983,7 +155227,7 @@ function buildComboViewModel(element, chartData, categoryLabels) {
154983
155227
  const dataLabels = [];
154984
155228
  const stockEntries = findComboStockSeries(chartData.series);
154985
155229
  const isStockCombo = stockEntries.length >= 3;
154986
- const stockIndexes = new Set(stockEntries.map((entry2) => entry2.index));
155230
+ const stockIndexes = new Set(stockEntries.map((entry3) => entry3.index));
154987
155231
  if (!isStockCombo) {
154988
155232
  const helperOpts = { mode: "line", xPositions: horizontalAxis.xPositions };
154989
155233
  primitives.push(
@@ -155676,10 +155920,10 @@ function buildHistogramViewModel(element, chartData, categoryLabels) {
155676
155920
  const baseEntries = (bins?.map((bin) => ({ value: bin.value, label: bin.label })) ?? (series?.values ?? []).map((value, index) => ({
155677
155921
  value,
155678
155922
  label: categoryLabels[index] ?? ""
155679
- }))).map((entry2, sourcePointIndex) => ({ ...entry2, sourcePointIndex }));
155923
+ }))).map((entry3, sourcePointIndex) => ({ ...entry3, sourcePointIndex }));
155680
155924
  const entries = paretoIndex >= 0 ? orderParetoEntries(baseEntries) : baseEntries;
155681
- const values = entries.map((entry2) => entry2.value);
155682
- const labels = entries.map((entry2) => entry2.label);
155925
+ const values = entries.map((entry3) => entry3.value);
155926
+ const labels = entries.map((entry3) => entry3.label);
155683
155927
  const range = distributionRange([{ name: series?.name ?? "", values }]);
155684
155928
  const bars = computeHistogramBars(
155685
155929
  values,
@@ -156030,7 +156274,7 @@ function applyLegendEntryOverrides(legend, entries, defaultTextStyle) {
156030
156274
  if ((!entries || entries.length === 0) && !defaultTextStyle) {
156031
156275
  return legend;
156032
156276
  }
156033
- const byIndex = new Map((entries ?? []).map((entry2) => [entry2.index, entry2]));
156277
+ const byIndex = new Map((entries ?? []).map((entry3) => [entry3.index, entry3]));
156034
156278
  const result = [];
156035
156279
  legend.forEach((item, index) => {
156036
156280
  const override = byIndex.get(index);
@@ -157376,7 +157620,7 @@ function buildPieViewModel(element, chartData, categoryLabels, isDoughnut) {
157376
157620
  })
157377
157621
  ), dataLabels = [];
157378
157622
  if (chartData.style?.hasDataLabels) {
157379
- const percentBase = values.reduce((total, entry2) => total + Math.abs(entry2), 0), labelResult = buildPieDataLabels({
157623
+ const percentBase = values.reduce((total, entry3) => total + Math.abs(entry3), 0), labelResult = buildPieDataLabels({
157380
157624
  slices,
157381
157625
  values,
157382
157626
  cx,
@@ -158264,7 +158508,7 @@ function buildRegionMapViewModel(element, chartData, categoryLabels) {
158264
158508
  options,
158265
158509
  resolveRegionCode
158266
158510
  );
158267
- const values = entries.map((entry2) => entry2.value);
158511
+ const values = entries.map((entry3) => entry3.value);
158268
158512
  const finiteVals = values.filter((v) => Number.isFinite(v));
158269
158513
  const minVal = finiteVals.length > 0 ? Math.min(...finiteVals) : 0;
158270
158514
  const maxVal = finiteVals.length > 0 ? Math.max(...finiteVals) : 1;
@@ -158277,15 +158521,15 @@ function buildRegionMapViewModel(element, chartData, categoryLabels) {
158277
158521
  const colorScale = valueColorStops ? buildValueColorScale(valueColorStops) : sequentialColorScale;
158278
158522
  const regionValueMap = /* @__PURE__ */ new Map();
158279
158523
  const unmatchedRows = [];
158280
- for (const entry2 of entries) {
158281
- if (entry2.code !== void 0) {
158282
- regionValueMap.set(entry2.code, {
158283
- value: entry2.value,
158284
- label: entry2.label,
158285
- sourceIndex: entry2.sourceIndex
158524
+ for (const entry3 of entries) {
158525
+ if (entry3.code !== void 0) {
158526
+ regionValueMap.set(entry3.code, {
158527
+ value: entry3.value,
158528
+ label: entry3.label,
158529
+ sourceIndex: entry3.sourceIndex
158286
158530
  });
158287
158531
  } else {
158288
- unmatchedRows.push({ label: entry2.label, value: entry2.value });
158532
+ unmatchedRows.push({ label: entry3.label, value: entry3.value });
158289
158533
  }
158290
158534
  }
158291
158535
  const legendHeight = 30;
@@ -158320,10 +158564,10 @@ function buildRegionMapViewModel(element, chartData, categoryLabels) {
158320
158564
  dominantBaseline: "auto"
158321
158565
  } : void 0;
158322
158566
  for (const region of WORLD_REGIONS) {
158323
- const entry2 = regionValueMap.get(region.code);
158567
+ const entry3 = regionValueMap.get(region.code);
158324
158568
  let fill = "#e2e8f0";
158325
- if (entry2 !== void 0) {
158326
- const t = normalizeValue(entry2.value, minVal, maxVal);
158569
+ if (entry3 !== void 0) {
158570
+ const t = normalizeValue(entry3.value, minVal, maxVal);
158327
158571
  fill = colorScale(t);
158328
158572
  }
158329
158573
  const scaledPath = scalePathD(region.path, mapScale, mapOffsetX, mapOffsetY);
@@ -158336,17 +158580,17 @@ function buildRegionMapViewModel(element, chartData, categoryLabels) {
158336
158580
  // Hover tooltip. A choropleth prints only the value inside the shape
158337
158581
  // (and only where the shape is big enough), so without this the reader
158338
158582
  // has no way to find out WHICH country a patch of colour is.
158339
- title: entry2 ? `${region.name}: ${formatAxisValue2(entry2.value)}` : region.name,
158340
- ...entry2 ? {
158583
+ title: entry3 ? `${region.name}: ${formatAxisValue2(entry3.value)}` : region.name,
158584
+ ...entry3 ? {
158341
158585
  part: {
158342
158586
  role: "dataPoint",
158343
158587
  seriesIndex: 0,
158344
- pointIndex: entry2.sourceIndex
158588
+ pointIndex: entry3.sourceIndex
158345
158589
  }
158346
158590
  } : {}
158347
158591
  });
158348
158592
  const bounds = regionBounds(region);
158349
- if (entry2 !== void 0 && shouldRenderRegionLabel(
158593
+ if (entry3 !== void 0 && shouldRenderRegionLabel(
158350
158594
  options?.regionLabelLayout,
158351
158595
  (bounds.maxX - bounds.minX) * mapScale,
158352
158596
  (bounds.maxY - bounds.minY) * mapScale
@@ -158357,7 +158601,7 @@ function buildRegionMapViewModel(element, chartData, categoryLabels) {
158357
158601
  kind: "text",
158358
158602
  x: lx,
158359
158603
  y: ly,
158360
- text: formatRegionMapValue(entry2.value, options?.cultureLanguage),
158604
+ text: formatRegionMapValue(entry3.value, options?.cultureLanguage),
158361
158605
  fontSize: Math.max(6, 7 * mapScale),
158362
158606
  fill: "#1e293b",
158363
158607
  textAnchor: "middle",
@@ -159104,18 +159348,18 @@ function orderParetoEntries(entries) {
159104
159348
  );
159105
159349
  }
159106
159350
  function buildParetoPrimitives(entries, layout, series, seriesIndex) {
159107
- const total = entries.reduce((sum, entry2) => sum + Math.max(entry2.value, 0), 0);
159351
+ const total = entries.reduce((sum, entry3) => sum + Math.max(entry3.value, 0), 0);
159108
159352
  if (total <= 0) {
159109
159353
  return [];
159110
159354
  }
159111
159355
  let cumulative = 0;
159112
- const points4 = entries.map((entry2, displayIndex) => {
159113
- cumulative += Math.max(entry2.value, 0);
159356
+ const points4 = entries.map((entry3, displayIndex) => {
159357
+ cumulative += Math.max(entry3.value, 0);
159114
159358
  const percentage2 = displayIndex === entries.length - 1 ? 100 : cumulative / total * 100;
159115
159359
  return {
159116
159360
  x: layout.plotLeft + layout.plotWidth * (displayIndex + 0.5) / entries.length,
159117
159361
  y: layout.plotBottom - layout.plotHeight * percentage2 / 100,
159118
- pointIndex: entry2.sourcePointIndex
159362
+ pointIndex: entry3.sourcePointIndex
159119
159363
  };
159120
159364
  });
159121
159365
  const color2 = series.color ?? "#ED7D31";
@@ -163753,7 +163997,7 @@ var THEME_CATALOG = [
163753
163997
  }
163754
163998
  ];
163755
163999
  function resolveThemeCatalogEntry(key2, catalog = THEME_CATALOG) {
163756
- return catalog.find((entry2) => entry2.key === key2)?.theme;
164000
+ return catalog.find((entry3) => entry3.key === key2)?.theme;
163757
164001
  }
163758
164002
  function corePreset(id) {
163759
164003
  const preset = exports.THEME_PRESETS.find((p) => p.id === id);
@@ -164131,9 +164375,9 @@ function collectTableStyleImagePaths(tableStyleMap) {
164131
164375
  if (!tableStyleMap) {
164132
164376
  return { paths, refs };
164133
164377
  }
164134
- for (const [styleId, entry2] of Object.entries(tableStyleMap)) {
164378
+ for (const [styleId, entry3] of Object.entries(tableStyleMap)) {
164135
164379
  for (const fillKey of TABLE_STYLE_FILL_KEYS) {
164136
- const fill = entry2[fillKey];
164380
+ const fill = entry3[fillKey];
164137
164381
  const path = fill?.image?.path;
164138
164382
  if (path && !fill?.image?.data && !isExternalUrl2(path)) {
164139
164383
  paths.add(path);
@@ -164159,11 +164403,11 @@ function applyTableStyleImagePatches(tableStyleMap, resolvedMap, refs) {
164159
164403
  }
164160
164404
  const next = { ...tableStyleMap };
164161
164405
  for (const [styleId, patches] of patchesByStyleId) {
164162
- const entry2 = next[styleId];
164163
- if (!entry2) {
164406
+ const entry3 = next[styleId];
164407
+ if (!entry3) {
164164
164408
  continue;
164165
164409
  }
164166
- const patchedEntry = { ...entry2 };
164410
+ const patchedEntry = { ...entry3 };
164167
164411
  for (const { fillKey, url } of patches) {
164168
164412
  const fill = patchedEntry[fillKey];
164169
164413
  if (!fill?.image) {
@@ -171622,7 +171866,7 @@ function ensureArr(val2) {
171622
171866
  return [];
171623
171867
  }
171624
171868
  if (Array.isArray(val2)) {
171625
- return val2.filter((entry2) => Boolean(entry2) && typeof entry2 === "object");
171869
+ return val2.filter((entry3) => Boolean(entry3) && typeof entry3 === "object");
171626
171870
  }
171627
171871
  if (typeof val2 === "object") {
171628
171872
  return [val2];
@@ -171668,7 +171912,7 @@ function readRunText2(run) {
171668
171912
  return String(t);
171669
171913
  }
171670
171914
  if (Array.isArray(t)) {
171671
- return t.map((entry2) => readRunText2({ "m:t": entry2 })).join("");
171915
+ return t.map((entry3) => readRunText2({ "m:t": entry3 })).join("");
171672
171916
  }
171673
171917
  if (t && typeof t === "object") {
171674
171918
  const inner = t["#text"];
@@ -171741,7 +171985,7 @@ function collectText2(node) {
171741
171985
  return String(node);
171742
171986
  }
171743
171987
  if (Array.isArray(node)) {
171744
- return node.map((entry2) => collectText2(entry2)).join("");
171988
+ return node.map((entry3) => collectText2(entry3)).join("");
171745
171989
  }
171746
171990
  if (typeof node !== "object") {
171747
171991
  return "";
@@ -172401,7 +172645,7 @@ function buildParetoInsertData() {
172401
172645
  },
172402
172646
  {
172403
172647
  name: "Cumulative %",
172404
- values: cumulativePercentOfTotal(ordered4.map((entry2) => entry2.value)),
172648
+ values: cumulativePercentOfTotal(ordered4.map((entry3) => entry3.value)),
172405
172649
  histogramOptions: { layout: "pareto" }
172406
172650
  }
172407
172651
  ]
@@ -172848,8 +173092,8 @@ var BUTTON_ORDER = [
172848
173092
  ];
172849
173093
  function buildButtons(selectionBox, showFilters) {
172850
173094
  const x = selectionBox.x + selectionBox.width + OUTSIDE_GAP;
172851
- return BUTTON_ORDER.filter((entry2) => entry2.id !== "filters" || showFilters).map((entry2, i2) => ({
172852
- ...entry2,
173095
+ return BUTTON_ORDER.filter((entry3) => entry3.id !== "filters" || showFilters).map((entry3, i2) => ({
173096
+ ...entry3,
172853
173097
  x,
172854
173098
  y: selectionBox.y + i2 * (CHART_QUICK_ACTION_BUTTON_SIZE + BUTTON_GAP),
172855
173099
  size: CHART_QUICK_ACTION_BUTTON_SIZE
@@ -172896,12 +173140,12 @@ function buildFilters(chartData) {
172896
173140
  seriesIndex: index,
172897
173141
  sortKey: series2.idx ?? index
172898
173142
  }));
172899
- const filtered = (chartData.filteredSeries ?? []).map((entry2, index) => ({
173143
+ const filtered = (chartData.filteredSeries ?? []).map((entry3, index) => ({
172900
173144
  key: `filtered-${index}`,
172901
- name: entry2.name ?? chartData.filteredSeriesTitle ?? `Series ${index + 1}`,
173145
+ name: entry3.name ?? chartData.filteredSeriesTitle ?? `Series ${index + 1}`,
172902
173146
  visible: false,
172903
173147
  filteredIndex: index,
172904
- sortKey: entry2.idx
173148
+ sortKey: entry3.idx
172905
173149
  }));
172906
173150
  const series = [...visibleSeries, ...filtered].sort((a, b) => a.sortKey - b.sortKey).map(({ sortKey: _sortKey, ...rest }) => rest);
172907
173151
  return { visible: series.length > 1, series };
@@ -173340,6 +173584,56 @@ init_chart_region_map_data();
173340
173584
  init_chart_overlays();
173341
173585
  init_chart_data_table_render();
173342
173586
  init_chart_legend_entries();
173587
+ var SOLID = "linear-gradient(#000, #000)";
173588
+ var HOLE_IMAGE = {
173589
+ box: SOLID,
173590
+ // `mask-size: 100% 100%` on this gradient draws an ellipse inscribed
173591
+ // touching all four edge midpoints, matching the COM capture exactly.
173592
+ circle: "radial-gradient(circle, #000 0%, #000 100%)",
173593
+ // This polygon's points already touch the edge midpoints at 100% size
173594
+ // (no headroom needed, unlike `diamondOut`'s growing-past-corners variant).
173595
+ diamond: `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Cpolygon points='50,0 100,50 50,100 0,50' fill='%23000'/%3E%3C/svg%3E")`
173596
+ };
173597
+ function maskHoleDecl(shape, phase) {
173598
+ const holeSize = phase === "hidden" ? "100% 100%" : "0% 0%";
173599
+ return [
173600
+ `mask-image: ${HOLE_IMAGE[shape]}, ${SOLID};`,
173601
+ "mask-position: center, center;",
173602
+ "mask-repeat: no-repeat, no-repeat;",
173603
+ `mask-size: ${holeSize}, 100% 100%;`,
173604
+ "mask-composite: add, exclude;"
173605
+ ].join(" ");
173606
+ }
173607
+ function maskHoleInitialStyle(shape) {
173608
+ return {
173609
+ maskImage: `${HOLE_IMAGE[shape]}, ${SOLID}`,
173610
+ maskPosition: "center, center",
173611
+ maskRepeat: "no-repeat, no-repeat",
173612
+ maskSize: "100% 100%, 100% 100%",
173613
+ maskComposite: "add, exclude",
173614
+ opacity: 1
173615
+ };
173616
+ }
173617
+ function maskPlusHoleDecl(phase) {
173618
+ const barSize = phase === "hidden" ? "100%" : "0%";
173619
+ return [
173620
+ `mask-image: ${SOLID}, ${SOLID}, ${SOLID};`,
173621
+ "mask-position: center, center, center;",
173622
+ "mask-repeat: no-repeat, no-repeat, no-repeat;",
173623
+ `mask-size: 100% ${barSize}, ${barSize} 100%, 100% 100%;`,
173624
+ "mask-composite: add, add, exclude;"
173625
+ ].join(" ");
173626
+ }
173627
+ function maskPlusHoleInitialStyle() {
173628
+ return {
173629
+ maskImage: `${SOLID}, ${SOLID}, ${SOLID}`,
173630
+ maskPosition: "center, center, center",
173631
+ maskRepeat: "no-repeat, no-repeat, no-repeat",
173632
+ maskSize: "100% 100%, 100% 100%, 100% 100%",
173633
+ maskComposite: "add, add, exclude",
173634
+ opacity: 1
173635
+ };
173636
+ }
173343
173637
  var HARD_STOP = "#000 50%, transparent 50%";
173344
173638
  var EDGE_CONFIG = {
173345
173639
  left: {
@@ -173371,38 +173665,38 @@ var EDGE_CONFIG = {
173371
173665
  shownPos: "0% 100%"
173372
173666
  }
173373
173667
  };
173374
- var SOLID = "linear-gradient(#000, #000)";
173668
+ var SOLID2 = "linear-gradient(#000, #000)";
173375
173669
  var SHAPE_CONFIG = {
173376
173670
  splitHorizontalIn: {
173377
- image: `${SOLID}, ${SOLID}`,
173671
+ image: `${SOLID2}, ${SOLID2}`,
173378
173672
  position: "left top, left bottom",
173379
173673
  repeat: "no-repeat, no-repeat",
173380
173674
  hiddenSize: "100% 0%, 100% 0%",
173381
173675
  shownSize: "100% 50.5%, 100% 50.5%"
173382
173676
  },
173383
173677
  splitHorizontalOut: {
173384
- image: SOLID,
173678
+ image: SOLID2,
173385
173679
  position: "center",
173386
173680
  repeat: "no-repeat",
173387
173681
  hiddenSize: "100% 0%",
173388
173682
  shownSize: "100% 101%"
173389
173683
  },
173390
173684
  splitVerticalIn: {
173391
- image: `${SOLID}, ${SOLID}`,
173685
+ image: `${SOLID2}, ${SOLID2}`,
173392
173686
  position: "left top, right top",
173393
173687
  repeat: "no-repeat, no-repeat",
173394
173688
  hiddenSize: "0% 100%, 0% 100%",
173395
173689
  shownSize: "50.5% 100%, 50.5% 100%"
173396
173690
  },
173397
173691
  splitVerticalOut: {
173398
- image: SOLID,
173692
+ image: SOLID2,
173399
173693
  position: "center",
173400
173694
  repeat: "no-repeat",
173401
173695
  hiddenSize: "0% 100%",
173402
173696
  shownSize: "101% 100%"
173403
173697
  },
173404
173698
  boxOut: {
173405
- image: SOLID,
173699
+ image: SOLID2,
173406
173700
  position: "center",
173407
173701
  repeat: "no-repeat",
173408
173702
  hiddenSize: "0% 0%",
@@ -173430,7 +173724,7 @@ var SHAPE_CONFIG = {
173430
173724
  // Two independent solid bars (mask layers composite by union): a
173431
173725
  // full-width horizontal bar and a full-height vertical bar, both
173432
173726
  // growing from a point at centre, so together they trace a cross.
173433
- image: `${SOLID}, ${SOLID}`,
173727
+ image: `${SOLID2}, ${SOLID2}`,
173434
173728
  position: "center, center",
173435
173729
  repeat: "no-repeat, no-repeat",
173436
173730
  hiddenSize: "100% 0%, 0% 100%",
@@ -173573,8 +173867,8 @@ var KEYFRAME_PREFIX = "pptx-vue";
173573
173867
  to { ${maskEdgeDecl("top", "shown")} opacity: 1; }
173574
173868
  }
173575
173869
  @keyframes ${KEYFRAME_PREFIX}-boxIn {
173576
- from { ${maskShapeDecl("boxOut", "hidden")} opacity: 1; }
173577
- to { ${maskShapeDecl("boxOut", "shown")} opacity: 1; }
173870
+ from { ${maskHoleDecl("box", "hidden")} opacity: 1; }
173871
+ to { ${maskHoleDecl("box", "shown")} opacity: 1; }
173578
173872
  }
173579
173873
  @keyframes ${KEYFRAME_PREFIX}-floatIn {
173580
173874
  from { opacity: 0; transform: translateY(40px); }
@@ -173755,6 +174049,15 @@ var EMPHASIS_PRESET_VALUES = [
173755
174049
  "wave",
173756
174050
  "boldFlash"
173757
174051
  ];
174052
+ var TRIGGER_VALUES = [
174053
+ "onClick",
174054
+ "onShapeClick",
174055
+ "onHover",
174056
+ "afterPrevious",
174057
+ "withPrevious",
174058
+ "afterDelay"
174059
+ ];
174060
+ var TRIGGER_OPTIONS = TRIGGER_VALUES.map((value) => ({ value, labelKey: `pptx.animation.trigger.${value}` }));
173758
174061
  var DIRECTIONAL_PRESETS = /* @__PURE__ */ new Set([
173759
174062
  "flyIn",
173760
174063
  "flyOut",
@@ -173871,9 +174174,9 @@ var EFFECT_SOUND_CATALOGUE = [
173871
174174
  { id: "whoosh", i18nKey: "pptx.animation.sound.whoosh", canonicalName: "WHOOSH.WAV" },
173872
174175
  { id: "wind", i18nKey: "pptx.animation.sound.wind", canonicalName: "WIND.WAV" }
173873
174176
  ];
173874
- var BY_ID = new Map(EFFECT_SOUND_CATALOGUE.map((entry2) => [entry2.id, entry2]));
174177
+ var BY_ID = new Map(EFFECT_SOUND_CATALOGUE.map((entry3) => [entry3.id, entry3]));
173875
174178
  var BY_CANONICAL_NAME = new Map(
173876
- EFFECT_SOUND_CATALOGUE.map((entry2) => [entry2.canonicalName.toUpperCase(), entry2])
174179
+ EFFECT_SOUND_CATALOGUE.map((entry3) => [entry3.canonicalName.toUpperCase(), entry3])
173877
174180
  );
173878
174181
  function effectSoundCatalogueEntry(id) {
173879
174182
  return BY_ID.get(id);
@@ -174106,15 +174409,15 @@ function getEffectSoundAsset(id) {
174106
174409
  if (cached) {
174107
174410
  return cached;
174108
174411
  }
174109
- const entry2 = effectSoundCatalogueEntry(id);
174412
+ const entry3 = effectSoundCatalogueEntry(id);
174110
174413
  const generator = EFFECT_SOUND_GENERATORS[id];
174111
- if (!entry2 || !generator) {
174414
+ if (!entry3 || !generator) {
174112
174415
  return void 0;
174113
174416
  }
174114
174417
  const bytes = encodeWav(normalize(generator()));
174115
174418
  const asset = {
174116
174419
  id,
174117
- fileName: entry2.canonicalName,
174420
+ fileName: entry3.canonicalName,
174118
174421
  bytes,
174119
174422
  dataUrl: wavDataUrl(bytes)
174120
174423
  };
@@ -174122,16 +174425,16 @@ function getEffectSoundAsset(id) {
174122
174425
  return asset;
174123
174426
  }
174124
174427
  function getEffectSoundState(slideAnimations, elementId) {
174125
- const entry2 = animationFor(slideAnimations, elementId);
174126
- if (!entry2) {
174428
+ const entry3 = animationFor(slideAnimations, elementId);
174429
+ if (!entry3) {
174127
174430
  return { hasSound: false };
174128
174431
  }
174129
- const hasSound = Boolean(entry2.soundData || entry2.soundRId);
174432
+ const hasSound = Boolean(entry3.soundData || entry3.soundRId);
174130
174433
  if (!hasSound) {
174131
174434
  return { hasSound: false };
174132
174435
  }
174133
- const fileName = entry2.soundFileName ?? lastPathSegment(entry2.soundPath);
174134
- const catalogueId = findEffectSoundCatalogueEntry(entry2.soundName)?.id;
174436
+ const fileName = entry3.soundFileName ?? lastPathSegment(entry3.soundPath);
174437
+ const catalogueId = findEffectSoundCatalogueEntry(entry3.soundName)?.id;
174135
174438
  return catalogueId !== void 0 ? { hasSound: true, fileName, catalogueId } : { hasSound: true, fileName };
174136
174439
  }
174137
174440
  function setEffectStockSound(anims, elementId, catalogueId) {
@@ -174174,8 +174477,8 @@ function setAfterAnimation(anims, elementId, action) {
174174
174477
  });
174175
174478
  }
174176
174479
  function setAfterAnimationColor(anims, elementId, color2) {
174177
- const entry2 = animationFor(anims, elementId);
174178
- if (!entry2 || entry2.afterAnimation !== "dimToColor") {
174480
+ const entry3 = animationFor(anims, elementId);
174481
+ if (!entry3 || entry3.afterAnimation !== "dimToColor") {
174179
174482
  return [...anims];
174180
174483
  }
174181
174484
  return upsert(anims, elementId, (cur) => ({ ...cur, afterAnimationColor: color2 }));
@@ -174833,8 +175136,8 @@ function applyDecodedValue(descriptor, attrName, value) {
174833
175136
  descriptor.color = value;
174834
175137
  }
174835
175138
  }
174836
- function applySetAnimation(descriptor, entry2) {
174837
- applyDecodedValue(descriptor, entry2.attrName, entry2.value);
175139
+ function applySetAnimation(descriptor, entry3) {
175140
+ applyDecodedValue(descriptor, entry3.attrName, entry3.value);
174838
175141
  }
174839
175142
  function applyAttributeRamp(descriptor, component2) {
174840
175143
  const stops = component2.keyframes;
@@ -174859,8 +175162,8 @@ function applyAttributeRamp(descriptor, component2) {
174859
175162
  }
174860
175163
  function resolveTextStyleAnimation(anim) {
174861
175164
  const descriptor = {};
174862
- for (const entry2 of anim.setAnimations ?? []) {
174863
- applySetAnimation(descriptor, entry2);
175165
+ for (const entry3 of anim.setAnimations ?? []) {
175166
+ applySetAnimation(descriptor, entry3);
174864
175167
  }
174865
175168
  for (const component2 of anim.attributeAnimations ?? []) {
174866
175169
  if (RECOGNIZED_ATTRS.has(component2.attrName)) {
@@ -175345,12 +175648,12 @@ var ENTRANCE_KEYFRAME_DEFINITIONS = {
175345
175648
  to { ${blindsDecl("horizontal", 1)} opacity: 1; }
175346
175649
  }`,
175347
175650
  boxIn: `@keyframes pptx-boxIn {
175348
- from { ${maskShapeDecl("boxOut", "hidden")} opacity: 1; }
175349
- to { ${maskShapeDecl("boxOut", "shown")} opacity: 1; }
175651
+ from { ${maskHoleDecl("box", "hidden")} opacity: 1; }
175652
+ to { ${maskHoleDecl("box", "shown")} opacity: 1; }
175350
175653
  }`,
175351
175654
  circleIn: `@keyframes pptx-circleIn {
175352
- from { ${maskShapeDecl("circleOut", "hidden")} opacity: 1; }
175353
- to { ${maskShapeDecl("circleOut", "shown")} opacity: 1; }
175655
+ from { ${maskHoleDecl("circle", "hidden")} opacity: 1; }
175656
+ to { ${maskHoleDecl("circle", "shown")} opacity: 1; }
175354
175657
  }`,
175355
175658
  floatIn: `@keyframes pptx-floatIn {
175356
175659
  from { opacity: 0; transform: translateY(40px); }
@@ -175421,12 +175724,12 @@ var ENTRANCE_KEYFRAME_DEFINITIONS = {
175421
175724
  to { opacity: 1; transform: rotate(0deg) scale(1); }
175422
175725
  }`,
175423
175726
  diamondIn: `@keyframes pptx-diamondIn {
175424
- from { ${maskShapeDecl("diamondOut", "hidden")} opacity: 1; }
175425
- to { ${maskShapeDecl("diamondOut", "shown")} opacity: 1; }
175727
+ from { ${maskHoleDecl("diamond", "hidden")} opacity: 1; }
175728
+ to { ${maskHoleDecl("diamond", "shown")} opacity: 1; }
175426
175729
  }`,
175427
175730
  plusIn: `@keyframes pptx-plusIn {
175428
- from { ${maskShapeDecl("plusOut", "hidden")} opacity: 1; }
175429
- to { ${maskShapeDecl("plusOut", "shown")} opacity: 1; }
175731
+ from { ${maskPlusHoleDecl("hidden")} opacity: 1; }
175732
+ to { ${maskPlusHoleDecl("shown")} opacity: 1; }
175430
175733
  }`,
175431
175734
  wedgeIn: `@keyframes pptx-wedgeIn {
175432
175735
  from { ${maskShapeDecl("wedgeOut", "hidden")} opacity: 1; }
@@ -178605,6 +178908,8 @@ var ENTRANCE_EFFECTS = /* @__PURE__ */ new Set([
178605
178908
  "blindsIn",
178606
178909
  "boxIn",
178607
178910
  "circleIn",
178911
+ "diamondIn",
178912
+ "plusIn",
178608
178913
  "floatIn",
178609
178914
  "riseUp",
178610
178915
  "swivel",
@@ -178674,9 +178979,13 @@ function getInitialStyleForEffect(effect) {
178674
178979
  case "blindsIn":
178675
178980
  return maskEdgeInitialStyle("top");
178676
178981
  case "boxIn":
178677
- return maskShapeInitialStyle("boxOut");
178982
+ return maskHoleInitialStyle("box");
178678
178983
  case "circleIn":
178679
- return maskShapeInitialStyle("circleOut");
178984
+ return maskHoleInitialStyle("circle");
178985
+ case "diamondIn":
178986
+ return maskHoleInitialStyle("diamond");
178987
+ case "plusIn":
178988
+ return maskPlusHoleInitialStyle();
178680
178989
  case "peekIn":
178681
178990
  return maskEdgeInitialStyle("bottom");
178682
178991
  case "randomBarsIn":
@@ -181996,12 +182305,12 @@ function getMeasuredPanelDepthSkew(preset, side) {
181996
182305
  if (!preset) {
181997
182306
  return void 0;
181998
182307
  }
181999
- const entry2 = PANEL_DEPTH_SKEW_MAP[preset];
182000
- if (!entry2) {
182308
+ const entry3 = PANEL_DEPTH_SKEW_MAP[preset];
182309
+ if (!entry3) {
182001
182310
  return void 0;
182002
182311
  }
182003
- const sideSkew = side ? entry2[side] : void 0;
182004
- return sideSkew ?? { dx: entry2.dx, dy: entry2.dy };
182312
+ const sideSkew = side ? entry3[side] : void 0;
182313
+ return sideSkew ?? { dx: entry3.dx, dy: entry3.dy };
182005
182314
  }
182006
182315
  function projectHomographyPoint(h2, u, v, width, height) {
182007
182316
  const [h11, h12, h13, h21, h22, h23, h31, h32, h33] = h2;
@@ -182773,19 +183082,19 @@ function borderToCss(border, resolve2) {
182773
183082
  const color2 = border.color ?? resolve2(border.fill) ?? "#000000";
182774
183083
  return `${width}px ${dash} ${color2}`;
182775
183084
  }
182776
- function collectSections(entry2, tableData, pos2) {
183085
+ function collectSections(entry3, tableData, pos2) {
182777
183086
  const { rowIndex, cellIndex, rowCount, columnCount } = pos2;
182778
183087
  const isTop = rowIndex === 0;
182779
183088
  const isBottom = rowIndex === rowCount - 1;
182780
183089
  const isLeft = cellIndex === 0;
182781
- const isRight = cellIndex === columnCount - 1;
183090
+ const isRight2 = cellIndex === columnCount - 1;
182782
183091
  const sections2 = [];
182783
183092
  const push2 = (borders, regionTop, regionBottom, regionLeft, regionRight) => {
182784
183093
  if (borders) {
182785
183094
  sections2.push({ borders, regionTop, regionBottom, regionLeft, regionRight });
182786
183095
  }
182787
183096
  };
182788
- push2(entry2.wholeTblBorders, isTop, isBottom, isLeft, isRight);
183097
+ push2(entry3.wholeTblBorders, isTop, isBottom, isLeft, isRight2);
182789
183098
  if (tableData.bandedRows) {
182790
183099
  const bandStartRow = tableData.firstRowHeader ? 1 : 0;
182791
183100
  const bandEndRow = tableData.lastRow ? rowCount - 1 : rowCount;
@@ -182793,11 +183102,11 @@ function collectSections(entry2, tableData, pos2) {
182793
183102
  const rowCycle = Math.max(tableData.bandRowCycle ?? 1, 1);
182794
183103
  const bandGroup = Math.floor((rowIndex - bandStartRow) / rowCycle) % 2;
182795
183104
  push2(
182796
- bandGroup === 0 ? entry2.band1HBorders : entry2.band2HBorders,
183105
+ bandGroup === 0 ? entry3.band1HBorders : entry3.band2HBorders,
182797
183106
  true,
182798
183107
  true,
182799
183108
  isLeft,
182800
- isRight
183109
+ isRight2
182801
183110
  );
182802
183111
  }
182803
183112
  }
@@ -182807,42 +183116,42 @@ function collectSections(entry2, tableData, pos2) {
182807
183116
  if (cellIndex >= colStart && cellIndex < colEnd) {
182808
183117
  const colCycle = Math.max(tableData.bandColCycle ?? 1, 1);
182809
183118
  const colGroup = Math.floor((cellIndex - colStart) / colCycle) % 2;
182810
- push2(colGroup === 0 ? entry2.band1VBorders : entry2.band2VBorders, isTop, isBottom, true, true);
183119
+ push2(colGroup === 0 ? entry3.band1VBorders : entry3.band2VBorders, isTop, isBottom, true, true);
182811
183120
  }
182812
183121
  }
182813
183122
  const atTop = Boolean(tableData.firstRowHeader) && isTop;
182814
183123
  const atBottom = Boolean(tableData.lastRow) && isBottom;
182815
183124
  const atLeft = Boolean(tableData.firstCol) && isLeft;
182816
- const atRight = Boolean(tableData.lastCol) && isRight;
183125
+ const atRight = Boolean(tableData.lastCol) && isRight2;
182817
183126
  if (atRight) {
182818
- push2(entry2.lastColBorders, isTop, isBottom, true, true);
183127
+ push2(entry3.lastColBorders, isTop, isBottom, true, true);
182819
183128
  }
182820
183129
  if (atLeft) {
182821
- push2(entry2.firstColBorders, isTop, isBottom, true, true);
183130
+ push2(entry3.firstColBorders, isTop, isBottom, true, true);
182822
183131
  }
182823
183132
  if (atBottom) {
182824
- push2(entry2.lastRowBorders, true, true, isLeft, isRight);
183133
+ push2(entry3.lastRowBorders, true, true, isLeft, isRight2);
182825
183134
  }
182826
183135
  if (atBottom && atRight) {
182827
- push2(entry2.seCellBorders, true, true, true, true);
183136
+ push2(entry3.seCellBorders, true, true, true, true);
182828
183137
  }
182829
183138
  if (atBottom && atLeft) {
182830
- push2(entry2.swCellBorders, true, true, true, true);
183139
+ push2(entry3.swCellBorders, true, true, true, true);
182831
183140
  }
182832
183141
  if (atTop) {
182833
- push2(entry2.firstRowBorders, true, true, isLeft, isRight);
183142
+ push2(entry3.firstRowBorders, true, true, isLeft, isRight2);
182834
183143
  }
182835
183144
  if (atTop && atRight) {
182836
- push2(entry2.neCellBorders, true, true, true, true);
183145
+ push2(entry3.neCellBorders, true, true, true, true);
182837
183146
  }
182838
183147
  if (atTop && atLeft) {
182839
- push2(entry2.nwCellBorders, true, true, true, true);
183148
+ push2(entry3.nwCellBorders, true, true, true, true);
182840
183149
  }
182841
183150
  return sections2;
182842
183151
  }
182843
- function collectLayers(entry2, tableData, pos2) {
183152
+ function collectLayers(entry3, tableData, pos2) {
182844
183153
  const layers = [];
182845
- for (const section of collectSections(entry2, tableData, pos2)) {
183154
+ for (const section of collectSections(entry3, tableData, pos2)) {
182846
183155
  layers.push(
182847
183156
  edgesFromSection(
182848
183157
  section.borders,
@@ -182855,11 +183164,11 @@ function collectLayers(entry2, tableData, pos2) {
182855
183164
  }
182856
183165
  return layers.filter((layer) => layer !== void 0);
182857
183166
  }
182858
- function resolveCellBorderCss(entry2, tableData, pos2, resolve2) {
182859
- if (!entry2) {
183167
+ function resolveCellBorderCss(entry3, tableData, pos2, resolve2) {
183168
+ if (!entry3) {
182860
183169
  return void 0;
182861
183170
  }
182862
- const layers = collectLayers(entry2, tableData, pos2);
183171
+ const layers = collectLayers(entry3, tableData, pos2);
182863
183172
  if (layers.length === 0) {
182864
183173
  return void 0;
182865
183174
  }
@@ -182885,11 +183194,11 @@ function resolveCellBorderCss(entry2, tableData, pos2, resolve2) {
182885
183194
  }
182886
183195
  return applied ? css : void 0;
182887
183196
  }
182888
- function resolveStyleDiagonalBorders(entry2, tableData, pos2, resolve2) {
182889
- if (!entry2) {
183197
+ function resolveStyleDiagonalBorders(entry3, tableData, pos2, resolve2) {
183198
+ if (!entry3) {
182890
183199
  return void 0;
182891
183200
  }
182892
- const sections2 = collectSections(entry2, tableData, pos2);
183201
+ const sections2 = collectSections(entry3, tableData, pos2);
182893
183202
  if (sections2.length === 0) {
182894
183203
  return void 0;
182895
183204
  }
@@ -182939,20 +183248,20 @@ function builtinTableStyleMap() {
182939
183248
  const data = JSON.parse(BUILTIN_TABLE_STYLE_JSON);
182940
183249
  for (const family of data.families) {
182941
183250
  for (const variant of family.variants) {
182942
- const entry2 = substituteAccent(
183251
+ const entry3 = substituteAccent(
182943
183252
  family.template,
182944
183253
  family.baseAccent,
182945
183254
  variant.a,
182946
183255
  family.baseAccent2,
182947
183256
  variant.b
182948
183257
  );
182949
- entry2.styleId = variant.id;
182950
- entry2.styleName = variant.name;
182951
- map[variant.id] = entry2;
183258
+ entry3.styleId = variant.id;
183259
+ entry3.styleName = variant.name;
183260
+ map[variant.id] = entry3;
182952
183261
  }
182953
183262
  }
182954
- for (const entry2 of data.standalone) {
182955
- map[entry2.styleId] = entry2;
183263
+ for (const entry3 of data.standalone) {
183264
+ map[entry3.styleId] = entry3;
182956
183265
  }
182957
183266
  catalogue = map;
182958
183267
  return map;
@@ -182965,19 +183274,19 @@ function getBuiltinTableStyle(styleId) {
182965
183274
  const withBraces = normalised.startsWith("{") ? normalised : `{${normalised}}`;
182966
183275
  return builtinTableStyleMap()[withBraces];
182967
183276
  }
182968
- function resolveTableStyleCell3D(entry2, tableData, pos2) {
182969
- if (!entry2) {
183277
+ function resolveTableStyleCell3D(entry3, tableData, pos2) {
183278
+ if (!entry3) {
182970
183279
  return void 0;
182971
183280
  }
182972
183281
  const { rowIndex, cellIndex, rowCount, columnCount } = pos2;
182973
- let current = entry2.wholeTblCell3D;
183282
+ let current = entry3.wholeTblCell3D;
182974
183283
  const bandStartRow = tableData.firstRowHeader ? 1 : 0;
182975
183284
  const bandEndRow = tableData.lastRow ? rowCount - 1 : rowCount;
182976
183285
  if (tableData.bandedRows && rowIndex >= bandStartRow && rowIndex < bandEndRow) {
182977
183286
  const bandIndex = rowIndex - bandStartRow;
182978
183287
  const rowCycle = Math.max(tableData.bandRowCycle ?? 1, 1);
182979
183288
  const bandGroup = Math.floor(bandIndex / rowCycle) % 2;
182980
- current = (bandGroup === 0 ? entry2.band1HCell3D : entry2.band2HCell3D) ?? current;
183289
+ current = (bandGroup === 0 ? entry3.band1HCell3D : entry3.band2HCell3D) ?? current;
182981
183290
  }
182982
183291
  if (tableData.bandedColumns) {
182983
183292
  const isFirstCol = tableData.firstCol;
@@ -182987,7 +183296,7 @@ function resolveTableStyleCell3D(entry2, tableData, pos2) {
182987
183296
  if (!skipCol) {
182988
183297
  const colCycle = Math.max(tableData.bandColCycle ?? 1, 1);
182989
183298
  const colBandGroup = Math.floor(colBandIndex / colCycle) % 2;
182990
- current = (colBandGroup === 0 ? entry2.band1VCell3D : entry2.band2VCell3D) ?? current;
183299
+ current = (colBandGroup === 0 ? entry3.band1VCell3D : entry3.band2VCell3D) ?? current;
182991
183300
  }
182992
183301
  }
182993
183302
  const atTop = Boolean(tableData.firstRowHeader) && rowIndex === 0;
@@ -182995,28 +183304,28 @@ function resolveTableStyleCell3D(entry2, tableData, pos2) {
182995
183304
  const atLeft = Boolean(tableData.firstCol) && cellIndex === 0;
182996
183305
  const atRight = Boolean(tableData.lastCol) && cellIndex === columnCount - 1;
182997
183306
  if (atRight) {
182998
- current = entry2.lastColCell3D ?? current;
183307
+ current = entry3.lastColCell3D ?? current;
182999
183308
  }
183000
183309
  if (atLeft) {
183001
- current = entry2.firstColCell3D ?? current;
183310
+ current = entry3.firstColCell3D ?? current;
183002
183311
  }
183003
183312
  if (atBottom) {
183004
- current = entry2.lastRowCell3D ?? current;
183313
+ current = entry3.lastRowCell3D ?? current;
183005
183314
  }
183006
183315
  if (atBottom && atRight) {
183007
- current = entry2.seCellCell3D ?? current;
183316
+ current = entry3.seCellCell3D ?? current;
183008
183317
  }
183009
183318
  if (atBottom && atLeft) {
183010
- current = entry2.swCellCell3D ?? current;
183319
+ current = entry3.swCellCell3D ?? current;
183011
183320
  }
183012
183321
  if (atTop) {
183013
- current = entry2.firstRowCell3D ?? current;
183322
+ current = entry3.firstRowCell3D ?? current;
183014
183323
  }
183015
183324
  if (atTop && atRight) {
183016
- current = entry2.neCellCell3D ?? current;
183325
+ current = entry3.neCellCell3D ?? current;
183017
183326
  }
183018
183327
  if (atTop && atLeft) {
183019
- current = entry2.nwCellCell3D ?? current;
183328
+ current = entry3.nwCellCell3D ?? current;
183020
183329
  }
183021
183330
  return current;
183022
183331
  }
@@ -183500,9 +183809,9 @@ function getDiagonalBorders(style, styleDiagonals) {
183500
183809
  function getCellDiagonalBorders(style, tableData, pos2, styleCtx) {
183501
183810
  let styleDiagonals;
183502
183811
  if (tableData) {
183503
- const entry2 = resolveTableStyleEntry(tableData.tableStyleId, styleCtx?.tableStyleMap);
183812
+ const entry3 = resolveTableStyleEntry(tableData.tableStyleId, styleCtx?.tableStyleMap);
183504
183813
  styleDiagonals = resolveStyleDiagonalBorders(
183505
- entry2,
183814
+ entry3,
183506
183815
  tableData,
183507
183816
  pos2,
183508
183817
  (fill) => resolveStyleFillColor(fill, styleCtx?.colorScheme)
@@ -187174,6 +187483,7 @@ var translationsEn = {
187174
187483
  "pptx.media.startAutomatically": "Automatically",
187175
187484
  "pptx.media.playAcrossSlides": "Play across slides",
187176
187485
  "pptx.media.fullScreen": "Full screen",
187486
+ "pptx.media.onlineVideoTitle": "Online video",
187177
187487
  "pptx.media.hideWhenNotPlaying": "Hide when not playing",
187178
187488
  "pptx.media.bookmarks": "Bookmarks",
187179
187489
  "pptx.media.bookmark": "Bookmark",
@@ -187249,6 +187559,12 @@ var translationsEn = {
187249
187559
  "pptx.compare.noDifferences": "No differences",
187250
187560
  "pptx.compare.summary": "{{added}} added, {{removed}} removed, {{changed}} changed",
187251
187561
  "pptx.compare.title": "Compare",
187562
+ // Canvas context menu (empty slide right-click)
187563
+ "pptx.canvasContextMenu.formatBackground": "Format Background...",
187564
+ "pptx.canvasContextMenu.gridAndGuides": "Grid and Guides",
187565
+ "pptx.canvasContextMenu.layout": "Layout",
187566
+ "pptx.canvasContextMenu.resetSlide": "Reset Slide",
187567
+ "pptx.canvasContextMenu.ruler": "Ruler",
187252
187568
  // Context menu
187253
187569
  "pptx.contextMenu.addComment": "Add Comment",
187254
187570
  "pptx.contextMenu.bringForward": "Bring Forward",
@@ -187259,7 +187575,10 @@ var translationsEn = {
187259
187575
  "pptx.contextMenu.deleteColumn": "Delete Column",
187260
187576
  "pptx.contextMenu.deleteRow": "Delete Row",
187261
187577
  "pptx.contextMenu.duplicate": "Duplicate",
187578
+ "pptx.contextMenu.editAltText": "Edit Alt Text...",
187262
187579
  "pptx.contextMenu.editHyperlink": "Edit Hyperlink",
187580
+ "pptx.contextMenu.editText": "Edit Text",
187581
+ "pptx.contextMenu.formatShape": "Format Shape...",
187263
187582
  "pptx.contextMenu.group": "Group",
187264
187583
  "pptx.contextMenu.insertColumnLeft": "Insert Column Left",
187265
187584
  "pptx.contextMenu.insertColumnRight": "Insert Column Right",
@@ -187268,10 +187587,19 @@ var translationsEn = {
187268
187587
  "pptx.contextMenu.mergeCells": "Merge Right",
187269
187588
  "pptx.contextMenu.mergeSelectedCells": "Merge Selected Cells",
187270
187589
  "pptx.contextMenu.paste": "Paste",
187590
+ "pptx.contextMenu.saveAsPicture": "Save as Picture...",
187271
187591
  "pptx.contextMenu.sendBackward": "Send Backward",
187272
187592
  "pptx.contextMenu.sendToBack": "Send to Back",
187593
+ "pptx.contextMenu.sizeAndPosition": "Size and Position...",
187273
187594
  "pptx.contextMenu.splitCell": "Split Cell",
187274
187595
  "pptx.contextMenu.ungroup": "Ungroup",
187596
+ // Paste Special (Ctrl+Alt+V) and the post-paste Paste Options toolbar
187597
+ "pptx.pasteSpecial.dialogTitle": "Paste Special",
187598
+ "pptx.pasteSpecial.keepSourceFormatting": "Keep Source Formatting",
187599
+ "pptx.pasteSpecial.keepTextOnly": "Keep Text Only",
187600
+ "pptx.pasteSpecial.optionsLabel": "Paste Options",
187601
+ "pptx.pasteSpecial.picture": "Picture",
187602
+ "pptx.pasteSpecial.useDestinationTheme": "Use Destination Theme",
187275
187603
  // Digital signatures (additions)
187276
187604
  "pptx.digitalSignatures.badge": "Signed",
187277
187605
  "pptx.digitalSignatures.editWarning": "Editing this presentation will invalidate its digital signatures.",
@@ -187618,6 +187946,12 @@ var translationsEn = {
187618
187946
  "pptx.transition.morphOption.byObject": "By Object",
187619
187947
  "pptx.transition.morphOption.byWord": "By Word",
187620
187948
  "pptx.transition.morphOption.byChar": "By Character",
187949
+ "pptx.transition.pattern": "Pattern",
187950
+ "pptx.transition.pattern.diamond": "Diamond",
187951
+ "pptx.transition.pattern.hexagon": "Hexagon",
187952
+ "pptx.transition.pattern.strip": "Strips",
187953
+ "pptx.transition.pattern.rectangle": "Rectangles",
187954
+ "pptx.transition.thruBlk": "Through black",
187621
187955
  // Context menu / editor toolbar (Angular/Vue-specific additions)
187622
187956
  "pptx.contextMenu.ariaLabel": "Context menu",
187623
187957
  "pptx.editorToolbar.ariaLabel": "Editor toolbar",
@@ -190379,6 +190713,9 @@ function isBrowserOpenableMime(mime) {
190379
190713
  }
190380
190714
  return value === "application/pdf" || value === "application/json" || value === "application/xml" || value === "application/xhtml+xml";
190381
190715
  }
190716
+ function oleActionsVisible(surface) {
190717
+ return !surface.presenting && !surface.preview;
190718
+ }
190382
190719
  var TYPE_COLORS = {
190383
190720
  excel: "#217346",
190384
190721
  word: "#2B579A",
@@ -192195,14 +192532,14 @@ function resolveParagraphStrutFontSize(segments, bodyFontSize, fontScale = 1) {
192195
192532
  return smallest * fontScale;
192196
192533
  }
192197
192534
  function resolveParagraphRtl(paraSegments, elementRtl) {
192198
- for (const entry2 of paraSegments) {
192199
- const segRtl = entry2.segment.style?.rtl;
192535
+ for (const entry3 of paraSegments) {
192536
+ const segRtl = entry3.segment.style?.rtl;
192200
192537
  if (segRtl !== void 0) {
192201
192538
  return segRtl;
192202
192539
  }
192203
192540
  }
192204
- for (const entry2 of paraSegments) {
192205
- const paraRtl = entry2.segment.paragraphProperties?.rtl;
192541
+ for (const entry3 of paraSegments) {
192542
+ const paraRtl = entry3.segment.paragraphProperties?.rtl;
192206
192543
  if (paraRtl !== void 0) {
192207
192544
  return paraRtl;
192208
192545
  }
@@ -192210,8 +192547,8 @@ function resolveParagraphRtl(paraSegments, elementRtl) {
192210
192547
  return elementRtl;
192211
192548
  }
192212
192549
  function resolveParagraphAlign(paraSegments, elementAlign) {
192213
- for (const entry2 of paraSegments) {
192214
- const segAlign = entry2.segment.style?.align;
192550
+ for (const entry3 of paraSegments) {
192551
+ const segAlign = entry3.segment.style?.align;
192215
192552
  if (segAlign !== void 0) {
192216
192553
  return segAlign;
192217
192554
  }
@@ -193870,7 +194207,7 @@ function positions(segments) {
193870
194207
  if (!marker) {
193871
194208
  offset += segment.text.length;
193872
194209
  }
193873
- const entry2 = {
194210
+ const entry3 = {
193874
194211
  start,
193875
194212
  end: offset,
193876
194213
  paragraph,
@@ -193880,19 +194217,19 @@ function positions(segments) {
193880
194217
  if (first) {
193881
194218
  paragraph += 1;
193882
194219
  }
193883
- return entry2;
194220
+ return entry3;
193884
194221
  });
193885
194222
  }
193886
194223
  function restorePoint(segments, offset, preferRunStart = false) {
193887
194224
  const entries = positions(segments);
193888
194225
  let fallback = { index: 0, offset: 0 };
193889
- for (const [index, entry2] of entries.entries()) {
193890
- if (!entry2.editable) {
194226
+ for (const [index, entry3] of entries.entries()) {
194227
+ if (!entry3.editable) {
193891
194228
  continue;
193892
194229
  }
193893
194230
  fallback = { index, offset: segments[index].text.length };
193894
- if (offset < entry2.end || offset === entry2.end && (!preferRunStart || entry2.start === entry2.end)) {
193895
- return { index, offset: Math.max(0, offset - entry2.start) };
194231
+ if (offset < entry3.end || offset === entry3.end && (!preferRunStart || entry3.start === entry3.end)) {
194232
+ return { index, offset: Math.max(0, offset - entry3.start) };
193896
194233
  }
193897
194234
  }
193898
194235
  return fallback;
@@ -193963,7 +194300,7 @@ function applyListStyleUpdate(element, updates, selection) {
193963
194300
  }
193964
194301
  const startOffset = startEntry.start + workingSelection.startOffset;
193965
194302
  const endOffset = endEntry.start + workingSelection.endOffset;
193966
- const lastSelected = [...entries].reverse().find((entry2) => entry2.start < endOffset);
194303
+ const lastSelected = [...entries].reverse().find((entry3) => entry3.start < endOffset);
193967
194304
  const patch = setElementBullets(working, listType, {
193968
194305
  startParagraph: startEntry.paragraph,
193969
194306
  endParagraph: Math.max(startEntry.paragraph, lastSelected?.paragraph ?? endEntry.paragraph)
@@ -195451,12 +195788,12 @@ function scaleFontSizes(root, fontFactor, lineFactor) {
195451
195788
  lineHeight: Number.isFinite(lineHeight) ? lineHeight : void 0
195452
195789
  };
195453
195790
  });
195454
- for (const entry2 of original) {
195455
- if (entry2.fontSize !== void 0) {
195456
- entry2.el.style.fontSize = `${entry2.fontSize * fontFactor}px`;
195791
+ for (const entry3 of original) {
195792
+ if (entry3.fontSize !== void 0) {
195793
+ entry3.el.style.fontSize = `${entry3.fontSize * fontFactor}px`;
195457
195794
  }
195458
- if (entry2.lineHeight !== void 0) {
195459
- entry2.el.style.lineHeight = `${entry2.lineHeight * lineFactor}px`;
195795
+ if (entry3.lineHeight !== void 0) {
195796
+ entry3.el.style.lineHeight = `${entry3.lineHeight * lineFactor}px`;
195460
195797
  }
195461
195798
  }
195462
195799
  }
@@ -200323,11 +200660,11 @@ function reconcileElementYMap(ymap, element, factories, assets) {
200323
200660
  reconcileAssetFields(rec.id, rec, ymap, assets);
200324
200661
  }
200325
200662
  function mapIdAt(arr, index) {
200326
- const entry2 = arr.get(index);
200327
- if (!entry2 || typeof entry2.get !== "function") {
200663
+ const entry3 = arr.get(index);
200664
+ if (!entry3 || typeof entry3.get !== "function") {
200328
200665
  return void 0;
200329
200666
  }
200330
- const id = entry2.get("id");
200667
+ const id = entry3.get("id");
200331
200668
  return typeof id === "string" ? id : void 0;
200332
200669
  }
200333
200670
  function reconcileYArrayById(arr, items, adapter) {
@@ -200582,9 +200919,9 @@ function presenceListsEqual(a, b) {
200582
200919
  if (a.length !== b.length) {
200583
200920
  return false;
200584
200921
  }
200585
- return a.every((entry2, index) => {
200922
+ return a.every((entry3, index) => {
200586
200923
  const other = b[index];
200587
- return other !== void 0 && presenceEntriesEqual(entry2, other);
200924
+ return other !== void 0 && presenceEntriesEqual(entry3, other);
200588
200925
  });
200589
200926
  }
200590
200927
  function createPresenceProjector() {
@@ -201334,12 +201671,12 @@ function createCollaborationLivePatcher(options = {}) {
201334
201671
  return null;
201335
201672
  }
201336
201673
  const key2 = keyFor3(slideId, elementId);
201337
- let entry2 = pending.get(key2);
201338
- if (!entry2) {
201339
- entry2 = { slideId, elementId };
201340
- pending.set(key2, entry2);
201674
+ let entry3 = pending.get(key2);
201675
+ if (!entry3) {
201676
+ entry3 = { slideId, elementId };
201677
+ pending.set(key2, entry3);
201341
201678
  }
201342
- return entry2;
201679
+ return entry3;
201343
201680
  };
201344
201681
  return {
201345
201682
  beginTextEdit(slideId, elementId, onChange, ownsModel) {
@@ -201405,22 +201742,22 @@ function createCollaborationLivePatcher(options = {}) {
201405
201742
  return doc !== null && factories !== null;
201406
201743
  },
201407
201744
  patchGeometry(slideId, elementId, geometry) {
201408
- const entry2 = enqueue(slideId, elementId);
201409
- if (!entry2) {
201745
+ const entry3 = enqueue(slideId, elementId);
201746
+ if (!entry3) {
201410
201747
  return;
201411
201748
  }
201412
- entry2.geometry = { ...entry2.geometry, ...geometry };
201749
+ entry3.geometry = { ...entry3.geometry, ...geometry };
201413
201750
  schedule2();
201414
201751
  },
201415
201752
  patchText(slideId, elementId, text22, source) {
201416
201753
  if (textOwners.has(keyFor3(slideId, elementId))) {
201417
201754
  return;
201418
201755
  }
201419
- const entry2 = enqueue(slideId, elementId);
201420
- if (!entry2) {
201756
+ const entry3 = enqueue(slideId, elementId);
201757
+ if (!entry3) {
201421
201758
  return;
201422
201759
  }
201423
- entry2.text = { value: text22, source: source ?? entry2.text?.source ?? {} };
201760
+ entry3.text = { value: text22, source: source ?? entry3.text?.source ?? {} };
201424
201761
  schedule2();
201425
201762
  },
201426
201763
  flush() {
@@ -202647,6 +202984,35 @@ function applyAcceptAllSlides(slides, compareResult) {
202647
202984
  }
202648
202985
  return next;
202649
202986
  }
202987
+ var VORTEX_DIRECTIONAL_KEYFRAMES = `
202988
+ @keyframes pptx-tr-vortex-in-left { from { transform: translateX(-40%) rotate(720deg) scale(0); opacity: 0; } to { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } }
202989
+ @keyframes pptx-tr-vortex-out-left { from { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateX(-40%) rotate(-720deg) scale(0); opacity: 0; } }
202990
+ @keyframes pptx-tr-vortex-in-right { from { transform: translateX(40%) rotate(-720deg) scale(0); opacity: 0; } to { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } }
202991
+ @keyframes pptx-tr-vortex-out-right { from { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateX(40%) rotate(720deg) scale(0); opacity: 0; } }
202992
+ @keyframes pptx-tr-vortex-in-up { from { transform: translateY(-40%) rotate(720deg) scale(0); opacity: 0; } to { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } }
202993
+ @keyframes pptx-tr-vortex-out-up { from { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateY(-40%) rotate(-720deg) scale(0); opacity: 0; } }
202994
+ @keyframes pptx-tr-vortex-in-down { from { transform: translateY(40%) rotate(-720deg) scale(0); opacity: 0; } to { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } }
202995
+ @keyframes pptx-tr-vortex-out-down { from { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateY(40%) rotate(720deg) scale(0); opacity: 0; } }
202996
+ `;
202997
+ var RIPPLE_DIRECTIONAL_KEYFRAMES = `
202998
+ @keyframes pptx-tr-ripple-in-lu { from { clip-path: circle(0% at 0% 0%); opacity: 0.5; } 30% { clip-path: circle(20% at 0% 0%); opacity: 0.7; } 60% { clip-path: circle(55% at 0% 0%); opacity: 0.9; } to { clip-path: circle(150% at 0% 0%); opacity: 1; } }
202999
+ @keyframes pptx-tr-ripple-in-ru { from { clip-path: circle(0% at 100% 0%); opacity: 0.5; } 30% { clip-path: circle(20% at 100% 0%); opacity: 0.7; } 60% { clip-path: circle(55% at 100% 0%); opacity: 0.9; } to { clip-path: circle(150% at 100% 0%); opacity: 1; } }
203000
+ @keyframes pptx-tr-ripple-in-ld { from { clip-path: circle(0% at 0% 100%); opacity: 0.5; } 30% { clip-path: circle(20% at 0% 100%); opacity: 0.7; } 60% { clip-path: circle(55% at 0% 100%); opacity: 0.9; } to { clip-path: circle(150% at 0% 100%); opacity: 1; } }
203001
+ @keyframes pptx-tr-ripple-in-rd { from { clip-path: circle(0% at 100% 100%); opacity: 0.5; } 30% { clip-path: circle(20% at 100% 100%); opacity: 0.7; } 60% { clip-path: circle(55% at 100% 100%); opacity: 0.9; } to { clip-path: circle(150% at 100% 100%); opacity: 1; } }
203002
+ `;
203003
+ var GLITTER_DIRECTIONAL_KEYFRAMES = `
203004
+ @keyframes pptx-tr-glitter-diamond-in-l { from { opacity: 0; transform: translateX(-6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateX(-2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0); } }
203005
+ @keyframes pptx-tr-glitter-diamond-in-r { from { opacity: 0; transform: translateX(6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateX(2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0); } }
203006
+ @keyframes pptx-tr-glitter-diamond-in-u { from { opacity: 0; transform: translateY(-6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateY(-2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0); } }
203007
+ @keyframes pptx-tr-glitter-diamond-in-d { from { opacity: 0; transform: translateY(6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateY(2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0); } }
203008
+ @keyframes pptx-tr-glitter-hexagon-in-l { from { opacity: 0; transform: translateX(-6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateX(-2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }
203009
+ @keyframes pptx-tr-glitter-hexagon-in-r { from { opacity: 0; transform: translateX(6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateX(2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }
203010
+ @keyframes pptx-tr-glitter-hexagon-in-u { from { opacity: 0; transform: translateY(-6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateY(-2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }
203011
+ @keyframes pptx-tr-glitter-hexagon-in-d { from { opacity: 0; transform: translateY(6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateY(2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }
203012
+ `;
203013
+ var DIRECTIONAL_FX_KEYFRAMES = `${VORTEX_DIRECTIONAL_KEYFRAMES}
203014
+ ${RIPPLE_DIRECTIONAL_KEYFRAMES}
203015
+ ${GLITTER_DIRECTIONAL_KEYFRAMES}`;
202650
203016
  var PRISM_TRANSITION_KEYFRAMES = `
202651
203017
  @keyframes pptx-tr-prism-in-from-right {
202652
203018
  from { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }
@@ -202968,7 +203334,8 @@ ${WARP_TRANSITION_KEYFRAMES}
202968
203334
  }
202969
203335
  `;
202970
203336
  var P14_TRANSITION_KEYFRAMES_ALL = `${P14_TRANSITION_KEYFRAMES}
202971
- ${P14_TRANSITION_KEYFRAMES_2}`;
203337
+ ${P14_TRANSITION_KEYFRAMES_2}
203338
+ ${DIRECTIONAL_FX_KEYFRAMES}`;
202972
203339
  function getBoxTransitionAnimations(durationMs, direction) {
202973
203340
  const dur = `${durationMs}ms`;
202974
203341
  const dir = resolveDirection(direction, "left");
@@ -202991,6 +203358,61 @@ function prismDepthPair(prefix, dir, axis, translateSign) {
202991
203358
  var BOX_TRANSITION_KEYFRAMES = `
202992
203359
  /* \u2500\u2500 Box (faces separate and recede in depth, unlike Cube's flush hinge) \u2500\u2500 */${prismDepthPair("box", "left", "X", -1)}${prismDepthPair("box", "right", "X", 1)}${prismDepthPair("box", "up", "Y", -1)}${prismDepthPair("box", "down", "Y", 1)}
202993
203360
  `;
203361
+ var FALLOVER_RIGHT_KEYFRAMES = `
203362
+ @keyframes pptx-tr-fallover-out-right {
203363
+ 0% { transform: perspective(1400px) rotate3d(1, -1, 0, 0deg) scale(1); transform-origin: bottom right; opacity: 1; }
203364
+ 55% { transform: perspective(1400px) rotate3d(1, -1, 0, 45deg) scale(.92); transform-origin: bottom right; opacity: .85; }
203365
+ 100% { transform: perspective(1400px) rotate3d(1, -1, 0, 85deg) scale(.7); transform-origin: bottom right; opacity: 0; }
203366
+ }
203367
+ `;
203368
+ var DRAPE_RIGHT_KEYFRAMES = `
203369
+ @keyframes pptx-tr-drape-in-right {
203370
+ from { transform: perspective(1600px) rotateX(-55deg) rotateZ(4deg) scale(1.15); transform-origin: top right; opacity: 0; }
203371
+ to { transform: perspective(1600px) rotateX(0deg) rotateZ(0deg) scale(1); transform-origin: top right; opacity: 1; }
203372
+ }
203373
+ `;
203374
+ var PEELOFF_RIGHT_KEYFRAMES = `
203375
+ @keyframes pptx-tr-peeloff-out-right {
203376
+ from { transform: perspective(1400px) rotate3d(1, -1, 0, 0deg); transform-origin: top left; opacity: 1; }
203377
+ to { transform: perspective(1400px) rotate3d(1, -1, 0, 110deg); transform-origin: top left; opacity: .15; }
203378
+ }
203379
+ `;
203380
+ var PAGECURL_RIGHT_KEYFRAMES = `
203381
+ @keyframes pptx-tr-pagecurl-out-right {
203382
+ from { transform: perspective(1600px) rotateY(0deg); transform-origin: left center; opacity: 1; }
203383
+ to { transform: perspective(1600px) rotateY(155deg); transform-origin: left center; opacity: .25; }
203384
+ }
203385
+ @keyframes pptx-tr-pagecurl-double-in-right {
203386
+ from { transform: perspective(1600px) rotateY(-155deg); transform-origin: right center; opacity: .25; }
203387
+ to { transform: perspective(1600px) rotateY(0deg); transform-origin: right center; opacity: 1; }
203388
+ }
203389
+ `;
203390
+ var AIRPLANE_RIGHT_KEYFRAMES = `
203391
+ @keyframes pptx-tr-airplane-out-right {
203392
+ 0% { transform: perspective(1200px) translate3d(0, 0, 0) rotate3d(-1, -1, 0, 0deg) scale(1); opacity: 1; }
203393
+ 40% { transform: perspective(1200px) translate3d(-10%, -10%, 0) rotate3d(-1, -1, 0, 25deg) scale(.85); opacity: 1; }
203394
+ 100% { transform: perspective(1200px) translate3d(-150%, -70%, 0) rotate3d(-1, -1, 1, 70deg) scale(.05); opacity: 0; }
203395
+ }
203396
+ `;
203397
+ var ORIGAMI_RIGHT_KEYFRAMES = `
203398
+ @keyframes pptx-tr-origami-out-right {
203399
+ 0% { transform: perspective(1400px) rotateX(0deg) rotateZ(0deg) translateY(0) scale(1); transform-origin: top right; opacity: 1; filter: brightness(1); }
203400
+ 45% { transform: perspective(1400px) rotateX(-52deg) rotateZ(-3deg) translateY(2%) scale(.96); transform-origin: top right; opacity: 1; filter: brightness(.82); }
203401
+ 70% { transform: perspective(1400px) rotateX(-84deg) rotateZ(-3deg) translateY(8%) scale(.88); transform-origin: top right; opacity: .8; filter: brightness(.68); }
203402
+ 100% { transform: perspective(1400px) rotateX(-125deg) rotateZ(-3deg) translateY(30%) scale(.68); transform-origin: top right; opacity: 0; filter: brightness(.55); }
203403
+ }
203404
+ @keyframes pptx-tr-origami-in-right {
203405
+ 0% { transform: perspective(1400px) rotateX(62deg) rotateZ(3deg) scale(.94); transform-origin: bottom left; opacity: 0; filter: brightness(.7); }
203406
+ 30% { transform: perspective(1400px) rotateX(62deg) rotateZ(3deg) scale(.94); transform-origin: bottom left; opacity: .65; filter: brightness(.75); }
203407
+ 100% { transform: perspective(1400px) rotateX(0deg) rotateZ(0deg) scale(1); transform-origin: bottom left; opacity: 1; filter: brightness(1); }
203408
+ }
203409
+ `;
203410
+ var CINEMATIC_MIRROR_KEYFRAMES = `${FALLOVER_RIGHT_KEYFRAMES}
203411
+ ${DRAPE_RIGHT_KEYFRAMES}
203412
+ ${PEELOFF_RIGHT_KEYFRAMES}
203413
+ ${PAGECURL_RIGHT_KEYFRAMES}
203414
+ ${AIRPLANE_RIGHT_KEYFRAMES}
203415
+ ${ORIGAMI_RIGHT_KEYFRAMES}`;
202994
203416
  var ROTATE_TRANSITION_KEYFRAMES = `
202995
203417
  /* \u2500\u2500 Rotate (screen-flush hinge, like Cube, reached via \`isContent="1"\`
202996
203418
  instead of Cube's bare element) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -203003,6 +203425,9 @@ var ROTATE_TRANSITION_KEYFRAMES = `
203003
203425
  @keyframes pptx-tr-rotate-out-down { from { transform: perspective(1500px) translateY(0) rotateX(0deg); } to { transform: perspective(1500px) translateY(50%) rotateX(-90deg); opacity: .55; } }
203004
203426
  @keyframes pptx-tr-rotate-in-down { from { transform: perspective(1500px) translateY(-50%) rotateX(90deg); opacity: .55; } to { transform: perspective(1500px) translateY(0) rotateX(0deg); opacity: 1; } }
203005
203427
  `;
203428
+ function isRight(direction) {
203429
+ return resolveDirection(direction, "left") === "right";
203430
+ }
203006
203431
  function threeDPair(prefix, dir, dur, outgoingOnTop) {
203007
203432
  return {
203008
203433
  outgoing: `${prefix}-out-${dir} ${dur} ${EASE} forwards`,
@@ -203032,14 +203457,14 @@ function getCinematicTransitionAnimations(type, durationMs, direction, orient) {
203032
203457
  return threeDPair("pptx-tr-rotate", resolveDirection(direction, "left"), dur, false);
203033
203458
  case "fallOver":
203034
203459
  return {
203035
- outgoing: `pptx-tr-fallover-out ${dur} ${EASE} forwards`,
203460
+ outgoing: `${isRight(direction) ? "pptx-tr-fallover-out-right" : "pptx-tr-fallover-out"} ${dur} ${EASE} forwards`,
203036
203461
  incoming: "none",
203037
203462
  outgoingOnTop: true
203038
203463
  };
203039
203464
  case "drape":
203040
203465
  return {
203041
203466
  outgoing: "none",
203042
- incoming: `pptx-tr-drape-in ${dur} ${EASE} forwards`,
203467
+ incoming: `${isRight(direction) ? "pptx-tr-drape-in-right" : "pptx-tr-drape-in"} ${dur} ${EASE} forwards`,
203043
203468
  outgoingOnTop: false
203044
203469
  };
203045
203470
  case "curtains":
@@ -203075,36 +203500,46 @@ function getCinematicTransitionAnimations(type, durationMs, direction, orient) {
203075
203500
  incoming: `pptx-tr-crush-in ${dur} ${EASE} forwards`,
203076
203501
  outgoingOnTop: true
203077
203502
  };
203078
- case "peelOff":
203503
+ case "peelOff": {
203504
+ const right = isRight(direction);
203079
203505
  return {
203080
- outgoing: `pptx-tr-peeloff-out ${dur} ${EASE} forwards`,
203506
+ outgoing: `${right ? "pptx-tr-peeloff-out-right" : "pptx-tr-peeloff-out"} ${dur} ${EASE} forwards`,
203081
203507
  incoming: "none",
203082
203508
  outgoingOnTop: true
203083
203509
  };
203084
- case "pageCurlSingle":
203510
+ }
203511
+ case "pageCurlSingle": {
203512
+ const right = isRight(direction);
203085
203513
  return {
203086
- outgoing: `pptx-tr-pagecurl-out ${dur} ${EASE} forwards`,
203514
+ outgoing: `${right ? "pptx-tr-pagecurl-out-right" : "pptx-tr-pagecurl-out"} ${dur} ${EASE} forwards`,
203087
203515
  incoming: "none",
203088
203516
  outgoingOnTop: true
203089
203517
  };
203090
- case "pageCurlDouble":
203518
+ }
203519
+ case "pageCurlDouble": {
203520
+ const right = isRight(direction);
203091
203521
  return {
203092
- outgoing: `pptx-tr-pagecurl-out ${dur} ${EASE} forwards`,
203093
- incoming: `pptx-tr-pagecurl-double-in ${dur} ${EASE} forwards`,
203522
+ outgoing: `${right ? "pptx-tr-pagecurl-out-right" : "pptx-tr-pagecurl-out"} ${dur} ${EASE} forwards`,
203523
+ incoming: `${right ? "pptx-tr-pagecurl-double-in-right" : "pptx-tr-pagecurl-double-in"} ${dur} ${EASE} forwards`,
203094
203524
  outgoingOnTop: true
203095
203525
  };
203096
- case "airplane":
203526
+ }
203527
+ case "airplane": {
203528
+ const right = isRight(direction);
203097
203529
  return {
203098
- outgoing: `pptx-tr-airplane-out ${dur} ${EASE} forwards`,
203530
+ outgoing: `${right ? "pptx-tr-airplane-out-right" : "pptx-tr-airplane-out"} ${dur} ${EASE} forwards`,
203099
203531
  incoming: `pptx-tr-fade-in ${dur} ${EASE} forwards`,
203100
203532
  outgoingOnTop: true
203101
203533
  };
203102
- case "origami":
203534
+ }
203535
+ case "origami": {
203536
+ const right = isRight(direction);
203103
203537
  return {
203104
- outgoing: `pptx-tr-origami-out ${dur} ${EASE} forwards`,
203105
- incoming: `pptx-tr-origami-in ${dur} ${EASE} forwards`,
203538
+ outgoing: `${right ? "pptx-tr-origami-out-right" : "pptx-tr-origami-out"} ${dur} ${EASE} forwards`,
203539
+ incoming: `${right ? "pptx-tr-origami-in-right" : "pptx-tr-origami-in"} ${dur} ${EASE} forwards`,
203106
203540
  outgoingOnTop: true
203107
203541
  };
203542
+ }
203108
203543
  default:
203109
203544
  return void 0;
203110
203545
  }
@@ -203192,6 +203627,7 @@ ${ROTATE_TRANSITION_KEYFRAMES}
203192
203627
  moment is brief and already mid-fade, so no line artifact survives. */
203193
203628
  @keyframes pptx-tr-origami-out { 0% { transform: perspective(1400px) rotateX(0deg) translateY(0) scale(1); transform-origin: top center; opacity: 1; filter: brightness(1); } 45% { transform: perspective(1400px) rotateX(-52deg) translateY(2%) scale(.96); transform-origin: top center; opacity: 1; filter: brightness(.82); } 70% { transform: perspective(1400px) rotateX(-84deg) translateY(8%) scale(.88); transform-origin: top center; opacity: .8; filter: brightness(.68); } 100% { transform: perspective(1400px) rotateX(-125deg) translateY(30%) scale(.68); transform-origin: top center; opacity: 0; filter: brightness(.55); } }
203194
203629
  @keyframes pptx-tr-origami-in { 0% { transform: perspective(1400px) rotateX(62deg) scale(.94); transform-origin: bottom center; opacity: 0; filter: brightness(.7); } 30% { transform: perspective(1400px) rotateX(62deg) scale(.94); transform-origin: bottom center; opacity: .65; filter: brightness(.75); } 100% { transform: perspective(1400px) rotateX(0deg) scale(1); transform-origin: bottom center; opacity: 1; filter: brightness(1); } }
203630
+ ${CINEMATIC_MIRROR_KEYFRAMES}
203195
203631
  `;
203196
203632
  function seededUnit(seed) {
203197
203633
  const x = Math.sin(seed * 12.9898 + 78.233) * 43758.5453;
@@ -203996,6 +204432,36 @@ ${P14_TRANSITION_KEYFRAMES_ALL}
203996
204432
  ${CINEMATIC_TRANSITION_KEYFRAMES}
203997
204433
  ${FRAGMENT_TRANSITION_KEYFRAMES}`;
203998
204434
  var SLIDE_TRANSITION_KEYFRAMES_CSS = SLIDE_TRANSITION_KEYFRAMES;
204435
+ function getVortexAnimations(durationMs, direction, ease) {
204436
+ const dur = `${durationMs}ms`;
204437
+ const dir = resolveDirection(direction, "left");
204438
+ return {
204439
+ outgoing: `pptx-tr-vortex-out-${dir} ${dur} ${ease} forwards`,
204440
+ incoming: `pptx-tr-vortex-in-${dir} ${dur} ${ease} forwards`,
204441
+ outgoingOnTop: true
204442
+ };
204443
+ }
204444
+ function getRippleAnimations(durationMs, direction, ease) {
204445
+ const dur = `${durationMs}ms`;
204446
+ const dir = resolveDirection8(direction, "left");
204447
+ const corner2 = dir === "lu" || dir === "ld" || dir === "ru" || dir === "rd" ? dir : void 0;
204448
+ return {
204449
+ outgoing: "none",
204450
+ incoming: corner2 ? `pptx-tr-ripple-in-${corner2} ${dur} ${ease} forwards` : `pptx-tr-ripple-in ${dur} ${ease} forwards`,
204451
+ outgoingOnTop: false
204452
+ };
204453
+ }
204454
+ function getGlitterAnimations(durationMs, direction, pattern, ease) {
204455
+ const dur = `${durationMs}ms`;
204456
+ const dir = resolveDirection(direction, "left");
204457
+ const dirToken = dir === "left" ? "l" : dir === "right" ? "r" : dir === "up" ? "u" : "d";
204458
+ const family = pattern === "hexagon" ? "hexagon" : "diamond";
204459
+ return {
204460
+ outgoing: `pptx-tr-fade-out ${dur} ${ease} forwards`,
204461
+ incoming: `pptx-tr-glitter-${family}-in-${dirToken} ${dur} ${ease} forwards`,
204462
+ outgoingOnTop: true
204463
+ };
204464
+ }
203999
204465
  function resolveLR(direction) {
204000
204466
  if (direction === "l" || direction === "r") {
204001
204467
  return direction;
@@ -204134,11 +204600,7 @@ function getP14TransitionAnimations(type, durationMs, direction, orient, pattern
204134
204600
  };
204135
204601
  }
204136
204602
  case "glitter":
204137
- return {
204138
- outgoing: `pptx-tr-fade-out ${dur} ${ease} forwards`,
204139
- incoming: `pptx-tr-glitter-in ${dur} ${ease} forwards`,
204140
- outgoingOnTop: true
204141
- };
204603
+ return getGlitterAnimations(durationMs, direction, pattern, ease);
204142
204604
  case "honeycomb":
204143
204605
  return {
204144
204606
  outgoing: `pptx-tr-honeycomb-out ${dur} ${ease} forwards`,
@@ -204158,11 +204620,7 @@ function getP14TransitionAnimations(type, durationMs, direction, orient, pattern
204158
204620
  };
204159
204621
  }
204160
204622
  case "ripple":
204161
- return {
204162
- outgoing: "none",
204163
- incoming: `pptx-tr-ripple-in ${dur} ${ease} forwards`,
204164
- outgoingOnTop: false
204165
- };
204623
+ return getRippleAnimations(durationMs, direction, ease);
204166
204624
  case "shred": {
204167
204625
  const isRectangles = pattern === "rectangle";
204168
204626
  return {
@@ -204187,11 +204645,7 @@ function getP14TransitionAnimations(type, durationMs, direction, orient, pattern
204187
204645
  };
204188
204646
  }
204189
204647
  case "vortex":
204190
- return {
204191
- outgoing: `pptx-tr-vortex-out ${dur} ${ease} forwards`,
204192
- incoming: `pptx-tr-vortex-in ${dur} ${ease} forwards`,
204193
- outgoingOnTop: true
204194
- };
204648
+ return getVortexAnimations(durationMs, direction, ease);
204195
204649
  case "warp": {
204196
204650
  const isOut = direction === "out";
204197
204651
  if (isOut) {
@@ -204590,7 +205044,7 @@ var TRANSITION_MORPH_OPTIONS = [
204590
205044
  { value: "byWord", label: "By Word", i18nKey: "pptx.transition.morphOption.byWord" },
204591
205045
  { value: "byChar", label: "By Character", i18nKey: "pptx.transition.morphOption.byChar" }
204592
205046
  ];
204593
- var TRANSITION_ORIENTATION_TYPES = /* @__PURE__ */ new Set(["blinds", "checker", "comb", "randomBar"]);
205047
+ var TRANSITION_ORIENTATION_TYPES = /* @__PURE__ */ new Set(["blinds", "checker", "comb", "randomBar", "doors", "window"]);
204594
205048
  var TRANSITION_DIR_ARROWS = {
204595
205049
  l: "\u2190",
204596
205050
  r: "\u2192",
@@ -204649,8 +205103,8 @@ function transitionSoundOptions(transition) {
204649
205103
  options.push({ value: TRANSITION_SOUND_CURRENT_VALUE, label: fileName });
204650
205104
  }
204651
205105
  options.push({ value: TRANSITION_SOUND_NONE_VALUE, i18nKey: "pptx.ribbon.soundNone" });
204652
- for (const entry2 of EFFECT_SOUND_CATALOGUE) {
204653
- options.push({ value: entry2.id, i18nKey: entry2.i18nKey });
205106
+ for (const entry3 of EFFECT_SOUND_CATALOGUE) {
205107
+ options.push({ value: entry3.id, i18nKey: entry3.i18nKey });
204654
205108
  }
204655
205109
  options.push({ value: TRANSITION_SOUND_OTHER_VALUE, i18nKey: "pptx.ribbon.soundOther" });
204656
205110
  return options;
@@ -207467,9 +207921,9 @@ function observeElementHeight(el, onHeight) {
207467
207921
  return () => void 0;
207468
207922
  }
207469
207923
  const observer = new ResizeObserver((entries) => {
207470
- const entry2 = entries[entries.length - 1];
207471
- if (entry2) {
207472
- const box = entry2.borderBoxSize?.[0]?.blockSize;
207924
+ const entry3 = entries[entries.length - 1];
207925
+ if (entry3) {
207926
+ const box = entry3.borderBoxSize?.[0]?.blockSize;
207473
207927
  onHeight(box ?? el.getBoundingClientRect().height);
207474
207928
  }
207475
207929
  });
@@ -208749,7 +209203,7 @@ function buildJoinCollaborationConfig(fields) {
208749
209203
  const serverUrl = (url?.searchParams.get("server") ?? fields.serverUrl).trim();
208750
209204
  const transport = requestedTransport === "webrtc" ? "webrtc" : resolveTransportForServerUrl(serverUrl);
208751
209205
  const signalingValue = url?.searchParams.get("signaling");
208752
- const signaling = signalingValue?.split(",").map((entry2) => entry2.trim()).filter((entry2) => entry2.length > 0);
209206
+ const signaling = signalingValue?.split(",").map((entry3) => entry3.trim()).filter((entry3) => entry3.length > 0);
208753
209207
  return {
208754
209208
  roomId,
208755
209209
  userName,
@@ -208902,11 +209356,11 @@ function buildTextBuildSpec(elementId, paraIndex, runs, states) {
208902
209356
  );
208903
209357
  if (hasCharBuild) {
208904
209358
  const spans = characters.map(
208905
- (entry2, index) => stateSpan(
209359
+ (entry3, index) => stateSpan(
208906
209360
  `${elementId}${TEXT_BUILD_ID_SEP}c${paraIndex}-${index}`,
208907
- entry2.ch,
209361
+ entry3.ch,
208908
209362
  states,
208909
- entry2.style
209363
+ entry3.style
208910
209364
  )
208911
209365
  );
208912
209366
  return { granularity: "char", spans };
@@ -209215,17 +209669,17 @@ function createViewerStore(initial) {
209215
209669
  return;
209216
209670
  }
209217
209671
  notifiedState = state;
209218
- for (const entry2 of [...selectors]) {
209219
- if (!selectors.has(entry2)) {
209672
+ for (const entry3 of [...selectors]) {
209673
+ if (!selectors.has(entry3)) {
209220
209674
  continue;
209221
209675
  }
209222
- const next = entry2.select(state);
209223
- const previous = entry2.last;
209224
- if (entry2.equal(previous, next)) {
209676
+ const next = entry3.select(state);
209677
+ const previous = entry3.last;
209678
+ if (entry3.equal(previous, next)) {
209225
209679
  continue;
209226
209680
  }
209227
- entry2.last = next;
209228
- entry2.notify(next, previous);
209681
+ entry3.last = next;
209682
+ entry3.notify(next, previous);
209229
209683
  }
209230
209684
  for (const listener of [...listeners2]) {
209231
209685
  if (listeners2.has(listener)) {
@@ -209250,15 +209704,15 @@ function createViewerStore(initial) {
209250
209704
  };
209251
209705
  },
209252
209706
  subscribeSelector(selector, listener, isEqual) {
209253
- const entry2 = {
209707
+ const entry3 = {
209254
209708
  select: selector,
209255
209709
  notify: listener,
209256
209710
  equal: isEqual ?? defaultEqual,
209257
209711
  last: selector(state)
209258
209712
  };
209259
- selectors.add(entry2);
209713
+ selectors.add(entry3);
209260
209714
  return () => {
209261
- selectors.delete(entry2);
209715
+ selectors.delete(entry3);
209262
209716
  };
209263
209717
  },
209264
209718
  batch(write) {
@@ -210503,6 +210957,9 @@ function mapEditorKey(input, guard = {}) {
210503
210957
  if (mod && !alt && key2.toLowerCase() === "h") {
210504
210958
  return { action: "findReplace" };
210505
210959
  }
210960
+ if (mod && alt && key2.toLowerCase() === "v" && !state.isTextInputTarget) {
210961
+ return state.canPaste === false ? NO_ACTION : { action: "pasteSpecial" };
210962
+ }
210506
210963
  if (mod && !alt) {
210507
210964
  const liveFormat = resolveLiveFormatChord(key2, Boolean(input.shiftKey));
210508
210965
  if (liveFormat) {
@@ -210669,6 +211126,11 @@ var LABEL_KEYS = {
210669
211126
  "table-split": "pptx.contextMenu.splitCell",
210670
211127
  group: "pptx.contextMenu.group",
210671
211128
  ungroup: "pptx.contextMenu.ungroup",
211129
+ "edit-text": "pptx.contextMenu.editText",
211130
+ "save-as-picture": "pptx.contextMenu.saveAsPicture",
211131
+ "edit-alt-text": "pptx.contextMenu.editAltText",
211132
+ "size-and-position": "pptx.contextMenu.sizeAndPosition",
211133
+ "format-shape": "pptx.contextMenu.formatShape",
210672
211134
  delete: "pptx.contextMenu.delete"
210673
211135
  };
210674
211136
  function entry(id, extra = {}) {
@@ -210698,6 +211160,7 @@ function tableEntries(table2) {
210698
211160
  entry("table-merge-down")
210699
211161
  ];
210700
211162
  }
211163
+ var TEXT_EDITABLE_ELEMENT_TYPES = /* @__PURE__ */ new Set(["text", "shape"]);
210701
211164
  function buildContextMenuEntries(context = {}) {
210702
211165
  const { elementType, table: table2, hasMultiSelection, aiEnabled, hasClipboard, selectionGroupable } = context;
210703
211166
  const lockedOut = selectionGroupable === false;
@@ -210705,12 +211168,17 @@ function buildContextMenuEntries(context = {}) {
210705
211168
  entry("copy"),
210706
211169
  entry("cut"),
210707
211170
  entry("paste", hasClipboard === false ? { disabled: true } : {}),
210708
- entry("duplicate"),
211171
+ entry("duplicate")
211172
+ ];
211173
+ if (elementType && TEXT_EDITABLE_ELEMENT_TYPES.has(elementType)) {
211174
+ entries.push(entry("edit-text"));
211175
+ }
211176
+ entries.push(
210709
211177
  entry("bring-forward", { separatorBefore: true }),
210710
211178
  entry("send-backward"),
210711
211179
  entry("bring-front"),
210712
211180
  entry("send-back")
210713
- ];
211181
+ );
210714
211182
  if (aiEnabled) {
210715
211183
  entries.push(entry("ai-ask", { separatorBefore: true }), entry("ai-fix"));
210716
211184
  }
@@ -210730,13 +211198,108 @@ function buildContextMenuEntries(context = {}) {
210730
211198
  );
210731
211199
  }
210732
211200
  entries.push(
210733
- entry("delete", {
210734
- separatorBefore: !hasMultiSelection && elementType !== "group",
210735
- danger: true
210736
- })
211201
+ entry("save-as-picture", { separatorBefore: true }),
211202
+ entry("edit-alt-text"),
211203
+ entry("size-and-position"),
211204
+ entry("format-shape")
210737
211205
  );
211206
+ entries.push(entry("delete", { separatorBefore: true, danger: true }));
210738
211207
  return entries;
210739
211208
  }
211209
+ var INSPECTOR_SECTION_ATTRIBUTE = "data-pptx-inspector-section";
211210
+ function contextMenuInspectorAnchor(id) {
211211
+ switch (id) {
211212
+ case "size-and-position":
211213
+ return "transform";
211214
+ case "format-shape":
211215
+ return "fill-stroke";
211216
+ case "edit-alt-text":
211217
+ return "alt-text";
211218
+ default:
211219
+ return null;
211220
+ }
211221
+ }
211222
+ function scrollInspectorSectionIntoView(doc, anchor) {
211223
+ const node = doc.querySelector(`[${INSPECTOR_SECTION_ATTRIBUTE}="${anchor}"]`);
211224
+ node?.scrollIntoView({ behavior: "smooth", block: "start" });
211225
+ }
211226
+ var PASTE_SPECIAL_OPTIONS = [
211227
+ { id: "keep-source-formatting", labelKey: "pptx.pasteSpecial.keepSourceFormatting" },
211228
+ { id: "use-destination-theme", labelKey: "pptx.pasteSpecial.useDestinationTheme" },
211229
+ { id: "picture", labelKey: "pptx.pasteSpecial.picture" },
211230
+ { id: "keep-text-only", labelKey: "pptx.pasteSpecial.keepTextOnly" }
211231
+ ];
211232
+ function pasteElementHasText(element) {
211233
+ return "text" in element && typeof element.text === "string" && element.text.trim().length > 0;
211234
+ }
211235
+ function stripSourceThemeOverrides(element) {
211236
+ const next = structuredClone(element);
211237
+ if ("shapeStyle" in next && next.shapeStyle) {
211238
+ const style = { ...next.shapeStyle };
211239
+ delete style.fillColor;
211240
+ delete style.fillColorRef;
211241
+ delete style.strokeColor;
211242
+ delete style.strokeColorRef;
211243
+ next.shapeStyle = style;
211244
+ }
211245
+ if ("textStyle" in next && next.textStyle) {
211246
+ const style = { ...next.textStyle };
211247
+ delete style.color;
211248
+ delete style.fontFamily;
211249
+ next.textStyle = style;
211250
+ }
211251
+ if ("textSegments" in next && Array.isArray(next.textSegments)) {
211252
+ next.textSegments = next.textSegments.map((segment) => {
211253
+ const style = segment.style ? { ...segment.style } : void 0;
211254
+ if (!style) {
211255
+ return segment;
211256
+ }
211257
+ delete style.color;
211258
+ delete style.fontFamily;
211259
+ return { ...segment, style };
211260
+ });
211261
+ }
211262
+ return next;
211263
+ }
211264
+ function toTextOnly(element) {
211265
+ if (!pasteElementHasText(element)) {
211266
+ return element;
211267
+ }
211268
+ return {
211269
+ type: "text",
211270
+ id: element.id,
211271
+ x: element.x,
211272
+ y: element.y,
211273
+ width: element.width,
211274
+ height: element.height,
211275
+ rotation: element.rotation,
211276
+ text: "text" in element ? element.text : void 0
211277
+ };
211278
+ }
211279
+ function applyPasteSpecialFormat(element, format) {
211280
+ switch (format) {
211281
+ case "use-destination-theme":
211282
+ return stripSourceThemeOverrides(element);
211283
+ case "keep-text-only":
211284
+ return toTextOnly(element);
211285
+ case "keep-source-formatting":
211286
+ case "picture":
211287
+ default:
211288
+ return element;
211289
+ }
211290
+ }
211291
+ function buildRasterPictureElement(element, dataUrl) {
211292
+ return {
211293
+ type: "picture",
211294
+ id: element.id,
211295
+ x: element.x,
211296
+ y: element.y,
211297
+ width: element.width,
211298
+ height: element.height,
211299
+ rotation: element.rotation,
211300
+ imageData: dataUrl
211301
+ };
211302
+ }
210740
211303
  var ACTION_BUTTON_PRESETS = [
210741
211304
  {
210742
211305
  shapeType: "actionButtonBackPrevious",
@@ -212602,9 +213165,9 @@ var mentionMatchScore = (author, needle) => {
212602
213165
  };
212603
213166
  function matchCommentMentionAuthors(authors, query, limit = 6) {
212604
213167
  const needle = String(query ?? "").trim().toLowerCase();
212605
- const scored = authors.filter((author) => author.id && author.name).map((author) => ({ author, score: mentionMatchScore(author, needle) })).filter((entry2) => entry2.score >= 0);
213168
+ const scored = authors.filter((author) => author.id && author.name).map((author) => ({ author, score: mentionMatchScore(author, needle) })).filter((entry3) => entry3.score >= 0);
212606
213169
  scored.sort((a, b) => a.score - b.score || a.author.name.localeCompare(b.author.name));
212607
- return scored.slice(0, limit).map((entry2) => entry2.author);
213170
+ return scored.slice(0, limit).map((entry3) => entry3.author);
212608
213171
  }
212609
213172
  function defaultMentionId() {
212610
213173
  if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
@@ -212800,7 +213363,7 @@ var DEFAULT_CHART_POSITION = { x: 120, y: 120, width: 480, height: 320 };
212800
213363
  var DEFAULT_CATEGORIES = ["Category 1", "Category 2", "Category 3"];
212801
213364
  var DEFAULT_SERIES_VALUES = [4, 3, 5];
212802
213365
  function createDefaultChartElement(chartKind = DEFAULT_INSERT_CHART_KIND, position2) {
212803
- const option = INSERT_CHART_TYPES.find((entry2) => entry2.id === chartKind);
213366
+ const option = INSERT_CHART_TYPES.find((entry3) => entry3.id === chartKind);
212804
213367
  const chartType = option?.type ?? chartKind;
212805
213368
  const chartExData = buildChartExInsertData(option?.id ?? chartKind);
212806
213369
  return createChartElement(
@@ -213029,6 +213592,71 @@ var MEDIA_FULLSCREEN_OVERLAY_STYLE = {
213029
213592
  function shouldShowMediaFullscreenStopButton(input) {
213030
213593
  return isMediaFullscreenActive(input);
213031
213594
  }
213595
+ var ONLINE_VIDEO_IFRAME_ALLOW = "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen";
213596
+ var ONLINE_VIDEO_IFRAME_SANDBOX = "allow-scripts allow-same-origin allow-popups allow-presentation";
213597
+ function youtubeVideoId(url) {
213598
+ const host = url.hostname.replace(/^www\./, "").toLowerCase();
213599
+ if (host === "youtu.be") {
213600
+ const id = url.pathname.split("/").filter(Boolean)[0];
213601
+ return id || void 0;
213602
+ }
213603
+ if (host !== "youtube.com" && host !== "m.youtube.com" && host !== "youtube-nocookie.com") {
213604
+ return void 0;
213605
+ }
213606
+ if (url.pathname.startsWith("/embed/")) {
213607
+ return url.pathname.slice("/embed/".length).split("/")[0] || void 0;
213608
+ }
213609
+ const watchId = url.searchParams.get("v");
213610
+ if (watchId) {
213611
+ return watchId;
213612
+ }
213613
+ const shortsMatch = /^\/shorts\/([^/]+)/.exec(url.pathname);
213614
+ if (shortsMatch) {
213615
+ return shortsMatch[1];
213616
+ }
213617
+ return void 0;
213618
+ }
213619
+ function vimeoVideoId(url) {
213620
+ const host = url.hostname.replace(/^www\./, "").toLowerCase();
213621
+ if (host === "player.vimeo.com") {
213622
+ const match2 = /^\/video\/(\d+)/.exec(url.pathname);
213623
+ return match2?.[1];
213624
+ }
213625
+ if (host !== "vimeo.com") {
213626
+ return void 0;
213627
+ }
213628
+ const match = /^\/(?:channels\/[^/]+\/|groups\/[^/]+\/videos\/)?(\d+)/.exec(url.pathname);
213629
+ return match?.[1];
213630
+ }
213631
+ function resolveOnlineVideoEmbed(mediaPath, isLinked) {
213632
+ if (!isLinked || !mediaPath) {
213633
+ return void 0;
213634
+ }
213635
+ let url;
213636
+ try {
213637
+ url = new URL(mediaPath);
213638
+ } catch {
213639
+ return void 0;
213640
+ }
213641
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
213642
+ return void 0;
213643
+ }
213644
+ const youtubeId = youtubeVideoId(url);
213645
+ if (youtubeId) {
213646
+ return { embedUrl: `https://www.youtube.com/embed/${youtubeId}` };
213647
+ }
213648
+ const vimeoId = vimeoVideoId(url);
213649
+ if (vimeoId) {
213650
+ return { embedUrl: `https://player.vimeo.com/video/${vimeoId}` };
213651
+ }
213652
+ return void 0;
213653
+ }
213654
+ function getOnlineVideoEmbed(element) {
213655
+ if (element.type !== "media" || element.mediaType !== "video") {
213656
+ return void 0;
213657
+ }
213658
+ return resolveOnlineVideoEmbed(element.mediaPath, element.isLinked);
213659
+ }
213032
213660
  function scheduleMediaTrimAndFade(el, source) {
213033
213661
  const trimStartSec = source.trimStartMs !== void 0 && source.trimStartMs > 0 ? source.trimStartMs / 1e3 : 0;
213034
213662
  const trimEndDistanceSec = source.trimEndMs !== void 0 && source.trimEndMs > 0 ? source.trimEndMs / 1e3 : 0;
@@ -213182,25 +213810,25 @@ function registerPersistentAudio(elementId, dataUrl, mimetype, loop, volume, tri
213182
213810
  });
213183
213811
  }
213184
213812
  function stopAllPersistentAudio() {
213185
- for (const entry2 of persistentAudioMap.values()) {
213186
- entry2.audio.pause();
213187
- entry2.audio.remove();
213813
+ for (const entry3 of persistentAudioMap.values()) {
213814
+ entry3.audio.pause();
213815
+ entry3.audio.remove();
213188
213816
  }
213189
213817
  persistentAudioMap.clear();
213190
213818
  }
213191
213819
  function pauseAllPersistentAudio() {
213192
- for (const entry2 of persistentAudioMap.values()) {
213193
- if (!entry2.audio.paused) {
213194
- entry2.pausedByVisibility = true;
213195
- entry2.audio.pause();
213820
+ for (const entry3 of persistentAudioMap.values()) {
213821
+ if (!entry3.audio.paused) {
213822
+ entry3.pausedByVisibility = true;
213823
+ entry3.audio.pause();
213196
213824
  }
213197
213825
  }
213198
213826
  }
213199
213827
  function resumeAllPersistentAudio() {
213200
- for (const entry2 of persistentAudioMap.values()) {
213201
- if (entry2.pausedByVisibility) {
213202
- entry2.pausedByVisibility = false;
213203
- void entry2.audio.play().catch(() => {
213828
+ for (const entry3 of persistentAudioMap.values()) {
213829
+ if (entry3.pausedByVisibility) {
213830
+ entry3.pausedByVisibility = false;
213831
+ void entry3.audio.play().catch(() => {
213204
213832
  });
213205
213833
  }
213206
213834
  }
@@ -213317,7 +213945,12 @@ function buildSummaryZoomView(element, lookup, translate) {
213317
213945
  ariaLabel: translate ? translate("pptx.zoom.ariaLabelSummaryTile", {
213318
213946
  section: label,
213319
213947
  number: String(slideNumber)
213320
- }) : `Zoom to section ${label}, slide ${slideNumber}`
213948
+ }) : `Zoom to section ${label}, slide ${slideNumber}`,
213949
+ // `CT_ZoomObjectProperties/@returnToParent`'s schema default is `true`
213950
+ // when absent (see `ZoomPptxElement.returnToParent`'s doc comment), so
213951
+ // this reads the effective value, not `Boolean(target.returnToParent)`.
213952
+ returnToParent: target.returnToParent !== false,
213953
+ transitionDurationMs: target.transitionDurationMs
213321
213954
  };
213322
213955
  });
213323
213956
  return {
@@ -213983,7 +214616,7 @@ function imageFile(clipboard) {
213983
214616
  if (!clipboard) {
213984
214617
  return null;
213985
214618
  }
213986
- const file = Array.from(clipboard.files).find((entry2) => entry2.type.startsWith("image/"));
214619
+ const file = Array.from(clipboard.files).find((entry3) => entry3.type.startsWith("image/"));
213987
214620
  if (file) {
213988
214621
  return file;
213989
214622
  }
@@ -214884,6 +215517,56 @@ function runProgramNoticeStackStyle() {
214884
215517
  pointerEvents: "none"
214885
215518
  };
214886
215519
  }
215520
+ function resolveZoomNavigationTarget(element) {
215521
+ if (element.zoomType === "summary") {
215522
+ return void 0;
215523
+ }
215524
+ return {
215525
+ targetSlideIndex: element.targetSlideIndex,
215526
+ targetSectionId: element.targetSectionId,
215527
+ returnToParent: element.returnToParent !== false,
215528
+ transitionDurationMs: element.transitionDurationMs
215529
+ };
215530
+ }
215531
+ function resolveZoomExcursionEndIndex(target, slides) {
215532
+ if (!target.targetSectionId) {
215533
+ return target.targetSlideIndex;
215534
+ }
215535
+ let end = target.targetSlideIndex;
215536
+ for (let i2 = target.targetSlideIndex + 1; i2 < slides.length; i2++) {
215537
+ if (slides[i2]?.sectionId !== target.targetSectionId) {
215538
+ break;
215539
+ }
215540
+ end = i2;
215541
+ }
215542
+ return end;
215543
+ }
215544
+ function beginZoomExcursion(target, returnSlideIndex, slides) {
215545
+ if (!target.returnToParent) {
215546
+ return void 0;
215547
+ }
215548
+ return {
215549
+ returnSlideIndex,
215550
+ endSlideIndex: resolveZoomExcursionEndIndex(target, slides),
215551
+ transitionDurationMs: target.transitionDurationMs
215552
+ };
215553
+ }
215554
+ function resolveForwardSlideWithZoomReturn(currentSlideIndex, naturalNextIndex, excursion) {
215555
+ if (excursion && currentSlideIndex === excursion.endSlideIndex) {
215556
+ return {
215557
+ nextSlideIndex: excursion.returnSlideIndex,
215558
+ excursion: void 0,
215559
+ returnedToZoom: true
215560
+ };
215561
+ }
215562
+ return { nextSlideIndex: naturalNextIndex, excursion, returnedToZoom: false };
215563
+ }
215564
+ function buildZoomTransitionOverride(transitionDurationMs) {
215565
+ if (typeof transitionDurationMs !== "number" || transitionDurationMs <= 0) {
215566
+ return void 0;
215567
+ }
215568
+ return { type: "zoom", durationMs: transitionDurationMs };
215569
+ }
214887
215570
  var COMMAND_SEARCH_ENTRIES = [
214888
215571
  // Format
214889
215572
  { labelKey: "pptx.textPanel.bold", command: "format.bold", icon: "bold", category: "format" },
@@ -215059,7 +215742,7 @@ function filterCommands(query, resolveLabel) {
215059
215742
  }
215060
215743
  const lowerQuery = query.toLowerCase();
215061
215744
  return COMMAND_SEARCH_ENTRIES.filter(
215062
- (entry2) => resolveLabel(entry2.labelKey).toLowerCase().includes(lowerQuery)
215745
+ (entry3) => resolveLabel(entry3.labelKey).toLowerCase().includes(lowerQuery)
215063
215746
  );
215064
215747
  }
215065
215748
  var sourceIdentities = /* @__PURE__ */ new WeakMap();
@@ -215977,7 +216660,7 @@ function resolveOleVerbTarget(slide, elementId, verb) {
215977
216660
  if (!elementId || !slide) {
215978
216661
  return void 0;
215979
216662
  }
215980
- const element = flattenSlideElements(slide.elements).find((entry2) => entry2.id === elementId);
216663
+ const element = flattenSlideElements(slide.elements).find((entry3) => entry3.id === elementId);
215981
216664
  if (!element || element.type !== "ole" || !element.oleEmbeddedData) {
215982
216665
  return void 0;
215983
216666
  }
@@ -216349,7 +217032,7 @@ var DEFAULT_QUICK_ACCESS_COMMAND_IDS = [
216349
217032
  "presentFromStart"
216350
217033
  ];
216351
217034
  function getQuickAccessCommand(id) {
216352
- return QUICK_ACCESS_COMMAND_CATALOG.find((entry2) => entry2.id === id);
217035
+ return QUICK_ACCESS_COMMAND_CATALOG.find((entry3) => entry3.id === id);
216353
217036
  }
216354
217037
  var DEDICATED_QUICK_ACCESS_IDS = /* @__PURE__ */ new Set(["save", "undo", "redo"]);
216355
217038
  function extraQuickAccessCommands(commandIds) {
@@ -216368,7 +217051,7 @@ function extraQuickAccessCommands(commandIds) {
216368
217051
  return extras;
216369
217052
  }
216370
217053
  function availableQuickAccessCommands(commandIds) {
216371
- return QUICK_ACCESS_COMMAND_CATALOG.filter((entry2) => !commandIds.includes(entry2.id));
217054
+ return QUICK_ACCESS_COMMAND_CATALOG.filter((entry3) => !commandIds.includes(entry3.id));
216372
217055
  }
216373
217056
  function addQuickAccessCommand(commandIds, id) {
216374
217057
  if (commandIds.includes(id) || !getQuickAccessCommand(id)) {
@@ -216377,7 +217060,7 @@ function addQuickAccessCommand(commandIds, id) {
216377
217060
  return [...commandIds, id];
216378
217061
  }
216379
217062
  function removeQuickAccessCommand(commandIds, id) {
216380
- return commandIds.filter((entry2) => entry2 !== id);
217063
+ return commandIds.filter((entry3) => entry3 !== id);
216381
217064
  }
216382
217065
  function moveQuickAccessCommand(commandIds, id, direction) {
216383
217066
  const index = commandIds.indexOf(id);
@@ -216561,7 +217244,7 @@ function mergeViewerOptions(stored) {
216561
217244
  const defaultValue = defaults[key2];
216562
217245
  if (Array.isArray(defaultValue)) {
216563
217246
  if (Array.isArray(value)) {
216564
- target[key2] = value.filter((entry2) => typeof entry2 === "string");
217247
+ target[key2] = value.filter((entry3) => typeof entry3 === "string");
216565
217248
  }
216566
217249
  } else if (typeof value === typeof defaultValue) {
216567
217250
  target[key2] = value;
@@ -218357,19 +219040,19 @@ function describeCell3D(cell3D) {
218357
219040
  isSet: cell3D !== void 0
218358
219041
  };
218359
219042
  }
218360
- function describeTableStyleEditor(entry2, selectedPart, themeColorMap) {
218361
- if (!entry2) {
219043
+ function describeTableStyleEditor(entry3, selectedPart, themeColorMap) {
219044
+ if (!entry3) {
218362
219045
  return void 0;
218363
219046
  }
218364
- const keyed = entry2;
219047
+ const keyed = entry3;
218365
219048
  const hasTextAndBorders = isTableStylePartName(selectedPart);
218366
- const fill = selectedPart === "background" ? entry2.tableBackground?.fill : keyed[`${selectedPart}Fill`];
219049
+ const fill = selectedPart === "background" ? entry3.tableBackground?.fill : keyed[`${selectedPart}Fill`];
218367
219050
  const text22 = hasTextAndBorders ? keyed[`${selectedPart}Text`] : void 0;
218368
219051
  const borders = hasTextAndBorders ? keyed[`${selectedPart}Borders`] : void 0;
218369
219052
  const cell3D = hasTextAndBorders ? keyed[`${selectedPart}Cell3D`] : void 0;
218370
219053
  return {
218371
- styleId: entry2.styleId,
218372
- styleName: entry2.styleName ?? "",
219054
+ styleId: entry3.styleId,
219055
+ styleName: entry3.styleName ?? "",
218373
219056
  selectedPart,
218374
219057
  hasTextAndBorders,
218375
219058
  fill: describeFill(fill, themeColorMap),
@@ -218382,11 +219065,11 @@ function patchBorderSide(borders, side, patch) {
218382
219065
  const current = borders?.[side] ?? {};
218383
219066
  return { ...borders, [side]: { ...current, ...patch } };
218384
219067
  }
218385
- function applyTableStyleFieldEdit(entry2, part, edit) {
219068
+ function applyTableStyleFieldEdit(entry3, part, edit) {
218386
219069
  if (part === "background") {
218387
- return applyBackgroundEdit(entry2, edit);
219070
+ return applyBackgroundEdit(entry3, edit);
218388
219071
  }
218389
- const keyed = entry2;
219072
+ const keyed = entry3;
218390
219073
  const fillKey = `${part}Fill`;
218391
219074
  const textKey = `${part}Text`;
218392
219075
  const bordersKey = `${part}Borders`;
@@ -218480,7 +219163,7 @@ function applyTableStyleFieldEdit(entry2, part, edit) {
218480
219163
  return {
218481
219164
  entry: nextEntry,
218482
219165
  payload: {
218483
- styleId: entry2.styleId,
219166
+ styleId: entry3.styleId,
218484
219167
  section: part,
218485
219168
  ...isTableStylePartName(part) ? {
218486
219169
  fill: keyed[fillKey],
@@ -218491,8 +219174,8 @@ function applyTableStyleFieldEdit(entry2, part, edit) {
218491
219174
  }
218492
219175
  };
218493
219176
  }
218494
- function applyBackgroundEdit(entry2, edit) {
218495
- const current = entry2.tableBackground;
219177
+ function applyBackgroundEdit(entry3, edit) {
219178
+ const current = entry3.tableBackground;
218496
219179
  let nextBackground = current;
218497
219180
  if (edit.kind === "fillColor") {
218498
219181
  nextBackground = { ...current, fill: colorToFill(edit.hex, edit.ref), fillRef: void 0 };
@@ -218506,10 +219189,10 @@ function applyBackgroundEdit(entry2, edit) {
218506
219189
  }
218507
219190
  };
218508
219191
  }
218509
- const nextEntry = { ...entry2, tableBackground: nextBackground };
219192
+ const nextEntry = { ...entry3, tableBackground: nextBackground };
218510
219193
  return {
218511
219194
  entry: nextEntry,
218512
- payload: { styleId: entry2.styleId, section: "background" }
219195
+ payload: { styleId: entry3.styleId, section: "background" }
218513
219196
  };
218514
219197
  }
218515
219198
  init_chart_title_runs();
@@ -219230,8 +219913,8 @@ function createElementClass() {
219230
219913
  }
219231
219914
  if (win && "IntersectionObserver" in win) {
219232
219915
  this.#intersect = new win.IntersectionObserver((entries) => {
219233
- const entry2 = entries[entries.length - 1];
219234
- this.#visible = entry2 ? entry2.isIntersecting : true;
219916
+ const entry3 = entries[entries.length - 1];
219917
+ this.#visible = entry3 ? entry3.isIntersecting : true;
219235
219918
  if (this.#visible) {
219236
219919
  this.#controller?.remeasure(true);
219237
219920
  }
@@ -221137,8 +221820,8 @@ stream
221137
221820
  endobj
221138
221821
  `
221139
221822
  );
221140
- const contentStream = pageImages.map((entry2, idx) => {
221141
- const { x, y, width, height } = entry2.placement;
221823
+ const contentStream = pageImages.map((entry3, idx) => {
221824
+ const { x, y, width, height } = entry3.placement;
221142
221825
  const rawY = PAGE_H - y - height;
221143
221826
  return `q ${width.toFixed(2)} 0 0 ${height.toFixed(2)} ${x.toFixed(2)} ${rawY.toFixed(2)} cm /Img${idx} Do Q`;
221144
221827
  }).join(" ");
@@ -222144,6 +222827,22 @@ async function rasterResultToPngBlob(result) {
222144
222827
  }, "image/png");
222145
222828
  });
222146
222829
  }
222830
+ async function rasterResultToPngDataUrl(result) {
222831
+ if (result.kind === "canvas") {
222832
+ return result.canvas.toDataURL("image/png");
222833
+ }
222834
+ const blob = await rasterResultToPngBlob(result);
222835
+ return new Promise((resolve2, reject) => {
222836
+ const reader = new FileReader();
222837
+ reader.onloadend = () => resolve2(reader.result);
222838
+ reader.onerror = reject;
222839
+ reader.readAsDataURL(blob);
222840
+ });
222841
+ }
222842
+ function elementPictureFilename(elementName, fallbackLabel) {
222843
+ const base = elementName?.trim() || fallbackLabel;
222844
+ return sanitizeDownloadFilename(`${base}.png`);
222845
+ }
222147
222846
  registerPptxWebControls();
222148
222847
  // `@preserve` (CT_SlideMaster, ECMA-376 §19.3.1.38): mirrors the
222149
222848
  /**
@@ -222288,6 +222987,8 @@ exports.NOTES_FONT_SIZE_MIN = NOTES_FONT_SIZE_MIN;
222288
222987
  exports.NOTES_FONT_SIZE_STEP = NOTES_FONT_SIZE_STEP;
222289
222988
  exports.NUM = NUM;
222290
222989
  exports.OFFICE_COLOR_SWATCHES = OFFICE_COLOR_SWATCHES;
222990
+ exports.ONLINE_VIDEO_IFRAME_ALLOW = ONLINE_VIDEO_IFRAME_ALLOW;
222991
+ exports.ONLINE_VIDEO_IFRAME_SANDBOX = ONLINE_VIDEO_IFRAME_SANDBOX;
222291
222992
  exports.OUTLINE_LEVEL_ATTR = OUTLINE_LEVEL_ATTR;
222292
222993
  exports.OUTLINE_ROW_ATTR = OUTLINE_ROW_ATTR;
222293
222994
  exports.OUTLINE_SLIDE_ATTR = OUTLINE_SLIDE_ATTR;
@@ -222295,6 +222996,7 @@ exports.OUTLINE_VIEW_ATTR = OUTLINE_VIEW_ATTR;
222295
222996
  exports.P14_TRANSITION_KEYFRAMES = P14_TRANSITION_KEYFRAMES;
222296
222997
  exports.P14_TRANSITION_KEYFRAMES_2 = P14_TRANSITION_KEYFRAMES_2;
222297
222998
  exports.P14_TRANSITION_KEYFRAMES_ALL = P14_TRANSITION_KEYFRAMES_ALL;
222999
+ exports.PASTE_SPECIAL_OPTIONS = PASTE_SPECIAL_OPTIONS;
222298
223000
  exports.PATTERN_OPTIONS = PATTERN_OPTIONS;
222299
223001
  exports.PATTERN_PRESET_OPTIONS = PATTERN_PRESET_OPTIONS;
222300
223002
  exports.PDF_SLIDES_PAGE_HEIGHT_PT = PDF_SLIDES_PAGE_HEIGHT_PT;
@@ -222370,6 +223072,7 @@ exports.TRANSITION_SOUND_NONE_VALUE = TRANSITION_SOUND_NONE_VALUE;
222370
223072
  exports.TRANSITION_SOUND_OTHER_VALUE = TRANSITION_SOUND_OTHER_VALUE;
222371
223073
  exports.TRANSITION_SPEED_DURATION_MS = TRANSITION_SPEED_DURATION_MS;
222372
223074
  exports.TRANSITION_SPEED_OPTIONS = TRANSITION_SPEED_OPTIONS;
223075
+ exports.TRIGGER_OPTIONS = TRIGGER_OPTIONS;
222373
223076
  exports.ThemePresets = ThemePresets;
222374
223077
  exports.VIEWER_OPTIONS_TABS = VIEWER_OPTIONS_TABS;
222375
223078
  exports.VIEWER_PREFS_STORAGE_KEY = VIEWER_PREFS_STORAGE_KEY;
@@ -222424,6 +223127,7 @@ exports.applyOleDocumentParagraphEdit = applyOleDocumentParagraphEdit;
222424
223127
  exports.applyOleNestedDeckElementTextEdit = applyOleNestedDeckElementTextEdit;
222425
223128
  exports.applyOleSheetCellEdit = applyOleSheetCellEdit;
222426
223129
  exports.applyOutlineEdit = applyOutlineEdit;
223130
+ exports.applyPasteSpecialFormat = applyPasteSpecialFormat;
222427
223131
  exports.applyPreferenceToOptions = applyPreferenceToOptions;
222428
223132
  exports.applyReadingViewCommand = applyReadingViewCommand;
222429
223133
  exports.applyRehearsalTimings = applyRehearsalTimings;
@@ -222453,6 +223157,7 @@ exports.bar3DShapePatch = bar3DShapePatch;
222453
223157
  exports.beginChartMarkDrag = beginChartMarkDrag;
222454
223158
  exports.beginChartValueDrag = beginChartValueDrag;
222455
223159
  exports.beginShapeAdjustment = beginShapeAdjustment;
223160
+ exports.beginZoomExcursion = beginZoomExcursion;
222456
223161
  exports.bindInlineListParagraph = bindInlineListParagraph;
222457
223162
  exports.bindInlineListRun = bindInlineListRun;
222458
223163
  exports.borrowExternalCollaborationAwareness = borrowExternalCollaborationAwareness;
@@ -222509,6 +223214,7 @@ exports.buildPreviewAnimation = buildPreviewAnimation;
222509
223214
  exports.buildPreviewElements = buildPreviewElements;
222510
223215
  exports.buildPrintDocument = buildPrintDocument;
222511
223216
  exports.buildPrintHtmlDocument = buildPrintHtmlDocument;
223217
+ exports.buildRasterPictureElement = buildRasterPictureElement;
222512
223218
  exports.buildRectPathGradient = buildRectPathGradient;
222513
223219
  exports.buildRunProgramNotice = buildRunProgramNotice;
222514
223220
  exports.buildRunTabLines = buildRunTabLines;
@@ -222537,6 +223243,7 @@ exports.buildThemeColorMap = buildThemeColorMap;
222537
223243
  exports.buildThemeColorSwatchGrid = buildThemeColorSwatchGrid;
222538
223244
  exports.buildTiledSlidesPdfBytes = buildTiledSlidesPdfBytes;
222539
223245
  exports.buildUserFontFaceStyles = buildUserFontFaceStyles;
223246
+ exports.buildZoomTransitionOverride = buildZoomTransitionOverride;
222540
223247
  exports.calculateViewportFit = calculateViewportFit;
222541
223248
  exports.canAddTopLevelNode = canAddTopLevelNode;
222542
223249
  exports.canCommitActionType = canCommitActionType;
@@ -222620,6 +223327,7 @@ exports.computeSnapToShape = computeSnapToShape;
222620
223327
  exports.computeSplitCell = computeSplitCell;
222621
223328
  exports.computeVirtualRange = computeVirtualRange;
222622
223329
  exports.connectorWrapperTransform = connectorWrapperTransform;
223330
+ exports.contextMenuInspectorAnchor = contextMenuInspectorAnchor;
222623
223331
  exports.convertLatexToOmml = convertLatexToOmml;
222624
223332
  exports.convertOmmlToLatex = convertOmmlToLatex;
222625
223333
  exports.convertOmmlToMathMl = convertOmmlToMathMl;
@@ -222684,6 +223392,7 @@ exports.elementContainerHeightStyle = elementContainerHeightStyle;
222684
223392
  exports.elementHitTargetStyle = elementHitTargetStyle;
222685
223393
  exports.elementIdSelector = elementIdSelector;
222686
223394
  exports.elementLockTogglePatch = elementLockTogglePatch;
223395
+ exports.elementPictureFilename = elementPictureFilename;
222687
223396
  exports.encodeGif = encodeGif;
222688
223397
  exports.endAudienceDisplay = endAudienceDisplay;
222689
223398
  exports.ensureActionAffordanceStyles = ensureActionAffordanceStyles;
@@ -222785,6 +223494,7 @@ exports.getOleObjectTypeLabel = getOleObjectTypeLabel;
222785
223494
  exports.getOleSheetGrid = getOleSheetGrid;
222786
223495
  exports.getOleTypeColor = getOleTypeColor;
222787
223496
  exports.getOleTypeLabel = getOleTypeLabel;
223497
+ exports.getOnlineVideoEmbed = getOnlineVideoEmbed;
222788
223498
  exports.getOverflowSegments = getOverflowSegments;
222789
223499
  exports.getP14TransitionAnimations = getP14TransitionAnimations;
222790
223500
  exports.getPatternSvg = getPatternSvg;
@@ -222937,6 +223647,7 @@ exports.observeElementHeight = observeElementHeight;
222937
223647
  exports.observeExternalCollaborationReadiness = observeExternalCollaborationReadiness;
222938
223648
  exports.observeExternalCollaborationSession = observeExternalCollaborationSession;
222939
223649
  exports.observeYDocSlides = observeYDocSlides;
223650
+ exports.oleActionsVisible = oleActionsVisible;
222940
223651
  exports.ooxmlGradientAngleToCssDegrees = ooxmlGradientAngleToCssDegrees;
222941
223652
  exports.openNativeEyeDropper = openNativeEyeDropper;
222942
223653
  exports.openPendingPrintWindow = openPendingPrintWindow;
@@ -222991,6 +223702,7 @@ exports.pushRecentColor = pushRecentColor;
222991
223702
  exports.quickStyleSwatchCss = quickStyleSwatchCss;
222992
223703
  exports.radarStylePatch = radarStylePatch;
222993
223704
  exports.rasterResultToPngBlob = rasterResultToPngBlob;
223705
+ exports.rasterResultToPngDataUrl = rasterResultToPngDataUrl;
222994
223706
  exports.rasterizeElement = rasterizeElement;
222995
223707
  exports.rasterizeElementTiledToCanvas = rasterizeElementTiledToCanvas;
222996
223708
  exports.rasterizeElementTiles = rasterizeElementTiles;
@@ -223063,6 +223775,7 @@ exports.resolveElementInteractivity = resolveElementInteractivity;
223063
223775
  exports.resolveExpiredAutosaveSnapshots = resolveExpiredAutosaveSnapshots;
223064
223776
  exports.resolveExportCaptureDecision = resolveExportCaptureDecision;
223065
223777
  exports.resolveFontKerning = resolveFontKerning;
223778
+ exports.resolveForwardSlideWithZoomReturn = resolveForwardSlideWithZoomReturn;
223066
223779
  exports.resolveGoogleWebfontHref = resolveGoogleWebfontHref;
223067
223780
  exports.resolveGroupChildFill = resolveGroupChildFill;
223068
223781
  exports.resolveHistoryDepth = resolveHistoryDepth;
@@ -223105,6 +223818,7 @@ exports.resolveTransportForServerUrl = resolveTransportForServerUrl;
223105
223818
  exports.resolveViewerAddinRows = resolveViewerAddinRows;
223106
223819
  exports.resolveViewportFitOptions = resolveViewportFitOptions;
223107
223820
  exports.resolveWheelSpokeCount = resolveWheelSpokeCount;
223821
+ exports.resolveZoomNavigationTarget = resolveZoomNavigationTarget;
223108
223822
  exports.restoreFilteredSeries = restoreFilteredSeries;
223109
223823
  exports.restoreInlineListBodySelection = restoreInlineListBodySelection;
223110
223824
  exports.restoreSegmentSelection = restoreSegmentSelection;
@@ -223127,6 +223841,7 @@ exports.scheduleAutoAdvanceChain = scheduleAutoAdvanceChain;
223127
223841
  exports.scheduleMediaTrimAndFade = scheduleMediaTrimAndFade;
223128
223842
  exports.schemaLabel = schemaLabel;
223129
223843
  exports.scopeLayoutOptionsToSlide = scopeLayoutOptionsToSlide;
223844
+ exports.scrollInspectorSectionIntoView = scrollInspectorSectionIntoView;
223130
223845
  exports.seedRecentColors = seedRecentColors;
223131
223846
  exports.segmentFrameCount = segmentFrameCount;
223132
223847
  exports.segmentStyleToCss = segmentStyleToCss;