@giddaa-housing/ui 1.0.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 (326) hide show
  1. package/css/generated/shared.css +1 -1
  2. package/dist/accordion.d.ts +9 -10
  3. package/dist/accordion.js +41 -87
  4. package/dist/activity-timeline.d.ts +12 -16
  5. package/dist/activity-timeline.js +83 -198
  6. package/dist/alert.d.ts +8 -9
  7. package/dist/alert.js +53 -111
  8. package/dist/auth-layout.d.ts +4 -4
  9. package/dist/auth-layout.js +143 -294
  10. package/dist/avatar.d.ts +6 -6
  11. package/dist/avatar.js +49 -19
  12. package/dist/badge.d.ts +12 -14
  13. package/dist/badge.js +71 -11
  14. package/dist/bar-chart.d.ts +65 -67
  15. package/dist/bar-chart.js +232 -207
  16. package/dist/breadcrumb.d.ts +5 -5
  17. package/dist/breadcrumb.js +56 -118
  18. package/dist/bullet-chart.d.ts +33 -33
  19. package/dist/bullet-chart.js +121 -148
  20. package/dist/button-BZIeyUw6.d.ts +17 -0
  21. package/dist/button-group.d.ts +13 -16
  22. package/dist/button-group.js +39 -88
  23. package/dist/button.d.ts +2 -19
  24. package/dist/button.js +94 -13
  25. package/dist/calendar.d.ts +6 -6
  26. package/dist/calendar.js +138 -17
  27. package/dist/card.d.ts +14 -16
  28. package/dist/card.js +59 -145
  29. package/dist/carousel.d.ts +34 -35
  30. package/dist/carousel.js +335 -20
  31. package/dist/chart.d.ts +58 -59
  32. package/dist/chart.js +376 -28
  33. package/dist/checkbox.d.ts +10 -12
  34. package/dist/checkbox.js +82 -47
  35. package/dist/cn-BI_4DMBf.js +23 -0
  36. package/dist/collapsible.d.ts +7 -8
  37. package/dist/collapsible.js +22 -47
  38. package/dist/combobox.d.ts +10 -10
  39. package/dist/combobox.js +236 -44
  40. package/dist/cta.d.ts +12 -14
  41. package/dist/cta.js +175 -341
  42. package/dist/currency-selector.d.ts +31 -32
  43. package/dist/currency-selector.js +106 -184
  44. package/dist/data-table.d.ts +164 -0
  45. package/dist/data-table.js +673 -0
  46. package/dist/date-picker.d.ts +22 -23
  47. package/dist/date-picker.js +119 -192
  48. package/dist/details-card.d.ts +7 -7
  49. package/dist/details-card.js +104 -253
  50. package/dist/dialog.d.ts +13 -14
  51. package/dist/dialog.js +116 -209
  52. package/dist/dropdown-menu.d.ts +13 -13
  53. package/dist/dropdown-menu.js +180 -37
  54. package/dist/dropzone.d.ts +55 -55
  55. package/dist/dropzone.js +327 -439
  56. package/dist/editorial-card.d.ts +23 -25
  57. package/dist/editorial-card.js +129 -296
  58. package/dist/empty-state.d.ts +8 -9
  59. package/dist/empty-state.js +48 -105
  60. package/dist/field.d.ts +23 -25
  61. package/dist/field.js +110 -221
  62. package/dist/filter.d.ts +118 -0
  63. package/dist/filter.js +775 -0
  64. package/dist/footer.d.ts +8 -15
  65. package/dist/footer.js +197 -400
  66. package/dist/funnel-chart.d.ts +38 -41
  67. package/dist/funnel-chart.js +167 -189
  68. package/dist/gallery-indicator.d.ts +11 -12
  69. package/dist/gallery-indicator.js +75 -12
  70. package/dist/heatmap-chart.d.ts +47 -50
  71. package/dist/heatmap-chart.js +186 -237
  72. package/dist/infotip.d.ts +8 -9
  73. package/dist/infotip.js +33 -59
  74. package/dist/input-CfoEJ8A6.d.ts +12 -0
  75. package/dist/input-group.d.ts +16 -20
  76. package/dist/input-group.js +99 -23
  77. package/dist/input-size-context-C-SFx9sx.d.ts +10 -0
  78. package/dist/input-size-context.d.ts +2 -11
  79. package/dist/input-size-context.js +17 -9
  80. package/dist/input.d.ts +2 -13
  81. package/dist/input.js +27 -11
  82. package/dist/item.d.ts +7 -8
  83. package/dist/item.js +22 -59
  84. package/dist/kpi-card.d.ts +18 -20
  85. package/dist/kpi-card.js +84 -192
  86. package/dist/label.d.ts +6 -6
  87. package/dist/label.js +40 -8
  88. package/dist/line-chart.d.ts +88 -89
  89. package/dist/line-chart.js +142 -104
  90. package/dist/logo.d.ts +4 -4
  91. package/dist/logo.js +92 -9
  92. package/dist/map-indicator.d.ts +7 -7
  93. package/dist/map-indicator.js +80 -106
  94. package/dist/match.d.ts +10 -11
  95. package/dist/match.js +62 -107
  96. package/dist/media-gallery-hero.d.ts +40 -42
  97. package/dist/media-gallery-hero.js +182 -343
  98. package/dist/media-player.d.ts +17 -17
  99. package/dist/media-player.js +873 -1348
  100. package/dist/multi-step-form.d.ts +56 -0
  101. package/dist/multi-step-form.js +342 -0
  102. package/dist/number-input.d.ts +34 -34
  103. package/dist/number-input.js +61 -117
  104. package/dist/page-header.d.ts +10 -11
  105. package/dist/page-header.js +34 -79
  106. package/dist/pagination.d.ts +17 -21
  107. package/dist/pagination.js +132 -207
  108. package/dist/password-input.d.ts +5 -13
  109. package/dist/password-input.js +31 -55
  110. package/dist/phone-input.d.ts +19 -20
  111. package/dist/phone-input.js +226 -344
  112. package/dist/photo-gallery.d.ts +19 -19
  113. package/dist/photo-gallery.js +313 -449
  114. package/dist/picker-lzgmsNfG.js +32 -0
  115. package/dist/pie-chart.d.ts +60 -60
  116. package/dist/pie-chart.js +140 -148
  117. package/dist/popover.d.ts +9 -9
  118. package/dist/popover.js +72 -23
  119. package/dist/price-tag.d.ts +26 -27
  120. package/dist/price-tag.js +113 -173
  121. package/dist/progress.d.ts +16 -17
  122. package/dist/progress.js +169 -24
  123. package/dist/property-listing-card.d.ts +14 -17
  124. package/dist/property-listing-card.js +102 -220
  125. package/dist/radar-chart.d.ts +29 -31
  126. package/dist/radar-chart.js +162 -137
  127. package/dist/radio-group.d.ts +11 -13
  128. package/dist/radio-group.js +46 -60
  129. package/dist/review-block.d.ts +14 -16
  130. package/dist/review-block.js +154 -10
  131. package/dist/rich-text-editor.d.ts +30 -14
  132. package/dist/rich-text-editor.js +592 -716
  133. package/dist/scatter-chart.d.ts +45 -47
  134. package/dist/scatter-chart.js +236 -240
  135. package/dist/search-input.d.ts +8 -16
  136. package/dist/search-input.js +57 -109
  137. package/dist/select.d.ts +8 -8
  138. package/dist/select.js +144 -27
  139. package/dist/separator.d.ts +8 -9
  140. package/dist/separator.js +32 -8
  141. package/dist/sheet.d.ts +11 -11
  142. package/dist/sheet.js +103 -24
  143. package/dist/sidebar.d.ts +32 -37
  144. package/dist/sidebar.js +364 -634
  145. package/dist/size-context-D4mYvcg8.d.ts +10 -0
  146. package/dist/size-context.d.ts +2 -11
  147. package/dist/size-context.js +17 -9
  148. package/dist/skeleton.d.ts +4 -5
  149. package/dist/skeleton.js +12 -8
  150. package/dist/slider.d.ts +8 -9
  151. package/dist/slider.js +64 -135
  152. package/dist/sparkline.d.ts +43 -46
  153. package/dist/sparkline.js +221 -251
  154. package/dist/stepper.d.ts +23 -24
  155. package/dist/stepper.js +149 -246
  156. package/dist/styles.css +510 -108
  157. package/dist/switch.d.ts +10 -12
  158. package/dist/switch.js +48 -70
  159. package/dist/table-card.d.ts +35 -0
  160. package/dist/table-card.js +125 -0
  161. package/dist/table.d.ts +18 -14
  162. package/dist/table.js +113 -154
  163. package/dist/tabs.d.ts +23 -15
  164. package/dist/tabs.js +71 -18
  165. package/dist/tag.d.ts +21 -23
  166. package/dist/tag.js +103 -159
  167. package/dist/testimonial-block.d.ts +18 -19
  168. package/dist/testimonial-block.js +189 -358
  169. package/dist/textarea-IS_D8pXf.d.ts +11 -0
  170. package/dist/textarea.d.ts +2 -12
  171. package/dist/textarea.js +24 -11
  172. package/dist/time-picker.d.ts +11 -11
  173. package/dist/time-picker.js +245 -302
  174. package/dist/toast.d.ts +16 -18
  175. package/dist/toast.js +154 -205
  176. package/dist/tooltip.d.ts +8 -9
  177. package/dist/tooltip.js +37 -12
  178. package/dist/tree-map.d.ts +54 -57
  179. package/dist/tree-map.js +227 -269
  180. package/dist/use-uncontrolled-CLfM1XbB.js +21 -0
  181. package/dist/waterfall-chart.d.ts +94 -97
  182. package/dist/waterfall-chart.js +455 -552
  183. package/package.json +28 -9
  184. package/dist/accordion.js.map +0 -1
  185. package/dist/activity-timeline.js.map +0 -1
  186. package/dist/alert.js.map +0 -1
  187. package/dist/auth-layout.js.map +0 -1
  188. package/dist/avatar.js.map +0 -1
  189. package/dist/badge.js.map +0 -1
  190. package/dist/bar-chart.js.map +0 -1
  191. package/dist/breadcrumb.js.map +0 -1
  192. package/dist/bullet-chart.js.map +0 -1
  193. package/dist/button-group.js.map +0 -1
  194. package/dist/button.js.map +0 -1
  195. package/dist/calendar.js.map +0 -1
  196. package/dist/card.js.map +0 -1
  197. package/dist/carousel.js.map +0 -1
  198. package/dist/chart.js.map +0 -1
  199. package/dist/checkbox.js.map +0 -1
  200. package/dist/chunk-322YCNVL.js +0 -278
  201. package/dist/chunk-322YCNVL.js.map +0 -1
  202. package/dist/chunk-3ACQVT7A.js +0 -25
  203. package/dist/chunk-3ACQVT7A.js.map +0 -1
  204. package/dist/chunk-3T65TLJX.js +0 -334
  205. package/dist/chunk-3T65TLJX.js.map +0 -1
  206. package/dist/chunk-6ZSGQHH2.js +0 -192
  207. package/dist/chunk-6ZSGQHH2.js.map +0 -1
  208. package/dist/chunk-7TBMLFGW.js +0 -41
  209. package/dist/chunk-7TBMLFGW.js.map +0 -1
  210. package/dist/chunk-B4H6RNDH.js +0 -135
  211. package/dist/chunk-B4H6RNDH.js.map +0 -1
  212. package/dist/chunk-BUXCGZ6X.js +0 -219
  213. package/dist/chunk-BUXCGZ6X.js.map +0 -1
  214. package/dist/chunk-CHII2QHH.js +0 -58
  215. package/dist/chunk-CHII2QHH.js.map +0 -1
  216. package/dist/chunk-DMNOXRRW.js +0 -147
  217. package/dist/chunk-DMNOXRRW.js.map +0 -1
  218. package/dist/chunk-EFSOSSIC.js +0 -130
  219. package/dist/chunk-EFSOSSIC.js.map +0 -1
  220. package/dist/chunk-FZDSVMKY.js +0 -363
  221. package/dist/chunk-FZDSVMKY.js.map +0 -1
  222. package/dist/chunk-GJOFIJS3.js +0 -246
  223. package/dist/chunk-GJOFIJS3.js.map +0 -1
  224. package/dist/chunk-HL3ZSYES.js +0 -23
  225. package/dist/chunk-HL3ZSYES.js.map +0 -1
  226. package/dist/chunk-JVLUBAPB.js +0 -129
  227. package/dist/chunk-JVLUBAPB.js.map +0 -1
  228. package/dist/chunk-KDPYSOYZ.js +0 -64
  229. package/dist/chunk-KDPYSOYZ.js.map +0 -1
  230. package/dist/chunk-KSMDANKI.js +0 -43
  231. package/dist/chunk-KSMDANKI.js.map +0 -1
  232. package/dist/chunk-MEKCCOP5.js +0 -46
  233. package/dist/chunk-MEKCCOP5.js.map +0 -1
  234. package/dist/chunk-NOFXVRWL.js +0 -451
  235. package/dist/chunk-NOFXVRWL.js.map +0 -1
  236. package/dist/chunk-PC5MHNVA.js +0 -171
  237. package/dist/chunk-PC5MHNVA.js.map +0 -1
  238. package/dist/chunk-QKAQZ2GU.js +0 -122
  239. package/dist/chunk-QKAQZ2GU.js.map +0 -1
  240. package/dist/chunk-QZHSHSVV.js +0 -26
  241. package/dist/chunk-QZHSHSVV.js.map +0 -1
  242. package/dist/chunk-RBMK26XD.js +0 -19
  243. package/dist/chunk-RBMK26XD.js.map +0 -1
  244. package/dist/chunk-SFNJGF6M.js +0 -262
  245. package/dist/chunk-SFNJGF6M.js.map +0 -1
  246. package/dist/chunk-UJJNLGTM.js +0 -112
  247. package/dist/chunk-UJJNLGTM.js.map +0 -1
  248. package/dist/chunk-VGR4ZWJ3.js +0 -418
  249. package/dist/chunk-VGR4ZWJ3.js.map +0 -1
  250. package/dist/chunk-XG47P6D4.js +0 -99
  251. package/dist/chunk-XG47P6D4.js.map +0 -1
  252. package/dist/chunk-XZZAHNVM.js +0 -21
  253. package/dist/chunk-XZZAHNVM.js.map +0 -1
  254. package/dist/chunk-Y4TTYVNE.js +0 -36
  255. package/dist/chunk-Y4TTYVNE.js.map +0 -1
  256. package/dist/chunk-YDWIHW6Q.js +0 -69
  257. package/dist/chunk-YDWIHW6Q.js.map +0 -1
  258. package/dist/collapsible.js.map +0 -1
  259. package/dist/combobox.js.map +0 -1
  260. package/dist/cta.js.map +0 -1
  261. package/dist/currency-selector.js.map +0 -1
  262. package/dist/date-picker.js.map +0 -1
  263. package/dist/details-card.js.map +0 -1
  264. package/dist/dialog.js.map +0 -1
  265. package/dist/dropdown-menu.js.map +0 -1
  266. package/dist/dropzone.js.map +0 -1
  267. package/dist/editorial-card.js.map +0 -1
  268. package/dist/empty-state.js.map +0 -1
  269. package/dist/field.js.map +0 -1
  270. package/dist/footer.js.map +0 -1
  271. package/dist/funnel-chart.js.map +0 -1
  272. package/dist/gallery-indicator.js.map +0 -1
  273. package/dist/heatmap-chart.js.map +0 -1
  274. package/dist/infotip.js.map +0 -1
  275. package/dist/input-group.js.map +0 -1
  276. package/dist/input-size-context.js.map +0 -1
  277. package/dist/input.js.map +0 -1
  278. package/dist/item.js.map +0 -1
  279. package/dist/kpi-card.js.map +0 -1
  280. package/dist/label.js.map +0 -1
  281. package/dist/line-chart.js.map +0 -1
  282. package/dist/logo.js.map +0 -1
  283. package/dist/map-indicator.js.map +0 -1
  284. package/dist/match.js.map +0 -1
  285. package/dist/media-gallery-hero.js.map +0 -1
  286. package/dist/media-player.js.map +0 -1
  287. package/dist/number-input.js.map +0 -1
  288. package/dist/page-header.js.map +0 -1
  289. package/dist/pagination.js.map +0 -1
  290. package/dist/password-input.js.map +0 -1
  291. package/dist/phone-input.js.map +0 -1
  292. package/dist/photo-gallery.js.map +0 -1
  293. package/dist/pie-chart.js.map +0 -1
  294. package/dist/popover.js.map +0 -1
  295. package/dist/price-tag.js.map +0 -1
  296. package/dist/progress.js.map +0 -1
  297. package/dist/property-listing-card.js.map +0 -1
  298. package/dist/radar-chart.js.map +0 -1
  299. package/dist/radio-group.js.map +0 -1
  300. package/dist/review-block.js.map +0 -1
  301. package/dist/rich-text-editor.js.map +0 -1
  302. package/dist/scatter-chart.js.map +0 -1
  303. package/dist/search-input.js.map +0 -1
  304. package/dist/select.js.map +0 -1
  305. package/dist/separator.js.map +0 -1
  306. package/dist/sheet.js.map +0 -1
  307. package/dist/sidebar.js.map +0 -1
  308. package/dist/size-context.js.map +0 -1
  309. package/dist/skeleton.js.map +0 -1
  310. package/dist/slider.js.map +0 -1
  311. package/dist/sparkline.js.map +0 -1
  312. package/dist/stepper.js.map +0 -1
  313. package/dist/switch.js.map +0 -1
  314. package/dist/tab-list.d.ts +0 -38
  315. package/dist/tab-list.js +0 -123
  316. package/dist/tab-list.js.map +0 -1
  317. package/dist/table.js.map +0 -1
  318. package/dist/tabs.js.map +0 -1
  319. package/dist/tag.js.map +0 -1
  320. package/dist/testimonial-block.js.map +0 -1
  321. package/dist/textarea.js.map +0 -1
  322. package/dist/time-picker.js.map +0 -1
  323. package/dist/toast.js.map +0 -1
  324. package/dist/tooltip.js.map +0 -1
  325. package/dist/tree-map.js.map +0 -1
  326. package/dist/waterfall-chart.js.map +0 -1
@@ -1,362 +1,244 @@
1
1
  "use client";
2
- import {
3
- Popover,
4
- PopoverContent,
5
- PopoverTrigger
6
- } from "./chunk-JVLUBAPB.js";
7
- import {
8
- Separator
9
- } from "./chunk-CHII2QHH.js";
10
- import {
11
- InputGroup,
12
- InputGroupAddon,
13
- InputGroupInput
14
- } from "./chunk-6ZSGQHH2.js";
15
- import "./chunk-KSMDANKI.js";
16
- import "./chunk-MEKCCOP5.js";
17
- import "./chunk-3ACQVT7A.js";
18
- import "./chunk-B4H6RNDH.js";
19
- import {
20
- useComponentSize
21
- } from "./chunk-HL3ZSYES.js";
22
- import {
23
- cn
24
- } from "./chunk-Y4TTYVNE.js";
25
-
26
- // src/phone-input.tsx
27
- import {
28
- AsYouType,
29
- getCountries,
30
- getCountryCallingCode,
31
- parsePhoneNumber
32
- } from "libphonenumber-js";
2
+ import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { useComponentSize } from "./size-context.js";
4
+ import { Separator } from "./separator.js";
5
+ import { InputGroup, InputGroupAddon, InputGroupInput } from "./input-group.js";
6
+ import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
33
7
  import { CheckIcon, ChevronDownIcon, SearchIcon } from "lucide-react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
34
9
  import * as React from "react";
10
+ import { AsYouType, getCountries, getCountryCallingCode, parsePhoneNumber } from "libphonenumber-js";
35
11
  import flags from "react-phone-number-input/flags";
36
- import { jsx, jsxs } from "react/jsx-runtime";
37
- var regionNames = typeof Intl !== "undefined" && "DisplayNames" in Intl ? new Intl.DisplayNames(["en"], { type: "region" }) : void 0;
38
- var COUNTRIES = getCountries().map((code) => ({
39
- code,
40
- name: regionNames?.of(code) ?? code,
41
- calling: getCountryCallingCode(code)
12
+ //#region src/phone-input.tsx
13
+ const regionNames = typeof Intl !== "undefined" && "DisplayNames" in Intl ? new Intl.DisplayNames(["en"], { type: "region" }) : void 0;
14
+ const COUNTRIES = getCountries().map((code) => ({
15
+ code,
16
+ name: regionNames?.of(code) ?? code,
17
+ calling: getCountryCallingCode(code)
42
18
  })).sort((a, b) => a.name.localeCompare(b.name));
43
19
  function getNationalDigits(value) {
44
- return value.replace(/\D/g, "");
20
+ return value.replace(/\D/g, "");
45
21
  }
46
22
  function formatNational(digits, country) {
47
- if (!digits) return "";
48
- return new AsYouType(country).input(digits);
23
+ if (!digits) return "";
24
+ return new AsYouType(country).input(digits);
49
25
  }
50
26
  function toE164(digits, country) {
51
- if (!digits) return void 0;
52
- return `+${getCountryCallingCode(country)}${digits}`;
27
+ if (!digits) return void 0;
28
+ return `+${getCountryCallingCode(country)}${digits}`;
53
29
  }
54
30
  function parseValue(value) {
55
- if (!value) return { digits: "" };
56
- try {
57
- const parsed = parsePhoneNumber(value);
58
- if (parsed?.nationalNumber) {
59
- return { country: parsed.country, digits: parsed.nationalNumber };
60
- }
61
- } catch {
62
- }
63
- return { digits: "" };
31
+ if (!value) return { digits: "" };
32
+ try {
33
+ const parsed = parsePhoneNumber(value);
34
+ if (parsed?.nationalNumber) return {
35
+ country: parsed.country,
36
+ digits: parsed.nationalNumber
37
+ };
38
+ } catch {}
39
+ return { digits: "" };
64
40
  }
65
- var flagSizeVariants = {
66
- sm: "h-3 w-[18px]",
67
- md: "h-3.5 w-5",
68
- lg: "h-4 w-6"
41
+ const flagSizeVariants = {
42
+ sm: "h-3 w-[18px]",
43
+ md: "h-3.5 w-5",
44
+ lg: "h-4 w-6"
69
45
  };
70
- function CountryFlag({
71
- country,
72
- size,
73
- className
74
- }) {
75
- const Flag = flags[country];
76
- return /* @__PURE__ */ jsx(
77
- "span",
78
- {
79
- className: cn(
80
- "inline-flex shrink-0 items-center justify-center overflow-hidden rounded-[3px] bg-surface-raised [&>svg]:h-full [&>svg]:w-full [&>svg]:object-cover",
81
- flagSizeVariants[size],
82
- className
83
- ),
84
- children: Flag ? /* @__PURE__ */ jsx(Flag, { title: country }) : /* @__PURE__ */ jsx("span", { className: "text-gdt-xs text-fg-secondary", children: country })
85
- }
86
- );
46
+ function CountryFlag({ country, size, className }) {
47
+ const Flag = flags[country];
48
+ return /* @__PURE__ */ jsx("span", {
49
+ className: cn("inline-flex shrink-0 items-center justify-center overflow-hidden rounded-[3px] bg-surface-raised [&>svg]:h-full [&>svg]:w-full [&>svg]:object-cover", flagSizeVariants[size], className),
50
+ children: Flag ? /* @__PURE__ */ jsx(Flag, { title: country }) : /* @__PURE__ */ jsx("span", {
51
+ className: "text-gdt-xs text-fg-secondary",
52
+ children: country
53
+ })
54
+ });
87
55
  }
88
- var ROW_HEIGHT = 40;
89
- var LIST_PADDING = 6;
90
- var OVERSCAN = 6;
91
- function CountryList({
92
- items,
93
- country,
94
- onSelect
95
- }) {
96
- const scrollRef = React.useRef(null);
97
- const [viewport, setViewport] = React.useState(256);
98
- const [scrollTop, setScrollTop] = React.useState(() => {
99
- const index = items.findIndex((entry) => entry.code === country);
100
- return index > 0 ? index * ROW_HEIGHT : 0;
101
- });
102
- React.useLayoutEffect(() => {
103
- const el = scrollRef.current;
104
- if (!el) return;
105
- setViewport(el.clientHeight);
106
- el.scrollTop = scrollTop;
107
- }, []);
108
- if (items.length === 0) {
109
- return /* @__PURE__ */ jsx("p", { className: "px-3.5 py-6 text-center text-gdt-sm text-fg-secondary", children: "No country found" });
110
- }
111
- const total = items.length;
112
- const first = Math.max(0, Math.floor(scrollTop / ROW_HEIGHT) - OVERSCAN);
113
- const last = Math.min(
114
- total,
115
- Math.ceil((scrollTop + viewport) / ROW_HEIGHT) + OVERSCAN
116
- );
117
- const visible = items.slice(first, last);
118
- return /* @__PURE__ */ jsx(
119
- "div",
120
- {
121
- ref: scrollRef,
122
- onScroll: (event) => setScrollTop(event.currentTarget.scrollTop),
123
- className: "no-scrollbar max-h-64 overflow-y-auto",
124
- children: /* @__PURE__ */ jsx(
125
- "div",
126
- {
127
- className: "relative w-full",
128
- style: { height: total * ROW_HEIGHT + LIST_PADDING * 2 },
129
- children: visible.map((entry, i) => {
130
- const index = first + i;
131
- const selected = entry.code === country;
132
- return /* @__PURE__ */ jsxs(
133
- "button",
134
- {
135
- type: "button",
136
- style: {
137
- position: "absolute",
138
- top: index * ROW_HEIGHT + LIST_PADDING,
139
- height: ROW_HEIGHT
140
- },
141
- onClick: () => onSelect(entry.code),
142
- className: cn(
143
- "flex w-full items-center gap-2.5 px-3.5 text-left text-gdt-sm outline-none transition-colors hover:bg-surface focus-visible:bg-surface",
144
- selected ? "font-medium text-fg-brand" : "text-fg-primary"
145
- ),
146
- children: [
147
- /* @__PURE__ */ jsx(CountryFlag, { country: entry.code, size: "md" }),
148
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: entry.name }),
149
- /* @__PURE__ */ jsxs("span", { className: "shrink-0 text-fg-secondary", children: [
150
- "+",
151
- entry.calling
152
- ] }),
153
- selected && /* @__PURE__ */ jsx(CheckIcon, { className: "size-4 shrink-0 text-fg-brand" })
154
- ]
155
- },
156
- entry.code
157
- );
158
- })
159
- }
160
- )
161
- }
162
- );
56
+ const ROW_HEIGHT = 40;
57
+ const LIST_PADDING = 6;
58
+ const OVERSCAN = 6;
59
+ function CountryList({ items, country, onSelect }) {
60
+ const scrollRef = React.useRef(null);
61
+ const [viewport, setViewport] = React.useState(256);
62
+ const [scrollTop, setScrollTop] = React.useState(() => {
63
+ const index = items.findIndex((entry) => entry.code === country);
64
+ return index > 0 ? index * ROW_HEIGHT : 0;
65
+ });
66
+ React.useLayoutEffect(() => {
67
+ const el = scrollRef.current;
68
+ if (!el) return;
69
+ setViewport(el.clientHeight);
70
+ el.scrollTop = scrollTop;
71
+ }, []);
72
+ if (items.length === 0) return /* @__PURE__ */ jsx("p", {
73
+ className: "px-3.5 py-6 text-center text-gdt-sm text-fg-secondary",
74
+ children: "No country found"
75
+ });
76
+ const total = items.length;
77
+ const first = Math.max(0, Math.floor(scrollTop / ROW_HEIGHT) - OVERSCAN);
78
+ const last = Math.min(total, Math.ceil((scrollTop + viewport) / ROW_HEIGHT) + OVERSCAN);
79
+ const visible = items.slice(first, last);
80
+ return /* @__PURE__ */ jsx("div", {
81
+ ref: scrollRef,
82
+ onScroll: (event) => setScrollTop(event.currentTarget.scrollTop),
83
+ className: "no-scrollbar max-h-64 overflow-y-auto",
84
+ children: /* @__PURE__ */ jsx("div", {
85
+ className: "relative w-full",
86
+ style: { height: total * ROW_HEIGHT + LIST_PADDING * 2 },
87
+ children: visible.map((entry, i) => {
88
+ const index = first + i;
89
+ const selected = entry.code === country;
90
+ return /* @__PURE__ */ jsxs("button", {
91
+ type: "button",
92
+ style: {
93
+ position: "absolute",
94
+ top: index * ROW_HEIGHT + LIST_PADDING,
95
+ height: ROW_HEIGHT
96
+ },
97
+ onClick: () => onSelect(entry.code),
98
+ className: cn("flex w-full items-center gap-2.5 px-3.5 text-left text-gdt-sm outline-none transition-colors hover:bg-surface focus-visible:bg-surface", selected ? "font-medium text-fg-brand" : "text-fg-primary"),
99
+ children: [
100
+ /* @__PURE__ */ jsx(CountryFlag, {
101
+ country: entry.code,
102
+ size: "md"
103
+ }),
104
+ /* @__PURE__ */ jsx("span", {
105
+ className: "min-w-0 flex-1 truncate",
106
+ children: entry.name
107
+ }),
108
+ /* @__PURE__ */ jsxs("span", {
109
+ className: "shrink-0 text-fg-secondary",
110
+ children: ["+", entry.calling]
111
+ }),
112
+ selected && /* @__PURE__ */ jsx(CheckIcon, { className: "size-4 shrink-0 text-fg-brand" })
113
+ ]
114
+ }, entry.code);
115
+ })
116
+ })
117
+ });
163
118
  }
164
- function CountrySelect({
165
- country,
166
- size,
167
- disabled,
168
- onSelect,
169
- finalFocusRef
170
- }) {
171
- const [open, setOpen] = React.useState(false);
172
- const [query, setQuery] = React.useState("");
173
- const searchRef = React.useRef(null);
174
- const filtered = React.useMemo(() => {
175
- const q = query.trim().toLowerCase();
176
- if (!q) return COUNTRIES;
177
- const normalized = q.replace(/^\+/, "");
178
- return COUNTRIES.filter(
179
- (entry) => entry.name.toLowerCase().includes(q) || entry.calling.includes(normalized) || entry.code.toLowerCase().includes(q)
180
- );
181
- }, [query]);
182
- function handleOpenChange(next) {
183
- setOpen(next);
184
- if (!next) setQuery("");
185
- }
186
- function handleSelect(next) {
187
- onSelect(next);
188
- handleOpenChange(false);
189
- }
190
- return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
191
- /* @__PURE__ */ jsxs(
192
- PopoverTrigger,
193
- {
194
- disabled,
195
- "data-slot": "phone-country-trigger",
196
- className: cn(
197
- "flex shrink-0 items-center gap-1.5 rounded-full font-normal text-fg-primary outline-none transition-colors select-none",
198
- "focus-visible:text-fg-brand disabled:cursor-not-allowed disabled:text-fg-caption-placeholder",
199
- size === "sm" && "text-gdt-xs",
200
- size === "md" && "text-gdt-sm",
201
- size === "lg" && "text-gdt-md"
202
- ),
203
- children: [
204
- /* @__PURE__ */ jsx(CountryFlag, { country, size }),
205
- /* @__PURE__ */ jsxs("span", { children: [
206
- "+",
207
- getCountryCallingCode(country)
208
- ] }),
209
- /* @__PURE__ */ jsx(
210
- ChevronDownIcon,
211
- {
212
- className: cn(
213
- "text-fg-secondary transition-transform",
214
- open && "rotate-180",
215
- size === "lg" ? "size-4" : "size-3.5"
216
- )
217
- }
218
- )
219
- ]
220
- }
221
- ),
222
- /* @__PURE__ */ jsxs(
223
- PopoverContent,
224
- {
225
- showArrow: false,
226
- align: "start",
227
- alignOffset: 0,
228
- sideOffset: 10,
229
- finalFocus: finalFocusRef,
230
- className: "w-72 gap-0 overflow-hidden p-0",
231
- children: [
232
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-b border-line-subtle px-3.5 py-2.5", children: [
233
- /* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 text-fg-secondary" }),
234
- /* @__PURE__ */ jsx(
235
- "input",
236
- {
237
- ref: searchRef,
238
- value: query,
239
- onChange: (event) => setQuery(event.target.value),
240
- placeholder: "Search country",
241
- className: "w-full bg-transparent text-gdt-sm text-fg-primary outline-none placeholder:text-fg-caption-placeholder"
242
- }
243
- )
244
- ] }),
245
- /* @__PURE__ */ jsx(
246
- CountryList,
247
- {
248
- items: filtered,
249
- country,
250
- onSelect: handleSelect
251
- },
252
- query
253
- )
254
- ]
255
- }
256
- )
257
- ] });
119
+ function CountrySelect({ country, size, disabled, onSelect, finalFocusRef }) {
120
+ const [open, setOpen] = React.useState(false);
121
+ const [query, setQuery] = React.useState("");
122
+ const searchRef = React.useRef(null);
123
+ const filtered = React.useMemo(() => {
124
+ const q = query.trim().toLowerCase();
125
+ if (!q) return COUNTRIES;
126
+ const normalized = q.replace(/^\+/, "");
127
+ return COUNTRIES.filter((entry) => entry.name.toLowerCase().includes(q) || entry.calling.includes(normalized) || entry.code.toLowerCase().includes(q));
128
+ }, [query]);
129
+ function handleOpenChange(next) {
130
+ setOpen(next);
131
+ if (!next) setQuery("");
132
+ }
133
+ function handleSelect(next) {
134
+ onSelect(next);
135
+ handleOpenChange(false);
136
+ }
137
+ return /* @__PURE__ */ jsxs(Popover, {
138
+ open,
139
+ onOpenChange: handleOpenChange,
140
+ children: [/* @__PURE__ */ jsxs(PopoverTrigger, {
141
+ disabled,
142
+ "data-slot": "phone-country-trigger",
143
+ className: cn("flex shrink-0 items-center gap-1.5 rounded-full font-normal text-fg-primary outline-none transition-colors select-none", "focus-visible:text-fg-brand disabled:cursor-not-allowed disabled:text-fg-caption-placeholder", size === "sm" && "text-gdt-xs", size === "md" && "text-gdt-sm", size === "lg" && "text-gdt-md"),
144
+ children: [
145
+ /* @__PURE__ */ jsx(CountryFlag, {
146
+ country,
147
+ size
148
+ }),
149
+ /* @__PURE__ */ jsxs("span", { children: ["+", getCountryCallingCode(country)] }),
150
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: cn("text-fg-secondary transition-transform", open && "rotate-180", size === "lg" ? "size-4" : "size-3.5") })
151
+ ]
152
+ }), /* @__PURE__ */ jsxs(PopoverContent, {
153
+ showArrow: false,
154
+ align: "start",
155
+ alignOffset: 0,
156
+ sideOffset: 10,
157
+ finalFocus: finalFocusRef,
158
+ className: "w-72 gap-0 overflow-hidden p-0",
159
+ children: [/* @__PURE__ */ jsxs("div", {
160
+ className: "flex items-center gap-2 border-b border-line-subtle px-3.5 py-2.5",
161
+ children: [/* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 text-fg-secondary" }), /* @__PURE__ */ jsx("input", {
162
+ ref: searchRef,
163
+ value: query,
164
+ onChange: (event) => setQuery(event.target.value),
165
+ placeholder: "Search country",
166
+ className: "w-full bg-transparent text-gdt-sm text-fg-primary outline-none placeholder:text-fg-caption-placeholder"
167
+ })]
168
+ }), /* @__PURE__ */ jsx(CountryList, {
169
+ items: filtered,
170
+ country,
171
+ onSelect: handleSelect
172
+ }, query)]
173
+ })]
174
+ });
258
175
  }
259
- function PhoneInput({
260
- value,
261
- onChange,
262
- defaultCountry = "NG",
263
- size,
264
- disabled = false,
265
- readOnly = false,
266
- placeholder = "(0000) 000-0000",
267
- className,
268
- id,
269
- name,
270
- ref,
271
- "aria-invalid": ariaInvalid
272
- }) {
273
- const resolvedSize = useComponentSize(size);
274
- const inputRef = React.useRef(null);
275
- const setInputRef = React.useCallback(
276
- (node) => {
277
- inputRef.current = node;
278
- if (typeof ref === "function") ref(node);
279
- else if (ref) ref.current = node;
280
- },
281
- [ref]
282
- );
283
- const initial = React.useMemo(() => parseValue(value), []);
284
- const [country, setCountry] = React.useState(
285
- initial.country ?? defaultCountry
286
- );
287
- const [national, setNational] = React.useState(
288
- () => formatNational(initial.digits, initial.country ?? defaultCountry)
289
- );
290
- React.useEffect(() => {
291
- const currentDigits = getNationalDigits(national);
292
- if (toE164(currentDigits, country) === value) return;
293
- const next = parseValue(value);
294
- const nextCountry = next.country ?? country;
295
- setCountry(nextCountry);
296
- setNational(formatNational(next.digits, nextCountry));
297
- }, [value]);
298
- function emit(digits, nextCountry) {
299
- onChange?.(toE164(digits, nextCountry));
300
- }
301
- function handleInputChange(event) {
302
- const digits = getNationalDigits(event.target.value);
303
- setNational(formatNational(digits, country));
304
- emit(digits, country);
305
- }
306
- function handleCountrySelect(nextCountry) {
307
- const digits = getNationalDigits(national);
308
- setCountry(nextCountry);
309
- setNational(formatNational(digits, nextCountry));
310
- emit(digits, nextCountry);
311
- }
312
- const dividerStateClasses = cn(
313
- "group-hover/input-group:bg-line-strong",
314
- "group-focus-within/input-group:bg-line-focus",
315
- "group-has-[[aria-invalid=true]]/input-group:bg-line-danger",
316
- "group-has-disabled/input-group:bg-line-subtle"
317
- );
318
- return /* @__PURE__ */ jsxs(InputGroup, { size: resolvedSize, className, children: [
319
- /* @__PURE__ */ jsxs(InputGroupAddon, { align: "inline-start", className: "gap-2 self-stretch py-0", children: [
320
- /* @__PURE__ */ jsx(
321
- CountrySelect,
322
- {
323
- country,
324
- size: resolvedSize,
325
- disabled,
326
- onSelect: handleCountrySelect,
327
- finalFocusRef: inputRef
328
- }
329
- ),
330
- /* @__PURE__ */ jsx(
331
- Separator,
332
- {
333
- orientation: "vertical",
334
- shade: "deep",
335
- className: cn("self-stretch transition-colors", dividerStateClasses)
336
- }
337
- )
338
- ] }),
339
- /* @__PURE__ */ jsx(
340
- InputGroupInput,
341
- {
342
- ref: setInputRef,
343
- id,
344
- name,
345
- type: "tel",
346
- inputMode: "tel",
347
- autoComplete: "tel",
348
- value: national,
349
- onChange: handleInputChange,
350
- placeholder,
351
- disabled,
352
- readOnly,
353
- "aria-invalid": ariaInvalid || void 0,
354
- className: "pl-0"
355
- }
356
- )
357
- ] });
176
+ function PhoneInput({ value, onChange, defaultCountry = "NG", size, disabled = false, readOnly = false, placeholder = "(0000) 000-0000", className, id, name, ref, "aria-invalid": ariaInvalid }) {
177
+ const resolvedSize = useComponentSize(size);
178
+ const inputRef = React.useRef(null);
179
+ const setInputRef = React.useCallback((node) => {
180
+ inputRef.current = node;
181
+ if (typeof ref === "function") ref(node);
182
+ else if (ref) ref.current = node;
183
+ }, [ref]);
184
+ const initial = React.useMemo(() => parseValue(value), []);
185
+ const [country, setCountry] = React.useState(initial.country ?? defaultCountry);
186
+ const [national, setNational] = React.useState(() => formatNational(initial.digits, initial.country ?? defaultCountry));
187
+ React.useEffect(() => {
188
+ if (toE164(getNationalDigits(national), country) === value) return;
189
+ const next = parseValue(value);
190
+ const nextCountry = next.country ?? country;
191
+ setCountry(nextCountry);
192
+ setNational(formatNational(next.digits, nextCountry));
193
+ }, [value]);
194
+ function emit(digits, nextCountry) {
195
+ onChange?.(toE164(digits, nextCountry));
196
+ }
197
+ function handleInputChange(event) {
198
+ const digits = getNationalDigits(event.target.value);
199
+ setNational(formatNational(digits, country));
200
+ emit(digits, country);
201
+ }
202
+ function handleCountrySelect(nextCountry) {
203
+ const digits = getNationalDigits(national);
204
+ setCountry(nextCountry);
205
+ setNational(formatNational(digits, nextCountry));
206
+ emit(digits, nextCountry);
207
+ }
208
+ const dividerStateClasses = cn("group-hover/input-group:bg-line-strong", "group-focus-within/input-group:bg-line-focus", "group-has-[[aria-invalid=true]]/input-group:bg-line-danger", "group-has-disabled/input-group:bg-line-subtle");
209
+ return /* @__PURE__ */ jsxs(InputGroup, {
210
+ size: resolvedSize,
211
+ className,
212
+ children: [/* @__PURE__ */ jsxs(InputGroupAddon, {
213
+ align: "inline-start",
214
+ className: "gap-2 self-stretch py-0",
215
+ children: [/* @__PURE__ */ jsx(CountrySelect, {
216
+ country,
217
+ size: resolvedSize,
218
+ disabled,
219
+ onSelect: handleCountrySelect,
220
+ finalFocusRef: inputRef
221
+ }), /* @__PURE__ */ jsx(Separator, {
222
+ orientation: "vertical",
223
+ shade: "deep",
224
+ className: cn("self-stretch transition-colors", dividerStateClasses)
225
+ })]
226
+ }), /* @__PURE__ */ jsx(InputGroupInput, {
227
+ ref: setInputRef,
228
+ id,
229
+ name,
230
+ type: "tel",
231
+ inputMode: "tel",
232
+ autoComplete: "tel",
233
+ value: national,
234
+ onChange: handleInputChange,
235
+ placeholder,
236
+ disabled,
237
+ readOnly,
238
+ "aria-invalid": ariaInvalid || void 0,
239
+ className: "pl-0"
240
+ })]
241
+ });
358
242
  }
359
- export {
360
- PhoneInput
361
- };
362
- //# sourceMappingURL=phone-input.js.map
243
+ //#endregion
244
+ export { PhoneInput };
@@ -1,20 +1,20 @@
1
- import * as React from 'react';
2
-
1
+ import * as React from "react";
2
+ //#region src/photo-gallery.d.ts
3
3
  /**
4
4
  * A single property photo. `src` is optional so the gallery can render a
5
5
  * "Property Image" placeholder in previews / while imagery is still loading.
6
6
  */
7
7
  type PhotoGalleryImage = {
8
- src?: string;
9
- alt?: string;
8
+ src?: string;
9
+ alt?: string;
10
10
  };
11
11
  type PhotoGalleryProps = Omit<React.ComponentProps<"div">, "onClick"> & {
12
- images: PhotoGalleryImage[];
13
- /** Controlled active index. Omit to let the gallery manage it internally. */
14
- index?: number;
15
- onIndexChange?: (index: number) => void;
16
- /** Called when the hero image is activated — wire this to open fullscreen. */
17
- onImageClick?: (index: number) => void;
12
+ images: PhotoGalleryImage[];
13
+ /** Controlled active index. Omit to let the gallery manage it internally. */
14
+ index?: number;
15
+ onIndexChange?: (index: number) => void;
16
+ /** Called when the hero image is activated — wire this to open fullscreen. */
17
+ onImageClick?: (index: number) => void;
18
18
  };
19
19
  /**
20
20
  * Inline property gallery: a swipeable hero image (drag / touch / ← →) with a
@@ -24,12 +24,12 @@ type PhotoGalleryProps = Omit<React.ComponentProps<"div">, "onClick"> & {
24
24
  */
25
25
  declare function PhotoGallery({ images, index, onIndexChange, onImageClick, className, ...props }: PhotoGalleryProps): React.JSX.Element;
26
26
  type PhotoGalleryFullscreenProps = {
27
- images: PhotoGalleryImage[];
28
- open: boolean;
29
- onOpenChange: (open: boolean) => void;
30
- /** Controlled active index. Omit to let the viewer manage it internally. */
31
- index?: number;
32
- onIndexChange?: (index: number) => void;
27
+ images: PhotoGalleryImage[];
28
+ open: boolean;
29
+ onOpenChange: (open: boolean) => void;
30
+ /** Controlled active index. Omit to let the viewer manage it internally. */
31
+ index?: number;
32
+ onIndexChange?: (index: number) => void;
33
33
  };
34
34
  /**
35
35
  * Fullscreen lightbox: takes over the viewport over a dimmed backdrop for
@@ -37,6 +37,6 @@ type PhotoGalleryFullscreenProps = {
37
37
  * and ESC to close. Built on {@link Carousel}; controlled via `open` /
38
38
  * `onOpenChange` and usable without the inline gallery.
39
39
  */
40
- declare function PhotoGalleryFullscreen({ images, open, onOpenChange, index, onIndexChange, }: PhotoGalleryFullscreenProps): React.JSX.Element;
41
-
42
- export { PhotoGallery, PhotoGalleryFullscreen, type PhotoGalleryFullscreenProps, type PhotoGalleryImage, type PhotoGalleryProps };
40
+ declare function PhotoGalleryFullscreen({ images, open, onOpenChange, index, onIndexChange }: PhotoGalleryFullscreenProps): React.JSX.Element;
41
+ //#endregion
42
+ export { PhotoGallery, PhotoGalleryFullscreen, type PhotoGalleryFullscreenProps, type PhotoGalleryImage, type PhotoGalleryProps };