pptx-react-viewer 3.8.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/{AiChatPanel-XLQM4BQJ.js → AiChatPanel-3A42W7RW.js} +25 -25
  3. package/dist/AiChatPanel-3A42W7RW.js.br +0 -0
  4. package/dist/AiChatPanel-3A42W7RW.js.gz +0 -0
  5. package/dist/{AiChatPanel-A5DCEHTO.mjs → AiChatPanel-II6VOOAL.mjs} +4 -4
  6. package/dist/AiChatPanel-II6VOOAL.mjs.br +0 -0
  7. package/dist/AiChatPanel-II6VOOAL.mjs.gz +0 -0
  8. package/dist/{Area3DChartScene-5CMEMIBI.mjs → Area3DChartScene-JM3CQ3WQ.mjs} +21 -4
  9. package/dist/Area3DChartScene-JM3CQ3WQ.mjs.br +0 -0
  10. package/dist/Area3DChartScene-JM3CQ3WQ.mjs.gz +0 -0
  11. package/dist/{Area3DChartScene-RZ3V3WOR.js → Area3DChartScene-XJK4ZA4R.js} +21 -4
  12. package/dist/Area3DChartScene-XJK4ZA4R.js.br +0 -0
  13. package/dist/Area3DChartScene-XJK4ZA4R.js.gz +0 -0
  14. package/dist/{Bar3DChartScene-KHCQ6TEC.js → Bar3DChartScene-RGRZY5P6.js} +21 -4
  15. package/dist/Bar3DChartScene-RGRZY5P6.js.br +0 -0
  16. package/dist/Bar3DChartScene-RGRZY5P6.js.gz +0 -0
  17. package/dist/{Bar3DChartScene-H3MYUJKV.mjs → Bar3DChartScene-VNFWI2QG.mjs} +21 -4
  18. package/dist/Bar3DChartScene-VNFWI2QG.mjs.br +0 -0
  19. package/dist/Bar3DChartScene-VNFWI2QG.mjs.gz +0 -0
  20. package/dist/{Line3DChartScene-YFRPJHDX.mjs → Line3DChartScene-GXOWGIFJ.mjs} +21 -4
  21. package/dist/Line3DChartScene-GXOWGIFJ.mjs.br +0 -0
  22. package/dist/Line3DChartScene-GXOWGIFJ.mjs.gz +0 -0
  23. package/dist/{Line3DChartScene-QEACF3U3.js → Line3DChartScene-MEY42DBF.js} +21 -4
  24. package/dist/Line3DChartScene-MEY42DBF.js.br +0 -0
  25. package/dist/Line3DChartScene-MEY42DBF.js.gz +0 -0
  26. package/dist/{Model3DScene-QQWKGJ3T.js → Model3DScene-MWXTGHDM.js} +2 -2
  27. package/dist/Model3DScene-MWXTGHDM.js.br +0 -0
  28. package/dist/Model3DScene-MWXTGHDM.js.gz +0 -0
  29. package/dist/{Model3DScene-O24KP723.mjs → Model3DScene-WJ3MMIZH.mjs} +1 -1
  30. package/dist/Model3DScene-WJ3MMIZH.mjs.br +0 -0
  31. package/dist/Model3DScene-WJ3MMIZH.mjs.gz +0 -0
  32. package/dist/{PieChart3DScene-L3MHKQHW.js → PieChart3DScene-FJJGOQIS.js} +15 -4
  33. package/dist/PieChart3DScene-FJJGOQIS.js.br +0 -0
  34. package/dist/PieChart3DScene-FJJGOQIS.js.gz +0 -0
  35. package/dist/{PieChart3DScene-CI6CW22C.mjs → PieChart3DScene-WXJEDYMK.mjs} +15 -4
  36. package/dist/PieChart3DScene-WXJEDYMK.mjs.br +0 -0
  37. package/dist/PieChart3DScene-WXJEDYMK.mjs.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-IKPE2SVE.mjs} +19 -4
  45. package/dist/SurfaceChart3DScene-IKPE2SVE.mjs.br +0 -0
  46. package/dist/SurfaceChart3DScene-IKPE2SVE.mjs.gz +0 -0
  47. package/dist/{SurfaceChart3DScene-5IER6VFW.js → SurfaceChart3DScene-VDK3F224.js} +19 -4
  48. package/dist/SurfaceChart3DScene-VDK3F224.js.br +0 -0
  49. package/dist/SurfaceChart3DScene-VDK3F224.js.gz +0 -0
  50. package/dist/{chunk-4222CHFH.js → chunk-3NIJ5HIZ.js} +3187 -2514
  51. package/dist/chunk-3NIJ5HIZ.js.br +0 -0
  52. package/dist/chunk-3NIJ5HIZ.js.gz +0 -0
  53. package/dist/{chunk-RNP5HP4L.mjs → chunk-3Y63XPIN.mjs} +1 -1
  54. package/dist/chunk-3Y63XPIN.mjs.br +0 -0
  55. package/dist/{chunk-RNP5HP4L.mjs.gz → chunk-3Y63XPIN.mjs.gz} +0 -0
  56. package/dist/{chunk-DE3S3UHX.js → chunk-5CPGDXD6.js} +518 -442
  57. package/dist/chunk-5CPGDXD6.js.br +0 -0
  58. package/dist/chunk-5CPGDXD6.js.gz +0 -0
  59. package/dist/{chunk-PFPKBNNZ.mjs → chunk-76Z3X6JX.mjs} +1189 -516
  60. package/dist/chunk-76Z3X6JX.mjs.br +0 -0
  61. package/dist/chunk-76Z3X6JX.mjs.gz +0 -0
  62. package/dist/chunk-DNR6CH6I.js +30 -0
  63. package/dist/chunk-DNR6CH6I.js.br +0 -0
  64. package/dist/chunk-DNR6CH6I.js.gz +0 -0
  65. package/dist/{chunk-SN5EUDIT.js → chunk-G3JPCRKN.js} +13644 -7350
  66. package/dist/chunk-G3JPCRKN.js.br +0 -0
  67. package/dist/chunk-G3JPCRKN.js.gz +0 -0
  68. package/dist/{chunk-FRZIBZTE.mjs → chunk-JBSAKP4Z.mjs} +15 -0
  69. package/dist/chunk-JBSAKP4Z.mjs.br +0 -0
  70. package/dist/{chunk-FRZIBZTE.mjs.gz → chunk-JBSAKP4Z.mjs.gz} +0 -0
  71. package/dist/{chunk-F5NPGNMA.js → chunk-K6Q6KLA6.js} +5 -5
  72. package/dist/chunk-K6Q6KLA6.js.br +0 -0
  73. package/dist/chunk-K6Q6KLA6.js.gz +0 -0
  74. package/dist/{chunk-QWA5YEIZ.js → chunk-LBJAVP3H.js} +194 -178
  75. package/dist/chunk-LBJAVP3H.js.br +0 -0
  76. package/dist/chunk-LBJAVP3H.js.gz +0 -0
  77. package/dist/{chunk-RHWQKZLB.mjs → chunk-NTWFXLZX.mjs} +23 -7
  78. package/dist/chunk-NTWFXLZX.mjs.br +0 -0
  79. package/dist/chunk-NTWFXLZX.mjs.gz +0 -0
  80. package/dist/{chunk-UPJW34YG.mjs → chunk-PCCM7NVY.mjs} +85 -9
  81. package/dist/chunk-PCCM7NVY.mjs.br +0 -0
  82. package/dist/chunk-PCCM7NVY.mjs.gz +0 -0
  83. package/dist/chunk-T6GFCLSM.mjs +27 -0
  84. package/dist/chunk-T6GFCLSM.mjs.br +4 -0
  85. package/dist/chunk-T6GFCLSM.mjs.gz +0 -0
  86. package/dist/{chunk-L3ZIBQEB.js → chunk-TEVGDXVW.js} +15 -0
  87. package/dist/chunk-TEVGDXVW.js.br +0 -0
  88. package/dist/{chunk-L3ZIBQEB.js.gz → chunk-TEVGDXVW.js.gz} +0 -0
  89. package/dist/{chunk-6IMB5DNJ.mjs → chunk-VQX7G75Z.mjs} +13621 -7340
  90. package/dist/chunk-VQX7G75Z.mjs.br +0 -0
  91. package/dist/chunk-VQX7G75Z.mjs.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.d.ts +388 -80
  99. package/dist/index.js +47 -47
  100. package/dist/index.js.br +0 -0
  101. package/dist/index.js.gz +0 -0
  102. package/dist/index.mjs +6 -6
  103. package/dist/index.mjs.br +0 -0
  104. package/dist/index.mjs.gz +0 -0
  105. package/dist/internals.d.ts +445 -81
  106. package/dist/internals.d.ts.map +1 -1
  107. package/dist/internals.js +79 -79
  108. package/dist/internals.js.br +0 -0
  109. package/dist/internals.js.gz +0 -0
  110. package/dist/internals.mjs +4 -4
  111. package/dist/internals.mjs.br +0 -0
  112. package/dist/internals.mjs.gz +0 -0
  113. package/dist/pptx-viewer.css +1 -1
  114. package/dist/pptx-viewer.css.br +0 -0
  115. package/dist/pptx-viewer.css.gz +0 -0
  116. package/dist/viewer/index.d.ts +338 -43
  117. package/dist/viewer/index.js +27 -27
  118. package/dist/viewer/index.js.br +0 -0
  119. package/dist/viewer/index.js.gz +0 -0
  120. package/dist/viewer/index.mjs +6 -6
  121. package/dist/viewer/index.mjs.br +0 -0
  122. package/dist/viewer/index.mjs.gz +0 -0
  123. package/package.json +2 -2
  124. package/dist/AiChatPanel-A5DCEHTO.mjs.br +0 -0
  125. package/dist/AiChatPanel-A5DCEHTO.mjs.gz +0 -0
  126. package/dist/AiChatPanel-XLQM4BQJ.js.br +0 -0
  127. package/dist/AiChatPanel-XLQM4BQJ.js.gz +0 -0
  128. package/dist/Area3DChartScene-5CMEMIBI.mjs.br +0 -0
  129. package/dist/Area3DChartScene-5CMEMIBI.mjs.gz +0 -0
  130. package/dist/Area3DChartScene-RZ3V3WOR.js.br +0 -0
  131. package/dist/Area3DChartScene-RZ3V3WOR.js.gz +0 -0
  132. package/dist/Bar3DChartScene-H3MYUJKV.mjs.br +0 -0
  133. package/dist/Bar3DChartScene-H3MYUJKV.mjs.gz +0 -0
  134. package/dist/Bar3DChartScene-KHCQ6TEC.js.br +0 -0
  135. package/dist/Bar3DChartScene-KHCQ6TEC.js.gz +0 -0
  136. package/dist/Line3DChartScene-QEACF3U3.js.br +0 -0
  137. package/dist/Line3DChartScene-QEACF3U3.js.gz +0 -0
  138. package/dist/Line3DChartScene-YFRPJHDX.mjs.br +0 -0
  139. package/dist/Line3DChartScene-YFRPJHDX.mjs.gz +0 -0
  140. package/dist/Model3DScene-O24KP723.mjs.br +0 -0
  141. package/dist/Model3DScene-O24KP723.mjs.gz +0 -0
  142. package/dist/Model3DScene-QQWKGJ3T.js.br +0 -0
  143. package/dist/Model3DScene-QQWKGJ3T.js.gz +0 -0
  144. package/dist/PieChart3DScene-CI6CW22C.mjs.br +0 -0
  145. package/dist/PieChart3DScene-CI6CW22C.mjs.gz +0 -0
  146. package/dist/PieChart3DScene-L3MHKQHW.js.br +0 -0
  147. package/dist/PieChart3DScene-L3MHKQHW.js.gz +0 -0
  148. package/dist/SmartArt3DScene-XCFVGCXE.mjs.br +0 -0
  149. package/dist/SmartArt3DScene-XCFVGCXE.mjs.gz +0 -0
  150. package/dist/SmartArt3DScene-ZO3KFDI2.js.br +0 -0
  151. package/dist/SmartArt3DScene-ZO3KFDI2.js.gz +0 -0
  152. package/dist/SurfaceChart3DScene-5IER6VFW.js.br +0 -0
  153. package/dist/SurfaceChart3DScene-5IER6VFW.js.gz +0 -0
  154. package/dist/SurfaceChart3DScene-JUXRC3K2.mjs.br +0 -0
  155. package/dist/SurfaceChart3DScene-JUXRC3K2.mjs.gz +0 -0
  156. package/dist/chunk-4222CHFH.js.br +0 -0
  157. package/dist/chunk-4222CHFH.js.gz +0 -0
  158. package/dist/chunk-6IMB5DNJ.mjs.br +0 -0
  159. package/dist/chunk-6IMB5DNJ.mjs.gz +0 -0
  160. package/dist/chunk-DE3S3UHX.js.br +0 -0
  161. package/dist/chunk-DE3S3UHX.js.gz +0 -0
  162. package/dist/chunk-F5NPGNMA.js.br +0 -0
  163. package/dist/chunk-F5NPGNMA.js.gz +0 -0
  164. package/dist/chunk-FRZIBZTE.mjs.br +0 -0
  165. package/dist/chunk-L3ZIBQEB.js.br +0 -0
  166. package/dist/chunk-PFPKBNNZ.mjs.br +0 -0
  167. package/dist/chunk-PFPKBNNZ.mjs.gz +0 -0
  168. package/dist/chunk-QWA5YEIZ.js.br +0 -0
  169. package/dist/chunk-QWA5YEIZ.js.gz +0 -0
  170. package/dist/chunk-RHWQKZLB.mjs.br +0 -0
  171. package/dist/chunk-RHWQKZLB.mjs.gz +0 -0
  172. package/dist/chunk-RNP5HP4L.mjs.br +0 -0
  173. package/dist/chunk-SN5EUDIT.js.br +0 -0
  174. package/dist/chunk-SN5EUDIT.js.gz +0 -0
  175. package/dist/chunk-UPJW34YG.mjs.br +0 -0
  176. package/dist/chunk-UPJW34YG.mjs.gz +0 -0
@@ -2145,6 +2145,29 @@ interface PptxElementBase {
2145
2145
  y: number;
2146
2146
  width: number;
2147
2147
  height: number;
2148
+ /**
2149
+ * The exact EMU integer `x` was parsed from (the `a:off/@_x` this
2150
+ * element's own `a:xfrm` carried on load), when the parser could resolve
2151
+ * one. `x` itself is always `Math.round(xEmu / EMU_PER_PX)` at parse
2152
+ * time, but that rounding is lossy: re-deriving EMU from `x` on save
2153
+ * (`Math.round(x * EMU_PER_PX)`) can drift from the original value by up
2154
+ * to half a pixel's worth of EMU on every load/save cycle even when
2155
+ * nothing touched this element. Kept alongside `x` (not instead of it) so
2156
+ * every consumer that only cares about on-screen position is unaffected;
2157
+ * only the save-side xfrm writer (`resolveXfrmEmu` in
2158
+ * `xfrm-emu-resolution.ts`) reads this, and only when `x` still equals
2159
+ * `Math.round(xEmu / EMU_PER_PX)` (i.e. nothing moved this element since
2160
+ * load) does it re-emit `xEmu` verbatim instead of re-quantizing `x`.
2161
+ * `undefined` for an SDK-created element or one whose transform could not
2162
+ * be resolved to a usable `a:off` on load.
2163
+ */
2164
+ xEmu?: number;
2165
+ /** The exact EMU integer `y` was parsed from (`a:off/@_y`). See {@link xEmu}. */
2166
+ yEmu?: number;
2167
+ /** The exact EMU integer `width` was parsed from (`a:ext/@_cx`). See {@link xEmu}. */
2168
+ widthEmu?: number;
2169
+ /** The exact EMU integer `height` was parsed from (`a:ext/@_cy`). See {@link xEmu}. */
2170
+ heightEmu?: number;
2148
2171
  rotation?: number;
2149
2172
  /** Skew along the X axis in degrees (parsed from `@_skewX` in 1/60000ths of a degree). */
2150
2173
  skewX?: number;
@@ -2664,6 +2687,21 @@ interface PptxChartUserShapeGroupTransform {
2664
2687
  cx: number;
2665
2688
  cy: number;
2666
2689
  };
2690
+ /**
2691
+ * The group's own rotation in degrees (`a:xfrm/@rot`, stored in 60,000ths
2692
+ * of a degree), when present. Rotates the whole group, and everything
2693
+ * grouped inside it, as a rigid body about the CENTRE of the group's own
2694
+ * box ({@link off}/{@link ext}); see `flattenChartUserShapes` in
2695
+ * `chart-user-shapes-parser.ts` for how this composes onto each contained
2696
+ * leaf's own {@link PptxChartUserShapeGroupChild.rotation}. Verified
2697
+ * against real PowerPoint (COM): a `cdr:grpSp`'s `cdr:grpSpPr/a:xfrm` does
2698
+ * carry `rot` the same way an ordinary shape's does.
2699
+ */
2700
+ rotation?: number;
2701
+ /** The group's own horizontal flip (`a:xfrm/@flipH`), when present; composes onto children by XOR, see {@link rotation}'s doc. */
2702
+ flipH?: boolean;
2703
+ /** The group's own vertical flip (`a:xfrm/@flipV`), when present; composes onto children by XOR, see {@link rotation}'s doc. */
2704
+ flipV?: boolean;
2667
2705
  }
2668
2706
  /**
2669
2707
  * One shape grouped inside a `cdr:grpSp` (or a nested `cdr:grpSp` itself).
@@ -2695,6 +2733,23 @@ interface PptxChartUserShapeGroupChild {
2695
2733
  strokeWidth?: number;
2696
2734
  /** Text paragraphs of the shape's `txBody`, when present. */
2697
2735
  paragraphs?: PptxChartUserShapeParagraph[];
2736
+ /**
2737
+ * A `pic` child's alt text (`cdr:nvPicPr/cdr:cNvPr/@descr`), when present.
2738
+ * Editable independently of {@link rawXml}'s otherwise-verbatim content:
2739
+ * the serializer patches only this attribute onto the cloned raw node.
2740
+ */
2741
+ altText?: string;
2742
+ /**
2743
+ * This child's OWN rotation in degrees (`a:xfrm/@rot`), when present.
2744
+ * Composes with every enclosing group's own
2745
+ * {@link PptxChartUserShapeGroupTransform.rotation} (added) to produce the
2746
+ * leaf's final on-screen rotation; see `flattenChartUserShapes`.
2747
+ */
2748
+ rotation?: number;
2749
+ /** This child's OWN horizontal flip (`a:xfrm/@flipH`); composes with an ancestor group's flip by XOR. */
2750
+ flipH?: boolean;
2751
+ /** This child's OWN vertical flip (`a:xfrm/@flipV`); composes with an ancestor group's flip by XOR. */
2752
+ flipV?: boolean;
2698
2753
  /**
2699
2754
  * Verbatim source XML of a `pic`/`graphicFrame` child, or of this node
2700
2755
  * itself when `kind === 'grpSp'` and the nested group is untouched since
@@ -2753,6 +2808,29 @@ interface PptxChartUserShape {
2753
2808
  strokeWidth?: number;
2754
2809
  /** Text paragraphs of the shape's `txBody`, when present. */
2755
2810
  paragraphs?: PptxChartUserShapeParagraph[];
2811
+ /**
2812
+ * A `pic` anchor's alt text (`cdr:nvPicPr/cdr:cNvPr/@descr`), when
2813
+ * present. Editable independently of {@link rawXml}'s otherwise-verbatim
2814
+ * content: the serializer patches only this attribute onto the cloned
2815
+ * raw node, so a picture's blip and other markup are untouched.
2816
+ */
2817
+ altText?: string;
2818
+ /**
2819
+ * This shape's OWN rotation in degrees (`a:xfrm/@rot`, on `spPr/a:xfrm`
2820
+ * for `sp`/`cxnSp`/`pic`, or directly on a top-level `graphicFrame`'s own
2821
+ * `a:xfrm`), when present. A top-level anchor's position/size is governed
2822
+ * by {@link from}/{@link to}/{@link ext}, never by this `a:xfrm`'s own
2823
+ * `off`/`ext` (see {@link rawXml}'s doc), but `rot`/`flipH`/`flipV` on that
2824
+ * same `a:xfrm` DO apply visually: verified against real PowerPoint (COM),
2825
+ * which writes e.g. `<a:xfrm rot="1800000"><a:off .../><a:ext .../></a:xfrm>`
2826
+ * on a rotated overlay shape's `spPr`, with the `off`/`ext` values
2827
+ * unrelated to the anchor's own `cdr:from`/`cdr:to`.
2828
+ */
2829
+ rotation?: number;
2830
+ /** This shape's OWN horizontal flip (`a:xfrm/@flipH`); see {@link rotation}'s doc. */
2831
+ flipH?: boolean;
2832
+ /** This shape's OWN vertical flip (`a:xfrm/@flipV`); see {@link rotation}'s doc. */
2833
+ flipV?: boolean;
2756
2834
  /**
2757
2835
  * Verbatim source XML of a `pic` or `graphicFrame` anchor child (the
2758
2836
  * `cdr:pic` / `cdr:graphicFrame` node itself, not the enclosing anchor),
@@ -2782,7 +2860,7 @@ interface PptxChartUserShape {
2782
2860
  * @example
2783
2861
  * ```ts
2784
2862
  * const type: PptxChartType = "bar";
2785
- * // => "bar" one of: "bar" | "line" | "pie" | "doughnut" | "area" | "scatter" | …
2863
+ * // => "bar": one of: "bar" | "line" | "pie" | "doughnut" | "area" | "scatter" | …
2786
2864
  * ```
2787
2865
  */
2788
2866
  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';
@@ -2817,7 +2895,7 @@ type PptxBar3DShape = 'box' | 'cone' | 'coneToMax' | 'cylinder' | 'pyramid' | 'p
2817
2895
  * @example
2818
2896
  * ```ts
2819
2897
  * const type: PptxChartTrendlineType = "linear";
2820
- * // => "linear" one of: "linear" | "exponential" | "logarithmic" | "polynomial" | "power" | "movingAvg"
2898
+ * // => "linear": one of: "linear" | "exponential" | "logarithmic" | "polynomial" | "power" | "movingAvg"
2821
2899
  * ```
2822
2900
  */
2823
2901
  type PptxChartTrendlineType = 'linear' | 'exponential' | 'logarithmic' | 'polynomial' | 'power' | 'movingAvg';
@@ -2868,7 +2946,7 @@ type PptxChartErrBarType = 'both' | 'minus' | 'plus';
2868
2946
  * @example
2869
2947
  * ```ts
2870
2948
  * const valType: PptxChartErrValType = "percentage";
2871
- * // => "percentage" one of: "cust" | "fixedVal" | "percentage" | "stdDev" | "stdErr"
2949
+ * // => "percentage": one of: "cust" | "fixedVal" | "percentage" | "stdDev" | "stdErr"
2872
2950
  * ```
2873
2951
  */
2874
2952
  type PptxChartErrValType = 'cust' | 'fixedVal' | 'percentage' | 'stdDev' | 'stdErr';
@@ -2987,6 +3065,14 @@ interface PptxChartDataPoint {
2987
3065
  bubble3D?: boolean;
2988
3066
  /** Per-point picture-fill flags (`c:dPt/c:pictureOptions`). */
2989
3067
  picture?: PptxChartDataPointPicture;
3068
+ /**
3069
+ * This point's identity GUID (`c:dPt/c:extLst/c:ext/c16:uniqueId/@val`,
3070
+ * the Office 2014+ `{C3380CC4-5D6E-409C-BE32-E72D297353CC}` chart
3071
+ * extension), read-only here: an edited point keeps its existing
3072
+ * `c:extLst` as passthrough (see `chart-datapoint-serializer.ts`), so this
3073
+ * field exists for introspection rather than round-trip.
3074
+ */
3075
+ uniqueId?: string;
2990
3076
  }
2991
3077
  /** Schema values accepted by `c:dLblPos`. */
2992
3078
  type PptxChartDataLabelPosition = 'bestFit' | 'b' | 'ctr' | 'inBase' | 'inEnd' | 'l' | 'outEnd' | 'r' | 't';
@@ -3063,7 +3149,7 @@ interface PptxChartAxisFormatting extends PptxChartAxisLabelFormatting {
3063
3149
  axPos?: 'b' | 'l' | 'r' | 't';
3064
3150
  /** Unique axis identifier (c:axId/@val) used to link series to axes. */
3065
3151
  axisId?: number;
3066
- /** Cross-axis identifier the axis this axis crosses. */
3152
+ /** Cross-axis identifier: the axis this axis crosses. */
3067
3153
  crossAxisId?: number;
3068
3154
  /** Automatic crossing mode (`c:crosses`). Mutually exclusive with `crossesAt`. */
3069
3155
  crosses?: 'autoZero' | 'min' | 'max';
@@ -3315,6 +3401,54 @@ interface PptxChartSeries {
3315
3401
  waterfallOptions?: PptxChartWaterfallOptions;
3316
3402
  regionMapOptions?: PptxChartRegionMapOptions;
3317
3403
  treemapOptions?: PptxChartTreemapOptions;
3404
+ /**
3405
+ * Series-level picture-fill flags (`c:ser/c:pictureOptions`), legal
3406
+ * wherever a per-point `c:dPt/c:pictureOptions` is (CT_BarSer): paints
3407
+ * EVERY point in the series with one picture unless a `c:dPt` overrides it
3408
+ * for that point alone. A point's own {@link PptxChartDataPoint.picture}
3409
+ * takes precedence entirely (not merged field-by-field) when it resolves
3410
+ * its own image; renderers fall back to this series-level picture only
3411
+ * when the point has none of its own.
3412
+ */
3413
+ picture?: PptxChartDataPointPicture;
3414
+ /**
3415
+ * This series' identity GUID (`c:ser/c:extLst/c:ext/c16:uniqueId/@val`,
3416
+ * the Office 2014+ `{C3380CC4-5D6E-409C-BE32-E72D297353CC}` chart
3417
+ * extension). PowerPoint uses it to track a series across edits and
3418
+ * collaborators independent of its `c:idx`/`c:order` position (the same
3419
+ * role animation targeting and CRDT reconciliation need). An edited
3420
+ * existing series keeps its own `c:extLst` as passthrough; a NEW series
3421
+ * added by cloning an existing one as a template is given a freshly
3422
+ * generated id rather than duplicating the template's (see
3423
+ * `regenerateClonedUniqueId` in `chart-series-identity.ts`), since two
3424
+ * series sharing one identity is exactly what this extension exists to
3425
+ * prevent.
3426
+ */
3427
+ uniqueId?: string;
3428
+ }
3429
+ /**
3430
+ * A series PowerPoint's "Chart Filters" feature hid from the plot while
3431
+ * keeping it in the workbook (`c:<type>Chart/c:extLst/c:ext
3432
+ * [@uri={02D57815-91ED-43cb-92C2-25804820EDAC}]/c15:filtered<Type>Series
3433
+ * /c15:ser`). Read-mostly: {@link PptxChartData.filteredSeries} exists for
3434
+ * introspection (AI tools, "unhide filtered series" UI) and round-trips as
3435
+ * passthrough through the preserved chart XML when untouched. See
3436
+ * `utils/chart-filtered-series.ts` for the parse rules and the idx-collision
3437
+ * fix this modelling enables on save.
3438
+ */
3439
+ interface PptxChartFilteredSeries {
3440
+ /** `c15:ser/c:idx/@val`, the workbook column position this series still occupies. */
3441
+ idx: number;
3442
+ /** `c15:ser/c:order/@val`, defaulting to {@link idx} when absent. */
3443
+ order: number;
3444
+ /** Series name, from the hidden series' own `c:tx` cache. */
3445
+ name?: string;
3446
+ /** Category labels, from the hidden series' own `c:cat` cache. */
3447
+ categories?: string[];
3448
+ /** Data values, from the hidden series' own `c:val` cache. */
3449
+ values?: number[];
3450
+ /** This hidden series' own identity GUID (`c16:uniqueId`), when present. */
3451
+ uniqueId?: string;
3318
3452
  }
3319
3453
  /**
3320
3454
  * Chart-level data-label options (`c:dLbls` directly under a chart-type
@@ -3338,6 +3472,19 @@ interface PptxChartDataLabelOptions {
3338
3472
  separator?: string;
3339
3473
  /** Show leader lines where supported (`c:showLeaderLines`). */
3340
3474
  showLeaderLines?: boolean;
3475
+ /**
3476
+ * Leader-line stroke styling for offset (pie/doughnut `outEnd`/`bestFit`)
3477
+ * labels. Resolved from the base `c:leaderLines/c:spPr` when present, else
3478
+ * falling back to the Office 2013+ chart15 extension's mirror
3479
+ * (`c:extLst/c:ext/c15:leaderLines/c:spPr`, uri
3480
+ * `{CE6537A1-D6FC-4f65-9D91-7224C49458BB}`), which is the one PowerPoint
3481
+ * itself treats as authoritative when both are present. Confirmed against
3482
+ * `e2e/fixtures/issue-132-gradient-fill.pptx` and
3483
+ * `e2e/fixtures/issue-132-hr-deck.pptx`, both of which write only the
3484
+ * extension form. `undefined` leaves the renderer's own default leader-line
3485
+ * stroke.
3486
+ */
3487
+ leaderLineStyle?: PptxChartShapeProps;
3341
3488
  /**
3342
3489
  * Label position (`c:dLblPos`). Valid values depend on the chart type
3343
3490
  * (`ctr`, `inEnd`, `inBase`, `outEnd`, `bestFit`, `l`, `r`, `t`, `b`).
@@ -3491,12 +3638,12 @@ interface PptxBubbleChartOptions {
3491
3638
  *
3492
3639
  * All fields are optional and round-trip verbatim.
3493
3640
  *
3494
- * - {@link rotX} X-axis rotation in degrees (-90…90).
3495
- * - {@link rotY} Y-axis rotation in degrees (0…360).
3496
- * - {@link depthPercent} chart depth as a percentage of base width.
3497
- * - {@link rAngAx} `true` if axes meet at right angles.
3498
- * - {@link perspective} perspective angle in degrees (0…240).
3499
- * - {@link hPercent} height as a percentage of chart width.
3641
+ * - {@link rotX}: X-axis rotation in degrees (-90…90).
3642
+ * - {@link rotY}: Y-axis rotation in degrees (0…360).
3643
+ * - {@link depthPercent}: chart depth as a percentage of base width.
3644
+ * - {@link rAngAx}: `true` if axes meet at right angles.
3645
+ * - {@link perspective}: perspective angle in degrees (0…240).
3646
+ * - {@link hPercent}: height as a percentage of chart width.
3500
3647
  */
3501
3648
  interface PptxChartView3D {
3502
3649
  rotX?: number;
@@ -3510,12 +3657,17 @@ interface PptxChartView3D {
3510
3657
  * Chart "chrome" flags from `c:chart` that round-trip cleanly even when
3511
3658
  * rendering ignores them.
3512
3659
  *
3513
- * - {@link autoTitleDeleted} `c:autoTitleDeleted/@val`. Suppresses the
3660
+ * - {@link autoTitleDeleted}: `c:autoTitleDeleted/@val`. Suppresses the
3514
3661
  * auto-generated title for single-series charts.
3515
- * - {@link dispBlanksAs} `c:dispBlanksAs/@val`. How blank cells
3662
+ * - {@link dispBlanksAs}: `c:dispBlanksAs/@val`. How blank cells
3516
3663
  * render: `"gap"`, `"zero"`, or `"span"`.
3517
- * - {@link showDLblsOverMax} `c:showDLblsOverMax/@val`. Keeps data
3664
+ * - {@link showDLblsOverMax}: `c:showDLblsOverMax/@val`. Keeps data
3518
3665
  * labels visible for points exceeding the value-axis maximum.
3666
+ * - {@link dispNaAsBlank}: the Office 2017+ chart extension
3667
+ * `c:extLst/c:ext/c16r3:dataDisplayOptions16/c16r3:dispNaAsBlank/@val`
3668
+ * (uri `{56B9EC1D-385E-4148-901F-78D8002777C0}`), PowerPoint's "Show #N/A
3669
+ * as an empty cell" chart option. Confirmed against real corpus markup
3670
+ * (`e2e/fixtures/chart-data-fidelity.pptx`).
3519
3671
  *
3520
3672
  * `c:plotVisOnly` lives on {@link PptxChartData.plotVisibleOnly} and is
3521
3673
  * intentionally not duplicated here.
@@ -3524,6 +3676,7 @@ interface PptxChartChrome {
3524
3676
  autoTitleDeleted?: boolean;
3525
3677
  dispBlanksAs?: 'gap' | 'zero' | 'span';
3526
3678
  showDLblsOverMax?: boolean;
3679
+ dispNaAsBlank?: boolean;
3527
3680
  }
3528
3681
  /** Manual chart placement from `c:layout/c:manualLayout` (CT_ManualLayout). */
3529
3682
  interface PptxChartManualLayout {
@@ -3619,6 +3772,13 @@ interface PptxChartData {
3619
3772
  categoryLevels?: string[][];
3620
3773
  dateCategories?: PptxChartDateCategories;
3621
3774
  series: PptxChartSeries[];
3775
+ /**
3776
+ * Series hidden from the plot by PowerPoint's "Chart Filters" feature
3777
+ * (Series tab) but still present in the workbook, aggregated across every
3778
+ * chart-type container (combo charts can carry more than one). Absent
3779
+ * when the chart has no such extension. See {@link PptxChartFilteredSeries}.
3780
+ */
3781
+ filteredSeries?: PptxChartFilteredSeries[];
3622
3782
  /** Chart style/formatting metadata. */
3623
3783
  style?: PptxChartStyle;
3624
3784
  /** Grouping mode for bar/area/line charts: 'clustered' | 'stacked' | 'percentStacked' */
@@ -3742,9 +3902,9 @@ interface PptxChartData {
3742
3902
  /**
3743
3903
  * Color cycling method from the chart color style part's `meth` attribute.
3744
3904
  *
3745
- * - `"cycle"` repeat the palette colours in order (default)
3746
- * - `"withinLinear"` gradient within each series
3747
- * - `"acrossLinear"` gradient across series
3905
+ * - `"cycle"`: repeat the palette colours in order (default)
3906
+ * - `"withinLinear"`: gradient within each series
3907
+ * - `"acrossLinear"`: gradient across series
3748
3908
  */
3749
3909
  colorMethod?: 'cycle' | 'withinLinear' | 'acrossLinear';
3750
3910
  /** Internal source color-style part path used for lossless dirty saves. */
@@ -6307,13 +6467,14 @@ interface MediaPptxElement extends PptxElementBase {
6307
6467
  */
6308
6468
  isLinked?: boolean;
6309
6469
  /**
6310
- * Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`.
6311
- * Only populated for the `p:graphicFrame`-shaped (SDK-created) media
6312
- * form; a `p:pic`-shaped media element's alt text is not currently
6313
- * parsed (see `PptxHandlerRuntimePictureParsing.ts`).
6470
+ * Accessibility description. Read from `p:nvGraphicFramePr/p:cNvPr/@descr`
6471
+ * for the `p:graphicFrame`-shaped (SDK-created) media form, or from
6472
+ * `p:nvPicPr/p:cNvPr/@descr` for the `p:pic`-shaped media form (real
6473
+ * PowerPoint's usual authoring shape for a video/audio placeholder); see
6474
+ * `PptxHandlerRuntimePictureParsing.ts`.
6314
6475
  */
6315
6476
  altText?: string;
6316
- /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. Same scope note as {@link altText}. */
6477
+ /** Accessibility title, from the same `@title` attribute on whichever `p:cNvPr` the media form uses. Same scope note as {@link altText}. */
6317
6478
  title?: string;
6318
6479
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
6319
6480
  extensionXml?: PptxGraphicFrameExtension[];
@@ -6340,6 +6501,46 @@ interface GroupPptxElement extends PptxElementBase {
6340
6501
  children: PptxElement[];
6341
6502
  /** Fill style extracted from the group's `p:grpSpPr`, used for `a:grpFill` inheritance. */
6342
6503
  groupFill?: ShapeStyle;
6504
+ /**
6505
+ * The SAME `p:grpSpPr` extraction as {@link groupFill}, kept whenever the
6506
+ * group carries a `p:grpSpPr` at all, regardless of whether it resolved to
6507
+ * a paintable fill.
6508
+ *
6509
+ * `groupFill` is `undefined` unless the group has a real fill, because
6510
+ * `getGroupChildParentFill`/`groupChildInheritedFill` (the `a:grpFill`
6511
+ * inheritance chain) must keep chaining through an ancestor's fill when
6512
+ * THIS group has none of its own. A group whose `p:grpSpPr` authors only
6513
+ * `a:effectLst` (shadow/glow/soft-edge/reflection, no fill) needs those
6514
+ * effects to still reach the renderer, so they are kept here under a name
6515
+ * that carries no fill-inheritance meaning. Currently only reflection is
6516
+ * read from it (`getComputedEffectStyle`); the rest of `a:effectLst` on a
6517
+ * group remains unsupported.
6518
+ */
6519
+ groupEffectStyle?: ShapeStyle;
6520
+ /**
6521
+ * Exact EMU the group's own `a:chOff`/`a:chExt` (the coordinate space its
6522
+ * CHILDREN are authored in) were parsed from, alongside {@link
6523
+ * PptxElementBase.xEmu} etc for the group's own placement in its PARENT's
6524
+ * space. `undefined` when the source carried no usable `a:chOff`/`a:chExt`
6525
+ * (an SDK-created group, or one whose `a:xfrm` had no child-space data).
6526
+ *
6527
+ * Used by `group-xfrm-preservation.ts`'s `hasCapturedChildSpace` to decide
6528
+ * whether this group's original `a:chOff`/`a:chExt` can be re-emitted
6529
+ * verbatim (always true once captured, regardless of whether anything in
6530
+ * the subtree has moved or resized - only its DIRECT children's
6531
+ * `a:off`/`a:ext` are recomputed, via `invertChildIntoGroupSpace`, when
6532
+ * something changed), instead of the normalized `chOff 0,0` / `chExt ==
6533
+ * ext` space the writer falls back to when this is `undefined` (or
6534
+ * degenerate). See `group-shape-geometry.ts`'s module doc for why a group
6535
+ * needs two coordinate systems at all.
6536
+ */
6537
+ chOffXEmu?: number;
6538
+ /** See {@link chOffXEmu}. */
6539
+ chOffYEmu?: number;
6540
+ /** See {@link chOffXEmu}. */
6541
+ chExtWidthEmu?: number;
6542
+ /** See {@link chOffXEmu}. */
6543
+ chExtHeightEmu?: number;
6343
6544
  }
6344
6545
  /**
6345
6546
  * A freehand ink / drawing stroke captured with a stylus or mouse.
@@ -6368,6 +6569,24 @@ interface InkPptxElement extends PptxElementBase {
6368
6569
  * variable-width strokes that reflect stylus/pen pressure.
6369
6570
  */
6370
6571
  inkPointPressures?: number[][];
6572
+ /**
6573
+ * Per-path arrays of per-point pen-tilt lean direction (degrees, straight
6574
+ * from `PointerEvent.tiltX` on supporting hardware).
6575
+ *
6576
+ * Each entry corresponds to the path at the same index in `inkPaths`, and
6577
+ * is paired positionally with {@link inkPointTiltY}. Present only when at
6578
+ * least one point in the stroke reported a genuinely non-zero tilt: a
6579
+ * device that never reports tilt (a mouse, or a stylus with no tilt
6580
+ * sensor) leaves both arrays absent, the same way `inkPointPressures` is
6581
+ * omitted when pressure never varies. When present, the renderer converts
6582
+ * the raw `(tiltX, tiltY)` vector into a lean angle + magnitude (see
6583
+ * `pptx-viewer-shared`'s `tiltChannelsFromVectors`) and widens the stroke
6584
+ * perpendicular to the lean direction, approximating a chisel-tip
6585
+ * calligraphy nib.
6586
+ */
6587
+ inkPointTiltX?: number[][];
6588
+ /** Per-path, per-point pen-tilt lean direction (degrees), paired with {@link inkPointTiltX}. */
6589
+ inkPointTiltY?: number[][];
6371
6590
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
6372
6591
  extensionXml?: PptxGraphicFrameExtension[];
6373
6592
  }
@@ -6401,6 +6620,20 @@ interface ContentPartInkStroke {
6401
6620
  * {@link tiltAngles}.
6402
6621
  */
6403
6622
  tiltMagnitudes?: number[];
6623
+ /**
6624
+ * Which InkML channel pair {@link tiltAngles}/{@link tiltMagnitudes} were
6625
+ * decoded from: `'azimuthAltitude'` when the source declared `AZIMUTH`
6626
+ * (optionally paired with `ALTITUDE`); omitted (implying `OTx`/`OTy`, i.e.
6627
+ * `'vector'`) otherwise, including for tilt this library itself captured
6628
+ * from the Draw tool's `PointerEvent.tiltX`/`tiltY`.
6629
+ *
6630
+ * A save that has to rewrite this content part's InkML (see
6631
+ * `inkml-content-part-writer.ts`) uses this to re-declare the SAME channel
6632
+ * pair the file already used, rather than always converting to `OTx`/`OTy`;
6633
+ * the rendered lean is identical either way; only the written channel
6634
+ * NAMES differ.
6635
+ */
6636
+ tiltEncoding?: 'vector' | 'azimuthAltitude';
6404
6637
  }
6405
6638
  /**
6406
6639
  * A content-part element wrapped in `mc:AlternateContent`.
@@ -7235,17 +7468,28 @@ interface PptxNativeAnimation {
7235
7468
  */
7236
7469
  afterEffect?: boolean;
7237
7470
  /**
7238
- * "After animation" end-state behaviour carried over from the matching
7239
- * {@link PptxElementAnimation.afterAnimation} entry for this effect's
7240
- * element. Not populated by the native-timing parser itself (there is no
7241
- * single `p:cTn` attribute for it): `applyAfterAnimationFromEditorList` in
7242
- * `pptx-viewer-shared` merges it in from the editor's per-element
7243
- * animation list before playback, since that is the model the animation
7244
- * panel writes `afterAnimation` into.
7471
+ * "After animation" end-state behaviour: dim-to-colour, hide-after-
7472
+ * animation, or hide-on-next-click. Populated directly by the
7473
+ * native-timing parser (`native-animation-after-effect.ts`) when the
7474
+ * effect's `p:cTn/p:subTnLst` carries PowerPoint's genuine after-effect
7475
+ * shape, so a real-world deck's build shows up here even with no
7476
+ * `pptx:editorMeta`. `applyAfterAnimationFromEditorList` in
7477
+ * `pptx-viewer-shared` overrides this from the matching
7478
+ * {@link PptxElementAnimation.afterAnimation} entry when the editor's
7479
+ * per-element animation list has one (the model the animation panel
7480
+ * writes `afterAnimation` into), so an edit through our own UI always wins.
7245
7481
  */
7246
7482
  afterAnimationAction?: PptxAfterAnimationAction;
7247
- /** Dim-to color hex, present when {@link afterAnimationAction} is `dimToColor`. */
7483
+ /** Dim-to color hex, present when {@link afterAnimationAction} is `dimToColor` AND the dim target is an already-resolved `a:srgbClr`. */
7248
7484
  afterAnimationColor?: string;
7485
+ /**
7486
+ * The typed theme reference when a `dimToColor` target is an `a:schemeClr`
7487
+ * (e.g. `accent2`) instead of `a:srgbClr`: this parse layer has no theme to
7488
+ * resolve it to sRGB with (see {@link afterAnimationColor}'s doc), so a
7489
+ * playback consumer resolves this against the deck's theme colour map.
7490
+ * Mutually exclusive with {@link afterAnimationColor} being set.
7491
+ */
7492
+ afterAnimationColorRef?: PptxThemeColorRef;
7249
7493
  /**
7250
7494
  * Parsed `p:animEffect` filter descriptor. `presetId`/`presetClass` remain
7251
7495
  * the primary effect selector (see `resolveEffect` in `pptx-viewer-shared`);
@@ -7377,13 +7621,46 @@ interface PptxAnimationKeyframe {
7377
7621
  * fidelity; consumers may use it to drive computed animation values.
7378
7622
  */
7379
7623
  fmla?: string;
7624
+ /**
7625
+ * The typed theme reference when a `p:val/p:clrVal` stop is an
7626
+ * `a:schemeClr` (e.g. `accent1`), including any `tint`/`shade`/`lumMod`/
7627
+ * `lumOff`/`alpha` children. {@link value} keeps the bare scheme name for
7628
+ * round-trip; a playback consumer needs this ref (resolved against the
7629
+ * deck's theme colour map) to turn the stop into a real CSS colour, which
7630
+ * the bare name alone cannot do. Absent for an `a:srgbClr` stop, whose
7631
+ * {@link value} is already a resolved `#rrggbb` hex string.
7632
+ */
7633
+ colorRef?: PptxThemeColorRef;
7380
7634
  }
7381
7635
  /** One generic `p:anim` behaviour inside a composed PowerPoint effect. */
7382
7636
  interface PptxAttributeAnimation {
7383
7637
  /** Lowercased target attribute from `p:attrNameLst`. */
7384
7638
  attrName: string;
7385
- /** Authored value stops from this behaviour's `p:tavLst`. */
7639
+ /**
7640
+ * Authored value stops from this behaviour's `p:tavLst`. Empty when the
7641
+ * behaviour instead uses the simpler `from`/`to`/`by` attribute form (see
7642
+ * below); at least one of `keyframes`, `from`/`to`, or `by` is present.
7643
+ */
7386
7644
  keyframes: PptxAnimationKeyframe[];
7645
+ /**
7646
+ * `p:anim/@_from` (a formula string, ECMA-376 S19.5.4 CT_TLAnimateBehavior):
7647
+ * the absolute starting value, used instead of `p:tavLst` when the
7648
+ * behaviour only has two endpoints. PowerPoint writes this form for some
7649
+ * built-in presets (e.g. "Grow And Turn"'s `ppt_x` fly-in): a bare
7650
+ * `p:anim from="..." to="..."` with no `p:tavLst` child at all. See
7651
+ * `animation-ppt-formula-ground-truth.md` in `pptx-viewer-shared` for the
7652
+ * real-PowerPoint sample this was found in.
7653
+ */
7654
+ from?: string;
7655
+ /** `p:anim/@_to`: the absolute ending value. See {@link from}. */
7656
+ to?: string;
7657
+ /**
7658
+ * `p:anim/@_by`: a DELTA formula added to wherever the attribute already
7659
+ * stands (as opposed to `from`/`to`'s absolute values), typically paired
7660
+ * with `p:cBhvr/@_additive="sum"` so it composites with a sibling
7661
+ * behaviour driving the same attribute instead of replacing it.
7662
+ */
7663
+ by?: string;
7387
7664
  /** Duration from this behaviour's nested `p:cTn/@dur`. */
7388
7665
  durationMs?: number;
7389
7666
  /** Start offset from this behaviour's nested `p:stCondLst`. */
@@ -7392,8 +7669,11 @@ interface PptxAttributeAnimation {
7392
7669
  * Interpolation mode from this behaviour's own `@_calcmode`
7393
7670
  * (ST_TLAnimateBehaviorCalcMode, ECMA-376 S19.5.2): `discrete` snaps to
7394
7671
  * each `p:tav` stop with no interpolation, `lin` (the OOXML default)
7395
- * interpolates linearly, `fmla` evaluates `p:tav/@fmla` (not consulted at
7396
- * playback here; formulas are round-tripped only). Absent means `lin`.
7672
+ * interpolates linearly. `fmla` as the WHOLE behaviour's calc mode has
7673
+ * never been observed in a real PowerPoint file and is not consulted at
7674
+ * playback; what PowerPoint actually writes is `calcmode="lin"` with a
7675
+ * per-stop `p:tav/@fmla` (see {@link PptxAnimationKeyframe.fmla}), which
7676
+ * IS consulted regardless of this field's value. Absent means `lin`.
7397
7677
  */
7398
7678
  calcMode?: 'discrete' | 'lin' | 'fmla';
7399
7679
  }
@@ -7419,16 +7699,31 @@ interface PptxColorAnimation {
7419
7699
  * companion to `@dir` for HSL colour-space animations.
7420
7700
  */
7421
7701
  path?: string;
7422
- /** Starting color as hex string. */
7702
+ /** Starting color as hex string, or the bare scheme name (e.g. `accent1`) for a theme colour; see {@link fromColorRef}. */
7423
7703
  fromColor?: string;
7424
- /** Ending color as hex string. */
7704
+ /** Ending color as hex string, or the bare scheme name; see {@link toColorRef}. */
7425
7705
  toColor?: string;
7426
7706
  /**
7427
- * Color delta (for "by" animations) as hex string. For HSL colour-space
7428
- * animations this retains the historical byte-packed compatibility value;
7429
- * consumers should prefer {@link hslDelta}, which preserves signed values.
7707
+ * Color delta (for "by" animations) as hex string, or the bare scheme name;
7708
+ * see {@link byColorRef}. For HSL colour-space animations this retains the
7709
+ * historical byte-packed compatibility value; consumers should prefer
7710
+ * {@link hslDelta}, which preserves signed values.
7430
7711
  */
7431
7712
  byColor?: string;
7713
+ /**
7714
+ * The typed theme reference when {@link fromColor} is an `a:schemeClr`
7715
+ * (including `tint`/`shade`/`lumMod`/`lumOff`/`alpha`), so playback can
7716
+ * resolve it against the deck's theme colour map. Absent when `fromColor`
7717
+ * is already a resolved `#rrggbb` hex (an `a:srgbClr` stop).
7718
+ */
7719
+ fromColorRef?: PptxThemeColorRef;
7720
+ /** The typed theme reference for {@link toColor}; see {@link fromColorRef}. */
7721
+ toColorRef?: PptxThemeColorRef;
7722
+ /**
7723
+ * The typed theme reference for {@link byColor} (RGB colour space only; an
7724
+ * HSL `by` is a signed delta, never a theme colour). See {@link fromColorRef}.
7725
+ */
7726
+ byColorRef?: PptxThemeColorRef;
7432
7727
  /**
7433
7728
  * Typed HSL delta from `p:by/p:hsl`. This preserves signed values and their
7434
7729
  * OOXML units without forcing them through the legacy byte-packed `byColor`
@@ -8641,13 +8936,13 @@ interface PptxSlide {
8641
8936
  backgroundPattern?: PptxSlideBackgroundPattern;
8642
8937
  /**
8643
8938
  * `<p:bgPr/@shadeToTitle>`: boolean flag instructing the renderer to
8644
- * shade the background gradient toward the title placeholder's text
8645
- * colour. Parsed and round-tripped here on the core model; the actual
8646
- * visual effect is applied by `pptx-viewer-shared`'s
8939
+ * anchor the background gradient on the title placeholder as a
8940
+ * rectangular path gradient (COM-measured against real PowerPoint;
8941
+ * it does NOT recolour toward the title's text colour, despite the
8942
+ * attribute's name). Parsed and round-tripped here on the core model;
8943
+ * the actual visual effect is applied by `pptx-viewer-shared`'s
8647
8944
  * `getSlideBackgroundStyle` (see `render/background-shade-to-title.ts`),
8648
- * consumed by all five bindings, not by core itself. That module's
8649
- * docstring explains the approximation: no published ECMA-376 or
8650
- * MS-ODRAWXML text documents the exact legacy blend. Legacy PowerPoint
8945
+ * consumed by all five bindings, not by core itself. Legacy PowerPoint
8651
8946
  * 97-2003 hint, not observed in any real-world corpus file this project
8652
8947
  * has collected and not settable from any modern PowerPoint UI; see
8653
8948
  * `docs/guide/limitations.md`.
@@ -10743,6 +11038,23 @@ declare class PptxHandler extends PptxHandlerCore {
10743
11038
  /** Supported merge shape operations (matching PowerPoint's Merge Shapes menu). */
10744
11039
  type MergeShapeOperation = 'union' | 'intersect' | 'subtract' | 'fragment' | 'combine';
10745
11040
 
11041
+ //#region src/render/animation-text-style-resolve.d.ts
11042
+ /**
11043
+ * Framework-neutral text-style override a font-style emphasis effect applies
11044
+ * on top of its target's own authored per-run bold/italic/underline/size/
11045
+ * colour. Every binding maps this onto its own text container so it OVERRIDES
11046
+ * the runs' inline styles (the runs carry explicit inline styles of their
11047
+ * own, so plain CSS inheritance cannot reach them).
11048
+ */
11049
+ interface TextStyleAnimationDescriptor {
11050
+ bold?: boolean;
11051
+ italic?: boolean;
11052
+ underline?: boolean;
11053
+ /** Relative multiplier against each run's own authored font size. */
11054
+ fontScale?: number;
11055
+ color?: string;
11056
+ }
11057
+
10746
11058
  /** Viewer interaction mode: read-only, edit, presentation, or master-view. */
10747
11059
  type ViewerMode = 'preview' | 'edit' | 'present' | 'master';
10748
11060
  /**
@@ -10909,22 +11221,15 @@ interface CollaborationConfig {
10909
11221
  writeBackDebounceMs?: number;
10910
11222
  }
10911
11223
  //#endregion
10912
- //#region src/render/animation-text-style-resolve.d.ts
11224
+ //#region src/render/animation-timeline-build-descriptors.d.ts
10913
11225
  /**
10914
- * Framework-neutral text-style override a font-style emphasis effect applies
10915
- * on top of its target's own authored per-run bold/italic/underline/size/
10916
- * colour. Every binding maps this onto its own text container so it OVERRIDES
10917
- * the runs' inline styles (the runs carry explicit inline styles of their
10918
- * own, so plain CSS inheritance cannot reach them).
11226
+ * `animation-timeline-build-descriptors` - staged-build (`p:bldChart` /
11227
+ * `p:bldDgm`) reveal descriptor types, split out of `animation-timeline-types`
11228
+ * to keep that module under the file-size limit. Re-exported from
11229
+ * `animation-timeline-types` so existing imports are unaffected.
11230
+ *
11231
+ * @module render/animation-timeline-build-descriptors
10919
11232
  */
10920
- interface TextStyleAnimationDescriptor {
10921
- bold?: boolean;
10922
- italic?: boolean;
10923
- underline?: boolean;
10924
- /** Relative multiplier against each run's own authored font size. */
10925
- fontScale?: number;
10926
- color?: string;
10927
- }
10928
11233
  /**
10929
11234
  * Normalized staged-reveal mode for a chart graphic frame, derived from the
10930
11235
  * OOXML `a:bldChart/@bld` (or `p:bldOleChart/@bld`) token:
@@ -10958,12 +11263,12 @@ interface ChartRevealPoint {
10958
11263
  * Playback-time chart reveal state derived from AUTHORED `p:graphicEl`
10959
11264
  * indices (see `chart-reveal-descriptor`'s `resolveChartRevealDescriptor`),
10960
11265
  * rather than from click-count/time progress. Present on
10961
- * {@link ElementAnimationState.chartReveal} only when every fired
10962
- * chart-build step for the element carried index data; a renderer prefers
10963
- * this over the progress-based `build`/`ElementBuildState` path when present,
10964
- * since it reflects the real authored reveal set (correct even for a
10965
- * reversed-order or gapped chart build), and falls back to `build` when
10966
- * absent.
11266
+ * {@link import('./animation-timeline-group').ElementAnimationState.chartReveal}
11267
+ * only when every fired chart-build step for the element carried index data;
11268
+ * a renderer prefers this over the progress-based `build`/`ElementBuildState`
11269
+ * path when present, since it reflects the real authored reveal set (correct
11270
+ * even for a reversed-order or gapped chart build), and falls back to `build`
11271
+ * when absent.
10967
11272
  */
10968
11273
  interface ChartRevealDescriptor {
10969
11274
  /**
@@ -10984,12 +11289,13 @@ interface ChartRevealDescriptor {
10984
11289
  * Playback-time SmartArt diagram reveal state derived from AUTHORED
10985
11290
  * `p:graphicEl/p:dgm/@id` indices (see `diagram-reveal-descriptor`'s
10986
11291
  * `resolveDiagramRevealDescriptor`), rather than from click-count/time
10987
- * progress. Present on {@link ElementAnimationState.diagramReveal} only when
10988
- * every fired diagram-build step for the element carried `p:graphicEl` data.
10989
- * A SmartArt renderer prefers this over the progress-based `build` /
10990
- * {@link ElementBuildState} path when present, since it reflects the real
10991
- * authored reveal set (correct even for a reversed-order or by-branch build),
10992
- * and falls back to `build` when absent.
11292
+ * progress. Present on
11293
+ * {@link import('./animation-timeline-group').ElementAnimationState.diagramReveal}
11294
+ * only when every fired diagram-build step for the element carried
11295
+ * `p:graphicEl` data. A SmartArt renderer prefers this over the
11296
+ * progress-based `build` / {@link ElementBuildState} path when present, since
11297
+ * it reflects the real authored reveal set (correct even for a
11298
+ * reversed-order or by-branch build), and falls back to `build` when absent.
10993
11299
  */
10994
11300
  interface DiagramRevealDescriptor {
10995
11301
  /**
@@ -11002,9 +11308,11 @@ interface DiagramRevealDescriptor {
11002
11308
  nodeIds: ReadonlySet<string>;
11003
11309
  }
11004
11310
  /**
11005
- * Playback-time staged-build state surfaced on {@link ElementAnimationState}.
11006
- * `progress` is the 0..1 fraction of the build revealed at the current playback
11007
- * time; a consumer maps it to its own item COUNT (see `revealedStageCount`).
11311
+ * Playback-time staged-build state surfaced on
11312
+ * {@link import('./animation-timeline-group').ElementAnimationState}.
11313
+ * `progress` is the 0..1 fraction of the build revealed at the current
11314
+ * playback time; a consumer maps it to its own item COUNT (see
11315
+ * `revealedStageCount`).
11008
11316
  */
11009
11317
  type ElementBuildState = {
11010
11318
  kind: 'chart';
@@ -11067,14 +11375,14 @@ interface ElementAnimationState {
11067
11375
  animatesStroke?: boolean;
11068
11376
  /**
11069
11377
  * Active discrete font-style / colour / size override (see
11070
- * {@link TimelineStep.textStyle}) a font-style emphasis effect currently
11071
- * applies to this element's text, OVERRIDING the runs' own inline
11072
- * bold/italic/underline/size/colour. `animation-playback-engine.ts` writes
11073
- * this on step start and again on cleanup (held in full when the effect's
11074
- * `p:cTn/@fill` holds its end state, otherwise reverted); a text renderer
11075
- * maps it onto its run markup via `buildTextStyleOverrideCss`
11076
- * (`animation-text-style-css.ts`). Absent means no font-style emphasis
11077
- * effect is currently active on this element.
11378
+ * {@link import('./animation-timeline-step').TimelineStep.textStyle}) a
11379
+ * font-style emphasis effect currently applies to this element's text,
11380
+ * OVERRIDING the runs' own inline bold/italic/underline/size/colour.
11381
+ * `animation-playback-engine.ts` writes this on step start and again on
11382
+ * cleanup (held in full when the effect's `p:cTn/@fill` holds its end
11383
+ * state, otherwise reverted); a text renderer maps it onto its run markup
11384
+ * via `buildTextStyleOverrideCss` (`animation-text-style-css.ts`). Absent
11385
+ * means no font-style emphasis effect is currently active on this element.
11078
11386
  */
11079
11387
  textStyle?: TextStyleAnimationDescriptor;
11080
11388
  }
@@ -11992,6 +12300,16 @@ interface ReadOnlyRecommendation {
11992
12300
  readonly messageKey: string;
11993
12301
  /** Whether a binding's "read-only" toggle should default to on. */
11994
12302
  readonly defaultReadOnly: boolean;
12303
+ /**
12304
+ * Whether lifting this recommendation requires a correct password, rather
12305
+ * than a plain "Edit anyway". True only for a `modifyVerifier` that carries
12306
+ * a hash this viewer can actually check (`hashData` + `saltData` +
12307
+ * `algorithmName`, see `checkModifyPassword`). "Mark as Final" is purely
12308
+ * advisory and never requires one, and a `modifyVerifier` missing pieces of
12309
+ * its hash cannot be verified either way, so both fall back to the plain
12310
+ * "Edit anyway" a binding already had.
12311
+ */
12312
+ readonly requiresPassword: boolean;
11995
12313
  }
11996
12314
  interface CompatibilityWarningToast {
11997
12315
  /** Stable per-code id, since toasts are deduped by code (see module docs). */
@@ -13272,6 +13590,18 @@ interface UsePresentationModeInput {
13272
13590
  */
13273
13591
  templateElementsBySlideId?: Record<string, PptxElement[]>;
13274
13592
  visibleSlideIndexes: number[];
13593
+ /**
13594
+ * The slide canvas size (px), in the same unit the elements' own
13595
+ * `x`/`y`/`width`/`height` are authored in. Threaded to `useAnimationPlayback`
13596
+ * so a `p:anim` formula that needs the animated shape's real box (e.g. Grow
13597
+ * And Turn's `-#ppt_w/2` fly-in) can be resolved instead of falling back.
13598
+ */
13599
+ canvasSize?: {
13600
+ width: number;
13601
+ height: number;
13602
+ };
13603
+ /** The deck's resolved theme colour map, for a scheme-colour (`a:schemeClr`) animation stop. */
13604
+ themeColorMap?: Readonly<Record<string, string>>;
13275
13605
  activeSlideIndex: number;
13276
13606
  containerRef: React.RefObject<HTMLElement | null>;
13277
13607
  /** Raw PPTX bytes: forwarded to audience window for content sharing. */
@@ -14058,6 +14388,12 @@ interface UseLoadContentInput {
14058
14388
  }>>>;
14059
14389
  /** Whether the loaded deck recommends opening read-only (`p:modifyVerifier` / "Mark as Final"). */
14060
14390
  setReadOnlyRecommendation: React.Dispatch<React.SetStateAction<ReadOnlyRecommendation>>;
14391
+ /**
14392
+ * The deck's raw `p:modifyVerifier`, kept alongside the recommendation
14393
+ * above so the read-only banner's password prompt can check a candidate
14394
+ * password against it (`checkModifyPassword`, `pptx-viewer-shared`).
14395
+ */
14396
+ setModifyVerifier: React.Dispatch<React.SetStateAction<PptxModifyVerifier | undefined>>;
14061
14397
  /** Deck + slide compatibility-warning toast stack for this load. */
14062
14398
  setCompatToasts: React.Dispatch<React.SetStateAction<CompatibilityWarningToast[]>>;
14063
14399
  setLoading: React.Dispatch<React.SetStateAction<boolean>>;
@@ -14081,7 +14417,7 @@ interface UseLoadContentInput {
14081
14417
  interface UseLoadContentResult {
14082
14418
  handlerRef: React.MutableRefObject<PptxHandler | null>;
14083
14419
  }
14084
- declare function useLoadContent({ content, clearSelection, history, setSlides, setTemplateElementsBySlideId, mediaDataUrls, setCanvasSize, setSlideSizeEmu, setHeaderFooter, setLayoutOptions, setSlideMasters, setModernCommentAuthors, setRecentColors, setTheme, setTableStyleMap, setTableStylesDefaultId, setTableStylesToDelete, setThemeOptions, setCustomShows, setActiveCustomShowId, setSections, setPresentationProperties, setViewProperties, setNotesMaster, setHandoutMaster, setNotesCanvasSize, setCustomProperties, setTagCollections, setCoreProperties, setAppProperties, setEmbeddedFonts, setActiveSlideIndex, setHasMacros, setHasDigitalSignatures, setDigitalSignatureCount, setGuides, setReadOnlyRecommendation, setCompatToasts, setLoading, setError, setIsDirty, setIsEncrypted, onContentApplied, allowExternalImages }: UseLoadContentInput): UseLoadContentResult;
14420
+ declare function useLoadContent({ content, clearSelection, history, setSlides, setTemplateElementsBySlideId, mediaDataUrls, setCanvasSize, setSlideSizeEmu, setHeaderFooter, setLayoutOptions, setSlideMasters, setModernCommentAuthors, setRecentColors, setTheme, setTableStyleMap, setTableStylesDefaultId, setTableStylesToDelete, setThemeOptions, setCustomShows, setActiveCustomShowId, setSections, setPresentationProperties, setViewProperties, setNotesMaster, setHandoutMaster, setNotesCanvasSize, setCustomProperties, setTagCollections, setCoreProperties, setAppProperties, setEmbeddedFonts, setActiveSlideIndex, setHasMacros, setHasDigitalSignatures, setDigitalSignatureCount, setGuides, setReadOnlyRecommendation, setModifyVerifier, setCompatToasts, setLoading, setError, setIsDirty, setIsEncrypted, onContentApplied, allowExternalImages }: UseLoadContentInput): UseLoadContentResult;
14085
14421
  //#endregion
14086
14422
  //#region src/viewer/hooks/useElementOperations.d.ts
14087
14423
  /**
@@ -15055,6 +15391,18 @@ interface UsePresentationSetupInput {
15055
15391
  /** Master/layout shapes painted beneath each slide, by slide id (see `usePresentationMode`). */
15056
15392
  templateElementsBySlideId?: Record<string, PptxElement[]>;
15057
15393
  visibleSlideIndexes: number[];
15394
+ /**
15395
+ * The slide canvas size (px), in the same unit the elements' own
15396
+ * `x`/`y`/`width`/`height` are authored in. Threaded to `useAnimationPlayback`
15397
+ * so a `p:anim` formula that needs the animated shape's real box (e.g. Grow
15398
+ * And Turn's `-#ppt_w/2` fly-in) can be resolved instead of falling back.
15399
+ */
15400
+ canvasSize?: {
15401
+ width: number;
15402
+ height: number;
15403
+ };
15404
+ /** The deck's resolved theme colour map, for a scheme-colour (`a:schemeClr`) animation stop. */
15405
+ themeColorMap?: Readonly<Record<string, string>>;
15058
15406
  activeSlideIndex: number;
15059
15407
  containerRef: React.RefObject<HTMLElement | null>;
15060
15408
  /** Raw PPTX bytes: forwarded to audience window for content sharing. */
@@ -15223,6 +15571,8 @@ interface UseContentLifecycleInput {
15223
15571
  allowExternalImages?: boolean;
15224
15572
  /** Forwarded to {@link useLoadContent}: see `useReadOnlyRecommendationState`. */
15225
15573
  setReadOnlyRecommendation: React$1.Dispatch<React$1.SetStateAction<ReadOnlyRecommendation>>;
15574
+ /** Forwarded to {@link useLoadContent}: see `useReadOnlyRecommendationState`. */
15575
+ setModifyVerifier: React$1.Dispatch<React$1.SetStateAction<PptxModifyVerifier | undefined>>;
15226
15576
  /** Forwarded to {@link useLoadContent}: see `useCompatibilityToastsState`. */
15227
15577
  setCompatToasts: React$1.Dispatch<React$1.SetStateAction<CompatibilityWarningToast[]>>;
15228
15578
  }
@@ -15303,6 +15653,8 @@ interface UseViewerIntegrationInput {
15303
15653
  allowExternalImages?: boolean;
15304
15654
  /** Forwarded to `useContentLifecycle` -> `useLoadContent`: see `useReadOnlyRecommendationState`. */
15305
15655
  setReadOnlyRecommendation: Dispatch<SetStateAction<ReadOnlyRecommendation>>;
15656
+ /** Forwarded to `useContentLifecycle` -> `useLoadContent`: see `useReadOnlyRecommendationState`. */
15657
+ setModifyVerifier: Dispatch<SetStateAction<PptxModifyVerifier | undefined>>;
15306
15658
  /** Forwarded to `useContentLifecycle` -> `useLoadContent`: see `useCompatibilityToastsState`. */
15307
15659
  setCompatToasts: Dispatch<SetStateAction<CompatibilityWarningToast[]>>;
15308
15660
  canEdit: boolean;
@@ -15803,6 +16155,18 @@ interface UseAnimationPlaybackInput {
15803
16155
  onPlayActionSound?: (soundPath: string) => void;
15804
16156
  /** When false, all animations are skipped (elements shown immediately). */
15805
16157
  showWithAnimation?: boolean;
16158
+ /**
16159
+ * The slide canvas size (px), in the same unit the elements' own
16160
+ * `x`/`y`/`width`/`height` are authored in. Lets `PresentationAnimationController
16161
+ * .fromSlide` resolve a `p:anim` formula that needs the animated shape's real
16162
+ * box (e.g. Grow And Turn's `-#ppt_w/2` fly-in) instead of falling back.
16163
+ */
16164
+ canvasSize?: {
16165
+ width: number;
16166
+ height: number;
16167
+ };
16168
+ /** The deck's resolved theme colour map, for a scheme-colour (`a:schemeClr`) animation stop. */
16169
+ themeColorMap?: Readonly<Record<string, string>>;
15806
16170
  }
15807
16171
  /** How a slide's animation timeline should be seeded when it becomes active. */
15808
16172
  interface SeedSlideAnimationOptions {