pptx-react-viewer 3.7.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 (183) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/{AiChatPanel-M3AHKYPS.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-L5QGWVZK.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-AE2XYKDW.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-ZQLQK6L4.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-TZ6ADFBS.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-FQV62XOI.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-FEUY3PCE.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-5CKPAX63.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-BLXEALM6.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-V3DHIISV.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-GHHT3PDV.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-VZI2VARG.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/PowerPointViewer-Cl6jBPNw.d.ts.map +1 -1
  39. package/dist/{SmartArt3DScene-ZO3KFDI2.js → SmartArt3DScene-BK7QN3WT.js} +85 -23
  40. package/dist/SmartArt3DScene-BK7QN3WT.js.br +0 -0
  41. package/dist/SmartArt3DScene-BK7QN3WT.js.gz +0 -0
  42. package/dist/{SmartArt3DScene-XCFVGCXE.mjs → SmartArt3DScene-ODKCGJBO.mjs} +85 -23
  43. package/dist/SmartArt3DScene-ODKCGJBO.mjs.br +0 -0
  44. package/dist/SmartArt3DScene-ODKCGJBO.mjs.gz +0 -0
  45. package/dist/{SurfaceChart3DScene-T36E2HBA.mjs → SurfaceChart3DScene-IKPE2SVE.mjs} +19 -4
  46. package/dist/SurfaceChart3DScene-IKPE2SVE.mjs.br +0 -0
  47. package/dist/SurfaceChart3DScene-IKPE2SVE.mjs.gz +0 -0
  48. package/dist/{SurfaceChart3DScene-WWIMQ65D.js → SurfaceChart3DScene-VDK3F224.js} +19 -4
  49. package/dist/SurfaceChart3DScene-VDK3F224.js.br +0 -0
  50. package/dist/SurfaceChart3DScene-VDK3F224.js.gz +0 -0
  51. package/dist/{audience-content-store-bR7Gs_1S.d.ts → audience-content-store-CB2WVM1K.d.ts} +12 -3
  52. package/dist/{audience-content-store-bR7Gs_1S.d.ts.map → audience-content-store-CB2WVM1K.d.ts.map} +1 -1
  53. package/dist/{chunk-TUSALM3A.js → chunk-3NIJ5HIZ.js} +3650 -2503
  54. package/dist/chunk-3NIJ5HIZ.js.br +0 -0
  55. package/dist/chunk-3NIJ5HIZ.js.gz +0 -0
  56. package/dist/{chunk-WKODF5ZU.mjs → chunk-3Y63XPIN.mjs} +5 -2
  57. package/dist/chunk-3Y63XPIN.mjs.br +0 -0
  58. package/dist/chunk-3Y63XPIN.mjs.gz +0 -0
  59. package/dist/{chunk-OBE4TB76.js → chunk-5CPGDXD6.js} +632 -579
  60. package/dist/chunk-5CPGDXD6.js.br +0 -0
  61. package/dist/chunk-5CPGDXD6.js.gz +0 -0
  62. package/dist/{chunk-TXY2E7VQ.mjs → chunk-76Z3X6JX.mjs} +1684 -537
  63. package/dist/chunk-76Z3X6JX.mjs.br +0 -0
  64. package/dist/chunk-76Z3X6JX.mjs.gz +0 -0
  65. package/dist/chunk-DNR6CH6I.js +30 -0
  66. package/dist/chunk-DNR6CH6I.js.br +0 -0
  67. package/dist/chunk-DNR6CH6I.js.gz +0 -0
  68. package/dist/{chunk-DCNHUEWQ.js → chunk-G3JPCRKN.js} +18490 -10327
  69. package/dist/chunk-G3JPCRKN.js.br +0 -0
  70. package/dist/chunk-G3JPCRKN.js.gz +0 -0
  71. package/dist/{chunk-FGTMS7LR.mjs → chunk-JBSAKP4Z.mjs} +70 -4
  72. package/dist/chunk-JBSAKP4Z.mjs.br +0 -0
  73. package/dist/chunk-JBSAKP4Z.mjs.gz +0 -0
  74. package/dist/{chunk-3EJFZ7TE.js → chunk-K6Q6KLA6.js} +9 -5
  75. package/dist/chunk-K6Q6KLA6.js.br +0 -0
  76. package/dist/chunk-K6Q6KLA6.js.gz +0 -0
  77. package/dist/{chunk-VIFDZIVX.js → chunk-LBJAVP3H.js} +206 -179
  78. package/dist/chunk-LBJAVP3H.js.br +0 -0
  79. package/dist/chunk-LBJAVP3H.js.gz +0 -0
  80. package/dist/{chunk-JANUSAEK.mjs → chunk-NTWFXLZX.mjs} +35 -8
  81. package/dist/chunk-NTWFXLZX.mjs.br +0 -0
  82. package/dist/chunk-NTWFXLZX.mjs.gz +0 -0
  83. package/dist/{chunk-PC62KGU3.mjs → chunk-PCCM7NVY.mjs} +206 -153
  84. package/dist/chunk-PCCM7NVY.mjs.br +0 -0
  85. package/dist/chunk-PCCM7NVY.mjs.gz +0 -0
  86. package/dist/chunk-T6GFCLSM.mjs +27 -0
  87. package/dist/chunk-T6GFCLSM.mjs.br +4 -0
  88. package/dist/chunk-T6GFCLSM.mjs.gz +0 -0
  89. package/dist/{chunk-W24OJ7H5.js → chunk-TEVGDXVW.js} +70 -4
  90. package/dist/chunk-TEVGDXVW.js.br +0 -0
  91. package/dist/chunk-TEVGDXVW.js.gz +0 -0
  92. package/dist/{chunk-NV55GU5V.mjs → chunk-VQX7G75Z.mjs} +18447 -10316
  93. package/dist/chunk-VQX7G75Z.mjs.br +0 -0
  94. package/dist/chunk-VQX7G75Z.mjs.gz +0 -0
  95. package/dist/i18n.js +4 -4
  96. package/dist/i18n.js.br +0 -0
  97. package/dist/i18n.js.gz +0 -0
  98. package/dist/i18n.mjs +1 -1
  99. package/dist/i18n.mjs.br +0 -0
  100. package/dist/i18n.mjs.gz +0 -0
  101. package/dist/index.d.ts +545 -81
  102. package/dist/index.js +47 -47
  103. package/dist/index.js.br +0 -0
  104. package/dist/index.js.gz +0 -0
  105. package/dist/index.mjs +6 -6
  106. package/dist/index.mjs.br +0 -0
  107. package/dist/index.mjs.gz +0 -0
  108. package/dist/internals.d.ts +774 -229
  109. package/dist/internals.d.ts.map +1 -1
  110. package/dist/internals.js +79 -79
  111. package/dist/internals.js.br +0 -0
  112. package/dist/internals.js.gz +0 -0
  113. package/dist/internals.mjs +4 -4
  114. package/dist/internals.mjs.br +0 -0
  115. package/dist/internals.mjs.gz +0 -0
  116. package/dist/pptx-viewer.css +1 -1
  117. package/dist/pptx-viewer.css.br +0 -0
  118. package/dist/pptx-viewer.css.gz +0 -0
  119. package/dist/types-Bzdkiakq.d.ts.map +1 -1
  120. package/dist/viewer/index.d.ts +488 -66
  121. package/dist/viewer/index.js +27 -27
  122. package/dist/viewer/index.js.br +0 -0
  123. package/dist/viewer/index.js.gz +0 -0
  124. package/dist/viewer/index.mjs +6 -6
  125. package/dist/viewer/index.mjs.br +0 -0
  126. package/dist/viewer/index.mjs.gz +0 -0
  127. package/package.json +2 -2
  128. package/dist/AiChatPanel-L5QGWVZK.mjs.br +0 -0
  129. package/dist/AiChatPanel-L5QGWVZK.mjs.gz +0 -0
  130. package/dist/AiChatPanel-M3AHKYPS.js.br +0 -0
  131. package/dist/AiChatPanel-M3AHKYPS.js.gz +0 -0
  132. package/dist/Area3DChartScene-AE2XYKDW.mjs.br +0 -1
  133. package/dist/Area3DChartScene-AE2XYKDW.mjs.gz +0 -0
  134. package/dist/Area3DChartScene-ZQLQK6L4.js.br +0 -0
  135. package/dist/Area3DChartScene-ZQLQK6L4.js.gz +0 -0
  136. package/dist/Bar3DChartScene-FQV62XOI.mjs.br +0 -2
  137. package/dist/Bar3DChartScene-FQV62XOI.mjs.gz +0 -0
  138. package/dist/Bar3DChartScene-TZ6ADFBS.js.br +0 -0
  139. package/dist/Bar3DChartScene-TZ6ADFBS.js.gz +0 -0
  140. package/dist/Line3DChartScene-5CKPAX63.js.br +0 -0
  141. package/dist/Line3DChartScene-5CKPAX63.js.gz +0 -0
  142. package/dist/Line3DChartScene-FEUY3PCE.mjs.br +0 -1
  143. package/dist/Line3DChartScene-FEUY3PCE.mjs.gz +0 -0
  144. package/dist/Model3DScene-BLXEALM6.js.br +0 -0
  145. package/dist/Model3DScene-BLXEALM6.js.gz +0 -0
  146. package/dist/Model3DScene-V3DHIISV.mjs.br +0 -0
  147. package/dist/Model3DScene-V3DHIISV.mjs.gz +0 -0
  148. package/dist/PieChart3DScene-GHHT3PDV.js.br +0 -0
  149. package/dist/PieChart3DScene-GHHT3PDV.js.gz +0 -0
  150. package/dist/PieChart3DScene-VZI2VARG.mjs.br +0 -0
  151. package/dist/PieChart3DScene-VZI2VARG.mjs.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-T36E2HBA.mjs.br +0 -0
  157. package/dist/SurfaceChart3DScene-T36E2HBA.mjs.gz +0 -0
  158. package/dist/SurfaceChart3DScene-WWIMQ65D.js.br +0 -0
  159. package/dist/SurfaceChart3DScene-WWIMQ65D.js.gz +0 -0
  160. package/dist/chunk-3EJFZ7TE.js.br +0 -0
  161. package/dist/chunk-3EJFZ7TE.js.gz +0 -0
  162. package/dist/chunk-DCNHUEWQ.js.br +0 -0
  163. package/dist/chunk-DCNHUEWQ.js.gz +0 -0
  164. package/dist/chunk-FGTMS7LR.mjs.br +0 -0
  165. package/dist/chunk-FGTMS7LR.mjs.gz +0 -0
  166. package/dist/chunk-JANUSAEK.mjs.br +0 -0
  167. package/dist/chunk-JANUSAEK.mjs.gz +0 -0
  168. package/dist/chunk-NV55GU5V.mjs.br +0 -0
  169. package/dist/chunk-NV55GU5V.mjs.gz +0 -0
  170. package/dist/chunk-OBE4TB76.js.br +0 -0
  171. package/dist/chunk-OBE4TB76.js.gz +0 -0
  172. package/dist/chunk-PC62KGU3.mjs.br +0 -0
  173. package/dist/chunk-PC62KGU3.mjs.gz +0 -0
  174. package/dist/chunk-TUSALM3A.js.br +0 -0
  175. package/dist/chunk-TUSALM3A.js.gz +0 -0
  176. package/dist/chunk-TXY2E7VQ.mjs.br +0 -0
  177. package/dist/chunk-TXY2E7VQ.mjs.gz +0 -0
  178. package/dist/chunk-VIFDZIVX.js.br +0 -0
  179. package/dist/chunk-VIFDZIVX.js.gz +0 -0
  180. package/dist/chunk-W24OJ7H5.js.br +0 -0
  181. package/dist/chunk-W24OJ7H5.js.gz +0 -0
  182. package/dist/chunk-WKODF5ZU.mjs.br +0 -0
  183. package/dist/chunk-WKODF5ZU.mjs.gz +0 -0
package/dist/index.d.ts CHANGED
@@ -2165,6 +2165,29 @@ interface PptxElementBase {
2165
2165
  y: number;
2166
2166
  width: number;
2167
2167
  height: number;
2168
+ /**
2169
+ * The exact EMU integer `x` was parsed from (the `a:off/@_x` this
2170
+ * element's own `a:xfrm` carried on load), when the parser could resolve
2171
+ * one. `x` itself is always `Math.round(xEmu / EMU_PER_PX)` at parse
2172
+ * time, but that rounding is lossy: re-deriving EMU from `x` on save
2173
+ * (`Math.round(x * EMU_PER_PX)`) can drift from the original value by up
2174
+ * to half a pixel's worth of EMU on every load/save cycle even when
2175
+ * nothing touched this element. Kept alongside `x` (not instead of it) so
2176
+ * every consumer that only cares about on-screen position is unaffected;
2177
+ * only the save-side xfrm writer (`resolveXfrmEmu` in
2178
+ * `xfrm-emu-resolution.ts`) reads this, and only when `x` still equals
2179
+ * `Math.round(xEmu / EMU_PER_PX)` (i.e. nothing moved this element since
2180
+ * load) does it re-emit `xEmu` verbatim instead of re-quantizing `x`.
2181
+ * `undefined` for an SDK-created element or one whose transform could not
2182
+ * be resolved to a usable `a:off` on load.
2183
+ */
2184
+ xEmu?: number;
2185
+ /** The exact EMU integer `y` was parsed from (`a:off/@_y`). See {@link xEmu}. */
2186
+ yEmu?: number;
2187
+ /** The exact EMU integer `width` was parsed from (`a:ext/@_cx`). See {@link xEmu}. */
2188
+ widthEmu?: number;
2189
+ /** The exact EMU integer `height` was parsed from (`a:ext/@_cy`). See {@link xEmu}. */
2190
+ heightEmu?: number;
2168
2191
  rotation?: number;
2169
2192
  /** Skew along the X axis in degrees (parsed from `@_skewX` in 1/60000ths of a degree). */
2170
2193
  skewX?: number;
@@ -2414,7 +2437,38 @@ interface PptxChartDataPointPicture {
2414
2437
  //#region src/core/types/chart-pivot-format.d.ts
2415
2438
  interface PptxChartPivotFormat {
2416
2439
  index: number;
2440
+ /**
2441
+ * Typed projection of `spPr` (fill/stroke colour, stroke width, dash
2442
+ * style). When the parser is given a colour resolver (the normal case: the
2443
+ * runtime always supplies one), both a literal `a:srgbClr` and an
2444
+ * `a:schemeClr` theme reference (with its `lumMod`/`lumOff`/`tint`/`shade`
2445
+ * modifiers) resolve to a hex colour here, the same theme +
2446
+ * `c:clrMapOvr` chain the rest of chart parsing uses. Without a resolver
2447
+ * (e.g. a hand-built `PptxChartPivotFormat` with no theme to resolve
2448
+ * against), only the literal case resolves. Either way the authored node
2449
+ * is byte-preserved through {@link shapePropertiesXml} until this field is
2450
+ * set to something that no longer matches what re-parses off the current
2451
+ * XML; setting it then re-derives `shapePropertiesXml` on save (merged
2452
+ * onto whatever was already authored, keeping an unrelated schemeClr
2453
+ * reference alive when the colour itself is unchanged) unless
2454
+ * `shapePropertiesXml` is set explicitly, which wins.
2455
+ */
2456
+ shapeProperties?: PptxChartShapeProps;
2457
+ /**
2458
+ * Typed projection of `txPr`'s `a:p/a:pPr/a:defRPr` (size/bold/italic/
2459
+ * colour/family), the same shape a legend entry or data-table's text
2460
+ * override models. Colour resolution mirrors {@link shapeProperties}
2461
+ * (theme-resolved `schemeClr` when a colour resolver is supplied, literal
2462
+ * `srgbClr` otherwise). See {@link txPrXml} for the raw fallback.
2463
+ */
2464
+ textStyle?: PptxChartLegendTextStyle;
2465
+ /**
2466
+ * Typed projection of `marker` (symbol/size/spPr). See {@link markerXml}
2467
+ * for the raw fallback.
2468
+ */
2469
+ marker?: PptxChartMarker;
2417
2470
  shapePropertiesXml?: XmlObject | null;
2471
+ txPrXml?: XmlObject | null;
2418
2472
  markerXml?: XmlObject | null;
2419
2473
  dataLabelXml?: XmlObject | null;
2420
2474
  extensionListXml?: XmlObject | null;
@@ -2607,20 +2661,6 @@ interface PptxChartTitleRun {
2607
2661
  }
2608
2662
  //#endregion
2609
2663
  //#region src/core/types/chart-user-shapes.d.ts
2610
- /**
2611
- * Types for chart drawing-overlay shapes (`c:userShapes`).
2612
- *
2613
- * A chart's `c:userShapes` element carries an `r:id` that references a
2614
- * separate drawing part (`ppt/drawings/drawingN.xml`) whose root is a
2615
- * `c:userShapes` element populated with `cdr:relSizeAnchor` /
2616
- * `cdr:absSizeAnchor` wrappers around `sp` / `pic` / `cxnSp` shapes drawn on
2617
- * top of the chart plot. These interfaces describe the parsed, renderable
2618
- * overlay model. The raw reference is preserved separately on
2619
- * {@link PptxChartData.userShapesXml} for verbatim round-trip save; this model
2620
- * is render-only.
2621
- *
2622
- * @module pptx-types/chart-user-shapes
2623
- */
2624
2664
  /** A single paragraph of overlay-shape text with light formatting. */
2625
2665
  interface PptxChartUserShapeParagraph {
2626
2666
  /** Joined run text of the paragraph. */
@@ -2636,6 +2676,112 @@ interface PptxChartUserShapeParagraph {
2636
2676
  /** Paragraph alignment (`a:pPr/@algn`): left / centre / right. */
2637
2677
  align?: 'l' | 'ctr' | 'r';
2638
2678
  }
2679
+ /**
2680
+ * The DrawingML 2D group transform (`a:xfrm` inside `cdr:grpSpPr`) that
2681
+ * anchors a `grpSp`'s own box ({@link off}/{@link ext}) and establishes the
2682
+ * coordinate space its children are expressed in ({@link chOff}/{@link
2683
+ * chExt}), all in EMU. A child's position within the group is mapped into
2684
+ * the group's own box via
2685
+ * `frac = (child.off - chOff) / chExt`, then applied to the enclosing
2686
+ * anchor's box; see `flattenChartUserShapes` in
2687
+ * `chart-user-shapes-parser.ts`.
2688
+ */
2689
+ interface PptxChartUserShapeGroupTransform {
2690
+ /** The group's own position in its parent's coordinate space, in EMU. */
2691
+ off: {
2692
+ x: number;
2693
+ y: number;
2694
+ };
2695
+ /** The group's own size in its parent's coordinate space, in EMU. */
2696
+ ext: {
2697
+ cx: number;
2698
+ cy: number;
2699
+ };
2700
+ /** Origin of the child coordinate space (`a:chOff`), in EMU. */
2701
+ chOff: {
2702
+ x: number;
2703
+ y: number;
2704
+ };
2705
+ /** Size of the child coordinate space (`a:chExt`), in EMU. */
2706
+ chExt: {
2707
+ cx: number;
2708
+ cy: number;
2709
+ };
2710
+ /**
2711
+ * The group's own rotation in degrees (`a:xfrm/@rot`, stored in 60,000ths
2712
+ * of a degree), when present. Rotates the whole group, and everything
2713
+ * grouped inside it, as a rigid body about the CENTRE of the group's own
2714
+ * box ({@link off}/{@link ext}); see `flattenChartUserShapes` in
2715
+ * `chart-user-shapes-parser.ts` for how this composes onto each contained
2716
+ * leaf's own {@link PptxChartUserShapeGroupChild.rotation}. Verified
2717
+ * against real PowerPoint (COM): a `cdr:grpSp`'s `cdr:grpSpPr/a:xfrm` does
2718
+ * carry `rot` the same way an ordinary shape's does.
2719
+ */
2720
+ rotation?: number;
2721
+ /** The group's own horizontal flip (`a:xfrm/@flipH`), when present; composes onto children by XOR, see {@link rotation}'s doc. */
2722
+ flipH?: boolean;
2723
+ /** The group's own vertical flip (`a:xfrm/@flipV`), when present; composes onto children by XOR, see {@link rotation}'s doc. */
2724
+ flipV?: boolean;
2725
+ }
2726
+ /**
2727
+ * One shape grouped inside a `cdr:grpSp` (or a nested `cdr:grpSp` itself).
2728
+ * Unlike a top-level {@link PptxChartUserShape}, a group child has no
2729
+ * drawing anchor of its own: its position is expressed in its parent
2730
+ * group's child coordinate space via {@link off}/{@link ext} (EMU, read
2731
+ * from the child's own `a:xfrm`), not as a chart-relative fraction.
2732
+ */
2733
+ interface PptxChartUserShapeGroupChild {
2734
+ /** Shape kind, same vocabulary as {@link PptxChartUserShape.kind}. */
2735
+ kind: 'sp' | 'cxnSp' | 'pic' | 'grpSp' | 'graphicFrame';
2736
+ /** Position within the parent group's child coordinate space, in EMU. */
2737
+ off: {
2738
+ x: number;
2739
+ y: number;
2740
+ };
2741
+ /** Size within the parent group's child coordinate space, in EMU. */
2742
+ ext: {
2743
+ cx: number;
2744
+ cy: number;
2745
+ };
2746
+ /** Preset geometry name (`a:prstGeom/@prst`), defaulting to `"rect"`. */
2747
+ prst?: string;
2748
+ /** Resolved solid-fill hex colour, when present. */
2749
+ fill?: string;
2750
+ /** Resolved line/stroke hex colour, when present. */
2751
+ stroke?: string;
2752
+ /** Line width in points (`a:ln/@w` divided by 12700), when present. */
2753
+ strokeWidth?: number;
2754
+ /** Text paragraphs of the shape's `txBody`, when present. */
2755
+ paragraphs?: PptxChartUserShapeParagraph[];
2756
+ /**
2757
+ * A `pic` child's alt text (`cdr:nvPicPr/cdr:cNvPr/@descr`), when present.
2758
+ * Editable independently of {@link rawXml}'s otherwise-verbatim content:
2759
+ * the serializer patches only this attribute onto the cloned raw node.
2760
+ */
2761
+ altText?: string;
2762
+ /**
2763
+ * This child's OWN rotation in degrees (`a:xfrm/@rot`), when present.
2764
+ * Composes with every enclosing group's own
2765
+ * {@link PptxChartUserShapeGroupTransform.rotation} (added) to produce the
2766
+ * leaf's final on-screen rotation; see `flattenChartUserShapes`.
2767
+ */
2768
+ rotation?: number;
2769
+ /** This child's OWN horizontal flip (`a:xfrm/@flipH`); composes with an ancestor group's flip by XOR. */
2770
+ flipH?: boolean;
2771
+ /** This child's OWN vertical flip (`a:xfrm/@flipV`); composes with an ancestor group's flip by XOR. */
2772
+ flipV?: boolean;
2773
+ /**
2774
+ * Verbatim source XML of a `pic`/`graphicFrame` child, or of this node
2775
+ * itself when `kind === 'grpSp'` and the nested group is untouched since
2776
+ * parse. See {@link PptxChartUserShape.rawXml}'s doc for the same
2777
+ * contract one level up.
2778
+ */
2779
+ rawXml?: XmlObject;
2780
+ /** Present when `kind === 'grpSp'`: this nested group's own transform. */
2781
+ transform?: PptxChartUserShapeGroupTransform;
2782
+ /** Present when `kind === 'grpSp'`: this nested group's own children. */
2783
+ children?: PptxChartUserShapeGroupChild[];
2784
+ }
2639
2785
  /**
2640
2786
  * A parsed chart-overlay shape positioned by a drawing anchor.
2641
2787
  *
@@ -2646,12 +2792,13 @@ interface PptxChartUserShapeParagraph {
2646
2792
  interface PptxChartUserShape {
2647
2793
  /**
2648
2794
  * Shape kind: text/preset shape, connector, picture, a group of the
2649
- * above (`grpSp`, flattened: each grouped child becomes its own entry
2650
- * reusing the anchor's own bounding box, an approximation since the
2651
- * group's internal chOff/chExt transform is not applied), or a bare
2652
- * placeholder for a `graphicFrame` anchor child (deep content such as a
2653
- * nested chart or table is out of scope; it only keeps the anchor's
2654
- * space accounted for instead of the whole overlay disappearing).
2795
+ * above (`grpSp`, with its own {@link transform} and {@link children},
2796
+ * nested arbitrarily; use `flattenChartUserShapes` from
2797
+ * `chart-user-shapes-parser.ts` to get a flat, render-ready leaf list
2798
+ * with the group transform already applied), or a bare placeholder for
2799
+ * a `graphicFrame` anchor child (deep content such as a nested chart or
2800
+ * table is out of scope; it only keeps the anchor's space accounted for
2801
+ * instead of the whole overlay disappearing).
2655
2802
  */
2656
2803
  kind: 'sp' | 'cxnSp' | 'pic' | 'grpSp' | 'graphicFrame';
2657
2804
  /** Anchor kind that positioned the shape. */
@@ -2681,6 +2828,49 @@ interface PptxChartUserShape {
2681
2828
  strokeWidth?: number;
2682
2829
  /** Text paragraphs of the shape's `txBody`, when present. */
2683
2830
  paragraphs?: PptxChartUserShapeParagraph[];
2831
+ /**
2832
+ * A `pic` anchor's alt text (`cdr:nvPicPr/cdr:cNvPr/@descr`), when
2833
+ * present. Editable independently of {@link rawXml}'s otherwise-verbatim
2834
+ * content: the serializer patches only this attribute onto the cloned
2835
+ * raw node, so a picture's blip and other markup are untouched.
2836
+ */
2837
+ altText?: string;
2838
+ /**
2839
+ * This shape's OWN rotation in degrees (`a:xfrm/@rot`, on `spPr/a:xfrm`
2840
+ * for `sp`/`cxnSp`/`pic`, or directly on a top-level `graphicFrame`'s own
2841
+ * `a:xfrm`), when present. A top-level anchor's position/size is governed
2842
+ * by {@link from}/{@link to}/{@link ext}, never by this `a:xfrm`'s own
2843
+ * `off`/`ext` (see {@link rawXml}'s doc), but `rot`/`flipH`/`flipV` on that
2844
+ * same `a:xfrm` DO apply visually: verified against real PowerPoint (COM),
2845
+ * which writes e.g. `<a:xfrm rot="1800000"><a:off .../><a:ext .../></a:xfrm>`
2846
+ * on a rotated overlay shape's `spPr`, with the `off`/`ext` values
2847
+ * unrelated to the anchor's own `cdr:from`/`cdr:to`.
2848
+ */
2849
+ rotation?: number;
2850
+ /** This shape's OWN horizontal flip (`a:xfrm/@flipH`); see {@link rotation}'s doc. */
2851
+ flipH?: boolean;
2852
+ /** This shape's OWN vertical flip (`a:xfrm/@flipV`); see {@link rotation}'s doc. */
2853
+ flipV?: boolean;
2854
+ /**
2855
+ * Verbatim source XML of a `pic` or `graphicFrame` anchor child (the
2856
+ * `cdr:pic` / `cdr:graphicFrame` node itself, not the enclosing anchor),
2857
+ * or of the `cdr:grpSp` node itself when `kind === 'grpSp'` and the
2858
+ * group is untouched since parse (byte-identical passthrough). None of
2859
+ * these three kinds have a reconstructable typed representation that is
2860
+ * guaranteed lossless (a picture's blip reference, a nested chart/table's
2861
+ * graphic content, or a group's exact child ordering/ids), so the
2862
+ * serializer re-emits this verbatim when present instead of a lossy
2863
+ * rebuild. Editing a shape inside a group (via the SDK's path-based
2864
+ * overlay operations) clears the group's `rawXml` so the serializer
2865
+ * regenerates it from {@link transform}/{@link children} instead. Absent
2866
+ * for `sp`/`cxnSp`, which round-trip losslessly through their typed
2867
+ * fields above.
2868
+ */
2869
+ rawXml?: XmlObject;
2870
+ /** Present when `kind === 'grpSp'`: the group's own transform. */
2871
+ transform?: PptxChartUserShapeGroupTransform;
2872
+ /** Present when `kind === 'grpSp'`: the grouped children, nested arbitrarily. */
2873
+ children?: PptxChartUserShapeGroupChild[];
2684
2874
  }
2685
2875
  //#endregion
2686
2876
  //#region src/core/types/chart.d.ts
@@ -2690,7 +2880,7 @@ interface PptxChartUserShape {
2690
2880
  * @example
2691
2881
  * ```ts
2692
2882
  * const type: PptxChartType = "bar";
2693
- * // => "bar" one of: "bar" | "line" | "pie" | "doughnut" | "area" | "scatter" | …
2883
+ * // => "bar": one of: "bar" | "line" | "pie" | "doughnut" | "area" | "scatter" | …
2694
2884
  * ```
2695
2885
  */
2696
2886
  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';
@@ -2725,7 +2915,7 @@ type PptxBar3DShape = 'box' | 'cone' | 'coneToMax' | 'cylinder' | 'pyramid' | 'p
2725
2915
  * @example
2726
2916
  * ```ts
2727
2917
  * const type: PptxChartTrendlineType = "linear";
2728
- * // => "linear" one of: "linear" | "exponential" | "logarithmic" | "polynomial" | "power" | "movingAvg"
2918
+ * // => "linear": one of: "linear" | "exponential" | "logarithmic" | "polynomial" | "power" | "movingAvg"
2729
2919
  * ```
2730
2920
  */
2731
2921
  type PptxChartTrendlineType = 'linear' | 'exponential' | 'logarithmic' | 'polynomial' | 'power' | 'movingAvg';
@@ -2776,7 +2966,7 @@ type PptxChartErrBarType = 'both' | 'minus' | 'plus';
2776
2966
  * @example
2777
2967
  * ```ts
2778
2968
  * const valType: PptxChartErrValType = "percentage";
2779
- * // => "percentage" one of: "cust" | "fixedVal" | "percentage" | "stdDev" | "stdErr"
2969
+ * // => "percentage": one of: "cust" | "fixedVal" | "percentage" | "stdDev" | "stdErr"
2780
2970
  * ```
2781
2971
  */
2782
2972
  type PptxChartErrValType = 'cust' | 'fixedVal' | 'percentage' | 'stdDev' | 'stdErr';
@@ -2895,6 +3085,14 @@ interface PptxChartDataPoint {
2895
3085
  bubble3D?: boolean;
2896
3086
  /** Per-point picture-fill flags (`c:dPt/c:pictureOptions`). */
2897
3087
  picture?: PptxChartDataPointPicture;
3088
+ /**
3089
+ * This point's identity GUID (`c:dPt/c:extLst/c:ext/c16:uniqueId/@val`,
3090
+ * the Office 2014+ `{C3380CC4-5D6E-409C-BE32-E72D297353CC}` chart
3091
+ * extension), read-only here: an edited point keeps its existing
3092
+ * `c:extLst` as passthrough (see `chart-datapoint-serializer.ts`), so this
3093
+ * field exists for introspection rather than round-trip.
3094
+ */
3095
+ uniqueId?: string;
2898
3096
  }
2899
3097
  /** Schema values accepted by `c:dLblPos`. */
2900
3098
  type PptxChartDataLabelPosition = 'bestFit' | 'b' | 'ctr' | 'inBase' | 'inEnd' | 'l' | 'outEnd' | 'r' | 't';
@@ -2971,7 +3169,7 @@ interface PptxChartAxisFormatting extends PptxChartAxisLabelFormatting {
2971
3169
  axPos?: 'b' | 'l' | 'r' | 't';
2972
3170
  /** Unique axis identifier (c:axId/@val) used to link series to axes. */
2973
3171
  axisId?: number;
2974
- /** Cross-axis identifier the axis this axis crosses. */
3172
+ /** Cross-axis identifier: the axis this axis crosses. */
2975
3173
  crossAxisId?: number;
2976
3174
  /** Automatic crossing mode (`c:crosses`). Mutually exclusive with `crossesAt`. */
2977
3175
  crosses?: 'autoZero' | 'min' | 'max';
@@ -3223,6 +3421,54 @@ interface PptxChartSeries {
3223
3421
  waterfallOptions?: PptxChartWaterfallOptions;
3224
3422
  regionMapOptions?: PptxChartRegionMapOptions;
3225
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;
3226
3472
  }
3227
3473
  /**
3228
3474
  * Chart-level data-label options (`c:dLbls` directly under a chart-type
@@ -3246,6 +3492,19 @@ interface PptxChartDataLabelOptions {
3246
3492
  separator?: string;
3247
3493
  /** Show leader lines where supported (`c:showLeaderLines`). */
3248
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;
3249
3508
  /**
3250
3509
  * Label position (`c:dLblPos`). Valid values depend on the chart type
3251
3510
  * (`ctr`, `inEnd`, `inBase`, `outEnd`, `bestFit`, `l`, `r`, `t`, `b`).
@@ -3399,12 +3658,12 @@ interface PptxBubbleChartOptions {
3399
3658
  *
3400
3659
  * All fields are optional and round-trip verbatim.
3401
3660
  *
3402
- * - {@link rotX} X-axis rotation in degrees (-90…90).
3403
- * - {@link rotY} Y-axis rotation in degrees (0…360).
3404
- * - {@link depthPercent} chart depth as a percentage of base width.
3405
- * - {@link rAngAx} `true` if axes meet at right angles.
3406
- * - {@link perspective} perspective angle in degrees (0…240).
3407
- * - {@link hPercent} height as a percentage of chart width.
3661
+ * - {@link rotX}: X-axis rotation in degrees (-90…90).
3662
+ * - {@link rotY}: Y-axis rotation in degrees (0…360).
3663
+ * - {@link depthPercent}: chart depth as a percentage of base width.
3664
+ * - {@link rAngAx}: `true` if axes meet at right angles.
3665
+ * - {@link perspective}: perspective angle in degrees (0…240).
3666
+ * - {@link hPercent}: height as a percentage of chart width.
3408
3667
  */
3409
3668
  interface PptxChartView3D {
3410
3669
  rotX?: number;
@@ -3418,12 +3677,17 @@ interface PptxChartView3D {
3418
3677
  * Chart "chrome" flags from `c:chart` that round-trip cleanly even when
3419
3678
  * rendering ignores them.
3420
3679
  *
3421
- * - {@link autoTitleDeleted} `c:autoTitleDeleted/@val`. Suppresses the
3680
+ * - {@link autoTitleDeleted}: `c:autoTitleDeleted/@val`. Suppresses the
3422
3681
  * auto-generated title for single-series charts.
3423
- * - {@link dispBlanksAs} `c:dispBlanksAs/@val`. How blank cells
3682
+ * - {@link dispBlanksAs}: `c:dispBlanksAs/@val`. How blank cells
3424
3683
  * render: `"gap"`, `"zero"`, or `"span"`.
3425
- * - {@link showDLblsOverMax} `c:showDLblsOverMax/@val`. Keeps data
3684
+ * - {@link showDLblsOverMax}: `c:showDLblsOverMax/@val`. Keeps data
3426
3685
  * labels visible for points exceeding the value-axis maximum.
3686
+ * - {@link dispNaAsBlank}: the Office 2017+ chart extension
3687
+ * `c:extLst/c:ext/c16r3:dataDisplayOptions16/c16r3:dispNaAsBlank/@val`
3688
+ * (uri `{56B9EC1D-385E-4148-901F-78D8002777C0}`), PowerPoint's "Show #N/A
3689
+ * as an empty cell" chart option. Confirmed against real corpus markup
3690
+ * (`e2e/fixtures/chart-data-fidelity.pptx`).
3427
3691
  *
3428
3692
  * `c:plotVisOnly` lives on {@link PptxChartData.plotVisibleOnly} and is
3429
3693
  * intentionally not duplicated here.
@@ -3432,6 +3696,7 @@ interface PptxChartChrome {
3432
3696
  autoTitleDeleted?: boolean;
3433
3697
  dispBlanksAs?: 'gap' | 'zero' | 'span';
3434
3698
  showDLblsOverMax?: boolean;
3699
+ dispNaAsBlank?: boolean;
3435
3700
  }
3436
3701
  /** Manual chart placement from `c:layout/c:manualLayout` (CT_ManualLayout). */
3437
3702
  interface PptxChartManualLayout {
@@ -3527,6 +3792,13 @@ interface PptxChartData {
3527
3792
  categoryLevels?: string[][];
3528
3793
  dateCategories?: PptxChartDateCategories;
3529
3794
  series: PptxChartSeries[];
3795
+ /**
3796
+ * Series hidden from the plot by PowerPoint's "Chart Filters" feature
3797
+ * (Series tab) but still present in the workbook, aggregated across every
3798
+ * chart-type container (combo charts can carry more than one). Absent
3799
+ * when the chart has no such extension. See {@link PptxChartFilteredSeries}.
3800
+ */
3801
+ filteredSeries?: PptxChartFilteredSeries[];
3530
3802
  /** Chart style/formatting metadata. */
3531
3803
  style?: PptxChartStyle;
3532
3804
  /** Grouping mode for bar/area/line charts: 'clustered' | 'stacked' | 'percentStacked' */
@@ -3650,9 +3922,9 @@ interface PptxChartData {
3650
3922
  /**
3651
3923
  * Color cycling method from the chart color style part's `meth` attribute.
3652
3924
  *
3653
- * - `"cycle"` repeat the palette colours in order (default)
3654
- * - `"withinLinear"` gradient within each series
3655
- * - `"acrossLinear"` gradient across series
3925
+ * - `"cycle"`: repeat the palette colours in order (default)
3926
+ * - `"withinLinear"`: gradient within each series
3927
+ * - `"acrossLinear"`: gradient across series
3656
3928
  */
3657
3929
  colorMethod?: 'cycle' | 'withinLinear' | 'acrossLinear';
3658
3930
  /** Internal source color-style part path used for lossless dirty saves. */
@@ -5833,6 +6105,21 @@ interface PptxAccessibilityProperties {
5833
6105
  */
5834
6106
  isDecorative?: boolean;
5835
6107
  }
6108
+ /**
6109
+ * Accessibility description/title from `p:cNvPr/@descr` / `@title` on a
6110
+ * plain shape, text box or connector (`p:sp` / `p:cxnSp`). The same pair of
6111
+ * attributes already round-trips for a graphic frame (see
6112
+ * {@link TablePptxElement.altText}) and, `descr` only, for a picture
6113
+ * ({@link PptxImageProperties.altText}); this mixin extends it to the three
6114
+ * element kinds whose PowerPoint Alt Text pane data was previously dropped
6115
+ * on load because neither field existed on the model.
6116
+ */
6117
+ interface PptxNonVisualDescription {
6118
+ /** `p:cNvPr/@descr`. */
6119
+ altText?: string;
6120
+ /** `p:cNvPr/@title`. */
6121
+ title?: string;
6122
+ }
5836
6123
  /**
5837
6124
  * `a:cNvPicPr/@preferRelativeResize` (issue G13), a picture-only non-visual
5838
6125
  * property distinct from `a:picLocks`.
@@ -5865,7 +6152,7 @@ interface PptxPictureNonVisualProperties {
5865
6152
  * // => satisfies TextPptxElement
5866
6153
  * ```
5867
6154
  */
5868
- interface TextPptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties {
6155
+ interface TextPptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties, PptxNonVisualDescription {
5869
6156
  type: 'text';
5870
6157
  }
5871
6158
  /**
@@ -5883,7 +6170,7 @@ interface TextPptxElement extends PptxElementBase, PptxTextProperties, PptxShape
5883
6170
  * // => satisfies ShapePptxElement
5884
6171
  * ```
5885
6172
  */
5886
- interface ShapePptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties, PptxCustomPathProperties, PptxAccessibilityProperties {
6173
+ interface ShapePptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties, PptxCustomPathProperties, PptxAccessibilityProperties, PptxNonVisualDescription {
5887
6174
  type: 'shape';
5888
6175
  }
5889
6176
  /**
@@ -5905,7 +6192,7 @@ interface ShapePptxElement extends PptxElementBase, PptxTextProperties, PptxShap
5905
6192
  * // => satisfies ConnectorPptxElement
5906
6193
  * ```
5907
6194
  */
5908
- interface ConnectorPptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties {
6195
+ interface ConnectorPptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties, PptxNonVisualDescription {
5909
6196
  type: 'connector';
5910
6197
  }
5911
6198
  /**
@@ -6200,13 +6487,14 @@ interface MediaPptxElement extends PptxElementBase {
6200
6487
  */
6201
6488
  isLinked?: boolean;
6202
6489
  /**
6203
- * Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`.
6204
- * Only populated for the `p:graphicFrame`-shaped (SDK-created) media
6205
- * form; a `p:pic`-shaped media element's alt text is not currently
6206
- * parsed (see `PptxHandlerRuntimePictureParsing.ts`).
6490
+ * Accessibility description. Read from `p:nvGraphicFramePr/p:cNvPr/@descr`
6491
+ * for the `p:graphicFrame`-shaped (SDK-created) media form, or from
6492
+ * `p:nvPicPr/p:cNvPr/@descr` for the `p:pic`-shaped media form (real
6493
+ * PowerPoint's usual authoring shape for a video/audio placeholder); see
6494
+ * `PptxHandlerRuntimePictureParsing.ts`.
6207
6495
  */
6208
6496
  altText?: string;
6209
- /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. Same scope note as {@link altText}. */
6497
+ /** Accessibility title, from the same `@title` attribute on whichever `p:cNvPr` the media form uses. Same scope note as {@link altText}. */
6210
6498
  title?: string;
6211
6499
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
6212
6500
  extensionXml?: PptxGraphicFrameExtension[];
@@ -6233,6 +6521,46 @@ interface GroupPptxElement extends PptxElementBase {
6233
6521
  children: PptxElement[];
6234
6522
  /** Fill style extracted from the group's `p:grpSpPr`, used for `a:grpFill` inheritance. */
6235
6523
  groupFill?: ShapeStyle;
6524
+ /**
6525
+ * The SAME `p:grpSpPr` extraction as {@link groupFill}, kept whenever the
6526
+ * group carries a `p:grpSpPr` at all, regardless of whether it resolved to
6527
+ * a paintable fill.
6528
+ *
6529
+ * `groupFill` is `undefined` unless the group has a real fill, because
6530
+ * `getGroupChildParentFill`/`groupChildInheritedFill` (the `a:grpFill`
6531
+ * inheritance chain) must keep chaining through an ancestor's fill when
6532
+ * THIS group has none of its own. A group whose `p:grpSpPr` authors only
6533
+ * `a:effectLst` (shadow/glow/soft-edge/reflection, no fill) needs those
6534
+ * effects to still reach the renderer, so they are kept here under a name
6535
+ * that carries no fill-inheritance meaning. Currently only reflection is
6536
+ * read from it (`getComputedEffectStyle`); the rest of `a:effectLst` on a
6537
+ * group remains unsupported.
6538
+ */
6539
+ groupEffectStyle?: ShapeStyle;
6540
+ /**
6541
+ * Exact EMU the group's own `a:chOff`/`a:chExt` (the coordinate space its
6542
+ * CHILDREN are authored in) were parsed from, alongside {@link
6543
+ * PptxElementBase.xEmu} etc for the group's own placement in its PARENT's
6544
+ * space. `undefined` when the source carried no usable `a:chOff`/`a:chExt`
6545
+ * (an SDK-created group, or one whose `a:xfrm` had no child-space data).
6546
+ *
6547
+ * Used by `group-xfrm-preservation.ts`'s `hasCapturedChildSpace` to decide
6548
+ * whether this group's original `a:chOff`/`a:chExt` can be re-emitted
6549
+ * verbatim (always true once captured, regardless of whether anything in
6550
+ * the subtree has moved or resized - only its DIRECT children's
6551
+ * `a:off`/`a:ext` are recomputed, via `invertChildIntoGroupSpace`, when
6552
+ * something changed), instead of the normalized `chOff 0,0` / `chExt ==
6553
+ * ext` space the writer falls back to when this is `undefined` (or
6554
+ * degenerate). See `group-shape-geometry.ts`'s module doc for why a group
6555
+ * needs two coordinate systems at all.
6556
+ */
6557
+ chOffXEmu?: number;
6558
+ /** See {@link chOffXEmu}. */
6559
+ chOffYEmu?: number;
6560
+ /** See {@link chOffXEmu}. */
6561
+ chExtWidthEmu?: number;
6562
+ /** See {@link chOffXEmu}. */
6563
+ chExtHeightEmu?: number;
6236
6564
  }
6237
6565
  /**
6238
6566
  * A freehand ink / drawing stroke captured with a stylus or mouse.
@@ -6261,6 +6589,24 @@ interface InkPptxElement extends PptxElementBase {
6261
6589
  * variable-width strokes that reflect stylus/pen pressure.
6262
6590
  */
6263
6591
  inkPointPressures?: number[][];
6592
+ /**
6593
+ * Per-path arrays of per-point pen-tilt lean direction (degrees, straight
6594
+ * from `PointerEvent.tiltX` on supporting hardware).
6595
+ *
6596
+ * Each entry corresponds to the path at the same index in `inkPaths`, and
6597
+ * is paired positionally with {@link inkPointTiltY}. Present only when at
6598
+ * least one point in the stroke reported a genuinely non-zero tilt: a
6599
+ * device that never reports tilt (a mouse, or a stylus with no tilt
6600
+ * sensor) leaves both arrays absent, the same way `inkPointPressures` is
6601
+ * omitted when pressure never varies. When present, the renderer converts
6602
+ * the raw `(tiltX, tiltY)` vector into a lean angle + magnitude (see
6603
+ * `pptx-viewer-shared`'s `tiltChannelsFromVectors`) and widens the stroke
6604
+ * perpendicular to the lean direction, approximating a chisel-tip
6605
+ * calligraphy nib.
6606
+ */
6607
+ inkPointTiltX?: number[][];
6608
+ /** Per-path, per-point pen-tilt lean direction (degrees), paired with {@link inkPointTiltX}. */
6609
+ inkPointTiltY?: number[][];
6264
6610
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
6265
6611
  extensionXml?: PptxGraphicFrameExtension[];
6266
6612
  }
@@ -6294,6 +6640,20 @@ interface ContentPartInkStroke {
6294
6640
  * {@link tiltAngles}.
6295
6641
  */
6296
6642
  tiltMagnitudes?: number[];
6643
+ /**
6644
+ * Which InkML channel pair {@link tiltAngles}/{@link tiltMagnitudes} were
6645
+ * decoded from: `'azimuthAltitude'` when the source declared `AZIMUTH`
6646
+ * (optionally paired with `ALTITUDE`); omitted (implying `OTx`/`OTy`, i.e.
6647
+ * `'vector'`) otherwise, including for tilt this library itself captured
6648
+ * from the Draw tool's `PointerEvent.tiltX`/`tiltY`.
6649
+ *
6650
+ * A save that has to rewrite this content part's InkML (see
6651
+ * `inkml-content-part-writer.ts`) uses this to re-declare the SAME channel
6652
+ * pair the file already used, rather than always converting to `OTx`/`OTy`;
6653
+ * the rendered lean is identical either way; only the written channel
6654
+ * NAMES differ.
6655
+ */
6656
+ tiltEncoding?: 'vector' | 'azimuthAltitude';
6297
6657
  }
6298
6658
  /**
6299
6659
  * A content-part element wrapped in `mc:AlternateContent`.
@@ -7118,17 +7478,28 @@ interface PptxNativeAnimation {
7118
7478
  */
7119
7479
  afterEffect?: boolean;
7120
7480
  /**
7121
- * "After animation" end-state behaviour carried over from the matching
7122
- * {@link PptxElementAnimation.afterAnimation} entry for this effect's
7123
- * element. Not populated by the native-timing parser itself (there is no
7124
- * single `p:cTn` attribute for it): `applyAfterAnimationFromEditorList` in
7125
- * `pptx-viewer-shared` merges it in from the editor's per-element
7126
- * animation list before playback, since that is the model the animation
7127
- * panel writes `afterAnimation` into.
7481
+ * "After animation" end-state behaviour: dim-to-colour, hide-after-
7482
+ * animation, or hide-on-next-click. Populated directly by the
7483
+ * native-timing parser (`native-animation-after-effect.ts`) when the
7484
+ * effect's `p:cTn/p:subTnLst` carries PowerPoint's genuine after-effect
7485
+ * shape, so a real-world deck's build shows up here even with no
7486
+ * `pptx:editorMeta`. `applyAfterAnimationFromEditorList` in
7487
+ * `pptx-viewer-shared` overrides this from the matching
7488
+ * {@link PptxElementAnimation.afterAnimation} entry when the editor's
7489
+ * per-element animation list has one (the model the animation panel
7490
+ * writes `afterAnimation` into), so an edit through our own UI always wins.
7128
7491
  */
7129
7492
  afterAnimationAction?: PptxAfterAnimationAction;
7130
- /** Dim-to color hex, present when {@link afterAnimationAction} is `dimToColor`. */
7493
+ /** Dim-to color hex, present when {@link afterAnimationAction} is `dimToColor` AND the dim target is an already-resolved `a:srgbClr`. */
7131
7494
  afterAnimationColor?: string;
7495
+ /**
7496
+ * The typed theme reference when a `dimToColor` target is an `a:schemeClr`
7497
+ * (e.g. `accent2`) instead of `a:srgbClr`: this parse layer has no theme to
7498
+ * resolve it to sRGB with (see {@link afterAnimationColor}'s doc), so a
7499
+ * playback consumer resolves this against the deck's theme colour map.
7500
+ * Mutually exclusive with {@link afterAnimationColor} being set.
7501
+ */
7502
+ afterAnimationColorRef?: PptxThemeColorRef;
7132
7503
  /**
7133
7504
  * Parsed `p:animEffect` filter descriptor. `presetId`/`presetClass` remain
7134
7505
  * the primary effect selector (see `resolveEffect` in `pptx-viewer-shared`);
@@ -7260,13 +7631,46 @@ interface PptxAnimationKeyframe {
7260
7631
  * fidelity; consumers may use it to drive computed animation values.
7261
7632
  */
7262
7633
  fmla?: string;
7634
+ /**
7635
+ * The typed theme reference when a `p:val/p:clrVal` stop is an
7636
+ * `a:schemeClr` (e.g. `accent1`), including any `tint`/`shade`/`lumMod`/
7637
+ * `lumOff`/`alpha` children. {@link value} keeps the bare scheme name for
7638
+ * round-trip; a playback consumer needs this ref (resolved against the
7639
+ * deck's theme colour map) to turn the stop into a real CSS colour, which
7640
+ * the bare name alone cannot do. Absent for an `a:srgbClr` stop, whose
7641
+ * {@link value} is already a resolved `#rrggbb` hex string.
7642
+ */
7643
+ colorRef?: PptxThemeColorRef;
7263
7644
  }
7264
7645
  /** One generic `p:anim` behaviour inside a composed PowerPoint effect. */
7265
7646
  interface PptxAttributeAnimation {
7266
7647
  /** Lowercased target attribute from `p:attrNameLst`. */
7267
7648
  attrName: string;
7268
- /** Authored value stops from this behaviour's `p:tavLst`. */
7649
+ /**
7650
+ * Authored value stops from this behaviour's `p:tavLst`. Empty when the
7651
+ * behaviour instead uses the simpler `from`/`to`/`by` attribute form (see
7652
+ * below); at least one of `keyframes`, `from`/`to`, or `by` is present.
7653
+ */
7269
7654
  keyframes: PptxAnimationKeyframe[];
7655
+ /**
7656
+ * `p:anim/@_from` (a formula string, ECMA-376 S19.5.4 CT_TLAnimateBehavior):
7657
+ * the absolute starting value, used instead of `p:tavLst` when the
7658
+ * behaviour only has two endpoints. PowerPoint writes this form for some
7659
+ * built-in presets (e.g. "Grow And Turn"'s `ppt_x` fly-in): a bare
7660
+ * `p:anim from="..." to="..."` with no `p:tavLst` child at all. See
7661
+ * `animation-ppt-formula-ground-truth.md` in `pptx-viewer-shared` for the
7662
+ * real-PowerPoint sample this was found in.
7663
+ */
7664
+ from?: string;
7665
+ /** `p:anim/@_to`: the absolute ending value. See {@link from}. */
7666
+ to?: string;
7667
+ /**
7668
+ * `p:anim/@_by`: a DELTA formula added to wherever the attribute already
7669
+ * stands (as opposed to `from`/`to`'s absolute values), typically paired
7670
+ * with `p:cBhvr/@_additive="sum"` so it composites with a sibling
7671
+ * behaviour driving the same attribute instead of replacing it.
7672
+ */
7673
+ by?: string;
7270
7674
  /** Duration from this behaviour's nested `p:cTn/@dur`. */
7271
7675
  durationMs?: number;
7272
7676
  /** Start offset from this behaviour's nested `p:stCondLst`. */
@@ -7275,8 +7679,11 @@ interface PptxAttributeAnimation {
7275
7679
  * Interpolation mode from this behaviour's own `@_calcmode`
7276
7680
  * (ST_TLAnimateBehaviorCalcMode, ECMA-376 S19.5.2): `discrete` snaps to
7277
7681
  * each `p:tav` stop with no interpolation, `lin` (the OOXML default)
7278
- * interpolates linearly, `fmla` evaluates `p:tav/@fmla` (not consulted at
7279
- * playback here; formulas are round-tripped only). Absent means `lin`.
7682
+ * interpolates linearly. `fmla` as the WHOLE behaviour's calc mode has
7683
+ * never been observed in a real PowerPoint file and is not consulted at
7684
+ * playback; what PowerPoint actually writes is `calcmode="lin"` with a
7685
+ * per-stop `p:tav/@fmla` (see {@link PptxAnimationKeyframe.fmla}), which
7686
+ * IS consulted regardless of this field's value. Absent means `lin`.
7280
7687
  */
7281
7688
  calcMode?: 'discrete' | 'lin' | 'fmla';
7282
7689
  }
@@ -7302,16 +7709,31 @@ interface PptxColorAnimation {
7302
7709
  * companion to `@dir` for HSL colour-space animations.
7303
7710
  */
7304
7711
  path?: string;
7305
- /** Starting color as hex string. */
7712
+ /** Starting color as hex string, or the bare scheme name (e.g. `accent1`) for a theme colour; see {@link fromColorRef}. */
7306
7713
  fromColor?: string;
7307
- /** Ending color as hex string. */
7714
+ /** Ending color as hex string, or the bare scheme name; see {@link toColorRef}. */
7308
7715
  toColor?: string;
7309
7716
  /**
7310
- * Color delta (for "by" animations) as hex string. For HSL colour-space
7311
- * animations this retains the historical byte-packed compatibility value;
7312
- * consumers should prefer {@link hslDelta}, which preserves signed values.
7717
+ * Color delta (for "by" animations) as hex string, or the bare scheme name;
7718
+ * see {@link byColorRef}. For HSL colour-space animations this retains the
7719
+ * historical byte-packed compatibility value; consumers should prefer
7720
+ * {@link hslDelta}, which preserves signed values.
7313
7721
  */
7314
7722
  byColor?: string;
7723
+ /**
7724
+ * The typed theme reference when {@link fromColor} is an `a:schemeClr`
7725
+ * (including `tint`/`shade`/`lumMod`/`lumOff`/`alpha`), so playback can
7726
+ * resolve it against the deck's theme colour map. Absent when `fromColor`
7727
+ * is already a resolved `#rrggbb` hex (an `a:srgbClr` stop).
7728
+ */
7729
+ fromColorRef?: PptxThemeColorRef;
7730
+ /** The typed theme reference for {@link toColor}; see {@link fromColorRef}. */
7731
+ toColorRef?: PptxThemeColorRef;
7732
+ /**
7733
+ * The typed theme reference for {@link byColor} (RGB colour space only; an
7734
+ * HSL `by` is a signed delta, never a theme colour). See {@link fromColorRef}.
7735
+ */
7736
+ byColorRef?: PptxThemeColorRef;
7315
7737
  /**
7316
7738
  * Typed HSL delta from `p:by/p:hsl`. This preserves signed values and their
7317
7739
  * OOXML units without forcing them through the legacy byte-packed `byColor`
@@ -8524,13 +8946,13 @@ interface PptxSlide {
8524
8946
  backgroundPattern?: PptxSlideBackgroundPattern;
8525
8947
  /**
8526
8948
  * `<p:bgPr/@shadeToTitle>`: boolean flag instructing the renderer to
8527
- * shade the background gradient toward the title placeholder's text
8528
- * colour. Parsed and round-tripped here on the core model; the actual
8529
- * visual effect is applied by `pptx-viewer-shared`'s
8949
+ * anchor the background gradient on the title placeholder as a
8950
+ * rectangular path gradient (COM-measured against real PowerPoint;
8951
+ * it does NOT recolour toward the title's text colour, despite the
8952
+ * attribute's name). Parsed and round-tripped here on the core model;
8953
+ * the actual visual effect is applied by `pptx-viewer-shared`'s
8530
8954
  * `getSlideBackgroundStyle` (see `render/background-shade-to-title.ts`),
8531
- * consumed by all five bindings, not by core itself. That module's
8532
- * docstring explains the approximation: no published ECMA-376 or
8533
- * MS-ODRAWXML text documents the exact legacy blend. Legacy PowerPoint
8955
+ * consumed by all five bindings, not by core itself. Legacy PowerPoint
8534
8956
  * 97-2003 hint, not observed in any real-world corpus file this project
8535
8957
  * has collected and not settable from any modern PowerPoint UI; see
8536
8958
  * `docs/guide/limitations.md`.
@@ -10772,6 +11194,23 @@ declare const THEME_CATALOG: readonly ThemeCatalogEntry[];
10772
11194
  /** Look up a catalog entry by key, falling back to `undefined` (the built-in default) if not found. */
10773
11195
  declare function resolveThemeCatalogEntry(key: string | undefined, catalog?: readonly ThemeCatalogEntry[]): ViewerTheme | undefined;
10774
11196
 
11197
+ //#region src/render/animation-text-style-resolve.d.ts
11198
+ /**
11199
+ * Framework-neutral text-style override a font-style emphasis effect applies
11200
+ * on top of its target's own authored per-run bold/italic/underline/size/
11201
+ * colour. Every binding maps this onto its own text container so it OVERRIDES
11202
+ * the runs' inline styles (the runs carry explicit inline styles of their
11203
+ * own, so plain CSS inheritance cannot reach them).
11204
+ */
11205
+ interface TextStyleAnimationDescriptor {
11206
+ bold?: boolean;
11207
+ italic?: boolean;
11208
+ underline?: boolean;
11209
+ /** Relative multiplier against each run's own authored font size. */
11210
+ fontScale?: number;
11211
+ color?: string;
11212
+ }
11213
+
10775
11214
  /** Viewer interaction mode: read-only, edit, presentation, or master-view. */
10776
11215
  type ViewerMode = 'preview' | 'edit' | 'present' | 'master';
10777
11216
  /**
@@ -10937,6 +11376,16 @@ interface CollaborationConfig {
10937
11376
  */
10938
11377
  writeBackDebounceMs?: number;
10939
11378
  }
11379
+ //#endregion
11380
+ //#region src/render/animation-timeline-build-descriptors.d.ts
11381
+ /**
11382
+ * `animation-timeline-build-descriptors` - staged-build (`p:bldChart` /
11383
+ * `p:bldDgm`) reveal descriptor types, split out of `animation-timeline-types`
11384
+ * to keep that module under the file-size limit. Re-exported from
11385
+ * `animation-timeline-types` so existing imports are unaffected.
11386
+ *
11387
+ * @module render/animation-timeline-build-descriptors
11388
+ */
10940
11389
  /**
10941
11390
  * Normalized staged-reveal mode for a chart graphic frame, derived from the
10942
11391
  * OOXML `a:bldChart/@bld` (or `p:bldOleChart/@bld`) token:
@@ -10970,12 +11419,12 @@ interface ChartRevealPoint {
10970
11419
  * Playback-time chart reveal state derived from AUTHORED `p:graphicEl`
10971
11420
  * indices (see `chart-reveal-descriptor`'s `resolveChartRevealDescriptor`),
10972
11421
  * rather than from click-count/time progress. Present on
10973
- * {@link ElementAnimationState.chartReveal} only when every fired
10974
- * chart-build step for the element carried index data; a renderer prefers
10975
- * this over the progress-based `build`/`ElementBuildState` path when present,
10976
- * since it reflects the real authored reveal set (correct even for a
10977
- * reversed-order or gapped chart build), and falls back to `build` when
10978
- * absent.
11422
+ * {@link import('./animation-timeline-group').ElementAnimationState.chartReveal}
11423
+ * only when every fired chart-build step for the element carried index data;
11424
+ * a renderer prefers this over the progress-based `build`/`ElementBuildState`
11425
+ * path when present, since it reflects the real authored reveal set (correct
11426
+ * even for a reversed-order or gapped chart build), and falls back to `build`
11427
+ * when absent.
10979
11428
  */
10980
11429
  interface ChartRevealDescriptor {
10981
11430
  /**
@@ -10996,12 +11445,13 @@ interface ChartRevealDescriptor {
10996
11445
  * Playback-time SmartArt diagram reveal state derived from AUTHORED
10997
11446
  * `p:graphicEl/p:dgm/@id` indices (see `diagram-reveal-descriptor`'s
10998
11447
  * `resolveDiagramRevealDescriptor`), rather than from click-count/time
10999
- * progress. Present on {@link ElementAnimationState.diagramReveal} only when
11000
- * every fired diagram-build step for the element carried `p:graphicEl` data.
11001
- * A SmartArt renderer prefers this over the progress-based `build` /
11002
- * {@link ElementBuildState} path when present, since it reflects the real
11003
- * authored reveal set (correct even for a reversed-order or by-branch build),
11004
- * and falls back to `build` when absent.
11448
+ * progress. Present on
11449
+ * {@link import('./animation-timeline-group').ElementAnimationState.diagramReveal}
11450
+ * only when every fired diagram-build step for the element carried
11451
+ * `p:graphicEl` data. A SmartArt renderer prefers this over the
11452
+ * progress-based `build` / {@link ElementBuildState} path when present, since
11453
+ * it reflects the real authored reveal set (correct even for a
11454
+ * reversed-order or by-branch build), and falls back to `build` when absent.
11005
11455
  */
11006
11456
  interface DiagramRevealDescriptor {
11007
11457
  /**
@@ -11014,9 +11464,11 @@ interface DiagramRevealDescriptor {
11014
11464
  nodeIds: ReadonlySet<string>;
11015
11465
  }
11016
11466
  /**
11017
- * Playback-time staged-build state surfaced on {@link ElementAnimationState}.
11018
- * `progress` is the 0..1 fraction of the build revealed at the current playback
11019
- * time; a consumer maps it to its own item COUNT (see `revealedStageCount`).
11467
+ * Playback-time staged-build state surfaced on
11468
+ * {@link import('./animation-timeline-group').ElementAnimationState}.
11469
+ * `progress` is the 0..1 fraction of the build revealed at the current
11470
+ * playback time; a consumer maps it to its own item COUNT (see
11471
+ * `revealedStageCount`).
11020
11472
  */
11021
11473
  type ElementBuildState = {
11022
11474
  kind: 'chart';
@@ -11077,6 +11529,18 @@ interface ElementAnimationState {
11077
11529
  * `stroke: inherit`. Absent/false means no active stroke-colour animation.
11078
11530
  */
11079
11531
  animatesStroke?: boolean;
11532
+ /**
11533
+ * Active discrete font-style / colour / size override (see
11534
+ * {@link import('./animation-timeline-step').TimelineStep.textStyle}) a
11535
+ * font-style emphasis effect currently applies to this element's text,
11536
+ * OVERRIDING the runs' own inline bold/italic/underline/size/colour.
11537
+ * `animation-playback-engine.ts` writes this on step start and again on
11538
+ * cleanup (held in full when the effect's `p:cTn/@fill` holds its end
11539
+ * state, otherwise reverted); a text renderer maps it onto its run markup
11540
+ * via `buildTextStyleOverrideCss` (`animation-text-style-css.ts`). Absent
11541
+ * means no font-style emphasis effect is currently active on this element.
11542
+ */
11543
+ textStyle?: TextStyleAnimationDescriptor;
11080
11544
  }
11081
11545
  //#endregion
11082
11546
  //#region src/render/motion-path-authoring.d.ts