@schemavaults/ui 0.41.1 → 0.43.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/gauge/gauge.d.ts +73 -0
- package/dist/components/ui/gauge/gauge.js +134 -0
- package/dist/components/ui/gauge/gauge.js.map +1 -0
- package/dist/components/ui/gauge/index.d.ts +3 -0
- package/dist/components/ui/gauge/index.js +3 -0
- package/dist/components/ui/gauge/index.js.map +1 -0
- 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/pie-chart/index.d.ts +3 -0
- package/dist/components/ui/pie-chart/index.js +3 -0
- package/dist/components/ui/pie-chart/index.js.map +1 -0
- package/dist/components/ui/pie-chart/pie-chart.d.ts +91 -0
- package/dist/components/ui/pie-chart/pie-chart.js +192 -0
- package/dist/components/ui/pie-chart/pie-chart.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import type { HTMLAttributes, ReactElement, ReactNode } from "react";
|
|
3
|
+
export declare const gaugeSizeIds: readonly ["sm", "default", "lg", "xl"];
|
|
4
|
+
export type GaugeSizeId = (typeof gaugeSizeIds)[number];
|
|
5
|
+
export declare const gaugeColorIds: readonly ["default", "positive", "warning", "destructive"];
|
|
6
|
+
export type GaugeColorId = (typeof gaugeColorIds)[number];
|
|
7
|
+
export declare const gaugeVariants: (props?: ({
|
|
8
|
+
size?: "sm" | "default" | "lg" | "xl" | null | undefined;
|
|
9
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
10
|
+
export declare const gaugeIndicatorVariants: (props?: ({
|
|
11
|
+
color?: "default" | "destructive" | "warning" | "positive" | null | undefined;
|
|
12
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
13
|
+
export declare const gaugeValueLabelVariants: (props?: ({
|
|
14
|
+
size?: "sm" | "default" | "lg" | "xl" | null | undefined;
|
|
15
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
16
|
+
/**
|
|
17
|
+
* A single color zone painted along the gauge arc.
|
|
18
|
+
*
|
|
19
|
+
* Zones are rendered in order, each filling the portion of the arc between
|
|
20
|
+
* `from` and `to` (both expressed in the gauge's value space, not as
|
|
21
|
+
* percentages — they are normalized against the gauge's `min`/`max`).
|
|
22
|
+
*/
|
|
23
|
+
export interface GaugeZone {
|
|
24
|
+
/** Start of the zone, in the gauge's value space. */
|
|
25
|
+
from: number;
|
|
26
|
+
/** End of the zone, in the gauge's value space. */
|
|
27
|
+
to: number;
|
|
28
|
+
/** One of the standard gauge colors. */
|
|
29
|
+
color: GaugeColorId;
|
|
30
|
+
}
|
|
31
|
+
export interface GaugeProps extends Omit<HTMLAttributes<HTMLDivElement>, "role" | "color">, VariantProps<typeof gaugeVariants>, VariantProps<typeof gaugeIndicatorVariants> {
|
|
32
|
+
/** Current value (clamped to [min, max]). */
|
|
33
|
+
value: number;
|
|
34
|
+
/** Accessible label describing what the gauge represents. */
|
|
35
|
+
label: string;
|
|
36
|
+
/** Minimum value (defaults to 0). */
|
|
37
|
+
min?: number;
|
|
38
|
+
/** Maximum value (defaults to 100). */
|
|
39
|
+
max?: number;
|
|
40
|
+
/** Override the SVG stroke width. Defaults are size-aware. */
|
|
41
|
+
strokeWidth?: number;
|
|
42
|
+
/** When true (default), shows the numeric value below the arc. */
|
|
43
|
+
showValue?: boolean;
|
|
44
|
+
/** When true, render min/max tick labels below the arc endpoints. */
|
|
45
|
+
showRange?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Optional color zones rendered behind the indicator. Use to highlight
|
|
48
|
+
* acceptable / warning / danger ranges (e.g. CPU thresholds).
|
|
49
|
+
*/
|
|
50
|
+
zones?: ReadonlyArray<GaugeZone>;
|
|
51
|
+
/**
|
|
52
|
+
* When true and `zones` is provided, the indicator + value label color is
|
|
53
|
+
* automatically chosen from whichever zone contains the current value,
|
|
54
|
+
* overriding the `color` prop.
|
|
55
|
+
*/
|
|
56
|
+
autoColorFromZones?: boolean;
|
|
57
|
+
/** When true (default), render a needle indicator on top of the arc. */
|
|
58
|
+
showNeedle?: boolean;
|
|
59
|
+
/** When provided, displayed beneath the value (e.g. "ms", "%", "req/s"). */
|
|
60
|
+
unit?: string;
|
|
61
|
+
/** Custom content rendered beneath the arc, replacing the default value display. */
|
|
62
|
+
children?: ReactNode;
|
|
63
|
+
/** Additional classes for the indicator (animated) arc. */
|
|
64
|
+
indicatorClassName?: string;
|
|
65
|
+
/** Additional classes for the track (background) arc. */
|
|
66
|
+
trackClassName?: string;
|
|
67
|
+
/** Additional classes for the value label. */
|
|
68
|
+
valueLabelClassName?: string;
|
|
69
|
+
}
|
|
70
|
+
export declare function Gauge({ value, label, min, max, size, color, strokeWidth, showValue, showRange, showNeedle, zones, autoColorFromZones, unit, children, className, indicatorClassName, trackClassName, valueLabelClassName, ...props }: GaugeProps): ReactElement;
|
|
71
|
+
export declare namespace Gauge {
|
|
72
|
+
var displayName: string;
|
|
73
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
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 { m } from "../../../framer-motion";
|
|
5
|
+
import { cn } from "../../../lib/utils";
|
|
6
|
+
export const gaugeSizeIds = ["sm", "default", "lg", "xl"];
|
|
7
|
+
export const gaugeColorIds = [
|
|
8
|
+
"default",
|
|
9
|
+
"positive",
|
|
10
|
+
"warning",
|
|
11
|
+
"destructive",
|
|
12
|
+
];
|
|
13
|
+
export const gaugeVariants = cva("relative inline-flex shrink-0 flex-col items-center justify-end", {
|
|
14
|
+
variants: {
|
|
15
|
+
size: {
|
|
16
|
+
sm: "w-32",
|
|
17
|
+
default: "w-48",
|
|
18
|
+
lg: "w-64",
|
|
19
|
+
xl: "w-80",
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
defaultVariants: {
|
|
23
|
+
size: "default",
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
export const gaugeIndicatorVariants = cva("transition-colors duration-300", {
|
|
27
|
+
variants: {
|
|
28
|
+
color: {
|
|
29
|
+
default: "stroke-schemavaults-brand-blue",
|
|
30
|
+
positive: "stroke-emerald-500 dark:stroke-emerald-400",
|
|
31
|
+
warning: "stroke-warning",
|
|
32
|
+
destructive: "stroke-destructive",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
defaultVariants: {
|
|
36
|
+
color: "default",
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const gaugeNeedleVariants = cva("transition-colors duration-300", {
|
|
40
|
+
variants: {
|
|
41
|
+
color: {
|
|
42
|
+
default: "fill-foreground stroke-foreground",
|
|
43
|
+
positive: "fill-emerald-500 stroke-emerald-500 dark:fill-emerald-400 dark:stroke-emerald-400",
|
|
44
|
+
warning: "fill-warning stroke-warning",
|
|
45
|
+
destructive: "fill-destructive stroke-destructive",
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
defaultVariants: {
|
|
49
|
+
color: "default",
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
export const gaugeValueLabelVariants = cva("font-semibold tabular-nums leading-none text-foreground", {
|
|
53
|
+
variants: {
|
|
54
|
+
size: {
|
|
55
|
+
sm: "text-base",
|
|
56
|
+
default: "text-2xl",
|
|
57
|
+
lg: "text-3xl",
|
|
58
|
+
xl: "text-4xl",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
defaultVariants: {
|
|
62
|
+
size: "default",
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
const SIZE_TO_STROKE_WIDTH = {
|
|
66
|
+
sm: 12,
|
|
67
|
+
default: 14,
|
|
68
|
+
lg: 16,
|
|
69
|
+
xl: 18,
|
|
70
|
+
};
|
|
71
|
+
const VIEWBOX_WIDTH = 200;
|
|
72
|
+
const ARC_RADIUS = 80;
|
|
73
|
+
const ARC_CENTER_X = 100;
|
|
74
|
+
const ARC_CENTER_Y = 100;
|
|
75
|
+
const ARC_START_X = ARC_CENTER_X - ARC_RADIUS;
|
|
76
|
+
const ARC_END_X = ARC_CENTER_X + ARC_RADIUS;
|
|
77
|
+
const ARC_PATH = `M ${ARC_START_X} ${ARC_CENTER_Y} A ${ARC_RADIUS} ${ARC_RADIUS} 0 0 1 ${ARC_END_X} ${ARC_CENTER_Y}`;
|
|
78
|
+
const ZONE_STROKE_CLASSES = {
|
|
79
|
+
default: "stroke-schemavaults-brand-blue/60",
|
|
80
|
+
positive: "stroke-emerald-500/60 dark:stroke-emerald-400/60",
|
|
81
|
+
warning: "stroke-warning/70",
|
|
82
|
+
destructive: "stroke-destructive/60",
|
|
83
|
+
};
|
|
84
|
+
function clampValue(value, min, max) {
|
|
85
|
+
return Math.min(max, Math.max(min, value));
|
|
86
|
+
}
|
|
87
|
+
function valueToPercentage(value, min, max) {
|
|
88
|
+
if (max === min) {
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
return ((value - min) / (max - min)) * 100;
|
|
92
|
+
}
|
|
93
|
+
function valueToNeedleAngle(percentage) {
|
|
94
|
+
// Map 0% → -90deg (pointing left) and 100% → +90deg (pointing right),
|
|
95
|
+
// so the needle rotates through the top of the dial.
|
|
96
|
+
return -90 + (percentage / 100) * 180;
|
|
97
|
+
}
|
|
98
|
+
function resolveAutoColor(value, zones, fallback) {
|
|
99
|
+
if (!zones || zones.length === 0) {
|
|
100
|
+
return fallback;
|
|
101
|
+
}
|
|
102
|
+
for (const zone of zones) {
|
|
103
|
+
const lo = Math.min(zone.from, zone.to);
|
|
104
|
+
const hi = Math.max(zone.from, zone.to);
|
|
105
|
+
if (value >= lo && value <= hi) {
|
|
106
|
+
return zone.color;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return fallback;
|
|
110
|
+
}
|
|
111
|
+
export function Gauge({ value, label, min = 0, max = 100, size, color, strokeWidth, showValue = true, showRange = false, showNeedle = true, zones, autoColorFromZones = false, unit, children, className, indicatorClassName, trackClassName, valueLabelClassName, ...props }) {
|
|
112
|
+
const resolvedSize = size ?? "default";
|
|
113
|
+
const resolvedStrokeWidth = strokeWidth ?? SIZE_TO_STROKE_WIDTH[resolvedSize];
|
|
114
|
+
const clamped = clampValue(value, min, max);
|
|
115
|
+
const percentage = valueToPercentage(clamped, min, max);
|
|
116
|
+
const fallbackColor = color ?? "default";
|
|
117
|
+
const indicatorColor = autoColorFromZones
|
|
118
|
+
? resolveAutoColor(clamped, zones, fallbackColor)
|
|
119
|
+
: fallbackColor;
|
|
120
|
+
const needleAngle = valueToNeedleAngle(percentage);
|
|
121
|
+
return (_jsxs("div", { role: "meter", "aria-valuenow": clamped, "aria-valuemin": min, "aria-valuemax": max, "aria-label": label, className: cn(gaugeVariants({ size }), className), ...props, children: [_jsxs("svg", { viewBox: `0 0 ${VIEWBOX_WIDTH} ${ARC_CENTER_Y + resolvedStrokeWidth + 4}`, className: "w-full", "aria-hidden": "true", children: [_jsx("path", { d: ARC_PATH, fill: "none", strokeWidth: resolvedStrokeWidth, strokeLinecap: "round", className: cn("stroke-secondary", trackClassName), pathLength: 1 }), zones?.map((zone, index) => {
|
|
122
|
+
const zoneLo = clampValue(Math.min(zone.from, zone.to), min, max);
|
|
123
|
+
const zoneHi = clampValue(Math.max(zone.from, zone.to), min, max);
|
|
124
|
+
const startPct = valueToPercentage(zoneLo, min, max) / 100;
|
|
125
|
+
const endPct = valueToPercentage(zoneHi, min, max) / 100;
|
|
126
|
+
const span = Math.max(0, endPct - startPct);
|
|
127
|
+
if (span === 0) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
return (_jsx("path", { d: ARC_PATH, fill: "none", strokeWidth: resolvedStrokeWidth, strokeLinecap: "butt", pathLength: 1, strokeDasharray: `${span} ${1 - span}`, strokeDashoffset: -startPct, className: ZONE_STROKE_CLASSES[zone.color] }, `zone-${index.toString()}`));
|
|
131
|
+
}), _jsx(m.path, { d: ARC_PATH, fill: "none", strokeWidth: resolvedStrokeWidth, strokeLinecap: "round", pathLength: 1, strokeDasharray: 1, initial: { strokeDashoffset: 1 }, animate: { strokeDashoffset: 1 - percentage / 100 }, transition: { duration: 0.5, ease: "easeOut" }, className: cn(gaugeIndicatorVariants({ color: indicatorColor }), indicatorClassName) }), showNeedle && (_jsxs(m.g, { initial: { rotate: valueToNeedleAngle(0) }, animate: { rotate: needleAngle }, transition: { duration: 0.5, ease: "easeOut" }, style: { transformOrigin: `${ARC_CENTER_X}px ${ARC_CENTER_Y}px` }, children: [_jsx("line", { x1: ARC_CENTER_X, y1: ARC_CENTER_Y, x2: ARC_CENTER_X, y2: ARC_CENTER_Y - (ARC_RADIUS - resolvedStrokeWidth / 2 - 2), strokeWidth: 3, strokeLinecap: "round", className: gaugeNeedleVariants({ color: indicatorColor }) }), _jsx("circle", { cx: ARC_CENTER_X, cy: ARC_CENTER_Y, r: 6, className: cn(gaugeNeedleVariants({ color: indicatorColor }), "stroke-background"), strokeWidth: 2 })] }))] }), showRange && (_jsxs("div", { className: "flex w-[88%] justify-between text-xs tabular-nums text-muted-foreground -mt-1", children: [_jsx("span", { children: min }), _jsx("span", { children: max })] })), (children || showValue) && (_jsx("div", { className: cn("mt-1 flex flex-col items-center gap-0.5", valueLabelClassName), children: children ?? (_jsxs(_Fragment, { children: [_jsx("span", { className: gaugeValueLabelVariants({ size: resolvedSize }), children: Math.round(clamped) }), unit && (_jsx("span", { className: "text-xs uppercase tracking-wide text-muted-foreground", children: unit }))] })) }))] }));
|
|
132
|
+
}
|
|
133
|
+
Gauge.displayName = "Gauge";
|
|
134
|
+
//# sourceMappingURL=gauge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gauge.js","sourceRoot":"","sources":["../../../../src/components/ui/gauge/gauge.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ui/gauge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -104,6 +104,8 @@ export * from "./progress-bar";
|
|
|
104
104
|
export type * from "./progress-bar";
|
|
105
105
|
export * from "./circular-progress";
|
|
106
106
|
export type * from "./circular-progress";
|
|
107
|
+
export * from "./gauge";
|
|
108
|
+
export type * from "./gauge";
|
|
107
109
|
export * from "./breadcrumb";
|
|
108
110
|
export type * from "./breadcrumb";
|
|
109
111
|
export * from "./pagination";
|
|
@@ -148,3 +150,5 @@ export * from "./color-swatch";
|
|
|
148
150
|
export type * from "./color-swatch";
|
|
149
151
|
export * from "./calendar-heatmap";
|
|
150
152
|
export type * from "./calendar-heatmap";
|
|
153
|
+
export * from "./pie-chart";
|
|
154
|
+
export type * from "./pie-chart";
|
|
@@ -51,6 +51,7 @@ export * from "./slider";
|
|
|
51
51
|
export * from "./switch";
|
|
52
52
|
export * from "./progress-bar";
|
|
53
53
|
export * from "./circular-progress";
|
|
54
|
+
export * from "./gauge";
|
|
54
55
|
export * from "./breadcrumb";
|
|
55
56
|
export * from "./pagination";
|
|
56
57
|
export * from "./kbd";
|
|
@@ -73,4 +74,5 @@ export * from "./sparkline";
|
|
|
73
74
|
export * from "./aspect-ratio";
|
|
74
75
|
export * from "./color-swatch";
|
|
75
76
|
export * from "./calendar-heatmap";
|
|
77
|
+
export * from "./pie-chart";
|
|
76
78
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AAGzB,cAAc,aAAa,CAAC;AAG5B,cAAc,SAAS,CAAC;AAGxB,cAAc,WAAW,CAAC;AAG1B,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,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,WAAW,CAAC;AAG1B,cAAc,WAAW,CAAC;AAG1B,cAAc,YAAY,CAAC;AAG3B,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,kBAAkB,CAAC;AAGjC,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,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,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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AAGzB,cAAc,aAAa,CAAC;AAG5B,cAAc,SAAS,CAAC;AAGxB,cAAc,WAAW,CAAC;AAG1B,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,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,WAAW,CAAC;AAG1B,cAAc,WAAW,CAAC;AAG1B,cAAc,YAAY,CAAC;AAG3B,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,kBAAkB,CAAC;AAGjC,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,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,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ui/pie-chart/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import type { HTMLAttributes, KeyboardEvent, MouseEvent, ReactElement, ReactNode, Ref } from "react";
|
|
3
|
+
export declare const pieChartSizeIds: ["sm", "md", "lg", "xl"];
|
|
4
|
+
export type PieChartSizeId = (typeof pieChartSizeIds)[number];
|
|
5
|
+
export declare const pieChartSegmentColorIds: ["default", "primary", "positive", "warning", "destructive", "muted"];
|
|
6
|
+
export type PieChartSegmentColorId = (typeof pieChartSegmentColorIds)[number];
|
|
7
|
+
export declare const pieChartVariants: (props?: ({
|
|
8
|
+
size?: "sm" | "lg" | "xl" | "md" | null | undefined;
|
|
9
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
10
|
+
export interface PieChartSegment {
|
|
11
|
+
/** Stable identifier for the segment. Used as React key and click payload. */
|
|
12
|
+
id: string;
|
|
13
|
+
/**
|
|
14
|
+
* Relative size of the segment. Segment angle is `value / sum(values)`.
|
|
15
|
+
* Non-positive values are skipped.
|
|
16
|
+
*/
|
|
17
|
+
value: number;
|
|
18
|
+
/** Optional human-readable label exposed via `aria-label` and tooltips. */
|
|
19
|
+
label?: string;
|
|
20
|
+
/** Preset color id from the chart palette. Ignored if `fill` is provided. */
|
|
21
|
+
color?: PieChartSegmentColorId;
|
|
22
|
+
/**
|
|
23
|
+
* Override the fill with a raw CSS color (e.g. `"#ff0080"` or
|
|
24
|
+
* `"hsl(var(--chart-1))"`). Takes precedence over `color`.
|
|
25
|
+
*/
|
|
26
|
+
fill?: string;
|
|
27
|
+
/** Extra classes applied to this segment's `<path>`. */
|
|
28
|
+
className?: string;
|
|
29
|
+
/** Fired when this segment is clicked or activated via keyboard. */
|
|
30
|
+
onClick?: (segment: PieChartSegment, event: MouseEvent<SVGPathElement> | KeyboardEvent<SVGPathElement>) => void;
|
|
31
|
+
}
|
|
32
|
+
export interface PieChartProps extends Omit<HTMLAttributes<HTMLDivElement>, "onClick">, VariantProps<typeof pieChartVariants> {
|
|
33
|
+
/** Segments to render, in order (clockwise from 12 o'clock). */
|
|
34
|
+
segments: ReadonlyArray<PieChartSegment>;
|
|
35
|
+
/** Accessible label describing what the chart represents. */
|
|
36
|
+
label: string;
|
|
37
|
+
/**
|
|
38
|
+
* Inner radius as a fraction of the outer radius (0–1). `0` is a solid pie,
|
|
39
|
+
* values like `0.55` produce a donut. Defaults to `0`.
|
|
40
|
+
*/
|
|
41
|
+
innerRadius?: number;
|
|
42
|
+
/** Override the rendered diameter in pixels (defaults are size-aware). */
|
|
43
|
+
diameter?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Width of the divider stroke between segments. Defaults to `1`. Set to `0`
|
|
46
|
+
* to remove the divider.
|
|
47
|
+
*/
|
|
48
|
+
segmentGap?: number;
|
|
49
|
+
/**
|
|
50
|
+
* Fallback handler invoked for any segment that doesn't have its own
|
|
51
|
+
* `onClick`. Receives the clicked segment.
|
|
52
|
+
*/
|
|
53
|
+
onSegmentClick?: (segment: PieChartSegment, event: MouseEvent<SVGPathElement> | KeyboardEvent<SVGPathElement>) => void;
|
|
54
|
+
/** Optional content rendered in the center of the chart (useful for donuts). */
|
|
55
|
+
children?: ReactNode;
|
|
56
|
+
/** Extra classes for the centered content wrapper. */
|
|
57
|
+
centerClassName?: string;
|
|
58
|
+
/**
|
|
59
|
+
* When true, renders each segment's `label` inside the slice. Use
|
|
60
|
+
* `segmentLabelFormatter` to customize the displayed string (e.g. show a
|
|
61
|
+
* percentage instead of the raw label).
|
|
62
|
+
*/
|
|
63
|
+
showSegmentLabels?: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Customize the in-segment label text. Return `null` to skip a segment.
|
|
66
|
+
* Defaults to `segment.label ?? segment.id`.
|
|
67
|
+
*/
|
|
68
|
+
segmentLabelFormatter?: (params: {
|
|
69
|
+
segment: PieChartSegment;
|
|
70
|
+
value: number;
|
|
71
|
+
/** Share of the total, in the range 0–1. */
|
|
72
|
+
fraction: number;
|
|
73
|
+
/** Share of the total, in the range 0–100. */
|
|
74
|
+
percentage: number;
|
|
75
|
+
index: number;
|
|
76
|
+
}) => string | null;
|
|
77
|
+
/**
|
|
78
|
+
* Minimum segment sweep (in radians) required to render its label. Smaller
|
|
79
|
+
* segments are skipped to avoid overlap. Defaults to ~11.5° (0.2 rad).
|
|
80
|
+
*/
|
|
81
|
+
minSegmentLabelAngle?: number;
|
|
82
|
+
/** Extra classes applied to every segment-label `<text>` element. */
|
|
83
|
+
segmentLabelClassName?: string;
|
|
84
|
+
/** Optional ref forwarded to the wrapper element. */
|
|
85
|
+
ref?: Ref<HTMLDivElement>;
|
|
86
|
+
}
|
|
87
|
+
declare function PieChart({ segments, label, size, innerRadius, diameter, segmentGap, onSegmentClick, children, className, centerClassName, showSegmentLabels, segmentLabelFormatter, minSegmentLabelAngle, segmentLabelClassName, ref, ...props }: PieChartProps): ReactElement;
|
|
88
|
+
declare namespace PieChart {
|
|
89
|
+
var displayName: string;
|
|
90
|
+
}
|
|
91
|
+
export { PieChart };
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } 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 pieChartSizeIds = [
|
|
7
|
+
"sm",
|
|
8
|
+
"md",
|
|
9
|
+
"lg",
|
|
10
|
+
"xl",
|
|
11
|
+
];
|
|
12
|
+
export const pieChartSegmentColorIds = [
|
|
13
|
+
"default",
|
|
14
|
+
"primary",
|
|
15
|
+
"positive",
|
|
16
|
+
"warning",
|
|
17
|
+
"destructive",
|
|
18
|
+
"muted",
|
|
19
|
+
];
|
|
20
|
+
const SIZE_TO_PIXELS = {
|
|
21
|
+
sm: 96,
|
|
22
|
+
md: 160,
|
|
23
|
+
lg: 224,
|
|
24
|
+
xl: 320,
|
|
25
|
+
};
|
|
26
|
+
const SEGMENT_FILL_CLASSES = {
|
|
27
|
+
default: "fill-schemavaults-brand-blue",
|
|
28
|
+
primary: "fill-primary",
|
|
29
|
+
positive: "fill-emerald-500 dark:fill-emerald-400",
|
|
30
|
+
warning: "fill-warning",
|
|
31
|
+
destructive: "fill-destructive",
|
|
32
|
+
muted: "fill-muted-foreground",
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Fallback color rotation when a segment doesn't specify its own color. Index
|
|
36
|
+
* is the segment position in the input array, modulo the palette length.
|
|
37
|
+
*/
|
|
38
|
+
const DEFAULT_COLOR_ROTATION = [
|
|
39
|
+
"default",
|
|
40
|
+
"positive",
|
|
41
|
+
"warning",
|
|
42
|
+
"destructive",
|
|
43
|
+
"primary",
|
|
44
|
+
"muted",
|
|
45
|
+
];
|
|
46
|
+
export const pieChartVariants = cva("relative inline-flex shrink-0 items-center justify-center", {
|
|
47
|
+
variants: {
|
|
48
|
+
size: {
|
|
49
|
+
sm: "h-24 w-24",
|
|
50
|
+
md: "h-40 w-40",
|
|
51
|
+
lg: "h-56 w-56",
|
|
52
|
+
xl: "h-80 w-80",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
defaultVariants: {
|
|
56
|
+
size: "md",
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
/** Convert a polar coordinate (angle in radians, measured from 12 o'clock,
|
|
60
|
+
* clockwise) into an SVG cartesian point. */
|
|
61
|
+
function polarToCartesian(cx, cy, radius, angle) {
|
|
62
|
+
// -π/2 rotates so 0 rad sits at the top of the circle.
|
|
63
|
+
const a = angle - Math.PI / 2;
|
|
64
|
+
return [cx + radius * Math.cos(a), cy + radius * Math.sin(a)];
|
|
65
|
+
}
|
|
66
|
+
function buildSegmentPath(cx, cy, outerRadius, innerRadius, startAngle, endAngle) {
|
|
67
|
+
const sweep = endAngle - startAngle;
|
|
68
|
+
const largeArc = sweep > Math.PI ? 1 : 0;
|
|
69
|
+
// Full-circle case: SVG arcs can't span 360°, so render as two half-arcs
|
|
70
|
+
// (or two annular halves for the donut case).
|
|
71
|
+
if (sweep >= Math.PI * 2 - 1e-6) {
|
|
72
|
+
const [oTopX, oTopY] = polarToCartesian(cx, cy, outerRadius, 0);
|
|
73
|
+
const [oBotX, oBotY] = polarToCartesian(cx, cy, outerRadius, Math.PI);
|
|
74
|
+
if (innerRadius <= 0) {
|
|
75
|
+
return [
|
|
76
|
+
`M ${oTopX} ${oTopY}`,
|
|
77
|
+
`A ${outerRadius} ${outerRadius} 0 1 1 ${oBotX} ${oBotY}`,
|
|
78
|
+
`A ${outerRadius} ${outerRadius} 0 1 1 ${oTopX} ${oTopY}`,
|
|
79
|
+
"Z",
|
|
80
|
+
].join(" ");
|
|
81
|
+
}
|
|
82
|
+
const [iTopX, iTopY] = polarToCartesian(cx, cy, innerRadius, 0);
|
|
83
|
+
const [iBotX, iBotY] = polarToCartesian(cx, cy, innerRadius, Math.PI);
|
|
84
|
+
return [
|
|
85
|
+
`M ${oTopX} ${oTopY}`,
|
|
86
|
+
`A ${outerRadius} ${outerRadius} 0 1 1 ${oBotX} ${oBotY}`,
|
|
87
|
+
`A ${outerRadius} ${outerRadius} 0 1 1 ${oTopX} ${oTopY}`,
|
|
88
|
+
`M ${iTopX} ${iTopY}`,
|
|
89
|
+
`A ${innerRadius} ${innerRadius} 0 1 0 ${iBotX} ${iBotY}`,
|
|
90
|
+
`A ${innerRadius} ${innerRadius} 0 1 0 ${iTopX} ${iTopY}`,
|
|
91
|
+
"Z",
|
|
92
|
+
].join(" ");
|
|
93
|
+
}
|
|
94
|
+
const [oStartX, oStartY] = polarToCartesian(cx, cy, outerRadius, startAngle);
|
|
95
|
+
const [oEndX, oEndY] = polarToCartesian(cx, cy, outerRadius, endAngle);
|
|
96
|
+
if (innerRadius <= 0) {
|
|
97
|
+
return [
|
|
98
|
+
`M ${cx} ${cy}`,
|
|
99
|
+
`L ${oStartX} ${oStartY}`,
|
|
100
|
+
`A ${outerRadius} ${outerRadius} 0 ${largeArc} 1 ${oEndX} ${oEndY}`,
|
|
101
|
+
"Z",
|
|
102
|
+
].join(" ");
|
|
103
|
+
}
|
|
104
|
+
const [iStartX, iStartY] = polarToCartesian(cx, cy, innerRadius, endAngle);
|
|
105
|
+
const [iEndX, iEndY] = polarToCartesian(cx, cy, innerRadius, startAngle);
|
|
106
|
+
return [
|
|
107
|
+
`M ${oStartX} ${oStartY}`,
|
|
108
|
+
`A ${outerRadius} ${outerRadius} 0 ${largeArc} 1 ${oEndX} ${oEndY}`,
|
|
109
|
+
`L ${iStartX} ${iStartY}`,
|
|
110
|
+
`A ${innerRadius} ${innerRadius} 0 ${largeArc} 0 ${iEndX} ${iEndY}`,
|
|
111
|
+
"Z",
|
|
112
|
+
].join(" ");
|
|
113
|
+
}
|
|
114
|
+
function PieChart({ segments, label, size, innerRadius, diameter, segmentGap = 1, onSegmentClick, children, className, centerClassName, showSegmentLabels = false, segmentLabelFormatter, minSegmentLabelAngle = 0.2, segmentLabelClassName, ref, ...props }) {
|
|
115
|
+
const resolvedSize = size ?? "md";
|
|
116
|
+
const pixelSize = diameter ?? SIZE_TO_PIXELS[resolvedSize];
|
|
117
|
+
const cx = pixelSize / 2;
|
|
118
|
+
const cy = pixelSize / 2;
|
|
119
|
+
const outerRadius = pixelSize / 2;
|
|
120
|
+
const innerR = Math.max(0, Math.min(0.95, innerRadius ?? 0) * outerRadius);
|
|
121
|
+
const titleId = useId();
|
|
122
|
+
const validSegments = segments.filter((s) => s.value > 0 && Number.isFinite(s.value));
|
|
123
|
+
const total = validSegments.reduce((acc, s) => acc + s.value, 0);
|
|
124
|
+
const resolved = (() => {
|
|
125
|
+
if (total <= 0)
|
|
126
|
+
return [];
|
|
127
|
+
let angle = 0;
|
|
128
|
+
return validSegments.map((segment, index) => {
|
|
129
|
+
const sweep = (segment.value / total) * Math.PI * 2;
|
|
130
|
+
const startAngle = angle;
|
|
131
|
+
const endAngle = angle + sweep;
|
|
132
|
+
angle = endAngle;
|
|
133
|
+
const presetColor = segment.color ??
|
|
134
|
+
DEFAULT_COLOR_ROTATION[index % DEFAULT_COLOR_ROTATION.length];
|
|
135
|
+
const fillClass = segment.fill
|
|
136
|
+
? undefined
|
|
137
|
+
: SEGMENT_FILL_CLASSES[presetColor];
|
|
138
|
+
return {
|
|
139
|
+
segment,
|
|
140
|
+
startAngle,
|
|
141
|
+
endAngle,
|
|
142
|
+
fillClass,
|
|
143
|
+
fill: segment.fill,
|
|
144
|
+
};
|
|
145
|
+
});
|
|
146
|
+
})();
|
|
147
|
+
return (_jsxs("div", { ref: ref, role: "img", "aria-labelledby": titleId, "data-slot": "pie-chart", className: cn(pieChartVariants({ size }), className), style: { width: pixelSize, height: pixelSize }, ...props, children: [_jsxs("svg", { width: pixelSize, height: pixelSize, viewBox: `0 0 ${pixelSize} ${pixelSize}`, "aria-hidden": children ? "true" : undefined, className: "h-full w-full overflow-visible", children: [_jsx("title", { id: titleId, children: label }), resolved.length === 0 ? (_jsx("circle", { cx: cx, cy: cy, r: outerRadius, className: "fill-muted/40 dark:fill-muted/30" })) : (resolved.map(({ segment, startAngle, endAngle, fillClass, fill }) => {
|
|
148
|
+
const d = buildSegmentPath(cx, cy, outerRadius, innerR, startAngle, endAngle);
|
|
149
|
+
const handler = segment.onClick ?? onSegmentClick;
|
|
150
|
+
const isInteractive = typeof handler === "function";
|
|
151
|
+
return (_jsx("path", { d: d, fill: fill, stroke: "hsl(var(--background))", strokeWidth: segmentGap, strokeLinejoin: "round", "data-segment-id": segment.id, role: isInteractive ? "button" : undefined, tabIndex: isInteractive ? 0 : undefined, "aria-label": segment.label ?? segment.id, onClick: isInteractive
|
|
152
|
+
? (event) => {
|
|
153
|
+
handler(segment, event);
|
|
154
|
+
}
|
|
155
|
+
: undefined, onKeyDown: isInteractive
|
|
156
|
+
? (event) => {
|
|
157
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
158
|
+
event.preventDefault();
|
|
159
|
+
handler(segment, event);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
: undefined, className: cn("transition-opacity", fillClass, isInteractive &&
|
|
163
|
+
"cursor-pointer hover:opacity-80 focus:outline-none focus-visible:opacity-80", segment.className) }, segment.id));
|
|
164
|
+
})), showSegmentLabels && resolved.length > 0 ? (_jsx("g", { "aria-hidden": "true", "data-slot": "pie-chart-segment-labels", className: "pointer-events-none select-none", children: resolved.map(({ segment, startAngle, endAngle }, index) => {
|
|
165
|
+
const sweep = endAngle - startAngle;
|
|
166
|
+
if (sweep < minSegmentLabelAngle)
|
|
167
|
+
return null;
|
|
168
|
+
const value = segment.value;
|
|
169
|
+
const fraction = value / total;
|
|
170
|
+
const percentage = fraction * 100;
|
|
171
|
+
const text = segmentLabelFormatter
|
|
172
|
+
? segmentLabelFormatter({
|
|
173
|
+
segment,
|
|
174
|
+
value,
|
|
175
|
+
fraction,
|
|
176
|
+
percentage,
|
|
177
|
+
index,
|
|
178
|
+
})
|
|
179
|
+
: (segment.label ?? segment.id);
|
|
180
|
+
if (text === null || text === "")
|
|
181
|
+
return null;
|
|
182
|
+
const midAngle = (startAngle + endAngle) / 2;
|
|
183
|
+
const labelRadius = innerR > 0
|
|
184
|
+
? (innerR + outerRadius) / 2
|
|
185
|
+
: outerRadius * 0.65;
|
|
186
|
+
const [lx, ly] = polarToCartesian(cx, cy, labelRadius, midAngle);
|
|
187
|
+
return (_jsx("text", { x: lx, y: ly, textAnchor: "middle", dominantBaseline: "central", className: cn("fill-white text-[11px] font-medium [paint-order:stroke] [stroke:rgba(0,0,0,0.35)] [stroke-width:2px]", segmentLabelClassName), children: text }, `${segment.id}-label`));
|
|
188
|
+
}) })) : null] }), children ? (_jsx("div", { className: cn("pointer-events-none absolute inset-0 flex items-center justify-center text-center", centerClassName), children: children })) : null] }));
|
|
189
|
+
}
|
|
190
|
+
PieChart.displayName = "PieChart";
|
|
191
|
+
export { PieChart };
|
|
192
|
+
//# sourceMappingURL=pie-chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pie-chart.js","sourceRoot":"","sources":["../../../../src/components/ui/pie-chart/pie-chart.tsx"],"names":[],"mappings":"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"}
|