@wealthx/shadcn 1.1.0 → 1.2.1

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 -154
  2. package/CHANGELOG.md +12 -0
  3. package/dist/{chunk-6OJF6XRN.mjs → chunk-24FUO7TD.mjs} +4 -8
  4. package/dist/{chunk-4AJ5HWHD.mjs → chunk-2I5S2AMY.mjs} +3 -3
  5. package/dist/{chunk-GPRJQ24C.mjs → chunk-34NWQURD.mjs} +2 -2
  6. package/dist/{chunk-MQ72DIBH.mjs → chunk-3GF7OVTP.mjs} +14 -5
  7. package/dist/chunk-3WMX6KWS.mjs +245 -0
  8. package/dist/{chunk-PMKODV6M.mjs → chunk-462HMNO4.mjs} +6 -10
  9. package/dist/chunk-4CX4SBRO.mjs +153 -0
  10. package/dist/chunk-4MN6UQHG.mjs +443 -0
  11. package/dist/chunk-4Y6R4WEC.mjs +250 -0
  12. package/dist/{chunk-BGP2N52Z.mjs → chunk-66MI7Q4B.mjs} +5 -5
  13. package/dist/{chunk-CGOKTPXU.mjs → chunk-6JQFUE5I.mjs} +20 -23
  14. package/dist/{chunk-Z3MK2KKZ.mjs → chunk-7DHU4VGG.mjs} +7 -3
  15. package/dist/chunk-7MMXNK3C.mjs +317 -0
  16. package/dist/{chunk-VZ2NR7L3.mjs → chunk-7PYJD5JI.mjs} +35 -27
  17. package/dist/{chunk-JU2RUWHF.mjs → chunk-7XJHLGUV.mjs} +1 -1
  18. package/dist/{chunk-BMFN37JH.mjs → chunk-7YAU5CY6.mjs} +1 -1
  19. package/dist/chunk-A56YQQHG.mjs +402 -0
  20. package/dist/{chunk-GLW2UO6O.mjs → chunk-BL3DXM2X.mjs} +84 -62
  21. package/dist/{chunk-SLWCCURD.mjs → chunk-CLIN5525.mjs} +8 -4
  22. package/dist/{chunk-3VQNJ235.mjs → chunk-CSDO6VBW.mjs} +7 -0
  23. package/dist/chunk-D4ILTPOG.mjs +293 -0
  24. package/dist/{chunk-HS7TFG7V.mjs → chunk-D6ID6M4V.mjs} +1 -1
  25. package/dist/chunk-DOH3EHX7.mjs +378 -0
  26. package/dist/{chunk-MJIEMGRD.mjs → chunk-EFRENWEJ.mjs} +9 -17
  27. package/dist/{chunk-YBXCIF5Q.mjs → chunk-ERGGHC2V.mjs} +36 -49
  28. package/dist/{chunk-OXQQNQZI.mjs → chunk-FEZKMUCF.mjs} +10 -1
  29. package/dist/{chunk-55CEW76V.mjs → chunk-FH6QVUVZ.mjs} +1 -1
  30. package/dist/chunk-FMAXJ2SI.mjs +71 -0
  31. package/dist/chunk-FZIXGLMV.mjs +173 -0
  32. package/dist/chunk-GGM2UYGG.mjs +273 -0
  33. package/dist/{chunk-DS2AMHN2.mjs → chunk-GYMYRIZP.mjs} +2 -2
  34. package/dist/{chunk-KQDD5MU3.mjs → chunk-H45TKD34.mjs} +5 -5
  35. package/dist/{chunk-BBJBJSXQ.mjs → chunk-J5UICVJS.mjs} +1 -1
  36. package/dist/{chunk-RL772EH7.mjs → chunk-JHJHG4GO.mjs} +4 -12
  37. package/dist/{chunk-RN67642N.mjs → chunk-JNQORUPP.mjs} +49 -42
  38. package/dist/{chunk-5JGQAAQV.mjs → chunk-K3JYD4IU.mjs} +86 -63
  39. package/dist/{chunk-FHNT55I5.mjs → chunk-KUDCQ4FI.mjs} +4 -4
  40. package/dist/{chunk-UEL4RD5P.mjs → chunk-LHYCMLVA.mjs} +82 -68
  41. package/dist/{chunk-NLLKTU4B.mjs → chunk-LLVQKSU3.mjs} +21 -17
  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-YN5SYTOO.mjs → chunk-NQPOYKAQ.mjs} +9 -5
  45. package/dist/{chunk-ZZV5JVNW.mjs → chunk-NSLMILBT.mjs} +3 -7
  46. package/dist/chunk-OGOYQ7BG.mjs +150 -0
  47. package/dist/chunk-OPNQAVVH.mjs +162 -0
  48. package/dist/{chunk-3NQGYJEZ.mjs → chunk-P6AM5V7O.mjs} +10 -18
  49. package/dist/{chunk-CZ3BW5GL.mjs → chunk-P76HMUI6.mjs} +5 -11
  50. package/dist/chunk-PCPLO5HT.mjs +671 -0
  51. package/dist/chunk-PG6K5XEC.mjs +475 -0
  52. package/dist/{chunk-DDPA2XXS.mjs → chunk-PMB3A7V3.mjs} +2 -2
  53. package/dist/chunk-PR6V5XKM.mjs +209 -0
  54. package/dist/{chunk-46OFHMQA.mjs → chunk-Q76O3RIQ.mjs} +10 -6
  55. package/dist/chunk-RGU7HOEC.mjs +140 -0
  56. package/dist/{chunk-JF4PHPD5.mjs → chunk-RGVKLTLH.mjs} +4 -4
  57. package/dist/{chunk-VG6UF6UT.mjs → chunk-RP3SQYA3.mjs} +2 -2
  58. package/dist/chunk-RYCLWMZ7.mjs +162 -0
  59. package/dist/chunk-SIZMLSRU.mjs +162 -0
  60. package/dist/chunk-SPJ5KXW7.mjs +199 -0
  61. package/dist/chunk-SWGT756Z.mjs +210 -0
  62. package/dist/chunk-SYOD63OZ.mjs +225 -0
  63. package/dist/chunk-TS2ZX2VS.mjs +270 -0
  64. package/dist/chunk-UFYSFDER.mjs +42 -0
  65. package/dist/chunk-VACKZOMY.mjs +190 -0
  66. package/dist/chunk-VLQZANBF.mjs +42 -0
  67. package/dist/chunk-VPBN3WOO.mjs +164 -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-CJ46PDXE.mjs → chunk-ZRO5JO3H.mjs} +106 -66
  76. package/dist/{chunk-VYMHBV6D.mjs → chunk-ZU4NV6RG.mjs} +5 -3
  77. package/dist/components/ui/accordion.js +40 -4
  78. package/dist/components/ui/accordion.mjs +2 -2
  79. package/dist/components/ui/add-column-modal.js +789 -0
  80. package/dist/components/ui/add-column-modal.mjs +17 -0
  81. package/dist/components/ui/add-lead-modal.js +647 -0
  82. package/dist/components/ui/add-lead-modal.mjs +16 -0
  83. package/dist/components/ui/ai-assistant-drawer.js +686 -0
  84. package/dist/components/ui/ai-assistant-drawer.mjs +16 -0
  85. package/dist/components/ui/alert-dialog.js +37 -5
  86. package/dist/components/ui/alert-dialog.mjs +4 -4
  87. package/dist/components/ui/alert.js +37 -11
  88. package/dist/components/ui/alert.mjs +2 -2
  89. package/dist/components/ui/avatar.js +36 -8
  90. package/dist/components/ui/avatar.mjs +2 -2
  91. package/dist/components/ui/backoffice-alert-history-chart.js +624 -0
  92. package/dist/components/ui/backoffice-alert-history-chart.mjs +16 -0
  93. package/dist/components/ui/backoffice-contact-history-chart.js +687 -0
  94. package/dist/components/ui/backoffice-contact-history-chart.mjs +16 -0
  95. package/dist/components/ui/badge.js +37 -2
  96. package/dist/components/ui/badge.mjs +2 -2
  97. package/dist/components/ui/borrowing-capacity-line-chart.js +640 -0
  98. package/dist/components/ui/borrowing-capacity-line-chart.mjs +16 -0
  99. package/dist/components/ui/button.js +35 -3
  100. package/dist/components/ui/button.mjs +2 -2
  101. package/dist/components/ui/calendar.js +43 -19
  102. package/dist/components/ui/calendar.mjs +3 -3
  103. package/dist/components/ui/card.js +40 -4
  104. package/dist/components/ui/card.mjs +2 -2
  105. package/dist/components/ui/cash-balance-line-chart.js +628 -0
  106. package/dist/components/ui/cash-balance-line-chart.mjs +16 -0
  107. package/dist/components/ui/cashflow-bar-chart.js +124 -70
  108. package/dist/components/ui/cashflow-bar-chart.mjs +8 -8
  109. package/dist/components/ui/checkbox.js +36 -5
  110. package/dist/components/ui/checkbox.mjs +2 -3
  111. package/dist/components/ui/chip.js +37 -2
  112. package/dist/components/ui/chip.mjs +3 -3
  113. package/dist/components/ui/combobox.js +68 -49
  114. package/dist/components/ui/combobox.mjs +2 -2
  115. package/dist/components/ui/data-table.js +160 -88
  116. package/dist/components/ui/data-table.mjs +10 -11
  117. package/dist/components/ui/date-picker.js +44 -20
  118. package/dist/components/ui/date-picker.mjs +6 -7
  119. package/dist/components/ui/dialog.js +44 -12
  120. package/dist/components/ui/dialog.mjs +4 -4
  121. package/dist/components/ui/drawer.js +46 -10
  122. package/dist/components/ui/drawer.mjs +3 -3
  123. package/dist/components/ui/dropdown-menu.js +40 -16
  124. package/dist/components/ui/dropdown-menu.mjs +3 -3
  125. package/dist/components/ui/empty.js +41 -5
  126. package/dist/components/ui/empty.mjs +2 -2
  127. package/dist/components/ui/expense-bar-chart.js +166 -67
  128. package/dist/components/ui/expense-bar-chart.mjs +8 -8
  129. package/dist/components/ui/field.js +53 -21
  130. package/dist/components/ui/field.mjs +4 -4
  131. package/dist/components/ui/financial-cards.js +1002 -0
  132. package/dist/components/ui/financial-cards.mjs +24 -0
  133. package/dist/components/ui/financial-drawers.js +637 -0
  134. package/dist/components/ui/financial-drawers.mjs +17 -0
  135. package/dist/components/ui/financial-primitives.js +218 -0
  136. package/dist/components/ui/financial-primitives.mjs +22 -0
  137. package/dist/components/ui/financial-sections.js +1422 -0
  138. package/dist/components/ui/financial-sections.mjs +30 -0
  139. package/dist/components/ui/form-primitives.js +682 -0
  140. package/dist/components/ui/form-primitives.mjs +19 -0
  141. package/dist/components/ui/income-bar-chart.js +164 -66
  142. package/dist/components/ui/income-bar-chart.mjs +8 -8
  143. package/dist/components/ui/input-group.js +43 -7
  144. package/dist/components/ui/input-group.mjs +5 -5
  145. package/dist/components/ui/input-otp.js +39 -3
  146. package/dist/components/ui/input-otp.mjs +2 -2
  147. package/dist/components/ui/input.js +34 -2
  148. package/dist/components/ui/input.mjs +2 -2
  149. package/dist/components/ui/kanban-column.js +1143 -0
  150. package/dist/components/ui/kanban-column.mjs +20 -0
  151. package/dist/components/ui/label.js +35 -7
  152. package/dist/components/ui/label.mjs +2 -2
  153. package/dist/components/ui/opportunity-card.js +960 -0
  154. package/dist/components/ui/opportunity-card.mjs +20 -0
  155. package/dist/components/ui/opportunity-edit-modals.js +3360 -0
  156. package/dist/components/ui/opportunity-edit-modals.mjs +37 -0
  157. package/dist/components/ui/opportunity-summary-tab.js +4365 -0
  158. package/dist/components/ui/opportunity-summary-tab.mjs +34 -0
  159. package/dist/components/ui/pagination.js +35 -3
  160. package/dist/components/ui/pagination.mjs +3 -3
  161. package/dist/components/ui/pipeline-alerts.js +103 -0
  162. package/dist/components/ui/pipeline-alerts.mjs +8 -0
  163. package/dist/components/ui/pipeline-board.js +1408 -0
  164. package/dist/components/ui/pipeline-board.mjs +24 -0
  165. package/dist/components/ui/pipeline-chart.js +216 -0
  166. package/dist/components/ui/pipeline-chart.mjs +10 -0
  167. package/dist/components/ui/pipeline-dialogs.js +1183 -0
  168. package/dist/components/ui/pipeline-dialogs.mjs +23 -0
  169. package/dist/components/ui/pipeline-primitives.js +300 -0
  170. package/dist/components/ui/pipeline-primitives.mjs +11 -0
  171. package/dist/components/ui/popover.js +45 -4
  172. package/dist/components/ui/popover.mjs +3 -3
  173. package/dist/components/ui/progress.js +33 -1
  174. package/dist/components/ui/progress.mjs +2 -2
  175. package/dist/components/ui/property-cashflow-doughnut-chart.js +523 -0
  176. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +16 -0
  177. package/dist/components/ui/property-debt-equity-doughnut-chart.js +521 -0
  178. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +16 -0
  179. package/dist/components/ui/property-mobile-estimate-line-chart.js +683 -0
  180. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +16 -0
  181. package/dist/components/ui/radio-group.js +33 -1
  182. package/dist/components/ui/radio-group.mjs +2 -2
  183. package/dist/components/ui/select.js +66 -26
  184. package/dist/components/ui/select.mjs +3 -3
  185. package/dist/components/ui/separator.js +33 -1
  186. package/dist/components/ui/separator.mjs +2 -2
  187. package/dist/components/ui/sheet.js +37 -9
  188. package/dist/components/ui/sheet.mjs +3 -3
  189. package/dist/components/ui/skeleton.js +33 -1
  190. package/dist/components/ui/skeleton.mjs +2 -2
  191. package/dist/components/ui/slider.js +86 -102
  192. package/dist/components/ui/slider.mjs +2 -2
  193. package/dist/components/ui/spinner.js +33 -1
  194. package/dist/components/ui/spinner.mjs +2 -2
  195. package/dist/components/ui/stage-timeline.js +579 -0
  196. package/dist/components/ui/stage-timeline.mjs +15 -0
  197. package/dist/components/ui/switch.js +37 -4
  198. package/dist/components/ui/switch.mjs +2 -3
  199. package/dist/components/ui/table.js +37 -5
  200. package/dist/components/ui/table.mjs +2 -2
  201. package/dist/components/ui/tabs.js +36 -12
  202. package/dist/components/ui/tabs.mjs +2 -2
  203. package/dist/components/ui/textarea.js +34 -2
  204. package/dist/components/ui/textarea.mjs +2 -2
  205. package/dist/components/ui/toggle-group.js +35 -4
  206. package/dist/components/ui/toggle-group.mjs +3 -4
  207. package/dist/components/ui/toggle.js +35 -4
  208. package/dist/components/ui/toggle.mjs +2 -3
  209. package/dist/components/ui/tooltip.js +51 -22
  210. package/dist/components/ui/tooltip.mjs +3 -3
  211. package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +528 -0
  212. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +16 -0
  213. package/dist/components/ui/transactions-income-expense-bar-chart.js +77 -39
  214. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +8 -8
  215. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +528 -0
  216. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +16 -0
  217. package/dist/index.js +11620 -3832
  218. package/dist/index.mjs +333 -161
  219. package/dist/lib/theme-provider.js +10 -1
  220. package/dist/lib/theme-provider.mjs +1 -1
  221. package/dist/lib/typography.js +8 -0
  222. package/dist/lib/typography.mjs +3 -1
  223. package/dist/lib/utils.js +33 -1
  224. package/dist/lib/utils.mjs +1 -1
  225. package/dist/styles.css +1 -1
  226. package/package.json +140 -5
  227. package/src/components/index.tsx +296 -42
  228. package/src/components/ui/accordion.tsx +6 -3
  229. package/src/components/ui/add-column-modal.tsx +339 -0
  230. package/src/components/ui/add-lead-modal.tsx +290 -0
  231. package/src/components/ui/ai-assistant-drawer.tsx +408 -0
  232. package/src/components/ui/alert-dialog.tsx +80 -54
  233. package/src/components/ui/alert.tsx +28 -28
  234. package/src/components/ui/avatar.tsx +30 -29
  235. package/src/components/ui/backoffice-alert-history-chart.tsx +261 -0
  236. package/src/components/ui/backoffice-contact-history-chart.tsx +326 -0
  237. package/src/components/ui/badge.tsx +17 -15
  238. package/src/components/ui/borrowing-capacity-line-chart.tsx +359 -0
  239. package/src/components/ui/button.tsx +30 -27
  240. package/src/components/ui/calendar.tsx +53 -67
  241. package/src/components/ui/card.tsx +27 -24
  242. package/src/components/ui/cash-balance-line-chart.tsx +304 -0
  243. package/src/components/ui/cashflow-bar-chart.tsx +106 -78
  244. package/src/components/ui/chart-shared.tsx +176 -15
  245. package/src/components/ui/checkbox.tsx +30 -26
  246. package/src/components/ui/combobox.tsx +78 -72
  247. package/src/components/ui/data-table.tsx +160 -99
  248. package/src/components/ui/date-picker.tsx +0 -2
  249. package/src/components/ui/dialog.tsx +70 -60
  250. package/src/components/ui/drawer.tsx +57 -48
  251. package/src/components/ui/dropdown-menu.tsx +90 -82
  252. package/src/components/ui/empty.tsx +31 -27
  253. package/src/components/ui/expense-bar-chart.tsx +85 -66
  254. package/src/components/ui/field.tsx +70 -62
  255. package/src/components/ui/financial-cards.tsx +830 -0
  256. package/src/components/ui/financial-drawers.tsx +339 -0
  257. package/src/components/ui/financial-primitives.tsx +331 -0
  258. package/src/components/ui/financial-sections.tsx +672 -0
  259. package/src/components/ui/form-primitives.tsx +536 -0
  260. package/src/components/ui/income-bar-chart.tsx +81 -61
  261. package/src/components/ui/input-group.tsx +41 -34
  262. package/src/components/ui/input-otp.tsx +29 -24
  263. package/src/components/ui/input.tsx +8 -8
  264. package/src/components/ui/kanban-column.tsx +333 -0
  265. package/src/components/ui/label.tsx +9 -12
  266. package/src/components/ui/opportunity-card.tsx +616 -0
  267. package/src/components/ui/opportunity-edit-modals.tsx +2528 -0
  268. package/src/components/ui/opportunity-summary-tab.tsx +579 -0
  269. package/src/components/ui/pipeline-alerts.tsx +74 -0
  270. package/src/components/ui/pipeline-board.tsx +268 -0
  271. package/src/components/ui/pipeline-chart.tsx +173 -0
  272. package/src/components/ui/pipeline-dialogs.tsx +303 -0
  273. package/src/components/ui/pipeline-primitives.tsx +108 -0
  274. package/src/components/ui/popover.tsx +41 -36
  275. package/src/components/ui/property-cashflow-doughnut-chart.tsx +189 -0
  276. package/src/components/ui/property-debt-equity-doughnut-chart.tsx +186 -0
  277. package/src/components/ui/property-mobile-estimate-line-chart.tsx +395 -0
  278. package/src/components/ui/select.tsx +65 -52
  279. package/src/components/ui/sheet.tsx +55 -52
  280. package/src/components/ui/slider.tsx +54 -77
  281. package/src/components/ui/stage-timeline.tsx +205 -0
  282. package/src/components/ui/switch.tsx +42 -29
  283. package/src/components/ui/table.tsx +28 -28
  284. package/src/components/ui/tabs.tsx +22 -28
  285. package/src/components/ui/textarea.tsx +8 -8
  286. package/src/components/ui/toggle-group.tsx +0 -2
  287. package/src/components/ui/toggle.tsx +13 -15
  288. package/src/components/ui/tooltip.tsx +30 -28
  289. package/src/components/ui/transactions-expense-categories-doughnut-chart.tsx +192 -0
  290. package/src/components/ui/transactions-income-expense-bar-chart.tsx +47 -39
  291. package/src/components/ui/transactions-liabilities-breakdown-doughnut-chart.tsx +192 -0
  292. package/src/lib/theme-provider.tsx +10 -0
  293. package/src/lib/typography.ts +9 -0
  294. package/src/lib/utils.ts +41 -3
  295. package/src/styles/globals.css +371 -124
  296. package/src/styles/styles-css.ts +1 -1
  297. package/tsup.config.ts +27 -0
  298. package/dist/chunk-3EQP72AW.mjs +0 -58
  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,
@@ -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
  __spreadProps,
@@ -31,7 +31,7 @@ function ComboboxTrigger(_a) {
31
31
  "data-slot": "combobox-trigger",
32
32
  "data-size": size,
33
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]: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",
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
35
  className
36
36
  )
37
37
  }, props), {
@@ -47,24 +47,27 @@ function ComboboxValue(_a) {
47
47
  return /* @__PURE__ */ jsx(ComboboxPrimitive.Value, __spreadValues({ "data-slot": "combobox-value" }, props));
48
48
  }
49
49
  function ComboboxInput(_a) {
50
- var _b = _a, {
51
- className
52
- } = _b, props = __objRest(_b, [
53
- "className"
54
- ]);
55
- return /* @__PURE__ */ jsxs("div", { "data-slot": "combobox-input-wrapper", className: "flex items-center gap-2 border-b border-border px-3", children: [
56
- /* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 text-muted-foreground" }),
57
- /* @__PURE__ */ jsx(
58
- ComboboxPrimitive.Input,
59
- __spreadValues({
60
- "data-slot": "combobox-input",
61
- className: cn(
62
- "h-9 w-full min-w-0 bg-transparent py-1 text-body-small outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
63
- className
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)
64
67
  )
65
- }, props)
66
- )
67
- ] });
68
+ ]
69
+ }
70
+ );
68
71
  }
69
72
  function ComboboxContent(_a) {
70
73
  var _b = _a, {
@@ -88,11 +91,7 @@ function ComboboxContent(_a) {
88
91
  ) }) });
89
92
  }
90
93
  function ComboboxList(_a) {
91
- var _b = _a, {
92
- className
93
- } = _b, props = __objRest(_b, [
94
- "className"
95
- ]);
94
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
96
95
  return /* @__PURE__ */ jsx(
97
96
  ComboboxPrimitive.List,
98
97
  __spreadValues({
@@ -105,19 +104,13 @@ function ComboboxList(_a) {
105
104
  );
106
105
  }
107
106
  function ComboboxItem(_a) {
108
- var _b = _a, {
109
- className,
110
- children
111
- } = _b, props = __objRest(_b, [
112
- "className",
113
- "children"
114
- ]);
107
+ var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
115
108
  return /* @__PURE__ */ jsxs(
116
109
  ComboboxPrimitive.Item,
117
110
  __spreadProps(__spreadValues({
118
111
  "data-slot": "combobox-item",
119
112
  className: cn(
120
- "relative flex w-full cursor-default items-center gap-2 rounded-sm 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",
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",
121
114
  className
122
115
  )
123
116
  }, props), {
@@ -136,16 +129,15 @@ function ComboboxItem(_a) {
136
129
  );
137
130
  }
138
131
  function ComboboxEmpty(_a) {
139
- var _b = _a, {
140
- className
141
- } = _b, props = __objRest(_b, [
142
- "className"
143
- ]);
132
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
144
133
  return /* @__PURE__ */ jsx(
145
134
  ComboboxPrimitive.Empty,
146
135
  __spreadValues({
147
136
  "data-slot": "combobox-empty",
148
- className: `text-body-small ${cn("py-6 text-center text-muted-foreground empty:hidden", className)}`
137
+ className: cn(
138
+ "text-body-small py-6 text-center text-muted-foreground empty:hidden",
139
+ className
140
+ )
149
141
  }, props)
150
142
  );
151
143
  }
@@ -154,25 +146,20 @@ function ComboboxGroup(_a) {
154
146
  return /* @__PURE__ */ jsx(ComboboxPrimitive.Group, __spreadValues({ "data-slot": "combobox-group" }, props));
155
147
  }
156
148
  function ComboboxGroupLabel(_a) {
157
- var _b = _a, {
158
- className
159
- } = _b, props = __objRest(_b, [
160
- "className"
161
- ]);
149
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
162
150
  return /* @__PURE__ */ jsx(
163
151
  ComboboxPrimitive.GroupLabel,
164
152
  __spreadValues({
165
153
  "data-slot": "combobox-group-label",
166
- className: `text-label-small ${cn("px-2 py-1.5 uppercase text-muted-foreground", className)}`
154
+ className: cn(
155
+ "text-label-small px-2 py-1.5 uppercase text-muted-foreground",
156
+ className
157
+ )
167
158
  }, props)
168
159
  );
169
160
  }
170
161
  function ComboboxSeparator(_a) {
171
- var _b = _a, {
172
- className
173
- } = _b, props = __objRest(_b, [
174
- "className"
175
- ]);
162
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
176
163
  return /* @__PURE__ */ jsx(
177
164
  "div",
178
165
  __spreadValues({
@@ -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