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.
- package/CHANGELOG.md +2 -0
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-GPhhg6RN.mjs → pptx-angular-viewer-chat-history-idb-zvEiyBNU.mjs} +2 -2
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-GPhhg6RN.mjs.map → pptx-angular-viewer-chat-history-idb-zvEiyBNU.mjs.map} +1 -1
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-DYqQlNxt.mjs → pptx-angular-viewer-pptx-angular-viewer-FnZONBKb.mjs} +569 -61
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-DYqQlNxt.mjs.map → pptx-angular-viewer-pptx-angular-viewer-FnZONBKb.mjs.map} +1 -1
- package/fesm2022/pptx-angular-viewer.mjs +1 -1
- package/package.json +2 -2
- package/types/pptx-angular-viewer.d.ts +31 -5
|
@@ -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,
|
|
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
|
-
/**
|
|
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
|
|
6538
|
-
|
|
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
|
-
/**
|
|
6566
|
-
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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 =
|
|
13465
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
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
|
-
/**
|
|
13518
|
-
|
|
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 (
|
|
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
|
-
|
|
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-
|
|
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
|
-
<!--
|
|
69521
|
-
|
|
69522
|
-
|
|
69523
|
-
|
|
69524
|
-
|
|
69525
|
-
|
|
69526
|
-
|
|
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
|
-
<!--
|
|
69682
|
-
|
|
69683
|
-
|
|
69684
|
-
|
|
69685
|
-
|
|
69686
|
-
|
|
69687
|
-
|
|
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.
|
|
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-
|
|
122921
|
+
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-FnZONBKb.mjs.map
|