@schemavaults/ui 0.78.3 → 0.79.2
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/dist/components/ui/index.d.ts +2 -0
- package/dist/components/ui/index.js +1 -0
- package/dist/components/ui/index.js.map +1 -1
- package/dist/components/ui/line-chart/index.d.ts +3 -0
- package/dist/components/ui/line-chart/index.js +3 -0
- package/dist/components/ui/line-chart/index.js.map +1 -0
- package/dist/components/ui/line-chart/line-chart.d.ts +167 -0
- package/dist/components/ui/line-chart/line-chart.js +404 -0
- package/dist/components/ui/line-chart/line-chart.js.map +1 -0
- package/package.json +1 -1
|
@@ -178,6 +178,8 @@ export * from "./pie-chart";
|
|
|
178
178
|
export type * from "./pie-chart";
|
|
179
179
|
export * from "./bar-chart";
|
|
180
180
|
export type * from "./bar-chart";
|
|
181
|
+
export * from "./line-chart";
|
|
182
|
+
export type * from "./line-chart";
|
|
181
183
|
export * from "./comparison-slider";
|
|
182
184
|
export type * from "./comparison-slider";
|
|
183
185
|
export * from "./theme-selector";
|
|
@@ -88,6 +88,7 @@ export * from "./color-swatch";
|
|
|
88
88
|
export * from "./calendar-heatmap";
|
|
89
89
|
export * from "./pie-chart";
|
|
90
90
|
export * from "./bar-chart";
|
|
91
|
+
export * from "./line-chart";
|
|
91
92
|
export * from "./comparison-slider";
|
|
92
93
|
export * from "./theme-selector";
|
|
93
94
|
export * from "./tree-view";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AAGzB,cAAc,uBAAuB,CAAC;AAGtC,cAAc,aAAa,CAAC;AAG5B,cAAc,eAAe,CAAC;AAG9B,cAAc,SAAS,CAAC;AAGxB,cAAc,WAAW,CAAC;AAG1B,cAAc,cAAc,CAAC;AAG7B,cAAc,SAAS,CAAC;AAGxB,cAAc,mBAAmB,CAAC;AAGlC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,UAAU,CAAC;AAGzB,cAAc,SAAS,CAAC;AAGxB,cAAc,kBAAkB,CAAC;AAGjC,cAAc,aAAa,CAAC;AAG5B,cAAc,kCAAkC,CAAC;AAGjD,cAAc,cAAc,CAAC;AAG7B,cAAc,SAAS,CAAC;AAGxB,cAAc,SAAS,CAAC;AAExB,cAAc,WAAW,CAAC;AAG1B,cAAc,YAAY,CAAC;AAG3B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,QAAQ,CAAC;AAGvB,cAAc,QAAQ,CAAC;AAGvB,cAAc,aAAa,CAAC;AAG5B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,WAAW,CAAC;AAG1B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,UAAU,CAAC;AAGzB,cAAc,gBAAgB,CAAC;AAG/B,cAAc,WAAW,CAAC;AAG1B,cAAc,WAAW,CAAC;AAG1B,cAAc,YAAY,CAAC;AAG3B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,SAAS,CAAC;AAGxB,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC;AAG3B,cAAc,YAAY,CAAC;AAG3B,cAAc,cAAc,CAAC;AAG7B,cAAc,eAAe,CAAC;AAG9B,cAAc,YAAY,CAAC;AAG3B,cAAc,2BAA2B,CAAC;AAG1C,cAAc,oBAAoB,CAAC;AAGnC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,eAAe,CAAC;AAG9B,cAAc,WAAW,CAAC;AAG1B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,cAAc,CAAC;AAG7B,cAAc,SAAS,CAAC;AAGxB,cAAc,UAAU,CAAC;AAGzB,cAAc,eAAe,CAAC;AAG9B,cAAc,qBAAqB,CAAC;AAGpC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,QAAQ,CAAC;AAGvB,cAAc,QAAQ,CAAC;AAGvB,cAAc,UAAU,CAAC;AAGzB,cAAc,UAAU,CAAC;AAGzB,cAAc,gBAAgB,CAAC;AAG/B,cAAc,qBAAqB,CAAC;AAGpC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,SAAS,CAAC;AAGxB,cAAc,cAAc,CAAC;AAG7B,cAAc,cAAc,CAAC;AAG7B,cAAc,OAAO,CAAC;AAGtB,cAAc,eAAe,CAAC;AAG9B,cAAc,WAAW,CAAC;AAG1B,cAAc,UAAU,CAAC;AAGzB,cAAc,eAAe,CAAC;AAG9B,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC;AAG3B,cAAc,UAAU,CAAC;AAGzB,cAAc,gBAAgB,CAAC;AAG/B,cAAc,cAAc,CAAC;AAG7B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,eAAe,CAAC;AAG9B,cAAc,eAAe,CAAC;AAG9B,cAAc,qBAAqB,CAAC;AAGpC,cAAc,WAAW,CAAC;AAG1B,cAAc,UAAU,CAAC;AAGzB,cAAc,QAAQ,CAAC;AAGvB,cAAc,cAAc,CAAC;AAG7B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,aAAa,CAAC;AAG5B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,aAAa,CAAC;AAG5B,cAAc,aAAa,CAAC;AAG5B,cAAc,qBAAqB,CAAC;AAGpC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC;AAG3B,cAAc,aAAa,CAAC;AAG5B,cAAc,0BAA0B,CAAC;AAGzC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,YAAY,CAAC;AAG3B,cAAc,eAAe,CAAC;AAG9B,cAAc,qBAAqB,CAAC;AAGpC,cAAc,eAAe,CAAC;AAG9B,cAAc,QAAQ,CAAC;AAGvB,cAAc,qBAAqB,CAAC;AAGpC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ui/line-chart/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import type { HTMLAttributes, KeyboardEvent, MouseEvent, ReactElement, ReactNode, Ref } from "react";
|
|
3
|
+
export declare const lineChartSizeIds: ["sm", "md", "lg", "xl"];
|
|
4
|
+
export type LineChartSizeId = (typeof lineChartSizeIds)[number];
|
|
5
|
+
export declare const lineChartColorIds: ["default", "primary", "positive", "warning", "destructive", "muted"];
|
|
6
|
+
export type LineChartColorId = (typeof lineChartColorIds)[number];
|
|
7
|
+
export declare const lineChartCurveIds: ["linear", "smooth"];
|
|
8
|
+
export type LineChartCurveId = (typeof lineChartCurveIds)[number];
|
|
9
|
+
export declare const lineChartVariants: (props?: ({
|
|
10
|
+
size?: "sm" | "lg" | "xl" | "md" | null | undefined;
|
|
11
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
12
|
+
export interface LineChartPoint {
|
|
13
|
+
/**
|
|
14
|
+
* Optional explicit x-coordinate in domain units. When omitted, the point's
|
|
15
|
+
* index in the series is used (categorical mode).
|
|
16
|
+
*/
|
|
17
|
+
x?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Y value. Non-finite values (NaN / Infinity) create a gap in the line and
|
|
20
|
+
* are not rendered as point markers.
|
|
21
|
+
*/
|
|
22
|
+
y: number;
|
|
23
|
+
/** Human-readable label for the point (used in aria-labels and tooltips). */
|
|
24
|
+
label?: string;
|
|
25
|
+
/** Stable identifier for the point. Defaults to the index. */
|
|
26
|
+
id?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface LineChartSeries {
|
|
29
|
+
/** Stable identifier for the series. Used as React key and click payload. */
|
|
30
|
+
id: string;
|
|
31
|
+
/** Display name for the series. */
|
|
32
|
+
label?: string;
|
|
33
|
+
/** Points in plot order. */
|
|
34
|
+
points: ReadonlyArray<LineChartPoint>;
|
|
35
|
+
/** Preset color id from the chart palette. Ignored if `stroke` is provided. */
|
|
36
|
+
color?: LineChartColorId;
|
|
37
|
+
/**
|
|
38
|
+
* Override the stroke with a raw CSS color (e.g. `"#ff0080"` or
|
|
39
|
+
* `"hsl(var(--chart-1))"`). Takes precedence over `color`.
|
|
40
|
+
*/
|
|
41
|
+
stroke?: string;
|
|
42
|
+
/** Fill the area between this series' line and the baseline. */
|
|
43
|
+
area?: boolean;
|
|
44
|
+
/** Override the chart-level `curve` for this series. */
|
|
45
|
+
curve?: LineChartCurveId;
|
|
46
|
+
/** Override the chart-level `showPoints` for this series. */
|
|
47
|
+
showPoints?: boolean;
|
|
48
|
+
/** Stroke dash pattern, e.g. `"4 3"`. Defaults to a solid line. */
|
|
49
|
+
strokeDasharray?: string;
|
|
50
|
+
/** Stroke width in user units. Defaults to 2. */
|
|
51
|
+
strokeWidth?: number;
|
|
52
|
+
/** Extra classes applied to this series' line path. */
|
|
53
|
+
className?: string;
|
|
54
|
+
/** Fired when a point in this series is clicked or activated via keyboard. */
|
|
55
|
+
onPointClick?: (point: LineChartPoint, series: LineChartSeries, event: MouseEvent<SVGCircleElement> | KeyboardEvent<SVGCircleElement>) => void;
|
|
56
|
+
}
|
|
57
|
+
export interface LineChartValueLabelContext {
|
|
58
|
+
series: LineChartSeries;
|
|
59
|
+
point: LineChartPoint;
|
|
60
|
+
value: number;
|
|
61
|
+
index: number;
|
|
62
|
+
}
|
|
63
|
+
export interface LineChartProps extends Omit<HTMLAttributes<HTMLDivElement>, "onClick">, VariantProps<typeof lineChartVariants> {
|
|
64
|
+
/** Series to render, in order (later series are drawn on top). */
|
|
65
|
+
series: ReadonlyArray<LineChartSeries>;
|
|
66
|
+
/** Accessible label describing what the chart represents. */
|
|
67
|
+
label: string;
|
|
68
|
+
/**
|
|
69
|
+
* Override the rendered canvas width in pixels (defaults are size-aware).
|
|
70
|
+
*/
|
|
71
|
+
width?: number;
|
|
72
|
+
/**
|
|
73
|
+
* Override the rendered canvas height in pixels (defaults are size-aware).
|
|
74
|
+
*/
|
|
75
|
+
height?: number;
|
|
76
|
+
/** Lower bound of the y-axis. Defaults to the smallest value across series. */
|
|
77
|
+
yMin?: number;
|
|
78
|
+
/** Upper bound of the y-axis. Defaults to the largest value across series. */
|
|
79
|
+
yMax?: number;
|
|
80
|
+
/** Lower bound of the x-axis (numeric mode). Defaults to the smallest x. */
|
|
81
|
+
xMin?: number;
|
|
82
|
+
/** Upper bound of the x-axis (numeric mode). Defaults to the largest x. */
|
|
83
|
+
xMax?: number;
|
|
84
|
+
/** Default interpolation for every series. Defaults to `"linear"`. */
|
|
85
|
+
curve?: LineChartCurveId;
|
|
86
|
+
/** Render point markers for every series. Defaults to `false`. */
|
|
87
|
+
showPoints?: boolean;
|
|
88
|
+
/** Render the baseline / left-axis lines. Defaults to `true`. */
|
|
89
|
+
showAxis?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Number of evenly-spaced horizontal gridlines drawn across the value axis.
|
|
92
|
+
* `0` disables gridlines. Defaults to `0`.
|
|
93
|
+
*/
|
|
94
|
+
gridLineCount?: number;
|
|
95
|
+
/**
|
|
96
|
+
* Optional x-axis tick labels indexed by point position. When the chart is
|
|
97
|
+
* in categorical mode (no explicit `x` on points), labels are shown at each
|
|
98
|
+
* index. Pass `null` for an entry to skip it.
|
|
99
|
+
*/
|
|
100
|
+
categories?: ReadonlyArray<string | null>;
|
|
101
|
+
/**
|
|
102
|
+
* Format an x-tick label from its numeric value. Used when explicit numeric
|
|
103
|
+
* x-values are provided on points. Return `null` to skip the tick.
|
|
104
|
+
*/
|
|
105
|
+
xTickFormatter?: (x: number, index: number) => string | null;
|
|
106
|
+
/**
|
|
107
|
+
* Number of evenly-spaced x-axis ticks to render when `xTickFormatter` is
|
|
108
|
+
* provided. Defaults to `5`.
|
|
109
|
+
*/
|
|
110
|
+
xTickCount?: number;
|
|
111
|
+
/**
|
|
112
|
+
* Format a y-axis tick label from its numeric value. When provided, tick
|
|
113
|
+
* labels are rendered to the left of the y-axis and a left gutter is
|
|
114
|
+
* reserved automatically. Return `null` to skip a tick. The default
|
|
115
|
+
* formatter (when `showYAxisLabels` is `true` without a custom formatter)
|
|
116
|
+
* renders the raw value.
|
|
117
|
+
*/
|
|
118
|
+
yTickFormatter?: (y: number, index: number) => string | null;
|
|
119
|
+
/**
|
|
120
|
+
* Number of evenly-spaced y-axis ticks. Ticks include both endpoints
|
|
121
|
+
* (`yMin` and `yMax`). Defaults to `5`. Has no effect unless
|
|
122
|
+
* `yTickFormatter` is provided or `showYAxisLabels` is `true`.
|
|
123
|
+
*/
|
|
124
|
+
yTickCount?: number;
|
|
125
|
+
/**
|
|
126
|
+
* Render y-axis tick labels using a default raw-value formatter. Useful as
|
|
127
|
+
* a one-line opt-in when you don't need a custom formatter. Defaults to
|
|
128
|
+
* `false`. Ignored when `yTickFormatter` is provided.
|
|
129
|
+
*/
|
|
130
|
+
showYAxisLabels?: boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Width in pixels reserved for y-axis tick labels (the left gutter).
|
|
133
|
+
* Defaults to `36`. Only applied when y-axis labels are visible.
|
|
134
|
+
*/
|
|
135
|
+
yTickLabelWidth?: number;
|
|
136
|
+
/** Render a value label above every point. Defaults to `false`. */
|
|
137
|
+
showValueLabels?: boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Customize the value-label text. Return `null` to skip a point. Defaults
|
|
140
|
+
* to the raw value (`String(value)`).
|
|
141
|
+
*/
|
|
142
|
+
valueLabelFormatter?: (context: LineChartValueLabelContext) => string | null;
|
|
143
|
+
/**
|
|
144
|
+
* Fallback handler invoked for any point that doesn't have its own series-
|
|
145
|
+
* level `onPointClick`. Receives the clicked point and its series.
|
|
146
|
+
*/
|
|
147
|
+
onPointClick?: (point: LineChartPoint, series: LineChartSeries, event: MouseEvent<SVGCircleElement> | KeyboardEvent<SVGCircleElement>) => void;
|
|
148
|
+
/** Optional content overlaid on top of the plot area. */
|
|
149
|
+
children?: ReactNode;
|
|
150
|
+
/** Extra classes for the overlay content wrapper. */
|
|
151
|
+
overlayClassName?: string;
|
|
152
|
+
/** Extra classes applied to every value-label `<text>` element. */
|
|
153
|
+
valueLabelClassName?: string;
|
|
154
|
+
/** Extra classes applied to every x-axis tick `<text>` element. */
|
|
155
|
+
categoryLabelClassName?: string;
|
|
156
|
+
/** Extra classes applied to every y-axis tick `<text>` element. */
|
|
157
|
+
yAxisLabelClassName?: string;
|
|
158
|
+
/** Extra classes applied to the axis / gridline `<line>` elements. */
|
|
159
|
+
axisClassName?: string;
|
|
160
|
+
/** Optional ref forwarded to the wrapper element. */
|
|
161
|
+
ref?: Ref<HTMLDivElement>;
|
|
162
|
+
}
|
|
163
|
+
declare function LineChart({ series, label, size, width, height, yMin, yMax, xMin, xMax, curve, showPoints, showAxis, gridLineCount, categories, xTickFormatter, xTickCount, yTickFormatter, yTickCount, showYAxisLabels, yTickLabelWidth, showValueLabels, valueLabelFormatter, onPointClick, children, className, overlayClassName, valueLabelClassName, categoryLabelClassName, yAxisLabelClassName, axisClassName, ref, ...props }: LineChartProps): ReactElement;
|
|
164
|
+
declare namespace LineChart {
|
|
165
|
+
var displayName: string;
|
|
166
|
+
}
|
|
167
|
+
export { LineChart };
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import { useId } from "react";
|
|
5
|
+
import { cn } from "../../../lib/utils";
|
|
6
|
+
export const lineChartSizeIds = [
|
|
7
|
+
"sm",
|
|
8
|
+
"md",
|
|
9
|
+
"lg",
|
|
10
|
+
"xl",
|
|
11
|
+
];
|
|
12
|
+
export const lineChartColorIds = [
|
|
13
|
+
"default",
|
|
14
|
+
"primary",
|
|
15
|
+
"positive",
|
|
16
|
+
"warning",
|
|
17
|
+
"destructive",
|
|
18
|
+
"muted",
|
|
19
|
+
];
|
|
20
|
+
export const lineChartCurveIds = ["linear", "smooth"];
|
|
21
|
+
/** Default canvas dimensions per size. Either axis can be overridden via the
|
|
22
|
+
* `width` / `height` props. */
|
|
23
|
+
const SIZE_TO_CANVAS = {
|
|
24
|
+
sm: { width: 240, height: 140 },
|
|
25
|
+
md: { width: 360, height: 200 },
|
|
26
|
+
lg: { width: 480, height: 260 },
|
|
27
|
+
xl: { width: 640, height: 340 },
|
|
28
|
+
};
|
|
29
|
+
const STROKE_CLASSES = {
|
|
30
|
+
default: "stroke-schemavaults-brand-blue",
|
|
31
|
+
primary: "stroke-primary",
|
|
32
|
+
positive: "stroke-emerald-500 dark:stroke-emerald-400",
|
|
33
|
+
warning: "stroke-warning",
|
|
34
|
+
destructive: "stroke-destructive",
|
|
35
|
+
muted: "stroke-muted-foreground",
|
|
36
|
+
};
|
|
37
|
+
const FILL_CLASSES = {
|
|
38
|
+
default: "fill-schemavaults-brand-blue",
|
|
39
|
+
primary: "fill-primary",
|
|
40
|
+
positive: "fill-emerald-500 dark:fill-emerald-400",
|
|
41
|
+
warning: "fill-warning",
|
|
42
|
+
destructive: "fill-destructive",
|
|
43
|
+
muted: "fill-muted-foreground",
|
|
44
|
+
};
|
|
45
|
+
const TEXT_CLASSES = {
|
|
46
|
+
default: "text-schemavaults-brand-blue",
|
|
47
|
+
primary: "text-primary",
|
|
48
|
+
positive: "text-emerald-500 dark:text-emerald-400",
|
|
49
|
+
warning: "text-warning",
|
|
50
|
+
destructive: "text-destructive",
|
|
51
|
+
muted: "text-muted-foreground",
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Fallback color rotation when a series doesn't specify its own color. Index
|
|
55
|
+
* is the series position in the input array, modulo the palette length.
|
|
56
|
+
*/
|
|
57
|
+
const DEFAULT_COLOR_ROTATION = [
|
|
58
|
+
"default",
|
|
59
|
+
"positive",
|
|
60
|
+
"warning",
|
|
61
|
+
"destructive",
|
|
62
|
+
"primary",
|
|
63
|
+
"muted",
|
|
64
|
+
];
|
|
65
|
+
export const lineChartVariants = cva("relative inline-flex shrink-0 items-center justify-center", {
|
|
66
|
+
variants: {
|
|
67
|
+
size: {
|
|
68
|
+
sm: "text-[10px]",
|
|
69
|
+
md: "text-[11px]",
|
|
70
|
+
lg: "text-xs",
|
|
71
|
+
xl: "text-sm",
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
defaultVariants: {
|
|
75
|
+
size: "md",
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
function isFiniteNumber(value) {
|
|
79
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
80
|
+
}
|
|
81
|
+
function buildLinePath(points) {
|
|
82
|
+
// Skip gaps by breaking the path into separate sub-paths.
|
|
83
|
+
let d = "";
|
|
84
|
+
let needMove = true;
|
|
85
|
+
for (const p of points) {
|
|
86
|
+
if (p.isGap) {
|
|
87
|
+
needMove = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (needMove) {
|
|
91
|
+
d += `${d ? " " : ""}M ${p.x.toFixed(2)} ${p.y.toFixed(2)}`;
|
|
92
|
+
needMove = false;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
d += ` L ${p.x.toFixed(2)} ${p.y.toFixed(2)}`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return d;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Catmull-Rom-to-Bezier smoothing. Produces a path that passes through every
|
|
102
|
+
* non-gap point with no overshoot beyond the data range.
|
|
103
|
+
*/
|
|
104
|
+
function buildSmoothPath(points) {
|
|
105
|
+
// Smooth across contiguous runs of non-gap points.
|
|
106
|
+
const segments = [];
|
|
107
|
+
let current = [];
|
|
108
|
+
for (const p of points) {
|
|
109
|
+
if (p.isGap) {
|
|
110
|
+
if (current.length > 0)
|
|
111
|
+
segments.push(current);
|
|
112
|
+
current = [];
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
current.push(p);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (current.length > 0)
|
|
119
|
+
segments.push(current);
|
|
120
|
+
const tension = 0.5;
|
|
121
|
+
let d = "";
|
|
122
|
+
for (const seg of segments) {
|
|
123
|
+
if (seg.length === 0)
|
|
124
|
+
continue;
|
|
125
|
+
if (seg.length === 1) {
|
|
126
|
+
const p = seg[0];
|
|
127
|
+
d += `${d ? " " : ""}M ${p.x.toFixed(2)} ${p.y.toFixed(2)}`;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const first = seg[0];
|
|
131
|
+
d += `${d ? " " : ""}M ${first.x.toFixed(2)} ${first.y.toFixed(2)}`;
|
|
132
|
+
for (let i = 0; i < seg.length - 1; i += 1) {
|
|
133
|
+
const p0 = seg[i === 0 ? 0 : i - 1];
|
|
134
|
+
const p1 = seg[i];
|
|
135
|
+
const p2 = seg[i + 1];
|
|
136
|
+
const p3 = seg[i + 2 < seg.length ? i + 2 : i + 1];
|
|
137
|
+
const c1x = p1.x + ((p2.x - p0.x) / 6) * tension * 2;
|
|
138
|
+
const c1y = p1.y + ((p2.y - p0.y) / 6) * tension * 2;
|
|
139
|
+
const c2x = p2.x - ((p3.x - p1.x) / 6) * tension * 2;
|
|
140
|
+
const c2y = p2.y - ((p3.y - p1.y) / 6) * tension * 2;
|
|
141
|
+
d += ` C ${c1x.toFixed(2)} ${c1y.toFixed(2)}, ${c2x.toFixed(2)} ${c2y.toFixed(2)}, ${p2.x.toFixed(2)} ${p2.y.toFixed(2)}`;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return d;
|
|
145
|
+
}
|
|
146
|
+
function buildAreaPath(linePath, points, baselineY) {
|
|
147
|
+
if (linePath === "")
|
|
148
|
+
return "";
|
|
149
|
+
// Close each sub-path of the line back down to the baseline.
|
|
150
|
+
const segments = [];
|
|
151
|
+
let current = [];
|
|
152
|
+
for (const p of points) {
|
|
153
|
+
if (p.isGap) {
|
|
154
|
+
if (current.length > 0)
|
|
155
|
+
segments.push(current);
|
|
156
|
+
current = [];
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
current.push(p);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (current.length > 0)
|
|
163
|
+
segments.push(current);
|
|
164
|
+
// Strategy: re-emit the line path per segment and close it. This keeps the
|
|
165
|
+
// smoothing/segmentation logic in one place (the original line builder).
|
|
166
|
+
let d = "";
|
|
167
|
+
for (const seg of segments) {
|
|
168
|
+
if (seg.length === 0)
|
|
169
|
+
continue;
|
|
170
|
+
const first = seg[0];
|
|
171
|
+
const last = seg[seg.length - 1];
|
|
172
|
+
// Sub-path of just this segment.
|
|
173
|
+
const subPoints = seg;
|
|
174
|
+
const subLine = subPoints.length > 1
|
|
175
|
+
? buildLinePath(subPoints)
|
|
176
|
+
: `M ${first.x.toFixed(2)} ${first.y.toFixed(2)}`;
|
|
177
|
+
d += `${d ? " " : ""}${subLine} L ${last.x.toFixed(2)} ${baselineY.toFixed(2)} L ${first.x.toFixed(2)} ${baselineY.toFixed(2)} Z`;
|
|
178
|
+
}
|
|
179
|
+
return d;
|
|
180
|
+
}
|
|
181
|
+
function LineChart({ series, label, size, width, height, yMin, yMax, xMin, xMax, curve = "linear", showPoints = false, showAxis = true, gridLineCount = 0, categories, xTickFormatter, xTickCount = 5, yTickFormatter, yTickCount = 5, showYAxisLabels = false, yTickLabelWidth = 36, showValueLabels = false, valueLabelFormatter, onPointClick, children, className, overlayClassName, valueLabelClassName, categoryLabelClassName, yAxisLabelClassName, axisClassName, ref, ...props }) {
|
|
182
|
+
const resolvedSize = size ?? "md";
|
|
183
|
+
const canvas = SIZE_TO_CANVAS[resolvedSize];
|
|
184
|
+
const W = width ?? canvas.width;
|
|
185
|
+
const H = height ?? canvas.height;
|
|
186
|
+
const titleId = useId();
|
|
187
|
+
const gradientIdPrefix = useId();
|
|
188
|
+
// Reserve gutters for axis labels.
|
|
189
|
+
const hasCategoryLabels = (categories !== undefined && categories.length > 0) ||
|
|
190
|
+
typeof xTickFormatter === "function";
|
|
191
|
+
const hasYAxisLabels = typeof yTickFormatter === "function" || showYAxisLabels;
|
|
192
|
+
const categoryGutter = hasCategoryLabels ? 22 : 6;
|
|
193
|
+
const valueGutter = showValueLabels ? 18 : 6;
|
|
194
|
+
const padTop = valueGutter;
|
|
195
|
+
const padBottom = categoryGutter;
|
|
196
|
+
const padLeft = hasYAxisLabels ? Math.max(8, yTickLabelWidth) : 6;
|
|
197
|
+
const padRight = 6;
|
|
198
|
+
const plotX0 = padLeft;
|
|
199
|
+
const plotY0 = padTop;
|
|
200
|
+
const plotW = Math.max(0, W - padLeft - padRight);
|
|
201
|
+
const plotH = Math.max(0, H - padTop - padBottom);
|
|
202
|
+
// Determine the domain across all series.
|
|
203
|
+
let domainXMin = Number.POSITIVE_INFINITY;
|
|
204
|
+
let domainXMax = Number.NEGATIVE_INFINITY;
|
|
205
|
+
let domainYMin = Number.POSITIVE_INFINITY;
|
|
206
|
+
let domainYMax = Number.NEGATIVE_INFINITY;
|
|
207
|
+
let totalFinitePoints = 0;
|
|
208
|
+
for (const s of series) {
|
|
209
|
+
s.points.forEach((p, idx) => {
|
|
210
|
+
const x = isFiniteNumber(p.x) ? p.x : idx;
|
|
211
|
+
if (x < domainXMin)
|
|
212
|
+
domainXMin = x;
|
|
213
|
+
if (x > domainXMax)
|
|
214
|
+
domainXMax = x;
|
|
215
|
+
if (isFiniteNumber(p.y)) {
|
|
216
|
+
if (p.y < domainYMin)
|
|
217
|
+
domainYMin = p.y;
|
|
218
|
+
if (p.y > domainYMax)
|
|
219
|
+
domainYMax = p.y;
|
|
220
|
+
totalFinitePoints += 1;
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
const hasData = totalFinitePoints > 0;
|
|
225
|
+
const effectiveXMin = isFiniteNumber(xMin)
|
|
226
|
+
? xMin
|
|
227
|
+
: hasData && Number.isFinite(domainXMin)
|
|
228
|
+
? domainXMin
|
|
229
|
+
: 0;
|
|
230
|
+
const effectiveXMax = isFiniteNumber(xMax)
|
|
231
|
+
? xMax
|
|
232
|
+
: hasData && Number.isFinite(domainXMax)
|
|
233
|
+
? domainXMax
|
|
234
|
+
: 1;
|
|
235
|
+
const effectiveYMin = isFiniteNumber(yMin)
|
|
236
|
+
? yMin
|
|
237
|
+
: hasData && Number.isFinite(domainYMin)
|
|
238
|
+
? domainYMin
|
|
239
|
+
: 0;
|
|
240
|
+
const effectiveYMax = isFiniteNumber(yMax)
|
|
241
|
+
? yMax
|
|
242
|
+
: hasData && Number.isFinite(domainYMax)
|
|
243
|
+
? domainYMax
|
|
244
|
+
: 1;
|
|
245
|
+
const xSpan = effectiveXMax > effectiveXMin ? effectiveXMax - effectiveXMin : 1;
|
|
246
|
+
const ySpan = effectiveYMax > effectiveYMin ? effectiveYMax - effectiveYMin : 1;
|
|
247
|
+
const projectX = (x) => plotX0 + ((x - effectiveXMin) / xSpan) * plotW;
|
|
248
|
+
const projectY = (y) => plotY0 + plotH - ((y - effectiveYMin) / ySpan) * plotH;
|
|
249
|
+
const resolved = series.map((s, seriesIndex) => {
|
|
250
|
+
const color = s.color ??
|
|
251
|
+
DEFAULT_COLOR_ROTATION[seriesIndex % DEFAULT_COLOR_ROTATION.length];
|
|
252
|
+
const seriesCurve = s.curve ?? curve;
|
|
253
|
+
const seriesShowPoints = s.showPoints ?? showPoints;
|
|
254
|
+
const points = s.points.map((p, idx) => {
|
|
255
|
+
const domainX = isFiniteNumber(p.x) ? p.x : idx;
|
|
256
|
+
const domainY = isFiniteNumber(p.y) ? p.y : 0;
|
|
257
|
+
const isGap = !isFiniteNumber(p.y);
|
|
258
|
+
return {
|
|
259
|
+
point: p,
|
|
260
|
+
domainX,
|
|
261
|
+
domainY,
|
|
262
|
+
x: projectX(domainX),
|
|
263
|
+
y: isGap ? projectY(effectiveYMin) : projectY(domainY),
|
|
264
|
+
isGap,
|
|
265
|
+
index: idx,
|
|
266
|
+
};
|
|
267
|
+
});
|
|
268
|
+
return {
|
|
269
|
+
series: s,
|
|
270
|
+
points,
|
|
271
|
+
color,
|
|
272
|
+
curve: seriesCurve,
|
|
273
|
+
showPoints: seriesShowPoints,
|
|
274
|
+
};
|
|
275
|
+
});
|
|
276
|
+
const baselineYClamped = effectiveYMin <= 0 && effectiveYMax >= 0
|
|
277
|
+
? projectY(0)
|
|
278
|
+
: projectY(effectiveYMin);
|
|
279
|
+
const gridLines = (() => {
|
|
280
|
+
if (gridLineCount <= 0)
|
|
281
|
+
return [];
|
|
282
|
+
const lines = [];
|
|
283
|
+
for (let i = 1; i <= gridLineCount; i += 1) {
|
|
284
|
+
lines.push(i / (gridLineCount + 1));
|
|
285
|
+
}
|
|
286
|
+
return lines;
|
|
287
|
+
})();
|
|
288
|
+
// X-axis tick set.
|
|
289
|
+
const xTicks = (() => {
|
|
290
|
+
if (categories && categories.length > 0) {
|
|
291
|
+
const ticks = [];
|
|
292
|
+
categories.forEach((text, idx) => {
|
|
293
|
+
if (text === null)
|
|
294
|
+
return;
|
|
295
|
+
const domainX = idx;
|
|
296
|
+
if (domainX < effectiveXMin || domainX > effectiveXMax)
|
|
297
|
+
return;
|
|
298
|
+
ticks.push({ x: projectX(domainX), text });
|
|
299
|
+
});
|
|
300
|
+
return ticks;
|
|
301
|
+
}
|
|
302
|
+
if (typeof xTickFormatter === "function" && xTickCount > 0 && hasData) {
|
|
303
|
+
const ticks = [];
|
|
304
|
+
const count = Math.max(2, xTickCount);
|
|
305
|
+
for (let i = 0; i < count; i += 1) {
|
|
306
|
+
const t = count === 1 ? 0 : i / (count - 1);
|
|
307
|
+
const domainX = effectiveXMin + t * xSpan;
|
|
308
|
+
const text = xTickFormatter(domainX, i);
|
|
309
|
+
if (text === null || text === "")
|
|
310
|
+
continue;
|
|
311
|
+
ticks.push({ x: projectX(domainX), text });
|
|
312
|
+
}
|
|
313
|
+
return ticks;
|
|
314
|
+
}
|
|
315
|
+
return [];
|
|
316
|
+
})();
|
|
317
|
+
// Y-axis tick set. Always includes both endpoints when active.
|
|
318
|
+
const yTicks = (() => {
|
|
319
|
+
if (!hasYAxisLabels || !hasData)
|
|
320
|
+
return [];
|
|
321
|
+
const count = Math.max(2, yTickCount);
|
|
322
|
+
const ticks = [];
|
|
323
|
+
for (let i = 0; i < count; i += 1) {
|
|
324
|
+
// Iterate top-down (i = 0 -> yMax, i = count - 1 -> yMin) so the first
|
|
325
|
+
// call to a custom formatter receives the largest value -- the order
|
|
326
|
+
// most consumers expect.
|
|
327
|
+
const t = i / (count - 1);
|
|
328
|
+
const value = effectiveYMax - t * ySpan;
|
|
329
|
+
const text = typeof yTickFormatter === "function"
|
|
330
|
+
? yTickFormatter(value, i)
|
|
331
|
+
: String(value);
|
|
332
|
+
if (text === null || text === "")
|
|
333
|
+
continue;
|
|
334
|
+
ticks.push({ y: projectY(value), value, text });
|
|
335
|
+
}
|
|
336
|
+
return ticks;
|
|
337
|
+
})();
|
|
338
|
+
return (_jsxs("div", { ref: ref, role: "img", "aria-labelledby": titleId, "data-slot": "line-chart", className: cn(lineChartVariants({ size }), className), style: { width: W, height: H }, ...props, children: [_jsxs("svg", { width: W, height: H, viewBox: `0 0 ${W} ${H}`, "aria-hidden": children ? "true" : undefined, className: "h-full w-full overflow-visible", children: [_jsx("title", { id: titleId, children: label }), gridLines.length > 0 ? (_jsx("g", { "aria-hidden": "true", "data-slot": "line-chart-gridlines", className: "pointer-events-none", children: gridLines.map((t) => {
|
|
339
|
+
const y = plotY0 + plotH - t * plotH;
|
|
340
|
+
return (_jsx("line", { x1: plotX0, y1: y, x2: plotX0 + plotW, y2: y, strokeWidth: 1, className: cn("stroke-border/60", axisClassName) }, `grid-${t}`));
|
|
341
|
+
}) })) : null, showAxis ? (_jsxs("g", { "aria-hidden": "true", "data-slot": "line-chart-axis", className: "pointer-events-none", children: [_jsx("line", { x1: plotX0, y1: plotY0, x2: plotX0, y2: plotY0 + plotH, strokeWidth: 1, className: cn("stroke-border", axisClassName) }), _jsx("line", { x1: plotX0, y1: plotY0 + plotH, x2: plotX0 + plotW, y2: plotY0 + plotH, strokeWidth: 1, className: cn("stroke-border", axisClassName) })] })) : null, !hasData ? (_jsx("text", { x: W / 2, y: H / 2, textAnchor: "middle", dominantBaseline: "central", className: "fill-muted-foreground", children: "No data" })) : (resolved.map((rs, seriesIndex) => {
|
|
342
|
+
const strokeWidth = rs.series.strokeWidth ?? 2;
|
|
343
|
+
const linePath = rs.curve === "smooth"
|
|
344
|
+
? buildSmoothPath(rs.points)
|
|
345
|
+
: buildLinePath(rs.points);
|
|
346
|
+
const areaPath = rs.series.area
|
|
347
|
+
? buildAreaPath(linePath, rs.points, baselineYClamped)
|
|
348
|
+
: "";
|
|
349
|
+
const strokeClass = rs.series.stroke
|
|
350
|
+
? undefined
|
|
351
|
+
: STROKE_CLASSES[rs.color];
|
|
352
|
+
const fillClass = rs.series.stroke
|
|
353
|
+
? undefined
|
|
354
|
+
: TEXT_CLASSES[rs.color];
|
|
355
|
+
const gradientId = `${gradientIdPrefix}-grad-${seriesIndex}`;
|
|
356
|
+
return (_jsxs("g", { "data-slot": "line-chart-series", "data-series-id": rs.series.id, children: [rs.series.area && areaPath !== "" ? (_jsxs(_Fragment, { children: [_jsx("defs", { children: _jsxs("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", className: fillClass, children: [_jsx("stop", { offset: "0%", stopColor: rs.series.stroke ?? "currentColor", stopOpacity: "0.35" }), _jsx("stop", { offset: "100%", stopColor: rs.series.stroke ?? "currentColor", stopOpacity: "0" })] }) }), _jsx("path", { d: areaPath, fill: `url(#${gradientId})`, stroke: "none" })] })) : null, _jsx("path", { d: linePath, fill: "none", stroke: rs.series.stroke, strokeWidth: strokeWidth, strokeLinecap: "round", strokeLinejoin: "round", strokeDasharray: rs.series.strokeDasharray, className: cn(strokeClass, rs.series.className) }), rs.showPoints
|
|
357
|
+
? rs.points.map((rp) => {
|
|
358
|
+
if (rp.isGap)
|
|
359
|
+
return null;
|
|
360
|
+
const handler = rs.series.onPointClick ?? onPointClick;
|
|
361
|
+
const isInteractive = typeof handler === "function";
|
|
362
|
+
const ariaLabel = rp.point.label
|
|
363
|
+
? `${rs.series.label ?? rs.series.id} – ${rp.point.label}: ${rp.point.y}`
|
|
364
|
+
: `${rs.series.label ?? rs.series.id} at ${rp.domainX}: ${rp.point.y}`;
|
|
365
|
+
const pointKey = rp.point.id ?? `${rs.series.id}-${rp.index}`;
|
|
366
|
+
return (_jsx("circle", { cx: rp.x, cy: rp.y, r: Math.max(strokeWidth + 1, 3), fill: rs.series.stroke ?? "currentColor", stroke: "hsl(var(--background))", strokeWidth: 1.5, "data-point-index": rp.index, role: isInteractive ? "button" : undefined, tabIndex: isInteractive ? 0 : undefined, "aria-label": ariaLabel, onClick: isInteractive
|
|
367
|
+
? (event) => {
|
|
368
|
+
handler(rp.point, rs.series, event);
|
|
369
|
+
}
|
|
370
|
+
: undefined, onKeyDown: isInteractive
|
|
371
|
+
? (event) => {
|
|
372
|
+
if (event.key === "Enter" ||
|
|
373
|
+
event.key === " ") {
|
|
374
|
+
event.preventDefault();
|
|
375
|
+
handler(rp.point, rs.series, event);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
: undefined, className: cn("transition-opacity", rs.series.stroke ? undefined : FILL_CLASSES[rs.color], isInteractive &&
|
|
379
|
+
"cursor-pointer hover:opacity-80 focus:outline-none focus-visible:opacity-80") }, pointKey));
|
|
380
|
+
})
|
|
381
|
+
: null, showValueLabels
|
|
382
|
+
? rs.points.map((rp) => {
|
|
383
|
+
if (rp.isGap)
|
|
384
|
+
return null;
|
|
385
|
+
const text = valueLabelFormatter
|
|
386
|
+
? valueLabelFormatter({
|
|
387
|
+
series: rs.series,
|
|
388
|
+
point: rp.point,
|
|
389
|
+
value: rp.point.y,
|
|
390
|
+
index: rp.index,
|
|
391
|
+
})
|
|
392
|
+
: String(rp.point.y);
|
|
393
|
+
if (text === null || text === "")
|
|
394
|
+
return null;
|
|
395
|
+
const labelKey = (rp.point.id ?? `${rs.series.id}-${rp.index}`) +
|
|
396
|
+
"-val";
|
|
397
|
+
return (_jsx("text", { x: rp.x, y: rp.y - 8, textAnchor: "middle", className: cn("pointer-events-none select-none fill-foreground font-medium", valueLabelClassName), children: text }, labelKey));
|
|
398
|
+
})
|
|
399
|
+
: null] }, rs.series.id));
|
|
400
|
+
})), xTicks.length > 0 ? (_jsx("g", { "aria-hidden": "true", "data-slot": "line-chart-x-ticks", className: "pointer-events-none select-none", children: xTicks.map((tick, idx) => (_jsx("text", { x: tick.x, y: plotY0 + plotH + 14, textAnchor: "middle", className: cn("fill-muted-foreground", categoryLabelClassName), children: tick.text }, `xtick-${idx}-${tick.text}`))) })) : null, yTicks.length > 0 ? (_jsx("g", { "aria-hidden": "true", "data-slot": "line-chart-y-ticks", className: "pointer-events-none select-none", children: yTicks.map((tick, idx) => (_jsxs("g", { children: [_jsx("line", { x1: plotX0 - 3, x2: plotX0, y1: tick.y, y2: tick.y, strokeWidth: 1, className: cn("stroke-border", axisClassName) }), _jsx("text", { x: plotX0 - 6, y: tick.y, textAnchor: "end", dominantBaseline: "central", className: cn("fill-muted-foreground", yAxisLabelClassName), children: tick.text })] }, `ytick-${idx}-${tick.text}`))) })) : null] }), children ? (_jsx("div", { className: cn("pointer-events-none absolute inset-0 flex items-center justify-center text-center", overlayClassName), children: children })) : null] }));
|
|
401
|
+
}
|
|
402
|
+
LineChart.displayName = "LineChart";
|
|
403
|
+
export { LineChart };
|
|
404
|
+
//# sourceMappingURL=line-chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-chart.js","sourceRoot":"","sources":["../../../../src/components/ui/line-chart/line-chart.tsx"],"names":[],"mappings":"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"}
|