pptx-angular-viewer 2.17.8 → 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import * as pptx_viewer_core from 'pptx-viewer-core';
2
- import { PptxThemePreset, PptxSlide, PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxChartSeries, PptxChartData, PptxElementAnimation, PptxAnimationPreset, PptxAnimationSequence, PptxAnimationTrigger, PptxAnimationTimingCurve, PptxAnimationRepeatMode, PptxAnimationDirection, ParsedTableStyleMap, PptxThemeColorScheme, PptxThemeFontScheme, TablePptxElement, PptxSection, OlePptxElement, TextSegment, TextStyle, PptxTransitionType, PptxSlideTransition, SmartArtColorScheme, PptxSmartArtChrome, PptxSmartArtDrawingShape, SmartArtStyle, PptxSmartArtData, PptxEmbeddedFont, SmartArtLayout, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, ElementActionType, InkPptxElement, PptxComment, PptxChartType, PptxChartBarDirection, PptxTheme, PptxHandler, PptxData, PptxHeaderFooter, PptxSlideMaster, PptxNotesMaster, PptxHandoutMaster, PptxPresentationProperties, PptxCoreProperties, PptxAppProperties, PptxThemeOption, PptxCustomProperty, PptxTagCollection, ParsedSignature, PptxSaveFormat, PptxTableCell, PptxTableCellStyle, PptxTableRow, PptxTableData, PptxCustomShow, MasterViewTab, SvgExportOptions, Model3DPptxElement, ZoomPptxElement, ChartPptxElement, MediaPptxElement, SmartArtPptxElement, MaterialPresetType, Text3DStyle, BevelPresetType, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartMarker, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, SignatureStatus, ElementAction, PptxImageEffects, MediaBookmark, ColorMapAliasKey, ChartAxisEdit, ChartDataPointLabelEdit, PptxChartLegendPosition, PptxChartStyle, ChartAxisTitleStyleEdit, PptxChartMarkerSymbol, ChartGridlineStyleEdit, PptxSmartArtNode, SmartArtLayoutType, PptxSmartArtNodeStyle, MediaCaptionTrack, PptxMediaType } from 'pptx-viewer-core';
3
- export { SWITCHABLE_LAYOUT_TYPES, addSmartArtNode, addSmartArtNodeAsChild, chartDataAddCategory, chartDataAddSeries, chartDataChangeType, chartDataRemoveCategory, chartDataRemoveSeries, chartDataUpdatePoint, demoteSmartArtNode, promoteSmartArtNode, removeSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, updateSmartArtNodeText } from 'pptx-viewer-core';
2
+ import { PptxThemePreset, PptxSlide, PptxElement, ShapeStyle, PptxTextWarpPreset, XmlObject, PptxChartSeries, PptxChartData, PptxElementAnimation, PptxAnimationPreset, PptxAnimationSequence, PptxAnimationTrigger, PptxAnimationTimingCurve, PptxAnimationRepeatMode, PptxAnimationDirection, ParsedTableStyleMap, PptxThemeColorScheme, PptxThemeFontScheme, TablePptxElement, PptxSection, OlePptxElement, TextSegment, TextStyle, PptxTransitionType, PptxSlideTransition, SmartArtColorScheme, PptxSmartArtChrome, PptxSmartArtDrawingShape, SmartArtStyle, PptxSmartArtData, PptxEmbeddedFont, SmartArtLayout, AccessibilityIssueSeverity, AccessibilityIssue, AccessibilityIssueType, AccessibilityCheckOptions, ElementActionType, InkPptxElement, PptxComment, PptxChartType, PptxChartBarDirection, PptxTheme, PptxHandler, PptxData, PptxHeaderFooter, PptxCustomShow, PptxSlideMaster, PptxNotesMaster, PptxHandoutMaster, PptxPresentationProperties, PptxCoreProperties, PptxAppProperties, PptxThemeOption, PptxCustomProperty, PptxTagCollection, ParsedSignature, PptxSaveFormat, PptxTableCell, PptxTableCellStyle, PptxTableRow, PptxTableData, MasterViewTab, SvgExportOptions, Model3DPptxElement, ZoomPptxElement, ChartPptxElement, MediaPptxElement, SmartArtPptxElement, MaterialPresetType, Text3DStyle, BevelPresetType, PptxChartDataLabelOptions, PptxChartAxisType, PptxChartAxisFormatting, PptxChartMarker, PptxChartDataPoint, PptxChartTrendline, PptxChartErrBars, SignatureStatus, ElementAction, PptxImageEffects, MediaBookmark, ColorMapAliasKey, ChartAxisEdit, ChartDataPointLabelEdit, PptxChartLegendPosition, PptxChartStyle, ChartAxisTitleStyleEdit, PptxChartMarkerSymbol, ChartGridlineStyleEdit, PptxSmartArtNode, SmartArtLayoutType, PptxSmartArtNodeStyle, PptxLayoutPreview, MediaCaptionTrack, PptxMediaType } from 'pptx-viewer-core';
3
+ export { GroupResult, SWITCHABLE_LAYOUT_TYPES, UngroupResult, addSmartArtNode, addSmartArtNodeAsChild, chartDataAddCategory, chartDataAddSeries, chartDataChangeType, chartDataRemoveCategory, chartDataRemoveSeries, chartDataUpdatePoint, demoteSmartArtNode, formatAutoNumberMarker as formatAutoNumber, groupElements, promoteSmartArtNode, removeSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, ungroupElements, updateSmartArtNodeText } from 'pptx-viewer-core';
4
4
  import * as _angular_core from '@angular/core';
5
5
  import { Signal, WritableSignal, OnDestroy, OnInit, AfterViewInit, OnChanges, SimpleChanges, InjectionToken, Provider } from '@angular/core';
6
6
  import * as AiSdk from 'ai';
@@ -903,7 +903,7 @@ interface ChartOption<V> {
903
903
  * area / area3D -> polygon fill + polyline
904
904
  * pie / doughnut / pie3D / ofPie -> arc paths
905
905
  * scatter -> circle dots
906
- * bubble -> circle dots sized by a 3rd series
906
+ * bubble -> circle dots sized by each series' own c:bubbleSize
907
907
  * radar / radar3D -> polar polygons + spokes
908
908
  * combo / stock / surface / treemap / waterfall / regionMap -> sibling modules
909
909
  * funnel / sunburst / histogram / boxWhisker -> sibling modules
@@ -914,7 +914,7 @@ interface ChartOption<V> {
914
914
  * area / area3D -> polygon fill + polyline
915
915
  * pie / doughnut / pie3D / ofPie -> arc paths
916
916
  * scatter -> circle dots
917
- * bubble -> circle dots sized by a 3rd series
917
+ * bubble -> circle dots sized by each series' own c:bubbleSize
918
918
  * radar / radar3D -> polar polygons + spokes
919
919
  *
920
920
  * Deferred (fallback box rendered instead):
@@ -1049,6 +1049,14 @@ interface SvgPath {
1049
1049
  strokeWidth?: number;
1050
1050
  opacity?: number;
1051
1051
  part?: ChartPartRef;
1052
+ /**
1053
+ * Hover tooltip / accessible name, projected as an SVG `<title>` child.
1054
+ *
1055
+ * Only the region map sets it today: a choropleth patch carries no label of
1056
+ * its own, so without a tooltip the reader cannot tell which region a colour
1057
+ * belongs to. Projectors that ignore the field simply render no tooltip.
1058
+ */
1059
+ title?: string;
1052
1060
  }
1053
1061
  interface SvgPolyline {
1054
1062
  kind: 'polyline';
@@ -1241,7 +1249,25 @@ interface ScatterDot {
1241
1249
  cx: number;
1242
1250
  cy: number;
1243
1251
  }
1244
- declare function computeScatterDots(values: ReadonlyArray<number>, maxXIndex: number, layout: PlotLayout, range: ValueRange, xValues?: ReadonlyArray<number>): ScatterDot[];
1252
+ /**
1253
+ * The x extent a scatter / bubble plot is drawn against.
1254
+ *
1255
+ * Every `CT_ScatterSer` / `CT_BubbleSer` carries its own `c:xVal`, so the
1256
+ * domain has to be computed ACROSS series before any of them is projected;
1257
+ * letting each series derive its own min/span would stretch every series to
1258
+ * fill the plot and destroy the relationship between them.
1259
+ */
1260
+ interface ScatterXDomain {
1261
+ min: number;
1262
+ span: number;
1263
+ }
1264
+ /**
1265
+ * Union x domain of several series' x values. Returns `undefined` when no
1266
+ * series declares a finite x value, in which case callers fall back to
1267
+ * positioning points by index.
1268
+ */
1269
+ declare function computeScatterXDomain(seriesXValues: ReadonlyArray<ReadonlyArray<number> | undefined>): ScatterXDomain | undefined;
1270
+ declare function computeScatterDots(values: ReadonlyArray<number>, maxXIndex: number, layout: PlotLayout, range: ValueRange, xValues?: ReadonlyArray<number>, xDomain?: ScatterXDomain): ScatterDot[];
1245
1271
  /**
1246
1272
  * Radius of a bubble given its size value, the max size in the chart, and a
1247
1273
  * median radius derived from the plot area. Mirrors `renderBubbleChart` in
@@ -1260,6 +1286,18 @@ declare function computeRadarPoints(values: ReadonlyArray<number>, maxVal: numbe
1260
1286
  /** Points string for a radar gridline ring at radius `rr`. */
1261
1287
  declare function radarRingPoints(cx: number, cy: number, rr: number, catCount: number): string;
1262
1288
  type SupportedChartKind = 'bar' | 'line' | 'area' | 'pie' | 'doughnut' | 'scatter' | 'bubble' | 'radar' | 'combo' | 'stock' | 'surface' | 'treemap' | 'waterfall' | 'regionMap' | 'funnel' | 'sunburst' | 'histogram' | 'boxWhisker';
1289
+ /**
1290
+ * The `preserveAspectRatio` a chart kind's `<svg>` must carry.
1291
+ *
1292
+ * Cartesian charts stretch to fill the element box (`none`); the kinds whose
1293
+ * geometry is round or laid out on a fixed-ratio canvas (pie, doughnut, radar,
1294
+ * and the region map's 1000x500 world outline) keep their proportions instead.
1295
+ *
1296
+ * A pure decision function because all five bindings need the same answer and
1297
+ * four of them had written their own copy of the `kind === 'pie' || ...` chain;
1298
+ * one of the copies (React's) disagreed with the rest.
1299
+ */
1300
+ declare function chartPreserveAspectRatio(kind: SupportedChartKind | 'unsupported'): 'none' | 'xMidYMid meet';
1263
1301
  declare function resolveChartKind(chartType: string): SupportedChartKind | 'unsupported';
1264
1302
  declare function buildChartViewModel(element: PptxElement): ChartViewModel;
1265
1303
  declare function buildFallbackViewModel(width: number, height: number, label: string): ChartViewModel;
@@ -2198,67 +2236,6 @@ declare function computeDistribute(boxes: readonly AlignBox[], mode: DistributeM
2198
2236
  /** The eight resize handles, named by compass direction. */
2199
2237
  type ResizeHandleId = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';
2200
2238
 
2201
- /**
2202
- * group-ops: Pure, immutable group/ungroup operations for the slide element tree.
2203
- *
2204
- * No framework imports. No mutation of inputs. No `any` types. Shared by every
2205
- * binding's editor.
2206
- *
2207
- * Coordinate system (verified from the renderer):
2208
- * - The group <div> is positioned at (group.x, group.y) in slide space.
2209
- * - Each child is positioned at (child.x, child.y) RELATIVE to the group's
2210
- * top-left corner inside that div.
2211
- *
2212
- * Therefore:
2213
- * - grouping -> child slide-absolute -> child group-relative:
2214
- * childRelX = childAbsX - groupX
2215
- * - ungrouping -> child group-relative -> child slide-absolute:
2216
- * childAbsX = childRelX + groupX
2217
- */
2218
-
2219
- interface GroupResult {
2220
- /** New element array for the slide (same length - N + 1). */
2221
- elements: PptxElement[];
2222
- /**
2223
- * The id of the newly-created group element, or `null` when the operation
2224
- * was a no-op (fewer than 2 matching ids found).
2225
- */
2226
- groupId: string | null;
2227
- }
2228
- interface UngroupResult {
2229
- /** New element array for the slide. */
2230
- elements: PptxElement[];
2231
- /** The child ids that were actually applied (one per child, in order). */
2232
- childIds: string[];
2233
- }
2234
- /**
2235
- * Gather the elements whose `id` is in `ids` (preserving their existing array
2236
- * order), compute the union bounding box, build a new `group` element whose
2237
- * `children` are positioned relative to the group's top-left corner, remove
2238
- * the originals, and insert the group where the topmost (lowest-index) grouped
2239
- * element was.
2240
- *
2241
- * Requires >= 2 ids that actually exist in `elements`; otherwise returns the
2242
- * original array unchanged and `groupId: null`.
2243
- *
2244
- * The caller supplies `groupId` for determinism (the service passes its
2245
- * `newId()` result).
2246
- */
2247
- declare function groupElements(elements: readonly PptxElement[], ids: readonly string[], groupId: string): GroupResult;
2248
- /**
2249
- * Find the group element identified by `groupId` in `elements`. If found and
2250
- * it is a `group`, replace it in-place with its children, each converted back
2251
- * to slide-absolute coordinates (childX + groupX, childY + groupY) and
2252
- * assigned a fresh id from the `childIds` array (one per child, in order).
2253
- *
2254
- * If the element is not found or is not a group, returns the original inputs
2255
- * unchanged.
2256
- *
2257
- * The caller supplies `childIds` for determinism (the service passes one
2258
- * `newId()` result per child).
2259
- */
2260
- declare function ungroupElements(elements: readonly PptxElement[], groupId: string, childIds: readonly string[]): UngroupResult;
2261
-
2262
2239
  /**
2263
2240
  * Slide-background style resolution.
2264
2241
  *
@@ -2785,15 +2762,6 @@ declare function generateTicks(slideLengthPx: number, scale: number, unit: Ruler
2785
2762
  */
2786
2763
  declare function rulerDragToGuidePosition(pointerOffsetPx: number, scale: number, slideLengthPx: number): number | null;
2787
2764
 
2788
- /**
2789
- * Render the n-th (1-based) marker for an OOXML auto-numbering scheme.
2790
- *
2791
- * Suffix conventions: `…Period` → `label.`, `…ParenR` → `label)`,
2792
- * `…ParenBoth` → `(label)`, `…Plain` → bare numeral. Unrecognised schemes
2793
- * fall back to `"<n>."`.
2794
- */
2795
- declare function formatAutoNumber(autoNumType: string | undefined, n: number): string;
2796
-
2797
2765
  /**
2798
2766
  * Pure paragraph bullet / list-marker + indent helpers (framework-agnostic).
2799
2767
  *
@@ -3177,6 +3145,31 @@ declare function routeOrthogonalConnector(start: RouterPoint, end: RouterPoint,
3177
3145
  /** Convert an array of waypoints to an SVG path `d` string (comma-separated). */
3178
3146
  declare function waypointsToPathD(waypoints: ReadonlyArray<RouterPoint>): string;
3179
3147
 
3148
+ /**
3149
+ * `connector-endpoints`: attaching and detaching a connector's ends on canvas.
3150
+ *
3151
+ * `connector-reroute` keeps a BOUND connector following its shapes and
3152
+ * `connector-authoring` turns a site-to-site drag into a new connector. Neither
3153
+ * lets the user change an existing connector's bindings, which is what
3154
+ * PowerPoint's two endpoint handles do: drag one onto a shape and it gains an
3155
+ * `a:stCxn` / `a:endCxn` and starts following that shape; drag it onto empty
3156
+ * canvas and the binding is removed and the end stays where it is dropped.
3157
+ *
3158
+ * That was implemented in no binding at all. React shipped a `ConnectorOverlay`
3159
+ * for the site-to-site creation gesture, but nothing ever passed the
3160
+ * `connectorCreationMode` / `onCreateConnector` props that mount it, so the
3161
+ * whole path was unreachable; the other four had no overlay in the first place.
3162
+ *
3163
+ * Everything here is slide-pixel space and free of framework imports: a binding
3164
+ * supplies pointer positions already converted out of screen space, and applies
3165
+ * the returned descriptor.
3166
+ *
3167
+ * @module render/connector-endpoints
3168
+ */
3169
+
3170
+ /** Which end of a connector a gesture is moving. */
3171
+ type ConnectorEndpointKind = 'start' | 'end';
3172
+
3180
3173
  /**
3181
3174
  * Arrow-head marker shapes for connectors.
3182
3175
  *
@@ -3295,6 +3288,84 @@ declare function applyFormatToElement(element: PptxElement, format: CopiedFormat
3295
3288
  /** True when an element exposes formatting fields the painter can copy. */
3296
3289
  declare function hasCopyableFormat(element: PptxElement | null | undefined): boolean;
3297
3290
 
3291
+ /**
3292
+ * `shape-adjustment-model`: the vocabulary the adjust-handle modules share.
3293
+ *
3294
+ * The `a:ahLst` work is split three ways for the repo's file-size budget:
3295
+ * `shape-adjustment-probe` measures the geometry, `shape-adjustment-handles`
3296
+ * derives the handles from those measurements, and `shape-adjustment-solver`
3297
+ * turns a pointer position back into guide values. All three need these types
3298
+ * and the one rule that operates purely on them, so they live here and the
3299
+ * dependency graph stays a DAG rather than a cycle.
3300
+ *
3301
+ * @module render/shape-adjustment-model
3302
+ */
3303
+ /**
3304
+ * How a pointer position becomes a guide value, captured once when the gesture
3305
+ * starts so `pointermove` stays pure arithmetic.
3306
+ */
3307
+ interface ShapeAdjustmentSolver {
3308
+ /** `linear`: the handle slides. `angular`: it swings about {@link centerX}. */
3309
+ kind: 'linear' | 'angular';
3310
+ /** Handle position in element-local px at {@link startValue}. */
3311
+ anchorX: number;
3312
+ anchorY: number;
3313
+ /** Element-local px the handle travels per ONE unit of guide value. */
3314
+ dirX: number;
3315
+ dirY: number;
3316
+ /** Pivot for an angular handle (the shape centre). */
3317
+ centerX: number;
3318
+ centerY: number;
3319
+ /** The guide value the anchor was measured at. */
3320
+ startValue: number;
3321
+ /** Guide-space bounds, taken from the preset's own `pin` clamp. */
3322
+ min: number;
3323
+ max: number;
3324
+ }
3325
+ /** One guide a handle drives. */
3326
+ interface AdjustmentAxisSolver {
3327
+ key: string;
3328
+ solver: ShapeAdjustmentSolver;
3329
+ }
3330
+
3331
+ /**
3332
+ * Shape-adjustment handles: PowerPoint's yellow `a:avLst` diamonds. Pure,
3333
+ * framework-agnostic math shared by all five bindings.
3334
+ *
3335
+ * Owns the adjustment scalar constants and the handle/drag descriptor types so
3336
+ * each binding consumes one copy rather than re-declaring them.
3337
+ *
3338
+ * A preset has ONE handle per adjustable parameter and many presets have
3339
+ * several (`callout3` has eight), so the entry point is
3340
+ * {@link getShapeAdjustmentHandleDescriptors}, returning an array. Placement and
3341
+ * drag scale are measured off the preset geometry by
3342
+ * `shape-adjustment-handles`; this module is the element-level policy around
3343
+ * it (lock check, element type, custom geometry) plus the round-rect helpers
3344
+ * the renderers use for `border-radius`.
3345
+ */
3346
+
3347
+ /** Descriptor for one draggable adjustment handle (the amber diamond). */
3348
+ interface ShapeAdjustmentHandleDescriptor {
3349
+ /** The `a:avLst` guide name this handle writes (`adj`, `adj1`, ...). */
3350
+ key: string;
3351
+ /** Handle x offset in element-local px (origin = element top-left). */
3352
+ left: number;
3353
+ /** Handle y offset in element-local px. */
3354
+ top: number;
3355
+ /**
3356
+ * Current adjustment value in GUIDE units, not a 0-1 fraction. Most presets
3357
+ * range 0..50000 or 0..100000 and the angular ones run to 21,600,000.
3358
+ */
3359
+ value: number;
3360
+ cursor: string;
3361
+ /**
3362
+ * How this handle's drag resolves, measured off the preset geometry: one
3363
+ * entry per `a:avLst` guide it drives (callouts drive two). Absent only for
3364
+ * a caller that built a descriptor by hand.
3365
+ */
3366
+ solvers?: AdjustmentAxisSolver[];
3367
+ }
3368
+
3298
3369
  /**
3299
3370
  * Hyperlink security utilities — URL validation, sanitization, and slide-jump
3300
3371
  * resolution for hyperlink click actions in the viewer. Pure, framework-agnostic
@@ -3757,8 +3828,99 @@ interface SlideTransitionOptionEntry {
3757
3828
  i18nKey: string;
3758
3829
  }
3759
3830
 
3831
+ /**
3832
+ * `ribbon-transitions` - the Transitions ribbon tab expressed as a pure
3833
+ * decision function, so a click on a preset means the same thing in all five
3834
+ * bindings.
3835
+ *
3836
+ * WHY shared: the tab is a set of MODIFIERS (duration, advance-on-click,
3837
+ * advance-after, apply-to-all) that only make sense combined with the preset
3838
+ * the user clicked. Every binding had re-decided that combination for itself,
3839
+ * and two of them (react, vue) never decided it at all: their controls wrote
3840
+ * component-local state and nothing reached the deck, so a picked transition
3841
+ * highlighted in the gallery and the saved `.pptx` carried no `p:transition`.
3842
+ * The preset list itself was five hand-copied arrays.
3843
+ *
3844
+ * The shape here is the repo's standard one: shared owns the DRAFT (what the
3845
+ * controls currently say), the READ (what a slide's transition says the
3846
+ * controls should show) and the CHANGE (the `PptxSlideTransition` fields a
3847
+ * commit writes). A binding renders the draft and hands the change to whatever
3848
+ * slide-mutation path it already has.
3849
+ *
3850
+ * @module render/ribbon-transitions
3851
+ */
3852
+
3853
+ /** One entry of the ribbon's transition gallery. */
3854
+ interface RibbonTransitionPreset {
3855
+ type: PptxTransitionType;
3856
+ labelKey: string;
3857
+ }
3858
+ /** Everything the Transitions tab's controls currently say. */
3859
+ interface RibbonTransitionDraft {
3860
+ /** The highlighted gallery entry. */
3861
+ type: PptxTransitionType;
3862
+ /** Duration field, in seconds. */
3863
+ durationSec: number;
3864
+ /** Advance Slide > On Mouse Click. */
3865
+ advanceOnClick: boolean;
3866
+ /** Advance Slide > After (whether the timed advance is armed at all). */
3867
+ advanceAfter: boolean;
3868
+ /** Advance Slide > After, as the `mm:ss.hh` text the field holds. */
3869
+ advanceAfterText: string;
3870
+ }
3871
+
3872
+ /**
3873
+ * `ribbon-slide-show-options` - the Slide Show tab's Options cluster as a pure
3874
+ * decision function over `PptxPresentationProperties`.
3875
+ *
3876
+ * WHY shared: all five bindings rendered these four checkboxes hard-coded
3877
+ * `checked` with no change handler, so "Use Timings" claimed to be on whether
3878
+ * or not the deck's `p:showPr/@useTimings` said so, and unticking it did
3879
+ * nothing. Two of them (`@useTimings`, `@showNarration`) are real, saved OOXML
3880
+ * attributes that the playback path already reads; deciding the mapping here
3881
+ * means the checkbox state and the show's behaviour cannot disagree.
3882
+ *
3883
+ * Two entries are declared UNSUPPORTED rather than quietly inert. "Keep Slides
3884
+ * Updated" is a co-authoring/Broadcast feature no binding implements, and
3885
+ * "Show Media Controls" is an application preference PowerPoint does not store
3886
+ * in the package at all and nothing in this viewer reads. A control that cannot
3887
+ * do anything renders disabled, because a checkbox that toggles and changes
3888
+ * nothing is worse than one that admits it is unavailable.
3889
+ *
3890
+ * @module render/ribbon-slide-show-options
3891
+ */
3892
+
3893
+ /** The four checkboxes in the Slide Show tab's Options group. */
3894
+ type SlideShowOptionId = 'keepUpdated' | 'useTimings' | 'playNarrations' | 'mediaControls';
3895
+ /** How a binding should render one Options checkbox. */
3896
+ interface SlideShowOptionDescriptor {
3897
+ id: SlideShowOptionId;
3898
+ labelKey: string;
3899
+ /**
3900
+ * No backing state exists, so the control renders disabled. See the module
3901
+ * doc for why each one is here.
3902
+ */
3903
+ unsupported: boolean;
3904
+ }
3905
+
3906
+ /**
3907
+ * Per-node label styling resolved from `PptxSmartArtNode.style` (the overrides
3908
+ * the inspector's node style bar writes).
3909
+ *
3910
+ * Every field is optional and every field has a documented binding default, so
3911
+ * a renderer that ignores them keeps its historic output:
3912
+ * `fontColor` -> `white`, `fontWeight` / `fontStyle` -> unset.
3913
+ */
3914
+ interface RenderedNodeTextStyle {
3915
+ /** Label colour. Default `white`. */
3916
+ fontColor?: string;
3917
+ /** SVG `font-weight` (`700` when the node is bold). Default unset. */
3918
+ fontWeight?: number;
3919
+ /** SVG `font-style`. Default unset. */
3920
+ fontStyle?: 'italic';
3921
+ }
3760
3922
  /** A node rendered as an SVG rect (rounded or flat). */
3761
- interface RenderedRectNode {
3923
+ interface RenderedRectNode extends RenderedNodeTextStyle {
3762
3924
  kind: 'rect';
3763
3925
  key: string;
3764
3926
  x: number;
@@ -3778,7 +3940,7 @@ interface RenderedRectNode {
3778
3940
  textY: number;
3779
3941
  }
3780
3942
  /** A node rendered as an SVG circle. */
3781
- interface RenderedCircleNode {
3943
+ interface RenderedCircleNode extends RenderedNodeTextStyle {
3782
3944
  kind: 'circle';
3783
3945
  key: string;
3784
3946
  cx: number;
@@ -3790,9 +3952,24 @@ interface RenderedCircleNode {
3790
3952
  opacity: number;
3791
3953
  text: string;
3792
3954
  fontSize: number;
3955
+ /**
3956
+ * Label anchor x. Defaults to `cx`; set when the label sits away from the
3957
+ * circle (target leader labels, timeline captions).
3958
+ */
3959
+ textX?: number;
3960
+ /** Label anchor y. Defaults to `cy`. */
3961
+ textY?: number;
3962
+ /** SVG `text-anchor` for the label. Defaults to `middle`. */
3963
+ textAnchor?: 'start' | 'middle' | 'end';
3964
+ /**
3965
+ * How the label block sits relative to `textY`: `middle` centres it (the
3966
+ * default), `bottom` puts the last baseline on `textY` (label above the
3967
+ * node), `top` puts the first line's top on `textY` (label below).
3968
+ */
3969
+ textBaseline?: 'top' | 'middle' | 'bottom';
3793
3970
  }
3794
3971
  /** A node rendered as an SVG polygon (chevron, trapezoid, etc.). */
3795
- interface RenderedPolygonNode {
3972
+ interface RenderedPolygonNode extends RenderedNodeTextStyle {
3796
3973
  kind: 'polygon';
3797
3974
  key: string;
3798
3975
  points: string;
@@ -3808,14 +3985,29 @@ interface RenderedPolygonNode {
3808
3985
  textY: number;
3809
3986
  }
3810
3987
  type RenderedNode = RenderedRectNode | RenderedCircleNode | RenderedPolygonNode;
3811
- /** A connector line between two rendered nodes. */
3988
+ /**
3989
+ * A connector line between two rendered nodes.
3990
+ *
3991
+ * The paint fields are optional and carry the values every binding already
3992
+ * hardcodes, so a renderer that ignores them is unchanged:
3993
+ * `stroke` -> `#94a3b8`, `strokeWidth` -> `1.5`, `opacity` -> `0.5`,
3994
+ * `dash` -> solid.
3995
+ */
3812
3996
  interface RenderedConnector {
3813
3997
  key: string;
3814
3998
  /** SVG path data string. */
3815
3999
  d: string;
4000
+ /** Stroke colour. Default `#94a3b8`. */
4001
+ stroke?: string;
4002
+ /** Stroke width. Default `1.5`. */
4003
+ strokeWidth?: number;
4004
+ /** Stroke opacity. Default `0.5`. */
4005
+ opacity?: number;
4006
+ /** SVG `stroke-dasharray`. Default solid. */
4007
+ dash?: string;
3816
4008
  }
3817
4009
  /** The layout family applied to a SmartArt element. */
3818
- type LayoutFamily = 'list' | 'process' | 'cycle' | 'hierarchy' | 'matrix' | 'radial' | 'pyramid' | 'venn' | 'funnel' | 'target';
4010
+ type LayoutFamily = 'list' | 'process' | 'cycle' | 'hierarchy' | 'matrix' | 'radial' | 'pyramid' | 'venn' | 'funnel' | 'target' | 'gear' | 'timeline' | 'bending';
3819
4011
  /** Complete layout output for a single SmartArt family. */
3820
4012
  interface SmartArtLayoutResult {
3821
4013
  /** Rendered geometry nodes. */
@@ -3879,26 +4071,6 @@ interface SvgTextLine {
3879
4071
  text: string;
3880
4072
  y: number;
3881
4073
  }
3882
- /** Options for {@link centeredSvgTextLines}. */
3883
- interface CenteredSvgTextOptions {
3884
- /**
3885
- * Available width. When given, long lines are wrapped to fit it; when
3886
- * omitted, only authored line breaks split the label.
3887
- */
3888
- maxWidth?: number;
3889
- /** Baseline the block is centred on. Defaults to 0, giving relative offsets. */
3890
- centerY?: number;
3891
- }
3892
- /**
3893
- * Split a label into lines and centre the block vertically.
3894
- *
3895
- * @param text - The label text; `\n` breaks are always honoured.
3896
- * @param fontSize - Font size in the same user units as the result.
3897
- * @param options - See {@link CenteredSvgTextOptions}.
3898
- * @returns One entry per line. Empty text yields a single empty line so callers
3899
- * that always emit a `<tspan>` keep their previous single-line geometry.
3900
- */
3901
- declare function centeredSvgTextLines(text: string, fontSize: number, options?: CenteredSvgTextOptions): SvgTextLine[];
3902
4074
 
3903
4075
  /**
3904
4076
  * smartart-drawing.ts: Drawing-shape view-model helpers for the SmartArt
@@ -4026,6 +4198,58 @@ declare function projectDrawingShapes(elementId: string, shapes: PptxSmartArtDra
4026
4198
  /** Drop-shadow filter string for the given style intensity. */
4027
4199
  declare function styleShadowFilter(style: SmartArtStyle): string | undefined;
4028
4200
 
4201
+ /**
4202
+ * SmartArt fallback-layout paint decisions: where a node's label sits and how a
4203
+ * connector is stroked.
4204
+ *
4205
+ * `RenderedNode` / `RenderedConnector` carry a set of OPTIONAL paint and
4206
+ * placement fields (`fontColor`, `fontWeight`, `fontStyle`, `textX`, `textY`,
4207
+ * `textAnchor`, `textBaseline`; `stroke`, `strokeWidth`, `opacity`, `dash`).
4208
+ * Every one has a documented binding default, so a renderer that ignored them
4209
+ * kept its historic output - which is exactly what four of the five bindings
4210
+ * did, hardcoding `fill="white"` and parking circle labels on `cx`/`cy`. Target
4211
+ * captions and timeline captions then sat on top of their dot instead of beside
4212
+ * or above it.
4213
+ *
4214
+ * Applying those defaults, and stacking a multi-line label for the three
4215
+ * baseline modes, is arithmetic no binding should own a copy of. This module is
4216
+ * the single pure decision function: it returns a framework-neutral descriptor
4217
+ * and each binding does nothing but map it onto `<text>` / `<tspan>` / `<path>`
4218
+ * attributes.
4219
+ *
4220
+ * @module smartart-node-label
4221
+ */
4222
+
4223
+ /** Resolved paint for one fallback-layout connector path. */
4224
+ interface SmartArtConnectorPaint {
4225
+ /** SVG path data, copied straight from the descriptor. */
4226
+ d: string;
4227
+ stroke: string;
4228
+ strokeWidth: number;
4229
+ opacity: number;
4230
+ /** SVG `stroke-dasharray`, or `undefined` for a solid line. */
4231
+ dash: string | undefined;
4232
+ }
4233
+ /** Everything a binding needs to draw one node's label, already decided. */
4234
+ interface SmartArtNodeLabel {
4235
+ /** Whether the node has any label at all; `false` means draw no `<text>`. */
4236
+ visible: boolean;
4237
+ /** X of the text block (also the x of every `<tspan>`). */
4238
+ x: number;
4239
+ /** SVG `text-anchor`. */
4240
+ textAnchor: 'start' | 'middle' | 'end';
4241
+ /** SVG `dominant-baseline` for the block. */
4242
+ dominantBaseline: 'auto' | 'hanging' | 'central';
4243
+ /** Absolute-positioned lines: one `<tspan>` per entry, at its own `y`. */
4244
+ lines: SvgTextLine[];
4245
+ fill: string;
4246
+ fontSize: number;
4247
+ /** SVG `font-weight`, or `undefined` to leave it unset. */
4248
+ fontWeight: number | undefined;
4249
+ /** SVG `font-style`, or `undefined` to leave it unset. */
4250
+ fontStyle: 'italic' | undefined;
4251
+ }
4252
+
4029
4253
  /**
4030
4254
  * inspector-helpers.ts: Pure (no framework) helpers for the inspector panel.
4031
4255
  *
@@ -4337,6 +4561,134 @@ interface CustomShow {
4337
4561
  declare function generateCustomShowId(): string;
4338
4562
  declare function createCustomShow(name: string, slideIds: readonly string[]): CustomShow;
4339
4563
 
4564
+ /**
4565
+ * slide-size.ts: the Design > Slide Size decision function.
4566
+ *
4567
+ * Framework-agnostic: no React, Vue, Angular, Svelte or DOM imports.
4568
+ *
4569
+ * ## Why the dimensions, not the `type`, are the source of truth
4570
+ *
4571
+ * `p:sldSz` carries `@cx`, `@cy` and an optional `@type` (ST_SlideSizeType).
4572
+ * It is tempting to treat `@type` as the selection and the dimensions as a
4573
+ * derived detail. PowerPoint does the opposite. Measured through COM: a deck
4574
+ * whose `p:sldSz` said `type="A4"` while carrying 4:3 dimensions reported
4575
+ * `PageSetup.SlideSize = ppSlideSizeCustom`, and the same deck with A4
4576
+ * dimensions and NO `@type` at all reported `ppSlideSizeA4Paper`. So every
4577
+ * preset below is defined by its EMU pair, and `@type` is written alongside
4578
+ * for fidelity only.
4579
+ *
4580
+ * Each `emuWidth`/`emuHeight` pair here was confirmed by writing it into a
4581
+ * real package and asking PowerPoint what preset it saw (the `ppSlideSize*`
4582
+ * value in the `comValue` field). Two entries are exceptions and say so.
4583
+ */
4584
+ type SlideSizeOrientation = 'landscape' | 'portrait';
4585
+ interface SlideSizeEmu {
4586
+ widthEmu: number;
4587
+ heightEmu: number;
4588
+ /** ST_SlideSizeType token, or `''` for a size with no preset. */
4589
+ type: string;
4590
+ }
4591
+ interface SlideSizePreset {
4592
+ /** `p:sldSz/@type` (ST_SlideSizeType). `custom` is the schema default. */
4593
+ readonly type: string;
4594
+ /** i18n key under `pptx.slideSize.presets`. */
4595
+ readonly labelKey: string;
4596
+ /** Landscape width in EMU. Portrait swaps the pair. */
4597
+ readonly widthEmu: number;
4598
+ /** Landscape height in EMU. */
4599
+ readonly heightEmu: number;
4600
+ /**
4601
+ * The `PpSlideSizeType` value PowerPoint reports for these dimensions,
4602
+ * or `undefined` where that could not be confirmed.
4603
+ */
4604
+ readonly comValue?: number;
4605
+ }
4606
+ interface SlideSizeSelectionDescriptor {
4607
+ /** The effective size, in EMU, that a save should persist. */
4608
+ readonly size: SlideSizeEmu;
4609
+ /** The matching preset, or `undefined` for a custom size. */
4610
+ readonly preset: SlideSizePreset | undefined;
4611
+ readonly orientation: SlideSizeOrientation;
4612
+ /** The canvas size the stage should use for this selection. */
4613
+ readonly canvas: {
4614
+ width: number;
4615
+ height: number;
4616
+ };
4617
+ }
4618
+
4619
+ /**
4620
+ * presentation-file-kinds: the one place that answers "can the viewer open
4621
+ * this file?" and "what should the saved copy be called?".
4622
+ *
4623
+ * ## Why this is a shared decision and not five allow-lists
4624
+ *
4625
+ * The loader reads more formats than any single UI advertises. Legacy binary
4626
+ * `.ppt` (PowerPoint 97-2003) is the sharp example: `PptxHandler.load()` has
4627
+ * detected the OLE compound-file container and converted the binary deck
4628
+ * through the regular pptx pipeline for some time, but the product kept saying
4629
+ * it was unsupported, and a picker that filters the extension out makes a
4630
+ * working loader unreachable in practice. Whenever the loader learns a format,
4631
+ * exactly one list has to change.
4632
+ *
4633
+ * ## Read many, write one
4634
+ *
4635
+ * Input is a superset of output. We READ `.pptx`, `.ppsx`, `.pptm`, `.potx`,
4636
+ * legacy binary `.ppt` and portable `pptx-viewer-json`; we WRITE only the
4637
+ * OpenXML family. That asymmetry is deliberate (PowerPoint itself does the
4638
+ * same: open a 97-2003 deck and Save As offers `.pptx`), and it is why
4639
+ * {@link savedPresentationFileName} always REPLACES the source extension
4640
+ * rather than keeping it. A deck opened as `report.ppt` and saved as
4641
+ * `report.ppt` would be a file whose bytes and whose name disagree, which is
4642
+ * the kind of thing PowerPoint refuses to open.
4643
+ *
4644
+ * This module deliberately imports nothing, so any layer (render, export, a
4645
+ * binding, a host app) can depend on it without risking an import cycle.
4646
+ *
4647
+ * @module render/presentation-file-kinds
4648
+ */
4649
+ /**
4650
+ * Extensions the built-in file picker offers, in the order it offers them.
4651
+ *
4652
+ * `.ppt` is in the list because the loader genuinely handles it, not as a
4653
+ * courtesy: see `packages/core/src/core/ppt/` and the `ppt-import` integration
4654
+ * suite, which asserts a `.ppt` loads to the same model as the `.pptx` it was
4655
+ * exported from.
4656
+ */
4657
+ declare const PRESENTATION_OPEN_EXTENSIONS: readonly [".pptx", ".ppsx", ".pptm", ".potx", ".ppt", ".json"];
4658
+ /** Comma-separated `accept` attribute for a presentation file input. */
4659
+ declare const PPTX_OPEN_ACCEPT: string;
4660
+ /**
4661
+ * True when a picked / dropped file's name looks like something the loader can
4662
+ * open. Use this instead of a hand-rolled `endsWith` chain: a drop handler that
4663
+ * disagrees with the picker's `accept` list is a format that is supported by
4664
+ * mouse but not by drag, which is how `.ppt` stayed invisible.
4665
+ *
4666
+ * Extension-only, by design. The real answer comes from the container sniff in
4667
+ * `PptxHandler.load()`; this is only the cheap pre-filter a drop target needs
4668
+ * before it hands bytes to the loader.
4669
+ */
4670
+ declare function isSupportedPresentationFile(name: string | null | undefined): boolean;
4671
+ /** True for the binary PowerPoint 97-2003 family, which we read but never write. */
4672
+ declare function isLegacyBinaryPresentation(name: string | null | undefined): boolean;
4673
+ /** The formats the save path can produce. Binary `.ppt` is deliberately absent. */
4674
+ type SavedPresentationFormat = 'pptx' | 'ppsx' | 'pptm';
4675
+ /**
4676
+ * The stem of a presentation file name: directories and any loadable extension
4677
+ * removed. `C:\decks\report.ppt` becomes `report`; a name with no recognised
4678
+ * extension is kept whole, so `Untitled Presentation` survives intact rather
4679
+ * than losing everything after its last dot.
4680
+ */
4681
+ declare function presentationBaseName(sourceName: string | null | undefined, fallback?: string): string;
4682
+ /**
4683
+ * The name a saved copy should be offered under: the source stem plus the
4684
+ * extension of the format actually being written.
4685
+ *
4686
+ * This is what turns `report.ppt` into `report.pptx` on Save As. Output is
4687
+ * always an OpenXML package, so keeping the source extension would mislabel
4688
+ * the bytes.
4689
+ */
4690
+ declare function savedPresentationFileName(sourceName: string | null | undefined, format?: SavedPresentationFormat): string;
4691
+
4340
4692
  /**
4341
4693
  * Format an epoch-ms timestamp as a short month / day / time label, e.g.
4342
4694
  * "Jun 25, 02:14", for the version-history panels.
@@ -5535,6 +5887,46 @@ interface ShapePresetDef {
5535
5887
  glyphClass: string;
5536
5888
  }
5537
5889
 
5890
+ /** Identifies a group so bindings can label and style it. */
5891
+ type FontCatalogGroupId = 'theme' | 'embedded' | 'custom' | 'all';
5892
+ /** One selectable font. */
5893
+ interface FontCatalogEntry {
5894
+ /** The family name written into the run's `fontFamily`. */
5895
+ family: string;
5896
+ /**
5897
+ * Which theme slot this family fills, for the "(Headings)" / "(Body)" hint
5898
+ * PowerPoint shows beside its two theme fonts. Absent for other entries.
5899
+ */
5900
+ themeRole?: 'heading' | 'body';
5901
+ }
5902
+ /** A headed group of fonts. */
5903
+ interface FontCatalogGroup {
5904
+ id: FontCatalogGroupId;
5905
+ /** i18n key for the group heading. */
5906
+ labelKey: string;
5907
+ entries: FontCatalogEntry[];
5908
+ }
5909
+
5910
+ /** What the "Embed fonts in the file" toggle should look like and do. */
5911
+ interface FontEmbeddingDescriptor {
5912
+ /** Distinct typeface names the loaded deck currently embeds. */
5913
+ embeddedFamilies: string[];
5914
+ /**
5915
+ * Whether the toggle accepts input. False when the deck embeds nothing,
5916
+ * because turning it on could not produce an embedded font.
5917
+ */
5918
+ interactive: boolean;
5919
+ /**
5920
+ * The position the toggle must START in so that it describes the file that
5921
+ * would be written right now. A deck that arrived with embedded fonts keeps
5922
+ * them on save, so the switch has to read "on" from the outset; the previous
5923
+ * hardcoded `false` said the opposite of what save actually did.
5924
+ */
5925
+ initialEnabled: boolean;
5926
+ /** Present only when `interactive` is false. */
5927
+ disabledReasonKey?: string;
5928
+ }
5929
+
5538
5930
  /**
5539
5931
  * Command-search data for the PowerPoint-style "Tell me what you want to do"
5540
5932
  * search bar. Provides searchable command entries grouped by category, each
@@ -5552,6 +5944,138 @@ interface CommandSearchEntry {
5552
5944
  category: 'format' | 'insert' | 'view' | 'slideShow' | 'design' | 'arrange';
5553
5945
  }
5554
5946
 
5947
+ /**
5948
+ * @fileoverview Who decides whether recovery autosave runs, and how often.
5949
+ *
5950
+ * ## The rule: the host prop is a ceiling, the toggle is a preference
5951
+ *
5952
+ * Two things can speak about autosave, and until now each binding invented its
5953
+ * own answer for what happens when both do:
5954
+ *
5955
+ * - the **host** passes an `autosave` prop. That is a POLICY: the embedder is
5956
+ * stating what its application permits.
5957
+ * - the **user** flips the title-bar AutoSave switch, or File > Options > Save
5958
+ * > AutoSave. That is a PREFERENCE, expressed inside whatever the host allows.
5959
+ *
5960
+ * A preference can never exceed a policy, so:
5961
+ *
5962
+ * - `autosave={false}` turns recovery autosave OFF and takes the toggle away
5963
+ * (`toggleAvailable: false`). A user cannot switch on what the application
5964
+ * forbade, and a switch that silently does nothing is worse than no switch.
5965
+ * - `autosave={true}`, or the prop omitted entirely, PERMITS autosave. The
5966
+ * user's toggle then decides, and it defaults to on.
5967
+ *
5968
+ * The prop is therefore only load-bearing when it is `false`. That is
5969
+ * deliberate: crash recovery that is off by default is crash recovery nobody
5970
+ * has, and the shared options schema already declares `save.autoSave: true` as
5971
+ * the user default, so any other prop default would contradict it. Vue, Svelte
5972
+ * and Vanilla previously defaulted to `false` and React and Angular to `true`;
5973
+ * `true` is the answer, and the three that defaulted off now write recovery
5974
+ * snapshots for hosts that never opted in. Pass `autosave={false}` to opt out.
5975
+ *
5976
+ * Two further gates are not negotiable by anyone, because without them there is
5977
+ * nothing to write or nowhere to write it: editing must be possible at all, and
5978
+ * a `filePath` must be set to key the IndexedDB record.
5979
+ *
5980
+ * ## Cadence follows the same rule
5981
+ *
5982
+ * An explicit `autosaveIntervalMs` prop is a policy and is honoured as given.
5983
+ * Otherwise the cadence is the user's own File > Options > Save > "Save
5984
+ * AutoRecover information every N minutes" (default two minutes), which React
5985
+ * and Angular already respected and the other three ignored.
5986
+ *
5987
+ * ## What the two engine shapes must agree on
5988
+ *
5989
+ * React and Angular POLL on a fixed interval; Vue, Svelte and Vanilla DEBOUNCE
5990
+ * on the edit. Both are legitimate, but a plain debounce has a failure mode a
5991
+ * poll does not: a user who keeps editing keeps re-arming the timer, so it can
5992
+ * defer a snapshot forever, and at the two-minute cadence that is an entire
5993
+ * session of lost work. {@link nextAutosaveDelayMs} caps the debounce so both
5994
+ * shapes make the same promise:
5995
+ *
5996
+ * **a snapshot lands no later than one interval after the first unsaved edit,
5997
+ * and no more often than once per interval.**
5998
+ *
5999
+ * @module render/autosave-policy
6000
+ */
6001
+ /**
6002
+ * Why autosave is not running. `autosave_toggle_off` and `no_file_path` are the
6003
+ * codes the title bar has always understood; the other two are new and fall
6004
+ * back to the generic message in bindings that do not map them.
6005
+ */
6006
+ type AutosaveDisabledReason = 'autosave_host_off' | 'autosave_toggle_off' | 'no_file_path' | 'read_only';
6007
+ interface AutosaveActivation {
6008
+ /** Whether recovery snapshots should actually be written. */
6009
+ readonly active: boolean;
6010
+ /**
6011
+ * Whether the user's AutoSave toggle can change anything. False only when
6012
+ * the host passed `autosave={false}`; the toggle must then render off and
6013
+ * inert rather than pretending to work.
6014
+ */
6015
+ readonly toggleAvailable: boolean;
6016
+ /** Why it is inactive, for the title bar. `undefined` when active. */
6017
+ readonly reason?: AutosaveDisabledReason;
6018
+ }
6019
+
6020
+ /**
6021
+ * @fileoverview "Is there a recoverable snapshot for this deck, and what should
6022
+ * the prompt say?"
6023
+ *
6024
+ * Every binding writes crash-recovery snapshots into the shared IndexedDB store
6025
+ * (`./autosave-store`). Until now only React ever looked for one again, and
6026
+ * even it merely popped the Version History panel open, which never says the
6027
+ * word "recover". In the other four the data was there and nothing surfaced it,
6028
+ * so the feature was invisible: the user closed a crashed tab, reopened the
6029
+ * deck, and silently got the pre-crash version back.
6030
+ *
6031
+ * The decision lives here as one pure function so all five ask the same
6032
+ * questions in the same order, and each binding does nothing but render the
6033
+ * descriptor as its own dialog.
6034
+ *
6035
+ * ## Why a "consumed" marker exists
6036
+ *
6037
+ * A host can restore the snapshot itself: `restoreSessionDeck` prefers a newer
6038
+ * autosave snapshot over the bytes a tab was opened with, which is exactly what
6039
+ * the demo apps do on reload. The viewer is then handed the snapshot's own
6040
+ * bytes and must NOT turn round and offer to recover them, or every refresh
6041
+ * mid-edit would raise a dialog about the content already on screen.
6042
+ *
6043
+ * Timestamps cannot settle that on their own: after a genuine crash the fresh
6044
+ * load is also newer than the snapshot, so "the snapshot is older than this
6045
+ * load" would suppress the one prompt that matters. Instead the consumer of a
6046
+ * snapshot records it, per tab, in `sessionStorage`: surviving a reload (where
6047
+ * the host already restored) but not a new tab (where a crash recovery is
6048
+ * exactly what the user wants to be asked about).
6049
+ *
6050
+ * @module render/autosave-recovery
6051
+ */
6052
+
6053
+ /** Everything a binding needs to render the recovery dialog, and nothing else. */
6054
+ interface AutosaveRecoveryPrompt {
6055
+ /** IndexedDB key the snapshot is stored under (the deck's file path/name). */
6056
+ readonly filePath: string;
6057
+ /** When the snapshot was written (epoch ms). */
6058
+ readonly timestamp: number;
6059
+ /** Snapshot size in bytes. */
6060
+ readonly size: number;
6061
+ /** Whole minutes since it was written, floored at 0. */
6062
+ readonly ageMinutes: number;
6063
+ readonly titleKey: string;
6064
+ readonly messageKey: string;
6065
+ /** `size` is pre-formatted here because byte units are not translated. */
6066
+ readonly messageParams: {
6067
+ readonly file: string;
6068
+ readonly size: string;
6069
+ };
6070
+ /** Relative age, reusing the existing autosave age keys. */
6071
+ readonly ageKey: string;
6072
+ readonly ageParams: {
6073
+ readonly count: number;
6074
+ };
6075
+ readonly restoreKey: string;
6076
+ readonly discardKey: string;
6077
+ }
6078
+
5555
6079
  type BackstagePage = 'home' | 'new' | 'open' | 'info' | 'save' | 'saveAs' | 'print' | 'share' | 'export' | 'close' | 'account' | 'options';
5556
6080
  interface BackstageRecentFile {
5557
6081
  key: string;
@@ -5587,6 +6111,92 @@ interface VirtualizedRange {
5587
6111
  /** Score a presentation password from 0 (very weak) to 4 (very strong). */
5588
6112
  declare function getPasswordStrength(password: string): number;
5589
6113
 
6114
+ /**
6115
+ * deck-save-encryption: the single place that decides whether a deck save
6116
+ * produces a plain OOXML ZIP or an encrypted OLE/CFB container.
6117
+ *
6118
+ * "Encrypt with Password" (File > Info > Protect Presentation) captures a
6119
+ * secret in every binding. Whether that secret reaches the serialiser used to
6120
+ * be re-decided per binding, and four of the five never decided it at all:
6121
+ * they stored the password, showed a "protected" badge, and wrote a plaintext
6122
+ * `.pptx`. That is a security-facing lie, so the decision now lives here as a
6123
+ * pure function and every binding routes its save through
6124
+ * {@link saveDeckWithPassword}.
6125
+ *
6126
+ * The rule is deliberately trivial: a non-empty password means
6127
+ * `PptxHandler.saveEncrypted` (ECMA-376 agile encryption inside an OLE2
6128
+ * compound file with `EncryptionInfo` + `EncryptedPackage` streams), anything
6129
+ * else means `PptxHandler.save` (a `PK\x03\x04` ZIP). What matters is that it
6130
+ * is decided ONCE.
6131
+ *
6132
+ * The one exception is the save PURPOSE (see {@link DeckSavePurpose}): bytes the
6133
+ * viewer writes only so it can read them back itself - the crash-recovery
6134
+ * autosave snapshot, and the re-serialise-then-reload cycle behind "apply
6135
+ * theme" - are never encrypted, because nothing on the way back in has a
6136
+ * password to offer.
6137
+ */
6138
+
6139
+ /**
6140
+ * Why the deck is being serialised, which is a separate question from whether
6141
+ * the user protected it.
6142
+ *
6143
+ * - `user-file` (the default): the bytes leave the viewer as a file. Save,
6144
+ * Save As, Export, the host-facing `getContent()`. Protection applies.
6145
+ * - `recovery-snapshot`: the bytes exist only so the viewer can read them back.
6146
+ * The autosave crash-recovery snapshot in IndexedDB, and the internal
6147
+ * re-serialise-then-reload cycle behind "apply theme". Protection does NOT
6148
+ * apply: these are always written in the clear.
6149
+ *
6150
+ * ## Why a recovery snapshot must stay plaintext
6151
+ *
6152
+ * Nothing that reads a snapshot back has a password to give it.
6153
+ * `readBackstageRecentFile`, `restoreSessionDeck` and the Version History
6154
+ * panel's Restore all hand `record.data` straight to `PptxHandler.load()` with
6155
+ * no `password` option, and an encrypted package refuses to open without one
6156
+ * (`EncryptedFileError`). So an encrypted snapshot is not an inconvenience, it
6157
+ * is unreadable: the moment the user turns on protection their crash-recovery
6158
+ * data is silently destroyed, which is the exact opposite of what autosave is
6159
+ * for.
6160
+ *
6161
+ * Encrypting it "properly" is not available either. Decrypting on recovery
6162
+ * means the key has to outlive the crash the snapshot exists for, so it would
6163
+ * have to sit in the same IndexedDB / localStorage as the snapshot itself,
6164
+ * next to the ciphertext it unlocks. That is not a security boundary, it is
6165
+ * theatre. Prompting the user instead only works if they remember the password
6166
+ * of a deck they lost, which is precisely the moment they will not.
6167
+ *
6168
+ * ## The tradeoff this accepts (deliberately, not by omission)
6169
+ *
6170
+ * A password-protected deck DOES leave its content in cleartext at rest in the
6171
+ * origin's IndexedDB. Anyone with the browser profile, or any script running on
6172
+ * the origin, can read it. What limits the exposure: snapshots are scoped to
6173
+ * the origin and profile, aged out by the store, and clearable from
6174
+ * File > Account > Storage & Privacy (`clearLocalStorageData`). A user who
6175
+ * cannot accept plaintext at rest should switch AutoSave off, which stops the
6176
+ * snapshot being written at all.
6177
+ *
6178
+ * The rejected alternative was "skip autosave entirely while a password is
6179
+ * set". It removes the plaintext, but it also removes crash recovery without
6180
+ * telling anyone, so a crash loses the whole editing session. Losing data
6181
+ * quietly is the failure mode we are fixing, not a fix for it.
6182
+ */
6183
+ type DeckSavePurpose = 'user-file' | 'recovery-snapshot';
6184
+ /**
6185
+ * What the Protect-Presentation UI knows at save time. `password` is the secret
6186
+ * the dialog captured; `passwordProtected` is the separate "is protected" flag
6187
+ * some bindings track for the badge. When the flag is explicitly `false` the
6188
+ * deck saves in the clear even if a stale secret is still around, so removing
6189
+ * a password can never leave the next save encrypted.
6190
+ *
6191
+ * `purpose` defaults to `'user-file'`; see {@link DeckSavePurpose} for why
6192
+ * `'recovery-snapshot'` overrides the password.
6193
+ */
6194
+ interface DeckSaveIntent {
6195
+ password?: string | null;
6196
+ passwordProtected?: boolean;
6197
+ purpose?: DeckSavePurpose;
6198
+ }
6199
+
5590
6200
  /** Framework-neutral viewer preferences surfaced by Settings dialogs. */
5591
6201
  interface ViewerPreferences {
5592
6202
  autoSave: boolean;
@@ -5603,6 +6213,15 @@ interface ShortcutReferenceItem {
5603
6213
  }
5604
6214
  declare const SHORTCUT_REFERENCE_ITEMS: readonly ShortcutReferenceItem[];
5605
6215
 
6216
+ /**
6217
+ * An active custom show's membership. Accepts either key the bindings carry:
6218
+ * `slideRIds` (core's parsed `p:custShow`) or `slideIds`.
6219
+ */
6220
+ interface ShowOrderCustomShow {
6221
+ readonly slideRIds?: readonly string[];
6222
+ readonly slideIds?: readonly string[];
6223
+ }
6224
+
5606
6225
  /** Everything a binding needs to mark one tile. Inert when the slide is visible. */
5607
6226
  interface HiddenSlideCue {
5608
6227
  /** Whether the slide is hidden, for `v-if` / `@if` / `{#if}` gating. */
@@ -5747,6 +6366,15 @@ interface ViewerGeneralOptions {
5747
6366
  userName: string;
5748
6367
  userInitials: string;
5749
6368
  showStartScreen: boolean;
6369
+ /**
6370
+ * Lets the user hand a local font file to the viewer so decks authored
6371
+ * with a font the browser lacks render with the real face.
6372
+ *
6373
+ * Off by default. The registration reads a file the user picks and adds it
6374
+ * to the page's font set for the session, which is a capability a host
6375
+ * embedding the viewer should opt into rather than inherit.
6376
+ */
6377
+ enableCustomFontUpload: boolean;
5750
6378
  }
5751
6379
  interface ViewerProofingOptions {
5752
6380
  autoCorrectTwoInitialCapitals: boolean;
@@ -5763,13 +6391,25 @@ interface ViewerProofingOptions {
5763
6391
  checkSpellingAsYouType: boolean;
5764
6392
  hideSpellingErrors: boolean;
5765
6393
  }
6394
+ /**
6395
+ * File > Options > Save.
6396
+ *
6397
+ * Font embedding deliberately has NO entry here. It is owned by the File >
6398
+ * Fonts panel, whose toggle is the one the save path reads (see
6399
+ * `render/font-embedding`: `describeFontEmbedding` decides the toggle's start
6400
+ * position and whether it can do anything at all, `embeddedFontSaveOptions`
6401
+ * turns it into the `PptxHandler.save()` slice). This group used to carry a
6402
+ * second `embedFonts` boolean, plus an `embedAllFontCharacters` companion, and
6403
+ * neither was read by anything: the pane moved a switch that changed no saved
6404
+ * byte, while the panel next door moved the real one. Two switches for one
6405
+ * setting, one of them lying, is worse than one switch in a less
6406
+ * PowerPoint-shaped place.
6407
+ */
5766
6408
  interface ViewerSaveOptions {
5767
6409
  autoSave: boolean;
5768
6410
  autoRecoverIntervalMinutes: number;
5769
6411
  keepLastAutoRecoveredVersion: boolean;
5770
6412
  defaultExportFormat: DefaultExportFormat;
5771
- embedFonts: boolean;
5772
- embedAllFontCharacters: boolean;
5773
6413
  cacheRetentionDays: number;
5774
6414
  clearCacheOnClose: boolean;
5775
6415
  }
@@ -6007,7 +6647,7 @@ interface ViewerOptionsSection {
6007
6647
  /** Optional explanatory paragraph under the section title. */
6008
6648
  descriptionKey?: string;
6009
6649
  /** Marks a bespoke block a binding renders itself (e.g. the theme picker). */
6010
- special?: 'themePicker' | 'clearCache' | 'shortcutReference';
6650
+ special?: 'themePicker' | 'clearCache' | 'shortcutReference' | 'customFonts';
6011
6651
  controls: readonly ViewerOptionsControl[];
6012
6652
  }
6013
6653
  interface ViewerOptionsTabDefinition {
@@ -6926,6 +7566,43 @@ declare class AiPanelStore {
6926
7566
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AiPanelStore>;
6927
7567
  }
6928
7568
 
7569
+ /** Live host accessors the recovery probe reads (all reactive). */
7570
+ interface AutosaveRecoveryHost {
7571
+ /** IndexedDB key of the open deck. Nothing to look up without one. */
7572
+ readonly filePath: () => string | undefined;
7573
+ /** True while the load pipeline is running. */
7574
+ readonly loading: () => boolean;
7575
+ /** Load error, if any. */
7576
+ readonly error: () => string | null | undefined;
7577
+ /** Slides currently rendered. */
7578
+ readonly slideCount: () => number;
7579
+ /**
7580
+ * Whether the host permits autosave at all (`autosave` input not `false`). A
7581
+ * user who merely switched the toggle off is still offered a pre-crash
7582
+ * snapshot; a host that forbade the feature is not.
7583
+ */
7584
+ readonly autosaveAllowed: () => boolean;
7585
+ /** Load the recovered bytes into the viewer. */
7586
+ readonly restore: (bytes: Uint8Array) => void;
7587
+ }
7588
+ declare class AutosaveRecoveryService {
7589
+ private readonly injector;
7590
+ private readonly destroyRef;
7591
+ /** What the dialog should say, or null when there is nothing to offer. */
7592
+ readonly prompt: _angular_core.WritableSignal<AutosaveRecoveryPrompt | null>;
7593
+ private host;
7594
+ private record;
7595
+ private checked;
7596
+ private destroyed;
7597
+ bind(host: AutosaveRecoveryHost): void;
7598
+ /** The user accepted: load the snapshot bytes. */
7599
+ restore(): void;
7600
+ /** The user declined: drop the snapshot. */
7601
+ discard(): void;
7602
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AutosaveRecoveryService, never>;
7603
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AutosaveRecoveryService>;
7604
+ }
7605
+
6929
7606
  /** Lifecycle status of the autosave engine (mirrors React's `AutosaveStatus`). */
6930
7607
  type AutosaveStatus = {
6931
7608
  state: 'idle';
@@ -6943,7 +7620,11 @@ type AutosaveStatus = {
6943
7620
  };
6944
7621
  /** Live host accessors the autosave engine reads (all reactive). */
6945
7622
  interface AutosaveHost {
6946
- /** Whether autosave is enabled (the title-bar AutoSave toggle). */
7623
+ /**
7624
+ * Whether autosave actually runs: the shared `resolveAutosaveActivation`
7625
+ * verdict (the host's `autosave` input as a ceiling, the title-bar toggle as
7626
+ * the user preference inside it), not the raw toggle.
7627
+ */
6947
7628
  readonly enabled: () => boolean;
6948
7629
  /** File path/name keying the recovery snapshot. Autosave is inert when unset. */
6949
7630
  readonly filePath: () => string | undefined;
@@ -6951,8 +7632,28 @@ interface AutosaveHost {
6951
7632
  readonly isDirty: () => boolean;
6952
7633
  /** Serialise the current edited deck to `.pptx` bytes (null skips the write). */
6953
7634
  readonly serialize: () => Promise<Uint8Array | null>;
6954
- /** Autosave interval in seconds (defaults to {@link AUTOSAVE_DEFAULT_INTERVAL_SECONDS}). */
6955
- readonly intervalSeconds?: () => number;
7635
+ /**
7636
+ * The resolved cadence in milliseconds (shared `resolveAutosaveIntervalMs`:
7637
+ * host `autosaveIntervalMs` input > File > Options > Save AutoRecover
7638
+ * cadence > 120s default).
7639
+ */
7640
+ readonly intervalMs?: () => number;
7641
+ /**
7642
+ * Why autosave is inactive, straight from the shared activation verdict, so
7643
+ * the title bar names the condition the user would have to change first
7644
+ * instead of always blaming the toggle.
7645
+ */
7646
+ readonly disabledReason?: () => AutosaveDisabledReason | undefined;
7647
+ /**
7648
+ * The values a snapshot is built from, read fresh on each tick.
7649
+ *
7650
+ * The dirty flag stays true from the first edit until the user performs a
7651
+ * real save, so on its own it made this timer re-serialize and rewrite an
7652
+ * identical deck every N seconds forever. Vue, Svelte and Vanilla never had
7653
+ * that problem because they debounce on the slides signal being reassigned;
7654
+ * this is the same trigger. Omit it and every tick writes, as before.
7655
+ */
7656
+ readonly changeSources?: () => readonly unknown[];
6956
7657
  }
6957
7658
  declare class AutosaveService {
6958
7659
  private readonly injector;
@@ -6963,6 +7664,7 @@ declare class AutosaveService {
6963
7664
  private host;
6964
7665
  private timer;
6965
7666
  private saving;
7667
+ private lastSnapshot;
6966
7668
  /**
6967
7669
  * Wire the host accessors (called once from the component constructor). An
6968
7670
  * effect re-establishes the interval whenever `enabled`, `filePath`, or the
@@ -6971,6 +7673,11 @@ declare class AutosaveService {
6971
7673
  bind(host: AutosaveHost): void;
6972
7674
  /** Manually trigger an autosave right now (mirrors React's `triggerAutosave`). */
6973
7675
  triggerAutosave(): Promise<void>;
7676
+ /**
7677
+ * `polled` marks the interval tick, which may be skipped as redundant. An
7678
+ * explicit {@link triggerAutosave} is a request, not a poll, and always
7679
+ * writes.
7680
+ */
6974
7681
  private doAutosave;
6975
7682
  private clearTimer;
6976
7683
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AutosaveService, never>;
@@ -7142,6 +7849,11 @@ declare function buildSaveSlides(slides: readonly PptxSlide[], templateElementsB
7142
7849
  * - Normal slide elements: follow `baseInteractive` unchanged.
7143
7850
  * - Template (master/layout) elements: interactive only when `baseInteractive`
7144
7851
  * is set AND `editTemplateMode` is on.
7852
+ * - An element whose authored `a:spLocks/@noSelect` is set is NEVER interactive:
7853
+ * PowerPoint treats a no-select shape as part of the backdrop, so it must not
7854
+ * answer a click hit-test nor be swept up by a marquee. Routing that through
7855
+ * the shared {@link canInteractWithElement} keeps the composition rule
7856
+ * (`noSelect` subsumes every other lock) in one place for all five bindings.
7145
7857
  */
7146
7858
  declare function isElementInteractive(element: PptxElement, baseInteractive: boolean, editTemplateMode: boolean): boolean;
7147
7859
  /**
@@ -7379,6 +8091,44 @@ declare class EditorStateService {
7379
8091
  height?: number;
7380
8092
  rotation?: number;
7381
8093
  }): void;
8094
+ /**
8095
+ * Recompute the endpoints of every connector bound to one of `movedIds` and
8096
+ * write them back, WITHOUT recording history.
8097
+ *
8098
+ * Called at the end of a drag/resize gesture, whose single history snapshot
8099
+ * was already taken by {@link beginTransform}; routing this through `commit()`
8100
+ * instead would push a second, spurious undo step so undoing a move would
8101
+ * take two presses. Both shared helpers no-op on empty input, and
8102
+ * `applyReroutedConnectors` returns the same array reference when there is
8103
+ * nothing to apply, so calling this unconditionally at every gesture end is
8104
+ * free.
8105
+ */
8106
+ rerouteConnectors(slideIndex: number, movedIds: Iterable<string>): void;
8107
+ /**
8108
+ * Set one `a:avLst` adjustment guide on an element during a live
8109
+ * shape-adjustment drag. Non-history for the same reason as
8110
+ * {@link applyTransform}: the gesture's snapshot was taken at its start.
8111
+ *
8112
+ * Merges into any existing `shapeAdjustments` rather than replacing the map,
8113
+ * so a multi-parameter geometry does not lose its other guides to a drag of
8114
+ * one handle.
8115
+ */
8116
+ applyShapeAdjustment(slideIndex: number, id: string, key: string, value: number): void;
8117
+ /**
8118
+ * Merge a whole `a:avLst` patch. A callout's single diamond drives two
8119
+ * guides, so the drag emits a MAP rather than one key/value pair.
8120
+ */
8121
+ applyShapeAdjustments(slideIndex: number, id: string, adjustments: Record<string, number>): void;
8122
+ /**
8123
+ * Commit a connector whose endpoint was re-bound (or unbound) on canvas.
8124
+ *
8125
+ * The WHOLE element is written, not a patch: a DETACHED end has had its
8126
+ * `a:stCxn` / `a:endCxn` key deleted, and merging only the surviving keys
8127
+ * would leave the stale binding behind and the connector would keep chasing
8128
+ * a shape it no longer touches. Takes a history entry, because unlike the
8129
+ * live drag branches this fires once, on release.
8130
+ */
8131
+ applyConnectorEndpoint(slideIndex: number, id: string, element: PptxElement): void;
7382
8132
  undo(): void;
7383
8133
  redo(): void;
7384
8134
  /** Align the selected elements within their group bounds (one history entry). */
@@ -7586,6 +8336,33 @@ declare class LoadContentService {
7586
8336
  readonly parsedData: _angular_core.WritableSignal<PptxData | undefined>;
7587
8337
  /** Slide canvas size in pixels. */
7588
8338
  readonly canvasSize: _angular_core.WritableSignal<CanvasSize>;
8339
+ /**
8340
+ * `p:sldSz` in EMU, seeded from the loaded deck and rewritten by the SLIDE
8341
+ * SIZE card's preset/orientation controls.
8342
+ *
8343
+ * It is deliberately NOT derived from {@link canvasSize}: the pixel size is
8344
+ * an integer, and Ledger (12179300 EMU = 1278.5px) loses its
8345
+ * `ppSlideSizeLedgerPaper` identity the moment it round-trips through one.
8346
+ * The shared `resolveSlideSizeSelection` decides which of the two wins; see
8347
+ * {@link slideSizeSelection}.
8348
+ */
8349
+ readonly slideSizeEmu: _angular_core.WritableSignal<SlideSizeEmu | undefined>;
8350
+ /**
8351
+ * The deck's custom shows (`p:custShow`), in the package's own key space
8352
+ * (`slideRIds` are RELATIONSHIP ids). Seeded on load and carried through
8353
+ * {@link saveSlides}; {@link ViewerCustomShowsService} is the editing surface
8354
+ * over it. Angular used to start this list empty and never write it back, so
8355
+ * the dialog opened blank on a deck with shows and lost anything created in
8356
+ * it.
8357
+ */
8358
+ readonly customShows: _angular_core.WritableSignal<PptxCustomShow[]>;
8359
+ /**
8360
+ * The shared Slide Size decision for the deck as it stands: the EMU size a
8361
+ * save must persist, the preset it matches (if any), its orientation and the
8362
+ * canvas size the stage should use. Read by the SLIDE SIZE inspector card and
8363
+ * by {@link saveSlides}.
8364
+ */
8365
+ readonly slideSizeSelection: _angular_core.Signal<SlideSizeSelectionDescriptor>;
7589
8366
  /** Resolved presentation theme. */
7590
8367
  readonly theme: _angular_core.WritableSignal<PptxTheme | undefined>;
7591
8368
  /** Resolved colour map for the presentation theme (scheme key → hex). */
@@ -7606,6 +8383,24 @@ declare class LoadContentService {
7606
8383
  readonly mediaDataUrls: _angular_core.WritableSignal<Map<string, string>>;
7607
8384
  /** Embedded font data (name + binary) extracted from the presentation. */
7608
8385
  readonly embeddedFonts: _angular_core.WritableSignal<PptxEmbeddedFont[]>;
8386
+ /**
8387
+ * Shared decision behind File > Fonts > "Embed fonts in the file": whether
8388
+ * the toggle accepts input at all, and which position describes the deck
8389
+ * that is loaded. Surfaced by {@link ViewerDialogsService} to the panel.
8390
+ */
8391
+ readonly fontEmbedding: _angular_core.Signal<FontEmbeddingDescriptor>;
8392
+ /**
8393
+ * The toggle's live position, read by {@link saveSlides}. `false` strips
8394
+ * `p:embeddedFontLst`, the `/font` relationships and the `.fntdata` parts;
8395
+ * `true` keeps whatever the deck arrived with (core's default).
8396
+ *
8397
+ * It lives here, next to the fonts it decides the fate of, rather than in
8398
+ * the dialogs service, so the value save reads is seeded by the LOAD and
8399
+ * cannot depend on whether the Fonts panel was ever rendered. Seeded in
8400
+ * {@link load}; the initial `true` covers "no deck yet", where there is
8401
+ * nothing to strip.
8402
+ */
8403
+ readonly embedFonts: _angular_core.WritableSignal<boolean>;
7609
8404
  /** Core document properties from `docProps/core.xml`. */
7610
8405
  readonly coreProperties: _angular_core.WritableSignal<PptxCoreProperties | undefined>;
7611
8406
  /** Extended application properties from `docProps/app.xml`. */
@@ -7643,8 +8438,13 @@ declare class LoadContentService {
7643
8438
  private renderToken;
7644
8439
  private activeBlobUrls;
7645
8440
  constructor();
7646
- /** Serialise the current (loaded) presentation back to `.pptx` bytes. */
7647
- getContent(): Promise<Uint8Array>;
8441
+ /**
8442
+ * Serialise the current (loaded) presentation back to `.pptx` bytes.
8443
+ *
8444
+ * `password` carries the File > Info > Protect Presentation state; when set
8445
+ * the bytes are an encrypted OLE2 container rather than a plain ZIP.
8446
+ */
8447
+ getContent(password?: DeckSaveIntent | string | null): Promise<Uint8Array>;
7648
8448
  /**
7649
8449
  * The loaded presentation's core handler, or `undefined` before a deck is
7650
8450
  * loaded. Exposed for the AI bridge ({@link PptxAiBridge.getHandler}) so the
@@ -7660,7 +8460,7 @@ declare class LoadContentService {
7660
8460
  * survive the save, mirroring React's `useSerialize` save options; core's
7661
8461
  * `PptxDocumentPropertiesUpdater` writes them back into the package.
7662
8462
  */
7663
- saveSlides(slides: readonly PptxSlide[], outputFormat?: PptxSaveFormat, sections?: readonly PptxSection[]): Promise<Uint8Array>;
8463
+ saveSlides(slides: readonly PptxSlide[], outputFormat?: PptxSaveFormat, sections?: readonly PptxSection[], password?: DeckSaveIntent | string | null): Promise<Uint8Array>;
7664
8464
  /** Parse the supplied `.pptx` bytes into the reactive signals. */
7665
8465
  load(raw: Uint8Array | ArrayBuffer | null | undefined): Promise<void>;
7666
8466
  /**
@@ -8098,6 +8898,13 @@ declare function getImageSrc(el: PptxElement, mediaDataUrls: Map<string, string>
8098
8898
  * with plain vitest without TestBed or the Angular compiler.
8099
8899
  */
8100
8900
 
8901
+ /**
8902
+ * Convert a shared `TableCellCss` object (camelCase keys, e.g. from
8903
+ * `cellStyleToCss` or `getTableCellBandStyle`) into an `[ngStyle]`-compatible
8904
+ * kebab-case {@link StyleMap}. Values are stringified so numbers (e.g.
8905
+ * `fontWeight: 700`) apply correctly.
8906
+ */
8907
+ declare function cssObjectToStyleMap(css: Record<string, string | number>): StyleMap;
8101
8908
  /** A single styled text run inside a cell paragraph. */
8102
8909
  interface CellTextRun {
8103
8910
  text: string;
@@ -8107,11 +8914,24 @@ interface CellTextRun {
8107
8914
  /** A single paragraph inside a table cell, made up of one or more `CellTextRun`s. */
8108
8915
  type CellParagraph = CellTextRun[];
8109
8916
  /**
8110
- * Convert a `PptxTableCellStyle` object to an `[ngStyle]`-compatible map.
8917
+ * Convert a `PptxTableCellStyle` to an `[ngStyle]`-compatible map.
8918
+ *
8919
+ * A thin adapter over the shared `cellStyleToCss`, which React, Vue, Svelte
8920
+ * and Vanilla all render tables from; only the key spelling (kebab-case, for
8921
+ * this binding's `StyleMap`) differs, so nothing but the conversion lives
8922
+ * here.
8111
8923
  *
8112
- * Viewer-first subset: fill (solid + gradient via prebuilt CSS string),
8113
- * text styling, per-edge borders, cell margins, vertical alignment, and
8114
- * vertical text direction. Mirrors `cellStyleToCss` in table-render-helpers.ts.
8924
+ * This used to be a hand-ported copy of that function, and the copy had
8925
+ * silently lost four of its features: preset PATTERN fills (a hatched cell
8926
+ * painted a flat colour instead of the tile), `a:tcPr/@anchorCtr`
8927
+ * block-centring, `a:tcPr/@horzOverflow="clip"`, and the `a:cell3D` bevel.
8928
+ * All four render in the other four bindings and now render here too.
8929
+ *
8930
+ * One deliberate behaviour change comes with the swap: shared treats a ZERO
8931
+ * cell margin as "nothing authored" (`if (style.marginLeft)`) where the copy
8932
+ * tested `!== undefined`, so a cell authored `marL="0"` now keeps the
8933
+ * renderer's default 4px padding instead of collapsing to 0. That is what the
8934
+ * other four bindings already did.
8115
8935
  */
8116
8936
  declare function cellStyleToStyleMap(style: PptxTableCellStyle | undefined): StyleMap;
8117
8937
  /** Compute the `[ngStyle]` map for a `<col>` from its width fraction (0-1). */
@@ -8131,10 +8951,17 @@ declare function cellRunStyle(style: PptxTableCellStyle | undefined): StyleMap;
8131
8951
  /**
8132
8952
  * Build a list of `CellParagraph` arrays from a `PptxTableCell`.
8133
8953
  *
8134
- * Splits `cell.text` on `\n` (the parser joins paragraphs with newlines) so each
8135
- * paragraph becomes one styled run. Returns an empty array when the cell is
8136
- * completely empty AND unstyled, signalling the template to fall back to the
8137
- * non-breaking-space placeholder (which keeps the row height).
8954
+ * Prefers `cell.textRuns`, the per-run model core parses out of the cell's
8955
+ * `a:txBody`: a cell reading "Revenue **grew 42%**" is two runs with different
8956
+ * weight, size, colour and typeface, and `cell.text` + the single cell-level
8957
+ * `cell.style` cannot express that. Paragraph markers close the current
8958
+ * paragraph; line-break markers become a `<br>` inside it.
8959
+ *
8960
+ * Falls back to splitting the flat `cell.text` on `\n` for cells the parser
8961
+ * produced no runs for (an empty cell, or a programmatically built table).
8962
+ * Returns an empty array when the cell is completely empty AND unstyled,
8963
+ * signalling the template to fall back to the non-breaking-space placeholder
8964
+ * (which keeps the row height).
8138
8965
  */
8139
8966
  declare function buildCellParagraphs(cell: PptxTableCell): CellParagraph[];
8140
8967
 
@@ -8152,13 +8979,6 @@ declare function buildCellParagraphs(cell: PptxTableCell): CellParagraph[];
8152
8979
  * - packages/react/src/viewer/utils/table-diagonal-borders.tsx (diagonals)
8153
8980
  */
8154
8981
 
8155
- /**
8156
- * Convert a shared `TableCellCss` object (camelCase keys, e.g. from
8157
- * {@link getTableCellBandStyle}) into an `[ngStyle]`-compatible kebab-case
8158
- * {@link StyleMap}. Values are stringified so numbers (e.g. `fontWeight: 700`)
8159
- * apply correctly.
8160
- */
8161
- declare function cssObjectToStyleMap(css: Record<string, string | number>): StyleMap;
8162
8982
  /** A flattened cell descriptor ready for template iteration. */
8163
8983
  interface TableCellViewModel {
8164
8984
  cell: PptxTableCell;
@@ -8246,6 +9066,12 @@ declare class TableRendererComponent {
8246
9066
  private readonly editingCell;
8247
9067
  /** The mounted `<input>` for the active cell edit, if any. */
8248
9068
  private readonly cellInput;
9069
+ /**
9070
+ * `<table>`-level style beyond the font stack: `a:tblPr@rtl` mirrors the
9071
+ * column order for right-to-left decks. Decided in shared so all five
9072
+ * bindings honour the flag identically.
9073
+ */
9074
+ readonly tableRootStyle: _angular_core.Signal<StyleMap>;
8249
9075
  /** Pre-computed `<col>` styles for the colgroup. */
8250
9076
  readonly colStyles: _angular_core.Signal<StyleMap[]>;
8251
9077
  /**
@@ -8364,12 +9190,19 @@ declare class ViewerCanvasEditingService {
8364
9190
  onToggleElementHidden(id: string): void;
8365
9191
  /**
8366
9192
  * Commit a selection-pane inline rename through the history-integrated
8367
- * update path. `name: undefined` clears the authored name (round-trips as a
8368
- * dropped `cNvPr/@name` on save).
9193
+ * update path.
9194
+ *
9195
+ * The name is never `undefined`. The save writer reads `undefined` as "the
9196
+ * model has no opinion" and skips `cNvPr/@name` entirely, which is what
9197
+ * stops a plain round-trip from wiping the names of chart / SmartArt /
9198
+ * graphic frames that parse without one - and which also meant a cleared
9199
+ * box did nothing at all. `@name` is required on
9200
+ * `CT_NonVisualDrawingProps`, so it is never dropped; a clear arrives here
9201
+ * as `''` and is written as `name=""`.
8369
9202
  */
8370
9203
  onSelectionPaneRename(event: {
8371
9204
  id: string;
8372
- name: string | undefined;
9205
+ name: string;
8373
9206
  }): void;
8374
9207
  /**
8375
9208
  * Commit a table cell's inline text edit. Finds the table element on the
@@ -8520,8 +9353,6 @@ declare class ViewerCustomShowsService {
8520
9353
  private readonly loader;
8521
9354
  /** Whether the custom-shows dialog is open. */
8522
9355
  readonly showDialog: _angular_core.WritableSignal<boolean>;
8523
- /** The list of user-defined custom shows for this session. */
8524
- readonly shows: _angular_core.WritableSignal<readonly CustomShow[]>;
8525
9356
  /** The id of the currently active custom show, or null. */
8526
9357
  readonly activeId: _angular_core.WritableSignal<string | null>;
8527
9358
  /** Active-slide index of the host viewer (bound from the component). */
@@ -8539,12 +9370,51 @@ declare class ViewerCustomShowsService {
8539
9370
  activeSlideIndex: () => number;
8540
9371
  liveSlides: () => readonly PptxSlide[];
8541
9372
  }): void;
8542
- /** Custom shows mapped to the core shape consumed by set-up-slide-show. */
9373
+ /** The deck's shows in the dialog's key space (slide ids, not relationship ids). */
9374
+ readonly shows: _angular_core.Signal<readonly CustomShow[]>;
9375
+ /** Custom shows in the core shape consumed by set-up-slide-show and by save. */
8543
9376
  readonly pptxCustomShows: _angular_core.Signal<PptxCustomShow[]>;
8544
- /** Slides shown in presentation mode: the active custom show, else the full (live) deck. */
9377
+ /**
9378
+ * The running show's membership for the shared show-order rule, or `null`
9379
+ * when the whole deck is playing.
9380
+ */
9381
+ readonly activeCustomShow: _angular_core.Signal<ShowOrderCustomShow | null>;
9382
+ /**
9383
+ * Slides handed to the presentation overlay: always the whole (live) deck.
9384
+ * The custom-show subset is applied by the shared show-order rule, which the
9385
+ * overlay runs against {@link activeCustomShow}.
9386
+ */
8545
9387
  readonly presentationSlides: _angular_core.Signal<PptxSlide[]>;
8546
- /** Start index into {@link presentationSlides}: first slide of a custom show, else the active slide. */
9388
+ /**
9389
+ * Start index into {@link presentationSlides}: always the editor's active
9390
+ * slide, which the show itself keeps up to date through `indexChange`.
9391
+ *
9392
+ * It must NOT be pinned to the custom show's first slide. `startIndex` is a
9393
+ * live input, not a constructor argument: the overlay re-adopts it whenever
9394
+ * it changes, and an audience display mirrors the presenter through it. While
9395
+ * this returned the show's first slide it never changed, so the overlay's
9396
+ * "adopt a host-pushed index" effect - which re-runs on the overlay's OWN
9397
+ * index too - snapped every advance straight back to slide 1, and Angular
9398
+ * alone could not leave the first slide of a custom show.
9399
+ *
9400
+ * Where a custom show STARTS is a one-shot seed instead, taken as the show
9401
+ * opens; see {@link showEntryIndex}.
9402
+ */
8547
9403
  readonly presentationStartIndex: _angular_core.Signal<number>;
9404
+ /**
9405
+ * The slide a show should OPEN on: the first slide the active custom show
9406
+ * visits, else the active slide. Read once, when the show starts.
9407
+ */
9408
+ showEntryIndex(): number;
9409
+ /**
9410
+ * Adopt the loaded deck's authored show selection.
9411
+ *
9412
+ * `p:showPr/p:custShow/@id` is PowerPoint's "Set Up Slide Show > Custom show"
9413
+ * radio, and it is authored intent. Every binding parsed it and then played
9414
+ * the whole deck anyway. Called once per load; a manual pick made afterwards
9415
+ * simply overwrites {@link activeId} and wins until the next deck arrives.
9416
+ */
9417
+ seedFromDeck(): void;
8548
9418
  onCreate(show: {
8549
9419
  name: string;
8550
9420
  slideIds: string[];
@@ -8555,11 +9425,8 @@ declare class ViewerCustomShowsService {
8555
9425
  name: string;
8556
9426
  slideIds: string[];
8557
9427
  }): void;
8558
- /**
8559
- * The active custom show's slides, in its defined order, or null when no show
8560
- * is active (or it resolves to nothing). Used to filter the presentation.
8561
- */
8562
- private resolveActiveShowSlides;
9428
+ /** Write an edited list back into the deck's key space (relationship ids). */
9429
+ private commit;
8563
9430
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewerCustomShowsService, never>;
8564
9431
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ViewerCustomShowsService>;
8565
9432
  }
@@ -8589,8 +9456,29 @@ declare class ViewerDialogsService {
8589
9456
  readonly compareResult: _angular_core.WritableSignal<CompareResult | null>;
8590
9457
  /** Font-embedding panel visibility. */
8591
9458
  readonly showFontEmbedding: _angular_core.WritableSignal<boolean>;
8592
- /** Whether embedding used fonts on save is enabled. */
9459
+ /**
9460
+ * The deck this viewer loaded, when one is provided alongside this service
9461
+ * (it always is on the viewer host). Optional so the isolated service tests
9462
+ * and stubbed injectors keep working.
9463
+ */
9464
+ private readonly loader;
9465
+ /**
9466
+ * Whether the save keeps the deck's embedded font data.
9467
+ *
9468
+ * Deliberately the loader's OWN signal rather than a copy: the flag is read
9469
+ * by `LoadContentService.saveSlides`, and it is seeded there from the loaded
9470
+ * deck, so a second source of truth here would let the panel and the save
9471
+ * path disagree. Previously this was a standalone `signal(false)` that
9472
+ * nothing ever read; wiring THAT to save would have stripped the embedded
9473
+ * fonts of every deck that had them.
9474
+ */
8593
9475
  readonly embedFontsEnabled: _angular_core.WritableSignal<boolean>;
9476
+ /**
9477
+ * Whether the toggle accepts input, plus the reason when it does not: the
9478
+ * viewer can keep or strip embedded font data, but cannot manufacture it for
9479
+ * a deck that embeds nothing.
9480
+ */
9481
+ readonly fontEmbedding: _angular_core.Signal<FontEmbeddingDescriptor>;
8594
9482
  /** Version-history side panel visibility. */
8595
9483
  readonly showVersionHistory: _angular_core.WritableSignal<boolean>;
8596
9484
  /** Keyboard-shortcuts help overlay visibility. */
@@ -8719,6 +9607,12 @@ interface FileIOHost {
8719
9607
  readonly sections: () => readonly PptxSection[];
8720
9608
  readonly templateElementsBySlideId: () => TemplateElementsBySlideId;
8721
9609
  readonly emitContentChange: (bytes: Uint8Array) => void;
9610
+ /**
9611
+ * File > Info > Protect Presentation state. When it carries a password every
9612
+ * save below serialises through `saveEncrypted`, so the downloaded file is an
9613
+ * encrypted OLE2 container instead of a plain ZIP.
9614
+ */
9615
+ readonly saveIntent: () => DeckSaveIntent;
8722
9616
  }
8723
9617
  declare class ViewerFileIOService {
8724
9618
  private readonly loader;
@@ -9122,7 +10016,6 @@ interface PresentationModeHost {
9122
10016
  readonly applyRehearsalTimings: (timings: Record<number, number>) => void;
9123
10017
  }
9124
10018
  declare class ViewerPresentationModeService {
9125
- private readonly loader;
9126
10019
  private readonly presenterWindow;
9127
10020
  private readonly customShowsCtl;
9128
10021
  /** Fullscreen presentation-mode overlay visibility. */
@@ -9158,10 +10051,14 @@ declare class ViewerPresentationModeService {
9158
10051
  startRehearsalFromCurrent(): void;
9159
10052
  private startRehearsal;
9160
10053
  /**
9161
- * Map a presentation-overlay index back to the full-deck `activeSlideIndex`.
9162
- * The overlay's index is relative to the (possibly custom-show-filtered)
9163
- * presentation slides, so resolve by slide id to keep the editor selection
9164
- * correct when the show closes.
10054
+ * Adopt a presentation-overlay index as the editor's `activeSlideIndex`.
10055
+ *
10056
+ * No remap is needed (and none may be done): the overlay is handed the WHOLE
10057
+ * live deck and applies custom-show membership as a navigation rule, so its
10058
+ * index is already a deck index. The id-lookup this used to perform existed
10059
+ * only because Angular pre-filtered the slide array to the show's members,
10060
+ * and it resolved against the PRISTINE loaded deck, so it mislanded whenever
10061
+ * the session had inserted or deleted a slide.
9165
10062
  */
9166
10063
  onPresentationIndexChange(index: number): void;
9167
10064
  toggleRehearsalPause(): void;
@@ -9251,7 +10148,7 @@ declare class ViewerZoomService {
9251
10148
  * - React theme context / Vue provide-inject → `themeStyle` CSS vars applied to
9252
10149
  * the root element (app-wide sharing via `provideViewerTheme`).
9253
10150
  */
9254
- declare class PowerPointViewerComponent {
10151
+ declare class PowerPointViewerComponent implements PowerPointViewerAPI {
9255
10152
  /** PowerPoint content as Uint8Array (or ArrayBuffer). */
9256
10153
  readonly content: _angular_core.InputSignal<ArrayBuffer | Uint8Array<ArrayBufferLike> | null>;
9257
10154
  /** Licensed fonts supplied by the host application. No fonts are bundled. */
@@ -9306,6 +10203,29 @@ declare class PowerPointViewerComponent {
9306
10203
  * Mirrors React's `fileName` prop.
9307
10204
  */
9308
10205
  readonly fileName: _angular_core.InputSignal<string | undefined>;
10206
+ /**
10207
+ * Recovery autosave: after an edit the deck is re-serialised (always as a
10208
+ * plain, unencrypted package, because recovery has no password) and stashed
10209
+ * in the shared IndexedDB store keyed by {@link filePath}. It is a crash-
10210
+ * safety net and never replaces the user's real Save: the document stays
10211
+ * dirty. On load, a newer snapshot is offered back through a recovery prompt.
10212
+ *
10213
+ * **The input is a policy ceiling; the title-bar AutoSave toggle is the
10214
+ * user's preference inside it.** `false` turns autosave off and makes the
10215
+ * toggle inert (a user cannot switch on what the application forbade).
10216
+ * `true` or omitted permits it, and the toggle decides, defaulting to on.
10217
+ * Identical in all five bindings; see `resolveAutosaveActivation` in
10218
+ * `pptx-viewer-shared`.
10219
+ *
10220
+ * @default true
10221
+ */
10222
+ readonly autosaveInput: _angular_core.InputSignal<boolean | undefined>;
10223
+ /**
10224
+ * Recovery cadence in milliseconds. An explicit value is a host policy and is
10225
+ * honoured as given; omit it to follow the user's File > Options > Save >
10226
+ * "Save AutoRecover information every N minutes" (two minutes by default).
10227
+ */
10228
+ readonly autosaveIntervalMs: _angular_core.InputSignal<number | undefined>;
9309
10229
  /** Optional real-time collaboration config; when set, connects and shows remote cursors. */
9310
10230
  readonly collaboration: _angular_core.InputSignal<CollaborationConfig | undefined>;
9311
10231
  /**
@@ -9362,7 +10282,7 @@ declare class PowerPointViewerComponent {
9362
10282
  /** Fired when the user edits document properties in the Info dialog. */
9363
10283
  readonly propertiesChange: _angular_core.OutputEmitterRef<Partial<PptxCoreProperties>>;
9364
10284
  /** Fired when the viewer mode changes (preview, edit, present, master). */
9365
- readonly modeChange: _angular_core.OutputEmitterRef<string>;
10285
+ readonly modeChange: _angular_core.OutputEmitterRef<ViewerMode>;
9366
10286
  /** Fired when the zoom level changes. */
9367
10287
  readonly zoomChange: _angular_core.OutputEmitterRef<number>;
9368
10288
  /** Fired when element selection changes. */
@@ -9383,6 +10303,7 @@ declare class PowerPointViewerComponent {
9383
10303
  protected readonly collab: CollaborationService;
9384
10304
  protected readonly accessibility: AccessibilityService;
9385
10305
  protected readonly autosave: AutosaveService;
10306
+ protected readonly autosaveRecovery: AutosaveRecoveryService;
9386
10307
  protected readonly print: PrintService;
9387
10308
  protected readonly mobile: IsMobileService;
9388
10309
  private readonly smartArt3DSvc;
@@ -9471,6 +10392,11 @@ declare class PowerPointViewerComponent {
9471
10392
  protected readonly rootStyle: _angular_core.Signal<Record<string, string>>;
9472
10393
  /** Slide-sorter grid overlay visibility. */
9473
10394
  protected readonly showSorter: _angular_core.WritableSignal<boolean>;
10395
+ /**
10396
+ * Which face the theme gallery opens on: its preset grid, or the theme
10397
+ * editor that Design > Edit Theme names. Set by the two Design commands.
10398
+ */
10399
+ protected readonly themeEditorRequested: _angular_core.WritableSignal<boolean>;
9474
10400
  /**
9475
10401
  * Reading View visibility: the deck at full window size with the editor
9476
10402
  * chrome cut back to a nav bar. Not the slide show (no fullscreen, no
@@ -9485,8 +10411,32 @@ declare class PowerPointViewerComponent {
9485
10411
  protected readonly activeLayoutIndex: _angular_core.WritableSignal<number | null>;
9486
10412
  /** Whether the left slides panel is collapsed (top-bar sidebar toggle). */
9487
10413
  protected readonly slidesPanelCollapsed: _angular_core.WritableSignal<boolean>;
9488
- /** Whether periodic autosave is enabled (title-bar AutoSave toggle; default on). */
10414
+ /**
10415
+ * Whether the editor chrome renders at all.
10416
+ *
10417
+ * A running slide show has no editing chrome, exactly as PowerPoint's does
10418
+ * not: no ribbon, no title bar, no slide rail, no inspector, no notes pane
10419
+ * and no status bar. The show overlay is `position: fixed`, so leaving them
10420
+ * mounted LOOKS the same while keeping every one of those controls in the
10421
+ * tab order and the accessibility tree underneath it - a screen-reader user
10422
+ * would still be walked through the whole editor mid-presentation, and the
10423
+ * "Slide Show" button would still be reachable during the show it starts.
10424
+ * React, Svelte and Vanilla already suppress theirs; `e2e/present-mode.spec.ts`
10425
+ * pins the rule for all five.
10426
+ */
10427
+ protected readonly chromeVisible: _angular_core.Signal<boolean>;
10428
+ /**
10429
+ * The user PREFERENCE (title-bar AutoSave toggle; default on). What actually
10430
+ * runs is {@link autosaveActivation}, which folds in the host's `autosave`
10431
+ * input as a ceiling the preference cannot exceed.
10432
+ */
9489
10433
  protected readonly autosaveEnabled: _angular_core.WritableSignal<boolean>;
10434
+ /** The shared verdict: does autosave run, may the toggle move, and if not why. */
10435
+ protected readonly autosaveActivation: _angular_core.Signal<AutosaveActivation>;
10436
+ /** The recovery offer, or null while a slide show is running. */
10437
+ protected readonly visibleRecoveryPrompt: _angular_core.Signal<AutosaveRecoveryPrompt | null>;
10438
+ /** Flip the AutoSave preference, unless the host forbade autosave outright. */
10439
+ protected toggleAutosave(): void;
9490
10440
  /** Active drawing tool (from the ribbon Draw tab). */
9491
10441
  protected readonly activeDrawTool: _angular_core.WritableSignal<"select" | "pen" | "highlighter" | "eraser" | "freeform">;
9492
10442
  /** Active ink stroke colour. */
@@ -9558,11 +10508,37 @@ declare class PowerPointViewerComponent {
9558
10508
  * When editing, this serialises the editor's edited deck so changes persist.
9559
10509
  */
9560
10510
  getContent(): Promise<Uint8Array>;
10511
+ /**
10512
+ * Design > Browse Themes: toggle the gallery on its preset grid. Clearing
10513
+ * the editor request matters when the theme editor was the last face shown.
10514
+ */
10515
+ protected onBrowseThemes(): void;
10516
+ /**
10517
+ * Design > Edit Theme: the real theme editor lives inside the gallery
10518
+ * overlay, so open the gallery already switched to it (it used to open the
10519
+ * Document Properties dialog, which has nothing to do with themes).
10520
+ */
10521
+ protected onEditTheme(): void;
10522
+ /**
10523
+ * Design > Slide Size: the size control is the inspector's SLIDE SIZE card,
10524
+ * which the deck (no-selection) panel renders. Drop the element selection so
10525
+ * that panel is what the format pane shows, then make sure it is open.
10526
+ */
10527
+ protected onOpenSlideSize(): void;
9561
10528
  protected openMasterView(): void;
9562
10529
  protected closeMasterView(): void;
9563
10530
  protected selectMasterTab(tab: MasterViewTab): void;
10531
+ /**
10532
+ * Format Background for whichever master-view part is selected.
10533
+ *
10534
+ * This used to be a hand-rolled tab/layout walk; the routing decision now
10535
+ * lives in `pptx-viewer-shared` alongside the element write path, so the
10536
+ * five bindings cannot disagree about which part a colour lands on.
10537
+ */
9564
10538
  protected setMasterBackground(backgroundColor: string): void;
9565
10539
  protected setHandoutSlidesPerPage(slidesPerPage: number): void;
10540
+ /** Shape-tree edits made on the Slide Master view's Slides tab. */
10541
+ protected updateSlideMasters(masters: PptxSlideMaster[]): void;
9566
10542
  protected updateNotesMaster(master: PptxNotesMaster): void;
9567
10543
  protected updateHandoutMaster(master: PptxHandoutMaster): void;
9568
10544
  goTo(index: number): void;
@@ -9623,9 +10599,9 @@ declare class PowerPointViewerComponent {
9623
10599
  /** Reset zoom to 100%. */
9624
10600
  zoomReset(): void;
9625
10601
  /** Get the current viewer mode. */
9626
- getMode(): string;
10602
+ getMode(): ViewerMode;
9627
10603
  /** Switch the viewer mode (e.g. 'edit', 'preview', 'present'). */
9628
- setMode(mode: string): void;
10604
+ setMode(mode: ViewerMode): void;
9629
10605
  /** Get the zero-based active slide index. */
9630
10606
  getActiveSlideIndex(): number;
9631
10607
  /** Get the total number of slides. */
@@ -9711,6 +10687,12 @@ declare class PowerPointViewerComponent {
9711
10687
  * autosave engine skips the write. Distinct from {@link getContent}, this does
9712
10688
  * NOT emit `contentChange` (autosave is a background recovery write, not a
9713
10689
  * host-visible save).
10690
+ *
10691
+ * The `recoverySnapshotIntent` is load-bearing, not decoration: it keeps the
10692
+ * snapshot a plain ZIP even when the deck is password protected, because
10693
+ * recovery reopens it with no password. Angular used to get that right only
10694
+ * by omitting the argument, which is one refactor away from silently writing
10695
+ * an unrecoverable encrypted snapshot (the bug React and Vue shipped).
9714
10696
  */
9715
10697
  private serializeForAutosave;
9716
10698
  /** Review ▸ Compare: pick a `.pptx` and diff it against the current deck. */
@@ -9767,7 +10749,7 @@ declare class PowerPointViewerComponent {
9767
10749
  /** Resolve the live slide-stage element within `<main>`. */
9768
10750
  private stageElement;
9769
10751
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PowerPointViewerComponent, never>;
9770
- 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>;
10752
+ 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; }; "autosaveInput": { "alias": "autosave"; "required": false; "isSignal": true; }; "autosaveIntervalMs": { "alias": "autosaveIntervalMs"; "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>;
9771
10753
  }
9772
10754
 
9773
10755
  /** A selected chart sub-part, scoped to the chart element that owns it. */
@@ -9788,6 +10770,28 @@ declare class ChartPartSelectionService {
9788
10770
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ChartPartSelectionService>;
9789
10771
  }
9790
10772
 
10773
+ /**
10774
+ * Families the user registered from a local font file this session
10775
+ * (File > Options > Fonts, off by default).
10776
+ *
10777
+ * A service rather than a chain of inputs because two unrelated parts of the
10778
+ * UI need the same list: the Options pane that adds to it and the Home tab's
10779
+ * font dropdown that offers it. It is also deliberately not persisted, so
10780
+ * nothing survives a reload; the font binary is the user's, not ours to store.
10781
+ *
10782
+ * Provided per viewer instance (alongside the other viewer services), so two
10783
+ * viewers on one page keep their own lists.
10784
+ */
10785
+ declare class CustomFontsService {
10786
+ private readonly families;
10787
+ /** The registered families, in the order they were added. */
10788
+ readonly registeredFamilies: _angular_core.Signal<readonly string[]>;
10789
+ /** Record a newly registered family, ignoring one already present. */
10790
+ register(family: string): void;
10791
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CustomFontsService, never>;
10792
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CustomFontsService>;
10793
+ }
10794
+
9791
10795
  declare class EmbeddedFontsService {
9792
10796
  /** The generated `@font-face` stylesheet text (also injected into `<head>`). */
9793
10797
  readonly fontFaceCss: _angular_core.WritableSignal<string>;
@@ -10017,6 +11021,13 @@ interface KeyboardHost {
10017
11021
  readonly canEdit: () => boolean;
10018
11022
  readonly presenting: () => boolean;
10019
11023
  readonly activeSlideIndex: () => number;
11024
+ /**
11025
+ * A Draw-tab tool other than the selection arrow is armed. The shared keymap
11026
+ * stands its whole editing set down while one is, so a pen stroke is not also
11027
+ * a Delete: every other binding passes this flag and Angular did not, which
11028
+ * left Delete, Ctrl+D and the arrow nudges live over an armed pen.
11029
+ */
11030
+ readonly isDrawing?: () => boolean;
10020
11031
  /** Go back one slide (the arrows page the deck when nothing is selected). */
10021
11032
  readonly goPrev?: () => void;
10022
11033
  /** Go forward one slide. */
@@ -10026,10 +11037,21 @@ declare class ViewerKeyboardService {
10026
11037
  private readonly editor;
10027
11038
  private readonly dialogs;
10028
11039
  private readonly formatPainter;
11040
+ private readonly findReplace;
10029
11041
  private host;
10030
11042
  /** Wire the host accessors (called once from the component constructor). */
10031
11043
  bind(host: KeyboardHost): void;
10032
11044
  handleKeyDown(event: KeyboardEvent): void;
11045
+ /**
11046
+ * Ctrl/Cmd+F toggles the find bar. Angular has shipped the bar since the
11047
+ * find-replace port but had no shortcut for it at all, because the chord was
11048
+ * hand-wired in React and Vue instead of living in the shared keymap.
11049
+ *
11050
+ * The full find-and-replace bar counts as "open" for the toggle: pressing the
11051
+ * chord while it is up closes it rather than swapping it for the smaller find
11052
+ * bar, which is what every other binding's single-panel toggle does.
11053
+ */
11054
+ private toggleFind;
10033
11055
  /**
10034
11056
  * Escape unwinds the transient chrome one layer at a time: an armed format
10035
11057
  * painter first (it is modal over the pointer), then the shortcut cheat
@@ -10138,7 +11160,7 @@ declare class ZoomTargetService {
10138
11160
  * `PowerPointViewerComponent`'s children (ribbon, slide canvas, inspector,
10139
11161
  * dialogs, ...) rely on via `inject()`.
10140
11162
  */
10141
- 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];
11163
+ declare const POWER_POINT_VIEWER_PROVIDERS: readonly [typeof LoadContentService, typeof ExportService, typeof EditorStateService, typeof ChartPartSelectionService, typeof TableSelectionService, typeof EmbeddedFontsService, typeof CollaborationService, typeof CustomFontsService, typeof AccessibilityService, typeof AutosaveService, typeof AutosaveRecoveryService, 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];
10142
11164
 
10143
11165
  /** Lifecycle of the AI session bootstrap. */
10144
11166
  type AiChatInitState = 'checking' | 'unavailable' | 'ready' | 'error';
@@ -10724,6 +11746,16 @@ declare class RibbonComponent {
10724
11746
  readonly drawToolChange: _angular_core.OutputEmitterRef<DrawToolState>;
10725
11747
  /** Emitted when the user clicks "Browse Themes" in the Design tab. */
10726
11748
  readonly toggleThemeGallery: _angular_core.OutputEmitterRef<void>;
11749
+ /**
11750
+ * Emitted when the user clicks "Edit Theme" in the Design tab. The host
11751
+ * opens the theme gallery straight in its theme-editor (customise) mode.
11752
+ */
11753
+ readonly editTheme: _angular_core.OutputEmitterRef<void>;
11754
+ /**
11755
+ * Emitted when the user clicks "Slide Size" in the Design tab. The host
11756
+ * surfaces the inspector's deck panel, which owns the slide-size card.
11757
+ */
11758
+ readonly openSlideSize: _angular_core.OutputEmitterRef<void>;
10727
11759
  /** Emitted when the user toggles the grid overlay in the View tab. */
10728
11760
  readonly toggleGrid: _angular_core.OutputEmitterRef<void>;
10729
11761
  /** Emitted when the user toggles rulers in the View tab. */
@@ -10773,7 +11805,7 @@ declare class RibbonComponent {
10773
11805
  /** Forward the Review proofing toggle to the viewer-owned live state. */
10774
11806
  protected setSpellCheck(enabled: boolean): void;
10775
11807
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonComponent, never>;
10776
- 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; }; "activeSlideHidden": { "alias": "activeSlideHidden"; "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"; "openReadingView": "openReadingView"; "openOutlineView": "openOutlineView"; "openMasterView": "openMasterView"; "toggleNotes": "toggleNotes"; "toggleFormatPainter": "toggleFormatPainter"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "exportJson": "exportJson"; "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"; "openTemplateGallery": "openTemplateGallery"; "openEquationDialog": "openEquationDialog"; "openSetUpSlideShow": "openSetUpSlideShow"; "toggleHideSlide": "toggleHideSlide"; "openCompare": "openCompare"; "openPassword": "openPassword"; "openFontEmbedding": "openFontEmbedding"; "openVersionHistory": "openVersionHistory"; "openShortcuts": "openShortcuts"; "openSettings": "openSettings"; }, never, never, true, never>;
11808
+ 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; }; "activeSlideHidden": { "alias": "activeSlideHidden"; "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"; "openReadingView": "openReadingView"; "openOutlineView": "openOutlineView"; "openMasterView": "openMasterView"; "toggleNotes": "toggleNotes"; "toggleFormatPainter": "toggleFormatPainter"; "exportPng": "exportPng"; "exportPdf": "exportPdf"; "exportGif": "exportGif"; "exportVideo": "exportVideo"; "exportJson": "exportJson"; "copySlideAsImage": "copySlideAsImage"; "replace": "replace"; "toggleInspector": "toggleInspector"; "drawToolChange": "drawToolChange"; "toggleThemeGallery": "toggleThemeGallery"; "editTheme": "editTheme"; "openSlideSize": "openSlideSize"; "toggleGrid": "toggleGrid"; "toggleRulers": "toggleRulers"; "toggleGuides": "toggleGuides"; "toggleSelectionPane": "toggleSelectionPane"; "openCustomShows": "openCustomShows"; "toggleSnapToGrid": "toggleSnapToGrid"; "toggleSnapToShape": "toggleSnapToShape"; "addGuide": "addGuide"; "zoomToFit": "zoomToFit"; "toggleEyedropper": "toggleEyedropper"; "openSmartArtDialog": "openSmartArtDialog"; "openTemplateGallery": "openTemplateGallery"; "openEquationDialog": "openEquationDialog"; "openSetUpSlideShow": "openSetUpSlideShow"; "toggleHideSlide": "toggleHideSlide"; "openCompare": "openCompare"; "openPassword": "openPassword"; "openFontEmbedding": "openFontEmbedding"; "openVersionHistory": "openVersionHistory"; "openShortcuts": "openShortcuts"; "openSettings": "openSettings"; }, never, never, true, never>;
10777
11809
  }
10778
11810
 
10779
11811
  /** The eight resize-handle positions around a selection box. */
@@ -10897,6 +11929,41 @@ declare class RulerGuidesService {
10897
11929
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<RulerGuidesService>;
10898
11930
  }
10899
11931
 
11932
+ /**
11933
+ * shape-adjust-handle.ts: the Angular view-mapping for the SHARED shape
11934
+ * adjustment (`a:avLst`) affordance.
11935
+ *
11936
+ * Angular used to render a generic top-left corner handle for EVERY selected
11937
+ * element whose pointerdown just resized from the south-east corner: a decoy
11938
+ * that neither appeared where an adjustment handle belongs nor adjusted
11939
+ * anything. React, Vue, Svelte and Vanilla all consume
11940
+ * `getShapeAdjustmentHandleDescriptors` instead, which answers an EMPTY list
11941
+ * for any geometry with no adjustable parameter (and for a shape whose
11942
+ * `a:spLocks/@noAdjustHandles` is set), so a handle only exists where
11943
+ * PowerPoint puts one, and a preset with several adjustable parameters gets
11944
+ * one diamond for each.
11945
+ *
11946
+ * This module is the thin descriptor -> stage-box mapping, kept out of
11947
+ * `slide-canvas.component.ts` so the component stays view wiring and the maths
11948
+ * stays unit-testable without Angular.
11949
+ *
11950
+ * @module viewer/shape-adjust-handle
11951
+ */
11952
+
11953
+ /** One adjustment handle's render box in STAGE (unscaled slide) coordinates. */
11954
+ interface AdjustHandleBox {
11955
+ /** The `a:avLst` guide name the drag writes (`shapeAdjustments[key]`). */
11956
+ key: string;
11957
+ left: number;
11958
+ top: number;
11959
+ size: number;
11960
+ cursor: string;
11961
+ /** The element's current adjustment value (guide units), seeding a drag. */
11962
+ value: number;
11963
+ /** The descriptor this box came from; the drag needs its solver. */
11964
+ descriptor: ShapeAdjustmentHandleDescriptor;
11965
+ }
11966
+
10900
11967
  /**
10901
11968
  * Slide-scoped DI context: lets leaf renderers (chart, SmartArt) resolve which
10902
11969
  * slide their canvas is displaying without threading an input through every
@@ -11002,6 +12069,18 @@ declare class SlideCanvasComponent implements SlideContext {
11002
12069
  * e2e selectors from matching multiple elements.
11003
12070
  */
11004
12071
  readonly interactive: _angular_core.InputSignal<boolean>;
12072
+ /**
12073
+ * When true (default), this canvas's elements carry `data-element-id`.
12074
+ *
12075
+ * The miniature surfaces that paint EVERY slide at once (thumbnail rail,
12076
+ * mobile slide sheet, slide sorter, presenter navigator, layout gallery, diff
12077
+ * strip) pass `false`: they otherwise put one node per element PER SLIDE into
12078
+ * the document, so a `[data-element-id]` query resolved a slide that is not
12079
+ * on screen. It is deliberately separate from {@link interactive}, because
12080
+ * the presentation stage is not interactive and still needs its ids (the
12081
+ * morph engine generates keyframe CSS that selects on them).
12082
+ */
12083
+ readonly exposeElementIds: _angular_core.InputSignal<boolean>;
11005
12084
  /**
11006
12085
  * True only for the live presentation stage: slide-content media autoplays.
11007
12086
  * Left false for thumbnails, the sorter and the editor canvas so their media
@@ -11074,6 +12153,34 @@ declare class SlideCanvasComponent implements SlideContext {
11074
12153
  id: string;
11075
12154
  box: Box;
11076
12155
  }>;
12156
+ /**
12157
+ * Emitted once a drag/resize gesture RELEASES, carrying every element id the
12158
+ * gesture moved. The parent uses it to reroute the connectors bound to those
12159
+ * shapes; without it a connector kept pointing at where its shape used to be,
12160
+ * because the drag end simply discarded its state with no model write.
12161
+ */
12162
+ readonly transformEnd: _angular_core.OutputEmitterRef<{
12163
+ ids: readonly string[];
12164
+ }>;
12165
+ /**
12166
+ * Emitted while the shape-adjustment (amber diamond) handle is dragged, with
12167
+ * the `a:avLst` guide name and its new 0..50000 value. Deliberately separate
12168
+ * from {@link transformUpdate}: an adjustment changes the shape's geometry
12169
+ * parameter, never its box.
12170
+ */
12171
+ readonly adjustUpdate: _angular_core.OutputEmitterRef<{
12172
+ id: string;
12173
+ adjustments: Record<string, number>;
12174
+ }>;
12175
+ /**
12176
+ * Emitted when a connector endpoint drag lands: the whole rebuilt connector,
12177
+ * because a DETACHED end has had its `a:stCxn` / `a:endCxn` key deleted and a
12178
+ * merge of the surviving keys would leave the stale one behind.
12179
+ */
12180
+ readonly connectorEndpointUpdate: _angular_core.OutputEmitterRef<{
12181
+ id: string;
12182
+ element: PptxElement;
12183
+ }>;
11077
12184
  /** Emitted on right-click with the element under the cursor (or null). */
11078
12185
  readonly contextMenu: _angular_core.OutputEmitterRef<{
11079
12186
  id: string | null;
@@ -11127,6 +12234,14 @@ declare class SlideCanvasComponent implements SlideContext {
11127
12234
  tableData: PptxTableData;
11128
12235
  }>;
11129
12236
  private drag;
12237
+ /** Live shape-adjustment gesture (amber diamond), or null when idle. */
12238
+ private adjustDrag;
12239
+ /** Live connector-endpoint gesture, in SLIDE px, or null when idle. */
12240
+ protected readonly connectorEndpointDrag: _angular_core.WritableSignal<{
12241
+ kind: ConnectorEndpointKind;
12242
+ x: number;
12243
+ y: number;
12244
+ } | null>;
11130
12245
  private editCancelled;
11131
12246
  private marquee;
11132
12247
  /** Live marquee rectangle (stage coords) while rubber-band selecting. */
@@ -11192,17 +12307,60 @@ declare class SlideCanvasComponent implements SlideContext {
11192
12307
  readonly singleSelected: _angular_core.Signal<(Box & {
11193
12308
  id: string;
11194
12309
  }) | null>;
11195
- /** Resize-handle render boxes (stage coords) for the single selection. */
12310
+ /** Look an element up by id across the slide + template layers. */
12311
+ private elementById;
12312
+ /** The single selected element itself (not just its box), or null. */
12313
+ private readonly singleSelectedElement;
12314
+ /**
12315
+ * Resize-handle render boxes (stage coords) for the single selection. Empty
12316
+ * for an element whose authored `a:spLocks/@noResize` pins its size.
12317
+ */
11196
12318
  readonly handleBoxes: _angular_core.Signal<pptx_angular_viewer.HandleBox[]>;
11197
- /** Rotation-handle box (stage coords) above the single selection, or null. */
12319
+ /**
12320
+ * Rotation-handle box (stage coords) above the single selection, or null (also
12321
+ * null when `a:spLocks/@noRotation` is authored on the element).
12322
+ */
11198
12323
  readonly rotateHandle: _angular_core.Signal<pptx_angular_viewer.CornerHandleBox | null>;
11199
12324
  /**
11200
- * Shape-adjustment-handle box (stage coords) for the single selection, or
11201
- * null. Sits just outside the top-left corner so it never collides with the
11202
- * resize/rotate handles. Selection-only + editable-only, so it vanishes in
11203
- * presentation alongside the rest of the edit chrome.
12325
+ * Shape-adjustment-handle boxes (stage coords) for the single selection.
12326
+ * Position, existence and cursor all come from the SHARED
12327
+ * `getShapeAdjustmentHandleDescriptors`, so a handle appears only for a
12328
+ * geometry that actually has an adjustable parameter, there is ONE per
12329
+ * `a:avLst` guide, and each sits exactly where the other four bindings put
12330
+ * it. Selection-only + editable-only, so they vanish in presentation with
12331
+ * the rest of the chrome.
11204
12332
  */
11205
- readonly adjustHandle: _angular_core.Signal<pptx_angular_viewer.CornerHandleBox | null>;
12333
+ readonly adjustHandles: _angular_core.Signal<AdjustHandleBox[]>;
12334
+ /** The selected connector, when exactly one connector is selected. */
12335
+ private readonly selectedConnector;
12336
+ /**
12337
+ * The two endpoint handles of the selected connector, in stage coords.
12338
+ *
12339
+ * Angular could DRAW a connector but never bind one: nothing in this binding
12340
+ * ever wrote `a:stCxn` / `a:endCxn`, so `connector-reroute` only ever fired
12341
+ * for connectors that arrived already bound from a `.pptx`.
12342
+ */
12343
+ readonly connectorEndpoints: _angular_core.Signal<{
12344
+ left: number;
12345
+ top: number;
12346
+ size: number;
12347
+ kind: ConnectorEndpointKind;
12348
+ x: number;
12349
+ y: number;
12350
+ attached: boolean;
12351
+ }[]>;
12352
+ /** Candidate connection sites, resolved only while an end is in flight. */
12353
+ readonly connectorSiteCandidates: _angular_core.Signal<{
12354
+ key: string;
12355
+ left: number;
12356
+ top: number;
12357
+ size: number;
12358
+ snapped: boolean;
12359
+ }[]>;
12360
+ /** Begin dragging one end of the selected connector. */
12361
+ onConnectorEndpointPointerDown(event: PointerEvent, kind: ConnectorEndpointKind): void;
12362
+ /** Pointer position in SLIDE px (the stage carries the scale as a transform). */
12363
+ private stagePoint;
11206
12364
  /**
11207
12365
  * Resolve the id of the interactive element under a pointer target, or null.
11208
12366
  * See {@link resolveInteractiveElementId}.
@@ -11227,6 +12385,12 @@ declare class SlideCanvasComponent implements SlideContext {
11227
12385
  height: number;
11228
12386
  text: string;
11229
12387
  } | null>;
12388
+ /**
12389
+ * May inline text editing begin on this element? Honours the authored
12390
+ * `a:spLocks/@noTextEdit`, which Angular ignored entirely while the other four
12391
+ * bindings enforced it: a locked caption opened an editable textarea here.
12392
+ */
12393
+ private canTextEdit;
11230
12394
  onDblClick(event: MouseEvent): void;
11231
12395
  onEditorKeydown(event: KeyboardEvent): void;
11232
12396
  /**
@@ -11249,6 +12413,23 @@ declare class SlideCanvasComponent implements SlideContext {
11249
12413
  onContextMenu(event: MouseEvent): void;
11250
12414
  onHandlePointerDown(event: PointerEvent, handle: ResizeHandle): void;
11251
12415
  onRotatePointerDown(event: PointerEvent): void;
12416
+ /**
12417
+ * Begin a shape-adjustment gesture on the amber diamond. Captures the shared
12418
+ * {@link ShapeAdjustmentDragState} so every subsequent pointer move resolves
12419
+ * through `getDraggedShapeAdjustmentValue` rather than the resize pipeline
12420
+ * this handle used to be wired to.
12421
+ */
12422
+ onAdjustPointerDown(event: PointerEvent, handle: AdjustHandleBox): void;
12423
+ /**
12424
+ * Keyboard resize from a focused handle.
12425
+ *
12426
+ * The step comes from the shared `editorNudgeDelta`, the same function the
12427
+ * arrow keys nudge with, because a hand-rolled copy of it here is how the two
12428
+ * gestures end up disagreeing: this one carried its own `shiftKey ? 10 : 1`
12429
+ * literal, so a change to the shared step (which has already been wrong once,
12430
+ * at 2/20 in two bindings) would have moved the nudge and left the keyboard
12431
+ * resize behind.
12432
+ */
11252
12433
  onResizeHandleKeydown(event: KeyboardEvent, handle: ResizeHandle): void;
11253
12434
  onRotateHandleKeydown(event: KeyboardEvent): void;
11254
12435
  onPointerMove(event: PointerEvent): void;
@@ -11301,7 +12482,7 @@ declare class SlideCanvasComponent implements SlideContext {
11301
12482
  } | null>;
11302
12483
  readonly stageStyle: _angular_core.Signal<StyleMap>;
11303
12484
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideCanvasComponent, never>;
11304
- 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; }; "rulerUnit": { "alias": "rulerUnit"; "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; }; "transparentBackground": { "alias": "transparentBackground"; "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"; "textInput": "textInput"; "textCancel": "textCancel"; "textFormat": "textFormat"; "rotateUpdate": "rotateUpdate"; "marqueeSelect": "marqueeSelect"; "inkStrokeComplete": "inkStrokeComplete"; "eraserHit": "eraserHit"; "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, ["*"], true, never>;
12485
+ 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; }; "rulerUnit": { "alias": "rulerUnit"; "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; }; "transparentBackground": { "alias": "transparentBackground"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "exposeElementIds": { "alias": "exposeElementIds"; "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"; "transformEnd": "transformEnd"; "adjustUpdate": "adjustUpdate"; "connectorEndpointUpdate": "connectorEndpointUpdate"; "contextMenu": "contextMenu"; "textEditStart": "textEditStart"; "textCommit": "textCommit"; "textInput": "textInput"; "textCancel": "textCancel"; "textFormat": "textFormat"; "rotateUpdate": "rotateUpdate"; "marqueeSelect": "marqueeSelect"; "inkStrokeComplete": "inkStrokeComplete"; "eraserHit": "eraserHit"; "cellCommit": "cellCommit"; "tableChange": "tableChange"; }, never, ["*"], true, never>;
11305
12486
  }
11306
12487
 
11307
12488
  /**
@@ -11319,6 +12500,77 @@ interface SoftEdgeFilterDef {
11319
12500
  radius: number;
11320
12501
  }
11321
12502
 
12503
+ /**
12504
+ * Angular's paragraph view model, built from the SHARED `buildParagraphs`.
12505
+ *
12506
+ * This module replaces the ~190-line hand-ported paragraph builder that used to
12507
+ * live inside `element-renderer.component.ts` (self-documented as "hand-ported
12508
+ * from `buildParagraphs`"). That copy had already drifted: it applied a
12509
+ * paragraph's bullet unconditionally, with none of shared's "suppress the
12510
+ * bullet on a paragraph with no visible text" rule, so a whitespace-only or
12511
+ * marker-only paragraph painted a stray bullet here and nothing elsewhere.
12512
+ *
12513
+ * It also replaces the segment walk that used to follow the shared call. Runs
12514
+ * carry their own `hyperlink` and `equation` now (see `text-run-meta`), so the
12515
+ * walk that re-attached those two facts by matching each run's characters back
12516
+ * onto the segment it came from is gone, and Vue, Svelte and Vanilla render
12517
+ * both from the same model instead of dropping them.
12518
+ *
12519
+ * What is left here is a pure rename: shared's neutral field names onto the
12520
+ * ones this binding's template already binds.
12521
+ */
12522
+ /** A single rendered run inside an Angular paragraph. */
12523
+ interface TextRun {
12524
+ text: string;
12525
+ style: StyleMap;
12526
+ /** Safe `href` when this run carries a renderable hyperlink. */
12527
+ href?: string;
12528
+ /** Hyperlink tooltip / title text. */
12529
+ tooltip?: string;
12530
+ /** Parsed OMML for an inline equation run (rendered as MathML). */
12531
+ equationXml?: Record<string, unknown>;
12532
+ /** Optional equation number for numbered equations. */
12533
+ equationNumber?: string;
12534
+ /** `a:ruby` phonetic guide (furigana / pinyin) rendered above this run. */
12535
+ rubyText?: string;
12536
+ /** `[ngStyle]` map for the `<rt>` annotation (size / family / alignment). */
12537
+ rubyStyle?: StyleMap;
12538
+ }
12539
+ /** A rendered paragraph: runs plus bullet + indent + spacing metadata. */
12540
+ interface Paragraph {
12541
+ runs: TextRun[];
12542
+ /** Bullet / number marker text, when this paragraph is a list item. */
12543
+ bulletMarker?: string;
12544
+ /** Resolved picture marker, or metadata for its accessible glyph fallback. */
12545
+ bulletPicture?: PictureBulletMarker;
12546
+ /** `[ngStyle]` map for the bullet marker (colour / font / hang width). */
12547
+ bulletStyle: StyleMap;
12548
+ /** Left indent in px (hanging-indent layout). */
12549
+ indentPx: number;
12550
+ /** `text-indent` in px (first-line / hanging indent), when authored. */
12551
+ textIndentPx?: number;
12552
+ /**
12553
+ * True when the paragraph has no runs and no bullet: an authored blank line
12554
+ * (`<a:p><a:endParaRPr/></a:p>`), which PowerPoint gives a full line box.
12555
+ * The template renders a `<br>` for it so the gap survives (issue #131).
12556
+ */
12557
+ isEmpty?: boolean;
12558
+ /** Per-paragraph `line-height` from this paragraph's own `a:lnSpc`. */
12559
+ lineHeight?: number | string;
12560
+ /** `margin-top` in px from `a:spcBef` (space before), when overridden. */
12561
+ spaceBeforePx?: number;
12562
+ /** `margin-bottom` in px from `a:spcAft` (space after), when overridden. */
12563
+ spaceAfterPx?: number;
12564
+ /** `font-size` in px re-basing the paragraph's CSS line boxes onto its runs. */
12565
+ strutFontSizePx?: number;
12566
+ /**
12567
+ * This paragraph's own `text-align` / BiDi `direction` / kinsoku line-break
12568
+ * rules, when it overrides the body's. Bound with `[ngStyle]` under the
12569
+ * explicit geometry bindings, which win.
12570
+ */
12571
+ paragraphStyle?: StyleMap;
12572
+ }
12573
+
11322
12574
  /**
11323
12575
  * Text-warp (WordArt) descriptor resolver for the Angular viewer.
11324
12576
  *
@@ -11432,53 +12684,6 @@ type TextWarpDef = TextWarpPathDef | TextWarpCssDef;
11432
12684
  */
11433
12685
  declare function getTextWarp(element: PptxElement, fieldContext?: FieldSubstitutionContext): TextWarpDef | undefined;
11434
12686
 
11435
- interface TextRun {
11436
- text: string;
11437
- style: StyleMap;
11438
- /** Safe `href` when this run carries a renderable hyperlink. */
11439
- href?: string;
11440
- /** Hyperlink tooltip / title text. */
11441
- tooltip?: string;
11442
- /** Parsed OMML for an inline equation run (rendered as MathML). */
11443
- equationXml?: Record<string, unknown>;
11444
- /** Optional equation number for numbered equations. */
11445
- equationNumber?: string;
11446
- }
11447
- interface Paragraph {
11448
- runs: TextRun[];
11449
- /** Bullet / number marker text, when this paragraph is a list item. */
11450
- bulletMarker?: string;
11451
- /** Resolved picture marker, or metadata for its accessible glyph fallback. */
11452
- bulletPicture?: PictureBulletMarker;
11453
- /** `[ngStyle]` map for the bullet marker (colour / font). */
11454
- bulletStyle: StyleMap;
11455
- /** Left indent in px derived from the paragraph outline level. */
11456
- indentPx: number;
11457
- /** `text-indent` in px (first-line / hanging indent), when authored. */
11458
- textIndentPx?: number;
11459
- /**
11460
- * True when the paragraph has no runs and no bullet: an authored blank line
11461
- * (`<a:p><a:endParaRPr/></a:p>`), which PowerPoint gives a full line box.
11462
- * The template renders a `<br>` for it so the gap survives (issue #131).
11463
- */
11464
- isEmpty?: boolean;
11465
- /**
11466
- * Per-paragraph `line-height` from this paragraph's own `a:lnSpc`: a unitless
11467
- * multiplier (`a:spcPct`) or a `"<n>pt"` string (`a:spcPts`). Undefined when
11468
- * the paragraph does not override the body-level line-height.
11469
- */
11470
- lineHeight?: number | string;
11471
- /** `margin-top` in px from `a:spcBef` (space before), when overridden. */
11472
- spaceBeforePx?: number;
11473
- /** `margin-bottom` in px from `a:spcAft` (space after), when overridden. */
11474
- spaceAfterPx?: number;
11475
- /**
11476
- * `font-size` in px set on the paragraph so its CSS line boxes are built
11477
- * from its own runs rather than the text body default. Mirrors the shared
11478
- * `RenderParagraph.strutFontSizePx`; see `resolveParagraphStrutFontSize`.
11479
- */
11480
- strutFontSizePx?: number;
11481
- }
11482
12687
  /**
11483
12688
  * ElementRendererComponent: Angular port of the React `ElementRenderer.tsx`
11484
12689
  * and the Vue `ElementRenderer.vue`.
@@ -11546,6 +12751,27 @@ declare class ElementRendererComponent {
11546
12751
  * element contract", not "editable right now"), matching the other bindings.
11547
12752
  */
11548
12753
  readonly marked: _angular_core.InputSignal<boolean>;
12754
+ /**
12755
+ * When true (default), the rendered node carries `data-element-id`.
12756
+ *
12757
+ * Turned OFF by the miniature surfaces that paint EVERY slide at once
12758
+ * (thumbnail rail, mobile slide sheet, slide sorter, presenter navigator,
12759
+ * layout gallery, diff strip). Those put one node per element per slide into
12760
+ * the document, so the id of an element on slide 1 was addressable while
12761
+ * slide 3 was on screen, and every framework-neutral `[data-element-id]`
12762
+ * query resolved the wrong slide. React solved the same hazard by giving
12763
+ * thumbnails a separate `StaticElementRenderer` that stamps no id at all
12764
+ * ("exposing their ids there would put two nodes with the same id in the
12765
+ * document"); this input is Angular's equivalent, since it reuses the live
12766
+ * renderer for its miniatures.
12767
+ *
12768
+ * Distinct from {@link interactive}: the presentation stage is not
12769
+ * interactive but MUST keep its ids, because the morph engine's generated
12770
+ * keyframe CSS selects on them.
12771
+ */
12772
+ readonly exposeElementId: _angular_core.InputSignal<boolean>;
12773
+ /** `data-element-id` for this element, or null on a miniature surface. */
12774
+ readonly elementIdAttr: _angular_core.Signal<string | null>;
11549
12775
  /** Whether this element's root carries `data-pptx-element="true"`. */
11550
12776
  readonly elementMarked: _angular_core.Signal<boolean>;
11551
12777
  /**
@@ -11685,10 +12911,15 @@ declare class ElementRendererComponent {
11685
12911
  readonly warpedTextStyle: _angular_core.Signal<StyleMap>;
11686
12912
  readonly children: _angular_core.Signal<PptxElement[]>;
11687
12913
  /**
11688
- * This group's own fill, handed to `a:grpFill` children as their
11689
- * `parentGroupFill`. Undefined for non-group elements. Mirrors the shared
11690
- * `getGroupChildParentFill` helper (inlined here so the Angular binding does
11691
- * not depend on a shared symbol that is only vendored at build time).
12914
+ * The fill handed to this group's `a:grpFill` children as their
12915
+ * `parentGroupFill`; undefined for non-group elements.
12916
+ *
12917
+ * The shared helper, not a hand-inlined copy: the inlined one returned this
12918
+ * group's own fill only, and `a:grpFill` resolves against the nearest
12919
+ * ANCESTOR that has a fill, so a shape inside a fill-less nested group came
12920
+ * out transparent. (The old copy justified itself with "shared is only
12921
+ * vendored at build time", but this component already imports a dozen shared
12922
+ * symbols from the vendored barrel.)
11692
12923
  */
11693
12924
  readonly childParentGroupFill: _angular_core.Signal<ShapeStyle | undefined>;
11694
12925
  readonly isShapeLike: _angular_core.Signal<boolean>;
@@ -11697,7 +12928,7 @@ declare class ElementRendererComponent {
11697
12928
  readonly hasText: _angular_core.Signal<boolean>;
11698
12929
  readonly placeholderLabel: _angular_core.Signal<any>;
11699
12930
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementRendererComponent, never>;
11700
- 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; }; "marked": { "alias": "marked"; "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; }; "slideElements": { "alias": "slideElements"; "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>;
12931
+ 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; }; "marked": { "alias": "marked"; "required": false; "isSignal": true; }; "exposeElementId": { "alias": "exposeElementId"; "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; }; "slideElements": { "alias": "slideElements"; "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>;
11701
12932
  }
11702
12933
 
11703
12934
  /**
@@ -11734,6 +12965,15 @@ declare class ConnectorRendererComponent {
11734
12965
  readonly interactive: _angular_core.InputSignal<boolean>;
11735
12966
  /** Keep the data-pptx-element marker on interaction-locked template elements. */
11736
12967
  readonly marked: _angular_core.InputSignal<boolean>;
12968
+ /**
12969
+ * When true (default), the rendered node carries `data-element-id`. The
12970
+ * miniature surfaces that paint every slide at once turn it off so one
12971
+ * element id resolves to exactly one node in the document; see
12972
+ * `ElementRendererComponent.exposeElementId`.
12973
+ */
12974
+ readonly exposeElementId: _angular_core.InputSignal<boolean>;
12975
+ /** `data-element-id` for this element, or null on a miniature surface. */
12976
+ readonly elementIdAttr: _angular_core.Signal<string | null>;
11737
12977
  /**
11738
12978
  * Native-animation playback state. When an active `p:animClr` colour animation
11739
12979
  * targets the stroke (`animatesStroke`), the SVG stroke + arrowheads paint
@@ -11767,7 +13007,7 @@ declare class ConnectorRendererComponent {
11767
13007
  readonly connectorSegments: _angular_core.Signal<TextSegment[] | undefined>;
11768
13008
  readonly connectorTextStyle: _angular_core.Signal<TextStyle | undefined>;
11769
13009
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConnectorRendererComponent, never>;
11770
- 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; }; "marked": { "alias": "marked"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
13010
+ 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; }; "marked": { "alias": "marked"; "required": false; "isSignal": true; }; "exposeElementId": { "alias": "exposeElementId"; "required": false; "isSignal": true; }; "animationState": { "alias": "animationState"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
11771
13011
  }
11772
13012
  /** One parallel stroke of a (possibly compound) connector line. */
11773
13013
  interface ConnectorStrand {
@@ -11998,7 +13238,7 @@ declare function nodeEditBox(node: RenderedNode): NodeEditBox;
11998
13238
  * text). When omitted, falls back to the rendered text.
11999
13239
  * @returns The edit state, or `null` when the node id cannot be resolved.
12000
13240
  */
12001
- declare function beginNodeEdit(node: RenderedNode, elementId: string, rawText?: string): InlineEditState | null;
13241
+ declare function beginNodeEdit(node: RenderedNode, elementId: string, rawText?: string, resolvedNodeId?: string | null): InlineEditState | null;
12002
13242
  /**
12003
13243
  * Commit an edited node's text into the SmartArt data model.
12004
13244
  *
@@ -12036,19 +13276,28 @@ declare function findSlideIndexByElementId(slides: readonly PptxSlide[], id: str
12036
13276
  */
12037
13277
  declare function findOwningSlideIndex(slides: readonly PptxSlide[], id: string, templateSlideId: string | null | undefined): number;
12038
13278
 
12039
- /**
12040
- * Pure narrowing and text-layout helpers for SmartArtRendererComponent.
12041
- * Extracted to keep the component file within the per-file line budget.
12042
- * Re-imported as class-property function references so Angular template
12043
- * type-checking continues to work without changes to the template.
12044
- */
12045
-
12046
13279
  /** Narrow a RenderedNode to a circle, or undefined. */
12047
13280
  declare function narrowToCircle(node: RenderedNode): RenderedCircleNode | undefined;
12048
13281
  /** Narrow a RenderedNode to a polygon, or undefined. */
12049
13282
  declare function narrowToPolygon(node: RenderedNode): RenderedPolygonNode | undefined;
12050
13283
  /** Narrow a RenderedNode to a rect, or undefined. */
12051
13284
  declare function narrowToRect(node: RenderedNode): RenderedRectNode | undefined;
13285
+ /**
13286
+ * Resolved label descriptors for a layout, index-aligned with `layout.nodes`.
13287
+ *
13288
+ * The template used to hardcode `fill="white"` and anchor circle labels on
13289
+ * `cx`/`cy`, ignoring the descriptor's optional `fontColor` / `fontWeight` /
13290
+ * `fontStyle` / `textX` / `textY` / `textAnchor` / `textBaseline`. The shared
13291
+ * `smartArtNodeLabel` decides all of it; this only maps the array so the
13292
+ * component can expose it as a single `computed()`.
13293
+ */
13294
+ declare function layoutNodeLabels(layout: SmartArtLayoutResult): SmartArtNodeLabel[];
13295
+ /**
13296
+ * Resolved connector paint for a layout, index-aligned with
13297
+ * `layout.connectors`. The template used to hardcode the grey default, which
13298
+ * flattened the per-node colours target leaders and timeline stems carry.
13299
+ */
13300
+ declare function layoutConnectorPaints(layout: SmartArtLayoutResult): SmartArtConnectorPaint[];
12052
13301
 
12053
13302
  /**
12054
13303
  * SmartArtRendererComponent: Angular SmartArt renderer.
@@ -12149,6 +13398,10 @@ declare class SmartArtRendererComponent {
12149
13398
  readonly drawingShapeNodeIds: _angular_core.Signal<(string | undefined)[]>;
12150
13399
  readonly layout: _angular_core.Signal<SmartArtLayoutResult>;
12151
13400
  readonly hasLayout: _angular_core.Signal<boolean>;
13401
+ /** Label descriptors, index-aligned with `layout().nodes`. */
13402
+ readonly layoutLabels: _angular_core.Signal<SmartArtNodeLabel[]>;
13403
+ /** Connector paint, index-aligned with `layout().connectors`. */
13404
+ readonly layoutConnectors: _angular_core.Signal<SmartArtConnectorPaint[]>;
12152
13405
  /**
12153
13406
  * Screen-reader metadata for the whole diagram, derived by the shared
12154
13407
  * `buildSmartArtA11y`. The container SVG gets `role="img"` + this `label`;
@@ -12158,13 +13411,25 @@ declare class SmartArtRendererComponent {
12158
13411
  /** Map of node id -> accessibility label (for per-node `<title>` lookup). */
12159
13412
  private readonly a11yLabelById;
12160
13413
  /**
12161
- * Parsed data-model node id for a rendered node (or `null` when the key does
12162
- * not map to one). Exposed as a method so the template can use it: Angular
12163
- * AOT templates can only call component members, not imported functions.
13414
+ * Source node ids in fallback render order, index-aligned with
13415
+ * `layout().nodes`. The layout engine walks the node tree depth-first, so
13416
+ * flattening it is the mapping every binding uses.
13417
+ *
13418
+ * This component used to parse the id back out of the rendered node's `key`
13419
+ * instead, which broke on any family whose key carries an extra segment: the
13420
+ * gear legend's `<id>-gear-extra-<nodeId>-<i>` resolved to `extra-<nodeId>`,
13421
+ * so its `data-smartart-node-id` did not match any model node and an inline
13422
+ * edit on a legend row committed nowhere.
13423
+ */
13424
+ readonly layoutNodeIds: _angular_core.Signal<(string | undefined)[]>;
13425
+ /**
13426
+ * Data-model node id for the rendered node at `index` (or `null`). Exposed
13427
+ * as a method so the template can use it: Angular AOT templates can only
13428
+ * call component members, not imported functions.
12164
13429
  */
12165
- nodeKeyId(node: RenderedNode): string | null;
12166
- /** Resolve the accessibility label for a rendered node (by parsed node id). */
12167
- nodeAriaLabel(node: RenderedNode): string | null;
13430
+ nodeIdAt(index: number): string | null;
13431
+ /** Resolve the accessibility label for the rendered node at `index`. */
13432
+ nodeAriaLabel(index: number): string | null;
12168
13433
  /**
12169
13434
  * Polite live-region message announcing the most recent node-text commit.
12170
13435
  * Empty between commits so assistive tech only speaks on change.
@@ -12176,11 +13441,10 @@ declare class SmartArtRendererComponent {
12176
13441
  protected readonly asCircle: typeof narrowToCircle;
12177
13442
  protected readonly asPolygon: typeof narrowToPolygon;
12178
13443
  protected readonly asRect: typeof narrowToRect;
12179
- protected readonly textLines: typeof centeredSvgTextLines;
12180
13444
  /** Double-click a node enters inline edit mode (when editable). */
12181
- onNodeDblClick(event: Event, node: RenderedNode): void;
13445
+ onNodeDblClick(event: Event, node: RenderedNode, index: number): void;
12182
13446
  /** Enter / F2 on a focused node enters inline edit mode (when editable). */
12183
- onNodeKeydown(event: KeyboardEvent, node: RenderedNode): void;
13447
+ onNodeKeydown(event: KeyboardEvent, node: RenderedNode, index: number): void;
12184
13448
  /** Commit the current edit (called on blur). */
12185
13449
  commitEdit(event: Event): void;
12186
13450
  /** Enter commits (Shift+Enter inserts a newline); Escape cancels. */
@@ -12275,13 +13539,22 @@ declare class InkRendererComponent {
12275
13539
  * hit-testing slide elements by the marker skips it.
12276
13540
  */
12277
13541
  readonly markElement: _angular_core.InputSignal<boolean>;
13542
+ /**
13543
+ * When true (default), the rendered node carries `data-element-id`. The
13544
+ * miniature surfaces that paint every slide at once turn it off so one
13545
+ * element id resolves to exactly one node in the document; see
13546
+ * `ElementRendererComponent.exposeElementId`.
13547
+ */
13548
+ readonly exposeElementId: _angular_core.InputSignal<boolean>;
13549
+ /** `data-element-id` for this element, or null on a miniature surface. */
13550
+ readonly elementIdAttr: _angular_core.Signal<string | null>;
12278
13551
  readonly replayKeyframes = "@keyframes pptx-ink-replay {\n from { stroke-dashoffset: var(--ink-path-length); }\n to { stroke-dashoffset: 0; }\n}";
12279
13552
  readonly containerStyle: _angular_core.Signal<StyleMap>;
12280
13553
  readonly strokes: _angular_core.Signal<InkStroke[]>;
12281
13554
  readonly replayStyles: _angular_core.Signal<InkStrokeAnimationStyle[]>;
12282
13555
  readonly viewBox: _angular_core.Signal<string>;
12283
13556
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<InkRendererComponent, never>;
12284
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<InkRendererComponent, "pptx-ink-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "replay": { "alias": "replay"; "required": false; "isSignal": true; }; "markElement": { "alias": "markElement"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
13557
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InkRendererComponent, "pptx-ink-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "replay": { "alias": "replay"; "required": false; "isSignal": true; }; "markElement": { "alias": "markElement"; "required": false; "isSignal": true; }; "exposeElementId": { "alias": "exposeElementId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
12285
13558
  }
12286
13559
 
12287
13560
  /**
@@ -12487,6 +13760,15 @@ declare class Model3DRendererComponent implements OnDestroy {
12487
13760
  * controls and defaults to `true` even on a thumbnail.
12488
13761
  */
12489
13762
  readonly markElement: _angular_core.InputSignal<boolean>;
13763
+ /**
13764
+ * When true (default), the rendered node carries `data-element-id`. The
13765
+ * miniature surfaces that paint every slide at once turn it off so one
13766
+ * element id resolves to exactly one node in the document; see
13767
+ * `ElementRendererComponent.exposeElementId`.
13768
+ */
13769
+ readonly exposeElementId: _angular_core.InputSignal<boolean>;
13770
+ /** `data-element-id` for this element, or null on a miniature surface. */
13771
+ readonly elementIdAttr: _angular_core.Signal<string | null>;
12490
13772
  private readonly sceneRef;
12491
13773
  readonly containerStyle: _angular_core.Signal<StyleMap>;
12492
13774
  readonly vm: _angular_core.Signal<Model3DViewModel>;
@@ -12508,7 +13790,7 @@ declare class Model3DRendererComponent implements OnDestroy {
12508
13790
  private teardownHandle;
12509
13791
  ngOnDestroy(): void;
12510
13792
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Model3DRendererComponent, never>;
12511
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Model3DRendererComponent, "pptx-model3d-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "markElement": { "alias": "markElement"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
13793
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Model3DRendererComponent, "pptx-model3d-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "markElement": { "alias": "markElement"; "required": false; "isSignal": true; }; "exposeElementId": { "alias": "exposeElementId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
12512
13794
  }
12513
13795
 
12514
13796
  /** Resolves a `pptx.*` key, interpolating `{{...}}` params when given. */
@@ -12860,6 +14142,119 @@ declare class PresentationAnnotationsService {
12860
14142
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<PresentationAnnotationsService>;
12861
14143
  }
12862
14144
 
14145
+ /**
14146
+ * presentation-overlay-helpers.ts
14147
+ *
14148
+ * Pure functions used by PresentationOverlayComponent.
14149
+ * Exported separately so they can be unit-tested without TestBed.
14150
+ */
14151
+
14152
+ /**
14153
+ * The running custom show, when one is active. Every navigation helper below
14154
+ * takes it and forwards it to `resolveShowSlideIndexes`, because "which slide
14155
+ * comes next" is one rule (membership AND hidden slides), not two: Angular used
14156
+ * to pre-filter the slide array to the show's membership and then ask the
14157
+ * shared rule about the filtered array, which is how a hidden slide inside a
14158
+ * custom show still got presented.
14159
+ */
14160
+ type ActiveShow = ShowOrderCustomShow | null | undefined;
14161
+ /**
14162
+ * Whether a click/tap/swipe advance must be swallowed instead of moving to the
14163
+ * next slide. A click still steps the current slide's remaining animation
14164
+ * builds, so this only blocks once they are exhausted (`playbackComplete`) and
14165
+ * only when the slide's transition sets advanceOnClick to false. Keyboard and
14166
+ * the on-screen next/prev buttons never consult this.
14167
+ */
14168
+ declare function shouldBlockClickAdvance(playbackComplete: boolean, slide: PptxSlide | undefined): boolean;
14169
+ /**
14170
+ * Delay in ms before the show steps to the next slide on its own, or
14171
+ * `undefined` when the current slide waits for input.
14172
+ *
14173
+ * The counterpart to {@link shouldBlockClickAdvance}: PowerPoint's
14174
+ * `p:transition/@advTm` ("Advance slide: After <n>"). A slide authored
14175
+ * `advClick="0" advTm="…"` is advanced ONLY by this timer, so honouring the
14176
+ * click gate without also arming the timer strands the show on that slide with
14177
+ * no visible response to any input. Nothing is scheduled once the end-of-show
14178
+ * screen is up, or when the show is set to advance manually.
14179
+ */
14180
+ declare function resolveSlideAutoAdvanceMs(slide: PptxSlide | undefined, useTimings: boolean, endOfShow: boolean): number | undefined;
14181
+ /**
14182
+ * Attach the show's visibility pause: while the tab is hidden the shared
14183
+ * handler pauses the stage's playing media and the cross-slide persistent
14184
+ * audio, and the binding-provided callbacks cancel / re-arm the timed
14185
+ * auto-advance so the deck does not run on unseen. Returns the detach
14186
+ * function. Kept TestBed-free so the wiring can be unit-tested directly.
14187
+ */
14188
+ declare function attachShowVisibilityPause(deps: {
14189
+ /** The overlay root containing the stage; only media inside it is paused. */
14190
+ root: ParentNode | undefined;
14191
+ /** Cancel the pending auto-advance timer (the tab was hidden). */
14192
+ cancelAutoAdvance: () => void;
14193
+ /** Re-arm the auto-advance timer for the current slide (tab visible again). */
14194
+ rearmAutoAdvance: () => void;
14195
+ }): () => void;
14196
+ /**
14197
+ * The show has ENDED (never a slide change): stop and remove all cross-slide
14198
+ * "play across slides" persistent audio. Called by the host's exit paths
14199
+ * (`closePresentation` / `exitPresenter`), not by the overlay's own destroy,
14200
+ * because swapping to the presenter console destroys the overlay while the
14201
+ * show, and its background audio, carry on.
14202
+ */
14203
+ declare function endShowMediaCleanup(): void;
14204
+ /**
14205
+ * Clamp `index` to the valid range [0, count - 1].
14206
+ * Returns 0 when `count` is 0 to avoid -1 states.
14207
+ */
14208
+ declare function clampIndex(index: number, count: number): number;
14209
+ /**
14210
+ * Return the next visible (non-hidden) slide index after `current`.
14211
+ * Wraps around to `current` if no subsequent visible slide exists.
14212
+ *
14213
+ * Thin adapter over the shared show-order rule: Angular used to own this logic
14214
+ * outright, which is exactly why the other four bindings presented hidden
14215
+ * slides. Kept as a named export because the overlay's tests and the navigator
14216
+ * read better in terms of "next visible slide" than raw index lists.
14217
+ */
14218
+ declare function nextVisibleIndex(current: number, slides: readonly PptxSlide[], activeShow?: ActiveShow): number;
14219
+ /**
14220
+ * Return the previous visible (non-hidden) slide index before `current`.
14221
+ * Returns `current` when no earlier visible slide exists: PowerPoint never
14222
+ * wraps backward off the first slide.
14223
+ */
14224
+ declare function prevVisibleIndex(current: number, slides: readonly PptxSlide[], activeShow?: ActiveShow): number;
14225
+ /**
14226
+ * Compute the zoom level that fits a canvas of `canvasW × canvasH` pixels
14227
+ * into a viewport of `vw × vh` pixels, preserving aspect ratio.
14228
+ *
14229
+ * Returns 1 as a safe fallback when any dimension is zero or negative.
14230
+ */
14231
+ declare function fitZoom(canvasW: number, canvasH: number, vw: number, vh: number): number;
14232
+ /**
14233
+ * Whether a visible (non-hidden) slide exists strictly AFTER `current`.
14234
+ *
14235
+ * `nextVisibleIndex` wraps, which would make a show loop for ever. PowerPoint
14236
+ * only loops when "Loop continuously until Esc" is set; otherwise running past
14237
+ * the last slide ends the show. Callers use this to tell "there is a next
14238
+ * slide" from "we just wrapped".
14239
+ */
14240
+ declare function hasVisibleSlideAfter(current: number, slides: readonly PptxSlide[], activeShow?: ActiveShow): boolean;
14241
+ /** The show's first visible slide (Home), or 0 for an empty deck. */
14242
+ declare function firstVisibleIndex(slides: readonly PptxSlide[], activeShow?: ActiveShow): number;
14243
+ /** The show's last visible slide (End), or 0 for an empty deck. */
14244
+ declare function lastVisibleIndex(slides: readonly PptxSlide[], activeShow?: ActiveShow): number;
14245
+ /**
14246
+ * Style record centring the scaled slide stage in the viewport.
14247
+ *
14248
+ * The offsets are computed numerically ((viewport - scaled size) / 2, exactly
14249
+ * how React's PresentationStage centres) rather than with the historical
14250
+ * `left/top: 50%` + `translate(-50%, -50%)`: a transform makes the stage a
14251
+ * stacking context, which trapped every z-index inside it (the ink annotation
14252
+ * overlay in particular) BELOW the sibling blackout sheet, so blackboard
14253
+ * strokes painted invisibly under the black screen. See the shared
14254
+ * `render/presentation-blackboard` module for the layering rules.
14255
+ */
14256
+ declare function presentationStageStyle(size: CanvasSize, zoom: number, viewportW: number, viewportH: number): Record<string, string>;
14257
+
12863
14258
  /** Where a navigation request wants to go. */
12864
14259
  type ShowDirection = 'next' | 'prev' | 'first' | 'last';
12865
14260
  /**
@@ -12873,6 +14268,13 @@ interface ActiveSlideTransition {
12873
14268
  /** Everything the navigator needs from its host component. */
12874
14269
  interface ShowNavigatorDeps {
12875
14270
  slides: () => readonly PptxSlide[];
14271
+ /**
14272
+ * The running custom show, when one is active. `slides()` is always the whole
14273
+ * deck: the subset is a navigation rule, not a different slide array, so that
14274
+ * a hidden slide inside the show is still skipped and the editor's index
14275
+ * space never has to be translated.
14276
+ */
14277
+ activeCustomShow?: () => ActiveShow;
12876
14278
  /** The slide at the CURRENT index (a computed over `currentIndex`). */
12877
14279
  currentSlide: () => PptxSlide | undefined;
12878
14280
  showWithAnimation: () => boolean | undefined;
@@ -12982,6 +14384,12 @@ interface PresentationInputDeps {
12982
14384
  presenterWindow: PresenterWindowService;
12983
14385
  /** PowerPoint's Ctrl+M: hide ink markup without discarding the strokes. */
12984
14386
  toggleInkMarkup: () => void;
14387
+ /** PowerPoint's bare `J`: show or hide the live-caption bar. */
14388
+ toggleSubtitles: () => void;
14389
+ /** PowerPoint's Ctrl+H: show or hide the running show's own chrome. */
14390
+ toggleChrome: () => void;
14391
+ /** PowerPoint's Ctrl+S: raise the "See All Slides" navigator. */
14392
+ showAllSlides: () => void;
12985
14393
  /** End the show; the component guards against double-closing. */
12986
14394
  requestClose: () => void;
12987
14395
  }
@@ -13046,6 +14454,13 @@ declare class PresentationOverlayComponent implements OnInit {
13046
14454
  readonly canvasSize: _angular_core.InputSignal<CanvasSize>;
13047
14455
  readonly mediaDataUrls: _angular_core.InputSignal<Map<string, string>>;
13048
14456
  readonly startIndex: _angular_core.InputSignal<number>;
14457
+ /**
14458
+ * The running custom show, or null for the whole deck. `slides` stays the
14459
+ * FULL deck either way: membership is applied by the shared show-order rule
14460
+ * (see `presentation-overlay-helpers.ts`), so indexes remain deck indexes and
14461
+ * hidden slides inside a show are still skipped.
14462
+ */
14463
+ readonly activeCustomShow: _angular_core.InputSignal<ShowOrderCustomShow | null>;
13049
14464
  readonly showWithAnimation: _angular_core.InputSignal<boolean | undefined>;
13050
14465
  /**
13051
14466
  * Whether authored slide timings (`p:transition/@advTm`) advance the show on
@@ -13100,13 +14515,24 @@ declare class PresentationOverlayComponent implements OnInit {
13100
14515
  * `presentation-input-controller.ts`.
13101
14516
  */
13102
14517
  protected readonly input: PresentationInputController;
14518
+ /** Whether PowerPoint's "See All Slides" navigator is up (Ctrl+S). */
14519
+ protected readonly allSlidesOpen: _angular_core.WritableSignal<boolean>;
13103
14520
  /** Template aliases for the navigator's state. */
13104
14521
  protected readonly currentIndex: _angular_core.WritableSignal<number>;
13105
14522
  protected readonly endOfShow: _angular_core.WritableSignal<boolean>;
13106
14523
  protected readonly activeTransition: _angular_core.WritableSignal<ActiveSlideTransition | null>;
13107
14524
  /** Mirror the host's audience "session ended" flag onto the end screen. */
13108
14525
  private readonly syncSessionEnded;
13109
- /** Adopt an index the host pushed in (an audience display mirrors one). */
14526
+ /**
14527
+ * Adopt an index the host PUSHED in (an audience display mirrors one).
14528
+ *
14529
+ * `startIndex` is this effect's only dependency, deliberately. `syncFromHost`
14530
+ * reads the navigator's own `currentIndex` to decide whether anything
14531
+ * changed, and tracking that read made the effect re-run on the show's own
14532
+ * advances: any host whose `startIndex` did not follow the show then re-armed
14533
+ * itself and yanked the slide straight back. That is exactly what a running
14534
+ * custom show used to do, and why Angular alone never left its first slide.
14535
+ */
13110
14536
  private readonly syncExternalIndex;
13111
14537
  /**
13112
14538
  * Zoom-navigation context (provided at this component level). The handler is
@@ -13128,6 +14554,8 @@ declare class PresentationOverlayComponent implements OnInit {
13128
14554
  * {@link setupFullscreen}).
13129
14555
  */
13130
14556
  private readonly rootRef;
14557
+ /** The show toolbar, so Ctrl+H can flip the visibility flag it already owns. */
14558
+ private readonly toolbarRef;
13131
14559
  /**
13132
14560
  * Guards against handling the same exit twice: e.g. Escape both reaches our
13133
14561
  * own `keydown` handler AND causes the browser to natively exit fullscreen
@@ -13208,6 +14636,8 @@ declare class PresentationOverlayComponent implements OnInit {
13208
14636
  protected onEndScreenClick(event: MouseEvent): void;
13209
14637
  /** The show toolbar's end button: same exit path as Escape / the close button. */
13210
14638
  protected onToolbarEnd(): void;
14639
+ /** A "See All Slides" tile: jump there and drop the navigator. */
14640
+ protected onNavigatorSelect(index: number): void;
13211
14641
  /**
13212
14642
  * Overlay-chrome buttons (close / previous / next). Each is bound for both
13213
14643
  * `click` and `touchend`: the touch path additionally prevents the browser's
@@ -13220,7 +14650,7 @@ declare class PresentationOverlayComponent implements OnInit {
13220
14650
  private runChromeAction;
13221
14651
  private emitClosed;
13222
14652
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PresentationOverlayComponent, never>;
13223
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationOverlayComponent, "pptx-presentation-overlay", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "startIndex": { "alias": "startIndex"; "required": false; "isSignal": true; }; "showWithAnimation": { "alias": "showWithAnimation"; "required": false; "isSignal": true; }; "useTimings": { "alias": "useTimings"; "required": false; "isSignal": true; }; "subtitlesVisible": { "alias": "subtitlesVisible"; "required": false; "isSignal": true; }; "sessionEnded": { "alias": "sessionEnded"; "required": false; "isSignal": true; }; "endWithBlackSlide": { "alias": "endWithBlackSlide"; "required": false; "isSignal": true; }; "presenterMode": { "alias": "presenterMode"; "required": false; "isSignal": true; }; }, { "indexChange": "indexChange"; "closed": "closed"; "subtitlesChange": "subtitlesChange"; "presenterViewToggle": "presenterViewToggle"; "annotationsExit": "annotationsExit"; }, never, never, true, never>;
14653
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresentationOverlayComponent, "pptx-presentation-overlay", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "startIndex": { "alias": "startIndex"; "required": false; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "showWithAnimation": { "alias": "showWithAnimation"; "required": false; "isSignal": true; }; "useTimings": { "alias": "useTimings"; "required": false; "isSignal": true; }; "subtitlesVisible": { "alias": "subtitlesVisible"; "required": false; "isSignal": true; }; "sessionEnded": { "alias": "sessionEnded"; "required": false; "isSignal": true; }; "endWithBlackSlide": { "alias": "endWithBlackSlide"; "required": false; "isSignal": true; }; "presenterMode": { "alias": "presenterMode"; "required": false; "isSignal": true; }; }, { "indexChange": "indexChange"; "closed": "closed"; "subtitlesChange": "subtitlesChange"; "presenterViewToggle": "presenterViewToggle"; "annotationsExit": "annotationsExit"; }, never, never, true, never>;
13224
14654
  }
13225
14655
 
13226
14656
  /**
@@ -13253,10 +14683,16 @@ declare class SlideSorterOverlayComponent {
13253
14683
  readonly mediaDataUrls: _angular_core.InputSignal<Map<string, string>>;
13254
14684
  /** Zero-based index of the currently active slide (highlighted in blue). */
13255
14685
  readonly activeIndex: _angular_core.InputSignal<number>;
14686
+ /** Whether the host allows edits; gates the deck-writing shortcuts. */
14687
+ readonly canEdit: _angular_core.InputSignal<boolean>;
13256
14688
  /** Emits the zero-based index of the thumbnail the user clicked. */
13257
14689
  readonly select: _angular_core.OutputEmitterRef<number>;
13258
14690
  /** Emits when the user closes the overlay (✕ button or Escape key). */
13259
14691
  readonly closed: _angular_core.OutputEmitterRef<void>;
14692
+ /** Delete the active slide (Delete / Backspace). */
14693
+ readonly deleteSlide: _angular_core.OutputEmitterRef<number>;
14694
+ /** Duplicate the active slide (Ctrl/Cmd+D). */
14695
+ readonly duplicateSlide: _angular_core.OutputEmitterRef<number>;
13260
14696
  /** Zoom level that fits the full canvas width into THUMB_W pixels. */
13261
14697
  readonly thumbZoom: _angular_core.Signal<number>;
13262
14698
  /** Pixel height of the clipping box (aspect-correct). */
@@ -13265,7 +14701,15 @@ declare class SlideSorterOverlayComponent {
13265
14701
  readonly clipStyle: _angular_core.Signal<Record<string, string>>;
13266
14702
  /** ngStyle object for the grid: responsive auto-fill columns. */
13267
14703
  readonly gridStyle: _angular_core.Signal<Record<string, string>>;
13268
- /** Keyboard handler: Escape closes the overlay. */
14704
+ /**
14705
+ * Keyboard handler, resolved by the shared sorter keymap.
14706
+ *
14707
+ * This used to test for `Escape` and nothing else, so the sorter's Delete and
14708
+ * Ctrl+D were dead in Angular alone. Only the commands this overlay can
14709
+ * perform are dispatched: there is no slide clipboard, no multi-selection and
14710
+ * no thumbnail zoom here, so those chords are left to the host instead of
14711
+ * being swallowed by a branch that would do nothing.
14712
+ */
13269
14713
  onKeydown(event: KeyboardEvent): void;
13270
14714
  /** Clicking the backdrop (outside the panel) closes the overlay. */
13271
14715
  onBackdropClick(event: MouseEvent): void;
@@ -13284,7 +14728,7 @@ declare class SlideSorterOverlayComponent {
13284
14728
  */
13285
14729
  hiddenCue(slide: PptxSlide, index: number): HiddenSlideCue;
13286
14730
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideSorterOverlayComponent, never>;
13287
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideSorterOverlayComponent, "pptx-slide-sorter-overlay", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; }, { "select": "select"; "closed": "closed"; }, never, never, true, never>;
14731
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideSorterOverlayComponent, "pptx-slide-sorter-overlay", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, { "select": "select"; "closed": "closed"; "deleteSlide": "deleteSlide"; "duplicateSlide": "duplicateSlide"; }, never, never, true, never>;
13288
14732
  }
13289
14733
 
13290
14734
  declare class ReadingViewOverlayComponent implements OnInit, AfterViewInit, OnDestroy {
@@ -13424,7 +14868,12 @@ declare class InspectorPanelComponent {
13424
14868
  textColor: string;
13425
14869
  fontSize: number;
13426
14870
  }>;
13427
- /** Whether the element has lock flags preventing move/select. */
14871
+ /**
14872
+ * Whether the element carries a lock that stops a canvas gesture, resolved by
14873
+ * the SHARED predicate so all five bindings agree on what "locked" means
14874
+ * (previously a hand-rolled `noMove || noSelect` that omitted `noResize`, so a
14875
+ * resize-locked shape showed as unlocked while the canvas refused the drag).
14876
+ */
13428
14877
  protected readonly isLocked: _angular_core.Signal<boolean>;
13429
14878
  /** Whether the element supports shape-style (fill/stroke) editing. */
13430
14879
  protected readonly hasShape: _angular_core.Signal<boolean>;
@@ -13450,7 +14899,7 @@ declare class InspectorPanelComponent {
13450
14899
  * identically.
13451
14900
  */
13452
14901
  protected onSmartArtDataChange(smartArtData: PptxSmartArtData): void;
13453
- /** Toggle element lock (noMove + noResize + noSelect). */
14902
+ /** Toggle element lock. Shared owns which flags that writes. */
13454
14903
  protected onLockToggle(): void;
13455
14904
  /** Commit a partial-element patch from an advanced sub-panel as one history entry. */
13456
14905
  protected onPatch(patch: Partial<PptxElement>): void;
@@ -13590,8 +15039,17 @@ declare class SlideSizeCardComponent {
13590
15039
  readonly canEdit: _angular_core.InputSignal<boolean>;
13591
15040
  private readonly loader;
13592
15041
  private readonly editor;
15042
+ protected readonly CUSTOM_PRESET_VALUE = "";
15043
+ protected readonly presets: readonly SlideSizePreset[];
15044
+ protected readonly orientations: readonly SlideSizeOrientation[];
13593
15045
  protected readonly size: _angular_core.WritableSignal<pptx_angular_viewer.CanvasSize>;
15046
+ protected readonly selection: _angular_core.Signal<SlideSizeSelectionDescriptor>;
15047
+ protected readonly selectedPresetValue: _angular_core.Signal<string>;
15048
+ protected onPresetChange(event: Event): void;
15049
+ protected onOrientation(orientation: SlideSizeOrientation): void;
13594
15050
  protected onChange(event: Event, dim: 'width' | 'height'): void;
15051
+ /** Commit an EMU size and the canvas size it implies, together. */
15052
+ private apply;
13595
15053
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideSizeCardComponent, never>;
13596
15054
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideSizeCardComponent, "pptx-slide-size-card", never, { "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
13597
15055
  }
@@ -15971,6 +17429,7 @@ declare class ViewerExtraDialogsComponent {
15971
17429
  readonly themeKeySelect: _angular_core.OutputEmitterRef<string>;
15972
17430
  readonly localeSelect: _angular_core.OutputEmitterRef<string>;
15973
17431
  protected readonly svc: ViewerDialogsService;
17432
+ protected readonly customFonts: CustomFontsService;
15974
17433
  protected readonly viewerOpts: ViewerOptionsService;
15975
17434
  protected readonly compare: ViewerCompareService;
15976
17435
  protected readonly editor: EditorStateService;
@@ -16285,6 +17744,15 @@ declare class FontEmbeddingPanelComponent {
16285
17744
  readonly usedFontFamilies: _angular_core.InputSignal<string[]>;
16286
17745
  /** Font families already embedded in the file. */
16287
17746
  readonly embeddedFonts: _angular_core.InputSignal<string[]>;
17747
+ /**
17748
+ * False when the deck embeds nothing, in which case the switch is inert and
17749
+ * says why. The viewer can keep or strip embedded font data on save, but it
17750
+ * cannot manufacture it: a browser will not hand over the bytes of an
17751
+ * installed system face.
17752
+ */
17753
+ readonly canEmbedFonts: _angular_core.InputSignal<boolean>;
17754
+ /** i18n key for the explanation shown when `canEmbedFonts` is false. */
17755
+ readonly embedUnavailableKey: _angular_core.InputSignal<string | undefined>;
16288
17756
  /** Fired when the dialog is dismissed. */
16289
17757
  readonly close: _angular_core.OutputEmitterRef<void>;
16290
17758
  /** Fired when the embed toggle changes; carries the new checked state. */
@@ -16297,13 +17765,15 @@ declare class FontEmbeddingPanelComponent {
16297
17765
  readonly scanned: _angular_core.WritableSignal<boolean>;
16298
17766
  /** Set view of {@link embeddedFonts} for fast membership checks. */
16299
17767
  readonly embeddedSet: _angular_core.Signal<Set<string>>;
17768
+ /** Line of copy under the switch: what it does, or why it cannot. */
17769
+ readonly toggleNoteKey: _angular_core.Signal<string>;
16300
17770
  /** How many used families failed to resolve in the browser. */
16301
17771
  readonly missingCount: _angular_core.Signal<number>;
16302
17772
  constructor();
16303
17773
  onToggle(event: Event): void;
16304
17774
  private scanFonts;
16305
17775
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FontEmbeddingPanelComponent, never>;
16306
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FontEmbeddingPanelComponent, "pptx-font-embedding-panel", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "embedFontsEnabled": { "alias": "embedFontsEnabled"; "required": false; "isSignal": true; }; "usedFontFamilies": { "alias": "usedFontFamilies"; "required": false; "isSignal": true; }; "embeddedFonts": { "alias": "embeddedFonts"; "required": false; "isSignal": true; }; }, { "close": "close"; "toggleEmbedFonts": "toggleEmbedFonts"; }, never, never, true, never>;
17776
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FontEmbeddingPanelComponent, "pptx-font-embedding-panel", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "embedFontsEnabled": { "alias": "embedFontsEnabled"; "required": false; "isSignal": true; }; "usedFontFamilies": { "alias": "usedFontFamilies"; "required": false; "isSignal": true; }; "embeddedFonts": { "alias": "embeddedFonts"; "required": false; "isSignal": true; }; "canEmbedFonts": { "alias": "canEmbedFonts"; "required": false; "isSignal": true; }; "embedUnavailableKey": { "alias": "embedUnavailableKey"; "required": false; "isSignal": true; }; }, { "close": "close"; "toggleEmbedFonts": "toggleEmbedFonts"; }, never, never, true, never>;
16307
17777
  }
16308
17778
 
16309
17779
  declare class FontEmbeddingListComponent {
@@ -16432,6 +17902,10 @@ declare class SettingsDialogComponent {
16432
17902
  readonly resetOptions: _angular_core.OutputEmitterRef<keyof ViewerOptions | undefined>;
16433
17903
  readonly clearCache: _angular_core.OutputEmitterRef<void>;
16434
17904
  readonly themeKeySelect: _angular_core.OutputEmitterRef<string>;
17905
+ /** Families registered this session via the Fonts section. */
17906
+ readonly customFontFamilies: _angular_core.InputSignal<readonly string[]>;
17907
+ /** A font file was registered; the ribbon adds the family to its list. */
17908
+ readonly customFontRegistered: _angular_core.OutputEmitterRef<string>;
16435
17909
  readonly localeSelect: _angular_core.OutputEmitterRef<string>;
16436
17910
  readonly close: _angular_core.OutputEmitterRef<void>;
16437
17911
  protected readonly tabs: readonly ViewerOptionsTabDefinition[];
@@ -16447,7 +17921,7 @@ declare class SettingsDialogComponent {
16447
17921
  /** Escape confirms (keeps edits), mirroring React's dialog. */
16448
17922
  protected onEscape(): void;
16449
17923
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SettingsDialogComponent, never>;
16450
- 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>;
17924
+ 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; }; "customFontFamilies": { "alias": "customFontFamilies"; "required": false; "isSignal": true; }; }, { "optionChange": "optionChange"; "restoreOptions": "restoreOptions"; "ribbonTabHiddenChange": "ribbonTabHiddenChange"; "quickAccessCommandsChange": "quickAccessCommandsChange"; "resetOptions": "resetOptions"; "clearCache": "clearCache"; "themeKeySelect": "themeKeySelect"; "customFontRegistered": "customFontRegistered"; "localeSelect": "localeSelect"; "close": "close"; }, never, never, true, never>;
16451
17925
  }
16452
17926
 
16453
17927
  declare class SettingsAppearanceTabComponent {
@@ -16472,7 +17946,7 @@ declare class AccountPageComponent {
16472
17946
  readonly accountAuth: _angular_core.InputSignal<AccountAuthConfig | undefined>;
16473
17947
  private readonly translate;
16474
17948
  protected readonly swatches: readonly string[];
16475
- protected readonly version = "2.17.7";
17949
+ protected readonly version = "2.17.9";
16476
17950
  protected readonly profile: _angular_core.WritableSignal<ViewerProfile>;
16477
17951
  protected readonly initial: _angular_core.Signal<string>;
16478
17952
  protected readonly usage: _angular_core.WritableSignal<LocalStorageUsageSummary | null>;
@@ -16502,6 +17976,20 @@ declare class KeepAnnotationsDialogComponent {
16502
17976
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KeepAnnotationsDialogComponent, "pptx-keep-annotations-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "annotationCount": { "alias": "annotationCount"; "required": false; "isSignal": true; }; "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; }, { "keep": "keep"; "discard": "discard"; }, never, never, true, never>;
16503
17977
  }
16504
17978
 
17979
+ declare class AutosaveRecoveryDialogComponent {
17980
+ private readonly translate;
17981
+ /** The shared descriptor to render, or null to render nothing. */
17982
+ readonly prompt: _angular_core.InputSignal<AutosaveRecoveryPrompt | null>;
17983
+ /** The user accepted: load the snapshot. */
17984
+ readonly restore: _angular_core.OutputEmitterRef<void>;
17985
+ /** The user declined (also on dismiss): drop the snapshot. */
17986
+ readonly discard: _angular_core.OutputEmitterRef<void>;
17987
+ /** "Autosaved 5 min ago", built from the two keys the descriptor names. */
17988
+ protected readonly savedLabel: _angular_core.Signal<any>;
17989
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AutosaveRecoveryDialogComponent, never>;
17990
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AutosaveRecoveryDialogComponent, "pptx-autosave-recovery-dialog", never, { "prompt": { "alias": "prompt"; "required": false; "isSignal": true; }; }, { "restore": "restore"; "discard": "discard"; }, never, never, true, never>;
17991
+ }
17992
+
16505
17993
  declare class SignatureStrippedDialogComponent {
16506
17994
  /** Whether the dialog is visible. */
16507
17995
  readonly open: _angular_core.InputSignal<boolean>;
@@ -16811,7 +18299,13 @@ declare class PresentationToolbarComponent {
16811
18299
  readonly swatchBar: "absolute bottom-0.5 left-1/2 -translate-x-1/2 w-3 h-0.5 rounded-full";
16812
18300
  };
16813
18301
  protected readonly openPalette: _angular_core.WritableSignal<OpenPalette>;
16814
- protected readonly visible: _angular_core.WritableSignal<boolean>;
18302
+ /**
18303
+ * Whether the bar is faded in. Public because PowerPoint's Ctrl+H toggles it
18304
+ * from the show's key handler, which owns no visibility state of its own:
18305
+ * auto-hide and the shortcut have to drive ONE flag or the bar disagrees with
18306
+ * itself the moment the presenter moves the mouse.
18307
+ */
18308
+ readonly visible: _angular_core.WritableSignal<boolean>;
16815
18309
  private readonly mountedAt;
16816
18310
  private readonly now;
16817
18311
  protected readonly counterLabel: _angular_core.Signal<string>;
@@ -16831,6 +18325,8 @@ declare class PresentationToolbarComponent {
16831
18325
  * back on the next twitch.
16832
18326
  */
16833
18327
  protected onDocumentMouseMove(event: MouseEvent): void;
18328
+ /** PowerPoint's Ctrl+H: flip the show chrome, auto-hide countdown and all. */
18329
+ toggleVisible(): void;
16834
18330
  protected onMouseEnter(): void;
16835
18331
  protected onMouseLeave(): void;
16836
18332
  /** A press outside the bar dismisses whichever colour palette is open. */
@@ -17026,6 +18522,12 @@ declare class PresenterViewComponent {
17026
18522
  protected readonly NOTES_FONT_SIZE_MAX = 32;
17027
18523
  readonly slides: _angular_core.InputSignal<PptxSlide[]>;
17028
18524
  readonly currentSlideIndex: _angular_core.InputSignal<number>;
18525
+ /**
18526
+ * The running custom show, or null for the whole deck. The "next slide"
18527
+ * preview MUST honour it: while a show is playing, the slide the next
18528
+ * forward press lands on is the show's next member, not `index + 1`.
18529
+ */
18530
+ readonly activeCustomShow: _angular_core.InputSignal<ShowOrderCustomShow | null>;
17029
18531
  readonly canvasSize: _angular_core.InputSignal<CanvasSize>;
17030
18532
  readonly templateElements: _angular_core.InputSignal<readonly PptxElement[]>;
17031
18533
  readonly mediaDataUrls: _angular_core.InputSignal<Map<string, string>>;
@@ -17100,7 +18602,7 @@ declare class PresenterViewComponent {
17100
18602
  protected onSwapDisplays(): void;
17101
18603
  private withTemplate;
17102
18604
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PresenterViewComponent, never>;
17103
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresenterViewComponent, "pptx-presenter-view", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "currentSlideIndex": { "alias": "currentSlideIndex"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "presentationStartTime": { "alias": "presentationStartTime"; "required": false; "isSignal": true; }; "isAudienceWindowOpen": { "alias": "isAudienceWindowOpen"; "required": false; "isSignal": true; }; }, { "movePresentationSlide": "movePresentationSlide"; "exit": "exit"; "openAudienceWindow": "openAudienceWindow"; "closeAudienceWindow": "closeAudienceWindow"; "navigateToSlide": "navigateToSlide"; }, never, never, true, never>;
18605
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PresenterViewComponent, "pptx-presenter-view", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "currentSlideIndex": { "alias": "currentSlideIndex"; "required": true; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "presentationStartTime": { "alias": "presentationStartTime"; "required": false; "isSignal": true; }; "isAudienceWindowOpen": { "alias": "isAudienceWindowOpen"; "required": false; "isSignal": true; }; }, { "movePresentationSlide": "movePresentationSlide"; "exit": "exit"; "openAudienceWindow": "openAudienceWindow"; "closeAudienceWindow": "closeAudienceWindow"; "navigateToSlide": "navigateToSlide"; }, never, never, true, never>;
17104
18606
  }
17105
18607
 
17106
18608
  /**
@@ -17123,6 +18625,12 @@ declare class PresenterViewComponent {
17123
18625
  declare class MobilePresenterViewComponent {
17124
18626
  readonly slides: _angular_core.InputSignal<PptxSlide[]>;
17125
18627
  readonly currentSlideIndex: _angular_core.InputSignal<number>;
18628
+ /**
18629
+ * The running custom show, or null for the whole deck. The "next slide"
18630
+ * preview MUST honour it: while a show is playing, the slide the next
18631
+ * forward press lands on is the show's next member, not `index + 1`.
18632
+ */
18633
+ readonly activeCustomShow: _angular_core.InputSignal<ShowOrderCustomShow | null>;
17126
18634
  readonly canvasSize: _angular_core.InputSignal<CanvasSize>;
17127
18635
  readonly templateElements: _angular_core.InputSignal<readonly PptxElement[]>;
17128
18636
  readonly mediaDataUrls: _angular_core.InputSignal<Map<string, string>>;
@@ -17148,7 +18656,7 @@ declare class MobilePresenterViewComponent {
17148
18656
  }>;
17149
18657
  private withTemplate;
17150
18658
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobilePresenterViewComponent, never>;
17151
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobilePresenterViewComponent, "pptx-mobile-presenter-view", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "currentSlideIndex": { "alias": "currentSlideIndex"; "required": true; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "presentationStartTime": { "alias": "presentationStartTime"; "required": false; "isSignal": true; }; }, { "movePresentationSlide": "movePresentationSlide"; "exit": "exit"; }, never, never, true, never>;
18659
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobilePresenterViewComponent, "pptx-mobile-presenter-view", never, { "slides": { "alias": "slides"; "required": true; "isSignal": true; }; "currentSlideIndex": { "alias": "currentSlideIndex"; "required": true; "isSignal": true; }; "activeCustomShow": { "alias": "activeCustomShow"; "required": false; "isSignal": true; }; "canvasSize": { "alias": "canvasSize"; "required": true; "isSignal": true; }; "templateElements": { "alias": "templateElements"; "required": false; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "presentationStartTime": { "alias": "presentationStartTime"; "required": false; "isSignal": true; }; }, { "movePresentationSlide": "movePresentationSlide"; "exit": "exit"; }, never, never, true, never>;
17152
18660
  }
17153
18661
 
17154
18662
  /**
@@ -17426,6 +18934,18 @@ declare function computeSingleSelected(elements: readonly PptxElement[], selecte
17426
18934
  declare function computeHandleBoxes(box: (Box & {
17427
18935
  id: string;
17428
18936
  }) | null, editable: boolean, handleScreenPx: number, zoom: number): HandleBox[];
18937
+ /**
18938
+ * Resize-handle boxes for the single selection, suppressed entirely when the
18939
+ * element's authored `a:spLocks` forbids resizing.
18940
+ *
18941
+ * The lock question is asked HERE rather than in the component so the rule is
18942
+ * unit-testable without Angular, and so the render gate and the pointer-down
18943
+ * gate ({@link canInteractWithElement}) can never disagree: a handle the user
18944
+ * cannot see is also a handle the pointer path refuses.
18945
+ */
18946
+ declare function computeResizeHandleBoxes(element: PptxElement | null | undefined, box: (Box & {
18947
+ id: string;
18948
+ }) | null, editable: boolean, handleScreenPx: number, zoom: number): HandleBox[];
17429
18949
  /**
17430
18950
  * A corner handle box (rotate or shape-adjust) offset above/outside the
17431
18951
  * single selection's box by `offsetPx` (screen pixels, scaled by zoom).
@@ -17433,6 +18953,15 @@ declare function computeHandleBoxes(box: (Box & {
17433
18953
  declare function computeCornerHandle(box: (Box & {
17434
18954
  id: string;
17435
18955
  }) | null, editable: boolean, handleScreenPx: number, offsetPx: number, zoom: number, corner: 'top-center' | 'top-left'): CornerHandleBox | null;
18956
+ /**
18957
+ * The rotate-knob box for the single selection, or null when the element's
18958
+ * authored `a:spLocks/@noRotation` forbids the gesture. Companion to
18959
+ * {@link computeResizeHandleBoxes}; see that function for why the lock check
18960
+ * lives in this module.
18961
+ */
18962
+ declare function computeRotateHandleBox(element: PptxElement | null | undefined, box: (Box & {
18963
+ id: string;
18964
+ }) | null, editable: boolean, handleScreenPx: number, offsetPx: number, zoom: number): CornerHandleBox | null;
17436
18965
  /**
17437
18966
  * Resolve the id of the interactive element under a pointer target, or null.
17438
18967
  *
@@ -18178,10 +19707,13 @@ declare class RibbonColorPopoverComponent {
18178
19707
  declare class RibbonDesignSectionComponent {
18179
19708
  readonly themeGalleryOpen: _angular_core.InputSignal<boolean>;
18180
19709
  readonly toggleThemeGallery: _angular_core.OutputEmitterRef<void>;
18181
- readonly info: _angular_core.OutputEmitterRef<void>;
19710
+ /** "Edit Theme": open the theme gallery already in its customise mode. */
19711
+ readonly editTheme: _angular_core.OutputEmitterRef<void>;
19712
+ /** "Slide Size": surface the inspector deck panel that owns the size card. */
19713
+ readonly openSlideSize: _angular_core.OutputEmitterRef<void>;
18182
19714
  readonly toggleInspector: _angular_core.OutputEmitterRef<void>;
18183
19715
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonDesignSectionComponent, never>;
18184
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonDesignSectionComponent, "pptx-ribbon-design-section", never, { "themeGalleryOpen": { "alias": "themeGalleryOpen"; "required": false; "isSignal": true; }; }, { "toggleThemeGallery": "toggleThemeGallery"; "info": "info"; "toggleInspector": "toggleInspector"; }, never, never, true, never>;
19716
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonDesignSectionComponent, "pptx-ribbon-design-section", never, { "themeGalleryOpen": { "alias": "themeGalleryOpen"; "required": false; "isSignal": true; }; }, { "toggleThemeGallery": "toggleThemeGallery"; "editTheme": "editTheme"; "openSlideSize": "openSlideSize"; "toggleInspector": "toggleInspector"; }, never, never, true, never>;
18185
19717
  }
18186
19718
 
18187
19719
  declare class RibbonDrawingGroupComponent {
@@ -18300,7 +19832,25 @@ declare class RibbonFontControlsComponent {
18300
19832
  private readonly editor;
18301
19833
  readonly slideIndex: _angular_core.InputSignal<number>;
18302
19834
  readonly selectedElement: _angular_core.InputSignal<PptxElement | null>;
18303
- protected readonly fontFamilies: string[];
19835
+ private readonly loader;
19836
+ private readonly customFonts;
19837
+ /**
19838
+ * Theme major/minor latin faces. Read from DI rather than taken as inputs
19839
+ * because this component renders in two different ribbon hosts, and both
19840
+ * would otherwise have to thread the same three values down.
19841
+ */
19842
+ protected readonly themeFonts: _angular_core.Signal<{
19843
+ heading: string | undefined;
19844
+ body: string | undefined;
19845
+ }>;
19846
+ /**
19847
+ * The dropdown's contents, grouped the way PowerPoint groups them.
19848
+ *
19849
+ * This component used to carry its own eight-entry family list, so Angular
19850
+ * offered a different set of fonts from the other four bindings. The
19851
+ * grouping and de-duplication now come from `pptx-viewer-shared`.
19852
+ */
19853
+ protected readonly fontGroups: _angular_core.Signal<FontCatalogGroup[]>;
18304
19854
  protected readonly fontSizes: number[];
18305
19855
  protected readonly fontColorPresets: string[];
18306
19856
  protected readonly highlightColorPresets: string[];
@@ -18364,6 +19914,17 @@ declare class RibbonHomeSectionComponent {
18364
19914
  private readonly loader;
18365
19915
  /** Layouts offered by the New Slide split button and the Layout menu. */
18366
19916
  protected readonly layoutOptions: _angular_core.Signal<RibbonLayoutOption[]>;
19917
+ /** `layoutPath` of the active slide, marking the current gallery tile. */
19918
+ protected readonly currentLayoutPath: _angular_core.Signal<string | undefined>;
19919
+ /**
19920
+ * Layout artwork for the gallery thumbnails, keyed by layout path.
19921
+ *
19922
+ * Parsing every layout part is only worth doing once a gallery is opened,
19923
+ * so this stays empty until {@link loadLayoutPreviews} runs. Core memoises
19924
+ * the parse, so reopening a menu costs nothing.
19925
+ */
19926
+ protected readonly layoutPreviews: _angular_core.WritableSignal<ReadonlyMap<string, PptxLayoutPreview>>;
19927
+ constructor();
18367
19928
  readonly slideIndex: _angular_core.InputSignal<number>;
18368
19929
  readonly selectedElement: _angular_core.InputSignal<PptxElement | null>;
18369
19930
  readonly canEdit: _angular_core.InputSignal<boolean>;
@@ -18660,6 +20221,23 @@ declare class RibbonSlideshowSectionComponent {
18660
20221
  readonly toggleSubtitles: _angular_core.OutputEmitterRef<void>;
18661
20222
  readonly openSubtitleSettings: _angular_core.OutputEmitterRef<void>;
18662
20223
  protected readonly toolbar: ToolbarVisibility;
20224
+ private readonly loader;
20225
+ /**
20226
+ * The Options cluster, split across the two columns PowerPoint uses. Both
20227
+ * halves come from the shared descriptor list, so the set and its order stay
20228
+ * identical across bindings.
20229
+ */
20230
+ protected readonly primaryOptions: SlideShowOptionDescriptor[];
20231
+ protected readonly secondaryOptions: SlideShowOptionDescriptor[];
20232
+ /** Whether an Options checkbox reads as ticked for the loaded deck. */
20233
+ protected isOptionChecked(id: SlideShowOptionId): boolean;
20234
+ /**
20235
+ * Commit a tick/untick onto the deck's presentation properties, the same
20236
+ * signal the inspector's PRESENTATION card patches and the show path reads.
20237
+ * Unsupported options return no change from shared and are rendered disabled,
20238
+ * so this is a no-op for them even if a click somehow arrives.
20239
+ */
20240
+ protected onOptionChange(id: SlideShowOptionId, event: Event): void;
18663
20241
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonSlideshowSectionComponent, never>;
18664
20242
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonSlideshowSectionComponent, "pptx-ribbon-slideshow-section", never, { "slideCount": { "alias": "slideCount"; "required": false; "isSignal": true; }; "showSubtitles": { "alias": "showSubtitles"; "required": false; "isSignal": true; }; "hiddenActions": { "alias": "hiddenActions"; "required": false; "isSignal": true; }; "activeSlideHidden": { "alias": "activeSlideHidden"; "required": false; "isSignal": true; }; }, { "presentFromBeginning": "presentFromBeginning"; "presentFromCurrent": "presentFromCurrent"; "presenter": "presenter"; "broadcast": "broadcast"; "openCustomShows": "openCustomShows"; "openSetUpSlideShow": "openSetUpSlideShow"; "toggleHideSlide": "toggleHideSlide"; "rehearseTimings": "rehearseTimings"; "record": "record"; "toggleSubtitles": "toggleSubtitles"; "openSubtitleSettings": "openSubtitleSettings"; }, never, never, true, never>;
18665
20243
  }
@@ -18679,26 +20257,39 @@ declare function transformSelectedTextCase(editor: EditorStateService, slideInde
18679
20257
  declare class RibbonTransitionsSectionComponent {
18680
20258
  private readonly editor;
18681
20259
  readonly slideIndex: _angular_core.InputSignal<number>;
18682
- readonly selectedTransition: _angular_core.InputSignal<PptxTransitionType>;
18683
- readonly transitionDurationSec: _angular_core.InputSignal<number>;
18684
- readonly present: _angular_core.OutputEmitterRef<void>;
18685
20260
  readonly toggleInspector: _angular_core.OutputEmitterRef<void>;
18686
- readonly transitionChange: _angular_core.OutputEmitterRef<PptxTransitionType>;
18687
- readonly durationChange: _angular_core.OutputEmitterRef<number>;
18688
- protected readonly transitionPresets: readonly {
18689
- value: PptxTransitionType;
18690
- labelKey: string;
18691
- }[];
18692
- protected readonly advanceOnClick: _angular_core.WritableSignal<boolean>;
18693
- protected readonly advanceAfter: _angular_core.WritableSignal<boolean>;
18694
- protected readonly advanceAfterSeconds: _angular_core.WritableSignal<string>;
18695
- /** Apply the chosen transition to the active slide. */
20261
+ protected readonly transitionPresets: readonly RibbonTransitionPreset[];
20262
+ /**
20263
+ * The draft the user is editing, tagged with the slide it belongs to. Null
20264
+ * until a control is touched, and abandoned as soon as the active slide
20265
+ * changes, which is what makes the tab re-read the new slide.
20266
+ */
20267
+ private readonly edited;
20268
+ /**
20269
+ * What the tab's controls say: the live draft for THIS slide, otherwise the
20270
+ * slide's own transition read back through shared. Keeping the untouched
20271
+ * case derived from the deck is what stops the tab reporting the last preset
20272
+ * the user clicked after they navigate away.
20273
+ */
20274
+ protected readonly draft: _angular_core.Signal<RibbonTransitionDraft>;
20275
+ /** Replay the active slide's transition on the stage. Never writes. */
20276
+ protected preview(): void;
20277
+ /** Apply the chosen preset to the active slide. */
18696
20278
  protected setTransition(type: PptxTransitionType): void;
18697
20279
  protected onDurationChange(event: Event): void;
18698
- /** Apply the current transition to every slide in the deck. */
20280
+ protected onAdvanceOnClick(event: Event): void;
20281
+ protected onAdvanceAfter(event: Event): void;
20282
+ protected onAdvanceAfterText(event: Event): void;
20283
+ /** Apply the current draft to every slide in the deck. */
18699
20284
  protected applyToAll(): void;
20285
+ /**
20286
+ * Merge a control's change into the draft and write the resulting transition
20287
+ * onto every targeted slide, preserving each slide's own direction / spokes /
20288
+ * sound / raw XML through the shared merge.
20289
+ */
20290
+ private commit;
18700
20291
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RibbonTransitionsSectionComponent, never>;
18701
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonTransitionsSectionComponent, "pptx-ribbon-transitions-section", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; "selectedTransition": { "alias": "selectedTransition"; "required": false; "isSignal": true; }; "transitionDurationSec": { "alias": "transitionDurationSec"; "required": false; "isSignal": true; }; }, { "present": "present"; "toggleInspector": "toggleInspector"; "transitionChange": "transitionChange"; "durationChange": "durationChange"; }, never, never, true, never>;
20292
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RibbonTransitionsSectionComponent, "pptx-ribbon-transitions-section", never, { "slideIndex": { "alias": "slideIndex"; "required": false; "isSignal": true; }; }, { "toggleInspector": "toggleInspector"; }, never, never, true, never>;
18702
20293
  }
18703
20294
 
18704
20295
  declare class RibbonViewSectionComponent {
@@ -18767,110 +20358,6 @@ declare function exitPresentationFullscreen(doc: Document | null | undefined): v
18767
20358
  */
18768
20359
  declare function hasExitedFullscreen(doc: Document | null | undefined): boolean;
18769
20360
 
18770
- /**
18771
- * presentation-overlay-helpers.ts
18772
- *
18773
- * Pure functions used by PresentationOverlayComponent.
18774
- * Exported separately so they can be unit-tested without TestBed.
18775
- */
18776
-
18777
- /**
18778
- * Whether a click/tap/swipe advance must be swallowed instead of moving to the
18779
- * next slide. A click still steps the current slide's remaining animation
18780
- * builds, so this only blocks once they are exhausted (`playbackComplete`) and
18781
- * only when the slide's transition sets advanceOnClick to false. Keyboard and
18782
- * the on-screen next/prev buttons never consult this.
18783
- */
18784
- declare function shouldBlockClickAdvance(playbackComplete: boolean, slide: PptxSlide | undefined): boolean;
18785
- /**
18786
- * Delay in ms before the show steps to the next slide on its own, or
18787
- * `undefined` when the current slide waits for input.
18788
- *
18789
- * The counterpart to {@link shouldBlockClickAdvance}: PowerPoint's
18790
- * `p:transition/@advTm` ("Advance slide: After <n>"). A slide authored
18791
- * `advClick="0" advTm="…"` is advanced ONLY by this timer, so honouring the
18792
- * click gate without also arming the timer strands the show on that slide with
18793
- * no visible response to any input. Nothing is scheduled once the end-of-show
18794
- * screen is up, or when the show is set to advance manually.
18795
- */
18796
- declare function resolveSlideAutoAdvanceMs(slide: PptxSlide | undefined, useTimings: boolean, endOfShow: boolean): number | undefined;
18797
- /**
18798
- * Attach the show's visibility pause: while the tab is hidden the shared
18799
- * handler pauses the stage's playing media and the cross-slide persistent
18800
- * audio, and the binding-provided callbacks cancel / re-arm the timed
18801
- * auto-advance so the deck does not run on unseen. Returns the detach
18802
- * function. Kept TestBed-free so the wiring can be unit-tested directly.
18803
- */
18804
- declare function attachShowVisibilityPause(deps: {
18805
- /** The overlay root containing the stage; only media inside it is paused. */
18806
- root: ParentNode | undefined;
18807
- /** Cancel the pending auto-advance timer (the tab was hidden). */
18808
- cancelAutoAdvance: () => void;
18809
- /** Re-arm the auto-advance timer for the current slide (tab visible again). */
18810
- rearmAutoAdvance: () => void;
18811
- }): () => void;
18812
- /**
18813
- * The show has ENDED (never a slide change): stop and remove all cross-slide
18814
- * "play across slides" persistent audio. Called by the host's exit paths
18815
- * (`closePresentation` / `exitPresenter`), not by the overlay's own destroy,
18816
- * because swapping to the presenter console destroys the overlay while the
18817
- * show, and its background audio, carry on.
18818
- */
18819
- declare function endShowMediaCleanup(): void;
18820
- /**
18821
- * Clamp `index` to the valid range [0, count - 1].
18822
- * Returns 0 when `count` is 0 to avoid -1 states.
18823
- */
18824
- declare function clampIndex(index: number, count: number): number;
18825
- /**
18826
- * Return the next visible (non-hidden) slide index after `current`.
18827
- * Wraps around to `current` if no subsequent visible slide exists.
18828
- *
18829
- * Thin adapter over the shared show-order rule: Angular used to own this logic
18830
- * outright, which is exactly why the other four bindings presented hidden
18831
- * slides. Kept as a named export because the overlay's tests and the navigator
18832
- * read better in terms of "next visible slide" than raw index lists.
18833
- */
18834
- declare function nextVisibleIndex(current: number, slides: readonly PptxSlide[]): number;
18835
- /**
18836
- * Return the previous visible (non-hidden) slide index before `current`.
18837
- * Returns `current` when no earlier visible slide exists: PowerPoint never
18838
- * wraps backward off the first slide.
18839
- */
18840
- declare function prevVisibleIndex(current: number, slides: readonly PptxSlide[]): number;
18841
- /**
18842
- * Compute the zoom level that fits a canvas of `canvasW × canvasH` pixels
18843
- * into a viewport of `vw × vh` pixels, preserving aspect ratio.
18844
- *
18845
- * Returns 1 as a safe fallback when any dimension is zero or negative.
18846
- */
18847
- declare function fitZoom(canvasW: number, canvasH: number, vw: number, vh: number): number;
18848
- /**
18849
- * Whether a visible (non-hidden) slide exists strictly AFTER `current`.
18850
- *
18851
- * `nextVisibleIndex` wraps, which would make a show loop for ever. PowerPoint
18852
- * only loops when "Loop continuously until Esc" is set; otherwise running past
18853
- * the last slide ends the show. Callers use this to tell "there is a next
18854
- * slide" from "we just wrapped".
18855
- */
18856
- declare function hasVisibleSlideAfter(current: number, slides: readonly PptxSlide[]): boolean;
18857
- /** The show's first visible slide (Home), or 0 for an empty deck. */
18858
- declare function firstVisibleIndex(slides: readonly PptxSlide[]): number;
18859
- /** The show's last visible slide (End), or 0 for an empty deck. */
18860
- declare function lastVisibleIndex(slides: readonly PptxSlide[]): number;
18861
- /**
18862
- * Style record centring the scaled slide stage in the viewport.
18863
- *
18864
- * The offsets are computed numerically ((viewport - scaled size) / 2, exactly
18865
- * how React's PresentationStage centres) rather than with the historical
18866
- * `left/top: 50%` + `translate(-50%, -50%)`: a transform makes the stage a
18867
- * stacking context, which trapped every z-index inside it (the ink annotation
18868
- * overlay in particular) BELOW the sibling blackout sheet, so blackboard
18869
- * strokes painted invisibly under the black screen. See the shared
18870
- * `render/presentation-blackboard` module for the layering rules.
18871
- */
18872
- declare function presentationStageStyle(size: CanvasSize, zoom: number, viewportW: number, viewportH: number): Record<string, string>;
18873
-
18874
20361
  /**
18875
20362
  * touch-gestures.ts: thin Angular adapter over the framework-agnostic
18876
20363
  * `createTouchGestureRecognizer` from `pptx-viewer-shared`.
@@ -19117,6 +20604,15 @@ declare class MediaRendererComponent {
19117
20604
  readonly interactive: _angular_core.InputSignal<boolean>;
19118
20605
  /** Keep the data-pptx-element marker on interaction-locked template elements. */
19119
20606
  readonly marked: _angular_core.InputSignal<boolean>;
20607
+ /**
20608
+ * When true (default), the rendered node carries `data-element-id`. The
20609
+ * miniature surfaces that paint every slide at once turn it off so one
20610
+ * element id resolves to exactly one node in the document; see
20611
+ * `ElementRendererComponent.exposeElementId`.
20612
+ */
20613
+ readonly exposeElementId: _angular_core.InputSignal<boolean>;
20614
+ /** `data-element-id` for this element, or null on a miniature surface. */
20615
+ readonly elementIdAttr: _angular_core.Signal<string | null>;
19120
20616
  /**
19121
20617
  * `pointer-events: none` while not interactive, mirroring React's
19122
20618
  * `pointer-events-none` class. {@link marked} keeps the element findable via
@@ -19178,7 +20674,7 @@ declare class MediaRendererComponent {
19178
20674
  readonly captionTracks: _angular_core.Signal<ResolvedCaptionTrack[]>;
19179
20675
  readonly clrChangeParams: _angular_core.Signal<ClrChangeParams | undefined>;
19180
20676
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MediaRendererComponent, never>;
19181
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MediaRendererComponent, "pptx-media-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "marked": { "alias": "marked"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "placeholderLabel": { "alias": "placeholderLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
20677
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MediaRendererComponent, "pptx-media-renderer", never, { "element": { "alias": "element"; "required": true; "isSignal": true; }; "mediaDataUrls": { "alias": "mediaDataUrls"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "marked": { "alias": "marked"; "required": false; "isSignal": true; }; "exposeElementId": { "alias": "exposeElementId"; "required": false; "isSignal": true; }; "presenting": { "alias": "presenting"; "required": false; "isSignal": true; }; "placeholderLabel": { "alias": "placeholderLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
19182
20678
  }
19183
20679
 
19184
20680
  /**
@@ -19388,10 +20884,10 @@ declare class RemoteSelectionOverlayComponent {
19388
20884
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<RemoteSelectionOverlayComponent, "pptx-remote-selection-overlay", never, { "presences": { "alias": "presences"; "required": false; "isSignal": true; }; "elements": { "alias": "elements"; "required": false; "isSignal": true; }; "activeSlideIndex": { "alias": "activeSlideIndex"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
19389
20885
  }
19390
20886
 
19391
- /** Payload of `renameElement`: `undefined` clears the element's name. */
20887
+ /** Payload of `renameElement`: an empty `name` clears the element's name. */
19392
20888
  interface SelectionPaneRename {
19393
20889
  id: string;
19394
- name: string | undefined;
20890
+ name: string;
19395
20891
  }
19396
20892
  declare class SelectionPaneComponent {
19397
20893
  /** All elements on the active slide. */
@@ -19406,7 +20902,7 @@ declare class SelectionPaneComponent {
19406
20902
  readonly sendBackward: _angular_core.OutputEmitterRef<string>;
19407
20903
  /** Emits the id of the element whose hidden flag should be toggled. */
19408
20904
  readonly toggleHidden: _angular_core.OutputEmitterRef<string>;
19409
- /** Emits the rename commit; `name: undefined` clears the element's name. */
20905
+ /** Emits the rename commit; an empty `name` clears the element's name. */
19410
20906
  readonly renameElement: _angular_core.OutputEmitterRef<SelectionPaneRename>;
19411
20907
  /** Elements reversed so the topmost (last in array) appears first in the list. */
19412
20908
  protected readonly reversedElements: _angular_core.Signal<readonly PptxElement[]>;
@@ -19439,6 +20935,13 @@ declare class ThemeGalleryComponent {
19439
20935
  */
19440
20936
  readonly activeName: _angular_core.InputSignal<string | undefined>;
19441
20937
  readonly theme: _angular_core.InputSignal<PptxTheme | undefined>;
20938
+ /**
20939
+ * Which face the gallery opens on: the preset grid (false) or the theme
20940
+ * editor (true). Design > Edit Theme names the editor, so it opens straight
20941
+ * into it rather than making the user find the footer's customise button.
20942
+ * Only consulted as the overlay opens; the footer button still flips freely.
20943
+ */
20944
+ readonly startCustomizing: _angular_core.InputSignal<boolean>;
19442
20945
  /** Emitted when the user confirms a selection. */
19443
20946
  readonly applyTheme: _angular_core.OutputEmitterRef<PptxThemePreset>;
19444
20947
  readonly applyCustomTheme: _angular_core.OutputEmitterRef<CustomThemeEdit>;
@@ -19448,11 +20951,12 @@ declare class ThemeGalleryComponent {
19448
20951
  /** The currently highlighted (not yet applied) preset, or null. */
19449
20952
  protected readonly selected: _angular_core.WritableSignal<PptxThemePreset | null>;
19450
20953
  protected readonly customizing: _angular_core.WritableSignal<boolean>;
20954
+ constructor();
19451
20955
  protected selectPreset(preset: PptxThemePreset): void;
19452
20956
  protected applySelected(): void;
19453
20957
  protected onBackdropClick(event: MouseEvent): void;
19454
20958
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThemeGalleryComponent, never>;
19455
- 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>;
20959
+ 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; }; "startCustomizing": { "alias": "startCustomizing"; "required": false; "isSignal": true; }; }, { "applyTheme": "applyTheme"; "applyCustomTheme": "applyCustomTheme"; "close": "close"; }, never, never, true, never>;
19456
20960
  }
19457
20961
 
19458
20962
  declare class TitleBarComponent {
@@ -19633,5 +21137,6 @@ declare function thumbnailHeight(canvasW: number, canvasH: number, thumbW: numbe
19633
21137
  */
19634
21138
  declare function gridColumns(containerW: number, thumbW: number, gap: number, maxCols: number): number;
19635
21139
 
19636
- export { ALIGN_OPTIONS, ANIMATION_PRESET_CATEGORIES, AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AVATAR_COLOR_SWATCHES, AXIS_LABEL_COLOR, AccessibilityPanelComponent, AccessibilityService, AccountPageComponent, ActionSettingsPanelComponent, AdvancedChartEditorComponent, AiChangeOverlayComponent, AiChatPanelComponent, AiChatService, AiComposerComponent, AiFocusBarComponent, AiFocusHighlightOverlayComponent, AiHistoryMenuComponent, AiHistoryService, AiMessageListComponent, AiPanelStore, AiProposalCardComponent, AiSettingsSectionComponent, AiToolCallCardComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, AutosaveService, BroadcastDialogComponent, CHART_EDITOR_STYLES, CURSOR_PALETTE, CanvasFitService, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointMarkerOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartElementViewComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartPartSelectionService, ChartPrimitivesComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, ColorChangedImageComponent, CommentMarkersOverlayComponent, 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_PATTERN_FILL_PRESET, 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, GRIDLINE_COLOR, 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, MOTION_PATH_COLUMNS, MediaPreviewComponent, MediaPropertiesPanelComponent, MediaRendererComponent, MediaTrimTimelineComponent, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesHandoutCardComponent, NotesPanelComponent, NotesToolbarComponent, OleRendererComponent, OutlineViewOverlayComponent, POWER_POINT_VIEWER_PROVIDERS, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PRESENTER_TIMER_SEGMENT_MS, PX_PER_CM, PX_PER_INCH, PasswordProtectionDialogComponent, PasswordStrengthMeterComponent, PowerPointViewerComponent, PresentToolbarAutoHide, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationPropertiesPanelComponent, PresentationSettingsCardComponent, PresentationSubtitleBarComponent, PresentationToolbarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, REPEAT_MODE_OPTIONS, RESIZE_HANDLES, RULER_FONT_SIZE, RULER_THICKNESS, ReadingViewOverlayComponent, RemoteSelectionOverlayComponent, RibbonAnimationGalleryComponent, RibbonAnimationsSectionComponent, RibbonArrangeSectionComponent, RibbonColorPopoverComponent, RibbonComponent, RibbonDesignSectionComponent, RibbonDrawSectionComponent, RibbonDrawingGroupComponent, RibbonEditingSectionComponent, RibbonFileSectionComponent, RibbonFontControlsComponent, RibbonHomeSectionComponent, RibbonHyperlinkButtonComponent, RibbonInsertFieldsComponent, RibbonInsertSectionComponent, RibbonMotionPathGalleryComponent, RibbonParagraphControlsComponent, RibbonPrimaryRowComponent, RibbonReviewSectionComponent, RibbonShapeExtrasComponent, RibbonSlideshowSectionComponent, RibbonTransitionsSectionComponent, RibbonViewSectionComponent, RulerGuidesService, SEQUENCE_OPTIONS, SEVERITY_GROUPS, SEVERITY_LABELS, SHORTCUT_REFERENCE_ITEMS, 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, SlideBackgroundCardComponent, SlideCanvasComponent, SlideDefaultInspectorComponent, SlideDiffChangesComponent, SlideDiffRowComponent, SlideDiffThumbnailsComponent, SlideSizeCardComponent, SlideSorterOverlayComponent, SlideThemeOverridePanelComponent, SlideTransitionCardComponent, SlidesPanelComponent, SmartArt3DRendererComponent, SmartArt3DService, SmartArtPreviewComponent, SmartArtPropertiesComponent, SmartArtRendererComponent, StatusBarComponent, TABLE_STRUCTURE_TOGGLES, TEXT_3D_BOTTOM_BEVEL_KEYS, TEXT_3D_TOP_BEVEL_KEYS, TEXT_DIRECTION_OPTIONS, THEME_CATALOG, TIMING_CURVE_OPTIONS, TRIGGER_OPTIONS, TYPE_LABELS, TableCellAdvancedFillComponent, TableCellFormattingComponent, TableDataEditorComponent, TablePropertiesComponent, TableRendererComponent, TableResizeOverlayComponent, TableSelectionService, TagsCardComponent, Text3DBevelSectionComponent, Text3DPanelComponent, TextAdvancedPanelComponent, ThemeEditorFieldsComponent, ThemeGalleryComponent, ThemeSelectorCardComponent, TitleBarComponent, TitleBarSearchComponent, TransitionDirectionPickerComponent, TransitionPreviewComponent, 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, ZERO_LINE_COLOR, ZoomNavigationService, ZoomRendererComponent, ZoomTargetService, addCategory, addCommentToList, addGradientStopPatch, addItem, addSeries, addSubItem, advanceStep, affordanceElements, aiToggleVisible, alignPatch, animationFor, animationPresetLabelKey, annotationMapToInkInserts, applyAcceptedDiff, applyAnimationPreset, applyFindReplacements, applyFormatToElement, applyMove, applyResize, applyTableStylePreset, asMediaElement, assignUserColor, attachShowVisibilityPause, attachTouchGestures, axisTickValues, beginNodeEdit, bevelSizePatch, 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, canGroupSelection, canRemoveTopLevelNode, canSetStrokeWidth, canStartBroadcast, canStartShare, canUngroupSelection, 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, 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, endShowMediaCleanup, estimatePageCount, evenColumnWidths, evenRowHeights, exitPresentationFullscreen, exportAiChatLogs, extractPathPoints, eyedropperAvailable, fillColorOf, findInSlides, findOwningSlideIndex, findSlideIndexByElementId, firstVisibleIndex, fitPolynomial, fitZoom, focusTargetChips, fontMimeForFormat, fontSizeOf, forgetSessionDeck, formatAutoNumber, formatAxisValue, formatBytes, formatCursorLabel, formatElapsed, formatFileSize, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, generateCustomShowId, generatePressureCircles, generateTicks, getClrChangeParams, getContainerStyle, getDuotoneFilterDef, getImageSrc, getLocalStorageUsageSummary, getOleAriaLabel, getOleBadgeLabel, getOleDisplayName, getOleDownloadFileName, getOleTypeColor, getOleTypeLabel, getPasswordStrength, getPatternSvg, getPlaceholderStyle, getVersions as getRecoveryVersions, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getSessionTabId, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getSmartArtNodeBounds, getSpeechRecognitionCtor, getTextBlockStyle, getTextWarp, getTouchDistance, getWarpCategory, getWarpPath, gradientStateFromStyle, gradientStateOf, gradientStatePatch, gridColumns, groupElements, groupIssuesBySeverity, hasAnimation, hasCopyableFormat, hasExistingLink, hasExitedFullscreen, hasGradientFill, hasPressureVariation, hasVisibleSlideAfter, headerLabel, imageDimensions, inkViewBox, insertTableElementColumn as insertColumn, insertTableElementRow as insertRow, interpolateWidth, isAudienceTab, isBold, isBrowserOpenableMime, isChildNode, isElementInteractive, isInjectableUrl, isItalic, isPpactionUrl, isPresenterMessage, isSigned, isTextElement, isTwoTableFocus, isUnderline, isUrlSafe, isValidRoomId, isViewportBackgroundPressTarget, isZoomActivationKey, issueTrackKey, issueTypeLabel, keyToLabel, lastVisibleIndex, latexToMathml, linePointsToSvgString, lineSpacingPatch, loadAudienceContent, loadSessionDeck, mediaFallbackFor, mediaSurfaceFor, 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, patternPresetOptions, pendingElementStyles, pickColorByClickFallback, pickFile, pickSupportedMimeType, planGifFrames, planVideoSegments, pointsToSvgPathD, presenceToCursors, presentationStageStyle, presenterTimerProgress, presetByLayout, presetsForCategory, pressuresToWidths, prevVisibleIndex, projectDrawingShapes, promoteNode, provideViewerTheme, radarAngle, radarRingPoints, readAsDataUrl, recordWebm, redistributeColumnWidth, registerCrossSlideAudio, rememberSessionDeck, removeAnimation, removeCategory, removeTableElementColumn as removeColumn, removeCommentFromList, removeElementAnimation, removeGradientStopPatch, removeNode, removeTableElementRow as removeRow, removeSeries, renderToCanvas, reorderAnimationDown, reorderAnimationUp, replaceInSlides, replaceMatch, requestPresentationFullscreen, resizeElement, resolveCaptionTracks, resolveChartKind, resolveFontVariant, resolveHyperlinkHref, resolveInteractiveElementId, resolveMediaSrc, resolveOleType, resolveParagraphBullet, resolvePresenterNotes, resolveProfileInitial, resolveRegionCode, resolveSlideAutoAdvanceMs, resolvePalette as resolveSmartArtPalette, resolveThemeCatalogEntry, resolveTransitionDuration, restoreSessionDeck, revealedElementStyles, routeOrthogonalConnector, rowStyle, rulerDragToGuidePosition, rulerHighlight, rulerStripTicks, 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, setDataPointMarker, 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, slidesWithReappliedLayout, smartArtNodes, paletteColour as smartArtPaletteColour, snapToGridStep, splitCursorCell, splitMergedCell, statusKind, statusLabel$1 as statusLabel, storeAudienceContent, stringFromEvent, strokeColorOf, strokeToInkElement, strokeWidthOf, 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 };
19637
- export type { AccessibilityIssueGroup, AccountAuthConfig, ActionDescriptor, AiCanvasHighlight, AiChatInitState, AiHistoryInitDeps, AiLogChat, AiLogExport, AiLogFormat, AiLogMessage, AiPanelSelectionAccessors, AlignBox, AlignMode, AnimationClickGroup, AnimationGroup, AnimationPresetCategory, AnimationPresetEntry, AnimationPresetPick, 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, MotionPathColumn, MotionPathEntry, NodeEditBox, NotesSegmentViewModel, ObjectUrlFactory, OleActionModel, OleInfoRow, OuterShadowState, OutlineCommit, OverallSignatureStatus, PartitionedSlides, PathPoint, PieSliceGeometry, PieSliceOptions, PlotLayout, PlotLayoutOptions, PositionUpdate, PowerPointViewerAPI, PptxAiBridge, PptxAiConfig, PptxAiConnection, PptxAiContextStrategy, PptxAiElementUpdate, PptxAiToolName, PptxAiUIMessage, PptxAiWritePolicy, PresentToolbarAction, PresentationTool, PresenterExitMessage, PresenterMessage, PresenterNotes, PresenterSlideChangeMessage, PresenterTimerProgress, 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, RulerUnit, ScatterDot, SelectionBox, SessionDeck, 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, Text3DBevelKeys, TextAdvancedChanges, TextAdvancedState, TextStyleChanges, TextWarpCssDef, TextWarpDef, TextWarpPathDef, ThemeCatalogEntry, Tick, ToolbarActionId, TouchGestureCallbacks, TranslationKey, UngroupResult, ValueRange, VideoPlanOptions, VideoSegmentPlan, ViewerMode, ViewerProfile, ViewerSettings, ViewerTheme, ViewerThemeColors, ZoomTranslate, ZoomViewModel };
21140
+ export { ALIGN_OPTIONS, ANIMATION_PRESET_CATEGORIES, AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AVATAR_COLOR_SWATCHES, AXIS_LABEL_COLOR, AccessibilityPanelComponent, AccessibilityService, AccountPageComponent, ActionSettingsPanelComponent, AdvancedChartEditorComponent, AiChangeOverlayComponent, AiChatPanelComponent, AiChatService, AiComposerComponent, AiFocusBarComponent, AiFocusHighlightOverlayComponent, AiHistoryMenuComponent, AiHistoryService, AiMessageListComponent, AiPanelStore, AiProposalCardComponent, AiSettingsSectionComponent, AiToolCallCardComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, AutosaveRecoveryDialogComponent, AutosaveService, BroadcastDialogComponent, CHART_EDITOR_STYLES, CURSOR_PALETTE, CanvasFitService, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointMarkerOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartElementViewComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartPartSelectionService, ChartPrimitivesComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, ColorChangedImageComponent, CommentMarkersOverlayComponent, 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_PATTERN_FILL_PRESET, 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, GRIDLINE_COLOR, 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, MOTION_PATH_COLUMNS, MediaPreviewComponent, MediaPropertiesPanelComponent, MediaRendererComponent, MediaTrimTimelineComponent, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesHandoutCardComponent, NotesPanelComponent, NotesToolbarComponent, OleRendererComponent, OutlineViewOverlayComponent, POWER_POINT_VIEWER_PROVIDERS, PPTX_OPEN_ACCEPT, PRESENTATION_OPEN_EXTENSIONS, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PRESENTER_TIMER_SEGMENT_MS, PX_PER_CM, PX_PER_INCH, PasswordProtectionDialogComponent, PasswordStrengthMeterComponent, PowerPointViewerComponent, PresentToolbarAutoHide, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationPropertiesPanelComponent, PresentationSettingsCardComponent, PresentationSubtitleBarComponent, PresentationToolbarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, REPEAT_MODE_OPTIONS, RESIZE_HANDLES, RULER_FONT_SIZE, RULER_THICKNESS, ReadingViewOverlayComponent, RemoteSelectionOverlayComponent, RibbonAnimationGalleryComponent, RibbonAnimationsSectionComponent, RibbonArrangeSectionComponent, RibbonColorPopoverComponent, RibbonComponent, RibbonDesignSectionComponent, RibbonDrawSectionComponent, RibbonDrawingGroupComponent, RibbonEditingSectionComponent, RibbonFileSectionComponent, RibbonFontControlsComponent, RibbonHomeSectionComponent, RibbonHyperlinkButtonComponent, RibbonInsertFieldsComponent, RibbonInsertSectionComponent, RibbonMotionPathGalleryComponent, RibbonParagraphControlsComponent, RibbonPrimaryRowComponent, RibbonReviewSectionComponent, RibbonShapeExtrasComponent, RibbonSlideshowSectionComponent, RibbonTransitionsSectionComponent, RibbonViewSectionComponent, RulerGuidesService, SEQUENCE_OPTIONS, SEVERITY_GROUPS, SEVERITY_LABELS, SHORTCUT_REFERENCE_ITEMS, 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, SlideBackgroundCardComponent, SlideCanvasComponent, SlideDefaultInspectorComponent, SlideDiffChangesComponent, SlideDiffRowComponent, SlideDiffThumbnailsComponent, SlideSizeCardComponent, SlideSorterOverlayComponent, SlideThemeOverridePanelComponent, SlideTransitionCardComponent, SlidesPanelComponent, SmartArt3DRendererComponent, SmartArt3DService, SmartArtPreviewComponent, SmartArtPropertiesComponent, SmartArtRendererComponent, StatusBarComponent, TABLE_STRUCTURE_TOGGLES, TEXT_3D_BOTTOM_BEVEL_KEYS, TEXT_3D_TOP_BEVEL_KEYS, TEXT_DIRECTION_OPTIONS, THEME_CATALOG, TIMING_CURVE_OPTIONS, TRIGGER_OPTIONS, TYPE_LABELS, TableCellAdvancedFillComponent, TableCellFormattingComponent, TableDataEditorComponent, TablePropertiesComponent, TableRendererComponent, TableResizeOverlayComponent, TableSelectionService, TagsCardComponent, Text3DBevelSectionComponent, Text3DPanelComponent, TextAdvancedPanelComponent, ThemeEditorFieldsComponent, ThemeGalleryComponent, ThemeSelectorCardComponent, TitleBarComponent, TitleBarSearchComponent, TransitionDirectionPickerComponent, TransitionPreviewComponent, 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, ZERO_LINE_COLOR, ZoomNavigationService, ZoomRendererComponent, ZoomTargetService, addCategory, addCommentToList, addGradientStopPatch, addItem, addSeries, addSubItem, advanceStep, affordanceElements, aiToggleVisible, alignPatch, animationFor, animationPresetLabelKey, annotationMapToInkInserts, applyAcceptedDiff, applyAnimationPreset, applyFindReplacements, applyFormatToElement, applyMove, applyResize, applyTableStylePreset, asMediaElement, assignUserColor, attachShowVisibilityPause, attachTouchGestures, axisTickValues, beginNodeEdit, bevelSizePatch, 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, canGroupSelection, canRemoveTopLevelNode, canSetStrokeWidth, canStartBroadcast, canStartShare, canUngroupSelection, canUseClipboard, captionDisplayText, cellRunStyle, cellStyleToStyleMap, cellTdStyle, changeCountLabel, changeIcon, characterSpacingPatch, chartPreserveAspectRatio, 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, computeResizeHandleBoxes, computeRotateHandleBox, computeScatterDots, computeScatterXDomain, computeSelectionBoxes, computeSingleSelected, computeSlideIndices, computeSnap, computeStackedBarRects, computeStackedValueRange, 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, endShowMediaCleanup, estimatePageCount, evenColumnWidths, evenRowHeights, exitPresentationFullscreen, exportAiChatLogs, extractPathPoints, eyedropperAvailable, fillColorOf, findInSlides, findOwningSlideIndex, findSlideIndexByElementId, firstVisibleIndex, fitPolynomial, fitZoom, focusTargetChips, fontMimeForFormat, fontSizeOf, forgetSessionDeck, formatAxisValue, formatBytes, formatCursorLabel, formatElapsed, formatFileSize, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, generateCustomShowId, generatePressureCircles, generateTicks, getClrChangeParams, getContainerStyle, getDuotoneFilterDef, getImageSrc, getLocalStorageUsageSummary, getOleAriaLabel, getOleBadgeLabel, getOleDisplayName, getOleDownloadFileName, getOleTypeColor, getOleTypeLabel, getPasswordStrength, getPatternSvg, getPlaceholderStyle, getVersions as getRecoveryVersions, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getSessionTabId, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getSmartArtNodeBounds, getSpeechRecognitionCtor, getTextBlockStyle, getTextWarp, getTouchDistance, getWarpCategory, getWarpPath, gradientStateFromStyle, gradientStateOf, gradientStatePatch, gridColumns, groupIssuesBySeverity, hasAnimation, hasCopyableFormat, hasExistingLink, hasExitedFullscreen, hasGradientFill, hasPressureVariation, hasVisibleSlideAfter, headerLabel, imageDimensions, inkViewBox, insertTableElementColumn as insertColumn, insertTableElementRow as insertRow, interpolateWidth, isAudienceTab, isBold, isBrowserOpenableMime, isChildNode, isElementInteractive, isInjectableUrl, isItalic, isLegacyBinaryPresentation, isPpactionUrl, isPresenterMessage, isSigned, isSupportedPresentationFile, isTextElement, isTwoTableFocus, isUnderline, isUrlSafe, isValidRoomId, isViewportBackgroundPressTarget, isZoomActivationKey, issueTrackKey, issueTypeLabel, keyToLabel, lastVisibleIndex, latexToMathml, layoutConnectorPaints, layoutNodeLabels, linePointsToSvgString, lineSpacingPatch, loadAudienceContent, loadSessionDeck, mediaFallbackFor, mediaSurfaceFor, 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, patternPresetOptions, pendingElementStyles, pickColorByClickFallback, pickFile, pickSupportedMimeType, planGifFrames, planVideoSegments, pointsToSvgPathD, presenceToCursors, presentationBaseName, presentationStageStyle, presenterTimerProgress, presetByLayout, presetsForCategory, pressuresToWidths, prevVisibleIndex, projectDrawingShapes, promoteNode, provideViewerTheme, radarAngle, radarRingPoints, readAsDataUrl, recordWebm, redistributeColumnWidth, registerCrossSlideAudio, rememberSessionDeck, removeAnimation, removeCategory, removeTableElementColumn as removeColumn, removeCommentFromList, removeElementAnimation, removeGradientStopPatch, removeNode, removeTableElementRow as removeRow, removeSeries, renderToCanvas, reorderAnimationDown, reorderAnimationUp, replaceInSlides, replaceMatch, requestPresentationFullscreen, resizeElement, resolveCaptionTracks, resolveChartKind, resolveFontVariant, resolveHyperlinkHref, resolveInteractiveElementId, resolveMediaSrc, resolveOleType, resolveParagraphBullet, resolvePresenterNotes, resolveProfileInitial, resolveRegionCode, resolveSlideAutoAdvanceMs, resolvePalette as resolveSmartArtPalette, resolveThemeCatalogEntry, resolveTransitionDuration, restoreSessionDeck, revealedElementStyles, routeOrthogonalConnector, rowStyle, rulerDragToGuidePosition, rulerHighlight, rulerStripTicks, sampleColorFromSlide, sanitizeColor, sanitizeSlideIndex, sanitizeUserName, saveViewerProfile, savedPresentationFileName, 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, setDataPointMarker, 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, slidesWithReappliedLayout, smartArtNodes, paletteColour as smartArtPaletteColour, snapToGridStep, splitCursorCell, splitMergedCell, statusKind, statusLabel$1 as statusLabel, storeAudienceContent, stringFromEvent, strokeColorOf, strokeToInkElement, strokeWidthOf, styleShadowFilter, textAdvancedPatch, textAdvancedStateFromStyle, textAdvancedStateOf, textColorOf, textDirectionPatch, textStyleOf, textStylePatch, themeStyle, themeToCssVars, thumbnailHeight, thumbnailZoom, toggleCommentResolvedInList, toggleNodeBold, toggleNodeItalic, toggleSheet, topLevelNodeCount, transformSelectedTextCase, translationsEn, updateElementById, updateGlowPatch, updateGradientStopPatch, updateInnerShadowPatch, updateOuterShadowPatch, updateReflectionPatch, vAlignPatch, validatePassword, validatePrintSettings, validateRoomId, valueToY, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, waypointsToPathD, worstStatus, zoomTargetSlideIndex };
21141
+ export type { AccessibilityIssueGroup, AccountAuthConfig, ActionDescriptor, ActiveShow, AiCanvasHighlight, AiChatInitState, AiHistoryInitDeps, AiLogChat, AiLogExport, AiLogFormat, AiLogMessage, AiPanelSelectionAccessors, AlignBox, AlignMode, AnimationClickGroup, AnimationGroup, AnimationPresetCategory, AnimationPresetEntry, AnimationPresetPick, 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, HandleBox, HandoutSlidesPerPage, HyperlinkDraft, InkPoint, InkStroke, InlineEditState, InnerShadowState, LegendEntry, LinePoint, LinearFit, LocalIdentity, LocalStorageUsageSummary, LocaleCatalogEntry, MobileSheetKey, Model3DViewModel, MotionPathColumn, MotionPathEntry, NodeEditBox, NotesSegmentViewModel, ObjectUrlFactory, OleActionModel, OleInfoRow, OuterShadowState, OutlineCommit, OverallSignatureStatus, PartitionedSlides, PathPoint, PieSliceGeometry, PieSliceOptions, PlotLayout, PlotLayoutOptions, PositionUpdate, PowerPointViewerAPI, PptxAiBridge, PptxAiConfig, PptxAiConnection, PptxAiContextStrategy, PptxAiElementUpdate, PptxAiToolName, PptxAiUIMessage, PptxAiWritePolicy, PresentToolbarAction, PresentationTool, PresenterExitMessage, PresenterMessage, PresenterNotes, PresenterSlideChangeMessage, PresenterTimerProgress, 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, RulerUnit, SavedPresentationFormat, ScatterDot, ScatterXDomain, SelectionBox, SessionDeck, 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, Text3DBevelKeys, TextAdvancedChanges, TextAdvancedState, TextStyleChanges, TextWarpCssDef, TextWarpDef, TextWarpPathDef, ThemeCatalogEntry, Tick, ToolbarActionId, TouchGestureCallbacks, TranslationKey, ValueRange, VideoPlanOptions, VideoSegmentPlan, ViewerMode, ViewerProfile, ViewerSettings, ViewerTheme, ViewerThemeColors, ZoomTranslate, ZoomViewModel };
21142
+ //# sourceMappingURL=pptx-angular-viewer.d.ts.map