diff --git a/packages/vchart/__tests__/runtime/browser/index.html b/packages/vchart/__tests__/runtime/browser/index.html
index e5c76efe01..31a973704d 100644
--- a/packages/vchart/__tests__/runtime/browser/index.html
+++ b/packages/vchart/__tests__/runtime/browser/index.html
@@ -31,8 +31,35 @@
text-align: center;
flex-shrink: 0; /* 防止按钮区域被压缩 */
}
+ #chartSizeControl {
+ display: inline-flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-left: 16px;
+ vertical-align: middle;
+ }
+ #chartSizeControl span,
+ #chartSizeControl label {
+ font-size: 12px;
+ }
+ #chartSizeControl label {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ }
+ #chartSizeControl input {
+ width: 72px;
+ box-sizing: border-box;
+ }
+ #chartSizeControlStatus {
+ color: #606773;
+ }
#chartContainer {
flex-grow: 1; /* 让图表容器填充剩余空间 */
+ box-sizing: border-box;
+ overflow: auto;
+ padding: 50px;
position: relative; /* 确保内部绝对定位有效 */
}
/* 为 id="chart" 添加样式,使其填充 chartContainer */
@@ -49,6 +76,19 @@
+
@@ -64,6 +104,12 @@
const params = new URLSearchParams(window.location.search);
const currentView = params.get('view') === 'dashboard' ? 'dashboard' : 'default';
const button = document.getElementById('toggleScriptBtn');
+ const chartSizeControl = document.getElementById('chartSizeControl');
+ const chartWidthInput = document.getElementById('chartWidthInput');
+ const chartHeightInput = document.getElementById('chartHeightInput');
+ const chartSizeControlStatus = document.getElementById('chartSizeControlStatus');
+ const minChartSize = 1;
+ const maxChartSize = 4000;
let scriptSrc;
let nextViewUrl;
@@ -81,12 +127,52 @@
// 设置按钮文本
button.textContent = buttonText;
+ chartSizeControl.style.display = currentView === 'dashboard' ? 'none' : 'inline-flex';
// 添加按钮点击事件监听器
button.addEventListener('click', () => {
window.location.href = nextViewUrl;
});
+ const normalizeChartSize = value => Math.min(maxChartSize, Math.max(minChartSize, Math.round(value)));
+ const applyChartSize = () => {
+ const width = Number(chartWidthInput.value);
+ const height = Number(chartHeightInput.value);
+
+ if (!Number.isFinite(width) || !Number.isFinite(height)) {
+ chartSizeControlStatus.textContent = '请输入有效宽高';
+ return;
+ }
+
+ const normalizedWidth = normalizeChartSize(width);
+ const normalizedHeight = normalizeChartSize(height);
+ const chart = document.getElementById('chart');
+ chartWidthInput.value = `${normalizedWidth}`;
+ chartHeightInput.value = `${normalizedHeight}`;
+
+ if (chart) {
+ chart.style.width = `${normalizedWidth}px`;
+ chart.style.height = `${normalizedHeight}px`;
+ chart.style.margin = '0';
+ }
+
+ if (typeof window.resizeChartContainer === 'function') {
+ window.resizeChartContainer(normalizedWidth, normalizedHeight);
+ } else if (window.vchart && typeof window.vchart.resizeSync === 'function') {
+ window.vchart.resizeSync(normalizedWidth, normalizedHeight);
+ }
+
+ chartSizeControlStatus.textContent = `${normalizedWidth} x ${normalizedHeight}`;
+ };
+
+ chartSizeControl.addEventListener('submit', event => {
+ event.preventDefault();
+ applyChartSize();
+ });
+ chartWidthInput.addEventListener('change', applyChartSize);
+ chartHeightInput.addEventListener('change', applyChartSize);
+ applyChartSize();
+
// 动态创建并添加当前视图所需的脚本
const script = document.createElement('script');
script.type = 'module';
diff --git a/packages/vchart/__tests__/unit/series/liquid.test.ts b/packages/vchart/__tests__/unit/series/liquid.test.ts
new file mode 100644
index 0000000000..7717d0c994
--- /dev/null
+++ b/packages/vchart/__tests__/unit/series/liquid.test.ts
@@ -0,0 +1,54 @@
+import { DataSet } from '@visactor/vdataset';
+import type { ISeriesOption } from '../../../src/series/interface';
+import { LiquidSeries } from '../../../src';
+import { initChartDataSet, seriesOption } from '../../util/context';
+import { TestRegion } from '../../util/factory/region';
+
+const dataSet = new DataSet();
+initChartDataSet(dataSet);
+
+let ctx: ISeriesOption;
+
+const createLiquidSeries = (value: number, reverse: boolean = false) => {
+ const region = new TestRegion({
+ getLayoutRect: () => ({ width: 200, height: 100 }),
+ getLayoutStartPoint: () => ({ x: 0, y: 0 })
+ });
+ ctx = seriesOption({ dataSet });
+ ctx.region = region as any;
+
+ const liquid = new LiquidSeries(
+ {
+ valueField: 'value',
+ reverse,
+ outlineMargin: 0,
+ outlinePadding: 0,
+ maskShape: 'rect'
+ },
+ ctx
+ );
+
+ liquid.setValueField('value');
+ (liquid as any)._region = region;
+ (liquid as any)._marginSpec = {};
+ (liquid as any)._paddingSpec = {};
+ (liquid as any)._maskShape = 'rect';
+ (liquid as any)._reverse = reverse;
+ (liquid as any)._data = {
+ updateData: jest.fn(),
+ getLatestData: () => [{ value }]
+ };
+
+ liquid.viewDataUpdate({} as any);
+ return liquid;
+};
+
+describe('[Domain-Series-Liquid] Liquid Series', () => {
+ test('clamps values above 1 when calculating liquid geometry', () => {
+ const liquid = createLiquidSeries(80619697.63);
+
+ expect((liquid as any)._heightRatio).toBe(1);
+ expect((liquid as any)._getLiquidHeight()).toBe(100);
+ expect((liquid as any)._getLiquidPosY()).toBe(0);
+ });
+});
diff --git a/packages/vchart/src/series/liquid/liquid.ts b/packages/vchart/src/series/liquid/liquid.ts
index b32a034f42..d5bfd2ca2a 100644
--- a/packages/vchart/src/series/liquid/liquid.ts
+++ b/packages/vchart/src/series/liquid/liquid.ts
@@ -69,7 +69,8 @@ export class LiquidSeries exten
viewDataUpdate(d: DataView): void {
super.viewDataUpdate(d);
- this._heightRatio = max(...this._data.getLatestData().map((d: Datum) => d[this._valueField]));
+ const heightRatio = max(...this._data.getLatestData().map((d: Datum) => d[this._valueField]));
+ this._heightRatio = heightRatio > 1 ? 1 : heightRatio;
}
initMark(): void {