pptx-vanilla-viewer 3.14.0 → 3.16.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.
@@ -13691,708 +13691,275 @@ interface RibbonTransitionDraft {
13691
13691
  /** Advance Slide > After, as the `mm:ss.hh` text the field holds. */
13692
13692
  advanceAfterText: string;
13693
13693
  }
13694
+ type BackstagePage = 'home' | 'new' | 'open' | 'info' | 'save' | 'saveAs' | 'print' | 'share' | 'export' | 'close' | 'account' | 'options';
13694
13695
  //#endregion
13695
- //#region src/render/p14-transition-keyframes.d.ts
13696
- /** Part 1: conveyor / doors / ferris / flash / flythrough / gallery / glitter / honeycomb / pan. */
13697
- declare const P14_TRANSITION_KEYFRAMES = "\n/* ── Conveyor (translate X with staggered timing) ──────────────────── */\n@keyframes pptx-tr-conveyor-in-from-right {\n\tfrom { transform: translateX(100%) rotateY(-30deg); }\n\t60% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-left {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(-100%) rotateY(30deg); }\n}\n@keyframes pptx-tr-conveyor-in-from-left {\n\tfrom { transform: translateX(-100%) rotateY(30deg); }\n\t60% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-right {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(100%) rotateY(-30deg); }\n}\n\n/* ── Doors (clip-path from center split) ──────────────────────────────\n MEASURED via COM CreateVideo: PowerPoint's `dir=\"horz\"` names a\n HORIZONTAL split line (two panels stacked top/bottom, opening upward and\n downward), and `dir=\"vert\"` a VERTICAL split line (panels side by side,\n opening left and right) - the opposite of what \"clips left/right\" vs\n \"clips top/bottom\" would suggest at a glance. Keep the clip-path bodies\n matched to the MEASURED direction, not the intuitive one. */\n@keyframes pptx-tr-doors-horz {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-doors-vert {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n\n/* ── Ferris (rotate elements around center) ───────────────────────── */\n@keyframes pptx-tr-ferris-in-from-right {\n\tfrom { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-left {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n}\n@keyframes pptx-tr-ferris-in-from-left {\n\tfrom { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-right {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n}\n\n/* ── Flash (bright flash opacity burst) ──────────────────────────── */\n@keyframes pptx-tr-flash-white {\n\t0% { opacity: 1; }\n\t30% { opacity: 0; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n@keyframes pptx-tr-flash-in {\n\t0% { opacity: 0; }\n\t50% { opacity: 0; }\n\t70% { opacity: 1; }\n\t100% { opacity: 1; }\n}\n\n/* ── Flythrough (scale + translate Z-axis feel) ──────────────────── */\n@keyframes pptx-tr-flythrough-in {\n\tfrom { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n}\n@keyframes pptx-tr-flythrough-reverse-in {\n\tfrom { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-reverse-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n}\n\n/* ── Gallery (translate with perspective) ─────────────────────────── */\n@keyframes pptx-tr-gallery-in-from-right {\n\tfrom { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-left {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n}\n@keyframes pptx-tr-gallery-in-from-left {\n\tfrom { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-right {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n}\n\n/* ── Glitter (particle dissolve effect) ──────────────────────────── */\n@keyframes pptx-tr-glitter-in {\n\tfrom { opacity: 0; filter: brightness(1.5) contrast(1.3) blur(2px); }\n\t60% { opacity: 0.7; filter: brightness(1.2) contrast(1.1) blur(1px); }\n\tto { opacity: 1; filter: brightness(1) contrast(1) blur(0); }\n}\n\n/* ── Honeycomb (hexagonal reveal) ────────────────────────────────── */\n@keyframes pptx-tr-honeycomb-in {\n\tfrom {\n\t\tclip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%);\n\t\topacity: 0;\n\t}\n\tto {\n\t\tclip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);\n\t\topacity: 1;\n\t}\n}\n@keyframes pptx-tr-honeycomb-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* ── Pan (large-scale translate) ─────────────────────────────────── */\n@keyframes pptx-tr-pan-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-pan-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-pan-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-pan-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n";
13698
- /** Part 2: prism / reveal / ripple / shred / switch / vortex / warp / wheelReverse / window. */
13699
- declare const P14_TRANSITION_KEYFRAMES_2 = "\n/* ── Prism: see `slide-transition-prism` (split out to keep this module\n under the per-file LOC budget) ─────────────────────────────────────── */\n\n@keyframes pptx-tr-prism-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-bottom {\n\tfrom { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-top {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-top {\n\tfrom { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-bottom {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n}\n\n/* ── Reveal (slide away reveal) ──────────────────────────────────── */\n@keyframes pptx-tr-reveal-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-reveal-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n/* MEASURED: the incoming layer stays hidden for roughly the first half of the\n transition (a real black/background gap shows through), then fades in -\n not a flat 0.5->1 fade running the whole duration. */\n@keyframes pptx-tr-reveal-in {\n\t0% { opacity: 0; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n\n/* ── Ripple (expanding ring clip-path) ───────────────────────────── */\n@keyframes pptx-tr-ripple-in {\n\tfrom { clip-path: circle(0% at 50% 50%); opacity: 0.5; }\n\t30% { clip-path: circle(20% at 50% 50%); opacity: 0.7; }\n\t60% { clip-path: circle(50% at 50% 50%); opacity: 0.9; }\n\tto { clip-path: circle(75% at 50% 50%); opacity: 1; }\n}\n\n/* ── Shred (fragmented clip-path pieces) ─────────────────────────── */\n@keyframes pptx-tr-shred-strips-in {\n\tfrom { clip-path: inset(0 100% 0 0); opacity: 0; }\n\t30% { clip-path: inset(0 60% 0 0); opacity: 0.5; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-rectangles-in {\n\tfrom { clip-path: inset(50%); opacity: 0; }\n\t40% { clip-path: inset(20%); opacity: 0.6; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* ── Switch (flip/rotate swap) ───────────────────────────────────── */\n@keyframes pptx-tr-switch-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n}\n@keyframes pptx-tr-switch-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n}\n\n/* ── Vortex (rotate + scale spiral) ──────────────────────────────── */\n@keyframes pptx-tr-vortex-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-vortex-out {\n\tfrom { transform: rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: rotate(-720deg) scale(0); opacity: 0; }\n}\n\n/* ── Warp: see `slide-transition-warp` (COM-measured radial zoom blur,\n split out to keep this module under the per-file LOC budget) ────────── */\n\n@keyframes pptx-tr-warp-in {\n\t0% { transform: scale(0.25); opacity: 0; filter: blur(10px) brightness(1.8); }\n\t50% { transform: scale(0.85); opacity: 0.7; filter: blur(3px) brightness(1.3); }\n\t100% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n}\n@keyframes pptx-tr-warp-out {\n\t0% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n\t50% { transform: scale(0.85); opacity: 0.7; filter: blur(3px) brightness(1.3); }\n\t100% { transform: scale(0.25); opacity: 0; filter: blur(10px) brightness(1.8); }\n}\n@keyframes pptx-tr-warp-reverse-in {\n\t0% { transform: scale(3.2); opacity: 0; filter: blur(14px) brightness(2.2); }\n\t50% { transform: scale(1.7); opacity: 0.7; filter: blur(6px) brightness(1.5); }\n\t100% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n}\n@keyframes pptx-tr-warp-reverse-out {\n\t0% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n\t50% { transform: scale(1.7); opacity: 0.7; filter: blur(6px) brightness(1.5); }\n\t100% { transform: scale(3.2); opacity: 0; filter: blur(14px) brightness(2.2); }\n}\n\n\n/* ── WheelReverse (reverse wheel rotation) ───────────────────────── */\n@keyframes pptx-tr-wheel-reverse-in {\n\tfrom { clip-path: circle(0% at 50% 50%); transform: rotate(180deg); }\n\tto { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }\n}\n\n/* ── Window (scale from center with border) ──────────────────────────\n Same measured horz/vert meaning as Doors above (horz = horizontal split\n line opening vertically; vert = vertical split line opening horizontally). */\n@keyframes pptx-tr-window-horz {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-vert {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-out {\n\tfrom { opacity: 1; transform: scale(1); }\n\tto { opacity: 0; transform: scale(0.9); }\n}\n";
13700
- /** Both p14 keyframe blocks concatenated, for single `<style>` injection. */
13701
- declare const P14_TRANSITION_KEYFRAMES_ALL = "\n/* ── Conveyor (translate X with staggered timing) ──────────────────── */\n@keyframes pptx-tr-conveyor-in-from-right {\n\tfrom { transform: translateX(100%) rotateY(-30deg); }\n\t60% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-left {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(-100%) rotateY(30deg); }\n}\n@keyframes pptx-tr-conveyor-in-from-left {\n\tfrom { transform: translateX(-100%) rotateY(30deg); }\n\t60% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-right {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(100%) rotateY(-30deg); }\n}\n\n/* ── Doors (clip-path from center split) ──────────────────────────────\n MEASURED via COM CreateVideo: PowerPoint's `dir=\"horz\"` names a\n HORIZONTAL split line (two panels stacked top/bottom, opening upward and\n downward), and `dir=\"vert\"` a VERTICAL split line (panels side by side,\n opening left and right) - the opposite of what \"clips left/right\" vs\n \"clips top/bottom\" would suggest at a glance. Keep the clip-path bodies\n matched to the MEASURED direction, not the intuitive one. */\n@keyframes pptx-tr-doors-horz {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-doors-vert {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n\n/* ── Ferris (rotate elements around center) ───────────────────────── */\n@keyframes pptx-tr-ferris-in-from-right {\n\tfrom { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-left {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n}\n@keyframes pptx-tr-ferris-in-from-left {\n\tfrom { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-right {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n}\n\n/* ── Flash (bright flash opacity burst) ──────────────────────────── */\n@keyframes pptx-tr-flash-white {\n\t0% { opacity: 1; }\n\t30% { opacity: 0; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n@keyframes pptx-tr-flash-in {\n\t0% { opacity: 0; }\n\t50% { opacity: 0; }\n\t70% { opacity: 1; }\n\t100% { opacity: 1; }\n}\n\n/* ── Flythrough (scale + translate Z-axis feel) ──────────────────── */\n@keyframes pptx-tr-flythrough-in {\n\tfrom { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n}\n@keyframes pptx-tr-flythrough-reverse-in {\n\tfrom { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-reverse-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n}\n\n/* ── Gallery (translate with perspective) ─────────────────────────── */\n@keyframes pptx-tr-gallery-in-from-right {\n\tfrom { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-left {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n}\n@keyframes pptx-tr-gallery-in-from-left {\n\tfrom { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-right {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n}\n\n/* ── Glitter (particle dissolve effect) ──────────────────────────── */\n@keyframes pptx-tr-glitter-in {\n\tfrom { opacity: 0; filter: brightness(1.5) contrast(1.3) blur(2px); }\n\t60% { opacity: 0.7; filter: brightness(1.2) contrast(1.1) blur(1px); }\n\tto { opacity: 1; filter: brightness(1) contrast(1) blur(0); }\n}\n\n/* ── Honeycomb (hexagonal reveal) ────────────────────────────────── */\n@keyframes pptx-tr-honeycomb-in {\n\tfrom {\n\t\tclip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%);\n\t\topacity: 0;\n\t}\n\tto {\n\t\tclip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);\n\t\topacity: 1;\n\t}\n}\n@keyframes pptx-tr-honeycomb-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* ── Pan (large-scale translate) ─────────────────────────────────── */\n@keyframes pptx-tr-pan-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-pan-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-pan-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-pan-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n\n\n/* ── Prism: see `slide-transition-prism` (split out to keep this module\n under the per-file LOC budget) ─────────────────────────────────────── */\n\n@keyframes pptx-tr-prism-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-bottom {\n\tfrom { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-top {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-top {\n\tfrom { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-bottom {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n}\n\n/* ── Reveal (slide away reveal) ──────────────────────────────────── */\n@keyframes pptx-tr-reveal-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-reveal-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n/* MEASURED: the incoming layer stays hidden for roughly the first half of the\n transition (a real black/background gap shows through), then fades in -\n not a flat 0.5->1 fade running the whole duration. */\n@keyframes pptx-tr-reveal-in {\n\t0% { opacity: 0; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n\n/* ── Ripple (expanding ring clip-path) ───────────────────────────── */\n@keyframes pptx-tr-ripple-in {\n\tfrom { clip-path: circle(0% at 50% 50%); opacity: 0.5; }\n\t30% { clip-path: circle(20% at 50% 50%); opacity: 0.7; }\n\t60% { clip-path: circle(50% at 50% 50%); opacity: 0.9; }\n\tto { clip-path: circle(75% at 50% 50%); opacity: 1; }\n}\n\n/* ── Shred (fragmented clip-path pieces) ─────────────────────────── */\n@keyframes pptx-tr-shred-strips-in {\n\tfrom { clip-path: inset(0 100% 0 0); opacity: 0; }\n\t30% { clip-path: inset(0 60% 0 0); opacity: 0.5; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-rectangles-in {\n\tfrom { clip-path: inset(50%); opacity: 0; }\n\t40% { clip-path: inset(20%); opacity: 0.6; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* ── Switch (flip/rotate swap) ───────────────────────────────────── */\n@keyframes pptx-tr-switch-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n}\n@keyframes pptx-tr-switch-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n}\n\n/* ── Vortex (rotate + scale spiral) ──────────────────────────────── */\n@keyframes pptx-tr-vortex-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-vortex-out {\n\tfrom { transform: rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: rotate(-720deg) scale(0); opacity: 0; }\n}\n\n/* ── Warp: see `slide-transition-warp` (COM-measured radial zoom blur,\n split out to keep this module under the per-file LOC budget) ────────── */\n\n@keyframes pptx-tr-warp-in {\n\t0% { transform: scale(0.25); opacity: 0; filter: blur(10px) brightness(1.8); }\n\t50% { transform: scale(0.85); opacity: 0.7; filter: blur(3px) brightness(1.3); }\n\t100% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n}\n@keyframes pptx-tr-warp-out {\n\t0% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n\t50% { transform: scale(0.85); opacity: 0.7; filter: blur(3px) brightness(1.3); }\n\t100% { transform: scale(0.25); opacity: 0; filter: blur(10px) brightness(1.8); }\n}\n@keyframes pptx-tr-warp-reverse-in {\n\t0% { transform: scale(3.2); opacity: 0; filter: blur(14px) brightness(2.2); }\n\t50% { transform: scale(1.7); opacity: 0.7; filter: blur(6px) brightness(1.5); }\n\t100% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n}\n@keyframes pptx-tr-warp-reverse-out {\n\t0% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n\t50% { transform: scale(1.7); opacity: 0.7; filter: blur(6px) brightness(1.5); }\n\t100% { transform: scale(3.2); opacity: 0; filter: blur(14px) brightness(2.2); }\n}\n\n\n/* ── WheelReverse (reverse wheel rotation) ───────────────────────── */\n@keyframes pptx-tr-wheel-reverse-in {\n\tfrom { clip-path: circle(0% at 50% 50%); transform: rotate(180deg); }\n\tto { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }\n}\n\n/* ── Window (scale from center with border) ──────────────────────────\n Same measured horz/vert meaning as Doors above (horz = horizontal split\n line opening vertically; vert = vertical split line opening horizontally). */\n@keyframes pptx-tr-window-horz {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-vert {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-out {\n\tfrom { opacity: 1; transform: scale(1); }\n\tto { opacity: 0; transform: scale(0.9); }\n}\n\n\n@keyframes pptx-tr-vortex-in-left { from { transform: translateX(-40%) rotate(720deg) scale(0); opacity: 0; } to { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-vortex-out-left { from { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateX(-40%) rotate(-720deg) scale(0); opacity: 0; } }\n@keyframes pptx-tr-vortex-in-right { from { transform: translateX(40%) rotate(-720deg) scale(0); opacity: 0; } to { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-vortex-out-right { from { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateX(40%) rotate(720deg) scale(0); opacity: 0; } }\n@keyframes pptx-tr-vortex-in-up { from { transform: translateY(-40%) rotate(720deg) scale(0); opacity: 0; } to { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-vortex-out-up { from { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateY(-40%) rotate(-720deg) scale(0); opacity: 0; } }\n@keyframes pptx-tr-vortex-in-down { from { transform: translateY(40%) rotate(-720deg) scale(0); opacity: 0; } to { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-vortex-out-down { from { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateY(40%) rotate(720deg) scale(0); opacity: 0; } }\n\n\n@keyframes pptx-tr-ripple-in-lu { from { clip-path: circle(0% at 0% 0%); opacity: 0.5; } 30% { clip-path: circle(20% at 0% 0%); opacity: 0.7; } 60% { clip-path: circle(55% at 0% 0%); opacity: 0.9; } to { clip-path: circle(150% at 0% 0%); opacity: 1; } }\n@keyframes pptx-tr-ripple-in-ru { from { clip-path: circle(0% at 100% 0%); opacity: 0.5; } 30% { clip-path: circle(20% at 100% 0%); opacity: 0.7; } 60% { clip-path: circle(55% at 100% 0%); opacity: 0.9; } to { clip-path: circle(150% at 100% 0%); opacity: 1; } }\n@keyframes pptx-tr-ripple-in-ld { from { clip-path: circle(0% at 0% 100%); opacity: 0.5; } 30% { clip-path: circle(20% at 0% 100%); opacity: 0.7; } 60% { clip-path: circle(55% at 0% 100%); opacity: 0.9; } to { clip-path: circle(150% at 0% 100%); opacity: 1; } }\n@keyframes pptx-tr-ripple-in-rd { from { clip-path: circle(0% at 100% 100%); opacity: 0.5; } 30% { clip-path: circle(20% at 100% 100%); opacity: 0.7; } 60% { clip-path: circle(55% at 100% 100%); opacity: 0.9; } to { clip-path: circle(150% at 100% 100%); opacity: 1; } }\n\n\n@keyframes pptx-tr-glitter-diamond-in-l { from { opacity: 0; transform: translateX(-6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateX(-2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0); } }\n@keyframes pptx-tr-glitter-diamond-in-r { from { opacity: 0; transform: translateX(6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateX(2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0); } }\n@keyframes pptx-tr-glitter-diamond-in-u { from { opacity: 0; transform: translateY(-6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateY(-2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0); } }\n@keyframes pptx-tr-glitter-diamond-in-d { from { opacity: 0; transform: translateY(6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateY(2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0); } }\n@keyframes pptx-tr-glitter-hexagon-in-l { from { opacity: 0; transform: translateX(-6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateX(-2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }\n@keyframes pptx-tr-glitter-hexagon-in-r { from { opacity: 0; transform: translateX(6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateX(2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }\n@keyframes pptx-tr-glitter-hexagon-in-u { from { opacity: 0; transform: translateY(-6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateY(-2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }\n@keyframes pptx-tr-glitter-hexagon-in-d { from { opacity: 0; transform: translateY(6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateY(2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }\n";
13702
- //#endregion
13703
- //#region src/render/p14-transition-css.d.ts
13704
- /**
13705
- * Return CSS animation descriptors for p14 transition types. Returns
13706
- * `undefined` when the type is not a p14 transition.
13707
- */
13708
- declare function getP14TransitionAnimations(type: PptxTransitionType, durationMs: number, direction: string | undefined, orient?: string | undefined, pattern?: string | undefined): SlideTransitionAnimations | undefined;
13709
- /**
13710
- * A font supplied by the host application. The package never ships fonts:
13711
- * applications provide a licensed URL, data URL, or blob URL for their users.
13712
- */
13713
- interface ViewerFontSource {
13714
- family: string;
13715
- src: string;
13716
- format?: 'truetype' | 'opentype' | 'woff' | 'woff2';
13717
- weight?: string | number;
13718
- style?: 'normal' | 'italic';
13719
- }
13720
- interface SlideSizeEmu {
13721
- widthEmu: number;
13722
- heightEmu: number;
13723
- /** ST_SlideSizeType token, or `''` for a size with no preset. */
13724
- type: string;
13725
- }
13726
- //#endregion
13727
- //#region src/render/presentation-file-kinds.d.ts
13728
- /**
13729
- * presentation-file-kinds: the one place that answers "can the viewer open
13730
- * this file?" and "what should the saved copy be called?".
13731
- *
13732
- * ## Why this is a shared decision and not five allow-lists
13733
- *
13734
- * The loader reads more formats than any single UI advertises. Legacy binary
13735
- * `.ppt` (PowerPoint 97-2003) is the sharp example: `PptxHandler.load()` has
13736
- * detected the OLE compound-file container and converted the binary deck
13737
- * through the regular pptx pipeline for some time, but the product kept saying
13738
- * it was unsupported, and a picker that filters the extension out makes a
13739
- * working loader unreachable in practice. Whenever the loader learns a format,
13740
- * exactly one list has to change.
13741
- *
13742
- * ## Read many, write several
13743
- *
13744
- * Input is a superset of output. We READ `.pptx`, `.ppsx`, `.pptm`, `.potx`,
13745
- * legacy binary `.ppt` and portable `pptx-viewer-json`; we WRITE the OpenXML
13746
- * family plus legacy binary `.ppt` (via `packages/core/src/core/ppt/writer/`,
13747
- * a real MS-PPT/OLE2 encoder, not a stub). `savedPresentationFileName`
13748
- * REPLACES the source extension with the extension of the format actually
13749
- * being written rather than keeping the source's: a deck opened as
13750
- * `report.pptx` and saved back as `.ppt` (or vice versa) must have its name
13751
- * agree with its bytes, which is the kind of mismatch PowerPoint itself
13752
- * refuses to open.
13753
- *
13754
- * This module deliberately imports nothing, so any layer (render, export, a
13755
- * binding, a host app) can depend on it without risking an import cycle.
13756
- *
13757
- * @module render/presentation-file-kinds
13758
- */
13696
+ //#region src/render/backstage-cards.d.ts
13759
13697
  /**
13760
- * Extensions the built-in file picker offers, in the order it offers them.
13698
+ * Every action card the File-tab backstage can show, keyed by the operation it
13699
+ * triggers rather than by its wording.
13761
13700
  *
13762
- * `.ppt` is in the list because the loader genuinely handles it, not as a
13763
- * courtesy: see `packages/core/src/core/ppt/` and the `ppt-import` integration
13764
- * suite, which asserts a `.ppt` loads to the same model as the `.pptx` it was
13765
- * exported from.
13701
+ * The five bindings used to hardcode a title and a body string each, which made
13702
+ * the whole backstage untranslatable and let the copy drift: the same card
13703
+ * carried four different descriptions depending on which binding you opened it
13704
+ * in. Both halves now live here as a dictionary key plus an English fallback,
13705
+ * so a wording change lands everywhere at once and a translator only has to
13706
+ * translate it once.
13766
13707
  */
13767
- declare const PRESENTATION_OPEN_EXTENSIONS: readonly ['.pptx', '.ppsx', '.pptm', '.potx', '.ppt', '.json'];
13768
- /** Comma-separated `accept` attribute for a presentation file input. */
13769
- declare const PPTX_OPEN_ACCEPT: string;
13708
+ type BackstageCardId = 'protect' | 'inspect' | 'embedFonts' | 'signatures' | 'versionHistory' | 'saveAsPptx' | 'saveAsPpsx' | 'saveAsPptm' | 'saveAsPpt' | 'pdf' | 'png' | 'video' | 'gif' | 'json' | 'copyImage' | 'print' | 'share';
13709
+ //#endregion
13710
+ //#region src/render/toolbar-actions.d.ts
13770
13711
  /**
13771
- * True when a picked / dropped file's name looks like something the loader can
13772
- * open. Use this instead of a hand-rolled `endsWith` chain: a drop handler that
13773
- * disagrees with the picker's `accept` list is a format that is supported by
13774
- * mouse but not by drag, which is how `.ppt` stayed invisible.
13712
+ * Toolbar action / ribbon-tab visibility: a single, framework-agnostic
13713
+ * catalogue of every top-level toolbar button and ribbon tab a host app can
13714
+ * independently hide. Each binding exposes a `hiddenActions?: ToolbarActionId[]`
13715
+ * prop, threads it down to the relevant render sites, and gates them with
13716
+ * `isActionHidden`. Default (`undefined` / `[]`) hides nothing, matching
13717
+ * today's always-visible behaviour.
13775
13718
  *
13776
- * Extension-only, by design. The real answer comes from the container sniff in
13777
- * `PptxHandler.load()`; this is only the cheap pre-filter a drop target needs
13778
- * before it hands bytes to the loader.
13719
+ * `TOOLBAR_TABS` is also the canonical ribbon-tab list/order, replacing the
13720
+ * copy hand-duplicated in each binding (React's `TOOLBAR_SECTIONS`, Vue's
13721
+ * `ribbon-constants.ts`, Angular's `RIBBON_TABS`, etc.) so the tab set can't
13722
+ * drift between bindings. Per-tab icons stay in each binding (icon libraries
13723
+ * differ per framework); only id + i18n key + order are shared here.
13779
13724
  */
13780
- declare function isSupportedPresentationFile(name: string | null | undefined): boolean;
13781
13725
  /**
13782
- * True for the binary PowerPoint 97-2003 family. `.ppt` itself is now also a
13783
- * SAVE target (see {@link SavedPresentationFormat}); `.pps`/`.pot` (97-2003
13784
- * show/template) remain read-only siblings sharing the same record format.
13726
+ * A single toolbar button/control that can be hidden independently of the
13727
+ * ribbon tab it may also appear inside. `zoom` and `navigation` each cover a
13728
+ * whole control cluster (zoom in/out/fit, prev/next) rather than each button
13729
+ * in it, matching how hosts actually want to hide/keep them as a unit.
13785
13730
  */
13786
- declare function isLegacyBinaryPresentation(name: string | null | undefined): boolean;
13787
- /** The formats the save path can produce. */
13788
- type SavedPresentationFormat = 'pptx' | 'ppsx' | 'pptm' | 'ppt';
13731
+ type ToolbarButtonId = 'share' | 'broadcast' | 'export' | 'undo' | 'redo' | 'record' | 'notes' | 'fullscreen' | 'zoom' | 'navigation' | 'mergeShapes' | 'crop';
13732
+ /** 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. */
13733
+ type ToolbarTabId = 'file' | 'home' | 'insert' | 'draw' | 'design' | 'transitions' | 'animations' | 'slideShow' | 'record' | 'review' | 'view' | 'help';
13734
+ type ToolbarActionId = ToolbarButtonId | ToolbarTabId;
13789
13735
  /**
13790
- * The stem of a presentation file name: directories and any loadable extension
13791
- * removed. `C:\decks\report.ppt` becomes `report`; a name with no recognised
13792
- * extension is kept whole, so `Untitled Presentation` survives intact rather
13793
- * than losing everything after its last dot.
13736
+ * PowerPoint's contextual tabs: they join the tab row only while the
13737
+ * selection is of their kind (see `contextualTabsForElement` in
13738
+ * `ribbon-galleries/`). Kept apart from `ToolbarTabId` because they are not
13739
+ * part of the fixed tab order every binding renders.
13794
13740
  */
13795
- declare function presentationBaseName(sourceName: string | null | undefined, fallback?: string): string;
13741
+ type RibbonContextualTabId = 'shapeFormat' | 'pictureFormat' | 'tableDesign' | 'chartDesign' | 'smartArtDesign';
13742
+ //#endregion
13743
+ //#region src/render/canvas-context-menu-commands.d.ts
13796
13744
  /**
13797
- * The name a saved copy should be offered under: the source stem plus the
13798
- * extension of the format actually being written.
13745
+ * The right-click menu for the empty slide canvas (no element under the
13746
+ * cursor), as distinct from {@link ./context-menu-commands}'s per-element menu.
13799
13747
  *
13800
- * This is what turns `report.ppt` into `report.pptx` on a regular Save As,
13801
- * and `report.pptx` into `report.ppt` when the user explicitly picks the
13802
- * PowerPoint 97-2003 format. Keeping the source extension would mislabel the
13803
- * bytes either way.
13748
+ * Right-clicking empty canvas used to do nothing at all in every binding: React
13749
+ * and Vue both bailed out early (`getElementIdFromEvent` returns `null`, so the
13750
+ * handler just returns) rather than opening a menu, and the other three never
13751
+ * wired a handler for it either. PowerPoint offers Paste, Layout, Reset,
13752
+ * Format Background and view toggles (Grid and Guides, Ruler) from this menu;
13753
+ * this module is the one list every binding renders instead of five omissions.
13754
+ *
13755
+ * @module render/canvas-context-menu-commands
13804
13756
  */
13805
- declare function savedPresentationFileName(sourceName: string | null | undefined, format?: SavedPresentationFormat): string;
13757
+ /** Every command the empty-canvas context menu can offer, in no particular order. */
13758
+ type CanvasContextMenuCommandId = 'paste' | 'layout' | 'reset-slide' | 'format-background' | 'grid-and-guides' | 'ruler';
13806
13759
  //#endregion
13807
- //#region src/render/session-restore.d.ts
13760
+ //#region src/render/merge-shapes/merge-shapes-menu.d.ts
13761
+ /** The right-click command id for each operation. */
13762
+ type MergeShapesCommandId = 'merge-union' | 'merge-combine' | 'merge-fragment' | 'merge-intersect' | 'merge-subtract';
13763
+ /** Every command a canvas context menu can offer, in no particular order. */
13764
+ 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';
13765
+ /** Every command the Edit Points right-click menu can offer. */
13766
+ type EditPointsCommandId = 'add-point' | 'delete-point' | 'delete-segment' | 'open-path' | 'close-path' | 'smooth-point' | 'straight-point' | 'corner-point' | 'straight-segment' | 'curved-segment' | 'exit';
13767
+ //#endregion
13768
+ //#region src/render/edit-points/freeform-tool-geometry.d.ts
13769
+ /** The two click-to-place drawing tools. */
13770
+ type FreeformToolKind = 'freeformShape' | 'curve';
13771
+ //#endregion
13772
+ //#region src/render/editor-keymap.d.ts
13773
+ /** A logical editor command produced by one key press. */
13774
+ 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';
13775
+ //#endregion
13776
+ //#region src/render/options/viewer-options.d.ts
13808
13777
  /**
13809
- * session-restore: keep the deck a host app has open across a page refresh.
13810
- *
13811
- * A host (the demo apps, or any embedder) owns the bytes it hands to the
13812
- * viewer, so a plain reload drops them and the user lands back on the file
13813
- * dropzone with their presentation gone. This store remembers the open deck in
13814
- * IndexedDB and hands it back on the next load.
13815
- *
13816
- * Scope is deliberately per-tab: the record is keyed by an id kept in
13817
- * `sessionStorage`, which survives a reload but NOT a new tab. Refreshing
13818
- * restores the deck this tab had open, while a second tab opened on the same
13819
- * origin still starts on the landing page, and two tabs holding different decks
13820
- * never steal each other's content.
13821
- *
13822
- * `restoreSessionDeck` additionally prefers a NEWER autosave snapshot for the
13823
- * same file (see `./autosave-store`), so a refresh mid-edit comes back with the
13824
- * edited deck rather than the pristine bytes that were first opened.
13778
+ * Full PowerPoint "File > Options" parity model.
13825
13779
  *
13826
- * Every operation is best-effort: a blocked IndexedDB, a partitioned
13827
- * `sessionStorage`, or an exhausted quota degrades to "no restore", never to a
13828
- * thrown error in the host.
13780
+ * Groups mirror the ten categories of PowerPoint's Options dialog. Values are
13781
+ * flat primitives per group so the dialog panes can be rendered generically
13782
+ * from `VIEWER_OPTIONS_SCHEMA` in every binding. The legacy six-toggle
13783
+ * `ViewerPreferences` surface stays supported via the mapping helpers below.
13829
13784
  */
13830
- /** A deck remembered for the current tab. */
13831
- interface SessionDeck {
13832
- /** File name the deck was opened under, used as the autosave key. */
13833
- fileName: string;
13834
- /** The presentation bytes. */
13835
- data: Uint8Array;
13836
- /** When these bytes were remembered (epoch ms). */
13837
- timestamp: number;
13785
+ type ScreenTipStyle = 'descriptions' | 'plain' | 'off';
13786
+ type DisplayOptimization = 'appearance' | 'compatibility';
13787
+ type ImageResolutionPreset = 'highFidelity' | 'ppi330' | 'ppi220' | 'ppi150' | 'ppi96';
13788
+ type OpenDocumentsView = 'savedView' | 'normal' | 'outline' | 'slideSorter' | 'notes';
13789
+ type DefaultExportFormat = 'pptx' | 'pdf' | 'png';
13790
+ type QuickAccessPosition = 'above' | 'below';
13791
+ type FeedbackSoundScheme = 'modern' | 'classic';
13792
+ type OptionsPrintWhat = 'slides' | 'handouts' | 'notes' | 'outline';
13793
+ type OptionsPrintColorMode = 'color' | 'grayscale' | 'blackAndWhite';
13794
+ interface ViewerGeneralOptions {
13795
+ displayOptimization: DisplayOptimization;
13796
+ showMiniToolbar: boolean;
13797
+ enableLivePreview: boolean;
13798
+ collapseRibbonAutomatically: boolean;
13799
+ collapseSearchByDefault: boolean;
13800
+ screenTipStyle: ScreenTipStyle;
13801
+ userName: string;
13802
+ userInitials: string;
13803
+ showStartScreen: boolean;
13804
+ /**
13805
+ * Lets the user hand a local font file to the viewer so decks authored
13806
+ * with a font the browser lacks render with the real face.
13807
+ *
13808
+ * Off by default. The registration reads a file the user picks and adds it
13809
+ * to the page's font set for the session, which is a capability a host
13810
+ * embedding the viewer should opt into rather than inherit.
13811
+ */
13812
+ enableCustomFontUpload: boolean;
13813
+ }
13814
+ interface ViewerProofingOptions {
13815
+ autoCorrectTwoInitialCapitals: boolean;
13816
+ autoCorrectCapitalizeFirstLetter: boolean;
13817
+ autoCorrectCapitalizeDayNames: boolean;
13818
+ autoCorrectSmartQuotes: boolean;
13819
+ autoCorrectHyphensToDash: boolean;
13820
+ autoCorrectFractions: boolean;
13821
+ autoCorrectOrdinals: boolean;
13822
+ ignoreUppercase: boolean;
13823
+ ignoreWordsWithNumbers: boolean;
13824
+ ignoreInternetAddresses: boolean;
13825
+ flagRepeatedWords: boolean;
13826
+ checkSpellingAsYouType: boolean;
13827
+ hideSpellingErrors: boolean;
13838
13828
  }
13839
13829
  /**
13840
- * This tab's session id, or `null` when `sessionStorage` is unavailable (a
13841
- * sandboxed iframe, or a browser with storage disabled).
13830
+ * File > Options > Save.
13842
13831
  *
13843
- * @param create Mint and persist an id when the tab does not have one yet.
13844
- * Reads pass `false` so a fresh tab never claims another tab's record.
13845
- */
13846
- declare function getSessionTabId(create?: boolean): string | null;
13847
- /**
13848
- * Remember `data` as the deck this tab has open, so the next load can restore
13849
- * it. Resolves `false` when the browser refused to store it; callers treat that
13850
- * as "no restore available later", never as an error.
13851
- */
13852
- declare function rememberSessionDeck(fileName: string, data: Uint8Array): Promise<boolean>;
13853
- /** The deck remembered for this tab, or `null` when there is nothing to restore. */
13854
- declare function loadSessionDeck(): Promise<SessionDeck | null>;
13855
- /** Forget this tab's deck (the host closed it, or handed the tab to another flow). */
13856
- declare function forgetSessionDeck(): Promise<void>;
13857
- /**
13858
- * The deck to reopen on load: this tab's remembered bytes, upgraded to a newer
13859
- * autosave snapshot of the same file when the viewer wrote one after they were
13860
- * remembered. Without that upgrade a refresh mid-edit would silently roll the
13861
- * presentation back to the state it was opened in.
13832
+ * Font embedding deliberately has NO entry here. It is owned by the File >
13833
+ * Fonts panel, whose toggle is the one the save path reads (see
13834
+ * `render/font-embedding`: `describeFontEmbedding` decides the toggle's start
13835
+ * position and whether it can do anything at all, `embeddedFontSaveOptions`
13836
+ * turns it into the `PptxHandler.save()` slice). This group used to carry a
13837
+ * second `embedFonts` boolean, plus an `embedAllFontCharacters` companion, and
13838
+ * neither was read by anything: the pane moved a switch that changed no saved
13839
+ * byte, while the panel next door moved the real one. Two switches for one
13840
+ * setting, one of them lying, is worse than one switch in a less
13841
+ * PowerPoint-shaped place.
13862
13842
  */
13863
- declare function restoreSessionDeck(): Promise<SessionDeck | null>;
13864
- /** Optional seed values for the share start form. */
13865
- interface ShareDefaults {
13866
- roomId?: string;
13867
- userName?: string;
13868
- serverUrl?: string;
13843
+ interface ViewerSaveOptions {
13844
+ autoSave: boolean;
13845
+ autoRecoverIntervalMinutes: number;
13846
+ keepLastAutoRecoveredVersion: boolean;
13847
+ defaultExportFormat: DefaultExportFormat;
13848
+ cacheRetentionDays: number;
13849
+ clearCacheOnClose: boolean;
13869
13850
  }
13870
- //#endregion
13871
- //#region src/render/presentation-session-types.d.ts
13872
- interface PresentationSnapshot {
13873
- slideIndex: number;
13874
- buildStep: number;
13875
- sequence: number;
13876
- blackout: 'none' | 'black' | 'white';
13877
- paused: boolean;
13878
- elapsedMs: number;
13879
- zoom?: PresentationZoomState;
13880
- pointer?: PresentationPointerState;
13881
- inkStrokes?: PresentationInkStroke[];
13851
+ interface ViewerAccessibilityOptions {
13852
+ /** Browser speech-recognition language; automatic follows the browser language. */
13853
+ subtitleLanguage?: string;
13854
+ showAccessibilityStatus: boolean;
13855
+ feedbackWithSound: boolean;
13856
+ soundScheme: FeedbackSoundScheme;
13857
+ showShortcutKeysInScreenTips: boolean;
13858
+ reducedMotion: boolean;
13859
+ }
13860
+ interface ViewerAdvancedOptions {
13861
+ autoSelectEntireWord: boolean;
13862
+ allowTextDragAndDrop: boolean;
13863
+ maximumUndoSteps: number;
13864
+ useSmartCutAndPaste: boolean;
13865
+ showPasteOptionsButton: boolean;
13866
+ imageDefaultResolution: ImageResolutionPreset;
13867
+ doNotCompressImages: boolean;
13868
+ chartPropertiesFollowDataPoint: boolean;
13869
+ recentPresentationsCount: number;
13870
+ showVerticalRuler: boolean;
13871
+ showGrid: boolean;
13872
+ snapToGrid: boolean;
13873
+ disableHardwareAcceleration: boolean;
13882
13874
  /**
13883
- * Whether ink markup is drawn (PowerPoint's Ctrl+M). Undefined means visible,
13884
- * so existing snapshots keep showing their ink. Hiding never discards the
13885
- * strokes, which stay in `inkStrokes` and can be kept on exit.
13875
+ * Force every opt-in interactive 3D scene (SmartArt, bar/line/area/pie/
13876
+ * surface charts) to fall back to its flat 2D rendering, even when the
13877
+ * host has enabled that scene via its own `smartArt3D`/`*Chart3D` prop.
13878
+ * A host opting in says "this deck may want 3D"; this is the viewer
13879
+ * user's own override for when the WebGL scenes it renders are too much
13880
+ * for their machine. See `resolve3DRenderingFlags`.
13886
13881
  */
13887
- inkMarkupVisible?: boolean;
13888
- caption?: string;
13889
- subtitlesVisible?: boolean;
13882
+ disable3DRendering: boolean;
13883
+ /**
13884
+ * `p:animEffect/@filter="pixelate"` defaults to snapping the element to
13885
+ * its end state (`cutIn`/`cutOut`), matching PowerPoint's own behaviour
13886
+ * (COM `CreateVideo` frame-diffing shows PowerPoint performs no animation
13887
+ * at all for this filter value). This turns on the blocky mosaic reveal
13888
+ * this renderer can build instead, for a viewer that would rather show
13889
+ * something animating than PowerPoint's own instant swap. See
13890
+ * `resolveFilterEffect` in `animation-filter-effects.ts` and
13891
+ * `docs/guide/visual-effects.md`.
13892
+ */
13893
+ pixelateMosaicAnimation: boolean;
13894
+ openDocumentsView: OpenDocumentsView;
13895
+ slideShowShowMenuOnRightClick: boolean;
13896
+ slideShowShowPopupToolbar: boolean;
13897
+ slideShowPromptKeepInkAnnotations: boolean;
13898
+ slideShowEndWithBlackSlide: boolean;
13899
+ printInBackground: boolean;
13900
+ printHighQuality: boolean;
13901
+ printUseMostRecentSettings: boolean;
13902
+ printWhat: OptionsPrintWhat;
13903
+ printColorMode: OptionsPrintColorMode;
13904
+ printHiddenSlides: boolean;
13905
+ printScaleToFit: boolean;
13906
+ printFrameSlides: boolean;
13890
13907
  }
13891
- interface PresentationZoomState {
13892
- scale: number;
13893
- originX: number;
13894
- originY: number;
13908
+ interface ViewerRibbonOptions {
13909
+ /** Ribbon tabs unticked in Customize Ribbon. The File tab can never be hidden. */
13910
+ hiddenTabIds: ToolbarTabId[];
13895
13911
  }
13896
- type PresentationPointerTool = 'none' | 'laser' | 'pen' | 'highlighter' | 'eraser';
13897
- interface PresentationPointerState {
13898
- tool: PresentationPointerTool;
13899
- x: number;
13900
- y: number;
13901
- color: string;
13912
+ interface ViewerQuickAccessOptions {
13913
+ visible: boolean;
13914
+ position: QuickAccessPosition;
13915
+ showCommandLabels: boolean;
13916
+ /** Ordered ids from `QUICK_ACCESS_COMMAND_CATALOG`. */
13917
+ commandIds: string[];
13902
13918
  }
13903
- interface PresentationInkPoint {
13904
- x: number;
13905
- y: number;
13919
+ interface ViewerTrustOptions {
13920
+ openInProtectedView: boolean;
13921
+ allowExternalContent: boolean;
13922
+ confirmExternalHyperlinks: boolean;
13906
13923
  }
13907
- interface PresentationInkStroke {
13908
- id: string;
13909
- slideIndex: number;
13910
- tool: 'pen' | 'highlighter';
13911
- color: string;
13912
- width: number;
13913
- points: PresentationInkPoint[];
13924
+ interface ViewerOptions {
13925
+ general: ViewerGeneralOptions;
13926
+ proofing: ViewerProofingOptions;
13927
+ save: ViewerSaveOptions;
13928
+ accessibility: ViewerAccessibilityOptions;
13929
+ advanced: ViewerAdvancedOptions;
13930
+ ribbon: ViewerRibbonOptions;
13931
+ quickAccess: ViewerQuickAccessOptions;
13932
+ trust: ViewerTrustOptions;
13914
13933
  }
13915
- declare function parsePresentationSessionId(hash: string): string | null;
13916
- declare function loadPresentationDeck(sessionId: string): Promise<Uint8Array | null>;
13917
- //#endregion
13918
- //#region src/render/presentation-blackboard.d.ts
13919
- /** Blackout state, as carried by {@link PresentationSnapshot}. */
13920
- type PresentationBlackout = PresentationSnapshot['blackout'];
13921
- //#endregion
13922
- //#region src/render/editor-keymap.d.ts
13923
- /** A logical editor command produced by one key press. */
13924
- 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';
13925
- //#endregion
13926
- //#region src/render/merge-shapes/merge-shapes-menu.d.ts
13927
- /** The right-click command id for each operation. */
13928
- type MergeShapesCommandId = 'merge-union' | 'merge-combine' | 'merge-fragment' | 'merge-intersect' | 'merge-subtract';
13929
- /** Every command a canvas context menu can offer, in no particular order. */
13930
- 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';
13934
+ type ViewerOptionsGroupId = keyof ViewerOptions;
13935
+ type ViewerOptionPrimitive = boolean | number | string;
13931
13936
  //#endregion
13932
- //#region src/render/canvas-context-menu-commands.d.ts
13937
+ //#region src/render/options/viewer-options-controls.d.ts
13933
13938
  /**
13934
- * The right-click menu for the empty slide canvas (no element under the
13935
- * cursor), as distinct from {@link ./context-menu-commands}'s per-element menu.
13936
- *
13937
- * Right-clicking empty canvas used to do nothing at all in every binding: React
13938
- * and Vue both bailed out early (`getElementIdFromEvent` returns `null`, so the
13939
- * handler just returns) rather than opening a menu, and the other three never
13940
- * wired a handler for it either. PowerPoint offers Paste, Layout, Reset,
13941
- * Format Background and view toggles (Grid and Guides, Ruler) from this menu;
13942
- * this module is the one list every binding renders instead of five omissions.
13943
- *
13944
- * @module render/canvas-context-menu-commands
13939
+ * Control/section/tab descriptor types for the File > Options schema, plus
13940
+ * the terse constructors the tab-definition modules build panes with.
13945
13941
  */
13946
- /** Every command the empty-canvas context menu can offer, in no particular order. */
13947
- type CanvasContextMenuCommandId = 'paste' | 'layout' | 'reset-slide' | 'format-background' | 'grid-and-guides' | 'ruler';
13948
- //#endregion
13949
- //#region src/render/paste-special.d.ts
13950
- /** The four paste formats PowerPoint's Paste Options / Paste Special offer. */
13951
- type PasteSpecialFormat = 'keep-source-formatting' | 'use-destination-theme' | 'picture' | 'keep-text-only';
13942
+ type ViewerOptionsTabId = 'general' | 'proofing' | 'save' | 'language' | 'accessibility' | 'advanced' | 'ribbon' | 'quickAccess' | 'addIns' | 'trust';
13952
13943
  //#endregion
13953
- //#region src/render/alignment-guides.d.ts
13954
- /** A single alignment guide, positioned in authored slide pixels. */
13955
- interface Guide {
13956
- id: string;
13957
- axis: 'h' | 'v';
13958
- position: number;
13944
+ //#region src/render/customization/host-menu-commands.d.ts
13945
+ /** Snapshot of the slide on which the host command was offered. */
13946
+ interface HostCanvasMenuContext {
13947
+ slideIndex: number;
13959
13948
  }
13960
- //#endregion
13961
- //#region src/render/ink-drawing.d.ts
13962
- /** A 2D point in stage-local coordinates. */
13963
- interface InkPoint {
13964
- x: number;
13965
- y: number;
13966
- /**
13967
- * Pointer pressure at this point, from `PointerEvent.pressure` (0..1).
13968
- * Optional: a binding that has not wired pressure capture simply omits
13969
- * it, and {@link strokeToInkElement} falls back to
13970
- * {@link DEFAULT_POINTER_PRESSURE}, the constant value mice and other
13971
- * non-pressure-aware devices report, which reads as "no real pressure
13972
- * data".
13973
- */
13974
- pressure?: number;
13975
- /**
13976
- * Pen-tilt lean, in degrees, from `PointerEvent.tiltX`/`tiltY` on
13977
- * supporting hardware (a mouse, or a stylus with no tilt sensor, reports a
13978
- * constant 0). Optional and always captured as a pair: a binding that has
13979
- * not wired tilt capture simply omits both, and {@link strokeToInkElement}
13980
- * treats a constant `(0, 0)` reading the same way it treats a constant
13981
- * pressure, i.e. as "no real tilt data" rather than authoring a channel
13982
- * for it.
13983
- */
13984
- tiltX?: number;
13985
- tiltY?: number;
13949
+ /** Effective selection, including a single right-clicked element. */
13950
+ interface HostElementMenuContext extends HostCanvasMenuContext {
13951
+ elementIds: readonly string[];
13986
13952
  }
13987
- /** Options for {@link strokeToInkElement}. */
13988
- interface StrokeToInkElementOpts {
13989
- points: InkPoint[];
13990
- color: string;
13991
- width: number;
13992
- tool: 'pen' | 'highlighter' | 'freeform';
13953
+ /** Plain text labels work identically in every framework. */
13954
+ interface HostMenuCommand<C> {
13955
+ id: string;
13956
+ label: string;
13957
+ /** Default: a separate group above the built-in commands. */
13958
+ group?: 'top' | 'bottom';
13959
+ disabled?: boolean | ((context: C) => boolean);
13960
+ onSelect: (context: C) => void;
13993
13961
  }
13994
13962
  //#endregion
13995
- //#region src/render/mobile-chrome.d.ts
13996
- /**
13997
- * Pure helper logic for mobile chrome state, shared by every binding.
13998
- *
13999
- * These helpers capture the sheet open/close state machine that governs which
14000
- * sheet is visible at any given time and which bottom-bar button appears active.
14001
- * Keeping this logic as pure functions makes it straightforward to test and
14002
- * trivial to adapt when each binding wires the components together.
14003
- */
14004
- /** All mobile sheets that can be open at one time. */
14005
- type MobileSheetKey = 'slides' | 'menu' | 'insert' | 'inspector' | 'comments' | 'notes' | null;
14006
- //#endregion
14007
- //#region src/render/gradient-picker.d.ts
14008
- /** A single gradient stop, mirroring the ShapeStyle array item shape. */
14009
- interface GradientStop {
14010
- color: string;
14011
- position: number;
14012
- opacity?: number;
14013
- /**
14014
- * Theme colour identity for this stop, mirroring
14015
- * `ShapeStyle.fillColorRef`. Set by a theme-swatch pick so the stop keeps
14016
- * following the theme after a later theme change; cleared by a custom hex
14017
- * pick, which has no theme identity.
14018
- */
14019
- colorRef?: PptxThemeColorRef;
14020
- }
14021
- /** The editable gradient state surfaced to the component. */
14022
- interface GradientState {
14023
- type: 'linear' | 'radial';
14024
- /** Angle in degrees (only meaningful for linear). */
14025
- angle: number;
14026
- stops: GradientStop[];
14027
- }
14028
- //#endregion
14029
- //#region src/render/insert-chart.d.ts
14030
- /**
14031
- * Dropdown ids for the insert-chart menu. Distinct from `PptxChartType`
14032
- * because PowerPoint offers Column (vertical) and Bar (horizontal) as two
14033
- * entries over the same underlying `'bar'` chart type, and because `'pareto'`
14034
- * has no `PptxChartType` of its own: it is a dropdown entry that resolves to
14035
- * `type: 'histogram'` (see docs/guide/limitations.md's ChartEx row) with a
14036
- * frequency-plus-cumulative-percentage default shape. The other six ChartEx
14037
- * ids (`histogram` through `regionMap`) map one-to-one onto their chart type.
14038
- */
14039
- type InsertChartKind = 'column' | 'bar' | 'line' | 'pie' | 'doughnut' | 'area' | 'scatter' | 'histogram' | 'pareto' | 'funnel' | 'treemap' | 'sunburst' | 'boxWhisker' | 'regionMap';
14040
- /** In-memory clipboard payload stored when an element is copied or cut. */
14041
- interface ElementClipboardPayload {
14042
- element: PptxElement;
14043
- isTemplate: boolean;
14044
- }
14045
- //#endregion
14046
- //#region src/render/image-file-insertion.d.ts
14047
- /**
14048
- * Decode a local image File/Blob into a centred element, fitting the slide
14049
- * without upscaling. Dimensions are slide pixels; image bytes are preserved.
14050
- *
14051
- * Resolves null for unsupported/unreadable images, invalid bounds, cancellation,
14052
- * or unavailable browser APIs. Importing this module is safe outside a browser.
14053
- * No slide, selection, history, clipboard, or network state is changed. The
14054
- * caller must still validate its document/slide destination before committing.
14055
- */
14056
- declare function createImageElementFromFile(file: Blob, canvasSize: CanvasSize, signal?: AbortSignal): Promise<ImagePptxElement | null>;
14057
- //#endregion
14058
- //#region src/render/shape-preset-catalog.d.ts
14059
- /**
14060
- * shape-preset-catalog.ts: the Insert > Shape picker catalogue shared by every
14061
- * binding's toolbar/inspector.
14062
- *
14063
- * Pure data: each entry carries the preset geometry `type` (OOXML `a:prstGeom`
14064
- * value the editor can insert), an English fallback `label`, the shared-i18n
14065
- * `i18nKey`, and a framework-neutral icon descriptor ({@link ShapePresetGlyph}
14066
- * name + optional utility-class modifier for rotation/skew). Each binding maps
14067
- * the glyph name onto its own icon component/SVG.
14068
- *
14069
- * Order matters: bindings surface the first 12 entries as the quick "top
14070
- * shapes" row, so new presets should be appended, not inserted.
14071
- *
14072
- * @module render/shape-preset-catalog
14073
- */
14074
- /** Shape preset geometry types offered by the insert picker. */
14075
- type ShapePresetType = 'rect' | 'roundRect' | 'ellipse' | 'cylinder' | 'rtArrow' | 'leftArrow' | 'upArrow' | 'downArrow' | 'triangle' | 'rtTriangle' | 'diamond' | 'parallelogram' | 'trapezoid' | 'pentagon' | 'hexagon' | 'octagon' | 'chevron' | 'star5' | 'star6' | 'star8' | 'plus' | 'heart' | 'cloud' | 'sun' | 'moon' | 'pie' | 'plaque' | 'teardrop' | 'line' | 'connector';
14076
- //#endregion
14077
- //#region src/render/zoom-return-navigation.d.ts
14078
- /**
14079
- * The navigation-relevant fields of a Zoom click target, independent of
14080
- * `zoomType`.
14081
- *
14082
- * `returnToParent` is already resolved to its EFFECTIVE value here (not the
14083
- * raw, possibly-`undefined` `ZoomPptxElement`/`SummaryZoomTarget` field):
14084
- * `CT_ZoomObjectProperties/@returnToParent` (MS-PPTX) is `<xsd:attribute
14085
- * name="returnToParent" type="xsd:boolean" use="optional" default="true"/>`,
14086
- * so an ABSENT attribute means true, not false. Core deliberately stores
14087
- * `undefined` rather than fabricating `true` (so a round-trip never invents
14088
- * an attribute the source never had), which makes `Boolean(x)` the wrong way
14089
- * to read it; the two `resolve*NavigationTarget` functions below are the only
14090
- * place that distinction should be made.
14091
- */
14092
- interface ZoomNavigationTarget {
14093
- targetSlideIndex: number;
14094
- targetSectionId?: string;
14095
- returnToParent: boolean;
14096
- transitionDurationMs?: number;
14097
- }
14098
- interface AutosaveRecord {
14099
- key: string;
14100
- data: Uint8Array;
14101
- timestamp: number;
14102
- size: number;
14103
- }
14104
- type BackstagePage = 'home' | 'new' | 'open' | 'info' | 'save' | 'saveAs' | 'print' | 'share' | 'export' | 'close' | 'account' | 'options';
14105
- //#endregion
14106
- //#region src/render/backstage-cards.d.ts
14107
- /**
14108
- * Every action card the File-tab backstage can show, keyed by the operation it
14109
- * triggers rather than by its wording.
14110
- *
14111
- * The five bindings used to hardcode a title and a body string each, which made
14112
- * the whole backstage untranslatable and let the copy drift: the same card
14113
- * carried four different descriptions depending on which binding you opened it
14114
- * in. Both halves now live here as a dictionary key plus an English fallback,
14115
- * so a wording change lands everywhere at once and a translator only has to
14116
- * translate it once.
14117
- */
14118
- type BackstageCardId = 'protect' | 'inspect' | 'embedFonts' | 'signatures' | 'versionHistory' | 'saveAsPptx' | 'saveAsPpsx' | 'saveAsPptm' | 'saveAsPpt' | 'pdf' | 'png' | 'video' | 'gif' | 'json' | 'copyImage' | 'print' | 'share';
14119
- //#endregion
14120
- //#region src/render/master-view-crud.d.ts
14121
- /** One Slide Master view sidebar command. */
14122
- type MasterViewCrudActionId = 'addLayout' | 'duplicateLayout' | 'deleteLayout' | 'renameLayout' | 'addMaster' | 'duplicateMaster' | 'deleteMaster' | 'renameMaster';
14123
- /** A framework-neutral descriptor for one sidebar button. */
14124
- interface MasterViewCrudAction {
14125
- id: MasterViewCrudActionId;
14126
- /** i18n key for the button label (`pptx.masterView.<id>`). */
14127
- labelKey: string;
14128
- enabled: boolean;
14129
- /** i18n key explaining why the button is disabled, set only when it is. */
14130
- disabledReasonKey?: string;
14131
- }
14132
- /**
14133
- * Optional hook point for hosts that want to wire a real sign-in flow into
14134
- * File > Account. Disabled by default: the Account page renders nothing
14135
- * extra unless a host explicitly opts in by passing `enabled: true`.
14136
- * See docs/guide for wiring instructions.
14137
- */
14138
- interface AccountAuthConfig {
14139
- enabled: boolean;
14140
- onSignIn: () => void;
14141
- signedInUser?: {
14142
- name: string;
14143
- email?: string;
14144
- avatarUrl?: string;
14145
- };
14146
- }
14147
- //#endregion
14148
- //#region src/render/toolbar-actions.d.ts
14149
- /**
14150
- * Toolbar action / ribbon-tab visibility: a single, framework-agnostic
14151
- * catalogue of every top-level toolbar button and ribbon tab a host app can
14152
- * independently hide. Each binding exposes a `hiddenActions?: ToolbarActionId[]`
14153
- * prop, threads it down to the relevant render sites, and gates them with
14154
- * `isActionHidden`. Default (`undefined` / `[]`) hides nothing, matching
14155
- * today's always-visible behaviour.
14156
- *
14157
- * `TOOLBAR_TABS` is also the canonical ribbon-tab list/order, replacing the
14158
- * copy hand-duplicated in each binding (React's `TOOLBAR_SECTIONS`, Vue's
14159
- * `ribbon-constants.ts`, Angular's `RIBBON_TABS`, etc.) so the tab set can't
14160
- * drift between bindings. Per-tab icons stay in each binding (icon libraries
14161
- * differ per framework); only id + i18n key + order are shared here.
14162
- */
14163
- /**
14164
- * A single toolbar button/control that can be hidden independently of the
14165
- * ribbon tab it may also appear inside. `zoom` and `navigation` each cover a
14166
- * whole control cluster (zoom in/out/fit, prev/next) rather than each button
14167
- * in it, matching how hosts actually want to hide/keep them as a unit.
14168
- */
14169
- type ToolbarButtonId = 'share' | 'broadcast' | 'export' | 'undo' | 'redo' | 'record' | 'notes' | 'fullscreen' | 'zoom' | 'navigation' | 'mergeShapes' | 'crop';
14170
- /** 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. */
14171
- type ToolbarTabId = 'file' | 'home' | 'insert' | 'draw' | 'design' | 'transitions' | 'animations' | 'slideShow' | 'record' | 'review' | 'view' | 'help';
14172
- type ToolbarActionId = ToolbarButtonId | ToolbarTabId;
14173
- /**
14174
- * PowerPoint's contextual tabs: they join the tab row only while the
14175
- * selection is of their kind (see `contextualTabsForElement` in
14176
- * `ribbon-galleries/`). Kept apart from `ToolbarTabId` because they are not
14177
- * part of the fixed tab order every binding renders.
14178
- */
14179
- type RibbonContextualTabId = 'shapeFormat' | 'pictureFormat' | 'tableDesign' | 'chartDesign' | 'smartArtDesign';
14180
- //#endregion
14181
- //#region src/render/options/viewer-options.d.ts
14182
- /**
14183
- * Full PowerPoint "File > Options" parity model.
14184
- *
14185
- * Groups mirror the ten categories of PowerPoint's Options dialog. Values are
14186
- * flat primitives per group so the dialog panes can be rendered generically
14187
- * from `VIEWER_OPTIONS_SCHEMA` in every binding. The legacy six-toggle
14188
- * `ViewerPreferences` surface stays supported via the mapping helpers below.
14189
- */
14190
- type ScreenTipStyle = 'descriptions' | 'plain' | 'off';
14191
- type DisplayOptimization = 'appearance' | 'compatibility';
14192
- type ImageResolutionPreset = 'highFidelity' | 'ppi330' | 'ppi220' | 'ppi150' | 'ppi96';
14193
- type OpenDocumentsView = 'savedView' | 'normal' | 'outline' | 'slideSorter' | 'notes';
14194
- type DefaultExportFormat = 'pptx' | 'pdf' | 'png';
14195
- type QuickAccessPosition = 'above' | 'below';
14196
- type FeedbackSoundScheme = 'modern' | 'classic';
14197
- type OptionsPrintWhat = 'slides' | 'handouts' | 'notes' | 'outline';
14198
- type OptionsPrintColorMode = 'color' | 'grayscale' | 'blackAndWhite';
14199
- interface ViewerGeneralOptions {
14200
- displayOptimization: DisplayOptimization;
14201
- showMiniToolbar: boolean;
14202
- enableLivePreview: boolean;
14203
- collapseRibbonAutomatically: boolean;
14204
- collapseSearchByDefault: boolean;
14205
- screenTipStyle: ScreenTipStyle;
14206
- userName: string;
14207
- userInitials: string;
14208
- showStartScreen: boolean;
14209
- /**
14210
- * Lets the user hand a local font file to the viewer so decks authored
14211
- * with a font the browser lacks render with the real face.
14212
- *
14213
- * Off by default. The registration reads a file the user picks and adds it
14214
- * to the page's font set for the session, which is a capability a host
14215
- * embedding the viewer should opt into rather than inherit.
14216
- */
14217
- enableCustomFontUpload: boolean;
14218
- }
14219
- interface ViewerProofingOptions {
14220
- autoCorrectTwoInitialCapitals: boolean;
14221
- autoCorrectCapitalizeFirstLetter: boolean;
14222
- autoCorrectCapitalizeDayNames: boolean;
14223
- autoCorrectSmartQuotes: boolean;
14224
- autoCorrectHyphensToDash: boolean;
14225
- autoCorrectFractions: boolean;
14226
- autoCorrectOrdinals: boolean;
14227
- ignoreUppercase: boolean;
14228
- ignoreWordsWithNumbers: boolean;
14229
- ignoreInternetAddresses: boolean;
14230
- flagRepeatedWords: boolean;
14231
- checkSpellingAsYouType: boolean;
14232
- hideSpellingErrors: boolean;
14233
- }
14234
- /**
14235
- * File > Options > Save.
14236
- *
14237
- * Font embedding deliberately has NO entry here. It is owned by the File >
14238
- * Fonts panel, whose toggle is the one the save path reads (see
14239
- * `render/font-embedding`: `describeFontEmbedding` decides the toggle's start
14240
- * position and whether it can do anything at all, `embeddedFontSaveOptions`
14241
- * turns it into the `PptxHandler.save()` slice). This group used to carry a
14242
- * second `embedFonts` boolean, plus an `embedAllFontCharacters` companion, and
14243
- * neither was read by anything: the pane moved a switch that changed no saved
14244
- * byte, while the panel next door moved the real one. Two switches for one
14245
- * setting, one of them lying, is worse than one switch in a less
14246
- * PowerPoint-shaped place.
14247
- */
14248
- interface ViewerSaveOptions {
14249
- autoSave: boolean;
14250
- autoRecoverIntervalMinutes: number;
14251
- keepLastAutoRecoveredVersion: boolean;
14252
- defaultExportFormat: DefaultExportFormat;
14253
- cacheRetentionDays: number;
14254
- clearCacheOnClose: boolean;
14255
- }
14256
- interface ViewerAccessibilityOptions {
14257
- showAccessibilityStatus: boolean;
14258
- feedbackWithSound: boolean;
14259
- soundScheme: FeedbackSoundScheme;
14260
- showShortcutKeysInScreenTips: boolean;
14261
- reducedMotion: boolean;
14262
- }
14263
- interface ViewerAdvancedOptions {
14264
- autoSelectEntireWord: boolean;
14265
- allowTextDragAndDrop: boolean;
14266
- maximumUndoSteps: number;
14267
- useSmartCutAndPaste: boolean;
14268
- showPasteOptionsButton: boolean;
14269
- imageDefaultResolution: ImageResolutionPreset;
14270
- doNotCompressImages: boolean;
14271
- chartPropertiesFollowDataPoint: boolean;
14272
- recentPresentationsCount: number;
14273
- showVerticalRuler: boolean;
14274
- showGrid: boolean;
14275
- snapToGrid: boolean;
14276
- disableHardwareAcceleration: boolean;
14277
- /**
14278
- * Force every opt-in interactive 3D scene (SmartArt, bar/line/area/pie/
14279
- * surface charts) to fall back to its flat 2D rendering, even when the
14280
- * host has enabled that scene via its own `smartArt3D`/`*Chart3D` prop.
14281
- * A host opting in says "this deck may want 3D"; this is the viewer
14282
- * user's own override for when the WebGL scenes it renders are too much
14283
- * for their machine. See `resolve3DRenderingFlags`.
14284
- */
14285
- disable3DRendering: boolean;
14286
- /**
14287
- * `p:animEffect/@filter="pixelate"` defaults to snapping the element to
14288
- * its end state (`cutIn`/`cutOut`), matching PowerPoint's own behaviour
14289
- * (COM `CreateVideo` frame-diffing shows PowerPoint performs no animation
14290
- * at all for this filter value). This turns on the blocky mosaic reveal
14291
- * this renderer can build instead, for a viewer that would rather show
14292
- * something animating than PowerPoint's own instant swap. See
14293
- * `resolveFilterEffect` in `animation-filter-effects.ts` and
14294
- * `docs/guide/visual-effects.md`.
14295
- */
14296
- pixelateMosaicAnimation: boolean;
14297
- openDocumentsView: OpenDocumentsView;
14298
- slideShowShowMenuOnRightClick: boolean;
14299
- slideShowShowPopupToolbar: boolean;
14300
- slideShowPromptKeepInkAnnotations: boolean;
14301
- slideShowEndWithBlackSlide: boolean;
14302
- printInBackground: boolean;
14303
- printHighQuality: boolean;
14304
- printUseMostRecentSettings: boolean;
14305
- printWhat: OptionsPrintWhat;
14306
- printColorMode: OptionsPrintColorMode;
14307
- printHiddenSlides: boolean;
14308
- printScaleToFit: boolean;
14309
- printFrameSlides: boolean;
14310
- }
14311
- interface ViewerRibbonOptions {
14312
- /** Ribbon tabs unticked in Customize Ribbon. The File tab can never be hidden. */
14313
- hiddenTabIds: ToolbarTabId[];
14314
- }
14315
- interface ViewerQuickAccessOptions {
14316
- visible: boolean;
14317
- position: QuickAccessPosition;
14318
- showCommandLabels: boolean;
14319
- /** Ordered ids from `QUICK_ACCESS_COMMAND_CATALOG`. */
14320
- commandIds: string[];
14321
- }
14322
- interface ViewerTrustOptions {
14323
- openInProtectedView: boolean;
14324
- allowExternalContent: boolean;
14325
- confirmExternalHyperlinks: boolean;
14326
- }
14327
- interface ViewerOptions {
14328
- general: ViewerGeneralOptions;
14329
- proofing: ViewerProofingOptions;
14330
- save: ViewerSaveOptions;
14331
- accessibility: ViewerAccessibilityOptions;
14332
- advanced: ViewerAdvancedOptions;
14333
- ribbon: ViewerRibbonOptions;
14334
- quickAccess: ViewerQuickAccessOptions;
14335
- trust: ViewerTrustOptions;
14336
- }
14337
- type ViewerOptionsGroupId = keyof ViewerOptions;
14338
- type ViewerOptionPrimitive = boolean | number | string;
14339
- //#endregion
14340
- //#region src/export/handout-layout.d.ts
14341
- /**
14342
- * Pure handout layout calculations, shared by every binding's print path.
14343
- *
14344
- * Handles distributing slides across pages, computing grid dimensions, and
14345
- * positioning cells within A4 page space. No DOM/framework dependency: callers
14346
- * render the resulting rectangles however their view layer prefers.
14347
- */
14348
- /** Supported slides-per-page values. */
14349
- type HandoutSlidesPerPage = 1 | 2 | 3 | 4 | 6 | 9;
14350
- //#endregion
14351
- //#region src/export/print-document.d.ts
14352
- /** What to print. */
14353
- type PrintWhat = 'slides' | 'handouts' | 'notes' | 'outline';
14354
- /** Page orientation for the printed output. */
14355
- type PrintOrientation = 'portrait' | 'landscape';
14356
- /** Colour mode for the printed output. */
14357
- type PrintColorMode = 'color' | 'grayscale' | 'blackAndWhite';
14358
- /** Slide range mode. */
14359
- type PrintSlideRange = 'all' | 'current' | 'custom';
14360
- /** Resolved print settings emitted on confirm. */
14361
- interface PrintSettings {
14362
- printWhat: PrintWhat;
14363
- orientation: PrintOrientation;
14364
- colorMode: PrintColorMode;
14365
- frameSlides: boolean;
14366
- slidesPerPage: HandoutSlidesPerPage;
14367
- slideRange: PrintSlideRange;
14368
- customRangeFrom: number;
14369
- customRangeTo: number;
14370
- /**
14371
- * PowerPoint's Print > "Scale to Fit Paper". `true` (the default, and the
14372
- * only behavior this printed output ever had before this field existed)
14373
- * shrinks/grows each slide image to fill its page/cell while preserving
14374
- * aspect ratio. `false` prints at the slide's native pixel size instead,
14375
- * which may overflow or under-fill the page, exactly like PowerPoint with
14376
- * the option off. Optional so existing `Partial<PrintSettings>` literals
14377
- * across every binding keep compiling; `validatePrintSettings` defaults it
14378
- * to `true`.
14379
- */
14380
- scaleToFit?: boolean;
14381
- }
14382
- /** Every command the Edit Points right-click menu can offer. */
14383
- type EditPointsCommandId = 'add-point' | 'delete-point' | 'delete-segment' | 'open-path' | 'close-path' | 'smooth-point' | 'straight-point' | 'corner-point' | 'straight-segment' | 'curved-segment' | 'exit';
14384
- //#endregion
14385
- //#region src/render/edit-points/freeform-tool-geometry.d.ts
14386
- /** The two click-to-place drawing tools. */
14387
- type FreeformToolKind = 'freeformShape' | 'curve';
14388
- //#endregion
14389
- //#region src/render/options/viewer-options-controls.d.ts
14390
- /**
14391
- * Control/section/tab descriptor types for the File > Options schema, plus
14392
- * the terse constructors the tab-definition modules build panes with.
14393
- */
14394
- type ViewerOptionsTabId = 'general' | 'proofing' | 'save' | 'language' | 'accessibility' | 'advanced' | 'ribbon' | 'quickAccess' | 'addIns' | 'trust';
14395
- //#endregion
14396
13963
  //#region src/render/customization/ribbon-control-catalog.d.ts
14397
13964
  declare const RIBBON_CONTROL_CATALOG: {
14398
13965
  readonly home: {
@@ -14897,151 +14464,716 @@ declare const RIBBON_CONTROL_CATALOG: {
14897
14464
  };
14898
14465
  };
14899
14466
  //#endregion
14900
- //#region src/render/customization/ribbon-control-ids.d.ts
14901
- type Catalog = typeof RIBBON_CONTROL_CATALOG;
14902
- /** `<tab>.<group>`, for example `home.font`. */
14903
- type RibbonGroupId = { [T in keyof Catalog]: { [G in keyof Catalog[T]]: `${T & string}.${G & string}`; }[keyof Catalog[T]]; }[keyof Catalog];
14904
- /** `<tab>.<group>.<control>`, for example `home.font.bold`. */
14905
- type RibbonControlId = { [T in keyof Catalog]: { [G in keyof Catalog[T]]: Catalog[T][G] extends {
14906
- controls: infer C;
14907
- } ? `${T & string}.${G & string}.${keyof C & string}` : never; }[keyof Catalog[T]]; }[keyof Catalog];
14467
+ //#region src/render/customization/ribbon-control-ids.d.ts
14468
+ type Catalog = typeof RIBBON_CONTROL_CATALOG;
14469
+ /** `<tab>.<group>`, for example `home.font`. */
14470
+ type RibbonGroupId = { [T in keyof Catalog]: { [G in keyof Catalog[T]]: `${T & string}.${G & string}`; }[keyof Catalog[T]]; }[keyof Catalog];
14471
+ /** `<tab>.<group>.<control>`, for example `home.font.bold`. */
14472
+ type RibbonControlId = { [T in keyof Catalog]: { [G in keyof Catalog[T]]: Catalog[T][G] extends {
14473
+ controls: infer C;
14474
+ } ? `${T & string}.${G & string}.${keyof C & string}` : never; }[keyof Catalog[T]]; }[keyof Catalog];
14475
+ //#endregion
14476
+ //#region src/render/customization/customization-types.d.ts
14477
+ /** Keys of an options group whose value is a primitive (not an array). */
14478
+ type PrimitiveKeys<T> = { [K in keyof T]: T[K] extends ViewerOptionPrimitive ? K : never; }[keyof T] & string;
14479
+ /**
14480
+ * One File > Options setting, addressed as `<group>.<key>`, for example
14481
+ * `general.userName` or `advanced.showGrid`. The union is derived from the
14482
+ * `ViewerOptions` model itself, so a typo is a compile error.
14483
+ */
14484
+ type OptionsSettingId = { [G in ViewerOptionsGroupId]: `${G}.${PrimitiveKeys<ViewerOptions[G]>}`; }[ViewerOptionsGroupId];
14485
+ /**
14486
+ * A File > Options page: the ten PowerPoint categories plus `ai`, the AI
14487
+ * assistant page a binding adds when the host configured an assistant.
14488
+ */
14489
+ type OptionsPageId = ViewerOptionsTabId | 'ai';
14490
+ /**
14491
+ * One section of an Options page, addressed as `<page>.<section>`, for
14492
+ * example `general.personalize` or `advanced.print`. The full list is
14493
+ * `OPTIONS_SECTION_IDS` (derived from the schema at runtime).
14494
+ */
14495
+ type OptionsSectionId = `${ViewerOptionsTabId}.${string}`;
14496
+ /** Values a host forces onto settings. */
14497
+ type OptionsSettingValues = Partial<Record<OptionsSettingId, ViewerOptionPrimitive>>;
14498
+ /** Ribbon and toolbar customisation. */
14499
+ interface RibbonCustomization {
14500
+ /**
14501
+ * Ribbon tabs to remove (the File tab included, unlike Customize Ribbon),
14502
+ * and contextual tabs (`shapeFormat`, `pictureFormat`, ...) that should
14503
+ * never appear.
14504
+ */
14505
+ hiddenTabs?: readonly (ToolbarTabId | RibbonContextualTabId)[];
14506
+ /** Groups inside a tab to remove, as `<tab>.<group>` (`home.font`). */
14507
+ hiddenGroups?: readonly RibbonGroupId[];
14508
+ /**
14509
+ * Controls to remove: a top-level toolbar button / control cluster
14510
+ * (`share`, `zoom`, ...) or any ribbon control as
14511
+ * `<tab>.<group>.<control>` (`home.font.bold`).
14512
+ */
14513
+ hiddenButtons?: readonly (ToolbarButtonId | RibbonControlId)[];
14514
+ }
14515
+ /** File > Options (the Settings dialog) customisation. */
14516
+ interface OptionsCustomization {
14517
+ /** Whole pages to remove from the dialog's category rail. */
14518
+ hiddenPages?: readonly OptionsPageId[];
14519
+ /** Sections (`<page>.<section>`) to remove from their page. */
14520
+ hiddenSections?: readonly OptionsSectionId[];
14521
+ /** Individual settings (`<group>.<key>`) to remove wherever they appear. */
14522
+ hiddenSettings?: readonly OptionsSettingId[];
14523
+ /**
14524
+ * Settings pinned to a fixed value. The value is forced into the options
14525
+ * store, user edits to it are ignored, and the control renders read-only.
14526
+ * Add the id to `hiddenSettings` too to lock it invisibly.
14527
+ */
14528
+ locked?: OptionsSettingValues;
14529
+ /**
14530
+ * Host defaults: the value a setting starts at when the user has not saved
14531
+ * a choice of their own. "Reset" returns to these, not to the built-ins.
14532
+ */
14533
+ defaults?: OptionsSettingValues;
14534
+ }
14535
+ /** File tab (backstage) customisation. */
14536
+ interface BackstageCustomization {
14537
+ /** Navigation entries (pages) to remove from the File tab. */
14538
+ hiddenPages?: readonly BackstagePage[];
14539
+ /** Action cards to remove from the pages that show them. */
14540
+ hiddenCards?: readonly BackstageCardId[];
14541
+ }
14542
+ /** Right-click menu customisation. */
14543
+ interface ContextMenuCustomization {
14544
+ /** Additional host commands, independent of the viewer's AI connection. */
14545
+ extraElementCommands?: readonly HostMenuCommand<HostElementMenuContext>[];
14546
+ extraCanvasCommands?: readonly HostMenuCommand<HostCanvasMenuContext>[];
14547
+ /** Entries to remove from the element (right-click on a shape) menu. */
14548
+ hiddenElementCommands?: readonly ContextMenuCommandId[];
14549
+ /** Entries to remove from the empty-canvas menu. */
14550
+ hiddenCanvasCommands?: readonly CanvasContextMenuCommandId[];
14551
+ /**
14552
+ * Entries to remove from the Edit Points menu (right-click a vertex or a
14553
+ * segment while editing a shape's points).
14554
+ */
14555
+ hiddenEditPointsCommands?: readonly EditPointsCommandId[];
14556
+ /** Remove the element context menu entirely. */
14557
+ disableElementMenu?: boolean;
14558
+ /** Remove the empty-canvas context menu entirely. */
14559
+ disableCanvasMenu?: boolean;
14560
+ }
14561
+ /**
14562
+ * A shortcut chord in the form `Mod+Shift+D`: modifiers `Mod` (Ctrl on
14563
+ * Windows/Linux, Cmd on macOS), `Ctrl`, `Meta`, `Alt`, `Shift`, joined by `+`,
14564
+ * followed by a `KeyboardEvent.key` value (`D`, `Delete`, `ArrowLeft`, `F2`).
14565
+ */
14566
+ type ShortcutChord = string;
14567
+ /** Editor keyboard-shortcut customisation. */
14568
+ interface KeyboardCustomization {
14569
+ /** Turn every editor shortcut off (the host owns the keyboard). */
14570
+ disableAll?: boolean;
14571
+ /** Editor commands whose shortcut is turned off. */
14572
+ disabled?: readonly EditorKeyActionName[];
14573
+ /**
14574
+ * Replacement chords per command. A remapped command no longer answers to
14575
+ * its built-in chord; it answers to the chord(s) given here instead.
14576
+ */
14577
+ remap?: Partial<Record<EditorKeyActionName, ShortcutChord | readonly ShortcutChord[]>>;
14578
+ }
14579
+ /**
14580
+ * Chrome regions a host can remove. Each id maps onto one region in every
14581
+ * binding; see `VIEWER_PANEL_IDS` for the catalogue.
14582
+ */
14583
+ type ViewerPanelId = 'statusBar' | 'slidesPane' | 'inspector' | 'notes' | 'quickAccessToolbar' | 'titleBar';
14584
+ /** Feature areas that can be switched off as a whole. */
14585
+ type ViewerFeatureId = 'ai' | 'collaboration' | 'comments' | 'presentMode' | 'editPoints';
14586
+ /**
14587
+ * The click-to-place drawing tools of Insert > Shapes > Lines: Freeform:
14588
+ * Shape and Curve.
14589
+ */
14590
+ type ViewerDrawingToolId = FreeformToolKind;
14591
+ /** Dialogs (and the entry points that open them) a host can remove. */
14592
+ type ViewerDialogId = 'options' | 'share' | 'broadcast' | 'print' | 'export';
14593
+ /** Export formats offered by the File > Export page. */
14594
+ type ViewerExportFormatId = 'pdf' | 'png' | 'video' | 'gif' | 'json' | 'copyImage';
14595
+ /**
14596
+ * The whole customisation object. Every field is optional; omitted fields hide
14597
+ * nothing and lock nothing.
14598
+ */
14599
+ interface ViewerCustomization {
14600
+ ribbon?: RibbonCustomization;
14601
+ options?: OptionsCustomization;
14602
+ backstage?: BackstageCustomization;
14603
+ contextMenu?: ContextMenuCustomization;
14604
+ keyboard?: KeyboardCustomization;
14605
+ /** Chrome regions to remove (`true` hides). */
14606
+ hiddenPanels?: readonly ViewerPanelId[];
14607
+ /** Feature areas to switch off (their buttons, menus, pages and panels). */
14608
+ disabledFeatures?: readonly ViewerFeatureId[];
14609
+ /** Dialogs to remove, along with every entry point that opens them. */
14610
+ hiddenDialogs?: readonly ViewerDialogId[];
14611
+ /** Export formats to remove from File > Export. */
14612
+ hiddenExportFormats?: readonly ViewerExportFormatId[];
14613
+ /** Drawing tools to remove from the Insert > Shapes gallery. */
14614
+ hiddenDrawingTools?: readonly ViewerDrawingToolId[];
14615
+ }
14616
+ //#endregion
14617
+ //#region src/render/customization/customization-catalog.d.ts
14618
+ declare const RIBBON_TAB_IDS: readonly ToolbarTabId[];
14619
+ declare const TOOLBAR_BUTTON_IDS: readonly ["share", "broadcast", "export", "undo", "redo", "record", "notes", "fullscreen", "zoom", "navigation", "mergeShapes", "crop"];
14620
+ declare const OPTIONS_PAGE_IDS: readonly OptionsPageId[];
14621
+ declare const OPTIONS_SECTION_IDS: readonly OptionsSectionId[];
14622
+ declare const OPTIONS_SETTING_IDS: readonly OptionsSettingId[];
14623
+ declare const BACKSTAGE_PAGE_IDS: readonly BackstagePage[];
14624
+ declare const BACKSTAGE_CARD_IDS: readonly BackstageCardId[];
14625
+ declare const ELEMENT_CONTEXT_MENU_COMMAND_IDS: readonly ["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", "merge-union", "merge-combine", "merge-fragment", "merge-intersect", "merge-subtract", "save-as-picture", "edit-alt-text", "size-and-position", "format-shape", "delete"];
14626
+ declare const CANVAS_CONTEXT_MENU_COMMAND_IDS: readonly ["paste", "layout", "reset-slide", "format-background", "grid-and-guides", "ruler"];
14627
+ declare const EDITOR_SHORTCUT_ACTION_IDS: readonly ["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"];
14628
+ declare const VIEWER_PANEL_IDS: readonly ["statusBar", "slidesPane", "inspector", "notes", "quickAccessToolbar", "titleBar"];
14629
+ declare const VIEWER_FEATURE_IDS: readonly ["ai", "collaboration", "comments", "presentMode", "editPoints"];
14630
+ declare const VIEWER_DIALOG_IDS: readonly ["options", "share", "broadcast", "print", "export"];
14631
+ declare const VIEWER_EXPORT_FORMAT_IDS: readonly ["pdf", "png", "video", "gif", "json", "copyImage"];
14632
+ //#endregion
14633
+ //#region src/render/customization/customization-keymap.d.ts
14634
+ /** A parsed `Mod+Shift+D` chord. */
14635
+ interface ParsedShortcutChord {
14636
+ key: string;
14637
+ mod: boolean;
14638
+ ctrl: boolean;
14639
+ meta: boolean;
14640
+ alt: boolean;
14641
+ shift: boolean;
14642
+ }
14643
+ /** The normalised keyboard slice of a resolved customisation. */
14644
+ interface ResolvedKeyboardCustomization {
14645
+ disableAll: boolean;
14646
+ disabled: ReadonlySet<EditorKeyActionName>;
14647
+ remap: ReadonlyMap<EditorKeyActionName, readonly ParsedShortcutChord[]>;
14648
+ }
14649
+ //#endregion
14650
+ //#region src/render/customization/customization-resolve.d.ts
14651
+ /** The normalised, set-based view of a customisation. Treat as immutable. */
14652
+ interface ResolvedCustomization {
14653
+ hiddenActions: ReadonlySet<ToolbarActionId>;
14654
+ /** Contextual tabs (`shapeFormat`, ...) the host never wants shown. */
14655
+ hiddenContextualTabs: ReadonlySet<RibbonContextualTabId>;
14656
+ /** Catalogued ribbon groups to hide (`ribbon.hiddenGroups`). */
14657
+ hiddenRibbonGroups: ReadonlySet<RibbonGroupId>;
14658
+ /** Catalogued ribbon controls to hide (the `<tab>.<group>.<control>` part of `ribbon.hiddenButtons`). */
14659
+ hiddenRibbonControls: ReadonlySet<RibbonControlId>;
14660
+ hiddenOptionsPages: ReadonlySet<OptionsPageId>;
14661
+ hiddenOptionsSections: ReadonlySet<OptionsSectionId>;
14662
+ hiddenSettings: ReadonlySet<OptionsSettingId>;
14663
+ lockedSettings: OptionsSettingValues;
14664
+ defaultSettings: OptionsSettingValues;
14665
+ hiddenBackstagePages: ReadonlySet<BackstagePage>;
14666
+ hiddenBackstageCards: ReadonlySet<BackstageCardId>;
14667
+ hiddenElementCommands: ReadonlySet<ContextMenuCommandId>;
14668
+ extraElementCommands: NonNullable<ViewerCustomization['contextMenu']>['extraElementCommands'];
14669
+ extraCanvasCommands: NonNullable<ViewerCustomization['contextMenu']>['extraCanvasCommands'];
14670
+ hiddenCanvasCommands: ReadonlySet<CanvasContextMenuCommandId>;
14671
+ hiddenEditPointsCommands: ReadonlySet<EditPointsCommandId>;
14672
+ hiddenDrawingTools: ReadonlySet<ViewerDrawingToolId>;
14673
+ elementMenuEnabled: boolean;
14674
+ canvasMenuEnabled: boolean;
14675
+ hiddenPanels: ReadonlySet<ViewerPanelId>;
14676
+ disabledFeatures: ReadonlySet<ViewerFeatureId>;
14677
+ hiddenDialogs: ReadonlySet<ViewerDialogId>;
14678
+ keyboard: ResolvedKeyboardCustomization;
14679
+ }
14908
14680
  //#endregion
14909
- //#region src/render/customization/customization-types.d.ts
14910
- /** Keys of an options group whose value is a primitive (not an array). */
14911
- type PrimitiveKeys<T> = { [K in keyof T]: T[K] extends ViewerOptionPrimitive ? K : never; }[keyof T] & string;
14681
+ //#region src/render/customization/customization-controller.d.ts
14682
+ /** The imperative methods every binding's component handle exposes. */
14683
+ interface ViewerCustomizationApi {
14684
+ /** The current customisation object (a snapshot; do not mutate). */
14685
+ getCustomization(): ViewerCustomization;
14686
+ /** Replace the whole customisation. */
14687
+ setCustomization(next: ViewerCustomization): void;
14688
+ /** Merge a partial customisation (see `mergeCustomization`). */
14689
+ updateCustomization(patch: ViewerCustomization): void;
14690
+ /** Drop every customisation, back to the stock UI. */
14691
+ resetCustomization(): void;
14692
+ /** Hide a fixed tab, or stop a contextual tab (`shapeFormat`, ...) from appearing. */
14693
+ hideRibbonTab(tab: ToolbarTabId | RibbonContextualTabId): void;
14694
+ showRibbonTab(tab: ToolbarTabId | RibbonContextualTabId): void;
14695
+ /** Hide a group inside a tab (`home.font`). */
14696
+ hideRibbonGroup(group: RibbonGroupId): void;
14697
+ showRibbonGroup(group: RibbonGroupId): void;
14698
+ /** Hide a top-level toolbar button or any ribbon control (`home.font.bold`). */
14699
+ hideToolbarButton(button: ToolbarButtonId | RibbonControlId): void;
14700
+ showToolbarButton(button: ToolbarButtonId | RibbonControlId): void;
14701
+ /** Alias of `hideToolbarButton` for a ribbon control id. */
14702
+ hideRibbonControl(control: RibbonControlId): void;
14703
+ showRibbonControl(control: RibbonControlId): void;
14704
+ hideOptionsPage(page: OptionsPageId): void;
14705
+ showOptionsPage(page: OptionsPageId): void;
14706
+ hideOptionsSection(section: OptionsSectionId): void;
14707
+ showOptionsSection(section: OptionsSectionId): void;
14708
+ hideSetting(setting: OptionsSettingId): void;
14709
+ showSetting(setting: OptionsSettingId): void;
14710
+ /** Pin a setting to `value`; `hidden` also removes it from the dialog. */
14711
+ lockSetting(setting: OptionsSettingId, value: ViewerOptionPrimitive, hidden?: boolean): void;
14712
+ unlockSetting(setting: OptionsSettingId): void;
14713
+ /** Set (or with `undefined`, clear) the host default for a setting. */
14714
+ setSettingDefault(setting: OptionsSettingId, value: ViewerOptionPrimitive | undefined): void;
14715
+ hideBackstagePage(page: BackstagePage): void;
14716
+ showBackstagePage(page: BackstagePage): void;
14717
+ hideBackstageCard(card: BackstageCardId): void;
14718
+ showBackstageCard(card: BackstageCardId): void;
14719
+ hideContextMenuCommand(command: ContextMenuCommandId): void;
14720
+ showContextMenuCommand(command: ContextMenuCommandId): void;
14721
+ hideCanvasContextMenuCommand(command: CanvasContextMenuCommandId): void;
14722
+ showCanvasContextMenuCommand(command: CanvasContextMenuCommandId): void;
14723
+ disableShortcut(action: EditorKeyActionName): void;
14724
+ enableShortcut(action: EditorKeyActionName): void;
14725
+ /** Move a command onto new chord(s); `undefined` restores the built-in chord. */
14726
+ remapShortcut(action: EditorKeyActionName, chords: ShortcutChord | readonly ShortcutChord[] | undefined): void;
14727
+ setPanelVisible(panel: ViewerPanelId, visible: boolean): void;
14728
+ setFeatureEnabled(feature: ViewerFeatureId, enabled: boolean): void;
14729
+ setDialogAvailable(dialog: ViewerDialogId, available: boolean): void;
14730
+ }
14731
+ interface ViewerCustomizationController {
14732
+ /** The helper methods, ready to spread onto a component handle. */
14733
+ readonly api: ViewerCustomizationApi;
14734
+ /** The normalised view the render sites read. Stable until the next change. */
14735
+ getResolved(): ResolvedCustomization;
14736
+ /** Subscribe to every change; returns the unsubscribe function. */
14737
+ subscribe(listener: () => void): () => void;
14738
+ }
14739
+ //#endregion
14740
+ //#region src/render/p14-transition-keyframes.d.ts
14741
+ /** Part 1: conveyor / doors / ferris / flash / flythrough / gallery / glitter / honeycomb / pan. */
14742
+ declare const P14_TRANSITION_KEYFRAMES = "\n/* ── Conveyor (translate X with staggered timing) ──────────────────── */\n@keyframes pptx-tr-conveyor-in-from-right {\n\tfrom { transform: translateX(100%) rotateY(-30deg); }\n\t60% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-left {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(-100%) rotateY(30deg); }\n}\n@keyframes pptx-tr-conveyor-in-from-left {\n\tfrom { transform: translateX(-100%) rotateY(30deg); }\n\t60% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-right {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(100%) rotateY(-30deg); }\n}\n\n/* ── Doors (clip-path from center split) ──────────────────────────────\n MEASURED via COM CreateVideo: PowerPoint's `dir=\"horz\"` names a\n HORIZONTAL split line (two panels stacked top/bottom, opening upward and\n downward), and `dir=\"vert\"` a VERTICAL split line (panels side by side,\n opening left and right) - the opposite of what \"clips left/right\" vs\n \"clips top/bottom\" would suggest at a glance. Keep the clip-path bodies\n matched to the MEASURED direction, not the intuitive one. */\n@keyframes pptx-tr-doors-horz {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-doors-vert {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n\n/* ── Ferris (rotate elements around center) ───────────────────────── */\n@keyframes pptx-tr-ferris-in-from-right {\n\tfrom { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-left {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n}\n@keyframes pptx-tr-ferris-in-from-left {\n\tfrom { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-right {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n}\n\n/* ── Flash (bright flash opacity burst) ──────────────────────────── */\n@keyframes pptx-tr-flash-white {\n\t0% { opacity: 1; }\n\t30% { opacity: 0; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n@keyframes pptx-tr-flash-in {\n\t0% { opacity: 0; }\n\t50% { opacity: 0; }\n\t70% { opacity: 1; }\n\t100% { opacity: 1; }\n}\n\n/* ── Flythrough (scale + translate Z-axis feel) ──────────────────── */\n@keyframes pptx-tr-flythrough-in {\n\tfrom { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n}\n@keyframes pptx-tr-flythrough-reverse-in {\n\tfrom { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-reverse-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n}\n\n/* ── Gallery (translate with perspective) ─────────────────────────── */\n@keyframes pptx-tr-gallery-in-from-right {\n\tfrom { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-left {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n}\n@keyframes pptx-tr-gallery-in-from-left {\n\tfrom { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-right {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n}\n\n/* ── Glitter (particle dissolve effect) ──────────────────────────── */\n@keyframes pptx-tr-glitter-in {\n\tfrom { opacity: 0; filter: brightness(1.5) contrast(1.3) blur(2px); }\n\t60% { opacity: 0.7; filter: brightness(1.2) contrast(1.1) blur(1px); }\n\tto { opacity: 1; filter: brightness(1) contrast(1) blur(0); }\n}\n\n/* ── Honeycomb (hexagonal reveal) ────────────────────────────────── */\n@keyframes pptx-tr-honeycomb-in {\n\tfrom {\n\t\tclip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%);\n\t\topacity: 0;\n\t}\n\tto {\n\t\tclip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);\n\t\topacity: 1;\n\t}\n}\n@keyframes pptx-tr-honeycomb-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* ── Pan (large-scale translate) ─────────────────────────────────── */\n@keyframes pptx-tr-pan-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-pan-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-pan-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-pan-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n";
14743
+ /** Part 2: prism / reveal / ripple / shred / switch / vortex / warp / wheelReverse / window. */
14744
+ declare const P14_TRANSITION_KEYFRAMES_2 = "\n/* ── Prism: see `slide-transition-prism` (split out to keep this module\n under the per-file LOC budget) ─────────────────────────────────────── */\n\n@keyframes pptx-tr-prism-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-bottom {\n\tfrom { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-top {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-top {\n\tfrom { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-bottom {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n}\n\n/* ── Reveal (slide away reveal) ──────────────────────────────────── */\n@keyframes pptx-tr-reveal-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-reveal-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n/* MEASURED: the incoming layer stays hidden for roughly the first half of the\n transition (a real black/background gap shows through), then fades in -\n not a flat 0.5->1 fade running the whole duration. */\n@keyframes pptx-tr-reveal-in {\n\t0% { opacity: 0; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n\n/* ── Ripple (expanding ring clip-path) ───────────────────────────── */\n@keyframes pptx-tr-ripple-in {\n\tfrom { clip-path: circle(0% at 50% 50%); opacity: 0.5; }\n\t30% { clip-path: circle(20% at 50% 50%); opacity: 0.7; }\n\t60% { clip-path: circle(50% at 50% 50%); opacity: 0.9; }\n\tto { clip-path: circle(75% at 50% 50%); opacity: 1; }\n}\n\n/* ── Shred (fragmented clip-path pieces) ─────────────────────────── */\n@keyframes pptx-tr-shred-strips-in {\n\tfrom { clip-path: inset(0 100% 0 0); opacity: 0; }\n\t30% { clip-path: inset(0 60% 0 0); opacity: 0.5; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-rectangles-in {\n\tfrom { clip-path: inset(50%); opacity: 0; }\n\t40% { clip-path: inset(20%); opacity: 0.6; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* ── Switch (flip/rotate swap) ───────────────────────────────────── */\n@keyframes pptx-tr-switch-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n}\n@keyframes pptx-tr-switch-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n}\n\n/* ── Vortex (rotate + scale spiral) ──────────────────────────────── */\n@keyframes pptx-tr-vortex-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-vortex-out {\n\tfrom { transform: rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: rotate(-720deg) scale(0); opacity: 0; }\n}\n\n/* ── Warp: see `slide-transition-warp` (COM-measured radial zoom blur,\n split out to keep this module under the per-file LOC budget) ────────── */\n\n@keyframes pptx-tr-warp-in {\n\t0% { transform: scale(0.25); opacity: 0; filter: blur(10px) brightness(1.8); }\n\t50% { transform: scale(0.85); opacity: 0.7; filter: blur(3px) brightness(1.3); }\n\t100% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n}\n@keyframes pptx-tr-warp-out {\n\t0% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n\t50% { transform: scale(0.85); opacity: 0.7; filter: blur(3px) brightness(1.3); }\n\t100% { transform: scale(0.25); opacity: 0; filter: blur(10px) brightness(1.8); }\n}\n@keyframes pptx-tr-warp-reverse-in {\n\t0% { transform: scale(3.2); opacity: 0; filter: blur(14px) brightness(2.2); }\n\t50% { transform: scale(1.7); opacity: 0.7; filter: blur(6px) brightness(1.5); }\n\t100% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n}\n@keyframes pptx-tr-warp-reverse-out {\n\t0% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n\t50% { transform: scale(1.7); opacity: 0.7; filter: blur(6px) brightness(1.5); }\n\t100% { transform: scale(3.2); opacity: 0; filter: blur(14px) brightness(2.2); }\n}\n\n\n/* ── WheelReverse (reverse wheel rotation) ───────────────────────── */\n@keyframes pptx-tr-wheel-reverse-in {\n\tfrom { clip-path: circle(0% at 50% 50%); transform: rotate(180deg); }\n\tto { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }\n}\n\n/* ── Window (scale from center with border) ──────────────────────────\n Same measured horz/vert meaning as Doors above (horz = horizontal split\n line opening vertically; vert = vertical split line opening horizontally). */\n@keyframes pptx-tr-window-horz {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-vert {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-out {\n\tfrom { opacity: 1; transform: scale(1); }\n\tto { opacity: 0; transform: scale(0.9); }\n}\n";
14745
+ /** Both p14 keyframe blocks concatenated, for single `<style>` injection. */
14746
+ declare const P14_TRANSITION_KEYFRAMES_ALL = "\n/* ── Conveyor (translate X with staggered timing) ──────────────────── */\n@keyframes pptx-tr-conveyor-in-from-right {\n\tfrom { transform: translateX(100%) rotateY(-30deg); }\n\t60% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-left {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(-100%) rotateY(30deg); }\n}\n@keyframes pptx-tr-conveyor-in-from-left {\n\tfrom { transform: translateX(-100%) rotateY(30deg); }\n\t60% { transform: translateX(-20%) rotateY(10deg); }\n\tto { transform: translateX(0) rotateY(0deg); }\n}\n@keyframes pptx-tr-conveyor-out-to-right {\n\tfrom { transform: translateX(0) rotateY(0deg); }\n\t40% { transform: translateX(20%) rotateY(-10deg); }\n\tto { transform: translateX(100%) rotateY(-30deg); }\n}\n\n/* ── Doors (clip-path from center split) ──────────────────────────────\n MEASURED via COM CreateVideo: PowerPoint's `dir=\"horz\"` names a\n HORIZONTAL split line (two panels stacked top/bottom, opening upward and\n downward), and `dir=\"vert\"` a VERTICAL split line (panels side by side,\n opening left and right) - the opposite of what \"clips left/right\" vs\n \"clips top/bottom\" would suggest at a glance. Keep the clip-path bodies\n matched to the MEASURED direction, not the intuitive one. */\n@keyframes pptx-tr-doors-horz {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-doors-vert {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n\n/* ── Ferris (rotate elements around center) ───────────────────────── */\n@keyframes pptx-tr-ferris-in-from-right {\n\tfrom { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-left {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n}\n@keyframes pptx-tr-ferris-in-from-left {\n\tfrom { transform: translateX(-80%) rotate(-45deg) scale(0.6); opacity: 0; }\n\tto { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-ferris-out-to-right {\n\tfrom { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: translateX(80%) rotate(45deg) scale(0.6); opacity: 0; }\n}\n\n/* ── Flash (bright flash opacity burst) ──────────────────────────── */\n@keyframes pptx-tr-flash-white {\n\t0% { opacity: 1; }\n\t30% { opacity: 0; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n@keyframes pptx-tr-flash-in {\n\t0% { opacity: 0; }\n\t50% { opacity: 0; }\n\t70% { opacity: 1; }\n\t100% { opacity: 1; }\n}\n\n/* ── Flythrough (scale + translate Z-axis feel) ──────────────────── */\n@keyframes pptx-tr-flythrough-in {\n\tfrom { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n}\n@keyframes pptx-tr-flythrough-reverse-in {\n\tfrom { transform: scale(0.1) translateZ(-200px); opacity: 0; filter: blur(8px); }\n\tto { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-flythrough-reverse-out {\n\tfrom { transform: scale(1) translateZ(0); opacity: 1; filter: blur(0); }\n\tto { transform: scale(4) translateZ(200px); opacity: 0; filter: blur(8px); }\n}\n\n/* ── Gallery (translate with perspective) ─────────────────────────── */\n@keyframes pptx-tr-gallery-in-from-right {\n\tfrom { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-left {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n}\n@keyframes pptx-tr-gallery-in-from-left {\n\tfrom { transform: perspective(800px) translateX(-100%) rotateY(45deg); opacity: 0.5; }\n\tto { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-gallery-out-to-right {\n\tfrom { transform: perspective(800px) translateX(0) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) translateX(100%) rotateY(-45deg); opacity: 0.5; }\n}\n\n/* ── Glitter (particle dissolve effect) ──────────────────────────── */\n@keyframes pptx-tr-glitter-in {\n\tfrom { opacity: 0; filter: brightness(1.5) contrast(1.3) blur(2px); }\n\t60% { opacity: 0.7; filter: brightness(1.2) contrast(1.1) blur(1px); }\n\tto { opacity: 1; filter: brightness(1) contrast(1) blur(0); }\n}\n\n/* ── Honeycomb (hexagonal reveal) ────────────────────────────────── */\n@keyframes pptx-tr-honeycomb-in {\n\tfrom {\n\t\tclip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%, 50% 50%);\n\t\topacity: 0;\n\t}\n\tto {\n\t\tclip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);\n\t\topacity: 1;\n\t}\n}\n@keyframes pptx-tr-honeycomb-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* ── Pan (large-scale translate) ─────────────────────────────────── */\n@keyframes pptx-tr-pan-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-pan-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-pan-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-pan-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-pan-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-pan-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n\n\n/* ── Prism: see `slide-transition-prism` (split out to keep this module\n under the per-file LOC budget) ─────────────────────────────────────── */\n\n@keyframes pptx-tr-prism-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(90deg) translateX(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg) translateX(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-90deg) translateX(50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-bottom {\n\tfrom { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-top {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n}\n@keyframes pptx-tr-prism-in-from-top {\n\tfrom { transform: perspective(800px) rotateX(-90deg) translateY(-50%); opacity: 0; }\n\tto { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n}\n@keyframes pptx-tr-prism-out-to-bottom {\n\tfrom { transform: perspective(800px) rotateX(0deg) translateY(0); opacity: 1; }\n\tto { transform: perspective(800px) rotateX(90deg) translateY(50%); opacity: 0; }\n}\n\n/* ── Reveal (slide away reveal) ──────────────────────────────────── */\n@keyframes pptx-tr-reveal-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-reveal-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n/* MEASURED: the incoming layer stays hidden for roughly the first half of the\n transition (a real black/background gap shows through), then fades in -\n not a flat 0.5->1 fade running the whole duration. */\n@keyframes pptx-tr-reveal-in {\n\t0% { opacity: 0; }\n\t50% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n\n/* ── Ripple (expanding ring clip-path) ───────────────────────────── */\n@keyframes pptx-tr-ripple-in {\n\tfrom { clip-path: circle(0% at 50% 50%); opacity: 0.5; }\n\t30% { clip-path: circle(20% at 50% 50%); opacity: 0.7; }\n\t60% { clip-path: circle(50% at 50% 50%); opacity: 0.9; }\n\tto { clip-path: circle(75% at 50% 50%); opacity: 1; }\n}\n\n/* ── Shred (fragmented clip-path pieces) ─────────────────────────── */\n@keyframes pptx-tr-shred-strips-in {\n\tfrom { clip-path: inset(0 100% 0 0); opacity: 0; }\n\t30% { clip-path: inset(0 60% 0 0); opacity: 0.5; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-rectangles-in {\n\tfrom { clip-path: inset(50%); opacity: 0; }\n\t40% { clip-path: inset(20%); opacity: 0.6; }\n\tto { clip-path: inset(0); opacity: 1; }\n}\n@keyframes pptx-tr-shred-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; filter: blur(2px); }\n}\n\n/* ── Switch (flip/rotate swap) ───────────────────────────────────── */\n@keyframes pptx-tr-switch-in-from-right {\n\tfrom { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-left {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n}\n@keyframes pptx-tr-switch-in-from-left {\n\tfrom { transform: perspective(800px) rotateY(180deg); opacity: 0; }\n\tto { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-switch-out-to-right {\n\tfrom { transform: perspective(800px) rotateY(0deg); opacity: 1; }\n\tto { transform: perspective(800px) rotateY(-180deg); opacity: 0; }\n}\n\n/* ── Vortex (rotate + scale spiral) ──────────────────────────────── */\n@keyframes pptx-tr-vortex-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-vortex-out {\n\tfrom { transform: rotate(0deg) scale(1); opacity: 1; }\n\tto { transform: rotate(-720deg) scale(0); opacity: 0; }\n}\n\n/* ── Warp: see `slide-transition-warp` (COM-measured radial zoom blur,\n split out to keep this module under the per-file LOC budget) ────────── */\n\n@keyframes pptx-tr-warp-in {\n\t0% { transform: scale(0.25); opacity: 0; filter: blur(10px) brightness(1.8); }\n\t50% { transform: scale(0.85); opacity: 0.7; filter: blur(3px) brightness(1.3); }\n\t100% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n}\n@keyframes pptx-tr-warp-out {\n\t0% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n\t50% { transform: scale(0.85); opacity: 0.7; filter: blur(3px) brightness(1.3); }\n\t100% { transform: scale(0.25); opacity: 0; filter: blur(10px) brightness(1.8); }\n}\n@keyframes pptx-tr-warp-reverse-in {\n\t0% { transform: scale(3.2); opacity: 0; filter: blur(14px) brightness(2.2); }\n\t50% { transform: scale(1.7); opacity: 0.7; filter: blur(6px) brightness(1.5); }\n\t100% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n}\n@keyframes pptx-tr-warp-reverse-out {\n\t0% { transform: scale(1); opacity: 1; filter: blur(0) brightness(1); }\n\t50% { transform: scale(1.7); opacity: 0.7; filter: blur(6px) brightness(1.5); }\n\t100% { transform: scale(3.2); opacity: 0; filter: blur(14px) brightness(2.2); }\n}\n\n\n/* ── WheelReverse (reverse wheel rotation) ───────────────────────── */\n@keyframes pptx-tr-wheel-reverse-in {\n\tfrom { clip-path: circle(0% at 50% 50%); transform: rotate(180deg); }\n\tto { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }\n}\n\n/* ── Window (scale from center with border) ──────────────────────────\n Same measured horz/vert meaning as Doors above (horz = horizontal split\n line opening vertically; vert = vertical split line opening horizontally). */\n@keyframes pptx-tr-window-horz {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-vert {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-out {\n\tfrom { opacity: 1; transform: scale(1); }\n\tto { opacity: 0; transform: scale(0.9); }\n}\n\n\n@keyframes pptx-tr-vortex-in-left { from { transform: translateX(-40%) rotate(720deg) scale(0); opacity: 0; } to { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-vortex-out-left { from { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateX(-40%) rotate(-720deg) scale(0); opacity: 0; } }\n@keyframes pptx-tr-vortex-in-right { from { transform: translateX(40%) rotate(-720deg) scale(0); opacity: 0; } to { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-vortex-out-right { from { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateX(40%) rotate(720deg) scale(0); opacity: 0; } }\n@keyframes pptx-tr-vortex-in-up { from { transform: translateY(-40%) rotate(720deg) scale(0); opacity: 0; } to { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-vortex-out-up { from { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateY(-40%) rotate(-720deg) scale(0); opacity: 0; } }\n@keyframes pptx-tr-vortex-in-down { from { transform: translateY(40%) rotate(-720deg) scale(0); opacity: 0; } to { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-vortex-out-down { from { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; } to { transform: translateY(40%) rotate(720deg) scale(0); opacity: 0; } }\n\n\n@keyframes pptx-tr-ripple-in-lu { from { clip-path: circle(0% at 0% 0%); opacity: 0.5; } 30% { clip-path: circle(20% at 0% 0%); opacity: 0.7; } 60% { clip-path: circle(55% at 0% 0%); opacity: 0.9; } to { clip-path: circle(150% at 0% 0%); opacity: 1; } }\n@keyframes pptx-tr-ripple-in-ru { from { clip-path: circle(0% at 100% 0%); opacity: 0.5; } 30% { clip-path: circle(20% at 100% 0%); opacity: 0.7; } 60% { clip-path: circle(55% at 100% 0%); opacity: 0.9; } to { clip-path: circle(150% at 100% 0%); opacity: 1; } }\n@keyframes pptx-tr-ripple-in-ld { from { clip-path: circle(0% at 0% 100%); opacity: 0.5; } 30% { clip-path: circle(20% at 0% 100%); opacity: 0.7; } 60% { clip-path: circle(55% at 0% 100%); opacity: 0.9; } to { clip-path: circle(150% at 0% 100%); opacity: 1; } }\n@keyframes pptx-tr-ripple-in-rd { from { clip-path: circle(0% at 100% 100%); opacity: 0.5; } 30% { clip-path: circle(20% at 100% 100%); opacity: 0.7; } 60% { clip-path: circle(55% at 100% 100%); opacity: 0.9; } to { clip-path: circle(150% at 100% 100%); opacity: 1; } }\n\n\n@keyframes pptx-tr-glitter-diamond-in-l { from { opacity: 0; transform: translateX(-6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateX(-2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0); } }\n@keyframes pptx-tr-glitter-diamond-in-r { from { opacity: 0; transform: translateX(6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateX(2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0); } }\n@keyframes pptx-tr-glitter-diamond-in-u { from { opacity: 0; transform: translateY(-6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateY(-2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0); } }\n@keyframes pptx-tr-glitter-diamond-in-d { from { opacity: 0; transform: translateY(6%); filter: brightness(1.5) contrast(1.3) blur(2px); } 60% { opacity: 0.7; transform: translateY(2%); filter: brightness(1.2) contrast(1.1) blur(1px); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0); } }\n@keyframes pptx-tr-glitter-hexagon-in-l { from { opacity: 0; transform: translateX(-6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateX(-2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }\n@keyframes pptx-tr-glitter-hexagon-in-r { from { opacity: 0; transform: translateX(6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateX(2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateX(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }\n@keyframes pptx-tr-glitter-hexagon-in-u { from { opacity: 0; transform: translateY(-6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateY(-2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }\n@keyframes pptx-tr-glitter-hexagon-in-d { from { opacity: 0; transform: translateY(6%); filter: brightness(1.5) contrast(1.3) blur(2px) hue-rotate(20deg); } 60% { opacity: 0.7; transform: translateY(2%); filter: brightness(1.2) contrast(1.1) blur(1px) hue-rotate(8deg); } to { opacity: 1; transform: translateY(0); filter: brightness(1) contrast(1) blur(0) hue-rotate(0deg); } }\n";
14747
+ //#endregion
14748
+ //#region src/render/p14-transition-css.d.ts
14912
14749
  /**
14913
- * One File > Options setting, addressed as `<group>.<key>`, for example
14914
- * `general.userName` or `advanced.showGrid`. The union is derived from the
14915
- * `ViewerOptions` model itself, so a typo is a compile error.
14750
+ * Return CSS animation descriptors for p14 transition types. Returns
14751
+ * `undefined` when the type is not a p14 transition.
14752
+ */
14753
+ declare function getP14TransitionAnimations(type: PptxTransitionType, durationMs: number, direction: string | undefined, orient?: string | undefined, pattern?: string | undefined): SlideTransitionAnimations | undefined;
14754
+ /**
14755
+ * A font supplied by the host application. The package never ships fonts:
14756
+ * applications provide a licensed URL, data URL, or blob URL for their users.
14757
+ */
14758
+ interface ViewerFontSource {
14759
+ family: string;
14760
+ src: string;
14761
+ format?: 'truetype' | 'opentype' | 'woff' | 'woff2';
14762
+ weight?: string | number;
14763
+ style?: 'normal' | 'italic';
14764
+ }
14765
+ interface SlideSizeEmu {
14766
+ widthEmu: number;
14767
+ heightEmu: number;
14768
+ /** ST_SlideSizeType token, or `''` for a size with no preset. */
14769
+ type: string;
14770
+ }
14771
+ //#endregion
14772
+ //#region src/render/presentation-file-kinds.d.ts
14773
+ /**
14774
+ * presentation-file-kinds: the one place that answers "can the viewer open
14775
+ * this file?" and "what should the saved copy be called?".
14776
+ *
14777
+ * ## Why this is a shared decision and not five allow-lists
14778
+ *
14779
+ * The loader reads more formats than any single UI advertises. Legacy binary
14780
+ * `.ppt` (PowerPoint 97-2003) is the sharp example: `PptxHandler.load()` has
14781
+ * detected the OLE compound-file container and converted the binary deck
14782
+ * through the regular pptx pipeline for some time, but the product kept saying
14783
+ * it was unsupported, and a picker that filters the extension out makes a
14784
+ * working loader unreachable in practice. Whenever the loader learns a format,
14785
+ * exactly one list has to change.
14786
+ *
14787
+ * ## Read many, write several
14788
+ *
14789
+ * Input is a superset of output. We READ `.pptx`, `.ppsx`, `.pptm`, `.potx`,
14790
+ * legacy binary `.ppt` and portable `pptx-viewer-json`; we WRITE the OpenXML
14791
+ * family plus legacy binary `.ppt` (via `packages/core/src/core/ppt/writer/`,
14792
+ * a real MS-PPT/OLE2 encoder, not a stub). `savedPresentationFileName`
14793
+ * REPLACES the source extension with the extension of the format actually
14794
+ * being written rather than keeping the source's: a deck opened as
14795
+ * `report.pptx` and saved back as `.ppt` (or vice versa) must have its name
14796
+ * agree with its bytes, which is the kind of mismatch PowerPoint itself
14797
+ * refuses to open.
14798
+ *
14799
+ * This module deliberately imports nothing, so any layer (render, export, a
14800
+ * binding, a host app) can depend on it without risking an import cycle.
14801
+ *
14802
+ * @module render/presentation-file-kinds
14803
+ */
14804
+ /**
14805
+ * Extensions the built-in file picker offers, in the order it offers them.
14806
+ *
14807
+ * `.ppt` is in the list because the loader genuinely handles it, not as a
14808
+ * courtesy: see `packages/core/src/core/ppt/` and the `ppt-import` integration
14809
+ * suite, which asserts a `.ppt` loads to the same model as the `.pptx` it was
14810
+ * exported from.
14811
+ */
14812
+ declare const PRESENTATION_OPEN_EXTENSIONS: readonly ['.pptx', '.ppsx', '.pptm', '.potx', '.ppt', '.json'];
14813
+ /** Comma-separated `accept` attribute for a presentation file input. */
14814
+ declare const PPTX_OPEN_ACCEPT: string;
14815
+ /**
14816
+ * True when a picked / dropped file's name looks like something the loader can
14817
+ * open. Use this instead of a hand-rolled `endsWith` chain: a drop handler that
14818
+ * disagrees with the picker's `accept` list is a format that is supported by
14819
+ * mouse but not by drag, which is how `.ppt` stayed invisible.
14820
+ *
14821
+ * Extension-only, by design. The real answer comes from the container sniff in
14822
+ * `PptxHandler.load()`; this is only the cheap pre-filter a drop target needs
14823
+ * before it hands bytes to the loader.
14824
+ */
14825
+ declare function isSupportedPresentationFile(name: string | null | undefined): boolean;
14826
+ /**
14827
+ * True for the binary PowerPoint 97-2003 family. `.ppt` itself is now also a
14828
+ * SAVE target (see {@link SavedPresentationFormat}); `.pps`/`.pot` (97-2003
14829
+ * show/template) remain read-only siblings sharing the same record format.
14830
+ */
14831
+ declare function isLegacyBinaryPresentation(name: string | null | undefined): boolean;
14832
+ /** The formats the save path can produce. */
14833
+ type SavedPresentationFormat = 'pptx' | 'ppsx' | 'pptm' | 'ppt';
14834
+ /**
14835
+ * The stem of a presentation file name: directories and any loadable extension
14836
+ * removed. `C:\decks\report.ppt` becomes `report`; a name with no recognised
14837
+ * extension is kept whole, so `Untitled Presentation` survives intact rather
14838
+ * than losing everything after its last dot.
14839
+ */
14840
+ declare function presentationBaseName(sourceName: string | null | undefined, fallback?: string): string;
14841
+ /**
14842
+ * The name a saved copy should be offered under: the source stem plus the
14843
+ * extension of the format actually being written.
14844
+ *
14845
+ * This is what turns `report.ppt` into `report.pptx` on a regular Save As,
14846
+ * and `report.pptx` into `report.ppt` when the user explicitly picks the
14847
+ * PowerPoint 97-2003 format. Keeping the source extension would mislabel the
14848
+ * bytes either way.
14849
+ */
14850
+ declare function savedPresentationFileName(sourceName: string | null | undefined, format?: SavedPresentationFormat): string;
14851
+ //#endregion
14852
+ //#region src/render/session-restore.d.ts
14853
+ /**
14854
+ * session-restore: keep the deck a host app has open across a page refresh.
14855
+ *
14856
+ * A host (the demo apps, or any embedder) owns the bytes it hands to the
14857
+ * viewer, so a plain reload drops them and the user lands back on the file
14858
+ * dropzone with their presentation gone. This store remembers the open deck in
14859
+ * IndexedDB and hands it back on the next load.
14860
+ *
14861
+ * Scope is deliberately per-tab: the record is keyed by an id kept in
14862
+ * `sessionStorage`, which survives a reload but NOT a new tab. Refreshing
14863
+ * restores the deck this tab had open, while a second tab opened on the same
14864
+ * origin still starts on the landing page, and two tabs holding different decks
14865
+ * never steal each other's content.
14866
+ *
14867
+ * `restoreSessionDeck` additionally prefers a NEWER autosave snapshot for the
14868
+ * same file (see `./autosave-store`), so a refresh mid-edit comes back with the
14869
+ * edited deck rather than the pristine bytes that were first opened.
14870
+ *
14871
+ * Every operation is best-effort: a blocked IndexedDB, a partitioned
14872
+ * `sessionStorage`, or an exhausted quota degrades to "no restore", never to a
14873
+ * thrown error in the host.
14874
+ */
14875
+ /** A deck remembered for the current tab. */
14876
+ interface SessionDeck {
14877
+ /** File name the deck was opened under, used as the autosave key. */
14878
+ fileName: string;
14879
+ /** The presentation bytes. */
14880
+ data: Uint8Array;
14881
+ /** When these bytes were remembered (epoch ms). */
14882
+ timestamp: number;
14883
+ }
14884
+ /**
14885
+ * This tab's session id, or `null` when `sessionStorage` is unavailable (a
14886
+ * sandboxed iframe, or a browser with storage disabled).
14887
+ *
14888
+ * @param create Mint and persist an id when the tab does not have one yet.
14889
+ * Reads pass `false` so a fresh tab never claims another tab's record.
14916
14890
  */
14917
- type OptionsSettingId = { [G in ViewerOptionsGroupId]: `${G}.${PrimitiveKeys<ViewerOptions[G]>}`; }[ViewerOptionsGroupId];
14891
+ declare function getSessionTabId(create?: boolean): string | null;
14918
14892
  /**
14919
- * A File > Options page: the ten PowerPoint categories plus `ai`, the AI
14920
- * assistant page a binding adds when the host configured an assistant.
14893
+ * Remember `data` as the deck this tab has open, so the next load can restore
14894
+ * it. Resolves `false` when the browser refused to store it; callers treat that
14895
+ * as "no restore available later", never as an error.
14921
14896
  */
14922
- type OptionsPageId = ViewerOptionsTabId | 'ai';
14897
+ declare function rememberSessionDeck(fileName: string, data: Uint8Array): Promise<boolean>;
14898
+ /** The deck remembered for this tab, or `null` when there is nothing to restore. */
14899
+ declare function loadSessionDeck(): Promise<SessionDeck | null>;
14900
+ /** Forget this tab's deck (the host closed it, or handed the tab to another flow). */
14901
+ declare function forgetSessionDeck(): Promise<void>;
14923
14902
  /**
14924
- * One section of an Options page, addressed as `<page>.<section>`, for
14925
- * example `general.personalize` or `advanced.print`. The full list is
14926
- * `OPTIONS_SECTION_IDS` (derived from the schema at runtime).
14903
+ * The deck to reopen on load: this tab's remembered bytes, upgraded to a newer
14904
+ * autosave snapshot of the same file when the viewer wrote one after they were
14905
+ * remembered. Without that upgrade a refresh mid-edit would silently roll the
14906
+ * presentation back to the state it was opened in.
14927
14907
  */
14928
- type OptionsSectionId = `${ViewerOptionsTabId}.${string}`;
14929
- /** Values a host forces onto settings. */
14930
- type OptionsSettingValues = Partial<Record<OptionsSettingId, ViewerOptionPrimitive>>;
14931
- /** Ribbon and toolbar customisation. */
14932
- interface RibbonCustomization {
14933
- /**
14934
- * Ribbon tabs to remove (the File tab included, unlike Customize Ribbon),
14935
- * and contextual tabs (`shapeFormat`, `pictureFormat`, ...) that should
14936
- * never appear.
14937
- */
14938
- hiddenTabs?: readonly (ToolbarTabId | RibbonContextualTabId)[];
14939
- /** Groups inside a tab to remove, as `<tab>.<group>` (`home.font`). */
14940
- hiddenGroups?: readonly RibbonGroupId[];
14908
+ declare function restoreSessionDeck(): Promise<SessionDeck | null>;
14909
+ /** Optional seed values for the share start form. */
14910
+ interface ShareDefaults {
14911
+ roomId?: string;
14912
+ userName?: string;
14913
+ serverUrl?: string;
14914
+ }
14915
+ //#endregion
14916
+ //#region src/render/presentation-session-types.d.ts
14917
+ interface PresentationSnapshot {
14918
+ slideIndex: number;
14919
+ buildStep: number;
14920
+ sequence: number;
14921
+ blackout: 'none' | 'black' | 'white';
14922
+ paused: boolean;
14923
+ elapsedMs: number;
14924
+ zoom?: PresentationZoomState;
14925
+ pointer?: PresentationPointerState;
14926
+ inkStrokes?: PresentationInkStroke[];
14941
14927
  /**
14942
- * Controls to remove: a top-level toolbar button / control cluster
14943
- * (`share`, `zoom`, ...) or any ribbon control as
14944
- * `<tab>.<group>.<control>` (`home.font.bold`).
14928
+ * Whether ink markup is drawn (PowerPoint's Ctrl+M). Undefined means visible,
14929
+ * so existing snapshots keep showing their ink. Hiding never discards the
14930
+ * strokes, which stay in `inkStrokes` and can be kept on exit.
14945
14931
  */
14946
- hiddenButtons?: readonly (ToolbarButtonId | RibbonControlId)[];
14932
+ inkMarkupVisible?: boolean;
14933
+ caption?: string;
14934
+ subtitlesVisible?: boolean;
14947
14935
  }
14948
- /** File > Options (the Settings dialog) customisation. */
14949
- interface OptionsCustomization {
14950
- /** Whole pages to remove from the dialog's category rail. */
14951
- hiddenPages?: readonly OptionsPageId[];
14952
- /** Sections (`<page>.<section>`) to remove from their page. */
14953
- hiddenSections?: readonly OptionsSectionId[];
14954
- /** Individual settings (`<group>.<key>`) to remove wherever they appear. */
14955
- hiddenSettings?: readonly OptionsSettingId[];
14936
+ interface PresentationZoomState {
14937
+ scale: number;
14938
+ originX: number;
14939
+ originY: number;
14940
+ }
14941
+ type PresentationPointerTool = 'none' | 'laser' | 'pen' | 'highlighter' | 'eraser';
14942
+ interface PresentationPointerState {
14943
+ tool: PresentationPointerTool;
14944
+ x: number;
14945
+ y: number;
14946
+ color: string;
14947
+ }
14948
+ interface PresentationInkPoint {
14949
+ x: number;
14950
+ y: number;
14951
+ }
14952
+ interface PresentationInkStroke {
14953
+ id: string;
14954
+ slideIndex: number;
14955
+ tool: 'pen' | 'highlighter';
14956
+ color: string;
14957
+ width: number;
14958
+ points: PresentationInkPoint[];
14959
+ }
14960
+ declare function parsePresentationSessionId(hash: string): string | null;
14961
+ declare function loadPresentationDeck(sessionId: string): Promise<Uint8Array | null>;
14962
+ //#endregion
14963
+ //#region src/render/presentation-blackboard.d.ts
14964
+ /** Blackout state, as carried by {@link PresentationSnapshot}. */
14965
+ type PresentationBlackout = PresentationSnapshot['blackout'];
14966
+ //#endregion
14967
+ //#region src/render/paste-special.d.ts
14968
+ /** The four paste formats PowerPoint's Paste Options / Paste Special offer. */
14969
+ type PasteSpecialFormat = 'keep-source-formatting' | 'use-destination-theme' | 'picture' | 'keep-text-only';
14970
+ //#endregion
14971
+ //#region src/render/alignment-guides.d.ts
14972
+ /** A single alignment guide, positioned in authored slide pixels. */
14973
+ interface Guide {
14974
+ id: string;
14975
+ axis: 'h' | 'v';
14976
+ position: number;
14977
+ }
14978
+ //#endregion
14979
+ //#region src/render/ink-drawing.d.ts
14980
+ /** A 2D point in stage-local coordinates. */
14981
+ interface InkPoint {
14982
+ x: number;
14983
+ y: number;
14956
14984
  /**
14957
- * Settings pinned to a fixed value. The value is forced into the options
14958
- * store, user edits to it are ignored, and the control renders read-only.
14959
- * Add the id to `hiddenSettings` too to lock it invisibly.
14985
+ * Pointer pressure at this point, from `PointerEvent.pressure` (0..1).
14986
+ * Optional: a binding that has not wired pressure capture simply omits
14987
+ * it, and {@link strokeToInkElement} falls back to
14988
+ * {@link DEFAULT_POINTER_PRESSURE}, the constant value mice and other
14989
+ * non-pressure-aware devices report, which reads as "no real pressure
14990
+ * data".
14960
14991
  */
14961
- locked?: OptionsSettingValues;
14992
+ pressure?: number;
14962
14993
  /**
14963
- * Host defaults: the value a setting starts at when the user has not saved
14964
- * a choice of their own. "Reset" returns to these, not to the built-ins.
14994
+ * Pen-tilt lean, in degrees, from `PointerEvent.tiltX`/`tiltY` on
14995
+ * supporting hardware (a mouse, or a stylus with no tilt sensor, reports a
14996
+ * constant 0). Optional and always captured as a pair: a binding that has
14997
+ * not wired tilt capture simply omits both, and {@link strokeToInkElement}
14998
+ * treats a constant `(0, 0)` reading the same way it treats a constant
14999
+ * pressure, i.e. as "no real tilt data" rather than authoring a channel
15000
+ * for it.
14965
15001
  */
14966
- defaults?: OptionsSettingValues;
15002
+ tiltX?: number;
15003
+ tiltY?: number;
14967
15004
  }
14968
- /** File tab (backstage) customisation. */
14969
- interface BackstageCustomization {
14970
- /** Navigation entries (pages) to remove from the File tab. */
14971
- hiddenPages?: readonly BackstagePage[];
14972
- /** Action cards to remove from the pages that show them. */
14973
- hiddenCards?: readonly BackstageCardId[];
15005
+ /** Options for {@link strokeToInkElement}. */
15006
+ interface StrokeToInkElementOpts {
15007
+ points: InkPoint[];
15008
+ color: string;
15009
+ width: number;
15010
+ tool: 'pen' | 'highlighter' | 'freeform';
14974
15011
  }
14975
- /** Right-click menu customisation. */
14976
- interface ContextMenuCustomization {
14977
- /** Entries to remove from the element (right-click on a shape) menu. */
14978
- hiddenElementCommands?: readonly ContextMenuCommandId[];
14979
- /** Entries to remove from the empty-canvas menu. */
14980
- hiddenCanvasCommands?: readonly CanvasContextMenuCommandId[];
15012
+ //#endregion
15013
+ //#region src/render/mobile-chrome.d.ts
15014
+ /**
15015
+ * Pure helper logic for mobile chrome state, shared by every binding.
15016
+ *
15017
+ * These helpers capture the sheet open/close state machine that governs which
15018
+ * sheet is visible at any given time and which bottom-bar button appears active.
15019
+ * Keeping this logic as pure functions makes it straightforward to test and
15020
+ * trivial to adapt when each binding wires the components together.
15021
+ */
15022
+ /** All mobile sheets that can be open at one time. */
15023
+ type MobileSheetKey = 'slides' | 'menu' | 'insert' | 'inspector' | 'comments' | 'notes' | null;
15024
+ //#endregion
15025
+ //#region src/render/gradient-picker.d.ts
15026
+ /** A single gradient stop, mirroring the ShapeStyle array item shape. */
15027
+ interface GradientStop {
15028
+ color: string;
15029
+ position: number;
15030
+ opacity?: number;
14981
15031
  /**
14982
- * Entries to remove from the Edit Points menu (right-click a vertex or a
14983
- * segment while editing a shape's points).
15032
+ * Theme colour identity for this stop, mirroring
15033
+ * `ShapeStyle.fillColorRef`. Set by a theme-swatch pick so the stop keeps
15034
+ * following the theme after a later theme change; cleared by a custom hex
15035
+ * pick, which has no theme identity.
14984
15036
  */
14985
- hiddenEditPointsCommands?: readonly EditPointsCommandId[];
14986
- /** Remove the element context menu entirely. */
14987
- disableElementMenu?: boolean;
14988
- /** Remove the empty-canvas context menu entirely. */
14989
- disableCanvasMenu?: boolean;
15037
+ colorRef?: PptxThemeColorRef;
14990
15038
  }
15039
+ /** The editable gradient state surfaced to the component. */
15040
+ interface GradientState {
15041
+ type: 'linear' | 'radial';
15042
+ /** Angle in degrees (only meaningful for linear). */
15043
+ angle: number;
15044
+ stops: GradientStop[];
15045
+ }
15046
+ //#endregion
15047
+ //#region src/render/insert-chart.d.ts
14991
15048
  /**
14992
- * A shortcut chord in the form `Mod+Shift+D`: modifiers `Mod` (Ctrl on
14993
- * Windows/Linux, Cmd on macOS), `Ctrl`, `Meta`, `Alt`, `Shift`, joined by `+`,
14994
- * followed by a `KeyboardEvent.key` value (`D`, `Delete`, `ArrowLeft`, `F2`).
15049
+ * Dropdown ids for the insert-chart menu. Distinct from `PptxChartType`
15050
+ * because PowerPoint offers Column (vertical) and Bar (horizontal) as two
15051
+ * entries over the same underlying `'bar'` chart type, and because `'pareto'`
15052
+ * has no `PptxChartType` of its own: it is a dropdown entry that resolves to
15053
+ * `type: 'histogram'` (see docs/guide/limitations.md's ChartEx row) with a
15054
+ * frequency-plus-cumulative-percentage default shape. The other six ChartEx
15055
+ * ids (`histogram` through `regionMap`) map one-to-one onto their chart type.
14995
15056
  */
14996
- type ShortcutChord = string;
14997
- /** Editor keyboard-shortcut customisation. */
14998
- interface KeyboardCustomization {
14999
- /** Turn every editor shortcut off (the host owns the keyboard). */
15000
- disableAll?: boolean;
15001
- /** Editor commands whose shortcut is turned off. */
15002
- disabled?: readonly EditorKeyActionName[];
15003
- /**
15004
- * Replacement chords per command. A remapped command no longer answers to
15005
- * its built-in chord; it answers to the chord(s) given here instead.
15006
- */
15007
- remap?: Partial<Record<EditorKeyActionName, ShortcutChord | readonly ShortcutChord[]>>;
15057
+ type InsertChartKind = 'column' | 'bar' | 'line' | 'pie' | 'doughnut' | 'area' | 'scatter' | 'histogram' | 'pareto' | 'funnel' | 'treemap' | 'sunburst' | 'boxWhisker' | 'regionMap';
15058
+ /** In-memory clipboard payload stored when an element is copied or cut. */
15059
+ interface ElementClipboardPayload {
15060
+ element: PptxElement;
15061
+ isTemplate: boolean;
15008
15062
  }
15063
+ //#endregion
15064
+ //#region src/render/image-file-insertion.d.ts
15009
15065
  /**
15010
- * Chrome regions a host can remove. Each id maps onto one region in every
15011
- * binding; see `VIEWER_PANEL_IDS` for the catalogue.
15066
+ * Decode a local image File/Blob into a centred element, fitting the slide
15067
+ * without upscaling. Dimensions are slide pixels; image bytes are preserved.
15068
+ *
15069
+ * Resolves null for unsupported/unreadable images, invalid bounds, cancellation,
15070
+ * or unavailable browser APIs. Importing this module is safe outside a browser.
15071
+ * No slide, selection, history, clipboard, or network state is changed. The
15072
+ * caller must still validate its document/slide destination before committing.
15073
+ */
15074
+ declare function createImageElementFromFile(file: Blob, canvasSize: CanvasSize, signal?: AbortSignal): Promise<ImagePptxElement | null>;
15075
+ //#endregion
15076
+ //#region src/render/shape-preset-catalog.d.ts
15077
+ /**
15078
+ * shape-preset-catalog.ts: the Insert > Shape picker catalogue shared by every
15079
+ * binding's toolbar/inspector.
15080
+ *
15081
+ * Pure data: each entry carries the preset geometry `type` (OOXML `a:prstGeom`
15082
+ * value the editor can insert), an English fallback `label`, the shared-i18n
15083
+ * `i18nKey`, and a framework-neutral icon descriptor ({@link ShapePresetGlyph}
15084
+ * name + optional utility-class modifier for rotation/skew). Each binding maps
15085
+ * the glyph name onto its own icon component/SVG.
15086
+ *
15087
+ * Order matters: bindings surface the first 12 entries as the quick "top
15088
+ * shapes" row, so new presets should be appended, not inserted.
15089
+ *
15090
+ * @module render/shape-preset-catalog
15012
15091
  */
15013
- type ViewerPanelId = 'statusBar' | 'slidesPane' | 'inspector' | 'notes' | 'quickAccessToolbar' | 'titleBar';
15014
- /** Feature areas that can be switched off as a whole. */
15015
- type ViewerFeatureId = 'ai' | 'collaboration' | 'comments' | 'presentMode' | 'editPoints';
15092
+ /** Shape preset geometry types offered by the insert picker. */
15093
+ type ShapePresetType = 'rect' | 'roundRect' | 'ellipse' | 'cylinder' | 'rtArrow' | 'leftArrow' | 'upArrow' | 'downArrow' | 'triangle' | 'rtTriangle' | 'diamond' | 'parallelogram' | 'trapezoid' | 'pentagon' | 'hexagon' | 'octagon' | 'chevron' | 'star5' | 'star6' | 'star8' | 'plus' | 'heart' | 'cloud' | 'sun' | 'moon' | 'pie' | 'plaque' | 'teardrop' | 'line' | 'connector';
15094
+ //#endregion
15095
+ //#region src/render/zoom-return-navigation.d.ts
15016
15096
  /**
15017
- * The click-to-place drawing tools of Insert > Shapes > Lines: Freeform:
15018
- * Shape and Curve.
15097
+ * The navigation-relevant fields of a Zoom click target, independent of
15098
+ * `zoomType`.
15099
+ *
15100
+ * `returnToParent` is already resolved to its EFFECTIVE value here (not the
15101
+ * raw, possibly-`undefined` `ZoomPptxElement`/`SummaryZoomTarget` field):
15102
+ * `CT_ZoomObjectProperties/@returnToParent` (MS-PPTX) is `<xsd:attribute
15103
+ * name="returnToParent" type="xsd:boolean" use="optional" default="true"/>`,
15104
+ * so an ABSENT attribute means true, not false. Core deliberately stores
15105
+ * `undefined` rather than fabricating `true` (so a round-trip never invents
15106
+ * an attribute the source never had), which makes `Boolean(x)` the wrong way
15107
+ * to read it; the two `resolve*NavigationTarget` functions below are the only
15108
+ * place that distinction should be made.
15019
15109
  */
15020
- type ViewerDrawingToolId = FreeformToolKind;
15021
- /** Dialogs (and the entry points that open them) a host can remove. */
15022
- type ViewerDialogId = 'options' | 'share' | 'broadcast' | 'print' | 'export';
15023
- /** Export formats offered by the File > Export page. */
15024
- type ViewerExportFormatId = 'pdf' | 'png' | 'video' | 'gif' | 'json' | 'copyImage';
15110
+ interface ZoomNavigationTarget {
15111
+ targetSlideIndex: number;
15112
+ targetSectionId?: string;
15113
+ returnToParent: boolean;
15114
+ transitionDurationMs?: number;
15115
+ }
15116
+ interface AutosaveRecord {
15117
+ key: string;
15118
+ data: Uint8Array;
15119
+ timestamp: number;
15120
+ size: number;
15121
+ }
15122
+ //#endregion
15123
+ //#region src/render/master-view-crud.d.ts
15124
+ /** One Slide Master view sidebar command. */
15125
+ type MasterViewCrudActionId = 'addLayout' | 'duplicateLayout' | 'deleteLayout' | 'renameLayout' | 'addMaster' | 'duplicateMaster' | 'deleteMaster' | 'renameMaster';
15126
+ /** A framework-neutral descriptor for one sidebar button. */
15127
+ interface MasterViewCrudAction {
15128
+ id: MasterViewCrudActionId;
15129
+ /** i18n key for the button label (`pptx.masterView.<id>`). */
15130
+ labelKey: string;
15131
+ enabled: boolean;
15132
+ /** i18n key explaining why the button is disabled, set only when it is. */
15133
+ disabledReasonKey?: string;
15134
+ }
15135
+ //#endregion
15136
+ //#region src/export/handout-layout.d.ts
15025
15137
  /**
15026
- * The whole customisation object. Every field is optional; omitted fields hide
15027
- * nothing and lock nothing.
15138
+ * Pure handout layout calculations, shared by every binding's print path.
15139
+ *
15140
+ * Handles distributing slides across pages, computing grid dimensions, and
15141
+ * positioning cells within A4 page space. No DOM/framework dependency: callers
15142
+ * render the resulting rectangles however their view layer prefers.
15028
15143
  */
15029
- interface ViewerCustomization {
15030
- ribbon?: RibbonCustomization;
15031
- options?: OptionsCustomization;
15032
- backstage?: BackstageCustomization;
15033
- contextMenu?: ContextMenuCustomization;
15034
- keyboard?: KeyboardCustomization;
15035
- /** Chrome regions to remove (`true` hides). */
15036
- hiddenPanels?: readonly ViewerPanelId[];
15037
- /** Feature areas to switch off (their buttons, menus, pages and panels). */
15038
- disabledFeatures?: readonly ViewerFeatureId[];
15039
- /** Dialogs to remove, along with every entry point that opens them. */
15040
- hiddenDialogs?: readonly ViewerDialogId[];
15041
- /** Export formats to remove from File > Export. */
15042
- hiddenExportFormats?: readonly ViewerExportFormatId[];
15043
- /** Drawing tools to remove from the Insert > Shapes gallery. */
15044
- hiddenDrawingTools?: readonly ViewerDrawingToolId[];
15144
+ /** Supported slides-per-page values. */
15145
+ type HandoutSlidesPerPage = 1 | 2 | 3 | 4 | 6 | 9;
15146
+ //#endregion
15147
+ //#region src/export/print-document.d.ts
15148
+ /** What to print. */
15149
+ type PrintWhat = 'slides' | 'handouts' | 'notes' | 'outline';
15150
+ /** Page orientation for the printed output. */
15151
+ type PrintOrientation = 'portrait' | 'landscape';
15152
+ /** Colour mode for the printed output. */
15153
+ type PrintColorMode = 'color' | 'grayscale' | 'blackAndWhite';
15154
+ /** Slide range mode. */
15155
+ type PrintSlideRange = 'all' | 'current' | 'custom';
15156
+ /** Resolved print settings emitted on confirm. */
15157
+ interface PrintSettings {
15158
+ printWhat: PrintWhat;
15159
+ orientation: PrintOrientation;
15160
+ colorMode: PrintColorMode;
15161
+ frameSlides: boolean;
15162
+ slidesPerPage: HandoutSlidesPerPage;
15163
+ slideRange: PrintSlideRange;
15164
+ customRangeFrom: number;
15165
+ customRangeTo: number;
15166
+ /**
15167
+ * PowerPoint's Print > "Scale to Fit Paper". `true` (the default, and the
15168
+ * only behavior this printed output ever had before this field existed)
15169
+ * shrinks/grows each slide image to fill its page/cell while preserving
15170
+ * aspect ratio. `false` prints at the slide's native pixel size instead,
15171
+ * which may overflow or under-fill the page, exactly like PowerPoint with
15172
+ * the option off. Optional so existing `Partial<PrintSettings>` literals
15173
+ * across every binding keep compiling; `validatePrintSettings` defaults it
15174
+ * to `true`.
15175
+ */
15176
+ scaleToFit?: boolean;
15045
15177
  }
15046
15178
  //#endregion
15047
15179
  //#region src/render/options/viewer-options-constraints.d.ts
@@ -15104,126 +15236,31 @@ interface ViewerOptionsStore {
15104
15236
  /** True when the host locked `<group>.<key>`. */
15105
15237
  isLocked(group: ViewerOptionsGroupId, key: string): boolean;
15106
15238
  }
15107
- //#endregion
15108
- //#region src/render/customization/customization-catalog.d.ts
15109
- declare const RIBBON_TAB_IDS: readonly ToolbarTabId[];
15110
- declare const TOOLBAR_BUTTON_IDS: readonly ["share", "broadcast", "export", "undo", "redo", "record", "notes", "fullscreen", "zoom", "navigation", "mergeShapes", "crop"];
15111
- declare const OPTIONS_PAGE_IDS: readonly OptionsPageId[];
15112
- declare const OPTIONS_SECTION_IDS: readonly OptionsSectionId[];
15113
- declare const OPTIONS_SETTING_IDS: readonly OptionsSettingId[];
15114
- declare const BACKSTAGE_PAGE_IDS: readonly BackstagePage[];
15115
- declare const BACKSTAGE_CARD_IDS: readonly BackstageCardId[];
15116
- declare const ELEMENT_CONTEXT_MENU_COMMAND_IDS: readonly ["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", "merge-union", "merge-combine", "merge-fragment", "merge-intersect", "merge-subtract", "save-as-picture", "edit-alt-text", "size-and-position", "format-shape", "delete"];
15117
- declare const CANVAS_CONTEXT_MENU_COMMAND_IDS: readonly ["paste", "layout", "reset-slide", "format-background", "grid-and-guides", "ruler"];
15118
- declare const EDITOR_SHORTCUT_ACTION_IDS: readonly ["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"];
15119
- declare const VIEWER_PANEL_IDS: readonly ["statusBar", "slidesPane", "inspector", "notes", "quickAccessToolbar", "titleBar"];
15120
- declare const VIEWER_FEATURE_IDS: readonly ["ai", "collaboration", "comments", "presentMode", "editPoints"];
15121
- declare const VIEWER_DIALOG_IDS: readonly ["options", "share", "broadcast", "print", "export"];
15122
- declare const VIEWER_EXPORT_FORMAT_IDS: readonly ["pdf", "png", "video", "gif", "json", "copyImage"];
15123
- //#endregion
15124
- //#region src/render/customization/customization-keymap.d.ts
15125
- /** A parsed `Mod+Shift+D` chord. */
15126
- interface ParsedShortcutChord {
15127
- key: string;
15128
- mod: boolean;
15129
- ctrl: boolean;
15130
- meta: boolean;
15131
- alt: boolean;
15132
- shift: boolean;
15133
- }
15134
- /** The normalised keyboard slice of a resolved customisation. */
15135
- interface ResolvedKeyboardCustomization {
15136
- disableAll: boolean;
15137
- disabled: ReadonlySet<EditorKeyActionName>;
15138
- remap: ReadonlyMap<EditorKeyActionName, readonly ParsedShortcutChord[]>;
15139
- }
15140
- //#endregion
15141
- //#region src/render/customization/customization-resolve.d.ts
15142
- /** The normalised, set-based view of a customisation. Treat as immutable. */
15143
- interface ResolvedCustomization {
15144
- hiddenActions: ReadonlySet<ToolbarActionId>;
15145
- /** Contextual tabs (`shapeFormat`, ...) the host never wants shown. */
15146
- hiddenContextualTabs: ReadonlySet<RibbonContextualTabId>;
15147
- /** Catalogued ribbon groups to hide (`ribbon.hiddenGroups`). */
15148
- hiddenRibbonGroups: ReadonlySet<RibbonGroupId>;
15149
- /** Catalogued ribbon controls to hide (the `<tab>.<group>.<control>` part of `ribbon.hiddenButtons`). */
15150
- hiddenRibbonControls: ReadonlySet<RibbonControlId>;
15151
- hiddenOptionsPages: ReadonlySet<OptionsPageId>;
15152
- hiddenOptionsSections: ReadonlySet<OptionsSectionId>;
15153
- hiddenSettings: ReadonlySet<OptionsSettingId>;
15154
- lockedSettings: OptionsSettingValues;
15155
- defaultSettings: OptionsSettingValues;
15156
- hiddenBackstagePages: ReadonlySet<BackstagePage>;
15157
- hiddenBackstageCards: ReadonlySet<BackstageCardId>;
15158
- hiddenElementCommands: ReadonlySet<ContextMenuCommandId>;
15159
- hiddenCanvasCommands: ReadonlySet<CanvasContextMenuCommandId>;
15160
- hiddenEditPointsCommands: ReadonlySet<EditPointsCommandId>;
15161
- hiddenDrawingTools: ReadonlySet<ViewerDrawingToolId>;
15162
- elementMenuEnabled: boolean;
15163
- canvasMenuEnabled: boolean;
15164
- hiddenPanels: ReadonlySet<ViewerPanelId>;
15165
- disabledFeatures: ReadonlySet<ViewerFeatureId>;
15166
- hiddenDialogs: ReadonlySet<ViewerDialogId>;
15167
- keyboard: ResolvedKeyboardCustomization;
15239
+ interface SubtitleSettings {
15240
+ spokenLanguage: string;
15168
15241
  }
15169
- //#endregion
15170
- //#region src/render/customization/customization-controller.d.ts
15171
- /** The imperative methods every binding's component handle exposes. */
15172
- interface ViewerCustomizationApi {
15173
- /** The current customisation object (a snapshot; do not mutate). */
15174
- getCustomization(): ViewerCustomization;
15175
- /** Replace the whole customisation. */
15176
- setCustomization(next: ViewerCustomization): void;
15177
- /** Merge a partial customisation (see `mergeCustomization`). */
15178
- updateCustomization(patch: ViewerCustomization): void;
15179
- /** Drop every customisation, back to the stock UI. */
15180
- resetCustomization(): void;
15181
- /** Hide a fixed tab, or stop a contextual tab (`shapeFormat`, ...) from appearing. */
15182
- hideRibbonTab(tab: ToolbarTabId | RibbonContextualTabId): void;
15183
- showRibbonTab(tab: ToolbarTabId | RibbonContextualTabId): void;
15184
- /** Hide a group inside a tab (`home.font`). */
15185
- hideRibbonGroup(group: RibbonGroupId): void;
15186
- showRibbonGroup(group: RibbonGroupId): void;
15187
- /** Hide a top-level toolbar button or any ribbon control (`home.font.bold`). */
15188
- hideToolbarButton(button: ToolbarButtonId | RibbonControlId): void;
15189
- showToolbarButton(button: ToolbarButtonId | RibbonControlId): void;
15190
- /** Alias of `hideToolbarButton` for a ribbon control id. */
15191
- hideRibbonControl(control: RibbonControlId): void;
15192
- showRibbonControl(control: RibbonControlId): void;
15193
- hideOptionsPage(page: OptionsPageId): void;
15194
- showOptionsPage(page: OptionsPageId): void;
15195
- hideOptionsSection(section: OptionsSectionId): void;
15196
- showOptionsSection(section: OptionsSectionId): void;
15197
- hideSetting(setting: OptionsSettingId): void;
15198
- showSetting(setting: OptionsSettingId): void;
15199
- /** Pin a setting to `value`; `hidden` also removes it from the dialog. */
15200
- lockSetting(setting: OptionsSettingId, value: ViewerOptionPrimitive, hidden?: boolean): void;
15201
- unlockSetting(setting: OptionsSettingId): void;
15202
- /** Set (or with `undefined`, clear) the host default for a setting. */
15203
- setSettingDefault(setting: OptionsSettingId, value: ViewerOptionPrimitive | undefined): void;
15204
- hideBackstagePage(page: BackstagePage): void;
15205
- showBackstagePage(page: BackstagePage): void;
15206
- hideBackstageCard(card: BackstageCardId): void;
15207
- showBackstageCard(card: BackstageCardId): void;
15208
- hideContextMenuCommand(command: ContextMenuCommandId): void;
15209
- showContextMenuCommand(command: ContextMenuCommandId): void;
15210
- hideCanvasContextMenuCommand(command: CanvasContextMenuCommandId): void;
15211
- showCanvasContextMenuCommand(command: CanvasContextMenuCommandId): void;
15212
- disableShortcut(action: EditorKeyActionName): void;
15213
- enableShortcut(action: EditorKeyActionName): void;
15214
- /** Move a command onto new chord(s); `undefined` restores the built-in chord. */
15215
- remapShortcut(action: EditorKeyActionName, chords: ShortcutChord | readonly ShortcutChord[] | undefined): void;
15216
- setPanelVisible(panel: ViewerPanelId, visible: boolean): void;
15217
- setFeatureEnabled(feature: ViewerFeatureId, enabled: boolean): void;
15218
- setDialogAvailable(dialog: ViewerDialogId, available: boolean): void;
15242
+ interface SubtitleSettingsLabels {
15243
+ title: string;
15244
+ language: string;
15245
+ browserLanguage: string;
15246
+ description: string;
15247
+ apply: string;
15248
+ cancel: string;
15219
15249
  }
15220
- interface ViewerCustomizationController {
15221
- /** The helper methods, ready to spread onto a component handle. */
15222
- readonly api: ViewerCustomizationApi;
15223
- /** The normalised view the render sites read. Stable until the next change. */
15224
- getResolved(): ResolvedCustomization;
15225
- /** Subscribe to every change; returns the unsubscribe function. */
15226
- subscribe(listener: () => void): () => void;
15250
+ /**
15251
+ * Optional hook point for hosts that want to wire a real sign-in flow into
15252
+ * File > Account. Disabled by default: the Account page renders nothing
15253
+ * extra unless a host explicitly opts in by passing `enabled: true`.
15254
+ * See docs/guide for wiring instructions.
15255
+ */
15256
+ interface AccountAuthConfig {
15257
+ enabled: boolean;
15258
+ onSignIn: () => void;
15259
+ signedInUser?: {
15260
+ name: string;
15261
+ email?: string;
15262
+ avatarUrl?: string;
15263
+ };
15227
15264
  }
15228
15265
  /**
15229
15266
  * What a gallery needs to know about the deck and the selection. Bindings
@@ -15381,6 +15418,31 @@ interface CropSession {
15381
15418
  /** Insets the picture did not carry at all (no `a:srcRect` opinion). */
15382
15419
  absentInsets: readonly (keyof CropInsets)[];
15383
15420
  }
15421
+ type ThemeEditorLabels = Record<string, string>;
15422
+ //#endregion
15423
+ //#region src/web-components/theme-editor.d.ts
15424
+ interface PptxUiThemeEditorElement extends HTMLElement {
15425
+ theme: PptxTheme | undefined;
15426
+ labels: ThemeEditorLabels;
15427
+ disabled: boolean;
15428
+ }
15429
+ declare global {
15430
+ interface HTMLElementTagNameMap {
15431
+ 'pptx-ui-theme-editor': PptxUiThemeEditorElement;
15432
+ }
15433
+ }
15434
+ //#endregion
15435
+ //#region src/web-components/subtitle-settings.d.ts
15436
+ interface PptxUiSubtitleSettingsElement extends HTMLElement {
15437
+ settings: SubtitleSettings;
15438
+ labels: SubtitleSettingsLabels;
15439
+ languageDisabled: boolean;
15440
+ }
15441
+ declare global {
15442
+ interface HTMLElementTagNameMap {
15443
+ 'pptx-ui-subtitle-settings': PptxUiSubtitleSettingsElement;
15444
+ }
15445
+ }
15384
15446
  //#endregion
15385
15447
  //#region src/web-components/select-value.d.ts
15386
15448
  /** Public DOM shape used by all bindings; the element is not a native select. */
@@ -15441,5 +15503,5 @@ interface TransitionOverlayParams {
15441
15503
  */
15442
15504
  declare function playTransitionOverlay(params: TransitionOverlayParams): () => void;
15443
15505
  //#endregion
15444
- export { KeyboardCustomization as $, defaultRadius as $n, PptxTagCollection as $r, TRANSITION_SPEED_DURATION_MS as $t, CssStyleMap as A, getP14TransitionAnimations as An, PptxCoreProperties as Ar, RibbonContextualTabId as At, ElementUpdateOptions as B, rememberSessionDeck as Bn, PptxLayoutPreview as Br, SLIDE_TRANSITION_KEYFRAMES_CSS as Bt, CollaborationTransport as C, ZoomNavigationTarget as Cn, PptxAnimationTrigger as Cr, RANDOM_ELIGIBLE_TYPES as Ct, ContextMenuCustomization as D, describeCollaborationShellState as Dn, PptxCommentAuthor as Dr, ResolvedCustomization as Dt, ContextMenuCommandId as E, createImageElementFromFile as En, PptxComment as Er, RemoteCursor as Et, ELEMENT_CONTEXT_MENU_COMMAND_IDS as F, loadPresentationDeck as Fn, PptxElementAnimation as Fr, RibbonGroupId as Ft, FreeformToolKind as G, resolveTransitionDurationMs as Gn, PptxSection as Gr, ShareDefaults as Gt, ExternalCollaborationSession as H, resolveDirection8 as Hn, PptxModifyVerifier as Hr, SavedPresentationFormat as Ht, EditorKeyActionName as I, loadSessionDeck as In, PptxEmbeddedFont as Ir, RibbonTransitionDraft as It, INSTANT as J, savedPresentationFileName as Jn, PptxSlideTransition as Jr, SlideSizeRescaleMode as Jt, GradientState as K, resolveWheelSpokeCount as Kn, PptxSlide as Kr, ShortcutChord as Kt, ElementAnimationState as L, overlayInlineTextSnapshot as Ln, PptxHandoutMaster as Lr, RulerUnit as Lt, DEFAULT_TRANSITION_DURATION_MS as M, getSlideTransitionAnimations as Mn, PptxCustomShow as Mr, RibbonCustomization as Mt, EASE as N, isLegacyBinaryPresentation as Nn, PptxData as Nr, RibbonGalleryApplyResult as Nt, CropElementUpdate as O, forgetSessionDeck as On, PptxCommentMention as Or, ResolvedDirection as Ot, EDITOR_SHORTCUT_ACTION_IDS as P, isSupportedPresentationFile as Pn, PptxElement as Pr, RibbonGalleryContext as Pt, InsertChartKind as Q, defaultCssVars as Qn, PptxTableData as Qr, TOOLBAR_BUTTON_IDS as Qt, ElementClipboardPayload as R, parsePresentationSessionId as Rn, PptxHeaderFooter as Rr, RunProgramNotice as Rt, CollaborationShellState as S, WHEEL_SPOKE_COUNTS as Sn, PptxAnimationTimingCurve as Sr, PrintSettings as St, ConnectionStatus as T, canInteractWithElement as Tn, PptxChartData as Tr, ReadOnlyRecommendation as Tt, ExternalCollaborationSnapshot as U, resolveOrientation as Un, PptxNotesMaster as Ur, SessionDeck as Ut, ExternalCollaborationAwareness as V, resolveDirection as Vn, PptxModernCommentAuthor as Vr, SanitizedPresence as Vt, FieldSubstitutionContext as W, resolveSlideTransition as Wn, PptxPresentationProperties as Wr, ShapePresetType as Wt, InlineTextEditSnapshot as X, ViewerTheme as Xn, PptxSmartArtNodeStyle as Xr, SlideTransitionAnimations as Xt, InlineListReadResult as Y, ThemeCatalogEntry as Yn, PptxSmartArtData as Yr, SlideTemplateId as Yt, InlineTextSelection as Z, ViewerThemeColors as Zn, PptxTableCellStyle as Zr, StrokeToInkElementOpts as Zt, ChartPartRef as _, ViewerOptionsStore as _n, PptxAnimationDirection as _r, PasteSpecialFormat as _t, AnimationGroup as a, PptxThemeOption as ai, VIEWER_EXPORT_FORMAT_IDS as an, MergeShapeOperation as ar, OPTIONS_SECTION_IDS as at, CollaborationLivePatcher as b, ViewportFitOptions as bn, PptxAnimationSequence as br, PresentationPointerTool as bt, BACKSTAGE_PAGE_IDS as c, ShapeStyle as ci, ViewerCustomization as cn, PptxSaveFormat as cr, OptionsPageId as ct, BackstagePage as d, SmartArtLayoutType as di, ViewerDialogId as dn, MasterViewTab as dr, OptionsSettingValues as dt, PptxTextStyleLevels as ei, TextAdvancedChanges as en, defaultThemeColors as er, MasterViewCrudAction as et, CANVAS_CONTEXT_MENU_COMMAND_IDS as f, TablePptxElement as fi, ViewerExportFormatId as fn, MediaPptxElement as fr, P14_TRANSITION_KEYFRAMES as ft, ChangeCaseMode as g, ViewerOptionPrimitive as gn, PptxAfterAnimationAction as gr, PRESENTATION_OPEN_EXTENSIONS as gt, CanvasSize as h, XmlObject as hi, ViewerMode as hn, ParsedTableStyleMap as hr, PPTX_OPEN_ACCEPT as ht, AlignEdge as i, PptxThemeFontScheme as ii, VIEWER_DIALOG_IDS as in, AccessibilityIssue as ir, OPTIONS_PAGE_IDS as it, DEFAULT_MORPH_DURATION_MS as j, getSessionTabId as jn, PptxCustomProperty as jr, RibbonControlId as jt, CropSession as k, getCinematicTransitionAnimations as kn, PptxCompatibilityWarning as kr, ResolvedDirection8 as kt, BackstageCardId as l, SmartArtColorScheme as li, ViewerCustomizationApi as ln, SvgExportOptions as lr, OptionsSectionId as lt, CanvasContextMenuCommandId as m, TextStyle as mi, ViewerFontSource as mn, OlePptxElement as mr, P14_TRANSITION_KEYFRAMES_ALL as mt, playTransitionOverlay as n, PptxThemeColorRef as ni, ToolbarButtonId as nn, vermilionDarkTheme as nr, MobileSheetKey as nt, AutosaveRecord as o, PptxTransitionType as oi, VIEWER_FEATURE_IDS as on, PptxHandler as or, OPTIONS_SETTING_IDS as ot, CINEMATIC_TRANSITION_KEYFRAMES as p, TextSegment as pi, ViewerFeatureId as pn, OleObjectType as pr, P14_TRANSITION_KEYFRAMES_2 as pt, Guide as q, restoreSessionDeck as qn, PptxSlideMaster as qr, SlideSizeEmu as qt, AccountAuthConfig as r, PptxThemeColorScheme as ri, ToolbarTabId as rn, vermilionLightTheme as rr, ModifyPasswordCheckResult as rt, BACKSTAGE_CARD_IDS as s, PptxViewProperties as si, VIEWER_PANEL_IDS as sn, PptxHandlerSaveOptions as sr, OptionsCustomization as st, TransitionOverlayParams as t, PptxTheme as ti, ToolbarActionId as tn, themeToCssVars as tr, MasterViewCrudActionId as tt, BackstageCustomization as u, SmartArtLayout as ui, ViewerCustomizationController as un, ElementAction as ur, OptionsSettingId as ut, CollabLoadOrigin as v, ViewerPanelId as vn, PptxAnimationPreset as vr, PowerPointViewerAPI as vt, CompatibilityWarningToast as w, buildInlineTextCommitPatch as wn, PptxAppProperties as wr, RIBBON_TAB_IDS as wt, CollaborationRole as x, ViewportFitPadding as xn, PptxAnimationTimelineAnchor as xr, PresentationSnapshot as xt, CollaborationConfig as y, ViewerQuickAccessOptions as yn, PptxAnimationRepeatMode as yr, PresentationBlackout as yt, ElementUpdate as z, presentationBaseName as zn, PptxImageEffects as zr, SLIDE_TRANSITION_KEYFRAMES as zt };
15445
- //# sourceMappingURL=transition-overlay-C7hI62N0.d.ts.map
15506
+ export { InlineTextEditSnapshot as $, ViewerTheme as $n, PptxSmartArtNodeStyle as $r, SlideTransitionAnimations as $t, CssStyleMap as A, describeCollaborationShellState as An, PptxCommentAuthor as Ar, ResolvedCustomization as At, ElementUpdateOptions as B, overlayInlineTextSnapshot as Bn, PptxHandoutMaster as Br, RulerUnit as Bt, CollaborationTransport as C, ViewportFitOptions as Cn, PptxAnimationSequence as Cr, PresentationPointerTool as Ct, ContextMenuCustomization as D, buildInlineTextCommitPatch as Dn, PptxAppProperties as Dr, RIBBON_TAB_IDS as Dt, ContextMenuCommandId as E, ZoomNavigationTarget as En, PptxAnimationTrigger as Er, RANDOM_ELIGIBLE_TYPES as Et, ELEMENT_CONTEXT_MENU_COMMAND_IDS as F, getSlideTransitionAnimations as Fn, PptxCustomShow as Fr, RibbonCustomization as Ft, FreeformToolKind as G, resolveDirection8 as Gn, PptxModifyVerifier as Gr, SavedPresentationFormat as Gt, ExternalCollaborationSession as H, presentationBaseName as Hn, PptxImageEffects as Hr, SLIDE_TRANSITION_KEYFRAMES as Ht, EditorKeyActionName as I, isLegacyBinaryPresentation as In, PptxData as Ir, RibbonGalleryApplyResult as It, HostCanvasMenuContext as J, resolveTransitionDurationMs as Jn, PptxSection as Jr, ShareDefaults as Jt, GradientState as K, resolveOrientation as Kn, PptxNotesMaster as Kr, SessionDeck as Kt, ElementAnimationState as L, isSupportedPresentationFile as Ln, PptxElement as Lr, RibbonGalleryContext as Lt, DEFAULT_TRANSITION_DURATION_MS as M, getCinematicTransitionAnimations as Mn, PptxCompatibilityWarning as Mr, ResolvedDirection8 as Mt, EASE as N, getP14TransitionAnimations as Nn, PptxCoreProperties as Nr, RibbonContextualTabId as Nt, CropElementUpdate as O, canInteractWithElement as On, PptxChartData as Or, ReadOnlyRecommendation as Ot, EDITOR_SHORTCUT_ACTION_IDS as P, getSessionTabId as Pn, PptxCustomProperty as Pr, RibbonControlId as Pt, InlineListReadResult as Q, ThemeCatalogEntry as Qn, PptxSmartArtData as Qr, SlideTemplateId as Qt, ElementClipboardPayload as R, loadPresentationDeck as Rn, PptxElementAnimation as Rr, RibbonGroupId as Rt, CollaborationShellState as S, ViewerQuickAccessOptions as Sn, PptxAnimationRepeatMode as Sr, PresentationBlackout as St, ConnectionStatus as T, WHEEL_SPOKE_COUNTS as Tn, PptxAnimationTimingCurve as Tr, PrintSettings as Tt, ExternalCollaborationSnapshot as U, rememberSessionDeck as Un, PptxLayoutPreview as Ur, SLIDE_TRANSITION_KEYFRAMES_CSS as Ut, ExternalCollaborationAwareness as V, parsePresentationSessionId as Vn, PptxHeaderFooter as Vr, RunProgramNotice as Vt, FieldSubstitutionContext as W, resolveDirection as Wn, PptxModernCommentAuthor as Wr, SanitizedPresence as Wt, HostMenuCommand as X, restoreSessionDeck as Xn, PptxSlideMaster as Xr, SlideSizeEmu as Xt, HostElementMenuContext as Y, resolveWheelSpokeCount as Yn, PptxSlide as Yr, ShortcutChord as Yt, INSTANT as Z, savedPresentationFileName as Zn, PptxSlideTransition as Zr, SlideSizeRescaleMode as Zt, ChartPartRef as _, TextStyle as _i, ViewerFontSource as _n, OlePptxElement as _r, P14_TRANSITION_KEYFRAMES_ALL as _t, AnimationGroup as a, PptxThemeColorRef as ai, ToolbarButtonId as an, vermilionDarkTheme as ar, MobileSheetKey as at, CollaborationLivePatcher as b, ViewerOptionsStore as bn, PptxAnimationDirection as br, PasteSpecialFormat as bt, BACKSTAGE_PAGE_IDS as c, PptxThemeOption as ci, VIEWER_EXPORT_FORMAT_IDS as cn, MergeShapeOperation as cr, OPTIONS_SECTION_IDS as ct, BackstagePage as d, ShapeStyle as di, ViewerCustomization as dn, PptxSaveFormat as dr, OptionsPageId as dt, PptxTableCellStyle as ei, StrokeToInkElementOpts as en, ViewerThemeColors as er, InlineTextSelection as et, CANVAS_CONTEXT_MENU_COMMAND_IDS as f, SmartArtColorScheme as fi, ViewerCustomizationApi as fn, SvgExportOptions as fr, OptionsSectionId as ft, ChangeCaseMode as g, TextSegment as gi, ViewerFeatureId as gn, OleObjectType as gr, P14_TRANSITION_KEYFRAMES_2 as gt, CanvasSize as h, TablePptxElement as hi, ViewerExportFormatId as hn, MediaPptxElement as hr, P14_TRANSITION_KEYFRAMES as ht, AlignEdge as i, PptxTheme as ii, ToolbarActionId as in, themeToCssVars as ir, MasterViewCrudActionId as it, DEFAULT_MORPH_DURATION_MS as j, forgetSessionDeck as jn, PptxCommentMention as jr, ResolvedDirection as jt, CropSession as k, createImageElementFromFile as kn, PptxComment as kr, RemoteCursor as kt, BackstageCardId as l, PptxTransitionType as li, VIEWER_FEATURE_IDS as ln, PptxHandler as lr, OPTIONS_SETTING_IDS as lt, CanvasContextMenuCommandId as m, SmartArtLayoutType as mi, ViewerDialogId as mn, MasterViewTab as mr, OptionsSettingValues as mt, playTransitionOverlay as n, PptxTagCollection as ni, TRANSITION_SPEED_DURATION_MS as nn, defaultRadius as nr, KeyboardCustomization as nt, AutosaveRecord as o, PptxThemeColorScheme as oi, ToolbarTabId as on, vermilionLightTheme as or, ModifyPasswordCheckResult as ot, CINEMATIC_TRANSITION_KEYFRAMES as p, SmartArtLayout as pi, ViewerCustomizationController as pn, ElementAction as pr, OptionsSettingId as pt, Guide as q, resolveSlideTransition as qn, PptxPresentationProperties as qr, ShapePresetType as qt, AccountAuthConfig as r, PptxTextStyleLevels as ri, TextAdvancedChanges as rn, defaultThemeColors as rr, MasterViewCrudAction as rt, BACKSTAGE_CARD_IDS as s, PptxThemeFontScheme as si, VIEWER_DIALOG_IDS as sn, AccessibilityIssue as sr, OPTIONS_PAGE_IDS as st, TransitionOverlayParams as t, PptxTableData as ti, TOOLBAR_BUTTON_IDS as tn, defaultCssVars as tr, InsertChartKind as tt, BackstageCustomization as u, PptxViewProperties as ui, VIEWER_PANEL_IDS as un, PptxHandlerSaveOptions as ur, OptionsCustomization as ut, CollabLoadOrigin as v, XmlObject as vi, ViewerMode as vn, ParsedTableStyleMap as vr, PPTX_OPEN_ACCEPT as vt, CompatibilityWarningToast as w, ViewportFitPadding as wn, PptxAnimationTimelineAnchor as wr, PresentationSnapshot as wt, CollaborationRole as x, ViewerPanelId as xn, PptxAnimationPreset as xr, PowerPointViewerAPI as xt, CollaborationConfig as y, ViewerOptionPrimitive as yn, PptxAfterAnimationAction as yr, PRESENTATION_OPEN_EXTENSIONS as yt, ElementUpdate as z, loadSessionDeck as zn, PptxEmbeddedFont as zr, RibbonTransitionDraft as zt };
15507
+ //# sourceMappingURL=transition-overlay-f0pbzLt7.d.ts.map