pptx-angular-viewer 1.31.5 → 2.0.1
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 +26 -0
- package/fesm2022/pptx-angular-viewer-chat-history-idb-D2zc6UxX.mjs +106 -0
- package/fesm2022/pptx-angular-viewer-chat-history-idb-D2zc6UxX.mjs.map +1 -0
- package/fesm2022/pptx-angular-viewer-pptx-angular-viewer-D9eqILzM.mjs +112163 -0
- package/fesm2022/pptx-angular-viewer-pptx-angular-viewer-D9eqILzM.mjs.map +1 -0
- package/fesm2022/pptx-angular-viewer.mjs +1 -101773
- package/fesm2022/pptx-angular-viewer.mjs.map +1 -1
- package/package.json +13 -3
- package/pptx-angular-viewer.css +1 -1
- package/types/pptx-angular-viewer.d.ts +1630 -228
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as pptx_viewer_core from 'pptx-viewer-core';
|
|
2
|
-
import { PptxSlide, PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxChartSeries, PptxChartData, PptxElementAnimation, PptxAnimationPreset, PptxAnimationDirection, PptxAnimationRepeatMode, PptxAnimationSequence, PptxAnimationTimingCurve, PptxAnimationTrigger, TablePptxElement, PptxSection, OlePptxElement, TextSegment, TextStyle, PptxTransitionType, SmartArtColorScheme, PptxSmartArtChrome, PptxSmartArtDrawingShape, SmartArtStyle, PptxSmartArtData, PptxEmbeddedFont, SmartArtLayout, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, InkPptxElement, PptxComment, PptxChartType,
|
|
2
|
+
import { PptxThemePreset, PptxSlide, PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxChartSeries, PptxChartData, PptxElementAnimation, PptxAnimationPreset, PptxAnimationDirection, PptxAnimationRepeatMode, PptxAnimationSequence, PptxAnimationTimingCurve, PptxAnimationTrigger, ParsedTableStyleMap, PptxThemeColorScheme, PptxThemeFontScheme, TablePptxElement, PptxSection, OlePptxElement, TextSegment, TextStyle, PptxTransitionType, SmartArtColorScheme, PptxSmartArtChrome, PptxSmartArtDrawingShape, SmartArtStyle, PptxSmartArtData, PptxEmbeddedFont, SmartArtLayout, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, InkPptxElement, PptxComment, PptxChartType, PptxTheme, PptxHandler, PptxData, PptxHeaderFooter, PptxSlideMaster, PptxNotesMaster, PptxHandoutMaster, PptxPresentationProperties, PptxCoreProperties, PptxAppProperties, PptxThemeOption, PptxCustomProperty, ParsedSignature, PptxSaveFormat, PptxTableCell, PptxTableCellStyle, PptxTableRow, PptxTableData, PptxCustomShow, MasterViewTab, SvgExportOptions, Model3DPptxElement, ZoomPptxElement, PptxSlideTransition, ChartPptxElement, MediaPptxElement, SmartArtPptxElement, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, SignatureStatus, ElementActionType, ElementAction, PptxImageEffects, MediaBookmark, ColorMapAliasKey, ChartAxisEdit, ChartDataPointLabelEdit, PptxChartLegendPosition, PptxChartStyle, ChartAxisTitleStyleEdit, ChartGridlineStyleEdit, PptxChartMarkerSymbol, PptxSmartArtNode, SmartArtLayoutType, PptxSmartArtNodeStyle, MediaCaptionTrack, PptxMediaType } from 'pptx-viewer-core';
|
|
3
3
|
export { SWITCHABLE_LAYOUT_TYPES, addSmartArtNode, addSmartArtNodeAsChild, chartDataAddCategory, chartDataAddSeries, chartDataChangeType, chartDataRemoveCategory, chartDataRemoveSeries, chartDataUpdatePoint, demoteSmartArtNode, promoteSmartArtNode, removeSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, updateSmartArtNodeText } from 'pptx-viewer-core';
|
|
4
4
|
import * as _angular_core from '@angular/core';
|
|
5
5
|
import { Signal, WritableSignal, OnDestroy, OnInit, OnChanges, SimpleChanges, InjectionToken, Provider } from '@angular/core';
|
|
6
|
+
import * as AiSdk from 'ai';
|
|
7
|
+
import { LanguageModel, ChatTransport, UIMessage, ToolSet } from 'ai';
|
|
6
8
|
import * as pptx_angular_viewer from 'pptx-angular-viewer';
|
|
7
9
|
import { TranslateService } from '@ngx-translate/core';
|
|
8
10
|
import { Options } from 'html2canvas-pro';
|
|
@@ -152,6 +154,29 @@ declare const THEME_CATALOG: readonly ThemeCatalogEntry[];
|
|
|
152
154
|
/** Look up a catalog entry by key, falling back to `undefined` (the built-in default) if not found. */
|
|
153
155
|
declare function resolveThemeCatalogEntry(key: string | undefined, catalog?: readonly ThemeCatalogEntry[]): ViewerTheme | undefined;
|
|
154
156
|
|
|
157
|
+
/**
|
|
158
|
+
* theme-gallery-presets: the exact theme set shown in the Design tab's Browse
|
|
159
|
+
* Themes gallery, shared by every binding.
|
|
160
|
+
*
|
|
161
|
+
* This is a DIFFERENT set from core's `THEME_PRESETS`: it adds Wisp, Berlin,
|
|
162
|
+
* Slice, and Dividend and omits Slate and Metropolitan, in this order:
|
|
163
|
+
*
|
|
164
|
+
* office, facet, integral, ion, retrospect, organic,
|
|
165
|
+
* wisp, berlin, slice, dividend
|
|
166
|
+
*
|
|
167
|
+
* The six themes that also exist in core (office, facet, integral, ion,
|
|
168
|
+
* organic, retrospect) are reused verbatim from core's `THEME_PRESETS` (looked
|
|
169
|
+
* up by id) so their colour/font schemes stay canonical. The four gallery-only
|
|
170
|
+
* themes are defined here as `PptxThemePreset` values with core's nested
|
|
171
|
+
* `{ majorFont: { latin }, minorFont: { latin } }` font-scheme shape.
|
|
172
|
+
*/
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* The gallery theme set, in canonical order. Six canonical core presets plus
|
|
176
|
+
* the four gallery-only additions.
|
|
177
|
+
*/
|
|
178
|
+
declare const GALLERY_THEME_PRESETS: readonly PptxThemePreset[];
|
|
179
|
+
|
|
155
180
|
/**
|
|
156
181
|
* Framework-agnostic public types shared by the viewer bindings.
|
|
157
182
|
*
|
|
@@ -532,6 +557,20 @@ interface LineShadowParams {
|
|
|
532
557
|
color: string;
|
|
533
558
|
opacity: number;
|
|
534
559
|
}
|
|
560
|
+
/**
|
|
561
|
+
* A fill-overlay tint layer: the overlay {@link https://developer.mozilla.org/en-US/docs/Web/CSS/color colour}
|
|
562
|
+
* (an `rgba()` string carrying the overlay's alpha) plus the `mix-blend-mode`
|
|
563
|
+
* used to composite it over the element. Unlike the whole-element
|
|
564
|
+
* {@link getEffectDagBlendMode} proxy, this describes a *separate* coloured
|
|
565
|
+
* layer the integrator should paint on top of the element (e.g. an absolutely
|
|
566
|
+
* positioned pseudo-element / child), so the tint colour is actually rendered.
|
|
567
|
+
*/
|
|
568
|
+
interface FillOverlayCss {
|
|
569
|
+
/** Overlay colour as an `rgba()`/hex string (already includes opacity). */
|
|
570
|
+
color: string;
|
|
571
|
+
/** `mix-blend-mode` for the overlay layer (`normal` for the `over` blend). */
|
|
572
|
+
blendMode: string;
|
|
573
|
+
}
|
|
535
574
|
|
|
536
575
|
/**
|
|
537
576
|
* Text warp / WordArt logic — Vue port of the React
|
|
@@ -933,6 +972,13 @@ interface ChartViewModel {
|
|
|
933
972
|
* hierarchical kinds, where a vertical drag has no single-value meaning.
|
|
934
973
|
*/
|
|
935
974
|
valueDrag?: ChartValueDrag;
|
|
975
|
+
/**
|
|
976
|
+
* Drawing-overlay primitives resolved from the chart's `c:userShapes`
|
|
977
|
+
* (shapes/text drawn on top of the plot). Already appended to `primitives`;
|
|
978
|
+
* surfaced separately so projectors can segregate them if desired. Absent
|
|
979
|
+
* when the chart has no overlay.
|
|
980
|
+
*/
|
|
981
|
+
userShapes?: SvgPrimitive[];
|
|
936
982
|
}
|
|
937
983
|
declare function buildGridlinesAndLabels(range: ValueRange, layout: PlotLayout): {
|
|
938
984
|
gridlines: SvgLine[];
|
|
@@ -1459,6 +1505,83 @@ declare function revealedElementStyles(groups: readonly AnimationClickGroup[], s
|
|
|
1459
1505
|
*/
|
|
1460
1506
|
declare function pendingElementStyles(groups: readonly AnimationClickGroup[], step: number): Map<string, CSSProperties>;
|
|
1461
1507
|
|
|
1508
|
+
/**
|
|
1509
|
+
* `animation-timeline-types` — pure interfaces for the native-animation
|
|
1510
|
+
* (OOXML `p:timing` tree) playback engine shared by every binding.
|
|
1511
|
+
*
|
|
1512
|
+
* These describe the *parsed* native animation model (`PptxNativeAnimation`,
|
|
1513
|
+
* driven by `presetClass` / `presetId`), as opposed to the editor-level
|
|
1514
|
+
* {@link import('./animation-css').AnimationCssResult} model in `animation-css`
|
|
1515
|
+
* (driven by `PptxElementAnimation` preset strings). Both coexist in shared.
|
|
1516
|
+
*
|
|
1517
|
+
* @module render/animation-timeline-types
|
|
1518
|
+
*/
|
|
1519
|
+
|
|
1520
|
+
/**
|
|
1521
|
+
* Normalized staged-reveal mode for a chart graphic frame, derived from the
|
|
1522
|
+
* OOXML `a:bldChart/@bld` (or `p:bldOleChart/@bld`) token:
|
|
1523
|
+
* - `asOne` the whole chart appears at once (`allAtOnce`).
|
|
1524
|
+
* - `bySeries` one data series is revealed per stage (`series`).
|
|
1525
|
+
* - `byCategory` one category is revealed per stage (`category`).
|
|
1526
|
+
* - `byElement` one series/category ELEMENT is revealed per stage
|
|
1527
|
+
* (`seriesElement` / `categoryElement`).
|
|
1528
|
+
*/
|
|
1529
|
+
type ChartBuildMode = 'asOne' | 'bySeries' | 'byCategory' | 'byElement';
|
|
1530
|
+
/**
|
|
1531
|
+
* Normalized staged-reveal mode for a SmartArt diagram, derived from the OOXML
|
|
1532
|
+
* `a:bldDgm/@bld` or `p:bldDgm/@bld` token:
|
|
1533
|
+
* - `asOne` the whole diagram appears at once (`whole` / `allAtOnce`).
|
|
1534
|
+
* - `byOne` one node is revealed per stage (`one`, and the assorted
|
|
1535
|
+
* `depthBy*` / `breadthBy*` / directional traversals).
|
|
1536
|
+
* - `byLvl` levels are revealed one element at a time (`lvlOne`).
|
|
1537
|
+
* - `byLvlAtOnce` a whole level is revealed per stage (`lvlAtOnce`).
|
|
1538
|
+
*/
|
|
1539
|
+
type DiagramBuildMode = 'asOne' | 'byOne' | 'byLvl' | 'byLvlAtOnce';
|
|
1540
|
+
/**
|
|
1541
|
+
* Playback-time staged-build state surfaced on {@link ElementAnimationState}.
|
|
1542
|
+
* `progress` is the 0..1 fraction of the build revealed at the current playback
|
|
1543
|
+
* time; a consumer maps it to its own item COUNT (see `revealedStageCount`).
|
|
1544
|
+
*/
|
|
1545
|
+
type ElementBuildState = {
|
|
1546
|
+
kind: 'chart';
|
|
1547
|
+
mode: ChartBuildMode;
|
|
1548
|
+
progress: number;
|
|
1549
|
+
} | {
|
|
1550
|
+
kind: 'diagram';
|
|
1551
|
+
mode: DiagramBuildMode;
|
|
1552
|
+
progress: number;
|
|
1553
|
+
};
|
|
1554
|
+
/** Snapshot of a single element's animation state at a point in the timeline. */
|
|
1555
|
+
interface ElementAnimationState {
|
|
1556
|
+
/** Whether the element should be visible. */
|
|
1557
|
+
visible: boolean;
|
|
1558
|
+
/** CSS animation shorthand to apply (undefined = no active animation). */
|
|
1559
|
+
cssAnimation: string | undefined;
|
|
1560
|
+
/**
|
|
1561
|
+
* Staged-build reveal state, present only when the active animation builds a
|
|
1562
|
+
* chart or SmartArt diagram in stages (`p:bldChart` / `p:bldDgm`) rather than
|
|
1563
|
+
* revealing the whole element at once. A staged renderer multiplies
|
|
1564
|
+
* `build.progress` (0..1) by its own series / category / level COUNT to
|
|
1565
|
+
* decide how many stages are revealed at the current playback time; see
|
|
1566
|
+
* {@link import('./animation-build').revealedStageCount}. Absent for ordinary
|
|
1567
|
+
* whole-element entrances, so existing renderers are unaffected.
|
|
1568
|
+
*/
|
|
1569
|
+
build?: ElementBuildState;
|
|
1570
|
+
/**
|
|
1571
|
+
* True when an active `p:animClr` color animation targets this shape's fill.
|
|
1572
|
+
* A vector renderer should then paint the fill with `fill: inherit` so the
|
|
1573
|
+
* wrapper-level colour keyframes cascade to the SVG path. Absent/false means
|
|
1574
|
+
* no active fill-colour animation.
|
|
1575
|
+
*/
|
|
1576
|
+
animatesFill?: boolean;
|
|
1577
|
+
/**
|
|
1578
|
+
* True when an active `p:animClr` color animation targets this shape's
|
|
1579
|
+
* stroke. A vector renderer should then paint the stroke with
|
|
1580
|
+
* `stroke: inherit`. Absent/false means no active stroke-colour animation.
|
|
1581
|
+
*/
|
|
1582
|
+
animatesStroke?: boolean;
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1462
1585
|
/**
|
|
1463
1586
|
* table-style.ts — framework-agnostic table render helpers.
|
|
1464
1587
|
*
|
|
@@ -1481,6 +1604,25 @@ declare function pendingElementStyles(groups: readonly AnimationClickGroup[], st
|
|
|
1481
1604
|
* passed to {@link getTableCellBandStyle}.
|
|
1482
1605
|
*/
|
|
1483
1606
|
|
|
1607
|
+
/**
|
|
1608
|
+
* Context for resolving table style section fills and text properties from
|
|
1609
|
+
* the PPTX theme's colour scheme.
|
|
1610
|
+
*
|
|
1611
|
+
* Both fields are optional so callers that don't have the theme wired in yet
|
|
1612
|
+
* can omit the context and the function falls back to hardcoded colours.
|
|
1613
|
+
*/
|
|
1614
|
+
interface TableStyleContext {
|
|
1615
|
+
/** Parsed table style map (from `ppt/tableStyles.xml`). */
|
|
1616
|
+
tableStyleMap?: ParsedTableStyleMap;
|
|
1617
|
+
/** Theme colour scheme from the active PPTX theme. */
|
|
1618
|
+
colorScheme?: PptxThemeColorScheme;
|
|
1619
|
+
/**
|
|
1620
|
+
* Theme font scheme from the active PPTX theme. Supplied so a table
|
|
1621
|
+
* style's `a:fontRef@idx` (`minor`/`major`) can resolve to a concrete
|
|
1622
|
+
* font family. Optional: when absent, `fontRefIdx` is left unresolved.
|
|
1623
|
+
*/
|
|
1624
|
+
fontScheme?: PptxThemeFontScheme;
|
|
1625
|
+
}
|
|
1484
1626
|
/** Map an OOXML `a:prstDash/@val` value to a CSS `border-style` keyword. */
|
|
1485
1627
|
declare function ooxmlDashToCssBorderStyle(dashVal: string | undefined): string;
|
|
1486
1628
|
/**
|
|
@@ -2490,6 +2632,14 @@ interface ConnectorRouting {
|
|
|
2490
2632
|
interface MarkerShape {
|
|
2491
2633
|
shape: 'path' | 'circle';
|
|
2492
2634
|
d?: string;
|
|
2635
|
+
/**
|
|
2636
|
+
* Suggested `markerWidth` (along the line: arrow *length*). Derived from the
|
|
2637
|
+
* connector's `@len` size token. Bindings should apply this instead of a
|
|
2638
|
+
* hard-coded value so `sm`/`lg` arrows scale. Defaults to the historical `4`.
|
|
2639
|
+
*/
|
|
2640
|
+
markerWidth: number;
|
|
2641
|
+
/** Suggested `markerHeight` (perpendicular: arrow *width*, from `@w`). */
|
|
2642
|
+
markerHeight: number;
|
|
2493
2643
|
}
|
|
2494
2644
|
/** All derived connector rendering values, computed from a `PptxElement`. */
|
|
2495
2645
|
interface ConnectorGeometry {
|
|
@@ -2864,7 +3014,7 @@ interface SlideTransitionAnimations {
|
|
|
2864
3014
|
* faithful Office 2010 (`p14`) keyframes, so both the classic and exotic / 3-D
|
|
2865
3015
|
* transitions animate wherever this single string is injected.
|
|
2866
3016
|
*/
|
|
2867
|
-
declare const SLIDE_TRANSITION_KEYFRAMES = "\n/* \u2500\u2500 Fade \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fade-in {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n@keyframes pptx-tr-fade-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; }\n}\n\n/* \u2500\u2500 Push \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-push-in-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-push-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-push-in-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-push-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-push-in-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-push-out-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-push-in-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-push-out-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n\n/* \u2500\u2500 Cover (incoming slides over stationary outgoing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-cover-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-cover-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-cover-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-cover-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-cover-from-lu {\n\tfrom { transform: translate(-100%, -100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-ld {\n\tfrom { transform: translate(-100%, 100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-ru {\n\tfrom { transform: translate(100%, -100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-rd {\n\tfrom { transform: translate(100%, 100%); }\n\tto { transform: translate(0, 0); }\n}\n\n/* \u2500\u2500 Uncover (outgoing slides away revealing stationary incoming) \u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-uncover-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-uncover-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-uncover-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-uncover-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n@keyframes pptx-tr-uncover-to-lu {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(-100%, -100%); }\n}\n@keyframes pptx-tr-uncover-to-ld {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(-100%, 100%); }\n}\n@keyframes pptx-tr-uncover-to-ru {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(100%, -100%); }\n}\n@keyframes pptx-tr-uncover-to-rd {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(100%, 100%); }\n}\n\n/* \u2500\u2500 Wipe (clip-path reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wipe-from-left {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-right {\n\tfrom { clip-path: inset(0 0 0 100%); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-top {\n\tfrom { clip-path: inset(0 0 100% 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-bottom {\n\tfrom { clip-path: inset(100% 0 0 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n\n/* \u2500\u2500 Split \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-split-h-out {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-split-v-out {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-split-h-in {\n\tfrom { clip-path: inset(0 0); }\n\tto { clip-path: inset(0 50%); }\n}\n@keyframes pptx-tr-split-v-in {\n\tfrom { clip-path: inset(0 0); }\n\tto { clip-path: inset(50% 0); }\n}\n\n/* \u2500\u2500 Dissolve \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-dissolve-in {\n\tfrom { opacity: 0; filter: blur(4px); }\n\tto { opacity: 1; filter: blur(0px); }\n}\n\n/* \u2500\u2500 Circle / Diamond / Plus (clip-path shapes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-circle-in {\n\tfrom { clip-path: circle(0% at 50% 50%); }\n\tto { clip-path: circle(75% at 50% 50%); }\n}\n@keyframes pptx-tr-diamond-in {\n\tfrom { clip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%); }\n\tto { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); }\n}\n@keyframes pptx-tr-plus-in {\n\tfrom {\n\t\tclip-path: polygon(\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%,\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%,\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%\n\t\t);\n\t}\n\tto {\n\t\tclip-path: polygon(\n\t\t\t33% 0%, 66% 0%, 66% 33%, 100% 33%,\n\t\t\t100% 66%, 66% 66%, 66% 100%, 33% 100%,\n\t\t\t33% 66%, 0% 66%, 0% 33%, 33% 33%\n\t\t);\n\t}\n}\n\n/* \u2500\u2500 Wedge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wedge-in {\n\tfrom { clip-path: polygon(50% 0%, 50% 0%, 50% 0%); }\n\tto { clip-path: polygon(50% 0%, 100% 100%, 0% 100%); }\n}\n\n/* \u2500\u2500 Zoom \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-zoom-in {\n\tfrom { transform: scale(0); opacity: 0; }\n\tto { transform: scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-zoom-out {\n\tfrom { transform: scale(1); opacity: 1; }\n\tto { transform: scale(2); opacity: 0; }\n}\n\n/* \u2500\u2500 Blinds \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-blinds-h {\n\tfrom { clip-path: inset(0 0 100% 0); }\n\tto { clip-path: inset(0); }\n}\n@keyframes pptx-tr-blinds-v {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Checker (approximate with dissolve + contrast) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-checker-in {\n\tfrom { opacity: 0; filter: contrast(2) blur(2px); }\n\tto { opacity: 1; filter: contrast(1) blur(0); }\n}\n\n/* \u2500\u2500 Comb \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-comb-h {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0); }\n}\n@keyframes pptx-tr-comb-v {\n\tfrom { clip-path: inset(100% 0 0 0); }\n\tto { clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Strips (diagonal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-strips-lu {\n\tfrom { clip-path: polygon(0% 0%, 0% 0%, 0% 0%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-ld {\n\tfrom { clip-path: polygon(0% 100%, 0% 100%, 0% 100%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-ru {\n\tfrom { clip-path: polygon(100% 0%, 100% 0%, 100% 0%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-rd {\n\tfrom { clip-path: polygon(100% 100%, 100% 100%, 100% 100%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n\n/* \u2500\u2500 RandomBar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-randombar-h {\n\tfrom { opacity: 0; clip-path: inset(0 0 100% 0); }\n\tto { opacity: 1; clip-path: inset(0); }\n}\n@keyframes pptx-tr-randombar-v {\n\tfrom { opacity: 0; clip-path: inset(0 100% 0 0); }\n\tto { opacity: 1; clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Newsflash \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-newsflash-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n\n/* \u2500\u2500 Wheel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wheel-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\n/* \u2500\u2500 Conveyor (translate X with staggered timing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Doors (clip-path from center split) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-doors-horz {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-doors-vert {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n\n/* \u2500\u2500 Ferris (rotate elements around center) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Flash (bright flash opacity burst) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Flythrough (scale + translate Z-axis feel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Gallery (translate with perspective) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Glitter (particle dissolve effect) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Honeycomb (hexagonal reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Pan (large-scale translate) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Prism (3D rotation via perspective transform) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Reveal (slide away reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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@keyframes pptx-tr-reveal-in {\n\tfrom { opacity: 0.5; }\n\tto { opacity: 1; }\n}\n\n/* \u2500\u2500 Ripple (expanding ring clip-path) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Shred (fragmented clip-path pieces) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Switch (flip/rotate swap) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Vortex (rotate + scale spiral) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Warp (skew distortion) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-warp-in {\n\tfrom { transform: scale(0.3) skewX(30deg) skewY(15deg); opacity: 0; }\n\t50% { transform: scale(0.8) skewX(-5deg) skewY(-3deg); opacity: 0.7; }\n\tto { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-warp-out {\n\tfrom { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; }\n\t50% { transform: scale(0.8) skewX(5deg) skewY(3deg); opacity: 0.7; }\n\tto { transform: scale(0.3) skewX(-30deg) skewY(-15deg); opacity: 0; }\n}\n@keyframes pptx-tr-warp-reverse-in {\n\tfrom { transform: scale(3) skewX(-20deg) skewY(-10deg); opacity: 0; filter: blur(4px); }\n\tto { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-warp-reverse-out {\n\tfrom { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; filter: blur(0); }\n\tto { transform: scale(3) skewX(20deg) skewY(10deg); opacity: 0; filter: blur(4px); }\n}\n\n/* \u2500\u2500 WheelReverse (reverse wheel rotation) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Window (scale from center with border) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-window-horz {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-vert {\n\tfrom { clip-path: inset(50% 0); }\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";
|
|
3017
|
+
declare const SLIDE_TRANSITION_KEYFRAMES = "\n/* \u2500\u2500 Fade \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fade-in {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n@keyframes pptx-tr-fade-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; }\n}\n\n/* \u2500\u2500 Push \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-push-in-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-push-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-push-in-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-push-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-push-in-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-push-out-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-push-in-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-push-out-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n\n/* \u2500\u2500 Cover (incoming slides over stationary outgoing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-cover-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-cover-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-cover-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-cover-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-cover-from-lu {\n\tfrom { transform: translate(-100%, -100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-ld {\n\tfrom { transform: translate(-100%, 100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-ru {\n\tfrom { transform: translate(100%, -100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-rd {\n\tfrom { transform: translate(100%, 100%); }\n\tto { transform: translate(0, 0); }\n}\n\n/* \u2500\u2500 Uncover (outgoing slides away revealing stationary incoming) \u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-uncover-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-uncover-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-uncover-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-uncover-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n@keyframes pptx-tr-uncover-to-lu {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(-100%, -100%); }\n}\n@keyframes pptx-tr-uncover-to-ld {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(-100%, 100%); }\n}\n@keyframes pptx-tr-uncover-to-ru {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(100%, -100%); }\n}\n@keyframes pptx-tr-uncover-to-rd {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(100%, 100%); }\n}\n\n/* \u2500\u2500 Wipe (clip-path reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wipe-from-left {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-right {\n\tfrom { clip-path: inset(0 0 0 100%); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-top {\n\tfrom { clip-path: inset(0 0 100% 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-bottom {\n\tfrom { clip-path: inset(100% 0 0 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n\n/* \u2500\u2500 Split \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-split-h-out {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-split-v-out {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-split-h-in {\n\tfrom { clip-path: inset(0 0); }\n\tto { clip-path: inset(0 50%); }\n}\n@keyframes pptx-tr-split-v-in {\n\tfrom { clip-path: inset(0 0); }\n\tto { clip-path: inset(50% 0); }\n}\n\n/* \u2500\u2500 Dissolve \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-dissolve-in {\n\tfrom { opacity: 0; filter: blur(4px); }\n\tto { opacity: 1; filter: blur(0px); }\n}\n\n/* \u2500\u2500 Circle / Diamond / Plus (clip-path shapes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-circle-in {\n\tfrom { clip-path: circle(0% at 50% 50%); }\n\tto { clip-path: circle(75% at 50% 50%); }\n}\n@keyframes pptx-tr-diamond-in {\n\tfrom { clip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%); }\n\tto { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); }\n}\n@keyframes pptx-tr-plus-in {\n\tfrom {\n\t\tclip-path: polygon(\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%,\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%,\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%\n\t\t);\n\t}\n\tto {\n\t\tclip-path: polygon(\n\t\t\t33% 0%, 66% 0%, 66% 33%, 100% 33%,\n\t\t\t100% 66%, 66% 66%, 66% 100%, 33% 100%,\n\t\t\t33% 66%, 0% 66%, 0% 33%, 33% 33%\n\t\t);\n\t}\n}\n\n/* \u2500\u2500 Wedge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wedge-in {\n\tfrom { clip-path: polygon(50% 0%, 50% 0%, 50% 0%); }\n\tto { clip-path: polygon(50% 0%, 100% 100%, 0% 100%); }\n}\n\n/* \u2500\u2500 Zoom \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-zoom-in {\n\tfrom { transform: scale(0); opacity: 0; }\n\tto { transform: scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-zoom-out {\n\tfrom { transform: scale(1); opacity: 1; }\n\tto { transform: scale(2); opacity: 0; }\n}\n\n/* \u2500\u2500 Blinds \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-blinds-h {\n\tfrom { clip-path: inset(0 0 100% 0); }\n\tto { clip-path: inset(0); }\n}\n@keyframes pptx-tr-blinds-v {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Checker (approximate with dissolve + contrast) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-checker-in {\n\tfrom { opacity: 0; filter: contrast(2) blur(2px); }\n\tto { opacity: 1; filter: contrast(1) blur(0); }\n}\n\n/* \u2500\u2500 Comb \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-comb-h {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0); }\n}\n@keyframes pptx-tr-comb-v {\n\tfrom { clip-path: inset(100% 0 0 0); }\n\tto { clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Strips (diagonal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-strips-lu {\n\tfrom { clip-path: polygon(0% 0%, 0% 0%, 0% 0%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-ld {\n\tfrom { clip-path: polygon(0% 100%, 0% 100%, 0% 100%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-ru {\n\tfrom { clip-path: polygon(100% 0%, 100% 0%, 100% 0%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-rd {\n\tfrom { clip-path: polygon(100% 100%, 100% 100%, 100% 100%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n\n/* \u2500\u2500 RandomBar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-randombar-h {\n\tfrom { opacity: 0; clip-path: inset(0 0 100% 0); }\n\tto { opacity: 1; clip-path: inset(0); }\n}\n@keyframes pptx-tr-randombar-v {\n\tfrom { opacity: 0; clip-path: inset(0 100% 0 0); }\n\tto { opacity: 1; clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Newsflash \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-newsflash-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n\n/* \u2500\u2500 Wheel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wheel-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\n/* \u2500\u2500 Conveyor (translate X with staggered timing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Doors (clip-path from center split) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-doors-horz {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-doors-vert {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n\n/* \u2500\u2500 Ferris (rotate elements around center) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Flash (bright flash opacity burst) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Flythrough (scale + translate Z-axis feel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Gallery (translate with perspective) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Glitter (particle dissolve effect) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Honeycomb (hexagonal reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Pan (large-scale translate) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Prism (3D rotation via perspective transform) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Reveal (slide away reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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@keyframes pptx-tr-reveal-in {\n\tfrom { opacity: 0.5; }\n\tto { opacity: 1; }\n}\n\n/* \u2500\u2500 Ripple (expanding ring clip-path) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Shred (fragmented clip-path pieces) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Switch (flip/rotate swap) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Vortex (rotate + scale spiral) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Warp (skew distortion) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-warp-in {\n\tfrom { transform: scale(0.3) skewX(30deg) skewY(15deg); opacity: 0; }\n\t50% { transform: scale(0.8) skewX(-5deg) skewY(-3deg); opacity: 0.7; }\n\tto { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; }\n}\n@keyframes pptx-tr-warp-out {\n\tfrom { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; }\n\t50% { transform: scale(0.8) skewX(5deg) skewY(3deg); opacity: 0.7; }\n\tto { transform: scale(0.3) skewX(-30deg) skewY(-15deg); opacity: 0; }\n}\n@keyframes pptx-tr-warp-reverse-in {\n\tfrom { transform: scale(3) skewX(-20deg) skewY(-10deg); opacity: 0; filter: blur(4px); }\n\tto { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; filter: blur(0); }\n}\n@keyframes pptx-tr-warp-reverse-out {\n\tfrom { transform: scale(1) skewX(0deg) skewY(0deg); opacity: 1; filter: blur(0); }\n\tto { transform: scale(3) skewX(20deg) skewY(10deg); opacity: 0; filter: blur(4px); }\n}\n\n/* \u2500\u2500 WheelReverse (reverse wheel rotation) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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/* \u2500\u2500 Window (scale from center with border) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-window-horz {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-window-vert {\n\tfrom { clip-path: inset(50% 0); }\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/* \u2500\u2500 Cube (rotate off one edge onto the next face) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-cube-out-left { from { transform: perspective(1400px) translateX(0) rotateY(0deg); } to { transform: perspective(1400px) translateX(-50%) rotateY(-90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-left { from { transform: perspective(1400px) translateX(50%) rotateY(90deg); opacity: .5; } to { transform: perspective(1400px) translateX(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-cube-out-right { from { transform: perspective(1400px) translateX(0) rotateY(0deg); } to { transform: perspective(1400px) translateX(50%) rotateY(90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-right { from { transform: perspective(1400px) translateX(-50%) rotateY(-90deg); opacity: .5; } to { transform: perspective(1400px) translateX(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-cube-out-up { from { transform: perspective(1400px) translateY(0) rotateX(0deg); } to { transform: perspective(1400px) translateY(-50%) rotateX(90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-up { from { transform: perspective(1400px) translateY(50%) rotateX(-90deg); opacity: .5; } to { transform: perspective(1400px) translateY(0) rotateX(0deg); opacity: 1; } }\n@keyframes pptx-tr-cube-out-down { from { transform: perspective(1400px) translateY(0) rotateX(0deg); } to { transform: perspective(1400px) translateY(50%) rotateX(-90deg); opacity: .5; } }\n@keyframes pptx-tr-cube-in-down { from { transform: perspective(1400px) translateY(-50%) rotateX(90deg); opacity: .5; } to { transform: perspective(1400px) translateY(0) rotateX(0deg); opacity: 1; } }\n\n/* \u2500\u2500 Orbit (swing the faces through depth) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-orbit-out-left { from { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateY(-105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-left { from { transform: perspective(1600px) translateZ(-700px) rotateY(105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-orbit-out-right { from { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateY(105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-right { from { transform: perspective(1600px) translateZ(-700px) rotateY(-105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-orbit-out-up { from { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateX(105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-up { from { transform: perspective(1600px) translateZ(-700px) rotateX(-105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } }\n@keyframes pptx-tr-orbit-out-down { from { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } to { transform: perspective(1600px) translateZ(-700px) rotateX(-105deg); opacity: 0; } }\n@keyframes pptx-tr-orbit-in-down { from { transform: perspective(1600px) translateZ(-700px) rotateX(105deg); opacity: 0; } to { transform: perspective(1600px) translateZ(0) rotateX(0deg); opacity: 1; } }\n\n/* \u2500\u2500 Flip (card flip; opacity hides the back face) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-flip-out-left { from { transform: perspective(1400px) rotateY(0deg); opacity: 1; } to { transform: perspective(1400px) rotateY(90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-left { from { transform: perspective(1400px) rotateY(-90deg); opacity: 0; } to { transform: perspective(1400px) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-flip-out-right { from { transform: perspective(1400px) rotateY(0deg); opacity: 1; } to { transform: perspective(1400px) rotateY(-90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-right { from { transform: perspective(1400px) rotateY(90deg); opacity: 0; } to { transform: perspective(1400px) rotateY(0deg); opacity: 1; } }\n@keyframes pptx-tr-flip-out-up { from { transform: perspective(1400px) rotateX(0deg); opacity: 1; } to { transform: perspective(1400px) rotateX(-90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-up { from { transform: perspective(1400px) rotateX(90deg); opacity: 0; } to { transform: perspective(1400px) rotateX(0deg); opacity: 1; } }\n@keyframes pptx-tr-flip-out-down { from { transform: perspective(1400px) rotateX(0deg); opacity: 1; } to { transform: perspective(1400px) rotateX(90deg); opacity: 0; } }\n@keyframes pptx-tr-flip-in-down { from { transform: perspective(1400px) rotateX(-90deg); opacity: 0; } to { transform: perspective(1400px) rotateX(0deg); opacity: 1; } }\n\n/* \u2500\u2500 Rotate (in-plane spin + zoom) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-rotate-out-cw { from { transform: rotate(0deg) scale(1); opacity: 1; } to { transform: rotate(90deg) scale(.4); opacity: 0; } }\n@keyframes pptx-tr-rotate-in-cw { from { transform: rotate(-90deg) scale(.4); opacity: 0; } to { transform: rotate(0deg) scale(1); opacity: 1; } }\n@keyframes pptx-tr-rotate-out-ccw { from { transform: rotate(0deg) scale(1); opacity: 1; } to { transform: rotate(-90deg) scale(.4); opacity: 0; } }\n@keyframes pptx-tr-rotate-in-ccw { from { transform: rotate(90deg) scale(.4); opacity: 0; } to { transform: rotate(0deg) scale(1); opacity: 1; } }\n\n/* \u2500\u2500 Fall Over (incoming board topples down over outgoing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fallover-out { from { transform: translateZ(0); opacity: 1; } to { transform: perspective(1400px) rotateX(5deg) scale(.94); opacity: .25; } }\n@keyframes pptx-tr-fallover-in { 0% { transform: perspective(1400px) rotateX(-100deg); transform-origin: top center; opacity: .4; } 70% { transform: perspective(1400px) rotateX(8deg); transform-origin: top center; opacity: 1; } 100% { transform: perspective(1400px) rotateX(0deg); transform-origin: top center; opacity: 1; } }\n\n/* \u2500\u2500 Drape (fabric draping down into place) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-drape-in { from { transform: perspective(1600px) rotateX(-55deg) scale(1.15); transform-origin: top center; opacity: 0; } to { transform: perspective(1600px) rotateX(0deg) scale(1); transform-origin: top center; opacity: 1; } }\n\n/* \u2500\u2500 Curtains (outgoing lifts to reveal incoming) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-curtains-out { from { transform: scaleY(1); transform-origin: top center; opacity: 1; } to { transform: scaleY(0); transform-origin: top center; opacity: .3; } }\n\n/* \u2500\u2500 Wind (outgoing blows away with skew + blur) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wind-out-left { from { transform: translateX(0) skewX(0deg); opacity: 1; filter: blur(0); } to { transform: translateX(-120%) skewX(25deg); opacity: 0; filter: blur(6px); } }\n@keyframes pptx-tr-wind-out-right { from { transform: translateX(0) skewX(0deg); opacity: 1; filter: blur(0); } to { transform: translateX(120%) skewX(-25deg); opacity: 0; filter: blur(6px); } }\n\n/* \u2500\u2500 Prestige (magic vanish then reappear) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-prestige-out { from { transform: scale(1) rotate(0deg); opacity: 1; filter: blur(0); } to { transform: scale(1.4) rotate(6deg); opacity: 0; filter: blur(8px); } }\n@keyframes pptx-tr-prestige-in { from { transform: scale(.6) rotate(-6deg); opacity: 0; filter: blur(8px); } to { transform: scale(1) rotate(0deg); opacity: 1; filter: blur(0); } }\n\n/* \u2500\u2500 Fracture (shatter into contrast + blur) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fracture-out { 0% { transform: scale(1); opacity: 1; filter: contrast(1) blur(0); } 55% { transform: scale(1.04) rotate(1deg); opacity: 1; filter: contrast(1.7) brightness(1.15); } 100% { transform: scale(1.15) rotate(-2deg); opacity: 0; filter: contrast(2.2) blur(4px); } }\n\n/* \u2500\u2500 Crush (squash flat, then new slide expands) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-crush-out { from { transform: scaleY(1); transform-origin: bottom; opacity: 1; } to { transform: scaleY(0); transform-origin: bottom; opacity: .2; } }\n@keyframes pptx-tr-crush-in { from { transform: scaleY(0); transform-origin: bottom; opacity: .2; } to { transform: scaleY(1); transform-origin: bottom; opacity: 1; } }\n\n/* \u2500\u2500 Peel Off (peel away from a corner) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-peeloff-out { from { transform: perspective(1400px) rotate3d(1, 1, 0, 0deg); transform-origin: top right; opacity: 1; } to { transform: perspective(1400px) rotate3d(1, 1, 0, 110deg); transform-origin: top right; opacity: .15; } }\n\n/* \u2500\u2500 Page Curl (curl off the right edge; double curls new in) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-pagecurl-out { from { transform: perspective(1600px) rotateY(0deg); transform-origin: right center; opacity: 1; } to { transform: perspective(1600px) rotateY(-155deg); transform-origin: right center; opacity: .25; } }\n@keyframes pptx-tr-pagecurl-double-in { from { transform: perspective(1600px) rotateY(155deg); transform-origin: left center; opacity: .25; } to { transform: perspective(1600px) rotateY(0deg); transform-origin: left center; opacity: 1; } }\n\n/* \u2500\u2500 Airplane (fly off like a paper plane) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-airplane-out { 0% { transform: perspective(1200px) translate3d(0, 0, 0) rotate3d(1, -1, 0, 0deg) scale(1); opacity: 1; } 40% { transform: perspective(1200px) translate3d(10%, -10%, 0) rotate3d(1, -1, 0, 25deg) scale(.85); opacity: 1; } 100% { transform: perspective(1200px) translate3d(150%, -70%, 0) rotate3d(1, -1, 1, 70deg) scale(.05); opacity: 0; } }\n\n/* \u2500\u2500 Origami (fold out / unfold in) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-origami-out { from { transform: perspective(1600px) rotateY(0deg) scaleX(1); transform-origin: left center; opacity: 1; } to { transform: perspective(1600px) rotateY(75deg) scaleX(.25); transform-origin: left center; opacity: .2; } }\n@keyframes pptx-tr-origami-in { from { transform: perspective(1600px) rotateY(-75deg) scaleX(.25); transform-origin: right center; opacity: .2; } to { transform: perspective(1600px) rotateY(0deg) scaleX(1); transform-origin: right center; opacity: 1; } }\n";
|
|
2868
3018
|
|
|
2869
3019
|
/**
|
|
2870
3020
|
* `slide-transition-css` — pure mapping from a {@link PptxSlideTransition}
|
|
@@ -2887,10 +3037,13 @@ declare const SLIDE_TRANSITION_KEYFRAMES = "\n/* \u2500\u2500 Fade \u2500\u2500\
|
|
|
2887
3037
|
* `honeycomb`/`glitter`/`shred`/`flash`/`vortex`/`warp`/`wheelReverse`/`window`)
|
|
2888
3038
|
* is rendered faithfully by delegating to {@link getP14TransitionAnimations}
|
|
2889
3039
|
* (its `@keyframes` live in `p14-transition-keyframes` and are folded into
|
|
2890
|
-
* `SLIDE_TRANSITION_KEYFRAMES`). The
|
|
2891
|
-
*
|
|
2892
|
-
* `peelOff`/`
|
|
2893
|
-
*
|
|
3040
|
+
* `SLIDE_TRANSITION_KEYFRAMES`). The newer Office 2013+ (p15) cinematic family
|
|
3041
|
+
* (`cube`/`flip`/`rotate`/`orbit`/`fallOver`/`drape`/`curtains`/`wind`/
|
|
3042
|
+
* `prestige`/`fracture`/`crush`/`peelOff`/`pageCurlSingle`/`pageCurlDouble`/
|
|
3043
|
+
* `airplane`/`origami`) is likewise rendered faithfully via
|
|
3044
|
+
* {@link getCinematicTransitionAnimations} (its `@keyframes` live in
|
|
3045
|
+
* `slide-transition-cinematic` as `CINEMATIC_TRANSITION_KEYFRAMES`). Only truly
|
|
3046
|
+
* unknown types fall back to a symmetrical cross-fade.
|
|
2894
3047
|
*
|
|
2895
3048
|
* Everything here is pure and unit-testable: no framework imports, no DOM.
|
|
2896
3049
|
*
|
|
@@ -3463,6 +3616,35 @@ declare function buildBroadcastViewerUrl(roomId: string, serverUrl: string, loca
|
|
|
3463
3616
|
/** Whether the runtime exposes a usable async clipboard write API. */
|
|
3464
3617
|
declare function canUseClipboard(nav: Navigator | undefined): boolean;
|
|
3465
3618
|
|
|
3619
|
+
/**
|
|
3620
|
+
* share-form: framework-free helpers for the Share dialog's start/join form
|
|
3621
|
+
* (field seeding, validity, and CollaborationConfig assembly). Thin sugar over
|
|
3622
|
+
* the neutral session builders in `share-session`, exposing the binding-facing
|
|
3623
|
+
* names the Share dialogs already used. Shared by every binding; each re-exports
|
|
3624
|
+
* these through a thin shim so the SFC/DOM layer stays presentation-only.
|
|
3625
|
+
*/
|
|
3626
|
+
|
|
3627
|
+
/** The share form's editable fields. */
|
|
3628
|
+
interface ShareFormFields {
|
|
3629
|
+
roomId: string;
|
|
3630
|
+
userName: string;
|
|
3631
|
+
serverUrl: string;
|
|
3632
|
+
}
|
|
3633
|
+
/** Optional seed values for the share start form. */
|
|
3634
|
+
interface ShareDefaults$1 {
|
|
3635
|
+
roomId?: string;
|
|
3636
|
+
userName?: string;
|
|
3637
|
+
serverUrl?: string;
|
|
3638
|
+
}
|
|
3639
|
+
/** Seed the form fields from the (optional) host-supplied defaults. */
|
|
3640
|
+
declare function seedShareFields(defaults?: ShareDefaults$1): ShareFormFields;
|
|
3641
|
+
/**
|
|
3642
|
+
* Whether the form can start a session: room id and display name are required
|
|
3643
|
+
* (after trimming); the server URL may be blank, which selects the serverless
|
|
3644
|
+
* webrtc peer-to-peer transport.
|
|
3645
|
+
*/
|
|
3646
|
+
declare function canStartShare(fields: ShareFormFields): boolean;
|
|
3647
|
+
|
|
3466
3648
|
/**
|
|
3467
3649
|
* presenter-view.ts: pure presenter-view helpers shared across bindings.
|
|
3468
3650
|
*
|
|
@@ -3514,6 +3696,82 @@ interface PresentationInkStroke {
|
|
|
3514
3696
|
points: PresentationInkPoint[];
|
|
3515
3697
|
}
|
|
3516
3698
|
|
|
3699
|
+
/**
|
|
3700
|
+
* audience-content-store: IndexedDB-based storage for sharing PPTX content
|
|
3701
|
+
* between the presenter tab and audience tab.
|
|
3702
|
+
*
|
|
3703
|
+
* When the presenter opens an audience window, the PPTX bytes are stored in
|
|
3704
|
+
* IndexedDB. The audience tab retrieves them on load and then cleans up.
|
|
3705
|
+
*
|
|
3706
|
+
* Framework-agnostic: every binding (React/Vue/Angular) re-exports these
|
|
3707
|
+
* symbols through a thin shim. The database, store, and key names are kept
|
|
3708
|
+
* identical across bindings so the cross-tab handoff stays wire-compatible
|
|
3709
|
+
* regardless of which binding opened the presenter window or renders the
|
|
3710
|
+
* audience tab.
|
|
3711
|
+
*/
|
|
3712
|
+
/** URL hash that marks the current tab as the audience display. */
|
|
3713
|
+
declare const AUDIENCE_HASH = "#pptx-audience";
|
|
3714
|
+
/** Returns true if the current page was opened as an audience tab. */
|
|
3715
|
+
declare function isAudienceTab(): boolean;
|
|
3716
|
+
/**
|
|
3717
|
+
* Store PPTX content bytes so the audience tab can retrieve them.
|
|
3718
|
+
* Called by the presenter before opening the audience window.
|
|
3719
|
+
*/
|
|
3720
|
+
declare function storeAudienceContent(content: ArrayBuffer | Uint8Array, sessionId?: string): Promise<void>;
|
|
3721
|
+
/**
|
|
3722
|
+
* Load PPTX content bytes stored by the presenter tab.
|
|
3723
|
+
* Returns `null` if nothing is stored.
|
|
3724
|
+
*/
|
|
3725
|
+
declare function loadAudienceContent(sessionId?: string): Promise<Uint8Array | null>;
|
|
3726
|
+
/**
|
|
3727
|
+
* Remove stored audience content (cleanup).
|
|
3728
|
+
*/
|
|
3729
|
+
declare function clearAudienceContent(sessionId?: string): Promise<void>;
|
|
3730
|
+
|
|
3731
|
+
/**
|
|
3732
|
+
* EyeDropper colour sampler (framework-agnostic).
|
|
3733
|
+
*
|
|
3734
|
+
* Prefers the native browser EyeDropper API (Chrome 95+ / Edge 95+). For
|
|
3735
|
+
* browsers without it (Firefox, Safari) a DOM-sampling fallback reads the
|
|
3736
|
+
* colour under the pointer via `elementFromPoint` + `getComputedStyle`, so the
|
|
3737
|
+
* eyedropper still works everywhere. Shared by every binding; each re-exports
|
|
3738
|
+
* these symbols through a thin shim.
|
|
3739
|
+
*/
|
|
3740
|
+
/** A sampled colour, as hex plus its RGB channels. */
|
|
3741
|
+
interface EyedropperResult {
|
|
3742
|
+
hex: string;
|
|
3743
|
+
r: number;
|
|
3744
|
+
g: number;
|
|
3745
|
+
b: number;
|
|
3746
|
+
}
|
|
3747
|
+
/**
|
|
3748
|
+
* Returns true when the native EyeDropper API is available in this browser.
|
|
3749
|
+
* Guards against SSR / headless environments without `window`.
|
|
3750
|
+
*/
|
|
3751
|
+
declare function eyedropperAvailable(): boolean;
|
|
3752
|
+
/**
|
|
3753
|
+
* Open the native EyeDropper and return the picked sRGB hex colour string
|
|
3754
|
+
* (e.g. `"#a3b4c5"`), or `null` when the user cancels or the API is absent.
|
|
3755
|
+
*/
|
|
3756
|
+
declare function openNativeEyeDropper(): Promise<string | null>;
|
|
3757
|
+
/**
|
|
3758
|
+
* Sample the colour at a client-space point by inspecting the topmost element's
|
|
3759
|
+
* computed paint. Tries, in order: a real `<canvas>` pixel read (sharp for
|
|
3760
|
+
* rasterised content), then the element's `background-color`, SVG `fill`, and
|
|
3761
|
+
* finally text `color`. Returns `null` when nothing paintable is found.
|
|
3762
|
+
*
|
|
3763
|
+
* This is the DOM fallback used when the native EyeDropper API is unavailable;
|
|
3764
|
+
* it needs no canvas plumbing, so it works against the live slide DOM.
|
|
3765
|
+
*/
|
|
3766
|
+
declare function sampleColorFromSlide(clientX: number, clientY: number): EyedropperResult | null;
|
|
3767
|
+
/**
|
|
3768
|
+
* Run the eyedropper fallback: arm a one-shot pointer listener and resolve with
|
|
3769
|
+
* the hex colour of the next click (or `null` if the user presses Escape). Used
|
|
3770
|
+
* only when {@link eyedropperAvailable} is false. The caller is responsible for
|
|
3771
|
+
* any "armed" UI affordance; this just manages the listeners.
|
|
3772
|
+
*/
|
|
3773
|
+
declare function pickColorByClickFallback(): Promise<string | null>;
|
|
3774
|
+
|
|
3517
3775
|
/**
|
|
3518
3776
|
* smart-art-presets.ts: the SmartArt insert-gallery catalogue, shared across
|
|
3519
3777
|
* bindings. Pure data + types; consumed by each binding's insert dialog and
|
|
@@ -4694,6 +4952,466 @@ declare function segmentFrameCount(durationMs: number, fps: number): number;
|
|
|
4694
4952
|
/** DOM id of the managed `<style>` element the service injects into `<head>`. */
|
|
4695
4953
|
declare const EMBEDDED_FONTS_STYLE_ID = "pptx-angular-embedded-fonts";
|
|
4696
4954
|
|
|
4955
|
+
/**
|
|
4956
|
+
* Structured element-level diff for AI change animations. Given the deck's
|
|
4957
|
+
* slides before and after an AI edit, {@link diffChangedElements} returns a flat
|
|
4958
|
+
* list of what changed per element (added / removed / moved / resized /
|
|
4959
|
+
* restyled / text), with the old and new bounds where relevant. A binding turns
|
|
4960
|
+
* that list into on-canvas motion (glide old->new, fade/scale in-out) plus a
|
|
4961
|
+
* glow-pulse highlight, so the user watches the edit happen.
|
|
4962
|
+
*
|
|
4963
|
+
* Pure and framework-agnostic: no DOM, no timing. The animator
|
|
4964
|
+
* ({@link createAiChangeAnimator}) owns timing; the binding owns rendering.
|
|
4965
|
+
*/
|
|
4966
|
+
|
|
4967
|
+
/** What kind of change an element underwent. */
|
|
4968
|
+
type AiChangeKind = 'added' | 'removed' | 'moved' | 'resized' | 'restyled' | 'text';
|
|
4969
|
+
/** Axis-aligned bounds in slide (CSS pixel) coordinates. */
|
|
4970
|
+
interface AiChangeBounds {
|
|
4971
|
+
x: number;
|
|
4972
|
+
y: number;
|
|
4973
|
+
width: number;
|
|
4974
|
+
height: number;
|
|
4975
|
+
}
|
|
4976
|
+
/** One element's change, with old/new bounds for motion. */
|
|
4977
|
+
interface AiElementChange {
|
|
4978
|
+
slideIndex: number;
|
|
4979
|
+
elementId: string;
|
|
4980
|
+
kind: AiChangeKind;
|
|
4981
|
+
/** Bounds before the edit (present for removed / moved / resized). */
|
|
4982
|
+
from?: AiChangeBounds;
|
|
4983
|
+
/** Bounds after the edit (present for added / moved / resized / restyled / text). */
|
|
4984
|
+
to?: AiChangeBounds;
|
|
4985
|
+
}
|
|
4986
|
+
|
|
4987
|
+
/**
|
|
4988
|
+
* The AI change animator: the framework-agnostic bus that carries "these
|
|
4989
|
+
* elements just changed, animate them" from the AI apply path to whichever
|
|
4990
|
+
* binding is rendering the canvas. The AI write choke points call
|
|
4991
|
+
* {@link AiChangeAnimator.publish} with the slides before and after an edit; the
|
|
4992
|
+
* binding subscribes, reveals the affected slide, and plays the motion + glow
|
|
4993
|
+
* for {@link ResolvedAiChangeAnimationConfig.durationMs}, then the batch clears.
|
|
4994
|
+
*
|
|
4995
|
+
* Timing (setTimeout) and the frame clock live here so bindings stay thin. A
|
|
4996
|
+
* `schedule` hook is injectable so tests can drive time deterministically.
|
|
4997
|
+
*/
|
|
4998
|
+
|
|
4999
|
+
/** Host-tunable options for how AI edits are animated on the canvas. */
|
|
5000
|
+
interface AiChangeAnimationConfig {
|
|
5001
|
+
/** Master switch. Default true. */
|
|
5002
|
+
enabled?: boolean;
|
|
5003
|
+
/** How long the motion + glow plays, in ms. Default 900. */
|
|
5004
|
+
durationMs?: number;
|
|
5005
|
+
/** Draw the pulsing glow highlight on changed elements. Default true. */
|
|
5006
|
+
glow?: boolean;
|
|
5007
|
+
/** Glide old->new bounds and cross-fade colours. Default true. */
|
|
5008
|
+
tween?: boolean;
|
|
5009
|
+
/** Accent colour (any CSS colour) for the glow/ghosts. Default a blue. */
|
|
5010
|
+
color?: string;
|
|
5011
|
+
}
|
|
5012
|
+
/** Config with every field resolved to a concrete value. */
|
|
5013
|
+
interface ResolvedAiChangeAnimationConfig {
|
|
5014
|
+
enabled: boolean;
|
|
5015
|
+
durationMs: number;
|
|
5016
|
+
glow: boolean;
|
|
5017
|
+
tween: boolean;
|
|
5018
|
+
color: string;
|
|
5019
|
+
}
|
|
5020
|
+
/** One batch of changes to animate, plus the slide to reveal for it. */
|
|
5021
|
+
interface AiChangeBatch {
|
|
5022
|
+
changes: AiElementChange[];
|
|
5023
|
+
/** Slide index the first change lives on (reveal this to show the edit). */
|
|
5024
|
+
slideIndex: number;
|
|
5025
|
+
/** Monotonic id so a binding can restart its animation on each new batch. */
|
|
5026
|
+
nonce: number;
|
|
5027
|
+
config: ResolvedAiChangeAnimationConfig;
|
|
5028
|
+
}
|
|
5029
|
+
/** Subscribe/publish bus for AI change animations. */
|
|
5030
|
+
interface AiChangeAnimator {
|
|
5031
|
+
/**
|
|
5032
|
+
* Diff `before` -> `after` and, when something visible changed and animations
|
|
5033
|
+
* are enabled, broadcast a batch and schedule its clear. Returns the batch
|
|
5034
|
+
* (so the caller can also navigate to `slideIndex`), or null on a no-op.
|
|
5035
|
+
*/
|
|
5036
|
+
publish(before: PptxSlide[], after: PptxSlide[]): AiChangeBatch | null;
|
|
5037
|
+
subscribe(listener: (batch: AiChangeBatch | null) => void): () => void;
|
|
5038
|
+
current(): AiChangeBatch | null;
|
|
5039
|
+
/** Update the resolved config (e.g. when the host toggles it live). */
|
|
5040
|
+
configure(config?: AiChangeAnimationConfig): void;
|
|
5041
|
+
dispose(): void;
|
|
5042
|
+
}
|
|
5043
|
+
|
|
5044
|
+
/**
|
|
5045
|
+
* Host-facing configuration types for the framework-agnostic AI assistant, plus
|
|
5046
|
+
* {@link resolveChatTransport}, which turns a declarative {@link PptxAiConnection}
|
|
5047
|
+
* into a concrete AI SDK `ChatTransport`.
|
|
5048
|
+
*
|
|
5049
|
+
* All `ai` imports here are type-only; the runtime SDK is threaded in by the
|
|
5050
|
+
* caller (see {@link loadAiSdk}) so this module never forces the optional peer
|
|
5051
|
+
* to be present.
|
|
5052
|
+
*/
|
|
5053
|
+
|
|
5054
|
+
/** The UI message shape exchanged with the assistant. Alias of the SDK type. */
|
|
5055
|
+
type PptxAiUIMessage = UIMessage;
|
|
5056
|
+
/**
|
|
5057
|
+
* Canonical name of every tool the assistant can call. Document tools mirror the
|
|
5058
|
+
* `pptx-viewer-mcp` server exactly (they ARE the same functions, run against the
|
|
5059
|
+
* live deck); the viewer-only tools (navigation, deck outline, element/notes
|
|
5060
|
+
* readers, table merge) have no MCP counterpart.
|
|
5061
|
+
*/
|
|
5062
|
+
type PptxAiToolName = 'get_deck_overview' | 'get_slide' | 'get_element' | 'get_speaker_notes' | 'find_text' | 'get_theme' | 'go_to_slide' | 'select_elements' | 'merge_tables' | 'get_metadata' | 'get_layouts' | 'find_placeholders' | 'get_presentation_properties' | 'run_accessibility_check' | 'convert_to_markdown' | 'add_element' | 'update_element' | 'delete_elements' | 'arrange_elements' | 'clone_element' | 'set_element_animation' | 'group_elements' | 'ungroup_elements' | 'batch_update_elements' | 'update_element_style' | 'replace_geometry' | 'set_element_lock' | 'manage_hyperlinks' | 'replace_text' | 'manage_comments' | 'update_table_cells' | 'manage_table_structure' | 'create_chart' | 'update_chart' | 'add_chart_series' | 'remove_chart_series' | 'update_chart_series_data' | 'manage_smart_art' | 'apply_template' | 'add_slide' | 'duplicate_slide' | 'delete_slides' | 'reorder_slides' | 'update_slide_properties' | 'set_slide_transition' | 'apply_theme_preset' | 'update_theme_colors' | 'update_theme_fonts' | 'set_canvas_size' | 'update_metadata' | 'manage_sections' | 'update_presentation_properties' | 'apply_layout';
|
|
5063
|
+
type Resolvable<T> = T | (() => T | Promise<T>);
|
|
5064
|
+
/** How the assistant reaches a language model. */
|
|
5065
|
+
type PptxAiConnection =
|
|
5066
|
+
/**
|
|
5067
|
+
* Post messages to a host backend route (recommended for production so the
|
|
5068
|
+
* provider API key stays server-side). Maps to `DefaultChatTransport`.
|
|
5069
|
+
*/
|
|
5070
|
+
{
|
|
5071
|
+
kind: 'endpoint';
|
|
5072
|
+
api: string;
|
|
5073
|
+
headers?: Resolvable<Record<string, string>>;
|
|
5074
|
+
body?: Resolvable<Record<string, unknown>>;
|
|
5075
|
+
credentials?: RequestCredentials;
|
|
5076
|
+
fetch?: typeof globalThis.fetch;
|
|
5077
|
+
}
|
|
5078
|
+
/**
|
|
5079
|
+
* Run a language model in-process in the browser (bring-your-own key /
|
|
5080
|
+
* local model). Maps to a `ToolLoopAgent` behind a `DirectChatTransport`.
|
|
5081
|
+
*/
|
|
5082
|
+
| {
|
|
5083
|
+
kind: 'model';
|
|
5084
|
+
model: LanguageModel;
|
|
5085
|
+
system?: string;
|
|
5086
|
+
maxSteps?: number;
|
|
5087
|
+
}
|
|
5088
|
+
/** Provide a fully-constructed transport (advanced / testing escape hatch). */
|
|
5089
|
+
| {
|
|
5090
|
+
kind: 'transport';
|
|
5091
|
+
transport: ChatTransport<PptxAiUIMessage>;
|
|
5092
|
+
};
|
|
5093
|
+
/** How writes proposed by the assistant reach the document. */
|
|
5094
|
+
type PptxAiWritePolicy = 'stage' | 'approve' | 'auto';
|
|
5095
|
+
/** Which deck context is fed to the model with each turn. */
|
|
5096
|
+
type PptxAiContextStrategy = 'outline' | 'current-slide' | 'none';
|
|
5097
|
+
/** Optional per-session history persistence hooks. */
|
|
5098
|
+
interface PptxAiHistoryHooks {
|
|
5099
|
+
load?(id: string): Promise<PptxAiUIMessage[]>;
|
|
5100
|
+
save?(id: string, messages: PptxAiUIMessage[]): Promise<void>;
|
|
5101
|
+
}
|
|
5102
|
+
/** Complete host configuration for an AI chat session. */
|
|
5103
|
+
interface PptxAiConfig {
|
|
5104
|
+
connection: PptxAiConnection;
|
|
5105
|
+
/** Extra host instructions appended to the base system prompt. */
|
|
5106
|
+
systemPromptExtras?: string;
|
|
5107
|
+
tools?: {
|
|
5108
|
+
/** Allowlist. When set, only these tools are exposed. */
|
|
5109
|
+
enabled?: PptxAiToolName[];
|
|
5110
|
+
/** Denylist, applied after `enabled`. */
|
|
5111
|
+
disabled?: PptxAiToolName[];
|
|
5112
|
+
/** Additional host-defined tools merged into the tool set. */
|
|
5113
|
+
extra?: ToolSet;
|
|
5114
|
+
};
|
|
5115
|
+
/** Default `'stage'`. */
|
|
5116
|
+
writePolicy?: PptxAiWritePolicy;
|
|
5117
|
+
/** Default `'outline'`. */
|
|
5118
|
+
contextStrategy?: PptxAiContextStrategy;
|
|
5119
|
+
history?: PptxAiHistoryHooks;
|
|
5120
|
+
/**
|
|
5121
|
+
* How AI edits are animated on the canvas so the user can watch them land
|
|
5122
|
+
* (glide old->new, fade/scale in-out, glow-pulse). Omit for the defaults;
|
|
5123
|
+
* set `{ enabled: false }` to turn it off.
|
|
5124
|
+
*/
|
|
5125
|
+
changeAnimation?: AiChangeAnimationConfig;
|
|
5126
|
+
onError?(error: Error): void;
|
|
5127
|
+
}
|
|
5128
|
+
|
|
5129
|
+
/**
|
|
5130
|
+
* The {@link PptxAiBridge} contract each UI binding (React / Vue / Angular /
|
|
5131
|
+
* Svelte / Vanilla) implements so the framework-agnostic AI core can read the
|
|
5132
|
+
* open deck, navigate it, and route edits through the binding's own history /
|
|
5133
|
+
* undo stack.
|
|
5134
|
+
*
|
|
5135
|
+
* The bridge is the single seam between the AI core and a live editor: every
|
|
5136
|
+
* read goes through a getter, every mutation goes through one of the three
|
|
5137
|
+
* write choke points ({@link PptxAiBridge.applySlidesUpdate},
|
|
5138
|
+
* {@link PptxAiBridge.updateElement}, {@link PptxAiBridge.applyTheme}). Keeping
|
|
5139
|
+
* writes funnelled lets the {@link ProposalStore} commit a batch as a single
|
|
5140
|
+
* undoable history entry.
|
|
5141
|
+
*/
|
|
5142
|
+
|
|
5143
|
+
/** Lightweight, model-friendly summary of the whole deck. */
|
|
5144
|
+
interface PptxAiDeckMeta {
|
|
5145
|
+
/** Total number of slides. */
|
|
5146
|
+
slideCount: number;
|
|
5147
|
+
/** Zero-based index of the currently active slide. */
|
|
5148
|
+
activeSlideIndex: number;
|
|
5149
|
+
/** Deck title, when known (first slide title / core properties). */
|
|
5150
|
+
title?: string;
|
|
5151
|
+
/** Slide canvas width in CSS pixels. */
|
|
5152
|
+
width: number;
|
|
5153
|
+
/** Slide canvas height in CSS pixels. */
|
|
5154
|
+
height: number;
|
|
5155
|
+
}
|
|
5156
|
+
/** Severity hint for {@link PptxAiBridge.notify}. */
|
|
5157
|
+
type PptxAiNotifyLevel = 'info' | 'success' | 'warning' | 'error';
|
|
5158
|
+
/**
|
|
5159
|
+
* A target the user has scoped the assistant to: either a whole slide or a
|
|
5160
|
+
* single element on a slide. Returned by {@link PptxAiBridge.getFocusedTargets}
|
|
5161
|
+
* so the context builder can tell the model exactly what to focus on.
|
|
5162
|
+
*/
|
|
5163
|
+
type PptxAiFocusedTarget = {
|
|
5164
|
+
kind: 'slide';
|
|
5165
|
+
slideIndex: number;
|
|
5166
|
+
} | {
|
|
5167
|
+
kind: 'element';
|
|
5168
|
+
slideIndex: number;
|
|
5169
|
+
elementId: string;
|
|
5170
|
+
};
|
|
5171
|
+
/**
|
|
5172
|
+
* A pure updater over the deck's slides. It receives a deep clone of the
|
|
5173
|
+
* current slides (mutation-safe) and returns the next slides array. The bridge
|
|
5174
|
+
* commits the returned array as ONE history entry.
|
|
5175
|
+
*/
|
|
5176
|
+
type PptxAiSlidesUpdater = (slides: PptxSlide[]) => PptxSlide[];
|
|
5177
|
+
/**
|
|
5178
|
+
* A pure updater over the whole parsed deck ({@link PptxData}). Mirrors the
|
|
5179
|
+
* `pptx-viewer-mcp` tool model (data in, mutated data out) so presentation-level
|
|
5180
|
+
* MCP tools (metadata, sections, canvas size, presentation properties, layouts)
|
|
5181
|
+
* can be committed as ONE undoable history entry through {@link
|
|
5182
|
+
* PptxAiBridge.applyDeckData}. Optional: bindings that only track slide/theme
|
|
5183
|
+
* state can omit it, in which case those presentation-level tools report that
|
|
5184
|
+
* they are unavailable in this viewer while every slide/theme tool still works.
|
|
5185
|
+
*/
|
|
5186
|
+
type PptxAiDataUpdater = (data: PptxData) => PptxData;
|
|
5187
|
+
/** Field-level updates for a single element, mirroring the MCP update vocab. */
|
|
5188
|
+
interface PptxAiElementUpdate {
|
|
5189
|
+
x?: number;
|
|
5190
|
+
y?: number;
|
|
5191
|
+
width?: number;
|
|
5192
|
+
height?: number;
|
|
5193
|
+
rotation?: number;
|
|
5194
|
+
opacity?: number;
|
|
5195
|
+
hidden?: boolean;
|
|
5196
|
+
flipHorizontal?: boolean;
|
|
5197
|
+
flipVertical?: boolean;
|
|
5198
|
+
text?: string;
|
|
5199
|
+
fontSize?: number;
|
|
5200
|
+
fontFamily?: string;
|
|
5201
|
+
fontColor?: string;
|
|
5202
|
+
bold?: boolean;
|
|
5203
|
+
italic?: boolean;
|
|
5204
|
+
underline?: boolean;
|
|
5205
|
+
align?: 'left' | 'center' | 'right' | 'justify';
|
|
5206
|
+
fillColor?: string;
|
|
5207
|
+
strokeColor?: string;
|
|
5208
|
+
strokeWidth?: number;
|
|
5209
|
+
}
|
|
5210
|
+
/**
|
|
5211
|
+
* Implemented by each binding to expose its live editor to the AI core.
|
|
5212
|
+
*
|
|
5213
|
+
* Read methods must be cheap and synchronous. Write methods must route through
|
|
5214
|
+
* the binding's editor-history layer so AI edits are undoable like manual ones.
|
|
5215
|
+
*/
|
|
5216
|
+
interface PptxAiBridge {
|
|
5217
|
+
/** Return a summary of the whole deck. */
|
|
5218
|
+
getDeckMeta(): PptxAiDeckMeta;
|
|
5219
|
+
/** Return the deck's slides. Callers must not mutate the returned array. */
|
|
5220
|
+
getSlides(): PptxSlide[];
|
|
5221
|
+
/** Return the zero-based index of the active slide. */
|
|
5222
|
+
getActiveSlideIndex(): number;
|
|
5223
|
+
/** Return the resolved presentation theme, when available. */
|
|
5224
|
+
getTheme(): PptxTheme | undefined;
|
|
5225
|
+
/** Return the underlying core handler, when the binding exposes one. */
|
|
5226
|
+
getHandler(): PptxHandler | undefined;
|
|
5227
|
+
/** Navigate the viewer to a slide by zero-based index. */
|
|
5228
|
+
goToSlide(index: number): void;
|
|
5229
|
+
/** Select the given elements on a slide (empty array clears selection). */
|
|
5230
|
+
selectElements(slideIndex: number, elementIds: string[]): void;
|
|
5231
|
+
/**
|
|
5232
|
+
* Apply a slides updater as a single, atomic, undoable history entry. The
|
|
5233
|
+
* binding is responsible for cloning current slides before calling
|
|
5234
|
+
* `updater` and for installing the result.
|
|
5235
|
+
*/
|
|
5236
|
+
applySlidesUpdate(updater: PptxAiSlidesUpdater, label: string): void;
|
|
5237
|
+
/** Apply field updates to one element as a single history entry. */
|
|
5238
|
+
updateElement(slideIndex: number, elementId: string, updates: PptxAiElementUpdate): void;
|
|
5239
|
+
/** Apply partial theme updates as a single history entry. */
|
|
5240
|
+
applyTheme(updates: Partial<PptxTheme>): void;
|
|
5241
|
+
/**
|
|
5242
|
+
* Return the full parsed {@link PptxData} for the open deck, with the live
|
|
5243
|
+
* (edited) slides and theme overlaid. Enables `pptx-viewer-mcp` tools that
|
|
5244
|
+
* read presentation-level state (metadata, sections, layouts, presentation
|
|
5245
|
+
* properties). Optional: when absent, the AI core synthesises a minimal
|
|
5246
|
+
* PptxData from slides + dimensions, which is enough for every slide/theme
|
|
5247
|
+
* tool but not for presentation-level reads.
|
|
5248
|
+
*/
|
|
5249
|
+
getDeckData?(): PptxData | undefined;
|
|
5250
|
+
/**
|
|
5251
|
+
* Commit a whole-deck {@link PptxData} mutation as one undoable history entry.
|
|
5252
|
+
* Used to apply presentation-level MCP tool results (metadata, sections,
|
|
5253
|
+
* canvas size, presentation properties, layouts). Optional: when absent,
|
|
5254
|
+
* those tools report they are not supported in this viewer; slide/theme tools
|
|
5255
|
+
* are unaffected (they route through {@link PptxAiBridge.applySlidesUpdate}
|
|
5256
|
+
* and {@link PptxAiBridge.applyTheme}).
|
|
5257
|
+
*/
|
|
5258
|
+
applyDeckData?(updater: PptxAiDataUpdater, label: string): void;
|
|
5259
|
+
/**
|
|
5260
|
+
* Return the slides / elements the user has scoped the assistant to, if any.
|
|
5261
|
+
* When present and non-empty, the context builder tells the model to focus on
|
|
5262
|
+
* exactly these targets. Optional so existing bridges satisfy the contract
|
|
5263
|
+
* without change; a bridge that does not implement it behaves as before (no
|
|
5264
|
+
* focus scoping).
|
|
5265
|
+
*/
|
|
5266
|
+
getFocusedTargets?(): PptxAiFocusedTarget[];
|
|
5267
|
+
/** Surface a transient message in the host UI (toast / status line). */
|
|
5268
|
+
notify?(message: string, level?: PptxAiNotifyLevel): void;
|
|
5269
|
+
}
|
|
5270
|
+
|
|
5271
|
+
/**
|
|
5272
|
+
* {@link ProposalStore} - the staging area for AI-proposed writes.
|
|
5273
|
+
*
|
|
5274
|
+
* When the write policy is `'stage'` / `'approve'`, an edit tool does not touch
|
|
5275
|
+
* the document directly. Instead it registers a {@link PptxAiSlidesUpdater} here
|
|
5276
|
+
* as a {@link StagedProposal}, together with a human-readable diff summary. The
|
|
5277
|
+
* host UI can then present the pending change and, on accept, apply it through
|
|
5278
|
+
* {@link PptxAiBridge.applySlidesUpdate} as ONE undoable history entry (or drop
|
|
5279
|
+
* it on revert). This keeps AI edits reviewable and atomic.
|
|
5280
|
+
*/
|
|
5281
|
+
|
|
5282
|
+
/** A pending, not-yet-applied write. */
|
|
5283
|
+
interface StagedProposal {
|
|
5284
|
+
/** Stable id for accept/revert. */
|
|
5285
|
+
id: string;
|
|
5286
|
+
/** Short label used as the history-entry name when applied. */
|
|
5287
|
+
label: string;
|
|
5288
|
+
/** Human-readable change lines (from {@link diffSlides}). */
|
|
5289
|
+
summary: string[];
|
|
5290
|
+
/** Epoch ms when staged. */
|
|
5291
|
+
createdAt: number;
|
|
5292
|
+
/** The updater to run against the live deck on apply. */
|
|
5293
|
+
updater: PptxAiSlidesUpdater;
|
|
5294
|
+
}
|
|
5295
|
+
/** Public (serialisable) view of a proposal, without the updater closure. */
|
|
5296
|
+
interface ProposalView {
|
|
5297
|
+
id: string;
|
|
5298
|
+
label: string;
|
|
5299
|
+
summary: string[];
|
|
5300
|
+
createdAt: number;
|
|
5301
|
+
}
|
|
5302
|
+
|
|
5303
|
+
/**
|
|
5304
|
+
* Persistent chat-history store for the AI assistant panel.
|
|
5305
|
+
*
|
|
5306
|
+
* The store is IndexedDB-first: {@link createChatHistoryStore} opens IndexedDB
|
|
5307
|
+
* on first use and, when that global is missing or fails to open (private mode,
|
|
5308
|
+
* blocked, or a non-DOM environment), transparently falls back to localStorage.
|
|
5309
|
+
* Both backends expose the identical {@link PptxAiChatStore} surface so callers
|
|
5310
|
+
* never branch on which one is live.
|
|
5311
|
+
*
|
|
5312
|
+
* All browser globals are read lazily from inside methods, so importing this
|
|
5313
|
+
* module in Node (SSR / tests) never throws.
|
|
5314
|
+
*/
|
|
5315
|
+
|
|
5316
|
+
/** A chat conversation persisted for later resumption. */
|
|
5317
|
+
interface PptxAiStoredChat {
|
|
5318
|
+
/** Stable id (also the storage key). */
|
|
5319
|
+
id: string;
|
|
5320
|
+
/** Human-readable title (usually derived from the first user message). */
|
|
5321
|
+
title: string;
|
|
5322
|
+
/** Deck this chat is scoped to, when known. Enables per-deck listing. */
|
|
5323
|
+
deckId?: string;
|
|
5324
|
+
/** Full UI-message transcript. */
|
|
5325
|
+
messages: PptxAiUIMessage[];
|
|
5326
|
+
/** Epoch ms when first saved. */
|
|
5327
|
+
createdAt: number;
|
|
5328
|
+
/** Epoch ms of the most recent save. */
|
|
5329
|
+
updatedAt: number;
|
|
5330
|
+
}
|
|
5331
|
+
/** Lightweight listing entry (no message bodies) for the history sidebar. */
|
|
5332
|
+
interface PptxAiChatSummary {
|
|
5333
|
+
id: string;
|
|
5334
|
+
title: string;
|
|
5335
|
+
deckId?: string;
|
|
5336
|
+
createdAt: number;
|
|
5337
|
+
updatedAt: number;
|
|
5338
|
+
messageCount: number;
|
|
5339
|
+
}
|
|
5340
|
+
/** Storage-agnostic chat history API. */
|
|
5341
|
+
interface PptxAiChatStore {
|
|
5342
|
+
/** List chat summaries newest-first, optionally filtered by deck. */
|
|
5343
|
+
listChats(opts?: {
|
|
5344
|
+
deckId?: string;
|
|
5345
|
+
}): Promise<PptxAiChatSummary[]>;
|
|
5346
|
+
/** Load one full chat, or null when it does not exist. */
|
|
5347
|
+
loadChat(id: string): Promise<PptxAiStoredChat | null>;
|
|
5348
|
+
/** Upsert a chat. Always refreshes `updatedAt` (and `createdAt` if unset). */
|
|
5349
|
+
saveChat(chat: PptxAiStoredChat): Promise<void>;
|
|
5350
|
+
/** Delete one chat by id (no-op when absent). */
|
|
5351
|
+
deleteChat(id: string): Promise<void>;
|
|
5352
|
+
/** Delete every chat, or every chat for one deck when `deckId` is given. */
|
|
5353
|
+
clearChats(opts?: {
|
|
5354
|
+
deckId?: string;
|
|
5355
|
+
}): Promise<void>;
|
|
5356
|
+
}
|
|
5357
|
+
|
|
5358
|
+
/**
|
|
5359
|
+
* Framework-agnostic helpers that flatten an AI SDK `UIMessage` into the small
|
|
5360
|
+
* set of parts a chat panel actually renders: assistant/user text and tool-call
|
|
5361
|
+
* cards. Every binding's panel (React, Vue, Angular, Svelte, Vanilla) consumes
|
|
5362
|
+
* these so the transcript model stays identical across bindings.
|
|
5363
|
+
*
|
|
5364
|
+
* The part-kind checks are pure structural facts of the AI SDK UI message
|
|
5365
|
+
* protocol (a text part has `type === 'text'`; a tool part's `type` is
|
|
5366
|
+
* `tool-<name>`; a dynamic tool part has `type === 'dynamic-tool'`), so this
|
|
5367
|
+
* module needs only a type-only import of `UIMessage` and NEVER pulls the `ai`
|
|
5368
|
+
* runtime. It is therefore safe to expose from the main `pptx-viewer-shared/ai`
|
|
5369
|
+
* barrel without forcing the optional peer to load.
|
|
5370
|
+
*/
|
|
5371
|
+
|
|
5372
|
+
/** A run of assistant/user prose. */
|
|
5373
|
+
interface RenderableTextPart {
|
|
5374
|
+
kind: 'text';
|
|
5375
|
+
text: string;
|
|
5376
|
+
}
|
|
5377
|
+
/** One tool invocation, in any of its streaming states. */
|
|
5378
|
+
interface RenderableToolPart {
|
|
5379
|
+
kind: 'tool';
|
|
5380
|
+
toolName: string;
|
|
5381
|
+
toolCallId: string;
|
|
5382
|
+
state: 'input-streaming' | 'input-available' | 'output-available' | 'output-error' | string;
|
|
5383
|
+
input: unknown;
|
|
5384
|
+
output: unknown;
|
|
5385
|
+
errorText?: string;
|
|
5386
|
+
}
|
|
5387
|
+
type RenderablePart = RenderableTextPart | RenderableToolPart;
|
|
5388
|
+
|
|
5389
|
+
/**
|
|
5390
|
+
* A coarse icon category for a tool activity, so every binding can pick a
|
|
5391
|
+
* matching icon from its own icon set (React uses lucide, etc.) without the
|
|
5392
|
+
* shared layer depending on any icon library.
|
|
5393
|
+
*/
|
|
5394
|
+
type ToolActivityIcon = 'view' | 'text' | 'shape' | 'theme' | 'table' | 'slide' | 'chart' | 'move' | 'delete' | 'search' | 'nav' | 'animation' | 'notes' | 'tool';
|
|
5395
|
+
|
|
5396
|
+
/**
|
|
5397
|
+
* Pure derivation of the on-canvas focus target a running tool refers to, so
|
|
5398
|
+
* the viewer can behave like a live collaborator: as the assistant reads or
|
|
5399
|
+
* edits the deck, the canvas navigates to the relevant slide and highlights the
|
|
5400
|
+
* element(s) the tool is touching.
|
|
5401
|
+
*
|
|
5402
|
+
* The mapping is intentionally structural (it reads well-known input fields:
|
|
5403
|
+
* `slideIndex`, `elementId`, `elementIdA/B`, `elementIds`, `slideIndexes`,
|
|
5404
|
+
* `newOrder`) and framework-agnostic, so every binding drives the same live
|
|
5405
|
+
* focus. It NEVER performs navigation itself; it only says "what to look at".
|
|
5406
|
+
*/
|
|
5407
|
+
/** The slide / element(s) a tool invocation is focused on. */
|
|
5408
|
+
interface ToolCanvasTarget {
|
|
5409
|
+
/** Zero-based slide index to navigate to, when the tool names one. */
|
|
5410
|
+
slideIndex?: number;
|
|
5411
|
+
/** Element ids on that slide to highlight (may be empty for slide-level tools). */
|
|
5412
|
+
elementIds: string[];
|
|
5413
|
+
}
|
|
5414
|
+
|
|
4697
5415
|
/**
|
|
4698
5416
|
* The canonical English UI-string dictionary for pptx-viewer. None of the
|
|
4699
5417
|
* React/Vue/Angular binding packages ship translations themselves - each
|
|
@@ -4760,6 +5478,157 @@ declare class AccessibilityService {
|
|
|
4760
5478
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AccessibilityService>;
|
|
4761
5479
|
}
|
|
4762
5480
|
|
|
5481
|
+
/**
|
|
5482
|
+
* Pure helpers that turn the live canvas selection into AI "focused targets"
|
|
5483
|
+
* (the slides / elements the assistant should scope its work to) and into the
|
|
5484
|
+
* short chip labels shown in the AI panel. Angular replica of React's
|
|
5485
|
+
* `hooks/ai/focus-targets.ts`; kept in-binding (rather than in shared) because
|
|
5486
|
+
* it is a tiny pure helper and the shared package is consumed read-only here.
|
|
5487
|
+
*
|
|
5488
|
+
* Shared by {@link AiPanelStore} (so `getFocusedTargets` reflects live
|
|
5489
|
+
* selection) and by the focus-chip bar, so both agree on "the current focus".
|
|
5490
|
+
*/
|
|
5491
|
+
|
|
5492
|
+
/** The selection inputs the focus derivation reads. */
|
|
5493
|
+
interface FocusSelectionInput {
|
|
5494
|
+
activeSlideIndex: number;
|
|
5495
|
+
selectedElementIds: readonly string[];
|
|
5496
|
+
selectedElementId: string | null;
|
|
5497
|
+
}
|
|
5498
|
+
/** One element ring to draw on the canvas: an explicit pick or a live-tool focus. */
|
|
5499
|
+
interface AiCanvasHighlight {
|
|
5500
|
+
slideIndex: number;
|
|
5501
|
+
elementId: string;
|
|
5502
|
+
/** `pick` = persistent user pick; `active` = transient AI-is-working ring. */
|
|
5503
|
+
variant: 'pick' | 'active';
|
|
5504
|
+
}
|
|
5505
|
+
/**
|
|
5506
|
+
* Derive focused targets from the live selection: one `element` target per
|
|
5507
|
+
* selected element on the active slide, or a single whole-`slide` target when
|
|
5508
|
+
* nothing is selected. Order and multiplicity are preserved (multi-select and
|
|
5509
|
+
* tables included) so callers can detect e.g. "exactly two tables".
|
|
5510
|
+
*/
|
|
5511
|
+
declare function computeFocusTargets(input: FocusSelectionInput): PptxAiFocusedTarget[];
|
|
5512
|
+
/** A renderable focus chip. `title` carries the full element id for hover. */
|
|
5513
|
+
interface FocusChip {
|
|
5514
|
+
key: string;
|
|
5515
|
+
label: string;
|
|
5516
|
+
title: string;
|
|
5517
|
+
}
|
|
5518
|
+
/**
|
|
5519
|
+
* Build display chips for the given targets. Slide targets read `Slide N`;
|
|
5520
|
+
* element targets read `<Type> <n>` (a friendly short label, full id on hover),
|
|
5521
|
+
* or `<Type> (missing)` when the element is no longer on the slide.
|
|
5522
|
+
*/
|
|
5523
|
+
declare function focusTargetChips(targets: readonly PptxAiFocusedTarget[], slides: readonly PptxSlide[]): FocusChip[];
|
|
5524
|
+
/** Whether the focus is exactly two table elements (drives the merge action). */
|
|
5525
|
+
declare function isTwoTableFocus(targets: readonly PptxAiFocusedTarget[], slides: readonly PptxSlide[]): false | {
|
|
5526
|
+
slideIndex: number;
|
|
5527
|
+
elementIdA: string;
|
|
5528
|
+
elementIdB: string;
|
|
5529
|
+
};
|
|
5530
|
+
|
|
5531
|
+
/** Live selection accessors the store reads to derive the follow-selection focus. */
|
|
5532
|
+
interface AiPanelSelectionAccessors {
|
|
5533
|
+
activeSlideIndex(): number;
|
|
5534
|
+
selectedElementIds(): readonly string[];
|
|
5535
|
+
selectedElementId(): string | null;
|
|
5536
|
+
/** The primary selected element, for building the "Fix with AI" directive. */
|
|
5537
|
+
selectedElement(): PptxElement | null;
|
|
5538
|
+
}
|
|
5539
|
+
declare class AiPanelStore {
|
|
5540
|
+
/**
|
|
5541
|
+
* Optional: `inject()` needs an active injection context, which plain
|
|
5542
|
+
* `new AiPanelStore()` (used by this store's unit tests, deliberately
|
|
5543
|
+
* bypassing TestBed for speed) does not provide. Falls back to no automatic
|
|
5544
|
+
* timer cleanup when constructed outside DI, which is fine for tests.
|
|
5545
|
+
*/
|
|
5546
|
+
private readonly destroyRef;
|
|
5547
|
+
private accessors;
|
|
5548
|
+
/** Pinned focus override (null follows the live selection). */
|
|
5549
|
+
readonly pinnedFocus: _angular_core.WritableSignal<PptxAiFocusedTarget[] | null>;
|
|
5550
|
+
/**
|
|
5551
|
+
* One-shot composer prefill. `nonce` bumps on every ask/fix so the composer
|
|
5552
|
+
* applies `text` (and focuses) even when `text` is empty and unchanged.
|
|
5553
|
+
*/
|
|
5554
|
+
readonly prefill: _angular_core.WritableSignal<{
|
|
5555
|
+
text: string;
|
|
5556
|
+
nonce: number;
|
|
5557
|
+
}>;
|
|
5558
|
+
/** True while the user is picking element(s) on the canvas for the assistant. */
|
|
5559
|
+
readonly pickMode: _angular_core.WritableSignal<boolean>;
|
|
5560
|
+
/** The elements the user has explicitly handed to the assistant. */
|
|
5561
|
+
readonly pickTargets: _angular_core.WritableSignal<PptxAiFocusedTarget[]>;
|
|
5562
|
+
/** The element(s) a running tool is currently touching (transient). */
|
|
5563
|
+
private readonly toolFocus;
|
|
5564
|
+
private readonly flashTick;
|
|
5565
|
+
private flashTimer;
|
|
5566
|
+
/**
|
|
5567
|
+
* Canvas change animator: the shared subscribe/publish bus that carries "these
|
|
5568
|
+
* elements just changed, animate them" from the AI apply path (the bridge's
|
|
5569
|
+
* write choke point calls {@link publishAiChange}) to the panel, which reveals
|
|
5570
|
+
* the slide and hands the batch to the on-canvas overlay via
|
|
5571
|
+
* {@link showChangeBatch}. Owned here (viewer-scoped) so it survives the panel
|
|
5572
|
+
* opening/closing while the write path stays alive. Mirrors React's
|
|
5573
|
+
* `session.changeAnimator`; Angular drives the same shared animator from the
|
|
5574
|
+
* bridge because its vanilla-chat controller does not surface the session.
|
|
5575
|
+
*/
|
|
5576
|
+
readonly changeAnimator: AiChangeAnimator;
|
|
5577
|
+
/** The batch of just-applied element changes the canvas overlay should play. */
|
|
5578
|
+
readonly changeBatch: _angular_core.WritableSignal<AiChangeBatch | null>;
|
|
5579
|
+
constructor();
|
|
5580
|
+
/** Wire the live selection accessors (called once by the viewer component). */
|
|
5581
|
+
bind(accessors: AiPanelSelectionAccessors): void;
|
|
5582
|
+
/** Focused targets derived live from the current canvas selection. */
|
|
5583
|
+
readonly liveFocusTargets: _angular_core.Signal<PptxAiFocusedTarget[]>;
|
|
5584
|
+
/** Whether there are explicit picks (they win over a pin / live selection). */
|
|
5585
|
+
readonly hasPicks: _angular_core.Signal<boolean>;
|
|
5586
|
+
/** The targets the panel + bridge should actually scope to. */
|
|
5587
|
+
readonly effectiveTargets: _angular_core.Signal<PptxAiFocusedTarget[]>;
|
|
5588
|
+
/** True when a pin is in force (and no picks override it). */
|
|
5589
|
+
readonly isPinned: _angular_core.Signal<boolean>;
|
|
5590
|
+
/**
|
|
5591
|
+
* Focused targets for the bridge's `getFocusedTargets`: picks beat a pin,
|
|
5592
|
+
* which beats the live selection.
|
|
5593
|
+
*/
|
|
5594
|
+
getFocusedTargets(): PptxAiFocusedTarget[];
|
|
5595
|
+
pinFocus(): void;
|
|
5596
|
+
clearPinnedFocus(): void;
|
|
5597
|
+
/** Open the panel scoped to the current selection, empty composer (focused). */
|
|
5598
|
+
askAboutSelection(): void;
|
|
5599
|
+
/** Open the panel scoped to the current selection, prefilled fix directive. */
|
|
5600
|
+
fixSelection(): void;
|
|
5601
|
+
startPicking(): void;
|
|
5602
|
+
stopPicking(): void;
|
|
5603
|
+
/** Add one clicked canvas element to the pick set (dedupe by id). */
|
|
5604
|
+
addPick(slideIndex: number, elementId: string): void;
|
|
5605
|
+
/** Empty the pick set and leave pick mode. */
|
|
5606
|
+
clearPicks(): void;
|
|
5607
|
+
/**
|
|
5608
|
+
* Flash a transient "the AI is working on this" highlight for a running tool,
|
|
5609
|
+
* and enable colour tweening for a short settle window. Pass `null` to just
|
|
5610
|
+
* enable tweening (e.g. a theme-colour edit with no single element target).
|
|
5611
|
+
*/
|
|
5612
|
+
flashToolTarget(target: ToolCanvasTarget | null): void;
|
|
5613
|
+
/** Element rings the canvas should draw (picks + the live tool focus). */
|
|
5614
|
+
readonly canvasHighlights: _angular_core.Signal<AiCanvasHighlight[]>;
|
|
5615
|
+
/** True while the canvas should tween colour changes (AI is active). */
|
|
5616
|
+
readonly canvasAnimating: _angular_core.Signal<boolean>;
|
|
5617
|
+
/** Apply (or clear) the change batch the panel wants the canvas to animate. */
|
|
5618
|
+
showChangeBatch(batch: AiChangeBatch | null): void;
|
|
5619
|
+
/**
|
|
5620
|
+
* Publish an applied AI edit to the change animator (called from the bridge's
|
|
5621
|
+
* write choke point with the deck slides before + after the edit). The panel's
|
|
5622
|
+
* subscription reveals the slide and plays the overlay; a no-op edit or the
|
|
5623
|
+
* host disabling the animation publishes nothing.
|
|
5624
|
+
*/
|
|
5625
|
+
publishAiChange(before: readonly PptxSlide[], after: readonly PptxSlide[]): void;
|
|
5626
|
+
/** Apply the host's change-animation config (duration / colour / toggles). */
|
|
5627
|
+
configureChangeAnimation(config?: AiChangeAnimationConfig): void;
|
|
5628
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiPanelStore, never>;
|
|
5629
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AiPanelStore>;
|
|
5630
|
+
}
|
|
5631
|
+
|
|
4763
5632
|
/** Lifecycle status of the autosave engine (mirrors React's `AutosaveStatus`). */
|
|
4764
5633
|
type AutosaveStatus = {
|
|
4765
5634
|
state: 'idle';
|
|
@@ -4931,6 +5800,14 @@ declare class CollaborationService {
|
|
|
4931
5800
|
private lastConfig;
|
|
4932
5801
|
private lastOptions;
|
|
4933
5802
|
private localPresence;
|
|
5803
|
+
/**
|
|
5804
|
+
* Reentrancy token for {@link connect}: bumped by every connect() and
|
|
5805
|
+
* disconnect(). A connect() whose token no longer matches after an await was
|
|
5806
|
+
* superseded, so it tears down whatever it just created and leaves the
|
|
5807
|
+
* service state to the newer call (a second provider join on the same room
|
|
5808
|
+
* would otherwise throw inside Yjs and kill the surviving session).
|
|
5809
|
+
*/
|
|
5810
|
+
private connectToken;
|
|
4934
5811
|
private readonly refreshPresence;
|
|
4935
5812
|
constructor();
|
|
4936
5813
|
connect(config: CollaborationConfig, options?: ConnectOptions): Promise<void>;
|
|
@@ -5298,6 +6175,8 @@ declare class LoadContentService {
|
|
|
5298
6175
|
readonly theme: _angular_core.WritableSignal<PptxTheme | undefined>;
|
|
5299
6176
|
/** Resolved colour map for the presentation theme (scheme key → hex). */
|
|
5300
6177
|
readonly themeColorMap: _angular_core.WritableSignal<Record<string, string> | undefined>;
|
|
6178
|
+
/** Parsed table-style definitions from `ppt/tableStyles.xml` (banding/diagonals). */
|
|
6179
|
+
readonly tableStyleMap: _angular_core.WritableSignal<ParsedTableStyleMap | undefined>;
|
|
5301
6180
|
/** Slide masters (for placeholder/background resolution). */
|
|
5302
6181
|
readonly slideMasters: _angular_core.WritableSignal<PptxSlideMaster[]>;
|
|
5303
6182
|
/** Notes master, including its editable element tree. */
|
|
@@ -5344,6 +6223,12 @@ declare class LoadContentService {
|
|
|
5344
6223
|
constructor();
|
|
5345
6224
|
/** Serialise the current (loaded) presentation back to `.pptx` bytes. */
|
|
5346
6225
|
getContent(): Promise<Uint8Array>;
|
|
6226
|
+
/**
|
|
6227
|
+
* The loaded presentation's core handler, or `undefined` before a deck is
|
|
6228
|
+
* loaded. Exposed for the AI bridge ({@link PptxAiBridge.getHandler}) so the
|
|
6229
|
+
* assistant can reach low-level core APIs when needed.
|
|
6230
|
+
*/
|
|
6231
|
+
getHandler(): PptxHandler | undefined;
|
|
5347
6232
|
/**
|
|
5348
6233
|
* Serialise an explicit set of slides back to `.pptx` bytes (e.g. the
|
|
5349
6234
|
* editor's edited deck) using the loaded presentation's handler.
|
|
@@ -5713,8 +6598,15 @@ declare function getContainerStyle(el: PptxElement, zIndex: number): StyleMap;
|
|
|
5713
6598
|
/**
|
|
5714
6599
|
* Fill / stroke / corner-radius for shape-like elements. Returns an empty
|
|
5715
6600
|
* object when the element carries no shape styling.
|
|
6601
|
+
*
|
|
6602
|
+
* `animatesFill` / `animatesStroke` come from an active `p:animClr` colour
|
|
6603
|
+
* animation during presentation playback: when set, the static paint is dropped
|
|
6604
|
+
* so the wrapper's colour keyframes (applied as an `animation` on this same box)
|
|
6605
|
+
* own `background-color` / `border-color`. Mirrors the Vue port's
|
|
6606
|
+
* `getShapeFillStrokeStyle` and React's `getShapeVisualStyle`. Absent/false
|
|
6607
|
+
* keeps the static paint, so editor / read-only rendering is unaffected.
|
|
5716
6608
|
*/
|
|
5717
|
-
declare function getShapeFillStrokeStyle(el: PptxElement): StyleMap;
|
|
6609
|
+
declare function getShapeFillStrokeStyle(el: PptxElement, parentGroupFill?: ShapeStyle, animatesFill?: boolean, animatesStroke?: boolean): StyleMap;
|
|
5718
6610
|
/**
|
|
5719
6611
|
* Text block style for elements that carry text. Mirrors the essentials of the
|
|
5720
6612
|
* React `getTextStyleForElement`.
|
|
@@ -5821,8 +6713,14 @@ interface TableRowViewModel {
|
|
|
5821
6713
|
* resolving spans, applying banding (lowest priority) beneath the explicit cell
|
|
5822
6714
|
* style, and extracting diagonal-border info. Returns an empty array when
|
|
5823
6715
|
* `tableData` is absent.
|
|
6716
|
+
*
|
|
6717
|
+
* `styleCtx` (parsed table-style map + theme colour/font scheme) is threaded
|
|
6718
|
+
* into both the banding resolver and the diagonal-border resolver so
|
|
6719
|
+
* table-style-inherited banding, fonts, and section diagonals apply; per-cell
|
|
6720
|
+
* explicit styles still win. When omitted, both fall back to the hardcoded
|
|
6721
|
+
* defaults (unchanged from before).
|
|
5824
6722
|
*/
|
|
5825
|
-
declare function buildTableViewModel(el: PptxElement): TableRowViewModel[];
|
|
6723
|
+
declare function buildTableViewModel(el: PptxElement, styleCtx?: TableStyleContext): TableRowViewModel[];
|
|
5826
6724
|
/** Compute `<col>` width styles from the column-widths array (0-1 fractions). */
|
|
5827
6725
|
declare function buildColStyles(el: PptxElement): StyleMap[];
|
|
5828
6726
|
|
|
@@ -5851,6 +6749,13 @@ declare class TableRendererComponent {
|
|
|
5851
6749
|
private readonly injector;
|
|
5852
6750
|
/** Shared cell-selection state (present only inside the editor subtree). */
|
|
5853
6751
|
private readonly selectionSvc;
|
|
6752
|
+
/**
|
|
6753
|
+
* Deck load state (present in the viewer subtree). Supplies the parsed
|
|
6754
|
+
* table-style map + theme colour/font scheme so table-style-inherited banding,
|
|
6755
|
+
* fonts, and section diagonals resolve. Absent (optional) in standalone
|
|
6756
|
+
* thumbnail/export renderers, where the hardcoded defaults are used.
|
|
6757
|
+
*/
|
|
6758
|
+
private readonly loader;
|
|
5854
6759
|
/** The table element to render. Must be `type === 'table'`. */
|
|
5855
6760
|
readonly element: _angular_core.InputSignal<PptxElement>;
|
|
5856
6761
|
/** Whether inline cell editing / selection / resize is enabled. */
|
|
@@ -5868,6 +6773,12 @@ declare class TableRendererComponent {
|
|
|
5868
6773
|
private readonly cellInput;
|
|
5869
6774
|
/** Pre-computed `<col>` styles for the colgroup. */
|
|
5870
6775
|
readonly colStyles: _angular_core.Signal<StyleMap[]>;
|
|
6776
|
+
/**
|
|
6777
|
+
* Table-style context (parsed style map + theme colour/font scheme) from the
|
|
6778
|
+
* deck loader, or `undefined` outside the viewer subtree. `fontScheme` lets a
|
|
6779
|
+
* table style's `a:fontRef@idx` resolve to a concrete font family.
|
|
6780
|
+
*/
|
|
6781
|
+
private readonly styleCtx;
|
|
5871
6782
|
/** Projected view-model rows with merged-cell resolution + banding applied. */
|
|
5872
6783
|
readonly rows: _angular_core.Signal<TableRowViewModel[]>;
|
|
5873
6784
|
/** Column widths (0-1 fractions) for the resize overlay. */
|
|
@@ -6018,7 +6929,7 @@ declare class ViewerCollabCursorService {
|
|
|
6018
6929
|
}
|
|
6019
6930
|
|
|
6020
6931
|
/** Seed values for the Share dialog's start form. */
|
|
6021
|
-
interface ShareDefaults
|
|
6932
|
+
interface ShareDefaults {
|
|
6022
6933
|
roomId?: string;
|
|
6023
6934
|
userName?: string;
|
|
6024
6935
|
serverUrl?: string;
|
|
@@ -6026,7 +6937,7 @@ interface ShareDefaults$1 {
|
|
|
6026
6937
|
/** Host accessors/emitters a service cannot own (inputs + outputs). */
|
|
6027
6938
|
interface CollaborationSessionHost {
|
|
6028
6939
|
readonly authorName: () => string | undefined;
|
|
6029
|
-
readonly shareDefaults: () => ShareDefaults
|
|
6940
|
+
readonly shareDefaults: () => ShareDefaults | undefined;
|
|
6030
6941
|
readonly getTemplateElements: () => TemplateElementsBySlideId;
|
|
6031
6942
|
/** Apply a remote peer's slide set to the editable deck (echo-guarded in the service). */
|
|
6032
6943
|
readonly applyRemoteSlides: (slides: PptxSlide[]) => void;
|
|
@@ -6054,6 +6965,14 @@ declare class ViewerCollaborationSessionService {
|
|
|
6054
6965
|
*/
|
|
6055
6966
|
private readonly activeSession;
|
|
6056
6967
|
private host;
|
|
6968
|
+
/**
|
|
6969
|
+
* Last host `collaboration` config handled by {@link syncHostConfig}
|
|
6970
|
+
* (reference-equal dedup). A re-invocation with the same object (e.g. a
|
|
6971
|
+
* spurious effect re-run) must not reconnect: a second provider join on the
|
|
6972
|
+
* same room throws inside Yjs and tears down the live session. Cleared on
|
|
6973
|
+
* the explicit stop paths so stop + restart with the same object works.
|
|
6974
|
+
*/
|
|
6975
|
+
private lastSyncedConfig;
|
|
6057
6976
|
/** Wire the host inputs/outputs (called once from the component constructor). */
|
|
6058
6977
|
bind(host: CollaborationSessionHost): void;
|
|
6059
6978
|
private requireHost;
|
|
@@ -6082,7 +7001,7 @@ declare class ViewerCollaborationSessionService {
|
|
|
6082
7001
|
* `userName` falling back to `authorName` (then "You") so the local user's
|
|
6083
7002
|
* name pre-fills the form. Mirrors React/Vue.
|
|
6084
7003
|
*/
|
|
6085
|
-
readonly shareDialogDefaults: _angular_core.Signal<ShareDefaults
|
|
7004
|
+
readonly shareDialogDefaults: _angular_core.Signal<ShareDefaults>;
|
|
6086
7005
|
/**
|
|
6087
7006
|
* Connect / disconnect real-time collaboration when the host `collaboration`
|
|
6088
7007
|
* input changes (called from the component's effect).
|
|
@@ -6541,6 +7460,11 @@ declare class ViewerInspectorPanelService {
|
|
|
6541
7460
|
readonly visibleInspectorKind: _angular_core.Signal<InspectorContent>;
|
|
6542
7461
|
/** Accessible-label translation key for the inspector host, by active content. */
|
|
6543
7462
|
readonly inspectorLabel: _angular_core.Signal<"" | "pptx.toolbar.comments" | "pptx.accessibility.title" | "pptx.viewer.digitalSignatures" | "pptx.selectionPane.title" | "pptx.inspector.properties">;
|
|
7463
|
+
/**
|
|
7464
|
+
* Dismiss the mobile bottom-sheet inspector (backdrop tap or a past-threshold
|
|
7465
|
+
* swipe-down): hide the host until reopened and clear any explicit tool panel.
|
|
7466
|
+
*/
|
|
7467
|
+
dismissMobileInspector(): void;
|
|
6544
7468
|
/** Toggle a right-docked tool panel (clicking the active one closes it). */
|
|
6545
7469
|
togglePanel(panel: InspectorToolPanel): void;
|
|
6546
7470
|
/**
|
|
@@ -6887,11 +7811,11 @@ declare class PowerPointViewerComponent {
|
|
|
6887
7811
|
*/
|
|
6888
7812
|
readonly onOpenFile: _angular_core.InputSignal<(() => void) | undefined>;
|
|
6889
7813
|
/**
|
|
6890
|
-
* Opt in to the
|
|
6891
|
-
*
|
|
6892
|
-
*
|
|
6893
|
-
*
|
|
6894
|
-
*
|
|
7814
|
+
* Opt in to the Three.js SmartArt renderer. When `true`, SmartArt diagrams
|
|
7815
|
+
* render as extruded 3D blocks on a WebGL canvas instead of flat SVG.
|
|
7816
|
+
* Requires the optional `three` peer dependency; when it is not installed
|
|
7817
|
+
* (or the diagram has no geometry), the viewer transparently falls back to
|
|
7818
|
+
* the SVG SmartArt renderer. Default `false`.
|
|
6895
7819
|
*/
|
|
6896
7820
|
readonly smartArt3D: _angular_core.InputSignal<boolean>;
|
|
6897
7821
|
/**
|
|
@@ -6900,6 +7824,14 @@ declare class PowerPointViewerComponent {
|
|
|
6900
7824
|
* ribbon tab id). Default `[]` hides nothing, matching prior behaviour.
|
|
6901
7825
|
*/
|
|
6902
7826
|
readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
|
|
7827
|
+
/**
|
|
7828
|
+
* Optional AI assistant configuration. When set, a Sparkles toggle appears in
|
|
7829
|
+
* the ribbon and opens a right-rail chat pane wired to the open deck. The
|
|
7830
|
+
* `ai` SDK is an optional peer; when it is not installed the pane shows an
|
|
7831
|
+
* "unavailable" notice instead. Absent by default (no AI UI). Mirrors React's
|
|
7832
|
+
* `ai` prop.
|
|
7833
|
+
*/
|
|
7834
|
+
readonly ai: _angular_core.InputSignal<PptxAiConfig | undefined>;
|
|
6903
7835
|
/** Fired when the active slide changes. */
|
|
6904
7836
|
readonly activeSlideChange: _angular_core.OutputEmitterRef<number>;
|
|
6905
7837
|
/** Fired when the unsaved-changes flag toggles. */
|
|
@@ -6953,6 +7885,8 @@ declare class PowerPointViewerComponent {
|
|
|
6953
7885
|
protected readonly fileIO: ViewerFileIOService;
|
|
6954
7886
|
protected readonly themeGallery: ViewerThemeGalleryService;
|
|
6955
7887
|
protected readonly canvasEditing: ViewerCanvasEditingService;
|
|
7888
|
+
/** Shared AI panel scope + on-canvas highlight store (pick mode, tool focus). */
|
|
7889
|
+
protected readonly aiPanelStore: AiPanelStore;
|
|
6956
7890
|
protected readonly collabCursor: ViewerCollabCursorService;
|
|
6957
7891
|
protected readonly docProperties: ViewerDocumentPropertiesService;
|
|
6958
7892
|
private readonly translateService;
|
|
@@ -7068,6 +8002,18 @@ declare class PowerPointViewerComponent {
|
|
|
7068
8002
|
protected readonly showSmartArtInsert: _angular_core.WritableSignal<boolean>;
|
|
7069
8003
|
/** The single selected element on the active slide (for the inspector). */
|
|
7070
8004
|
protected readonly selectedElement: _angular_core.Signal<PptxElement | null>;
|
|
8005
|
+
/** Whether the AI assistant pane is open (toggled from the ribbon Sparkles). */
|
|
8006
|
+
protected readonly aiPanelOpen: _angular_core.WritableSignal<boolean>;
|
|
8007
|
+
/** Whether the AI assistant toggle is shown (host supplied an `ai` config). */
|
|
8008
|
+
protected readonly aiEnabled: _angular_core.Signal<boolean>;
|
|
8009
|
+
/**
|
|
8010
|
+
* Stable {@link PptxAiBridge} exposing this viewer's live state + editor to
|
|
8011
|
+
* the AI core. Its three write choke points route through
|
|
8012
|
+
* {@link EditorStateService.applyReplacement}, so each AI edit is a single
|
|
8013
|
+
* undoable history entry. Built unconditionally (cheap); only consumed when
|
|
8014
|
+
* the host passes {@link ai}.
|
|
8015
|
+
*/
|
|
8016
|
+
protected readonly aiBridge: PptxAiBridge;
|
|
7071
8017
|
constructor();
|
|
7072
8018
|
/**
|
|
7073
8019
|
* Serialise the current presentation to `.pptx` bytes (imperative handle).
|
|
@@ -7084,6 +8030,13 @@ declare class PowerPointViewerComponent {
|
|
|
7084
8030
|
goTo(index: number): void;
|
|
7085
8031
|
goPrev(): void;
|
|
7086
8032
|
protected onCreatePresentation(templateId: string): void;
|
|
8033
|
+
/**
|
|
8034
|
+
* Route an AI theme edit (partial theme update) through the theme-gallery
|
|
8035
|
+
* service so it re-resolves slide colours and records ONE undoable entry,
|
|
8036
|
+
* mirroring how the Design tab applies a theme. Falls back to the current
|
|
8037
|
+
* colour/font scheme for whichever half the update omits.
|
|
8038
|
+
*/
|
|
8039
|
+
private applyAiTheme;
|
|
7087
8040
|
/**
|
|
7088
8041
|
* File > Options > Appearance selection handler. When a host supplies
|
|
7089
8042
|
* `onThemeChange` it owns persisting the choice; otherwise this falls back
|
|
@@ -7127,6 +8080,19 @@ declare class PowerPointViewerComponent {
|
|
|
7127
8080
|
getSlideCount(): number;
|
|
7128
8081
|
/** Whether the document has unsaved changes. */
|
|
7129
8082
|
isDirty(): boolean;
|
|
8083
|
+
/**
|
|
8084
|
+
* Canvas element press. While the AI panel is picking, the press hands the
|
|
8085
|
+
* element to the assistant (highlighted + added to the pick set) instead of
|
|
8086
|
+
* selecting it; otherwise it routes to the normal editor selection.
|
|
8087
|
+
*/
|
|
8088
|
+
protected onCanvasElementSelect(event: {
|
|
8089
|
+
id: string;
|
|
8090
|
+
additive: boolean;
|
|
8091
|
+
}): void;
|
|
8092
|
+
/** Context-menu "Ask AI about this": scope + open the assistant, empty composer. */
|
|
8093
|
+
protected onContextMenuAskAi(): void;
|
|
8094
|
+
/** Context-menu "Fix with AI": scope + open the assistant with a prefilled directive. */
|
|
8095
|
+
protected onContextMenuFixAi(): void;
|
|
7130
8096
|
/** Get the IDs of currently selected elements. */
|
|
7131
8097
|
getSelectedElementIds(): string[];
|
|
7132
8098
|
/** Programmatically select elements by their IDs. */
|
|
@@ -7220,7 +8186,7 @@ declare class PowerPointViewerComponent {
|
|
|
7220
8186
|
/** Resolve the live slide-stage element within `<main>`. */
|
|
7221
8187
|
private stageElement;
|
|
7222
8188
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PowerPointViewerComponent, never>;
|
|
7223
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PowerPointViewerComponent, "pptx-viewer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "fontsInput": { "alias": "fonts"; "required": false; "isSignal": true; }; "canEditInput": { "alias": "canEdit"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "defaultThemeKey": { "alias": "defaultThemeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "onThemeChange": { "alias": "onThemeChange"; "required": false; "isSignal": true; }; "defaultLocale": { "alias": "defaultLocale"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "onLocaleChange": { "alias": "onLocaleChange"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "collaboration": { "alias": "collaboration"; "required": false; "isSignal": true; }; "authorName": { "alias": "authorName"; "required": false; "isSignal": true; }; "shareDefaults": { "alias": "shareDefaults"; "required": false; "isSignal": true; }; "onOpenFile": { "alias": "onOpenFile"; "required": false; "isSignal": true; }; "smartArt3D": { "alias": "smartArt3D"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "activeSlideChange": "activeSlideChange"; "dirtyChange": "dirtyChange"; "contentChange": "contentChange"; "propertiesChange": "propertiesChange"; "modeChange": "modeChange"; "zoomChange": "zoomChange"; "selectionChange": "selectionChange"; "slideCountChange": "slideCountChange"; "startCollaboration": "startCollaboration"; "stopCollaboration": "stopCollaboration"; }, never, never, true, never>;
|
|
8189
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PowerPointViewerComponent, "pptx-viewer", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "fontsInput": { "alias": "fonts"; "required": false; "isSignal": true; }; "canEditInput": { "alias": "canEdit"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "defaultThemeKey": { "alias": "defaultThemeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "onThemeChange": { "alias": "onThemeChange"; "required": false; "isSignal": true; }; "defaultLocale": { "alias": "defaultLocale"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "onLocaleChange": { "alias": "onLocaleChange"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "collaboration": { "alias": "collaboration"; "required": false; "isSignal": true; }; "authorName": { "alias": "authorName"; "required": false; "isSignal": true; }; "shareDefaults": { "alias": "shareDefaults"; "required": false; "isSignal": true; }; "onOpenFile": { "alias": "onOpenFile"; "required": false; "isSignal": true; }; "smartArt3D": { "alias": "smartArt3D"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "ai": { "alias": "ai"; "required": false; "isSignal": true; }; }, { "activeSlideChange": "activeSlideChange"; "dirtyChange": "dirtyChange"; "contentChange": "contentChange"; "propertiesChange": "propertiesChange"; "modeChange": "modeChange"; "zoomChange": "zoomChange"; "selectionChange": "selectionChange"; "slideCountChange": "slideCountChange"; "startCollaboration": "startCollaboration"; "stopCollaboration": "stopCollaboration"; }, never, never, true, never>;
|
|
7224
8190
|
}
|
|
7225
8191
|
|
|
7226
8192
|
/** A selected chart sub-part, scoped to the chart element that owns it. */
|
|
@@ -7575,7 +8541,395 @@ declare class ZoomTargetService {
|
|
|
7575
8541
|
* `PowerPointViewerComponent`'s children (ribbon, slide canvas, inspector,
|
|
7576
8542
|
* dialogs, ...) rely on via `inject()`.
|
|
7577
8543
|
*/
|
|
7578
|
-
declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof CollaborationService, typeof AccessibilityService, typeof AutosaveService, typeof PrintService, typeof IsMobileService, typeof SmartArt3DService, typeof FieldContextService, typeof ZoomTargetService, typeof ViewerDialogsService, typeof ViewerCompareService, typeof ViewerExportService, typeof ViewerFindReplaceService, typeof ViewerCustomShowsService, typeof ViewerCollaborationSessionService, typeof ViewerCanvasEditingService, typeof ViewerCollabCursorService, typeof ViewerDocumentPropertiesService, typeof ViewerFileIOService, typeof ViewerFormatPainterService, typeof ViewerInspectorPanelService, typeof ViewerKeyboardService, typeof ViewerMobileSheetService, typeof ViewerOptionsService, typeof ViewerPresentationModeService, typeof ViewerThemeGalleryService, typeof ViewerTouchGesturesService, typeof ViewerZoomService];
|
|
8544
|
+
declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof CollaborationService, typeof AccessibilityService, typeof AutosaveService, typeof PrintService, typeof IsMobileService, typeof SmartArt3DService, typeof FieldContextService, typeof ZoomTargetService, typeof AiPanelStore, typeof ViewerDialogsService, typeof ViewerCompareService, typeof ViewerExportService, typeof ViewerFindReplaceService, typeof ViewerCustomShowsService, typeof ViewerCollaborationSessionService, typeof ViewerCanvasEditingService, typeof ViewerCollabCursorService, typeof ViewerDocumentPropertiesService, typeof ViewerFileIOService, typeof ViewerFormatPainterService, typeof ViewerInspectorPanelService, typeof ViewerKeyboardService, typeof ViewerMobileSheetService, typeof ViewerOptionsService, typeof ViewerPresentationModeService, typeof ViewerThemeGalleryService, typeof ViewerTouchGesturesService, typeof ViewerZoomService];
|
|
8545
|
+
|
|
8546
|
+
/** Lifecycle of the AI session bootstrap. */
|
|
8547
|
+
type AiChatInitState = 'checking' | 'unavailable' | 'ready' | 'error';
|
|
8548
|
+
declare class AiChatService {
|
|
8549
|
+
private readonly destroyRef;
|
|
8550
|
+
private controller;
|
|
8551
|
+
private unsubscribe;
|
|
8552
|
+
private started;
|
|
8553
|
+
/**
|
|
8554
|
+
* Tool call ids we have already reported to {@link toolTargetHandler}, so the
|
|
8555
|
+
* live on-canvas focus fires once per call as it first appears (the vanilla
|
|
8556
|
+
* controller has no `onToolCall` hook we can pass, so we derive tool activity
|
|
8557
|
+
* from the streamed snapshot instead).
|
|
8558
|
+
*/
|
|
8559
|
+
private readonly reportedToolCalls;
|
|
8560
|
+
private toolTargetHandler;
|
|
8561
|
+
/** Session bootstrap lifecycle. */
|
|
8562
|
+
readonly state: _angular_core.WritableSignal<AiChatInitState>;
|
|
8563
|
+
/** The current transcript. */
|
|
8564
|
+
readonly messages: _angular_core.WritableSignal<readonly PptxAiUIMessage[]>;
|
|
8565
|
+
/** The chat status (`ready` / `submitted` / `streaming` / `error`). */
|
|
8566
|
+
readonly status: _angular_core.WritableSignal<AiSdk.ChatStatus>;
|
|
8567
|
+
/** The last transport / streaming error, when any. */
|
|
8568
|
+
readonly error: _angular_core.WritableSignal<Error | undefined>;
|
|
8569
|
+
/** The bootstrap error (SDK missing / session build failed). */
|
|
8570
|
+
readonly initError: _angular_core.WritableSignal<Error | undefined>;
|
|
8571
|
+
/** The staged, not-yet-applied write proposals. */
|
|
8572
|
+
readonly proposals: _angular_core.WritableSignal<readonly ProposalView[]>;
|
|
8573
|
+
/** Whether a request is in flight (drives the composer send/stop toggle). */
|
|
8574
|
+
readonly isStreaming: _angular_core.Signal<boolean>;
|
|
8575
|
+
constructor();
|
|
8576
|
+
/**
|
|
8577
|
+
* Bootstrap the session for the given bridge + config. Idempotent: only the
|
|
8578
|
+
* first call takes effect (the panel calls it once when it opens).
|
|
8579
|
+
*/
|
|
8580
|
+
init(bridge: PptxAiBridge, config: PptxAiConfig): void;
|
|
8581
|
+
/**
|
|
8582
|
+
* Register a handler invoked as each tool call first appears, with the slide /
|
|
8583
|
+
* element(s) it references (or `null` for deck-wide tools). Lets the viewer
|
|
8584
|
+
* navigate + highlight the canvas so it mirrors the assistant in real time.
|
|
8585
|
+
*/
|
|
8586
|
+
setToolTargetHandler(handler: (target: ToolCanvasTarget | null) => void): void;
|
|
8587
|
+
/** Send a user message (no-op when empty or not ready). */
|
|
8588
|
+
send(text: string): void;
|
|
8589
|
+
/** Abort the in-flight request. */
|
|
8590
|
+
stop(): void;
|
|
8591
|
+
/** Clear the current error and return to the ready state. */
|
|
8592
|
+
clearError(): void;
|
|
8593
|
+
/** Accept one staged proposal (applies it as one undoable edit). */
|
|
8594
|
+
applyProposal(id: string): void;
|
|
8595
|
+
/** Reject one staged proposal without applying it. */
|
|
8596
|
+
rejectProposal(id: string): void;
|
|
8597
|
+
/** Accept every staged proposal in order (each its own undoable edit). */
|
|
8598
|
+
acceptAllProposals(): void;
|
|
8599
|
+
private applySnapshot;
|
|
8600
|
+
/**
|
|
8601
|
+
* Fire {@link toolTargetHandler} once per tool call as it first appears with a
|
|
8602
|
+
* resolved input, mirroring React's `onToolCall` -> `toolCanvasTarget` path
|
|
8603
|
+
* (the vanilla controller owns `onToolCall`, so we cannot hook it directly).
|
|
8604
|
+
*/
|
|
8605
|
+
private reportNewToolTargets;
|
|
8606
|
+
private refreshProposals;
|
|
8607
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChatService, never>;
|
|
8608
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AiChatService>;
|
|
8609
|
+
}
|
|
8610
|
+
|
|
8611
|
+
declare class AiChatPanelComponent {
|
|
8612
|
+
readonly bridge: _angular_core.InputSignal<PptxAiBridge>;
|
|
8613
|
+
readonly config: _angular_core.InputSignal<PptxAiConfig>;
|
|
8614
|
+
readonly panelWidth: _angular_core.InputSignal<number | undefined>;
|
|
8615
|
+
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
8616
|
+
protected readonly chat: AiChatService;
|
|
8617
|
+
/** Shared panel scope + on-canvas highlight store (provided by the viewer). */
|
|
8618
|
+
protected readonly store: AiPanelStore;
|
|
8619
|
+
constructor();
|
|
8620
|
+
/**
|
|
8621
|
+
* Apply a suggestion, first enabling the canvas colour tween so the edit fades
|
|
8622
|
+
* in rather than snapping (proposals apply outside the tool loop).
|
|
8623
|
+
*/
|
|
8624
|
+
protected applyProposal(id: string): void;
|
|
8625
|
+
protected acceptAllProposals(): void;
|
|
8626
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChatPanelComponent, never>;
|
|
8627
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiChatPanelComponent, "pptx-ai-chat-panel", never, { "bridge": { "alias": "bridge"; "required": true; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
|
|
8628
|
+
}
|
|
8629
|
+
|
|
8630
|
+
/**
|
|
8631
|
+
* createAngularAiBridge: builds a {@link PptxAiBridge} that lets the
|
|
8632
|
+
* framework-agnostic AI core (`pptx-viewer-shared/ai`) read the open deck,
|
|
8633
|
+
* navigate it, and route edits through the Angular editor-history layer so
|
|
8634
|
+
* every AI change is a single, undoable Ctrl+Z.
|
|
8635
|
+
*
|
|
8636
|
+
* The bridge is a plain object closing over a small set of accessor callbacks
|
|
8637
|
+
* (mirroring React's `useAiBridge` ref indirection): each read pulls the live
|
|
8638
|
+
* value on demand, and each of the three write choke points funnels through
|
|
8639
|
+
* {@link BridgeDeps.applySlides} -> `EditorStateService.applyReplacement`, which
|
|
8640
|
+
* records ONE history snapshot per commit. Keeping writes funnelled is what lets
|
|
8641
|
+
* the {@link ProposalStore} apply a staged batch atomically.
|
|
8642
|
+
*/
|
|
8643
|
+
|
|
8644
|
+
/** Live accessors the bridge closes over, supplied by the viewer component. */
|
|
8645
|
+
interface BridgeDeps {
|
|
8646
|
+
/** The editable (template-free) slide deck. */
|
|
8647
|
+
getSlides(): readonly PptxSlide[];
|
|
8648
|
+
/** Zero-based index of the active slide. */
|
|
8649
|
+
getActiveSlideIndex(): number;
|
|
8650
|
+
/** Slide canvas size in CSS pixels. */
|
|
8651
|
+
getCanvasSize(): {
|
|
8652
|
+
width: number;
|
|
8653
|
+
height: number;
|
|
8654
|
+
};
|
|
8655
|
+
/** The resolved presentation theme, when loaded. */
|
|
8656
|
+
getTheme(): PptxTheme | undefined;
|
|
8657
|
+
/** Host-provided document display name, when set. */
|
|
8658
|
+
getFileName(): string | undefined;
|
|
8659
|
+
/** The loaded core handler, when a deck is open. */
|
|
8660
|
+
getHandler(): PptxHandler | undefined;
|
|
8661
|
+
/** Navigate the viewer to a slide by zero-based index. */
|
|
8662
|
+
goToSlide(index: number): void;
|
|
8663
|
+
/** Select the given elements on a slide (empty clears selection). */
|
|
8664
|
+
selectElements(slideIndex: number, elementIds: readonly string[]): void;
|
|
8665
|
+
/**
|
|
8666
|
+
* Commit a fully-computed next slides array as ONE undoable history entry.
|
|
8667
|
+
* Implemented by the component as `editor.applyReplacement(next, label)`.
|
|
8668
|
+
*/
|
|
8669
|
+
applySlides(next: PptxSlide[], label: string): void;
|
|
8670
|
+
/** Apply partial theme updates through the editor's theme handlers. */
|
|
8671
|
+
applyTheme(updates: Partial<PptxTheme>): void;
|
|
8672
|
+
/** Ordered presentation sections (editor-tracked, saved with the deck). */
|
|
8673
|
+
getSections(): readonly PptxSection[];
|
|
8674
|
+
/** Presentation-level properties (`p:presentationPr`), loader-tracked. */
|
|
8675
|
+
getPresentationProperties(): PptxPresentationProperties;
|
|
8676
|
+
/** Custom document properties (`docProps/custom.xml`), loader-tracked. */
|
|
8677
|
+
getCustomProperties(): readonly PptxCustomProperty[];
|
|
8678
|
+
/** Core document properties (`docProps/core.xml`), loader-tracked. */
|
|
8679
|
+
getCoreProperties(): PptxCoreProperties | undefined;
|
|
8680
|
+
/** Extended application properties (`docProps/app.xml`), loader-tracked. */
|
|
8681
|
+
getAppProperties(): PptxAppProperties | undefined;
|
|
8682
|
+
/** Set the slide canvas size (px) and mark the deck dirty. */
|
|
8683
|
+
setCanvasSize(size: {
|
|
8684
|
+
width: number;
|
|
8685
|
+
height: number;
|
|
8686
|
+
}): void;
|
|
8687
|
+
/** Replace the presentation sections and mark the deck dirty. */
|
|
8688
|
+
setSections(sections: readonly PptxSection[]): void;
|
|
8689
|
+
/** Replace the presentation-level properties and mark the deck dirty. */
|
|
8690
|
+
setPresentationProperties(props: PptxPresentationProperties): void;
|
|
8691
|
+
/** Replace the custom document properties and mark the deck dirty. */
|
|
8692
|
+
setCustomProperties(props: readonly PptxCustomProperty[]): void;
|
|
8693
|
+
/** Replace the core document properties and mark the deck dirty. */
|
|
8694
|
+
setCoreProperties(props: PptxCoreProperties | undefined): void;
|
|
8695
|
+
/** Replace the extended application properties and mark the deck dirty. */
|
|
8696
|
+
setAppProperties(props: PptxAppProperties | undefined): void;
|
|
8697
|
+
/**
|
|
8698
|
+
* The slides / elements the assistant should scope its work to (explicit AI
|
|
8699
|
+
* picks, else a pinned focus, else the live canvas selection). When omitted,
|
|
8700
|
+
* the assistant falls back to the whole active slide.
|
|
8701
|
+
*/
|
|
8702
|
+
getFocusedTargets?(): PptxAiFocusedTarget[];
|
|
8703
|
+
/** Optional transient host notification (toast / status line). */
|
|
8704
|
+
notify?(message: string, level?: PptxAiNotifyLevel): void;
|
|
8705
|
+
}
|
|
8706
|
+
/** Build a stable {@link PptxAiBridge} over the Angular viewer state/editor. */
|
|
8707
|
+
declare function createAngularAiBridge(deps: BridgeDeps): PptxAiBridge;
|
|
8708
|
+
|
|
8709
|
+
/**
|
|
8710
|
+
* Pure gating predicate for the AI assistant UI. The ribbon Sparkles toggle and
|
|
8711
|
+
* the chat pane are shown only when the host supplies an `ai` config; keeping
|
|
8712
|
+
* this a standalone function makes the rule unit-testable without mounting the
|
|
8713
|
+
* component (the Angular test setup is TestBed-free).
|
|
8714
|
+
*/
|
|
8715
|
+
|
|
8716
|
+
/** Whether the AI assistant toggle should be shown for the given config. */
|
|
8717
|
+
declare function aiToggleVisible(config: PptxAiConfig | undefined): boolean;
|
|
8718
|
+
|
|
8719
|
+
declare class AiComposerComponent {
|
|
8720
|
+
readonly isStreaming: _angular_core.InputSignal<boolean>;
|
|
8721
|
+
/**
|
|
8722
|
+
* One-shot composer prefill from "Ask AI" / "Fix with AI". `prefillNonce`
|
|
8723
|
+
* bumps on every request so the composer applies `prefillText` (and focuses)
|
|
8724
|
+
* even when the text is empty and unchanged.
|
|
8725
|
+
*/
|
|
8726
|
+
readonly prefillText: _angular_core.InputSignal<string>;
|
|
8727
|
+
readonly prefillNonce: _angular_core.InputSignal<number>;
|
|
8728
|
+
readonly onSend: _angular_core.OutputEmitterRef<string>;
|
|
8729
|
+
readonly onStop: _angular_core.OutputEmitterRef<void>;
|
|
8730
|
+
protected readonly value: _angular_core.WritableSignal<string>;
|
|
8731
|
+
private readonly textarea;
|
|
8732
|
+
private lastPrefillNonce;
|
|
8733
|
+
constructor();
|
|
8734
|
+
protected submit(): void;
|
|
8735
|
+
protected onKeyDown(event: KeyboardEvent): void;
|
|
8736
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiComposerComponent, never>;
|
|
8737
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiComposerComponent, "pptx-ai-composer", never, { "isStreaming": { "alias": "isStreaming"; "required": false; "isSignal": true; }; "prefillText": { "alias": "prefillText"; "required": false; "isSignal": true; }; "prefillNonce": { "alias": "prefillNonce"; "required": false; "isSignal": true; }; }, { "onSend": "onSend"; "onStop": "onStop"; }, never, never, true, never>;
|
|
8738
|
+
}
|
|
8739
|
+
|
|
8740
|
+
declare class AiFocusBarComponent {
|
|
8741
|
+
/** Live deck, for resolving element chip labels + the two-table detection. */
|
|
8742
|
+
readonly slides: _angular_core.InputSignal<readonly PptxSlide[]>;
|
|
8743
|
+
/** Emitted with a ready-to-send directive (e.g. the merge-tables request). */
|
|
8744
|
+
readonly sendDirective: _angular_core.OutputEmitterRef<string>;
|
|
8745
|
+
protected readonly store: AiPanelStore;
|
|
8746
|
+
protected readonly chips: _angular_core.Signal<pptx_angular_viewer.FocusChip[]>;
|
|
8747
|
+
protected readonly twoTables: _angular_core.Signal<false | {
|
|
8748
|
+
slideIndex: number;
|
|
8749
|
+
elementIdA: string;
|
|
8750
|
+
elementIdB: string;
|
|
8751
|
+
}>;
|
|
8752
|
+
protected onMerge(tt: {
|
|
8753
|
+
slideIndex: number;
|
|
8754
|
+
elementIdA: string;
|
|
8755
|
+
elementIdB: string;
|
|
8756
|
+
}): void;
|
|
8757
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiFocusBarComponent, never>;
|
|
8758
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiFocusBarComponent, "pptx-ai-focus-bar", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; }, { "sendDirective": "sendDirective"; }, never, never, true, never>;
|
|
8759
|
+
}
|
|
8760
|
+
|
|
8761
|
+
/** One tool invocation captured with its full technical detail. */
|
|
8762
|
+
interface AiLogToolCall {
|
|
8763
|
+
toolName: string;
|
|
8764
|
+
toolCallId: string;
|
|
8765
|
+
state: string;
|
|
8766
|
+
input: unknown;
|
|
8767
|
+
output: unknown;
|
|
8768
|
+
errorText?: string;
|
|
8769
|
+
}
|
|
8770
|
+
/** One message: its role, concatenated prose, and any tool calls it made. */
|
|
8771
|
+
interface AiLogMessage {
|
|
8772
|
+
role: string;
|
|
8773
|
+
text: string;
|
|
8774
|
+
toolCalls: AiLogToolCall[];
|
|
8775
|
+
}
|
|
8776
|
+
/** One chat conversation in export form. */
|
|
8777
|
+
interface AiLogChat {
|
|
8778
|
+
id: string;
|
|
8779
|
+
title: string;
|
|
8780
|
+
deckId?: string;
|
|
8781
|
+
createdAt: number;
|
|
8782
|
+
updatedAt: number;
|
|
8783
|
+
createdAtIso: string;
|
|
8784
|
+
updatedAtIso: string;
|
|
8785
|
+
messageCount: number;
|
|
8786
|
+
messages: AiLogMessage[];
|
|
8787
|
+
}
|
|
8788
|
+
/** Top-level detailed export document. */
|
|
8789
|
+
interface AiLogExport {
|
|
8790
|
+
format: 'pptx-ai-chat-log';
|
|
8791
|
+
version: 1;
|
|
8792
|
+
exportedAt: string;
|
|
8793
|
+
/** Whether tool inputs/outputs are included (see `detailed` option). */
|
|
8794
|
+
detailed: boolean;
|
|
8795
|
+
chatCount: number;
|
|
8796
|
+
chats: AiLogChat[];
|
|
8797
|
+
}
|
|
8798
|
+
/** Options controlling how the export document is built. */
|
|
8799
|
+
interface BuildChatLogOptions {
|
|
8800
|
+
/** Include tool-call inputs/outputs. Default `true`. When false, tool calls
|
|
8801
|
+
* still list name + state but omit the (potentially large) payloads. */
|
|
8802
|
+
detailed?: boolean;
|
|
8803
|
+
/** Epoch ms stamped as `exportedAt`. Default `Date.now()`. */
|
|
8804
|
+
now?: number;
|
|
8805
|
+
}
|
|
8806
|
+
/** Build the detailed export document from already-loaded chats (pure). */
|
|
8807
|
+
declare function buildChatLogExport(chats: readonly PptxAiStoredChat[], options?: BuildChatLogOptions): AiLogExport;
|
|
8808
|
+
/** Render the same detailed export as a human-readable Markdown transcript. */
|
|
8809
|
+
declare function buildChatLogMarkdown(doc: AiLogExport): string;
|
|
8810
|
+
/** Load every stored chat (newest first) in full detail from a store. */
|
|
8811
|
+
declare function collectStoredChats(store: PptxAiChatStore): Promise<PptxAiStoredChat[]>;
|
|
8812
|
+
/** File format to download. */
|
|
8813
|
+
type AiLogFormat = 'json' | 'markdown';
|
|
8814
|
+
/** Options for {@link exportAiChatLogs}. */
|
|
8815
|
+
interface ExportAiChatLogsOptions {
|
|
8816
|
+
/** Store to read from. Defaults to the shared `createChatHistoryStore()`. */
|
|
8817
|
+
store?: PptxAiChatStore;
|
|
8818
|
+
/** `'json'` (default) or `'markdown'`. */
|
|
8819
|
+
format?: AiLogFormat;
|
|
8820
|
+
/** Include tool inputs/outputs. Default `true`. */
|
|
8821
|
+
detailed?: boolean;
|
|
8822
|
+
/** Epoch ms for the filename + `exportedAt`. Default `Date.now()`. */
|
|
8823
|
+
now?: number;
|
|
8824
|
+
}
|
|
8825
|
+
/**
|
|
8826
|
+
* Read all stored chats and trigger a browser download of the detailed log.
|
|
8827
|
+
*
|
|
8828
|
+
* @returns the number of chats exported. When `0`, no file is downloaded so the
|
|
8829
|
+
* caller can surface an empty-state message instead.
|
|
8830
|
+
*/
|
|
8831
|
+
declare function exportAiChatLogs(options?: ExportAiChatLogsOptions): Promise<number>;
|
|
8832
|
+
|
|
8833
|
+
declare class AiSettingsSectionComponent {
|
|
8834
|
+
private readonly store;
|
|
8835
|
+
/** Number of stored chats (null while counting). */
|
|
8836
|
+
protected readonly chatCount: _angular_core.WritableSignal<number | null>;
|
|
8837
|
+
/** Include tool inputs/outputs in the export. */
|
|
8838
|
+
protected readonly detailed: _angular_core.WritableSignal<boolean>;
|
|
8839
|
+
protected readonly busy: _angular_core.WritableSignal<boolean>;
|
|
8840
|
+
/** Result of the last export, or null before any export runs. */
|
|
8841
|
+
protected readonly doneCount: _angular_core.WritableSignal<number | null>;
|
|
8842
|
+
constructor();
|
|
8843
|
+
protected onExport(format: AiLogFormat): void;
|
|
8844
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiSettingsSectionComponent, never>;
|
|
8845
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiSettingsSectionComponent, "pptx-ai-settings-section", never, {}, {}, never, never, true, never>;
|
|
8846
|
+
}
|
|
8847
|
+
|
|
8848
|
+
declare class AiChangeOverlayComponent {
|
|
8849
|
+
/** The batch of just-applied changes to animate (null when idle). */
|
|
8850
|
+
readonly batch: _angular_core.InputSignal<AiChangeBatch | null>;
|
|
8851
|
+
/** Zero-based active slide index, so the overlay draws only its own slide. */
|
|
8852
|
+
readonly activeSlideIndex: _angular_core.InputSignal<number>;
|
|
8853
|
+
private readonly host;
|
|
8854
|
+
private readonly renderer;
|
|
8855
|
+
private styleEl;
|
|
8856
|
+
/** `start` (pre-flip) then `end` (post-flip) so the CSS transition runs. */
|
|
8857
|
+
private readonly phase;
|
|
8858
|
+
private outerFrame;
|
|
8859
|
+
private innerFrame;
|
|
8860
|
+
/** Monotonic batch id; keys the ghosts + restarts the phase flip per batch. */
|
|
8861
|
+
protected readonly nonce: _angular_core.Signal<number>;
|
|
8862
|
+
/** The changes on the currently visible slide (bounds map 1:1 to the stage). */
|
|
8863
|
+
protected readonly activeChanges: _angular_core.Signal<AiElementChange[]>;
|
|
8864
|
+
constructor();
|
|
8865
|
+
/** Kebab-cased ghost-rect style for one change at the current phase. */
|
|
8866
|
+
protected ghostStyle(change: AiElementChange): StyleMap;
|
|
8867
|
+
private cancelFrames;
|
|
8868
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiChangeOverlayComponent, never>;
|
|
8869
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiChangeOverlayComponent, "pptx-ai-change-overlay", never, { "batch": { "alias": "batch"; "required": false; "isSignal": true; }; "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
8870
|
+
}
|
|
8871
|
+
|
|
8872
|
+
interface HighlightBox extends AiCanvasHighlight {
|
|
8873
|
+
x: number;
|
|
8874
|
+
y: number;
|
|
8875
|
+
width: number;
|
|
8876
|
+
height: number;
|
|
8877
|
+
}
|
|
8878
|
+
declare class AiFocusHighlightOverlayComponent {
|
|
8879
|
+
readonly highlights: _angular_core.InputSignal<readonly AiCanvasHighlight[]>;
|
|
8880
|
+
/** Elements of the currently visible slide, for bounds lookup. */
|
|
8881
|
+
readonly elements: _angular_core.InputSignal<readonly PptxElement[]>;
|
|
8882
|
+
readonly activeSlideIndex: _angular_core.InputSignal<number>;
|
|
8883
|
+
/** Resolve each highlight to a positioned box on the active slide. */
|
|
8884
|
+
protected readonly boxes: _angular_core.Signal<HighlightBox[]>;
|
|
8885
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiFocusHighlightOverlayComponent, never>;
|
|
8886
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiFocusHighlightOverlayComponent, "pptx-ai-focus-highlight-overlay", never, { "highlights": { "alias": "highlights"; "required": false; "isSignal": true; }; "elements": { "alias": "elements"; "required": false; "isSignal": true; }; "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
8887
|
+
}
|
|
8888
|
+
|
|
8889
|
+
/** One rendered transcript row: a message flattened to its renderable parts. */
|
|
8890
|
+
interface MessageRow {
|
|
8891
|
+
id: string;
|
|
8892
|
+
isUser: boolean;
|
|
8893
|
+
parts: RenderablePart[];
|
|
8894
|
+
}
|
|
8895
|
+
declare class AiMessageListComponent {
|
|
8896
|
+
readonly messages: _angular_core.InputSignal<readonly PptxAiUIMessage[]>;
|
|
8897
|
+
readonly isStreaming: _angular_core.InputSignal<boolean>;
|
|
8898
|
+
private readonly endRef;
|
|
8899
|
+
/** Flatten each message into renderable parts, dropping empty assistant turns. */
|
|
8900
|
+
protected readonly rows: _angular_core.Signal<MessageRow[]>;
|
|
8901
|
+
constructor();
|
|
8902
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiMessageListComponent, never>;
|
|
8903
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiMessageListComponent, "pptx-ai-message-list", never, { "messages": { "alias": "messages"; "required": true; "isSignal": true; }; "isStreaming": { "alias": "isStreaming"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
8904
|
+
}
|
|
8905
|
+
|
|
8906
|
+
declare class AiProposalCardComponent {
|
|
8907
|
+
readonly proposal: _angular_core.InputSignal<ProposalView>;
|
|
8908
|
+
readonly accept: _angular_core.OutputEmitterRef<string>;
|
|
8909
|
+
readonly reject: _angular_core.OutputEmitterRef<string>;
|
|
8910
|
+
/** Plain-language description of every staged change (never truncated). */
|
|
8911
|
+
protected readonly lines: _angular_core.Signal<string[]>;
|
|
8912
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiProposalCardComponent, never>;
|
|
8913
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiProposalCardComponent, "pptx-ai-proposal-card", never, { "proposal": { "alias": "proposal"; "required": true; "isSignal": true; }; }, { "accept": "accept"; "reject": "reject"; }, never, never, true, never>;
|
|
8914
|
+
}
|
|
8915
|
+
|
|
8916
|
+
declare class AiToolCallCardComponent {
|
|
8917
|
+
readonly part: _angular_core.InputSignal<RenderableToolPart>;
|
|
8918
|
+
protected readonly failed: _angular_core.Signal<boolean>;
|
|
8919
|
+
protected readonly done: _angular_core.Signal<boolean>;
|
|
8920
|
+
protected readonly running: _angular_core.Signal<boolean>;
|
|
8921
|
+
/** Friendly, non-technical activity ("Looked at slide 5"); never leaks ids. */
|
|
8922
|
+
private readonly activity;
|
|
8923
|
+
protected readonly icon: _angular_core.Signal<ToolActivityIcon>;
|
|
8924
|
+
protected readonly activityLabel: _angular_core.Signal<string>;
|
|
8925
|
+
/** Raw tool name + arg summary, only shown inside the collapsed disclosure. */
|
|
8926
|
+
protected readonly rawSummary: _angular_core.Signal<string>;
|
|
8927
|
+
protected readonly rawLabel: _angular_core.Signal<string>;
|
|
8928
|
+
protected readonly iconClass: _angular_core.Signal<"h-3.5 w-3.5 shrink-0 text-destructive" | "h-3.5 w-3.5 shrink-0 text-muted-foreground">;
|
|
8929
|
+
protected readonly statusKey: _angular_core.Signal<"pptx.ai.toolFailed" | "pptx.ai.toolDone" | "pptx.ai.toolRunning">;
|
|
8930
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AiToolCallCardComponent, never>;
|
|
8931
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AiToolCallCardComponent, "pptx-ai-tool-call-card", never, { "part": { "alias": "part"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
8932
|
+
}
|
|
7579
8933
|
|
|
7580
8934
|
/** Drawing tool IDs (mirrors React DRAW_TOOLS). */
|
|
7581
8935
|
type DrawTool$1 = 'select' | 'pen' | 'highlighter' | 'eraser' | 'freeform';
|
|
@@ -7661,6 +9015,10 @@ declare class RibbonComponent {
|
|
|
7661
9015
|
readonly showSubtitles: _angular_core.InputSignal<boolean>;
|
|
7662
9016
|
/** Toolbar buttons/tabs the host wants hidden. Default `[]` hides nothing. */
|
|
7663
9017
|
readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
|
|
9018
|
+
/** Whether the host enabled the AI assistant (shows the Sparkles toggle). */
|
|
9019
|
+
readonly aiEnabled: _angular_core.InputSignal<boolean>;
|
|
9020
|
+
/** Whether the AI assistant panel is currently open (toggle active state). */
|
|
9021
|
+
readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
|
|
7664
9022
|
/** Optional sign-in hook point for File > Account. Absent/disabled by default. */
|
|
7665
9023
|
readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
|
|
7666
9024
|
readonly prev: _angular_core.OutputEmitterRef<void>;
|
|
@@ -7692,6 +9050,8 @@ declare class RibbonComponent {
|
|
|
7692
9050
|
readonly packageForSharing: _angular_core.OutputEmitterRef<void>;
|
|
7693
9051
|
/** Emitted when the user toggles the slides panel from the top bar. */
|
|
7694
9052
|
readonly toggleSidebar: _angular_core.OutputEmitterRef<void>;
|
|
9053
|
+
/** Emitted when the user clicks the AI assistant Sparkles toggle. */
|
|
9054
|
+
readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
|
|
7695
9055
|
/** Emitted when the user opens the Digital Signatures panel from the File tab. */
|
|
7696
9056
|
readonly signatures: _angular_core.OutputEmitterRef<void>;
|
|
7697
9057
|
readonly info: _angular_core.OutputEmitterRef<void>;
|
|
@@ -7758,7 +9118,7 @@ declare class RibbonComponent {
|
|
|
7758
9118
|
/** Forward the Review proofing toggle to the viewer-owned live state. */
|
|
7759
9119
|
protected setSpellCheck(enabled: boolean): void;
|
|
7760
9120
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonComponent, never>;
|
|
7761
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonComponent, "pptx-ribbon", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "selectedElement": { "alias": "selectedElement"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "formatPainterActive": { "alias": "formatPainterActive"; "required": false; "isSignal": true; }; "canActivateFormatPainter": { "alias": "canActivateFormatPainter"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "hasMacros": { "alias": "hasMacros"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "eyedropperActive": { "alias": "eyedropperActive"; "required": false; "isSignal": true; }; "themeGalleryOpen": { "alias": "themeGalleryOpen"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "findOpen": { "alias": "findOpen"; "required": false; "isSignal": true; }; "collabConnected": { "alias": "collabConnected"; "required": false; "isSignal": true; }; "connectedCount": { "alias": "connectedCount"; "required": false; "isSignal": true; }; "spellCheckEnabled": { "alias": "spellCheckEnabled"; "required": false; "isSignal": true; }; "showSubtitles": { "alias": "showSubtitles"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; }, { "prev": "prev"; "next": "next"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; "find": "find"; "present": "present"; "presenter": "presenter"; "record": "record"; "presentFromBeginning": "presentFromBeginning"; "rehearseTimings": "rehearseTimings"; "toggleSubtitles": "toggleSubtitles"; "openSubtitleSettings": "openSubtitleSettings"; "recordFromBeginning": "recordFromBeginning"; "recordFromCurrent": "recordFromCurrent"; "spellCheckChange": "spellCheckChange"; "share": "share"; "broadcast": "broadcast"; "openFile": "openFile"; "openRecentFile": "openRecentFile"; "createPresentation": "createPresentation"; "save": "save"; "savePpsx": "savePpsx"; "savePptm": "savePptm"; "packageForSharing": "packageForSharing"; "toggleSidebar": "toggleSidebar"; "signatures": "signatures"; "info": "info"; "print": "print"; "comments": "comments"; "a11y": "a11y"; "link": "link"; "openSorter": "openSorter"; "openMasterView": "openMasterView"; "toggleNotes": "toggleNotes"; "toggleFormatPainter": "toggleFormatPainter"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "copySlideAsImage": "copySlideAsImage"; "replace": "replace"; "toggleInspector": "toggleInspector"; "drawToolChange": "drawToolChange"; "toggleThemeGallery": "toggleThemeGallery"; "toggleGrid": "toggleGrid"; "toggleRulers": "toggleRulers"; "toggleGuides": "toggleGuides"; "toggleSelectionPane": "toggleSelectionPane"; "openCustomShows": "openCustomShows"; "toggleSnapToGrid": "toggleSnapToGrid"; "toggleSnapToShape": "toggleSnapToShape"; "addGuide": "addGuide"; "zoomToFit": "zoomToFit"; "toggleEyedropper": "toggleEyedropper"; "openSmartArtDialog": "openSmartArtDialog"; "openEquationDialog": "openEquationDialog"; "openSetUpSlideShow": "openSetUpSlideShow"; "openCompare": "openCompare"; "openPassword": "openPassword"; "openFontEmbedding": "openFontEmbedding"; "openVersionHistory": "openVersionHistory"; "openShortcuts": "openShortcuts"; "openSettings": "openSettings"; }, never, never, true, never>;
|
|
9121
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonComponent, "pptx-ribbon", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "selectedElement": { "alias": "selectedElement"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "formatPainterActive": { "alias": "formatPainterActive"; "required": false; "isSignal": true; }; "canActivateFormatPainter": { "alias": "canActivateFormatPainter"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "hasMacros": { "alias": "hasMacros"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "eyedropperActive": { "alias": "eyedropperActive"; "required": false; "isSignal": true; }; "themeGalleryOpen": { "alias": "themeGalleryOpen"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "findOpen": { "alias": "findOpen"; "required": false; "isSignal": true; }; "collabConnected": { "alias": "collabConnected"; "required": false; "isSignal": true; }; "connectedCount": { "alias": "connectedCount"; "required": false; "isSignal": true; }; "spellCheckEnabled": { "alias": "spellCheckEnabled"; "required": false; "isSignal": true; }; "showSubtitles": { "alias": "showSubtitles"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "aiEnabled": { "alias": "aiEnabled"; "required": false; "isSignal": true; }; "aiPanelOpen": { "alias": "aiPanelOpen"; "required": false; "isSignal": true; }; "accountAuth": { "alias": "accountAuth"; "required": false; "isSignal": true; }; }, { "prev": "prev"; "next": "next"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; "find": "find"; "present": "present"; "presenter": "presenter"; "record": "record"; "presentFromBeginning": "presentFromBeginning"; "rehearseTimings": "rehearseTimings"; "toggleSubtitles": "toggleSubtitles"; "openSubtitleSettings": "openSubtitleSettings"; "recordFromBeginning": "recordFromBeginning"; "recordFromCurrent": "recordFromCurrent"; "spellCheckChange": "spellCheckChange"; "share": "share"; "broadcast": "broadcast"; "openFile": "openFile"; "openRecentFile": "openRecentFile"; "createPresentation": "createPresentation"; "save": "save"; "savePpsx": "savePpsx"; "savePptm": "savePptm"; "packageForSharing": "packageForSharing"; "toggleSidebar": "toggleSidebar"; "toggleAiPanel": "toggleAiPanel"; "signatures": "signatures"; "info": "info"; "print": "print"; "comments": "comments"; "a11y": "a11y"; "link": "link"; "openSorter": "openSorter"; "openMasterView": "openMasterView"; "toggleNotes": "toggleNotes"; "toggleFormatPainter": "toggleFormatPainter"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "copySlideAsImage": "copySlideAsImage"; "replace": "replace"; "toggleInspector": "toggleInspector"; "drawToolChange": "drawToolChange"; "toggleThemeGallery": "toggleThemeGallery"; "toggleGrid": "toggleGrid"; "toggleRulers": "toggleRulers"; "toggleGuides": "toggleGuides"; "toggleSelectionPane": "toggleSelectionPane"; "openCustomShows": "openCustomShows"; "toggleSnapToGrid": "toggleSnapToGrid"; "toggleSnapToShape": "toggleSnapToShape"; "addGuide": "addGuide"; "zoomToFit": "zoomToFit"; "toggleEyedropper": "toggleEyedropper"; "openSmartArtDialog": "openSmartArtDialog"; "openEquationDialog": "openEquationDialog"; "openSetUpSlideShow": "openSetUpSlideShow"; "openCompare": "openCompare"; "openPassword": "openPassword"; "openFontEmbedding": "openFontEmbedding"; "openVersionHistory": "openVersionHistory"; "openShortcuts": "openShortcuts"; "openSettings": "openSettings"; }, never, never, true, never>;
|
|
7762
9122
|
}
|
|
7763
9123
|
|
|
7764
9124
|
/** The eight resize-handle positions around a selection box. */
|
|
@@ -7999,6 +9359,27 @@ declare class SlideCanvasComponent implements SlideContext {
|
|
|
7999
9359
|
* slide's own elements; interactive only while {@link editTemplateMode} is on.
|
|
8000
9360
|
*/
|
|
8001
9361
|
readonly templateElements: _angular_core.InputSignal<readonly PptxElement[]>;
|
|
9362
|
+
/**
|
|
9363
|
+
* On-canvas AI highlight rings (explicit picks + the live tool focus), drawn
|
|
9364
|
+
* inside the scaled stage so element coords map 1:1. Empty on thumbnails.
|
|
9365
|
+
*/
|
|
9366
|
+
readonly aiHighlights: _angular_core.InputSignal<readonly AiCanvasHighlight[]>;
|
|
9367
|
+
/** True while the AI is active: enables the colour tween on slide elements. */
|
|
9368
|
+
readonly aiActive: _angular_core.InputSignal<boolean>;
|
|
9369
|
+
/** Zero-based active slide index, so the overlay draws only its own slide. */
|
|
9370
|
+
readonly aiActiveSlideIndex: _angular_core.InputSignal<number>;
|
|
9371
|
+
/**
|
|
9372
|
+
* The batch of just-applied AI element changes to play on the canvas (glide
|
|
9373
|
+
* old->new, fade/scale in-out, glow), or null when idle. Drawn inside the
|
|
9374
|
+
* scaled stage next to the focus overlay so bounds map 1:1. Empty on thumbnails.
|
|
9375
|
+
*/
|
|
9376
|
+
readonly aiChangeBatch: _angular_core.InputSignal<AiChangeBatch | null>;
|
|
9377
|
+
/**
|
|
9378
|
+
* When true, the next element click(s) become AI picks (emitted via
|
|
9379
|
+
* {@link elementSelect}) instead of selecting / dragging. mousedown never
|
|
9380
|
+
* starts a drag while picking, mirroring React's pick mode.
|
|
9381
|
+
*/
|
|
9382
|
+
readonly aiPickMode: _angular_core.InputSignal<boolean>;
|
|
8002
9383
|
/** Active draw tool. When not 'select', pointer gestures draw ink strokes. */
|
|
8003
9384
|
readonly drawTool: _angular_core.InputSignal<"pen" | "highlighter" | "eraser" | "select" | "freeform">;
|
|
8004
9385
|
/** Active ink stroke colour (CSS colour string). */
|
|
@@ -8211,7 +9592,22 @@ declare class SlideCanvasComponent implements SlideContext {
|
|
|
8211
9592
|
readonly vRulerTicks: _angular_core.Signal<readonly RulerTick[]>;
|
|
8212
9593
|
readonly stageStyle: _angular_core.Signal<StyleMap>;
|
|
8213
9594
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideCanvasComponent, never>;
|
|
8214
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideCanvasComponent, "pptx-slide-canvas", never, { "slide": { "alias": "slide"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "guideCommand": { "alias": "guideCommand"; "required": false; "isSignal": true; }; "spellCheck": { "alias": "spellCheck"; "required": false; "isSignal": true; }; "snapToGuides": { "alias": "snapToGuides"; "required": false; "isSignal": true; }; "autoFit": { "alias": "autoFit"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; "editingId": { "alias": "editingId"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "drawTool": { "alias": "drawTool"; "required": false; "isSignal": true; }; "drawColor": { "alias": "drawColor"; "required": false; "isSignal": true; }; "drawWidth": { "alias": "drawWidth"; "required": false; "isSignal": true; }; }, { "elementSelect": "elementSelect"; "backgroundClick": "backgroundClick"; "transformStart": "transformStart"; "transformUpdate": "transformUpdate"; "contextMenu": "contextMenu"; "textEditStart": "textEditStart"; "textCommit": "textCommit"; "textCancel": "textCancel"; "textFormat": "textFormat"; "rotateUpdate": "rotateUpdate"; "marqueeSelect": "marqueeSelect"; "inkStrokeComplete": "inkStrokeComplete"; "eraserHit": "eraserHit"; "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
|
|
9595
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideCanvasComponent, "pptx-slide-canvas", never, { "slide": { "alias": "slide"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showRulers": { "alias": "showRulers"; "required": false; "isSignal": true; }; "showGuides": { "alias": "showGuides"; "required": false; "isSignal": true; }; "snapToGrid": { "alias": "snapToGrid"; "required": false; "isSignal": true; }; "snapToShape": { "alias": "snapToShape"; "required": false; "isSignal": true; }; "guideCommand": { "alias": "guideCommand"; "required": false; "isSignal": true; }; "spellCheck": { "alias": "spellCheck"; "required": false; "isSignal": true; }; "snapToGuides": { "alias": "snapToGuides"; "required": false; "isSignal": true; }; "autoFit": { "alias": "autoFit"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; "editingId": { "alias": "editingId"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "aiHighlights": { "alias": "aiHighlights"; "required": false; "isSignal": true; }; "aiActive": { "alias": "aiActive"; "required": false; "isSignal": true; }; "aiActiveSlideIndex": { "alias": "aiActiveSlideIndex"; "required": false; "isSignal": true; }; "aiChangeBatch": { "alias": "aiChangeBatch"; "required": false; "isSignal": true; }; "aiPickMode": { "alias": "aiPickMode"; "required": false; "isSignal": true; }; "drawTool": { "alias": "drawTool"; "required": false; "isSignal": true; }; "drawColor": { "alias": "drawColor"; "required": false; "isSignal": true; }; "drawWidth": { "alias": "drawWidth"; "required": false; "isSignal": true; }; }, { "elementSelect": "elementSelect"; "backgroundClick": "backgroundClick"; "transformStart": "transformStart"; "transformUpdate": "transformUpdate"; "contextMenu": "contextMenu"; "textEditStart": "textEditStart"; "textCommit": "textCommit"; "textCancel": "textCancel"; "textFormat": "textFormat"; "rotateUpdate": "rotateUpdate"; "marqueeSelect": "marqueeSelect"; "inkStrokeComplete": "inkStrokeComplete"; "eraserHit": "eraserHit"; "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
|
|
9596
|
+
}
|
|
9597
|
+
|
|
9598
|
+
/**
|
|
9599
|
+
* Renderer-injected shape-effect definitions that need a companion DOM node
|
|
9600
|
+
* (a soft-edge `<filter>` def, a DAG fill-overlay tint layer), plus the helper
|
|
9601
|
+
* that strips dangling `url(#…)` filter references.
|
|
9602
|
+
*
|
|
9603
|
+
* Kept out of `element-style.ts` so that module stays focused on producing the
|
|
9604
|
+
* base `[ngStyle]` maps. Mirrors the Vue/Svelte `ShapeEffectOverlay` split.
|
|
9605
|
+
*/
|
|
9606
|
+
|
|
9607
|
+
/** Injectable soft-edge `<filter>` descriptor (id + feather radius in px). */
|
|
9608
|
+
interface SoftEdgeFilterDef {
|
|
9609
|
+
id: string;
|
|
9610
|
+
radius: number;
|
|
8215
9611
|
}
|
|
8216
9612
|
|
|
8217
9613
|
/**
|
|
@@ -8349,6 +9745,16 @@ interface Paragraph {
|
|
|
8349
9745
|
bulletStyle: StyleMap;
|
|
8350
9746
|
/** Left indent in px derived from the paragraph outline level. */
|
|
8351
9747
|
indentPx: number;
|
|
9748
|
+
/**
|
|
9749
|
+
* Per-paragraph `line-height` from this paragraph's own `a:lnSpc`: a unitless
|
|
9750
|
+
* multiplier (`a:spcPct`) or a `"<n>pt"` string (`a:spcPts`). Undefined when
|
|
9751
|
+
* the paragraph does not override the body-level line-height.
|
|
9752
|
+
*/
|
|
9753
|
+
lineHeight?: number | string;
|
|
9754
|
+
/** `margin-top` in px from `a:spcBef` (space before), when overridden. */
|
|
9755
|
+
spaceBeforePx?: number;
|
|
9756
|
+
/** `margin-bottom` in px from `a:spcAft` (space after), when overridden. */
|
|
9757
|
+
spaceAfterPx?: number;
|
|
8352
9758
|
}
|
|
8353
9759
|
/**
|
|
8354
9760
|
* ElementRendererComponent: Angular port of the React `ElementRenderer.tsx`
|
|
@@ -8380,6 +9786,14 @@ declare class ElementRendererComponent {
|
|
|
8380
9786
|
* the viewer subtree (thumbnails, export) default to the SVG renderer.
|
|
8381
9787
|
*/
|
|
8382
9788
|
private readonly smartArt3DService;
|
|
9789
|
+
/**
|
|
9790
|
+
* Native-animation playback (present only inside a running presentation, which
|
|
9791
|
+
* provides {@link AnimationPlaybackService} at the overlay level). Optional so
|
|
9792
|
+
* the same renderer in the editor / thumbnails / export resolves to `null` and
|
|
9793
|
+
* renders with no animation state. Mirrors the Vue `injectPresentationElementStates`
|
|
9794
|
+
* provide/inject and React's threaded `presentationElementStates` prop.
|
|
9795
|
+
*/
|
|
9796
|
+
private readonly playback;
|
|
8383
9797
|
private readonly translate;
|
|
8384
9798
|
readonly smartArt3D: _angular_core.Signal<boolean>;
|
|
8385
9799
|
/** Obstacle rects (absolute slide coords) for connector A* routing. */
|
|
@@ -8417,6 +9831,12 @@ declare class ElementRendererComponent {
|
|
|
8417
9831
|
* no effect at all when false, so default rendering is untouched.
|
|
8418
9832
|
*/
|
|
8419
9833
|
readonly editTemplateMode: _angular_core.InputSignal<boolean>;
|
|
9834
|
+
/**
|
|
9835
|
+
* The enclosing group's fill (`GroupPptxElement.groupFill`), passed down by
|
|
9836
|
+
* the group render branch so a child painted with `a:grpFill`
|
|
9837
|
+
* (`fillMode === 'group'`) inherits the group's resolved fill.
|
|
9838
|
+
*/
|
|
9839
|
+
readonly parentGroupFill: _angular_core.InputSignal<ShapeStyle | undefined>;
|
|
8420
9840
|
/** Emitted when a table cell's text edit is committed. */
|
|
8421
9841
|
readonly cellCommit: _angular_core.OutputEmitterRef<{
|
|
8422
9842
|
id: string;
|
|
@@ -8429,12 +9849,30 @@ declare class ElementRendererComponent {
|
|
|
8429
9849
|
}>;
|
|
8430
9850
|
/** Duotone SVG `<filter>` descriptor for this element, if any. */
|
|
8431
9851
|
readonly duotoneFilter: _angular_core.Signal<pptx_angular_viewer.DuotoneFilterDef | undefined>;
|
|
9852
|
+
/**
|
|
9853
|
+
* Soft-edge feather `<filter>` descriptor (id + radius). The template injects
|
|
9854
|
+
* a matching `<filter>` into a hidden `<defs>` so the `filter:
|
|
9855
|
+
* url(#soft-edge-<id>)` reference on the shape resolves. Undefined otherwise.
|
|
9856
|
+
*/
|
|
9857
|
+
readonly softEdgeFilter: _angular_core.Signal<SoftEdgeFilterDef | undefined>;
|
|
9858
|
+
/**
|
|
9859
|
+
* DAG fill-overlay tint (colour + blend mode) painted as a separate blended
|
|
9860
|
+
* layer over the shape. Undefined when the element has no fill overlay.
|
|
9861
|
+
*/
|
|
9862
|
+
readonly fillOverlay: _angular_core.Signal<FillOverlayCss | undefined>;
|
|
8432
9863
|
/**
|
|
8433
9864
|
* Outline ring + slight transparency applied to inherited template
|
|
8434
9865
|
* (master/layout) elements while editTemplateMode is on. Empty otherwise, so
|
|
8435
9866
|
* normal rendering is never altered.
|
|
8436
9867
|
*/
|
|
8437
9868
|
readonly templateAffordanceStyle: _angular_core.Signal<StyleMap>;
|
|
9869
|
+
/**
|
|
9870
|
+
* This element's native-animation playback state, or `undefined` outside a
|
|
9871
|
+
* running presentation. Drives the staged chart / SmartArt build reveal and the
|
|
9872
|
+
* `p:animClr` fill / stroke relinquish (threaded to the chart / SmartArt /
|
|
9873
|
+
* connector renderers), mirroring React's per-element `animationState`.
|
|
9874
|
+
*/
|
|
9875
|
+
readonly animationState: _angular_core.Signal<ElementAnimationState | undefined>;
|
|
8438
9876
|
readonly containerStyle: _angular_core.Signal<StyleMap>;
|
|
8439
9877
|
readonly shapeContainerStyle: _angular_core.Signal<StyleMap>;
|
|
8440
9878
|
readonly textStyle: _angular_core.Signal<StyleMap>;
|
|
@@ -8451,13 +9889,20 @@ declare class ElementRendererComponent {
|
|
|
8451
9889
|
*/
|
|
8452
9890
|
readonly warpedTextStyle: _angular_core.Signal<StyleMap>;
|
|
8453
9891
|
readonly children: _angular_core.Signal<PptxElement[]>;
|
|
9892
|
+
/**
|
|
9893
|
+
* This group's own fill, handed to `a:grpFill` children as their
|
|
9894
|
+
* `parentGroupFill`. Undefined for non-group elements. Mirrors the shared
|
|
9895
|
+
* `getGroupChildParentFill` helper (inlined here so the Angular binding does
|
|
9896
|
+
* not depend on a shared symbol that is only vendored at build time).
|
|
9897
|
+
*/
|
|
9898
|
+
readonly childParentGroupFill: _angular_core.Signal<ShapeStyle | undefined>;
|
|
8454
9899
|
readonly isShapeLike: _angular_core.Signal<boolean>;
|
|
8455
9900
|
readonly isImageLike: _angular_core.Signal<boolean>;
|
|
8456
9901
|
readonly paragraphs: _angular_core.Signal<Paragraph[]>;
|
|
8457
9902
|
readonly hasText: _angular_core.Signal<boolean>;
|
|
8458
9903
|
readonly placeholderLabel: _angular_core.Signal<any>;
|
|
8459
9904
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementRendererComponent, never>;
|
|
8460
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementRendererComponent, "pptx-element-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "fieldContext": { "alias": "fieldContext"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; }, { "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
|
|
9905
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementRendererComponent, "pptx-element-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "fieldContext": { "alias": "fieldContext"; "required": false; "isSignal": true; }; "editTemplateMode": { "alias": "editTemplateMode"; "required": false; "isSignal": true; }; "parentGroupFill": { "alias": "parentGroupFill"; "required": false; "isSignal": true; }; }, { "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, never, true, never>;
|
|
8461
9906
|
}
|
|
8462
9907
|
|
|
8463
9908
|
/**
|
|
@@ -8492,9 +9937,22 @@ declare class ConnectorRendererComponent {
|
|
|
8492
9937
|
readonly canvasHeight: _angular_core.InputSignal<number>;
|
|
8493
9938
|
/** See ElementRenderer.interactive: gates the data-pptx-element contract attr. */
|
|
8494
9939
|
readonly interactive: _angular_core.InputSignal<boolean>;
|
|
9940
|
+
/**
|
|
9941
|
+
* Native-animation playback state. When an active `p:animClr` colour animation
|
|
9942
|
+
* targets the stroke (`animatesStroke`), the SVG stroke + arrowheads paint
|
|
9943
|
+
* `inherit` so the wrapper's animated `stroke` keyframes cascade in. Absent
|
|
9944
|
+
* outside a running presentation.
|
|
9945
|
+
*/
|
|
9946
|
+
readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
|
|
8495
9947
|
/** All derived geometry, recomputed on every input change. */
|
|
8496
9948
|
readonly geo: _angular_core.Signal<ConnectorGeometry>;
|
|
8497
9949
|
readonly viewBox: _angular_core.Signal<string>;
|
|
9950
|
+
/**
|
|
9951
|
+
* Stroke paint for the line + arrowheads: `inherit` while a `p:animClr` stroke
|
|
9952
|
+
* colour animation is active (so the wrapper keyframes own it), else the
|
|
9953
|
+
* geometry's resolved stroke colour.
|
|
9954
|
+
*/
|
|
9955
|
+
readonly strokeColor: _angular_core.Signal<string>;
|
|
8498
9956
|
private readonly shapeStyle;
|
|
8499
9957
|
readonly lineShadow: _angular_core.Signal<LineShadowParams | undefined>;
|
|
8500
9958
|
readonly lineGlow: _angular_core.Signal<string | undefined>;
|
|
@@ -8512,7 +9970,7 @@ declare class ConnectorRendererComponent {
|
|
|
8512
9970
|
readonly connectorSegments: _angular_core.Signal<TextSegment[] | undefined>;
|
|
8513
9971
|
readonly connectorTextStyle: _angular_core.Signal<TextStyle | undefined>;
|
|
8514
9972
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConnectorRendererComponent, never>;
|
|
8515
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConnectorRendererComponent, "pptx-connector-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
9973
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConnectorRendererComponent, "pptx-connector-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "obstacles": { "alias": "obstacles"; "required": false; "isSignal": true; }; "canvasWidth": { "alias": "canvasWidth"; "required": false; "isSignal": true; }; "canvasHeight": { "alias": "canvasHeight"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
8516
9974
|
}
|
|
8517
9975
|
/** One parallel stroke of a (possibly compound) connector line. */
|
|
8518
9976
|
interface ConnectorStrand {
|
|
@@ -8610,6 +10068,13 @@ declare class ChartElementViewComponent {
|
|
|
8610
10068
|
* editing additionally requires the element to be SELECTED ({@link canEdit}).
|
|
8611
10069
|
*/
|
|
8612
10070
|
readonly editable: _angular_core.InputSignal<boolean>;
|
|
10071
|
+
/**
|
|
10072
|
+
* Native-animation playback state. When it carries a staged chart build
|
|
10073
|
+
* (`build.kind === 'chart'`) the chart reveals its series / categories / cells
|
|
10074
|
+
* progressively via the shared `applyChartBuildReveal`. Absent outside a
|
|
10075
|
+
* running presentation, so ordinary rendering is unaffected.
|
|
10076
|
+
*/
|
|
10077
|
+
readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
|
|
8613
10078
|
/**
|
|
8614
10079
|
* The editor state layer. Optional: the renderer is also used outside the
|
|
8615
10080
|
* editing viewer (thumbnails, export). On-canvas chart edits commit through
|
|
@@ -8639,7 +10104,12 @@ declare class ChartElementViewComponent {
|
|
|
8639
10104
|
protected readonly canEdit: _angular_core.Signal<boolean>;
|
|
8640
10105
|
/** VM of the COMMITTED data: drag geometry must not rescale mid-drag. */
|
|
8641
10106
|
private readonly viewModel;
|
|
8642
|
-
/**
|
|
10107
|
+
/**
|
|
10108
|
+
* The element to render: committed data, or the local drag preview, with its
|
|
10109
|
+
* data trimmed to the stages revealed at the current staged-build progress (the
|
|
10110
|
+
* drag preview wins first). Whole-chart / no-build renders return the element
|
|
10111
|
+
* unchanged. Mirrors the Vue `ChartRenderer`'s `revealedElement`.
|
|
10112
|
+
*/
|
|
8643
10113
|
protected readonly renderedElement: _angular_core.Signal<PptxElement>;
|
|
8644
10114
|
protected readonly dragBadge: _angular_core.Signal<string>;
|
|
8645
10115
|
/** The part selected for THIS chart, or null. */
|
|
@@ -8656,7 +10126,7 @@ declare class ChartElementViewComponent {
|
|
|
8656
10126
|
protected onTitleKeydown(event: KeyboardEvent): void;
|
|
8657
10127
|
protected commitTitle(): void;
|
|
8658
10128
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChartElementViewComponent, never>;
|
|
8659
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartElementViewComponent, "pptx-chart-element-view", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
10129
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChartElementViewComponent, "pptx-chart-element-view", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
8660
10130
|
}
|
|
8661
10131
|
|
|
8662
10132
|
/**
|
|
@@ -8818,6 +10288,14 @@ declare class SmartArtRendererComponent {
|
|
|
8818
10288
|
* `editable` input). Double-clicking a node only enters edit mode when true.
|
|
8819
10289
|
*/
|
|
8820
10290
|
readonly editable: _angular_core.InputSignal<boolean>;
|
|
10291
|
+
/**
|
|
10292
|
+
* Native-animation playback state. A staged diagram build
|
|
10293
|
+
* (`build.kind === 'diagram'`) reveals the leading nodes / drawing shapes for
|
|
10294
|
+
* the current progress; absent or non-diagram state renders every node. The
|
|
10295
|
+
* view box is still computed from the FULL shape set so the diagram does not
|
|
10296
|
+
* rescale as it builds. Mirrors the Vue `SmartArtRenderer`'s reveal slice.
|
|
10297
|
+
*/
|
|
10298
|
+
readonly animationState: _angular_core.InputSignal<ElementAnimationState | undefined>;
|
|
8821
10299
|
/**
|
|
8822
10300
|
* The editor state layer. Optional: the renderer is also used outside the
|
|
8823
10301
|
* editing viewer (thumbnails, export), where this service is not provided.
|
|
@@ -8860,6 +10338,13 @@ declare class SmartArtRendererComponent {
|
|
|
8860
10338
|
readonly shadowFilter: _angular_core.Signal<string | undefined>;
|
|
8861
10339
|
private readonly rawDrawingShapes;
|
|
8862
10340
|
readonly hasDrawingShapes: _angular_core.Signal<boolean>;
|
|
10341
|
+
private readonly diagramBuild;
|
|
10342
|
+
private readonly shownNodeCount;
|
|
10343
|
+
private readonly isPartialBuild;
|
|
10344
|
+
/** Leading node prefix revealed so far (full list when no partial build). */
|
|
10345
|
+
private readonly revealedNodes;
|
|
10346
|
+
/** Leading drawing-shape prefix revealed so far (proportional to nodes). */
|
|
10347
|
+
private readonly revealedShapeList;
|
|
8863
10348
|
private readonly viewBox;
|
|
8864
10349
|
/** `viewBox` attribute string for the drawing-shapes `<svg>`. */
|
|
8865
10350
|
readonly svgViewBox: _angular_core.Signal<string>;
|
|
@@ -8934,7 +10419,7 @@ declare class SmartArtRendererComponent {
|
|
|
8934
10419
|
private reflow;
|
|
8935
10420
|
readonly isEmpty: _angular_core.Signal<boolean>;
|
|
8936
10421
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SmartArtRendererComponent, never>;
|
|
8937
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartArtRendererComponent, "pptx-smart-art-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
10422
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartArtRendererComponent, "pptx-smart-art-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
8938
10423
|
}
|
|
8939
10424
|
|
|
8940
10425
|
/**
|
|
@@ -9384,74 +10869,50 @@ declare class ZoomRendererComponent {
|
|
|
9384
10869
|
|
|
9385
10870
|
declare class AnimationPlaybackService {
|
|
9386
10871
|
private readonly destroyRef;
|
|
9387
|
-
/**
|
|
9388
|
-
|
|
9389
|
-
|
|
9390
|
-
|
|
9391
|
-
|
|
9392
|
-
|
|
9393
|
-
|
|
9394
|
-
|
|
9395
|
-
|
|
9396
|
-
|
|
9397
|
-
|
|
9398
|
-
|
|
9399
|
-
|
|
9400
|
-
private
|
|
9401
|
-
|
|
9402
|
-
|
|
9403
|
-
|
|
9404
|
-
readonly groupCount: _angular_core.Signal<number>;
|
|
9405
|
-
/**
|
|
9406
|
-
* The current playback step: how many click groups have been revealed.
|
|
9407
|
-
* Always clamped to the current group count. The manual override wins;
|
|
9408
|
-
* otherwise it follows the external index, defaulting to 0.
|
|
9409
|
-
*/
|
|
9410
|
-
readonly step: _angular_core.Signal<number>;
|
|
9411
|
-
/** True when every click group has been revealed. */
|
|
9412
|
-
readonly isComplete: _angular_core.Signal<boolean>;
|
|
9413
|
-
/**
|
|
9414
|
-
* Reactive map of `elementId → CSS properties` to apply for the current step.
|
|
9415
|
-
* Only elements in revealed click groups appear.
|
|
9416
|
-
*/
|
|
9417
|
-
readonly elementStyles: _angular_core.Signal<Map<string, CSSProperties>>;
|
|
9418
|
-
/**
|
|
9419
|
-
* Reactive map of `elementId → CSS properties` for elements whose entrance
|
|
9420
|
-
* has not yet been revealed (they should be hidden so they don't flash
|
|
9421
|
-
* visible before their group plays).
|
|
9422
|
-
*/
|
|
9423
|
-
readonly pendingStyles: _angular_core.Signal<Map<string, CSSProperties>>;
|
|
9424
|
-
/** Handle of the scheduled rAF auto-advance, or null when idle. */
|
|
9425
|
-
private rafHandle;
|
|
10872
|
+
/** Per-element native-animation state, keyed by element id. */
|
|
10873
|
+
readonly presentationElementStates: _angular_core.WritableSignal<Map<string, ElementAnimationState>>;
|
|
10874
|
+
/** The `@keyframes` CSS to inject once per slide. */
|
|
10875
|
+
readonly keyframesCss: _angular_core.WritableSignal<string>;
|
|
10876
|
+
/** Shape ids that trigger an interactive (`onShapeClick`) sequence. */
|
|
10877
|
+
readonly interactiveTriggerShapeIds: _angular_core.WritableSignal<ReadonlySet<string>>;
|
|
10878
|
+
/** Shape ids that trigger a hover (`onHover`) sequence. */
|
|
10879
|
+
readonly hoverTriggerShapeIds: _angular_core.WritableSignal<ReadonlySet<string>>;
|
|
10880
|
+
/** True when the main timeline has no more click-groups to reveal. */
|
|
10881
|
+
readonly isComplete: _angular_core.WritableSignal<boolean>;
|
|
10882
|
+
private controller;
|
|
10883
|
+
private readonly timers;
|
|
10884
|
+
private readonly buildHandle;
|
|
10885
|
+
private showWithAnimation;
|
|
10886
|
+
private frameRoot;
|
|
10887
|
+
private onPlayActionSound;
|
|
10888
|
+
private readonly ctx;
|
|
9426
10889
|
constructor();
|
|
9427
|
-
/**
|
|
9428
|
-
|
|
9429
|
-
/**
|
|
9430
|
-
|
|
9431
|
-
|
|
9432
|
-
|
|
9433
|
-
|
|
9434
|
-
|
|
9435
|
-
*/
|
|
9436
|
-
advance(): boolean;
|
|
9437
|
-
/** Reveal every click group at once (jump to the slide's final state). */
|
|
9438
|
-
play(): void;
|
|
9439
|
-
/** Reset playback to before the first click group. */
|
|
9440
|
-
reset(): void;
|
|
10890
|
+
/** Scope media-command (`p:cmd`) target lookups to a stage root element. */
|
|
10891
|
+
setFrameRoot(root: () => HTMLElement | null): void;
|
|
10892
|
+
/** Register a host-provided action-sound player (embedded-sound resolution). */
|
|
10893
|
+
setActionSoundHandler(handler: ((soundPath: string) => void) | undefined): void;
|
|
10894
|
+
private animationsEnabled;
|
|
10895
|
+
/** Clear all pending timers + the in-flight staged-build RAF. */
|
|
10896
|
+
clearTimers(): void;
|
|
10897
|
+
private syncComplete;
|
|
9441
10898
|
/**
|
|
9442
|
-
*
|
|
9443
|
-
*
|
|
10899
|
+
* Rebuild the controller for `slide` and seed the initial element state
|
|
10900
|
+
* (entrance-animated elements start hidden). Auto-plays the first click-group
|
|
10901
|
+
* when the slide opens with a withPrevious / afterPrevious / afterDelay build.
|
|
9444
10902
|
*/
|
|
9445
|
-
|
|
10903
|
+
setSlide(slide: PptxSlide | undefined, showWithAnimation?: boolean): void;
|
|
9446
10904
|
/**
|
|
9447
|
-
*
|
|
9448
|
-
*
|
|
9449
|
-
*
|
|
9450
|
-
* `requestAnimationFrame` is unavailable (SSR).
|
|
10905
|
+
* Reveal the next click-group. Returns `true` if a group was revealed, `false`
|
|
10906
|
+
* when playback is complete or animations are disabled (so the caller can fall
|
|
10907
|
+
* through to slide navigation).
|
|
9451
10908
|
*/
|
|
9452
|
-
|
|
9453
|
-
/**
|
|
9454
|
-
|
|
10909
|
+
advance(): boolean;
|
|
10910
|
+
/** Play an interactive shape's sequence; `true` when it triggered one. */
|
|
10911
|
+
handleInteractiveShapeClick(shapeId: string): boolean;
|
|
10912
|
+
/** Play a hover shape's sequence; `true` when it triggered one. */
|
|
10913
|
+
handleHoverStart(shapeId: string): boolean;
|
|
10914
|
+
/** Reset a hover shape's sequence so the next hover replays it. */
|
|
10915
|
+
handleHoverEnd(shapeId: string): void;
|
|
9455
10916
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AnimationPlaybackService, never>;
|
|
9456
10917
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AnimationPlaybackService>;
|
|
9457
10918
|
}
|
|
@@ -9682,13 +11143,34 @@ declare class PresentationOverlayComponent implements OnInit {
|
|
|
9682
11143
|
* both fire for one tap.
|
|
9683
11144
|
*/
|
|
9684
11145
|
private closing;
|
|
11146
|
+
/**
|
|
11147
|
+
* Managed per-slide keyframes `<style>` element (colour animations + staged
|
|
11148
|
+
* text builds). The static preset keyframe library is injected once per
|
|
11149
|
+
* document by {@link ensurePresetAnimationKeyframes}.
|
|
11150
|
+
*/
|
|
11151
|
+
private readonly slideKeyframes;
|
|
11152
|
+
/** The hover-trigger shape the pointer is currently over (fires a sequence once). */
|
|
11153
|
+
private currentHoverTriggerId;
|
|
9685
11154
|
constructor();
|
|
9686
11155
|
/**
|
|
9687
|
-
* Imperatively apply
|
|
9688
|
-
*
|
|
9689
|
-
*
|
|
11156
|
+
* Imperatively apply each tracked element's native-animation state to its DOM
|
|
11157
|
+
* wrapper: visibility (entrance hide-until-revealed / exit), the CSS-animation
|
|
11158
|
+
* shorthand (entrance / emphasis / exit / colour keyframes), and a pointer
|
|
11159
|
+
* cursor on interactive / hover trigger shapes. Mirrors the Vue
|
|
11160
|
+
* `applyAnimationStyles`; every renderer emits a `data-element-id`, so this
|
|
11161
|
+
* needs no per-element renderer plumbing.
|
|
9690
11162
|
*/
|
|
9691
11163
|
private applyAnimationStyles;
|
|
11164
|
+
/** Resolve the nearest element id above a pointer target, if any. */
|
|
11165
|
+
private closestElementId;
|
|
11166
|
+
/**
|
|
11167
|
+
* Pointer moved over the stage: (re)play a hover-trigger shape's sequence once
|
|
11168
|
+
* on entering it (not on every descendant transition that `mouseover` bubbles
|
|
11169
|
+
* up), resetting the previous trigger on leaving it.
|
|
11170
|
+
*/
|
|
11171
|
+
protected onStageHover(event: MouseEvent): void;
|
|
11172
|
+
/** Pointer left the stage subtree entirely: reset any active hover trigger. */
|
|
11173
|
+
protected onStageHoverEnd(event: MouseEvent): void;
|
|
9692
11174
|
/** Viewport dimensions, updated on resize. */
|
|
9693
11175
|
private readonly viewportW;
|
|
9694
11176
|
private readonly viewportH;
|
|
@@ -10045,9 +11527,12 @@ declare class PresentationSettingsCardComponent {
|
|
|
10045
11527
|
private readonly loader;
|
|
10046
11528
|
private readonly editor;
|
|
10047
11529
|
protected readonly props: _angular_core.WritableSignal<PptxPresentationProperties>;
|
|
11530
|
+
protected readonly frameSlides: _angular_core.Signal<boolean>;
|
|
11531
|
+
protected readonly slidesPerPage: _angular_core.Signal<number>;
|
|
10048
11532
|
private patch;
|
|
10049
11533
|
protected onShowTypeChange(event: Event): void;
|
|
10050
|
-
protected onCheckbox(event: Event, key: 'loopContinuously' | 'showWithNarration' | 'showWithAnimation'
|
|
11534
|
+
protected onCheckbox(event: Event, key: 'loopContinuously' | 'showWithNarration' | 'showWithAnimation'): void;
|
|
11535
|
+
protected onFrameSlidesChange(event: Event): void;
|
|
10051
11536
|
protected onSlidesPerPageChange(event: Event): void;
|
|
10052
11537
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PresentationSettingsCardComponent, never>;
|
|
10053
11538
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationSettingsCardComponent, "pptx-presentation-settings-card", never, { "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
@@ -10184,7 +11669,7 @@ declare class TextAdvancedPanelComponent {
|
|
|
10184
11669
|
/** Exposed option arrays for the template. */
|
|
10185
11670
|
protected readonly alignOptions: [NonNullable<"center" | "left" | "right" | "justify" | "justLow" | "dist" | "thaiDist" | undefined>, string][];
|
|
10186
11671
|
protected readonly vAlignOptions: [NonNullable<"top" | "bottom" | "middle" | undefined>, string][];
|
|
10187
|
-
protected readonly textDirectionOptions: [NonNullable<"
|
|
11672
|
+
protected readonly textDirectionOptions: [NonNullable<"vertical" | "horizontal" | "eaVert" | "wordArtVert" | "wordArtVertRtl" | "mongolianVert" | "vertical270" | undefined>, string][];
|
|
10188
11673
|
protected alignLabel(align: NonNullable<TextStyle['align']>): string;
|
|
10189
11674
|
protected onAlignChange(align: NonNullable<TextStyle['align']>): void;
|
|
10190
11675
|
protected onVAlignChange(event: Event): void;
|
|
@@ -10926,21 +12411,29 @@ declare class MobileToolbarComponent {
|
|
|
10926
12411
|
readonly canEdit: _angular_core.InputSignal<boolean>;
|
|
10927
12412
|
/** Whether the mobile-menu sheet is currently open (highlights the button). */
|
|
10928
12413
|
readonly menuOpen: _angular_core.InputSignal<boolean>;
|
|
12414
|
+
/** Whether the host opted into the AI assistant (shows the top-right toggle). */
|
|
12415
|
+
readonly aiEnabled: _angular_core.InputSignal<boolean>;
|
|
12416
|
+
/** Whether the AI assistant panel is currently open (highlights the button). */
|
|
12417
|
+
readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
|
|
10929
12418
|
/** Toolbar buttons the host wants hidden (gates Undo/Redo independently). */
|
|
10930
12419
|
readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
|
|
10931
12420
|
/** User tapped the Menu (hamburger) button. */
|
|
10932
12421
|
readonly toggleMenu: _angular_core.OutputEmitterRef<void>;
|
|
12422
|
+
/** User tapped the AI assistant toggle. */
|
|
12423
|
+
readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
|
|
10933
12424
|
/** User tapped Undo. */
|
|
10934
12425
|
readonly undo: _angular_core.OutputEmitterRef<void>;
|
|
10935
12426
|
/** User tapped Redo. */
|
|
10936
12427
|
readonly redo: _angular_core.OutputEmitterRef<void>;
|
|
12428
|
+
/** User tapped Share (opens the collaboration share dialog). */
|
|
12429
|
+
readonly share: _angular_core.OutputEmitterRef<void>;
|
|
10937
12430
|
/** User tapped Save (download as .pptx). */
|
|
10938
12431
|
readonly save: _angular_core.OutputEmitterRef<void>;
|
|
10939
12432
|
/** User tapped Present. */
|
|
10940
12433
|
readonly present: _angular_core.OutputEmitterRef<void>;
|
|
10941
12434
|
protected readonly toolbar: ToolbarVisibility;
|
|
10942
12435
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileToolbarComponent, never>;
|
|
10943
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileToolbarComponent, "pptx-mobile-toolbar", never, { "canUndo": { "alias": "canUndo"; "required": false; "isSignal": true; }; "canRedo": { "alias": "canRedo"; "required": false; "isSignal": true; }; "canPresent": { "alias": "canPresent"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "menuOpen": { "alias": "menuOpen"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleMenu": "toggleMenu"; "undo": "undo"; "redo": "redo"; "save": "save"; "present": "present"; }, never, never, true, never>;
|
|
12436
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileToolbarComponent, "pptx-mobile-toolbar", never, { "canUndo": { "alias": "canUndo"; "required": false; "isSignal": true; }; "canRedo": { "alias": "canRedo"; "required": false; "isSignal": true; }; "canPresent": { "alias": "canPresent"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "menuOpen": { "alias": "menuOpen"; "required": false; "isSignal": true; }; "aiEnabled": { "alias": "aiEnabled"; "required": false; "isSignal": true; }; "aiPanelOpen": { "alias": "aiPanelOpen"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleMenu": "toggleMenu"; "toggleAiPanel": "toggleAiPanel"; "undo": "undo"; "redo": "redo"; "share": "share"; "save": "save"; "present": "present"; }, never, never, true, never>;
|
|
10944
12437
|
}
|
|
10945
12438
|
|
|
10946
12439
|
declare class NotesPanelComponent {
|
|
@@ -11109,7 +12602,7 @@ declare class StatusBarComponent {
|
|
|
11109
12602
|
/** Relative age label for a saved timestamp ("just now" / "N min ago"). */
|
|
11110
12603
|
private formatAutosaveAge;
|
|
11111
12604
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusBarComponent, never>;
|
|
11112
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusBarComponent, "pptx-status-bar", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "autosaveStatus": { "alias": "autosaveStatus"; "required": false; "isSignal": true; }; "notesOpen": { "alias": "notesOpen"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "sorterActive": { "alias": "sorterActive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleNotes": "toggleNotes"; "normalView": "normalView"; "openSorter": "openSorter"; "slideShow": "slideShow"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; }, never,
|
|
12605
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusBarComponent, "pptx-status-bar", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "autosaveStatus": { "alias": "autosaveStatus"; "required": false; "isSignal": true; }; "notesOpen": { "alias": "notesOpen"; "required": false; "isSignal": true; }; "zoomPercent": { "alias": "zoomPercent"; "required": false; "isSignal": true; }; "sorterActive": { "alias": "sorterActive"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleNotes": "toggleNotes"; "normalView": "normalView"; "openSorter": "openSorter"; "slideShow": "slideShow"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "zoomReset": "zoomReset"; }, never, ["[pptxCollabStatus]"], true, never>;
|
|
11113
12606
|
}
|
|
11114
12607
|
|
|
11115
12608
|
declare class EditorContextMenuComponent {
|
|
@@ -11119,8 +12612,17 @@ declare class EditorContextMenuComponent {
|
|
|
11119
12612
|
readonly y: _angular_core.InputSignal<number>;
|
|
11120
12613
|
/** Zero-based index of the slide being edited. */
|
|
11121
12614
|
readonly slideIndex: _angular_core.InputSignal<number>;
|
|
12615
|
+
/**
|
|
12616
|
+
* Whether to show the "Ask AI about this" / "Fix with AI" items. Gated by the
|
|
12617
|
+
* host on the `ai` config + a single selected element.
|
|
12618
|
+
*/
|
|
12619
|
+
readonly showAiActions: _angular_core.InputSignal<boolean>;
|
|
11122
12620
|
/** Emitted when the menu should close (Escape or outside click). */
|
|
11123
12621
|
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
12622
|
+
/** "Ask AI about this": open the assistant scoped to the selection. */
|
|
12623
|
+
readonly askAi: _angular_core.OutputEmitterRef<void>;
|
|
12624
|
+
/** "Fix with AI": open the assistant with a prefilled fix directive. */
|
|
12625
|
+
readonly fixAi: _angular_core.OutputEmitterRef<void>;
|
|
11124
12626
|
protected readonly editor: EditorStateService;
|
|
11125
12627
|
private readonly tableSelection;
|
|
11126
12628
|
private readonly host;
|
|
@@ -11135,6 +12637,8 @@ declare class EditorContextMenuComponent {
|
|
|
11135
12637
|
} | null>;
|
|
11136
12638
|
onEscape(): void;
|
|
11137
12639
|
onDocumentPointerDown(event: PointerEvent): void;
|
|
12640
|
+
protected onAskAi(): void;
|
|
12641
|
+
protected onFixAi(): void;
|
|
11138
12642
|
protected onCut(): void;
|
|
11139
12643
|
protected onCopy(): void;
|
|
11140
12644
|
protected onPaste(): void;
|
|
@@ -11160,7 +12664,7 @@ declare class EditorContextMenuComponent {
|
|
|
11160
12664
|
*/
|
|
11161
12665
|
private applyTable;
|
|
11162
12666
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EditorContextMenuComponent, never>;
|
|
11163
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EditorContextMenuComponent, "pptx-editor-context-menu", never, { "x": { "alias": "x"; "required": true; "isSignal": true; }; "y": { "alias": "y"; "required": true; "isSignal": true; }; "slideIndex": { "alias": "slideIndex"; "required": true; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
|
|
12667
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EditorContextMenuComponent, "pptx-editor-context-menu", never, { "x": { "alias": "x"; "required": true; "isSignal": true; }; "y": { "alias": "y"; "required": true; "isSignal": true; }; "slideIndex": { "alias": "slideIndex"; "required": true; "isSignal": true; }; "showAiActions": { "alias": "showAiActions"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "askAi": "askAi"; "fixAi": "fixAi"; }, never, never, true, never>;
|
|
11164
12668
|
}
|
|
11165
12669
|
|
|
11166
12670
|
/**
|
|
@@ -11823,35 +13327,20 @@ declare class PropertiesDialogComponent {
|
|
|
11823
13327
|
}
|
|
11824
13328
|
|
|
11825
13329
|
/**
|
|
11826
|
-
* share-helpers.ts:
|
|
13330
|
+
* share-helpers.ts: Share dialog helpers for the Angular viewer.
|
|
11827
13331
|
*
|
|
11828
|
-
*
|
|
11829
|
-
*
|
|
13332
|
+
* The shared subset (ShareFormFields / ShareDefaults / seedShareFields /
|
|
13333
|
+
* canStartShare) is re-exported from `pptx-viewer-shared` (`render/share-form`).
|
|
13334
|
+
* Two helpers stay local because they diverge from the shared builders:
|
|
13335
|
+
* - `buildCollaborationConfig` validates with `canStartShare` (non-blank room)
|
|
13336
|
+
* and emits a config WITHOUT `role`/`sessionIntent`, unlike the shared
|
|
13337
|
+
* `buildShareConfig` (which is `buildCreateCollaborationConfig`).
|
|
13338
|
+
* - `buildShareUrl` is Angular-only (no other binding builds a share link).
|
|
11830
13339
|
*
|
|
11831
13340
|
* No `any`; all regexes use the `/u` flag; no `String.prototype.replaceAll`,
|
|
11832
13341
|
* no regex named-capture-groups (ng-packagr lib-target constraints).
|
|
11833
13342
|
*/
|
|
11834
13343
|
|
|
11835
|
-
/** Prefilled values for the Share form fields. */
|
|
11836
|
-
interface ShareDefaults {
|
|
11837
|
-
roomId?: string;
|
|
11838
|
-
userName?: string;
|
|
11839
|
-
serverUrl?: string;
|
|
11840
|
-
}
|
|
11841
|
-
/** The Share form's editable fields. */
|
|
11842
|
-
interface ShareFormFields {
|
|
11843
|
-
roomId: string;
|
|
11844
|
-
userName: string;
|
|
11845
|
-
serverUrl: string;
|
|
11846
|
-
}
|
|
11847
|
-
/** Seed the form fields from the (optional) defaults, coercing absent values. */
|
|
11848
|
-
declare function seedShareFields(defaults?: ShareDefaults): ShareFormFields;
|
|
11849
|
-
/**
|
|
11850
|
-
* Whether the required fields are non-blank (after trimming). The server URL is
|
|
11851
|
-
* optional: a blank server selects the serverless (webrtc) peer-to-peer
|
|
11852
|
-
* transport, so only the room id and display name are required.
|
|
11853
|
-
*/
|
|
11854
|
-
declare function canStartShare(fields: ShareFormFields): boolean;
|
|
11855
13344
|
/**
|
|
11856
13345
|
* Assemble a {@link CollaborationConfig} from the (trimmed) form fields, or
|
|
11857
13346
|
* `null` when the form is incomplete. A blank server URL yields
|
|
@@ -11871,7 +13360,7 @@ declare class ShareDialogComponent {
|
|
|
11871
13360
|
/** Whether the dialog is visible. */
|
|
11872
13361
|
readonly open: _angular_core.InputSignal<boolean>;
|
|
11873
13362
|
/** Prefilled values for the form fields. */
|
|
11874
|
-
readonly defaults: _angular_core.InputSignal<ShareDefaults | undefined>;
|
|
13363
|
+
readonly defaults: _angular_core.InputSignal<ShareDefaults$1 | undefined>;
|
|
11875
13364
|
/** Whether a collaboration session is currently active (provider constructed). */
|
|
11876
13365
|
readonly active: _angular_core.InputSignal<boolean>;
|
|
11877
13366
|
/** Whether the websocket has reported a `connected` status. */
|
|
@@ -11987,6 +13476,8 @@ declare class ViewerExtraDialogsComponent {
|
|
|
11987
13476
|
readonly availableThemes: _angular_core.InputSignal<readonly ThemeCatalogEntry[]>;
|
|
11988
13477
|
readonly localeCode: _angular_core.InputSignal<string>;
|
|
11989
13478
|
readonly availableLocales: _angular_core.InputSignal<readonly LocaleCatalogEntry[]>;
|
|
13479
|
+
/** Whether the Settings dialog shows the bespoke AI chat-log export category. */
|
|
13480
|
+
readonly aiExportVisible: _angular_core.InputSignal<boolean>;
|
|
11990
13481
|
/** Fired with a restored `.pptx` version's bytes; the host swaps the deck. */
|
|
11991
13482
|
readonly restoreContent: _angular_core.OutputEmitterRef<Uint8Array<ArrayBufferLike>>;
|
|
11992
13483
|
readonly themeKeySelect: _angular_core.OutputEmitterRef<string>;
|
|
@@ -12028,7 +13519,7 @@ declare class ViewerExtraDialogsComponent {
|
|
|
12028
13519
|
/** Clear any save password. */
|
|
12029
13520
|
onRemovePassword(): void;
|
|
12030
13521
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewerExtraDialogsComponent, never>;
|
|
12031
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ViewerExtraDialogsComponent, "pptx-viewer-extra-dialogs", never, { "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; "selectedElementId": { "alias": "selectedElementId"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "customShows": { "alias": "customShows"; "required": false; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; }, { "restoreContent": "restoreContent"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; }, never, never, true, never>;
|
|
13522
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ViewerExtraDialogsComponent, "pptx-viewer-extra-dialogs", never, { "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; "selectedElementId": { "alias": "selectedElementId"; "required": false; "isSignal": true; }; "filePath": { "alias": "filePath"; "required": false; "isSignal": true; }; "customShows": { "alias": "customShows"; "required": false; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "aiExportVisible": { "alias": "aiExportVisible"; "required": false; "isSignal": true; }; }, { "restoreContent": "restoreContent"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; }, never, never, true, never>;
|
|
12032
13523
|
}
|
|
12033
13524
|
|
|
12034
13525
|
declare class EquationEditorDialogComponent {
|
|
@@ -12433,6 +13924,11 @@ declare class SettingsDialogComponent {
|
|
|
12433
13924
|
readonly availableLocales: _angular_core.InputSignal<readonly LocaleCatalogEntry[]>;
|
|
12434
13925
|
/** Availability flags for the Add-ins pane (unset ids default to active). */
|
|
12435
13926
|
readonly addinStatus: _angular_core.InputSignal<ViewerAddinStatus | undefined>;
|
|
13927
|
+
/**
|
|
13928
|
+
* Whether to show the bespoke "AI" category (chat-log export), gated by the
|
|
13929
|
+
* host on the `ai` config. Absent by default (no AI category).
|
|
13930
|
+
*/
|
|
13931
|
+
readonly aiExportVisible: _angular_core.InputSignal<boolean>;
|
|
12436
13932
|
readonly optionChange: _angular_core.OutputEmitterRef<OptionValueChange>;
|
|
12437
13933
|
/** Restore a snapshot wholesale (Cancel semantics). */
|
|
12438
13934
|
readonly restoreOptions: _angular_core.OutputEmitterRef<ViewerOptions>;
|
|
@@ -12445,7 +13941,8 @@ declare class SettingsDialogComponent {
|
|
|
12445
13941
|
readonly localeSelect: _angular_core.OutputEmitterRef<string>;
|
|
12446
13942
|
readonly close: _angular_core.OutputEmitterRef<void>;
|
|
12447
13943
|
protected readonly tabs: readonly ViewerOptionsTabDefinition[];
|
|
12448
|
-
|
|
13944
|
+
/** Active category id, or the bespoke `'ai'` sentinel for the AI export pane. */
|
|
13945
|
+
protected readonly activeTabId: _angular_core.WritableSignal<ViewerOptionsTabId | "ai">;
|
|
12449
13946
|
protected readonly activeTab: _angular_core.Signal<ViewerOptionsTabDefinition>;
|
|
12450
13947
|
/** Snapshot taken when the dialog opens, restored by Cancel. */
|
|
12451
13948
|
private snapshot;
|
|
@@ -12456,7 +13953,7 @@ declare class SettingsDialogComponent {
|
|
|
12456
13953
|
/** Escape confirms (keeps edits), mirroring React's dialog. */
|
|
12457
13954
|
protected onEscape(): void;
|
|
12458
13955
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SettingsDialogComponent, never>;
|
|
12459
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SettingsDialogComponent, "pptx-settings-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "addinStatus": { "alias": "addinStatus"; "required": false; "isSignal": true; }; }, { "optionChange": "optionChange"; "restoreOptions": "restoreOptions"; "ribbonTabHiddenChange": "ribbonTabHiddenChange"; "quickAccessCommandsChange": "quickAccessCommandsChange"; "resetOptions": "resetOptions"; "clearCache": "clearCache"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; "close": "close"; }, never, never, true, never>;
|
|
13956
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SettingsDialogComponent, "pptx-settings-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "themeKey": { "alias": "themeKey"; "required": false; "isSignal": true; }; "availableThemes": { "alias": "availableThemes"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; "availableLocales": { "alias": "availableLocales"; "required": false; "isSignal": true; }; "addinStatus": { "alias": "addinStatus"; "required": false; "isSignal": true; }; "aiExportVisible": { "alias": "aiExportVisible"; "required": false; "isSignal": true; }; }, { "optionChange": "optionChange"; "restoreOptions": "restoreOptions"; "ribbonTabHiddenChange": "ribbonTabHiddenChange"; "quickAccessCommandsChange": "quickAccessCommandsChange"; "resetOptions": "resetOptions"; "clearCache": "clearCache"; "themeKeySelect": "themeKeySelect"; "localeSelect": "localeSelect"; "close": "close"; }, never, never, true, never>;
|
|
12460
13957
|
}
|
|
12461
13958
|
|
|
12462
13959
|
declare class SettingsAppearanceTabComponent {
|
|
@@ -12481,7 +13978,7 @@ declare class AccountPageComponent {
|
|
|
12481
13978
|
readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
|
|
12482
13979
|
private readonly translate;
|
|
12483
13980
|
protected readonly swatches: readonly string[];
|
|
12484
|
-
protected readonly version = "
|
|
13981
|
+
protected readonly version = "2.0.0";
|
|
12485
13982
|
protected readonly profile: _angular_core.WritableSignal<ViewerProfile>;
|
|
12486
13983
|
protected readonly initial: _angular_core.Signal<string>;
|
|
12487
13984
|
protected readonly usage: _angular_core.WritableSignal<LocalStorageUsageSummary | null>;
|
|
@@ -12999,38 +14496,6 @@ interface PresenterNotes {
|
|
|
12999
14496
|
*/
|
|
13000
14497
|
declare function resolvePresenterNotes(slide: PptxSlide | undefined): PresenterNotes;
|
|
13001
14498
|
|
|
13002
|
-
/**
|
|
13003
|
-
* audience-content-store: IndexedDB-based storage for sharing PPTX content
|
|
13004
|
-
* between the presenter tab and audience tab.
|
|
13005
|
-
*
|
|
13006
|
-
* When the presenter opens an audience window, the PPTX bytes are stored in
|
|
13007
|
-
* IndexedDB. The audience tab retrieves them on load and then cleans up.
|
|
13008
|
-
*
|
|
13009
|
-
* Framework-agnostic port of the React store
|
|
13010
|
-
* (packages/react/src/viewer/hooks/presentation-mode/audience-content-store.ts).
|
|
13011
|
-
* The database, store, and key names are kept identical to React/Vue so the
|
|
13012
|
-
* cross-tab handoff stays wire-compatible regardless of which binding opened
|
|
13013
|
-
* the presenter window or which one renders the audience tab.
|
|
13014
|
-
*/
|
|
13015
|
-
/** URL hash that marks the current tab as the audience display. */
|
|
13016
|
-
declare const AUDIENCE_HASH = "#pptx-audience";
|
|
13017
|
-
/** Returns true if the current page was opened as an audience tab. */
|
|
13018
|
-
declare function isAudienceTab(): boolean;
|
|
13019
|
-
/**
|
|
13020
|
-
* Store PPTX content bytes so the audience tab can retrieve them.
|
|
13021
|
-
* Called by the presenter before opening the audience window.
|
|
13022
|
-
*/
|
|
13023
|
-
declare function storeAudienceContent(content: ArrayBuffer | Uint8Array, sessionId?: string): Promise<void>;
|
|
13024
|
-
/**
|
|
13025
|
-
* Load PPTX content bytes stored by the presenter tab.
|
|
13026
|
-
* Returns `null` if nothing is stored.
|
|
13027
|
-
*/
|
|
13028
|
-
declare function loadAudienceContent(sessionId?: string): Promise<Uint8Array | null>;
|
|
13029
|
-
/**
|
|
13030
|
-
* Remove stored audience content (cleanup).
|
|
13031
|
-
*/
|
|
13032
|
-
declare function clearAudienceContent(sessionId?: string): Promise<void>;
|
|
13033
|
-
|
|
13034
14499
|
/**
|
|
13035
14500
|
* SVG path generators for WordArt text warp presets.
|
|
13036
14501
|
*
|
|
@@ -14214,7 +15679,13 @@ declare class RibbonPrimaryRowComponent {
|
|
|
14214
15679
|
readonly commentCount: _angular_core.InputSignal<number>;
|
|
14215
15680
|
/** Toolbar buttons the host wants hidden (gates Broadcast + the export overflow items). */
|
|
14216
15681
|
readonly hiddenActions: _angular_core.InputSignal<ToolbarActionId[]>;
|
|
15682
|
+
/** Whether the host enabled the AI assistant (shows the Sparkles toggle). */
|
|
15683
|
+
readonly aiEnabled: _angular_core.InputSignal<boolean>;
|
|
15684
|
+
/** Whether the AI assistant panel is currently open (toggle active state). */
|
|
15685
|
+
readonly aiPanelOpen: _angular_core.InputSignal<boolean>;
|
|
14217
15686
|
readonly toggleSidebar: _angular_core.OutputEmitterRef<void>;
|
|
15687
|
+
/** Emitted when the user clicks the AI assistant Sparkles toggle. */
|
|
15688
|
+
readonly toggleAiPanel: _angular_core.OutputEmitterRef<void>;
|
|
14218
15689
|
readonly toggleComments: _angular_core.OutputEmitterRef<void>;
|
|
14219
15690
|
readonly present: _angular_core.OutputEmitterRef<void>;
|
|
14220
15691
|
readonly presenter: _angular_core.OutputEmitterRef<void>;
|
|
@@ -14247,7 +15718,7 @@ declare class RibbonPrimaryRowComponent {
|
|
|
14247
15718
|
protected onDocumentPointerDown(event: PointerEvent): void;
|
|
14248
15719
|
protected onOverflow(key: string): void;
|
|
14249
15720
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonPrimaryRowComponent, never>;
|
|
14250
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonPrimaryRowComponent, "pptx-ribbon-primary-row", never, { "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; }, { "toggleSidebar": "toggleSidebar"; "toggleComments": "toggleComments"; "present": "present"; "presenter": "presenter"; "broadcast": "broadcast"; "openCustomShows": "openCustomShows"; "toggleInspector": "toggleInspector"; "openSettings": "openSettings"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "print": "print"; "info": "info"; "a11y": "a11y"; "save": "save"; }, never, never, true, never>;
|
|
15721
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonPrimaryRowComponent, "pptx-ribbon-primary-row", never, { "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "sidebarCollapsed": { "alias": "sidebarCollapsed"; "required": false; "isSignal": true; }; "inspectorOpen": { "alias": "inspectorOpen"; "required": false; "isSignal": true; }; "commentsOpen": { "alias": "commentsOpen"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "aiEnabled": { "alias": "aiEnabled"; "required": false; "isSignal": true; }; "aiPanelOpen": { "alias": "aiPanelOpen"; "required": false; "isSignal": true; }; }, { "toggleSidebar": "toggleSidebar"; "toggleAiPanel": "toggleAiPanel"; "toggleComments": "toggleComments"; "present": "present"; "presenter": "presenter"; "broadcast": "broadcast"; "openCustomShows": "openCustomShows"; "toggleInspector": "toggleInspector"; "openSettings": "openSettings"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "print": "print"; "info": "info"; "a11y": "a11y"; "save": "save"; }, never, never, true, never>;
|
|
14251
15722
|
}
|
|
14252
15723
|
|
|
14253
15724
|
declare class RibbonReviewSectionComponent {
|
|
@@ -14754,50 +16225,6 @@ declare class ColorChangedImageComponent {
|
|
|
14754
16225
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ColorChangedImageComponent, "pptx-color-changed-image", never, { "src": { "alias": "src"; "required": true; "isSignal": true; }; "clrChange": { "alias": "clrChange"; "required": true; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "imgClass": { "alias": "imgClass"; "required": false; "isSignal": true; }; "imgStyle": { "alias": "imgStyle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
14755
16226
|
}
|
|
14756
16227
|
|
|
14757
|
-
/**
|
|
14758
|
-
* EyeDropper colour sampler for the Angular viewer.
|
|
14759
|
-
*
|
|
14760
|
-
* Prefers the native browser EyeDropper API (Chrome 95+ / Edge 95+). For
|
|
14761
|
-
* browsers without it (Firefox, Safari) a DOM-sampling fallback reads the
|
|
14762
|
-
* colour under the pointer via `elementFromPoint` + `getComputedStyle`, so the
|
|
14763
|
-
* eyedropper still works everywhere. Mirrors the React viewer's
|
|
14764
|
-
* `viewer/utils/eyedropper.ts`.
|
|
14765
|
-
*/
|
|
14766
|
-
/** A sampled colour, as hex plus its RGB channels. */
|
|
14767
|
-
interface EyedropperResult {
|
|
14768
|
-
hex: string;
|
|
14769
|
-
r: number;
|
|
14770
|
-
g: number;
|
|
14771
|
-
b: number;
|
|
14772
|
-
}
|
|
14773
|
-
/**
|
|
14774
|
-
* Returns true when the native EyeDropper API is available in this browser.
|
|
14775
|
-
* Guards against SSR / headless environments without `window`.
|
|
14776
|
-
*/
|
|
14777
|
-
declare function eyedropperAvailable(): boolean;
|
|
14778
|
-
/**
|
|
14779
|
-
* Open the native EyeDropper and return the picked sRGB hex colour string
|
|
14780
|
-
* (e.g. `"#a3b4c5"`), or `null` when the user cancels or the API is absent.
|
|
14781
|
-
*/
|
|
14782
|
-
declare function openNativeEyeDropper(): Promise<string | null>;
|
|
14783
|
-
/**
|
|
14784
|
-
* Sample the colour at a client-space point by inspecting the topmost element's
|
|
14785
|
-
* computed paint. Tries, in order: a real `<canvas>` pixel read (sharp for
|
|
14786
|
-
* rasterised content), then the element's `background-color`, SVG `fill`, and
|
|
14787
|
-
* finally text `color`. Returns `null` when nothing paintable is found.
|
|
14788
|
-
*
|
|
14789
|
-
* This is the DOM fallback used when the native EyeDropper API is unavailable;
|
|
14790
|
-
* it needs no canvas plumbing, so it works against the live slide DOM.
|
|
14791
|
-
*/
|
|
14792
|
-
declare function sampleColorFromSlide(clientX: number, clientY: number): EyedropperResult | null;
|
|
14793
|
-
/**
|
|
14794
|
-
* Run the eyedropper fallback: arm a one-shot pointer listener and resolve with
|
|
14795
|
-
* the hex colour of the next click (or `null` if the user presses Escape). Used
|
|
14796
|
-
* only when {@link eyedropperAvailable} is false. The caller is responsible for
|
|
14797
|
-
* any "armed" UI affordance; this just manages the listeners.
|
|
14798
|
-
*/
|
|
14799
|
-
declare function pickColorByClickFallback(): Promise<string | null>;
|
|
14800
|
-
|
|
14801
16228
|
declare class CustomShowsComponent {
|
|
14802
16229
|
private readonly translate;
|
|
14803
16230
|
/** Whether the dialog is open. */
|
|
@@ -15008,31 +16435,6 @@ declare class ThemeGalleryComponent {
|
|
|
15008
16435
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ThemeGalleryComponent, "pptx-theme-gallery", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "activeName": { "alias": "activeName"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; }, { "applyTheme": "applyTheme"; "applyCustomTheme": "applyCustomTheme"; "close": "close"; }, never, never, true, never>;
|
|
15009
16436
|
}
|
|
15010
16437
|
|
|
15011
|
-
/**
|
|
15012
|
-
* theme-gallery-presets.ts: the exact theme set shown in the Design tab's
|
|
15013
|
-
* Theme Gallery, at parity with React's `BUILT_IN_THEMES`
|
|
15014
|
-
* (packages/react/src/viewer/components/toolbar/theme-gallery-data.ts).
|
|
15015
|
-
*
|
|
15016
|
-
* This is a DIFFERENT set from core's `THEME_PRESETS`: it adds Wisp, Berlin,
|
|
15017
|
-
* Slice, and Dividend and omits Slate and Metropolitan, in React's order
|
|
15018
|
-
* (office, facet, integral, ion, retrospect, organic, wisp, berlin, slice,
|
|
15019
|
-
* dividend).
|
|
15020
|
-
*
|
|
15021
|
-
* The six themes that also exist in core (`office`, `facet`, `integral`,
|
|
15022
|
-
* `ion`, `organic`, `retrospect`) are reused verbatim from core's
|
|
15023
|
-
* `THEME_PRESETS` (looked up by id) so their colour/font schemes stay
|
|
15024
|
-
* canonical. The four gallery-only themes are defined here, with colour
|
|
15025
|
-
* schemes copied from React's data and React's flat `{ majorFont, minorFont }`
|
|
15026
|
-
* fontScheme converted to core's nested `{ majorFont: { latin }, minorFont:
|
|
15027
|
-
* { latin } }` shape.
|
|
15028
|
-
*/
|
|
15029
|
-
|
|
15030
|
-
/**
|
|
15031
|
-
* The gallery theme set, in React's order. Six canonical core presets plus the
|
|
15032
|
-
* four gallery-only additions.
|
|
15033
|
-
*/
|
|
15034
|
-
declare const GALLERY_THEME_PRESETS: readonly PptxThemePreset[];
|
|
15035
|
-
|
|
15036
16438
|
declare class TitleBarComponent {
|
|
15037
16439
|
/** Whether the deck is editable (gates the autosave/quick-access/search chrome). */
|
|
15038
16440
|
readonly canEdit: _angular_core.InputSignal<boolean>;
|
|
@@ -15226,5 +16628,5 @@ declare const SEQUENCE_OPTIONS: ReadonlyArray<{
|
|
|
15226
16628
|
labelKey: string;
|
|
15227
16629
|
}>;
|
|
15228
16630
|
|
|
15229
|
-
export { ALIGN_OPTIONS, AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AVATAR_COLOR_SWATCHES, AccessibilityPanelComponent, AccessibilityService, AccountPageComponent, ActionSettingsPanelComponent, AdvancedChartEditorComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, AutosaveService, BroadcastDialogComponent, CHART_EDITOR_STYLES, CURSOR_PALETTE, CanvasFitService, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartElementViewComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartPartSelectionService, ChartPrimitivesComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, ColorChangedImageComponent, CommentsPanelComponent, CommentsService, ComparePanelComponent, ConnectorRendererComponent, ConnectorTextOverlayComponent, CustomShowsComponent, DATA_TABLE_HEADER_H, DATA_TABLE_KEY_W, DATA_TABLE_PADDING, DATA_TABLE_ROW_H, DEFAULT_BOUNDS, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, DEFAULT_COLOR_SCHEME, DEFAULT_FILL_COLOR, DEFAULT_LAYOUT, DEFAULT_PALETTE$1 as DEFAULT_PALETTE, DEFAULT_PRINT_SETTINGS, DEFAULT_SLIDE_BACKGROUND, DEFAULT_STROKE_COLOR, DEFAULT_STYLE, DEFAULT_TABLE_ROW_HEIGHT, DEFAULT_TEXT_COLOR, DEFAULT_VIEWER_PROFILE, DIRECTIONAL_PRESETS, DIRECTION_OPTIONS, DocumentPropertiesCardComponent, EMBEDDED_FONTS_STYLE_ID, EMPHASIS_PRESETS, ENTRANCE_PRESETS, TEMPLATES as EQUATION_TEMPLATES, EXIT_PRESETS, EditorContextMenuComponent, EditorHistory, EditorStateService, EditorToolbarComponent, EffectsPanelComponent, ElementRendererComponent, EmbeddedFontsService, EncryptedFileDialogComponent, EquationEditorDialogComponent, EquationRendererComponent, EquationTemplateGalleryComponent, ExportProgressModalComponent, ExportService, FieldContextService, FindBarComponent, FindReplaceBarComponent, FollowModeBarComponent, FontEmbeddingListComponent, FontEmbeddingPanelComponent, GALLERY_THEME_PRESETS, GradientPickerComponent, HANDOUT_OPTIONS, HeaderFooterDialogComponent, HyperlinkDialogComponent, ImagePropertiesPanelComponent, InkDrawingService, InkRendererComponent, InsertSmartArtDialogComponent, InspectorPaneHeaderComponent, InspectorPanelComponent, IsMobileService, KeepAnnotationsDialogComponent, LOCALE_CATALOG, LONG_PRESS_DURATION_MS, LONG_PRESS_MOVE_TOLERANCE_PX, LoadContentService, LocalPresencePublisher, MAX_ZOOM_SCALE, MIN_ZOOM_SCALE, MediaPreviewComponent, MediaPropertiesPanelComponent, MediaRendererComponent, MediaTrimTimelineComponent, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesHandoutCardComponent, NotesPanelComponent, NotesToolbarComponent, OleRendererComponent, POWER_POINT_VIEWER_PROVIDERS, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PasswordProtectionDialogComponent, PasswordStrengthMeterComponent, PowerPointViewerComponent, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationPropertiesPanelComponent, PresentationSettingsCardComponent, PresentationSubtitleBarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, REPEAT_MODE_OPTIONS, RESIZE_HANDLES, RULER_THICKNESS, RemoteSelectionOverlayComponent, RibbonAnimationsSectionComponent, RibbonArrangeSectionComponent, RibbonColorPopoverComponent, RibbonComponent, RibbonDesignSectionComponent, RibbonDrawSectionComponent, RibbonDrawingGroupComponent, RibbonEditingSectionComponent, RibbonFileSectionComponent, RibbonFontControlsComponent, RibbonHomeSectionComponent, RibbonInsertFieldsComponent, RibbonInsertSectionComponent, RibbonParagraphControlsComponent, RibbonPrimaryRowComponent, RibbonReviewSectionComponent, RibbonSlideshowSectionComponent, RibbonTransitionsSectionComponent, RibbonViewSectionComponent, RulerGuidesService, SEQUENCE_OPTIONS, SEVERITY_GROUPS, SEVERITY_LABELS, SHORTCUT_REFERENCE_ITEMS, SLIDE_PX_PER_INCH, SLIDE_TRANSITION_KEYFRAMES, DEFAULT_PALETTE as SMARTART_DEFAULT_PALETTE, PALETTES as SMARTART_PALETTES, SMART_ART_COLOR_SCHEMES, SMART_ART_STYLE_OPTIONS, SUB_ITEM_LABEL, SVG_WARP_PRESETS, SWIPE_MAX_VERTICAL_PX, SWIPE_THRESHOLD_PX, SelectionPaneComponent, SetUpSlideShowDialogComponent, SettingsAppearanceTabComponent, SettingsDialogComponent, SettingsLanguageTabComponent, ShareDialogComponent, ShortcutPanelComponent, ShowOptionsFieldsetComponent, ShowSlidesFieldsetComponent, SignatureStrippedDialogComponent, SignaturesPanelComponent, SignaturesService, SlideCanvasComponent, SlideDefaultInspectorComponent, SlideDiffChangesComponent, SlideDiffRowComponent, SlideDiffThumbnailsComponent, SlideSizeCardComponent, SlideSorterOverlayComponent, SlideThemeOverridePanelComponent, SlidesPanelComponent, SmartArt3DRendererComponent, SmartArt3DService, SmartArtPreviewComponent, SmartArtPropertiesComponent, SmartArtRendererComponent, StatusBarComponent, TABLE_STRUCTURE_TOGGLES, TEXT_DIRECTION_OPTIONS, THEME_CATALOG, TIMING_CURVE_OPTIONS, TRIGGER_OPTIONS, TYPE_LABELS, TableCellAdvancedFillComponent, TableCellFormattingComponent, TableDataEditorComponent, TablePropertiesComponent, TableRendererComponent, TableResizeOverlayComponent, TableSelectionService, TextAdvancedPanelComponent, ThemeEditorFieldsComponent, ThemeGalleryComponent, ThemeSelectorCardComponent, TitleBarComponent, VALIGN_OPTIONS, VIEWER_THEME, VersionHistoryPanelComponent, ViewerCanvasEditingService, ViewerCollabCursorService, ViewerCollaborationSessionService, ViewerCompareService, ViewerCustomShowsService, ViewerDialogsService, ViewerDocumentPropertiesService, ViewerExportService, ViewerExtraDialogsComponent, ViewerFileIOService, ViewerFindReplaceService, ViewerFormatPainterService, ViewerInspectorPanelService, ViewerKeyboardService, ViewerMobileSheetService, ViewerPresentationModeService, ViewerThemeGalleryService, ViewerTouchGesturesService, ViewerZoomService, WEBM_MIME_CANDIDATES, WriteBackScheduler, ZoomNavigationService, ZoomRendererComponent, ZoomTargetService, addCategory, addCommentToList, addGradientStopPatch, addItem, addSeries, addSubItem, advanceStep, alignPatch, animationFor, annotationMapToInkInserts, applyAcceptedDiff, applyAnimationPreset, applyFindReplacements, applyFormatToElement, applyMove, applyResize, applyTableStylePreset, asMediaElement, assignUserColor, attachTouchGestures, beginNodeEdit, boolFromEvent, bringForward, bringToFront, buildBarActions, buildBroadcastConfig, buildBroadcastViewerUrl, buildCategoryLabels, buildCellParagraphs, buildChartViewModel, buildChromeStyle, buildClearHyperlinkPatch, buildClickGroups, buildColStyles, buildCollaborationConfig, buildComboViewModel, buildCssGradientFromShapeStyle, buildDuotoneFilter, buildDuotoneFilterId, buildEmbeddedFontStyles, buildEquationElement, buildEquationSegment, buildFallbackViewModel, buildFontFaceRule, buildGradientFillCss, buildGridlinesAndLabels, buildHyperlinkPatch, buildInkContainerStyle, buildInkStrokes, buildLegend, buildModel3DContainerStyle, buildModel3DViewModel, buildOleActionModel, buildOleInfoRows, buildPatternFillCss, buildPrintHtmlDocument as buildPrintDocument, buildPropertiesPatch, buildRegionMapViewModel, buildSaveSlides, buildShareUrl, buildSmartArtInsertElement, buildSmartArtNodes, buildStockViewModel, buildSurfaceViewModel, buildTableViewModel, buildTreemapViewModel, buildTrimFragment, buildWaterfallViewModel, buildZeroLine, buildZoomContainerStyle, buildZoomViewModel, bulletIndentPx, canAddTopLevelNode, canRemoveTopLevelNode, canStartBroadcast, canStartShare, canUseClipboard, captionDisplayText, cellRunStyle, cellStyleToStyleMap, cellTdStyle, changeCountLabel, changeIcon, characterSpacingPatch, checkFontAvailable, clampCursorPosition, clampGifDimensions, clampIndex, clampNotesFontSize, clampScale, clampStep, clearAllLocalViewerData, clearAudienceContent, cn, collectAccessibilityIssues, collectElementText, collectSlideText, collectUsedFontFamilies, columnWidthStyle, commitNodeText, computeAlign, computeAxisTitlePrimitives, computeBarRects, computeBubbleRadius, computeCornerHandle, computeDataTablePrimitives, computeDistribute, computeDrawingViewBox, computeErrorBarPrimitives, computeHandleBoxes, computeHandoutLayout, computeIsMobile, computeIsTablet, computeLinePoints, computeLinearRegression, computePageCount, computePieLayout, computePieSlicePath, computePieSlices, computePlotLayout, computeRSquared, computeRadarPoints, computeScatterDots, computeSelectionBoxes, computeSingleSelected, computeSlideIndices, computeSnap, computeStackedBarRects, computeStackedValueRange, computeTextLines, computeTimerProgress, computeTrendlinePrimitives, computeValueRange, convertOmmlToMathMl, copyFormatFromElement, countAccessibilityIssues, countAnnotationStrokes, createCustomShow, createSwipeDismissDrag, createWebrtcBundle, createWebsocketBundle, cssObjectToStyleMap, currentColorScheme, currentLayout, currentStyle, defaultCssVars, defaultRadius, defaultThemeColors, deleteElementsByIds, deleteVersion as deleteRecoveryVersion, demoteNode, deriveModel3DBlobUrl, derivePresenceList, describeSmartArtBounds, disableGlowPatch, disableInnerShadowPatch, disableOuterShadowPatch, disableReflectionPatch, disableSoftEdgePatch, duplicateElementById, durationOf, effectsStateOf, enableGlowPatch, enableInnerShadowPatch, enableOuterShadowPatch, enableReflectionPatch, enableSoftEdgePatch, encodeGif, estimatePageCount, evenColumnWidths, evenRowHeights, exitPresentationFullscreen, extractPathPoints, eyedropperAvailable, fillColorOf, findInSlides, findOwningSlideIndex, findSlideIndexByElementId, fitPolynomial, fitZoom, fontMimeForFormat, fontSizeOf, formatAutoNumber, formatAxisValue, formatBytes, formatCursorLabel, formatElapsed, formatFileSize, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, generateCustomShowId, generatePressureCircles, generateRulerTicks, getClrChangeParams, getContainerStyle, getDuotoneFilterDef, getImageSrc, getLocalStorageUsageSummary, getOleAriaLabel, getOleBadgeLabel, getOleDisplayName, getOleDownloadFileName, getOleTypeColor, getOleTypeLabel, getPasswordStrength, getPatternSvg, getPlaceholderStyle, getVersions as getRecoveryVersions, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getSmartArtNodeBounds, getSpeechRecognitionCtor, getTextBlockStyle, getTextWarp, getTouchDistance, getWarpCategory, getWarpPath, gradientStateFromStyle, gradientStateOf, gradientStatePatch, gridColumns, groupElements, groupIssuesBySeverity, hasAnimation, hasCopyableFormat, hasExistingLink, hasExitedFullscreen, hasGradientFill, hasPressureVariation, headerLabel, inkViewBox, insertColumn, insertRow, interpolateWidth, isAudienceTab, isBold, isBrowserOpenableMime, isChildNode, isElementInteractive, isInjectableUrl, isItalic, isPpactionUrl, isPresenterMessage, isSigned, isTextElement, isUnderline, isUrlSafe, isValidRoomId, isViewportBackgroundPressTarget, isZoomActivationKey, issueTrackKey, issueTypeLabel, keyToLabel, latexToMathml, linePointsToSvgString, lineSpacingPatch, loadAudienceContent, mergeCaptionResults, mergeDown, mergeRight, mergeSelection, moveElementBy, moveNodeDown, moveNodeUp, msToFrameDelayCs, narrowToCircle, narrowToPolygon, narrowToRect, newChartElement, newEquationElement, newPresetShapeElement, newShapeElement, newSmartArtElement, newTableElement, newTextElement, nextVisibleIndex, nodeBold, nodeEditBox, nodeFillColor, nodeFontColor, nodeIdFromKey, nodeItalic, nodeStyle, normalizeFontFormat, normalizeSlidesPerPage, normalizeValue, numFromEvent, ommlToMathml, ooxmlDashToCssBorderStyle, openNativeEyeDropper, overallStatus, paletteColor, parseAudienceNonce, parseNodeTextarea, partitionSlides, patchChartData, patchChartStyle, patchTableData, patchTextStyle, pendingElementStyles, pickColorByClickFallback, pickSupportedMimeType, planGifFrames, planVideoSegments, pointsToSvgPathD, presenceToCursors, presetByLayout, presetsForCategory, pressuresToWidths, prevVisibleIndex, projectDrawingShapes, promoteNode, provideViewerTheme, radarAngle, radarRingPoints, recordWebm, redistributeColumnWidth, removeAnimation, removeCategory, removeColumn, removeCommentFromList, removeElementAnimation, removeGradientStopPatch, removeNode, removeRow, removeSeries, renderToCanvas, reorderAnimationDown, reorderAnimationUp, replaceInSlides, replaceMatch, requestPresentationFullscreen, resizeElement, resolveCaptionTracks, resolveChartKind, resolveFontVariant, resolveHyperlinkHref, resolveInteractiveElementId, resolveMediaSrc, resolveOleType, resolveParagraphBullet, resolvePresenterNotes, resolveProfileInitial, resolveRegionCode, resolvePalette as resolveSmartArtPalette, resolveThemeCatalogEntry, resolveTransitionDuration, revealedElementStyles, routeOrthogonalConnector, rowStyle, sampleColorFromSlide, sanitizeColor, sanitizeSlideIndex, sanitizeUserName, saveViewerProfile, scanAvailableFonts, searchSlides, seedBroadcastFields, seedHyperlinkDraft, seedPropertiesDraft, seedShareFields, segmentFrameCount, selectValue, sendBackward, sendToBack, sequentialColorScale, serializeWriteBack, seriesColor, setAnimationEmphasis, setAnimationEntrance, setAnimationExit, setAxis, setAxisLogScale, setAxisTitleStyle, setCategoryLabel, setCellText, setColorScheme, setDataLabels, setDataPointExplosion, setDataPointFill, setDataPointLabel, setDelay, setDirection, setDuration, setElementPosition, setGridlineStyle, setLayout, setLegend, setNodeStyle, setNodeText, setRepeatCount, setRepeatMode, setSequence, setSeriesChartType, setSeriesColor, setSeriesErrorBars, setSeriesMarker, setSeriesName, setSeriesTrendline, setSeriesValue, setStyle, setTimingCurve, setTitle, setTrigger, setTriggerShapeId, shapeStylePatch, sheetAfterNavigate, shouldBlockClickAdvance, shouldUseSvgWarp, showDirectionPicker, showsTemplateAffordance, signatureCountLabel, signatureKey, signatureTimestamp, signerName, statusLabel as slideDiffStatusLabel, slideNumberOf, smartArtNodes, paletteColour as smartArtPaletteColour, snapToGridStep, splitCursorCell, splitMergedCell, statusKind, statusLabel$1 as statusLabel, storeAudienceContent, stringFromEvent, strokeColorOf, strokeToInkElement, styleShadowFilter, textAdvancedPatch, textAdvancedStateFromStyle, textAdvancedStateOf, textColorOf, textDirectionPatch, textStyleOf, textStylePatch, themeStyle, themeToCssVars, thumbnailHeight, thumbnailZoom, toggleCommentResolvedInList, toggleNodeBold, toggleNodeItalic, toggleSheet, topLevelNodeCount, transformSelectedTextCase, translationsEn, ungroupElements, updateElementById, updateGlowPatch, updateGradientStopPatch, updateInnerShadowPatch, updateOuterShadowPatch, updateReflectionPatch, vAlignPatch, validatePassword, validatePrintSettings, validateRoomId, valueToY, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, waypointsToPathD, worstStatus, zoomTargetSlideIndex };
|
|
15230
|
-
export type { AccessibilityIssueGroup, AccountAuthConfig, ActionDescriptor, AlignBox, AlignMode, AnimationClickGroup, AnimationGroup, AnnotationInkInsert, AnnotationStroke, AttachTouchGesturesConfig, AwarenessLike, BarRect, Box, BroadcastConfig, BroadcastDefaults, CSSProperties, CanvasSize, CellCoord, CellParagraph, CellTextRun, ChartPartRef, ChartPartSelection, ChartValueDrag, ChartViewModel, ClassValue, ClrChangeParams, CollaborationConfig, CollaborationRole, RouterRect as ConnectorObstacle, RouterPoint as ConnectorPoint, ConnectorRouting, CopiedFormat, CornerHandleBox, CustomShow, CustomThemeEdit, DestroyableYDoc, DiagonalBorderInfo, DistributeMode, DocumentProperties, DrawingViewBox, DuotoneFilterDef, EffectsState, EmbeddedFontStyles, EquationTemplate, EyedropperResult, FindOptions, FindResult, GifFrame, GifFramePlan, GifPlanOptions, GlowState, GradientState, GradientStop$1 as GradientStop, GroupResult, HandleBox, HandoutSlidesPerPage, HyperlinkDraft, InkPoint, InkStroke, InlineEditState, InnerShadowState, LegendEntry, LinePoint, LinearFit, LocalIdentity, LocalStorageUsageSummary, LocaleCatalogEntry, MobileSheetKey, Model3DViewModel, NodeEditBox, NotesSegmentViewModel, ObjectUrlFactory, OleActionModel, OleInfoRow, OuterShadowState, OverallSignatureStatus, PartitionedSlides, PathPoint, PieSliceGeometry, PieSliceOptions, PlotLayout, PlotLayoutOptions, PositionUpdate, PowerPointViewerAPI, PresentationTool, PresenterExitMessage, PresenterMessage, PresenterNotes, PresenterSlideChangeMessage, PressureCircle, PrintColorMode, PrintHtmlDocumentOptions as PrintDocumentOptions, PrintOrientation, PrintSettings, PrintSlideRange, PrintWhat, PropertiesDraft, ProviderBundle, ProviderLike, RadarPoint, RecordWebmOptions, RecoveryVersion, ReflectionState, RemoteCursor, SanitizedPresence as RemotePresence, RenderedShape, ReplaceResult, ResizeHandle, ResolvedCaptionTrack, ResolvedFontVariant, ResolvedOleType, RulerTick, ScatterDot, SelectionBox, ShapeStyleChanges, ShareDefaults, ShareFormFields, ShortcutReferenceItem, SignatureStatusKind, SlideInspectorTab, SlideTransitionAnimations, SmartArtInsertEvent, SmartArtNodeBounds, SnapBox, SnapGuide, SnapResult, SoftEdgeState, SpeechAlternative, SpeechRecognitionCtor, SpeechRecognitionEventLite, SpeechRecognitionLite, SpeechResult, SpeechResultList, SpeechSupportState, StrokeToInkElementOpts, StyleMap, SupportedChartKind, SvgAreaGradient, SvgCircle, SvgLine, SvgPath, SvgPolygon, SvgPolyline, SvgPrimitive, SvgRect, SvgText, SwipeDismissDrag, TableBooleanFlag, TableCellSelection, TableCellViewModel, TableRowViewModel, TemplateElementsBySlideId, TextAdvancedChanges, TextAdvancedState, TextStyleChanges, TextWarpCssDef, TextWarpDef, TextWarpPathDef, ThemeCatalogEntry, TimerProgress, ToolbarActionId, TouchGestureCallbacks, TranslationKey, UngroupResult, ValueRange, VideoPlanOptions, VideoSegmentPlan, ViewerMode, ViewerProfile, ViewerSettings, ViewerTheme, ViewerThemeColors, ZoomViewModel };
|
|
16631
|
+
export { ALIGN_OPTIONS, AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AVATAR_COLOR_SWATCHES, AccessibilityPanelComponent, AccessibilityService, AccountPageComponent, ActionSettingsPanelComponent, AdvancedChartEditorComponent, AiChangeOverlayComponent, AiChatPanelComponent, AiChatService, AiComposerComponent, AiFocusBarComponent, AiFocusHighlightOverlayComponent, AiMessageListComponent, AiPanelStore, AiProposalCardComponent, AiSettingsSectionComponent, AiToolCallCardComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, AutosaveService, BroadcastDialogComponent, CHART_EDITOR_STYLES, CURSOR_PALETTE, CanvasFitService, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartElementViewComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartPartSelectionService, ChartPrimitivesComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, ColorChangedImageComponent, CommentsPanelComponent, CommentsService, ComparePanelComponent, ConnectorRendererComponent, ConnectorTextOverlayComponent, CustomShowsComponent, DATA_TABLE_HEADER_H, DATA_TABLE_KEY_W, DATA_TABLE_PADDING, DATA_TABLE_ROW_H, DEFAULT_BOUNDS, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, DEFAULT_COLOR_SCHEME, DEFAULT_FILL_COLOR, DEFAULT_LAYOUT, DEFAULT_PALETTE$1 as DEFAULT_PALETTE, DEFAULT_PRINT_SETTINGS, DEFAULT_SLIDE_BACKGROUND, DEFAULT_STROKE_COLOR, DEFAULT_STYLE, DEFAULT_TABLE_ROW_HEIGHT, DEFAULT_TEXT_COLOR, DEFAULT_VIEWER_PROFILE, DIRECTIONAL_PRESETS, DIRECTION_OPTIONS, DocumentPropertiesCardComponent, EMBEDDED_FONTS_STYLE_ID, EMPHASIS_PRESETS, ENTRANCE_PRESETS, TEMPLATES as EQUATION_TEMPLATES, EXIT_PRESETS, EditorContextMenuComponent, EditorHistory, EditorStateService, EditorToolbarComponent, EffectsPanelComponent, ElementRendererComponent, EmbeddedFontsService, EncryptedFileDialogComponent, EquationEditorDialogComponent, EquationRendererComponent, EquationTemplateGalleryComponent, ExportProgressModalComponent, ExportService, FieldContextService, FindBarComponent, FindReplaceBarComponent, FollowModeBarComponent, FontEmbeddingListComponent, FontEmbeddingPanelComponent, GALLERY_THEME_PRESETS, GradientPickerComponent, HANDOUT_OPTIONS, HeaderFooterDialogComponent, HyperlinkDialogComponent, ImagePropertiesPanelComponent, InkDrawingService, InkRendererComponent, InsertSmartArtDialogComponent, InspectorPaneHeaderComponent, InspectorPanelComponent, IsMobileService, KeepAnnotationsDialogComponent, LOCALE_CATALOG, LONG_PRESS_DURATION_MS, LONG_PRESS_MOVE_TOLERANCE_PX, LoadContentService, LocalPresencePublisher, MAX_ZOOM_SCALE, MIN_ZOOM_SCALE, MediaPreviewComponent, MediaPropertiesPanelComponent, MediaRendererComponent, MediaTrimTimelineComponent, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesHandoutCardComponent, NotesPanelComponent, NotesToolbarComponent, OleRendererComponent, POWER_POINT_VIEWER_PROVIDERS, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PasswordProtectionDialogComponent, PasswordStrengthMeterComponent, PowerPointViewerComponent, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationPropertiesPanelComponent, PresentationSettingsCardComponent, PresentationSubtitleBarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, REPEAT_MODE_OPTIONS, RESIZE_HANDLES, RULER_THICKNESS, RemoteSelectionOverlayComponent, RibbonAnimationsSectionComponent, RibbonArrangeSectionComponent, RibbonColorPopoverComponent, RibbonComponent, RibbonDesignSectionComponent, RibbonDrawSectionComponent, RibbonDrawingGroupComponent, RibbonEditingSectionComponent, RibbonFileSectionComponent, RibbonFontControlsComponent, RibbonHomeSectionComponent, RibbonInsertFieldsComponent, RibbonInsertSectionComponent, RibbonParagraphControlsComponent, RibbonPrimaryRowComponent, RibbonReviewSectionComponent, RibbonSlideshowSectionComponent, RibbonTransitionsSectionComponent, RibbonViewSectionComponent, RulerGuidesService, SEQUENCE_OPTIONS, SEVERITY_GROUPS, SEVERITY_LABELS, SHORTCUT_REFERENCE_ITEMS, SLIDE_PX_PER_INCH, SLIDE_TRANSITION_KEYFRAMES, DEFAULT_PALETTE as SMARTART_DEFAULT_PALETTE, PALETTES as SMARTART_PALETTES, SMART_ART_COLOR_SCHEMES, SMART_ART_STYLE_OPTIONS, SUB_ITEM_LABEL, SVG_WARP_PRESETS, SWIPE_MAX_VERTICAL_PX, SWIPE_THRESHOLD_PX, SelectionPaneComponent, SetUpSlideShowDialogComponent, SettingsAppearanceTabComponent, SettingsDialogComponent, SettingsLanguageTabComponent, ShareDialogComponent, ShortcutPanelComponent, ShowOptionsFieldsetComponent, ShowSlidesFieldsetComponent, SignatureStrippedDialogComponent, SignaturesPanelComponent, SignaturesService, SlideCanvasComponent, SlideDefaultInspectorComponent, SlideDiffChangesComponent, SlideDiffRowComponent, SlideDiffThumbnailsComponent, SlideSizeCardComponent, SlideSorterOverlayComponent, SlideThemeOverridePanelComponent, SlidesPanelComponent, SmartArt3DRendererComponent, SmartArt3DService, SmartArtPreviewComponent, SmartArtPropertiesComponent, SmartArtRendererComponent, StatusBarComponent, TABLE_STRUCTURE_TOGGLES, TEXT_DIRECTION_OPTIONS, THEME_CATALOG, TIMING_CURVE_OPTIONS, TRIGGER_OPTIONS, TYPE_LABELS, TableCellAdvancedFillComponent, TableCellFormattingComponent, TableDataEditorComponent, TablePropertiesComponent, TableRendererComponent, TableResizeOverlayComponent, TableSelectionService, TextAdvancedPanelComponent, ThemeEditorFieldsComponent, ThemeGalleryComponent, ThemeSelectorCardComponent, TitleBarComponent, VALIGN_OPTIONS, VIEWER_THEME, VersionHistoryPanelComponent, ViewerCanvasEditingService, ViewerCollabCursorService, ViewerCollaborationSessionService, ViewerCompareService, ViewerCustomShowsService, ViewerDialogsService, ViewerDocumentPropertiesService, ViewerExportService, ViewerExtraDialogsComponent, ViewerFileIOService, ViewerFindReplaceService, ViewerFormatPainterService, ViewerInspectorPanelService, ViewerKeyboardService, ViewerMobileSheetService, ViewerPresentationModeService, ViewerThemeGalleryService, ViewerTouchGesturesService, ViewerZoomService, WEBM_MIME_CANDIDATES, WriteBackScheduler, ZoomNavigationService, ZoomRendererComponent, ZoomTargetService, addCategory, addCommentToList, addGradientStopPatch, addItem, addSeries, addSubItem, advanceStep, aiToggleVisible, alignPatch, animationFor, annotationMapToInkInserts, applyAcceptedDiff, applyAnimationPreset, applyFindReplacements, applyFormatToElement, applyMove, applyResize, applyTableStylePreset, asMediaElement, assignUserColor, attachTouchGestures, beginNodeEdit, boolFromEvent, bringForward, bringToFront, buildBarActions, buildBroadcastConfig, buildBroadcastViewerUrl, buildCategoryLabels, buildCellParagraphs, buildChartViewModel, buildChatLogExport, buildChatLogMarkdown, buildChromeStyle, buildClearHyperlinkPatch, buildClickGroups, buildColStyles, buildCollaborationConfig, buildComboViewModel, buildCssGradientFromShapeStyle, buildDuotoneFilter, buildDuotoneFilterId, buildEmbeddedFontStyles, buildEquationElement, buildEquationSegment, buildFallbackViewModel, buildFontFaceRule, buildGradientFillCss, buildGridlinesAndLabels, buildHyperlinkPatch, buildInkContainerStyle, buildInkStrokes, buildLegend, buildModel3DContainerStyle, buildModel3DViewModel, buildOleActionModel, buildOleInfoRows, buildPatternFillCss, buildPrintHtmlDocument as buildPrintDocument, buildPropertiesPatch, buildRegionMapViewModel, buildSaveSlides, buildShareUrl, buildSmartArtInsertElement, buildSmartArtNodes, buildStockViewModel, buildSurfaceViewModel, buildTableViewModel, buildTreemapViewModel, buildTrimFragment, buildWaterfallViewModel, buildZeroLine, buildZoomContainerStyle, buildZoomViewModel, bulletIndentPx, canAddTopLevelNode, canRemoveTopLevelNode, canStartBroadcast, canStartShare, canUseClipboard, captionDisplayText, cellRunStyle, cellStyleToStyleMap, cellTdStyle, changeCountLabel, changeIcon, characterSpacingPatch, checkFontAvailable, clampCursorPosition, clampGifDimensions, clampIndex, clampNotesFontSize, clampScale, clampStep, clearAllLocalViewerData, clearAudienceContent, cn, collectAccessibilityIssues, collectElementText, collectSlideText, collectStoredChats, collectUsedFontFamilies, columnWidthStyle, commitNodeText, computeAlign, computeAxisTitlePrimitives, computeBarRects, computeBubbleRadius, computeCornerHandle, computeDataTablePrimitives, computeDistribute, computeDrawingViewBox, computeErrorBarPrimitives, computeFocusTargets, computeHandleBoxes, computeHandoutLayout, computeIsMobile, computeIsTablet, computeLinePoints, computeLinearRegression, computePageCount, computePieLayout, computePieSlicePath, computePieSlices, computePlotLayout, computeRSquared, computeRadarPoints, computeScatterDots, computeSelectionBoxes, computeSingleSelected, computeSlideIndices, computeSnap, computeStackedBarRects, computeStackedValueRange, computeTextLines, computeTimerProgress, computeTrendlinePrimitives, computeValueRange, convertOmmlToMathMl, copyFormatFromElement, countAccessibilityIssues, countAnnotationStrokes, createAngularAiBridge, createCustomShow, createSwipeDismissDrag, createWebrtcBundle, createWebsocketBundle, cssObjectToStyleMap, currentColorScheme, currentLayout, currentStyle, defaultCssVars, defaultRadius, defaultThemeColors, deleteElementsByIds, deleteVersion as deleteRecoveryVersion, demoteNode, deriveModel3DBlobUrl, derivePresenceList, describeSmartArtBounds, disableGlowPatch, disableInnerShadowPatch, disableOuterShadowPatch, disableReflectionPatch, disableSoftEdgePatch, duplicateElementById, durationOf, effectsStateOf, enableGlowPatch, enableInnerShadowPatch, enableOuterShadowPatch, enableReflectionPatch, enableSoftEdgePatch, encodeGif, estimatePageCount, evenColumnWidths, evenRowHeights, exitPresentationFullscreen, exportAiChatLogs, extractPathPoints, eyedropperAvailable, fillColorOf, findInSlides, findOwningSlideIndex, findSlideIndexByElementId, fitPolynomial, fitZoom, focusTargetChips, fontMimeForFormat, fontSizeOf, formatAutoNumber, formatAxisValue, formatBytes, formatCursorLabel, formatElapsed, formatFileSize, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, generateCustomShowId, generatePressureCircles, generateRulerTicks, getClrChangeParams, getContainerStyle, getDuotoneFilterDef, getImageSrc, getLocalStorageUsageSummary, getOleAriaLabel, getOleBadgeLabel, getOleDisplayName, getOleDownloadFileName, getOleTypeColor, getOleTypeLabel, getPasswordStrength, getPatternSvg, getPlaceholderStyle, getVersions as getRecoveryVersions, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getSmartArtNodeBounds, getSpeechRecognitionCtor, getTextBlockStyle, getTextWarp, getTouchDistance, getWarpCategory, getWarpPath, gradientStateFromStyle, gradientStateOf, gradientStatePatch, gridColumns, groupElements, groupIssuesBySeverity, hasAnimation, hasCopyableFormat, hasExistingLink, hasExitedFullscreen, hasGradientFill, hasPressureVariation, headerLabel, inkViewBox, insertColumn, insertRow, interpolateWidth, isAudienceTab, isBold, isBrowserOpenableMime, isChildNode, isElementInteractive, isInjectableUrl, isItalic, isPpactionUrl, isPresenterMessage, isSigned, isTextElement, isTwoTableFocus, isUnderline, isUrlSafe, isValidRoomId, isViewportBackgroundPressTarget, isZoomActivationKey, issueTrackKey, issueTypeLabel, keyToLabel, latexToMathml, linePointsToSvgString, lineSpacingPatch, loadAudienceContent, mergeCaptionResults, mergeDown, mergeRight, mergeSelection, moveElementBy, moveNodeDown, moveNodeUp, msToFrameDelayCs, narrowToCircle, narrowToPolygon, narrowToRect, newChartElement, newEquationElement, newPresetShapeElement, newShapeElement, newSmartArtElement, newTableElement, newTextElement, nextVisibleIndex, nodeBold, nodeEditBox, nodeFillColor, nodeFontColor, nodeIdFromKey, nodeItalic, nodeStyle, normalizeFontFormat, normalizeSlidesPerPage, normalizeValue, numFromEvent, ommlToMathml, ooxmlDashToCssBorderStyle, openNativeEyeDropper, overallStatus, paletteColor, parseAudienceNonce, parseNodeTextarea, partitionSlides, patchChartData, patchChartStyle, patchTableData, patchTextStyle, pendingElementStyles, pickColorByClickFallback, pickSupportedMimeType, planGifFrames, planVideoSegments, pointsToSvgPathD, presenceToCursors, presetByLayout, presetsForCategory, pressuresToWidths, prevVisibleIndex, projectDrawingShapes, promoteNode, provideViewerTheme, radarAngle, radarRingPoints, recordWebm, redistributeColumnWidth, removeAnimation, removeCategory, removeColumn, removeCommentFromList, removeElementAnimation, removeGradientStopPatch, removeNode, removeRow, removeSeries, renderToCanvas, reorderAnimationDown, reorderAnimationUp, replaceInSlides, replaceMatch, requestPresentationFullscreen, resizeElement, resolveCaptionTracks, resolveChartKind, resolveFontVariant, resolveHyperlinkHref, resolveInteractiveElementId, resolveMediaSrc, resolveOleType, resolveParagraphBullet, resolvePresenterNotes, resolveProfileInitial, resolveRegionCode, resolvePalette as resolveSmartArtPalette, resolveThemeCatalogEntry, resolveTransitionDuration, revealedElementStyles, routeOrthogonalConnector, rowStyle, sampleColorFromSlide, sanitizeColor, sanitizeSlideIndex, sanitizeUserName, saveViewerProfile, scanAvailableFonts, searchSlides, seedBroadcastFields, seedHyperlinkDraft, seedPropertiesDraft, seedShareFields, segmentFrameCount, selectValue, sendBackward, sendToBack, sequentialColorScale, serializeWriteBack, seriesColor, setAnimationEmphasis, setAnimationEntrance, setAnimationExit, setAxis, setAxisLogScale, setAxisTitleStyle, setCategoryLabel, setCellText, setColorScheme, setDataLabels, setDataPointExplosion, setDataPointFill, setDataPointLabel, setDelay, setDirection, setDuration, setElementPosition, setGridlineStyle, setLayout, setLegend, setNodeStyle, setNodeText, setRepeatCount, setRepeatMode, setSequence, setSeriesChartType, setSeriesColor, setSeriesErrorBars, setSeriesMarker, setSeriesName, setSeriesTrendline, setSeriesValue, setStyle, setTimingCurve, setTitle, setTrigger, setTriggerShapeId, shapeStylePatch, sheetAfterNavigate, shouldBlockClickAdvance, shouldUseSvgWarp, showDirectionPicker, showsTemplateAffordance, signatureCountLabel, signatureKey, signatureTimestamp, signerName, statusLabel as slideDiffStatusLabel, slideNumberOf, smartArtNodes, paletteColour as smartArtPaletteColour, snapToGridStep, splitCursorCell, splitMergedCell, statusKind, statusLabel$1 as statusLabel, storeAudienceContent, stringFromEvent, strokeColorOf, strokeToInkElement, styleShadowFilter, textAdvancedPatch, textAdvancedStateFromStyle, textAdvancedStateOf, textColorOf, textDirectionPatch, textStyleOf, textStylePatch, themeStyle, themeToCssVars, thumbnailHeight, thumbnailZoom, toggleCommentResolvedInList, toggleNodeBold, toggleNodeItalic, toggleSheet, topLevelNodeCount, transformSelectedTextCase, translationsEn, ungroupElements, updateElementById, updateGlowPatch, updateGradientStopPatch, updateInnerShadowPatch, updateOuterShadowPatch, updateReflectionPatch, vAlignPatch, validatePassword, validatePrintSettings, validateRoomId, valueToY, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, waypointsToPathD, worstStatus, zoomTargetSlideIndex };
|
|
16632
|
+
export type { AccessibilityIssueGroup, AccountAuthConfig, ActionDescriptor, AiCanvasHighlight, AiChatInitState, AiLogChat, AiLogExport, AiLogFormat, AiLogMessage, AiPanelSelectionAccessors, AlignBox, AlignMode, AnimationClickGroup, AnimationGroup, AnnotationInkInsert, AnnotationStroke, AttachTouchGesturesConfig, AwarenessLike, BarRect, Box, BridgeDeps, BroadcastConfig, BroadcastDefaults, CSSProperties, CanvasSize, CellCoord, CellParagraph, CellTextRun, ChartPartRef, ChartPartSelection, ChartValueDrag, ChartViewModel, ClassValue, ClrChangeParams, CollaborationConfig, CollaborationRole, RouterRect as ConnectorObstacle, RouterPoint as ConnectorPoint, ConnectorRouting, CopiedFormat, CornerHandleBox, CustomShow, CustomThemeEdit, DestroyableYDoc, DiagonalBorderInfo, DistributeMode, DocumentProperties, DrawingViewBox, DuotoneFilterDef, EffectsState, EmbeddedFontStyles, EquationTemplate, EyedropperResult, FindOptions, FindResult, FocusChip, FocusSelectionInput, GifFrame, GifFramePlan, GifPlanOptions, GlowState, GradientState, GradientStop$1 as GradientStop, GroupResult, HandleBox, HandoutSlidesPerPage, HyperlinkDraft, InkPoint, InkStroke, InlineEditState, InnerShadowState, LegendEntry, LinePoint, LinearFit, LocalIdentity, LocalStorageUsageSummary, LocaleCatalogEntry, MobileSheetKey, Model3DViewModel, NodeEditBox, NotesSegmentViewModel, ObjectUrlFactory, OleActionModel, OleInfoRow, OuterShadowState, OverallSignatureStatus, PartitionedSlides, PathPoint, PieSliceGeometry, PieSliceOptions, PlotLayout, PlotLayoutOptions, PositionUpdate, PowerPointViewerAPI, PptxAiBridge, PptxAiConfig, PptxAiConnection, PptxAiContextStrategy, PptxAiElementUpdate, PptxAiToolName, PptxAiUIMessage, PptxAiWritePolicy, PresentationTool, PresenterExitMessage, PresenterMessage, PresenterNotes, PresenterSlideChangeMessage, PressureCircle, PrintColorMode, PrintHtmlDocumentOptions as PrintDocumentOptions, PrintOrientation, PrintSettings, PrintSlideRange, PrintWhat, PropertiesDraft, ProposalView, ProviderBundle, ProviderLike, RadarPoint, RecordWebmOptions, RecoveryVersion, ReflectionState, RemoteCursor, SanitizedPresence as RemotePresence, RenderedShape, ReplaceResult, ResizeHandle, ResolvedCaptionTrack, ResolvedFontVariant, ResolvedOleType, RulerTick, ScatterDot, SelectionBox, ShapeStyleChanges, ShareDefaults$1 as ShareDefaults, ShareFormFields, ShortcutReferenceItem, SignatureStatusKind, SlideInspectorTab, SlideTransitionAnimations, SmartArtInsertEvent, SmartArtNodeBounds, SnapBox, SnapGuide, SnapResult, SoftEdgeState, SpeechAlternative, SpeechRecognitionCtor, SpeechRecognitionEventLite, SpeechRecognitionLite, SpeechResult, SpeechResultList, SpeechSupportState, StagedProposal, StrokeToInkElementOpts, StyleMap, SupportedChartKind, SvgAreaGradient, SvgCircle, SvgLine, SvgPath, SvgPolygon, SvgPolyline, SvgPrimitive, SvgRect, SvgText, SwipeDismissDrag, TableBooleanFlag, TableCellSelection, TableCellViewModel, TableRowViewModel, TemplateElementsBySlideId, TextAdvancedChanges, TextAdvancedState, TextStyleChanges, TextWarpCssDef, TextWarpDef, TextWarpPathDef, ThemeCatalogEntry, TimerProgress, ToolbarActionId, TouchGestureCallbacks, TranslationKey, UngroupResult, ValueRange, VideoPlanOptions, VideoSegmentPlan, ViewerMode, ViewerProfile, ViewerSettings, ViewerTheme, ViewerThemeColors, ZoomViewModel };
|