@schemavaults/ui 0.82.0 → 0.84.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/dist/components/ui/index.d.ts +4 -0
- package/dist/components/ui/index.js +2 -0
- package/dist/components/ui/index.js.map +1 -1
- package/dist/components/ui/meter/index.d.ts +3 -0
- package/dist/components/ui/meter/index.js +3 -0
- package/dist/components/ui/meter/index.js.map +1 -0
- package/dist/components/ui/meter/meter.d.ts +74 -0
- package/dist/components/ui/meter/meter.js +125 -0
- package/dist/components/ui/meter/meter.js.map +1 -0
- package/dist/components/ui/radar-chart/index.d.ts +3 -0
- package/dist/components/ui/radar-chart/index.js +3 -0
- package/dist/components/ui/radar-chart/index.js.map +1 -0
- package/dist/components/ui/radar-chart/radar-chart.d.ts +146 -0
- package/dist/components/ui/radar-chart/radar-chart.js +312 -0
- package/dist/components/ui/radar-chart/radar-chart.js.map +1 -0
- package/package.json +1 -1
|
@@ -124,6 +124,8 @@ export * from "./scroll-progress";
|
|
|
124
124
|
export type * from "./scroll-progress";
|
|
125
125
|
export * from "./gauge";
|
|
126
126
|
export type * from "./gauge";
|
|
127
|
+
export * from "./meter";
|
|
128
|
+
export type * from "./meter";
|
|
127
129
|
export * from "./breadcrumb";
|
|
128
130
|
export type * from "./breadcrumb";
|
|
129
131
|
export * from "./pagination";
|
|
@@ -182,6 +184,8 @@ export * from "./bar-chart";
|
|
|
182
184
|
export type * from "./bar-chart";
|
|
183
185
|
export * from "./line-chart";
|
|
184
186
|
export type * from "./line-chart";
|
|
187
|
+
export * from "./radar-chart";
|
|
188
|
+
export type * from "./radar-chart";
|
|
185
189
|
export * from "./comparison-slider";
|
|
186
190
|
export type * from "./comparison-slider";
|
|
187
191
|
export * from "./theme-selector";
|
|
@@ -61,6 +61,7 @@ export * from "./progress-bar";
|
|
|
61
61
|
export * from "./circular-progress";
|
|
62
62
|
export * from "./scroll-progress";
|
|
63
63
|
export * from "./gauge";
|
|
64
|
+
export * from "./meter";
|
|
64
65
|
export * from "./breadcrumb";
|
|
65
66
|
export * from "./pagination";
|
|
66
67
|
export * from "./kbd";
|
|
@@ -90,6 +91,7 @@ export * from "./calendar-heatmap";
|
|
|
90
91
|
export * from "./pie-chart";
|
|
91
92
|
export * from "./bar-chart";
|
|
92
93
|
export * from "./line-chart";
|
|
94
|
+
export * from "./radar-chart";
|
|
93
95
|
export * from "./comparison-slider";
|
|
94
96
|
export * from "./theme-selector";
|
|
95
97
|
export * from "./tree-view";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
|
|
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/meter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,aAAa,EACb,sBAAsB,EACtB,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import type { HTMLAttributes, ReactElement, ReactNode } from "react";
|
|
3
|
+
export declare const meterSizeIds: readonly ["sm", "default", "lg"];
|
|
4
|
+
export type MeterSizeId = (typeof meterSizeIds)[number];
|
|
5
|
+
export declare const meterColorIds: readonly ["default", "positive", "warning", "destructive"];
|
|
6
|
+
export type MeterColorId = (typeof meterColorIds)[number];
|
|
7
|
+
export declare const meterVariants: (props?: ({
|
|
8
|
+
size?: "sm" | "default" | "lg" | null | undefined;
|
|
9
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
10
|
+
export declare const meterIndicatorVariants: (props?: ({
|
|
11
|
+
color?: "default" | "warning" | "destructive" | "positive" | null | undefined;
|
|
12
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
13
|
+
export interface MeterProps extends Omit<HTMLAttributes<HTMLDivElement>, "role" | "color">, VariantProps<typeof meterVariants>, VariantProps<typeof meterIndicatorVariants> {
|
|
14
|
+
/** Current value (clamped to [min, max]). */
|
|
15
|
+
value: number;
|
|
16
|
+
/** Accessible label describing what the meter represents. */
|
|
17
|
+
label: string;
|
|
18
|
+
/** Minimum value (defaults to 0). */
|
|
19
|
+
min?: number;
|
|
20
|
+
/** Maximum value (defaults to 100). */
|
|
21
|
+
max?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Upper bound of the "low" band. Values below `low` are considered low.
|
|
24
|
+
* Defaults to `min` (i.e. no low band).
|
|
25
|
+
*/
|
|
26
|
+
low?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Lower bound of the "high" band. Values above `high` are considered high.
|
|
29
|
+
* Defaults to `max` (i.e. no high band).
|
|
30
|
+
*/
|
|
31
|
+
high?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Ideal value. When `optimum` sits between `low` and `high`, the mid
|
|
34
|
+
* band is optimal; otherwise the band containing `optimum` is optimal.
|
|
35
|
+
* Defaults to the midpoint of [min, max].
|
|
36
|
+
*/
|
|
37
|
+
optimum?: number;
|
|
38
|
+
/**
|
|
39
|
+
* When true, the indicator color is chosen automatically based on where
|
|
40
|
+
* the current value sits relative to the thresholds — overriding `color`.
|
|
41
|
+
*/
|
|
42
|
+
autoColorFromThresholds?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* When true (default), renders the label above the bar. Set to `false` to
|
|
45
|
+
* hide the visible label (it is still announced via `aria-label`).
|
|
46
|
+
*/
|
|
47
|
+
showLabel?: boolean;
|
|
48
|
+
/** When true (default), renders the numeric value alongside the label. */
|
|
49
|
+
showValue?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* When true, faintly renders the threshold band edges behind the
|
|
52
|
+
* indicator so the reader can see where "low", "mid", and "high" sit.
|
|
53
|
+
*/
|
|
54
|
+
showThresholdMarks?: boolean;
|
|
55
|
+
/** Displayed unit next to the value (e.g. "%", "GB"). */
|
|
56
|
+
unit?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Optional formatter for the value shown next to the label. Overrides
|
|
59
|
+
* the default `Math.round(value) + unit` display.
|
|
60
|
+
*/
|
|
61
|
+
formatValue?: (value: number) => ReactNode;
|
|
62
|
+
/** Additional classes for the filled indicator. */
|
|
63
|
+
indicatorClassName?: string;
|
|
64
|
+
/** Additional classes for the header row containing label + value. */
|
|
65
|
+
headerClassName?: string;
|
|
66
|
+
/** Additional classes for the label text. */
|
|
67
|
+
labelClassName?: string;
|
|
68
|
+
/** Additional classes for the value text. */
|
|
69
|
+
valueClassName?: string;
|
|
70
|
+
}
|
|
71
|
+
export declare function Meter({ value, label, min, max, low, high, optimum, size, color, autoColorFromThresholds, showLabel, showValue, showThresholdMarks, unit, formatValue, className, indicatorClassName, headerClassName, labelClassName, valueClassName, ...props }: MeterProps): ReactElement;
|
|
72
|
+
export declare namespace Meter {
|
|
73
|
+
var displayName: string;
|
|
74
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import { m } from "../../../framer-motion";
|
|
5
|
+
import { cn } from "../../../lib/utils";
|
|
6
|
+
export const meterSizeIds = ["sm", "default", "lg"];
|
|
7
|
+
export const meterColorIds = [
|
|
8
|
+
"default",
|
|
9
|
+
"positive",
|
|
10
|
+
"warning",
|
|
11
|
+
"destructive",
|
|
12
|
+
];
|
|
13
|
+
export const meterVariants = cva("relative w-full overflow-hidden rounded-full bg-secondary", {
|
|
14
|
+
variants: {
|
|
15
|
+
size: {
|
|
16
|
+
sm: "h-1.5",
|
|
17
|
+
default: "h-2.5",
|
|
18
|
+
lg: "h-4",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
defaultVariants: {
|
|
22
|
+
size: "default",
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
export const meterIndicatorVariants = cva("h-full rounded-full transition-colors duration-300", {
|
|
26
|
+
variants: {
|
|
27
|
+
color: {
|
|
28
|
+
default: "bg-schemavaults-brand-blue",
|
|
29
|
+
positive: "bg-emerald-500 dark:bg-emerald-400",
|
|
30
|
+
warning: "bg-warning",
|
|
31
|
+
destructive: "bg-destructive",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
defaultVariants: {
|
|
35
|
+
color: "default",
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
const meterValueTextVariants = cva("tabular-nums text-foreground", {
|
|
39
|
+
variants: {
|
|
40
|
+
size: {
|
|
41
|
+
sm: "text-xs",
|
|
42
|
+
default: "text-sm",
|
|
43
|
+
lg: "text-base",
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
defaultVariants: {
|
|
47
|
+
size: "default",
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
/**
|
|
51
|
+
* A meter behaves like the HTML `<meter>` element: the value is a scalar
|
|
52
|
+
* measurement inside a known range, with optional quality thresholds
|
|
53
|
+
* (`low`, `high`, `optimum`) that define which sub-range is preferable.
|
|
54
|
+
*
|
|
55
|
+
* The rules are the same as `<meter>`:
|
|
56
|
+
* - "optimum" marks the ideal value.
|
|
57
|
+
* - If `optimum` falls between `low` and `high`, values inside the same
|
|
58
|
+
* band are considered optimal, adjacent bands are sub-optimal, and the
|
|
59
|
+
* farthest band is considered bad.
|
|
60
|
+
* - When only one of `low`/`high` is set, the missing side extends to the
|
|
61
|
+
* matching endpoint.
|
|
62
|
+
*
|
|
63
|
+
* When `autoColorFromThresholds` is enabled the indicator color is chosen
|
|
64
|
+
* automatically from the resolved quality: optimum → positive, sub-optimum
|
|
65
|
+
* → warning, worst → destructive.
|
|
66
|
+
*/
|
|
67
|
+
function clampValue(value, min, max) {
|
|
68
|
+
return Math.min(max, Math.max(min, value));
|
|
69
|
+
}
|
|
70
|
+
function valueToPercentage(value, min, max) {
|
|
71
|
+
if (max === min) {
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
return ((value - min) / (max - min)) * 100;
|
|
75
|
+
}
|
|
76
|
+
function resolveQuality(value, low, high, optimum) {
|
|
77
|
+
const inLow = value < low;
|
|
78
|
+
const inHigh = value > high;
|
|
79
|
+
const inMid = !inLow && !inHigh;
|
|
80
|
+
const optimumInMid = optimum >= low && optimum <= high;
|
|
81
|
+
const optimumInLow = optimum < low;
|
|
82
|
+
const optimumInHigh = optimum > high;
|
|
83
|
+
if (optimumInMid) {
|
|
84
|
+
return inMid ? "optimum" : "sub-optimum";
|
|
85
|
+
}
|
|
86
|
+
if (optimumInLow) {
|
|
87
|
+
if (inLow) {
|
|
88
|
+
return "optimum";
|
|
89
|
+
}
|
|
90
|
+
return inMid ? "sub-optimum" : "worst";
|
|
91
|
+
}
|
|
92
|
+
if (optimumInHigh) {
|
|
93
|
+
if (inHigh) {
|
|
94
|
+
return "optimum";
|
|
95
|
+
}
|
|
96
|
+
return inMid ? "sub-optimum" : "worst";
|
|
97
|
+
}
|
|
98
|
+
return inMid ? "optimum" : "sub-optimum";
|
|
99
|
+
}
|
|
100
|
+
const QUALITY_TO_COLOR = {
|
|
101
|
+
optimum: "positive",
|
|
102
|
+
"sub-optimum": "warning",
|
|
103
|
+
worst: "destructive",
|
|
104
|
+
};
|
|
105
|
+
export function Meter({ value, label, min = 0, max = 100, low, high, optimum, size, color, autoColorFromThresholds = false, showLabel = true, showValue = true, showThresholdMarks = false, unit, formatValue, className, indicatorClassName, headerClassName, labelClassName, valueClassName, ...props }) {
|
|
106
|
+
const resolvedSize = size ?? "default";
|
|
107
|
+
const resolvedLow = low ?? min;
|
|
108
|
+
const resolvedHigh = high ?? max;
|
|
109
|
+
const resolvedOptimum = optimum ?? (min + max) / 2;
|
|
110
|
+
const clamped = clampValue(value, min, max);
|
|
111
|
+
const percentage = valueToPercentage(clamped, min, max);
|
|
112
|
+
const quality = resolveQuality(clamped, resolvedLow, resolvedHigh, resolvedOptimum);
|
|
113
|
+
const indicatorColor = autoColorFromThresholds
|
|
114
|
+
? QUALITY_TO_COLOR[quality]
|
|
115
|
+
: (color ?? "default");
|
|
116
|
+
const lowPct = valueToPercentage(clampValue(resolvedLow, min, max), min, max);
|
|
117
|
+
const highPct = valueToPercentage(clampValue(resolvedHigh, min, max), min, max);
|
|
118
|
+
const showLowMark = showThresholdMarks && lowPct > 0 && lowPct < 100;
|
|
119
|
+
const showHighMark = showThresholdMarks && highPct > 0 && highPct < 100 && highPct !== lowPct;
|
|
120
|
+
const showHeader = showLabel || showValue;
|
|
121
|
+
const defaultFormattedValue = (_jsxs(_Fragment, { children: [Math.round(clamped), unit && (_jsx("span", { className: "ml-0.5 text-muted-foreground", children: unit }))] }));
|
|
122
|
+
return (_jsxs("div", { className: cn("flex w-full flex-col gap-1", className), ...props, children: [showHeader && (_jsxs("div", { className: cn("flex items-baseline justify-between gap-2", headerClassName), children: [showLabel && (_jsx("span", { className: cn(meterValueTextVariants({ size: resolvedSize }), "text-muted-foreground", labelClassName), children: label })), showValue && (_jsx("span", { className: cn(meterValueTextVariants({ size: resolvedSize }), "font-medium", valueClassName), children: formatValue ? formatValue(clamped) : defaultFormattedValue }))] })), _jsxs("div", { role: "meter", "aria-valuenow": clamped, "aria-valuemin": min, "aria-valuemax": max, "aria-label": label, className: cn(meterVariants({ size: resolvedSize })), children: [showLowMark && (_jsx("span", { "aria-hidden": "true", className: "absolute inset-y-0 w-px bg-foreground/25", style: { left: `${lowPct}%` } })), showHighMark && (_jsx("span", { "aria-hidden": "true", className: "absolute inset-y-0 w-px bg-foreground/25", style: { left: `${highPct}%` } })), _jsx(m.div, { initial: { width: 0 }, animate: { width: `${percentage}%` }, transition: { duration: 0.4, ease: "easeOut" }, className: cn(meterIndicatorVariants({ color: indicatorColor }), indicatorClassName) })] })] }));
|
|
123
|
+
}
|
|
124
|
+
Meter.displayName = "Meter";
|
|
125
|
+
//# sourceMappingURL=meter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meter.js","sourceRoot":"","sources":["../../../../src/components/ui/meter/meter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ui/radar-chart/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import type { HTMLAttributes, KeyboardEvent, MouseEvent, ReactElement, ReactNode, Ref } from "react";
|
|
3
|
+
export declare const radarChartSizeIds: ["sm", "md", "lg", "xl"];
|
|
4
|
+
export type RadarChartSizeId = (typeof radarChartSizeIds)[number];
|
|
5
|
+
export declare const radarChartColorIds: ["default", "primary", "positive", "warning", "destructive", "muted"];
|
|
6
|
+
export type RadarChartColorId = (typeof radarChartColorIds)[number];
|
|
7
|
+
export declare const radarChartGridShapeIds: ["polygon", "circle"];
|
|
8
|
+
export type RadarChartGridShapeId = (typeof radarChartGridShapeIds)[number];
|
|
9
|
+
export declare const radarChartVariants: (props?: ({
|
|
10
|
+
size?: "sm" | "lg" | "xl" | "md" | null | undefined;
|
|
11
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
12
|
+
export interface RadarChartAxis {
|
|
13
|
+
/** Stable identifier used as React key. */
|
|
14
|
+
id: string;
|
|
15
|
+
/** Human-readable label placed at the axis tip. */
|
|
16
|
+
label?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Optional per-axis maximum. Overrides the chart-level `max` for scaling
|
|
19
|
+
* this axis' values only. Useful when axes are measured on different scales.
|
|
20
|
+
*/
|
|
21
|
+
max?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Optional per-axis minimum. Overrides the chart-level `min` for scaling
|
|
24
|
+
* this axis' values only.
|
|
25
|
+
*/
|
|
26
|
+
min?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface RadarChartSeriesPoint {
|
|
29
|
+
/** Numeric value for the axis at the same index. Non-finite = gap. */
|
|
30
|
+
value: number;
|
|
31
|
+
/** Human-readable label used in aria-labels and tooltips. */
|
|
32
|
+
label?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface RadarChartSeries {
|
|
35
|
+
/** Stable identifier used as React key and click payload. */
|
|
36
|
+
id: string;
|
|
37
|
+
/** Display name for the series. */
|
|
38
|
+
label?: string;
|
|
39
|
+
/**
|
|
40
|
+
* One value per axis, in axis order. Extra values are ignored and missing
|
|
41
|
+
* values are treated as gaps. Values may be raw numbers or point objects
|
|
42
|
+
* with an optional label.
|
|
43
|
+
*/
|
|
44
|
+
values: ReadonlyArray<number | RadarChartSeriesPoint>;
|
|
45
|
+
/** Preset color id from the chart palette. Ignored if `stroke` is provided. */
|
|
46
|
+
color?: RadarChartColorId;
|
|
47
|
+
/**
|
|
48
|
+
* Override the stroke with a raw CSS color (e.g. `"#ff0080"` or
|
|
49
|
+
* `"hsl(var(--chart-1))"`). Takes precedence over `color`.
|
|
50
|
+
*/
|
|
51
|
+
stroke?: string;
|
|
52
|
+
/** Fill the shape. Defaults to the chart-level `area` (true). */
|
|
53
|
+
area?: boolean;
|
|
54
|
+
/** Opacity applied to the filled area. Defaults to `0.2`. */
|
|
55
|
+
fillOpacity?: number;
|
|
56
|
+
/** Stroke width in user units. Defaults to `2`. */
|
|
57
|
+
strokeWidth?: number;
|
|
58
|
+
/** Stroke dash pattern, e.g. `"4 3"`. Defaults to a solid line. */
|
|
59
|
+
strokeDasharray?: string;
|
|
60
|
+
/** Override the chart-level `showPoints`. */
|
|
61
|
+
showPoints?: boolean;
|
|
62
|
+
/** Extra classes applied to this series' shape `<path>`. */
|
|
63
|
+
className?: string;
|
|
64
|
+
/** Fired when a vertex in this series is clicked or activated via keyboard. */
|
|
65
|
+
onPointClick?: (axis: RadarChartAxis, value: number, series: RadarChartSeries, event: MouseEvent<SVGCircleElement> | KeyboardEvent<SVGCircleElement>) => void;
|
|
66
|
+
}
|
|
67
|
+
export interface RadarChartValueLabelContext {
|
|
68
|
+
series: RadarChartSeries;
|
|
69
|
+
axis: RadarChartAxis;
|
|
70
|
+
value: number;
|
|
71
|
+
axisIndex: number;
|
|
72
|
+
}
|
|
73
|
+
export interface RadarChartProps extends Omit<HTMLAttributes<HTMLDivElement>, "onClick">, VariantProps<typeof radarChartVariants> {
|
|
74
|
+
/** Axes to render, in order (clockwise starting from 12 o'clock). */
|
|
75
|
+
axes: ReadonlyArray<RadarChartAxis>;
|
|
76
|
+
/** Series to render, in order (later series are drawn on top). */
|
|
77
|
+
series: ReadonlyArray<RadarChartSeries>;
|
|
78
|
+
/** Accessible label describing what the chart represents. */
|
|
79
|
+
label: string;
|
|
80
|
+
/** Override the rendered diameter in pixels (defaults are size-aware). */
|
|
81
|
+
diameter?: number;
|
|
82
|
+
/**
|
|
83
|
+
* Lower bound of the value axis. Defaults to `0`. Applied per-axis unless the
|
|
84
|
+
* axis specifies its own `min`.
|
|
85
|
+
*/
|
|
86
|
+
min?: number;
|
|
87
|
+
/**
|
|
88
|
+
* Upper bound of the value axis. Defaults to the largest value across
|
|
89
|
+
* series. Applied per-axis unless the axis specifies its own `max`.
|
|
90
|
+
*/
|
|
91
|
+
max?: number;
|
|
92
|
+
/**
|
|
93
|
+
* Angle in degrees at which the first axis is placed. `0` = 12 o'clock;
|
|
94
|
+
* positive rotates clockwise. Defaults to `0`.
|
|
95
|
+
*/
|
|
96
|
+
startAngle?: number;
|
|
97
|
+
/**
|
|
98
|
+
* Number of concentric grid rings (excluding the outer boundary). Defaults
|
|
99
|
+
* to `4`. Set to `0` to hide grid rings.
|
|
100
|
+
*/
|
|
101
|
+
gridLevels?: number;
|
|
102
|
+
/** Shape of the grid rings. Defaults to `"polygon"`. */
|
|
103
|
+
gridShape?: RadarChartGridShapeId;
|
|
104
|
+
/** Render the axis spokes. Defaults to `true`. */
|
|
105
|
+
showAxis?: boolean;
|
|
106
|
+
/** Render the axis labels at each spoke tip. Defaults to `true`. */
|
|
107
|
+
showAxisLabels?: boolean;
|
|
108
|
+
/** Render the outer boundary ring. Defaults to `true`. */
|
|
109
|
+
showBoundary?: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Fill the area under each series' shape. Individual series can override.
|
|
112
|
+
* Defaults to `true`.
|
|
113
|
+
*/
|
|
114
|
+
area?: boolean;
|
|
115
|
+
/** Render point markers at every axis vertex. Defaults to `false`. */
|
|
116
|
+
showPoints?: boolean;
|
|
117
|
+
/** Render a value label at every axis vertex. Defaults to `false`. */
|
|
118
|
+
showValueLabels?: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Customize the value-label text. Return `null` to skip a point. Defaults
|
|
121
|
+
* to the raw value (`String(value)`).
|
|
122
|
+
*/
|
|
123
|
+
valueLabelFormatter?: (context: RadarChartValueLabelContext) => string | null;
|
|
124
|
+
/**
|
|
125
|
+
* Fallback handler invoked for any point that doesn't have its own series-
|
|
126
|
+
* level `onPointClick`. Receives the axis, value, and series.
|
|
127
|
+
*/
|
|
128
|
+
onPointClick?: (axis: RadarChartAxis, value: number, series: RadarChartSeries, event: MouseEvent<SVGCircleElement> | KeyboardEvent<SVGCircleElement>) => void;
|
|
129
|
+
/** Optional content overlaid at the center of the chart. */
|
|
130
|
+
children?: ReactNode;
|
|
131
|
+
/** Extra classes for the overlay content wrapper. */
|
|
132
|
+
overlayClassName?: string;
|
|
133
|
+
/** Extra classes applied to every axis label `<text>` element. */
|
|
134
|
+
axisLabelClassName?: string;
|
|
135
|
+
/** Extra classes applied to every value-label `<text>` element. */
|
|
136
|
+
valueLabelClassName?: string;
|
|
137
|
+
/** Extra classes applied to the grid / axis `<path>` / `<line>` elements. */
|
|
138
|
+
gridClassName?: string;
|
|
139
|
+
/** Optional ref forwarded to the wrapper element. */
|
|
140
|
+
ref?: Ref<HTMLDivElement>;
|
|
141
|
+
}
|
|
142
|
+
declare function RadarChart({ axes, series, label, size, diameter, min, max, startAngle, gridLevels, gridShape, showAxis, showAxisLabels, showBoundary, area, showPoints, showValueLabels, valueLabelFormatter, onPointClick, children, className, overlayClassName, axisLabelClassName, valueLabelClassName, gridClassName, ref, ...props }: RadarChartProps): ReactElement;
|
|
143
|
+
declare namespace RadarChart {
|
|
144
|
+
var displayName: string;
|
|
145
|
+
}
|
|
146
|
+
export { RadarChart };
|
|
@@ -0,0 +1,312 @@
|
|
|
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 radarChartSizeIds = [
|
|
7
|
+
"sm",
|
|
8
|
+
"md",
|
|
9
|
+
"lg",
|
|
10
|
+
"xl",
|
|
11
|
+
];
|
|
12
|
+
export const radarChartColorIds = [
|
|
13
|
+
"default",
|
|
14
|
+
"primary",
|
|
15
|
+
"positive",
|
|
16
|
+
"warning",
|
|
17
|
+
"destructive",
|
|
18
|
+
"muted",
|
|
19
|
+
];
|
|
20
|
+
export const radarChartGridShapeIds = [
|
|
21
|
+
"polygon",
|
|
22
|
+
"circle",
|
|
23
|
+
];
|
|
24
|
+
const SIZE_TO_PIXELS = {
|
|
25
|
+
sm: 160,
|
|
26
|
+
md: 240,
|
|
27
|
+
lg: 320,
|
|
28
|
+
xl: 420,
|
|
29
|
+
};
|
|
30
|
+
const STROKE_CLASSES = {
|
|
31
|
+
default: "stroke-schemavaults-brand-blue",
|
|
32
|
+
primary: "stroke-primary",
|
|
33
|
+
positive: "stroke-emerald-500 dark:stroke-emerald-400",
|
|
34
|
+
warning: "stroke-warning",
|
|
35
|
+
destructive: "stroke-destructive",
|
|
36
|
+
muted: "stroke-muted-foreground",
|
|
37
|
+
};
|
|
38
|
+
const FILL_CLASSES = {
|
|
39
|
+
default: "fill-schemavaults-brand-blue",
|
|
40
|
+
primary: "fill-primary",
|
|
41
|
+
positive: "fill-emerald-500 dark:fill-emerald-400",
|
|
42
|
+
warning: "fill-warning",
|
|
43
|
+
destructive: "fill-destructive",
|
|
44
|
+
muted: "fill-muted-foreground",
|
|
45
|
+
};
|
|
46
|
+
const TEXT_CLASSES = {
|
|
47
|
+
default: "text-schemavaults-brand-blue",
|
|
48
|
+
primary: "text-primary",
|
|
49
|
+
positive: "text-emerald-500 dark:text-emerald-400",
|
|
50
|
+
warning: "text-warning",
|
|
51
|
+
destructive: "text-destructive",
|
|
52
|
+
muted: "text-muted-foreground",
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Fallback color rotation when a series doesn't specify its own color. Index
|
|
56
|
+
* is the series position in the input array, modulo the palette length.
|
|
57
|
+
*/
|
|
58
|
+
const DEFAULT_COLOR_ROTATION = [
|
|
59
|
+
"default",
|
|
60
|
+
"positive",
|
|
61
|
+
"warning",
|
|
62
|
+
"destructive",
|
|
63
|
+
"primary",
|
|
64
|
+
"muted",
|
|
65
|
+
];
|
|
66
|
+
export const radarChartVariants = cva("relative inline-flex shrink-0 items-center justify-center", {
|
|
67
|
+
variants: {
|
|
68
|
+
size: {
|
|
69
|
+
sm: "text-[10px]",
|
|
70
|
+
md: "text-[11px]",
|
|
71
|
+
lg: "text-xs",
|
|
72
|
+
xl: "text-sm",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
defaultVariants: {
|
|
76
|
+
size: "md",
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
function isFiniteNumber(value) {
|
|
80
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
81
|
+
}
|
|
82
|
+
function normalizeValue(value) {
|
|
83
|
+
if (value === undefined) {
|
|
84
|
+
return { value: 0, label: undefined, isGap: true };
|
|
85
|
+
}
|
|
86
|
+
if (typeof value === "number") {
|
|
87
|
+
return {
|
|
88
|
+
value: isFiniteNumber(value) ? value : 0,
|
|
89
|
+
label: undefined,
|
|
90
|
+
isGap: !isFiniteNumber(value),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const raw = value.value;
|
|
94
|
+
return {
|
|
95
|
+
value: isFiniteNumber(raw) ? raw : 0,
|
|
96
|
+
label: value.label,
|
|
97
|
+
isGap: !isFiniteNumber(raw),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function buildShapePath(points) {
|
|
101
|
+
// Skip gaps by breaking the path into separate closed sub-paths whenever a
|
|
102
|
+
// run of non-gap vertices ends. Wrap around the end/start of the axis list.
|
|
103
|
+
const n = points.length;
|
|
104
|
+
if (n === 0)
|
|
105
|
+
return "";
|
|
106
|
+
// Find the first non-gap so wrapped runs stay contiguous.
|
|
107
|
+
let start = 0;
|
|
108
|
+
while (start < n && points[start].isGap)
|
|
109
|
+
start += 1;
|
|
110
|
+
if (start === n)
|
|
111
|
+
return "";
|
|
112
|
+
const segments = [];
|
|
113
|
+
let current = [];
|
|
114
|
+
for (let i = 0; i < n; i += 1) {
|
|
115
|
+
const p = points[(start + i) % n];
|
|
116
|
+
if (p.isGap) {
|
|
117
|
+
if (current.length > 0) {
|
|
118
|
+
segments.push(current);
|
|
119
|
+
current = [];
|
|
120
|
+
}
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
current.push(p);
|
|
124
|
+
}
|
|
125
|
+
if (current.length > 0)
|
|
126
|
+
segments.push(current);
|
|
127
|
+
// If the shape wraps fully around (no gaps at all), it's a single closed
|
|
128
|
+
// polygon connecting back to the first vertex.
|
|
129
|
+
const allClosed = segments.length === 1 && segments[0].length === n;
|
|
130
|
+
let d = "";
|
|
131
|
+
for (const seg of segments) {
|
|
132
|
+
if (seg.length === 0)
|
|
133
|
+
continue;
|
|
134
|
+
const first = seg[0];
|
|
135
|
+
d += `${d ? " " : ""}M ${first.x.toFixed(2)} ${first.y.toFixed(2)}`;
|
|
136
|
+
for (let i = 1; i < seg.length; i += 1) {
|
|
137
|
+
const p = seg[i];
|
|
138
|
+
d += ` L ${p.x.toFixed(2)} ${p.y.toFixed(2)}`;
|
|
139
|
+
}
|
|
140
|
+
if (allClosed)
|
|
141
|
+
d += " Z";
|
|
142
|
+
}
|
|
143
|
+
return d;
|
|
144
|
+
}
|
|
145
|
+
function buildRingPath(cx, cy, ratio, axesAngles, radius, shape) {
|
|
146
|
+
if (shape === "circle") {
|
|
147
|
+
const r = radius * ratio;
|
|
148
|
+
// Two arcs to draw a full circle in SVG.
|
|
149
|
+
return `M ${(cx + r).toFixed(2)} ${cy.toFixed(2)} A ${r.toFixed(2)} ${r.toFixed(2)} 0 1 1 ${(cx - r).toFixed(2)} ${cy.toFixed(2)} A ${r.toFixed(2)} ${r.toFixed(2)} 0 1 1 ${(cx + r).toFixed(2)} ${cy.toFixed(2)} Z`;
|
|
150
|
+
}
|
|
151
|
+
if (axesAngles.length === 0)
|
|
152
|
+
return "";
|
|
153
|
+
let d = "";
|
|
154
|
+
axesAngles.forEach((angle, idx) => {
|
|
155
|
+
const x = cx + Math.sin(angle) * radius * ratio;
|
|
156
|
+
const y = cy - Math.cos(angle) * radius * ratio;
|
|
157
|
+
d += `${idx === 0 ? "M" : " L"} ${x.toFixed(2)} ${y.toFixed(2)}`;
|
|
158
|
+
});
|
|
159
|
+
return `${d} Z`;
|
|
160
|
+
}
|
|
161
|
+
function RadarChart({ axes, series, label, size, diameter, min = 0, max, startAngle = 0, gridLevels = 4, gridShape = "polygon", showAxis = true, showAxisLabels = true, showBoundary = true, area = true, showPoints = false, showValueLabels = false, valueLabelFormatter, onPointClick, children, className, overlayClassName, axisLabelClassName, valueLabelClassName, gridClassName, ref, ...props }) {
|
|
162
|
+
const resolvedSize = size ?? "md";
|
|
163
|
+
const D = diameter ?? SIZE_TO_PIXELS[resolvedSize];
|
|
164
|
+
const titleId = useId();
|
|
165
|
+
const axisLabelGutter = showAxisLabels ? 44 : 8;
|
|
166
|
+
const radius = Math.max(0, D / 2 - axisLabelGutter / 2);
|
|
167
|
+
const cx = D / 2;
|
|
168
|
+
const cy = D / 2;
|
|
169
|
+
const axisCount = axes.length;
|
|
170
|
+
const hasAxes = axisCount >= 3;
|
|
171
|
+
const hasSeries = series.length > 0;
|
|
172
|
+
// Compute a chart-level max fallback from data.
|
|
173
|
+
const dataMax = (() => {
|
|
174
|
+
let m = Number.NEGATIVE_INFINITY;
|
|
175
|
+
for (const s of series) {
|
|
176
|
+
for (const raw of s.values) {
|
|
177
|
+
const n = normalizeValue(raw);
|
|
178
|
+
if (!n.isGap && n.value > m)
|
|
179
|
+
m = n.value;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return Number.isFinite(m) ? m : 1;
|
|
183
|
+
})();
|
|
184
|
+
const effectiveMax = isFiniteNumber(max) ? max : dataMax;
|
|
185
|
+
const startAngleRad = (startAngle * Math.PI) / 180;
|
|
186
|
+
const resolvedAxes = axes.map((axis, idx) => {
|
|
187
|
+
const angle = startAngleRad + (idx * (2 * Math.PI)) / Math.max(1, axisCount);
|
|
188
|
+
const axisMin = isFiniteNumber(axis.min) ? axis.min : min;
|
|
189
|
+
const axisMax = isFiniteNumber(axis.max) ? axis.max : effectiveMax;
|
|
190
|
+
return {
|
|
191
|
+
axis,
|
|
192
|
+
angle,
|
|
193
|
+
min: axisMin,
|
|
194
|
+
max: axisMax,
|
|
195
|
+
tipX: cx + Math.sin(angle) * radius,
|
|
196
|
+
tipY: cy - Math.cos(angle) * radius,
|
|
197
|
+
};
|
|
198
|
+
});
|
|
199
|
+
const axesAngles = resolvedAxes.map((a) => a.angle);
|
|
200
|
+
const resolvedSeries = series.map((s, seriesIndex) => {
|
|
201
|
+
const color = s.color ??
|
|
202
|
+
DEFAULT_COLOR_ROTATION[seriesIndex % DEFAULT_COLOR_ROTATION.length];
|
|
203
|
+
const seriesShowPoints = s.showPoints ?? showPoints;
|
|
204
|
+
const seriesArea = s.area ?? area;
|
|
205
|
+
const points = resolvedAxes.map((ra, axisIndex) => {
|
|
206
|
+
const raw = s.values[axisIndex];
|
|
207
|
+
const norm = normalizeValue(raw);
|
|
208
|
+
const span = ra.max - ra.min > 0 ? ra.max - ra.min : 1;
|
|
209
|
+
const clamped = Math.max(0, Math.min(1, (norm.value - ra.min) / span));
|
|
210
|
+
const r = norm.isGap ? 0 : clamped * radius;
|
|
211
|
+
return {
|
|
212
|
+
axisIndex,
|
|
213
|
+
value: norm.value,
|
|
214
|
+
label: norm.label,
|
|
215
|
+
isGap: norm.isGap,
|
|
216
|
+
x: cx + Math.sin(ra.angle) * r,
|
|
217
|
+
y: cy - Math.cos(ra.angle) * r,
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
return {
|
|
221
|
+
series: s,
|
|
222
|
+
color,
|
|
223
|
+
points,
|
|
224
|
+
showPoints: seriesShowPoints,
|
|
225
|
+
area: seriesArea,
|
|
226
|
+
};
|
|
227
|
+
});
|
|
228
|
+
const gridRatios = (() => {
|
|
229
|
+
if (gridLevels <= 0)
|
|
230
|
+
return [];
|
|
231
|
+
const out = [];
|
|
232
|
+
for (let i = 1; i <= gridLevels; i += 1) {
|
|
233
|
+
out.push(i / (gridLevels + 1));
|
|
234
|
+
}
|
|
235
|
+
return out;
|
|
236
|
+
})();
|
|
237
|
+
return (_jsxs("div", { ref: ref, role: "img", "aria-labelledby": titleId, "data-slot": "radar-chart", className: cn(radarChartVariants({ size }), className), style: { width: D, height: D }, ...props, children: [_jsxs("svg", { width: D, height: D, viewBox: `0 0 ${D} ${D}`, "aria-hidden": children ? "true" : undefined, className: "h-full w-full overflow-visible", children: [_jsx("title", { id: titleId, children: label }), !hasAxes ? (_jsx("text", { x: D / 2, y: D / 2, textAnchor: "middle", dominantBaseline: "central", className: "fill-muted-foreground", children: axisCount === 0 ? "No axes" : "Need ≥3 axes" })) : (_jsxs(_Fragment, { children: [gridRatios.length > 0 ? (_jsx("g", { "aria-hidden": "true", "data-slot": "radar-chart-grid", className: "pointer-events-none", children: gridRatios.map((r) => (_jsx("path", { d: buildRingPath(cx, cy, r, axesAngles, radius, gridShape), fill: "none", strokeWidth: 1, className: cn("stroke-border/60", gridClassName) }, `grid-${r}`))) })) : null, showBoundary ? (_jsx("path", { "aria-hidden": "true", "data-slot": "radar-chart-boundary", d: buildRingPath(cx, cy, 1, axesAngles, radius, gridShape), fill: "none", strokeWidth: 1, className: cn("stroke-border", gridClassName) })) : null, showAxis ? (_jsx("g", { "aria-hidden": "true", "data-slot": "radar-chart-axes", className: "pointer-events-none", children: resolvedAxes.map((ra) => (_jsx("line", { x1: cx, y1: cy, x2: ra.tipX, y2: ra.tipY, strokeWidth: 1, className: cn("stroke-border", gridClassName) }, `axis-${ra.axis.id}`))) })) : null, hasSeries ? (resolvedSeries.map((rs) => {
|
|
238
|
+
const strokeWidth = rs.series.strokeWidth ?? 2;
|
|
239
|
+
const shapePath = buildShapePath(rs.points);
|
|
240
|
+
const strokeClass = rs.series.stroke
|
|
241
|
+
? undefined
|
|
242
|
+
: STROKE_CLASSES[rs.color];
|
|
243
|
+
const fillClass = rs.series.stroke
|
|
244
|
+
? undefined
|
|
245
|
+
: FILL_CLASSES[rs.color];
|
|
246
|
+
const textClass = rs.series.stroke
|
|
247
|
+
? undefined
|
|
248
|
+
: TEXT_CLASSES[rs.color];
|
|
249
|
+
const fillOpacity = rs.series.fillOpacity ?? 0.2;
|
|
250
|
+
return (_jsxs("g", { "data-slot": "radar-chart-series", "data-series-id": rs.series.id, children: [rs.area && shapePath !== "" ? (_jsx("path", { d: shapePath, stroke: "none", fill: rs.series.stroke ?? "currentColor", fillOpacity: fillOpacity, className: cn(fillClass, "pointer-events-none") })) : null, shapePath !== "" ? (_jsx("path", { d: shapePath, fill: "none", stroke: rs.series.stroke, strokeWidth: strokeWidth, strokeLinecap: "round", strokeLinejoin: "round", strokeDasharray: rs.series.strokeDasharray, className: cn(strokeClass, rs.series.className) })) : null, rs.showPoints
|
|
251
|
+
? rs.points.map((rp) => {
|
|
252
|
+
if (rp.isGap)
|
|
253
|
+
return null;
|
|
254
|
+
const ra = resolvedAxes[rp.axisIndex];
|
|
255
|
+
const handler = rs.series.onPointClick ?? onPointClick;
|
|
256
|
+
const isInteractive = typeof handler === "function";
|
|
257
|
+
const pointLabel = rp.label ??
|
|
258
|
+
`${rs.series.label ?? rs.series.id} – ${ra.axis.label ?? ra.axis.id}: ${rp.value}`;
|
|
259
|
+
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-axis-id": ra.axis.id, role: isInteractive ? "button" : undefined, tabIndex: isInteractive ? 0 : undefined, "aria-label": pointLabel, onClick: isInteractive
|
|
260
|
+
? (event) => {
|
|
261
|
+
handler(ra.axis, rp.value, rs.series, event);
|
|
262
|
+
}
|
|
263
|
+
: undefined, onKeyDown: isInteractive
|
|
264
|
+
? (event) => {
|
|
265
|
+
if (event.key === "Enter" ||
|
|
266
|
+
event.key === " ") {
|
|
267
|
+
event.preventDefault();
|
|
268
|
+
handler(ra.axis, rp.value, rs.series, event);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
: undefined, className: cn("transition-opacity", rs.series.stroke ? undefined : fillClass, isInteractive &&
|
|
272
|
+
"cursor-pointer hover:opacity-80 focus:outline-none focus-visible:opacity-80") }, `${rs.series.id}-${ra.axis.id}`));
|
|
273
|
+
})
|
|
274
|
+
: null, showValueLabels
|
|
275
|
+
? rs.points.map((rp) => {
|
|
276
|
+
if (rp.isGap)
|
|
277
|
+
return null;
|
|
278
|
+
const ra = resolvedAxes[rp.axisIndex];
|
|
279
|
+
const text = valueLabelFormatter
|
|
280
|
+
? valueLabelFormatter({
|
|
281
|
+
series: rs.series,
|
|
282
|
+
axis: ra.axis,
|
|
283
|
+
value: rp.value,
|
|
284
|
+
axisIndex: rp.axisIndex,
|
|
285
|
+
})
|
|
286
|
+
: String(rp.value);
|
|
287
|
+
if (text === null || text === "")
|
|
288
|
+
return null;
|
|
289
|
+
// Offset the label a couple pixels outward from the
|
|
290
|
+
// vertex so it doesn't collide with the point marker.
|
|
291
|
+
const dx = Math.sin(ra.angle);
|
|
292
|
+
const dy = -Math.cos(ra.angle);
|
|
293
|
+
const offset = 8;
|
|
294
|
+
return (_jsx("text", { x: rp.x + dx * offset, y: rp.y + dy * offset, textAnchor: "middle", dominantBaseline: "central", className: cn("pointer-events-none select-none fill-foreground font-medium", textClass, valueLabelClassName), children: text }, `${rs.series.id}-${ra.axis.id}-val`));
|
|
295
|
+
})
|
|
296
|
+
: null] }, rs.series.id));
|
|
297
|
+
})) : null, showAxisLabels ? (_jsx("g", { "aria-hidden": "true", "data-slot": "radar-chart-axis-labels", className: "pointer-events-none select-none", children: resolvedAxes.map((ra) => {
|
|
298
|
+
const text = ra.axis.label ?? ra.axis.id;
|
|
299
|
+
const dx = Math.sin(ra.angle);
|
|
300
|
+
const dy = -Math.cos(ra.angle);
|
|
301
|
+
const labelOffset = 12;
|
|
302
|
+
const lx = ra.tipX + dx * labelOffset;
|
|
303
|
+
const ly = ra.tipY + dy * labelOffset;
|
|
304
|
+
// Anchor the label so it doesn't overrun the axis tip.
|
|
305
|
+
const textAnchor = dx > 0.15 ? "start" : dx < -0.15 ? "end" : "middle";
|
|
306
|
+
const dominantBaseline = dy > 0.15 ? "auto" : dy < -0.15 ? "hanging" : "middle";
|
|
307
|
+
return (_jsx("text", { x: lx, y: ly, textAnchor: textAnchor, dominantBaseline: dominantBaseline, className: cn("fill-muted-foreground", axisLabelClassName), children: text }, `label-${ra.axis.id}`));
|
|
308
|
+
}) })) : null] }))] }), children ? (_jsx("div", { className: cn("pointer-events-none absolute inset-0 flex items-center justify-center text-center", overlayClassName), children: children })) : null] }));
|
|
309
|
+
}
|
|
310
|
+
RadarChart.displayName = "RadarChart";
|
|
311
|
+
export { RadarChart };
|
|
312
|
+
//# sourceMappingURL=radar-chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radar-chart.js","sourceRoot":"","sources":["../../../../src/components/ui/radar-chart/radar-chart.tsx"],"names":[],"mappings":"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"}
|