pptx-react-viewer 2.2.1 → 2.4.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 (152) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/{AiChatPanel-O4NYWO3D.js → AiChatPanel-HLLGXBZF.js} +23 -24
  3. package/dist/AiChatPanel-HLLGXBZF.js.br +0 -0
  4. package/dist/AiChatPanel-HLLGXBZF.js.gz +0 -0
  5. package/dist/{AiChatPanel-XRKEPXAM.mjs → AiChatPanel-SXYMXFYS.mjs} +4 -5
  6. package/dist/AiChatPanel-SXYMXFYS.mjs.br +0 -0
  7. package/dist/AiChatPanel-SXYMXFYS.mjs.gz +0 -0
  8. package/dist/{Model3DScene-JN5F5C4Z.mjs → Model3DScene-IECT4RWT.mjs} +1 -2
  9. package/dist/Model3DScene-IECT4RWT.mjs.br +0 -0
  10. package/dist/Model3DScene-IECT4RWT.mjs.gz +0 -0
  11. package/dist/{Model3DScene-HYE6HA2C.js → Model3DScene-ZQBWLAMC.js} +2 -3
  12. package/dist/Model3DScene-ZQBWLAMC.js.br +0 -0
  13. package/dist/Model3DScene-ZQBWLAMC.js.gz +0 -0
  14. package/dist/{PowerPointViewer-gmU5rc7K.d.ts → PowerPointViewer-Cjn1RgSz.d.ts} +2 -2
  15. package/dist/{PowerPointViewer-gmU5rc7K.d.ts.map → PowerPointViewer-Cjn1RgSz.d.ts.map} +1 -1
  16. package/dist/{SurfaceChart3DScene-FDJ6LC4E.js → SurfaceChart3DScene-4KRMRWW6.js} +2 -3
  17. package/dist/SurfaceChart3DScene-4KRMRWW6.js.br +0 -0
  18. package/dist/SurfaceChart3DScene-4KRMRWW6.js.gz +0 -0
  19. package/dist/{SurfaceChart3DScene-V7P3LQVV.mjs → SurfaceChart3DScene-52C3IMPQ.mjs} +1 -2
  20. package/dist/SurfaceChart3DScene-52C3IMPQ.mjs.br +0 -0
  21. package/dist/SurfaceChart3DScene-52C3IMPQ.mjs.gz +0 -0
  22. package/dist/audience-content-store-BMlth_3U.d.ts +386 -0
  23. package/dist/audience-content-store-BMlth_3U.d.ts.map +1 -0
  24. package/dist/{chunk-YIFO3WQO.js → chunk-25VSL2BB.js} +1 -0
  25. package/dist/chunk-25VSL2BB.js.br +0 -0
  26. package/dist/chunk-25VSL2BB.js.gz +0 -0
  27. package/dist/{chunk-XJTWUXXC.js → chunk-5GHLRHBR.js} +3 -3
  28. package/dist/chunk-5GHLRHBR.js.br +0 -0
  29. package/dist/chunk-5GHLRHBR.js.gz +0 -0
  30. package/dist/{chunk-2U243ZEP.js → chunk-5TPQJWEO.js} +267 -252
  31. package/dist/chunk-5TPQJWEO.js.br +0 -0
  32. package/dist/chunk-5TPQJWEO.js.gz +0 -0
  33. package/dist/{chunk-O75FHZQJ.mjs → chunk-G6Q3NXRV.mjs} +23 -8
  34. package/dist/chunk-G6Q3NXRV.mjs.br +0 -0
  35. package/dist/chunk-G6Q3NXRV.mjs.gz +0 -0
  36. package/dist/{chunk-RYHBWTPI.mjs → chunk-KK7FWBGO.mjs} +89 -69
  37. package/dist/chunk-KK7FWBGO.mjs.br +0 -0
  38. package/dist/chunk-KK7FWBGO.mjs.gz +0 -0
  39. package/dist/{chunk-7NSLKNCT.mjs → chunk-LRIXPSVT.mjs} +4 -6
  40. package/dist/chunk-LRIXPSVT.mjs.br +0 -0
  41. package/dist/chunk-LRIXPSVT.mjs.gz +0 -0
  42. package/dist/{chunk-I2HF7ZPO.mjs → chunk-Q6FC2552.mjs} +1 -1
  43. package/dist/chunk-Q6FC2552.mjs.br +0 -0
  44. package/dist/chunk-Q6FC2552.mjs.gz +0 -0
  45. package/dist/{chunk-R2H3FHK6.js → chunk-QBZA2GMB.mjs} +47788 -32364
  46. package/dist/chunk-QBZA2GMB.mjs.br +0 -0
  47. package/dist/chunk-QBZA2GMB.mjs.gz +0 -0
  48. package/dist/{chunk-K2AW5UXT.js → chunk-VEZO33T2.js} +314 -316
  49. package/dist/chunk-VEZO33T2.js.br +0 -0
  50. package/dist/chunk-VEZO33T2.js.gz +0 -0
  51. package/dist/{chunk-PE2I5L6R.mjs → chunk-WK56SFN7.js} +48287 -31794
  52. package/dist/chunk-WK56SFN7.js.br +0 -0
  53. package/dist/chunk-WK56SFN7.js.gz +0 -0
  54. package/dist/{chunk-QULJW7LU.js → chunk-XSBFV6TL.js} +929 -909
  55. package/dist/chunk-XSBFV6TL.js.br +0 -0
  56. package/dist/chunk-XSBFV6TL.js.gz +0 -0
  57. package/dist/{chunk-PZTPX3HK.mjs → chunk-Z6HIZWIQ.mjs} +1 -0
  58. package/dist/chunk-Z6HIZWIQ.mjs.br +0 -0
  59. package/dist/chunk-Z6HIZWIQ.mjs.gz +0 -0
  60. package/dist/i18n.js +4 -4
  61. package/dist/i18n.js.br +0 -0
  62. package/dist/i18n.js.gz +0 -0
  63. package/dist/i18n.mjs +1 -1
  64. package/dist/i18n.mjs.br +0 -0
  65. package/dist/i18n.mjs.gz +0 -0
  66. package/dist/index.d.ts +92 -87
  67. package/dist/index.js +39 -40
  68. package/dist/index.js.br +0 -0
  69. package/dist/index.js.gz +0 -0
  70. package/dist/index.mjs +6 -7
  71. package/dist/index.mjs.br +0 -0
  72. package/dist/index.mjs.gz +0 -0
  73. package/dist/internals.d.ts +519 -514
  74. package/dist/internals.d.ts.map +1 -1
  75. package/dist/internals.js +79 -81
  76. package/dist/internals.js.br +0 -0
  77. package/dist/internals.js.gz +0 -0
  78. package/dist/internals.mjs +4 -6
  79. package/dist/internals.mjs.br +0 -0
  80. package/dist/internals.mjs.gz +0 -0
  81. package/dist/pptx-viewer.css +1 -1
  82. package/dist/pptx-viewer.css.br +0 -0
  83. package/dist/pptx-viewer.css.gz +0 -0
  84. package/dist/{animation-timeline-eb5z0SHW.d.ts → types-DciBT90G.d.ts} +4 -3
  85. package/dist/types-DciBT90G.d.ts.map +1 -0
  86. package/dist/{useViewerBuildingBlocks-CjureTRf.d.ts → useViewerBuildingBlocks-DMDZRawe.d.ts} +4 -4
  87. package/dist/{useViewerBuildingBlocks-CjureTRf.d.ts.map → useViewerBuildingBlocks-DMDZRawe.d.ts.map} +1 -1
  88. package/dist/viewer/index.d.ts +92 -88
  89. package/dist/viewer/index.js +22 -24
  90. package/dist/viewer/index.js.br +0 -0
  91. package/dist/viewer/index.js.gz +0 -0
  92. package/dist/viewer/index.mjs +6 -8
  93. package/dist/viewer/index.mjs.br +0 -0
  94. package/dist/viewer/index.mjs.gz +0 -0
  95. package/package.json +4 -4
  96. package/dist/AiChatPanel-O4NYWO3D.js.br +0 -0
  97. package/dist/AiChatPanel-O4NYWO3D.js.gz +0 -0
  98. package/dist/AiChatPanel-XRKEPXAM.mjs.br +0 -0
  99. package/dist/AiChatPanel-XRKEPXAM.mjs.gz +0 -0
  100. package/dist/Model3DScene-HYE6HA2C.js.br +0 -0
  101. package/dist/Model3DScene-HYE6HA2C.js.gz +0 -0
  102. package/dist/Model3DScene-JN5F5C4Z.mjs.br +0 -0
  103. package/dist/Model3DScene-JN5F5C4Z.mjs.gz +0 -0
  104. package/dist/SurfaceChart3DScene-FDJ6LC4E.js.br +0 -0
  105. package/dist/SurfaceChart3DScene-FDJ6LC4E.js.gz +0 -0
  106. package/dist/SurfaceChart3DScene-V7P3LQVV.mjs.br +0 -0
  107. package/dist/SurfaceChart3DScene-V7P3LQVV.mjs.gz +0 -0
  108. package/dist/animation-timeline-eb5z0SHW.d.ts.map +0 -1
  109. package/dist/chunk-2QHCOESN.js +0 -28037
  110. package/dist/chunk-2QHCOESN.js.br +0 -0
  111. package/dist/chunk-2QHCOESN.js.gz +0 -0
  112. package/dist/chunk-2U243ZEP.js.br +0 -0
  113. package/dist/chunk-2U243ZEP.js.gz +0 -0
  114. package/dist/chunk-6G6S7PEI.mjs +0 -27604
  115. package/dist/chunk-6G6S7PEI.mjs.br +0 -0
  116. package/dist/chunk-6G6S7PEI.mjs.gz +0 -0
  117. package/dist/chunk-7NSLKNCT.mjs.br +0 -0
  118. package/dist/chunk-7NSLKNCT.mjs.gz +0 -0
  119. package/dist/chunk-I2HF7ZPO.mjs.br +0 -0
  120. package/dist/chunk-I2HF7ZPO.mjs.gz +0 -0
  121. package/dist/chunk-IKBO6CZC.js +0 -2
  122. package/dist/chunk-IKBO6CZC.js.br +0 -3
  123. package/dist/chunk-IKBO6CZC.js.gz +0 -0
  124. package/dist/chunk-K2AW5UXT.js.br +0 -0
  125. package/dist/chunk-K2AW5UXT.js.gz +0 -0
  126. package/dist/chunk-O75FHZQJ.mjs.br +0 -0
  127. package/dist/chunk-O75FHZQJ.mjs.gz +0 -0
  128. package/dist/chunk-PE2I5L6R.mjs.br +0 -0
  129. package/dist/chunk-PE2I5L6R.mjs.gz +0 -0
  130. package/dist/chunk-PZTPX3HK.mjs.br +0 -0
  131. package/dist/chunk-PZTPX3HK.mjs.gz +0 -0
  132. package/dist/chunk-QULJW7LU.js.br +0 -0
  133. package/dist/chunk-QULJW7LU.js.gz +0 -0
  134. package/dist/chunk-R2H3FHK6.js.br +0 -0
  135. package/dist/chunk-R2H3FHK6.js.gz +0 -0
  136. package/dist/chunk-RYHBWTPI.mjs.br +0 -0
  137. package/dist/chunk-RYHBWTPI.mjs.gz +0 -0
  138. package/dist/chunk-T5U6P2JH.mjs +0 -1
  139. package/dist/chunk-T5U6P2JH.mjs.br +0 -0
  140. package/dist/chunk-T5U6P2JH.mjs.gz +0 -0
  141. package/dist/chunk-XJTWUXXC.js.br +0 -0
  142. package/dist/chunk-XJTWUXXC.js.gz +0 -0
  143. package/dist/chunk-YIFO3WQO.js.br +0 -0
  144. package/dist/chunk-YIFO3WQO.js.gz +0 -0
  145. package/dist/dist-VEWYRBTB.mjs +0 -2
  146. package/dist/dist-VEWYRBTB.mjs.br +0 -0
  147. package/dist/dist-VEWYRBTB.mjs.gz +0 -0
  148. package/dist/dist-ZCJLIRYG.js +0 -2275
  149. package/dist/dist-ZCJLIRYG.js.br +0 -0
  150. package/dist/dist-ZCJLIRYG.js.gz +0 -0
  151. package/dist/index-CDCSXtK3.d.ts +0 -685
  152. package/dist/index-CDCSXtK3.d.ts.map +0 -1
@@ -534,6 +534,62 @@ interface PptxCustomPathProperties {
534
534
  customGeometryTextRect?: CustomGeometryTextRect;
535
535
  }
536
536
  //#endregion
537
+ //#region src/core/types/effect-dag.d.ts
538
+ type EffectDagBlendMode = 'darken' | 'lighten' | 'mult' | 'over' | 'screen';
539
+ type EffectDagContainerType = 'sib' | 'tree';
540
+ type EffectDagNode = EffectDagContainer | EffectDagBlend | EffectDagXfrm | EffectDagRelOff | EffectDagBlur | EffectDagAlphaOutset | EffectDagPresetShadow | EffectDagRawLeaf;
541
+ interface EffectDagContainer {
542
+ kind: 'cont';
543
+ type: EffectDagContainerType;
544
+ name?: string;
545
+ children: EffectDagNode[];
546
+ }
547
+ interface EffectDagBlend {
548
+ kind: 'blend';
549
+ mode: EffectDagBlendMode;
550
+ container: EffectDagContainer;
551
+ }
552
+ interface EffectDagXfrm {
553
+ kind: 'xfrmEffect';
554
+ sx?: number;
555
+ sy?: number;
556
+ kx?: number;
557
+ ky?: number;
558
+ tx?: number;
559
+ ty?: number;
560
+ }
561
+ interface EffectDagRelOff {
562
+ kind: 'relOff';
563
+ tx?: number;
564
+ ty?: number;
565
+ }
566
+ /** Typed CT_BlurEffect with its original payload retained for lossless edits. */
567
+ interface EffectDagBlur {
568
+ kind: 'blur';
569
+ radiusEmu?: number;
570
+ grow?: boolean;
571
+ xml: XmlObject;
572
+ }
573
+ /** Typed CT_AlphaOutsetEffect with original XML retained for lossless edits. */
574
+ interface EffectDagAlphaOutset {
575
+ kind: 'alphaOutset';
576
+ radiusEmu?: number;
577
+ xml: XmlObject;
578
+ }
579
+ /** Typed CT_PresetShadowEffect with colour and extension XML retained verbatim. */
580
+ interface EffectDagPresetShadow {
581
+ kind: 'prstShdw';
582
+ preset?: `shdw${number}`;
583
+ distanceEmu?: number;
584
+ direction?: number;
585
+ xml: XmlObject;
586
+ }
587
+ interface EffectDagRawLeaf {
588
+ kind: 'raw';
589
+ tag: string;
590
+ xml: Record<string, unknown>;
591
+ }
592
+ //#endregion
537
593
  //#region src/core/types/three-d.d.ts
538
594
  /**
539
595
  * 3-D effect properties, text warp (WordArt) presets, and scene/shape bevel
@@ -996,6 +1052,15 @@ interface ShapeStyle {
996
1052
  lineGlowOpacity?: number;
997
1053
  /** Raw `a:effectDag` XML node preserved for round-trip serialisation. */
998
1054
  effectDagXml?: XmlObject;
1055
+ /**
1056
+ * Typed effect graph parsed from {@link ShapeStyle.effectDagXml}. The four
1057
+ * structural container nodes (`a:cont`, `a:blend`, `a:xfrmEffect`,
1058
+ * `a:relOff`) are fully typed; any other leaf effect (e.g. `a:outerShdw`,
1059
+ * `a:glow`, `a:alphaInv`) is captured as
1060
+ * {@link import('./effect-dag').EffectDagRawLeaf} so we never have to
1061
+ * recurse into the full effect taxonomy.
1062
+ */
1063
+ effectDagTree?: EffectDagContainer;
999
1064
  /** Grayscale flag from effectDag `a:grayscl`. */
1000
1065
  dagGrayscale?: boolean;
1001
1066
  /** Bi-level threshold (0-100) from effectDag `a:biLevel`. */
@@ -1430,6 +1495,20 @@ interface TextStyle {
1430
1495
  textPresetShadowDirection?: number;
1431
1496
  /** Text blur effect radius in px (`a:blur`). */
1432
1497
  textBlurRadius?: number;
1498
+ /**
1499
+ * Raw `a:effectDag` XML node from `a:rPr`, preserved verbatim for
1500
+ * round-trip serialisation. Mirrors the shape-level
1501
+ * {@link import('./shape-style').ShapeStyle.effectDagXml} field.
1502
+ */
1503
+ textEffectDagXml?: XmlObject;
1504
+ /**
1505
+ * Typed effect graph parsed from `textEffectDagXml`. The four structural
1506
+ * container nodes (`a:cont`, `a:blend`, `a:xfrmEffect`, `a:relOff`) are
1507
+ * fully typed; any other leaf effect is captured as
1508
+ * {@link import('./effect-dag').EffectDagRawLeaf} so we never have to
1509
+ * recurse into the full effect taxonomy.
1510
+ */
1511
+ textEffectDagTree?: EffectDagContainer;
1433
1512
  /** Text alpha modulation fixed (0-100) from `a:alphaModFix`. */
1434
1513
  textAlphaModFix?: number;
1435
1514
  /** Text alpha modulation from `a:alphaMod` (0-100 percentage). */
@@ -2820,62 +2899,6 @@ interface PptxChartData {
2820
2899
  clrMapOvr?: Record<string, string>;
2821
2900
  }
2822
2901
  //#endregion
2823
- //#region src/core/types/effect-dag.d.ts
2824
- type EffectDagBlendMode = 'darken' | 'lighten' | 'mult' | 'over' | 'screen';
2825
- type EffectDagContainerType = 'sib' | 'tree';
2826
- type EffectDagNode = EffectDagContainer | EffectDagBlend | EffectDagXfrm | EffectDagRelOff | EffectDagBlur | EffectDagAlphaOutset | EffectDagPresetShadow | EffectDagRawLeaf;
2827
- interface EffectDagContainer {
2828
- kind: 'cont';
2829
- type: EffectDagContainerType;
2830
- name?: string;
2831
- children: EffectDagNode[];
2832
- }
2833
- interface EffectDagBlend {
2834
- kind: 'blend';
2835
- mode: EffectDagBlendMode;
2836
- container: EffectDagContainer;
2837
- }
2838
- interface EffectDagXfrm {
2839
- kind: 'xfrmEffect';
2840
- sx?: number;
2841
- sy?: number;
2842
- kx?: number;
2843
- ky?: number;
2844
- tx?: number;
2845
- ty?: number;
2846
- }
2847
- interface EffectDagRelOff {
2848
- kind: 'relOff';
2849
- tx?: number;
2850
- ty?: number;
2851
- }
2852
- /** Typed CT_BlurEffect with its original payload retained for lossless edits. */
2853
- interface EffectDagBlur {
2854
- kind: 'blur';
2855
- radiusEmu?: number;
2856
- grow?: boolean;
2857
- xml: XmlObject;
2858
- }
2859
- /** Typed CT_AlphaOutsetEffect with original XML retained for lossless edits. */
2860
- interface EffectDagAlphaOutset {
2861
- kind: 'alphaOutset';
2862
- radiusEmu?: number;
2863
- xml: XmlObject;
2864
- }
2865
- /** Typed CT_PresetShadowEffect with colour and extension XML retained verbatim. */
2866
- interface EffectDagPresetShadow {
2867
- kind: 'prstShdw';
2868
- preset?: `shdw${number}`;
2869
- distanceEmu?: number;
2870
- direction?: number;
2871
- xml: XmlObject;
2872
- }
2873
- interface EffectDagRawLeaf {
2874
- kind: 'raw';
2875
- tag: string;
2876
- xml: Record<string, unknown>;
2877
- }
2878
- //#endregion
2879
2902
  //#region src/core/types/image.d.ts
2880
2903
  /**
2881
2904
  * Image recolour/adjustment properties parsed from blip extensions.
@@ -3078,36 +3101,6 @@ interface PptxImageProperties {
3078
3101
  /** Crop-to-shape — CSS clip-path shape name. */
3079
3102
  cropShape?: PptxCropShape;
3080
3103
  }
3081
- declare module "./internals" {
3082
- interface TextStyle {
3083
- /**
3084
- * Raw `a:effectDag` XML node from `a:rPr`, preserved verbatim for
3085
- * round-trip serialisation. Mirrors the shape-level
3086
- * {@link import('./shape-style').ShapeStyle.effectDagXml} field.
3087
- */
3088
- textEffectDagXml?: XmlObject;
3089
- /**
3090
- * Typed effect graph parsed from `textEffectDagXml`. The four structural
3091
- * container nodes (`a:cont`, `a:blend`, `a:xfrmEffect`, `a:relOff`) are
3092
- * fully typed; any other leaf effect is captured as
3093
- * {@link EffectDagRawLeaf} so we never have to recurse into the full
3094
- * effect taxonomy.
3095
- */
3096
- textEffectDagTree?: EffectDagContainer;
3097
- }
3098
- }
3099
- declare module "./internals" {
3100
- interface ShapeStyle {
3101
- /**
3102
- * Typed effect graph parsed from {@link ShapeStyle.effectDagXml}. The four
3103
- * structural container nodes (`a:cont`, `a:blend`, `a:xfrmEffect`,
3104
- * `a:relOff`) are fully typed; any other leaf effect (e.g. `a:outerShdw`,
3105
- * `a:glow`, `a:alphaInv`) is captured as {@link EffectDagRawLeaf} so we
3106
- * never have to recurse into the full effect taxonomy.
3107
- */
3108
- effectDagTree?: EffectDagContainer;
3109
- }
3110
- }
3111
3104
  //#endregion
3112
3105
  //#region src/core/types/media.d.ts
3113
3106
  /**
@@ -6837,7 +6830,6 @@ interface PptxEmbeddedFont {
6837
6830
  originalPartBytes?: Uint8Array;
6838
6831
  }
6839
6832
 
6840
- //#endregion
6841
6833
  //#region src/core/types/theme-presets.d.ts
6842
6834
  /**
6843
6835
  * A complete theme preset that can be applied to a presentation.
@@ -6876,6 +6868,13 @@ type FillInput = {
6876
6868
  opacity?: number;
6877
6869
  } | {
6878
6870
  type: 'gradient';
6871
+ /**
6872
+ * Gradient direction in the OOXML `a:lin/@ang` convention: degrees
6873
+ * clockwise from the positive x-axis, pointing from the first stop
6874
+ * towards the last (`0` = left to right, `90` = top to bottom). This is
6875
+ * what lands in `ShapeStyle.fillGradientAngle` and what is written back
6876
+ * to the file, NOT a CSS `linear-gradient()` angle.
6877
+ */
6879
6878
  angle?: number;
6880
6879
  gradientType?: 'linear' | 'radial';
6881
6880
  stops: Array<{
@@ -7033,6 +7032,12 @@ type BackgroundInput = {
7033
7032
  color: string;
7034
7033
  } | {
7035
7034
  type: 'gradient';
7035
+ /**
7036
+ * Slide backgrounds are stored as a ready-made CSS gradient string
7037
+ * (`PptxSlide.backgroundGradient`), so this is a CSS
7038
+ * `linear-gradient()` angle: degrees clockwise from "to top"
7039
+ * (`90` = left to right, `180` = top to bottom). Defaults to `180`.
7040
+ */
7036
7041
  angle?: number;
7037
7042
  stops: Array<{
7038
7043
  color: string;
@@ -9458,243 +9463,80 @@ interface ViewerBuildingBlocksResult {
9458
9463
  }
9459
9464
  declare function useViewerBuildingBlocks(input: UseViewerBuildingBlocksInput): ViewerBuildingBlocksResult;
9460
9465
 
9461
- //#region src/viewer/hooks/presentation-mode/types.d.ts
9466
+ //#region src/viewer/hooks/useThemeSwitching.d.ts
9467
+ interface UseThemeSwitchingInput {
9468
+ /** Ref to the PptxHandler instance. */
9469
+ handlerRef: RefObject<PptxHandler | null>;
9470
+ /** Current parsed presentation data (null when nothing is loaded). */
9471
+ data: PptxData | null;
9472
+ /** Callback to update the presentation data after theme switch. */
9473
+ onDataChange: (newData: PptxData) => void;
9474
+ /** Optional callback fired when theme switch completes successfully. */
9475
+ onThemeChanged?: (preset: PptxThemePreset) => void;
9476
+ }
9477
+ interface ThemeSwitchingResult {
9478
+ /** All available built-in theme presets. */
9479
+ presets: readonly PptxThemePreset[];
9480
+ /**
9481
+ * Apply a theme preset to the current presentation.
9482
+ * Updates both the in-memory ZIP and all resolved element colours.
9483
+ */
9484
+ switchToPreset: (preset: PptxThemePreset) => Promise<void>;
9485
+ /**
9486
+ * Apply a custom colour scheme (and optional font scheme) to the
9487
+ * current presentation.
9488
+ */
9489
+ switchToCustom: (colorScheme: PptxThemeColorScheme, fontScheme?: PptxThemeFontScheme, themeName?: string) => Promise<void>;
9490
+ /**
9491
+ * Get the preset matching the current presentation theme (if any).
9492
+ * Returns undefined if the current theme does not match a built-in preset.
9493
+ */
9494
+ currentPreset: PptxThemePreset | undefined;
9495
+ }
9462
9496
  /**
9463
- * How a forward/backward slide advance was requested.
9497
+ * React hook providing theme switching capabilities for the PowerPoint viewer.
9464
9498
  *
9465
- * - `'click'`: a click/tap on the slide surface (PowerPoint's "On Mouse Click"
9466
- * advance). This is the only trigger governed by `advanceOnClick`.
9467
- * - `'explicit'`: keyboard, navigation buttons, action triggers, and timed
9468
- * auto-advance. These always navigate regardless of `advanceOnClick`, matching
9469
- * PowerPoint (arrow keys / Next always work even when click-advance is off).
9499
+ * @example
9500
+ * ```tsx
9501
+ * const { presets, switchToPreset, currentPreset } = useThemeSwitching({
9502
+ * handlerRef,
9503
+ * data,
9504
+ * onDataChange: setData,
9505
+ * });
9506
+ *
9507
+ * return (
9508
+ * <div>
9509
+ * {presets.map(preset => (
9510
+ * <button
9511
+ * key={preset.id}
9512
+ * onClick={() => switchToPreset(preset)}
9513
+ * aria-pressed={preset.id === currentPreset?.id}
9514
+ * >
9515
+ * {preset.name}
9516
+ * </button>
9517
+ * ))}
9518
+ * </div>
9519
+ * );
9520
+ * ```
9470
9521
  */
9471
- type SlideAdvanceTrigger = 'click' | 'explicit';
9522
+ declare function useThemeSwitching(input: UseThemeSwitchingInput): ThemeSwitchingResult;
9523
+ //#endregion
9524
+ //#region ../../node_modules/.bun/lib0@0.2.117/node_modules/lib0/observable.d.ts
9472
9525
  /**
9473
- * State describing the transition overlay that plays while advancing into a
9474
- * slide that carries a `p:transition`. The outgoing slide is snapshotted into
9475
- * an animated overlay layer while the incoming slide renders underneath on the
9476
- * main stage; the overlay tears down once `durationMs` elapses.
9526
+ * Handles named events.
9527
+ *
9528
+ * @deprecated
9529
+ * @template N
9477
9530
  */
9478
- interface PresentationTransitionOverlayState {
9479
- /** Index of the leaving slide, rendered (animated) in the overlay layer. */
9480
- outgoingSlideIndex: number;
9481
- /** Index of the arriving slide, already live on the main stage. */
9482
- incomingSlideIndex: number;
9483
- /** The incoming slide's transition definition (drives the CSS animation). */
9484
- transition: PptxSlideTransition;
9485
- /** Resolved transition duration (ms). */
9486
- durationMs: number;
9487
- }
9488
- interface UsePresentationModeInput {
9489
- mode: ViewerMode;
9490
- slides: PptxSlide[];
9491
- visibleSlideIndexes: number[];
9492
- activeSlideIndex: number;
9493
- containerRef: React.RefObject<HTMLElement | null>;
9494
- /** Raw PPTX bytes: forwarded to audience window for content sharing. */
9495
- content?: ArrayBuffer | Uint8Array | null;
9496
- onSetMode: (mode: ViewerMode) => void;
9497
- onSetActiveSlideIndex: (index: number) => void;
9531
+ declare class Observable<N> {
9498
9532
  /**
9499
- * Play a sound file for an action/transition. When `options.loop` is true the
9500
- * audio repeats until the next animation sound plays or the show exits
9501
- * (used for transition sounds flagged with `soundLoop`).
9533
+ * Some desc.
9534
+ * @type {Map<N, any>}
9502
9535
  */
9503
- onPlayActionSound?: (soundPath: string, options?: {
9504
- loop?: boolean;
9505
- }) => void;
9506
- /** Select a pointer tool (Ctrl+L laser, Ctrl+P pen, Ctrl+A arrow, Ctrl+E eraser). */
9507
- onSetPointerTool?: (tool: PresentationPointerTool | 'arrow') => void;
9508
- /** Erase the current slide's ink annotations (E). */
9509
- onEraseAnnotations?: () => void;
9510
- /** Show or hide ink markup (Ctrl+M). */
9511
- onToggleInkMarkup?: () => void;
9512
- /** Show or hide the slide-show chrome (Ctrl+H). */
9513
- onToggleToolbar?: () => void;
9514
- /** Open the All Slides navigator (Ctrl+S). */
9515
- onShowAllSlides?: () => void;
9516
- /** Called to persist rehearsal timings into slide transitions. */
9517
- onSaveRehearsalTimings?: (timings: Record<number, number>) => void;
9518
- /** Whether to loop continuously (kiosk or explicit loop setting). */
9519
- loopContinuously?: boolean;
9520
- /** Whether to play animations during the slide show (false = skip all animations). */
9521
- showWithAnimation?: boolean;
9522
- /** Whether to use rehearsed auto-advance timings (false = manual advance only). */
9523
- useTimings?: boolean;
9536
+ _observers: Map<N, any>;
9524
9537
  /**
9525
- * Options > Advanced > "End with black slide". When true (PowerPoint's
9526
- * default), advancing past the last slide shows a black end-of-show
9527
- * screen; the next advance (or a click on it) exits. When false,
9528
- * advancing past the last slide exits the show directly.
9529
- */
9530
- endWithBlackSlide?: boolean;
9531
- }
9532
- interface UsePresentationModeResult {
9533
- presentationSlideIndex: number;
9534
- setPresentationSlideIndex: (index: number) => void;
9535
- presentationSlideVisible: boolean;
9536
- /** Active slide-transition overlay, or `null` when no transition is playing. */
9537
- transitionOverlay: PresentationTransitionOverlayState | null;
9538
- /** Tear down the transition overlay once its animation completes. */
9539
- handleTransitionOverlayComplete: () => void;
9540
- presentationAnimations: PresentationAnimationRuntime[];
9541
- presentationElementStates: Map<string, ElementAnimationState>;
9542
- presentationKeyframesCss: string;
9543
- clearPresentationTimers: () => void;
9544
- runPresentationEntranceAnimations: (slideIndex: number) => void;
9545
- /** True while the black "End of slide show" screen is displayed. */
9546
- endOfShowVisible: boolean;
9547
- /** Whether the All Slides navigator (Ctrl+S) is open during the show. */
9548
- allSlidesOpen: boolean;
9549
- openAllSlides: () => void;
9550
- closeAllSlides: () => void;
9551
- movePresentationSlide: (direction: 1 | -1, trigger?: SlideAdvanceTrigger) => void;
9552
- navigateToSlide: (slideIndex: number) => void;
9553
- handlePresentationAction: (action: PptxAction) => void;
9554
- /**
9555
- * Handle a shape click in presentation mode. If the shape is an interactive
9556
- * trigger, play its animation sequence. Returns `true` if handled.
9557
- */
9558
- handleInteractiveShapeClick: (shapeId: string) => boolean;
9559
- /** Set of shape IDs that are interactive sequence triggers on the current slide. */
9560
- interactiveTriggerShapeIds: ReadonlySet<string>;
9561
- /** Set of shape IDs that are hover animation triggers on the current slide. */
9562
- hoverTriggerShapeIds: ReadonlySet<string>;
9563
- /** Handle hover start on a shape. If the shape has a hover sequence, play it. Returns `true` if handled. */
9564
- handleHoverStart: (shapeId: string) => boolean;
9565
- /** Handle hover end on a shape. Resets the hover sequence for replay. */
9566
- handleHoverEnd: (shapeId: string) => void;
9567
- /** Must be called from a user-gesture handler (click) to satisfy browser fullscreen policy. */
9568
- enterPresentMode: () => void;
9569
- /** Whether presenter view (split-screen with notes) is active instead of fullscreen. */
9570
- presenterMode: boolean;
9571
- /** Enter presenter view mode (no fullscreen, shows notes panel). */
9572
- enterPresenterView: () => void;
9573
- /** Toggle between fullscreen and presenter view during presentation. */
9574
- togglePresenterView: () => void;
9575
- /** Timestamp (ms) when the presentation started: used for elapsed timer. */
9576
- presentationStartTime: number | null;
9577
- /** Whether the current presentation session is in rehearse-timings mode. */
9578
- rehearsing: boolean;
9579
- /** Enter rehearse-timings mode (fullscreen presentation + timing HUD). */
9580
- enterRehearsalMode: () => void;
9581
- /** Recorded timings in ms, keyed by slide index. Populated during rehearsal. */
9582
- recordedTimings: Record<number, number>;
9583
- /** Timestamp when the current slide started (ms since epoch). */
9584
- slideStartTime: number | null;
9585
- /** Whether the rehearsal summary dialog should be shown. */
9586
- showRehearsalSummary: boolean;
9587
- /** Dismiss the rehearsal summary (discard timings). */
9588
- dismissRehearsalSummary: () => void;
9589
- /** Save recorded timings into each slide's transition.advanceAfterMs. */
9590
- saveRehearsalTimings: () => void;
9591
- /** Whether rehearsal timer is paused. */
9592
- rehearsalPaused: boolean;
9593
- /** Toggle the rehearsal timer pause state. */
9594
- toggleRehearsalPause: () => void;
9595
- /** Handle a zoom element click in presentation mode. */
9596
- handleZoomClick: (targetSlideIndex: number, returnSlideIndex: number) => void;
9597
- /** Ref holding the slide index to return to after zoom navigation. */
9598
- zoomReturnSlideIndex: React.RefObject<number | null>;
9599
- /** Navigate back to the zoom summary slide. Returns true if navigation occurred. */
9600
- returnToZoomSlide: () => boolean;
9601
- /** Clear the stored zoom return index. */
9602
- clearZoomReturn: () => void;
9603
- /** Open the audience display in a separate browser window. Returns `true` if successful. */
9604
- openAudienceWindow: () => boolean;
9605
- /** Close the audience display window. */
9606
- closeAudienceWindow: () => void;
9607
- /** Whether the audience window is currently open. */
9608
- isAudienceWindowOpen: () => boolean;
9609
- /** Send a slide index to the audience window explicitly. */
9610
- syncSlideToAudience: (slideIndex: number) => void;
9611
- syncStateToAudience: (snapshot: PresentationSnapshot) => void;
9612
- presenterSnapshot: PresentationSnapshot;
9613
- setPresenterBlackout: (blackout: PresentationSnapshot['blackout']) => void;
9614
- togglePresenterTimer: () => void;
9615
- resetPresenterTimer: () => void;
9616
- stepPresenterZoom: (direction: 1 | -1) => void;
9617
- resetPresenterZoom: () => void;
9618
- setPresenterCaption: (caption: string) => void;
9619
- setPresenterSubtitlesVisible: (visible: boolean) => void;
9620
- updatePresenterSnapshot: (patch: Partial<PresentationSnapshot>) => void;
9621
- swapPresenterDisplays: () => Promise<boolean>;
9622
- }
9623
- //#endregion
9624
- //#region src/viewer/hooks/useThemeSwitching.d.ts
9625
- interface UseThemeSwitchingInput {
9626
- /** Ref to the PptxHandler instance. */
9627
- handlerRef: RefObject<PptxHandler | null>;
9628
- /** Current parsed presentation data (null when nothing is loaded). */
9629
- data: PptxData | null;
9630
- /** Callback to update the presentation data after theme switch. */
9631
- onDataChange: (newData: PptxData) => void;
9632
- /** Optional callback fired when theme switch completes successfully. */
9633
- onThemeChanged?: (preset: PptxThemePreset) => void;
9634
- }
9635
- interface ThemeSwitchingResult {
9636
- /** All available built-in theme presets. */
9637
- presets: readonly PptxThemePreset[];
9638
- /**
9639
- * Apply a theme preset to the current presentation.
9640
- * Updates both the in-memory ZIP and all resolved element colours.
9641
- */
9642
- switchToPreset: (preset: PptxThemePreset) => Promise<void>;
9643
- /**
9644
- * Apply a custom colour scheme (and optional font scheme) to the
9645
- * current presentation.
9646
- */
9647
- switchToCustom: (colorScheme: PptxThemeColorScheme, fontScheme?: PptxThemeFontScheme, themeName?: string) => Promise<void>;
9648
- /**
9649
- * Get the preset matching the current presentation theme (if any).
9650
- * Returns undefined if the current theme does not match a built-in preset.
9651
- */
9652
- currentPreset: PptxThemePreset | undefined;
9653
- }
9654
- /**
9655
- * React hook providing theme switching capabilities for the PowerPoint viewer.
9656
- *
9657
- * @example
9658
- * ```tsx
9659
- * const { presets, switchToPreset, currentPreset } = useThemeSwitching({
9660
- * handlerRef,
9661
- * data,
9662
- * onDataChange: setData,
9663
- * });
9664
- *
9665
- * return (
9666
- * <div>
9667
- * {presets.map(preset => (
9668
- * <button
9669
- * key={preset.id}
9670
- * onClick={() => switchToPreset(preset)}
9671
- * aria-pressed={preset.id === currentPreset?.id}
9672
- * >
9673
- * {preset.name}
9674
- * </button>
9675
- * ))}
9676
- * </div>
9677
- * );
9678
- * ```
9679
- */
9680
- declare function useThemeSwitching(input: UseThemeSwitchingInput): ThemeSwitchingResult;
9681
- //#endregion
9682
- //#region ../../node_modules/.bun/lib0@0.2.117/node_modules/lib0/observable.d.ts
9683
- /**
9684
- * Handles named events.
9685
- *
9686
- * @deprecated
9687
- * @template N
9688
- */
9689
- declare class Observable<N> {
9690
- /**
9691
- * Some desc.
9692
- * @type {Map<N, any>}
9693
- */
9694
- _observers: Map<N, any>;
9695
- /**
9696
- * @param {N} name
9697
- * @param {function} f
9538
+ * @param {N} name
9539
+ * @param {function} f
9698
9540
  */
9699
9541
  on(name: N, f: Function): void;
9700
9542
  /**
@@ -9973,67 +9815,149 @@ interface UseFollowModeResult {
9973
9815
  followUser: (clientId: number | null) => void;
9974
9816
  }
9975
9817
  declare function useFollowMode({ collab, activeSlideIndex, setActiveSlideIndex, slideCount }: UseFollowModeInput): UseFollowModeResult;
9976
- //#endregion
9977
- //#region src/viewer/hooks/presentation-mode/useAnimationPlayback.d.ts
9978
- interface UseAnimationPlaybackInput {
9818
+ interface UsePresenterWindowInput {
9819
+ currentSlideIndex: number;
9820
+ isPresenterMode: boolean;
9821
+ /** Raw PPTX bytes to share with the audience tab via IndexedDB. */
9822
+ content?: ArrayBuffer | Uint8Array | null;
9823
+ snapshot: PresentationSnapshot;
9824
+ }
9825
+ interface UsePresenterWindowResult {
9826
+ openAudienceWindow: () => boolean;
9827
+ closeAudienceWindow: () => void;
9828
+ isAudienceWindowOpen: () => boolean;
9829
+ syncSlideToAudience: (slideIndex: number) => void;
9830
+ syncStateToAudience: (snapshot: PresentationSnapshot) => void;
9831
+ swapDisplays: () => Promise<boolean>;
9832
+ }
9833
+ declare function usePresenterWindow(input: UsePresenterWindowInput): UsePresenterWindowResult;
9834
+
9835
+ //#region src/viewer/hooks/useEditorHistory.d.ts
9836
+ interface EditorHistoryInput {
9979
9837
  slides: PptxSlide[];
9980
- onPlayActionSound?: (soundPath: string) => void;
9981
- /** When false, all animations are skipped (elements shown immediately). */
9982
- showWithAnimation?: boolean;
9838
+ canvasSize: CanvasSize;
9839
+ activeSlideIndex: number;
9840
+ templateElementsBySlideId: Record<string, PptxElement[]>;
9841
+ selectedElementId: string | null;
9842
+ selectedElementIds: string[];
9843
+ editTemplateMode: boolean;
9844
+ headerFooter: PptxHeaderFooter;
9845
+ loading: boolean;
9846
+ error: string | null;
9847
+ /**
9848
+ * Undo-stack depth (File > Options > Advanced > "Maximum number of undos",
9849
+ * resolved via the shared `resolveHistoryDepth`). Defaults to 120.
9850
+ */
9851
+ maxHistoryEntries?: number;
9852
+ hasActivePointerInteraction: () => boolean;
9853
+ pointerCommitNonce: number;
9854
+ setSlides: (slides: PptxSlide[]) => void;
9855
+ setCanvasSize: (size: CanvasSize) => void;
9856
+ setActiveSlideIndex: (index: number) => void;
9857
+ setTemplateElementsBySlideId: (map: Record<string, PptxElement[]>) => void;
9858
+ setSelectedElementId: (id: string | null) => void;
9859
+ setSelectedElementIds: (ids: string[]) => void;
9860
+ setEditTemplateMode: (mode: boolean) => void;
9861
+ setHeaderFooter: (hf: PptxHeaderFooter) => void;
9983
9862
  }
9984
- interface UseAnimationPlaybackResult {
9985
- presentationAnimations: PresentationAnimationRuntime[];
9986
- presentationElementStates: Map<string, ElementAnimationState>;
9987
- presentationKeyframesCss: string;
9988
- interactiveTriggerShapeIds: ReadonlySet<string>;
9989
- hoverTriggerShapeIds: ReadonlySet<string>;
9990
- clearPresentationTimers: () => void;
9991
- playNextAnimationGroup: () => boolean;
9992
- handleInteractiveShapeClick: (shapeId: string) => boolean;
9993
- handleHoverStart: (shapeId: string) => boolean;
9994
- handleHoverEnd: (shapeId: string) => void;
9995
- runPresentationEntranceAnimations: (slideIndex: number) => void;
9996
- /** Exposed so the orchestrator can schedule additional timers (e.g. auto-advance). */
9997
- presentationTimersRef: React.RefObject<number[]>;
9863
+ interface EditorHistoryResult {
9864
+ canUndo: boolean;
9865
+ canRedo: boolean;
9866
+ undoLabel: string | undefined;
9867
+ redoLabel: string | undefined;
9868
+ handleUndo: () => void;
9869
+ handleRedo: () => void;
9870
+ resetHistory: () => void;
9871
+ markDirty: () => void;
9872
+ buildHistorySnapshot: (actionLabel?: string) => EditorHistorySnapshot;
9998
9873
  }
9999
- declare function useAnimationPlayback(input: UseAnimationPlaybackInput): UseAnimationPlaybackResult;
9874
+ declare function useEditorHistory(input: EditorHistoryInput): EditorHistoryResult;
10000
9875
  //#endregion
10001
- //#region src/viewer/hooks/presentation-mode/useRehearsalTimings.d.ts
10002
- interface UseRehearsalTimingsInput {
10003
- containerRef: React.RefObject<HTMLElement | null>;
10004
- onSetMode: (mode: ViewerMode) => void;
10005
- onSaveRehearsalTimings?: (timings: Record<number, number>) => void;
10006
- setPresentationStartTime: (time: number | null) => void;
10007
- setPresenterMode: (mode: boolean) => void;
9876
+ //#region src/viewer/hooks/useZoomViewport.d.ts
9877
+ /** Axis-aligned bounding box used by zoom / viewport helpers. */
9878
+ interface SelectionBounds {
9879
+ minX: number;
9880
+ minY: number;
9881
+ maxX: number;
9882
+ maxY: number;
10008
9883
  }
10009
- interface UseRehearsalTimingsResult {
10010
- rehearsing: boolean;
10011
- setRehearsing: React.Dispatch<React.SetStateAction<boolean>>;
10012
- recordedTimings: Record<number, number>;
10013
- slideStartTime: number | null;
10014
- showRehearsalSummary: boolean;
10015
- setShowRehearsalSummary: React.Dispatch<React.SetStateAction<boolean>>;
10016
- rehearsalPaused: boolean;
10017
- recordCurrentSlideTime: (slideIndex: number) => void;
10018
- dismissRehearsalSummary: () => void;
10019
- saveRehearsalTimings: () => void;
10020
- enterRehearsalMode: () => void;
10021
- toggleRehearsalPause: () => void;
9884
+ interface UseZoomViewportInput {
9885
+ canvasSize: CanvasSize;
9886
+ selectedElements: PptxElement[];
10022
9887
  }
10023
- declare function useRehearsalTimings(input: UseRehearsalTimingsInput): UseRehearsalTimingsResult;
9888
+ interface UseZoomViewportResult {
9889
+ editWrapperRef: React.RefObject<HTMLDivElement | null>;
9890
+ canvasStageRef: React.RefObject<HTMLDivElement | null>;
9891
+ canvasViewportRef: React.RefObject<HTMLDivElement | null>;
9892
+ renderScaleRef: React.MutableRefObject<number>;
9893
+ scale: number;
9894
+ setScale: (scale: number) => void;
9895
+ editorDimensions: CanvasSize | null;
9896
+ setEditorDimensions: (dims: CanvasSize | null) => void;
9897
+ fitScale: number;
9898
+ editorScale: number;
9899
+ handleZoomIn: () => void;
9900
+ handleZoomOut: () => void;
9901
+ handleResetZoom: () => void;
9902
+ handleZoomToFit: () => void;
9903
+ handleZoomToSelection: () => void;
9904
+ handleWheel: (e: WheelEvent) => void;
9905
+ centerBoundsInViewport: (bounds: SelectionBounds, nextScale: number) => void;
9906
+ getCanvasPointFromClient: (clientX: number, clientY: number) => {
9907
+ x: number;
9908
+ y: number;
9909
+ } | null;
9910
+ }
9911
+ declare function useZoomViewport({ canvasSize, selectedElements }: UseZoomViewportInput): UseZoomViewportResult;
10024
9912
  //#endregion
10025
- //#region src/viewer/hooks/presentation-mode/usePresentationKeyboard.d.ts
10026
- interface UsePresentationKeyboardInput {
9913
+ //#region src/viewer/hooks/presentation-mode/types.d.ts
9914
+ /**
9915
+ * How a forward/backward slide advance was requested.
9916
+ *
9917
+ * - `'click'`: a click/tap on the slide surface (PowerPoint's "On Mouse Click"
9918
+ * advance). This is the only trigger governed by `advanceOnClick`.
9919
+ * - `'explicit'`: keyboard, navigation buttons, action triggers, and timed
9920
+ * auto-advance. These always navigate regardless of `advanceOnClick`, matching
9921
+ * PowerPoint (arrow keys / Next always work even when click-advance is off).
9922
+ */
9923
+ type SlideAdvanceTrigger = 'click' | 'explicit';
9924
+ /**
9925
+ * State describing the transition overlay that plays while advancing into a
9926
+ * slide that carries a `p:transition`. The outgoing slide is snapshotted into
9927
+ * an animated overlay layer while the incoming slide renders underneath on the
9928
+ * main stage; the overlay tears down once `durationMs` elapses.
9929
+ */
9930
+ interface PresentationTransitionOverlayState {
9931
+ /** Index of the leaving slide, rendered (animated) in the overlay layer. */
9932
+ outgoingSlideIndex: number;
9933
+ /** Index of the arriving slide, already live on the main stage. */
9934
+ incomingSlideIndex: number;
9935
+ /** The incoming slide's transition definition (drives the CSS animation). */
9936
+ transition: PptxSlideTransition;
9937
+ /** Resolved transition duration (ms). */
9938
+ durationMs: number;
9939
+ }
9940
+ interface UsePresentationModeInput {
10027
9941
  mode: ViewerMode;
10028
- movePresentationSlide: (direction: 1 | -1) => void;
10029
- /** Jump to a 0-based slide index (Home / End / typed slide number). */
10030
- navigateToSlide: (index: number) => void;
10031
- /** Total slide count, so End can resolve the last slide. */
10032
- slideCount: number;
9942
+ slides: PptxSlide[];
9943
+ visibleSlideIndexes: number[];
9944
+ activeSlideIndex: number;
9945
+ containerRef: React.RefObject<HTMLElement | null>;
9946
+ /** Raw PPTX bytes: forwarded to audience window for content sharing. */
9947
+ content?: ArrayBuffer | Uint8Array | null;
10033
9948
  onSetMode: (mode: ViewerMode) => void;
10034
- /** Select a pointer tool (Ctrl+L / Ctrl+P / Ctrl+A / Ctrl+E). */
9949
+ onSetActiveSlideIndex: (index: number) => void;
9950
+ /**
9951
+ * Play a sound file for an action/transition. When `options.loop` is true the
9952
+ * audio repeats until the next animation sound plays or the show exits
9953
+ * (used for transition sounds flagged with `soundLoop`).
9954
+ */
9955
+ onPlayActionSound?: (soundPath: string, options?: {
9956
+ loop?: boolean;
9957
+ }) => void;
9958
+ /** Select a pointer tool (Ctrl+L laser, Ctrl+P pen, Ctrl+A arrow, Ctrl+E eraser). */
10035
9959
  onSetPointerTool?: (tool: PresentationPointerTool | 'arrow') => void;
10036
- /** Erase this slide's ink annotations (E). */
9960
+ /** Erase the current slide's ink annotations (E). */
10037
9961
  onEraseAnnotations?: () => void;
10038
9962
  /** Show or hide ink markup (Ctrl+M). */
10039
9963
  onToggleInkMarkup?: () => void;
@@ -10041,168 +9965,113 @@ interface UsePresentationKeyboardInput {
10041
9965
  onToggleToolbar?: () => void;
10042
9966
  /** Open the All Slides navigator (Ctrl+S). */
10043
9967
  onShowAllSlides?: () => void;
10044
- onToggleBlackScreen?: () => void;
10045
- onToggleWhiteScreen?: () => void;
10046
- rehearsing: boolean;
10047
- recordCurrentSlideTime: (slideIndex: number) => void;
10048
- presentationSlideIndex: number;
10049
- setShowRehearsalSummary: (value: boolean) => void;
10050
- }
10051
- /**
10052
- * Registers PowerPoint's slide-show shortcuts while a show is running.
10053
- *
10054
- * The key-to-action mapping lives in `pptx-viewer-shared` so every binding
10055
- * resolves the same chords; this hook only performs the resulting actions.
10056
- */
10057
- declare function usePresentationKeyboard(input: UsePresentationKeyboardInput): void;
10058
- //#endregion
10059
- //#region src/viewer/hooks/presentation-mode/useSlideNavigation.d.ts
10060
- interface UseSlideNavigationInput {
10061
- slides: PptxSlide[];
10062
- visibleSlideIndexes: number[];
10063
- presentationSlideIndex: number;
10064
- setPresentationSlideIndex: (index: number) => void;
10065
- setPresentationSlideVisible: (visible: boolean) => void;
10066
- setTransitionOverlay: (state: PresentationTransitionOverlayState | null) => void;
10067
- onSetMode: (mode: ViewerMode) => void;
10068
- onSetActiveSlideIndex: (index: number) => void;
10069
- onPlayActionSound?: (soundPath: string) => void;
9968
+ /** Called to persist rehearsal timings into slide transitions. */
9969
+ onSaveRehearsalTimings?: (timings: Record<number, number>) => void;
9970
+ /** Whether to loop continuously (kiosk or explicit loop setting). */
10070
9971
  loopContinuously?: boolean;
10071
- /** Whether to use rehearsed auto-advance timings. When false, slides advance only on click. */
9972
+ /** Whether to play animations during the slide show (false = skip all animations). */
9973
+ showWithAnimation?: boolean;
9974
+ /** Whether to use rehearsed auto-advance timings (false = manual advance only). */
10072
9975
  useTimings?: boolean;
10073
9976
  /**
10074
- * Fired when the user advances past the last slide (no loop, no rehearsal).
10075
- * The presentation-mode hook uses it for PowerPoint's "End with black
10076
- * slide" behavior. When absent, advancing past the end clamps as before.
9977
+ * Options > Advanced > "End with black slide". When true (PowerPoint's
9978
+ * default), advancing past the last slide shows a black end-of-show
9979
+ * screen; the next advance (or a click on it) exits. When false,
9980
+ * advancing past the last slide exits the show directly.
10077
9981
  */
10078
- onAdvancePastLastSlide?: () => void;
10079
- playNextAnimationGroup: () => boolean;
9982
+ endWithBlackSlide?: boolean;
9983
+ }
9984
+ interface UsePresentationModeResult {
9985
+ presentationSlideIndex: number;
9986
+ setPresentationSlideIndex: (index: number) => void;
9987
+ presentationSlideVisible: boolean;
9988
+ /** Active slide-transition overlay, or `null` when no transition is playing. */
9989
+ transitionOverlay: PresentationTransitionOverlayState | null;
9990
+ /** Tear down the transition overlay once its animation completes. */
9991
+ handleTransitionOverlayComplete: () => void;
9992
+ presentationAnimations: PresentationAnimationRuntime[];
9993
+ presentationElementStates: Map<string, ElementAnimationState>;
9994
+ presentationKeyframesCss: string;
10080
9995
  clearPresentationTimers: () => void;
10081
9996
  runPresentationEntranceAnimations: (slideIndex: number) => void;
10082
- presentationTimersRef: {
10083
- current: number[];
10084
- };
10085
- rehearsing: boolean;
10086
- recordCurrentSlideTime: (slideIndex: number) => void;
10087
- setShowRehearsalSummary: (value: boolean) => void;
10088
- }
10089
- interface UseSlideNavigationResult {
9997
+ /** True while the black "End of slide show" screen is displayed. */
9998
+ endOfShowVisible: boolean;
9999
+ /** Whether the All Slides navigator (Ctrl+S) is open during the show. */
10000
+ allSlidesOpen: boolean;
10001
+ openAllSlides: () => void;
10002
+ closeAllSlides: () => void;
10090
10003
  movePresentationSlide: (direction: 1 | -1, trigger?: SlideAdvanceTrigger) => void;
10091
10004
  navigateToSlide: (slideIndex: number) => void;
10092
10005
  handlePresentationAction: (action: PptxAction) => void;
10093
- scheduleAutoAdvanceForSlide: (slideIndex: number) => void;
10094
- }
10095
- declare function useSlideNavigation(input: UseSlideNavigationInput): UseSlideNavigationResult;
10096
- interface UsePresenterWindowInput {
10097
- currentSlideIndex: number;
10098
- isPresenterMode: boolean;
10099
- /** Raw PPTX bytes to share with the audience tab via IndexedDB. */
10100
- content?: ArrayBuffer | Uint8Array | null;
10101
- snapshot: PresentationSnapshot;
10102
- }
10103
- interface UsePresenterWindowResult {
10006
+ /**
10007
+ * Handle a shape click in presentation mode. If the shape is an interactive
10008
+ * trigger, play its animation sequence. Returns `true` if handled.
10009
+ */
10010
+ handleInteractiveShapeClick: (shapeId: string) => boolean;
10011
+ /** Set of shape IDs that are interactive sequence triggers on the current slide. */
10012
+ interactiveTriggerShapeIds: ReadonlySet<string>;
10013
+ /** Set of shape IDs that are hover animation triggers on the current slide. */
10014
+ hoverTriggerShapeIds: ReadonlySet<string>;
10015
+ /** Handle hover start on a shape. If the shape has a hover sequence, play it. Returns `true` if handled. */
10016
+ handleHoverStart: (shapeId: string) => boolean;
10017
+ /** Handle hover end on a shape. Resets the hover sequence for replay. */
10018
+ handleHoverEnd: (shapeId: string) => void;
10019
+ /** Must be called from a user-gesture handler (click) to satisfy browser fullscreen policy. */
10020
+ enterPresentMode: () => void;
10021
+ /** Whether presenter view (split-screen with notes) is active instead of fullscreen. */
10022
+ presenterMode: boolean;
10023
+ /** Enter presenter view mode (no fullscreen, shows notes panel). */
10024
+ enterPresenterView: () => void;
10025
+ /** Toggle between fullscreen and presenter view during presentation. */
10026
+ togglePresenterView: () => void;
10027
+ /** Timestamp (ms) when the presentation started: used for elapsed timer. */
10028
+ presentationStartTime: number | null;
10029
+ /** Whether the current presentation session is in rehearse-timings mode. */
10030
+ rehearsing: boolean;
10031
+ /** Enter rehearse-timings mode (fullscreen presentation + timing HUD). */
10032
+ enterRehearsalMode: () => void;
10033
+ /** Recorded timings in ms, keyed by slide index. Populated during rehearsal. */
10034
+ recordedTimings: Record<number, number>;
10035
+ /** Timestamp when the current slide started (ms since epoch). */
10036
+ slideStartTime: number | null;
10037
+ /** Whether the rehearsal summary dialog should be shown. */
10038
+ showRehearsalSummary: boolean;
10039
+ /** Dismiss the rehearsal summary (discard timings). */
10040
+ dismissRehearsalSummary: () => void;
10041
+ /** Save recorded timings into each slide's transition.advanceAfterMs. */
10042
+ saveRehearsalTimings: () => void;
10043
+ /** Whether rehearsal timer is paused. */
10044
+ rehearsalPaused: boolean;
10045
+ /** Toggle the rehearsal timer pause state. */
10046
+ toggleRehearsalPause: () => void;
10047
+ /** Handle a zoom element click in presentation mode. */
10048
+ handleZoomClick: (targetSlideIndex: number, returnSlideIndex: number) => void;
10049
+ /** Ref holding the slide index to return to after zoom navigation. */
10050
+ zoomReturnSlideIndex: React.RefObject<number | null>;
10051
+ /** Navigate back to the zoom summary slide. Returns true if navigation occurred. */
10052
+ returnToZoomSlide: () => boolean;
10053
+ /** Clear the stored zoom return index. */
10054
+ clearZoomReturn: () => void;
10055
+ /** Open the audience display in a separate browser window. Returns `true` if successful. */
10104
10056
  openAudienceWindow: () => boolean;
10057
+ /** Close the audience display window. */
10105
10058
  closeAudienceWindow: () => void;
10059
+ /** Whether the audience window is currently open. */
10106
10060
  isAudienceWindowOpen: () => boolean;
10061
+ /** Send a slide index to the audience window explicitly. */
10107
10062
  syncSlideToAudience: (slideIndex: number) => void;
10108
10063
  syncStateToAudience: (snapshot: PresentationSnapshot) => void;
10109
- swapDisplays: () => Promise<boolean>;
10110
- }
10111
- declare function usePresenterWindow(input: UsePresenterWindowInput): UsePresenterWindowResult;
10112
- //#endregion
10113
- //#region src/viewer/hooks/presentation-mode/useAudienceMode.d.ts
10114
- interface UseAudienceModeInput {
10115
- mode: ViewerMode;
10116
- onSetMode: (mode: ViewerMode) => void;
10117
- onSetActiveSlideIndex: (index: number) => void;
10118
- containerRef: React.RefObject<HTMLElement | null>;
10119
- onSnapshot?: (snapshot: PresentationSnapshot) => void;
10120
- }
10121
- /**
10122
- * When the page was opened with the `#pptx-audience` hash, this hook:
10123
- * 1. Auto-enters fullscreen presentation mode after content loads
10124
- * 2. Listens on BroadcastChannel for slide-change messages from the presenter
10125
- * 3. Exits presentation mode when the presenter sends an exit signal
10126
- */
10127
- declare function useAudienceMode(input: UseAudienceModeInput): void;
10128
-
10129
- //#region src/viewer/hooks/useEditorHistory.d.ts
10130
- interface EditorHistoryInput {
10131
- slides: PptxSlide[];
10132
- canvasSize: CanvasSize;
10133
- activeSlideIndex: number;
10134
- templateElementsBySlideId: Record<string, PptxElement[]>;
10135
- selectedElementId: string | null;
10136
- selectedElementIds: string[];
10137
- editTemplateMode: boolean;
10138
- headerFooter: PptxHeaderFooter;
10139
- loading: boolean;
10140
- error: string | null;
10141
- /**
10142
- * Undo-stack depth (File > Options > Advanced > "Maximum number of undos",
10143
- * resolved via the shared `resolveHistoryDepth`). Defaults to 120.
10144
- */
10145
- maxHistoryEntries?: number;
10146
- hasActivePointerInteraction: () => boolean;
10147
- pointerCommitNonce: number;
10148
- setSlides: (slides: PptxSlide[]) => void;
10149
- setCanvasSize: (size: CanvasSize) => void;
10150
- setActiveSlideIndex: (index: number) => void;
10151
- setTemplateElementsBySlideId: (map: Record<string, PptxElement[]>) => void;
10152
- setSelectedElementId: (id: string | null) => void;
10153
- setSelectedElementIds: (ids: string[]) => void;
10154
- setEditTemplateMode: (mode: boolean) => void;
10155
- setHeaderFooter: (hf: PptxHeaderFooter) => void;
10156
- }
10157
- interface EditorHistoryResult {
10158
- canUndo: boolean;
10159
- canRedo: boolean;
10160
- undoLabel: string | undefined;
10161
- redoLabel: string | undefined;
10162
- handleUndo: () => void;
10163
- handleRedo: () => void;
10164
- resetHistory: () => void;
10165
- markDirty: () => void;
10166
- buildHistorySnapshot: (actionLabel?: string) => EditorHistorySnapshot;
10167
- }
10168
- declare function useEditorHistory(input: EditorHistoryInput): EditorHistoryResult;
10169
- //#endregion
10170
- //#region src/viewer/hooks/useZoomViewport.d.ts
10171
- /** Axis-aligned bounding box used by zoom / viewport helpers. */
10172
- interface SelectionBounds {
10173
- minX: number;
10174
- minY: number;
10175
- maxX: number;
10176
- maxY: number;
10177
- }
10178
- interface UseZoomViewportInput {
10179
- canvasSize: CanvasSize;
10180
- selectedElements: PptxElement[];
10181
- }
10182
- interface UseZoomViewportResult {
10183
- editWrapperRef: React.RefObject<HTMLDivElement | null>;
10184
- canvasStageRef: React.RefObject<HTMLDivElement | null>;
10185
- canvasViewportRef: React.RefObject<HTMLDivElement | null>;
10186
- renderScaleRef: React.MutableRefObject<number>;
10187
- scale: number;
10188
- setScale: (scale: number) => void;
10189
- editorDimensions: CanvasSize | null;
10190
- setEditorDimensions: (dims: CanvasSize | null) => void;
10191
- fitScale: number;
10192
- editorScale: number;
10193
- handleZoomIn: () => void;
10194
- handleZoomOut: () => void;
10195
- handleResetZoom: () => void;
10196
- handleZoomToFit: () => void;
10197
- handleZoomToSelection: () => void;
10198
- handleWheel: (e: WheelEvent) => void;
10199
- centerBoundsInViewport: (bounds: SelectionBounds, nextScale: number) => void;
10200
- getCanvasPointFromClient: (clientX: number, clientY: number) => {
10201
- x: number;
10202
- y: number;
10203
- } | null;
10064
+ presenterSnapshot: PresentationSnapshot;
10065
+ setPresenterBlackout: (blackout: PresentationSnapshot['blackout']) => void;
10066
+ togglePresenterTimer: () => void;
10067
+ resetPresenterTimer: () => void;
10068
+ stepPresenterZoom: (direction: 1 | -1) => void;
10069
+ resetPresenterZoom: () => void;
10070
+ setPresenterCaption: (caption: string) => void;
10071
+ setPresenterSubtitlesVisible: (visible: boolean) => void;
10072
+ updatePresenterSnapshot: (patch: Partial<PresentationSnapshot>) => void;
10073
+ swapPresenterDisplays: () => Promise<boolean>;
10204
10074
  }
10205
- declare function useZoomViewport({ canvasSize, selectedElements }: UseZoomViewportInput): UseZoomViewportResult;
10206
10075
  //#endregion
10207
10076
  //#region src/viewer/hooks/usePresentationMode.d.ts
10208
10077
  declare function usePresentationMode(input: UsePresentationModeInput): UsePresentationModeResult;
@@ -12137,6 +12006,126 @@ interface UseSwipeNavigationResult {
12137
12006
  }
12138
12007
  declare function useSwipeNavigation(input: UseSwipeNavigationInput): UseSwipeNavigationResult;
12139
12008
  //#endregion
12009
+ //#region src/viewer/hooks/presentation-mode/useAnimationPlayback.d.ts
12010
+ interface UseAnimationPlaybackInput {
12011
+ slides: PptxSlide[];
12012
+ onPlayActionSound?: (soundPath: string) => void;
12013
+ /** When false, all animations are skipped (elements shown immediately). */
12014
+ showWithAnimation?: boolean;
12015
+ }
12016
+ interface UseAnimationPlaybackResult {
12017
+ presentationAnimations: PresentationAnimationRuntime[];
12018
+ presentationElementStates: Map<string, ElementAnimationState>;
12019
+ presentationKeyframesCss: string;
12020
+ interactiveTriggerShapeIds: ReadonlySet<string>;
12021
+ hoverTriggerShapeIds: ReadonlySet<string>;
12022
+ clearPresentationTimers: () => void;
12023
+ playNextAnimationGroup: () => boolean;
12024
+ handleInteractiveShapeClick: (shapeId: string) => boolean;
12025
+ handleHoverStart: (shapeId: string) => boolean;
12026
+ handleHoverEnd: (shapeId: string) => void;
12027
+ runPresentationEntranceAnimations: (slideIndex: number) => void;
12028
+ /** Exposed so the orchestrator can schedule additional timers (e.g. auto-advance). */
12029
+ presentationTimersRef: React.RefObject<number[]>;
12030
+ }
12031
+ declare function useAnimationPlayback(input: UseAnimationPlaybackInput): UseAnimationPlaybackResult;
12032
+ //#endregion
12033
+ //#region src/viewer/hooks/presentation-mode/useRehearsalTimings.d.ts
12034
+ interface UseRehearsalTimingsInput {
12035
+ containerRef: React.RefObject<HTMLElement | null>;
12036
+ onSetMode: (mode: ViewerMode) => void;
12037
+ onSaveRehearsalTimings?: (timings: Record<number, number>) => void;
12038
+ setPresentationStartTime: (time: number | null) => void;
12039
+ setPresenterMode: (mode: boolean) => void;
12040
+ }
12041
+ interface UseRehearsalTimingsResult {
12042
+ rehearsing: boolean;
12043
+ setRehearsing: React.Dispatch<React.SetStateAction<boolean>>;
12044
+ recordedTimings: Record<number, number>;
12045
+ slideStartTime: number | null;
12046
+ showRehearsalSummary: boolean;
12047
+ setShowRehearsalSummary: React.Dispatch<React.SetStateAction<boolean>>;
12048
+ rehearsalPaused: boolean;
12049
+ recordCurrentSlideTime: (slideIndex: number) => void;
12050
+ dismissRehearsalSummary: () => void;
12051
+ saveRehearsalTimings: () => void;
12052
+ enterRehearsalMode: () => void;
12053
+ toggleRehearsalPause: () => void;
12054
+ }
12055
+ declare function useRehearsalTimings(input: UseRehearsalTimingsInput): UseRehearsalTimingsResult;
12056
+ //#endregion
12057
+ //#region src/viewer/hooks/presentation-mode/usePresentationKeyboard.d.ts
12058
+ interface UsePresentationKeyboardInput {
12059
+ mode: ViewerMode;
12060
+ movePresentationSlide: (direction: 1 | -1) => void;
12061
+ /** Jump to a 0-based slide index (Home / End / typed slide number). */
12062
+ navigateToSlide: (index: number) => void;
12063
+ /** Total slide count, so End can resolve the last slide. */
12064
+ slideCount: number;
12065
+ onSetMode: (mode: ViewerMode) => void;
12066
+ /** Select a pointer tool (Ctrl+L / Ctrl+P / Ctrl+A / Ctrl+E). */
12067
+ onSetPointerTool?: (tool: PresentationPointerTool | 'arrow') => void;
12068
+ /** Erase this slide's ink annotations (E). */
12069
+ onEraseAnnotations?: () => void;
12070
+ /** Show or hide ink markup (Ctrl+M). */
12071
+ onToggleInkMarkup?: () => void;
12072
+ /** Show or hide the slide-show chrome (Ctrl+H). */
12073
+ onToggleToolbar?: () => void;
12074
+ /** Open the All Slides navigator (Ctrl+S). */
12075
+ onShowAllSlides?: () => void;
12076
+ onToggleBlackScreen?: () => void;
12077
+ onToggleWhiteScreen?: () => void;
12078
+ rehearsing: boolean;
12079
+ recordCurrentSlideTime: (slideIndex: number) => void;
12080
+ presentationSlideIndex: number;
12081
+ setShowRehearsalSummary: (value: boolean) => void;
12082
+ }
12083
+ /**
12084
+ * Registers PowerPoint's slide-show shortcuts while a show is running.
12085
+ *
12086
+ * The key-to-action mapping lives in `pptx-viewer-shared` so every binding
12087
+ * resolves the same chords; this hook only performs the resulting actions.
12088
+ */
12089
+ declare function usePresentationKeyboard(input: UsePresentationKeyboardInput): void;
12090
+ //#endregion
12091
+ //#region src/viewer/hooks/presentation-mode/useSlideNavigation.d.ts
12092
+ interface UseSlideNavigationInput {
12093
+ slides: PptxSlide[];
12094
+ visibleSlideIndexes: number[];
12095
+ presentationSlideIndex: number;
12096
+ setPresentationSlideIndex: (index: number) => void;
12097
+ setPresentationSlideVisible: (visible: boolean) => void;
12098
+ setTransitionOverlay: (state: PresentationTransitionOverlayState | null) => void;
12099
+ onSetMode: (mode: ViewerMode) => void;
12100
+ onSetActiveSlideIndex: (index: number) => void;
12101
+ onPlayActionSound?: (soundPath: string) => void;
12102
+ loopContinuously?: boolean;
12103
+ /** Whether to use rehearsed auto-advance timings. When false, slides advance only on click. */
12104
+ useTimings?: boolean;
12105
+ /**
12106
+ * Fired when the user advances past the last slide (no loop, no rehearsal).
12107
+ * The presentation-mode hook uses it for PowerPoint's "End with black
12108
+ * slide" behavior. When absent, advancing past the end clamps as before.
12109
+ */
12110
+ onAdvancePastLastSlide?: () => void;
12111
+ playNextAnimationGroup: () => boolean;
12112
+ clearPresentationTimers: () => void;
12113
+ runPresentationEntranceAnimations: (slideIndex: number) => void;
12114
+ presentationTimersRef: {
12115
+ current: number[];
12116
+ };
12117
+ rehearsing: boolean;
12118
+ recordCurrentSlideTime: (slideIndex: number) => void;
12119
+ setShowRehearsalSummary: (value: boolean) => void;
12120
+ }
12121
+ interface UseSlideNavigationResult {
12122
+ movePresentationSlide: (direction: 1 | -1, trigger?: SlideAdvanceTrigger) => void;
12123
+ navigateToSlide: (slideIndex: number) => void;
12124
+ handlePresentationAction: (action: PptxAction) => void;
12125
+ scheduleAutoAdvanceForSlide: (slideIndex: number) => void;
12126
+ }
12127
+ declare function useSlideNavigation(input: UseSlideNavigationInput): UseSlideNavigationResult;
12128
+ //#endregion
12140
12129
  //#region src/viewer/hooks/presentation-mode/useZoomNavigation.d.ts
12141
12130
  /**
12142
12131
  * Input for the useZoomNavigation sub-hook.
@@ -12181,6 +12170,22 @@ interface UseZoomNavigationResult {
12181
12170
  * the summary zoom slide.
12182
12171
  */
12183
12172
  declare function useZoomNavigation(input: UseZoomNavigationInput): UseZoomNavigationResult;
12173
+ //#endregion
12174
+ //#region src/viewer/hooks/presentation-mode/useAudienceMode.d.ts
12175
+ interface UseAudienceModeInput {
12176
+ mode: ViewerMode;
12177
+ onSetMode: (mode: ViewerMode) => void;
12178
+ onSetActiveSlideIndex: (index: number) => void;
12179
+ containerRef: React.RefObject<HTMLElement | null>;
12180
+ onSnapshot?: (snapshot: PresentationSnapshot) => void;
12181
+ }
12182
+ /**
12183
+ * When the page was opened with the `#pptx-audience` hash, this hook:
12184
+ * 1. Auto-enters fullscreen presentation mode after content loads
12185
+ * 2. Listens on BroadcastChannel for slide-change messages from the presenter
12186
+ * 3. Exits presentation mode when the presenter sends an exit signal
12187
+ */
12188
+ declare function useAudienceMode(input: UseAudienceModeInput): void;
12184
12189
 
12185
12190
  export { MIN_TOUCH_TARGET, MOBILE_BREAKPOINT, TABLET_BREAKPOINT, computeToolbarVisibility, computeVirtualRange, useAnimationPlayback, useAnnotationHandlers, useAudienceMode, useAutosave, useBroadcastFollower, useCanvasInteractions, useClipboardHandlers, useCollaborativeHistory, useCollaborativeState, useComments, useContentLifecycle, useDerivedElementState, useDerivedSlideState, useDialogCustomShows, useEditorHistory, useEditorOperations, useElementManipulation, useElementOperations, useExportHandlers, useExportSaveAs, useFindReplace, useFollowMode, useFontInjection, useGroupAlignLayerHandlers, useIOHandlers, useInsertElements, useIsMobile, useKeyboardInsets, useKeyboardShortcutWiring, useKeyboardShortcuts, useLayoutSwitching, useLoadContent, useMergeShapesHandler, useModalDismissDrag, usePointerHandlers, usePresenceTracking, usePresentationAnnotations, usePresentationKeyboard, usePresentationMode, usePresentationSetup, usePresenterWindow, usePrintHandlers, usePropertyHandlers, useRecoveryDetection, useReducedMotion, useRehearsalTimings, useResizablePanels, useSectionOperations, useSerialize, useSheetDismissDrag, useSlideManagement, useSlideNavigation, useSwipeNavigation, useTableOperations, useThemeHandlers, useThemeSwitching, useToolbarVisibility, useTouchGestures, useViewerBuildingBlocks, useViewerCoreState, useViewerDialogs, useViewerIntegration, useViewerOptions, useViewerState, useViewerUIState, useVirtualizedSlides, useYjsDocumentSync, useYjsProvider, useZoomNavigation, useZoomViewport };
12186
12191
  export type { AnnotationHandlersResult, AnnotationStroke, AutosaveStatus, CanvasInteractionHandlers, CollaborationConfig, CollaborationContextValue, ConnectionStatus, ContentLifecycleResult, DerivedElementState, DerivedSlideState, DeviceOrientation, EditorHistoryInput, EditorHistoryResult, EditorOperationsResult, ElementManipulationHandlers, ElementOperations, ExportHandlersResult, ExportSaveAsResult, IOHandlersResult, InsertElementHandlers, LayoutSwitchingResult, MergeShapesHandlerInput, MergeShapesHandlers, ModalDismissDrag, ModalDismissDragHandlers, PresentationSetupResult, PresentationTool, PrintHandlersResult, PropertyHandlersResult, SectionOperations, SheetDismissDrag, SheetDismissDragHandlers, SlideManagementHandlers, TableOperationHandlers, ThemeHandlersResult, ThemeSwitchingResult, ToolbarVisibility, TouchGestureCallbacks, UseAnimationPlaybackInput, UseAnimationPlaybackResult, UseAnnotationHandlersInput, UseAutosaveInput, UseAutosaveResult, UseBroadcastFollowerInput, UseCanvasInteractionsInput, UseCollaborativeHistoryInput, UseCollaborativeHistoryResult, UseCollaborativeStateInput, UseContentLifecycleInput, UseDerivedElementStateInput, UseDerivedSlideStateInput, UseDialogCustomShowsInput, UseDialogCustomShowsResult, UseEditorOperationsInput, UseElementManipulationInput, UseElementOperationsInput, UseExportHandlersInput, UseExportSaveAsInput, UseFollowModeInput, UseFollowModeResult, UseFontInjectionInput, UseIOHandlersInput, UseInsertElementsInput, UseIsMobileInput, UseIsMobileResult, UseKeyboardInsetsResult, UseKeyboardShortcutWiringInput, UseKeyboardShortcutsInput, UseLayoutSwitchingInput, UseLoadContentInput, UseLoadContentResult, UsePointerHandlersInput, UsePresenceTrackingInput, UsePresenceTrackingResult, UsePresentationAnnotationsResult, UsePresentationSetupInput, UsePresenterWindowInput, UsePresenterWindowResult, UsePrintHandlersInput, UsePropertyHandlersInput, UseRecoveryDetectionInput, UseReducedMotionResult, UseRehearsalTimingsInput, UseRehearsalTimingsResult, UseResizablePanelsResult, UseSectionOperationsInput, UseSerializeInput, UseSlideManagementInput, UseSlideNavigationInput, UseSlideNavigationResult, UseSwipeNavigationInput, UseSwipeNavigationResult, UseTableOperationsInput, UseThemeHandlersInput, UseThemeSwitchingInput, UseTouchGesturesInput, UseViewerBuildingBlocksInput, UseViewerCoreStateInput, UseViewerDialogsInput, UseViewerIntegrationInput, UseViewerOptionsResult, UseViewerStateInput, UseYjsDocumentSyncInput, UseYjsProviderInput, UseYjsProviderResult, UseZoomNavigationInput, UseZoomNavigationResult, UserPresence, ViewerBuildingBlocksResult, ViewerCoreState, ViewerDialogsResult, ViewerIntegrationResult, ViewerState, ViewerUIState, VirtualizedRange, VirtualizedSlidesOptions, VirtualizedSlidesResult };