pptx-angular-viewer 3.15.0 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-DIH9Texq.mjs → pptx-angular-viewer-chat-history-idb-D_H4MXBh.mjs} +2 -2
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-DIH9Texq.mjs.map → pptx-angular-viewer-chat-history-idb-D_H4MXBh.mjs.map} +1 -1
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-CVv5SsHZ.mjs → pptx-angular-viewer-pptx-angular-viewer-wH2ZRE8b.mjs} +395 -141
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-CVv5SsHZ.mjs.map → pptx-angular-viewer-pptx-angular-viewer-wH2ZRE8b.mjs.map} +1 -1
- package/fesm2022/pptx-angular-viewer.mjs +1 -1
- package/package.json +2 -2
- package/types/pptx-angular-viewer.d.ts +1 -1
- package/types/pptx-angular-viewer.d.ts.map +1 -1
|
@@ -7685,6 +7685,122 @@ const NOMINAL_ENVELOPE_BAND = {
|
|
|
7685
7685
|
bottom: BOTTOM_MARGIN,
|
|
7686
7686
|
};
|
|
7687
7687
|
|
|
7688
|
+
/**
|
|
7689
|
+
* Canvas-based text measurement for the glyph envelope layout
|
|
7690
|
+
* (`text-warp-envelope-layout.ts`): per-character advance widths and the
|
|
7691
|
+
* line's real (ink-measured) ascent, both backed by a single lazily-created
|
|
7692
|
+
* `CanvasRenderingContext2D` shared across calls.
|
|
7693
|
+
*/
|
|
7694
|
+
let measureCtx;
|
|
7695
|
+
function getMeasureCtx$1() {
|
|
7696
|
+
if (measureCtx !== undefined) {
|
|
7697
|
+
return measureCtx;
|
|
7698
|
+
}
|
|
7699
|
+
if (typeof document === 'undefined') {
|
|
7700
|
+
measureCtx = null;
|
|
7701
|
+
return null;
|
|
7702
|
+
}
|
|
7703
|
+
measureCtx = document.createElement('canvas').getContext('2d');
|
|
7704
|
+
return measureCtx;
|
|
7705
|
+
}
|
|
7706
|
+
function toCanvasFont$1(font) {
|
|
7707
|
+
const size = font.fontSizePx && font.fontSizePx > 0 ? font.fontSizePx : DEFAULT_TEXT_FONT_SIZE;
|
|
7708
|
+
const family = font.fontFamily || DEFAULT_FONT_FAMILY;
|
|
7709
|
+
return `${font.italic ? 'italic ' : ''}${font.bold ? 'bold ' : ''}${size}px ${family}`;
|
|
7710
|
+
}
|
|
7711
|
+
/**
|
|
7712
|
+
* Per-character advance widths for `text` set in `font`, measured as prefix
|
|
7713
|
+
* differences (never a lone character: see `text-metric-tracking.ts`'s
|
|
7714
|
+
* `advancesOf` for why - shaped scripts and ligatures need the context).
|
|
7715
|
+
*
|
|
7716
|
+
* Falls back to a flat `0.55em`-per-character estimate when there is no DOM
|
|
7717
|
+
* to measure with (SSR, or a test environment without a 2D canvas context);
|
|
7718
|
+
* the estimate only affects horizontal glyph spacing, never the envelope
|
|
7719
|
+
* curve itself, so it stays visually reasonable even when approximate.
|
|
7720
|
+
*/
|
|
7721
|
+
function measureGlyphAdvances(text, font) {
|
|
7722
|
+
const chars = [...text];
|
|
7723
|
+
const ctx = getMeasureCtx$1();
|
|
7724
|
+
if (!ctx) {
|
|
7725
|
+
const size = font.fontSizePx && font.fontSizePx > 0 ? font.fontSizePx : DEFAULT_TEXT_FONT_SIZE;
|
|
7726
|
+
return chars.map(() => size * 0.55);
|
|
7727
|
+
}
|
|
7728
|
+
ctx.font = toCanvasFont$1(font);
|
|
7729
|
+
const advances = [];
|
|
7730
|
+
let previous = 0;
|
|
7731
|
+
let prefix = '';
|
|
7732
|
+
for (const char of chars) {
|
|
7733
|
+
prefix += char;
|
|
7734
|
+
const width = ctx.measureText(prefix).width;
|
|
7735
|
+
advances.push(Math.max(0, width - previous));
|
|
7736
|
+
previous = width;
|
|
7737
|
+
}
|
|
7738
|
+
return advances;
|
|
7739
|
+
}
|
|
7740
|
+
/**
|
|
7741
|
+
* The real (ink-measured) ascent of `segments`' text at their own font
|
|
7742
|
+
* sizes, as the tallest `actualBoundingBoxAscent` across every segment on
|
|
7743
|
+
* the line (not a per-character average - one tall glyph anywhere on the
|
|
7744
|
+
* line sets the reference the whole line warps against, matching how a
|
|
7745
|
+
* single baseline/cap-height pair governs a real text run).
|
|
7746
|
+
*
|
|
7747
|
+
* `buildGlyphEnvelope` used to map every glyph's nominal band from a FIXED
|
|
7748
|
+
* `NOMINAL_ENVELOPE_BAND` fraction of the box height (0.15..0.85), assuming
|
|
7749
|
+
* a glyph's own cap height fills that whole span. COM-measured (2026-09-11,
|
|
7750
|
+
* `text-warp-glyph-outline.ts`'s doc comment): for an 8-shape WordArt
|
|
7751
|
+
* fixture (Arimo Bold 44pt captions in 100pt-tall boxes, the `textCanUp` /
|
|
7752
|
+
* `textCanDown` / `textInflate` / `textDeflate` presets at both default and
|
|
7753
|
+
* extreme `adj`), real cap height reaches only about `t = 0.57` of that
|
|
7754
|
+
* nominal span, not `t = 0`, so every glyph's mapped top undershot the
|
|
7755
|
+
* curve's own top edge by the same amount - an outline-vs-COM interior-
|
|
7756
|
+
* column ink-scan comparison measured ~30-40% of box height mean error (max
|
|
7757
|
+
* 58-80%) on BOTH the outline path and the affine fallback alike (both use
|
|
7758
|
+
* this same nominal band, so both shared the bug identically: the residual
|
|
7759
|
+
* lived here, not in the outline point-mapping math). Anchoring `nomTop` to
|
|
7760
|
+
* the line's REAL measured ascent instead - clamped to never exceed the
|
|
7761
|
+
* historical fixed band, so a line whose font genuinely fills (or exceeds)
|
|
7762
|
+
* the nominal span keeps the old, already-validated behaviour unchanged -
|
|
7763
|
+
* dropped the `textInflate`/`textDeflate` interior mean error to ~2.6-2.9%
|
|
7764
|
+
* (max ~9-10%), in the range `text-warp-glyph-slicing.ts`'s doc comment
|
|
7765
|
+
* already documents as the residual once this band mismatch is not also
|
|
7766
|
+
* present. The `textCanUp`/`textCanDown` cases still show an elevated
|
|
7767
|
+
* residual (their interior mean measured ~6-20% even after this fix) that
|
|
7768
|
+
* further investigation traced to a SEPARATE, larger issue: real PowerPoint
|
|
7769
|
+
* spaces envelope-warped glyphs to fill the box's own width edge-to-edge
|
|
7770
|
+
* (measured ink spanning ~99.9% of box width) rather than centering the
|
|
7771
|
+
* text at its natural (unstretched) advance width the way `startX`/
|
|
7772
|
+
* `measureGlyphAdvances` do today, with `textCanUp`/`textCanDown` additionally
|
|
7773
|
+
* showing non-uniform (cylinder-projection-like) horizontal spacing this fix
|
|
7774
|
+
* does not address - both are horizontal-layout gaps, out of scope for this
|
|
7775
|
+
* (purely vertical) band fix and left as an open, separately-scoped issue.
|
|
7776
|
+
*
|
|
7777
|
+
* Returns `undefined` with no DOM (SSR, or a test environment without a 2D
|
|
7778
|
+
* canvas context), so a caller falls back to the previous fixed-fraction
|
|
7779
|
+
* band unchanged, exactly like {@link measureGlyphAdvances}'s own fallback.
|
|
7780
|
+
*/
|
|
7781
|
+
function measureLineAscent(segments) {
|
|
7782
|
+
const ctx = getMeasureCtx$1();
|
|
7783
|
+
if (!ctx) {
|
|
7784
|
+
return undefined;
|
|
7785
|
+
}
|
|
7786
|
+
let maxAscent = 0;
|
|
7787
|
+
for (const segment of segments) {
|
|
7788
|
+
if (!segment.text) {
|
|
7789
|
+
continue;
|
|
7790
|
+
}
|
|
7791
|
+
ctx.font = toCanvasFont$1(segment.font);
|
|
7792
|
+
const ascent = ctx.measureText(segment.text).actualBoundingBoxAscent;
|
|
7793
|
+
if (Number.isFinite(ascent) && ascent > maxAscent) {
|
|
7794
|
+
maxAscent = ascent;
|
|
7795
|
+
}
|
|
7796
|
+
}
|
|
7797
|
+
return maxAscent > 0 ? maxAscent : undefined;
|
|
7798
|
+
}
|
|
7799
|
+
/** Test hook: forget the cached measurement context. */
|
|
7800
|
+
function resetGlyphEnvelopeMeasureCache() {
|
|
7801
|
+
measureCtx = undefined;
|
|
7802
|
+
}
|
|
7803
|
+
|
|
7688
7804
|
/**
|
|
7689
7805
|
* The per-glyph affine transform for the WordArt two-curve envelope (see
|
|
7690
7806
|
* `text-warp-envelope-layout.ts`), split out to keep that file under the
|
|
@@ -7698,12 +7814,99 @@ function sliceBand(top, bottom, index, count) {
|
|
|
7698
7814
|
bottom: top + ((index + 1) / count) * span,
|
|
7699
7815
|
};
|
|
7700
7816
|
}
|
|
7701
|
-
/**
|
|
7702
|
-
function
|
|
7817
|
+
/** A preset's deformed top/bottom band (absolute height units) at horizontal position `u`. */
|
|
7818
|
+
function deformedBandAt(preset, u, adj, adj2, height) {
|
|
7703
7819
|
const curve = envelopeCurveAt(preset, u, adj, adj2);
|
|
7704
|
-
|
|
7705
|
-
|
|
7706
|
-
|
|
7820
|
+
return {
|
|
7821
|
+
top: (curve?.top ?? NOMINAL_ENVELOPE_BAND.top) * height,
|
|
7822
|
+
bottom: (curve?.bottom ?? NOMINAL_ENVELOPE_BAND.bottom) * height,
|
|
7823
|
+
};
|
|
7824
|
+
}
|
|
7825
|
+
/**
|
|
7826
|
+
* Horizontal position used to compute the FIXED boundary shared by two
|
|
7827
|
+
* adjacent paragraph rows (see {@link edgeBandAt}'s doc comment): the box's
|
|
7828
|
+
* own centre, matching where `NOMINAL_ENVELOPE_BAND` and every other
|
|
7829
|
+
* u-independent reference in this module already anchor.
|
|
7830
|
+
*/
|
|
7831
|
+
const ROW_BOUNDARY_REFERENCE_U = 0.5;
|
|
7832
|
+
/**
|
|
7833
|
+
* The envelope band (absolute height units, already line-sliced) at one
|
|
7834
|
+
* horizontal position.
|
|
7835
|
+
*
|
|
7836
|
+
* For a single-line element (`lineCount <= 1`) this is exactly the deformed
|
|
7837
|
+
* band at `u` - unchanged from before per-paragraph slicing existed.
|
|
7838
|
+
*
|
|
7839
|
+
* For a multi-paragraph element, naively slicing the band AFTER deforming it
|
|
7840
|
+
* AT `u` (dividing `[bandTop(u), bandBottom(u)]` into `lineCount` equal
|
|
7841
|
+
* fractions) lets the boundary between row `i` and row `i+1` drift with `u`.
|
|
7842
|
+
* Since each row's OWN glyphs are laid out independently (see
|
|
7843
|
+
* `text-warp-envelope-layout.ts`'s `buildGlyphEnvelope`, called once per
|
|
7844
|
+
* paragraph) and can span very different horizontal ranges - a short
|
|
7845
|
+
* paragraph stretched hard to fill the box samples very different `u` than a
|
|
7846
|
+
* longer one in the SAME box - two rows can end up comparing their own
|
|
7847
|
+
* boundary at two DIFFERENT `u` values where the curve's amplitude differs
|
|
7848
|
+
* enough that row `i`'s computed bottom sits BELOW row `i+1`'s computed top:
|
|
7849
|
+
* an inverted, overlapping pair, even though each row's own boundary is
|
|
7850
|
+
* "correct" in isolation. COM review 2026-09-11 found this pre-existing (not
|
|
7851
|
+
* introduced by the box-fill horizontal-placement fix, though a paragraph's
|
|
7852
|
+
* `stretch` factor can widen how differently two rows sample the curve and
|
|
7853
|
+
* so widen the effect): an 8-shape fixture's two-paragraph `textInflate`
|
|
7854
|
+
* block (`"Top"` over `"Bottom"`) measured its `"Top"` row's own bottom edge
|
|
7855
|
+
* at `y=138.1` while its `"Bottom"` row's top edge measured `y=79.4` - rows
|
|
7856
|
+
* swapped order.
|
|
7857
|
+
*
|
|
7858
|
+
* The fix: the boundary BETWEEN two rows must be the SAME value regardless
|
|
7859
|
+
* of which row (or which glyph's own `u`) is asking, so it is computed from
|
|
7860
|
+
* the band deformed at a FIXED reference position
|
|
7861
|
+
* ({@link ROW_BOUNDARY_REFERENCE_U}, the box's own horizontal centre) rather
|
|
7862
|
+
* than each row's own actual `u`. Only a row's OUTER edge - the one facing
|
|
7863
|
+
* the box's own top (row 0's top) or bottom (the last row's bottom), never
|
|
7864
|
+
* shared with a neighbour - still bends with the curve at the glyph's real
|
|
7865
|
+
* `u`, preserving genuine per-glyph height variation there (the property
|
|
7866
|
+
* `text-warp-envelope-layout.test.ts`'s "places line 0 of 2 strictly above
|
|
7867
|
+
* line 1 of 2" and the scaleY-variation tests already pin). An interior row
|
|
7868
|
+
* (`lineCount > 2`, both edges shared with neighbours) gets a fixed band on
|
|
7869
|
+
* both sides; no fixture in this repo yet exercises three or more WordArt
|
|
7870
|
+
* paragraph rows, so this is the untested-but-consistent extension of the
|
|
7871
|
+
* same rule, not a separately-measured case.
|
|
7872
|
+
*/
|
|
7873
|
+
function edgeBandAt(preset, u, adj, adj2, height, lineIndex, lineCount) {
|
|
7874
|
+
const actual = deformedBandAt(preset, u, adj, adj2, height);
|
|
7875
|
+
if (lineCount <= 1) {
|
|
7876
|
+
return sliceBand(actual.top, actual.bottom, 0, 1);
|
|
7877
|
+
}
|
|
7878
|
+
const reference = deformedBandAt(preset, ROW_BOUNDARY_REFERENCE_U, adj, adj2, height);
|
|
7879
|
+
const fixedSlice = sliceBand(reference.top, reference.bottom, lineIndex, lineCount);
|
|
7880
|
+
const isFirstRow = lineIndex <= 0;
|
|
7881
|
+
const isLastRow = lineIndex >= lineCount - 1;
|
|
7882
|
+
// An outer edge bending by its FULL deviation from the flat (undeformed)
|
|
7883
|
+
// band gives a row roughly `lineCount` TIMES the vertical scale its own
|
|
7884
|
+
// (`1/lineCount`-narrowed) nominal source band (`buildGlyphEnvelope`'s
|
|
7885
|
+
// `sliceBand(..., safeLineIndex, safeLineCount)` of
|
|
7886
|
+
// `NOMINAL_ENVELOPE_BAND`) was sized for, because the row's target band
|
|
7887
|
+
// still deforms by the WHOLE box's curve amplitude, not its own narrower
|
|
7888
|
+
// share of it (COM review 2026-09-11: a two-row `textInflate` fixture
|
|
7889
|
+
// measured a `d` vertical-scale term of ~3.27 for its first row at a
|
|
7890
|
+
// bulging u, stretching a 3-glyph "Top" caption's descender far enough to
|
|
7891
|
+
// invade the second row's territory even after the shared-boundary fix
|
|
7892
|
+
// alone; even scaled by `1/lineCount` here, a deep enough descender/
|
|
7893
|
+
// ascender can still extrapolate past the shared boundary - a
|
|
7894
|
+
// COM-unverified residual left open below). Damping the OUTER edge's OWN
|
|
7895
|
+
// deviation from the flat band by `1/lineCount` keeps a row's bend
|
|
7896
|
+
// proportional to its own narrowed share of the box, matching how its
|
|
7897
|
+
// nominal band was narrowed the same way - a multi-row block still
|
|
7898
|
+
// visibly bends (the deviation is not zeroed, just scaled), without a
|
|
7899
|
+
// `lineCount`-fold excess.
|
|
7900
|
+
const flatTop = NOMINAL_ENVELOPE_BAND.top * height;
|
|
7901
|
+
const flatBottom = NOMINAL_ENVELOPE_BAND.bottom * height;
|
|
7902
|
+
const dampedOuterTop = flatTop + (actual.top - flatTop) / lineCount;
|
|
7903
|
+
const dampedOuterBottom = flatBottom + (actual.bottom - flatBottom) / lineCount;
|
|
7904
|
+
// A first/last row's own OUTER edge bends (damped, see above); only the
|
|
7905
|
+
// shared INNER boundary ever comes from `fixedSlice`.
|
|
7906
|
+
return {
|
|
7907
|
+
top: isFirstRow ? dampedOuterTop : fixedSlice.top,
|
|
7908
|
+
bottom: isLastRow ? dampedOuterBottom : fixedSlice.bottom,
|
|
7909
|
+
};
|
|
7707
7910
|
}
|
|
7708
7911
|
/**
|
|
7709
7912
|
* Affine `matrix(1 b 0 d 0 f)` mapping a glyph's nominal (undeformed) band
|
|
@@ -7821,6 +8024,53 @@ function glyphEnvelopeMatrix(x0, x1, edge0, edge1, nomTop, nomBottom) {
|
|
|
7821
8024
|
* with error `0x808D1001`. Left as an open note for whoever next touches
|
|
7822
8025
|
* embedded-font packaging or generates a COM fixture that needs one.
|
|
7823
8026
|
*/
|
|
8027
|
+
/**
|
|
8028
|
+
* Horizontally scale a glyph's outline commands around `originX` (its own
|
|
8029
|
+
* left edge, matching where {@link buildWarpedGlyphOutlinePathD}'s caller
|
|
8030
|
+
* positioned it): `newX = originX + (x - originX) * scale`. `scale === 1` is
|
|
8031
|
+
* a no-op that returns `commands` unchanged (no new array allocated).
|
|
8032
|
+
*
|
|
8033
|
+
* Used by `text-warp-envelope-layout.ts` to widen a glyph's actual outline
|
|
8034
|
+
* for the `inflate`/`deflate` envelope family, which PowerPoint stretches as
|
|
8035
|
+
* a literal 2D distortion (both glyph spacing AND glyph shape widen together
|
|
8036
|
+
* to fill the box). The `can` family does NOT get this: COM-measured
|
|
8037
|
+
* 2026-09-11 (an 8-shape Arimo Bold fixture), a `can` glyph's own ink width
|
|
8038
|
+
* matches its NATURAL (unstretched) width closely (interior span
|
|
8039
|
+
* ~15.6%-15.8% of box width measured vs. ~15.6% predicted unstretched,
|
|
8040
|
+
* vs. ~16.6% predicted if the glyph itself were widened too) - `can`'s
|
|
8041
|
+
* cylindrical metaphor spreads glyphs apart (wider gaps) without literally
|
|
8042
|
+
* stretching each glyph's own shape, unlike `inflate`/`deflate`'s rubber-
|
|
8043
|
+
* sheet distortion. See `text-warp-envelope-layout.ts`'s `buildGlyphEnvelope`
|
|
8044
|
+
* for where the two families' `shapeScale` diverge.
|
|
8045
|
+
*/
|
|
8046
|
+
function scaleOutlineCommandsX(commands, originX, scale) {
|
|
8047
|
+
if (scale === 1) {
|
|
8048
|
+
return commands;
|
|
8049
|
+
}
|
|
8050
|
+
const sx = (x) => originX + (x - originX) * scale;
|
|
8051
|
+
return commands.map((cmd) => {
|
|
8052
|
+
switch (cmd.type) {
|
|
8053
|
+
case 'M':
|
|
8054
|
+
case 'L':
|
|
8055
|
+
return { type: cmd.type, x: sx(cmd.x), y: cmd.y };
|
|
8056
|
+
case 'Q':
|
|
8057
|
+
return { type: 'Q', x1: sx(cmd.x1), y1: cmd.y1, x: sx(cmd.x), y: cmd.y };
|
|
8058
|
+
case 'C':
|
|
8059
|
+
return {
|
|
8060
|
+
type: 'C',
|
|
8061
|
+
x1: sx(cmd.x1),
|
|
8062
|
+
y1: cmd.y1,
|
|
8063
|
+
x2: sx(cmd.x2),
|
|
8064
|
+
y2: cmd.y2,
|
|
8065
|
+
x: sx(cmd.x),
|
|
8066
|
+
y: cmd.y,
|
|
8067
|
+
};
|
|
8068
|
+
case 'Z':
|
|
8069
|
+
default:
|
|
8070
|
+
return cmd;
|
|
8071
|
+
}
|
|
8072
|
+
});
|
|
8073
|
+
}
|
|
7824
8074
|
/**
|
|
7825
8075
|
* Map `y` (a point on the glyph's nominal, undeformed `[nomTop, nomBottom]`
|
|
7826
8076
|
* band) into the envelope curve's own `[edgeTop, edgeBottom]` band at this
|
|
@@ -8015,10 +8265,12 @@ function buildGlyphSlices(preset, x0, x1, u0, u1, adj, adj2, height, lineIndex,
|
|
|
8015
8265
|
const sliceX1 = x0 + ((x1 - x0) * (i + 1)) / n;
|
|
8016
8266
|
const sliceU0 = u0 + ((u1 - u0) * i) / n;
|
|
8017
8267
|
const sliceU1 = u0 + ((u1 - u0) * (i + 1)) / n;
|
|
8268
|
+
const e0 = edgeAt(sliceU0);
|
|
8269
|
+
const e1 = edgeAt(sliceU1);
|
|
8018
8270
|
slices.push({
|
|
8019
8271
|
clipX0: sliceX0 - (i === 0 ? 0 : SEAM_OVERLAP_PX),
|
|
8020
8272
|
clipX1: sliceX1 + (i === n - 1 ? 0 : SEAM_OVERLAP_PX),
|
|
8021
|
-
transform: glyphEnvelopeMatrix(sliceX0, sliceX1,
|
|
8273
|
+
transform: glyphEnvelopeMatrix(sliceX0, sliceX1, e0, e1, nomTop, nomBottom),
|
|
8022
8274
|
});
|
|
8023
8275
|
}
|
|
8024
8276
|
return slices;
|
|
@@ -8038,111 +8290,6 @@ function buildGlyphSlices(preset, x0, x1, u0, u1, adj, adj2, height, lineIndex,
|
|
|
8038
8290
|
* React/Vue/Angular/Svelte/Vanilla, matching the framework-neutral
|
|
8039
8291
|
* `WarpPathGenerator` shape the `'path'` family already uses.
|
|
8040
8292
|
*/
|
|
8041
|
-
let measureCtx;
|
|
8042
|
-
function getMeasureCtx$1() {
|
|
8043
|
-
if (measureCtx !== undefined) {
|
|
8044
|
-
return measureCtx;
|
|
8045
|
-
}
|
|
8046
|
-
if (typeof document === 'undefined') {
|
|
8047
|
-
measureCtx = null;
|
|
8048
|
-
return null;
|
|
8049
|
-
}
|
|
8050
|
-
measureCtx = document.createElement('canvas').getContext('2d');
|
|
8051
|
-
return measureCtx;
|
|
8052
|
-
}
|
|
8053
|
-
function toCanvasFont$1(font) {
|
|
8054
|
-
const size = font.fontSizePx && font.fontSizePx > 0 ? font.fontSizePx : DEFAULT_TEXT_FONT_SIZE;
|
|
8055
|
-
const family = font.fontFamily || DEFAULT_FONT_FAMILY;
|
|
8056
|
-
return `${font.italic ? 'italic ' : ''}${font.bold ? 'bold ' : ''}${size}px ${family}`;
|
|
8057
|
-
}
|
|
8058
|
-
/**
|
|
8059
|
-
* Per-character advance widths for `text` set in `font`, measured as prefix
|
|
8060
|
-
* differences (never a lone character: see `text-metric-tracking.ts`'s
|
|
8061
|
-
* `advancesOf` for why - shaped scripts and ligatures need the context).
|
|
8062
|
-
*
|
|
8063
|
-
* Falls back to a flat `0.55em`-per-character estimate when there is no DOM
|
|
8064
|
-
* to measure with (SSR, or a test environment without a 2D canvas context);
|
|
8065
|
-
* the estimate only affects horizontal glyph spacing, never the envelope
|
|
8066
|
-
* curve itself, so it stays visually reasonable even when approximate.
|
|
8067
|
-
*/
|
|
8068
|
-
function measureGlyphAdvances(text, font) {
|
|
8069
|
-
const chars = [...text];
|
|
8070
|
-
const ctx = getMeasureCtx$1();
|
|
8071
|
-
if (!ctx) {
|
|
8072
|
-
const size = font.fontSizePx && font.fontSizePx > 0 ? font.fontSizePx : DEFAULT_TEXT_FONT_SIZE;
|
|
8073
|
-
return chars.map(() => size * 0.55);
|
|
8074
|
-
}
|
|
8075
|
-
ctx.font = toCanvasFont$1(font);
|
|
8076
|
-
const advances = [];
|
|
8077
|
-
let previous = 0;
|
|
8078
|
-
let prefix = '';
|
|
8079
|
-
for (const char of chars) {
|
|
8080
|
-
prefix += char;
|
|
8081
|
-
const width = ctx.measureText(prefix).width;
|
|
8082
|
-
advances.push(Math.max(0, width - previous));
|
|
8083
|
-
previous = width;
|
|
8084
|
-
}
|
|
8085
|
-
return advances;
|
|
8086
|
-
}
|
|
8087
|
-
/**
|
|
8088
|
-
* The real (ink-measured) ascent of `segments`' text at their own font
|
|
8089
|
-
* sizes, as the tallest `actualBoundingBoxAscent` across every segment on
|
|
8090
|
-
* the line (not a per-character average - one tall glyph anywhere on the
|
|
8091
|
-
* line sets the reference the whole line warps against, matching how a
|
|
8092
|
-
* single baseline/cap-height pair governs a real text run).
|
|
8093
|
-
*
|
|
8094
|
-
* `buildGlyphEnvelope` used to map every glyph's nominal band from a FIXED
|
|
8095
|
-
* `NOMINAL_ENVELOPE_BAND` fraction of the box height (0.15..0.85), assuming
|
|
8096
|
-
* a glyph's own cap height fills that whole span. COM-measured (2026-09-11,
|
|
8097
|
-
* `text-warp-glyph-outline.ts`'s doc comment): for an 8-shape WordArt
|
|
8098
|
-
* fixture (Arimo Bold 44pt captions in 100pt-tall boxes, the `textCanUp` /
|
|
8099
|
-
* `textCanDown` / `textInflate` / `textDeflate` presets at both default and
|
|
8100
|
-
* extreme `adj`), real cap height reaches only about `t = 0.57` of that
|
|
8101
|
-
* nominal span, not `t = 0`, so every glyph's mapped top undershot the
|
|
8102
|
-
* curve's own top edge by the same amount - an outline-vs-COM interior-
|
|
8103
|
-
* column ink-scan comparison measured ~30-40% of box height mean error (max
|
|
8104
|
-
* 58-80%) on BOTH the outline path and the affine fallback alike (both use
|
|
8105
|
-
* this same nominal band, so both shared the bug identically: the residual
|
|
8106
|
-
* lived here, not in the outline point-mapping math). Anchoring `nomTop` to
|
|
8107
|
-
* the line's REAL measured ascent instead - clamped to never exceed the
|
|
8108
|
-
* historical fixed band, so a line whose font genuinely fills (or exceeds)
|
|
8109
|
-
* the nominal span keeps the old, already-validated behaviour unchanged -
|
|
8110
|
-
* dropped the `textInflate`/`textDeflate` interior mean error to ~2.6-2.9%
|
|
8111
|
-
* (max ~9-10%), in the range `text-warp-glyph-slicing.ts`'s doc comment
|
|
8112
|
-
* already documents as the residual once this band mismatch is not also
|
|
8113
|
-
* present. The `textCanUp`/`textCanDown` cases still show an elevated
|
|
8114
|
-
* residual (their interior mean measured ~6-20% even after this fix) that
|
|
8115
|
-
* further investigation traced to a SEPARATE, larger issue: real PowerPoint
|
|
8116
|
-
* spaces envelope-warped glyphs to fill the box's own width edge-to-edge
|
|
8117
|
-
* (measured ink spanning ~99.9% of box width) rather than centering the
|
|
8118
|
-
* text at its natural (unstretched) advance width the way `startX`/
|
|
8119
|
-
* `measureGlyphAdvances` do today, with `textCanUp`/`textCanDown` additionally
|
|
8120
|
-
* showing non-uniform (cylinder-projection-like) horizontal spacing this fix
|
|
8121
|
-
* does not address - both are horizontal-layout gaps, out of scope for this
|
|
8122
|
-
* (purely vertical) band fix and left as an open, separately-scoped issue.
|
|
8123
|
-
*
|
|
8124
|
-
* Returns `undefined` with no DOM (SSR, or a test environment without a 2D
|
|
8125
|
-
* canvas context), so a caller falls back to the previous fixed-fraction
|
|
8126
|
-
* band unchanged, exactly like {@link measureGlyphAdvances}'s own fallback.
|
|
8127
|
-
*/
|
|
8128
|
-
function measureLineAscent(segments) {
|
|
8129
|
-
const ctx = getMeasureCtx$1();
|
|
8130
|
-
if (!ctx) {
|
|
8131
|
-
return undefined;
|
|
8132
|
-
}
|
|
8133
|
-
let maxAscent = 0;
|
|
8134
|
-
for (const segment of segments) {
|
|
8135
|
-
if (!segment.text) {
|
|
8136
|
-
continue;
|
|
8137
|
-
}
|
|
8138
|
-
ctx.font = toCanvasFont$1(segment.font);
|
|
8139
|
-
const ascent = ctx.measureText(segment.text).actualBoundingBoxAscent;
|
|
8140
|
-
if (Number.isFinite(ascent) && ascent > maxAscent) {
|
|
8141
|
-
maxAscent = ascent;
|
|
8142
|
-
}
|
|
8143
|
-
}
|
|
8144
|
-
return maxAscent > 0 ? maxAscent : undefined;
|
|
8145
|
-
}
|
|
8146
8293
|
function startX(align, width, lineWidth) {
|
|
8147
8294
|
if (align === 'right') {
|
|
8148
8295
|
return width - lineWidth;
|
|
@@ -8187,15 +8334,50 @@ function buildGlyphEnvelope(preset, segments, width, height, align, adj, adj2, l
|
|
|
8187
8334
|
// span keeps today's behaviour unchanged.
|
|
8188
8335
|
const realAscent = measureLineAscent(segments);
|
|
8189
8336
|
const nomTop = realAscent !== undefined ? Math.max(fixedBandTop, nomBottom - realAscent) : fixedBandTop;
|
|
8337
|
+
// PowerPoint spaces envelope-warped glyphs edge to edge across the box's
|
|
8338
|
+
// own width, rather than centring the line at its natural (unstretched)
|
|
8339
|
+
// advance width the way `startX`/`measureGlyphAdvances` did before this
|
|
8340
|
+
// fix (COM-measured 2026-09-11, an 8-shape Arimo Bold fixture: measured
|
|
8341
|
+
// ink spans ~99.9% of box width for BOTH the `can` and `inflate`/
|
|
8342
|
+
// `deflate` families). `stretch` is the uniform factor (box width /
|
|
8343
|
+
// natural line width) that reproduces the measured glyph PITCH closely
|
|
8344
|
+
// (interior boundary positions within ~1-3% of box width of COM ground
|
|
8345
|
+
// truth) for every glyph-envelope preset tested; every glyph's advance is
|
|
8346
|
+
// scaled by it, so the line always spans exactly `[0, width]`.
|
|
8347
|
+
//
|
|
8348
|
+
// Whether the glyph's own SHAPE also widens by `stretch` differs by
|
|
8349
|
+
// family though: `shapeScale` is `stretch` for `inflate`/`deflate` (and
|
|
8350
|
+
// the rest of the non-`can` envelope family) - COM-measured, their
|
|
8351
|
+
// per-glyph ink WIDTH scales with the stretch factor, matching a literal
|
|
8352
|
+
// rubber-sheet distortion where letters get visibly fatter. It is `1` for
|
|
8353
|
+
// `textCanUp`/`textCanDown` - their per-glyph ink width stays at its
|
|
8354
|
+
// NATURAL (unstretched) value; only the gaps between glyphs widen,
|
|
8355
|
+
// matching the "wrap around a cylinder" metaphor (letters keep their own
|
|
8356
|
+
// proportions, spaced further apart) rather than 2D stretching. Only
|
|
8357
|
+
// `shapeScale` reaches the OUTLINE render path (`scaleOutlineCommandsX`
|
|
8358
|
+
// below): the affine-fallback `transform`/`slices` path has no
|
|
8359
|
+
// horizontal-scale term by design (see `glyphEnvelopeMatrix`'s `a=1, c=0,
|
|
8360
|
+
// e=0` doc note), so it always fits the glyph's own NATURAL (unscaled)
|
|
8361
|
+
// width regardless of family - an accepted simplification for the
|
|
8362
|
+
// secondary (no-outline-available) path.
|
|
8363
|
+
const isCanFamily = preset === 'textCanUp' || preset === 'textCanDown';
|
|
8364
|
+
const stretch = width > 0 && lineWidth > 0 ? width / lineWidth : 1;
|
|
8365
|
+
const shapeScale = isCanFamily ? 1 : stretch;
|
|
8190
8366
|
const placements = [];
|
|
8191
|
-
let x = startX(align, width, lineWidth);
|
|
8367
|
+
let x = lineWidth > 0 ? 0 : startX(align, width, lineWidth);
|
|
8192
8368
|
segments.forEach((segment, segIdx) => {
|
|
8193
8369
|
const chars = [...segment.text];
|
|
8194
8370
|
const advances = perSegmentAdvances[segIdx];
|
|
8195
8371
|
chars.forEach((char, i) => {
|
|
8196
|
-
const
|
|
8372
|
+
const naturalGlyphWidth = advances[i] ?? 0;
|
|
8373
|
+
const pitch = naturalGlyphWidth * stretch;
|
|
8197
8374
|
const x0 = x;
|
|
8198
|
-
|
|
8375
|
+
// The affine-fit extent always uses the NATURAL (unscaled) width:
|
|
8376
|
+
// the affine/slice path can only ever render a glyph at its own
|
|
8377
|
+
// natural on-screen width (no horizontal-scale term available), so
|
|
8378
|
+
// fitting the curve across a wider span than what actually renders
|
|
8379
|
+
// would reintroduce the very mismatch this fix closes.
|
|
8380
|
+
const x1 = x0 + naturalGlyphWidth;
|
|
8199
8381
|
const u0 = width > 0 ? x0 / width : 0.5;
|
|
8200
8382
|
const u1 = width > 0 ? x1 / width : 0.5;
|
|
8201
8383
|
const edge0 = edgeBandAt(preset, u0, adj, adj2, height, safeLineIndex, safeLineCount);
|
|
@@ -8203,7 +8385,10 @@ function buildGlyphEnvelope(preset, segments, width, height, align, adj, adj2, l
|
|
|
8203
8385
|
// Outline warping takes priority when the caller can supply the
|
|
8204
8386
|
// glyph's real outline: it is exact, so the affine fit (and its
|
|
8205
8387
|
// piecewise-slice fallback) is only worth computing when it can't.
|
|
8206
|
-
const
|
|
8388
|
+
const rawOutline = getGlyphOutline?.(char, segment.font, x0, nomBottom);
|
|
8389
|
+
const outlineCommands = rawOutline
|
|
8390
|
+
? scaleOutlineCommandsX(rawOutline, x0, shapeScale)
|
|
8391
|
+
: undefined;
|
|
8207
8392
|
const outlinePath = outlineCommands
|
|
8208
8393
|
? buildWarpedGlyphOutlinePathD(outlineCommands, preset, width, height, nomTop, nomBottom, adj, adj2, safeLineIndex, safeLineCount)
|
|
8209
8394
|
: undefined;
|
|
@@ -8213,7 +8398,7 @@ function buildGlyphEnvelope(preset, segments, width, height, align, adj, adj2, l
|
|
|
8213
8398
|
placements.push({
|
|
8214
8399
|
char,
|
|
8215
8400
|
segmentIndex: segment.segmentIndex,
|
|
8216
|
-
x,
|
|
8401
|
+
x: x0,
|
|
8217
8402
|
y: nomBottom,
|
|
8218
8403
|
transform: glyphEnvelopeMatrix(x0, x1, edge0, edge1, nomTop, nomBottom),
|
|
8219
8404
|
slices: sliceCount > 1
|
|
@@ -8221,15 +8406,11 @@ function buildGlyphEnvelope(preset, segments, width, height, align, adj, adj2, l
|
|
|
8221
8406
|
: undefined,
|
|
8222
8407
|
outlinePath,
|
|
8223
8408
|
});
|
|
8224
|
-
x +=
|
|
8409
|
+
x += pitch;
|
|
8225
8410
|
});
|
|
8226
8411
|
});
|
|
8227
8412
|
return placements;
|
|
8228
8413
|
}
|
|
8229
|
-
/** Test hook: forget the cached measurement context. */
|
|
8230
|
-
function resetGlyphEnvelopeMeasureCache() {
|
|
8231
|
-
measureCtx = undefined;
|
|
8232
|
-
}
|
|
8233
8414
|
|
|
8234
8415
|
/**
|
|
8235
8416
|
* embedded-fonts.ts: Pure (no DOM-injection) helpers for the embedded-font
|
|
@@ -43708,6 +43889,7 @@ function deleteTableRow(tableData, rowIdx) {
|
|
|
43708
43889
|
return {
|
|
43709
43890
|
...cc,
|
|
43710
43891
|
text: cell.text || cc.text,
|
|
43892
|
+
textRuns: cell.text ? cell.textRuns : cc.textRuns,
|
|
43711
43893
|
style: cc.style || cell.style,
|
|
43712
43894
|
rowSpan: newRs > 1 ? newRs : undefined,
|
|
43713
43895
|
vMerge: undefined,
|
|
@@ -43839,6 +44021,7 @@ function deleteTableColumn(tableData, colIdx) {
|
|
|
43839
44021
|
adjustedCells[nextColIdx] = {
|
|
43840
44022
|
...nextCell,
|
|
43841
44023
|
text: cell.text || nextCell.text,
|
|
44024
|
+
textRuns: cell.text ? cell.textRuns : nextCell.textRuns,
|
|
43842
44025
|
style: nextCell.style || cell.style,
|
|
43843
44026
|
gridSpan: gs - 1 > 1 ? gs - 1 : undefined,
|
|
43844
44027
|
hMerge: undefined,
|
|
@@ -43915,7 +44098,7 @@ function buildTableDataGrid(element) {
|
|
|
43915
44098
|
* structural edit therefore rebuilds `rawXml` alongside it, exactly as the
|
|
43916
44099
|
* on-canvas cell editor does.
|
|
43917
44100
|
*/
|
|
43918
|
-
function withTableData$1(element, transform) {
|
|
44101
|
+
function withTableData$1(element, transform, edit) {
|
|
43919
44102
|
const tableData = element.tableData;
|
|
43920
44103
|
if (!tableData) {
|
|
43921
44104
|
return element;
|
|
@@ -43926,7 +44109,7 @@ function withTableData$1(element, transform) {
|
|
|
43926
44109
|
}
|
|
43927
44110
|
const updated = { ...element, tableData: next };
|
|
43928
44111
|
if (element.rawXml) {
|
|
43929
|
-
const rawXml = rebuildTableStructureInRawXml(element, next);
|
|
44112
|
+
const rawXml = rebuildTableStructureInRawXml(element, next, edit);
|
|
43930
44113
|
if (rawXml) {
|
|
43931
44114
|
updated.rawXml = rawXml;
|
|
43932
44115
|
}
|
|
@@ -43961,7 +44144,11 @@ function setTableElementCellText(element, rowIndex, colIndex, text) {
|
|
|
43961
44144
|
* @returns A new element with the row inserted.
|
|
43962
44145
|
*/
|
|
43963
44146
|
function insertTableElementRow(element, rowIdx, position) {
|
|
43964
|
-
return withTableData$1(element, (data) => insertTableRow(data, rowIdx, position)
|
|
44147
|
+
return withTableData$1(element, (data) => insertTableRow(data, rowIdx, position), {
|
|
44148
|
+
axis: 'row',
|
|
44149
|
+
action: 'insert',
|
|
44150
|
+
index: position === 'above' ? rowIdx : rowIdx + 1,
|
|
44151
|
+
});
|
|
43965
44152
|
}
|
|
43966
44153
|
/**
|
|
43967
44154
|
* Remove the row at `rowIdx`, preserving merge spans. No-op on the last row.
|
|
@@ -43971,7 +44158,11 @@ function insertTableElementRow(element, rowIdx, position) {
|
|
|
43971
44158
|
* @returns A new element with the row removed.
|
|
43972
44159
|
*/
|
|
43973
44160
|
function removeTableElementRow(element, rowIdx) {
|
|
43974
|
-
return withTableData$1(element, (data) => deleteTableRow(data, rowIdx)
|
|
44161
|
+
return withTableData$1(element, (data) => deleteTableRow(data, rowIdx), {
|
|
44162
|
+
axis: 'row',
|
|
44163
|
+
action: 'delete',
|
|
44164
|
+
index: rowIdx,
|
|
44165
|
+
});
|
|
43975
44166
|
}
|
|
43976
44167
|
/**
|
|
43977
44168
|
* Insert a blank column left or right of `colIdx`, preserving merge spans.
|
|
@@ -43982,7 +44173,11 @@ function removeTableElementRow(element, rowIdx) {
|
|
|
43982
44173
|
* @returns A new element with the column inserted.
|
|
43983
44174
|
*/
|
|
43984
44175
|
function insertTableElementColumn(element, colIdx, position) {
|
|
43985
|
-
return withTableData$1(element, (data) => insertTableColumn(data, colIdx, position)
|
|
44176
|
+
return withTableData$1(element, (data) => insertTableColumn(data, colIdx, position), {
|
|
44177
|
+
axis: 'column',
|
|
44178
|
+
action: 'insert',
|
|
44179
|
+
index: position === 'left' ? colIdx : colIdx + 1,
|
|
44180
|
+
});
|
|
43986
44181
|
}
|
|
43987
44182
|
/**
|
|
43988
44183
|
* Remove the column at `colIdx`, preserving merge spans. No-op on the last one.
|
|
@@ -43992,7 +44187,11 @@ function insertTableElementColumn(element, colIdx, position) {
|
|
|
43992
44187
|
* @returns A new element with the column removed.
|
|
43993
44188
|
*/
|
|
43994
44189
|
function removeTableElementColumn(element, colIdx) {
|
|
43995
|
-
return withTableData$1(element, (data) => deleteTableColumn(data, colIdx)
|
|
44190
|
+
return withTableData$1(element, (data) => deleteTableColumn(data, colIdx), {
|
|
44191
|
+
axis: 'column',
|
|
44192
|
+
action: 'delete',
|
|
44193
|
+
index: colIdx,
|
|
44194
|
+
});
|
|
43996
44195
|
}
|
|
43997
44196
|
/**
|
|
43998
44197
|
* Append a blank row after the last one.
|
|
@@ -45739,8 +45938,17 @@ function computeShadeToTitleFillToRect(title, slideWidthPx, slideHeightPx) {
|
|
|
45739
45938
|
b: clampUnit(1 - (title.y + title.height) / slideHeightPx),
|
|
45740
45939
|
};
|
|
45741
45940
|
}
|
|
45742
|
-
/**
|
|
45743
|
-
|
|
45941
|
+
/**
|
|
45942
|
+
* Matches one `<colour> <position>%` gradient stop token (see
|
|
45943
|
+
* {@link parseGradientCssStops}). The `rgba?(...)` alternative excludes `(`
|
|
45944
|
+
* from its content class (`[^()]*` rather than `[^)]*`): otherwise, on a
|
|
45945
|
+
* string with many repeated unclosed `rgb(` prefixes, each occurrence lets
|
|
45946
|
+
* the content group re-swallow every later `rgb(` before failing to find a
|
|
45947
|
+
* closing `)`, which is `js/polynomial-redos` (quadratic in the number of
|
|
45948
|
+
* repeats). Real `rgba?()` content never contains `(`, so this does not
|
|
45949
|
+
* change what valid input matches.
|
|
45950
|
+
*/
|
|
45951
|
+
const GRADIENT_STOP_TOKEN = /(rgba?\([^()]*\)|#[0-9a-fA-F]{3,8})\s+(-?[\d.]+)%/gu;
|
|
45744
45952
|
function toHexChannel(value) {
|
|
45745
45953
|
return Math.min(255, Math.max(0, Math.round(value)))
|
|
45746
45954
|
.toString(16)
|
|
@@ -96755,8 +96963,20 @@ async function fetchTextIfCrossOriginSafe(url) {
|
|
|
96755
96963
|
return null;
|
|
96756
96964
|
}
|
|
96757
96965
|
}
|
|
96758
|
-
/**
|
|
96759
|
-
|
|
96966
|
+
/**
|
|
96967
|
+
* Every distinct `url(...)` reference inside a `@font-face` CSS block's `src`
|
|
96968
|
+
* list, as a double-quoted, single-quoted, or bare token. The three forms are
|
|
96969
|
+
* separate alternatives (rather than one `["']?...["']?` wrapped around a
|
|
96970
|
+
* single content group) so the surrounding `\s*` never shares characters with
|
|
96971
|
+
* the content group: a naive `\s*["']?([^"')]+)["']?\s*` lets whitespace be
|
|
96972
|
+
* split between the leading `\s*` and the content group in exponentially many
|
|
96973
|
+
* equivalent ways, which is polynomial-time (`js/polynomial-redos`) on an
|
|
96974
|
+
* unclosed `url(` followed by many tabs/spaces (this stylesheet text can come
|
|
96975
|
+
* from a fetched cross-origin `@font-face` CSS file, see
|
|
96976
|
+
* `fetchTextIfCrossOriginSafe`). Each alternative here has a fixed,
|
|
96977
|
+
* non-overlapping character class, so there is only one way to match.
|
|
96978
|
+
*/
|
|
96979
|
+
const FONT_FACE_URL_PATTERN = /url\(\s*(?:"([^"]*)"|'([^']*)'|([^"')\s]+))\s*\)/gu;
|
|
96760
96980
|
/**
|
|
96761
96981
|
* Replace every `url(https://...)` reference in `css` with a `data:` URI of
|
|
96762
96982
|
* the fetched resource, dropping (leaving as-is) any reference that fails to
|
|
@@ -96768,8 +96988,8 @@ const FONT_FACE_URL_PATTERN = /url\(\s*["']?([^"')]+)["']?\s*\)/gu;
|
|
|
96768
96988
|
async function inlineFontFaceUrls(css, fetchDataUrl) {
|
|
96769
96989
|
const urls = new Set();
|
|
96770
96990
|
for (const match of css.matchAll(FONT_FACE_URL_PATTERN)) {
|
|
96771
|
-
const raw = match[1];
|
|
96772
|
-
if (raw.startsWith('http:') || raw.startsWith('https:')) {
|
|
96991
|
+
const raw = match[1] ?? match[2] ?? match[3];
|
|
96992
|
+
if (raw && (raw.startsWith('http:') || raw.startsWith('https:'))) {
|
|
96773
96993
|
urls.add(raw);
|
|
96774
96994
|
}
|
|
96775
96995
|
}
|
|
@@ -96871,10 +97091,25 @@ async function fetchAsDataUrl(url) {
|
|
|
96871
97091
|
return null;
|
|
96872
97092
|
}
|
|
96873
97093
|
}
|
|
97094
|
+
/**
|
|
97095
|
+
* Matches one `url(...)` reference, as a double-quoted, single-quoted, or bare
|
|
97096
|
+
* token. The three forms are matched as separate alternatives (rather than one
|
|
97097
|
+
* `["']?...["']?` wrapped around a single content group) so the surrounding
|
|
97098
|
+
* `\s*` never shares characters with the content group: a naive
|
|
97099
|
+
* `\s*["']?([^"')]+)["']?\s*` lets whitespace be split between the leading
|
|
97100
|
+
* `\s*` and the content group in exponentially many equivalent ways, which is
|
|
97101
|
+
* polynomial-time (`js/polynomial-redos`) on an unclosed `url(` followed by
|
|
97102
|
+
* many tabs/spaces. Each alternative here has a fixed, non-overlapping
|
|
97103
|
+
* character class, so there is only one way to match.
|
|
97104
|
+
*/
|
|
97105
|
+
const CSS_URL_PATTERN = /url\(\s*(?:"([^"]*)"|'([^']*)'|([^"')\s]+))\s*\)/u;
|
|
96874
97106
|
/** Extract a `url(...)` reference from a CSS value; returns `null` when none is present. */
|
|
96875
97107
|
function extractCssUrl(value) {
|
|
96876
|
-
const match =
|
|
96877
|
-
|
|
97108
|
+
const match = CSS_URL_PATTERN.exec(value);
|
|
97109
|
+
if (!match) {
|
|
97110
|
+
return null;
|
|
97111
|
+
}
|
|
97112
|
+
return match[1] ?? match[2] ?? match[3] ?? null;
|
|
96878
97113
|
}
|
|
96879
97114
|
function needsEmbedding(url) {
|
|
96880
97115
|
return url.startsWith('blob:') || url.startsWith('http:') || url.startsWith('https:');
|
|
@@ -100819,6 +101054,21 @@ function groupTilesByRow(tiles) {
|
|
|
100819
101054
|
const rowCount = tiles.reduce((max, t) => Math.max(max, t.row), 0) + 1;
|
|
100820
101055
|
const rows = Array.from({ length: rowCount }, () => []);
|
|
100821
101056
|
for (const tile of tiles) {
|
|
101057
|
+
// `row`/`col` are declared as `number`, but this is a public export: a
|
|
101058
|
+
// caller could pass a `RasterizedTile[]` built from untrusted data whose
|
|
101059
|
+
// `row`/`col` are, at runtime, a string like `__proto__`. Indexing an
|
|
101060
|
+
// array with that string resolves through `Array.prototype` (itself
|
|
101061
|
+
// inherited from `Object.prototype`), so `rows[tile.row][tile.col] = tile`
|
|
101062
|
+
// would assign onto `Array.prototype` rather than `rows`, polluting every
|
|
101063
|
+
// array in the process. Requiring a genuine non-negative integer index
|
|
101064
|
+
// closes that off without changing behaviour for any real tile, which is
|
|
101065
|
+
// always produced by `computeExportTilePlan`'s integer loop counters.
|
|
101066
|
+
if (!Number.isInteger(tile.row) ||
|
|
101067
|
+
!Number.isInteger(tile.col) ||
|
|
101068
|
+
tile.row < 0 ||
|
|
101069
|
+
tile.col < 0) {
|
|
101070
|
+
continue;
|
|
101071
|
+
}
|
|
100822
101072
|
rows[tile.row][tile.col] = tile;
|
|
100823
101073
|
}
|
|
100824
101074
|
return rows;
|
|
@@ -103197,7 +103447,7 @@ function createLocalStorageBackend(namespace) {
|
|
|
103197
103447
|
/** Try IndexedDB first; fall back to localStorage on any failure. */
|
|
103198
103448
|
async function resolveBackend(dbName, namespace) {
|
|
103199
103449
|
try {
|
|
103200
|
-
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-
|
|
103450
|
+
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-D_H4MXBh.mjs');
|
|
103201
103451
|
const db = await openChatDb(dbName);
|
|
103202
103452
|
return createIdbBackend(db);
|
|
103203
103453
|
}
|
|
@@ -109831,10 +110081,14 @@ class EditorContextMenuComponent {
|
|
|
109831
110081
|
return;
|
|
109832
110082
|
}
|
|
109833
110083
|
const updated = op(ctx.element, ctx.sel);
|
|
109834
|
-
if (updated.tableData) {
|
|
109835
|
-
|
|
110084
|
+
if (updated !== ctx.element && updated.tableData) {
|
|
110085
|
+
const patch = {
|
|
109836
110086
|
tableData: updated.tableData,
|
|
109837
|
-
}
|
|
110087
|
+
};
|
|
110088
|
+
if (updated.rawXml !== ctx.element.rawXml) {
|
|
110089
|
+
patch.rawXml = updated.rawXml;
|
|
110090
|
+
}
|
|
110091
|
+
this.editor.updateElement(this.slideIndex(), ctx.element.id, patch);
|
|
109838
110092
|
}
|
|
109839
110093
|
}
|
|
109840
110094
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: EditorContextMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
@@ -143125,7 +143379,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
143125
143379
|
}], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }], selectedElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElement", required: false }] }] } });
|
|
143126
143380
|
|
|
143127
143381
|
// Generated by scripts/inline-shared.mjs from package.json. Do not edit.
|
|
143128
|
-
const PPTX_ANGULAR_VIEWER_VERSION = "3.
|
|
143382
|
+
const PPTX_ANGULAR_VIEWER_VERSION = "3.15.0";
|
|
143129
143383
|
|
|
143130
143384
|
/**
|
|
143131
143385
|
* account-page.component.ts: File > Account content.
|
|
@@ -181587,4 +181841,4 @@ function cn(...values) {
|
|
|
181587
181841
|
*/
|
|
181588
181842
|
|
|
181589
181843
|
export { CollaborationService as $, AFTER_ANIMATION_VALUES as A, AnimationAuthorPanelComponent as B, AnimationPanelComponent as C, AnimationPlaybackService as D, AutosaveRecoveryDialogComponent as E, AutosaveService as F, BroadcastDialogComponent as G, CHART_EDITOR_STYLES as H, CURSOR_PALETTE as I, CanvasFitService as J, ChartAxisOptionsComponent as K, ChartAxisStyleOptionsComponent as L, ChartComboTypeOptionsComponent as M, ChartDataEditorComponent as N, ChartDataLabelOptionsComponent as O, ChartDatapointMarkerOptionsComponent as P, ChartDatapointOptionsComponent as Q, ChartDisplayOptionsComponent as R, ChartElementViewComponent as S, ChartErrorBarOptionsComponent as T, ChartMarkerOptionsComponent as U, ChartPartSelectionService as V, ChartPrimitivesComponent as W, ChartRendererComponent as X, ChartTrendlineOptionsComponent as Y, ChartTypeSelectorComponent as Z, CollaborationCursorsComponent as _, ALIGN_OPTIONS as a, InsertSmartArtDialogComponent as a$, ColorChangedImageComponent as a0, CommentMarkersOverlayComponent as a1, CommentsPanelComponent as a2, CommentsService as a3, ComparePanelComponent as a4, ConnectorRendererComponent as a5, ConnectorTextOverlayComponent as a6, CustomShowsComponent as a7, DEFAULT_BOUNDS as a8, DEFAULT_BROADCAST_SERVER_URL as a9, EditorToolbarComponent as aA, EffectsPanelComponent as aB, ElementRendererComponent as aC, EmbeddedFontsService as aD, EncryptedFileDialogComponent as aE, EquationEditorDialogComponent as aF, EquationRendererComponent as aG, EquationTemplateGalleryComponent as aH, ExportProgressModalComponent as aI, ExportService as aJ, FieldContextService as aK, FindBarComponent as aL, FindReplaceBarComponent as aM, FollowModeBarComponent as aN, FontEmbeddingListComponent as aO, FontEmbeddingPanelComponent as aP, GALLERY_THEME_PRESETS as aQ, GOOGLE_WEBFONTS_LINK_ID as aR, GRIDLINE_COLOR$1 as aS, GoogleWebfontsService as aT, GradientPickerComponent as aU, HANDOUT_OPTIONS as aV, HeaderFooterDialogComponent as aW, HyperlinkDialogComponent as aX, ImagePropertiesPanelComponent as aY, InkDrawingService as aZ, InkRendererComponent as a_, DEFAULT_CANVAS_HEIGHT as aa, DEFAULT_CANVAS_WIDTH as ab, DEFAULT_COLOR_SCHEME as ac, DEFAULT_FILL_COLOR$1 as ad, DEFAULT_LAYOUT as ae, DEFAULT_PALETTE$1 as af, DEFAULT_PATTERN_FILL_PRESET as ag, DEFAULT_PRINT_SETTINGS as ah, DEFAULT_SLIDE_BACKGROUND as ai, DEFAULT_STROKE_COLOR as aj, DEFAULT_STYLE as ak, DEFAULT_TABLE_ROW_HEIGHT as al, DEFAULT_TEXT_COLOR$2 as am, DEFAULT_VIEWER_PROFILE as an, DIRECTIONAL_PRESETS as ao, DIRECTION_OPTIONS as ap, DocumentPropertiesCardComponent as aq, EFFECT_SOUND_CATALOGUE as ar, EMBEDDED_FONTS_STYLE_ID as as, EMPHASIS_PRESETS as at, ENTRANCE_PRESETS as au, TEMPLATES as av, EXIT_PRESETS as aw, EditorContextMenuComponent as ax, EditorHistory as ay, EditorStateService as az, ANIMATION_PRESET_CATEGORIES as b, RibbonArrangeSectionComponent as b$, InspectorPaneHeaderComponent as b0, InspectorPanelComponent as b1, IsMobileService as b2, KeepAnnotationsDialogComponent as b3, LOCALE_CATALOG as b4, LONG_PRESS_DURATION_MS as b5, LONG_PRESS_MOVE_TOLERANCE_PX as b6, LoadContentService as b7, LocalPresencePublisher as b8, MAX_ZOOM_SCALE as b9, PX_PER_INCH as bA, PasswordProtectionDialogComponent as bB, PasswordStrengthMeterComponent as bC, PowerPointViewerComponent as bD, PresentToolbarAutoHide as bE, PresentationAnnotationOverlayComponent as bF, PresentationAnnotationsService as bG, PresentationOverlayComponent as bH, PresentationPropertiesPanelComponent as bI, PresentationSettingsCardComponent as bJ, PresentationSubtitleBarComponent as bK, PresentationToolbarComponent as bL, PresentationTransitionOverlayComponent as bM, PresenterViewComponent as bN, PresenterWindowService as bO, PrintDialogComponent as bP, PrintService as bQ, PrintSettingsPanelComponent as bR, PropertiesDialogComponent as bS, REPEAT_MODE_OPTIONS as bT, RESIZE_HANDLES as bU, RULER_FONT_SIZE as bV, RULER_THICKNESS as bW, ReadingViewOverlayComponent as bX, RemoteSelectionOverlayComponent as bY, RibbonAnimationGalleryComponent as bZ, RibbonAnimationsSectionComponent as b_, MIN_ZOOM_SCALE as ba, MOTION_PATH_COLUMNS as bb, MediaPreviewComponent as bc, MediaPropertiesPanelComponent as bd, MediaRendererComponent as be, MediaTrimTimelineComponent as bf, MobileBottomBarComponent as bg, MobileMenuSheetComponent as bh, MobilePresenterViewComponent as bi, MobileSheetComponent as bj, MobileSlidesSheetComponent as bk, MobileToolbarComponent as bl, ModalDialogComponent as bm, Model3DRendererComponent as bn, NotesHandoutCardComponent as bo, NotesPanelComponent as bp, NotesToolbarComponent as bq, OleRendererComponent as br, OutlineViewOverlayComponent as bs, POWER_POINT_VIEWER_PROVIDERS as bt, PPTX_OPEN_ACCEPT as bu, PRESENTATION_OPEN_EXTENSIONS as bv, PRESENTER_CHANNEL_NAME as bw, PRESENTER_MSG_ORIGIN as bx, PRESENTER_TIMER_SEGMENT_MS as by, PX_PER_CM as bz, AUDIENCE_HASH as c, TABLE_STRUCTURE_TOGGLES as c$, RibbonColorPopoverComponent as c0, RibbonComponent as c1, RibbonDesignSectionComponent as c2, RibbonDrawSectionComponent as c3, RibbonDrawingGroupComponent as c4, RibbonEditingSectionComponent as c5, RibbonFileSectionComponent as c6, RibbonFontControlsComponent as c7, RibbonHomeSectionComponent as c8, RibbonHyperlinkButtonComponent as c9, SettingsAppearanceTabComponent as cA, SettingsDialogComponent as cB, SettingsLanguageTabComponent as cC, ShareDialogComponent as cD, ShortcutPanelComponent as cE, ShowOptionsFieldsetComponent as cF, ShowSlidesFieldsetComponent as cG, SignatureStrippedDialogComponent as cH, SignaturesPanelComponent as cI, SignaturesService as cJ, SlideBackgroundCardComponent as cK, SlideCanvasComponent as cL, SlideDefaultInspectorComponent as cM, SlideDiffChangesComponent as cN, SlideDiffRowComponent as cO, SlideDiffThumbnailsComponent as cP, SlideSizeCardComponent as cQ, SlideSorterOverlayComponent as cR, SlideThemeOverridePanelComponent as cS, SlideTransitionCardComponent as cT, SlidesPanelComponent as cU, SmartArt3DRendererComponent as cV, SmartArt3DService as cW, SmartArtPreviewComponent as cX, SmartArtPropertiesComponent as cY, SmartArtRendererComponent as cZ, StatusBarComponent as c_, RibbonInsertFieldsComponent as ca, RibbonInsertSectionComponent as cb, RibbonMotionPathGalleryComponent as cc, RibbonParagraphControlsComponent as cd, RibbonPrimaryRowComponent as ce, RibbonReviewSectionComponent as cf, RibbonShapeExtrasComponent as cg, RibbonSlideshowSectionComponent as ch, RibbonTransitionsSectionComponent as ci, RibbonViewSectionComponent as cj, RulerGuidesService as ck, SEQUENCE_OPTIONS as cl, SEVERITY_GROUPS as cm, SEVERITY_LABELS as cn, SHORTCUT_REFERENCE_ITEMS as co, SLIDE_TRANSITION_KEYFRAMES as cp, DEFAULT_PALETTE as cq, PALETTES$1 as cr, SMART_ART_COLOR_SCHEMES as cs, SMART_ART_STYLE_OPTIONS as ct, SUB_ITEM_LABEL as cu, SVG_WARP_PRESETS as cv, SWIPE_MAX_VERTICAL_PX as cw, SWIPE_THRESHOLD_PX as cx, SelectionPaneComponent as cy, SetUpSlideShowDialogComponent as cz, AUDIENCE_NONCE_KEY as d, alignPatch as d$, TEXT_3D_BOTTOM_BEVEL_KEYS as d0, TEXT_3D_TOP_BEVEL_KEYS as d1, TEXT_DIRECTION_OPTIONS$1 as d2, THEME_CATALOG as d3, TIMING_CURVE_OPTIONS as d4, TRIGGER_OPTIONS as d5, TYPE_LABELS as d6, TableCellAdvancedFillComponent as d7, TableCellFormattingComponent as d8, TableDataEditorComponent as d9, ViewerExportService as dA, ViewerExtraDialogsComponent as dB, ViewerFileIOService as dC, ViewerFindReplaceService as dD, ViewerFormatPainterService as dE, ViewerInspectorPanelService as dF, ViewerKeyboardService as dG, ViewerMobileSheetService as dH, ViewerPresentationModeService as dI, ViewerThemeGalleryService as dJ, ViewerTouchGesturesService as dK, ViewerZoomService as dL, WEBM_MIME_CANDIDATES as dM, WriteBackScheduler as dN, ZERO_LINE_COLOR as dO, ZoomNavigationService as dP, ZoomRendererComponent as dQ, ZoomTargetService as dR, addCategory as dS, addCommentToList as dT, addGradientStopPatch as dU, addItem as dV, addSeries as dW, addSubItem as dX, advanceStep as dY, affordanceElements as dZ, aiToggleVisible as d_, TablePropertiesComponent as da, TableRendererComponent as db, TableResizeOverlayComponent as dc, TableSelectionService as dd, TagsCardComponent as de, Text3DBevelSectionComponent as df, Text3DPanelComponent as dg, TextAdvancedPanelComponent as dh, ThemeEditorFieldsComponent as di, ThemeGalleryComponent as dj, ThemeSelectorCardComponent as dk, TitleBarComponent as dl, TitleBarSearchComponent as dm, TransitionDirectionPickerComponent as dn, TransitionPreviewComponent as dp, VALIGN_OPTIONS as dq, VIEWER_THEME as dr, VersionHistoryPanelComponent as ds, ViewerCanvasEditingService as dt, ViewerCollabCursorService as du, ViewerCollaborationSessionService as dv, ViewerCompareService as dw, ViewerCustomShowsService as dx, ViewerDialogsService as dy, ViewerDocumentPropertiesService as dz, AVATAR_COLOR_SWATCHES as e, buildStockViewModel as e$, animationFor as e0, animationPresetLabelKey as e1, annotationMapToInkInserts as e2, applyAcceptedDiff as e3, applyAnimationPreset as e4, applyFindReplacements as e5, applyFormatToElement as e6, applyMove as e7, applyResize as e8, asMediaElement as e9, buildEmbeddedFontStyles as eA, buildEquationElement as eB, buildEquationSegment as eC, buildFallbackViewModel as eD, buildFontFaceRule as eE, buildGradientFillCss as eF, buildGridlinesAndLabels as eG, buildHyperlinkPatch as eH, buildInkContainerStyle as eI, buildInkStrokes as eJ, buildLegend as eK, buildLiveInkStrokeView as eL, buildMarkTooltip as eM, buildModel3DContainerStyle as eN, buildModel3DViewModel as eO, buildOleActionModel as eP, buildOleInfoRows as eQ, buildPatternFillCss as eR, buildPieViewModel as eS, buildPrintHtmlDocument as eT, buildPropertiesPatch as eU, buildRadarViewModel as eV, buildRegionMapViewModel as eW, buildSaveSlides as eX, buildShareUrl as eY, buildSmartArtInsertElement as eZ, buildSmartArtNodes as e_, assignUserColor as ea, attachShowVisibilityPause as eb, attachTouchGestures as ec, axisTickValues as ed, beginNodeEdit as ee, bevelSizePatch as ef, boolFromEvent as eg, bringForward as eh, bringToFront as ei, buildBarActions as ej, buildBroadcastConfig as ek, buildBroadcastViewerUrl as el, buildCategoryLabels as em, buildCellParagraphs as en, buildChartViewModel as eo, buildChatLogExport as ep, buildChatLogMarkdown as eq, buildChromeStyle as er, buildClearHyperlinkPatch as es, buildClickGroups as et, buildColStyles as eu, buildCollaborationConfig as ev, buildComboViewModel as ew, buildCssGradientFromShapeStyle as ex, buildDuotoneFilter as ey, buildDuotoneFilterId as ez, AXIS_LABEL_COLOR as f, computePlotLayout as f$, buildSurfaceViewModel as f0, buildTableViewModel as f1, buildTreemapViewModel as f2, buildTrimFragment as f3, buildWaterfallViewModel as f4, buildZeroLine as f5, buildZoomContainerStyle as f6, buildZoomViewModel as f7, bulletIndentPx as f8, canAddTopLevelNode as f9, collectAccessibilityIssues as fA, collectElementText as fB, collectSlideText as fC, collectStoredChats as fD, collectUsedFontFamilies as fE, columnWidthStyle as fF, commitNodeText as fG, computeAlign as fH, computeAxisTitlePrimitives as fI, computeBarRects as fJ, computeBubbleRadius as fK, computeCornerHandle as fL, computeDistribute as fM, computeDrawingViewBox as fN, computeErrorBarPrimitives as fO, computeFocusTargets as fP, computeGridSpacingPx as fQ, computeHandleBoxes as fR, computeHandoutLayout as fS, computeIsMobile as fT, computeIsTablet as fU, computeLinePoints as fV, computeLinearRegression as fW, computePageCount as fX, computePieLayout as fY, computePieSlicePath as fZ, computePieSlices as f_, canEditSmartArtNodes as fa, canGroupSelection as fb, canRemoveTopLevelNode as fc, canSetStrokeWidth as fd, canStartBroadcast as fe, canStartShare as ff, canUngroupSelection as fg, canUseClipboard as fh, captionDisplayText as fi, cellRunStyle as fj, cellStyleToStyleMap as fk, cellTdStyle as fl, changeCountLabel as fm, changeIcon as fn, characterSpacingPatch as fo, chartPreserveAspectRatio as fp, checkFontAvailable as fq, clampCursorPosition as fr, clampGifDimensions as fs, clampIndex as ft, clampNotesFontSize as fu, clampScale as fv, clampStep as fw, clearAllLocalViewerData as fx, clearAudienceContent as fy, cn as fz, AccessibilityPanelComponent as g, focusTargetChips as g$, computeRSquared as g0, computeRadarPoints as g1, computeResizeHandleBoxes as g2, computeRotateHandleBox as g3, computeScatterDots as g4, computeScatterXDomain as g5, computeSelectionBoxes as g6, computeSingleSelected as g7, computeSlideIndices as g8, computeSnap as g9, disableGlowPatch as gA, disableInnerShadowPatch as gB, disableOuterShadowPatch as gC, disableReflectionPatch as gD, disableSoftEdgePatch as gE, duplicateElementById as gF, durationOf as gG, effectsStateOf as gH, enableGlowPatch as gI, enableInnerShadowPatch as gJ, enableOuterShadowPatch as gK, enableReflectionPatch as gL, enableSoftEdgePatch as gM, encodeGif as gN, endShowMediaCleanup as gO, estimatePageCount as gP, exitPresentationFullscreen as gQ, exportAiChatLogs as gR, extractPathPoints as gS, eyedropperAvailable as gT, fillColorOf$1 as gU, findInSlides as gV, findOwningSlideIndex as gW, findSlideIndexByElementId as gX, firstVisibleIndex as gY, fitPolynomial as gZ, fitZoom as g_, computeStackedBarRects as ga, computeStackedValueRange as gb, computeTrendlinePrimitives as gc, computeValueRange as gd, convertOmmlToMathMl as ge, copyFormatFromElement as gf, countAccessibilityIssues as gg, countAnnotationStrokes as gh, createAngularAiBridge as gi, createCustomShow as gj, createSwipeDismissDrag as gk, createWebrtcBundle as gl, createWebsocketBundle as gm, cssObjectToStyleMap as gn, currentColorScheme as go, currentLayout as gp, currentStyle as gq, defaultCssVars as gr, defaultRadius as gs, defaultThemeColors as gt, deleteElementsByIds as gu, deleteVersion as gv, demoteNode as gw, deriveModel3DBlobUrl as gx, derivePresenceList as gy, describeSmartArtBounds as gz, AccessibilityService as h, insertTableElementRow as h$, fontMimeForFormat as h0, fontSizeOf as h1, forgetSessionDeck as h2, formatAxisValue as h3, formatBytes as h4, formatCursorLabel as h5, formatElapsed as h6, formatFileSize as h7, formatPropertyDate as h8, formatTime as h9, getShapeFillStrokeStyle as hA, getSlideBackgroundStyle as hB, getSlideTransitionAnimations as hC, getSmartArtNodeBounds as hD, getSpeechRecognitionCtor as hE, getTextBlockStyle as hF, getTextWarp as hG, getTouchDistance as hH, getWarpCategory as hI, getWarpPath as hJ, gradientStateFromStyle as hK, gradientStateOf as hL, gradientStatePatch as hM, gradientStopColorCommitPatch as hN, gridColumns as hO, groupIssuesBySeverity as hP, hasAnimation as hQ, hasCopyableFormat as hR, hasExistingLink as hS, hasExitedFullscreen as hT, hasGradientFill as hU, hasPressureVariation as hV, hasVisibleSlideAfter as hW, headerLabel as hX, imageDimensions as hY, inkViewBox as hZ, insertTableElementColumn as h_, fpsToFrameIntervalMs as ha, generateBroadcastRoomId as hb, generateCommentId as hc, generateCustomShowId as hd, generatePressureCircles as he, generateTicks as hf, getClrChangeParams as hg, getContainerStyle as hh, getDuotoneFilterDef as hi, getEffectSoundAsset as hj, getEffectSoundState as hk, getImageSrc as hl, getLocalStorageUsageSummary as hm, getOleAriaLabel as hn, getOleBadgeLabel as ho, getOleDisplayName as hp, getOleDownloadFileName as hq, getOleTypeColor as hr, getOleTypeLabel as hs, getPasswordStrength as ht, getPatternSvg as hu, getPlaceholderStyle as hv, getVersions as hw, getResolvedShapeClipPath as hx, getResolvedShapeClipPathFor as hy, getSessionTabId as hz, AccessibilityTextPanelComponent as i, normalizeSlidesPerPage as i$, interpolateWidth as i0, isAudienceTab as i1, isBold as i2, isBrowserOpenableMime as i3, isChildNode as i4, isElementInteractive as i5, isInjectableUrl as i6, isItalic as i7, isLegacyBinaryPresentation as i8, isPpactionUrl as i9, mergeDown as iA, mergeRight as iB, mergeSelection as iC, mergeTablesDirective as iD, moveElementBy as iE, moveNodeDown as iF, moveNodeUp as iG, msToFrameDelayCs as iH, narrowToCircle as iI, narrowToPolygon as iJ, narrowToRect as iK, newChartElement as iL, newEquationElement as iM, newPresetShapeElement as iN, newShapeElement as iO, newSmartArtElement as iP, newTableElement as iQ, newTextElement as iR, nextVisibleIndex as iS, nodeBold as iT, nodeEditBox as iU, nodeFillColor as iV, nodeFontColor as iW, nodeIdFromKey as iX, nodeItalic as iY, nodeStyle as iZ, normalizeFontFormat as i_, isPresenterMessage as ia, isSigned as ib, isSupportedPresentationFile as ic, isTextElement as id, isTwoTableFocus as ie, isUnderline as ig, isUrlSafe as ih, isValidRoomId as ii, isViewportBackgroundPressTarget as ij, isZoomActivationKey as ik, issueTrackKey as il, issueTypeLabel as im, keyToLabel as io, lastVisibleIndex as ip, latexToMathml as iq, layoutConnectorPaints as ir, layoutNodeLabels as is, linePointsToSvgString as it, lineSpacingPatch as iu, loadAudienceContent as iv, loadSessionDeck as iw, mediaFallbackFor as ix, mediaSurfaceFor as iy, mergeCaptionResults as iz, AccountPageComponent as j, resolveParagraphBullet as j$, normalizeValue as j0, numFromEvent as j1, ommlToMathml as j2, ooxmlDashToCssBorderStyle as j3, openNativeEyeDropper as j4, overallStatus as j5, paletteColor as j6, parseAudienceNonce as j7, parseNodeTextarea as j8, partitionSlides as j9, readAsDataUrl as jA, recordWebm as jB, registerCrossSlideAudio as jC, rememberSessionDeck as jD, removeAnimation as jE, removeCategory as jF, removeTableElementColumn as jG, removeCommentFromList as jH, removeElementAnimation as jI, removeGradientStopPatch as jJ, removeNode as jK, removeTableElementRow as jL, removeSeries as jM, renderToCanvas as jN, reorderAnimationDown as jO, reorderAnimationUp as jP, replaceInSlides as jQ, replaceMatch as jR, requestPresentationFullscreen as jS, resizeElement as jT, resolveCaptionTracks as jU, resolveChartKind as jV, resolveFontVariant as jW, resolveHyperlinkHref as jX, resolveInteractiveElementId as jY, resolveMediaSrc as jZ, resolveOleType as j_, patchChartData as ja, patchChartStyle as jb, patchTableData as jc, patchTextStyle as jd, patternPresetOptions as je, pendingElementStyles as jf, pickColorByClickFallback as jg, pickFile as jh, pickSupportedMimeType as ji, planGifFrames as jj, planVideoSegments as jk, pointFromPointerEvent as jl, pointsToSvgPathD as jm, presenceToCursors as jn, presentationBaseName as jo, presentationStageStyle as jp, presenterTimerProgress as jq, presetByLayout as jr, presetsForCategory as js, pressuresToWidths as jt, prevVisibleIndex as ju, projectDrawingShapes as jv, promoteNode as jw, provideViewerTheme as jx, radarAngle as jy, radarRingPoints as jz, ActionSettingsPanelComponent as k, setSequence as k$, resolvePresenterNotes as k0, resolveProfileInitial as k1, resolveRegionCode as k2, resolveRibbonCanGroup as k3, resolveSlideAutoAdvanceMs as k4, resolvePalette as k5, resolveThemeCatalogEntry as k6, resolveTransitionDuration as k7, restoreSessionDeck as k8, revealedElementStyles as k9, setAnimationEmphasis as kA, setAnimationEntrance as kB, setAnimationExit as kC, setAxis as kD, setAxisLogScale as kE, setAxisTitleStyle as kF, setCategoryLabel as kG, setCellText as kH, setColorScheme as kI, setDataLabels as kJ, setDataPointExplosion as kK, setDataPointFill as kL, setDataPointLabel as kM, setDataPointMarker as kN, setDelay as kO, setDirection as kP, setDuration as kQ, setEffectSound as kR, setEffectStockSound as kS, setElementPosition as kT, setGridlineStyle as kU, setLayout as kV, setLegend as kW, setNodeStyle as kX, setNodeText as kY, setRepeatCount as kZ, setRepeatMode as k_, routeOrthogonalConnector as ka, rowStyle as kb, rulerDragToGuidePosition as kc, rulerHighlight as kd, rulerStripTicks as ke, sampleColorFromSlide as kf, sanitizeColor as kg, sanitizeSlideIndex as kh, sanitizeUserName as ki, saveViewerProfile as kj, savedPresentationFileName as kk, scanAvailableFonts as kl, searchSlides as km, seedBroadcastFields as kn, seedHyperlinkDraft as ko, seedPropertiesDraft as kp, seedShareFields as kq, segmentFrameCount as kr, selectValue$3 as ks, sendBackward as kt, sendToBack as ku, sequentialColorScale as kv, serializeWriteBack as kw, seriesColor as kx, setAfterAnimation as ky, setAfterAnimationColor as kz, AdvancedChartEditorComponent as l, updateReflectionPatch as l$, setSeriesChartType as l0, setSeriesColor as l1, setSeriesErrorBars as l2, setSeriesMarker as l3, setSeriesName as l4, setSeriesTrendline as l5, setSeriesValue as l6, setStyle as l7, setTimingCurve as l8, setTitle as l9, strokeWidthOf as lA, styleShadowFilter as lB, surfaceColor as lC, textAdvancedPatch as lD, textAdvancedStateFromStyle as lE, textAdvancedStateOf as lF, textColorOf as lG, textDirectionPatch as lH, textFontSizePatch as lI, textStyleOf as lJ, textStylePatch as lK, themeStyle as lL, themeToCssVars as lM, thumbnailHeight as lN, thumbnailZoom as lO, toggleCommentResolvedInList as lP, toggleNodeBold as lQ, toggleNodeItalic as lR, toggleSheet as lS, topLevelNodeCount as lT, transformSelectedTextCase as lU, translationsEn as lV, updateElementById as lW, updateGlowPatch as lX, updateGradientStopPatch as lY, updateInnerShadowPatch as lZ, updateOuterShadowPatch as l_, setTrigger as la, setTriggerShapeId as lb, shapeStylePatch$1 as lc, sheetAfterNavigate as ld, shouldBlockClickAdvance as le, shouldUseSvgWarp as lf, showDirectionPicker as lg, showsTemplateAffordance as lh, signatureCountLabel as li, signatureKey as lj, signatureTimestamp as lk, signerName as ll, statusLabel as lm, slideNumberOf as ln, slidesWithReappliedLayout as lo, smartArtNodes as lp, paletteColour as lq, snapToGridStep as lr, splitCursorCell as ls, splitMergedCell as lt, statusKind as lu, statusLabel$1 as lv, storeAudienceContent as lw, stringFromEvent$5 as lx, strokeColorOf as ly, strokeToInkElement as lz, AiChangeOverlayComponent as m, vAlignPatch as m0, validatePassword as m1, validatePrintSettings as m2, validateRoomId as m3, valueToY as m4, vermilionDarkColors as m5, vermilionDarkTheme as m6, vermilionLightColors as m7, vermilionLightTheme as m8, vermilionRadius as m9, waypointsToPathD as ma, withManualLayouts as mb, worstStatus as mc, zoomTargetSlideIndex as md, AiChatPanelComponent as n, AiChatService as o, AiComposerComponent as p, AiFocusBarComponent as q, AiFocusHighlightOverlayComponent as r, AiHistoryMenuComponent as s, toChatSummary as t, AiHistoryService as u, AiMessageListComponent as v, AiPanelStore as w, AiProposalCardComponent as x, AiSettingsSectionComponent as y, AiToolCallCardComponent as z };
|
|
181590
|
-
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-
|
|
181844
|
+
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-wH2ZRE8b.mjs.map
|