pptx-angular-viewer 2.12.1 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ import { NgStyle, NgTemplateOutlet, NgClass } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
3
  import { InjectionToken, input, output, computed, ChangeDetectionStrategy, Component, signal, Injectable, inject, DestroyRef, Injector, effect, viewChild, ElementRef, HostListener, afterNextRender, Renderer2, ViewEncapsulation, forwardRef, untracked } from '@angular/core';
4
4
  import { TranslatePipe, TranslateService, translate } from '@ngx-translate/core';
5
- import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, ooxmlGradientAngleToCssDegrees, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, rebuildTableStructureInRawXml, updateCellTextInRawXml, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, getLinkedTextBoxSegments, deriveSlideTitle, getSubstituteFontFamily, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, PptxHandler, deobfuscateFont, detectFontFormat, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, parseSignatureXml, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, parseDataUrlToBytes, isZoomElement, SvgExporter, applyThemeToData, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, chartDataChangeType, getOleObjectTypeLabel, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS } from 'pptx-viewer-core';
5
+ import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, ooxmlGradientAngleToCssDegrees, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, rebuildTableStructureInRawXml, updateCellTextInRawXml, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, getLinkedTextBoxSegments, getSubstituteFontFamily, parsePanoseString, deriveSlideTitle, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, PptxHandler, deobfuscateFont, detectFontFormat, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, parseSignatureXml, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, parseDataUrlToBytes, isZoomElement, SvgExporter, applyThemeToData, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, chartDataChangeType, getOleObjectTypeLabel, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS } from 'pptx-viewer-core';
6
6
  import DOMPurify from 'dompurify';
7
7
  import { z } from 'zod';
8
8
  import * as mcp from 'pptx-viewer-mcp';
@@ -6374,6 +6374,387 @@ function compileEquationTemplateMathMl() {
6374
6374
  return EQUATION_TEMPLATES.map((tmpl) => latexToMathMl(tmpl.latex));
6375
6375
  }
6376
6376
 
6377
+ /**
6378
+ * PowerPoint's automatic value-axis scale.
6379
+ *
6380
+ * A chart that declares no `c:min` / `c:max` / `c:majorUnit` leaves the bounds
6381
+ * to the application, and PowerPoint does NOT simply run the axis to the largest
6382
+ * data point. It anchors the axis at zero, pads the data, then rounds out to a
6383
+ * round number and labels it in round steps. The reporter's deck (issue #132)
6384
+ * shows the difference plainly: a percentage chart whose bars top out at 52%
6385
+ * gets `0% 20% 40% 60%` from PowerPoint and got `0% 10% 21% 31% 42% 52%` here,
6386
+ * because the axis ran to the data maximum and was then divided into five.
6387
+ *
6388
+ * The rules, from Microsoft's documented automatic-scaling behaviour:
6389
+ *
6390
+ * - **Zero anchor.** With all-positive data, the axis starts at zero unless the
6391
+ * smallest value is at least 5/6 of the largest, in which case the data
6392
+ * occupies a narrow band high up and a zero-anchored axis would flatten it.
6393
+ * All-negative data mirrors this, ending at zero.
6394
+ * - **Headroom.** The far end is pushed out by 5% of the data span so the
6395
+ * tallest bar does not touch the top of the plot.
6396
+ * - **Round steps.** The major unit is the first "nice" number (1, 2, 2.5 or 5
6397
+ * times a power of ten) at or above `span / targetIntervals`, and the bounds
6398
+ * are then snapped outwards to whole multiples of it.
6399
+ *
6400
+ * The snap is what makes the interval count differ from `targetIntervals`:
6401
+ * rounding 0.544 up to a multiple of 0.2 lands on 0.6, which is three steps, not
6402
+ * four. That is the intent, and it is why PowerPoint's axes read in round
6403
+ * numbers while an evenly-divided one does not.
6404
+ */
6405
+ /**
6406
+ * Steps PowerPoint rounds a major unit to, as mantissas of a power of ten.
6407
+ * Anything between two entries rounds UP to the larger, so a unit is never so
6408
+ * fine that the axis grows more gridlines than asked for.
6409
+ */
6410
+ const NICE_STEPS = [1, 2, 2.5, 5, 10];
6411
+ /** The fraction of the data span added as headroom beyond the last data point. */
6412
+ const HEADROOM = 0.05;
6413
+ /**
6414
+ * How close the smaller end of the data has to be to the larger before the axis
6415
+ * stops anchoring at zero. Below 5/6, zero anchoring keeps the bars readable;
6416
+ * above it, the data is a narrow band and zero would squash it flat.
6417
+ */
6418
+ const ZERO_ANCHOR_RATIO = 5 / 6;
6419
+ /** The smallest nice step at or above `value`. */
6420
+ function niceAxisStep(value) {
6421
+ if (!Number.isFinite(value) || value <= 0) {
6422
+ return 1;
6423
+ }
6424
+ const exponent = Math.floor(Math.log10(value));
6425
+ const power = 10 ** exponent;
6426
+ const mantissa = value / power;
6427
+ const step = NICE_STEPS.find((candidate) => mantissa <= candidate + 1e-12) ?? 10;
6428
+ return step * power;
6429
+ }
6430
+ /** Round `value` outwards (away from zero-ward `toward`) to a multiple of `unit`. */
6431
+ function snap(value, unit, direction) {
6432
+ const scaled = value / unit;
6433
+ // Guard against float noise turning an exact multiple into the next one out.
6434
+ const rounded = direction === 'up' ? Math.ceil(scaled - 1e-9) : Math.floor(scaled + 1e-9);
6435
+ return rounded * unit;
6436
+ }
6437
+ /**
6438
+ * Resolve the automatic bounds and major unit for a value axis.
6439
+ *
6440
+ * @param dataMin Smallest plotted value.
6441
+ * @param dataMax Largest plotted value.
6442
+ * @param targetIntervals Roughly how many gridline steps to aim for. The snap to
6443
+ * a round unit means the result is usually one fewer. Four matches the axes
6444
+ * PowerPoint draws for a chart of ordinary height.
6445
+ */
6446
+ function niceValueAxisBounds(dataMin, dataMax, targetIntervals = 4) {
6447
+ if (!Number.isFinite(dataMin) || !Number.isFinite(dataMax)) {
6448
+ return { min: 0, max: 1, majorUnit: 0.5 };
6449
+ }
6450
+ const low = Math.min(dataMin, dataMax);
6451
+ const high = Math.max(dataMin, dataMax);
6452
+ const intervals = Math.max(1, Math.round(targetIntervals));
6453
+ // Flat data (every point identical) has no span to scale. Zero-anchor it
6454
+ // where that reads sensibly, and otherwise bracket the single value.
6455
+ if (low === high) {
6456
+ if (low === 0) {
6457
+ return { min: 0, max: 1, majorUnit: 1 / intervals };
6458
+ }
6459
+ const unit = niceAxisStep(Math.abs(low) / intervals);
6460
+ return low > 0
6461
+ ? { min: 0, max: snap(low, unit, 'up') || unit, majorUnit: unit }
6462
+ : { min: snap(low, unit, 'down'), max: 0, majorUnit: unit };
6463
+ }
6464
+ const dataSpan = high - low;
6465
+ const padding = dataSpan * HEADROOM;
6466
+ // Decide which end, if either, pins to zero.
6467
+ let paddedMin;
6468
+ let paddedMax;
6469
+ if (low >= 0) {
6470
+ paddedMin = low < high * ZERO_ANCHOR_RATIO ? 0 : low - padding;
6471
+ paddedMax = high + padding;
6472
+ }
6473
+ else if (high <= 0) {
6474
+ paddedMax = high > low * ZERO_ANCHOR_RATIO ? 0 : high + padding;
6475
+ paddedMin = low - padding;
6476
+ }
6477
+ else {
6478
+ // Straddles zero: both ends are data-driven, and zero falls inside.
6479
+ paddedMin = low - padding;
6480
+ paddedMax = high + padding;
6481
+ }
6482
+ const unit = niceAxisStep((paddedMax - paddedMin) / intervals);
6483
+ const min = paddedMin === 0 ? 0 : snap(paddedMin, unit, 'down');
6484
+ let max = paddedMax === 0 ? 0 : snap(paddedMax, unit, 'up');
6485
+ if (max <= min) {
6486
+ max = min + unit;
6487
+ }
6488
+ return { min, max, majorUnit: unit };
6489
+ }
6490
+
6491
+ /**
6492
+ * ECMA-376 / SpreadsheetML number-format codes, applied to chart labels.
6493
+ *
6494
+ * A chart's value axis and its data labels both carry a `c:numFmt/@formatCode`
6495
+ * (or inherit one from the series' `c:numCache/c:formatCode` when
6496
+ * `@sourceLinked="1"`). Ignoring it is what made a percentage chart render its
6497
+ * axis as `0.1 0.2 0.3` and its bars as `0.52` where PowerPoint shows `10% 20%
6498
+ * 30%` and `52%`: the cached values ARE fractions, and the format code is the
6499
+ * only thing that says so.
6500
+ *
6501
+ * This covers the codes charts actually use - literal text, digit placeholders,
6502
+ * thousands separators, percent, scientific notation, and the
6503
+ * `positive;negative;zero` section split - and deliberately stops short of a
6504
+ * full Excel format engine. Anything it does not recognise falls back to the
6505
+ * caller's default rendering, so an exotic code degrades to today's output
6506
+ * rather than to a wrong number.
6507
+ */
6508
+ /** Format codes that mean "no explicit format"; the caller's default wins. */
6509
+ const GENERAL = new Set(['', 'general', '@']);
6510
+ /** Split a format code into its `positive;negative;zero;text` sections. */
6511
+ function sections(code) {
6512
+ const out = [];
6513
+ let current = '';
6514
+ let inQuotes = false;
6515
+ for (let i = 0; i < code.length; i += 1) {
6516
+ const ch = code[i];
6517
+ if (ch === '"') {
6518
+ inQuotes = !inQuotes;
6519
+ current += ch;
6520
+ continue;
6521
+ }
6522
+ if (ch === '\\') {
6523
+ current += ch + (code[i + 1] ?? '');
6524
+ i += 1;
6525
+ continue;
6526
+ }
6527
+ if (ch === ';' && !inQuotes) {
6528
+ out.push(current);
6529
+ current = '';
6530
+ continue;
6531
+ }
6532
+ current += ch;
6533
+ }
6534
+ out.push(current);
6535
+ return out;
6536
+ }
6537
+ /** Pick the section that applies to `value` (positive / negative / zero). */
6538
+ function sectionFor(value, parts) {
6539
+ if (parts.length === 1) {
6540
+ return { code: parts[0], forcePositive: false };
6541
+ }
6542
+ if (value < 0 && parts[1] !== undefined) {
6543
+ // A dedicated negative section supplies its own sign (often none, or
6544
+ // parentheses), so the magnitude is formatted unsigned.
6545
+ return { code: parts[1], forcePositive: true };
6546
+ }
6547
+ if (value === 0 && parts[2] !== undefined) {
6548
+ return { code: parts[2], forcePositive: false };
6549
+ }
6550
+ return { code: parts[0], forcePositive: false };
6551
+ }
6552
+ const PLACEHOLDER = /[0#?]/u;
6553
+ /**
6554
+ * Parse one format section. Returns `undefined` when the section contains no
6555
+ * numeric placeholder at all, which means the caller should fall back.
6556
+ */
6557
+ function parsePattern(code) {
6558
+ let scale = 1;
6559
+ let scientific = false;
6560
+ const chars = [];
6561
+ let inQuotes = false;
6562
+ for (let i = 0; i < code.length; i += 1) {
6563
+ const ch = code[i];
6564
+ if (ch === '"') {
6565
+ inQuotes = !inQuotes;
6566
+ continue;
6567
+ }
6568
+ if (inQuotes) {
6569
+ chars.push({ ch, literal: true });
6570
+ continue;
6571
+ }
6572
+ if (ch === '\\' || ch === '*' || ch === '_') {
6573
+ // Escape / repeat / skip-width: the next char is a literal (and for
6574
+ // `_` the width padding is not reproducible in SVG text anyway).
6575
+ const next = code[i + 1];
6576
+ i += 1;
6577
+ if (ch === '\\' && next !== undefined) {
6578
+ chars.push({ ch: next, literal: true });
6579
+ }
6580
+ continue;
6581
+ }
6582
+ if (ch === '%') {
6583
+ scale *= 100;
6584
+ chars.push({ ch, literal: true });
6585
+ continue;
6586
+ }
6587
+ if (ch === 'E' && (code[i + 1] === '+' || code[i + 1] === '-')) {
6588
+ scientific = true;
6589
+ chars.push({ ch: 'E', literal: false });
6590
+ i += 1;
6591
+ continue;
6592
+ }
6593
+ if (ch === '[') {
6594
+ // Colour / condition / locale block: skipped wholesale.
6595
+ const close = code.indexOf(']', i);
6596
+ i = close === -1 ? code.length : close;
6597
+ continue;
6598
+ }
6599
+ chars.push({ ch, literal: false });
6600
+ }
6601
+ const firstDigit = chars.findIndex((c) => !c.literal && PLACEHOLDER.test(c.ch));
6602
+ if (firstDigit === -1) {
6603
+ return undefined;
6604
+ }
6605
+ let lastDigit = firstDigit;
6606
+ for (let i = chars.length - 1; i >= firstDigit; i -= 1) {
6607
+ const c = chars[i];
6608
+ if (!c.literal && (PLACEHOLDER.test(c.ch) || c.ch === '.' || c.ch === ',' || c.ch === 'E')) {
6609
+ lastDigit = i;
6610
+ break;
6611
+ }
6612
+ }
6613
+ const numeric = chars.slice(firstDigit, lastDigit + 1);
6614
+ const prefix = chars
6615
+ .slice(0, firstDigit)
6616
+ .map((c) => c.ch)
6617
+ .join('');
6618
+ const suffix = chars
6619
+ .slice(lastDigit + 1)
6620
+ .map((c) => c.ch)
6621
+ .join('');
6622
+ // Trailing commas immediately before the decimal point (or at the end of the
6623
+ // integer run) scale by thousands; a comma between placeholders groups.
6624
+ let grouped = false;
6625
+ let intDigits = 0;
6626
+ let required = 0;
6627
+ let optional = 0;
6628
+ let afterPoint = false;
6629
+ let inExponent = false;
6630
+ for (let i = 0; i < numeric.length; i += 1) {
6631
+ const { ch, literal } = numeric[i];
6632
+ if (literal) {
6633
+ continue;
6634
+ }
6635
+ if (ch === 'E') {
6636
+ inExponent = true;
6637
+ continue;
6638
+ }
6639
+ if (inExponent) {
6640
+ continue;
6641
+ }
6642
+ if (ch === '.') {
6643
+ afterPoint = true;
6644
+ continue;
6645
+ }
6646
+ if (ch === ',') {
6647
+ const next = numeric.slice(i + 1).find((c) => !c.literal);
6648
+ if (!next || next.ch === '.' || !PLACEHOLDER.test(next.ch)) {
6649
+ scale /= 1000;
6650
+ }
6651
+ else {
6652
+ grouped = true;
6653
+ }
6654
+ continue;
6655
+ }
6656
+ if (!PLACEHOLDER.test(ch)) {
6657
+ continue;
6658
+ }
6659
+ if (afterPoint) {
6660
+ if (ch === '0') {
6661
+ required += 1;
6662
+ }
6663
+ else {
6664
+ optional += 1;
6665
+ }
6666
+ }
6667
+ else if (ch === '0') {
6668
+ intDigits += 1;
6669
+ }
6670
+ }
6671
+ return {
6672
+ prefix,
6673
+ suffix,
6674
+ intDigits,
6675
+ decimals: { required, optional },
6676
+ grouped,
6677
+ scale,
6678
+ scientific,
6679
+ };
6680
+ }
6681
+ /** Apply `#,###` grouping to the integer part of an already-rounded string. */
6682
+ function group(intPart) {
6683
+ return intPart.replace(/\B(?=(\d{3})+(?!\d))/gu, ',');
6684
+ }
6685
+ /** Render `value` through a parsed pattern. */
6686
+ function applyPattern(value, pattern, forcePositive) {
6687
+ const scaled = value * pattern.scale;
6688
+ const magnitude = forcePositive ? Math.abs(scaled) : scaled;
6689
+ if (pattern.scientific) {
6690
+ const digits = pattern.decimals.required + pattern.decimals.optional;
6691
+ const exponential = magnitude.toExponential(digits);
6692
+ const [mantissa, exponent] = exponential.split('e');
6693
+ const sign = exponent.startsWith('-') ? '-' : '+';
6694
+ const power = Math.abs(Number(exponent)).toString().padStart(2, '0');
6695
+ return `${pattern.prefix}${mantissa}E${sign}${power}${pattern.suffix}`;
6696
+ }
6697
+ const maxDecimals = pattern.decimals.required + pattern.decimals.optional;
6698
+ let body = magnitude.toFixed(maxDecimals);
6699
+ if (pattern.decimals.optional > 0) {
6700
+ // Optional (`#`/`?`) decimals are dropped when they are zero.
6701
+ body = body.replace(/(\.\d*?)0+$/u, '$1').replace(/\.$/u, '');
6702
+ const [, frac = ''] = body.split('.');
6703
+ if (frac.length < pattern.decimals.required) {
6704
+ body = Number(body).toFixed(pattern.decimals.required);
6705
+ }
6706
+ }
6707
+ const [rawIntPart, fracPart] = body.split('.');
6708
+ let intPart = rawIntPart;
6709
+ const negative = intPart.startsWith('-');
6710
+ if (negative) {
6711
+ intPart = intPart.slice(1);
6712
+ }
6713
+ if (intPart.length < pattern.intDigits) {
6714
+ intPart = intPart.padStart(pattern.intDigits, '0');
6715
+ }
6716
+ if (pattern.intDigits === 0 && intPart === '0' && fracPart !== undefined) {
6717
+ // `#.##` drops the leading zero; `0.##` keeps it.
6718
+ intPart = '';
6719
+ }
6720
+ if (pattern.grouped) {
6721
+ intPart = group(intPart);
6722
+ }
6723
+ const number = fracPart === undefined ? intPart : `${intPart}.${fracPart}`;
6724
+ return `${negative ? '-' : ''}${pattern.prefix}${number}${pattern.suffix}`;
6725
+ }
6726
+ /**
6727
+ * Format `value` with an ECMA-376 number-format code.
6728
+ *
6729
+ * Returns `undefined` when the code is absent, `General`, or beyond this
6730
+ * subset, which tells the caller to keep its own default formatting.
6731
+ */
6732
+ function formatChartNumber(value, formatCode) {
6733
+ if (!Number.isFinite(value)) {
6734
+ return undefined;
6735
+ }
6736
+ const code = (formatCode ?? '').trim();
6737
+ if (GENERAL.has(code.toLowerCase())) {
6738
+ return undefined;
6739
+ }
6740
+ // Date/time codes are the province of `chart-date-axis`; a value axis never
6741
+ // carries one, and mistaking `d` for a digit would corrupt the label.
6742
+ if (/(?:^|[^\\"])(?:yy|mm?m|dd?|hh|ss)/iu.test(code) && !/[0#?]/u.test(code)) {
6743
+ return undefined;
6744
+ }
6745
+ const { code: section, forcePositive } = sectionFor(value, sections(code));
6746
+ const pattern = parsePattern(section);
6747
+ if (!pattern) {
6748
+ return undefined;
6749
+ }
6750
+ try {
6751
+ return applyPattern(value, pattern, forcePositive);
6752
+ }
6753
+ catch {
6754
+ return undefined;
6755
+ }
6756
+ }
6757
+
6377
6758
  /**
6378
6759
  * Framework-agnostic chart helpers, a focused Vue port of the React package's
6379
6760
  * `viewer/utils/chart-helpers.ts`, `chart-layout.ts`, and
@@ -6528,18 +6909,19 @@ function paletteColor$1(index, styleId, colorPalette) {
6528
6909
  const palette = getChartStylePalette(styleId);
6529
6910
  return palette[index % palette.length];
6530
6911
  }
6531
- /** Compute a Y-axis range that always includes zero. */
6912
+ /**
6913
+ * Automatic Y-axis range, on PowerPoint's terms: zero-anchored where that reads
6914
+ * sensibly, padded, and rounded out to whole major units. See
6915
+ * `chart-axis-nice.ts` for the rules. Running the axis to the raw data maximum
6916
+ * instead put the top gridline on whatever the tallest bar happened to be.
6917
+ */
6532
6918
  function computeValueRange$1(series) {
6533
6919
  const allValues = series.flatMap((s) => s.values);
6534
6920
  if (allValues.length === 0) {
6535
6921
  return { min: 0, max: 1, span: 1 };
6536
6922
  }
6537
- const dataMin = Math.min(...allValues);
6538
- const dataMax = Math.max(...allValues);
6539
- const min = Math.min(dataMin, 0);
6540
- const max = Math.max(dataMax, 0);
6541
- const span = Math.max(max - min, 1);
6542
- return { min, max, span };
6923
+ const { min, max, majorUnit } = niceValueAxisBounds(Math.min(...allValues), Math.max(...allValues));
6924
+ return { min, max, span: Math.max(max - min, Number.EPSILON), majorUnit };
6543
6925
  }
6544
6926
  /**
6545
6927
  * Map a data value to a Y pixel coordinate (top = max, bottom = min).
@@ -6562,8 +6944,20 @@ function valueToY$1(val, range, topY, bottomY) {
6562
6944
  }
6563
6945
  return range.reverseOrder ? topY + ratio * usable : bottomY - ratio * usable;
6564
6946
  }
6565
- /** Compact axis-value formatting (1.2K / 3.4M / integer / one-decimal). */
6566
- function formatAxisValue$1(val) {
6947
+ /**
6948
+ * Compact axis-value formatting (1.2K / 3.4M / integer / one-decimal).
6949
+ *
6950
+ * `formatCode` is the chart's own `c:numFmt/@formatCode`. When the source
6951
+ * declares one - `0%`, `#,##0`, `$#,##0.00` - it WINS: the cached values behind
6952
+ * a percentage chart are fractions, and the compact fallback renders them as
6953
+ * `0.5` where PowerPoint shows `50%`. Codes outside the supported subset fall
6954
+ * through to the compact form, which is what every caller did before.
6955
+ */
6956
+ function formatAxisValue$1(val, formatCode) {
6957
+ const formatted = formatChartNumber(val, formatCode);
6958
+ if (formatted !== undefined) {
6959
+ return formatted;
6960
+ }
6567
6961
  if (Math.abs(val) >= 1_000_000) {
6568
6962
  return `${(val / 1_000_000).toFixed(1)}M`;
6569
6963
  }
@@ -6650,6 +7044,45 @@ function resolveCategoryLabels(chartData) {
6650
7044
  return Array.from({ length: longest }, (_, i) => String(i + 1));
6651
7045
  }
6652
7046
 
7047
+ /**
7048
+ * The chart-area (and plot-area) background, resolved once for every binding.
7049
+ *
7050
+ * All five viewers painted a hardcoded `#0f172a11` wash across the whole chart
7051
+ * SVG. PowerPoint decks routinely write `<c:spPr><a:noFill/></c:spPr>` on
7052
+ * `c:chartSpace` and `c:plotArea` precisely so the chart floats on the slide;
7053
+ * the wash boxed every such chart into a visible grey panel that is not in the
7054
+ * source. Honouring the authored fill is the fix, and keeping the wash as the
7055
+ * fallback leaves charts that say nothing looking exactly as they did.
7056
+ */
7057
+ /**
7058
+ * The wash the bindings have always painted when a chart declares no fill of
7059
+ * its own. Kept as the default so an unstyled chart still reads as a distinct
7060
+ * surface against the slide.
7061
+ */
7062
+ const DEFAULT_CHART_AREA_FILL = '#0f172a11';
7063
+ /** Resolve one recorded fill value to an SVG `fill`, or `undefined` to skip. */
7064
+ function resolve(fill, fallback) {
7065
+ if (fill === 'none') {
7066
+ return undefined;
7067
+ }
7068
+ return fill ?? fallback;
7069
+ }
7070
+ /**
7071
+ * SVG `fill` for the chart-area rect, or `undefined` when nothing should be
7072
+ * painted (the source declared `a:noFill`).
7073
+ */
7074
+ function chartAreaFill(chartData) {
7075
+ return resolve(chartData?.style?.chartAreaFill, DEFAULT_CHART_AREA_FILL);
7076
+ }
7077
+ /**
7078
+ * SVG `fill` for the plot-area rect, or `undefined` when nothing should be
7079
+ * painted. Unlike the chart area there is no default wash: a plot area that
7080
+ * says nothing inherits the chart area behind it.
7081
+ */
7082
+ function plotAreaFill(chartData) {
7083
+ return resolve(chartData?.style?.plotAreaFill, undefined);
7084
+ }
7085
+
6653
7086
  /**
6654
7087
  * Map a (possibly fractional / extrapolated) category index to an X pixel.
6655
7088
  * `mode === 'bar'` centres on category slots; `'line'` anchors at points.
@@ -6954,6 +7387,9 @@ function computeValueRangeForAxis(series, axis) {
6954
7387
  : undefined;
6955
7388
  const min = validMin ?? automatic.min;
6956
7389
  let max = validMax ?? automatic.max;
7390
+ // An explicit bound breaks the automatic scale's guarantee that the span is a
7391
+ // whole number of major units, so the unit no longer describes these bounds.
7392
+ const majorUnit = validMin === undefined && validMax === undefined ? automatic.majorUnit : undefined;
6957
7393
  if (max <= min) {
6958
7394
  max = logBase ? min * logBase : min + 1;
6959
7395
  }
@@ -6964,6 +7400,7 @@ function computeValueRangeForAxis(series, axis) {
6964
7400
  min,
6965
7401
  max,
6966
7402
  span: Math.max(span, Number.EPSILON),
7403
+ ...(majorUnit !== undefined ? { majorUnit } : {}),
6967
7404
  ...(logBase ? { logScale: true, logBase } : {}),
6968
7405
  ...(axis?.orientation === 'maxMin' ? { reverseOrder: true } : {}),
6969
7406
  };
@@ -7010,6 +7447,14 @@ function generateAxisTicks(range, axis, defaultIntervals) {
7010
7447
  if (explicit.length > 0) {
7011
7448
  return explicit;
7012
7449
  }
7450
+ // The automatic scale already picked a round step and snapped the bounds to
7451
+ // whole multiples of it, so stepping by that unit reproduces PowerPoint's
7452
+ // labels exactly. Dividing the span evenly instead is what put ticks on
7453
+ // 10.4 / 20.8 / 31.2 where PowerPoint writes 20 / 40 / 60.
7454
+ const automatic = generateIntervalTicks(range, range.majorUnit ?? 0);
7455
+ if (automatic.length > 0) {
7456
+ return automatic;
7457
+ }
7013
7458
  return Array.from({ length: defaultIntervals + 1 }, (_, index) => range.min + (range.span / defaultIntervals) * index);
7014
7459
  }
7015
7460
  /** Generate minor gridline values, excluding positions occupied by major ticks. */
@@ -8354,12 +8799,16 @@ function valueAxisLabelPlacement(layout, position, defaultSide, axisX) {
8354
8799
  ? { x: layout.plotLeft - 4, textAnchor: 'end' }
8355
8800
  : { x: layout.plotRight + 4, textAnchor: 'start' };
8356
8801
  }
8357
- /** Format a value-axis tick: display-unit scaled when the axis declares units. */
8802
+ /**
8803
+ * Format a value-axis tick: display-unit scaled when the axis declares units,
8804
+ * otherwise through the axis's own `c:numFmt/@formatCode`. Without the format
8805
+ * code a percentage axis renders its cached fractions raw (`0.2` for `20%`).
8806
+ */
8358
8807
  function formatTick(val, axis) {
8359
8808
  if (axis?.displayUnits) {
8360
8809
  return formatAxisValueWithUnits(val, axis);
8361
8810
  }
8362
- return formatAxisValue(val);
8811
+ return formatAxisValue(val, axis?.numFmt?.formatCode);
8363
8812
  }
8364
8813
  /**
8365
8814
  * Build primary value-axis gridlines + left-side labels, honouring log scale and
@@ -8515,6 +8964,11 @@ function hasRicherAxisFeatures(chartData) {
8515
8964
  (axis.axisType === 'valAx' &&
8516
8965
  Boolean(axis.logScale ||
8517
8966
  axis.displayUnits ||
8967
+ // A `c:numFmt` is only honoured on the `buildPrimaryAxis`
8968
+ // path; the fast path has no axis to read it from. The two
8969
+ // agree tick-for-tick when no log scale or display unit is
8970
+ // in play, so routing a formatted axis here costs nothing.
8971
+ axis.numFmt?.formatCode ||
8518
8972
  axis.axPos === 'r' ||
8519
8973
  axis.orientation === 'maxMin' ||
8520
8974
  axis.majorUnit !== undefined ||
@@ -8641,7 +9095,7 @@ function buildBars(chartData, catCount, layout, primaryRange, secondaryRange, se
8641
9095
  kind: 'text',
8642
9096
  x: x + singleBarWidth / 2,
8643
9097
  y: val >= 0 ? y - 4 : y + h + 10,
8644
- text: formatAxisValue(val),
9098
+ text: formatAxisValue(val, series[si].numberFormat),
8645
9099
  fontSize: 7,
8646
9100
  fill: '#334155',
8647
9101
  textAnchor: 'middle',
@@ -8763,7 +9217,7 @@ function pushClusteredStackedLabels(series, sourceIndices, catCount, layout, ran
8763
9217
  kind: 'text',
8764
9218
  x,
8765
9219
  y: labelY,
8766
- text: formatAxisValue(val),
9220
+ text: formatAxisValue(val, series[si].numberFormat),
8767
9221
  fontSize: 7,
8768
9222
  fill: '#334155',
8769
9223
  textAnchor: 'middle',
@@ -9119,7 +9573,7 @@ function buildLines(chartData, catCount, layout, primaryRange, secondaryRange, s
9119
9573
  kind: 'text',
9120
9574
  x: pt.x,
9121
9575
  y: pt.y - 7,
9122
- text: formatAxisValue(val),
9576
+ text: formatAxisValue(val, series.numberFormat),
9123
9577
  fontSize: 7,
9124
9578
  fill: '#334155',
9125
9579
  textAnchor: 'middle',
@@ -9183,7 +9637,7 @@ function buildAreas(chartData, catCount, layout, range, sourceIndices, xPosition
9183
9637
  kind: 'text',
9184
9638
  x: pt.x,
9185
9639
  y: pt.y - 6,
9186
- text: formatAxisValue(val),
9640
+ text: formatAxisValue(val, series.numberFormat),
9187
9641
  fontSize: 7,
9188
9642
  fill: '#334155',
9189
9643
  textAnchor: 'middle',
@@ -9219,7 +9673,7 @@ function buildScatter(chartData, layout, range) {
9219
9673
  kind: 'text',
9220
9674
  x: dot.cx,
9221
9675
  y: dot.cy - 6,
9222
- text: formatAxisValue(val),
9676
+ text: formatAxisValue(val, series.numberFormat),
9223
9677
  fontSize: 7,
9224
9678
  fill: '#334155',
9225
9679
  textAnchor: 'middle',
@@ -9267,7 +9721,7 @@ function buildBubbles(chartData, layout, range) {
9267
9721
  kind: 'text',
9268
9722
  x: dot.cx,
9269
9723
  y: dot.cy - 10,
9270
- text: formatAxisValue(val),
9724
+ text: formatAxisValue(val, series.numberFormat),
9271
9725
  fontSize: 7,
9272
9726
  fill: '#334155',
9273
9727
  textAnchor: 'middle',
@@ -10770,7 +11224,7 @@ function buildComboViewModel(element, chartData, categoryLabels) {
10770
11224
  kind: 'text',
10771
11225
  x: point.x,
10772
11226
  y: point.y - 7,
10773
- text: formatAxisValue(point.value),
11227
+ text: formatAxisValue(point.value, series.numberFormat),
10774
11228
  fontSize: 7,
10775
11229
  fill: '#334155',
10776
11230
  textAnchor: 'middle',
@@ -10822,7 +11276,7 @@ function appendBarLabels(series, chartData, layout, catCount, range, sourceIndic
10822
11276
  x: xPositions?.[displayIndex] ??
10823
11277
  layout.plotLeft + groupWidth * displayIndex + offset + barWidth / 2,
10824
11278
  y: value >= 0 ? Math.min(zeroY, valueY) - 4 : Math.max(zeroY, valueY) + 10,
10825
- text: formatAxisValue(value),
11279
+ text: formatAxisValue(value, series.numberFormat),
10826
11280
  fontSize: 7,
10827
11281
  fill: '#334155',
10828
11282
  textAnchor: 'middle',
@@ -11952,7 +12406,7 @@ function isOutsidePosition(position) {
11952
12406
  * leader line from the rim point to the label anchor.
11953
12407
  */
11954
12408
  function buildPieDataLabels(params) {
11955
- const { slices, values, cx, cy, outerR, position, showLeaderLines } = params;
12409
+ const { slices, values, cx, cy, outerR, position, showLeaderLines, numberFormat } = params;
11956
12410
  const outside = isOutsidePosition(position);
11957
12411
  const labels = [];
11958
12412
  const leaderLines = [];
@@ -11966,7 +12420,7 @@ function buildPieDataLabels(params) {
11966
12420
  kind: 'text',
11967
12421
  x: slice.labelX,
11968
12422
  y: slice.labelY,
11969
- text: formatAxisValue(val),
12423
+ text: formatAxisValue(val, numberFormat),
11970
12424
  fontSize: 8,
11971
12425
  fill: '#ffffff',
11972
12426
  textAnchor: 'middle',
@@ -11986,7 +12440,7 @@ function buildPieDataLabels(params) {
11986
12440
  kind: 'text',
11987
12441
  x: labelX + (cos >= 0 ? 2 : -2),
11988
12442
  y: labelY,
11989
- text: formatAxisValue(val),
12443
+ text: formatAxisValue(val, numberFormat),
11990
12444
  fontSize: 8,
11991
12445
  fill: '#334155',
11992
12446
  textAnchor: anchor,
@@ -13444,7 +13898,10 @@ function paletteColor(index, colorPalette) {
13444
13898
  function seriesColor(series, index, colorPalette) {
13445
13899
  return series.color ?? paletteColor(index, colorPalette);
13446
13900
  }
13447
- /** Compute a Y-axis range that always includes zero. */
13901
+ /**
13902
+ * Automatic Y-axis range, on PowerPoint's terms. See `chart-axis-nice.ts`; this
13903
+ * mirrors `computeValueRange` in `chart-helpers.ts`.
13904
+ */
13448
13905
  function computeValueRange(series) {
13449
13906
  let dataMin = Number.POSITIVE_INFINITY;
13450
13907
  let dataMax = Number.NEGATIVE_INFINITY;
@@ -13461,12 +13918,13 @@ function computeValueRange(series) {
13461
13918
  if (dataMin === Number.POSITIVE_INFINITY) {
13462
13919
  return { min: 0, max: 1, span: 1 };
13463
13920
  }
13464
- const min = Math.min(dataMin, 0);
13465
- const max = Math.max(dataMax, 0);
13466
- const span = Math.max(max - min, 1);
13467
- return { min, max, span };
13921
+ const { min, max, majorUnit } = niceValueAxisBounds(dataMin, dataMax);
13922
+ return { min, max, span: Math.max(max - min, Number.EPSILON), majorUnit };
13468
13923
  }
13469
- /** Compute the value range for a stacked bar (sum of positive values per category). */
13924
+ /**
13925
+ * Value range for a stacked bar: the per-category sums, then the same automatic
13926
+ * scale as any other value axis.
13927
+ */
13470
13928
  function computeStackedValueRange(series, catCount) {
13471
13929
  let maxSum = 0;
13472
13930
  let minSum = 0;
@@ -13485,10 +13943,8 @@ function computeStackedValueRange(series, catCount) {
13485
13943
  maxSum = Math.max(maxSum, pos);
13486
13944
  minSum = Math.min(minSum, neg);
13487
13945
  }
13488
- const min = Math.min(minSum, 0);
13489
- const max = Math.max(maxSum, 0);
13490
- const span = Math.max(max - min, 1);
13491
- return { min, max, span };
13946
+ const { min, max, majorUnit } = niceValueAxisBounds(Math.min(minSum, 0), Math.max(maxSum, 0));
13947
+ return { min, max, span: Math.max(max - min, Number.EPSILON), majorUnit };
13492
13948
  }
13493
13949
  /**
13494
13950
  * Map a data value to a Y pixel coordinate (top = max, bottom = min).
@@ -13514,8 +13970,16 @@ function valueToY(val, range, topY, bottomY) {
13514
13970
  // ─────────────────────────────────────────────────────────────────────────────
13515
13971
  // Formatting
13516
13972
  // ─────────────────────────────────────────────────────────────────────────────
13517
- /** Format a numeric axis label to a short human-readable string. */
13518
- function formatAxisValue(val) {
13973
+ /**
13974
+ * Format a numeric axis or data label to a short human-readable string, or
13975
+ * through the chart's own `c:numFmt/@formatCode` when it declares one. See
13976
+ * `formatAxisValue` in `chart-helpers.ts`, which this mirrors.
13977
+ */
13978
+ function formatAxisValue(val, formatCode) {
13979
+ const formatted = formatChartNumber(val, formatCode);
13980
+ if (formatted !== undefined) {
13981
+ return formatted;
13982
+ }
13519
13983
  if (Math.abs(val) >= 1_000_000) {
13520
13984
  return `${(val / 1_000_000).toFixed(1)}M`;
13521
13985
  }
@@ -13593,11 +14057,25 @@ const GRIDLINE_COLOR = '#e2e8f0';
13593
14057
  const AXIS_LABEL_COLOR = '#64748b';
13594
14058
  const ZERO_LINE_COLOR = '#94a3b8';
13595
14059
  const TICK_COUNT = 5;
14060
+ /**
14061
+ * Tick values for a range: one per major unit when the automatic scale supplied
14062
+ * one (it snapped the bounds to whole multiples, so this lands on round numbers
14063
+ * exactly as PowerPoint does), otherwise an even division of the span.
14064
+ */
14065
+ function axisTickValues(range) {
14066
+ const unit = range.majorUnit;
14067
+ if (unit !== undefined && Number.isFinite(unit) && unit > 0 && !range.logScale) {
14068
+ const steps = Math.round((range.max - range.min) / unit);
14069
+ if (steps >= 1 && steps <= 100) {
14070
+ return Array.from({ length: steps + 1 }, (_unused, index) => range.min + unit * index);
14071
+ }
14072
+ }
14073
+ return Array.from({ length: TICK_COUNT + 1 }, (_unused, index) => range.min + (range.span / TICK_COUNT) * index);
14074
+ }
13596
14075
  function buildGridlinesAndLabels(range, layout) {
13597
14076
  const gridlines = [];
13598
14077
  const axisLabels = [];
13599
- for (let i = 0; i <= TICK_COUNT; i++) {
13600
- const val = range.min + (range.span / TICK_COUNT) * i;
14078
+ for (const val of axisTickValues(range)) {
13601
14079
  const y = valueToY(val, range, layout.plotTop, layout.plotBottom);
13602
14080
  gridlines.push({
13603
14081
  kind: 'line',
@@ -13940,15 +14418,27 @@ function buildChartViewModel(element) {
13940
14418
  : Array.from({ length: longestLen }, (_, i) => String(i + 1));
13941
14419
  // Pie-of-pie / bar-of-pie splits one series across a primary + secondary plot.
13942
14420
  if (chartType === 'ofPie') {
13943
- return withUserShapeOverlay(buildOfPieViewModel(element, chartData, categoryLabels), chartData);
14421
+ return withChartAreaFill(withUserShapeOverlay(buildOfPieViewModel(element, chartData, categoryLabels), chartData), chartData);
13944
14422
  }
13945
14423
  // 3D chart kinds keep their flat geometry but get an oblique depth pass driven
13946
14424
  // by c:view3D so they read as 3D instead of collapsing to a flat plot.
13947
14425
  const flat = buildFlatViewModel(element, chartData, categoryLabels, kind);
13948
14426
  if (is3DChartType(chartType)) {
13949
- return withUserShapeOverlay(applyChart3DDepth(flat, chartType, chartData.view3D), chartData);
14427
+ return withChartAreaFill(withUserShapeOverlay(applyChart3DDepth(flat, chartType, chartData.view3D), chartData), chartData);
13950
14428
  }
13951
- return withUserShapeOverlay(flat, chartData);
14429
+ return withChartAreaFill(withUserShapeOverlay(flat, chartData), chartData);
14430
+ }
14431
+ /**
14432
+ * Stamp the resolved chart-area / plot-area fills onto a finished view-model so
14433
+ * every binding paints (or skips) the same background rect. A chart that
14434
+ * declares `<a:noFill/>` gets `areaFill: undefined` and no rect at all.
14435
+ */
14436
+ function withChartAreaFill(vm, chartData) {
14437
+ return {
14438
+ ...vm,
14439
+ areaFill: chartAreaFill(chartData),
14440
+ plotFill: plotAreaFill(chartData),
14441
+ };
13952
14442
  }
13953
14443
  /**
13954
14444
  * Append the chart's `c:userShapes` drawing overlay to a finished view-model.
@@ -14021,6 +14511,8 @@ function buildFallbackViewModel(width, height, label) {
14021
14511
  return {
14022
14512
  svgWidth,
14023
14513
  svgHeight,
14514
+ // No chart data to read a fill from, so the historical wash stands.
14515
+ areaFill: DEFAULT_CHART_AREA_FILL,
14024
14516
  title: undefined,
14025
14517
  titleX: svgWidth / 2,
14026
14518
  titleY: 14,
@@ -14093,6 +14585,7 @@ function buildPieViewModel(element, chartData, categoryLabels, isDoughnut) {
14093
14585
  outerR,
14094
14586
  position: chartData.style.dataLabels?.position,
14095
14587
  showLeaderLines: chartData.style.dataLabels?.showLeaderLines,
14588
+ numberFormat: chartData.series[0]?.numberFormat,
14096
14589
  });
14097
14590
  dataLabels.push(...labelResult.labels);
14098
14591
  primitives.push(...labelResult.leaderLines);
@@ -14220,7 +14713,7 @@ function buildRadarViewModel(element, chartData, categoryLabels) {
14220
14713
  kind: 'text',
14221
14714
  x: p.x,
14222
14715
  y: p.y - 8,
14223
- text: formatAxisValue(val),
14716
+ text: formatAxisValue(val, series.numberFormat),
14224
14717
  fontSize: 7,
14225
14718
  fill: '#334155',
14226
14719
  textAnchor: 'middle',
@@ -27307,7 +27800,18 @@ function buildTextBlockStyle(element, options = {}) {
27307
27800
  // Always declare a size and a family: see DEFAULT_FONT_FAMILY for why an
27308
27801
  // omitted declaration is a real rendering difference, not a no-op.
27309
27802
  style.fontSize = ts?.fontSize || DEFAULT_TEXT_FONT_SIZE;
27310
- style.fontFamily = ts?.fontFamily || DEFAULT_FONT_FAMILY$1;
27803
+ // Through PANOSE substitution, never the bare authored name: the fallback
27804
+ // chain is what supplies the stand-in when the font is absent. Emitting
27805
+ // `font-family: "思源黑体 CN Light"` on its own leaves the browser to pick its
27806
+ // own default, which for CJK text is a SERIF - PowerPoint substitutes a sans,
27807
+ // so the whole deck rendered in the wrong typeface class. Runs already went
27808
+ // through `getSubstituteFontFamily` in `segmentStyleToCss`; the body did not,
27809
+ // and the body is what plain (unsegmented) text inherits.
27810
+ // The authored PANOSE picks the right generic (a serif font with no entry in
27811
+ // the substitution map must not fall back to sans, and vice versa).
27812
+ style.fontFamily = ts?.fontFamily
27813
+ ? getSubstituteFontFamily(ts.fontFamily, parsePanoseString(ts.latinFontPanose))
27814
+ : DEFAULT_FONT_FAMILY$1;
27311
27815
  style.fontWeight = ts?.bold ? 700 : 400;
27312
27816
  style.fontStyle = ts?.italic ? 'italic' : 'normal';
27313
27817
  style.textDecorationLine = decorations.length > 0 ? decorations.join(' ') : 'none';
@@ -60402,7 +60906,7 @@ function createLocalStorageBackend(namespace) {
60402
60906
  /** Try IndexedDB first; fall back to localStorage on any failure. */
60403
60907
  async function resolveBackend(dbName, namespace) {
60404
60908
  try {
60405
- const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-GPhhg6RN.mjs');
60909
+ const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-zvEiyBNU.mjs');
60406
60910
  const db = await openChatDb(dbName);
60407
60911
  return createIdbBackend(db);
60408
60912
  }
@@ -69517,14 +70021,16 @@ class ChartRendererComponent {
69517
70021
  class="pptx-ng-chart-svg"
69518
70022
  style="overflow: visible; display: block; pointer-events: none;"
69519
70023
  >
69520
- <!-- Background tint -->
69521
- <rect
69522
- x="0"
69523
- y="0"
69524
- [attr.width]="vm().svgWidth"
69525
- [attr.height]="vm().svgHeight"
69526
- fill="#0f172a0d"
69527
- />
70024
+ <!-- Chart-area fill; absent when the deck declares c:chartSpace/a:noFill -->
70025
+ @if (vm().areaFill) {
70026
+ <rect
70027
+ x="0"
70028
+ y="0"
70029
+ [attr.width]="vm().svgWidth"
70030
+ [attr.height]="vm().svgHeight"
70031
+ [attr.fill]="vm().areaFill"
70032
+ />
70033
+ }
69528
70034
 
69529
70035
  <!-- Chart title (data-chart-part enables in-place editing in edit mode) -->
69530
70036
  @if (vm().title) {
@@ -69678,14 +70184,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
69678
70184
  class="pptx-ng-chart-svg"
69679
70185
  style="overflow: visible; display: block; pointer-events: none;"
69680
70186
  >
69681
- <!-- Background tint -->
69682
- <rect
69683
- x="0"
69684
- y="0"
69685
- [attr.width]="vm().svgWidth"
69686
- [attr.height]="vm().svgHeight"
69687
- fill="#0f172a0d"
69688
- />
70187
+ <!-- Chart-area fill; absent when the deck declares c:chartSpace/a:noFill -->
70188
+ @if (vm().areaFill) {
70189
+ <rect
70190
+ x="0"
70191
+ y="0"
70192
+ [attr.width]="vm().svgWidth"
70193
+ [attr.height]="vm().svgHeight"
70194
+ [attr.fill]="vm().areaFill"
70195
+ />
70196
+ }
69689
70197
 
69690
70198
  <!-- Chart title (data-chart-part enables in-place editing in edit mode) -->
69691
70199
  @if (vm().title) {
@@ -91326,7 +91834,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
91326
91834
  }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
91327
91835
 
91328
91836
  // Generated by scripts/inline-shared.mjs from package.json. Do not edit.
91329
- const PPTX_ANGULAR_VIEWER_VERSION = "2.12.0";
91837
+ const PPTX_ANGULAR_VIEWER_VERSION = "2.12.1";
91330
91838
 
91331
91839
  /**
91332
91840
  * account-page.component.ts: File > Account content.
@@ -122410,4 +122918,4 @@ function cn(...values) {
122410
122918
  */
122411
122919
 
122412
122920
  export { CustomShowsComponent as $, ALIGN_OPTIONS as A, BroadcastDialogComponent as B, CHART_EDITOR_STYLES as C, CanvasFitService as D, ChartAxisOptionsComponent as E, ChartAxisStyleOptionsComponent as F, ChartComboTypeOptionsComponent as G, ChartDataEditorComponent as H, ChartDataLabelOptionsComponent as I, ChartDatapointMarkerOptionsComponent as J, ChartDatapointOptionsComponent as K, ChartDisplayOptionsComponent as L, ChartElementViewComponent as M, ChartErrorBarOptionsComponent as N, ChartMarkerOptionsComponent as O, ChartPartSelectionService as P, ChartPrimitivesComponent as Q, ChartRendererComponent as R, ChartTrendlineOptionsComponent as S, CollaborationCursorsComponent as T, CollaborationService as U, ColorChangedImageComponent as V, CommentsPanelComponent as W, CommentsService as X, ComparePanelComponent as Y, ConnectorRendererComponent as Z, ConnectorTextOverlayComponent as _, ANIMATION_PRESET_CATEGORIES as a, LoadContentService as a$, DATA_TABLE_HEADER_H as a0, DATA_TABLE_KEY_W as a1, DATA_TABLE_PADDING as a2, DATA_TABLE_ROW_H as a3, DEFAULT_BOUNDS as a4, DEFAULT_BROADCAST_SERVER_URL as a5, DEFAULT_CANVAS_HEIGHT as a6, DEFAULT_CANVAS_WIDTH as a7, DEFAULT_COLOR_SCHEME as a8, DEFAULT_FILL_COLOR as a9, EquationEditorDialogComponent as aA, EquationRendererComponent as aB, EquationTemplateGalleryComponent as aC, ExportProgressModalComponent as aD, ExportService as aE, FieldContextService as aF, FindBarComponent as aG, FindReplaceBarComponent as aH, FollowModeBarComponent as aI, FontEmbeddingListComponent as aJ, FontEmbeddingPanelComponent as aK, GALLERY_THEME_PRESETS as aL, GradientPickerComponent as aM, HANDOUT_OPTIONS as aN, HeaderFooterDialogComponent as aO, HyperlinkDialogComponent as aP, ImagePropertiesPanelComponent as aQ, InkDrawingService as aR, InkRendererComponent as aS, InsertSmartArtDialogComponent as aT, InspectorPaneHeaderComponent as aU, InspectorPanelComponent as aV, IsMobileService as aW, KeepAnnotationsDialogComponent as aX, LOCALE_CATALOG as aY, LONG_PRESS_DURATION_MS as aZ, LONG_PRESS_MOVE_TOLERANCE_PX as a_, DEFAULT_LAYOUT as aa, DEFAULT_PALETTE$1 as ab, DEFAULT_PATTERN_FILL_PRESET as ac, DEFAULT_PRINT_SETTINGS as ad, DEFAULT_SLIDE_BACKGROUND as ae, DEFAULT_STROKE_COLOR as af, DEFAULT_STYLE as ag, DEFAULT_TABLE_ROW_HEIGHT as ah, DEFAULT_TEXT_COLOR$1 as ai, DEFAULT_VIEWER_PROFILE as aj, DIRECTIONAL_PRESETS as ak, DIRECTION_OPTIONS as al, DocumentPropertiesCardComponent as am, EMBEDDED_FONTS_STYLE_ID as an, EMPHASIS_PRESETS as ao, ENTRANCE_PRESETS as ap, TEMPLATES as aq, EXIT_PRESETS as ar, EditorContextMenuComponent as as, EditorHistory as at, EditorStateService as au, EditorToolbarComponent as av, EffectsPanelComponent as aw, ElementRendererComponent as ax, EmbeddedFontsService as ay, EncryptedFileDialogComponent as az, AUDIENCE_HASH as b, RibbonHyperlinkButtonComponent as b$, LocalPresencePublisher as b0, MAX_ZOOM_SCALE as b1, MIN_ZOOM_SCALE as b2, MOTION_PATH_COLUMNS as b3, MediaPreviewComponent as b4, MediaPropertiesPanelComponent as b5, MediaRendererComponent as b6, MediaTrimTimelineComponent as b7, MobileBottomBarComponent as b8, MobileMenuSheetComponent as b9, PresentationSubtitleBarComponent as bA, PresentationToolbarComponent as bB, PresentationTransitionOverlayComponent as bC, PresenterViewComponent as bD, PresenterWindowService as bE, PrintDialogComponent as bF, PrintService as bG, PrintSettingsPanelComponent as bH, PropertiesDialogComponent as bI, REPEAT_MODE_OPTIONS as bJ, RESIZE_HANDLES as bK, RULER_FONT_SIZE as bL, RULER_THICKNESS as bM, ReadingViewOverlayComponent as bN, RemoteSelectionOverlayComponent as bO, RibbonAnimationGalleryComponent as bP, RibbonAnimationsSectionComponent as bQ, RibbonArrangeSectionComponent as bR, RibbonColorPopoverComponent as bS, RibbonComponent as bT, RibbonDesignSectionComponent as bU, RibbonDrawSectionComponent as bV, RibbonDrawingGroupComponent as bW, RibbonEditingSectionComponent as bX, RibbonFileSectionComponent as bY, RibbonFontControlsComponent as bZ, RibbonHomeSectionComponent as b_, MobilePresenterViewComponent as ba, MobileSheetComponent as bb, MobileSlidesSheetComponent as bc, MobileToolbarComponent as bd, ModalDialogComponent as be, Model3DRendererComponent as bf, NotesHandoutCardComponent as bg, NotesPanelComponent as bh, NotesToolbarComponent as bi, OleRendererComponent as bj, OutlineViewOverlayComponent as bk, POWER_POINT_VIEWER_PROVIDERS as bl, PRESENTER_CHANNEL_NAME as bm, PRESENTER_MSG_ORIGIN as bn, PRESENTER_TIMER_SEGMENT_MS as bo, PX_PER_CM as bp, PX_PER_INCH as bq, PasswordProtectionDialogComponent as br, PasswordStrengthMeterComponent as bs, PowerPointViewerComponent as bt, PresentToolbarAutoHide as bu, PresentationAnnotationOverlayComponent as bv, PresentationAnnotationsService as bw, PresentationOverlayComponent as bx, PresentationPropertiesPanelComponent as by, PresentationSettingsCardComponent as bz, AUDIENCE_NONCE_KEY as c, TableDataEditorComponent as c$, RibbonInsertFieldsComponent as c0, RibbonInsertSectionComponent as c1, RibbonMotionPathGalleryComponent as c2, RibbonParagraphControlsComponent as c3, RibbonPrimaryRowComponent as c4, RibbonReviewSectionComponent as c5, RibbonShapeExtrasComponent as c6, RibbonSlideshowSectionComponent as c7, RibbonTransitionsSectionComponent as c8, RibbonViewSectionComponent as c9, SlideBackgroundCardComponent as cA, SlideCanvasComponent as cB, SlideDefaultInspectorComponent as cC, SlideDiffChangesComponent as cD, SlideDiffRowComponent as cE, SlideDiffThumbnailsComponent as cF, SlideSizeCardComponent as cG, SlideSorterOverlayComponent as cH, SlideThemeOverridePanelComponent as cI, SlideTransitionCardComponent as cJ, SlidesPanelComponent as cK, SmartArt3DRendererComponent as cL, SmartArt3DService as cM, SmartArtPreviewComponent as cN, SmartArtPropertiesComponent as cO, SmartArtRendererComponent as cP, StatusBarComponent as cQ, TABLE_STRUCTURE_TOGGLES as cR, TEXT_3D_BOTTOM_BEVEL_KEYS as cS, TEXT_3D_TOP_BEVEL_KEYS as cT, TEXT_DIRECTION_OPTIONS$1 as cU, THEME_CATALOG as cV, TIMING_CURVE_OPTIONS as cW, TRIGGER_OPTIONS as cX, TYPE_LABELS as cY, TableCellAdvancedFillComponent as cZ, TableCellFormattingComponent as c_, RulerGuidesService as ca, SEQUENCE_OPTIONS as cb, SEVERITY_GROUPS as cc, SEVERITY_LABELS as cd, SHORTCUT_REFERENCE_ITEMS as ce, SLIDE_TRANSITION_KEYFRAMES as cf, DEFAULT_PALETTE as cg, PALETTES$1 as ch, SMART_ART_COLOR_SCHEMES as ci, SMART_ART_STYLE_OPTIONS as cj, SUB_ITEM_LABEL as ck, SVG_WARP_PRESETS as cl, SWIPE_MAX_VERTICAL_PX as cm, SWIPE_THRESHOLD_PX as cn, SelectionPaneComponent as co, SetUpSlideShowDialogComponent as cp, SettingsAppearanceTabComponent as cq, SettingsDialogComponent as cr, SettingsLanguageTabComponent as cs, ShareDialogComponent as ct, ShortcutPanelComponent as cu, ShowOptionsFieldsetComponent as cv, ShowSlidesFieldsetComponent as cw, SignatureStrippedDialogComponent as cx, SignaturesPanelComponent as cy, SignaturesService as cz, AVATAR_COLOR_SWATCHES as d, asMediaElement as d$, TablePropertiesComponent as d0, TableRendererComponent as d1, TableResizeOverlayComponent as d2, TableSelectionService as d3, TagsCardComponent as d4, Text3DBevelSectionComponent as d5, Text3DPanelComponent as d6, TextAdvancedPanelComponent as d7, ThemeEditorFieldsComponent as d8, ThemeGalleryComponent as d9, ViewerTouchGesturesService as dA, ViewerZoomService as dB, WEBM_MIME_CANDIDATES as dC, WriteBackScheduler as dD, ZoomNavigationService as dE, ZoomRendererComponent as dF, ZoomTargetService as dG, addCategory as dH, addCommentToList as dI, addGradientStopPatch as dJ, addItem as dK, addSeries as dL, addSubItem as dM, advanceStep as dN, affordanceElements as dO, aiToggleVisible as dP, alignPatch as dQ, animationFor as dR, animationPresetLabelKey as dS, annotationMapToInkInserts as dT, applyAcceptedDiff as dU, applyAnimationPreset as dV, applyFindReplacements as dW, applyFormatToElement as dX, applyMove as dY, applyResize as dZ, applyTableStylePreset as d_, ThemeSelectorCardComponent as da, TitleBarComponent as db, TitleBarSearchComponent as dc, TransitionDirectionPickerComponent as dd, TransitionPreviewComponent as de, VALIGN_OPTIONS as df, VIEWER_THEME as dg, VersionHistoryPanelComponent as dh, ViewerCanvasEditingService as di, ViewerCollabCursorService as dj, ViewerCollaborationSessionService as dk, ViewerCompareService as dl, ViewerCustomShowsService as dm, ViewerDialogsService as dn, ViewerDocumentPropertiesService as dp, ViewerExportService as dq, ViewerExtraDialogsComponent as dr, ViewerFileIOService as ds, ViewerFindReplaceService as dt, ViewerFormatPainterService as du, ViewerInspectorPanelService as dv, ViewerKeyboardService as dw, ViewerMobileSheetService as dx, ViewerPresentationModeService as dy, ViewerThemeGalleryService as dz, AccessibilityPanelComponent as e, canUngroupSelection as e$, assignUserColor as e0, attachTouchGestures as e1, beginNodeEdit as e2, bevelSizePatch as e3, boolFromEvent as e4, bringForward as e5, bringToFront as e6, buildBarActions as e7, buildBroadcastConfig as e8, buildBroadcastViewerUrl as e9, buildModel3DViewModel as eA, buildOleActionModel as eB, buildOleInfoRows as eC, buildPatternFillCss as eD, buildPrintHtmlDocument as eE, buildPropertiesPatch as eF, buildRegionMapViewModel as eG, buildSaveSlides as eH, buildShareUrl as eI, buildSmartArtInsertElement as eJ, buildSmartArtNodes as eK, buildStockViewModel as eL, buildSurfaceViewModel as eM, buildTableViewModel as eN, buildTreemapViewModel as eO, buildTrimFragment as eP, buildWaterfallViewModel as eQ, buildZeroLine as eR, buildZoomContainerStyle as eS, buildZoomViewModel as eT, bulletIndentPx as eU, canAddTopLevelNode as eV, canGroupSelection as eW, canRemoveTopLevelNode as eX, canSetStrokeWidth as eY, canStartBroadcast as eZ, canStartShare as e_, buildCategoryLabels as ea, buildCellParagraphs as eb, buildChartViewModel as ec, buildChatLogExport as ed, buildChatLogMarkdown as ee, buildChromeStyle as ef, buildClearHyperlinkPatch as eg, buildClickGroups as eh, buildColStyles as ei, buildCollaborationConfig as ej, buildComboViewModel as ek, buildCssGradientFromShapeStyle as el, buildDuotoneFilter as em, buildDuotoneFilterId as en, buildEmbeddedFontStyles as eo, buildEquationElement as ep, buildEquationSegment as eq, buildFallbackViewModel as er, buildFontFaceRule as es, buildGradientFillCss as et, buildGridlinesAndLabels as eu, buildHyperlinkPatch as ev, buildInkContainerStyle as ew, buildInkStrokes as ex, buildLegend as ey, buildModel3DContainerStyle as ez, AccessibilityService as f, createCustomShow as f$, canUseClipboard as f0, captionDisplayText as f1, cellRunStyle as f2, cellStyleToStyleMap as f3, cellTdStyle as f4, changeCountLabel as f5, changeIcon as f6, characterSpacingPatch as f7, checkFontAvailable as f8, clampCursorPosition as f9, computeHandoutLayout as fA, computeIsMobile as fB, computeIsTablet as fC, computeLinePoints as fD, computeLinearRegression as fE, computePageCount as fF, computePieLayout as fG, computePieSlicePath as fH, computePieSlices as fI, computePlotLayout as fJ, computeRSquared as fK, computeRadarPoints as fL, computeScatterDots as fM, computeSelectionBoxes as fN, computeSingleSelected as fO, computeSlideIndices as fP, computeSnap as fQ, computeStackedBarRects as fR, computeStackedValueRange as fS, computeTextLines as fT, computeTrendlinePrimitives as fU, computeValueRange as fV, convertOmmlToMathMl as fW, copyFormatFromElement as fX, countAccessibilityIssues as fY, countAnnotationStrokes as fZ, createAngularAiBridge as f_, clampGifDimensions as fa, clampIndex as fb, clampNotesFontSize as fc, clampScale as fd, clampStep as fe, clearAllLocalViewerData as ff, clearAudienceContent as fg, cn as fh, collectAccessibilityIssues as fi, collectElementText as fj, collectSlideText as fk, collectStoredChats as fl, collectUsedFontFamilies as fm, columnWidthStyle as fn, commitNodeText as fo, computeAlign as fp, computeAxisTitlePrimitives as fq, computeBarRects as fr, computeBubbleRadius as fs, computeCornerHandle as ft, computeDataTablePrimitives as fu, computeDistribute as fv, computeDrawingViewBox as fw, computeErrorBarPrimitives as fx, computeFocusTargets as fy, computeHandleBoxes as fz, AccountPageComponent as g, getDuotoneFilterDef as g$, createSwipeDismissDrag as g0, createWebrtcBundle as g1, createWebsocketBundle as g2, cssObjectToStyleMap as g3, currentColorScheme as g4, currentLayout as g5, currentStyle as g6, defaultCssVars as g7, defaultRadius as g8, defaultThemeColors as g9, eyedropperAvailable as gA, fillColorOf as gB, findInSlides as gC, findOwningSlideIndex as gD, findSlideIndexByElementId as gE, firstVisibleIndex as gF, fitPolynomial as gG, fitZoom as gH, focusTargetChips as gI, fontMimeForFormat as gJ, fontSizeOf as gK, formatAutoNumber as gL, formatAxisValue as gM, formatBytes as gN, formatCursorLabel as gO, formatElapsed as gP, formatFileSize as gQ, formatPropertyDate as gR, formatTime as gS, fpsToFrameIntervalMs as gT, generateBroadcastRoomId as gU, generateCommentId as gV, generateCustomShowId as gW, generatePressureCircles as gX, generateTicks as gY, getClrChangeParams as gZ, getContainerStyle as g_, deleteElementsByIds as ga, deleteVersion as gb, demoteNode as gc, deriveModel3DBlobUrl as gd, derivePresenceList as ge, describeSmartArtBounds as gf, disableGlowPatch as gg, disableInnerShadowPatch as gh, disableOuterShadowPatch as gi, disableReflectionPatch as gj, disableSoftEdgePatch as gk, duplicateElementById as gl, durationOf as gm, effectsStateOf as gn, enableGlowPatch as go, enableInnerShadowPatch as gp, enableOuterShadowPatch as gq, enableReflectionPatch as gr, enableSoftEdgePatch as gs, encodeGif as gt, estimatePageCount as gu, evenColumnWidths as gv, evenRowHeights as gw, exitPresentationFullscreen as gx, exportAiChatLogs as gy, extractPathPoints as gz, ActionSettingsPanelComponent as h, lastVisibleIndex as h$, getImageSrc as h0, getLocalStorageUsageSummary as h1, getOleAriaLabel as h2, getOleBadgeLabel as h3, getOleDisplayName as h4, getOleDownloadFileName as h5, getOleTypeColor as h6, getOleTypeLabel as h7, getPasswordStrength as h8, getPatternSvg as h9, hasVisibleSlideAfter as hA, headerLabel as hB, imageDimensions as hC, inkViewBox as hD, insertTableElementColumn as hE, insertTableElementRow as hF, interpolateWidth as hG, isAudienceTab as hH, isBold as hI, isBrowserOpenableMime as hJ, isChildNode as hK, isElementInteractive as hL, isInjectableUrl as hM, isItalic as hN, isPpactionUrl as hO, isPresenterMessage as hP, isSigned as hQ, isTextElement as hR, isTwoTableFocus as hS, isUnderline as hT, isUrlSafe as hU, isValidRoomId as hV, isViewportBackgroundPressTarget as hW, isZoomActivationKey as hX, issueTrackKey as hY, issueTypeLabel as hZ, keyToLabel as h_, getPlaceholderStyle as ha, getVersions as hb, getResolvedShapeClipPath as hc, getResolvedShapeClipPathFor as hd, getShapeFillStrokeStyle as he, getSlideBackgroundStyle as hf, getSlideTransitionAnimations as hg, getSmartArtNodeBounds as hh, getSpeechRecognitionCtor as hi, getTextBlockStyle as hj, getTextWarp as hk, getTouchDistance as hl, getWarpCategory as hm, getWarpPath as hn, gradientStateFromStyle as ho, gradientStateOf as hp, gradientStatePatch as hq, gridColumns as hr, groupElements as hs, groupIssuesBySeverity as ht, hasAnimation as hu, hasCopyableFormat as hv, hasExistingLink as hw, hasExitedFullscreen as hx, hasGradientFill as hy, hasPressureVariation as hz, AdvancedChartEditorComponent as i, promoteNode as i$, latexToMathml as i0, linePointsToSvgString as i1, lineSpacingPatch as i2, loadAudienceContent as i3, mergeCaptionResults as i4, mergeDown as i5, mergeRight as i6, mergeSelection as i7, moveElementBy as i8, moveNodeDown as i9, ommlToMathml as iA, ooxmlDashToCssBorderStyle as iB, openNativeEyeDropper as iC, overallStatus as iD, paletteColor as iE, parseAudienceNonce as iF, parseNodeTextarea as iG, partitionSlides as iH, patchChartData as iI, patchChartStyle as iJ, patchTableData as iK, patchTextStyle as iL, patternPresetOptions as iM, pendingElementStyles as iN, pickColorByClickFallback as iO, pickFile as iP, pickSupportedMimeType as iQ, planGifFrames as iR, planVideoSegments as iS, pointsToSvgPathD as iT, presenceToCursors as iU, presenterTimerProgress as iV, presetByLayout as iW, presetsForCategory as iX, pressuresToWidths as iY, prevVisibleIndex as iZ, projectDrawingShapes as i_, moveNodeUp as ia, msToFrameDelayCs as ib, narrowToCircle as ic, narrowToPolygon as id, narrowToRect as ie, newChartElement as ig, newEquationElement as ih, newPresetShapeElement as ii, newShapeElement as ij, newSmartArtElement as ik, newTableElement as il, newTextElement as im, nextVisibleIndex as io, nodeBold as ip, nodeEditBox as iq, nodeFillColor as ir, nodeFontColor as is, nodeIdFromKey as it, nodeItalic as iu, nodeStyle as iv, normalizeFontFormat as iw, normalizeSlidesPerPage as ix, normalizeValue as iy, numFromEvent as iz, AiChangeOverlayComponent as j, setAnimationExit as j$, provideViewerTheme as j0, radarAngle as j1, radarRingPoints as j2, readAsDataUrl as j3, recordWebm as j4, redistributeColumnWidth as j5, removeAnimation as j6, removeCategory as j7, removeTableElementColumn as j8, removeCommentFromList as j9, resolveTransitionDuration as jA, revealedElementStyles as jB, routeOrthogonalConnector as jC, rowStyle as jD, rulerDragToGuidePosition as jE, rulerHighlight as jF, rulerStripTicks as jG, sampleColorFromSlide as jH, sanitizeColor as jI, sanitizeSlideIndex as jJ, sanitizeUserName as jK, saveViewerProfile as jL, scanAvailableFonts as jM, searchSlides as jN, seedBroadcastFields as jO, seedHyperlinkDraft as jP, seedPropertiesDraft as jQ, seedShareFields as jR, segmentFrameCount as jS, selectValue$2 as jT, sendBackward as jU, sendToBack as jV, sequentialColorScale as jW, serializeWriteBack as jX, seriesColor as jY, setAnimationEmphasis as jZ, setAnimationEntrance as j_, removeElementAnimation as ja, removeGradientStopPatch as jb, removeNode as jc, removeTableElementRow as jd, removeSeries as je, renderToCanvas as jf, reorderAnimationDown as jg, reorderAnimationUp as jh, replaceInSlides as ji, replaceMatch as jj, requestPresentationFullscreen as jk, resizeElement as jl, resolveCaptionTracks as jm, resolveChartKind as jn, resolveFontVariant as jo, resolveHyperlinkHref as jp, resolveInteractiveElementId as jq, resolveMediaSrc as jr, resolveOleType as js, resolveParagraphBullet as jt, resolvePresenterNotes as ju, resolveProfileInitial as jv, resolveRegionCode as jw, resolveSlideAutoAdvanceMs as jx, resolvePalette as jy, resolveThemeCatalogEntry as jz, AiChatPanelComponent as k, textColorOf as k$, setAxis as k0, setAxisLogScale as k1, setAxisTitleStyle as k2, setCategoryLabel as k3, setCellText as k4, setColorScheme as k5, setDataLabels as k6, setDataPointExplosion as k7, setDataPointFill as k8, setDataPointLabel as k9, sheetAfterNavigate as kA, shouldBlockClickAdvance as kB, shouldUseSvgWarp as kC, showDirectionPicker as kD, showsTemplateAffordance as kE, signatureCountLabel as kF, signatureKey as kG, signatureTimestamp as kH, signerName as kI, statusLabel as kJ, slideNumberOf as kK, smartArtNodes as kL, paletteColour as kM, snapToGridStep as kN, splitCursorCell as kO, splitMergedCell as kP, statusKind as kQ, statusLabel$1 as kR, storeAudienceContent as kS, stringFromEvent$5 as kT, strokeColorOf as kU, strokeToInkElement as kV, strokeWidthOf as kW, styleShadowFilter as kX, textAdvancedPatch as kY, textAdvancedStateFromStyle as kZ, textAdvancedStateOf as k_, setDataPointMarker as ka, setDelay as kb, setDirection as kc, setDuration as kd, setElementPosition as ke, setGridlineStyle as kf, setLayout as kg, setLegend as kh, setNodeStyle as ki, setNodeText as kj, setRepeatCount as kk, setRepeatMode as kl, setSequence as km, setSeriesChartType as kn, setSeriesColor as ko, setSeriesErrorBars as kp, setSeriesMarker as kq, setSeriesName as kr, setSeriesTrendline as ks, setSeriesValue as kt, setStyle as ku, setTimingCurve as kv, setTitle as kw, setTrigger as kx, setTriggerShapeId as ky, shapeStylePatch as kz, AiChatService as l, textDirectionPatch as l0, textStyleOf as l1, textStylePatch as l2, themeStyle as l3, themeToCssVars as l4, thumbnailHeight as l5, thumbnailZoom as l6, toggleCommentResolvedInList as l7, toggleNodeBold as l8, toggleNodeItalic as l9, toggleSheet as la, topLevelNodeCount as lb, transformSelectedTextCase as lc, translationsEn as ld, ungroupElements as le, updateElementById as lf, updateGlowPatch as lg, updateGradientStopPatch as lh, updateInnerShadowPatch as li, updateOuterShadowPatch as lj, updateReflectionPatch as lk, vAlignPatch as ll, validatePassword as lm, validatePrintSettings as ln, validateRoomId as lo, valueToY as lp, vermilionDarkColors as lq, vermilionDarkTheme as lr, vermilionLightColors as ls, vermilionLightTheme as lt, vermilionRadius as lu, waypointsToPathD as lv, worstStatus as lw, zoomTargetSlideIndex as lx, AiComposerComponent as m, AiFocusBarComponent as n, AiFocusHighlightOverlayComponent as o, AiMessageListComponent as p, AiPanelStore as q, AiProposalCardComponent as r, AiSettingsSectionComponent as s, toChatSummary as t, AiToolCallCardComponent as u, AnimationAuthorPanelComponent as v, AnimationPanelComponent as w, AnimationPlaybackService as x, AutosaveService as y, CURSOR_PALETTE as z };
122413
- //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-DYqQlNxt.mjs.map
122921
+ //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-FnZONBKb.mjs.map