@giddaa-housing/ui 1.0.0 → 1.2.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 (331) hide show
  1. package/css/generated/shared.css +1 -1
  2. package/css/giddaa.css +12 -2
  3. package/dist/accordion.d.ts +9 -10
  4. package/dist/accordion.js +41 -87
  5. package/dist/activity-timeline.d.ts +12 -16
  6. package/dist/activity-timeline.js +83 -198
  7. package/dist/alert.d.ts +8 -9
  8. package/dist/alert.js +53 -111
  9. package/dist/auth-layout.d.ts +4 -4
  10. package/dist/auth-layout.js +143 -294
  11. package/dist/avatar.d.ts +6 -6
  12. package/dist/avatar.js +49 -19
  13. package/dist/badge.d.ts +12 -14
  14. package/dist/badge.js +71 -11
  15. package/dist/bar-chart.d.ts +65 -67
  16. package/dist/bar-chart.js +232 -207
  17. package/dist/breadcrumb.d.ts +5 -5
  18. package/dist/breadcrumb.js +56 -118
  19. package/dist/bullet-chart.d.ts +41 -37
  20. package/dist/bullet-chart.js +125 -148
  21. package/dist/button-BZIeyUw6.d.ts +17 -0
  22. package/dist/button-group.d.ts +13 -16
  23. package/dist/button-group.js +39 -88
  24. package/dist/button.d.ts +2 -19
  25. package/dist/button.js +94 -13
  26. package/dist/calendar.d.ts +6 -6
  27. package/dist/calendar.js +138 -17
  28. package/dist/card.d.ts +14 -16
  29. package/dist/card.js +59 -145
  30. package/dist/carousel.d.ts +34 -35
  31. package/dist/carousel.js +335 -20
  32. package/dist/chart.d.ts +90 -63
  33. package/dist/chart.js +573 -28
  34. package/dist/checkbox.d.ts +10 -12
  35. package/dist/checkbox.js +82 -47
  36. package/dist/cn-BI_4DMBf.js +23 -0
  37. package/dist/collapsible.d.ts +7 -8
  38. package/dist/collapsible.js +22 -47
  39. package/dist/combobox.d.ts +10 -10
  40. package/dist/combobox.js +236 -44
  41. package/dist/cta.d.ts +12 -14
  42. package/dist/cta.js +175 -341
  43. package/dist/currency-selector.d.ts +31 -32
  44. package/dist/currency-selector.js +106 -184
  45. package/dist/data-table.d.ts +168 -0
  46. package/dist/data-table.js +676 -0
  47. package/dist/date-picker.d.ts +22 -23
  48. package/dist/date-picker.js +119 -192
  49. package/dist/details-card.d.ts +7 -7
  50. package/dist/details-card.js +104 -253
  51. package/dist/dialog.d.ts +13 -14
  52. package/dist/dialog.js +116 -209
  53. package/dist/dropdown-menu.d.ts +13 -13
  54. package/dist/dropdown-menu.js +180 -37
  55. package/dist/dropzone.d.ts +55 -55
  56. package/dist/dropzone.js +327 -439
  57. package/dist/editorial-card.d.ts +23 -25
  58. package/dist/editorial-card.js +129 -296
  59. package/dist/empty-state.d.ts +8 -9
  60. package/dist/empty-state.js +48 -105
  61. package/dist/field.d.ts +23 -25
  62. package/dist/field.js +110 -221
  63. package/dist/filter.d.ts +118 -0
  64. package/dist/filter.js +775 -0
  65. package/dist/footer.d.ts +8 -15
  66. package/dist/footer.js +197 -400
  67. package/dist/funnel-chart.d.ts +49 -48
  68. package/dist/funnel-chart.js +170 -189
  69. package/dist/gallery-indicator.d.ts +11 -12
  70. package/dist/gallery-indicator.js +75 -12
  71. package/dist/heatmap-chart.d.ts +47 -50
  72. package/dist/heatmap-chart.js +186 -237
  73. package/dist/infotip.d.ts +8 -9
  74. package/dist/infotip.js +33 -59
  75. package/dist/input-CfoEJ8A6.d.ts +12 -0
  76. package/dist/input-group.d.ts +16 -20
  77. package/dist/input-group.js +99 -23
  78. package/dist/input-size-context-C-SFx9sx.d.ts +10 -0
  79. package/dist/input-size-context.d.ts +2 -11
  80. package/dist/input-size-context.js +17 -9
  81. package/dist/input.d.ts +2 -13
  82. package/dist/input.js +27 -11
  83. package/dist/item.d.ts +7 -8
  84. package/dist/item.js +22 -59
  85. package/dist/kpi-card.d.ts +18 -20
  86. package/dist/kpi-card.js +84 -192
  87. package/dist/label.d.ts +6 -6
  88. package/dist/label.js +40 -8
  89. package/dist/line-chart.d.ts +200 -129
  90. package/dist/line-chart.js +330 -105
  91. package/dist/list-item.d.ts +22 -0
  92. package/dist/list-item.js +84 -0
  93. package/dist/logo.d.ts +4 -4
  94. package/dist/logo.js +92 -9
  95. package/dist/map-indicator.d.ts +7 -7
  96. package/dist/map-indicator.js +80 -106
  97. package/dist/match.d.ts +10 -11
  98. package/dist/match.js +62 -107
  99. package/dist/media-gallery-hero.d.ts +40 -42
  100. package/dist/media-gallery-hero.js +182 -343
  101. package/dist/media-player.d.ts +17 -17
  102. package/dist/media-player.js +873 -1348
  103. package/dist/multi-step-form.d.ts +56 -0
  104. package/dist/multi-step-form.js +342 -0
  105. package/dist/number-input.d.ts +34 -34
  106. package/dist/number-input.js +64 -117
  107. package/dist/page-header.d.ts +10 -11
  108. package/dist/page-header.js +34 -79
  109. package/dist/pagination.d.ts +17 -21
  110. package/dist/pagination.js +132 -207
  111. package/dist/password-input.d.ts +5 -13
  112. package/dist/password-input.js +31 -55
  113. package/dist/phone-input.d.ts +19 -20
  114. package/dist/phone-input.js +226 -344
  115. package/dist/photo-gallery.d.ts +19 -19
  116. package/dist/photo-gallery.js +313 -449
  117. package/dist/picker-lzgmsNfG.js +32 -0
  118. package/dist/pie-chart.d.ts +121 -90
  119. package/dist/pie-chart.js +183 -149
  120. package/dist/popover.d.ts +9 -9
  121. package/dist/popover.js +72 -23
  122. package/dist/price-tag.d.ts +26 -27
  123. package/dist/price-tag.js +113 -173
  124. package/dist/progress.d.ts +16 -17
  125. package/dist/progress.js +169 -24
  126. package/dist/property-listing-card.d.ts +14 -17
  127. package/dist/property-listing-card.js +102 -220
  128. package/dist/purchase-option-card.d.ts +79 -0
  129. package/dist/purchase-option-card.js +176 -0
  130. package/dist/radar-chart.d.ts +29 -31
  131. package/dist/radar-chart.js +162 -137
  132. package/dist/radio-group.d.ts +11 -13
  133. package/dist/radio-group.js +46 -60
  134. package/dist/review-block.d.ts +14 -16
  135. package/dist/review-block.js +154 -10
  136. package/dist/rich-text-editor.d.ts +30 -14
  137. package/dist/rich-text-editor.js +592 -716
  138. package/dist/scatter-chart.d.ts +45 -47
  139. package/dist/scatter-chart.js +236 -240
  140. package/dist/search-input.d.ts +8 -16
  141. package/dist/search-input.js +57 -109
  142. package/dist/select.d.ts +8 -8
  143. package/dist/select.js +144 -27
  144. package/dist/separator.d.ts +8 -9
  145. package/dist/separator.js +32 -8
  146. package/dist/sheet.d.ts +11 -11
  147. package/dist/sheet.js +103 -24
  148. package/dist/sidebar.d.ts +32 -37
  149. package/dist/sidebar.js +364 -634
  150. package/dist/size-context-D4mYvcg8.d.ts +10 -0
  151. package/dist/size-context.d.ts +2 -11
  152. package/dist/size-context.js +17 -9
  153. package/dist/skeleton.d.ts +4 -5
  154. package/dist/skeleton.js +12 -8
  155. package/dist/slider.d.ts +8 -9
  156. package/dist/slider.js +64 -135
  157. package/dist/sparkline.d.ts +68 -58
  158. package/dist/sparkline.js +315 -251
  159. package/dist/stepper.d.ts +23 -24
  160. package/dist/stepper.js +149 -246
  161. package/dist/styles.css +1004 -116
  162. package/dist/switch.d.ts +10 -12
  163. package/dist/switch.js +48 -70
  164. package/dist/table-card.d.ts +35 -0
  165. package/dist/table-card.js +125 -0
  166. package/dist/table.d.ts +18 -14
  167. package/dist/table.js +117 -154
  168. package/dist/tabs.d.ts +33 -15
  169. package/dist/tabs.js +110 -18
  170. package/dist/tag.d.ts +21 -23
  171. package/dist/tag.js +103 -159
  172. package/dist/testimonial-block.d.ts +18 -19
  173. package/dist/testimonial-block.js +189 -358
  174. package/dist/textarea-IS_D8pXf.d.ts +11 -0
  175. package/dist/textarea.d.ts +2 -12
  176. package/dist/textarea.js +24 -11
  177. package/dist/time-picker.d.ts +11 -11
  178. package/dist/time-picker.js +245 -302
  179. package/dist/toast.d.ts +16 -18
  180. package/dist/toast.js +154 -205
  181. package/dist/tooltip.d.ts +8 -9
  182. package/dist/tooltip.js +37 -12
  183. package/dist/tree-map.d.ts +59 -62
  184. package/dist/tree-map.js +226 -269
  185. package/dist/use-uncontrolled-CLfM1XbB.js +21 -0
  186. package/dist/waterfall-chart.d.ts +94 -97
  187. package/dist/waterfall-chart.js +455 -552
  188. package/package.json +36 -9
  189. package/dist/accordion.js.map +0 -1
  190. package/dist/activity-timeline.js.map +0 -1
  191. package/dist/alert.js.map +0 -1
  192. package/dist/auth-layout.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/breadcrumb.js.map +0 -1
  197. package/dist/bullet-chart.js.map +0 -1
  198. package/dist/button-group.js.map +0 -1
  199. package/dist/button.js.map +0 -1
  200. package/dist/calendar.js.map +0 -1
  201. package/dist/card.js.map +0 -1
  202. package/dist/carousel.js.map +0 -1
  203. package/dist/chart.js.map +0 -1
  204. package/dist/checkbox.js.map +0 -1
  205. package/dist/chunk-322YCNVL.js +0 -278
  206. package/dist/chunk-322YCNVL.js.map +0 -1
  207. package/dist/chunk-3ACQVT7A.js +0 -25
  208. package/dist/chunk-3ACQVT7A.js.map +0 -1
  209. package/dist/chunk-3T65TLJX.js +0 -334
  210. package/dist/chunk-3T65TLJX.js.map +0 -1
  211. package/dist/chunk-6ZSGQHH2.js +0 -192
  212. package/dist/chunk-6ZSGQHH2.js.map +0 -1
  213. package/dist/chunk-7TBMLFGW.js +0 -41
  214. package/dist/chunk-7TBMLFGW.js.map +0 -1
  215. package/dist/chunk-B4H6RNDH.js +0 -135
  216. package/dist/chunk-B4H6RNDH.js.map +0 -1
  217. package/dist/chunk-BUXCGZ6X.js +0 -219
  218. package/dist/chunk-BUXCGZ6X.js.map +0 -1
  219. package/dist/chunk-CHII2QHH.js +0 -58
  220. package/dist/chunk-CHII2QHH.js.map +0 -1
  221. package/dist/chunk-DMNOXRRW.js +0 -147
  222. package/dist/chunk-DMNOXRRW.js.map +0 -1
  223. package/dist/chunk-EFSOSSIC.js +0 -130
  224. package/dist/chunk-EFSOSSIC.js.map +0 -1
  225. package/dist/chunk-FZDSVMKY.js +0 -363
  226. package/dist/chunk-FZDSVMKY.js.map +0 -1
  227. package/dist/chunk-GJOFIJS3.js +0 -246
  228. package/dist/chunk-GJOFIJS3.js.map +0 -1
  229. package/dist/chunk-HL3ZSYES.js +0 -23
  230. package/dist/chunk-HL3ZSYES.js.map +0 -1
  231. package/dist/chunk-JVLUBAPB.js +0 -129
  232. package/dist/chunk-JVLUBAPB.js.map +0 -1
  233. package/dist/chunk-KDPYSOYZ.js +0 -64
  234. package/dist/chunk-KDPYSOYZ.js.map +0 -1
  235. package/dist/chunk-KSMDANKI.js +0 -43
  236. package/dist/chunk-KSMDANKI.js.map +0 -1
  237. package/dist/chunk-MEKCCOP5.js +0 -46
  238. package/dist/chunk-MEKCCOP5.js.map +0 -1
  239. package/dist/chunk-NOFXVRWL.js +0 -451
  240. package/dist/chunk-NOFXVRWL.js.map +0 -1
  241. package/dist/chunk-PC5MHNVA.js +0 -171
  242. package/dist/chunk-PC5MHNVA.js.map +0 -1
  243. package/dist/chunk-QKAQZ2GU.js +0 -122
  244. package/dist/chunk-QKAQZ2GU.js.map +0 -1
  245. package/dist/chunk-QZHSHSVV.js +0 -26
  246. package/dist/chunk-QZHSHSVV.js.map +0 -1
  247. package/dist/chunk-RBMK26XD.js +0 -19
  248. package/dist/chunk-RBMK26XD.js.map +0 -1
  249. package/dist/chunk-SFNJGF6M.js +0 -262
  250. package/dist/chunk-SFNJGF6M.js.map +0 -1
  251. package/dist/chunk-UJJNLGTM.js +0 -112
  252. package/dist/chunk-UJJNLGTM.js.map +0 -1
  253. package/dist/chunk-VGR4ZWJ3.js +0 -418
  254. package/dist/chunk-VGR4ZWJ3.js.map +0 -1
  255. package/dist/chunk-XG47P6D4.js +0 -99
  256. package/dist/chunk-XG47P6D4.js.map +0 -1
  257. package/dist/chunk-XZZAHNVM.js +0 -21
  258. package/dist/chunk-XZZAHNVM.js.map +0 -1
  259. package/dist/chunk-Y4TTYVNE.js +0 -36
  260. package/dist/chunk-Y4TTYVNE.js.map +0 -1
  261. package/dist/chunk-YDWIHW6Q.js +0 -69
  262. package/dist/chunk-YDWIHW6Q.js.map +0 -1
  263. package/dist/collapsible.js.map +0 -1
  264. package/dist/combobox.js.map +0 -1
  265. package/dist/cta.js.map +0 -1
  266. package/dist/currency-selector.js.map +0 -1
  267. package/dist/date-picker.js.map +0 -1
  268. package/dist/details-card.js.map +0 -1
  269. package/dist/dialog.js.map +0 -1
  270. package/dist/dropdown-menu.js.map +0 -1
  271. package/dist/dropzone.js.map +0 -1
  272. package/dist/editorial-card.js.map +0 -1
  273. package/dist/empty-state.js.map +0 -1
  274. package/dist/field.js.map +0 -1
  275. package/dist/footer.js.map +0 -1
  276. package/dist/funnel-chart.js.map +0 -1
  277. package/dist/gallery-indicator.js.map +0 -1
  278. package/dist/heatmap-chart.js.map +0 -1
  279. package/dist/infotip.js.map +0 -1
  280. package/dist/input-group.js.map +0 -1
  281. package/dist/input-size-context.js.map +0 -1
  282. package/dist/input.js.map +0 -1
  283. package/dist/item.js.map +0 -1
  284. package/dist/kpi-card.js.map +0 -1
  285. package/dist/label.js.map +0 -1
  286. package/dist/line-chart.js.map +0 -1
  287. package/dist/logo.js.map +0 -1
  288. package/dist/map-indicator.js.map +0 -1
  289. package/dist/match.js.map +0 -1
  290. package/dist/media-gallery-hero.js.map +0 -1
  291. package/dist/media-player.js.map +0 -1
  292. package/dist/number-input.js.map +0 -1
  293. package/dist/page-header.js.map +0 -1
  294. package/dist/pagination.js.map +0 -1
  295. package/dist/password-input.js.map +0 -1
  296. package/dist/phone-input.js.map +0 -1
  297. package/dist/photo-gallery.js.map +0 -1
  298. package/dist/pie-chart.js.map +0 -1
  299. package/dist/popover.js.map +0 -1
  300. package/dist/price-tag.js.map +0 -1
  301. package/dist/progress.js.map +0 -1
  302. package/dist/property-listing-card.js.map +0 -1
  303. package/dist/radar-chart.js.map +0 -1
  304. package/dist/radio-group.js.map +0 -1
  305. package/dist/review-block.js.map +0 -1
  306. package/dist/rich-text-editor.js.map +0 -1
  307. package/dist/scatter-chart.js.map +0 -1
  308. package/dist/search-input.js.map +0 -1
  309. package/dist/select.js.map +0 -1
  310. package/dist/separator.js.map +0 -1
  311. package/dist/sheet.js.map +0 -1
  312. package/dist/sidebar.js.map +0 -1
  313. package/dist/size-context.js.map +0 -1
  314. package/dist/skeleton.js.map +0 -1
  315. package/dist/slider.js.map +0 -1
  316. package/dist/sparkline.js.map +0 -1
  317. package/dist/stepper.js.map +0 -1
  318. package/dist/switch.js.map +0 -1
  319. package/dist/tab-list.d.ts +0 -38
  320. package/dist/tab-list.js +0 -123
  321. package/dist/tab-list.js.map +0 -1
  322. package/dist/table.js.map +0 -1
  323. package/dist/tabs.js.map +0 -1
  324. package/dist/tag.js.map +0 -1
  325. package/dist/testimonial-block.js.map +0 -1
  326. package/dist/textarea.js.map +0 -1
  327. package/dist/time-picker.js.map +0 -1
  328. package/dist/toast.js.map +0 -1
  329. package/dist/tooltip.js.map +0 -1
  330. package/dist/tree-map.js.map +0 -1
  331. 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 };