@tellaro/tql 1.3.8 → 1.4.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.
Files changed (33) hide show
  1. package/dist/index.js +44 -41
  2. package/dist/node_modules/@kurkle/color/dist/color.esm.js +442 -0
  3. package/dist/node_modules/chart.js/dist/chart.js +6149 -0
  4. package/dist/node_modules/chart.js/dist/chunks/helpers.dataset.js +1685 -0
  5. package/dist/node_modules/chartjs-adapter-luxon/dist/chartjs-adapter-luxon.esm.js +56 -0
  6. package/dist/node_modules/chartjs-plugin-annotation/dist/chartjs-plugin-annotation.esm.js +1655 -0
  7. package/dist/node_modules/chartjs-plugin-datalabels/dist/chartjs-plugin-datalabels.esm.js +607 -0
  8. package/dist/node_modules/luxon/build/es6/luxon.js +5524 -0
  9. package/dist/src/builder.d.ts +62 -0
  10. package/dist/src/builder.js +56 -0
  11. package/dist/src/chart/colors.d.ts +23 -0
  12. package/dist/src/chart/colors.js +101 -0
  13. package/dist/src/chart/formatters.d.ts +17 -0
  14. package/dist/src/chart/formatters.js +49 -0
  15. package/dist/src/chart/index.d.ts +9 -0
  16. package/dist/src/chart/index.js +31 -0
  17. package/dist/src/chart/mappers.d.ts +849 -0
  18. package/dist/src/chart/mappers.js +613 -0
  19. package/dist/src/completionProvider.js +294 -165
  20. package/dist/src/index.d.ts +2 -1
  21. package/dist/src/parser.d.ts +10 -0
  22. package/dist/src/parser.js +41 -9
  23. package/dist/src/tokenizer.js +124 -103
  24. package/dist/src/types.d.ts +27 -3
  25. package/dist/src/validator.js +10 -9
  26. package/dist/tql.css +1 -1
  27. package/dist/vue/TqlChart.vue.d.ts +2 -0
  28. package/dist/vue/TqlChart.vue.js +7 -0
  29. package/dist/vue/TqlChart.vue2.js +212 -0
  30. package/dist/vue/index.d.ts +1 -0
  31. package/dist/vue/index.js +12 -10
  32. package/dist/vue/useTqlInput.js +80 -80
  33. package/package.json +39 -3
@@ -0,0 +1,849 @@
1
+ /**
2
+ * TQL Chart Data Mappers
3
+ *
4
+ * Pure functions that transform TQL stats results into Chart.js data/options.
5
+ * Supports 20+ viz_params for professional-grade chart customization.
6
+ *
7
+ * No Chart.js import needed — outputs plain objects matching Chart.js interfaces.
8
+ */
9
+ /** TQL stats result shape from the evaluator */
10
+ export interface TqlStatsResult {
11
+ stats: Record<string, unknown>;
12
+ total?: number;
13
+ took?: number;
14
+ viz_hint?: string;
15
+ viz_params?: Record<string, unknown>;
16
+ }
17
+ /** Extracted data from a grouped aggregation */
18
+ export interface GroupedData {
19
+ labels: string[];
20
+ values: number[];
21
+ colors?: string[];
22
+ multiValues?: Record<string, number[]>;
23
+ }
24
+ /** Drilldown event payload emitted on chart click */
25
+ export interface DrilldownEvent {
26
+ label: string;
27
+ value: number;
28
+ index: number;
29
+ field?: string;
30
+ chartType: string;
31
+ }
32
+ /** Check if the group-by field looks like a timestamp */
33
+ export declare function isTimeSeriesData(stats: Record<string, unknown>): boolean;
34
+ /**
35
+ * Normalize OpenSearch aggregation response into the results array format.
36
+ * Handles both flat and nested (multi-group-by) aggregations.
37
+ * OpenSearch returns: { group_by_field: { buckets: [{key, doc_count}, ...] } }
38
+ * We normalize to: { results: [{key, doc_count}, ...] }
39
+ */
40
+ export declare function normalizeOpenSearchAggs(stats: Record<string, unknown>): Record<string, unknown>;
41
+ /** Extract labels and values from a TQL grouped stats result */
42
+ export declare function extractGroupedData(stats: Record<string, unknown>): GroupedData;
43
+ /** Extract a single scalar value from a stats result.
44
+ * For scalar results (no group by): returns the value directly.
45
+ * For grouped results (buckets): sums all bucket values as a total.
46
+ */
47
+ export declare function extractScalarValue(stats: Record<string, unknown>): number;
48
+ /** Parse "key:#hex,key2:#hex" or preset name into a color map */
49
+ export declare function parseColorMap(colorStr: string | undefined): Record<string, string> | null;
50
+ /**
51
+ * Apply all viz_param filters to grouped data:
52
+ * - include/exclude value filtering
53
+ * - top N with Other bucket
54
+ * - sort order
55
+ * - normalize to 100%
56
+ * - color mapping
57
+ */
58
+ export declare function applyVizFilters(data: GroupedData, vizParams?: Record<string, unknown>): GroupedData;
59
+ /** Expand a template URL: "https://example.com/{{value}}" with context */
60
+ export declare function expandLinkTemplate(template: string, ctx: {
61
+ value: string;
62
+ label: string;
63
+ field?: string;
64
+ count?: number;
65
+ }): string;
66
+ /** Validate a URL template is safe (no javascript:, data:, etc.) */
67
+ export declare function isLinkTemplateSafe(template: string): boolean;
68
+ /** Build Chart.js data for bar charts */
69
+ export declare function barChartData(result: TqlStatsResult): {
70
+ labels: string[];
71
+ datasets: unknown[];
72
+ };
73
+ /** Build Chart.js data for line/area charts */
74
+ export declare function lineChartData(result: TqlStatsResult, fill?: boolean, smooth?: boolean): {
75
+ labels: string[];
76
+ datasets: {
77
+ label: string;
78
+ data: number[];
79
+ borderColor: string;
80
+ backgroundColor: string;
81
+ fill: boolean;
82
+ tension: number;
83
+ pointRadius: number;
84
+ pointHoverRadius: number;
85
+ pointBackgroundColor: string;
86
+ pointBorderColor: string;
87
+ pointBorderWidth: number;
88
+ borderWidth: number;
89
+ spanGaps: boolean;
90
+ }[];
91
+ } | {
92
+ labels: string[];
93
+ datasets: {
94
+ data: number[];
95
+ borderColor: string;
96
+ backgroundColor: string;
97
+ fill: boolean;
98
+ tension: number;
99
+ pointRadius: number;
100
+ pointHoverRadius: number;
101
+ pointBackgroundColor: string;
102
+ pointBorderColor: string;
103
+ pointBorderWidth: number;
104
+ borderWidth: number;
105
+ spanGaps: boolean;
106
+ }[];
107
+ };
108
+ /** Build Chart.js data for pie/donut charts */
109
+ export declare function pieChartData(result: TqlStatsResult): {
110
+ labels: string[];
111
+ datasets: {
112
+ label: string;
113
+ data: number[];
114
+ backgroundColor: string[];
115
+ borderColor: string;
116
+ borderWidth: number;
117
+ hoverBorderColor: string;
118
+ hoverBorderWidth: number;
119
+ hoverOffset: number;
120
+ }[];
121
+ } | {
122
+ labels: string[];
123
+ datasets: {
124
+ data: number[];
125
+ backgroundColor: string[];
126
+ borderColor: string;
127
+ borderWidth: number;
128
+ hoverBorderColor: string;
129
+ hoverBorderWidth: number;
130
+ hoverOffset: number;
131
+ }[];
132
+ };
133
+ /** Build Chart.js options for bar charts */
134
+ export declare function barChartOptions(vizParams?: Record<string, unknown>, multiSeries?: boolean): {
135
+ responsive: boolean;
136
+ maintainAspectRatio: boolean;
137
+ indexAxis: "y" | "x";
138
+ animation: {
139
+ duration: number;
140
+ easing: "easeOutQuart";
141
+ };
142
+ layout: {
143
+ padding: {
144
+ top: number;
145
+ right: number;
146
+ bottom: number;
147
+ left: number;
148
+ };
149
+ };
150
+ interaction: {
151
+ mode: "index" | "nearest";
152
+ intersect: boolean;
153
+ };
154
+ plugins: {
155
+ legend: {
156
+ display: boolean;
157
+ labels: {
158
+ color: string;
159
+ font: {
160
+ size: number;
161
+ };
162
+ padding: number;
163
+ usePointStyle: boolean;
164
+ pointStyleWidth: number;
165
+ filter: ((item: {
166
+ text?: string;
167
+ }) => boolean) | undefined;
168
+ };
169
+ };
170
+ title: {
171
+ display: boolean;
172
+ text: string;
173
+ color: string;
174
+ font: {
175
+ size: number;
176
+ weight: "600";
177
+ };
178
+ padding: {
179
+ top: number;
180
+ bottom: number;
181
+ };
182
+ };
183
+ tooltip: {
184
+ enabled: boolean;
185
+ mode: "index" | "nearest";
186
+ intersect: boolean;
187
+ backgroundColor: string;
188
+ titleColor: string;
189
+ bodyColor: string;
190
+ borderColor: string;
191
+ borderWidth: number;
192
+ cornerRadius: number;
193
+ padding: number;
194
+ titleFont: {
195
+ size: number;
196
+ weight: "600";
197
+ };
198
+ bodyFont: {
199
+ size: number;
200
+ };
201
+ displayColors: boolean;
202
+ boxPadding: number;
203
+ callbacks: {
204
+ title: (items: Array<{
205
+ label: string;
206
+ }>) => string;
207
+ label: (ctx: {
208
+ dataset: {
209
+ label?: string;
210
+ };
211
+ parsed: {
212
+ y: number;
213
+ x: number;
214
+ };
215
+ formattedValue: string;
216
+ }) => string;
217
+ };
218
+ };
219
+ datalabels: {
220
+ display: boolean;
221
+ color?: undefined;
222
+ font?: undefined;
223
+ anchor?: undefined;
224
+ align?: undefined;
225
+ offset?: undefined;
226
+ formatter?: undefined;
227
+ } | {
228
+ display: string | boolean;
229
+ color: string;
230
+ font: {
231
+ size: number;
232
+ weight: "500";
233
+ };
234
+ anchor: "end";
235
+ align: "top";
236
+ offset: number;
237
+ formatter: ((value: number) => string) | undefined;
238
+ };
239
+ };
240
+ scales: {
241
+ x: {
242
+ stacked: boolean;
243
+ title: {
244
+ display: boolean;
245
+ text: string;
246
+ color: string;
247
+ font: {
248
+ size: number;
249
+ };
250
+ padding: {
251
+ top: number;
252
+ };
253
+ };
254
+ ticks: {
255
+ color: string;
256
+ font: {
257
+ size: number;
258
+ };
259
+ maxRotation: number;
260
+ autoSkip: boolean;
261
+ maxTicksLimit: number;
262
+ padding: number;
263
+ callback: ((value: number | string) => string) | undefined;
264
+ };
265
+ grid: {
266
+ color: string;
267
+ drawTicks: boolean;
268
+ };
269
+ border: {
270
+ color: string;
271
+ };
272
+ };
273
+ y: {
274
+ stacked: boolean;
275
+ beginAtZero: boolean;
276
+ min: number | undefined;
277
+ max: number | undefined;
278
+ title: {
279
+ display: boolean;
280
+ text: string;
281
+ color: string;
282
+ font: {
283
+ size: number;
284
+ };
285
+ padding: {
286
+ bottom: number;
287
+ };
288
+ };
289
+ ticks: {
290
+ stepSize?: number | undefined;
291
+ color: string;
292
+ font: {
293
+ size: number;
294
+ };
295
+ padding: number;
296
+ callback: ((value: number | string) => string) | undefined;
297
+ };
298
+ grid: {
299
+ color: string;
300
+ };
301
+ border: {
302
+ display: boolean;
303
+ };
304
+ };
305
+ };
306
+ };
307
+ /** Build Chart.js options for line/area charts */
308
+ export declare function lineChartOptions(vizParams?: Record<string, unknown>, multiSeries?: boolean): {
309
+ responsive: boolean;
310
+ maintainAspectRatio: boolean;
311
+ indexAxis: "y" | "x";
312
+ animation: {
313
+ duration: number;
314
+ easing: "easeOutQuart";
315
+ };
316
+ layout: {
317
+ padding: {
318
+ top: number;
319
+ right: number;
320
+ bottom: number;
321
+ left: number;
322
+ };
323
+ };
324
+ interaction: {
325
+ mode: "index" | "nearest";
326
+ intersect: boolean;
327
+ };
328
+ plugins: {
329
+ legend: {
330
+ display: boolean;
331
+ labels: {
332
+ color: string;
333
+ font: {
334
+ size: number;
335
+ };
336
+ padding: number;
337
+ usePointStyle: boolean;
338
+ pointStyleWidth: number;
339
+ filter: ((item: {
340
+ text?: string;
341
+ }) => boolean) | undefined;
342
+ };
343
+ };
344
+ title: {
345
+ display: boolean;
346
+ text: string;
347
+ color: string;
348
+ font: {
349
+ size: number;
350
+ weight: "600";
351
+ };
352
+ padding: {
353
+ top: number;
354
+ bottom: number;
355
+ };
356
+ };
357
+ tooltip: {
358
+ enabled: boolean;
359
+ mode: "index" | "nearest";
360
+ intersect: boolean;
361
+ backgroundColor: string;
362
+ titleColor: string;
363
+ bodyColor: string;
364
+ borderColor: string;
365
+ borderWidth: number;
366
+ cornerRadius: number;
367
+ padding: number;
368
+ titleFont: {
369
+ size: number;
370
+ weight: "600";
371
+ };
372
+ bodyFont: {
373
+ size: number;
374
+ };
375
+ displayColors: boolean;
376
+ boxPadding: number;
377
+ callbacks: {
378
+ title: (items: Array<{
379
+ label: string;
380
+ }>) => string;
381
+ label: (ctx: {
382
+ dataset: {
383
+ label?: string;
384
+ };
385
+ parsed: {
386
+ y: number;
387
+ x: number;
388
+ };
389
+ formattedValue: string;
390
+ }) => string;
391
+ };
392
+ };
393
+ datalabels: {
394
+ display: boolean;
395
+ color?: undefined;
396
+ font?: undefined;
397
+ anchor?: undefined;
398
+ align?: undefined;
399
+ offset?: undefined;
400
+ formatter?: undefined;
401
+ } | {
402
+ display: string | boolean;
403
+ color: string;
404
+ font: {
405
+ size: number;
406
+ weight: "500";
407
+ };
408
+ anchor: "end";
409
+ align: "top";
410
+ offset: number;
411
+ formatter: ((value: number) => string) | undefined;
412
+ };
413
+ };
414
+ scales: {
415
+ x: {
416
+ stacked: boolean;
417
+ title: {
418
+ display: boolean;
419
+ text: string;
420
+ color: string;
421
+ font: {
422
+ size: number;
423
+ };
424
+ padding: {
425
+ top: number;
426
+ };
427
+ };
428
+ ticks: {
429
+ color: string;
430
+ font: {
431
+ size: number;
432
+ };
433
+ maxRotation: number;
434
+ autoSkip: boolean;
435
+ maxTicksLimit: number;
436
+ padding: number;
437
+ callback: ((value: number | string) => string) | undefined;
438
+ };
439
+ grid: {
440
+ color: string;
441
+ drawTicks: boolean;
442
+ };
443
+ border: {
444
+ color: string;
445
+ };
446
+ };
447
+ y: {
448
+ stacked: boolean;
449
+ beginAtZero: boolean;
450
+ min: number | undefined;
451
+ max: number | undefined;
452
+ title: {
453
+ display: boolean;
454
+ text: string;
455
+ color: string;
456
+ font: {
457
+ size: number;
458
+ };
459
+ padding: {
460
+ bottom: number;
461
+ };
462
+ };
463
+ ticks: {
464
+ stepSize?: number | undefined;
465
+ color: string;
466
+ font: {
467
+ size: number;
468
+ };
469
+ padding: number;
470
+ callback: ((value: number | string) => string) | undefined;
471
+ };
472
+ grid: {
473
+ color: string;
474
+ };
475
+ border: {
476
+ display: boolean;
477
+ };
478
+ };
479
+ };
480
+ };
481
+ /** Build Chart.js options for pie/donut charts */
482
+ export declare function pieChartOptions(vizParams?: Record<string, unknown>, donut?: boolean, multiLevel?: boolean): {
483
+ responsive: boolean;
484
+ maintainAspectRatio: boolean;
485
+ animation: {
486
+ duration: number;
487
+ easing: "easeOutQuart";
488
+ };
489
+ cutout: string | number;
490
+ layout: {
491
+ padding: {
492
+ top: number;
493
+ right: number;
494
+ bottom: number;
495
+ left: number;
496
+ };
497
+ };
498
+ plugins: {
499
+ legend: {
500
+ display: boolean;
501
+ position: "top" | "bottom" | "left" | "right";
502
+ labels: {
503
+ color: string;
504
+ font: {
505
+ size: number;
506
+ };
507
+ padding: number;
508
+ usePointStyle: boolean;
509
+ pointStyleWidth: number;
510
+ boxHeight: number;
511
+ };
512
+ };
513
+ title: {
514
+ display: boolean;
515
+ text: string;
516
+ color: string;
517
+ font: {
518
+ size: number;
519
+ weight: "600";
520
+ };
521
+ padding: {
522
+ top: number;
523
+ bottom: number;
524
+ };
525
+ };
526
+ tooltip: {
527
+ callbacks: {
528
+ title: () => string;
529
+ label: (ctx: {
530
+ label: string;
531
+ parsed: number;
532
+ }) => string;
533
+ };
534
+ enabled: boolean;
535
+ mode: "index" | "nearest";
536
+ intersect: boolean;
537
+ backgroundColor: string;
538
+ titleColor: string;
539
+ bodyColor: string;
540
+ borderColor: string;
541
+ borderWidth: number;
542
+ cornerRadius: number;
543
+ padding: number;
544
+ titleFont: {
545
+ size: number;
546
+ weight: "600";
547
+ };
548
+ bodyFont: {
549
+ size: number;
550
+ };
551
+ displayColors: boolean;
552
+ boxPadding: number;
553
+ };
554
+ datalabels: {
555
+ display: boolean;
556
+ color?: undefined;
557
+ font?: undefined;
558
+ anchor?: undefined;
559
+ align?: undefined;
560
+ offset?: undefined;
561
+ formatter?: undefined;
562
+ } | {
563
+ display: string | boolean;
564
+ color: string;
565
+ font: {
566
+ size: number;
567
+ weight: "500";
568
+ };
569
+ anchor: "end";
570
+ align: "top";
571
+ offset: number;
572
+ formatter: ((value: number) => string) | undefined;
573
+ };
574
+ };
575
+ };
576
+ /** Map TQL viz type to Chart.js type string */
577
+ export declare function chartJsType(tqlType: string): string;
578
+ /** Build Chart.js data for any chart type */
579
+ export declare function buildChartData(result: TqlStatsResult, chartType: string): {
580
+ labels: string[];
581
+ datasets: unknown[];
582
+ };
583
+ /** Build Chart.js options for any chart type */
584
+ export declare function buildChartOptions(result: TqlStatsResult, chartType: string): {
585
+ responsive: boolean;
586
+ maintainAspectRatio: boolean;
587
+ indexAxis: "y" | "x";
588
+ animation: {
589
+ duration: number;
590
+ easing: "easeOutQuart";
591
+ };
592
+ layout: {
593
+ padding: {
594
+ top: number;
595
+ right: number;
596
+ bottom: number;
597
+ left: number;
598
+ };
599
+ };
600
+ interaction: {
601
+ mode: "index" | "nearest";
602
+ intersect: boolean;
603
+ };
604
+ plugins: {
605
+ legend: {
606
+ display: boolean;
607
+ labels: {
608
+ color: string;
609
+ font: {
610
+ size: number;
611
+ };
612
+ padding: number;
613
+ usePointStyle: boolean;
614
+ pointStyleWidth: number;
615
+ filter: ((item: {
616
+ text?: string;
617
+ }) => boolean) | undefined;
618
+ };
619
+ };
620
+ title: {
621
+ display: boolean;
622
+ text: string;
623
+ color: string;
624
+ font: {
625
+ size: number;
626
+ weight: "600";
627
+ };
628
+ padding: {
629
+ top: number;
630
+ bottom: number;
631
+ };
632
+ };
633
+ tooltip: {
634
+ enabled: boolean;
635
+ mode: "index" | "nearest";
636
+ intersect: boolean;
637
+ backgroundColor: string;
638
+ titleColor: string;
639
+ bodyColor: string;
640
+ borderColor: string;
641
+ borderWidth: number;
642
+ cornerRadius: number;
643
+ padding: number;
644
+ titleFont: {
645
+ size: number;
646
+ weight: "600";
647
+ };
648
+ bodyFont: {
649
+ size: number;
650
+ };
651
+ displayColors: boolean;
652
+ boxPadding: number;
653
+ callbacks: {
654
+ title: (items: Array<{
655
+ label: string;
656
+ }>) => string;
657
+ label: (ctx: {
658
+ dataset: {
659
+ label?: string;
660
+ };
661
+ parsed: {
662
+ y: number;
663
+ x: number;
664
+ };
665
+ formattedValue: string;
666
+ }) => string;
667
+ };
668
+ };
669
+ datalabels: {
670
+ display: boolean;
671
+ color?: undefined;
672
+ font?: undefined;
673
+ anchor?: undefined;
674
+ align?: undefined;
675
+ offset?: undefined;
676
+ formatter?: undefined;
677
+ } | {
678
+ display: string | boolean;
679
+ color: string;
680
+ font: {
681
+ size: number;
682
+ weight: "500";
683
+ };
684
+ anchor: "end";
685
+ align: "top";
686
+ offset: number;
687
+ formatter: ((value: number) => string) | undefined;
688
+ };
689
+ };
690
+ scales: {
691
+ x: {
692
+ stacked: boolean;
693
+ title: {
694
+ display: boolean;
695
+ text: string;
696
+ color: string;
697
+ font: {
698
+ size: number;
699
+ };
700
+ padding: {
701
+ top: number;
702
+ };
703
+ };
704
+ ticks: {
705
+ color: string;
706
+ font: {
707
+ size: number;
708
+ };
709
+ maxRotation: number;
710
+ autoSkip: boolean;
711
+ maxTicksLimit: number;
712
+ padding: number;
713
+ callback: ((value: number | string) => string) | undefined;
714
+ };
715
+ grid: {
716
+ color: string;
717
+ drawTicks: boolean;
718
+ };
719
+ border: {
720
+ color: string;
721
+ };
722
+ };
723
+ y: {
724
+ stacked: boolean;
725
+ beginAtZero: boolean;
726
+ min: number | undefined;
727
+ max: number | undefined;
728
+ title: {
729
+ display: boolean;
730
+ text: string;
731
+ color: string;
732
+ font: {
733
+ size: number;
734
+ };
735
+ padding: {
736
+ bottom: number;
737
+ };
738
+ };
739
+ ticks: {
740
+ stepSize?: number | undefined;
741
+ color: string;
742
+ font: {
743
+ size: number;
744
+ };
745
+ padding: number;
746
+ callback: ((value: number | string) => string) | undefined;
747
+ };
748
+ grid: {
749
+ color: string;
750
+ };
751
+ border: {
752
+ display: boolean;
753
+ };
754
+ };
755
+ };
756
+ } | {
757
+ responsive: boolean;
758
+ maintainAspectRatio: boolean;
759
+ animation: {
760
+ duration: number;
761
+ easing: "easeOutQuart";
762
+ };
763
+ cutout: string | number;
764
+ layout: {
765
+ padding: {
766
+ top: number;
767
+ right: number;
768
+ bottom: number;
769
+ left: number;
770
+ };
771
+ };
772
+ plugins: {
773
+ legend: {
774
+ display: boolean;
775
+ position: "top" | "bottom" | "left" | "right";
776
+ labels: {
777
+ color: string;
778
+ font: {
779
+ size: number;
780
+ };
781
+ padding: number;
782
+ usePointStyle: boolean;
783
+ pointStyleWidth: number;
784
+ boxHeight: number;
785
+ };
786
+ };
787
+ title: {
788
+ display: boolean;
789
+ text: string;
790
+ color: string;
791
+ font: {
792
+ size: number;
793
+ weight: "600";
794
+ };
795
+ padding: {
796
+ top: number;
797
+ bottom: number;
798
+ };
799
+ };
800
+ tooltip: {
801
+ callbacks: {
802
+ title: () => string;
803
+ label: (ctx: {
804
+ label: string;
805
+ parsed: number;
806
+ }) => string;
807
+ };
808
+ enabled: boolean;
809
+ mode: "index" | "nearest";
810
+ intersect: boolean;
811
+ backgroundColor: string;
812
+ titleColor: string;
813
+ bodyColor: string;
814
+ borderColor: string;
815
+ borderWidth: number;
816
+ cornerRadius: number;
817
+ padding: number;
818
+ titleFont: {
819
+ size: number;
820
+ weight: "600";
821
+ };
822
+ bodyFont: {
823
+ size: number;
824
+ };
825
+ displayColors: boolean;
826
+ boxPadding: number;
827
+ };
828
+ datalabels: {
829
+ display: boolean;
830
+ color?: undefined;
831
+ font?: undefined;
832
+ anchor?: undefined;
833
+ align?: undefined;
834
+ offset?: undefined;
835
+ formatter?: undefined;
836
+ } | {
837
+ display: string | boolean;
838
+ color: string;
839
+ font: {
840
+ size: number;
841
+ weight: "500";
842
+ };
843
+ anchor: "end";
844
+ align: "top";
845
+ offset: number;
846
+ formatter: ((value: number) => string) | undefined;
847
+ };
848
+ };
849
+ };