pptx-angular-viewer 2.17.5 → 2.17.7

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.
@@ -23022,7 +23022,12 @@ function getTableCellBandStyle(tableData, rowIndex, cellIndex, rowCount, columnC
23022
23022
  if (tableData.firstRowHeader && rowIndex === 0) {
23023
23023
  style.fontWeight = 700;
23024
23024
  applyStyleFill(styleEntry?.firstRowFill, colorScheme, style, 'rgba(68, 114, 196, 0.85)');
23025
- style.color = '#ffffff';
23025
+ // White header text belongs with a painted header band. `a:noFill` is an
23026
+ // authored transparent header, and forcing white on it leaves the header
23027
+ // row's text invisible against the slide.
23028
+ if (!styleEntry?.firstRowFill?.noFill) {
23029
+ style.color = '#ffffff';
23030
+ }
23026
23031
  applyStyleText(styleEntry?.firstRowText, colorScheme, style, fontScheme);
23027
23032
  applied = true;
23028
23033
  }
@@ -34452,35 +34457,43 @@ function resolveParagraphStrutFontSize(segments, bodyFontSize) {
34452
34457
  * separately so it can pick up bullet font/size/colour). Each binding maps the
34453
34458
  * returned plain-object styles onto its own style binding.
34454
34459
  */
34460
+ /** Points to CSS px. */
34461
+ const PT_TO_PX = 96 / 72;
34455
34462
  /**
34456
- * Resolve a paragraph's own line-height + space-before/after from its parsed
34457
- * `paragraphProperties` (the first segment's per-paragraph `a:pPr`, #69). Only
34458
- * keys the paragraph explicitly overrides are set, so a paragraph without its
34459
- * own spacing inherits the body-level defaults each binding already applies.
34463
+ * Resolve a paragraph's line-height and vertical margins.
34464
+ *
34465
+ * OOXML puts line spacing (`a:lnSpc`), space-before (`a:spcBef`) and
34466
+ * space-after (`a:spcAft`) on the paragraph, so collapsing them into one
34467
+ * body-level padding gives every paragraph the same gap and loses the authored
34468
+ * rhythm. Values the paragraph does not set fall back to the text body's, and
34469
+ * an exact measure (`a:spcPts`) beats a proportional one (`a:spcPct`) taken
34470
+ * from the same level; a paragraph's own multiplier is never mixed with an
34471
+ * exact value inherited from the body.
34460
34472
  *
34461
- * `lineSpacingExactPt` (exact `a:spcPts`) wins over the proportional
34462
- * `lineSpacing` multiplier (`a:spcPct`), mirroring the body-level resolver in
34463
- * `text-style-helpers`. `paragraphSpacingBefore` / `paragraphSpacingAfter` are
34464
- * already parsed into px by core.
34473
+ * `paragraphSpacingBefore` / `paragraphSpacingAfter` are already px from core.
34465
34474
  */
34466
- function resolveParagraphSpacing$1(pPr) {
34475
+ function resolveParagraphSpacing(input) {
34476
+ const { paraProps, bodyStyle, isFirst = false, isLast = false, spaceFirstLast = true } = input;
34467
34477
  const out = {};
34468
- if (!pPr) {
34469
- return out;
34470
- }
34471
- if (typeof pPr.lineSpacingExactPt === 'number' && pPr.lineSpacingExactPt > 0) {
34472
- out.lineHeight = `${pPr.lineSpacingExactPt}pt`;
34473
- }
34474
- else if (typeof pPr.lineSpacing === 'number' && pPr.lineSpacing > 0) {
34475
- // `a:spcPct` stacks on the 1.2 single-spacing base (see
34476
- // `proportionalLineHeight` in text-style-helpers).
34477
- out.lineHeight = proportionalLineHeight(pPr.lineSpacing);
34478
- }
34479
- if (typeof pPr.paragraphSpacingBefore === 'number') {
34480
- out.spaceBeforePx = pPr.paragraphSpacingBefore;
34481
- }
34482
- if (typeof pPr.paragraphSpacingAfter === 'number') {
34483
- out.spaceAfterPx = pPr.paragraphSpacingAfter;
34478
+ const before = paraProps?.paragraphSpacingBefore ?? bodyStyle?.paragraphSpacingBefore;
34479
+ if (typeof before === 'number' && before > 0 && (!isFirst || spaceFirstLast)) {
34480
+ out.spaceBeforePx = before;
34481
+ }
34482
+ const after = paraProps?.paragraphSpacingAfter ?? bodyStyle?.paragraphSpacingAfter;
34483
+ if (typeof after === 'number' && after > 0 && (!isLast || spaceFirstLast)) {
34484
+ out.spaceAfterPx = after;
34485
+ }
34486
+ const hasOwnLineSpacing = paraProps?.lineSpacing !== undefined || paraProps?.lineSpacingExactPt !== undefined;
34487
+ const lineSource = hasOwnLineSpacing ? paraProps : bodyStyle;
34488
+ const exactPt = lineSource?.lineSpacingExactPt;
34489
+ const multiplier = lineSource?.lineSpacing;
34490
+ if (typeof exactPt === 'number' && exactPt > 0) {
34491
+ out.lineHeight = `${exactPt * PT_TO_PX}px`;
34492
+ }
34493
+ else if (typeof multiplier === 'number' && multiplier > 0) {
34494
+ // `a:spcPct` stacks on PowerPoint's 1.2 single-spacing pitch; see
34495
+ // `proportionalLineHeight` for the COM measurement behind it.
34496
+ out.lineHeight = proportionalLineHeight(multiplier);
34484
34497
  }
34485
34498
  return out;
34486
34499
  }
@@ -34539,6 +34552,7 @@ function buildParagraphs(element, fieldContext, segmentOverrides) {
34539
34552
  }
34540
34553
  grouped[grouped.length - 1].paraSegments.push(seg);
34541
34554
  }
34555
+ const bodyStyle = hasTextProperties(element) ? element.textStyle : undefined;
34542
34556
  const result = grouped.map(({ paraSegments, terminator }, paraIndex) => {
34543
34557
  const firstSeg = paraSegments[0];
34544
34558
  const baseFontSize = firstSeg?.style?.fontSize ?? element.textStyle?.fontSize ?? 16;
@@ -34644,7 +34658,13 @@ function buildParagraphs(element, fieldContext, segmentOverrides) {
34644
34658
  // An empty paragraph's own `a:pPr` / `a:endParaRPr` ride its terminator
34645
34659
  // segment (there is no run to carry them), so read them from there.
34646
34660
  const propsCarrier = firstSeg ?? (paraSegments.length === 0 ? terminator : undefined);
34647
- const spacing = resolveParagraphSpacing$1(propsCarrier?.paragraphProperties);
34661
+ const spacing = resolveParagraphSpacing({
34662
+ paraProps: propsCarrier?.paragraphProperties,
34663
+ bodyStyle,
34664
+ isFirst: paraIndex === 0,
34665
+ isLast: paraIndex === grouped.length - 1,
34666
+ spaceFirstLast: bodyStyle?.spaceFirstLastParagraph !== false,
34667
+ });
34648
34668
  const strutFontSizePx = resolveParagraphStrutFontSize(paraSegments.length > 0 ? paraSegments : terminator ? [terminator] : [], hasTextProperties(element) ? element.textStyle?.fontSize : undefined);
34649
34669
  return {
34650
34670
  runs,
@@ -43998,6 +44018,27 @@ function fitFontSize(text, maxWidth, maxHeight, baseSize) {
43998
44018
  const maxByHeight = maxHeight * 0.5;
43999
44019
  return Math.max(6, Math.min(baseSize, maxByWidth, maxByHeight));
44000
44020
  }
44021
+ /**
44022
+ * SVG polygon `points` for a chevron / arrow inscribed in the box at (`x`, `y`)
44023
+ * sized `w` x `h`: a notch on the left edge and a tip on the right.
44024
+ *
44025
+ * @param x - Left edge.
44026
+ * @param y - Top edge.
44027
+ * @param w - Box width.
44028
+ * @param h - Box height.
44029
+ * @returns Space-separated `"x,y"` pairs.
44030
+ */
44031
+ function chevronPoints(x, y, w, h) {
44032
+ const depth = Math.min(w * 0.2, h * 0.4);
44033
+ return [
44034
+ `${x},${y}`,
44035
+ `${x + w - depth},${y}`,
44036
+ `${x + w},${y + h / 2}`,
44037
+ `${x + w - depth},${y + h}`,
44038
+ `${x},${y + h}`,
44039
+ `${x + depth},${y + h / 2}`,
44040
+ ].join(' ');
44041
+ }
44001
44042
  /** Outline-stroke colour for a node given its computed stroke width. */
44002
44043
  function strokeFor(sw) {
44003
44044
  return sw > 0 ? 'rgba(255,255,255,0.3)' : 'none';
@@ -46129,6 +46170,40 @@ function computeSmartArtLayout(nodes, box, palette, style, elementId, resolvedLa
46129
46170
  * with the origin at the top-left; the model builder performs the flip.
46130
46171
  */
46131
46172
 
46173
+ /**
46174
+ * Readable-text-colour selection for fills whose text colour was left implicit.
46175
+ *
46176
+ * PowerPoint stores no colour for a great many runs and resolves one at paint
46177
+ * time from what is behind them. Renderers that instead pick a fixed colour get
46178
+ * white text on white panels, so both the 2D and 3D SmartArt paths need the same
46179
+ * decision, made the same way.
46180
+ *
46181
+ * @module color-contrast
46182
+ */
46183
+ /** Parse `#rgb`/`#rrggbb` into `[r, g, b]` (0..255); falls back to mid-grey. */
46184
+ function parseHex(hex) {
46185
+ let h = hex.trim().replace(/^#/u, '');
46186
+ if (h.length === 3) {
46187
+ h = h
46188
+ .split('')
46189
+ .map((c) => c + c)
46190
+ .join('');
46191
+ }
46192
+ if (h.length !== 6 || /[^0-9a-fA-F]/u.test(h)) {
46193
+ return [128, 128, 128];
46194
+ }
46195
+ return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];
46196
+ }
46197
+ /**
46198
+ * Pick a readable text colour (near-black or near-white) for a given fill,
46199
+ * using the WCAG relative-luminance threshold.
46200
+ */
46201
+ function contrastTextColor(fill) {
46202
+ const [r, g, b] = parseHex(fill);
46203
+ const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
46204
+ return lum > 0.6 ? '#1a1a1a' : '#ffffff';
46205
+ }
46206
+
46132
46207
  /**
46133
46208
  * Three.js SmartArt renderer - pure geometry & colour helpers.
46134
46209
  *
@@ -46305,29 +46380,6 @@ function boundsOf(points) {
46305
46380
  height: maxY - minY,
46306
46381
  };
46307
46382
  }
46308
- /** Parse `#rgb`/`#rrggbb` into `[r, g, b]` (0..255); falls back to mid-grey. */
46309
- function parseHex(hex) {
46310
- let h = hex.trim().replace(/^#/u, '');
46311
- if (h.length === 3) {
46312
- h = h
46313
- .split('')
46314
- .map((c) => c + c)
46315
- .join('');
46316
- }
46317
- if (h.length !== 6 || /[^0-9a-fA-F]/u.test(h)) {
46318
- return [128, 128, 128];
46319
- }
46320
- return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];
46321
- }
46322
- /**
46323
- * Pick a readable text colour (near-black or near-white) for a given fill,
46324
- * using the WCAG relative-luminance threshold.
46325
- */
46326
- function contrastTextColor(fill) {
46327
- const [r, g, b] = parseHex(fill);
46328
- const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
46329
- return lum > 0.6 ? '#1a1a1a' : '#ffffff';
46330
- }
46331
46383
 
46332
46384
  /**
46333
46385
  * Three.js SmartArt renderer - spatial (phase 2) layout transforms.
@@ -47153,6 +47205,108 @@ async function mountSurfaceChart3D(container, options) {
47153
47205
  };
47154
47206
  }
47155
47207
 
47208
+ /**
47209
+ * Word wrapping for contexts where the real glyph advances cannot be measured.
47210
+ *
47211
+ * Some render targets have no text-measurement API available at the point the
47212
+ * layout is decided: a PDF content stream being assembled, or SVG labels that
47213
+ * must be laid out before the document is in a document. Both need to break a
47214
+ * string into lines that will roughly fit a width, and both are better served
47215
+ * by one approximation than by two that drift apart.
47216
+ *
47217
+ * This is deliberately not a substitute for measured text. Anything that can
47218
+ * measure (the paragraph renderers, which resolve real advances) must.
47219
+ *
47220
+ * @module text-wrap-estimate
47221
+ */
47222
+ /** Average glyph advance as a fraction of the font size, across mixed-case Latin text. */
47223
+ const AVERAGE_ADVANCE_RATIO = 0.5;
47224
+ /**
47225
+ * Break `text` into lines that approximately fit `maxWidth`.
47226
+ *
47227
+ * Authored line breaks are always honoured. Words are never split or dropped:
47228
+ * a single word longer than the line gets a line of its own and overflows,
47229
+ * which is what PowerPoint does too.
47230
+ *
47231
+ * @param text - The text to wrap.
47232
+ * @param maxWidth - Available width, in the same units as `fontSize`.
47233
+ * @param fontSize - Font size used to estimate glyph advances.
47234
+ * @param options - See {@link EstimatedWrapOptions}.
47235
+ * @returns The wrapped lines, empty when there is nothing to render.
47236
+ */
47237
+ function wrapTextByEstimatedWidth(text, maxWidth, fontSize, options = {}) {
47238
+ if (!text || text.trim().length === 0) {
47239
+ return [];
47240
+ }
47241
+ const charactersPerLine = Math.floor(maxWidth / Math.max(fontSize * AVERAGE_ADVANCE_RATIO, 1));
47242
+ if (charactersPerLine <= 0) {
47243
+ return [];
47244
+ }
47245
+ const lines = [];
47246
+ for (const paragraph of text.split(/\r?\n/u)) {
47247
+ if (paragraph.trim().length === 0) {
47248
+ if (options.keepBlankLines) {
47249
+ lines.push('');
47250
+ }
47251
+ continue;
47252
+ }
47253
+ let current = '';
47254
+ for (const word of paragraph.split(/\s+/u)) {
47255
+ if (current.length === 0) {
47256
+ current = word;
47257
+ }
47258
+ else if (current.length + 1 + word.length <= charactersPerLine) {
47259
+ current += ` ${word}`;
47260
+ }
47261
+ else {
47262
+ lines.push(current);
47263
+ current = word;
47264
+ }
47265
+ }
47266
+ if (current.length > 0) {
47267
+ lines.push(current);
47268
+ }
47269
+ }
47270
+ return lines;
47271
+ }
47272
+
47273
+ /**
47274
+ * Line layout for centred SVG labels (SmartArt nodes and cached shapes).
47275
+ *
47276
+ * SVG has no text box: a `<text>` element does not wrap, and a multi-line label
47277
+ * has to be assembled from `<tspan>`s that the caller positions itself. Every
47278
+ * binding needs the same arithmetic to do that, so it lives here and each
47279
+ * binding is left with nothing but placing one `<tspan>` per line.
47280
+ *
47281
+ * @module svg-text-lines
47282
+ */
47283
+ /** Multiple of the font size used as the line box height, as PowerPoint does. */
47284
+ const LINE_HEIGHT_RATIO = 1.2;
47285
+ /**
47286
+ * Split a label into lines and centre the block vertically.
47287
+ *
47288
+ * @param text - The label text; `\n` breaks are always honoured.
47289
+ * @param fontSize - Font size in the same user units as the result.
47290
+ * @param options - See {@link CenteredSvgTextOptions}.
47291
+ * @returns One entry per line. Empty text yields a single empty line so callers
47292
+ * that always emit a `<tspan>` keep their previous single-line geometry.
47293
+ */
47294
+ function centeredSvgTextLines(text, fontSize, options = {}) {
47295
+ const lines = options.maxWidth !== undefined
47296
+ ? wrapTextByEstimatedWidth(text, options.maxWidth, fontSize)
47297
+ : text.split('\n').filter((line) => line.length > 0);
47298
+ const centerY = options.centerY ?? 0;
47299
+ if (lines.length === 0) {
47300
+ return [{ text: '', y: centerY }];
47301
+ }
47302
+ const lineHeight = fontSize * LINE_HEIGHT_RATIO;
47303
+ const blockTop = centerY - (lines.length * lineHeight) / 2;
47304
+ return lines.map((line, index) => ({
47305
+ text: line,
47306
+ y: blockTop + lineHeight / 2 + index * lineHeight,
47307
+ }));
47308
+ }
47309
+
47156
47310
  /**
47157
47311
  * smartart-drawing.ts: Drawing-shape view-model helpers for the SmartArt
47158
47312
  * renderer, shared across the React, Vue, and Angular bindings.
@@ -47163,8 +47317,8 @@ async function mountSurfaceChart3D(container, options) {
47163
47317
  * independent of the SVG-fallback layout engine (`computeSmartArtLayout` in
47164
47318
  * `smartart-layout`), which only runs when no drawing shapes exist.
47165
47319
  *
47166
- * Pure TypeScript (no framework imports). Style helpers (`truncate`,
47167
- * `styleStroke`, `styleShadow`) are reused from `smartart-layout-helpers`.
47320
+ * Pure TypeScript (no framework imports). Style helpers (`styleStroke`,
47321
+ * `styleShadow`) are reused from `smartart-layout-helpers`.
47168
47322
  */
47169
47323
  /** Built-in named colour palettes (mirrors the Vue/React `PALETTES`). */
47170
47324
  const PALETTES$1 = {
@@ -47216,6 +47370,50 @@ function buildChromeStyle(chrome) {
47216
47370
  }
47217
47371
  return s;
47218
47372
  }
47373
+ /**
47374
+ * Fraction of a shape's width its label may occupy. DiagramML shapes carry the
47375
+ * usual text insets, and wrapping to the full box would let text sit on the
47376
+ * outline.
47377
+ */
47378
+ const TEXT_WIDTH_FRACTION = 0.82;
47379
+ /**
47380
+ * The fill of the nearest shape painted beneath `shape`'s centre.
47381
+ *
47382
+ * SmartArt layouts commonly stack an unfilled shape over a painted one to hold
47383
+ * the label, so what the label has to be readable against is that lower shape,
47384
+ * not the transparency of its own box. Shapes are in paint order, so the search
47385
+ * runs backwards from the label and takes the first painted hit.
47386
+ */
47387
+ function underlyingFill(shape, shapes, index) {
47388
+ const centerX = shape.x + shape.width / 2;
47389
+ const centerY = shape.y + shape.height / 2;
47390
+ for (let below = index - 1; below >= 0; below--) {
47391
+ const candidate = shapes[below];
47392
+ if (!candidate || candidate.fillNone || !candidate.fillColor) {
47393
+ continue;
47394
+ }
47395
+ if (centerX >= candidate.x &&
47396
+ centerX <= candidate.x + candidate.width &&
47397
+ centerY >= candidate.y &&
47398
+ centerY <= candidate.y + candidate.height) {
47399
+ return candidate.fillColor;
47400
+ }
47401
+ }
47402
+ return undefined;
47403
+ }
47404
+ /**
47405
+ * Pick a label colour for a cached shape whose runs declare none.
47406
+ *
47407
+ * PowerPoint leaves the colour implicit far more often than not, and resolves it
47408
+ * against the shape's own fill. Defaulting to white instead makes every label on
47409
+ * a light content panel invisible.
47410
+ */
47411
+ function drawingShapeLabelColor(shape, shapes, index, resolvedFill) {
47412
+ const basis = resolvedFill === 'none' || resolvedFill.startsWith('url(')
47413
+ ? underlyingFill(shape, shapes, index)
47414
+ : resolvedFill;
47415
+ return basis ? contrastTextColor(basis) : '#1a1a1a';
47416
+ }
47219
47417
  /** Compute the SVG viewBox that fits all drawing shapes, rebasing to (0, 0). */
47220
47418
  function computeDrawingViewBox(shapes) {
47221
47419
  let minX = Infinity;
@@ -47246,6 +47444,53 @@ function computeDrawingViewBox(shapes) {
47246
47444
  height: maxY - minY || 1,
47247
47445
  };
47248
47446
  }
47447
+ /**
47448
+ * Build the SVG gradient for a cached shape's `a:gradFill`, or `undefined` when
47449
+ * it has none.
47450
+ *
47451
+ * The OOXML angle is clockwise from +x with y pointing down, which is also the
47452
+ * SVG convention, so sin/cos map straight onto the axis endpoints.
47453
+ */
47454
+ function resolveGradient(shape, id) {
47455
+ const stops = shape.fillGradientStops;
47456
+ if (!stops || stops.length === 0) {
47457
+ return undefined;
47458
+ }
47459
+ const mapped = stops.map((stop) => ({
47460
+ offset: `${Math.max(0, Math.min(100, stop.position))}%`,
47461
+ color: stop.color,
47462
+ ...(stop.opacity !== undefined ? { opacity: stop.opacity } : {}),
47463
+ }));
47464
+ if (shape.fillGradientType === 'radial') {
47465
+ return { id, kind: 'radial', cx: '50%', cy: '50%', r: '50%', stops: mapped };
47466
+ }
47467
+ const radians = ((shape.fillGradientAngle ?? 0) * Math.PI) / 180;
47468
+ const dx = Math.cos(radians) / 2;
47469
+ const dy = Math.sin(radians) / 2;
47470
+ return {
47471
+ id,
47472
+ kind: 'linear',
47473
+ x1: `${(0.5 - dx) * 100}%`,
47474
+ y1: `${(0.5 - dy) * 100}%`,
47475
+ x2: `${(0.5 + dx) * 100}%`,
47476
+ y2: `${(0.5 + dy) * 100}%`,
47477
+ stops: mapped,
47478
+ };
47479
+ }
47480
+ /** Which primitive paints this shape's body, from its preset type. */
47481
+ function resolveShapeKind(shape, hasImage) {
47482
+ if (hasImage) {
47483
+ return 'image';
47484
+ }
47485
+ // `getShapeType` folds the aliases it knows (oval -> ellipse, can -> cylinder)
47486
+ // but has no vocabulary for the arrow presets SmartArt process layouts use, so
47487
+ // those are matched on the normalised raw type.
47488
+ const normalized = (shape.shapeType ?? '').trim().toLowerCase();
47489
+ if (normalized === 'chevron' || normalized === 'homeplate') {
47490
+ return 'polygon';
47491
+ }
47492
+ return getShapeType(shape.shapeType) === 'ellipse' ? 'ellipse' : 'rect';
47493
+ }
47249
47494
  /**
47250
47495
  * Project raw `PptxSmartArtDrawingShape`s into `RenderedShape` view-models,
47251
47496
  * rebasing positions relative to the viewBox origin.
@@ -47254,18 +47499,32 @@ function projectDrawingShapes(elementId, shapes, viewBox, palette, style) {
47254
47499
  const { minX, minY } = viewBox;
47255
47500
  const sw = styleStroke(style);
47256
47501
  return shapes.map((shape, i) => {
47257
- const fill = shape.fillColor ?? paletteColour(i, palette);
47502
+ const gradient = shape.fillNone
47503
+ ? undefined
47504
+ : resolveGradient(shape, `${elementId}-dspgrad-${shape.id}-${i}`);
47505
+ // Precedence: authored transparency, then gradient, then a pattern's
47506
+ // foreground (the closest flat stand-in for one), then solid, then palette.
47507
+ const fill = shape.fillNone
47508
+ ? 'none'
47509
+ : gradient
47510
+ ? `url(#${gradient.id})`
47511
+ : (shape.fillPatternForegroundColor ?? shape.fillColor ?? paletteColour(i, palette));
47258
47512
  const relX = shape.x - minX;
47259
47513
  const relY = shape.y - minY;
47260
- const isEllipse = shape.shapeType === 'ellipse';
47261
- const rx = shape.shapeType === 'roundRect' ? Math.min(shape.width, shape.height) * 0.1 : 0;
47514
+ const kind = resolveShapeKind(shape, Boolean(shape.fillImageUrl));
47515
+ const rx = getShapeType(shape.shapeType) === 'roundRect' ? Math.min(shape.width, shape.height) * 0.1 : 0;
47262
47516
  const cx = relX + shape.width / 2;
47263
47517
  const cy = relY + shape.height / 2;
47264
47518
  const stroke = shape.strokeColor ?? (sw > 0 ? 'rgba(255,255,255,0.3)' : 'none');
47265
47519
  const transform = shape.rotation !== undefined ? `rotate(${shape.rotation} ${cx} ${cy})` : undefined;
47520
+ const fontSize = shape.fontSize ?? Math.max(8, Math.min(14, shape.height * 0.2));
47266
47521
  return {
47267
47522
  key: `${elementId}-dsp-${shape.id}-${i}`,
47268
- isEllipse,
47523
+ kind,
47524
+ ...(kind === 'polygon'
47525
+ ? { points: chevronPoints(relX, relY, shape.width, shape.height) }
47526
+ : {}),
47527
+ ...(gradient ? { gradient } : {}),
47269
47528
  x: relX,
47270
47529
  y: relY,
47271
47530
  width: shape.width,
@@ -47277,11 +47536,17 @@ function projectDrawingShapes(elementId, shapes, viewBox, palette, style) {
47277
47536
  stroke,
47278
47537
  strokeWidth: shape.strokeWidth ?? sw,
47279
47538
  transform,
47280
- text: shape.text ? truncate(shape.text, 30) : undefined,
47539
+ imageUrl: shape.fillImageUrl,
47540
+ textLines: shape.text
47541
+ ? centeredSvgTextLines(shape.text, fontSize, {
47542
+ maxWidth: shape.width * TEXT_WIDTH_FRACTION,
47543
+ centerY: cy,
47544
+ })
47545
+ : [],
47281
47546
  textX: cx,
47282
47547
  textY: cy,
47283
- fontColor: shape.fontColor ?? 'white',
47284
- fontSize: shape.fontSize ?? Math.max(8, Math.min(14, shape.height * 0.2)),
47548
+ fontColor: shape.fontColor ?? drawingShapeLabelColor(shape, shapes, i, fill),
47549
+ fontSize,
47285
47550
  };
47286
47551
  });
47287
47552
  }
@@ -55280,7 +55545,7 @@ function strokeToInkElement(opts) {
55280
55545
  * lightweight processing. This is sufficient for pressure-width
55281
55546
  * rendering where each extracted point gets a circle overlay.
55282
55547
  */
55283
- function extractPathPoints$1(d) {
55548
+ function extractPathPoints(d) {
55284
55549
  const points = [];
55285
55550
  // Match all numeric pairs following SVG path commands
55286
55551
  const numberRegex = /-?\d+(?:\.\d+)?(?:e[+-]?\d+)?/giu;
@@ -55300,7 +55565,7 @@ function extractPathPoints$1(d) {
55300
55565
  * Given an array of width samples, linearly interpolate the width
55301
55566
  * at `t` where `t` is the normalised position along the path (0 to 1).
55302
55567
  */
55303
- function interpolateWidth$1(widths, t) {
55568
+ function interpolateWidth(widths, t) {
55304
55569
  if (widths.length === 0) {
55305
55570
  return 1;
55306
55571
  }
@@ -55322,7 +55587,7 @@ function interpolateWidth$1(widths, t) {
55322
55587
  * interpolated width at that position. When `widths` contains fewer
55323
55588
  * entries than `points`, values are interpolated linearly.
55324
55589
  */
55325
- function generatePressureCircles$1(points, widths, config) {
55590
+ function generatePressureCircles(points, widths, config) {
55326
55591
  if (points.length === 0) {
55327
55592
  return [];
55328
55593
  }
@@ -55330,7 +55595,7 @@ function generatePressureCircles$1(points, widths, config) {
55330
55595
  const maxR = config.maxRadius ?? config.baseWidth;
55331
55596
  return points.map((pt, i) => {
55332
55597
  const t = points.length === 1 ? 0.5 : i / (points.length - 1);
55333
- const w = interpolateWidth$1(widths, t);
55598
+ const w = interpolateWidth(widths, t);
55334
55599
  // Scale radius based on the ratio of the interpolated width to
55335
55600
  // the base width, clamped between minR and maxR.
55336
55601
  const ratio = config.baseWidth > 0 ? w / config.baseWidth : 1;
@@ -55342,7 +55607,7 @@ function generatePressureCircles$1(points, widths, config) {
55342
55607
  * Determine whether an ink element has meaningful pressure data that
55343
55608
  * differs from uniform width (i.e., the widths array has variation).
55344
55609
  */
55345
- function hasPressureVariation$1(widths) {
55610
+ function hasPressureVariation(widths) {
55346
55611
  if (widths.length <= 1) {
55347
55612
  return false;
55348
55613
  }
@@ -55362,7 +55627,7 @@ function hasPressureVariation$1(widths) {
55362
55627
  * @param minScale - Width multiplier at zero pressure (default 0.3).
55363
55628
  * @param maxScale - Width multiplier at full pressure (default 1.8).
55364
55629
  */
55365
- function pressuresToWidths$1(pressures, baseWidth, minScale = 0.3, maxScale = 1.8) {
55630
+ function pressuresToWidths(pressures, baseWidth, minScale = 0.3, maxScale = 1.8) {
55366
55631
  return pressures.map((p) => {
55367
55632
  const clamped = Math.max(0, Math.min(1, p));
55368
55633
  return baseWidth * (minScale + clamped * (maxScale - minScale));
@@ -55432,7 +55697,7 @@ function getInkStrokeReplayStyle(strokeIndex, pathLength, config = {}) {
55432
55697
  */
55433
55698
  function getInkReplayStyles(el, config = {}) {
55434
55699
  return el.inkPaths.map((d, i) => {
55435
- const points = extractPathPoints$1(d);
55700
+ const points = extractPathPoints(d);
55436
55701
  const pathLen = estimatePathLength(points);
55437
55702
  return getInkStrokeReplayStyle(i, pathLen, config);
55438
55703
  });
@@ -55442,7 +55707,7 @@ function getInkReplayStyles(el, config = {}) {
55442
55707
  */
55443
55708
  function getContentPartReplayStyles(strokes, config = {}) {
55444
55709
  return strokes.map((stroke, i) => {
55445
- const points = extractPathPoints$1(stroke.path);
55710
+ const points = extractPathPoints(stroke.path);
55446
55711
  const pathLen = estimatePathLength(points);
55447
55712
  return getInkStrokeReplayStyle(i, pathLen, config);
55448
55713
  });
@@ -58734,7 +58999,7 @@ async function scanAvailableFontFamilies(families, source = browserFontSource())
58734
58999
  }
58735
59000
 
58736
59001
  /** Score a presentation password from 0 (very weak) to 4 (very strong). */
58737
- function getPasswordStrength$1(password) {
59002
+ function getPasswordStrength(password) {
58738
59003
  if (!password) {
58739
59004
  return 0;
58740
59005
  }
@@ -61165,45 +61430,11 @@ function calculateNotesPageLayout(slideWidth, slideHeight) {
61165
61430
  /**
61166
61431
  * Wrap a text string into lines that fit within a given width at a given font
61167
61432
  * size, using approximate Helvetica character widths (acceptable for plain
61168
- * speaker notes).
61433
+ * speaker notes). Blank authored paragraphs keep their vertical gap so the
61434
+ * printed notes match how the author spaced them.
61169
61435
  */
61170
61436
  function wrapNotesText(text, maxWidth, fontSize) {
61171
- if (!text || text.trim().length === 0) {
61172
- return [];
61173
- }
61174
- // Approximate average character width as 0.5 x fontSize for Helvetica
61175
- const avgCharWidth = fontSize * 0.5;
61176
- const maxCharsPerLine = Math.floor(maxWidth / avgCharWidth);
61177
- if (maxCharsPerLine <= 0) {
61178
- return [];
61179
- }
61180
- const lines = [];
61181
- // Split on explicit newlines first
61182
- const paragraphs = text.split(/\r?\n/u);
61183
- for (const paragraph of paragraphs) {
61184
- if (paragraph.trim().length === 0) {
61185
- lines.push('');
61186
- continue;
61187
- }
61188
- const words = paragraph.split(/\s+/u);
61189
- let currentLine = '';
61190
- for (const word of words) {
61191
- if (currentLine.length === 0) {
61192
- currentLine = word;
61193
- }
61194
- else if (currentLine.length + 1 + word.length <= maxCharsPerLine) {
61195
- currentLine += ` ${word}`;
61196
- }
61197
- else {
61198
- lines.push(currentLine);
61199
- currentLine = word;
61200
- }
61201
- }
61202
- if (currentLine.length > 0) {
61203
- lines.push(currentLine);
61204
- }
61205
- }
61206
- return lines;
61437
+ return wrapTextByEstimatedWidth(text, maxWidth, fontSize, { keepBlankLines: true });
61207
61438
  }
61208
61439
  /**
61209
61440
  * Calculate the maximum number of notes text lines that fit on a continuation
@@ -65038,7 +65269,7 @@ function createLocalStorageBackend(namespace) {
65038
65269
  /** Try IndexedDB first; fall back to localStorage on any failure. */
65039
65270
  async function resolveBackend(dbName, namespace) {
65040
65271
  try {
65041
- const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-Cd3hp9jX.mjs');
65272
+ const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-Das59RiS.mjs');
65042
65273
  const db = await openChatDb(dbName);
65043
65274
  return createIdbBackend(db);
65044
65275
  }
@@ -67845,6 +68076,38 @@ function partitionSlides(slides) {
67845
68076
  });
67846
68077
  return { slides: next, templateElementsBySlideId };
67847
68078
  }
68079
+ /**
68080
+ * Fold a slide that core has re-mapped onto a new layout back into the editor's
68081
+ * two stores.
68082
+ *
68083
+ * `applyLayoutToSlide` returns the slide with the TARGET layout's inherited
68084
+ * artwork merged in, because that is how core delivers every slide. This editor
68085
+ * keeps that artwork in its own store, so the result has to be partitioned again
68086
+ * on the way in: the deck takes the slide's own elements, and the store's entry
68087
+ * for that slide is REPLACED (not merged) so the previous layout's decoration
68088
+ * stops being painted.
68089
+ *
68090
+ * @param slides - The current template-free deck.
68091
+ * @param index - Index of the slide that was re-mapped.
68092
+ * @param remapped - The slide as core returned it.
68093
+ * @param templateElementsBySlideId - The current template store.
68094
+ * @returns The updated deck and store, or `null` when `index` is out of range.
68095
+ */
68096
+ function slidesWithReappliedLayout(slides, index, remapped, templateElementsBySlideId) {
68097
+ if (index < 0 || index >= slides.length) {
68098
+ return null;
68099
+ }
68100
+ const partitioned = partitionSlides([remapped]);
68101
+ const nextSlides = [...slides];
68102
+ nextSlides[index] = partitioned.slides[0];
68103
+ return {
68104
+ slides: nextSlides,
68105
+ templateElementsBySlideId: {
68106
+ ...templateElementsBySlideId,
68107
+ [remapped.id]: partitioned.templateElementsBySlideId[remapped.id] ?? [],
68108
+ },
68109
+ };
68110
+ }
67848
68111
  /**
67849
68112
  * Re-merge the separated template store back into the deck for serialization.
67850
68113
  *
@@ -69806,6 +70069,40 @@ class EditorStateService {
69806
70069
  this.dirty.set(true);
69807
70070
  this.syncHistory();
69808
70071
  }
70072
+ /**
70073
+ * Re-map the slide at `index` onto `layoutPath`, keeping its content.
70074
+ *
70075
+ * Core moves the slide's placeholders onto the target layout's geometry and
70076
+ * rewrites the layout relationship, so this replaces one slide rather than
70077
+ * adding one. Does nothing without a loaded deck, since the operation reads
70078
+ * the target layout out of the package.
70079
+ *
70080
+ * @param index - Index of the slide to re-map.
70081
+ * @param layoutPath - Package path of the target layout.
70082
+ */
70083
+ async applyLayout(index, layoutPath) {
70084
+ const handler = this.loader?.getHandler();
70085
+ const slides = this.slides();
70086
+ const target = slides[index];
70087
+ if (!handler || !target) {
70088
+ return;
70089
+ }
70090
+ const updated = await handler
70091
+ .applyLayoutToSlide(index, layoutPath, [...slides])
70092
+ .catch(() => null);
70093
+ if (!updated || this.slides()[index]?.id !== target.id) {
70094
+ return;
70095
+ }
70096
+ const folded = slidesWithReappliedLayout(this.slides(), index, updated, this.templateElementsBySlideId());
70097
+ if (!folded) {
70098
+ return;
70099
+ }
70100
+ this.history.record(this.captureSnapshot(), this.t('pptx.master.layout'));
70101
+ this.slides.set(folded.slides);
70102
+ this.templateElementsBySlideId.set(folded.templateElementsBySlideId);
70103
+ this.dirty.set(true);
70104
+ this.syncHistory();
70105
+ }
69809
70106
  /**
69810
70107
  * Insert a pre-designed template slide after `afterIndex` (records history).
69811
70108
  *
@@ -72443,24 +72740,6 @@ function narrowToPolygon(node) {
72443
72740
  function narrowToRect(node) {
72444
72741
  return node.kind === 'rect' ? node : undefined;
72445
72742
  }
72446
- /**
72447
- * Split node text on newlines and compute per-line y offsets (in SVG px)
72448
- * that centre the block around the node centre y (offset 0). Single-line
72449
- * text produces one entry with offsetY=0, preserving the existing
72450
- * dominant-baseline="central" behaviour exactly.
72451
- */
72452
- function computeTextLines(text, fontSize) {
72453
- const raw = (text ?? '').split('\n').filter((l) => l.length > 0);
72454
- if (raw.length === 0) {
72455
- return [{ text: '', offsetY: 0 }];
72456
- }
72457
- const lh = fontSize * 1.2;
72458
- const totalH = raw.length * lh;
72459
- return raw.map((line, i) => ({
72460
- text: line,
72461
- offsetY: -totalH / 2 + lh / 2 + i * lh,
72462
- }));
72463
- }
72464
72743
 
72465
72744
  /**
72466
72745
  * SmartArtRendererComponent: Angular SmartArt renderer.
@@ -72686,7 +72965,7 @@ class SmartArtRendererComponent {
72686
72965
  asCircle = narrowToCircle;
72687
72966
  asPolygon = narrowToPolygon;
72688
72967
  asRect = narrowToRect;
72689
- textLines = computeTextLines;
72968
+ textLines = centeredSvgTextLines;
72690
72969
  // ── Inline node-text editing ───────────────────────────────────────────
72691
72970
  /** Double-click a node enters inline edit mode (when editable). */
72692
72971
  onNodeDblClick(event, node) {
@@ -72879,11 +73158,11 @@ class SmartArtRendererComponent {
72879
73158
  isEmpty = computed(() => this.nodes().length === 0 && !this.hasDrawingShapes(), /* @ts-ignore */
72880
73159
  ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
72881
73160
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: SmartArtRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
72882
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.0", type: SmartArtRendererComponent, isStandalone: true, selector: "pptx-smart-art-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, animationState: { classPropertyName: "animationState", publicName: "animationState", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "nodeEditor", first: true, predicate: ["nodeEditor"], descendants: true, isSignal: true }, { propertyName: "smartartContainer", first: true, predicate: ["smartartContainer"], descendants: true, isSignal: true }, { propertyName: "styleBar", first: true, predicate: ["styleBar"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n\t#smartartContainer\n\tclass=\"pptx-ng-smartart-chrome\"\n\t[ngStyle]=\"chromeStyle()\"\n\t[attr.role]=\"a11y() ? a11y()!.role : null\"\n\t[attr.aria-label]=\"a11y()?.label ?? null\"\n\t(mousemove)=\"onMouseMove($event)\"\n\t(mouseleave)=\"onMouseLeave()\"\n>\n\t@if (isEmpty()) {\n\t\t<div class=\"pptx-ng-smartart-placeholder\">\n\t\t\t{{ 'pptx.smartArt.placeholder' | translate }}\n\t\t</div>\n\t} @else if (hasDrawingShapes()) {\n\t\t<svg\n\t\t\tclass=\"pptx-ng-smartart-svg\"\n\t\t\tdata-testid=\"smartart-drawing-shapes\"\n\t\t\t[attr.viewBox]=\"svgViewBox()\"\n\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t>\n\t\t\t@for (shape of renderedShapes(); track shape.key; let i = $index) {\n\t\t\t\t<g\n\t\t\t\t\t[ngStyle]=\"shadowFilter() ? { filter: shadowFilter() } : {}\"\n\t\t\t\t\t[attr.data-smartart-node-id]=\"drawingShapeNodeIds()[i] ?? null\"\n\t\t\t\t\t[class.pptx-ng-smartart-node--editable]=\"canEditNodes() && !!drawingShapeNodeIds()[i]\"\n\t\t\t\t>\n\t\t\t\t\t@if (shape.isEllipse) {\n\t\t\t\t\t\t<ellipse\n\t\t\t\t\t\t\t[attr.cx]=\"shape.cx\"\n\t\t\t\t\t\t\t[attr.cy]=\"shape.cy\"\n\t\t\t\t\t\t\t[attr.rx]=\"shape.width / 2\"\n\t\t\t\t\t\t\t[attr.ry]=\"shape.height / 2\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t[attr.x]=\"shape.x\"\n\t\t\t\t\t\t\t[attr.y]=\"shape.y\"\n\t\t\t\t\t\t\t[attr.width]=\"shape.width\"\n\t\t\t\t\t\t\t[attr.height]=\"shape.height\"\n\t\t\t\t\t\t\t[attr.rx]=\"shape.rx\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\t@if (shape.text) {\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"shape.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fontColor\"\n\t\t\t\t\t\t\t[attr.font-size]=\"shape.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(shape.text, shape.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"shape.textX\" [attr.y]=\"shape.textY + line.offsetY\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</g>\n\t\t\t}\n\t\t</svg>\n\t} @else if (hasLayout()) {\n\t\t<svg\n\t\t\tclass=\"pptx-ng-smartart-svg\"\n\t\t\t[attr.data-testid]=\"'smartart-' + layout().family\"\n\t\t\t[attr.viewBox]=\"layout().viewBox\"\n\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t[attr.data-layout-family]=\"layout().family\"\n\t\t>\n\t\t\t@for (conn of layout().connectors; track conn.key) {\n\t\t\t\t<path [attr.d]=\"conn.d\" fill=\"none\" stroke=\"#94a3b8\" stroke-width=\"1.5\" opacity=\"0.5\" />\n\t\t\t}\n\t\t\t@for (node of layout().nodes; track node.key) {\n\t\t\t\t<g\n\t\t\t\t\t[ngStyle]=\"shadowFilter() ? { filter: shadowFilter() } : {}\"\n\t\t\t\t\t[class.pptx-ng-smartart-node--editable]=\"canEditNodes()\"\n\t\t\t\t\t[attr.tabindex]=\"canEditNodes() ? 0 : null\"\n\t\t\t\t\t[attr.role]=\"canEditNodes() ? 'button' : 'img'\"\n\t\t\t\t\t[attr.aria-label]=\"nodeAriaLabel(node) ?? node.text\"\n\t\t\t\t\t[attr.data-smartart-node-id]=\"nodeKeyId(node)\"\n\t\t\t\t\t(dblclick)=\"onNodeDblClick($event, node)\"\n\t\t\t\t\t(keydown)=\"onNodeKeydown($event, node)\"\n\t\t\t\t>\n\t\t\t\t\t@if (nodeAriaLabel(node); as title) {\n\t\t\t\t\t\t<title>{{ title }}</title>\n\t\t\t\t\t}\n\t\t\t\t\t@if (asCircle(node); as c) {\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t[attr.cx]=\"c.cx\"\n\t\t\t\t\t\t\t[attr.cy]=\"c.cy\"\n\t\t\t\t\t\t\t[attr.r]=\"c.r\"\n\t\t\t\t\t\t\t[attr.fill]=\"c.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"c.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"c.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"c.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"c.cx\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"c.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(c.text, c.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"c.cx\" [attr.y]=\"c.cy + line.offsetY\">{{ line.text }}</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t} @else if (asPolygon(node); as p) {\n\t\t\t\t\t\t<polygon\n\t\t\t\t\t\t\t[attr.points]=\"p.points\"\n\t\t\t\t\t\t\t[attr.fill]=\"p.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"p.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"p.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"p.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"p.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"p.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(p.text, p.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"p.textX\" [attr.y]=\"p.textY + line.offsetY\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t} @else if (asRect(node); as r) {\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t[attr.x]=\"r.x\"\n\t\t\t\t\t\t\t[attr.y]=\"r.y\"\n\t\t\t\t\t\t\t[attr.width]=\"r.width\"\n\t\t\t\t\t\t\t[attr.height]=\"r.height\"\n\t\t\t\t\t\t\t[attr.rx]=\"r.rx\"\n\t\t\t\t\t\t\t[attr.fill]=\"r.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"r.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"r.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"r.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"r.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"r.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(r.text, r.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"r.textX\" [attr.y]=\"r.textY + line.offsetY\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</g>\n\t\t\t}\n\t\t</svg>\n\t} @else {\n\t\t<div class=\"pptx-ng-smartart-placeholder\">\n\t\t\t{{ 'pptx.smartArt.placeholder' | translate }}\n\t\t</div>\n\t}\n\n\t@if (canEditNodes() && hoveredNodeId() && !editState() && styleBarStyle()) {\n\t\t<div\n\t\t\t#styleBar\n\t\t\tclass=\"pptx-ng-smartart-style-bar\"\n\t\t\t[ngStyle]=\"styleBarStyle()!\"\n\t\t\t(mousedown)=\"$event.stopPropagation()\"\n\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t>\n\t\t\t@for (color of palette().slice(0, 6); track color) {\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-smartart-swatch\"\n\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t[attr.aria-label]=\"'pptx.smartArt.setFill' | translate: { color: color }\"\n\t\t\t\t\t[style.background]=\"color\"\n\t\t\t\t\t(click)=\"handleChangeNodeStyle(hoveredNodeId()!, color)\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t</div>\n\t}\n\n\t<!--\n\t\tInline node-text editor. Positioned in element-local px (== viewBox\n\t\tunits, since the SVG viewBox matches the element pixel size and the\n\t\tsvg fills the chrome) over the double-clicked node. Commits via the\n\t\tshared EditorStateService.updateElement path on Enter / blur.\n\t-->\n\t@if (editState(); as edit) {\n\t\t<textarea\n\t\t\t#nodeEditor\n\t\t\tclass=\"pptx-ng-smartart-node-editor\"\n\t\t\t[style.left.px]=\"edit.box.x\"\n\t\t\t[style.top.px]=\"edit.box.y\"\n\t\t\t[style.width.px]=\"edit.box.width\"\n\t\t\t[style.height.px]=\"edit.box.height\"\n\t\t\t[value]=\"edit.text\"\n\t\t\t(pointerdown)=\"$event.stopPropagation()\"\n\t\t\t(mousedown)=\"$event.stopPropagation()\"\n\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t(dblclick)=\"$event.stopPropagation()\"\n\t\t\t(blur)=\"commitEdit($event)\"\n\t\t\t(keydown)=\"onEditorKeydown($event)\"\n\t\t></textarea>\n\t}\n\n\t<!-- Polite live region: announces node-text edit commits to AT. -->\n\t<span class=\"pptx-ng-sr-only\" aria-live=\"polite\" role=\"status\">{{ liveMessage() }}</span>\n</div>\n", styles: [".pptx-ng-smartart-chrome{box-sizing:border-box;overflow:hidden;position:relative}.pptx-ng-smartart-svg{width:100%;height:100%;pointer-events:none}.pptx-ng-smartart-node--editable{pointer-events:auto;cursor:text}.pptx-ng-smartart-node--editable:hover{filter:drop-shadow(0 0 2px rgba(96,165,250,.8))}.pptx-ng-smartart-node-editor{position:absolute;box-sizing:border-box;margin:0;padding:1px 2px;border:1px solid var(--pptx-inspector-active, #0078d4);border-radius:2px;background:#fff;color:#111;font-size:11px;line-height:1.1;text-align:center;resize:none;overflow:hidden;z-index:2}.pptx-ng-smartart-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:11px;color:#fffc;pointer-events:none}.pptx-ng-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pptx-ng-smartart-style-bar{position:absolute;pointer-events:auto;display:flex;gap:6px;padding:6px 8px;background:#ffffffe6;border:1px solid var(--border, #e2e8f0);border-radius:9999px;box-shadow:0 1px 2px #0000001a}.pptx-ng-smartart-swatch{width:20px;height:20px;border-radius:50%;border:1px solid rgba(0,0,0,.1);cursor:pointer;transition:transform .1s}.pptx-ng-smartart-swatch:hover{transform:scale(1.25)}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
73161
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.0", type: SmartArtRendererComponent, isStandalone: true, selector: "pptx-smart-art-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, animationState: { classPropertyName: "animationState", publicName: "animationState", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "nodeEditor", first: true, predicate: ["nodeEditor"], descendants: true, isSignal: true }, { propertyName: "smartartContainer", first: true, predicate: ["smartartContainer"], descendants: true, isSignal: true }, { propertyName: "styleBar", first: true, predicate: ["styleBar"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n\t#smartartContainer\n\tclass=\"pptx-ng-smartart-chrome\"\n\t[ngStyle]=\"chromeStyle()\"\n\t[attr.role]=\"a11y() ? a11y()!.role : null\"\n\t[attr.aria-label]=\"a11y()?.label ?? null\"\n\t(mousemove)=\"onMouseMove($event)\"\n\t(mouseleave)=\"onMouseLeave()\"\n>\n\t@if (isEmpty()) {\n\t\t<div class=\"pptx-ng-smartart-placeholder\">\n\t\t\t{{ 'pptx.smartArt.placeholder' | translate }}\n\t\t</div>\n\t} @else if (hasDrawingShapes()) {\n\t\t<svg\n\t\t\tclass=\"pptx-ng-smartart-svg\"\n\t\t\tdata-testid=\"smartart-drawing-shapes\"\n\t\t\t[attr.viewBox]=\"svgViewBox()\"\n\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t>\n\t\t\t@for (shape of renderedShapes(); track shape.key; let i = $index) {\n\t\t\t\t<g\n\t\t\t\t\t[ngStyle]=\"shadowFilter() ? { filter: shadowFilter() } : {}\"\n\t\t\t\t\t[attr.data-smartart-node-id]=\"drawingShapeNodeIds()[i] ?? null\"\n\t\t\t\t\t[class.pptx-ng-smartart-node--editable]=\"canEditNodes() && !!drawingShapeNodeIds()[i]\"\n\t\t\t\t>\n\t\t\t\t\t@if (shape.gradient) {\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t@if (shape.gradient!.kind === 'radial') {\n\t\t\t\t\t\t\t\t<radialGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"shape.gradient!.id\"\n\t\t\t\t\t\t\t\t\t[attr.cx]=\"shape.gradient!.cx\"\n\t\t\t\t\t\t\t\t\t[attr.cy]=\"shape.gradient!.cy\"\n\t\t\t\t\t\t\t\t\t[attr.r]=\"shape.gradient!.r\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of shape.gradient!.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity ?? null\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"shape.gradient!.id\"\n\t\t\t\t\t\t\t\t\t[attr.x1]=\"shape.gradient!.x1\"\n\t\t\t\t\t\t\t\t\t[attr.y1]=\"shape.gradient!.y1\"\n\t\t\t\t\t\t\t\t\t[attr.x2]=\"shape.gradient!.x2\"\n\t\t\t\t\t\t\t\t\t[attr.y2]=\"shape.gradient!.y2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of shape.gradient!.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity ?? null\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t}\n\t\t\t\t\t@if (shape.kind === 'image') {\n\t\t\t\t\t\t<image\n\t\t\t\t\t\t\t[attr.x]=\"shape.x\"\n\t\t\t\t\t\t\t[attr.y]=\"shape.y\"\n\t\t\t\t\t\t\t[attr.width]=\"shape.width\"\n\t\t\t\t\t\t\t[attr.height]=\"shape.height\"\n\t\t\t\t\t\t\t[attr.href]=\"shape.imageUrl\"\n\t\t\t\t\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else if (shape.kind === 'ellipse') {\n\t\t\t\t\t\t<ellipse\n\t\t\t\t\t\t\t[attr.cx]=\"shape.cx\"\n\t\t\t\t\t\t\t[attr.cy]=\"shape.cy\"\n\t\t\t\t\t\t\t[attr.rx]=\"shape.width / 2\"\n\t\t\t\t\t\t\t[attr.ry]=\"shape.height / 2\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else if (shape.kind === 'polygon') {\n\t\t\t\t\t\t<polygon\n\t\t\t\t\t\t\t[attr.points]=\"shape.points\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t[attr.x]=\"shape.x\"\n\t\t\t\t\t\t\t[attr.y]=\"shape.y\"\n\t\t\t\t\t\t\t[attr.width]=\"shape.width\"\n\t\t\t\t\t\t\t[attr.height]=\"shape.height\"\n\t\t\t\t\t\t\t[attr.rx]=\"shape.rx\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\t@if (shape.textLines.length > 0) {\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"shape.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fontColor\"\n\t\t\t\t\t\t\t[attr.font-size]=\"shape.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of shape.textLines; track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"shape.textX\" [attr.y]=\"line.y\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</g>\n\t\t\t}\n\t\t</svg>\n\t} @else if (hasLayout()) {\n\t\t<svg\n\t\t\tclass=\"pptx-ng-smartart-svg\"\n\t\t\t[attr.data-testid]=\"'smartart-' + layout().family\"\n\t\t\t[attr.viewBox]=\"layout().viewBox\"\n\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t[attr.data-layout-family]=\"layout().family\"\n\t\t>\n\t\t\t@for (conn of layout().connectors; track conn.key) {\n\t\t\t\t<path [attr.d]=\"conn.d\" fill=\"none\" stroke=\"#94a3b8\" stroke-width=\"1.5\" opacity=\"0.5\" />\n\t\t\t}\n\t\t\t@for (node of layout().nodes; track node.key) {\n\t\t\t\t<g\n\t\t\t\t\t[ngStyle]=\"shadowFilter() ? { filter: shadowFilter() } : {}\"\n\t\t\t\t\t[class.pptx-ng-smartart-node--editable]=\"canEditNodes()\"\n\t\t\t\t\t[attr.tabindex]=\"canEditNodes() ? 0 : null\"\n\t\t\t\t\t[attr.role]=\"canEditNodes() ? 'button' : 'img'\"\n\t\t\t\t\t[attr.aria-label]=\"nodeAriaLabel(node) ?? node.text\"\n\t\t\t\t\t[attr.data-smartart-node-id]=\"nodeKeyId(node)\"\n\t\t\t\t\t(dblclick)=\"onNodeDblClick($event, node)\"\n\t\t\t\t\t(keydown)=\"onNodeKeydown($event, node)\"\n\t\t\t\t>\n\t\t\t\t\t@if (nodeAriaLabel(node); as title) {\n\t\t\t\t\t\t<title>{{ title }}</title>\n\t\t\t\t\t}\n\t\t\t\t\t@if (asCircle(node); as c) {\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t[attr.cx]=\"c.cx\"\n\t\t\t\t\t\t\t[attr.cy]=\"c.cy\"\n\t\t\t\t\t\t\t[attr.r]=\"c.r\"\n\t\t\t\t\t\t\t[attr.fill]=\"c.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"c.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"c.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"c.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"c.cx\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"c.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(c.text, c.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"c.cx\" [attr.y]=\"c.cy + line.y\">{{ line.text }}</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t} @else if (asPolygon(node); as p) {\n\t\t\t\t\t\t<polygon\n\t\t\t\t\t\t\t[attr.points]=\"p.points\"\n\t\t\t\t\t\t\t[attr.fill]=\"p.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"p.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"p.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"p.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"p.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"p.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(p.text, p.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"p.textX\" [attr.y]=\"p.textY + line.y\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t} @else if (asRect(node); as r) {\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t[attr.x]=\"r.x\"\n\t\t\t\t\t\t\t[attr.y]=\"r.y\"\n\t\t\t\t\t\t\t[attr.width]=\"r.width\"\n\t\t\t\t\t\t\t[attr.height]=\"r.height\"\n\t\t\t\t\t\t\t[attr.rx]=\"r.rx\"\n\t\t\t\t\t\t\t[attr.fill]=\"r.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"r.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"r.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"r.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"r.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"r.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(r.text, r.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"r.textX\" [attr.y]=\"r.textY + line.y\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</g>\n\t\t\t}\n\t\t</svg>\n\t} @else {\n\t\t<div class=\"pptx-ng-smartart-placeholder\">\n\t\t\t{{ 'pptx.smartArt.placeholder' | translate }}\n\t\t</div>\n\t}\n\n\t@if (canEditNodes() && hoveredNodeId() && !editState() && styleBarStyle()) {\n\t\t<div\n\t\t\t#styleBar\n\t\t\tclass=\"pptx-ng-smartart-style-bar\"\n\t\t\t[ngStyle]=\"styleBarStyle()!\"\n\t\t\t(mousedown)=\"$event.stopPropagation()\"\n\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t>\n\t\t\t@for (color of palette().slice(0, 6); track color) {\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-smartart-swatch\"\n\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t[attr.aria-label]=\"'pptx.smartArt.setFill' | translate: { color: color }\"\n\t\t\t\t\t[style.background]=\"color\"\n\t\t\t\t\t(click)=\"handleChangeNodeStyle(hoveredNodeId()!, color)\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t</div>\n\t}\n\n\t<!--\n\t\tInline node-text editor. Positioned in element-local px (== viewBox\n\t\tunits, since the SVG viewBox matches the element pixel size and the\n\t\tsvg fills the chrome) over the double-clicked node. Commits via the\n\t\tshared EditorStateService.updateElement path on Enter / blur.\n\t-->\n\t@if (editState(); as edit) {\n\t\t<textarea\n\t\t\t#nodeEditor\n\t\t\tclass=\"pptx-ng-smartart-node-editor\"\n\t\t\t[style.left.px]=\"edit.box.x\"\n\t\t\t[style.top.px]=\"edit.box.y\"\n\t\t\t[style.width.px]=\"edit.box.width\"\n\t\t\t[style.height.px]=\"edit.box.height\"\n\t\t\t[value]=\"edit.text\"\n\t\t\t(pointerdown)=\"$event.stopPropagation()\"\n\t\t\t(mousedown)=\"$event.stopPropagation()\"\n\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t(dblclick)=\"$event.stopPropagation()\"\n\t\t\t(blur)=\"commitEdit($event)\"\n\t\t\t(keydown)=\"onEditorKeydown($event)\"\n\t\t></textarea>\n\t}\n\n\t<!-- Polite live region: announces node-text edit commits to AT. -->\n\t<span class=\"pptx-ng-sr-only\" aria-live=\"polite\" role=\"status\">{{ liveMessage() }}</span>\n</div>\n", styles: [".pptx-ng-smartart-chrome{box-sizing:border-box;overflow:hidden;position:relative}.pptx-ng-smartart-svg{width:100%;height:100%;pointer-events:none}.pptx-ng-smartart-node--editable{pointer-events:auto;cursor:text}.pptx-ng-smartart-node--editable:hover{filter:drop-shadow(0 0 2px rgba(96,165,250,.8))}.pptx-ng-smartart-node-editor{position:absolute;box-sizing:border-box;margin:0;padding:1px 2px;border:1px solid var(--pptx-inspector-active, #0078d4);border-radius:2px;background:#fff;color:#111;font-size:11px;line-height:1.1;text-align:center;resize:none;overflow:hidden;z-index:2}.pptx-ng-smartart-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:11px;color:#fffc;pointer-events:none}.pptx-ng-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pptx-ng-smartart-style-bar{position:absolute;pointer-events:auto;display:flex;gap:6px;padding:6px 8px;background:#ffffffe6;border:1px solid var(--border, #e2e8f0);border-radius:9999px;box-shadow:0 1px 2px #0000001a}.pptx-ng-smartart-swatch{width:20px;height:20px;border-radius:50%;border:1px solid rgba(0,0,0,.1);cursor:pointer;transition:transform .1s}.pptx-ng-smartart-swatch:hover{transform:scale(1.25)}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
72883
73162
  }
72884
73163
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: SmartArtRendererComponent, decorators: [{
72885
73164
  type: Component,
72886
- args: [{ selector: 'pptx-smart-art-renderer', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgStyle, TranslatePipe], template: "<div\n\t#smartartContainer\n\tclass=\"pptx-ng-smartart-chrome\"\n\t[ngStyle]=\"chromeStyle()\"\n\t[attr.role]=\"a11y() ? a11y()!.role : null\"\n\t[attr.aria-label]=\"a11y()?.label ?? null\"\n\t(mousemove)=\"onMouseMove($event)\"\n\t(mouseleave)=\"onMouseLeave()\"\n>\n\t@if (isEmpty()) {\n\t\t<div class=\"pptx-ng-smartart-placeholder\">\n\t\t\t{{ 'pptx.smartArt.placeholder' | translate }}\n\t\t</div>\n\t} @else if (hasDrawingShapes()) {\n\t\t<svg\n\t\t\tclass=\"pptx-ng-smartart-svg\"\n\t\t\tdata-testid=\"smartart-drawing-shapes\"\n\t\t\t[attr.viewBox]=\"svgViewBox()\"\n\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t>\n\t\t\t@for (shape of renderedShapes(); track shape.key; let i = $index) {\n\t\t\t\t<g\n\t\t\t\t\t[ngStyle]=\"shadowFilter() ? { filter: shadowFilter() } : {}\"\n\t\t\t\t\t[attr.data-smartart-node-id]=\"drawingShapeNodeIds()[i] ?? null\"\n\t\t\t\t\t[class.pptx-ng-smartart-node--editable]=\"canEditNodes() && !!drawingShapeNodeIds()[i]\"\n\t\t\t\t>\n\t\t\t\t\t@if (shape.isEllipse) {\n\t\t\t\t\t\t<ellipse\n\t\t\t\t\t\t\t[attr.cx]=\"shape.cx\"\n\t\t\t\t\t\t\t[attr.cy]=\"shape.cy\"\n\t\t\t\t\t\t\t[attr.rx]=\"shape.width / 2\"\n\t\t\t\t\t\t\t[attr.ry]=\"shape.height / 2\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t[attr.x]=\"shape.x\"\n\t\t\t\t\t\t\t[attr.y]=\"shape.y\"\n\t\t\t\t\t\t\t[attr.width]=\"shape.width\"\n\t\t\t\t\t\t\t[attr.height]=\"shape.height\"\n\t\t\t\t\t\t\t[attr.rx]=\"shape.rx\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\t@if (shape.text) {\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"shape.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fontColor\"\n\t\t\t\t\t\t\t[attr.font-size]=\"shape.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(shape.text, shape.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"shape.textX\" [attr.y]=\"shape.textY + line.offsetY\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</g>\n\t\t\t}\n\t\t</svg>\n\t} @else if (hasLayout()) {\n\t\t<svg\n\t\t\tclass=\"pptx-ng-smartart-svg\"\n\t\t\t[attr.data-testid]=\"'smartart-' + layout().family\"\n\t\t\t[attr.viewBox]=\"layout().viewBox\"\n\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t[attr.data-layout-family]=\"layout().family\"\n\t\t>\n\t\t\t@for (conn of layout().connectors; track conn.key) {\n\t\t\t\t<path [attr.d]=\"conn.d\" fill=\"none\" stroke=\"#94a3b8\" stroke-width=\"1.5\" opacity=\"0.5\" />\n\t\t\t}\n\t\t\t@for (node of layout().nodes; track node.key) {\n\t\t\t\t<g\n\t\t\t\t\t[ngStyle]=\"shadowFilter() ? { filter: shadowFilter() } : {}\"\n\t\t\t\t\t[class.pptx-ng-smartart-node--editable]=\"canEditNodes()\"\n\t\t\t\t\t[attr.tabindex]=\"canEditNodes() ? 0 : null\"\n\t\t\t\t\t[attr.role]=\"canEditNodes() ? 'button' : 'img'\"\n\t\t\t\t\t[attr.aria-label]=\"nodeAriaLabel(node) ?? node.text\"\n\t\t\t\t\t[attr.data-smartart-node-id]=\"nodeKeyId(node)\"\n\t\t\t\t\t(dblclick)=\"onNodeDblClick($event, node)\"\n\t\t\t\t\t(keydown)=\"onNodeKeydown($event, node)\"\n\t\t\t\t>\n\t\t\t\t\t@if (nodeAriaLabel(node); as title) {\n\t\t\t\t\t\t<title>{{ title }}</title>\n\t\t\t\t\t}\n\t\t\t\t\t@if (asCircle(node); as c) {\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t[attr.cx]=\"c.cx\"\n\t\t\t\t\t\t\t[attr.cy]=\"c.cy\"\n\t\t\t\t\t\t\t[attr.r]=\"c.r\"\n\t\t\t\t\t\t\t[attr.fill]=\"c.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"c.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"c.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"c.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"c.cx\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"c.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(c.text, c.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"c.cx\" [attr.y]=\"c.cy + line.offsetY\">{{ line.text }}</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t} @else if (asPolygon(node); as p) {\n\t\t\t\t\t\t<polygon\n\t\t\t\t\t\t\t[attr.points]=\"p.points\"\n\t\t\t\t\t\t\t[attr.fill]=\"p.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"p.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"p.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"p.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"p.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"p.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(p.text, p.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"p.textX\" [attr.y]=\"p.textY + line.offsetY\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t} @else if (asRect(node); as r) {\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t[attr.x]=\"r.x\"\n\t\t\t\t\t\t\t[attr.y]=\"r.y\"\n\t\t\t\t\t\t\t[attr.width]=\"r.width\"\n\t\t\t\t\t\t\t[attr.height]=\"r.height\"\n\t\t\t\t\t\t\t[attr.rx]=\"r.rx\"\n\t\t\t\t\t\t\t[attr.fill]=\"r.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"r.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"r.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"r.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"r.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"r.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(r.text, r.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"r.textX\" [attr.y]=\"r.textY + line.offsetY\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</g>\n\t\t\t}\n\t\t</svg>\n\t} @else {\n\t\t<div class=\"pptx-ng-smartart-placeholder\">\n\t\t\t{{ 'pptx.smartArt.placeholder' | translate }}\n\t\t</div>\n\t}\n\n\t@if (canEditNodes() && hoveredNodeId() && !editState() && styleBarStyle()) {\n\t\t<div\n\t\t\t#styleBar\n\t\t\tclass=\"pptx-ng-smartart-style-bar\"\n\t\t\t[ngStyle]=\"styleBarStyle()!\"\n\t\t\t(mousedown)=\"$event.stopPropagation()\"\n\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t>\n\t\t\t@for (color of palette().slice(0, 6); track color) {\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-smartart-swatch\"\n\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t[attr.aria-label]=\"'pptx.smartArt.setFill' | translate: { color: color }\"\n\t\t\t\t\t[style.background]=\"color\"\n\t\t\t\t\t(click)=\"handleChangeNodeStyle(hoveredNodeId()!, color)\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t</div>\n\t}\n\n\t<!--\n\t\tInline node-text editor. Positioned in element-local px (== viewBox\n\t\tunits, since the SVG viewBox matches the element pixel size and the\n\t\tsvg fills the chrome) over the double-clicked node. Commits via the\n\t\tshared EditorStateService.updateElement path on Enter / blur.\n\t-->\n\t@if (editState(); as edit) {\n\t\t<textarea\n\t\t\t#nodeEditor\n\t\t\tclass=\"pptx-ng-smartart-node-editor\"\n\t\t\t[style.left.px]=\"edit.box.x\"\n\t\t\t[style.top.px]=\"edit.box.y\"\n\t\t\t[style.width.px]=\"edit.box.width\"\n\t\t\t[style.height.px]=\"edit.box.height\"\n\t\t\t[value]=\"edit.text\"\n\t\t\t(pointerdown)=\"$event.stopPropagation()\"\n\t\t\t(mousedown)=\"$event.stopPropagation()\"\n\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t(dblclick)=\"$event.stopPropagation()\"\n\t\t\t(blur)=\"commitEdit($event)\"\n\t\t\t(keydown)=\"onEditorKeydown($event)\"\n\t\t></textarea>\n\t}\n\n\t<!-- Polite live region: announces node-text edit commits to AT. -->\n\t<span class=\"pptx-ng-sr-only\" aria-live=\"polite\" role=\"status\">{{ liveMessage() }}</span>\n</div>\n", styles: [".pptx-ng-smartart-chrome{box-sizing:border-box;overflow:hidden;position:relative}.pptx-ng-smartart-svg{width:100%;height:100%;pointer-events:none}.pptx-ng-smartart-node--editable{pointer-events:auto;cursor:text}.pptx-ng-smartart-node--editable:hover{filter:drop-shadow(0 0 2px rgba(96,165,250,.8))}.pptx-ng-smartart-node-editor{position:absolute;box-sizing:border-box;margin:0;padding:1px 2px;border:1px solid var(--pptx-inspector-active, #0078d4);border-radius:2px;background:#fff;color:#111;font-size:11px;line-height:1.1;text-align:center;resize:none;overflow:hidden;z-index:2}.pptx-ng-smartart-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:11px;color:#fffc;pointer-events:none}.pptx-ng-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pptx-ng-smartart-style-bar{position:absolute;pointer-events:auto;display:flex;gap:6px;padding:6px 8px;background:#ffffffe6;border:1px solid var(--border, #e2e8f0);border-radius:9999px;box-shadow:0 1px 2px #0000001a}.pptx-ng-smartart-swatch{width:20px;height:20px;border-radius:50%;border:1px solid rgba(0,0,0,.1);cursor:pointer;transition:transform .1s}.pptx-ng-smartart-swatch:hover{transform:scale(1.25)}\n"] }]
73165
+ args: [{ selector: 'pptx-smart-art-renderer', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgStyle, TranslatePipe], template: "<div\n\t#smartartContainer\n\tclass=\"pptx-ng-smartart-chrome\"\n\t[ngStyle]=\"chromeStyle()\"\n\t[attr.role]=\"a11y() ? a11y()!.role : null\"\n\t[attr.aria-label]=\"a11y()?.label ?? null\"\n\t(mousemove)=\"onMouseMove($event)\"\n\t(mouseleave)=\"onMouseLeave()\"\n>\n\t@if (isEmpty()) {\n\t\t<div class=\"pptx-ng-smartart-placeholder\">\n\t\t\t{{ 'pptx.smartArt.placeholder' | translate }}\n\t\t</div>\n\t} @else if (hasDrawingShapes()) {\n\t\t<svg\n\t\t\tclass=\"pptx-ng-smartart-svg\"\n\t\t\tdata-testid=\"smartart-drawing-shapes\"\n\t\t\t[attr.viewBox]=\"svgViewBox()\"\n\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t>\n\t\t\t@for (shape of renderedShapes(); track shape.key; let i = $index) {\n\t\t\t\t<g\n\t\t\t\t\t[ngStyle]=\"shadowFilter() ? { filter: shadowFilter() } : {}\"\n\t\t\t\t\t[attr.data-smartart-node-id]=\"drawingShapeNodeIds()[i] ?? null\"\n\t\t\t\t\t[class.pptx-ng-smartart-node--editable]=\"canEditNodes() && !!drawingShapeNodeIds()[i]\"\n\t\t\t\t>\n\t\t\t\t\t@if (shape.gradient) {\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t@if (shape.gradient!.kind === 'radial') {\n\t\t\t\t\t\t\t\t<radialGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"shape.gradient!.id\"\n\t\t\t\t\t\t\t\t\t[attr.cx]=\"shape.gradient!.cx\"\n\t\t\t\t\t\t\t\t\t[attr.cy]=\"shape.gradient!.cy\"\n\t\t\t\t\t\t\t\t\t[attr.r]=\"shape.gradient!.r\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of shape.gradient!.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity ?? null\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"shape.gradient!.id\"\n\t\t\t\t\t\t\t\t\t[attr.x1]=\"shape.gradient!.x1\"\n\t\t\t\t\t\t\t\t\t[attr.y1]=\"shape.gradient!.y1\"\n\t\t\t\t\t\t\t\t\t[attr.x2]=\"shape.gradient!.x2\"\n\t\t\t\t\t\t\t\t\t[attr.y2]=\"shape.gradient!.y2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of shape.gradient!.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity ?? null\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t}\n\t\t\t\t\t@if (shape.kind === 'image') {\n\t\t\t\t\t\t<image\n\t\t\t\t\t\t\t[attr.x]=\"shape.x\"\n\t\t\t\t\t\t\t[attr.y]=\"shape.y\"\n\t\t\t\t\t\t\t[attr.width]=\"shape.width\"\n\t\t\t\t\t\t\t[attr.height]=\"shape.height\"\n\t\t\t\t\t\t\t[attr.href]=\"shape.imageUrl\"\n\t\t\t\t\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else if (shape.kind === 'ellipse') {\n\t\t\t\t\t\t<ellipse\n\t\t\t\t\t\t\t[attr.cx]=\"shape.cx\"\n\t\t\t\t\t\t\t[attr.cy]=\"shape.cy\"\n\t\t\t\t\t\t\t[attr.rx]=\"shape.width / 2\"\n\t\t\t\t\t\t\t[attr.ry]=\"shape.height / 2\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else if (shape.kind === 'polygon') {\n\t\t\t\t\t\t<polygon\n\t\t\t\t\t\t\t[attr.points]=\"shape.points\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t[attr.x]=\"shape.x\"\n\t\t\t\t\t\t\t[attr.y]=\"shape.y\"\n\t\t\t\t\t\t\t[attr.width]=\"shape.width\"\n\t\t\t\t\t\t\t[attr.height]=\"shape.height\"\n\t\t\t\t\t\t\t[attr.rx]=\"shape.rx\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\t@if (shape.textLines.length > 0) {\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"shape.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\t[attr.fill]=\"shape.fontColor\"\n\t\t\t\t\t\t\t[attr.font-size]=\"shape.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of shape.textLines; track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"shape.textX\" [attr.y]=\"line.y\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</g>\n\t\t\t}\n\t\t</svg>\n\t} @else if (hasLayout()) {\n\t\t<svg\n\t\t\tclass=\"pptx-ng-smartart-svg\"\n\t\t\t[attr.data-testid]=\"'smartart-' + layout().family\"\n\t\t\t[attr.viewBox]=\"layout().viewBox\"\n\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t[attr.data-layout-family]=\"layout().family\"\n\t\t>\n\t\t\t@for (conn of layout().connectors; track conn.key) {\n\t\t\t\t<path [attr.d]=\"conn.d\" fill=\"none\" stroke=\"#94a3b8\" stroke-width=\"1.5\" opacity=\"0.5\" />\n\t\t\t}\n\t\t\t@for (node of layout().nodes; track node.key) {\n\t\t\t\t<g\n\t\t\t\t\t[ngStyle]=\"shadowFilter() ? { filter: shadowFilter() } : {}\"\n\t\t\t\t\t[class.pptx-ng-smartart-node--editable]=\"canEditNodes()\"\n\t\t\t\t\t[attr.tabindex]=\"canEditNodes() ? 0 : null\"\n\t\t\t\t\t[attr.role]=\"canEditNodes() ? 'button' : 'img'\"\n\t\t\t\t\t[attr.aria-label]=\"nodeAriaLabel(node) ?? node.text\"\n\t\t\t\t\t[attr.data-smartart-node-id]=\"nodeKeyId(node)\"\n\t\t\t\t\t(dblclick)=\"onNodeDblClick($event, node)\"\n\t\t\t\t\t(keydown)=\"onNodeKeydown($event, node)\"\n\t\t\t\t>\n\t\t\t\t\t@if (nodeAriaLabel(node); as title) {\n\t\t\t\t\t\t<title>{{ title }}</title>\n\t\t\t\t\t}\n\t\t\t\t\t@if (asCircle(node); as c) {\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t[attr.cx]=\"c.cx\"\n\t\t\t\t\t\t\t[attr.cy]=\"c.cy\"\n\t\t\t\t\t\t\t[attr.r]=\"c.r\"\n\t\t\t\t\t\t\t[attr.fill]=\"c.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"c.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"c.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"c.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"c.cx\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"c.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(c.text, c.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"c.cx\" [attr.y]=\"c.cy + line.y\">{{ line.text }}</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t} @else if (asPolygon(node); as p) {\n\t\t\t\t\t\t<polygon\n\t\t\t\t\t\t\t[attr.points]=\"p.points\"\n\t\t\t\t\t\t\t[attr.fill]=\"p.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"p.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"p.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"p.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"p.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"p.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(p.text, p.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"p.textX\" [attr.y]=\"p.textY + line.y\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t} @else if (asRect(node); as r) {\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t[attr.x]=\"r.x\"\n\t\t\t\t\t\t\t[attr.y]=\"r.y\"\n\t\t\t\t\t\t\t[attr.width]=\"r.width\"\n\t\t\t\t\t\t\t[attr.height]=\"r.height\"\n\t\t\t\t\t\t\t[attr.rx]=\"r.rx\"\n\t\t\t\t\t\t\t[attr.fill]=\"r.fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"r.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"r.strokeWidth\"\n\t\t\t\t\t\t\t[attr.opacity]=\"r.opacity\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"r.textX\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"r.fontSize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@for (line of textLines(r.text, r.fontSize); track $index) {\n\t\t\t\t\t\t\t\t<tspan [attr.x]=\"r.textX\" [attr.y]=\"r.textY + line.y\">\n\t\t\t\t\t\t\t\t\t{{ line.text }}\n\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</g>\n\t\t\t}\n\t\t</svg>\n\t} @else {\n\t\t<div class=\"pptx-ng-smartart-placeholder\">\n\t\t\t{{ 'pptx.smartArt.placeholder' | translate }}\n\t\t</div>\n\t}\n\n\t@if (canEditNodes() && hoveredNodeId() && !editState() && styleBarStyle()) {\n\t\t<div\n\t\t\t#styleBar\n\t\t\tclass=\"pptx-ng-smartart-style-bar\"\n\t\t\t[ngStyle]=\"styleBarStyle()!\"\n\t\t\t(mousedown)=\"$event.stopPropagation()\"\n\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t>\n\t\t\t@for (color of palette().slice(0, 6); track color) {\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-smartart-swatch\"\n\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t[attr.aria-label]=\"'pptx.smartArt.setFill' | translate: { color: color }\"\n\t\t\t\t\t[style.background]=\"color\"\n\t\t\t\t\t(click)=\"handleChangeNodeStyle(hoveredNodeId()!, color)\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t</div>\n\t}\n\n\t<!--\n\t\tInline node-text editor. Positioned in element-local px (== viewBox\n\t\tunits, since the SVG viewBox matches the element pixel size and the\n\t\tsvg fills the chrome) over the double-clicked node. Commits via the\n\t\tshared EditorStateService.updateElement path on Enter / blur.\n\t-->\n\t@if (editState(); as edit) {\n\t\t<textarea\n\t\t\t#nodeEditor\n\t\t\tclass=\"pptx-ng-smartart-node-editor\"\n\t\t\t[style.left.px]=\"edit.box.x\"\n\t\t\t[style.top.px]=\"edit.box.y\"\n\t\t\t[style.width.px]=\"edit.box.width\"\n\t\t\t[style.height.px]=\"edit.box.height\"\n\t\t\t[value]=\"edit.text\"\n\t\t\t(pointerdown)=\"$event.stopPropagation()\"\n\t\t\t(mousedown)=\"$event.stopPropagation()\"\n\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t(dblclick)=\"$event.stopPropagation()\"\n\t\t\t(blur)=\"commitEdit($event)\"\n\t\t\t(keydown)=\"onEditorKeydown($event)\"\n\t\t></textarea>\n\t}\n\n\t<!-- Polite live region: announces node-text edit commits to AT. -->\n\t<span class=\"pptx-ng-sr-only\" aria-live=\"polite\" role=\"status\">{{ liveMessage() }}</span>\n</div>\n", styles: [".pptx-ng-smartart-chrome{box-sizing:border-box;overflow:hidden;position:relative}.pptx-ng-smartart-svg{width:100%;height:100%;pointer-events:none}.pptx-ng-smartart-node--editable{pointer-events:auto;cursor:text}.pptx-ng-smartart-node--editable:hover{filter:drop-shadow(0 0 2px rgba(96,165,250,.8))}.pptx-ng-smartart-node-editor{position:absolute;box-sizing:border-box;margin:0;padding:1px 2px;border:1px solid var(--pptx-inspector-active, #0078d4);border-radius:2px;background:#fff;color:#111;font-size:11px;line-height:1.1;text-align:center;resize:none;overflow:hidden;z-index:2}.pptx-ng-smartart-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:11px;color:#fffc;pointer-events:none}.pptx-ng-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pptx-ng-smartart-style-bar{position:absolute;pointer-events:auto;display:flex;gap:6px;padding:6px 8px;background:#ffffffe6;border:1px solid var(--border, #e2e8f0);border-radius:9999px;box-shadow:0 1px 2px #0000001a}.pptx-ng-smartart-swatch{width:20px;height:20px;border-radius:50%;border:1px solid rgba(0,0,0,.1);cursor:pointer;transition:transform .1s}.pptx-ng-smartart-swatch:hover{transform:scale(1.25)}\n"] }]
72887
73166
  }], ctorParameters: () => [], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], animationState: [{ type: i0.Input, args: [{ isSignal: true, alias: "animationState", required: false }] }], nodeEditor: [{ type: i0.ViewChild, args: ['nodeEditor', { isSignal: true }] }], smartartContainer: [{ type: i0.ViewChild, args: ['smartartContainer', { isSignal: true }] }], styleBar: [{ type: i0.ViewChild, args: ['styleBar', { isSignal: true }] }] } });
72888
73167
 
72889
73168
  /**
@@ -76759,79 +77038,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
76759
77038
  */
76760
77039
 
76761
77040
  /**
76762
- * Parse an SVG path `d` string and extract coordinate points.
77041
+ * Pressure-circle sizing for an ink stroke of `baseWidth`.
76763
77042
  *
76764
- * Curves are sampled at their control points and endpoints (not interpolated),
76765
- * which is sufficient for pressure-width rendering where each extracted point
76766
- * gets a circle overlay.
77043
+ * Every binding uses the same envelope (0.5px minimum, 1.5x the stroke width at
77044
+ * full pressure); spelling it once here keeps Angular from drifting off it.
76767
77045
  */
76768
- function extractPathPoints(d) {
76769
- const points = [];
76770
- const numberRegex = /-?\d+(?:\.\d+)?(?:e[+-]?\d+)?/giu;
76771
- const numbers = [];
76772
- let match;
76773
- while ((match = numberRegex.exec(d)) !== null) {
76774
- numbers.push(Number.parseFloat(match[0]));
76775
- }
76776
- for (let i = 0; i < numbers.length - 1; i += 2) {
76777
- points.push({ x: numbers[i], y: numbers[i + 1] });
76778
- }
76779
- return points;
76780
- }
76781
- /**
76782
- * Linearly interpolate a width value at normalised position `t` (0..1) along a
76783
- * stroke, given a list of width samples.
76784
- */
76785
- function interpolateWidth(widths, t) {
76786
- if (widths.length === 0) {
76787
- return 1;
76788
- }
76789
- if (widths.length === 1) {
76790
- return widths[0];
76791
- }
76792
- const clampedT = Math.max(0, Math.min(1, t));
76793
- const index = clampedT * (widths.length - 1);
76794
- const lower = Math.floor(index);
76795
- const upper = Math.min(lower + 1, widths.length - 1);
76796
- const frac = index - lower;
76797
- return widths[lower] * (1 - frac) + widths[upper] * frac;
76798
- }
76799
- /**
76800
- * Whether a width/pressure array has meaningful variation (i.e. is not uniform).
76801
- */
76802
- function hasPressureVariation(values) {
76803
- if (values.length <= 1) {
76804
- return false;
76805
- }
76806
- const first = values[0];
76807
- return values.some((v) => Math.abs(v - first) > 0.01);
76808
- }
76809
- /**
76810
- * Convert per-point pressure values (0-1, e.g. `PointerEvent.pressure`) to
76811
- * per-point width values. Zero pressure maps to `baseWidth * minScale`, full
76812
- * pressure to `baseWidth * maxScale`.
76813
- */
76814
- function pressuresToWidths(pressures, baseWidth, minScale = 0.3, maxScale = 1.8) {
76815
- return pressures.map((p) => {
76816
- const clamped = Math.max(0, Math.min(1, p));
76817
- return baseWidth * (minScale + clamped * (maxScale - minScale));
76818
- });
76819
- }
76820
- /**
76821
- * Generate pressure circles for a stroke's path points using per-point width
76822
- * data. Widths shorter than the point list are interpolated linearly.
76823
- */
76824
- function generatePressureCircles(points, widths, baseWidth, minRadius = 0.5, maxRadius = baseWidth * 1.5) {
76825
- if (points.length === 0) {
76826
- return [];
76827
- }
76828
- return points.map((pt, i) => {
76829
- const t = points.length === 1 ? 0.5 : i / (points.length - 1);
76830
- const w = interpolateWidth(widths, t);
76831
- const ratio = baseWidth > 0 ? w / baseWidth : 1;
76832
- const r = Math.max(minRadius, Math.min(maxRadius, (baseWidth / 2) * ratio));
76833
- return { cx: pt.x, cy: pt.y, r };
76834
- });
77046
+ function pressureConfig(baseWidth) {
77047
+ return { baseWidth, minRadius: 0.5, maxRadius: baseWidth * 1.5 };
76835
77048
  }
76836
77049
  /**
76837
77050
  * Compute pressure circles for stroke `i`, or `undefined` when the stroke has
@@ -76844,10 +77057,10 @@ function pressureCirclesForStroke(el, index, d, baseWidth) {
76844
77057
  const pointPressures = el.inkPointPressures?.[index];
76845
77058
  if (pointPressures && pointPressures.length > 1 && hasPressureVariation(pointPressures)) {
76846
77059
  const widths = pressuresToWidths(pointPressures, baseWidth);
76847
- return generatePressureCircles(extractPathPoints(d), widths, baseWidth);
77060
+ return generatePressureCircles(extractPathPoints(d), widths, pressureConfig(baseWidth));
76848
77061
  }
76849
77062
  if (el.inkWidths && el.inkWidths.length > 1 && hasPressureVariation(el.inkWidths)) {
76850
- return generatePressureCircles(extractPathPoints(d), el.inkWidths, baseWidth);
77063
+ return generatePressureCircles(extractPathPoints(d), el.inkWidths, pressureConfig(baseWidth));
76851
77064
  }
76852
77065
  return undefined;
76853
77066
  }
@@ -78805,35 +79018,6 @@ function resolveAngularParagraphBullet(segment, baseFontSize, fontScale = 1) {
78805
79018
  };
78806
79019
  }
78807
79020
 
78808
- /**
78809
- * Resolve a paragraph's own line-height + space-before/after from its parsed
78810
- * `paragraphProperties` (the first segment's per-paragraph `a:pPr`). Only keys
78811
- * the paragraph explicitly overrides are set, so a paragraph without its own
78812
- * spacing inherits the body-level defaults the binding already applies. Exact
78813
- * `lineSpacingExactPt` (`a:spcPts`) wins over the proportional multiplier.
78814
- */
78815
- function resolveParagraphSpacing(pPr) {
78816
- const out = {};
78817
- if (!pPr) {
78818
- return out;
78819
- }
78820
- if (typeof pPr.lineSpacingExactPt === 'number' && pPr.lineSpacingExactPt > 0) {
78821
- out.lineHeight = `${pPr.lineSpacingExactPt}pt`;
78822
- }
78823
- else if (typeof pPr.lineSpacing === 'number' && pPr.lineSpacing > 0) {
78824
- // `a:spcPct` stacks on the 1.2 single-spacing base (see
78825
- // `proportionalLineHeight` in the shared text-style-helpers).
78826
- out.lineHeight = proportionalLineHeight(pPr.lineSpacing);
78827
- }
78828
- if (typeof pPr.paragraphSpacingBefore === 'number') {
78829
- out.spaceBeforePx = pPr.paragraphSpacingBefore;
78830
- }
78831
- if (typeof pPr.paragraphSpacingAfter === 'number') {
78832
- out.spaceAfterPx = pPr.paragraphSpacingAfter;
78833
- }
78834
- return out;
78835
- }
78836
-
78837
79021
  /**
78838
79022
  * Presets that the Angular renderer draws with SVG `<textPath>` along a
78839
79023
  * curved/circular path. Envelope (inflate/deflate/can) and simple (slant/fade/
@@ -79795,6 +79979,11 @@ class ElementRendererComponent {
79795
79979
  const paragraphIndents = el.paragraphIndents;
79796
79980
  const out = [{ runs: [], bulletStyle: {}, indentPx: 0 }];
79797
79981
  let paraStarted = false;
79982
+ // `a:bodyPr/@spcFirstLastPara`; the shared resolver owns what it means.
79983
+ const spaceFirstLast = el.textStyle?.spaceFirstLastParagraph !== false;
79984
+ // Paragraphs are built in one forward pass, so the last one's own props are
79985
+ // kept to re-resolve its spacing once the end of the body is known.
79986
+ let lastParagraphProps;
79798
79987
  for (const seg of segments) {
79799
79988
  // A bare `"\n"` segment is the slide-LOAD path's paragraph separator;
79800
79989
  // `isParagraphBreak` is only set by the edit remap. Matching on the
@@ -79815,7 +80004,12 @@ class ElementRendererComponent {
79815
80004
  if (typeof endParaSize === 'number' && endParaSize > 0) {
79816
80005
  closing.strutFontSizePx = endParaSize;
79817
80006
  }
79818
- const endSpacing = resolveParagraphSpacing(seg.paragraphProperties);
80007
+ const endSpacing = resolveParagraphSpacing({
80008
+ paraProps: seg.paragraphProperties,
80009
+ bodyStyle: el.textStyle,
80010
+ isFirst: out.length === 1,
80011
+ spaceFirstLast,
80012
+ });
79819
80013
  if (endSpacing.lineHeight !== undefined) {
79820
80014
  closing.lineHeight = endSpacing.lineHeight;
79821
80015
  }
@@ -79837,9 +80031,16 @@ class ElementRendererComponent {
79837
80031
  const indent = resolveParagraphIndent(paragraphIndents?.[out.length - 1], seg.paragraphLevel);
79838
80032
  current.indentPx = indent.marginLeftPx ?? 0;
79839
80033
  current.textIndentPx = indent.textIndentPx;
79840
- // Per-paragraph line-height / space-before / space-after from this
79841
- // paragraph's own `a:pPr` (#69), mirroring shared `buildParagraphs`.
79842
- const spacing = resolveParagraphSpacing(seg.paragraphProperties);
80034
+ // Per-paragraph line-height / space-before / space-after, resolved by
80035
+ // the shared resolver `buildParagraphs` uses (body-level inheritance
80036
+ // and the first/last edge rule included).
80037
+ lastParagraphProps = seg.paragraphProperties;
80038
+ const spacing = resolveParagraphSpacing({
80039
+ paraProps: seg.paragraphProperties,
80040
+ bodyStyle: el.textStyle,
80041
+ isFirst: out.length === 1,
80042
+ spaceFirstLast,
80043
+ });
79843
80044
  if (spacing.lineHeight !== undefined) {
79844
80045
  current.lineHeight = spacing.lineHeight;
79845
80046
  }
@@ -79949,12 +80150,27 @@ class ElementRendererComponent {
79949
80150
  if (lastContent < 0) {
79950
80151
  return out.length === 1 ? out : [];
79951
80152
  }
79952
- return out.slice(0, lastContent + 1).map((p) => {
80153
+ const kept = out.slice(0, lastContent + 1).map((p) => {
79953
80154
  if (!hasContent(p)) {
79954
80155
  p.isEmpty = true;
79955
80156
  }
79956
80157
  return p;
79957
80158
  });
80159
+ // The last paragraph's after-spacing depends on it BEING last, which is only
80160
+ // known now that the body has ended. Re-resolving through the same shared
80161
+ // resolver keeps the edge rule in one place.
80162
+ const finalParagraph = kept[kept.length - 1];
80163
+ if (finalParagraph) {
80164
+ const finalSpacing = resolveParagraphSpacing({
80165
+ paraProps: lastParagraphProps,
80166
+ bodyStyle: el.textStyle,
80167
+ isFirst: kept.length === 1,
80168
+ isLast: true,
80169
+ spaceFirstLast,
80170
+ });
80171
+ finalParagraph.spaceAfterPx = finalSpacing.spaceAfterPx;
80172
+ }
80173
+ return kept;
79958
80174
  }, /* @ts-ignore */
79959
80175
  ...(ngDevMode ? [{ debugName: "paragraphs" }] : /* istanbul ignore next */ []));
79960
80176
  hasText = computed(() => this.paragraphs().some((p) => p.runs.length > 0 || p.bulletMarker !== undefined || p.bulletPicture !== undefined), /* @ts-ignore */
@@ -96831,7 +97047,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
96831
97047
  }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
96832
97048
 
96833
97049
  // Generated by scripts/inline-shared.mjs from package.json. Do not edit.
96834
- const PPTX_ANGULAR_VIEWER_VERSION = "2.17.4";
97050
+ const PPTX_ANGULAR_VIEWER_VERSION = "2.17.6";
96835
97051
 
96836
97052
  /**
96837
97053
  * account-page.component.ts: File > Account content.
@@ -98334,7 +98550,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
98334
98550
  class RibbonHomeSectionComponent {
98335
98551
  editor = inject(EditorStateService);
98336
98552
  loader = inject(LoadContentService);
98337
- /** Layouts offered by the New Slide split button (empty for a layout-less deck). */
98553
+ /** Layouts offered by the New Slide split button and the Layout menu. */
98338
98554
  layoutOptions = computed(() => layoutOptionsFrom(this.loader.slideMasters()), /* @ts-ignore */
98339
98555
  ...(ngDevMode ? [{ debugName: "layoutOptions" }] : /* istanbul ignore next */ []));
98340
98556
  slideIndex = input(0, /* @ts-ignore */
@@ -98351,8 +98567,17 @@ class RibbonHomeSectionComponent {
98351
98567
  findReplace = output();
98352
98568
  /** "Slide Templates" in the Slides group; the host opens the gallery dialog. */
98353
98569
  openTemplateGallery = output();
98570
+ /** Emitted with the layout the user picked, after it has been applied. */
98354
98571
  applyLayout = output();
98355
98572
  resetSlide = output();
98573
+ /**
98574
+ * Re-map the active slide onto `layoutPath`. The operation is self-contained,
98575
+ * so the output is a notification rather than the thing that performs it.
98576
+ */
98577
+ onApplyLayout(layoutPath) {
98578
+ void this.editor.applyLayout(this.slideIndex(), layoutPath);
98579
+ this.applyLayout.emit(layoutPath);
98580
+ }
98356
98581
  copy() {
98357
98582
  this.editor.copySelected(this.slideIndex());
98358
98583
  }
@@ -98485,14 +98710,40 @@ class RibbonHomeSectionComponent {
98485
98710
  <svg lucideLayoutTemplate class="h-4 w-4"></svg>
98486
98711
  {{ 'pptx.home.slideTemplates' | translate }}
98487
98712
  </button>
98488
- <button
98489
- type="button"
98490
- class="pptx-rb-gb whitespace-nowrap"
98491
- [title]="'pptx.master.layout' | translate"
98492
- (click)="applyLayout.emit('blank')"
98493
- >
98494
- <svg lucideLayoutGrid class="h-4 w-4"></svg> {{ 'pptx.master.layout' | translate }}
98495
- </button>
98713
+ <!--
98714
+ Layout re-maps the ACTIVE slide onto another layout of its master,
98715
+ keeping its content: that is what PowerPoint's Home > Layout does,
98716
+ and it is a different operation from the New Slide chevron above,
98717
+ which inserts a slide that inherits from the layout picked.
98718
+ -->
98719
+ <div class="group relative">
98720
+ <button
98721
+ type="button"
98722
+ class="pptx-rb-gb whitespace-nowrap"
98723
+ [disabled]="!canEdit() || layoutOptions().length === 0"
98724
+ [title]="'pptx.master.layout' | translate"
98725
+ >
98726
+ <svg lucideLayoutGrid class="h-4 w-4"></svg> {{ 'pptx.master.layout' | translate }}
98727
+ </button>
98728
+ @if (layoutOptions().length > 0) {
98729
+ <div
98730
+ class="absolute left-0 top-full z-50 hidden max-h-60 w-48 overflow-y-auto pt-1 group-hover:block"
98731
+ >
98732
+ <div class="rounded-lg border border-border bg-card py-1 shadow-2xl">
98733
+ @for (option of layoutOptions(); track option.path) {
98734
+ <button
98735
+ type="button"
98736
+ class="flex w-full items-center px-3 py-1.5 text-left text-xs text-foreground transition-colors hover:bg-muted"
98737
+ [disabled]="!canEdit()"
98738
+ (click)="onApplyLayout(option.path)"
98739
+ >
98740
+ {{ option.name }}
98741
+ </button>
98742
+ }
98743
+ </div>
98744
+ </div>
98745
+ }
98746
+ </div>
98496
98747
  <button
98497
98748
  type="button"
98498
98749
  class="pptx-rb-gb whitespace-nowrap"
@@ -98698,14 +98949,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
98698
98949
  <svg lucideLayoutTemplate class="h-4 w-4"></svg>
98699
98950
  {{ 'pptx.home.slideTemplates' | translate }}
98700
98951
  </button>
98701
- <button
98702
- type="button"
98703
- class="pptx-rb-gb whitespace-nowrap"
98704
- [title]="'pptx.master.layout' | translate"
98705
- (click)="applyLayout.emit('blank')"
98706
- >
98707
- <svg lucideLayoutGrid class="h-4 w-4"></svg> {{ 'pptx.master.layout' | translate }}
98708
- </button>
98952
+ <!--
98953
+ Layout re-maps the ACTIVE slide onto another layout of its master,
98954
+ keeping its content: that is what PowerPoint's Home > Layout does,
98955
+ and it is a different operation from the New Slide chevron above,
98956
+ which inserts a slide that inherits from the layout picked.
98957
+ -->
98958
+ <div class="group relative">
98959
+ <button
98960
+ type="button"
98961
+ class="pptx-rb-gb whitespace-nowrap"
98962
+ [disabled]="!canEdit() || layoutOptions().length === 0"
98963
+ [title]="'pptx.master.layout' | translate"
98964
+ >
98965
+ <svg lucideLayoutGrid class="h-4 w-4"></svg> {{ 'pptx.master.layout' | translate }}
98966
+ </button>
98967
+ @if (layoutOptions().length > 0) {
98968
+ <div
98969
+ class="absolute left-0 top-full z-50 hidden max-h-60 w-48 overflow-y-auto pt-1 group-hover:block"
98970
+ >
98971
+ <div class="rounded-lg border border-border bg-card py-1 shadow-2xl">
98972
+ @for (option of layoutOptions(); track option.path) {
98973
+ <button
98974
+ type="button"
98975
+ class="flex w-full items-center px-3 py-1.5 text-left text-xs text-foreground transition-colors hover:bg-muted"
98976
+ [disabled]="!canEdit()"
98977
+ (click)="onApplyLayout(option.path)"
98978
+ >
98979
+ {{ option.name }}
98980
+ </button>
98981
+ }
98982
+ </div>
98983
+ </div>
98984
+ }
98985
+ </div>
98709
98986
  <button
98710
98987
  type="button"
98711
98988
  class="pptx-rb-gb whitespace-nowrap"
@@ -119873,29 +120150,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
119873
120150
  * so callers with access to one get translated text; callers without one
119874
120151
  * (e.g. plain unit tests) still get the English fallback.
119875
120152
  */
119876
- /** Returns a strength score 0-4 for a password. Ported verbatim from React. */
119877
- function getPasswordStrength(password) {
119878
- if (!password) {
119879
- return 0;
119880
- }
119881
- let score = 0;
119882
- if (password.length >= 8) {
119883
- score++;
119884
- }
119885
- if (password.length >= 12) {
119886
- score++;
119887
- }
119888
- if (/[A-Z]/u.test(password) && /[a-z]/u.test(password)) {
119889
- score++;
119890
- }
119891
- if (/\d/u.test(password)) {
119892
- score++;
119893
- }
119894
- if (/[^A-Za-z0-9]/u.test(password)) {
119895
- score++;
119896
- }
119897
- return Math.min(score, 4);
119898
- }
120153
+ // Password strength scoring is shared, so every binding grades a password the
120154
+ // same way.
119899
120155
  /** Bar colours indexed by strength score (0-4). */
119900
120156
  const STRENGTH_COLORS = ['#ef4444', '#f97316', '#eab308', '#84cc16', '#22c55e'];
119901
120157
  /** English fallback labels indexed by strength score (0-4), used when no `translate` is passed. */
@@ -128774,5 +129030,5 @@ function cn(...values) {
128774
129030
  * Generated bundle index. Do not edit.
128775
129031
  */
128776
129032
 
128777
- export { CommentsService as $, ALIGN_OPTIONS as A, AnimationPlaybackService as B, AutosaveService as C, BroadcastDialogComponent as D, CHART_EDITOR_STYLES as E, CURSOR_PALETTE as F, CanvasFitService as G, ChartAxisOptionsComponent as H, ChartAxisStyleOptionsComponent as I, ChartComboTypeOptionsComponent as J, ChartDataEditorComponent as K, ChartDataLabelOptionsComponent as L, ChartDatapointMarkerOptionsComponent as M, ChartDatapointOptionsComponent as N, ChartDisplayOptionsComponent as O, ChartElementViewComponent as P, ChartErrorBarOptionsComponent as Q, ChartMarkerOptionsComponent as R, ChartPartSelectionService as S, ChartPrimitivesComponent as T, ChartRendererComponent as U, ChartTrendlineOptionsComponent as V, CollaborationCursorsComponent as W, CollaborationService as X, ColorChangedImageComponent as Y, CommentMarkersOverlayComponent as Z, CommentsPanelComponent as _, ANIMATION_PRESET_CATEGORIES as a, IsMobileService as a$, ComparePanelComponent as a0, ConnectorRendererComponent as a1, ConnectorTextOverlayComponent as a2, CustomShowsComponent as a3, DATA_TABLE_HEADER_H as a4, DATA_TABLE_KEY_W as a5, DATA_TABLE_PADDING as a6, DATA_TABLE_ROW_H as a7, DEFAULT_BOUNDS as a8, DEFAULT_BROADCAST_SERVER_URL as a9, EffectsPanelComponent as aA, ElementRendererComponent as aB, EmbeddedFontsService as aC, EncryptedFileDialogComponent as aD, EquationEditorDialogComponent as aE, EquationRendererComponent as aF, EquationTemplateGalleryComponent as aG, ExportProgressModalComponent as aH, ExportService as aI, FieldContextService as aJ, FindBarComponent as aK, FindReplaceBarComponent as aL, FollowModeBarComponent as aM, FontEmbeddingListComponent as aN, FontEmbeddingPanelComponent as aO, GALLERY_THEME_PRESETS as aP, GRIDLINE_COLOR as aQ, GradientPickerComponent as aR, HANDOUT_OPTIONS as aS, HeaderFooterDialogComponent as aT, HyperlinkDialogComponent as aU, ImagePropertiesPanelComponent as aV, InkDrawingService as aW, InkRendererComponent as aX, InsertSmartArtDialogComponent as aY, InspectorPaneHeaderComponent as aZ, InspectorPanelComponent as a_, DEFAULT_CANVAS_HEIGHT as aa, DEFAULT_CANVAS_WIDTH as ab, DEFAULT_COLOR_SCHEME as ac, DEFAULT_FILL_COLOR 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$1 as am, DEFAULT_VIEWER_PROFILE as an, DIRECTIONAL_PRESETS as ao, DIRECTION_OPTIONS as ap, DocumentPropertiesCardComponent as aq, EMBEDDED_FONTS_STYLE_ID as ar, EMPHASIS_PRESETS as as, ENTRANCE_PRESETS as at, TEMPLATES as au, EXIT_PRESETS as av, EditorContextMenuComponent as aw, EditorHistory as ax, EditorStateService as ay, EditorToolbarComponent as az, AUDIENCE_HASH as b, RibbonDrawingGroupComponent as b$, KeepAnnotationsDialogComponent as b0, LOCALE_CATALOG as b1, LONG_PRESS_DURATION_MS as b2, LONG_PRESS_MOVE_TOLERANCE_PX as b3, LoadContentService as b4, LocalPresencePublisher as b5, MAX_ZOOM_SCALE as b6, MIN_ZOOM_SCALE as b7, MOTION_PATH_COLUMNS as b8, MediaPreviewComponent as b9, PresentationAnnotationOverlayComponent as bA, PresentationAnnotationsService as bB, PresentationOverlayComponent as bC, PresentationPropertiesPanelComponent as bD, PresentationSettingsCardComponent as bE, PresentationSubtitleBarComponent as bF, PresentationToolbarComponent as bG, PresentationTransitionOverlayComponent as bH, PresenterViewComponent as bI, PresenterWindowService as bJ, PrintDialogComponent as bK, PrintService as bL, PrintSettingsPanelComponent as bM, PropertiesDialogComponent as bN, REPEAT_MODE_OPTIONS as bO, RESIZE_HANDLES as bP, RULER_FONT_SIZE as bQ, RULER_THICKNESS as bR, ReadingViewOverlayComponent as bS, RemoteSelectionOverlayComponent as bT, RibbonAnimationGalleryComponent as bU, RibbonAnimationsSectionComponent as bV, RibbonArrangeSectionComponent as bW, RibbonColorPopoverComponent as bX, RibbonComponent as bY, RibbonDesignSectionComponent as bZ, RibbonDrawSectionComponent as b_, MediaPropertiesPanelComponent as ba, MediaRendererComponent as bb, MediaTrimTimelineComponent as bc, MobileBottomBarComponent as bd, MobileMenuSheetComponent as be, MobilePresenterViewComponent as bf, MobileSheetComponent as bg, MobileSlidesSheetComponent as bh, MobileToolbarComponent as bi, ModalDialogComponent as bj, Model3DRendererComponent as bk, NotesHandoutCardComponent as bl, NotesPanelComponent as bm, NotesToolbarComponent as bn, OleRendererComponent as bo, OutlineViewOverlayComponent as bp, POWER_POINT_VIEWER_PROVIDERS as bq, PRESENTER_CHANNEL_NAME as br, PRESENTER_MSG_ORIGIN as bs, PRESENTER_TIMER_SEGMENT_MS as bt, PX_PER_CM as bu, PX_PER_INCH as bv, PasswordProtectionDialogComponent as bw, PasswordStrengthMeterComponent as bx, PowerPointViewerComponent as by, PresentToolbarAutoHide as bz, AUDIENCE_NONCE_KEY as c, TIMING_CURVE_OPTIONS as c$, RibbonEditingSectionComponent as c0, RibbonFileSectionComponent as c1, RibbonFontControlsComponent as c2, RibbonHomeSectionComponent as c3, RibbonHyperlinkButtonComponent as c4, RibbonInsertFieldsComponent as c5, RibbonInsertSectionComponent as c6, RibbonMotionPathGalleryComponent as c7, RibbonParagraphControlsComponent as c8, RibbonPrimaryRowComponent as c9, ShowOptionsFieldsetComponent as cA, ShowSlidesFieldsetComponent as cB, SignatureStrippedDialogComponent as cC, SignaturesPanelComponent as cD, SignaturesService as cE, SlideBackgroundCardComponent as cF, SlideCanvasComponent as cG, SlideDefaultInspectorComponent as cH, SlideDiffChangesComponent as cI, SlideDiffRowComponent as cJ, SlideDiffThumbnailsComponent as cK, SlideSizeCardComponent as cL, SlideSorterOverlayComponent as cM, SlideThemeOverridePanelComponent as cN, SlideTransitionCardComponent as cO, SlidesPanelComponent as cP, SmartArt3DRendererComponent as cQ, SmartArt3DService as cR, SmartArtPreviewComponent as cS, SmartArtPropertiesComponent as cT, SmartArtRendererComponent as cU, StatusBarComponent as cV, TABLE_STRUCTURE_TOGGLES as cW, TEXT_3D_BOTTOM_BEVEL_KEYS as cX, TEXT_3D_TOP_BEVEL_KEYS as cY, TEXT_DIRECTION_OPTIONS$1 as cZ, THEME_CATALOG as c_, RibbonReviewSectionComponent as ca, RibbonShapeExtrasComponent as cb, RibbonSlideshowSectionComponent as cc, RibbonTransitionsSectionComponent as cd, RibbonViewSectionComponent as ce, RulerGuidesService as cf, SEQUENCE_OPTIONS as cg, SEVERITY_GROUPS as ch, SEVERITY_LABELS as ci, SHORTCUT_REFERENCE_ITEMS as cj, SLIDE_TRANSITION_KEYFRAMES as ck, DEFAULT_PALETTE as cl, PALETTES$1 as cm, SMART_ART_COLOR_SCHEMES as cn, SMART_ART_STYLE_OPTIONS as co, SUB_ITEM_LABEL as cp, SVG_WARP_PRESETS as cq, SWIPE_MAX_VERTICAL_PX as cr, SWIPE_THRESHOLD_PX as cs, SelectionPaneComponent as ct, SetUpSlideShowDialogComponent as cu, SettingsAppearanceTabComponent as cv, SettingsDialogComponent as cw, SettingsLanguageTabComponent as cx, ShareDialogComponent as cy, ShortcutPanelComponent as cz, AVATAR_COLOR_SWATCHES as d, applyAnimationPreset as d$, TRIGGER_OPTIONS as d0, TYPE_LABELS as d1, TableCellAdvancedFillComponent as d2, TableCellFormattingComponent as d3, TableDataEditorComponent as d4, TablePropertiesComponent as d5, TableRendererComponent as d6, TableResizeOverlayComponent as d7, TableSelectionService as d8, TagsCardComponent as d9, ViewerInspectorPanelService as dA, ViewerKeyboardService as dB, ViewerMobileSheetService as dC, ViewerPresentationModeService as dD, ViewerThemeGalleryService as dE, ViewerTouchGesturesService as dF, ViewerZoomService as dG, WEBM_MIME_CANDIDATES as dH, WriteBackScheduler as dI, ZERO_LINE_COLOR as dJ, ZoomNavigationService as dK, ZoomRendererComponent as dL, ZoomTargetService as dM, addCategory as dN, addCommentToList as dO, addGradientStopPatch as dP, addItem as dQ, addSeries as dR, addSubItem as dS, advanceStep as dT, affordanceElements as dU, aiToggleVisible as dV, alignPatch as dW, animationFor as dX, animationPresetLabelKey as dY, annotationMapToInkInserts as dZ, applyAcceptedDiff as d_, Text3DBevelSectionComponent as da, Text3DPanelComponent as db, TextAdvancedPanelComponent as dc, ThemeEditorFieldsComponent as dd, ThemeGalleryComponent as de, ThemeSelectorCardComponent as df, TitleBarComponent as dg, TitleBarSearchComponent as dh, TransitionDirectionPickerComponent as di, TransitionPreviewComponent as dj, VALIGN_OPTIONS as dk, VIEWER_THEME as dl, VersionHistoryPanelComponent as dm, ViewerCanvasEditingService as dn, ViewerCollabCursorService as dp, ViewerCollaborationSessionService as dq, ViewerCompareService as dr, ViewerCustomShowsService as ds, ViewerDialogsService as dt, ViewerDocumentPropertiesService as du, ViewerExportService as dv, ViewerExtraDialogsComponent as dw, ViewerFileIOService as dx, ViewerFindReplaceService as dy, ViewerFormatPainterService as dz, AXIS_LABEL_COLOR as e, buildZoomViewModel as e$, applyFindReplacements as e0, applyFormatToElement as e1, applyMove as e2, applyResize as e3, applyTableStylePreset as e4, asMediaElement as e5, assignUserColor as e6, attachShowVisibilityPause as e7, attachTouchGestures as e8, axisTickValues as e9, buildFontFaceRule as eA, buildGradientFillCss as eB, buildGridlinesAndLabels as eC, buildHyperlinkPatch as eD, buildInkContainerStyle as eE, buildInkStrokes as eF, buildLegend as eG, buildModel3DContainerStyle as eH, buildModel3DViewModel as eI, buildOleActionModel as eJ, buildOleInfoRows as eK, buildPatternFillCss as eL, buildPrintHtmlDocument as eM, buildPropertiesPatch as eN, buildRegionMapViewModel as eO, buildSaveSlides as eP, buildShareUrl as eQ, buildSmartArtInsertElement as eR, buildSmartArtNodes as eS, buildStockViewModel as eT, buildSurfaceViewModel as eU, buildTableViewModel as eV, buildTreemapViewModel as eW, buildTrimFragment as eX, buildWaterfallViewModel as eY, buildZeroLine as eZ, buildZoomContainerStyle as e_, beginNodeEdit as ea, bevelSizePatch as eb, boolFromEvent as ec, bringForward as ed, bringToFront as ee, buildBarActions as ef, buildBroadcastConfig as eg, buildBroadcastViewerUrl as eh, buildCategoryLabels as ei, buildCellParagraphs as ej, buildChartViewModel as ek, buildChatLogExport as el, buildChatLogMarkdown as em, buildChromeStyle as en, buildClearHyperlinkPatch as eo, buildClickGroups as ep, buildColStyles as eq, buildCollaborationConfig as er, buildComboViewModel as es, buildCssGradientFromShapeStyle as et, buildDuotoneFilter as eu, buildDuotoneFilterId as ev, buildEmbeddedFontStyles as ew, buildEquationElement as ex, buildEquationSegment as ey, buildFallbackViewModel as ez, AccessibilityPanelComponent as f, computeTextLines as f$, bulletIndentPx as f0, canAddTopLevelNode as f1, canGroupSelection as f2, canRemoveTopLevelNode as f3, canSetStrokeWidth as f4, canStartBroadcast as f5, canStartShare as f6, canUngroupSelection as f7, canUseClipboard as f8, captionDisplayText as f9, computeBubbleRadius as fA, computeCornerHandle as fB, computeDataTablePrimitives as fC, computeDistribute as fD, computeDrawingViewBox as fE, computeErrorBarPrimitives as fF, computeFocusTargets as fG, computeHandleBoxes as fH, computeHandoutLayout as fI, computeIsMobile as fJ, computeIsTablet as fK, computeLinePoints as fL, computeLinearRegression as fM, computePageCount as fN, computePieLayout as fO, computePieSlicePath as fP, computePieSlices as fQ, computePlotLayout as fR, computeRSquared as fS, computeRadarPoints as fT, computeScatterDots as fU, computeSelectionBoxes as fV, computeSingleSelected as fW, computeSlideIndices as fX, computeSnap as fY, computeStackedBarRects as fZ, computeStackedValueRange as f_, cellRunStyle as fa, cellStyleToStyleMap as fb, cellTdStyle as fc, changeCountLabel as fd, changeIcon as fe, characterSpacingPatch as ff, checkFontAvailable as fg, clampCursorPosition as fh, clampGifDimensions as fi, clampIndex as fj, clampNotesFontSize as fk, clampScale as fl, clampStep as fm, clearAllLocalViewerData as fn, clearAudienceContent as fo, cn as fp, collectAccessibilityIssues as fq, collectElementText as fr, collectSlideText as fs, collectStoredChats as ft, collectUsedFontFamilies as fu, columnWidthStyle as fv, commitNodeText as fw, computeAlign as fx, computeAxisTitlePrimitives as fy, computeBarRects as fz, AccessibilityService as g, formatPropertyDate as g$, computeTrendlinePrimitives as g0, computeValueRange as g1, convertOmmlToMathMl as g2, copyFormatFromElement as g3, countAccessibilityIssues as g4, countAnnotationStrokes as g5, createAngularAiBridge as g6, createCustomShow as g7, createSwipeDismissDrag as g8, createWebrtcBundle as g9, enableSoftEdgePatch as gA, encodeGif as gB, endShowMediaCleanup as gC, estimatePageCount as gD, evenColumnWidths as gE, evenRowHeights as gF, exitPresentationFullscreen as gG, exportAiChatLogs as gH, extractPathPoints as gI, eyedropperAvailable as gJ, fillColorOf as gK, findInSlides as gL, findOwningSlideIndex as gM, findSlideIndexByElementId as gN, firstVisibleIndex as gO, fitPolynomial as gP, fitZoom as gQ, focusTargetChips as gR, fontMimeForFormat as gS, fontSizeOf as gT, forgetSessionDeck as gU, formatAutoNumber as gV, formatAxisValue as gW, formatBytes as gX, formatCursorLabel as gY, formatElapsed as gZ, formatFileSize as g_, createWebsocketBundle as ga, cssObjectToStyleMap as gb, currentColorScheme as gc, currentLayout as gd, currentStyle as ge, defaultCssVars as gf, defaultRadius as gg, defaultThemeColors as gh, deleteElementsByIds as gi, deleteVersion as gj, demoteNode as gk, deriveModel3DBlobUrl as gl, derivePresenceList as gm, describeSmartArtBounds as gn, disableGlowPatch as go, disableInnerShadowPatch as gp, disableOuterShadowPatch as gq, disableReflectionPatch as gr, disableSoftEdgePatch as gs, duplicateElementById as gt, durationOf as gu, effectsStateOf as gv, enableGlowPatch as gw, enableInnerShadowPatch as gx, enableOuterShadowPatch as gy, enableReflectionPatch as gz, AccountPageComponent as h, isSigned as h$, formatTime as h0, fpsToFrameIntervalMs as h1, generateBroadcastRoomId as h2, generateCommentId as h3, generateCustomShowId as h4, generatePressureCircles as h5, generateTicks as h6, getClrChangeParams as h7, getContainerStyle as h8, getDuotoneFilterDef as h9, gradientStateOf as hA, gradientStatePatch as hB, gridColumns as hC, groupElements as hD, groupIssuesBySeverity as hE, hasAnimation as hF, hasCopyableFormat as hG, hasExistingLink as hH, hasExitedFullscreen as hI, hasGradientFill as hJ, hasPressureVariation as hK, hasVisibleSlideAfter as hL, headerLabel as hM, imageDimensions as hN, inkViewBox as hO, insertTableElementColumn as hP, insertTableElementRow as hQ, interpolateWidth as hR, isAudienceTab as hS, isBold as hT, isBrowserOpenableMime as hU, isChildNode as hV, isElementInteractive as hW, isInjectableUrl as hX, isItalic as hY, isPpactionUrl as hZ, isPresenterMessage as h_, getImageSrc as ha, getLocalStorageUsageSummary as hb, getOleAriaLabel as hc, getOleBadgeLabel as hd, getOleDisplayName as he, getOleDownloadFileName as hf, getOleTypeColor as hg, getOleTypeLabel as hh, getPasswordStrength as hi, getPatternSvg as hj, getPlaceholderStyle as hk, getVersions as hl, getResolvedShapeClipPath as hm, getResolvedShapeClipPathFor as hn, getSessionTabId as ho, getShapeFillStrokeStyle as hp, getSlideBackgroundStyle as hq, getSlideTransitionAnimations as hr, getSmartArtNodeBounds as hs, getSpeechRecognitionCtor as ht, getTextBlockStyle as hu, getTextWarp as hv, getTouchDistance as hw, getWarpCategory as hx, getWarpPath as hy, gradientStateFromStyle as hz, ActionSettingsPanelComponent as i, pendingElementStyles as i$, isTextElement as i0, isTwoTableFocus as i1, isUnderline as i2, isUrlSafe as i3, isValidRoomId as i4, isViewportBackgroundPressTarget as i5, isZoomActivationKey as i6, issueTrackKey as i7, issueTypeLabel as i8, keyToLabel as i9, newTableElement as iA, newTextElement as iB, nextVisibleIndex as iC, nodeBold as iD, nodeEditBox as iE, nodeFillColor as iF, nodeFontColor as iG, nodeIdFromKey as iH, nodeItalic as iI, nodeStyle as iJ, normalizeFontFormat as iK, normalizeSlidesPerPage as iL, normalizeValue as iM, numFromEvent as iN, ommlToMathml as iO, ooxmlDashToCssBorderStyle as iP, openNativeEyeDropper as iQ, overallStatus as iR, paletteColor as iS, parseAudienceNonce as iT, parseNodeTextarea as iU, partitionSlides as iV, patchChartData as iW, patchChartStyle as iX, patchTableData as iY, patchTextStyle as iZ, patternPresetOptions as i_, lastVisibleIndex as ia, latexToMathml as ib, linePointsToSvgString as ic, lineSpacingPatch as id, loadAudienceContent as ie, loadSessionDeck as ig, mediaFallbackFor as ih, mediaSurfaceFor as ii, mergeCaptionResults as ij, mergeDown as ik, mergeRight as il, mergeSelection as im, moveElementBy as io, moveNodeDown as ip, moveNodeUp as iq, msToFrameDelayCs as ir, narrowToCircle as is, narrowToPolygon as it, narrowToRect as iu, newChartElement as iv, newEquationElement as iw, newPresetShapeElement as ix, newShapeElement as iy, newSmartArtElement as iz, AdvancedChartEditorComponent as j, sanitizeSlideIndex as j$, pickColorByClickFallback as j0, pickFile as j1, pickSupportedMimeType as j2, planGifFrames as j3, planVideoSegments as j4, pointsToSvgPathD as j5, presenceToCursors as j6, presentationStageStyle as j7, presenterTimerProgress as j8, presetByLayout as j9, replaceMatch as jA, requestPresentationFullscreen as jB, resizeElement as jC, resolveCaptionTracks as jD, resolveChartKind as jE, resolveFontVariant as jF, resolveHyperlinkHref as jG, resolveInteractiveElementId as jH, resolveMediaSrc as jI, resolveOleType as jJ, resolveParagraphBullet as jK, resolvePresenterNotes as jL, resolveProfileInitial as jM, resolveRegionCode as jN, resolveSlideAutoAdvanceMs as jO, resolvePalette as jP, resolveThemeCatalogEntry as jQ, resolveTransitionDuration as jR, restoreSessionDeck as jS, revealedElementStyles as jT, routeOrthogonalConnector as jU, rowStyle as jV, rulerDragToGuidePosition as jW, rulerHighlight as jX, rulerStripTicks as jY, sampleColorFromSlide as jZ, sanitizeColor as j_, presetsForCategory as ja, pressuresToWidths as jb, prevVisibleIndex as jc, projectDrawingShapes as jd, promoteNode as je, provideViewerTheme as jf, radarAngle as jg, radarRingPoints as jh, readAsDataUrl as ji, recordWebm as jj, redistributeColumnWidth as jk, registerCrossSlideAudio as jl, rememberSessionDeck as jm, removeAnimation as jn, removeCategory as jo, removeTableElementColumn as jp, removeCommentFromList as jq, removeElementAnimation as jr, removeGradientStopPatch as js, removeNode as jt, removeTableElementRow as ju, removeSeries as jv, renderToCanvas as jw, reorderAnimationDown as jx, reorderAnimationUp as jy, replaceInSlides as jz, AiChangeOverlayComponent as k, statusLabel as k$, sanitizeUserName as k0, saveViewerProfile as k1, scanAvailableFonts as k2, searchSlides as k3, seedBroadcastFields as k4, seedHyperlinkDraft as k5, seedPropertiesDraft as k6, seedShareFields as k7, segmentFrameCount as k8, selectValue$2 as k9, setNodeStyle as kA, setNodeText as kB, setRepeatCount as kC, setRepeatMode as kD, setSequence as kE, setSeriesChartType as kF, setSeriesColor as kG, setSeriesErrorBars as kH, setSeriesMarker as kI, setSeriesName as kJ, setSeriesTrendline as kK, setSeriesValue as kL, setStyle as kM, setTimingCurve as kN, setTitle as kO, setTrigger as kP, setTriggerShapeId as kQ, shapeStylePatch as kR, sheetAfterNavigate as kS, shouldBlockClickAdvance as kT, shouldUseSvgWarp as kU, showDirectionPicker as kV, showsTemplateAffordance as kW, signatureCountLabel as kX, signatureKey as kY, signatureTimestamp as kZ, signerName as k_, sendBackward as ka, sendToBack as kb, sequentialColorScale as kc, serializeWriteBack as kd, seriesColor as ke, setAnimationEmphasis as kf, setAnimationEntrance as kg, setAnimationExit as kh, setAxis as ki, setAxisLogScale as kj, setAxisTitleStyle as kk, setCategoryLabel as kl, setCellText as km, setColorScheme as kn, setDataLabels as ko, setDataPointExplosion as kp, setDataPointFill as kq, setDataPointLabel as kr, setDataPointMarker as ks, setDelay as kt, setDirection as ku, setDuration as kv, setElementPosition as kw, setGridlineStyle as kx, setLayout as ky, setLegend as kz, AiChatPanelComponent as l, slideNumberOf as l0, smartArtNodes as l1, paletteColour as l2, snapToGridStep as l3, splitCursorCell as l4, splitMergedCell as l5, statusKind as l6, statusLabel$1 as l7, storeAudienceContent as l8, stringFromEvent$5 as l9, updateInnerShadowPatch as lA, updateOuterShadowPatch as lB, updateReflectionPatch as lC, vAlignPatch as lD, validatePassword as lE, validatePrintSettings as lF, validateRoomId as lG, valueToY as lH, vermilionDarkColors as lI, vermilionDarkTheme as lJ, vermilionLightColors as lK, vermilionLightTheme as lL, vermilionRadius as lM, waypointsToPathD as lN, worstStatus as lO, zoomTargetSlideIndex as lP, strokeColorOf as la, strokeToInkElement as lb, strokeWidthOf as lc, styleShadowFilter as ld, textAdvancedPatch as le, textAdvancedStateFromStyle as lf, textAdvancedStateOf as lg, textColorOf as lh, textDirectionPatch 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, ungroupElements as lw, updateElementById as lx, updateGlowPatch as ly, updateGradientStopPatch as lz, AiChatService as m, AiComposerComponent as n, AiFocusBarComponent as o, AiFocusHighlightOverlayComponent as p, AiHistoryMenuComponent as q, AiHistoryService as r, AiMessageListComponent as s, toChatSummary as t, AiPanelStore as u, AiProposalCardComponent as v, AiSettingsSectionComponent as w, AiToolCallCardComponent as x, AnimationAuthorPanelComponent as y, AnimationPanelComponent as z };
128778
- //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-CmK00hiK.mjs.map
129033
+ export { CommentsService as $, ALIGN_OPTIONS as A, AnimationPlaybackService as B, AutosaveService as C, BroadcastDialogComponent as D, CHART_EDITOR_STYLES as E, CURSOR_PALETTE as F, CanvasFitService as G, ChartAxisOptionsComponent as H, ChartAxisStyleOptionsComponent as I, ChartComboTypeOptionsComponent as J, ChartDataEditorComponent as K, ChartDataLabelOptionsComponent as L, ChartDatapointMarkerOptionsComponent as M, ChartDatapointOptionsComponent as N, ChartDisplayOptionsComponent as O, ChartElementViewComponent as P, ChartErrorBarOptionsComponent as Q, ChartMarkerOptionsComponent as R, ChartPartSelectionService as S, ChartPrimitivesComponent as T, ChartRendererComponent as U, ChartTrendlineOptionsComponent as V, CollaborationCursorsComponent as W, CollaborationService as X, ColorChangedImageComponent as Y, CommentMarkersOverlayComponent as Z, CommentsPanelComponent as _, ANIMATION_PRESET_CATEGORIES as a, IsMobileService as a$, ComparePanelComponent as a0, ConnectorRendererComponent as a1, ConnectorTextOverlayComponent as a2, CustomShowsComponent as a3, DATA_TABLE_HEADER_H as a4, DATA_TABLE_KEY_W as a5, DATA_TABLE_PADDING as a6, DATA_TABLE_ROW_H as a7, DEFAULT_BOUNDS as a8, DEFAULT_BROADCAST_SERVER_URL as a9, EffectsPanelComponent as aA, ElementRendererComponent as aB, EmbeddedFontsService as aC, EncryptedFileDialogComponent as aD, EquationEditorDialogComponent as aE, EquationRendererComponent as aF, EquationTemplateGalleryComponent as aG, ExportProgressModalComponent as aH, ExportService as aI, FieldContextService as aJ, FindBarComponent as aK, FindReplaceBarComponent as aL, FollowModeBarComponent as aM, FontEmbeddingListComponent as aN, FontEmbeddingPanelComponent as aO, GALLERY_THEME_PRESETS as aP, GRIDLINE_COLOR as aQ, GradientPickerComponent as aR, HANDOUT_OPTIONS as aS, HeaderFooterDialogComponent as aT, HyperlinkDialogComponent as aU, ImagePropertiesPanelComponent as aV, InkDrawingService as aW, InkRendererComponent as aX, InsertSmartArtDialogComponent as aY, InspectorPaneHeaderComponent as aZ, InspectorPanelComponent as a_, DEFAULT_CANVAS_HEIGHT as aa, DEFAULT_CANVAS_WIDTH as ab, DEFAULT_COLOR_SCHEME as ac, DEFAULT_FILL_COLOR 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$1 as am, DEFAULT_VIEWER_PROFILE as an, DIRECTIONAL_PRESETS as ao, DIRECTION_OPTIONS as ap, DocumentPropertiesCardComponent as aq, EMBEDDED_FONTS_STYLE_ID as ar, EMPHASIS_PRESETS as as, ENTRANCE_PRESETS as at, TEMPLATES as au, EXIT_PRESETS as av, EditorContextMenuComponent as aw, EditorHistory as ax, EditorStateService as ay, EditorToolbarComponent as az, AUDIENCE_HASH as b, RibbonDrawingGroupComponent as b$, KeepAnnotationsDialogComponent as b0, LOCALE_CATALOG as b1, LONG_PRESS_DURATION_MS as b2, LONG_PRESS_MOVE_TOLERANCE_PX as b3, LoadContentService as b4, LocalPresencePublisher as b5, MAX_ZOOM_SCALE as b6, MIN_ZOOM_SCALE as b7, MOTION_PATH_COLUMNS as b8, MediaPreviewComponent as b9, PresentationAnnotationOverlayComponent as bA, PresentationAnnotationsService as bB, PresentationOverlayComponent as bC, PresentationPropertiesPanelComponent as bD, PresentationSettingsCardComponent as bE, PresentationSubtitleBarComponent as bF, PresentationToolbarComponent as bG, PresentationTransitionOverlayComponent as bH, PresenterViewComponent as bI, PresenterWindowService as bJ, PrintDialogComponent as bK, PrintService as bL, PrintSettingsPanelComponent as bM, PropertiesDialogComponent as bN, REPEAT_MODE_OPTIONS as bO, RESIZE_HANDLES as bP, RULER_FONT_SIZE as bQ, RULER_THICKNESS as bR, ReadingViewOverlayComponent as bS, RemoteSelectionOverlayComponent as bT, RibbonAnimationGalleryComponent as bU, RibbonAnimationsSectionComponent as bV, RibbonArrangeSectionComponent as bW, RibbonColorPopoverComponent as bX, RibbonComponent as bY, RibbonDesignSectionComponent as bZ, RibbonDrawSectionComponent as b_, MediaPropertiesPanelComponent as ba, MediaRendererComponent as bb, MediaTrimTimelineComponent as bc, MobileBottomBarComponent as bd, MobileMenuSheetComponent as be, MobilePresenterViewComponent as bf, MobileSheetComponent as bg, MobileSlidesSheetComponent as bh, MobileToolbarComponent as bi, ModalDialogComponent as bj, Model3DRendererComponent as bk, NotesHandoutCardComponent as bl, NotesPanelComponent as bm, NotesToolbarComponent as bn, OleRendererComponent as bo, OutlineViewOverlayComponent as bp, POWER_POINT_VIEWER_PROVIDERS as bq, PRESENTER_CHANNEL_NAME as br, PRESENTER_MSG_ORIGIN as bs, PRESENTER_TIMER_SEGMENT_MS as bt, PX_PER_CM as bu, PX_PER_INCH as bv, PasswordProtectionDialogComponent as bw, PasswordStrengthMeterComponent as bx, PowerPointViewerComponent as by, PresentToolbarAutoHide as bz, AUDIENCE_NONCE_KEY as c, TIMING_CURVE_OPTIONS as c$, RibbonEditingSectionComponent as c0, RibbonFileSectionComponent as c1, RibbonFontControlsComponent as c2, RibbonHomeSectionComponent as c3, RibbonHyperlinkButtonComponent as c4, RibbonInsertFieldsComponent as c5, RibbonInsertSectionComponent as c6, RibbonMotionPathGalleryComponent as c7, RibbonParagraphControlsComponent as c8, RibbonPrimaryRowComponent as c9, ShowOptionsFieldsetComponent as cA, ShowSlidesFieldsetComponent as cB, SignatureStrippedDialogComponent as cC, SignaturesPanelComponent as cD, SignaturesService as cE, SlideBackgroundCardComponent as cF, SlideCanvasComponent as cG, SlideDefaultInspectorComponent as cH, SlideDiffChangesComponent as cI, SlideDiffRowComponent as cJ, SlideDiffThumbnailsComponent as cK, SlideSizeCardComponent as cL, SlideSorterOverlayComponent as cM, SlideThemeOverridePanelComponent as cN, SlideTransitionCardComponent as cO, SlidesPanelComponent as cP, SmartArt3DRendererComponent as cQ, SmartArt3DService as cR, SmartArtPreviewComponent as cS, SmartArtPropertiesComponent as cT, SmartArtRendererComponent as cU, StatusBarComponent as cV, TABLE_STRUCTURE_TOGGLES as cW, TEXT_3D_BOTTOM_BEVEL_KEYS as cX, TEXT_3D_TOP_BEVEL_KEYS as cY, TEXT_DIRECTION_OPTIONS$1 as cZ, THEME_CATALOG as c_, RibbonReviewSectionComponent as ca, RibbonShapeExtrasComponent as cb, RibbonSlideshowSectionComponent as cc, RibbonTransitionsSectionComponent as cd, RibbonViewSectionComponent as ce, RulerGuidesService as cf, SEQUENCE_OPTIONS as cg, SEVERITY_GROUPS as ch, SEVERITY_LABELS as ci, SHORTCUT_REFERENCE_ITEMS as cj, SLIDE_TRANSITION_KEYFRAMES as ck, DEFAULT_PALETTE as cl, PALETTES$1 as cm, SMART_ART_COLOR_SCHEMES as cn, SMART_ART_STYLE_OPTIONS as co, SUB_ITEM_LABEL as cp, SVG_WARP_PRESETS as cq, SWIPE_MAX_VERTICAL_PX as cr, SWIPE_THRESHOLD_PX as cs, SelectionPaneComponent as ct, SetUpSlideShowDialogComponent as cu, SettingsAppearanceTabComponent as cv, SettingsDialogComponent as cw, SettingsLanguageTabComponent as cx, ShareDialogComponent as cy, ShortcutPanelComponent as cz, AVATAR_COLOR_SWATCHES as d, applyAnimationPreset as d$, TRIGGER_OPTIONS as d0, TYPE_LABELS as d1, TableCellAdvancedFillComponent as d2, TableCellFormattingComponent as d3, TableDataEditorComponent as d4, TablePropertiesComponent as d5, TableRendererComponent as d6, TableResizeOverlayComponent as d7, TableSelectionService as d8, TagsCardComponent as d9, ViewerInspectorPanelService as dA, ViewerKeyboardService as dB, ViewerMobileSheetService as dC, ViewerPresentationModeService as dD, ViewerThemeGalleryService as dE, ViewerTouchGesturesService as dF, ViewerZoomService as dG, WEBM_MIME_CANDIDATES as dH, WriteBackScheduler as dI, ZERO_LINE_COLOR as dJ, ZoomNavigationService as dK, ZoomRendererComponent as dL, ZoomTargetService as dM, addCategory as dN, addCommentToList as dO, addGradientStopPatch as dP, addItem as dQ, addSeries as dR, addSubItem as dS, advanceStep as dT, affordanceElements as dU, aiToggleVisible as dV, alignPatch as dW, animationFor as dX, animationPresetLabelKey as dY, annotationMapToInkInserts as dZ, applyAcceptedDiff as d_, Text3DBevelSectionComponent as da, Text3DPanelComponent as db, TextAdvancedPanelComponent as dc, ThemeEditorFieldsComponent as dd, ThemeGalleryComponent as de, ThemeSelectorCardComponent as df, TitleBarComponent as dg, TitleBarSearchComponent as dh, TransitionDirectionPickerComponent as di, TransitionPreviewComponent as dj, VALIGN_OPTIONS as dk, VIEWER_THEME as dl, VersionHistoryPanelComponent as dm, ViewerCanvasEditingService as dn, ViewerCollabCursorService as dp, ViewerCollaborationSessionService as dq, ViewerCompareService as dr, ViewerCustomShowsService as ds, ViewerDialogsService as dt, ViewerDocumentPropertiesService as du, ViewerExportService as dv, ViewerExtraDialogsComponent as dw, ViewerFileIOService as dx, ViewerFindReplaceService as dy, ViewerFormatPainterService as dz, AXIS_LABEL_COLOR as e, buildZoomViewModel as e$, applyFindReplacements as e0, applyFormatToElement as e1, applyMove as e2, applyResize as e3, applyTableStylePreset as e4, asMediaElement as e5, assignUserColor as e6, attachShowVisibilityPause as e7, attachTouchGestures as e8, axisTickValues as e9, buildFontFaceRule as eA, buildGradientFillCss as eB, buildGridlinesAndLabels as eC, buildHyperlinkPatch as eD, buildInkContainerStyle as eE, buildInkStrokes as eF, buildLegend as eG, buildModel3DContainerStyle as eH, buildModel3DViewModel as eI, buildOleActionModel as eJ, buildOleInfoRows as eK, buildPatternFillCss as eL, buildPrintHtmlDocument as eM, buildPropertiesPatch as eN, buildRegionMapViewModel as eO, buildSaveSlides as eP, buildShareUrl as eQ, buildSmartArtInsertElement as eR, buildSmartArtNodes as eS, buildStockViewModel as eT, buildSurfaceViewModel as eU, buildTableViewModel as eV, buildTreemapViewModel as eW, buildTrimFragment as eX, buildWaterfallViewModel as eY, buildZeroLine as eZ, buildZoomContainerStyle as e_, beginNodeEdit as ea, bevelSizePatch as eb, boolFromEvent as ec, bringForward as ed, bringToFront as ee, buildBarActions as ef, buildBroadcastConfig as eg, buildBroadcastViewerUrl as eh, buildCategoryLabels as ei, buildCellParagraphs as ej, buildChartViewModel as ek, buildChatLogExport as el, buildChatLogMarkdown as em, buildChromeStyle as en, buildClearHyperlinkPatch as eo, buildClickGroups as ep, buildColStyles as eq, buildCollaborationConfig as er, buildComboViewModel as es, buildCssGradientFromShapeStyle as et, buildDuotoneFilter as eu, buildDuotoneFilterId as ev, buildEmbeddedFontStyles as ew, buildEquationElement as ex, buildEquationSegment as ey, buildFallbackViewModel as ez, AccessibilityPanelComponent as f, computeTrendlinePrimitives as f$, bulletIndentPx as f0, canAddTopLevelNode as f1, canGroupSelection as f2, canRemoveTopLevelNode as f3, canSetStrokeWidth as f4, canStartBroadcast as f5, canStartShare as f6, canUngroupSelection as f7, canUseClipboard as f8, captionDisplayText as f9, computeBubbleRadius as fA, computeCornerHandle as fB, computeDataTablePrimitives as fC, computeDistribute as fD, computeDrawingViewBox as fE, computeErrorBarPrimitives as fF, computeFocusTargets as fG, computeHandleBoxes as fH, computeHandoutLayout as fI, computeIsMobile as fJ, computeIsTablet as fK, computeLinePoints as fL, computeLinearRegression as fM, computePageCount as fN, computePieLayout as fO, computePieSlicePath as fP, computePieSlices as fQ, computePlotLayout as fR, computeRSquared as fS, computeRadarPoints as fT, computeScatterDots as fU, computeSelectionBoxes as fV, computeSingleSelected as fW, computeSlideIndices as fX, computeSnap as fY, computeStackedBarRects as fZ, computeStackedValueRange as f_, cellRunStyle as fa, cellStyleToStyleMap as fb, cellTdStyle as fc, changeCountLabel as fd, changeIcon as fe, characterSpacingPatch as ff, checkFontAvailable as fg, clampCursorPosition as fh, clampGifDimensions as fi, clampIndex as fj, clampNotesFontSize as fk, clampScale as fl, clampStep as fm, clearAllLocalViewerData as fn, clearAudienceContent as fo, cn as fp, collectAccessibilityIssues as fq, collectElementText as fr, collectSlideText as fs, collectStoredChats as ft, collectUsedFontFamilies as fu, columnWidthStyle as fv, commitNodeText as fw, computeAlign as fx, computeAxisTitlePrimitives as fy, computeBarRects as fz, AccessibilityService as g, formatTime as g$, computeValueRange as g0, convertOmmlToMathMl as g1, copyFormatFromElement as g2, countAccessibilityIssues as g3, countAnnotationStrokes as g4, createAngularAiBridge as g5, createCustomShow as g6, createSwipeDismissDrag as g7, createWebrtcBundle as g8, createWebsocketBundle as g9, encodeGif as gA, endShowMediaCleanup as gB, estimatePageCount as gC, evenColumnWidths as gD, evenRowHeights as gE, exitPresentationFullscreen as gF, exportAiChatLogs as gG, extractPathPoints as gH, eyedropperAvailable as gI, fillColorOf as gJ, findInSlides as gK, findOwningSlideIndex as gL, findSlideIndexByElementId as gM, firstVisibleIndex as gN, fitPolynomial as gO, fitZoom as gP, focusTargetChips as gQ, fontMimeForFormat as gR, fontSizeOf as gS, forgetSessionDeck as gT, formatAutoNumber as gU, formatAxisValue as gV, formatBytes as gW, formatCursorLabel as gX, formatElapsed as gY, formatFileSize as gZ, formatPropertyDate as g_, cssObjectToStyleMap as ga, currentColorScheme as gb, currentLayout as gc, currentStyle as gd, defaultCssVars as ge, defaultRadius as gf, defaultThemeColors as gg, deleteElementsByIds as gh, deleteVersion as gi, demoteNode as gj, deriveModel3DBlobUrl as gk, derivePresenceList as gl, describeSmartArtBounds as gm, disableGlowPatch as gn, disableInnerShadowPatch as go, disableOuterShadowPatch as gp, disableReflectionPatch as gq, disableSoftEdgePatch as gr, duplicateElementById as gs, durationOf as gt, effectsStateOf as gu, enableGlowPatch as gv, enableInnerShadowPatch as gw, enableOuterShadowPatch as gx, enableReflectionPatch as gy, enableSoftEdgePatch as gz, AccountPageComponent as h, isTextElement as h$, fpsToFrameIntervalMs as h0, generateBroadcastRoomId as h1, generateCommentId as h2, generateCustomShowId as h3, generatePressureCircles as h4, generateTicks as h5, getClrChangeParams as h6, getContainerStyle as h7, getDuotoneFilterDef as h8, getImageSrc as h9, gradientStatePatch as hA, gridColumns as hB, groupElements as hC, groupIssuesBySeverity as hD, hasAnimation as hE, hasCopyableFormat as hF, hasExistingLink as hG, hasExitedFullscreen as hH, hasGradientFill as hI, hasPressureVariation as hJ, hasVisibleSlideAfter as hK, headerLabel as hL, imageDimensions as hM, inkViewBox as hN, insertTableElementColumn as hO, insertTableElementRow as hP, interpolateWidth as hQ, isAudienceTab as hR, isBold as hS, isBrowserOpenableMime as hT, isChildNode as hU, isElementInteractive as hV, isInjectableUrl as hW, isItalic as hX, isPpactionUrl as hY, isPresenterMessage as hZ, isSigned as h_, getLocalStorageUsageSummary as ha, getOleAriaLabel as hb, getOleBadgeLabel as hc, getOleDisplayName as hd, getOleDownloadFileName as he, getOleTypeColor as hf, getOleTypeLabel as hg, getPasswordStrength as hh, getPatternSvg as hi, getPlaceholderStyle as hj, getVersions as hk, getResolvedShapeClipPath as hl, getResolvedShapeClipPathFor as hm, getSessionTabId as hn, getShapeFillStrokeStyle as ho, getSlideBackgroundStyle as hp, getSlideTransitionAnimations as hq, getSmartArtNodeBounds as hr, getSpeechRecognitionCtor as hs, getTextBlockStyle as ht, getTextWarp as hu, getTouchDistance as hv, getWarpCategory as hw, getWarpPath as hx, gradientStateFromStyle as hy, gradientStateOf as hz, ActionSettingsPanelComponent as i, pickColorByClickFallback as i$, isTwoTableFocus as i0, isUnderline as i1, isUrlSafe as i2, isValidRoomId as i3, isViewportBackgroundPressTarget as i4, isZoomActivationKey as i5, issueTrackKey as i6, issueTypeLabel as i7, keyToLabel as i8, lastVisibleIndex as i9, newTextElement as iA, nextVisibleIndex as iB, nodeBold as iC, nodeEditBox as iD, nodeFillColor as iE, nodeFontColor as iF, nodeIdFromKey as iG, nodeItalic as iH, nodeStyle as iI, normalizeFontFormat as iJ, normalizeSlidesPerPage as iK, normalizeValue as iL, numFromEvent as iM, ommlToMathml as iN, ooxmlDashToCssBorderStyle as iO, openNativeEyeDropper as iP, overallStatus as iQ, paletteColor as iR, parseAudienceNonce as iS, parseNodeTextarea as iT, partitionSlides as iU, patchChartData as iV, patchChartStyle as iW, patchTableData as iX, patchTextStyle as iY, patternPresetOptions as iZ, pendingElementStyles as i_, latexToMathml as ia, linePointsToSvgString as ib, lineSpacingPatch as ic, loadAudienceContent as id, loadSessionDeck as ie, mediaFallbackFor as ig, mediaSurfaceFor as ih, mergeCaptionResults as ii, mergeDown as ij, mergeRight as ik, mergeSelection as il, moveElementBy as im, moveNodeDown as io, moveNodeUp as ip, msToFrameDelayCs as iq, narrowToCircle as ir, narrowToPolygon as is, narrowToRect as it, newChartElement as iu, newEquationElement as iv, newPresetShapeElement as iw, newShapeElement as ix, newSmartArtElement as iy, newTableElement as iz, AdvancedChartEditorComponent as j, sanitizeUserName as j$, pickFile as j0, pickSupportedMimeType as j1, planGifFrames as j2, planVideoSegments as j3, pointsToSvgPathD as j4, presenceToCursors as j5, presentationStageStyle as j6, presenterTimerProgress as j7, presetByLayout as j8, presetsForCategory as j9, requestPresentationFullscreen as jA, resizeElement as jB, resolveCaptionTracks as jC, resolveChartKind as jD, resolveFontVariant as jE, resolveHyperlinkHref as jF, resolveInteractiveElementId as jG, resolveMediaSrc as jH, resolveOleType as jI, resolveParagraphBullet as jJ, resolvePresenterNotes as jK, resolveProfileInitial as jL, resolveRegionCode as jM, resolveSlideAutoAdvanceMs as jN, resolvePalette as jO, resolveThemeCatalogEntry as jP, resolveTransitionDuration as jQ, restoreSessionDeck as jR, revealedElementStyles as jS, routeOrthogonalConnector as jT, rowStyle as jU, rulerDragToGuidePosition as jV, rulerHighlight as jW, rulerStripTicks as jX, sampleColorFromSlide as jY, sanitizeColor as jZ, sanitizeSlideIndex as j_, pressuresToWidths as ja, prevVisibleIndex as jb, projectDrawingShapes as jc, promoteNode as jd, provideViewerTheme as je, radarAngle as jf, radarRingPoints as jg, readAsDataUrl as jh, recordWebm as ji, redistributeColumnWidth as jj, registerCrossSlideAudio as jk, rememberSessionDeck as jl, removeAnimation as jm, removeCategory as jn, removeTableElementColumn as jo, removeCommentFromList as jp, removeElementAnimation as jq, removeGradientStopPatch as jr, removeNode as js, removeTableElementRow as jt, removeSeries as ju, renderToCanvas as jv, reorderAnimationDown as jw, reorderAnimationUp as jx, replaceInSlides as jy, replaceMatch as jz, AiChangeOverlayComponent as k, slideNumberOf as k$, saveViewerProfile as k0, scanAvailableFonts as k1, searchSlides as k2, seedBroadcastFields as k3, seedHyperlinkDraft as k4, seedPropertiesDraft as k5, seedShareFields as k6, segmentFrameCount as k7, selectValue$2 as k8, sendBackward as k9, setNodeText as kA, setRepeatCount as kB, setRepeatMode as kC, setSequence as kD, setSeriesChartType as kE, setSeriesColor as kF, setSeriesErrorBars as kG, setSeriesMarker as kH, setSeriesName as kI, setSeriesTrendline as kJ, setSeriesValue as kK, setStyle as kL, setTimingCurve as kM, setTitle as kN, setTrigger as kO, setTriggerShapeId as kP, shapeStylePatch as kQ, sheetAfterNavigate as kR, shouldBlockClickAdvance as kS, shouldUseSvgWarp as kT, showDirectionPicker as kU, showsTemplateAffordance as kV, signatureCountLabel as kW, signatureKey as kX, signatureTimestamp as kY, signerName as kZ, statusLabel as k_, sendToBack as ka, sequentialColorScale as kb, serializeWriteBack as kc, seriesColor as kd, setAnimationEmphasis as ke, setAnimationEntrance as kf, setAnimationExit as kg, setAxis as kh, setAxisLogScale as ki, setAxisTitleStyle as kj, setCategoryLabel as kk, setCellText as kl, setColorScheme as km, setDataLabels as kn, setDataPointExplosion as ko, setDataPointFill as kp, setDataPointLabel as kq, setDataPointMarker as kr, setDelay as ks, setDirection as kt, setDuration as ku, setElementPosition as kv, setGridlineStyle as kw, setLayout as kx, setLegend as ky, setNodeStyle as kz, AiChatPanelComponent as l, slidesWithReappliedLayout as l0, smartArtNodes as l1, paletteColour as l2, snapToGridStep as l3, splitCursorCell as l4, splitMergedCell as l5, statusKind as l6, statusLabel$1 as l7, storeAudienceContent as l8, stringFromEvent$5 as l9, updateInnerShadowPatch as lA, updateOuterShadowPatch as lB, updateReflectionPatch as lC, vAlignPatch as lD, validatePassword as lE, validatePrintSettings as lF, validateRoomId as lG, valueToY as lH, vermilionDarkColors as lI, vermilionDarkTheme as lJ, vermilionLightColors as lK, vermilionLightTheme as lL, vermilionRadius as lM, waypointsToPathD as lN, worstStatus as lO, zoomTargetSlideIndex as lP, strokeColorOf as la, strokeToInkElement as lb, strokeWidthOf as lc, styleShadowFilter as ld, textAdvancedPatch as le, textAdvancedStateFromStyle as lf, textAdvancedStateOf as lg, textColorOf as lh, textDirectionPatch 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, ungroupElements as lw, updateElementById as lx, updateGlowPatch as ly, updateGradientStopPatch as lz, AiChatService as m, AiComposerComponent as n, AiFocusBarComponent as o, AiFocusHighlightOverlayComponent as p, AiHistoryMenuComponent as q, AiHistoryService as r, AiMessageListComponent as s, toChatSummary as t, AiPanelStore as u, AiProposalCardComponent as v, AiSettingsSectionComponent as w, AiToolCallCardComponent as x, AnimationAuthorPanelComponent as y, AnimationPanelComponent as z };
129034
+ //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-DrDhSsha.mjs.map