pptx-react-viewer 3.5.4 → 3.7.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 (163) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/{AiChatPanel-CCJNQGER.mjs → AiChatPanel-L5QGWVZK.mjs} +4 -4
  3. package/dist/AiChatPanel-L5QGWVZK.mjs.br +0 -0
  4. package/dist/AiChatPanel-L5QGWVZK.mjs.gz +0 -0
  5. package/dist/{AiChatPanel-LPZWDNVU.js → AiChatPanel-M3AHKYPS.js} +25 -25
  6. package/dist/AiChatPanel-M3AHKYPS.js.br +0 -0
  7. package/dist/AiChatPanel-M3AHKYPS.js.gz +0 -0
  8. package/dist/{Area3DChartScene-P6YM6ZL7.mjs → Area3DChartScene-AE2XYKDW.mjs} +1 -1
  9. package/dist/Area3DChartScene-AE2XYKDW.mjs.br +1 -0
  10. package/dist/Area3DChartScene-AE2XYKDW.mjs.gz +0 -0
  11. package/dist/{Area3DChartScene-LJCWBNQ3.js → Area3DChartScene-ZQLQK6L4.js} +2 -2
  12. package/dist/Area3DChartScene-ZQLQK6L4.js.br +0 -0
  13. package/dist/Area3DChartScene-ZQLQK6L4.js.gz +0 -0
  14. package/dist/{Bar3DChartScene-DIVOJURZ.mjs → Bar3DChartScene-FQV62XOI.mjs} +1 -1
  15. package/dist/Bar3DChartScene-FQV62XOI.mjs.br +2 -0
  16. package/dist/Bar3DChartScene-FQV62XOI.mjs.gz +0 -0
  17. package/dist/{Bar3DChartScene-7DNQ4X5T.js → Bar3DChartScene-TZ6ADFBS.js} +2 -2
  18. package/dist/Bar3DChartScene-TZ6ADFBS.js.br +0 -0
  19. package/dist/Bar3DChartScene-TZ6ADFBS.js.gz +0 -0
  20. package/dist/{Line3DChartScene-UF6DHP36.js → Line3DChartScene-5CKPAX63.js} +2 -2
  21. package/dist/Line3DChartScene-5CKPAX63.js.br +0 -0
  22. package/dist/Line3DChartScene-5CKPAX63.js.gz +0 -0
  23. package/dist/{Line3DChartScene-ZZVNUKIJ.mjs → Line3DChartScene-FEUY3PCE.mjs} +1 -1
  24. package/dist/Line3DChartScene-FEUY3PCE.mjs.br +1 -0
  25. package/dist/Line3DChartScene-FEUY3PCE.mjs.gz +0 -0
  26. package/dist/{Model3DScene-C7MZ22DH.js → Model3DScene-BLXEALM6.js} +2 -2
  27. package/dist/Model3DScene-BLXEALM6.js.br +0 -0
  28. package/dist/Model3DScene-BLXEALM6.js.gz +0 -0
  29. package/dist/{Model3DScene-XXMAAKBR.mjs → Model3DScene-V3DHIISV.mjs} +1 -1
  30. package/dist/Model3DScene-V3DHIISV.mjs.br +0 -0
  31. package/dist/Model3DScene-V3DHIISV.mjs.gz +0 -0
  32. package/dist/{PieChart3DScene-N2Y25VG5.js → PieChart3DScene-GHHT3PDV.js} +2 -2
  33. package/dist/PieChart3DScene-GHHT3PDV.js.br +0 -0
  34. package/dist/PieChart3DScene-GHHT3PDV.js.gz +0 -0
  35. package/dist/{PieChart3DScene-7LX3IL2Q.mjs → PieChart3DScene-VZI2VARG.mjs} +1 -1
  36. package/dist/{PieChart3DScene-7LX3IL2Q.mjs.br → PieChart3DScene-VZI2VARG.mjs.br} +0 -0
  37. package/dist/PieChart3DScene-VZI2VARG.mjs.gz +0 -0
  38. package/dist/PowerPointViewer-Cl6jBPNw.d.ts.map +1 -1
  39. package/dist/{SurfaceChart3DScene-ADA7NUIW.mjs → SurfaceChart3DScene-T36E2HBA.mjs} +1 -1
  40. package/dist/SurfaceChart3DScene-T36E2HBA.mjs.br +0 -0
  41. package/dist/SurfaceChart3DScene-T36E2HBA.mjs.gz +0 -0
  42. package/dist/{SurfaceChart3DScene-WXJHYOGJ.js → SurfaceChart3DScene-WWIMQ65D.js} +2 -2
  43. package/dist/SurfaceChart3DScene-WWIMQ65D.js.br +0 -0
  44. package/dist/SurfaceChart3DScene-WWIMQ65D.js.gz +0 -0
  45. package/dist/{chunk-UOMFINNJ.js → chunk-3EJFZ7TE.js} +33 -5
  46. package/dist/chunk-3EJFZ7TE.js.br +0 -0
  47. package/dist/chunk-3EJFZ7TE.js.gz +0 -0
  48. package/dist/{chunk-YQOK4E2A.js → chunk-DCNHUEWQ.js} +35917 -23497
  49. package/dist/chunk-DCNHUEWQ.js.br +0 -0
  50. package/dist/chunk-DCNHUEWQ.js.gz +0 -0
  51. package/dist/{chunk-JCJ3EPG6.mjs → chunk-FGTMS7LR.mjs} +14 -23
  52. package/dist/chunk-FGTMS7LR.mjs.br +0 -0
  53. package/dist/chunk-FGTMS7LR.mjs.gz +0 -0
  54. package/dist/{chunk-U52MKWVA.mjs → chunk-JANUSAEK.mjs} +189 -225
  55. package/dist/chunk-JANUSAEK.mjs.br +0 -0
  56. package/dist/chunk-JANUSAEK.mjs.gz +0 -0
  57. package/dist/{chunk-NM652EZS.mjs → chunk-NV55GU5V.mjs} +35881 -23494
  58. package/dist/chunk-NV55GU5V.mjs.br +0 -0
  59. package/dist/chunk-NV55GU5V.mjs.gz +0 -0
  60. package/dist/{chunk-2FMQ7M3L.js → chunk-OBE4TB76.js} +494 -575
  61. package/dist/chunk-OBE4TB76.js.br +0 -0
  62. package/dist/chunk-OBE4TB76.js.gz +0 -0
  63. package/dist/{chunk-EVVWCF2M.mjs → chunk-PC62KGU3.mjs} +67 -148
  64. package/dist/chunk-PC62KGU3.mjs.br +0 -0
  65. package/dist/chunk-PC62KGU3.mjs.gz +0 -0
  66. package/dist/{chunk-HHJZK26I.js → chunk-TUSALM3A.js} +1603 -1310
  67. package/dist/chunk-TUSALM3A.js.br +0 -0
  68. package/dist/chunk-TUSALM3A.js.gz +0 -0
  69. package/dist/{chunk-IWQSAKPM.mjs → chunk-TXY2E7VQ.mjs} +445 -152
  70. package/dist/chunk-TXY2E7VQ.mjs.br +0 -0
  71. package/dist/chunk-TXY2E7VQ.mjs.gz +0 -0
  72. package/dist/{chunk-UTMTXJGM.js → chunk-VIFDZIVX.js} +375 -412
  73. package/dist/chunk-VIFDZIVX.js.br +0 -0
  74. package/dist/chunk-VIFDZIVX.js.gz +0 -0
  75. package/dist/{chunk-UTIMT5CZ.js → chunk-W24OJ7H5.js} +14 -23
  76. package/dist/chunk-W24OJ7H5.js.br +0 -0
  77. package/dist/chunk-W24OJ7H5.js.gz +0 -0
  78. package/dist/{chunk-IVPT3U5C.mjs → chunk-WKODF5ZU.mjs} +29 -1
  79. package/dist/chunk-WKODF5ZU.mjs.br +0 -0
  80. package/dist/chunk-WKODF5ZU.mjs.gz +0 -0
  81. package/dist/i18n.js +4 -4
  82. package/dist/i18n.js.br +0 -0
  83. package/dist/i18n.js.gz +0 -0
  84. package/dist/i18n.mjs +1 -1
  85. package/dist/i18n.mjs.br +0 -0
  86. package/dist/i18n.mjs.gz +0 -0
  87. package/dist/index.d.ts +1012 -45
  88. package/dist/index.js +47 -47
  89. package/dist/index.js.br +0 -0
  90. package/dist/index.js.gz +0 -0
  91. package/dist/index.mjs +6 -6
  92. package/dist/index.mjs.br +0 -0
  93. package/dist/index.mjs.gz +0 -0
  94. package/dist/internals.d.ts +1023 -45
  95. package/dist/internals.d.ts.map +1 -1
  96. package/dist/internals.js +79 -79
  97. package/dist/internals.js.br +0 -0
  98. package/dist/internals.js.gz +0 -0
  99. package/dist/internals.mjs +4 -4
  100. package/dist/internals.mjs.br +0 -0
  101. package/dist/internals.mjs.gz +0 -0
  102. package/dist/{useViewerBuildingBlocks-f6oNGKMX.d.ts → useViewerBuildingBlocks-C8F_4Pzb.d.ts} +3 -1
  103. package/dist/useViewerBuildingBlocks-C8F_4Pzb.d.ts.map +1 -0
  104. package/dist/viewer/index.d.ts +933 -45
  105. package/dist/viewer/index.js +27 -27
  106. package/dist/viewer/index.js.br +0 -0
  107. package/dist/viewer/index.js.gz +0 -0
  108. package/dist/viewer/index.mjs +6 -6
  109. package/dist/viewer/index.mjs.br +0 -0
  110. package/dist/viewer/index.mjs.gz +0 -0
  111. package/package.json +2 -2
  112. package/dist/AiChatPanel-CCJNQGER.mjs.br +0 -0
  113. package/dist/AiChatPanel-CCJNQGER.mjs.gz +0 -0
  114. package/dist/AiChatPanel-LPZWDNVU.js.br +0 -0
  115. package/dist/AiChatPanel-LPZWDNVU.js.gz +0 -0
  116. package/dist/Area3DChartScene-LJCWBNQ3.js.br +0 -0
  117. package/dist/Area3DChartScene-LJCWBNQ3.js.gz +0 -0
  118. package/dist/Area3DChartScene-P6YM6ZL7.mjs.br +0 -0
  119. package/dist/Area3DChartScene-P6YM6ZL7.mjs.gz +0 -0
  120. package/dist/Bar3DChartScene-7DNQ4X5T.js.br +0 -1
  121. package/dist/Bar3DChartScene-7DNQ4X5T.js.gz +0 -0
  122. package/dist/Bar3DChartScene-DIVOJURZ.mjs.br +0 -0
  123. package/dist/Bar3DChartScene-DIVOJURZ.mjs.gz +0 -0
  124. package/dist/Line3DChartScene-UF6DHP36.js.br +0 -0
  125. package/dist/Line3DChartScene-UF6DHP36.js.gz +0 -0
  126. package/dist/Line3DChartScene-ZZVNUKIJ.mjs.br +0 -0
  127. package/dist/Line3DChartScene-ZZVNUKIJ.mjs.gz +0 -0
  128. package/dist/Model3DScene-C7MZ22DH.js.br +0 -0
  129. package/dist/Model3DScene-C7MZ22DH.js.gz +0 -0
  130. package/dist/Model3DScene-XXMAAKBR.mjs.br +0 -0
  131. package/dist/Model3DScene-XXMAAKBR.mjs.gz +0 -0
  132. package/dist/PieChart3DScene-7LX3IL2Q.mjs.gz +0 -0
  133. package/dist/PieChart3DScene-N2Y25VG5.js.br +0 -0
  134. package/dist/PieChart3DScene-N2Y25VG5.js.gz +0 -0
  135. package/dist/SurfaceChart3DScene-ADA7NUIW.mjs.br +0 -0
  136. package/dist/SurfaceChart3DScene-ADA7NUIW.mjs.gz +0 -0
  137. package/dist/SurfaceChart3DScene-WXJHYOGJ.js.br +0 -0
  138. package/dist/SurfaceChart3DScene-WXJHYOGJ.js.gz +0 -0
  139. package/dist/chunk-2FMQ7M3L.js.br +0 -0
  140. package/dist/chunk-2FMQ7M3L.js.gz +0 -0
  141. package/dist/chunk-EVVWCF2M.mjs.br +0 -0
  142. package/dist/chunk-EVVWCF2M.mjs.gz +0 -0
  143. package/dist/chunk-HHJZK26I.js.br +0 -0
  144. package/dist/chunk-HHJZK26I.js.gz +0 -0
  145. package/dist/chunk-IVPT3U5C.mjs.br +0 -0
  146. package/dist/chunk-IVPT3U5C.mjs.gz +0 -0
  147. package/dist/chunk-IWQSAKPM.mjs.br +0 -0
  148. package/dist/chunk-IWQSAKPM.mjs.gz +0 -0
  149. package/dist/chunk-JCJ3EPG6.mjs.br +0 -0
  150. package/dist/chunk-JCJ3EPG6.mjs.gz +0 -0
  151. package/dist/chunk-NM652EZS.mjs.br +0 -0
  152. package/dist/chunk-NM652EZS.mjs.gz +0 -0
  153. package/dist/chunk-U52MKWVA.mjs.br +0 -0
  154. package/dist/chunk-U52MKWVA.mjs.gz +0 -0
  155. package/dist/chunk-UOMFINNJ.js.br +0 -0
  156. package/dist/chunk-UOMFINNJ.js.gz +0 -0
  157. package/dist/chunk-UTIMT5CZ.js.br +0 -0
  158. package/dist/chunk-UTIMT5CZ.js.gz +0 -0
  159. package/dist/chunk-UTMTXJGM.js.br +0 -0
  160. package/dist/chunk-UTMTXJGM.js.gz +0 -0
  161. package/dist/chunk-YQOK4E2A.js.br +0 -0
  162. package/dist/chunk-YQOK4E2A.js.gz +0 -0
  163. package/dist/useViewerBuildingBlocks-f6oNGKMX.d.ts.map +0 -1
@@ -43,6 +43,12 @@ interface PptxAction {
43
43
  soundRId?: string;
44
44
  /** Resolved media target path for the optional click sound. */
45
45
  soundPath?: string;
46
+ /**
47
+ * `CT_Hyperlink/@endSnd` (ECMA-376 20.1.2.2.23): PowerPoint's Action
48
+ * Settings "Stop previous sound" checkbox. Round-tripped for now (issue
49
+ * G14); not yet wired into playback.
50
+ */
51
+ endSnd?: boolean;
46
52
  }
47
53
  //#endregion
48
54
  //#region src/core/types/common.d.ts
@@ -65,7 +71,7 @@ interface PptxAction {
65
71
  * // => "wavy" — one of: sng | dbl | heavy | dotted | dash | wavy | none | ...
66
72
  * ```
67
73
  */
68
- type UnderlineStyle = 'sng' | 'dbl' | 'heavy' | 'dotted' | 'dottedHeavy' | 'dash' | 'dashHeavy' | 'dashLong' | 'dashLongHeavy' | 'dotDash' | 'dotDashHeavy' | 'dotDotDash' | 'dotDotDashHeavy' | 'wavy' | 'wavyHeavy' | 'wavyDbl' | 'none';
74
+ type UnderlineStyle = 'sng' | 'dbl' | 'heavy' | 'dotted' | 'dottedHeavy' | 'dash' | 'dashHeavy' | 'dashLong' | 'dashLongHeavy' | 'dotDash' | 'dotDashHeavy' | 'dotDotDash' | 'dotDotDashHeavy' | 'wavy' | 'wavyHeavy' | 'wavyDbl' | 'words' | 'none';
69
75
  /**
70
76
  * Connector connection point reference — links a connector endpoint to a
71
77
  * specific shape on the slide.
@@ -400,6 +406,16 @@ interface CustomGeometryRawData {
400
406
  cxnLstXml?: unknown;
401
407
  /** Raw `a:rect` XML content (text rectangle). */
402
408
  rectXml?: unknown;
409
+ /**
410
+ * Raw `a:pathLst` XML content: every `a:path`'s formula-bearing `a:pt`
411
+ * x/y attributes, `a:arcTo` params, `a:close`, and per-path `@w`/`@h`/
412
+ * `@fill`/`@stroke`/`@extrusionOk`, preserved verbatim (not the
413
+ * parse-time-resolved numbers in `customGeometryPaths`). Lets a live
414
+ * `shapeAdjustments` drag re-evaluate the outline against the CURRENT
415
+ * guide values instead of the ones baked in at parse time; see
416
+ * `geometry/custom-geometry-live-eval.ts`.
417
+ */
418
+ pathLstXml?: unknown;
403
419
  }
404
420
  /**
405
421
  * XY-style adjustment handle (`a:ahXY`) on a custom geometry.
@@ -555,6 +571,44 @@ interface PptxCustomPathProperties {
555
571
  customGeometryTextRect?: CustomGeometryTextRect;
556
572
  }
557
573
  //#endregion
574
+ //#region src/core/types/color-ref.d.ts
575
+ /**
576
+ * Theme colour references: the typed counterpart of `<a:schemeClr>`.
577
+ *
578
+ * A colour picked from the theme palette is remembered as a scheme slot plus
579
+ * PowerPoint's luminance variants rather than as the sRGB it currently
580
+ * resolves to, so a later theme change re-colours the shape (and a saved file
581
+ * keeps `<a:schemeClr>` instead of a canonical `<a:srgbClr>`).
582
+ *
583
+ * @module types/color-ref
584
+ */
585
+ /**
586
+ * The scheme slot names `a:schemeClr/@val` accepts (ECMA-376 `ST_SchemeColorIndex`).
587
+ * `bg1`/`tx1`/`bg2`/`tx2` are the colour-map aliases a slide resolves through
588
+ * `p:clrMap`; `phClr` is the placeholder colour used inside a theme's style
589
+ * matrix and is never chosen from a picker.
590
+ */
591
+ type PptxThemeColorSchemeName = 'dk1' | 'lt1' | 'dk2' | 'lt2' | 'accent1' | 'accent2' | 'accent3' | 'accent4' | 'accent5' | 'accent6' | 'hlink' | 'folHlink' | 'bg1' | 'tx1' | 'bg2' | 'tx2' | 'phClr';
592
+ /**
593
+ * A theme colour choice. Every transform is a 0..1 fraction of the OOXML
594
+ * percentage (`lumMod val="20000"` is `lumMod: 0.2`), matching how the parser
595
+ * reads them, and is applied in the order `a:schemeClr` children are written:
596
+ * `tint`, `shade`, `lumMod`, `lumOff`, `alpha`.
597
+ */
598
+ interface PptxThemeColorRef {
599
+ scheme: PptxThemeColorSchemeName;
600
+ /** `a:lumMod`: multiply HSL luminance (PowerPoint's "Lighter/Darker" rows). */
601
+ lumMod?: number;
602
+ /** `a:lumOff`: add to HSL luminance after `lumMod` ("Lighter N%" rows). */
603
+ lumOff?: number;
604
+ /** `a:tint`: blend towards white. */
605
+ tint?: number;
606
+ /** `a:shade`: blend towards black. */
607
+ shade?: number;
608
+ /** `a:alpha`: opacity fraction (1 = opaque). */
609
+ alpha?: number;
610
+ }
611
+ //#endregion
558
612
  //#region src/core/types/effect-dag.d.ts
559
613
  type EffectDagBlendMode = 'darken' | 'lighten' | 'mult' | 'over' | 'screen';
560
614
  type EffectDagContainerType = 'sib' | 'tree';
@@ -844,6 +898,15 @@ interface ShapeStyle {
844
898
  * back to canonical `<a:srgbClr>`.
845
899
  */
846
900
  fillColorXml?: XmlObject;
901
+ /**
902
+ * Typed theme colour reference for the fill, set when {@link fillColorXml}
903
+ * is a plain `a:schemeClr` (see `themeColorRefFromColorChoice`). When
904
+ * present it WINS on save: the writer emits `<a:schemeClr>` from this ref
905
+ * instead of the resolved {@link fillColor}, so the fill keeps following
906
+ * the theme palette after a later theme change. `undefined` means the fill
907
+ * is a plain hex (or a colour kind a ref cannot express).
908
+ */
909
+ fillColorRef?: PptxThemeColorRef;
847
910
  fillGradient?: string;
848
911
  /** Original `gradFill` XML retained for unknown-child and extension round-tripping. */
849
912
  fillGradientXml?: XmlObject;
@@ -878,6 +941,12 @@ interface ShapeStyle {
878
941
  opacity?: number;
879
942
  /** Raw XML colour node preserved for round-trip (e.g. a:schemeClr with transforms). */
880
943
  originalColorXml?: XmlObject;
944
+ /**
945
+ * Typed theme colour reference for this stop, set when
946
+ * {@link originalColorXml} is a plain `a:schemeClr`. Wins on save, same
947
+ * as {@link ShapeStyle.fillColorRef}.
948
+ */
949
+ colorRef?: PptxThemeColorRef;
881
950
  }>;
882
951
  fillGradientAngle?: number;
883
952
  fillGradientType?: 'linear' | 'radial';
@@ -924,6 +993,12 @@ interface ShapeStyle {
924
993
  * round-trip serialisation. See {@link fillColorXml} for the rationale.
925
994
  */
926
995
  strokeColorXml?: XmlObject;
996
+ /**
997
+ * Typed theme colour reference for the outline, mirroring
998
+ * {@link fillColorRef}: set when {@link strokeColorXml} is a plain
999
+ * `a:schemeClr`, and wins on save.
1000
+ */
1001
+ strokeColorRef?: PptxThemeColorRef;
927
1002
  /**
928
1003
  * Kind of fill painted on the outline (`a:ln` child). Distinguishes a solid
929
1004
  * outline from a gradient/pattern/none outline so save can emit the correct
@@ -1157,6 +1232,21 @@ interface ShapeStyle {
1157
1232
  dagFillOverlayColor?: string;
1158
1233
  /** Fill overlay tint opacity (0-1), from the overlay fill colour's alpha. */
1159
1234
  dagFillOverlayOpacity?: number;
1235
+ /** Fill overlay blend mode from a direct `a:effectLst/a:fillOverlay/@blend`. */
1236
+ shapeFillOverlayBlend?: 'over' | 'mult' | 'screen' | 'darken' | 'lighten';
1237
+ /**
1238
+ * Fill overlay tint colour (hex `#RRGGBB`) from a direct
1239
+ * `a:effectLst/a:fillOverlay`'s `a:solidFill`/`a:gradFill`.
1240
+ */
1241
+ shapeFillOverlayColor?: string;
1242
+ /** Fill overlay tint opacity (0-1), from the overlay fill colour's alpha. */
1243
+ shapeFillOverlayOpacity?: number;
1244
+ /** Original source `a:fillOverlay` node, preserved for lossless surgical updates. */
1245
+ fillOverlayXml?: XmlObject;
1246
+ /** Resolved source fill-overlay colour used to detect colour edits. */
1247
+ shapeFillOverlayOriginalColor?: string;
1248
+ /** Source fill-overlay opacity used to detect alpha edits. */
1249
+ shapeFillOverlayOriginalOpacity?: number;
1160
1250
  /** `<a:lnRef @idx>` — 1-based index into the theme's lnStyleLst. */
1161
1251
  lnRefIdx?: number;
1162
1252
  /** Raw XML colour child of `<a:lnRef>` (e.g. `<a:schemeClr>` with transforms). */
@@ -1412,8 +1502,25 @@ interface TextStyle {
1412
1502
  * verbatim when the resolved {@link color} still matches this node.
1413
1503
  */
1414
1504
  colorXml?: XmlObject;
1505
+ /**
1506
+ * Typed theme colour reference for the run's text colour, set when
1507
+ * {@link colorXml} is a plain `a:schemeClr` (see
1508
+ * `themeColorRefFromColorChoice`). When present it WINS on save: the
1509
+ * writer emits `<a:schemeClr>` from this ref instead of the resolved
1510
+ * {@link color}, so the text keeps following the theme palette after a
1511
+ * later theme change.
1512
+ */
1513
+ colorRef?: PptxThemeColorRef;
1415
1514
  align?: 'left' | 'center' | 'right' | 'justify' | 'justLow' | 'dist' | 'thaiDist';
1416
- vAlign?: 'top' | 'middle' | 'bottom';
1515
+ /**
1516
+ * Vertical text-box anchor (`a:bodyPr/@anchor`, `ST_TextAnchoringType`).
1517
+ * `distributed`/`justified` (`dist`/`just`) stretch line spacing so the
1518
+ * paragraph block fills the box's full vertical extent, distinct from true
1519
+ * centering (`middle`/`ctr`); both approximate to a middle-anchored render
1520
+ * (see `text-body-layout.ts`) since CSS has no native vertical-justify
1521
+ * primitive, but round-trip losslessly through parse/save.
1522
+ */
1523
+ vAlign?: 'top' | 'middle' | 'bottom' | 'distributed' | 'justified';
1417
1524
  /** Right-to-left paragraph/run direction (`a:pPr/@rtl`, `a:rPr/@rtl`). */
1418
1525
  rtl?: boolean;
1419
1526
  /** Body text direction (`a:bodyPr/@vert`).
@@ -1829,6 +1936,12 @@ interface BulletInfo {
1829
1936
  * identity rather than being flattened to `<a:srgbClr/>` on save.
1830
1937
  */
1831
1938
  colorXml?: XmlObject;
1939
+ /**
1940
+ * Typed theme colour reference for the bullet colour, set when
1941
+ * {@link colorXml} is a plain `a:schemeClr`. Wins on save, same as
1942
+ * {@link TextStyle.colorRef}.
1943
+ */
1944
+ colorRef?: PptxThemeColorRef;
1832
1945
  /** True when `a:buNone` explicitly suppresses bullets. */
1833
1946
  none?: boolean;
1834
1947
  /** Picture bullet: relationship ID from `a:buBlip` → `a:blip[@r:embed]`. */
@@ -2234,6 +2347,50 @@ interface PptxChartAxisLabelFormatting {
2234
2347
  noMultiLevelLabels?: boolean;
2235
2348
  }
2236
2349
  //#endregion
2350
+ //#region src/core/types/chart-ex.d.ts
2351
+ /**
2352
+ * Chart-formatting types that don't fit an existing, owned type module for
2353
+ * this wave (`types/chart.ts` is owned elsewhere; see its own module doc).
2354
+ * Despite the file name, `PptxChartDataPointPicture` is a CLASSIC (`c:`)
2355
+ * construct, not ChartEx (`cx:`) - it landed here only because it needs a
2356
+ * home outside `chart.ts`.
2357
+ *
2358
+ * @module pptx-types/chart-ex
2359
+ */
2360
+ /** `c:dPt/c:pictureOptions/c:pictureFormat/@val` (ST_PictureFormat). */
2361
+ type PptxChartPictureFormat = 'stretch' | 'stack' | 'stackScale';
2362
+ /**
2363
+ * Per-data-point picture-fill flags (`c:dPt/c:pictureOptions`): PowerPoint's
2364
+ * "Picture or texture fill" with "Stack"/"Stretch" semantics on a bar/column
2365
+ * data point, distinct from the point's plain `c:spPr` solid/gradient fill.
2366
+ *
2367
+ * The flags parse purely (`parseChartDataPointPicture` in
2368
+ * `utils/chart-datapoint-serializer.ts`); {@link imageUrl} is a separate,
2369
+ * later addition populated by the runtime (`PptxHandlerRuntimeChartParsing.ts`)
2370
+ * once the sibling `c:spPr/a:blipFill/a:blip`'s `r:embed`/`r:link` is resolved
2371
+ * against the chart part's relationships, since that resolution needs zip/file
2372
+ * access the pure parser does not have.
2373
+ */
2374
+ interface PptxChartDataPointPicture {
2375
+ /** Apply the picture to the front face of a 3-D bar/column (`c:applyToFront`). */
2376
+ applyToFront?: boolean;
2377
+ /** Apply the picture to the side faces of a 3-D bar/column (`c:applyToSides`). */
2378
+ applyToSides?: boolean;
2379
+ /** Apply the picture to the end face of a 3-D bar/column (`c:applyToEnd`). */
2380
+ applyToEnd?: boolean;
2381
+ /** Stretch, or stack repeated tiles at their natural size (or scaled). */
2382
+ pictureFormat?: PptxChartPictureFormat;
2383
+ /** Height, in points, of one repeated picture tile for "stack"/"stackScale" (`c:pictureStackUnit/@val`). */
2384
+ pictureStackUnit?: number;
2385
+ /**
2386
+ * Resolved picture source (a `data:`/`blob:` URL) for the point's sibling
2387
+ * `c:spPr/a:blipFill/a:blip`. Populated by the runtime after relationship
2388
+ * resolution (C2-G9 render half); absent until then, and absent entirely
2389
+ * when the point has no picture fill or the image could not be resolved.
2390
+ */
2391
+ imageUrl?: string;
2392
+ }
2393
+ //#endregion
2237
2394
  //#region src/core/types/chart-pivot-format.d.ts
2238
2395
  interface PptxChartPivotFormat {
2239
2396
  index: number;
@@ -2297,6 +2454,15 @@ interface PptxChartPageSetup {
2297
2454
  horizontalDpi?: number;
2298
2455
  verticalDpi?: number;
2299
2456
  copies?: number;
2457
+ /**
2458
+ * Custom paper height, used when {@link paperSize} is `0`
2459
+ * (`c:pageSetup/@paperHeight`, ST_PositiveUniversalMeasure, e.g. `"297mm"`).
2460
+ * Kept as the raw measure string rather than converted, matching how the
2461
+ * schema stores it.
2462
+ */
2463
+ paperHeight?: string;
2464
+ /** Custom paper width, used when {@link paperSize} is `0` (`@paperWidth`). */
2465
+ paperWidth?: string;
2300
2466
  /** Original leaf retained for foreign attributes. */
2301
2467
  rawXml?: unknown;
2302
2468
  }
@@ -2328,6 +2494,98 @@ interface PptxChartProtection {
2328
2494
  rawXml?: XmlObject;
2329
2495
  }
2330
2496
  //#endregion
2497
+ //#region src/core/types/chart-style-definition.d.ts
2498
+ /**
2499
+ * Typed subset of an Office 2013+ chart-style part (`ppt/charts/style#.xml`,
2500
+ * root element `cs:chartStyle`, relationship type
2501
+ * `.../2012/relationships/chartStyle`).
2502
+ *
2503
+ * PowerPoint's Design-tab "Chart Styles" gallery (1-48) writes `c:style/@val`
2504
+ * on the chart part itself (already modeled as `PptxChartStyle.styleId`) and,
2505
+ * for most styles, this SEPARATE part spelling out the per-element
2506
+ * `cs:lnRef`/`cs:fillRef`/`cs:effectRef`/`cs:fontRef`/`cs:defRPr` defaults a
2507
+ * chart element falls back to when its own XML leaves it unstyled. Without
2508
+ * parsing this part, styles beyond the one PowerPoint happens to have baked
2509
+ * inline are visually inert.
2510
+ *
2511
+ * @module pptx-types/chart-style-definition
2512
+ */
2513
+ /**
2514
+ * One styled chart-element entry (`cs:title`, `cs:axisTitle`,
2515
+ * `cs:categoryAxis`, ...). Colours are resolved to hex at parse time (scheme
2516
+ * colour references via `cs:fontRef`/`cs:lnRef`/`cs:fillRef` are already
2517
+ * flattened against the theme, matching how classic chart colours resolve
2518
+ * elsewhere in this codebase). Fields are present only when the source XML
2519
+ * carried a value for them.
2520
+ */
2521
+ interface PptxChartStylePartEntry {
2522
+ /** Text size in points, from `cs:defRPr/@sz` (hundredths of a point). */
2523
+ fontSize?: number;
2524
+ bold?: boolean;
2525
+ italic?: boolean;
2526
+ /** Resolved text colour: `cs:defRPr/a:solidFill`, or `cs:fontRef`'s scheme colour. */
2527
+ color?: string;
2528
+ /** Resolved line colour from `cs:lnRef`'s scheme colour reference. */
2529
+ lineColor?: string;
2530
+ /** Line width in points, when directly authored (rare; most styles reference a theme line style by index only). */
2531
+ lineWidth?: number;
2532
+ /** Resolved fill colour from `cs:fillRef`'s scheme colour reference. */
2533
+ fillColor?: string;
2534
+ }
2535
+ /**
2536
+ * Parsed per-element style defaults from a chart-style part. Only the
2537
+ * elements this viewer actually renders distinct defaults for are modeled;
2538
+ * elements PowerPoint's style gallery also styles (data table, trendlines,
2539
+ * up/down bars, ...) are out of scope until a renderer needs them.
2540
+ */
2541
+ interface PptxChartStyleDefinition {
2542
+ title?: PptxChartStylePartEntry;
2543
+ axisTitle?: PptxChartStylePartEntry;
2544
+ categoryAxis?: PptxChartStylePartEntry;
2545
+ valueAxis?: PptxChartStylePartEntry;
2546
+ legend?: PptxChartStylePartEntry;
2547
+ dataLabel?: PptxChartStylePartEntry;
2548
+ dataPoint?: PptxChartStylePartEntry;
2549
+ dataPointLine?: PptxChartStylePartEntry;
2550
+ gridlineMajor?: PptxChartStylePartEntry;
2551
+ gridlineMinor?: PptxChartStylePartEntry;
2552
+ chartArea?: PptxChartStylePartEntry;
2553
+ plotArea?: PptxChartStylePartEntry;
2554
+ }
2555
+ //#endregion
2556
+ //#region src/core/types/chart-title.d.ts
2557
+ /**
2558
+ * Chart title rich-text run type, split out of `types/chart.ts` (already at
2559
+ * the repo's file-size limit) to keep that module from growing further.
2560
+ *
2561
+ * @module pptx-types/chart-title
2562
+ */
2563
+ /**
2564
+ * One run of a chart title's rich text (`c:title/c:tx/c:rich/a:p/a:r`).
2565
+ *
2566
+ * The flat `PptxChartData.title` field only ever captured the FIRST run's
2567
+ * text with no per-run formatting; `titleRuns` (when present) is the
2568
+ * lossless, multi-run replacement parsed from the same `c:rich` body. Absent
2569
+ * when the title has no rich text at all (an empty/auto title, or one
2570
+ * authored as a linked-cell reference).
2571
+ */
2572
+ interface PptxChartTitleRun {
2573
+ /** This run's text (`a:t`). */
2574
+ text: string;
2575
+ /** `a:rPr/@_b`. */
2576
+ bold?: boolean;
2577
+ /** `a:rPr/@_i`. */
2578
+ italic?: boolean;
2579
+ /**
2580
+ * Font size in POINTS (`a:rPr/@_sz`, hundredths of a point / 100), matching
2581
+ * `PptxChartLegendTextStyle.fontSize`'s convention rather than the pixel
2582
+ * convention `TextStyle.fontSize` uses for slide text.
2583
+ */
2584
+ fontSize?: number;
2585
+ /** Resolved hex colour (e.g. `"#FF0000"`) from `a:rPr/a:solidFill`. */
2586
+ color?: string;
2587
+ }
2588
+ //#endregion
2331
2589
  //#region src/core/types/chart-user-shapes.d.ts
2332
2590
  /**
2333
2591
  * Types for chart drawing-overlay shapes (`c:userShapes`).
@@ -2366,8 +2624,16 @@ interface PptxChartUserShapeParagraph {
2366
2624
  * `absSizeAnchor` the extent is {@link ext} in EMU.
2367
2625
  */
2368
2626
  interface PptxChartUserShape {
2369
- /** Shape kind: text/preset shape, connector, or picture. */
2370
- kind: 'sp' | 'cxnSp' | 'pic';
2627
+ /**
2628
+ * Shape kind: text/preset shape, connector, picture, a group of the
2629
+ * above (`grpSp`, flattened: each grouped child becomes its own entry
2630
+ * reusing the anchor's own bounding box, an approximation since the
2631
+ * group's internal chOff/chExt transform is not applied), or a bare
2632
+ * placeholder for a `graphicFrame` anchor child (deep content such as a
2633
+ * nested chart or table is out of scope; it only keeps the anchor's
2634
+ * space accounted for instead of the whole overlay disappearing).
2635
+ */
2636
+ kind: 'sp' | 'cxnSp' | 'pic' | 'grpSp' | 'graphicFrame';
2371
2637
  /** Anchor kind that positioned the shape. */
2372
2638
  anchor: 'rel' | 'abs';
2373
2639
  /** Top-left corner as chart-relative fractions (0-1). */
@@ -2468,6 +2734,10 @@ interface PptxChartTrendline {
2468
2734
  displayRSq?: boolean;
2469
2735
  displayEq?: boolean;
2470
2736
  color?: string;
2737
+ /** Trendline width in points (`c:trendline/c:spPr/a:ln/@w`, EMU / 12700). */
2738
+ lineWidth?: number;
2739
+ /** Trendline dash style (`c:trendline/c:spPr/a:ln/a:prstDash/@val`). */
2740
+ lineDashStyle?: string;
2471
2741
  label?: PptxChartTrendlineLabel | null;
2472
2742
  }
2473
2743
  /** Typed, commonly edited properties of `c:trendlineLbl`. */
@@ -2513,6 +2783,10 @@ interface PptxChartErrBars {
2513
2783
  customMinus?: number[];
2514
2784
  noEndCap?: boolean;
2515
2785
  color?: string;
2786
+ /** Error-bar line width in points (`c:errBars/c:spPr/a:ln/@w`, EMU / 12700). */
2787
+ width?: number;
2788
+ /** Error-bar line dash style (`c:errBars/c:spPr/a:ln/a:prstDash/@val`). */
2789
+ dashStyle?: string;
2516
2790
  }
2517
2791
  /**
2518
2792
  * Visibility flags for the chart data table (axes + legend keys).
@@ -2599,6 +2873,8 @@ interface PptxChartDataPoint {
2599
2873
  marker?: PptxChartMarker;
2600
2874
  /** Render a bubble-chart point with a 3-D appearance. */
2601
2875
  bubble3D?: boolean;
2876
+ /** Per-point picture-fill flags (`c:dPt/c:pictureOptions`). */
2877
+ picture?: PptxChartDataPointPicture;
2602
2878
  }
2603
2879
  /** Schema values accepted by `c:dLblPos`. */
2604
2880
  type PptxChartDataLabelPosition = 'bestFit' | 'b' | 'ctr' | 'inBase' | 'inEnd' | 'l' | 'outEnd' | 'r' | 't';
@@ -2617,6 +2893,32 @@ interface PptxChartDataLabel {
2617
2893
  text?: string;
2618
2894
  separator?: string;
2619
2895
  showLeaderLines?: boolean;
2896
+ /**
2897
+ * Per-label number-format override (`c:dLbl/c:numFmt/@formatCode`), taking
2898
+ * precedence over the chart-level {@link PptxChartDataLabelOptions.numberFormat}
2899
+ * and the series' own {@link PptxChartSeries.numberFormat} when set.
2900
+ */
2901
+ numberFormat?: string;
2902
+ /**
2903
+ * Manually dragged label position (`c:dLbl/c:layout/c:manualLayout`), the
2904
+ * same CT_ManualLayout shape used for title/legend/plotArea. `null`
2905
+ * explicitly clears a drag back to the automatic position.
2906
+ */
2907
+ layout?: PptxChartManualLayout | null;
2908
+ /**
2909
+ * This label's own font (`c:dLbl/c:txPr/a:p/a:pPr/a:defRPr`, or ChartEx
2910
+ * `cx:dataLabel/cx:txPr`), taking precedence over the chart/series-level
2911
+ * {@link PptxChartDataLabelOptions.txPr} when set. Reuses the legend
2912
+ * entry's flat text-style shape since both are the same
2913
+ * `.../a:p/a:pPr/a:defRPr` default-run-property style.
2914
+ */
2915
+ txPr?: PptxChartLegendTextStyle;
2916
+ /**
2917
+ * This label's own shape formatting (`c:dLbl/c:spPr`): fill/line colour,
2918
+ * width, and dash style for the label's callout box, taking precedence
2919
+ * over any chart/series-level default when set.
2920
+ */
2921
+ spPr?: PptxChartShapeProps;
2620
2922
  }
2621
2923
  /** Axis number format. */
2622
2924
  interface PptxChartAxisNumFmt {
@@ -2631,6 +2933,16 @@ interface PptxChartDisplayUnitsLabel {
2631
2933
  layout?: PptxChartManualLayout | null;
2632
2934
  /** Label shape formatting. `null` removes `c:spPr`. */
2633
2935
  spPr?: PptxChartShapeProps | null;
2936
+ /**
2937
+ * The label's own run font, when it carries a distinct `txPr` from the
2938
+ * axis's own (ChartEx `cx:unitsLabel/cx:txPr`; classic `c:dispUnitsLbl`
2939
+ * has no equivalent child, so this is only ever populated from a ChartEx
2940
+ * axis).
2941
+ */
2942
+ fontFamily?: string;
2943
+ fontSize?: number;
2944
+ fontBold?: boolean;
2945
+ fontColor?: string;
2634
2946
  }
2635
2947
  /** Axis formatting for category, value, or date axes. */
2636
2948
  interface PptxChartAxisFormatting extends PptxChartAxisLabelFormatting {
@@ -2735,8 +3047,27 @@ interface PptxChartWaterfallOptions {
2735
3047
  /** Whether connector lines are visible between adjacent bars. */
2736
3048
  connectorLines?: boolean;
2737
3049
  }
3050
+ /**
3051
+ * A single breakpoint in a ChartEx colour-by-value scale
3052
+ * (`cx:valueColorPositions/cx:colorPosition`). `kind` selects which of
3053
+ * CT_ColorPosition's union members was authored; `value` is absent for
3054
+ * `min`/`max` (they are implicit endpoints) and required otherwise.
3055
+ */
3056
+ interface PptxCxValueColorPosition {
3057
+ kind: 'min' | 'max' | 'number' | 'percent';
3058
+ value?: number;
3059
+ }
2738
3060
  /** Office 2016 ChartEx geographic series dimensions and layout options. */
2739
3061
  interface PptxChartRegionMapOptions {
3062
+ /**
3063
+ * Colour-by-value gradient stops (`cx:valueColors/cx:colors/cx:color`),
3064
+ * resolved to hex, 2 or 3 entries (matching PowerPoint's two- and
3065
+ * three-colour scale UI). Paired index-for-index with
3066
+ * {@link valueColorPositions} when both are present.
3067
+ */
3068
+ valueColors?: string[];
3069
+ /** Gradient breakpoints for {@link valueColors} (`cx:valueColorPositions`). */
3070
+ valueColorPositions?: PptxCxValueColorPosition[];
2740
3071
  /** Optional provider entity identifiers aligned with categories and values. */
2741
3072
  entityIds?: string[];
2742
3073
  /** Original `cx:pt/@idx` values for category points. */
@@ -2901,6 +3232,20 @@ interface PptxChartDataLabelOptions {
2901
3232
  * Omit to let PowerPoint use the type default.
2902
3233
  */
2903
3234
  position?: PptxChartDataLabelPosition;
3235
+ /**
3236
+ * Chart-level number-format override (`c:dLbls/c:numFmt/@formatCode`),
3237
+ * applied to every label of the series/chart-type unless a per-point
3238
+ * {@link PptxChartDataLabel.numberFormat} overrides it.
3239
+ */
3240
+ numberFormat?: string;
3241
+ /**
3242
+ * Default font for every label at this level (`c:dLbls/c:txPr`, or
3243
+ * ChartEx `cx:dataLabels/cx:txPr`), overridden by a per-point
3244
+ * {@link PptxChartDataLabel.txPr} when set. `c:dLbls` at the chart-type
3245
+ * level and the series level cascade the same way the show flags do
3246
+ * (point > series > chart-type).
3247
+ */
3248
+ txPr?: PptxChartLegendTextStyle;
2904
3249
  }
2905
3250
  /** Typed text defaults for a single chart legend entry. */
2906
3251
  interface PptxChartLegendTextStyle {
@@ -2957,6 +3302,17 @@ interface PptxChartStyle {
2957
3302
  hasDataLabels?: boolean;
2958
3303
  /** Chart-level data-label content/position options (when `hasDataLabels`). */
2959
3304
  dataLabels?: PptxChartDataLabelOptions;
3305
+ /**
3306
+ * Font styling for the chart's own title (`c:title/c:txPr`), edited via
3307
+ * `applyChartTitleStyleToXml` (chart-title-style-serializer.ts). Distinct
3308
+ * from an axis title's styling (`PptxChartAxisFormatting.fontFamily` etc.).
3309
+ */
3310
+ titleFontFamily?: string;
3311
+ titleFontSize?: number;
3312
+ titleFontBold?: boolean;
3313
+ titleFontColor?: string;
3314
+ /** Title text-box fill/border (`c:title/c:spPr`). `null` removes it. */
3315
+ titleSpPr?: PptxChartShapeProps | null;
2960
3316
  }
2961
3317
  /**
2962
3318
  * External data source reference for a chart (c:externalData).
@@ -3126,6 +3482,16 @@ interface PptxChartDateCategories {
3126
3482
  */
3127
3483
  interface PptxChartData {
3128
3484
  title?: string;
3485
+ /**
3486
+ * Rich-text runs of the title, parsed from `c:title/c:tx/c:rich` (issue:
3487
+ * chart title rich text). Lossless multi-run alternative to the flat
3488
+ * {@link title}: when present, the writer serialises every run's own
3489
+ * bold/italic/size/color; when absent, save falls back to the flat
3490
+ * `title` path as before. Only populated for a classic (`c:`) chart's
3491
+ * rich (typed) title, not a ChartEx (`cx:`) title or one authored as a
3492
+ * linked-cell reference.
3493
+ */
3494
+ titleRuns?: PptxChartTitleRun[];
3129
3495
  chartType: PptxChartType;
3130
3496
  categories: string[];
3131
3497
  /**
@@ -3217,8 +3583,10 @@ interface PptxChartData {
3217
3583
  chartRelationshipId?: string;
3218
3584
  /** `null` explicitly removes an existing ChartML data table. */
3219
3585
  dataTable?: PptxChartDataTable | null;
3220
- dropLines?: PptxChartLineStyle;
3221
- hiLowLines?: PptxChartLineStyle;
3586
+ /** `null` explicitly removes an existing `c:dropLines` element. */
3587
+ dropLines?: PptxChartLineStyle | null;
3588
+ /** `null` explicitly removes an existing `c:hiLowLines` element. */
3589
+ hiLowLines?: PptxChartLineStyle | null;
3222
3590
  /** `null` explicitly removes an existing up/down-bars container. */
3223
3591
  upDownBars?: PptxChartUpDownBars | null;
3224
3592
  axes?: PptxChartAxisFormatting[];
@@ -3333,10 +3701,45 @@ interface PptxChartData {
3333
3701
  pivotFormats?: PptxChartPivotFormats | null;
3334
3702
  /**
3335
3703
  * Color-map override (`c:clrMapOvr`) carrying 12 attributes that
3336
- * remap theme colour roles for this chart only. Preserved as a flat
3337
- * `attribute value` map for round-trip fidelity.
3704
+ * remap theme colour roles for this chart only. Modeled as a flat
3705
+ * `attribute -> value` map (e.g. `{ bg1: 'lt1', accent1: 'accent2' }`)
3706
+ * so unknown/future attributes round-trip without code changes.
3707
+ * `null` explicitly removes an existing `c:clrMapOvr`; an empty object
3708
+ * is treated the same as `null` on save.
3338
3709
  */
3339
- clrMapOvr?: Record<string, string>;
3710
+ clrMapOvr?: Record<string, string> | null;
3711
+ /**
3712
+ * Whether the chart's own cached numeric values use the 1904 date epoch
3713
+ * (`c:chartSpace/c:date1904/@val`). Independent of, and authoritative over,
3714
+ * any embedded workbook's `workbookPr/@date1904` (a chart can lack an
3715
+ * embedded workbook entirely, or its cache can legitimately differ from the
3716
+ * workbook's current setting). Absent when the source XML omits the
3717
+ * element, in which case the 1900 system applies (the schema default).
3718
+ */
3719
+ date1904?: boolean;
3720
+ /**
3721
+ * PowerPoint's "Rounded corners" chart-area option
3722
+ * (`c:chartSpace/c:roundedCorners/@val`, default `false`). Absent when the
3723
+ * source XML omits the element.
3724
+ */
3725
+ roundedCorners?: boolean;
3726
+ /**
3727
+ * 3-D chart depth/spacing along the series axis, as a percentage
3728
+ * (`c:gapDepth/@val`, `ST_GapAmount`, 0 through 500). Legal on
3729
+ * `bar3D`/`area3D`/`line3D`/`surface` chart-type containers only. Read-only
3730
+ * for rendering, matching {@link barGapWidth}/{@link barOverlap}: save
3731
+ * round-trips it via the preserved chart XML rather than a typed edit path.
3732
+ */
3733
+ gapDepth?: number;
3734
+ /**
3735
+ * Parsed Office 2013+ chart-style part (`ppt/charts/style#.xml`,
3736
+ * `cs:chartStyle`), providing per-element font/line/fill defaults for
3737
+ * whichever built-in "Chart Styles" gallery entry ({@link PptxChartStyle.styleId})
3738
+ * is active. Absent when the chart has no such part (common for
3739
+ * automation-authored charts, where PowerPoint still implies style 2's
3740
+ * look via its own bundled defaults).
3741
+ */
3742
+ chartStyleDefinition?: PptxChartStyleDefinition;
3340
3743
  }
3341
3744
  //#endregion
3342
3745
  //#region src/core/types/image.d.ts
@@ -3860,6 +4263,52 @@ interface MediaCaptionTrack {
3860
4263
  isDefault?: boolean;
3861
4264
  }
3862
4265
  //#endregion
4266
+ //#region src/core/types/smart-art-chrome.d.ts
4267
+ /**
4268
+ * Background / outline extracted from `dgm:bg` and `dgm:whole`.
4269
+ *
4270
+ * @example
4271
+ * ```ts
4272
+ * const chrome: PptxSmartArtChrome = {
4273
+ * backgroundColor: "#F0F0F0",
4274
+ * outlineColor: "#333333",
4275
+ * outlineWidth: 1,
4276
+ * };
4277
+ * // => satisfies PptxSmartArtChrome
4278
+ * ```
4279
+ */
4280
+ interface PptxSmartArtChrome {
4281
+ /**
4282
+ * Background fill colour (hex). When the real `dgm:bg` fill is a gradient
4283
+ * or pattern (see {@link PptxSmartArtChrome.backgroundFillXml}), this is an
4284
+ * APPROXIMATION (the gradient's first stop, or the pattern's foreground
4285
+ * colour) for a consumer that only wants one display colour, not the full fill.
4286
+ */
4287
+ backgroundColor?: string;
4288
+ /**
4289
+ * Raw `dgm:bg` fill XML, present only when the background is a gradient or
4290
+ * pattern fill (a solid fill is fully captured by {@link PptxSmartArtChrome.backgroundColor}
4291
+ * alone). Round-trip only: `smartart-save-chrome.ts` re-emits this verbatim
4292
+ * instead of flattening the fill to a solid colour on save.
4293
+ */
4294
+ backgroundFillXml?: PptxSmartArtRawBackgroundFill;
4295
+ /** Outline stroke colour (hex). */
4296
+ outlineColor?: string;
4297
+ /** Outline stroke width in points. */
4298
+ outlineWidth?: number;
4299
+ }
4300
+ /**
4301
+ * A `dgm:bg` fill this viewer doesn't fully model as first-class chrome
4302
+ * (gradient or pattern), preserved verbatim for round-trip. See
4303
+ * {@link PptxSmartArtChrome.backgroundFillXml}.
4304
+ */
4305
+ interface PptxSmartArtRawBackgroundFill {
4306
+ /** Local element name of the fill under `dgm:bg` (`gradFill` or `pattFill`). */
4307
+ localName: 'gradFill' | 'pattFill';
4308
+ /** The fill element's own attributes/children, as parsed. */
4309
+ xml: XmlObject;
4310
+ }
4311
+ //#endregion
3863
4312
  //#region src/core/types/smart-art-constraint-rules.d.ts
3864
4313
  type PptxSmartArtConstraintRelationship = 'self' | 'ch' | 'des';
3865
4314
  type PptxSmartArtConstraintOperator = 'none' | 'equ' | 'gte' | 'lte';
@@ -3958,6 +4407,14 @@ interface PptxSmartArtLayoutNodeShape {
3958
4407
  adjustments?: PptxSmartArtShapeAdjustment[];
3959
4408
  /** `dgm:shape/@hideGeom`: the shape is present only to size text, never painted. */
3960
4409
  hideGeometry?: boolean;
4410
+ /**
4411
+ * `dgm:shape/@lkTxEntry` (CT_Shape, boolean, default false): this node is a
4412
+ * decorative shape that should mirror its paired content node's text
4413
+ * rather than always rendering blank. See `smartart-layout-interpreter-
4414
+ * pyramid.ts`'s `arrangePyramid`, the interpreter's one existing
4415
+ * synthesized-decorative-shape call site.
4416
+ */
4417
+ lkTxEntry?: boolean;
3961
4418
  }
3962
4419
  /** Identity and ordering metadata from DiagramML CT_LayoutNode. */
3963
4420
  interface PptxSmartArtLayoutNode {
@@ -4185,6 +4642,13 @@ interface PptxSmartArtNode {
4185
4642
  * generic cycled palette (see `applySmartArtRoleColors`).
4186
4643
  */
4187
4644
  styleRole?: string;
4645
+ /**
4646
+ * `dgm:prSet/@coherent3DOff` (`CT_ElemPropSet`) resolved from the node's
4647
+ * paired presentation point: when true, this node opts out of the
4648
+ * diagram's overall coherent-3D scene rotation (a `dgm:scene3d`/`dgm:sp3d`
4649
+ * quick-style variation) applied to every other node.
4650
+ */
4651
+ coherent3DOff?: boolean;
4188
4652
  /**
4189
4653
  * Per-run text + run-properties for the node's first paragraph, captured at
4190
4654
  * parse time. When the joined run text still equals {@link text} (the node
@@ -4232,9 +4696,29 @@ interface PptxSmartArtColorListMetadata {
4232
4696
  method?: PptxSmartArtColorApplicationMethod;
4233
4697
  hueDirection?: PptxSmartArtHueDirection;
4234
4698
  }
4699
+ /**
4700
+ * A quick-style label's `a:lnRef`/`a:fillRef`/`a:effectRef`/`a:fontRef`
4701
+ * (`CT_ShapeStyle`, the same complex type an ordinary shape's `p:style`
4702
+ * uses), resolved against the theme's `fmtScheme` at parse time instead of
4703
+ * the coarse subtle/moderate/intense enum ({@link PptxSmartArtQuickStyle.effectIntensity}).
4704
+ * Only populated when a theme format scheme was available when the quick
4705
+ * style was parsed. See G13 in the 2026-09 diagram audit.
4706
+ */
4707
+ interface PptxSmartArtResolvedStyleRef {
4708
+ fillColor?: string;
4709
+ fillMode?: 'solid' | 'gradient' | 'pattern' | 'none' | 'theme';
4710
+ strokeColor?: string;
4711
+ strokeWidth?: number;
4712
+ /** `a:effectRef`'s theme-resolved outer shadow colour, when the style has one. */
4713
+ shadowColor?: string;
4714
+ /** `a:fontRef`'s theme-resolved typeface (`+mn-lt`/`+mj-lt` -> the theme's actual font). */
4715
+ fontTypeface?: string;
4716
+ }
4235
4717
  /** CT_StyleLabel metadata from a quick-style definition. */
4236
4718
  interface PptxSmartArtQuickStyleLabel {
4237
4719
  name: string;
4720
+ /** Theme-resolved `dgm:style` refs for this label's role, when available. */
4721
+ resolvedStyle?: PptxSmartArtResolvedStyleRef;
4238
4722
  }
4239
4723
  /** CT_CTStyleLabel metadata from a color-transform definition. */
4240
4724
  interface PptxSmartArtColorStyleLabel {
@@ -4497,27 +4981,6 @@ interface PptxSmartArtDrawingShape extends PptxCustomPathProperties {
4497
4981
  textFrameWidth?: number;
4498
4982
  textFrameHeight?: number;
4499
4983
  }
4500
- /**
4501
- * Background / outline extracted from `dgm:bg` and `dgm:whole`.
4502
- *
4503
- * @example
4504
- * ```ts
4505
- * const chrome: PptxSmartArtChrome = {
4506
- * backgroundColor: "#F0F0F0",
4507
- * outlineColor: "#333333",
4508
- * outlineWidth: 1,
4509
- * };
4510
- * // => satisfies PptxSmartArtChrome
4511
- * ```
4512
- */
4513
- interface PptxSmartArtChrome {
4514
- /** Background fill colour (hex). */
4515
- backgroundColor?: string;
4516
- /** Outline stroke colour (hex). */
4517
- outlineColor?: string;
4518
- /** Outline stroke width in points. */
4519
- outlineWidth?: number;
4520
- }
4521
4984
  /**
4522
4985
  * Presentation layout variables from `dgm:prSet/dgm:presLayoutVars` (data model)
4523
4986
  * or `dgm:varLst` (layout definition defaults).
@@ -4621,13 +5084,55 @@ interface PptxSmartArtData {
4621
5084
  drawingDirty?: boolean;
4622
5085
  }
4623
5086
  //#endregion
4624
- //#region src/core/types/table.d.ts
5087
+ //#region src/core/types/table-style-edit.d.ts
5088
+ /**
5089
+ * A `a:fillRef`/`a:lnRef`/`a:effectRef`-style style-matrix reference: an
5090
+ * index into the theme's format scheme (`a:fmtScheme/a:fillStyleLst`, 1-based
5091
+ * per ECMA-376 §20.1.4.1.12) plus an optional colour transform child.
5092
+ *
5093
+ * Distinct from an already-resolved {@link ParsedTableStyleFill}: a fill ref
5094
+ * points AT a theme style-matrix entry rather than carrying a colour choice
5095
+ * directly, though the two commonly appear together (`<a:fillRef idx="2">
5096
+ * <a:schemeClr val="accent1"/></a:fillRef>`).
5097
+ *
5098
+ * @example
5099
+ * ```ts
5100
+ * const ref: ParsedTableFillRef = { idx: 2, color: { schemeColor: 'accent1' } };
5101
+ * // => satisfies ParsedTableFillRef
5102
+ * ```
5103
+ */
5104
+ interface ParsedTableFillRef {
5105
+ /** 1-based index into the theme format scheme's fill style list. */
5106
+ idx: number;
5107
+ /** Colour transform child (`a:schemeClr`/`a:srgbClr`) applied to the referenced style. */
5108
+ color?: ParsedTableStyleFill;
5109
+ }
4625
5110
  /**
4626
- * Table types: cell styling, cell data, rows, table data, and the parsed
4627
- * table style map from `ppt/tableStyles.xml`.
5111
+ * One leaf (or `effectDag`-wrapped) node of an `a:effectLst`/`a:effectDag`
5112
+ * effect chain, kept mostly opaque: {@link kind} names the OOXML element so a
5113
+ * consumer can recognise common effects (`outerShdw`, `glow`, `softEdge`,
5114
+ * `reflection`, `blur`, `innerShdw`, `prstShdw`, `fillOverlay`, `alphaModFix`,
5115
+ * `alphaInv`, `grayscl`, `biLevel`, `duotone`, `hsl`, `lum`, `tint`) without
5116
+ * this module re-deriving the full shape-effect taxonomy already modelled on
5117
+ * `ShapeStyle`; {@link xml} preserves the node verbatim for lossless re-emit.
4628
5118
  *
4629
- * @module pptx-types/table
5119
+ * @example
5120
+ * ```ts
5121
+ * const effect: ParsedTableStyleEffect = {
5122
+ * kind: 'outerShdw',
5123
+ * xml: { '@_blurRad': '40000', '@_dist': '20000', '@_dir': '5400000' },
5124
+ * };
5125
+ * // => satisfies ParsedTableStyleEffect
5126
+ * ```
4630
5127
  */
5128
+ interface ParsedTableStyleEffect {
5129
+ /** The OOXML element's local name, e.g. `outerShdw`, `glow`, `softEdge`. */
5130
+ kind: string;
5131
+ /** Verbatim XML node (attributes + children) for lossless round-trip. */
5132
+ xml: XmlObject;
5133
+ }
5134
+ //#endregion
5135
+ //#region src/core/types/table.d.ts
4631
5136
  /**
4632
5137
  * Per-cell visual style for a table cell.
4633
5138
  *
@@ -4664,6 +5169,14 @@ interface PptxTableCellStyle {
4664
5169
  * future expansion alongside the run-properties round-trip path.
4665
5170
  */
4666
5171
  colorXml?: XmlObject;
5172
+ /**
5173
+ * Typed theme colour reference for the cell text colour, set when
5174
+ * {@link colorXml} is a plain `a:schemeClr`. Wins on save, mirroring
5175
+ * `TextStyle.colorRef`. Distinct from {@link ParsedTableStyleFill.schemeColor},
5176
+ * which describes a `ppt/tableStyles.xml` section fill rather than an
5177
+ * individual cell override.
5178
+ */
5179
+ colorRef?: PptxThemeColorRef;
4667
5180
  backgroundColor?: string;
4668
5181
  /**
4669
5182
  * Raw XML colour-choice node preserved from cell `a:tcPr/a:solidFill` for
@@ -4671,6 +5184,12 @@ interface PptxTableCellStyle {
4671
5184
  * {@link backgroundColor} still matches the original colour.
4672
5185
  */
4673
5186
  backgroundColorXml?: XmlObject;
5187
+ /**
5188
+ * Typed theme colour reference for the cell fill, set when
5189
+ * {@link backgroundColorXml} is a plain `a:schemeClr`. Wins on save,
5190
+ * mirroring `ShapeStyle.fillColorRef`.
5191
+ */
5192
+ backgroundColorRef?: PptxThemeColorRef;
4674
5193
  borderColor?: string;
4675
5194
  /** Top border width in px. */
4676
5195
  borderTopWidth?: number;
@@ -4974,6 +5493,24 @@ interface PptxTableData {
4974
5493
  bandColCycle?: number;
4975
5494
  /** Right-to-left table layout from `a:tblPr/@rtl`. */
4976
5495
  rtl?: boolean;
5496
+ /**
5497
+ * `a:tblPr`'s OWN fill (`CT_TableProperties` §21.1.3.15's
5498
+ * `EG_FillProperties`), independent of any `a:tblStyleLst`-referenced style
5499
+ * or that style's `a:tblBg`. Applied as the lowest-priority fill layer,
5500
+ * beneath the table style's `wholeTbl` fill. Real PowerPoint decks route
5501
+ * table appearance through `tableStyleId` instead, so this mainly matters
5502
+ * for non-PowerPoint authoring tools (issue G6).
5503
+ */
5504
+ tableFill?: ParsedTableStyleFill;
5505
+ /**
5506
+ * `a:tblPr`'s own `a:effectLst` (or `a:effectDag`) effect chain,
5507
+ * independent of the referenced table style, decomposed into a typed
5508
+ * sequence of {@link ParsedTableStyleEffect} nodes (issue G6). Each node
5509
+ * keeps its own XML verbatim for lossless round-trip; empty array is
5510
+ * normalised to `undefined` by the parser so `tableEffects` is only ever
5511
+ * present when there is at least one effect.
5512
+ */
5513
+ tableEffects?: ParsedTableStyleEffect[];
4977
5514
  }
4978
5515
  /**
4979
5516
  * A single fill reference within a table style section.
@@ -5095,7 +5632,7 @@ interface ParsedTableStyleText {
5095
5632
  * A single border side within a table style's `a:tcStyle/a:tcBdr`.
5096
5633
  *
5097
5634
  * Corresponds to one of `a:left`, `a:right`, `a:top`, `a:bottom`,
5098
- * `a:insideH`, `a:insideV`, `a:tl2br`, `a:bl2tr` (each a
5635
+ * `a:insideH`, `a:insideV`, `a:tl2br`, `a:tr2bl` (each a
5099
5636
  * `CT_ThemeableLineStyle` wrapping an `a:ln`).
5100
5637
  *
5101
5638
  * @example
@@ -5135,19 +5672,34 @@ interface ParsedTableStyleBorders {
5135
5672
  insideV?: ParsedTableStyleBorder;
5136
5673
  /** Top-left to bottom-right diagonal. */
5137
5674
  tl2br?: ParsedTableStyleBorder;
5138
- /** Bottom-left to top-right diagonal. */
5139
- bl2tr?: ParsedTableStyleBorder;
5675
+ /**
5676
+ * Top-right to bottom-left diagonal (`a:tr2bl`, ECMA-376's
5677
+ * `CT_TableCellBorderStyle` sequence: left/right/top/bottom/insideH/
5678
+ * insideV/tl2br/tr2bl). The field keeps its historical `bl2tr` spelling
5679
+ * only in the sense that it names the same geometric anti-diagonal line
5680
+ * (top-right-to-bottom-left and bottom-left-to-top-right describe one
5681
+ * undirected diagonal); the parser accepts the real `a:tr2bl` element and,
5682
+ * leniently, a legacy `a:bl2tr` this app previously wrote (issue G4).
5683
+ */
5684
+ tr2bl?: ParsedTableStyleBorder;
5140
5685
  }
5141
5686
  /**
5142
5687
  * Table background style (CT_TableBackgroundStyle, ECMA-376 §21.1.3.7).
5143
5688
  *
5144
- * Corresponds to the `<a:tblBg>` child of `<a:tblStyle>`. Currently
5145
- * captures only the resolved scheme-fill colour (verbatim XML for fill
5146
- * / effect references is preserved separately by the save path).
5689
+ * Corresponds to the `<a:tblBg>` child of `<a:tblStyle>`. Captures the
5690
+ * resolved scheme-fill colour, an unresolved style-matrix `a:fillRef`, and a
5691
+ * presence flag for effects (verbatim XML for the effect list is preserved
5692
+ * separately by the save path).
5147
5693
  */
5148
5694
  interface ParsedTableBackground {
5149
5695
  /** Solid fill (resolved from `a:fill > a:solidFill > a:schemeClr`). */
5150
5696
  fill?: ParsedTableStyleFill;
5697
+ /**
5698
+ * Style-matrix fill reference (`<a:fillRef idx="N">...</a:fillRef>`),
5699
+ * mutually exclusive with {@link fill} (`a:fill` is the choice sibling of
5700
+ * `a:fillRef` in `CT_TableBackgroundStyle`).
5701
+ */
5702
+ fillRef?: ParsedTableFillRef;
5151
5703
  /** Has an `a:effectLst` child that should be round-tripped. */
5152
5704
  hasEffectLst?: boolean;
5153
5705
  }
@@ -5204,6 +5756,26 @@ interface ParsedTableStyleEntry {
5204
5756
  swCellText?: ParsedTableStyleText;
5205
5757
  neCellText?: ParsedTableStyleText;
5206
5758
  nwCellText?: ParsedTableStyleText;
5759
+ /**
5760
+ * Per-role 3D bevel + lighting from `a:tcStyle/a:cell3D` (CT_Cell3D),
5761
+ * distinct from the per-cell `a:tcPr/a:cell3D` {@link PptxTableCellStyle}
5762
+ * already supports. None of PowerPoint's 74 built-in gallery styles use
5763
+ * this (0 hits in the built-in catalogue), so it only matters for a
5764
+ * hand-authored or third-party table style.
5765
+ */
5766
+ wholeTblCell3D?: PptxTableCell3D;
5767
+ firstRowCell3D?: PptxTableCell3D;
5768
+ lastRowCell3D?: PptxTableCell3D;
5769
+ firstColCell3D?: PptxTableCell3D;
5770
+ lastColCell3D?: PptxTableCell3D;
5771
+ band1HCell3D?: PptxTableCell3D;
5772
+ band2HCell3D?: PptxTableCell3D;
5773
+ band1VCell3D?: PptxTableCell3D;
5774
+ band2VCell3D?: PptxTableCell3D;
5775
+ seCellCell3D?: PptxTableCell3D;
5776
+ swCellCell3D?: PptxTableCell3D;
5777
+ neCellCell3D?: PptxTableCell3D;
5778
+ nwCellCell3D?: PptxTableCell3D;
5207
5779
  }
5208
5780
  /**
5209
5781
  * Map of GUID → table style entry.
@@ -5226,6 +5798,38 @@ interface ParsedTableStyleEntry {
5226
5798
  type ParsedTableStyleMap = Record<string, ParsedTableStyleEntry>;
5227
5799
  //#endregion
5228
5800
  //#region src/core/types/elements.d.ts
5801
+ /**
5802
+ * Accessibility metadata from `p:cNvPr/a:extLst`'s "Mark as decorative"
5803
+ * vendor extension (issue G16). PowerPoint's Alt Text pane writes
5804
+ * `a:ext[@uri='{C183D7F6-B498-43B3-948B-1728B52AA6E4}']/adec:decorative
5805
+ * val="1"` when a shape or image is marked decorative; mixed into the
5806
+ * element variants whose `p:cNvPr` that pane covers.
5807
+ */
5808
+ interface PptxAccessibilityProperties {
5809
+ /**
5810
+ * Whether the element is marked decorative. When true, alt text /
5811
+ * aria-label / Markdown export should skip describing the element even
5812
+ * when {@link PptxImageProperties.altText} (or similar) is present.
5813
+ */
5814
+ isDecorative?: boolean;
5815
+ }
5816
+ /**
5817
+ * `a:cNvPicPr/@preferRelativeResize` (issue G13), a picture-only non-visual
5818
+ * property distinct from `a:picLocks`.
5819
+ */
5820
+ interface PptxPictureNonVisualProperties {
5821
+ /**
5822
+ * `a:cNvPicPr/@preferRelativeResize` (ST_Boolean, defaults to `true` when
5823
+ * absent). Controls whether a picture's crop rectangle is reinterpreted
5824
+ * relative to the picture's ORIGINAL dimensions or its CURRENT
5825
+ * (already-resized) dimensions when it is resized again after being
5826
+ * cropped. Parsed and round-tripped for now; not yet wired into
5827
+ * resize-after-crop arithmetic (this app always uses current-size
5828
+ * semantics, which only diverges from `preferRelativeResize="0"` on a
5829
+ * second resize after a crop).
5830
+ */
5831
+ preferRelativeResize?: boolean;
5832
+ }
5229
5833
  /**
5230
5834
  * A text box — a plain rectangle containing text, typically with no
5231
5835
  * visible fill or stroke.
@@ -5259,7 +5863,7 @@ interface TextPptxElement extends PptxElementBase, PptxTextProperties, PptxShape
5259
5863
  * // => satisfies ShapePptxElement
5260
5864
  * ```
5261
5865
  */
5262
- interface ShapePptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties, PptxCustomPathProperties {
5866
+ interface ShapePptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties, PptxCustomPathProperties, PptxAccessibilityProperties {
5263
5867
  type: 'shape';
5264
5868
  }
5265
5869
  /**
@@ -5298,7 +5902,7 @@ interface ConnectorPptxElement extends PptxElementBase, PptxTextProperties, Pptx
5298
5902
  * // => satisfies ImagePptxElement
5299
5903
  * ```
5300
5904
  */
5301
- interface ImagePptxElement extends PptxElementBase, PptxShapeProperties, PptxCustomPathProperties, PptxImageProperties {
5905
+ interface ImagePptxElement extends PptxElementBase, PptxShapeProperties, PptxCustomPathProperties, PptxImageProperties, PptxAccessibilityProperties, PptxPictureNonVisualProperties {
5302
5906
  type: 'image';
5303
5907
  }
5304
5908
  /**
@@ -5307,7 +5911,7 @@ interface ImagePptxElement extends PptxElementBase, PptxShapeProperties, PptxCus
5307
5911
  * Functionally identical to {@link ImagePptxElement} but distinguished by
5308
5912
  * the `type` discriminant for semantic clarity.
5309
5913
  */
5310
- interface PicturePptxElement extends PptxElementBase, PptxShapeProperties, PptxCustomPathProperties, PptxImageProperties {
5914
+ interface PicturePptxElement extends PptxElementBase, PptxShapeProperties, PptxCustomPathProperties, PptxImageProperties, PptxAccessibilityProperties, PptxPictureNonVisualProperties {
5311
5915
  type: 'picture';
5312
5916
  }
5313
5917
  /**
@@ -5347,6 +5951,13 @@ interface TablePptxElement extends PptxElementBase {
5347
5951
  type: 'table';
5348
5952
  /** Parsed table cell data for editing. */
5349
5953
  tableData?: PptxTableData;
5954
+ /**
5955
+ * Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`, the
5956
+ * same non-visual-properties attribute a picture's alt text comes from.
5957
+ */
5958
+ altText?: string;
5959
+ /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. */
5960
+ title?: string;
5350
5961
  /**
5351
5962
  * Unrecognised extensions captured from `a:graphicData/a:extLst` so they
5352
5963
  * round-trip losslessly. See {@link PptxGraphicFrameExtension}.
@@ -5362,6 +5973,10 @@ interface TablePptxElement extends PptxElementBase {
5362
5973
  interface ChartPptxElement extends PptxElementBase {
5363
5974
  type: 'chart';
5364
5975
  chartData?: PptxChartData;
5976
+ /** Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`. */
5977
+ altText?: string;
5978
+ /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. */
5979
+ title?: string;
5365
5980
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
5366
5981
  extensionXml?: PptxGraphicFrameExtension[];
5367
5982
  }
@@ -5379,6 +5994,10 @@ interface ChartPptxElement extends PptxElementBase {
5379
5994
  interface SmartArtPptxElement extends PptxElementBase {
5380
5995
  type: 'smartArt';
5381
5996
  smartArtData?: PptxSmartArtData;
5997
+ /** Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`. */
5998
+ altText?: string;
5999
+ /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. */
6000
+ title?: string;
5382
6001
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
5383
6002
  extensionXml?: PptxGraphicFrameExtension[];
5384
6003
  }
@@ -5457,6 +6076,18 @@ interface OlePptxElement extends PptxElementBase {
5457
6076
  * Only meaningful when {@link isLinked} is `true`. ECMA-376 §19.3.1.28.
5458
6077
  */
5459
6078
  oleFollowColorScheme?: 'none' | 'full' | 'textAndBackground';
6079
+ /**
6080
+ * `p:link/@updateAutomatic` (`CT_OleObjectLink`, ECMA-376 §19.3.2.4):
6081
+ * whether a LINKED OLE object refreshes automatically from its source
6082
+ * (PowerPoint's Edit Links dialog "Automatic" vs. "Manual" radio buttons).
6083
+ * Only meaningful when {@link isLinked} is `true`. The schema default is
6084
+ * `false`; `undefined` means the source authored no explicit value.
6085
+ */
6086
+ oleUpdateAutomatic?: boolean;
6087
+ /** Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`. */
6088
+ altText?: string;
6089
+ /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. */
6090
+ title?: string;
5460
6091
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
5461
6092
  extensionXml?: PptxGraphicFrameExtension[];
5462
6093
  }
@@ -5548,6 +6179,15 @@ interface MediaPptxElement extends PptxElementBase {
5548
6179
  * (`r:embed`). Defaults to embedded when undefined.
5549
6180
  */
5550
6181
  isLinked?: boolean;
6182
+ /**
6183
+ * Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`.
6184
+ * Only populated for the `p:graphicFrame`-shaped (SDK-created) media
6185
+ * form; a `p:pic`-shaped media element's alt text is not currently
6186
+ * parsed (see `PptxHandlerRuntimePictureParsing.ts`).
6187
+ */
6188
+ altText?: string;
6189
+ /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. Same scope note as {@link altText}. */
6190
+ title?: string;
5551
6191
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
5552
6192
  extensionXml?: PptxGraphicFrameExtension[];
5553
6193
  }
@@ -6051,12 +6691,63 @@ type PptxAnimationTrigger = 'onClick' | 'onShapeClick' | 'onHover' | 'afterPrevi
6051
6691
  * is preserved alongside other animations.
6052
6692
  */
6053
6693
  type PptxNativeAnimationKind = 'media';
6694
+ /**
6695
+ * `p:spTgt/p:graphicEl` (CT_TLGraphicalObjectBuildElement, ECMA-376 S19.5.34):
6696
+ * identifies exactly which series/category/element of a chart or diagram
6697
+ * build a per-stage effect reveals, when a deck authors one effect per stage
6698
+ * instead of a single staged `p:bldGraphic` reveal.
6699
+ */
6700
+ interface PptxAnimationGraphicElementTarget {
6701
+ /** Which graphic kind: `p:dgm` (diagram) or `p:chart`. */
6702
+ kind: 'dgm' | 'chart';
6703
+ /** `@_seriesIdx`, 0-based series index, when the target is series-scoped. */
6704
+ seriesIdx?: number;
6705
+ /** `@_categoryIdx`, 0-based category index, when the target is category-scoped. */
6706
+ categoryIdx?: number;
6707
+ /**
6708
+ * `p:dgm/@_id` (CT_TLBuildDiagram, ECMA-376 S19.5.10): the diagram DATA MODEL
6709
+ * point id (`dgm:pt/@modelId`) this per-stage effect reveals, when a
6710
+ * `p:bldDgm` build authors one effect per node instead of a single staged
6711
+ * reveal. `dgm`-kind targets only; a `chart`-kind target never carries this.
6712
+ * Matches `PptxSmartArtNode.id` (parsed from the same `@modelId`), so a
6713
+ * diagram renderer can reveal the exact authored node.
6714
+ */
6715
+ id?: string;
6716
+ /**
6717
+ * `@_bldStep`: `ST_TLChartBuildStep` (`category` / `categoryEl` / `series` /
6718
+ * `seriesEl`) for a `chart`-kind target, or `ST_TLDiagramBuildStep`
6719
+ * (`sp` / `bg`) for a `dgm`-kind target.
6720
+ */
6721
+ bldStep?: string;
6722
+ }
6723
+ /**
6724
+ * `p:spTgt/p:oleChartEl` (CT_TLOleChartTargetElement, ECMA-376 S19.5.44):
6725
+ * legacy pre-DrawingML OLE Graph chart sub-element targeting.
6726
+ */
6727
+ interface PptxAnimationOleChartElementTarget {
6728
+ /** `@_type` (ST_TLOleChartSubelementType): entireChart / series / category / ... */
6729
+ subelementType: string;
6730
+ /** `@_lvl`, optional sub-element level. */
6731
+ level?: number;
6732
+ }
6054
6733
  /** A target selected by `p:tgtEl` in the PresentationML timing model. */
6055
6734
  type PptxAnimationTarget = {
6056
6735
  type: 'shape';
6057
6736
  shapeId: string;
6058
6737
  /** Whether `p:spTgt/p:bg` limits the effect to the shape background. */
6059
6738
  backgroundOnly?: boolean;
6739
+ /**
6740
+ * `p:spTgt/p:subSp/@_spid`: the id of a shape NESTED inside the group
6741
+ * named by {@link shapeId} (CT_TLSubShapeId, ECMA-376 S19.5.71).
6742
+ * PowerPoint authors this when a user animates one member of a group
6743
+ * without ungrouping it: `shapeId` stays the outer group's id for
6744
+ * round-trip, but this sub-shape is the real playback target.
6745
+ */
6746
+ subShapeId?: string;
6747
+ /** `p:spTgt/p:graphicEl`: chart/diagram series/category/element target. */
6748
+ graphicElement?: PptxAnimationGraphicElementTarget;
6749
+ /** `p:spTgt/p:oleChartEl`: legacy OLE chart sub-element target. */
6750
+ oleChartElement?: PptxAnimationOleChartElementTarget;
6060
6751
  rawXml?: XmlObject;
6061
6752
  } | {
6062
6753
  type: 'slide';
@@ -6436,6 +7127,74 @@ interface PptxNativeAnimation {
6436
7127
  * PowerPoint that only emit the SMIL-style filter string.
6437
7128
  */
6438
7129
  effectFilter?: PptxAnimationEffectFilter;
7130
+ /**
7131
+ * This effect's own `p:cTn/@_id` (a raw OOXML time-node id, not a shape
7132
+ * id). Lets playback resolve a `p:cond/@tn` dependency (see
7133
+ * {@link AnimationCondition.targetTimeNodeId}) against the SPECIFIC node
7134
+ * it names rather than assuming it is always the positionally-previous
7135
+ * effect. Absent when the node carried no `@_id`.
7136
+ */
7137
+ nodeId?: number;
7138
+ /**
7139
+ * Interpolation mode for this effect's PRIMARY `p:anim`-family behaviour
7140
+ * (the same node {@link keyframes}/{@link attrName} were read from), from
7141
+ * `@_calcmode` (ST_TLAnimateBehaviorCalcMode, ECMA-376 S19.5.2). See
7142
+ * {@link PptxAttributeAnimation.calcMode} for the per-component version.
7143
+ */
7144
+ calcMode?: 'discrete' | 'lin' | 'fmla';
7145
+ /**
7146
+ * `p:cBhvr/@_additive` (ST_TLBehaviorAdditiveType, ECMA-376 S19.5.4):
7147
+ * controls how this behaviour's value composites with sibling behaviours
7148
+ * driving the same attribute on the same target. `sum` accumulates
7149
+ * (e.g. a combined scale+rotate), `repl`/`base`/`none`/`mult` replace or
7150
+ * otherwise combine. Absent means the OOXML default (`base`).
7151
+ */
7152
+ cBhvrAdditive?: 'base' | 'sum' | 'repl' | 'mult' | 'none';
7153
+ /**
7154
+ * `p:cBhvr/@_accumulate` (ST_TLBehaviorAccumulateType): `always` means
7155
+ * each `p:cTn/@repeatCount` repeat starts from the PREVIOUS repeat's end
7156
+ * value (e.g. a 3x Spin totals 1080deg instead of replaying 0-360 three
7157
+ * times); `none` (the OOXML default) resets every repeat.
7158
+ */
7159
+ cBhvrAccumulate?: 'none' | 'always';
7160
+ /**
7161
+ * `p:cBhvr/@_xfrmType` (only meaningful on `p:animMotion`): `point`
7162
+ * (default) or `img`, a legacy compatibility hint. Round-tripped only.
7163
+ */
7164
+ cBhvrXfrmType?: 'point' | 'img';
7165
+ /**
7166
+ * `p:cBhvr/@_override` (ST_TLBehaviorOverrideType): `normal` (default) or
7167
+ * `childStyle`, a legacy compatibility hint. Round-tripped only.
7168
+ */
7169
+ cBhvrOverride?: 'normal' | 'childStyle';
7170
+ /**
7171
+ * `p:set` discrete attribute assignments composed alongside this effect
7172
+ * (ECMA-376 S19.5.79 CT_TLSetBehavior): an instantaneous (non-interpolated)
7173
+ * value change, as opposed to {@link attributeAnimations}'s `p:anim`
7174
+ * keyframe ramps. PowerPoint authors several font-style emphasis effects
7175
+ * this way (Bold Reveal, Underline, Bold Flash, Change Font Size), since
7176
+ * "on/off" or "size N" has nothing to interpolate. Not yet consulted by
7177
+ * shared playback (round-trip/typed-model only so far).
7178
+ */
7179
+ setAnimations?: PptxSetAnimation[];
7180
+ }
7181
+ /**
7182
+ * One `p:set` discrete (non-interpolated) attribute assignment composed
7183
+ * alongside an authored effect. See {@link PptxNativeAnimation.setAnimations}.
7184
+ *
7185
+ * @see ECMA-376 S19.5.79 CT_TLSetBehavior
7186
+ */
7187
+ interface PptxSetAnimation {
7188
+ /** Lowercased target attribute from `p:cBhvr/p:attrNameLst/p:attrName`. */
7189
+ attrName: string;
7190
+ /** Decoded value from `p:to` (same variant shape as a `p:tav/p:val`). */
7191
+ value: string | boolean | number;
7192
+ /** Discriminant indicating which `p:to` child carried the value. */
7193
+ valueType: 'str' | 'bool' | 'int' | 'flt' | 'clr';
7194
+ /** Duration from this behaviour's nested `p:cTn/@dur`. */
7195
+ durationMs?: number;
7196
+ /** Start offset from this behaviour's nested `p:stCondLst`. */
7197
+ delayMs?: number;
6439
7198
  }
6440
7199
  /**
6441
7200
  * Parsed `p:animEffect/@filter` (+ `@transition`) descriptor. ECMA-376
@@ -6502,6 +7261,14 @@ interface PptxAttributeAnimation {
6502
7261
  durationMs?: number;
6503
7262
  /** Start offset from this behaviour's nested `p:stCondLst`. */
6504
7263
  delayMs?: number;
7264
+ /**
7265
+ * Interpolation mode from this behaviour's own `@_calcmode`
7266
+ * (ST_TLAnimateBehaviorCalcMode, ECMA-376 S19.5.2): `discrete` snaps to
7267
+ * each `p:tav` stop with no interpolation, `lin` (the OOXML default)
7268
+ * interpolates linearly, `fmla` evaluates `p:tav/@fmla` (not consulted at
7269
+ * playback here; formulas are round-tripped only). Absent means `lin`.
7270
+ */
7271
+ calcMode?: 'discrete' | 'lin' | 'fmla';
6505
7272
  }
6506
7273
  /** Signed HSL channel deltas parsed from `p:animClr/p:by/p:hsl`. */
6507
7274
  interface PptxHslColorDelta {
@@ -6568,7 +7335,7 @@ interface PptxTextAnimationTarget {
6568
7335
  * These map directly to OOXML condition event attribute values
6569
7336
  * (ISO/IEC 29500-1 S19.5.28 CT_TLTimeCondition).
6570
7337
  */
6571
- type AnimationConditionEvent = 'onBegin' | 'onEnd' | 'begin' | 'end' | 'onClick' | 'onMouseOver' | 'onMouseOut' | 'onNext' | 'onPrev' | 'onStopAudio';
7338
+ type AnimationConditionEvent = 'onBegin' | 'onEnd' | 'begin' | 'end' | 'onClick' | 'onMouseOver' | 'onMouseOut' | 'onNext' | 'onPrev' | 'onStopAudio' | 'onDblClick';
6572
7339
  /**
6573
7340
  * Structured representation of a single OOXML animation condition
6574
7341
  * from `p:cond` elements inside `p:stCondLst` or `p:endCondLst`.
@@ -6695,6 +7462,16 @@ interface PptxElementAnimation {
6695
7462
  * OOXML equivalent and is not required for playback.
6696
7463
  */
6697
7464
  soundFileName?: string;
7465
+ /**
7466
+ * Per-build-level timing template(s) from the {@link sequence}'s own
7467
+ * `p:bldP/p:tmplLst` (ECMA-376 §19.5.84), carried over from the loaded
7468
+ * `PptxNativeAnimation.buildTemplates` this element animation was derived
7469
+ * from so a full timing-tree rebuild (`PptxAnimationWriteService`'s
7470
+ * `buildTimingXml`, when the slide had no prior `p:timing`) can re-emit
7471
+ * them instead of silently dropping the deck's authored per-level
7472
+ * defaults. Absent when {@link sequence} carries no such template.
7473
+ */
7474
+ buildTemplates?: PptxTimingTemplate[];
6698
7475
  }
6699
7476
  /**
6700
7477
  * A read-only anchor representing one of the deck's own effect groups: a
@@ -7611,6 +8388,22 @@ interface PptxActiveXControl {
7611
8388
  name?: string;
7612
8389
  /** Shape ID this control is linked to (from @spid). */
7613
8390
  shapeId?: string;
8391
+ /**
8392
+ * `p:control/@showAsIcon` (CT_Control, ECMA-376 S19.3.1.2): whether the
8393
+ * control renders as its static icon rather than its live appearance.
8394
+ * `undefined` when the source authored no explicit value (schema default
8395
+ * `false`).
8396
+ */
8397
+ showAsIcon?: boolean;
8398
+ /**
8399
+ * `p:control/@imgW` in EMU (ST_PositiveCoordinate32): the width the host
8400
+ * reserves for the control's icon/preview image. Distinct from
8401
+ * {@link width}, which is the fallback `p:pic`'s own `a:ext/@cx` in px;
8402
+ * `imgW`/`imgH` are direct attributes on `p:control` itself.
8403
+ */
8404
+ imgWidthEmu?: number;
8405
+ /** `p:control/@imgH` in EMU (ST_PositiveCoordinate32). @see imgWidthEmu */
8406
+ imgHeightEmu?: number;
7614
8407
  /** X position (px) of the control's fallback picture, if present. */
7615
8408
  x?: number;
7616
8409
  /** Y position (px) of the control's fallback picture, if present. */
@@ -7908,10 +8701,32 @@ interface PptxPresentationProperties {
7908
8701
  printProperties?: PptxPresentationPrintProperties | null;
7909
8702
  /** Most-recently-used colours from the presentation palette. */
7910
8703
  mruColors?: string[];
7911
- /** Pen colour for presentation mode annotations (from `p:showPr/p:penClr`). */
8704
+ /**
8705
+ * Pen colour for presentation mode annotations (from `p:showPr/p:penClr`).
8706
+ * `p:penClr` is a full `EG_ColorChoice` (P1-G2): a scheme/preset/system
8707
+ * swatch resolves to a hex string here just like a direct `a:srgbClr`.
8708
+ */
7912
8709
  penColor?: string;
8710
+ /**
8711
+ * The resolved hex value {@link penColor} had at parse time, and the
8712
+ * original `p:penClr` colour-choice XML node, preserved so a save that
8713
+ * never touches the pen colour re-emits the original scheme/preset
8714
+ * reference verbatim instead of flattening it to a baked `a:srgbClr`.
8715
+ * Internal round-trip bookkeeping; not meant to be set by API callers.
8716
+ */
8717
+ penColorOriginal?: string;
8718
+ /** @see penColorOriginal */
8719
+ penColorXml?: XmlObject;
7913
8720
  /** Kiosk auto-restart interval in milliseconds (from `p:kiosk/@restart`). Only meaningful when showType is "kiosk". */
7914
8721
  kioskRestartTime?: number;
8722
+ /**
8723
+ * `p:showPr/p:browse/@showScrollbar` (CT_ShowInfoBrowse §19.2.1.10 /
8724
+ * §19.3.1.43), the "Show scrollbar" checkbox in PowerPoint's Set Up Show
8725
+ * dialog. Only meaningful when `showType` is `"browsed"`; the schema
8726
+ * default is `true`. `undefined` means the source authored no explicit
8727
+ * value (or `showType` is not `"browsed"`).
8728
+ */
8729
+ showScrollbar?: boolean;
7915
8730
  }
7916
8731
  /**
7917
8732
  * Slide dimensions from `p:sldSz` (CT_SlideSize, ECMA-376 §19.2.1.39).
@@ -8045,6 +8860,34 @@ interface PptxPhotoAlbum {
8045
8860
  layout?: string;
8046
8861
  /** Frame style applied to each photo (e.g. "frameStyle1"). */
8047
8862
  frame?: string;
8863
+ /**
8864
+ * `p:photoAlbum/@isPhoto` (ECMA-376 S19.2.1.27, CT_PhotoAlbum): whether
8865
+ * the pictures placed by the album wizard are real photographs, as
8866
+ * opposed to clip art or other embedded images. `undefined` when the
8867
+ * source authored no explicit value (schema default `false`); this is a
8868
+ * purely declarative wizard-provenance flag, not something this library
8869
+ * gates any layout/frame behaviour on.
8870
+ */
8871
+ isPhoto?: boolean;
8872
+ }
8873
+ /**
8874
+ * A recognizer-owned `p:smartTags` reference from `presentation.xml`
8875
+ * (CT_SmartTags, ECMA-376 S19.2.1.42): a bare relationship id pointing at a
8876
+ * legacy Office "Smart Tags" recognizer part, distinct from the
8877
+ * user-authored `p:tags` construct (see {@link PptxTagCollection}).
8878
+ *
8879
+ * This library has no data model for recognizer part CONTENT (there is no
8880
+ * way to create, inspect, or edit one through the public API), so this type
8881
+ * only captures enough to preserve an authored reference losslessly: the
8882
+ * relationship id and, when resolvable, the target part path.
8883
+ */
8884
+ interface PptxSmartTagsReference {
8885
+ /** Relationship id from `p:smartTags/@r:id`. */
8886
+ relId: string;
8887
+ /** Resolved ZIP path of the referenced recognizer part, when resolvable. */
8888
+ targetPath?: string;
8889
+ /** Raw `p:smartTags` XML retained for lossless round-trip. */
8890
+ rawXml?: XmlObject;
8048
8891
  }
8049
8892
  /**
8050
8893
  * East Asian line-break (kinsoku) settings from `p:kinsoku` in `presentation.xml`.
@@ -8109,6 +8952,13 @@ interface PptxData {
8109
8952
  themeOptions?: PptxThemeOption[];
8110
8953
  /** Parsed table style definitions from `ppt/tableStyles.xml`. */
8111
8954
  tableStyleMap?: ParsedTableStyleMap;
8955
+ /**
8956
+ * The current default table style GUID (`ppt/tableStyles.xml`'s
8957
+ * `a:tblStyleLst/@def`): the style PowerPoint applies to a newly inserted
8958
+ * table. Matches `PptxSaveOptions.tableStylesDefaultId` so a save call
8959
+ * that omits it can fall back to what was loaded.
8960
+ */
8961
+ tableStylesDefaultId?: string;
8112
8962
  /** Whether the presentation is password-protected. */
8113
8963
  isPasswordProtected?: boolean;
8114
8964
  /** Embedded font data (name + binary data URL) extracted from the presentation. */
@@ -8168,6 +9018,14 @@ interface PptxData {
8168
9018
  modifyVerifier?: PptxModifyVerifier;
8169
9019
  /** Photo album metadata from `p:photoAlbum` in `presentation.xml`. */
8170
9020
  photoAlbum?: PptxPhotoAlbum;
9021
+ /**
9022
+ * Legacy Smart Tags recognizer reference from `p:smartTags` in
9023
+ * `presentation.xml`. Read-only: there is no data model for the
9024
+ * recognizer part's own content, so this exists to make the reference
9025
+ * inspectable and to prove it survives a save (the owning part and its
9026
+ * relationship are preserved passively, like any other unmodelled part).
9027
+ */
9028
+ smartTags?: PptxSmartTagsReference;
8171
9029
  /** East Asian line-break settings from `p:kinsoku` in `presentation.xml`. */
8172
9030
  kinsoku?: PptxKinsoku;
8173
9031
  /** Custom XML data parts from `customXml/` in the OPC package. */
@@ -8332,6 +9190,14 @@ type FillInput = {
8332
9190
  type: 'solid';
8333
9191
  color: string;
8334
9192
  opacity?: number;
9193
+ /**
9194
+ * A theme colour to use instead of a plain hex. When set, the shape
9195
+ * saves as `<a:schemeClr>` (e.g. `{ scheme: 'accent1', lumMod: 0.8 }`
9196
+ * for "Accent 1, Lighter 80%") so it keeps following the theme after a
9197
+ * later theme change; `color` still supplies the immediate resolved
9198
+ * hex for renderers that read it directly.
9199
+ */
9200
+ themeColorRef?: PptxThemeColorRef;
8335
9201
  } | {
8336
9202
  type: 'gradient';
8337
9203
  /**
@@ -8367,6 +9233,8 @@ interface StrokeInput {
8367
9233
  opacity?: number;
8368
9234
  join?: 'round' | 'bevel' | 'miter';
8369
9235
  cap?: 'flat' | 'rnd' | 'sq';
9236
+ /** A theme colour for the outline; see {@link FillInput}'s `themeColorRef`. */
9237
+ themeColorRef?: PptxThemeColorRef;
8370
9238
  }
8371
9239
  interface ShadowInput {
8372
9240
  color?: string;
@@ -8383,6 +9251,8 @@ interface TextStyleInput {
8383
9251
  underline?: boolean;
8384
9252
  strikethrough?: boolean;
8385
9253
  color?: string;
9254
+ /** A theme colour for the run; see {@link FillInput}'s `themeColorRef`. */
9255
+ themeColorRef?: PptxThemeColorRef;
8386
9256
  alignment?: 'left' | 'center' | 'right' | 'justify';
8387
9257
  verticalAlignment?: 'top' | 'middle' | 'bottom';
8388
9258
  lineSpacing?: number;
@@ -9010,6 +9880,24 @@ interface PptxHandlerSaveOptions {
9010
9880
  * part untouched.
9011
9881
  */
9012
9882
  tableStyles?: ParsedTableStyleMap;
9883
+ /**
9884
+ * Set `ppt/tableStyles.xml`'s `<a:tblStyleLst @def>` to this style GUID
9885
+ * (normalised to uppercase-with-braces). `undefined` preserves the
9886
+ * existing default; there is no removal form (`@def` is required by the
9887
+ * schema and PowerPoint always points it at a real style). No-op when the
9888
+ * archive has no `ppt/tableStyles.xml`, same as {@link tableStyles}.
9889
+ */
9890
+ tableStylesDefaultId?: string;
9891
+ /**
9892
+ * Style GUIDs to remove from `ppt/tableStyles.xml` entirely, kept as a
9893
+ * separate opt-in list rather than inferred from omission on
9894
+ * {@link tableStyles}: that map is documented as safe to pass a PARTIAL
9895
+ * edit (only the entries a caller actually touched), so treating every
9896
+ * GUID missing from it as "delete this" would silently destroy untouched
9897
+ * styles on an ordinary targeted edit. A GUID here that is also the
9898
+ * current (or newly requested) default is left in place and skipped.
9899
+ */
9900
+ tableStylesToDelete?: string[];
9013
9901
  /**
9014
9902
  * Target output format.
9015
9903
  * - `'pptx'` (default): Standard presentation.
@@ -9913,6 +10801,62 @@ type ChartBuildMode = 'asOne' | 'bySeries' | 'byCategory' | 'byElement';
9913
10801
  * - `byLvlAtOnce` a whole level is revealed per stage (`lvlAtOnce`).
9914
10802
  */
9915
10803
  type DiagramBuildMode = 'asOne' | 'byOne' | 'byLvl' | 'byLvlAtOnce';
10804
+ /**
10805
+ * One authored `p:graphicEl` reveal unit resolved onto a chart, per
10806
+ * `TimelineStepGraphicElement`'s "both indices set" case: a single (series,
10807
+ * category) cell revealed by a `bldStep="seriesEl"`/`"categoryEl"` effect.
10808
+ */
10809
+ interface ChartRevealPoint {
10810
+ seriesIdx: number;
10811
+ categoryIdx: number;
10812
+ }
10813
+ /**
10814
+ * Playback-time chart reveal state derived from AUTHORED `p:graphicEl`
10815
+ * indices (see `chart-reveal-descriptor`'s `resolveChartRevealDescriptor`),
10816
+ * rather than from click-count/time progress. Present on
10817
+ * {@link ElementAnimationState.chartReveal} only when every fired
10818
+ * chart-build step for the element carried index data; a renderer prefers
10819
+ * this over the progress-based `build`/`ElementBuildState` path when present,
10820
+ * since it reflects the real authored reveal set (correct even for a
10821
+ * reversed-order or gapped chart build), and falls back to `build` when
10822
+ * absent.
10823
+ */
10824
+ interface ChartRevealDescriptor {
10825
+ /**
10826
+ * Whether the chart's background/axes/gridlines/legend should currently be
10827
+ * visible: always `true` when the chart's `animateBackground` is `false`
10828
+ * ("shown throughout"), otherwise `true` from the first revealed stage
10829
+ * onward.
10830
+ */
10831
+ background: boolean;
10832
+ /** Whole series revealed by a `bldStep="series"` effect. */
10833
+ series: ReadonlySet<number>;
10834
+ /** Whole categories revealed by a `bldStep="category"` effect. */
10835
+ categories: ReadonlySet<number>;
10836
+ /** Individual cells revealed by a `bldStep="seriesEl"`/`"categoryEl"` effect. */
10837
+ points: readonly ChartRevealPoint[];
10838
+ }
10839
+ /**
10840
+ * Playback-time SmartArt diagram reveal state derived from AUTHORED
10841
+ * `p:graphicEl/p:dgm/@id` indices (see `diagram-reveal-descriptor`'s
10842
+ * `resolveDiagramRevealDescriptor`), rather than from click-count/time
10843
+ * progress. Present on {@link ElementAnimationState.diagramReveal} only when
10844
+ * every fired diagram-build step for the element carried `p:graphicEl` data.
10845
+ * A SmartArt renderer prefers this over the progress-based `build` /
10846
+ * {@link ElementBuildState} path when present, since it reflects the real
10847
+ * authored reveal set (correct even for a reversed-order or by-branch build),
10848
+ * and falls back to `build` when absent.
10849
+ */
10850
+ interface DiagramRevealDescriptor {
10851
+ /**
10852
+ * Whether the diagram's background/connector chrome should currently be
10853
+ * visible: `true` once any node-revealing or background-revealing
10854
+ * (`bldStep="bg"`) step has fired.
10855
+ */
10856
+ background: boolean;
10857
+ /** Data-model point ids (`PptxSmartArtNode.id`) revealed so far. */
10858
+ nodeIds: ReadonlySet<string>;
10859
+ }
9916
10860
  /**
9917
10861
  * Playback-time staged-build state surfaced on {@link ElementAnimationState}.
9918
10862
  * `progress` is the 0..1 fraction of the build revealed at the current playback
@@ -9943,6 +10887,27 @@ interface ElementAnimationState {
9943
10887
  * whole-element entrances, so existing renderers are unaffected.
9944
10888
  */
9945
10889
  build?: ElementBuildState;
10890
+ /**
10891
+ * Authored-index chart reveal state (see {@link ChartRevealDescriptor}),
10892
+ * present only when every fired chart-build step for this element carried
10893
+ * `p:graphicEl` index data. A chart renderer prefers this over `build` when
10894
+ * present; `chart-build`'s `resolveRevealedChartData` picks between the two.
10895
+ */
10896
+ chartReveal?: {
10897
+ mode: ChartBuildMode;
10898
+ descriptor: ChartRevealDescriptor;
10899
+ };
10900
+ /**
10901
+ * Authored-index SmartArt diagram reveal state (see
10902
+ * {@link DiagramRevealDescriptor}), present only when every fired
10903
+ * diagram-build step for this element carried `p:graphicEl` node-id data.
10904
+ * `diagram-build`'s `resolveRevealedSmartArtNodes` prefers this over `build`
10905
+ * when present.
10906
+ */
10907
+ diagramReveal?: {
10908
+ mode: DiagramBuildMode;
10909
+ descriptor: DiagramRevealDescriptor;
10910
+ };
9946
10911
  /**
9947
10912
  * True when an active `p:animClr` color animation targets this shape's fill.
9948
10913
  * A vector renderer should then paint the fill with `fill: inherit` so the
@@ -11208,6 +12173,8 @@ interface ToolbarProps {
11208
12173
  onUpdateElementStyle: (updates: Partial<ShapeStyle>) => void;
11209
12174
  /** How many elements the multi-select currently holds. */
11210
12175
  selectedCount: number;
12176
+ /** Whether every selected element allows `a:spLocks/@noGrp` grouping. */
12177
+ selectionGroupable: boolean;
11211
12178
  /** Open the hyperlink editor for the current selection. */
11212
12179
  onOpenHyperlinkDialog: () => void;
11213
12180
  onDuplicate: () => void;
@@ -12154,6 +13121,11 @@ interface UsePresentationModeInput {
12154
13121
  onPlayActionSound?: (soundPath: string, options?: {
12155
13122
  loop?: boolean;
12156
13123
  }) => void;
13124
+ /**
13125
+ * Stop the currently-playing action/transition sound (`p:sndAc/p:endSnd`,
13126
+ * PowerPoint's transition "Stop Previous Sound").
13127
+ */
13128
+ onStopActionSound?: () => void;
12157
13129
  /** Select a pointer tool (Ctrl+L laser, Ctrl+P pen, Ctrl+A arrow, Ctrl+E eraser). */
12158
13130
  onSetPointerTool?: (tool: PresentationPointerTool | 'arrow') => void;
12159
13131
  /** Erase the current slide's ink annotations (E). */
@@ -13248,6 +14220,8 @@ interface ElementManipulationHandlers {
13248
14220
  handleAlignElements: (align: string) => void;
13249
14221
  handleDistributeElements: (axis: string) => void;
13250
14222
  canDistribute: boolean;
14223
+ /** Whether every currently selected element allows `a:spLocks/@noGrp` grouping. */
14224
+ selectionGroupable: boolean;
13251
14225
  handleMoveLayer: (direction: string) => void;
13252
14226
  handleMoveLayerToEdge: (direction: string) => void;
13253
14227
  handleMergeShapes: (operation: MergeShapeOperation) => void;
@@ -13268,6 +14242,8 @@ interface GroupAlignLayerHandlers {
13268
14242
  handleAlignElements: (align: string) => void;
13269
14243
  handleDistributeElements: (axis: string) => void;
13270
14244
  canDistribute: boolean;
14245
+ /** Whether every currently selected element allows `a:spLocks/@noGrp` grouping. */
14246
+ selectionGroupable: boolean;
13271
14247
  handleMoveLayer: (direction: string) => void;
13272
14248
  handleMoveLayerToEdge: (direction: string) => void;
13273
14249
  handleMergeShapes: (operation: MergeShapeOperation) => void;
@@ -14773,6 +15749,8 @@ interface UseSlideNavigationInput {
14773
15749
  onSetMode: (mode: ViewerMode) => void;
14774
15750
  onSetActiveSlideIndex: (index: number) => void;
14775
15751
  onPlayActionSound?: (soundPath: string) => void;
15752
+ /** Stop the current transition sound (`p:sndAc/p:endSnd`). See `slide-transition.ts`. */
15753
+ onStopActionSound?: () => void;
14776
15754
  loopContinuously?: boolean;
14777
15755
  /** Whether to use rehearsed auto-advance timings. When false, slides advance only on click. */
14778
15756
  useTimings?: boolean;