@zentauri-ui/zentauri-components 1.8.0 → 1.8.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/README.md +25 -10
- package/cli/registry.json +12 -0
- package/dist/charts/area.js +9 -10
- package/dist/charts/area.js.map +1 -1
- package/dist/charts/area.mjs +2 -3
- package/dist/charts/area.mjs.map +1 -1
- package/dist/charts/bar.js +10 -95
- package/dist/charts/bar.js.map +1 -1
- package/dist/charts/bar.mjs +2 -95
- package/dist/charts/bar.mjs.map +1 -1
- package/dist/charts/bubble.js +8 -9
- package/dist/charts/bubble.js.map +1 -1
- package/dist/charts/bubble.mjs +2 -3
- package/dist/charts/bubble.mjs.map +1 -1
- package/dist/charts/funnel/Funnel.d.ts +6 -0
- package/dist/charts/funnel/Funnel.d.ts.map +1 -0
- package/dist/charts/funnel/index.d.ts +4 -0
- package/dist/charts/funnel/index.d.ts.map +1 -0
- package/dist/charts/funnel.js +102 -0
- package/dist/charts/funnel.js.map +1 -0
- package/dist/charts/funnel.mjs +89 -0
- package/dist/charts/funnel.mjs.map +1 -0
- package/dist/charts/line.js +8 -9
- package/dist/charts/line.js.map +1 -1
- package/dist/charts/line.mjs +2 -3
- package/dist/charts/line.mjs.map +1 -1
- package/dist/charts/pie/Pie.d.ts +1 -1
- package/dist/charts/pie/Pie.d.ts.map +1 -1
- package/dist/charts/pie.js +19 -6
- package/dist/charts/pie.js.map +1 -1
- package/dist/charts/pie.mjs +17 -4
- package/dist/charts/pie.mjs.map +1 -1
- package/dist/charts/radar/Radar.d.ts +6 -0
- package/dist/charts/radar/Radar.d.ts.map +1 -0
- package/dist/charts/radar/index.d.ts +4 -0
- package/dist/charts/radar/index.d.ts.map +1 -0
- package/dist/charts/radar.js +94 -0
- package/dist/charts/radar.js.map +1 -0
- package/dist/charts/radar.mjs +81 -0
- package/dist/charts/radar.mjs.map +1 -0
- package/dist/charts/scatter/Scatter.d.ts +6 -0
- package/dist/charts/scatter/Scatter.d.ts.map +1 -0
- package/dist/charts/scatter/index.d.ts +4 -0
- package/dist/charts/scatter/index.d.ts.map +1 -0
- package/dist/charts/scatter.js +116 -0
- package/dist/charts/scatter.js.map +1 -0
- package/dist/charts/scatter.mjs +103 -0
- package/dist/charts/scatter.mjs.map +1 -0
- package/dist/charts/shared/chart-frame.d.ts +2 -1
- package/dist/charts/shared/chart-frame.d.ts.map +1 -1
- package/dist/charts/shared/types.d.ts +22 -2
- package/dist/charts/shared/types.d.ts.map +1 -1
- package/dist/charts/stacked-bar/StackedBar.d.ts +6 -0
- package/dist/charts/stacked-bar/StackedBar.d.ts.map +1 -0
- package/dist/charts/stacked-bar/index.d.ts +4 -0
- package/dist/charts/stacked-bar/index.d.ts.map +1 -0
- package/dist/charts/stacked-bar.js +29 -0
- package/dist/charts/stacked-bar.js.map +1 -0
- package/dist/charts/stacked-bar.mjs +15 -0
- package/dist/charts/stacked-bar.mjs.map +1 -0
- package/dist/chunk-7TGUGTTQ.mjs +147 -0
- package/dist/chunk-7TGUGTTQ.mjs.map +1 -0
- package/dist/chunk-CQMV7BB6.js +50 -0
- package/dist/chunk-CQMV7BB6.js.map +1 -0
- package/dist/chunk-DN7TYUJ6.js +119 -0
- package/dist/chunk-DN7TYUJ6.js.map +1 -0
- package/dist/chunk-F3V4POW3.mjs +8 -0
- package/dist/chunk-F3V4POW3.mjs.map +1 -0
- package/dist/{chunk-G2WARVAM.mjs → chunk-HZIRD3SR.mjs} +35 -15
- package/dist/chunk-HZIRD3SR.mjs.map +1 -0
- package/dist/{chunk-G66SXATZ.js → chunk-IL4LH2XX.js} +50 -4
- package/dist/chunk-IL4LH2XX.js.map +1 -0
- package/dist/chunk-LREMK2XR.js +97 -0
- package/dist/chunk-LREMK2XR.js.map +1 -0
- package/dist/chunk-O2KM3ETC.mjs +95 -0
- package/dist/chunk-O2KM3ETC.mjs.map +1 -0
- package/dist/chunk-ODBG4Y6R.mjs +48 -0
- package/dist/chunk-ODBG4Y6R.mjs.map +1 -0
- package/dist/{chunk-ZIFMIS7D.mjs → chunk-OL3BJSRC.mjs} +51 -5
- package/dist/chunk-OL3BJSRC.mjs.map +1 -0
- package/dist/{chunk-QNUDODDX.js → chunk-PWPMKXEG.js} +36 -14
- package/dist/chunk-PWPMKXEG.js.map +1 -0
- package/dist/chunk-RKX5MERK.js +150 -0
- package/dist/chunk-RKX5MERK.js.map +1 -0
- package/dist/chunk-VYI3GS2C.mjs +115 -0
- package/dist/chunk-VYI3GS2C.mjs.map +1 -0
- package/dist/chunk-XRM7GOIE.js +10 -0
- package/dist/chunk-XRM7GOIE.js.map +1 -0
- package/dist/design-system/copy-button.d.ts +43 -0
- package/dist/design-system/copy-button.d.ts.map +1 -0
- package/dist/design-system/index.d.ts +2 -0
- package/dist/design-system/index.d.ts.map +1 -1
- package/dist/design-system/kbd.d.ts +44 -0
- package/dist/design-system/kbd.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/useClipboard.js +6 -44
- package/dist/hooks/useClipboard.js.map +1 -1
- package/dist/hooks/useClipboard.mjs +1 -46
- package/dist/hooks/useClipboard.mjs.map +1 -1
- package/dist/hooks/useIsomorphicLayoutEffect.js +6 -4
- package/dist/hooks/useIsomorphicLayoutEffect.js.map +1 -1
- package/dist/hooks/useIsomorphicLayoutEffect.mjs +1 -6
- package/dist/hooks/useIsomorphicLayoutEffect.mjs.map +1 -1
- package/dist/hooks/useTableFilter/index.d.ts +3 -0
- package/dist/hooks/useTableFilter/index.d.ts.map +1 -0
- package/dist/hooks/useTableFilter/types.d.ts +20 -0
- package/dist/hooks/useTableFilter/types.d.ts.map +1 -0
- package/dist/hooks/useTableFilter/useTableFilter.d.ts +3 -0
- package/dist/hooks/useTableFilter/useTableFilter.d.ts.map +1 -0
- package/dist/hooks/useTableFilter.js +124 -0
- package/dist/hooks/useTableFilter.js.map +1 -0
- package/dist/hooks/useTableFilter.mjs +122 -0
- package/dist/hooks/useTableFilter.mjs.map +1 -0
- package/dist/hooks/useTableSort/index.d.ts +3 -0
- package/dist/hooks/useTableSort/index.d.ts.map +1 -0
- package/dist/hooks/useTableSort/types.d.ts +15 -0
- package/dist/hooks/useTableSort/types.d.ts.map +1 -0
- package/dist/hooks/useTableSort/useTableSort.d.ts +3 -0
- package/dist/hooks/useTableSort/useTableSort.d.ts.map +1 -0
- package/dist/hooks/useTableSort.js +99 -0
- package/dist/hooks/useTableSort.js.map +1 -0
- package/dist/hooks/useTableSort.mjs +97 -0
- package/dist/hooks/useTableSort.mjs.map +1 -0
- package/dist/ui/copy-button/animated/animations.d.ts +3 -0
- package/dist/ui/copy-button/animated/animations.d.ts.map +1 -0
- package/dist/ui/copy-button/animated/copy-button-animated.d.ts +6 -0
- package/dist/ui/copy-button/animated/copy-button-animated.d.ts.map +1 -0
- package/dist/ui/copy-button/animated/index.d.ts +4 -0
- package/dist/ui/copy-button/animated/index.d.ts.map +1 -0
- package/dist/ui/copy-button/animated/types.d.ts +26 -0
- package/dist/ui/copy-button/animated/types.d.ts.map +1 -0
- package/dist/ui/copy-button/animated.js +59 -0
- package/dist/ui/copy-button/animated.js.map +1 -0
- package/dist/ui/copy-button/animated.mjs +56 -0
- package/dist/ui/copy-button/animated.mjs.map +1 -0
- package/dist/ui/copy-button/copy-button-base.d.ts +6 -0
- package/dist/ui/copy-button/copy-button-base.d.ts.map +1 -0
- package/dist/ui/copy-button/copy-button.d.ts +6 -0
- package/dist/ui/copy-button/copy-button.d.ts.map +1 -0
- package/dist/ui/copy-button/index.d.ts +4 -0
- package/dist/ui/copy-button/index.d.ts.map +1 -0
- package/dist/ui/copy-button/types.d.ts +32 -0
- package/dist/ui/copy-button/types.d.ts.map +1 -0
- package/dist/ui/copy-button/variants.d.ts +6 -0
- package/dist/ui/copy-button/variants.d.ts.map +1 -0
- package/dist/ui/copy-button.js +20 -0
- package/dist/ui/copy-button.js.map +1 -0
- package/dist/ui/copy-button.mjs +15 -0
- package/dist/ui/copy-button.mjs.map +1 -0
- package/dist/ui/kbd/animated/animations.d.ts +3 -0
- package/dist/ui/kbd/animated/animations.d.ts.map +1 -0
- package/dist/ui/kbd/animated/index.d.ts +4 -0
- package/dist/ui/kbd/animated/index.d.ts.map +1 -0
- package/dist/ui/kbd/animated/kbd-animated.d.ts +6 -0
- package/dist/ui/kbd/animated/kbd-animated.d.ts.map +1 -0
- package/dist/ui/kbd/animated/types.d.ts +10 -0
- package/dist/ui/kbd/animated/types.d.ts.map +1 -0
- package/dist/ui/kbd/animated.js +42 -0
- package/dist/ui/kbd/animated.js.map +1 -0
- package/dist/ui/kbd/animated.mjs +39 -0
- package/dist/ui/kbd/animated.mjs.map +1 -0
- package/dist/ui/kbd/index.d.ts +4 -0
- package/dist/ui/kbd/index.d.ts.map +1 -0
- package/dist/ui/kbd/kbd-base.d.ts +6 -0
- package/dist/ui/kbd/kbd-base.d.ts.map +1 -0
- package/dist/ui/kbd/kbd.d.ts +6 -0
- package/dist/ui/kbd/kbd.d.ts.map +1 -0
- package/dist/ui/kbd/types.d.ts +17 -0
- package/dist/ui/kbd/types.d.ts.map +1 -0
- package/dist/ui/kbd/variants.d.ts +8 -0
- package/dist/ui/kbd/variants.d.ts.map +1 -0
- package/dist/ui/kbd.js +23 -0
- package/dist/ui/kbd.js.map +1 -0
- package/dist/ui/kbd.mjs +14 -0
- package/dist/ui/kbd.mjs.map +1 -0
- package/dist/ui/marquee/marquee.d.ts.map +1 -1
- package/dist/ui/marquee.js +82 -21
- package/dist/ui/marquee.js.map +1 -1
- package/dist/ui/marquee.mjs +83 -22
- package/dist/ui/marquee.mjs.map +1 -1
- package/dist/ui/table/animated.js +8 -8
- package/dist/ui/table/animated.mjs +2 -2
- package/dist/ui/table/index.d.ts +1 -1
- package/dist/ui/table/index.d.ts.map +1 -1
- package/dist/ui/table/table-base.d.ts +2 -2
- package/dist/ui/table/table-base.d.ts.map +1 -1
- package/dist/ui/table/types.d.ts +9 -1
- package/dist/ui/table/types.d.ts.map +1 -1
- package/dist/ui/table.js +14 -14
- package/dist/ui/table.mjs +1 -1
- package/package.json +1 -1
- package/src/charts/charts.test.tsx +80 -0
- package/src/charts/funnel/Funnel.tsx +105 -0
- package/src/charts/funnel/index.ts +14 -0
- package/src/charts/pie/Pie.tsx +28 -1
- package/src/charts/radar/Radar.tsx +84 -0
- package/src/charts/radar/index.ts +16 -0
- package/src/charts/scatter/Scatter.tsx +104 -0
- package/src/charts/scatter/index.ts +16 -0
- package/src/charts/shared/chart-frame.tsx +4 -2
- package/src/charts/shared/types.ts +42 -2
- package/src/charts/stacked-bar/StackedBar.tsx +12 -0
- package/src/charts/stacked-bar/index.ts +16 -0
- package/src/design-system/copy-button.ts +81 -0
- package/src/design-system/index.ts +2 -0
- package/src/design-system/kbd.ts +83 -0
- package/src/hooks/index.ts +12 -0
- package/src/hooks/useTableFilter/index.ts +7 -0
- package/src/hooks/useTableFilter/types.ts +28 -0
- package/src/hooks/useTableFilter/useTableFilter.test.ts +141 -0
- package/src/hooks/useTableFilter/useTableFilter.ts +153 -0
- package/src/hooks/useTableSort/index.ts +5 -0
- package/src/hooks/useTableSort/types.ts +23 -0
- package/src/hooks/useTableSort/useTableSort.test.ts +150 -0
- package/src/hooks/useTableSort/useTableSort.ts +121 -0
- package/src/ui/copy-button/animated/animations.ts +22 -0
- package/src/ui/copy-button/animated/copy-button-animated.tsx +39 -0
- package/src/ui/copy-button/animated/index.ts +10 -0
- package/src/ui/copy-button/animated/types.ts +21 -0
- package/src/ui/copy-button/copy-button-base.tsx +88 -0
- package/src/ui/copy-button/copy-button.test.tsx +82 -0
- package/src/ui/copy-button/copy-button.tsx +9 -0
- package/src/ui/copy-button/index.ts +10 -0
- package/src/ui/copy-button/types.ts +37 -0
- package/src/ui/copy-button/variants.ts +29 -0
- package/src/ui/divider/divider.test.tsx +55 -0
- package/src/ui/empty-state/empty-state.test.tsx +88 -0
- package/src/ui/kbd/animated/animations.ts +15 -0
- package/src/ui/kbd/animated/index.ts +9 -0
- package/src/ui/kbd/animated/kbd-animated.tsx +26 -0
- package/src/ui/kbd/animated/types.ts +16 -0
- package/src/ui/kbd/index.ts +5 -0
- package/src/ui/kbd/kbd-base.tsx +50 -0
- package/src/ui/kbd/kbd.test.tsx +48 -0
- package/src/ui/kbd/kbd.tsx +9 -0
- package/src/ui/kbd/types.ts +21 -0
- package/src/ui/kbd/variants.ts +31 -0
- package/src/ui/marquee/marquee.test.tsx +45 -4
- package/src/ui/marquee/marquee.tsx +100 -18
- package/src/ui/skeleton/skeleton.test.tsx +85 -0
- package/src/ui/table/index.ts +3 -0
- package/src/ui/table/table-base.tsx +69 -4
- package/src/ui/table/table.test.tsx +207 -0
- package/src/ui/table/types.ts +13 -1
- package/dist/chunk-G2WARVAM.mjs.map +0 -1
- package/dist/chunk-G66SXATZ.js.map +0 -1
- package/dist/chunk-OULU7OC4.mjs +0 -21
- package/dist/chunk-OULU7OC4.mjs.map +0 -1
- package/dist/chunk-QNUDODDX.js.map +0 -1
- package/dist/chunk-Z6S36PDD.js +0 -24
- package/dist/chunk-Z6S36PDD.js.map +0 -1
- package/dist/chunk-ZIFMIS7D.mjs.map +0 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Legend,
|
|
5
|
+
PolarAngleAxis,
|
|
6
|
+
PolarGrid,
|
|
7
|
+
PolarRadiusAxis,
|
|
8
|
+
Radar,
|
|
9
|
+
RadarChart as RechartsRadarChart,
|
|
10
|
+
Tooltip,
|
|
11
|
+
} from "recharts";
|
|
12
|
+
|
|
13
|
+
import { ChartFrame } from "../shared/chart-frame";
|
|
14
|
+
import { getSeriesFill, resolveColor } from "../shared/colors";
|
|
15
|
+
import type { RadarChartProps } from "../shared/types";
|
|
16
|
+
|
|
17
|
+
export function RadarChart<
|
|
18
|
+
TDatum extends Record<string, number | string | null | undefined>,
|
|
19
|
+
>({
|
|
20
|
+
appearance,
|
|
21
|
+
className,
|
|
22
|
+
containerStyle,
|
|
23
|
+
data,
|
|
24
|
+
density,
|
|
25
|
+
emptyState = null,
|
|
26
|
+
height = 320,
|
|
27
|
+
series,
|
|
28
|
+
showGrid = true,
|
|
29
|
+
showLegend = false,
|
|
30
|
+
showTooltip = true,
|
|
31
|
+
tooltipColor = "#0f172a",
|
|
32
|
+
style,
|
|
33
|
+
xKey,
|
|
34
|
+
...props
|
|
35
|
+
}: RadarChartProps<TDatum>) {
|
|
36
|
+
const hasData = data.length > 0 && series.length > 0;
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<ChartFrame
|
|
40
|
+
appearance={appearance}
|
|
41
|
+
className={className}
|
|
42
|
+
containerStyle={containerStyle}
|
|
43
|
+
density={density}
|
|
44
|
+
emptyState={emptyState}
|
|
45
|
+
hasData={hasData}
|
|
46
|
+
height={height}
|
|
47
|
+
style={style}
|
|
48
|
+
{...props}
|
|
49
|
+
>
|
|
50
|
+
<RechartsRadarChart data={data}>
|
|
51
|
+
{showGrid ? <PolarGrid stroke="currentColor" opacity={0.18} /> : null}
|
|
52
|
+
<PolarAngleAxis
|
|
53
|
+
dataKey={String(xKey)}
|
|
54
|
+
tick={{ fill: "currentColor", fontSize: 12 }}
|
|
55
|
+
/>
|
|
56
|
+
<PolarRadiusAxis tick={{ fill: "currentColor", fontSize: 11 }} />
|
|
57
|
+
{showTooltip ? (
|
|
58
|
+
<Tooltip
|
|
59
|
+
contentStyle={{ color: tooltipColor }}
|
|
60
|
+
labelStyle={{ color: tooltipColor }}
|
|
61
|
+
itemStyle={{ color: tooltipColor }}
|
|
62
|
+
/>
|
|
63
|
+
) : null}
|
|
64
|
+
{showLegend ? <Legend /> : null}
|
|
65
|
+
{series.map((item, index) => {
|
|
66
|
+
const color = resolveColor(item.color, index);
|
|
67
|
+
const fill = getSeriesFill(item, index, 0.24);
|
|
68
|
+
return (
|
|
69
|
+
<Radar
|
|
70
|
+
key={item.dataKey}
|
|
71
|
+
dataKey={item.dataKey}
|
|
72
|
+
name={item.name}
|
|
73
|
+
stroke={item.stroke ?? color.stroke}
|
|
74
|
+
fill={fill ?? color.fill}
|
|
75
|
+
fillOpacity={0.72}
|
|
76
|
+
/>
|
|
77
|
+
);
|
|
78
|
+
})}
|
|
79
|
+
</RechartsRadarChart>
|
|
80
|
+
</ChartFrame>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
RadarChart.displayName = "RadarChart";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
export { RadarChart } from "./Radar";
|
|
4
|
+
export type {
|
|
5
|
+
ChartColor,
|
|
6
|
+
ChartDatum,
|
|
7
|
+
ChartMargin,
|
|
8
|
+
ChartSeries,
|
|
9
|
+
ChartSharedStatic,
|
|
10
|
+
RadarChartProps,
|
|
11
|
+
} from "../shared/types";
|
|
12
|
+
export {
|
|
13
|
+
chartColorValues,
|
|
14
|
+
chartPalette,
|
|
15
|
+
chartVariants,
|
|
16
|
+
} from "../shared/variants";
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Scatter,
|
|
5
|
+
ScatterChart as RechartsScatterChart,
|
|
6
|
+
XAxis,
|
|
7
|
+
YAxis,
|
|
8
|
+
} from "recharts";
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
ChartDecorators,
|
|
12
|
+
ChartFrame,
|
|
13
|
+
defaultChartMargin,
|
|
14
|
+
} from "../shared/chart-frame";
|
|
15
|
+
import { resolveColor } from "../shared/colors";
|
|
16
|
+
import type { ScatterChartProps } from "../shared/types";
|
|
17
|
+
|
|
18
|
+
export function ScatterChart<
|
|
19
|
+
TDatum extends Record<string, number | string | null | undefined>,
|
|
20
|
+
>({
|
|
21
|
+
appearance,
|
|
22
|
+
className,
|
|
23
|
+
containerStyle,
|
|
24
|
+
data,
|
|
25
|
+
density,
|
|
26
|
+
emptyState = null,
|
|
27
|
+
height = 320,
|
|
28
|
+
margin = defaultChartMargin,
|
|
29
|
+
series,
|
|
30
|
+
showGrid = true,
|
|
31
|
+
showLegend = false,
|
|
32
|
+
showTooltip = true,
|
|
33
|
+
tooltipColor = "#0f172a",
|
|
34
|
+
style,
|
|
35
|
+
syncId,
|
|
36
|
+
xKey,
|
|
37
|
+
...props
|
|
38
|
+
}: ScatterChartProps<TDatum>) {
|
|
39
|
+
const hasData = data.length > 0 && series.length > 0;
|
|
40
|
+
const xAxisKey = String(xKey);
|
|
41
|
+
const isNumericX = typeof data[0]?.[xAxisKey] === "number";
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<ChartFrame
|
|
45
|
+
appearance={appearance}
|
|
46
|
+
className={className}
|
|
47
|
+
containerStyle={containerStyle}
|
|
48
|
+
density={density}
|
|
49
|
+
emptyState={emptyState}
|
|
50
|
+
hasData={hasData}
|
|
51
|
+
height={height}
|
|
52
|
+
style={style}
|
|
53
|
+
{...props}
|
|
54
|
+
>
|
|
55
|
+
<RechartsScatterChart data={data} margin={margin} syncId={syncId}>
|
|
56
|
+
<ChartDecorators
|
|
57
|
+
axis={
|
|
58
|
+
<>
|
|
59
|
+
<XAxis
|
|
60
|
+
dataKey={xAxisKey}
|
|
61
|
+
type={isNumericX ? "number" : "category"}
|
|
62
|
+
minTickGap={24}
|
|
63
|
+
tickLine={false}
|
|
64
|
+
tickMargin={10}
|
|
65
|
+
axisLine={false}
|
|
66
|
+
fontSize={12}
|
|
67
|
+
/>
|
|
68
|
+
<YAxis
|
|
69
|
+
dataKey="__chartY"
|
|
70
|
+
type="number"
|
|
71
|
+
width={40}
|
|
72
|
+
tickLine={false}
|
|
73
|
+
tickMargin={8}
|
|
74
|
+
axisLine={false}
|
|
75
|
+
fontSize={12}
|
|
76
|
+
/>
|
|
77
|
+
</>
|
|
78
|
+
}
|
|
79
|
+
showGrid={showGrid}
|
|
80
|
+
showLegend={showLegend}
|
|
81
|
+
showTooltip={showTooltip}
|
|
82
|
+
tooltipColor={tooltipColor}
|
|
83
|
+
/>
|
|
84
|
+
{series.map((item, index) => {
|
|
85
|
+
const color = resolveColor(item.color, index);
|
|
86
|
+
return (
|
|
87
|
+
<Scatter
|
|
88
|
+
key={item.dataKey}
|
|
89
|
+
data={data.map((entry) => ({
|
|
90
|
+
...entry,
|
|
91
|
+
__chartY: entry[item.dataKey],
|
|
92
|
+
}))}
|
|
93
|
+
name={item.name}
|
|
94
|
+
fill={item.fill ?? color.stroke}
|
|
95
|
+
line={item.stroke ? { stroke: item.stroke } : false}
|
|
96
|
+
/>
|
|
97
|
+
);
|
|
98
|
+
})}
|
|
99
|
+
</RechartsScatterChart>
|
|
100
|
+
</ChartFrame>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
ScatterChart.displayName = "ScatterChart";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
export { ScatterChart } from "./Scatter";
|
|
4
|
+
export type {
|
|
5
|
+
ChartColor,
|
|
6
|
+
ChartDatum,
|
|
7
|
+
ChartMargin,
|
|
8
|
+
ChartSeries,
|
|
9
|
+
ChartSharedStatic,
|
|
10
|
+
ScatterChartProps,
|
|
11
|
+
} from "../shared/types";
|
|
12
|
+
export {
|
|
13
|
+
chartColorValues,
|
|
14
|
+
chartPalette,
|
|
15
|
+
chartVariants,
|
|
16
|
+
} from "../shared/variants";
|
|
@@ -39,6 +39,7 @@ type ChartFrameProps = HTMLAttributes<HTMLDivElement> & {
|
|
|
39
39
|
emptyState?: ReactNode;
|
|
40
40
|
hasData: boolean;
|
|
41
41
|
height: number;
|
|
42
|
+
overlay?: ReactNode;
|
|
42
43
|
style?: CSSProperties;
|
|
43
44
|
children: ReactNode;
|
|
44
45
|
};
|
|
@@ -54,6 +55,7 @@ export function ChartFrame({
|
|
|
54
55
|
emptyState = null,
|
|
55
56
|
hasData,
|
|
56
57
|
height,
|
|
58
|
+
overlay,
|
|
57
59
|
style,
|
|
58
60
|
...props
|
|
59
61
|
}: ChartFrameProps) {
|
|
@@ -63,8 +65,7 @@ export function ChartFrame({
|
|
|
63
65
|
"--chart-height": `${height}px`,
|
|
64
66
|
...style,
|
|
65
67
|
} as CSSProperties;
|
|
66
|
-
const canRenderChart =
|
|
67
|
-
(size?.width ?? 0) > 0 && (size?.height ?? 0) > 0;
|
|
68
|
+
const canRenderChart = (size?.width ?? 0) > 0 && (size?.height ?? 0) > 0;
|
|
68
69
|
|
|
69
70
|
if (!hasData) {
|
|
70
71
|
return (
|
|
@@ -99,6 +100,7 @@ export function ChartFrame({
|
|
|
99
100
|
</ResponsiveContainer>
|
|
100
101
|
) : null}
|
|
101
102
|
</div>
|
|
103
|
+
{overlay}
|
|
102
104
|
</div>
|
|
103
105
|
);
|
|
104
106
|
}
|
|
@@ -2,9 +2,18 @@ import type { VariantProps } from "class-variance-authority";
|
|
|
2
2
|
import type { CSSProperties, HTMLAttributes, ReactNode } from "react";
|
|
3
3
|
|
|
4
4
|
import type { chartPalette, chartVariants } from "./variants";
|
|
5
|
-
import { PieProps } from "recharts";
|
|
5
|
+
import type { PieProps } from "recharts";
|
|
6
6
|
|
|
7
|
-
export type ChartType =
|
|
7
|
+
export type ChartType =
|
|
8
|
+
| "area"
|
|
9
|
+
| "bar"
|
|
10
|
+
| "bubble"
|
|
11
|
+
| "funnel"
|
|
12
|
+
| "line"
|
|
13
|
+
| "pie"
|
|
14
|
+
| "radar"
|
|
15
|
+
| "scatter"
|
|
16
|
+
| "stacked-bar";
|
|
8
17
|
|
|
9
18
|
export type ChartColor = keyof typeof chartPalette;
|
|
10
19
|
|
|
@@ -61,6 +70,17 @@ export type LineChartProps<TDatum extends ChartDatum = ChartDatum> =
|
|
|
61
70
|
export type BubbleChartProps<TDatum extends ChartDatum = ChartDatum> =
|
|
62
71
|
BaseChartProps<TDatum>;
|
|
63
72
|
|
|
73
|
+
export type RadarChartProps<TDatum extends ChartDatum = ChartDatum> =
|
|
74
|
+
BaseChartProps<TDatum>;
|
|
75
|
+
|
|
76
|
+
export type ScatterChartProps<TDatum extends ChartDatum = ChartDatum> =
|
|
77
|
+
BaseChartProps<TDatum>;
|
|
78
|
+
|
|
79
|
+
export type StackedBarChartProps<TDatum extends ChartDatum = ChartDatum> = Omit<
|
|
80
|
+
BaseChartProps<TDatum>,
|
|
81
|
+
"stacked"
|
|
82
|
+
>;
|
|
83
|
+
|
|
64
84
|
export type PieChartProps<TDatum extends ChartDatum = ChartDatum> =
|
|
65
85
|
ChartSharedStatic &
|
|
66
86
|
Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
|
|
@@ -75,6 +95,8 @@ export type PieChartProps<TDatum extends ChartDatum = ChartDatum> =
|
|
|
75
95
|
containerStyle?: CSSProperties;
|
|
76
96
|
paddingAngle?: PieProps["paddingAngle"];
|
|
77
97
|
cornerRadius?: PieProps["cornerRadius"];
|
|
98
|
+
center?: ReactNode;
|
|
99
|
+
colorKey?: keyof TDatum & string;
|
|
78
100
|
label?: boolean;
|
|
79
101
|
labelLine?: boolean;
|
|
80
102
|
labelColor?: string;
|
|
@@ -84,3 +106,21 @@ export type PieChartProps<TDatum extends ChartDatum = ChartDatum> =
|
|
|
84
106
|
outerRadius?: PieProps["outerRadius"];
|
|
85
107
|
shape?: PieProps["shape"];
|
|
86
108
|
};
|
|
109
|
+
|
|
110
|
+
export type FunnelChartProps<TDatum extends ChartDatum = ChartDatum> =
|
|
111
|
+
ChartSharedStatic &
|
|
112
|
+
Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
|
|
113
|
+
data: TDatum[];
|
|
114
|
+
dataKey: keyof TDatum & string;
|
|
115
|
+
nameKey: keyof TDatum & string;
|
|
116
|
+
height?: number;
|
|
117
|
+
showLegend?: boolean;
|
|
118
|
+
showTooltip?: boolean;
|
|
119
|
+
tooltipColor?: string;
|
|
120
|
+
emptyState?: ReactNode;
|
|
121
|
+
containerStyle?: CSSProperties;
|
|
122
|
+
colorKey?: keyof TDatum & string;
|
|
123
|
+
label?: boolean;
|
|
124
|
+
stroke?: string;
|
|
125
|
+
fill?: string;
|
|
126
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { BarChart } from "../bar/Bar";
|
|
4
|
+
import type { StackedBarChartProps } from "../shared/types";
|
|
5
|
+
|
|
6
|
+
export function StackedBarChart<
|
|
7
|
+
TDatum extends Record<string, number | string | null | undefined>,
|
|
8
|
+
>(props: StackedBarChartProps<TDatum>) {
|
|
9
|
+
return <BarChart {...props} stacked />;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
StackedBarChart.displayName = "StackedBarChart";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
export { StackedBarChart } from "./StackedBar";
|
|
4
|
+
export type {
|
|
5
|
+
ChartColor,
|
|
6
|
+
ChartDatum,
|
|
7
|
+
ChartMargin,
|
|
8
|
+
ChartSeries,
|
|
9
|
+
ChartSharedStatic,
|
|
10
|
+
StackedBarChartProps,
|
|
11
|
+
} from "../shared/types";
|
|
12
|
+
export {
|
|
13
|
+
chartColorValues,
|
|
14
|
+
chartPalette,
|
|
15
|
+
chartVariants,
|
|
16
|
+
} from "../shared/variants";
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export const zuiCopyButtonBase = [
|
|
2
|
+
"relative inline-flex items-center justify-center gap-2 whitespace-nowrap",
|
|
3
|
+
"rounded-[var(--zui-copy-button-radius,0.75rem)] font-medium",
|
|
4
|
+
"ring-offset-[var(--zui-copy-button-ring-offset,#f8fafc)] dark:ring-offset-[var(--zui-copy-button-ring-offset-dark,#020617)]",
|
|
5
|
+
"transition-colors select-none",
|
|
6
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--zui-copy-button-focus-ring,#475569)] dark:focus-visible:ring-[var(--zui-copy-button-focus-ring-dark,#cbd5e1)] focus-visible:ring-offset-2",
|
|
7
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
8
|
+
] as const;
|
|
9
|
+
|
|
10
|
+
export const zuiCopyButtonAppearances = {
|
|
11
|
+
default:
|
|
12
|
+
"bg-[var(--zui-copy-button-default-bg,#0f172a)] dark:bg-[var(--zui-copy-button-default-bg-dark,#f8fafc)] text-[color:var(--zui-copy-button-default-fg,#f8fafc)] dark:text-[color:var(--zui-copy-button-default-fg-dark,#020617)] shadow-[var(--zui-copy-button-default-shadow,0_1px_2px_#0f172a14)] dark:shadow-[var(--zui-copy-button-default-shadow-dark,0_1px_2px_#0f172a1f)] hover:bg-[var(--zui-copy-button-default-bg-hover,#000000)] dark:hover:bg-[var(--zui-copy-button-default-bg-hover-dark,#ffffff)]",
|
|
13
|
+
secondary:
|
|
14
|
+
"bg-[var(--zui-copy-button-secondary-bg,#e2e8f0)] dark:bg-[var(--zui-copy-button-secondary-bg-dark,#1e293b)] text-[color:var(--zui-copy-button-secondary-fg,#0f172a)] dark:text-[color:var(--zui-copy-button-secondary-fg-dark,#f8fafc)] hover:bg-[var(--zui-copy-button-secondary-bg-hover,#cbd5e1)] dark:hover:bg-[var(--zui-copy-button-secondary-bg-hover-dark,#334155)]",
|
|
15
|
+
destructive:
|
|
16
|
+
"bg-[var(--zui-copy-button-destructive-bg,#f43f5e)] dark:bg-[var(--zui-copy-button-destructive-bg-dark,#be123c)] text-[color:var(--zui-copy-button-destructive-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-destructive-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-destructive-bg-hover,#f43f5e)] dark:hover:bg-[var(--zui-copy-button-destructive-bg-hover-dark,#9f1239)]",
|
|
17
|
+
outline:
|
|
18
|
+
"border border-[color:var(--zui-copy-button-outline-border,#0000001a)] dark:border-[color:var(--zui-copy-button-outline-border-dark,#ffffff1a)] bg-[var(--zui-copy-button-outline-bg,#0000000d)] dark:bg-[var(--zui-copy-button-outline-bg-dark,#ffffff0d)] text-[color:var(--zui-copy-button-outline-fg,#0f172a)] dark:text-[color:var(--zui-copy-button-outline-fg-dark,#f8fafc)] hover:bg-[var(--zui-copy-button-outline-bg-hover,#0000001a)] dark:hover:bg-[var(--zui-copy-button-outline-bg-hover-dark,#ffffff1a)]",
|
|
19
|
+
ghost:
|
|
20
|
+
"bg-transparent text-[color:var(--zui-copy-button-ghost-fg,#334155)] dark:text-[color:var(--zui-copy-button-ghost-fg-dark,#e2e8f0)] hover:bg-[var(--zui-copy-button-ghost-bg-hover,#0000000d)] dark:hover:bg-[var(--zui-copy-button-ghost-bg-hover-dark,#ffffff0d)]",
|
|
21
|
+
glass:
|
|
22
|
+
"border border-[color:var(--zui-copy-button-glass-border,#00000026)] dark:border-[color:var(--zui-copy-button-glass-border-dark,#ffffff26)] bg-[var(--zui-copy-button-glass-bg,#0000001a)] dark:bg-[var(--zui-copy-button-glass-bg-dark,#ffffff1a)] text-[color:var(--zui-copy-button-glass-fg,#0f172a)] dark:text-[color:var(--zui-copy-button-glass-fg-dark,#ffffff)] backdrop-blur-md hover:bg-[var(--zui-copy-button-glass-bg-hover,#00000026)] dark:hover:bg-[var(--zui-copy-button-glass-bg-hover-dark,#ffffff26)]",
|
|
23
|
+
emerald:
|
|
24
|
+
"bg-[var(--zui-copy-button-emerald-bg,#10b981)] dark:bg-[var(--zui-copy-button-emerald-bg-dark,#065f46)] text-[color:var(--zui-copy-button-emerald-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-emerald-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-emerald-bg-hover,#10b981)] dark:hover:bg-[var(--zui-copy-button-emerald-bg-hover-dark,#064e3b)]",
|
|
25
|
+
indigo:
|
|
26
|
+
"bg-[var(--zui-copy-button-indigo-bg,#3730a3)] dark:bg-[var(--zui-copy-button-indigo-bg-dark,#4f46e5)] text-[color:var(--zui-copy-button-indigo-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-indigo-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-indigo-bg-hover,#3730a3)] dark:hover:bg-[var(--zui-copy-button-indigo-bg-hover-dark,#4f46e5)]",
|
|
27
|
+
purple:
|
|
28
|
+
"bg-[var(--zui-copy-button-purple-bg,#6b21a8)] dark:bg-[var(--zui-copy-button-purple-bg-dark,#9333ea)] text-[color:var(--zui-copy-button-purple-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-purple-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-purple-bg-hover,#6b21a8)] dark:hover:bg-[var(--zui-copy-button-purple-bg-hover-dark,#9333ea)]",
|
|
29
|
+
pink:
|
|
30
|
+
"bg-[var(--zui-copy-button-pink-bg,#9d174d)] dark:bg-[var(--zui-copy-button-pink-bg-dark,#db2777)] text-[color:var(--zui-copy-button-pink-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-pink-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-pink-bg-hover,#9d174d)] dark:hover:bg-[var(--zui-copy-button-pink-bg-hover-dark,#db2777)]",
|
|
31
|
+
rose:
|
|
32
|
+
"bg-[var(--zui-copy-button-rose-bg,#9f1239)] dark:bg-[var(--zui-copy-button-rose-bg-dark,#e11d48)] text-[color:var(--zui-copy-button-rose-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-rose-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-rose-bg-hover,#9f1239)] dark:hover:bg-[var(--zui-copy-button-rose-bg-hover-dark,#e11d48)]",
|
|
33
|
+
sky:
|
|
34
|
+
"bg-[var(--zui-copy-button-sky-bg,#0ea5e9)] dark:bg-[var(--zui-copy-button-sky-bg-dark,#0369a1)] text-[color:var(--zui-copy-button-sky-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-sky-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-sky-bg-hover,#0ea5e9)] dark:hover:bg-[var(--zui-copy-button-sky-bg-hover-dark,#075985)]",
|
|
35
|
+
teal:
|
|
36
|
+
"bg-[var(--zui-copy-button-teal-bg,#14b8a6)] dark:bg-[var(--zui-copy-button-teal-bg-dark,#0f766e)] text-[color:var(--zui-copy-button-teal-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-teal-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-teal-bg-hover,#14b8a6)] dark:hover:bg-[var(--zui-copy-button-teal-bg-hover-dark,#115e59)]",
|
|
37
|
+
yellow:
|
|
38
|
+
"bg-[var(--zui-copy-button-yellow-bg,#eab308)] dark:bg-[var(--zui-copy-button-yellow-bg-dark,#854d0e)] text-[color:var(--zui-copy-button-yellow-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-yellow-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-yellow-bg-hover,#eab308)] dark:hover:bg-[var(--zui-copy-button-yellow-bg-hover-dark,#713f12)]",
|
|
39
|
+
orange:
|
|
40
|
+
"bg-[var(--zui-copy-button-orange-bg,#f97316)] dark:bg-[var(--zui-copy-button-orange-bg-dark,#9a3412)] text-[color:var(--zui-copy-button-orange-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-orange-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-orange-bg-hover,#f97316)] dark:hover:bg-[var(--zui-copy-button-orange-bg-hover-dark,#7c2d12)]",
|
|
41
|
+
gray:
|
|
42
|
+
"bg-[var(--zui-copy-button-gray-bg,#6b7280)] dark:bg-[var(--zui-copy-button-gray-bg-dark,#374151)] text-[color:var(--zui-copy-button-gray-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gray-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-gray-bg-hover,#6b7280)] dark:hover:bg-[var(--zui-copy-button-gray-bg-hover-dark,#1f2937)]",
|
|
43
|
+
amber:
|
|
44
|
+
"bg-[var(--zui-copy-button-amber-bg,#f59e0b)] dark:bg-[var(--zui-copy-button-amber-bg-dark,#92400e)] text-[color:var(--zui-copy-button-amber-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-amber-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-amber-bg-hover,#f59e0b)] dark:hover:bg-[var(--zui-copy-button-amber-bg-hover-dark,#78350f)]",
|
|
45
|
+
violet:
|
|
46
|
+
"bg-[var(--zui-copy-button-violet-bg,#5b21b6)] dark:bg-[var(--zui-copy-button-violet-bg-dark,#7c3aed)] text-[color:var(--zui-copy-button-violet-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-violet-fg-dark,#ffffff)] hover:bg-[var(--zui-copy-button-violet-bg-hover,#5b21b6)] dark:hover:bg-[var(--zui-copy-button-violet-bg-hover-dark,#7c3aed)]",
|
|
47
|
+
"gradient-blue":
|
|
48
|
+
"bg-linear-to-r from-[var(--zui-copy-button-gradient-blue-from,#1e40af)] dark:from-[var(--zui-copy-button-gradient-blue-from-dark,#2563eb)] to-[var(--zui-copy-button-gradient-blue-to,#6b21a8)] dark:to-[var(--zui-copy-button-gradient-blue-to-dark,#9333ea)] text-[color:var(--zui-copy-button-gradient-blue-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-blue-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-blue-from-hover,#1e40af)] dark:hover:from-[var(--zui-copy-button-gradient-blue-from-hover-dark,#2563eb)] hover:to-[var(--zui-copy-button-gradient-blue-to-hover,#6b21a8)] dark:hover:to-[var(--zui-copy-button-gradient-blue-to-hover-dark,#9333ea)]",
|
|
49
|
+
"gradient-green":
|
|
50
|
+
"bg-linear-to-r from-[var(--zui-copy-button-gradient-green-from,#166534)] dark:from-[var(--zui-copy-button-gradient-green-from-dark,#16a34a)] to-[var(--zui-copy-button-gradient-green-to,#3f6212)] dark:to-[var(--zui-copy-button-gradient-green-to-dark,#65a30d)] text-[color:var(--zui-copy-button-gradient-green-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-green-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-green-from-hover,#166534)] dark:hover:from-[var(--zui-copy-button-gradient-green-from-hover-dark,#16a34a)] hover:to-[var(--zui-copy-button-gradient-green-to-hover,#3f6212)] dark:hover:to-[var(--zui-copy-button-gradient-green-to-hover-dark,#65a30d)]",
|
|
51
|
+
"gradient-red":
|
|
52
|
+
"bg-linear-to-r from-[var(--zui-copy-button-gradient-red-from,#991b1b)] dark:from-[var(--zui-copy-button-gradient-red-from-dark,#dc2626)] to-[var(--zui-copy-button-gradient-red-to,#9d174d)] dark:to-[var(--zui-copy-button-gradient-red-to-dark,#db2777)] text-[color:var(--zui-copy-button-gradient-red-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-red-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-red-from-hover,#991b1b)] dark:hover:from-[var(--zui-copy-button-gradient-red-from-hover-dark,#dc2626)] hover:to-[var(--zui-copy-button-gradient-red-to-hover,#9d174d)] dark:hover:to-[var(--zui-copy-button-gradient-red-to-hover-dark,#db2777)]",
|
|
53
|
+
"gradient-yellow":
|
|
54
|
+
"bg-linear-to-r from-[var(--zui-copy-button-gradient-yellow-from,#854d0e)] dark:from-[var(--zui-copy-button-gradient-yellow-from-dark,#ca8a04)] to-[var(--zui-copy-button-gradient-yellow-to,#9a3412)] dark:to-[var(--zui-copy-button-gradient-yellow-to-dark,#ea580c)] text-[color:var(--zui-copy-button-gradient-yellow-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-yellow-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-yellow-from-hover,#854d0e)] dark:hover:from-[var(--zui-copy-button-gradient-yellow-from-hover-dark,#ca8a04)] hover:to-[var(--zui-copy-button-gradient-yellow-to-hover,#9a3412)] dark:hover:to-[var(--zui-copy-button-gradient-yellow-to-hover-dark,#ea580c)]",
|
|
55
|
+
"gradient-purple":
|
|
56
|
+
"bg-linear-to-r from-[var(--zui-copy-button-gradient-purple-from,#6b21a8)] dark:from-[var(--zui-copy-button-gradient-purple-from-dark,#9333ea)] to-[var(--zui-copy-button-gradient-purple-to,#9d174d)] dark:to-[var(--zui-copy-button-gradient-purple-to-dark,#db2777)] text-[color:var(--zui-copy-button-gradient-purple-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-purple-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-purple-from-hover,#6b21a8)] dark:hover:from-[var(--zui-copy-button-gradient-purple-from-hover-dark,#9333ea)] hover:to-[var(--zui-copy-button-gradient-purple-to-hover,#9d174d)] dark:hover:to-[var(--zui-copy-button-gradient-purple-to-hover-dark,#db2777)]",
|
|
57
|
+
"gradient-teal":
|
|
58
|
+
"bg-linear-to-r from-[var(--zui-copy-button-gradient-teal-from,#115e59)] dark:from-[var(--zui-copy-button-gradient-teal-from-dark,#0d9488)] to-[var(--zui-copy-button-gradient-teal-to,#155e75)] dark:to-[var(--zui-copy-button-gradient-teal-to-dark,#0891b2)] text-[color:var(--zui-copy-button-gradient-teal-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-teal-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-teal-from-hover,#115e59)] dark:hover:from-[var(--zui-copy-button-gradient-teal-from-hover-dark,#0d9488)] hover:to-[var(--zui-copy-button-gradient-teal-to-hover,#155e75)] dark:hover:to-[var(--zui-copy-button-gradient-teal-to-hover-dark,#0891b2)]",
|
|
59
|
+
"gradient-indigo":
|
|
60
|
+
"bg-linear-to-r from-[var(--zui-copy-button-gradient-indigo-from,#3730a3)] dark:from-[var(--zui-copy-button-gradient-indigo-from-dark,#4f46e5)] to-[var(--zui-copy-button-gradient-indigo-to,#6b21a8)] dark:to-[var(--zui-copy-button-gradient-indigo-to-dark,#9333ea)] text-[color:var(--zui-copy-button-gradient-indigo-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-indigo-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-indigo-from-hover,#3730a3)] dark:hover:from-[var(--zui-copy-button-gradient-indigo-from-hover-dark,#4f46e5)] hover:to-[var(--zui-copy-button-gradient-indigo-to-hover,#6b21a8)] dark:hover:to-[var(--zui-copy-button-gradient-indigo-to-hover-dark,#9333ea)]",
|
|
61
|
+
"gradient-pink":
|
|
62
|
+
"bg-linear-to-r from-[var(--zui-copy-button-gradient-pink-from,#9d174d)] dark:from-[var(--zui-copy-button-gradient-pink-from-dark,#db2777)] to-[var(--zui-copy-button-gradient-pink-to,#9f1239)] dark:to-[var(--zui-copy-button-gradient-pink-to-dark,#e11d48)] text-[color:var(--zui-copy-button-gradient-pink-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-pink-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-pink-from-hover,#9d174d)] dark:hover:from-[var(--zui-copy-button-gradient-pink-from-hover-dark,#db2777)] hover:to-[var(--zui-copy-button-gradient-pink-to-hover,#9f1239)] dark:hover:to-[var(--zui-copy-button-gradient-pink-to-hover-dark,#e11d48)]",
|
|
63
|
+
"gradient-orange":
|
|
64
|
+
"bg-linear-to-r from-[var(--zui-copy-button-gradient-orange-from,#9a3412)] dark:from-[var(--zui-copy-button-gradient-orange-from-dark,#ea580c)] to-[var(--zui-copy-button-gradient-orange-to,#991b1b)] dark:to-[var(--zui-copy-button-gradient-orange-to-dark,#dc2626)] text-[color:var(--zui-copy-button-gradient-orange-fg,#ffffff)] dark:text-[color:var(--zui-copy-button-gradient-orange-fg-dark,#ffffff)] hover:from-[var(--zui-copy-button-gradient-orange-from-hover,#9a3412)] dark:hover:from-[var(--zui-copy-button-gradient-orange-from-hover-dark,#ea580c)] hover:to-[var(--zui-copy-button-gradient-orange-to-hover,#991b1b)] dark:hover:to-[var(--zui-copy-button-gradient-orange-to-hover-dark,#dc2626)]",
|
|
65
|
+
} as const;
|
|
66
|
+
|
|
67
|
+
export type ZuiCopyButtonAppearance = keyof typeof zuiCopyButtonAppearances;
|
|
68
|
+
|
|
69
|
+
export const zuiCopyButtonSizes = {
|
|
70
|
+
sm: "h-8 px-2.5 text-xs [&_svg]:size-3.5",
|
|
71
|
+
md: "h-9 px-3 text-sm [&_svg]:size-4",
|
|
72
|
+
lg: "h-11 px-4 text-base [&_svg]:size-5",
|
|
73
|
+
} as const;
|
|
74
|
+
|
|
75
|
+
export type ZuiCopyButtonSize = keyof typeof zuiCopyButtonSizes;
|
|
76
|
+
|
|
77
|
+
export const zuiCopyButtonIconOnlySizes = {
|
|
78
|
+
sm: "w-8 px-0",
|
|
79
|
+
md: "w-9 px-0",
|
|
80
|
+
lg: "w-11 px-0",
|
|
81
|
+
} as const;
|
|
@@ -9,6 +9,7 @@ export * from "./card";
|
|
|
9
9
|
export * from "./checkbox";
|
|
10
10
|
export * from "./command";
|
|
11
11
|
export * from "./context-menu";
|
|
12
|
+
export * from "./copy-button";
|
|
12
13
|
export * from "./divider";
|
|
13
14
|
export * from "./drawer";
|
|
14
15
|
export * from "./dropdown";
|
|
@@ -16,6 +17,7 @@ export * from "./dynamic-stepper";
|
|
|
16
17
|
export * from "./empty-state";
|
|
17
18
|
export * from "./file-upload";
|
|
18
19
|
export * from "./inputs";
|
|
20
|
+
export * from "./kbd";
|
|
19
21
|
export * from "./marquee";
|
|
20
22
|
export * from "./modal";
|
|
21
23
|
export * from "./otp-input";
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export const zuiKbdBase = [
|
|
2
|
+
"inline-flex items-center justify-center gap-1 align-middle",
|
|
3
|
+
"rounded-[var(--zui-kbd-radius,0.375rem)] font-mono font-medium leading-none select-none",
|
|
4
|
+
] as const;
|
|
5
|
+
|
|
6
|
+
export const zuiKbdKeyAppearances = {
|
|
7
|
+
default:
|
|
8
|
+
"bg-[var(--zui-kbd-default-bg,#0f172a)] dark:bg-[var(--zui-kbd-default-bg-dark,#f8fafc)] text-[color:var(--zui-kbd-default-fg,#f8fafc)] dark:text-[color:var(--zui-kbd-default-fg-dark,#020617)] shadow-[var(--zui-kbd-default-shadow,0_1px_2px_#0f172a14)] dark:shadow-[var(--zui-kbd-default-shadow-dark,0_1px_2px_#0f172a1f)]",
|
|
9
|
+
secondary:
|
|
10
|
+
"bg-[var(--zui-kbd-secondary-bg,#e2e8f0)] dark:bg-[var(--zui-kbd-secondary-bg-dark,#1e293b)] text-[color:var(--zui-kbd-secondary-fg,#0f172a)] dark:text-[color:var(--zui-kbd-secondary-fg-dark,#f8fafc)]",
|
|
11
|
+
destructive:
|
|
12
|
+
"bg-[var(--zui-kbd-destructive-bg,#f43f5e)] dark:bg-[var(--zui-kbd-destructive-bg-dark,#be123c)] text-[color:var(--zui-kbd-destructive-fg,#ffffff)] dark:text-[color:var(--zui-kbd-destructive-fg-dark,#ffffff)]",
|
|
13
|
+
outline:
|
|
14
|
+
"border border-[color:var(--zui-kbd-outline-border,#0000001a)] dark:border-[color:var(--zui-kbd-outline-border-dark,#ffffff1a)] bg-[var(--zui-kbd-outline-bg,#0000000d)] dark:bg-[var(--zui-kbd-outline-bg-dark,#ffffff0d)] text-[color:var(--zui-kbd-outline-fg,#0f172a)] dark:text-[color:var(--zui-kbd-outline-fg-dark,#f8fafc)]",
|
|
15
|
+
ghost:
|
|
16
|
+
"bg-transparent text-[color:var(--zui-kbd-ghost-fg,#334155)] dark:text-[color:var(--zui-kbd-ghost-fg-dark,#e2e8f0)]",
|
|
17
|
+
glass:
|
|
18
|
+
"border border-[color:var(--zui-kbd-glass-border,#00000026)] dark:border-[color:var(--zui-kbd-glass-border-dark,#ffffff26)] bg-[var(--zui-kbd-glass-bg,#0000001a)] dark:bg-[var(--zui-kbd-glass-bg-dark,#ffffff1a)] text-[color:var(--zui-kbd-glass-fg,#0f172a)] dark:text-[color:var(--zui-kbd-glass-fg-dark,#ffffff)] backdrop-blur-md",
|
|
19
|
+
emerald:
|
|
20
|
+
"bg-[var(--zui-kbd-emerald-bg,#10b981)] dark:bg-[var(--zui-kbd-emerald-bg-dark,#065f46)] text-[color:var(--zui-kbd-emerald-fg,#ffffff)] dark:text-[color:var(--zui-kbd-emerald-fg-dark,#ffffff)]",
|
|
21
|
+
indigo:
|
|
22
|
+
"bg-[var(--zui-kbd-indigo-bg,#3730a3)] dark:bg-[var(--zui-kbd-indigo-bg-dark,#4f46e5)] text-[color:var(--zui-kbd-indigo-fg,#ffffff)] dark:text-[color:var(--zui-kbd-indigo-fg-dark,#ffffff)]",
|
|
23
|
+
purple:
|
|
24
|
+
"bg-[var(--zui-kbd-purple-bg,#6b21a8)] dark:bg-[var(--zui-kbd-purple-bg-dark,#9333ea)] text-[color:var(--zui-kbd-purple-fg,#ffffff)] dark:text-[color:var(--zui-kbd-purple-fg-dark,#ffffff)]",
|
|
25
|
+
pink:
|
|
26
|
+
"bg-[var(--zui-kbd-pink-bg,#9d174d)] dark:bg-[var(--zui-kbd-pink-bg-dark,#db2777)] text-[color:var(--zui-kbd-pink-fg,#ffffff)] dark:text-[color:var(--zui-kbd-pink-fg-dark,#ffffff)]",
|
|
27
|
+
rose:
|
|
28
|
+
"bg-[var(--zui-kbd-rose-bg,#9f1239)] dark:bg-[var(--zui-kbd-rose-bg-dark,#e11d48)] text-[color:var(--zui-kbd-rose-fg,#ffffff)] dark:text-[color:var(--zui-kbd-rose-fg-dark,#ffffff)]",
|
|
29
|
+
sky:
|
|
30
|
+
"bg-[var(--zui-kbd-sky-bg,#0ea5e9)] dark:bg-[var(--zui-kbd-sky-bg-dark,#0369a1)] text-[color:var(--zui-kbd-sky-fg,#ffffff)] dark:text-[color:var(--zui-kbd-sky-fg-dark,#ffffff)]",
|
|
31
|
+
teal:
|
|
32
|
+
"bg-[var(--zui-kbd-teal-bg,#14b8a6)] dark:bg-[var(--zui-kbd-teal-bg-dark,#0f766e)] text-[color:var(--zui-kbd-teal-fg,#ffffff)] dark:text-[color:var(--zui-kbd-teal-fg-dark,#ffffff)]",
|
|
33
|
+
yellow:
|
|
34
|
+
"bg-[var(--zui-kbd-yellow-bg,#eab308)] dark:bg-[var(--zui-kbd-yellow-bg-dark,#854d0e)] text-[color:var(--zui-kbd-yellow-fg,#ffffff)] dark:text-[color:var(--zui-kbd-yellow-fg-dark,#ffffff)]",
|
|
35
|
+
orange:
|
|
36
|
+
"bg-[var(--zui-kbd-orange-bg,#f97316)] dark:bg-[var(--zui-kbd-orange-bg-dark,#9a3412)] text-[color:var(--zui-kbd-orange-fg,#ffffff)] dark:text-[color:var(--zui-kbd-orange-fg-dark,#ffffff)]",
|
|
37
|
+
gray:
|
|
38
|
+
"bg-[var(--zui-kbd-gray-bg,#6b7280)] dark:bg-[var(--zui-kbd-gray-bg-dark,#374151)] text-[color:var(--zui-kbd-gray-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gray-fg-dark,#ffffff)]",
|
|
39
|
+
amber:
|
|
40
|
+
"bg-[var(--zui-kbd-amber-bg,#f59e0b)] dark:bg-[var(--zui-kbd-amber-bg-dark,#92400e)] text-[color:var(--zui-kbd-amber-fg,#ffffff)] dark:text-[color:var(--zui-kbd-amber-fg-dark,#ffffff)]",
|
|
41
|
+
violet:
|
|
42
|
+
"bg-[var(--zui-kbd-violet-bg,#5b21b6)] dark:bg-[var(--zui-kbd-violet-bg-dark,#7c3aed)] text-[color:var(--zui-kbd-violet-fg,#ffffff)] dark:text-[color:var(--zui-kbd-violet-fg-dark,#ffffff)]",
|
|
43
|
+
"gradient-blue":
|
|
44
|
+
"bg-linear-to-r from-[var(--zui-kbd-gradient-blue-from,#1e40af)] dark:from-[var(--zui-kbd-gradient-blue-from-dark,#2563eb)] to-[var(--zui-kbd-gradient-blue-to,#6b21a8)] dark:to-[var(--zui-kbd-gradient-blue-to-dark,#9333ea)] text-[color:var(--zui-kbd-gradient-blue-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-blue-fg-dark,#ffffff)]",
|
|
45
|
+
"gradient-green":
|
|
46
|
+
"bg-linear-to-r from-[var(--zui-kbd-gradient-green-from,#166534)] dark:from-[var(--zui-kbd-gradient-green-from-dark,#16a34a)] to-[var(--zui-kbd-gradient-green-to,#3f6212)] dark:to-[var(--zui-kbd-gradient-green-to-dark,#65a30d)] text-[color:var(--zui-kbd-gradient-green-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-green-fg-dark,#ffffff)]",
|
|
47
|
+
"gradient-red":
|
|
48
|
+
"bg-linear-to-r from-[var(--zui-kbd-gradient-red-from,#991b1b)] dark:from-[var(--zui-kbd-gradient-red-from-dark,#dc2626)] to-[var(--zui-kbd-gradient-red-to,#9d174d)] dark:to-[var(--zui-kbd-gradient-red-to-dark,#db2777)] text-[color:var(--zui-kbd-gradient-red-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-red-fg-dark,#ffffff)]",
|
|
49
|
+
"gradient-yellow":
|
|
50
|
+
"bg-linear-to-r from-[var(--zui-kbd-gradient-yellow-from,#854d0e)] dark:from-[var(--zui-kbd-gradient-yellow-from-dark,#ca8a04)] to-[var(--zui-kbd-gradient-yellow-to,#9a3412)] dark:to-[var(--zui-kbd-gradient-yellow-to-dark,#ea580c)] text-[color:var(--zui-kbd-gradient-yellow-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-yellow-fg-dark,#ffffff)]",
|
|
51
|
+
"gradient-purple":
|
|
52
|
+
"bg-linear-to-r from-[var(--zui-kbd-gradient-purple-from,#6b21a8)] dark:from-[var(--zui-kbd-gradient-purple-from-dark,#9333ea)] to-[var(--zui-kbd-gradient-purple-to,#9d174d)] dark:to-[var(--zui-kbd-gradient-purple-to-dark,#db2777)] text-[color:var(--zui-kbd-gradient-purple-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-purple-fg-dark,#ffffff)]",
|
|
53
|
+
"gradient-teal":
|
|
54
|
+
"bg-linear-to-r from-[var(--zui-kbd-gradient-teal-from,#115e59)] dark:from-[var(--zui-kbd-gradient-teal-from-dark,#0d9488)] to-[var(--zui-kbd-gradient-teal-to,#155e75)] dark:to-[var(--zui-kbd-gradient-teal-to-dark,#0891b2)] text-[color:var(--zui-kbd-gradient-teal-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-teal-fg-dark,#ffffff)]",
|
|
55
|
+
"gradient-indigo":
|
|
56
|
+
"bg-linear-to-r from-[var(--zui-kbd-gradient-indigo-from,#3730a3)] dark:from-[var(--zui-kbd-gradient-indigo-from-dark,#4f46e5)] to-[var(--zui-kbd-gradient-indigo-to,#6b21a8)] dark:to-[var(--zui-kbd-gradient-indigo-to-dark,#9333ea)] text-[color:var(--zui-kbd-gradient-indigo-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-indigo-fg-dark,#ffffff)]",
|
|
57
|
+
"gradient-pink":
|
|
58
|
+
"bg-linear-to-r from-[var(--zui-kbd-gradient-pink-from,#9d174d)] dark:from-[var(--zui-kbd-gradient-pink-from-dark,#db2777)] to-[var(--zui-kbd-gradient-pink-to,#9f1239)] dark:to-[var(--zui-kbd-gradient-pink-to-dark,#e11d48)] text-[color:var(--zui-kbd-gradient-pink-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-pink-fg-dark,#ffffff)]",
|
|
59
|
+
"gradient-orange":
|
|
60
|
+
"bg-linear-to-r from-[var(--zui-kbd-gradient-orange-from,#9a3412)] dark:from-[var(--zui-kbd-gradient-orange-from-dark,#ea580c)] to-[var(--zui-kbd-gradient-orange-to,#991b1b)] dark:to-[var(--zui-kbd-gradient-orange-to-dark,#dc2626)] text-[color:var(--zui-kbd-gradient-orange-fg,#ffffff)] dark:text-[color:var(--zui-kbd-gradient-orange-fg-dark,#ffffff)]",
|
|
61
|
+
} as const;
|
|
62
|
+
|
|
63
|
+
export type ZuiKbdAppearance = keyof typeof zuiKbdKeyAppearances;
|
|
64
|
+
|
|
65
|
+
export const zuiKbdKeyBase = [
|
|
66
|
+
"inline-flex items-center justify-center font-mono font-medium leading-none",
|
|
67
|
+
"rounded-[var(--zui-kbd-radius,0.375rem)]",
|
|
68
|
+
"shadow-[var(--zui-kbd-shadow,inset_0_-1px_0_#0000001f)] dark:shadow-[var(--zui-kbd-shadow-dark,inset_0_-1px_0_#0000004d)]",
|
|
69
|
+
] as const;
|
|
70
|
+
|
|
71
|
+
export const zuiKbdKeySizes = {
|
|
72
|
+
sm: "h-5 min-w-5 px-1 text-[0.7rem]",
|
|
73
|
+
md: "h-6 min-w-6 px-1.5 text-xs",
|
|
74
|
+
lg: "h-7 min-w-7 px-2 text-sm",
|
|
75
|
+
} as const;
|
|
76
|
+
|
|
77
|
+
export type ZuiKbdSize = keyof typeof zuiKbdKeySizes;
|
|
78
|
+
|
|
79
|
+
export const zuiKbdSeparatorSizes = {
|
|
80
|
+
sm: "text-[0.7rem]",
|
|
81
|
+
md: "text-xs",
|
|
82
|
+
lg: "text-sm",
|
|
83
|
+
} as const;
|
package/src/hooks/index.ts
CHANGED
|
@@ -49,6 +49,18 @@ export {
|
|
|
49
49
|
useSessionStorage,
|
|
50
50
|
type UseSessionStorageResult,
|
|
51
51
|
} from "./useSessionStorage";
|
|
52
|
+
export {
|
|
53
|
+
useTableFilter,
|
|
54
|
+
type TableFilterPredicate,
|
|
55
|
+
type TableFilterState,
|
|
56
|
+
type UseTableFilterParams,
|
|
57
|
+
type UseTableFilterResult,
|
|
58
|
+
} from "./useTableFilter";
|
|
59
|
+
export {
|
|
60
|
+
useTableSort,
|
|
61
|
+
type UseTableSortParams,
|
|
62
|
+
type UseTableSortResult,
|
|
63
|
+
} from "./useTableSort";
|
|
52
64
|
export { useThrottledCallback } from "./useThrottledCallback";
|
|
53
65
|
export { useToggle } from "./useToggle";
|
|
54
66
|
export { useWindowSize, type WindowSize } from "./useWindowSize";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type TableFilterState<TKey extends string = string> = Partial<
|
|
2
|
+
Record<TKey, string>
|
|
3
|
+
>;
|
|
4
|
+
|
|
5
|
+
export type TableFilterPredicate<TData, TKey extends string = string> = (
|
|
6
|
+
row: TData,
|
|
7
|
+
filterValue: string,
|
|
8
|
+
filterKey: TKey,
|
|
9
|
+
) => boolean;
|
|
10
|
+
|
|
11
|
+
export type UseTableFilterParams<TData, TKey extends string = string> = {
|
|
12
|
+
data: readonly TData[];
|
|
13
|
+
filters?: TableFilterState<TKey>;
|
|
14
|
+
defaultFilters?: TableFilterState<TKey>;
|
|
15
|
+
onFiltersChange?: (filters: TableFilterState<TKey>) => void;
|
|
16
|
+
getColumnValue?: (row: TData, filterKey: TKey) => unknown;
|
|
17
|
+
filterPredicate?: TableFilterPredicate<TData, TKey>;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type UseTableFilterResult<TData, TKey extends string = string> = {
|
|
21
|
+
filters: TableFilterState<TKey>;
|
|
22
|
+
filteredData: TData[];
|
|
23
|
+
hasActiveFilters: boolean;
|
|
24
|
+
setFilter: (filterKey: TKey, value: string) => void;
|
|
25
|
+
setFilters: (filters: TableFilterState<TKey>) => void;
|
|
26
|
+
clearFilter: (filterKey: TKey) => void;
|
|
27
|
+
clearFilters: () => void;
|
|
28
|
+
};
|