@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/field.js CHANGED
@@ -1,345 +1,129 @@
1
- // src/components/ui/field.tsx
1
+ "use client";
2
+ import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { SizeProvider, useComponentSize } from "./size-context.js";
4
+ import { Separator } from "./separator.js";
5
+ import { Label } from "./label.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
2
7
  import { cva } from "class-variance-authority";
3
8
  import { useMemo } from "react";
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/label.tsx
38
- import { jsx, jsxs } from "react/jsx-runtime";
39
- function Label({
40
- className,
41
- children,
42
- withAsterisk = false,
43
- showOptionalText = false,
44
- ...props
45
- }) {
46
- const labelClassName = cn(
47
- "flex w-fit max-w-full items-center gap-1 text-gdt-sm leading-none font-semibold text-fg-primary select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
48
- className
49
- );
50
- if (withAsterisk) {
51
- return (
52
- // biome-ignore lint/a11y/noLabelWithoutControl: association is supplied by callers through htmlFor or nesting patterns.
53
- /* @__PURE__ */ jsxs("label", { "data-slot": "label", className: labelClassName, ...props, children: [
54
- /* @__PURE__ */ jsx("div", { className: "inline-flex", children }),
55
- withAsterisk && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0 text-fg-danger", children: "*" }),
56
- showOptionalText && /* @__PURE__ */ jsx("span", { className: "text-gdt-xs font-normal italic", children: "(optional)" })
57
- ] })
58
- );
59
- }
60
- return (
61
- // biome-ignore lint/a11y/noLabelWithoutControl: association is supplied by callers through htmlFor or nesting patterns.
62
- /* @__PURE__ */ jsx("label", { "data-slot": "label", className: labelClassName, ...props, children: /* @__PURE__ */ jsxs("div", { children: [
63
- children,
64
- " ",
65
- showOptionalText && /* @__PURE__ */ jsx("span", { className: "text-gdt-xs font-normal italic", children: "(optional)" })
66
- ] }) })
67
- );
68
- }
69
-
70
- // src/components/ui/separator.tsx
71
- import { Separator as SeparatorPrimitive } from "@base-ui/react/separator";
72
- import { jsx as jsx2 } from "react/jsx-runtime";
73
- function Separator({
74
- className,
75
- orientation = "horizontal",
76
- dashed = false,
77
- shade = "feint",
78
- thickness = "default",
79
- ...props
80
- }) {
81
- return /* @__PURE__ */ jsx2(
82
- SeparatorPrimitive,
83
- {
84
- "data-slot": "separator",
85
- orientation,
86
- className: cn(
87
- "shrink-0 data-horizontal:h-0 data-horizontal:w-full data-vertical:w-0 data-vertical:self-stretch",
88
- // style
89
- dashed ? "border-dashed" : "border-solid",
90
- // shade
91
- shade === "feint" && "border-line-subtle",
92
- shade === "deep" && "border-line",
93
- // thickness
94
- thickness === "hairline" && "data-horizontal:border-t-[0.5px] data-vertical:border-l-[0.5px]",
95
- thickness === "default" && "data-horizontal:border-t data-vertical:border-l",
96
- thickness === "thick" && "data-horizontal:border-t-2 data-vertical:border-l-2",
97
- thickness === "extra-thick" && "data-horizontal:border-t-[3px] data-vertical:border-l-[3px]",
98
- className
99
- ),
100
- ...props
101
- }
102
- );
103
- }
104
-
105
- // src/components/ui/size-context.tsx
106
- import { createContext, useContext } from "react";
107
- import { Fragment, jsx as jsx3 } from "react/jsx-runtime";
108
- var SizeContext = createContext(void 0);
109
- function SizeProvider({
110
- children,
111
- size
112
- }) {
113
- if (!size) {
114
- return /* @__PURE__ */ jsx3(Fragment, { children });
115
- }
116
- return /* @__PURE__ */ jsx3(SizeContext.Provider, { value: size, children });
117
- }
118
- function useComponentSize(size, fallback = "md") {
119
- const inheritedSize = useContext(SizeContext);
120
- return size ?? inheritedSize ?? fallback;
121
- }
122
-
123
- // src/components/ui/field.tsx
124
- import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
9
+ //#region src/field.tsx
125
10
  function FieldSet({ className, ...props }) {
126
- return /* @__PURE__ */ jsx4(
127
- "fieldset",
128
- {
129
- "data-slot": "field-set",
130
- className: cn(
131
- "flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3",
132
- className
133
- ),
134
- ...props
135
- }
136
- );
11
+ return /* @__PURE__ */ jsx("fieldset", {
12
+ "data-slot": "field-set",
13
+ className: cn("flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3", className),
14
+ ...props
15
+ });
137
16
  }
138
- function FieldLegend({
139
- className,
140
- variant = "legend",
141
- ...props
142
- }) {
143
- return /* @__PURE__ */ jsx4(
144
- "legend",
145
- {
146
- "data-slot": "field-legend",
147
- "data-variant": variant,
148
- className: cn(
149
- "text-fg-primary data-[variant=label]:text-gdt-sm data-[variant=label]:font-semibold data-[variant=legend]:text-gdt-md data-[variant=legend]:font-medium",
150
- className
151
- ),
152
- ...props
153
- }
154
- );
17
+ function FieldLegend({ className, variant = "legend", ...props }) {
18
+ return /* @__PURE__ */ jsx("legend", {
19
+ "data-slot": "field-legend",
20
+ "data-variant": variant,
21
+ className: cn("text-fg-primary data-[variant=label]:text-gdt-sm data-[variant=label]:font-semibold data-[variant=legend]:text-gdt-md data-[variant=legend]:font-medium", className),
22
+ ...props
23
+ });
155
24
  }
156
25
  function FieldGroup({ className, ...props }) {
157
- return /* @__PURE__ */ jsx4(
158
- "div",
159
- {
160
- "data-slot": "field-group",
161
- className: cn(
162
- "group/field-group @container/field-group flex w-full flex-col gap-6 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4",
163
- className
164
- ),
165
- ...props
166
- }
167
- );
26
+ return /* @__PURE__ */ jsx("div", {
27
+ "data-slot": "field-group",
28
+ className: cn("group/field-group @container/field-group flex w-full flex-col gap-6 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4", className),
29
+ ...props
30
+ });
168
31
  }
169
- var fieldVariants = cva("group/field flex w-full", {
170
- variants: {
171
- orientation: {
172
- vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
173
- horizontal: "flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio],[role=switch]]:mt-px data-[size=sm]:gap-1.5 data-[size=md]:gap-2.5 data-[size=lg]:gap-3",
174
- responsive: "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio],[role=switch]]:mt-px"
175
- },
176
- size: {
177
- sm: "gap-1",
178
- md: "gap-1.5",
179
- lg: "gap-2"
180
- }
181
- },
182
- defaultVariants: {
183
- orientation: "vertical",
184
- size: "md"
185
- }
32
+ const fieldVariants = cva("group/field flex w-full", {
33
+ variants: {
34
+ orientation: {
35
+ vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
36
+ horizontal: "flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio],[role=switch]]:mt-px data-[size=sm]:gap-1.5 data-[size=md]:gap-2.5 data-[size=lg]:gap-3",
37
+ responsive: "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio],[role=switch]]:mt-px"
38
+ },
39
+ size: {
40
+ sm: "gap-1",
41
+ md: "gap-1.5",
42
+ lg: "gap-2"
43
+ }
44
+ },
45
+ defaultVariants: {
46
+ orientation: "vertical",
47
+ size: "md"
48
+ }
186
49
  });
187
- function Field({
188
- className,
189
- orientation = "vertical",
190
- size,
191
- ...props
192
- }) {
193
- const resolvedSize = useComponentSize(size);
194
- return /* @__PURE__ */ jsx4(SizeProvider, { size: resolvedSize, children: /* @__PURE__ */ jsx4(
195
- "div",
196
- {
197
- role: "group",
198
- "data-slot": "field",
199
- "data-orientation": orientation,
200
- "data-size": resolvedSize,
201
- className: cn(
202
- fieldVariants({ orientation, size: resolvedSize }),
203
- className
204
- ),
205
- ...props
206
- }
207
- ) });
50
+ function Field({ className, orientation = "vertical", size, ...props }) {
51
+ const resolvedSize = useComponentSize(size);
52
+ return /* @__PURE__ */ jsx(SizeProvider, {
53
+ size: resolvedSize,
54
+ children: /* @__PURE__ */ jsx("div", {
55
+ role: "group",
56
+ "data-slot": "field",
57
+ "data-orientation": orientation,
58
+ "data-size": resolvedSize,
59
+ className: cn(fieldVariants({
60
+ orientation,
61
+ size: resolvedSize
62
+ }), className),
63
+ ...props
64
+ })
65
+ });
208
66
  }
209
67
  function FieldContent({ className, ...props }) {
210
- return /* @__PURE__ */ jsx4(
211
- "div",
212
- {
213
- "data-slot": "field-content",
214
- className: cn(
215
- "group/field-content flex flex-1 flex-col leading-snug group-data-[size=sm]/field:gap-0.5 group-data-[size=md]/field:gap-0.5 group-data-[size=lg]/field:gap-1",
216
- className
217
- ),
218
- ...props
219
- }
220
- );
68
+ return /* @__PURE__ */ jsx("div", {
69
+ "data-slot": "field-content",
70
+ className: cn("group/field-content flex flex-1 flex-col leading-snug group-data-[size=sm]/field:gap-0.5 group-data-[size=md]/field:gap-0.5 group-data-[size=lg]/field:gap-1", className),
71
+ ...props
72
+ });
221
73
  }
222
- function FieldLabel({
223
- className,
224
- ...props
225
- }) {
226
- return /* @__PURE__ */ jsx4(
227
- Label,
228
- {
229
- "data-slot": "field-label",
230
- className: cn(
231
- "group/field-label peer/field-label flex w-fit gap-1 leading-snug font-semibold text-fg-primary group-data-[size=sm]/field:text-gdt-xs group-data-[size=md]/field:text-gdt-sm group-data-[size=lg]/field:text-gdt-md group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10",
232
- "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:gap-2",
233
- className
234
- ),
235
- ...props
236
- }
237
- );
74
+ function FieldLabel({ className, ...props }) {
75
+ return /* @__PURE__ */ jsx(Label, {
76
+ "data-slot": "field-label",
77
+ className: cn("group/field-label peer/field-label flex w-fit gap-1 leading-snug font-semibold text-fg-primary group-data-[size=sm]/field:text-gdt-xs group-data-[size=md]/field:text-gdt-sm group-data-[size=lg]/field:text-gdt-md group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10", "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:gap-2", className),
78
+ ...props
79
+ });
238
80
  }
239
81
  function FieldTitle({ className, ...props }) {
240
- return /* @__PURE__ */ jsx4(
241
- "div",
242
- {
243
- "data-slot": "field-label",
244
- className: cn(
245
- "flex w-fit items-center gap-2 font-semibold text-fg-primary group-data-[size=sm]/field:text-gdt-xs group-data-[size=md]/field:text-gdt-sm group-data-[size=lg]/field:text-gdt-md group-data-[disabled=true]/field:opacity-50",
246
- className
247
- ),
248
- ...props
249
- }
250
- );
82
+ return /* @__PURE__ */ jsx("div", {
83
+ "data-slot": "field-label",
84
+ className: cn("flex w-fit items-center gap-2 font-semibold text-fg-primary group-data-[size=sm]/field:text-gdt-xs group-data-[size=md]/field:text-gdt-sm group-data-[size=lg]/field:text-gdt-md group-data-[disabled=true]/field:opacity-50", className),
85
+ ...props
86
+ });
251
87
  }
252
88
  function FieldDescription({ className, ...props }) {
253
- return /* @__PURE__ */ jsx4(
254
- "p",
255
- {
256
- "data-slot": "field-description",
257
- className: cn(
258
- "text-left font-normal text-fg-secondary group-data-[size=sm]/field:text-gdt-subtext group-data-[size=md]/field:text-gdt-xs group-data-[size=lg]/field:text-gdt-sm group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5",
259
- "last:mt-0 nth-last-2:-mt-1",
260
- "[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
261
- className
262
- ),
263
- ...props
264
- }
265
- );
89
+ return /* @__PURE__ */ jsx("p", {
90
+ "data-slot": "field-description",
91
+ className: cn("text-left font-normal text-fg-secondary group-data-[size=sm]/field:text-gdt-subtext group-data-[size=md]/field:text-gdt-xs group-data-[size=lg]/field:text-gdt-sm group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5", "last:mt-0 nth-last-2:-mt-1", "[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary", className),
92
+ ...props
93
+ });
266
94
  }
267
- function FieldSeparator({
268
- children,
269
- className,
270
- ...props
271
- }) {
272
- return /* @__PURE__ */ jsxs2(
273
- "div",
274
- {
275
- "data-slot": "field-separator",
276
- "data-content": !!children,
277
- className: cn(
278
- "relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2",
279
- className
280
- ),
281
- ...props,
282
- children: [
283
- /* @__PURE__ */ jsx4(Separator, { className: "absolute inset-0 top-1/2" }),
284
- children && /* @__PURE__ */ jsx4(
285
- "span",
286
- {
287
- className: "relative mx-auto block w-fit bg-background px-2 text-muted-foreground",
288
- "data-slot": "field-separator-content",
289
- children
290
- }
291
- )
292
- ]
293
- }
294
- );
95
+ function FieldSeparator({ children, className, ...props }) {
96
+ return /* @__PURE__ */ jsxs("div", {
97
+ "data-slot": "field-separator",
98
+ "data-content": !!children,
99
+ className: cn("relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2", className),
100
+ ...props,
101
+ children: [/* @__PURE__ */ jsx(Separator, { className: "absolute inset-0 top-1/2" }), children && /* @__PURE__ */ jsx("span", {
102
+ className: "relative mx-auto block w-fit bg-background px-2 text-muted-foreground",
103
+ "data-slot": "field-separator-content",
104
+ children
105
+ })]
106
+ });
295
107
  }
296
- function FieldError({
297
- className,
298
- children,
299
- errors,
300
- ...props
301
- }) {
302
- const content = useMemo(() => {
303
- if (children) {
304
- return children;
305
- }
306
- if (!errors?.length) {
307
- return null;
308
- }
309
- const uniqueErrors = [
310
- ...new Map(errors.map((error) => [error?.message, error])).values()
311
- ];
312
- if (uniqueErrors?.length === 1) {
313
- return uniqueErrors[0]?.message;
314
- }
315
- return /* @__PURE__ */ jsx4("ul", { className: "ml-4 flex list-disc flex-col gap-1", children: uniqueErrors.map(
316
- (error) => error?.message && /* @__PURE__ */ jsx4("li", { children: error.message }, error.message)
317
- ) });
318
- }, [children, errors]);
319
- if (!content) {
320
- return null;
321
- }
322
- return /* @__PURE__ */ jsx4(
323
- "div",
324
- {
325
- role: "alert",
326
- "data-slot": "field-error",
327
- className: cn("text-gdt-xs font-normal text-fg-danger", className),
328
- ...props,
329
- children: content
330
- }
331
- );
108
+ function FieldError({ className, children, errors, ...props }) {
109
+ const content = useMemo(() => {
110
+ if (children) return children;
111
+ if (!errors?.length) return null;
112
+ const uniqueErrors = [...new Map(errors.map((error) => [error?.message, error])).values()];
113
+ if (uniqueErrors?.length === 1) return uniqueErrors[0]?.message;
114
+ return /* @__PURE__ */ jsx("ul", {
115
+ className: "ml-4 flex list-disc flex-col gap-1",
116
+ children: uniqueErrors.map((error) => error?.message && /* @__PURE__ */ jsx("li", { children: error.message }, error.message))
117
+ });
118
+ }, [children, errors]);
119
+ if (!content) return null;
120
+ return /* @__PURE__ */ jsx("div", {
121
+ role: "alert",
122
+ "data-slot": "field-error",
123
+ className: cn("text-gdt-xs font-normal text-fg-danger", className),
124
+ ...props,
125
+ children: content
126
+ });
332
127
  }
333
- export {
334
- Field,
335
- FieldContent,
336
- FieldDescription,
337
- FieldError,
338
- FieldGroup,
339
- FieldLabel,
340
- FieldLegend,
341
- FieldSeparator,
342
- FieldSet,
343
- FieldTitle
344
- };
345
- //# sourceMappingURL=field.js.map
128
+ //#endregion
129
+ export { Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle };
@@ -0,0 +1,118 @@
1
+ import * as React from "react";
2
+ //#region src/filter.d.ts
3
+ type FilterJoin = "AND" | "OR";
4
+ type FilterFieldType = "text" | "number" | "date" | "select" | "multiSelect" | "range" | "boolean";
5
+ type FilterCondition = "equals" | "greaterThan" | "lessThan" | "contains";
6
+ type FilterRangeValue = {
7
+ min?: number;
8
+ max?: number;
9
+ };
10
+ type FilterValue = string | number | boolean | Array<string | number> | FilterRangeValue;
11
+ type SerializedFilter = {
12
+ connector: FilterJoin;
13
+ field: string;
14
+ action: FilterCondition;
15
+ value: string | number | boolean | Array<string | number>;
16
+ };
17
+ type FilterFieldOption = {
18
+ label: string;
19
+ value: string | number;
20
+ };
21
+ type FilterFieldValueProps = {
22
+ field: FilterFieldConfig;
23
+ value?: FilterValue;
24
+ onChange: (value?: FilterValue) => void;
25
+ invalid: boolean;
26
+ error?: string;
27
+ };
28
+ type FilterFieldConfig = {
29
+ /** The field id sent to the api e.g Name, for nested fields use dot notation e.g Address.City */
30
+ field: string;
31
+ label: string;
32
+ type: FilterFieldType;
33
+ /** Static options for select or multiSelect fields, also shown while `loadOptions` is in flight. */
34
+ options?: FilterFieldOption[];
35
+ /**
36
+ * Lazily load select options. Only called once the dropdown is opened and
37
+ * the result is cached per field, so wire it to `fetch`, a server action,
38
+ * or `queryClient.fetchQuery` — no data library is assumed.
39
+ */
40
+ loadOptions?: () => Promise<FilterFieldOption[]>;
41
+ /**
42
+ * Replace the built-in value input for this field. Compose the exported
43
+ * `FilterValue*` components to keep styling consistent, e.g. wire
44
+ * `FilterValueSelect` to React Query in your app.
45
+ */
46
+ renderValue?: (props: FilterFieldValueProps) => React.ReactNode;
47
+ };
48
+ type FilterProps = {
49
+ children: React.ReactNode;
50
+ /** Connector used between generated filters. */
51
+ defaultJoin?: FilterJoin;
52
+ fields: FilterFieldConfig[];
53
+ /** Receives the serialized filter JSON string plus the structured filters. */
54
+ onApply: (serialized: string, filters: SerializedFilter[]) => void;
55
+ /** Serialized filters used to initialize state, e.g. read from the URL. */
56
+ defaultValue?: string;
57
+ };
58
+ declare function Filter({ children, defaultJoin, fields, onApply, defaultValue }: FilterProps): React.JSX.Element;
59
+ type FilterTriggerProps = {
60
+ children?: React.ReactNode;
61
+ className?: string;
62
+ countClassName?: string;
63
+ /** Hide the count badge while no filters are applied. */
64
+ hideCountWhenZero?: boolean;
65
+ render?: (props: {
66
+ count: number;
67
+ }) => React.ReactNode;
68
+ };
69
+ declare function FilterTrigger({ children, className, countClassName, hideCountWhenZero, render }: FilterTriggerProps): React.JSX.Element;
70
+ type FilterContentProps = {
71
+ addFilterLabel?: React.ReactNode;
72
+ className?: string;
73
+ label?: React.ReactNode;
74
+ };
75
+ declare function FilterContent({ addFilterLabel, className, label }: FilterContentProps): React.JSX.Element;
76
+ type FilterValueInputProps = {
77
+ value?: FilterValue;
78
+ onChange: (value?: FilterValue) => void;
79
+ invalid?: boolean;
80
+ placeholder?: string;
81
+ };
82
+ declare function FilterValueText({ value, onChange, invalid, placeholder }: FilterValueInputProps): React.JSX.Element;
83
+ declare function FilterValueNumber({ value, onChange, invalid, placeholder }: FilterValueInputProps): React.JSX.Element;
84
+ declare function FilterValueDate({ value, onChange, invalid }: FilterValueInputProps): React.JSX.Element;
85
+ type FilterValueBooleanProps = FilterValueInputProps & {
86
+ trueLabel?: string;
87
+ falseLabel?: string;
88
+ };
89
+ declare function FilterValueBoolean({ value, onChange, invalid, placeholder, trueLabel, falseLabel }: FilterValueBooleanProps): React.JSX.Element;
90
+ declare function FilterValueRange({ value, onChange, invalid }: FilterValueInputProps): React.JSX.Element;
91
+ type FilterValueSelectProps = FilterValueInputProps & {
92
+ options: FilterFieldOption[];
93
+ multiple?: boolean;
94
+ loading?: boolean;
95
+ emptyMessage?: React.ReactNode;
96
+ open?: boolean;
97
+ onOpenChange?: (open: boolean) => void;
98
+ };
99
+ declare function FilterValueSelect({ value, onChange, invalid, placeholder, options, multiple, loading, emptyMessage, open, onOpenChange }: FilterValueSelectProps): React.JSX.Element;
100
+ type FilterApplyButtonProps = {
101
+ children?: React.ReactNode;
102
+ className?: string;
103
+ onApplySuccess?: () => void;
104
+ };
105
+ declare function FilterApplyButton({ children, className, onApplySuccess }: FilterApplyButtonProps): React.JSX.Element;
106
+ type FilterResetButtonProps = {
107
+ children?: React.ReactNode;
108
+ className?: string;
109
+ onReset?: () => void;
110
+ };
111
+ declare function FilterResetButton({ children, className, onReset }: FilterResetButtonProps): React.JSX.Element;
112
+ /**
113
+ * Parse a serialized filter string (as produced by `onApply`) back into
114
+ * structured filters. Invalid or malformed entries are dropped.
115
+ */
116
+ declare function parseSerializedFilters(value: string): SerializedFilter[];
117
+ //#endregion
118
+ export { Filter, FilterApplyButton, type FilterApplyButtonProps, type FilterCondition, FilterContent, type FilterContentProps, type FilterFieldConfig, type FilterFieldOption, type FilterFieldType, type FilterFieldValueProps, type FilterJoin, type FilterProps, type FilterRangeValue, FilterResetButton, type FilterResetButtonProps, FilterTrigger, type FilterTriggerProps, type FilterValue, FilterValueBoolean, type FilterValueBooleanProps, FilterValueDate, type FilterValueInputProps, FilterValueNumber, FilterValueRange, FilterValueSelect, type FilterValueSelectProps, FilterValueText, type SerializedFilter, parseSerializedFilters };