pptx-svelte-viewer 2.18.0 → 2.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/{AiChatPanel-D6dfMwnT.js → AiChatPanel-DKeBilcx.js} +40 -40
  3. package/dist/{export-DbSAFc8m.js → export-CZzvhGTm.js} +28874 -26338
  4. package/dist/i18n.js +1 -1
  5. package/dist/index.d.ts +433 -13
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +34 -27
  8. package/dist/pptx-svelte-viewer.css +1 -1
  9. package/dist/{translator-CZ12ZvlE.js → translator-EP8BTIz6.js} +24 -4
  10. package/dist/viewer/components/chart-drag.svelte.d.ts +39 -0
  11. package/dist/viewer/components/chart-drag.svelte.d.ts.map +1 -0
  12. package/dist/viewer/components/props-editing.d.ts +2 -2
  13. package/dist/viewer/components/props-editing.d.ts.map +1 -1
  14. package/dist/viewer/components/props-elements.d.ts +8 -1
  15. package/dist/viewer/components/props-elements.d.ts.map +1 -1
  16. package/dist/viewer/components/props-stage.d.ts +5 -1
  17. package/dist/viewer/components/props-stage.d.ts.map +1 -1
  18. package/dist/viewer/components/viewer-body-commits.d.ts +6 -0
  19. package/dist/viewer/components/viewer-body-commits.d.ts.map +1 -1
  20. package/dist/viewer/editor/editing-api.d.ts.map +1 -1
  21. package/dist/viewer/editor/editor-adjust-gesture.d.ts.map +1 -1
  22. package/dist/viewer/editor/editor-controller-deps.d.ts +5 -0
  23. package/dist/viewer/editor/editor-controller-deps.d.ts.map +1 -1
  24. package/dist/viewer/editor/editor-controller-wiring.d.ts.map +1 -1
  25. package/dist/viewer/editor/editor-controller.svelte.d.ts +13 -2
  26. package/dist/viewer/editor/editor-controller.svelte.d.ts.map +1 -1
  27. package/dist/viewer/editor/editor-document-lifecycle.d.ts.map +1 -1
  28. package/dist/viewer/editor/editor-document-state.d.ts +6 -2
  29. package/dist/viewer/editor/editor-document-state.d.ts.map +1 -1
  30. package/dist/viewer/editor/editor-handle-handlers.d.ts +2 -2
  31. package/dist/viewer/editor/editor-handle-handlers.d.ts.map +1 -1
  32. package/dist/viewer/editor/editor-keyboard.d.ts +7 -0
  33. package/dist/viewer/editor/editor-keyboard.d.ts.map +1 -1
  34. package/dist/viewer/editor/editor-presentation-metadata.svelte.d.ts +11 -0
  35. package/dist/viewer/editor/editor-presentation-metadata.svelte.d.ts.map +1 -1
  36. package/dist/viewer/editor/editor-selection-interactivity.d.ts +7 -2
  37. package/dist/viewer/editor/editor-selection-interactivity.d.ts.map +1 -1
  38. package/dist/viewer/editor/editor-state.svelte.d.ts +15 -1
  39. package/dist/viewer/editor/editor-state.svelte.d.ts.map +1 -1
  40. package/dist/viewer/editor/table-cell-pointer.d.ts +5 -0
  41. package/dist/viewer/editor/table-cell-pointer.d.ts.map +1 -1
  42. package/dist/viewer/index.d.ts +481 -18
  43. package/dist/viewer/index.js +16 -16
  44. package/dist/viewer/render/contentpart-view.d.ts +8 -21
  45. package/dist/viewer/render/contentpart-view.d.ts.map +1 -1
  46. package/dist/viewer/render/table-view.d.ts.map +1 -1
  47. package/dist/viewer/state/create-viewer-state-editor-ui.svelte.d.ts.map +1 -1
  48. package/dist/viewer/state/create-viewer-state-presentation.svelte.d.ts.map +1 -1
  49. package/dist/viewer/state/create-viewer-state.svelte.d.ts.map +1 -1
  50. package/dist/viewer/state/inspector-deck.d.ts +10 -2
  51. package/dist/viewer/state/inspector-deck.d.ts.map +1 -1
  52. package/dist/viewer/state/presentation-loader.svelte.d.ts +12 -1
  53. package/dist/viewer/state/presentation-loader.svelte.d.ts.map +1 -1
  54. package/dist/viewer/state/viewer-effects.svelte.d.ts +2 -1
  55. package/dist/viewer/state/viewer-effects.svelte.d.ts.map +1 -1
  56. package/dist/viewer/state/viewport-handlers.d.ts +2 -0
  57. package/dist/viewer/state/viewport-handlers.d.ts.map +1 -1
  58. package/package.json +2 -2
package/dist/i18n.js CHANGED
@@ -1,4 +1,4 @@
1
- import { a as s, c as e, i as t, n as r, o, r as n, s as i, t as l } from "./translator-CZ12ZvlE.js";
1
+ import { a as s, c as e, i as t, n as r, o, r as n, s as i, t as l } from "./translator-EP8BTIz6.js";
2
2
  export {
3
3
  o as LOCALE_CATALOG,
4
4
  l as createTranslator,
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Component } from 'svelte';
2
2
  import { LanguageModel, ChatTransport, UIMessage, ToolSet } from 'ai';
3
+ import { Options } from 'html2canvas-pro';
3
4
 
4
5
  //#region src/core/types/actions.d.ts
5
6
  /**
@@ -1144,6 +1145,22 @@ interface ShapeStyle {
1144
1145
  fontRefIdx?: string;
1145
1146
  /** Raw XML colour child of `<a:fontRef>`. */
1146
1147
  fontRefColorXml?: XmlObject;
1148
+ /**
1149
+ * The fill `<a:fillRef>` resolved to, recorded ONLY when the shape's own
1150
+ * `spPr` authored no fill at all, so the reference is what paints it.
1151
+ *
1152
+ * Its absence therefore means "the fill is the shape's own", and its
1153
+ * presence plus an unchanged flat fill means "still purely inherited": see
1154
+ * `authored-shape-style.ts`, the shape-scope twin of `TextStyle`'s
1155
+ * `inheritedRunStyle`.
1156
+ */
1157
+ inheritedFillStyle?: ShapeStyle;
1158
+ /**
1159
+ * The outline `<a:lnRef>` resolved to, recorded before `spPr/a:ln` was
1160
+ * layered on top. A property that still equals this baseline was never
1161
+ * authored on the shape and must not be written back as if it were.
1162
+ */
1163
+ inheritedLineStyle?: ShapeStyle;
1147
1164
  }
1148
1165
  //#endregion
1149
1166
  //#region src/core/types/text.d.ts
@@ -1184,6 +1201,60 @@ interface ShapeStyle {
1184
1201
  interface TextStyle {
1185
1202
  /** Original `a:rPr` XML retained by projections that share the shape-text model. */
1186
1203
  runPropertiesXml?: XmlObject;
1204
+ /**
1205
+ * The properties this run's OWN `a:rPr` authored, and nothing else.
1206
+ *
1207
+ * A run style is assembled as
1208
+ * `{...inheritedRunStyle, ...authoredRunStyle}`, so the flat style is a
1209
+ * fully RESOLVED view: it cannot say whether `fontSize: 60` came from the
1210
+ * run, from the shape's `a:lstStyle`, from the layout placeholder, from the
1211
+ * master `p:txStyles` or from the theme. Omission is meaningful in OOXML
1212
+ * (§21.1.2.3), so a writer that re-emits the resolved view converts every
1213
+ * inherited value into an authored one and the deck stops being
1214
+ * theme-driven after one save.
1215
+ *
1216
+ * This is the run-scope twin of {@link TextSegment.paragraphProperties},
1217
+ * which is parsed strictly from the paragraph's own `a:pPr` for the same
1218
+ * reason. Present only for runs that came from a parsed deck; absent for
1219
+ * SDK-built text, where the flat style IS the only description and must be
1220
+ * written out in full.
1221
+ */
1222
+ authoredRunStyle?: TextStyle;
1223
+ /**
1224
+ * The resolved inheritance baseline {@link authoredRunStyle} was layered
1225
+ * on top of (shape `a:lstStyle` -> placeholder -> layout -> master
1226
+ * `p:txStyles` -> theme -> `p:defaultTextStyle`).
1227
+ *
1228
+ * Kept alongside the authored half because the two answer different
1229
+ * questions. The authored half says "the source pinned this"; the baseline
1230
+ * says "this value is what inheritance already produces", which is how an
1231
+ * EDIT is told apart from an inherited value: an editor mutates the flat
1232
+ * style without knowing about either field, so a property that now differs
1233
+ * from the baseline was either authored or edited and must be written,
1234
+ * while one that still matches can be left to inherit.
1235
+ *
1236
+ * Holds a reference to the per-paragraph baseline object rather than a
1237
+ * copy, so carrying it costs one pointer per run.
1238
+ */
1239
+ inheritedRunStyle?: TextStyle;
1240
+ /**
1241
+ * Snapshot of the ELEMENT-scope paragraph geometry (alignment, margins,
1242
+ * indent, line and paragraph spacing, tab stops, rtl, line-break flags) as
1243
+ * the load pipeline resolved it.
1244
+ *
1245
+ * Present only on an `element.textStyle` that came from a parsed deck, and
1246
+ * populated only with the geometry keys. It exists so the save path can
1247
+ * answer one question it otherwise cannot: has the user CHANGED the body's
1248
+ * alignment or indent, or is the value simply what the shape's
1249
+ * `a:lstStyle`, its layout placeholder and the master already produce?
1250
+ * Element-level text panels (`textAdvancedPatch`, `alignPatch` and friends
1251
+ * in `pptx-viewer-shared`) write `element.textStyle` and never touch
1252
+ * `segment.paragraphProperties`, so a diff against this snapshot is the
1253
+ * only way to tell an edit from an inheritance artefact.
1254
+ *
1255
+ * @see element-paragraph-geometry.ts
1256
+ */
1257
+ resolvedParagraphGeometry?: TextStyle;
1187
1258
  fontFamily?: string;
1188
1259
  fontSize?: number;
1189
1260
  /** When true, renderer should shrink text to fit the shape bounds. */
@@ -1848,6 +1919,15 @@ interface PptxElementBase {
1848
1919
  shapeId?: string;
1849
1920
  /** Element name from `cNvPr/@name`. Used for morph transition matching via the `!!` naming convention. */
1850
1921
  name?: string;
1922
+ /**
1923
+ * `p:nvSpPr/p:nvPr/p:ph/@type` (lower-cased) when the shape is a placeholder:
1924
+ * `title`, `ctrtitle`, `body`, `subtitle`, `ftr`, `dt`, `sldnum`, ...
1925
+ *
1926
+ * Captured on load so consumers can tell a footer placeholder from a text box
1927
+ * without re-walking `rawXml`. Absent on non-placeholder shapes and on
1928
+ * SDK-created elements.
1929
+ */
1930
+ placeholderType?: string;
1851
1931
  x: number;
1852
1932
  y: number;
1853
1933
  width: number;
@@ -1908,6 +1988,19 @@ interface PptxTextProperties {
1908
1988
  }>;
1909
1989
  /** Placeholder prompt text inherited from layout/master (e.g. "Click to add title"). Shown as a greyed-out hint when the shape has no user-entered text. */
1910
1990
  promptText?: string;
1991
+ /**
1992
+ * The string {@link text} was INHERITED from, when this is a header / footer /
1993
+ * date / slide-number placeholder whose own body the file leaves empty.
1994
+ *
1995
+ * PowerPoint keeps the footer string on the slide master and writes each
1996
+ * slide's copy of the `ftr` placeholder empty, so the empty body means
1997
+ * "render the master's footer here". Rendering needs the resolved string, but
1998
+ * SAVING it into the slide would pin that slide to today's master text and
1999
+ * silently detach it from the Header & Footer dialog. The save writer
2000
+ * therefore leaves the authored empty body alone while `text` still equals
2001
+ * this value, and writes a genuine per-slide override once it does not.
2002
+ */
2003
+ inheritedPlaceholderText?: string;
1911
2004
  /** Linked text box chain ID from `a:bodyPr > a:linkedTxbx/@id` or `a:txbx > a:linkedTxbx/@id`. Text overflows from one linked frame to the next. */
1912
2005
  linkedTxbxId?: number;
1913
2006
  /** Sequence number within a linked text box chain (0-based). */
@@ -2318,6 +2411,12 @@ interface PptxChartLineStyle {
2318
2411
  }
2319
2412
  /** Marker symbol types for line/scatter chart data points. */
2320
2413
  type PptxChartMarkerSymbol = 'circle' | 'dash' | 'diamond' | 'dot' | 'none' | 'picture' | 'plus' | 'square' | 'star' | 'triangle' | 'x' | 'auto';
2414
+ /**
2415
+ * `ST_ScatterStyle` (ECMA-376 §21.2.3.40): how a scatter chart joins its points.
2416
+ * `line`/`lineMarker` connect them with straight segments, `smooth`/
2417
+ * `smoothMarker` with a bezier, `marker`/`none` not at all.
2418
+ */
2419
+ type PptxChartScatterStyle = 'none' | 'line' | 'lineMarker' | 'marker' | 'smooth' | 'smoothMarker';
2321
2420
  /** Shape properties extracted from c:spPr for chart formatting. */
2322
2421
  interface PptxChartShapeProps {
2323
2422
  fillColor?: string;
@@ -2519,6 +2618,42 @@ interface PptxChartTreemapOptions {
2519
2618
  interface PptxChartSeries {
2520
2619
  name: string;
2521
2620
  values: number[];
2621
+ /**
2622
+ * Per-series x values from `c:ser/c:xVal` (scatter and bubble series only).
2623
+ *
2624
+ * Every `CT_ScatterSer` / `CT_BubbleSer` carries its OWN `c:xVal`, so two
2625
+ * series in one scatter chart routinely plot against different x ranges (the
2626
+ * normal case for measurement data). Reading the x values off the first
2627
+ * series and reusing them everywhere plotted every series against series 1's
2628
+ * x axis. Absent for category-axis chart kinds, where
2629
+ * {@link PptxChartData.categories} is the x axis.
2630
+ */
2631
+ xValues?: number[];
2632
+ /**
2633
+ * Per-series bubble sizes from `c:ser/c:bubbleSize` (bubble series only),
2634
+ * aligned index-for-index with {@link values}.
2635
+ *
2636
+ * `CT_BubbleSer` carries x, y AND size, so a one-series bubble chart is fully
2637
+ * specified. Absent when the source omits `c:bubbleSize`.
2638
+ */
2639
+ bubbleSizes?: number[];
2640
+ /**
2641
+ * Series-level data-label content flags from `c:ser/c:dLbls`.
2642
+ *
2643
+ * PowerPoint writes the flags a user picks in "Format Data Labels" onto the
2644
+ * SERIES, and leaves the chart-type-level `c:dLbls` all-zero, so reading only
2645
+ * the chart-level group reports "show nothing" for a chart that visibly shows
2646
+ * percentages. These override {@link PptxChartStyle.dataLabels}.
2647
+ */
2648
+ dataLabelOptions?: PptxChartDataLabelOptions;
2649
+ /**
2650
+ * Whether the series line is explicitly suppressed
2651
+ * (`c:ser/c:spPr/a:ln/a:noFill`). Line-drawn kinds (line, scatter, radar)
2652
+ * use this to decide whether to draw a connecting line at all; a marker-only
2653
+ * scatter is authored as `scatterStyle="lineMarker"` PLUS this flag, never by
2654
+ * changing the scatter style.
2655
+ */
2656
+ lineNoFill?: boolean;
2522
2657
  /**
2523
2658
  * Blank-value mask aligned index-for-index with {@link values}: `true` marks
2524
2659
  * a category whose numeric cache point (`c:numCache/c:pt`) was absent or
@@ -2862,6 +2997,17 @@ interface PptxChartData {
2862
2997
  * default), so only horizontal bar charts need to carry the field.
2863
2998
  */
2864
2999
  barDirection?: PptxChartBarDirection;
3000
+ /**
3001
+ * Scatter presentation mode (`c:scatterChart/c:scatterStyle/@val`).
3002
+ *
3003
+ * `lineMarker` (PowerPoint's own default for every scatter it writes) and
3004
+ * `smoothMarker` draw a connecting line; `marker` and `none` do not. Whether
3005
+ * the MARKERS appear is decided separately by `c:marker/c:symbol`, and
3006
+ * whether the LINE appears is further gated by
3007
+ * {@link PptxChartSeries.lineNoFill} - PowerPoint expresses "markers only" as
3008
+ * `lineMarker` plus an `a:ln/a:noFill`, not as `marker`.
3009
+ */
3010
+ scatterStyle?: PptxChartScatterStyle;
2865
3011
  /**
2866
3012
  * Bar/column gap between category clusters as a percentage of bar width
2867
3013
  * (`c:gapWidth/@val`, 0 through 500). Absent uses the renderer default.
@@ -3015,6 +3161,53 @@ interface PptxChartData {
3015
3161
  * // => { brightness: 20, contrast: -10, grayscale: true } satisfies PptxImageEffects
3016
3162
  * ```
3017
3163
  */
3164
+ /**
3165
+ * One `a14:foregroundMark` / `a14:backgroundMark` polyline hint recorded while
3166
+ * the user painted over the picture in PowerPoint's "Remove Background" mode.
3167
+ * Coordinates are 0..1 fractions of the image.
3168
+ */
3169
+ interface PptxBackgroundRemovalMark {
3170
+ x1: number;
3171
+ y1: number;
3172
+ x2: number;
3173
+ y2: number;
3174
+ }
3175
+ /**
3176
+ * PowerPoint "Remove Background" state (`a14:backgroundRemoval`).
3177
+ *
3178
+ * The four edges are the RETAINED rectangle as 0..1 fractions of the image
3179
+ * (OOXML stores them as per-100000 relative units), and the mark lists are the
3180
+ * segmentation hints the user painted.
3181
+ *
3182
+ * **This is edit-time metadata, not a render instruction.** PowerPoint bakes the
3183
+ * removal into the bitmap referenced by the main `a:blip/@r:embed` and keeps the
3184
+ * pristine original in `a14:imgLayer/@r:embed`. Verified against PowerPoint COM:
3185
+ * a slide exported with and without this element is byte-identical. A renderer
3186
+ * that clips to the retained rectangle would clip an image whose background has
3187
+ * already been removed.
3188
+ *
3189
+ * @example
3190
+ * ```ts
3191
+ * const removal: PptxBackgroundRemoval = { top: 0.12, bottom: 0.88, left: 0.07, right: 0.93 };
3192
+ * // => retains the middle of the image; the marks list stays empty
3193
+ * ```
3194
+ */
3195
+ interface PptxBackgroundRemoval {
3196
+ /** Top edge of the retained rectangle (0..1 fraction of the image height). */
3197
+ top: number;
3198
+ /** Bottom edge of the retained rectangle (0..1 fraction of the image height). */
3199
+ bottom: number;
3200
+ /** Left edge of the retained rectangle (0..1 fraction of the image width). */
3201
+ left: number;
3202
+ /** Right edge of the retained rectangle (0..1 fraction of the image width). */
3203
+ right: number;
3204
+ /** Strokes marking regions the user forced to be foreground. */
3205
+ foregroundMarks?: PptxBackgroundRemovalMark[];
3206
+ /** Strokes marking regions the user forced to be background. */
3207
+ backgroundMarks?: PptxBackgroundRemovalMark[];
3208
+ /** Original effect XML, retained for lossless re-emission. */
3209
+ rawXml?: XmlObject;
3210
+ }
3018
3211
  interface PptxImageEffects {
3019
3212
  /** Brightness adjustment (-100 to 100). */
3020
3213
  brightness?: number;
@@ -3038,8 +3231,38 @@ interface PptxImageEffects {
3038
3231
  };
3039
3232
  /** Artistic effect name (blur, pencilGrayscale, paintStrokes, etc.). */
3040
3233
  artisticEffect?: string;
3041
- /** Artistic effect radius/amount. */
3234
+ /** Artistic effect radius/amount, normalised to 0..100. */
3042
3235
  artisticRadius?: number;
3236
+ /**
3237
+ * Every numeric attribute of the source `a14:artistic*` element, raw and
3238
+ * un-normalised (`trans`, `pencilSize`, `crackSpacing`, …). The attribute set
3239
+ * differs per effect, so this is the lossless companion to the single
3240
+ * {@link PptxImageEffects.artisticRadius} number.
3241
+ */
3242
+ artisticParams?: Record<string, number>;
3243
+ /**
3244
+ * Name of the artistic effect ALREADY baked into the image data, which a
3245
+ * renderer must not apply a second time. Set from the `a14` blip extension,
3246
+ * which PowerPoint writes alongside a pre-rendered bitmap (see
3247
+ * {@link PptxBackgroundRemoval}), and normally equal to
3248
+ * {@link PptxImageEffects.artisticEffect}.
3249
+ *
3250
+ * It records the NAME rather than a boolean so that picking a different
3251
+ * effect in this library's inspector (which patches `artisticEffect` alone)
3252
+ * still renders: the two names then differ.
3253
+ */
3254
+ artisticPrerenderedEffect?: string;
3255
+ /**
3256
+ * PowerPoint "Remove Background" state (`a14:backgroundRemoval`). Edit-time
3257
+ * metadata: the removal is already baked into the image data.
3258
+ */
3259
+ backgroundRemoval?: PptxBackgroundRemoval;
3260
+ /**
3261
+ * `a14:imgLayer/@r:embed` — relationship id of the PRISTINE original image
3262
+ * the baked effects were derived from (PowerPoint stores it as an HD Photo
3263
+ * `.wdp` part, which browsers cannot decode).
3264
+ */
3265
+ originalImageRelId?: string;
3043
3266
  /** Alpha modulation fixed: non-negative percentage (100 means unchanged opacity). */
3044
3267
  alphaModFix?: number;
3045
3268
  /** Original alpha modulation fixed node, including foreign attributes. */
@@ -4951,7 +5174,7 @@ interface UnknownPptxElement extends PptxElementBase {
4951
5174
  /**
4952
5175
  * A single element on a PPTX slide.
4953
5176
  *
4954
- * This is a **discriminated union** — narrow on `element.type` to access
5177
+ * This is a **discriminated union**: narrow on `element.type` to access
4955
5178
  * variant-specific properties like `imageData` (image/picture), `pathData`
4956
5179
  * (shape), or `textSegments` (text/shape).
4957
5180
  */
@@ -5684,6 +5907,54 @@ interface PptxEmbeddedFontList {
5684
5907
  rawXml?: XmlObject;
5685
5908
  }
5686
5909
  //#endregion
5910
+ //#region src/core/types/comment-mentions.d.ts
5911
+ /**
5912
+ * A single `@`-mention inside a modern comment body.
5913
+ *
5914
+ * Offsets index into the comment's FLATTENED plain text: every `a:t` value
5915
+ * below `p188:txBody` concatenated, with paragraphs joined by `\n`. That is the
5916
+ * same string `PptxComment.text` carries, so an edit to `text` invalidates
5917
+ * every offset after the edit point and the serializer re-bases them.
5918
+ *
5919
+ * The markup Office uses for a mention is `CT_Mention` (documented for the
5920
+ * SpreadsheetML `2018/threadedcomments` part): `mentionpersonId`, `mentionId`,
5921
+ * `startIndex` and `length`. The PowerPoint `2018/8/main` schema does not
5922
+ * publish a mention element at all, so `rawXml` is retained and re-emitted
5923
+ * attribute-for-attribute: a producer that spells the attributes differently
5924
+ * still round-trips.
5925
+ *
5926
+ * @example
5927
+ * ```ts
5928
+ * const mention: PptxCommentMention = {
5929
+ * personId: "{2CB2E9D0-D392-EB21-5D46-FBA34C1295E6}",
5930
+ * authorName: "Bob Example",
5931
+ * startIndex: 3,
5932
+ * length: 11,
5933
+ * };
5934
+ * // => "Hi Bob Example can you check this".slice(3, 14) === "Bob Example"
5935
+ * ```
5936
+ */
5937
+ interface PptxCommentMention {
5938
+ /** `mentionId`: GUID identifying this mention instance. */
5939
+ id?: string;
5940
+ /** `mentionpersonId`: the `p188:author` id of the mentioned person. */
5941
+ personId: string;
5942
+ /** Display name resolved from the author list at parse time, when known. */
5943
+ authorName?: string;
5944
+ /** Character offset of the mentioned span in the flattened plain text. */
5945
+ startIndex: number;
5946
+ /** Character length of the mentioned span. */
5947
+ length: number;
5948
+ /**
5949
+ * `uri` of the `p188:ext` this mention list was read from. Undefined means
5950
+ * the list is a direct child of `p188:cm`, which is where it is written for
5951
+ * newly authored mentions.
5952
+ */
5953
+ containerUri?: string;
5954
+ /** Original `p188:mention` node, retained for unknown-attribute preservation. */
5955
+ rawXml?: XmlObject;
5956
+ }
5957
+ //#endregion
5687
5958
  //#region src/core/types/metadata.d.ts
5688
5959
  /**
5689
5960
  * A slide comment — may be a legacy positional comment or a modern
@@ -5730,6 +6001,8 @@ interface PptxComment {
5730
6001
  title?: string;
5731
6002
  /** Modern threaded comment support (p15:threadingInfo). */
5732
6003
  threadId?: string;
6004
+ /** `@`-mentions, indexed into `text` (see {@link PptxCommentMention}). */
6005
+ mentions?: PptxCommentMention[];
5733
6006
  /** Replies to this comment (for modern threaded comments). */
5734
6007
  replies?: PptxComment[];
5735
6008
  /** ID of the element this comment is associated with (if any). */
@@ -6249,7 +6522,7 @@ interface PptxTheme {
6249
6522
  * // => "morph" — one of 40+ transition effects
6250
6523
  * ```
6251
6524
  */
6252
- type PptxTransitionType = 'none' | 'cut' | 'fade' | 'push' | 'wipe' | 'split' | 'randomBar' | 'blinds' | 'checker' | 'circle' | 'comb' | 'cover' | 'diamond' | 'dissolve' | 'plus' | 'pull' | 'random' | 'strips' | 'uncover' | 'wedge' | 'wheel' | 'zoom' | 'newsflash' | 'morph' | 'conveyor' | 'doors' | 'ferris' | 'flash' | 'flythrough' | 'gallery' | 'glitter' | 'honeycomb' | 'pan' | 'prism' | 'reveal' | 'ripple' | 'shred' | 'switch' | 'vortex' | 'warp' | 'wheelReverse' | 'window' | 'cube' | 'flip' | 'rotate' | 'orbit' | 'fallOver' | 'drape' | 'curtains' | 'wind' | 'prestige' | 'fracture' | 'crush' | 'peelOff' | 'pageCurlDouble' | 'pageCurlSingle' | 'airplane' | 'origami';
6525
+ type PptxTransitionType = 'none' | 'cut' | 'fade' | 'push' | 'wipe' | 'split' | 'randomBar' | 'blinds' | 'checker' | 'circle' | 'comb' | 'cover' | 'diamond' | 'dissolve' | 'plus' | 'pull' | 'random' | 'strips' | 'uncover' | 'wedge' | 'wheel' | 'zoom' | 'newsflash' | 'morph' | 'conveyor' | 'doors' | 'ferris' | 'flash' | 'flythrough' | 'gallery' | 'glitter' | 'honeycomb' | 'pan' | 'prism' | 'reveal' | 'ripple' | 'shred' | 'switch' | 'vortex' | 'warp' | 'wheelReverse' | 'window' | 'cube' | 'flip' | 'rotate' | 'box' | 'orbit' | 'fallOver' | 'drape' | 'curtains' | 'wind' | 'prestige' | 'fracture' | 'crush' | 'peelOff' | 'pageCurlDouble' | 'pageCurlSingle' | 'airplane' | 'origami';
6253
6526
  /** Split orientation from OOXML `@_orient`. */
6254
6527
  type PptxSplitOrientation = 'horz' | 'vert';
6255
6528
  /** Schema-defined `ST_TransitionSpeed` values. */
@@ -6544,6 +6817,18 @@ interface PptxSlideBackgroundPattern {
6544
6817
  interface PptxSlide {
6545
6818
  id: string;
6546
6819
  rId: string;
6820
+ /**
6821
+ * `p:sldIdLst/p:sldId/@id` (ST_SlideId, 256..2147483647): the numeric key
6822
+ * that sections (`p14:sldIdLst/p14:sldId/@id`) and section/summary zooms
6823
+ * name slides by.
6824
+ *
6825
+ * It lives in `presentation.xml`, NOT in the slide part, so it cannot be
6826
+ * recovered from `rawXml`. Without it on the model, code that writes a
6827
+ * section's membership has nothing correct to write and falls back to the
6828
+ * slide NUMBER, which is 1-based and therefore never matches a real deck's
6829
+ * ids: the section reloads with no slides in it.
6830
+ */
6831
+ slideId?: string;
6547
6832
  sourceSlideId?: string;
6548
6833
  /** Optional author-supplied slide name (set via `SlideBuilder.setName`). */
6549
6834
  name?: string;
@@ -6746,6 +7031,26 @@ interface PptxPresentationProperties {
6746
7031
  /** Kiosk auto-restart interval in milliseconds (from `p:kiosk/@restart`). Only meaningful when showType is "kiosk". */
6747
7032
  kioskRestartTime?: number;
6748
7033
  }
7034
+ /**
7035
+ * Slide dimensions from `p:sldSz` (CT_SlideSize, ECMA-376 §19.2.1.39).
7036
+ *
7037
+ * @example
7038
+ * ```ts
7039
+ * const size: PptxSlideSize = { widthEmu: 9144000, heightEmu: 6858000, type: 'screen4x3' };
7040
+ * // => satisfies PptxSlideSize
7041
+ * ```
7042
+ */
7043
+ interface PptxSlideSize {
7044
+ /** `@cx` in EMU. Omitted or non-positive values leave the loaded width alone. */
7045
+ widthEmu?: number;
7046
+ /** `@cy` in EMU. Omitted or non-positive values leave the loaded height alone. */
7047
+ heightEmu?: number;
7048
+ /**
7049
+ * `@type` (ST_SlideSizeType). The schema default is `custom`, which is
7050
+ * why PowerPoint omits the attribute for a non-preset size.
7051
+ */
7052
+ type?: string;
7053
+ }
6749
7054
  /**
6750
7055
  * A named custom slide show (`p:custShowLst / p:custShow`).
6751
7056
  *
@@ -7760,6 +8065,19 @@ interface PptxHandlerSaveOptions {
7760
8065
  customerData?: PptxCustomerData[];
7761
8066
  /** Photo album metadata to save back to `p:photoAlbum`. */
7762
8067
  photoAlbum?: PptxPhotoAlbum;
8068
+ /**
8069
+ * Slide dimensions to write back to `p:sldSz`.
8070
+ *
8071
+ * Omitting the option preserves the load-time dimensions verbatim, which
8072
+ * is why an edit made through a viewer's Slide Size control has to reach
8073
+ * the save call: nothing else in the pipeline can observe it.
8074
+ *
8075
+ * PowerPoint derives `Presentation.PageSetup.SlideSize` from `@cx`/`@cy`
8076
+ * alone (verified by COM: an A4-typed `p:sldSz` carrying 4:3 dimensions
8077
+ * still reports `ppSlideSizeCustom`), so `type` is written for fidelity
8078
+ * but the dimensions are what actually decide the reported preset.
8079
+ */
8080
+ slideSize?: PptxSlideSize;
7763
8081
  /** East Asian line-break settings to save back to `p:kinsoku`. */
7764
8082
  kinsoku?: PptxKinsoku | null;
7765
8083
  /** Write-protection verifier. Set to `null` to remove, `undefined` to preserve existing. */
@@ -8351,24 +8669,38 @@ declare class PptxHandlerCore {
8351
8669
  name?: string;
8352
8670
  }>>;
8353
8671
  /**
8354
- * Export selected slides as individual PPTX files.
8672
+ * Export selected slides to a vector or raster format, keyed by slide index.
8355
8673
  *
8356
- * Each entry in the returned map is keyed by slide index and contains a
8357
- * standalone `Uint8Array` PPTX with only that slide.
8674
+ * **This does not produce PPTX files.** The previous version of this comment
8675
+ * said each entry was "a standalone PPTX with only that slide", named the
8676
+ * option `slideIndexes` (the real field is `slideIndices`), and wrote the
8677
+ * bytes to `slide_N.pptx`. None of that was ever true: the runtime has
8678
+ * always taken a `format` of `svg` / `png` / `pdf`. Per-slide PPTX
8679
+ * extraction is a different operation and is not implemented here.
8680
+ *
8681
+ * Only `svg` works without a host-supplied backend, and it works fully:
8682
+ * the headless {@link SvgExporter} renders it with no DOM. `png` and `pdf`
8683
+ * THROW, because this package carries no rasteriser; use a viewer binding's
8684
+ * browser export pipeline, or override `exportSlides` on the runtime with
8685
+ * your own backend.
8358
8686
  *
8359
8687
  * @param slides - Full slide array.
8360
- * @param options - Export options (slide indexes, format, etc.).
8361
- * @returns A `Map<slideIndex, Uint8Array>` of exported files.
8688
+ * @param options - Export options (`format`, `slideIndices`, `width`, ...).
8689
+ * @returns A `Map<slideIndex, Uint8Array>` of exported files. Hidden slides
8690
+ * are omitted unless `options.includeHidden` is set, so the map can be
8691
+ * smaller than `options.slideIndices`.
8692
+ * @throws {Error} when `options.format` is `png` or `pdf`.
8362
8693
  *
8363
8694
  * @example
8364
8695
  * ```ts
8365
8696
  * const exports = await handler.exportSlides(data.slides, {
8366
- * slideIndexes: [0, 2],
8697
+ * format: 'svg',
8698
+ * slideIndices: [0, 2],
8367
8699
  * });
8368
8700
  * for (const [idx, bytes] of exports) {
8369
- * await fs.writeFile(`slide_${idx}.pptx`, Buffer.from(bytes));
8701
+ * await fs.writeFile(`slide_${idx}.svg`, Buffer.from(bytes));
8370
8702
  * }
8371
- * // => Map<number, Uint8Array> — one standalone .pptx per exported slide
8703
+ * // => Map<number, Uint8Array>: one SVG document per exported slide
8372
8704
  * ```
8373
8705
  */
8374
8706
  exportSlides(slides: PptxSlide[], options: PptxExportOptions): Promise<Map<number, Uint8Array>>;
@@ -8800,6 +9132,80 @@ interface ViewerFontSource {
8800
9132
  style?: 'normal' | 'italic';
8801
9133
  }
8802
9134
  //#endregion
9135
+ //#region src/render/presentation-file-kinds.d.ts
9136
+ /**
9137
+ * presentation-file-kinds: the one place that answers "can the viewer open
9138
+ * this file?" and "what should the saved copy be called?".
9139
+ *
9140
+ * ## Why this is a shared decision and not five allow-lists
9141
+ *
9142
+ * The loader reads more formats than any single UI advertises. Legacy binary
9143
+ * `.ppt` (PowerPoint 97-2003) is the sharp example: `PptxHandler.load()` has
9144
+ * detected the OLE compound-file container and converted the binary deck
9145
+ * through the regular pptx pipeline for some time, but the product kept saying
9146
+ * it was unsupported, and a picker that filters the extension out makes a
9147
+ * working loader unreachable in practice. Whenever the loader learns a format,
9148
+ * exactly one list has to change.
9149
+ *
9150
+ * ## Read many, write one
9151
+ *
9152
+ * Input is a superset of output. We READ `.pptx`, `.ppsx`, `.pptm`, `.potx`,
9153
+ * legacy binary `.ppt` and portable `pptx-viewer-json`; we WRITE only the
9154
+ * OpenXML family. That asymmetry is deliberate (PowerPoint itself does the
9155
+ * same: open a 97-2003 deck and Save As offers `.pptx`), and it is why
9156
+ * {@link savedPresentationFileName} always REPLACES the source extension
9157
+ * rather than keeping it. A deck opened as `report.ppt` and saved as
9158
+ * `report.ppt` would be a file whose bytes and whose name disagree, which is
9159
+ * the kind of thing PowerPoint refuses to open.
9160
+ *
9161
+ * This module deliberately imports nothing, so any layer (render, export, a
9162
+ * binding, a host app) can depend on it without risking an import cycle.
9163
+ *
9164
+ * @module render/presentation-file-kinds
9165
+ */
9166
+ /**
9167
+ * Extensions the built-in file picker offers, in the order it offers them.
9168
+ *
9169
+ * `.ppt` is in the list because the loader genuinely handles it, not as a
9170
+ * courtesy: see `packages/core/src/core/ppt/` and the `ppt-import` integration
9171
+ * suite, which asserts a `.ppt` loads to the same model as the `.pptx` it was
9172
+ * exported from.
9173
+ */
9174
+ declare const PRESENTATION_OPEN_EXTENSIONS: readonly ['.pptx', '.ppsx', '.pptm', '.potx', '.ppt', '.json'];
9175
+ /** Comma-separated `accept` attribute for a presentation file input. */
9176
+ declare const PPTX_OPEN_ACCEPT: string;
9177
+ /**
9178
+ * True when a picked / dropped file's name looks like something the loader can
9179
+ * open. Use this instead of a hand-rolled `endsWith` chain: a drop handler that
9180
+ * disagrees with the picker's `accept` list is a format that is supported by
9181
+ * mouse but not by drag, which is how `.ppt` stayed invisible.
9182
+ *
9183
+ * Extension-only, by design. The real answer comes from the container sniff in
9184
+ * `PptxHandler.load()`; this is only the cheap pre-filter a drop target needs
9185
+ * before it hands bytes to the loader.
9186
+ */
9187
+ declare function isSupportedPresentationFile(name: string | null | undefined): boolean;
9188
+ /** True for the binary PowerPoint 97-2003 family, which we read but never write. */
9189
+ declare function isLegacyBinaryPresentation(name: string | null | undefined): boolean;
9190
+ /** The formats the save path can produce. Binary `.ppt` is deliberately absent. */
9191
+ type SavedPresentationFormat = 'pptx' | 'ppsx' | 'pptm';
9192
+ /**
9193
+ * The stem of a presentation file name: directories and any loadable extension
9194
+ * removed. `C:\decks\report.ppt` becomes `report`; a name with no recognised
9195
+ * extension is kept whole, so `Untitled Presentation` survives intact rather
9196
+ * than losing everything after its last dot.
9197
+ */
9198
+ declare function presentationBaseName(sourceName: string | null | undefined, fallback?: string): string;
9199
+ /**
9200
+ * The name a saved copy should be offered under: the source stem plus the
9201
+ * extension of the format actually being written.
9202
+ *
9203
+ * This is what turns `report.ppt` into `report.pptx` on Save As. Output is
9204
+ * always an OpenXML package, so keeping the source extension would mislabel
9205
+ * the bytes.
9206
+ */
9207
+ declare function savedPresentationFileName(sourceName: string | null | undefined, format?: SavedPresentationFormat): string;
9208
+ //#endregion
8803
9209
  //#region src/render/session-restore.d.ts
8804
9210
  /**
8805
9211
  * session-restore: keep the deck a host app has open across a page refresh.
@@ -9314,6 +9720,20 @@ declare function exportAllSlidesToSvg(data: PptxData, options?: SvgExportAllOpti
9314
9720
  /** Export the selected presentation slides as SVG Blobs. */
9315
9721
  declare function exportAllSlidesToSvgBlobs(data: PptxData, options?: SvgExportAllOptions): Blob[];
9316
9722
 
9723
+ /**
9724
+ * A drop-in wrapper around `html2canvas-pro` that first normalises modern CSS
9725
+ * colour functions (oklch/oklab/lch/lab/color()) to sRGB and applies the
9726
+ * shared CSS-preprocessing pass (backdrop-filter, mix-blend-mode, 3D
9727
+ * transforms, unsupported features) to the cloned capture document. Svelte
9728
+ * port of the vanilla binding's `renderToCanvas` wrapper
9729
+ * (`packages/vanilla/src/viewer/export/render-to-canvas.ts`); the pure
9730
+ * colour/CSS passes live once in `pptx-viewer-shared`, only this thin
9731
+ * html2canvas-pro glue is per-binding. `html2canvas-pro` is imported
9732
+ * dynamically so it stays out of the main bundle until export is actually
9733
+ * used.
9734
+ */
9735
+ declare function renderToCanvas(element: HTMLElement, options?: Partial<Options>): Promise<HTMLCanvasElement>;
9736
+
9317
9737
  /** Payload for the `onload` callback. */
9318
9738
  interface ViewerLoadDetail {
9319
9739
  /** Number of slides in the loaded presentation. */
@@ -9605,5 +10025,5 @@ declare const PowerPointViewer: Component<PowerPointViewerProps, PowerPointViewe
9605
10025
  */
9606
10026
  type AutosaveStatus = 'idle' | 'disabled' | 'saving' | 'saved' | 'error';
9607
10027
 
9608
- export { PowerPointViewer, defaultCssVars, defaultRadius, defaultThemeColors, deleteAutosaveSnapshot, exportAllSlidesToSvg, exportAllSlidesToSvgBlobs, exportSlideAsSvg, exportSlideToSvg, exportSlideToSvgBlob, forgetSessionDeck, getAutosaveSnapshot, getSessionTabId, listAutosaveSnapshots, loadPresentationDeck, loadSessionDeck, parsePresentationSessionId, registerTranslations, rememberSessionDeck, restoreSessionDeck, themeToCssVars, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius };
9609
- export type { AutosaveRecord, AutosaveStatus, CanvasSize, CollaborationConfig, CollaborationRole, CollaborationTransport, ExportGifOptions, ExportPdfOptions, ExportVideoOptions, PowerPointViewerApi, PowerPointViewerProps, PptxAiBridge, PptxAiConfig, PptxAiConnection, PptxAiContextStrategy, PptxAiToolName, PptxAiUIMessage, PptxAiWritePolicy, PrintOptions, SessionDeck, SvgExportAllOptions, SvgExportSingleSlideOptions, TranslationDictionary, Translator, ViewerLoadDetail, ViewerTheme, ViewerThemeColors };
10028
+ export { PPTX_OPEN_ACCEPT, PRESENTATION_OPEN_EXTENSIONS, PowerPointViewer, defaultCssVars, defaultRadius, defaultThemeColors, deleteAutosaveSnapshot, exportAllSlidesToSvg, exportAllSlidesToSvgBlobs, exportSlideAsSvg, exportSlideToSvg, exportSlideToSvgBlob, forgetSessionDeck, getAutosaveSnapshot, getSessionTabId, isLegacyBinaryPresentation, isSupportedPresentationFile, listAutosaveSnapshots, loadPresentationDeck, loadSessionDeck, parsePresentationSessionId, presentationBaseName, registerTranslations, rememberSessionDeck, renderToCanvas, restoreSessionDeck, savedPresentationFileName, themeToCssVars, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius };
10029
+ export type { AutosaveRecord, AutosaveStatus, CanvasSize, CollaborationConfig, CollaborationRole, CollaborationTransport, ExportGifOptions, ExportPdfOptions, ExportVideoOptions, PowerPointViewerApi, PowerPointViewerProps, PptxAiBridge, PptxAiConfig, PptxAiConnection, PptxAiContextStrategy, PptxAiToolName, PptxAiUIMessage, PptxAiWritePolicy, PrintOptions, SavedPresentationFormat, SessionDeck, SvgExportAllOptions, SvgExportSingleSlideOptions, TranslationDictionary, Translator, ViewerLoadDetail, ViewerTheme, ViewerThemeColors };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACX,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,2BAA2B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,oBAAoB,EACpB,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACX,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,GACX,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,iBAAiB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAItF,OAAO,EACN,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACN,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GACf,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACX,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,2BAA2B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,oBAAoB,EACpB,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACX,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,GACX,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,iBAAiB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAItF,OAAO,EACN,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACN,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GACf,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAShE,OAAO,EACN,gBAAgB,EAChB,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAQlE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC"}