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
@@ -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,9 +3065,29 @@ 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';
3079
+ /**
3080
+ * `c15:dlblRangeCache`/`c15:datalabelsRange` (CT_SeriesDataLabelsRange):
3081
+ * PowerPoint 2013+'s "Value From Cells" custom label source, one cell range
3082
+ * supplying every label in a group (chart-type or series `c:dLbls`), with a
3083
+ * cache aligned to point order. See `utils/chart-data-labels-range.ts`.
3084
+ */
3085
+ interface PptxChartDataLabelsRange {
3086
+ /** `c15:f`: the cell range formula (e.g. `Sheet1!$D$2:$D$5`). */
3087
+ formula: string;
3088
+ /** `c15:dlblRangeCache`: cached label text, index-aligned with data points. */
3089
+ cache: string[];
3090
+ }
2993
3091
  /** Individual data label override (c:dLbl). */
2994
3092
  interface PptxChartDataLabel {
2995
3093
  idx: number;
@@ -3031,6 +3129,14 @@ interface PptxChartDataLabel {
3031
3129
  * over any chart/series-level default when set.
3032
3130
  */
3033
3131
  spPr?: PptxChartShapeProps;
3132
+ /**
3133
+ * `c15:xForSave`: this override exists only so its properties survive a
3134
+ * save/reload round trip; PowerPoint merges it back onto the series'
3135
+ * default label on load. Round-tripped as-is (an edited chart keeps an
3136
+ * existing point's whole `extLst`, this flag included); introspection
3137
+ * only otherwise. See `utils/chart-data-labels-range.ts`.
3138
+ */
3139
+ savedForCompatibilityOnly?: boolean;
3034
3140
  }
3035
3141
  /** Axis number format. */
3036
3142
  interface PptxChartAxisNumFmt {
@@ -3063,7 +3169,7 @@ interface PptxChartAxisFormatting extends PptxChartAxisLabelFormatting {
3063
3169
  axPos?: 'b' | 'l' | 'r' | 't';
3064
3170
  /** Unique axis identifier (c:axId/@val) used to link series to axes. */
3065
3171
  axisId?: number;
3066
- /** Cross-axis identifier the axis this axis crosses. */
3172
+ /** Cross-axis identifier: the axis this axis crosses. */
3067
3173
  crossAxisId?: number;
3068
3174
  /** Automatic crossing mode (`c:crosses`). Mutually exclusive with `crossesAt`. */
3069
3175
  crosses?: 'autoZero' | 'min' | 'max';
@@ -3315,6 +3421,54 @@ interface PptxChartSeries {
3315
3421
  waterfallOptions?: PptxChartWaterfallOptions;
3316
3422
  regionMapOptions?: PptxChartRegionMapOptions;
3317
3423
  treemapOptions?: PptxChartTreemapOptions;
3424
+ /**
3425
+ * Series-level picture-fill flags (`c:ser/c:pictureOptions`), legal
3426
+ * wherever a per-point `c:dPt/c:pictureOptions` is (CT_BarSer): paints
3427
+ * EVERY point in the series with one picture unless a `c:dPt` overrides it
3428
+ * for that point alone. A point's own {@link PptxChartDataPoint.picture}
3429
+ * takes precedence entirely (not merged field-by-field) when it resolves
3430
+ * its own image; renderers fall back to this series-level picture only
3431
+ * when the point has none of its own.
3432
+ */
3433
+ picture?: PptxChartDataPointPicture;
3434
+ /**
3435
+ * This series' identity GUID (`c:ser/c:extLst/c:ext/c16:uniqueId/@val`,
3436
+ * the Office 2014+ `{C3380CC4-5D6E-409C-BE32-E72D297353CC}` chart
3437
+ * extension). PowerPoint uses it to track a series across edits and
3438
+ * collaborators independent of its `c:idx`/`c:order` position (the same
3439
+ * role animation targeting and CRDT reconciliation need). An edited
3440
+ * existing series keeps its own `c:extLst` as passthrough; a NEW series
3441
+ * added by cloning an existing one as a template is given a freshly
3442
+ * generated id rather than duplicating the template's (see
3443
+ * `regenerateClonedUniqueId` in `chart-series-identity.ts`), since two
3444
+ * series sharing one identity is exactly what this extension exists to
3445
+ * prevent.
3446
+ */
3447
+ uniqueId?: string;
3448
+ }
3449
+ /**
3450
+ * A series PowerPoint's "Chart Filters" feature hid from the plot while
3451
+ * keeping it in the workbook (`c:<type>Chart/c:extLst/c:ext
3452
+ * [@uri={02D57815-91ED-43cb-92C2-25804820EDAC}]/c15:filtered<Type>Series
3453
+ * /c15:ser`). Read-mostly: {@link PptxChartData.filteredSeries} exists for
3454
+ * introspection (AI tools, "unhide filtered series" UI) and round-trips as
3455
+ * passthrough through the preserved chart XML when untouched. See
3456
+ * `utils/chart-filtered-series.ts` for the parse rules and the idx-collision
3457
+ * fix this modelling enables on save.
3458
+ */
3459
+ interface PptxChartFilteredSeries {
3460
+ /** `c15:ser/c:idx/@val`, the workbook column position this series still occupies. */
3461
+ idx: number;
3462
+ /** `c15:ser/c:order/@val`, defaulting to {@link idx} when absent. */
3463
+ order: number;
3464
+ /** Series name, from the hidden series' own `c:tx` cache. */
3465
+ name?: string;
3466
+ /** Category labels, from the hidden series' own `c:cat` cache. */
3467
+ categories?: string[];
3468
+ /** Data values, from the hidden series' own `c:val` cache. */
3469
+ values?: number[];
3470
+ /** This hidden series' own identity GUID (`c16:uniqueId`), when present. */
3471
+ uniqueId?: string;
3318
3472
  }
3319
3473
  /**
3320
3474
  * Chart-level data-label options (`c:dLbls` directly under a chart-type
@@ -3338,6 +3492,19 @@ interface PptxChartDataLabelOptions {
3338
3492
  separator?: string;
3339
3493
  /** Show leader lines where supported (`c:showLeaderLines`). */
3340
3494
  showLeaderLines?: boolean;
3495
+ /**
3496
+ * Leader-line stroke styling for offset (pie/doughnut `outEnd`/`bestFit`)
3497
+ * labels. Resolved from the base `c:leaderLines/c:spPr` when present, else
3498
+ * falling back to the Office 2013+ chart15 extension's mirror
3499
+ * (`c:extLst/c:ext/c15:leaderLines/c:spPr`, uri
3500
+ * `{CE6537A1-D6FC-4f65-9D91-7224C49458BB}`), which is the one PowerPoint
3501
+ * itself treats as authoritative when both are present. Confirmed against
3502
+ * `e2e/fixtures/issue-132-gradient-fill.pptx` and
3503
+ * `e2e/fixtures/issue-132-hr-deck.pptx`, both of which write only the
3504
+ * extension form. `undefined` leaves the renderer's own default leader-line
3505
+ * stroke.
3506
+ */
3507
+ leaderLineStyle?: PptxChartShapeProps;
3341
3508
  /**
3342
3509
  * Label position (`c:dLblPos`). Valid values depend on the chart type
3343
3510
  * (`ctr`, `inEnd`, `inBase`, `outEnd`, `bestFit`, `l`, `r`, `t`, `b`).
@@ -3358,6 +3525,22 @@ interface PptxChartDataLabelOptions {
3358
3525
  * (point > series > chart-type).
3359
3526
  */
3360
3527
  txPr?: PptxChartLegendTextStyle;
3528
+ /**
3529
+ * PowerPoint 2013+ "Value From Cells", series-wide form
3530
+ * (`c15:datalabelsRange`, chart15 uri `{CE6537A1-...}`): one cell range
3531
+ * supplies every label in this group, aligned by point index. A
3532
+ * SERIES-WIDE alternative to the per-point `c15:dlblFieldTable` mechanism
3533
+ * (already resolved into {@link PptxChartDataLabel.text} at parse time).
3534
+ * See `utils/chart-data-labels-range.ts`.
3535
+ */
3536
+ dataLabelsRange?: PptxChartDataLabelsRange;
3537
+ /**
3538
+ * `c15:showDataLabelsRange` at the SAME level as {@link dataLabelsRange}:
3539
+ * whether every label in this group resolves through the range's cache.
3540
+ * Distinct from the per-point {@link PptxChartDataLabel} flag of the same
3541
+ * XML name. Only meaningful when {@link dataLabelsRange} is set.
3542
+ */
3543
+ showDataLabelsRange?: boolean;
3361
3544
  }
3362
3545
  /** Typed text defaults for a single chart legend entry. */
3363
3546
  interface PptxChartLegendTextStyle {
@@ -3491,12 +3674,12 @@ interface PptxBubbleChartOptions {
3491
3674
  *
3492
3675
  * All fields are optional and round-trip verbatim.
3493
3676
  *
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.
3677
+ * - {@link rotX}: X-axis rotation in degrees (-90…90).
3678
+ * - {@link rotY}: Y-axis rotation in degrees (0…360).
3679
+ * - {@link depthPercent}: chart depth as a percentage of base width.
3680
+ * - {@link rAngAx}: `true` if axes meet at right angles.
3681
+ * - {@link perspective}: perspective angle in degrees (0…240).
3682
+ * - {@link hPercent}: height as a percentage of chart width.
3500
3683
  */
3501
3684
  interface PptxChartView3D {
3502
3685
  rotX?: number;
@@ -3510,12 +3693,17 @@ interface PptxChartView3D {
3510
3693
  * Chart "chrome" flags from `c:chart` that round-trip cleanly even when
3511
3694
  * rendering ignores them.
3512
3695
  *
3513
- * - {@link autoTitleDeleted} `c:autoTitleDeleted/@val`. Suppresses the
3696
+ * - {@link autoTitleDeleted}: `c:autoTitleDeleted/@val`. Suppresses the
3514
3697
  * auto-generated title for single-series charts.
3515
- * - {@link dispBlanksAs} `c:dispBlanksAs/@val`. How blank cells
3698
+ * - {@link dispBlanksAs}: `c:dispBlanksAs/@val`. How blank cells
3516
3699
  * render: `"gap"`, `"zero"`, or `"span"`.
3517
- * - {@link showDLblsOverMax} `c:showDLblsOverMax/@val`. Keeps data
3700
+ * - {@link showDLblsOverMax}: `c:showDLblsOverMax/@val`. Keeps data
3518
3701
  * labels visible for points exceeding the value-axis maximum.
3702
+ * - {@link dispNaAsBlank}: the Office 2017+ chart extension
3703
+ * `c:extLst/c:ext/c16r3:dataDisplayOptions16/c16r3:dispNaAsBlank/@val`
3704
+ * (uri `{56B9EC1D-385E-4148-901F-78D8002777C0}`), PowerPoint's "Show #N/A
3705
+ * as an empty cell" chart option. Confirmed against real corpus markup
3706
+ * (`e2e/fixtures/chart-data-fidelity.pptx`).
3519
3707
  *
3520
3708
  * `c:plotVisOnly` lives on {@link PptxChartData.plotVisibleOnly} and is
3521
3709
  * intentionally not duplicated here.
@@ -3524,6 +3712,7 @@ interface PptxChartChrome {
3524
3712
  autoTitleDeleted?: boolean;
3525
3713
  dispBlanksAs?: 'gap' | 'zero' | 'span';
3526
3714
  showDLblsOverMax?: boolean;
3715
+ dispNaAsBlank?: boolean;
3527
3716
  }
3528
3717
  /** Manual chart placement from `c:layout/c:manualLayout` (CT_ManualLayout). */
3529
3718
  interface PptxChartManualLayout {
@@ -3619,6 +3808,26 @@ interface PptxChartData {
3619
3808
  categoryLevels?: string[][];
3620
3809
  dateCategories?: PptxChartDateCategories;
3621
3810
  series: PptxChartSeries[];
3811
+ /**
3812
+ * Series hidden from the plot by PowerPoint's "Chart Filters" feature
3813
+ * (Series tab) but still present in the workbook, aggregated across every
3814
+ * chart-type container (combo charts can carry more than one). Absent
3815
+ * when the chart has no such extension. See {@link PptxChartFilteredSeries}.
3816
+ */
3817
+ filteredSeries?: PptxChartFilteredSeries[];
3818
+ /**
3819
+ * `c15:filteredSeriesTitle`: the auto-generated series title text (e.g.
3820
+ * "Series 3") PowerPoint preserved when the chart filter hid the series
3821
+ * whose data would otherwise have supplied it. See
3822
+ * `utils/chart-ext-titles.ts`. Read-mostly like {@link filteredSeries}.
3823
+ */
3824
+ filteredSeriesTitle?: string;
3825
+ /**
3826
+ * `c15:filteredCategoryTitle`: the auto-numbered category labels ("1",
3827
+ * "2", "3", ...) PowerPoint preserved when the chart filter hid the
3828
+ * category axis source entirely. See `utils/chart-ext-titles.ts`.
3829
+ */
3830
+ filteredCategoryTitle?: string[];
3622
3831
  /** Chart style/formatting metadata. */
3623
3832
  style?: PptxChartStyle;
3624
3833
  /** Grouping mode for bar/area/line charts: 'clustered' | 'stacked' | 'percentStacked' */
@@ -3742,9 +3951,9 @@ interface PptxChartData {
3742
3951
  /**
3743
3952
  * Color cycling method from the chart color style part's `meth` attribute.
3744
3953
  *
3745
- * - `"cycle"` repeat the palette colours in order (default)
3746
- * - `"withinLinear"` gradient within each series
3747
- * - `"acrossLinear"` gradient across series
3954
+ * - `"cycle"`: repeat the palette colours in order (default)
3955
+ * - `"withinLinear"`: gradient within each series
3956
+ * - `"acrossLinear"`: gradient across series
3748
3957
  */
3749
3958
  colorMethod?: 'cycle' | 'withinLinear' | 'acrossLinear';
3750
3959
  /** Internal source color-style part path used for lossless dirty saves. */
@@ -4541,7 +4750,95 @@ interface PptxSmartArtLayoutNode {
4541
4750
  rules?: PptxSmartArtNumericRule[];
4542
4751
  /** `dgm:shape`: this node's own preset geometry override, when present. */
4543
4752
  shape?: PptxSmartArtLayoutNodeShape;
4753
+ /**
4754
+ * `dgm:presOf` (CT_PresentationOf, same iterator shape as `dgm:forEach`):
4755
+ * which data-model point(s) this node's OWN text/geometry binds to -
4756
+ * `axis: ['self']` the point currently being iterated, `['des']` all of
4757
+ * its descendants, `['ch']` its direct children, and so on. Absent or
4758
+ * empty `axis` (including a bare `<dgm:presOf/>`) means the node carries
4759
+ * no text of its own (a pure positioning/decoration wrapper - `composite`,
4760
+ * `sp` spacer, connector cap). See `smartart-layout-interpreter-item-
4761
+ * roles.ts`, the one consumer: it is what lets the interpreter tell a
4762
+ * text-bearing per-item role (a list layout's `childText`, a card
4763
+ * layout's `roleText`/`bodyText`) apart from a same-generation sibling
4764
+ * that positions or decorates instead.
4765
+ */
4766
+ presentationOf?: PptxSmartArtIteratorAttributes;
4767
+ /**
4768
+ * EVERY `dgm:constr` reachable from this node, including ones declared
4769
+ * inside a `dgm:choose`/`dgm:if`/`dgm:else` that wraps THIS layoutNode's
4770
+ * `constrLst` (a genuinely conditional constraint set, e.g. one branch
4771
+ * per data-point count - `gear`'s composite positions its `gear1`/
4772
+ * `gear2`/`gear3` slots this way, so its plain, direct-child-only
4773
+ * `constraints` above is empty for it). Stops at a nested `dgm:layoutNode`
4774
+ * boundary: that child's own conditional constrLst becomes ITS
4775
+ * `allConstraints`, not folded into the parent's. Read-only /
4776
+ * interpretation-only - `constraints` above (this node's own DIRECT
4777
+ * constrLst) remains the one `applySmartArtLayoutDefinition` round-trips,
4778
+ * so editing an unrelated property can never collapse a genuinely
4779
+ * conditional constrLst into a single branch. `undefined` when this node
4780
+ * declares no constrLst at all, in or out of a choose (the common case);
4781
+ * otherwise a superset of `constraints` (every branch, blindly unioned -
4782
+ * this interpreter does not evaluate `dgm:choose` conditions when
4783
+ * indexing constraints, matching the same "flatten both branches"
4784
+ * convention `nestedLayoutNodes` already uses for `children`). See
4785
+ * `smartart-constraint-solver.ts`'s `buildConstraintIndex`, the only
4786
+ * consumer.
4787
+ */
4788
+ allConstraints?: PptxSmartArtConstraint[];
4544
4789
  children?: PptxSmartArtLayoutNode[];
4790
+ /**
4791
+ * The iterator attributes of the ENCLOSING `dgm:forEach` this node was
4792
+ * found through, when `nestedLayoutNodes` (`smartart-layout-definition
4793
+ * .ts`) reached it by walking one - as opposed to being a direct child of
4794
+ * its parent layoutNode, or reached only through a `dgm:choose` wrapper
4795
+ * (a condition, not an iteration, leaves this `undefined`).
4796
+ *
4797
+ * `forEach` above records a node's OWN direct `dgm:forEach` children
4798
+ * (which wrap ITS descendants); this is the opposite direction - the
4799
+ * forEach that wraps the node ITSELF, one level up. A layoutNode can sit
4800
+ * inside more than one enclosing forEach only via nesting, so this is
4801
+ * always the SINGLE nearest one, not a list.
4802
+ *
4803
+ * This is what tells a genuinely repeated per-child template
4804
+ * (`axis="ch"`, `ptType` absent or `"node"`) apart from a once-only or
4805
+ * transition-only sibling that merely happens to sit inside SOME
4806
+ * `dgm:forEach` (a `ptType="parTrans"`/`"sibTrans"` connector, or
4807
+ * `axis="followSib" cnt="1"`) - both can be direct siblings under the
4808
+ * SAME parent layoutNode (`lProcess1`'s `vertFlow` has one forEach for
4809
+ * its `parTrans` connector and a SEPARATE one, `axis="ch"`, for its
4810
+ * repeated `child` items; `vertFlow.forEach` bundles both, but only
4811
+ * `child.forEachOrigin` says which ONE produced it). See
4812
+ * `smartart-layout-interpreter-item-roles-recursive.ts`, the one
4813
+ * consumer. Read-only / interpretation-only, like `allConstraints`:
4814
+ * never round-tripped by `applySmartArtLayoutDefinition`.
4815
+ */
4816
+ forEachOrigin?: PptxSmartArtIteratorAttributes;
4817
+ /**
4818
+ * The condition of the NEAREST enclosing `dgm:if` this node was found
4819
+ * through, when `nestedLayoutNodes` (`smartart-layout-definition.ts`)
4820
+ * reached it via a `dgm:choose`'s `if` branch (as opposed to a direct
4821
+ * child, a `dgm:else` branch - always `undefined` here, see below - or a
4822
+ * `dgm:forEach`, which sets {@link forEachOrigin} instead). Lets a
4823
+ * caller that already has the data-model node list decide whether this
4824
+ * node's OWN branch is genuinely live for a specific point, instead of
4825
+ * treating every choose-flattened branch as unconditionally present
4826
+ * (`nestedLayoutNodes`' pre-existing "flatten every branch" convention,
4827
+ * still the default when this is absent or a caller does not evaluate
4828
+ * it) - e.g. `cycle-matrix--fallback-n2.pptx`'s `child1group`..
4829
+ * `child4group`, each gated on a DIFFERENT top-level point existing and
4830
+ * having its own child (`axis="ch ch" st="N 1" cnt="1 0" func="cnt"
4831
+ * op="gte" val="1"`).
4832
+ *
4833
+ * Deliberately `undefined` for a `dgm:else` branch: ECMA-376 defines it
4834
+ * as "none of the sibling ifs matched", which would need the FULL
4835
+ * sibling list's conditions negated and ANDed together, not a single
4836
+ * condition - no gallery fixture measured needs an else branch's own
4837
+ * guard yet, so it is left unconditional (rendered by default, matching
4838
+ * the pre-existing flatten-everything behaviour) rather than guessed at.
4839
+ * Evaluate with `smartart-layout-interpreter-when.ts`'s `evaluateWhen`.
4840
+ */
4841
+ chooseGuard?: PptxSmartArtWhen;
4545
4842
  }
4546
4843
  /** Metadata and root node from DiagramML CT_DiagramDefinition. */
4547
4844
  interface PptxSmartArtLayoutDefinition {
@@ -5174,6 +5471,14 @@ interface PptxSmartArtData {
5174
5471
  * Consulted by the fallback layout engine for direction/org-chart hints.
5175
5472
  */
5176
5473
  presLayoutVars?: PptxSmartArtPresLayoutVars;
5474
+ /**
5475
+ * The deck's own theme minor-Latin font (`a:fontScheme/a:minorFont/a:latin/
5476
+ * @typeface`): what SmartArt text actually renders in when no per-run
5477
+ * `a:latin` override is present (the common case - see
5478
+ * `smartart-layout-item-font-size.ts`'s font-fit, the one consumer).
5479
+ * Undefined when the theme carries no font scheme at all.
5480
+ */
5481
+ themeMinorFont?: string;
5177
5482
  /** Relationship ID for the diagram data part (for round-trip save). */
5178
5483
  dataRelId?: string;
5179
5484
  /** Relationship ID for the diagram layout part. */
@@ -6133,7 +6438,7 @@ interface SmartArtPptxElement extends PptxElementBase {
6133
6438
  *
6134
6439
  * Used to show type-specific icons and previews in the editor.
6135
6440
  */
6136
- type OleObjectType = 'excel' | 'word' | 'pdf' | 'visio' | 'mathtype' | 'package' | 'unknown';
6441
+ type OleObjectType = 'excel' | 'word' | 'powerpoint' | 'pdf' | 'visio' | 'mathtype' | 'package' | 'unknown';
6137
6442
  /**
6138
6443
  * An OLE (Object Linking and Embedding) object.
6139
6444
  *
@@ -6211,6 +6516,15 @@ interface OlePptxElement extends PptxElementBase {
6211
6516
  * `false`; `undefined` means the source authored no explicit value.
6212
6517
  */
6213
6518
  oleUpdateAutomatic?: boolean;
6519
+ /**
6520
+ * Set by the in-viewer OLE content editors (`ole-edit-api.ts`) whenever
6521
+ * `oleEmbeddedData` and/or `previewImageData` have been changed in memory
6522
+ * and still need to be written back into the saved package. Never
6523
+ * authored from a parsed file; purely an in-memory save signal, mirroring
6524
+ * `PptxSlide.isDirty`. The save writer clears it once the pending write
6525
+ * has been queued.
6526
+ */
6527
+ oleContentDirty?: boolean;
6214
6528
  /** Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`. */
6215
6529
  altText?: string;
6216
6530
  /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. */
@@ -6307,13 +6621,14 @@ interface MediaPptxElement extends PptxElementBase {
6307
6621
  */
6308
6622
  isLinked?: boolean;
6309
6623
  /**
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`).
6624
+ * Accessibility description. Read from `p:nvGraphicFramePr/p:cNvPr/@descr`
6625
+ * for the `p:graphicFrame`-shaped (SDK-created) media form, or from
6626
+ * `p:nvPicPr/p:cNvPr/@descr` for the `p:pic`-shaped media form (real
6627
+ * PowerPoint's usual authoring shape for a video/audio placeholder); see
6628
+ * `PptxHandlerRuntimePictureParsing.ts`.
6314
6629
  */
6315
6630
  altText?: string;
6316
- /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. Same scope note as {@link altText}. */
6631
+ /** Accessibility title, from the same `@title` attribute on whichever `p:cNvPr` the media form uses. Same scope note as {@link altText}. */
6317
6632
  title?: string;
6318
6633
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
6319
6634
  extensionXml?: PptxGraphicFrameExtension[];
@@ -6340,6 +6655,46 @@ interface GroupPptxElement extends PptxElementBase {
6340
6655
  children: PptxElement[];
6341
6656
  /** Fill style extracted from the group's `p:grpSpPr`, used for `a:grpFill` inheritance. */
6342
6657
  groupFill?: ShapeStyle;
6658
+ /**
6659
+ * The SAME `p:grpSpPr` extraction as {@link groupFill}, kept whenever the
6660
+ * group carries a `p:grpSpPr` at all, regardless of whether it resolved to
6661
+ * a paintable fill.
6662
+ *
6663
+ * `groupFill` is `undefined` unless the group has a real fill, because
6664
+ * `getGroupChildParentFill`/`groupChildInheritedFill` (the `a:grpFill`
6665
+ * inheritance chain) must keep chaining through an ancestor's fill when
6666
+ * THIS group has none of its own. A group whose `p:grpSpPr` authors only
6667
+ * `a:effectLst` (shadow/glow/soft-edge/reflection, no fill) needs those
6668
+ * effects to still reach the renderer, so they are kept here under a name
6669
+ * that carries no fill-inheritance meaning. Currently only reflection is
6670
+ * read from it (`getComputedEffectStyle`); the rest of `a:effectLst` on a
6671
+ * group remains unsupported.
6672
+ */
6673
+ groupEffectStyle?: ShapeStyle;
6674
+ /**
6675
+ * Exact EMU the group's own `a:chOff`/`a:chExt` (the coordinate space its
6676
+ * CHILDREN are authored in) were parsed from, alongside {@link
6677
+ * PptxElementBase.xEmu} etc for the group's own placement in its PARENT's
6678
+ * space. `undefined` when the source carried no usable `a:chOff`/`a:chExt`
6679
+ * (an SDK-created group, or one whose `a:xfrm` had no child-space data).
6680
+ *
6681
+ * Used by `group-xfrm-preservation.ts`'s `hasCapturedChildSpace` to decide
6682
+ * whether this group's original `a:chOff`/`a:chExt` can be re-emitted
6683
+ * verbatim (always true once captured, regardless of whether anything in
6684
+ * the subtree has moved or resized - only its DIRECT children's
6685
+ * `a:off`/`a:ext` are recomputed, via `invertChildIntoGroupSpace`, when
6686
+ * something changed), instead of the normalized `chOff 0,0` / `chExt ==
6687
+ * ext` space the writer falls back to when this is `undefined` (or
6688
+ * degenerate). See `group-shape-geometry.ts`'s module doc for why a group
6689
+ * needs two coordinate systems at all.
6690
+ */
6691
+ chOffXEmu?: number;
6692
+ /** See {@link chOffXEmu}. */
6693
+ chOffYEmu?: number;
6694
+ /** See {@link chOffXEmu}. */
6695
+ chExtWidthEmu?: number;
6696
+ /** See {@link chOffXEmu}. */
6697
+ chExtHeightEmu?: number;
6343
6698
  }
6344
6699
  /**
6345
6700
  * A freehand ink / drawing stroke captured with a stylus or mouse.
@@ -6368,6 +6723,24 @@ interface InkPptxElement extends PptxElementBase {
6368
6723
  * variable-width strokes that reflect stylus/pen pressure.
6369
6724
  */
6370
6725
  inkPointPressures?: number[][];
6726
+ /**
6727
+ * Per-path arrays of per-point pen-tilt lean direction (degrees, straight
6728
+ * from `PointerEvent.tiltX` on supporting hardware).
6729
+ *
6730
+ * Each entry corresponds to the path at the same index in `inkPaths`, and
6731
+ * is paired positionally with {@link inkPointTiltY}. Present only when at
6732
+ * least one point in the stroke reported a genuinely non-zero tilt: a
6733
+ * device that never reports tilt (a mouse, or a stylus with no tilt
6734
+ * sensor) leaves both arrays absent, the same way `inkPointPressures` is
6735
+ * omitted when pressure never varies. When present, the renderer converts
6736
+ * the raw `(tiltX, tiltY)` vector into a lean angle + magnitude (see
6737
+ * `pptx-viewer-shared`'s `tiltChannelsFromVectors`) and widens the stroke
6738
+ * perpendicular to the lean direction, approximating a chisel-tip
6739
+ * calligraphy nib.
6740
+ */
6741
+ inkPointTiltX?: number[][];
6742
+ /** Per-path, per-point pen-tilt lean direction (degrees), paired with {@link inkPointTiltX}. */
6743
+ inkPointTiltY?: number[][];
6371
6744
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
6372
6745
  extensionXml?: PptxGraphicFrameExtension[];
6373
6746
  }
@@ -6401,6 +6774,20 @@ interface ContentPartInkStroke {
6401
6774
  * {@link tiltAngles}.
6402
6775
  */
6403
6776
  tiltMagnitudes?: number[];
6777
+ /**
6778
+ * Which InkML channel pair {@link tiltAngles}/{@link tiltMagnitudes} were
6779
+ * decoded from: `'azimuthAltitude'` when the source declared `AZIMUTH`
6780
+ * (optionally paired with `ALTITUDE`); omitted (implying `OTx`/`OTy`, i.e.
6781
+ * `'vector'`) otherwise, including for tilt this library itself captured
6782
+ * from the Draw tool's `PointerEvent.tiltX`/`tiltY`.
6783
+ *
6784
+ * A save that has to rewrite this content part's InkML (see
6785
+ * `inkml-content-part-writer.ts`) uses this to re-declare the SAME channel
6786
+ * pair the file already used, rather than always converting to `OTx`/`OTy`;
6787
+ * the rendered lean is identical either way; only the written channel
6788
+ * NAMES differ.
6789
+ */
6790
+ tiltEncoding?: 'vector' | 'azimuthAltitude';
6404
6791
  }
6405
6792
  /**
6406
6793
  * A content-part element wrapped in `mc:AlternateContent`.
@@ -7067,10 +7454,27 @@ interface PptxNativeAnimation {
7067
7454
  buildLevel?: number;
7068
7455
  /** Group ID linking a `p:bldP` entry to its timing animation node. */
7069
7456
  groupId?: string;
7070
- /** Sound relationship ID to play when animation triggers (`p:stSnd`). */
7457
+ /**
7458
+ * Sound relationship ID to play when animation triggers. Modern PowerPoint
7459
+ * (COM-verified against 2016) writes this as a `p:audio/p:cMediaNode`
7460
+ * sibling of the effect's own `p:childTnLst`, targeting `p:sndTgt` rather
7461
+ * than a shape; the legacy `p:stSnd` form (directly on `p:cTn`) is still
7462
+ * accepted on load for round-trip of older-authored decks, but PowerPoint
7463
+ * itself no longer writes it and does not recognise it back
7464
+ * (`Effect.EffectInformation.SoundEffect` reads empty against it).
7465
+ */
7071
7466
  soundRId?: string;
7072
7467
  /** Resolved sound file path from relationship. */
7073
7468
  soundPath?: string;
7469
+ /**
7470
+ * The embedded sound's `@_name` (from `p:snd`/`p:sndTgt`). For one of
7471
+ * PowerPoint's 19 built-in stock sounds this is the exact upper-case file
7472
+ * name PowerPoint itself writes (e.g. `"CHIMES.WAV"`); see
7473
+ * `pptx-viewer-shared`'s `effect-sound-catalogue.ts`, which matches this
7474
+ * value back to a gallery entry. Absent for a custom sound with no name,
7475
+ * or when unresolved.
7476
+ */
7477
+ soundName?: string;
7074
7478
  /** Whether to stop any currently playing sound (`p:endSnd`). */
7075
7479
  stopSound?: boolean;
7076
7480
  /**
@@ -7235,17 +7639,28 @@ interface PptxNativeAnimation {
7235
7639
  */
7236
7640
  afterEffect?: boolean;
7237
7641
  /**
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.
7642
+ * "After animation" end-state behaviour: dim-to-colour, hide-after-
7643
+ * animation, or hide-on-next-click. Populated directly by the
7644
+ * native-timing parser (`native-animation-after-effect.ts`) when the
7645
+ * effect's `p:cTn/p:subTnLst` carries PowerPoint's genuine after-effect
7646
+ * shape, so a real-world deck's build shows up here even with no
7647
+ * `pptx:editorMeta`. `applyAfterAnimationFromEditorList` in
7648
+ * `pptx-viewer-shared` overrides this from the matching
7649
+ * {@link PptxElementAnimation.afterAnimation} entry when the editor's
7650
+ * per-element animation list has one (the model the animation panel
7651
+ * writes `afterAnimation` into), so an edit through our own UI always wins.
7245
7652
  */
7246
7653
  afterAnimationAction?: PptxAfterAnimationAction;
7247
- /** Dim-to color hex, present when {@link afterAnimationAction} is `dimToColor`. */
7654
+ /** Dim-to color hex, present when {@link afterAnimationAction} is `dimToColor` AND the dim target is an already-resolved `a:srgbClr`. */
7248
7655
  afterAnimationColor?: string;
7656
+ /**
7657
+ * The typed theme reference when a `dimToColor` target is an `a:schemeClr`
7658
+ * (e.g. `accent2`) instead of `a:srgbClr`: this parse layer has no theme to
7659
+ * resolve it to sRGB with (see {@link afterAnimationColor}'s doc), so a
7660
+ * playback consumer resolves this against the deck's theme colour map.
7661
+ * Mutually exclusive with {@link afterAnimationColor} being set.
7662
+ */
7663
+ afterAnimationColorRef?: PptxThemeColorRef;
7249
7664
  /**
7250
7665
  * Parsed `p:animEffect` filter descriptor. `presetId`/`presetClass` remain
7251
7666
  * the primary effect selector (see `resolveEffect` in `pptx-viewer-shared`);
@@ -7377,13 +7792,46 @@ interface PptxAnimationKeyframe {
7377
7792
  * fidelity; consumers may use it to drive computed animation values.
7378
7793
  */
7379
7794
  fmla?: string;
7795
+ /**
7796
+ * The typed theme reference when a `p:val/p:clrVal` stop is an
7797
+ * `a:schemeClr` (e.g. `accent1`), including any `tint`/`shade`/`lumMod`/
7798
+ * `lumOff`/`alpha` children. {@link value} keeps the bare scheme name for
7799
+ * round-trip; a playback consumer needs this ref (resolved against the
7800
+ * deck's theme colour map) to turn the stop into a real CSS colour, which
7801
+ * the bare name alone cannot do. Absent for an `a:srgbClr` stop, whose
7802
+ * {@link value} is already a resolved `#rrggbb` hex string.
7803
+ */
7804
+ colorRef?: PptxThemeColorRef;
7380
7805
  }
7381
7806
  /** One generic `p:anim` behaviour inside a composed PowerPoint effect. */
7382
7807
  interface PptxAttributeAnimation {
7383
7808
  /** Lowercased target attribute from `p:attrNameLst`. */
7384
7809
  attrName: string;
7385
- /** Authored value stops from this behaviour's `p:tavLst`. */
7810
+ /**
7811
+ * Authored value stops from this behaviour's `p:tavLst`. Empty when the
7812
+ * behaviour instead uses the simpler `from`/`to`/`by` attribute form (see
7813
+ * below); at least one of `keyframes`, `from`/`to`, or `by` is present.
7814
+ */
7386
7815
  keyframes: PptxAnimationKeyframe[];
7816
+ /**
7817
+ * `p:anim/@_from` (a formula string, ECMA-376 S19.5.4 CT_TLAnimateBehavior):
7818
+ * the absolute starting value, used instead of `p:tavLst` when the
7819
+ * behaviour only has two endpoints. PowerPoint writes this form for some
7820
+ * built-in presets (e.g. "Grow And Turn"'s `ppt_x` fly-in): a bare
7821
+ * `p:anim from="..." to="..."` with no `p:tavLst` child at all. See
7822
+ * `animation-ppt-formula-ground-truth.md` in `pptx-viewer-shared` for the
7823
+ * real-PowerPoint sample this was found in.
7824
+ */
7825
+ from?: string;
7826
+ /** `p:anim/@_to`: the absolute ending value. See {@link from}. */
7827
+ to?: string;
7828
+ /**
7829
+ * `p:anim/@_by`: a DELTA formula added to wherever the attribute already
7830
+ * stands (as opposed to `from`/`to`'s absolute values), typically paired
7831
+ * with `p:cBhvr/@_additive="sum"` so it composites with a sibling
7832
+ * behaviour driving the same attribute instead of replacing it.
7833
+ */
7834
+ by?: string;
7387
7835
  /** Duration from this behaviour's nested `p:cTn/@dur`. */
7388
7836
  durationMs?: number;
7389
7837
  /** Start offset from this behaviour's nested `p:stCondLst`. */
@@ -7392,8 +7840,11 @@ interface PptxAttributeAnimation {
7392
7840
  * Interpolation mode from this behaviour's own `@_calcmode`
7393
7841
  * (ST_TLAnimateBehaviorCalcMode, ECMA-376 S19.5.2): `discrete` snaps to
7394
7842
  * 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`.
7843
+ * interpolates linearly. `fmla` as the WHOLE behaviour's calc mode has
7844
+ * never been observed in a real PowerPoint file and is not consulted at
7845
+ * playback; what PowerPoint actually writes is `calcmode="lin"` with a
7846
+ * per-stop `p:tav/@fmla` (see {@link PptxAnimationKeyframe.fmla}), which
7847
+ * IS consulted regardless of this field's value. Absent means `lin`.
7397
7848
  */
7398
7849
  calcMode?: 'discrete' | 'lin' | 'fmla';
7399
7850
  }
@@ -7419,16 +7870,31 @@ interface PptxColorAnimation {
7419
7870
  * companion to `@dir` for HSL colour-space animations.
7420
7871
  */
7421
7872
  path?: string;
7422
- /** Starting color as hex string. */
7873
+ /** Starting color as hex string, or the bare scheme name (e.g. `accent1`) for a theme colour; see {@link fromColorRef}. */
7423
7874
  fromColor?: string;
7424
- /** Ending color as hex string. */
7875
+ /** Ending color as hex string, or the bare scheme name; see {@link toColorRef}. */
7425
7876
  toColor?: string;
7426
7877
  /**
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.
7878
+ * Color delta (for "by" animations) as hex string, or the bare scheme name;
7879
+ * see {@link byColorRef}. For HSL colour-space animations this retains the
7880
+ * historical byte-packed compatibility value; consumers should prefer
7881
+ * {@link hslDelta}, which preserves signed values.
7430
7882
  */
7431
7883
  byColor?: string;
7884
+ /**
7885
+ * The typed theme reference when {@link fromColor} is an `a:schemeClr`
7886
+ * (including `tint`/`shade`/`lumMod`/`lumOff`/`alpha`), so playback can
7887
+ * resolve it against the deck's theme colour map. Absent when `fromColor`
7888
+ * is already a resolved `#rrggbb` hex (an `a:srgbClr` stop).
7889
+ */
7890
+ fromColorRef?: PptxThemeColorRef;
7891
+ /** The typed theme reference for {@link toColor}; see {@link fromColorRef}. */
7892
+ toColorRef?: PptxThemeColorRef;
7893
+ /**
7894
+ * The typed theme reference for {@link byColor} (RGB colour space only; an
7895
+ * HSL `by` is a signed delta, never a theme colour). See {@link fromColorRef}.
7896
+ */
7897
+ byColorRef?: PptxThemeColorRef;
7432
7898
  /**
7433
7899
  * Typed HSL delta from `p:by/p:hsl`. This preserves signed values and their
7434
7900
  * OOXML units without forcing them through the legacy byte-packed `byColor`
@@ -7568,10 +8034,24 @@ interface PptxElementAnimation {
7568
8034
  motionPathRotationCenterX?: number;
7569
8035
  /** Motion-path rotation centre Y in slide percentage units (`p:rCtr/@y`). */
7570
8036
  motionPathRotationCenterY?: number;
7571
- /** Sound relationship ID to play when animation triggers (`p:stSnd`). */
8037
+ /**
8038
+ * Sound relationship ID to play when animation triggers. Written on save
8039
+ * as a `p:audio/p:cMediaNode` sibling of the effect's own `p:childTnLst`
8040
+ * (see `PptxNativeAnimation.soundRId` for the COM-verified detail).
8041
+ */
7572
8042
  soundRId?: string;
7573
8043
  /** Resolved sound file path from relationship. */
7574
8044
  soundPath?: string;
8045
+ /**
8046
+ * The `@_name` to write on the embedded sound (`p:sndTgt`). For a stock
8047
+ * gallery pick this is the exact PowerPoint file name (e.g.
8048
+ * `"CHIMES.WAV"`), which is what makes PowerPoint itself recognise the
8049
+ * sound as that built-in entry when it reopens the saved deck (there is no
8050
+ * separate "built-in" flag anywhere in the schema). Set by
8051
+ * `pptx-viewer-shared`'s `setEffectSound` when the pick carries a
8052
+ * `soundName`; absent for a custom file with no meaningful name.
8053
+ */
8054
+ soundName?: string;
7575
8055
  /** Whether to stop any currently playing sound (`p:endSnd`). */
7576
8056
  stopSound?: boolean;
7577
8057
  /**
@@ -7586,7 +8066,9 @@ interface PptxElementAnimation {
7586
8066
  /**
7587
8067
  * Display name for the chosen sound (e.g. the uploaded file's name),
7588
8068
  * shown by the authoring UI's sound picker. Purely cosmetic; has no
7589
- * OOXML equivalent and is not required for playback.
8069
+ * OOXML equivalent and is not required for playback. For a stock gallery
8070
+ * pick, the UI derives its label from {@link soundName} via the catalogue
8071
+ * instead of this field.
7590
8072
  */
7591
8073
  soundFileName?: string;
7592
8074
  /**
@@ -8641,13 +9123,13 @@ interface PptxSlide {
8641
9123
  backgroundPattern?: PptxSlideBackgroundPattern;
8642
9124
  /**
8643
9125
  * `<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
9126
+ * anchor the background gradient on the title placeholder as a
9127
+ * rectangular path gradient (COM-measured against real PowerPoint;
9128
+ * it does NOT recolour toward the title's text colour, despite the
9129
+ * attribute's name). Parsed and round-tripped here on the core model;
9130
+ * the actual visual effect is applied by `pptx-viewer-shared`'s
8647
9131
  * `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
9132
+ * consumed by all five bindings, not by core itself. Legacy PowerPoint
8651
9133
  * 97-2003 hint, not observed in any real-world corpus file this project
8652
9134
  * has collected and not settable from any modern PowerPoint UI; see
8653
9135
  * `docs/guide/limitations.md`.
@@ -9934,7 +10416,7 @@ interface PptxHandlerLoadOptions {
9934
10416
  allowExternalImages?: boolean;
9935
10417
  }
9936
10418
  /** Output format for the save pipeline. */
9937
- type PptxSaveFormat = 'pptx' | 'ppsx' | 'pptm';
10419
+ type PptxSaveFormat = 'pptx' | 'ppsx' | 'pptm' | 'ppt';
9938
10420
  interface PptxHandlerSaveOptions {
9939
10421
  headerFooter?: PptxHeaderFooter;
9940
10422
  presentationProperties?: PptxPresentationProperties;
@@ -10030,8 +10512,23 @@ interface PptxHandlerSaveOptions {
10030
10512
  * - `'pptx'` (default): Standard presentation.
10031
10513
  * - `'ppsx'`: Slide-show file (opens in presentation mode).
10032
10514
  * - `'pptm'`: Macro-enabled presentation (requires VBA data).
10515
+ * - `'ppt'`: Legacy binary PowerPoint 97-2003 presentation. Bypasses the
10516
+ * OOXML ZIP pipeline entirely; see `PptxHandlerRuntimeSaveLegacyPpt`.
10517
+ * Elements with no binary equivalent (charts, SmartArt, media, OLE, ink,
10518
+ * 3D models) are degraded to a rasterised preview picture or a labelled
10519
+ * placeholder, each reported via a `scope: 'save'`-adjacent
10520
+ * `PptxCompatibilityWarning`.
10033
10521
  */
10034
10522
  outputFormat?: PptxSaveFormat;
10523
+ /**
10524
+ * Password for RC4 CryptoAPI encryption of a `'ppt'`-format save. Ignored
10525
+ * for every other {@link outputFormat}; encrypting a `.pptx`/`.ppsx`/`.pptm`
10526
+ * save uses {@link IPptxHandlerRuntime.saveEncrypted}'s separate AES/Agile
10527
+ * OLE2 wrapping instead, since the legacy binary format's own encryption
10528
+ * scheme is embedded directly in the `.ppt` stream rather than wrapping an
10529
+ * already-produced package.
10530
+ */
10531
+ pptPassword?: string;
10035
10532
  /**
10036
10533
  * Embedded fonts to write back (or add) to the saved PPTX.
10037
10534
  *
@@ -10743,6 +11240,23 @@ declare class PptxHandler extends PptxHandlerCore {
10743
11240
  /** Supported merge shape operations (matching PowerPoint's Merge Shapes menu). */
10744
11241
  type MergeShapeOperation = 'union' | 'intersect' | 'subtract' | 'fragment' | 'combine';
10745
11242
 
11243
+ //#region src/render/animation-text-style-resolve.d.ts
11244
+ /**
11245
+ * Framework-neutral text-style override a font-style emphasis effect applies
11246
+ * on top of its target's own authored per-run bold/italic/underline/size/
11247
+ * colour. Every binding maps this onto its own text container so it OVERRIDES
11248
+ * the runs' inline styles (the runs carry explicit inline styles of their
11249
+ * own, so plain CSS inheritance cannot reach them).
11250
+ */
11251
+ interface TextStyleAnimationDescriptor {
11252
+ bold?: boolean;
11253
+ italic?: boolean;
11254
+ underline?: boolean;
11255
+ /** Relative multiplier against each run's own authored font size. */
11256
+ fontScale?: number;
11257
+ color?: string;
11258
+ }
11259
+
10746
11260
  /** Viewer interaction mode: read-only, edit, presentation, or master-view. */
10747
11261
  type ViewerMode = 'preview' | 'edit' | 'present' | 'master';
10748
11262
  /**
@@ -10909,22 +11423,15 @@ interface CollaborationConfig {
10909
11423
  writeBackDebounceMs?: number;
10910
11424
  }
10911
11425
  //#endregion
10912
- //#region src/render/animation-text-style-resolve.d.ts
11426
+ //#region src/render/animation-timeline-build-descriptors.d.ts
10913
11427
  /**
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).
11428
+ * `animation-timeline-build-descriptors` - staged-build (`p:bldChart` /
11429
+ * `p:bldDgm`) reveal descriptor types, split out of `animation-timeline-types`
11430
+ * to keep that module under the file-size limit. Re-exported from
11431
+ * `animation-timeline-types` so existing imports are unaffected.
11432
+ *
11433
+ * @module render/animation-timeline-build-descriptors
10919
11434
  */
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
11435
  /**
10929
11436
  * Normalized staged-reveal mode for a chart graphic frame, derived from the
10930
11437
  * OOXML `a:bldChart/@bld` (or `p:bldOleChart/@bld`) token:
@@ -10958,12 +11465,12 @@ interface ChartRevealPoint {
10958
11465
  * Playback-time chart reveal state derived from AUTHORED `p:graphicEl`
10959
11466
  * indices (see `chart-reveal-descriptor`'s `resolveChartRevealDescriptor`),
10960
11467
  * 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.
11468
+ * {@link import('./animation-timeline-group').ElementAnimationState.chartReveal}
11469
+ * only when every fired chart-build step for the element carried index data;
11470
+ * a renderer prefers this over the progress-based `build`/`ElementBuildState`
11471
+ * path when present, since it reflects the real authored reveal set (correct
11472
+ * even for a reversed-order or gapped chart build), and falls back to `build`
11473
+ * when absent.
10967
11474
  */
10968
11475
  interface ChartRevealDescriptor {
10969
11476
  /**
@@ -10984,12 +11491,13 @@ interface ChartRevealDescriptor {
10984
11491
  * Playback-time SmartArt diagram reveal state derived from AUTHORED
10985
11492
  * `p:graphicEl/p:dgm/@id` indices (see `diagram-reveal-descriptor`'s
10986
11493
  * `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.
11494
+ * progress. Present on
11495
+ * {@link import('./animation-timeline-group').ElementAnimationState.diagramReveal}
11496
+ * only when every fired diagram-build step for the element carried
11497
+ * `p:graphicEl` data. A SmartArt renderer prefers this over the
11498
+ * progress-based `build` / {@link ElementBuildState} path when present, since
11499
+ * it reflects the real authored reveal set (correct even for a
11500
+ * reversed-order or by-branch build), and falls back to `build` when absent.
10993
11501
  */
10994
11502
  interface DiagramRevealDescriptor {
10995
11503
  /**
@@ -11002,9 +11510,11 @@ interface DiagramRevealDescriptor {
11002
11510
  nodeIds: ReadonlySet<string>;
11003
11511
  }
11004
11512
  /**
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`).
11513
+ * Playback-time staged-build state surfaced on
11514
+ * {@link import('./animation-timeline-group').ElementAnimationState}.
11515
+ * `progress` is the 0..1 fraction of the build revealed at the current
11516
+ * playback time; a consumer maps it to its own item COUNT (see
11517
+ * `revealedStageCount`).
11008
11518
  */
11009
11519
  type ElementBuildState = {
11010
11520
  kind: 'chart';
@@ -11067,14 +11577,14 @@ interface ElementAnimationState {
11067
11577
  animatesStroke?: boolean;
11068
11578
  /**
11069
11579
  * 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.
11580
+ * {@link import('./animation-timeline-step').TimelineStep.textStyle}) a
11581
+ * font-style emphasis effect currently applies to this element's text,
11582
+ * OVERRIDING the runs' own inline bold/italic/underline/size/colour.
11583
+ * `animation-playback-engine.ts` writes this on step start and again on
11584
+ * cleanup (held in full when the effect's `p:cTn/@fill` holds its end
11585
+ * state, otherwise reverted); a text renderer maps it onto its run markup
11586
+ * via `buildTextStyleOverrideCss` (`animation-text-style-css.ts`). Absent
11587
+ * means no font-style emphasis effect is currently active on this element.
11078
11588
  */
11079
11589
  textStyle?: TextStyleAnimationDescriptor;
11080
11590
  }
@@ -11992,6 +12502,18 @@ interface ReadOnlyRecommendation {
11992
12502
  readonly messageKey: string;
11993
12503
  /** Whether a binding's "read-only" toggle should default to on. */
11994
12504
  readonly defaultReadOnly: boolean;
12505
+ /**
12506
+ * Whether lifting this recommendation requires a correct password, rather
12507
+ * than a plain "Edit anyway". True only for a `modifyVerifier` that carries
12508
+ * a hash this viewer can actually check (`hashData` plus a resolvable
12509
+ * algorithm, see `checkModifyPassword`; `saltData` is optional and NOT
12510
+ * required, a missing salt is still checkable). "Mark as Final" is purely
12511
+ * advisory and never requires one, and a `modifyVerifier` with no hash at
12512
+ * all, or naming an algorithm this viewer does not implement, cannot be
12513
+ * verified either way, so both fall back to the plain "Edit anyway" a
12514
+ * binding already had.
12515
+ */
12516
+ readonly requiresPassword: boolean;
11995
12517
  }
11996
12518
  interface CompatibilityWarningToast {
11997
12519
  /** Stable per-code id, since toasts are deduped by code (see module docs). */
@@ -12348,6 +12870,7 @@ interface ToolbarProps {
12348
12870
  onSaveAsPptx: () => void;
12349
12871
  onSaveAsPpsx: () => void;
12350
12872
  onSaveAsPptm: () => void;
12873
+ onSaveAsPpt: () => void;
12351
12874
  hasMacros: boolean;
12352
12875
  onCopySlideAsImage: () => void;
12353
12876
  onPrint: () => void;
@@ -13272,6 +13795,18 @@ interface UsePresentationModeInput {
13272
13795
  */
13273
13796
  templateElementsBySlideId?: Record<string, PptxElement[]>;
13274
13797
  visibleSlideIndexes: number[];
13798
+ /**
13799
+ * The slide canvas size (px), in the same unit the elements' own
13800
+ * `x`/`y`/`width`/`height` are authored in. Threaded to `useAnimationPlayback`
13801
+ * so a `p:anim` formula that needs the animated shape's real box (e.g. Grow
13802
+ * And Turn's `-#ppt_w/2` fly-in) can be resolved instead of falling back.
13803
+ */
13804
+ canvasSize?: {
13805
+ width: number;
13806
+ height: number;
13807
+ };
13808
+ /** The deck's resolved theme colour map, for a scheme-colour (`a:schemeClr`) animation stop. */
13809
+ themeColorMap?: Readonly<Record<string, string>>;
13275
13810
  activeSlideIndex: number;
13276
13811
  containerRef: React.RefObject<HTMLElement | null>;
13277
13812
  /** Raw PPTX bytes: forwarded to audience window for content sharing. */
@@ -14058,6 +14593,12 @@ interface UseLoadContentInput {
14058
14593
  }>>>;
14059
14594
  /** Whether the loaded deck recommends opening read-only (`p:modifyVerifier` / "Mark as Final"). */
14060
14595
  setReadOnlyRecommendation: React.Dispatch<React.SetStateAction<ReadOnlyRecommendation>>;
14596
+ /**
14597
+ * The deck's raw `p:modifyVerifier`, kept alongside the recommendation
14598
+ * above so the read-only banner's password prompt can check a candidate
14599
+ * password against it (`checkModifyPassword`, `pptx-viewer-shared`).
14600
+ */
14601
+ setModifyVerifier: React.Dispatch<React.SetStateAction<PptxModifyVerifier | undefined>>;
14061
14602
  /** Deck + slide compatibility-warning toast stack for this load. */
14062
14603
  setCompatToasts: React.Dispatch<React.SetStateAction<CompatibilityWarningToast[]>>;
14063
14604
  setLoading: React.Dispatch<React.SetStateAction<boolean>>;
@@ -14081,7 +14622,7 @@ interface UseLoadContentInput {
14081
14622
  interface UseLoadContentResult {
14082
14623
  handlerRef: React.MutableRefObject<PptxHandler | null>;
14083
14624
  }
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;
14625
+ 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
14626
  //#endregion
14086
14627
  //#region src/viewer/hooks/useElementOperations.d.ts
14087
14628
  /**
@@ -14648,6 +15189,7 @@ interface ExportHandlersResult {
14648
15189
  handleSaveAsPptx: () => void;
14649
15190
  handleSaveAsPpsx: () => void;
14650
15191
  handleSaveAsPptm: () => void;
15192
+ handleSaveAsPpt: () => void;
14651
15193
  handleCancelExport: () => void;
14652
15194
  exportModalOpen: boolean;
14653
15195
  exportModalTitle: string;
@@ -15055,6 +15597,18 @@ interface UsePresentationSetupInput {
15055
15597
  /** Master/layout shapes painted beneath each slide, by slide id (see `usePresentationMode`). */
15056
15598
  templateElementsBySlideId?: Record<string, PptxElement[]>;
15057
15599
  visibleSlideIndexes: number[];
15600
+ /**
15601
+ * The slide canvas size (px), in the same unit the elements' own
15602
+ * `x`/`y`/`width`/`height` are authored in. Threaded to `useAnimationPlayback`
15603
+ * so a `p:anim` formula that needs the animated shape's real box (e.g. Grow
15604
+ * And Turn's `-#ppt_w/2` fly-in) can be resolved instead of falling back.
15605
+ */
15606
+ canvasSize?: {
15607
+ width: number;
15608
+ height: number;
15609
+ };
15610
+ /** The deck's resolved theme colour map, for a scheme-colour (`a:schemeClr`) animation stop. */
15611
+ themeColorMap?: Readonly<Record<string, string>>;
15058
15612
  activeSlideIndex: number;
15059
15613
  containerRef: React.RefObject<HTMLElement | null>;
15060
15614
  /** Raw PPTX bytes: forwarded to audience window for content sharing. */
@@ -15223,6 +15777,8 @@ interface UseContentLifecycleInput {
15223
15777
  allowExternalImages?: boolean;
15224
15778
  /** Forwarded to {@link useLoadContent}: see `useReadOnlyRecommendationState`. */
15225
15779
  setReadOnlyRecommendation: React$1.Dispatch<React$1.SetStateAction<ReadOnlyRecommendation>>;
15780
+ /** Forwarded to {@link useLoadContent}: see `useReadOnlyRecommendationState`. */
15781
+ setModifyVerifier: React$1.Dispatch<React$1.SetStateAction<PptxModifyVerifier | undefined>>;
15226
15782
  /** Forwarded to {@link useLoadContent}: see `useCompatibilityToastsState`. */
15227
15783
  setCompatToasts: React$1.Dispatch<React$1.SetStateAction<CompatibilityWarningToast[]>>;
15228
15784
  }
@@ -15303,6 +15859,8 @@ interface UseViewerIntegrationInput {
15303
15859
  allowExternalImages?: boolean;
15304
15860
  /** Forwarded to `useContentLifecycle` -> `useLoadContent`: see `useReadOnlyRecommendationState`. */
15305
15861
  setReadOnlyRecommendation: Dispatch<SetStateAction<ReadOnlyRecommendation>>;
15862
+ /** Forwarded to `useContentLifecycle` -> `useLoadContent`: see `useReadOnlyRecommendationState`. */
15863
+ setModifyVerifier: Dispatch<SetStateAction<PptxModifyVerifier | undefined>>;
15306
15864
  /** Forwarded to `useContentLifecycle` -> `useLoadContent`: see `useCompatibilityToastsState`. */
15307
15865
  setCompatToasts: Dispatch<SetStateAction<CompatibilityWarningToast[]>>;
15308
15866
  canEdit: boolean;
@@ -15676,6 +16234,7 @@ interface ExportSaveAsResult {
15676
16234
  handleSaveAsPptx: () => void;
15677
16235
  handleSaveAsPpsx: () => void;
15678
16236
  handleSaveAsPptm: () => void;
16237
+ handleSaveAsPpt: () => void;
15679
16238
  }
15680
16239
  declare function useExportSaveAs(input: UseExportSaveAsInput): ExportSaveAsResult;
15681
16240
  //#endregion
@@ -15803,6 +16362,18 @@ interface UseAnimationPlaybackInput {
15803
16362
  onPlayActionSound?: (soundPath: string) => void;
15804
16363
  /** When false, all animations are skipped (elements shown immediately). */
15805
16364
  showWithAnimation?: boolean;
16365
+ /**
16366
+ * The slide canvas size (px), in the same unit the elements' own
16367
+ * `x`/`y`/`width`/`height` are authored in. Lets `PresentationAnimationController
16368
+ * .fromSlide` resolve a `p:anim` formula that needs the animated shape's real
16369
+ * box (e.g. Grow And Turn's `-#ppt_w/2` fly-in) instead of falling back.
16370
+ */
16371
+ canvasSize?: {
16372
+ width: number;
16373
+ height: number;
16374
+ };
16375
+ /** The deck's resolved theme colour map, for a scheme-colour (`a:schemeClr`) animation stop. */
16376
+ themeColorMap?: Readonly<Record<string, string>>;
15806
16377
  }
15807
16378
  /** How a slide's animation timeline should be seeded when it becomes active. */
15808
16379
  interface SeedSlideAnimationOptions {