pptx-react-viewer 4.6.0 → 4.8.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 (135) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/dist/{AiChatPanel-3C7GM6ZF.js → AiChatPanel-4LMJIJUU.js} +28 -28
  3. package/dist/AiChatPanel-4LMJIJUU.js.br +0 -0
  4. package/dist/AiChatPanel-4LMJIJUU.js.gz +0 -0
  5. package/dist/{AiChatPanel-L7DBCWE3.mjs → AiChatPanel-XWYLYN26.mjs} +4 -4
  6. package/dist/AiChatPanel-XWYLYN26.mjs.br +0 -0
  7. package/dist/AiChatPanel-XWYLYN26.mjs.gz +0 -0
  8. package/dist/{Model3DScene-IJ7YYTYU.mjs → Model3DScene-N6IZ7Q57.mjs} +1 -1
  9. package/dist/Model3DScene-N6IZ7Q57.mjs.br +0 -0
  10. package/dist/Model3DScene-N6IZ7Q57.mjs.gz +0 -0
  11. package/dist/{Model3DScene-USKNPWWH.js → Model3DScene-YAPQ5BCI.js} +2 -2
  12. package/dist/{Model3DScene-USKNPWWH.js.br → Model3DScene-YAPQ5BCI.js.br} +0 -0
  13. package/dist/Model3DScene-YAPQ5BCI.js.gz +0 -0
  14. package/dist/{chunk-ZAQFTO4P.mjs → chunk-KHEJXP4I.mjs} +1175 -149
  15. package/dist/chunk-KHEJXP4I.mjs.br +0 -0
  16. package/dist/chunk-KHEJXP4I.mjs.gz +0 -0
  17. package/dist/{chunk-3JUZOKFI.js → chunk-LTBTG2QB.js} +108 -96
  18. package/dist/chunk-LTBTG2QB.js.br +0 -0
  19. package/dist/chunk-LTBTG2QB.js.gz +0 -0
  20. package/dist/{chunk-ICEZL4TM.mjs → chunk-NPZOVIHG.mjs} +40855 -16211
  21. package/dist/chunk-NPZOVIHG.mjs.br +0 -0
  22. package/dist/chunk-NPZOVIHG.mjs.gz +0 -0
  23. package/dist/{chunk-DFSWCVRW.js → chunk-NV2H57Q4.js} +3083 -2057
  24. package/dist/chunk-NV2H57Q4.js.br +0 -0
  25. package/dist/chunk-NV2H57Q4.js.gz +0 -0
  26. package/dist/{chunk-VCAQSSGD.mjs → chunk-Q4XJSJYI.mjs} +1 -1
  27. package/dist/chunk-Q4XJSJYI.mjs.br +0 -0
  28. package/dist/chunk-Q4XJSJYI.mjs.gz +0 -0
  29. package/dist/{chunk-IBHIXBC5.js → chunk-Q7NWWIPQ.js} +890 -1091
  30. package/dist/chunk-Q7NWWIPQ.js.br +0 -0
  31. package/dist/chunk-Q7NWWIPQ.js.gz +0 -0
  32. package/dist/{chunk-Y4QUVWZC.js → chunk-SAYZSUNQ.js} +315 -274
  33. package/dist/chunk-SAYZSUNQ.js.br +0 -0
  34. package/dist/chunk-SAYZSUNQ.js.gz +0 -0
  35. package/dist/{chunk-INX3E37P.mjs → chunk-SOMUGI3Y.mjs} +84 -286
  36. package/dist/chunk-SOMUGI3Y.mjs.br +0 -0
  37. package/dist/chunk-SOMUGI3Y.mjs.gz +0 -0
  38. package/dist/{chunk-K6QHGABT.mjs → chunk-SSXGPYBF.mjs} +109 -68
  39. package/dist/chunk-SSXGPYBF.mjs.br +0 -0
  40. package/dist/chunk-SSXGPYBF.mjs.gz +0 -0
  41. package/dist/{chunk-5V5SMT5A.js → chunk-UTP22QYH.js} +5 -5
  42. package/dist/chunk-UTP22QYH.js.br +0 -0
  43. package/dist/chunk-UTP22QYH.js.gz +0 -0
  44. package/dist/{chunk-FZSYLXJT.js → chunk-YF2BQIW3.js} +40903 -16217
  45. package/dist/chunk-YF2BQIW3.js.br +0 -0
  46. package/dist/chunk-YF2BQIW3.js.gz +0 -0
  47. package/dist/{chunk-OOO4JL2N.mjs → chunk-YPDPSXPK.mjs} +108 -96
  48. package/dist/chunk-YPDPSXPK.mjs.br +0 -0
  49. package/dist/chunk-YPDPSXPK.mjs.gz +0 -0
  50. package/dist/i18n/de.cjs +134 -117
  51. package/dist/i18n/de.cjs.br +0 -0
  52. package/dist/i18n/de.cjs.gz +0 -0
  53. package/dist/i18n/de.mjs +134 -117
  54. package/dist/i18n/de.mjs.br +0 -0
  55. package/dist/i18n/de.mjs.gz +0 -0
  56. package/dist/i18n/es.cjs +134 -117
  57. package/dist/i18n/es.cjs.br +0 -0
  58. package/dist/i18n/es.cjs.gz +0 -0
  59. package/dist/i18n/es.mjs +134 -117
  60. package/dist/i18n/es.mjs.br +0 -0
  61. package/dist/i18n/es.mjs.gz +0 -0
  62. package/dist/i18n/fr.cjs +134 -117
  63. package/dist/i18n/fr.cjs.br +0 -0
  64. package/dist/i18n/fr.cjs.gz +0 -0
  65. package/dist/i18n/fr.mjs +134 -117
  66. package/dist/i18n/fr.mjs.br +0 -0
  67. package/dist/i18n/fr.mjs.gz +0 -0
  68. package/dist/i18n/zh-CN.cjs +111 -99
  69. package/dist/i18n/zh-CN.cjs.br +0 -0
  70. package/dist/i18n/zh-CN.cjs.gz +0 -0
  71. package/dist/i18n/zh-CN.mjs +111 -99
  72. package/dist/i18n/zh-CN.mjs.br +0 -0
  73. package/dist/i18n/zh-CN.mjs.gz +0 -0
  74. package/dist/i18n.js +4 -4
  75. package/dist/i18n.js.br +0 -0
  76. package/dist/i18n.js.gz +0 -0
  77. package/dist/i18n.mjs +1 -1
  78. package/dist/i18n.mjs.br +0 -0
  79. package/dist/i18n.mjs.gz +0 -0
  80. package/dist/index.d.ts +276 -18
  81. package/dist/index.js +63 -63
  82. package/dist/index.js.br +0 -0
  83. package/dist/index.js.gz +0 -0
  84. package/dist/index.mjs +6 -6
  85. package/dist/index.mjs.br +0 -0
  86. package/dist/index.mjs.gz +0 -0
  87. package/dist/internals.d.ts +329 -18
  88. package/dist/internals.js +105 -105
  89. package/dist/internals.js.br +0 -0
  90. package/dist/internals.js.gz +0 -0
  91. package/dist/internals.mjs +4 -4
  92. package/dist/internals.mjs.br +0 -0
  93. package/dist/internals.mjs.gz +0 -0
  94. package/dist/pptx-viewer.css +1 -1
  95. package/dist/pptx-viewer.css.br +0 -0
  96. package/dist/pptx-viewer.css.gz +0 -0
  97. package/dist/viewer/index.d.ts +231 -16
  98. package/dist/viewer/index.js +27 -27
  99. package/dist/viewer/index.js.br +0 -0
  100. package/dist/viewer/index.js.gz +0 -0
  101. package/dist/viewer/index.mjs +6 -6
  102. package/dist/viewer/index.mjs.br +2 -3
  103. package/dist/viewer/index.mjs.gz +0 -0
  104. package/package.json +1 -1
  105. package/dist/AiChatPanel-3C7GM6ZF.js.br +0 -0
  106. package/dist/AiChatPanel-3C7GM6ZF.js.gz +0 -0
  107. package/dist/AiChatPanel-L7DBCWE3.mjs.br +0 -0
  108. package/dist/AiChatPanel-L7DBCWE3.mjs.gz +0 -0
  109. package/dist/Model3DScene-IJ7YYTYU.mjs.br +0 -0
  110. package/dist/Model3DScene-IJ7YYTYU.mjs.gz +0 -0
  111. package/dist/Model3DScene-USKNPWWH.js.gz +0 -0
  112. package/dist/chunk-3JUZOKFI.js.br +0 -0
  113. package/dist/chunk-3JUZOKFI.js.gz +0 -0
  114. package/dist/chunk-5V5SMT5A.js.br +0 -0
  115. package/dist/chunk-5V5SMT5A.js.gz +0 -0
  116. package/dist/chunk-DFSWCVRW.js.br +0 -0
  117. package/dist/chunk-DFSWCVRW.js.gz +0 -0
  118. package/dist/chunk-FZSYLXJT.js.br +0 -0
  119. package/dist/chunk-FZSYLXJT.js.gz +0 -0
  120. package/dist/chunk-IBHIXBC5.js.br +0 -0
  121. package/dist/chunk-IBHIXBC5.js.gz +0 -0
  122. package/dist/chunk-ICEZL4TM.mjs.br +0 -0
  123. package/dist/chunk-ICEZL4TM.mjs.gz +0 -0
  124. package/dist/chunk-INX3E37P.mjs.br +0 -0
  125. package/dist/chunk-INX3E37P.mjs.gz +0 -0
  126. package/dist/chunk-K6QHGABT.mjs.br +0 -0
  127. package/dist/chunk-K6QHGABT.mjs.gz +0 -0
  128. package/dist/chunk-OOO4JL2N.mjs.br +0 -0
  129. package/dist/chunk-OOO4JL2N.mjs.gz +0 -0
  130. package/dist/chunk-VCAQSSGD.mjs.br +0 -0
  131. package/dist/chunk-VCAQSSGD.mjs.gz +0 -0
  132. package/dist/chunk-Y4QUVWZC.js.br +0 -0
  133. package/dist/chunk-Y4QUVWZC.js.gz +0 -0
  134. package/dist/chunk-ZAQFTO4P.mjs.br +0 -0
  135. package/dist/chunk-ZAQFTO4P.mjs.gz +0 -0
@@ -1295,6 +1295,27 @@ interface ShapeStyle {
1295
1295
  * `authored-shape-style.ts`'s `effectIsPurelyStyleMatrix`.
1296
1296
  */
1297
1297
  inheritedEffectStyle?: ShapeStyle;
1298
+ /**
1299
+ * Set by a style-matrix pick (the Shape Styles gallery): the shape's own
1300
+ * `spPr` fill, outline and effects were replaced by `<p:style>`, so the
1301
+ * writer clears whatever the retained `spPr` still authored before it
1302
+ * writes the (now reference-owned) style. Never parsed; editor state only.
1303
+ */
1304
+ styleMatrixReset?: boolean;
1305
+ }
1306
+ /**
1307
+ * The result of resolving a `<p:style>` block against the loaded theme.
1308
+ *
1309
+ * `shapeStyle` is exactly what the load pipeline would have produced for a
1310
+ * shape whose `spPr` authors nothing and whose `<p:style>` is `styleXml`:
1311
+ * the flat fill/outline/effect values a renderer needs, the reference indices
1312
+ * and colours the writer re-emits, and the inheritance baselines that tell the
1313
+ * writer to leave `spPr` empty while the flat values still agree with them.
1314
+ */
1315
+ interface ResolvedStyleMatrix {
1316
+ shapeStyle: ShapeStyle;
1317
+ /** The text colour `<a:fontRef>` names, resolved to hex. */
1318
+ fontColor?: string;
1298
1319
  }
1299
1320
  //#endregion
1300
1321
  //#region src/core/types/text.d.ts
@@ -1483,8 +1504,16 @@ interface TextStyle {
1483
1504
  textOutlineWidth?: number;
1484
1505
  /** Text outline colour as hex string (`a:rPr > a:ln > a:solidFill`). */
1485
1506
  textOutlineColor?: string;
1507
+ /** Text outline dash preset (`a:rPr > a:ln > a:prstDash/@val`), e.g. `dash`; absent for solid. */
1508
+ textOutlineDash?: string;
1486
1509
  /** When true, the text body has no fill (`a:rPr > a:noFill`), producing hollow/outline-only text. */
1487
1510
  textFillNone?: boolean;
1511
+ /**
1512
+ * When true, the run authored an EMPTY `<a:effectLst/>`: an explicit "no
1513
+ * effects" override that blocks an inherited shadow or glow. Kept so a
1514
+ * rewrite re-emits it instead of letting the inherited effect return.
1515
+ */
1516
+ textEffectsExplicitNone?: boolean;
1488
1517
  /** Superscript/subscript baseline shift as percentage (`a:rPr/@baseline`). Positive = super, negative = sub. */
1489
1518
  baseline?: number;
1490
1519
  /** Character spacing in hundredths of a point (`a:rPr/@spc`). */
@@ -1518,6 +1547,25 @@ interface TextStyle {
1518
1547
  textFillPatternForeground?: string;
1519
1548
  /** Text-level pattern background colour. */
1520
1549
  textFillPatternBackground?: string;
1550
+ /**
1551
+ * Raw `a:rPr > a:blipFill` XML, preserved verbatim for round-trip
1552
+ * serialization AND as the input to the image resolution pass that fills
1553
+ * in {@link textFillBlipUrl} (parsing a run's fill happens synchronously,
1554
+ * with no zip/relationship access at that point; resolving the blip to a
1555
+ * displayable URL needs both, so it happens in a later async pass over
1556
+ * the slide's parsed elements, mirroring how a shape's OWN image fill is
1557
+ * resolved). A picture-filled text run (`a:rPr > a:blipFill`) was
1558
+ * documented as handled ("Handles gradient fills, pattern fills, and
1559
+ * image fills on text runs") but never actually parsed, so it silently
1560
+ * fell through to the run's plain `color` and rendered solid black
1561
+ * (COM-verified: `audit-text` slide 13's "PICTURE FILL" run shows the
1562
+ * fill image through the glyphs in PowerPoint).
1563
+ */
1564
+ textFillBlipXml?: XmlObject;
1565
+ /** Resolved displayable URL for {@link textFillBlipXml}, or the archive-relative path when unresolved (lazy decode). */
1566
+ textFillBlipUrl?: string;
1567
+ /** Tiling mode for {@link textFillBlipUrl} (`a:blipFill/a:tile` present -> 'tile', else 'stretch'). */
1568
+ textFillBlipMode?: 'stretch' | 'tile';
1521
1569
  hyperlink?: string;
1522
1570
  /** Relationship ID for the hyperlink (`a:hlinkClick/@r:id`) — preserved for round-trip serialization. */
1523
1571
  hyperlinkRId?: string;
@@ -1603,6 +1651,13 @@ interface TextStyle {
1603
1651
  position: number;
1604
1652
  align: 'l' | 'ctr' | 'r' | 'dec';
1605
1653
  leader?: 'none' | 'dot' | 'hyphen' | 'underscore';
1654
+ /**
1655
+ * True when the source spelled out the schema-default `@algn="l"`, so the
1656
+ * writer re-emits it instead of treating it as an omitted default.
1657
+ */
1658
+ alignAuthored?: boolean;
1659
+ /** True when the source spelled out the schema-default `@leader="none"`. */
1660
+ leaderAuthored?: boolean;
1606
1661
  }>;
1607
1662
  /**
1608
1663
  * True when the paragraph's own `a:pPr` authored an EMPTY `<a:tabLst/>`
@@ -1966,6 +2021,19 @@ interface TextStyle {
1966
2021
  * convention used for {@link bulletInfo} / {@link endParaRunProperties}).
1967
2022
  */
1968
2023
  paragraphDefaultRunPropertiesXml?: XmlObject;
2024
+ /**
2025
+ * The bullet colour / size / typeface children (`a:buClrTx`, `a:buClr`,
2026
+ * `a:buSzTx`, `a:buSzPct`, `a:buSzPts`, `a:buFontTx`, `a:buFont`) a
2027
+ * paragraph authored in its own `<a:pPr>` WITHOUT a bullet type
2028
+ * (`a:buNone` / `a:buChar` / `a:buAutoNum` / `a:buBlip`), captured
2029
+ * verbatim in source order. Such a paragraph restyles an inherited bullet
2030
+ * rather than declaring one, so its {@link BulletInfo} resolves from the
2031
+ * cascade and is (correctly) not written back; without this capture the
2032
+ * paragraph's own override vanished on every rewrite.
2033
+ *
2034
+ * Only meaningful on a paragraph's own authored properties.
2035
+ */
2036
+ paragraphBulletPropertiesXml?: XmlObject;
1969
2037
  }
1970
2038
  /**
1971
2039
  * Structured bullet metadata attached to the first {@link TextSegment}
@@ -2222,6 +2290,22 @@ interface TextSegment {
2222
2290
  * Used by the renderer to apply font family, colour, etc. to the `<rt>` element.
2223
2291
  */
2224
2292
  rubyStyle?: TextStyle;
2293
+ /**
2294
+ * The parsed `a:rubyPr` node, kept verbatim so its attributes (`hps`,
2295
+ * `hpsRaise`, `hpsBaseText`, `lid`, ...) round-trip exactly; only an
2296
+ * edited {@link rubyAlignment} is written over it on save.
2297
+ */
2298
+ rubyPropertiesXml?: XmlObject;
2299
+ /**
2300
+ * What each of a ruby run's two base-side `a:rPr`s authored on its own:
2301
+ * `outer` is the containing `a:r`'s, `base` the `a:rubyBase` run's. The
2302
+ * flat {@link style} merges both for rendering; these let the writer give
2303
+ * each `a:rPr` back only its own properties (plus any later edit).
2304
+ */
2305
+ rubyRunAuthoredStyles?: {
2306
+ outer?: TextStyle;
2307
+ base?: TextStyle;
2308
+ };
2225
2309
  }
2226
2310
  //#endregion
2227
2311
  //#region src/core/types/element-base.d.ts
@@ -3234,6 +3318,26 @@ type PptxChartMarkerSymbol = 'circle' | 'dash' | 'diamond' | 'dot' | 'none' | 'p
3234
3318
  */
3235
3319
  type PptxChartScatterStyle = 'none' | 'line' | 'lineMarker' | 'marker' | 'smooth' | 'smoothMarker';
3236
3320
  /** Shape properties extracted from c:spPr for chart formatting. */
3321
+ /**
3322
+ * A render-ready gradient fill from a chart `c:spPr/a:gradFill` (chart area,
3323
+ * plot area or series). Positions are 0..100; a linear gradient's `angle` is
3324
+ * in degrees clockwise from left-to-right (`a:lin/@ang`); a radial (`a:path`)
3325
+ * gradient centres on `focalPoint` (0..1 fractions of the box), the middle
3326
+ * when absent.
3327
+ */
3328
+ interface PptxChartGradientFill {
3329
+ type: 'linear' | 'radial';
3330
+ stops: Array<{
3331
+ color: string;
3332
+ position: number;
3333
+ opacity?: number;
3334
+ }>;
3335
+ angle?: number;
3336
+ focalPoint?: {
3337
+ x: number;
3338
+ y: number;
3339
+ };
3340
+ }
3237
3341
  interface PptxChartShapeProps {
3238
3342
  fillColor?: string;
3239
3343
  strokeColor?: string;
@@ -3559,6 +3663,12 @@ interface PptxChartSeries {
3559
3663
  */
3560
3664
  idx?: number;
3561
3665
  values: number[];
3666
+ /**
3667
+ * Series gradient fill (`c:ser/c:spPr/a:gradFill`), painted on every mark
3668
+ * of the series that has no per-point override. Render-only: the series'
3669
+ * own `c:spPr` round-trips untouched.
3670
+ */
3671
+ gradientFill?: PptxChartGradientFill;
3562
3672
  /**
3563
3673
  * Per-series x values from `c:ser/c:xVal` (scatter and bubble series only).
3564
3674
  *
@@ -3733,6 +3843,12 @@ interface PptxChartFilteredSeries {
3733
3843
  * and `c:dLblPos`.
3734
3844
  */
3735
3845
  interface PptxChartDataLabelOptions {
3846
+ /** Label box fill/outline (`c:dLbls/c:spPr`), see `chart-data-label-box.ts`. */
3847
+ labelShape?: PptxChartShapeProps;
3848
+ /** Callout geometry of the label box (`c15:spPr/a:prstGeom/@prst`, e.g. `wedgeRectCallout`). */
3849
+ calloutShape?: string;
3850
+ /** The chart15 extension's `c15:showLeaderLines`, which wins for a moved label's leader line. */
3851
+ extLeaderLines?: boolean;
3736
3852
  /** Show the numeric value (`c:showVal`). */
3737
3853
  showValue?: boolean;
3738
3854
  /** Show the category name (`c:showCatName`). */
@@ -3858,6 +3974,10 @@ interface PptxChartStyle {
3858
3974
  chartAreaFill?: string;
3859
3975
  /** Plot-area fill from `c:plotArea/c:spPr`. See {@link chartAreaFill}. */
3860
3976
  plotAreaFill?: string;
3977
+ /** Chart-area gradient (`c:chartSpace/c:spPr/a:gradFill`); wins over {@link chartAreaFill}. */
3978
+ chartAreaGradient?: PptxChartGradientFill;
3979
+ /** Plot-area gradient (`c:plotArea/c:spPr/a:gradFill`); wins over {@link plotAreaFill}. */
3980
+ plotAreaGradient?: PptxChartGradientFill;
3861
3981
  /** Whether data labels are shown. */
3862
3982
  hasDataLabels?: boolean;
3863
3983
  /** Chart-level data-label content/position options (when `hasDataLabels`). */
@@ -4097,6 +4217,14 @@ interface PptxChartData {
4097
4217
  style?: PptxChartStyle;
4098
4218
  /** Grouping mode for bar/area/line charts: 'clustered' | 'stacked' | 'percentStacked' */
4099
4219
  grouping?: 'clustered' | 'stacked' | 'percentStacked';
4220
+ /**
4221
+ * The source `c:grouping` was `standard`, which {@link grouping} folds into
4222
+ * `'clustered'` (a 2D bar chart draws the two the same). A 3D chart draws
4223
+ * `standard` differently: each series on its own depth row. The writer
4224
+ * emits `standard` again while `grouping` is still `'clustered'`, so the
4225
+ * chart round-trips unchanged.
4226
+ */
4227
+ groupingStandard?: boolean;
4100
4228
  /**
4101
4229
  * Whether the first (or only) series varies its point colours
4102
4230
  * (`c:varyColors/@val`). Pie/doughnut default this on; single-series
@@ -5494,6 +5622,14 @@ interface PptxSmartArtNode {
5494
5622
  * quick-style variation) applied to every other node.
5495
5623
  */
5496
5624
  coherent3DOff?: boolean;
5625
+ /**
5626
+ * The layout variables PowerPoint recorded for each presentation node
5627
+ * this point drives (`dgm:prSet/@presName` -> `dgm:presLayoutVars`
5628
+ * variable -> `@val`), e.g. `{ hierRoot1: { hierBranch: 'l' } }` for an
5629
+ * org-chart manager set to "Left Hanging". Read-only: the presentation
5630
+ * points themselves round-trip verbatim.
5631
+ */
5632
+ presLayoutVarsByName?: Record<string, Record<string, string>>;
5497
5633
  /**
5498
5634
  * Per-run text + run-properties for the node's first paragraph, captured at
5499
5635
  * parse time. When the joined run text still equals {@link text} (the node
@@ -5563,6 +5699,16 @@ interface PptxSmartArtQuickStyleLabel {
5563
5699
  name: string;
5564
5700
  /** Theme-resolved `dgm:style` refs for this label's role, when available. */
5565
5701
  resolvedStyle?: PptxSmartArtResolvedStyleRef;
5702
+ /**
5703
+ * The label's own `dgm:scene3d` (per-shape camera + light rig). PowerPoint
5704
+ * copies it onto a shape's cached `a:scene3d` unless it is the default
5705
+ * front camera with a `threePt` light (see `applySmartArtQuickStyle3d`).
5706
+ */
5707
+ scene3d?: Pptx3DScene;
5708
+ /** The label's own `dgm:sp3d` (bevel / extrusion / contour / material); absent when empty. */
5709
+ shape3d?: Pptx3DShape;
5710
+ /** The label's `dgm:txPr/a:sp3d` label-text extrusion (Bird's Eye Scene). */
5711
+ text3d?: Text3DStyle;
5566
5712
  }
5567
5713
  /** CT_CTStyleLabel metadata from a color-transform definition. */
5568
5714
  interface PptxSmartArtColorStyleLabel {
@@ -5630,9 +5776,10 @@ interface PptxSmartArtQuickStyle extends PptxSmartArtDefinitionMetadata {
5630
5776
  * for the "Scene" quick styles (Brick, Flat, Metallic, Sunset, Bird's Eye
5631
5777
  * Scene). One camera renders the whole diagram; per-shape `a:scene3d` is
5632
5778
  * absent for those styles (see `PptxSmartArtDrawingShape.scene3d`). Each
5633
- * `dgm:styleLbl` also carries its own per-label `dgm:scene3d`/`dgm:sp3d`,
5634
- * but PowerPoint bakes those fully resolved onto each cached shape's own
5635
- * `dsp:spPr/a:sp3d`, so only the diagram-level scene is exposed here.
5779
+ * `dgm:styleLbl` also carries its own per-label `dgm:scene3d`/`dgm:sp3d`
5780
+ * ({@link PptxSmartArtQuickStyleLabel.scene3d} / `shape3d` / `text3d`),
5781
+ * which PowerPoint bakes onto each cached shape; they are re-applied when a
5782
+ * structural edit regenerates the shapes.
5636
5783
  */
5637
5784
  scene3d?: Pptx3DScene;
5638
5785
  }
@@ -5763,6 +5910,11 @@ interface PptxSmartArtDrawingShape extends PptxCustomPathProperties {
5763
5910
  fillNone?: boolean;
5764
5911
  /** Solid fill colour (hex). */
5765
5912
  fillColor?: string;
5913
+ /**
5914
+ * Opacity (0..1) of the solid fill, from the colour's `a:alpha` (Basic Venn
5915
+ * paints its circles at 50% so overlaps blend). Absent when opaque.
5916
+ */
5917
+ fillOpacity?: number;
5766
5918
  /**
5767
5919
  * Gradient fill stops when the cached shape uses `a:gradFill`. Positions are
5768
5920
  * 0..100 (percent). Renderers emit an SVG/CSS gradient instead of a flat box.
@@ -7736,7 +7888,15 @@ type PptxAnimationTimingCurve = 'ease' | 'ease-in' | 'ease-out' | 'linear';
7736
7888
  /** Repeat mode for animations. */
7737
7889
  type PptxAnimationRepeatMode = 'untilNextClick' | 'untilEndOfSlide';
7738
7890
  /** Animation trigger type from OOXML `p:cTn`. */
7739
- type PptxAnimationTrigger = 'onClick' | 'onShapeClick' | 'onHover' | 'afterPrevious' | 'withPrevious' | 'afterDelay';
7891
+ type PptxAnimationTrigger = 'onClick' | 'onShapeClick' | 'onHover' | 'afterPrevious' | 'withPrevious' | 'afterDelay' |
7892
+ /**
7893
+ * Starts when a media element's playback reaches a named bookmark
7894
+ * (PowerPoint's "Trigger > On Bookmark"). The media element is
7895
+ * {@link PptxElementAnimation.triggerShapeId} and the bookmark
7896
+ * {@link PptxElementAnimation.triggerBookmark}; saved as an interactive
7897
+ * sequence gated on `p:cond evt="onMediaBookmark"` with a `p14:bmkTgt`.
7898
+ */
7899
+ 'onMediaBookmark';
7740
7900
  /**
7741
7901
  * Native animation kind. The historic shape-targeted preset animations are
7742
7902
  * implicitly the default kind (`undefined`). Media animations (`p:audio`,
@@ -7889,8 +8049,13 @@ interface PptxNativeAnimation {
7889
8049
  target?: PptxAnimationTarget;
7890
8050
  /** Trigger type. */
7891
8051
  trigger?: PptxAnimationTrigger;
7892
- /** Shape ID that triggers this animation when clicked (interactive sequence). */
8052
+ /**
8053
+ * Shape ID that triggers this animation: the clicked shape of an
8054
+ * interactive sequence, or the media element of an `onMediaBookmark` one.
8055
+ */
7893
8056
  triggerShapeId?: string;
8057
+ /** Bookmark name an `onMediaBookmark` interactive sequence waits for. */
8058
+ triggerBookmark?: string;
7894
8059
  /** Whether this effect belongs to an OOXML `interactiveSeq`. */
7895
8060
  interactiveSequence?: boolean;
7896
8061
  /** Whether `p:endSync/p:rtn[@val="all"]` makes that sequence replayable. */
@@ -8389,12 +8554,15 @@ interface PptxAttributeAnimation {
8389
8554
  /**
8390
8555
  * `p:anim/@_p14:bounceEnd` (Office 2010 `p14` extension attribute,
8391
8556
  * MS-OI29500), normalized to a 0-1 fraction of this behaviour's own
8392
- * duration. PowerPoint's Fly In "Bounce End" effect option writes this on
8393
- * the position-ramp `p:anim` node(s): the fraction of the duration at
8394
- * which the primary travel completes, with the remainder spent bouncing
8395
- * and settling at the final value. Mirrored verbatim by PowerPoint onto
8396
- * the enclosing `p:cTn/@_p14:presetBounceEnd`. Absent for every animation
8397
- * that doesn't use this effect option (the overwhelming majority).
8557
+ * duration. PowerPoint's "Bounce End" effect option (COM:
8558
+ * `Effect.Timing.BounceEnd` + `BounceEndIntensity`) writes this on the
8559
+ * position-ramp `p:anim` node(s): the share of the duration spent
8560
+ * BOUNCING at the end. Measured from PowerPoint's own CreateVideo frames,
8561
+ * the travel completes at `1 - bounceEnd` and the rest is a damped
8562
+ * oscillation about the final value (see shared's `animation-bounce-end`).
8563
+ * Mirrored verbatim by PowerPoint onto the enclosing
8564
+ * `p:cTn/@_p14:presetBounceEnd`. Absent for every animation that doesn't
8565
+ * use this effect option (the overwhelming majority).
8398
8566
  */
8399
8567
  bounceEnd?: number;
8400
8568
  }
@@ -8572,9 +8740,24 @@ interface PptxElementAnimation {
8572
8740
  durationMs?: number;
8573
8741
  delayMs?: number;
8574
8742
  order?: number;
8743
+ /**
8744
+ * The {@link order} the loader derived from the slide's `p:timing` tree for
8745
+ * an entry whose `pptx:editorMeta` record authored no `@order`. The tree
8746
+ * already expresses that position (and every load re-derives it), so the
8747
+ * writer omits `@order` while `order` still equals this value; a reorder
8748
+ * changes `order` and the attribute is written again. Load-time bookkeeping
8749
+ * only; never set it by hand.
8750
+ */
8751
+ orderFromTimeline?: number;
8575
8752
  trigger?: PptxAnimationTrigger;
8576
- /** Shape ID that triggers this animation when clicked (interactive sequence). */
8753
+ /**
8754
+ * Shape ID that triggers this animation: the shape clicked for
8755
+ * `onShapeClick`, or the media element whose bookmark fires it for
8756
+ * `onMediaBookmark`.
8757
+ */
8577
8758
  triggerShapeId?: string;
8759
+ /** Bookmark name (`p14:bmk/@name`) an `onMediaBookmark` trigger waits for. */
8760
+ triggerBookmark?: string;
8578
8761
  timingCurve?: PptxAnimationTimingCurve;
8579
8762
  repeatCount?: number;
8580
8763
  repeatMode?: PptxAnimationRepeatMode;
@@ -11150,6 +11333,8 @@ interface IPptxHandlerRuntime {
11150
11333
  updateThemeColorScheme(colorScheme: PptxThemeColorScheme): Promise<void>;
11151
11334
  updateThemeFontScheme(fontScheme: PptxThemeFontScheme): Promise<void>;
11152
11335
  updateThemeName(name: string): Promise<void>;
11336
+ /** Resolve a `<p:style>` node against the loaded theme (see PptxHandlerRuntimeStyleMatrixResolve). */
11337
+ resolveStyleMatrixReferences(styleXml: XmlObject): ResolvedStyleMatrix;
11153
11338
  applyTheme(colorScheme: PptxThemeColorScheme, fontScheme: PptxThemeFontScheme, themeName?: string): Promise<void>;
11154
11339
  load(data: ArrayBuffer, options?: PptxHandlerLoadOptions): Promise<PptxData>;
11155
11340
  getChartDataForGraphicFrame(slidePath: string, graphicFrame: XmlObject | undefined): Promise<PptxChartData | undefined>;
@@ -11445,6 +11630,14 @@ declare class PptxHandlerCore {
11445
11630
  * @param name - New display name for the theme.
11446
11631
  */
11447
11632
  updateThemeName(name: string): Promise<void>;
11633
+ /**
11634
+ * Resolve a `<p:style>` block (`a:lnRef` / `a:fillRef` / `a:effectRef` /
11635
+ * `a:fontRef`) against the loaded theme, exactly as the load path would for
11636
+ * a shape whose `spPr` authors nothing. Apply the returned `shapeStyle` to a
11637
+ * shape and it renders like PowerPoint's Shape Styles entry and saves as a
11638
+ * bare `<p:style>` with an empty `spPr`, which is what PowerPoint writes.
11639
+ */
11640
+ resolveStyleMatrixReferences(styleXml: XmlObject): ResolvedStyleMatrix;
11448
11641
  /**
11449
11642
  * Apply a complete theme in one call (colour scheme + font scheme + optional name).
11450
11643
  *
@@ -12337,6 +12530,15 @@ interface PictureBulletMarker {
12337
12530
  imageRelId?: string;
12338
12531
  }
12339
12532
  //#endregion
12533
+ //#region src/render/text-east-asian-breaks.d.ts
12534
+ /** Which of the two behaviours a paragraph asks for. */
12535
+ interface EastAsianBreakOptions {
12536
+ /** `a:pPr/@hangingPunct="1"`. */
12537
+ hangingPunctuation: boolean;
12538
+ /** `a:pPr/@eaLnBrk="0"`: break between any two East Asian characters. */
12539
+ breakAnywhere: boolean;
12540
+ }
12541
+ //#endregion
12340
12542
  //#region src/render/text-run-meta.d.ts
12341
12543
  /** A run's resolved hyperlink target. */
12342
12544
  interface RunHyperlink {
@@ -12510,6 +12712,8 @@ interface ParagraphRun {
12510
12712
  * `paragraph-run-build.ts`).
12511
12713
  */
12512
12714
  underlineWordPieces?: ScriptFontPiece[];
12715
+ /** The advance-carrying space after a hanging `、`/`。` (`text-east-asian-breaks`). */
12716
+ hangingSpace?: true;
12513
12717
  /**
12514
12718
  * `a:reflection` mirrored-sibling wrapper style for this run (the text-run
12515
12719
  * counterpart of a shape/picture's `ComputedEffectStyle.reflection`), or
@@ -12593,6 +12797,12 @@ interface RenderParagraph {
12593
12797
  * break rules, rendered differently in the other four bindings.
12594
12798
  */
12595
12799
  paragraphStyle?: RunStyle;
12800
+ /**
12801
+ * `@hangingPunct` / `@eaLnBrk="0"` as resolved for this paragraph. The runs
12802
+ * above already carry their pieces; React, which rebuilds each segment's
12803
+ * pieces inside one span, re-applies `splitEastAsianBreaks` from this.
12804
+ */
12805
+ eastAsianBreaks?: EastAsianBreakOptions;
12596
12806
  }
12597
12807
  //#endregion
12598
12808
  //#region src/render/inline-list-types.d.ts
@@ -13356,8 +13566,12 @@ interface PresentationInkStroke {
13356
13566
  }
13357
13567
  /** A logical editor command produced by one key press. */
13358
13568
  type EditorKeyActionName = 'undo' | 'redo' | 'copy' | 'cut' | 'paste' | 'duplicate' | 'delete' | 'selectAll' | 'group' | 'ungroup' | 'nudge' | 'prevSlide' | 'nextSlide' | 'escape' | 'find' | 'findReplace' | 'toggleShortcuts' | 'alignLeft' | 'alignCenter' | 'alignRight' | 'alignJustify' | 'increaseFontSize' | 'decreaseFontSize' | 'copyFormat' | 'pasteFormat' | 'newSlide' | 'hyperlink' | 'clearFormatting' | 'cycleSelectionNext' | 'cycleSelectionPrev' | 'pasteSpecial';
13569
+ //#endregion
13570
+ //#region src/render/merge-shapes/merge-shapes-menu.d.ts
13571
+ /** The right-click command id for each operation. */
13572
+ type MergeShapesCommandId = 'merge-union' | 'merge-combine' | 'merge-fragment' | 'merge-intersect' | 'merge-subtract';
13359
13573
  /** Every command a canvas context menu can offer, in no particular order. */
13360
- type ContextMenuCommandId = 'copy' | 'cut' | 'paste' | 'duplicate' | 'edit-text' | 'bring-forward' | 'send-backward' | 'bring-front' | 'send-back' | 'ai-ask' | 'ai-fix' | 'comment' | 'hyperlink' | 'table-insert-row-above' | 'table-insert-row-below' | 'table-delete-row' | 'table-insert-col-left' | 'table-insert-col-right' | 'table-delete-col' | 'table-merge-selected' | 'table-merge-right' | 'table-merge-down' | 'table-split' | 'group' | 'ungroup' | 'save-as-picture' | 'edit-alt-text' | 'size-and-position' | 'format-shape' | 'delete';
13574
+ type ContextMenuCommandId = 'copy' | 'cut' | 'paste' | 'duplicate' | 'edit-text' | 'edit-points' | 'bring-forward' | 'send-backward' | 'bring-front' | 'send-back' | 'ai-ask' | 'ai-fix' | 'comment' | 'hyperlink' | 'table-insert-row-above' | 'table-insert-row-below' | 'table-delete-row' | 'table-insert-col-left' | 'table-insert-col-right' | 'table-delete-col' | 'table-merge-selected' | 'table-merge-right' | 'table-merge-down' | 'table-split' | 'group' | 'ungroup' | 'crop' | MergeShapesCommandId | 'save-as-picture' | 'edit-alt-text' | 'size-and-position' | 'format-shape' | 'delete';
13361
13575
  //#endregion
13362
13576
  //#region src/render/canvas-context-menu-commands.d.ts
13363
13577
  /**
@@ -13621,7 +13835,7 @@ interface AuthoredSlideRange {
13621
13835
  * whole control cluster (zoom in/out/fit, prev/next) rather than each button
13622
13836
  * in it, matching how hosts actually want to hide/keep them as a unit.
13623
13837
  */
13624
- type ToolbarButtonId = 'share' | 'broadcast' | 'export' | 'undo' | 'redo' | 'record' | 'notes' | 'fullscreen' | 'zoom' | 'navigation';
13838
+ type ToolbarButtonId = 'share' | 'broadcast' | 'export' | 'undo' | 'redo' | 'record' | 'notes' | 'fullscreen' | 'zoom' | 'navigation' | 'mergeShapes' | 'crop';
13625
13839
  /** A top-level ribbon tab. `record` intentionally shares its id with the quick-access Record button above: both surface the same recording feature, so hiding one hides the other. */
13626
13840
  type ToolbarTabId = 'file' | 'home' | 'insert' | 'draw' | 'design' | 'transitions' | 'animations' | 'slideShow' | 'record' | 'review' | 'view' | 'help';
13627
13841
  type ToolbarActionId = ToolbarButtonId | ToolbarTabId;
@@ -13827,6 +14041,12 @@ interface PrintSettings {
13827
14041
  */
13828
14042
  scaleToFit?: boolean;
13829
14043
  }
14044
+ /** Every command the Edit Points right-click menu can offer. */
14045
+ type EditPointsCommandId = 'add-point' | 'delete-point' | 'delete-segment' | 'open-path' | 'close-path' | 'smooth-point' | 'straight-point' | 'corner-point' | 'straight-segment' | 'curved-segment' | 'exit';
14046
+ //#endregion
14047
+ //#region src/render/edit-points/freeform-tool-geometry.d.ts
14048
+ /** The two click-to-place drawing tools. */
14049
+ type FreeformToolKind = 'freeformShape' | 'curve';
13830
14050
  //#endregion
13831
14051
  //#region src/render/options/viewer-options-controls.d.ts
13832
14052
  /**
@@ -13897,6 +14117,11 @@ interface ContextMenuCustomization {
13897
14117
  hiddenElementCommands?: readonly ContextMenuCommandId[];
13898
14118
  /** Entries to remove from the empty-canvas menu. */
13899
14119
  hiddenCanvasCommands?: readonly CanvasContextMenuCommandId[];
14120
+ /**
14121
+ * Entries to remove from the Edit Points menu (right-click a vertex or a
14122
+ * segment while editing a shape's points).
14123
+ */
14124
+ hiddenEditPointsCommands?: readonly EditPointsCommandId[];
13900
14125
  /** Remove the element context menu entirely. */
13901
14126
  disableElementMenu?: boolean;
13902
14127
  /** Remove the empty-canvas context menu entirely. */
@@ -13926,7 +14151,12 @@ interface KeyboardCustomization {
13926
14151
  */
13927
14152
  type ViewerPanelId = 'statusBar' | 'slidesPane' | 'inspector' | 'notes' | 'quickAccessToolbar' | 'titleBar';
13928
14153
  /** Feature areas that can be switched off as a whole. */
13929
- type ViewerFeatureId = 'ai' | 'collaboration' | 'comments' | 'presentMode';
14154
+ type ViewerFeatureId = 'ai' | 'collaboration' | 'comments' | 'presentMode' | 'editPoints';
14155
+ /**
14156
+ * The click-to-place drawing tools of Insert > Shapes > Lines: Freeform:
14157
+ * Shape and Curve.
14158
+ */
14159
+ type ViewerDrawingToolId = FreeformToolKind;
13930
14160
  /** Dialogs (and the entry points that open them) a host can remove. */
13931
14161
  type ViewerDialogId = 'options' | 'share' | 'broadcast' | 'print' | 'export';
13932
14162
  /** Export formats offered by the File > Export page. */
@@ -13949,6 +14179,8 @@ interface ViewerCustomization {
13949
14179
  hiddenDialogs?: readonly ViewerDialogId[];
13950
14180
  /** Export formats to remove from File > Export. */
13951
14181
  hiddenExportFormats?: readonly ViewerExportFormatId[];
14182
+ /** Drawing tools to remove from the Insert > Shapes gallery. */
14183
+ hiddenDrawingTools?: readonly ViewerDrawingToolId[];
13952
14184
  }
13953
14185
  //#endregion
13954
14186
  //#region src/render/options/viewer-options-constraints.d.ts
@@ -14042,6 +14274,8 @@ interface ResolvedCustomization {
14042
14274
  hiddenBackstageCards: ReadonlySet<BackstageCardId>;
14043
14275
  hiddenElementCommands: ReadonlySet<ContextMenuCommandId>;
14044
14276
  hiddenCanvasCommands: ReadonlySet<CanvasContextMenuCommandId>;
14277
+ hiddenEditPointsCommands: ReadonlySet<EditPointsCommandId>;
14278
+ hiddenDrawingTools: ReadonlySet<ViewerDrawingToolId>;
14045
14279
  elementMenuEnabled: boolean;
14046
14280
  canvasMenuEnabled: boolean;
14047
14281
  hiddenPanels: ReadonlySet<ViewerPanelId>;
@@ -14166,6 +14400,33 @@ interface ViewportFitOptions {
14166
14400
  /** Positive fit-factor ceiling; null allows enlargement without a ceiling. */
14167
14401
  maxFitScale?: number | null;
14168
14402
  }
14403
+ /** The element fields an Edit Points commit writes. */
14404
+ type EditPointsElementPatch = Pick<ShapePptxElement, 'x' | 'y' | 'width' | 'height' | 'shapeType' | 'shapeAdjustments' | 'pathData' | 'pathWidth' | 'pathHeight' | 'customGeometryPaths' | 'customGeometryRawData' | 'customGeometryAdjustHandlesXY' | 'customGeometryAdjustHandlesPolar' | 'customGeometryConnectionSites' | 'customGeometryTextRect'>;
14405
+ //#endregion
14406
+ //#region src/render/picture-crop/crop-geometry.d.ts
14407
+ /** An axis-aligned rectangle in slide pixels. */
14408
+ interface CropRect {
14409
+ x: number;
14410
+ y: number;
14411
+ width: number;
14412
+ height: number;
14413
+ }
14414
+ /** The four `a:srcRect` insets as fractions of the image (negative pads). */
14415
+ interface CropInsets {
14416
+ cropLeft: number;
14417
+ cropTop: number;
14418
+ cropRight: number;
14419
+ cropBottom: number;
14420
+ }
14421
+ /** What a crop edit writes back onto the picture element. */
14422
+ type CropElementUpdate = CropInsets & CropRect;
14423
+ /** The snapshot a crop session restores on cancel. */
14424
+ interface CropSession {
14425
+ elementId: string;
14426
+ original: CropElementUpdate;
14427
+ /** Insets the picture did not carry at all (no `a:srcRect` opinion). */
14428
+ absentInsets: readonly (keyof CropInsets)[];
14429
+ }
14169
14430
  //#endregion
14170
14431
  //#region src/web-components/select-value.d.ts
14171
14432
  /** Public DOM shape used by all bindings; the element is not a native select. */
@@ -14359,7 +14620,7 @@ interface CanvasContextMenuState {
14359
14620
  y: number;
14360
14621
  }
14361
14622
  /** Identifies an action triggered from the element right-click context menu. */
14362
- type ElementContextMenuAction = 'copy' | 'cut' | 'paste' | 'duplicate' | 'delete' | 'bring-forward' | 'send-backward' | 'bring-front' | 'send-back' | 'bringForward' | 'sendBackward' | 'bringToFront' | 'sendToBack' | 'comment' | 'addComment' | 'group' | 'ungroup' | 'editPoints' | 'editHyperlink' | 'edit-text' | 'save-as-picture' | 'edit-alt-text' | 'size-and-position' | 'format-shape';
14623
+ type ElementContextMenuAction = 'copy' | 'cut' | 'paste' | 'duplicate' | 'delete' | 'bring-forward' | 'send-backward' | 'bring-front' | 'send-back' | 'bringForward' | 'sendBackward' | 'bringToFront' | 'sendToBack' | 'comment' | 'addComment' | 'group' | 'ungroup' | 'editPoints' | 'edit-points' | 'editHyperlink' | 'edit-text' | 'save-as-picture' | 'edit-alt-text' | 'size-and-position' | 'format-shape';
14363
14624
  /**
14364
14625
  * State of an active marquee (rubber-band) selection rectangle.
14365
14626
  * Created when the user clicks and drags on the canvas background,
@@ -14448,6 +14709,8 @@ interface ToolbarProps {
14448
14709
  tableEditorState?: TableCellEditorState | null;
14449
14710
  editTemplateMode: boolean;
14450
14711
  newShapeType: SupportedShapeType;
14712
+ /** The armed Freeform: Shape / Curve tool, or null. */
14713
+ activeFreeformTool?: FreeformToolKind | null;
14451
14714
  activeTool: DrawingTool;
14452
14715
  drawingColor: string;
14453
14716
  drawingWidth: number;
@@ -14481,6 +14744,8 @@ interface ToolbarProps {
14481
14744
  onRedo: () => void;
14482
14745
  onToggleFindReplace: () => void;
14483
14746
  onSetNewShapeType: (type: SupportedShapeType) => void;
14747
+ /** Arm (or, with null, disarm) a Freeform: Shape / Curve tool. */
14748
+ onArmFreeformTool?: (tool: FreeformToolKind | null) => void;
14484
14749
  onAddTextBox: () => void;
14485
14750
  onAddShape: () => void;
14486
14751
  onAddTable: () => void;
@@ -14981,6 +15246,8 @@ interface UseElementManipulationInput {
14981
15246
  * production, only in tests that do not exercise "Edit Text".
14982
15247
  */
14983
15248
  onEditText?: (elementId: string) => void;
15249
+ /** Enter Edit Points mode on `elementId` (context menu "Edit Points"). */
15250
+ onEditPoints?: (elementId: string) => void;
14984
15251
  /**
14985
15252
  * Rasterise `elementId`'s own DOM node and download it as PNG ("Save as
14986
15253
  * Picture"). Lives outside this hook because it needs the binding's
@@ -15669,6 +15936,31 @@ interface ViewerDialogsResult {
15669
15936
  //#region src/viewer/hooks/useViewerDialogs.d.ts
15670
15937
  declare function useViewerDialogs(input: UseViewerDialogsInput): ViewerDialogsResult;
15671
15938
  //#endregion
15939
+ //#region src/viewer/hooks/useCropSessionState.d.ts
15940
+ interface CropSessionState {
15941
+ /** The open crop session, or null outside crop mode. */
15942
+ cropSession: CropSession | null;
15943
+ /** Mirror of `cropSession`, readable synchronously by the history gate. */
15944
+ cropSessionRef: React.MutableRefObject<CropSession | null>;
15945
+ /** Open or close the session; keeps the ref and the state in step. */
15946
+ setCropSession: (session: CropSession | null) => void;
15947
+ }
15948
+ //#endregion
15949
+ //#region src/viewer/hooks/useEditPointsState.d.ts
15950
+ /**
15951
+ * Viewer state for the two outline-authoring modes: Edit Points on one shape,
15952
+ * and the armed Freeform: Shape / Curve drawing tool. At most one is active;
15953
+ * arming a tool ends Edit Points and starting Edit Points disarms the tool.
15954
+ */
15955
+ interface EditPointsModeState {
15956
+ /** The shape in Edit Points mode, or null. */
15957
+ editPointsElementId: string | null;
15958
+ setEditPointsElementId: (id: string | null) => void;
15959
+ /** The armed click-to-place drawing tool, or null. */
15960
+ activeFreeformTool: FreeformToolKind | null;
15961
+ setActiveFreeformTool: (tool: FreeformToolKind | null) => void;
15962
+ }
15963
+ //#endregion
15672
15964
  //#region src/viewer/hooks/viewer-core-state-types.d.ts
15673
15965
  /**
15674
15966
  * Input parameters for the {@link useViewerCoreState} hook.
@@ -15687,7 +15979,7 @@ interface UseViewerCoreStateInput {
15687
15979
  * that comprises the core viewer state. It is merged with {@link ViewerUIState}
15688
15980
  * inside {@link useViewerState} to produce the unified {@link ViewerState}.
15689
15981
  */
15690
- interface ViewerCoreState extends InlineEditingState {
15982
+ interface ViewerCoreState extends InlineEditingState, EditPointsModeState {
15691
15983
  /** Ref to the outermost container `<div>` wrapping the viewer. */
15692
15984
  containerRef: React$1.RefObject<HTMLDivElement | null>;
15693
15985
  /** Hidden `<input type="file">` used to trigger image file selection. */
@@ -16034,7 +16326,7 @@ interface UseViewerStateInput {
16034
16326
  * The unified viewer state: intersection of core state (slides, elements,
16035
16327
  * refs, presentation metadata) and UI state (panel toggles, tools, grid/snap).
16036
16328
  */
16037
- type ViewerState = ViewerCoreState & ViewerUIState;
16329
+ type ViewerState = ViewerCoreState & ViewerUIState & CropSessionState;
16038
16330
  /**
16039
16331
  * Composes core and UI state into a single unified state object.
16040
16332
  *
@@ -16124,6 +16416,23 @@ interface TableStyleContext {
16124
16416
  theme?: PptxTheme;
16125
16417
  }
16126
16418
  //#endregion
16419
+ //#region src/viewer/components/canvas/OutlineAuthoringLayer.d.ts
16420
+ /** Wiring for Edit Points and the Freeform: Shape / Curve tools. */
16421
+ interface OutlineAuthoringProps {
16422
+ /** The shape in Edit Points mode, or null. */
16423
+ editPointsElementId: string | null;
16424
+ /** Edit Points menu commands the host hid. */
16425
+ hiddenEditPointsCommands?: ReadonlySet<EditPointsCommandId>;
16426
+ /** Apply one Edit Points edit (one undo step). */
16427
+ onCommitEditPoints: (elementId: string, patch: EditPointsElementPatch) => void;
16428
+ onExitEditPoints: () => void;
16429
+ /** The armed drawing tool, or null. */
16430
+ freeformTool: FreeformToolKind | null;
16431
+ /** Insert a drawn freeform (the tool then disarms). */
16432
+ onFreeformCommit: (element: ShapePptxElement) => void;
16433
+ onFreeformCancel: () => void;
16434
+ }
16435
+ //#endregion
16127
16436
  //#region src/viewer/components/canvas/canvas-types.d.ts
16128
16437
  interface ZoomViewport {
16129
16438
  canvasViewportRef: React$1.RefObject<HTMLDivElement | null>;
@@ -16271,6 +16580,7 @@ interface SlideCanvasProps {
16271
16580
  * changes tween while the AI assistant is working (see AiFocusHighlightOverlay).
16272
16581
  */
16273
16582
  aiActive?: boolean;
16583
+ outlineAuthoring?: OutlineAuthoringProps;
16274
16584
  }
16275
16585
  //#endregion
16276
16586
  //#region src/viewer/hooks/useAutosave.d.ts
@@ -18217,6 +18527,7 @@ declare function useKeyboardShortcuts(input: UseKeyboardShortcutsInput): void;
18217
18527
  interface MergeShapesHandlerInput {
18218
18528
  activeSlide: PptxSlide | undefined;
18219
18529
  activeSlideIndex: number;
18530
+ /** The selection in SELECTION order: the first entry's formatting survives. */
18220
18531
  selectedElements: PptxElement[];
18221
18532
  effectiveSelectedIds: string[];
18222
18533
  setSelectedElementIds: React.Dispatch<React.SetStateAction<string[]>>;