@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
@@ -0,0 +1,17 @@
1
+ import { VariantProps } from "class-variance-authority";
2
+ import * as React from "react";
3
+ //#region src/gallery-indicator.d.ts
4
+ type GalleryIndicatorSize = "sm" | "md" | "lg";
5
+ declare const galleryIndicatorVariants: (props?: ({
6
+ size?: "lg" | "md" | "sm" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ type GalleryIndicatorProps = React.ComponentProps<"span"> & VariantProps<typeof galleryIndicatorVariants> & {
9
+ photoCount?: number;
10
+ currentPhoto?: number;
11
+ totalPhotos?: number;
12
+ label?: string;
13
+ };
14
+ declare function GalleryIndicatorIcon(props: React.SVGProps<SVGSVGElement>): React.JSX.Element;
15
+ declare function GalleryIndicator({ className, size, photoCount, currentPhoto, totalPhotos, label, children, ...props }: GalleryIndicatorProps): React.JSX.Element;
16
+ //#endregion
17
+ export { GalleryIndicator, GalleryIndicatorIcon, type GalleryIndicatorProps, type GalleryIndicatorSize, galleryIndicatorVariants };
@@ -0,0 +1,75 @@
1
+ import { t as cn } from "./cn-BI_4DMBf.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { cva } from "class-variance-authority";
4
+ //#region src/gallery-indicator.tsx
5
+ const galleryIndicatorVariants = cva("inline-flex w-fit shrink-0 items-center justify-center rounded-[100px] bg-black/40 px-3 font-bold leading-none whitespace-nowrap text-white shadow-[0px_0px_4px_0px_rgba(0,0,0,0.1)] backdrop-blur-[15px] sm:px-4", {
6
+ variants: { size: {
7
+ sm: "h-[35px] gap-2 text-gdt-xs sm:gap-4 [&>svg]:size-5",
8
+ md: "h-10 gap-2 text-gdt-sm sm:gap-4 [&>svg]:size-5",
9
+ lg: "h-10 gap-2 text-gdt-lg sm:h-[50px] sm:gap-4 [&>svg]:size-6"
10
+ } },
11
+ defaultVariants: { size: "md" }
12
+ });
13
+ function GalleryIndicatorIcon(props) {
14
+ return /* @__PURE__ */ jsxs("svg", {
15
+ "aria-hidden": "true",
16
+ xmlns: "http://www.w3.org/2000/svg",
17
+ viewBox: "0 0 24 24",
18
+ fill: "none",
19
+ ...props,
20
+ children: [
21
+ /* @__PURE__ */ jsx("path", {
22
+ d: "M5.75 17.5 3.63 7.62a2 2 0 0 1 1.53-2.37l9.66-2.07a2 2 0 0 1 2.37 1.53l.27 1.29",
23
+ stroke: "currentColor",
24
+ strokeLinecap: "round",
25
+ strokeLinejoin: "round",
26
+ strokeWidth: "2"
27
+ }),
28
+ /* @__PURE__ */ jsx("rect", {
29
+ width: "14.5",
30
+ height: "12.5",
31
+ x: "7",
32
+ y: "7.5",
33
+ stroke: "currentColor",
34
+ strokeLinejoin: "round",
35
+ strokeWidth: "2",
36
+ rx: "2"
37
+ }),
38
+ /* @__PURE__ */ jsx("path", {
39
+ d: "m8.75 17 3.31-3.31a1.25 1.25 0 0 1 1.77 0L17.25 17",
40
+ stroke: "currentColor",
41
+ strokeLinecap: "round",
42
+ strokeLinejoin: "round",
43
+ strokeWidth: "2"
44
+ }),
45
+ /* @__PURE__ */ jsx("path", {
46
+ d: "m15.5 15.25.81-.81a1.25 1.25 0 0 1 1.77 0L20.5 16.86",
47
+ stroke: "currentColor",
48
+ strokeLinecap: "round",
49
+ strokeLinejoin: "round",
50
+ strokeWidth: "2"
51
+ }),
52
+ /* @__PURE__ */ jsx("circle", {
53
+ cx: "17.25",
54
+ cy: "11.25",
55
+ r: "1.25",
56
+ fill: "currentColor"
57
+ })
58
+ ]
59
+ });
60
+ }
61
+ function GalleryIndicator({ className, size = "md", photoCount = 35, currentPhoto, totalPhotos = photoCount, label, children, ...props }) {
62
+ const resolvedLabel = children ?? label ?? (currentPhoto === void 0 ? `View All ${photoCount} Photos` : `${currentPhoto}/${totalPhotos}`);
63
+ return /* @__PURE__ */ jsxs("span", {
64
+ "data-slot": "gallery-indicator",
65
+ "data-size": size,
66
+ className: cn(galleryIndicatorVariants({ size }), className),
67
+ ...props,
68
+ children: [/* @__PURE__ */ jsx(GalleryIndicatorIcon, { className: "shrink-0 text-white" }), /* @__PURE__ */ jsx("span", {
69
+ className: "min-w-0 truncate",
70
+ children: resolvedLabel
71
+ })]
72
+ });
73
+ }
74
+ //#endregion
75
+ export { GalleryIndicator, GalleryIndicatorIcon, galleryIndicatorVariants };
@@ -0,0 +1,95 @@
1
+ import { t as ComponentSize } from "./size-context-D4mYvcg8.js";
2
+ import { ChartCard } from "./chart.js";
3
+ import * as React from "react";
4
+ //#region src/heatmap-chart.d.ts
5
+ /**
6
+ * A heatmap — a row × column grid encoding magnitude as fill intensity.
7
+ * Reach for one to compare a measure across two categorical dimensions at a
8
+ * glance (listing inquiries by neighbourhood and month, traffic by day and
9
+ * hour, repayment rate by branch and quarter).
10
+ *
11
+ * Unlike the other charts in this folder it is not built on recharts
12
+ * (recharts has no heatmap/matrix primitive); it is a CSS grid of cells, a
13
+ * hover/focus tooltip per cell, and an optional sequential-scale legend. It
14
+ * stays size-aware via the shared `SizeProvider` and reuses `ChartCard`.
15
+ *
16
+ * Color encodes magnitude, so cells are `--color-surface-brand` at a
17
+ * magnitude-scaled opacity (8/22/44/70/100%) rather than a distinct hue per
18
+ * bucket — the brand token already flips per theme, so the ramp stays
19
+ * correct in both without a separate token set. Never the categorical
20
+ * `chart-1`…`3` tokens, which encode identity, not amount.
21
+ *
22
+ * @example
23
+ * <HeatmapChart
24
+ * data={[
25
+ * { row: "Lekki", column: "Jan", value: 42 },
26
+ * { row: "Lekki", column: "Feb", value: 58 },
27
+ * { row: "Yaba", column: "Jan", value: 21 },
28
+ * { row: "Yaba", column: "Feb", value: 30 },
29
+ * ]}
30
+ * title="Listing inquiries"
31
+ * description="By neighbourhood · Jan–Feb 2026"
32
+ * />
33
+ */
34
+ /** Heatmap sizes line up with the three shared `ComponentSize` values. */
35
+ type HeatmapChartSize = ComponentSize;
36
+ type HeatmapChartCellDatum = {
37
+ /** Row category label. */
38
+ row: string;
39
+ /** Column category label. */
40
+ column: string;
41
+ /** Magnitude driving the cell's fill. Omit the datum entirely for "no data". */
42
+ value: number;
43
+ };
44
+ /**
45
+ * Sequential fill ramp — `--color-surface-brand` (already theme-aware) at five
46
+ * magnitude-scaled opacity stops: 8%, 22%, 44%, 70%, 100%. Index 0 is the
47
+ * lowest magnitude bucket, index 4 the highest — assign by bucket order,
48
+ * never by an arbitrary opacity pick. Relative color syntax (`rgb(from … / a)`)
49
+ * keeps each stop a true alpha over whatever surface it sits on, matching the
50
+ * shadow/gradient tokens in `styles/giddaa.css`.
51
+ */
52
+ declare const HEATMAP_CHART_PALETTE: readonly ["rgb(from var(--color-surface-brand) r g b / 0.08)", "rgb(from var(--color-surface-brand) r g b / 0.22)", "rgb(from var(--color-surface-brand) r g b / 0.44)", "rgb(from var(--color-surface-brand) r g b / 0.7)", "rgb(from var(--color-surface-brand) r g b / 1)"];
53
+ type HeatmapChartLayout = {
54
+ /** Width/height of a single (square) cell in px. */
55
+ cellSize: number;
56
+ /** Gap between cells in px. */
57
+ gap: number;
58
+ /** Reserved width for row labels in px. */
59
+ rowLabelWidth: number;
60
+ /** Reserved height for the column header row in px. */
61
+ columnLabelHeight: number;
62
+ /** Row/column label font size in px. */
63
+ labelFontSize: number;
64
+ /** In-cell value label font size in px. */
65
+ valueFontSize: number;
66
+ /** Width of a single legend ramp swatch in px. */
67
+ legendSwatchSize: number;
68
+ };
69
+ declare const HEATMAP_CHART_LAYOUT: Record<HeatmapChartSize, HeatmapChartLayout>;
70
+ type HeatmapChartProps = Omit<React.ComponentProps<typeof ChartCard>, "size" | "children"> & {
71
+ /** Cells — one entry per row/column pair that has a value. */
72
+ data: HeatmapChartCellDatum[];
73
+ /** Row order, top to bottom. Defaults to first-seen order in `data`. */
74
+ rows?: string[];
75
+ /** Column order, left to right. Defaults to first-seen order in `data`. */
76
+ columns?: string[];
77
+ /** Fixed `[min, max]` for the color scale. Defaults to the data's range. */
78
+ domain?: [number, number];
79
+ /** Explicit size; otherwise inherited from the nearest `SizeProvider`. */
80
+ size?: HeatmapChartSize;
81
+ /** Chart heading. Omit to hide the title. */
82
+ title?: React.ReactNode;
83
+ /** Supporting metadata (period, source). Omit to hide the description. */
84
+ description?: React.ReactNode;
85
+ /** Show the sequential-scale legend under the grid. Default true. */
86
+ legend?: boolean;
87
+ /** Print the formatted value inside every cell. Default false — the
88
+ * hover/focus tooltip carries exact figures without crowding the grid. */
89
+ showValues?: boolean;
90
+ /** Format a cell value for the tooltip, legend, and in-cell label. */
91
+ valueFormatter?: (value: number) => string;
92
+ };
93
+ declare function HeatmapChart({ data, rows: rowsProp, columns: columnsProp, domain: domainProp, size, title, description, legend, showValues, valueFormatter, className, ...props }: HeatmapChartProps): React.JSX.Element;
94
+ //#endregion
95
+ export { HEATMAP_CHART_LAYOUT, HEATMAP_CHART_PALETTE, HeatmapChart, type HeatmapChartCellDatum, type HeatmapChartLayout, type HeatmapChartProps, type HeatmapChartSize };
@@ -0,0 +1,197 @@
1
+ "use client";
2
+ import { useComponentSize } from "./size-context.js";
3
+ import { ChartCard, ChartDescription, ChartHeader, ChartTitle } from "./chart.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Fragment as Fragment$1 } from "react";
6
+ //#region src/heatmap-chart.tsx
7
+ /**
8
+ * Sequential fill ramp — `--color-surface-brand` (already theme-aware) at five
9
+ * magnitude-scaled opacity stops: 8%, 22%, 44%, 70%, 100%. Index 0 is the
10
+ * lowest magnitude bucket, index 4 the highest — assign by bucket order,
11
+ * never by an arbitrary opacity pick. Relative color syntax (`rgb(from … / a)`)
12
+ * keeps each stop a true alpha over whatever surface it sits on, matching the
13
+ * shadow/gradient tokens in `styles/giddaa.css`.
14
+ */
15
+ const HEATMAP_CHART_PALETTE = [
16
+ "rgb(from var(--color-surface-brand) r g b / 0.08)",
17
+ "rgb(from var(--color-surface-brand) r g b / 0.22)",
18
+ "rgb(from var(--color-surface-brand) r g b / 0.44)",
19
+ "rgb(from var(--color-surface-brand) r g b / 0.7)",
20
+ "rgb(from var(--color-surface-brand) r g b / 1)"
21
+ ];
22
+ const HEATMAP_CHART_LAYOUT = {
23
+ sm: {
24
+ cellSize: 20,
25
+ gap: 3,
26
+ rowLabelWidth: 64,
27
+ columnLabelHeight: 20,
28
+ labelFontSize: 10,
29
+ valueFontSize: 9,
30
+ legendSwatchSize: 14
31
+ },
32
+ md: {
33
+ cellSize: 26,
34
+ gap: 3,
35
+ rowLabelWidth: 80,
36
+ columnLabelHeight: 22,
37
+ labelFontSize: 11,
38
+ valueFontSize: 10,
39
+ legendSwatchSize: 16
40
+ },
41
+ lg: {
42
+ cellSize: 32,
43
+ gap: 4,
44
+ rowLabelWidth: 96,
45
+ columnLabelHeight: 24,
46
+ labelFontSize: 12,
47
+ valueFontSize: 11,
48
+ legendSwatchSize: 18
49
+ }
50
+ };
51
+ /** Joins a row/column pair into a stable lookup key. */
52
+ function cellKey(row, column) {
53
+ return `${row}␟${column}`;
54
+ }
55
+ /** Buckets a value into one of the five palette steps (1 = lowest, 5 = highest). */
56
+ function heatmapStep(value, domain) {
57
+ const [min, max] = domain;
58
+ if (max <= min) return HEATMAP_CHART_PALETTE.length;
59
+ const ratio = (value - min) / (max - min);
60
+ const step = Math.ceil(ratio * HEATMAP_CHART_PALETTE.length);
61
+ return Math.min(HEATMAP_CHART_PALETTE.length, Math.max(1, step));
62
+ }
63
+ function HeatmapChart({ data, rows: rowsProp, columns: columnsProp, domain: domainProp, size, title, description, legend = true, showValues = false, valueFormatter = (value) => value.toLocaleString("en-NG"), className, ...props }) {
64
+ const resolvedSize = useComponentSize(size);
65
+ const layout = HEATMAP_CHART_LAYOUT[resolvedSize];
66
+ const rows = rowsProp ?? Array.from(new Set(data.map((d) => d.row)));
67
+ const columns = columnsProp ?? Array.from(new Set(data.map((d) => d.column)));
68
+ const valuesByKey = new Map(data.map((datum) => [cellKey(datum.row, datum.column), datum.value]));
69
+ const values = data.map((datum) => datum.value);
70
+ const domain = domainProp ?? [values.length ? Math.min(...values) : 0, values.length ? Math.max(...values) : 1];
71
+ return /* @__PURE__ */ jsxs(ChartCard, {
72
+ size: resolvedSize,
73
+ className,
74
+ ...props,
75
+ 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", {
76
+ className: "flex flex-col gap-3",
77
+ children: [/* @__PURE__ */ jsx("div", {
78
+ className: "overflow-x-auto",
79
+ children: /* @__PURE__ */ jsxs("div", {
80
+ className: "inline-grid",
81
+ style: {
82
+ gridTemplateColumns: `${layout.rowLabelWidth}px repeat(${columns.length}, ${layout.cellSize}px)`,
83
+ gap: layout.gap
84
+ },
85
+ children: [
86
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true" }),
87
+ columns.map((column) => /* @__PURE__ */ jsx("span", {
88
+ className: "flex items-end justify-center truncate px-0.5 pb-1 text-fg-secondary",
89
+ style: {
90
+ fontSize: layout.labelFontSize,
91
+ height: layout.columnLabelHeight
92
+ },
93
+ title: column,
94
+ children: column
95
+ }, column)),
96
+ rows.map((row) => /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
97
+ className: "flex items-center truncate pr-2 text-fg-secondary",
98
+ style: {
99
+ fontSize: layout.labelFontSize,
100
+ height: layout.cellSize
101
+ },
102
+ title: row,
103
+ children: row
104
+ }), columns.map((column) => /* @__PURE__ */ jsx(HeatmapChartCell, {
105
+ row,
106
+ column,
107
+ value: valuesByKey.get(cellKey(row, column)),
108
+ domain,
109
+ layout,
110
+ showValue: showValues,
111
+ valueFormatter
112
+ }, column))] }, row))
113
+ ]
114
+ })
115
+ }), legend && /* @__PURE__ */ jsx(HeatmapChartLegend, {
116
+ domain,
117
+ layout,
118
+ valueFormatter
119
+ })]
120
+ })]
121
+ });
122
+ }
123
+ /**
124
+ * One grid cell. Missing data (no matching datum for this row/column) renders
125
+ * a dashed placeholder and is skipped from tab order — there is nothing to
126
+ * announce or hover. A valued cell is a focusable, hoverable swatch: the
127
+ * `aria-label` carries the row/column/value so screen readers get the exact
128
+ * figure without relying on the visual tooltip, which mirrors it for sighted
129
+ * hover/keyboard-focus use.
130
+ */
131
+ function HeatmapChartCell({ row, column, value, domain, layout, showValue, valueFormatter }) {
132
+ if (value == null) return /* @__PURE__ */ jsx("span", {
133
+ className: "rounded-[4px] border border-line-subtle border-dashed",
134
+ style: {
135
+ width: layout.cellSize,
136
+ height: layout.cellSize
137
+ },
138
+ title: `${row} · ${column}: no data`
139
+ });
140
+ const step = heatmapStep(value, domain);
141
+ const color = HEATMAP_CHART_PALETTE[step - 1];
142
+ const formatted = valueFormatter(value);
143
+ const label = `${row} · ${column}: ${formatted}`;
144
+ const textColor = step >= 4 ? "var(--color-fg-on-brand)" : "var(--color-fg-primary)";
145
+ return /* @__PURE__ */ jsxs("button", {
146
+ type: "button",
147
+ className: "group/cell relative flex items-center justify-center rounded-[4px] outline-none focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)]",
148
+ style: {
149
+ width: layout.cellSize,
150
+ height: layout.cellSize,
151
+ backgroundColor: color
152
+ },
153
+ "aria-label": label,
154
+ children: [showValue && /* @__PURE__ */ jsx("span", {
155
+ className: "pointer-events-none tabular-nums",
156
+ style: {
157
+ fontSize: layout.valueFontSize,
158
+ color: textColor
159
+ },
160
+ children: formatted
161
+ }), /* @__PURE__ */ jsx("span", {
162
+ role: "tooltip",
163
+ className: "pointer-events-none absolute bottom-full left-1/2 z-10 mb-1.5 -translate-x-1/2 whitespace-nowrap rounded-md border border-line-subtle bg-surface-overlay px-2 py-1 text-fg-primary text-gdt-xs opacity-0 shadow-2 transition-opacity group-hover/cell:opacity-100 group-focus-visible/cell:opacity-100",
164
+ children: label
165
+ })]
166
+ });
167
+ }
168
+ /** Sequential-scale legend — the opacity ramp bounded by the domain's min/max. */
169
+ function HeatmapChartLegend({ domain, layout, valueFormatter }) {
170
+ return /* @__PURE__ */ jsxs("div", {
171
+ className: "flex items-center gap-2 text-fg-caption-placeholder",
172
+ style: { fontSize: layout.labelFontSize },
173
+ children: [
174
+ /* @__PURE__ */ jsx("span", {
175
+ className: "tabular-nums",
176
+ children: valueFormatter(domain[0])
177
+ }),
178
+ /* @__PURE__ */ jsx("div", {
179
+ className: "flex overflow-hidden rounded-[3px]",
180
+ children: HEATMAP_CHART_PALETTE.map((color) => /* @__PURE__ */ jsx("span", {
181
+ "aria-hidden": "true",
182
+ style: {
183
+ backgroundColor: color,
184
+ width: layout.legendSwatchSize,
185
+ height: layout.legendSwatchSize / 2
186
+ }
187
+ }, color))
188
+ }),
189
+ /* @__PURE__ */ jsx("span", {
190
+ className: "tabular-nums",
191
+ children: valueFormatter(domain[1])
192
+ })
193
+ ]
194
+ });
195
+ }
196
+ //#endregion
197
+ export { HEATMAP_CHART_LAYOUT, HEATMAP_CHART_PALETTE, HeatmapChart };
@@ -0,0 +1,10 @@
1
+ import { Popover } from "@base-ui/react/popover";
2
+ //#region src/infotip.d.ts
3
+ declare function Infotip({ ...props }: Popover.Root.Props): import("react").JSX.Element;
4
+ declare function InfotipTrigger({ ...props }: Popover.Trigger.Props): import("react").JSX.Element;
5
+ type InfotipContentProps = Popover.Popup.Props & Pick<Popover.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset"> & Pick<Popover.Portal.Props, "container"> & {
6
+ showArrow?: boolean;
7
+ };
8
+ declare function InfotipContent({ className, container, side, sideOffset, align, alignOffset, showArrow, children, ...props }: InfotipContentProps): import("react").JSX.Element;
9
+ //#endregion
10
+ export { Infotip, InfotipContent, InfotipTrigger };
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { Popover } from "@base-ui/react/popover";
5
+ //#region src/infotip.tsx
6
+ function Infotip({ ...props }) {
7
+ return /* @__PURE__ */ jsx(Popover.Root, {
8
+ "data-slot": "infotip",
9
+ ...props
10
+ });
11
+ }
12
+ function InfotipTrigger({ ...props }) {
13
+ return /* @__PURE__ */ jsx(Popover.Trigger, {
14
+ nativeButton: false,
15
+ "data-slot": "infotip-trigger",
16
+ openOnHover: true,
17
+ delay: 100,
18
+ ...props
19
+ });
20
+ }
21
+ function InfotipContent({ className, container, side = "top", sideOffset = 6, align = "center", alignOffset = 0, showArrow = true, children, ...props }) {
22
+ return /* @__PURE__ */ jsx(Popover.Portal, {
23
+ container,
24
+ children: /* @__PURE__ */ jsx(Popover.Positioner, {
25
+ align,
26
+ alignOffset,
27
+ side,
28
+ sideOffset,
29
+ className: "isolate z-50",
30
+ children: /* @__PURE__ */ jsxs(Popover.Popup, {
31
+ "data-slot": "infotip-content",
32
+ className: cn("z-50 relative inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-[6px] border border-line bg-surface-overlay px-3 py-2 text-gdt-sm font-medium text-fg-primary shadow-2 duration-100 has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
33
+ ...props,
34
+ children: [children, showArrow ? /* @__PURE__ */ jsx(Popover.Arrow, { className: "relative block w-3 h-1.5 overflow-clip data-[side=bottom]:top-[-6px] data-[side=left]:right-[-9px] data-[side=left]:rotate-90 data-[side=right]:left-[-9px] data-[side=right]:-rotate-90 data-[side=top]:bottom-[-6px] data-[side=top]:rotate-180 before:content-[''] before:absolute before:bottom-0 before:left-1/2 before:w-[calc(6px*sqrt(2))] before:h-[calc(6px*sqrt(2))] before:bg-surface-overlay before:border before:border-line before:[transform:translate(-50%,50%)_rotate(45deg)]" }) : null]
35
+ })
36
+ })
37
+ });
38
+ }
39
+ //#endregion
40
+ export { Infotip, InfotipContent, InfotipTrigger };
@@ -0,0 +1,12 @@
1
+ import { t as InputComponentSize } from "./input-size-context-C-SFx9sx.js";
2
+ import { VariantProps } from "class-variance-authority";
3
+ import * as React from "react";
4
+ //#region src/input.d.ts
5
+ declare const inputVariants: (props?: ({
6
+ size?: "lg" | "md" | "sm" | "xl" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ type InputProps = Omit<React.ComponentProps<"input">, "size"> & VariantProps<typeof inputVariants>;
9
+ type InputSize = InputComponentSize;
10
+ declare function Input({ className, size, type, ...props }: InputProps): React.JSX.Element;
11
+ //#endregion
12
+ export { InputSize as n, inputVariants as r, Input as t };
@@ -1,31 +1,28 @@
1
- import * as class_variance_authority_types from 'class-variance-authority/types';
2
- import { VariantProps } from 'class-variance-authority';
3
- import * as React from 'react';
4
- import { Button } from './button.js';
5
- import { InputSize } from './input.js';
6
- import { TextareaSize } from './textarea.js';
7
- import '@base-ui/react/button';
8
- import './input-size-context.js';
9
-
1
+ import { t as Button } from "./button-BZIeyUw6.js";
2
+ import { n as InputSize } from "./input-CfoEJ8A6.js";
3
+ import { n as TextareaSize } from "./textarea-IS_D8pXf.js";
4
+ import { VariantProps } from "class-variance-authority";
5
+ import * as React from "react";
6
+ //#region src/input-group.d.ts
10
7
  declare function InputGroup({ className, size, ...props }: React.ComponentProps<"div"> & {
11
- size?: InputSize;
8
+ size?: InputSize;
12
9
  }): React.JSX.Element;
13
10
  declare const inputGroupAddonVariants: (props?: ({
14
- align?: "inline-end" | "inline-start" | "block-end" | "block-start" | null | undefined;
15
- } & class_variance_authority_types.ClassProp) | undefined) => string;
11
+ align?: "block-end" | "block-start" | "inline-end" | "inline-start" | null | undefined;
12
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
16
13
  declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>): React.JSX.Element;
17
14
  declare const inputGroupButtonVariants: (props?: ({
18
- size?: "sm" | "xs" | "icon-xs" | "icon-sm" | null | undefined;
19
- } & class_variance_authority_types.ClassProp) | undefined) => string;
15
+ size?: "icon-sm" | "icon-xs" | "sm" | "xs" | null | undefined;
16
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
20
17
  declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, "size" | "type"> & VariantProps<typeof inputGroupButtonVariants> & {
21
- type?: "button" | "submit" | "reset";
18
+ type?: "button" | "submit" | "reset";
22
19
  }): React.JSX.Element;
23
20
  declare function InputGroupText({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
24
21
  declare function InputGroupInput({ className, size, ...props }: Omit<React.ComponentProps<"input">, "size"> & {
25
- size?: InputSize;
22
+ size?: InputSize;
26
23
  }): React.JSX.Element;
27
24
  declare function InputGroupTextarea({ className, size, ...props }: Omit<React.ComponentProps<"textarea">, "size"> & {
28
- size?: TextareaSize;
25
+ size?: TextareaSize;
29
26
  }): React.JSX.Element;
30
-
31
- export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea };
27
+ //#endregion
28
+ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea };