pptx-react-viewer 3.8.0 → 3.10.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 (184) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/{AiChatPanel-A5DCEHTO.mjs → AiChatPanel-BQSUE2OO.mjs} +4 -4
  3. package/dist/AiChatPanel-BQSUE2OO.mjs.br +0 -0
  4. package/dist/AiChatPanel-BQSUE2OO.mjs.gz +0 -0
  5. package/dist/{AiChatPanel-XLQM4BQJ.js → AiChatPanel-NSVSBJC7.js} +25 -25
  6. package/dist/AiChatPanel-NSVSBJC7.js.br +0 -0
  7. package/dist/AiChatPanel-NSVSBJC7.js.gz +0 -0
  8. package/dist/{Area3DChartScene-5CMEMIBI.mjs → Area3DChartScene-2FQHPGNE.mjs} +21 -4
  9. package/dist/Area3DChartScene-2FQHPGNE.mjs.br +0 -0
  10. package/dist/Area3DChartScene-2FQHPGNE.mjs.gz +0 -0
  11. package/dist/{Area3DChartScene-RZ3V3WOR.js → Area3DChartScene-V3W2V7N5.js} +21 -4
  12. package/dist/Area3DChartScene-V3W2V7N5.js.br +0 -0
  13. package/dist/Area3DChartScene-V3W2V7N5.js.gz +0 -0
  14. package/dist/{Bar3DChartScene-KHCQ6TEC.js → Bar3DChartScene-55XMAUC7.js} +21 -4
  15. package/dist/Bar3DChartScene-55XMAUC7.js.br +0 -0
  16. package/dist/Bar3DChartScene-55XMAUC7.js.gz +0 -0
  17. package/dist/{Bar3DChartScene-H3MYUJKV.mjs → Bar3DChartScene-PSJEVANA.mjs} +21 -4
  18. package/dist/Bar3DChartScene-PSJEVANA.mjs.br +0 -0
  19. package/dist/Bar3DChartScene-PSJEVANA.mjs.gz +0 -0
  20. package/dist/{Line3DChartScene-QEACF3U3.js → Line3DChartScene-5KACYRSQ.js} +21 -4
  21. package/dist/Line3DChartScene-5KACYRSQ.js.br +0 -0
  22. package/dist/Line3DChartScene-5KACYRSQ.js.gz +0 -0
  23. package/dist/{Line3DChartScene-YFRPJHDX.mjs → Line3DChartScene-BUVNUFNO.mjs} +21 -4
  24. package/dist/Line3DChartScene-BUVNUFNO.mjs.br +0 -0
  25. package/dist/Line3DChartScene-BUVNUFNO.mjs.gz +0 -0
  26. package/dist/{Model3DScene-QQWKGJ3T.js → Model3DScene-6U6TN36M.js} +2 -2
  27. package/dist/Model3DScene-6U6TN36M.js.br +0 -0
  28. package/dist/Model3DScene-6U6TN36M.js.gz +0 -0
  29. package/dist/{Model3DScene-O24KP723.mjs → Model3DScene-REKMR2L6.mjs} +1 -1
  30. package/dist/{Model3DScene-O24KP723.mjs.br → Model3DScene-REKMR2L6.mjs.br} +0 -0
  31. package/dist/Model3DScene-REKMR2L6.mjs.gz +0 -0
  32. package/dist/{PieChart3DScene-CI6CW22C.mjs → PieChart3DScene-4L2VVIUJ.mjs} +15 -4
  33. package/dist/PieChart3DScene-4L2VVIUJ.mjs.br +0 -0
  34. package/dist/PieChart3DScene-4L2VVIUJ.mjs.gz +0 -0
  35. package/dist/{PieChart3DScene-L3MHKQHW.js → PieChart3DScene-MV3JF7EM.js} +15 -4
  36. package/dist/PieChart3DScene-MV3JF7EM.js.br +0 -0
  37. package/dist/PieChart3DScene-MV3JF7EM.js.gz +0 -0
  38. package/dist/{SmartArt3DScene-ZO3KFDI2.js → SmartArt3DScene-BK7QN3WT.js} +85 -23
  39. package/dist/SmartArt3DScene-BK7QN3WT.js.br +0 -0
  40. package/dist/SmartArt3DScene-BK7QN3WT.js.gz +0 -0
  41. package/dist/{SmartArt3DScene-XCFVGCXE.mjs → SmartArt3DScene-ODKCGJBO.mjs} +85 -23
  42. package/dist/SmartArt3DScene-ODKCGJBO.mjs.br +0 -0
  43. package/dist/SmartArt3DScene-ODKCGJBO.mjs.gz +0 -0
  44. package/dist/{SurfaceChart3DScene-JUXRC3K2.mjs → SurfaceChart3DScene-ARE7OBFI.mjs} +19 -4
  45. package/dist/SurfaceChart3DScene-ARE7OBFI.mjs.br +0 -0
  46. package/dist/SurfaceChart3DScene-ARE7OBFI.mjs.gz +0 -0
  47. package/dist/{SurfaceChart3DScene-5IER6VFW.js → SurfaceChart3DScene-SFIOK3G3.js} +19 -4
  48. package/dist/SurfaceChart3DScene-SFIOK3G3.js.br +0 -0
  49. package/dist/SurfaceChart3DScene-SFIOK3G3.js.gz +0 -0
  50. package/dist/{chunk-SN5EUDIT.js → chunk-2Q2NFPXA.js} +81834 -57577
  51. package/dist/chunk-2Q2NFPXA.js.br +0 -0
  52. package/dist/chunk-2Q2NFPXA.js.gz +0 -0
  53. package/dist/chunk-DNR6CH6I.js +30 -0
  54. package/dist/chunk-DNR6CH6I.js.br +0 -0
  55. package/dist/chunk-DNR6CH6I.js.gz +0 -0
  56. package/dist/{chunk-4222CHFH.js → chunk-DZ3HWACD.js} +3763 -2551
  57. package/dist/chunk-DZ3HWACD.js.br +0 -0
  58. package/dist/chunk-DZ3HWACD.js.gz +0 -0
  59. package/dist/{chunk-DE3S3UHX.js → chunk-FHOUTYMB.js} +536 -448
  60. package/dist/chunk-FHOUTYMB.js.br +0 -0
  61. package/dist/chunk-FHOUTYMB.js.gz +0 -0
  62. package/dist/{chunk-UPJW34YG.mjs → chunk-HJZA3O3S.mjs} +103 -16
  63. package/dist/chunk-HJZA3O3S.mjs.br +0 -0
  64. package/dist/chunk-HJZA3O3S.mjs.gz +0 -0
  65. package/dist/{chunk-F5NPGNMA.js → chunk-HYUPPQJW.js} +6168 -1929
  66. package/dist/chunk-HYUPPQJW.js.br +0 -0
  67. package/dist/chunk-HYUPPQJW.js.gz +0 -0
  68. package/dist/{chunk-PFPKBNNZ.mjs → chunk-KWHURCVT.mjs} +1771 -559
  69. package/dist/chunk-KWHURCVT.mjs.br +0 -0
  70. package/dist/chunk-KWHURCVT.mjs.gz +0 -0
  71. package/dist/{chunk-RHWQKZLB.mjs → chunk-M6GIPAY4.mjs} +23 -7
  72. package/dist/chunk-M6GIPAY4.mjs.br +0 -0
  73. package/dist/chunk-M6GIPAY4.mjs.gz +0 -0
  74. package/dist/{chunk-RNP5HP4L.mjs → chunk-T4ZRSRQZ.mjs} +6164 -1925
  75. package/dist/chunk-T4ZRSRQZ.mjs.br +0 -0
  76. package/dist/chunk-T4ZRSRQZ.mjs.gz +0 -0
  77. package/dist/chunk-T6GFCLSM.mjs +27 -0
  78. package/dist/chunk-T6GFCLSM.mjs.br +4 -0
  79. package/dist/chunk-T6GFCLSM.mjs.gz +0 -0
  80. package/dist/{chunk-FRZIBZTE.mjs → chunk-TAGG5YNA.mjs} +76 -1
  81. package/dist/chunk-TAGG5YNA.mjs.br +0 -0
  82. package/dist/chunk-TAGG5YNA.mjs.gz +0 -0
  83. package/dist/{chunk-6IMB5DNJ.mjs → chunk-UKPGYJ7G.mjs} +90204 -65968
  84. package/dist/chunk-UKPGYJ7G.mjs.br +0 -0
  85. package/dist/chunk-UKPGYJ7G.mjs.gz +0 -0
  86. package/dist/{chunk-QWA5YEIZ.js → chunk-XW46A7DN.js} +194 -178
  87. package/dist/chunk-XW46A7DN.js.br +0 -0
  88. package/dist/chunk-XW46A7DN.js.gz +0 -0
  89. package/dist/{chunk-L3ZIBQEB.js → chunk-Y6GG2OOW.js} +76 -1
  90. package/dist/chunk-Y6GG2OOW.js.br +0 -0
  91. package/dist/chunk-Y6GG2OOW.js.gz +0 -0
  92. package/dist/i18n.js +4 -4
  93. package/dist/i18n.js.br +0 -0
  94. package/dist/i18n.js.gz +0 -0
  95. package/dist/i18n.mjs +1 -1
  96. package/dist/i18n.mjs.br +0 -0
  97. package/dist/i18n.mjs.gz +0 -0
  98. package/dist/index-CGKutKk1.d.ts.map +1 -1
  99. package/dist/index.d.ts +616 -99
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +47 -47
  102. package/dist/index.js.br +0 -0
  103. package/dist/index.js.gz +0 -0
  104. package/dist/index.mjs +6 -6
  105. package/dist/index.mjs.br +0 -0
  106. package/dist/index.mjs.gz +0 -0
  107. package/dist/internals.d.ts +657 -86
  108. package/dist/internals.d.ts.map +1 -1
  109. package/dist/internals.js +79 -79
  110. package/dist/internals.js.br +0 -0
  111. package/dist/internals.js.gz +0 -0
  112. package/dist/internals.mjs +4 -4
  113. package/dist/internals.mjs.br +0 -0
  114. package/dist/internals.mjs.gz +0 -0
  115. package/dist/pptx-viewer.css +1 -1
  116. package/dist/pptx-viewer.css.br +0 -0
  117. package/dist/pptx-viewer.css.gz +0 -0
  118. package/dist/{useViewerBuildingBlocks-C8F_4Pzb.d.ts → useViewerBuildingBlocks-FbK-4ORi.d.ts} +2 -1
  119. package/dist/useViewerBuildingBlocks-FbK-4ORi.d.ts.map +1 -0
  120. package/dist/viewer/index.d.ts +545 -48
  121. package/dist/viewer/index.d.ts.map +1 -1
  122. package/dist/viewer/index.js +27 -27
  123. package/dist/viewer/index.js.br +0 -0
  124. package/dist/viewer/index.js.gz +0 -0
  125. package/dist/viewer/index.mjs +6 -6
  126. package/dist/viewer/index.mjs.br +0 -0
  127. package/dist/viewer/index.mjs.gz +0 -0
  128. package/package.json +9 -9
  129. package/dist/AiChatPanel-A5DCEHTO.mjs.br +0 -0
  130. package/dist/AiChatPanel-A5DCEHTO.mjs.gz +0 -0
  131. package/dist/AiChatPanel-XLQM4BQJ.js.br +0 -0
  132. package/dist/AiChatPanel-XLQM4BQJ.js.gz +0 -0
  133. package/dist/Area3DChartScene-5CMEMIBI.mjs.br +0 -0
  134. package/dist/Area3DChartScene-5CMEMIBI.mjs.gz +0 -0
  135. package/dist/Area3DChartScene-RZ3V3WOR.js.br +0 -0
  136. package/dist/Area3DChartScene-RZ3V3WOR.js.gz +0 -0
  137. package/dist/Bar3DChartScene-H3MYUJKV.mjs.br +0 -0
  138. package/dist/Bar3DChartScene-H3MYUJKV.mjs.gz +0 -0
  139. package/dist/Bar3DChartScene-KHCQ6TEC.js.br +0 -0
  140. package/dist/Bar3DChartScene-KHCQ6TEC.js.gz +0 -0
  141. package/dist/Line3DChartScene-QEACF3U3.js.br +0 -0
  142. package/dist/Line3DChartScene-QEACF3U3.js.gz +0 -0
  143. package/dist/Line3DChartScene-YFRPJHDX.mjs.br +0 -0
  144. package/dist/Line3DChartScene-YFRPJHDX.mjs.gz +0 -0
  145. package/dist/Model3DScene-O24KP723.mjs.gz +0 -0
  146. package/dist/Model3DScene-QQWKGJ3T.js.br +0 -0
  147. package/dist/Model3DScene-QQWKGJ3T.js.gz +0 -0
  148. package/dist/PieChart3DScene-CI6CW22C.mjs.br +0 -0
  149. package/dist/PieChart3DScene-CI6CW22C.mjs.gz +0 -0
  150. package/dist/PieChart3DScene-L3MHKQHW.js.br +0 -0
  151. package/dist/PieChart3DScene-L3MHKQHW.js.gz +0 -0
  152. package/dist/SmartArt3DScene-XCFVGCXE.mjs.br +0 -0
  153. package/dist/SmartArt3DScene-XCFVGCXE.mjs.gz +0 -0
  154. package/dist/SmartArt3DScene-ZO3KFDI2.js.br +0 -0
  155. package/dist/SmartArt3DScene-ZO3KFDI2.js.gz +0 -0
  156. package/dist/SurfaceChart3DScene-5IER6VFW.js.br +0 -0
  157. package/dist/SurfaceChart3DScene-5IER6VFW.js.gz +0 -0
  158. package/dist/SurfaceChart3DScene-JUXRC3K2.mjs.br +0 -0
  159. package/dist/SurfaceChart3DScene-JUXRC3K2.mjs.gz +0 -0
  160. package/dist/chunk-4222CHFH.js.br +0 -0
  161. package/dist/chunk-4222CHFH.js.gz +0 -0
  162. package/dist/chunk-6IMB5DNJ.mjs.br +0 -0
  163. package/dist/chunk-6IMB5DNJ.mjs.gz +0 -0
  164. package/dist/chunk-DE3S3UHX.js.br +0 -0
  165. package/dist/chunk-DE3S3UHX.js.gz +0 -0
  166. package/dist/chunk-F5NPGNMA.js.br +0 -0
  167. package/dist/chunk-F5NPGNMA.js.gz +0 -0
  168. package/dist/chunk-FRZIBZTE.mjs.br +0 -0
  169. package/dist/chunk-FRZIBZTE.mjs.gz +0 -0
  170. package/dist/chunk-L3ZIBQEB.js.br +0 -0
  171. package/dist/chunk-L3ZIBQEB.js.gz +0 -0
  172. package/dist/chunk-PFPKBNNZ.mjs.br +0 -0
  173. package/dist/chunk-PFPKBNNZ.mjs.gz +0 -0
  174. package/dist/chunk-QWA5YEIZ.js.br +0 -0
  175. package/dist/chunk-QWA5YEIZ.js.gz +0 -0
  176. package/dist/chunk-RHWQKZLB.mjs.br +0 -0
  177. package/dist/chunk-RHWQKZLB.mjs.gz +0 -0
  178. package/dist/chunk-RNP5HP4L.mjs.br +0 -0
  179. package/dist/chunk-RNP5HP4L.mjs.gz +0 -0
  180. package/dist/chunk-SN5EUDIT.js.br +0 -0
  181. package/dist/chunk-SN5EUDIT.js.gz +0 -0
  182. package/dist/chunk-UPJW34YG.mjs.br +0 -0
  183. package/dist/chunk-UPJW34YG.mjs.gz +0 -0
  184. package/dist/useViewerBuildingBlocks-C8F_4Pzb.d.ts.map +0 -1
@@ -2147,6 +2147,29 @@ interface PptxElementBase {
2147
2147
  y: number;
2148
2148
  width: number;
2149
2149
  height: number;
2150
+ /**
2151
+ * The exact EMU integer `x` was parsed from (the `a:off/@_x` this
2152
+ * element's own `a:xfrm` carried on load), when the parser could resolve
2153
+ * one. `x` itself is always `Math.round(xEmu / EMU_PER_PX)` at parse
2154
+ * time, but that rounding is lossy: re-deriving EMU from `x` on save
2155
+ * (`Math.round(x * EMU_PER_PX)`) can drift from the original value by up
2156
+ * to half a pixel's worth of EMU on every load/save cycle even when
2157
+ * nothing touched this element. Kept alongside `x` (not instead of it) so
2158
+ * every consumer that only cares about on-screen position is unaffected;
2159
+ * only the save-side xfrm writer (`resolveXfrmEmu` in
2160
+ * `xfrm-emu-resolution.ts`) reads this, and only when `x` still equals
2161
+ * `Math.round(xEmu / EMU_PER_PX)` (i.e. nothing moved this element since
2162
+ * load) does it re-emit `xEmu` verbatim instead of re-quantizing `x`.
2163
+ * `undefined` for an SDK-created element or one whose transform could not
2164
+ * be resolved to a usable `a:off` on load.
2165
+ */
2166
+ xEmu?: number;
2167
+ /** The exact EMU integer `y` was parsed from (`a:off/@_y`). See {@link xEmu}. */
2168
+ yEmu?: number;
2169
+ /** The exact EMU integer `width` was parsed from (`a:ext/@_cx`). See {@link xEmu}. */
2170
+ widthEmu?: number;
2171
+ /** The exact EMU integer `height` was parsed from (`a:ext/@_cy`). See {@link xEmu}. */
2172
+ heightEmu?: number;
2150
2173
  rotation?: number;
2151
2174
  /** Skew along the X axis in degrees (parsed from `@_skewX` in 1/60000ths of a degree). */
2152
2175
  skewX?: number;
@@ -2666,6 +2689,21 @@ interface PptxChartUserShapeGroupTransform {
2666
2689
  cx: number;
2667
2690
  cy: number;
2668
2691
  };
2692
+ /**
2693
+ * The group's own rotation in degrees (`a:xfrm/@rot`, stored in 60,000ths
2694
+ * of a degree), when present. Rotates the whole group, and everything
2695
+ * grouped inside it, as a rigid body about the CENTRE of the group's own
2696
+ * box ({@link off}/{@link ext}); see `flattenChartUserShapes` in
2697
+ * `chart-user-shapes-parser.ts` for how this composes onto each contained
2698
+ * leaf's own {@link PptxChartUserShapeGroupChild.rotation}. Verified
2699
+ * against real PowerPoint (COM): a `cdr:grpSp`'s `cdr:grpSpPr/a:xfrm` does
2700
+ * carry `rot` the same way an ordinary shape's does.
2701
+ */
2702
+ rotation?: number;
2703
+ /** The group's own horizontal flip (`a:xfrm/@flipH`), when present; composes onto children by XOR, see {@link rotation}'s doc. */
2704
+ flipH?: boolean;
2705
+ /** The group's own vertical flip (`a:xfrm/@flipV`), when present; composes onto children by XOR, see {@link rotation}'s doc. */
2706
+ flipV?: boolean;
2669
2707
  }
2670
2708
  /**
2671
2709
  * One shape grouped inside a `cdr:grpSp` (or a nested `cdr:grpSp` itself).
@@ -2697,6 +2735,23 @@ interface PptxChartUserShapeGroupChild {
2697
2735
  strokeWidth?: number;
2698
2736
  /** Text paragraphs of the shape's `txBody`, when present. */
2699
2737
  paragraphs?: PptxChartUserShapeParagraph[];
2738
+ /**
2739
+ * A `pic` child's alt text (`cdr:nvPicPr/cdr:cNvPr/@descr`), when present.
2740
+ * Editable independently of {@link rawXml}'s otherwise-verbatim content:
2741
+ * the serializer patches only this attribute onto the cloned raw node.
2742
+ */
2743
+ altText?: string;
2744
+ /**
2745
+ * This child's OWN rotation in degrees (`a:xfrm/@rot`), when present.
2746
+ * Composes with every enclosing group's own
2747
+ * {@link PptxChartUserShapeGroupTransform.rotation} (added) to produce the
2748
+ * leaf's final on-screen rotation; see `flattenChartUserShapes`.
2749
+ */
2750
+ rotation?: number;
2751
+ /** This child's OWN horizontal flip (`a:xfrm/@flipH`); composes with an ancestor group's flip by XOR. */
2752
+ flipH?: boolean;
2753
+ /** This child's OWN vertical flip (`a:xfrm/@flipV`); composes with an ancestor group's flip by XOR. */
2754
+ flipV?: boolean;
2700
2755
  /**
2701
2756
  * Verbatim source XML of a `pic`/`graphicFrame` child, or of this node
2702
2757
  * itself when `kind === 'grpSp'` and the nested group is untouched since
@@ -2755,6 +2810,29 @@ interface PptxChartUserShape {
2755
2810
  strokeWidth?: number;
2756
2811
  /** Text paragraphs of the shape's `txBody`, when present. */
2757
2812
  paragraphs?: PptxChartUserShapeParagraph[];
2813
+ /**
2814
+ * A `pic` anchor's alt text (`cdr:nvPicPr/cdr:cNvPr/@descr`), when
2815
+ * present. Editable independently of {@link rawXml}'s otherwise-verbatim
2816
+ * content: the serializer patches only this attribute onto the cloned
2817
+ * raw node, so a picture's blip and other markup are untouched.
2818
+ */
2819
+ altText?: string;
2820
+ /**
2821
+ * This shape's OWN rotation in degrees (`a:xfrm/@rot`, on `spPr/a:xfrm`
2822
+ * for `sp`/`cxnSp`/`pic`, or directly on a top-level `graphicFrame`'s own
2823
+ * `a:xfrm`), when present. A top-level anchor's position/size is governed
2824
+ * by {@link from}/{@link to}/{@link ext}, never by this `a:xfrm`'s own
2825
+ * `off`/`ext` (see {@link rawXml}'s doc), but `rot`/`flipH`/`flipV` on that
2826
+ * same `a:xfrm` DO apply visually: verified against real PowerPoint (COM),
2827
+ * which writes e.g. `<a:xfrm rot="1800000"><a:off .../><a:ext .../></a:xfrm>`
2828
+ * on a rotated overlay shape's `spPr`, with the `off`/`ext` values
2829
+ * unrelated to the anchor's own `cdr:from`/`cdr:to`.
2830
+ */
2831
+ rotation?: number;
2832
+ /** This shape's OWN horizontal flip (`a:xfrm/@flipH`); see {@link rotation}'s doc. */
2833
+ flipH?: boolean;
2834
+ /** This shape's OWN vertical flip (`a:xfrm/@flipV`); see {@link rotation}'s doc. */
2835
+ flipV?: boolean;
2758
2836
  /**
2759
2837
  * Verbatim source XML of a `pic` or `graphicFrame` anchor child (the
2760
2838
  * `cdr:pic` / `cdr:graphicFrame` node itself, not the enclosing anchor),
@@ -2784,7 +2862,7 @@ interface PptxChartUserShape {
2784
2862
  * @example
2785
2863
  * ```ts
2786
2864
  * const type: PptxChartType = "bar";
2787
- * // => "bar" one of: "bar" | "line" | "pie" | "doughnut" | "area" | "scatter" | …
2865
+ * // => "bar": one of: "bar" | "line" | "pie" | "doughnut" | "area" | "scatter" | …
2788
2866
  * ```
2789
2867
  */
2790
2868
  type PptxChartType = 'bar' | 'line' | 'pie' | 'ofPie' | 'doughnut' | 'area' | 'scatter' | 'bubble' | 'radar' | 'stock' | 'bar3D' | 'line3D' | 'pie3D' | 'area3D' | 'surface' | 'histogram' | 'waterfall' | 'funnel' | 'treemap' | 'sunburst' | 'boxWhisker' | 'regionMap' | 'combo' | 'unknown';
@@ -2819,7 +2897,7 @@ type PptxBar3DShape = 'box' | 'cone' | 'coneToMax' | 'cylinder' | 'pyramid' | 'p
2819
2897
  * @example
2820
2898
  * ```ts
2821
2899
  * const type: PptxChartTrendlineType = "linear";
2822
- * // => "linear" one of: "linear" | "exponential" | "logarithmic" | "polynomial" | "power" | "movingAvg"
2900
+ * // => "linear": one of: "linear" | "exponential" | "logarithmic" | "polynomial" | "power" | "movingAvg"
2823
2901
  * ```
2824
2902
  */
2825
2903
  type PptxChartTrendlineType = 'linear' | 'exponential' | 'logarithmic' | 'polynomial' | 'power' | 'movingAvg';
@@ -2870,7 +2948,7 @@ type PptxChartErrBarType = 'both' | 'minus' | 'plus';
2870
2948
  * @example
2871
2949
  * ```ts
2872
2950
  * const valType: PptxChartErrValType = "percentage";
2873
- * // => "percentage" one of: "cust" | "fixedVal" | "percentage" | "stdDev" | "stdErr"
2951
+ * // => "percentage": one of: "cust" | "fixedVal" | "percentage" | "stdDev" | "stdErr"
2874
2952
  * ```
2875
2953
  */
2876
2954
  type PptxChartErrValType = 'cust' | 'fixedVal' | 'percentage' | 'stdDev' | 'stdErr';
@@ -2989,9 +3067,29 @@ interface PptxChartDataPoint {
2989
3067
  bubble3D?: boolean;
2990
3068
  /** Per-point picture-fill flags (`c:dPt/c:pictureOptions`). */
2991
3069
  picture?: PptxChartDataPointPicture;
3070
+ /**
3071
+ * This point's identity GUID (`c:dPt/c:extLst/c:ext/c16:uniqueId/@val`,
3072
+ * the Office 2014+ `{C3380CC4-5D6E-409C-BE32-E72D297353CC}` chart
3073
+ * extension), read-only here: an edited point keeps its existing
3074
+ * `c:extLst` as passthrough (see `chart-datapoint-serializer.ts`), so this
3075
+ * field exists for introspection rather than round-trip.
3076
+ */
3077
+ uniqueId?: string;
2992
3078
  }
2993
3079
  /** Schema values accepted by `c:dLblPos`. */
2994
3080
  type PptxChartDataLabelPosition = 'bestFit' | 'b' | 'ctr' | 'inBase' | 'inEnd' | 'l' | 'outEnd' | 'r' | 't';
3081
+ /**
3082
+ * `c15:dlblRangeCache`/`c15:datalabelsRange` (CT_SeriesDataLabelsRange):
3083
+ * PowerPoint 2013+'s "Value From Cells" custom label source, one cell range
3084
+ * supplying every label in a group (chart-type or series `c:dLbls`), with a
3085
+ * cache aligned to point order. See `utils/chart-data-labels-range.ts`.
3086
+ */
3087
+ interface PptxChartDataLabelsRange {
3088
+ /** `c15:f`: the cell range formula (e.g. `Sheet1!$D$2:$D$5`). */
3089
+ formula: string;
3090
+ /** `c15:dlblRangeCache`: cached label text, index-aligned with data points. */
3091
+ cache: string[];
3092
+ }
2995
3093
  /** Individual data label override (c:dLbl). */
2996
3094
  interface PptxChartDataLabel {
2997
3095
  idx: number;
@@ -3033,6 +3131,14 @@ interface PptxChartDataLabel {
3033
3131
  * over any chart/series-level default when set.
3034
3132
  */
3035
3133
  spPr?: PptxChartShapeProps;
3134
+ /**
3135
+ * `c15:xForSave`: this override exists only so its properties survive a
3136
+ * save/reload round trip; PowerPoint merges it back onto the series'
3137
+ * default label on load. Round-tripped as-is (an edited chart keeps an
3138
+ * existing point's whole `extLst`, this flag included); introspection
3139
+ * only otherwise. See `utils/chart-data-labels-range.ts`.
3140
+ */
3141
+ savedForCompatibilityOnly?: boolean;
3036
3142
  }
3037
3143
  /** Axis number format. */
3038
3144
  interface PptxChartAxisNumFmt {
@@ -3065,7 +3171,7 @@ interface PptxChartAxisFormatting extends PptxChartAxisLabelFormatting {
3065
3171
  axPos?: 'b' | 'l' | 'r' | 't';
3066
3172
  /** Unique axis identifier (c:axId/@val) used to link series to axes. */
3067
3173
  axisId?: number;
3068
- /** Cross-axis identifier the axis this axis crosses. */
3174
+ /** Cross-axis identifier: the axis this axis crosses. */
3069
3175
  crossAxisId?: number;
3070
3176
  /** Automatic crossing mode (`c:crosses`). Mutually exclusive with `crossesAt`. */
3071
3177
  crosses?: 'autoZero' | 'min' | 'max';
@@ -3317,6 +3423,54 @@ interface PptxChartSeries {
3317
3423
  waterfallOptions?: PptxChartWaterfallOptions;
3318
3424
  regionMapOptions?: PptxChartRegionMapOptions;
3319
3425
  treemapOptions?: PptxChartTreemapOptions;
3426
+ /**
3427
+ * Series-level picture-fill flags (`c:ser/c:pictureOptions`), legal
3428
+ * wherever a per-point `c:dPt/c:pictureOptions` is (CT_BarSer): paints
3429
+ * EVERY point in the series with one picture unless a `c:dPt` overrides it
3430
+ * for that point alone. A point's own {@link PptxChartDataPoint.picture}
3431
+ * takes precedence entirely (not merged field-by-field) when it resolves
3432
+ * its own image; renderers fall back to this series-level picture only
3433
+ * when the point has none of its own.
3434
+ */
3435
+ picture?: PptxChartDataPointPicture;
3436
+ /**
3437
+ * This series' identity GUID (`c:ser/c:extLst/c:ext/c16:uniqueId/@val`,
3438
+ * the Office 2014+ `{C3380CC4-5D6E-409C-BE32-E72D297353CC}` chart
3439
+ * extension). PowerPoint uses it to track a series across edits and
3440
+ * collaborators independent of its `c:idx`/`c:order` position (the same
3441
+ * role animation targeting and CRDT reconciliation need). An edited
3442
+ * existing series keeps its own `c:extLst` as passthrough; a NEW series
3443
+ * added by cloning an existing one as a template is given a freshly
3444
+ * generated id rather than duplicating the template's (see
3445
+ * `regenerateClonedUniqueId` in `chart-series-identity.ts`), since two
3446
+ * series sharing one identity is exactly what this extension exists to
3447
+ * prevent.
3448
+ */
3449
+ uniqueId?: string;
3450
+ }
3451
+ /**
3452
+ * A series PowerPoint's "Chart Filters" feature hid from the plot while
3453
+ * keeping it in the workbook (`c:<type>Chart/c:extLst/c:ext
3454
+ * [@uri={02D57815-91ED-43cb-92C2-25804820EDAC}]/c15:filtered<Type>Series
3455
+ * /c15:ser`). Read-mostly: {@link PptxChartData.filteredSeries} exists for
3456
+ * introspection (AI tools, "unhide filtered series" UI) and round-trips as
3457
+ * passthrough through the preserved chart XML when untouched. See
3458
+ * `utils/chart-filtered-series.ts` for the parse rules and the idx-collision
3459
+ * fix this modelling enables on save.
3460
+ */
3461
+ interface PptxChartFilteredSeries {
3462
+ /** `c15:ser/c:idx/@val`, the workbook column position this series still occupies. */
3463
+ idx: number;
3464
+ /** `c15:ser/c:order/@val`, defaulting to {@link idx} when absent. */
3465
+ order: number;
3466
+ /** Series name, from the hidden series' own `c:tx` cache. */
3467
+ name?: string;
3468
+ /** Category labels, from the hidden series' own `c:cat` cache. */
3469
+ categories?: string[];
3470
+ /** Data values, from the hidden series' own `c:val` cache. */
3471
+ values?: number[];
3472
+ /** This hidden series' own identity GUID (`c16:uniqueId`), when present. */
3473
+ uniqueId?: string;
3320
3474
  }
3321
3475
  /**
3322
3476
  * Chart-level data-label options (`c:dLbls` directly under a chart-type
@@ -3340,6 +3494,19 @@ interface PptxChartDataLabelOptions {
3340
3494
  separator?: string;
3341
3495
  /** Show leader lines where supported (`c:showLeaderLines`). */
3342
3496
  showLeaderLines?: boolean;
3497
+ /**
3498
+ * Leader-line stroke styling for offset (pie/doughnut `outEnd`/`bestFit`)
3499
+ * labels. Resolved from the base `c:leaderLines/c:spPr` when present, else
3500
+ * falling back to the Office 2013+ chart15 extension's mirror
3501
+ * (`c:extLst/c:ext/c15:leaderLines/c:spPr`, uri
3502
+ * `{CE6537A1-D6FC-4f65-9D91-7224C49458BB}`), which is the one PowerPoint
3503
+ * itself treats as authoritative when both are present. Confirmed against
3504
+ * `e2e/fixtures/issue-132-gradient-fill.pptx` and
3505
+ * `e2e/fixtures/issue-132-hr-deck.pptx`, both of which write only the
3506
+ * extension form. `undefined` leaves the renderer's own default leader-line
3507
+ * stroke.
3508
+ */
3509
+ leaderLineStyle?: PptxChartShapeProps;
3343
3510
  /**
3344
3511
  * Label position (`c:dLblPos`). Valid values depend on the chart type
3345
3512
  * (`ctr`, `inEnd`, `inBase`, `outEnd`, `bestFit`, `l`, `r`, `t`, `b`).
@@ -3360,6 +3527,22 @@ interface PptxChartDataLabelOptions {
3360
3527
  * (point > series > chart-type).
3361
3528
  */
3362
3529
  txPr?: PptxChartLegendTextStyle;
3530
+ /**
3531
+ * PowerPoint 2013+ "Value From Cells", series-wide form
3532
+ * (`c15:datalabelsRange`, chart15 uri `{CE6537A1-...}`): one cell range
3533
+ * supplies every label in this group, aligned by point index. A
3534
+ * SERIES-WIDE alternative to the per-point `c15:dlblFieldTable` mechanism
3535
+ * (already resolved into {@link PptxChartDataLabel.text} at parse time).
3536
+ * See `utils/chart-data-labels-range.ts`.
3537
+ */
3538
+ dataLabelsRange?: PptxChartDataLabelsRange;
3539
+ /**
3540
+ * `c15:showDataLabelsRange` at the SAME level as {@link dataLabelsRange}:
3541
+ * whether every label in this group resolves through the range's cache.
3542
+ * Distinct from the per-point {@link PptxChartDataLabel} flag of the same
3543
+ * XML name. Only meaningful when {@link dataLabelsRange} is set.
3544
+ */
3545
+ showDataLabelsRange?: boolean;
3363
3546
  }
3364
3547
  /** Typed text defaults for a single chart legend entry. */
3365
3548
  interface PptxChartLegendTextStyle {
@@ -3493,12 +3676,12 @@ interface PptxBubbleChartOptions {
3493
3676
  *
3494
3677
  * All fields are optional and round-trip verbatim.
3495
3678
  *
3496
- * - {@link rotX} X-axis rotation in degrees (-90…90).
3497
- * - {@link rotY} Y-axis rotation in degrees (0…360).
3498
- * - {@link depthPercent} chart depth as a percentage of base width.
3499
- * - {@link rAngAx} `true` if axes meet at right angles.
3500
- * - {@link perspective} perspective angle in degrees (0…240).
3501
- * - {@link hPercent} height as a percentage of chart width.
3679
+ * - {@link rotX}: X-axis rotation in degrees (-90…90).
3680
+ * - {@link rotY}: Y-axis rotation in degrees (0…360).
3681
+ * - {@link depthPercent}: chart depth as a percentage of base width.
3682
+ * - {@link rAngAx}: `true` if axes meet at right angles.
3683
+ * - {@link perspective}: perspective angle in degrees (0…240).
3684
+ * - {@link hPercent}: height as a percentage of chart width.
3502
3685
  */
3503
3686
  interface PptxChartView3D {
3504
3687
  rotX?: number;
@@ -3512,12 +3695,17 @@ interface PptxChartView3D {
3512
3695
  * Chart "chrome" flags from `c:chart` that round-trip cleanly even when
3513
3696
  * rendering ignores them.
3514
3697
  *
3515
- * - {@link autoTitleDeleted} `c:autoTitleDeleted/@val`. Suppresses the
3698
+ * - {@link autoTitleDeleted}: `c:autoTitleDeleted/@val`. Suppresses the
3516
3699
  * auto-generated title for single-series charts.
3517
- * - {@link dispBlanksAs} `c:dispBlanksAs/@val`. How blank cells
3700
+ * - {@link dispBlanksAs}: `c:dispBlanksAs/@val`. How blank cells
3518
3701
  * render: `"gap"`, `"zero"`, or `"span"`.
3519
- * - {@link showDLblsOverMax} `c:showDLblsOverMax/@val`. Keeps data
3702
+ * - {@link showDLblsOverMax}: `c:showDLblsOverMax/@val`. Keeps data
3520
3703
  * labels visible for points exceeding the value-axis maximum.
3704
+ * - {@link dispNaAsBlank}: the Office 2017+ chart extension
3705
+ * `c:extLst/c:ext/c16r3:dataDisplayOptions16/c16r3:dispNaAsBlank/@val`
3706
+ * (uri `{56B9EC1D-385E-4148-901F-78D8002777C0}`), PowerPoint's "Show #N/A
3707
+ * as an empty cell" chart option. Confirmed against real corpus markup
3708
+ * (`e2e/fixtures/chart-data-fidelity.pptx`).
3521
3709
  *
3522
3710
  * `c:plotVisOnly` lives on {@link PptxChartData.plotVisibleOnly} and is
3523
3711
  * intentionally not duplicated here.
@@ -3526,6 +3714,7 @@ interface PptxChartChrome {
3526
3714
  autoTitleDeleted?: boolean;
3527
3715
  dispBlanksAs?: 'gap' | 'zero' | 'span';
3528
3716
  showDLblsOverMax?: boolean;
3717
+ dispNaAsBlank?: boolean;
3529
3718
  }
3530
3719
  /** Manual chart placement from `c:layout/c:manualLayout` (CT_ManualLayout). */
3531
3720
  interface PptxChartManualLayout {
@@ -3621,6 +3810,26 @@ interface PptxChartData {
3621
3810
  categoryLevels?: string[][];
3622
3811
  dateCategories?: PptxChartDateCategories;
3623
3812
  series: PptxChartSeries[];
3813
+ /**
3814
+ * Series hidden from the plot by PowerPoint's "Chart Filters" feature
3815
+ * (Series tab) but still present in the workbook, aggregated across every
3816
+ * chart-type container (combo charts can carry more than one). Absent
3817
+ * when the chart has no such extension. See {@link PptxChartFilteredSeries}.
3818
+ */
3819
+ filteredSeries?: PptxChartFilteredSeries[];
3820
+ /**
3821
+ * `c15:filteredSeriesTitle`: the auto-generated series title text (e.g.
3822
+ * "Series 3") PowerPoint preserved when the chart filter hid the series
3823
+ * whose data would otherwise have supplied it. See
3824
+ * `utils/chart-ext-titles.ts`. Read-mostly like {@link filteredSeries}.
3825
+ */
3826
+ filteredSeriesTitle?: string;
3827
+ /**
3828
+ * `c15:filteredCategoryTitle`: the auto-numbered category labels ("1",
3829
+ * "2", "3", ...) PowerPoint preserved when the chart filter hid the
3830
+ * category axis source entirely. See `utils/chart-ext-titles.ts`.
3831
+ */
3832
+ filteredCategoryTitle?: string[];
3624
3833
  /** Chart style/formatting metadata. */
3625
3834
  style?: PptxChartStyle;
3626
3835
  /** Grouping mode for bar/area/line charts: 'clustered' | 'stacked' | 'percentStacked' */
@@ -3744,9 +3953,9 @@ interface PptxChartData {
3744
3953
  /**
3745
3954
  * Color cycling method from the chart color style part's `meth` attribute.
3746
3955
  *
3747
- * - `"cycle"` repeat the palette colours in order (default)
3748
- * - `"withinLinear"` gradient within each series
3749
- * - `"acrossLinear"` gradient across series
3956
+ * - `"cycle"`: repeat the palette colours in order (default)
3957
+ * - `"withinLinear"`: gradient within each series
3958
+ * - `"acrossLinear"`: gradient across series
3750
3959
  */
3751
3960
  colorMethod?: 'cycle' | 'withinLinear' | 'acrossLinear';
3752
3961
  /** Internal source color-style part path used for lossless dirty saves. */
@@ -4543,7 +4752,95 @@ interface PptxSmartArtLayoutNode {
4543
4752
  rules?: PptxSmartArtNumericRule[];
4544
4753
  /** `dgm:shape`: this node's own preset geometry override, when present. */
4545
4754
  shape?: PptxSmartArtLayoutNodeShape;
4755
+ /**
4756
+ * `dgm:presOf` (CT_PresentationOf, same iterator shape as `dgm:forEach`):
4757
+ * which data-model point(s) this node's OWN text/geometry binds to -
4758
+ * `axis: ['self']` the point currently being iterated, `['des']` all of
4759
+ * its descendants, `['ch']` its direct children, and so on. Absent or
4760
+ * empty `axis` (including a bare `<dgm:presOf/>`) means the node carries
4761
+ * no text of its own (a pure positioning/decoration wrapper - `composite`,
4762
+ * `sp` spacer, connector cap). See `smartart-layout-interpreter-item-
4763
+ * roles.ts`, the one consumer: it is what lets the interpreter tell a
4764
+ * text-bearing per-item role (a list layout's `childText`, a card
4765
+ * layout's `roleText`/`bodyText`) apart from a same-generation sibling
4766
+ * that positions or decorates instead.
4767
+ */
4768
+ presentationOf?: PptxSmartArtIteratorAttributes;
4769
+ /**
4770
+ * EVERY `dgm:constr` reachable from this node, including ones declared
4771
+ * inside a `dgm:choose`/`dgm:if`/`dgm:else` that wraps THIS layoutNode's
4772
+ * `constrLst` (a genuinely conditional constraint set, e.g. one branch
4773
+ * per data-point count - `gear`'s composite positions its `gear1`/
4774
+ * `gear2`/`gear3` slots this way, so its plain, direct-child-only
4775
+ * `constraints` above is empty for it). Stops at a nested `dgm:layoutNode`
4776
+ * boundary: that child's own conditional constrLst becomes ITS
4777
+ * `allConstraints`, not folded into the parent's. Read-only /
4778
+ * interpretation-only - `constraints` above (this node's own DIRECT
4779
+ * constrLst) remains the one `applySmartArtLayoutDefinition` round-trips,
4780
+ * so editing an unrelated property can never collapse a genuinely
4781
+ * conditional constrLst into a single branch. `undefined` when this node
4782
+ * declares no constrLst at all, in or out of a choose (the common case);
4783
+ * otherwise a superset of `constraints` (every branch, blindly unioned -
4784
+ * this interpreter does not evaluate `dgm:choose` conditions when
4785
+ * indexing constraints, matching the same "flatten both branches"
4786
+ * convention `nestedLayoutNodes` already uses for `children`). See
4787
+ * `smartart-constraint-solver.ts`'s `buildConstraintIndex`, the only
4788
+ * consumer.
4789
+ */
4790
+ allConstraints?: PptxSmartArtConstraint[];
4546
4791
  children?: PptxSmartArtLayoutNode[];
4792
+ /**
4793
+ * The iterator attributes of the ENCLOSING `dgm:forEach` this node was
4794
+ * found through, when `nestedLayoutNodes` (`smartart-layout-definition
4795
+ * .ts`) reached it by walking one - as opposed to being a direct child of
4796
+ * its parent layoutNode, or reached only through a `dgm:choose` wrapper
4797
+ * (a condition, not an iteration, leaves this `undefined`).
4798
+ *
4799
+ * `forEach` above records a node's OWN direct `dgm:forEach` children
4800
+ * (which wrap ITS descendants); this is the opposite direction - the
4801
+ * forEach that wraps the node ITSELF, one level up. A layoutNode can sit
4802
+ * inside more than one enclosing forEach only via nesting, so this is
4803
+ * always the SINGLE nearest one, not a list.
4804
+ *
4805
+ * This is what tells a genuinely repeated per-child template
4806
+ * (`axis="ch"`, `ptType` absent or `"node"`) apart from a once-only or
4807
+ * transition-only sibling that merely happens to sit inside SOME
4808
+ * `dgm:forEach` (a `ptType="parTrans"`/`"sibTrans"` connector, or
4809
+ * `axis="followSib" cnt="1"`) - both can be direct siblings under the
4810
+ * SAME parent layoutNode (`lProcess1`'s `vertFlow` has one forEach for
4811
+ * its `parTrans` connector and a SEPARATE one, `axis="ch"`, for its
4812
+ * repeated `child` items; `vertFlow.forEach` bundles both, but only
4813
+ * `child.forEachOrigin` says which ONE produced it). See
4814
+ * `smartart-layout-interpreter-item-roles-recursive.ts`, the one
4815
+ * consumer. Read-only / interpretation-only, like `allConstraints`:
4816
+ * never round-tripped by `applySmartArtLayoutDefinition`.
4817
+ */
4818
+ forEachOrigin?: PptxSmartArtIteratorAttributes;
4819
+ /**
4820
+ * The condition of the NEAREST enclosing `dgm:if` this node was found
4821
+ * through, when `nestedLayoutNodes` (`smartart-layout-definition.ts`)
4822
+ * reached it via a `dgm:choose`'s `if` branch (as opposed to a direct
4823
+ * child, a `dgm:else` branch - always `undefined` here, see below - or a
4824
+ * `dgm:forEach`, which sets {@link forEachOrigin} instead). Lets a
4825
+ * caller that already has the data-model node list decide whether this
4826
+ * node's OWN branch is genuinely live for a specific point, instead of
4827
+ * treating every choose-flattened branch as unconditionally present
4828
+ * (`nestedLayoutNodes`' pre-existing "flatten every branch" convention,
4829
+ * still the default when this is absent or a caller does not evaluate
4830
+ * it) - e.g. `cycle-matrix--fallback-n2.pptx`'s `child1group`..
4831
+ * `child4group`, each gated on a DIFFERENT top-level point existing and
4832
+ * having its own child (`axis="ch ch" st="N 1" cnt="1 0" func="cnt"
4833
+ * op="gte" val="1"`).
4834
+ *
4835
+ * Deliberately `undefined` for a `dgm:else` branch: ECMA-376 defines it
4836
+ * as "none of the sibling ifs matched", which would need the FULL
4837
+ * sibling list's conditions negated and ANDed together, not a single
4838
+ * condition - no gallery fixture measured needs an else branch's own
4839
+ * guard yet, so it is left unconditional (rendered by default, matching
4840
+ * the pre-existing flatten-everything behaviour) rather than guessed at.
4841
+ * Evaluate with `smartart-layout-interpreter-when.ts`'s `evaluateWhen`.
4842
+ */
4843
+ chooseGuard?: PptxSmartArtWhen;
4547
4844
  }
4548
4845
  /** Metadata and root node from DiagramML CT_DiagramDefinition. */
4549
4846
  interface PptxSmartArtLayoutDefinition {
@@ -5176,6 +5473,14 @@ interface PptxSmartArtData {
5176
5473
  * Consulted by the fallback layout engine for direction/org-chart hints.
5177
5474
  */
5178
5475
  presLayoutVars?: PptxSmartArtPresLayoutVars;
5476
+ /**
5477
+ * The deck's own theme minor-Latin font (`a:fontScheme/a:minorFont/a:latin/
5478
+ * @typeface`): what SmartArt text actually renders in when no per-run
5479
+ * `a:latin` override is present (the common case - see
5480
+ * `smartart-layout-item-font-size.ts`'s font-fit, the one consumer).
5481
+ * Undefined when the theme carries no font scheme at all.
5482
+ */
5483
+ themeMinorFont?: string;
5179
5484
  /** Relationship ID for the diagram data part (for round-trip save). */
5180
5485
  dataRelId?: string;
5181
5486
  /** Relationship ID for the diagram layout part. */
@@ -6135,7 +6440,7 @@ interface SmartArtPptxElement extends PptxElementBase {
6135
6440
  *
6136
6441
  * Used to show type-specific icons and previews in the editor.
6137
6442
  */
6138
- type OleObjectType = 'excel' | 'word' | 'pdf' | 'visio' | 'mathtype' | 'package' | 'unknown';
6443
+ type OleObjectType = 'excel' | 'word' | 'powerpoint' | 'pdf' | 'visio' | 'mathtype' | 'package' | 'unknown';
6139
6444
  /**
6140
6445
  * An OLE (Object Linking and Embedding) object.
6141
6446
  *
@@ -6213,6 +6518,15 @@ interface OlePptxElement extends PptxElementBase {
6213
6518
  * `false`; `undefined` means the source authored no explicit value.
6214
6519
  */
6215
6520
  oleUpdateAutomatic?: boolean;
6521
+ /**
6522
+ * Set by the in-viewer OLE content editors (`ole-edit-api.ts`) whenever
6523
+ * `oleEmbeddedData` and/or `previewImageData` have been changed in memory
6524
+ * and still need to be written back into the saved package. Never
6525
+ * authored from a parsed file; purely an in-memory save signal, mirroring
6526
+ * `PptxSlide.isDirty`. The save writer clears it once the pending write
6527
+ * has been queued.
6528
+ */
6529
+ oleContentDirty?: boolean;
6216
6530
  /** Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`. */
6217
6531
  altText?: string;
6218
6532
  /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. */
@@ -6309,13 +6623,14 @@ interface MediaPptxElement extends PptxElementBase {
6309
6623
  */
6310
6624
  isLinked?: boolean;
6311
6625
  /**
6312
- * Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`.
6313
- * Only populated for the `p:graphicFrame`-shaped (SDK-created) media
6314
- * form; a `p:pic`-shaped media element's alt text is not currently
6315
- * parsed (see `PptxHandlerRuntimePictureParsing.ts`).
6626
+ * Accessibility description. Read from `p:nvGraphicFramePr/p:cNvPr/@descr`
6627
+ * for the `p:graphicFrame`-shaped (SDK-created) media form, or from
6628
+ * `p:nvPicPr/p:cNvPr/@descr` for the `p:pic`-shaped media form (real
6629
+ * PowerPoint's usual authoring shape for a video/audio placeholder); see
6630
+ * `PptxHandlerRuntimePictureParsing.ts`.
6316
6631
  */
6317
6632
  altText?: string;
6318
- /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. Same scope note as {@link altText}. */
6633
+ /** Accessibility title, from the same `@title` attribute on whichever `p:cNvPr` the media form uses. Same scope note as {@link altText}. */
6319
6634
  title?: string;
6320
6635
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
6321
6636
  extensionXml?: PptxGraphicFrameExtension[];
@@ -6342,6 +6657,46 @@ interface GroupPptxElement extends PptxElementBase {
6342
6657
  children: PptxElement[];
6343
6658
  /** Fill style extracted from the group's `p:grpSpPr`, used for `a:grpFill` inheritance. */
6344
6659
  groupFill?: ShapeStyle;
6660
+ /**
6661
+ * The SAME `p:grpSpPr` extraction as {@link groupFill}, kept whenever the
6662
+ * group carries a `p:grpSpPr` at all, regardless of whether it resolved to
6663
+ * a paintable fill.
6664
+ *
6665
+ * `groupFill` is `undefined` unless the group has a real fill, because
6666
+ * `getGroupChildParentFill`/`groupChildInheritedFill` (the `a:grpFill`
6667
+ * inheritance chain) must keep chaining through an ancestor's fill when
6668
+ * THIS group has none of its own. A group whose `p:grpSpPr` authors only
6669
+ * `a:effectLst` (shadow/glow/soft-edge/reflection, no fill) needs those
6670
+ * effects to still reach the renderer, so they are kept here under a name
6671
+ * that carries no fill-inheritance meaning. Currently only reflection is
6672
+ * read from it (`getComputedEffectStyle`); the rest of `a:effectLst` on a
6673
+ * group remains unsupported.
6674
+ */
6675
+ groupEffectStyle?: ShapeStyle;
6676
+ /**
6677
+ * Exact EMU the group's own `a:chOff`/`a:chExt` (the coordinate space its
6678
+ * CHILDREN are authored in) were parsed from, alongside {@link
6679
+ * PptxElementBase.xEmu} etc for the group's own placement in its PARENT's
6680
+ * space. `undefined` when the source carried no usable `a:chOff`/`a:chExt`
6681
+ * (an SDK-created group, or one whose `a:xfrm` had no child-space data).
6682
+ *
6683
+ * Used by `group-xfrm-preservation.ts`'s `hasCapturedChildSpace` to decide
6684
+ * whether this group's original `a:chOff`/`a:chExt` can be re-emitted
6685
+ * verbatim (always true once captured, regardless of whether anything in
6686
+ * the subtree has moved or resized - only its DIRECT children's
6687
+ * `a:off`/`a:ext` are recomputed, via `invertChildIntoGroupSpace`, when
6688
+ * something changed), instead of the normalized `chOff 0,0` / `chExt ==
6689
+ * ext` space the writer falls back to when this is `undefined` (or
6690
+ * degenerate). See `group-shape-geometry.ts`'s module doc for why a group
6691
+ * needs two coordinate systems at all.
6692
+ */
6693
+ chOffXEmu?: number;
6694
+ /** See {@link chOffXEmu}. */
6695
+ chOffYEmu?: number;
6696
+ /** See {@link chOffXEmu}. */
6697
+ chExtWidthEmu?: number;
6698
+ /** See {@link chOffXEmu}. */
6699
+ chExtHeightEmu?: number;
6345
6700
  }
6346
6701
  /**
6347
6702
  * A freehand ink / drawing stroke captured with a stylus or mouse.
@@ -6370,6 +6725,24 @@ interface InkPptxElement extends PptxElementBase {
6370
6725
  * variable-width strokes that reflect stylus/pen pressure.
6371
6726
  */
6372
6727
  inkPointPressures?: number[][];
6728
+ /**
6729
+ * Per-path arrays of per-point pen-tilt lean direction (degrees, straight
6730
+ * from `PointerEvent.tiltX` on supporting hardware).
6731
+ *
6732
+ * Each entry corresponds to the path at the same index in `inkPaths`, and
6733
+ * is paired positionally with {@link inkPointTiltY}. Present only when at
6734
+ * least one point in the stroke reported a genuinely non-zero tilt: a
6735
+ * device that never reports tilt (a mouse, or a stylus with no tilt
6736
+ * sensor) leaves both arrays absent, the same way `inkPointPressures` is
6737
+ * omitted when pressure never varies. When present, the renderer converts
6738
+ * the raw `(tiltX, tiltY)` vector into a lean angle + magnitude (see
6739
+ * `pptx-viewer-shared`'s `tiltChannelsFromVectors`) and widens the stroke
6740
+ * perpendicular to the lean direction, approximating a chisel-tip
6741
+ * calligraphy nib.
6742
+ */
6743
+ inkPointTiltX?: number[][];
6744
+ /** Per-path, per-point pen-tilt lean direction (degrees), paired with {@link inkPointTiltX}. */
6745
+ inkPointTiltY?: number[][];
6373
6746
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
6374
6747
  extensionXml?: PptxGraphicFrameExtension[];
6375
6748
  }
@@ -6403,6 +6776,20 @@ interface ContentPartInkStroke {
6403
6776
  * {@link tiltAngles}.
6404
6777
  */
6405
6778
  tiltMagnitudes?: number[];
6779
+ /**
6780
+ * Which InkML channel pair {@link tiltAngles}/{@link tiltMagnitudes} were
6781
+ * decoded from: `'azimuthAltitude'` when the source declared `AZIMUTH`
6782
+ * (optionally paired with `ALTITUDE`); omitted (implying `OTx`/`OTy`, i.e.
6783
+ * `'vector'`) otherwise, including for tilt this library itself captured
6784
+ * from the Draw tool's `PointerEvent.tiltX`/`tiltY`.
6785
+ *
6786
+ * A save that has to rewrite this content part's InkML (see
6787
+ * `inkml-content-part-writer.ts`) uses this to re-declare the SAME channel
6788
+ * pair the file already used, rather than always converting to `OTx`/`OTy`;
6789
+ * the rendered lean is identical either way; only the written channel
6790
+ * NAMES differ.
6791
+ */
6792
+ tiltEncoding?: 'vector' | 'azimuthAltitude';
6406
6793
  }
6407
6794
  /**
6408
6795
  * A content-part element wrapped in `mc:AlternateContent`.
@@ -7059,10 +7446,27 @@ interface PptxNativeAnimation {
7059
7446
  buildLevel?: number;
7060
7447
  /** Group ID linking a `p:bldP` entry to its timing animation node. */
7061
7448
  groupId?: string;
7062
- /** Sound relationship ID to play when animation triggers (`p:stSnd`). */
7449
+ /**
7450
+ * Sound relationship ID to play when animation triggers. Modern PowerPoint
7451
+ * (COM-verified against 2016) writes this as a `p:audio/p:cMediaNode`
7452
+ * sibling of the effect's own `p:childTnLst`, targeting `p:sndTgt` rather
7453
+ * than a shape; the legacy `p:stSnd` form (directly on `p:cTn`) is still
7454
+ * accepted on load for round-trip of older-authored decks, but PowerPoint
7455
+ * itself no longer writes it and does not recognise it back
7456
+ * (`Effect.EffectInformation.SoundEffect` reads empty against it).
7457
+ */
7063
7458
  soundRId?: string;
7064
7459
  /** Resolved sound file path from relationship. */
7065
7460
  soundPath?: string;
7461
+ /**
7462
+ * The embedded sound's `@_name` (from `p:snd`/`p:sndTgt`). For one of
7463
+ * PowerPoint's 19 built-in stock sounds this is the exact upper-case file
7464
+ * name PowerPoint itself writes (e.g. `"CHIMES.WAV"`); see
7465
+ * `pptx-viewer-shared`'s `effect-sound-catalogue.ts`, which matches this
7466
+ * value back to a gallery entry. Absent for a custom sound with no name,
7467
+ * or when unresolved.
7468
+ */
7469
+ soundName?: string;
7066
7470
  /** Whether to stop any currently playing sound (`p:endSnd`). */
7067
7471
  stopSound?: boolean;
7068
7472
  /**
@@ -7227,17 +7631,28 @@ interface PptxNativeAnimation {
7227
7631
  */
7228
7632
  afterEffect?: boolean;
7229
7633
  /**
7230
- * "After animation" end-state behaviour carried over from the matching
7231
- * {@link PptxElementAnimation.afterAnimation} entry for this effect's
7232
- * element. Not populated by the native-timing parser itself (there is no
7233
- * single `p:cTn` attribute for it): `applyAfterAnimationFromEditorList` in
7234
- * `pptx-viewer-shared` merges it in from the editor's per-element
7235
- * animation list before playback, since that is the model the animation
7236
- * panel writes `afterAnimation` into.
7634
+ * "After animation" end-state behaviour: dim-to-colour, hide-after-
7635
+ * animation, or hide-on-next-click. Populated directly by the
7636
+ * native-timing parser (`native-animation-after-effect.ts`) when the
7637
+ * effect's `p:cTn/p:subTnLst` carries PowerPoint's genuine after-effect
7638
+ * shape, so a real-world deck's build shows up here even with no
7639
+ * `pptx:editorMeta`. `applyAfterAnimationFromEditorList` in
7640
+ * `pptx-viewer-shared` overrides this from the matching
7641
+ * {@link PptxElementAnimation.afterAnimation} entry when the editor's
7642
+ * per-element animation list has one (the model the animation panel
7643
+ * writes `afterAnimation` into), so an edit through our own UI always wins.
7237
7644
  */
7238
7645
  afterAnimationAction?: PptxAfterAnimationAction;
7239
- /** Dim-to color hex, present when {@link afterAnimationAction} is `dimToColor`. */
7646
+ /** Dim-to color hex, present when {@link afterAnimationAction} is `dimToColor` AND the dim target is an already-resolved `a:srgbClr`. */
7240
7647
  afterAnimationColor?: string;
7648
+ /**
7649
+ * The typed theme reference when a `dimToColor` target is an `a:schemeClr`
7650
+ * (e.g. `accent2`) instead of `a:srgbClr`: this parse layer has no theme to
7651
+ * resolve it to sRGB with (see {@link afterAnimationColor}'s doc), so a
7652
+ * playback consumer resolves this against the deck's theme colour map.
7653
+ * Mutually exclusive with {@link afterAnimationColor} being set.
7654
+ */
7655
+ afterAnimationColorRef?: PptxThemeColorRef;
7241
7656
  /**
7242
7657
  * Parsed `p:animEffect` filter descriptor. `presetId`/`presetClass` remain
7243
7658
  * the primary effect selector (see `resolveEffect` in `pptx-viewer-shared`);
@@ -7369,13 +7784,46 @@ interface PptxAnimationKeyframe {
7369
7784
  * fidelity; consumers may use it to drive computed animation values.
7370
7785
  */
7371
7786
  fmla?: string;
7787
+ /**
7788
+ * The typed theme reference when a `p:val/p:clrVal` stop is an
7789
+ * `a:schemeClr` (e.g. `accent1`), including any `tint`/`shade`/`lumMod`/
7790
+ * `lumOff`/`alpha` children. {@link value} keeps the bare scheme name for
7791
+ * round-trip; a playback consumer needs this ref (resolved against the
7792
+ * deck's theme colour map) to turn the stop into a real CSS colour, which
7793
+ * the bare name alone cannot do. Absent for an `a:srgbClr` stop, whose
7794
+ * {@link value} is already a resolved `#rrggbb` hex string.
7795
+ */
7796
+ colorRef?: PptxThemeColorRef;
7372
7797
  }
7373
7798
  /** One generic `p:anim` behaviour inside a composed PowerPoint effect. */
7374
7799
  interface PptxAttributeAnimation {
7375
7800
  /** Lowercased target attribute from `p:attrNameLst`. */
7376
7801
  attrName: string;
7377
- /** Authored value stops from this behaviour's `p:tavLst`. */
7802
+ /**
7803
+ * Authored value stops from this behaviour's `p:tavLst`. Empty when the
7804
+ * behaviour instead uses the simpler `from`/`to`/`by` attribute form (see
7805
+ * below); at least one of `keyframes`, `from`/`to`, or `by` is present.
7806
+ */
7378
7807
  keyframes: PptxAnimationKeyframe[];
7808
+ /**
7809
+ * `p:anim/@_from` (a formula string, ECMA-376 S19.5.4 CT_TLAnimateBehavior):
7810
+ * the absolute starting value, used instead of `p:tavLst` when the
7811
+ * behaviour only has two endpoints. PowerPoint writes this form for some
7812
+ * built-in presets (e.g. "Grow And Turn"'s `ppt_x` fly-in): a bare
7813
+ * `p:anim from="..." to="..."` with no `p:tavLst` child at all. See
7814
+ * `animation-ppt-formula-ground-truth.md` in `pptx-viewer-shared` for the
7815
+ * real-PowerPoint sample this was found in.
7816
+ */
7817
+ from?: string;
7818
+ /** `p:anim/@_to`: the absolute ending value. See {@link from}. */
7819
+ to?: string;
7820
+ /**
7821
+ * `p:anim/@_by`: a DELTA formula added to wherever the attribute already
7822
+ * stands (as opposed to `from`/`to`'s absolute values), typically paired
7823
+ * with `p:cBhvr/@_additive="sum"` so it composites with a sibling
7824
+ * behaviour driving the same attribute instead of replacing it.
7825
+ */
7826
+ by?: string;
7379
7827
  /** Duration from this behaviour's nested `p:cTn/@dur`. */
7380
7828
  durationMs?: number;
7381
7829
  /** Start offset from this behaviour's nested `p:stCondLst`. */
@@ -7384,8 +7832,11 @@ interface PptxAttributeAnimation {
7384
7832
  * Interpolation mode from this behaviour's own `@_calcmode`
7385
7833
  * (ST_TLAnimateBehaviorCalcMode, ECMA-376 S19.5.2): `discrete` snaps to
7386
7834
  * each `p:tav` stop with no interpolation, `lin` (the OOXML default)
7387
- * interpolates linearly, `fmla` evaluates `p:tav/@fmla` (not consulted at
7388
- * playback here; formulas are round-tripped only). Absent means `lin`.
7835
+ * interpolates linearly. `fmla` as the WHOLE behaviour's calc mode has
7836
+ * never been observed in a real PowerPoint file and is not consulted at
7837
+ * playback; what PowerPoint actually writes is `calcmode="lin"` with a
7838
+ * per-stop `p:tav/@fmla` (see {@link PptxAnimationKeyframe.fmla}), which
7839
+ * IS consulted regardless of this field's value. Absent means `lin`.
7389
7840
  */
7390
7841
  calcMode?: 'discrete' | 'lin' | 'fmla';
7391
7842
  }
@@ -7411,16 +7862,31 @@ interface PptxColorAnimation {
7411
7862
  * companion to `@dir` for HSL colour-space animations.
7412
7863
  */
7413
7864
  path?: string;
7414
- /** Starting color as hex string. */
7865
+ /** Starting color as hex string, or the bare scheme name (e.g. `accent1`) for a theme colour; see {@link fromColorRef}. */
7415
7866
  fromColor?: string;
7416
- /** Ending color as hex string. */
7867
+ /** Ending color as hex string, or the bare scheme name; see {@link toColorRef}. */
7417
7868
  toColor?: string;
7418
7869
  /**
7419
- * Color delta (for "by" animations) as hex string. For HSL colour-space
7420
- * animations this retains the historical byte-packed compatibility value;
7421
- * consumers should prefer {@link hslDelta}, which preserves signed values.
7870
+ * Color delta (for "by" animations) as hex string, or the bare scheme name;
7871
+ * see {@link byColorRef}. For HSL colour-space animations this retains the
7872
+ * historical byte-packed compatibility value; consumers should prefer
7873
+ * {@link hslDelta}, which preserves signed values.
7422
7874
  */
7423
7875
  byColor?: string;
7876
+ /**
7877
+ * The typed theme reference when {@link fromColor} is an `a:schemeClr`
7878
+ * (including `tint`/`shade`/`lumMod`/`lumOff`/`alpha`), so playback can
7879
+ * resolve it against the deck's theme colour map. Absent when `fromColor`
7880
+ * is already a resolved `#rrggbb` hex (an `a:srgbClr` stop).
7881
+ */
7882
+ fromColorRef?: PptxThemeColorRef;
7883
+ /** The typed theme reference for {@link toColor}; see {@link fromColorRef}. */
7884
+ toColorRef?: PptxThemeColorRef;
7885
+ /**
7886
+ * The typed theme reference for {@link byColor} (RGB colour space only; an
7887
+ * HSL `by` is a signed delta, never a theme colour). See {@link fromColorRef}.
7888
+ */
7889
+ byColorRef?: PptxThemeColorRef;
7424
7890
  /**
7425
7891
  * Typed HSL delta from `p:by/p:hsl`. This preserves signed values and their
7426
7892
  * OOXML units without forcing them through the legacy byte-packed `byColor`
@@ -7560,10 +8026,24 @@ interface PptxElementAnimation {
7560
8026
  motionPathRotationCenterX?: number;
7561
8027
  /** Motion-path rotation centre Y in slide percentage units (`p:rCtr/@y`). */
7562
8028
  motionPathRotationCenterY?: number;
7563
- /** Sound relationship ID to play when animation triggers (`p:stSnd`). */
8029
+ /**
8030
+ * Sound relationship ID to play when animation triggers. Written on save
8031
+ * as a `p:audio/p:cMediaNode` sibling of the effect's own `p:childTnLst`
8032
+ * (see `PptxNativeAnimation.soundRId` for the COM-verified detail).
8033
+ */
7564
8034
  soundRId?: string;
7565
8035
  /** Resolved sound file path from relationship. */
7566
8036
  soundPath?: string;
8037
+ /**
8038
+ * The `@_name` to write on the embedded sound (`p:sndTgt`). For a stock
8039
+ * gallery pick this is the exact PowerPoint file name (e.g.
8040
+ * `"CHIMES.WAV"`), which is what makes PowerPoint itself recognise the
8041
+ * sound as that built-in entry when it reopens the saved deck (there is no
8042
+ * separate "built-in" flag anywhere in the schema). Set by
8043
+ * `pptx-viewer-shared`'s `setEffectSound` when the pick carries a
8044
+ * `soundName`; absent for a custom file with no meaningful name.
8045
+ */
8046
+ soundName?: string;
7567
8047
  /** Whether to stop any currently playing sound (`p:endSnd`). */
7568
8048
  stopSound?: boolean;
7569
8049
  /**
@@ -7578,7 +8058,9 @@ interface PptxElementAnimation {
7578
8058
  /**
7579
8059
  * Display name for the chosen sound (e.g. the uploaded file's name),
7580
8060
  * shown by the authoring UI's sound picker. Purely cosmetic; has no
7581
- * OOXML equivalent and is not required for playback.
8061
+ * OOXML equivalent and is not required for playback. For a stock gallery
8062
+ * pick, the UI derives its label from {@link soundName} via the catalogue
8063
+ * instead of this field.
7582
8064
  */
7583
8065
  soundFileName?: string;
7584
8066
  /**
@@ -8633,13 +9115,13 @@ interface PptxSlide {
8633
9115
  backgroundPattern?: PptxSlideBackgroundPattern;
8634
9116
  /**
8635
9117
  * `<p:bgPr/@shadeToTitle>`: boolean flag instructing the renderer to
8636
- * shade the background gradient toward the title placeholder's text
8637
- * colour. Parsed and round-tripped here on the core model; the actual
8638
- * visual effect is applied by `pptx-viewer-shared`'s
9118
+ * anchor the background gradient on the title placeholder as a
9119
+ * rectangular path gradient (COM-measured against real PowerPoint;
9120
+ * it does NOT recolour toward the title's text colour, despite the
9121
+ * attribute's name). Parsed and round-tripped here on the core model;
9122
+ * the actual visual effect is applied by `pptx-viewer-shared`'s
8639
9123
  * `getSlideBackgroundStyle` (see `render/background-shade-to-title.ts`),
8640
- * consumed by all five bindings, not by core itself. That module's
8641
- * docstring explains the approximation: no published ECMA-376 or
8642
- * MS-ODRAWXML text documents the exact legacy blend. Legacy PowerPoint
9124
+ * consumed by all five bindings, not by core itself. Legacy PowerPoint
8643
9125
  * 97-2003 hint, not observed in any real-world corpus file this project
8644
9126
  * has collected and not settable from any modern PowerPoint UI; see
8645
9127
  * `docs/guide/limitations.md`.
@@ -9926,7 +10408,7 @@ interface PptxHandlerLoadOptions {
9926
10408
  allowExternalImages?: boolean;
9927
10409
  }
9928
10410
  /** Output format for the save pipeline. */
9929
- type PptxSaveFormat = 'pptx' | 'ppsx' | 'pptm';
10411
+ type PptxSaveFormat = 'pptx' | 'ppsx' | 'pptm' | 'ppt';
9930
10412
  interface PptxHandlerSaveOptions {
9931
10413
  headerFooter?: PptxHeaderFooter;
9932
10414
  presentationProperties?: PptxPresentationProperties;
@@ -10022,8 +10504,23 @@ interface PptxHandlerSaveOptions {
10022
10504
  * - `'pptx'` (default): Standard presentation.
10023
10505
  * - `'ppsx'`: Slide-show file (opens in presentation mode).
10024
10506
  * - `'pptm'`: Macro-enabled presentation (requires VBA data).
10507
+ * - `'ppt'`: Legacy binary PowerPoint 97-2003 presentation. Bypasses the
10508
+ * OOXML ZIP pipeline entirely; see `PptxHandlerRuntimeSaveLegacyPpt`.
10509
+ * Elements with no binary equivalent (charts, SmartArt, media, OLE, ink,
10510
+ * 3D models) are degraded to a rasterised preview picture or a labelled
10511
+ * placeholder, each reported via a `scope: 'save'`-adjacent
10512
+ * `PptxCompatibilityWarning`.
10025
10513
  */
10026
10514
  outputFormat?: PptxSaveFormat;
10515
+ /**
10516
+ * Password for RC4 CryptoAPI encryption of a `'ppt'`-format save. Ignored
10517
+ * for every other {@link outputFormat}; encrypting a `.pptx`/`.ppsx`/`.pptm`
10518
+ * save uses {@link IPptxHandlerRuntime.saveEncrypted}'s separate AES/Agile
10519
+ * OLE2 wrapping instead, since the legacy binary format's own encryption
10520
+ * scheme is embedded directly in the `.ppt` stream rather than wrapping an
10521
+ * already-produced package.
10522
+ */
10523
+ pptPassword?: string;
10027
10524
  /**
10028
10525
  * Embedded fonts to write back (or add) to the saved PPTX.
10029
10526
  *