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
@@ -2147,6 +2147,29 @@ interface PptxElementBase {
2147
2147
  y: number;
2148
2148
  width: number;
2149
2149
  height: number;
2150
+ /**
2151
+ * The exact EMU integer `x` was parsed from (the `a:off/@_x` this
2152
+ * element's own `a:xfrm` carried on load), when the parser could resolve
2153
+ * one. `x` itself is always `Math.round(xEmu / EMU_PER_PX)` at parse
2154
+ * time, but that rounding is lossy: re-deriving EMU from `x` on save
2155
+ * (`Math.round(x * EMU_PER_PX)`) can drift from the original value by up
2156
+ * to half a pixel's worth of EMU on every load/save cycle even when
2157
+ * nothing touched this element. Kept alongside `x` (not instead of it) so
2158
+ * every consumer that only cares about on-screen position is unaffected;
2159
+ * only the save-side xfrm writer (`resolveXfrmEmu` in
2160
+ * `xfrm-emu-resolution.ts`) reads this, and only when `x` still equals
2161
+ * `Math.round(xEmu / EMU_PER_PX)` (i.e. nothing moved this element since
2162
+ * load) does it re-emit `xEmu` verbatim instead of re-quantizing `x`.
2163
+ * `undefined` for an SDK-created element or one whose transform could not
2164
+ * be resolved to a usable `a:off` on load.
2165
+ */
2166
+ xEmu?: number;
2167
+ /** The exact EMU integer `y` was parsed from (`a:off/@_y`). See {@link xEmu}. */
2168
+ yEmu?: number;
2169
+ /** The exact EMU integer `width` was parsed from (`a:ext/@_cx`). See {@link xEmu}. */
2170
+ widthEmu?: number;
2171
+ /** The exact EMU integer `height` was parsed from (`a:ext/@_cy`). See {@link xEmu}. */
2172
+ heightEmu?: number;
2150
2173
  rotation?: number;
2151
2174
  /** Skew along the X axis in degrees (parsed from `@_skewX` in 1/60000ths of a degree). */
2152
2175
  skewX?: number;
@@ -2396,7 +2419,38 @@ interface PptxChartDataPointPicture {
2396
2419
  //#region src/core/types/chart-pivot-format.d.ts
2397
2420
  interface PptxChartPivotFormat {
2398
2421
  index: number;
2422
+ /**
2423
+ * Typed projection of `spPr` (fill/stroke colour, stroke width, dash
2424
+ * style). When the parser is given a colour resolver (the normal case: the
2425
+ * runtime always supplies one), both a literal `a:srgbClr` and an
2426
+ * `a:schemeClr` theme reference (with its `lumMod`/`lumOff`/`tint`/`shade`
2427
+ * modifiers) resolve to a hex colour here, the same theme +
2428
+ * `c:clrMapOvr` chain the rest of chart parsing uses. Without a resolver
2429
+ * (e.g. a hand-built `PptxChartPivotFormat` with no theme to resolve
2430
+ * against), only the literal case resolves. Either way the authored node
2431
+ * is byte-preserved through {@link shapePropertiesXml} until this field is
2432
+ * set to something that no longer matches what re-parses off the current
2433
+ * XML; setting it then re-derives `shapePropertiesXml` on save (merged
2434
+ * onto whatever was already authored, keeping an unrelated schemeClr
2435
+ * reference alive when the colour itself is unchanged) unless
2436
+ * `shapePropertiesXml` is set explicitly, which wins.
2437
+ */
2438
+ shapeProperties?: PptxChartShapeProps;
2439
+ /**
2440
+ * Typed projection of `txPr`'s `a:p/a:pPr/a:defRPr` (size/bold/italic/
2441
+ * colour/family), the same shape a legend entry or data-table's text
2442
+ * override models. Colour resolution mirrors {@link shapeProperties}
2443
+ * (theme-resolved `schemeClr` when a colour resolver is supplied, literal
2444
+ * `srgbClr` otherwise). See {@link txPrXml} for the raw fallback.
2445
+ */
2446
+ textStyle?: PptxChartLegendTextStyle;
2447
+ /**
2448
+ * Typed projection of `marker` (symbol/size/spPr). See {@link markerXml}
2449
+ * for the raw fallback.
2450
+ */
2451
+ marker?: PptxChartMarker;
2399
2452
  shapePropertiesXml?: XmlObject | null;
2453
+ txPrXml?: XmlObject | null;
2400
2454
  markerXml?: XmlObject | null;
2401
2455
  dataLabelXml?: XmlObject | null;
2402
2456
  extensionListXml?: XmlObject | null;
@@ -2589,20 +2643,6 @@ interface PptxChartTitleRun {
2589
2643
  }
2590
2644
  //#endregion
2591
2645
  //#region src/core/types/chart-user-shapes.d.ts
2592
- /**
2593
- * Types for chart drawing-overlay shapes (`c:userShapes`).
2594
- *
2595
- * A chart's `c:userShapes` element carries an `r:id` that references a
2596
- * separate drawing part (`ppt/drawings/drawingN.xml`) whose root is a
2597
- * `c:userShapes` element populated with `cdr:relSizeAnchor` /
2598
- * `cdr:absSizeAnchor` wrappers around `sp` / `pic` / `cxnSp` shapes drawn on
2599
- * top of the chart plot. These interfaces describe the parsed, renderable
2600
- * overlay model. The raw reference is preserved separately on
2601
- * {@link PptxChartData.userShapesXml} for verbatim round-trip save; this model
2602
- * is render-only.
2603
- *
2604
- * @module pptx-types/chart-user-shapes
2605
- */
2606
2646
  /** A single paragraph of overlay-shape text with light formatting. */
2607
2647
  interface PptxChartUserShapeParagraph {
2608
2648
  /** Joined run text of the paragraph. */
@@ -2618,6 +2658,112 @@ interface PptxChartUserShapeParagraph {
2618
2658
  /** Paragraph alignment (`a:pPr/@algn`): left / centre / right. */
2619
2659
  align?: 'l' | 'ctr' | 'r';
2620
2660
  }
2661
+ /**
2662
+ * The DrawingML 2D group transform (`a:xfrm` inside `cdr:grpSpPr`) that
2663
+ * anchors a `grpSp`'s own box ({@link off}/{@link ext}) and establishes the
2664
+ * coordinate space its children are expressed in ({@link chOff}/{@link
2665
+ * chExt}), all in EMU. A child's position within the group is mapped into
2666
+ * the group's own box via
2667
+ * `frac = (child.off - chOff) / chExt`, then applied to the enclosing
2668
+ * anchor's box; see `flattenChartUserShapes` in
2669
+ * `chart-user-shapes-parser.ts`.
2670
+ */
2671
+ interface PptxChartUserShapeGroupTransform {
2672
+ /** The group's own position in its parent's coordinate space, in EMU. */
2673
+ off: {
2674
+ x: number;
2675
+ y: number;
2676
+ };
2677
+ /** The group's own size in its parent's coordinate space, in EMU. */
2678
+ ext: {
2679
+ cx: number;
2680
+ cy: number;
2681
+ };
2682
+ /** Origin of the child coordinate space (`a:chOff`), in EMU. */
2683
+ chOff: {
2684
+ x: number;
2685
+ y: number;
2686
+ };
2687
+ /** Size of the child coordinate space (`a:chExt`), in EMU. */
2688
+ chExt: {
2689
+ cx: number;
2690
+ cy: number;
2691
+ };
2692
+ /**
2693
+ * The group's own rotation in degrees (`a:xfrm/@rot`, stored in 60,000ths
2694
+ * of a degree), when present. Rotates the whole group, and everything
2695
+ * grouped inside it, as a rigid body about the CENTRE of the group's own
2696
+ * box ({@link off}/{@link ext}); see `flattenChartUserShapes` in
2697
+ * `chart-user-shapes-parser.ts` for how this composes onto each contained
2698
+ * leaf's own {@link PptxChartUserShapeGroupChild.rotation}. Verified
2699
+ * against real PowerPoint (COM): a `cdr:grpSp`'s `cdr:grpSpPr/a:xfrm` does
2700
+ * carry `rot` the same way an ordinary shape's does.
2701
+ */
2702
+ rotation?: number;
2703
+ /** The group's own horizontal flip (`a:xfrm/@flipH`), when present; composes onto children by XOR, see {@link rotation}'s doc. */
2704
+ flipH?: boolean;
2705
+ /** The group's own vertical flip (`a:xfrm/@flipV`), when present; composes onto children by XOR, see {@link rotation}'s doc. */
2706
+ flipV?: boolean;
2707
+ }
2708
+ /**
2709
+ * One shape grouped inside a `cdr:grpSp` (or a nested `cdr:grpSp` itself).
2710
+ * Unlike a top-level {@link PptxChartUserShape}, a group child has no
2711
+ * drawing anchor of its own: its position is expressed in its parent
2712
+ * group's child coordinate space via {@link off}/{@link ext} (EMU, read
2713
+ * from the child's own `a:xfrm`), not as a chart-relative fraction.
2714
+ */
2715
+ interface PptxChartUserShapeGroupChild {
2716
+ /** Shape kind, same vocabulary as {@link PptxChartUserShape.kind}. */
2717
+ kind: 'sp' | 'cxnSp' | 'pic' | 'grpSp' | 'graphicFrame';
2718
+ /** Position within the parent group's child coordinate space, in EMU. */
2719
+ off: {
2720
+ x: number;
2721
+ y: number;
2722
+ };
2723
+ /** Size within the parent group's child coordinate space, in EMU. */
2724
+ ext: {
2725
+ cx: number;
2726
+ cy: number;
2727
+ };
2728
+ /** Preset geometry name (`a:prstGeom/@prst`), defaulting to `"rect"`. */
2729
+ prst?: string;
2730
+ /** Resolved solid-fill hex colour, when present. */
2731
+ fill?: string;
2732
+ /** Resolved line/stroke hex colour, when present. */
2733
+ stroke?: string;
2734
+ /** Line width in points (`a:ln/@w` divided by 12700), when present. */
2735
+ strokeWidth?: number;
2736
+ /** Text paragraphs of the shape's `txBody`, when present. */
2737
+ paragraphs?: PptxChartUserShapeParagraph[];
2738
+ /**
2739
+ * A `pic` child's alt text (`cdr:nvPicPr/cdr:cNvPr/@descr`), when present.
2740
+ * Editable independently of {@link rawXml}'s otherwise-verbatim content:
2741
+ * the serializer patches only this attribute onto the cloned raw node.
2742
+ */
2743
+ altText?: string;
2744
+ /**
2745
+ * This child's OWN rotation in degrees (`a:xfrm/@rot`), when present.
2746
+ * Composes with every enclosing group's own
2747
+ * {@link PptxChartUserShapeGroupTransform.rotation} (added) to produce the
2748
+ * leaf's final on-screen rotation; see `flattenChartUserShapes`.
2749
+ */
2750
+ rotation?: number;
2751
+ /** This child's OWN horizontal flip (`a:xfrm/@flipH`); composes with an ancestor group's flip by XOR. */
2752
+ flipH?: boolean;
2753
+ /** This child's OWN vertical flip (`a:xfrm/@flipV`); composes with an ancestor group's flip by XOR. */
2754
+ flipV?: boolean;
2755
+ /**
2756
+ * Verbatim source XML of a `pic`/`graphicFrame` child, or of this node
2757
+ * itself when `kind === 'grpSp'` and the nested group is untouched since
2758
+ * parse. See {@link PptxChartUserShape.rawXml}'s doc for the same
2759
+ * contract one level up.
2760
+ */
2761
+ rawXml?: XmlObject;
2762
+ /** Present when `kind === 'grpSp'`: this nested group's own transform. */
2763
+ transform?: PptxChartUserShapeGroupTransform;
2764
+ /** Present when `kind === 'grpSp'`: this nested group's own children. */
2765
+ children?: PptxChartUserShapeGroupChild[];
2766
+ }
2621
2767
  /**
2622
2768
  * A parsed chart-overlay shape positioned by a drawing anchor.
2623
2769
  *
@@ -2628,12 +2774,13 @@ interface PptxChartUserShapeParagraph {
2628
2774
  interface PptxChartUserShape {
2629
2775
  /**
2630
2776
  * Shape kind: text/preset shape, connector, picture, a group of the
2631
- * above (`grpSp`, flattened: each grouped child becomes its own entry
2632
- * reusing the anchor's own bounding box, an approximation since the
2633
- * group's internal chOff/chExt transform is not applied), or a bare
2634
- * placeholder for a `graphicFrame` anchor child (deep content such as a
2635
- * nested chart or table is out of scope; it only keeps the anchor's
2636
- * space accounted for instead of the whole overlay disappearing).
2777
+ * above (`grpSp`, with its own {@link transform} and {@link children},
2778
+ * nested arbitrarily; use `flattenChartUserShapes` from
2779
+ * `chart-user-shapes-parser.ts` to get a flat, render-ready leaf list
2780
+ * with the group transform already applied), or a bare placeholder for
2781
+ * a `graphicFrame` anchor child (deep content such as a nested chart or
2782
+ * table is out of scope; it only keeps the anchor's space accounted for
2783
+ * instead of the whole overlay disappearing).
2637
2784
  */
2638
2785
  kind: 'sp' | 'cxnSp' | 'pic' | 'grpSp' | 'graphicFrame';
2639
2786
  /** Anchor kind that positioned the shape. */
@@ -2663,6 +2810,49 @@ interface PptxChartUserShape {
2663
2810
  strokeWidth?: number;
2664
2811
  /** Text paragraphs of the shape's `txBody`, when present. */
2665
2812
  paragraphs?: PptxChartUserShapeParagraph[];
2813
+ /**
2814
+ * A `pic` anchor's alt text (`cdr:nvPicPr/cdr:cNvPr/@descr`), when
2815
+ * present. Editable independently of {@link rawXml}'s otherwise-verbatim
2816
+ * content: the serializer patches only this attribute onto the cloned
2817
+ * raw node, so a picture's blip and other markup are untouched.
2818
+ */
2819
+ altText?: string;
2820
+ /**
2821
+ * This shape's OWN rotation in degrees (`a:xfrm/@rot`, on `spPr/a:xfrm`
2822
+ * for `sp`/`cxnSp`/`pic`, or directly on a top-level `graphicFrame`'s own
2823
+ * `a:xfrm`), when present. A top-level anchor's position/size is governed
2824
+ * by {@link from}/{@link to}/{@link ext}, never by this `a:xfrm`'s own
2825
+ * `off`/`ext` (see {@link rawXml}'s doc), but `rot`/`flipH`/`flipV` on that
2826
+ * same `a:xfrm` DO apply visually: verified against real PowerPoint (COM),
2827
+ * which writes e.g. `<a:xfrm rot="1800000"><a:off .../><a:ext .../></a:xfrm>`
2828
+ * on a rotated overlay shape's `spPr`, with the `off`/`ext` values
2829
+ * unrelated to the anchor's own `cdr:from`/`cdr:to`.
2830
+ */
2831
+ rotation?: number;
2832
+ /** This shape's OWN horizontal flip (`a:xfrm/@flipH`); see {@link rotation}'s doc. */
2833
+ flipH?: boolean;
2834
+ /** This shape's OWN vertical flip (`a:xfrm/@flipV`); see {@link rotation}'s doc. */
2835
+ flipV?: boolean;
2836
+ /**
2837
+ * Verbatim source XML of a `pic` or `graphicFrame` anchor child (the
2838
+ * `cdr:pic` / `cdr:graphicFrame` node itself, not the enclosing anchor),
2839
+ * or of the `cdr:grpSp` node itself when `kind === 'grpSp'` and the
2840
+ * group is untouched since parse (byte-identical passthrough). None of
2841
+ * these three kinds have a reconstructable typed representation that is
2842
+ * guaranteed lossless (a picture's blip reference, a nested chart/table's
2843
+ * graphic content, or a group's exact child ordering/ids), so the
2844
+ * serializer re-emits this verbatim when present instead of a lossy
2845
+ * rebuild. Editing a shape inside a group (via the SDK's path-based
2846
+ * overlay operations) clears the group's `rawXml` so the serializer
2847
+ * regenerates it from {@link transform}/{@link children} instead. Absent
2848
+ * for `sp`/`cxnSp`, which round-trip losslessly through their typed
2849
+ * fields above.
2850
+ */
2851
+ rawXml?: XmlObject;
2852
+ /** Present when `kind === 'grpSp'`: the group's own transform. */
2853
+ transform?: PptxChartUserShapeGroupTransform;
2854
+ /** Present when `kind === 'grpSp'`: the grouped children, nested arbitrarily. */
2855
+ children?: PptxChartUserShapeGroupChild[];
2666
2856
  }
2667
2857
  //#endregion
2668
2858
  //#region src/core/types/chart.d.ts
@@ -2672,7 +2862,7 @@ interface PptxChartUserShape {
2672
2862
  * @example
2673
2863
  * ```ts
2674
2864
  * const type: PptxChartType = "bar";
2675
- * // => "bar" one of: "bar" | "line" | "pie" | "doughnut" | "area" | "scatter" | …
2865
+ * // => "bar": one of: "bar" | "line" | "pie" | "doughnut" | "area" | "scatter" | …
2676
2866
  * ```
2677
2867
  */
2678
2868
  type PptxChartType = 'bar' | 'line' | 'pie' | 'ofPie' | 'doughnut' | 'area' | 'scatter' | 'bubble' | 'radar' | 'stock' | 'bar3D' | 'line3D' | 'pie3D' | 'area3D' | 'surface' | 'histogram' | 'waterfall' | 'funnel' | 'treemap' | 'sunburst' | 'boxWhisker' | 'regionMap' | 'combo' | 'unknown';
@@ -2707,7 +2897,7 @@ type PptxBar3DShape = 'box' | 'cone' | 'coneToMax' | 'cylinder' | 'pyramid' | 'p
2707
2897
  * @example
2708
2898
  * ```ts
2709
2899
  * const type: PptxChartTrendlineType = "linear";
2710
- * // => "linear" one of: "linear" | "exponential" | "logarithmic" | "polynomial" | "power" | "movingAvg"
2900
+ * // => "linear": one of: "linear" | "exponential" | "logarithmic" | "polynomial" | "power" | "movingAvg"
2711
2901
  * ```
2712
2902
  */
2713
2903
  type PptxChartTrendlineType = 'linear' | 'exponential' | 'logarithmic' | 'polynomial' | 'power' | 'movingAvg';
@@ -2758,7 +2948,7 @@ type PptxChartErrBarType = 'both' | 'minus' | 'plus';
2758
2948
  * @example
2759
2949
  * ```ts
2760
2950
  * const valType: PptxChartErrValType = "percentage";
2761
- * // => "percentage" one of: "cust" | "fixedVal" | "percentage" | "stdDev" | "stdErr"
2951
+ * // => "percentage": one of: "cust" | "fixedVal" | "percentage" | "stdDev" | "stdErr"
2762
2952
  * ```
2763
2953
  */
2764
2954
  type PptxChartErrValType = 'cust' | 'fixedVal' | 'percentage' | 'stdDev' | 'stdErr';
@@ -2877,6 +3067,14 @@ interface PptxChartDataPoint {
2877
3067
  bubble3D?: boolean;
2878
3068
  /** Per-point picture-fill flags (`c:dPt/c:pictureOptions`). */
2879
3069
  picture?: PptxChartDataPointPicture;
3070
+ /**
3071
+ * This point's identity GUID (`c:dPt/c:extLst/c:ext/c16:uniqueId/@val`,
3072
+ * the Office 2014+ `{C3380CC4-5D6E-409C-BE32-E72D297353CC}` chart
3073
+ * extension), read-only here: an edited point keeps its existing
3074
+ * `c:extLst` as passthrough (see `chart-datapoint-serializer.ts`), so this
3075
+ * field exists for introspection rather than round-trip.
3076
+ */
3077
+ uniqueId?: string;
2880
3078
  }
2881
3079
  /** Schema values accepted by `c:dLblPos`. */
2882
3080
  type PptxChartDataLabelPosition = 'bestFit' | 'b' | 'ctr' | 'inBase' | 'inEnd' | 'l' | 'outEnd' | 'r' | 't';
@@ -2953,7 +3151,7 @@ interface PptxChartAxisFormatting extends PptxChartAxisLabelFormatting {
2953
3151
  axPos?: 'b' | 'l' | 'r' | 't';
2954
3152
  /** Unique axis identifier (c:axId/@val) used to link series to axes. */
2955
3153
  axisId?: number;
2956
- /** Cross-axis identifier the axis this axis crosses. */
3154
+ /** Cross-axis identifier: the axis this axis crosses. */
2957
3155
  crossAxisId?: number;
2958
3156
  /** Automatic crossing mode (`c:crosses`). Mutually exclusive with `crossesAt`. */
2959
3157
  crosses?: 'autoZero' | 'min' | 'max';
@@ -3205,6 +3403,54 @@ interface PptxChartSeries {
3205
3403
  waterfallOptions?: PptxChartWaterfallOptions;
3206
3404
  regionMapOptions?: PptxChartRegionMapOptions;
3207
3405
  treemapOptions?: PptxChartTreemapOptions;
3406
+ /**
3407
+ * Series-level picture-fill flags (`c:ser/c:pictureOptions`), legal
3408
+ * wherever a per-point `c:dPt/c:pictureOptions` is (CT_BarSer): paints
3409
+ * EVERY point in the series with one picture unless a `c:dPt` overrides it
3410
+ * for that point alone. A point's own {@link PptxChartDataPoint.picture}
3411
+ * takes precedence entirely (not merged field-by-field) when it resolves
3412
+ * its own image; renderers fall back to this series-level picture only
3413
+ * when the point has none of its own.
3414
+ */
3415
+ picture?: PptxChartDataPointPicture;
3416
+ /**
3417
+ * This series' identity GUID (`c:ser/c:extLst/c:ext/c16:uniqueId/@val`,
3418
+ * the Office 2014+ `{C3380CC4-5D6E-409C-BE32-E72D297353CC}` chart
3419
+ * extension). PowerPoint uses it to track a series across edits and
3420
+ * collaborators independent of its `c:idx`/`c:order` position (the same
3421
+ * role animation targeting and CRDT reconciliation need). An edited
3422
+ * existing series keeps its own `c:extLst` as passthrough; a NEW series
3423
+ * added by cloning an existing one as a template is given a freshly
3424
+ * generated id rather than duplicating the template's (see
3425
+ * `regenerateClonedUniqueId` in `chart-series-identity.ts`), since two
3426
+ * series sharing one identity is exactly what this extension exists to
3427
+ * prevent.
3428
+ */
3429
+ uniqueId?: string;
3430
+ }
3431
+ /**
3432
+ * A series PowerPoint's "Chart Filters" feature hid from the plot while
3433
+ * keeping it in the workbook (`c:<type>Chart/c:extLst/c:ext
3434
+ * [@uri={02D57815-91ED-43cb-92C2-25804820EDAC}]/c15:filtered<Type>Series
3435
+ * /c15:ser`). Read-mostly: {@link PptxChartData.filteredSeries} exists for
3436
+ * introspection (AI tools, "unhide filtered series" UI) and round-trips as
3437
+ * passthrough through the preserved chart XML when untouched. See
3438
+ * `utils/chart-filtered-series.ts` for the parse rules and the idx-collision
3439
+ * fix this modelling enables on save.
3440
+ */
3441
+ interface PptxChartFilteredSeries {
3442
+ /** `c15:ser/c:idx/@val`, the workbook column position this series still occupies. */
3443
+ idx: number;
3444
+ /** `c15:ser/c:order/@val`, defaulting to {@link idx} when absent. */
3445
+ order: number;
3446
+ /** Series name, from the hidden series' own `c:tx` cache. */
3447
+ name?: string;
3448
+ /** Category labels, from the hidden series' own `c:cat` cache. */
3449
+ categories?: string[];
3450
+ /** Data values, from the hidden series' own `c:val` cache. */
3451
+ values?: number[];
3452
+ /** This hidden series' own identity GUID (`c16:uniqueId`), when present. */
3453
+ uniqueId?: string;
3208
3454
  }
3209
3455
  /**
3210
3456
  * Chart-level data-label options (`c:dLbls` directly under a chart-type
@@ -3228,6 +3474,19 @@ interface PptxChartDataLabelOptions {
3228
3474
  separator?: string;
3229
3475
  /** Show leader lines where supported (`c:showLeaderLines`). */
3230
3476
  showLeaderLines?: boolean;
3477
+ /**
3478
+ * Leader-line stroke styling for offset (pie/doughnut `outEnd`/`bestFit`)
3479
+ * labels. Resolved from the base `c:leaderLines/c:spPr` when present, else
3480
+ * falling back to the Office 2013+ chart15 extension's mirror
3481
+ * (`c:extLst/c:ext/c15:leaderLines/c:spPr`, uri
3482
+ * `{CE6537A1-D6FC-4f65-9D91-7224C49458BB}`), which is the one PowerPoint
3483
+ * itself treats as authoritative when both are present. Confirmed against
3484
+ * `e2e/fixtures/issue-132-gradient-fill.pptx` and
3485
+ * `e2e/fixtures/issue-132-hr-deck.pptx`, both of which write only the
3486
+ * extension form. `undefined` leaves the renderer's own default leader-line
3487
+ * stroke.
3488
+ */
3489
+ leaderLineStyle?: PptxChartShapeProps;
3231
3490
  /**
3232
3491
  * Label position (`c:dLblPos`). Valid values depend on the chart type
3233
3492
  * (`ctr`, `inEnd`, `inBase`, `outEnd`, `bestFit`, `l`, `r`, `t`, `b`).
@@ -3381,12 +3640,12 @@ interface PptxBubbleChartOptions {
3381
3640
  *
3382
3641
  * All fields are optional and round-trip verbatim.
3383
3642
  *
3384
- * - {@link rotX} X-axis rotation in degrees (-90…90).
3385
- * - {@link rotY} Y-axis rotation in degrees (0…360).
3386
- * - {@link depthPercent} chart depth as a percentage of base width.
3387
- * - {@link rAngAx} `true` if axes meet at right angles.
3388
- * - {@link perspective} perspective angle in degrees (0…240).
3389
- * - {@link hPercent} height as a percentage of chart width.
3643
+ * - {@link rotX}: X-axis rotation in degrees (-90…90).
3644
+ * - {@link rotY}: Y-axis rotation in degrees (0…360).
3645
+ * - {@link depthPercent}: chart depth as a percentage of base width.
3646
+ * - {@link rAngAx}: `true` if axes meet at right angles.
3647
+ * - {@link perspective}: perspective angle in degrees (0…240).
3648
+ * - {@link hPercent}: height as a percentage of chart width.
3390
3649
  */
3391
3650
  interface PptxChartView3D {
3392
3651
  rotX?: number;
@@ -3400,12 +3659,17 @@ interface PptxChartView3D {
3400
3659
  * Chart "chrome" flags from `c:chart` that round-trip cleanly even when
3401
3660
  * rendering ignores them.
3402
3661
  *
3403
- * - {@link autoTitleDeleted} `c:autoTitleDeleted/@val`. Suppresses the
3662
+ * - {@link autoTitleDeleted}: `c:autoTitleDeleted/@val`. Suppresses the
3404
3663
  * auto-generated title for single-series charts.
3405
- * - {@link dispBlanksAs} `c:dispBlanksAs/@val`. How blank cells
3664
+ * - {@link dispBlanksAs}: `c:dispBlanksAs/@val`. How blank cells
3406
3665
  * render: `"gap"`, `"zero"`, or `"span"`.
3407
- * - {@link showDLblsOverMax} `c:showDLblsOverMax/@val`. Keeps data
3666
+ * - {@link showDLblsOverMax}: `c:showDLblsOverMax/@val`. Keeps data
3408
3667
  * labels visible for points exceeding the value-axis maximum.
3668
+ * - {@link dispNaAsBlank}: the Office 2017+ chart extension
3669
+ * `c:extLst/c:ext/c16r3:dataDisplayOptions16/c16r3:dispNaAsBlank/@val`
3670
+ * (uri `{56B9EC1D-385E-4148-901F-78D8002777C0}`), PowerPoint's "Show #N/A
3671
+ * as an empty cell" chart option. Confirmed against real corpus markup
3672
+ * (`e2e/fixtures/chart-data-fidelity.pptx`).
3409
3673
  *
3410
3674
  * `c:plotVisOnly` lives on {@link PptxChartData.plotVisibleOnly} and is
3411
3675
  * intentionally not duplicated here.
@@ -3414,6 +3678,7 @@ interface PptxChartChrome {
3414
3678
  autoTitleDeleted?: boolean;
3415
3679
  dispBlanksAs?: 'gap' | 'zero' | 'span';
3416
3680
  showDLblsOverMax?: boolean;
3681
+ dispNaAsBlank?: boolean;
3417
3682
  }
3418
3683
  /** Manual chart placement from `c:layout/c:manualLayout` (CT_ManualLayout). */
3419
3684
  interface PptxChartManualLayout {
@@ -3509,6 +3774,13 @@ interface PptxChartData {
3509
3774
  categoryLevels?: string[][];
3510
3775
  dateCategories?: PptxChartDateCategories;
3511
3776
  series: PptxChartSeries[];
3777
+ /**
3778
+ * Series hidden from the plot by PowerPoint's "Chart Filters" feature
3779
+ * (Series tab) but still present in the workbook, aggregated across every
3780
+ * chart-type container (combo charts can carry more than one). Absent
3781
+ * when the chart has no such extension. See {@link PptxChartFilteredSeries}.
3782
+ */
3783
+ filteredSeries?: PptxChartFilteredSeries[];
3512
3784
  /** Chart style/formatting metadata. */
3513
3785
  style?: PptxChartStyle;
3514
3786
  /** Grouping mode for bar/area/line charts: 'clustered' | 'stacked' | 'percentStacked' */
@@ -3632,9 +3904,9 @@ interface PptxChartData {
3632
3904
  /**
3633
3905
  * Color cycling method from the chart color style part's `meth` attribute.
3634
3906
  *
3635
- * - `"cycle"` repeat the palette colours in order (default)
3636
- * - `"withinLinear"` gradient within each series
3637
- * - `"acrossLinear"` gradient across series
3907
+ * - `"cycle"`: repeat the palette colours in order (default)
3908
+ * - `"withinLinear"`: gradient within each series
3909
+ * - `"acrossLinear"`: gradient across series
3638
3910
  */
3639
3911
  colorMethod?: 'cycle' | 'withinLinear' | 'acrossLinear';
3640
3912
  /** Internal source color-style part path used for lossless dirty saves. */
@@ -5815,6 +6087,21 @@ interface PptxAccessibilityProperties {
5815
6087
  */
5816
6088
  isDecorative?: boolean;
5817
6089
  }
6090
+ /**
6091
+ * Accessibility description/title from `p:cNvPr/@descr` / `@title` on a
6092
+ * plain shape, text box or connector (`p:sp` / `p:cxnSp`). The same pair of
6093
+ * attributes already round-trips for a graphic frame (see
6094
+ * {@link TablePptxElement.altText}) and, `descr` only, for a picture
6095
+ * ({@link PptxImageProperties.altText}); this mixin extends it to the three
6096
+ * element kinds whose PowerPoint Alt Text pane data was previously dropped
6097
+ * on load because neither field existed on the model.
6098
+ */
6099
+ interface PptxNonVisualDescription {
6100
+ /** `p:cNvPr/@descr`. */
6101
+ altText?: string;
6102
+ /** `p:cNvPr/@title`. */
6103
+ title?: string;
6104
+ }
5818
6105
  /**
5819
6106
  * `a:cNvPicPr/@preferRelativeResize` (issue G13), a picture-only non-visual
5820
6107
  * property distinct from `a:picLocks`.
@@ -5847,7 +6134,7 @@ interface PptxPictureNonVisualProperties {
5847
6134
  * // => satisfies TextPptxElement
5848
6135
  * ```
5849
6136
  */
5850
- interface TextPptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties {
6137
+ interface TextPptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties, PptxNonVisualDescription {
5851
6138
  type: 'text';
5852
6139
  }
5853
6140
  /**
@@ -5865,7 +6152,7 @@ interface TextPptxElement extends PptxElementBase, PptxTextProperties, PptxShape
5865
6152
  * // => satisfies ShapePptxElement
5866
6153
  * ```
5867
6154
  */
5868
- interface ShapePptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties, PptxCustomPathProperties, PptxAccessibilityProperties {
6155
+ interface ShapePptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties, PptxCustomPathProperties, PptxAccessibilityProperties, PptxNonVisualDescription {
5869
6156
  type: 'shape';
5870
6157
  }
5871
6158
  /**
@@ -5887,7 +6174,7 @@ interface ShapePptxElement extends PptxElementBase, PptxTextProperties, PptxShap
5887
6174
  * // => satisfies ConnectorPptxElement
5888
6175
  * ```
5889
6176
  */
5890
- interface ConnectorPptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties {
6177
+ interface ConnectorPptxElement extends PptxElementBase, PptxTextProperties, PptxShapeProperties, PptxNonVisualDescription {
5891
6178
  type: 'connector';
5892
6179
  }
5893
6180
  /**
@@ -6182,13 +6469,14 @@ interface MediaPptxElement extends PptxElementBase {
6182
6469
  */
6183
6470
  isLinked?: boolean;
6184
6471
  /**
6185
- * Accessibility description from `p:nvGraphicFramePr/p:cNvPr/@descr`.
6186
- * Only populated for the `p:graphicFrame`-shaped (SDK-created) media
6187
- * form; a `p:pic`-shaped media element's alt text is not currently
6188
- * parsed (see `PptxHandlerRuntimePictureParsing.ts`).
6472
+ * Accessibility description. Read from `p:nvGraphicFramePr/p:cNvPr/@descr`
6473
+ * for the `p:graphicFrame`-shaped (SDK-created) media form, or from
6474
+ * `p:nvPicPr/p:cNvPr/@descr` for the `p:pic`-shaped media form (real
6475
+ * PowerPoint's usual authoring shape for a video/audio placeholder); see
6476
+ * `PptxHandlerRuntimePictureParsing.ts`.
6189
6477
  */
6190
6478
  altText?: string;
6191
- /** Accessibility title from `p:nvGraphicFramePr/p:cNvPr/@title`. Same scope note as {@link altText}. */
6479
+ /** Accessibility title, from the same `@title` attribute on whichever `p:cNvPr` the media form uses. Same scope note as {@link altText}. */
6192
6480
  title?: string;
6193
6481
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
6194
6482
  extensionXml?: PptxGraphicFrameExtension[];
@@ -6215,6 +6503,46 @@ interface GroupPptxElement extends PptxElementBase {
6215
6503
  children: PptxElement[];
6216
6504
  /** Fill style extracted from the group's `p:grpSpPr`, used for `a:grpFill` inheritance. */
6217
6505
  groupFill?: ShapeStyle;
6506
+ /**
6507
+ * The SAME `p:grpSpPr` extraction as {@link groupFill}, kept whenever the
6508
+ * group carries a `p:grpSpPr` at all, regardless of whether it resolved to
6509
+ * a paintable fill.
6510
+ *
6511
+ * `groupFill` is `undefined` unless the group has a real fill, because
6512
+ * `getGroupChildParentFill`/`groupChildInheritedFill` (the `a:grpFill`
6513
+ * inheritance chain) must keep chaining through an ancestor's fill when
6514
+ * THIS group has none of its own. A group whose `p:grpSpPr` authors only
6515
+ * `a:effectLst` (shadow/glow/soft-edge/reflection, no fill) needs those
6516
+ * effects to still reach the renderer, so they are kept here under a name
6517
+ * that carries no fill-inheritance meaning. Currently only reflection is
6518
+ * read from it (`getComputedEffectStyle`); the rest of `a:effectLst` on a
6519
+ * group remains unsupported.
6520
+ */
6521
+ groupEffectStyle?: ShapeStyle;
6522
+ /**
6523
+ * Exact EMU the group's own `a:chOff`/`a:chExt` (the coordinate space its
6524
+ * CHILDREN are authored in) were parsed from, alongside {@link
6525
+ * PptxElementBase.xEmu} etc for the group's own placement in its PARENT's
6526
+ * space. `undefined` when the source carried no usable `a:chOff`/`a:chExt`
6527
+ * (an SDK-created group, or one whose `a:xfrm` had no child-space data).
6528
+ *
6529
+ * Used by `group-xfrm-preservation.ts`'s `hasCapturedChildSpace` to decide
6530
+ * whether this group's original `a:chOff`/`a:chExt` can be re-emitted
6531
+ * verbatim (always true once captured, regardless of whether anything in
6532
+ * the subtree has moved or resized - only its DIRECT children's
6533
+ * `a:off`/`a:ext` are recomputed, via `invertChildIntoGroupSpace`, when
6534
+ * something changed), instead of the normalized `chOff 0,0` / `chExt ==
6535
+ * ext` space the writer falls back to when this is `undefined` (or
6536
+ * degenerate). See `group-shape-geometry.ts`'s module doc for why a group
6537
+ * needs two coordinate systems at all.
6538
+ */
6539
+ chOffXEmu?: number;
6540
+ /** See {@link chOffXEmu}. */
6541
+ chOffYEmu?: number;
6542
+ /** See {@link chOffXEmu}. */
6543
+ chExtWidthEmu?: number;
6544
+ /** See {@link chOffXEmu}. */
6545
+ chExtHeightEmu?: number;
6218
6546
  }
6219
6547
  /**
6220
6548
  * A freehand ink / drawing stroke captured with a stylus or mouse.
@@ -6243,6 +6571,24 @@ interface InkPptxElement extends PptxElementBase {
6243
6571
  * variable-width strokes that reflect stylus/pen pressure.
6244
6572
  */
6245
6573
  inkPointPressures?: number[][];
6574
+ /**
6575
+ * Per-path arrays of per-point pen-tilt lean direction (degrees, straight
6576
+ * from `PointerEvent.tiltX` on supporting hardware).
6577
+ *
6578
+ * Each entry corresponds to the path at the same index in `inkPaths`, and
6579
+ * is paired positionally with {@link inkPointTiltY}. Present only when at
6580
+ * least one point in the stroke reported a genuinely non-zero tilt: a
6581
+ * device that never reports tilt (a mouse, or a stylus with no tilt
6582
+ * sensor) leaves both arrays absent, the same way `inkPointPressures` is
6583
+ * omitted when pressure never varies. When present, the renderer converts
6584
+ * the raw `(tiltX, tiltY)` vector into a lean angle + magnitude (see
6585
+ * `pptx-viewer-shared`'s `tiltChannelsFromVectors`) and widens the stroke
6586
+ * perpendicular to the lean direction, approximating a chisel-tip
6587
+ * calligraphy nib.
6588
+ */
6589
+ inkPointTiltX?: number[][];
6590
+ /** Per-path, per-point pen-tilt lean direction (degrees), paired with {@link inkPointTiltX}. */
6591
+ inkPointTiltY?: number[][];
6246
6592
  /** Unrecognised graphicFrame extLst extensions, captured verbatim for round-trip. */
6247
6593
  extensionXml?: PptxGraphicFrameExtension[];
6248
6594
  }
@@ -6276,6 +6622,20 @@ interface ContentPartInkStroke {
6276
6622
  * {@link tiltAngles}.
6277
6623
  */
6278
6624
  tiltMagnitudes?: number[];
6625
+ /**
6626
+ * Which InkML channel pair {@link tiltAngles}/{@link tiltMagnitudes} were
6627
+ * decoded from: `'azimuthAltitude'` when the source declared `AZIMUTH`
6628
+ * (optionally paired with `ALTITUDE`); omitted (implying `OTx`/`OTy`, i.e.
6629
+ * `'vector'`) otherwise, including for tilt this library itself captured
6630
+ * from the Draw tool's `PointerEvent.tiltX`/`tiltY`.
6631
+ *
6632
+ * A save that has to rewrite this content part's InkML (see
6633
+ * `inkml-content-part-writer.ts`) uses this to re-declare the SAME channel
6634
+ * pair the file already used, rather than always converting to `OTx`/`OTy`;
6635
+ * the rendered lean is identical either way; only the written channel
6636
+ * NAMES differ.
6637
+ */
6638
+ tiltEncoding?: 'vector' | 'azimuthAltitude';
6279
6639
  }
6280
6640
  /**
6281
6641
  * A content-part element wrapped in `mc:AlternateContent`.
@@ -7100,17 +7460,28 @@ interface PptxNativeAnimation {
7100
7460
  */
7101
7461
  afterEffect?: boolean;
7102
7462
  /**
7103
- * "After animation" end-state behaviour carried over from the matching
7104
- * {@link PptxElementAnimation.afterAnimation} entry for this effect's
7105
- * element. Not populated by the native-timing parser itself (there is no
7106
- * single `p:cTn` attribute for it): `applyAfterAnimationFromEditorList` in
7107
- * `pptx-viewer-shared` merges it in from the editor's per-element
7108
- * animation list before playback, since that is the model the animation
7109
- * panel writes `afterAnimation` into.
7463
+ * "After animation" end-state behaviour: dim-to-colour, hide-after-
7464
+ * animation, or hide-on-next-click. Populated directly by the
7465
+ * native-timing parser (`native-animation-after-effect.ts`) when the
7466
+ * effect's `p:cTn/p:subTnLst` carries PowerPoint's genuine after-effect
7467
+ * shape, so a real-world deck's build shows up here even with no
7468
+ * `pptx:editorMeta`. `applyAfterAnimationFromEditorList` in
7469
+ * `pptx-viewer-shared` overrides this from the matching
7470
+ * {@link PptxElementAnimation.afterAnimation} entry when the editor's
7471
+ * per-element animation list has one (the model the animation panel
7472
+ * writes `afterAnimation` into), so an edit through our own UI always wins.
7110
7473
  */
7111
7474
  afterAnimationAction?: PptxAfterAnimationAction;
7112
- /** Dim-to color hex, present when {@link afterAnimationAction} is `dimToColor`. */
7475
+ /** Dim-to color hex, present when {@link afterAnimationAction} is `dimToColor` AND the dim target is an already-resolved `a:srgbClr`. */
7113
7476
  afterAnimationColor?: string;
7477
+ /**
7478
+ * The typed theme reference when a `dimToColor` target is an `a:schemeClr`
7479
+ * (e.g. `accent2`) instead of `a:srgbClr`: this parse layer has no theme to
7480
+ * resolve it to sRGB with (see {@link afterAnimationColor}'s doc), so a
7481
+ * playback consumer resolves this against the deck's theme colour map.
7482
+ * Mutually exclusive with {@link afterAnimationColor} being set.
7483
+ */
7484
+ afterAnimationColorRef?: PptxThemeColorRef;
7114
7485
  /**
7115
7486
  * Parsed `p:animEffect` filter descriptor. `presetId`/`presetClass` remain
7116
7487
  * the primary effect selector (see `resolveEffect` in `pptx-viewer-shared`);
@@ -7242,13 +7613,46 @@ interface PptxAnimationKeyframe {
7242
7613
  * fidelity; consumers may use it to drive computed animation values.
7243
7614
  */
7244
7615
  fmla?: string;
7616
+ /**
7617
+ * The typed theme reference when a `p:val/p:clrVal` stop is an
7618
+ * `a:schemeClr` (e.g. `accent1`), including any `tint`/`shade`/`lumMod`/
7619
+ * `lumOff`/`alpha` children. {@link value} keeps the bare scheme name for
7620
+ * round-trip; a playback consumer needs this ref (resolved against the
7621
+ * deck's theme colour map) to turn the stop into a real CSS colour, which
7622
+ * the bare name alone cannot do. Absent for an `a:srgbClr` stop, whose
7623
+ * {@link value} is already a resolved `#rrggbb` hex string.
7624
+ */
7625
+ colorRef?: PptxThemeColorRef;
7245
7626
  }
7246
7627
  /** One generic `p:anim` behaviour inside a composed PowerPoint effect. */
7247
7628
  interface PptxAttributeAnimation {
7248
7629
  /** Lowercased target attribute from `p:attrNameLst`. */
7249
7630
  attrName: string;
7250
- /** Authored value stops from this behaviour's `p:tavLst`. */
7631
+ /**
7632
+ * Authored value stops from this behaviour's `p:tavLst`. Empty when the
7633
+ * behaviour instead uses the simpler `from`/`to`/`by` attribute form (see
7634
+ * below); at least one of `keyframes`, `from`/`to`, or `by` is present.
7635
+ */
7251
7636
  keyframes: PptxAnimationKeyframe[];
7637
+ /**
7638
+ * `p:anim/@_from` (a formula string, ECMA-376 S19.5.4 CT_TLAnimateBehavior):
7639
+ * the absolute starting value, used instead of `p:tavLst` when the
7640
+ * behaviour only has two endpoints. PowerPoint writes this form for some
7641
+ * built-in presets (e.g. "Grow And Turn"'s `ppt_x` fly-in): a bare
7642
+ * `p:anim from="..." to="..."` with no `p:tavLst` child at all. See
7643
+ * `animation-ppt-formula-ground-truth.md` in `pptx-viewer-shared` for the
7644
+ * real-PowerPoint sample this was found in.
7645
+ */
7646
+ from?: string;
7647
+ /** `p:anim/@_to`: the absolute ending value. See {@link from}. */
7648
+ to?: string;
7649
+ /**
7650
+ * `p:anim/@_by`: a DELTA formula added to wherever the attribute already
7651
+ * stands (as opposed to `from`/`to`'s absolute values), typically paired
7652
+ * with `p:cBhvr/@_additive="sum"` so it composites with a sibling
7653
+ * behaviour driving the same attribute instead of replacing it.
7654
+ */
7655
+ by?: string;
7252
7656
  /** Duration from this behaviour's nested `p:cTn/@dur`. */
7253
7657
  durationMs?: number;
7254
7658
  /** Start offset from this behaviour's nested `p:stCondLst`. */
@@ -7257,8 +7661,11 @@ interface PptxAttributeAnimation {
7257
7661
  * Interpolation mode from this behaviour's own `@_calcmode`
7258
7662
  * (ST_TLAnimateBehaviorCalcMode, ECMA-376 S19.5.2): `discrete` snaps to
7259
7663
  * each `p:tav` stop with no interpolation, `lin` (the OOXML default)
7260
- * interpolates linearly, `fmla` evaluates `p:tav/@fmla` (not consulted at
7261
- * playback here; formulas are round-tripped only). Absent means `lin`.
7664
+ * interpolates linearly. `fmla` as the WHOLE behaviour's calc mode has
7665
+ * never been observed in a real PowerPoint file and is not consulted at
7666
+ * playback; what PowerPoint actually writes is `calcmode="lin"` with a
7667
+ * per-stop `p:tav/@fmla` (see {@link PptxAnimationKeyframe.fmla}), which
7668
+ * IS consulted regardless of this field's value. Absent means `lin`.
7262
7669
  */
7263
7670
  calcMode?: 'discrete' | 'lin' | 'fmla';
7264
7671
  }
@@ -7284,16 +7691,31 @@ interface PptxColorAnimation {
7284
7691
  * companion to `@dir` for HSL colour-space animations.
7285
7692
  */
7286
7693
  path?: string;
7287
- /** Starting color as hex string. */
7694
+ /** Starting color as hex string, or the bare scheme name (e.g. `accent1`) for a theme colour; see {@link fromColorRef}. */
7288
7695
  fromColor?: string;
7289
- /** Ending color as hex string. */
7696
+ /** Ending color as hex string, or the bare scheme name; see {@link toColorRef}. */
7290
7697
  toColor?: string;
7291
7698
  /**
7292
- * Color delta (for "by" animations) as hex string. For HSL colour-space
7293
- * animations this retains the historical byte-packed compatibility value;
7294
- * consumers should prefer {@link hslDelta}, which preserves signed values.
7699
+ * Color delta (for "by" animations) as hex string, or the bare scheme name;
7700
+ * see {@link byColorRef}. For HSL colour-space animations this retains the
7701
+ * historical byte-packed compatibility value; consumers should prefer
7702
+ * {@link hslDelta}, which preserves signed values.
7295
7703
  */
7296
7704
  byColor?: string;
7705
+ /**
7706
+ * The typed theme reference when {@link fromColor} is an `a:schemeClr`
7707
+ * (including `tint`/`shade`/`lumMod`/`lumOff`/`alpha`), so playback can
7708
+ * resolve it against the deck's theme colour map. Absent when `fromColor`
7709
+ * is already a resolved `#rrggbb` hex (an `a:srgbClr` stop).
7710
+ */
7711
+ fromColorRef?: PptxThemeColorRef;
7712
+ /** The typed theme reference for {@link toColor}; see {@link fromColorRef}. */
7713
+ toColorRef?: PptxThemeColorRef;
7714
+ /**
7715
+ * The typed theme reference for {@link byColor} (RGB colour space only; an
7716
+ * HSL `by` is a signed delta, never a theme colour). See {@link fromColorRef}.
7717
+ */
7718
+ byColorRef?: PptxThemeColorRef;
7297
7719
  /**
7298
7720
  * Typed HSL delta from `p:by/p:hsl`. This preserves signed values and their
7299
7721
  * OOXML units without forcing them through the legacy byte-packed `byColor`
@@ -8506,13 +8928,13 @@ interface PptxSlide {
8506
8928
  backgroundPattern?: PptxSlideBackgroundPattern;
8507
8929
  /**
8508
8930
  * `<p:bgPr/@shadeToTitle>`: boolean flag instructing the renderer to
8509
- * shade the background gradient toward the title placeholder's text
8510
- * colour. Parsed and round-tripped here on the core model; the actual
8511
- * visual effect is applied by `pptx-viewer-shared`'s
8931
+ * anchor the background gradient on the title placeholder as a
8932
+ * rectangular path gradient (COM-measured against real PowerPoint;
8933
+ * it does NOT recolour toward the title's text colour, despite the
8934
+ * attribute's name). Parsed and round-tripped here on the core model;
8935
+ * the actual visual effect is applied by `pptx-viewer-shared`'s
8512
8936
  * `getSlideBackgroundStyle` (see `render/background-shade-to-title.ts`),
8513
- * consumed by all five bindings, not by core itself. That module's
8514
- * docstring explains the approximation: no published ECMA-376 or
8515
- * MS-ODRAWXML text documents the exact legacy blend. Legacy PowerPoint
8937
+ * consumed by all five bindings, not by core itself. Legacy PowerPoint
8516
8938
  * 97-2003 hint, not observed in any real-world corpus file this project
8517
8939
  * has collected and not settable from any modern PowerPoint UI; see
8518
8940
  * `docs/guide/limitations.md`.