@giddaa-housing/ui 0.1.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -6
- package/css/base.css +37 -0
- package/css/components.css +135 -0
- package/css/generated/shared.css +1 -0
- package/css/giddaa.css +402 -0
- package/css/preset.css +77 -0
- package/css/styles.css +2 -0
- package/css/theme.css +255 -0
- package/dist/accordion.d.ts +9 -10
- package/dist/accordion.js +41 -117
- package/dist/activity-timeline.d.ts +29 -0
- package/dist/activity-timeline.js +97 -0
- package/dist/alert.d.ts +8 -9
- package/dist/alert.js +53 -141
- package/dist/auth-layout.d.ts +23 -0
- package/dist/auth-layout.js +153 -0
- package/dist/avatar.d.ts +6 -6
- package/dist/avatar.js +40 -142
- package/dist/badge.d.ts +12 -13
- package/dist/badge.js +66 -114
- package/dist/bar-chart.d.ts +136 -114
- package/dist/bar-chart.js +244 -297
- package/dist/breadcrumb.d.ts +5 -5
- package/dist/breadcrumb.js +56 -148
- package/dist/bullet-chart.d.ts +33 -33
- package/dist/bullet-chart.js +123 -183
- package/dist/button-BZIeyUw6.d.ts +17 -0
- package/dist/button-group.d.ts +13 -16
- package/dist/button-group.js +38 -163
- package/dist/button.d.ts +2 -19
- package/dist/button.js +90 -142
- package/dist/calendar.d.ts +6 -6
- package/dist/calendar.js +134 -288
- package/dist/card.d.ts +14 -16
- package/dist/card.js +58 -174
- package/dist/carousel.d.ts +34 -35
- package/dist/carousel.js +319 -378
- package/dist/chart.d.ts +58 -59
- package/dist/chart.js +350 -466
- package/dist/checkbox.d.ts +10 -12
- package/dist/checkbox.js +84 -84
- package/dist/cn-BI_4DMBf.js +23 -0
- package/dist/collapsible.d.ts +7 -8
- package/dist/collapsible.js +23 -77
- package/dist/combobox.d.ts +10 -10
- package/dist/combobox.js +220 -696
- package/dist/cta.d.ts +64 -0
- package/dist/cta.js +192 -0
- package/dist/currency-selector.d.ts +41 -0
- package/dist/currency-selector.js +114 -0
- package/dist/data-table.d.ts +164 -0
- package/dist/data-table.js +673 -0
- package/dist/date-picker.d.ts +27 -20
- package/dist/date-picker.js +122 -520
- package/dist/details-card.d.ts +19 -0
- package/dist/details-card.js +118 -0
- package/dist/dialog.d.ts +13 -14
- package/dist/dialog.js +117 -320
- package/dist/dropdown-menu.d.ts +14 -14
- package/dist/dropdown-menu.js +170 -365
- package/dist/dropzone.d.ts +55 -55
- package/dist/dropzone.js +328 -467
- package/dist/editorial-card.d.ts +27 -0
- package/dist/editorial-card.js +144 -0
- package/dist/empty-state.d.ts +8 -9
- package/dist/empty-state.js +48 -135
- package/dist/field.d.ts +23 -25
- package/dist/field.js +111 -327
- package/dist/filter.d.ts +118 -0
- package/dist/filter.js +775 -0
- package/dist/footer.d.ts +40 -0
- package/dist/footer.js +227 -0
- package/dist/funnel-chart.d.ts +38 -41
- package/dist/funnel-chart.js +168 -563
- package/dist/gallery-indicator.d.ts +17 -0
- package/dist/gallery-indicator.js +75 -0
- package/dist/heatmap-chart.d.ts +95 -0
- package/dist/heatmap-chart.js +197 -0
- package/dist/infotip.d.ts +10 -0
- package/dist/infotip.js +40 -0
- package/dist/input-CfoEJ8A6.d.ts +12 -0
- package/dist/input-group.d.ts +16 -19
- package/dist/input-group.js +92 -372
- package/dist/input-size-context-C-SFx9sx.d.ts +10 -0
- package/dist/input-size-context.d.ts +2 -11
- package/dist/input-size-context.js +14 -20
- package/dist/input.d.ts +2 -13
- package/dist/input.js +23 -79
- package/dist/item.d.ts +7 -8
- package/dist/item.js +22 -89
- package/dist/kpi-card.d.ts +18 -20
- package/dist/kpi-card.js +84 -232
- package/dist/label.d.ts +6 -6
- package/dist/label.js +39 -66
- package/dist/line-chart.d.ts +88 -89
- package/dist/line-chart.js +143 -262
- package/dist/logo.d.ts +4 -4
- package/dist/logo.js +87 -141
- package/dist/map-indicator.d.ts +13 -0
- package/dist/map-indicator.js +83 -0
- package/dist/match.d.ts +15 -0
- package/dist/match.js +68 -0
- package/dist/media-gallery-hero.d.ts +58 -0
- package/dist/media-gallery-hero.js +201 -0
- package/dist/media-player.d.ts +60 -0
- package/dist/media-player.js +919 -0
- package/dist/multi-step-form.d.ts +56 -0
- package/dist/multi-step-form.js +342 -0
- package/dist/number-input.d.ts +34 -34
- package/dist/number-input.js +62 -413
- package/dist/page-header.d.ts +10 -11
- package/dist/page-header.js +34 -107
- package/dist/pagination.d.ts +17 -20
- package/dist/pagination.js +132 -341
- package/dist/password-input.d.ts +5 -12
- package/dist/password-input.js +32 -354
- package/dist/phone-input.d.ts +19 -19
- package/dist/phone-input.js +232 -561
- package/dist/photo-gallery.d.ts +20 -20
- package/dist/photo-gallery.js +314 -746
- package/dist/picker-lzgmsNfG.js +32 -0
- package/dist/pie-chart.d.ts +60 -60
- package/dist/pie-chart.js +141 -184
- package/dist/popover.d.ts +9 -9
- package/dist/popover.js +60 -156
- package/dist/price-tag.d.ts +34 -0
- package/dist/price-tag.js +118 -0
- package/dist/progress.d.ts +18 -16
- package/dist/progress.js +156 -300
- package/dist/property-listing-card.d.ts +29 -0
- package/dist/property-listing-card.js +117 -0
- package/dist/radar-chart.d.ts +108 -0
- package/dist/radar-chart.js +172 -0
- package/dist/radio-group.d.ts +11 -13
- package/dist/radio-group.js +47 -96
- package/dist/review-block.d.ts +18 -0
- package/dist/review-block.js +154 -0
- package/dist/rich-text-editor.d.ts +30 -14
- package/dist/rich-text-editor.js +594 -979
- package/dist/scatter-chart.d.ts +140 -0
- package/dist/scatter-chart.js +248 -0
- package/dist/search-input.d.ts +8 -15
- package/dist/search-input.js +58 -408
- package/dist/select.d.ts +8 -8
- package/dist/select.js +131 -291
- package/dist/separator.d.ts +8 -9
- package/dist/separator.js +31 -70
- package/dist/sheet.d.ts +11 -11
- package/dist/sheet.js +84 -262
- package/dist/sidebar.d.ts +32 -37
- package/dist/sidebar.js +380 -1055
- package/dist/size-context-D4mYvcg8.d.ts +10 -0
- package/dist/size-context.d.ts +2 -11
- package/dist/size-context.js +14 -18
- package/dist/skeleton.d.ts +4 -5
- package/dist/skeleton.js +9 -45
- package/dist/slider.d.ts +27 -0
- package/dist/slider.js +81 -0
- package/dist/sparkline.d.ts +43 -46
- package/dist/sparkline.js +223 -561
- package/dist/stepper.d.ts +23 -24
- package/dist/stepper.js +149 -276
- package/dist/styles.css +9995 -2
- package/dist/switch.d.ts +10 -12
- package/dist/switch.js +49 -106
- package/dist/table-card.d.ts +35 -0
- package/dist/table-card.js +125 -0
- package/dist/table.d.ts +18 -14
- package/dist/table.js +114 -182
- package/dist/tabs.d.ts +23 -15
- package/dist/tabs.js +62 -149
- package/dist/tag.d.ts +22 -23
- package/dist/tag.js +104 -156
- package/dist/testimonial-block.d.ts +33 -0
- package/dist/testimonial-block.js +208 -0
- package/dist/textarea-IS_D8pXf.d.ts +11 -0
- package/dist/textarea.d.ts +2 -12
- package/dist/textarea.js +20 -74
- package/dist/time-picker.d.ts +11 -11
- package/dist/time-picker.js +247 -464
- package/dist/toast.d.ts +16 -18
- package/dist/toast.js +154 -310
- package/dist/tooltip.d.ts +9 -10
- package/dist/tooltip.js +33 -91
- package/dist/tree-map.d.ts +54 -57
- package/dist/tree-map.js +231 -646
- package/dist/use-uncontrolled-CLfM1XbB.js +21 -0
- package/dist/waterfall-chart.d.ts +126 -0
- package/dist/waterfall-chart.js +480 -0
- package/package.json +123 -34
- package/dist/accordion.js.map +0 -1
- package/dist/alert.js.map +0 -1
- package/dist/avatar.js.map +0 -1
- package/dist/badge.js.map +0 -1
- package/dist/bar-chart.js.map +0 -1
- package/dist/base.css +0 -32
- package/dist/breadcrumb.js.map +0 -1
- package/dist/bullet-chart.js.map +0 -1
- package/dist/button-group.js.map +0 -1
- package/dist/button.js.map +0 -1
- package/dist/calendar.js.map +0 -1
- package/dist/card.js.map +0 -1
- package/dist/carousel.js.map +0 -1
- package/dist/chart.js.map +0 -1
- package/dist/checkbox.js.map +0 -1
- package/dist/collapsible.js.map +0 -1
- package/dist/combobox.js.map +0 -1
- package/dist/date-picker.js.map +0 -1
- package/dist/dialog.js.map +0 -1
- package/dist/dropdown-menu.js.map +0 -1
- package/dist/dropzone.js.map +0 -1
- package/dist/empty-state.js.map +0 -1
- package/dist/field.js.map +0 -1
- package/dist/files/red-hat-display-latin-300-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-300-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-300-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-300-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-400-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-400-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-400-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-400-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-500-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-500-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-500-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-500-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-600-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-600-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-600-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-600-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-700-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-700-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-700-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-700-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-800-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-800-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-800-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-800-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-900-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-900-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-900-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-900-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-300-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-300-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-300-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-300-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-400-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-400-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-400-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-400-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-500-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-500-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-500-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-500-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-600-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-600-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-600-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-600-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-700-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-700-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-700-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-700-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-800-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-800-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-800-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-800-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-900-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-900-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-900-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-900-normal.woff2 +0 -0
- package/dist/funnel-chart.js.map +0 -1
- package/dist/index.d.ts +0 -87
- package/dist/index.js +0 -10448
- package/dist/index.js.map +0 -1
- package/dist/input-group.js.map +0 -1
- package/dist/input-size-context.js.map +0 -1
- package/dist/input.js.map +0 -1
- package/dist/item.js.map +0 -1
- package/dist/kpi-card.js.map +0 -1
- package/dist/label.js.map +0 -1
- package/dist/line-chart.js.map +0 -1
- package/dist/logo.js.map +0 -1
- package/dist/number-input.js.map +0 -1
- package/dist/page-header.js.map +0 -1
- package/dist/pagination.js.map +0 -1
- package/dist/password-input.js.map +0 -1
- package/dist/phone-input.js.map +0 -1
- package/dist/photo-gallery.js.map +0 -1
- package/dist/pie-chart.js.map +0 -1
- package/dist/popover.js.map +0 -1
- package/dist/progress.js.map +0 -1
- package/dist/radio-group.js.map +0 -1
- package/dist/red-hat-display.css +0 -2
- package/dist/rich-text-editor.js.map +0 -1
- package/dist/search-input.js.map +0 -1
- package/dist/select.js.map +0 -1
- package/dist/separator.js.map +0 -1
- package/dist/sheet.js.map +0 -1
- package/dist/sidebar.js.map +0 -1
- package/dist/size-context.js.map +0 -1
- package/dist/skeleton.js.map +0 -1
- package/dist/sparkline.js.map +0 -1
- package/dist/stepper.js.map +0 -1
- package/dist/switch.js.map +0 -1
- package/dist/tab-list.d.ts +0 -38
- package/dist/tab-list.js +0 -394
- package/dist/tab-list.js.map +0 -1
- package/dist/table.js.map +0 -1
- package/dist/tabs.js.map +0 -1
- package/dist/tag.js.map +0 -1
- package/dist/textarea.js.map +0 -1
- package/dist/theme/giddaa.css +0 -2
- package/dist/time-picker.js.map +0 -1
- package/dist/toast.js.map +0 -1
- package/dist/tooltip.js.map +0 -1
- package/dist/tree-map.js.map +0 -1
package/dist/chart.js
CHANGED
|
@@ -1,494 +1,378 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as cn } from "./cn-BI_4DMBf.js";
|
|
3
|
+
import { SizeProvider, useComponentSize } from "./size-context.js";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
5
|
import { cva } from "class-variance-authority";
|
|
3
6
|
import * as React from "react";
|
|
4
7
|
import * as RechartsPrimitive from "recharts";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
{
|
|
14
|
-
text: [
|
|
15
|
-
"gdt-display",
|
|
16
|
-
"gdt-h1",
|
|
17
|
-
"gdt-h2",
|
|
18
|
-
"gdt-h3",
|
|
19
|
-
"gdt-h4",
|
|
20
|
-
"gdt-h5",
|
|
21
|
-
"gdt-xl",
|
|
22
|
-
"gdt-lg",
|
|
23
|
-
"gdt-md",
|
|
24
|
-
"gdt-sm",
|
|
25
|
-
"gdt-xs",
|
|
26
|
-
"gdt-subtext",
|
|
27
|
-
"gdt-capitalized"
|
|
28
|
-
]
|
|
29
|
-
}
|
|
30
|
-
]
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
function cn(...inputs) {
|
|
35
|
-
return twMerge(clsx(inputs));
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// src/components/ui/size-context.tsx
|
|
39
|
-
import { createContext, useContext } from "react";
|
|
40
|
-
import { Fragment, jsx } from "react/jsx-runtime";
|
|
41
|
-
var SizeContext = createContext(void 0);
|
|
42
|
-
function SizeProvider({
|
|
43
|
-
children,
|
|
44
|
-
size
|
|
45
|
-
}) {
|
|
46
|
-
if (!size) {
|
|
47
|
-
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
48
|
-
}
|
|
49
|
-
return /* @__PURE__ */ jsx(SizeContext.Provider, { value: size, children });
|
|
50
|
-
}
|
|
51
|
-
function useComponentSize(size, fallback = "md") {
|
|
52
|
-
const inheritedSize = useContext(SizeContext);
|
|
53
|
-
return size ?? inheritedSize ?? fallback;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// src/components/ui/chart.tsx
|
|
57
|
-
import { Fragment as Fragment2, jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
58
|
-
var SERIES_COLOR_PLACEHOLDER = "var(--color-surface-brand)";
|
|
8
|
+
//#region src/chart.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Markers use `--color-surface-brand` as a placeholder. Giddaa has no
|
|
11
|
+
* categorical chart palette yet — add `chart-1`…`chart-N` tokens and bind each
|
|
12
|
+
* series (its legend marker and tooltip dot) to its own colour once they exist.
|
|
13
|
+
* Until then any series without an explicit colour paints brand-green.
|
|
14
|
+
*/
|
|
15
|
+
const SERIES_COLOR_PLACEHOLDER = "var(--color-surface-brand)";
|
|
59
16
|
function formatChartValue(value, type) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
return `${value.toLocaleString("en-NG", {
|
|
71
|
-
minimumFractionDigits: 1,
|
|
72
|
-
maximumFractionDigits: 1
|
|
73
|
-
})}%`;
|
|
74
|
-
default:
|
|
75
|
-
return value.toLocaleString("en-NG");
|
|
76
|
-
}
|
|
17
|
+
if (Array.isArray(value)) return value.join(", ");
|
|
18
|
+
if (typeof value !== "number") return value == null ? "" : String(value);
|
|
19
|
+
switch (type) {
|
|
20
|
+
case "currency": return `₦${value.toLocaleString("en-NG")}`;
|
|
21
|
+
case "percentage": return `${value.toLocaleString("en-NG", {
|
|
22
|
+
minimumFractionDigits: 1,
|
|
23
|
+
maximumFractionDigits: 1
|
|
24
|
+
})}%`;
|
|
25
|
+
default: return value.toLocaleString("en-NG");
|
|
26
|
+
}
|
|
77
27
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
28
|
+
const THEMES = {
|
|
29
|
+
light: "",
|
|
30
|
+
dark: ".dark"
|
|
31
|
+
};
|
|
32
|
+
const INITIAL_DIMENSION = {
|
|
33
|
+
width: 320,
|
|
34
|
+
height: 200
|
|
35
|
+
};
|
|
36
|
+
const ChartContext = React.createContext(null);
|
|
81
37
|
function useChart() {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
return context;
|
|
38
|
+
const context = React.useContext(ChartContext);
|
|
39
|
+
if (!context) throw new Error("useChart must be used within a <ChartContainer />");
|
|
40
|
+
return context;
|
|
87
41
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Shared chart frame — the chrome that surrounds the plot of any chart type
|
|
44
|
+
* (bar, line, area, pie). These are presentational, domain-free, and size-aware:
|
|
45
|
+
* a `size` flows through `SizeProvider` so the plot and its labels can scale
|
|
46
|
+
* with the card. Compose them with the plot primitives:
|
|
47
|
+
*
|
|
48
|
+
* <ChartCard size="md">
|
|
49
|
+
* <ChartHeader>
|
|
50
|
+
* <ChartTitle>Revenue Overview</ChartTitle>
|
|
51
|
+
* <ChartDescription>Monthly revenue · Jan–Jul</ChartDescription>
|
|
52
|
+
* </ChartHeader>
|
|
53
|
+
* <ChartContainer config={config}>{/* recharts plot *\/}</ChartContainer>
|
|
54
|
+
* </ChartCard>
|
|
55
|
+
*/
|
|
56
|
+
const chartCardVariants = cva("flex w-full min-w-0 flex-col rounded-2xl border border-line-subtle bg-surface-raised text-fg-primary shadow-1", {
|
|
57
|
+
variants: { size: {
|
|
58
|
+
sm: "gap-3 p-4",
|
|
59
|
+
md: "gap-4 p-5",
|
|
60
|
+
lg: "gap-5 p-6"
|
|
61
|
+
} },
|
|
62
|
+
defaultVariants: { size: "md" }
|
|
63
|
+
});
|
|
64
|
+
function ChartCard({ className, size, children, ...props }) {
|
|
65
|
+
const resolvedSize = useComponentSize(size);
|
|
66
|
+
return /* @__PURE__ */ jsx(SizeProvider, {
|
|
67
|
+
size: resolvedSize,
|
|
68
|
+
children: /* @__PURE__ */ jsx("section", {
|
|
69
|
+
"data-slot": "chart-card",
|
|
70
|
+
className: cn(chartCardVariants({ size: resolvedSize }), className),
|
|
71
|
+
...props,
|
|
72
|
+
children
|
|
73
|
+
})
|
|
74
|
+
});
|
|
117
75
|
}
|
|
118
76
|
function ChartHeader({ className, ...props }) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
...props
|
|
125
|
-
}
|
|
126
|
-
);
|
|
77
|
+
return /* @__PURE__ */ jsx("div", {
|
|
78
|
+
"data-slot": "chart-header",
|
|
79
|
+
className: cn("flex min-w-0 flex-col gap-1", className),
|
|
80
|
+
...props
|
|
81
|
+
});
|
|
127
82
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
},
|
|
136
|
-
defaultVariants: { size: "md" }
|
|
83
|
+
const chartTitleVariants = cva("min-w-0 font-bold text-fg-primary", {
|
|
84
|
+
variants: { size: {
|
|
85
|
+
sm: "text-gdt-md",
|
|
86
|
+
md: "text-gdt-lg",
|
|
87
|
+
lg: "text-gdt-h5"
|
|
88
|
+
} },
|
|
89
|
+
defaultVariants: { size: "md" }
|
|
137
90
|
});
|
|
138
|
-
function ChartTitle({
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
"h3",
|
|
146
|
-
{
|
|
147
|
-
"data-slot": "chart-title",
|
|
148
|
-
className: cn(chartTitleVariants({ size: resolvedSize }), className),
|
|
149
|
-
...props
|
|
150
|
-
}
|
|
151
|
-
);
|
|
91
|
+
function ChartTitle({ className, size, ...props }) {
|
|
92
|
+
const resolvedSize = useComponentSize(size);
|
|
93
|
+
return /* @__PURE__ */ jsx("h3", {
|
|
94
|
+
"data-slot": "chart-title",
|
|
95
|
+
className: cn(chartTitleVariants({ size: resolvedSize }), className),
|
|
96
|
+
...props
|
|
97
|
+
});
|
|
152
98
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
},
|
|
161
|
-
defaultVariants: { size: "md" }
|
|
99
|
+
const chartDescriptionVariants = cva("min-w-0 font-normal text-fg-secondary", {
|
|
100
|
+
variants: { size: {
|
|
101
|
+
sm: "text-gdt-xs",
|
|
102
|
+
md: "text-gdt-sm",
|
|
103
|
+
lg: "text-gdt-sm"
|
|
104
|
+
} },
|
|
105
|
+
defaultVariants: { size: "md" }
|
|
162
106
|
});
|
|
163
|
-
function ChartDescription({
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
})
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
"p",
|
|
171
|
-
{
|
|
172
|
-
"data-slot": "chart-description",
|
|
173
|
-
className: cn(
|
|
174
|
-
chartDescriptionVariants({ size: resolvedSize }),
|
|
175
|
-
className
|
|
176
|
-
),
|
|
177
|
-
...props
|
|
178
|
-
}
|
|
179
|
-
);
|
|
107
|
+
function ChartDescription({ className, size, ...props }) {
|
|
108
|
+
const resolvedSize = useComponentSize(size);
|
|
109
|
+
return /* @__PURE__ */ jsx("p", {
|
|
110
|
+
"data-slot": "chart-description",
|
|
111
|
+
className: cn(chartDescriptionVariants({ size: resolvedSize }), className),
|
|
112
|
+
...props
|
|
113
|
+
});
|
|
180
114
|
}
|
|
181
|
-
function ChartContainer({
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
...props,
|
|
201
|
-
children: [
|
|
202
|
-
/* @__PURE__ */ jsx2(ChartStyle, { id: chartId, config }),
|
|
203
|
-
/* @__PURE__ */ jsx2(
|
|
204
|
-
RechartsPrimitive.ResponsiveContainer,
|
|
205
|
-
{
|
|
206
|
-
initialDimension,
|
|
207
|
-
children
|
|
208
|
-
}
|
|
209
|
-
)
|
|
210
|
-
]
|
|
211
|
-
}
|
|
212
|
-
) });
|
|
115
|
+
function ChartContainer({ id, className, children, config, initialDimension = INITIAL_DIMENSION, ...props }) {
|
|
116
|
+
const uniqueId = React.useId();
|
|
117
|
+
const chartId = `chart-${id ?? uniqueId.replace(/:/g, "")}`;
|
|
118
|
+
return /* @__PURE__ */ jsx(ChartContext.Provider, {
|
|
119
|
+
value: { config },
|
|
120
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
121
|
+
"data-slot": "chart",
|
|
122
|
+
"data-chart": chartId,
|
|
123
|
+
className: cn("flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden", className),
|
|
124
|
+
...props,
|
|
125
|
+
children: [/* @__PURE__ */ jsx(ChartStyle, {
|
|
126
|
+
id: chartId,
|
|
127
|
+
config
|
|
128
|
+
}), /* @__PURE__ */ jsx(RechartsPrimitive.ResponsiveContainer, {
|
|
129
|
+
initialDimension,
|
|
130
|
+
children
|
|
131
|
+
})]
|
|
132
|
+
})
|
|
133
|
+
});
|
|
213
134
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
if (!colorConfig.length) {
|
|
219
|
-
return null;
|
|
220
|
-
}
|
|
221
|
-
const styleContent = Object.entries(THEMES).map(
|
|
222
|
-
([theme, prefix]) => `
|
|
135
|
+
const ChartStyle = ({ id, config }) => {
|
|
136
|
+
const colorConfig = Object.entries(config).filter(([, config]) => config.theme ?? config.color);
|
|
137
|
+
if (!colorConfig.length) return null;
|
|
138
|
+
return /* @__PURE__ */ jsx("style", { children: Object.entries(THEMES).map(([theme, prefix]) => `
|
|
223
139
|
${prefix} [data-chart=${id}] {
|
|
224
140
|
${colorConfig.map(([key, itemConfig]) => {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
141
|
+
const color = itemConfig.theme?.[theme] ?? itemConfig.color;
|
|
142
|
+
return color ? ` --color-${key}: ${color};` : null;
|
|
143
|
+
}).join("\n")}
|
|
228
144
|
}
|
|
229
|
-
`
|
|
230
|
-
).join("\n");
|
|
231
|
-
return /* @__PURE__ */ jsx2("style", { children: styleContent });
|
|
145
|
+
`).join("\n") });
|
|
232
146
|
};
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
147
|
+
const ChartTooltip = RechartsPrimitive.Tooltip;
|
|
148
|
+
/**
|
|
149
|
+
* Hover tooltip for a chart data point. It surfaces a single precise value with
|
|
150
|
+
* type-appropriate formatting — grouped integers, percentages, or ₦-prefixed
|
|
151
|
+
* currency — sitting on an elevated overlay (bg-surface-overlay, Shadow-2,
|
|
152
|
+
* 1px border-subtle) so users can read exact figures without leaving the chart.
|
|
153
|
+
*
|
|
154
|
+
* Anatomy: series dot · metric label · hero value · period caption.
|
|
155
|
+
*/
|
|
156
|
+
const chartTooltipVariants = cva("flex flex-col bg-surface-overlay border border-line-subtle shadow-2", {
|
|
157
|
+
variants: { size: {
|
|
158
|
+
xs: "gap-0.5 rounded-md p-2",
|
|
159
|
+
sm: "gap-0.5 rounded-md p-2.5",
|
|
160
|
+
md: "gap-1 rounded-lg p-3",
|
|
161
|
+
lg: "gap-1 rounded-xl p-3.5"
|
|
162
|
+
} },
|
|
163
|
+
defaultVariants: { size: "md" }
|
|
164
|
+
});
|
|
165
|
+
const chartTooltipDotVariants = cva("shrink-0 rounded-full", {
|
|
166
|
+
variants: { size: {
|
|
167
|
+
xs: "size-1.5",
|
|
168
|
+
sm: "size-2",
|
|
169
|
+
md: "size-2.5",
|
|
170
|
+
lg: "size-2.5"
|
|
171
|
+
} },
|
|
172
|
+
defaultVariants: { size: "md" }
|
|
173
|
+
});
|
|
174
|
+
const chartTooltipLabelVariants = cva("font-medium text-fg-secondary", {
|
|
175
|
+
variants: { size: {
|
|
176
|
+
xs: "text-gdt-xs",
|
|
177
|
+
sm: "text-gdt-xs",
|
|
178
|
+
md: "text-gdt-sm",
|
|
179
|
+
lg: "text-gdt-sm"
|
|
180
|
+
} },
|
|
181
|
+
defaultVariants: { size: "md" }
|
|
262
182
|
});
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
},
|
|
272
|
-
defaultVariants: { size: "md" }
|
|
183
|
+
const chartTooltipValueVariants = cva("font-extrabold text-fg-primary tabular-nums", {
|
|
184
|
+
variants: { size: {
|
|
185
|
+
xs: "text-gdt-sm",
|
|
186
|
+
sm: "text-gdt-md",
|
|
187
|
+
md: "text-gdt-lg",
|
|
188
|
+
lg: "text-gdt-xl"
|
|
189
|
+
} },
|
|
190
|
+
defaultVariants: { size: "md" }
|
|
273
191
|
});
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
}
|
|
309
|
-
const key = `${nameKey ?? item.name ?? item.dataKey ?? "value"}`;
|
|
310
|
-
const itemConfig = getPayloadConfigFromPayload(config, item, key);
|
|
311
|
-
const dotColor = color ?? item.payload?.fill ?? item.color ?? SERIES_COLOR_PLACEHOLDER;
|
|
312
|
-
const metricLabel = itemConfig?.label ?? item.name;
|
|
313
|
-
const heroValue = formatter ? formatter(item.value, item.name ?? "", item, 0, item.payload) : formatChartValue(item.value, valueType);
|
|
314
|
-
const periodCaption = labelFormatter ? labelFormatter(label, payload) : (typeof label === "string" ? config[label]?.label : null) ?? label;
|
|
315
|
-
return /* @__PURE__ */ jsxs("div", { className: cn(chartTooltipVariants({ size }), className), children: [
|
|
316
|
-
metricLabel != null && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 [&>svg]:size-3 [&>svg]:shrink-0", children: [
|
|
317
|
-
!hideIndicator && (itemConfig?.icon ? /* @__PURE__ */ jsx2(itemConfig.icon, {}) : /* @__PURE__ */ jsx2(
|
|
318
|
-
"span",
|
|
319
|
-
{
|
|
320
|
-
"aria-hidden": "true",
|
|
321
|
-
className: cn(chartTooltipDotVariants({ size })),
|
|
322
|
-
style: { backgroundColor: dotColor }
|
|
323
|
-
}
|
|
324
|
-
)),
|
|
325
|
-
/* @__PURE__ */ jsx2("span", { className: cn(chartTooltipLabelVariants({ size })), children: metricLabel })
|
|
326
|
-
] }),
|
|
327
|
-
/* @__PURE__ */ jsx2("p", { className: cn(chartTooltipValueVariants({ size })), children: heroValue }),
|
|
328
|
-
periodCaption != null && periodCaption !== "" && /* @__PURE__ */ jsx2("p", { className: "text-gdt-xs text-fg-caption-placeholder", children: periodCaption })
|
|
329
|
-
] });
|
|
192
|
+
function ChartTooltipContent({ active, payload, className, hideIndicator = false, label, labelFormatter, formatter, color, nameKey, valueType = "number", size = "md" }) {
|
|
193
|
+
const { config } = useChart();
|
|
194
|
+
if (!active || !payload?.length) return null;
|
|
195
|
+
const [item] = payload.filter((entry) => entry.type !== "none");
|
|
196
|
+
if (!item) return null;
|
|
197
|
+
const itemConfig = getPayloadConfigFromPayload(config, item, `${nameKey ?? item.name ?? item.dataKey ?? "value"}`);
|
|
198
|
+
const dotColor = color ?? item.payload?.fill ?? item.color ?? SERIES_COLOR_PLACEHOLDER;
|
|
199
|
+
const metricLabel = itemConfig?.label ?? item.name;
|
|
200
|
+
const heroValue = formatter ? formatter(item.value, item.name ?? "", item, 0, item.payload) : formatChartValue(item.value, valueType);
|
|
201
|
+
const periodCaption = labelFormatter ? labelFormatter(label, payload) : (typeof label === "string" ? config[label]?.label : null) ?? label;
|
|
202
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
203
|
+
className: cn(chartTooltipVariants({ size }), className),
|
|
204
|
+
children: [
|
|
205
|
+
metricLabel != null && /* @__PURE__ */ jsxs("div", {
|
|
206
|
+
className: "flex items-center gap-1.5 [&>svg]:size-3 [&>svg]:shrink-0",
|
|
207
|
+
children: [!hideIndicator && (itemConfig?.icon ? /* @__PURE__ */ jsx(itemConfig.icon, {}) : /* @__PURE__ */ jsx("span", {
|
|
208
|
+
"aria-hidden": "true",
|
|
209
|
+
className: cn(chartTooltipDotVariants({ size })),
|
|
210
|
+
style: { backgroundColor: dotColor }
|
|
211
|
+
})), /* @__PURE__ */ jsx("span", {
|
|
212
|
+
className: cn(chartTooltipLabelVariants({ size })),
|
|
213
|
+
children: metricLabel
|
|
214
|
+
})]
|
|
215
|
+
}),
|
|
216
|
+
/* @__PURE__ */ jsx("p", {
|
|
217
|
+
className: cn(chartTooltipValueVariants({ size })),
|
|
218
|
+
children: heroValue
|
|
219
|
+
}),
|
|
220
|
+
periodCaption != null && periodCaption !== "" && /* @__PURE__ */ jsx("p", {
|
|
221
|
+
className: "text-gdt-xs text-fg-caption-placeholder",
|
|
222
|
+
children: periodCaption
|
|
223
|
+
})
|
|
224
|
+
]
|
|
225
|
+
});
|
|
330
226
|
}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
inactive: false
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
);
|
|
356
|
-
var chartLegendMarkerSizeVariants = cva("shrink-0", {
|
|
357
|
-
variants: {
|
|
358
|
-
marker: {
|
|
359
|
-
dot: "rounded-full",
|
|
360
|
-
square: "rounded-[2px]",
|
|
361
|
-
line: "rounded-full"
|
|
362
|
-
},
|
|
363
|
-
size: {
|
|
364
|
-
sm: "",
|
|
365
|
-
md: ""
|
|
366
|
-
}
|
|
367
|
-
},
|
|
368
|
-
compoundVariants: [
|
|
369
|
-
{ marker: ["dot", "square"], size: "sm", className: "size-2" },
|
|
370
|
-
{ marker: ["dot", "square"], size: "md", className: "size-2.5" },
|
|
371
|
-
{ marker: "line", size: "sm", className: "h-[3px] w-3" },
|
|
372
|
-
{ marker: "line", size: "md", className: "h-[3px] w-3.5" }
|
|
373
|
-
],
|
|
374
|
-
defaultVariants: { marker: "dot", size: "md" }
|
|
227
|
+
const ChartLegend = RechartsPrimitive.Legend;
|
|
228
|
+
const chartLegendItemVariants = cva("group/legend-item flex items-center rounded-md leading-none text-fg-primary transition-colors [&>svg]:shrink-0", {
|
|
229
|
+
variants: {
|
|
230
|
+
size: {
|
|
231
|
+
sm: "gap-1.5 px-2 py-1 text-gdt-xs [&>svg]:size-3",
|
|
232
|
+
md: "gap-2 px-2.5 py-1.5 text-gdt-sm [&>svg]:size-3.5"
|
|
233
|
+
},
|
|
234
|
+
interactive: {
|
|
235
|
+
true: "cursor-pointer outline-none hover:bg-surface-raised focus-visible:bg-surface-raised",
|
|
236
|
+
false: ""
|
|
237
|
+
},
|
|
238
|
+
inactive: {
|
|
239
|
+
true: "text-fg-caption-placeholder line-through",
|
|
240
|
+
false: ""
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
defaultVariants: {
|
|
244
|
+
size: "md",
|
|
245
|
+
interactive: false,
|
|
246
|
+
inactive: false
|
|
247
|
+
}
|
|
375
248
|
});
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
249
|
+
const chartLegendMarkerSizeVariants = cva("shrink-0", {
|
|
250
|
+
variants: {
|
|
251
|
+
marker: {
|
|
252
|
+
dot: "rounded-full",
|
|
253
|
+
square: "rounded-[2px]",
|
|
254
|
+
line: "rounded-full"
|
|
255
|
+
},
|
|
256
|
+
size: {
|
|
257
|
+
sm: "",
|
|
258
|
+
md: ""
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
compoundVariants: [
|
|
262
|
+
{
|
|
263
|
+
marker: ["dot", "square"],
|
|
264
|
+
size: "sm",
|
|
265
|
+
className: "size-2"
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
marker: ["dot", "square"],
|
|
269
|
+
size: "md",
|
|
270
|
+
className: "size-2.5"
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
marker: "line",
|
|
274
|
+
size: "sm",
|
|
275
|
+
className: "h-[3px] w-3"
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
marker: "line",
|
|
279
|
+
size: "md",
|
|
280
|
+
className: "h-[3px] w-3.5"
|
|
281
|
+
}
|
|
282
|
+
],
|
|
283
|
+
defaultVariants: {
|
|
284
|
+
marker: "dot",
|
|
285
|
+
size: "md"
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
/**
|
|
289
|
+
* A shared legend for all chart types. Each item pairs a series marker with a
|
|
290
|
+
* label and can be toggled to hide or show its series — the inactive state mutes
|
|
291
|
+
* the marker and strikes through the label. Items compose into horizontal rows
|
|
292
|
+
* or vertical columns, in two sizes, with dot, square, or line markers.
|
|
293
|
+
*
|
|
294
|
+
* Toggling: pass `onToggle` to make items interactive. Inactive items are read
|
|
295
|
+
* from each payload entry's `inactive` flag (recharts sets this when wired) or
|
|
296
|
+
* the controlled `inactiveKeys` set.
|
|
297
|
+
*/
|
|
298
|
+
function ChartLegendContent({ className, hideIcon = false, payload, verticalAlign = "bottom", nameKey, marker = "dot", size = "md", orientation = "horizontal", inactiveKeys, onToggle }) {
|
|
299
|
+
const { config } = useChart();
|
|
300
|
+
if (!payload?.length) return null;
|
|
301
|
+
const inactiveSet = inactiveKeys ? new Set(inactiveKeys) : void 0;
|
|
302
|
+
const interactive = Boolean(onToggle);
|
|
303
|
+
return /* @__PURE__ */ jsx("div", {
|
|
304
|
+
className: cn("flex", orientation === "vertical" ? "flex-col items-start gap-0.5" : "flex-row flex-wrap items-center justify-center gap-x-1 gap-y-0.5", verticalAlign === "top" ? "pb-3" : "pt-3", className),
|
|
305
|
+
children: payload.filter((item) => item.type !== "none").map((item, index) => {
|
|
306
|
+
const key = `${nameKey ?? item.dataKey ?? "value"}`;
|
|
307
|
+
const itemKey = `${item.dataKey ?? item.value ?? index}`;
|
|
308
|
+
const itemConfig = getPayloadConfigFromPayload(config, item, key);
|
|
309
|
+
const inactive = (inactiveSet?.has(key) ?? false) || Boolean(item.inactive);
|
|
310
|
+
const markerColor = inactive ? "var(--color-fg-caption-placeholder)" : item.color ?? SERIES_COLOR_PLACEHOLDER;
|
|
311
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [itemConfig?.icon && !hideIcon ? /* @__PURE__ */ jsx(itemConfig.icon, {}) : /* @__PURE__ */ jsx("span", {
|
|
312
|
+
"aria-hidden": "true",
|
|
313
|
+
className: cn(chartLegendMarkerSizeVariants({
|
|
314
|
+
marker,
|
|
315
|
+
size
|
|
316
|
+
})),
|
|
317
|
+
style: { backgroundColor: markerColor }
|
|
318
|
+
}), itemConfig?.label ?? item.value] });
|
|
319
|
+
if (interactive) return /* @__PURE__ */ jsx("button", {
|
|
320
|
+
type: "button",
|
|
321
|
+
"aria-pressed": !inactive,
|
|
322
|
+
onClick: () => onToggle?.(key),
|
|
323
|
+
className: cn(chartLegendItemVariants({
|
|
324
|
+
size,
|
|
325
|
+
interactive,
|
|
326
|
+
inactive
|
|
327
|
+
})),
|
|
328
|
+
children: content
|
|
329
|
+
}, itemKey);
|
|
330
|
+
return /* @__PURE__ */ jsx("div", {
|
|
331
|
+
className: cn(chartLegendItemVariants({
|
|
332
|
+
size,
|
|
333
|
+
interactive,
|
|
334
|
+
inactive
|
|
335
|
+
})),
|
|
336
|
+
children: content
|
|
337
|
+
}, itemKey);
|
|
338
|
+
})
|
|
339
|
+
});
|
|
450
340
|
}
|
|
341
|
+
/**
|
|
342
|
+
* Shared `<XAxis>`/`<YAxis>` props — the giddaa cartesian-axis defaults (no tick
|
|
343
|
+
* or axis lines, a size-scaled tick font, and a reserved value-axis width) that
|
|
344
|
+
* every bar and line chart would otherwise repeat per axis. Spread the result
|
|
345
|
+
* onto the recharts axis, then add the chart-specific props (`dataKey`,
|
|
346
|
+
* `domain`, `ticks`, a `width`/`type` override, …):
|
|
347
|
+
*
|
|
348
|
+
* const chart = useBarChartLayout();
|
|
349
|
+
* <XAxis dataKey="month" {...chart.xAxis} />
|
|
350
|
+
* <YAxis domain={[0, 120]} {...chart.yAxis} />
|
|
351
|
+
*/
|
|
451
352
|
function cartesianAxisProps(layout) {
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
353
|
+
const tick = { fontSize: layout.tickFontSize };
|
|
354
|
+
return {
|
|
355
|
+
xAxis: {
|
|
356
|
+
tickLine: false,
|
|
357
|
+
axisLine: false,
|
|
358
|
+
tickMargin: layout.tickMargin,
|
|
359
|
+
tick
|
|
360
|
+
},
|
|
361
|
+
yAxis: {
|
|
362
|
+
tickLine: false,
|
|
363
|
+
axisLine: false,
|
|
364
|
+
width: layout.yAxisWidth,
|
|
365
|
+
tick
|
|
366
|
+
}
|
|
367
|
+
};
|
|
467
368
|
}
|
|
468
369
|
function getPayloadConfigFromPayload(config, payload, key) {
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
configLabelKey = payload[key];
|
|
476
|
-
} else if (payloadPayload && key in payloadPayload && typeof payloadPayload[key] === "string") {
|
|
477
|
-
configLabelKey = payloadPayload[key];
|
|
478
|
-
}
|
|
479
|
-
return configLabelKey in config ? config[configLabelKey] : config[key];
|
|
370
|
+
if (typeof payload !== "object" || payload === null) return;
|
|
371
|
+
const payloadPayload = "payload" in payload && typeof payload.payload === "object" && payload.payload !== null ? payload.payload : void 0;
|
|
372
|
+
let configLabelKey = key;
|
|
373
|
+
if (key in payload && typeof payload[key] === "string") configLabelKey = payload[key];
|
|
374
|
+
else if (payloadPayload && key in payloadPayload && typeof payloadPayload[key] === "string") configLabelKey = payloadPayload[key];
|
|
375
|
+
return configLabelKey in config ? config[configLabelKey] : config[key];
|
|
480
376
|
}
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
ChartContainer,
|
|
484
|
-
ChartDescription,
|
|
485
|
-
ChartHeader,
|
|
486
|
-
ChartLegend,
|
|
487
|
-
ChartLegendContent,
|
|
488
|
-
ChartStyle,
|
|
489
|
-
ChartTitle,
|
|
490
|
-
ChartTooltip,
|
|
491
|
-
ChartTooltipContent,
|
|
492
|
-
cartesianAxisProps
|
|
493
|
-
};
|
|
494
|
-
//# sourceMappingURL=chart.js.map
|
|
377
|
+
//#endregion
|
|
378
|
+
export { ChartCard, ChartContainer, ChartDescription, ChartHeader, ChartLegend, ChartLegendContent, ChartStyle, ChartTitle, ChartTooltip, ChartTooltipContent, cartesianAxisProps };
|