pptx-react-viewer 4.6.0 → 4.7.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 +18 -0
  2. package/dist/{AiChatPanel-3C7GM6ZF.js → AiChatPanel-3YILWCBX.js} +28 -28
  3. package/dist/AiChatPanel-3YILWCBX.js.br +0 -0
  4. package/dist/AiChatPanel-3YILWCBX.js.gz +0 -0
  5. package/dist/{AiChatPanel-L7DBCWE3.mjs → AiChatPanel-X2MVL5UP.mjs} +4 -4
  6. package/dist/AiChatPanel-X2MVL5UP.mjs.br +0 -0
  7. package/dist/AiChatPanel-X2MVL5UP.mjs.gz +0 -0
  8. package/dist/{Model3DScene-USKNPWWH.js → Model3DScene-G7P6ZAIO.js} +2 -2
  9. package/dist/{Model3DScene-USKNPWWH.js.br → Model3DScene-G7P6ZAIO.js.br} +0 -0
  10. package/dist/Model3DScene-G7P6ZAIO.js.gz +0 -0
  11. package/dist/{Model3DScene-IJ7YYTYU.mjs → Model3DScene-QFWI5CEE.mjs} +1 -1
  12. package/dist/Model3DScene-QFWI5CEE.mjs.br +0 -0
  13. package/dist/Model3DScene-QFWI5CEE.mjs.gz +0 -0
  14. package/dist/{chunk-5V5SMT5A.js → chunk-2BM4GBFZ.js} +5 -5
  15. package/dist/chunk-2BM4GBFZ.js.br +0 -0
  16. package/dist/chunk-2BM4GBFZ.js.gz +0 -0
  17. package/dist/{chunk-K6QHGABT.mjs → chunk-5J6NW3YS.mjs} +55 -28
  18. package/dist/chunk-5J6NW3YS.mjs.br +0 -0
  19. package/dist/chunk-5J6NW3YS.mjs.gz +0 -0
  20. package/dist/{chunk-FZSYLXJT.js → chunk-AQIXKTAT.js} +13118 -8704
  21. package/dist/chunk-AQIXKTAT.js.br +0 -0
  22. package/dist/chunk-AQIXKTAT.js.gz +0 -0
  23. package/dist/{chunk-VCAQSSGD.mjs → chunk-E5OIDWHO.mjs} +1 -1
  24. package/dist/chunk-E5OIDWHO.mjs.br +0 -0
  25. package/dist/chunk-E5OIDWHO.mjs.gz +0 -0
  26. package/dist/{chunk-Y4QUVWZC.js → chunk-FYAOOACZ.js} +241 -214
  27. package/dist/chunk-FYAOOACZ.js.br +0 -0
  28. package/dist/chunk-FYAOOACZ.js.gz +0 -0
  29. package/dist/{chunk-INX3E37P.mjs → chunk-OECUSL2B.mjs} +80 -283
  30. package/dist/chunk-OECUSL2B.mjs.br +0 -0
  31. package/dist/chunk-OECUSL2B.mjs.gz +0 -0
  32. package/dist/{chunk-ICEZL4TM.mjs → chunk-QLDHUKH2.mjs} +13074 -8701
  33. package/dist/chunk-QLDHUKH2.mjs.br +0 -0
  34. package/dist/chunk-QLDHUKH2.mjs.gz +0 -0
  35. package/dist/{chunk-IBHIXBC5.js → chunk-SR7ETIBF.js} +889 -1091
  36. package/dist/chunk-SR7ETIBF.js.br +0 -0
  37. package/dist/chunk-SR7ETIBF.js.gz +0 -0
  38. package/dist/{chunk-ZAQFTO4P.mjs → chunk-UBYFLXAU.mjs} +1174 -148
  39. package/dist/chunk-UBYFLXAU.mjs.br +0 -0
  40. package/dist/chunk-UBYFLXAU.mjs.gz +0 -0
  41. package/dist/{chunk-3JUZOKFI.js → chunk-UIAU3NR2.js} +44 -0
  42. package/dist/chunk-UIAU3NR2.js.br +0 -0
  43. package/dist/chunk-UIAU3NR2.js.gz +0 -0
  44. package/dist/{chunk-DFSWCVRW.js → chunk-VF4RA27Q.js} +3082 -2056
  45. package/dist/chunk-VF4RA27Q.js.br +0 -0
  46. package/dist/chunk-VF4RA27Q.js.gz +0 -0
  47. package/dist/{chunk-OOO4JL2N.mjs → chunk-WIEBQGQI.mjs} +44 -0
  48. package/dist/chunk-WIEBQGQI.mjs.br +0 -0
  49. package/dist/chunk-WIEBQGQI.mjs.gz +0 -0
  50. package/dist/i18n/de.cjs +70 -21
  51. package/dist/i18n/de.cjs.br +0 -0
  52. package/dist/i18n/de.cjs.gz +0 -0
  53. package/dist/i18n/de.mjs +70 -21
  54. package/dist/i18n/de.mjs.br +0 -0
  55. package/dist/i18n/de.mjs.gz +0 -0
  56. package/dist/i18n/es.cjs +70 -21
  57. package/dist/i18n/es.cjs.br +0 -0
  58. package/dist/i18n/es.cjs.gz +0 -0
  59. package/dist/i18n/es.mjs +70 -21
  60. package/dist/i18n/es.mjs.br +0 -0
  61. package/dist/i18n/es.mjs.gz +0 -0
  62. package/dist/i18n/fr.cjs +70 -21
  63. package/dist/i18n/fr.cjs.br +0 -0
  64. package/dist/i18n/fr.cjs.gz +0 -0
  65. package/dist/i18n/fr.mjs +70 -21
  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 +48 -4
  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 +48 -4
  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 +177 -15
  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 +230 -15
  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 +149 -13
  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 +3 -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
@@ -1483,8 +1483,16 @@ interface TextStyle {
1483
1483
  textOutlineWidth?: number;
1484
1484
  /** Text outline colour as hex string (`a:rPr > a:ln > a:solidFill`). */
1485
1485
  textOutlineColor?: string;
1486
+ /** Text outline dash preset (`a:rPr > a:ln > a:prstDash/@val`), e.g. `dash`; absent for solid. */
1487
+ textOutlineDash?: string;
1486
1488
  /** When true, the text body has no fill (`a:rPr > a:noFill`), producing hollow/outline-only text. */
1487
1489
  textFillNone?: boolean;
1490
+ /**
1491
+ * When true, the run authored an EMPTY `<a:effectLst/>`: an explicit "no
1492
+ * effects" override that blocks an inherited shadow or glow. Kept so a
1493
+ * rewrite re-emits it instead of letting the inherited effect return.
1494
+ */
1495
+ textEffectsExplicitNone?: boolean;
1488
1496
  /** Superscript/subscript baseline shift as percentage (`a:rPr/@baseline`). Positive = super, negative = sub. */
1489
1497
  baseline?: number;
1490
1498
  /** Character spacing in hundredths of a point (`a:rPr/@spc`). */
@@ -1518,6 +1526,25 @@ interface TextStyle {
1518
1526
  textFillPatternForeground?: string;
1519
1527
  /** Text-level pattern background colour. */
1520
1528
  textFillPatternBackground?: string;
1529
+ /**
1530
+ * Raw `a:rPr > a:blipFill` XML, preserved verbatim for round-trip
1531
+ * serialization AND as the input to the image resolution pass that fills
1532
+ * in {@link textFillBlipUrl} (parsing a run's fill happens synchronously,
1533
+ * with no zip/relationship access at that point; resolving the blip to a
1534
+ * displayable URL needs both, so it happens in a later async pass over
1535
+ * the slide's parsed elements, mirroring how a shape's OWN image fill is
1536
+ * resolved). A picture-filled text run (`a:rPr > a:blipFill`) was
1537
+ * documented as handled ("Handles gradient fills, pattern fills, and
1538
+ * image fills on text runs") but never actually parsed, so it silently
1539
+ * fell through to the run's plain `color` and rendered solid black
1540
+ * (COM-verified: `audit-text` slide 13's "PICTURE FILL" run shows the
1541
+ * fill image through the glyphs in PowerPoint).
1542
+ */
1543
+ textFillBlipXml?: XmlObject;
1544
+ /** Resolved displayable URL for {@link textFillBlipXml}, or the archive-relative path when unresolved (lazy decode). */
1545
+ textFillBlipUrl?: string;
1546
+ /** Tiling mode for {@link textFillBlipUrl} (`a:blipFill/a:tile` present -> 'tile', else 'stretch'). */
1547
+ textFillBlipMode?: 'stretch' | 'tile';
1521
1548
  hyperlink?: string;
1522
1549
  /** Relationship ID for the hyperlink (`a:hlinkClick/@r:id`) — preserved for round-trip serialization. */
1523
1550
  hyperlinkRId?: string;
@@ -1603,6 +1630,13 @@ interface TextStyle {
1603
1630
  position: number;
1604
1631
  align: 'l' | 'ctr' | 'r' | 'dec';
1605
1632
  leader?: 'none' | 'dot' | 'hyphen' | 'underscore';
1633
+ /**
1634
+ * True when the source spelled out the schema-default `@algn="l"`, so the
1635
+ * writer re-emits it instead of treating it as an omitted default.
1636
+ */
1637
+ alignAuthored?: boolean;
1638
+ /** True when the source spelled out the schema-default `@leader="none"`. */
1639
+ leaderAuthored?: boolean;
1606
1640
  }>;
1607
1641
  /**
1608
1642
  * True when the paragraph's own `a:pPr` authored an EMPTY `<a:tabLst/>`
@@ -1966,6 +2000,19 @@ interface TextStyle {
1966
2000
  * convention used for {@link bulletInfo} / {@link endParaRunProperties}).
1967
2001
  */
1968
2002
  paragraphDefaultRunPropertiesXml?: XmlObject;
2003
+ /**
2004
+ * The bullet colour / size / typeface children (`a:buClrTx`, `a:buClr`,
2005
+ * `a:buSzTx`, `a:buSzPct`, `a:buSzPts`, `a:buFontTx`, `a:buFont`) a
2006
+ * paragraph authored in its own `<a:pPr>` WITHOUT a bullet type
2007
+ * (`a:buNone` / `a:buChar` / `a:buAutoNum` / `a:buBlip`), captured
2008
+ * verbatim in source order. Such a paragraph restyles an inherited bullet
2009
+ * rather than declaring one, so its {@link BulletInfo} resolves from the
2010
+ * cascade and is (correctly) not written back; without this capture the
2011
+ * paragraph's own override vanished on every rewrite.
2012
+ *
2013
+ * Only meaningful on a paragraph's own authored properties.
2014
+ */
2015
+ paragraphBulletPropertiesXml?: XmlObject;
1969
2016
  }
1970
2017
  /**
1971
2018
  * Structured bullet metadata attached to the first {@link TextSegment}
@@ -3234,6 +3281,26 @@ type PptxChartMarkerSymbol = 'circle' | 'dash' | 'diamond' | 'dot' | 'none' | 'p
3234
3281
  */
3235
3282
  type PptxChartScatterStyle = 'none' | 'line' | 'lineMarker' | 'marker' | 'smooth' | 'smoothMarker';
3236
3283
  /** Shape properties extracted from c:spPr for chart formatting. */
3284
+ /**
3285
+ * A render-ready gradient fill from a chart `c:spPr/a:gradFill` (chart area,
3286
+ * plot area or series). Positions are 0..100; a linear gradient's `angle` is
3287
+ * in degrees clockwise from left-to-right (`a:lin/@ang`); a radial (`a:path`)
3288
+ * gradient centres on `focalPoint` (0..1 fractions of the box), the middle
3289
+ * when absent.
3290
+ */
3291
+ interface PptxChartGradientFill {
3292
+ type: 'linear' | 'radial';
3293
+ stops: Array<{
3294
+ color: string;
3295
+ position: number;
3296
+ opacity?: number;
3297
+ }>;
3298
+ angle?: number;
3299
+ focalPoint?: {
3300
+ x: number;
3301
+ y: number;
3302
+ };
3303
+ }
3237
3304
  interface PptxChartShapeProps {
3238
3305
  fillColor?: string;
3239
3306
  strokeColor?: string;
@@ -3559,6 +3626,12 @@ interface PptxChartSeries {
3559
3626
  */
3560
3627
  idx?: number;
3561
3628
  values: number[];
3629
+ /**
3630
+ * Series gradient fill (`c:ser/c:spPr/a:gradFill`), painted on every mark
3631
+ * of the series that has no per-point override. Render-only: the series'
3632
+ * own `c:spPr` round-trips untouched.
3633
+ */
3634
+ gradientFill?: PptxChartGradientFill;
3562
3635
  /**
3563
3636
  * Per-series x values from `c:ser/c:xVal` (scatter and bubble series only).
3564
3637
  *
@@ -3733,6 +3806,12 @@ interface PptxChartFilteredSeries {
3733
3806
  * and `c:dLblPos`.
3734
3807
  */
3735
3808
  interface PptxChartDataLabelOptions {
3809
+ /** Label box fill/outline (`c:dLbls/c:spPr`), see `chart-data-label-box.ts`. */
3810
+ labelShape?: PptxChartShapeProps;
3811
+ /** Callout geometry of the label box (`c15:spPr/a:prstGeom/@prst`, e.g. `wedgeRectCallout`). */
3812
+ calloutShape?: string;
3813
+ /** The chart15 extension's `c15:showLeaderLines`, which wins for a moved label's leader line. */
3814
+ extLeaderLines?: boolean;
3736
3815
  /** Show the numeric value (`c:showVal`). */
3737
3816
  showValue?: boolean;
3738
3817
  /** Show the category name (`c:showCatName`). */
@@ -3858,6 +3937,10 @@ interface PptxChartStyle {
3858
3937
  chartAreaFill?: string;
3859
3938
  /** Plot-area fill from `c:plotArea/c:spPr`. See {@link chartAreaFill}. */
3860
3939
  plotAreaFill?: string;
3940
+ /** Chart-area gradient (`c:chartSpace/c:spPr/a:gradFill`); wins over {@link chartAreaFill}. */
3941
+ chartAreaGradient?: PptxChartGradientFill;
3942
+ /** Plot-area gradient (`c:plotArea/c:spPr/a:gradFill`); wins over {@link plotAreaFill}. */
3943
+ plotAreaGradient?: PptxChartGradientFill;
3861
3944
  /** Whether data labels are shown. */
3862
3945
  hasDataLabels?: boolean;
3863
3946
  /** Chart-level data-label content/position options (when `hasDataLabels`). */
@@ -7736,7 +7819,15 @@ type PptxAnimationTimingCurve = 'ease' | 'ease-in' | 'ease-out' | 'linear';
7736
7819
  /** Repeat mode for animations. */
7737
7820
  type PptxAnimationRepeatMode = 'untilNextClick' | 'untilEndOfSlide';
7738
7821
  /** Animation trigger type from OOXML `p:cTn`. */
7739
- type PptxAnimationTrigger = 'onClick' | 'onShapeClick' | 'onHover' | 'afterPrevious' | 'withPrevious' | 'afterDelay';
7822
+ type PptxAnimationTrigger = 'onClick' | 'onShapeClick' | 'onHover' | 'afterPrevious' | 'withPrevious' | 'afterDelay' |
7823
+ /**
7824
+ * Starts when a media element's playback reaches a named bookmark
7825
+ * (PowerPoint's "Trigger > On Bookmark"). The media element is
7826
+ * {@link PptxElementAnimation.triggerShapeId} and the bookmark
7827
+ * {@link PptxElementAnimation.triggerBookmark}; saved as an interactive
7828
+ * sequence gated on `p:cond evt="onMediaBookmark"` with a `p14:bmkTgt`.
7829
+ */
7830
+ 'onMediaBookmark';
7740
7831
  /**
7741
7832
  * Native animation kind. The historic shape-targeted preset animations are
7742
7833
  * implicitly the default kind (`undefined`). Media animations (`p:audio`,
@@ -7889,8 +7980,13 @@ interface PptxNativeAnimation {
7889
7980
  target?: PptxAnimationTarget;
7890
7981
  /** Trigger type. */
7891
7982
  trigger?: PptxAnimationTrigger;
7892
- /** Shape ID that triggers this animation when clicked (interactive sequence). */
7983
+ /**
7984
+ * Shape ID that triggers this animation: the clicked shape of an
7985
+ * interactive sequence, or the media element of an `onMediaBookmark` one.
7986
+ */
7893
7987
  triggerShapeId?: string;
7988
+ /** Bookmark name an `onMediaBookmark` interactive sequence waits for. */
7989
+ triggerBookmark?: string;
7894
7990
  /** Whether this effect belongs to an OOXML `interactiveSeq`. */
7895
7991
  interactiveSequence?: boolean;
7896
7992
  /** Whether `p:endSync/p:rtn[@val="all"]` makes that sequence replayable. */
@@ -8389,12 +8485,15 @@ interface PptxAttributeAnimation {
8389
8485
  /**
8390
8486
  * `p:anim/@_p14:bounceEnd` (Office 2010 `p14` extension attribute,
8391
8487
  * 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).
8488
+ * duration. PowerPoint's "Bounce End" effect option (COM:
8489
+ * `Effect.Timing.BounceEnd` + `BounceEndIntensity`) writes this on the
8490
+ * position-ramp `p:anim` node(s): the share of the duration spent
8491
+ * BOUNCING at the end. Measured from PowerPoint's own CreateVideo frames,
8492
+ * the travel completes at `1 - bounceEnd` and the rest is a damped
8493
+ * oscillation about the final value (see shared's `animation-bounce-end`).
8494
+ * Mirrored verbatim by PowerPoint onto the enclosing
8495
+ * `p:cTn/@_p14:presetBounceEnd`. Absent for every animation that doesn't
8496
+ * use this effect option (the overwhelming majority).
8398
8497
  */
8399
8498
  bounceEnd?: number;
8400
8499
  }
@@ -8572,9 +8671,24 @@ interface PptxElementAnimation {
8572
8671
  durationMs?: number;
8573
8672
  delayMs?: number;
8574
8673
  order?: number;
8674
+ /**
8675
+ * The {@link order} the loader derived from the slide's `p:timing` tree for
8676
+ * an entry whose `pptx:editorMeta` record authored no `@order`. The tree
8677
+ * already expresses that position (and every load re-derives it), so the
8678
+ * writer omits `@order` while `order` still equals this value; a reorder
8679
+ * changes `order` and the attribute is written again. Load-time bookkeeping
8680
+ * only; never set it by hand.
8681
+ */
8682
+ orderFromTimeline?: number;
8575
8683
  trigger?: PptxAnimationTrigger;
8576
- /** Shape ID that triggers this animation when clicked (interactive sequence). */
8684
+ /**
8685
+ * Shape ID that triggers this animation: the shape clicked for
8686
+ * `onShapeClick`, or the media element whose bookmark fires it for
8687
+ * `onMediaBookmark`.
8688
+ */
8577
8689
  triggerShapeId?: string;
8690
+ /** Bookmark name (`p14:bmk/@name`) an `onMediaBookmark` trigger waits for. */
8691
+ triggerBookmark?: string;
8578
8692
  timingCurve?: PptxAnimationTimingCurve;
8579
8693
  repeatCount?: number;
8580
8694
  repeatMode?: PptxAnimationRepeatMode;
@@ -13356,8 +13470,12 @@ interface PresentationInkStroke {
13356
13470
  }
13357
13471
  /** A logical editor command produced by one key press. */
13358
13472
  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';
13473
+ //#endregion
13474
+ //#region src/render/merge-shapes/merge-shapes-menu.d.ts
13475
+ /** The right-click command id for each operation. */
13476
+ type MergeShapesCommandId = 'merge-union' | 'merge-combine' | 'merge-fragment' | 'merge-intersect' | 'merge-subtract';
13359
13477
  /** 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';
13478
+ 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
13479
  //#endregion
13362
13480
  //#region src/render/canvas-context-menu-commands.d.ts
13363
13481
  /**
@@ -13621,7 +13739,7 @@ interface AuthoredSlideRange {
13621
13739
  * whole control cluster (zoom in/out/fit, prev/next) rather than each button
13622
13740
  * in it, matching how hosts actually want to hide/keep them as a unit.
13623
13741
  */
13624
- type ToolbarButtonId = 'share' | 'broadcast' | 'export' | 'undo' | 'redo' | 'record' | 'notes' | 'fullscreen' | 'zoom' | 'navigation';
13742
+ type ToolbarButtonId = 'share' | 'broadcast' | 'export' | 'undo' | 'redo' | 'record' | 'notes' | 'fullscreen' | 'zoom' | 'navigation' | 'mergeShapes' | 'crop';
13625
13743
  /** 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
13744
  type ToolbarTabId = 'file' | 'home' | 'insert' | 'draw' | 'design' | 'transitions' | 'animations' | 'slideShow' | 'record' | 'review' | 'view' | 'help';
13627
13745
  type ToolbarActionId = ToolbarButtonId | ToolbarTabId;
@@ -13827,6 +13945,12 @@ interface PrintSettings {
13827
13945
  */
13828
13946
  scaleToFit?: boolean;
13829
13947
  }
13948
+ /** Every command the Edit Points right-click menu can offer. */
13949
+ type EditPointsCommandId = 'add-point' | 'delete-point' | 'delete-segment' | 'open-path' | 'close-path' | 'smooth-point' | 'straight-point' | 'corner-point' | 'straight-segment' | 'curved-segment' | 'exit';
13950
+ //#endregion
13951
+ //#region src/render/edit-points/freeform-tool-geometry.d.ts
13952
+ /** The two click-to-place drawing tools. */
13953
+ type FreeformToolKind = 'freeformShape' | 'curve';
13830
13954
  //#endregion
13831
13955
  //#region src/render/options/viewer-options-controls.d.ts
13832
13956
  /**
@@ -13897,6 +14021,11 @@ interface ContextMenuCustomization {
13897
14021
  hiddenElementCommands?: readonly ContextMenuCommandId[];
13898
14022
  /** Entries to remove from the empty-canvas menu. */
13899
14023
  hiddenCanvasCommands?: readonly CanvasContextMenuCommandId[];
14024
+ /**
14025
+ * Entries to remove from the Edit Points menu (right-click a vertex or a
14026
+ * segment while editing a shape's points).
14027
+ */
14028
+ hiddenEditPointsCommands?: readonly EditPointsCommandId[];
13900
14029
  /** Remove the element context menu entirely. */
13901
14030
  disableElementMenu?: boolean;
13902
14031
  /** Remove the empty-canvas context menu entirely. */
@@ -13926,7 +14055,12 @@ interface KeyboardCustomization {
13926
14055
  */
13927
14056
  type ViewerPanelId = 'statusBar' | 'slidesPane' | 'inspector' | 'notes' | 'quickAccessToolbar' | 'titleBar';
13928
14057
  /** Feature areas that can be switched off as a whole. */
13929
- type ViewerFeatureId = 'ai' | 'collaboration' | 'comments' | 'presentMode';
14058
+ type ViewerFeatureId = 'ai' | 'collaboration' | 'comments' | 'presentMode' | 'editPoints';
14059
+ /**
14060
+ * The click-to-place drawing tools of Insert > Shapes > Lines: Freeform:
14061
+ * Shape and Curve.
14062
+ */
14063
+ type ViewerDrawingToolId = FreeformToolKind;
13930
14064
  /** Dialogs (and the entry points that open them) a host can remove. */
13931
14065
  type ViewerDialogId = 'options' | 'share' | 'broadcast' | 'print' | 'export';
13932
14066
  /** Export formats offered by the File > Export page. */
@@ -13949,6 +14083,8 @@ interface ViewerCustomization {
13949
14083
  hiddenDialogs?: readonly ViewerDialogId[];
13950
14084
  /** Export formats to remove from File > Export. */
13951
14085
  hiddenExportFormats?: readonly ViewerExportFormatId[];
14086
+ /** Drawing tools to remove from the Insert > Shapes gallery. */
14087
+ hiddenDrawingTools?: readonly ViewerDrawingToolId[];
13952
14088
  }
13953
14089
  //#endregion
13954
14090
  //#region src/render/options/viewer-options-constraints.d.ts
@@ -14042,6 +14178,8 @@ interface ResolvedCustomization {
14042
14178
  hiddenBackstageCards: ReadonlySet<BackstageCardId>;
14043
14179
  hiddenElementCommands: ReadonlySet<ContextMenuCommandId>;
14044
14180
  hiddenCanvasCommands: ReadonlySet<CanvasContextMenuCommandId>;
14181
+ hiddenEditPointsCommands: ReadonlySet<EditPointsCommandId>;
14182
+ hiddenDrawingTools: ReadonlySet<ViewerDrawingToolId>;
14045
14183
  elementMenuEnabled: boolean;
14046
14184
  canvasMenuEnabled: boolean;
14047
14185
  hiddenPanels: ReadonlySet<ViewerPanelId>;
@@ -14166,6 +14304,33 @@ interface ViewportFitOptions {
14166
14304
  /** Positive fit-factor ceiling; null allows enlargement without a ceiling. */
14167
14305
  maxFitScale?: number | null;
14168
14306
  }
14307
+ /** The element fields an Edit Points commit writes. */
14308
+ type EditPointsElementPatch = Pick<ShapePptxElement, 'x' | 'y' | 'width' | 'height' | 'shapeType' | 'shapeAdjustments' | 'pathData' | 'pathWidth' | 'pathHeight' | 'customGeometryPaths' | 'customGeometryRawData' | 'customGeometryAdjustHandlesXY' | 'customGeometryAdjustHandlesPolar' | 'customGeometryConnectionSites' | 'customGeometryTextRect'>;
14309
+ //#endregion
14310
+ //#region src/render/picture-crop/crop-geometry.d.ts
14311
+ /** An axis-aligned rectangle in slide pixels. */
14312
+ interface CropRect {
14313
+ x: number;
14314
+ y: number;
14315
+ width: number;
14316
+ height: number;
14317
+ }
14318
+ /** The four `a:srcRect` insets as fractions of the image (negative pads). */
14319
+ interface CropInsets {
14320
+ cropLeft: number;
14321
+ cropTop: number;
14322
+ cropRight: number;
14323
+ cropBottom: number;
14324
+ }
14325
+ /** What a crop edit writes back onto the picture element. */
14326
+ type CropElementUpdate = CropInsets & CropRect;
14327
+ /** The snapshot a crop session restores on cancel. */
14328
+ interface CropSession {
14329
+ elementId: string;
14330
+ original: CropElementUpdate;
14331
+ /** Insets the picture did not carry at all (no `a:srcRect` opinion). */
14332
+ absentInsets: readonly (keyof CropInsets)[];
14333
+ }
14169
14334
  //#endregion
14170
14335
  //#region src/web-components/select-value.d.ts
14171
14336
  /** Public DOM shape used by all bindings; the element is not a native select. */
@@ -14359,7 +14524,7 @@ interface CanvasContextMenuState {
14359
14524
  y: number;
14360
14525
  }
14361
14526
  /** 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';
14527
+ 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
14528
  /**
14364
14529
  * State of an active marquee (rubber-band) selection rectangle.
14365
14530
  * Created when the user clicks and drags on the canvas background,
@@ -14448,6 +14613,8 @@ interface ToolbarProps {
14448
14613
  tableEditorState?: TableCellEditorState | null;
14449
14614
  editTemplateMode: boolean;
14450
14615
  newShapeType: SupportedShapeType;
14616
+ /** The armed Freeform: Shape / Curve tool, or null. */
14617
+ activeFreeformTool?: FreeformToolKind | null;
14451
14618
  activeTool: DrawingTool;
14452
14619
  drawingColor: string;
14453
14620
  drawingWidth: number;
@@ -14481,6 +14648,8 @@ interface ToolbarProps {
14481
14648
  onRedo: () => void;
14482
14649
  onToggleFindReplace: () => void;
14483
14650
  onSetNewShapeType: (type: SupportedShapeType) => void;
14651
+ /** Arm (or, with null, disarm) a Freeform: Shape / Curve tool. */
14652
+ onArmFreeformTool?: (tool: FreeformToolKind | null) => void;
14484
14653
  onAddTextBox: () => void;
14485
14654
  onAddShape: () => void;
14486
14655
  onAddTable: () => void;
@@ -14981,6 +15150,8 @@ interface UseElementManipulationInput {
14981
15150
  * production, only in tests that do not exercise "Edit Text".
14982
15151
  */
14983
15152
  onEditText?: (elementId: string) => void;
15153
+ /** Enter Edit Points mode on `elementId` (context menu "Edit Points"). */
15154
+ onEditPoints?: (elementId: string) => void;
14984
15155
  /**
14985
15156
  * Rasterise `elementId`'s own DOM node and download it as PNG ("Save as
14986
15157
  * Picture"). Lives outside this hook because it needs the binding's
@@ -15669,6 +15840,31 @@ interface ViewerDialogsResult {
15669
15840
  //#region src/viewer/hooks/useViewerDialogs.d.ts
15670
15841
  declare function useViewerDialogs(input: UseViewerDialogsInput): ViewerDialogsResult;
15671
15842
  //#endregion
15843
+ //#region src/viewer/hooks/useCropSessionState.d.ts
15844
+ interface CropSessionState {
15845
+ /** The open crop session, or null outside crop mode. */
15846
+ cropSession: CropSession | null;
15847
+ /** Mirror of `cropSession`, readable synchronously by the history gate. */
15848
+ cropSessionRef: React.MutableRefObject<CropSession | null>;
15849
+ /** Open or close the session; keeps the ref and the state in step. */
15850
+ setCropSession: (session: CropSession | null) => void;
15851
+ }
15852
+ //#endregion
15853
+ //#region src/viewer/hooks/useEditPointsState.d.ts
15854
+ /**
15855
+ * Viewer state for the two outline-authoring modes: Edit Points on one shape,
15856
+ * and the armed Freeform: Shape / Curve drawing tool. At most one is active;
15857
+ * arming a tool ends Edit Points and starting Edit Points disarms the tool.
15858
+ */
15859
+ interface EditPointsModeState {
15860
+ /** The shape in Edit Points mode, or null. */
15861
+ editPointsElementId: string | null;
15862
+ setEditPointsElementId: (id: string | null) => void;
15863
+ /** The armed click-to-place drawing tool, or null. */
15864
+ activeFreeformTool: FreeformToolKind | null;
15865
+ setActiveFreeformTool: (tool: FreeformToolKind | null) => void;
15866
+ }
15867
+ //#endregion
15672
15868
  //#region src/viewer/hooks/viewer-core-state-types.d.ts
15673
15869
  /**
15674
15870
  * Input parameters for the {@link useViewerCoreState} hook.
@@ -15687,7 +15883,7 @@ interface UseViewerCoreStateInput {
15687
15883
  * that comprises the core viewer state. It is merged with {@link ViewerUIState}
15688
15884
  * inside {@link useViewerState} to produce the unified {@link ViewerState}.
15689
15885
  */
15690
- interface ViewerCoreState extends InlineEditingState {
15886
+ interface ViewerCoreState extends InlineEditingState, EditPointsModeState {
15691
15887
  /** Ref to the outermost container `<div>` wrapping the viewer. */
15692
15888
  containerRef: React$1.RefObject<HTMLDivElement | null>;
15693
15889
  /** Hidden `<input type="file">` used to trigger image file selection. */
@@ -16034,7 +16230,7 @@ interface UseViewerStateInput {
16034
16230
  * The unified viewer state: intersection of core state (slides, elements,
16035
16231
  * refs, presentation metadata) and UI state (panel toggles, tools, grid/snap).
16036
16232
  */
16037
- type ViewerState = ViewerCoreState & ViewerUIState;
16233
+ type ViewerState = ViewerCoreState & ViewerUIState & CropSessionState;
16038
16234
  /**
16039
16235
  * Composes core and UI state into a single unified state object.
16040
16236
  *
@@ -16124,6 +16320,23 @@ interface TableStyleContext {
16124
16320
  theme?: PptxTheme;
16125
16321
  }
16126
16322
  //#endregion
16323
+ //#region src/viewer/components/canvas/OutlineAuthoringLayer.d.ts
16324
+ /** Wiring for Edit Points and the Freeform: Shape / Curve tools. */
16325
+ interface OutlineAuthoringProps {
16326
+ /** The shape in Edit Points mode, or null. */
16327
+ editPointsElementId: string | null;
16328
+ /** Edit Points menu commands the host hid. */
16329
+ hiddenEditPointsCommands?: ReadonlySet<EditPointsCommandId>;
16330
+ /** Apply one Edit Points edit (one undo step). */
16331
+ onCommitEditPoints: (elementId: string, patch: EditPointsElementPatch) => void;
16332
+ onExitEditPoints: () => void;
16333
+ /** The armed drawing tool, or null. */
16334
+ freeformTool: FreeformToolKind | null;
16335
+ /** Insert a drawn freeform (the tool then disarms). */
16336
+ onFreeformCommit: (element: ShapePptxElement) => void;
16337
+ onFreeformCancel: () => void;
16338
+ }
16339
+ //#endregion
16127
16340
  //#region src/viewer/components/canvas/canvas-types.d.ts
16128
16341
  interface ZoomViewport {
16129
16342
  canvasViewportRef: React$1.RefObject<HTMLDivElement | null>;
@@ -16271,6 +16484,7 @@ interface SlideCanvasProps {
16271
16484
  * changes tween while the AI assistant is working (see AiFocusHighlightOverlay).
16272
16485
  */
16273
16486
  aiActive?: boolean;
16487
+ outlineAuthoring?: OutlineAuthoringProps;
16274
16488
  }
16275
16489
  //#endregion
16276
16490
  //#region src/viewer/hooks/useAutosave.d.ts
@@ -18217,6 +18431,7 @@ declare function useKeyboardShortcuts(input: UseKeyboardShortcutsInput): void;
18217
18431
  interface MergeShapesHandlerInput {
18218
18432
  activeSlide: PptxSlide | undefined;
18219
18433
  activeSlideIndex: number;
18434
+ /** The selection in SELECTION order: the first entry's formatting survives. */
18220
18435
  selectedElements: PptxElement[];
18221
18436
  effectiveSelectedIds: string[];
18222
18437
  setSelectedElementIds: React.Dispatch<React.SetStateAction<string[]>>;