@giddaa-housing/ui 0.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.
Files changed (248) hide show
  1. package/README.md +41 -0
  2. package/dist/accordion.d.ts +11 -0
  3. package/dist/accordion.js +124 -0
  4. package/dist/accordion.js.map +1 -0
  5. package/dist/alert.d.ts +18 -0
  6. package/dist/alert.js +152 -0
  7. package/dist/alert.js.map +1 -0
  8. package/dist/avatar.d.ts +14 -0
  9. package/dist/avatar.js +152 -0
  10. package/dist/avatar.js.map +1 -0
  11. package/dist/badge.d.ts +14 -0
  12. package/dist/badge.js +119 -0
  13. package/dist/badge.js.map +1 -0
  14. package/dist/bar-chart.d.ts +136 -0
  15. package/dist/bar-chart.js +302 -0
  16. package/dist/bar-chart.js.map +1 -0
  17. package/dist/base.css +32 -0
  18. package/dist/breadcrumb.d.ts +12 -0
  19. package/dist/breadcrumb.js +161 -0
  20. package/dist/breadcrumb.js.map +1 -0
  21. package/dist/bullet-chart.d.ts +98 -0
  22. package/dist/bullet-chart.js +189 -0
  23. package/dist/bullet-chart.js.map +1 -0
  24. package/dist/button-group.d.ts +18 -0
  25. package/dist/button-group.js +170 -0
  26. package/dist/button-group.js.map +1 -0
  27. package/dist/button.d.ts +19 -0
  28. package/dist/button.js +146 -0
  29. package/dist/button.js.map +1 -0
  30. package/dist/calendar.d.ts +9 -0
  31. package/dist/calendar.js +293 -0
  32. package/dist/calendar.js.map +1 -0
  33. package/dist/card.d.ts +18 -0
  34. package/dist/card.js +186 -0
  35. package/dist/card.js.map +1 -0
  36. package/dist/carousel.d.ts +53 -0
  37. package/dist/carousel.js +396 -0
  38. package/dist/carousel.js.map +1 -0
  39. package/dist/chart.d.ts +122 -0
  40. package/dist/chart.js +494 -0
  41. package/dist/chart.js.map +1 -0
  42. package/dist/checkbox.d.ts +73 -0
  43. package/dist/checkbox.js +87 -0
  44. package/dist/checkbox.js.map +1 -0
  45. package/dist/collapsible.d.ts +8 -0
  46. package/dist/collapsible.js +82 -0
  47. package/dist/collapsible.js.map +1 -0
  48. package/dist/combobox.d.ts +30 -0
  49. package/dist/combobox.js +713 -0
  50. package/dist/combobox.js.map +1 -0
  51. package/dist/date-picker.d.ts +22 -0
  52. package/dist/date-picker.js +528 -0
  53. package/dist/date-picker.js.map +1 -0
  54. package/dist/dialog.d.ts +30 -0
  55. package/dist/dialog.js +339 -0
  56. package/dist/dialog.js.map +1 -0
  57. package/dist/dropdown-menu.d.ts +35 -0
  58. package/dist/dropdown-menu.js +376 -0
  59. package/dist/dropdown-menu.js.map +1 -0
  60. package/dist/dropzone.d.ts +128 -0
  61. package/dist/dropzone.js +490 -0
  62. package/dist/dropzone.js.map +1 -0
  63. package/dist/empty-state.d.ts +17 -0
  64. package/dist/empty-state.js +146 -0
  65. package/dist/empty-state.js.map +1 -0
  66. package/dist/field.d.ts +29 -0
  67. package/dist/field.js +345 -0
  68. package/dist/field.js.map +1 -0
  69. package/dist/files/red-hat-display-latin-300-italic.woff +0 -0
  70. package/dist/files/red-hat-display-latin-300-italic.woff2 +0 -0
  71. package/dist/files/red-hat-display-latin-300-normal.woff +0 -0
  72. package/dist/files/red-hat-display-latin-300-normal.woff2 +0 -0
  73. package/dist/files/red-hat-display-latin-400-italic.woff +0 -0
  74. package/dist/files/red-hat-display-latin-400-italic.woff2 +0 -0
  75. package/dist/files/red-hat-display-latin-400-normal.woff +0 -0
  76. package/dist/files/red-hat-display-latin-400-normal.woff2 +0 -0
  77. package/dist/files/red-hat-display-latin-500-italic.woff +0 -0
  78. package/dist/files/red-hat-display-latin-500-italic.woff2 +0 -0
  79. package/dist/files/red-hat-display-latin-500-normal.woff +0 -0
  80. package/dist/files/red-hat-display-latin-500-normal.woff2 +0 -0
  81. package/dist/files/red-hat-display-latin-600-italic.woff +0 -0
  82. package/dist/files/red-hat-display-latin-600-italic.woff2 +0 -0
  83. package/dist/files/red-hat-display-latin-600-normal.woff +0 -0
  84. package/dist/files/red-hat-display-latin-600-normal.woff2 +0 -0
  85. package/dist/files/red-hat-display-latin-700-italic.woff +0 -0
  86. package/dist/files/red-hat-display-latin-700-italic.woff2 +0 -0
  87. package/dist/files/red-hat-display-latin-700-normal.woff +0 -0
  88. package/dist/files/red-hat-display-latin-700-normal.woff2 +0 -0
  89. package/dist/files/red-hat-display-latin-800-italic.woff +0 -0
  90. package/dist/files/red-hat-display-latin-800-italic.woff2 +0 -0
  91. package/dist/files/red-hat-display-latin-800-normal.woff +0 -0
  92. package/dist/files/red-hat-display-latin-800-normal.woff2 +0 -0
  93. package/dist/files/red-hat-display-latin-900-italic.woff +0 -0
  94. package/dist/files/red-hat-display-latin-900-italic.woff2 +0 -0
  95. package/dist/files/red-hat-display-latin-900-normal.woff +0 -0
  96. package/dist/files/red-hat-display-latin-900-normal.woff2 +0 -0
  97. package/dist/files/red-hat-display-latin-ext-300-italic.woff +0 -0
  98. package/dist/files/red-hat-display-latin-ext-300-italic.woff2 +0 -0
  99. package/dist/files/red-hat-display-latin-ext-300-normal.woff +0 -0
  100. package/dist/files/red-hat-display-latin-ext-300-normal.woff2 +0 -0
  101. package/dist/files/red-hat-display-latin-ext-400-italic.woff +0 -0
  102. package/dist/files/red-hat-display-latin-ext-400-italic.woff2 +0 -0
  103. package/dist/files/red-hat-display-latin-ext-400-normal.woff +0 -0
  104. package/dist/files/red-hat-display-latin-ext-400-normal.woff2 +0 -0
  105. package/dist/files/red-hat-display-latin-ext-500-italic.woff +0 -0
  106. package/dist/files/red-hat-display-latin-ext-500-italic.woff2 +0 -0
  107. package/dist/files/red-hat-display-latin-ext-500-normal.woff +0 -0
  108. package/dist/files/red-hat-display-latin-ext-500-normal.woff2 +0 -0
  109. package/dist/files/red-hat-display-latin-ext-600-italic.woff +0 -0
  110. package/dist/files/red-hat-display-latin-ext-600-italic.woff2 +0 -0
  111. package/dist/files/red-hat-display-latin-ext-600-normal.woff +0 -0
  112. package/dist/files/red-hat-display-latin-ext-600-normal.woff2 +0 -0
  113. package/dist/files/red-hat-display-latin-ext-700-italic.woff +0 -0
  114. package/dist/files/red-hat-display-latin-ext-700-italic.woff2 +0 -0
  115. package/dist/files/red-hat-display-latin-ext-700-normal.woff +0 -0
  116. package/dist/files/red-hat-display-latin-ext-700-normal.woff2 +0 -0
  117. package/dist/files/red-hat-display-latin-ext-800-italic.woff +0 -0
  118. package/dist/files/red-hat-display-latin-ext-800-italic.woff2 +0 -0
  119. package/dist/files/red-hat-display-latin-ext-800-normal.woff +0 -0
  120. package/dist/files/red-hat-display-latin-ext-800-normal.woff2 +0 -0
  121. package/dist/files/red-hat-display-latin-ext-900-italic.woff +0 -0
  122. package/dist/files/red-hat-display-latin-ext-900-italic.woff2 +0 -0
  123. package/dist/files/red-hat-display-latin-ext-900-normal.woff +0 -0
  124. package/dist/files/red-hat-display-latin-ext-900-normal.woff2 +0 -0
  125. package/dist/funnel-chart.d.ts +84 -0
  126. package/dist/funnel-chart.js +569 -0
  127. package/dist/funnel-chart.js.map +1 -0
  128. package/dist/index.d.ts +87 -0
  129. package/dist/index.js +10448 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/input-group.d.ts +31 -0
  132. package/dist/input-group.js +380 -0
  133. package/dist/input-group.js.map +1 -0
  134. package/dist/input-size-context.d.ts +11 -0
  135. package/dist/input-size-context.js +24 -0
  136. package/dist/input-size-context.js.map +1 -0
  137. package/dist/input.d.ts +13 -0
  138. package/dist/input.js +83 -0
  139. package/dist/input.js.map +1 -0
  140. package/dist/item.d.ts +8 -0
  141. package/dist/item.js +93 -0
  142. package/dist/item.js.map +1 -0
  143. package/dist/kpi-card.d.ts +24 -0
  144. package/dist/kpi-card.js +243 -0
  145. package/dist/kpi-card.js.map +1 -0
  146. package/dist/label.d.ts +8 -0
  147. package/dist/label.js +68 -0
  148. package/dist/label.js.map +1 -0
  149. package/dist/line-chart.d.ts +155 -0
  150. package/dist/line-chart.js +269 -0
  151. package/dist/line-chart.js.map +1 -0
  152. package/dist/logo.d.ts +6 -0
  153. package/dist/logo.js +146 -0
  154. package/dist/logo.js.map +1 -0
  155. package/dist/number-input.d.ts +41 -0
  156. package/dist/number-input.js +418 -0
  157. package/dist/number-input.js.map +1 -0
  158. package/dist/page-header.d.ts +13 -0
  159. package/dist/page-header.js +113 -0
  160. package/dist/page-header.js.map +1 -0
  161. package/dist/pagination.d.ts +35 -0
  162. package/dist/pagination.js +352 -0
  163. package/dist/pagination.js.map +1 -0
  164. package/dist/password-input.d.ts +13 -0
  165. package/dist/password-input.js +356 -0
  166. package/dist/password-input.js.map +1 -0
  167. package/dist/phone-input.d.ts +21 -0
  168. package/dist/phone-input.js +573 -0
  169. package/dist/phone-input.js.map +1 -0
  170. package/dist/photo-gallery.d.ts +42 -0
  171. package/dist/photo-gallery.js +756 -0
  172. package/dist/photo-gallery.js.map +1 -0
  173. package/dist/pie-chart.d.ts +125 -0
  174. package/dist/pie-chart.js +192 -0
  175. package/dist/pie-chart.js.map +1 -0
  176. package/dist/popover.d.ts +20 -0
  177. package/dist/popover.js +169 -0
  178. package/dist/popover.js.map +1 -0
  179. package/dist/progress.d.ts +28 -0
  180. package/dist/progress.js +315 -0
  181. package/dist/progress.js.map +1 -0
  182. package/dist/radio-group.d.ts +32 -0
  183. package/dist/radio-group.js +100 -0
  184. package/dist/radio-group.js.map +1 -0
  185. package/dist/red-hat-display.css +2 -0
  186. package/dist/rich-text-editor.d.ts +16 -0
  187. package/dist/rich-text-editor.js +1000 -0
  188. package/dist/rich-text-editor.js.map +1 -0
  189. package/dist/search-input.d.ts +19 -0
  190. package/dist/search-input.js +411 -0
  191. package/dist/search-input.js.map +1 -0
  192. package/dist/select.d.ts +21 -0
  193. package/dist/select.js +305 -0
  194. package/dist/select.js.map +1 -0
  195. package/dist/separator.d.ts +10 -0
  196. package/dist/separator.js +72 -0
  197. package/dist/separator.js.map +1 -0
  198. package/dist/sheet.d.ts +24 -0
  199. package/dist/sheet.js +282 -0
  200. package/dist/sheet.js.map +1 -0
  201. package/dist/sidebar.d.ts +70 -0
  202. package/dist/sidebar.js +1078 -0
  203. package/dist/sidebar.js.map +1 -0
  204. package/dist/size-context.d.ts +11 -0
  205. package/dist/size-context.js +22 -0
  206. package/dist/size-context.js.map +1 -0
  207. package/dist/skeleton.d.ts +5 -0
  208. package/dist/skeleton.js +48 -0
  209. package/dist/skeleton.js.map +1 -0
  210. package/dist/sparkline.d.ts +94 -0
  211. package/dist/sparkline.js +568 -0
  212. package/dist/sparkline.js.map +1 -0
  213. package/dist/stepper.d.ts +43 -0
  214. package/dist/stepper.js +296 -0
  215. package/dist/stepper.js.map +1 -0
  216. package/dist/styles.css +2 -0
  217. package/dist/switch.d.ts +29 -0
  218. package/dist/switch.js +108 -0
  219. package/dist/switch.js.map +1 -0
  220. package/dist/tab-list.d.ts +38 -0
  221. package/dist/tab-list.js +394 -0
  222. package/dist/tab-list.js.map +1 -0
  223. package/dist/table.d.ts +69 -0
  224. package/dist/table.js +197 -0
  225. package/dist/table.js.map +1 -0
  226. package/dist/tabs.d.ts +18 -0
  227. package/dist/tabs.js +159 -0
  228. package/dist/tabs.js.map +1 -0
  229. package/dist/tag.d.ts +25 -0
  230. package/dist/tag.js +160 -0
  231. package/dist/tag.js.map +1 -0
  232. package/dist/textarea.d.ts +12 -0
  233. package/dist/textarea.js +78 -0
  234. package/dist/textarea.js.map +1 -0
  235. package/dist/theme/giddaa.css +2 -0
  236. package/dist/time-picker.d.ts +13 -0
  237. package/dist/time-picker.js +472 -0
  238. package/dist/time-picker.js.map +1 -0
  239. package/dist/toast.d.ts +23 -0
  240. package/dist/toast.js +330 -0
  241. package/dist/toast.js.map +1 -0
  242. package/dist/tooltip.d.ts +11 -0
  243. package/dist/tooltip.js +96 -0
  244. package/dist/tooltip.js.map +1 -0
  245. package/dist/tree-map.d.ts +127 -0
  246. package/dist/tree-map.js +652 -0
  247. package/dist/tree-map.js.map +1 -0
  248. package/package.json +328 -0
@@ -0,0 +1,652 @@
1
+ // src/components/ui/tree-map.tsx
2
+ import { cva as cva2 } from "class-variance-authority";
3
+ import { Treemap as RechartsTreemap } from "recharts";
4
+
5
+ // src/lib/cn.ts
6
+ import { clsx } from "clsx";
7
+ import { extendTailwindMerge } from "tailwind-merge";
8
+ var twMerge = extendTailwindMerge({
9
+ extend: {
10
+ classGroups: {
11
+ "font-size": [
12
+ {
13
+ text: [
14
+ "gdt-display",
15
+ "gdt-h1",
16
+ "gdt-h2",
17
+ "gdt-h3",
18
+ "gdt-h4",
19
+ "gdt-h5",
20
+ "gdt-xl",
21
+ "gdt-lg",
22
+ "gdt-md",
23
+ "gdt-sm",
24
+ "gdt-xs",
25
+ "gdt-subtext",
26
+ "gdt-capitalized"
27
+ ]
28
+ }
29
+ ]
30
+ }
31
+ }
32
+ });
33
+ function cn(...inputs) {
34
+ return twMerge(clsx(inputs));
35
+ }
36
+
37
+ // src/components/ui/chart.tsx
38
+ import { cva } from "class-variance-authority";
39
+ import * as React from "react";
40
+ import * as RechartsPrimitive from "recharts";
41
+
42
+ // src/components/ui/size-context.tsx
43
+ import { createContext, useContext } from "react";
44
+ import { Fragment, jsx } from "react/jsx-runtime";
45
+ var SizeContext = createContext(void 0);
46
+ function SizeProvider({
47
+ children,
48
+ size
49
+ }) {
50
+ if (!size) {
51
+ return /* @__PURE__ */ jsx(Fragment, { children });
52
+ }
53
+ return /* @__PURE__ */ jsx(SizeContext.Provider, { value: size, children });
54
+ }
55
+ function useComponentSize(size, fallback = "md") {
56
+ const inheritedSize = useContext(SizeContext);
57
+ return size ?? inheritedSize ?? fallback;
58
+ }
59
+
60
+ // src/components/ui/chart.tsx
61
+ import { Fragment as Fragment2, jsx as jsx2, jsxs } from "react/jsx-runtime";
62
+ var SERIES_COLOR_PLACEHOLDER = "var(--color-surface-brand)";
63
+ function formatChartValue(value, type) {
64
+ if (Array.isArray(value)) {
65
+ return value.join(", ");
66
+ }
67
+ if (typeof value !== "number") {
68
+ return value == null ? "" : String(value);
69
+ }
70
+ switch (type) {
71
+ case "currency":
72
+ return `\u20A6${value.toLocaleString("en-NG")}`;
73
+ case "percentage":
74
+ return `${value.toLocaleString("en-NG", {
75
+ minimumFractionDigits: 1,
76
+ maximumFractionDigits: 1
77
+ })}%`;
78
+ default:
79
+ return value.toLocaleString("en-NG");
80
+ }
81
+ }
82
+ var THEMES = { light: "", dark: ".dark" };
83
+ var INITIAL_DIMENSION = { width: 320, height: 200 };
84
+ var ChartContext = React.createContext(null);
85
+ function useChart() {
86
+ const context = React.useContext(ChartContext);
87
+ if (!context) {
88
+ throw new Error("useChart must be used within a <ChartContainer />");
89
+ }
90
+ return context;
91
+ }
92
+ var chartCardVariants = cva(
93
+ "flex w-full min-w-0 flex-col rounded-2xl border border-line-subtle bg-surface-raised text-fg-primary shadow-1",
94
+ {
95
+ variants: {
96
+ size: {
97
+ sm: "gap-3 p-4",
98
+ md: "gap-4 p-5",
99
+ lg: "gap-5 p-6"
100
+ }
101
+ },
102
+ defaultVariants: { size: "md" }
103
+ }
104
+ );
105
+ function ChartCard({
106
+ className,
107
+ size,
108
+ children,
109
+ ...props
110
+ }) {
111
+ const resolvedSize = useComponentSize(size);
112
+ return /* @__PURE__ */ jsx2(SizeProvider, { size: resolvedSize, children: /* @__PURE__ */ jsx2(
113
+ "section",
114
+ {
115
+ "data-slot": "chart-card",
116
+ className: cn(chartCardVariants({ size: resolvedSize }), className),
117
+ ...props,
118
+ children
119
+ }
120
+ ) });
121
+ }
122
+ function ChartHeader({ className, ...props }) {
123
+ return /* @__PURE__ */ jsx2(
124
+ "div",
125
+ {
126
+ "data-slot": "chart-header",
127
+ className: cn("flex min-w-0 flex-col gap-1", className),
128
+ ...props
129
+ }
130
+ );
131
+ }
132
+ var chartTitleVariants = cva("min-w-0 font-bold text-fg-primary", {
133
+ variants: {
134
+ size: {
135
+ sm: "text-gdt-md",
136
+ md: "text-gdt-lg",
137
+ lg: "text-gdt-h5"
138
+ }
139
+ },
140
+ defaultVariants: { size: "md" }
141
+ });
142
+ function ChartTitle({
143
+ className,
144
+ size,
145
+ ...props
146
+ }) {
147
+ const resolvedSize = useComponentSize(size);
148
+ return /* @__PURE__ */ jsx2(
149
+ "h3",
150
+ {
151
+ "data-slot": "chart-title",
152
+ className: cn(chartTitleVariants({ size: resolvedSize }), className),
153
+ ...props
154
+ }
155
+ );
156
+ }
157
+ var chartDescriptionVariants = cva("min-w-0 font-normal text-fg-secondary", {
158
+ variants: {
159
+ size: {
160
+ sm: "text-gdt-xs",
161
+ md: "text-gdt-sm",
162
+ lg: "text-gdt-sm"
163
+ }
164
+ },
165
+ defaultVariants: { size: "md" }
166
+ });
167
+ function ChartDescription({
168
+ className,
169
+ size,
170
+ ...props
171
+ }) {
172
+ const resolvedSize = useComponentSize(size);
173
+ return /* @__PURE__ */ jsx2(
174
+ "p",
175
+ {
176
+ "data-slot": "chart-description",
177
+ className: cn(
178
+ chartDescriptionVariants({ size: resolvedSize }),
179
+ className
180
+ ),
181
+ ...props
182
+ }
183
+ );
184
+ }
185
+ function ChartContainer({
186
+ id,
187
+ className,
188
+ children,
189
+ config,
190
+ initialDimension = INITIAL_DIMENSION,
191
+ ...props
192
+ }) {
193
+ const uniqueId = React.useId();
194
+ const chartId = `chart-${id ?? uniqueId.replace(/:/g, "")}`;
195
+ return /* @__PURE__ */ jsx2(ChartContext.Provider, { value: { config }, children: /* @__PURE__ */ jsxs(
196
+ "div",
197
+ {
198
+ "data-slot": "chart",
199
+ "data-chart": chartId,
200
+ className: cn(
201
+ "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",
202
+ className
203
+ ),
204
+ ...props,
205
+ children: [
206
+ /* @__PURE__ */ jsx2(ChartStyle, { id: chartId, config }),
207
+ /* @__PURE__ */ jsx2(
208
+ RechartsPrimitive.ResponsiveContainer,
209
+ {
210
+ initialDimension,
211
+ children
212
+ }
213
+ )
214
+ ]
215
+ }
216
+ ) });
217
+ }
218
+ var ChartStyle = ({ id, config }) => {
219
+ const colorConfig = Object.entries(config).filter(
220
+ ([, config2]) => config2.theme ?? config2.color
221
+ );
222
+ if (!colorConfig.length) {
223
+ return null;
224
+ }
225
+ const styleContent = Object.entries(THEMES).map(
226
+ ([theme, prefix]) => `
227
+ ${prefix} [data-chart=${id}] {
228
+ ${colorConfig.map(([key, itemConfig]) => {
229
+ const color = itemConfig.theme?.[theme] ?? itemConfig.color;
230
+ return color ? ` --color-${key}: ${color};` : null;
231
+ }).join("\n")}
232
+ }
233
+ `
234
+ ).join("\n");
235
+ return /* @__PURE__ */ jsx2("style", { children: styleContent });
236
+ };
237
+ var ChartTooltip = RechartsPrimitive.Tooltip;
238
+ var chartTooltipVariants = cva(
239
+ "flex flex-col bg-surface-overlay border border-line-subtle shadow-2",
240
+ {
241
+ variants: {
242
+ size: {
243
+ xs: "gap-0.5 rounded-md p-2",
244
+ sm: "gap-0.5 rounded-md p-2.5",
245
+ md: "gap-1 rounded-lg p-3",
246
+ lg: "gap-1 rounded-xl p-3.5"
247
+ }
248
+ },
249
+ defaultVariants: {
250
+ size: "md"
251
+ }
252
+ }
253
+ );
254
+ var chartTooltipDotVariants = cva("shrink-0 rounded-full", {
255
+ variants: {
256
+ size: {
257
+ xs: "size-1.5",
258
+ sm: "size-2",
259
+ md: "size-2.5",
260
+ lg: "size-2.5"
261
+ }
262
+ },
263
+ defaultVariants: {
264
+ size: "md"
265
+ }
266
+ });
267
+ var chartTooltipLabelVariants = cva("font-medium text-fg-secondary", {
268
+ variants: {
269
+ size: {
270
+ xs: "text-gdt-xs",
271
+ sm: "text-gdt-xs",
272
+ md: "text-gdt-sm",
273
+ lg: "text-gdt-sm"
274
+ }
275
+ },
276
+ defaultVariants: { size: "md" }
277
+ });
278
+ var chartTooltipValueVariants = cva(
279
+ "font-extrabold text-fg-primary tabular-nums",
280
+ {
281
+ variants: {
282
+ size: {
283
+ xs: "text-gdt-sm",
284
+ sm: "text-gdt-md",
285
+ md: "text-gdt-lg",
286
+ lg: "text-gdt-xl"
287
+ }
288
+ },
289
+ defaultVariants: { size: "md" }
290
+ }
291
+ );
292
+ function ChartTooltipContent({
293
+ active,
294
+ payload,
295
+ className,
296
+ hideIndicator = false,
297
+ label,
298
+ labelFormatter,
299
+ formatter,
300
+ color,
301
+ nameKey,
302
+ valueType = "number",
303
+ size = "md"
304
+ }) {
305
+ const { config } = useChart();
306
+ if (!active || !payload?.length) {
307
+ return null;
308
+ }
309
+ const [item] = payload.filter((entry) => entry.type !== "none");
310
+ if (!item) {
311
+ return null;
312
+ }
313
+ const key = `${nameKey ?? item.name ?? item.dataKey ?? "value"}`;
314
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
315
+ const dotColor = color ?? item.payload?.fill ?? item.color ?? SERIES_COLOR_PLACEHOLDER;
316
+ const metricLabel = itemConfig?.label ?? item.name;
317
+ const heroValue = formatter ? formatter(item.value, item.name ?? "", item, 0, item.payload) : formatChartValue(item.value, valueType);
318
+ const periodCaption = labelFormatter ? labelFormatter(label, payload) : (typeof label === "string" ? config[label]?.label : null) ?? label;
319
+ return /* @__PURE__ */ jsxs("div", { className: cn(chartTooltipVariants({ size }), className), children: [
320
+ metricLabel != null && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 [&>svg]:size-3 [&>svg]:shrink-0", children: [
321
+ !hideIndicator && (itemConfig?.icon ? /* @__PURE__ */ jsx2(itemConfig.icon, {}) : /* @__PURE__ */ jsx2(
322
+ "span",
323
+ {
324
+ "aria-hidden": "true",
325
+ className: cn(chartTooltipDotVariants({ size })),
326
+ style: { backgroundColor: dotColor }
327
+ }
328
+ )),
329
+ /* @__PURE__ */ jsx2("span", { className: cn(chartTooltipLabelVariants({ size })), children: metricLabel })
330
+ ] }),
331
+ /* @__PURE__ */ jsx2("p", { className: cn(chartTooltipValueVariants({ size })), children: heroValue }),
332
+ periodCaption != null && periodCaption !== "" && /* @__PURE__ */ jsx2("p", { className: "text-gdt-xs text-fg-caption-placeholder", children: periodCaption })
333
+ ] });
334
+ }
335
+ var chartLegendItemVariants = cva(
336
+ "group/legend-item flex items-center rounded-md leading-none text-fg-primary transition-colors [&>svg]:shrink-0",
337
+ {
338
+ variants: {
339
+ size: {
340
+ sm: "gap-1.5 px-2 py-1 text-gdt-xs [&>svg]:size-3",
341
+ md: "gap-2 px-2.5 py-1.5 text-gdt-sm [&>svg]:size-3.5"
342
+ },
343
+ interactive: {
344
+ true: "cursor-pointer outline-none hover:bg-surface-raised focus-visible:bg-surface-raised",
345
+ false: ""
346
+ },
347
+ inactive: {
348
+ true: "text-fg-caption-placeholder line-through",
349
+ false: ""
350
+ }
351
+ },
352
+ defaultVariants: {
353
+ size: "md",
354
+ interactive: false,
355
+ inactive: false
356
+ }
357
+ }
358
+ );
359
+ var chartLegendMarkerSizeVariants = cva("shrink-0", {
360
+ variants: {
361
+ marker: {
362
+ dot: "rounded-full",
363
+ square: "rounded-[2px]",
364
+ line: "rounded-full"
365
+ },
366
+ size: {
367
+ sm: "",
368
+ md: ""
369
+ }
370
+ },
371
+ compoundVariants: [
372
+ { marker: ["dot", "square"], size: "sm", className: "size-2" },
373
+ { marker: ["dot", "square"], size: "md", className: "size-2.5" },
374
+ { marker: "line", size: "sm", className: "h-[3px] w-3" },
375
+ { marker: "line", size: "md", className: "h-[3px] w-3.5" }
376
+ ],
377
+ defaultVariants: { marker: "dot", size: "md" }
378
+ });
379
+ function getPayloadConfigFromPayload(config, payload, key) {
380
+ if (typeof payload !== "object" || payload === null) {
381
+ return void 0;
382
+ }
383
+ const payloadPayload = "payload" in payload && typeof payload.payload === "object" && payload.payload !== null ? payload.payload : void 0;
384
+ let configLabelKey = key;
385
+ if (key in payload && typeof payload[key] === "string") {
386
+ configLabelKey = payload[key];
387
+ } else if (payloadPayload && key in payloadPayload && typeof payloadPayload[key] === "string") {
388
+ configLabelKey = payloadPayload[key];
389
+ }
390
+ return configLabelKey in config ? config[configLabelKey] : config[key];
391
+ }
392
+
393
+ // src/components/ui/tree-map.tsx
394
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
395
+ var TREE_MAP_PALETTE = [
396
+ { fill: "var(--color-forest-700)", text: "var(--color-forest-100)" },
397
+ { fill: "var(--color-brass-500)", text: "var(--color-brass-900)" },
398
+ { fill: "var(--color-moss-600)", text: "var(--color-moss-100)" },
399
+ { fill: "var(--color-clay-500)", text: "var(--color-clay-50)" },
400
+ { fill: "var(--color-stone-500)", text: "var(--color-stone-50)" }
401
+ ];
402
+ var TREE_MAP_LAYOUT = {
403
+ sm: {
404
+ height: 180,
405
+ gap: 3,
406
+ radius: 4,
407
+ labelPadding: 8,
408
+ nameFontSize: 11,
409
+ shareFontSize: 10,
410
+ labelMinSide: 44
411
+ },
412
+ md: {
413
+ height: 240,
414
+ gap: 4,
415
+ radius: 6,
416
+ labelPadding: 10,
417
+ nameFontSize: 12,
418
+ shareFontSize: 11,
419
+ labelMinSide: 52
420
+ },
421
+ lg: {
422
+ height: 300,
423
+ gap: 5,
424
+ radius: 8,
425
+ labelPadding: 12,
426
+ nameFontSize: 14,
427
+ shareFontSize: 12,
428
+ labelMinSide: 60
429
+ }
430
+ };
431
+ var treeMapLegendVariants = cva2("flex min-w-0", {
432
+ variants: {
433
+ placement: {
434
+ right: "flex-col",
435
+ bottom: "flex-row flex-wrap items-center"
436
+ },
437
+ size: {
438
+ sm: "text-gdt-xs",
439
+ md: "text-gdt-sm",
440
+ lg: "text-gdt-sm"
441
+ }
442
+ },
443
+ compoundVariants: [
444
+ { placement: "right", size: "sm", className: "gap-2" },
445
+ { placement: "right", size: "md", className: "gap-3" },
446
+ { placement: "right", size: "lg", className: "gap-3.5" },
447
+ { placement: "bottom", className: "gap-x-4 gap-y-2" }
448
+ ],
449
+ defaultVariants: { placement: "right", size: "md" }
450
+ });
451
+ var treeMapLegendDotVariants = cva2("shrink-0 rounded-full", {
452
+ variants: {
453
+ size: { sm: "size-2", md: "size-2.5", lg: "size-3" }
454
+ },
455
+ defaultVariants: { size: "md" }
456
+ });
457
+ function resolveData(data) {
458
+ let total = 0;
459
+ const resolve = (datum, palette) => {
460
+ const fill = datum.fill ?? palette.fill;
461
+ const text = palette.text;
462
+ if (datum.children?.length) {
463
+ return {
464
+ label: datum.label,
465
+ fill,
466
+ text,
467
+ children: datum.children.map((child) => resolve(child, { fill, text }))
468
+ };
469
+ }
470
+ total += datum.value ?? 0;
471
+ return { label: datum.label, value: datum.value, fill, text };
472
+ };
473
+ const resolved = data.map(
474
+ (datum, i) => resolve(datum, TREE_MAP_PALETTE[i % TREE_MAP_PALETTE.length])
475
+ );
476
+ return { resolved, total };
477
+ }
478
+ function TreeMap({
479
+ data,
480
+ size,
481
+ title,
482
+ description,
483
+ tooltip = false,
484
+ legend = "right",
485
+ valueFormatter,
486
+ valueType = "number",
487
+ className,
488
+ ...props
489
+ }) {
490
+ const resolvedSize = useComponentSize(size);
491
+ const layout = TREE_MAP_LAYOUT[resolvedSize];
492
+ const { resolved, total } = resolveData(data);
493
+ const config = Object.fromEntries(
494
+ resolved.map((datum) => [
495
+ datum.label,
496
+ { label: datum.label, color: datum.fill }
497
+ ])
498
+ );
499
+ const tooltipNode = tooltip ? /* @__PURE__ */ jsx3(
500
+ ChartTooltip,
501
+ {
502
+ content: /* @__PURE__ */ jsx3(
503
+ ChartTooltipContent,
504
+ {
505
+ nameKey: "label",
506
+ valueType,
507
+ formatter: valueFormatter ? (value) => typeof value === "number" ? valueFormatter(value) : value : void 0
508
+ }
509
+ )
510
+ }
511
+ ) : null;
512
+ const legendNode = /* @__PURE__ */ jsx3(
513
+ "ul",
514
+ {
515
+ className: cn(
516
+ treeMapLegendVariants({ placement: legend, size: resolvedSize })
517
+ ),
518
+ children: resolved.map((datum) => /* @__PURE__ */ jsxs2(
519
+ "li",
520
+ {
521
+ className: "flex items-center gap-2 text-fg-primary",
522
+ children: [
523
+ /* @__PURE__ */ jsx3(
524
+ "span",
525
+ {
526
+ "aria-hidden": "true",
527
+ className: cn(treeMapLegendDotVariants({ size: resolvedSize })),
528
+ style: { backgroundColor: datum.fill }
529
+ }
530
+ ),
531
+ /* @__PURE__ */ jsx3("span", { className: "min-w-0 truncate", children: datum.label })
532
+ ]
533
+ },
534
+ datum.label
535
+ ))
536
+ }
537
+ );
538
+ return /* @__PURE__ */ jsxs2(ChartCard, { size: resolvedSize, className, ...props, children: [
539
+ (title != null || description != null) && /* @__PURE__ */ jsxs2(ChartHeader, { children: [
540
+ title != null && /* @__PURE__ */ jsx3(ChartTitle, { children: title }),
541
+ description != null && /* @__PURE__ */ jsx3(ChartDescription, { children: description })
542
+ ] }),
543
+ /* @__PURE__ */ jsxs2(
544
+ "div",
545
+ {
546
+ className: cn(
547
+ "flex gap-4",
548
+ legend === "right" ? "flex-row items-stretch" : "flex-col"
549
+ ),
550
+ children: [
551
+ /* @__PURE__ */ jsx3(
552
+ ChartContainer,
553
+ {
554
+ config,
555
+ className: "aspect-auto min-w-0 flex-1",
556
+ style: { height: layout.height },
557
+ children: /* @__PURE__ */ jsx3(
558
+ RechartsTreemap,
559
+ {
560
+ data: resolved,
561
+ dataKey: "value",
562
+ nameKey: "label",
563
+ type: "flat",
564
+ isAnimationActive: false,
565
+ content: /* @__PURE__ */ jsx3(TreeMapTile, { total, layout }),
566
+ children: tooltipNode
567
+ }
568
+ )
569
+ }
570
+ ),
571
+ legendNode
572
+ ]
573
+ }
574
+ )
575
+ ] });
576
+ }
577
+ function TreeMapTile({
578
+ total,
579
+ layout,
580
+ x,
581
+ y,
582
+ width,
583
+ height,
584
+ value,
585
+ name,
586
+ children,
587
+ fill,
588
+ text
589
+ }) {
590
+ if (children != null || x == null || y == null || width == null || height == null) {
591
+ return /* @__PURE__ */ jsx3("g", {});
592
+ }
593
+ const tileX = x + layout.gap / 2;
594
+ const tileY = y + layout.gap / 2;
595
+ const tileW = Math.max(0, width - layout.gap);
596
+ const tileH = Math.max(0, height - layout.gap);
597
+ const showLabel = tileW >= layout.labelMinSide && tileH >= layout.labelMinSide;
598
+ const share = total > 0 ? Math.round((value ?? 0) / total * 100) : 0;
599
+ return /* @__PURE__ */ jsxs2("g", { children: [
600
+ /* @__PURE__ */ jsx3(
601
+ "rect",
602
+ {
603
+ x: tileX,
604
+ y: tileY,
605
+ width: tileW,
606
+ height: tileH,
607
+ rx: layout.radius,
608
+ ry: layout.radius,
609
+ fill
610
+ }
611
+ ),
612
+ showLabel && /* @__PURE__ */ jsxs2(
613
+ "text",
614
+ {
615
+ x: tileX + layout.labelPadding,
616
+ y: tileY + layout.labelPadding,
617
+ fill: text,
618
+ dominantBaseline: "hanging",
619
+ children: [
620
+ /* @__PURE__ */ jsx3(
621
+ "tspan",
622
+ {
623
+ x: tileX + layout.labelPadding,
624
+ className: "font-semibold",
625
+ style: { fontSize: layout.nameFontSize },
626
+ children: name
627
+ }
628
+ ),
629
+ /* @__PURE__ */ jsxs2(
630
+ "tspan",
631
+ {
632
+ x: tileX + layout.labelPadding,
633
+ dy: layout.nameFontSize + 4,
634
+ className: "tabular-nums",
635
+ style: { fontSize: layout.shareFontSize },
636
+ children: [
637
+ share,
638
+ "%"
639
+ ]
640
+ }
641
+ )
642
+ ]
643
+ }
644
+ )
645
+ ] });
646
+ }
647
+ export {
648
+ TREE_MAP_LAYOUT,
649
+ TREE_MAP_PALETTE,
650
+ TreeMap
651
+ };
652
+ //# sourceMappingURL=tree-map.js.map