ooxml-ui 1.8.4 → 1.9.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 (87) hide show
  1. package/dist/{chunk-CTPXTRDT.js → chunk-PH7IBZOZ.js} +1 -1
  2. package/dist/docx/columns-dialog.d.ts +1 -1
  3. package/dist/docx/editor-core.d.ts +2 -0
  4. package/dist/docx/page-controller.d.ts +3 -2
  5. package/dist/docx/print-drag-scroll.d.ts +7 -0
  6. package/dist/docx/print-editing-geometry.d.ts +2 -0
  7. package/dist/docx/print-editing-index.d.ts +30 -0
  8. package/dist/docx/print-editing.d.ts +12 -0
  9. package/dist/docx/print-keyboard-navigation.d.ts +18 -0
  10. package/dist/docx/print-layout-view.d.ts +6 -10
  11. package/dist/docx/print-layout.d.ts +2 -2
  12. package/dist/docx/print-picture.d.ts +1 -0
  13. package/dist/docx.js +677 -20
  14. package/dist/index.js +2 -2
  15. package/dist/pptx/{chunk-KMNNTEGF.cjs → chunk-BFZDO2DY.cjs} +429 -194
  16. package/dist/pptx/{chunk-VRFNAF3Q.mjs → chunk-F7BBPOVJ.mjs} +9 -0
  17. package/dist/pptx/{chunk-STXGHV25.cjs → chunk-HWW2UVUP.cjs} +161 -4
  18. package/dist/pptx/{chunk-GHFJ46NS.mjs → chunk-KBCKCW5M.mjs} +371 -161
  19. package/dist/pptx/{chunk-NVYVHNPD.mjs → chunk-MKVKISFW.mjs} +1 -1
  20. package/dist/pptx/{chunk-NKHPE4PS.cjs → chunk-PKDISDDZ.cjs} +2 -2
  21. package/dist/pptx/{chunk-SM3CWDIQ.cjs → chunk-QVYJB7G2.cjs} +9 -0
  22. package/dist/pptx/chunk-SABFKDRM.mjs +286 -0
  23. package/dist/pptx/dom/elements/image.d.ts.map +1 -1
  24. package/dist/pptx/dom/index.cjs +221 -213
  25. package/dist/pptx/dom/index.mjs +24 -16
  26. package/dist/pptx/i18n/index.cjs +6 -6
  27. package/dist/pptx/i18n/index.mjs +1 -1
  28. package/dist/pptx/i18n/translations-en.d.ts.map +1 -1
  29. package/dist/pptx/index.cjs +2834 -2766
  30. package/dist/pptx/index.mjs +4 -4
  31. package/dist/pptx/render/find-replace.d.ts +1 -1
  32. package/dist/pptx/render/find-replace.d.ts.map +1 -1
  33. package/dist/pptx/render/format-painter.cjs +5 -5
  34. package/dist/pptx/render/format-painter.mjs +2 -2
  35. package/dist/pptx/render/index.d.ts +3 -0
  36. package/dist/pptx/render/index.d.ts.map +1 -1
  37. package/dist/pptx/render/inspector-helpers.cjs +12 -12
  38. package/dist/pptx/render/inspector-helpers.d.ts.map +1 -1
  39. package/dist/pptx/render/inspector-helpers.mjs +1 -1
  40. package/dist/pptx/render/inspector-number.d.ts +15 -0
  41. package/dist/pptx/render/inspector-number.d.ts.map +1 -0
  42. package/dist/pptx/render/picture-frame.d.ts +52 -0
  43. package/dist/pptx/render/picture-frame.d.ts.map +1 -0
  44. package/dist/pptx/render/ribbon-home-commands.d.ts +11 -2
  45. package/dist/pptx/render/ribbon-home-commands.d.ts.map +1 -1
  46. package/dist/pptx/render/share-session.d.ts.map +1 -1
  47. package/dist/pptx/render/slide-operations.d.ts +2 -1
  48. package/dist/pptx/render/slide-operations.d.ts.map +1 -1
  49. package/dist/pptx/render/slide-package-clipboard.d.ts +31 -0
  50. package/dist/pptx/render/slide-package-clipboard.d.ts.map +1 -0
  51. package/dist/pptx/render/slide-sorter-context-menu.d.ts +3 -5
  52. package/dist/pptx/render/slide-sorter-context-menu.d.ts.map +1 -1
  53. package/dist/pptx/render/slide-sorter-state.d.ts +8 -1
  54. package/dist/pptx/render/slide-sorter-state.d.ts.map +1 -1
  55. package/dist/pptx/render/text-advanced.d.ts.map +1 -1
  56. package/dist/pptx/render/text-style-scope.d.ts +41 -1
  57. package/dist/pptx/render/text-style-scope.d.ts.map +1 -1
  58. package/dist/pptx/render/text-style-update.d.ts.map +1 -1
  59. package/dist/pptx/web-components/index.d.ts +2 -0
  60. package/dist/pptx/web-components/index.d.ts.map +1 -1
  61. package/dist/pptx/web-components/slide-clipboard.d.ts +14 -0
  62. package/dist/pptx/web-components/slide-clipboard.d.ts.map +1 -0
  63. package/dist/teams.js +1 -1
  64. package/dist/visio/format-pane-fields.d.ts +2 -0
  65. package/dist/visio/page-setup-action.d.ts +1 -1
  66. package/dist/visio/page-setup-dialog-form.d.ts +1 -1
  67. package/dist/visio/ribbon-action.d.ts +1 -1
  68. package/dist/visio/viewer-accessibility.d.ts +17 -0
  69. package/dist/visio/viewer-insert-dialog.d.ts +2 -1
  70. package/dist/visio/viewer-review.d.ts +2 -0
  71. package/dist/visio.js +304 -14
  72. package/dist/xlsx/commands/pivots.d.ts +2 -0
  73. package/dist/xlsx/commands/sparklines.d.ts +2 -0
  74. package/dist/xlsx/dialogs/help-dialogs.d.ts +2 -2
  75. package/dist/xlsx/dialogs/page-header.d.ts +4 -0
  76. package/dist/xlsx/dialogs/page-setup-tabs.d.ts +6 -1
  77. package/dist/xlsx/dialogs/pivots.d.ts +2 -0
  78. package/dist/xlsx/dialogs/print-preview.d.ts +2 -0
  79. package/dist/xlsx/dialogs/sparklines.d.ts +4 -0
  80. package/dist/xlsx/print-cell.d.ts +4 -0
  81. package/dist/xlsx/print-header.d.ts +7 -0
  82. package/dist/xlsx/print-pages.d.ts +4 -0
  83. package/dist/xlsx/print.d.ts +4 -12
  84. package/dist/xlsx.js +1078 -287
  85. package/package.json +3 -3
  86. package/dist/pptx/chunk-VD7HRMTA.mjs +0 -137
  87. /package/dist/{chunk-SUHT5S2P.js → chunk-SKYBYVYH.js} +0 -0
@@ -9,7 +9,7 @@ var chunkXOAXPD2W_cjs = require('./chunk-XOAXPD2W.cjs');
9
9
  var chunkBSGCZ4JZ_cjs = require('./chunk-BSGCZ4JZ.cjs');
10
10
  var chunkIOOI63TH_cjs = require('./chunk-IOOI63TH.cjs');
11
11
  var chunkZJFN5POF_cjs = require('./chunk-ZJFN5POF.cjs');
12
- var chunkSTXGHV25_cjs = require('./chunk-STXGHV25.cjs');
12
+ var chunkHWW2UVUP_cjs = require('./chunk-HWW2UVUP.cjs');
13
13
  var chunkWB25PCHQ_cjs = require('./chunk-WB25PCHQ.cjs');
14
14
  var chunkW3X2UVYQ_cjs = require('./chunk-W3X2UVYQ.cjs');
15
15
  var chunkVFPVEVF4_cjs = require('./chunk-VFPVEVF4.cjs');
@@ -20,7 +20,8 @@ var chunkX4FNVH7J_cjs = require('./chunk-X4FNVH7J.cjs');
20
20
  var chunkUPN5FFKP_cjs = require('./chunk-UPN5FFKP.cjs');
21
21
  var chunkY4LTLCQP_cjs = require('./chunk-Y4LTLCQP.cjs');
22
22
  var chunkUSBRSEJK_cjs = require('./chunk-USBRSEJK.cjs');
23
- var chunkSM3CWDIQ_cjs = require('./chunk-SM3CWDIQ.cjs');
23
+ var chunkU47LRWDT_cjs = require('./chunk-U47LRWDT.cjs');
24
+ var chunkQVYJB7G2_cjs = require('./chunk-QVYJB7G2.cjs');
24
25
  var chunkOGJRSAGH_cjs = require('./chunk-OGJRSAGH.cjs');
25
26
  var chunkEW5DW5KR_cjs = require('./chunk-EW5DW5KR.cjs');
26
27
  var pptx = require('ooxml-core/pptx');
@@ -107,6 +108,123 @@ function _interopNamespace(e) {
107
108
 
108
109
  var opentypeModule__namespace = /*#__PURE__*/_interopNamespace(opentypeModule);
109
110
 
111
+ // src/pptx/web-components/control-styles.ts
112
+ var sheetsByDocument = /* @__PURE__ */ new WeakMap();
113
+ function attachControlStyles(root, css) {
114
+ const doc = root.host.ownerDocument;
115
+ const Sheet = doc.defaultView?.CSSStyleSheet;
116
+ if (Sheet && "adoptedStyleSheets" in root && "replaceSync" in Sheet.prototype) {
117
+ try {
118
+ let sheets = sheetsByDocument.get(doc);
119
+ if (!sheets) {
120
+ sheets = /* @__PURE__ */ new Map();
121
+ sheetsByDocument.set(doc, sheets);
122
+ }
123
+ let sheet = sheets.get(css);
124
+ if (!sheet) {
125
+ sheet = new Sheet();
126
+ sheet.replaceSync(css);
127
+ sheets.set(css, sheet);
128
+ }
129
+ root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];
130
+ return;
131
+ } catch {
132
+ }
133
+ }
134
+ const style = doc.createElement("style");
135
+ style.textContent = css;
136
+ root.append(style);
137
+ }
138
+
139
+ // src/pptx/web-components/slide-clipboard.ts
140
+ function slideClipboardLabels(t) {
141
+ return {
142
+ copy: t("pptx.slideSorter.systemCopy"),
143
+ paste: t("pptx.slideSorter.systemPaste"),
144
+ copied: t("pptx.slideSorter.systemCopied"),
145
+ pasted: t("pptx.slideSorter.systemPasted")
146
+ };
147
+ }
148
+ function definePptxSlideClipboard(registry2) {
149
+ if (registry2.get("pptx-ui-slide-clipboard")) return;
150
+ class SlideClipboard extends HTMLElement {
151
+ copy;
152
+ paste;
153
+ text = {
154
+ copy: "Copy slides to system clipboard",
155
+ paste: "Paste slides from system clipboard",
156
+ copied: "Slides copied",
157
+ pasted: "Slides pasted"
158
+ };
159
+ busy = false;
160
+ copyButton;
161
+ pasteButton;
162
+ status;
163
+ constructor() {
164
+ super();
165
+ const root = this.attachShadow({ mode: "open" });
166
+ attachControlStyles(
167
+ root,
168
+ ":host{display:inline-flex;align-items:center;flex-wrap:wrap;gap:6px;color:var(--pptx-foreground,var(--foreground,#222))}button{padding:5px 8px;border:1px solid var(--pptx-border,var(--border,#ccc));border-radius:4px;background:var(--pptx-muted,var(--muted,#eee));color:inherit;font:inherit;font-size:12px;cursor:pointer}button:disabled{opacity:.5;cursor:default}[role=status]{max-width:400px;font-size:12px}"
169
+ );
170
+ this.copyButton = document.createElement("button");
171
+ this.copyButton.type = "button";
172
+ this.pasteButton = document.createElement("button");
173
+ this.pasteButton.type = "button";
174
+ this.status = document.createElement("span");
175
+ this.status.setAttribute("role", "status");
176
+ this.status.setAttribute("aria-live", "polite");
177
+ this.copyButton.addEventListener("click", () => void this.run(this.copy, this.text.copied));
178
+ this.pasteButton.addEventListener("click", () => void this.run(this.paste, this.text.pasted));
179
+ root.append(this.copyButton, this.pasteButton, this.status);
180
+ this.sync();
181
+ }
182
+ get copyAction() {
183
+ return this.copy;
184
+ }
185
+ set copyAction(value) {
186
+ this.copy = value;
187
+ this.sync();
188
+ }
189
+ get pasteAction() {
190
+ return this.paste;
191
+ }
192
+ set pasteAction(value) {
193
+ this.paste = value;
194
+ this.sync();
195
+ }
196
+ get labels() {
197
+ return this.text;
198
+ }
199
+ set labels(value) {
200
+ this.text = value;
201
+ this.sync();
202
+ }
203
+ sync() {
204
+ this.copyButton.textContent = this.text.copy;
205
+ this.pasteButton.textContent = this.text.paste;
206
+ this.copyButton.disabled = this.busy || !this.copy;
207
+ this.pasteButton.disabled = this.busy || !this.paste;
208
+ }
209
+ async run(action, success) {
210
+ if (!action || this.busy) return;
211
+ this.busy = true;
212
+ this.status.textContent = "";
213
+ this.sync();
214
+ try {
215
+ await action();
216
+ this.status.textContent = success;
217
+ } catch (error) {
218
+ this.status.textContent = error instanceof Error ? error.message : String(error);
219
+ } finally {
220
+ this.busy = false;
221
+ this.sync();
222
+ }
223
+ }
224
+ }
225
+ registry2.define("pptx-ui-slide-clipboard", SlideClipboard);
226
+ }
227
+
110
228
  // src/pptx/web-components/control-tokens.ts
111
229
  var CONTROL_TOKENS = {
112
230
  // Field (search, select trigger, text inputs)
@@ -1446,6 +1564,33 @@ function resolveShapeGeometry(element) {
1446
1564
  }
1447
1565
  return { kind: "none" };
1448
1566
  }
1567
+ function getPictureShadowFilter(element) {
1568
+ if (!pptx.isImageLikeElement(element) || !pptx.hasShapeProperties(element)) {
1569
+ return void 0;
1570
+ }
1571
+ return getCompositeOuterShadowFilterCss(element.shapeStyle, { rotation: element.rotation });
1572
+ }
1573
+ function hasPictureFrame(element) {
1574
+ if (!pptx.isImageLikeElement(element)) {
1575
+ return false;
1576
+ }
1577
+ return buildStrokeOutline(element) !== void 0 || getPictureShadowFilter(element) !== void 0;
1578
+ }
1579
+ function getPictureFrameLayers(element, clip) {
1580
+ const clipStyle = {
1581
+ overflow: clip.overflow,
1582
+ ...clip.borderRadius ? { borderRadius: clip.borderRadius } : {},
1583
+ ...clip.clipPath ? { clipPath: clip.clipPath } : {}
1584
+ };
1585
+ if (!hasPictureFrame(element)) {
1586
+ return { box: clipStyle, surface: void 0 };
1587
+ }
1588
+ const shadow = getPictureShadowFilter(element);
1589
+ return {
1590
+ box: { overflow: "visible", ...shadow ? { filter: shadow } : {} },
1591
+ surface: { position: "absolute", inset: "0", ...clipStyle }
1592
+ };
1593
+ }
1449
1594
  var NO_STROKE = {
1450
1595
  borderWidth: 0,
1451
1596
  cssBorderWidth: "0px",
@@ -22978,7 +23123,7 @@ function createTemplateContext(options = {}) {
22978
23123
  const scheme = { ...pptx.DEFAULT_SCHEME_COLOR_MAP, ...options.scheme ?? {} };
22979
23124
  let counter = 0;
22980
23125
  const idFor = options.idFor ?? ((index) => `template-el-${Date.now()}-${index}`);
22981
- const dictionary = chunkSM3CWDIQ_cjs.translationsEn;
23126
+ const dictionary = chunkQVYJB7G2_cjs.translationsEn;
22982
23127
  const translate = options.translate ?? ((key) => dictionary[key] ?? key);
22983
23128
  return {
22984
23129
  scheme,
@@ -24121,7 +24266,7 @@ function resolveFollowingSegmentTexts(paraSegments, markerSegment, fieldContext)
24121
24266
  function resolveParagraphStrutFontSize(segments, bodyFontSize, fontScale = 1) {
24122
24267
  let smallest;
24123
24268
  for (const segment of segments) {
24124
- if (chunkSTXGHV25_cjs.isBulletMarkerSegment(segment)) {
24269
+ if (chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment)) {
24125
24270
  continue;
24126
24271
  }
24127
24272
  const size = segment.style?.fontSize;
@@ -24809,10 +24954,10 @@ function createInlineListSeed(element, options) {
24809
24954
  const virtualIndices = /* @__PURE__ */ new Map();
24810
24955
  for (const [index, paragraph2] of paragraphs2.entries()) {
24811
24956
  if (paragraph2.segments.every(
24812
- (segment, runIndex) => runIndex === 0 && chunkSTXGHV25_cjs.isBulletMarkerSegment(segment) || segment.text === "" && !segment.isLineBreak && !segment.fieldType && !segment.fieldGuid && !segment.equationXml && !segment.rubyText
24957
+ (segment, runIndex) => runIndex === 0 && chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment) || segment.text === "" && !segment.isLineBreak && !segment.fieldType && !segment.fieldGuid && !segment.equationXml && !segment.rubyText
24813
24958
  )) {
24814
24959
  const carrier = paragraph2.segments[0] ?? paragraph2.terminator;
24815
- const body = paragraph2.segments.find((segment) => !chunkSTXGHV25_cjs.isBulletMarkerSegment(segment));
24960
+ const body = paragraph2.segments.find((segment) => !chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment));
24816
24961
  virtualIndices.set(index, segments.length);
24817
24962
  segments.push({
24818
24963
  text: "",
@@ -24832,7 +24977,7 @@ function createInlineListSeed(element, options) {
24832
24977
  presentation: presentation[sourceIndex],
24833
24978
  runs: Object.freeze(
24834
24979
  (virtualIndices.has(sourceIndex) ? [segments[virtualIndices.get(sourceIndex)]] : paragraph2.segments).flatMap((segment, index) => {
24835
- if (index === 0 && chunkSTXGHV25_cjs.isBulletMarkerSegment(segment)) {
24980
+ if (index === 0 && chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment)) {
24836
24981
  return [];
24837
24982
  }
24838
24983
  const segmentIndex = virtualIndices.get(sourceIndex) ?? indices[sourceIndex][index];
@@ -25033,11 +25178,11 @@ function recordInlineListProvenance(seed, root, snapshot, blocks, origins, uncha
25033
25178
  if (!block) return;
25034
25179
  paragraphs2.set(block, start < end ? start : terminator ?? null);
25035
25180
  const body = segments.slice(start, end);
25036
- const content = body.filter((segment, index) => index !== 0 || !chunkSTXGHV25_cjs.isBulletMarkerSegment(segment));
25181
+ const content = body.filter((segment, index) => index !== 0 || !chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment));
25037
25182
  const onlyEmptyCarrier = content.length === 1 && content[0].text === "" && !content[0].isLineBreak;
25038
25183
  for (let index = start; index < end; index++) {
25039
25184
  const segment = segments[index];
25040
- const marker = index === start && chunkSTXGHV25_cjs.isBulletMarkerSegment(segment);
25185
+ const marker = index === start && chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment);
25041
25186
  if (!marker && (segment.text !== "" || segment.isLineBreak)) continue;
25042
25187
  const node = marker || onlyEmptyCarrier ? block : unchanged2 ? inlineListDescendants(block).find((child) => session.runNodes.get(child) === index) : origins[index];
25043
25188
  hidden.push({ node, kind: marker ? "marker" : "empty", index });
@@ -25346,11 +25491,11 @@ function readInlineListSnapshot(seed, root) {
25346
25491
  } else {
25347
25492
  pptx.breakAutoNumberRun(sequence, first.paragraphLevel ?? 0);
25348
25493
  }
25349
- if (chunkSTXGHV25_cjs.isBulletMarkerSegment(first)) {
25494
+ if (chunkHWW2UVUP_cjs.isBulletMarkerSegment(first)) {
25350
25495
  const marker = {
25351
25496
  text: first.text,
25352
25497
  style: structuredClone(
25353
- carrier && chunkSTXGHV25_cjs.isBulletMarkerSegment(carrier) ? carrier.style : first.style
25498
+ carrier && chunkHWW2UVUP_cjs.isBulletMarkerSegment(carrier) ? carrier.style : first.style
25354
25499
  ),
25355
25500
  ...inlineListParagraphMetadata(first)
25356
25501
  };
@@ -25400,7 +25545,7 @@ function paragraphBodies(segments) {
25400
25545
  paragraphs2.push("");
25401
25546
  first = true;
25402
25547
  } else {
25403
- if (!first || !chunkSTXGHV25_cjs.isBulletMarkerSegment(segment)) {
25548
+ if (!first || !chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment)) {
25404
25549
  paragraphs2[paragraphs2.length - 1] += segment.isLineBreak ? "\n" : segment.text;
25405
25550
  }
25406
25551
  first = false;
@@ -25413,7 +25558,7 @@ function modelPoint(segments, offset, end) {
25413
25558
  let first = true;
25414
25559
  let last = { index: 0, offset: 0 };
25415
25560
  for (const [index, segment] of segments.entries()) {
25416
- const marker = first && chunkSTXGHV25_cjs.isBulletMarkerSegment(segment);
25561
+ const marker = first && chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment);
25417
25562
  first = textSegmentParagraphBreak.isParagraphSeparatorSegment(segment);
25418
25563
  if (marker) {
25419
25564
  if (offset === position && segment.paragraphInsertionStyle && (!segments[index + 1] || textSegmentParagraphBreak.isParagraphSeparatorSegment(segments[index + 1]))) {
@@ -25574,7 +25719,7 @@ function paragraphs(segments) {
25574
25719
  const paragraph2 = result.at(-1);
25575
25720
  const first = !paragraph2.first;
25576
25721
  paragraph2.first ??= segment;
25577
- if (first && chunkSTXGHV25_cjs.isBulletMarkerSegment(segment)) {
25722
+ if (first && chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment)) {
25578
25723
  continue;
25579
25724
  }
25580
25725
  const start = paragraph2.text.length;
@@ -26009,7 +26154,7 @@ function readInlineEditorSelection(segments, preserveCaret = false) {
26009
26154
  function isEditableSpan(span, segments) {
26010
26155
  const segment = segments[getSegmentIndex(span)];
26011
26156
  return Boolean(
26012
- segment && !segment.isParagraphBreak && segment.text !== "\n" && !chunkSTXGHV25_cjs.isBulletMarkerSegment(segment) && (span.textContent?.length ?? 0) > 0
26157
+ segment && !segment.isParagraphBreak && segment.text !== "\n" && !chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment) && (span.textContent?.length ?? 0) > 0
26013
26158
  );
26014
26159
  }
26015
26160
  function getSegmentIndex(span) {
@@ -26088,7 +26233,7 @@ function applyStyleToSelectedSegments(segments, selection, updates) {
26088
26233
  result.push({ ...seg, style: { ...seg.style } });
26089
26234
  continue;
26090
26235
  }
26091
- if (seg.paragraphInsertionStyle && (seg.text === "" || chunkSTXGHV25_cjs.isBulletMarkerSegment(seg))) {
26236
+ if (seg.paragraphInsertionStyle && (seg.text === "" || chunkHWW2UVUP_cjs.isBulletMarkerSegment(seg))) {
26092
26237
  newStartSegIdx = newStartSegIdx < 0 ? result.length : newStartSegIdx;
26093
26238
  newEndSegIdx = result.length;
26094
26239
  result.push(seg);
@@ -26228,7 +26373,7 @@ function positions(segments) {
26228
26373
  let paragraph2 = 0;
26229
26374
  let first = true;
26230
26375
  return segments.map((segment, index) => {
26231
- const marker = first && chunkSTXGHV25_cjs.isBulletMarkerSegment(segment);
26376
+ const marker = first && chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment);
26232
26377
  const emptyCarrier = marker && segment.paragraphInsertionStyle && (!segments[index + 1] || textSegmentParagraphBreak.isParagraphSeparatorSegment(segments[index + 1]));
26233
26378
  const start = offset;
26234
26379
  if (!marker) {
@@ -26286,14 +26431,14 @@ function restoreParagraphMetadata(original, updated) {
26286
26431
  }
26287
26432
  function selectedParagraphBulletKind(element, selection) {
26288
26433
  if (!selection || !pptx.hasTextProperties(element) || !element.textSegments) {
26289
- const kind = chunkSTXGHV25_cjs.elementBulletKind(element);
26434
+ const kind = chunkHWW2UVUP_cjs.elementBulletKind(element);
26290
26435
  return kind === "mixed" ? "none" : kind;
26291
26436
  }
26292
26437
  let first = selection.startSegIdx;
26293
26438
  while (first > 0 && !textSegmentParagraphBreak.isParagraphSeparatorSegment(element.textSegments[first - 1])) {
26294
26439
  first -= 1;
26295
26440
  }
26296
- return chunkSTXGHV25_cjs.paragraphBulletKind(element.textSegments.slice(first));
26441
+ return chunkHWW2UVUP_cjs.paragraphBulletKind(element.textSegments.slice(first));
26297
26442
  }
26298
26443
  function applyListStyleUpdate(element, updates, selection) {
26299
26444
  if (!pptx.hasTextProperties(element) || !updates.listType) {
@@ -26317,7 +26462,7 @@ function applyListStyleUpdate(element, updates, selection) {
26317
26462
  textStyle: selection ? element.textStyle : { ...element.textStyle, ...characterStyle }
26318
26463
  };
26319
26464
  if (!workingSelection || !segments) {
26320
- return { patch: chunkSTXGHV25_cjs.setElementBullets(working, listType), selection: null };
26465
+ return { patch: chunkHWW2UVUP_cjs.setElementBullets(working, listType), selection: null };
26321
26466
  }
26322
26467
  const entries2 = positions(segments);
26323
26468
  const startEntry = entries2[workingSelection.startSegIdx];
@@ -26328,7 +26473,7 @@ function applyListStyleUpdate(element, updates, selection) {
26328
26473
  const startOffset = startEntry.start + workingSelection.startOffset;
26329
26474
  const endOffset = endEntry.start + workingSelection.endOffset;
26330
26475
  const lastSelected = [...entries2].reverse().find((entry5) => entry5.start < endOffset);
26331
- const patch = chunkSTXGHV25_cjs.setElementBullets(working, listType, {
26476
+ const patch = chunkHWW2UVUP_cjs.setElementBullets(working, listType, {
26332
26477
  startParagraph: startEntry.paragraph,
26333
26478
  endParagraph: Math.max(startEntry.paragraph, lastSelected?.paragraph ?? endEntry.paragraph)
26334
26479
  });
@@ -26360,14 +26505,14 @@ function inScope(paragraph2, selection) {
26360
26505
  );
26361
26506
  }
26362
26507
  function selectionBulletKind(element, selection, segments) {
26363
- const paragraphs2 = chunkSTXGHV25_cjs.splitBulletParagraphs(chunkSTXGHV25_cjs.resolveBulletSegments(element, segments));
26364
- return chunkSTXGHV25_cjs.paragraphsBulletKind(paragraphs2.filter((paragraph2) => inScope(paragraph2, selection)));
26508
+ const paragraphs2 = chunkHWW2UVUP_cjs.splitBulletParagraphs(chunkHWW2UVUP_cjs.resolveBulletSegments(element, segments));
26509
+ return chunkHWW2UVUP_cjs.paragraphsBulletKind(paragraphs2.filter((paragraph2) => inScope(paragraph2, selection)));
26365
26510
  }
26366
26511
  function setSelectionBullets(element, kind, selection, segments) {
26367
26512
  if (!pptx.hasTextProperties(element)) {
26368
26513
  return { patch: {}, newSelection: selection };
26369
26514
  }
26370
- const source = chunkSTXGHV25_cjs.resolveBulletSegments(element, segments);
26515
+ const source = chunkHWW2UVUP_cjs.resolveBulletSegments(element, segments);
26371
26516
  const result = applyListStyleUpdate(
26372
26517
  { ...element, textSegments: source },
26373
26518
  { listType: kind },
@@ -26379,122 +26524,47 @@ function toggleSelectionBullets(element, kind, selection, segments) {
26379
26524
  const current = selectionBulletKind(element, selection, segments);
26380
26525
  return setSelectionBullets(element, current === kind ? "none" : kind, selection, segments);
26381
26526
  }
26382
-
26383
- // src/pptx/render/text-style-scope.ts
26384
- var BODY_TEXT_STYLE_KEYS = /* @__PURE__ */ new Set([
26385
- // autofit (`a:normAutofit` / `a:spAutoFit`)
26386
- "autoFit",
26387
- "autoFitMode",
26388
- "autoFitFontScale",
26389
- "autoFitLineSpacingReduction",
26390
- // `a:bodyPr` anchoring, direction, rotation
26391
- "vAlign",
26392
- "anchorCenter",
26393
- "textDirection",
26394
- "textBodyRotation",
26395
- "upright",
26396
- // `a:bodyPr` columns, overflow, wrap
26397
- "columnCount",
26398
- "columnSpacing",
26399
- "rtlColumns",
26400
- "hOverflow",
26401
- "vertOverflow",
26402
- "textWrap",
26403
- // `a:bodyPr` insets
26404
- "bodyInsetLeft",
26405
- "bodyInsetTop",
26406
- "bodyInsetRight",
26407
- "bodyInsetBottom",
26408
- // paragraph geometry the block applies body-wide
26409
- "paragraphMarginLeft",
26410
- "paragraphMarginRight",
26411
- "paragraphIndent",
26412
- "paragraphSpacingBefore",
26413
- "paragraphSpacingAfter",
26414
- "lineSpacing",
26415
- "lineSpacingExactPt",
26416
- "tabStops",
26417
- "defaultTabSize",
26418
- "eaLineBreak",
26419
- "latinLineBreak",
26420
- "fontAlignment",
26421
- "hangingPunctuation",
26422
- // `a:bodyPr` flags
26423
- "spaceFirstLastParagraph",
26424
- "fromWordArt",
26425
- "forceAntiAlias",
26426
- "compatibleLineSpacing",
26427
- // warp and 3D scene on the body
26428
- "textWarpPreset",
26429
- "textWarpAdj",
26430
- "textWarpAdj2",
26431
- "text3d",
26432
- "textBodyScene3d",
26433
- "textBodyScene3dXml",
26434
- "flatText",
26435
- "bodyPropertiesExtLstXml"
26436
- ]);
26437
- function isBodyTextStyleKey(key) {
26438
- return BODY_TEXT_STYLE_KEYS.has(key);
26439
- }
26440
- function splitTextStyleUpdate(updates) {
26441
- const body = {};
26442
- const run = {};
26443
- for (const [key, value] of Object.entries(updates)) {
26444
- (isBodyTextStyleKey(key) ? body : run)[key] = value;
26445
- }
26446
- return { body, run };
26447
- }
26448
- function reconcileDecorationFlags(segments, textStyle, flags) {
26449
- const nextStyle = { ...textStyle ?? {} };
26450
- let nextSegments = [...segments];
26451
- for (const flag2 of flags) {
26452
- const body = nextStyle[flag2] ?? false;
26453
- const content = nextSegments.filter(chunkSTXGHV25_cjs.isContentSegment);
26454
- if (content.length === 0) {
26455
- continue;
26456
- }
26457
- if (content.every((segment) => segment.style?.[flag2] ?? body)) {
26458
- nextStyle[flag2] = true;
26459
- continue;
26460
- }
26461
- if (!body) {
26462
- continue;
26463
- }
26464
- delete nextStyle[flag2];
26465
- nextSegments = nextSegments.map(
26466
- (segment) => chunkSTXGHV25_cjs.isContentSegment(segment) && segment.style?.[flag2] === void 0 ? { ...segment, style: { ...segment.style, [flag2]: true } } : segment
26467
- );
26468
- }
26469
- return { textStyle: nextStyle, textSegments: nextSegments };
26470
- }
26471
26527
  function applyTextStyleUpdate(element, updates, selection, segments) {
26472
26528
  if (!pptx.hasTextProperties(element)) {
26473
26529
  return { patch: {}, newSelection: null };
26474
26530
  }
26475
26531
  const current = segments ?? element.textSegments;
26532
+ const exclusive = chunkHWW2UVUP_cjs.withExclusiveLineSpacing(updates);
26476
26533
  if (selection && current && current.length > 0) {
26477
- const { body, run } = splitTextStyleUpdate(updates);
26534
+ const { body, run } = chunkHWW2UVUP_cjs.splitTextStyleUpdate(exclusive);
26478
26535
  let textStyle2 = { ...element.textStyle, ...body };
26479
- let textSegments2 = [...current];
26536
+ let textSegments2 = chunkHWW2UVUP_cjs.overrideParagraphProperties(current, exclusive);
26480
26537
  let newSelection = selection;
26481
26538
  if (Object.keys(run).length > 0) {
26482
26539
  const scoped = applyStyleToSelectedSegments(textSegments2, selection, run);
26483
26540
  textSegments2 = scoped.newSegments;
26484
26541
  newSelection = scoped.newSelection;
26485
26542
  }
26486
- const touched = chunkSTXGHV25_cjs.TEXT_DECORATION_FLAGS.filter((flag2) => flag2 in run);
26543
+ const touched = chunkHWW2UVUP_cjs.TEXT_DECORATION_FLAGS.filter((flag2) => flag2 in run);
26487
26544
  if (touched.length > 0) {
26488
- const reconciled = reconcileDecorationFlags(textSegments2, textStyle2, touched);
26545
+ const reconciled = chunkHWW2UVUP_cjs.reconcileDecorationFlags(textSegments2, textStyle2, touched);
26489
26546
  textStyle2 = reconciled.textStyle;
26490
26547
  textSegments2 = reconciled.textSegments;
26491
26548
  }
26492
- return { patch: { textStyle: textStyle2, textSegments: textSegments2 }, newSelection };
26549
+ return {
26550
+ patch: {
26551
+ textStyle: textStyle2,
26552
+ textSegments: textSegments2,
26553
+ ...chunkHWW2UVUP_cjs.overrideParagraphIndents(element, exclusive)
26554
+ },
26555
+ newSelection
26556
+ };
26493
26557
  }
26494
- const textStyle = { ...element.textStyle, ...updates };
26495
- const textSegments = current?.map((segment) => chunkOGJRSAGH_cjs.updateTextSegmentStyle(segment, updates));
26558
+ const textStyle = { ...element.textStyle, ...exclusive };
26559
+ const textSegments = current && chunkHWW2UVUP_cjs.overrideParagraphProperties(current, exclusive).map(
26560
+ (segment) => chunkOGJRSAGH_cjs.updateTextSegmentStyle(segment, exclusive)
26561
+ );
26496
26562
  return {
26497
- patch: textSegments ? { textStyle, textSegments } : { textStyle },
26563
+ patch: {
26564
+ textStyle,
26565
+ ...textSegments ? { textSegments } : {},
26566
+ ...chunkHWW2UVUP_cjs.overrideParagraphIndents(element, exclusive)
26567
+ },
26498
26568
  newSelection: null
26499
26569
  };
26500
26570
  }
@@ -30218,10 +30288,12 @@ function textAdvancedStateFromStyle(ts) {
30218
30288
  }
30219
30289
  function textAdvancedPatch(el, changes) {
30220
30290
  const base2 = pptx.hasTextProperties(el) ? el.textStyle ?? {} : {};
30291
+ const exclusive = chunkHWW2UVUP_cjs.withExclusiveLineSpacing(changes);
30221
30292
  return {
30293
+ ...chunkHWW2UVUP_cjs.paragraphOverridePatch(el, exclusive),
30222
30294
  textStyle: {
30223
30295
  ...base2,
30224
- ...changes
30296
+ ...exclusive
30225
30297
  }
30226
30298
  };
30227
30299
  }
@@ -35972,6 +36044,22 @@ function buildReviewRibbon(t, state) {
35972
36044
  ])
35973
36045
  ];
35974
36046
  }
36047
+ var DEFAULT_STROKE_WIDTH = 1;
36048
+ function canGroupSelection(canEdit, selectedCount, selectionGroupable = true) {
36049
+ return canEdit && selectedCount >= 2 && selectionGroupable;
36050
+ }
36051
+ function canUngroupSelection(canEdit, element) {
36052
+ return canEdit && element?.type === "group" && elementLocks.canInteractWithElement(element, "group");
36053
+ }
36054
+ function canSetStrokeWidth(canEdit, element) {
36055
+ return canEdit && element !== null && pptx.hasShapeProperties(element);
36056
+ }
36057
+ function strokeWidthOf(element) {
36058
+ if (element === null || !pptx.hasShapeProperties(element)) {
36059
+ return DEFAULT_STROKE_WIDTH;
36060
+ }
36061
+ return element.shapeStyle?.strokeWidth ?? DEFAULT_STROKE_WIDTH;
36062
+ }
35975
36063
 
35976
36064
  // src/pptx/render/ribbon-home-commands.ts
35977
36065
  function resetSlideLayoutPath(slide) {
@@ -35981,8 +36069,14 @@ function resetSlideLayoutPath(slide) {
35981
36069
  function shapeFillChange(hex2, ref) {
35982
36070
  return { fillColor: hex2, fillColorRef: ref, fillMode: "solid" };
35983
36071
  }
35984
- function shapeOutlineChange(hex2, ref) {
35985
- return { strokeColor: hex2, strokeColorRef: ref };
36072
+ function shapeOutlineChange(hex2, ref, current) {
36073
+ const change = { strokeColor: hex2, strokeColorRef: ref };
36074
+ const lineShows = (current?.strokeWidth ?? 0) > 0;
36075
+ if (current && !lineShows) {
36076
+ change.strokeWidth = DEFAULT_STROKE_WIDTH;
36077
+ change.strokeFillMode = "solid";
36078
+ }
36079
+ return change;
35986
36080
  }
35987
36081
  var RIBBON_SHAPE_SWATCHES = [
35988
36082
  "#ffffff",
@@ -39187,6 +39281,12 @@ function smartArtNodeLabel(node) {
39187
39281
  fontStyle: node.fontStyle
39188
39282
  };
39189
39283
  }
39284
+
39285
+ // src/pptx/render/inspector-number.ts
39286
+ function inspectorNumber(value, fallback = 0) {
39287
+ const source = typeof value === "number" && Number.isFinite(value) ? value : fallback;
39288
+ return Math.round(source * 100) / 100;
39289
+ }
39190
39290
  function clamp7(v, lo, hi) {
39191
39291
  return Math.max(lo, Math.min(hi, v));
39192
39292
  }
@@ -40437,7 +40537,7 @@ function canJoinCollaborationSession(fields) {
40437
40537
  return buildJoinCollaborationConfig(fields) !== null;
40438
40538
  }
40439
40539
  function buildCollaborationShareUrl(config, location) {
40440
- if (!location) {
40540
+ if (!location || location.origin === "null" || location.origin === "") {
40441
40541
  return config.roomId;
40442
40542
  }
40443
40543
  const url = new URL(location.pathname, location.origin);
@@ -42154,7 +42254,7 @@ function isBulletMarker(segment) {
42154
42254
  return false;
42155
42255
  }
42156
42256
  if (bullet.autoNumType) {
42157
- return bullet.paragraphIndex !== void 0 && chunkSTXGHV25_cjs.isBulletMarkerSegment(segment);
42257
+ return bullet.paragraphIndex !== void 0 && chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment);
42158
42258
  }
42159
42259
  const marker = bullet.char ? `${bullet.char} ` : bullet.imageRelId || bullet.imageDataUrl ? "\u{1F4CE} " : "\u2022 ";
42160
42260
  return segment.text === marker;
@@ -52249,7 +52349,7 @@ function remark(patch, edit) {
52249
52349
  return patch;
52250
52350
  }
52251
52351
  const textSegments = patch.textSegments.map((segment) => {
52252
- if (!segment.bulletInfo || !chunkSTXGHV25_cjs.isBulletMarkerSegment(segment)) {
52352
+ if (!segment.bulletInfo || !chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment)) {
52253
52353
  return segment;
52254
52354
  }
52255
52355
  const info = edit(segment.bulletInfo);
@@ -52259,9 +52359,9 @@ function remark(patch, edit) {
52259
52359
  }
52260
52360
  function applyBulletLibrary(element, spec5) {
52261
52361
  if (!spec5) {
52262
- return chunkSTXGHV25_cjs.setElementBullets(element, "none");
52362
+ return chunkHWW2UVUP_cjs.setElementBullets(element, "none");
52263
52363
  }
52264
- return remark(chunkSTXGHV25_cjs.setElementBullets(element, "bullet"), (info) => ({
52364
+ return remark(chunkHWW2UVUP_cjs.setElementBullets(element, "bullet"), (info) => ({
52265
52365
  ...baseInfo(info),
52266
52366
  char: spec5.char,
52267
52367
  fontFamily: spec5.font.typeface,
@@ -52272,9 +52372,9 @@ function applyBulletLibrary(element, spec5) {
52272
52372
  }
52273
52373
  function applyNumberingLibrary(element, scheme) {
52274
52374
  if (!scheme) {
52275
- return chunkSTXGHV25_cjs.setElementBullets(element, "none");
52375
+ return chunkHWW2UVUP_cjs.setElementBullets(element, "none");
52276
52376
  }
52277
- return remark(chunkSTXGHV25_cjs.setElementBullets(element, "numbered"), (info) => ({
52377
+ return remark(chunkHWW2UVUP_cjs.setElementBullets(element, "numbered"), (info) => ({
52278
52378
  ...baseInfo(info),
52279
52379
  autoNumType: scheme,
52280
52380
  autoNumStartAt: info.autoNumStartAt ?? 1,
@@ -52282,13 +52382,13 @@ function applyNumberingLibrary(element, scheme) {
52282
52382
  }));
52283
52383
  }
52284
52384
  function paragraphInfos(element) {
52285
- return chunkSTXGHV25_cjs.splitBulletParagraphs(chunkSTXGHV25_cjs.resolveBulletSegments(element)).filter((paragraph2) => paragraph2.segments.length > 0).map((paragraph2) => paragraph2.segments[0].bulletInfo);
52385
+ return chunkHWW2UVUP_cjs.splitBulletParagraphs(chunkHWW2UVUP_cjs.resolveBulletSegments(element)).filter((paragraph2) => paragraph2.segments.length > 0).map((paragraph2) => paragraph2.segments[0].bulletInfo);
52286
52386
  }
52287
52387
  function hasBulletLibrary(element, spec5) {
52288
52388
  if (!pptx.hasTextProperties(element)) {
52289
52389
  return false;
52290
52390
  }
52291
- const kind = chunkSTXGHV25_cjs.elementBulletKind(element);
52391
+ const kind = chunkHWW2UVUP_cjs.elementBulletKind(element);
52292
52392
  if (!spec5) {
52293
52393
  return kind === "none";
52294
52394
  }
@@ -52300,7 +52400,7 @@ function hasNumberingLibrary(element, scheme) {
52300
52400
  if (!pptx.hasTextProperties(element)) {
52301
52401
  return false;
52302
52402
  }
52303
- const kind = chunkSTXGHV25_cjs.elementBulletKind(element);
52403
+ const kind = chunkHWW2UVUP_cjs.elementBulletKind(element);
52304
52404
  if (!scheme) {
52305
52405
  return kind === "none";
52306
52406
  }
@@ -58417,7 +58517,7 @@ function buildInlineListStylePatch(element, updates, selection) {
58417
58517
  return {
58418
58518
  textSegments: element.textSegments.map(
58419
58519
  (segment) => chunkOGJRSAGH_cjs.updateTextSegmentStyle(segment, updates, {
58420
- updateBodyStyle: !(segment.paragraphInsertionStyle && chunkSTXGHV25_cjs.isBulletMarkerSegment(segment))
58520
+ updateBodyStyle: !(segment.paragraphInsertionStyle && chunkHWW2UVUP_cjs.isBulletMarkerSegment(segment))
58421
58521
  })
58422
58522
  ),
58423
58523
  textStyle: { ...element.textStyle, ...updates }
@@ -58474,22 +58574,6 @@ var LINE_CAP_OPTIONS = [
58474
58574
  { value: "rnd", label: "Round", i18nKey: "pptx.strokeOptions.capRound" },
58475
58575
  { value: "sq", label: "Square", i18nKey: "pptx.strokeOptions.capSquare" }
58476
58576
  ];
58477
- var DEFAULT_STROKE_WIDTH = 1;
58478
- function canGroupSelection(canEdit, selectedCount, selectionGroupable = true) {
58479
- return canEdit && selectedCount >= 2 && selectionGroupable;
58480
- }
58481
- function canUngroupSelection(canEdit, element) {
58482
- return canEdit && element?.type === "group" && elementLocks.canInteractWithElement(element, "group");
58483
- }
58484
- function canSetStrokeWidth(canEdit, element) {
58485
- return canEdit && element !== null && pptx.hasShapeProperties(element);
58486
- }
58487
- function strokeWidthOf(element) {
58488
- if (element === null || !pptx.hasShapeProperties(element)) {
58489
- return DEFAULT_STROKE_WIDTH;
58490
- }
58491
- return element.shapeStyle?.strokeWidth ?? DEFAULT_STROKE_WIDTH;
58492
- }
58493
58577
 
58494
58578
  // src/pptx/render/chart-secondary-axis.ts
58495
58579
  function isSeriesUsingSecondaryAxis(chartData, seriesIndex) {
@@ -59185,7 +59269,7 @@ function transformInlineListCase(snapshot, selection, mode) {
59185
59269
  let first = true;
59186
59270
  const textSegments = chunk52LKIMK3_cjs.applyCaseTransformToSegments(source, selection, mode).map(
59187
59271
  (segment, index) => {
59188
- const marker = first && chunkSTXGHV25_cjs.isBulletMarkerSegment(source[index]);
59272
+ const marker = first && chunkHWW2UVUP_cjs.isBulletMarkerSegment(source[index]);
59189
59273
  first = textSegmentParagraphBreak.isParagraphSeparatorSegment(source[index]);
59190
59274
  return marker ? source[index] : segment;
59191
59275
  }
@@ -64422,17 +64506,18 @@ function selectSorterSlide(state, slides, index, modifiers = {}, context = false
64422
64506
  if (!slide || context && state.selectedIds.includes(slide.id)) {
64423
64507
  return state;
64424
64508
  }
64425
- if (!context && (modifiers.ctrlKey || modifiers.metaKey)) {
64509
+ if (!context && modifiers.shiftKey) {
64510
+ const range = slides.slice(Math.min(state.anchor, index), Math.max(state.anchor, index) + 1).map((s) => s.id);
64426
64511
  return {
64427
64512
  ...state,
64428
- anchor: index,
64429
- selectedIds: state.selectedIds.includes(slide.id) ? state.selectedIds.filter((id) => id !== slide.id) : [...state.selectedIds, slide.id]
64513
+ selectedIds: modifiers.ctrlKey || modifiers.metaKey ? [.../* @__PURE__ */ new Set([...state.selectedIds, ...range])] : range
64430
64514
  };
64431
64515
  }
64432
- if (!context && modifiers.shiftKey) {
64516
+ if (!context && (modifiers.ctrlKey || modifiers.metaKey)) {
64433
64517
  return {
64434
64518
  ...state,
64435
- selectedIds: slides.slice(Math.min(state.anchor, index), Math.max(state.anchor, index) + 1).map((s) => s.id)
64519
+ anchor: index,
64520
+ selectedIds: state.selectedIds.includes(slide.id) ? state.selectedIds.filter((id) => id !== slide.id) : [...state.selectedIds, slide.id]
64436
64521
  };
64437
64522
  }
64438
64523
  return { ...state, anchor: index, selectedIds: [slide.id] };
@@ -64444,7 +64529,9 @@ function sorterMenuContext(state, slides) {
64444
64529
  const indexes = sorterSelectionIndexes(state, slides);
64445
64530
  return {
64446
64531
  selectedCount: indexes.length,
64447
- hasClipboard: slideSorterPasteIndexes(state.clipboardIds, slides).length > 0,
64532
+ hasClipboard: Boolean(
64533
+ state.clipboardSlides?.length || slideSorterPasteIndexes(state.clipboardIds, slides).length
64534
+ ),
64448
64535
  hasHiddenInSelection: indexes.some((i) => slides[i].hidden),
64449
64536
  hasVisibleInSelection: indexes.some((i) => !slides[i].hidden),
64450
64537
  wouldDeleteAllSlides: indexes.length >= slides.length
@@ -64453,7 +64540,7 @@ function sorterMenuContext(state, slides) {
64453
64540
  function sorterGridColumns(zoom) {
64454
64541
  return zoom >= 180 ? 2 : zoom >= 140 ? 3 : zoom >= 100 ? 4 : zoom >= 70 ? 5 : 6;
64455
64542
  }
64456
- function applySorterAction(state, slides, action, active2) {
64543
+ function applySorterAction(state, slides, action, active2, clipboardSourceSlides, clipboardTemplates = {}) {
64457
64544
  const indexes = sorterSelectionIndexes(state, slides);
64458
64545
  switch (action) {
64459
64546
  case "close":
@@ -64466,7 +64553,21 @@ function applySorterAction(state, slides, action, active2) {
64466
64553
  case "selectAll":
64467
64554
  return { state: { ...state, selectedIds: slides.map((s) => s.id) }, indexes: [] };
64468
64555
  case "copy":
64469
- return { state: { ...state, clipboardIds: indexes.map((i) => slides[i].id) }, indexes: [] };
64556
+ return {
64557
+ state: {
64558
+ ...state,
64559
+ clipboardIds: indexes.map((i) => slides[i].id),
64560
+ clipboardSlides: slideOperations.captureSlideClipboard(
64561
+ clipboardSourceSlides ?? slides,
64562
+ indexes.map((i) => slides[i].id)
64563
+ ),
64564
+ clipboardTemplates: slideOperations.captureSlideClipboardTemplates(
64565
+ clipboardTemplates,
64566
+ indexes.map((i) => slides[i].id)
64567
+ )
64568
+ },
64569
+ indexes: []
64570
+ };
64470
64571
  case "zoomIn":
64471
64572
  case "zoomOut":
64472
64573
  return {
@@ -64479,11 +64580,16 @@ function applySorterAction(state, slides, action, active2) {
64479
64580
  indexes: []
64480
64581
  };
64481
64582
  case "paste":
64482
- return {
64483
- state,
64484
- indexes: slideSorterPasteIndexes(state.clipboardIds, slides).reverse(),
64485
- operation: "duplicate"
64486
- };
64583
+ if (!state.clipboardSlides?.length) return { state, indexes: [] };
64584
+ {
64585
+ const insertAt = sorterPasteInsertAt(indexes, active2, slides.length);
64586
+ const paste = slideOperations.createSlidePaste(state.clipboardSlides, insertAt, state.clipboardTemplates);
64587
+ return {
64588
+ state: { ...state, selectedIds: paste.copies.map((slide) => slide.id), anchor: insertAt },
64589
+ indexes: [],
64590
+ paste
64591
+ };
64592
+ }
64487
64593
  case "delete":
64488
64594
  return {
64489
64595
  state: indexes.length < slides.length ? { ...state, selectedIds: [] } : state,
@@ -64495,6 +64601,9 @@ function applySorterAction(state, slides, action, active2) {
64495
64601
  return { state, indexes: indexes.reverse(), operation: action };
64496
64602
  }
64497
64603
  }
64604
+ function sorterPasteInsertAt(indexes, active2, slideCount) {
64605
+ return Math.min(slideCount, Math.max(0, (indexes.at(-1) ?? active2) + 1));
64606
+ }
64498
64607
 
64499
64608
  // src/pptx/render/viewer-root-options.ts
64500
64609
  var VIEWER_ROOT_OPTION_DEFAULTS = Object.freeze({
@@ -64605,33 +64714,131 @@ function attachViewerHyperlinks(root, navigation) {
64605
64714
  else root.setAttribute(readOnlyAttr, previousReadOnly);
64606
64715
  };
64607
64716
  }
64608
-
64609
- // src/pptx/web-components/control-styles.ts
64610
- var sheetsByDocument = /* @__PURE__ */ new WeakMap();
64611
- function attachControlStyles(root, css) {
64612
- const doc = root.host.ownerDocument;
64613
- const Sheet = doc.defaultView?.CSSStyleSheet;
64614
- if (Sheet && "adoptedStyleSheets" in root && "replaceSync" in Sheet.prototype) {
64615
- try {
64616
- let sheets = sheetsByDocument.get(doc);
64617
- if (!sheets) {
64618
- sheets = /* @__PURE__ */ new Map();
64619
- sheetsByDocument.set(doc, sheets);
64717
+ function createSlidePackageClipboard(initialHost) {
64718
+ let host2 = initialHost, disposed = false, pending = false;
64719
+ const retiredHandlers = /* @__PURE__ */ new Set();
64720
+ const mediaUrls = /* @__PURE__ */ new Set();
64721
+ const snapshot = () => {
64722
+ if (disposed) throw new Error("Presentation is closed");
64723
+ if (pending) throw new Error("Another clipboard operation is in progress");
64724
+ const value = host2.getSnapshot();
64725
+ if (!value) throw new Error("Open a presentation first");
64726
+ return value;
64727
+ };
64728
+ return {
64729
+ updateHost(next) {
64730
+ host2 = next;
64731
+ },
64732
+ async copy(indexes) {
64733
+ const before = snapshot();
64734
+ if (!indexes.length) throw new Error("Select slides to copy");
64735
+ const clipboard = globalThis.navigator?.clipboard;
64736
+ if (!clipboard) throw new Error("System clipboard is unavailable in this browser");
64737
+ const slides = templateEditing.buildSaveSlides(before.slides, before.templateElementsBySlideId).map(
64738
+ clone.cloneSlide
64739
+ );
64740
+ pending = true;
64741
+ try {
64742
+ const text3 = before.handler.save(slides).then((bytes) => pptx.createSlideClipboardPackage(bytes, indexes)).then(pptx.serializeSlidePackageClipboard);
64743
+ if (typeof ClipboardItem === "undefined" || !ClipboardItem.supports?.(pptx.SLIDE_PACKAGE_CLIPBOARD_MIME) || !clipboard.write) {
64744
+ await text3;
64745
+ throw new Error("This browser does not support slide packages in the system clipboard");
64746
+ }
64747
+ const preview = indexes.map(
64748
+ (index) => slides[index]?.elements.map(slideSearch.collectElementText).filter(Boolean).join("\n") ?? ""
64749
+ ).join("\n\n");
64750
+ const blob = text3.then(
64751
+ (value) => new Blob([value], { type: pptx.SLIDE_PACKAGE_CLIPBOARD_MIME.slice(4) })
64752
+ );
64753
+ const write = clipboard.write([
64754
+ new ClipboardItem({
64755
+ [pptx.SLIDE_PACKAGE_CLIPBOARD_MIME]: blob,
64756
+ "text/plain": new Blob([preview], { type: "text/plain" })
64757
+ })
64758
+ ]);
64759
+ const settled = await Promise.allSettled([write, text3]);
64760
+ for (const result of settled) if (result.status === "rejected") throw result.reason;
64761
+ } finally {
64762
+ pending = false;
64620
64763
  }
64621
- let sheet = sheets.get(css);
64622
- if (!sheet) {
64623
- sheet = new Sheet();
64624
- sheet.replaceSync(css);
64625
- sheets.set(css, sheet);
64764
+ },
64765
+ async paste(insertAt) {
64766
+ const before = snapshot();
64767
+ if (before.editable === false) throw new Error("Presentation is read-only");
64768
+ const clipboard = globalThis.navigator?.clipboard;
64769
+ if (!clipboard?.readText) throw new Error("System clipboard is unavailable in this browser");
64770
+ pending = true;
64771
+ let handler, committed = false;
64772
+ const urls = [];
64773
+ try {
64774
+ const items = clipboard.read ? await clipboard.read() : [];
64775
+ const item4 = items.find((value) => value.types.includes(pptx.SLIDE_PACKAGE_CLIPBOARD_MIME));
64776
+ const text3 = item4 ? await (await item4.getType(pptx.SLIDE_PACKAGE_CLIPBOARD_MIME)).text() : await clipboard.readText();
64777
+ const source = pptx.deserializeSlidePackageClipboard(text3);
64778
+ if (!source) throw new Error("The clipboard does not contain copied PowerPoint slides");
64779
+ const destination = await before.handler.save(
64780
+ templateEditing.buildSaveSlides(before.slides, before.templateElementsBySlideId).map(clone.cloneSlide)
64781
+ );
64782
+ const imported = await pptx.importSlidePackage(destination, source, { insertAt });
64783
+ handler = new pptx.PptxHandler();
64784
+ const data = await handler.load(
64785
+ imported.bytes.buffer.slice(
64786
+ imported.bytes.byteOffset,
64787
+ imported.bytes.byteOffset + imported.bytes.byteLength
64788
+ ),
64789
+ { eagerDecodeImages: true, allowExternalImages: before.allowExternalImages ?? false }
64790
+ );
64791
+ data.slides = await chunkU47LRWDT_cjs.resolveTableCellImageUrls(
64792
+ data.slides,
64793
+ (path) => handler.getImageData(path)
64794
+ );
64795
+ data.slides = await chunkU47LRWDT_cjs.resolveTextFillBlipUrls(
64796
+ data.slides,
64797
+ (path) => handler.getImageData(path)
64798
+ );
64799
+ const importedPaths = new Set(imported.slidePaths);
64800
+ const media = [];
64801
+ for (const slide of data.slides)
64802
+ if (importedPaths.has(slide.id)) chunkU47LRWDT_cjs.collectMediaElements(slide.elements, media);
64803
+ const nextMediaUrls = /* @__PURE__ */ new Map();
64804
+ for (const element of media) {
64805
+ const resolved = await chunkU47LRWDT_cjs.resolveMediaElementSource(element, handler);
64806
+ if (resolved.url && resolved.mediaPath) {
64807
+ nextMediaUrls.set(resolved.mediaPath, resolved.url);
64808
+ if (resolved.isBlobUrl) urls.push(resolved.url);
64809
+ } else element.mediaMissing = true;
64810
+ }
64811
+ const current = host2.getSnapshot();
64812
+ if (disposed || current?.editable === false || current?.handler !== before.handler || current?.templateElementsBySlideId !== before.templateElementsBySlideId || current.slides !== before.slides)
64813
+ throw new Error("Presentation changed while preparing paste. Try again");
64814
+ const partition = templateEditing.partitionTemplateElements(data.slides);
64815
+ host2.commit({
64816
+ handler,
64817
+ data,
64818
+ ...partition,
64819
+ mediaUrls: nextMediaUrls,
64820
+ insertAt: Math.min(Math.max(0, insertAt), before.slides.length),
64821
+ count: imported.slidePaths.length
64822
+ });
64823
+ retiredHandlers.add(before.handler);
64824
+ for (const url of urls) mediaUrls.add(url);
64825
+ committed = true;
64826
+ } finally {
64827
+ pending = false;
64828
+ if (!committed) {
64829
+ handler?.dispose();
64830
+ for (const url of urls) URL.revokeObjectURL(url);
64831
+ }
64626
64832
  }
64627
- root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];
64628
- return;
64629
- } catch {
64833
+ },
64834
+ dispose() {
64835
+ disposed = true;
64836
+ for (const handler of retiredHandlers) handler.dispose();
64837
+ retiredHandlers.clear();
64838
+ for (const url of mediaUrls) URL.revokeObjectURL(url);
64839
+ mediaUrls.clear();
64630
64840
  }
64631
- }
64632
- const style = doc.createElement("style");
64633
- style.textContent = css;
64634
- root.append(style);
64841
+ };
64635
64842
  }
64636
64843
 
64637
64844
  // src/pptx/web-components/mobile-bar-styles.ts
@@ -74328,7 +74535,8 @@ var controls = [
74328
74535
  ["pptx-ui-context-menu", definePptxContextMenu],
74329
74536
  ["pptx-ui-subtitle-settings", definePptxSubtitleSettings],
74330
74537
  ["pptx-ui-theme-editor", definePptxThemeEditor],
74331
- ["pptx-ui-title-bar", definePptxTitleBar]
74538
+ ["pptx-ui-title-bar", definePptxTitleBar],
74539
+ ["pptx-ui-slide-clipboard", definePptxSlideClipboard]
74332
74540
  ];
74333
74541
  function registerPptxWebControls() {
74334
74542
  if (typeof window === "undefined" || !window.customElements) {
@@ -76903,10 +77111,30 @@ Object.defineProperty(exports, "resolveSlideId", {
76903
77111
  enumerable: true,
76904
77112
  get: function () { return sectionOperations.resolveSlideId; }
76905
77113
  });
77114
+ Object.defineProperty(exports, "applySlidePasteTemplates", {
77115
+ enumerable: true,
77116
+ get: function () { return slideOperations.applySlidePasteTemplates; }
77117
+ });
77118
+ Object.defineProperty(exports, "captureSlideClipboard", {
77119
+ enumerable: true,
77120
+ get: function () { return slideOperations.captureSlideClipboard; }
77121
+ });
77122
+ Object.defineProperty(exports, "captureSlideClipboardTemplates", {
77123
+ enumerable: true,
77124
+ get: function () { return slideOperations.captureSlideClipboardTemplates; }
77125
+ });
76906
77126
  Object.defineProperty(exports, "createBlankSlide", {
76907
77127
  enumerable: true,
76908
77128
  get: function () { return slideOperations.createBlankSlide; }
76909
77129
  });
77130
+ Object.defineProperty(exports, "createSlidePaste", {
77131
+ enumerable: true,
77132
+ get: function () { return slideOperations.createSlidePaste; }
77133
+ });
77134
+ Object.defineProperty(exports, "insertSlidePaste", {
77135
+ enumerable: true,
77136
+ get: function () { return slideOperations.insertSlidePaste; }
77137
+ });
76910
77138
  Object.defineProperty(exports, "makeSlideId", {
76911
77139
  enumerable: true,
76912
77140
  get: function () { return slideOperations.makeSlideId; }
@@ -77175,6 +77403,10 @@ Object.defineProperty(exports, "findInSlides", {
77175
77403
  enumerable: true,
77176
77404
  get: function () { return findReplace.findInSlides; }
77177
77405
  });
77406
+ Object.defineProperty(exports, "findReplacementAvailability", {
77407
+ enumerable: true,
77408
+ get: function () { return findReplace.findReplacementAvailability; }
77409
+ });
77178
77410
  Object.defineProperty(exports, "replaceInSlides", {
77179
77411
  enumerable: true,
77180
77412
  get: function () { return findReplace.replaceInSlides; }
@@ -77491,7 +77723,6 @@ exports.BARN_FILTER_TOKEN_TO_SUBTYPE = BARN_FILTER_TOKEN_TO_SUBTYPE;
77491
77723
  exports.BASELINE_FONT_SCALE = BASELINE_FONT_SCALE;
77492
77724
  exports.BEVEL_PRESETS = BEVEL_PRESETS;
77493
77725
  exports.BI_LEVEL_THRESHOLDS = BI_LEVEL_THRESHOLDS;
77494
- exports.BODY_TEXT_STYLE_KEYS = BODY_TEXT_STYLE_KEYS;
77495
77726
  exports.BOTTOM_TRIGGER_FRACTION = BOTTOM_TRIGGER_FRACTION;
77496
77727
  exports.BRIGHTNESS_CONTRAST_STEPS = BRIGHTNESS_CONTRAST_STEPS;
77497
77728
  exports.BROADCAST_THROTTLE_MS = BROADCAST_THROTTLE_MS;
@@ -78500,6 +78731,7 @@ exports.createPresenterShowGuard = createPresenterShowGuard;
78500
78731
  exports.createPresenterTimer = createPresenterTimer;
78501
78732
  exports.createRibbonControlIcon = createRibbonControlIcon;
78502
78733
  exports.createSheetDismissGesture = createSheetDismissGesture;
78734
+ exports.createSlidePackageClipboard = createSlidePackageClipboard;
78503
78735
  exports.createSlideSorterState = createSlideSorterState;
78504
78736
  exports.createSyncGate = createSyncGate;
78505
78737
  exports.createTouchGestureRecognizer = createTouchGestureRecognizer;
@@ -78847,6 +79079,8 @@ exports.getOverflowSegments = getOverflowSegments;
78847
79079
  exports.getP14TransitionAnimations = getP14TransitionAnimations;
78848
79080
  exports.getPasswordStrength = getPasswordStrength;
78849
79081
  exports.getPendingSelectionRestore = getPendingSelectionRestore;
79082
+ exports.getPictureFrameLayers = getPictureFrameLayers;
79083
+ exports.getPictureShadowFilter = getPictureShadowFilter;
78850
79084
  exports.getPlaceholderStyle = getPlaceholderStyle;
78851
79085
  exports.getPresentationContextMenuSections = getPresentationContextMenuSections;
78852
79086
  exports.getPresetShapeVectorGeometry = getPresetShapeVectorGeometry;
@@ -78910,6 +79144,7 @@ exports.hasImageOverrides = hasImageOverrides;
78910
79144
  exports.hasMotionPath = hasMotionPath;
78911
79145
  exports.hasMultipleSelectedTableCells = hasMultipleSelectedTableCells;
78912
79146
  exports.hasPersistentAudio = hasPersistentAudio;
79147
+ exports.hasPictureFrame = hasPictureFrame;
78913
79148
  exports.hasShowSlideAfter = hasShowSlideAfter;
78914
79149
  exports.hasStrokePaint = hasStrokePaint;
78915
79150
  exports.hasText3dExtrusion = hasText3dExtrusion;
@@ -78951,6 +79186,7 @@ exports.innerShadowStateOf = innerShadowStateOf;
78951
79186
  exports.insertCommentMention = insertCommentMention;
78952
79187
  exports.insertHyperlinkAtSelection = insertHyperlinkAtSelection;
78953
79188
  exports.insertLabel = insertLabel;
79189
+ exports.inspectorNumber = inspectorNumber;
78954
79190
  exports.interpolateColor = interpolateColor;
78955
79191
  exports.interpolateOutline = interpolateOutline;
78956
79192
  exports.interpolatePaths = interpolatePaths;
@@ -78964,7 +79200,6 @@ exports.isAudienceDisplayTab = isAudienceDisplayTab;
78964
79200
  exports.isAudienceTab = isAudienceTab;
78965
79201
  exports.isBackstagePageVisible = isBackstagePageVisible;
78966
79202
  exports.isBlackboardActive = isBlackboardActive;
78967
- exports.isBodyTextStyleKey = isBodyTextStyleKey;
78968
79203
  exports.isBookmarkGated = isBookmarkGated;
78969
79204
  exports.isBrowserOpenableMime = isBrowserOpenableMime;
78970
79205
  exports.isChart3DViewEnabled = isChart3DViewEnabled;
@@ -79338,7 +79573,6 @@ exports.reanchorEditFrame = reanchorEditFrame;
79338
79573
  exports.rebaseOptions = rebaseOptions;
79339
79574
  exports.rebuildDrawingShapesIfCleared = rebuildDrawingShapesIfCleared;
79340
79575
  exports.recolorInheritedText = recolorInheritedText;
79341
- exports.reconcileDecorationFlags = reconcileDecorationFlags;
79342
79576
  exports.reconcileInlineListFormatting = reconcileInlineListFormatting;
79343
79577
  exports.reconcileInlineListSnapshot = reconcileInlineListSnapshot;
79344
79578
  exports.recordProgressPercent = recordProgressPercent;
@@ -79671,6 +79905,7 @@ exports.simplifyFreeformVertices = simplifyFreeformVertices;
79671
79905
  exports.simplifyLoop = simplifyLoop;
79672
79906
  exports.slideBackgroundClearPatch = slideBackgroundClearPatch;
79673
79907
  exports.slideBackgroundClearState = slideBackgroundClearState;
79908
+ exports.slideClipboardLabels = slideClipboardLabels;
79674
79909
  exports.slidePaneContextMenuLabelKey = slidePaneContextMenuLabelKey;
79675
79910
  exports.slidePaneViewItems = slidePaneViewItems;
79676
79911
  exports.slideProgressPercent = slideProgressPercent;
@@ -79696,6 +79931,7 @@ exports.solveShapeAdjustments = solveShapeAdjustments;
79696
79931
  exports.sortEntranceAnimations = sortEntranceAnimations;
79697
79932
  exports.sorterGridColumns = sorterGridColumns;
79698
79933
  exports.sorterMenuContext = sorterMenuContext;
79934
+ exports.sorterPasteInsertAt = sorterPasteInsertAt;
79699
79935
  exports.sorterSelectionIndexes = sorterSelectionIndexes;
79700
79936
  exports.splitCubic = splitCubic;
79701
79937
  exports.splitEastAsianBreaks = splitEastAsianBreaks;
@@ -79704,7 +79940,6 @@ exports.splitRegionComponents = splitRegionComponents;
79704
79940
  exports.splitRunByScriptFont = splitRunByScriptFont;
79705
79941
  exports.splitRunForMetrics = splitRunForMetrics;
79706
79942
  exports.splitStyledRun = splitStyledRun;
79707
- exports.splitTextStyleUpdate = splitTextStyleUpdate;
79708
79943
  exports.splitWordsForUnderline = splitWordsForUnderline;
79709
79944
  exports.splitsUnderlineIntoWords = splitsUnderlineIntoWords;
79710
79945
  exports.startCropSession = startCropSession;