pptx-angular-viewer 2.17.4 → 2.17.6

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
  }
@@ -36856,6 +36861,22 @@ function generateMorphGhostAnimations(pairs, durationMs, startIndex, ghostIds) {
36856
36861
  if (ghostIds && !ghostIds.has(fromElement.id)) {
36857
36862
  continue;
36858
36863
  }
36864
+ // An INERT pair's ghost is a pixel-identical copy of what the live stage
36865
+ // already draws, painted only so a dissolving backdrop below it is not
36866
+ // seen through it. Its keyframes would run from itself to itself, which
36867
+ // changes nothing over time - but a running animation is not free: the
36868
+ // browser gives the shape its own compositing layer and rasterises that
36869
+ // layer on whole device pixels, so a box at a fractional position or size
36870
+ // is painted up to a pixel smaller and offset for the whole morph, then
36871
+ // snaps back the moment the overlay comes down. That is issue #161's
36872
+ // "micro-movements": the centre panel's button measured 1.2px narrower
36873
+ // and 1px shorter while the morph ran. Painting the ghost statically is
36874
+ // both faithful and cheaper; the plan still lists it in
36875
+ // `outgoingElements`, which is derived from the ghost set rather than
36876
+ // from this map.
36877
+ if (isInertMorphPair(fromElement, toElement)) {
36878
+ continue;
36879
+ }
36859
36880
  const fadesOut = morphPairNeedsCrossfade(fromElement, toElement);
36860
36881
  const safeName = `pptx-morph-ghost-${startIndex + index}-${fromElement.id.replace(/[^a-zA-Z0-9]/gu, '')}`;
36861
36882
  // Mirror of the incoming half: a text box that only changed its wording
@@ -37202,6 +37223,7 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = 'object
37202
37223
  // - and leave the group itself without an animation.
37203
37224
  const flattenedOutgoing = flattenMorphElements(fromSlide.elements, toSlide.elements);
37204
37225
  const outgoingIds = new Set(flattenedOutgoing.map((element) => element.id));
37226
+ const ghostIds = resolveMorphGhostIds(flattenedOutgoing, match.pairs);
37205
37227
  const incomingAnimations = new Map();
37206
37228
  const outgoingAnimations = new Map();
37207
37229
  const incomingImageAnimations = new Map();
@@ -37222,13 +37244,18 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = 'object
37222
37244
  : incomingAnimations;
37223
37245
  target.set(animation.elementId, animation.animation);
37224
37246
  }
37225
- // An outgoing shape with no animation is one whose ghost the engine dropped
37226
- // as redundant: its live counterpart draws the same thing along the same
37227
- // path, so painting it again in the overlay would only hide what is arriving
37228
- // beneath it (issue #144 - the detail slide's callouts never appeared until
37229
- // the overlay came down). Deriving the list from the animations keeps this
37230
- // decision in one place, `resolveMorphGhostIds`.
37231
- const outgoingElements = flattenedOutgoing.filter((element) => outgoingAnimations.has(element.id));
37247
+ // Which outgoing shapes the overlay paints is `resolveMorphGhostIds`' call
37248
+ // and nothing else's: a shape whose ghost it drops draws the same thing on
37249
+ // the live stage along the same path, and painting it again in the overlay
37250
+ // would only hide what is arriving beneath it (issue #144 - the detail
37251
+ // slide's callouts never appeared until the overlay came down).
37252
+ //
37253
+ // Painted is NOT the same question as animated. A ghost standing in for an
37254
+ // inert pair is deliberately given no animation, because a running one would
37255
+ // put it on its own compositing layer and shift its raster by up to a pixel
37256
+ // for the duration (issue #161); it still has to be painted, so this asks
37257
+ // the ghost set directly rather than reading it off the animation map.
37258
+ const outgoingElements = flattenedOutgoing.filter((element) => ghostIds.has(element.id));
37232
37259
  // Everything the overlay paints hides whatever the live stage is doing
37233
37260
  // underneath, which is wrong for a shape that ARRIVES on top of a ghost:
37234
37261
  // it dissolves in where nobody can see it and appears in one frame when the
@@ -37242,7 +37269,7 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = 'object
37242
37269
  // so it hides nothing worth moving an animation for.
37243
37270
  const flattenedIncoming = flattenMorphElements(toSlide.elements, fromSlide.elements);
37244
37271
  const holdingGhostIds = new Set(match.pairs
37245
- .filter((candidate) => outgoingAnimations.has(candidate.fromElement.id) &&
37272
+ .filter((candidate) => ghostIds.has(candidate.fromElement.id) &&
37246
37273
  !morphPairNeedsCrossfade(candidate.fromElement, candidate.toElement))
37247
37274
  .map((candidate) => candidate.fromElement.id));
37248
37275
  // A matched pair's incoming half can be hidden by a holding ghost just as
@@ -37251,7 +37278,7 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = 'object
37251
37278
  // IN may be lifted over its own ghost. One pinned at full strength has to
37252
37279
  // stay underneath it, or the crossfade becomes a cut.
37253
37280
  const dissolvingInIds = new Set(match.pairs
37254
- .filter((candidate) => morphPairIncomingFadesIn(candidate.fromElement, candidate.toElement, outgoingAnimations.has(candidate.fromElement.id)))
37281
+ .filter((candidate) => morphPairIncomingFadesIn(candidate.fromElement, candidate.toElement, ghostIds.has(candidate.fromElement.id)))
37255
37282
  .map((candidate) => candidate.toElement.id));
37256
37283
  const lifted = resolveMorphOverlayArrivals(flattenedOutgoing, flattenedIncoming, match.pairs, holdingGhostIds, dissolvingInIds);
37257
37284
  const overlayIncomingAnimations = new Map();
@@ -46107,6 +46134,40 @@ function computeSmartArtLayout(nodes, box, palette, style, elementId, resolvedLa
46107
46134
  * with the origin at the top-left; the model builder performs the flip.
46108
46135
  */
46109
46136
 
46137
+ /**
46138
+ * Readable-text-colour selection for fills whose text colour was left implicit.
46139
+ *
46140
+ * PowerPoint stores no colour for a great many runs and resolves one at paint
46141
+ * time from what is behind them. Renderers that instead pick a fixed colour get
46142
+ * white text on white panels, so both the 2D and 3D SmartArt paths need the same
46143
+ * decision, made the same way.
46144
+ *
46145
+ * @module color-contrast
46146
+ */
46147
+ /** Parse `#rgb`/`#rrggbb` into `[r, g, b]` (0..255); falls back to mid-grey. */
46148
+ function parseHex(hex) {
46149
+ let h = hex.trim().replace(/^#/u, '');
46150
+ if (h.length === 3) {
46151
+ h = h
46152
+ .split('')
46153
+ .map((c) => c + c)
46154
+ .join('');
46155
+ }
46156
+ if (h.length !== 6 || /[^0-9a-fA-F]/u.test(h)) {
46157
+ return [128, 128, 128];
46158
+ }
46159
+ return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];
46160
+ }
46161
+ /**
46162
+ * Pick a readable text colour (near-black or near-white) for a given fill,
46163
+ * using the WCAG relative-luminance threshold.
46164
+ */
46165
+ function contrastTextColor(fill) {
46166
+ const [r, g, b] = parseHex(fill);
46167
+ const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
46168
+ return lum > 0.6 ? '#1a1a1a' : '#ffffff';
46169
+ }
46170
+
46110
46171
  /**
46111
46172
  * Three.js SmartArt renderer - pure geometry & colour helpers.
46112
46173
  *
@@ -46283,29 +46344,6 @@ function boundsOf(points) {
46283
46344
  height: maxY - minY,
46284
46345
  };
46285
46346
  }
46286
- /** Parse `#rgb`/`#rrggbb` into `[r, g, b]` (0..255); falls back to mid-grey. */
46287
- function parseHex(hex) {
46288
- let h = hex.trim().replace(/^#/u, '');
46289
- if (h.length === 3) {
46290
- h = h
46291
- .split('')
46292
- .map((c) => c + c)
46293
- .join('');
46294
- }
46295
- if (h.length !== 6 || /[^0-9a-fA-F]/u.test(h)) {
46296
- return [128, 128, 128];
46297
- }
46298
- return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];
46299
- }
46300
- /**
46301
- * Pick a readable text colour (near-black or near-white) for a given fill,
46302
- * using the WCAG relative-luminance threshold.
46303
- */
46304
- function contrastTextColor(fill) {
46305
- const [r, g, b] = parseHex(fill);
46306
- const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
46307
- return lum > 0.6 ? '#1a1a1a' : '#ffffff';
46308
- }
46309
46347
 
46310
46348
  /**
46311
46349
  * Three.js SmartArt renderer - spatial (phase 2) layout transforms.
@@ -47131,6 +47169,108 @@ async function mountSurfaceChart3D(container, options) {
47131
47169
  };
47132
47170
  }
47133
47171
 
47172
+ /**
47173
+ * Word wrapping for contexts where the real glyph advances cannot be measured.
47174
+ *
47175
+ * Some render targets have no text-measurement API available at the point the
47176
+ * layout is decided: a PDF content stream being assembled, or SVG labels that
47177
+ * must be laid out before the document is in a document. Both need to break a
47178
+ * string into lines that will roughly fit a width, and both are better served
47179
+ * by one approximation than by two that drift apart.
47180
+ *
47181
+ * This is deliberately not a substitute for measured text. Anything that can
47182
+ * measure (the paragraph renderers, which resolve real advances) must.
47183
+ *
47184
+ * @module text-wrap-estimate
47185
+ */
47186
+ /** Average glyph advance as a fraction of the font size, across mixed-case Latin text. */
47187
+ const AVERAGE_ADVANCE_RATIO = 0.5;
47188
+ /**
47189
+ * Break `text` into lines that approximately fit `maxWidth`.
47190
+ *
47191
+ * Authored line breaks are always honoured. Words are never split or dropped:
47192
+ * a single word longer than the line gets a line of its own and overflows,
47193
+ * which is what PowerPoint does too.
47194
+ *
47195
+ * @param text - The text to wrap.
47196
+ * @param maxWidth - Available width, in the same units as `fontSize`.
47197
+ * @param fontSize - Font size used to estimate glyph advances.
47198
+ * @param options - See {@link EstimatedWrapOptions}.
47199
+ * @returns The wrapped lines, empty when there is nothing to render.
47200
+ */
47201
+ function wrapTextByEstimatedWidth(text, maxWidth, fontSize, options = {}) {
47202
+ if (!text || text.trim().length === 0) {
47203
+ return [];
47204
+ }
47205
+ const charactersPerLine = Math.floor(maxWidth / Math.max(fontSize * AVERAGE_ADVANCE_RATIO, 1));
47206
+ if (charactersPerLine <= 0) {
47207
+ return [];
47208
+ }
47209
+ const lines = [];
47210
+ for (const paragraph of text.split(/\r?\n/u)) {
47211
+ if (paragraph.trim().length === 0) {
47212
+ if (options.keepBlankLines) {
47213
+ lines.push('');
47214
+ }
47215
+ continue;
47216
+ }
47217
+ let current = '';
47218
+ for (const word of paragraph.split(/\s+/u)) {
47219
+ if (current.length === 0) {
47220
+ current = word;
47221
+ }
47222
+ else if (current.length + 1 + word.length <= charactersPerLine) {
47223
+ current += ` ${word}`;
47224
+ }
47225
+ else {
47226
+ lines.push(current);
47227
+ current = word;
47228
+ }
47229
+ }
47230
+ if (current.length > 0) {
47231
+ lines.push(current);
47232
+ }
47233
+ }
47234
+ return lines;
47235
+ }
47236
+
47237
+ /**
47238
+ * Line layout for centred SVG labels (SmartArt nodes and cached shapes).
47239
+ *
47240
+ * SVG has no text box: a `<text>` element does not wrap, and a multi-line label
47241
+ * has to be assembled from `<tspan>`s that the caller positions itself. Every
47242
+ * binding needs the same arithmetic to do that, so it lives here and each
47243
+ * binding is left with nothing but placing one `<tspan>` per line.
47244
+ *
47245
+ * @module svg-text-lines
47246
+ */
47247
+ /** Multiple of the font size used as the line box height, as PowerPoint does. */
47248
+ const LINE_HEIGHT_RATIO = 1.2;
47249
+ /**
47250
+ * Split a label into lines and centre the block vertically.
47251
+ *
47252
+ * @param text - The label text; `\n` breaks are always honoured.
47253
+ * @param fontSize - Font size in the same user units as the result.
47254
+ * @param options - See {@link CenteredSvgTextOptions}.
47255
+ * @returns One entry per line. Empty text yields a single empty line so callers
47256
+ * that always emit a `<tspan>` keep their previous single-line geometry.
47257
+ */
47258
+ function centeredSvgTextLines(text, fontSize, options = {}) {
47259
+ const lines = options.maxWidth !== undefined
47260
+ ? wrapTextByEstimatedWidth(text, options.maxWidth, fontSize)
47261
+ : text.split('\n').filter((line) => line.length > 0);
47262
+ const centerY = options.centerY ?? 0;
47263
+ if (lines.length === 0) {
47264
+ return [{ text: '', y: centerY }];
47265
+ }
47266
+ const lineHeight = fontSize * LINE_HEIGHT_RATIO;
47267
+ const blockTop = centerY - (lines.length * lineHeight) / 2;
47268
+ return lines.map((line, index) => ({
47269
+ text: line,
47270
+ y: blockTop + lineHeight / 2 + index * lineHeight,
47271
+ }));
47272
+ }
47273
+
47134
47274
  /**
47135
47275
  * smartart-drawing.ts: Drawing-shape view-model helpers for the SmartArt
47136
47276
  * renderer, shared across the React, Vue, and Angular bindings.
@@ -47141,8 +47281,8 @@ async function mountSurfaceChart3D(container, options) {
47141
47281
  * independent of the SVG-fallback layout engine (`computeSmartArtLayout` in
47142
47282
  * `smartart-layout`), which only runs when no drawing shapes exist.
47143
47283
  *
47144
- * Pure TypeScript (no framework imports). Style helpers (`truncate`,
47145
- * `styleStroke`, `styleShadow`) are reused from `smartart-layout-helpers`.
47284
+ * Pure TypeScript (no framework imports). Style helpers (`styleStroke`,
47285
+ * `styleShadow`) are reused from `smartart-layout-helpers`.
47146
47286
  */
47147
47287
  /** Built-in named colour palettes (mirrors the Vue/React `PALETTES`). */
47148
47288
  const PALETTES$1 = {
@@ -47194,6 +47334,50 @@ function buildChromeStyle(chrome) {
47194
47334
  }
47195
47335
  return s;
47196
47336
  }
47337
+ /**
47338
+ * Fraction of a shape's width its label may occupy. DiagramML shapes carry the
47339
+ * usual text insets, and wrapping to the full box would let text sit on the
47340
+ * outline.
47341
+ */
47342
+ const TEXT_WIDTH_FRACTION = 0.82;
47343
+ /**
47344
+ * The fill of the nearest shape painted beneath `shape`'s centre.
47345
+ *
47346
+ * SmartArt layouts commonly stack an unfilled shape over a painted one to hold
47347
+ * the label, so what the label has to be readable against is that lower shape,
47348
+ * not the transparency of its own box. Shapes are in paint order, so the search
47349
+ * runs backwards from the label and takes the first painted hit.
47350
+ */
47351
+ function underlyingFill(shape, shapes, index) {
47352
+ const centerX = shape.x + shape.width / 2;
47353
+ const centerY = shape.y + shape.height / 2;
47354
+ for (let below = index - 1; below >= 0; below--) {
47355
+ const candidate = shapes[below];
47356
+ if (!candidate || candidate.fillNone || !candidate.fillColor) {
47357
+ continue;
47358
+ }
47359
+ if (centerX >= candidate.x &&
47360
+ centerX <= candidate.x + candidate.width &&
47361
+ centerY >= candidate.y &&
47362
+ centerY <= candidate.y + candidate.height) {
47363
+ return candidate.fillColor;
47364
+ }
47365
+ }
47366
+ return undefined;
47367
+ }
47368
+ /**
47369
+ * Pick a label colour for a cached shape whose runs declare none.
47370
+ *
47371
+ * PowerPoint leaves the colour implicit far more often than not, and resolves it
47372
+ * against the shape's own fill. Defaulting to white instead makes every label on
47373
+ * a light content panel invisible.
47374
+ */
47375
+ function drawingShapeLabelColor(shape, shapes, index, resolvedFill) {
47376
+ const basis = resolvedFill === 'none' || resolvedFill.startsWith('url(')
47377
+ ? underlyingFill(shape, shapes, index)
47378
+ : resolvedFill;
47379
+ return basis ? contrastTextColor(basis) : '#1a1a1a';
47380
+ }
47197
47381
  /** Compute the SVG viewBox that fits all drawing shapes, rebasing to (0, 0). */
47198
47382
  function computeDrawingViewBox(shapes) {
47199
47383
  let minX = Infinity;
@@ -47232,7 +47416,7 @@ function projectDrawingShapes(elementId, shapes, viewBox, palette, style) {
47232
47416
  const { minX, minY } = viewBox;
47233
47417
  const sw = styleStroke(style);
47234
47418
  return shapes.map((shape, i) => {
47235
- const fill = shape.fillColor ?? paletteColour(i, palette);
47419
+ const fill = shape.fillNone ? 'none' : (shape.fillColor ?? paletteColour(i, palette));
47236
47420
  const relX = shape.x - minX;
47237
47421
  const relY = shape.y - minY;
47238
47422
  const isEllipse = shape.shapeType === 'ellipse';
@@ -47241,6 +47425,7 @@ function projectDrawingShapes(elementId, shapes, viewBox, palette, style) {
47241
47425
  const cy = relY + shape.height / 2;
47242
47426
  const stroke = shape.strokeColor ?? (sw > 0 ? 'rgba(255,255,255,0.3)' : 'none');
47243
47427
  const transform = shape.rotation !== undefined ? `rotate(${shape.rotation} ${cx} ${cy})` : undefined;
47428
+ const fontSize = shape.fontSize ?? Math.max(8, Math.min(14, shape.height * 0.2));
47244
47429
  return {
47245
47430
  key: `${elementId}-dsp-${shape.id}-${i}`,
47246
47431
  isEllipse,
@@ -47255,11 +47440,17 @@ function projectDrawingShapes(elementId, shapes, viewBox, palette, style) {
47255
47440
  stroke,
47256
47441
  strokeWidth: shape.strokeWidth ?? sw,
47257
47442
  transform,
47258
- text: shape.text ? truncate(shape.text, 30) : undefined,
47443
+ imageUrl: shape.fillImageUrl,
47444
+ textLines: shape.text
47445
+ ? centeredSvgTextLines(shape.text, fontSize, {
47446
+ maxWidth: shape.width * TEXT_WIDTH_FRACTION,
47447
+ centerY: cy,
47448
+ })
47449
+ : [],
47259
47450
  textX: cx,
47260
47451
  textY: cy,
47261
- fontColor: shape.fontColor ?? 'white',
47262
- fontSize: shape.fontSize ?? Math.max(8, Math.min(14, shape.height * 0.2)),
47452
+ fontColor: shape.fontColor ?? drawingShapeLabelColor(shape, shapes, i, fill),
47453
+ fontSize,
47263
47454
  };
47264
47455
  });
47265
47456
  }
@@ -61143,45 +61334,11 @@ function calculateNotesPageLayout(slideWidth, slideHeight) {
61143
61334
  /**
61144
61335
  * Wrap a text string into lines that fit within a given width at a given font
61145
61336
  * size, using approximate Helvetica character widths (acceptable for plain
61146
- * speaker notes).
61337
+ * speaker notes). Blank authored paragraphs keep their vertical gap so the
61338
+ * printed notes match how the author spaced them.
61147
61339
  */
61148
61340
  function wrapNotesText(text, maxWidth, fontSize) {
61149
- if (!text || text.trim().length === 0) {
61150
- return [];
61151
- }
61152
- // Approximate average character width as 0.5 x fontSize for Helvetica
61153
- const avgCharWidth = fontSize * 0.5;
61154
- const maxCharsPerLine = Math.floor(maxWidth / avgCharWidth);
61155
- if (maxCharsPerLine <= 0) {
61156
- return [];
61157
- }
61158
- const lines = [];
61159
- // Split on explicit newlines first
61160
- const paragraphs = text.split(/\r?\n/u);
61161
- for (const paragraph of paragraphs) {
61162
- if (paragraph.trim().length === 0) {
61163
- lines.push('');
61164
- continue;
61165
- }
61166
- const words = paragraph.split(/\s+/u);
61167
- let currentLine = '';
61168
- for (const word of words) {
61169
- if (currentLine.length === 0) {
61170
- currentLine = word;
61171
- }
61172
- else if (currentLine.length + 1 + word.length <= maxCharsPerLine) {
61173
- currentLine += ` ${word}`;
61174
- }
61175
- else {
61176
- lines.push(currentLine);
61177
- currentLine = word;
61178
- }
61179
- }
61180
- if (currentLine.length > 0) {
61181
- lines.push(currentLine);
61182
- }
61183
- }
61184
- return lines;
61341
+ return wrapTextByEstimatedWidth(text, maxWidth, fontSize, { keepBlankLines: true });
61185
61342
  }
61186
61343
  /**
61187
61344
  * Calculate the maximum number of notes text lines that fit on a continuation
@@ -65016,7 +65173,7 @@ function createLocalStorageBackend(namespace) {
65016
65173
  /** Try IndexedDB first; fall back to localStorage on any failure. */
65017
65174
  async function resolveBackend(dbName, namespace) {
65018
65175
  try {
65019
- const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-lds9F-eW.mjs');
65176
+ const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-D7J9_fDG.mjs');
65020
65177
  const db = await openChatDb(dbName);
65021
65178
  return createIdbBackend(db);
65022
65179
  }
@@ -67823,6 +67980,38 @@ function partitionSlides(slides) {
67823
67980
  });
67824
67981
  return { slides: next, templateElementsBySlideId };
67825
67982
  }
67983
+ /**
67984
+ * Fold a slide that core has re-mapped onto a new layout back into the editor's
67985
+ * two stores.
67986
+ *
67987
+ * `applyLayoutToSlide` returns the slide with the TARGET layout's inherited
67988
+ * artwork merged in, because that is how core delivers every slide. This editor
67989
+ * keeps that artwork in its own store, so the result has to be partitioned again
67990
+ * on the way in: the deck takes the slide's own elements, and the store's entry
67991
+ * for that slide is REPLACED (not merged) so the previous layout's decoration
67992
+ * stops being painted.
67993
+ *
67994
+ * @param slides - The current template-free deck.
67995
+ * @param index - Index of the slide that was re-mapped.
67996
+ * @param remapped - The slide as core returned it.
67997
+ * @param templateElementsBySlideId - The current template store.
67998
+ * @returns The updated deck and store, or `null` when `index` is out of range.
67999
+ */
68000
+ function slidesWithReappliedLayout(slides, index, remapped, templateElementsBySlideId) {
68001
+ if (index < 0 || index >= slides.length) {
68002
+ return null;
68003
+ }
68004
+ const partitioned = partitionSlides([remapped]);
68005
+ const nextSlides = [...slides];
68006
+ nextSlides[index] = partitioned.slides[0];
68007
+ return {
68008
+ slides: nextSlides,
68009
+ templateElementsBySlideId: {
68010
+ ...templateElementsBySlideId,
68011
+ [remapped.id]: partitioned.templateElementsBySlideId[remapped.id] ?? [],
68012
+ },
68013
+ };
68014
+ }
67826
68015
  /**
67827
68016
  * Re-merge the separated template store back into the deck for serialization.
67828
68017
  *
@@ -69784,6 +69973,40 @@ class EditorStateService {
69784
69973
  this.dirty.set(true);
69785
69974
  this.syncHistory();
69786
69975
  }
69976
+ /**
69977
+ * Re-map the slide at `index` onto `layoutPath`, keeping its content.
69978
+ *
69979
+ * Core moves the slide's placeholders onto the target layout's geometry and
69980
+ * rewrites the layout relationship, so this replaces one slide rather than
69981
+ * adding one. Does nothing without a loaded deck, since the operation reads
69982
+ * the target layout out of the package.
69983
+ *
69984
+ * @param index - Index of the slide to re-map.
69985
+ * @param layoutPath - Package path of the target layout.
69986
+ */
69987
+ async applyLayout(index, layoutPath) {
69988
+ const handler = this.loader?.getHandler();
69989
+ const slides = this.slides();
69990
+ const target = slides[index];
69991
+ if (!handler || !target) {
69992
+ return;
69993
+ }
69994
+ const updated = await handler
69995
+ .applyLayoutToSlide(index, layoutPath, [...slides])
69996
+ .catch(() => null);
69997
+ if (!updated || this.slides()[index]?.id !== target.id) {
69998
+ return;
69999
+ }
70000
+ const folded = slidesWithReappliedLayout(this.slides(), index, updated, this.templateElementsBySlideId());
70001
+ if (!folded) {
70002
+ return;
70003
+ }
70004
+ this.history.record(this.captureSnapshot(), this.t('pptx.master.layout'));
70005
+ this.slides.set(folded.slides);
70006
+ this.templateElementsBySlideId.set(folded.templateElementsBySlideId);
70007
+ this.dirty.set(true);
70008
+ this.syncHistory();
70009
+ }
69787
70010
  /**
69788
70011
  * Insert a pre-designed template slide after `afterIndex` (records history).
69789
70012
  *
@@ -72857,11 +73080,11 @@ class SmartArtRendererComponent {
72857
73080
  isEmpty = computed(() => this.nodes().length === 0 && !this.hasDrawingShapes(), /* @ts-ignore */
72858
73081
  ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
72859
73082
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: SmartArtRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
72860
- 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 });
73083
+ 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.imageUrl) {\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.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.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.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 });
72861
73084
  }
72862
73085
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: SmartArtRendererComponent, decorators: [{
72863
73086
  type: Component,
72864
- 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"] }]
73087
+ 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.imageUrl) {\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.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.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.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"] }]
72865
73088
  }], 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 }] }] } });
72866
73089
 
72867
73090
  /**
@@ -96809,7 +97032,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
96809
97032
  }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
96810
97033
 
96811
97034
  // Generated by scripts/inline-shared.mjs from package.json. Do not edit.
96812
- const PPTX_ANGULAR_VIEWER_VERSION = "2.17.3";
97035
+ const PPTX_ANGULAR_VIEWER_VERSION = "2.17.5";
96813
97036
 
96814
97037
  /**
96815
97038
  * account-page.component.ts: File > Account content.
@@ -98312,7 +98535,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
98312
98535
  class RibbonHomeSectionComponent {
98313
98536
  editor = inject(EditorStateService);
98314
98537
  loader = inject(LoadContentService);
98315
- /** Layouts offered by the New Slide split button (empty for a layout-less deck). */
98538
+ /** Layouts offered by the New Slide split button and the Layout menu. */
98316
98539
  layoutOptions = computed(() => layoutOptionsFrom(this.loader.slideMasters()), /* @ts-ignore */
98317
98540
  ...(ngDevMode ? [{ debugName: "layoutOptions" }] : /* istanbul ignore next */ []));
98318
98541
  slideIndex = input(0, /* @ts-ignore */
@@ -98329,8 +98552,17 @@ class RibbonHomeSectionComponent {
98329
98552
  findReplace = output();
98330
98553
  /** "Slide Templates" in the Slides group; the host opens the gallery dialog. */
98331
98554
  openTemplateGallery = output();
98555
+ /** Emitted with the layout the user picked, after it has been applied. */
98332
98556
  applyLayout = output();
98333
98557
  resetSlide = output();
98558
+ /**
98559
+ * Re-map the active slide onto `layoutPath`. The operation is self-contained,
98560
+ * so the output is a notification rather than the thing that performs it.
98561
+ */
98562
+ onApplyLayout(layoutPath) {
98563
+ void this.editor.applyLayout(this.slideIndex(), layoutPath);
98564
+ this.applyLayout.emit(layoutPath);
98565
+ }
98334
98566
  copy() {
98335
98567
  this.editor.copySelected(this.slideIndex());
98336
98568
  }
@@ -98463,14 +98695,40 @@ class RibbonHomeSectionComponent {
98463
98695
  <svg lucideLayoutTemplate class="h-4 w-4"></svg>
98464
98696
  {{ 'pptx.home.slideTemplates' | translate }}
98465
98697
  </button>
98466
- <button
98467
- type="button"
98468
- class="pptx-rb-gb whitespace-nowrap"
98469
- [title]="'pptx.master.layout' | translate"
98470
- (click)="applyLayout.emit('blank')"
98471
- >
98472
- <svg lucideLayoutGrid class="h-4 w-4"></svg> {{ 'pptx.master.layout' | translate }}
98473
- </button>
98698
+ <!--
98699
+ Layout re-maps the ACTIVE slide onto another layout of its master,
98700
+ keeping its content: that is what PowerPoint's Home > Layout does,
98701
+ and it is a different operation from the New Slide chevron above,
98702
+ which inserts a slide that inherits from the layout picked.
98703
+ -->
98704
+ <div class="group relative">
98705
+ <button
98706
+ type="button"
98707
+ class="pptx-rb-gb whitespace-nowrap"
98708
+ [disabled]="!canEdit() || layoutOptions().length === 0"
98709
+ [title]="'pptx.master.layout' | translate"
98710
+ >
98711
+ <svg lucideLayoutGrid class="h-4 w-4"></svg> {{ 'pptx.master.layout' | translate }}
98712
+ </button>
98713
+ @if (layoutOptions().length > 0) {
98714
+ <div
98715
+ class="absolute left-0 top-full z-50 hidden max-h-60 w-48 overflow-y-auto pt-1 group-hover:block"
98716
+ >
98717
+ <div class="rounded-lg border border-border bg-card py-1 shadow-2xl">
98718
+ @for (option of layoutOptions(); track option.path) {
98719
+ <button
98720
+ type="button"
98721
+ class="flex w-full items-center px-3 py-1.5 text-left text-xs text-foreground transition-colors hover:bg-muted"
98722
+ [disabled]="!canEdit()"
98723
+ (click)="onApplyLayout(option.path)"
98724
+ >
98725
+ {{ option.name }}
98726
+ </button>
98727
+ }
98728
+ </div>
98729
+ </div>
98730
+ }
98731
+ </div>
98474
98732
  <button
98475
98733
  type="button"
98476
98734
  class="pptx-rb-gb whitespace-nowrap"
@@ -98676,14 +98934,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
98676
98934
  <svg lucideLayoutTemplate class="h-4 w-4"></svg>
98677
98935
  {{ 'pptx.home.slideTemplates' | translate }}
98678
98936
  </button>
98679
- <button
98680
- type="button"
98681
- class="pptx-rb-gb whitespace-nowrap"
98682
- [title]="'pptx.master.layout' | translate"
98683
- (click)="applyLayout.emit('blank')"
98684
- >
98685
- <svg lucideLayoutGrid class="h-4 w-4"></svg> {{ 'pptx.master.layout' | translate }}
98686
- </button>
98937
+ <!--
98938
+ Layout re-maps the ACTIVE slide onto another layout of its master,
98939
+ keeping its content: that is what PowerPoint's Home > Layout does,
98940
+ and it is a different operation from the New Slide chevron above,
98941
+ which inserts a slide that inherits from the layout picked.
98942
+ -->
98943
+ <div class="group relative">
98944
+ <button
98945
+ type="button"
98946
+ class="pptx-rb-gb whitespace-nowrap"
98947
+ [disabled]="!canEdit() || layoutOptions().length === 0"
98948
+ [title]="'pptx.master.layout' | translate"
98949
+ >
98950
+ <svg lucideLayoutGrid class="h-4 w-4"></svg> {{ 'pptx.master.layout' | translate }}
98951
+ </button>
98952
+ @if (layoutOptions().length > 0) {
98953
+ <div
98954
+ class="absolute left-0 top-full z-50 hidden max-h-60 w-48 overflow-y-auto pt-1 group-hover:block"
98955
+ >
98956
+ <div class="rounded-lg border border-border bg-card py-1 shadow-2xl">
98957
+ @for (option of layoutOptions(); track option.path) {
98958
+ <button
98959
+ type="button"
98960
+ class="flex w-full items-center px-3 py-1.5 text-left text-xs text-foreground transition-colors hover:bg-muted"
98961
+ [disabled]="!canEdit()"
98962
+ (click)="onApplyLayout(option.path)"
98963
+ >
98964
+ {{ option.name }}
98965
+ </button>
98966
+ }
98967
+ </div>
98968
+ </div>
98969
+ }
98970
+ </div>
98687
98971
  <button
98688
98972
  type="button"
98689
98973
  class="pptx-rb-gb whitespace-nowrap"
@@ -128752,5 +129036,5 @@ function cn(...values) {
128752
129036
  * Generated bundle index. Do not edit.
128753
129037
  */
128754
129038
 
128755
- 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 };
128756
- //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-COSjTSrD.mjs.map
129039
+ 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, slidesWithReappliedLayout as l1, smartArtNodes as l2, paletteColour as l3, snapToGridStep as l4, splitCursorCell as l5, splitMergedCell as l6, statusKind as l7, statusLabel$1 as l8, storeAudienceContent as l9, updateGradientStopPatch as lA, updateInnerShadowPatch as lB, updateOuterShadowPatch as lC, updateReflectionPatch as lD, vAlignPatch as lE, validatePassword as lF, validatePrintSettings as lG, validateRoomId as lH, valueToY as lI, vermilionDarkColors as lJ, vermilionDarkTheme as lK, vermilionLightColors as lL, vermilionLightTheme as lM, vermilionRadius as lN, waypointsToPathD as lO, worstStatus as lP, zoomTargetSlideIndex as lQ, stringFromEvent$5 as la, strokeColorOf as lb, strokeToInkElement as lc, strokeWidthOf as ld, styleShadowFilter as le, textAdvancedPatch as lf, textAdvancedStateFromStyle as lg, textAdvancedStateOf as lh, textColorOf as li, textDirectionPatch as lj, textStyleOf as lk, textStylePatch as ll, themeStyle as lm, themeToCssVars as ln, thumbnailHeight as lo, thumbnailZoom as lp, toggleCommentResolvedInList as lq, toggleNodeBold as lr, toggleNodeItalic as ls, toggleSheet as lt, topLevelNodeCount as lu, transformSelectedTextCase as lv, translationsEn as lw, ungroupElements as lx, updateElementById as ly, updateGlowPatch 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 };
129040
+ //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-Cb3OH99V.mjs.map