@zerodep-dev/vue-tsx-pro-ui 0.3.3 → 0.4.1

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.
Files changed (117) hide show
  1. package/dist/charts/AreaChart.d.ts +1 -1
  2. package/dist/charts/AreaChart.js +6 -48
  3. package/dist/charts/AreaChart.js.map +1 -1
  4. package/dist/charts/BarChart.js +6 -49
  5. package/dist/charts/BarChart.js.map +1 -1
  6. package/dist/charts/ChordChart.d.ts +7 -2
  7. package/dist/charts/ChordChart.js +151 -60
  8. package/dist/charts/ChordChart.js.map +1 -1
  9. package/dist/charts/ComboChart.d.ts +2 -1
  10. package/dist/charts/ComboChart.js +17 -93
  11. package/dist/charts/ComboChart.js.map +1 -1
  12. package/dist/charts/DonutChart.d.ts +6 -1
  13. package/dist/charts/DonutChart.js +134 -51
  14. package/dist/charts/DonutChart.js.map +1 -1
  15. package/dist/charts/FunnelChart.js.map +1 -1
  16. package/dist/charts/GraphChart.d.ts +22 -10
  17. package/dist/charts/GraphChart.js +415 -175
  18. package/dist/charts/GraphChart.js.map +1 -1
  19. package/dist/charts/LineChart.d.ts +1 -29
  20. package/dist/charts/LineChart.js +6 -54
  21. package/dist/charts/LineChart.js.map +1 -1
  22. package/dist/charts/MapChart.d.ts +21 -48
  23. package/dist/charts/MapChart.js +426 -353
  24. package/dist/charts/MapChart.js.map +1 -1
  25. package/dist/charts/RadarChart.js.map +1 -1
  26. package/dist/charts/SankeyChart.d.ts +7 -2
  27. package/dist/charts/SankeyChart.js +164 -76
  28. package/dist/charts/SankeyChart.js.map +1 -1
  29. package/dist/charts/ScatterChart.d.ts +7 -1
  30. package/dist/charts/ScatterChart.js +45 -30
  31. package/dist/charts/ScatterChart.js.map +1 -1
  32. package/dist/charts/TimelineChart.d.ts +8 -1
  33. package/dist/charts/TimelineChart.js +141 -89
  34. package/dist/charts/TimelineChart.js.map +1 -1
  35. package/dist/charts/TreemapChart.d.ts +6 -0
  36. package/dist/charts/TreemapChart.js +174 -58
  37. package/dist/charts/TreemapChart.js.map +1 -1
  38. package/dist/charts/WaterfallChart.d.ts +6 -7
  39. package/dist/charts/WaterfallChart.js +46 -51
  40. package/dist/charts/WaterfallChart.js.map +1 -1
  41. package/dist/charts/XYChart.d.ts +44 -35
  42. package/dist/charts/XYChart.js +493 -281
  43. package/dist/charts/XYChart.js.map +1 -1
  44. package/dist/charts/axis-ticks.d.ts +1 -1
  45. package/dist/charts/axis-ticks.js +4 -5
  46. package/dist/charts/axis-ticks.js.map +1 -1
  47. package/dist/charts/flow.d.ts +4 -11
  48. package/dist/charts/flow.js +4 -4
  49. package/dist/charts/flow.js.map +1 -1
  50. package/dist/charts/frame.d.ts +6 -30
  51. package/dist/charts/frame.js +6 -99
  52. package/dist/charts/frame.js.map +1 -1
  53. package/dist/charts/geo/projection.d.ts +45 -0
  54. package/dist/charts/geo/projection.js +201 -0
  55. package/dist/charts/geo/projection.js.map +1 -0
  56. package/dist/charts/geo/topojson.d.ts +50 -0
  57. package/dist/charts/geo/topojson.js +119 -0
  58. package/dist/charts/geo/topojson.js.map +1 -0
  59. package/dist/charts/index.d.ts +21 -9
  60. package/dist/charts/index.js +19 -8
  61. package/dist/charts/label-layout.js.map +1 -1
  62. package/dist/charts/layout/chord.d.ts +44 -0
  63. package/dist/charts/layout/chord.js +45 -0
  64. package/dist/charts/layout/chord.js.map +1 -0
  65. package/dist/charts/layout/graph.d.ts +49 -0
  66. package/dist/charts/layout/graph.js +268 -0
  67. package/dist/charts/layout/graph.js.map +1 -0
  68. package/dist/charts/layout/sankey.d.ts +79 -0
  69. package/dist/charts/layout/sankey.js +200 -0
  70. package/dist/charts/layout/sankey.js.map +1 -0
  71. package/dist/charts/layout/treemap.d.ts +46 -0
  72. package/dist/charts/layout/treemap.js +152 -0
  73. package/dist/charts/layout/treemap.js.map +1 -0
  74. package/dist/charts/marks.d.ts +79 -0
  75. package/dist/charts/marks.js +231 -0
  76. package/dist/charts/marks.js.map +1 -0
  77. package/dist/charts/plot.d.ts +107 -0
  78. package/dist/charts/plot.js +231 -0
  79. package/dist/charts/plot.js.map +1 -0
  80. package/dist/charts/scale.d.ts +29 -0
  81. package/dist/charts/scale.js +244 -0
  82. package/dist/charts/scale.js.map +1 -0
  83. package/dist/charts/shape.d.ts +46 -0
  84. package/dist/charts/shape.js +131 -0
  85. package/dist/charts/shape.js.map +1 -0
  86. package/dist/charts/stack.d.ts +17 -0
  87. package/dist/charts/stack.js +35 -0
  88. package/dist/charts/stack.js.map +1 -0
  89. package/dist/charts/text-size.d.ts +12 -0
  90. package/dist/charts/text-size.js +32 -0
  91. package/dist/charts/text-size.js.map +1 -0
  92. package/dist/config/createUi.d.ts +21 -2
  93. package/dist/config/createUi.js +18 -1
  94. package/dist/config/createUi.js.map +1 -1
  95. package/dist/config/theme/preference.js +2 -1
  96. package/dist/config/theme/preference.js.map +1 -1
  97. package/dist/index.d.ts +2 -2
  98. package/dist/maps/china-provinces.js +35680 -0
  99. package/dist/maps/china-provinces.js.map +1 -0
  100. package/dist/maps/china.d.ts +13 -0
  101. package/dist/maps/china.js +8 -0
  102. package/dist/maps/china.js.map +1 -0
  103. package/dist/maps/index.d.ts +9 -0
  104. package/dist/maps/index.js +3 -0
  105. package/dist/maps/world-countries.js +22273 -0
  106. package/dist/maps/world-countries.js.map +1 -0
  107. package/dist/maps/world.d.ts +13 -0
  108. package/dist/maps/world.js +8 -0
  109. package/dist/maps/world.js.map +1 -0
  110. package/dist/overlay/detached.js.map +1 -1
  111. package/dist/utils/request/use-request.d.ts +25 -1
  112. package/dist/utils/request/use-request.js +35 -3
  113. package/dist/utils/request/use-request.js.map +1 -1
  114. package/package.json +7 -8
  115. package/dist/charts/single.d.ts +0 -41
  116. package/dist/charts/single.js +0 -66
  117. package/dist/charts/single.js.map +0 -1
@@ -1,15 +1,18 @@
1
+ import { svgNumber } from "../utils/data/number.js";
1
2
  import { useLang } from "../config/context.js";
2
3
  import { parseIsoDate, parseIsoDateTime } from "../utils/data/date.js";
3
4
  import { useFormat } from "../config/lang/format.js";
4
5
  import { Skeleton } from "../feedback/Skeleton.js";
5
- import { useDetachedRender } from "../overlay/detached.js";
6
- import { ChartFrame, chartDuration, chartTooltip, createChartInstances, uniqueHighlightFilter, usePlotSeen } from "./frame.js";
6
+ import { ChartTooltipBox, chartAxis, chartSvgStyles, pointerIn, usePlotArea } from "./plot.js";
7
+ import { linearScale, timeTicks } from "./scale.js";
8
+ import { ChartFrame, chartTooltip } from "./frame.js";
7
9
  import { resolveColor } from "./series.js";
10
+ import { estimateTextWidth, truncateText } from "./text-size.js";
8
11
  import { xyChartStyles } from "./XYChart.js";
9
- import { computed, createVNode, shallowRef, useId } from "vue";
10
- import { _component, bindable, effect, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
12
+ import { computed, createVNode, shallowRef } from "vue";
13
+ import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
14
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
11
15
  import { getLocalTimeZone } from "@internationalized/date";
12
- import { Axis, Plotline, PlotlineLabelPosition, PlotlineLineStylePresets, Scale, Timeline, Tooltip, XYContainer } from "@unovis/ts";
13
16
  //#region src/charts/TimelineChart.tsx
14
17
  /**
15
18
  * 时间条图(甘特图式):每行一个任务(项目、设备、人),横轴是时间,每项一段时间条;
@@ -26,7 +29,8 @@ import { Axis, Plotline, PlotlineLabelPosition, PlotlineLineStylePresets, Scale,
26
29
  * />
27
30
  *
28
31
  * 时间可以是 Date、时间戳或 ISO 字符串;只有日期('2026-06-30')的结束含这一天。行按 rows 的顺序,没给时按第一次出现。
29
- * 悬停一段显示名称、起止与天数;读屏的数据表列出每一项。绘图交给 Unovis 的 Timeline(XYContainer、时间轴)。
32
+ * 左侧是行名,底下是整齐的时间刻度(月初、周、日、整点,见 timeTicks);悬停一段显示名称、起止与天数;
33
+ * 读屏的数据表列出每一项。
30
34
  */
31
35
  /** 一个时间点:Date、时间戳(毫秒)或 ISO 字符串(日期或日期时间) */
32
36
  /** 一段时间条 */
@@ -36,6 +40,20 @@ import { Axis, Plotline, PlotlineLabelPosition, PlotlineLineStylePresets, Scale,
36
40
  /** 画图用的一段:时间换成毫秒 */
37
41
  var DAY = 864e5;
38
42
  var ISO_DATE = /^\d{4}-\d{2}-\d{2}$/;
43
+ /** 行名最宽多少(px),更长的截短 */
44
+ var LABEL_WIDTH = 160;
45
+ /** TimelineChart 的样式:隔行的底色、时间条 */
46
+ var timelineChartStyles = css.create({
47
+ stripe: { fill: "_surfaceMuted" },
48
+ segment: {
49
+ stroke: "_surface",
50
+ strokeWidth: 0
51
+ },
52
+ segmentActive: {
53
+ strokeWidth: 1.5,
54
+ stroke: "_text"
55
+ }
56
+ });
39
57
  /** 轨道(计划)的颜色:系列色调浅 */
40
58
  var trackColor = (color) => `color-mix(in srgb, ${color} 30%, transparent)`;
41
59
  /** 按刻度的间隔选日期的写法:几个月一格写月,几天一格写月日,不到一天写时分 */
@@ -78,7 +96,6 @@ var TimelineChart = /*#__PURE__*/ _component((_props, _ctx) => {
78
96
  const rest = restProps(_props, _ctx, true);
79
97
  const lang = useLang();
80
98
  const format = useFormat();
81
- const id = useId();
82
99
  const zone = () => lang.timeZone ?? getLocalTimeZone();
83
100
  const colorOf = (key) => {
84
101
  const position = series.value.findIndex((item) => item.key === key);
@@ -109,70 +126,115 @@ var TimelineChart = /*#__PURE__*/ _component((_props, _ctx) => {
109
126
  label: lang.chartToday,
110
127
  color: "danger"
111
128
  }] : [], ...markers.value ?? []];
112
- const instances = createChartInstances();
113
- let tooltipElement;
114
- const renderDetached = useDetachedRender();
115
- let plot = shallowRef(null);
116
- const seen = usePlotSeen(() => plot.value);
117
- let container;
118
- let containerElement;
119
- effect(() => () => {
120
- container?.destroy();
121
- });
122
- effect(() => {
123
- const data = segments();
124
- const element = plot.value;
125
- if (!element || loading.value || items.value.length === 0 || !seen()) return;
126
- if (container && containerElement !== element) {
127
- container.destroy();
128
- container = void 0;
129
- instances.reset();
129
+ const area = usePlotArea();
130
+ let hovered = shallowRef(null);
131
+ function onPointermove(event) {
132
+ const target = event.target.closest?.("[data-segment]");
133
+ if (!target) {
134
+ hovered.value = null;
135
+ return;
130
136
  }
131
- const times = [...data.flatMap((segment) => [segment.start, segment.end]), ...allMarkers().map((marker) => toTime(marker.at, zone()))];
132
- const ticks = Scale.scaleTime().domain([Math.min(...times), Math.max(...times)]).ticks(6);
133
- const timeline = instances.get("timeline", () => new Timeline({ x: () => 0 }));
134
- timeline.setConfig({
135
- x: (segment) => segment.start,
136
- lineDuration: (segment) => segment.end - segment.start,
137
- lineRow: (segment) => segment.item.row,
138
- lineWidth: (segment) => segment.width,
139
- color: (segment) => segment.track ? trackColor(segment.color) : segment.color,
140
- lineCap: true,
141
- rowHeight: rowHeight.value,
142
- showRowLabels: true,
143
- rowMaxLabelWidth: 160,
144
- alternatingRowColors: true
145
- });
146
- const lines = allMarkers().map((marker, position) => {
147
- const line = instances.get(`marker-${position}`, () => new Plotline({}));
148
- line.setConfig({
149
- axis: "x",
150
- value: toTime(marker.at, zone()),
151
- color: resolveColor(marker.color ?? "neutral", 0),
152
- lineWidth: 1,
153
- lineStyle: PlotlineLineStylePresets.ShortDash,
154
- labelText: marker.label,
155
- labelPosition: PlotlineLabelPosition.TopRight,
156
- labelOffsetX: 4,
157
- labelOffsetY: 2
158
- });
159
- return line;
160
- });
161
- const xAxis = instances.get("xAxis", () => new Axis({ type: "x" }));
162
- xAxis.setConfig({
163
- type: "x",
164
- tickValues: ticks.map((tick) => tick.getTime()),
165
- tickFormat: (tick) => format.date(new Date(Number(tick)), dateFormat.value ?? autoFormat(ticks)),
166
- gridLine: true,
167
- tickLine: false,
168
- domainLine: false,
169
- tickPadding: 8
170
- });
171
- const tooltipBox = instances.get("tooltip", () => new Tooltip());
172
- tooltipBox.setConfig({ triggers: { [Timeline.selectors.line]: (segment) => {
173
- tooltipElement ??= document.createElement("div");
174
- const name = series.value.find((entry) => entry.key === segment.item.series)?.label;
175
- renderDetached(chartTooltip(segment.item.label ?? segment.item.row, [
137
+ const { x, y } = pointerIn(event, event.currentTarget);
138
+ hovered.value = {
139
+ index: Number(target.getAttribute("data-segment")),
140
+ x,
141
+ y
142
+ };
143
+ }
144
+ function renderPlot(shown) {
145
+ const { width } = area;
146
+ const rowsHeight = rowOrder.value.length * rowHeight.value;
147
+ const labelWidth = Math.min(LABEL_WIDTH, Math.max(0, ...rowOrder.value.map((row) => estimateTextWidth(row))) + 16);
148
+ const marks = allMarkers().map((marker) => ({
149
+ ...marker,
150
+ time: toTime(marker.at, zone())
151
+ }));
152
+ const times = [...shown.flatMap((segment) => [segment.start, segment.end]), ...marks.map((m) => m.time)];
153
+ const [low, high] = times.length ? [Math.min(...times), Math.max(...times)] : [0, DAY];
154
+ const [start, end] = low === high ? [low - DAY, high + DAY] : [low, high];
155
+ const scale = linearScale([start, end], [labelWidth + 8, Math.max(labelWidth + 9, width - 16)]);
156
+ const ticks = timeTicks(start, end, Math.max(2, Math.round((width - labelWidth) / 110)));
157
+ const tickFormat = dateFormat.value ?? autoFormat(ticks);
158
+ const plot = {
159
+ left: labelWidth + 8,
160
+ top: 0,
161
+ width: Math.max(0, width - labelWidth - 24),
162
+ height: rowsHeight
163
+ };
164
+ const rowOf = (row) => rowOrder.value.indexOf(row);
165
+ return createVNode("svg", mergeJsxProps({
166
+ "width": width,
167
+ "height": area.height
168
+ }, css.attrs(chartSvgStyles.svg), {
169
+ "onPointermove": onPointermove,
170
+ "onPointerleave": _cache[0] || (_cache[0] = () => hovered.value = null)
171
+ }), [
172
+ rowOrder.value.map((row, position) => position % 2 === 0 ? createVNode("rect", mergeJsxProps({
173
+ "key": `stripe:${row}`,
174
+ "x": 0,
175
+ "y": position * rowHeight.value,
176
+ "width": width,
177
+ "height": rowHeight.value
178
+ }, css.attrs(timelineChartStyles.stripe)), null) : null),
179
+ chartAxis({
180
+ side: "bottom",
181
+ ticks: ticks.map((tick) => ({
182
+ position: scale(tick.getTime()),
183
+ label: format.date(tick, tickFormat)
184
+ })),
185
+ plot,
186
+ grid: true
187
+ }),
188
+ rowOrder.value.map((row, position) => createVNode("text", mergeJsxProps({
189
+ "key": `label:${row}`,
190
+ "x": 0,
191
+ "y": svgNumber(position * rowHeight.value + rowHeight.value / 2),
192
+ "dominant-baseline": "central"
193
+ }, css.attrs(chartSvgStyles.label)), [truncateText(row, labelWidth - 12)])),
194
+ createVNode("g", css.attrs(chartSvgStyles.fadeIn), [shown.map((segment, index) => {
195
+ const row = rowOf(segment.item.row);
196
+ if (row < 0) return null;
197
+ const x = scale(segment.start);
198
+ const length = Math.max(segment.width, scale(segment.end) - x);
199
+ return createVNode("rect", mergeJsxProps({
200
+ "key": index,
201
+ "data-part": "segment",
202
+ "data-segment": index,
203
+ "x": svgNumber(x),
204
+ "y": svgNumber(row * rowHeight.value + (rowHeight.value - segment.width) / 2),
205
+ "width": svgNumber(length),
206
+ "height": svgNumber(segment.width),
207
+ "rx": svgNumber(segment.width / 2)
208
+ }, css.attrs(timelineChartStyles.segment, chartSvgStyles.fill(segment.track ? trackColor(segment.color) : segment.color), hovered.value?.index === index && timelineChartStyles.segmentActive)), null);
209
+ })]),
210
+ marks.map((marker, position) => {
211
+ const x = Math.round(scale(marker.time)) + .5;
212
+ const color = resolveColor(marker.color ?? "neutral", 0);
213
+ return createVNode("g", {
214
+ "key": `marker:${position}`,
215
+ "data-part": "marker"
216
+ }, [createVNode("line", mergeJsxProps({
217
+ "x1": x,
218
+ "x2": x,
219
+ "y1": 0,
220
+ "y2": rowsHeight
221
+ }, css.attrs(xyChartStyles.eventLine, chartSvgStyles.stroke(color))), null), createVNode("text", mergeJsxProps({
222
+ "x": x + 4,
223
+ "y": 4,
224
+ "dominant-baseline": "hanging"
225
+ }, css.attrs(chartSvgStyles.labelMuted, chartSvgStyles.halo, xyChartStyles.textFill(color), chartSvgStyles.noPointer)), [marker.label])]);
226
+ })
227
+ ]);
228
+ }
229
+ const tip = (shown) => {
230
+ const current = hovered.value;
231
+ const segment = current && shown[current.index];
232
+ if (!tooltip.value || !current || !segment) return null;
233
+ const name = series.value.find((entry) => entry.key === segment.item.series)?.label;
234
+ return {
235
+ x: current.x,
236
+ y: current.y,
237
+ content: chartTooltip(segment.item.label ?? segment.item.row, [
176
238
  ...name ? [{
177
239
  label: name,
178
240
  color: segment.color,
@@ -188,27 +250,12 @@ var TimelineChart = /*#__PURE__*/ _component((_props, _ctx) => {
188
250
  color: "transparent",
189
251
  value: dateText(segment.end - 1)
190
252
  }
191
- ]), tooltipElement);
192
- return tooltipElement;
193
- } } });
194
- const config = {
195
- components: [timeline, ...lines],
196
- xAxis,
197
- tooltip: tooltip.value ? tooltipBox : void 0,
198
- ariaLabel: null,
199
- duration: chartDuration(element)
253
+ ])
200
254
  };
201
- if (container) container.update(config, void 0, data);
202
- else {
203
- container = new XYContainer(element, config, data);
204
- containerElement = element;
205
- uniqueHighlightFilter(element, `${id}-highlight`);
206
- }
207
- });
255
+ };
208
256
  return () => {
209
257
  const shown = segments();
210
258
  return createVNode(ChartFrame, mergeJsxProps(rest, {
211
- "sx": [xyChartStyles.hideCrosshairLine, rest.sx],
212
259
  "height": rowOrder.value.length * rowHeight.value + 36,
213
260
  "legend": series.value.map((item, position) => {
214
261
  const color = resolveColor(item.color, position);
@@ -242,7 +289,12 @@ var TimelineChart = /*#__PURE__*/ _component((_props, _ctx) => {
242
289
  ]
243
290
  }))
244
291
  },
245
- "plotRef": _cache[0] || (_cache[0] = (element) => plot.value = element)
292
+ "plotRef": area.ref,
293
+ "plot": area.ready ? [renderPlot(shown), createVNode(ChartTooltipBox, {
294
+ "key": "tooltip",
295
+ "tip": tip(shown),
296
+ "width": area.width
297
+ }, null)] : null
246
298
  }), null);
247
299
  };
248
300
  }, {
@@ -263,6 +315,6 @@ var TimelineChart = /*#__PURE__*/ _component((_props, _ctx) => {
263
315
  ]
264
316
  });
265
317
  //#endregion
266
- export { TimelineChart };
318
+ export { TimelineChart, timelineChartStyles };
267
319
 
268
320
  //# sourceMappingURL=TimelineChart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimelineChart.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vue_computed","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/charts/TimelineChart.tsx"],"sourcesContent":["/**\n * 时间条图(甘特图式):每行一个任务(项目、设备、人),横轴是时间,每项一段时间条;\n * 计划画成宽而浅的轨道、实际画在上面,一眼看出提前还是拖期。可以标出“今天”与里程碑。\n *\n * <TimelineChart\n * aria-label=\"项目进度\"\n * items={[\n * { row: '官网改版', series: 'plan', start: '2026-03-01', end: '2026-06-30' },\n * { row: '官网改版', series: 'actual', start: '2026-03-10', end: '2026-07-20' },\n * ]}\n * series={[{ key: 'plan', label: '计划', variant: 'track' }, { key: 'actual', label: '实际' }]}\n * today\n * />\n *\n * 时间可以是 Date、时间戳或 ISO 字符串;只有日期('2026-06-30')的结束含这一天。行按 rows 的顺序,没给时按第一次出现。\n * 悬停一段显示名称、起止与天数;读屏的数据表列出每一项。绘图交给 Unovis 的 Timeline(XYContainer、时间轴)。\n */\nimport {\n Axis,\n Scale,\n Plotline,\n PlotlineLabelPosition,\n PlotlineLineStylePresets,\n Timeline,\n Tooltip,\n XYContainer,\n} from '@unovis/ts';\nimport { getLocalTimeZone } from '@internationalized/date';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { useId, type VNodeChild } from 'vue';\nimport { useDetachedRender } from '../overlay/detached';\nimport { useLang } from '../config/context';\nimport { useFormat } from '../config/lang/format';\nimport { Skeleton } from '../feedback/Skeleton';\nimport { parseIsoDate, parseIsoDateTime } from '../utils/data/date';\nimport type { PartProps } from '../utils/props';\nimport {\n ChartFrame,\n chartDuration,\n chartTooltip,\n createChartInstances,\n uniqueHighlightFilter,\n usePlotSeen,\n type ChartFrameParts,\n} from './frame';\nimport { resolveColor, type ChartColor } from './series';\nimport { xyChartStyles } from './XYChart';\n\n/** 一个时间点:Date、时间戳(毫秒)或 ISO 字符串(日期或日期时间) */\nexport type TimelineTime = Date | number | string;\n\n/** 一段时间条 */\nexport interface TimelineChartItem {\n /** 所在的行(任务、项目、设备) */\n row: string;\n /** 开始 */\n start: TimelineTime;\n /** 结束;只有日期时含这一天 */\n end: TimelineTime;\n /** 名称:提示框的标题;不写时是行名 */\n label?: string;\n /** 系列的 key(计划、实际):决定颜色、粗细与图例 */\n series?: string;\n /** 颜色:覆盖系列的颜色(拖期的一段标红) */\n color?: ChartColor;\n}\n\n/** 时间条的系列 */\nexport interface TimelineChartSeries {\n /** 标识:项的 series 指向它 */\n key: string;\n /** 名称:图例、提示框 */\n label: string;\n /** 颜色;不写时按顺序取色板 */\n color?: ChartColor;\n /** bar 实心的条(默认);track 宽而浅的轨道,画在下面(计划) */\n variant?: 'bar' | 'track';\n}\n\n/** 时间轴上的一条竖线:里程碑、截止日 */\nexport interface TimelineChartMarker {\n /** 时间 */\n at: TimelineTime;\n /** 文字 */\n label: string;\n /** 颜色,默认次要色 */\n color?: ChartColor;\n}\n\n/** 未声明的属性落到外层 div(role=\"figure\")上;aria-label 是图表的名称 */\nexport interface TimelineChartProps\n extends PartProps<'div', 'role' | 'aria-busy'>, ChartFrameParts {\n /** 各段时间条 */\n items: readonly TimelineChartItem[];\n /** 系列:颜色、图例与画法;不写时所有条同一个颜色 */\n series?: readonly TimelineChartSeries[];\n /** 行的顺序;不写时按第一次出现 */\n rows?: readonly string[];\n /** 标出今天(true)或指定的“今天” */\n today?: boolean | TimelineTime;\n /** 里程碑、截止日:竖线带文字 */\n markers?: readonly TimelineChartMarker[];\n /**\n * 每行的高度(px)\n * @default 32\n */\n rowHeight?: number;\n /** 刻度上日期的写法;不写时按刻度的间隔选(几个月一格写“4月”,几天一格写“10/24”,几小时一格写“14:00”) */\n dateFormat?: Intl.DateTimeFormatOptions;\n /** 加载中:绘图区显示骨架 */\n loading?: boolean;\n /** 隐藏的系列:点图例时写回,父级可以写 _hiddenSeries={keys} */\n _hiddenSeries?: string[];\n /** 没有数据时显示的内容 */\n empty?: VNodeChild;\n /** 悬停时的提示框,默认 true */\n tooltip?: boolean;\n}\n\n/** 画图用的一段:时间换成毫秒 */\ninterface Segment {\n item: TimelineChartItem;\n start: number;\n end: number;\n color: string;\n width: number;\n track: boolean;\n}\n\nconst DAY = 86_400_000;\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** 轨道(计划)的颜色:系列色调浅 */\nconst trackColor = (color: string) => `color-mix(in srgb, ${color} 30%, transparent)`;\n\n/** 按刻度的间隔选日期的写法:几个月一格写月,几天一格写月日,不到一天写时分 */\nfunction autoFormat(ticks: readonly Date[]): Intl.DateTimeFormatOptions {\n const step = ticks.length > 1 ? ticks[1]!.getTime() - ticks[0]!.getTime() : DAY;\n if (step >= 28 * DAY) return { month: 'short' };\n if (step >= DAY) return { month: 'numeric', day: 'numeric' };\n return { hour: '2-digit', minute: '2-digit' };\n}\n\n/** 时间点换成毫秒:ISO 字符串按语言的时区;只有日期的结束取到这一天的末尾 */\nfunction toTime(value: TimelineTime, timeZone: string, end = false): number {\n if (typeof value === 'number') return value;\n if (value instanceof Date) return value.getTime();\n // 只有日期:结束取到这一天的末尾(parseIsoDateTime 也接受只有日期的写法,要先认出来)\n const date = ISO_DATE.test(value) ? parseIsoDate(value) : null;\n if (date) return date.toDate(timeZone).getTime() + (end ? DAY : 0);\n const dateTime = parseIsoDateTime(value);\n if (dateTime) return dateTime.toDate(timeZone).getTime();\n return Date.parse(value);\n}\n\n/** 时间条图 */\nexport const TimelineChart = _component(\n ({\n items,\n series = [],\n rows,\n today,\n markers,\n rowHeight = 32,\n dateFormat,\n loading = false,\n _hiddenSeries: hiddenSeries = _bindable<string[]>([]),\n empty,\n tooltip = true,\n ...rest\n }: TimelineChartProps) => {\n const lang = useLang();\n const format = useFormat();\n const id = useId();\n const zone = () => lang.timeZone ?? getLocalTimeZone();\n const colorOf = (key: string | undefined) => {\n const position = series.findIndex((item) => item.key === key);\n return resolveColor(series[position]?.color, Math.max(position, 0));\n };\n const rowOrder = _derived(rows ?? [...new Set(items.map((item) => item.row))]);\n const visible = _derived(\n items.filter((item) => item.series === undefined || !hiddenSeries.includes(item.series)),\n );\n const dateText = (time: number) => format.date(new Date(time), { dateStyle: 'medium' });\n const daysText = (segment: Segment) =>\n lang.chartDays(Math.round((segment.end - segment.start) / DAY));\n\n function toggle(key: string) {\n hiddenSeries = hiddenSeries.includes(key)\n ? hiddenSeries.filter((item) => item !== key)\n : [...hiddenSeries, key];\n }\n\n /** 画图的各段:轨道先画(在下面),同一行里按开始时间 */\n const segments = (): Segment[] =>\n visible\n .map((item): Segment => {\n const track = series.find((entry) => entry.key === item.series)?.variant === 'track';\n return {\n item,\n start: toTime(item.start, zone()),\n end: toTime(item.end, zone(), true),\n color: item.color ? resolveColor(item.color, 0) : colorOf(item.series),\n width: track ? rowHeight * 0.62 : rowHeight * 0.32,\n track,\n };\n })\n .sort(\n (a, b) =>\n rowOrder.indexOf(a.item.row) - rowOrder.indexOf(b.item.row) ||\n Number(b.track) - Number(a.track) ||\n a.start - b.start,\n );\n\n /** 竖线:今天与里程碑 */\n const allMarkers = (): TimelineChartMarker[] => [\n ...(today !== undefined && today !== false\n ? [{ at: today === true ? Date.now() : today, label: lang.chartToday, color: 'danger' }]\n : []),\n ...(markers ?? []),\n ];\n\n const instances = createChartInstances();\n let tooltipElement: HTMLElement | undefined;\n // 提示框的内容渲染进 Unovis 管的元素:带上调用处的主题与语言,组件卸载时一起卸载\n const renderDetached = useDetachedRender();\n let plot = _state.raw<HTMLElement | null>(null);\n const seen = usePlotSeen(() => plot);\n let container: XYContainer<Segment> | undefined;\n let containerElement: HTMLElement | undefined;\n _effect(() => () => {\n container?.destroy();\n });\n _effect(() => {\n const data = segments();\n const element = plot;\n if (!element || loading || items.length === 0 || !seen()) return;\n if (container && containerElement !== element) {\n container.destroy();\n container = undefined;\n instances.reset();\n }\n const times = [\n ...data.flatMap((segment) => [segment.start, segment.end]),\n ...allMarkers().map((marker) => toTime(marker.at, zone())),\n ];\n const ticks = Scale.scaleTime()\n .domain([Math.min(...times), Math.max(...times)])\n .ticks(6);\n const timeline = instances.get('timeline', () => new Timeline<Segment>({ x: () => 0 }));\n timeline.setConfig({\n x: (segment) => segment.start,\n lineDuration: (segment) => segment.end - segment.start,\n lineRow: (segment) => segment.item.row,\n lineWidth: (segment) => segment.width,\n color: (segment) => (segment.track ? trackColor(segment.color) : segment.color),\n lineCap: true,\n rowHeight,\n showRowLabels: true,\n rowMaxLabelWidth: 160,\n alternatingRowColors: true,\n });\n const lines = allMarkers().map((marker, position) => {\n const line = instances.get(`marker-${position}`, () => new Plotline<Segment>({}));\n line.setConfig({\n axis: 'x',\n value: toTime(marker.at, zone()),\n color: resolveColor(marker.color ?? 'neutral', 0),\n lineWidth: 1,\n lineStyle: PlotlineLineStylePresets.ShortDash,\n labelText: marker.label,\n labelPosition: PlotlineLabelPosition.TopRight,\n labelOffsetX: 4,\n labelOffsetY: 2,\n });\n return line;\n });\n const xAxis = instances.get('xAxis', () => new Axis<Segment>({ type: 'x' }));\n xAxis.setConfig({\n type: 'x',\n // 整齐的时间刻度:月初、周、日、整点(d3 的时间刻度)\n tickValues: ticks.map((tick) => tick.getTime()),\n tickFormat: (tick) => format.date(new Date(Number(tick)), dateFormat ?? autoFormat(ticks)),\n gridLine: true,\n tickLine: false,\n domainLine: false,\n tickPadding: 8,\n });\n const tooltipBox = instances.get('tooltip', () => new Tooltip());\n tooltipBox.setConfig({\n triggers: {\n [Timeline.selectors.line]: (segment: Segment) => {\n tooltipElement ??= document.createElement('div');\n const name = series.find((entry) => entry.key === segment.item.series)?.label;\n renderDetached(\n chartTooltip(segment.item.label ?? segment.item.row, [\n ...(name ? [{ label: name, color: segment.color, value: daysText(segment) }] : []),\n { label: lang.chartStart, color: 'transparent', value: dateText(segment.start) },\n { label: lang.chartEnd, color: 'transparent', value: dateText(segment.end - 1) },\n ]),\n tooltipElement,\n );\n return tooltipElement;\n },\n },\n });\n const config = {\n components: [timeline, ...lines],\n xAxis,\n tooltip: tooltip ? tooltipBox : undefined,\n ariaLabel: null,\n duration: chartDuration(element),\n };\n if (container) container.update(config, undefined, data);\n else {\n container = new XYContainer<Segment>(element, config, data);\n containerElement = element;\n uniqueHighlightFilter(element, `${id}-highlight`);\n }\n });\n\n return () => {\n const shown = segments();\n return (\n <ChartFrame\n {...rest}\n sx={[xyChartStyles.hideCrosshairLine, rest.sx]}\n // 行数 × 行高,加上时间轴\n height={rowOrder.length * rowHeight + 36}\n legend={series.map((item, position) => {\n const color = resolveColor(item.color, position);\n return {\n key: item.key,\n label: item.label,\n color: item.variant === 'track' ? trackColor(color) : color,\n };\n })}\n hiddenKeys={hiddenSeries}\n onLegendToggle={toggle}\n loading={loading}\n skeleton={<Skeleton sx={xyChartStyles.skeleton} />}\n isEmpty={items.length === 0}\n empty={empty}\n table={{\n columns: [\n lang.chartCategory,\n lang.chartSeries,\n lang.chartStart,\n lang.chartEnd,\n lang.chartDuration,\n ],\n rows: shown.map((segment) => ({\n header: segment.item.label ?? segment.item.row,\n cells: [\n series.find((entry) => entry.key === segment.item.series)?.label ?? lang.emptyValue,\n dateText(segment.start),\n dateText(segment.end - 1),\n daysText(segment),\n ],\n })),\n }}\n plotRef={(element) => (plot = element)}\n />\n );\n };\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"TimelineChart.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vue_computed","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/charts/TimelineChart.tsx"],"sourcesContent":["/**\n * 时间条图(甘特图式):每行一个任务(项目、设备、人),横轴是时间,每项一段时间条;\n * 计划画成宽而浅的轨道、实际画在上面,一眼看出提前还是拖期。可以标出“今天”与里程碑。\n *\n * <TimelineChart\n * aria-label=\"项目进度\"\n * items={[\n * { row: '官网改版', series: 'plan', start: '2026-03-01', end: '2026-06-30' },\n * { row: '官网改版', series: 'actual', start: '2026-03-10', end: '2026-07-20' },\n * ]}\n * series={[{ key: 'plan', label: '计划', variant: 'track' }, { key: 'actual', label: '实际' }]}\n * today\n * />\n *\n * 时间可以是 Date、时间戳或 ISO 字符串;只有日期('2026-06-30')的结束含这一天。行按 rows 的顺序,没给时按第一次出现。\n * 左侧是行名,底下是整齐的时间刻度(月初、周、日、整点,见 timeTicks);悬停一段显示名称、起止与天数;\n * 读屏的数据表列出每一项。\n */\nimport { getLocalTimeZone } from '@internationalized/date';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat } from '../config/lang/format';\nimport { Skeleton } from '../feedback/Skeleton';\nimport { parseIsoDate, parseIsoDateTime } from '../utils/data/date';\nimport { svgNumber } from '../utils/data/number';\nimport type { PartProps } from '../utils/props';\nimport { ChartFrame, chartTooltip, type ChartFrameParts } from './frame';\nimport {\n ChartTooltipBox,\n chartAxis,\n chartSvgStyles,\n pointerIn,\n usePlotArea,\n type ChartTip,\n} from './plot';\nimport { linearScale, timeTicks } from './scale';\nimport { resolveColor, type ChartColor } from './series';\nimport { estimateTextWidth, truncateText } from './text-size';\nimport { xyChartStyles } from './XYChart';\n\n/** 一个时间点:Date、时间戳(毫秒)或 ISO 字符串(日期或日期时间) */\nexport type TimelineTime = Date | number | string;\n\n/** 一段时间条 */\nexport interface TimelineChartItem {\n /** 所在的行(任务、项目、设备) */\n row: string;\n /** 开始 */\n start: TimelineTime;\n /** 结束;只有日期时含这一天 */\n end: TimelineTime;\n /** 名称:提示框的标题;不写时是行名 */\n label?: string;\n /** 系列的 key(计划、实际):决定颜色、粗细与图例 */\n series?: string;\n /** 颜色:覆盖系列的颜色(拖期的一段标红) */\n color?: ChartColor;\n}\n\n/** 时间条的系列 */\nexport interface TimelineChartSeries {\n /** 标识:项的 series 指向它 */\n key: string;\n /** 名称:图例、提示框 */\n label: string;\n /** 颜色;不写时按顺序取色板 */\n color?: ChartColor;\n /** bar 实心的条(默认);track 宽而浅的轨道,画在下面(计划) */\n variant?: 'bar' | 'track';\n}\n\n/** 时间轴上的一条竖线:里程碑、截止日 */\nexport interface TimelineChartMarker {\n /** 时间 */\n at: TimelineTime;\n /** 文字 */\n label: string;\n /** 颜色,默认次要色 */\n color?: ChartColor;\n}\n\n/** 未声明的属性落到外层 div(role=\"figure\")上;aria-label 是图表的名称 */\nexport interface TimelineChartProps\n extends PartProps<'div', 'role' | 'aria-busy'>, ChartFrameParts {\n /** 各段时间条 */\n items: readonly TimelineChartItem[];\n /** 系列:颜色、图例与画法;不写时所有条同一个颜色 */\n series?: readonly TimelineChartSeries[];\n /** 行的顺序;不写时按第一次出现 */\n rows?: readonly string[];\n /** 标出今天(true)或指定的“今天” */\n today?: boolean | TimelineTime;\n /** 里程碑、截止日:竖线带文字 */\n markers?: readonly TimelineChartMarker[];\n /**\n * 每行的高度(px)\n * @default 32\n */\n rowHeight?: number;\n /** 刻度上日期的写法;不写时按刻度的间隔选(几个月一格写“4月”,几天一格写“10/24”,几小时一格写“14:00”) */\n dateFormat?: Intl.DateTimeFormatOptions;\n /** 加载中:绘图区显示骨架 */\n loading?: boolean;\n /** 隐藏的系列:点图例时写回,父级可以写 _hiddenSeries={keys} */\n _hiddenSeries?: string[];\n /** 没有数据时显示的内容 */\n empty?: VNodeChild;\n /** 悬停时的提示框,默认 true */\n tooltip?: boolean;\n}\n\n/** 画图用的一段:时间换成毫秒 */\ninterface Segment {\n item: TimelineChartItem;\n start: number;\n end: number;\n color: string;\n width: number;\n track: boolean;\n}\n\nconst DAY = 86_400_000;\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** 行名最宽多少(px),更长的截短 */\nconst LABEL_WIDTH = 160;\n\n/** TimelineChart 的样式:隔行的底色、时间条 */\nexport const timelineChartStyles = css.create({\n stripe: { fill: '_surfaceMuted' },\n segment: { stroke: '_surface', strokeWidth: 0 },\n segmentActive: { strokeWidth: 1.5, stroke: '_text' },\n});\n\n/** 轨道(计划)的颜色:系列色调浅 */\nconst trackColor = (color: string) => `color-mix(in srgb, ${color} 30%, transparent)`;\n\n/** 按刻度的间隔选日期的写法:几个月一格写月,几天一格写月日,不到一天写时分 */\nfunction autoFormat(ticks: readonly Date[]): Intl.DateTimeFormatOptions {\n const step = ticks.length > 1 ? ticks[1]!.getTime() - ticks[0]!.getTime() : DAY;\n if (step >= 28 * DAY) return { month: 'short' };\n if (step >= DAY) return { month: 'numeric', day: 'numeric' };\n return { hour: '2-digit', minute: '2-digit' };\n}\n\n/** 时间点换成毫秒:ISO 字符串按语言的时区;只有日期的结束取到这一天的末尾 */\nfunction toTime(value: TimelineTime, timeZone: string, end = false): number {\n if (typeof value === 'number') return value;\n if (value instanceof Date) return value.getTime();\n // 只有日期:结束取到这一天的末尾(parseIsoDateTime 也接受只有日期的写法,要先认出来)\n const date = ISO_DATE.test(value) ? parseIsoDate(value) : null;\n if (date) return date.toDate(timeZone).getTime() + (end ? DAY : 0);\n const dateTime = parseIsoDateTime(value);\n if (dateTime) return dateTime.toDate(timeZone).getTime();\n return Date.parse(value);\n}\n\n/** 时间条图 */\nexport const TimelineChart = _component(\n ({\n items,\n series = [],\n rows,\n today,\n markers,\n rowHeight = 32,\n dateFormat,\n loading = false,\n _hiddenSeries: hiddenSeries = _bindable<string[]>([]),\n empty,\n tooltip = true,\n ...rest\n }: TimelineChartProps) => {\n const lang = useLang();\n const format = useFormat();\n const zone = () => lang.timeZone ?? getLocalTimeZone();\n const colorOf = (key: string | undefined) => {\n const position = series.findIndex((item) => item.key === key);\n return resolveColor(series[position]?.color, Math.max(position, 0));\n };\n const rowOrder = _derived(rows ?? [...new Set(items.map((item) => item.row))]);\n const visible = _derived(\n items.filter((item) => item.series === undefined || !hiddenSeries.includes(item.series)),\n );\n const dateText = (time: number) => format.date(new Date(time), { dateStyle: 'medium' });\n const daysText = (segment: Segment) =>\n lang.chartDays(Math.round((segment.end - segment.start) / DAY));\n\n function toggle(key: string) {\n hiddenSeries = hiddenSeries.includes(key)\n ? hiddenSeries.filter((item) => item !== key)\n : [...hiddenSeries, key];\n }\n\n /** 画图的各段:轨道先画(在下面),同一行里按开始时间 */\n const segments = (): Segment[] =>\n visible\n .map((item): Segment => {\n const track = series.find((entry) => entry.key === item.series)?.variant === 'track';\n return {\n item,\n start: toTime(item.start, zone()),\n end: toTime(item.end, zone(), true),\n color: item.color ? resolveColor(item.color, 0) : colorOf(item.series),\n width: track ? rowHeight * 0.62 : rowHeight * 0.32,\n track,\n };\n })\n .sort(\n (a, b) =>\n rowOrder.indexOf(a.item.row) - rowOrder.indexOf(b.item.row) ||\n Number(b.track) - Number(a.track) ||\n a.start - b.start,\n );\n\n /** 竖线:今天与里程碑 */\n const allMarkers = (): TimelineChartMarker[] => [\n ...(today !== undefined && today !== false\n ? [{ at: today === true ? Date.now() : today, label: lang.chartToday, color: 'danger' }]\n : []),\n ...(markers ?? []),\n ];\n\n const area = usePlotArea();\n let hovered = _state.raw<{ index: number; x: number; y: number } | null>(null);\n\n function onPointermove(event: PointerEvent) {\n const target = (event.target as Element).closest?.('[data-segment]');\n if (!target) {\n hovered = null;\n return;\n }\n const { x, y } = pointerIn(event, event.currentTarget as Element);\n hovered = { index: Number(target.getAttribute('data-segment')), x, y };\n }\n\n function renderPlot(shown: readonly Segment[]) {\n const { width } = area;\n const rowsHeight = rowOrder.length * rowHeight;\n const labelWidth = Math.min(\n LABEL_WIDTH,\n Math.max(0, ...rowOrder.map((row) => estimateTextWidth(row))) + 16,\n );\n const marks = allMarkers().map((marker) => ({ ...marker, time: toTime(marker.at, zone()) }));\n const times = [\n ...shown.flatMap((segment) => [segment.start, segment.end]),\n ...marks.map((m) => m.time),\n ];\n const [low, high] = times.length ? [Math.min(...times), Math.max(...times)] : [0, DAY];\n const [start, end] = low === high ? [low - DAY, high + DAY] : [low, high];\n const scale = linearScale(\n [start, end],\n [labelWidth + 8, Math.max(labelWidth + 9, width - 16)],\n );\n const ticks = timeTicks(start, end, Math.max(2, Math.round((width - labelWidth) / 110)));\n const tickFormat = dateFormat ?? autoFormat(ticks);\n const plot = {\n left: labelWidth + 8,\n top: 0,\n width: Math.max(0, width - labelWidth - 24),\n height: rowsHeight,\n };\n const rowOf = (row: string) => rowOrder.indexOf(row);\n return (\n <svg\n width={width}\n height={area.height}\n {...css.attrs(chartSvgStyles.svg)}\n onPointermove={onPointermove}\n onPointerleave={() => (hovered = null)}\n >\n {rowOrder.map((row, position) =>\n position % 2 === 0 ? (\n <rect\n key={`stripe:${row}`}\n x={0}\n y={position * rowHeight}\n width={width}\n height={rowHeight}\n {...css.attrs(timelineChartStyles.stripe)}\n />\n ) : null,\n )}\n {chartAxis({\n side: 'bottom',\n ticks: ticks.map((tick) => ({\n position: scale(tick.getTime()),\n label: format.date(tick, tickFormat),\n })),\n plot,\n grid: true,\n })}\n {rowOrder.map((row, position) => (\n <text\n key={`label:${row}`}\n x={0}\n y={svgNumber(position * rowHeight + rowHeight / 2)}\n dominant-baseline=\"central\"\n {...css.attrs(chartSvgStyles.label)}\n >\n {truncateText(row, labelWidth - 12)}\n </text>\n ))}\n <g {...css.attrs(chartSvgStyles.fadeIn)}>\n {shown.map((segment, index) => {\n const row = rowOf(segment.item.row);\n if (row < 0) return null;\n const x = scale(segment.start);\n const length = Math.max(segment.width, scale(segment.end) - x);\n return (\n <rect\n key={index}\n data-part=\"segment\"\n data-segment={index}\n x={svgNumber(x)}\n y={svgNumber(row * rowHeight + (rowHeight - segment.width) / 2)}\n width={svgNumber(length)}\n height={svgNumber(segment.width)}\n rx={svgNumber(segment.width / 2)}\n {...css.attrs(\n timelineChartStyles.segment,\n chartSvgStyles.fill(segment.track ? trackColor(segment.color) : segment.color),\n hovered?.index === index && timelineChartStyles.segmentActive,\n )}\n />\n );\n })}\n </g>\n {marks.map((marker, position) => {\n const x = Math.round(scale(marker.time)) + 0.5;\n const color = resolveColor(marker.color ?? 'neutral', 0);\n return (\n <g key={`marker:${position}`} data-part=\"marker\">\n <line\n x1={x}\n x2={x}\n y1={0}\n y2={rowsHeight}\n {...css.attrs(xyChartStyles.eventLine, chartSvgStyles.stroke(color))}\n />\n <text\n x={x + 4}\n y={4}\n dominant-baseline=\"hanging\"\n {...css.attrs(\n chartSvgStyles.labelMuted,\n chartSvgStyles.halo,\n xyChartStyles.textFill(color),\n chartSvgStyles.noPointer,\n )}\n >\n {marker.label}\n </text>\n </g>\n );\n })}\n </svg>\n );\n }\n\n const tip = (shown: readonly Segment[]): ChartTip | null => {\n const current = hovered;\n const segment = current && shown[current.index];\n if (!tooltip || !current || !segment) return null;\n const name = series.find((entry) => entry.key === segment.item.series)?.label;\n return {\n x: current.x,\n y: current.y,\n content: chartTooltip(segment.item.label ?? segment.item.row, [\n ...(name ? [{ label: name, color: segment.color, value: daysText(segment) }] : []),\n { label: lang.chartStart, color: 'transparent', value: dateText(segment.start) },\n { label: lang.chartEnd, color: 'transparent', value: dateText(segment.end - 1) },\n ]),\n };\n };\n\n return () => {\n const shown = segments();\n return (\n <ChartFrame\n {...rest}\n // 行数 × 行高,加上时间轴\n height={rowOrder.length * rowHeight + 36}\n legend={series.map((item, position) => {\n const color = resolveColor(item.color, position);\n return {\n key: item.key,\n label: item.label,\n color: item.variant === 'track' ? trackColor(color) : color,\n };\n })}\n hiddenKeys={hiddenSeries}\n onLegendToggle={toggle}\n loading={loading}\n skeleton={<Skeleton sx={xyChartStyles.skeleton} />}\n isEmpty={items.length === 0}\n empty={empty}\n table={{\n columns: [\n lang.chartCategory,\n lang.chartSeries,\n lang.chartStart,\n lang.chartEnd,\n lang.chartDuration,\n ],\n rows: shown.map((segment) => ({\n header: segment.item.label ?? segment.item.row,\n cells: [\n series.find((entry) => entry.key === segment.item.series)?.label ?? lang.emptyValue,\n dateText(segment.start),\n dateText(segment.end - 1),\n daysText(segment),\n ],\n })),\n }}\n plotRef={area.ref}\n plot={\n area.ready\n ? [\n renderPlot(shown),\n <ChartTooltipBox key=\"tooltip\" tip={tip(shown)} width={area.width} />,\n ]\n : null\n }\n />\n );\n };\n },\n);\n"],"mappings":"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"}
@@ -34,7 +34,13 @@ export interface TreemapChartProps<T extends object> extends PartProps<'div', 'r
34
34
  }
35
35
  /** TreemapChart 的样式 */
36
36
  export declare const treemapChartStyles: Readonly<{
37
+ group: css.CompiledStyles;
38
+ groupName: css.CompiledStyles;
39
+ name: css.CompiledStyles;
37
40
  skeleton: css.CompiledStyles;
41
+ tile: css.CompiledStyles;
42
+ tileActive: css.CompiledStyles;
43
+ value: css.CompiledStyles;
38
44
  }>;
39
45
  /** 矩形树图 */
40
46
  export declare const TreemapChart: <T extends object>(props: TreemapChartProps<T>) => import("@zerodep-dev/vue-tsx-pro-tsx").TsxNode;