@wealthx/shadcn 1.0.2 → 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 (300) hide show
  1. package/.turbo/turbo-build.log +235 -138
  2. package/CHANGELOG.md +12 -0
  3. package/README.md +82 -0
  4. package/dist/{chunk-6OJF6XRN.mjs → chunk-24FUO7TD.mjs} +4 -8
  5. package/dist/{chunk-4AJ5HWHD.mjs → chunk-2I5S2AMY.mjs} +3 -3
  6. package/dist/chunk-2SF672SZ.mjs +161 -0
  7. package/dist/{chunk-GPRJQ24C.mjs → chunk-34NWQURD.mjs} +2 -2
  8. package/dist/{chunk-MQ72DIBH.mjs → chunk-3GF7OVTP.mjs} +14 -5
  9. package/dist/chunk-3WMX6KWS.mjs +245 -0
  10. package/dist/{chunk-PMKODV6M.mjs → chunk-462HMNO4.mjs} +6 -10
  11. package/dist/chunk-4CX4SBRO.mjs +153 -0
  12. package/dist/chunk-4MN6UQHG.mjs +443 -0
  13. package/dist/chunk-5QQVZTVZ.mjs +233 -0
  14. package/dist/{chunk-BGP2N52Z.mjs → chunk-66MI7Q4B.mjs} +5 -5
  15. package/dist/chunk-6FCGKSZX.mjs +268 -0
  16. package/dist/{chunk-CGOKTPXU.mjs → chunk-6JQFUE5I.mjs} +20 -23
  17. package/dist/{chunk-Z3MK2KKZ.mjs → chunk-7DHU4VGG.mjs} +7 -3
  18. package/dist/{chunk-VZ2NR7L3.mjs → chunk-7PYJD5JI.mjs} +35 -27
  19. package/dist/{chunk-JU2RUWHF.mjs → chunk-7XJHLGUV.mjs} +1 -1
  20. package/dist/{chunk-BMFN37JH.mjs → chunk-7YAU5CY6.mjs} +1 -1
  21. package/dist/chunk-A56YQQHG.mjs +402 -0
  22. package/dist/chunk-AH52LG6N.mjs +315 -0
  23. package/dist/{chunk-SLWCCURD.mjs → chunk-CLIN5525.mjs} +8 -4
  24. package/dist/{chunk-3VQNJ235.mjs → chunk-CSDO6VBW.mjs} +7 -0
  25. package/dist/chunk-D4ILTPOG.mjs +293 -0
  26. package/dist/{chunk-HS7TFG7V.mjs → chunk-D6ID6M4V.mjs} +1 -1
  27. package/dist/chunk-DOH3EHX7.mjs +378 -0
  28. package/dist/{chunk-MJIEMGRD.mjs → chunk-EFRENWEJ.mjs} +9 -17
  29. package/dist/chunk-ERGGHC2V.mjs +185 -0
  30. package/dist/{chunk-OXQQNQZI.mjs → chunk-FEZKMUCF.mjs} +10 -1
  31. package/dist/{chunk-55CEW76V.mjs → chunk-FH6QVUVZ.mjs} +1 -1
  32. package/dist/chunk-FMAXJ2SI.mjs +71 -0
  33. package/dist/chunk-FZIXGLMV.mjs +173 -0
  34. package/dist/{chunk-DS2AMHN2.mjs → chunk-GYMYRIZP.mjs} +2 -2
  35. package/dist/{chunk-KQDD5MU3.mjs → chunk-H45TKD34.mjs} +5 -5
  36. package/dist/{chunk-BBJBJSXQ.mjs → chunk-J5UICVJS.mjs} +1 -1
  37. package/dist/{chunk-RL772EH7.mjs → chunk-JHJHG4GO.mjs} +4 -12
  38. package/dist/chunk-KMCGSZTX.mjs +177 -0
  39. package/dist/{chunk-FHNT55I5.mjs → chunk-KUDCQ4FI.mjs} +4 -4
  40. package/dist/chunk-LE6YFY6D.mjs +209 -0
  41. package/dist/{chunk-HUVTPUV2.mjs → chunk-LLVQKSU3.mjs} +23 -19
  42. package/dist/{chunk-KKHTJNMM.mjs → chunk-MARPPFOJ.mjs} +8 -4
  43. package/dist/{chunk-6AFMNC42.mjs → chunk-N2PT566P.mjs} +15 -11
  44. package/dist/chunk-NLCKVHWB.mjs +161 -0
  45. package/dist/{chunk-YN5SYTOO.mjs → chunk-NQPOYKAQ.mjs} +9 -5
  46. package/dist/{chunk-ZZV5JVNW.mjs → chunk-NSLMILBT.mjs} +3 -7
  47. package/dist/chunk-NXA3CZ7A.mjs +248 -0
  48. package/dist/chunk-OGOYQ7BG.mjs +150 -0
  49. package/dist/{chunk-3NQGYJEZ.mjs → chunk-P6AM5V7O.mjs} +10 -18
  50. package/dist/{chunk-CZ3BW5GL.mjs → chunk-P76HMUI6.mjs} +5 -11
  51. package/dist/chunk-PCPLO5HT.mjs +671 -0
  52. package/dist/chunk-PG6K5XEC.mjs +475 -0
  53. package/dist/chunk-PJHPSRYD.mjs +234 -0
  54. package/dist/{chunk-DDPA2XXS.mjs → chunk-PMB3A7V3.mjs} +2 -2
  55. package/dist/chunk-PR6V5XKM.mjs +209 -0
  56. package/dist/{chunk-46OFHMQA.mjs → chunk-Q76O3RIQ.mjs} +10 -6
  57. package/dist/chunk-QVKWW6KE.mjs +272 -0
  58. package/dist/chunk-RGU7HOEC.mjs +140 -0
  59. package/dist/{chunk-JF4PHPD5.mjs → chunk-RGVKLTLH.mjs} +4 -4
  60. package/dist/{chunk-VG6UF6UT.mjs → chunk-RP3SQYA3.mjs} +2 -2
  61. package/dist/chunk-RRBS6D63.mjs +163 -0
  62. package/dist/chunk-SMQ3DG25.mjs +285 -0
  63. package/dist/chunk-SPJ5KXW7.mjs +199 -0
  64. package/dist/chunk-SYOD63OZ.mjs +225 -0
  65. package/dist/chunk-UFYSFDER.mjs +42 -0
  66. package/dist/chunk-VACKZOMY.mjs +190 -0
  67. package/dist/chunk-VLQZANBF.mjs +42 -0
  68. package/dist/chunk-WA6O6EUR.mjs +1885 -0
  69. package/dist/{chunk-E3K6O4FZ.mjs → chunk-WAZD7NFU.mjs} +5 -2
  70. package/dist/chunk-WG6JGJXB.mjs +165 -0
  71. package/dist/{chunk-I64K754C.mjs → chunk-WNGWBVLV.mjs} +2 -2
  72. package/dist/{chunk-3U7SD3MS.mjs → chunk-WOEHFRGB.mjs} +3 -3
  73. package/dist/{chunk-DKZRJOMF.mjs → chunk-XIRTEFKH.mjs} +12 -12
  74. package/dist/chunk-Y6DWJSKZ.mjs +79 -0
  75. package/dist/chunk-YKPROFLB.mjs +161 -0
  76. package/dist/{chunk-K76E2TQU.mjs → chunk-ZRO5JO3H.mjs} +107 -67
  77. package/dist/{chunk-VYMHBV6D.mjs → chunk-ZU4NV6RG.mjs} +5 -3
  78. package/dist/components/ui/accordion.js +40 -4
  79. package/dist/components/ui/accordion.mjs +2 -2
  80. package/dist/components/ui/add-column-modal.js +789 -0
  81. package/dist/components/ui/add-column-modal.mjs +17 -0
  82. package/dist/components/ui/add-lead-modal.js +647 -0
  83. package/dist/components/ui/add-lead-modal.mjs +16 -0
  84. package/dist/components/ui/ai-assistant-drawer.js +686 -0
  85. package/dist/components/ui/ai-assistant-drawer.mjs +16 -0
  86. package/dist/components/ui/alert-dialog.js +37 -5
  87. package/dist/components/ui/alert-dialog.mjs +4 -4
  88. package/dist/components/ui/alert.js +37 -11
  89. package/dist/components/ui/alert.mjs +2 -2
  90. package/dist/components/ui/avatar.js +36 -8
  91. package/dist/components/ui/avatar.mjs +2 -2
  92. package/dist/components/ui/backoffice-alert-history-chart.js +624 -0
  93. package/dist/components/ui/backoffice-alert-history-chart.mjs +16 -0
  94. package/dist/components/ui/backoffice-contact-history-chart.js +687 -0
  95. package/dist/components/ui/backoffice-contact-history-chart.mjs +16 -0
  96. package/dist/components/ui/badge.js +37 -2
  97. package/dist/components/ui/badge.mjs +2 -2
  98. package/dist/components/ui/borrowing-capacity-line-chart.js +639 -0
  99. package/dist/components/ui/borrowing-capacity-line-chart.mjs +16 -0
  100. package/dist/components/ui/button.js +35 -3
  101. package/dist/components/ui/button.mjs +2 -2
  102. package/dist/components/ui/calendar.js +43 -19
  103. package/dist/components/ui/calendar.mjs +3 -3
  104. package/dist/components/ui/card.js +40 -4
  105. package/dist/components/ui/card.mjs +2 -2
  106. package/dist/components/ui/cash-balance-line-chart.js +627 -0
  107. package/dist/components/ui/cash-balance-line-chart.mjs +16 -0
  108. package/dist/components/ui/cashflow-bar-chart.js +650 -0
  109. package/dist/components/ui/cashflow-bar-chart.mjs +16 -0
  110. package/dist/components/ui/checkbox.js +36 -5
  111. package/dist/components/ui/checkbox.mjs +2 -3
  112. package/dist/components/ui/chip.js +37 -2
  113. package/dist/components/ui/chip.mjs +3 -3
  114. package/dist/components/ui/combobox.js +280 -0
  115. package/dist/components/ui/combobox.mjs +28 -0
  116. package/dist/components/ui/data-table.js +160 -88
  117. package/dist/components/ui/data-table.mjs +10 -11
  118. package/dist/components/ui/date-picker.js +44 -20
  119. package/dist/components/ui/date-picker.mjs +6 -7
  120. package/dist/components/ui/dialog.js +44 -12
  121. package/dist/components/ui/dialog.mjs +4 -4
  122. package/dist/components/ui/drawer.js +46 -10
  123. package/dist/components/ui/drawer.mjs +3 -3
  124. package/dist/components/ui/dropdown-menu.js +40 -16
  125. package/dist/components/ui/dropdown-menu.mjs +3 -3
  126. package/dist/components/ui/empty.js +41 -5
  127. package/dist/components/ui/empty.mjs +2 -2
  128. package/dist/components/ui/expense-bar-chart.js +642 -0
  129. package/dist/components/ui/expense-bar-chart.mjs +16 -0
  130. package/dist/components/ui/field.js +53 -21
  131. package/dist/components/ui/field.mjs +4 -4
  132. package/dist/components/ui/financial-cards.js +1002 -0
  133. package/dist/components/ui/financial-cards.mjs +24 -0
  134. package/dist/components/ui/financial-drawers.js +637 -0
  135. package/dist/components/ui/financial-drawers.mjs +17 -0
  136. package/dist/components/ui/financial-primitives.js +218 -0
  137. package/dist/components/ui/financial-primitives.mjs +22 -0
  138. package/dist/components/ui/financial-sections.js +1422 -0
  139. package/dist/components/ui/financial-sections.mjs +30 -0
  140. package/dist/components/ui/form-primitives.js +682 -0
  141. package/dist/components/ui/form-primitives.mjs +19 -0
  142. package/dist/components/ui/income-bar-chart.js +641 -0
  143. package/dist/components/ui/income-bar-chart.mjs +16 -0
  144. package/dist/components/ui/input-group.js +43 -7
  145. package/dist/components/ui/input-group.mjs +5 -5
  146. package/dist/components/ui/input-otp.js +39 -3
  147. package/dist/components/ui/input-otp.mjs +2 -2
  148. package/dist/components/ui/input.js +34 -2
  149. package/dist/components/ui/input.mjs +2 -2
  150. package/dist/components/ui/kanban-column.js +1143 -0
  151. package/dist/components/ui/kanban-column.mjs +20 -0
  152. package/dist/components/ui/label.js +35 -7
  153. package/dist/components/ui/label.mjs +2 -2
  154. package/dist/components/ui/opportunity-card.js +960 -0
  155. package/dist/components/ui/opportunity-card.mjs +20 -0
  156. package/dist/components/ui/opportunity-edit-modals.js +3360 -0
  157. package/dist/components/ui/opportunity-edit-modals.mjs +37 -0
  158. package/dist/components/ui/opportunity-summary-tab.js +4365 -0
  159. package/dist/components/ui/opportunity-summary-tab.mjs +34 -0
  160. package/dist/components/ui/pagination.js +35 -3
  161. package/dist/components/ui/pagination.mjs +3 -3
  162. package/dist/components/ui/pipeline-alerts.js +103 -0
  163. package/dist/components/ui/pipeline-alerts.mjs +8 -0
  164. package/dist/components/ui/pipeline-board.js +1408 -0
  165. package/dist/components/ui/pipeline-board.mjs +24 -0
  166. package/dist/components/ui/pipeline-chart.js +216 -0
  167. package/dist/components/ui/pipeline-chart.mjs +10 -0
  168. package/dist/components/ui/pipeline-dialogs.js +1183 -0
  169. package/dist/components/ui/pipeline-dialogs.mjs +23 -0
  170. package/dist/components/ui/pipeline-primitives.js +300 -0
  171. package/dist/components/ui/pipeline-primitives.mjs +11 -0
  172. package/dist/components/ui/popover.js +45 -4
  173. package/dist/components/ui/popover.mjs +3 -3
  174. package/dist/components/ui/progress.js +33 -1
  175. package/dist/components/ui/progress.mjs +2 -2
  176. package/dist/components/ui/property-cashflow-doughnut-chart.js +523 -0
  177. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +16 -0
  178. package/dist/components/ui/property-debt-equity-doughnut-chart.js +521 -0
  179. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +16 -0
  180. package/dist/components/ui/property-mobile-estimate-line-chart.js +682 -0
  181. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +16 -0
  182. package/dist/components/ui/radio-group.js +33 -1
  183. package/dist/components/ui/radio-group.mjs +2 -2
  184. package/dist/components/ui/select.js +66 -26
  185. package/dist/components/ui/select.mjs +3 -3
  186. package/dist/components/ui/separator.js +33 -1
  187. package/dist/components/ui/separator.mjs +2 -2
  188. package/dist/components/ui/sheet.js +37 -9
  189. package/dist/components/ui/sheet.mjs +3 -3
  190. package/dist/components/ui/skeleton.js +33 -1
  191. package/dist/components/ui/skeleton.mjs +2 -2
  192. package/dist/components/ui/slider.js +86 -102
  193. package/dist/components/ui/slider.mjs +2 -2
  194. package/dist/components/ui/spinner.js +33 -1
  195. package/dist/components/ui/spinner.mjs +2 -2
  196. package/dist/components/ui/stage-timeline.js +579 -0
  197. package/dist/components/ui/stage-timeline.mjs +15 -0
  198. package/dist/components/ui/switch.js +37 -4
  199. package/dist/components/ui/switch.mjs +2 -3
  200. package/dist/components/ui/table.js +37 -5
  201. package/dist/components/ui/table.mjs +2 -2
  202. package/dist/components/ui/tabs.js +36 -12
  203. package/dist/components/ui/tabs.mjs +2 -2
  204. package/dist/components/ui/textarea.js +34 -2
  205. package/dist/components/ui/textarea.mjs +2 -2
  206. package/dist/components/ui/toggle-group.js +35 -4
  207. package/dist/components/ui/toggle-group.mjs +3 -4
  208. package/dist/components/ui/toggle.js +35 -4
  209. package/dist/components/ui/toggle.mjs +2 -3
  210. package/dist/components/ui/tooltip.js +51 -22
  211. package/dist/components/ui/tooltip.mjs +3 -3
  212. package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +528 -0
  213. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +16 -0
  214. package/dist/components/ui/transactions-income-expense-bar-chart.js +516 -0
  215. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +16 -0
  216. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +528 -0
  217. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +16 -0
  218. package/dist/index.js +11613 -2868
  219. package/dist/index.mjs +377 -164
  220. package/dist/lib/theme-provider.js +10 -1
  221. package/dist/lib/theme-provider.mjs +1 -1
  222. package/dist/lib/typography.js +8 -0
  223. package/dist/lib/typography.mjs +3 -1
  224. package/dist/lib/utils.js +33 -1
  225. package/dist/lib/utils.mjs +1 -1
  226. package/dist/styles.css +1 -1
  227. package/package.json +169 -6
  228. package/src/components/index.tsx +323 -13
  229. package/src/components/ui/accordion.tsx +6 -3
  230. package/src/components/ui/add-column-modal.tsx +339 -0
  231. package/src/components/ui/add-lead-modal.tsx +290 -0
  232. package/src/components/ui/ai-assistant-drawer.tsx +408 -0
  233. package/src/components/ui/alert-dialog.tsx +80 -54
  234. package/src/components/ui/alert.tsx +28 -28
  235. package/src/components/ui/avatar.tsx +30 -29
  236. package/src/components/ui/backoffice-alert-history-chart.tsx +260 -0
  237. package/src/components/ui/backoffice-contact-history-chart.tsx +325 -0
  238. package/src/components/ui/badge.tsx +17 -15
  239. package/src/components/ui/borrowing-capacity-line-chart.tsx +357 -0
  240. package/src/components/ui/button.tsx +30 -27
  241. package/src/components/ui/calendar.tsx +53 -67
  242. package/src/components/ui/card.tsx +27 -24
  243. package/src/components/ui/cash-balance-line-chart.tsx +302 -0
  244. package/src/components/ui/cashflow-bar-chart.tsx +363 -0
  245. package/src/components/ui/chart-shared.tsx +261 -0
  246. package/src/components/ui/checkbox.tsx +30 -26
  247. package/src/components/ui/combobox.tsx +223 -0
  248. package/src/components/ui/data-table.tsx +160 -99
  249. package/src/components/ui/date-picker.tsx +0 -2
  250. package/src/components/ui/dialog.tsx +70 -60
  251. package/src/components/ui/drawer.tsx +57 -48
  252. package/src/components/ui/dropdown-menu.tsx +90 -82
  253. package/src/components/ui/empty.tsx +31 -27
  254. package/src/components/ui/expense-bar-chart.tsx +296 -0
  255. package/src/components/ui/field.tsx +70 -62
  256. package/src/components/ui/financial-cards.tsx +830 -0
  257. package/src/components/ui/financial-drawers.tsx +339 -0
  258. package/src/components/ui/financial-primitives.tsx +331 -0
  259. package/src/components/ui/financial-sections.tsx +672 -0
  260. package/src/components/ui/form-primitives.tsx +536 -0
  261. package/src/components/ui/income-bar-chart.tsx +297 -0
  262. package/src/components/ui/input-group.tsx +41 -34
  263. package/src/components/ui/input-otp.tsx +29 -24
  264. package/src/components/ui/input.tsx +8 -8
  265. package/src/components/ui/kanban-column.tsx +333 -0
  266. package/src/components/ui/label.tsx +9 -12
  267. package/src/components/ui/opportunity-card.tsx +616 -0
  268. package/src/components/ui/opportunity-edit-modals.tsx +2528 -0
  269. package/src/components/ui/opportunity-summary-tab.tsx +579 -0
  270. package/src/components/ui/pipeline-alerts.tsx +74 -0
  271. package/src/components/ui/pipeline-board.tsx +268 -0
  272. package/src/components/ui/pipeline-chart.tsx +173 -0
  273. package/src/components/ui/pipeline-dialogs.tsx +303 -0
  274. package/src/components/ui/pipeline-primitives.tsx +108 -0
  275. package/src/components/ui/popover.tsx +41 -36
  276. package/src/components/ui/property-cashflow-doughnut-chart.tsx +188 -0
  277. package/src/components/ui/property-debt-equity-doughnut-chart.tsx +185 -0
  278. package/src/components/ui/property-mobile-estimate-line-chart.tsx +393 -0
  279. package/src/components/ui/select.tsx +65 -52
  280. package/src/components/ui/sheet.tsx +55 -52
  281. package/src/components/ui/slider.tsx +54 -77
  282. package/src/components/ui/stage-timeline.tsx +205 -0
  283. package/src/components/ui/switch.tsx +42 -29
  284. package/src/components/ui/table.tsx +28 -28
  285. package/src/components/ui/tabs.tsx +22 -28
  286. package/src/components/ui/textarea.tsx +8 -8
  287. package/src/components/ui/toggle-group.tsx +0 -2
  288. package/src/components/ui/toggle.tsx +13 -15
  289. package/src/components/ui/tooltip.tsx +30 -28
  290. package/src/components/ui/transactions-expense-categories-doughnut-chart.tsx +191 -0
  291. package/src/components/ui/transactions-income-expense-bar-chart.tsx +205 -0
  292. package/src/components/ui/transactions-liabilities-breakdown-doughnut-chart.tsx +191 -0
  293. package/src/lib/theme-provider.tsx +10 -0
  294. package/src/lib/typography.ts +9 -0
  295. package/src/lib/utils.ts +41 -3
  296. package/src/styles/globals.css +371 -124
  297. package/src/styles/styles-css.ts +1 -1
  298. package/tsup.config.ts +32 -0
  299. package/dist/chunk-K74JRTJR.mjs +0 -105
  300. package/dist/chunk-V7CNWJT3.mjs +0 -10
@@ -0,0 +1,378 @@
1
+ import {
2
+ Slider
3
+ } from "./chunk-Y6DWJSKZ.mjs";
4
+ import {
5
+ ToggleGroup,
6
+ ToggleGroupItem
7
+ } from "./chunk-PMB3A7V3.mjs";
8
+ import {
9
+ Label
10
+ } from "./chunk-NSLMILBT.mjs";
11
+ import {
12
+ Input
13
+ } from "./chunk-GYMYRIZP.mjs";
14
+ import {
15
+ cn
16
+ } from "./chunk-VLQZANBF.mjs";
17
+ import {
18
+ __spreadProps,
19
+ __spreadValues
20
+ } from "./chunk-FWCSY2DS.mjs";
21
+
22
+ // src/components/ui/form-primitives.tsx
23
+ import * as React from "react";
24
+ import { Check, Search } from "lucide-react";
25
+ import { jsx, jsxs } from "react/jsx-runtime";
26
+ function parseCurrencyToNumber(raw) {
27
+ const cleaned = raw.replace(/[^0-9.]/g, "");
28
+ const n = parseFloat(cleaned);
29
+ return isNaN(n) ? 0 : n;
30
+ }
31
+ function formatNumberToCurrency(n) {
32
+ return "$" + Math.round(n).toLocaleString("en-AU");
33
+ }
34
+ function CurrencyInputWithSlider({
35
+ value: controlledValue,
36
+ defaultValue = 0,
37
+ min = 0,
38
+ max = 5e6,
39
+ step = 1e4,
40
+ disabled = false,
41
+ onValueChange,
42
+ className
43
+ }) {
44
+ const [internalValue, setInternalValue] = React.useState(defaultValue);
45
+ const numericValue = controlledValue !== void 0 ? controlledValue : internalValue;
46
+ const [inputText, setInputText] = React.useState(
47
+ formatNumberToCurrency(numericValue)
48
+ );
49
+ const [isFocused, setIsFocused] = React.useState(false);
50
+ React.useEffect(() => {
51
+ if (!isFocused) {
52
+ setInputText(formatNumberToCurrency(numericValue));
53
+ }
54
+ }, [numericValue, isFocused]);
55
+ const commitValue = (n) => {
56
+ const clamped = Math.max(min, Math.min(max, n));
57
+ if (controlledValue === void 0) setInternalValue(clamped);
58
+ onValueChange == null ? void 0 : onValueChange(clamped);
59
+ setInputText(formatNumberToCurrency(clamped));
60
+ };
61
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-3", className), children: [
62
+ /* @__PURE__ */ jsx(
63
+ Input,
64
+ {
65
+ type: "text",
66
+ value: isFocused ? inputText : formatNumberToCurrency(numericValue),
67
+ disabled,
68
+ onFocus: () => {
69
+ setIsFocused(true);
70
+ setInputText(formatNumberToCurrency(numericValue));
71
+ },
72
+ onChange: (e) => setInputText(e.target.value),
73
+ onBlur: () => {
74
+ setIsFocused(false);
75
+ commitValue(parseCurrencyToNumber(inputText));
76
+ },
77
+ onKeyDown: (e) => {
78
+ if (e.key === "Enter") {
79
+ e.target.blur();
80
+ }
81
+ },
82
+ className: "tabular-nums",
83
+ "aria-label": "Currency amount"
84
+ }
85
+ ),
86
+ /* @__PURE__ */ jsx(
87
+ Slider,
88
+ {
89
+ value: numericValue,
90
+ min,
91
+ max,
92
+ step,
93
+ disabled,
94
+ onValueChange: (n) => {
95
+ if (controlledValue === void 0) setInternalValue(n);
96
+ onValueChange == null ? void 0 : onValueChange(n);
97
+ }
98
+ }
99
+ )
100
+ ] });
101
+ }
102
+ var CONCERN_LABELS = {
103
+ 1: "Not important",
104
+ 2: "Slightly important",
105
+ 3: "Moderately important",
106
+ 4: "Very important",
107
+ 5: "Critical"
108
+ };
109
+ function ConcernScale({
110
+ value: controlledValue,
111
+ defaultValue = 0,
112
+ disabled = false,
113
+ steps = 5,
114
+ lowLabel = "Not important",
115
+ highLabel = "Critical",
116
+ onValueChange,
117
+ className
118
+ }) {
119
+ var _a;
120
+ const [internalValue, setInternalValue] = React.useState(defaultValue);
121
+ const selected = controlledValue !== void 0 ? controlledValue : internalValue;
122
+ const handleValueChange = (val) => {
123
+ const n = val ? Number(val) : 0;
124
+ if (controlledValue === void 0) setInternalValue(n);
125
+ onValueChange == null ? void 0 : onValueChange(n);
126
+ };
127
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2", className), children: [
128
+ /* @__PURE__ */ jsx(
129
+ ToggleGroup,
130
+ {
131
+ type: "single",
132
+ value: selected > 0 ? String(selected) : "",
133
+ onValueChange: handleValueChange,
134
+ variant: "outline",
135
+ size: "sm",
136
+ disabled,
137
+ className: "w-full",
138
+ children: Array.from({ length: steps }, (_, i) => i + 1).map((n) => {
139
+ var _a2;
140
+ return /* @__PURE__ */ jsx(
141
+ ToggleGroupItem,
142
+ {
143
+ value: String(n),
144
+ "aria-label": (_a2 = CONCERN_LABELS[n]) != null ? _a2 : String(n),
145
+ className: "flex-1",
146
+ children: n
147
+ },
148
+ n
149
+ );
150
+ })
151
+ }
152
+ ),
153
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-[10px] text-muted-foreground", children: [
154
+ /* @__PURE__ */ jsx("span", { children: lowLabel }),
155
+ /* @__PURE__ */ jsx("span", { children: highLabel })
156
+ ] }),
157
+ selected > 0 && /* @__PURE__ */ jsx("p", { className: "text-xs text-foreground", children: (_a = CONCERN_LABELS[selected]) != null ? _a : `Level ${selected}` })
158
+ ] });
159
+ }
160
+ var DEFAULT_SUGGESTIONS = [
161
+ {
162
+ id: "1",
163
+ label: "12 Harbour View Terrace, Mosman NSW 2088",
164
+ suburb: "Mosman",
165
+ state: "NSW",
166
+ postcode: "2088"
167
+ },
168
+ {
169
+ id: "2",
170
+ label: "5 Coastal Road, Manly NSW 2095",
171
+ suburb: "Manly",
172
+ state: "NSW",
173
+ postcode: "2095"
174
+ },
175
+ {
176
+ id: "3",
177
+ label: "24 Collins Street, Melbourne VIC 3000",
178
+ suburb: "Melbourne",
179
+ state: "VIC",
180
+ postcode: "3000"
181
+ },
182
+ {
183
+ id: "4",
184
+ label: "88 Pacific Highway, St Leonards NSW 2065",
185
+ suburb: "St Leonards",
186
+ state: "NSW",
187
+ postcode: "2065"
188
+ },
189
+ {
190
+ id: "5",
191
+ label: "1 Queen Street, Brisbane QLD 4000",
192
+ suburb: "Brisbane",
193
+ state: "QLD",
194
+ postcode: "4000"
195
+ }
196
+ ];
197
+ function AddressAutocomplete({
198
+ value: controlledValue,
199
+ placeholder = "Start typing an address\u2026",
200
+ suggestions = DEFAULT_SUGGESTIONS,
201
+ disabled = false,
202
+ onValueChange,
203
+ onSelect,
204
+ className
205
+ }) {
206
+ const [internalValue, setInternalValue] = React.useState("");
207
+ const inputValue = controlledValue !== void 0 ? controlledValue : internalValue;
208
+ const [open, setOpen] = React.useState(false);
209
+ const [activeIndex, setActiveIndex] = React.useState(-1);
210
+ const containerRef = React.useRef(null);
211
+ const listRef = React.useRef(null);
212
+ const filtered = React.useMemo(() => {
213
+ if (!inputValue.trim()) return suggestions.slice(0, 5);
214
+ const q = inputValue.toLowerCase();
215
+ return suggestions.filter((s) => s.label.toLowerCase().includes(q)).slice(0, 5);
216
+ }, [inputValue, suggestions]);
217
+ const setValue = (v) => {
218
+ if (controlledValue === void 0) setInternalValue(v);
219
+ onValueChange == null ? void 0 : onValueChange(v);
220
+ };
221
+ const handleSelect = (opt) => {
222
+ setValue(opt.label);
223
+ onSelect == null ? void 0 : onSelect(opt);
224
+ setOpen(false);
225
+ setActiveIndex(-1);
226
+ };
227
+ const handleKeyDown = (e) => {
228
+ if (!open) return;
229
+ if (e.key === "ArrowDown") {
230
+ e.preventDefault();
231
+ setActiveIndex((i) => Math.min(i + 1, filtered.length - 1));
232
+ } else if (e.key === "ArrowUp") {
233
+ e.preventDefault();
234
+ setActiveIndex((i) => Math.max(i - 1, -1));
235
+ } else if (e.key === "Enter" && activeIndex >= 0) {
236
+ e.preventDefault();
237
+ handleSelect(filtered[activeIndex]);
238
+ } else if (e.key === "Escape") {
239
+ setOpen(false);
240
+ }
241
+ };
242
+ React.useEffect(() => {
243
+ const handler = (e) => {
244
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
245
+ setOpen(false);
246
+ }
247
+ };
248
+ document.addEventListener("mousedown", handler);
249
+ return () => document.removeEventListener("mousedown", handler);
250
+ }, []);
251
+ return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("relative", className), children: [
252
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
253
+ /* @__PURE__ */ jsx(Search, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none" }),
254
+ /* @__PURE__ */ jsx(
255
+ Input,
256
+ {
257
+ type: "text",
258
+ value: inputValue,
259
+ placeholder,
260
+ disabled,
261
+ className: "pl-8",
262
+ onChange: (e) => {
263
+ setValue(e.target.value);
264
+ setOpen(true);
265
+ setActiveIndex(-1);
266
+ },
267
+ onFocus: () => setOpen(true),
268
+ onKeyDown: handleKeyDown,
269
+ "aria-autocomplete": "list",
270
+ "aria-expanded": open
271
+ }
272
+ )
273
+ ] }),
274
+ open && filtered.length > 0 && /* @__PURE__ */ jsx(
275
+ "ul",
276
+ {
277
+ ref: listRef,
278
+ role: "listbox",
279
+ className: cn(
280
+ "absolute z-50 top-full left-0 right-0 mt-1",
281
+ "border border-border bg-popover shadow-md",
282
+ "max-h-48 overflow-y-auto py-1"
283
+ ),
284
+ children: filtered.map((opt, idx) => /* @__PURE__ */ jsxs(
285
+ "li",
286
+ {
287
+ role: "option",
288
+ "aria-selected": idx === activeIndex,
289
+ onMouseEnter: () => setActiveIndex(idx),
290
+ onMouseDown: (e) => {
291
+ e.preventDefault();
292
+ handleSelect(opt);
293
+ },
294
+ className: cn(
295
+ "flex items-center gap-2 px-3 py-2 text-sm cursor-pointer",
296
+ idx === activeIndex ? "bg-accent text-accent-foreground" : "hover:bg-accent/50"
297
+ ),
298
+ children: [
299
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate", children: opt.label }),
300
+ idx === activeIndex && /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5 shrink-0 text-primary" })
301
+ ]
302
+ },
303
+ opt.id
304
+ ))
305
+ }
306
+ )
307
+ ] });
308
+ }
309
+ var DEFAULT_OWNERS = [
310
+ { id: "main", name: "Main Applicant", share: 50 },
311
+ { id: "co", name: "Co-Applicant", share: 50 }
312
+ ];
313
+ function OwnershipSplit({
314
+ owners: controlledOwners,
315
+ disabled = false,
316
+ onOwnersChange,
317
+ className
318
+ }) {
319
+ const [internalOwners, setInternalOwners] = React.useState(DEFAULT_OWNERS);
320
+ const owners = controlledOwners !== void 0 ? controlledOwners : internalOwners;
321
+ const setOwners = (updated) => {
322
+ if (controlledOwners === void 0) setInternalOwners(updated);
323
+ onOwnersChange == null ? void 0 : onOwnersChange(updated);
324
+ };
325
+ const handleSliderChange = (id, newShare) => {
326
+ if (owners.length !== 2) return;
327
+ const clamped = Math.max(0, Math.min(100, Math.round(newShare)));
328
+ const other = owners.find((o) => o.id !== id);
329
+ if (!other) return;
330
+ setOwners(
331
+ owners.map(
332
+ (o) => o.id === id ? __spreadProps(__spreadValues({}, o), { share: clamped }) : __spreadProps(__spreadValues({}, o), { share: 100 - clamped })
333
+ )
334
+ );
335
+ };
336
+ const handleInputChange = (id, raw) => {
337
+ const n = parseInt(raw.replace(/[^0-9]/g, ""), 10);
338
+ if (isNaN(n)) return;
339
+ handleSliderChange(id, n);
340
+ };
341
+ return /* @__PURE__ */ jsx("div", { className: cn("flex gap-4", className), children: owners.map((owner) => {
342
+ const pct = Math.max(0, Math.min(100, owner.share));
343
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 flex-1", children: [
344
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
345
+ /* @__PURE__ */ jsx(Label, { className: "text-xs font-medium", children: owner.name }),
346
+ /* @__PURE__ */ jsx(
347
+ Input,
348
+ {
349
+ type: "text",
350
+ value: `${pct}%`,
351
+ disabled,
352
+ className: "w-14 h-7 text-xs text-right tabular-nums px-2",
353
+ onChange: (e) => handleInputChange(owner.id, e.target.value),
354
+ onBlur: (e) => handleInputChange(owner.id, e.target.value)
355
+ }
356
+ )
357
+ ] }),
358
+ /* @__PURE__ */ jsx(
359
+ Slider,
360
+ {
361
+ value: pct,
362
+ min: 0,
363
+ max: 100,
364
+ step: 1,
365
+ disabled,
366
+ onValueChange: (n) => handleSliderChange(owner.id, n)
367
+ }
368
+ )
369
+ ] }, owner.id);
370
+ }) });
371
+ }
372
+
373
+ export {
374
+ CurrencyInputWithSlider,
375
+ ConcernScale,
376
+ AddressAutocomplete,
377
+ OwnershipSplit
378
+ };
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  useThemeVars
3
- } from "./chunk-OXQQNQZI.mjs";
3
+ } from "./chunk-FEZKMUCF.mjs";
4
4
  import {
5
5
  cn
6
- } from "./chunk-V7CNWJT3.mjs";
6
+ } from "./chunk-VLQZANBF.mjs";
7
7
  import {
8
8
  __objRest,
9
9
  __spreadProps,
@@ -24,12 +24,7 @@ function DropdownMenuPortal(_a) {
24
24
  }
25
25
  function DropdownMenuTrigger(_a) {
26
26
  var props = __objRest(_a, []);
27
- return /* @__PURE__ */ jsx(
28
- MenuPrimitive.Trigger,
29
- __spreadValues({
30
- "data-slot": "dropdown-menu-trigger"
31
- }, props)
32
- );
27
+ return /* @__PURE__ */ jsx(MenuPrimitive.Trigger, __spreadValues({ "data-slot": "dropdown-menu-trigger" }, props));
33
28
  }
34
29
  function DropdownMenuContent(_a) {
35
30
  var _b = _a, {
@@ -72,7 +67,7 @@ function DropdownMenuItem(_a) {
72
67
  MenuPrimitive.Item,
73
68
  __spreadValues({
74
69
  className: cn(
75
- "relative flex cursor-default items-center gap-2 rounded-none px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 data-inset:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!",
70
+ "relative flex cursor-default items-center gap-2 rounded-none px-2 py-1.5 text-body-small outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 data-inset:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!",
76
71
  className
77
72
  ),
78
73
  "data-inset": inset,
@@ -96,7 +91,7 @@ function DropdownMenuCheckboxItem(_a) {
96
91
  __spreadProps(__spreadValues({
97
92
  checked,
98
93
  className: cn(
99
- "relative flex cursor-default items-center gap-2 rounded-none py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 data-checked:bg-primary/10 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
94
+ "relative flex cursor-default items-center gap-2 rounded-none py-1.5 pr-2 pl-8 text-body-small outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 data-checked:bg-primary/10 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
100
95
  className
101
96
  ),
102
97
  "data-slot": "dropdown-menu-checkbox-item"
@@ -129,7 +124,7 @@ function DropdownMenuRadioItem(_a) {
129
124
  MenuPrimitive.RadioItem,
130
125
  __spreadProps(__spreadValues({
131
126
  className: cn(
132
- "relative flex cursor-default items-center gap-2 rounded-none py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 data-checked:bg-primary/10 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
127
+ "relative flex cursor-default items-center gap-2 rounded-none py-1.5 pr-2 pl-8 text-body-small outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 data-checked:bg-primary/10 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
133
128
  className
134
129
  ),
135
130
  "data-slot": "dropdown-menu-radio-item"
@@ -152,10 +147,7 @@ function DropdownMenuLabel(_a) {
152
147
  return /* @__PURE__ */ jsx(
153
148
  MenuPrimitive.GroupLabel,
154
149
  __spreadValues({
155
- className: cn(
156
- "px-2 py-1.5 text-sm font-medium data-inset:pl-8",
157
- className
158
- ),
150
+ className: cn("px-2 py-1.5 text-label-medium data-inset:pl-8", className),
159
151
  "data-inset": inset,
160
152
  "data-slot": "dropdown-menu-label"
161
153
  }, props)
@@ -185,7 +177,7 @@ function DropdownMenuShortcut(_a) {
185
177
  "span",
186
178
  __spreadValues({
187
179
  className: cn(
188
- "ml-auto text-xs tracking-widest text-muted-foreground",
180
+ "ml-auto text-caption tracking-widest text-muted-foreground",
189
181
  className
190
182
  ),
191
183
  "data-slot": "dropdown-menu-shortcut"
@@ -210,7 +202,7 @@ function DropdownMenuSubTrigger(_a) {
210
202
  MenuPrimitive.SubmenuTrigger,
211
203
  __spreadProps(__spreadValues({
212
204
  className: cn(
213
- "flex cursor-default items-center gap-2 rounded-none px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
205
+ "flex cursor-default items-center gap-2 rounded-none px-2 py-1.5 text-body-small outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
214
206
  className
215
207
  ),
216
208
  "data-inset": inset,
@@ -0,0 +1,185 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-VLQZANBF.mjs";
4
+ import {
5
+ __objRest,
6
+ __spreadProps,
7
+ __spreadValues
8
+ } from "./chunk-FWCSY2DS.mjs";
9
+
10
+ // src/components/ui/combobox.tsx
11
+ import { CheckIcon, ChevronDownIcon, SearchIcon } from "lucide-react";
12
+ import { Combobox as ComboboxPrimitive } from "@base-ui/react/combobox";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ function Combobox(_a) {
15
+ var props = __objRest(_a, []);
16
+ return /* @__PURE__ */ jsx(ComboboxPrimitive.Root, __spreadValues({ "data-slot": "combobox" }, props));
17
+ }
18
+ function ComboboxTrigger(_a) {
19
+ var _b = _a, {
20
+ className,
21
+ size = "default",
22
+ children
23
+ } = _b, props = __objRest(_b, [
24
+ "className",
25
+ "size",
26
+ "children"
27
+ ]);
28
+ return /* @__PURE__ */ jsxs(
29
+ ComboboxPrimitive.Trigger,
30
+ __spreadProps(__spreadValues({
31
+ "data-slot": "combobox-trigger",
32
+ "data-size": size,
33
+ className: cn(
34
+ "flex w-fit items-center justify-between gap-2 border border-input bg-transparent px-3 py-2 text-body-small whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20 data-[popup-open]:border-primary data-[popup-open]:ring-[3px] data-[popup-open]:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:font-normal data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=combobox-value]:line-clamp-1 *:data-[slot=combobox-value]:flex *:data-[slot=combobox-value]:items-center *:data-[slot=combobox-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
35
+ className
36
+ )
37
+ }, props), {
38
+ children: [
39
+ children,
40
+ /* @__PURE__ */ jsx(ComboboxPrimitive.Icon, { className: "transition-transform duration-200 data-[popup-open]:rotate-180", children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4 opacity-50" }) })
41
+ ]
42
+ })
43
+ );
44
+ }
45
+ function ComboboxValue(_a) {
46
+ var props = __objRest(_a, []);
47
+ return /* @__PURE__ */ jsx(ComboboxPrimitive.Value, __spreadValues({ "data-slot": "combobox-value" }, props));
48
+ }
49
+ function ComboboxInput(_a) {
50
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
51
+ return /* @__PURE__ */ jsxs(
52
+ "div",
53
+ {
54
+ "data-slot": "combobox-input-wrapper",
55
+ className: "flex items-center gap-2 border-b border-border px-3",
56
+ children: [
57
+ /* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 text-muted-foreground" }),
58
+ /* @__PURE__ */ jsx(
59
+ ComboboxPrimitive.Input,
60
+ __spreadValues({
61
+ "data-slot": "combobox-input",
62
+ className: cn(
63
+ "h-9 w-full min-w-0 bg-transparent py-1 text-body-small outline-none placeholder:font-normal placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
64
+ className
65
+ )
66
+ }, props)
67
+ )
68
+ ]
69
+ }
70
+ );
71
+ }
72
+ function ComboboxContent(_a) {
73
+ var _b = _a, {
74
+ className,
75
+ children
76
+ } = _b, props = __objRest(_b, [
77
+ "className",
78
+ "children"
79
+ ]);
80
+ return /* @__PURE__ */ jsx(ComboboxPrimitive.Portal, { children: /* @__PURE__ */ jsx(ComboboxPrimitive.Positioner, { sideOffset: 4, align: "start", children: /* @__PURE__ */ jsx(
81
+ ComboboxPrimitive.Popup,
82
+ __spreadProps(__spreadValues({
83
+ "data-slot": "combobox-content",
84
+ className: cn(
85
+ "relative z-50 max-h-[var(--available-height)] min-w-[8rem] overflow-hidden border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[ending-style]:animate-out data-[ending-style]:fade-out-0 data-[ending-style]:zoom-out-95 data-[open]:animate-in data-[open]:fade-in-0 data-[open]:zoom-in-95",
86
+ className
87
+ )
88
+ }, props), {
89
+ children
90
+ })
91
+ ) }) });
92
+ }
93
+ function ComboboxList(_a) {
94
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
95
+ return /* @__PURE__ */ jsx(
96
+ ComboboxPrimitive.List,
97
+ __spreadValues({
98
+ "data-slot": "combobox-list",
99
+ className: cn(
100
+ "max-h-[min(var(--available-height),18rem)] overflow-y-auto p-1",
101
+ className
102
+ )
103
+ }, props)
104
+ );
105
+ }
106
+ function ComboboxItem(_a) {
107
+ var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
108
+ return /* @__PURE__ */ jsxs(
109
+ ComboboxPrimitive.Item,
110
+ __spreadProps(__spreadValues({
111
+ "data-slot": "combobox-item",
112
+ className: cn(
113
+ "relative flex w-full cursor-default items-center gap-2 py-1.5 pr-8 pl-2 text-body-small outline-hidden select-none data-highlighted:bg-primary/5 data-highlighted:text-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
114
+ className
115
+ )
116
+ }, props), {
117
+ children: [
118
+ /* @__PURE__ */ jsx(
119
+ "span",
120
+ {
121
+ "data-slot": "combobox-item-indicator",
122
+ className: "absolute right-2 flex size-3.5 items-center justify-center",
123
+ children: /* @__PURE__ */ jsx(ComboboxPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) })
124
+ }
125
+ ),
126
+ children
127
+ ]
128
+ })
129
+ );
130
+ }
131
+ function ComboboxEmpty(_a) {
132
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
133
+ return /* @__PURE__ */ jsx(
134
+ ComboboxPrimitive.Empty,
135
+ __spreadValues({
136
+ "data-slot": "combobox-empty",
137
+ className: cn(
138
+ "text-body-small py-6 text-center text-muted-foreground empty:hidden",
139
+ className
140
+ )
141
+ }, props)
142
+ );
143
+ }
144
+ function ComboboxGroup(_a) {
145
+ var props = __objRest(_a, []);
146
+ return /* @__PURE__ */ jsx(ComboboxPrimitive.Group, __spreadValues({ "data-slot": "combobox-group" }, props));
147
+ }
148
+ function ComboboxGroupLabel(_a) {
149
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
150
+ return /* @__PURE__ */ jsx(
151
+ ComboboxPrimitive.GroupLabel,
152
+ __spreadValues({
153
+ "data-slot": "combobox-group-label",
154
+ className: cn(
155
+ "text-label-small px-2 py-1.5 uppercase text-muted-foreground",
156
+ className
157
+ )
158
+ }, props)
159
+ );
160
+ }
161
+ function ComboboxSeparator(_a) {
162
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
163
+ return /* @__PURE__ */ jsx(
164
+ "div",
165
+ __spreadValues({
166
+ role: "separator",
167
+ "data-slot": "combobox-separator",
168
+ className: cn("pointer-events-none -mx-1 my-1 h-px bg-border", className)
169
+ }, props)
170
+ );
171
+ }
172
+
173
+ export {
174
+ Combobox,
175
+ ComboboxTrigger,
176
+ ComboboxValue,
177
+ ComboboxInput,
178
+ ComboboxContent,
179
+ ComboboxList,
180
+ ComboboxItem,
181
+ ComboboxEmpty,
182
+ ComboboxGroup,
183
+ ComboboxGroupLabel,
184
+ ComboboxSeparator
185
+ };
@@ -43,7 +43,16 @@ function ThemeProvider({
43
43
  "--font-family-sans": fontFamily,
44
44
  // Legacy compat (used by existing WealthX apps)
45
45
  "--theme-primary": primary,
46
- "--theme-secondary": secondary
46
+ "--theme-secondary": secondary,
47
+ // Pipeline stage palette — 5 opacity levels of primary, tenant-adaptive.
48
+ // Defined here (not :root) so they react to tenant theme switches.
49
+ "--color-stage-1": primaryOklch,
50
+ "--color-stage-2": `color-mix(in oklch, ${primaryOklch} 80%, transparent)`,
51
+ "--color-stage-3": `color-mix(in oklch, ${primaryOklch} 60%, transparent)`,
52
+ "--color-stage-4": `color-mix(in oklch, ${primaryOklch} 40%, transparent)`,
53
+ "--color-stage-5": `color-mix(in oklch, ${primaryOklch} 20%, transparent)`,
54
+ // WCAG-computed contrast text for any primary-shaded background
55
+ "--color-stage-fg": primaryFgOklch
47
56
  };
48
57
  }, [primary, secondary, fontFamily, injectCssVariables]);
49
58
  return /* @__PURE__ */ jsx(ThemeVarsContext.Provider, { value: vars, children: /* @__PURE__ */ jsx("div", { "data-wealthx-theme": true, style: vars, children }) });
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-V7CNWJT3.mjs";
3
+ } from "./chunk-VLQZANBF.mjs";
4
4
  import {
5
5
  __objRest,
6
6
  __spreadValues