pptx-react-viewer 4.2.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +138 -0
- package/dist/{AiChatPanel-SEIRQ3XP.mjs → AiChatPanel-QJHUDIWT.mjs} +4 -4
- package/dist/AiChatPanel-QJHUDIWT.mjs.br +0 -0
- package/dist/AiChatPanel-QJHUDIWT.mjs.gz +0 -0
- package/dist/{AiChatPanel-VVTLQXQ5.js → AiChatPanel-UFMSTNCB.js} +28 -28
- package/dist/AiChatPanel-UFMSTNCB.js.br +0 -0
- package/dist/AiChatPanel-UFMSTNCB.js.gz +0 -0
- package/dist/{Model3DScene-DCTVSK2F.mjs → Model3DScene-3GOC5HUS.mjs} +1 -1
- package/dist/Model3DScene-3GOC5HUS.mjs.br +0 -0
- package/dist/Model3DScene-3GOC5HUS.mjs.gz +0 -0
- package/dist/{Model3DScene-SCWQXMEA.js → Model3DScene-KXNJBAQD.js} +2 -2
- package/dist/Model3DScene-KXNJBAQD.js.br +0 -0
- package/dist/Model3DScene-KXNJBAQD.js.gz +0 -0
- package/dist/{chunk-S65QSO6T.js → chunk-7WWINBGF.js} +17172 -8075
- package/dist/chunk-7WWINBGF.js.br +0 -0
- package/dist/chunk-7WWINBGF.js.gz +0 -0
- package/dist/{chunk-KTSDPBQZ.js → chunk-AI6K5EAE.js} +1270 -1079
- package/dist/chunk-AI6K5EAE.js.br +0 -0
- package/dist/chunk-AI6K5EAE.js.gz +0 -0
- package/dist/{chunk-3WYNGYB6.js → chunk-CSY422LU.js} +5 -5
- package/dist/chunk-CSY422LU.js.br +0 -0
- package/dist/chunk-CSY422LU.js.gz +0 -0
- package/dist/{chunk-VPJOJJ36.mjs → chunk-D3TZOCQP.mjs} +17139 -8067
- package/dist/chunk-D3TZOCQP.mjs.br +0 -0
- package/dist/chunk-D3TZOCQP.mjs.gz +0 -0
- package/dist/{chunk-NXGUR2DO.js → chunk-I4D6JQOI.js} +27 -2
- package/dist/chunk-I4D6JQOI.js.br +0 -0
- package/dist/chunk-I4D6JQOI.js.gz +0 -0
- package/dist/{chunk-PC7H3C5W.mjs → chunk-JQXN6PO7.mjs} +27 -2
- package/dist/chunk-JQXN6PO7.mjs.br +0 -0
- package/dist/chunk-JQXN6PO7.mjs.gz +0 -0
- package/dist/{chunk-ZYIJODUR.mjs → chunk-LUHUYBGW.mjs} +211 -20
- package/dist/chunk-LUHUYBGW.mjs.br +0 -0
- package/dist/chunk-LUHUYBGW.mjs.gz +0 -0
- package/dist/{chunk-5MRNT4V6.js → chunk-OWTHF5N4.js} +209 -187
- package/dist/chunk-OWTHF5N4.js.br +0 -0
- package/dist/chunk-OWTHF5N4.js.gz +0 -0
- package/dist/{chunk-4GTDG2FH.mjs → chunk-WCHKDZP6.mjs} +660 -197
- package/dist/chunk-WCHKDZP6.mjs.br +0 -0
- package/dist/chunk-WCHKDZP6.mjs.gz +0 -0
- package/dist/{chunk-B5YZABYX.mjs → chunk-WNFHFFYE.mjs} +32 -10
- package/dist/chunk-WNFHFFYE.mjs.br +0 -0
- package/dist/chunk-WNFHFFYE.mjs.gz +0 -0
- package/dist/{chunk-L4XBWL7J.mjs → chunk-XMKLY2SE.mjs} +1 -1
- package/dist/chunk-XMKLY2SE.mjs.br +0 -0
- package/dist/chunk-XMKLY2SE.mjs.gz +0 -0
- package/dist/{chunk-P2SBIMYF.js → chunk-YJKR7Z3X.js} +2161 -1698
- package/dist/chunk-YJKR7Z3X.js.br +0 -0
- package/dist/chunk-YJKR7Z3X.js.gz +0 -0
- package/dist/i18n/de.cjs +25 -2
- package/dist/i18n/de.cjs.br +0 -0
- package/dist/i18n/de.cjs.gz +0 -0
- package/dist/i18n/de.mjs +25 -2
- package/dist/i18n/de.mjs.br +0 -0
- package/dist/i18n/de.mjs.gz +0 -0
- package/dist/i18n/es.cjs +25 -2
- package/dist/i18n/es.cjs.br +0 -0
- package/dist/i18n/es.cjs.gz +0 -0
- package/dist/i18n/es.mjs +25 -2
- package/dist/i18n/es.mjs.br +0 -0
- package/dist/i18n/es.mjs.gz +0 -0
- package/dist/i18n/fr.cjs +25 -2
- package/dist/i18n/fr.cjs.br +0 -0
- package/dist/i18n/fr.cjs.gz +0 -0
- package/dist/i18n/fr.mjs +25 -2
- package/dist/i18n/fr.mjs.br +0 -0
- package/dist/i18n/fr.mjs.gz +0 -0
- package/dist/i18n/zh-CN.cjs +25 -2
- package/dist/i18n/zh-CN.cjs.br +0 -0
- package/dist/i18n/zh-CN.cjs.gz +0 -0
- package/dist/i18n/zh-CN.mjs +25 -2
- package/dist/i18n/zh-CN.mjs.br +0 -0
- package/dist/i18n/zh-CN.mjs.gz +0 -0
- package/dist/i18n.js +4 -4
- package/dist/i18n.js.br +0 -0
- package/dist/i18n.js.gz +0 -0
- package/dist/i18n.mjs +1 -1
- package/dist/i18n.mjs.br +0 -0
- package/dist/i18n.mjs.gz +0 -0
- package/dist/index.d.ts +311 -6
- package/dist/index.js +49 -49
- package/dist/index.js.br +0 -0
- package/dist/index.js.gz +0 -0
- package/dist/index.mjs +6 -6
- package/dist/index.mjs.br +0 -0
- package/dist/index.mjs.gz +0 -0
- package/dist/internals.d.ts +461 -42
- package/dist/internals.js +105 -105
- package/dist/internals.js.br +0 -0
- package/dist/internals.js.gz +0 -0
- package/dist/internals.mjs +4 -4
- package/dist/internals.mjs.br +0 -0
- package/dist/internals.mjs.gz +0 -0
- package/dist/pptx-viewer.css +1 -1
- package/dist/pptx-viewer.css.br +0 -0
- package/dist/pptx-viewer.css.gz +0 -0
- package/dist/viewer/index.d.ts +274 -4
- package/dist/viewer/index.js +27 -27
- package/dist/viewer/index.js.br +0 -0
- package/dist/viewer/index.js.gz +0 -0
- package/dist/viewer/index.mjs +6 -6
- package/dist/viewer/index.mjs.br +0 -0
- package/dist/viewer/index.mjs.gz +0 -0
- package/package.json +1 -1
- package/dist/AiChatPanel-SEIRQ3XP.mjs.br +0 -0
- package/dist/AiChatPanel-SEIRQ3XP.mjs.gz +0 -0
- package/dist/AiChatPanel-VVTLQXQ5.js.br +0 -0
- package/dist/AiChatPanel-VVTLQXQ5.js.gz +0 -0
- package/dist/Model3DScene-DCTVSK2F.mjs.br +0 -0
- package/dist/Model3DScene-DCTVSK2F.mjs.gz +0 -0
- package/dist/Model3DScene-SCWQXMEA.js.br +0 -0
- package/dist/Model3DScene-SCWQXMEA.js.gz +0 -0
- package/dist/chunk-3WYNGYB6.js.br +0 -0
- package/dist/chunk-3WYNGYB6.js.gz +0 -0
- package/dist/chunk-4GTDG2FH.mjs.br +0 -0
- package/dist/chunk-4GTDG2FH.mjs.gz +0 -0
- package/dist/chunk-5MRNT4V6.js.br +0 -0
- package/dist/chunk-5MRNT4V6.js.gz +0 -0
- package/dist/chunk-B5YZABYX.mjs.br +0 -0
- package/dist/chunk-B5YZABYX.mjs.gz +0 -0
- package/dist/chunk-KTSDPBQZ.js.br +0 -0
- package/dist/chunk-KTSDPBQZ.js.gz +0 -0
- package/dist/chunk-L4XBWL7J.mjs.br +0 -0
- package/dist/chunk-L4XBWL7J.mjs.gz +0 -0
- package/dist/chunk-NXGUR2DO.js.br +0 -0
- package/dist/chunk-NXGUR2DO.js.gz +0 -0
- package/dist/chunk-P2SBIMYF.js.br +0 -0
- package/dist/chunk-P2SBIMYF.js.gz +0 -0
- package/dist/chunk-PC7H3C5W.mjs.br +0 -0
- package/dist/chunk-PC7H3C5W.mjs.gz +0 -0
- package/dist/chunk-S65QSO6T.js.br +0 -0
- package/dist/chunk-S65QSO6T.js.gz +0 -0
- package/dist/chunk-VPJOJJ36.mjs.br +0 -0
- package/dist/chunk-VPJOJJ36.mjs.gz +0 -0
- package/dist/chunk-ZYIJODUR.mjs.br +0 -0
- package/dist/chunk-ZYIJODUR.mjs.gz +0 -0
package/dist/internals.d.ts
CHANGED
|
@@ -1396,6 +1396,32 @@ interface TextStyle {
|
|
|
1396
1396
|
* @see element-paragraph-geometry.ts
|
|
1397
1397
|
*/
|
|
1398
1398
|
resolvedParagraphGeometry?: TextStyle;
|
|
1399
|
+
/**
|
|
1400
|
+
* Snapshot of the ELEMENT-scope `a:bodyPr` properties (vertical anchor,
|
|
1401
|
+
* text direction, columns, overflow, autofit, body insets, text wrap, and
|
|
1402
|
+
* the boolean/rotation attributes) as the load pipeline resolved them.
|
|
1403
|
+
*
|
|
1404
|
+
* A shape's own `a:bodyPr` is parsed first, then whatever it left
|
|
1405
|
+
* `undefined` is back-filled from the placeholder / layout / master
|
|
1406
|
+
* defaults (`applyPlaceholderBodyDefaults`), and a placeholder shape with
|
|
1407
|
+
* no `a:bodyPr` of its own has the INHERITED one parsed as if it were its
|
|
1408
|
+
* own. None of those three sources is distinguishable at
|
|
1409
|
+
* `element.textStyle` once the cascade finishes, so a writer that
|
|
1410
|
+
* re-emits every defined field turns an inherited anchor, inset, autofit
|
|
1411
|
+
* mode or `rtlCol` into a value pinned on the slide forever (and an
|
|
1412
|
+
* inherited `a:normAutofit` with no scale gets written back as
|
|
1413
|
+
* `a:spAutoFit`, flipping AutoSize from "shrink text" to "resize shape").
|
|
1414
|
+
*
|
|
1415
|
+
* Present only on an `element.textStyle` that came from a parsed deck.
|
|
1416
|
+
* The save path diffs the live style against this snapshot: a field that
|
|
1417
|
+
* still matches is an inheritance artefact and the writer leaves the
|
|
1418
|
+
* underlying `a:bodyPr` attribute untouched (whatever it already is,
|
|
1419
|
+
* present or absent); a field that differs was authored or has since
|
|
1420
|
+
* been edited and is written out.
|
|
1421
|
+
*
|
|
1422
|
+
* @see element-body-properties.ts
|
|
1423
|
+
*/
|
|
1424
|
+
resolvedBodyProperties?: TextStyle;
|
|
1399
1425
|
fontFamily?: string;
|
|
1400
1426
|
fontSize?: number;
|
|
1401
1427
|
/** When true, some form of autofit is in effect; see {@link autoFitMode} for which. */
|
|
@@ -1578,6 +1604,16 @@ interface TextStyle {
|
|
|
1578
1604
|
align: 'l' | 'ctr' | 'r' | 'dec';
|
|
1579
1605
|
leader?: 'none' | 'dot' | 'hyphen' | 'underscore';
|
|
1580
1606
|
}>;
|
|
1607
|
+
/**
|
|
1608
|
+
* True when the paragraph's own `a:pPr` authored an EMPTY `<a:tabLst/>`
|
|
1609
|
+
* (explicitly "no tab stops", overriding whatever the cascade would
|
|
1610
|
+
* otherwise supply) rather than omitting the element entirely (inherit).
|
|
1611
|
+
* fast-xml-parser gives a childless element as the empty string, so
|
|
1612
|
+
* `tabLst` and no-`tabLst` are otherwise indistinguishable once `tabStops`
|
|
1613
|
+
* comes back empty either way. Paragraph-scope only; not part of the
|
|
1614
|
+
* element-level geometry cascade.
|
|
1615
|
+
*/
|
|
1616
|
+
tabStopsExplicitEmpty?: boolean;
|
|
1581
1617
|
/** Body text wrapping mode from `a:bodyPr/@wrap`. */
|
|
1582
1618
|
textWrap?: 'square' | 'none';
|
|
1583
1619
|
/** Preset text warp type from `a:bodyPr/a:prstTxWarp`. */
|
|
@@ -1620,6 +1656,20 @@ interface TextStyle {
|
|
|
1620
1656
|
* serialised back on save, so it never disturbs the round-trip typefaces.
|
|
1621
1657
|
*/
|
|
1622
1658
|
scriptFallbackFont?: string;
|
|
1659
|
+
/**
|
|
1660
|
+
* Set alongside {@link scriptFallbackFont} when the resolved {@link fontFamily}
|
|
1661
|
+
* came only from the paragraph/list-style/theme CASCADE (the run's own
|
|
1662
|
+
* `a:rPr` authored no `a:latin`/`a:ea`/`a:cs` of its own). A run always
|
|
1663
|
+
* inherits SOME font this way (typically the theme's `+mn-lt`), so without
|
|
1664
|
+
* this flag `fontFamily` was indistinguishable from a run that genuinely
|
|
1665
|
+
* chose that font itself, and the renderer never applied the theme's
|
|
1666
|
+
* per-script override (see #83): `+mn-lt` names only the LATIN member of
|
|
1667
|
+
* the font scheme and was never meant to cover text in a different
|
|
1668
|
+
* dominant script. An explicit `a:latin`/`a:ea`/`a:cs` authored on the run
|
|
1669
|
+
* itself still always wins; only the cascade default yields to the
|
|
1670
|
+
* script-specific override.
|
|
1671
|
+
*/
|
|
1672
|
+
fontFamilyIsCascadeDefault?: boolean;
|
|
1623
1673
|
/** Text language from `a:rPr/@lang`. */
|
|
1624
1674
|
language?: string;
|
|
1625
1675
|
/** Hyperlink mouse-over target from `a:hlinkMouseOver`. */
|
|
@@ -1642,6 +1692,16 @@ interface TextStyle {
|
|
|
1642
1692
|
hyperlinkHighlightClick?: boolean;
|
|
1643
1693
|
/** Whether hyperlink ends a sound (`a:hlinkClick/@endSnd`). */
|
|
1644
1694
|
hyperlinkEndSound?: boolean;
|
|
1695
|
+
/**
|
|
1696
|
+
* Raw `a:hlinkClick/a:extLst` child, preserved verbatim for round-trip.
|
|
1697
|
+
* Carries vendor extensions this engine does not interpret, most commonly
|
|
1698
|
+
* `ahyp:hlinkClr` (Microsoft's "hyperlink color" extension,
|
|
1699
|
+
* `{A12FA001-AC4F-418D-AE19-62706E023703}`), which records whether a
|
|
1700
|
+
* hyperlink run should paint with the theme's text colour instead of the
|
|
1701
|
+
* hyperlink colour. Dropping the whole `a:extLst` silently reverted such a
|
|
1702
|
+
* run to the default (themed) hyperlink colour on save.
|
|
1703
|
+
*/
|
|
1704
|
+
hyperlinkExtensionXml?: XmlObject;
|
|
1645
1705
|
/** Kumimoji (ideographic text combining) flag for vertical CJK text (`a:rPr/@kumimoji`). */
|
|
1646
1706
|
kumimoji?: boolean;
|
|
1647
1707
|
/** Normalize height flag (`a:rPr/@normalizeH`). */
|
|
@@ -1795,6 +1855,15 @@ interface TextStyle {
|
|
|
1795
1855
|
textGlowRadius?: number;
|
|
1796
1856
|
/** Text glow opacity (0-1). */
|
|
1797
1857
|
textGlowOpacity?: number;
|
|
1858
|
+
/**
|
|
1859
|
+
* Original glow colour-choice XML (`a:glow`'s `a:schemeClr`/`a:srgbClr`/…
|
|
1860
|
+
* child), preserved verbatim so a theme colour reference round-trips
|
|
1861
|
+
* instead of always being re-serialized as a resolved `a:srgbClr` (which
|
|
1862
|
+
* cuts the glow off from theme/Recolor changes).
|
|
1863
|
+
*/
|
|
1864
|
+
textGlowColorXml?: XmlObject;
|
|
1865
|
+
/** Theme colour slot the glow colour resolved from, when it is `a:schemeClr`. */
|
|
1866
|
+
textGlowColorRef?: PptxThemeColorRef;
|
|
1798
1867
|
/** Text reflection enabled flag. */
|
|
1799
1868
|
textReflection?: boolean;
|
|
1800
1869
|
/** Text reflection blur radius in px. */
|
|
@@ -1931,6 +2000,18 @@ interface BulletInfo {
|
|
|
1931
2000
|
paragraphIndex?: number;
|
|
1932
2001
|
/** Bullet font family from `a:buFont`. */
|
|
1933
2002
|
fontFamily?: string;
|
|
2003
|
+
/**
|
|
2004
|
+
* PANOSE font-matching hint from `a:buFont/@panose`. `a:buFont` is a
|
|
2005
|
+
* CT_TextFont, the same complex type as `a:latin`/`a:ea`/`a:cs`/`a:sym`
|
|
2006
|
+
* (which carry the equivalent `TextStyle.latinFontPanose` etc.), so a
|
|
2007
|
+
* bullet's own PANOSE/pitch-family/charset decide the fallback glyph
|
|
2008
|
+
* PowerPoint substitutes when the named typeface is missing.
|
|
2009
|
+
*/
|
|
2010
|
+
fontPanose?: string;
|
|
2011
|
+
/** Font pitch-and-family byte from `a:buFont/@pitchFamily`. */
|
|
2012
|
+
fontPitchFamily?: number;
|
|
2013
|
+
/** Font character-set byte from `a:buFont/@charset`. */
|
|
2014
|
+
fontCharset?: number;
|
|
1934
2015
|
/** Bullet size as percentage of text font size from `a:buSzPct`. */
|
|
1935
2016
|
sizePercent?: number;
|
|
1936
2017
|
/** Bullet size in points from `a:buSzPts`. */
|
|
@@ -1972,6 +2053,18 @@ interface BulletInfo {
|
|
|
1972
2053
|
/** When true, `<a:buSzTx/>` was specified — inherit the bullet size from
|
|
1973
2054
|
* the run text font size. */
|
|
1974
2055
|
sizeInherit?: boolean;
|
|
2056
|
+
/**
|
|
2057
|
+
* True when this bullet resolution came from the paragraph's OWN `a:pPr`
|
|
2058
|
+
* rather than the shape's `a:lstStyle`, an inherited placeholder, or the
|
|
2059
|
+
* master's `a:defPPr` / `p:txStyles`. `resolveParagraphBulletInfo` walks
|
|
2060
|
+
* that cascade and returns the first match, so without this flag a
|
|
2061
|
+
* writer that re-emits every resolved `BulletInfo` in full pins an
|
|
2062
|
+
* inherited bullet (e.g. a master `buFont="Arial"` / `buChar="•"`) onto
|
|
2063
|
+
* every paragraph's own `a:pPr` the moment the slide is rewritten. The
|
|
2064
|
+
* save path only writes the bullet group when this is `true`, mirroring
|
|
2065
|
+
* how `paragraphProperties` gates every other per-paragraph field.
|
|
2066
|
+
*/
|
|
2067
|
+
ownedByParagraph?: boolean;
|
|
1975
2068
|
}
|
|
1976
2069
|
/**
|
|
1977
2070
|
* A single text run within a paragraph.
|
|
@@ -2014,6 +2107,23 @@ interface TextSegment {
|
|
|
2014
2107
|
fieldParagraphPropertiesXml?: XmlObject;
|
|
2015
2108
|
/** Raw OMML XML node for equation segments (from `a14:m` / `m:oMathPara`). */
|
|
2016
2109
|
equationXml?: Record<string, unknown>;
|
|
2110
|
+
/**
|
|
2111
|
+
* The ORIGINAL top-level paragraph child that carried this equation,
|
|
2112
|
+
* captured verbatim at parse time and keyed by its own tag: `{ 'a14:m':
|
|
2113
|
+
* ... }`, `{ 'm:oMathPara': ... }`, `{ 'm:oMath': ... }`, or `{
|
|
2114
|
+
* 'mc:AlternateContent': ... }` for an equation authored behind a
|
|
2115
|
+
* Choice/Fallback switch. `equationXml` above is the resolved math content
|
|
2116
|
+
* used for rendering (unwrapped one level for `a14:m`/`mc:AlternateContent`
|
|
2117
|
+
* sources); this field exists solely so the writer can re-emit an UNTOUCHED
|
|
2118
|
+
* equation byte-for-byte, Choice and Fallback both, instead of collapsing
|
|
2119
|
+
* it to a bare math element PowerPoint's own writer never produces.
|
|
2120
|
+
* `undefined` for a freshly inserted or edited equation, which the writer
|
|
2121
|
+
* instead reconstructs from `equationXml` (always `{ 'm:oMathPara': ... }`
|
|
2122
|
+
* or `{ 'm:oMath': ... }` for those cases). Any code that replaces
|
|
2123
|
+
* `equationXml` on an existing segment must drop this field, or the writer
|
|
2124
|
+
* would keep re-emitting the equation's OLD XML instead of the edit.
|
|
2125
|
+
*/
|
|
2126
|
+
equationSourceXml?: Record<string, unknown>;
|
|
2017
2127
|
/**
|
|
2018
2128
|
* Optional equation number for numbered equations (e.g. "(1)", "(2.3)").
|
|
2019
2129
|
* When present, the equation is rendered centered with the number right-aligned.
|
|
@@ -2298,6 +2408,24 @@ interface PptxShapeProperties {
|
|
|
2298
2408
|
*/
|
|
2299
2409
|
interface PlaceholderTextLevelStyle {
|
|
2300
2410
|
fontFamily?: string;
|
|
2411
|
+
/**
|
|
2412
|
+
* The RAW `a:defRPr/a:latin/@typeface` string (verbatim: a theme alias
|
|
2413
|
+
* such as `+mj-lt`/`+mn-lt`, or a literal face name) {@link fontFamily}
|
|
2414
|
+
* was resolved from. Master/layout text styles are parsed once and
|
|
2415
|
+
* cached, so `fontFamily` is a resolved-for-display snapshot; re-emitting
|
|
2416
|
+
* it as the literal name on every save (the master-level analogue of
|
|
2417
|
+
* `colorChoiceXml` below) flattens the theme alias the moment ANYTHING
|
|
2418
|
+
* about the deck is rewritten, even when this level was never touched.
|
|
2419
|
+
* Absent when the level declares no `a:latin`.
|
|
2420
|
+
*/
|
|
2421
|
+
fontTypefaceXml?: string;
|
|
2422
|
+
/**
|
|
2423
|
+
* Snapshot of {@link fontFamily} exactly as parsed, before any edit. The
|
|
2424
|
+
* save path diffs the live value against this: unchanged means re-emit
|
|
2425
|
+
* {@link fontTypefaceXml} verbatim (preserve the alias); different means
|
|
2426
|
+
* a genuine edit, so the new literal name is written instead.
|
|
2427
|
+
*/
|
|
2428
|
+
resolvedFontFamily?: string;
|
|
2301
2429
|
fontSize?: number;
|
|
2302
2430
|
bold?: boolean;
|
|
2303
2431
|
italic?: boolean;
|
|
@@ -2347,8 +2475,32 @@ interface PlaceholderTextLevelStyle {
|
|
|
2347
2475
|
tabStops?: TextStyle['tabStops'];
|
|
2348
2476
|
lineSpacing?: number;
|
|
2349
2477
|
lineSpacingExactPt?: number;
|
|
2478
|
+
/**
|
|
2479
|
+
* Space before the paragraph in px, resolved from EITHER `a:spcPts`
|
|
2480
|
+
* (absolute) or `a:spcPct` (a percentage of this level's own `a:defRPr`
|
|
2481
|
+
* font size) - the OOXML source is not distinguishable from this field
|
|
2482
|
+
* alone. See {@link spaceBeforePercent} / {@link resolvedSpaceBefore}.
|
|
2483
|
+
*/
|
|
2350
2484
|
spaceBefore?: number;
|
|
2351
2485
|
spaceAfter?: number;
|
|
2486
|
+
/**
|
|
2487
|
+
* Snapshot of {@link spaceBefore} / {@link spaceAfter} exactly as parsed.
|
|
2488
|
+
* Diffed the same way as {@link resolvedFontFamily}: unchanged means the
|
|
2489
|
+
* writer re-emits the ORIGINAL form (`a:spcPct` when
|
|
2490
|
+
* {@link spaceBeforePercent} / {@link spaceAfterPercent} is set); a value
|
|
2491
|
+
* that has since moved away from the snapshot is a genuine edit and is
|
|
2492
|
+
* always written as `a:spcPts`, since an editor works in absolute units.
|
|
2493
|
+
*/
|
|
2494
|
+
resolvedSpaceBefore?: number;
|
|
2495
|
+
resolvedSpaceAfter?: number;
|
|
2496
|
+
/**
|
|
2497
|
+
* The raw `a:spcPct` fraction (e.g. `0.2` for 20%) {@link spaceBefore} /
|
|
2498
|
+
* {@link spaceAfter} was resolved from, when the source used percentage
|
|
2499
|
+
* spacing rather than `a:spcPts`. Absent when the source used `a:spcPts`
|
|
2500
|
+
* (or authored no spacing at all).
|
|
2501
|
+
*/
|
|
2502
|
+
spaceBeforePercent?: number;
|
|
2503
|
+
spaceAfterPercent?: number;
|
|
2352
2504
|
/** Default tab interval in CSS pixels (`a:lvlXpPr/@defTabSz`). */
|
|
2353
2505
|
defaultTabSize?: number;
|
|
2354
2506
|
/** Whether East Asian line-breaking rules are enabled. */
|
|
@@ -5081,6 +5233,18 @@ interface PptxSmartArtLayoutDefinition {
|
|
|
5081
5233
|
rootNode: PptxSmartArtLayoutNode;
|
|
5082
5234
|
/** Original definition retained for constraint evaluation and foreign rules. */
|
|
5083
5235
|
rawXml?: XmlObject;
|
|
5236
|
+
/**
|
|
5237
|
+
* The un-parsed layout-definition part text (starting at `<dgm:layoutDef>`,
|
|
5238
|
+
* XML declaration included). `rawXml` above loses the document order of
|
|
5239
|
+
* differently-named siblings (the package-wide `fast-xml-parser`
|
|
5240
|
+
* configuration groups children into one array per tag), which the
|
|
5241
|
+
* per-point DiagramML engine (`core/utils/smartart-engine/`) needs to
|
|
5242
|
+
* execute a `layoutNode` body's `forEach`/`choose`/`constrLst` statements
|
|
5243
|
+
* in their real declared sequence - see that package's `ordered-xml.ts`.
|
|
5244
|
+
* `undefined` when the part could not be read (matches `rawXml`'s own
|
|
5245
|
+
* optionality); the engine falls back to the legacy interpreter then.
|
|
5246
|
+
*/
|
|
5247
|
+
rawXmlText?: string;
|
|
5084
5248
|
}
|
|
5085
5249
|
//#endregion
|
|
5086
5250
|
//#region src/core/types/smart-art-node.d.ts
|
|
@@ -6193,6 +6357,20 @@ interface PptxTableData {
|
|
|
6193
6357
|
* present when there is at least one effect.
|
|
6194
6358
|
*/
|
|
6195
6359
|
tableEffects?: ParsedTableStyleEffect[];
|
|
6360
|
+
/**
|
|
6361
|
+
* Table-cell-context default text size in points, resolved from the
|
|
6362
|
+
* slide's master `p:otherStyle` (ECMA-376 §19.3.1.42 CT_TextListStyle,
|
|
6363
|
+
* §19.3.1.52 for `p:txStyles`). PowerPoint sizes a table cell's text off
|
|
6364
|
+
* this master default (commonly 18pt) whenever neither the run nor the
|
|
6365
|
+
* (size-less) table style provides one; without it, cell text without an
|
|
6366
|
+
* explicit `a:rPr@sz` fell back to the browser's own default font size
|
|
6367
|
+
* (16px / 12pt) instead. A render-only hint: it is not part of any
|
|
6368
|
+
* individual cell's parsed style and is never written back on save, so
|
|
6369
|
+
* resaving an unstyled cell does not bake in an explicit size that was
|
|
6370
|
+
* never authored. `undefined` when no master/otherStyle size resolves
|
|
6371
|
+
* (renderers should leave the browser default in place in that case).
|
|
6372
|
+
*/
|
|
6373
|
+
defaultCellFontSize?: number;
|
|
6196
6374
|
}
|
|
6197
6375
|
/**
|
|
6198
6376
|
* A single fill reference within a table style section.
|
|
@@ -6218,6 +6396,14 @@ interface ParsedTableStyleFill {
|
|
|
6218
6396
|
tint?: number;
|
|
6219
6397
|
/** Shade value (0-100 000). */
|
|
6220
6398
|
shade?: number;
|
|
6399
|
+
/**
|
|
6400
|
+
* Alpha (opacity) value (0-100 000, where 100 000 is fully opaque) from an
|
|
6401
|
+
* `a:alpha` child of `a:schemeClr`/`a:srgbClr`. Several built-in table
|
|
6402
|
+
* styles (e.g. "Light Style 1/3", "Themed Style 1/2") band their rows with
|
|
6403
|
+
* a partially transparent tint of the theme colour rather than a tint/shade
|
|
6404
|
+
* blend.
|
|
6405
|
+
*/
|
|
6406
|
+
alpha?: number;
|
|
6221
6407
|
/** Explicit sRGB hex colour (e.g. `#FF8800`) from `a:srgbClr`. */
|
|
6222
6408
|
color?: string;
|
|
6223
6409
|
/** The fill was `a:noFill`: renders transparent and clears lower layers. */
|
|
@@ -7053,6 +7239,20 @@ interface ContentPartInkStroke {
|
|
|
7053
7239
|
* NAMES differ.
|
|
7054
7240
|
*/
|
|
7055
7241
|
tiltEncoding?: 'vector' | 'azimuthAltitude';
|
|
7242
|
+
/**
|
|
7243
|
+
* Per-point timestamps (milliseconds), decoded from the source InkML
|
|
7244
|
+
* trace's `T` channel when it declared one.
|
|
7245
|
+
*
|
|
7246
|
+
* Absent for the overwhelming majority of real decks: PowerPoint's own
|
|
7247
|
+
* SaveAs output declares only `X`/`Y` and has no per-point time channel at
|
|
7248
|
+
* all (see `contentpart-real-ink-roundtrip.test.ts`'s fixture), so this is
|
|
7249
|
+
* populated only for InkML sources that genuinely author one (a captured
|
|
7250
|
+
* digitizer session, OneNote, a Surface Hub export). When present, ink
|
|
7251
|
+
* replay ("watch the ink get drawn") uses each stroke's own first/last
|
|
7252
|
+
* timestamp to time its reveal instead of the fixed per-stroke cascade; see
|
|
7253
|
+
* `pptx-viewer-shared`'s `render/ink-replay-timeline.ts`.
|
|
7254
|
+
*/
|
|
7255
|
+
pointTimestamps?: number[];
|
|
7056
7256
|
}
|
|
7057
7257
|
/**
|
|
7058
7258
|
* A content-part element wrapped in `mc:AlternateContent`.
|
|
@@ -7097,6 +7297,34 @@ interface ZoomPptxElement extends PptxElementBase, PptxImageProperties {
|
|
|
7097
7297
|
summaryTargets?: SummaryZoomTarget[];
|
|
7098
7298
|
/** Layout mode authored on the Summary Zoom container. */
|
|
7099
7299
|
summaryLayout?: 'grid' | 'fixed';
|
|
7300
|
+
/**
|
|
7301
|
+
* `zmPr/@returnToParent` (MS-PPTX `CT_ZoomObjectProperties`, shared by all
|
|
7302
|
+
* three Zoom kinds): whether continuing forward from the destination slide
|
|
7303
|
+
* during a live show returns to this Zoom's origin slide instead of
|
|
7304
|
+
* advancing linearly through the deck. The schema declares `<xsd:attribute
|
|
7305
|
+
* name="returnToParent" type="xsd:boolean" use="optional" default="true"/>`,
|
|
7306
|
+
* so an ABSENT attribute means `true`, not `false`. This codebase still
|
|
7307
|
+
* leaves the field `undefined` (rather than fabricating `true`) when the
|
|
7308
|
+
* source XML omits it, so a round-trip never invents an attribute the
|
|
7309
|
+
* source never had; a CONSUMER of this field (playback, e.g.
|
|
7310
|
+
* `pptx-viewer-shared`'s `resolveZoomNavigationTarget`) must read
|
|
7311
|
+
* `returnToParent !== false`, not `Boolean(returnToParent)`, to get the
|
|
7312
|
+
* spec-correct effective value. For `zoomType: 'summary'`, this mirrors the
|
|
7313
|
+
* first tile's own value; see {@link SummaryZoomTarget.returnToParent} for
|
|
7314
|
+
* the per-tile value.
|
|
7315
|
+
*/
|
|
7316
|
+
returnToParent?: boolean;
|
|
7317
|
+
/**
|
|
7318
|
+
* `zmPr/@transitionDur` (MS-PPTX `CT_ZoomObjectProperties`): the
|
|
7319
|
+
* zoom-transition length in milliseconds. PowerPoint's own writer emits a
|
|
7320
|
+
* unitless decimal-millisecond value for every OOXML `ST_UniversalTimeOffset`
|
|
7321
|
+
* this codebase has observed (see the media-trim/-fade parsers), so this
|
|
7322
|
+
* follows the same convention rather than the full TIMEOFFSET grammar's
|
|
7323
|
+
* unit suffixes. Undefined uses the destination slide's own transition.
|
|
7324
|
+
* For `zoomType: 'summary'`, this mirrors the first tile's own value; see
|
|
7325
|
+
* {@link SummaryZoomTarget.transitionDurationMs} for the per-tile value.
|
|
7326
|
+
*/
|
|
7327
|
+
transitionDurationMs?: number;
|
|
7100
7328
|
}
|
|
7101
7329
|
/** A single section tile within a PowerPoint Summary Zoom container. */
|
|
7102
7330
|
interface SummaryZoomTarget extends PptxImageProperties {
|
|
@@ -7112,6 +7340,10 @@ interface SummaryZoomTarget extends PptxImageProperties {
|
|
|
7112
7340
|
offsetFactorY?: number;
|
|
7113
7341
|
scaleFactorX?: number;
|
|
7114
7342
|
scaleFactorY?: number;
|
|
7343
|
+
/** This tile's own `zmPr/@returnToParent`; see {@link ZoomPptxElement.returnToParent}. */
|
|
7344
|
+
returnToParent?: boolean;
|
|
7345
|
+
/** This tile's own `zmPr/@transitionDur` in milliseconds; see {@link ZoomPptxElement.transitionDurationMs}. */
|
|
7346
|
+
transitionDurationMs?: number;
|
|
7115
7347
|
rawXml?: XmlObject;
|
|
7116
7348
|
}
|
|
7117
7349
|
/**
|
|
@@ -8112,6 +8344,17 @@ interface PptxAttributeAnimation {
|
|
|
8112
8344
|
* IS consulted regardless of this field's value. Absent means `lin`.
|
|
8113
8345
|
*/
|
|
8114
8346
|
calcMode?: 'discrete' | 'lin' | 'fmla';
|
|
8347
|
+
/**
|
|
8348
|
+
* `p:anim/@_p14:bounceEnd` (Office 2010 `p14` extension attribute,
|
|
8349
|
+
* MS-OI29500), normalized to a 0-1 fraction of this behaviour's own
|
|
8350
|
+
* duration. PowerPoint's Fly In "Bounce End" effect option writes this on
|
|
8351
|
+
* the position-ramp `p:anim` node(s): the fraction of the duration at
|
|
8352
|
+
* which the primary travel completes, with the remainder spent bouncing
|
|
8353
|
+
* and settling at the final value. Mirrored verbatim by PowerPoint onto
|
|
8354
|
+
* the enclosing `p:cTn/@_p14:presetBounceEnd`. Absent for every animation
|
|
8355
|
+
* that doesn't use this effect option (the overwhelming majority).
|
|
8356
|
+
*/
|
|
8357
|
+
bounceEnd?: number;
|
|
8115
8358
|
}
|
|
8116
8359
|
/** Signed HSL channel deltas parsed from `p:animClr/p:by/p:hsl`. */
|
|
8117
8360
|
interface PptxHslColorDelta {
|
|
@@ -8193,7 +8436,19 @@ interface PptxTextAnimationTarget {
|
|
|
8193
8436
|
* These map directly to OOXML condition event attribute values
|
|
8194
8437
|
* (ISO/IEC 29500-1 S19.5.28 CT_TLTimeCondition).
|
|
8195
8438
|
*/
|
|
8196
|
-
type AnimationConditionEvent = 'onBegin' | 'onEnd' | 'begin' | 'end' | 'onClick' | 'onMouseOver' | 'onMouseOut' | 'onNext' | 'onPrev' | 'onStopAudio' | 'onDblClick';
|
|
8439
|
+
type AnimationConditionEvent = 'onBegin' | 'onEnd' | 'begin' | 'end' | 'onClick' | 'onMouseOver' | 'onMouseOut' | 'onNext' | 'onPrev' | 'onStopAudio' | 'onDblClick' | 'onMediaBookmark';
|
|
8440
|
+
/**
|
|
8441
|
+
* `p14:bmkTgt` (Office 2010 `p14` extension, MS-OI29500): names the specific
|
|
8442
|
+
* media element and bookmark an `evt="onMediaBookmark"` condition fires for.
|
|
8443
|
+
* `bookmarkName` matches a `p14:bmk/@_name` on that media element's own
|
|
8444
|
+
* `p14:bmkLst` (see `MediaBookmark.label` in `core/types/elements.ts`).
|
|
8445
|
+
*/
|
|
8446
|
+
interface PptxMediaBookmarkTarget {
|
|
8447
|
+
/** `p14:bmkTgt/@_spid`: the media element's shape id. */
|
|
8448
|
+
shapeId: string;
|
|
8449
|
+
/** `p14:bmkTgt/@_bmkName`: the bookmark's name. */
|
|
8450
|
+
bookmarkName: string;
|
|
8451
|
+
}
|
|
8197
8452
|
/**
|
|
8198
8453
|
* Structured representation of a single OOXML animation condition
|
|
8199
8454
|
* from `p:cond` elements inside `p:stCondLst` or `p:endCondLst`.
|
|
@@ -8213,6 +8468,11 @@ type AnimationConditionEvent = 'onBegin' | 'onEnd' | 'begin' | 'end' | 'onClick'
|
|
|
8213
8468
|
interface AnimationCondition {
|
|
8214
8469
|
/** Event that triggers the condition. */
|
|
8215
8470
|
event?: AnimationConditionEvent;
|
|
8471
|
+
/**
|
|
8472
|
+
* The media element/bookmark this condition fires for, when
|
|
8473
|
+
* {@link event} is `onMediaBookmark`. See {@link PptxMediaBookmarkTarget}.
|
|
8474
|
+
*/
|
|
8475
|
+
bookmarkTarget?: PptxMediaBookmarkTarget;
|
|
8216
8476
|
/** Delay in milliseconds (from `@_delay`). "indefinite" is represented as -1. */
|
|
8217
8477
|
delay?: number;
|
|
8218
8478
|
/** Target time node ID reference (from `@_tn`). */
|
|
@@ -9061,7 +9321,12 @@ interface PptxSlideTransition {
|
|
|
9061
9321
|
spokes?: number;
|
|
9062
9322
|
/** Pattern type for shred transition. */
|
|
9063
9323
|
pattern?: string;
|
|
9064
|
-
/**
|
|
9324
|
+
/**
|
|
9325
|
+
* Through-black flag (OOXML `@_thruBlk`). COM-verified to actually apply to
|
|
9326
|
+
* `cut` and `fade` (see {@link TRANSITION_THRUBLK_TYPES}); parsed generically
|
|
9327
|
+
* off any standard transition child so an unexpected authored value still
|
|
9328
|
+
* round-trips.
|
|
9329
|
+
*/
|
|
9065
9330
|
thruBlk?: boolean;
|
|
9066
9331
|
/** Split orientation (horz/vert) parsed from `@_orient`. */
|
|
9067
9332
|
orient?: PptxSplitOrientation;
|
|
@@ -9531,7 +9796,12 @@ interface PptxHeaderFooter {
|
|
|
9531
9796
|
hasDateTime?: boolean;
|
|
9532
9797
|
dateTimeText?: string;
|
|
9533
9798
|
dateTimeAuto?: boolean;
|
|
9534
|
-
/**
|
|
9799
|
+
/**
|
|
9800
|
+
* The master date placeholder's own `a:fld/@type` (e.g. "datetime2"), NOT a
|
|
9801
|
+
* format pattern. It is one of the predefined OOXML datetime field types
|
|
9802
|
+
* (`datetime1`-`datetime13`); the display pattern for each is resolved by
|
|
9803
|
+
* `resolveFieldDateText` in `packages/shared/src/render/text-field-substitution.ts`.
|
|
9804
|
+
*/
|
|
9535
9805
|
dateFormat?: string;
|
|
9536
9806
|
hasSlideNumber?: boolean;
|
|
9537
9807
|
}
|
|
@@ -12308,13 +12578,21 @@ type InlineListReadResult = {
|
|
|
12308
12578
|
* Pure string logic: resolves OOXML field runs (slide number, date/time,
|
|
12309
12579
|
* header/footer, document properties, slide title) into their display text.
|
|
12310
12580
|
* Extracted from the React `viewer/utils/text-field-substitution` module so
|
|
12311
|
-
* every binding substitutes identically.
|
|
12581
|
+
* every binding substitutes identically. The locale-aware datetime engine
|
|
12582
|
+
* lives in `text-field-datetime.ts`.
|
|
12312
12583
|
*/
|
|
12313
12584
|
/** Context for substituting field placeholders (slide number, date/time, header/footer, etc.). */
|
|
12314
12585
|
interface FieldSubstitutionContext {
|
|
12315
12586
|
slideNumber?: number;
|
|
12316
12587
|
dateTimeText?: string;
|
|
12317
|
-
/**
|
|
12588
|
+
/**
|
|
12589
|
+
* The deck's master date-field default TYPE (`a:fld/@type` on the slide
|
|
12590
|
+
* master's `dt` placeholder, e.g. "datetime2"; see `header-footer-parts.ts`).
|
|
12591
|
+
* This is a field TYPE, not a format pattern, and is used ONLY as a
|
|
12592
|
+
* fallback for a field authored with the generic, unnumbered `datetime`
|
|
12593
|
+
* type - a field that already names its own `datetime1`-`datetime13` type
|
|
12594
|
+
* always uses that type, never this one (see `substituteFieldText`).
|
|
12595
|
+
*/
|
|
12318
12596
|
dateFormat?: string;
|
|
12319
12597
|
/** Footer text from PptxHeaderFooter settings. */
|
|
12320
12598
|
footerText?: string;
|
|
@@ -12954,7 +13232,7 @@ declare const P14_TRANSITION_KEYFRAMES = "\n/* ── Conveyor (translate X with
|
|
|
12954
13232
|
/** Part 2: prism / reveal / ripple / shred / switch / vortex / warp / wheelReverse / window. */
|
|
12955
13233
|
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";
|
|
12956
13234
|
/** Both p14 keyframe blocks concatenated, for single `<style>` injection. */
|
|
12957
|
-
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";
|
|
13235
|
+
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";
|
|
12958
13236
|
//#endregion
|
|
12959
13237
|
//#region src/render/p14-transition-css.d.ts
|
|
12960
13238
|
/**
|
|
@@ -13035,6 +13313,10 @@ interface PresentationInkStroke {
|
|
|
13035
13313
|
points: PresentationInkPoint[];
|
|
13036
13314
|
}
|
|
13037
13315
|
//#endregion
|
|
13316
|
+
//#region src/render/paste-special.d.ts
|
|
13317
|
+
/** The four paste formats PowerPoint's Paste Options / Paste Special offer. */
|
|
13318
|
+
type PasteSpecialFormat = 'keep-source-formatting' | 'use-destination-theme' | 'picture' | 'keep-text-only';
|
|
13319
|
+
//#endregion
|
|
13038
13320
|
//#region src/render/find-replace.d.ts
|
|
13039
13321
|
/** Identifies a single match of the find query at segment-level precision. */
|
|
13040
13322
|
interface FindResult {
|
|
@@ -13107,6 +13389,37 @@ interface FontEmbeddingDescriptor {
|
|
|
13107
13389
|
/** Present only when `interactive` is false. */
|
|
13108
13390
|
disabledReasonKey?: string;
|
|
13109
13391
|
}
|
|
13392
|
+
//#endregion
|
|
13393
|
+
//#region src/render/zoom-return-navigation.d.ts
|
|
13394
|
+
/**
|
|
13395
|
+
* The navigation-relevant fields of a Zoom click target, independent of
|
|
13396
|
+
* `zoomType`.
|
|
13397
|
+
*
|
|
13398
|
+
* `returnToParent` is already resolved to its EFFECTIVE value here (not the
|
|
13399
|
+
* raw, possibly-`undefined` `ZoomPptxElement`/`SummaryZoomTarget` field):
|
|
13400
|
+
* `CT_ZoomObjectProperties/@returnToParent` (MS-PPTX) is `<xsd:attribute
|
|
13401
|
+
* name="returnToParent" type="xsd:boolean" use="optional" default="true"/>`,
|
|
13402
|
+
* so an ABSENT attribute means true, not false. Core deliberately stores
|
|
13403
|
+
* `undefined` rather than fabricating `true` (so a round-trip never invents
|
|
13404
|
+
* an attribute the source never had), which makes `Boolean(x)` the wrong way
|
|
13405
|
+
* to read it; the two `resolve*NavigationTarget` functions below are the only
|
|
13406
|
+
* place that distinction should be made.
|
|
13407
|
+
*/
|
|
13408
|
+
interface ZoomNavigationTarget {
|
|
13409
|
+
targetSlideIndex: number;
|
|
13410
|
+
targetSectionId?: string;
|
|
13411
|
+
returnToParent: boolean;
|
|
13412
|
+
transitionDurationMs?: number;
|
|
13413
|
+
}
|
|
13414
|
+
/** A pending "return to the zoom's origin slide" excursion, tracked by the binding across forward-advance steps. */
|
|
13415
|
+
interface ZoomExcursion {
|
|
13416
|
+
/** The slide to jump back to once `endSlideIndex` is passed (the slide the zoom was clicked from). */
|
|
13417
|
+
returnSlideIndex: number;
|
|
13418
|
+
/** The last slide index of the zoom's target range; see {@link resolveZoomExcursionEndIndex}. */
|
|
13419
|
+
endSlideIndex: number;
|
|
13420
|
+
/** The zoom's own `transitionDur`, applied to the jump INTO the target and to the return jump. */
|
|
13421
|
+
transitionDurationMs?: number;
|
|
13422
|
+
}
|
|
13110
13423
|
/** Everything a binding needs to render the recovery dialog, and nothing else. */
|
|
13111
13424
|
interface AutosaveRecoveryPrompt {
|
|
13112
13425
|
/** IndexedDB key the snapshot is stored under (the deck's file path/name). */
|
|
@@ -13743,7 +14056,7 @@ interface ElementContextMenuState {
|
|
|
13743
14056
|
elementId: string;
|
|
13744
14057
|
}
|
|
13745
14058
|
/** Identifies an action triggered from the element right-click context menu. */
|
|
13746
|
-
type ElementContextMenuAction = 'copy' | 'cut' | 'paste' | 'duplicate' | 'delete' | 'bring-forward' | 'send-backward' | 'bring-front' | 'send-back' | 'bringForward' | 'sendBackward' | 'bringToFront' | 'sendToBack' | 'comment' | 'addComment' | 'group' | 'ungroup' | 'editPoints' | 'editHyperlink';
|
|
14059
|
+
type ElementContextMenuAction = 'copy' | 'cut' | 'paste' | 'duplicate' | 'delete' | 'bring-forward' | 'send-backward' | 'bring-front' | 'send-back' | 'bringForward' | 'sendBackward' | 'bringToFront' | 'sendToBack' | 'comment' | 'addComment' | 'group' | 'ungroup' | 'editPoints' | 'editHyperlink' | 'edit-text' | 'save-as-picture' | 'edit-alt-text' | 'size-and-position' | 'format-shape';
|
|
13747
14060
|
/**
|
|
13748
14061
|
* State of an active marquee (rubber-band) selection rectangle.
|
|
13749
14062
|
* Created when the user clicks and drags on the canvas background,
|
|
@@ -13938,6 +14251,11 @@ interface ToolbarProps {
|
|
|
13938
14251
|
onOpenSettings?: () => void;
|
|
13939
14252
|
onRunAccessibilityCheck: () => void;
|
|
13940
14253
|
onToggleSlideSorter: () => void;
|
|
14254
|
+
/**
|
|
14255
|
+
* View > Normal: leave whichever alternate view (slide sorter, reading,
|
|
14256
|
+
* outline, master) is open and return to the ordinary editing canvas.
|
|
14257
|
+
*/
|
|
14258
|
+
onGoToNormalView?: () => void;
|
|
13941
14259
|
/** Enter PowerPoint's Reading View (full window, not the fullscreen show). */
|
|
13942
14260
|
onOpenReadingView: () => void;
|
|
13943
14261
|
/** Enter PowerPoint's Outline view: the deck as editable indented text. */
|
|
@@ -14352,6 +14670,25 @@ interface UseElementManipulationInput {
|
|
|
14352
14670
|
ops: ElementOperations;
|
|
14353
14671
|
history: EditorHistoryResult;
|
|
14354
14672
|
onOpenHyperlinkDialog: () => void;
|
|
14673
|
+
/**
|
|
14674
|
+
* Enter inline text edit for `elementId`, same as double-clicking it.
|
|
14675
|
+
* Wired to `canvasHandlers.handleElementDoubleClick`; omitted (never) in
|
|
14676
|
+
* production, only in tests that do not exercise "Edit Text".
|
|
14677
|
+
*/
|
|
14678
|
+
onEditText?: (elementId: string) => void;
|
|
14679
|
+
/**
|
|
14680
|
+
* Rasterise `elementId`'s own DOM node and download it as PNG ("Save as
|
|
14681
|
+
* Picture"). Lives outside this hook because it needs the binding's
|
|
14682
|
+
* `html2canvasFallback` driver and a DOM lookup, neither of which this
|
|
14683
|
+
* hook otherwise touches.
|
|
14684
|
+
*/
|
|
14685
|
+
onSaveElementAsPicture?: (elementId: string) => void;
|
|
14686
|
+
/**
|
|
14687
|
+
* Notified with the freshly-inserted clone after an ordinary paste, so the
|
|
14688
|
+
* Paste Options mini-toolbar (`usePasteSpecial`) has something to reformat.
|
|
14689
|
+
* Not called for Duplicate: PowerPoint's toolbar only follows a paste.
|
|
14690
|
+
*/
|
|
14691
|
+
onPasted?: (element: PptxElement) => void;
|
|
14355
14692
|
}
|
|
14356
14693
|
interface ElementManipulationHandlers {
|
|
14357
14694
|
handleCopy: () => void;
|
|
@@ -14473,6 +14810,28 @@ interface InsertElementHandlers {
|
|
|
14473
14810
|
}
|
|
14474
14811
|
declare function useInsertElements(input: UseInsertElementsInput): InsertElementHandlers;
|
|
14475
14812
|
//#endregion
|
|
14813
|
+
//#region src/viewer/hooks/usePasteSpecial.d.ts
|
|
14814
|
+
/** The pasted element the "Paste Options" toolbar is currently anchored to. */
|
|
14815
|
+
interface PasteOptionsToolbarState {
|
|
14816
|
+
elementId: string;
|
|
14817
|
+
/** The pristine "Keep Source Formatting" clone every choice re-derives from. */
|
|
14818
|
+
sourceClone: PptxElement;
|
|
14819
|
+
}
|
|
14820
|
+
interface UsePasteSpecialResult {
|
|
14821
|
+
isPasteSpecialDialogOpen: boolean;
|
|
14822
|
+
openPasteSpecialDialog: () => void;
|
|
14823
|
+
closePasteSpecialDialog: () => void;
|
|
14824
|
+
/** Ctrl+Alt+V / dialog OK: paste the clipboard element in the chosen format. */
|
|
14825
|
+
pasteWithFormat: (format: PasteSpecialFormat) => Promise<void>;
|
|
14826
|
+
/** The Paste Options toolbar shown right after an ordinary Ctrl+V paste. */
|
|
14827
|
+
pasteOptionsToolbar: PasteOptionsToolbarState | null;
|
|
14828
|
+
/** Record an ordinary paste's result so the toolbar has something to reformat. */
|
|
14829
|
+
notePastedElement: (element: PptxElement) => void;
|
|
14830
|
+
/** Re-derive the pasted element in `format` from the frozen source clone. */
|
|
14831
|
+
reformatPastedElement: (format: PasteSpecialFormat) => Promise<void>;
|
|
14832
|
+
dismissPasteOptionsToolbar: () => void;
|
|
14833
|
+
}
|
|
14834
|
+
//#endregion
|
|
14476
14835
|
//#region src/viewer/hooks/presentation-mode/useCustomShowRunner.d.ts
|
|
14477
14836
|
/**
|
|
14478
14837
|
* useCustomShowRunner: the runtime side of `ppaction://customshow?id=<id>[&return=true]`.
|
|
@@ -14643,7 +15002,7 @@ interface UsePresentationModeResult {
|
|
|
14643
15002
|
openAllSlides: () => void;
|
|
14644
15003
|
closeAllSlides: () => void;
|
|
14645
15004
|
movePresentationSlide: (direction: 1 | -1, trigger?: SlideAdvanceTrigger) => void;
|
|
14646
|
-
navigateToSlide: (slideIndex: number) => void;
|
|
15005
|
+
navigateToSlide: (slideIndex: number, transitionOverride?: PptxSlideTransition) => void;
|
|
14647
15006
|
/** `elementId` is the clicked element, for the verbs that act on it (`playMedia`, `oleVerb`). */
|
|
14648
15007
|
handlePresentationAction: (action: PptxAction, elementId?: string) => void;
|
|
14649
15008
|
/**
|
|
@@ -14693,13 +15052,14 @@ interface UsePresentationModeResult {
|
|
|
14693
15052
|
rehearsalPaused: boolean;
|
|
14694
15053
|
/** Toggle the rehearsal timer pause state. */
|
|
14695
15054
|
toggleRehearsalPause: () => void;
|
|
14696
|
-
/**
|
|
14697
|
-
|
|
14698
|
-
|
|
14699
|
-
|
|
14700
|
-
|
|
14701
|
-
|
|
14702
|
-
|
|
15055
|
+
/**
|
|
15056
|
+
* Handle a zoom element (or Summary Zoom tile) click in presentation mode:
|
|
15057
|
+
* navigates to the target, applying its own `zmPr/@transitionDur`, and (when
|
|
15058
|
+
* `returnToParent` is set) arms an automatic return once the show reaches
|
|
15059
|
+
* the end of the target's range. See `useZoomNavigation` / `useSlideNavigation`.
|
|
15060
|
+
*/
|
|
15061
|
+
handleZoomClick: (target: ZoomNavigationTarget, returnSlideIndex: number) => void;
|
|
15062
|
+
/** Clear a pending "return to zoom" excursion (e.g. when presentation mode ends). */
|
|
14703
15063
|
clearZoomReturn: () => void;
|
|
14704
15064
|
/** Open the audience display in a separate browser window. Returns `true` if successful. */
|
|
14705
15065
|
openAudienceWindow: () => boolean;
|
|
@@ -15411,8 +15771,22 @@ interface EditorOperationsResult {
|
|
|
15411
15771
|
canvasHandlers: CanvasInteractionHandlers;
|
|
15412
15772
|
insertHandlers: InsertElementHandlers;
|
|
15413
15773
|
manipulation: ElementManipulationHandlers;
|
|
15774
|
+
/** Paste Special (Ctrl+Alt+V) dialog + the post-paste Paste Options toolbar. */
|
|
15775
|
+
pasteSpecial: UsePasteSpecialResult;
|
|
15414
15776
|
slideOps: SlideManagementHandlers;
|
|
15415
15777
|
tableOps: TableOperationHandlers;
|
|
15778
|
+
/**
|
|
15779
|
+
* Ctrl/Cmd+Shift+C: copy the selected element's format, the same capture
|
|
15780
|
+
* the format-painter ribbon toggle triggers, without requiring a
|
|
15781
|
+
* follow-up click to apply it.
|
|
15782
|
+
*/
|
|
15783
|
+
copyFormatFromSelection: () => void;
|
|
15784
|
+
/**
|
|
15785
|
+
* Ctrl/Cmd+Shift+V: apply whatever format `copyFormatFromSelection` (or the
|
|
15786
|
+
* ribbon's format painter) captured onto every given element id, then
|
|
15787
|
+
* clear the copied format the same way the click-to-apply path does.
|
|
15788
|
+
*/
|
|
15789
|
+
pasteFormatToSelection: (targetIds: string[]) => void;
|
|
15416
15790
|
}
|
|
15417
15791
|
declare function useEditorOperations(input: UseEditorOperationsInput): EditorOperationsResult;
|
|
15418
15792
|
//#endregion
|
|
@@ -15569,7 +15943,7 @@ interface SlideCanvasProps {
|
|
|
15569
15943
|
/** All slides in the presentation (for zoom element thumbnails). */
|
|
15570
15944
|
allSlides?: readonly PptxSlide[];
|
|
15571
15945
|
/** Callback fired when a zoom element is clicked in presentation mode. */
|
|
15572
|
-
onZoomClick?: (
|
|
15946
|
+
onZoomClick?: (target: ZoomNavigationTarget, returnSlideIndex: number) => void;
|
|
15573
15947
|
/** Index of the current slide (for zoom return navigation). */
|
|
15574
15948
|
sourceSlideIndex?: number;
|
|
15575
15949
|
/** Context for text field placeholder substitution (slide number, header/footer, etc.). */
|
|
@@ -16957,6 +17331,16 @@ interface UseKeyboardShortcutWiringInput {
|
|
|
16957
17331
|
* apply the same way they do for the button).
|
|
16958
17332
|
*/
|
|
16959
17333
|
onSetMode: (mode: ViewerMode) => void;
|
|
17334
|
+
/** Ctrl/Cmd+M: the same entry point the ribbon's "New Slide" button uses. */
|
|
17335
|
+
handleAddSlide: () => void;
|
|
17336
|
+
/** Ctrl/Cmd+K: open the hyperlink dialog for the current selection. */
|
|
17337
|
+
onOpenHyperlinkDialog: () => void;
|
|
17338
|
+
/** Ctrl/Cmd+Shift+C: capture the current selection's format for the format painter. */
|
|
17339
|
+
copyFormatFromSelection: () => void;
|
|
17340
|
+
/** Ctrl/Cmd+Shift+V: apply the copied format to the given element ids. */
|
|
17341
|
+
pasteFormatToSelection: (targetIds: string[]) => void;
|
|
17342
|
+
/** Ctrl/Cmd+Alt+V: open the Paste Special dialog. */
|
|
17343
|
+
onPasteSpecial: () => void;
|
|
16960
17344
|
}
|
|
16961
17345
|
declare function useKeyboardShortcutWiring(input: UseKeyboardShortcutWiringInput): void;
|
|
16962
17346
|
//#endregion
|
|
@@ -17281,6 +17665,8 @@ interface ClipboardInput {
|
|
|
17281
17665
|
} | null>>;
|
|
17282
17666
|
ops: ElementOperations;
|
|
17283
17667
|
history: EditorHistoryResult;
|
|
17668
|
+
/** Notified with the freshly-inserted clone after an ordinary paste. */
|
|
17669
|
+
onPasted?: (element: PptxElement) => void;
|
|
17284
17670
|
}
|
|
17285
17671
|
declare function useClipboardHandlers(input: ClipboardInput): ClipboardHandlers;
|
|
17286
17672
|
//#endregion
|
|
@@ -17468,6 +17854,36 @@ interface UseKeyboardShortcutsInput {
|
|
|
17468
17854
|
onStartShowFromBeginning: () => void;
|
|
17469
17855
|
/** `Shift+F5`: start the show on the current slide. Same entry point as the ribbon's "From Current Slide". */
|
|
17470
17856
|
onStartShowFromCurrent: () => void;
|
|
17857
|
+
/** Ctrl/Cmd+L: set paragraph alignment to left. */
|
|
17858
|
+
onAlignLeft?: () => void;
|
|
17859
|
+
/** Ctrl/Cmd+E: set paragraph alignment to center. */
|
|
17860
|
+
onAlignCenter?: () => void;
|
|
17861
|
+
/** Ctrl/Cmd+R: set paragraph alignment to right. */
|
|
17862
|
+
onAlignRight?: () => void;
|
|
17863
|
+
/** Ctrl/Cmd+J: set paragraph alignment to justify. */
|
|
17864
|
+
onAlignJustify?: () => void;
|
|
17865
|
+
/** Ctrl/Cmd+Shift+> or Ctrl/Cmd+]: step the selection's font size up PowerPoint's size ladder. */
|
|
17866
|
+
onIncreaseFontSize?: () => void;
|
|
17867
|
+
/** Ctrl/Cmd+Shift+< or Ctrl/Cmd+[: step the selection's font size down PowerPoint's size ladder. */
|
|
17868
|
+
onDecreaseFontSize?: () => void;
|
|
17869
|
+
/** Ctrl/Cmd+Shift+C: copy the selection's formatting (format painter). */
|
|
17870
|
+
onCopyFormat?: () => void;
|
|
17871
|
+
/** Ctrl/Cmd+Shift+V: apply the copied formatting to the selection. */
|
|
17872
|
+
onPasteFormat?: () => void;
|
|
17873
|
+
/** Ctrl/Cmd+M: insert a new slide. */
|
|
17874
|
+
onNewSlide?: () => void;
|
|
17875
|
+
/** Ctrl/Cmd+K: open the hyperlink dialog. */
|
|
17876
|
+
onHyperlink?: () => void;
|
|
17877
|
+
/** Ctrl/Cmd+H: open Find and Replace. */
|
|
17878
|
+
onFindReplace?: () => void;
|
|
17879
|
+
/** Ctrl/Cmd+Space: clear character formatting on the selection. */
|
|
17880
|
+
onClearFormatting?: () => void;
|
|
17881
|
+
/** Tab: select the next element on the slide. */
|
|
17882
|
+
onCycleSelectionNext?: () => void;
|
|
17883
|
+
/** Shift+Tab: select the previous element on the slide. */
|
|
17884
|
+
onCycleSelectionPrev?: () => void;
|
|
17885
|
+
/** Ctrl/Cmd+Alt+V: open the Paste Special dialog. */
|
|
17886
|
+
onPasteSpecial?: () => void;
|
|
17471
17887
|
}
|
|
17472
17888
|
declare function useKeyboardShortcuts(input: UseKeyboardShortcutsInput): void;
|
|
17473
17889
|
//#endregion
|
|
@@ -17709,10 +18125,18 @@ interface UseSlideNavigationInput {
|
|
|
17709
18125
|
onOleVerb?: (verb: number, elementId: string | undefined) => void;
|
|
17710
18126
|
/** `ppaction://program`. */
|
|
17711
18127
|
onRunProgram?: (target: string) => void;
|
|
18128
|
+
/**
|
|
18129
|
+
* A pending "return to zoom" excursion armed by `useZoomNavigation`'s
|
|
18130
|
+
* `handleZoomClick`. Consulted on every forward advance: once the show
|
|
18131
|
+
* reaches `excursion.endSlideIndex`, the step jumps back to
|
|
18132
|
+
* `excursion.returnSlideIndex` (playing the zoom's own `transitionDur`)
|
|
18133
|
+
* instead of continuing linearly through the deck.
|
|
18134
|
+
*/
|
|
18135
|
+
zoomExcursionRef: React.RefObject<ZoomExcursion | undefined>;
|
|
17712
18136
|
}
|
|
17713
18137
|
interface UseSlideNavigationResult {
|
|
17714
18138
|
movePresentationSlide: (direction: 1 | -1, trigger?: SlideAdvanceTrigger) => void;
|
|
17715
|
-
navigateToSlide: (slideIndex: number) => void;
|
|
18139
|
+
navigateToSlide: (slideIndex: number, transitionOverride?: PptxSlideTransition) => void;
|
|
17716
18140
|
/** `elementId` is the clicked element, for the verbs that act on it (`playMedia`, `oleVerb`). */
|
|
17717
18141
|
handlePresentationAction: (action: PptxAction, elementId?: string) => void;
|
|
17718
18142
|
scheduleAutoAdvanceForSlide: (slideIndex: number) => void;
|
|
@@ -17724,43 +18148,38 @@ declare function useSlideNavigation(input: UseSlideNavigationInput): UseSlideNav
|
|
|
17724
18148
|
* Input for the useZoomNavigation sub-hook.
|
|
17725
18149
|
*/
|
|
17726
18150
|
interface UseZoomNavigationInput {
|
|
17727
|
-
|
|
17728
|
-
|
|
18151
|
+
slides: readonly PptxSlide[];
|
|
18152
|
+
/** Navigate to a specific slide index, optionally overriding the destination's own transition. */
|
|
18153
|
+
navigateToSlide: (slideIndex: number, transitionOverride?: PptxSlideTransition) => void;
|
|
18154
|
+
/**
|
|
18155
|
+
* Shared with `useSlideNavigation`'s forward-advance step: set here on a
|
|
18156
|
+
* zoom click that requests `returnToParent`, and consumed there once the
|
|
18157
|
+
* show reaches the end of the zoom's target range.
|
|
18158
|
+
*/
|
|
18159
|
+
zoomExcursionRef: React.RefObject<ZoomExcursion | undefined>;
|
|
17729
18160
|
}
|
|
17730
18161
|
/**
|
|
17731
18162
|
* Return type for the useZoomNavigation sub-hook.
|
|
17732
18163
|
*/
|
|
17733
18164
|
interface UseZoomNavigationResult {
|
|
17734
18165
|
/**
|
|
17735
|
-
* Handle a zoom element click
|
|
17736
|
-
*
|
|
17737
|
-
|
|
17738
|
-
|
|
17739
|
-
|
|
17740
|
-
* The slide index to return to after a zoom navigation, or `null` if
|
|
17741
|
-
* there is no pending return.
|
|
17742
|
-
*/
|
|
17743
|
-
zoomReturnSlideIndex: React.RefObject<number | null>;
|
|
17744
|
-
/**
|
|
17745
|
-
* Navigate back to the zoom summary slide (if a return index is set).
|
|
17746
|
-
* Returns `true` if navigation occurred, `false` otherwise.
|
|
17747
|
-
*/
|
|
17748
|
-
returnToZoomSlide: () => boolean;
|
|
17749
|
-
/**
|
|
17750
|
-
* Clear the stored return index (e.g. when the user manually navigates
|
|
17751
|
-
* away from the zoomed section).
|
|
18166
|
+
* Handle a zoom element (or Summary Zoom tile) click: navigates to the
|
|
18167
|
+
* target slide, applying the zoom's own `transitionDur` when authored, and
|
|
18168
|
+
* (when the target's `returnToParent` is set) arms an excursion so the
|
|
18169
|
+
* next forward "advance" past the target's range returns here instead of
|
|
18170
|
+
* continuing linearly through the deck.
|
|
17752
18171
|
*/
|
|
18172
|
+
handleZoomClick: (target: ZoomNavigationTarget, returnSlideIndex: number) => void;
|
|
18173
|
+
/** Clear a pending zoom excursion (e.g. when presentation mode ends). */
|
|
17753
18174
|
clearZoomReturn: () => void;
|
|
17754
18175
|
}
|
|
17755
18176
|
/**
|
|
17756
18177
|
* Sub-hook that manages zoom element navigation in presentation mode.
|
|
17757
18178
|
*
|
|
17758
|
-
*
|
|
17759
|
-
*
|
|
17760
|
-
*
|
|
17761
|
-
*
|
|
17762
|
-
* The caller can later use `returnToZoomSlide()` to navigate back to
|
|
17763
|
-
* the summary zoom slide.
|
|
18179
|
+
* The actual "return to zoom" jump is executed by `useSlideNavigation`'s
|
|
18180
|
+
* forward-advance step (it owns the deck's natural next-slide computation);
|
|
18181
|
+
* this hook only arms the excursion `useSlideNavigation` consults, via the
|
|
18182
|
+
* `zoomExcursionRef` both hooks share.
|
|
17764
18183
|
*/
|
|
17765
18184
|
declare function useZoomNavigation(input: UseZoomNavigationInput): UseZoomNavigationResult;
|
|
17766
18185
|
//#endregion
|