pptx-react-viewer 4.5.0 → 4.6.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 (132) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +34 -33
  3. package/dist/{AiChatPanel-P2N6X2KB.js → AiChatPanel-3C7GM6ZF.js} +28 -28
  4. package/dist/AiChatPanel-3C7GM6ZF.js.br +0 -0
  5. package/dist/AiChatPanel-3C7GM6ZF.js.gz +0 -0
  6. package/dist/{AiChatPanel-HXGCZPUX.mjs → AiChatPanel-L7DBCWE3.mjs} +4 -4
  7. package/dist/AiChatPanel-L7DBCWE3.mjs.br +0 -0
  8. package/dist/AiChatPanel-L7DBCWE3.mjs.gz +0 -0
  9. package/dist/{Model3DScene-QXMMJRV3.mjs → Model3DScene-IJ7YYTYU.mjs} +1 -1
  10. package/dist/Model3DScene-IJ7YYTYU.mjs.br +0 -0
  11. package/dist/Model3DScene-IJ7YYTYU.mjs.gz +0 -0
  12. package/dist/{Model3DScene-PIFMH2TU.js → Model3DScene-USKNPWWH.js} +2 -2
  13. package/dist/Model3DScene-USKNPWWH.js.br +0 -0
  14. package/dist/Model3DScene-USKNPWWH.js.gz +0 -0
  15. package/dist/{chunk-UMQV2432.js → chunk-3JUZOKFI.js} +1 -0
  16. package/dist/chunk-3JUZOKFI.js.br +0 -0
  17. package/dist/{chunk-UMQV2432.js.gz → chunk-3JUZOKFI.js.gz} +0 -0
  18. package/dist/{chunk-T35BGKZG.js → chunk-5V5SMT5A.js} +5 -5
  19. package/dist/chunk-5V5SMT5A.js.br +0 -0
  20. package/dist/chunk-5V5SMT5A.js.gz +0 -0
  21. package/dist/{chunk-UZFCFYK6.js → chunk-DFSWCVRW.js} +1278 -1129
  22. package/dist/chunk-DFSWCVRW.js.br +0 -0
  23. package/dist/chunk-DFSWCVRW.js.gz +0 -0
  24. package/dist/{chunk-LYZQLV7R.js → chunk-FZSYLXJT.js} +783 -38
  25. package/dist/chunk-FZSYLXJT.js.br +0 -0
  26. package/dist/chunk-FZSYLXJT.js.gz +0 -0
  27. package/dist/{chunk-Y4VRYQQS.js → chunk-IBHIXBC5.js} +865 -844
  28. package/dist/chunk-IBHIXBC5.js.br +0 -0
  29. package/dist/chunk-IBHIXBC5.js.gz +0 -0
  30. package/dist/{chunk-VZNIVS3X.mjs → chunk-ICEZL4TM.mjs} +755 -38
  31. package/dist/chunk-ICEZL4TM.mjs.br +0 -0
  32. package/dist/chunk-ICEZL4TM.mjs.gz +0 -0
  33. package/dist/{chunk-PRXJ3J5W.mjs → chunk-INX3E37P.mjs} +53 -32
  34. package/dist/chunk-INX3E37P.mjs.br +0 -0
  35. package/dist/chunk-INX3E37P.mjs.gz +0 -0
  36. package/dist/{chunk-ZF5S3HHW.mjs → chunk-K6QHGABT.mjs} +2 -2
  37. package/dist/chunk-K6QHGABT.mjs.br +0 -0
  38. package/dist/chunk-K6QHGABT.mjs.gz +0 -0
  39. package/dist/{chunk-APAVAD2A.mjs → chunk-OOO4JL2N.mjs} +1 -0
  40. package/dist/chunk-OOO4JL2N.mjs.br +0 -0
  41. package/dist/{chunk-APAVAD2A.mjs.gz → chunk-OOO4JL2N.mjs.gz} +0 -0
  42. package/dist/{chunk-DX2JCSQ4.mjs → chunk-VCAQSSGD.mjs} +1 -1
  43. package/dist/chunk-VCAQSSGD.mjs.br +0 -0
  44. package/dist/chunk-VCAQSSGD.mjs.gz +0 -0
  45. package/dist/{chunk-6FVYG27J.js → chunk-Y4QUVWZC.js} +188 -188
  46. package/dist/chunk-Y4QUVWZC.js.br +0 -0
  47. package/dist/chunk-Y4QUVWZC.js.gz +0 -0
  48. package/dist/{chunk-IDV2ITXM.mjs → chunk-ZAQFTO4P.mjs} +220 -71
  49. package/dist/chunk-ZAQFTO4P.mjs.br +0 -0
  50. package/dist/chunk-ZAQFTO4P.mjs.gz +0 -0
  51. package/dist/i18n/de.cjs +1 -0
  52. package/dist/i18n/de.cjs.br +0 -0
  53. package/dist/i18n/de.cjs.gz +0 -0
  54. package/dist/i18n/de.mjs +1 -0
  55. package/dist/i18n/de.mjs.br +0 -0
  56. package/dist/i18n/de.mjs.gz +0 -0
  57. package/dist/i18n/es.cjs +1 -0
  58. package/dist/i18n/es.cjs.br +0 -0
  59. package/dist/i18n/es.cjs.gz +0 -0
  60. package/dist/i18n/es.mjs +1 -0
  61. package/dist/i18n/es.mjs.br +0 -0
  62. package/dist/i18n/es.mjs.gz +0 -0
  63. package/dist/i18n/fr.cjs +1 -0
  64. package/dist/i18n/fr.cjs.br +0 -0
  65. package/dist/i18n/fr.cjs.gz +0 -0
  66. package/dist/i18n/fr.mjs +1 -0
  67. package/dist/i18n/fr.mjs.br +0 -0
  68. package/dist/i18n/fr.mjs.gz +0 -0
  69. package/dist/i18n/zh-CN.cjs +1 -0
  70. package/dist/i18n/zh-CN.cjs.br +0 -0
  71. package/dist/i18n/zh-CN.cjs.gz +0 -0
  72. package/dist/i18n/zh-CN.mjs +1 -0
  73. package/dist/i18n/zh-CN.mjs.br +0 -0
  74. package/dist/i18n/zh-CN.mjs.gz +0 -0
  75. package/dist/i18n.js +4 -4
  76. package/dist/i18n.js.br +0 -0
  77. package/dist/i18n.js.gz +0 -0
  78. package/dist/i18n.mjs +1 -1
  79. package/dist/i18n.mjs.br +0 -0
  80. package/dist/i18n.mjs.gz +0 -0
  81. package/dist/index.d.ts +266 -3
  82. package/dist/index.js +105 -49
  83. package/dist/index.js.br +0 -0
  84. package/dist/index.js.gz +0 -0
  85. package/dist/index.mjs +6 -6
  86. package/dist/index.mjs.br +0 -0
  87. package/dist/index.mjs.gz +0 -0
  88. package/dist/internals.d.ts +273 -2
  89. package/dist/internals.js +105 -105
  90. package/dist/internals.js.br +0 -0
  91. package/dist/internals.js.gz +0 -0
  92. package/dist/internals.mjs +4 -4
  93. package/dist/internals.mjs.br +0 -0
  94. package/dist/internals.mjs.gz +0 -0
  95. package/dist/viewer/index.d.ts +368 -1
  96. package/dist/viewer/index.js +27 -27
  97. package/dist/viewer/index.js.br +0 -0
  98. package/dist/viewer/index.js.gz +0 -0
  99. package/dist/viewer/index.mjs +6 -6
  100. package/dist/viewer/index.mjs.br +3 -4
  101. package/dist/viewer/index.mjs.gz +0 -0
  102. package/package.json +1 -1
  103. package/dist/AiChatPanel-HXGCZPUX.mjs.br +0 -0
  104. package/dist/AiChatPanel-HXGCZPUX.mjs.gz +0 -0
  105. package/dist/AiChatPanel-P2N6X2KB.js.br +0 -0
  106. package/dist/AiChatPanel-P2N6X2KB.js.gz +0 -0
  107. package/dist/Model3DScene-PIFMH2TU.js.br +0 -0
  108. package/dist/Model3DScene-PIFMH2TU.js.gz +0 -0
  109. package/dist/Model3DScene-QXMMJRV3.mjs.br +0 -0
  110. package/dist/Model3DScene-QXMMJRV3.mjs.gz +0 -0
  111. package/dist/chunk-6FVYG27J.js.br +0 -0
  112. package/dist/chunk-6FVYG27J.js.gz +0 -0
  113. package/dist/chunk-APAVAD2A.mjs.br +0 -0
  114. package/dist/chunk-DX2JCSQ4.mjs.br +0 -0
  115. package/dist/chunk-DX2JCSQ4.mjs.gz +0 -0
  116. package/dist/chunk-IDV2ITXM.mjs.br +0 -0
  117. package/dist/chunk-IDV2ITXM.mjs.gz +0 -0
  118. package/dist/chunk-LYZQLV7R.js.br +0 -0
  119. package/dist/chunk-LYZQLV7R.js.gz +0 -0
  120. package/dist/chunk-PRXJ3J5W.mjs.br +0 -0
  121. package/dist/chunk-PRXJ3J5W.mjs.gz +0 -0
  122. package/dist/chunk-T35BGKZG.js.br +0 -0
  123. package/dist/chunk-T35BGKZG.js.gz +0 -0
  124. package/dist/chunk-UMQV2432.js.br +0 -0
  125. package/dist/chunk-UZFCFYK6.js.br +0 -0
  126. package/dist/chunk-UZFCFYK6.js.gz +0 -0
  127. package/dist/chunk-VZNIVS3X.mjs.br +0 -0
  128. package/dist/chunk-VZNIVS3X.mjs.gz +0 -0
  129. package/dist/chunk-Y4VRYQQS.js.br +0 -0
  130. package/dist/chunk-Y4VRYQQS.js.gz +0 -0
  131. package/dist/chunk-ZF5S3HHW.mjs.br +0 -0
  132. package/dist/chunk-ZF5S3HHW.mjs.gz +0 -0
@@ -36124,7 +36124,7 @@ function navigateAxisHop(current, axis, nodes, childrenOf, parentOf, roots) {
36124
36124
  out.push(node);
36125
36125
  }
36126
36126
  };
36127
- const addAll = (list2) => {
36127
+ const addAll2 = (list2) => {
36128
36128
  for (const node of list2) {
36129
36129
  add7(node);
36130
36130
  }
@@ -36135,14 +36135,14 @@ function navigateAxisHop(current, axis, nodes, childrenOf, parentOf, roots) {
36135
36135
  add7(node);
36136
36136
  break;
36137
36137
  case "ch":
36138
- addAll(childrenOf.get(node.id) ?? []);
36138
+ addAll2(childrenOf.get(node.id) ?? []);
36139
36139
  break;
36140
36140
  case "des":
36141
- addAll(descendantsOf(node, childrenOf));
36141
+ addAll2(descendantsOf(node, childrenOf));
36142
36142
  break;
36143
36143
  case "desOrSelf":
36144
36144
  add7(node);
36145
- addAll(descendantsOf(node, childrenOf));
36145
+ addAll2(descendantsOf(node, childrenOf));
36146
36146
  break;
36147
36147
  case "par": {
36148
36148
  const parent = parentOf.get(node.id);
@@ -36152,17 +36152,17 @@ function navigateAxisHop(current, axis, nodes, childrenOf, parentOf, roots) {
36152
36152
  break;
36153
36153
  }
36154
36154
  case "ancst":
36155
- addAll(ancestorsOf(node, parentOf));
36155
+ addAll2(ancestorsOf(node, parentOf));
36156
36156
  break;
36157
36157
  case "ancstOrSelf":
36158
36158
  add7(node);
36159
- addAll(ancestorsOf(node, parentOf));
36159
+ addAll2(ancestorsOf(node, parentOf));
36160
36160
  break;
36161
36161
  case "followSib":
36162
36162
  case "precedSib": {
36163
36163
  const siblings = siblingGroupOf(node, parentOf, childrenOf, roots);
36164
36164
  const index = siblings.findIndex((sibling) => sibling.id === node.id);
36165
- addAll(axis === "followSib" ? siblings.slice(index + 1) : siblings.slice(0, index));
36165
+ addAll2(axis === "followSib" ? siblings.slice(index + 1) : siblings.slice(0, index));
36166
36166
  break;
36167
36167
  }
36168
36168
  case "follow":
@@ -36177,7 +36177,7 @@ function navigateAxisHop(current, axis, nodes, childrenOf, parentOf, roots) {
36177
36177
  )
36178
36178
  );
36179
36179
  const range = axis === "follow" ? nodes.slice(docIndex + 1) : nodes.slice(0, docIndex);
36180
- addAll(range.filter((n) => !excluded.has(n.id)));
36180
+ addAll2(range.filter((n) => !excluded.has(n.id)));
36181
36181
  break;
36182
36182
  }
36183
36183
  case "root": {
@@ -160446,8 +160446,8 @@ function resolveChartDragValue(geometry, pointer) {
160446
160446
  case "stackedSegment":
160447
160447
  return resolveStackedDragValue(geometry, pointer.y);
160448
160448
  default: {
160449
- const exhaustive = geometry;
160450
- return exhaustive;
160449
+ const exhaustive2 = geometry;
160450
+ return exhaustive2;
160451
160451
  }
160452
160452
  }
160453
160453
  }
@@ -163466,8 +163466,8 @@ function mountPerspectiveScene(perspective, ctx) {
163466
163466
  case "surface":
163467
163467
  return createSurfaceChart3DScene(ctx, perspective.options);
163468
163468
  default: {
163469
- const exhaustive = perspective;
163470
- return exhaustive;
163469
+ const exhaustive2 = perspective;
163470
+ return exhaustive2;
163471
163471
  }
163472
163472
  }
163473
163473
  }
@@ -181755,6 +181755,18 @@ var PresentationAnimationController = class _PresentationAnimationController {
181755
181755
  return ids;
181756
181756
  }
181757
181757
  };
181758
+ function idSelector(elementId) {
181759
+ const escaped = typeof CSS !== "undefined" && typeof CSS.escape === "function" ? CSS.escape(elementId) : elementId.replace(/["\\]/gu, "\\$&");
181760
+ return `[data-element-id="${escaped}"]`;
181761
+ }
181762
+ function findCanvasElementNode(root, elementId, options = {}) {
181763
+ const selector = idSelector(elementId);
181764
+ const onCanvas = root.querySelector(`[data-pptx-viewport] ${selector}`);
181765
+ if (onCanvas || options.canvasOnly) {
181766
+ return onCanvas;
181767
+ }
181768
+ return root.querySelector(selector);
181769
+ }
181758
181770
  var FALLBACK_SLIDE_WIDTH = 1280;
181759
181771
  var FALLBACK_SLIDE_HEIGHT = 720;
181760
181772
  function buildAnimationRibbonPreview(animation, target) {
@@ -181783,9 +181795,7 @@ function playAnimationRibbonPreview(doc, animation) {
181783
181795
  if (!animation) {
181784
181796
  return;
181785
181797
  }
181786
- const target = doc.querySelector(
181787
- `[data-element-id="${CSS.escape(animation.elementId)}"]`
181788
- );
181798
+ const target = findCanvasElementNode(doc, animation.elementId);
181789
181799
  if (!target) {
181790
181800
  return;
181791
181801
  }
@@ -190348,6 +190358,7 @@ var translationsEn = {
190348
190358
  "pptx.options.screenTipStyle.off": "Don't show ScreenTips",
190349
190359
  "pptx.options.general.personalize": "Personalize your copy of the viewer",
190350
190360
  "pptx.options.general.userName": "User name",
190361
+ "pptx.options.lockedByHost": "This setting is managed by your organization",
190351
190362
  "pptx.options.general.userInitials": "Initials",
190352
190363
  "pptx.options.general.appearance": "Viewer theme",
190353
190364
  "pptx.options.general.fonts": "Fonts",
@@ -199360,6 +199371,16 @@ function withConnectorEndpointUpdate(connector, update) {
199360
199371
  shapeStyle: style
199361
199372
  };
199362
199373
  }
199374
+ var DEFAULT_MARGIN = 8;
199375
+ function clampFlyoutPosition(input) {
199376
+ const margin = input.margin ?? DEFAULT_MARGIN;
199377
+ const maxLeft = input.viewportWidth - input.width - margin;
199378
+ const maxTop = input.viewportHeight - input.height - margin;
199379
+ return {
199380
+ left: Math.max(margin, input.width > 0 ? Math.min(input.x, maxLeft) : input.x),
199381
+ top: Math.max(margin, input.height > 0 ? Math.min(input.y, maxTop) : input.y)
199382
+ };
199383
+ }
199363
199384
  init_constants2();
199364
199385
  init_connector_dash();
199365
199386
  init_connector_dash();
@@ -211812,6 +211833,74 @@ function mapInlineTextFormatKey(input) {
211812
211833
  return null;
211813
211834
  }
211814
211835
  }
211836
+ var FORM_FIELD_TAGS = /^(?:INPUT|TEXTAREA|SELECT)$/u;
211837
+ function asElement(target) {
211838
+ const element = target;
211839
+ if (!element || typeof element.tagName !== "string") {
211840
+ return null;
211841
+ }
211842
+ return element;
211843
+ }
211844
+ function isEditorTextInputTarget(target) {
211845
+ const element = asElement(target);
211846
+ if (!element) {
211847
+ return false;
211848
+ }
211849
+ return FORM_FIELD_TAGS.test(element.tagName) || element.isContentEditable === true;
211850
+ }
211851
+ var CANVAS_SELECTOR = "[data-pptx-viewport]";
211852
+ var CONTROL_SELECTOR = [
211853
+ "button",
211854
+ "a[href]",
211855
+ "summary",
211856
+ '[aria-modal="true"]',
211857
+ ...[
211858
+ "button",
211859
+ "checkbox",
211860
+ "combobox",
211861
+ "dialog",
211862
+ "alertdialog",
211863
+ "grid",
211864
+ "gridcell",
211865
+ "link",
211866
+ "listbox",
211867
+ "menu",
211868
+ "menubar",
211869
+ "menuitem",
211870
+ "menuitemcheckbox",
211871
+ "menuitemradio",
211872
+ "option",
211873
+ "radio",
211874
+ "slider",
211875
+ "spinbutton",
211876
+ "switch",
211877
+ "tab",
211878
+ "tablist",
211879
+ "toolbar",
211880
+ "tree",
211881
+ "treeitem"
211882
+ ].map((role) => `[role="${role}"]`)
211883
+ ].join(",");
211884
+ function isEditorControlTarget(target) {
211885
+ const element = asElement(target);
211886
+ if (!element) {
211887
+ return false;
211888
+ }
211889
+ const tag = element.tagName.toUpperCase();
211890
+ if (tag === "BODY" || tag === "HTML") {
211891
+ return false;
211892
+ }
211893
+ if (typeof element.closest !== "function") {
211894
+ return false;
211895
+ }
211896
+ if (element.closest(CANVAS_SELECTOR)) {
211897
+ return false;
211898
+ }
211899
+ if (tag.includes("-")) {
211900
+ return true;
211901
+ }
211902
+ return Boolean(element.closest(CONTROL_SELECTOR));
211903
+ }
211815
211904
  var NUDGE_SMALL = 1;
211816
211905
  var NUDGE_LARGE = 10;
211817
211906
  var GUARD_DEFAULTS = {
@@ -211821,16 +211910,9 @@ var GUARD_DEFAULTS = {
211821
211910
  canPaste: true,
211822
211911
  isEditingText: false,
211823
211912
  isDrawing: false,
211824
- isTextInputTarget: false
211913
+ isTextInputTarget: false,
211914
+ isControlTarget: false
211825
211915
  };
211826
- var FORM_FIELD_TAGS = /^(?:INPUT|TEXTAREA|SELECT)$/u;
211827
- function isEditorTextInputTarget(target) {
211828
- const element = target;
211829
- if (!element || typeof element.tagName !== "string") {
211830
- return false;
211831
- }
211832
- return FORM_FIELD_TAGS.test(element.tagName) || element.isContentEditable === true;
211833
- }
211834
211916
  function editorNudgeDelta(key2, large) {
211835
211917
  const step = large ? NUDGE_LARGE : NUDGE_SMALL;
211836
211918
  switch (key2) {
@@ -211886,7 +211968,7 @@ function mapEditorKey(input, guard = {}) {
211886
211968
  if ((key2 === "Delete" || key2 === "Backspace") && state.hasSelection) {
211887
211969
  return { action: "delete" };
211888
211970
  }
211889
- if (key2 === "Tab" && !mod && !alt) {
211971
+ if (key2 === "Tab" && !mod && !alt && !state.isControlTarget) {
211890
211972
  return { action: input.shiftKey ? "cycleSelectionPrev" : "cycleSelectionNext" };
211891
211973
  }
211892
211974
  if (mod && !alt) {
@@ -217437,8 +217519,8 @@ async function applyMasterViewCrudAction(handler, data, action, target, options)
217437
217519
  return result.ok ? { ok: true, handler: result.handler, data: result.data, target } : result;
217438
217520
  }
217439
217521
  default: {
217440
- const exhaustive = action;
217441
- throw new Error(`Unhandled master-view CRUD action: ${String(exhaustive)}`);
217522
+ const exhaustive2 = action;
217523
+ throw new Error(`Unhandled master-view CRUD action: ${String(exhaustive2)}`);
217442
217524
  }
217443
217525
  }
217444
217526
  }
@@ -218409,6 +218491,86 @@ function playFeedbackSound(options) {
218409
218491
  } catch {
218410
218492
  }
218411
218493
  }
218494
+ function parseOptionsSettingId(id) {
218495
+ const dot = id.indexOf(".");
218496
+ if (dot <= 0) {
218497
+ return null;
218498
+ }
218499
+ const group2 = id.slice(0, dot);
218500
+ const key2 = id.slice(dot + 1);
218501
+ const defaults = DEFAULT_VIEWER_OPTIONS[group2];
218502
+ if (!defaults || !(key2 in defaults) || Array.isArray(defaults[key2])) {
218503
+ return null;
218504
+ }
218505
+ return { group: group2, key: key2 };
218506
+ }
218507
+ function entriesOf(values) {
218508
+ return Object.entries(values ?? {}).filter(
218509
+ (entry4) => entry4[1] !== void 0
218510
+ );
218511
+ }
218512
+ function writeValues(target, values) {
218513
+ for (const [id, value] of entriesOf(values)) {
218514
+ const parsed = parseOptionsSettingId(id);
218515
+ if (!parsed) {
218516
+ continue;
218517
+ }
218518
+ const record2 = target[parsed.group];
218519
+ if (typeof record2[parsed.key] === typeof value) {
218520
+ record2[parsed.key] = value;
218521
+ }
218522
+ }
218523
+ }
218524
+ function applyLockedOptions(options, locked) {
218525
+ if (entriesOf(locked).length === 0) {
218526
+ return options;
218527
+ }
218528
+ const next = cloneOptions(options);
218529
+ writeValues(next, locked);
218530
+ return next;
218531
+ }
218532
+ function buildOptionsBaseline(defaults) {
218533
+ const baseline = cloneOptions(DEFAULT_VIEWER_OPTIONS);
218534
+ writeValues(baseline, defaults);
218535
+ return baseline;
218536
+ }
218537
+ function isOptionLocked(locked, group2, key2) {
218538
+ return Object.hasOwn(locked ?? {}, `${group2}.${key2}`);
218539
+ }
218540
+ function diffOptionsAgainstBaseline(options, baseline, locked) {
218541
+ const diff = {};
218542
+ for (const group2 of Object.keys(baseline)) {
218543
+ const base = baseline[group2];
218544
+ const current = options[group2];
218545
+ for (const key2 of Object.keys(base)) {
218546
+ if (isOptionLocked(locked, group2, key2)) {
218547
+ continue;
218548
+ }
218549
+ const changed = Array.isArray(base[key2]) ? JSON.stringify(base[key2]) !== JSON.stringify(current[key2]) : base[key2] !== current[key2];
218550
+ if (changed) {
218551
+ (diff[group2] ??= {})[key2] = current[key2];
218552
+ }
218553
+ }
218554
+ }
218555
+ return diff;
218556
+ }
218557
+ function rebaseOptions(options, previousBaseline, nextBaseline, userSaved) {
218558
+ const next = cloneOptions(options);
218559
+ for (const group2 of Object.keys(nextBaseline)) {
218560
+ const before = previousBaseline[group2];
218561
+ const after = nextBaseline[group2];
218562
+ const target = next[group2];
218563
+ for (const key2 of Object.keys(after)) {
218564
+ if (Array.isArray(after[key2]) || userSaved.has(`${group2}.${key2}`)) {
218565
+ continue;
218566
+ }
218567
+ if (target[key2] === before[key2]) {
218568
+ target[key2] = after[key2];
218569
+ }
218570
+ }
218571
+ }
218572
+ return next;
218573
+ }
218412
218574
  function toggle(group2, key2, labelKey, extra) {
218413
218575
  return { kind: "toggle", group: group2, key: key2, labelKey, ...extra };
218414
218576
  }
@@ -218910,13 +219072,18 @@ var VIEWER_OPTIONS_TABS = [
218910
219072
  function createViewerOptionsStore(init) {
218911
219073
  const persist = init?.persist !== false;
218912
219074
  const seeded = mergeViewerOptions(init?.initial);
218913
- const store = createViewerStore(
218914
- persist ? overlayStored(seeded, readStoredViewerPrefs().options) : seeded
218915
- );
219075
+ const stored = persist ? readStoredViewerPrefs().options : void 0;
219076
+ const userSaved = new Set(savedSettingIds(stored));
219077
+ const store = createViewerStore(persist ? overlayStored(seeded, stored) : seeded);
218916
219078
  const options = () => store.getState();
218917
- function commit(next) {
219079
+ let constraints = {};
219080
+ let baseline = buildOptionsBaseline(void 0);
219081
+ function commit(raw) {
219082
+ const next = applyLockedOptions(raw, constraints.locked);
218918
219083
  if (persist) {
218919
- writeStoredViewerPrefs({ options: diffViewerOptions(next) });
219084
+ writeStoredViewerPrefs({
219085
+ options: diffOptionsAgainstBaseline(next, baseline, constraints.locked)
219086
+ });
218920
219087
  }
218921
219088
  store.setState(next);
218922
219089
  }
@@ -218924,8 +219091,8 @@ function createViewerOptionsStore(init) {
218924
219091
  getOptions: options,
218925
219092
  setOptions: (next) => commit(cloneOptions(next)),
218926
219093
  setValue: (group2, key2, value) => {
218927
- const defaults = DEFAULT_VIEWER_OPTIONS[group2];
218928
- if (!(key2 in defaults) || typeof defaults[key2] !== typeof value) {
219094
+ const defaults = baseline[group2];
219095
+ if (!(key2 in defaults) || typeof defaults[key2] !== typeof value || isOptionLocked(constraints.locked, group2, key2)) {
218929
219096
  return;
218930
219097
  }
218931
219098
  const next = cloneOptions(options());
@@ -218957,19 +219124,34 @@ function createViewerOptionsStore(init) {
218957
219124
  },
218958
219125
  reset: (group2) => {
218959
219126
  if (!group2) {
218960
- commit(cloneOptions(DEFAULT_VIEWER_OPTIONS));
219127
+ commit(cloneOptions(baseline));
218961
219128
  return;
218962
219129
  }
218963
219130
  const next = cloneOptions(options());
218964
- const defaults = cloneOptions(DEFAULT_VIEWER_OPTIONS);
219131
+ const defaults = cloneOptions(baseline);
218965
219132
  next[group2] = defaults[group2];
218966
219133
  commit(next);
218967
219134
  },
218968
219135
  subscribe: (listener) => store.subscribe(() => listener(store.getState())),
218969
219136
  subscribeSelector: (selector, listener, isEqual) => store.subscribeSelector(selector, listener, isEqual),
218970
- batch: (write) => store.batch(write)
219137
+ batch: (write) => store.batch(write),
219138
+ setConstraints: (next) => {
219139
+ const previousBaseline = baseline;
219140
+ constraints = { locked: { ...next.locked }, defaults: { ...next.defaults } };
219141
+ baseline = buildOptionsBaseline(constraints.defaults);
219142
+ commit(rebaseOptions(options(), previousBaseline, baseline, userSaved));
219143
+ },
219144
+ isLocked: (group2, key2) => isOptionLocked(constraints.locked, group2, key2)
218971
219145
  };
218972
219146
  }
219147
+ function savedSettingIds(stored) {
219148
+ if (!stored) {
219149
+ return [];
219150
+ }
219151
+ return Object.entries(stored).flatMap(
219152
+ ([group2, values]) => values && typeof values === "object" ? Object.keys(values).map((key2) => `${group2}.${key2}`) : []
219153
+ );
219154
+ }
218973
219155
  function overlayStored(base, stored) {
218974
219156
  if (!stored) {
218975
219157
  return base;
@@ -218986,6 +219168,541 @@ function overlayStored(base, stored) {
218986
219168
  }
218987
219169
  return merged;
218988
219170
  }
219171
+ function exhaustive() {
219172
+ return (list2) => list2;
219173
+ }
219174
+ var RIBBON_TAB_IDS = TOOLBAR_TABS.map((tab) => tab.id);
219175
+ var TOOLBAR_BUTTON_IDS = exhaustive()([
219176
+ "share",
219177
+ "broadcast",
219178
+ "export",
219179
+ "undo",
219180
+ "redo",
219181
+ "record",
219182
+ "notes",
219183
+ "fullscreen",
219184
+ "zoom",
219185
+ "navigation"
219186
+ ]);
219187
+ var OPTIONS_PAGE_IDS = [
219188
+ ...VIEWER_OPTIONS_TABS.map((tab) => tab.id),
219189
+ "ai"
219190
+ ];
219191
+ var OPTIONS_SECTION_IDS = VIEWER_OPTIONS_TABS.flatMap(
219192
+ (tab) => tab.sections.map((section) => `${tab.id}.${section.id}`)
219193
+ );
219194
+ function primitiveSettingIds() {
219195
+ const ids = [];
219196
+ for (const group2 of Object.keys(DEFAULT_VIEWER_OPTIONS)) {
219197
+ const values = DEFAULT_VIEWER_OPTIONS[group2];
219198
+ for (const [key2, value] of Object.entries(values)) {
219199
+ if (!Array.isArray(value)) {
219200
+ ids.push(`${group2}.${key2}`);
219201
+ }
219202
+ }
219203
+ }
219204
+ return ids;
219205
+ }
219206
+ var OPTIONS_SETTING_IDS = primitiveSettingIds();
219207
+ var BACKSTAGE_PAGE_IDS = BACKSTAGE_NAV.map((item) => item.id);
219208
+ var BACKSTAGE_CARD_IDS = Object.keys(
219209
+ BACKSTAGE_CARDS
219210
+ );
219211
+ var ELEMENT_CONTEXT_MENU_COMMAND_IDS = exhaustive()([
219212
+ "copy",
219213
+ "cut",
219214
+ "paste",
219215
+ "duplicate",
219216
+ "edit-text",
219217
+ "bring-forward",
219218
+ "send-backward",
219219
+ "bring-front",
219220
+ "send-back",
219221
+ "ai-ask",
219222
+ "ai-fix",
219223
+ "comment",
219224
+ "hyperlink",
219225
+ "table-insert-row-above",
219226
+ "table-insert-row-below",
219227
+ "table-delete-row",
219228
+ "table-insert-col-left",
219229
+ "table-insert-col-right",
219230
+ "table-delete-col",
219231
+ "table-merge-selected",
219232
+ "table-merge-right",
219233
+ "table-merge-down",
219234
+ "table-split",
219235
+ "group",
219236
+ "ungroup",
219237
+ "save-as-picture",
219238
+ "edit-alt-text",
219239
+ "size-and-position",
219240
+ "format-shape",
219241
+ "delete"
219242
+ ]);
219243
+ var CANVAS_CONTEXT_MENU_COMMAND_IDS = exhaustive()([
219244
+ "paste",
219245
+ "layout",
219246
+ "reset-slide",
219247
+ "format-background",
219248
+ "grid-and-guides",
219249
+ "ruler"
219250
+ ]);
219251
+ var EDITOR_SHORTCUT_ACTION_IDS = exhaustive()([
219252
+ "undo",
219253
+ "redo",
219254
+ "copy",
219255
+ "cut",
219256
+ "paste",
219257
+ "duplicate",
219258
+ "delete",
219259
+ "selectAll",
219260
+ "group",
219261
+ "ungroup",
219262
+ "nudge",
219263
+ "prevSlide",
219264
+ "nextSlide",
219265
+ "escape",
219266
+ "find",
219267
+ "findReplace",
219268
+ "toggleShortcuts",
219269
+ "alignLeft",
219270
+ "alignCenter",
219271
+ "alignRight",
219272
+ "alignJustify",
219273
+ "increaseFontSize",
219274
+ "decreaseFontSize",
219275
+ "copyFormat",
219276
+ "pasteFormat",
219277
+ "newSlide",
219278
+ "hyperlink",
219279
+ "clearFormatting",
219280
+ "cycleSelectionNext",
219281
+ "cycleSelectionPrev",
219282
+ "pasteSpecial"
219283
+ ]);
219284
+ var VIEWER_PANEL_IDS = exhaustive()([
219285
+ "statusBar",
219286
+ "slidesPane",
219287
+ "inspector",
219288
+ "notes",
219289
+ "quickAccessToolbar",
219290
+ "titleBar"
219291
+ ]);
219292
+ var VIEWER_FEATURE_IDS = exhaustive()([
219293
+ "ai",
219294
+ "collaboration",
219295
+ "comments",
219296
+ "presentMode"
219297
+ ]);
219298
+ var VIEWER_DIALOG_IDS = exhaustive()([
219299
+ "options",
219300
+ "share",
219301
+ "broadcast",
219302
+ "print",
219303
+ "export"
219304
+ ]);
219305
+ var VIEWER_EXPORT_FORMAT_IDS = exhaustive()([
219306
+ "pdf",
219307
+ "png",
219308
+ "video",
219309
+ "gif",
219310
+ "json",
219311
+ "copyImage"
219312
+ ]);
219313
+ function mergeCustomization(base, patch) {
219314
+ const next = { ...base };
219315
+ for (const key2 of Object.keys(patch)) {
219316
+ const value = patch[key2];
219317
+ const current = base[key2];
219318
+ if (value !== void 0 && !Array.isArray(value) && typeof value === "object" && current !== void 0 && !Array.isArray(current) && typeof current === "object") {
219319
+ next[key2] = { ...current, ...value };
219320
+ } else {
219321
+ next[key2] = value;
219322
+ }
219323
+ }
219324
+ return next;
219325
+ }
219326
+ function toggleInList(list2, value, present) {
219327
+ const current = list2 ?? [];
219328
+ const has = current.includes(value);
219329
+ if (present === has) {
219330
+ return [...current];
219331
+ }
219332
+ return present ? [...current, value] : current.filter((entry4) => entry4 !== value);
219333
+ }
219334
+ function withRecordEntry(record2, key2, value) {
219335
+ const next = { ...record2 };
219336
+ if (value === void 0) {
219337
+ delete next[key2];
219338
+ } else {
219339
+ next[key2] = value;
219340
+ }
219341
+ return next;
219342
+ }
219343
+ var NOT_REMAPPABLE = /* @__PURE__ */ new Set(["nudge", "escape"]);
219344
+ var SELECTION_GATED = /* @__PURE__ */ new Set([
219345
+ "copy",
219346
+ "cut",
219347
+ "duplicate",
219348
+ "delete",
219349
+ "group",
219350
+ "ungroup"
219351
+ ]);
219352
+ function parseShortcutChord(chord2) {
219353
+ const parts = chord2.split("+").map((part) => part.trim()).filter((part) => part.length > 0);
219354
+ const rawKey = parts.pop();
219355
+ if (!rawKey) {
219356
+ return null;
219357
+ }
219358
+ const parsed = {
219359
+ key: rawKey.toLowerCase() === "plus" ? "+" : rawKey,
219360
+ mod: false,
219361
+ ctrl: false,
219362
+ meta: false,
219363
+ alt: false,
219364
+ shift: false
219365
+ };
219366
+ for (const part of parts) {
219367
+ switch (part.toLowerCase()) {
219368
+ case "mod":
219369
+ case "cmdorctrl":
219370
+ parsed.mod = true;
219371
+ break;
219372
+ case "ctrl":
219373
+ case "control":
219374
+ parsed.ctrl = true;
219375
+ break;
219376
+ case "meta":
219377
+ case "cmd":
219378
+ parsed.meta = true;
219379
+ break;
219380
+ case "alt":
219381
+ case "option":
219382
+ parsed.alt = true;
219383
+ break;
219384
+ case "shift":
219385
+ parsed.shift = true;
219386
+ break;
219387
+ default:
219388
+ return null;
219389
+ }
219390
+ }
219391
+ return parsed;
219392
+ }
219393
+ function matchesShortcutChord(input, chord2) {
219394
+ const ctrl = Boolean(input.ctrlKey);
219395
+ const meta = Boolean(input.metaKey);
219396
+ if (chord2.mod) {
219397
+ if (!(ctrl || meta) || chord2.ctrl && !ctrl || chord2.meta && !meta) {
219398
+ return false;
219399
+ }
219400
+ } else if (ctrl !== chord2.ctrl || meta !== chord2.meta) {
219401
+ return false;
219402
+ }
219403
+ if (Boolean(input.altKey) !== chord2.alt) {
219404
+ return false;
219405
+ }
219406
+ const shiftImplied = chord2.key.length === 1 && !/[a-z0-9]/iu.test(chord2.key);
219407
+ if (!shiftImplied && Boolean(input.shiftKey) !== chord2.shift) {
219408
+ return false;
219409
+ }
219410
+ return input.key.toLowerCase() === chord2.key.toLowerCase();
219411
+ }
219412
+ function resolveKeyboardCustomization(keyboard) {
219413
+ const remap = /* @__PURE__ */ new Map();
219414
+ for (const [action, value] of Object.entries(keyboard?.remap ?? {})) {
219415
+ if (value === void 0 || NOT_REMAPPABLE.has(action)) {
219416
+ continue;
219417
+ }
219418
+ const chords = (typeof value === "string" ? [value] : value).map(parseShortcutChord).filter((chord2) => chord2 !== null);
219419
+ remap.set(action, chords);
219420
+ }
219421
+ return {
219422
+ disableAll: keyboard?.disableAll === true,
219423
+ disabled: new Set(keyboard?.disabled ?? []),
219424
+ remap
219425
+ };
219426
+ }
219427
+ var NO_ACTION3 = { action: null };
219428
+ function remappedAction(input, guard, keyboard) {
219429
+ for (const [action, chords] of keyboard.remap) {
219430
+ if (keyboard.disabled.has(action) || !chords.some((c) => matchesShortcutChord(input, c))) {
219431
+ continue;
219432
+ }
219433
+ if (SELECTION_GATED.has(action) && !guard.hasSelection) {
219434
+ return null;
219435
+ }
219436
+ return action;
219437
+ }
219438
+ return null;
219439
+ }
219440
+ function mapCustomizedEditorKey(input, guard = {}, keyboard) {
219441
+ if (!keyboard) {
219442
+ return mapEditorKey(input, guard);
219443
+ }
219444
+ if (keyboard.disableAll) {
219445
+ return NO_ACTION3;
219446
+ }
219447
+ const blocked = guard.isPresenting === true || guard.canEdit === false || guard.isEditingText === true || guard.isDrawing === true || guard.isTextInputTarget === true;
219448
+ if (!blocked && keyboard.remap.size > 0) {
219449
+ const action = remappedAction(input, guard, keyboard);
219450
+ if (action) {
219451
+ return { action };
219452
+ }
219453
+ }
219454
+ const result = mapEditorKey(input, guard);
219455
+ if (result.action && (keyboard.disabled.has(result.action) || keyboard.remap.has(result.action))) {
219456
+ return NO_ACTION3;
219457
+ }
219458
+ return result;
219459
+ }
219460
+ var DIALOG_ENTRY_POINTS = {
219461
+ options: { actions: [], pages: ["options"], cards: [] },
219462
+ share: { actions: ["share"], pages: ["share"], cards: ["share"] },
219463
+ broadcast: { actions: ["broadcast"], pages: [], cards: [] },
219464
+ print: { actions: [], pages: ["print"], cards: ["print"] },
219465
+ export: { actions: ["export"], pages: ["export"], cards: [...VIEWER_EXPORT_FORMAT_IDS] }
219466
+ };
219467
+ function addAll(target, values) {
219468
+ for (const value of values ?? []) {
219469
+ target.add(value);
219470
+ }
219471
+ }
219472
+ function resolveDialogs(customization) {
219473
+ const dialogs = new Set(customization.hiddenDialogs ?? []);
219474
+ const features = new Set(customization.disabledFeatures ?? []);
219475
+ if (features.has("collaboration")) {
219476
+ dialogs.add("share");
219477
+ dialogs.add("broadcast");
219478
+ }
219479
+ const formats = new Set(customization.hiddenExportFormats ?? []);
219480
+ if (VIEWER_EXPORT_FORMAT_IDS.every((id) => formats.has(id))) {
219481
+ dialogs.add("export");
219482
+ }
219483
+ return dialogs;
219484
+ }
219485
+ function resolveCustomization(customization) {
219486
+ const c = customization ?? {};
219487
+ const hiddenActions = /* @__PURE__ */ new Set();
219488
+ addAll(hiddenActions, c.ribbon?.hiddenTabs);
219489
+ addAll(hiddenActions, c.ribbon?.hiddenButtons);
219490
+ const pages = new Set(c.backstage?.hiddenPages ?? []);
219491
+ const cards = new Set(c.backstage?.hiddenCards ?? []);
219492
+ addAll(cards, c.hiddenExportFormats);
219493
+ const dialogs = resolveDialogs(c);
219494
+ for (const dialog of dialogs) {
219495
+ const entry4 = DIALOG_ENTRY_POINTS[dialog];
219496
+ addAll(hiddenActions, entry4.actions);
219497
+ addAll(pages, entry4.pages);
219498
+ addAll(cards, entry4.cards);
219499
+ }
219500
+ const features = new Set(c.disabledFeatures ?? []);
219501
+ const elementCommands = new Set(c.contextMenu?.hiddenElementCommands);
219502
+ const optionsPages = new Set(c.options?.hiddenPages ?? []);
219503
+ if (features.has("ai")) {
219504
+ elementCommands.add("ai-ask");
219505
+ elementCommands.add("ai-fix");
219506
+ optionsPages.add("ai");
219507
+ }
219508
+ if (features.has("comments")) {
219509
+ elementCommands.add("comment");
219510
+ }
219511
+ if (features.has("presentMode")) {
219512
+ hiddenActions.add("slideShow");
219513
+ }
219514
+ return {
219515
+ hiddenActions,
219516
+ hiddenOptionsPages: optionsPages,
219517
+ hiddenOptionsSections: new Set(c.options?.hiddenSections ?? []),
219518
+ hiddenSettings: new Set(c.options?.hiddenSettings ?? []),
219519
+ lockedSettings: { ...c.options?.locked },
219520
+ defaultSettings: { ...c.options?.defaults },
219521
+ hiddenBackstagePages: pages,
219522
+ hiddenBackstageCards: cards,
219523
+ hiddenElementCommands: elementCommands,
219524
+ hiddenCanvasCommands: new Set(c.contextMenu?.hiddenCanvasCommands ?? []),
219525
+ elementMenuEnabled: c.contextMenu?.disableElementMenu !== true,
219526
+ canvasMenuEnabled: c.contextMenu?.disableCanvasMenu !== true,
219527
+ hiddenPanels: new Set(c.hiddenPanels ?? []),
219528
+ disabledFeatures: features,
219529
+ hiddenDialogs: dialogs,
219530
+ keyboard: resolveKeyboardCustomization(c.keyboard)
219531
+ };
219532
+ }
219533
+ var EMPTY_RESOLVED_CUSTOMIZATION = resolveCustomization(void 0);
219534
+ function resolveEffectiveHiddenActions(resolved, legacyHiddenActions) {
219535
+ if (resolved.hiddenActions.size === 0 && !legacyHiddenActions?.length) {
219536
+ return legacyHiddenActions ? [...legacyHiddenActions] : void 0;
219537
+ }
219538
+ const merged = new Set(legacyHiddenActions ?? []);
219539
+ addAll(merged, [...resolved.hiddenActions]);
219540
+ return [...merged];
219541
+ }
219542
+ function isPanelVisible(resolved, panel2) {
219543
+ return !resolved.hiddenPanels.has(panel2);
219544
+ }
219545
+ function isFeatureEnabled(resolved, feature) {
219546
+ return !resolved.disabledFeatures.has(feature);
219547
+ }
219548
+ function isDialogAvailable(resolved, dialog) {
219549
+ return !resolved.hiddenDialogs.has(dialog);
219550
+ }
219551
+ function stateOf(customization) {
219552
+ return { customization, resolved: resolveCustomization(customization) };
219553
+ }
219554
+ function createCustomizationController(initial) {
219555
+ const store = createViewerStore(stateOf({ ...initial }));
219556
+ const current = () => store.getState().customization;
219557
+ const set2 = (next) => store.setState(stateOf(next));
219558
+ const update = (patch) => set2(mergeCustomization(current(), patch));
219559
+ const ribbon3 = (edit) => {
219560
+ const next = { ...current().ribbon };
219561
+ edit(next);
219562
+ update({ ribbon: next });
219563
+ };
219564
+ const options = (edit) => {
219565
+ const next = { ...current().options };
219566
+ edit(next);
219567
+ update({ options: next });
219568
+ };
219569
+ const backstage = (edit) => {
219570
+ const next = { ...current().backstage };
219571
+ edit(next);
219572
+ update({ backstage: next });
219573
+ };
219574
+ const menus = (edit) => {
219575
+ const next = { ...current().contextMenu };
219576
+ edit(next);
219577
+ update({ contextMenu: next });
219578
+ };
219579
+ const keys = (edit) => {
219580
+ const next = { ...current().keyboard };
219581
+ edit(next);
219582
+ update({ keyboard: next });
219583
+ };
219584
+ const api = {
219585
+ getCustomization: current,
219586
+ setCustomization: (next) => set2({ ...next }),
219587
+ updateCustomization: update,
219588
+ resetCustomization: () => set2({}),
219589
+ hideRibbonTab: (tab) => ribbon3((r) => r.hiddenTabs = toggleInList(r.hiddenTabs, tab, true)),
219590
+ showRibbonTab: (tab) => ribbon3((r) => r.hiddenTabs = toggleInList(r.hiddenTabs, tab, false)),
219591
+ hideToolbarButton: (b) => ribbon3((r) => r.hiddenButtons = toggleInList(r.hiddenButtons, b, true)),
219592
+ showToolbarButton: (b) => ribbon3((r) => r.hiddenButtons = toggleInList(r.hiddenButtons, b, false)),
219593
+ hideOptionsPage: (p) => options((o) => o.hiddenPages = toggleInList(o.hiddenPages, p, true)),
219594
+ showOptionsPage: (p) => options((o) => o.hiddenPages = toggleInList(o.hiddenPages, p, false)),
219595
+ hideOptionsSection: (s) => options((o) => o.hiddenSections = toggleInList(o.hiddenSections, s, true)),
219596
+ showOptionsSection: (s) => options((o) => o.hiddenSections = toggleInList(o.hiddenSections, s, false)),
219597
+ hideSetting: (s) => options((o) => o.hiddenSettings = toggleInList(o.hiddenSettings, s, true)),
219598
+ showSetting: (s) => options((o) => o.hiddenSettings = toggleInList(o.hiddenSettings, s, false)),
219599
+ lockSetting: (s, value, hidden) => options((o) => {
219600
+ o.locked = withRecordEntry(o.locked, s, value);
219601
+ if (hidden !== void 0) {
219602
+ o.hiddenSettings = toggleInList(o.hiddenSettings, s, hidden);
219603
+ }
219604
+ }),
219605
+ unlockSetting: (s) => options((o) => o.locked = withRecordEntry(o.locked, s, void 0)),
219606
+ setSettingDefault: (s, value) => options((o) => o.defaults = withRecordEntry(o.defaults, s, value)),
219607
+ hideBackstagePage: (p) => backstage((b) => b.hiddenPages = toggleInList(b.hiddenPages, p, true)),
219608
+ showBackstagePage: (p) => backstage((b) => b.hiddenPages = toggleInList(b.hiddenPages, p, false)),
219609
+ hideBackstageCard: (c) => backstage((b) => b.hiddenCards = toggleInList(b.hiddenCards, c, true)),
219610
+ showBackstageCard: (c) => backstage((b) => b.hiddenCards = toggleInList(b.hiddenCards, c, false)),
219611
+ hideContextMenuCommand: (c) => menus((m) => m.hiddenElementCommands = toggleInList(m.hiddenElementCommands, c, true)),
219612
+ showContextMenuCommand: (c) => menus((m) => m.hiddenElementCommands = toggleInList(m.hiddenElementCommands, c, false)),
219613
+ hideCanvasContextMenuCommand: (c) => menus((m) => m.hiddenCanvasCommands = toggleInList(m.hiddenCanvasCommands, c, true)),
219614
+ showCanvasContextMenuCommand: (c) => menus((m) => m.hiddenCanvasCommands = toggleInList(m.hiddenCanvasCommands, c, false)),
219615
+ disableShortcut: (a) => keys((k) => k.disabled = toggleInList(k.disabled, a, true)),
219616
+ enableShortcut: (a) => keys((k) => k.disabled = toggleInList(k.disabled, a, false)),
219617
+ remapShortcut: (a, chords) => keys((k) => k.remap = withRecordEntry(k.remap, a, chords)),
219618
+ setPanelVisible: (panel2, visible) => update({ hiddenPanels: toggleInList(current().hiddenPanels, panel2, !visible) }),
219619
+ setFeatureEnabled: (feature, enabled) => update({ disabledFeatures: toggleInList(current().disabledFeatures, feature, !enabled) }),
219620
+ setDialogAvailable: (dialog, available) => update({ hiddenDialogs: toggleInList(current().hiddenDialogs, dialog, !available) })
219621
+ };
219622
+ return {
219623
+ api,
219624
+ getResolved: () => store.getState().resolved,
219625
+ subscribe: (listener) => store.subscribe(listener)
219626
+ };
219627
+ }
219628
+ function optionsSettingIdOf(control) {
219629
+ return `${control.group}.${control.key}`;
219630
+ }
219631
+ function isOptionsPageVisible(resolved, page) {
219632
+ return !resolved.hiddenOptionsPages.has(page);
219633
+ }
219634
+ function isSettingLocked(resolved, id) {
219635
+ return Object.hasOwn(resolved.lockedSettings, id);
219636
+ }
219637
+ function isSettingVisible(resolved, id) {
219638
+ return !resolved.hiddenSettings.has(id);
219639
+ }
219640
+ function customizeSection(tabId, section, resolved) {
219641
+ if (resolved.hiddenOptionsSections.has(`${tabId}.${section.id}`)) {
219642
+ return null;
219643
+ }
219644
+ const controls = section.controls.filter((control) => isSettingVisible(resolved, optionsSettingIdOf(control))).map(
219645
+ (control) => isSettingLocked(resolved, optionsSettingIdOf(control)) ? { ...control, readOnly: true } : control
219646
+ );
219647
+ if (controls.length === 0 && section.controls.length > 0 && !section.special) {
219648
+ return null;
219649
+ }
219650
+ return { ...section, controls };
219651
+ }
219652
+ function customizeOptionsTabs(tabs, resolved) {
219653
+ if (resolved.hiddenOptionsPages.size === 0 && resolved.hiddenOptionsSections.size === 0 && resolved.hiddenSettings.size === 0 && Object.keys(resolved.lockedSettings).length === 0) {
219654
+ return tabs;
219655
+ }
219656
+ const result = [];
219657
+ for (const tab of tabs) {
219658
+ if (!isOptionsPageVisible(resolved, tab.id)) {
219659
+ continue;
219660
+ }
219661
+ const sections2 = tab.sections.map((section) => customizeSection(tab.id, section, resolved)).filter((section) => section !== null);
219662
+ if (sections2.length === 0 && tab.sections.length > 0 && !tab.custom) {
219663
+ continue;
219664
+ }
219665
+ result.push({ ...tab, sections: sections2 });
219666
+ }
219667
+ return result;
219668
+ }
219669
+ function filterMenuEntries(entries, hidden) {
219670
+ const result = [];
219671
+ let pendingSeparator = false;
219672
+ for (const entry4 of entries) {
219673
+ if (hidden.has(entry4.id)) {
219674
+ pendingSeparator ||= entry4.separatorBefore === true;
219675
+ continue;
219676
+ }
219677
+ const separatorBefore = result.length > 0 && (entry4.separatorBefore === true || pendingSeparator);
219678
+ pendingSeparator = false;
219679
+ result.push(
219680
+ separatorBefore === (entry4.separatorBefore === true) ? entry4 : { ...entry4, separatorBefore }
219681
+ );
219682
+ }
219683
+ return result;
219684
+ }
219685
+ function customizeContextMenuEntries(entries, resolved) {
219686
+ if (!resolved.elementMenuEnabled) {
219687
+ return [];
219688
+ }
219689
+ return filterMenuEntries(entries, resolved.hiddenElementCommands);
219690
+ }
219691
+ function customizeCanvasContextMenuEntries(entries, resolved) {
219692
+ if (!resolved.canvasMenuEnabled) {
219693
+ return [];
219694
+ }
219695
+ return filterMenuEntries(entries, resolved.hiddenCanvasCommands);
219696
+ }
219697
+ function isBackstagePageVisible(resolved, page) {
219698
+ return !resolved.hiddenBackstagePages.has(page);
219699
+ }
219700
+ function customizeBackstageNav(items, resolved) {
219701
+ return items.filter((item) => isBackstagePageVisible(resolved, item.id));
219702
+ }
219703
+ function customizeBackstageCards(cards, resolved) {
219704
+ return cards.filter((card2) => !resolved.hiddenBackstageCards.has(card2.id));
219705
+ }
218989
219706
  function registerCrossSlideAudio(element, src) {
218990
219707
  if (element.playAcrossSlides !== true || element.mediaType !== "audio" || !src) {
218991
219708
  return false;
@@ -223877,12 +224594,15 @@ exports.ACTION_INDICATOR_ICON_PATH = ACTION_INDICATOR_ICON_PATH;
223877
224594
  exports.ARTISTIC_EFFECTS = ARTISTIC_EFFECTS;
223878
224595
  exports.AVATAR_COLOR_SWATCHES = AVATAR_COLOR_SWATCHES;
223879
224596
  exports.BACKSTAGE_BACK_CLASSES = BACKSTAGE_BACK_CLASSES;
224597
+ exports.BACKSTAGE_CARD_IDS = BACKSTAGE_CARD_IDS;
223880
224598
  exports.BACKSTAGE_NAV = BACKSTAGE_NAV;
223881
224599
  exports.BACKSTAGE_NAV_CLASSES = BACKSTAGE_NAV_CLASSES;
224600
+ exports.BACKSTAGE_PAGE_IDS = BACKSTAGE_PAGE_IDS;
223882
224601
  exports.BACKSTAGE_TEMPLATES = BACKSTAGE_TEMPLATES;
223883
224602
  exports.BAR3D_SHAPE_OPTIONS = BAR3D_SHAPE_OPTIONS;
223884
224603
  exports.BEVEL_PRESETS = BEVEL_PRESETS;
223885
224604
  exports.BROADCAST_THROTTLE_MS = BROADCAST_THROTTLE_MS;
224605
+ exports.CANVAS_CONTEXT_MENU_COMMAND_IDS = CANVAS_CONTEXT_MENU_COMMAND_IDS;
223886
224606
  exports.CATEGORIES = CATEGORIES;
223887
224607
  exports.CHARACTER_SPACING_OPTIONS = CHARACTER_SPACING_OPTIONS;
223888
224608
  exports.CHART_QUICK_ACTION_BUTTON_SIZE = CHART_QUICK_ACTION_BUTTON_SIZE;
@@ -223914,9 +224634,12 @@ exports.DEFAULT_VIRTUAL_OVERSCAN = DEFAULT_VIRTUAL_OVERSCAN;
223914
224634
  exports.DIRECTIONAL_PRESETS = DIRECTIONAL_PRESETS;
223915
224635
  exports.DUOTONE_PRESETS = DUOTONE_PRESETS;
223916
224636
  exports.EASE = EASE;
224637
+ exports.EDITOR_SHORTCUT_ACTION_IDS = EDITOR_SHORTCUT_ACTION_IDS;
223917
224638
  exports.EFFECT_SOUND_CATALOGUE = EFFECT_SOUND_CATALOGUE;
223918
224639
  exports.ELEMENT_ACTION_TYPE_OPTIONS = ELEMENT_ACTION_TYPE_OPTIONS;
224640
+ exports.ELEMENT_CONTEXT_MENU_COMMAND_IDS = ELEMENT_CONTEXT_MENU_COMMAND_IDS;
223919
224641
  exports.EMPHASIS_PRESET_VALUES = EMPHASIS_PRESET_VALUES;
224642
+ exports.EMPTY_RESOLVED_CUSTOMIZATION = EMPTY_RESOLVED_CUSTOMIZATION;
223920
224643
  exports.ENTRANCE_PRESET_VALUES = ENTRANCE_PRESET_VALUES;
223921
224644
  exports.EQUATION_TEMPLATES = EQUATION_TEMPLATES;
223922
224645
  exports.EXIT_PRESET_VALUES = EXIT_PRESET_VALUES;
@@ -223964,6 +224687,9 @@ exports.NUM = NUM;
223964
224687
  exports.OFFICE_COLOR_SWATCHES = OFFICE_COLOR_SWATCHES;
223965
224688
  exports.ONLINE_VIDEO_IFRAME_ALLOW = ONLINE_VIDEO_IFRAME_ALLOW;
223966
224689
  exports.ONLINE_VIDEO_IFRAME_SANDBOX = ONLINE_VIDEO_IFRAME_SANDBOX;
224690
+ exports.OPTIONS_PAGE_IDS = OPTIONS_PAGE_IDS;
224691
+ exports.OPTIONS_SECTION_IDS = OPTIONS_SECTION_IDS;
224692
+ exports.OPTIONS_SETTING_IDS = OPTIONS_SETTING_IDS;
223967
224693
  exports.OUTLINE_LEVEL_ATTR = OUTLINE_LEVEL_ATTR;
223968
224694
  exports.OUTLINE_ROW_ATTR = OUTLINE_ROW_ATTR;
223969
224695
  exports.OUTLINE_SLIDE_ATTR = OUTLINE_SLIDE_ATTR;
@@ -224000,6 +224726,7 @@ exports.READING_VIEW_ATTR = READING_VIEW_ATTR;
224000
224726
  exports.READING_VIEW_COUNTER_ATTR = READING_VIEW_COUNTER_ATTR;
224001
224727
  exports.READING_VIEW_STAGE_ATTR = READING_VIEW_STAGE_ATTR;
224002
224728
  exports.RIBBON_SHAPE_SWATCHES = RIBBON_SHAPE_SWATCHES;
224729
+ exports.RIBBON_TAB_IDS = RIBBON_TAB_IDS;
224003
224730
  exports.RIBBON_TRANSITION_PRESETS = RIBBON_TRANSITION_PRESETS;
224004
224731
  exports.RULER_FONT_SIZE = RULER_FONT_SIZE;
224005
224732
  exports.RULER_THICKNESS = RULER_THICKNESS;
@@ -224039,6 +224766,7 @@ exports.THEME_CATALOG = THEME_CATALOG;
224039
224766
  exports.THEME_COLOR_SLOT_LABEL_KEYS = THEME_COLOR_SLOT_LABEL_KEYS;
224040
224767
  exports.TITLE_BAR_CLASSES = TITLE_BAR_CLASSES;
224041
224768
  exports.TITLE_BAR_DEFAULT_FILE_KEY = TITLE_BAR_DEFAULT_FILE_KEY;
224769
+ exports.TOOLBAR_BUTTON_IDS = TOOLBAR_BUTTON_IDS;
224042
224770
  exports.TOOLBAR_TABS = TOOLBAR_TABS;
224043
224771
  exports.TRANSITION_DIR_ARROWS = TRANSITION_DIR_ARROWS;
224044
224772
  exports.TRANSITION_MORPH_OPTIONS = TRANSITION_MORPH_OPTIONS;
@@ -224049,7 +224777,11 @@ exports.TRANSITION_SPEED_DURATION_MS = TRANSITION_SPEED_DURATION_MS;
224049
224777
  exports.TRANSITION_SPEED_OPTIONS = TRANSITION_SPEED_OPTIONS;
224050
224778
  exports.TRIGGER_OPTIONS = TRIGGER_OPTIONS;
224051
224779
  exports.ThemePresets = ThemePresets;
224780
+ exports.VIEWER_DIALOG_IDS = VIEWER_DIALOG_IDS;
224781
+ exports.VIEWER_EXPORT_FORMAT_IDS = VIEWER_EXPORT_FORMAT_IDS;
224782
+ exports.VIEWER_FEATURE_IDS = VIEWER_FEATURE_IDS;
224052
224783
  exports.VIEWER_OPTIONS_TABS = VIEWER_OPTIONS_TABS;
224784
+ exports.VIEWER_PANEL_IDS = VIEWER_PANEL_IDS;
224053
224785
  exports.VIEWER_PREFS_STORAGE_KEY = VIEWER_PREFS_STORAGE_KEY;
224054
224786
  exports.VIEWER_SHORTCUT_REFERENCE = VIEWER_SHORTCUT_REFERENCE;
224055
224787
  exports.WEBM_MIME_CANDIDATES = WEBM_MIME_CANDIDATES;
@@ -224245,6 +224977,7 @@ exports.chartPartToAttrs = chartPartToAttrs;
224245
224977
  exports.chartPreserveAspectRatio = chartPreserveAspectRatio;
224246
224978
  exports.checkModifyPassword = checkModifyPassword;
224247
224979
  exports.clampCropValue = clampCropValue;
224980
+ exports.clampFlyoutPosition = clampFlyoutPosition;
224248
224981
  exports.clampGifDimensions = clampGifDimensions;
224249
224982
  exports.clampNotesFontSize = clampNotesFontSize;
224250
224983
  exports.clampOptionNumber = clampOptionNumber;
@@ -224313,6 +225046,7 @@ exports.createActiveAnimationGroup = createActiveAnimationGroup;
224313
225046
  exports.createBackstagePresentation = createBackstagePresentation;
224314
225047
  exports.createBlankSlide = createBlankSlide;
224315
225048
  exports.createCollaborationLivePatcher = createCollaborationLivePatcher;
225049
+ exports.createCustomizationController = createCustomizationController;
224316
225050
  exports.createDefaultChartElement = createDefaultChartElement;
224317
225051
  exports.createDefaultChartUserShape = createDefaultChartUserShape;
224318
225052
  exports.createDefaultChartUserShapeGroupChild = createDefaultChartUserShapeGroupChild;
@@ -224340,6 +225074,11 @@ exports.createWheelStepBuffer = createWheelStepBuffer;
224340
225074
  exports.createWriteBackScheduler = createWriteBackScheduler;
224341
225075
  exports.cursorForTool = cursorForTool;
224342
225076
  exports.customGeometryPathsToSvgSubpaths = customGeometryPathsToSvgSubpaths;
225077
+ exports.customizeBackstageCards = customizeBackstageCards;
225078
+ exports.customizeBackstageNav = customizeBackstageNav;
225079
+ exports.customizeCanvasContextMenuEntries = customizeCanvasContextMenuEntries;
225080
+ exports.customizeContextMenuEntries = customizeContextMenuEntries;
225081
+ exports.customizeOptionsTabs = customizeOptionsTabs;
224343
225082
  exports.cycleSelectableElement = cycleSelectableElement;
224344
225083
  exports.defaultCssVars = defaultCssVars;
224345
225084
  exports.defaultRadius = defaultRadius;
@@ -224524,13 +225263,16 @@ exports.isBulletMarkerSegment = isBulletMarkerSegment;
224524
225263
  exports.isCalloutShape = isCalloutShape;
224525
225264
  exports.isCellInRect = isCellInRect;
224526
225265
  exports.isCurrentLayout = isCurrentLayout;
225266
+ exports.isDialogAvailable = isDialogAvailable;
224527
225267
  exports.isEditableMotionPath = isEditableMotionPath;
224528
225268
  exports.isEditableTextElement = isEditableTextElement;
225269
+ exports.isEditorControlTarget = isEditorControlTarget;
224529
225270
  exports.isEditorTextInputTarget = isEditorTextInputTarget;
224530
225271
  exports.isElementActionable = isElementActionable;
224531
225272
  exports.isElementLocked = isElementLocked;
224532
225273
  exports.isElementRendered = isElementRendered;
224533
225274
  exports.isExportAbortError = isExportAbortError;
225275
+ exports.isFeatureEnabled = isFeatureEnabled;
224534
225276
  exports.isHeaderFooterDateTextVisible = isHeaderFooterDateTextVisible;
224535
225277
  exports.isHeaderFooterFooterTextVisible = isHeaderFooterFooterTextVisible;
224536
225278
  exports.isHeaderFooterHeaderTextVisible = isHeaderFooterHeaderTextVisible;
@@ -224544,6 +225286,8 @@ exports.isLinkedTextBox = isLinkedTextBox;
224544
225286
  exports.isMediaFullscreenActive = isMediaFullscreenActive;
224545
225287
  exports.isMixedContentBlocked = isMixedContentBlocked;
224546
225288
  exports.isMobileViewport = isMobileViewport;
225289
+ exports.isOptionsPageVisible = isOptionsPageVisible;
225290
+ exports.isPanelVisible = isPanelVisible;
224547
225291
  exports.isPpactionUrl = isPpactionUrl;
224548
225292
  exports.isPresentationAdvanceClick = isPresentationAdvanceClick;
224549
225293
  exports.isPresentationSessionMessage = isPresentationSessionMessage;
@@ -224562,8 +225306,8 @@ exports.loadSessionDeck = loadSessionDeck;
224562
225306
  exports.lockResizeAspect = lockResizeAspect;
224563
225307
  exports.makeCloneId = makeCloneId;
224564
225308
  exports.makeSlideId = makeSlideId;
225309
+ exports.mapCustomizedEditorKey = mapCustomizedEditorKey;
224565
225310
  exports.mapEditingWheel = mapEditingWheel;
224566
- exports.mapEditorKey = mapEditorKey;
224567
225311
  exports.mapInlineTextFormatKey = mapInlineTextFormatKey;
224568
225312
  exports.mapOutlineKey = mapOutlineKey;
224569
225313
  exports.mapPresentationKey = mapPresentationKey;
@@ -224746,6 +225490,7 @@ exports.resolveDefaultPrintSettings = resolveDefaultPrintSettings;
224746
225490
  exports.resolveDirection = resolveDirection;
224747
225491
  exports.resolveDirection8 = resolveDirection8;
224748
225492
  exports.resolveDisplayedChartType = resolveDisplayedChartType;
225493
+ exports.resolveEffectiveHiddenActions = resolveEffectiveHiddenActions;
224749
225494
  exports.resolveElementActionAffordance = resolveElementActionAffordance;
224750
225495
  exports.resolveElementAriaAttributes = resolveElementAriaAttributes;
224751
225496
  exports.resolveElementHighlightClick = resolveElementHighlightClick;