@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.
Files changed (315) hide show
  1. package/README.md +18 -6
  2. package/css/base.css +37 -0
  3. package/css/components.css +135 -0
  4. package/css/generated/shared.css +1 -0
  5. package/css/giddaa.css +402 -0
  6. package/css/preset.css +77 -0
  7. package/css/styles.css +2 -0
  8. package/css/theme.css +255 -0
  9. package/dist/accordion.d.ts +9 -10
  10. package/dist/accordion.js +41 -117
  11. package/dist/activity-timeline.d.ts +29 -0
  12. package/dist/activity-timeline.js +97 -0
  13. package/dist/alert.d.ts +8 -9
  14. package/dist/alert.js +53 -141
  15. package/dist/auth-layout.d.ts +23 -0
  16. package/dist/auth-layout.js +153 -0
  17. package/dist/avatar.d.ts +6 -6
  18. package/dist/avatar.js +40 -142
  19. package/dist/badge.d.ts +12 -13
  20. package/dist/badge.js +66 -114
  21. package/dist/bar-chart.d.ts +136 -114
  22. package/dist/bar-chart.js +244 -297
  23. package/dist/breadcrumb.d.ts +5 -5
  24. package/dist/breadcrumb.js +56 -148
  25. package/dist/bullet-chart.d.ts +33 -33
  26. package/dist/bullet-chart.js +123 -183
  27. package/dist/button-BZIeyUw6.d.ts +17 -0
  28. package/dist/button-group.d.ts +13 -16
  29. package/dist/button-group.js +38 -163
  30. package/dist/button.d.ts +2 -19
  31. package/dist/button.js +90 -142
  32. package/dist/calendar.d.ts +6 -6
  33. package/dist/calendar.js +134 -288
  34. package/dist/card.d.ts +14 -16
  35. package/dist/card.js +58 -174
  36. package/dist/carousel.d.ts +34 -35
  37. package/dist/carousel.js +319 -378
  38. package/dist/chart.d.ts +58 -59
  39. package/dist/chart.js +350 -466
  40. package/dist/checkbox.d.ts +10 -12
  41. package/dist/checkbox.js +84 -84
  42. package/dist/cn-BI_4DMBf.js +23 -0
  43. package/dist/collapsible.d.ts +7 -8
  44. package/dist/collapsible.js +23 -77
  45. package/dist/combobox.d.ts +10 -10
  46. package/dist/combobox.js +220 -696
  47. package/dist/cta.d.ts +64 -0
  48. package/dist/cta.js +192 -0
  49. package/dist/currency-selector.d.ts +41 -0
  50. package/dist/currency-selector.js +114 -0
  51. package/dist/data-table.d.ts +164 -0
  52. package/dist/data-table.js +673 -0
  53. package/dist/date-picker.d.ts +27 -20
  54. package/dist/date-picker.js +122 -520
  55. package/dist/details-card.d.ts +19 -0
  56. package/dist/details-card.js +118 -0
  57. package/dist/dialog.d.ts +13 -14
  58. package/dist/dialog.js +117 -320
  59. package/dist/dropdown-menu.d.ts +14 -14
  60. package/dist/dropdown-menu.js +170 -365
  61. package/dist/dropzone.d.ts +55 -55
  62. package/dist/dropzone.js +328 -467
  63. package/dist/editorial-card.d.ts +27 -0
  64. package/dist/editorial-card.js +144 -0
  65. package/dist/empty-state.d.ts +8 -9
  66. package/dist/empty-state.js +48 -135
  67. package/dist/field.d.ts +23 -25
  68. package/dist/field.js +111 -327
  69. package/dist/filter.d.ts +118 -0
  70. package/dist/filter.js +775 -0
  71. package/dist/footer.d.ts +40 -0
  72. package/dist/footer.js +227 -0
  73. package/dist/funnel-chart.d.ts +38 -41
  74. package/dist/funnel-chart.js +168 -563
  75. package/dist/gallery-indicator.d.ts +17 -0
  76. package/dist/gallery-indicator.js +75 -0
  77. package/dist/heatmap-chart.d.ts +95 -0
  78. package/dist/heatmap-chart.js +197 -0
  79. package/dist/infotip.d.ts +10 -0
  80. package/dist/infotip.js +40 -0
  81. package/dist/input-CfoEJ8A6.d.ts +12 -0
  82. package/dist/input-group.d.ts +16 -19
  83. package/dist/input-group.js +92 -372
  84. package/dist/input-size-context-C-SFx9sx.d.ts +10 -0
  85. package/dist/input-size-context.d.ts +2 -11
  86. package/dist/input-size-context.js +14 -20
  87. package/dist/input.d.ts +2 -13
  88. package/dist/input.js +23 -79
  89. package/dist/item.d.ts +7 -8
  90. package/dist/item.js +22 -89
  91. package/dist/kpi-card.d.ts +18 -20
  92. package/dist/kpi-card.js +84 -232
  93. package/dist/label.d.ts +6 -6
  94. package/dist/label.js +39 -66
  95. package/dist/line-chart.d.ts +88 -89
  96. package/dist/line-chart.js +143 -262
  97. package/dist/logo.d.ts +4 -4
  98. package/dist/logo.js +87 -141
  99. package/dist/map-indicator.d.ts +13 -0
  100. package/dist/map-indicator.js +83 -0
  101. package/dist/match.d.ts +15 -0
  102. package/dist/match.js +68 -0
  103. package/dist/media-gallery-hero.d.ts +58 -0
  104. package/dist/media-gallery-hero.js +201 -0
  105. package/dist/media-player.d.ts +60 -0
  106. package/dist/media-player.js +919 -0
  107. package/dist/multi-step-form.d.ts +56 -0
  108. package/dist/multi-step-form.js +342 -0
  109. package/dist/number-input.d.ts +34 -34
  110. package/dist/number-input.js +62 -413
  111. package/dist/page-header.d.ts +10 -11
  112. package/dist/page-header.js +34 -107
  113. package/dist/pagination.d.ts +17 -20
  114. package/dist/pagination.js +132 -341
  115. package/dist/password-input.d.ts +5 -12
  116. package/dist/password-input.js +32 -354
  117. package/dist/phone-input.d.ts +19 -19
  118. package/dist/phone-input.js +232 -561
  119. package/dist/photo-gallery.d.ts +20 -20
  120. package/dist/photo-gallery.js +314 -746
  121. package/dist/picker-lzgmsNfG.js +32 -0
  122. package/dist/pie-chart.d.ts +60 -60
  123. package/dist/pie-chart.js +141 -184
  124. package/dist/popover.d.ts +9 -9
  125. package/dist/popover.js +60 -156
  126. package/dist/price-tag.d.ts +34 -0
  127. package/dist/price-tag.js +118 -0
  128. package/dist/progress.d.ts +18 -16
  129. package/dist/progress.js +156 -300
  130. package/dist/property-listing-card.d.ts +29 -0
  131. package/dist/property-listing-card.js +117 -0
  132. package/dist/radar-chart.d.ts +108 -0
  133. package/dist/radar-chart.js +172 -0
  134. package/dist/radio-group.d.ts +11 -13
  135. package/dist/radio-group.js +47 -96
  136. package/dist/review-block.d.ts +18 -0
  137. package/dist/review-block.js +154 -0
  138. package/dist/rich-text-editor.d.ts +30 -14
  139. package/dist/rich-text-editor.js +594 -979
  140. package/dist/scatter-chart.d.ts +140 -0
  141. package/dist/scatter-chart.js +248 -0
  142. package/dist/search-input.d.ts +8 -15
  143. package/dist/search-input.js +58 -408
  144. package/dist/select.d.ts +8 -8
  145. package/dist/select.js +131 -291
  146. package/dist/separator.d.ts +8 -9
  147. package/dist/separator.js +31 -70
  148. package/dist/sheet.d.ts +11 -11
  149. package/dist/sheet.js +84 -262
  150. package/dist/sidebar.d.ts +32 -37
  151. package/dist/sidebar.js +380 -1055
  152. package/dist/size-context-D4mYvcg8.d.ts +10 -0
  153. package/dist/size-context.d.ts +2 -11
  154. package/dist/size-context.js +14 -18
  155. package/dist/skeleton.d.ts +4 -5
  156. package/dist/skeleton.js +9 -45
  157. package/dist/slider.d.ts +27 -0
  158. package/dist/slider.js +81 -0
  159. package/dist/sparkline.d.ts +43 -46
  160. package/dist/sparkline.js +223 -561
  161. package/dist/stepper.d.ts +23 -24
  162. package/dist/stepper.js +149 -276
  163. package/dist/styles.css +9995 -2
  164. package/dist/switch.d.ts +10 -12
  165. package/dist/switch.js +49 -106
  166. package/dist/table-card.d.ts +35 -0
  167. package/dist/table-card.js +125 -0
  168. package/dist/table.d.ts +18 -14
  169. package/dist/table.js +114 -182
  170. package/dist/tabs.d.ts +23 -15
  171. package/dist/tabs.js +62 -149
  172. package/dist/tag.d.ts +22 -23
  173. package/dist/tag.js +104 -156
  174. package/dist/testimonial-block.d.ts +33 -0
  175. package/dist/testimonial-block.js +208 -0
  176. package/dist/textarea-IS_D8pXf.d.ts +11 -0
  177. package/dist/textarea.d.ts +2 -12
  178. package/dist/textarea.js +20 -74
  179. package/dist/time-picker.d.ts +11 -11
  180. package/dist/time-picker.js +247 -464
  181. package/dist/toast.d.ts +16 -18
  182. package/dist/toast.js +154 -310
  183. package/dist/tooltip.d.ts +9 -10
  184. package/dist/tooltip.js +33 -91
  185. package/dist/tree-map.d.ts +54 -57
  186. package/dist/tree-map.js +231 -646
  187. package/dist/use-uncontrolled-CLfM1XbB.js +21 -0
  188. package/dist/waterfall-chart.d.ts +126 -0
  189. package/dist/waterfall-chart.js +480 -0
  190. package/package.json +123 -34
  191. package/dist/accordion.js.map +0 -1
  192. package/dist/alert.js.map +0 -1
  193. package/dist/avatar.js.map +0 -1
  194. package/dist/badge.js.map +0 -1
  195. package/dist/bar-chart.js.map +0 -1
  196. package/dist/base.css +0 -32
  197. package/dist/breadcrumb.js.map +0 -1
  198. package/dist/bullet-chart.js.map +0 -1
  199. package/dist/button-group.js.map +0 -1
  200. package/dist/button.js.map +0 -1
  201. package/dist/calendar.js.map +0 -1
  202. package/dist/card.js.map +0 -1
  203. package/dist/carousel.js.map +0 -1
  204. package/dist/chart.js.map +0 -1
  205. package/dist/checkbox.js.map +0 -1
  206. package/dist/collapsible.js.map +0 -1
  207. package/dist/combobox.js.map +0 -1
  208. package/dist/date-picker.js.map +0 -1
  209. package/dist/dialog.js.map +0 -1
  210. package/dist/dropdown-menu.js.map +0 -1
  211. package/dist/dropzone.js.map +0 -1
  212. package/dist/empty-state.js.map +0 -1
  213. package/dist/field.js.map +0 -1
  214. package/dist/files/red-hat-display-latin-300-italic.woff +0 -0
  215. package/dist/files/red-hat-display-latin-300-italic.woff2 +0 -0
  216. package/dist/files/red-hat-display-latin-300-normal.woff +0 -0
  217. package/dist/files/red-hat-display-latin-300-normal.woff2 +0 -0
  218. package/dist/files/red-hat-display-latin-400-italic.woff +0 -0
  219. package/dist/files/red-hat-display-latin-400-italic.woff2 +0 -0
  220. package/dist/files/red-hat-display-latin-400-normal.woff +0 -0
  221. package/dist/files/red-hat-display-latin-400-normal.woff2 +0 -0
  222. package/dist/files/red-hat-display-latin-500-italic.woff +0 -0
  223. package/dist/files/red-hat-display-latin-500-italic.woff2 +0 -0
  224. package/dist/files/red-hat-display-latin-500-normal.woff +0 -0
  225. package/dist/files/red-hat-display-latin-500-normal.woff2 +0 -0
  226. package/dist/files/red-hat-display-latin-600-italic.woff +0 -0
  227. package/dist/files/red-hat-display-latin-600-italic.woff2 +0 -0
  228. package/dist/files/red-hat-display-latin-600-normal.woff +0 -0
  229. package/dist/files/red-hat-display-latin-600-normal.woff2 +0 -0
  230. package/dist/files/red-hat-display-latin-700-italic.woff +0 -0
  231. package/dist/files/red-hat-display-latin-700-italic.woff2 +0 -0
  232. package/dist/files/red-hat-display-latin-700-normal.woff +0 -0
  233. package/dist/files/red-hat-display-latin-700-normal.woff2 +0 -0
  234. package/dist/files/red-hat-display-latin-800-italic.woff +0 -0
  235. package/dist/files/red-hat-display-latin-800-italic.woff2 +0 -0
  236. package/dist/files/red-hat-display-latin-800-normal.woff +0 -0
  237. package/dist/files/red-hat-display-latin-800-normal.woff2 +0 -0
  238. package/dist/files/red-hat-display-latin-900-italic.woff +0 -0
  239. package/dist/files/red-hat-display-latin-900-italic.woff2 +0 -0
  240. package/dist/files/red-hat-display-latin-900-normal.woff +0 -0
  241. package/dist/files/red-hat-display-latin-900-normal.woff2 +0 -0
  242. package/dist/files/red-hat-display-latin-ext-300-italic.woff +0 -0
  243. package/dist/files/red-hat-display-latin-ext-300-italic.woff2 +0 -0
  244. package/dist/files/red-hat-display-latin-ext-300-normal.woff +0 -0
  245. package/dist/files/red-hat-display-latin-ext-300-normal.woff2 +0 -0
  246. package/dist/files/red-hat-display-latin-ext-400-italic.woff +0 -0
  247. package/dist/files/red-hat-display-latin-ext-400-italic.woff2 +0 -0
  248. package/dist/files/red-hat-display-latin-ext-400-normal.woff +0 -0
  249. package/dist/files/red-hat-display-latin-ext-400-normal.woff2 +0 -0
  250. package/dist/files/red-hat-display-latin-ext-500-italic.woff +0 -0
  251. package/dist/files/red-hat-display-latin-ext-500-italic.woff2 +0 -0
  252. package/dist/files/red-hat-display-latin-ext-500-normal.woff +0 -0
  253. package/dist/files/red-hat-display-latin-ext-500-normal.woff2 +0 -0
  254. package/dist/files/red-hat-display-latin-ext-600-italic.woff +0 -0
  255. package/dist/files/red-hat-display-latin-ext-600-italic.woff2 +0 -0
  256. package/dist/files/red-hat-display-latin-ext-600-normal.woff +0 -0
  257. package/dist/files/red-hat-display-latin-ext-600-normal.woff2 +0 -0
  258. package/dist/files/red-hat-display-latin-ext-700-italic.woff +0 -0
  259. package/dist/files/red-hat-display-latin-ext-700-italic.woff2 +0 -0
  260. package/dist/files/red-hat-display-latin-ext-700-normal.woff +0 -0
  261. package/dist/files/red-hat-display-latin-ext-700-normal.woff2 +0 -0
  262. package/dist/files/red-hat-display-latin-ext-800-italic.woff +0 -0
  263. package/dist/files/red-hat-display-latin-ext-800-italic.woff2 +0 -0
  264. package/dist/files/red-hat-display-latin-ext-800-normal.woff +0 -0
  265. package/dist/files/red-hat-display-latin-ext-800-normal.woff2 +0 -0
  266. package/dist/files/red-hat-display-latin-ext-900-italic.woff +0 -0
  267. package/dist/files/red-hat-display-latin-ext-900-italic.woff2 +0 -0
  268. package/dist/files/red-hat-display-latin-ext-900-normal.woff +0 -0
  269. package/dist/files/red-hat-display-latin-ext-900-normal.woff2 +0 -0
  270. package/dist/funnel-chart.js.map +0 -1
  271. package/dist/index.d.ts +0 -87
  272. package/dist/index.js +0 -10448
  273. package/dist/index.js.map +0 -1
  274. package/dist/input-group.js.map +0 -1
  275. package/dist/input-size-context.js.map +0 -1
  276. package/dist/input.js.map +0 -1
  277. package/dist/item.js.map +0 -1
  278. package/dist/kpi-card.js.map +0 -1
  279. package/dist/label.js.map +0 -1
  280. package/dist/line-chart.js.map +0 -1
  281. package/dist/logo.js.map +0 -1
  282. package/dist/number-input.js.map +0 -1
  283. package/dist/page-header.js.map +0 -1
  284. package/dist/pagination.js.map +0 -1
  285. package/dist/password-input.js.map +0 -1
  286. package/dist/phone-input.js.map +0 -1
  287. package/dist/photo-gallery.js.map +0 -1
  288. package/dist/pie-chart.js.map +0 -1
  289. package/dist/popover.js.map +0 -1
  290. package/dist/progress.js.map +0 -1
  291. package/dist/radio-group.js.map +0 -1
  292. package/dist/red-hat-display.css +0 -2
  293. package/dist/rich-text-editor.js.map +0 -1
  294. package/dist/search-input.js.map +0 -1
  295. package/dist/select.js.map +0 -1
  296. package/dist/separator.js.map +0 -1
  297. package/dist/sheet.js.map +0 -1
  298. package/dist/sidebar.js.map +0 -1
  299. package/dist/size-context.js.map +0 -1
  300. package/dist/skeleton.js.map +0 -1
  301. package/dist/sparkline.js.map +0 -1
  302. package/dist/stepper.js.map +0 -1
  303. package/dist/switch.js.map +0 -1
  304. package/dist/tab-list.d.ts +0 -38
  305. package/dist/tab-list.js +0 -394
  306. package/dist/tab-list.js.map +0 -1
  307. package/dist/table.js.map +0 -1
  308. package/dist/tabs.js.map +0 -1
  309. package/dist/tag.js.map +0 -1
  310. package/dist/textarea.js.map +0 -1
  311. package/dist/theme/giddaa.css +0 -2
  312. package/dist/time-picker.js.map +0 -1
  313. package/dist/toast.js.map +0 -1
  314. package/dist/tooltip.js.map +0 -1
  315. package/dist/tree-map.js.map +0 -1
package/dist/tree-map.js CHANGED
@@ -1,652 +1,237 @@
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
1
+ "use client";
2
+ import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { useComponentSize } from "./size-context.js";
4
+ import { ChartCard, ChartContainer, ChartDescription, ChartHeader, ChartTitle, ChartTooltip, ChartTooltipContent } from "./chart.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
38
6
  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)" }
7
+ import { Treemap } from "recharts";
8
+ //#region src/tree-map.tsx
9
+ /**
10
+ * Tile palette, ordered by share: forest → brass → moss → clay → stone. Each
11
+ * entry pairs a tile `fill` with the `text` colour that reads on it (a tonal
12
+ * tint of the same scale). Giddaa has no `chart-1`…`chart-N` tokens yet, so these
13
+ * map to the brand scales; assign by order, or override per datum with `fill`.
14
+ */
15
+ const TREE_MAP_PALETTE = [
16
+ {
17
+ fill: "var(--color-forest-700)",
18
+ text: "var(--color-forest-100)"
19
+ },
20
+ {
21
+ fill: "var(--color-brass-500)",
22
+ text: "var(--color-brass-900)"
23
+ },
24
+ {
25
+ fill: "var(--color-moss-600)",
26
+ text: "var(--color-moss-100)"
27
+ },
28
+ {
29
+ fill: "var(--color-clay-500)",
30
+ text: "var(--color-clay-50)"
31
+ },
32
+ {
33
+ fill: "var(--color-stone-500)",
34
+ text: "var(--color-stone-50)"
35
+ }
401
36
  ];
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
- }
37
+ const TREE_MAP_LAYOUT = {
38
+ sm: {
39
+ height: 180,
40
+ gap: 3,
41
+ radius: 4,
42
+ labelPadding: 8,
43
+ nameFontSize: 11,
44
+ shareFontSize: 10,
45
+ labelMinSide: 44
46
+ },
47
+ md: {
48
+ height: 240,
49
+ gap: 4,
50
+ radius: 6,
51
+ labelPadding: 10,
52
+ nameFontSize: 12,
53
+ shareFontSize: 11,
54
+ labelMinSide: 52
55
+ },
56
+ lg: {
57
+ height: 300,
58
+ gap: 5,
59
+ radius: 8,
60
+ labelPadding: 12,
61
+ nameFontSize: 14,
62
+ shareFontSize: 12,
63
+ labelMinSide: 60
64
+ }
430
65
  };
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" }
66
+ /** Vertical legend column / value list — shared with the right-hand legend. */
67
+ const treeMapLegendVariants = cva("flex min-w-0", {
68
+ variants: {
69
+ placement: {
70
+ right: "flex-col",
71
+ bottom: "flex-row flex-wrap items-center"
72
+ },
73
+ size: {
74
+ sm: "text-gdt-xs",
75
+ md: "text-gdt-sm",
76
+ lg: "text-gdt-sm"
77
+ }
78
+ },
79
+ compoundVariants: [
80
+ {
81
+ placement: "right",
82
+ size: "sm",
83
+ className: "gap-2"
84
+ },
85
+ {
86
+ placement: "right",
87
+ size: "md",
88
+ className: "gap-3"
89
+ },
90
+ {
91
+ placement: "right",
92
+ size: "lg",
93
+ className: "gap-3.5"
94
+ },
95
+ {
96
+ placement: "bottom",
97
+ className: "gap-x-4 gap-y-2"
98
+ }
99
+ ],
100
+ defaultVariants: {
101
+ placement: "right",
102
+ size: "md"
103
+ }
450
104
  });
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" }
105
+ const treeMapLegendDotVariants = cva("shrink-0 rounded-full", {
106
+ variants: { size: {
107
+ sm: "size-2",
108
+ md: "size-2.5",
109
+ lg: "size-3"
110
+ } },
111
+ defaultVariants: { size: "md" }
456
112
  });
113
+ /**
114
+ * Walk the data, assigning each top-level entry a palette colour (by order) that
115
+ * its leaves inherit, and summing the leaf values into a grand total. Top-level
116
+ * entries become the legend keys: tiles in `flat`, groups in `nested`.
117
+ */
457
118
  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
119
+ let total = 0;
120
+ const resolve = (datum, palette) => {
121
+ const fill = datum.fill ?? palette.fill;
122
+ const text = palette.text;
123
+ if (datum.children?.length) return {
124
+ label: datum.label,
125
+ fill,
126
+ text,
127
+ children: datum.children.map((child) => resolve(child, {
128
+ fill,
129
+ text
130
+ }))
131
+ };
132
+ total += datum.value ?? 0;
133
+ return {
134
+ label: datum.label,
135
+ value: datum.value,
136
+ fill,
137
+ text
138
+ };
139
+ };
140
+ return {
141
+ resolved: data.map((datum, i) => resolve(datum, TREE_MAP_PALETTE[i % TREE_MAP_PALETTE.length])),
142
+ total
143
+ };
144
+ }
145
+ function TreeMap({ data, size, title, description, tooltip = false, legend = "right", valueFormatter, valueType = "number", className, ...props }) {
146
+ const resolvedSize = useComponentSize(size);
147
+ const layout = TREE_MAP_LAYOUT[resolvedSize];
148
+ const { resolved, total } = resolveData(data);
149
+ const config = Object.fromEntries(resolved.map((datum) => [datum.label, {
150
+ label: datum.label,
151
+ color: datum.fill
152
+ }]));
153
+ const tooltipNode = tooltip ? /* @__PURE__ */ jsx(ChartTooltip, { content: /* @__PURE__ */ jsx(ChartTooltipContent, {
154
+ nameKey: "label",
155
+ valueType,
156
+ formatter: valueFormatter ? (value) => typeof value === "number" ? valueFormatter(value) : value : void 0
157
+ }) }) : null;
158
+ const legendNode = /* @__PURE__ */ jsx("ul", {
159
+ className: cn(treeMapLegendVariants({
160
+ placement: legend,
161
+ size: resolvedSize
162
+ })),
163
+ children: resolved.map((datum) => /* @__PURE__ */ jsxs("li", {
164
+ className: "flex items-center gap-2 text-fg-primary",
165
+ children: [/* @__PURE__ */ jsx("span", {
166
+ "aria-hidden": "true",
167
+ className: cn(treeMapLegendDotVariants({ size: resolvedSize })),
168
+ style: { backgroundColor: datum.fill }
169
+ }), /* @__PURE__ */ jsx("span", {
170
+ className: "min-w-0 truncate",
171
+ children: datum.label
172
+ })]
173
+ }, datum.label))
174
+ });
175
+ return /* @__PURE__ */ jsxs(ChartCard, {
176
+ size: resolvedSize,
177
+ className,
178
+ ...props,
179
+ children: [(title != null || description != null) && /* @__PURE__ */ jsxs(ChartHeader, { children: [title != null && /* @__PURE__ */ jsx(ChartTitle, { children: title }), description != null && /* @__PURE__ */ jsx(ChartDescription, { children: description })] }), /* @__PURE__ */ jsxs("div", {
180
+ className: cn("flex gap-4", legend === "right" ? "flex-row items-stretch" : "flex-col"),
181
+ children: [/* @__PURE__ */ jsx(ChartContainer, {
182
+ config,
183
+ className: "aspect-auto min-w-0 flex-1",
184
+ style: { height: layout.height },
185
+ children: /* @__PURE__ */ jsx(Treemap, {
186
+ data: resolved,
187
+ dataKey: "value",
188
+ nameKey: "label",
189
+ type: "flat",
190
+ isAnimationActive: false,
191
+ content: /* @__PURE__ */ jsx(TreeMapTile, {
192
+ total,
193
+ layout
194
+ }),
195
+ children: tooltipNode
196
+ })
197
+ }), legendNode]
198
+ })]
199
+ });
200
+ }
201
+ function TreeMapTile({ total, layout, x, y, width, height, value, name, children, fill, text }) {
202
+ if (children != null || x == null || y == null || width == null || height == null) return /* @__PURE__ */ jsx("g", {});
203
+ const tileX = x + layout.gap / 2;
204
+ const tileY = y + layout.gap / 2;
205
+ const tileW = Math.max(0, width - layout.gap);
206
+ const tileH = Math.max(0, height - layout.gap);
207
+ const showLabel = tileW >= layout.labelMinSide && tileH >= layout.labelMinSide;
208
+ const share = total > 0 ? Math.round((value ?? 0) / total * 100) : 0;
209
+ return /* @__PURE__ */ jsxs("g", { children: [/* @__PURE__ */ jsx("rect", {
210
+ x: tileX,
211
+ y: tileY,
212
+ width: tileW,
213
+ height: tileH,
214
+ rx: layout.radius,
215
+ ry: layout.radius,
216
+ fill
217
+ }), showLabel && /* @__PURE__ */ jsxs("text", {
218
+ x: tileX + layout.labelPadding,
219
+ y: tileY + layout.labelPadding,
220
+ fill: text,
221
+ dominantBaseline: "hanging",
222
+ children: [/* @__PURE__ */ jsx("tspan", {
223
+ x: tileX + layout.labelPadding,
224
+ className: "font-semibold",
225
+ style: { fontSize: layout.nameFontSize },
226
+ children: name
227
+ }), /* @__PURE__ */ jsxs("tspan", {
228
+ x: tileX + layout.labelPadding,
229
+ dy: layout.nameFontSize + 4,
230
+ className: "tabular-nums",
231
+ style: { fontSize: layout.shareFontSize },
232
+ children: [share, "%"]
233
+ })]
234
+ })] });
235
+ }
236
+ //#endregion
237
+ export { TREE_MAP_LAYOUT, TREE_MAP_PALETTE, TreeMap };