@benchkit/chart 0.1.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 +640 -0
- package/dist/ComparisonSummaryTable.test.d.ts +2 -0
- package/dist/ComparisonSummaryTable.test.d.ts.map +1 -0
- package/dist/ComparisonSummaryTable.test.js +53 -0
- package/dist/ComparisonSummaryTable.test.js.map +1 -0
- package/dist/Dashboard.d.ts +25 -0
- package/dist/Dashboard.d.ts.map +1 -0
- package/dist/Dashboard.js +87 -0
- package/dist/Dashboard.js.map +1 -0
- package/dist/Dashboard.test.d.ts +2 -0
- package/dist/Dashboard.test.d.ts.map +1 -0
- package/dist/Dashboard.test.js +49 -0
- package/dist/Dashboard.test.js.map +1 -0
- package/dist/RunDashboard.d.ts +20 -0
- package/dist/RunDashboard.d.ts.map +1 -0
- package/dist/RunDashboard.js +174 -0
- package/dist/RunDashboard.js.map +1 -0
- package/dist/RunDashboard.test.d.ts +2 -0
- package/dist/RunDashboard.test.d.ts.map +1 -0
- package/dist/RunDashboard.test.js +58 -0
- package/dist/RunDashboard.test.js.map +1 -0
- package/dist/RunDetail.d.ts +26 -0
- package/dist/RunDetail.d.ts.map +1 -0
- package/dist/RunDetail.js +100 -0
- package/dist/RunDetail.js.map +1 -0
- package/dist/RunDetail.test.d.ts +2 -0
- package/dist/RunDetail.test.d.ts.map +1 -0
- package/dist/RunDetail.test.js +168 -0
- package/dist/RunDetail.test.js.map +1 -0
- package/dist/RunSelector.test.d.ts +2 -0
- package/dist/RunSelector.test.d.ts.map +1 -0
- package/dist/RunSelector.test.js +45 -0
- package/dist/RunSelector.test.js.map +1 -0
- package/dist/SampleChart.test.d.ts +2 -0
- package/dist/SampleChart.test.d.ts.map +1 -0
- package/dist/SampleChart.test.js +48 -0
- package/dist/SampleChart.test.js.map +1 -0
- package/dist/TagFilter.test.d.ts +2 -0
- package/dist/TagFilter.test.d.ts.map +1 -0
- package/dist/TagFilter.test.js +106 -0
- package/dist/TagFilter.test.js.map +1 -0
- package/dist/VerdictBanner.test.d.ts +2 -0
- package/dist/VerdictBanner.test.d.ts.map +1 -0
- package/dist/VerdictBanner.test.js +56 -0
- package/dist/VerdictBanner.test.js.map +1 -0
- package/dist/chart-config.d.ts +100 -0
- package/dist/chart-config.d.ts.map +1 -0
- package/dist/chart-config.js +81 -0
- package/dist/chart-config.js.map +1 -0
- package/dist/colors.d.ts +11 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +16 -0
- package/dist/colors.js.map +1 -0
- package/dist/comparison-transforms.d.ts +22 -0
- package/dist/comparison-transforms.d.ts.map +1 -0
- package/dist/comparison-transforms.js +20 -0
- package/dist/comparison-transforms.js.map +1 -0
- package/dist/comparison-transforms.test.d.ts +2 -0
- package/dist/comparison-transforms.test.d.ts.map +1 -0
- package/dist/comparison-transforms.test.js +75 -0
- package/dist/comparison-transforms.test.js.map +1 -0
- package/dist/components/ComparisonBar.d.ts +13 -0
- package/dist/components/ComparisonBar.d.ts.map +1 -0
- package/dist/components/ComparisonBar.js +94 -0
- package/dist/components/ComparisonBar.js.map +1 -0
- package/dist/components/ComparisonChart.d.ts +31 -0
- package/dist/components/ComparisonChart.d.ts.map +1 -0
- package/dist/components/ComparisonChart.js +118 -0
- package/dist/components/ComparisonChart.js.map +1 -0
- package/dist/components/ComparisonSummaryTable.d.ts +29 -0
- package/dist/components/ComparisonSummaryTable.d.ts.map +1 -0
- package/dist/components/ComparisonSummaryTable.js +41 -0
- package/dist/components/ComparisonSummaryTable.js.map +1 -0
- package/dist/components/DashboardToolbar.d.ts +21 -0
- package/dist/components/DashboardToolbar.d.ts.map +1 -0
- package/dist/components/DashboardToolbar.js +14 -0
- package/dist/components/DashboardToolbar.js.map +1 -0
- package/dist/components/DateRangeFilter.d.ts +19 -0
- package/dist/components/DateRangeFilter.d.ts.map +1 -0
- package/dist/components/DateRangeFilter.js +44 -0
- package/dist/components/DateRangeFilter.js.map +1 -0
- package/dist/components/HeroSection.d.ts +12 -0
- package/dist/components/HeroSection.d.ts.map +1 -0
- package/dist/components/HeroSection.js +6 -0
- package/dist/components/HeroSection.js.map +1 -0
- package/dist/components/Leaderboard.d.ts +9 -0
- package/dist/components/Leaderboard.d.ts.map +1 -0
- package/dist/components/Leaderboard.js +41 -0
- package/dist/components/Leaderboard.js.map +1 -0
- package/dist/components/MetricCard.d.ts +16 -0
- package/dist/components/MetricCard.d.ts.map +1 -0
- package/dist/components/MetricCard.js +25 -0
- package/dist/components/MetricCard.js.map +1 -0
- package/dist/components/MetricDetailView.d.ts +15 -0
- package/dist/components/MetricDetailView.d.ts.map +1 -0
- package/dist/components/MetricDetailView.js +11 -0
- package/dist/components/MetricDetailView.js.map +1 -0
- package/dist/components/MonitorSection.d.ts +21 -0
- package/dist/components/MonitorSection.d.ts.map +1 -0
- package/dist/components/MonitorSection.js +38 -0
- package/dist/components/MonitorSection.js.map +1 -0
- package/dist/components/OverviewGrid.d.ts +17 -0
- package/dist/components/OverviewGrid.d.ts.map +1 -0
- package/dist/components/OverviewGrid.js +15 -0
- package/dist/components/OverviewGrid.js.map +1 -0
- package/dist/components/RunSelector.d.ts +20 -0
- package/dist/components/RunSelector.d.ts.map +1 -0
- package/dist/components/RunSelector.js +53 -0
- package/dist/components/RunSelector.js.map +1 -0
- package/dist/components/RunTable.d.ts +13 -0
- package/dist/components/RunTable.d.ts.map +1 -0
- package/dist/components/RunTable.js +24 -0
- package/dist/components/RunTable.js.map +1 -0
- package/dist/components/SampleChart.d.ts +21 -0
- package/dist/components/SampleChart.d.ts.map +1 -0
- package/dist/components/SampleChart.js +77 -0
- package/dist/components/SampleChart.js.map +1 -0
- package/dist/components/TagFilter.d.ts +12 -0
- package/dist/components/TagFilter.d.ts.map +1 -0
- package/dist/components/TagFilter.js +59 -0
- package/dist/components/TagFilter.js.map +1 -0
- package/dist/components/TrendChart.d.ts +25 -0
- package/dist/components/TrendChart.d.ts.map +1 -0
- package/dist/components/TrendChart.js +95 -0
- package/dist/components/TrendChart.js.map +1 -0
- package/dist/components/VerdictBanner.d.ts +13 -0
- package/dist/components/VerdictBanner.d.ts.map +1 -0
- package/dist/components/VerdictBanner.js +22 -0
- package/dist/components/VerdictBanner.js.map +1 -0
- package/dist/dashboard-labels.d.ts +47 -0
- package/dist/dashboard-labels.d.ts.map +1 -0
- package/dist/dashboard-labels.js +44 -0
- package/dist/dashboard-labels.js.map +1 -0
- package/dist/dashboard-labels.test.d.ts +2 -0
- package/dist/dashboard-labels.test.d.ts.map +1 -0
- package/dist/dashboard-labels.test.js +34 -0
- package/dist/dashboard-labels.test.js.map +1 -0
- package/dist/dataset-transforms.d.ts +41 -0
- package/dist/dataset-transforms.d.ts.map +1 -0
- package/dist/dataset-transforms.js +132 -0
- package/dist/dataset-transforms.js.map +1 -0
- package/dist/dataset-transforms.test.d.ts +2 -0
- package/dist/dataset-transforms.test.d.ts.map +1 -0
- package/dist/dataset-transforms.test.js +208 -0
- package/dist/dataset-transforms.test.js.map +1 -0
- package/dist/date-range.test.d.ts +2 -0
- package/dist/date-range.test.d.ts.map +1 -0
- package/dist/date-range.test.js +116 -0
- package/dist/date-range.test.js.map +1 -0
- package/dist/embed.d.ts +45 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/embed.js +170 -0
- package/dist/embed.js.map +1 -0
- package/dist/embed.test.d.ts +2 -0
- package/dist/embed.test.d.ts.map +1 -0
- package/dist/embed.test.js +15 -0
- package/dist/embed.test.js.map +1 -0
- package/dist/fetch.d.ts +27 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +73 -0
- package/dist/fetch.js.map +1 -0
- package/dist/fetch.test.d.ts +2 -0
- package/dist/fetch.test.d.ts.map +1 -0
- package/dist/fetch.test.js +75 -0
- package/dist/fetch.test.js.map +1 -0
- package/dist/format-utils.d.ts +48 -0
- package/dist/format-utils.d.ts.map +1 -0
- package/dist/format-utils.js +98 -0
- package/dist/format-utils.js.map +1 -0
- package/dist/format-utils.test.d.ts +2 -0
- package/dist/format-utils.test.d.ts.map +1 -0
- package/dist/format-utils.test.js +103 -0
- package/dist/format-utils.test.js.map +1 -0
- package/dist/hooks/useChartLifecycle.d.ts +20 -0
- package/dist/hooks/useChartLifecycle.d.ts.map +1 -0
- package/dist/hooks/useChartLifecycle.js +46 -0
- package/dist/hooks/useChartLifecycle.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +10 -0
- package/dist/index.test.js.map +1 -0
- package/dist/labels.d.ts +5 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +41 -0
- package/dist/labels.js.map +1 -0
- package/dist/labels.test.d.ts +2 -0
- package/dist/labels.test.d.ts.map +1 -0
- package/dist/labels.test.js +28 -0
- package/dist/labels.test.js.map +1 -0
- package/dist/leaderboard.d.ts +29 -0
- package/dist/leaderboard.d.ts.map +1 -0
- package/dist/leaderboard.js +40 -0
- package/dist/leaderboard.js.map +1 -0
- package/dist/leaderboard.test.d.ts +2 -0
- package/dist/leaderboard.test.d.ts.map +1 -0
- package/dist/leaderboard.test.js +105 -0
- package/dist/leaderboard.test.js.map +1 -0
- package/dist/sample-utils.d.ts +4 -0
- package/dist/sample-utils.d.ts.map +1 -0
- package/dist/sample-utils.js +12 -0
- package/dist/sample-utils.js.map +1 -0
- package/dist/style.css +912 -0
- package/dist/theme.d.ts +12 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +17 -0
- package/dist/theme.js.map +1 -0
- package/dist/utils.d.ts +37 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +63 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +196 -0
- package/dist/utils.test.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Chart.js configuration factories.
|
|
3
|
+
*
|
|
4
|
+
* These composable helpers eliminate duplication across TrendChart,
|
|
5
|
+
* ComparisonChart, and SampleChart while keeping chart-specific
|
|
6
|
+
* callbacks and interaction modes at the call site.
|
|
7
|
+
*/
|
|
8
|
+
import type { ChartOptions } from "chart.js";
|
|
9
|
+
import type { ChartTheme } from "./theme.js";
|
|
10
|
+
/** Tooltip visual styling shared by all line charts. */
|
|
11
|
+
export declare function sharedTooltipStyle(theme: ChartTheme): {
|
|
12
|
+
readonly backgroundColor: string;
|
|
13
|
+
readonly borderColor: string;
|
|
14
|
+
readonly borderWidth: 1;
|
|
15
|
+
readonly titleColor: string;
|
|
16
|
+
readonly bodyColor: string;
|
|
17
|
+
readonly padding: 12;
|
|
18
|
+
readonly displayColors: true;
|
|
19
|
+
};
|
|
20
|
+
/** Layout padding with optional compact mode. */
|
|
21
|
+
export declare function layoutPadding(compact?: boolean): {
|
|
22
|
+
left: number;
|
|
23
|
+
right: number;
|
|
24
|
+
top: number;
|
|
25
|
+
bottom: number;
|
|
26
|
+
};
|
|
27
|
+
/** Common responsive + hidden-legend base. */
|
|
28
|
+
export declare function baseLineOptions(): Pick<ChartOptions<"line">, "responsive" | "maintainAspectRatio">;
|
|
29
|
+
/** Common Y-axis configuration. */
|
|
30
|
+
export declare function yAxisConfig(theme: ChartTheme, opts?: {
|
|
31
|
+
title?: string;
|
|
32
|
+
showTitle?: boolean;
|
|
33
|
+
tickCallback?: (value: number | string) => string;
|
|
34
|
+
maxTicksLimit?: number;
|
|
35
|
+
}): {
|
|
36
|
+
beginAtZero: false;
|
|
37
|
+
title: {
|
|
38
|
+
display: boolean;
|
|
39
|
+
text: string;
|
|
40
|
+
color: string;
|
|
41
|
+
};
|
|
42
|
+
grid: {
|
|
43
|
+
color: string;
|
|
44
|
+
};
|
|
45
|
+
ticks: {
|
|
46
|
+
callback?: ((value: number | string) => string) | undefined;
|
|
47
|
+
color: string;
|
|
48
|
+
maxTicksLimit: number;
|
|
49
|
+
};
|
|
50
|
+
border: {
|
|
51
|
+
color: string;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
/** Time-series X-axis used by TrendChart and ComparisonChart (time mode). */
|
|
55
|
+
export declare function timeXAxis(theme: ChartTheme, opts?: {
|
|
56
|
+
maxTicksLimit?: number;
|
|
57
|
+
}): {
|
|
58
|
+
type: "time";
|
|
59
|
+
time: {
|
|
60
|
+
tooltipFormat: string;
|
|
61
|
+
};
|
|
62
|
+
grid: {
|
|
63
|
+
color: string;
|
|
64
|
+
};
|
|
65
|
+
ticks: {
|
|
66
|
+
color: string;
|
|
67
|
+
maxRotation: number;
|
|
68
|
+
autoSkipPadding: number;
|
|
69
|
+
maxTicksLimit: number;
|
|
70
|
+
};
|
|
71
|
+
border: {
|
|
72
|
+
color: string;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
/** Linear X-axis used by SampleChart and ComparisonChart (samples mode). */
|
|
76
|
+
export declare function linearXAxis(theme: ChartTheme, opts?: {
|
|
77
|
+
title?: string;
|
|
78
|
+
showTitle?: boolean;
|
|
79
|
+
maxTicksLimit?: number;
|
|
80
|
+
tickCallback?: (value: number | string) => string;
|
|
81
|
+
}): {
|
|
82
|
+
type: "linear";
|
|
83
|
+
title: {
|
|
84
|
+
display: boolean;
|
|
85
|
+
text: string;
|
|
86
|
+
color: string;
|
|
87
|
+
};
|
|
88
|
+
grid: {
|
|
89
|
+
color: string;
|
|
90
|
+
};
|
|
91
|
+
ticks: {
|
|
92
|
+
callback?: ((value: number | string) => string) | undefined;
|
|
93
|
+
color: string;
|
|
94
|
+
maxTicksLimit: number;
|
|
95
|
+
};
|
|
96
|
+
border: {
|
|
97
|
+
color: string;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=chart-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-config.d.ts","sourceRoot":"","sources":["../src/chart-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wDAAwD;AACxD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU;;;;;;;;EAUnD;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,OAAO,UAAQ;;;;;EAI5C;AAED,8CAA8C;AAC9C,wBAAgB,eAAe,IAAI,IAAI,CACrC,YAAY,CAAC,MAAM,CAAC,EACpB,YAAY,GAAG,qBAAqB,CACrC,CAEA;AAED,mCAAmC;AACnC,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;;;;;;;;;;;4BAFwB,MAAM,GAAG,MAAM,KAAK,MAAM;;;;;;;EAmBpD;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;;EAclC;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;CACnD;;;;;;;;;;;4BADwB,MAAM,GAAG,MAAM,KAAK,MAAM;;;;;;;EAkBpD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Chart.js configuration factories.
|
|
3
|
+
*
|
|
4
|
+
* These composable helpers eliminate duplication across TrendChart,
|
|
5
|
+
* ComparisonChart, and SampleChart while keeping chart-specific
|
|
6
|
+
* callbacks and interaction modes at the call site.
|
|
7
|
+
*/
|
|
8
|
+
/** Tooltip visual styling shared by all line charts. */
|
|
9
|
+
export function sharedTooltipStyle(theme) {
|
|
10
|
+
return {
|
|
11
|
+
backgroundColor: theme.tooltipBackground,
|
|
12
|
+
borderColor: theme.tooltipBorder,
|
|
13
|
+
borderWidth: 1,
|
|
14
|
+
titleColor: theme.tooltipTitle,
|
|
15
|
+
bodyColor: theme.tooltipBody,
|
|
16
|
+
padding: 12,
|
|
17
|
+
displayColors: true,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Layout padding with optional compact mode. */
|
|
21
|
+
export function layoutPadding(compact = false) {
|
|
22
|
+
return compact
|
|
23
|
+
? { left: 2, right: 6, top: 2, bottom: 0 }
|
|
24
|
+
: { left: 4, right: 8, top: 4, bottom: 2 };
|
|
25
|
+
}
|
|
26
|
+
/** Common responsive + hidden-legend base. */
|
|
27
|
+
export function baseLineOptions() {
|
|
28
|
+
return { responsive: true, maintainAspectRatio: false };
|
|
29
|
+
}
|
|
30
|
+
/** Common Y-axis configuration. */
|
|
31
|
+
export function yAxisConfig(theme, opts) {
|
|
32
|
+
return {
|
|
33
|
+
beginAtZero: false,
|
|
34
|
+
title: {
|
|
35
|
+
display: opts?.showTitle ?? false,
|
|
36
|
+
text: opts?.title ?? "",
|
|
37
|
+
color: theme.mutedText,
|
|
38
|
+
},
|
|
39
|
+
grid: { color: theme.grid },
|
|
40
|
+
ticks: {
|
|
41
|
+
color: theme.mutedText,
|
|
42
|
+
maxTicksLimit: opts?.maxTicksLimit ?? 6,
|
|
43
|
+
...(opts?.tickCallback ? { callback: opts.tickCallback } : {}),
|
|
44
|
+
},
|
|
45
|
+
border: { color: theme.border },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** Time-series X-axis used by TrendChart and ComparisonChart (time mode). */
|
|
49
|
+
export function timeXAxis(theme, opts) {
|
|
50
|
+
return {
|
|
51
|
+
type: "time",
|
|
52
|
+
time: { tooltipFormat: "PPpp" },
|
|
53
|
+
grid: { color: theme.grid },
|
|
54
|
+
ticks: {
|
|
55
|
+
color: theme.mutedText,
|
|
56
|
+
maxRotation: 0,
|
|
57
|
+
autoSkipPadding: 18,
|
|
58
|
+
maxTicksLimit: opts?.maxTicksLimit ?? 7,
|
|
59
|
+
},
|
|
60
|
+
border: { color: theme.border },
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** Linear X-axis used by SampleChart and ComparisonChart (samples mode). */
|
|
64
|
+
export function linearXAxis(theme, opts) {
|
|
65
|
+
return {
|
|
66
|
+
type: "linear",
|
|
67
|
+
title: {
|
|
68
|
+
display: opts?.showTitle ?? false,
|
|
69
|
+
text: opts?.title ?? "",
|
|
70
|
+
color: theme.mutedText,
|
|
71
|
+
},
|
|
72
|
+
grid: { color: theme.grid },
|
|
73
|
+
ticks: {
|
|
74
|
+
color: theme.mutedText,
|
|
75
|
+
maxTicksLimit: opts?.maxTicksLimit ?? 7,
|
|
76
|
+
...(opts?.tickCallback ? { callback: opts.tickCallback } : {}),
|
|
77
|
+
},
|
|
78
|
+
border: { color: theme.border },
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=chart-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-config.js","sourceRoot":"","sources":["../src/chart-config.ts"],"names":[],"mappings":"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"}
|
package/dist/colors.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Shared color palette for chart components. */
|
|
2
|
+
export declare const COLORS: string[];
|
|
3
|
+
/** Color for the base/baseline series in comparison charts (blue). */
|
|
4
|
+
export declare const BASE_COLOR = "#3b82f6";
|
|
5
|
+
/** Color for the current/PR series in comparison charts (green). */
|
|
6
|
+
export declare const CURRENT_COLOR = "#22c55e";
|
|
7
|
+
/** Background color for regression-flagged data points (red). */
|
|
8
|
+
export declare const REGRESSION_COLOR = "#ef4444";
|
|
9
|
+
/** Border color for regression-flagged data points (dark red). */
|
|
10
|
+
export declare const REGRESSION_BORDER_COLOR = "#7f1d1d";
|
|
11
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,eAAO,MAAM,MAAM,UAKlB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,UAAU,YAAY,CAAC;AAEpC,oEAAoE;AACpE,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC,iEAAiE;AACjE,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C,kEAAkE;AAClE,eAAO,MAAM,uBAAuB,YAAY,CAAC"}
|
package/dist/colors.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Shared color palette for chart components. */
|
|
2
|
+
export const COLORS = [
|
|
3
|
+
"#3b82f6", "#ef4444", "#22c55e", "#f59e0b", "#8b5cf6",
|
|
4
|
+
"#06b6d4", "#ec4899", "#14b8a6", "#f97316", "#6366f1",
|
|
5
|
+
"#84cc16", "#d946ef", "#0ea5e9", "#fb923c", "#a78bfa",
|
|
6
|
+
"#34d399", "#f472b6", "#38bdf8", "#fbbf24", "#a3e635",
|
|
7
|
+
];
|
|
8
|
+
/** Color for the base/baseline series in comparison charts (blue). */
|
|
9
|
+
export const BASE_COLOR = "#3b82f6";
|
|
10
|
+
/** Color for the current/PR series in comparison charts (green). */
|
|
11
|
+
export const CURRENT_COLOR = "#22c55e";
|
|
12
|
+
/** Background color for regression-flagged data points (red). */
|
|
13
|
+
export const REGRESSION_COLOR = "#ef4444";
|
|
14
|
+
/** Border color for regression-flagged data points (dark red). */
|
|
15
|
+
export const REGRESSION_BORDER_COLOR = "#7f1d1d";
|
|
16
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IACrD,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IACrD,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IACrD,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;CACtD,CAAC;AAEF,sEAAsE;AACtE,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AAEpC,oEAAoE;AACpE,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAE1C,kEAAkE;AAClE,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Sample } from "@benchkit/format";
|
|
2
|
+
import type { DataPoint } from "@octo11y/core";
|
|
3
|
+
/**
|
|
4
|
+
* Converts an array of intra-run samples to `{x, y}` chart points for a
|
|
5
|
+
* given metric. The x value is the elapsed time in seconds (`sample.t`).
|
|
6
|
+
*
|
|
7
|
+
* Samples that do not contain the requested metric are skipped.
|
|
8
|
+
*/
|
|
9
|
+
export declare function samplesToDataPoints(samples: Sample[], metric: string): {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
}[];
|
|
13
|
+
/**
|
|
14
|
+
* Converts an array of aggregated `DataPoint` entries to `{x, y}` chart
|
|
15
|
+
* points where x is the ISO-8601 timestamp string consumed by Chart.js's
|
|
16
|
+
* time scale.
|
|
17
|
+
*/
|
|
18
|
+
export declare function dataPointsToComparisonData(points: DataPoint[]): {
|
|
19
|
+
x: string;
|
|
20
|
+
y: number;
|
|
21
|
+
}[];
|
|
22
|
+
//# sourceMappingURL=comparison-transforms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparison-transforms.d.ts","sourceRoot":"","sources":["../src/comparison-transforms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,MAAM,GACb;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAI5B;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EAAE,GAClB;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAE5B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts an array of intra-run samples to `{x, y}` chart points for a
|
|
3
|
+
* given metric. The x value is the elapsed time in seconds (`sample.t`).
|
|
4
|
+
*
|
|
5
|
+
* Samples that do not contain the requested metric are skipped.
|
|
6
|
+
*/
|
|
7
|
+
export function samplesToDataPoints(samples, metric) {
|
|
8
|
+
return samples
|
|
9
|
+
.filter((s) => metric in s)
|
|
10
|
+
.map((s) => ({ x: s.t, y: s[metric] }));
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Converts an array of aggregated `DataPoint` entries to `{x, y}` chart
|
|
14
|
+
* points where x is the ISO-8601 timestamp string consumed by Chart.js's
|
|
15
|
+
* time scale.
|
|
16
|
+
*/
|
|
17
|
+
export function dataPointsToComparisonData(points) {
|
|
18
|
+
return points.map((p) => ({ x: p.timestamp, y: p.value }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=comparison-transforms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparison-transforms.js","sourceRoot":"","sources":["../src/comparison-transforms.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAiB,EACjB,MAAc;IAEd,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAmB;IAEnB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparison-transforms.test.d.ts","sourceRoot":"","sources":["../src/comparison-transforms.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, it } from "node:test";
|
|
2
|
+
import * as assert from "node:assert/strict";
|
|
3
|
+
import { samplesToDataPoints, dataPointsToComparisonData, } from "./comparison-transforms.js";
|
|
4
|
+
describe("samplesToDataPoints", () => {
|
|
5
|
+
it("maps sample t and metric value to x/y chart points", () => {
|
|
6
|
+
const samples = [
|
|
7
|
+
{ t: 0, eps: 100, heap_mb: 50 },
|
|
8
|
+
{ t: 1, eps: 110, heap_mb: 52 },
|
|
9
|
+
{ t: 2, eps: 120, heap_mb: 54 },
|
|
10
|
+
];
|
|
11
|
+
const result = samplesToDataPoints(samples, "eps");
|
|
12
|
+
assert.deepEqual(result, [
|
|
13
|
+
{ x: 0, y: 100 },
|
|
14
|
+
{ x: 1, y: 110 },
|
|
15
|
+
{ x: 2, y: 120 },
|
|
16
|
+
]);
|
|
17
|
+
});
|
|
18
|
+
it("skips samples that do not contain the requested metric", () => {
|
|
19
|
+
const samples = [
|
|
20
|
+
{ t: 0, eps: 100 },
|
|
21
|
+
{ t: 1 },
|
|
22
|
+
{ t: 2, eps: 120 },
|
|
23
|
+
];
|
|
24
|
+
const result = samplesToDataPoints(samples, "eps");
|
|
25
|
+
assert.deepEqual(result, [
|
|
26
|
+
{ x: 0, y: 100 },
|
|
27
|
+
{ x: 2, y: 120 },
|
|
28
|
+
]);
|
|
29
|
+
});
|
|
30
|
+
it("returns an empty array when samples is empty", () => {
|
|
31
|
+
assert.deepEqual(samplesToDataPoints([], "eps"), []);
|
|
32
|
+
});
|
|
33
|
+
it("returns an empty array when no sample contains the metric", () => {
|
|
34
|
+
const samples = [{ t: 0 }, { t: 1 }];
|
|
35
|
+
assert.deepEqual(samplesToDataPoints(samples, "missing"), []);
|
|
36
|
+
});
|
|
37
|
+
it("works with multiple metrics independently", () => {
|
|
38
|
+
const samples = [
|
|
39
|
+
{ t: 0, eps: 100, rss_mb: 200 },
|
|
40
|
+
{ t: 1, eps: 110, rss_mb: 210 },
|
|
41
|
+
];
|
|
42
|
+
assert.deepEqual(samplesToDataPoints(samples, "rss_mb"), [
|
|
43
|
+
{ x: 0, y: 200 },
|
|
44
|
+
{ x: 1, y: 210 },
|
|
45
|
+
]);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe("dataPointsToComparisonData", () => {
|
|
49
|
+
it("maps timestamp and value to x/y chart points", () => {
|
|
50
|
+
const points = [
|
|
51
|
+
{ timestamp: "2026-01-01T00:00:00Z", value: 42 },
|
|
52
|
+
{ timestamp: "2026-01-02T00:00:00Z", value: 55 },
|
|
53
|
+
];
|
|
54
|
+
const result = dataPointsToComparisonData(points);
|
|
55
|
+
assert.deepEqual(result, [
|
|
56
|
+
{ x: "2026-01-01T00:00:00Z", y: 42 },
|
|
57
|
+
{ x: "2026-01-02T00:00:00Z", y: 55 },
|
|
58
|
+
]);
|
|
59
|
+
});
|
|
60
|
+
it("returns an empty array when points is empty", () => {
|
|
61
|
+
assert.deepEqual(dataPointsToComparisonData([]), []);
|
|
62
|
+
});
|
|
63
|
+
it("preserves order of points", () => {
|
|
64
|
+
const points = [
|
|
65
|
+
{ timestamp: "2026-03-01T00:00:00Z", value: 10 },
|
|
66
|
+
{ timestamp: "2026-01-01T00:00:00Z", value: 20 },
|
|
67
|
+
{ timestamp: "2026-02-01T00:00:00Z", value: 30 },
|
|
68
|
+
];
|
|
69
|
+
const result = dataPointsToComparisonData(points);
|
|
70
|
+
assert.equal(result[0].x, "2026-03-01T00:00:00Z");
|
|
71
|
+
assert.equal(result[1].x, "2026-01-01T00:00:00Z");
|
|
72
|
+
assert.equal(result[2].x, "2026-02-01T00:00:00Z");
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=comparison-transforms.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparison-transforms.test.js","sourceRoot":"","sources":["../src/comparison-transforms.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SeriesFile, SeriesEntry } from "@benchkit/format";
|
|
2
|
+
export interface ComparisonBarProps {
|
|
3
|
+
series: SeriesFile;
|
|
4
|
+
height?: number;
|
|
5
|
+
title?: string;
|
|
6
|
+
subtitle?: string;
|
|
7
|
+
/** Custom series name renderer */
|
|
8
|
+
seriesNameFormatter?: (name: string, entry: SeriesEntry) => string;
|
|
9
|
+
showValuesList?: boolean;
|
|
10
|
+
class?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function ComparisonBar({ series, height, title, subtitle, seriesNameFormatter, showValuesList, class: className, }: ComparisonBarProps): import("preact").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=ComparisonBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComparisonBar.d.ts","sourceRoot":"","sources":["../../src/components/ComparisonBar.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMhE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,MAAM,CAAC;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,MAAY,EACZ,KAAK,EACL,QAAQ,EACR,mBAAmB,EACnB,cAAsB,EACtB,KAAK,EAAE,SAAS,GACjB,EAAE,kBAAkB,gCAwIpB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
|
|
2
|
+
import { useMemo } from "preact/hooks";
|
|
3
|
+
import { formatValue } from "../format-utils.js";
|
|
4
|
+
import { sharedTooltipStyle } from "../chart-config.js";
|
|
5
|
+
import { Chart, BarController, BarElement, CategoryScale, LinearScale, Tooltip, Legend, } from "chart.js";
|
|
6
|
+
import { COLORS } from "../colors.js";
|
|
7
|
+
import { useChartLifecycle } from "../hooks/useChartLifecycle.js";
|
|
8
|
+
Chart.register(BarController, BarElement, CategoryScale, LinearScale, Tooltip, Legend);
|
|
9
|
+
export function ComparisonBar({ series, height = 250, title, subtitle, seriesNameFormatter, showValuesList = false, class: className, }) {
|
|
10
|
+
const entries = useMemo(() => {
|
|
11
|
+
return Object.entries(series.series)
|
|
12
|
+
.map(([name, entry], idx) => {
|
|
13
|
+
const latest = entry.points[entry.points.length - 1];
|
|
14
|
+
if (!latest)
|
|
15
|
+
return null;
|
|
16
|
+
return {
|
|
17
|
+
name,
|
|
18
|
+
label: seriesNameFormatter ? seriesNameFormatter(name, entry) : name,
|
|
19
|
+
latest,
|
|
20
|
+
color: COLORS[idx % COLORS.length],
|
|
21
|
+
};
|
|
22
|
+
})
|
|
23
|
+
.filter((entry) => entry !== null);
|
|
24
|
+
}, [series, seriesNameFormatter]);
|
|
25
|
+
const { canvasRef, wrapperRef } = useChartLifecycle((theme) => {
|
|
26
|
+
if (entries.length === 0)
|
|
27
|
+
return null;
|
|
28
|
+
const names = entries.map((entry) => entry.label);
|
|
29
|
+
const values = entries.map((entry) => entry.latest.value);
|
|
30
|
+
const errors = entries.map((entry) => entry.latest.range ?? null);
|
|
31
|
+
const colors = entries.map((entry) => entry.color);
|
|
32
|
+
const options = {
|
|
33
|
+
responsive: true,
|
|
34
|
+
maintainAspectRatio: false,
|
|
35
|
+
indexAxis: names.length > 4 ? "y" : "x",
|
|
36
|
+
plugins: {
|
|
37
|
+
legend: { display: false },
|
|
38
|
+
tooltip: {
|
|
39
|
+
...sharedTooltipStyle(theme),
|
|
40
|
+
callbacks: {
|
|
41
|
+
label: (item) => {
|
|
42
|
+
const v = values[item.dataIndex];
|
|
43
|
+
const e = errors[item.dataIndex];
|
|
44
|
+
const unit = series.unit ?? "";
|
|
45
|
+
return e != null ? `${v} ± ${e} ${unit}` : `${v} ${unit}`;
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
scales: {
|
|
51
|
+
value: {
|
|
52
|
+
axis: names.length > 4 ? "x" : "y",
|
|
53
|
+
title: {
|
|
54
|
+
display: true,
|
|
55
|
+
text: series.unit ?? series.metric,
|
|
56
|
+
color: theme.mutedText,
|
|
57
|
+
},
|
|
58
|
+
beginAtZero: true,
|
|
59
|
+
grid: { color: theme.grid },
|
|
60
|
+
ticks: {
|
|
61
|
+
color: theme.mutedText,
|
|
62
|
+
callback: (value) => formatValue(Number(value)),
|
|
63
|
+
},
|
|
64
|
+
border: { color: theme.border },
|
|
65
|
+
},
|
|
66
|
+
label: {
|
|
67
|
+
axis: names.length > 4 ? "y" : "x",
|
|
68
|
+
grid: { display: false },
|
|
69
|
+
ticks: { color: theme.mutedText },
|
|
70
|
+
border: { color: theme.border },
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
return {
|
|
75
|
+
type: "bar",
|
|
76
|
+
data: {
|
|
77
|
+
labels: names,
|
|
78
|
+
datasets: [
|
|
79
|
+
{
|
|
80
|
+
data: values,
|
|
81
|
+
backgroundColor: colors.map((c) => c + "80"),
|
|
82
|
+
borderColor: colors,
|
|
83
|
+
borderWidth: 1.5,
|
|
84
|
+
borderRadius: 8,
|
|
85
|
+
clip: 8,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
options,
|
|
90
|
+
};
|
|
91
|
+
}, [entries, series.metric, series.unit]);
|
|
92
|
+
return (_jsxs("div", { ref: wrapperRef, class: ["bk-chart-panel", className].filter(Boolean).join(" "), children: [(title || subtitle) && (_jsx("div", { class: "bk-chart-panel__header", children: _jsxs("div", { children: [title && _jsx("h3", { class: "bk-chart-panel__title", children: title }), subtitle && _jsx("p", { class: "bk-chart-panel__subtitle", children: subtitle })] }) })), _jsx("div", { class: "bk-chart-panel__canvas", style: { height: `${height}px` }, children: entries.length === 0 ? (_jsx("div", { class: "bk-chart-panel__empty", children: _jsxs("div", { children: [_jsx("strong", { children: "No latest values available." }), _jsx("div", { children: "The selected metric has no visible series after filtering." })] }) })) : (_jsxs("canvas", { ref: canvasRef, role: "img", "aria-label": title ?? `Latest comparison for ${series.metric}`, children: ["Latest comparison for ", title ?? series.metric] })) }), showValuesList && entries.length > 0 && (_jsx("div", { class: "bk-list", children: entries.map((entry) => (_jsxs("div", { class: "bk-list__row", children: [_jsxs("span", { class: "bk-chart-legend__item", title: entry.label, children: [_jsx("span", { class: "bk-chart-legend__swatch", style: { background: entry.color } }), _jsx("span", { class: "bk-chart-legend__label", children: entry.label })] }), _jsxs("span", { class: "bk-list__value", children: [formatValue(entry.latest.value), " ", series.unit ?? ""] })] }, entry.name))) }))] }));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=ComparisonBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComparisonBar.js","sourceRoot":"","sources":["../../src/components/ComparisonBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,KAAK,EACL,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,EACX,OAAO,EACP,MAAM,GAEP,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAavF,MAAM,UAAU,aAAa,CAAC,EAC5B,MAAM,EACN,MAAM,GAAG,GAAG,EACZ,KAAK,EACL,QAAQ,EACR,mBAAmB,EACnB,cAAc,GAAG,KAAK,EACtB,KAAK,EAAE,SAAS,GACG;IACnB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO;gBACL,IAAI;gBACJ,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;gBACpE,MAAM;gBACN,KAAK,EAAE,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;aACnC,CAAC;QACJ,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,KAAK,EAAsC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAC3E,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAElC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,iBAAiB,CACjD,CAAC,KAAK,EAAE,EAAE;QACR,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAwB;YACnC,UAAU,EAAE,IAAI;YAChB,mBAAmB,EAAE,KAAK;YAC1B,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YACvC,OAAO,EAAE;gBACP,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC1B,OAAO,EAAE;oBACP,GAAG,kBAAkB,CAAC,KAAK,CAAC;oBAC5B,SAAS,EAAE;wBACT,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;4BACd,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BACjC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;4BAC/B,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;wBAC5D,CAAC;qBACF;iBACF;aACF;YACD,MAAM,EAAE;gBACN,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;oBAClC,KAAK,EAAE;wBACL,OAAO,EAAE,IAAI;wBACb,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM;wBAClC,KAAK,EAAE,KAAK,CAAC,SAAS;qBACvB;oBACD,WAAW,EAAE,IAAI;oBACjB,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;oBAC3B,KAAK,EAAE;wBACL,KAAK,EAAE,KAAK,CAAC,SAAS;wBACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;qBAChD;oBACD,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE;iBAChC;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;oBAClC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;oBACxB,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE;oBACjC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE;iBAChC;aACF;SACF,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,KAAc;YACpB,IAAI,EAAE;gBACJ,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;wBAC5C,WAAW,EAAE,MAAM;wBACnB,WAAW,EAAE,GAAG;wBAChB,YAAY,EAAE,CAAC;wBACf,IAAI,EAAE,CAAC;qBACR;iBACF;aACF;YACD,OAAO;SACR,CAAC;IACJ,CAAC,EACD,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CACtC,CAAC;IAEF,OAAO,CACL,eAAK,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aACjF,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CACtB,cAAK,KAAK,EAAC,wBAAwB,YACjC,0BACG,KAAK,IAAI,aAAI,KAAK,EAAC,uBAAuB,YAAE,KAAK,GAAM,EACvD,QAAQ,IAAI,YAAG,KAAK,EAAC,0BAA0B,YAAE,QAAQ,GAAK,IAC3D,GACF,CACP,EAED,cAAK,KAAK,EAAC,wBAAwB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,EAAE,YACjE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,cAAK,KAAK,EAAC,uBAAuB,YAChC,0BACE,2DAA4C,EAC5C,uFAAqE,IACjE,GACF,CACP,CAAC,CAAC,CAAC,CACF,kBACE,GAAG,EAAE,SAAS,EACd,IAAI,EAAC,KAAK,gBACE,KAAK,IAAI,yBAAyB,MAAM,CAAC,MAAM,EAAE,uCAEtC,KAAK,IAAI,MAAM,CAAC,MAAM,IACtC,CACV,GACG,EAEL,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACvC,cAAK,KAAK,EAAC,SAAS,YACjB,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACtB,eAAsB,KAAK,EAAC,cAAc,aACxC,gBAAM,KAAK,EAAC,uBAAuB,EAAC,KAAK,EAAE,KAAK,CAAC,KAAK,aACpD,eAAM,KAAK,EAAC,yBAAyB,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,GAAI,EAC5E,eAAM,KAAK,EAAC,wBAAwB,YAAE,KAAK,CAAC,KAAK,GAAQ,IACpD,EACP,gBAAM,KAAK,EAAC,gBAAgB,aACzB,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAG,MAAM,CAAC,IAAI,IAAI,EAAE,IAC/C,KAPC,KAAK,CAAC,IAAI,CAQd,CACP,CAAC,GACE,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import "chartjs-adapter-date-fns";
|
|
2
|
+
import type { Sample, DataPoint } from "@benchkit/format";
|
|
3
|
+
/** Base (blue) and current/PR (green) — matching the beats-bench convention. */
|
|
4
|
+
export interface ComparisonChartProps {
|
|
5
|
+
/** Metric name used to extract values from `Sample[]` data and shown on the y-axis. */
|
|
6
|
+
metric: string;
|
|
7
|
+
unit?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Intra-run time-series mode: pass `Sample[]` arrays.
|
|
10
|
+
* The x-axis uses elapsed seconds (`sample.t`).
|
|
11
|
+
*/
|
|
12
|
+
baseSamples?: Sample[];
|
|
13
|
+
currentSamples?: Sample[];
|
|
14
|
+
/**
|
|
15
|
+
* Cross-run aggregated mode: pass `DataPoint[]` arrays.
|
|
16
|
+
* The x-axis uses ISO-8601 timestamps.
|
|
17
|
+
*/
|
|
18
|
+
basePoints?: DataPoint[];
|
|
19
|
+
currentPoints?: DataPoint[];
|
|
20
|
+
/** Label for the base/baseline trace. Defaults to "Base". */
|
|
21
|
+
baseLabel?: string;
|
|
22
|
+
/** Label for the current/PR trace. Defaults to "Current". */
|
|
23
|
+
currentLabel?: string;
|
|
24
|
+
height?: number;
|
|
25
|
+
title?: string;
|
|
26
|
+
subtitle?: string;
|
|
27
|
+
/** CSS class name */
|
|
28
|
+
class?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function ComparisonChart({ metric, unit, baseSamples, currentSamples, basePoints, currentPoints, baseLabel, currentLabel, height, title, subtitle, class: className, }: ComparisonChartProps): import("preact").JSX.Element;
|
|
31
|
+
//# sourceMappingURL=ComparisonChart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComparisonChart.d.ts","sourceRoot":"","sources":["../../src/components/ComparisonChart.tsx"],"names":[],"mappings":"AAuBA,OAAO,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAiB1D,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,uFAAuF;IACvF,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;IAE5B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,IAAI,EACJ,WAAW,EACX,cAAc,EACd,UAAU,EACV,aAAa,EACb,SAAkB,EAClB,YAAwB,EACxB,MAAY,EACZ,KAAK,EACL,QAAQ,EACR,KAAK,EAAE,SAAS,GACjB,EAAE,oBAAoB,gCA4JtB"}
|