@shbernal/ts-pptx 4.0.1 → 4.2.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 (139) hide show
  1. package/README.md +147 -114
  2. package/dist/anim-presets-Qbgh8uut.js +55 -0
  3. package/dist/anim-presets-Qbgh8uut.js.map +1 -0
  4. package/dist/{autopage-odPz7zZO.js → autopage-DqZ37VpL.js} +11 -12
  5. package/dist/autopage-DqZ37VpL.js.map +1 -0
  6. package/dist/{binary-string-CKVAYI3M.js → binary-string-Ba8VM3b9.js} +3 -4
  7. package/dist/binary-string-Ba8VM3b9.js.map +1 -0
  8. package/dist/{body-insets-Dw_BeWD_.js → body-insets-BDHymJvz.js} +7 -9
  9. package/dist/body-insets-BDHymJvz.js.map +1 -0
  10. package/dist/browser.d.ts +24 -16
  11. package/dist/browser.d.ts.map +1 -1
  12. package/dist/browser.js +19 -19
  13. package/dist/browser.js.map +1 -1
  14. package/dist/{image-size-CvN2iCA4.js → chart-metadata-CwiTTcJq.js} +634 -537
  15. package/dist/chart-metadata-CwiTTcJq.js.map +1 -0
  16. package/dist/{clip-Bl01BPcN.d.ts → clip-ISfCMtWA.d.ts} +6 -10
  17. package/dist/clip-ISfCMtWA.d.ts.map +1 -0
  18. package/dist/{notes-Dh12JAbn.js → comments-CKIZYRbZ.js} +530 -401
  19. package/dist/comments-CKIZYRbZ.js.map +1 -0
  20. package/dist/{diagnostics-D8ot4Ei7.d.ts → diagnostics-MoA4MBq5.d.ts} +55 -53
  21. package/dist/diagnostics-MoA4MBq5.d.ts.map +1 -0
  22. package/dist/{embedded-fonts-DarT9aoa.d.ts → embedded-fonts-U7HIIhPO.d.ts} +4 -6
  23. package/dist/embedded-fonts-U7HIIhPO.d.ts.map +1 -0
  24. package/dist/{entry-compose-DCnvBZz2.d.ts → entry-compose-CiakSt-f.d.ts} +62 -81
  25. package/dist/entry-compose-CiakSt-f.d.ts.map +1 -0
  26. package/dist/{errors-C4oENPcu.js → entry-errors-JMthgJ2g.js} +45 -29
  27. package/dist/entry-errors-JMthgJ2g.js.map +1 -0
  28. package/dist/{table-cell-margins-EVg0EwxT.js → enums-BP9wsb9Q.js} +44 -47
  29. package/dist/enums-BP9wsb9Q.js.map +1 -0
  30. package/dist/{enums-BUKTUB6V.d.ts → enums-PcXr3o3J.d.ts} +13 -14
  31. package/dist/{enums-BUKTUB6V.d.ts.map → enums-PcXr3o3J.d.ts.map} +1 -1
  32. package/dist/families.d.ts +24 -26
  33. package/dist/families.d.ts.map +1 -1
  34. package/dist/families.js +3 -4
  35. package/dist/{fit-Cb7naFj6.js → fit-Bpmzep6O.js} +64 -56
  36. package/dist/fit-Bpmzep6O.js.map +1 -0
  37. package/dist/{font-metrics-v5fn7s7e.d.ts → font-metrics-DTppw4t3.d.ts} +62 -38
  38. package/dist/font-metrics-DTppw4t3.d.ts.map +1 -0
  39. package/dist/{grid-DikTjFey.js → grid-DUIMxjfl.js} +23 -26
  40. package/dist/grid-DUIMxjfl.js.map +1 -0
  41. package/dist/{html-dom-Iuog2wdK.js → html-dom-LZCgntnJ.js} +46 -47
  42. package/dist/html-dom-LZCgntnJ.js.map +1 -0
  43. package/dist/html.d.ts +53 -9
  44. package/dist/html.d.ts.map +1 -1
  45. package/dist/html.js +12 -13
  46. package/dist/html.js.map +1 -1
  47. package/dist/index.d.ts +21 -13
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +15 -15
  50. package/dist/index.js.map +1 -1
  51. package/dist/inspect.d.ts +16 -18
  52. package/dist/inspect.d.ts.map +1 -1
  53. package/dist/inspect.js +18 -19
  54. package/dist/inspect.js.map +1 -1
  55. package/dist/{text-anchor-CrYXAfUu.js → lock-attrs-CSQnFDHP.js} +62 -12
  56. package/dist/lock-attrs-CSQnFDHP.js.map +1 -0
  57. package/dist/math.d.ts +2 -4
  58. package/dist/math.d.ts.map +1 -1
  59. package/dist/math.js +12 -13
  60. package/dist/math.js.map +1 -1
  61. package/dist/measure.d.ts +23 -12
  62. package/dist/measure.d.ts.map +1 -1
  63. package/dist/measure.js +3 -3
  64. package/dist/node.d.ts +21 -13
  65. package/dist/node.d.ts.map +1 -1
  66. package/dist/node.js +12 -12
  67. package/dist/node.js.map +1 -1
  68. package/dist/{options-internal-WqgMf720.js → options-internal-BWgmLPdx.js} +4 -5
  69. package/dist/options-internal-BWgmLPdx.js.map +1 -0
  70. package/dist/{package-J49Ck6S2.d.ts → package-CANBWuSm.d.ts} +9 -13
  71. package/dist/package-CANBWuSm.d.ts.map +1 -0
  72. package/dist/{playbtn-CUqQdoDf.js → playbtn-BQZFJir9.js} +4 -5
  73. package/dist/playbtn-BQZFJir9.js.map +1 -0
  74. package/dist/{pres-C6qgOFAa.d.ts → pres-BkEkUAEM.d.ts} +410 -237
  75. package/dist/pres-BkEkUAEM.d.ts.map +1 -0
  76. package/dist/{presentation-DGYlAWhl.js → presentation-4Ggq0_Xa.js} +470 -315
  77. package/dist/presentation-4Ggq0_Xa.js.map +1 -0
  78. package/dist/{presentation-types-8jLQHI4M.d.ts → presentation-types-BgnZR-0a.d.ts} +1119 -468
  79. package/dist/presentation-types-BgnZR-0a.d.ts.map +1 -0
  80. package/dist/read.d.ts +18 -13
  81. package/dist/read.d.ts.map +1 -1
  82. package/dist/read.js +4 -4
  83. package/dist/script.d.ts +116 -65
  84. package/dist/script.d.ts.map +1 -1
  85. package/dist/script.js +2700 -780
  86. package/dist/script.js.map +1 -1
  87. package/dist/{shapes-re0KyQk_.js → shapes-CAPOjU0Q.js} +1564 -491
  88. package/dist/shapes-CAPOjU0Q.js.map +1 -0
  89. package/dist/{slide-Dx2ZeVZ6.d.ts → slide-BmT4kMoO.d.ts} +102 -89
  90. package/dist/slide-BmT4kMoO.d.ts.map +1 -0
  91. package/dist/{slide-size-BalTjFuv.js → slide-size-SkScz1ig.js} +2 -3
  92. package/dist/{slide-size-BalTjFuv.js.map → slide-size-SkScz1ig.js.map} +1 -1
  93. package/dist/{table-dom-BTDP3lEP.js → table-dom-BYga4FYY.js} +4 -5
  94. package/dist/{table-dom-BTDP3lEP.js.map → table-dom-BYga4FYY.js.map} +1 -1
  95. package/dist/{text-sN64Otf_.js → text-CU08xJGs.js} +393 -344
  96. package/dist/text-CU08xJGs.js.map +1 -0
  97. package/dist/{transition-speed-kUEWDWTx.js → transition-speed-CNJ0fSpQ.js} +2 -3
  98. package/dist/{transition-speed-kUEWDWTx.js.map → transition-speed-CNJ0fSpQ.js.map} +1 -1
  99. package/dist/{units-internal-XJlf-hOl.js → units-internal-BR3a4cIi.js} +34 -32
  100. package/dist/units-internal-BR3a4cIi.js.map +1 -0
  101. package/dist/{zip-CKd8ihcf.js → zip-7JTh61LX.js} +8 -10
  102. package/dist/zip-7JTh61LX.js.map +1 -0
  103. package/dist/{zip-C0leZZMj.d.ts → zip-uUjs9Cqx.d.ts} +4 -6
  104. package/dist/zip-uUjs9Cqx.d.ts.map +1 -0
  105. package/dist/zip.d.ts +3 -3
  106. package/dist/zip.js +3 -3
  107. package/dist/{zoom-DPUHh85d.js → zoom-CSSeOwM8.js} +1204 -620
  108. package/dist/zoom-CSSeOwM8.js.map +1 -0
  109. package/package.json +27 -28
  110. package/skills/{ts-pptx-upstream → pptx-ts-upstream}/SKILL.md +37 -84
  111. package/dist/autopage-odPz7zZO.js.map +0 -1
  112. package/dist/binary-string-CKVAYI3M.js.map +0 -1
  113. package/dist/body-insets-Dw_BeWD_.js.map +0 -1
  114. package/dist/clip-Bl01BPcN.d.ts.map +0 -1
  115. package/dist/diagnostics-D8ot4Ei7.d.ts.map +0 -1
  116. package/dist/embedded-fonts-DarT9aoa.d.ts.map +0 -1
  117. package/dist/entry-compose-DCnvBZz2.d.ts.map +0 -1
  118. package/dist/errors-C4oENPcu.js.map +0 -1
  119. package/dist/fit-Cb7naFj6.js.map +0 -1
  120. package/dist/font-metrics-v5fn7s7e.d.ts.map +0 -1
  121. package/dist/grid-DikTjFey.js.map +0 -1
  122. package/dist/html-dom-Iuog2wdK.js.map +0 -1
  123. package/dist/image-size-CvN2iCA4.js.map +0 -1
  124. package/dist/notes-Dh12JAbn.js.map +0 -1
  125. package/dist/options-internal-WqgMf720.js.map +0 -1
  126. package/dist/package-J49Ck6S2.d.ts.map +0 -1
  127. package/dist/playbtn-CUqQdoDf.js.map +0 -1
  128. package/dist/pres-C6qgOFAa.d.ts.map +0 -1
  129. package/dist/presentation-DGYlAWhl.js.map +0 -1
  130. package/dist/presentation-types-8jLQHI4M.d.ts.map +0 -1
  131. package/dist/shapes-re0KyQk_.js.map +0 -1
  132. package/dist/slide-Dx2ZeVZ6.d.ts.map +0 -1
  133. package/dist/table-cell-margins-EVg0EwxT.js.map +0 -1
  134. package/dist/text-anchor-CrYXAfUu.js.map +0 -1
  135. package/dist/text-sN64Otf_.js.map +0 -1
  136. package/dist/units-internal-XJlf-hOl.js.map +0 -1
  137. package/dist/zip-C0leZZMj.d.ts.map +0 -1
  138. package/dist/zip-CKd8ihcf.js.map +0 -1
  139. package/dist/zoom-DPUHh85d.js.map +0 -1
@@ -1,10 +1,9 @@
1
- import { Sn as ThemeColorSlot, sn as ColorMapToken, t as CustomPropertyValue } from "./pres-C6qgOFAa.js";
2
- import { t as EmbeddedFont } from "./embedded-fonts-DarT9aoa.js";
3
- import { a as Part, i as Relationships, n as OpcPackage, o as Element, t as OpcInput } from "./package-J49Ck6S2.js";
4
- //#region src/read/oxml/theme.d.ts
1
+ import { t as EmbeddedFont } from "./embedded-fonts-U7HIIhPO.js";
2
+ import { a as Part, i as Relationships, n as OpcPackage, o as Element, t as OpcInput } from "./package-CANBWuSm.js";
3
+ import { hn as ColorMapToken, jn as ThemeColorSlot, t as CustomPropertyValue } from "./pres-BkEkUAEM.js";
5
4
  /**
6
5
  * The colour-resolution context: the two maps that turn a DrawingML colour
7
- * reference into a literal hex — the effective colour map (token → `clrScheme`
6
+ * reference into a literal hex: the effective colour map (token → `clrScheme`
8
7
  * slot, honouring any slide `clrMapOvr`) and the resolved colour scheme (slot →
9
8
  * 6-hex RGB). Shared by the read-model colour getters and `ThemeContext`.
10
9
  */
@@ -17,7 +16,7 @@ interface ColorContext {
17
16
  * {@link ColorContext} maps, the live `a:fmtScheme` for style-matrix resolution, and the roots
18
17
  * of the inheritance chain a placeholder reads through.
19
18
  *
20
- * Every root here is **read-only** — nothing in this module or in `placeholder-inherit.ts`
19
+ * Every root here is **read-only**: nothing in this module or in `placeholder-inherit.ts`
21
20
  * mutates one. The import-time flatten pass extends this with the one field it needs to write
22
21
  * from (see `FlattenContext` in `read/api/ops/flatten.ts`).
23
22
  */
@@ -49,18 +48,18 @@ interface ThemeContext extends ColorContext {
49
48
  * context it is absent, so the slide placeholder chain (layout/master
50
49
  * `a:lstStyle` → `p:txStyles`) is unaffected. It is the notes analogue of the
51
50
  * master `p:txStyles` category style, keyed by level rather than placeholder
52
- * type. Read-only — never mutated.
51
+ * type. Read-only, never mutated.
53
52
  */
54
53
  notesStyle?: Element | null;
55
54
  /**
56
55
  * The presentation's `p:defaultTextStyle` (a `CT_TextListStyle` from
57
- * `presentation.xml`), keyed by level — PowerPoint's lowest-priority text
56
+ * `presentation.xml`), keyed by level: PowerPoint's lowest-priority text
58
57
  * fallback, applying to any run (placeholder or not) that resolves nothing
59
58
  * above it. Only ever set on a *slide* context (see `resolveSlideColorContext`);
60
59
  * absent on notes/master/layout contexts, so their chains are unaffected. A table
61
60
  * cell's text is read against a copy that holds the slide master's `p:otherStyle`
62
61
  * here instead, the tier PowerPoint resolves cell text through (`TableCell.textFrame`).
63
- * Read-only — never mutated.
62
+ * Read-only, never mutated.
64
63
  */
65
64
  defaultTextStyle?: Element | null;
66
65
  /**
@@ -71,7 +70,7 @@ interface ThemeContext extends ColorContext {
71
70
  * The lookup is a full subtree scan, and reading one run's five inherited properties used
72
71
  * to perform ten of them: each property walks the tier chain, and each tier walk scans a
73
72
  * layout and a master. The answer depends only on the roots and the `(type, idx)` asked
74
- * for, and the roots on a context never change — so it is computed once per context.
73
+ * for, and the roots on a context never change, so it is computed once per context.
75
74
  *
76
75
  * The memo lives here rather than in a module-level cache keyed by the root element
77
76
  * because that is what scopes it correctly: a context is built per `Slide`/`TemplatePart`
@@ -81,8 +80,6 @@ interface ThemeContext extends ColorContext {
81
80
  */
82
81
  placeholderMemo?: Map<string, Element | null>;
83
82
  }
84
- //#endregion
85
- //#region src/read/oxml/color-transform.d.ts
86
83
  /** A colour-transform modifier in its read-model form: tag local-name + raw `@val`. */
87
84
  interface ColorTransform {
88
85
  name: string;
@@ -96,15 +93,13 @@ interface EffectiveColor {
96
93
  /**
97
94
  * Apply an ordered list of DrawingML colour transforms to a base sRGB hex,
98
95
  * returning the effective sRGB hex (and opacity, when an `alpha*` modifier set
99
- * it). Pure: no DOM, no theme lookup — the caller has already resolved the base
96
+ * it). Pure: no DOM, no theme lookup; the caller has already resolved the base
100
97
  * colour and extracted each modifier's `{ name, value }`.
101
98
  *
102
99
  * An unparseable base hex is returned unchanged (with no transforms applied); an
103
100
  * unparseable/`null` modifier value is skipped.
104
101
  */
105
102
  declare function applyColorTransforms(baseHex: string, transforms: ColorTransform[]): EffectiveColor;
106
- //#endregion
107
- //#region src/read/api/theme-context.d.ts
108
103
  /** Identifies a placeholder by its `p:ph` `type`/`idx` for inheritance lookups. */
109
104
  interface PlaceholderRef {
110
105
  type: string | null;
@@ -125,7 +120,7 @@ interface ResolvedFrame {
125
120
  *
126
121
  * `hex` is the **base** token colour and `transforms` reports the colour-transform
127
122
  * children (`lumMod`/`lumOff`/`shade`/`tint`/`alpha`/…) in document order as
128
- * `{ name, value }` pairs — both kept for traceability and for the
123
+ * `{ name, value }` pairs, both kept for traceability and for the
129
124
  * `theme: 'preserve'` flatten path that re-emits the transforms verbatim.
130
125
  *
131
126
  * `effectiveHex` is the colour a renderer actually paints: `hex` with its
@@ -141,8 +136,8 @@ interface ResolvedColor {
141
136
  }
142
137
  /**
143
138
  * Resolve a DrawingML colour *element* (every `a:EG_ColorChoice` member except
144
- * `a:scrgbClr` — see `read/oxml/theme.ts`) against `ctx` into a full
145
- * {@link ResolvedColor} — base hex, raw transform list,
139
+ * `a:scrgbClr`; see `read/oxml/theme.ts`) against `ctx` into a full
140
+ * {@link ResolvedColor}: base hex, raw transform list,
146
141
  * and the `effectiveHex`/`alpha` after applying those transforms. `null` when the
147
142
  * element cannot be made literal (unmapped token, or a colour model we do not
148
143
  * resolve). Shared by the solid-fill and gradient-stop colour reads.
@@ -186,39 +181,6 @@ interface StyleFontRef {
186
181
  /** The face named by `a:fontRef/@idx` (`major`→`+mj-lt`, `minor`→`+mn-lt`) resolved through the theme `fontScheme`, or `null` for `idx="none"` / an unresolvable token. */
187
182
  face: string | null;
188
183
  }
189
- //#endregion
190
- //#region src/read/api/gradient.d.ts
191
- /** One stop of a gradient fill (`a:gsLst/a:gs`), as read from a shape. */
192
- interface GradientStop {
193
- /** Stop offset along the gradient, 0–1 (from `@pos`, thousandths of a percent), or `null` if unset. */
194
- position: number | null;
195
- /**
196
- * The stop's colour, as written and resolved against the slide theme. Its `resolved.effectiveHex` is
197
- * the rendered colour and `resolved.alpha` the stop's opacity, when an `alpha*` transform set one.
198
- */
199
- colorRef: ColorRef;
200
- }
201
- /**
202
- * A gradient fill (`a:gradFill`), as read from a container — the stops plus the
203
- * geometry that a bare stop list omits. `linear` gradients carry an
204
- * {@link GradientFill.angleDeg} (the `a:lin/@ang` direction); `radial`/`path`
205
- * gradients carry a {@link GradientFill.path} shape (`a:path/@path`, e.g.
206
- * `circle`). The angle is in **OOXML degrees** (clockwise from 3 o'clock), the
207
- * same convention the write-side `GradientFillProps.angle` expects, so it
208
- * round-trips directly.
209
- */
210
- interface GradientFill {
211
- /** `linear` (`a:lin`) or `path` (`a:path`, i.e. radial/rectangular). `null` when neither child is present. */
212
- kind: 'linear' | 'path' | null;
213
- /** Linear direction in OOXML degrees (clockwise from 3 o'clock), or `null` for a path gradient / when unset. */
214
- angleDeg: number | null;
215
- /** Path-gradient shape (`a:path/@path`: `circle`/`rect`/`shape`), or `null` for a linear gradient. */
216
- path: string | null;
217
- /** The gradient stops in document order. */
218
- stops: GradientStop[];
219
- }
220
- //#endregion
221
- //#region src/read/api/picture-fill.d.ts
222
184
  /** A rectangle expressed as per-edge fractions (`a:srcRect`/`a:fillRect`), `0.1` = 10 %. */
223
185
  interface FillRect {
224
186
  left: number;
@@ -248,7 +210,7 @@ interface PictureFillTile {
248
210
  /**
249
211
  * A picture (image) fill (`a:blipFill`) read from a fill-bearing container. The
250
212
  * image itself is {@link relId} / {@link partName}; the rest is the geometry a
251
- * faithful replica needs — {@link mode} (`stretch` or `tile`), the source crop
213
+ * faithful replica needs: {@link mode} (`stretch` or `tile`), the source crop
252
214
  * {@link srcRect}, the destination inset {@link fillRect}, and {@link tile}.
253
215
  *
254
216
  * Rect fields follow the read API's fraction convention (see
@@ -276,10 +238,50 @@ interface PictureFill {
276
238
  /** Whether the fill rotates with its shape (`@rotWithShape`), or `null` when unset. */
277
239
  rotWithShape: boolean | null;
278
240
  }
279
- //#endregion
280
- //#region src/read/api/pattern-fill.d.ts
241
+ /** One stop of a gradient fill (`a:gsLst/a:gs`), as read from a shape. */
242
+ interface GradientStop {
243
+ /** Stop offset along the gradient, 0–1 (from `@pos`, thousandths of a percent), or `null` if unset. */
244
+ position: number | null;
245
+ /**
246
+ * The stop's colour, as written and resolved against the slide theme. Its `resolved.effectiveHex` is
247
+ * the rendered colour and `resolved.alpha` the stop's opacity, when an `alpha*` transform set one.
248
+ */
249
+ colorRef: ColorRef;
250
+ }
251
+ /**
252
+ * A gradient fill (`a:gradFill`), as read from a container: the stops plus the
253
+ * geometry that a bare stop list omits. `linear` gradients carry an
254
+ * {@link GradientFill.angleDeg} (the `a:lin/@ang` direction); `radial`/`path`
255
+ * gradients carry a {@link GradientFill.path} shape (`a:path/@path`, e.g.
256
+ * `circle`). The angle is in **OOXML degrees** (clockwise from 3 o'clock), the
257
+ * same convention the write-side `GradientFillProps.angle` expects, so it
258
+ * round-trips directly.
259
+ */
260
+ interface GradientFill {
261
+ /** `linear` (`a:lin`) or `path` (`a:path`, i.e. radial/rectangular). `null` when neither child is present. */
262
+ kind: 'linear' | 'path' | null;
263
+ /** Linear direction in OOXML degrees (clockwise from 3 o'clock), or `null` for a path gradient / when unset. */
264
+ angleDeg: number | null;
265
+ /** Path-gradient shape (`a:path/@path`: `circle`/`rect`/`shape`), or `null` for a linear gradient. */
266
+ path: string | null;
267
+ /** The gradient stops in document order. */
268
+ stops: GradientStop[];
269
+ /**
270
+ * Whether the fill rotates with the shape (`a:gradFill/@rotWithShape`), or `null` when the
271
+ * attribute is absent.
272
+ */
273
+ rotateWithShape: boolean | null;
274
+ /** Whether a linear gradient's angle scales with the fill region (`a:lin/@scaled`), or `null` when unset. */
275
+ scaled: boolean | null;
276
+ /**
277
+ * A path gradient's focus rectangle (`a:path/a:fillToRect`) as per-edge fractions inset from the
278
+ * fill box, or `null` when absent. Equal insets centre the focus; the write side's radial
279
+ * `center: { x, y }` writes `left = x`, `top = y`, `right = 1 - x`, `bottom = 1 - y`.
280
+ */
281
+ focusRect: FillRect | null;
282
+ }
281
283
  /**
282
- * A pattern fill (`a:pattFill`) — a two-colour preset hatch. The write-side
284
+ * A pattern fill (`a:pattFill`): a two-colour preset hatch. The write-side
283
285
  * `fill: { type: 'pattern', pattern: { preset, fgColor, bgColor } }` emits the same element,
284
286
  * so the {@link preset} name and both colours round-trip.
285
287
  */
@@ -291,8 +293,6 @@ interface PatternFill {
291
293
  /** Background colour (`a:bgClr`); every field is `null` when the pattern states none. */
292
294
  background: ColorRef;
293
295
  }
294
- //#endregion
295
- //#region src/read/api/slide-background.d.ts
296
296
  /** Where a slide's effective background comes from in the slide → layout → master chain. */
297
297
  type BackgroundSource = 'slide' | 'layout' | 'master';
298
298
  /**
@@ -301,8 +301,8 @@ type BackgroundSource = 'slide' | 'layout' | 'master';
301
301
  * top-level variants add {@link BackgroundSource}, and it is what a `themeRef`'s
302
302
  * `SlideBackground.resolvedFill` carries.
303
303
  *
304
- * The `image` variant keeps `relId`/`partName` at the top level — the fields
305
- * callers already read — and adds the full {@link PictureFill} (stretch/tile
304
+ * The `image` variant keeps `relId`/`partName` at the top level (the fields
305
+ * callers already read) and adds the full {@link PictureFill} (stretch/tile
306
306
  * geometry, crop, alpha) under `picture`.
307
307
  */
308
308
  type BackgroundFill = {
@@ -326,7 +326,7 @@ type BackgroundFill = {
326
326
  * `type`. Every variant carries {@link BackgroundSource}. `solid`/`gradient`/`pattern`/`image`
327
327
  * are what the writer authors and round-trip faithfully; `themeRef` is read-only
328
328
  * (imported decks) and `none` is an explicit `a:noFill`. A `themeRef`
329
- * keeps its raw `idx` for fidelity and also exposes `resolvedFill` — the concrete
329
+ * keeps its raw `idx` for fidelity and also exposes `resolvedFill`, the concrete
330
330
  * fill that `idx` resolves to through the slide theme's `fmtScheme` (`null` when the
331
331
  * theme/entry cannot be resolved).
332
332
  */
@@ -357,8 +357,6 @@ type SlideBackground = {
357
357
  type: 'none';
358
358
  source: BackgroundSource;
359
359
  };
360
- //#endregion
361
- //#region src/read/api/shapes/oxml.d.ts
362
360
  /**
363
361
  * Where a shape kind's paint is written: its properties element (`p:spPr` / `p:grpSpPr`), created
364
362
  * in document order on demand, and for each paint the schema successors that paint's element is
@@ -370,8 +368,6 @@ interface PaintSurface {
370
368
  fill: readonly string[] | null;
371
369
  line: readonly string[] | null;
372
370
  }
373
- //#endregion
374
- //#region src/read/api/shapes/types.d.ts
375
371
  /** Discriminator for the concrete `Shape` subclass. */
376
372
  type ShapeType = 'autoShape' | 'picture' | 'connector' | 'graphicFrame' | 'group';
377
373
  /** One end of a connector/line (`a:ln/a:headEnd` or `a:tailEnd`), as read from a shape. */
@@ -392,7 +388,7 @@ interface LineEnds {
392
388
  * One bound end of a connector (`p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn` or `a:endCxn`),
393
389
  * as read. A connector authored with `startShape`/`endShape` attaches each end to
394
390
  * a shape by that shape's `p:cNvPr/@id` plus a connection-site index; an unbound
395
- * end (the writer emits a bare `p:cNvCxnSpPr`) reports no site at all — see
391
+ * end (the writer emits a bare `p:cNvCxnSpPr`) reports no site at all; see
396
392
  * {@link Connector.startConnection}. This is the read counterpart of the write
397
393
  * API's `startShape`/`startShapeIdx` split, which binds by `objectName` and
398
394
  * resolves the name → id at serialize time.
@@ -404,7 +400,7 @@ interface ConnectionSite {
404
400
  siteIndex: number;
405
401
  /**
406
402
  * The bound shape resolved to a read-model shape via {@link Slide.shapeByIdDeep},
407
- * which descends into groups — so a connector bound to a shape nested in a group
403
+ * which descends into groups, so a connector bound to a shape nested in a group
408
404
  * resolves the same as one bound to a top-level shape. `null` only when no shape
409
405
  * anywhere on the slide carries that id (a genuinely dangling binding), which is
410
406
  * faithful degradation and does not throw.
@@ -429,11 +425,16 @@ interface OuterShadow {
429
425
  offsetPt?: number;
430
426
  /** Offset direction in degrees, clockwise from 3 o'clock (`@dir` ÷ 60000), or `undefined` when unset. */
431
427
  angleDeg?: number;
428
+ /**
429
+ * Whether the shadow rotates with the shape (`@rotWithShape`), or `undefined` when unset. Only an
430
+ * outer shadow has the attribute.
431
+ */
432
+ rotateWithShape?: boolean;
432
433
  }
433
434
  /**
434
435
  * A shape's inner shadow (`spPr/a:effectLst/a:innerShdw`), resolved against the
435
- * slide theme. Identical fields to {@link OuterShadow} — CT_InnerShadowEffect
436
- * carries the same `blurRad`/`dist`/`dir` + colour — but a distinct type so a
436
+ * slide theme. Identical fields to {@link OuterShadow} (CT_InnerShadowEffect
437
+ * carries the same `blurRad`/`dist`/`dir` + colour), but a distinct type so a
437
438
  * consumer can tell an inset shadow from a drop shadow. Distances in points,
438
439
  * direction in degrees, matching the write-side `shadow: { type: 'inner' }`.
439
440
  */
@@ -451,7 +452,7 @@ interface InnerShadow {
451
452
  angleDeg?: number;
452
453
  }
453
454
  /**
454
- * A shape's glow effect (`spPr/a:effectLst/a:glow`) — a coloured halo — resolved
455
+ * A shape's glow effect (`spPr/a:effectLst/a:glow`), a coloured halo, resolved
455
456
  * against the slide theme. The write-side `glow` option is a text glow: it writes
456
457
  * `a:glow` into each run's `a:rPr/a:effectLst`, which this does not read.
457
458
  */
@@ -465,10 +466,10 @@ interface Glow {
465
466
  radiusPt?: number;
466
467
  }
467
468
  /**
468
- * A shape's reflection effect (`spPr/a:effectLst/a:reflection`) — a mirrored fade
469
+ * A shape's reflection effect (`spPr/a:effectLst/a:reflection`): a mirrored fade
469
470
  * beneath the shape. This library's writer authors none, so this is a **read-only**
470
471
  * surface: a consumer that finds one should carry the part verbatim rather than
471
- * regenerate it. Only the attributes a faithful replica needs are decoded —
472
+ * regenerate it. Only the attributes a faithful replica needs are decoded:
472
473
  * distances in points (÷ 12700), directions in degrees (÷ 60000), and the start/end
473
474
  * alpha and position pairs as 0–1 fractions (the `1000`ths-of-a-percent source
474
475
  * ÷ 100000). All fields are optional; an attribute absent from the source is omitted.
@@ -492,7 +493,7 @@ interface Reflection {
492
493
  fadeAngleDeg?: number;
493
494
  }
494
495
  /**
495
- * A shape's soft-edge effect (`spPr/a:effectLst/a:softEdge`) — a feathered border.
496
+ * A shape's soft-edge effect (`spPr/a:effectLst/a:softEdge`): a feathered border.
496
497
  * Like {@link Reflection}, the writer authors none, so carry it verbatim. `@rad`
497
498
  * (the feather radius) ÷ 12700 → points.
498
499
  */
@@ -510,38 +511,90 @@ interface SoftEdge {
510
511
  * must be scaled by the consumer against the shape's box. `arcTo` angles are in
511
512
  * **degrees** (the raw `60000`ths-of-a-degree values divided by 60000), matching
512
513
  * the write DSL's degree input.
514
+ *
515
+ * Any of them may instead be the name of a guide whose value it takes (`ST_AdjCoordinate` /
516
+ * `ST_AdjAngle`): one of the geometry's own {@link CustomGeometry.guides}, or a built-in such as
517
+ * `w`, `hc` or `cd4`. A name is returned as written, never resolved.
513
518
  */
514
519
  type GeometryCommand = {
515
520
  cmd: 'moveTo';
516
- x: number;
517
- y: number;
521
+ x: GeometryCoordinate;
522
+ y: GeometryCoordinate;
518
523
  } | {
519
524
  cmd: 'lnTo';
520
- x: number;
521
- y: number;
525
+ x: GeometryCoordinate;
526
+ y: GeometryCoordinate;
522
527
  } | {
523
528
  cmd: 'cubicBezTo';
524
- x1: number;
525
- y1: number;
526
- x2: number;
527
- y2: number;
528
- x: number;
529
- y: number;
529
+ x1: GeometryCoordinate;
530
+ y1: GeometryCoordinate;
531
+ x2: GeometryCoordinate;
532
+ y2: GeometryCoordinate;
533
+ x: GeometryCoordinate;
534
+ y: GeometryCoordinate;
530
535
  } | {
531
536
  cmd: 'quadBezTo';
532
- x1: number;
533
- y1: number;
534
- x: number;
535
- y: number;
537
+ x1: GeometryCoordinate;
538
+ y1: GeometryCoordinate;
539
+ x: GeometryCoordinate;
540
+ y: GeometryCoordinate;
536
541
  } | {
537
542
  cmd: 'arcTo';
538
- wR: number;
539
- hR: number;
540
- stAng: number;
541
- swAng: number;
543
+ wR: GeometryCoordinate;
544
+ hR: GeometryCoordinate;
545
+ stAng: GeometryCoordinate;
546
+ swAng: GeometryCoordinate;
542
547
  } | {
543
548
  cmd: 'close';
544
549
  };
550
+ /**
551
+ * A custom-geometry coordinate (`ST_AdjCoordinate`): a number in the shape's own EMU space, or the
552
+ * name of a guide whose value it takes.
553
+ */
554
+ type GeometryCoordinate = number | string;
555
+ /** One guide formula of a custom geometry (`a:gd`). */
556
+ interface CustomGeometryGuide {
557
+ /** The guide's name (`@name`), which positions and other formulas refer to. */
558
+ name: string;
559
+ /** The formula (`@fmla`) as written: an operation and its arguments, such as PowerPoint's multiply-divide of a site against the shape width. */
560
+ formula: string;
561
+ }
562
+ /**
563
+ * One adjust handle of a custom geometry: an XY handle (`a:ahXY`) bound to guides along each axis,
564
+ * or a polar one (`a:ahPolar`) bound along its radius and angle. Every bound is `null` when unset.
565
+ */
566
+ type CustomGeometryAdjustHandle = {
567
+ kind: 'xy';
568
+ /** The handle's position (`a:pos`). */
569
+ x: GeometryCoordinate | null;
570
+ y: GeometryCoordinate | null;
571
+ gdRefX: string | null;
572
+ minX: GeometryCoordinate | null;
573
+ maxX: GeometryCoordinate | null;
574
+ gdRefY: string | null;
575
+ minY: GeometryCoordinate | null;
576
+ maxY: GeometryCoordinate | null;
577
+ } | {
578
+ kind: 'polar';
579
+ /** The handle's position (`a:pos`). */
580
+ x: GeometryCoordinate | null;
581
+ y: GeometryCoordinate | null;
582
+ gdRefR: string | null;
583
+ minR: GeometryCoordinate | null;
584
+ maxR: GeometryCoordinate | null;
585
+ gdRefAng: string | null;
586
+ /** The angle bounds in degrees (the 60000ths source ÷ 60000), or `null`. */
587
+ minAngDeg: number | null;
588
+ maxAngDeg: number | null;
589
+ };
590
+ /** One connection site of a custom geometry (`a:cxn`): where a connector can attach. */
591
+ interface CustomGeometryConnectionSite {
592
+ /** The angle a connector arrives at, in degrees (`@ang` ÷ 60000), or `null` when it names a guide. */
593
+ angleDeg: number | null;
594
+ /** The site's position (`a:pos`). */
595
+ x: GeometryCoordinate | null;
596
+ y: GeometryCoordinate | null;
597
+ }
545
598
  /** One `<a:path>` of a custom geometry, with its path-unit viewport and render attrs. */
546
599
  interface CustomGeometryPath {
547
600
  /** Path-unit width (`a:path/@w`); the `x` denominator for this path's coords. Default `0`. */
@@ -552,7 +605,7 @@ interface CustomGeometryPath {
552
605
  fill: string;
553
606
  /** Whether the path is stroked (`a:path/@stroke`). Default `true`. */
554
607
  stroke: boolean;
555
- /** The path's segments in document order — order *is* the geometry. */
608
+ /** The path's segments in document order; order *is* the geometry. */
556
609
  commands: GeometryCommand[];
557
610
  }
558
611
  /**
@@ -565,6 +618,12 @@ interface CustomGeometryPath {
565
618
  */
566
619
  interface CustomGeometry {
567
620
  paths: CustomGeometryPath[];
621
+ /** The guide formulas (`a:gdLst/a:gd`), in document order; empty when there are none. */
622
+ guides: CustomGeometryGuide[];
623
+ /** The adjust handles (`a:ahLst`), in document order; empty when there are none. */
624
+ adjustHandles: CustomGeometryAdjustHandle[];
625
+ /** The connection sites (`a:cxnLst/a:cxn`), in document order; empty when there are none. */
626
+ connectionSites: CustomGeometryConnectionSite[];
568
627
  }
569
628
  /** A shape's resolved position and size in slide-absolute EMU. */
570
629
  interface AbsoluteFrame {
@@ -582,12 +641,12 @@ interface AbsoluteFrame {
582
641
  /**
583
642
  * Why {@link Shape.absoluteFrame} could not resolve a frame.
584
643
  *
585
- * - `no-own-transform` — the shape states no `a:xfrm` of its own, or an incomplete
644
+ * - `no-own-transform`: the shape states no `a:xfrm` of its own, or an incomplete
586
645
  * one: typically a placeholder inheriting its box from the layout. Nothing is
587
646
  * wrong with the deck; the read model reports what the shape itself states.
588
- * - `group-transform-missing` — an enclosing `p:grpSp` states no complete
647
+ * - `group-transform-missing`: an enclosing `p:grpSp` states no complete
589
648
  * `a:off`/`a:ext` **and** `a:chOff`/`a:chExt` pair, so its child space is unknown.
590
- * - `group-transform-degenerate` — an enclosing group's `a:chExt` is zero on an
649
+ * - `group-transform-degenerate`: an enclosing group's `a:chExt` is zero on an
591
650
  * axis, so the child-space ratio the mapping divides by is undefined.
592
651
  *
593
652
  * A missing group transform outranks a degenerate one wherever the two meet in
@@ -597,7 +656,7 @@ interface AbsoluteFrame {
597
656
  type AbsoluteFrameFailure = 'no-own-transform' | 'group-transform-missing' | 'group-transform-degenerate';
598
657
  /**
599
658
  * A group shape's own child coordinate space (`p:grpSpPr/a:xfrm/a:chOff` and
600
- * `a:chExt`) in EMU — the space its children's `a:off`/`a:ext` are authored in.
659
+ * `a:chExt`) in EMU: the space its children's `a:off`/`a:ext` are authored in.
601
660
  *
602
661
  * Named after the OOXML attributes rather than in the `left`/`top`/`width`/
603
662
  * `height` vocabulary the rest of the read model uses, because this is not a
@@ -639,8 +698,32 @@ type Recolor = {
639
698
  kind: 'alphaModFix';
640
699
  amount: number;
641
700
  };
642
- //#endregion
643
- //#region src/read/api/hyperlink.d.ts
701
+ /**
702
+ * The audio or video a picture plays, as {@link Picture.media} reads it. PowerPoint authors
703
+ * embedded media as a `p:pic` whose blip is the poster frame and whose `p:nvPr` carries an
704
+ * `a:audioFile` or `a:videoFile`, bound to the media part twice: by the element's `r:link` and by
705
+ * the `p14:media` extension's `r:embed`.
706
+ */
707
+ interface PictureMedia {
708
+ /** `audio` for `a:audioFile`, `video` for `a:videoFile`. */
709
+ kind: 'audio' | 'video';
710
+ /**
711
+ * Absolute partname of the media in the package: the `p14:media` `r:embed`, else the element's
712
+ * own `r:link` when it targets a part. `null` for linked or online media, whose target is
713
+ * outside the package ({@link link}).
714
+ */
715
+ partName: string | null;
716
+ /** The media part's content type, or `null` when there is no part. */
717
+ contentType: string | null;
718
+ /** The external target of linked or online media (an `r:link` with `TargetMode="External"`), or `null`. */
719
+ link: string | null;
720
+ /**
721
+ * How many times the media plays, from the media node the slide's `p:timing` aims at this picture
722
+ * (`p:cMediaNode/p:cTn/@repeatCount`, in thousandths): `'indefinite'` loops until stopped, and
723
+ * `null` states none, which plays once.
724
+ */
725
+ repeatCount: number | 'indefinite' | null;
726
+ }
644
727
  /**
645
728
  * A click hyperlink (`a:hlinkClick`), on a run or on a shape. A URL link carries an external
646
729
  * {@link url}; a slide jump carries the internal {@link targetPartName} (the linked slide's part)
@@ -658,8 +741,6 @@ interface Hyperlink {
658
741
  /** The relationship id (`@r:id`) backing the link, or `null` when the link is action-only. */
659
742
  relId: string | null;
660
743
  }
661
- //#endregion
662
- //#region src/read/api/table-style-resolve.d.ts
663
744
  /**
664
745
  * The `a:tblPr` condition flags that gate which style parts apply to a table.
665
746
  * `firstRow`/`bandRow` are the ones PowerPoint turns on by default; the rest are
@@ -705,8 +786,6 @@ interface TableCellTextStyle {
705
786
  /** `@i`, read the same way as {@link bold}. */
706
787
  italic: boolean | null;
707
788
  }
708
- //#endregion
709
- //#region src/read/api/text/run.d.ts
710
789
  /**
711
790
  * What a text body is read against, handed from a {@link TextFrame} to each paragraph and run: the
712
791
  * part an edit marks dirty, the theme the `resolved*` getters resolve against, the relationships
@@ -718,8 +797,8 @@ interface TextContext {
718
797
  /** The theme the text resolves against: the colour maps, `fontScheme`, and the layout and master roots. */
719
798
  ctx: ThemeContext;
720
799
  /**
721
- * The owning part's relationships, or `null` for text read without them — a SmartArt drawing's
722
- * cached text — whose run hyperlinks then report their raw `@r:id`, `@action` and `@tooltip`.
800
+ * The owning part's relationships, or `null` for text read without them (a SmartArt drawing's
801
+ * cached text), whose run hyperlinks then report their raw `@r:id`, `@action` and `@tooltip`.
723
802
  */
724
803
  rels: Relationships | null;
725
804
  /**
@@ -759,7 +838,7 @@ interface InheritedRunProps {
759
838
  /**
760
839
  * A paragraph's line spacing (`a:pPr/a:lnSpc`), in whichever of the two OOXML
761
840
  * forms the file uses: an exact point height (`a:spcPts`) or a percentage of the
762
- * single-line height (`a:spcPct` — e.g. `percent: 150` for 1.5× spacing).
841
+ * single-line height (`a:spcPct`, e.g. `percent: 150` for 1.5× spacing).
763
842
  */
764
843
  type LineSpacing = {
765
844
  type: 'points';
@@ -770,7 +849,7 @@ type LineSpacing = {
770
849
  };
771
850
  /**
772
851
  * The bullet's own font, size and colour (`a:buFont` / `a:buSzPct` / `a:buSzPts` /
773
- * `a:buClr`) — the properties that style the glyph or number itself rather than
852
+ * `a:buClr`): the properties that style the glyph or number itself rather than
774
853
  * the text after it. Every field is `null` when the paragraph leaves it to be
775
854
  * inherited from the list style.
776
855
  *
@@ -778,7 +857,7 @@ type LineSpacing = {
778
857
  * are carried alongside each kind rather than inside it.
779
858
  */
780
859
  interface BulletStyle {
781
- /** `a:buFont/@typeface` — the face the glyph is drawn in (a symbol font such as `Wingdings`), or `null`. */
860
+ /** `a:buFont/@typeface`: the face the glyph is drawn in (a symbol font such as `Wingdings`), or `null`. */
782
861
  font: string | null;
783
862
  /** `a:buSzPct/@val` as a percentage of the run size (e.g. `80`; the raw attribute is thousandths of a percent), or `null`. */
784
863
  sizePct: number | null;
@@ -792,11 +871,11 @@ interface BulletStyle {
792
871
  * children. Discriminated on `kind`, which is one of the four mutually
793
872
  * exclusive choices the schema allows:
794
873
  *
795
- * - `'none'` — `a:buNone`, the bullet explicitly suppressed. Carries no style,
796
- * because there is no glyph to style.
797
- * - `'char'` — `a:buChar`, a literal glyph.
798
- * - `'autoNum'` — `a:buAutoNum`, an auto-numbered list.
799
- * - `'picture'` — `a:buBlip`, an image used as the glyph.
874
+ * - `'none'`: `a:buNone`, the bullet explicitly suppressed. Carries no style,
875
+ * because there is no glyph to style.
876
+ * - `'char'`: `a:buChar`, a literal glyph.
877
+ * - `'autoNum'`: `a:buAutoNum`, an auto-numbered list.
878
+ * - `'picture'`: `a:buBlip`, an image used as the glyph.
800
879
  *
801
880
  * A paragraph that names none of them inherits its bullet from the list style and
802
881
  * reports `null` rather than a member of this union.
@@ -805,7 +884,7 @@ type BulletDetail = {
805
884
  kind: 'none';
806
885
  } | ({
807
886
  kind: 'char';
808
- /** The glyph itself (`a:buChar/@char`) — a bare character, never a tagged string. */
887
+ /** The glyph itself (`a:buChar/@char`): a bare character, never a tagged string. */
809
888
  char: string;
810
889
  } & BulletStyle) | ({
811
890
  kind: 'autoNum';
@@ -826,6 +905,28 @@ type BulletDetail = {
826
905
  */
827
906
  imagePartName: string | null;
828
907
  } & BulletStyle);
908
+ /** One tab stop of a paragraph (`a:pPr/a:tabLst/a:tab`). */
909
+ interface TabStop {
910
+ /** Position from the paragraph's left edge in points (`@pos` ÷ 12700), or `null` when unset. */
911
+ positionPt: number | null;
912
+ /** Alignment token (`@algn`: `l` | `ctr` | `r` | `dec`), or `null` when unset (the schema default is `l`). */
913
+ alignment: string | null;
914
+ }
915
+ /** A run's text outline (`a:rPr/a:ln`): the stroke drawn around each glyph. */
916
+ interface RunOutline {
917
+ /** Stroke width in points (`@w` ÷ 12700), or `null` when unset. */
918
+ widthPt: number | null;
919
+ /**
920
+ * `true` for an explicit no-outline (`a:ln/a:noFill`), which PowerPoint writes on ordinary text
921
+ * to say the glyphs are not stroked.
922
+ */
923
+ noFill: boolean;
924
+ /**
925
+ * The stroke's solid colour (`a:ln/a:solidFill`), as written and resolved against the slide theme.
926
+ * Every field is `null` when the outline has no solid fill (`a:noFill`, a gradient, or none).
927
+ */
928
+ colorRef: ColorRef;
929
+ }
829
930
  /** One text run (`a:r`): a span of text with uniform character formatting. */
830
931
  declare class Run {
831
932
  #private;
@@ -855,7 +956,7 @@ declare class Run {
855
956
  * its runs; nothing in it is resolved until a run asks.
856
957
  */
857
958
  inherited: InheritedRunProps | null);
858
- /** The run's text (`a:t`), verbatim — whitespace is not normalized. */
959
+ /** The run's text (`a:t`), verbatim; whitespace is not normalized. */
859
960
  get text(): string;
860
961
  set text(value: string);
861
962
  /** Font size in points (`a:rPr/@sz` is hundredths of a point), or `null` if unset. */
@@ -874,7 +975,7 @@ declare class Run {
874
975
  /**
875
976
  * Strikethrough token (`a:rPr/@strike`: `noStrike` | `sngStrike` |
876
977
  * `dblStrike`), or `null` when unset (inherited from the style). Surfaced as
877
- * the raw token — `sngStrike` is the writer's single-strike value.
978
+ * the raw token; `sngStrike` is the writer's single-strike value.
878
979
  */
879
980
  get strike(): string | null;
880
981
  /**
@@ -888,8 +989,8 @@ declare class Run {
888
989
  * `30`), negative for subscript (`-40`), or `null` when unset. Reported as the
889
990
  * percentage (`@baseline` ÷ 1000).
890
991
  *
891
- * `@baseline` is `a:ST_Percentage`, a union that also admits `"62.5%"` — the only form the
892
- * Strict profile has — so it is read through `parsePercentPoints` rather than as a bare number.
992
+ * `@baseline` is `a:ST_Percentage`, a union that also admits `"62.5%"` (the only form the
993
+ * Strict profile has), so it is read through `parsePercentPoints` rather than as a bare number.
893
994
  */
894
995
  get baselinePct(): number | null;
895
996
  /**
@@ -898,6 +999,12 @@ declare class Run {
898
999
  * the write-side `charSpacing` option.
899
1000
  */
900
1001
  get charSpacingPt(): number | null;
1002
+ /**
1003
+ * Kerning threshold in points (`a:rPr/@kern`, authored in hundredths of a point), or `null`
1004
+ * when unset: text at this font size or larger is pair-kerned, and `0` means kerning is off.
1005
+ * PowerPoint's own default is `12`. The read counterpart of the write-side `kerning` option.
1006
+ */
1007
+ get kerningPt(): number | null;
901
1008
  /**
902
1009
  * The run's highlight colour (`a:rPr/a:highlight`), resolved to a literal hex
903
1010
  * through the owning slide's theme, or `null` when the run has no highlight or
@@ -914,6 +1021,45 @@ declare class Run {
914
1021
  * `@r:id`/`@action`/`@tooltip` are reported (the target stays `null`).
915
1022
  */
916
1023
  get hyperlink(): Hyperlink | null;
1024
+ /**
1025
+ * The run's language tag (`a:rPr/@lang`, e.g. `fr-FR`), or `null` when unset. Decides spelling,
1026
+ * hyphenation and font fallback. The read counterpart of the write-side `lang` option.
1027
+ */
1028
+ get language(): string | null;
1029
+ /**
1030
+ * The run's own glow (`a:rPr/a:effectLst/a:glow`), resolved against the slide theme, or `null`.
1031
+ * The read counterpart of the write-side text `glow` option; a shape's glow is `Shape.glow`.
1032
+ */
1033
+ get glow(): Glow | null;
1034
+ /**
1035
+ * The run's own outer shadow (`a:rPr/a:effectLst/a:outerShdw`), resolved against the slide
1036
+ * theme, or `null`. The read counterpart of a run's `shadow` option and of a table cell's,
1037
+ * which writes it on every run of the cell; a shape's shadow is `Shape.shadow`.
1038
+ */
1039
+ get shadow(): OuterShadow | null;
1040
+ /**
1041
+ * The run's own inner shadow (`a:rPr/a:effectLst/a:innerShdw`), resolved against the slide
1042
+ * theme, or `null`. What a run's `shadow: { type: 'inner' }` writes.
1043
+ */
1044
+ get innerShadow(): InnerShadow | null;
1045
+ /** The run's text outline (`a:rPr/a:ln`), or `null` when it has none. The read counterpart of `outline`. */
1046
+ get outline(): RunOutline | null;
1047
+ /**
1048
+ * The underline's own colour (`a:rPr/a:uFill/a:solidFill`), as written and resolved, or `null`
1049
+ * when the underline follows the text colour. The read counterpart of `underline.color`.
1050
+ */
1051
+ get underlineColor(): ColorRef | null;
1052
+ /**
1053
+ * The East Asian typeface (`a:rPr/a:ea/@typeface`), or `null` when unset. {@link fontName} is the
1054
+ * Latin slot. The read counterpart of the write-side `fontFaceEA` option.
1055
+ */
1056
+ get eastAsianFontName(): string | null;
1057
+ /**
1058
+ * How many line breaks (`a:br`) sit directly before this run in its paragraph, with no run or
1059
+ * field between them. A soft break is not a run, so without this the runs on either side of one
1060
+ * read as plain neighbours. The read counterpart of the write-side `softBreakBefore` option.
1061
+ */
1062
+ get breaksBefore(): number;
917
1063
  /** Latin typeface name (`a:rPr/a:latin/@typeface`), or `null` when unset. */
918
1064
  get fontName(): string | null;
919
1065
  set fontName(value: string | null);
@@ -928,7 +1074,7 @@ declare class Run {
928
1074
  * The colour this run effectively renders, resolved against the owning slide's
929
1075
  * theme to a literal hex. It is the run's own solid fill
930
1076
  * ({@link color}/{@link schemeColor}) when set; otherwise the shape's
931
- * `p:style/a:fontRef` colour, then — for a run inside a placeholder — the colour
1077
+ * `p:style/a:fontRef` colour, then (for a run inside a placeholder) the colour
932
1078
  * it inherits from the placeholder/list-style chain (layout → master placeholder
933
1079
  * `a:lstStyle` → master `p:txStyles`), then the presentation's
934
1080
  * `p:defaultTextStyle`. `null` when the run sets no colour and inherits none, or the
@@ -936,8 +1082,11 @@ declare class Run {
936
1082
  * `null` too when the run's own fill is not a solid colour (`a:noFill`, a gradient):
937
1083
  * the run decides its own colour then, and the one it would otherwise inherit is not
938
1084
  * what it paints in, the rule `Shape.resolvedFill` and `TableCell.resolvedFill` follow.
939
- * The returned {@link ResolvedColor} carries `effectiveHex` — the base colour with
940
- * its child transforms (`lumMod`/`shade`/…) applied — for the final rendered colour.
1085
+ * A run with a click hyperlink (`a:hlinkClick`) and no fill of its own is painted in the
1086
+ * theme's `hlink` colour instead, resolved through the slide's colour map, unless the link
1087
+ * carries the 2018 `ahyp:hlinkClr val="tx"` extension, which asks for the text colour above.
1088
+ * The returned {@link ResolvedColor} carries `effectiveHex`, the base colour with
1089
+ * its child transforms (`lumMod`/`shade`/…) applied, for the final rendered colour.
941
1090
  */
942
1091
  get resolvedColor(): ResolvedColor | null;
943
1092
  /**
@@ -945,20 +1094,21 @@ declare class Run {
945
1094
  * ({@link fontSizePt}) when set; otherwise, for a run inside a placeholder, the
946
1095
  * size it inherits from the placeholder/list-style chain (paragraph `a:defRPr` →
947
1096
  * slide `a:lstStyle` → layout → master placeholder `a:lstStyle` → master
948
- * `p:txStyles`). `null` when the run sets no size and inherits none — the
1097
+ * `p:txStyles`). `null` when the run sets no size and inherits none. This is the
949
1098
  * resolved counterpart of {@link fontSizePt}, which reports only the run's own value.
950
1099
  */
951
1100
  get resolvedSizePt(): number | null;
952
1101
  /**
953
1102
  * The typeface this run effectively renders, resolved to a literal face name. It
954
1103
  * is the run's own `a:latin` ({@link fontName}) when set; otherwise the face named
955
- * by the shape's `p:style/a:fontRef` (`idx` → theme major/minor font), then — for a
956
- * run inside a placeholder — the face it inherits from the placeholder/list-style
1104
+ * by the shape's `p:style/a:fontRef` (`idx` → theme major/minor font), then (for a
1105
+ * run inside a placeholder) the face it inherits from the placeholder/list-style
957
1106
  * chain, then the presentation's `p:defaultTextStyle`. A `+mj-*`/`+mn-*`
958
- * major/minor theme-font token — on the run itself or reached through the chain —
1107
+ * major/minor theme-font token, on the run itself or reached through the chain,
959
1108
  * is resolved through the theme `fontScheme` to its concrete face. `null` when the
960
- * run names no face and inherits none, or a token cannot be resolved — the resolved
961
- * counterpart of {@link fontName}, which reports the raw `@typeface` (possibly a token).
1109
+ * run names no face and inherits none, or a token cannot be resolved. This is the
1110
+ * resolved counterpart of {@link fontName}, which reports the raw `@typeface` (possibly a
1111
+ * token).
962
1112
  */
963
1113
  get resolvedFontFace(): string | null;
964
1114
  /**
@@ -966,7 +1116,7 @@ declare class Run {
966
1116
  * ({@link bold}) when set; otherwise, for a run inside a placeholder, the bold
967
1117
  * state it inherits from the placeholder/list-style chain (paragraph `a:defRPr` →
968
1118
  * slide `a:lstStyle` → layout → master placeholder `a:lstStyle` → master
969
- * `p:txStyles`). `null` when the run sets no `@b` and inherits none — the
1119
+ * `p:txStyles`). `null` when the run sets no `@b` and inherits none. This is the
970
1120
  * resolved counterpart of {@link bold}, which reports only the run's own value.
971
1121
  */
972
1122
  get resolvedBold(): boolean | null;
@@ -975,7 +1125,7 @@ declare class Run {
975
1125
  * ({@link italic}) when set; otherwise, for a run inside a placeholder, the italic
976
1126
  * state it inherits from the placeholder/list-style chain (paragraph `a:defRPr` →
977
1127
  * slide `a:lstStyle` → layout → master placeholder `a:lstStyle` → master
978
- * `p:txStyles`). `null` when the run sets no `@i` and inherits none — the
1128
+ * `p:txStyles`). `null` when the run sets no `@i` and inherits none. This is the
979
1129
  * resolved counterpart of {@link italic}, and the twin of {@link resolvedBold}:
980
1130
  * `@b` and `@i` are siblings a master text style states together, so a deck that
981
1131
  * can be authored with an inherited italic can be read back with one.
@@ -986,8 +1136,36 @@ declare class Run {
986
1136
  /** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
987
1137
  markDirty(): void;
988
1138
  }
989
- //#endregion
990
- //#region src/read/api/text/paragraph.d.ts
1139
+ /**
1140
+ * One text field (`a:fld`): text PowerPoint computes as it renders, such as a slide number
1141
+ * (`slidenum`) or a date (`datetime1`). A field carries the same `a:rPr` a run does, so it reads
1142
+ * and resolves its formatting like one. {@link text} is the rendering PowerPoint last cached,
1143
+ * which it recomputes on open.
1144
+ */
1145
+ declare class Field extends Run {
1146
+ /** How many of the paragraph's {@link Paragraph.runs} come before it, which places it among them. */
1147
+ readonly runIndex: number;
1148
+ constructor(element: Element, context: TextContext, inherited: InheritedRunProps | null,
1149
+ /** How many of the paragraph's {@link Paragraph.runs} come before it, which places it among them. */
1150
+ runIndex: number);
1151
+ /** The field type (`@type`), such as `slidenum` or `datetime1`, or `null` when unset. */
1152
+ get type(): string | null;
1153
+ }
1154
+ /**
1155
+ * One OMML equation in a paragraph (an `a14:m` element), in the form `TextProps.math` and `inline`
1156
+ * take back.
1157
+ */
1158
+ interface Equation {
1159
+ /**
1160
+ * The equation's OMML as written: an `m:oMathPara` for a display equation, an `m:oMath` for an
1161
+ * inline one. It declares every namespace it uses, PowerPoint's `a:` run properties included.
1162
+ */
1163
+ omml: string;
1164
+ /** Whether the equation flows between the paragraph's runs (a bare `m:oMath`) rather than standing as a display block (`m:oMathPara`). */
1165
+ inline: boolean;
1166
+ /** How many of the paragraph's {@link Paragraph.runs} come before it, which places it among them. */
1167
+ runIndex: number;
1168
+ }
991
1169
  /** One paragraph (`a:p`) of a text frame. */
992
1170
  declare class Paragraph {
993
1171
  #private;
@@ -1007,8 +1185,24 @@ declare class Paragraph {
1007
1185
  * runs inherit through. Read only when {@link TextContext.inherit} is set.
1008
1186
  */
1009
1187
  slideLstStyle: Element | null);
1010
- /** The runs (`a:r`) in document order. Fields (`a:fld`) and breaks are not runs; see `text`. */
1188
+ /** The runs (`a:r`) in document order. Fields (`a:fld`) are not runs (see {@link fields}), nor are breaks. */
1011
1189
  get runs(): Run[];
1190
+ /**
1191
+ * The OMML equations (`a14:m`) in document order. An equation is neither a run nor part of
1192
+ * {@link text}; each says how many runs precede it, so an inline one keeps its place.
1193
+ */
1194
+ get equations(): Equation[];
1195
+ /**
1196
+ * The fields (`a:fld`) in document order, each read like a run; see {@link Field}. Each says how
1197
+ * many runs precede it, so a field between runs keeps its place.
1198
+ */
1199
+ get fields(): Field[];
1200
+ /**
1201
+ * The language of the paragraph's end mark (`a:endParaRPr/@lang`, e.g. `fr-FR`), or `null` when
1202
+ * unset. It is what text typed at the end of the paragraph, or into an empty one, is spelled in.
1203
+ * The write side states it from the text's `lang` option.
1204
+ */
1205
+ get endLanguage(): string | null;
1012
1206
  /** Indent level (`a:pPr/@lvl`), 0 when unset. */
1013
1207
  get level(): number;
1014
1208
  /**
@@ -1035,7 +1229,41 @@ declare class Paragraph {
1035
1229
  /** First-line indent in points (`a:pPr/@indent` is EMU; negative for a hanging indent), or `null` when unset. */
1036
1230
  get indentPt(): number | null;
1037
1231
  /**
1038
- * This paragraph's bullet — its kind, and for a drawn bullet the glyph, the
1232
+ * The alignment the paragraph renders with: its own, else the first its level inherits through
1233
+ * the text body's `a:lstStyle`, the placeholder's layout and master list styles, the master's
1234
+ * `p:txStyles` and the presentation's `p:defaultTextStyle`, the chain {@link Run.resolvedSizePt}
1235
+ * walks. `null` when nothing in the chain states one (PowerPoint then aligns left).
1236
+ */
1237
+ get resolvedAlign(): string | null;
1238
+ /** The left margin in points the paragraph renders with, resolved as {@link resolvedAlign} is. */
1239
+ get resolvedMarginLeftPt(): number | null;
1240
+ /** The first-line indent in points the paragraph renders with, resolved as {@link resolvedAlign} is. */
1241
+ get resolvedIndentPt(): number | null;
1242
+ /** The line spacing the paragraph renders with, resolved as {@link resolvedAlign} is. */
1243
+ get resolvedLineSpacing(): LineSpacing | null;
1244
+ /** The space before the paragraph in points, resolved as {@link resolvedAlign} is. */
1245
+ get resolvedSpaceBeforePt(): number | null;
1246
+ /** The space after the paragraph in points, resolved as {@link resolvedAlign} is. */
1247
+ get resolvedSpaceAfterPt(): number | null;
1248
+ /**
1249
+ * The bullet the paragraph renders with: its own {@link bulletDetail}, else the first bullet its
1250
+ * level inherits, resolved as {@link resolvedAlign} is. A picture bullet from an inherited tier
1251
+ * reads with `imagePartName: null`, its image being a relationship of the layout or master.
1252
+ * `null` when nothing in the chain names one.
1253
+ */
1254
+ get resolvedBulletDetail(): BulletDetail | null;
1255
+ /**
1256
+ * Right-to-left paragraph direction (`a:pPr/@rtl`), or `null` when unset (left to right). The
1257
+ * read counterpart of the write-side `rtlMode` option.
1258
+ */
1259
+ get rtl(): boolean | null;
1260
+ /**
1261
+ * The paragraph's own tab stops (`a:pPr/a:tabLst/a:tab`) in document order, or `null` when it
1262
+ * states no tab list and inherits one. The read counterpart of the write-side `tabStops` option.
1263
+ */
1264
+ get tabStops(): TabStop[] | null;
1265
+ /**
1266
+ * This paragraph's bullet: its kind, and for a drawn bullet the glyph, the
1039
1267
  * numbering start, and the bullet's own font/size/colour. `null` when the
1040
1268
  * paragraph names no bullet at all and inherits one from the list style.
1041
1269
  *
@@ -1043,7 +1271,7 @@ declare class Paragraph {
1043
1271
  * previous `bullet` accessor reported `'none'` / `'char:•'` /
1044
1272
  * `'autoNum:arabicPeriod'`, and that shape is ambiguous when the glyph is
1045
1273
  * itself a colon; worse, it reads as a bare glyph, which is exactly how the
1046
- * script converter first consumed it — `'none'.codePointAt(0)` put a literal
1274
+ * script converter first consumed it: `'none'.codePointAt(0)` put a literal
1047
1275
  * `n` bullet on every converted deck, silently. See {@link BulletDetail}.
1048
1276
  */
1049
1277
  get bulletDetail(): BulletDetail | null;
@@ -1055,7 +1283,7 @@ declare class Paragraph {
1055
1283
  /**
1056
1284
  * Replace **this paragraph's** content with a single run, preserving the character
1057
1285
  * formatting (`a:rPr`) of its first existing run and leaving its `a:pPr` (level,
1058
- * alignment, bullet) alone. Sibling paragraphs are untouched — the difference from
1286
+ * alignment, bullet) alone. Sibling paragraphs are untouched. That is the difference from
1059
1287
  * {@link TextFrame.text}, which collapses the whole body to one paragraph.
1060
1288
  */
1061
1289
  set text(value: string);
@@ -1064,13 +1292,10 @@ declare class Paragraph {
1064
1292
  /** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
1065
1293
  markDirty(): void;
1066
1294
  }
1067
- /** A shape's text frame (`p:txBody`): an ordered list of paragraphs. */
1068
- //#endregion
1069
- //#region src/read/api/text/frame.d.ts
1070
1295
  /**
1071
1296
  * A text frame's body properties (`a:bodyPr`), as read from a shape. Carries the
1072
- * inset/anchor/vertical-text settings that govern where text sits inside its box
1073
- * — the difference between a label that clears a left rail and one that overlaps
1297
+ * inset/anchor/vertical-text settings that govern where text sits inside its box:
1298
+ * the difference between a label that clears a left rail and one that overlaps
1074
1299
  * it. Only **explicitly set** attributes are reported; an absent inset means the
1075
1300
  * PowerPoint default (`lIns`/`rIns` = 0.1", `tIns`/`bIns` = 0.05").
1076
1301
  */
@@ -1088,35 +1313,66 @@ interface BodyProperties {
1088
1313
  top?: number;
1089
1314
  bottom?: number;
1090
1315
  };
1316
+ /** Number of text columns (`@numCol`), or `null` when unset (one column). The write side's `columns`. */
1317
+ columns: number | null;
1318
+ /** Space between columns in points (`@spcCol` ÷ 12700), or `null` when unset. The write side's `columnSpacing`. */
1319
+ columnSpacingPt: number | null;
1320
+ /** Preset WordArt warp (`a:prstTxWarp/@prst`, e.g. `textArchUp`), or `null` when none. The write side's `textWarp`. */
1321
+ textWarp: string | null;
1322
+ }
1323
+ /**
1324
+ * The character defaults a frame's own list style states for one level
1325
+ * (`a:lstStyle/a:lvlNpPr/a:defRPr`). Each field is `null` when that `a:defRPr` does not state it.
1326
+ */
1327
+ interface ListStyleDefaults {
1328
+ /** `@sz` in points, or `null`. */
1329
+ fontSizePt: number | null;
1330
+ /** `a:latin/@typeface`, as written (a `+mj-lt` token stays a token), or `null`. */
1331
+ fontName: string | null;
1332
+ /** `@b`, or `null`. */
1333
+ bold: boolean | null;
1334
+ /** `@i`, or `null`. */
1335
+ italic: boolean | null;
1336
+ /** The `a:solidFill` colour, or `null` when the level states no solid fill. */
1337
+ colorRef: ColorRef | null;
1091
1338
  }
1092
1339
  /**
1093
1340
  * A text frame's vertical-autofit mode, read from its `a:bodyPr` autofit child:
1094
- * - `'none'` — `a:noAutofit`, or no autofit child at all (the box has a fixed
1095
- * size and text can overflow); write-side `fit: 'none'`.
1096
- * - `'normAutofit'`— `a:normAutofit` (shrink text to fit); write-side `fit: 'shrink'`.
1097
- * - `'spAutoFit'` — `a:spAutoFit` (resize the shape to fit text); write-side `fit: 'resize'`.
1341
+ * - `'none'`: `a:noAutofit`, or no autofit child at all (the box has a fixed
1342
+ * size and text can overflow); write-side `fit: 'none'`.
1343
+ * - `'normAutofit'`: `a:normAutofit` (shrink text to fit); write-side `fit: 'shrink'`.
1344
+ * - `'spAutoFit'`: `a:spAutoFit` (resize the shape to fit text); write-side `fit: 'resize'`.
1098
1345
  */
1099
1346
  type AutofitMode = 'none' | 'normAutofit' | 'spAutoFit';
1100
1347
  declare class TextFrame {
1101
1348
  #private;
1102
1349
  private readonly txBody;
1103
1350
  /**
1104
- * What the frame is read against — its part, the theme, the part's relationships and the
1105
- * inheritance its runs fall back through — handed on to each {@link Paragraph} and {@link Run}.
1351
+ * What the frame is read against (its part, the theme, the part's relationships and the
1352
+ * inheritance its runs fall back through), handed on to each {@link Paragraph} and {@link Run}.
1106
1353
  */
1107
1354
  private readonly context;
1108
1355
  constructor(txBody: Element,
1109
1356
  /**
1110
- * What the frame is read against — its part, the theme, the part's relationships and the
1111
- * inheritance its runs fall back through — handed on to each {@link Paragraph} and {@link Run}.
1357
+ * What the frame is read against (its part, the theme, the part's relationships and the
1358
+ * inheritance its runs fall back through), handed on to each {@link Paragraph} and {@link Run}.
1112
1359
  */
1113
1360
  context: TextContext);
1114
1361
  /** Paragraphs (`a:p`) in document order. */
1115
1362
  get paragraphs(): Paragraph[];
1363
+ /**
1364
+ * The character defaults this frame's own list style states for paragraphs at `level`
1365
+ * (0-based): `a:lstStyle/a:lvlNpPr/a:defRPr`, else `a:defPPr/a:defRPr`. `null` when the frame
1366
+ * has no list style or it states no defaults for that level.
1367
+ *
1368
+ * Only the frame's own tier. What a run inherits through it, and through a placeholder's
1369
+ * layout and master, is the run's `resolved*` reads.
1370
+ */
1371
+ listStyleDefaults(level?: number): ListStyleDefaults | null;
1116
1372
  /**
1117
1373
  * The frame's body properties (`a:bodyPr`: insets, anchor, vertical text), or
1118
1374
  * `null` when there is no `a:bodyPr`. Only explicitly-set insets are reported
1119
- * (a missing side is the PowerPoint default — see {@link BodyProperties}).
1375
+ * (a missing side is the PowerPoint default; see {@link BodyProperties}).
1120
1376
  */
1121
1377
  get bodyProperties(): BodyProperties | null;
1122
1378
  /**
@@ -1125,14 +1381,14 @@ declare class TextFrame {
1125
1381
  * layout → master placeholder `a:bodyPr`. `null` when nothing in the chain sets
1126
1382
  * one (PowerPoint then defaults to top). Unlike {@link bodyProperties}'s
1127
1383
  * `anchor` (own attribute only), this surfaces the inherited anchor a
1128
- * placeholder title relies on — the difference between a top- and
1384
+ * placeholder title relies on: the difference between a top- and
1129
1385
  * centre-anchored title that own-attribute reads alone cannot see.
1130
1386
  */
1131
1387
  get resolvedAnchor(): string | null;
1132
1388
  /**
1133
1389
  * The frame's vertical-autofit mode (`a:bodyPr` autofit child), or `null` when
1134
- * there is no `a:bodyPr`. A `bodyPr` with no autofit child — or an explicit
1135
- * `a:noAutofit` — reads `'none'`. See {@link AutofitMode}. This is the deep-model
1390
+ * there is no `a:bodyPr`. A `bodyPr` with no autofit child, or an explicit
1391
+ * `a:noAutofit`, reads `'none'`. See {@link AutofitMode}. This is the deep-model
1136
1392
  * counterpart of `inspectPptx`'s per-shape `autofit`; unlike the shallow surface
1137
1393
  * it hangs off the navigable text frame.
1138
1394
  */
@@ -1140,8 +1396,8 @@ declare class TextFrame {
1140
1396
  /**
1141
1397
  * The baked shrink scale of a `normAutofit` frame as a percent (62.5 = 62.5%),
1142
1398
  * or `null` when the frame has no `a:normAutofit` or bakes no scale. A bare
1143
- * `<a:normAutofit/>` (write-side `fit: 'shrink'`) carries no scale — PowerPoint
1144
- * computes it on edit and draws at 100% until then — so it too reads `null`; an
1399
+ * `<a:normAutofit/>` (write-side `fit: 'shrink'`) carries no scale (PowerPoint
1400
+ * computes it on edit and draws at 100% until then), so it too reads `null`; an
1145
1401
  * explicit scale comes from `fit: { type: 'shrink', fontScale }`.
1146
1402
  */
1147
1403
  get autofitFontScale(): number | null;
@@ -1165,8 +1421,6 @@ declare class TextFrame {
1165
1421
  /** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
1166
1422
  markDirty(): void;
1167
1423
  }
1168
- //#endregion
1169
- //#region src/read/api/shapes/host.d.ts
1170
1424
  /** The part-level surface a {@link Shape} resolves against. */
1171
1425
  interface ShapeHost {
1172
1426
  /** The OPC part holding the shape tree (`p:sld` / `p:sldLayout` / `p:sldMaster`). */
@@ -1175,28 +1429,26 @@ interface ShapeHost {
1175
1429
  readonly partName: string;
1176
1430
  /** The package the host belongs to, for reaching a referenced part (image, chart, …). */
1177
1431
  readonly opc: OpcPackage;
1178
- /** {@link part}'s relationships — image embeds, hyperlinks, chart references. */
1432
+ /** {@link part}'s relationships: image embeds, hyperlinks, chart references. */
1179
1433
  readonly relationships: Relationships;
1180
1434
  /** The host's resolved colour/font context, backing every `resolved*` getter. */
1181
1435
  themeContext(): ThemeContext;
1182
- /** The shape anywhere in this host's tree with the given drawing id, or `undefined`. */
1183
- shapeByIdDeep(id: number): AnyShape | undefined;
1436
+ /** The shape anywhere in this host's tree with the given drawing id, or `undefined` (always, for `null`). */
1437
+ shapeByIdDeep(id: number | null): AnyShape | undefined;
1184
1438
  }
1185
- //#endregion
1186
- //#region src/read/api/shapes/base.d.ts
1187
- /** Common base for every shape in a shape tree — a slide's, a layout's, or a master's. */
1439
+ /** Common base for every shape in a shape tree: a slide's, a layout's, or a master's. */
1188
1440
  declare abstract class Shape {
1189
1441
  #private;
1190
1442
  protected readonly element: Element;
1191
1443
  /**
1192
- * The part that owns this shape's tree — a `Slide`, a `SlideLayout`, or a
1444
+ * The part that owns this shape's tree: a `Slide`, a `SlideLayout`, or a
1193
1445
  * `SlideMaster`. Narrow it with `instanceof` when you need the concrete class;
1194
1446
  * {@link ShapeHost.partName} tells the tiers apart without one.
1195
1447
  */
1196
1448
  readonly host: ShapeHost;
1197
1449
  constructor(element: Element,
1198
1450
  /**
1199
- * The part that owns this shape's tree — a `Slide`, a `SlideLayout`, or a
1451
+ * The part that owns this shape's tree: a `Slide`, a `SlideLayout`, or a
1200
1452
  * `SlideMaster`. Narrow it with `instanceof` when you need the concrete class;
1201
1453
  * {@link ShapeHost.partName} tells the tiers apart without one.
1202
1454
  */
@@ -1239,11 +1491,18 @@ declare abstract class Shape {
1239
1491
  /**
1240
1492
  * Whether the shape is explicitly hidden (`p:cNvPr/@hidden="1"`); `false` when
1241
1493
  * the attribute is unset. A hidden shape stays in the slide XML but is not
1242
- * rendered — decks use it as a fallback layer (e.g. a duotone-recolour source
1494
+ * rendered. Decks use it as a fallback layer (e.g. a duotone-recolour source
1243
1495
  * sitting behind the visible icon), so a faithful reader must distinguish it
1244
1496
  * from the drawn shapes.
1245
1497
  */
1246
1498
  get hidden(): boolean;
1499
+ /**
1500
+ * The shape's lock flags: the attributes of the locking element under its non-visual drawing
1501
+ * properties (`a:spLocks`, `a:picLocks`, `a:cxnSpLocks`, `a:graphicFrameLocks` or
1502
+ * `a:grpSpLocks`), each as the boolean it states, keyed by attribute name (`noMove`, `noGrp`, …).
1503
+ * `null` when the shape has no locking element. The read counterpart of `objectLock`.
1504
+ */
1505
+ get locks(): Record<string, boolean> | null;
1247
1506
  /**
1248
1507
  * The shape's alt-text description (`p:cNvPr/@descr`), or `null` when unset.
1249
1508
  * This is the accessibility primitive a screen reader announces; an audit or
@@ -1266,7 +1525,7 @@ declare abstract class Shape {
1266
1525
  /**
1267
1526
  * Whether the shape is flagged **decorative** (`p:cNvPr/a:extLst/a:ext`
1268
1527
  * uri `{C183D7F6-…}` / `adec:decorative@val`), PowerPoint's "Mark as
1269
- * decorative" — a purely visual element assistive tech should skip. `false`
1528
+ * decorative": a purely visual element assistive tech should skip. `false`
1270
1529
  * when the extension is absent. A decorative shape typically has no
1271
1530
  * {@link description}; the two are alternatives, not companions.
1272
1531
  */
@@ -1300,8 +1559,8 @@ declare abstract class Shape {
1300
1559
  get resolvedFrame(): ResolvedFrame | null;
1301
1560
  /**
1302
1561
  * Clockwise rotation in degrees (`a:xfrm/@rot` ÷ 60000), or `null` when the
1303
- * shape has no own transform. A present xfrm with no `@rot` reads as `0`, so
1304
- * — mirroring {@link left}/{@link top}/{@link width}/{@link height} — `null`
1562
+ * shape has no own transform. A present xfrm with no `@rot` reads as `0`, so,
1563
+ * mirroring {@link left}/{@link top}/{@link width}/{@link height}, `null`
1305
1564
  * ("inherits layout geometry") stays distinct from `0` ("has a transform, not
1306
1565
  * rotated"). The value is faithful to the XML and not normalised to a signed
1307
1566
  * range, so a `@rot` past 360° (e.g. a negative angle stored as `19216344`)
@@ -1338,7 +1597,7 @@ declare abstract class Shape {
1338
1597
  * equal the shape's own transform values.
1339
1598
  *
1340
1599
  * `null` when the shape (or any enclosing group) has no own transform, or a
1341
- * group's `a:chExt` is degenerate (zero) — there is then no resolvable frame.
1600
+ * group's `a:chExt` is degenerate (zero). There is then no resolvable frame.
1342
1601
  * {@link absoluteFrameFailure} says which of those it was.
1343
1602
  *
1344
1603
  * A rotated shape's returned `left`/`top` remain PowerPoint's unrotated
@@ -1350,7 +1609,7 @@ declare abstract class Shape {
1350
1609
  * Why {@link absoluteFrame} is `null`, or `null` when it resolved.
1351
1610
  *
1352
1611
  * `absoluteFrame` reports one `null` for three different situations, and only a
1353
- * caller that wants to *report* the unresolvable shape needs them apart — an
1612
+ * caller that wants to *report* the unresolvable shape needs them apart: an
1354
1613
  * inherited placeholder box is ordinary, a group with no usable `a:xfrm` is not.
1355
1614
  * The distinction is not recoverable from the `null`, and re-deriving it means
1356
1615
  * walking the same ancestry a second time, so it is named here instead. See
@@ -1379,19 +1638,19 @@ declare abstract class Shape {
1379
1638
  get fillSchemeColor(): string | null;
1380
1639
  set fillSchemeColor(value: string | null);
1381
1640
  /**
1382
- * `true` when the shape sets an explicit no-fill (`spPr/a:noFill`) — a
1641
+ * `true` when the shape sets an explicit no-fill (`spPr/a:noFill`): a
1383
1642
  * deliberately transparent surface. The fill-side counterpart of
1384
1643
  * {@link lineNoFill}, and the only accessor that separates it from a shape
1385
1644
  * carrying no fill child at all (one inheriting through `p:style/a:fillRef`):
1386
- * every other fill accessor — {@link fillColor}, {@link fillSchemeColor},
1645
+ * every other fill accessor ({@link fillColor}, {@link fillSchemeColor},
1387
1646
  * {@link resolvedFill}, {@link gradientFill}, {@link patternFill},
1388
- * {@link pictureFill} — reports `null` for both. The two paint completely
1647
+ * {@link pictureFill}) reports `null` for both. The two paint completely
1389
1648
  * differently, so a consumer that cannot tell them apart paints a transparent
1390
1649
  * shape in the theme's accent colour.
1391
1650
  */
1392
1651
  get fillNoFill(): boolean;
1393
1652
  /**
1394
- * Set an explicit `<a:noFill/>` on the shape — a transparent surface. This is
1653
+ * Set an explicit `<a:noFill/>` on the shape: a transparent surface. This is
1395
1654
  * distinct from clearing the fill (`fillColor = null`), which removes the
1396
1655
  * `a:solidFill` and lets the fill inherit from the shape's style/placeholder.
1397
1656
  * Read it back with {@link fillNoFill}.
@@ -1408,12 +1667,12 @@ declare abstract class Shape {
1408
1667
  /**
1409
1668
  * The line/border dash style (`spPr/a:ln/a:prstDash/@val`), e.g. `'dash'`,
1410
1669
  * `'lgDashDot'`, `'sysDot'`, or `null` when the line is solid/unset. A faithful
1411
- * replica of dashed dividers and dashed card borders needs this — it is
1670
+ * replica of dashed dividers and dashed card borders needs this: it is
1412
1671
  * otherwise invisible in {@link lineColor}/{@link lineWidthPt} alone.
1413
1672
  */
1414
1673
  get lineDash(): string | null;
1415
1674
  /**
1416
- * `true` when the shape sets an explicit no-line (`spPr/a:ln/a:noFill`) — a
1675
+ * `true` when the shape sets an explicit no-line (`spPr/a:ln/a:noFill`): a
1417
1676
  * deliberately border-less shape. Distinct from simply having no `a:ln`
1418
1677
  * (an inherited line), which {@link resolvedLine} cannot tell apart: both
1419
1678
  * report `null`. A replica that relies on a shadow instead of a border needs
@@ -1421,8 +1680,18 @@ declare abstract class Shape {
1421
1680
  */
1422
1681
  get lineNoFill(): boolean;
1423
1682
  /**
1424
- * The line end cap (`spPr/a:ln/@cap`) as the raw OOXML token — `'flat'`,
1425
- * `'rnd'` (round) or `'sq'` (square) — or `null` when unset (PowerPoint's
1683
+ * Whether the shape states an outline of its **own** (`spPr/a:ln`), however little it holds.
1684
+ *
1685
+ * The line accessors all report `null` both for a shape with no `a:ln` and for one whose `a:ln`
1686
+ * is empty, and the two are different statements to a writer: an empty `<a:ln/>` says "take the
1687
+ * whole outline from `p:style` or the placeholder", which is what PowerPoint writes on its own
1688
+ * placeholders, and `addShape` writes it for `line: { type: 'inherit' }`. A copy that has to
1689
+ * reproduce the outline rather than describe it needs to know which one it has.
1690
+ */
1691
+ get hasOwnLine(): boolean;
1692
+ /**
1693
+ * The line end cap (`spPr/a:ln/@cap`) as the raw OOXML token, `'flat'`,
1694
+ * `'rnd'` (round) or `'sq'` (square), or `null` when unset (PowerPoint's
1426
1695
  * default is `flat`). The write API authors this attribute through
1427
1696
  * `ShapeLineProps.cap`, so without the accessor a deck this library produced
1428
1697
  * could not be read back without losing it.
@@ -1434,8 +1703,8 @@ declare abstract class Shape {
1434
1703
  */
1435
1704
  get lineCap(): string | null;
1436
1705
  /**
1437
- * The line alignment (`spPr/a:ln/@algn`) as the raw OOXML token — `'ctr'`
1438
- * (centred on the shape's outline) or `'in'` (inset, drawn wholly inside it) —
1706
+ * The line alignment (`spPr/a:ln/@algn`) as the raw OOXML token, `'ctr'`
1707
+ * (centred on the shape's outline) or `'in'` (inset, drawn wholly inside it),
1439
1708
  * or `null` when unset. It shifts a thick outline by half its width, so it
1440
1709
  * changes where the border sits relative to the fill.
1441
1710
  */
@@ -1453,7 +1722,7 @@ declare abstract class Shape {
1453
1722
  * shape uses preset geometry / none. The faithful, multi-path counterpart of
1454
1723
  * {@link presetGeometry}: each `a:path` keeps its own path-unit viewport
1455
1724
  * (`w`/`h`) and ordered {@link GeometryCommand}s. Coordinates are raw path-unit
1456
- * integers, not EMU — pair the path `w`/`h` with the shape's box size to map
1725
+ * integers, not EMU. Pair the path `w`/`h` with the shape's box size to map
1457
1726
  * them into slide space.
1458
1727
  *
1459
1728
  * Not an auto-shape-only property either: a picture clipped to a freeform (what
@@ -1479,7 +1748,7 @@ declare abstract class Shape {
1479
1748
  * The shape's gradient fill with its geometry (`spPr/a:gradFill`), or `null`
1480
1749
  * when the fill is not a gradient. Unlike {@link gradientStops} (stops only),
1481
1750
  * this also carries the linear {@link GradientFill.angleDeg} or the
1482
- * {@link GradientFill.path} shape — the geometry a faithful replica needs and
1751
+ * {@link GradientFill.path} shape: the geometry a faithful replica needs and
1483
1752
  * which the bare stop list omits.
1484
1753
  */
1485
1754
  get gradientFill(): GradientFill | null;
@@ -1487,11 +1756,17 @@ declare abstract class Shape {
1487
1756
  * The shape's line/border **gradient** stroke (`spPr/a:ln/a:gradFill`), or
1488
1757
  * `null` when the line is a solid, absent, or inherited border (see
1489
1758
  * {@link resolvedLine}). The line counterpart of {@link gradientFill}: a
1490
- * gradient-stroked connector — common for faded process arrows in styled decks
1491
- * — otherwise surfaces only its {@link lineWidthPt}, dropping the colour
1759
+ * gradient-stroked connector (common for faded process arrows in styled decks)
1760
+ * otherwise surfaces only its {@link lineWidthPt}, dropping the colour
1492
1761
  * entirely, so a replica cannot reproduce the stroke.
1493
1762
  */
1494
1763
  get lineGradient(): GradientFill | null;
1764
+ /**
1765
+ * The shape's line/border **pattern** stroke (`spPr/a:ln/a:pattFill`), or `null` when the line
1766
+ * is not a pattern. The line counterpart of {@link patternFill}, and what the write side's
1767
+ * `line.pattern` writes.
1768
+ */
1769
+ get linePatternFill(): PatternFill | null;
1495
1770
  /**
1496
1771
  * The shape's line/connector arrowheads (`a:ln/a:headEnd` + `a:tailEnd`), or
1497
1772
  * `null` when neither end carries one. Essential for replicating connectors,
@@ -1521,7 +1796,7 @@ declare abstract class Shape {
1521
1796
  /**
1522
1797
  * The shape's reflection (`spPr/a:effectLst/a:reflection`), or `null` when it has
1523
1798
  * none. Read-only: this library authors no reflection, so a replica should carry
1524
- * the part rather than regenerate it — see {@link Reflection}.
1799
+ * the part rather than regenerate it (see {@link Reflection}).
1525
1800
  */
1526
1801
  get reflection(): Reflection | null;
1527
1802
  /**
@@ -1532,7 +1807,7 @@ declare abstract class Shape {
1532
1807
  /**
1533
1808
  * The shape's pattern (hatch) fill (`spPr/a:pattFill`), or `null` when the fill
1534
1809
  * is not a pattern. Surfaces the {@link PatternFill.preset} name and both
1535
- * colours resolved against the host's theme — the pattern counterpart of
1810
+ * colours resolved against the host's theme: the pattern counterpart of
1536
1811
  * {@link resolvedFill}, which reports `null` for a non-solid fill and so drops a
1537
1812
  * hatched surface entirely.
1538
1813
  */
@@ -1540,8 +1815,8 @@ declare abstract class Shape {
1540
1815
  /**
1541
1816
  * The shape's picture (image) fill (`spPr/a:blipFill`), or `null` when the fill
1542
1817
  * is not a picture. The image-fill counterpart of {@link patternFill}: a shape
1543
- * whose *surface* is an image is not a {@link Picture} — it is an autoShape with
1544
- * a blip fill — and {@link resolvedFill} reports `null` for one, so without this
1818
+ * whose *surface* is an image is not a {@link Picture} (it is an autoShape with
1819
+ * a blip fill), and {@link resolvedFill} reports `null` for one, so without this
1545
1820
  * an image-filled shape reads as unfilled. Carries the embedded image
1546
1821
  * ({@link PictureFill.relId}/{@link PictureFill.partName}) plus the stretch/tile
1547
1822
  * geometry.
@@ -1549,11 +1824,11 @@ declare abstract class Shape {
1549
1824
  get pictureFill(): PictureFill | null;
1550
1825
  /**
1551
1826
  * The shape's solid fill resolved against the host's theme
1552
- * ({@link Slide.themeContext}) to a literal hex — the resolved counterpart of
1827
+ * ({@link Slide.themeContext}) to a literal hex: the resolved counterpart of
1553
1828
  * {@link fillColor}/{@link fillSchemeColor}, which report the raw reference.
1554
1829
  * `null` when the shape has no `a:solidFill` (a gradient/none/inherited fill)
1555
1830
  * or the colour cannot be made literal. The returned {@link ResolvedColor}
1556
- * carries the base `hex` and raw transforms, and `effectiveHex` — the base with
1831
+ * carries the base `hex` and raw transforms, and `effectiveHex`, the base with
1557
1832
  * its colour transforms (`lumMod`/`shade`/…) applied (read that for the final
1558
1833
  * rendered colour).
1559
1834
  *
@@ -1564,7 +1839,7 @@ declare abstract class Shape {
1564
1839
  get resolvedFill(): ResolvedColor | null;
1565
1840
  /**
1566
1841
  * The shape's line/border solid fill resolved against the host's theme to a
1567
- * literal hex — the resolved counterpart of {@link lineColor}/{@link lineSchemeColor}.
1842
+ * literal hex: the resolved counterpart of {@link lineColor}/{@link lineSchemeColor}.
1568
1843
  * `null` when the shape has no `a:ln/a:solidFill` or it cannot be made literal.
1569
1844
  * Like {@link resolvedFill}, the result carries `effectiveHex` (the base colour
1570
1845
  * with its transforms applied) for the final rendered colour.
@@ -1591,8 +1866,12 @@ declare abstract class Shape {
1591
1866
  set text(value: string);
1592
1867
  /**
1593
1868
  * This shape's placeholder identity (`p:ph` `type`/`idx`), or `null` when it is
1594
- * not a placeholder. Only `p:sp` shapes can be placeholders, so the base
1595
- * implementation always returns `null`; {@link AutoShape} overrides it.
1869
+ * not a placeholder. `idx` defaults to `'0'` when the attribute is absent, as
1870
+ * PowerPoint does. A text placeholder is a `p:sp`; a filled picture, table or chart
1871
+ * placeholder is a `p:pic` or `p:graphicFrame` carrying the same `p:ph`, which is what
1872
+ * inserting a picture into a picture placeholder produces. This used to be `null` for
1873
+ * every shape but a `p:sp` (#111). Use {@link Slide.placeholder} to find a text
1874
+ * placeholder by type.
1596
1875
  */
1597
1876
  get placeholder(): PlaceholderRef | null;
1598
1877
  /**
@@ -1607,22 +1886,12 @@ declare abstract class Shape {
1607
1886
  /** Escape hatch: the underlying shape element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */
1608
1887
  get element_(): Element;
1609
1888
  }
1610
- //#endregion
1611
- //#region src/read/api/shapes/autoshape.d.ts
1612
1889
  /** An auto shape, text box, or placeholder (`p:sp`). The only kind that holds text. */
1613
1890
  declare class AutoShape extends Shape {
1614
1891
  readonly shapeType: 'autoShape';
1615
1892
  get hasTextFrame(): boolean;
1616
1893
  get textFrame(): TextFrame | null;
1617
- /**
1618
- * This shape's placeholder identity (`p:ph` `type`/`idx`), or `null` when it is
1619
- * not a placeholder. `idx` defaults to `'0'` when the attribute is absent, as
1620
- * PowerPoint does. Use {@link Slide.placeholder} to find a placeholder by type.
1621
- */
1622
- get placeholder(): PlaceholderRef | null;
1623
1894
  }
1624
- //#endregion
1625
- //#region src/read/api/shapes/picture.d.ts
1626
1895
  /** A picture (`p:pic`). */
1627
1896
  declare class Picture extends Shape {
1628
1897
  #private;
@@ -1649,7 +1918,7 @@ declare class Picture extends Shape {
1649
1918
  * Microsoft SVG blip extension (`a:blip/a:extLst/a:ext/asvg:svgBlip/@r:embed`),
1650
1919
  * or `null` when the picture has no SVG. PowerPoint usually pairs this with a
1651
1920
  * raster fallback in `a:blip/@r:embed` ({@link imageRelId}), but some exporters
1652
- * emit an SVG-only blip where `imageRelId` is absent and only this resolves —
1921
+ * emit an SVG-only blip where `imageRelId` is absent and only this resolves,
1653
1922
  * so a reader that wants the real drawn art must consult both.
1654
1923
  */
1655
1924
  get svgRelId(): string | null;
@@ -1657,19 +1926,19 @@ declare class Picture extends Shape {
1657
1926
  get svgPartName(): string | null;
1658
1927
  /**
1659
1928
  * Which drawable media this picture carries:
1660
- * - `'raster'` — only a raster blip (`a:blip/@r:embed`);
1661
- * - `'svg'` — only a vector blip (`asvg:svgBlip/@r:embed`, no raster). This
1929
+ * - `'raster'`: only a raster blip (`a:blip/@r:embed`);
1930
+ * - `'svg'`: only a vector blip (`asvg:svgBlip/@r:embed`, no raster). This
1662
1931
  * is what PowerPoint's *Insert → Icons* and a plain SVG insert produce;
1663
- * - `'both'` — a raster fallback *and* an SVG (PowerPoint's usual pairing);
1664
- * - `'none'` — a `p:pic` with no embedded blip at all (e.g. a linked image).
1932
+ * - `'both'`: a raster fallback *and* an SVG (PowerPoint's usual pairing);
1933
+ * - `'none'`: a `p:pic` with no embedded blip at all (e.g. a linked image).
1665
1934
  *
1666
- * Lets a caller distinguish an SVG-only picture — where {@link imagePartName}
1667
- * is legitimately `null` — from a genuinely empty one, without two null checks.
1935
+ * Lets a caller distinguish an SVG-only picture (where {@link imagePartName}
1936
+ * is legitimately `null`) from a genuinely empty one, without two null checks.
1668
1937
  */
1669
1938
  get mediaKind(): 'raster' | 'svg' | 'both' | 'none';
1670
1939
  /**
1671
1940
  * Absolute partname of whichever part actually carries this picture's drawn
1672
- * data — the raster part when present, otherwise the SVG part — or `null`
1941
+ * data (the raster part when present, otherwise the SVG part), or `null`
1673
1942
  * when the picture embeds neither. Use this when you just want "the bytes
1674
1943
  * this picture shows"; prefer {@link imagePartName} / {@link svgPartName}
1675
1944
  * (and {@link mediaKind}) when you need to know *which* kind it is. An
@@ -1677,9 +1946,14 @@ declare class Picture extends Shape {
1677
1946
  * `null`.
1678
1947
  */
1679
1948
  get mediaPartName(): string | null;
1949
+ /**
1950
+ * The audio or video this picture plays (`p:nvPr/a:audioFile` or `a:videoFile`), or `null` for a
1951
+ * still picture. Its blip ({@link imagePartName}) is then the poster frame. See {@link PictureMedia}.
1952
+ */
1953
+ get media(): PictureMedia | null;
1680
1954
  /**
1681
1955
  * The picture's crop as fractions of the *source image*, read from
1682
- * `p:blipFill/a:srcRect` — `{ left, top, right, bottom }`, each the amount
1956
+ * `p:blipFill/a:srcRect` as `{ left, top, right, bottom }`, each the amount
1683
1957
  * trimmed off that edge (so `0.1` = 10 % cropped away, an uncropped edge is
1684
1958
  * `0`). `null` when there is no `a:srcRect` at all; an explicit
1685
1959
  * `{0,0,0,0}` crop still reports zeros, since its presence is meaningful.
@@ -1693,13 +1967,20 @@ declare class Picture extends Shape {
1693
1967
  * `null` when the blip carries none. Recognises the effects a faithful reader
1694
1968
  * needs to reproduce a recoloured image: `a:duotone` (the two-stop icon-tint
1695
1969
  * trick), `a:clrChange`, `a:grayscl`, `a:biLevel`, and `a:alphaModFix`; the
1696
- * first such effect in document order wins. Colours mirror the
1970
+ * first such effect in document order wins, and {@link recolors} lists them all. Colours mirror the
1697
1971
  * {@link GradientStop} split (`color`/`schemeColor`/`presetColor`) so theme
1698
1972
  * tokens resolve through {@link Slide.themeContext}. `threshold`/`amount` are
1699
1973
  * 0–1 fractions. {@link hidden} (the duotone fallback-layer trick) reports the
1700
1974
  * *visibility* of a recolour source; this reports the *tint* itself.
1701
1975
  */
1702
1976
  get recolor(): Recolor | null;
1977
+ /**
1978
+ * Every blip effect {@link recolor} recognises, in document order: the first is
1979
+ * {@link recolor}. They combine (a picture can be faded with `a:alphaModFix` and
1980
+ * recoloured too, which is how the write API emits `transparency` beside a
1981
+ * recolour), and {@link recolor} alone reported only the first of them.
1982
+ */
1983
+ get recolors(): Recolor[];
1703
1984
  /**
1704
1985
  * Replace this picture's image with new bytes. Mints a fresh media part under
1705
1986
  * `/ppt/media/`, registers its content type, wires an `image` relationship
@@ -1714,7 +1995,7 @@ declare class Picture extends Shape {
1714
1995
  *
1715
1996
  * `fit` controls the picture's `a:srcRect` crop against its current frame
1716
1997
  * extent (`a:xfrm/a:ext`):
1717
- * - omitted (default): geometry and crop are left untouched — the caller owns
1998
+ * - omitted (default): geometry and crop are left untouched; the caller owns
1718
1999
  * sizing. Note an inherited `a:srcRect` was tuned to the *previous* image's
1719
2000
  * aspect ratio, so swapping in an image of a different ratio reuses a crop
1720
2001
  * that no longer fits and the result looks stretched; pass `fit` to refit.
@@ -1732,8 +2013,6 @@ declare class Picture extends Shape {
1732
2013
  fit?: 'cover' | 'contain' | 'stretch';
1733
2014
  }): void;
1734
2015
  }
1735
- //#endregion
1736
- //#region src/read/api/shapes/connector.d.ts
1737
2016
  /** A connector / line (`p:cxnSp`). */
1738
2017
  declare class Connector extends Shape {
1739
2018
  #private;
@@ -1751,8 +2030,6 @@ declare class Connector extends Shape {
1751
2030
  */
1752
2031
  get endConnection(): ConnectionSite | null;
1753
2032
  }
1754
- //#endregion
1755
- //#region src/read/api/chart.d.ts
1756
2033
  /** A chart axis number format (`c:numFmt`). */
1757
2034
  interface AxisNumberFormat {
1758
2035
  /** The format mask (`@formatCode`), e.g. `"General"`, `"0.0%"`. */
@@ -1766,6 +2043,36 @@ interface ChartLegend {
1766
2043
  position: string | null;
1767
2044
  /** Whether the legend overlays the plot area (`c:overlay/@val`). */
1768
2045
  overlay: boolean | null;
2046
+ /** The legend text's formatting (`c:txPr`), or `null` when it states none. */
2047
+ textStyle: ChartTextStyle | null;
2048
+ /** The legend's manual layout, or `null` when it is placed automatically. */
2049
+ layout: ChartManualLayout | null;
2050
+ }
2051
+ /**
2052
+ * The formatting of a block of chart text: a `c:txPr` (a legend's, an axis' labels', data labels')
2053
+ * or a title's `c:rich`. Read off the block's `a:bodyPr` and its first paragraph: the paragraph's
2054
+ * `a:pPr` and `a:defRPr`, and in a title, the first run's `a:rPr` over them. Every field is `null`
2055
+ * where the block states nothing.
2056
+ */
2057
+ interface ChartTextStyle {
2058
+ /** Size in points (`@sz`). */
2059
+ sizePt: number | null;
2060
+ /** Bold (`@b`). */
2061
+ bold: boolean | null;
2062
+ /** Italic (`@i`). */
2063
+ italic: boolean | null;
2064
+ /** Underline style (`@u`, e.g. `sng`, `none`). */
2065
+ underline: string | null;
2066
+ /** The solid colour, unresolved: a chart part is read without a theme. */
2067
+ color: ColorRef | null;
2068
+ /** Whether {@link color} carries a transform (`a:lumMod`, …) that only a theme can apply. */
2069
+ colorTransformed: boolean;
2070
+ /** The Latin typeface (`a:latin/@typeface`), a theme token such as `+mn-lt` included. */
2071
+ fontName: string | null;
2072
+ /** Rotation in degrees (`a:bodyPr/@rot` / 60000), or `null` when unstated or outside -90 to 90. */
2073
+ rotationDeg: number | null;
2074
+ /** Paragraph alignment (`a:pPr/@algn`: `l`, `ctr`, `r`, …). */
2075
+ align: string | null;
1769
2076
  }
1770
2077
  /** Data-label settings (`c:dLbls`), read from a plot group or from one series. */
1771
2078
  interface ChartDataLabels {
@@ -1787,6 +2094,74 @@ interface ChartDataLabels {
1787
2094
  position: string | null;
1788
2095
  /** Label number format (`c:numFmt`), or `null` when absent. */
1789
2096
  numberFormat: AxisNumberFormat | null;
2097
+ /** The labels' text formatting (`c:txPr`), or `null` when the block states none. */
2098
+ textStyle: ChartTextStyle | null;
2099
+ /** The labels' background fill (`c:spPr`), or `null` when it states none. */
2100
+ fill: ChartFill | null;
2101
+ /** The leader lines' stroke (`c:leaderLines/c:spPr/a:ln`), or `null` when they state none. */
2102
+ leaderLines: ChartLine | null;
2103
+ }
2104
+ /** One stretch of a data label's own text: a run, or a field PowerPoint fills in (`a:fld`). */
2105
+ interface ChartLabelRun {
2106
+ /** The text, which for a field is what it showed when the chart was saved. */
2107
+ text: string;
2108
+ /** The field type (`a:fld/@type`: `XVALUE`, `YVALUE`, `CELLRANGE`, …), or `null` for a plain run. */
2109
+ field: string | null;
2110
+ }
2111
+ /** A data label that states its own text (`c:dLbl` with `c:tx/c:rich`), as a scatter's custom labels do. */
2112
+ interface ChartPointLabel {
2113
+ /** The index of the point it labels (`c:idx`). */
2114
+ index: number;
2115
+ /** Its runs and fields, in order, across its paragraphs. */
2116
+ runs: ChartLabelRun[];
2117
+ }
2118
+ /** The 3-D view of a chart (`c:chart/c:view3D`). Every field is `null` when the element leaves it unstated. */
2119
+ interface ChartView3D {
2120
+ /** Tilt in degrees (`c:rotX`), -90 to 90. */
2121
+ rotX: number | null;
2122
+ /** Turn in degrees (`c:rotY`), 0 to 360. */
2123
+ rotY: number | null;
2124
+ /** Field of view (`c:perspective`), 0 to 240, twice the angle in degrees. */
2125
+ perspective: number | null;
2126
+ /** Whether the axes stay at right angles (`c:rAngAx`), which turns perspective off. */
2127
+ rightAngleAxes: boolean | null;
2128
+ }
2129
+ /** A series' data-point marker (`c:ser/c:marker`). */
2130
+ interface ChartMarker {
2131
+ /** The marker shape (`c:symbol`, `ST_MarkerStyle`: `circle`, `diamond`, `none`, …), or `null` when unstated. */
2132
+ symbol: string | null;
2133
+ /** The marker size in points (`c:size`), 2 to 72, or `null` when unstated. */
2134
+ size: number | null;
2135
+ /** The marker's solid fill, as {@link ChartSeries.fill} reads a series'. */
2136
+ fill: ChartFill | null;
2137
+ /** The marker's outline, as {@link ChartSeries.line} reads a series'. */
2138
+ line: ChartLine | null;
2139
+ }
2140
+ /** One data point a series formats on its own (`c:ser/c:dPt`). */
2141
+ interface ChartDataPoint {
2142
+ /** The point's index in the series (`c:idx`). */
2143
+ index: number;
2144
+ /** Whether a negative bar at this point paints inverted (`c:invertIfNegative`), or `null` when unstated. */
2145
+ invertIfNegative: boolean | null;
2146
+ /** The point's solid fill, as {@link ChartSeries.fill} reads a series'. */
2147
+ fill: ChartFill | null;
2148
+ /** The point's pattern fill (`a:pattFill`), or `null`. */
2149
+ patternFill: PatternFill | null;
2150
+ /** The point's outline, as {@link ChartSeries.line} reads a series'. */
2151
+ line: ChartLine | null;
2152
+ }
2153
+ /** A chart's data table (`c:plotArea/c:dTable`), the grid of values drawn under the plot. */
2154
+ interface ChartDataTable {
2155
+ /** Horizontal cell borders (`c:showHorzBorder`), or `null` when unstated. */
2156
+ showHorizontalBorder: boolean | null;
2157
+ /** Vertical cell borders (`c:showVertBorder`), or `null` when unstated. */
2158
+ showVerticalBorder: boolean | null;
2159
+ /** The outline around the table (`c:showOutline`), or `null` when unstated. */
2160
+ showOutline: boolean | null;
2161
+ /** The legend keys beside each series' row (`c:showKeys`), or `null` when unstated. */
2162
+ showKeys: boolean | null;
2163
+ /** The table text's size in points (`c:txPr`'s first `a:defRPr/@sz`), or `null` when unstated. */
2164
+ fontSizePt: number | null;
1790
2165
  }
1791
2166
  /** A series' solid fill (`c:ser/c:spPr`). */
1792
2167
  interface ChartFill {
@@ -1797,6 +2172,54 @@ interface ChartFill {
1797
2172
  colorRef: ColorRef;
1798
2173
  /** Whether the fill is explicitly suppressed (`a:noFill`). */
1799
2174
  noFill: boolean;
2175
+ /** The opacity of the solid colour, 0 to 1 (its `a:alpha`), or `null` when it states none. */
2176
+ alpha: number | null;
2177
+ }
2178
+ /**
2179
+ * A manual layout (`c:layout/c:manualLayout`): where an element sits, as fractions of the chart.
2180
+ * Every field is `null` where the layout leaves it automatic.
2181
+ */
2182
+ interface ChartManualLayout {
2183
+ /** What the box bounds (`c:layoutTarget`): `inner` (the plot alone) or `outer` (with its labels). */
2184
+ target: string | null;
2185
+ /** How `x` reads (`c:xMode`): `edge` (from the chart's left edge) or `factor` (an offset). */
2186
+ xMode: string | null;
2187
+ /** How `y` reads (`c:yMode`). */
2188
+ yMode: string | null;
2189
+ x: number | null;
2190
+ y: number | null;
2191
+ w: number | null;
2192
+ h: number | null;
2193
+ }
2194
+ /**
2195
+ * The fill, border and manual layout of a chart surface: the chart area (`c:chartSpace/c:spPr`) or
2196
+ * the plot area (`c:plotArea`). The fill accessors are the ones a slide shape has, read the same way.
2197
+ */
2198
+ interface ChartAreaFormat {
2199
+ /** Whether the area is explicitly unfilled (`a:noFill`). */
2200
+ fillNoFill: boolean;
2201
+ /**
2202
+ * Whether the area states a fill of its own: any fill choice, `a:noFill` included. `false` when
2203
+ * it states none and inherits its fill from the chart style.
2204
+ */
2205
+ hasOwnFill: boolean;
2206
+ /** A literal solid fill colour (`a:srgbClr`), or `null`. */
2207
+ fillColor: string | null;
2208
+ /** A theme solid fill colour (`a:schemeClr`), or `null`. */
2209
+ fillSchemeColor: string | null;
2210
+ /**
2211
+ * The solid fill resolved without a theme: a literal colour with its transforms applied, its
2212
+ * `alpha` included; `null` for a scheme colour or a non-solid fill.
2213
+ */
2214
+ resolvedFill: ResolvedColor | null;
2215
+ gradientFill: GradientFill | null;
2216
+ patternFill: PatternFill | null;
2217
+ /** A picture fill (`a:blipFill`), its image resolved through the chart part's relationships. */
2218
+ pictureFill: PictureFill | null;
2219
+ /** The area's border (`a:ln`), or `null` when it states none. */
2220
+ border: ChartLine | null;
2221
+ /** The area's manual layout; always `null` for the chart area, which fills the frame. */
2222
+ layout: ChartManualLayout | null;
1800
2223
  }
1801
2224
  /** A series' line/stroke (`c:ser/c:spPr/a:ln`). */
1802
2225
  interface ChartLine {
@@ -1808,15 +2231,46 @@ interface ChartLine {
1808
2231
  colorRef: ColorRef;
1809
2232
  /** Whether the line is explicitly suppressed (`a:noFill`). */
1810
2233
  noFill: boolean;
2234
+ /** The line end cap (`@cap`) as its raw token (`flat`, `rnd`, `sq`), or `null` when unset. */
2235
+ cap: string | null;
2236
+ /** The opacity of the stroke's colour, 0 to 1 (its `a:alpha`), or `null` when it states none. */
2237
+ alpha: number | null;
2238
+ /**
2239
+ * Whether the stroke's colour carries a transform besides `a:alpha` (`a:lumMod`, `a:shade`, …).
2240
+ * A chart part is read without a theme, so {@link colorRef} does not apply it: PowerPoint's
2241
+ * default axis line, `tx1` lightened to a grey, reads as the bare `tx1` token.
2242
+ */
2243
+ colorTransformed: boolean;
2244
+ }
2245
+ /** The display units of a value axis (`c:dispUnits`). */
2246
+ interface ChartDisplayUnits {
2247
+ /** A built-in unit (`c:builtInUnit`: `hundreds`, `thousands`, …, `trillions`), or `null`. */
2248
+ builtIn: string | null;
2249
+ /** A custom divisor (`c:custUnit`), or `null`. */
2250
+ custom: number | null;
2251
+ /** Whether the unit is labelled on the axis (`c:dispUnitsLbl`). */
2252
+ showLabel: boolean;
1811
2253
  }
1812
2254
  /** A chart graphic-frame's chart, backed by its chart part. */
1813
2255
  declare class Chart {
1814
2256
  #private;
1815
2257
  /** The chart's OPC part (`/ppt/charts/chartN.xml`). */
1816
2258
  readonly part: Part;
2259
+ /** The chart part's relationships, which resolve a picture fill's image; `null` leaves it unresolved. */
2260
+ private readonly rels;
1817
2261
  constructor(
1818
2262
  /** The chart's OPC part (`/ppt/charts/chartN.xml`). */
1819
- part: Part);
2263
+ part: Part,
2264
+ /** The chart part's relationships, which resolve a picture fill's image; `null` leaves it unresolved. */
2265
+ rels?: Relationships | null);
2266
+ /** The chart area's fill and border (`c:chartSpace/c:spPr`), or `null` when it states none. */
2267
+ get chartArea(): ChartAreaFormat | null;
2268
+ /** Whether the chart area's corners are rounded (`c:roundedCorners`), or `null` when unstated. */
2269
+ get roundedCorners(): boolean | null;
2270
+ /** The plot area's fill, border and manual layout, or `null` when the chart has no plot area. */
2271
+ get plotArea(): ChartAreaFormat | null;
2272
+ /** The title's manual layout (`c:title/c:layout`), or `null` when it is placed automatically. */
2273
+ get titleLayout(): ChartManualLayout | null;
1820
2274
  /** Partname of the chart part. */
1821
2275
  get partName(): string;
1822
2276
  /**
@@ -1840,6 +2294,13 @@ declare class Chart {
1840
2294
  get valueAxis(): ChartAxis | null;
1841
2295
  /** The legend (`c:chart/c:legend`) position + overlay, or `null` when hidden. */
1842
2296
  get legend(): ChartLegend | null;
2297
+ /** The chart title's formatting (`c:title/c:tx/c:rich`), or `null` when the chart has no rich title. */
2298
+ get titleStyle(): ChartTextStyle | null;
2299
+ /**
2300
+ * The language the chart's text is tagged with: `c:lang`, which PowerPoint writes, else the first
2301
+ * paragraph end's `@lang` in the part, where `addChart` writes its `lang`. `null` when neither says.
2302
+ */
2303
+ get language(): string | null;
1843
2304
  /**
1844
2305
  * The chart-level data-label settings, read from the first plot group's
1845
2306
  * aggregate `c:dLbls` (the group-wide block after the series). `null` when the
@@ -1851,6 +2312,23 @@ declare class Chart {
1851
2312
  * {@link ChartSeries.dataLabels}.
1852
2313
  */
1853
2314
  get dataLabels(): ChartDataLabels | null;
2315
+ /** The data table under the plot (`c:plotArea/c:dTable`), or `null` when the chart draws none. */
2316
+ get dataTable(): ChartDataTable | null;
2317
+ /**
2318
+ * The key/value annotations `addChart`'s `metadata` option writes: the pptx-ts extension on
2319
+ * `c:chartSpace/c:extLst` (uri `{094A432E-1F6C-499B-95B8-B57DC9536949}`). `null` when the chart
2320
+ * carries no such extension; an extension with no item reads as an empty map.
2321
+ */
2322
+ get metadata(): Record<string, string> | null;
2323
+ /**
2324
+ * The plot groups (`c:barChart`, `c:lineChart`, …) of the plot area, in document order, each
2325
+ * with what it sets on all its series and the series it plots. A combo chart has several.
2326
+ */
2327
+ get plotGroups(): ChartPlotGroup[];
2328
+ /** The 3-D view (`c:chart/c:view3D`), or `null` when the chart states none. */
2329
+ get view3D(): ChartView3D | null;
2330
+ /** How blank cells plot (`c:chart/c:dispBlanksAs`): `gap`, `zero` or `span`, or `null` when unstated. */
2331
+ get displayBlanksAs(): string | null;
1854
2332
  /** The data series (`c:ser`) across all chart groups, in document order. */
1855
2333
  get series(): ChartSeries[];
1856
2334
  /**
@@ -1865,6 +2343,60 @@ declare class Chart {
1865
2343
  /** Mark the chart part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
1866
2344
  markDirty(): void;
1867
2345
  }
2346
+ /**
2347
+ * One plot group of a chart's plot area (`c:barChart`, `c:lineChart`, `c:pieChart`, …): the series
2348
+ * it plots and what it sets on all of them. Each accessor reads `null` (or `false` for an element
2349
+ * that is either there or not) where the group does not state it, including on a plot type whose
2350
+ * schema has no such element.
2351
+ */
2352
+ declare class ChartPlotGroup {
2353
+ #private;
2354
+ private readonly group;
2355
+ /** The owning chart's OPC part, so {@link markDirty} can reach it from {@link element_}. */
2356
+ private readonly part;
2357
+ constructor(group: Element,
2358
+ /** The owning chart's OPC part, so {@link markDirty} can reach it from {@link element_}. */
2359
+ part: Part);
2360
+ /** The plot type, the element's local name less `Chart`: `bar`, `line`, `bar3D`, `doughnut`, … */
2361
+ get type(): string;
2362
+ /** The series this group plots (`c:ser`), in document order. */
2363
+ get series(): ChartSeries[];
2364
+ /**
2365
+ * The ids of the axes this group plots against (`c:axId`), as {@link ChartAxis.id} reads them: a
2366
+ * combo's group on the secondary axes names the secondary pair. Empty for a pie or a doughnut.
2367
+ */
2368
+ get axisIds(): number[];
2369
+ /** A bar group's direction (`c:barDir`): `bar` (horizontal) or `col` (vertical). */
2370
+ get barDirection(): string | null;
2371
+ /** How the series stack (`c:grouping`): `clustered`, `stacked`, `percentStacked` or `standard`. */
2372
+ get grouping(): string | null;
2373
+ /** The gap between bar clusters as a percentage of a bar's width (`c:gapWidth`). */
2374
+ get gapWidthPct(): number | null;
2375
+ /** How far bars in a cluster overlap, -100 to 100 percent (`c:overlap`). */
2376
+ get overlapPct(): number | null;
2377
+ /** Whether stacked bars are joined by series lines (`c:serLines`). */
2378
+ get seriesLines(): boolean;
2379
+ /** The series lines' stroke (`c:serLines/c:spPr/a:ln`), or `null` when they state none. */
2380
+ get seriesLinesLine(): ChartLine | null;
2381
+ /** The depth gap of a 3-D bar group, as a percentage (`c:gapDepth`). */
2382
+ get gapDepthPct(): number | null;
2383
+ /** The group-wide 3-D bar shape (`c:shape`); a series can state its own ({@link ChartSeries.shape}). */
2384
+ get shape(): string | null;
2385
+ /** The angle of a pie's first slice, 0 to 360 degrees (`c:firstSliceAng`). */
2386
+ get firstSliceAngle(): number | null;
2387
+ /** A doughnut's hole, 10 to 90 percent of its size (`c:holeSize`). */
2388
+ get holeSizePct(): number | null;
2389
+ /** A radar's style (`c:radarStyle`): `standard`, `marker` or `filled`. */
2390
+ get radarStyle(): string | null;
2391
+ /** Whether a surface is drawn as a wireframe (`c:wireframe`). */
2392
+ get wireframe(): boolean | null;
2393
+ /** Whether a line or stock group draws up/down bars (`c:upDownBars`). */
2394
+ get upDownBars(): boolean;
2395
+ /** Escape hatch: the underlying plot-group element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */
2396
+ get element_(): Element;
2397
+ /** Mark the owning chart part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
2398
+ markDirty(): void;
2399
+ }
1868
2400
  /**
1869
2401
  * One axis (`c:catAx`/`c:valAx`/`c:dateAx`/`c:serAx`) of a chart's plot area.
1870
2402
  * All four share the scaling/delete/position/tickmark structure; `kind`
@@ -1912,6 +2444,32 @@ declare class ChartAxis {
1912
2444
  get majorUnit(): number | null;
1913
2445
  /** Minor unit (`c:minorUnit/@val`), or `null` when auto. */
1914
2446
  get minorUnit(): number | null;
2447
+ /** The tick labels' text formatting and rotation (`c:txPr`), or `null` when the axis states none. */
2448
+ get labelStyle(): ChartTextStyle | null;
2449
+ /** The axis title's formatting (`c:title/c:tx/c:rich`), or `null` when it has no rich title. */
2450
+ get titleStyle(): ChartTextStyle | null;
2451
+ /** Where this axis crosses the other one, as a value on it (`c:crossesAt`), or `null`. */
2452
+ get crossesAt(): number | null;
2453
+ /** Where this axis crosses the other one, as a rule (`c:crosses`: `autoZero`, `max`, `min`), or `null`. */
2454
+ get crosses(): string | null;
2455
+ /** Whether a value axis crosses between categories or on them (`c:crossBetween`: `between`, `midCat`). */
2456
+ get crossBetween(): string | null;
2457
+ /** A value axis' display units (`c:dispUnits`), or `null` when it shows plain values. */
2458
+ get displayUnits(): ChartDisplayUnits | null;
2459
+ /** How many categories pass between two labels (`c:tickLblSkip`), or `null` when automatic. */
2460
+ get labelSkip(): number | null;
2461
+ /** Whether a category axis flattens a multi-level category list (`c:noMultiLvlLbl`), or `null` when unstated. */
2462
+ get noMultiLevelLabels(): boolean | null;
2463
+ /** A date axis' base unit (`c:baseTimeUnit`: `days`, `months`, `years`), or `null`. */
2464
+ get baseTimeUnit(): string | null;
2465
+ /** A date axis' major unit scale (`c:majorTimeUnit`), or `null`. */
2466
+ get majorTimeUnit(): string | null;
2467
+ /** A date axis' minor unit scale (`c:minorTimeUnit`), or `null`. */
2468
+ get minorTimeUnit(): string | null;
2469
+ /** The axis line's own stroke (`c:spPr/a:ln`), or `null` when it states none. */
2470
+ get line(): ChartLine | null;
2471
+ /** The major gridlines' stroke (`c:majorGridlines/c:spPr/a:ln`), or `null` when they state none. */
2472
+ get majorGridlinesLine(): ChartLine | null;
1915
2473
  /** Escape hatch: the underlying axis element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */
1916
2474
  get element_(): Element;
1917
2475
  /** Mark the owning chart part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
@@ -1932,7 +2490,7 @@ declare class ChartSeries {
1932
2490
  */
1933
2491
  get fill(): ChartFill | null;
1934
2492
  /**
1935
- * Series line/stroke (`c:spPr/a:ln`) — width, dash, colour. `null` when the
2493
+ * Series line/stroke (`c:spPr/a:ln`): width, dash, colour. `null` when the
1936
2494
  * series `c:spPr` has no `a:ln` (bar/area fills carry no line by default).
1937
2495
  */
1938
2496
  get line(): ChartLine | null;
@@ -1963,6 +2521,12 @@ declare class ChartSeries {
1963
2521
  get xLabels(): (string | null)[] | null;
1964
2522
  /** Cached Y values of a scatter or bubble series (`c:yVal`); non-numeric or missing points are `null`. */
1965
2523
  get yValues(): (number | null)[];
2524
+ /**
2525
+ * The number format the series' values are cached in (`c:numCache/c:formatCode` under `c:val`, or
2526
+ * under `c:yVal` on a scatter or bubble series), or `null` when the cache states none. PowerPoint
2527
+ * paints a source-linked data label and a data table in it.
2528
+ */
2529
+ get valueFormatCode(): string | null;
1966
2530
  /** Cached bubble sizes of a bubble series (`c:bubbleSize`); non-numeric or missing points are `null`. */
1967
2531
  get bubbleSizes(): (number | null)[];
1968
2532
  /**
@@ -1983,14 +2547,38 @@ declare class ChartSeries {
1983
2547
  * none. This is where a pie's labels are: see {@link Chart.dataLabels}.
1984
2548
  */
1985
2549
  get dataLabels(): ChartDataLabels | null;
2550
+ /**
2551
+ * The series' labels that state their own text (`c:ser/c:dLbls/c:dLbl` with `c:tx/c:rich`), in
2552
+ * document order. A label that only formats or deletes its point has no text and is left out.
2553
+ */
2554
+ get customLabels(): ChartPointLabel[];
2555
+ /** The series' gradient fill (`c:spPr/a:gradFill`), or `null`. */
2556
+ get gradientFill(): GradientFill | null;
2557
+ /** The series' pattern fill (`c:spPr/a:pattFill`), or `null`. */
2558
+ get patternFill(): PatternFill | null;
2559
+ /** The series' outer shadow (`c:spPr/a:effectLst/a:outerShdw`), or `null`. */
2560
+ get shadow(): OuterShadow | null;
2561
+ /** The series' inner shadow (`c:spPr/a:effectLst/a:innerShdw`), or `null`. */
2562
+ get innerShadow(): InnerShadow | null;
2563
+ /** Whether a line or scatter series is smoothed (`c:smooth`), or `null` when unstated. */
2564
+ get smooth(): boolean | null;
2565
+ /** The series' data-point marker (`c:marker`), or `null` when it states none. */
2566
+ get marker(): ChartMarker | null;
2567
+ /**
2568
+ * The points this series formats on its own (`c:dPt`), in document order: a bar's per-point
2569
+ * colours, a pie's slice colours. A `c:dPt` with no `c:idx` is left out.
2570
+ */
2571
+ get dataPoints(): ChartDataPoint[];
2572
+ /** Whether a bar series paints a negative bar inverted (`c:invertIfNegative`), or `null` when unstated. */
2573
+ get invertIfNegative(): boolean | null;
2574
+ /** A 3-D bar series' own shape (`c:shape`: `box`, `cylinder`, `cone`, …), or `null` when unstated. */
2575
+ get shape(): string | null;
1986
2576
  /** Escape hatch: the underlying `c:ser` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */
1987
2577
  get element_(): Element;
1988
2578
  /** Mark the owning chart part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
1989
2579
  markDirty(): void;
1990
2580
  }
1991
- //#endregion
1992
- //#region src/read/api/chartex.d.ts
1993
- /** A chartEx legend (`cx:legend`) — a leaf element carrying position/alignment attributes. */
2581
+ /** A chartEx legend (`cx:legend`): a leaf element carrying position/alignment attributes. */
1994
2582
  interface ChartExLegend {
1995
2583
  /** Legend position (`@pos`): `t`/`b`/`l`/`r`. */
1996
2584
  position: string | null;
@@ -2021,7 +2609,7 @@ declare class ChartEx {
2021
2609
  /** Partname of the chartEx chart part. */
2022
2610
  get partName(): string;
2023
2611
  /**
2024
- * The `cx:series/@layoutId` tokens in plot-area document order — the raw chartEx
2612
+ * The `cx:series/@layoutId` tokens in plot-area document order: the raw chartEx
2025
2613
  * layout names (`waterfall`, `funnel`, `treemap`, `sunburst`, `boxWhisker`,
2026
2614
  * `regionMap`, or `clusteredColumn`/`paretoLine` for histogram & pareto). This is
2027
2615
  * the OOXML truth: a histogram and a pareto both surface as `clusteredColumn`, so
@@ -2074,7 +2662,7 @@ declare class ChartExSeries {
2074
2662
  /** Cached numeric values (`cx:numDim`); non-numeric or missing points are `null`. */
2075
2663
  get values(): (number | null)[];
2076
2664
  /**
2077
- * Cached category labels (`cx:strDim`'s leaf `cx:lvl` — the first level, which
2665
+ * Cached category labels (`cx:strDim`'s leaf `cx:lvl`, the first level, which
2078
2666
  * the writer emits leaf-first). Empty when the data block carries no `cx:strDim`.
2079
2667
  */
2080
2668
  get categories(): (string | null)[];
@@ -2119,27 +2707,25 @@ declare class ChartExAxis {
2119
2707
  /** Mark the owning chartEx part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
2120
2708
  markDirty(): void;
2121
2709
  }
2122
- //#endregion
2123
- //#region src/read/api/diagram.d.ts
2124
2710
  /**
2125
- * `ST_PtType` — what a `dgm:pt` is.
2711
+ * `ST_PtType`: what a `dgm:pt` is.
2126
2712
  *
2127
- * - `node` — a user-authored node, and the default when `@type` is absent.
2128
- * - `asst` — an assistant node (an org chart's off-branch box); user content too.
2129
- * - `doc` — the data model's single root; carries the layout/style/colour preset ids.
2130
- * - `pres` — generated by the layout engine to position a node; never user content.
2131
- * - `parTrans` / `sibTrans` — the two transition points of an edge, which a few layouts
2713
+ * - `node`: a user-authored node, and the default when `@type` is absent.
2714
+ * - `asst`: an assistant node (an org chart's off-branch box); user content too.
2715
+ * - `doc`: the data model's single root; carries the layout/style/colour preset ids.
2716
+ * - `pres`: generated by the layout engine to position a node; never user content.
2717
+ * - `parTrans` / `sibTrans`: the two transition points of an edge, which a few layouts
2132
2718
  * (arrow processes, org-chart branches) let the user type a label into.
2133
2719
  */
2134
2720
  type DiagramPointType = 'node' | 'asst' | 'doc' | 'pres' | 'parTrans' | 'sibTrans';
2135
2721
  /**
2136
- * `ST_CxnType` — what a `dgm:cxn` asserts. `parOf` (the default) is the parent/child edge of
2722
+ * `ST_CxnType`: what a `dgm:cxn` asserts. `parOf` (the default) is the parent/child edge of
2137
2723
  * the user's tree; `presOf` and `presParOf` bind a node to the generated `pres` point that
2138
2724
  * draws it, and are the layout engine's bookkeeping rather than structure.
2139
2725
  */
2140
2726
  type DiagramConnectionType = 'parOf' | 'presOf' | 'presParOf' | 'unknownRelationship';
2141
2727
  /**
2142
- * One edge of a diagram's data model (`dgm:cxn`) — an attribute-only element, so it reads as
2728
+ * One edge of a diagram's data model (`dgm:cxn`): an attribute-only element, so it reads as
2143
2729
  * plain data rather than as a proxy.
2144
2730
  *
2145
2731
  * The ids are `ST_ModelId` GUIDs matching a {@link DiagramPoint.modelId}. `parOf` edges are
@@ -2151,9 +2737,9 @@ interface DiagramConnection {
2151
2737
  modelId: string | null;
2152
2738
  /** What the edge asserts (`@type`); `parOf` when absent, its schema default. */
2153
2739
  type: DiagramConnectionType;
2154
- /** The `@srcId` end — the parent, for a `parOf` edge. */
2740
+ /** The `@srcId` end: the parent, for a `parOf` edge. */
2155
2741
  sourceId: string | null;
2156
- /** The `@destId` end — the child, for a `parOf` edge. */
2742
+ /** The `@destId` end: the child, for a `parOf` edge. */
2157
2743
  destinationId: string | null;
2158
2744
  /** The child's index among its siblings (`@srcOrd`). */
2159
2745
  sourceOrder: number | null;
@@ -2167,14 +2753,14 @@ interface DiagramConnection {
2167
2753
  presentationId: string | null;
2168
2754
  }
2169
2755
  /**
2170
- * Where a point's text is drawn in the fallback drawing part — the second copy of every
2756
+ * Where a point's text is drawn in the fallback drawing part: the second copy of every
2171
2757
  * string a diagram carries, and the only one a renderer without a SmartArt layout engine
2172
2758
  * paints. See {@link DiagramPoint.drawnShape} for how a point reaches it.
2173
2759
  */
2174
2760
  interface DiagramDrawnShape {
2175
2761
  /** The drawing part (`/ppt/diagrams/drawing{N}.xml`) the shape lives in. */
2176
2762
  readonly part: Part;
2177
- /** The `pres` point this shape draws (`dsp:sp/@modelId`) — never the authored point's own id. */
2763
+ /** The `pres` point this shape draws (`dsp:sp/@modelId`), never the authored point's own id. */
2178
2764
  readonly modelId: string;
2179
2765
  /** Which paragraph of {@link textFrame} carries this point's text (the `presOf` edge's `@destOrd`). */
2180
2766
  readonly paragraphIndex: number;
@@ -2182,7 +2768,7 @@ interface DiagramDrawnShape {
2182
2768
  * The shape's `dsp:txBody`, bound to the **drawing** part rather than the data part, so
2183
2769
  * an edit made through it marks the part that actually changed.
2184
2770
  *
2185
- * One shape commonly draws several points — three of them in `mixed.pptx` — so writing
2771
+ * One shape commonly draws several points (three of them in `mixed.pptx`), so writing
2186
2772
  * `textFrame.text` here would delete the siblings' text. Replace paragraph
2187
2773
  * {@link paragraphIndex} instead, which is what {@link DiagramPoint.text}'s setter does.
2188
2774
  */
@@ -2194,7 +2780,7 @@ interface DiagramDrawnShape {
2194
2780
  * The node → drawn-shape index of one diagram: the `presOf` edges of the data model and the
2195
2781
  * `dsp:sp` elements of the drawing part, both keyed for lookup.
2196
2782
  *
2197
- * Built once per {@link Diagram}, and only when a point is actually asked what draws it — the
2783
+ * Built once per {@link Diagram}, and only when a point is actually asked what draws it. The
2198
2784
  * drawing part is a second XML DOM and a consumer reading node text should not pay to parse
2199
2785
  * it. The consequence of that memo: a consumer who *adds* or *removes* shapes in the drawing
2200
2786
  * part through the escape hatches must re-reach the diagram to see them here.
@@ -2222,8 +2808,8 @@ declare class DrawingIndex {
2222
2808
  * Resolve one authored point to the `pres` point that presents it and to the drawn
2223
2809
  * paragraph carrying its text.
2224
2810
  *
2225
- * A point commonly has **several** `presOf` arms — an org-chart node's box and the
2226
- * connector beneath it are two presentations of one node — so the arm is chosen by what it
2811
+ * A point commonly has **several** `presOf` arms (an org-chart node's box and the
2812
+ * connector beneath it are two presentations of one node), so the arm is chosen by what it
2227
2813
  * reaches rather than by its `@srcOrd`: the first, in `@srcOrd` order, whose `pres` point
2228
2814
  * draws a `dsp:sp` that has a `dsp:txBody`. That selector produced a unique hit for all 90
2229
2815
  * authored points measured across five layout families, and it degrades to "no arm" rather
@@ -2259,7 +2845,7 @@ declare class DiagramPoint {
2259
2845
  */
2260
2846
  get connectionId(): string | null;
2261
2847
  /**
2262
- * Whether this point is an unfilled prompt (`dgm:prSet/@phldr`) — a node PowerPoint draws
2848
+ * Whether this point is an unfilled prompt (`dgm:prSet/@phldr`): a node PowerPoint draws
2263
2849
  * with a grey placeholder string and treats as empty. Excluded from {@link Diagram.text}:
2264
2850
  * a layout that stores its prompt in `dgm:t` would otherwise extract as content.
2265
2851
  */
@@ -2272,14 +2858,14 @@ declare class DiagramPoint {
2272
2858
  * `resolved*` getters all apply.
2273
2859
  *
2274
2860
  * **Writing through this edits the data model only**, and leaves the drawing cache
2275
- * holding the old string — which is what PowerPoint-less renderers draw. It is the escape
2861
+ * holding the old string, which is what PowerPoint-less renderers draw. It is the escape
2276
2862
  * hatch for run-level formatting, so it does exactly what it is told and nothing more;
2277
2863
  * {@link text}'s setter is the path that mirrors.
2278
2864
  */
2279
2865
  get textFrame(): TextFrame | null;
2280
2866
  /**
2281
2867
  * The generated `pres` point that presents this one (`dgm:cxn[@type="presOf"]/@destId`),
2282
- * or `null` when nothing presents it — the normal state of an unlabelled transition point.
2868
+ * or `null` when nothing presents it (the normal state of an unlabelled transition point).
2283
2869
  *
2284
2870
  * Where a point has several `presOf` arms the one named here is the arm that draws text;
2285
2871
  * see {@link drawnShape}, which resolves both.
@@ -2291,7 +2877,7 @@ declare class DiagramPoint {
2291
2877
  *
2292
2878
  * The mapping runs through the `pres` point rather than directly: a `dsp:sp/@modelId` is
2293
2879
  * always a `pres` point's id, so a lookup keyed on the authored point's own id finds
2294
- * nothing at all. It is many-to-one in both directions — one shape draws several points
2880
+ * nothing at all. It is many-to-one in both directions: one shape draws several points
2295
2881
  * (`@destOrd` says which paragraph is whose, and it can contradict document order), and
2296
2882
  * one point has several presentations, of which at most one holds text.
2297
2883
  *
@@ -2321,7 +2907,7 @@ declare class DiagramPoint {
2321
2907
  * Two things it deliberately does not do. It does **not** recompute geometry: the drawn
2322
2908
  * shape keeps its cached position and size, so a much longer string overflows its box in
2323
2909
  * those same renderers until PowerPoint re-lays the diagram out. And it does not *create*
2324
- * a place to draw text — a transition point whose layout has no label slot has no
2910
+ * a place to draw text. A transition point whose layout has no label slot has no
2325
2911
  * `dsp:sp`, and PowerPoint strips text put on one, so the honest outcome is the
2326
2912
  * diagnostic. Like every other `text` setter here it collapses the point to one run,
2327
2913
  * keeping the first run's `a:rPr`; use {@link textFrame} for run-level work.
@@ -2331,7 +2917,7 @@ declare class DiagramPoint {
2331
2917
  get element_(): Element;
2332
2918
  }
2333
2919
  /**
2334
- * One user-authored point in its place in the diagram's tree — a `node` or an `asst`, never a
2920
+ * One user-authored point in its place in the diagram's tree: a `node` or an `asst`, never a
2335
2921
  * generated `pres` point or a transition label. See {@link Diagram.nodes}.
2336
2922
  */
2337
2923
  declare class DiagramNode {
@@ -2359,7 +2945,7 @@ declare class Diagram {
2359
2945
  /** The frame's `dgm:relIds`, which names the other three parts by relationship id. */
2360
2946
  private readonly relIds;
2361
2947
  private readonly opc;
2362
- /** Relationships of the part holding the frame — what `dgm:relIds` resolves against. */
2948
+ /** Relationships of the part holding the frame, which is what `dgm:relIds` resolves against. */
2363
2949
  private readonly frameRelationships;
2364
2950
  private readonly themeContext;
2365
2951
  constructor(
@@ -2367,12 +2953,12 @@ declare class Diagram {
2367
2953
  part: Part,
2368
2954
  /** The frame's `dgm:relIds`, which names the other three parts by relationship id. */
2369
2955
  relIds: Element, opc: OpcPackage,
2370
- /** Relationships of the part holding the frame — what `dgm:relIds` resolves against. */
2956
+ /** Relationships of the part holding the frame, which is what `dgm:relIds` resolves against. */
2371
2957
  frameRelationships: Relationships, themeContext: ThemeContext);
2372
2958
  /** Partname of the diagram data part. */
2373
2959
  get partName(): string;
2374
2960
  /**
2375
- * Every point (`dgm:ptLst/dgm:pt`) in document order, unfiltered — generated `pres`
2961
+ * Every point (`dgm:ptLst/dgm:pt`) in document order, unfiltered, with generated `pres`
2376
2962
  * points and the `doc` root included. Filter on {@link DiagramPoint.type} for the user's
2377
2963
  * nodes; {@link text} is the shortcut for the common case, {@link nodes} the structured one.
2378
2964
  *
@@ -2382,8 +2968,8 @@ declare class Diagram {
2382
2968
  */
2383
2969
  get points(): DiagramPoint[];
2384
2970
  /**
2385
- * The authored tree — every `node` and `asst` point in its place, roots in `@srcOrd`
2386
- * order — as a view over {@link points} and {@link connections} rather than a replacement
2971
+ * The authored tree (every `node` and `asst` point in its place, roots in `@srcOrd`
2972
+ * order) as a view over {@link points} and {@link connections} rather than a replacement
2387
2973
  * for either.
2388
2974
  *
2389
2975
  * A root is a content point whose `parOf` parent is not itself content, which in a
@@ -2395,14 +2981,15 @@ declare class Diagram {
2395
2981
  */
2396
2982
  get nodes(): DiagramNode[];
2397
2983
  /**
2398
- * The point with this `@modelId`, or `null` — the lookup every connection getter implies,
2399
- * since a `DiagramConnection` names its ends by id and nothing else resolves them.
2984
+ * The point with this `@modelId`, or `null`. This is the lookup every connection getter implies,
2985
+ * since a `DiagramConnection` names its ends by id and nothing else resolves them. Takes
2986
+ * `null`, as a connection end with no id reads, and misses on it.
2400
2987
  */
2401
- point(modelId: string): DiagramPoint | null;
2988
+ point(modelId: string | null): DiagramPoint | null;
2402
2989
  /** Every edge (`dgm:cxnLst/dgm:cxn`) in document order. */
2403
2990
  get connections(): DiagramConnection[];
2404
2991
  /**
2405
- * The diagram's text in document order, blocks joined by `\n` — the counterpart to
2992
+ * The diagram's text in document order, blocks joined by `\n`: the counterpart to
2406
2993
  * `TextFrame.text` for a construct that has no single text body.
2407
2994
  *
2408
2995
  * Contributing points are the ones a user can type into: everything except the generated
@@ -2439,8 +3026,6 @@ declare class Diagram {
2439
3026
  /** Mark the diagram data part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
2440
3027
  markDirty(): void;
2441
3028
  }
2442
- //#endregion
2443
- //#region src/read/api/table-edit.d.ts
2444
3029
  /** The four edges plus the two diagonals, keyed as {@link TableCellEdge} names them. */
2445
3030
  declare const EDGE_QNAMES: {
2446
3031
  readonly left: 'a:lnL';
@@ -2452,10 +3037,8 @@ declare const EDGE_QNAMES: {
2452
3037
  };
2453
3038
  /** Which border of a cell an edit addresses. */
2454
3039
  type TableCellEdge = keyof typeof EDGE_QNAMES;
2455
- //#endregion
2456
- //#region src/read/api/table-cell.d.ts
2457
3040
  /**
2458
- * One border as {@link TableCell.setBorder} takes it — the write-side mirror of
3041
+ * One border as {@link TableCell.setBorder} takes it: the write-side mirror of
2459
3042
  * {@link CellBorder}, which is what reading one gives back.
2460
3043
  *
2461
3044
  * Deliberately not `CellBorder` itself: that type reports every field, `null` included, so
@@ -2471,7 +3054,7 @@ interface TableCellBorderEdit {
2471
3054
  color?: string;
2472
3055
  /** Theme colour token (e.g. `accent1`); preferred over {@link color} when both are set. */
2473
3056
  schemeColor?: string;
2474
- /** Write an explicit `a:noFill` — a deliberately suppressed edge, not an absent one. */
3057
+ /** Write an explicit `a:noFill`: a deliberately suppressed edge, not an absent one. */
2475
3058
  noFill?: boolean;
2476
3059
  }
2477
3060
  /**
@@ -2491,7 +3074,7 @@ interface TableCellStyleContext {
2491
3074
  * One edge border of a table cell (`a:tcPr/a:lnL|lnR|lnT|lnB|lnTlToBr|lnBlToTr`).
2492
3075
  * Mirrors the `a:ln`-style decode used for shape strokes: {@link widthPt} from
2493
3076
  * `@w` (EMU → points), {@link dash} from `a:prstDash/@val`, and the stroke colour as a
2494
- * {@link ColorRef} — the cell-border counterpart of a shape's line accessors.
3077
+ * {@link ColorRef}. This is the cell-border counterpart of a shape's line accessors.
2495
3078
  */
2496
3079
  interface CellBorder {
2497
3080
  /** Border width in points (`@w` is EMU; 12700 EMU = 1pt), or `null` when unset. */
@@ -2505,8 +3088,14 @@ interface CellBorder {
2505
3088
  * theme: a `lumMod`-darkened accent carried forward as a literal hex stops tracking its theme.
2506
3089
  */
2507
3090
  colorRef: ColorRef;
2508
- /** `true` when the edge is an explicit no-border (`a:noFill`) — a deliberately suppressed side. */
3091
+ /** `true` when the edge is an explicit no-border (`a:noFill`): a deliberately suppressed side. */
2509
3092
  noFill: boolean;
3093
+ /**
3094
+ * The line end cap (`@cap`) as the raw OOXML token (`flat`, `rnd`, `sq`), or `null` when unset.
3095
+ * PowerPoint writes `flat` on every edge it draws; the write side's `BorderProps.cap` is the
3096
+ * same attribute.
3097
+ */
3098
+ cap: string | null;
2510
3099
  }
2511
3100
  /**
2512
3101
  * A table cell's six possible borders, keyed by edge. Each side is `null` when the
@@ -2605,7 +3194,7 @@ declare class TableCell {
2605
3194
  */
2606
3195
  setVerticalText(value: string | null): void;
2607
3196
  /**
2608
- * Set (or clear) `a:tcPr/@horzOverflow` — what a single glyph too wide for the cell does.
3197
+ * Set (or clear) `a:tcPr/@horzOverflow`: what a single glyph too wide for the cell does.
2609
3198
  * `null` removes the attribute; so does `'clip'` in effect, since it is the schema
2610
3199
  * default, but the attribute is still written as asked.
2611
3200
  * @throws {InvalidOptionError} when the value is outside `ST_TextHorzOverflowType`
@@ -2622,7 +3211,7 @@ declare class TableCell {
2622
3211
  *
2623
3212
  * Partial: only the sides named are touched, so `{ left: 0 }` flushes the text left and
2624
3213
  * leaves the other three alone. A side given as `null` has its attribute removed, which
2625
- * returns it to the schema default (91440 EMU left/right, 45720 top/bottom) — not to
3214
+ * returns it to the schema default (91440 EMU left/right, 45720 top/bottom), not to
2626
3215
  * zero. Pass `{}` to change nothing.
2627
3216
  * @throws {InvalidOptionError} when a value is not a finite number
2628
3217
  */
@@ -2633,7 +3222,7 @@ declare class TableCell {
2633
3222
  bottom?: number | null;
2634
3223
  }): void;
2635
3224
  /**
2636
- * Set (or clear) one of the cell's six borders — the four edges and the two diagonals.
3225
+ * Set (or clear) one of the cell's six borders: the four edges and the two diagonals.
2637
3226
  *
2638
3227
  * `null` removes the element entirely, which is "inherit", and is a different thing from
2639
3228
  * `{ noFill: true }`, which writes an explicit no-border and suppresses whatever would
@@ -2652,7 +3241,7 @@ declare class TableCell {
2652
3241
  * `null` removes the `a:solidFill` and lets the cell inherit from the table style again.
2653
3242
  * That is not the same as {@link noFill}, which writes an explicit `a:noFill` and so
2654
3243
  * suppresses the inherited shading. Any competing fill choice (`a:gradFill`,
2655
- * `a:blipFill`, …) is dropped first — `EG_FillProperties` admits one.
3244
+ * `a:blipFill`, …) is dropped first, since `EG_FillProperties` admits one.
2656
3245
  * @throws {InvalidOptionError} when `color` is not a 6-digit hex string
2657
3246
  */
2658
3247
  setFillColor(color: string | null): void;
@@ -2663,30 +3252,30 @@ declare class TableCell {
2663
3252
  */
2664
3253
  setFillSchemeColor(token: string | null): void;
2665
3254
  /**
2666
- * Write an explicit `<a:noFill/>` on the cell — a transparent cell that shows the table
3255
+ * Write an explicit `<a:noFill/>` on the cell: a transparent cell that shows the table
2667
3256
  * background (or the slide) through. Distinct from `setFillColor(null)`, which removes
2668
3257
  * the fill and lets the table style's shading apply again.
2669
3258
  */
2670
3259
  noFill(): void;
2671
3260
  /**
2672
3261
  * The cell's solid fill resolved against the table's theme colour context to a
2673
- * literal hex — the table-cell counterpart of
3262
+ * literal hex. It is the table-cell counterpart of
2674
3263
  * {@link AutoShape.resolvedFill}. The cell's own
2675
3264
  * `a:tcPr/a:solidFill` wins; when the cell defines none, this falls back to the
2676
3265
  * table **style** graph (the `firstRow`/banded/`wholeTbl` shading the
2677
- * `a:tableStyleId` supplies — see {@link Table.resolvedStyle}), so a styled cell
3266
+ * `a:tableStyleId` supplies; see {@link Table.resolvedStyle}), so a styled cell
2678
3267
  * with an empty `a:tcPr` reports the colour PowerPoint actually renders rather
2679
3268
  * than `null`.
2680
3269
  *
2681
3270
  * A cell that carries *some other* fill choice (`a:blipFill`/`a:gradFill`/
2682
3271
  * `a:pattFill`/`a:noFill`) overrides the style graph in PowerPoint, so this
2683
- * reports `null` for one rather than falling through to the inherited shading —
3272
+ * reports `null` for one rather than falling through to the inherited shading,
2684
3273
  * the same guard {@link AutoShape.resolvedFill} applies to
2685
3274
  * the style matrix. Read {@link pictureFill} for an image-filled cell. Also
2686
3275
  * `null` when neither source yields a solid colour (an
2687
3276
  * unmapped token, an explicit style `a:noFill`). The returned
2688
3277
  * {@link ResolvedColor} carries `effectiveHex` (the base colour with its
2689
- * `lumMod`/`lumOff`/… transforms applied) — read that for the final colour.
3278
+ * `lumMod`/`lumOff`/… transforms applied); read that for the final colour.
2690
3279
  */
2691
3280
  get resolvedFill(): ResolvedColor | null;
2692
3281
  /**
@@ -2694,7 +3283,7 @@ declare class TableCell {
2694
3283
  * child), as opposed to inheriting one from the table style's header/banding rules.
2695
3284
  *
2696
3285
  * This is the flag that disambiguates {@link resolvedFill}, which deliberately reports
2697
- * either — it answers "what colour does this cell render as", and both sources are valid
3286
+ * either: it answers "what colour does this cell render as", and both sources are valid
2698
3287
  * answers to that. Anything that has to reproduce the cell rather than describe it needs
2699
3288
  * to know which: baking an inherited banding colour into a copy makes the copy look right
2700
3289
  * until someone changes its table style, and then nothing moves. `false` for a cell whose
@@ -2702,20 +3291,20 @@ declare class TableCell {
2702
3291
  */
2703
3292
  get hasOwnFill(): boolean;
2704
3293
  /**
2705
- * `true` when the cell sets an explicit no-fill (`a:tcPr/a:noFill`) — a deliberately
3294
+ * `true` when the cell sets an explicit no-fill (`a:tcPr/a:noFill`): a deliberately
2706
3295
  * transparent cell showing the table background (or the slide) through. The cell-side
2707
3296
  * counterpart of {@link AutoShape.fillNoFill}, and what
2708
3297
  * {@link noFill} writes.
2709
3298
  *
2710
3299
  * {@link hasOwnFill} is not this question: it is `true` for *any* `EG_FillProperties`
2711
3300
  * child, so on its own it cannot separate a suppressed fill from a gradient or an image
2712
- * one — and every colour accessor ({@link resolvedFill}, {@link fillSchemeColor})
3301
+ * one, and every colour accessor ({@link resolvedFill}, {@link fillSchemeColor})
2713
3302
  * reports `null` for a no-fill cell exactly as it does for a
2714
3303
  * cell that inherits its shading from the table style. Deriving it as "has a fill of its
2715
3304
  * own, and no accessor recognises it" instead of reading it has two failure modes: it
2716
3305
  * folds `a:grpFill` in with `a:noFill`, and its meaning changes silently the day a
2717
- * further fill kind gets an accessor. The two paint completely differently — an
2718
- * inherited banding colour versus nothing at all — so a consumer that cannot tell them
3306
+ * further fill kind gets an accessor. The two paint completely differently (an
3307
+ * inherited banding colour versus nothing at all), so a consumer that cannot tell them
2719
3308
  * apart paints a transparent cell in the style's shading.
2720
3309
  */
2721
3310
  get fillNoFill(): boolean;
@@ -2753,7 +3342,7 @@ declare class TableCell {
2753
3342
  * `null` when the cell defines none. Each present edge decodes to a
2754
3343
  * {@link CellBorder} (width / dash / resolved colour + its raw token and transform
2755
3344
  * list / suppressed flag);
2756
- * absent edges are `null`. Cell borders are the biggest visible table gap — a
3345
+ * absent edges are `null`. Cell borders are the biggest visible table gap: a
2757
3346
  * replica built only from geometry and fill draws every cell edge-to-edge with
2758
3347
  * no rule, so this surfaces the per-side stroke the writer's `border` option emits.
2759
3348
  */
@@ -2770,7 +3359,7 @@ declare class TableCell {
2770
3359
  get anchor(): string | null;
2771
3360
  /**
2772
3361
  * Whether the cell's whole text **block** is centred horizontally within it
2773
- * (`a:tcPr/@anchorCtr`). `false` when unset — that is the schema default, and it is
3362
+ * (`a:tcPr/@anchorCtr`). `false` when unset; that is the schema default, and it is
2774
3363
  * what PowerPoint writes nothing for.
2775
3364
  *
2776
3365
  * Distinct from a paragraph's `align`, which decides where each *line* sits inside the
@@ -2790,19 +3379,19 @@ declare class TableCell {
2790
3379
  *
2791
3380
  * This is what {@link headerIds} references: a data cell names the header cells that
2792
3381
  * govern it by their `@id`, which is how a complex table tells a screen reader what a
2793
- * value means. Unrelated to the shape-level `p:cNvPr/@id` — it is an `xs:string` scoped
3382
+ * value means. Unrelated to the shape-level `p:cNvPr/@id`: it is an `xs:string` scoped
2794
3383
  * to the table, not a slide-wide numeric id.
2795
3384
  *
2796
3385
  * **PowerPoint does not write this and strips it on save**, so it will read `null` on
2797
3386
  * any deck PowerPoint has saved, however it was produced. It is surfaced for decks from
2798
- * other producers. There is deliberately no write-API counterpart — see
3387
+ * other producers. There is deliberately no write-API counterpart; see
2799
3388
  * `test/read/fixtures/authoring/probe-table-cell-a11y-and-3d.ps1` for the measurement.
2800
3389
  */
2801
3390
  get id(): string | null;
2802
3391
  /**
2803
3392
  * The `@id`s of the header cells that govern this cell
2804
3393
  * (`a:tcPr/a:headers/a:header/@val`), in document order. Empty when the cell declares no
2805
- * header association — which is the common case, since only a complex table needs one.
3394
+ * header association, which is the common case, since only a complex table needs one.
2806
3395
  *
2807
3396
  * Carries the same caveat as {@link id}: PowerPoint strips `a:headers` on save, so this
2808
3397
  * is empty on any PowerPoint-saved deck. `Table.firstRowHeader` (`a:tblPr/@firstRow`) is
@@ -2812,7 +3401,7 @@ declare class TableCell {
2812
3401
  /**
2813
3402
  * How the cell treats a glyph too wide for its text width (`a:tcPr/@horzOverflow`):
2814
3403
  * `'clip'` cuts it at the cell edge, `'overflow'` lets it draw past. `null` when unset
2815
- * (PowerPoint clips). Not a wrap flag — cell text always wraps to the column width.
3404
+ * (PowerPoint clips). Not a wrap flag: cell text always wraps to the column width.
2816
3405
  */
2817
3406
  get horzOverflow(): string | null;
2818
3407
  /**
@@ -2836,8 +3425,6 @@ declare class TableCell {
2836
3425
  /** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
2837
3426
  markDirty(): void;
2838
3427
  }
2839
- //#endregion
2840
- //#region src/read/api/table-row.d.ts
2841
3428
  /** One table row (`a:tr`). */
2842
3429
  declare class TableRow {
2843
3430
  private readonly tr;
@@ -2868,8 +3455,6 @@ declare class TableRow {
2868
3455
  /** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
2869
3456
  markDirty(): void;
2870
3457
  }
2871
- //#endregion
2872
- //#region src/read/api/table.d.ts
2873
3458
  /** A table: a grid of rows and cells inside a graphic frame. */
2874
3459
  declare class Table {
2875
3460
  #private;
@@ -2895,7 +3480,7 @@ declare class Table {
2895
3480
  * from the deck's `tableStyles.xml`, or `null` when the table names no
2896
3481
  * `a:tableStyleId`, the deck has no `tableStyles.xml`, or the id is a built-in
2897
3482
  * `[MS-OE376]` style the deck does not materialise. This is what supplies the
2898
- * banded-row / header shading a cell with no own fill inherits — read the
3483
+ * banded-row / header shading a cell with no own fill inherits. Read the
2899
3484
  * resolved per-cell colour off {@link TableCell.resolvedFill}.
2900
3485
  *
2901
3486
  * Resolved afresh on every read, not through the per-instance memo the cells share, so an
@@ -2914,7 +3499,7 @@ declare class Table {
2914
3499
  * `{5940675A-B579-460E-94D1-54222C63F5DA}`, or `null` when the table carries no
2915
3500
  * `a:tableStyleId`. This is the reference into `ppt/tableStyles.xml` (or a
2916
3501
  * built-in `[MS-OE376]` style) that supplies the banded-row / header shading the
2917
- * `firstRow`/`bandRow` flags activate — without it a replica loses the whole
3502
+ * `firstRow`/`bandRow` flags activate. Without it a replica loses the whole
2918
3503
  * table style, so it is the read counterpart of the writer's `tableStyle` option.
2919
3504
  */
2920
3505
  get styleId(): string | null;
@@ -2925,7 +3510,7 @@ declare class Table {
2925
3510
  * This is the table-level counterpart of {@link TableCell.resolvedFill}, and it is a
2926
3511
  * genuinely different thing from a cell fill: a `a:tblPr` fill sits *behind* the grid, so
2927
3512
  * a cell with no fill of its own shows it through. Reports `null` for a non-solid choice
2928
- * (`a:blipFill`/`a:gradFill`/`a:pattFill`/`a:noFill`) — read {@link pictureFill} for an
3513
+ * (`a:blipFill`/`a:gradFill`/`a:pattFill`/`a:noFill`); read {@link pictureFill} for an
2929
3514
  * image background.
2930
3515
  */
2931
3516
  get resolvedFill(): ResolvedColor | null;
@@ -2975,6 +3560,11 @@ declare class Table {
2975
3560
  get firstColumnHeader(): boolean;
2976
3561
  /** Whether the last column is emphasised (`a:tblPr/@lastCol`), from `addTable`'s `hasLastColumn`. */
2977
3562
  get lastColumnFooter(): boolean;
3563
+ /**
3564
+ * Whether the table reads right to left (`a:tblPr/@rtl`), from `addTable`'s `rtl`: its columns
3565
+ * run from the right edge, so column 0 is the rightmost.
3566
+ */
3567
+ get rtl(): boolean;
2978
3568
  /**
2979
3569
  * The cell at `(rowIndex, columnIndex)` (both zero-based), or `null` when out
2980
3570
  * of range. Column index counts `a:tc` elements in the row, so a cell that
@@ -2996,7 +3586,7 @@ declare class Table {
2996
3586
  * Remove the row at `index`, with its content.
2997
3587
  *
2998
3588
  * A cell in the row that *continues* a vertical merge shortens that merge. A cell that
2999
- * *starts* one hands the region to its first continuation, which becomes the new origin —
3589
+ * *starts* one hands the region to its first continuation, which becomes the new origin:
3000
3590
  * the merged region survives one row shorter, and only the removed row's own text is lost.
3001
3591
  * @throws {InvalidOptionError} when `index` is out of range
3002
3592
  */
@@ -3026,7 +3616,7 @@ declare class Table {
3026
3616
  * never rendered.
3027
3617
  *
3028
3618
  * A rectangle that cuts through an existing merge is **rejected**, not silently widened
3029
- * to fit — the caller asked for a specific region, and quietly producing a different one
3619
+ * to fit. The caller asked for a specific region, and quietly producing a different one
3030
3620
  * is how a layout ends up wrong with nothing to point at. Unmerge first.
3031
3621
  * @throws {InvalidOptionError} when an index is out of range, the range covers one cell,
3032
3622
  * or it partially overlaps an existing merge
@@ -3044,9 +3634,7 @@ declare class Table {
3044
3634
  /** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
3045
3635
  markDirty(): void;
3046
3636
  }
3047
- //#endregion
3048
- //#region src/read/api/shapes/graphic-frame.d.ts
3049
- /** A graphic frame (`p:graphicFrame`) — host for tables, charts and SmartArt diagrams. */
3637
+ /** A graphic frame (`p:graphicFrame`), the host for tables, charts and SmartArt diagrams. */
3050
3638
  declare class GraphicFrame extends Shape {
3051
3639
  #private;
3052
3640
  readonly shapeType: 'graphicFrame';
@@ -3068,7 +3656,7 @@ declare class GraphicFrame extends Shape {
3068
3656
  */
3069
3657
  get hasDiagram(): boolean;
3070
3658
  /**
3071
- * The `a:graphicData/@uri` verbatim — the namespace naming what this frame hosts, or
3659
+ * The `a:graphicData/@uri` verbatim: the namespace naming what this frame hosts, or
3072
3660
  * `null` when the frame carries no `a:graphicData`.
3073
3661
  *
3074
3662
  * Every `has*` predicate is a comparison against this, so a frame whose URI matches none
@@ -3094,10 +3682,8 @@ declare class GraphicFrame extends Shape {
3094
3682
  */
3095
3683
  get diagram(): Diagram | null;
3096
3684
  }
3097
- //#endregion
3098
- //#region src/read/api/shapes.d.ts
3099
3685
  /**
3100
- * A group shape (`p:grpSp`) — contains nested shapes.
3686
+ * A group shape (`p:grpSp`), which contains nested shapes.
3101
3687
  *
3102
3688
  * It is the one kind defined here rather than under `./shapes/`: its `shapes` getter recurses
3103
3689
  * through `buildShapes` below, so putting it in a sibling module would make the dispatch and the
@@ -3116,7 +3702,7 @@ declare class GroupShape extends Shape {
3116
3702
  * element is incomplete.
3117
3703
  *
3118
3704
  * Most consumers should not need this: {@link Shape.absoluteFrame} already
3119
- * composes the whole ancestor chain — child space, group flips and rotations —
3705
+ * composes the whole ancestor chain (child space, group flips and rotations),
3120
3706
  * and doing that arithmetic per consumer is how a shape in a nested group ends
3121
3707
  * up subtly displaced. It is here for a *replica* consumer rather than a
3122
3708
  * *paint* one: rebuilding this group and its children as OOXML needs the
@@ -3132,24 +3718,22 @@ declare class GroupShape extends Shape {
3132
3718
  * {@link Shape.shapeType} literal. The read API (`Slide.shapes`,
3133
3719
  * `Slide.shapeById`, `GroupShape.shapes`, `Presentation.importShape`, …) returns
3134
3720
  * this rather than the abstract {@link Shape} base, so a consumer can narrow to a
3135
- * subtype by its discriminant and reach the subtype-only members — e.g.
3721
+ * subtype by its discriminant and reach the subtype-only members, e.g.
3136
3722
  * `if (shape.shapeType === 'graphicFrame') shape.chart` or, equivalently, the
3137
3723
  * {@link isGraphicFrame} guard. The abstract {@link Shape} base is still exported
3138
3724
  * for the "common members only" case and for `instanceof` checks.
3139
3725
  */
3140
3726
  type AnyShape = AutoShape | Picture | Connector | GraphicFrame | GroupShape;
3141
- /** Narrow a shape to an {@link AutoShape} (`p:sp` — auto shape, text box, or placeholder). */
3727
+ /** Narrow a shape to an {@link AutoShape} (`p:sp`: auto shape, text box, or placeholder). */
3142
3728
  declare function isAutoShape(shape: Shape): shape is AutoShape;
3143
3729
  /** Narrow a shape to a {@link Picture} (`p:pic`). */
3144
3730
  declare function isPicture(shape: Shape): shape is Picture;
3145
3731
  /** Narrow a shape to a {@link Connector} (`p:cxnSp`). */
3146
3732
  declare function isConnector(shape: Shape): shape is Connector;
3147
- /** Narrow a shape to a {@link GraphicFrame} (`p:graphicFrame` — table/chart host). */
3733
+ /** Narrow a shape to a {@link GraphicFrame} (`p:graphicFrame`, the table/chart host). */
3148
3734
  declare function isGraphicFrame(shape: Shape): shape is GraphicFrame;
3149
3735
  /** Narrow a shape to a {@link GroupShape} (`p:grpSp`). */
3150
3736
  declare function isGroupShape(shape: Shape): shape is GroupShape;
3151
- //#endregion
3152
- //#region src/read/api/chrome.d.ts
3153
3737
  /**
3154
3738
  * One theme font family (`a:majorFont` or `a:minorFont`): the primary Latin face
3155
3739
  * plus the East-Asian and complex-script faces. Each is `null` when the theme
@@ -3157,20 +3741,20 @@ declare function isGroupShape(shape: Shape): shape is GroupShape;
3157
3741
  * per-script `<a:font>` fallback list is not decoded here.
3158
3742
  */
3159
3743
  interface ThemeFontFace {
3160
- /** `<a:latin@typeface>` — the primary face (e.g. `Calibri Light`), or `null` when empty. */
3744
+ /** `<a:latin@typeface>`: the primary face (e.g. `Calibri Light`), or `null` when empty. */
3161
3745
  latin: string | null;
3162
- /** `<a:ea@typeface>` — the East-Asian face, or `null` when empty. */
3746
+ /** `<a:ea@typeface>`: the East-Asian face, or `null` when empty. */
3163
3747
  ea: string | null;
3164
- /** `<a:cs@typeface>` — the complex-script face, or `null` when empty. */
3748
+ /** `<a:cs@typeface>`: the complex-script face, or `null` when empty. */
3165
3749
  cs: string | null;
3166
3750
  }
3167
3751
  /** A theme's `a:fontScheme`: its name plus the major (heading) and minor (body) font families. */
3168
3752
  interface ThemeFontScheme {
3169
3753
  /** `<a:fontScheme@name>` (e.g. `Office`), or `null` when unnamed. */
3170
3754
  name: string | null;
3171
- /** The `a:majorFont` family — the heading (`+mj-*`) fonts. */
3755
+ /** The `a:majorFont` family: the heading (`+mj-*`) fonts. */
3172
3756
  major: ThemeFontFace;
3173
- /** The `a:minorFont` family — the body (`+mn-*`) fonts. */
3757
+ /** The `a:minorFont` family: the body (`+mn-*`) fonts. */
3174
3758
  minor: ThemeFontFace;
3175
3759
  }
3176
3760
  /**
@@ -3214,7 +3798,7 @@ declare class Theme {
3214
3798
  markDirty(): void;
3215
3799
  }
3216
3800
  /**
3217
- * One placeholder shape (`p:sp` with a `p:ph`) of a slide master or slide layout —
3801
+ * One placeholder shape (`p:sp` with a `p:ph`) of a slide master or slide layout:
3218
3802
  * the definition a slide's placeholder of the same `type`/`idx` inherits geometry
3219
3803
  * and text style from. Geometry getters read the placeholder's *own* `a:xfrm`,
3220
3804
  * which a master/layout placeholder carries explicitly (so it round-trips, unlike a
@@ -3230,7 +3814,7 @@ declare class Theme {
3230
3814
  declare class Placeholder {
3231
3815
  /** The placeholder's `p:sp`. `protected` so {@link NotesPlaceholder} can read it. */
3232
3816
  protected readonly sp: Element;
3233
- /** The part the `p:sp` lives in — a master, a layout, or a notes slide. */
3817
+ /** The part the `p:sp` lives in: a master, a layout, or a notes slide. */
3234
3818
  protected readonly host: ShapeHost;
3235
3819
  /**
3236
3820
  * The same `p:sp` as an {@link AutoShape}. Identity, geometry and the text frame are
@@ -3242,14 +3826,14 @@ declare class Placeholder {
3242
3826
  * `xfrm()` + `emuFrom`; and,
3243
3827
  * the one that showed, the text frame was built with **no** inheritance context, so
3244
3828
  * `Run.resolvedSizePt`, `resolvedFontFace`, `resolvedColor` and `resolvedBold` resolved
3245
- * through `SlideMaster.shapes` and came back `null` through `SlideMaster.placeholders` —
3829
+ * through `SlideMaster.shapes` and came back `null` through `SlideMaster.placeholders`:
3246
3830
  * two views of one element disagreeing about the same run.
3247
3831
  */
3248
3832
  protected readonly shape: AutoShape;
3249
3833
  constructor(
3250
3834
  /** The placeholder's `p:sp`. `protected` so {@link NotesPlaceholder} can read it. */
3251
3835
  sp: Element,
3252
- /** The part the `p:sp` lives in — a master, a layout, or a notes slide. */
3836
+ /** The part the `p:sp` lives in: a master, a layout, or a notes slide. */
3253
3837
  host: ShapeHost);
3254
3838
  /** Placeholder type (`p:ph/@type`: `title` | `body` | `sldNum` | …), or `null` when absent (a body placeholder). */
3255
3839
  get type(): string | null;
@@ -3286,7 +3870,7 @@ declare class Placeholder {
3286
3870
  markDirty(): void;
3287
3871
  }
3288
3872
  /**
3289
- * The shared body of a slide master and a slide layout — the two template tiers a slide
3873
+ * The shared body of a slide master and a slide layout, the two template tiers a slide
3290
3874
  * inherits from.
3291
3875
  *
3292
3876
  * Both are an OPC part holding a `p:cSld` with a shape tree and a resolvable theme context, and
@@ -3304,7 +3888,7 @@ declare class Placeholder {
3304
3888
  *
3305
3889
  * `Slide` deliberately does not extend this. It is a shape host too, but it is constructed from
3306
3890
  * a `Presentation` rather than an `OpcPackage`, reaches its relationships through that, and
3307
- * reports an unnamed slide as `null` where a template tier reports `''` — three differences in
3891
+ * reports an unnamed slide as `null` where a template tier reports `''`. That is three differences in
3308
3892
  * the same handful of members, which is more contortion than the sharing is worth.
3309
3893
  */
3310
3894
  declare abstract class TemplatePart implements ShapeHost {
@@ -3325,14 +3909,14 @@ declare abstract class TemplatePart implements ShapeHost {
3325
3909
  /** The authoring name (`p:cSld/@name`), or `''` when unnamed. */
3326
3910
  get name(): string;
3327
3911
  /**
3328
- * Every shape in this tier's `p:cSld/p:spTree`, in document order — the same `AnyShape`
3912
+ * Every shape in this tier's `p:cSld/p:spTree`, in document order: the same `AnyShape`
3329
3913
  * union `Slide.shapes` returns, so shape-walking code applies unchanged.
3330
3914
  *
3331
3915
  * {@link placeholders} is the filtered view of the same tree.
3332
3916
  */
3333
3917
  get shapes(): AnyShape[];
3334
- /** The shape anywhere in this tier's tree with the given drawing id, or `undefined`. */
3335
- shapeByIdDeep(id: number): AnyShape | undefined;
3918
+ /** The shape anywhere in this tier's tree with the given drawing id, or `undefined` (always, for `null`). */
3919
+ shapeByIdDeep(id: number | null): AnyShape | undefined;
3336
3920
  /** This tier's placeholder shapes (`p:sp` carrying a `p:ph`), in document order. */
3337
3921
  get placeholders(): Placeholder[];
3338
3922
  /** This tier's colour/font context, resolved once and cached. Backs each {@link Placeholder}'s text frame. */
@@ -3375,23 +3959,23 @@ declare class SlideMaster extends TemplatePart {
3375
3959
  get layouts(): SlideLayout[];
3376
3960
  /**
3377
3961
  * The master's *own* background (`p:cSld/p:bg`), decoded, or `null` when it defines
3378
- * none. Scoped to the master's own element — a slide's *effective* background,
3962
+ * none. Scoped to the master's own element. A slide's *effective* background,
3379
3963
  * resolved through the slide → layout → master chain, is `Slide.background`.
3380
3964
  */
3381
3965
  get background(): SlideBackground | null;
3382
- /** A master's context is its own `p:clrMap` plus its theme — no walk beyond this part. */
3966
+ /** A master's context is its own `p:clrMap` plus its theme; no walk beyond this part. */
3383
3967
  protected resolveThemeContext(): ThemeContext;
3384
3968
  }
3385
3969
  /**
3386
- * A deck's slide layout (`slideLayoutN.xml`) as a modeled object — the gallery entry
3970
+ * A deck's slide layout (`slideLayoutN.xml`) as a modeled object: the gallery entry
3387
3971
  * a slide binds to. Exposes its {@link name}, its {@link type} (import-only; the
3388
3972
  * writer authors none), its {@link master} (and, through it, the {@link theme}), its
3389
3973
  * `shapes` and the `placeholders` subset of them, and its own {@link background}.
3390
3974
  * Reachable from `Slide.layout` and {@link SlideMaster.layouts}.
3391
3975
  *
3392
3976
  * The write API authors non-placeholder shapes into a layout: every
3393
- * `defineSlideMaster({ objects })` member that is not a `placeholder` — a `rect`, a
3394
- * `line`, an `image`, a `chart`, a `text` box — lands in this tier's tree.
3977
+ * `defineSlideMaster({ objects })` member that is not a `placeholder` (a `rect`, a
3978
+ * `line`, an `image`, a `chart`, a `text` box) lands in this tier's tree.
3395
3979
  */
3396
3980
  declare class SlideLayout extends TemplatePart {
3397
3981
  /**
@@ -3403,7 +3987,7 @@ declare class SlideLayout extends TemplatePart {
3403
3987
  /**
3404
3988
  * Whether this layout draws the master's non-placeholder shapes
3405
3989
  * (`p:sldLayout/@showMasterSp`). `xsd:boolean` defaulting to `true`, so an absent
3406
- * attribute means shown — the layout-tier counterpart of `Slide.showMasterSp`,
3990
+ * attribute means shown. This is the layout-tier counterpart of `Slide.showMasterSp`,
3407
3991
  * and the one PowerPoint actually writes on a section-divider or full-bleed
3408
3992
  * layout. A renderer resolving what to paint under a slide's own shapes has to
3409
3993
  * consult both: the slide's flag, then its layout's.
@@ -3415,7 +3999,7 @@ declare class SlideLayout extends TemplatePart {
3415
3999
  get theme(): Theme | null;
3416
4000
  /**
3417
4001
  * The layout's *own* background (`p:cSld/p:bg`), decoded, or `null` when it defines
3418
- * none. A layout usually authors one — an explicit fill (`p:bgPr`) or a
4002
+ * none. A layout usually authors one: an explicit fill (`p:bgPr`) or a
3419
4003
  * theme-indexed reference (`p:bgRef`). The slide's *effective* background is
3420
4004
  * `Slide.background`.
3421
4005
  */
@@ -3423,8 +4007,6 @@ declare class SlideLayout extends TemplatePart {
3423
4007
  /** A layout's context is walked layout → master → theme, which is why it is not the master's. */
3424
4008
  protected resolveThemeContext(): ThemeContext;
3425
4009
  }
3426
- //#endregion
3427
- //#region src/read/api/notes.d.ts
3428
4010
  /**
3429
4011
  * One placeholder shape (`p:sp`) of a notes slide. A notes slide holds a fixed set:
3430
4012
  * the slide thumbnail (`type="sldImg"`), the notes body (`type="body"`), and the
@@ -3432,8 +4014,8 @@ declare class SlideLayout extends TemplatePart {
3432
4014
  * `a:xfrm` and are `null` when it inherits geometry from the notesMaster (the case
3433
4015
  * on an authored deck, whose `sldImg`/`sldNum` carry an empty `p:spPr`).
3434
4016
  *
3435
- * A notes placeholder IS a {@link Placeholder} — identity, geometry and the escape hatch are
3436
- * the same twelve members read off the same `p:sp`, down to `p:ph` being found the same way —
4017
+ * A notes placeholder IS a {@link Placeholder}. Identity, geometry and the escape hatch are
4018
+ * the same twelve members read off the same `p:sp`, down to `p:ph` being found the same way,
3437
4019
  * so it extends one rather than repeating it. Two things are its own: the flattened
3438
4020
  * {@link text} convenience, and a {@link textFrame} that threads the notesMaster inheritance
3439
4021
  * context onto the body frame.
@@ -3445,14 +4027,14 @@ declare class NotesPlaceholder extends Placeholder {
3445
4027
  * runs round-trip a slide's authored notes; the `sldNum` placeholder's frame
3446
4028
  * holds the slide-number `a:fld`, whose value surfaces through `TextFrame.text`.
3447
4029
  *
3448
- * Overrides {@link Placeholder.textFrame} for the inheritance context alone — see below.
4030
+ * Overrides {@link Placeholder.textFrame} for the inheritance context alone (see below).
3449
4031
  */
3450
4032
  get textFrame(): TextFrame | null;
3451
4033
  /** The placeholder's flattened text (paragraphs joined by `\n`), or `''` when it has no text body. */
3452
4034
  get text(): string;
3453
4035
  }
3454
4036
  /**
3455
- * A slide's speaker-notes slide (`notesSlideN.xml`) as a modeled object — the deep
4037
+ * A slide's speaker-notes slide (`notesSlideN.xml`) as a modeled object: the deep
3456
4038
  * companion to {@link Slide.notesText}. Exposes the notes
3457
4039
  * shape tree as {@link NotesPlaceholder}s ({@link body}/{@link slideImage}/
3458
4040
  * {@link slideNumber}) plus the body {@link textFrame} the older getters flatten.
@@ -3473,19 +4055,19 @@ declare class NotesSlide implements ShapeHost {
3473
4055
  part: Part);
3474
4056
  /** Partname of the notes slide part. */
3475
4057
  get partName(): string;
3476
- /** The notes part's own relationships — a notes hyperlink resolves through these. */
4058
+ /** The notes part's own relationships; a notes hyperlink resolves through these. */
3477
4059
  get relationships(): Relationships;
3478
4060
  /**
3479
4061
  * The notes shape tree as full shapes, in document order.
3480
4062
  *
3481
4063
  * A notes slide holds nothing but its three placeholders, so {@link placeholders} is the
3482
- * view to read. This one exists because a notes slide is a {@link ShapeHost} — which is
4064
+ * view to read. This one exists because a notes slide is a {@link ShapeHost}, which is
3483
4065
  * what lets a {@link NotesPlaceholder} be the same {@link AutoShape} view of its `p:sp`
3484
4066
  * that a master or layout placeholder is, rather than a second reading of one.
3485
4067
  */
3486
4068
  get shapes(): AnyShape[];
3487
- /** The shape anywhere in the notes tree with the given drawing id, or `undefined`. */
3488
- shapeByIdDeep(id: number): AnyShape | undefined;
4069
+ /** The shape anywhere in the notes tree with the given drawing id, or `undefined` (always, for `null`). */
4070
+ shapeByIdDeep(id: number | null): AnyShape | undefined;
3489
4071
  /**
3490
4072
  * The notes theme context, resolved through the notesMaster → `theme2.xml` chain
3491
4073
  * and cached. Backs {@link NotesPlaceholder.textFrame}'s `Run.resolvedColor`.
@@ -3504,8 +4086,6 @@ declare class NotesSlide implements ShapeHost {
3504
4086
  /** The notes body text flattened (paragraphs joined by `\n`), or `''` when the body is empty/absent. */
3505
4087
  get text(): string;
3506
4088
  }
3507
- //#endregion
3508
- //#region src/read/api/comments.d.ts
3509
4089
  /** One entry of the deck-wide comment-author registry (`p:cmAuthor`). */
3510
4090
  interface CommentAuthor {
3511
4091
  /** Author id (`@id`), referenced by each comment's `@authorId`. */
@@ -3540,7 +4120,7 @@ interface Comment {
3540
4120
  }
3541
4121
  /** One entry of the modern deck-wide author registry (`p188:author`). */
3542
4122
  interface ModernCommentAuthor {
3543
- /** Author id (`@id`) — a GUID string like `{E8A64ABA-…}`, referenced by each comment's `@authorId`. */
4123
+ /** Author id (`@id`): a GUID string like `{E8A64ABA-…}`, referenced by each comment's `@authorId`. */
3544
4124
  id: string | null;
3545
4125
  /** Display name (`@name`). */
3546
4126
  name: string;
@@ -3574,9 +4154,7 @@ interface ModernComment {
3574
4154
  }
3575
4155
  /** Which comment schema a deck carries. `'none'` when it has neither part. */
3576
4156
  type CommentSchema = 'legacy' | 'modern' | 'none';
3577
- //#endregion
3578
- //#region src/read/api/tags.d.ts
3579
- /** One programmatic tag (`p:tag`) — a name/value string pair. */
4157
+ /** One programmatic tag (`p:tag`): a name/value string pair. */
3580
4158
  interface Tag {
3581
4159
  /** The tag's `@name`. */
3582
4160
  name: string;
@@ -3591,9 +4169,7 @@ interface Tag {
3591
4169
  * `p:custDataLst`, so it is robust to element ordering in the owner.
3592
4170
  */
3593
4171
  declare function readTagsForPart(opc: OpcPackage, ownerPartName: string): Tag[];
3594
- //#endregion
3595
- //#region src/read/api/transition.d.ts
3596
- /** `ST_TransitionSpeed` — the coarse speed bucket (`spd`), default `fast`. */
4172
+ /** `ST_TransitionSpeed`: the coarse speed bucket (`spd`), default `fast`. */
3597
4173
  type TransitionSpeed = 'slow' | 'med' | 'fast';
3598
4174
  /** Decoded slide transition (`p:transition`), as returned by {@link Slide.transition}. */
3599
4175
  interface TransitionInfo {
@@ -3664,8 +4240,41 @@ interface TransitionInput {
3664
4240
  */
3665
4241
  sound?: TransitionSoundInfo | null;
3666
4242
  }
3667
- //#endregion
3668
- //#region src/read/api/slide.d.ts
4243
+ /** Which time-node sequence a {@link BuildEffect} plays in. */
4244
+ type BuildSequence = 'main' | 'interactive' | 'other';
4245
+ /**
4246
+ * One preset effect in a slide's `p:timing`, as {@link Slide.animations} reads it: a time node with a
4247
+ * `presetClass`, the shape it targets, and how and when it starts.
4248
+ */
4249
+ interface BuildEffect {
4250
+ /**
4251
+ * The sequence the effect plays in: `main` for the slide's click-through build (`nodeType="mainSeq"`),
4252
+ * `interactive` for one a click on a shape triggers (`interactiveSeq`), `other` for anywhere else.
4253
+ */
4254
+ sequence: BuildSequence;
4255
+ /** `@presetClass`: `entr`, `emph`, `exit`, `path`, `verb` or `mediacall`. */
4256
+ presetClass: string;
4257
+ /** `@presetID`, or `null` when it states none. */
4258
+ presetId: number | null;
4259
+ /** `@presetSubtype`, or `null` when it states none. */
4260
+ presetSubtype: number | null;
4261
+ /**
4262
+ * How the effect starts (`@nodeType`): `clickEffect` is `onClick`, `withEffect` is `withPrevious`,
4263
+ * `afterEffect` is `afterPrevious`, and anything else is `null`.
4264
+ */
4265
+ trigger: 'onClick' | 'withPrevious' | 'afterPrevious' | null;
4266
+ /** The longest `@dur` among the effect's behaviours, in milliseconds, or `null` when none states one. */
4267
+ durationMs: number | null;
4268
+ /**
4269
+ * The delay of the step the effect sits in, from the click that starts it (`p:cond/@delay` on the
4270
+ * effect's parent time node), in milliseconds, or `null` when it is not a number.
4271
+ */
4272
+ delayMs: number | null;
4273
+ /** The target shape's `p:cNvPr` id (the first `p:spTgt/@spid` under the effect), or `null`. */
4274
+ shapeId: number | null;
4275
+ /** Whether the effect targets a range of the shape's text (`p:spTgt/p:txEl`) rather than the whole shape. */
4276
+ textRange: boolean;
4277
+ }
3669
4278
  /** Options for {@link Slide.addTextBox}. Geometry is in EMU. */
3670
4279
  interface AddTextBoxOptions {
3671
4280
  /** Left edge in EMU (`a:off/@x`). */
@@ -3742,8 +4351,8 @@ declare class Slide implements ShapeHost {
3742
4351
  * `fmtScheme` + `fontScheme`, plus the layout/master roots), walked once from
3743
4352
  * slide → layout → master → theme and cached on this proxy. Backs the read-model
3744
4353
  * resolved getters ({@link Shape.resolvedFill}, `Run.resolvedColor`,
3745
- * `Run.resolvedSizePt`, `Run.resolvedFontFace`) so a `schemeClr` token — including
3746
- * one delivered through a shape's `p:style` `fillRef`/`lnRef` — resolves to a
4354
+ * `Run.resolvedSizePt`, `Run.resolvedFontFace`) so a `schemeClr` token (including
4355
+ * one delivered through a shape's `p:style` `fillRef`/`lnRef`) resolves to a
3747
4356
  * literal hex, and a placeholder run's inherited size/typeface (a `+mj-*`/`+mn-*`
3748
4357
  * font token included) resolves to a literal value. The maps/roots are empty when
3749
4358
  * the theme chain is incomplete, in which case tokens simply stay unresolved.
@@ -3768,7 +4377,7 @@ declare class Slide implements ShapeHost {
3768
4377
  /**
3769
4378
  * Whether this slide draws the master's non-placeholder shapes
3770
4379
  * (`p:sld/@showMasterSp`). `xsd:boolean` defaulting to `true`, so an absent
3771
- * attribute means shown — the same shape as {@link hidden}.
4380
+ * attribute means shown, the same shape as {@link hidden}.
3772
4381
  *
3773
4382
  * This is the switch that decides whether {@link SlideMaster.shapes} belongs on
3774
4383
  * *this* slide. A slide the author gave a full-bleed image or a section divider
@@ -3789,7 +4398,7 @@ declare class Slide implements ShapeHost {
3789
4398
  * Set or clear the slide's show transition. Assigning `null` removes it.
3790
4399
  * Writing a transition with `durationMs` emits the `mc:AlternateContent` form
3791
4400
  * (a `p14` Choice carrying `p14:dur` plus a base `mc:Fallback`); otherwise the
3792
- * bare `<p:transition>` is written. The node is inserted at its schema slot —
4401
+ * bare `<p:transition>` is written. The node is inserted at its schema slot,
3793
4402
  * after `p:clrMapOvr`, before `p:timing`/`p:extLst`. Marks the slide part dirty.
3794
4403
  *
3795
4404
  * The new transition is built from the current one before that is removed: it keeps the sound
@@ -3804,6 +4413,12 @@ declare class Slide implements ShapeHost {
3804
4413
  * see `animationSpids`.
3805
4414
  */
3806
4415
  get hasAnimations(): boolean;
4416
+ /**
4417
+ * The slide's build effects: every time node in its `p:timing` with a `presetClass`, in document
4418
+ * order, with the sequence it plays in, its preset, trigger, duration, step delay and target shape
4419
+ * id. `[]` when the slide has no timing. Read-only: see {@link BuildEffect}.
4420
+ */
4421
+ get animations(): BuildEffect[];
3807
4422
  /**
3808
4423
  * @internal The sorted, de-duplicated set of shape ids (`spid`) referenced by
3809
4424
  * the slide's animations (`<p:spTgt spid>` and `<p:bldP spid>`). Exposed for the
@@ -3825,20 +4440,20 @@ declare class Slide implements ShapeHost {
3825
4440
  /**
3826
4441
  * Flatten the slide's build animations: remove the `<p:timing>` block so the
3827
4442
  * slide renders and edits as its final static state, with every shape shown at
3828
- * once. Gated like {@link hasAnimations} — a `<p:timing>` that is purely a media
4443
+ * once. Gated like {@link hasAnimations}: a `<p:timing>` that is purely a media
3829
4444
  * loop (no `<p:bldP>` or `presetID`) is preserved so media playback survives.
3830
4445
  * Marks the slide part dirty and returns `true` only when a timing block was
3831
4446
  * removed.
3832
4447
  *
3833
4448
  * This removes click-through staging only; it does not delete shapes. If a slide
3834
4449
  * animated alternating states over the same region, the flattened render shows
3835
- * them all at once — keep that distinct from removing staged/duplicate shapes.
4450
+ * them all at once. Keep that distinct from removing staged/duplicate shapes.
3836
4451
  */
3837
4452
  flattenAnimations(): boolean;
3838
4453
  /** Top-level shapes in the slide's shape tree, in document order. */
3839
4454
  get shapes(): AnyShape[];
3840
4455
  /**
3841
- * All text on the slide, flattened in document order — the read-model
4456
+ * All text on the slide, flattened in document order: the read-model
3842
4457
  * counterpart to {@link TextFrame.text} one level up. Every text-bearing shape
3843
4458
  * contributes its text, recursing into groups ({@link GroupShape}) and reading
3844
4459
  * table cells ({@link GraphicFrame.table}) and SmartArt node text
@@ -3858,12 +4473,12 @@ declare class Slide implements ShapeHost {
3858
4473
  */
3859
4474
  get text(): string;
3860
4475
  /**
3861
- * The slide's speaker-note text — the companion to {@link text} for the notes
4476
+ * The slide's speaker-note text, the companion to {@link text} for the notes
3862
4477
  * that {@link text} deliberately excludes. Delegates to {@link notesSlide}: finds
3863
4478
  * the notes body placeholder (`p:ph` `type="body"`) and flattens its text frame
3864
4479
  * the same way {@link TextFrame.text} does (paragraphs joined by `\n`).
3865
4480
  *
3866
- * Returns `null` when the slide has **no notes slide part at all** — distinct
4481
+ * Returns `null` when the slide has **no notes slide part at all**, distinct
3867
4482
  * from `''`, which means a notes slide exists but its body is empty (PowerPoint
3868
4483
  * often attaches an empty notes slide to every slide). Only the body placeholder
3869
4484
  * is read; the slide-thumbnail (`sldImg`) and slide-number (`sldNum`)
@@ -3871,14 +4486,14 @@ declare class Slide implements ShapeHost {
3871
4486
  */
3872
4487
  get notesText(): string | null;
3873
4488
  /**
3874
- * The slide's speaker-note body as a navigable {@link TextFrame} — the rich
4489
+ * The slide's speaker-note body as a navigable {@link TextFrame}: the rich
3875
4490
  * companion to {@link notesText}, which flattens the same body to a plain string.
3876
4491
  * Walk `paragraphs → runs` to recover per-run formatting (bold/italic/underline,
3877
4492
  * colour, size, face) and any notes hyperlink that {@link notesText} discards.
3878
4493
  *
3879
4494
  * `null` when the slide has **no notes slide part** (the same boundary
3880
4495
  * {@link notesText} returns `null` at), and also when a notes part exists but
3881
- * carries no body-placeholder text frame — there is then no frame to hand back
4496
+ * carries no body-placeholder text frame; there is then no frame to hand back
3882
4497
  * (whereas {@link notesText} reports `''` for that empty-body case). Convenience
3883
4498
  * for `notesSlide.textFrame`; see {@link notesSlide} for the whole modeled notes
3884
4499
  * slide (its `sldImg`/`sldNum` placeholders and their geometry).
@@ -3888,9 +4503,9 @@ declare class Slide implements ShapeHost {
3888
4503
  * The slide's speaker-notes slide (`notesSlideN.xml`) as a modeled
3889
4504
  * {@link NotesSlide}, or `null` when the slide has no notes slide part. Beyond the
3890
4505
  * body text {@link notesText}/{@link notesTextFrame} surface, this exposes the
3891
- * notes slide's three placeholders — the slide thumbnail (`slideImage`), the notes
3892
- * body, and the slide-number field (`slideNumber`) — each with its geometry and
3893
- * (where present) a navigable text frame.
4506
+ * notes slide's three placeholders, each with its geometry and (where present) a
4507
+ * navigable text frame: the slide thumbnail (`slideImage`), the notes body, and the
4508
+ * slide-number field (`slideNumber`).
3894
4509
  *
3895
4510
  * The writer authors all three placeholders but leaves `sldImg`/`sldNum` with an
3896
4511
  * empty `p:spPr`, so on an authored deck their geometry reads `null` while an
@@ -3934,14 +4549,14 @@ declare class Slide implements ShapeHost {
3934
4549
  * carries its body text, `created` timestamp, marker position (EMU), its author
3935
4550
  * resolved through the deck-wide {@link Presentation.modernCommentAuthors}
3936
4551
  * registry (`@authorId` GUID → name/initials), and its reply thread nested under
3937
- * `replies`. Read-only — the writer authors the legacy schema; see
4552
+ * `replies`. Read-only: the writer authors the legacy schema; see
3938
4553
  * {@link Presentation.commentSchema} to tell which schema a deck uses.
3939
4554
  */
3940
4555
  get modernComments(): ModernComment[];
3941
4556
  /**
3942
4557
  * The slide's programmatic tags (`p:custDataLst/p:tags` on the slide part,
3943
4558
  * resolved to `ppt/tags/tagN.xml`) as `{ name, val }` string pairs, `[]` when it
3944
- * has none. Host/add-in metadata with no visible rendering and no writer —
4559
+ * has none. Host/add-in metadata with no visible rendering and no writer:
3945
4560
  * read-only, preserved byte-for-byte on round-trip. Deck-level tags are
3946
4561
  * {@link Presentation.tags}.
3947
4562
  */
@@ -3949,7 +4564,7 @@ declare class Slide implements ShapeHost {
3949
4564
  /**
3950
4565
  * The slide's effective background (`p:cSld/p:bg`), decoded into a typed
3951
4566
  * {@link SlideBackground}. Resolved through the inheritance chain: the slide's
3952
- * own `p:bg` wins; failing that the slideLayout's, then the slideMaster's — the
4567
+ * own `p:bg` wins; failing that the slideLayout's, then the slideMaster's. The
3953
4568
  * result's `source` records which supplied it. `null` when nothing in the chain
3954
4569
  * defines a background.
3955
4570
  *
@@ -3967,16 +4582,19 @@ declare class Slide implements ShapeHost {
3967
4582
  * `slide.slideNumber`, or added to a master defined with `slideNumber`; its geometry and run formatting
3968
4583
  * read off the returned {@link AutoShape} the same as any placeholder.
3969
4584
  *
3970
- * Scoped to the slide's *own* shape tree — a slide number inherited purely from
4585
+ * Scoped to the slide's *own* shape tree: a slide number inherited purely from
3971
4586
  * the master's `p:hf`/placeholder (with no shape on the slide) is a master-level
3972
4587
  * concern this getter does not resolve.
3973
4588
  */
3974
4589
  get slideNumberPlaceholder(): AutoShape | null;
3975
- /** The first top-level shape with the given drawing id (`p:cNvPr/@id`), or `undefined`. */
3976
- shapeById(id: number): AnyShape | undefined;
4590
+ /**
4591
+ * The first top-level shape with the given drawing id (`p:cNvPr/@id`), or `undefined`. Takes
4592
+ * `null`, as a shape's `id` reads when its `p:cNvPr` has no `@id`, and misses on it.
4593
+ */
4594
+ shapeById(id: number | null): AnyShape | undefined;
3977
4595
  /**
3978
4596
  * The first shape *anywhere* in the slide's shape tree with the given drawing id
3979
- * (`p:cNvPr/@id`), descending into groups — unlike {@link shapeById}, which scans
4597
+ * (`p:cNvPr/@id`), descending into groups, unlike {@link shapeById}, which scans
3980
4598
  * only top-level shapes. Walked pre-order (a group is visited before its children),
3981
4599
  * matching how the writer allocates ids. `undefined` when no shape carries that id.
3982
4600
  *
@@ -3985,14 +4603,15 @@ declare class Slide implements ShapeHost {
3985
4603
  * resolution ({@link Connector.startConnection}), which must
3986
4604
  * resolve a binding into a group that top-level {@link shapeById} cannot see.
3987
4605
  */
3988
- shapeByIdDeep(id: number): AnyShape | undefined;
4606
+ shapeByIdDeep(id: number | null): AnyShape | undefined;
3989
4607
  /** The first top-level shape with the given name (`p:cNvPr/@name`), or `undefined`. */
3990
4608
  shapeByName(name: string): AnyShape | undefined;
3991
4609
  /**
3992
4610
  * The first placeholder of the given type (`p:ph/@type`, e.g. `title`,
3993
4611
  * `ctrTitle`, `subTitle`, `body`), optionally narrowed by `idx`. Returns
3994
- * `undefined` when none match. Only `p:sp` shapes can be placeholders, so the
3995
- * result is an {@link AutoShape}.
4612
+ * `undefined` when none match. Only {@link AutoShape}s are searched: a filled
4613
+ * picture, table or chart placeholder is not found here, though its own
4614
+ * `placeholder` getter still reads it.
3996
4615
  */
3997
4616
  placeholder(type: string, idx?: string): AutoShape | undefined;
3998
4617
  /**
@@ -4017,7 +4636,7 @@ declare class Slide implements ShapeHost {
4017
4636
  * afterwards through {@link notesTextFrame}.
4018
4637
  *
4019
4638
  * The counterpart to the read side's `notesText`/`notesTextFrame`/`notesSlide`
4020
- * getters, and the way to annotate a slide that has **no notes part at all** —
4639
+ * getters, and the way to annotate a slide that has **no notes part at all**:
4021
4640
  * the state an `importSlide` without `{ importNotes: true }` leaves behind, and
4022
4641
  * the one a `notesTextFrame` edit cannot reach because there is no frame to
4023
4642
  * hand back. Calling it on a slide that already has notes replaces the body
@@ -4048,8 +4667,6 @@ declare class Slide implements ShapeHost {
4048
4667
  */
4049
4668
  nextShapeId(): number;
4050
4669
  }
4051
- //#endregion
4052
- //#region src/read/api/document-properties.d.ts
4053
4670
  /**
4054
4671
  * Decoded `docProps/core.xml`. Every field is optional (present only when the
4055
4672
  * element is). `created`/`modified`/`lastPrinted` are kept as the **raw W3CDTF
@@ -4083,7 +4700,7 @@ interface CoreProperties {
4083
4700
  lastPrinted?: string;
4084
4701
  }
4085
4702
  /**
4086
- * Decoded `docProps/app.xml` — the *extended* properties, which are the producer's own
4703
+ * Decoded `docProps/app.xml`: the *extended* properties, which are the producer's own
4087
4704
  * account of the deck rather than the author's metadata. Every field is optional (present
4088
4705
  * only when the element is).
4089
4706
  *
@@ -4094,14 +4711,14 @@ interface CoreProperties {
4094
4711
  * true, and `company` is the one this library's write API can set.
4095
4712
  */
4096
4713
  interface ExtendedProperties {
4097
- /** `<Application>` — the producing application, e.g. `Microsoft Office PowerPoint`. */
4714
+ /** `<Application>`: the producing application, e.g. `Microsoft Office PowerPoint`. */
4098
4715
  application?: string;
4099
- /** `<AppVersion>` — that application's version, in its own `major.minor` spelling (`16.0000`). */
4716
+ /** `<AppVersion>`: that application's version, in its own `major.minor` spelling (`16.0000`). */
4100
4717
  appVersion?: string;
4101
4718
  /** `<Company>` (the write-side `pptx.company`). */
4102
4719
  company?: string;
4103
4720
  /**
4104
- * `<TitlesOfParts>` — the flat `vt:lpstr` vector naming the deck's fonts, themes and slide
4721
+ * `<TitlesOfParts>`: the flat `vt:lpstr` vector naming the deck's fonts, themes and slide
4105
4722
  * titles in one list. It is the vector as written, NOT split by section: `<HeadingPairs>`
4106
4723
  * holds the counts that partition it, and this library does not read them, so the caller
4107
4724
  * that wants the slide titles alone has to pair the two itself.
@@ -4145,20 +4762,16 @@ declare function readExtendedProperties(opc: OpcPackage): ExtendedProperties;
4145
4762
  * `firstChild`/`getElements` helpers.
4146
4763
  */
4147
4764
  declare function readCustomProperties(opc: OpcPackage): CustomProperty[];
4148
- //#endregion
4149
- //#region src/read/api/ops/deck-target.d.ts
4150
4765
  /** The destination deck: just the package and its main part. `Presentation` satisfies it. */
4151
4766
  interface DeckTarget {
4152
4767
  readonly opc: OpcPackage;
4153
4768
  readonly presentationPart: Part;
4154
4769
  }
4155
- //#endregion
4156
- //#region src/read/api/ops/part-copy.d.ts
4157
4770
  /**
4158
4771
  * One import in progress: where parts are going, where they are coming from, and
4159
4772
  * what has already come across.
4160
4773
  *
4161
- * `source` and `registry` are one fact, not two — a registry maps partnames *of
4774
+ * `source` and `registry` are one fact, not two: a registry maps partnames *of
4162
4775
  * that package*, so pairing it with any other package silently returns partnames
4163
4776
  * for parts that were never copied. Holding them in a single value makes the
4164
4777
  * pairing a type invariant rather than a call-site convention; mint one with
@@ -4178,7 +4791,7 @@ interface ImportContext {
4178
4791
  * gets its own part even when the registry already holds a copy of it, which is
4179
4792
  * what lets one source page be imported more than once.
4180
4793
  *
4181
- * Both import entry points set it — {@link Presentation.importSlides} for the
4794
+ * Both import entry points set it: {@link Presentation.importSlides} for the
4182
4795
  * whole batch, {@link copySlidePart} for the single page of one
4183
4796
  * {@link Presentation.importSlide}. For the batch it carries a second meaning:
4184
4797
  * `slide → slide` relationships resolve only within the set, so an imported page
@@ -4189,7 +4802,7 @@ interface ImportContext {
4189
4802
  * as an output, and a map to *many* destinations would make every jump link
4190
4803
  * ambiguous. A batch asked for the same page N times therefore runs the
4191
4804
  * traversal N times, each round naming that page's Nth reserved partname and the
4192
- * other pages' first — see `importSlides` step 3.
4805
+ * other pages' first (see `importSlides` step 3).
4193
4806
  */
4194
4807
  readonly selection?: SelectionPlan;
4195
4808
  /**
@@ -4231,7 +4844,7 @@ interface PlannedRel {
4231
4844
  * it would throw, found before anything in the destination moves.
4232
4845
  *
4233
4846
  * This is what lets a refused import leave the deck byte-identical. The copy changes the deck as it
4234
- * goes — parts added, a master registered in `presentation.xml`, a layout linked into its master —
4847
+ * goes (parts added, a master registered in `presentation.xml`, a layout linked into its master),
4235
4848
  * so a failure it met halfway would leave all of that behind. An import therefore runs the same
4236
4849
  * traversal twice: first with a plan in its context, which throws what the copy would and writes
4237
4850
  * nothing, then for real. The dry run used to be a separate walk of the source, transcribed from the
@@ -4242,8 +4855,8 @@ interface PlannedRel {
4242
4855
  * A plan stands in for the destination package as a {@link CopyTarget}. It hands out the partnames
4243
4856
  * the copy will be given, keeps its own copy of each source's registry so a part it planned is found
4244
4857
  * again as the copy would find it, and remembers the notes master it would install in a deck that has
4245
- * none. Destination bookkeeping that adds no part — registering a master, linking a layout into it —
4246
- * is not recorded.
4858
+ * none. Destination bookkeeping that adds no part, such as registering a master or linking a layout
4859
+ * into it, is not recorded.
4247
4860
  */
4248
4861
  declare class CopyPlan implements CopyTarget {
4249
4862
  #private;
@@ -4269,12 +4882,8 @@ declare class CopyPlan implements CopyTarget {
4269
4882
  addPart(partName: string, contentType: string): void;
4270
4883
  relationshipsFor(from: string): Pick<Relationships, 'add' | 'addWithId'>;
4271
4884
  }
4272
- //#endregion
4273
- //#region src/read/api/ops/rescale.d.ts
4274
4885
  /** How an import's rescale maps the source canvas onto the destination's. */
4275
4886
  type RescaleMode = 'fit' | 'stretch';
4276
- //#endregion
4277
- //#region src/read/api/presentation.d.ts
4278
4887
  declare class Presentation {
4279
4888
  #private;
4280
4889
  readonly opc: OpcPackage;
@@ -4318,7 +4927,7 @@ declare class Presentation {
4318
4927
  /**
4319
4928
  * The deck's embedded font families (`p:embeddedFontLst` in `presentation.xml`),
4320
4929
  * `[]` when it embeds none. Each entry names the typeface and resolves every
4321
- * embedded face's `r:id` to the absolute partname of its `.fntdata` binary — the
4930
+ * embedded face's `r:id` to the absolute partname of its `.fntdata` binary: the
4322
4931
  * read counterpart to the write-side `pptx.embedFont` / `importSlide({ embedFonts })`
4323
4932
  * carry. An entry whose `p:font` has no `@typeface`, or a face whose `r:id` is
4324
4933
  * missing or dangling, is skipped (faithful degradation, no throw). Read-only.
@@ -4337,7 +4946,7 @@ declare class Presentation {
4337
4946
  * `ppt/authors.xml`), `[]` when the deck carries no modern comments. Unlike the
4338
4947
  * legacy {@link commentAuthors}, each entry is keyed by a GUID `id` (plus
4339
4948
  * `userId`/`providerId`); each slide's {@link Slide.modernComments} resolves its
4340
- * `@authorId` against this list. Read-only — the writer emits legacy comments.
4949
+ * `@authorId` against this list. Read-only: the writer emits legacy comments.
4341
4950
  */
4342
4951
  get modernCommentAuthors(): ModernCommentAuthor[];
4343
4952
  /**
@@ -4361,7 +4970,7 @@ declare class Presentation {
4361
4970
  * The deck's extended document properties (`docProps/app.xml`): the producing
4362
4971
  * application and its version, the company, and the flat `TitlesOfParts` vector.
4363
4972
  * `{}` when the deck carries no extended-properties part. The read counterpart of
4364
- * the write-side `pptx.company` setter — the only one of the four this library
4973
+ * the write-side `pptx.company` setter, the only one of the four this library
4365
4974
  * writes from a caller's value; the other three it states about itself.
4366
4975
  *
4367
4976
  * A deliberate subset of the part: see {@link ExtendedProperties} for why the
@@ -4379,7 +4988,7 @@ declare class Presentation {
4379
4988
  * The deck-level programmatic tags (`p:custDataLst/p:tags` on `presentation.xml`,
4380
4989
  * resolved to `ppt/tags/tagN.xml`) as `{ name, val }` string pairs, `[]` when the
4381
4990
  * deck carries none. These are add-in/host metadata with no visible rendering and
4382
- * no writer — read-only, preserved byte-for-byte on round-trip. Per-slide tags are
4991
+ * no writer. They are read-only, preserved byte-for-byte on round-trip. Per-slide tags are
4383
4992
  * {@link Slide.tags}.
4384
4993
  */
4385
4994
  get tags(): Tag[];
@@ -4396,7 +5005,7 @@ declare class Presentation {
4396
5005
  * charts, SmartArt diagrams and OLE embeddings, each with the subtree under it
4397
5006
  * (a chart's embedded workbook comes along; the image inside its user-shapes
4398
5007
  * drawing stays shared). PowerPoint refuses to open a deck where two slides
4399
- * resolve to one chart or diagram, so this is not tidiness — see
5008
+ * resolve to one chart or diagram, so this is not tidiness; see
4400
5009
  * `page-owned.ts` for the rule and the evidence behind it.
4401
5010
  */
4402
5011
  cloneSlide(index: number, options?: {
@@ -4407,7 +5016,7 @@ declare class Presentation {
4407
5016
  * `p:sldId` entry and the presentation→slide relationship are dropped, the slide
4408
5017
  * part and its `.rels` are deleted, and any part the slide *privately* owned
4409
5018
  * (its notes slide, slide-only media, charts/embeddings) that no remaining part
4410
- * references is pruned too — recursively. Shared deck chrome (layout, master,
5019
+ * references is pruned too, recursively. Shared deck chrome (layout, master,
4411
5020
  * theme, …) is never pruned, so the deck stays renderable; removing every slide
4412
5021
  * leaves a valid master/layout-only package (a template shell). The slide also
4413
5022
  * leaves every custom show and section it was in, which stay even when that
@@ -4421,9 +5030,9 @@ declare class Presentation {
4421
5030
  * Append a copy of `source.slides[index]` to this presentation and return it.
4422
5031
  *
4423
5032
  * Unlike {@link cloneSlide} (same-deck duplicate), this copies a slide across
4424
- * a package boundary: it brings the connected sub-graph the slide depends on —
4425
- * its `slideLayout` → `slideMaster` → `theme`, plus any media, charts, and
4426
- * embeddings — into this package under fresh partnames, rewriting every
5033
+ * a package boundary: it brings the connected sub-graph the slide depends on
5034
+ * (its `slideLayout` → `slideMaster` → `theme`, plus any media, charts, and
5035
+ * embeddings) into this package under fresh partnames, rewriting every
4427
5036
  * partname, relationship id, and content-type registration so the result is a
4428
5037
  * self-consistent OPC package. Parts of this (target) package that are not
4429
5038
  * touched stay byte-identical, matching `cloneSlide`'s fidelity contract.
@@ -4431,7 +5040,7 @@ declare class Presentation {
4431
5040
  * Only the layout(s) actually used by imported slides are copied; the imported
4432
5041
  * master's `p:sldLayoutIdLst` is pruned to exactly those, mirroring how
4433
5042
  * PowerPoint's "Reuse Slides" brings a slide across. Parts shared by repeated
4434
- * imports from the same source deck are copied once and reused — every part
5043
+ * imports from the same source deck are copied once and reused: every part
4435
5044
  * except the page itself. Importing the same source slide twice yields two
4436
5045
  * independent copies over one shared layout/master/theme, which is what lets a
4437
5046
  * deck show one page twice (verbatim, then edited).
@@ -4440,7 +5049,7 @@ declare class Presentation {
4440
5049
  * into the slide XML and the slide is bound to this deck's existing
4441
5050
  * master/layout; with `{ theme: 'restyle' }` the slide is bound to this deck's
4442
5051
  * master/layout with its theme references left symbolic, so it re-brands to the
4443
- * destination palette — see {@link ImportSlideOptions}.
5052
+ * destination palette. See {@link ImportSlideOptions}.
4444
5053
  *
4445
5054
  * By default the source slide size must equal this presentation's. Pass
4446
5055
  * `{ rescale: 'fit' | 'stretch' }` to rescale the imported geometry onto this
@@ -4457,7 +5066,7 @@ declare class Presentation {
4457
5066
  * Import selected pages from one or more loaded source presentations as one
4458
5067
  * batch. Each imported page lands at its `outputIndex` in the complete
4459
5068
  * destination slide list after the batch, and the returned array is parallel
4460
- * to `requests` — `result[i]` is the page `requests[i]` asked for, whatever
5069
+ * to `requests`: `result[i]` is the page `requests[i]` asked for, whatever
4461
5070
  * order the output positions were given in.
4462
5071
  *
4463
5072
  * Everything is checked before a single byte of this deck moves: every request
@@ -4470,13 +5079,13 @@ declare class Presentation {
4470
5079
  * The batch also decides what a `slide → slide` link means: an internal link
4471
5080
  * on a selected page must target another **selected** page (or one this deck
4472
5081
  * already contains via an earlier import from that source), and is rewritten
4473
- * to the fresh partname — importing page 3 of 10 does not drag pages 1–2
5082
+ * to the fresh partname. Importing page 3 of 10 does not drag pages 1–2
4474
5083
  * across as dependencies, and never strands the link. This mirrors
4475
5084
  * `appendSlides`' `import/unresolved-slide-link`, which the write side already
4476
5085
  * enforces for generator decks.
4477
5086
  *
4478
5087
  * One request is one output page, so naming the same source page in several
4479
- * requests is how you ask for several independent copies of it — the page part
5088
+ * requests is how you ask for several independent copies of it; the page part
4480
5089
  * is the one thing an import never shares, exactly as in {@link importSlide}.
4481
5090
  * Everything under it (layout, master, theme, media) is still copied once and
4482
5091
  * shared. Where such a page is the target of a `slide → slide` link, the link
@@ -4487,7 +5096,7 @@ declare class Presentation {
4487
5096
  * Speaker notes travel per request: `{ importNotes: true }` carries that page's
4488
5097
  * `notesSlide` part across, wired to the new page and bound to a single
4489
5098
  * `notesMaster` under the same 0..1 rule {@link importSlide} and
4490
- * {@link appendSlides} follow — the destination's own master wins when it has
5099
+ * {@link appendSlides} follow: the destination's own master wins when it has
4491
5100
  * one. Notes are part of the up-front dry run too, so a batch that would fail
4492
5101
  * carrying them is refused with the deck still byte-identical. A page named in
4493
5102
  * several requests gets its own copy of its notes each time, as of everything
@@ -4512,9 +5121,9 @@ declare class Presentation {
4512
5121
  importSlides(requests: readonly ImportSlidesRequest[]): Slide[];
4513
5122
  /**
4514
5123
  * Graft slide master(s) from another open package into this one and return what
4515
- * was copied. Unlike {@link importSlide} — which brings a master across only as
5124
+ * was copied. Unlike {@link importSlide}, which brings a master across only as
4516
5125
  * the dependency of an imported *slide* and prunes it to the one layout that
4517
- * slide uses — this copies a master together with its **whole** layout family
5126
+ * slide uses, this copies a master together with its **whole** layout family
4518
5127
  * and attaches it to no slide: the master and its layouts land in this deck's
4519
5128
  * layout gallery (PowerPoint's *Insert ▸ New Slide* / *Layout* picker) without
4520
5129
  * changing any existing slide.
@@ -4544,7 +5153,7 @@ declare class Presentation {
4544
5153
  importSlideMasters(source: Presentation, options?: ImportSlideMastersOptions): ImportedSlideMaster[];
4545
5154
  /**
4546
5155
  * The deck's slide masters, in `p:sldMasterIdLst` order, as modeled
4547
- * {@link SlideMaster}s — the typed read model over the shared chrome (each
5156
+ * {@link SlideMaster}s: the typed read model over the shared chrome (each
4548
5157
  * master's colour map, theme, placeholders, and the layouts built on it). Walk
4549
5158
  * `pres.masters()[i].layouts` for the rich layout model, or use {@link layouts}
4550
5159
  * for the flat {@link LayoutHandle} gallery {@link appendSlides} binds to.
@@ -4552,7 +5161,7 @@ declare class Presentation {
4552
5161
  */
4553
5162
  masters(): SlideMaster[];
4554
5163
  /**
4555
- * The deck's slide layouts, in master then layout order — the gallery a new
5164
+ * The deck's slide layouts, in master then layout order: the gallery a new
4556
5165
  * slide can bind to. Each {@link LayoutHandle} addresses one layout for
4557
5166
  * {@link appendSlides}; the `name` is its `p:cSld@name`. Read-only enumeration:
4558
5167
  * it copies nothing and leaves the package byte-identical.
@@ -4561,12 +5170,12 @@ declare class Presentation {
4561
5170
  /**
4562
5171
  * Append generator-produced slides onto this deck, binding each to an existing
4563
5172
  * layout, and return the new {@link Slide}s. This is the hybrid
4564
- * "generate-onto-existing" path: the deck's masters, layouts, theme — and every
4565
- * other untouched part — stay **byte-identical** (only `presentation.xml`, its
5173
+ * "generate-onto-existing" path: the deck's masters, layouts, theme, and every
5174
+ * other untouched part stay **byte-identical** (only `presentation.xml`, its
4566
5175
  * `.rels`, `[Content_Types].xml`, and the freshly-added slide/media parts
4567
5176
  * change), because the existing chrome is never regenerated.
4568
5177
  *
4569
- * `source` is any slide producer (a `TsPptx` instance); its authored slides
5178
+ * `source` is any slide producer (a `PptxTs` instance); its authored slides
4570
5179
  * are serialized via {@link SlideSource.extractSlides} and spliced in under
4571
5180
  * fresh partnames, with each slide's `slideLayout` relationship pointed at the
4572
5181
  * layout named by `options.layout` and its image/hyperlink relationships rebuilt
@@ -4576,13 +5185,13 @@ declare class Presentation {
4576
5185
  * Charts and internal slide-to-slide hyperlinks are carried across: chart parts
4577
5186
  * (chart XML + `.rels` + embedded workbook) are injected under fresh names, and a
4578
5187
  * `slide:N` link is repointed at the Nth appended slide's new partname. A chartEx
4579
- * (Office 2016 — waterfall, funnel, treemap, ...) chart carries too, as its own
5188
+ * (Office 2016: waterfall, funnel, treemap, ...) chart carries too, as its own
4580
5189
  * `chartEx{N}.xml` part behind the MS chartEx rel, with the style and color-style
4581
5190
  * sidecars PowerPoint requires alongside it.
4582
5191
  *
4583
5192
  * The generator's presentation-level embedded fonts (`pptx.embedFont`) are also
4584
5193
  * carried into this deck and merged into its `p:embeddedFontLst`, de-duped by
4585
- * typeface + face slot — so author-side embedded fonts survive the append onto a
5194
+ * typeface + face slot, so author-side embedded fonts survive the append onto a
4586
5195
  * template that may itself already embed fonts.
4587
5196
  *
4588
5197
  * Embedded audio/video is carried too: the media part backs the ECMA audio/video rel
@@ -4593,22 +5202,26 @@ declare class Presentation {
4593
5202
  * Speaker notes ride across too: a slide authored with `addNotes` gets a `notesSlide`
4594
5203
  * part wired back to it, with its hyperlink rels preserved. A notes slide must bind to
4595
5204
  * a notes master, and a template commonly has none, so the generator's is installed
4596
- * (with the theme its `.rels` needs) — but only when this deck has none of its own, so
5205
+ * (with the theme its `.rels` needs), but only when this deck has none of its own, so
4597
5206
  * an existing notes master and its styling always win.
4598
5207
  *
5208
+ * Review comments (`addComment`) ride across as a comments part per slide. Their
5209
+ * authors merge into this deck's `commentAuthors.xml` by name and initials: an author
5210
+ * the deck already has keeps its id and continues its numbering, and a new one is added.
5211
+ *
4599
5212
  * Limitations:
4600
5213
  * - An internal link to a source slide outside the appended batch throws (its
4601
5214
  * target has no counterpart in the destination).
4602
5215
  * - Appended slides are concrete absolute-positioned content with no placeholder
4603
5216
  * inheritance from the bound layout; the binding governs theme/`clrMap`
4604
5217
  * resolution and the "based on" link, not placeholder geometry. Author with
4605
- * concrete colours — any `schemeClr` re-resolves against the destination theme.
5218
+ * concrete colours: any `schemeClr` re-resolves against the destination theme.
4606
5219
  * - Source and destination slide sizes must match (no geometry rescale).
4607
5220
  */
4608
5221
  appendSlides(source: SlideSource, options: AppendSlidesOptions): Promise<Slide[]>;
4609
5222
  /**
4610
- * Copy one shape — an autoshape, picture, table/chart graphic frame, connector,
4611
- * or group — from `source.shapes[shapeIndex]` onto `target`, returning the new
5223
+ * Copy one shape (an autoshape, picture, table/chart graphic frame, connector,
5224
+ * or group) from `source.shapes[shapeIndex]` onto `target`, returning the new
4612
5225
  * {@link Shape}. `target` must be a slide of *this* presentation; `source` may
4613
5226
  * belong to any open presentation.
4614
5227
  *
@@ -4619,7 +5232,7 @@ declare class Presentation {
4619
5232
  * so they cannot collide with the host. With `theme: 'preserve'` (default) the
4620
5233
  * shape's theme references are baked to literals against the *source* theme so it
4621
5234
  * renders the same on a foreign host; `restyle` leaves them symbolic to re-brand;
4622
- * `copy` brings the XML across untouched — see {@link ImportShapeOptions}.
5235
+ * `copy` brings the XML across untouched. See {@link ImportShapeOptions}.
4623
5236
  *
4624
5237
  * Differing slide sizes need `{ rescale }` (see {@link ImportShapeOptions.rescale});
4625
5238
  * a lifted `preserve` placeholder is baked self-contained and demoted to a plain
@@ -4645,7 +5258,7 @@ declare class Presentation {
4645
5258
  insertSlidePart(newPart: Part, at?: number): Slide;
4646
5259
  /**
4647
5260
  * @internal The parts whose geometry a rescale has already rewritten, and in which mode.
4648
- * Exposed for `presentation-imports.ts` as a live map the callee adds to — the memo is what
5261
+ * Exposed for `presentation-imports.ts` as a live map the callee adds to. The memo is what
4649
5262
  * makes a layout or master shared across repeated imports from one source scale exactly
4650
5263
  * once, so like the copy registry it has to outlive the call that fills it.
4651
5264
  */
@@ -4653,7 +5266,7 @@ declare class Presentation {
4653
5266
  /**
4654
5267
  * @internal Open an import out of `source`: this deck as the destination, paired with
4655
5268
  * the copy registry for that package (created on first use). The registry is held on
4656
- * the class rather than in the context because it must outlive any one call — that is
5269
+ * the class rather than in the context because it must outlive any one call: that is
4657
5270
  * what makes a second import from the same source reuse the layout, master, theme, and
4658
5271
  * media it already copied instead of duplicating them, and it is why the import bodies
4659
5272
  * in `presentation-imports.ts` call back here rather than carrying it with them.
@@ -4662,8 +5275,6 @@ declare class Presentation {
4662
5275
  /** Re-emit the package; untouched parts stay byte-identical (see `OpcPackage.save`). */
4663
5276
  save(): Promise<Uint8Array>;
4664
5277
  }
4665
- //#endregion
4666
- //#region src/read/api/presentation-types.d.ts
4667
5278
  /** Slide dimensions, in both EMU (the OOXML unit) and inches. */
4668
5279
  interface SlideSize {
4669
5280
  widthEmu: number;
@@ -4679,7 +5290,7 @@ interface SlideSize {
4679
5290
  * pull their bytes without hand-parsing the presentation part or its rels.
4680
5291
  */
4681
5292
  interface EmbeddedFontInfo {
4682
- /** `p:font/@typeface` — the family name PowerPoint binds the embed to. */
5293
+ /** `p:font/@typeface`: the family name PowerPoint binds the embed to. */
4683
5294
  typeface: string;
4684
5295
  /** `p:font/@panose`, or `null` when the entry declares none. */
4685
5296
  panose: string | null;
@@ -4701,7 +5312,7 @@ interface ImportSlideOptions {
4701
5312
  * - `'copy'` (default): bring the slide's own `slideLayout → slideMaster →
4702
5313
  * theme` subgraph across, so the slide renders byte-for-byte as authored.
4703
5314
  * A deck stitched from N sources then carries N themes/masters.
4704
- * - `'preserve'`: *flatten then attach* — bake the source theme's colours and
5315
+ * - `'preserve'`: *flatten then attach*. Bake the source theme's colours and
4705
5316
  * style-matrix fills into the slide XML (so its pixels do not change), then
4706
5317
  * bind it to this deck's existing master/layout instead of importing the
4707
5318
  * source theme. The result is a single-theme file whose imported slides are
@@ -4720,7 +5331,7 @@ interface ImportSlideOptions {
4720
5331
  * master `preserve` deliberately drops. Set {@link carryMasterGraphics} to
4721
5332
  * bake them onto the slide instead.
4722
5333
  * - `'restyle'`: re-brand to *this* deck. Rebind the slide to this deck's
4723
- * master/layout exactly like `preserve` but **skip the flatten** — leave every
5334
+ * master/layout exactly like `preserve` but **skip the flatten**: leave every
4724
5335
  * `a:schemeClr`, style-matrix ref (`fillRef`/`lnRef`/`effectRef`/`fontRef`),
4725
5336
  * and `p:bg` `bgRef` symbolic so they re-resolve against the *destination*
4726
5337
  * theme. The slide keeps its geometry, text, and structure but adopts this
@@ -4732,7 +5343,7 @@ interface ImportSlideOptions {
4732
5343
  * Anything the source authored as a literal `a:srgbClr` has no theme reference
4733
5344
  * to re-resolve and stays exactly that colour, so a slide with a baked literal
4734
5345
  * palette re-brands little or nothing. Use `restyle` for slides built against
4735
- * theme colours/style matrices, not hardcoded RGB — or set {@link remapLiterals}
5346
+ * theme colours/style matrices, not hardcoded RGB, or set {@link remapLiterals}
4736
5347
  * to force-remap literals and copy table styles. Re-brand is inherently a
4737
5348
  * visual change (a source `accent1` light-on-dark can invert against a dark
4738
5349
  * destination `accent1`), so its output needs visual QA. A restyled table
@@ -4746,11 +5357,11 @@ interface ImportSlideOptions {
4746
5357
  * slides whose palette is partly hardcoded. When `true` it does two things the
4747
5358
  * plain re-brand cannot:
4748
5359
  *
4749
- * - **Literal colours** — every literal `a:srgbClr` equal to a *source*-theme
5360
+ * - **Literal colours**: every literal `a:srgbClr` equal to a *source*-theme
4750
5361
  * `clrScheme` slot is rewritten back to a symbolic `a:schemeClr` (routed through
4751
5362
  * the source `clrMap`), so it re-resolves against this deck's theme instead of
4752
5363
  * staying its authored RGB. A literal matching no source slot is left untouched.
4753
- * - **Table styles** — any `@tableStyleId` the slide references is copied from the
5364
+ * - **Table styles**: any `@tableStyleId` the slide references is copied from the
4754
5365
  * source `tableStyles.xml` into this deck's (same id, idempotent, leaving an id
4755
5366
  * the destination already defines alone), so a restyled table keeps its style
4756
5367
  * instead of falling back. The copied definition is itself symbolic, so it
@@ -4763,13 +5374,13 @@ interface ImportSlideOptions {
4763
5374
  /**
4764
5375
  * `preserve`/`restyle` modes only. When `true`, bake the source
4765
5376
  * `slideLayout`/`slideMaster` shape-tree decorations (everything on those shape
4766
- * trees *except* placeholders — logos, accent curves, footers drawn as shapes)
5377
+ * trees *except* placeholders: logos, accent curves, footers drawn as shapes)
4767
5378
  * onto the imported slide, behind its own content, so master/layout branding
4768
5379
  * survives the rebind to this deck's master. Their media are copied across.
4769
5380
  *
4770
5381
  * Under `preserve` the carried decorations' theme references are flattened like
4771
5382
  * the slide's own content; under `restyle` they are left symbolic and so
4772
- * re-brand to the destination palette along with the slide — note a carried
5383
+ * re-brand to the destination palette along with the slide. Note that a carried
4773
5384
  * source logo could recolour unexpectedly under a different palette.
4774
5385
  *
4775
5386
  * Off by default: it raises fidelity for cover/closer/divider slides at the
@@ -4780,7 +5391,7 @@ interface ImportSlideOptions {
4780
5391
  carryMasterGraphics?: boolean;
4781
5392
  /**
4782
5393
  * Zero-based insert position in `p:sldIdLst` (deck order). `0` makes the
4783
- * imported slide first; an `at` past the current slide count — or omitting it —
5394
+ * imported slide first; an `at` past the current slide count, or omitting it,
4784
5395
  * appends. Use it to place brand bookends (cover at `0`, closer appended)
4785
5396
  * around generator-authored interior slides regardless of import order.
4786
5397
  */
@@ -4788,14 +5399,14 @@ interface ImportSlideOptions {
4788
5399
  /**
4789
5400
  * Carry the *source deck's* embedded fonts (`p:embeddedFontLst` in its
4790
5401
  * `presentation.xml`) into this deck, so an imported slide that renders with an
4791
- * embedded face keeps it on machines that lack the font. Off by default —
5402
+ * embedded face keeps it on machines that lack the font. Off by default:
4792
5403
  * fonts live on the presentation, not the slide, so they are only worth copying
4793
5404
  * when you want the embed to travel.
4794
5405
  *
4795
5406
  * The font binary parts are copied under fresh `/ppt/fonts/` names (deduped via
4796
5407
  * the per-source copy registry, so repeated imports copy each face once), the
4797
5408
  * `application/x-fontdata` Default is added, and entries are merged into this
4798
- * deck's `p:embeddedFontLst` — de-duplicated by `typeface` + face slot, so a
5409
+ * deck's `p:embeddedFontLst`, de-duplicated by `typeface` + face slot, so a
4799
5410
  * face this deck already embeds is reused rather than duplicated. The carry is a
4800
5411
  * whole-deck operation (it copies *all* the source's embedded fonts, not just the
4801
5412
  * faces this one slide uses), since the source list does not record which slide
@@ -4815,7 +5426,7 @@ interface ImportSlideOptions {
4815
5426
  * distorts shapes and cannot faithfully reposition rotated shapes. Matches
4816
5427
  * "Maximize".
4817
5428
  *
4818
- * Only *geometry* is rescaled — every top-level shape/group/graphicFrame
5429
+ * Only *geometry* is rescaled: every top-level shape/group/graphicFrame
4819
5430
  * transform (`a:off`/`a:ext`) and table grid (`a:gridCol@w`, `a:tr@h`). Font
4820
5431
  * sizes, line widths, and other absolute sizes are left as authored, so heavy
4821
5432
  * down-scaling can leave text overflowing its (now smaller) box. In `copy` mode
@@ -4855,12 +5466,12 @@ interface ImportShapeOptions {
4855
5466
  * neither re-resolves against the host's placeholder of the same type/idx nor
4856
5467
  * collides with it. The safe default for composing across decks.
4857
5468
  * - `'restyle'`: leave the shape's theme references symbolic so it re-brands to
4858
- * the host theme. Only *symbolic* colours re-brand — literal `a:srgbClr` the
5469
+ * the host theme. Only *symbolic* colours re-brand; literal `a:srgbClr` the
4859
5470
  * source baked in stays put (same limitation as `importSlide` restyle).
4860
5471
  * - `'copy'`: bring the shape's XML across untouched; only sane when the host
4861
5472
  * already shares the source theme.
4862
5473
  *
4863
- * Unlike a slide import this never runs the slide-scoped background passes — a
5474
+ * Unlike a slide import this never runs the slide-scoped background passes: a
4864
5475
  * background belongs to a slide, not to a composed shape.
4865
5476
  */
4866
5477
  theme?: 'preserve' | 'restyle' | 'copy';
@@ -4884,13 +5495,13 @@ interface ImportShapeOptions {
4884
5495
  * shape's geometry onto this deck's canvas instead (mirrors
4885
5496
  * {@link ImportSlideOptions.rescale}, scoped to one shape):
4886
5497
  *
4887
- * - `'fit'` (or `true`): uniform scale by `min(sx, sy)`, slack centered — the
5498
+ * - `'fit'` (or `true`): uniform scale by `min(sx, sy)`, slack centered. The
4888
5499
  * shape keeps its aspect ratio (circles stay circles, rotations hold) and
4889
5500
  * lands at the position it would occupy on a centered copy of the source
4890
5501
  * canvas. Matches PowerPoint's "Ensure Fit".
4891
5502
  * - `'stretch'`: independent per-axis scale; distorts. Matches "Maximize".
4892
5503
  *
4893
- * Only *geometry* is rescaled — the shape/group/graphicFrame transform
5504
+ * Only *geometry* is rescaled: the shape/group/graphicFrame transform
4894
5505
  * (`a:off`/`a:ext`) and any table grid (`a:gridCol@w`, `a:tr@h`). Font sizes,
4895
5506
  * line widths, and other absolute sizes are left as authored, so heavy
4896
5507
  * down-scaling can leave text overflowing its (now smaller) box. Explicit
@@ -4905,7 +5516,7 @@ interface ImportShapeOptions {
4905
5516
  * click-group(s) and `<p:bldP>` are copied into the destination `p:timing`
4906
5517
  * (created if absent), their `spid` references remapped to the shape's new id and
4907
5518
  * their `<p:cTn>` ids renumbered to stay collision-free, and appended after any
4908
- * existing build — mirroring how PowerPoint merges a pasted shape's animation
5519
+ * existing build, mirroring how PowerPoint merges a pasted shape's animation
4909
5520
  * (see the `import-animation-merge` oracle). @default false
4910
5521
  */
4911
5522
  carryAnimation?: boolean;
@@ -4934,7 +5545,7 @@ interface ImportSlideMastersOptions {
4934
5545
  /**
4935
5546
  * Require the source and destination slide sizes to match (default `true`).
4936
5547
  * A grafted master is shipped into the layout gallery, not applied to existing
4937
- * slides — but a layout authored at a different canvas size shows up mis-scaled
5548
+ * slides, but a layout authored at a different canvas size shows up mis-scaled
4938
5549
  * in that gallery, so the guard is on by default. Pass `false` to graft anyway.
4939
5550
  */
4940
5551
  requireEqualSize?: boolean;
@@ -4942,15 +5553,15 @@ interface ImportSlideMastersOptions {
4942
5553
  * Carry the *source deck's* embedded fonts (`p:embeddedFontLst` in its
4943
5554
  * `presentation.xml`) into this deck, so a slide later bound to a grafted layout
4944
5555
  * keeps that layout's embedded faces on machines that lack the font locally.
4945
- * Off by default — fonts live on the presentation, not the master, and copying
4946
- * them can add megabytes — so they are only worth carrying when you want the
5556
+ * Off by default. Fonts live on the presentation, not the master, and copying
5557
+ * them can add megabytes, so they are only worth carrying when you want the
4947
5558
  * embed to travel with the gallery.
4948
5559
  *
4949
5560
  * Semantics are identical to {@link ImportSlideOptions.embedFonts}: binaries are
4950
5561
  * copied under fresh `/ppt/fonts/` names (deduped via the per-source copy
4951
5562
  * registry, so a re-call carries each face once), the `application/x-fontdata`
4952
5563
  * Default is added, and entries merge into this deck's `p:embeddedFontLst`
4953
- * de-duplicated by `typeface` + face slot. The carry is a whole-deck operation —
5564
+ * de-duplicated by `typeface` + face slot. The carry is a whole-deck operation:
4954
5565
  * it copies *all* the source's embedded fonts, not only the faces the grafted
4955
5566
  * masters use, since the source list does not record which face belongs to which
4956
5567
  * master.
@@ -4964,16 +5575,16 @@ interface ImportSlideMastersOptions {
4964
5575
  * only adding new ones, so it is opt-in like {@link embedFonts}.
4965
5576
  *
4966
5577
  * Without it a grafted master's layouts arrive but its table styling does not, and
4967
- * a new table falls back to whatever default this deck carries — for a generated
5578
+ * a new table falls back to whatever default this deck carries: for a generated
4968
5579
  * deck, a stub whose default is the standard *Medium Style 2 - Accent 1*. The
4969
5580
  * mismatch is visible: the same table renders in a different accent than it would
4970
5581
  * in the source deck.
4971
5582
  *
4972
5583
  * Styles union by `styleId` (a style this deck already defines wins, so a re-call
4973
- * is idempotent), while `a:tblStyleLst@def` — the default table style — is
5584
+ * is idempotent), while `a:tblStyleLst@def` (the default table style) is
4974
5585
  * **source-wins**. Carrying the styles without the `def` would not fix the
4975
5586
  * mismatch: the standard default GUID is one most templates *also* define, so the
4976
- * default would still resolve to the wrong style. The carry is whole-deck — it
5587
+ * default would still resolve to the wrong style. The carry is whole-deck: it
4977
5588
  * copies *all* the source's table styles, not only those the grafted masters use,
4978
5589
  * since `tableStyles.xml` does not record which style belongs to which master.
4979
5590
  * @default false
@@ -4985,7 +5596,7 @@ interface ImportSlideMastersOptions {
4985
5596
  * leads is a statement about what the deck *is*, so it is the caller's call rather
4986
5597
  * than a side effect of grafting.
4987
5598
  *
4988
- * `p:sldMasterIdLst` order is not part of theme resolution — a slide resolves
5599
+ * `p:sldMasterIdLst` order is not part of theme resolution: a slide resolves
4989
5600
  * through its own layout's master, so this changes no existing slide's appearance.
4990
5601
  * What it changes is the deck's identity in PowerPoint's UI: the list's first entry
4991
5602
  * becomes `Designs(1)`, which is the theme the Design tab shows and the one
@@ -5017,7 +5628,7 @@ interface LayoutHandle {
5017
5628
  * One authored slide, extracted from a generator for injection into an existing
5018
5629
  * package. The slide body XML references its media/hyperlinks by relationship id
5019
5630
  * only, so {@link Presentation.appendSlides} preserves each `rId` and only
5020
- * repoints its target — see {@link SlideSource}.
5631
+ * repoints its target (see {@link SlideSource}).
5021
5632
  */
5022
5633
  interface ExtractedSlide {
5023
5634
  /** Standalone `<p:sld>` part body (XML declaration + namespaces included). */
@@ -5047,26 +5658,52 @@ interface ExtractedSlide {
5047
5658
  }>;
5048
5659
  /**
5049
5660
  * Embedded audio/video the body references. Each item is one media binary backed
5050
- * by two rels sharing a Target — the ECMA `audio`/`video` rel (`mediaRid`) and the
5051
- * MS-2007 `media` rel (`msMediaRid`) — plus a separate preview image rel
5661
+ * by two rels sharing a Target, the ECMA `audio`/`video` rel (`mediaRid`) and the
5662
+ * MS-2007 `media` rel (`msMediaRid`), plus a separate preview image rel
5052
5663
  * (`previewRid`). {@link Presentation.appendSlides} reproduces this rel graph.
5053
5664
  */
5054
5665
  avMedia: AvMediaItem[];
5055
5666
  /**
5056
5667
  * Online (external-link) video the body references. Each item is two *external*
5057
- * rels sharing one link Target — the ECMA `video` rel (`mediaRid`) and the MS-2007
5058
- * `media` rel (`msMediaRid`) — with **no** media binary part. The poster frame is a
5668
+ * rels sharing one link Target, the ECMA `video` rel (`mediaRid`) and the MS-2007
5669
+ * `media` rel (`msMediaRid`), with **no** media binary part. The poster frame is a
5059
5670
  * normal image rel carried by {@link media}. {@link Presentation.appendSlides}
5060
5671
  * wires the two external rels without reserving a media part or content type.
5061
5672
  */
5062
5673
  onlineMedia: OnlineMediaItem[];
5063
5674
  /**
5064
5675
  * The slide's speaker notes, or `undefined` when it has none. Carried as a ready
5065
- * `<p:notes>` part body plus its external hyperlink rels;
5676
+ * `<p:notes>` part body plus its hyperlink and slide-link rels;
5066
5677
  * {@link Presentation.appendSlides} creates the notes part, wires it to the appended
5067
5678
  * slide, and binds it to a notes master (see {@link ExtractedSlides.notesMaster}).
5068
5679
  */
5069
5680
  notes?: ExtractedNotes;
5681
+ /**
5682
+ * The transition's start sound (`p:sndAc/p:stSnd/p:snd`), or `undefined` when the slide has
5683
+ * none. One audio part behind an `audio` rel, keyed by the `rId` the body's `p:snd r:embed`
5684
+ * uses. {@link Presentation.appendSlides} adds the part and the rel.
5685
+ */
5686
+ transitionSound?: {
5687
+ rId: number;
5688
+ bytes: Uint8Array;
5689
+ extn: string;
5690
+ contentType: string;
5691
+ };
5692
+ /**
5693
+ * The slide's legacy review comments, as `addComment` stored them (`x`/`y` in inches), or
5694
+ * `undefined` when it has none. Nothing in {@link xml} names them: they live in a comments part
5695
+ * of their own, under authors in the deck-wide `commentAuthors.xml`.
5696
+ * {@link Presentation.appendSlides} creates the part and merges the authors into the
5697
+ * destination's registry.
5698
+ */
5699
+ comments?: Array<{
5700
+ author: string;
5701
+ initials: string;
5702
+ text: string;
5703
+ x: number;
5704
+ y: number;
5705
+ date?: string;
5706
+ }>;
5070
5707
  }
5071
5708
  /** One slide's speaker notes, extracted for {@link Presentation.appendSlides}. */
5072
5709
  interface ExtractedNotes {
@@ -5075,21 +5712,29 @@ interface ExtractedNotes {
5075
5712
  /**
5076
5713
  * External hyperlink rels the notes body references, keyed by the `rId` used in
5077
5714
  * {@link xml}. Notes rels reserve `rId1` for the notes master and `rId2` for the
5078
- * slide, so these start at `rId3`. Notes support external `url` links only.
5715
+ * slide, so these start at `rId3`.
5079
5716
  */
5080
5717
  hyperlinks: Array<{
5081
5718
  rId: number;
5082
5719
  target: string;
5083
5720
  }>;
5721
+ /**
5722
+ * Jumps from a notes run to another slide, as {@link ExtractedSlide.slideLinks} holds them for the
5723
+ * body. Their ids share the numbering of {@link hyperlinks}. Absent means none.
5724
+ */
5725
+ slideLinks?: Array<{
5726
+ rId: number;
5727
+ sourceSlideNumber: number;
5728
+ }>;
5084
5729
  }
5085
5730
  /**
5086
5731
  * One chart extracted for {@link Presentation.appendSlides}, keyed by the `rId` the slide
5087
5732
  * body uses to reference it.
5088
5733
  *
5089
5734
  * A classic (2007, `c:chartSpace`) chart is one part plus its embedded workbook. A chartEx
5090
- * (Office 2016 — waterfall, funnel, treemap, ...) chart is a different part in a different
5735
+ * (Office 2016: waterfall, funnel, treemap, ...) chart is a different part in a different
5091
5736
  * namespace, reached through a different relationship type, and PowerPoint reports it as
5092
- * corrupt without its two style sidecars — so {@link chartEx} carries them and its presence
5737
+ * corrupt without its two style sidecars, so {@link chartEx} carries them and its presence
5093
5738
  * is what tells the two shapes apart.
5094
5739
  */
5095
5740
  interface ExtractedChart {
@@ -5099,10 +5744,17 @@ interface ExtractedChart {
5099
5744
  chartXml: string;
5100
5745
  /** The chart's embedded `.xlsx` workbook, the data source PowerPoint opens on edit. */
5101
5746
  embeddingBytes: Uint8Array;
5747
+ /** The pictures a chart or plot area's picture fill paints, keyed by the `rId` used in {@link chartXml}. */
5748
+ pictures?: Array<{
5749
+ rId: number;
5750
+ bytes: Uint8Array;
5751
+ extn: string;
5752
+ contentType: string;
5753
+ }>;
5102
5754
  /**
5103
5755
  * Present only for a chartEx chart, and then always with both sidecars. A chartEx part
5104
5756
  * *requires* a chart-style and a color-style part or PowerPoint reports the deck as
5105
- * corrupt (`0x80070570`) — schema-valid but unopenable — so these are not optional and
5757
+ * corrupt (`0x80070570`), schema-valid but unopenable, so these are not optional and
5106
5758
  * {@link Presentation.appendSlides} injects them alongside the chart part.
5107
5759
  */
5108
5760
  chartEx?: {
@@ -5159,10 +5811,10 @@ interface ExtractedSlides {
5159
5811
  * A notes master to fall back on, present only when at least one slide carries notes.
5160
5812
  *
5161
5813
  * A notes slide must bind to a notes master, and a destination template often has
5162
- * none — a deck authored without speaker notes carries no `notesMaster` part. So the
5814
+ * none: a deck authored without speaker notes carries no `notesMaster` part. So the
5163
5815
  * generator's own notes master rides along, and {@link Presentation.appendSlides}
5164
5816
  * installs it (with its theme) **only** when the destination has none. When the
5165
- * destination already has one, it wins and this is discarded — matching the
5817
+ * destination already has one, it wins and this is discarded, matching the
5166
5818
  * `importNotes` policy, where the destination's notes styling also wins.
5167
5819
  */
5168
5820
  notesMaster?: {
@@ -5171,7 +5823,7 @@ interface ExtractedSlides {
5171
5823
  };
5172
5824
  }
5173
5825
  /**
5174
- * Structural view of a slide producer (a `TsPptx` instance satisfies this).
5826
+ * Structural view of a slide producer (a `PptxTs` instance satisfies this).
5175
5827
  * Kept structural so the read subsystem never imports the generator at runtime.
5176
5828
  */
5177
5829
  interface SlideSource {
@@ -5208,7 +5860,7 @@ interface ImportSlidesRequest {
5208
5860
  * the slide copy drops the `notesSlide` relationship, so the imported page
5209
5861
  * arrives without notes.
5210
5862
  *
5211
- * Per request rather than per batch because a stitch mixes sources — the
5863
+ * Per request rather than per batch because a stitch mixes sources: the
5212
5864
  * notes of a library's cover page are worth carrying where a scratch deck's
5213
5865
  * are not. The deck-wide half of the policy is not per request: a
5214
5866
  * presentation holds at most one `notesMaster`, so the destination's own is
@@ -5254,6 +5906,5 @@ interface FromTemplateOptions {
5254
5906
  */
5255
5907
  keepTemplateContentType?: boolean;
5256
5908
  }
5257
- //#endregion
5258
- export { isGroupShape as $, ConnectionSite as $t, TransitionInput as A, EffectiveColor as An, Connector as At, NotesPlaceholder as B, BulletStyle as Bt, readCoreProperties as C, PlaceholderRef as Cn, Chart as Ct, AddTextBoxOptions as D, readColorRef as Dn, ChartLegend as Dt, AddPictureOptions as E, StyleFontRef as En, ChartFill as Et, Comment as F, AutofitMode as Ft, Theme as G, TextInheritance as Gt, Placeholder as H, LineSpacing as Ht, CommentAuthor as I, BodyProperties as It, AnyShape as J, TableConditionFlags as Jt, ThemeFontFace as K, ResolvedTableStyle as Kt, CommentSchema as L, TextFrame as Lt, TransitionSpeed as M, ColorContext as Mn, AutoShape as Mt, Tag as N, ThemeContext as Nn, Shape as Nt, Slide as O, resolveColorElement as On, ChartLine as Ot, readTagsForPart as P, ShapeHost as Pt, isGraphicFrame as Q, ChildFrame as Qt, ModernComment as R, Paragraph as Rt, ExtendedProperties as S, GeometrySource as Sn, AxisNumberFormat as St, readExtendedProperties as T, ResolvedFrame as Tn, ChartDataLabels as Tt, SlideLayout as U, Run as Ut, NotesSlide as V, InheritedRunProps as Vt, SlideMaster as W, TextContext as Wt, isAutoShape as X, AbsoluteFrame as Xt, GroupShape as Y, Hyperlink as Yt, isConnector as Z, AbsoluteFrameFailure as Zt, SlideSize as _, PictureFill as _n, ChartEx as _t, ExtractedChart as a, LineEnd as an, CellBorders as at, CoreProperties as b, GradientStop as bn, ChartExLegend as bt, ExtractedSlides as c, Recolor as cn, TableCellBorderEdit as ct, ImportSlideMastersOptions as d, SoftEdge as dn, DiagramConnection as dt, CustomGeometry as en, isPicture as et, ImportSlideOptions as f, BackgroundFill as fn, DiagramConnectionType as ft, OnlineMediaItem as g, FillRect as gn, DiagramPointType as gt, LayoutHandle as h, PatternFill as hn, DiagramPoint as ht, EmbeddedFontInfo as i, InnerShadow as in, CellBorder as it, TransitionSoundInfo as j, applyColorTransforms as jn, Picture as jt, TransitionInfo as k, ColorTransform as kn, ChartSeries as kt, FromTemplateOptions as l, Reflection as ln, TableCellEdge as lt, ImportedSlideMaster as m, SlideBackground as mn, DiagramNode as mt, AvMediaItem as n, GeometryCommand as nn, Table as nt, ExtractedNotes as o, LineEnds as on, CellThreeD as ot, ImportSlidesRequest as p, BackgroundSource as pn, DiagramDrawnShape as pt, ThemeFontScheme as q, TableCellTextStyle as qt, EmbeddedFontFaceInfo as r, Glow as rn, TableRow as rt, ExtractedSlide as s, OuterShadow as sn, TableCell as st, AppendSlidesOptions as t, CustomGeometryPath as tn, GraphicFrame as tt, ImportShapeOptions as u, ShapeType as un, Diagram as ut, SlideSource as v, PictureFillTile as vn, ChartExAxis as vt, readCustomProperties as w, ResolvedColor as wn, ChartAxis as wt, CustomProperty as x, ColorRef as xn, ChartExSeries as xt, Presentation as y, GradientFill as yn, ChartExDataLabels as yt, ModernCommentAuthor as z, BulletDetail as zt };
5259
- //# sourceMappingURL=presentation-types-8jLQHI4M.d.ts.map
5909
+ export { isConnector as $, EffectiveColor as $n, Paragraph as $t, BuildSequence as A, PictureMedia as An, ChartDataTable as At, ModernComment as B, GradientStop as Bn, ChartSeries as Bt, readCoreProperties as C, GeometryCommand as Cn, ChartExSeries as Ct, AddTextBoxOptions as D, LineEnd as Dn, ChartAxis as Dt, AddPictureOptions as E, InnerShadow as En, ChartAreaFormat as Et, Tag as F, BackgroundFill as Fn, ChartLine as Ft, SlideLayout as G, GeometrySource as Gn, AutoShape as Gt, NotesPlaceholder as H, PictureFill as Hn, ChartView3D as Ht, readTagsForPart as I, BackgroundSource as In, ChartManualLayout as It, ThemeFontFace as J, ResolvedFrame as Jn, AutofitMode as Jt, SlideMaster as K, PlaceholderRef as Kn, Shape as Kt, Comment as L, SlideBackground as Ln, ChartMarker as Lt, TransitionInput as M, Reflection as Mn, ChartFill as Mt, TransitionSoundInfo as N, ShapeType as Nn, ChartLabelRun as Nt, Slide as O, LineEnds as On, ChartDataLabels as Ot, TransitionSpeed as P, SoftEdge as Pn, ChartLegend as Pt, isAutoShape as Q, ColorTransform as Qn, Equation as Qt, CommentAuthor as R, PatternFill as Rn, ChartPlotGroup as Rt, ExtendedProperties as S, CustomGeometryPath as Sn, ChartExLegend as St, readExtendedProperties as T, Glow as Tn, Chart as Tt, NotesSlide as U, PictureFillTile as Un, Connector as Ut, ModernCommentAuthor as V, FillRect as Vn, ChartTextStyle as Vt, Placeholder as W, ColorRef as Wn, Picture as Wt, AnyShape as X, readColorRef as Xn, ListStyleDefaults as Xt, ThemeFontScheme as Y, StyleFontRef as Yn, BodyProperties as Yt, GroupShape as Z, resolveColorElement as Zn, TextFrame as Zt, SlideSize as _, ConnectionSite as _n, DiagramPoint as _t, ExtractedChart as a, Run as an, TableRow as at, CoreProperties as b, CustomGeometryConnectionSite as bn, ChartExAxis as bt, ExtractedSlides as c, TextContext as cn, CellThreeD as ct, ImportSlideMastersOptions as d, TableCellTextStyle as dn, TableCellEdge as dt, BulletDetail as en, applyColorTransforms as er, isGraphicFrame as et, ImportSlideOptions as f, TableConditionFlags as fn, Diagram as ft, OnlineMediaItem as g, ChildFrame as gn, DiagramNode as gt, LayoutHandle as h, AbsoluteFrameFailure as hn, DiagramDrawnShape as ht, EmbeddedFontInfo as i, LineSpacing as in, Table as it, TransitionInfo as j, Recolor as jn, ChartDisplayUnits as jt, BuildEffect as k, OuterShadow as kn, ChartDataPoint as kt, FromTemplateOptions as l, TextInheritance as ln, TableCell as lt, ImportedSlideMaster as m, AbsoluteFrame as mn, DiagramConnectionType as mt, AvMediaItem as n, Field as nn, ThemeContext as nr, isPicture as nt, ExtractedNotes as o, RunOutline as on, CellBorder as ot, ImportSlidesRequest as p, Hyperlink as pn, DiagramConnection as pt, Theme as q, ResolvedColor as qn, ShapeHost as qt, EmbeddedFontFaceInfo as r, InheritedRunProps as rn, GraphicFrame as rt, ExtractedSlide as s, TabStop as sn, CellBorders as st, AppendSlidesOptions as t, BulletStyle as tn, ColorContext as tr, isGroupShape as tt, ImportShapeOptions as u, ResolvedTableStyle as un, TableCellBorderEdit as ut, SlideSource as v, CustomGeometry as vn, DiagramPointType as vt, readCustomProperties as w, GeometryCoordinate as wn, AxisNumberFormat as wt, CustomProperty as x, CustomGeometryGuide as xn, ChartExDataLabels as xt, Presentation as y, CustomGeometryAdjustHandle as yn, ChartEx as yt, CommentSchema as z, GradientFill as zn, ChartPointLabel as zt };
5910
+ //# sourceMappingURL=presentation-types-BgnZR-0a.d.ts.map