@lionad/cx-comps-tanstack-charts 0.1.0-alpha.10

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.
@@ -0,0 +1,476 @@
1
+ import type { ChartTheme } from '@tanstack/charts';
2
+ /**
3
+ * 声明式 JSON 类型:物料 data 的投影形态。
4
+ *
5
+ * Why 存在:defineChart 的 definition 含三类不可 JSON 化值——scale(函数工厂/实例)、
6
+ * curve(ChartCurve 函数对)、回调(format/accessor/tooltip content)。cx 物料 data 必须
7
+ * 纯 JSON,本模块把声明式描述(kind 枚举、curve 枚举、字段名 channel、标量子集)约束为
8
+ * 可 JSON 化形态,由翻译层编译为运行时实例。channel 仅支持字段名字符串:低代码与
9
+ * LLM 生成场景不要求 accessor 函数(accessor 逻辑经数据预置烘焙降级)。
10
+ */
11
+ export type CxChartCurveName = 'linear' | 'linearClosed' | 'monotoneX' | 'step' | 'stepAfter' | 'stepBefore' | 'basis' | 'natural' | 'catmullRom';
12
+ /**
13
+ * scale 声明式枚举。时间系(utc/time)domain 用 ISO 8601 字符串表达
14
+ * (Date 实例 JSON 不可表达,翻译层负责 new Date 转换)。
15
+ */
16
+ export type CxChartScaleSpec = {
17
+ kind: 'linear';
18
+ domain?: [number, number];
19
+ } | {
20
+ kind: 'utc' | 'time';
21
+ domain?: [string, string];
22
+ } | {
23
+ kind: 'log' | 'sqrt' | 'symlog';
24
+ domain?: [number, number];
25
+ } | {
26
+ kind: 'pow';
27
+ exponent?: number;
28
+ domain?: [number, number];
29
+ } | {
30
+ kind: 'point';
31
+ domain?: string[];
32
+ padding?: number;
33
+ } | {
34
+ kind: 'band';
35
+ domain?: string[];
36
+ padding?: number;
37
+ } | {
38
+ kind: 'ordinal';
39
+ domain?: string[];
40
+ };
41
+ export interface CxChartAxisSpec {
42
+ scale?: CxChartScaleSpec;
43
+ nice?: boolean | number;
44
+ reverse?: boolean;
45
+ grid?: boolean;
46
+ axis?: false | {
47
+ label?: string;
48
+ ticks?: {
49
+ count?: number;
50
+ size?: number;
51
+ padding?: number;
52
+ values?: (number | string)[];
53
+ };
54
+ tickLabels?: false | {
55
+ rotate?: number;
56
+ fontSize?: number;
57
+ dx?: number;
58
+ dy?: number;
59
+ anchor?: 'start' | 'middle' | 'end';
60
+ };
61
+ };
62
+ }
63
+ /**
64
+ * mark layout 声明式(stack/group/dodge 挂 mark.layout 字段;
65
+ * group 的 scale 函数形态不可 JSON,仅暴露 padding)。
66
+ */
67
+ export type CxChartLayoutSpec = {
68
+ kind: 'stack';
69
+ order?: 'input' | 'ascending' | 'descending' | 'inside-out' | string[];
70
+ offset?: 'diverging' | 'normalize' | 'center' | 'wiggle';
71
+ reverse?: boolean;
72
+ anchor?: {
73
+ series: string;
74
+ fraction?: number;
75
+ };
76
+ } | {
77
+ kind: 'group';
78
+ padding?: number;
79
+ } | {
80
+ kind: 'dodgeX';
81
+ anchor?: 'left' | 'middle' | 'right';
82
+ padding?: number;
83
+ } | {
84
+ kind: 'dodgeY';
85
+ anchor?: 'bottom' | 'middle' | 'top';
86
+ padding?: number;
87
+ };
88
+ export type CxChartMarkType = 'lineY' | 'lineX' | 'areaY' | 'areaX' | 'barY' | 'barX' | 'ruleY' | 'ruleX' | 'dot' | 'text' | 'tickX' | 'tickY' | 'bandY' | 'bandX' | 'rect' | 'cell' | 'link' | 'arrow' | 'vector' | 'hexagon' | 'frame' | 'boxY' | 'boxX' | 'violinY' | 'violinX' | 'ridgelineY' | 'ridgelineX' | 'waffleY' | 'waffleX' | 'differenceY' | 'differenceX' | 'linearRegressionY' | 'linearRegressionX' | 'voronoi' | 'hexbin' | 'contour' | 'delaunayLink' | 'density' | 'polar' | 'pie' | 'radialArc' | 'radialBarRadius' | 'radialBarAngle' | 'radialLine' | 'radialArea' | 'radialDot' | 'radialText' | 'radialRule' | 'sankey' | 'sunburst' | 'treemap' | 'tree' | 'forceGraph' | 'geoShape' | 'facet';
89
+ /**
90
+ * 单 mark 声明式。平铺契约(LLM 友好):专有标量字段全部可选、按名透传,
91
+ * 不适用的字段被对应工厂忽略;channel 只接受字段名字符串(弹性 channel
92
+ * angle/radius/width/height/length/rotate/r 另接受数值常量)。
93
+ */
94
+ export interface CxChartMarkSpec {
95
+ type: CxChartMarkType;
96
+ /**
97
+ * 行数组(内嵌,常量数组亦可)或命名数据集字符串引用。
98
+ * 字符串引用由 translateChartSpec 的 datasets 表解析——GenUI 契约是数据顶层化
99
+ * (data.rows 与 definition 平级),marks 内以 "rows" 引用;未命中一律回退空数组
100
+ * (流式中间态与笔误运行时不可区分,渲染层容错优先,笔误显式化归生成期校验门)。
101
+ */
102
+ data?: readonly unknown[] | string;
103
+ id?: string;
104
+ /**
105
+ * 装饰层开关:true 时经库 decorative() 包装——保留比例尺与绘制几何、剥离交互
106
+ * 所有权(tooltip 命中/焦点/条件高亮均跳过该 mark)。典型:辅助折线/参考线/标注
107
+ * 不抢数据点的 tooltip 命中。库层约束是带 focus/states 行为的 mark 不可包装
108
+ * (initialize 抛 TypeError),本 grammar 不暴露条件态声明,故恒安全。
109
+ */
110
+ decorative?: boolean;
111
+ x?: string;
112
+ y?: string;
113
+ x1?: string;
114
+ y1?: string;
115
+ x2?: string;
116
+ y2?: string;
117
+ z?: string;
118
+ color?: string;
119
+ key?: string;
120
+ text?: string;
121
+ r?: string | number;
122
+ angle?: string | number;
123
+ radius?: string | number;
124
+ width?: string | number;
125
+ height?: string | number;
126
+ length?: string | number;
127
+ rotate?: string | number;
128
+ stroke?: string;
129
+ strokeWidth?: number;
130
+ strokeOpacity?: number;
131
+ strokeDasharray?: string;
132
+ fill?: string;
133
+ fillOpacity?: number;
134
+ fontSize?: number;
135
+ fontWeight?: number;
136
+ dx?: number;
137
+ dy?: number;
138
+ points?: boolean;
139
+ opacity?: number;
140
+ curve?: CxChartCurveName;
141
+ layout?: CxChartLayoutSpec;
142
+ span?: number;
143
+ overlap?: number;
144
+ unit?: number;
145
+ round?: boolean;
146
+ gap?: number;
147
+ columns?: number;
148
+ headLength?: number;
149
+ headAngle?: number;
150
+ lineCap?: 'butt' | 'round' | 'square';
151
+ anchor?: 'start' | 'middle' | 'end';
152
+ ci?: number;
153
+ samples?: number;
154
+ positiveFill?: string;
155
+ negativeFill?: string;
156
+ positiveFillOpacity?: number;
157
+ negativeFillOpacity?: number;
158
+ comparisonStroke?: string;
159
+ cornerRadius?: number;
160
+ padAngle?: number;
161
+ radiusOffset?: number;
162
+ /** radial 系径向起止(radialRule 引导线/指针、radialBarRadius/radialArea 内径端):字段名或数值常量 */
163
+ radius1?: string | number;
164
+ radius2?: string | number;
165
+ /** radialBarAngle 弧段角度起止(显式堆叠弧段):字段名或数值常量 */
166
+ angle1?: string | number;
167
+ angle2?: string | number;
168
+ baseline?: 'auto' | 'middle' | 'hanging';
169
+ inset?: number;
170
+ /** hexbin 相邻 bin 中心水平像素距 */
171
+ binWidth?: number;
172
+ /** hexbin 聚合输出(reduce 枚举同 transforms) */
173
+ outputs?: CxChartTransformOutputs;
174
+ /** contour 等值线层数或精确层级(标量网格字段复用通用 value channel);density 同字段表达密度层级 */
175
+ thresholds?: number | number[];
176
+ /** contour 线性插值平滑(缺省 true) */
177
+ smooth?: boolean;
178
+ /** density 高斯核带宽(CSS 像素,库缺省 20) */
179
+ bandwidth?: number;
180
+ /** density 密度网格单元尺寸(CSS 像素,库缺省 4) */
181
+ cellSize?: number;
182
+ marks?: CxChartMarkSpec[];
183
+ radiusRatio?: number;
184
+ startAngle?: number;
185
+ endAngle?: number;
186
+ angleAxis?: CxChartAxisSpec;
187
+ radiusAxis?: CxChartAxisSpec;
188
+ polarGuides?: CxChartPolarGuideSpec[];
189
+ innerRadiusRatio?: number;
190
+ outerRadiusRatio?: number;
191
+ value?: string;
192
+ path?: string;
193
+ delimiter?: string;
194
+ nodeId?: string;
195
+ parentId?: string;
196
+ nodes?: string;
197
+ links?: string;
198
+ nodeKey?: string;
199
+ source?: string;
200
+ target?: string;
201
+ /** sankey 稳定连线标识字段 */
202
+ linkKey?: string;
203
+ /** forceGraph 仿真参数与力集(缺省固化常规四力:link/manyBody/center/collide) */
204
+ domainPadding?: number;
205
+ forces?: CxChartForceSpec[];
206
+ align?: 'left' | 'right' | 'center' | 'justify';
207
+ nodeWidth?: number;
208
+ nodePadding?: number;
209
+ iterations?: number;
210
+ method?: 'squarify' | 'binary' | 'dice' | 'slice' | 'slice-dice';
211
+ ratio?: number;
212
+ paddingInner?: number;
213
+ paddingOuter?: number;
214
+ /** treemap 叶子标签字段名(string);facet 分组标签开关(boolean)——按 mark type 分别消费 */
215
+ label?: string | boolean;
216
+ labelPadding?: number;
217
+ labelFontSize?: number;
218
+ labelFontWeight?: number;
219
+ orientation?: 'left' | 'right' | 'top' | 'bottom';
220
+ nodeSize?: [number, number];
221
+ projection?: 'mercator' | 'orthographic' | 'naturalEarth1' | 'albersUsa' | 'equalEarth' | 'identity';
222
+ fit?: 'data' | 'sphere';
223
+ by?: string;
224
+ axes?: 'outer' | 'cell';
225
+ minWidth?: number;
226
+ chart?: CxChartSpec;
227
+ visibleDepth?: number;
228
+ ringPadding?: number;
229
+ }
230
+ /** polar guides(radialGrid/angleGrid)声明式 */
231
+ export interface CxChartPolarGuideSpec {
232
+ kind: 'radialGrid' | 'angleGrid';
233
+ values?: (number | string)[];
234
+ ticks?: number;
235
+ shape?: 'circle' | 'polygon';
236
+ labels?: boolean;
237
+ labelAngle?: number;
238
+ labelOffset?: number;
239
+ }
240
+ /**
241
+ * forceGraph 力集声明式:库 ForceDescriptor 的 JSON 子集。
242
+ * 数值参数接受字段名字符串(库 ForceNumericValue 支持 TransformValue);
243
+ * custom 工厂形态不可 JSON,不收录。
244
+ */
245
+ export type CxChartForceSpec = {
246
+ type: 'link';
247
+ distance?: number | string;
248
+ strength?: number | string;
249
+ } | {
250
+ type: 'manyBody';
251
+ strength?: number | string;
252
+ } | {
253
+ type: 'center';
254
+ x?: number;
255
+ y?: number;
256
+ } | {
257
+ type: 'collide';
258
+ radius?: number | string;
259
+ strength?: number;
260
+ } | {
261
+ type: 'x';
262
+ x?: number | string;
263
+ strength?: number | string;
264
+ } | {
265
+ type: 'y';
266
+ y?: number | string;
267
+ strength?: number | string;
268
+ };
269
+ /**
270
+ * reduce 枚举(outputs 归约器):字符串枚举全可 JSON;
271
+ * quantile 带参数用对象形态 { quantile: 0.25 }。
272
+ */
273
+ export type CxChartReduce = 'count' | 'sum' | 'mean' | 'min' | 'max' | 'median' | 'first' | 'last' | 'variance' | 'deviation' | 'delta' | 'ratio' | {
274
+ quantile: number;
275
+ };
276
+ export interface CxChartTransformOutputs {
277
+ [name: string]: {
278
+ value?: string;
279
+ reduce: CxChartReduce;
280
+ };
281
+ }
282
+ /**
283
+ * 数据预处理管道:spec 顶层 transforms 数组,按序执行,
284
+ * 每步产物以 name 注册进数据集表(marks/transforms 后续步骤可字符串引用)。
285
+ * data 缺省引用 'rows'。binTime 系不收录(interval 对象 JSON 不可表达——时间分箱由
286
+ * 数据预置聚合降级)。
287
+ */
288
+ export type CxChartTransformSpec = {
289
+ name: string;
290
+ kind: 'groupBy';
291
+ data?: string;
292
+ by: string | Record<string, string>;
293
+ outputs: CxChartTransformOutputs;
294
+ } | {
295
+ name: string;
296
+ kind: 'binX' | 'binY';
297
+ data?: string;
298
+ value: string;
299
+ by?: string | Record<string, string>;
300
+ thresholds?: number | number[];
301
+ domain?: [number, number];
302
+ outputs?: CxChartTransformOutputs;
303
+ } | {
304
+ name: string;
305
+ kind: 'binXY';
306
+ data?: string;
307
+ x: string;
308
+ y: string;
309
+ by?: string | Record<string, string>;
310
+ xThresholds?: number | number[];
311
+ yThresholds?: number | number[];
312
+ xDomain?: [number, number];
313
+ yDomain?: [number, number];
314
+ outputs?: CxChartTransformOutputs;
315
+ } | {
316
+ name: string;
317
+ kind: 'rollingWindow';
318
+ data?: string;
319
+ size: number;
320
+ by?: string | Record<string, string>;
321
+ anchor?: 'start' | 'middle' | 'end';
322
+ partial?: boolean;
323
+ outputs: CxChartTransformOutputs;
324
+ orderBy?: string;
325
+ order?: 'ascending' | 'descending';
326
+ } | {
327
+ name: string;
328
+ kind: 'normalize';
329
+ data?: string;
330
+ value: string;
331
+ by?: string | Record<string, string>;
332
+ as?: string;
333
+ basis?: 'sum' | 'max' | 'extent' | 'first' | 'last';
334
+ } | {
335
+ name: string;
336
+ kind: 'cumulative';
337
+ data?: string;
338
+ by?: string | Record<string, string>;
339
+ outputs: CxChartTransformOutputs;
340
+ orderBy?: string;
341
+ order?: 'ascending' | 'descending';
342
+ } | {
343
+ name: string;
344
+ kind: 'fold';
345
+ data?: string;
346
+ fields: string[];
347
+ as?: {
348
+ key: string;
349
+ value: string;
350
+ };
351
+ } | {
352
+ name: string;
353
+ kind: 'rank';
354
+ data?: string;
355
+ value: string;
356
+ by?: string | Record<string, string>;
357
+ order?: 'ascending' | 'descending';
358
+ ties?: 'competition' | 'dense' | 'ordinal';
359
+ as?: string;
360
+ } | {
361
+ name: string;
362
+ kind: 'select';
363
+ data?: string;
364
+ by?: string | Record<string, string>;
365
+ value?: string;
366
+ select: 'first' | 'last' | 'min' | 'max';
367
+ } | {
368
+ name: string;
369
+ kind: 'stackRowsY' | 'stackRowsX';
370
+ data?: string;
371
+ x: string;
372
+ y: string;
373
+ z?: string;
374
+ order?: 'input' | 'ascending' | 'descending' | 'inside-out' | string[];
375
+ offset?: 'diverging' | 'normalize' | 'center' | 'wiggle';
376
+ reverse?: boolean;
377
+ anchor?: {
378
+ series: string;
379
+ fraction?: number;
380
+ };
381
+ } | {
382
+ name: string;
383
+ kind: 'waterfall';
384
+ data?: string;
385
+ value: string;
386
+ by?: string | Record<string, string>;
387
+ total?: boolean;
388
+ orderBy?: string;
389
+ order?: 'ascending' | 'descending';
390
+ } | {
391
+ name: string;
392
+ kind: 'mosaicY' | 'mosaicX';
393
+ data?: string;
394
+ x: string;
395
+ y: string;
396
+ value: string;
397
+ xOrder?: (string | number)[];
398
+ yOrder?: (string | number)[];
399
+ } | {
400
+ name: string;
401
+ kind: 'linearRegressionRowsY' | 'linearRegressionRowsX';
402
+ data?: string;
403
+ x: string;
404
+ y: string;
405
+ z?: string;
406
+ ci?: number;
407
+ samples?: number;
408
+ } | {
409
+ name: string;
410
+ kind: 'boxRows';
411
+ data?: string;
412
+ category: string;
413
+ value: string;
414
+ } | {
415
+ name: string;
416
+ kind: 'pie';
417
+ data?: string;
418
+ value: string;
419
+ /** CX 统一 padAngle 命名(transform 侧字段为 gapAngle,翻译层映射) */
420
+ padAngle?: number;
421
+ startAngle?: number;
422
+ endAngle?: number;
423
+ };
424
+ /** 命名数据集表:物料 data 顶层除 definition 外的数组字段(GenUI 契约 rows/nodes/links) */
425
+ export type CxChartDatasets = Record<string, readonly unknown[] | undefined>;
426
+ export interface CxChartSpec {
427
+ marks: CxChartMarkSpec[];
428
+ x?: CxChartAxisSpec | null;
429
+ y?: CxChartAxisSpec | null;
430
+ theme?: Partial<ChartTheme>;
431
+ margin?: number | {
432
+ top?: number;
433
+ right?: number;
434
+ bottom?: number;
435
+ left?: number;
436
+ };
437
+ guides?: boolean;
438
+ clip?: boolean;
439
+ /** 数据预处理管道(顶层声明,marks 之前执行;产物注册进 datasets 表) */
440
+ transforms?: CxChartTransformSpec[];
441
+ /** color scale 声明式(domain/range 直可 JSON;legend 为图例声明) */
442
+ color?: {
443
+ domain?: (string | number)[];
444
+ range?: string[];
445
+ legend?: true | {
446
+ kind?: 'color' | 'gradient';
447
+ label?: string;
448
+ placement?: 'top' | 'bottom';
449
+ itemWidth?: number;
450
+ steps?: number;
451
+ width?: number;
452
+ };
453
+ };
454
+ tooltip?: boolean | {
455
+ placement?: 'auto' | 'top' | 'top-right' | 'right' | 'bottom-right' | 'bottom' | 'bottom-left' | 'left' | 'top-left' | ('top' | 'top-right' | 'right' | 'bottom-right' | 'bottom' | 'bottom-left' | 'left' | 'top-left')[];
456
+ offset?: number;
457
+ sticky?: boolean;
458
+ visibility?: 'focus' | 'pinned';
459
+ anchor?: 'point' | 'pointer' | 'group-center' | {
460
+ x?: 'point' | 'pointer' | 'value' | 'group-center' | 'plot-left' | 'plot-center' | 'plot-right';
461
+ y?: 'point' | 'pointer' | 'value' | 'group-center' | 'plot-top' | 'plot-center' | 'plot-bottom';
462
+ };
463
+ sort?: 'visual' | 'color-domain' | 'focus';
464
+ items?: ('x' | 'y' | 'group' | {
465
+ channel: 'x' | 'y' | 'group';
466
+ label?: string;
467
+ } | {
468
+ field: string;
469
+ label?: string;
470
+ })[];
471
+ };
472
+ pointer?: boolean;
473
+ keyboard?: boolean;
474
+ focusRing?: boolean;
475
+ focus?: 'nearest' | 'nearest-x' | 'nearest-y' | 'group-x' | 'group-y';
476
+ }
@@ -0,0 +1,32 @@
1
+ import type { ComputedRef } from 'vue';
2
+ import type { CxChartDatasets, CxChartSpec } from './translate';
3
+ export interface CxChartHostPartition {
4
+ /** <Chart> 宿主 props(标量白名单 + class/style) */
5
+ hostProps: ComputedRef<Record<string, unknown>>;
6
+ /** Chart 必填 ariaLabel,独立绑定(v-bind 对象无法向模板类型检查证明 required 键在场) */
7
+ ariaLabel: ComputedRef<string>;
8
+ }
9
+ export interface CxChartPropsPartition extends CxChartHostPartition {
10
+ /** 物料 JSON definition(声明式 spec,待翻译层组装) */
11
+ spec: ComputedRef<CxChartSpec>;
12
+ /** 命名数据集表(rows/nodes/links 白名单分馏;marks 字符串引用在此解析) */
13
+ datasets: ComputedRef<CxChartDatasets>;
14
+ }
15
+ /**
16
+ * 分馏 <Chart> 宿主 props:标量白名单 + class/style + ariaLabel 回退。
17
+ *
18
+ * 剥离 cx 内部键(comp 运行时节点、data-* 编辑标记、_ 前缀编辑器键),与 vtu/EP 桥接同形。
19
+ * class/style 保留进 hostProps(cx 编辑器样式类落到 Chart 根宿主 div)。
20
+ * ariaLabel 是 Chart 必填 prop,缺省回退物料中文名;它与 hostProps 分开返回,
21
+ * 由包装层显式绑定,否则模板类型检查把 v-bind 的 Record 当作 required 键缺席。
22
+ * 预设物料与通用 chart 共用本函数——差异只在 spec 来源(definition 键 vs 通道组装)。
23
+ */
24
+ export declare function useChartHostProps(attrs: Record<string, unknown>): CxChartHostPartition;
25
+ /**
26
+ * 通用 chart 物料的分馏:definition 键 → spec,外加宿主 props。
27
+ *
28
+ * definition 键从透传集中分馏——Chart 组件的 definition prop 只接受运行时产物,
29
+ * 物料侧的 JSON spec 须经翻译层组装后由包装层显式绑定,不能随 v-bind 原样透传。
30
+ * 返回独立 computed 而非整体 ref:包装层分别绑定,避免解构丢响应性。
31
+ */
32
+ export declare function useChartProps(attrs: Record<string, unknown>): CxChartPropsPartition;
@@ -0,0 +1,20 @@
1
+ import type { DomChartDefinition } from '@tanstack/charts';
2
+ import type { ComputedRef } from 'vue';
3
+ import type { CxChartHostPartition } from './use-chart-props';
4
+ export interface CxPieChartPartition extends CxChartHostPartition {
5
+ /** pie 变换 + polar(radialArc) 组装的运行时 definition */
6
+ definition: ComputedRef<DomChartDefinition>;
7
+ }
8
+ /**
9
+ * 饼图物料的 definition 组装:扁平通道 props(data/name/value/innerRadiusRatio)
10
+ * → pie() 角度分配 → polar(radialArc) 扇区弧。
11
+ *
12
+ * 与笛卡尔预设的翻译层路径不同:pie 涉及运行时函数(pie 变换、innerRadius 比例函数),
13
+ * 属 JSON 不可表达值的物料侧桥接,故在物料内直接组装、不经 CxChartSpec 声明式投影。
14
+ *
15
+ * 鲁棒性(JSON 输入不受 TS 约束):
16
+ * - 负值/非数值行在 pie 前过滤——pie 对负值显式抛 TypeError,不过滤会炸整棵渲染树;
17
+ * - innerRadiusRatio 钳制 [0, 0.95]——1.0 完全空心渲染不可见,属无效配置而非有效极端;
18
+ * - name/value 字段缺席回退 'name'/'value'(与笛卡尔预设的回退策略同形)。
19
+ */
20
+ export declare function usePieChart(attrs: Record<string, unknown>): CxPieChartPartition;
@@ -0,0 +1,25 @@
1
+ import type { ComputedRef } from 'vue';
2
+ import type { CxChartHostPartition } from './use-chart-props';
3
+ import type { CxChartMarkType, CxChartScaleSpec, CxChartSpec } from './translate';
4
+ export interface CxPresetChartOptions {
5
+ /** 预设 mark 类型(lineY/barY/areaY/dot 等笛卡尔单通道 mark) */
6
+ markType: CxChartMarkType;
7
+ /** x 轴 scale kind(序列类用 point/band,数值散点用 linear) */
8
+ xScale: CxChartScaleSpec['kind'];
9
+ /** 是否消费 curve 通道(line/area 支持,bar/dot 忽略) */
10
+ withCurve?: boolean;
11
+ }
12
+ export interface CxPresetChartPartition extends CxChartHostPartition {
13
+ /** 由通道 props(data/x/y/curve)组装的声明式 spec */
14
+ spec: ComputedRef<CxChartSpec>;
15
+ }
16
+ /**
17
+ * 预设物料的 spec 组装:把扁平通道 props(data 行数组 + x/y 字段名 + curve 枚举)
18
+ * 投影为单 mark 的 CxChartSpec,与通用 chart 物料共用翻译层与宿主 props 分馏。
19
+ *
20
+ * 通道缺席回退固定字段名(x→'x'、y→'y')而非省略:translateMark 对非字符串 channel
21
+ * 显式抛错,流式中间态/编辑器清空场景下回退保证规格恒可翻译;data 缺席回退空数组
22
+ * (mark 渲染为空而非抛错)。meta.props 的 initial 三元组(data 行键/x 值/y 值)
23
+ * 必须自洽——initial 不参与运行时校验,漂移无任何报错(vtu 既有教训)。
24
+ */
25
+ export declare function usePresetChart(attrs: Record<string, unknown>, options: CxPresetChartOptions): CxPresetChartPartition;
@@ -0,0 +1,9 @@
1
+ import type { CxSpec, StreamTriggerConfig, TriggerRegistry } from '@lionad/cx-stream';
2
+ export declare const TANSTACK_CHARTS_STREAM_TRIGGERS: StreamTriggerConfig[];
3
+ /** 装配 TanStack Charts 物料的 trigger 注册表(size 恒 6) */
4
+ export declare function createTanstackChartsTriggerRegistry(): TriggerRegistry<CxSpec>;
5
+ /** 增量节点的主数组(回放计数展示用);非数组增长型物料或数组缺席时返回 null */
6
+ export declare function mainArrayOf(node: {
7
+ key: string;
8
+ data?: Record<string, unknown>;
9
+ }): unknown[] | null;
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@lionad/cx-comps-tanstack-charts",
3
+ "version": "0.1.0-alpha.10",
4
+ "description": "cx material components wrapping TanStack Charts (@tanstack/charts/vue)",
5
+ "keywords": [
6
+ "charts",
7
+ "schema-driven",
8
+ "tanstack-charts",
9
+ "vue"
10
+ ],
11
+ "homepage": "https://github.com/Lionad-Morotar/cx#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/Lionad-Morotar/cx/issues"
14
+ },
15
+ "author": "Lionad-Morotar",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/Lionad-Morotar/cx.git",
19
+ "directory": "packages/comps-tanstack-charts"
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "type": "module",
25
+ "sideEffects": false,
26
+ "main": "./dist/index.mjs",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "import": "./dist/index.mjs"
32
+ }
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "dependencies": {
38
+ "@lionad/cx-definition": "0.1.0-alpha.10",
39
+ "@lionad/cx-stream": "0.1.0-alpha.10",
40
+ "@lionad/cx-vue": "0.1.0-alpha.10",
41
+ "d3-geo": "^3.1.1",
42
+ "d3-scale": "^4.0.2",
43
+ "d3-shape": "^3.2.0"
44
+ },
45
+ "devDependencies": {
46
+ "@tanstack/charts": "^0.14.0",
47
+ "@types/d3-geo": "^3.1.1",
48
+ "@types/d3-scale": "^4.0.9",
49
+ "@types/d3-shape": "^3.1.8",
50
+ "@vueuse/core": "^14.3.0",
51
+ "typescript": "^6.0.3",
52
+ "vue": "^3.5.40",
53
+ "vue-tsc": "^3.3.7"
54
+ },
55
+ "peerDependencies": {
56
+ "@tanstack/charts": "^0.14.0",
57
+ "@vueuse/core": "^13.0.0 || ^14.0.0",
58
+ "vue": "^3.5.0"
59
+ },
60
+ "scripts": {
61
+ "build": "vp pack && vue-tsc -p tsconfig.build.json",
62
+ "typecheck": "vue-tsgo --tsdk ../../node_modules/.pnpm/typescript@7.0.2/node_modules/typescript --noEmit"
63
+ }
64
+ }