@shbernal/ts-pptx 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/{autopage-BYlTzX-l.js → autopage-DkjYZUFD.js} +3 -3
  2. package/dist/{autopage-BYlTzX-l.js.map → autopage-DkjYZUFD.js.map} +1 -1
  3. package/dist/browser.d.ts +5 -5
  4. package/dist/browser.js +4 -4
  5. package/dist/browser.js.map +1 -1
  6. package/dist/{diagnostics-BDuR8UkG.d.ts → diagnostics-Du_s75MT.d.ts} +20 -5
  7. package/dist/diagnostics-Du_s75MT.d.ts.map +1 -0
  8. package/dist/{errors-CgnueTYL.d.ts → errors-PflMPWBn.d.ts} +2 -2
  9. package/dist/{errors-CgnueTYL.d.ts.map → errors-PflMPWBn.d.ts.map} +1 -1
  10. package/dist/{fit-TjpNbMru.js → fit-BKs0zxMI.js} +3 -3
  11. package/dist/{fit-TjpNbMru.js.map → fit-BKs0zxMI.js.map} +1 -1
  12. package/dist/{html-dom-yUSdCExA.js → html-dom-B0I0QSbU.js} +4 -4
  13. package/dist/{html-dom-yUSdCExA.js.map → html-dom-B0I0QSbU.js.map} +1 -1
  14. package/dist/html.d.ts +3 -3
  15. package/dist/html.js +1 -1
  16. package/dist/index.d.ts +5 -5
  17. package/dist/index.js +3 -3
  18. package/dist/inspect.d.ts +1 -1
  19. package/dist/inspect.js +4 -5
  20. package/dist/inspect.js.map +1 -1
  21. package/dist/math.d.ts +1 -1
  22. package/dist/measure.d.ts +2 -2
  23. package/dist/measure.js +1 -1
  24. package/dist/{namespaces-CcKuzeuE.js → namespaces-BVnNu7sg.js} +74 -3
  25. package/dist/namespaces-BVnNu7sg.js.map +1 -0
  26. package/dist/node.d.ts +5 -5
  27. package/dist/node.js +3 -3
  28. package/dist/{notes-DNqAggXx.js → notes-RLCwdlTE.js} +289 -313
  29. package/dist/{notes-DNqAggXx.js.map → notes-RLCwdlTE.js.map} +1 -1
  30. package/dist/{pres-Dybf7ZUl.d.ts → pres-C5__xkDh.d.ts} +2 -2
  31. package/dist/{pres-Dybf7ZUl.d.ts.map → pres-C5__xkDh.d.ts.map} +1 -1
  32. package/dist/{presentation-VfJ_FT7E.js → presentation-Cp7vzlAw.js} +414 -515
  33. package/dist/presentation-Cp7vzlAw.js.map +1 -0
  34. package/dist/{presentation-types-CpkTx9Xa.d.ts → presentation-types-DP_8jog7.d.ts} +351 -274
  35. package/dist/presentation-types-DP_8jog7.d.ts.map +1 -0
  36. package/dist/read.d.ts +31 -48
  37. package/dist/read.d.ts.map +1 -1
  38. package/dist/read.js +3 -3
  39. package/dist/script.d.ts +2 -2
  40. package/dist/script.d.ts.map +1 -1
  41. package/dist/script.js +18 -47
  42. package/dist/script.js.map +1 -1
  43. package/dist/{shapes-Kt51vry6.js → shapes-BemroU-z.js} +625 -265
  44. package/dist/shapes-BemroU-z.js.map +1 -0
  45. package/dist/{slide-B_aInw3N.d.ts → slide-js0QpRV-.d.ts} +1278 -1254
  46. package/dist/slide-js0QpRV-.d.ts.map +1 -0
  47. package/dist/{text-D04NUMvA.js → text-CyetbF6p.js} +2039 -1417
  48. package/dist/text-CyetbF6p.js.map +1 -0
  49. package/dist/units-1kRzYShk.js +231 -0
  50. package/dist/units-1kRzYShk.js.map +1 -0
  51. package/dist/units-internal-Dg95w_YD.js +753 -0
  52. package/dist/units-internal-Dg95w_YD.js.map +1 -0
  53. package/dist/zip.d.ts +1 -1
  54. package/package.json +2 -1
  55. package/dist/diagnostics-BDuR8UkG.d.ts.map +0 -1
  56. package/dist/diagnostics-CPVADSL1.js +0 -90
  57. package/dist/diagnostics-CPVADSL1.js.map +0 -1
  58. package/dist/namespaces-CcKuzeuE.js.map +0 -1
  59. package/dist/presentation-VfJ_FT7E.js.map +0 -1
  60. package/dist/presentation-types-CpkTx9Xa.d.ts.map +0 -1
  61. package/dist/shapes-Kt51vry6.js.map +0 -1
  62. package/dist/slide-B_aInw3N.d.ts.map +0 -1
  63. package/dist/text-D04NUMvA.js.map +0 -1
  64. package/dist/units-internal-DNvK2I6o.js +0 -896
  65. package/dist/units-internal-DNvK2I6o.js.map +0 -1
@@ -1,4 +1,5 @@
1
- import { t as CustomPropertyValue } from "./pres-Dybf7ZUl.js";
1
+ import { ct as ColorMapToken, ft as ThemeColorSlot } from "./slide-js0QpRV-.js";
2
+ import { t as CustomPropertyValue } from "./pres-C5__xkDh.js";
2
3
  import { a as Part, i as Relationships, n as OpcPackage, o as Element, t as OpcInput } from "./package-CaOLXSNi.js";
3
4
  //#region src/embedded-fonts.d.ts
4
5
  /**
@@ -83,6 +84,28 @@ interface ThemeContext extends ColorContext {
83
84
  defaultTextStyle?: Element | null;
84
85
  }
85
86
  //#endregion
87
+ //#region src/read/oxml/color-transform.d.ts
88
+ /** A colour-transform modifier in its read-model form: tag local-name + raw `@val`. */
89
+ interface ColorTransform {
90
+ name: string;
91
+ value: string | null;
92
+ }
93
+ /** The effective colour after applying transforms: final sRGB hex, plus opacity when an `alpha*` modifier was present. */
94
+ interface EffectiveColor {
95
+ hex: string;
96
+ alpha?: number;
97
+ }
98
+ /**
99
+ * Apply an ordered list of DrawingML colour transforms to a base sRGB hex,
100
+ * returning the effective sRGB hex (and opacity, when an `alpha*` modifier set
101
+ * it). Pure: no DOM, no theme lookup — the caller has already resolved the base
102
+ * colour and extracted each modifier's `{ name, value }`.
103
+ *
104
+ * An unparseable base hex is returned unchanged (with no transforms applied); an
105
+ * unparseable/`null` modifier value is skipped.
106
+ */
107
+ declare function applyColorTransforms(baseHex: string, transforms: ColorTransform[]): EffectiveColor;
108
+ //#endregion
86
109
  //#region src/read/api/theme-context.d.ts
87
110
  /** Identifies a placeholder by its `p:ph` `type`/`idx` for inheritance lookups. */
88
111
  interface PlaceholderRef {
@@ -114,16 +137,14 @@ interface ResolvedFrame {
114
137
  */
115
138
  interface ResolvedColor {
116
139
  hex: string;
117
- transforms: {
118
- name: string;
119
- value: string | null;
120
- }[];
140
+ transforms: ColorTransform[];
121
141
  effectiveHex: string;
122
142
  alpha?: number;
123
143
  }
124
144
  /**
125
- * Resolve a DrawingML colour *element* (`a:srgbClr`/`a:schemeClr`/`a:sysClr`)
126
- * against `ctx` into a full {@link ResolvedColor} — base hex, raw transform list,
145
+ * Resolve a DrawingML colour *element* (every `a:EG_ColorChoice` member except
146
+ * `a:scrgbClr` — see `read/oxml/theme.ts`) against `ctx` into a full
147
+ * {@link ResolvedColor} — base hex, raw transform list,
127
148
  * and the `effectiveHex`/`alpha` after applying those transforms. `null` when the
128
149
  * element cannot be made literal (unmapped token, or a colour model we do not
129
150
  * resolve). Shared by the solid-fill and gradient-stop colour reads.
@@ -142,19 +163,47 @@ interface StyleFontRef {
142
163
  interface GradientStop {
143
164
  /** Stop offset along the gradient, 0–1 (from `@pos`, thousandths of a percent), or `null` if unset. */
144
165
  position: number | null;
145
- /** Explicit RGB colour as 6-hex (`a:srgbClr/@val`), or `null` when the stop uses a scheme colour. */
166
+ /** Explicit RGB colour as 6-hex (`a:srgbClr/@val`), or `null` when the stop uses another colour model. */
146
167
  color: string | null;
147
- /** Theme colour token (`a:schemeClr/@val`, e.g. `accent1`), or `null` when the stop uses an explicit colour. */
168
+ /** Theme colour token (`a:schemeClr/@val`, e.g. `accent1`), or `null` when the stop uses another colour model. */
148
169
  schemeColor: string | null;
170
+ /**
171
+ * Preset colour name (`a:prstClr/@val`, e.g. `black`/`cornflowerBlue` — the
172
+ * ECMA-376 §20.1.10.47 table), or `null` when the stop uses another colour
173
+ * model. The same raw/resolved split {@link import('./shapes/types.js').RecolorColor}
174
+ * uses; {@link import('../oxml/preset-color.js').presetColorHex}, exported from
175
+ * `ts-pptx/read`, makes one literal.
176
+ *
177
+ * These three raw fields name three of the five colour models the reader
178
+ * resolves. A stop written as `a:sysClr` or `a:hslClr` leaves all three `null`
179
+ * and is reported through {@link resolvedColor} alone, which is the only place
180
+ * its colour appears; `a:scrgbClr`, which the reader deliberately does not
181
+ * resolve, leaves {@link resolvedColor} `null` too.
182
+ */
183
+ presetColor: string | null;
184
+ /**
185
+ * The stop's colour as a full {@link ResolvedColor} — base `hex`, the raw
186
+ * `transforms` list (`lumMod`/`shade`/…) in document order, and the
187
+ * `effectiveHex`/`alpha` after applying them — exactly what a solid fill's
188
+ * `resolvedFill` gives. `null` when the colour cannot be made literal (an
189
+ * unmapped token, or a colour model we do not resolve).
190
+ *
191
+ * This is the field to read when re-authoring a stop against a *different*
192
+ * theme: {@link effectiveHex} alone is one theme baked in, so carrying it
193
+ * forward as a literal silently stops the stop tracking the theme it came from.
194
+ * `transforms` is what says whether there was anything to track, and an empty
195
+ * list here means the stop stated none — not that the reader could not see them.
196
+ */
197
+ resolvedColor: ResolvedColor | null;
149
198
  /**
150
199
  * The stop's colour resolved against the slide theme **with its colour
151
- * transforms applied** — the final rendered hex (the gradient counterpart of
152
- * {@link import('./theme-context.js').ResolvedColor.effectiveHex}). `null` when
153
- * the colour cannot be made literal (an unmapped token, or a colour model we do
154
- * not resolve).
200
+ * transforms applied** — the final rendered hex, i.e. exactly
201
+ * `resolvedColor?.effectiveHex ?? null`, kept as a flat field because painting a
202
+ * gradient is what most callers want. `null` when the colour cannot be made
203
+ * literal (an unmapped token, or a colour model we do not resolve).
155
204
  */
156
205
  effectiveHex: string | null;
157
- /** The stop's opacity (0–1) when an `alpha*` transform set one, else `undefined`. */
206
+ /** The stop's opacity (0–1) when an `alpha*` transform set one, else `undefined`. Mirrors `resolvedColor.alpha`. */
158
207
  alpha?: number;
159
208
  }
160
209
  /**
@@ -454,7 +503,7 @@ interface Reflection {
454
503
  /** End position along the reflection 0–1 (`@endPos` ÷ 100000). */
455
504
  endPos?: number;
456
505
  /** Offset distance in points (`@dist` ÷ 12700). */
457
- distPt?: number;
506
+ offsetPt?: number;
458
507
  /** Offset direction in degrees (`@dir` ÷ 60000). */
459
508
  angleDeg?: number;
460
509
  /** Fade direction in degrees (`@fadeDir` ÷ 60000). */
@@ -745,6 +794,12 @@ declare class Run {
745
794
  * for non-placeholder runs. Called lazily.
746
795
  */
747
796
  private readonly inheritedBold?;
797
+ /**
798
+ * Resolves whether this run inherits italic from the same chain when it sets no
799
+ * own `@i`. Built by the owning {@link Paragraph} for placeholder text; absent
800
+ * for non-placeholder runs. Called lazily.
801
+ */
802
+ private readonly inheritedItalic?;
748
803
  /**
749
804
  * The owning part's relationships, used to resolve a run hyperlink's `@r:id`
750
805
  * to its external URL or internal target partname. Absent when the run was
@@ -787,6 +842,12 @@ declare class Run {
787
842
  * for non-placeholder runs. Called lazily.
788
843
  */
789
844
  inheritedBold?: (() => boolean | null) | undefined,
845
+ /**
846
+ * Resolves whether this run inherits italic from the same chain when it sets no
847
+ * own `@i`. Built by the owning {@link Paragraph} for placeholder text; absent
848
+ * for non-placeholder runs. Called lazily.
849
+ */
850
+ inheritedItalic?: (() => boolean | null) | undefined,
790
851
  /**
791
852
  * The owning part's relationships, used to resolve a run hyperlink's `@r:id`
792
853
  * to its external URL or internal target partname. Absent when the run was
@@ -909,6 +970,17 @@ declare class Run {
909
970
  * resolved counterpart of {@link bold}, which reports only the run's own value.
910
971
  */
911
972
  get resolvedBold(): boolean | null;
973
+ /**
974
+ * Whether this run effectively renders italic. It is the run's own `@i`
975
+ * ({@link italic}) when set; otherwise, for a run inside a placeholder, the italic
976
+ * state it inherits from the placeholder/list-style chain (paragraph `a:defRPr` →
977
+ * slide `a:lstStyle` → layout → master placeholder `a:lstStyle` → master
978
+ * `p:txStyles`). `null` when the run sets no `@i` and inherits none — the
979
+ * resolved counterpart of {@link italic}, and the twin of {@link resolvedBold}:
980
+ * `@b` and `@i` are siblings a master text style states together, so a deck that
981
+ * can be authored with an inherited italic can be read back with one.
982
+ */
983
+ get resolvedItalic(): boolean | null;
912
984
  /** Escape hatch: the underlying `a:r` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */
913
985
  get element_(): Element;
914
986
  /** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
@@ -2374,7 +2446,26 @@ interface CellBorder {
2374
2446
  widthPt: number | null;
2375
2447
  /** Dash style (`a:prstDash/@val`, e.g. `solid`/`sysDash`), or `null` when unset. */
2376
2448
  dash: string | null;
2377
- /** The stroke colour resolved against the table theme to a literal hex (`effectiveHex`), or `null`. */
2449
+ /**
2450
+ * The stroke colour as a full {@link ResolvedColor} — base `hex`, the raw
2451
+ * `transforms` list (`lumMod`/`shade`/…) in document order, and the
2452
+ * `effectiveHex`/`alpha` after applying them — the same object a shape's
2453
+ * `resolvedLine` gives. `null` when the edge carries no solid fill, or the
2454
+ * colour cannot be made literal.
2455
+ *
2456
+ * This is the field to read when re-authoring a border against a *different*
2457
+ * theme: {@link color} alone is one theme baked in, so a `lumMod`-darkened
2458
+ * accent carried forward as a literal hex silently stops tracking the theme it
2459
+ * came from. `transforms` is what says whether there was anything to track, and
2460
+ * an empty list here means the edge stated none — not that the reader could not
2461
+ * see them.
2462
+ */
2463
+ resolvedColor: ResolvedColor | null;
2464
+ /**
2465
+ * The stroke colour resolved against the table theme to a literal hex — exactly
2466
+ * `resolvedColor?.effectiveHex ?? null`, kept as a flat field because painting a
2467
+ * rule is what most callers want. `null` when the edge has no resolvable colour.
2468
+ */
2378
2469
  color: string | null;
2379
2470
  /** Raw `schemeClr` token of the stroke (`a:solidFill/a:schemeClr/@val`), or `null` for an srgb/absent colour. */
2380
2471
  schemeColor: string | null;
@@ -2797,7 +2888,8 @@ declare class TableCell {
2797
2888
  /**
2798
2889
  * The cell's edge borders (`a:tcPr/a:lnL|lnR|lnT|lnB|lnTlToBr|lnBlToTr`), or
2799
2890
  * `null` when the cell defines none. Each present edge decodes to a
2800
- * {@link CellBorder} (width / dash / resolved + raw colour / suppressed flag);
2891
+ * {@link CellBorder} (width / dash / resolved colour + its raw token and transform
2892
+ * list / suppressed flag);
2801
2893
  * absent edges are `null`. Cell borders are the biggest visible table gap — a
2802
2894
  * replica built only from geometry and fill draws every cell edge-to-edge with
2803
2895
  * no rule, so this surfaces the per-side stroke the writer's `border` option emits.
@@ -2980,187 +3072,7 @@ declare function isGraphicFrame(shape: Shape): shape is GraphicFrame;
2980
3072
  /** Narrow a shape to a {@link GroupShape} (`p:grpSp`). */
2981
3073
  declare function isGroupShape(shape: Shape): shape is GroupShape;
2982
3074
  //#endregion
2983
- //#region src/read/api/notes.d.ts
2984
- /**
2985
- * One placeholder shape (`p:sp`) of a notes slide. A notes slide holds a fixed set:
2986
- * the slide thumbnail (`type="sldImg"`), the notes body (`type="body"`), and the
2987
- * slide number (`type="sldNum"`). Geometry getters read the placeholder's *own*
2988
- * `a:xfrm` and are `null` when it inherits geometry from the notesMaster (the case
2989
- * on an authored deck, whose `sldImg`/`sldNum` carry an empty `p:spPr`).
2990
- */
2991
- declare class NotesPlaceholder {
2992
- #private;
2993
- private readonly sp;
2994
- private readonly part;
2995
- /** The notes theme context (notesMaster → `theme2.xml`), threaded to {@link textFrame}. */
2996
- private readonly themeContext;
2997
- /** The notes part's relationships, threaded to {@link textFrame} for hyperlink resolution. */
2998
- private readonly relationships;
2999
- constructor(sp: Element, part: Part,
3000
- /** The notes theme context (notesMaster → `theme2.xml`), threaded to {@link textFrame}. */
3001
- themeContext: ThemeContext,
3002
- /** The notes part's relationships, threaded to {@link textFrame} for hyperlink resolution. */
3003
- relationships: Relationships);
3004
- /** Placeholder type (`p:ph/@type`: `sldImg` | `body` | `sldNum`), or `null` when absent. */
3005
- get type(): string | null;
3006
- /** Placeholder index (`p:ph/@idx`), or `null` when unset. */
3007
- get idx(): string | null;
3008
- /** Shape name (`p:cNvPr/@name`), or `''` when unnamed. */
3009
- get name(): string;
3010
- /** Drawing id (`p:cNvPr/@id`), or `null` when absent. */
3011
- get id(): number | null;
3012
- /** Left edge in EMU (`a:off/@x`), or `null` when geometry is inherited (no own `a:xfrm`). */
3013
- get left(): number | null;
3014
- /** Top edge in EMU (`a:off/@y`), or `null` when geometry is inherited. */
3015
- get top(): number | null;
3016
- /** Width in EMU (`a:ext/@cx`), or `null` when geometry is inherited. */
3017
- get width(): number | null;
3018
- /** Height in EMU (`a:ext/@cy`), or `null` when geometry is inherited. */
3019
- get height(): number | null;
3020
- /**
3021
- * The placeholder's text as a navigable {@link TextFrame} (`p:txBody`), or `null`
3022
- * when it carries no text body (the `sldImg` thumbnail). The body placeholder's
3023
- * runs round-trip a slide's authored notes; the `sldNum` placeholder's frame
3024
- * holds the slide-number `a:fld`, whose value surfaces through `TextFrame.text`.
3025
- */
3026
- get textFrame(): TextFrame | null;
3027
- /** The placeholder's flattened text (paragraphs joined by `\n`), or `''` when it has no text body. */
3028
- get text(): string;
3029
- /** Escape hatch: the underlying `p:sp` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */
3030
- get element_(): Element;
3031
- /** Mark the owning notes-slide part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
3032
- markDirty(): void;
3033
- }
3034
- /**
3035
- * A slide's speaker-notes slide (`notesSlideN.xml`) as a modeled object — the deep
3036
- * companion to {@link import('./slide.js').Slide.notesText}. Exposes the notes
3037
- * shape tree as {@link NotesPlaceholder}s ({@link body}/{@link slideImage}/
3038
- * {@link slideNumber}) plus the body {@link textFrame} the older getters flatten.
3039
- *
3040
- * The theme context (notesMaster → `theme2.xml`) is resolved once and shared across
3041
- * every placeholder's text frame.
3042
- */
3043
- declare class NotesSlide {
3044
- #private;
3045
- private readonly opc;
3046
- /** The notes slide's OPC part (`/ppt/notesSlides/notesSlideN.xml`). */
3047
- readonly part: Part;
3048
- constructor(opc: OpcPackage,
3049
- /** The notes slide's OPC part (`/ppt/notesSlides/notesSlideN.xml`). */
3050
- part: Part);
3051
- /** Partname of the notes slide part. */
3052
- get partName(): string;
3053
- /**
3054
- * The notes theme context, resolved through the notesMaster → `theme2.xml` chain
3055
- * and cached. Backs {@link NotesPlaceholder.textFrame}'s `Run.resolvedColor`.
3056
- */
3057
- themeContext(): ThemeContext;
3058
- /** The placeholders (`p:sp`) in the notes shape tree, in document order. */
3059
- get placeholders(): NotesPlaceholder[];
3060
- /** The notes body placeholder (`p:ph type="body"`), or `null` when the notes slide has none. */
3061
- get body(): NotesPlaceholder | null;
3062
- /** The slide-thumbnail placeholder (`p:ph type="sldImg"`), or `null` when absent. */
3063
- get slideImage(): NotesPlaceholder | null;
3064
- /** The slide-number placeholder (`p:ph type="sldNum"`, carrying the slide-number field), or `null`. */
3065
- get slideNumber(): NotesPlaceholder | null;
3066
- /** The notes body as a navigable {@link TextFrame}, or `null` when there is no body text frame. */
3067
- get textFrame(): TextFrame | null;
3068
- /** The notes body text flattened (paragraphs joined by `\n`), or `''` when the body is empty/absent. */
3069
- get text(): string;
3070
- }
3071
- //#endregion
3072
- //#region src/read/api/comments.d.ts
3073
- /** One entry of the deck-wide comment-author registry (`p:cmAuthor`). */
3074
- interface CommentAuthor {
3075
- /** Author id (`@id`), referenced by each comment's `@authorId`. */
3076
- id: number | null;
3077
- /** Display name (`@name`). */
3078
- name: string;
3079
- /** Initials shown in the comment marker (`@initials`). */
3080
- initials: string;
3081
- /** Highest per-author comment index used (`@lastIdx`). */
3082
- lastIdx: number | null;
3083
- /** Author colour slot (`@clrIdx`). */
3084
- clrIdx: number | null;
3085
- }
3086
- /** One legacy review comment (`p:cm`), with its author resolved via the registry. */
3087
- interface Comment {
3088
- /** Resolved author display name (via `@authorId` → `commentAuthors.xml`), or `null` when unresolved. */
3089
- author: string | null;
3090
- /** Resolved author initials, or `null` when unresolved. */
3091
- authorInitials: string | null;
3092
- /** The comment's `@authorId`, or `null` when absent/unparseable. */
3093
- authorId: number | null;
3094
- /** The comment's per-author 1-based index (`@idx`), or `null` when absent. */
3095
- idx: number | null;
3096
- /** The comment body text (`p:text`). */
3097
- text: string;
3098
- /** Marker X position in EMU (`p:pos/@x`), or `null` when absent. */
3099
- x: number | null;
3100
- /** Marker Y position in EMU (`p:pos/@y`), or `null` when absent. */
3101
- y: number | null;
3102
- /** Authored timestamp (`@dt`, ISO-8601 as written), or `null` when absent. */
3103
- date: string | null;
3104
- }
3105
- /** One entry of the modern deck-wide author registry (`p188:author`). */
3106
- interface ModernCommentAuthor {
3107
- /** Author id (`@id`) — a GUID string like `{E8A64ABA-…}`, referenced by each comment's `@authorId`. */
3108
- id: string | null;
3109
- /** Display name (`@name`). */
3110
- name: string;
3111
- /** Initials (`@initials`). */
3112
- initials: string;
3113
- /** Account identifier (`@userId`, e.g. an email), or `null`. */
3114
- userId: string | null;
3115
- /** Identity provider (`@providerId`, e.g. `Windows Live`), or `null`. */
3116
- providerId: string | null;
3117
- }
3118
- /** One modern comment or reply (`p188:cm` / `p188:reply`), with its author resolved via the registry. */
3119
- interface ModernComment {
3120
- /** The comment's own GUID id (`@id`), or `null` when absent. */
3121
- id: string | null;
3122
- /** Resolved author display name (via `@authorId` → `authors.xml`), or `null` when unresolved. */
3123
- author: string | null;
3124
- /** Resolved author initials, or `null` when unresolved. */
3125
- authorInitials: string | null;
3126
- /** The comment's `@authorId` GUID, or `null` when absent. */
3127
- authorId: string | null;
3128
- /** Creation timestamp (`@created`, ISO-8601 as written), or `null` when absent. */
3129
- created: string | null;
3130
- /** The comment body text; multiple paragraphs are joined with `\n`. */
3131
- text: string;
3132
- /** Marker X position in EMU (`p188:pos/@x`), or `null` (replies carry no position). */
3133
- x: number | null;
3134
- /** Marker Y position in EMU (`p188:pos/@y`), or `null` (replies carry no position). */
3135
- y: number | null;
3136
- /** Nested replies in thread order; each is itself a {@link ModernComment} with no further replies. */
3137
- replies: ModernComment[];
3138
- }
3139
- /** Which comment schema a deck carries. `'none'` when it has neither part. */
3140
- type CommentSchema = 'legacy' | 'modern' | 'none';
3141
- //#endregion
3142
- //#region src/read/api/tags.d.ts
3143
- /** One programmatic tag (`p:tag`) — a name/value string pair. */
3144
- interface Tag {
3145
- /** The tag's `@name`. */
3146
- name: string;
3147
- /** The tag's `@val`. */
3148
- val: string;
3149
- }
3150
- /**
3151
- * Read every tag referenced by `ownerPartName` (a slide part or the presentation
3152
- * part), resolving the owner's `tags` relationship(s) to their `ppt/tags/tagN.xml`
3153
- * part(s) and flattening each part's `p:tag` children into `{ name, val }`. `[]`
3154
- * when the owner references no tag part. Rel-driven rather than walking
3155
- * `p:custDataLst`, so it is robust to element ordering in the owner.
3156
- */
3157
- declare function readTagsForPart(opc: OpcPackage, ownerPartName: string): Tag[];
3158
- //#endregion
3159
3075
  //#region src/read/api/chrome.d.ts
3160
- /** The 12 theme colour-scheme slots (`a:clrScheme` children), in schema order. */
3161
- type ThemeColorSlot = 'dk1' | 'lt1' | 'dk2' | 'lt2' | 'accent1' | 'accent2' | 'accent3' | 'accent4' | 'accent5' | 'accent6' | 'hlink' | 'folHlink';
3162
- /** The 12 colour-map tokens (`p:clrMap` attributes), each pointing at a {@link ThemeColorSlot}. */
3163
- type ColorMapToken = 'bg1' | 'tx1' | 'bg2' | 'tx2' | 'accent1' | 'accent2' | 'accent3' | 'accent4' | 'accent5' | 'accent6' | 'hlink' | 'folHlink';
3164
3076
  /**
3165
3077
  * One theme font family (`a:majorFont` or `a:minorFont`): the primary Latin face
3166
3078
  * plus the East-Asian and complex-script faces. Each is `null` when the theme
@@ -3235,14 +3147,20 @@ declare class Theme {
3235
3147
  */
3236
3148
  declare class Placeholder {
3237
3149
  #private;
3238
- private readonly sp;
3239
- private readonly part;
3240
- /** The owning master/layout theme context, threaded to {@link textFrame}. */
3241
- private readonly themeContext;
3150
+ /** The placeholder's `p:sp`. `protected` so {@link NotesPlaceholder} can read it. */
3151
+ protected readonly sp: Element;
3152
+ /** The part the `p:sp` lives in — a master, a layout, or a notes slide. */
3153
+ protected readonly part: Part;
3154
+ /** The owning part's theme context, threaded to {@link textFrame}. */
3155
+ protected readonly themeContext: ThemeContext;
3242
3156
  /** The owning part's relationships, threaded to {@link textFrame} for hyperlink resolution. */
3243
- private readonly relationships;
3244
- constructor(sp: Element, part: Part,
3245
- /** The owning master/layout theme context, threaded to {@link textFrame}. */
3157
+ protected readonly relationships: Relationships;
3158
+ constructor(
3159
+ /** The placeholder's `p:sp`. `protected` so {@link NotesPlaceholder} can read it. */
3160
+ sp: Element,
3161
+ /** The part the `p:sp` lives in — a master, a layout, or a notes slide. */
3162
+ part: Part,
3163
+ /** The owning part's theme context, threaded to {@link textFrame}. */
3246
3164
  themeContext: ThemeContext,
3247
3165
  /** The owning part's relationships, threaded to {@link textFrame} for hyperlink resolution. */
3248
3166
  relationships: Relationships);
@@ -3270,33 +3188,86 @@ declare class Placeholder {
3270
3188
  get textFrame(): TextFrame | null;
3271
3189
  /** Escape hatch: the underlying `p:sp` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */
3272
3190
  get element_(): Element;
3273
- /** Mark the owning master/layout part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
3191
+ /** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */
3274
3192
  markDirty(): void;
3275
3193
  }
3276
3194
  /**
3277
- * A deck's slide master (`slideMasterN.xml`) as a modeled object. Exposes the
3278
- * property tiers a bound slide inherits: the {@link colorMap} (token → theme slot),
3279
- * its {@link theme}, its {@link shapes} and the {@link placeholders} subset of them,
3280
- * its own {@link background}, and the {@link layouts} that build on it. Reachable
3281
- * from {@link SlideLayout.master} and `Slide.master`.
3195
+ * The shared body of a slide master and a slide layout — the two template tiers a slide
3196
+ * inherits from.
3197
+ *
3198
+ * Both are an OPC part holding a `p:cSld` with a shape tree and a resolvable theme context, and
3199
+ * both were written out in full, member for member: `partName`, `relationships`, `name`,
3200
+ * `shapes`, `shapeByIdDeep`, `placeholders`, `themeContext` and the two DOM lookups behind them
3201
+ * were character-for-character identical in the two classes. Nothing about that was broken, but
3202
+ * it meant every accessor added to a template tier had to be added twice, and the ones meant to
3203
+ * agree could quietly stop agreeing.
3204
+ *
3205
+ * What genuinely differs stays on the subclasses. `theme` differs because a layout has to walk
3206
+ * to its master first. `background` differs in the tier label it decodes with and in where it
3207
+ * finds the theme part. And the context itself differs, which is why {@link resolveThemeContext}
3208
+ * is abstract: a master resolves its own `p:clrMap` + theme, a layout walks layout → master →
3209
+ * theme. The caching around it is shared, so a subclass supplies the walk and nothing else.
3210
+ *
3211
+ * `Slide` deliberately does not extend this. It is a shape host too, but it is constructed from
3212
+ * a `Presentation` rather than an `OpcPackage`, reaches its relationships through that, and
3213
+ * reports an unnamed slide as `null` where a template tier reports `''` — three differences in
3214
+ * the same handful of members, which is more contortion than the sharing is worth.
3282
3215
  */
3283
- declare class SlideMaster implements ShapeHost {
3216
+ declare abstract class TemplatePart implements ShapeHost {
3284
3217
  #private;
3285
- /** The package the master belongs to, for reaching its layouts, theme, and media. */
3218
+ /** The package this part belongs to, for reaching related parts (theme, master, media). */
3286
3219
  readonly opc: OpcPackage;
3287
- /** The master's OPC part (`/ppt/slideMasters/slideMasterN.xml`). */
3220
+ /** This tier's OPC part. */
3288
3221
  readonly part: Part;
3289
3222
  constructor(
3290
- /** The package the master belongs to, for reaching its layouts, theme, and media. */
3223
+ /** The package this part belongs to, for reaching related parts (theme, master, media). */
3291
3224
  opc: OpcPackage,
3292
- /** The master's OPC part (`/ppt/slideMasters/slideMasterN.xml`). */
3225
+ /** This tier's OPC part. */
3293
3226
  part: Part);
3294
- /** Partname of the master part. */
3227
+ /** Partname of this part. */
3295
3228
  get partName(): string;
3296
- /** This master part's relationships (its layouts, its theme, image embeds, …). */
3229
+ /** This part's relationships (its theme or master, image embeds, hyperlinks, …). */
3297
3230
  get relationships(): Relationships;
3298
- /** The master's authoring name (`p:cSld/@name`), or `''` when unnamed (the writer's default). */
3231
+ /** The authoring name (`p:cSld/@name`), or `''` when unnamed. */
3299
3232
  get name(): string;
3233
+ /**
3234
+ * Every shape in this tier's `p:cSld/p:spTree`, in document order — the same `AnyShape`
3235
+ * union `Slide.shapes` returns, so shape-walking code applies unchanged.
3236
+ *
3237
+ * {@link placeholders} is the filtered view of the same tree.
3238
+ */
3239
+ get shapes(): AnyShape[];
3240
+ /** The shape anywhere in this tier's tree with the given drawing id, or `undefined`. */
3241
+ shapeByIdDeep(id: number): AnyShape | undefined;
3242
+ /** This tier's placeholder shapes (`p:sp` carrying a `p:ph`), in document order. */
3243
+ get placeholders(): Placeholder[];
3244
+ /** This tier's colour/font context, resolved once and cached. Backs each {@link Placeholder}'s text frame. */
3245
+ themeContext(): ThemeContext;
3246
+ /** The theme this tier resolves against, or `null` when the chain is incomplete. */
3247
+ abstract get theme(): Theme | null;
3248
+ /** This tier's *own* background (`p:cSld/p:bg`), decoded, or `null` when it defines none. */
3249
+ abstract get background(): SlideBackground | null;
3250
+ /** Walk this tier's colour/font chain. Called once; {@link themeContext} caches the result. */
3251
+ protected abstract resolveThemeContext(): ThemeContext;
3252
+ /** The `p:cSld` of this part, or `null`. */
3253
+ protected cSld(): Element | null;
3254
+ /** The `p:cSld/p:spTree` of this part, or `null`. */
3255
+ protected spTree(): Element | null;
3256
+ /** The part this one's first relationship of `type` points at, or `null`. */
3257
+ protected relTarget(type: string): Part | null;
3258
+ }
3259
+ /**
3260
+ * A deck's slide master (`slideMasterN.xml`) as a modeled object. Exposes the
3261
+ * property tiers a bound slide inherits: the {@link colorMap} (token → theme slot),
3262
+ * its {@link theme}, its `shapes` and the `placeholders` subset of them, its own
3263
+ * {@link background}, and the {@link layouts} that build on it. Reachable from
3264
+ * {@link SlideLayout.master} and `Slide.master`.
3265
+ *
3266
+ * `shapes` is where a template's non-placeholder furniture lives: the header band, the
3267
+ * rule under the title, the logo. Whether a given slide draws them is
3268
+ * `Slide.showMasterSp` (and, for a layout, {@link SlideLayout.showMasterSp}).
3269
+ */
3270
+ declare class SlideMaster extends TemplatePart {
3300
3271
  /** The master's theme (via its `theme` relationship), or `null` when absent. */
3301
3272
  get theme(): Theme | null;
3302
3273
  /**
@@ -3306,20 +3277,6 @@ declare class SlideMaster implements ShapeHost {
3306
3277
  * A token the map omits reads `null`.
3307
3278
  */
3308
3279
  get colorMap(): Record<ColorMapToken, string | null>;
3309
- /**
3310
- * Every shape in the master's `p:cSld/p:spTree`, in document order — the same
3311
- * `AnyShape` union `Slide.shapes` returns, so shape-walking code applies
3312
- * unchanged. This is where a template's non-placeholder furniture lives: the
3313
- * header band, the rule under the title, the logo. Whether a given slide draws
3314
- * them is `Slide.showMasterSp` (and, for a layout, {@link SlideLayout.showMasterSp}).
3315
- *
3316
- * {@link placeholders} is the filtered view of the same tree.
3317
- */
3318
- get shapes(): AnyShape[];
3319
- /** The shape anywhere in the master's tree with the given drawing id, or `undefined`. */
3320
- shapeByIdDeep(id: number): AnyShape | undefined;
3321
- /** The master's placeholder shapes (`p:sp` carrying a `p:ph`), in document order. */
3322
- get placeholders(): Placeholder[];
3323
3280
  /** The layouts built on this master (via `p:sldLayoutIdLst` → its relationships), in list order. */
3324
3281
  get layouts(): SlideLayout[];
3325
3282
  /**
@@ -3328,36 +3285,21 @@ declare class SlideMaster implements ShapeHost {
3328
3285
  * resolved through the slide → layout → master chain, is `Slide.background`.
3329
3286
  */
3330
3287
  get background(): SlideBackground | null;
3331
- /**
3332
- * The master's colour/font context (its `p:clrMap` + theme), resolved once and
3333
- * cached. Backs each {@link Placeholder}'s text frame.
3334
- */
3335
- themeContext(): ThemeContext;
3288
+ /** A master's context is its own `p:clrMap` plus its theme — no walk beyond this part. */
3289
+ protected resolveThemeContext(): ThemeContext;
3336
3290
  }
3337
3291
  /**
3338
3292
  * A deck's slide layout (`slideLayoutN.xml`) as a modeled object — the gallery entry
3339
3293
  * a slide binds to. Exposes its {@link name}, its {@link type} (import-only; the
3340
3294
  * writer authors none), its {@link master} (and, through it, the {@link theme}), its
3341
- * {@link shapes} and the {@link placeholders} subset of them, and its own
3342
- * {@link background}. Reachable from `Slide.layout` and {@link SlideMaster.layouts}.
3295
+ * `shapes` and the `placeholders` subset of them, and its own {@link background}.
3296
+ * Reachable from `Slide.layout` and {@link SlideMaster.layouts}.
3297
+ *
3298
+ * The write API authors non-placeholder shapes into a layout: every
3299
+ * `defineSlideMaster({ objects })` member that is not a `placeholder` — a `rect`, a
3300
+ * `line`, an `image`, a `chart`, a `text` box — lands in this tier's tree.
3343
3301
  */
3344
- declare class SlideLayout implements ShapeHost {
3345
- #private;
3346
- /** The package the layout belongs to, for reaching its master, theme, and media. */
3347
- readonly opc: OpcPackage;
3348
- /** The layout's OPC part (`/ppt/slideLayouts/slideLayoutN.xml`). */
3349
- readonly part: Part;
3350
- constructor(
3351
- /** The package the layout belongs to, for reaching its master, theme, and media. */
3352
- opc: OpcPackage,
3353
- /** The layout's OPC part (`/ppt/slideLayouts/slideLayoutN.xml`). */
3354
- part: Part);
3355
- /** Partname of the layout part. */
3356
- get partName(): string;
3357
- /** This layout part's relationships (its master, image embeds, hyperlinks, …). */
3358
- get relationships(): Relationships;
3359
- /** The layout's authoring name (`p:cSld/@name`, e.g. `Title and Content`), or `''` when unnamed. */
3360
- get name(): string;
3302
+ declare class SlideLayout extends TemplatePart {
3361
3303
  /**
3362
3304
  * The layout type (`p:sldLayout/@type`, e.g. `title` | `obj` | `blank`), or `null`
3363
3305
  * when the layout declares none. Import-only: the writer authors no `@type`, so an
@@ -3377,20 +3319,6 @@ declare class SlideLayout implements ShapeHost {
3377
3319
  get master(): SlideMaster | null;
3378
3320
  /** The theme this layout resolves against, via its {@link master}, or `null`. */
3379
3321
  get theme(): Theme | null;
3380
- /**
3381
- * Every shape in the layout's `p:cSld/p:spTree`, in document order — the same
3382
- * `AnyShape` union `Slide.shapes` returns, so shape-walking code applies
3383
- * unchanged. The write API authors non-placeholder shapes here: every
3384
- * `defineSlideMaster({ objects })` member that is not a `placeholder` (a `rect`,
3385
- * a `line`, an `image`, a `chart`, a `text` box) lands in this tree.
3386
- *
3387
- * {@link placeholders} is the filtered view of the same tree.
3388
- */
3389
- get shapes(): AnyShape[];
3390
- /** The shape anywhere in the layout's tree with the given drawing id, or `undefined`. */
3391
- shapeByIdDeep(id: number): AnyShape | undefined;
3392
- /** The layout's placeholder shapes (`p:sp` carrying a `p:ph`), in document order. */
3393
- get placeholders(): Placeholder[];
3394
3322
  /**
3395
3323
  * The layout's *own* background (`p:cSld/p:bg`), decoded, or `null` when it defines
3396
3324
  * none. A layout usually authors one — an explicit fill (`p:bgPr`) or a
@@ -3398,12 +3326,161 @@ declare class SlideLayout implements ShapeHost {
3398
3326
  * `Slide.background`.
3399
3327
  */
3400
3328
  get background(): SlideBackground | null;
3329
+ /** A layout's context is walked layout → master → theme, which is why it is not the master's. */
3330
+ protected resolveThemeContext(): ThemeContext;
3331
+ }
3332
+ //#endregion
3333
+ //#region src/read/api/notes.d.ts
3334
+ /**
3335
+ * One placeholder shape (`p:sp`) of a notes slide. A notes slide holds a fixed set:
3336
+ * the slide thumbnail (`type="sldImg"`), the notes body (`type="body"`), and the
3337
+ * slide number (`type="sldNum"`). Geometry getters read the placeholder's *own*
3338
+ * `a:xfrm` and are `null` when it inherits geometry from the notesMaster (the case
3339
+ * on an authored deck, whose `sldImg`/`sldNum` carry an empty `p:spPr`).
3340
+ *
3341
+ * A notes placeholder IS a {@link Placeholder} — identity, geometry and the escape hatch are
3342
+ * the same twelve members read off the same `p:sp`, down to `p:ph` being found the same way —
3343
+ * so it extends one rather than repeating it. Two things are its own: the flattened
3344
+ * {@link text} convenience, and a {@link textFrame} that threads the notesMaster inheritance
3345
+ * context onto the body frame.
3346
+ */
3347
+ declare class NotesPlaceholder extends Placeholder {
3348
+ /**
3349
+ * The placeholder's text as a navigable {@link TextFrame} (`p:txBody`), or `null`
3350
+ * when it carries no text body (the `sldImg` thumbnail). The body placeholder's
3351
+ * runs round-trip a slide's authored notes; the `sldNum` placeholder's frame
3352
+ * holds the slide-number `a:fld`, whose value surfaces through `TextFrame.text`.
3353
+ *
3354
+ * Overrides {@link Placeholder.textFrame} for the inheritance context alone — see below.
3355
+ */
3356
+ get textFrame(): TextFrame | null;
3357
+ /** The placeholder's flattened text (paragraphs joined by `\n`), or `''` when it has no text body. */
3358
+ get text(): string;
3359
+ }
3360
+ /**
3361
+ * A slide's speaker-notes slide (`notesSlideN.xml`) as a modeled object — the deep
3362
+ * companion to {@link import('./slide.js').Slide.notesText}. Exposes the notes
3363
+ * shape tree as {@link NotesPlaceholder}s ({@link body}/{@link slideImage}/
3364
+ * {@link slideNumber}) plus the body {@link textFrame} the older getters flatten.
3365
+ *
3366
+ * The theme context (notesMaster → `theme2.xml`) is resolved once and shared across
3367
+ * every placeholder's text frame.
3368
+ */
3369
+ declare class NotesSlide {
3370
+ #private;
3371
+ private readonly opc;
3372
+ /** The notes slide's OPC part (`/ppt/notesSlides/notesSlideN.xml`). */
3373
+ readonly part: Part;
3374
+ constructor(opc: OpcPackage,
3375
+ /** The notes slide's OPC part (`/ppt/notesSlides/notesSlideN.xml`). */
3376
+ part: Part);
3377
+ /** Partname of the notes slide part. */
3378
+ get partName(): string;
3401
3379
  /**
3402
- * The layout's colour/font context (walked layout → master → theme), resolved once
3403
- * and cached. Backs each {@link Placeholder}'s text frame.
3380
+ * The notes theme context, resolved through the notesMaster → `theme2.xml` chain
3381
+ * and cached. Backs {@link NotesPlaceholder.textFrame}'s `Run.resolvedColor`.
3404
3382
  */
3405
3383
  themeContext(): ThemeContext;
3384
+ /** The placeholders (`p:sp`) in the notes shape tree, in document order. */
3385
+ get placeholders(): NotesPlaceholder[];
3386
+ /** The notes body placeholder (`p:ph type="body"`), or `null` when the notes slide has none. */
3387
+ get body(): NotesPlaceholder | null;
3388
+ /** The slide-thumbnail placeholder (`p:ph type="sldImg"`), or `null` when absent. */
3389
+ get slideImage(): NotesPlaceholder | null;
3390
+ /** The slide-number placeholder (`p:ph type="sldNum"`, carrying the slide-number field), or `null`. */
3391
+ get slideNumber(): NotesPlaceholder | null;
3392
+ /** The notes body as a navigable {@link TextFrame}, or `null` when there is no body text frame. */
3393
+ get textFrame(): TextFrame | null;
3394
+ /** The notes body text flattened (paragraphs joined by `\n`), or `''` when the body is empty/absent. */
3395
+ get text(): string;
3396
+ }
3397
+ //#endregion
3398
+ //#region src/read/api/comments.d.ts
3399
+ /** One entry of the deck-wide comment-author registry (`p:cmAuthor`). */
3400
+ interface CommentAuthor {
3401
+ /** Author id (`@id`), referenced by each comment's `@authorId`. */
3402
+ id: number | null;
3403
+ /** Display name (`@name`). */
3404
+ name: string;
3405
+ /** Initials shown in the comment marker (`@initials`). */
3406
+ initials: string;
3407
+ /** Highest per-author comment index used (`@lastIdx`). */
3408
+ lastIdx: number | null;
3409
+ /** Author colour slot (`@clrIdx`). */
3410
+ clrIdx: number | null;
3411
+ }
3412
+ /** One legacy review comment (`p:cm`), with its author resolved via the registry. */
3413
+ interface Comment {
3414
+ /** Resolved author display name (via `@authorId` → `commentAuthors.xml`), or `null` when unresolved. */
3415
+ author: string | null;
3416
+ /** Resolved author initials, or `null` when unresolved. */
3417
+ authorInitials: string | null;
3418
+ /** The comment's `@authorId`, or `null` when absent/unparseable. */
3419
+ authorId: number | null;
3420
+ /** The comment's per-author 1-based index (`@idx`), or `null` when absent. */
3421
+ idx: number | null;
3422
+ /** The comment body text (`p:text`). */
3423
+ text: string;
3424
+ /** Marker X position in EMU (`p:pos/@x`), or `null` when absent. */
3425
+ x: number | null;
3426
+ /** Marker Y position in EMU (`p:pos/@y`), or `null` when absent. */
3427
+ y: number | null;
3428
+ /** Authored timestamp (`@dt`, ISO-8601 as written), or `null` when absent. */
3429
+ date: string | null;
3430
+ }
3431
+ /** One entry of the modern deck-wide author registry (`p188:author`). */
3432
+ interface ModernCommentAuthor {
3433
+ /** Author id (`@id`) — a GUID string like `{E8A64ABA-…}`, referenced by each comment's `@authorId`. */
3434
+ id: string | null;
3435
+ /** Display name (`@name`). */
3436
+ name: string;
3437
+ /** Initials (`@initials`). */
3438
+ initials: string;
3439
+ /** Account identifier (`@userId`, e.g. an email), or `null`. */
3440
+ userId: string | null;
3441
+ /** Identity provider (`@providerId`, e.g. `Windows Live`), or `null`. */
3442
+ providerId: string | null;
3443
+ }
3444
+ /** One modern comment or reply (`p188:cm` / `p188:reply`), with its author resolved via the registry. */
3445
+ interface ModernComment {
3446
+ /** The comment's own GUID id (`@id`), or `null` when absent. */
3447
+ id: string | null;
3448
+ /** Resolved author display name (via `@authorId` → `authors.xml`), or `null` when unresolved. */
3449
+ author: string | null;
3450
+ /** Resolved author initials, or `null` when unresolved. */
3451
+ authorInitials: string | null;
3452
+ /** The comment's `@authorId` GUID, or `null` when absent. */
3453
+ authorId: string | null;
3454
+ /** Creation timestamp (`@created`, ISO-8601 as written), or `null` when absent. */
3455
+ created: string | null;
3456
+ /** The comment body text; multiple paragraphs are joined with `\n`. */
3457
+ text: string;
3458
+ /** Marker X position in EMU (`p188:pos/@x`), or `null` (replies carry no position). */
3459
+ x: number | null;
3460
+ /** Marker Y position in EMU (`p188:pos/@y`), or `null` (replies carry no position). */
3461
+ y: number | null;
3462
+ /** Nested replies in thread order; each is itself a {@link ModernComment} with no further replies. */
3463
+ replies: ModernComment[];
3464
+ }
3465
+ /** Which comment schema a deck carries. `'none'` when it has neither part. */
3466
+ type CommentSchema = 'legacy' | 'modern' | 'none';
3467
+ //#endregion
3468
+ //#region src/read/api/tags.d.ts
3469
+ /** One programmatic tag (`p:tag`) — a name/value string pair. */
3470
+ interface Tag {
3471
+ /** The tag's `@name`. */
3472
+ name: string;
3473
+ /** The tag's `@val`. */
3474
+ val: string;
3406
3475
  }
3476
+ /**
3477
+ * Read every tag referenced by `ownerPartName` (a slide part or the presentation
3478
+ * part), resolving the owner's `tags` relationship(s) to their `ppt/tags/tagN.xml`
3479
+ * part(s) and flattening each part's `p:tag` children into `{ name, val }`. `[]`
3480
+ * when the owner references no tag part. Rel-driven rather than walking
3481
+ * `p:custDataLst`, so it is robust to element ordering in the owner.
3482
+ */
3483
+ declare function readTagsForPart(opc: OpcPackage, ownerPartName: string): Tag[];
3407
3484
  //#endregion
3408
3485
  //#region src/read/api/transition.d.ts
3409
3486
  /** `ST_TransitionSpeed` — the coarse speed bucket (`spd`), default `fast`. */
@@ -4791,5 +4868,5 @@ interface FromTemplateOptions {
4791
4868
  keepTemplateContentType?: boolean;
4792
4869
  }
4793
4870
  //#endregion
4794
- export { CellThreeD as $, RecolorColor as $t, Theme as A, Shape as At, ModernCommentAuthor as B, TextFrame as Bt, TransitionInfo as C, ChartFill as Ct, Placeholder as D, Connector as Dt, ColorMapToken as E, ChartSeries as Et, readTagsForPart as F, BulletStyle as Ft, isAutoShape as G, CustomGeometryPath as Gt, NotesSlide as H, ChildFrame as Ht, Comment as I, LineSpacing as It, isGroupShape as J, InnerShadow as Jt, isConnector as K, GeometryCommand as Kt, CommentAuthor as L, Paragraph as Lt, ThemeFontFace as M, AutofitMode as Mt, ThemeFontScheme as N, BodyProperties as Nt, SlideLayout as O, Picture as Ot, Tag as P, BulletDetail as Pt, CellBorders as Q, Recolor as Qt, CommentSchema as R, Run as Rt, Slide as S, ChartDataLabels as St, TransitionSpeed as T, ChartLine as Tt, AnyShape as U, ConnectionSite as Ut, NotesPlaceholder as V, AbsoluteFrame as Vt, GroupShape as W, CustomGeometry as Wt, GraphicFrame as X, LineEnds as Xt, isPicture as Y, LineEnd as Yt, CellBorder as Z, OuterShadow as Zt, CustomProperty as _, ChartExLegend as _t, ExtractedSlides as a, BackgroundSource as an, TableConditionFlags as at, AddPictureOptions as b, Chart as bt, ImportSlideMastersOptions as c, PictureFill as cn, DiagramConnection as ct, ImportedSlideMaster as d, GradientStop as dn, DiagramNode as dt, Reflection as en, Table as et, LayoutHandle as f, ResolvedColor as fn, DiagramPoint as ft, CoreProperties as g, ChartExDataLabels as gt, Presentation as h, EmbeddedFontSlot as hn, ChartExAxis as ht, ExtractedSlide as i, BackgroundFill as in, ResolvedTableStyle as it, ThemeColorSlot as j, ShapeHost as jt, SlideMaster as k, AutoShape as kt, ImportSlideOptions as l, PictureFillTile as ln, DiagramConnectionType as lt, SlideSource as m, ColorContext as mn, ChartEx as mt, EmbeddedFontFaceInfo as n, SoftEdge as nn, TableCellBorderEdit as nt, FromTemplateOptions as o, SlideBackground as on, TableCellEdge as ot, SlideSize as p, resolveColorElement as pn, DiagramPointType as pt, isGraphicFrame as q, Glow as qt, EmbeddedFontInfo as r, PatternFill as rn, TableRow as rt, ImportShapeOptions as s, FillRect as sn, Diagram as st, AppendSlidesOptions as t, ShapeType as tn, TableCell as tt, ImportSlidesRequest as u, GradientFill as un, DiagramDrawnShape as ut, readCoreProperties as v, ChartExSeries as vt, TransitionInput as w, ChartLegend as wt, AddTextBoxOptions as x, ChartAxis as xt, readCustomProperties as y, AxisNumberFormat as yt, ModernComment as z, RunHyperlink as zt };
4795
- //# sourceMappingURL=presentation-types-CpkTx9Xa.d.ts.map
4871
+ export { TableCell as $, ShapeType as $t, CommentSchema as A, AutofitMode as At, ThemeFontScheme as B, ChildFrame as Bt, TransitionInfo as C, ChartLine as Ct, readTagsForPart as D, AutoShape as Dt, Tag as E, Picture as Et, Placeholder as F, Paragraph as Ft, isGraphicFrame as G, Glow as Gt, GroupShape as H, CustomGeometry as Ht, SlideLayout as I, Run as It, GraphicFrame as J, LineEnds as Jt, isGroupShape as K, InnerShadow as Kt, SlideMaster as L, RunHyperlink as Lt, ModernCommentAuthor as M, BulletDetail as Mt, NotesPlaceholder as N, BulletStyle as Nt, Comment as O, Shape as Ot, NotesSlide as P, LineSpacing as Pt, Table as Q, Reflection as Qt, Theme as R, TextFrame as Rt, Slide as S, ChartLegend as St, TransitionSpeed as T, Connector as Tt, isAutoShape as U, CustomGeometryPath as Ut, AnyShape as V, ConnectionSite as Vt, isConnector as W, GeometryCommand as Wt, CellBorders as X, Recolor as Xt, CellBorder as Y, OuterShadow as Yt, CellThreeD as Z, RecolorColor as Zt, CustomProperty as _, AxisNumberFormat as _t, ExtractedSlides as a, FillRect as an, Diagram as at, AddPictureOptions as b, ChartDataLabels as bt, ImportSlideMastersOptions as c, GradientFill as cn, DiagramDrawnShape as ct, ImportedSlideMaster as d, resolveColorElement as dn, DiagramPointType as dt, SoftEdge as en, TableCellBorderEdit as et, LayoutHandle as f, ColorTransform as fn, ChartEx as ft, CoreProperties as g, EmbeddedFontSlot as gn, ChartExSeries as gt, Presentation as h, ColorContext as hn, ChartExLegend as ht, ExtractedSlide as i, SlideBackground as in, TableCellEdge as it, ModernComment as j, BodyProperties as jt, CommentAuthor as k, ShapeHost as kt, ImportSlideOptions as l, GradientStop as ln, DiagramNode as lt, SlideSource as m, applyColorTransforms as mn, ChartExDataLabels as mt, EmbeddedFontFaceInfo as n, BackgroundFill as nn, ResolvedTableStyle as nt, FromTemplateOptions as o, PictureFill as on, DiagramConnection as ot, SlideSize as p, EffectiveColor as pn, ChartExAxis as pt, isPicture as q, LineEnd as qt, EmbeddedFontInfo as r, BackgroundSource as rn, TableConditionFlags as rt, ImportShapeOptions as s, PictureFillTile as sn, DiagramConnectionType as st, AppendSlidesOptions as t, PatternFill as tn, TableRow as tt, ImportSlidesRequest as u, ResolvedColor as un, DiagramPoint as ut, readCoreProperties as v, Chart as vt, TransitionInput as w, ChartSeries as wt, AddTextBoxOptions as x, ChartFill as xt, readCustomProperties as y, ChartAxis as yt, ThemeFontFace as z, AbsoluteFrame as zt };
4872
+ //# sourceMappingURL=presentation-types-DP_8jog7.d.ts.map