ooxml-ui 1.30.0 → 1.32.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/README.md +10 -0
- package/custom-elements.json +4 -0
- package/dist/building-block-styles.d.ts +0 -1
- package/dist/chart/format-pane-3d.d.ts +0 -1
- package/dist/chart/format-pane-analysis.d.ts +0 -1
- package/dist/chart/format-pane-fill-line.d.ts +0 -1
- package/dist/chart/format-pane-text.d.ts +0 -1
- package/dist/{chunk-SBBFNAKM.js → chunk-32P252JS.js} +3 -3
- package/dist/{chunk-E4H3Y7M4.js → chunk-6TS7ASDJ.js} +1 -1
- package/dist/{chunk-BKHWBIXP.js → chunk-CALEXPBD.js} +132 -69
- package/dist/{chunk-SXVOXSTE.js → chunk-CDC5MAZS.js} +1 -1
- package/dist/chunk-DA57FPSN.js +54 -0
- package/dist/{chunk-HNREZW5U.js → chunk-KYXSQFDB.js} +484 -1
- package/dist/{chunk-IE6HKH4X.js → chunk-OKEFAQJT.js} +1 -1
- package/dist/controls.d.ts +6 -0
- package/dist/controls.d.ts.map +1 -1
- package/dist/controls.js +1 -1
- package/dist/dialog/dialog-session.d.ts +19 -0
- package/dist/dialog/dialog-session.d.ts.map +1 -0
- package/dist/docx/smartart-node-view.d.ts +1 -1
- package/dist/docx.js +36 -20
- package/dist/fonts/availability.d.ts +10 -0
- package/dist/fonts/availability.d.ts.map +1 -0
- package/dist/fonts/catalog.d.ts +63 -0
- package/dist/fonts/catalog.d.ts.map +1 -0
- package/dist/fonts/custom-fonts.d.ts +75 -0
- package/dist/fonts/custom-fonts.d.ts.map +1 -0
- package/dist/form/color-input/live-color-input.d.ts +93 -0
- package/dist/form/color-input/live-color-input.d.ts.map +1 -0
- package/dist/form/color-input/live-color-leaves.d.ts +34 -0
- package/dist/form/color-input/live-color-leaves.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -5
- package/dist/picture-effects.d.ts +6 -0
- package/dist/pptx/ai/host.cjs +41 -37
- package/dist/pptx/ai/host.d.ts +2 -0
- package/dist/pptx/ai/host.d.ts.map +1 -1
- package/dist/pptx/ai/host.mjs +2 -2
- package/dist/pptx/ai/index.cjs +47 -43
- package/dist/pptx/ai/index.d.ts +2 -0
- package/dist/pptx/ai/index.d.ts.map +1 -1
- package/dist/pptx/ai/index.mjs +3 -3
- package/dist/pptx/{chart-3d-view-scene-ZUGA3DKM.mjs → chart-3d-view-scene-HNL4NWJT.mjs} +2 -2
- package/dist/pptx/{chart-3d-view-scene-N7UQOYFI.cjs → chart-3d-view-scene-OPVBTZL5.cjs} +38 -38
- package/dist/pptx/chunk-3RIGT7H6.cjs +82 -0
- package/dist/pptx/{chunk-D7UYDESZ.mjs → chunk-7DT3UJQB.mjs} +3 -3
- package/dist/pptx/{chunk-KY75GY5O.mjs → chunk-7FXQHSPE.mjs} +6 -24
- package/dist/pptx/{chunk-45OYSCLD.mjs → chunk-CH4Z6H6C.mjs} +581 -230
- package/dist/pptx/{chunk-6KLPQQYP.cjs → chunk-D4LJJ7Z7.cjs} +77 -327
- package/dist/pptx/{chunk-MNSWEXYO.mjs → chunk-DACFW5LO.mjs} +26 -3
- package/dist/pptx/{chunk-IOOI63TH.cjs → chunk-FFWLDANS.cjs} +6 -24
- package/dist/pptx/{chunk-SMMEIEEJ.mjs → chunk-KGDMMWIY.mjs} +1 -1
- package/dist/pptx/{chunk-LXEMMWVI.mjs → chunk-LCCRLB7Q.mjs} +1 -1
- package/dist/pptx/{chunk-BMMTD6PB.cjs → chunk-M55PNMFQ.cjs} +2 -2
- package/dist/pptx/chunk-PM2SOLK3.mjs +79 -0
- package/dist/pptx/{chunk-QX6XPYVA.mjs → chunk-PTIGQSTY.mjs} +31 -14
- package/dist/pptx/{chunk-34LEUH5R.mjs → chunk-RZVEPTLN.mjs} +63 -316
- package/dist/pptx/{chunk-CQYWHRZE.cjs → chunk-S3L5NNCK.cjs} +1 -1
- package/dist/pptx/{chunk-H5IPNKX6.cjs → chunk-S5I64Y55.cjs} +12 -12
- package/dist/pptx/{chunk-WQA3KZRB.mjs → chunk-SPOECCPV.mjs} +1 -1
- package/dist/pptx/{chunk-YMWEU56T.cjs → chunk-TDIJHLS5.cjs} +927 -543
- package/dist/pptx/{chunk-QWF3PGUX.cjs → chunk-VEFFYJGG.cjs} +26 -2
- package/dist/pptx/{chunk-BSGCZ4JZ.cjs → chunk-WBGU7BWD.cjs} +31 -14
- package/dist/pptx/{chunk-2CBK46AW.cjs → chunk-ZS5EVODY.cjs} +48 -48
- package/dist/pptx/dom/index.cjs +431 -430
- package/dist/pptx/dom/index.mjs +15 -14
- package/dist/pptx/export/html2canvas-clone.cjs +6 -6
- package/dist/pptx/export/html2canvas-clone.mjs +1 -1
- package/dist/pptx/index.cjs +3423 -3355
- package/dist/pptx/index.mjs +8 -8
- package/dist/pptx/render/bullet-toggle-selection.d.ts +8 -4
- package/dist/pptx/render/bullet-toggle-selection.d.ts.map +1 -1
- package/dist/pptx/render/chart-box-whisker.d.ts.map +1 -1
- package/dist/pptx/render/chart-combo-stock.cjs +3 -3
- package/dist/pptx/render/chart-combo-stock.mjs +1 -1
- package/dist/pptx/render/chart-data-table-metrics.d.ts +1 -1
- package/dist/pptx/render/chart-data-table-metrics.d.ts.map +1 -1
- package/dist/pptx/render/chart-data-table-render.d.ts.map +1 -1
- package/dist/pptx/render/chart-date-axis.d.ts +1 -1
- package/dist/pptx/render/chart-date-axis.d.ts.map +1 -1
- package/dist/pptx/render/chart-date-format.d.ts +1 -30
- package/dist/pptx/render/chart-date-format.d.ts.map +1 -1
- package/dist/pptx/render/chart-funnel-sunburst.d.ts +1 -1
- package/dist/pptx/render/chart-funnel-sunburst.d.ts.map +1 -1
- package/dist/pptx/render/chart-line-path.d.ts +2 -26
- package/dist/pptx/render/chart-line-path.d.ts.map +1 -1
- package/dist/pptx/render/chart-manual-layout.d.ts +1 -1
- package/dist/pptx/render/chart-manual-layout.d.ts.map +1 -1
- package/dist/pptx/render/chart-overlays.cjs +7 -7
- package/dist/pptx/render/chart-overlays.mjs +1 -1
- package/dist/pptx/render/chart-surface-treemap.cjs +4 -4
- package/dist/pptx/render/chart-surface-treemap.mjs +1 -1
- package/dist/pptx/render/chart-view-model-layout.d.ts.map +1 -1
- package/dist/pptx/render/chart-view-model.cjs +44 -44
- package/dist/pptx/render/chart-view-model.mjs +1 -1
- package/dist/pptx/render/chart-waterfall-map.cjs +6 -6
- package/dist/pptx/render/chart-waterfall-map.mjs +1 -1
- package/dist/pptx/render/controller/ai-assistant.d.ts +73 -0
- package/dist/pptx/render/controller/ai-assistant.d.ts.map +1 -0
- package/dist/pptx/render/controller/autosave-controller.d.ts.map +1 -1
- package/dist/pptx/render/controller/collaboration-history.d.ts +25 -0
- package/dist/pptx/render/controller/collaboration-history.d.ts.map +1 -1
- package/dist/pptx/render/controller/history-controller.d.ts +9 -0
- package/dist/pptx/render/controller/history-controller.d.ts.map +1 -1
- package/dist/pptx/render/controller/index.d.ts +4 -0
- package/dist/pptx/render/controller/index.d.ts.map +1 -1
- package/dist/pptx/render/custom-fonts.cjs +9 -5
- package/dist/pptx/render/custom-fonts.d.ts +1 -64
- package/dist/pptx/render/custom-fonts.d.ts.map +1 -1
- package/dist/pptx/render/custom-fonts.mjs +1 -1
- package/dist/pptx/render/editor-geometry.d.ts +3 -15
- package/dist/pptx/render/editor-geometry.d.ts.map +1 -1
- package/dist/pptx/render/font-availability.d.ts +1 -9
- package/dist/pptx/render/font-availability.d.ts.map +1 -1
- package/dist/pptx/render/font-catalog.cjs +3 -3
- package/dist/pptx/render/font-catalog.d.ts +3 -61
- package/dist/pptx/render/font-catalog.d.ts.map +1 -1
- package/dist/pptx/render/font-catalog.mjs +1 -1
- package/dist/pptx/render/hyperlink-security.cjs +8 -8
- package/dist/pptx/render/hyperlink-security.d.ts +1 -27
- package/dist/pptx/render/hyperlink-security.d.ts.map +1 -1
- package/dist/pptx/render/hyperlink-security.mjs +1 -1
- package/dist/pptx/render/image-effects.d.ts.map +1 -1
- package/dist/pptx/render/index.d.ts +2 -0
- package/dist/pptx/render/index.d.ts.map +1 -1
- package/dist/pptx/render/inline-list-style.d.ts +2 -1
- package/dist/pptx/render/inline-list-style.d.ts.map +1 -1
- package/dist/pptx/render/live-color-input.d.ts +2 -92
- package/dist/pptx/render/live-color-input.d.ts.map +1 -1
- package/dist/pptx/render/live-color-leaves.d.ts +2 -33
- package/dist/pptx/render/live-color-leaves.d.ts.map +1 -1
- package/dist/pptx/render/options/autocorrect.d.ts +15 -2
- package/dist/pptx/render/options/autocorrect.d.ts.map +1 -1
- package/dist/pptx/render/picture-crop/crop-geometry.d.ts +2 -20
- package/dist/pptx/render/picture-crop/crop-geometry.d.ts.map +1 -1
- package/dist/pptx/render/slides-pane-model.d.ts +79 -0
- package/dist/pptx/render/slides-pane-model.d.ts.map +1 -0
- package/dist/pptx/render/table-cell-edit.d.ts +1 -1
- package/dist/pptx/render/table-cell-edit.d.ts.map +1 -1
- package/dist/pptx/render/text-list-style-update.d.ts +23 -2
- package/dist/pptx/render/text-list-style-update.d.ts.map +1 -1
- package/dist/pptx/render/text-script-fonts.d.ts +4 -72
- package/dist/pptx/render/text-script-fonts.d.ts.map +1 -1
- package/dist/pptx/render/text-warp-envelope-block.d.ts +10 -1
- package/dist/pptx/render/text-warp-envelope-block.d.ts.map +1 -1
- package/dist/pptx/render/text-warp-envelope-curves.d.ts +8 -0
- package/dist/pptx/render/text-warp-envelope-curves.d.ts.map +1 -1
- package/dist/pptx/render/text-warp-envelope-layout.d.ts +9 -3
- package/dist/pptx/render/text-warp-envelope-layout.d.ts.map +1 -1
- package/dist/pptx/render/text-warp-envelope-map.d.ts.map +1 -1
- package/dist/pptx/render/text-warp-envelope-wrap.d.ts +29 -0
- package/dist/pptx/render/text-warp-envelope-wrap.d.ts.map +1 -0
- package/dist/pptx/render/text-warp-preset-definitions.d.ts +13 -0
- package/dist/pptx/render/text-warp-preset-definitions.d.ts.map +1 -1
- package/dist/pptx/render/text-warp-preset-sampler.d.ts +12 -0
- package/dist/pptx/render/text-warp-preset-sampler.d.ts.map +1 -1
- package/dist/pptx/render/text-warp.d.ts +3 -2
- package/dist/pptx/render/text-warp.d.ts.map +1 -1
- package/dist/pptx/render/viewer-props-manifest.d.ts.map +1 -1
- package/dist/pptx/{smartart-insert-preview-SKFD7NCQ.mjs → smartart-insert-preview-RQUFRLSV.mjs} +9 -9
- package/dist/pptx/{smartart-insert-preview-7OL7VWEK.cjs → smartart-insert-preview-YKNB37GE.cjs} +10 -10
- package/dist/recovery-scheduler.d.ts +18 -0
- package/dist/recovery-scheduler.d.ts.map +1 -0
- package/dist/smartart/smartart-geometry.d.ts +1 -3
- package/dist/smartart/smartart-paint.d.ts +2 -1
- package/dist/smartart/smartart-picture.d.ts +7 -0
- package/dist/smartart/smartart-svg.d.ts +2 -1
- package/dist/smartart/smartart.d.ts +6 -0
- package/dist/smartart.js +1 -1
- package/dist/teams.js +2 -2
- package/dist/theme-bridge.d.ts +0 -1
- package/dist/theme.d.ts +0 -1
- package/dist/visio/controller.d.ts +2 -2
- package/dist/visio/viewer-autorecover.d.ts +0 -1
- package/dist/visio/viewer-commands.d.ts +1 -1
- package/dist/visio/viewer-guides.d.ts +2 -2
- package/dist/visio/viewer-pointer-gestures.d.ts +1 -1
- package/dist/visio/viewer-resize-frame.d.ts +2 -2
- package/dist/visio/viewer-resize-handles.d.ts +1 -1
- package/dist/visio.js +109 -62
- package/dist/xlsx/grid/smartart.d.ts +1 -1
- package/dist/xlsx.js +91 -62
- package/package.json +2 -2
- package/dist/pptx/chunk-WM5SW737.mjs +0 -27
- package/dist/pptx/chunk-Y6DO6SVT.cjs +0 -29
|
@@ -1959,16 +1959,16 @@ function bevelMarkup(rects, threeD) {
|
|
|
1959
1959
|
}
|
|
1960
1960
|
|
|
1961
1961
|
// src/pptx/render/chart-format/chart-format-geometry.ts
|
|
1962
|
-
function chartTextBox(text,
|
|
1962
|
+
function chartTextBox(text, pad = 3) {
|
|
1963
1963
|
const width = Math.max(4, text.text.length * text.fontSize * 0.58);
|
|
1964
1964
|
const left = text.textAnchor === "start" ? text.x : text.textAnchor === "end" ? text.x - width : text.x - width / 2;
|
|
1965
1965
|
const middle = text.dominantBaseline === "middle" || text.dominantBaseline === "central";
|
|
1966
1966
|
const top = middle ? text.y - text.fontSize / 2 : text.y - text.fontSize;
|
|
1967
1967
|
return {
|
|
1968
|
-
left: left -
|
|
1969
|
-
top: top -
|
|
1970
|
-
right: left + width +
|
|
1971
|
-
bottom: top + text.fontSize +
|
|
1968
|
+
left: left - pad,
|
|
1969
|
+
top: top - pad,
|
|
1970
|
+
right: left + width + pad,
|
|
1971
|
+
bottom: top + text.fontSize + pad
|
|
1972
1972
|
};
|
|
1973
1973
|
}
|
|
1974
1974
|
function chartPlotBounds(vm) {
|
|
@@ -2552,12 +2552,12 @@ var hasBox = (format, ownGradient = true) => Boolean(
|
|
|
2552
2552
|
format && !format.reset && (paints(format.fill, ownGradient) || format.line?.kind === "solid" || format.line?.kind === "gradient" || format.effects?.shadow || format.effects?.glow && format.effects.glow.radius > 0 || format.threeD?.bevelTop || format.threeD?.contour)
|
|
2553
2553
|
);
|
|
2554
2554
|
var boxFill = (fill, ownGradient) => fill?.kind === "gradient" && !ownGradient ? void 0 : fill;
|
|
2555
|
-
function union(boxes,
|
|
2555
|
+
function union(boxes, pad) {
|
|
2556
2556
|
if (boxes.length === 0) return void 0;
|
|
2557
|
-
const left = Math.min(...boxes.map((b) => b.left)) -
|
|
2558
|
-
const top = Math.min(...boxes.map((b) => b.top)) -
|
|
2559
|
-
const right = Math.max(...boxes.map((b) => b.right)) +
|
|
2560
|
-
const bottom = Math.max(...boxes.map((b) => b.bottom)) +
|
|
2557
|
+
const left = Math.min(...boxes.map((b) => b.left)) - pad;
|
|
2558
|
+
const top = Math.min(...boxes.map((b) => b.top)) - pad;
|
|
2559
|
+
const right = Math.max(...boxes.map((b) => b.right)) + pad;
|
|
2560
|
+
const bottom = Math.max(...boxes.map((b) => b.bottom)) + pad;
|
|
2561
2561
|
return { x: left, y: top, w: right - left, h: bottom - top };
|
|
2562
2562
|
}
|
|
2563
2563
|
var textBoxes = (texts) => (texts ?? []).filter((t) => !t.transform).map((t) => chartTextBox(t, 2));
|
|
@@ -3492,18 +3492,6 @@ function manualLegendAnchor(layout, frame, entryCount, vertical, auto) {
|
|
|
3492
3492
|
}
|
|
3493
3493
|
return vertical ? { x: rect.x, y: rect.y } : { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };
|
|
3494
3494
|
}
|
|
3495
|
-
function applyLabelManualLayout(layout, frame, point) {
|
|
3496
|
-
if (!chart.hasManualLayoutFields(layout)) {
|
|
3497
|
-
return point;
|
|
3498
|
-
}
|
|
3499
|
-
const rect = chart.resolveManualLayoutRect(layout, frame, {
|
|
3500
|
-
x: point.x,
|
|
3501
|
-
y: point.y,
|
|
3502
|
-
width: 1,
|
|
3503
|
-
height: 1
|
|
3504
|
-
});
|
|
3505
|
-
return rect ? { x: rect.x, y: rect.y } : point;
|
|
3506
|
-
}
|
|
3507
3495
|
function chartFrameToViewOffset(frame, view) {
|
|
3508
3496
|
return { x: (frame.width - view.svgWidth) / 2, y: (frame.height - view.svgHeight) / 2 };
|
|
3509
3497
|
}
|
|
@@ -3604,11 +3592,11 @@ function resolveMarkerLabelAnchor(position, point, offset = 7) {
|
|
|
3604
3592
|
}
|
|
3605
3593
|
}
|
|
3606
3594
|
function resolveBarLabelPlacement(chartData, series, pointIndex, rect, value, orientation, frame, defaultPosition) {
|
|
3607
|
-
const point = findPointLabel(series, pointIndex), position = point?.position ?? series.dataLabelOptions?.position ?? chartData.style?.dataLabels?.position ?? defaultPosition, anchor = resolveBarLabelAnchor(position, rect, value, orientation), shifted = applyLabelManualLayout(point?.layout, frame, anchor);
|
|
3595
|
+
const point = findPointLabel(series, pointIndex), position = point?.position ?? series.dataLabelOptions?.position ?? chartData.style?.dataLabels?.position ?? defaultPosition, anchor = resolveBarLabelAnchor(position, rect, value, orientation), shifted = chart.applyLabelManualLayout(point?.layout, frame, anchor);
|
|
3608
3596
|
return { ...anchor, x: shifted.x, y: shifted.y };
|
|
3609
3597
|
}
|
|
3610
3598
|
function resolveMarkerLabelPlacement(chartData, series, pointIndex, point, frame, offset = 7, defaultPosition) {
|
|
3611
|
-
const override = findPointLabel(series, pointIndex), position = override?.position ?? series.dataLabelOptions?.position ?? chartData.style?.dataLabels?.position ?? defaultPosition, anchor = resolveMarkerLabelAnchor(position, point, offset), shifted = applyLabelManualLayout(override?.layout, frame, anchor);
|
|
3599
|
+
const override = findPointLabel(series, pointIndex), position = override?.position ?? series.dataLabelOptions?.position ?? chartData.style?.dataLabels?.position ?? defaultPosition, anchor = resolveMarkerLabelAnchor(position, point, offset), shifted = chart.applyLabelManualLayout(override?.layout, frame, anchor);
|
|
3612
3600
|
return { ...anchor, x: shifted.x, y: shifted.y };
|
|
3613
3601
|
}
|
|
3614
3602
|
|
|
@@ -3878,60 +3866,6 @@ function dataLabelFontOverride(style) {
|
|
|
3878
3866
|
...style.color ? { fill: style.color } : {}
|
|
3879
3867
|
};
|
|
3880
3868
|
}
|
|
3881
|
-
|
|
3882
|
-
// src/pptx/render/chart-line-path.ts
|
|
3883
|
-
function smoothLinePath(points) {
|
|
3884
|
-
if (points.length === 0) {
|
|
3885
|
-
return "";
|
|
3886
|
-
}
|
|
3887
|
-
if (points.length === 1) {
|
|
3888
|
-
return `M${points[0].x.toFixed(2)},${points[0].y.toFixed(2)}`;
|
|
3889
|
-
}
|
|
3890
|
-
if (points.length === 2) {
|
|
3891
|
-
return `M${points[0].x.toFixed(2)},${points[0].y.toFixed(2)} L${points[1].x.toFixed(2)},${points[1].y.toFixed(2)}`;
|
|
3892
|
-
}
|
|
3893
|
-
let d = `M${points[0].x.toFixed(2)},${points[0].y.toFixed(2)}`;
|
|
3894
|
-
for (let i = 0; i < points.length - 1; i++) {
|
|
3895
|
-
const [cp1, cp2, end] = smoothSegment(points, i);
|
|
3896
|
-
d += ` C${cp1.x.toFixed(2)},${cp1.y.toFixed(2)} ${cp2.x.toFixed(2)},${cp2.y.toFixed(2)} ${end.x.toFixed(2)},${end.y.toFixed(2)}`;
|
|
3897
|
-
}
|
|
3898
|
-
return d;
|
|
3899
|
-
}
|
|
3900
|
-
function smoothSegment(points, i) {
|
|
3901
|
-
const p0 = points[i - 1] ?? points[i];
|
|
3902
|
-
const p1 = points[i];
|
|
3903
|
-
const p2 = points[i + 1];
|
|
3904
|
-
const p3 = points[i + 2] ?? p2;
|
|
3905
|
-
return [
|
|
3906
|
-
{ x: p1.x + (p2.x - p0.x) / 6, y: p1.y + (p2.y - p0.y) / 6 },
|
|
3907
|
-
{ x: p2.x - (p3.x - p1.x) / 6, y: p2.y - (p3.y - p1.y) / 6 },
|
|
3908
|
-
p2
|
|
3909
|
-
];
|
|
3910
|
-
}
|
|
3911
|
-
function sampleSmoothLine(points, stepsPerSegment = 16) {
|
|
3912
|
-
if (points.length < 3) {
|
|
3913
|
-
return [...points];
|
|
3914
|
-
}
|
|
3915
|
-
const out = [points[0]];
|
|
3916
|
-
for (let i = 0; i < points.length - 1; i++) {
|
|
3917
|
-
const start = points[i], [cp1, cp2, end] = smoothSegment(points, i);
|
|
3918
|
-
for (let step = 1; step <= stepsPerSegment; step++) {
|
|
3919
|
-
const t = step / stepsPerSegment, u = 1 - t, a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;
|
|
3920
|
-
out.push(
|
|
3921
|
-
step === stepsPerSegment ? end : {
|
|
3922
|
-
x: a * start.x + b * cp1.x + c * cp2.x + d * end.x,
|
|
3923
|
-
y: a * start.y + b * cp1.y + c * cp2.y + d * end.y
|
|
3924
|
-
}
|
|
3925
|
-
);
|
|
3926
|
-
}
|
|
3927
|
-
}
|
|
3928
|
-
return out;
|
|
3929
|
-
}
|
|
3930
|
-
function polylineRunsPath(runs) {
|
|
3931
|
-
return runs.map(
|
|
3932
|
-
(run) => run.map((p, i) => `${i === 0 ? "M" : "L"}${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(" ")
|
|
3933
|
-
).join(" ");
|
|
3934
|
-
}
|
|
3935
3869
|
var DEFAULT_COLOR = "#64748b";
|
|
3936
3870
|
function chartAxisTextStyle(axis, defaultFontSizePx = DEFAULT_CHART_TEXT_PX) {
|
|
3937
3871
|
return {
|
|
@@ -4330,7 +4264,7 @@ function buildScatter(chartData, layout, range) {
|
|
|
4330
4264
|
primitives.push(
|
|
4331
4265
|
series.smooth ?? smoothStyle ? {
|
|
4332
4266
|
kind: "path",
|
|
4333
|
-
d: smoothLinePath(points),
|
|
4267
|
+
d: chart.smoothLinePath(points),
|
|
4334
4268
|
stroke: c,
|
|
4335
4269
|
strokeWidth: 2.4,
|
|
4336
4270
|
fill: "none",
|
|
@@ -4487,12 +4421,12 @@ function visibleSpanCentre(y1, y2, band2) {
|
|
|
4487
4421
|
function clippedSeriesLine(points, smooth, style, band2) {
|
|
4488
4422
|
if (points.every((point) => insideBand(point, band2))) {
|
|
4489
4423
|
return [
|
|
4490
|
-
smooth ? { kind: "path", d: smoothLinePath(points), ...style } : { kind: "polyline", points: linePointsToSvgString(points), ...style }
|
|
4424
|
+
smooth ? { kind: "path", d: chart.smoothLinePath(points), ...style } : { kind: "polyline", points: linePointsToSvgString(points), ...style }
|
|
4491
4425
|
];
|
|
4492
4426
|
}
|
|
4493
4427
|
if (smooth) {
|
|
4494
|
-
const runs = clipPolylineToBand(sampleSmoothLine(points), band2);
|
|
4495
|
-
return runs.length > 0 ? [{ kind: "path", d: polylineRunsPath(runs), ...style }] : [];
|
|
4428
|
+
const runs = clipPolylineToBand(chart.sampleSmoothLine(points), band2);
|
|
4429
|
+
return runs.length > 0 ? [{ kind: "path", d: chart.polylineRunsPath(runs), ...style }] : [];
|
|
4496
4430
|
}
|
|
4497
4431
|
return clipPolylineToBand(points, band2).map((run) => ({
|
|
4498
4432
|
kind: "polyline",
|
|
@@ -5396,8 +5330,6 @@ function buildLines(chartData, catCount, layout, primaryRange, secondaryRange, s
|
|
|
5396
5330
|
}
|
|
5397
5331
|
return { primitives: [...primitives, ...labelBoxes], dataLabels };
|
|
5398
5332
|
}
|
|
5399
|
-
|
|
5400
|
-
// src/pptx/render/chart-data-table-metrics.ts
|
|
5401
5333
|
function resolveDataTableMetrics(chartData) {
|
|
5402
5334
|
const table = chartData.dataTable;
|
|
5403
5335
|
if (!table) {
|
|
@@ -5405,10 +5337,11 @@ function resolveDataTableMetrics(chartData) {
|
|
|
5405
5337
|
}
|
|
5406
5338
|
const sizePt = resolveChartTextStyle(chartData, table.txPr)?.fontSize;
|
|
5407
5339
|
const fontSize = sizePt !== void 0 ? chartFontPx(sizePt) : resolveChartStyleDefaults(chartData).bodyTextPx;
|
|
5408
|
-
|
|
5409
|
-
|
|
5410
|
-
|
|
5411
|
-
|
|
5340
|
+
return chart.chartDataTableMetrics(
|
|
5341
|
+
fontSize,
|
|
5342
|
+
chartData.series.map((s) => s.name ?? ""),
|
|
5343
|
+
table.showKeys !== false
|
|
5344
|
+
);
|
|
5412
5345
|
}
|
|
5413
5346
|
function labelsBesideTable(chartData, axis) {
|
|
5414
5347
|
return chartData.dataTable ? [] : axis.labels;
|
|
@@ -5494,14 +5427,14 @@ function computeDataTablePrimitives(chartData, layout, colorPalette) {
|
|
|
5494
5427
|
out.push(line2(x, top, x, bottom));
|
|
5495
5428
|
}
|
|
5496
5429
|
});
|
|
5497
|
-
if (showV
|
|
5430
|
+
if (showV) {
|
|
5498
5431
|
out.push(line2(layout.plotLeft, top, layout.plotLeft, bottom));
|
|
5499
5432
|
}
|
|
5500
5433
|
series.forEach((s, si) => {
|
|
5501
5434
|
const rowTop = top + rowH * (si + 1);
|
|
5502
5435
|
const cy = rowTop + rowH / 2;
|
|
5503
5436
|
if (showH) {
|
|
5504
|
-
out.push(line2(
|
|
5437
|
+
out.push(line2(left, rowTop, right, rowTop));
|
|
5505
5438
|
}
|
|
5506
5439
|
if (showK) {
|
|
5507
5440
|
const swatch = Math.max(6, Math.round(metrics.fontSize * 0.55));
|
|
@@ -5513,8 +5446,9 @@ function computeDataTablePrimitives(chartData, layout, colorPalette) {
|
|
|
5513
5446
|
h: swatch,
|
|
5514
5447
|
fill: seriesColor2(s, si, colorPalette)
|
|
5515
5448
|
});
|
|
5516
|
-
out.push(label(left + DATA_TABLE_PADDING + swatch + 3, cy, s.name, "start"));
|
|
5517
5449
|
}
|
|
5450
|
+
const keyInset = showK ? Math.max(6, Math.round(metrics.fontSize * 0.55)) + 3 : 0;
|
|
5451
|
+
out.push(label(left + DATA_TABLE_PADDING + keyInset, cy, s.name, "start"));
|
|
5518
5452
|
categories.forEach((_cat, ci) => {
|
|
5519
5453
|
const val = s.values[ci];
|
|
5520
5454
|
const x = layout.plotLeft + ci * cellW + cellW / 2;
|
|
@@ -5642,175 +5576,6 @@ function computeHelperLinePrimitives(chartData, layout, range, catCount, options
|
|
|
5642
5576
|
...computeHiLowLinePrimitives(chartData, layout, range, catCount, options)
|
|
5643
5577
|
];
|
|
5644
5578
|
}
|
|
5645
|
-
|
|
5646
|
-
// src/pptx/render/chart-date-format.ts
|
|
5647
|
-
var MONTH_ABBR = [
|
|
5648
|
-
"Jan",
|
|
5649
|
-
"Feb",
|
|
5650
|
-
"Mar",
|
|
5651
|
-
"Apr",
|
|
5652
|
-
"May",
|
|
5653
|
-
"Jun",
|
|
5654
|
-
"Jul",
|
|
5655
|
-
"Aug",
|
|
5656
|
-
"Sep",
|
|
5657
|
-
"Oct",
|
|
5658
|
-
"Nov",
|
|
5659
|
-
"Dec"
|
|
5660
|
-
];
|
|
5661
|
-
var MONTH_FULL = [
|
|
5662
|
-
"January",
|
|
5663
|
-
"February",
|
|
5664
|
-
"March",
|
|
5665
|
-
"April",
|
|
5666
|
-
"May",
|
|
5667
|
-
"June",
|
|
5668
|
-
"July",
|
|
5669
|
-
"August",
|
|
5670
|
-
"September",
|
|
5671
|
-
"October",
|
|
5672
|
-
"November",
|
|
5673
|
-
"December"
|
|
5674
|
-
];
|
|
5675
|
-
var WEEKDAY_ABBR = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
5676
|
-
var WEEKDAY_FULL = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
|
5677
|
-
function scanDateFormatTokens(code) {
|
|
5678
|
-
const tokens = [];
|
|
5679
|
-
let i = 0;
|
|
5680
|
-
while (i < code.length) {
|
|
5681
|
-
const ch = code[i];
|
|
5682
|
-
if (ch === '"') {
|
|
5683
|
-
const close = code.indexOf('"', i + 1);
|
|
5684
|
-
tokens.push({
|
|
5685
|
-
kind: "literal",
|
|
5686
|
-
text: close === -1 ? code.slice(i + 1) : code.slice(i + 1, close)
|
|
5687
|
-
});
|
|
5688
|
-
i = close === -1 ? code.length : close + 1;
|
|
5689
|
-
continue;
|
|
5690
|
-
}
|
|
5691
|
-
if (ch === "\\") {
|
|
5692
|
-
tokens.push({ kind: "literal", text: code[i + 1] ?? "" });
|
|
5693
|
-
i += 2;
|
|
5694
|
-
continue;
|
|
5695
|
-
}
|
|
5696
|
-
const rest = code.slice(i);
|
|
5697
|
-
if (/^am\/pm/iu.test(rest)) {
|
|
5698
|
-
tokens.push({ kind: "ampm", upper: ch === ch.toUpperCase(), short: false });
|
|
5699
|
-
i += 5;
|
|
5700
|
-
continue;
|
|
5701
|
-
}
|
|
5702
|
-
if (/^a\/p/iu.test(rest)) {
|
|
5703
|
-
tokens.push({ kind: "ampm", upper: ch === ch.toUpperCase(), short: true });
|
|
5704
|
-
i += 3;
|
|
5705
|
-
continue;
|
|
5706
|
-
}
|
|
5707
|
-
if (/[ymdhs]/iu.test(ch)) {
|
|
5708
|
-
let j = i + 1;
|
|
5709
|
-
while (j < code.length && code[j].toLowerCase() === ch.toLowerCase()) {
|
|
5710
|
-
j += 1;
|
|
5711
|
-
}
|
|
5712
|
-
tokens.push({
|
|
5713
|
-
kind: "letters",
|
|
5714
|
-
letter: ch.toLowerCase(),
|
|
5715
|
-
count: j - i
|
|
5716
|
-
});
|
|
5717
|
-
i = j;
|
|
5718
|
-
continue;
|
|
5719
|
-
}
|
|
5720
|
-
tokens.push({ kind: "literal", text: ch });
|
|
5721
|
-
i += 1;
|
|
5722
|
-
}
|
|
5723
|
-
return tokens;
|
|
5724
|
-
}
|
|
5725
|
-
function findNonLiteral(tokens, index, step) {
|
|
5726
|
-
for (let i = index + step; i >= 0 && i < tokens.length; i += step) {
|
|
5727
|
-
if (tokens[i].kind !== "literal") {
|
|
5728
|
-
return tokens[i];
|
|
5729
|
-
}
|
|
5730
|
-
}
|
|
5731
|
-
return void 0;
|
|
5732
|
-
}
|
|
5733
|
-
function pad(n, width) {
|
|
5734
|
-
return String(n).padStart(width, "0");
|
|
5735
|
-
}
|
|
5736
|
-
function renderDatePart(part, count, date, twelveHour) {
|
|
5737
|
-
switch (part) {
|
|
5738
|
-
case "year":
|
|
5739
|
-
return count >= 4 ? pad(date.getUTCFullYear(), 4) : pad(date.getUTCFullYear() % 100, 2);
|
|
5740
|
-
case "month":
|
|
5741
|
-
if (count >= 4) {
|
|
5742
|
-
return MONTH_FULL[date.getUTCMonth()] ?? "";
|
|
5743
|
-
}
|
|
5744
|
-
if (count === 3) {
|
|
5745
|
-
return MONTH_ABBR[date.getUTCMonth()] ?? "";
|
|
5746
|
-
}
|
|
5747
|
-
return count >= 2 ? pad(date.getUTCMonth() + 1, 2) : String(date.getUTCMonth() + 1);
|
|
5748
|
-
case "day":
|
|
5749
|
-
if (count >= 4) {
|
|
5750
|
-
return WEEKDAY_FULL[date.getUTCDay()] ?? "";
|
|
5751
|
-
}
|
|
5752
|
-
if (count === 3) {
|
|
5753
|
-
return WEEKDAY_ABBR[date.getUTCDay()] ?? "";
|
|
5754
|
-
}
|
|
5755
|
-
return count >= 2 ? pad(date.getUTCDate(), 2) : String(date.getUTCDate());
|
|
5756
|
-
case "hour": {
|
|
5757
|
-
const h24 = date.getUTCHours();
|
|
5758
|
-
const h = twelveHour ? h24 % 12 === 0 ? 12 : h24 % 12 : h24;
|
|
5759
|
-
return count >= 2 ? pad(h, 2) : String(h);
|
|
5760
|
-
}
|
|
5761
|
-
case "minute":
|
|
5762
|
-
return count >= 2 ? pad(date.getUTCMinutes(), 2) : String(date.getUTCMinutes());
|
|
5763
|
-
case "second":
|
|
5764
|
-
return count >= 2 ? pad(date.getUTCSeconds(), 2) : String(date.getUTCSeconds());
|
|
5765
|
-
}
|
|
5766
|
-
}
|
|
5767
|
-
function renderExcelDateFormat(date, code) {
|
|
5768
|
-
const tokens = scanDateFormatTokens(code);
|
|
5769
|
-
const hasAmPm = tokens.some((t) => t.kind === "ampm");
|
|
5770
|
-
let out = "";
|
|
5771
|
-
for (const [index, token] of tokens.entries()) {
|
|
5772
|
-
if (token.kind === "literal") {
|
|
5773
|
-
out += token.text;
|
|
5774
|
-
continue;
|
|
5775
|
-
}
|
|
5776
|
-
if (token.kind === "ampm") {
|
|
5777
|
-
const hour = date.getUTCHours(), text = token.short ? hour < 12 ? "A" : "P" : hour < 12 ? "AM" : "PM";
|
|
5778
|
-
out += token.upper ? text : text.toLowerCase();
|
|
5779
|
-
continue;
|
|
5780
|
-
}
|
|
5781
|
-
if (token.letter === "m") {
|
|
5782
|
-
const prev = findNonLiteral(tokens, index, -1), next = findNonLiteral(tokens, index, 1), isMinute = prev?.kind === "letters" && prev.letter === "h" || next?.kind === "letters" && next.letter === "s";
|
|
5783
|
-
out += renderDatePart(isMinute ? "minute" : "month", token.count, date, hasAmPm);
|
|
5784
|
-
continue;
|
|
5785
|
-
}
|
|
5786
|
-
const part = { y: "year", d: "day", h: "hour", s: "second" };
|
|
5787
|
-
out += renderDatePart(part[token.letter], token.count, date, hasAmPm);
|
|
5788
|
-
}
|
|
5789
|
-
return out;
|
|
5790
|
-
}
|
|
5791
|
-
function formatDate(date, unit, format) {
|
|
5792
|
-
if (format && /[ymdhs]/iu.test(format)) {
|
|
5793
|
-
const rendered = renderExcelDateFormat(date, format);
|
|
5794
|
-
if (rendered.length > 0) {
|
|
5795
|
-
return rendered;
|
|
5796
|
-
}
|
|
5797
|
-
}
|
|
5798
|
-
const month = date.toLocaleString("en-US", { month: "short", timeZone: "UTC" }), year = String(date.getUTCFullYear()), day = String(date.getUTCDate());
|
|
5799
|
-
if (unit === "years") {
|
|
5800
|
-
return year;
|
|
5801
|
-
}
|
|
5802
|
-
if (unit === "months") {
|
|
5803
|
-
return `${month} ${year}`;
|
|
5804
|
-
}
|
|
5805
|
-
return `${day} ${month}`;
|
|
5806
|
-
}
|
|
5807
|
-
|
|
5808
|
-
// src/pptx/render/chart-date-axis.ts
|
|
5809
|
-
var DAY_MS = 864e5;
|
|
5810
|
-
function excelSerialToDate(serial5, date1904 = false) {
|
|
5811
|
-
const epoch2 = date1904 ? Date.UTC(1904, 0, 1) : Date.UTC(1899, 11, serial5 < 60 ? 31 : 30);
|
|
5812
|
-
return new Date(epoch2 + serial5 * DAY_MS);
|
|
5813
|
-
}
|
|
5814
5579
|
function primaryDateAxis(chartData) {
|
|
5815
5580
|
return chartData.axes?.find((axis) => axis.axisType === "dateAx" && axis.axPos !== "t") ?? chartData.axes?.find((axis) => axis.axisType === "dateAx");
|
|
5816
5581
|
}
|
|
@@ -5818,17 +5583,6 @@ function serialToX(serial5, min, max, layout) {
|
|
|
5818
5583
|
const ratio = max === min ? 0.5 : (serial5 - min) / (max - min);
|
|
5819
5584
|
return layout.plotLeft + ratio * layout.plotWidth;
|
|
5820
5585
|
}
|
|
5821
|
-
function addUnit(date, amount, unit) {
|
|
5822
|
-
const next = new Date(date);
|
|
5823
|
-
if (unit === "days") {
|
|
5824
|
-
next.setUTCDate(next.getUTCDate() + amount);
|
|
5825
|
-
} else if (unit === "months") {
|
|
5826
|
-
next.setUTCMonth(next.getUTCMonth() + amount);
|
|
5827
|
-
} else {
|
|
5828
|
-
next.setUTCFullYear(next.getUTCFullYear() + amount);
|
|
5829
|
-
}
|
|
5830
|
-
return next;
|
|
5831
|
-
}
|
|
5832
5586
|
function tickLine2(x, y, axis, minor) {
|
|
5833
5587
|
const placement = minor ? axis.minorTickMark : axis.majorTickMark;
|
|
5834
5588
|
if (!placement || placement === "none" || isNoLine(axis.spPr)) {
|
|
@@ -5848,15 +5602,6 @@ function tickLine2(x, y, axis, minor) {
|
|
|
5848
5602
|
...chartLineStyle(axis.spPr)
|
|
5849
5603
|
};
|
|
5850
5604
|
}
|
|
5851
|
-
function calendarTicks(min, max, date1904, unit, step) {
|
|
5852
|
-
const result = [];
|
|
5853
|
-
let date = excelSerialToDate(min, date1904);
|
|
5854
|
-
for (let guard = 0; guard < 1e3 && date.getTime() <= excelSerialToDate(max, date1904).getTime(); guard++) {
|
|
5855
|
-
result.push(min + (date.getTime() - excelSerialToDate(min, date1904).getTime()) / DAY_MS);
|
|
5856
|
-
date = addUnit(date, step, unit);
|
|
5857
|
-
}
|
|
5858
|
-
return result;
|
|
5859
|
-
}
|
|
5860
5605
|
function buildDateAxisPlan(chartData, layout, selectedAxis, axisY) {
|
|
5861
5606
|
const dates = chartData.dateCategories;
|
|
5862
5607
|
const axis = selectedAxis ?? primaryDateAxis(chartData);
|
|
@@ -5878,7 +5623,7 @@ function buildDateAxisPlan(chartData, layout, selectedAxis, axisY) {
|
|
|
5878
5623
|
return axis.orientation === "maxMin" ? layout.plotLeft + layout.plotWidth - (x - layout.plotLeft) : x;
|
|
5879
5624
|
});
|
|
5880
5625
|
const unit = axis.majorTimeUnit ?? axis.baseTimeUnit ?? "days";
|
|
5881
|
-
const ticks = calendarTicks(
|
|
5626
|
+
const ticks = chart.calendarTicks(
|
|
5882
5627
|
min,
|
|
5883
5628
|
max,
|
|
5884
5629
|
dates.date1904 ?? false,
|
|
@@ -5903,8 +5648,8 @@ function buildDateAxisPlan(chartData, layout, selectedAxis, axisY) {
|
|
|
5903
5648
|
kind: "text",
|
|
5904
5649
|
x,
|
|
5905
5650
|
y: labelsAbove ? labelY - offset : labelY + offset,
|
|
5906
|
-
text: formatDate(
|
|
5907
|
-
excelSerialToDate(serial5, dates.date1904),
|
|
5651
|
+
text: chart.formatDate(
|
|
5652
|
+
chart.excelSerialToDate(serial5, dates.date1904),
|
|
5908
5653
|
unit,
|
|
5909
5654
|
axis.numFmt?.formatCode ?? dates.formatCode
|
|
5910
5655
|
),
|
|
@@ -5937,7 +5682,7 @@ function buildDateAxisPlan(chartData, layout, selectedAxis, axisY) {
|
|
|
5937
5682
|
}
|
|
5938
5683
|
if (!axis.deleted && axis.minorTickMark && axis.minorTickMark !== "none") {
|
|
5939
5684
|
const minorUnit = axis.minorTimeUnit ?? axis.baseTimeUnit ?? unit;
|
|
5940
|
-
for (const serial5 of calendarTicks(
|
|
5685
|
+
for (const serial5 of chart.calendarTicks(
|
|
5941
5686
|
min,
|
|
5942
5687
|
max,
|
|
5943
5688
|
dates.date1904 ?? false,
|
|
@@ -7361,20 +7106,14 @@ function computeBoxWhiskerGeometry(chartData, rawCategories, layout, range, colo
|
|
|
7361
7106
|
const observations = rows.map((row) => ({ row, value: series.values[row] })).filter((item) => item.value !== void 0);
|
|
7362
7107
|
const values = observations.map((item) => item.value);
|
|
7363
7108
|
const options = series.boxWhiskerOptions;
|
|
7364
|
-
const
|
|
7365
|
-
|
|
7366
|
-
|
|
7367
|
-
|
|
7368
|
-
const iqr = stats.q3 - stats.q1;
|
|
7369
|
-
const lowerFence = stats.q1 - 1.5 * iqr;
|
|
7370
|
-
const upperFence = stats.q3 + 1.5 * iqr;
|
|
7371
|
-
const inlierValues = values.filter(
|
|
7372
|
-
(value) => !options || value >= lowerFence && value <= upperFence
|
|
7109
|
+
const distribution = chart.boxWhiskerDistribution(
|
|
7110
|
+
values,
|
|
7111
|
+
options?.quartileMethod ?? "exclusive",
|
|
7112
|
+
options !== void 0
|
|
7373
7113
|
);
|
|
7374
|
-
|
|
7375
|
-
const
|
|
7114
|
+
if (!distribution) return;
|
|
7115
|
+
const { stats, whiskerMin, whiskerMax, mean } = distribution;
|
|
7376
7116
|
const boxX = layout.plotLeft + groupWidth * categoryIndex + slotWidth * seriesIndex + (slotWidth - boxW) / 2;
|
|
7377
|
-
const mean = values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
7378
7117
|
output.push({
|
|
7379
7118
|
stats,
|
|
7380
7119
|
boxX,
|
|
@@ -7465,11 +7204,8 @@ function whiskerPrimitives(geometry) {
|
|
|
7465
7204
|
}
|
|
7466
7205
|
function optionPrimitives(geometry) {
|
|
7467
7206
|
const options = geometry.options;
|
|
7468
|
-
if (!options) {
|
|
7469
|
-
return [];
|
|
7470
|
-
}
|
|
7471
7207
|
const output = [];
|
|
7472
|
-
if (options
|
|
7208
|
+
if (options?.showMeanLine) {
|
|
7473
7209
|
output.push({
|
|
7474
7210
|
kind: "line",
|
|
7475
7211
|
x1: geometry.boxX,
|
|
@@ -7480,17 +7216,17 @@ function optionPrimitives(geometry) {
|
|
|
7480
7216
|
strokeWidth: 1.5
|
|
7481
7217
|
});
|
|
7482
7218
|
}
|
|
7483
|
-
if (options
|
|
7219
|
+
if (options?.showMeanMarker !== false) {
|
|
7484
7220
|
output.push({
|
|
7485
|
-
kind: "
|
|
7486
|
-
|
|
7487
|
-
|
|
7488
|
-
|
|
7489
|
-
|
|
7221
|
+
kind: "path",
|
|
7222
|
+
d: chart.boxMeanMarkerPath(geometry.xMid, geometry.yMean),
|
|
7223
|
+
fill: "none",
|
|
7224
|
+
stroke: "#0f766e",
|
|
7225
|
+
strokeWidth: 1.5
|
|
7490
7226
|
});
|
|
7491
7227
|
}
|
|
7492
7228
|
for (const point of geometry.points) {
|
|
7493
|
-
if (point.outlier && !options
|
|
7229
|
+
if (point.outlier && !options?.showOutlierPoints || !point.outlier && !options?.showInnerPoints) {
|
|
7494
7230
|
continue;
|
|
7495
7231
|
}
|
|
7496
7232
|
output.push({
|
|
@@ -7871,15 +7607,17 @@ function computeFunnelSegments(values, plotLeft, plotTop, plotWidth, plotHeight,
|
|
|
7871
7607
|
if (count === 0) {
|
|
7872
7608
|
return [];
|
|
7873
7609
|
}
|
|
7874
|
-
const maxVal = Math.max(...values.map((v) => Math.abs(v)), 1);
|
|
7875
|
-
const segH = plotHeight / Math.max(count, 1);
|
|
7876
|
-
const centerX = plotLeft + plotWidth / 2;
|
|
7877
7610
|
const fill = seriesColorOverride ?? paletteColor2(0, colorPalette);
|
|
7878
7611
|
const out = [];
|
|
7879
|
-
for (
|
|
7612
|
+
for (const bar of chart.computeFunnelGeometry(values, {
|
|
7613
|
+
x: plotLeft,
|
|
7614
|
+
y: plotTop,
|
|
7615
|
+
width: plotWidth,
|
|
7616
|
+
height: plotHeight
|
|
7617
|
+
})) {
|
|
7618
|
+
const i = bar.index;
|
|
7880
7619
|
const val = values[i];
|
|
7881
|
-
const w =
|
|
7882
|
-
const y = plotTop + i * segH;
|
|
7620
|
+
const w = bar.width, y = bar.y, segH = bar.height, centerX = bar.center;
|
|
7883
7621
|
const labelY = y + segH / 2 + 4;
|
|
7884
7622
|
const d = [
|
|
7885
7623
|
`M ${centerX - w / 2} ${y}`,
|
|
@@ -7930,11 +7668,20 @@ function buildFunnelViewModel(element, chartData, categoryLabels) {
|
|
|
7930
7668
|
}
|
|
7931
7669
|
const funnelSeries = chartData.series[0];
|
|
7932
7670
|
segments.forEach((seg, i) => {
|
|
7671
|
+
if (!funnelSeries || !funnelSeries.dataLabelOptions && !chartData.style?.dataLabels && !funnelSeries.dataLabels?.some((label2) => label2.idx === i))
|
|
7672
|
+
return;
|
|
7673
|
+
const label = buildDataLabelText({
|
|
7674
|
+
chartData,
|
|
7675
|
+
series: funnelSeries,
|
|
7676
|
+
pointIndex: i,
|
|
7677
|
+
value: values[i]
|
|
7678
|
+
});
|
|
7679
|
+
if (!label) return;
|
|
7933
7680
|
dataLabels.push({
|
|
7934
7681
|
kind: "text",
|
|
7935
7682
|
x: seg.labelX,
|
|
7936
7683
|
y: seg.labelY,
|
|
7937
|
-
text:
|
|
7684
|
+
text: label.text,
|
|
7938
7685
|
fontSize: seg.fontSize,
|
|
7939
7686
|
fill: "#ffffff",
|
|
7940
7687
|
textAnchor: "middle",
|
|
@@ -7962,7 +7709,7 @@ function buildFunnelViewModel(element, chartData, categoryLabels) {
|
|
|
7962
7709
|
categoryLabels: categoryAxisLabels,
|
|
7963
7710
|
primitives,
|
|
7964
7711
|
dataLabels,
|
|
7965
|
-
//
|
|
7712
|
+
// The PPTX host keeps its existing funnel legend policy.
|
|
7966
7713
|
legend: [],
|
|
7967
7714
|
legendX: layout.svgWidth / 2,
|
|
7968
7715
|
legendY: layout.svgHeight - 8,
|
|
@@ -9138,7 +8885,7 @@ function applyManualDrag(point, pointIndex, params) {
|
|
|
9138
8885
|
const layout = layoutFor(pointIndex);
|
|
9139
8886
|
const viewOffset = chartFrameToViewOffset(frame, { svgWidth, svgHeight });
|
|
9140
8887
|
const framePoint = { x: point.x + viewOffset.x, y: point.y + viewOffset.y };
|
|
9141
|
-
const shifted = applyLabelManualLayout(layout, frame, framePoint);
|
|
8888
|
+
const shifted = chart.applyLabelManualLayout(layout, frame, framePoint);
|
|
9142
8889
|
return { x: shifted.x - viewOffset.x, y: shifted.y - viewOffset.y };
|
|
9143
8890
|
}
|
|
9144
8891
|
function leaderLine2(slice, cx, cy, outerR, to, style) {
|
|
@@ -9535,8 +9282,6 @@ function buildPieViewModel(element, chartData, categoryLabels, isDoughnut) {
|
|
|
9535
9282
|
legendAnchor
|
|
9536
9283
|
};
|
|
9537
9284
|
}
|
|
9538
|
-
|
|
9539
|
-
// src/pptx/render/chart-view-model-layout.ts
|
|
9540
9285
|
function categoryAxisBand(chartData) {
|
|
9541
9286
|
const axis = chartData.axes?.find(
|
|
9542
9287
|
(candidate) => candidate.axisType === "catAx" || candidate.axisType === "dateAx"
|
|
@@ -9585,20 +9330,22 @@ function computePlotLayout(elementWidth, elementHeight, chartData, hasAxes, opti
|
|
|
9585
9330
|
plotLeft = Math.max(plotLeft, 8 + tableMetrics.keyW);
|
|
9586
9331
|
}
|
|
9587
9332
|
const autoPlotHeight = Math.max(plotBottom - plotTop, 1);
|
|
9588
|
-
const plotLayout = manualLayoutOf(chartData, "plotArea"), manual = chart.
|
|
9333
|
+
const plotLayout = manualLayoutOf(chartData, "plotArea"), manual = chart.resolveManualPlotRect(
|
|
9589
9334
|
plotLayout,
|
|
9590
9335
|
{ width: svgWidth, height: svgHeight },
|
|
9591
|
-
{ x: plotLeft, y: plotTop, width: plotRight - plotLeft, height: plotBottom - plotTop }
|
|
9336
|
+
{ x: plotLeft, y: plotTop, width: plotRight - plotLeft, height: plotBottom - plotTop },
|
|
9337
|
+
{
|
|
9338
|
+
left: hasAxes ? leftAxisBand(options?.leftCategoryLabelWidth) : 0,
|
|
9339
|
+
top: 0,
|
|
9340
|
+
right: 0,
|
|
9341
|
+
bottom: hasAxes ? categoryAxisBand(chartData) - 8 : 0
|
|
9342
|
+
}
|
|
9592
9343
|
);
|
|
9593
9344
|
if (plotLayout && manual) {
|
|
9594
9345
|
plotLeft = manual.x;
|
|
9595
9346
|
plotTop = manual.y;
|
|
9596
9347
|
plotRight = manual.x + manual.width;
|
|
9597
9348
|
plotBottom = manual.y + manual.height;
|
|
9598
|
-
if (hasAxes && plotLayout.layoutTarget !== "inner") {
|
|
9599
|
-
plotLeft += leftAxisBand(options?.leftCategoryLabelWidth);
|
|
9600
|
-
plotBottom -= categoryAxisBand(chartData) - 8;
|
|
9601
|
-
}
|
|
9602
9349
|
}
|
|
9603
9350
|
const plotWidth = Math.max(plotRight - plotLeft, 1), plotHeight = Math.max(plotBottom - plotTop, 1);
|
|
9604
9351
|
return {
|
|
@@ -9707,7 +9454,7 @@ function buildRadarViewModel(element, chartData, categoryLabels) {
|
|
|
9707
9454
|
y: clamp2(p.y + out * Math.sin(angle), fontSize, frame.height - fontSize)
|
|
9708
9455
|
};
|
|
9709
9456
|
anchor = {
|
|
9710
|
-
...applyLabelManualLayout(findPointLabel(series, vi)?.layout, frame, auto),
|
|
9457
|
+
...chart.applyLabelManualLayout(findPointLabel(series, vi)?.layout, frame, auto),
|
|
9711
9458
|
textAnchor: "middle",
|
|
9712
9459
|
dominantBaseline: "central"
|
|
9713
9460
|
};
|
|
@@ -10947,7 +10694,7 @@ function computeTrendlinePrimitives(chartData, catCount, layout, range, mode = "
|
|
|
10947
10694
|
}
|
|
10948
10695
|
if (labelLines.length > 0) {
|
|
10949
10696
|
const last = points[points.length - 1];
|
|
10950
|
-
const anchor = applyLabelManualLayout(
|
|
10697
|
+
const anchor = chart.applyLabelManualLayout(
|
|
10951
10698
|
tl.label?.layout,
|
|
10952
10699
|
{ width: layout.svgWidth, height: layout.svgHeight },
|
|
10953
10700
|
{ x: last.x, y: last.y - 6 }
|
|
@@ -10977,6 +10724,10 @@ Object.defineProperty(exports, "DEFAULT_CHART_PALETTE", {
|
|
|
10977
10724
|
enumerable: true,
|
|
10978
10725
|
get: function () { return chart.DEFAULT_CHART_PALETTE; }
|
|
10979
10726
|
});
|
|
10727
|
+
Object.defineProperty(exports, "applyLabelManualLayout", {
|
|
10728
|
+
enumerable: true,
|
|
10729
|
+
get: function () { return chart.applyLabelManualLayout; }
|
|
10730
|
+
});
|
|
10980
10731
|
Object.defineProperty(exports, "computeBoxStats", {
|
|
10981
10732
|
enumerable: true,
|
|
10982
10733
|
get: function () { return chart.computeBoxStats; }
|
|
@@ -11128,7 +10879,6 @@ exports.TEXT_ORIENTATION_IDENTITY = TEXT_ORIENTATION_IDENTITY;
|
|
|
11128
10879
|
exports.ZERO_LINE_COLOR = ZERO_LINE_COLOR;
|
|
11129
10880
|
exports.adjustFillForMode = adjustFillForMode;
|
|
11130
10881
|
exports.applyDataPointPictureFills = applyDataPointPictureFills;
|
|
11131
|
-
exports.applyLabelManualLayout = applyLabelManualLayout;
|
|
11132
10882
|
exports.applyLegendEntryOverrides = applyLegendEntryOverrides;
|
|
11133
10883
|
exports.applyParetoConversion = applyParetoConversion;
|
|
11134
10884
|
exports.axisShowsMajorGridlines = axisShowsMajorGridlines;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/
|
|
1
|
+
// src/fonts/custom-fonts.ts
|
|
2
2
|
var CUSTOM_FONT_EXTENSIONS = [".ttf", ".otf", ".woff", ".woff2"];
|
|
3
3
|
var CUSTOM_FONT_ACCEPT = [
|
|
4
4
|
...CUSTOM_FONT_EXTENSIONS,
|
|
@@ -90,7 +90,30 @@ async function registerCustomFont(file, target) {
|
|
|
90
90
|
});
|
|
91
91
|
await face.load();
|
|
92
92
|
fontSet.add(face);
|
|
93
|
-
return { family: descriptor.family, descriptor };
|
|
93
|
+
return { family: descriptor.family, descriptor, dispose: () => void fontSet.delete(face) };
|
|
94
|
+
}
|
|
95
|
+
function createFontFaceScope(target) {
|
|
96
|
+
const registrations = /* @__PURE__ */ new Set();
|
|
97
|
+
let disposed = false;
|
|
98
|
+
return {
|
|
99
|
+
async register(file) {
|
|
100
|
+
if (disposed) return null;
|
|
101
|
+
const registration = await registerCustomFont(file, target);
|
|
102
|
+
if (!registration) return null;
|
|
103
|
+
if (disposed) {
|
|
104
|
+
registration.dispose();
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
registrations.add(registration);
|
|
108
|
+
return registration;
|
|
109
|
+
},
|
|
110
|
+
dispose() {
|
|
111
|
+
if (disposed) return;
|
|
112
|
+
disposed = true;
|
|
113
|
+
for (const registration of registrations) registration.dispose();
|
|
114
|
+
registrations.clear();
|
|
115
|
+
}
|
|
116
|
+
};
|
|
94
117
|
}
|
|
95
118
|
|
|
96
|
-
export { CUSTOM_FONT_ACCEPT, CUSTOM_FONT_EXTENSIONS, deriveCustomFontDescriptor, registerCustomFont };
|
|
119
|
+
export { CUSTOM_FONT_ACCEPT, CUSTOM_FONT_EXTENSIONS, createFontFaceScope, deriveCustomFontDescriptor, registerCustomFont };
|