@timeax/form-palette 0.0.3 → 0.0.4

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 (503) hide show
  1. package/dist/adapters/axios.d.ts +21 -0
  2. package/dist/adapters/axios.d.ts.map +1 -0
  3. package/dist/adapters/axios.js +74 -0
  4. package/dist/adapters/axios.js.map +1 -0
  5. package/dist/adapters/index.d.ts +35 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +74 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/inertia.d.ts +24 -0
  10. package/dist/adapters/inertia.d.ts.map +1 -0
  11. package/dist/adapters/inertia.js +126 -0
  12. package/dist/adapters/inertia.js.map +1 -0
  13. package/dist/core/adapter-registry.d.ts +30 -0
  14. package/dist/core/adapter-registry.d.ts.map +1 -0
  15. package/{src/core/adapter-registry.ts → dist/core/adapter-registry.js} +10 -28
  16. package/dist/core/adapter-registry.js.map +1 -0
  17. package/{src/core/bound/bind-host.ts → dist/core/bound/bind-host.d.ts} +2 -3
  18. package/dist/core/bound/bind-host.d.ts.map +1 -0
  19. package/dist/core/bound/bind-host.js +2 -0
  20. package/dist/core/bound/bind-host.js.map +1 -0
  21. package/dist/core/bound/observe-bound-field.d.ts +21 -0
  22. package/dist/core/bound/observe-bound-field.d.ts.map +1 -0
  23. package/dist/core/bound/observe-bound-field.js +116 -0
  24. package/dist/core/bound/observe-bound-field.js.map +1 -0
  25. package/dist/core/bound/wait-for-bound-field.d.ts +5 -0
  26. package/dist/core/bound/wait-for-bound-field.d.ts.map +1 -0
  27. package/dist/core/bound/wait-for-bound-field.js +35 -0
  28. package/dist/core/bound/wait-for-bound-field.js.map +1 -0
  29. package/{src/core/context.ts → dist/core/context.d.ts} +2 -6
  30. package/dist/core/context.d.ts.map +1 -0
  31. package/dist/core/context.js +11 -0
  32. package/dist/core/context.js.map +1 -0
  33. package/dist/core/core-provider.d.ts +22 -0
  34. package/dist/core/core-provider.d.ts.map +1 -0
  35. package/{src/core/core-provider.tsx → dist/core/core-provider.js} +209 -364
  36. package/dist/core/core-provider.js.map +1 -0
  37. package/dist/core/core-root.d.ts +26 -0
  38. package/dist/core/core-root.d.ts.map +1 -0
  39. package/dist/core/core-root.js +38 -0
  40. package/dist/core/core-root.js.map +1 -0
  41. package/dist/core/core-shell.d.ts +22 -0
  42. package/dist/core/core-shell.d.ts.map +1 -0
  43. package/dist/core/core-shell.js +8 -0
  44. package/dist/core/core-shell.js.map +1 -0
  45. package/{src/core/errors/error-strip.tsx → dist/core/errors/error-strip.d.ts} +2 -39
  46. package/dist/core/errors/error-strip.d.ts.map +1 -0
  47. package/dist/core/errors/error-strip.js +18 -0
  48. package/dist/core/errors/error-strip.js.map +1 -0
  49. package/dist/core/errors/index.d.ts +4 -0
  50. package/dist/core/errors/index.d.ts.map +1 -0
  51. package/dist/core/errors/index.js +4 -0
  52. package/dist/core/errors/index.js.map +1 -0
  53. package/dist/core/errors/map-error-bag.d.ts +24 -0
  54. package/dist/core/errors/map-error-bag.d.ts.map +1 -0
  55. package/{src/core/errors/map-error-bag.ts → dist/core/errors/map-error-bag.js} +10 -22
  56. package/dist/core/errors/map-error-bag.js.map +1 -0
  57. package/dist/core/errors/map-zod.d.ts +18 -0
  58. package/dist/core/errors/map-zod.d.ts.map +1 -0
  59. package/{src/core/errors/map-zod.ts → dist/core/errors/map-zod.js} +7 -19
  60. package/dist/core/errors/map-zod.js.map +1 -0
  61. package/dist/core/hooks/use-button.d.ts +73 -0
  62. package/dist/core/hooks/use-button.d.ts.map +1 -0
  63. package/dist/core/hooks/use-button.js +116 -0
  64. package/dist/core/hooks/use-button.js.map +1 -0
  65. package/dist/core/hooks/use-core-context.d.ts +9 -0
  66. package/dist/core/hooks/use-core-context.d.ts.map +1 -0
  67. package/{src/core/hooks/use-core-context.ts → dist/core/hooks/use-core-context.js} +3 -6
  68. package/dist/core/hooks/use-core-context.js.map +1 -0
  69. package/dist/core/hooks/use-core-utility.d.ts +1 -0
  70. package/dist/core/hooks/use-core-utility.d.ts.map +1 -0
  71. package/dist/core/hooks/use-core-utility.js +2 -0
  72. package/dist/core/hooks/use-core-utility.js.map +1 -0
  73. package/{src/core/hooks/use-core.ts → dist/core/hooks/use-core.d.ts} +9 -13
  74. package/dist/core/hooks/use-core.d.ts.map +1 -0
  75. package/dist/core/hooks/use-core.js +11 -0
  76. package/dist/core/hooks/use-core.js.map +1 -0
  77. package/dist/core/hooks/use-field.d.ts +141 -0
  78. package/dist/core/hooks/use-field.d.ts.map +1 -0
  79. package/dist/core/hooks/use-field.js +256 -0
  80. package/dist/core/hooks/use-field.js.map +1 -0
  81. package/dist/core/hooks/use-optional-field.d.ts +9 -0
  82. package/dist/core/hooks/use-optional-field.d.ts.map +1 -0
  83. package/dist/core/hooks/use-optional-field.js +146 -0
  84. package/dist/core/hooks/use-optional-field.js.map +1 -0
  85. package/dist/core/index.d.ts +11 -0
  86. package/dist/core/index.d.ts.map +1 -0
  87. package/dist/core/index.js +11 -0
  88. package/dist/core/index.js.map +1 -0
  89. package/dist/core/registry/binder-registry.d.ts +38 -0
  90. package/dist/core/registry/binder-registry.d.ts.map +1 -0
  91. package/dist/core/registry/binder-registry.js +52 -0
  92. package/dist/core/registry/binder-registry.js.map +1 -0
  93. package/dist/core/registry/field-registry.d.ts +86 -0
  94. package/dist/core/registry/field-registry.d.ts.map +1 -0
  95. package/{src/core/registry/field-registry.ts → dist/core/registry/field-registry.js} +56 -70
  96. package/dist/core/registry/field-registry.js.map +1 -0
  97. package/dist/core/test.d.ts +2 -0
  98. package/dist/core/test.d.ts.map +1 -0
  99. package/dist/core/test.js +9 -0
  100. package/dist/core/test.js.map +1 -0
  101. package/dist/index.d.ts +15 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/{src/index.ts → dist/index.js} +5 -47
  104. package/dist/index.js.map +1 -0
  105. package/{src/input/index.ts → dist/input/index.d.ts} +1 -2
  106. package/dist/input/index.d.ts.map +1 -0
  107. package/dist/input/index.js +3 -0
  108. package/dist/input/index.js.map +1 -0
  109. package/dist/input/input-field.d.ts +15 -0
  110. package/dist/input/input-field.d.ts.map +1 -0
  111. package/dist/input/input-field.js +413 -0
  112. package/dist/input/input-field.js.map +1 -0
  113. package/dist/input/input-layout-graph.d.ts +77 -0
  114. package/dist/input/input-layout-graph.d.ts.map +1 -0
  115. package/dist/input/input-layout-graph.js +108 -0
  116. package/dist/input/input-layout-graph.js.map +1 -0
  117. package/{src/input/input-props.ts → dist/input/input-props.d.ts} +22 -84
  118. package/dist/input/input-props.d.ts.map +1 -0
  119. package/dist/input/input-props.js +4 -0
  120. package/dist/input/input-props.js.map +1 -0
  121. package/dist/lib/get-global-countries.d.ts +3 -0
  122. package/dist/lib/get-global-countries.d.ts.map +1 -0
  123. package/dist/lib/get-global-countries.js +70 -0
  124. package/dist/lib/get-global-countries.js.map +1 -0
  125. package/dist/lib/utils.d.ts +3 -0
  126. package/dist/lib/utils.d.ts.map +1 -0
  127. package/dist/lib/utils.js +6 -0
  128. package/dist/lib/utils.js.map +1 -0
  129. package/dist/presets/index.d.ts +1 -0
  130. package/dist/presets/index.d.ts.map +1 -0
  131. package/dist/presets/index.js +2 -0
  132. package/dist/presets/index.js.map +1 -0
  133. package/dist/presets/shadcn-preset.d.ts +1 -0
  134. package/dist/presets/shadcn-preset.d.ts.map +1 -0
  135. package/dist/presets/shadcn-preset.js +2 -0
  136. package/dist/presets/shadcn-preset.js.map +1 -0
  137. package/dist/presets/shadcn-variants/checkbox.d.ts +212 -0
  138. package/dist/presets/shadcn-variants/checkbox.d.ts.map +1 -0
  139. package/dist/presets/shadcn-variants/checkbox.js +315 -0
  140. package/dist/presets/shadcn-variants/checkbox.js.map +1 -0
  141. package/dist/presets/shadcn-variants/chips.d.ts +154 -0
  142. package/dist/presets/shadcn-variants/chips.d.ts.map +1 -0
  143. package/dist/presets/shadcn-variants/chips.js +266 -0
  144. package/dist/presets/shadcn-variants/chips.js.map +1 -0
  145. package/dist/presets/shadcn-variants/color.d.ts +63 -0
  146. package/dist/presets/shadcn-variants/color.d.ts.map +1 -0
  147. package/dist/presets/shadcn-variants/color.js +96 -0
  148. package/dist/presets/shadcn-variants/color.js.map +1 -0
  149. package/dist/presets/shadcn-variants/custom.d.ts +94 -0
  150. package/dist/presets/shadcn-variants/custom.d.ts.map +1 -0
  151. package/dist/presets/shadcn-variants/custom.js +80 -0
  152. package/dist/presets/shadcn-variants/custom.js.map +1 -0
  153. package/dist/presets/shadcn-variants/date.d.ts +114 -0
  154. package/dist/presets/shadcn-variants/date.d.ts.map +1 -0
  155. package/dist/presets/shadcn-variants/date.js +414 -0
  156. package/dist/presets/shadcn-variants/date.js.map +1 -0
  157. package/dist/presets/shadcn-variants/file.d.ts +79 -0
  158. package/dist/presets/shadcn-variants/file.d.ts.map +1 -0
  159. package/dist/presets/shadcn-variants/file.js +289 -0
  160. package/dist/presets/shadcn-variants/file.js.map +1 -0
  161. package/dist/presets/shadcn-variants/keyvalue.d.ts +35 -0
  162. package/dist/presets/shadcn-variants/keyvalue.d.ts.map +1 -0
  163. package/dist/presets/shadcn-variants/keyvalue.js +215 -0
  164. package/dist/presets/shadcn-variants/keyvalue.js.map +1 -0
  165. package/dist/presets/shadcn-variants/multiselect.d.ts +210 -0
  166. package/dist/presets/shadcn-variants/multiselect.d.ts.map +1 -0
  167. package/dist/presets/shadcn-variants/multiselect.js +352 -0
  168. package/dist/presets/shadcn-variants/multiselect.js.map +1 -0
  169. package/dist/presets/shadcn-variants/number.d.ts +31 -0
  170. package/dist/presets/shadcn-variants/number.d.ts.map +1 -0
  171. package/dist/presets/shadcn-variants/number.js +64 -0
  172. package/dist/presets/shadcn-variants/number.js.map +1 -0
  173. package/dist/presets/shadcn-variants/password.d.ts +195 -0
  174. package/dist/presets/shadcn-variants/password.d.ts.map +1 -0
  175. package/dist/presets/shadcn-variants/password.js +296 -0
  176. package/dist/presets/shadcn-variants/password.js.map +1 -0
  177. package/dist/presets/shadcn-variants/phone.d.ts +69 -0
  178. package/dist/presets/shadcn-variants/phone.d.ts.map +1 -0
  179. package/dist/presets/shadcn-variants/phone.js +308 -0
  180. package/dist/presets/shadcn-variants/phone.js.map +1 -0
  181. package/dist/presets/shadcn-variants/radio.d.ts +172 -0
  182. package/dist/presets/shadcn-variants/radio.d.ts.map +1 -0
  183. package/dist/presets/shadcn-variants/radio.js +192 -0
  184. package/dist/presets/shadcn-variants/radio.js.map +1 -0
  185. package/dist/presets/shadcn-variants/select.d.ts +203 -0
  186. package/dist/presets/shadcn-variants/select.d.ts.map +1 -0
  187. package/dist/presets/shadcn-variants/select.js +285 -0
  188. package/dist/presets/shadcn-variants/select.js.map +1 -0
  189. package/dist/presets/shadcn-variants/slider.d.ts +131 -0
  190. package/dist/presets/shadcn-variants/slider.d.ts.map +1 -0
  191. package/dist/presets/shadcn-variants/slider.js +151 -0
  192. package/dist/presets/shadcn-variants/slider.js.map +1 -0
  193. package/dist/presets/shadcn-variants/text.d.ts +155 -0
  194. package/dist/presets/shadcn-variants/text.d.ts.map +1 -0
  195. package/dist/presets/shadcn-variants/text.js +98 -0
  196. package/dist/presets/shadcn-variants/text.js.map +1 -0
  197. package/dist/presets/shadcn-variants/textarea.d.ts +18 -0
  198. package/dist/presets/shadcn-variants/textarea.d.ts.map +1 -0
  199. package/dist/presets/shadcn-variants/textarea.js +24 -0
  200. package/dist/presets/shadcn-variants/textarea.js.map +1 -0
  201. package/dist/presets/shadcn-variants/toggle.d.ts +61 -0
  202. package/dist/presets/shadcn-variants/toggle.d.ts.map +1 -0
  203. package/dist/presets/shadcn-variants/toggle.js +67 -0
  204. package/dist/presets/shadcn-variants/toggle.js.map +1 -0
  205. package/dist/presets/shadcn-variants/treeselect.d.ts +81 -0
  206. package/dist/presets/shadcn-variants/treeselect.d.ts.map +1 -0
  207. package/dist/presets/shadcn-variants/treeselect.js +317 -0
  208. package/dist/presets/shadcn-variants/treeselect.js.map +1 -0
  209. package/dist/presets/ui/badge.d.ts +10 -0
  210. package/dist/presets/ui/badge.d.ts.map +1 -0
  211. package/dist/presets/ui/badge.js +23 -0
  212. package/dist/presets/ui/badge.js.map +1 -0
  213. package/dist/presets/ui/button.d.ts +11 -0
  214. package/dist/presets/ui/button.d.ts.map +1 -0
  215. package/dist/presets/ui/button.js +34 -0
  216. package/dist/presets/ui/button.js.map +1 -0
  217. package/dist/presets/ui/calendar.d.ts +9 -0
  218. package/dist/presets/ui/calendar.d.ts.map +1 -0
  219. package/dist/presets/ui/calendar.js +76 -0
  220. package/dist/presets/ui/calendar.js.map +1 -0
  221. package/dist/presets/ui/checkbox.d.ts +18 -0
  222. package/dist/presets/ui/checkbox.d.ts.map +1 -0
  223. package/dist/presets/ui/checkbox.js +61 -0
  224. package/dist/presets/ui/checkbox.js.map +1 -0
  225. package/dist/presets/ui/custom.d.ts +1 -0
  226. package/dist/presets/ui/custom.d.ts.map +1 -0
  227. package/dist/presets/ui/custom.js +2 -0
  228. package/dist/presets/ui/custom.js.map +1 -0
  229. package/dist/presets/ui/dialog.d.ts +16 -0
  230. package/dist/presets/ui/dialog.d.ts.map +1 -0
  231. package/dist/presets/ui/dialog.js +36 -0
  232. package/dist/presets/ui/dialog.js.map +1 -0
  233. package/dist/presets/ui/field.d.ts +25 -0
  234. package/dist/presets/ui/field.d.ts.map +1 -0
  235. package/dist/presets/ui/field.js +76 -0
  236. package/dist/presets/ui/field.js.map +1 -0
  237. package/dist/presets/ui/input-mask.d.ts +34 -0
  238. package/dist/presets/ui/input-mask.d.ts.map +1 -0
  239. package/dist/presets/ui/input-mask.js +561 -0
  240. package/dist/presets/ui/input-mask.js.map +1 -0
  241. package/dist/presets/ui/input-otp.d.ts +12 -0
  242. package/dist/presets/ui/input-otp.d.ts.map +1 -0
  243. package/dist/presets/ui/input-otp.js +22 -0
  244. package/dist/presets/ui/input-otp.js.map +1 -0
  245. package/dist/presets/ui/input.d.ts +83 -0
  246. package/dist/presets/ui/input.d.ts.map +1 -0
  247. package/dist/presets/ui/input.js +436 -0
  248. package/dist/presets/ui/input.js.map +1 -0
  249. package/dist/presets/ui/label.d.ts +5 -0
  250. package/dist/presets/ui/label.d.ts.map +1 -0
  251. package/dist/presets/ui/label.js +8 -0
  252. package/dist/presets/ui/label.js.map +1 -0
  253. package/dist/presets/ui/number.d.ts +60 -0
  254. package/dist/presets/ui/number.d.ts.map +1 -0
  255. package/dist/presets/ui/number.js +1078 -0
  256. package/dist/presets/ui/number.js.map +1 -0
  257. package/dist/presets/ui/popover.d.ts +8 -0
  258. package/dist/presets/ui/popover.d.ts.map +1 -0
  259. package/dist/presets/ui/popover.js +17 -0
  260. package/dist/presets/ui/popover.js.map +1 -0
  261. package/dist/presets/ui/radio-group.d.ts +6 -0
  262. package/dist/presets/ui/radio-group.d.ts.map +1 -0
  263. package/dist/presets/ui/radio-group.js +12 -0
  264. package/dist/presets/ui/radio-group.js.map +1 -0
  265. package/dist/presets/ui/scroll-area.d.ts +6 -0
  266. package/dist/presets/ui/scroll-area.d.ts.map +1 -0
  267. package/dist/presets/ui/scroll-area.js +13 -0
  268. package/dist/presets/ui/scroll-area.js.map +1 -0
  269. package/dist/presets/ui/select.d.ts +21 -0
  270. package/dist/presets/ui/select.d.ts.map +1 -0
  271. package/dist/presets/ui/select.js +38 -0
  272. package/dist/presets/ui/select.js.map +1 -0
  273. package/dist/presets/ui/separator.d.ts +5 -0
  274. package/dist/presets/ui/separator.d.ts.map +1 -0
  275. package/dist/presets/ui/separator.js +9 -0
  276. package/dist/presets/ui/separator.js.map +1 -0
  277. package/dist/presets/ui/slider.d.ts +5 -0
  278. package/dist/presets/ui/slider.d.ts.map +1 -0
  279. package/dist/presets/ui/slider.js +14 -0
  280. package/dist/presets/ui/slider.js.map +1 -0
  281. package/dist/presets/ui/switch.d.ts +7 -0
  282. package/dist/presets/ui/switch.d.ts.map +1 -0
  283. package/dist/presets/ui/switch.js +9 -0
  284. package/dist/presets/ui/switch.js.map +1 -0
  285. package/dist/presets/ui/textarea.d.ts +76 -0
  286. package/dist/presets/ui/textarea.d.ts.map +1 -0
  287. package/dist/presets/ui/textarea.js +291 -0
  288. package/dist/presets/ui/textarea.js.map +1 -0
  289. package/dist/presets/ui/time-dropdowns.d.ts +58 -0
  290. package/dist/presets/ui/time-dropdowns.d.ts.map +1 -0
  291. package/dist/presets/ui/time-dropdowns.js +133 -0
  292. package/dist/presets/ui/time-dropdowns.js.map +1 -0
  293. package/{src/schema/adapter.ts → dist/schema/adapter.d.ts} +7 -35
  294. package/dist/schema/adapter.d.ts.map +1 -0
  295. package/dist/schema/adapter.js +3 -0
  296. package/dist/schema/adapter.js.map +1 -0
  297. package/{src/schema/core.ts → dist/schema/core.d.ts} +17 -117
  298. package/dist/schema/core.d.ts.map +1 -0
  299. package/dist/schema/core.js +4 -0
  300. package/dist/schema/core.js.map +1 -0
  301. package/dist/schema/field-map.d.ts +1 -0
  302. package/dist/schema/field-map.d.ts.map +1 -0
  303. package/dist/schema/field-map.js +2 -0
  304. package/dist/schema/field-map.js.map +1 -0
  305. package/{src/schema/field.ts → dist/schema/field.d.ts} +1 -34
  306. package/dist/schema/field.d.ts.map +1 -0
  307. package/dist/schema/field.js +4 -0
  308. package/dist/schema/field.js.map +1 -0
  309. package/dist/schema/index.d.ts +1 -0
  310. package/dist/schema/index.d.ts.map +1 -0
  311. package/dist/schema/index.js +2 -0
  312. package/dist/schema/index.js.map +1 -0
  313. package/{src/schema/input-field.ts → dist/schema/input-field.d.ts} +6 -43
  314. package/dist/schema/input-field.d.ts.map +1 -0
  315. package/dist/schema/input-field.js +3 -0
  316. package/dist/schema/input-field.js.map +1 -0
  317. package/dist/schema/presets.d.ts +1 -0
  318. package/dist/schema/presets.d.ts.map +1 -0
  319. package/dist/schema/presets.js +2 -0
  320. package/dist/schema/presets.js.map +1 -0
  321. package/{src/schema/variant.ts → dist/schema/variant.d.ts} +24 -64
  322. package/dist/schema/variant.d.ts.map +1 -0
  323. package/dist/schema/variant.js +3 -0
  324. package/dist/schema/variant.js.map +1 -0
  325. package/dist/variants/core/checkbox.d.ts +15 -0
  326. package/dist/variants/core/checkbox.d.ts.map +1 -0
  327. package/dist/variants/core/checkbox.js +27 -0
  328. package/dist/variants/core/checkbox.js.map +1 -0
  329. package/dist/variants/core/chips.d.ts +3 -0
  330. package/dist/variants/core/chips.d.ts.map +1 -0
  331. package/dist/variants/core/chips.js +20 -0
  332. package/dist/variants/core/chips.js.map +1 -0
  333. package/dist/variants/core/color.d.ts +3 -0
  334. package/dist/variants/core/color.d.ts.map +1 -0
  335. package/dist/variants/core/color.js +14 -0
  336. package/dist/variants/core/color.js.map +1 -0
  337. package/dist/variants/core/custom.d.ts +11 -0
  338. package/dist/variants/core/custom.d.ts.map +1 -0
  339. package/{src/variants/core/custom.tsx → dist/variants/core/custom.js} +15 -18
  340. package/dist/variants/core/custom.js.map +1 -0
  341. package/dist/variants/core/date.d.ts +3 -0
  342. package/dist/variants/core/date.d.ts.map +1 -0
  343. package/dist/variants/core/date.js +20 -0
  344. package/dist/variants/core/date.js.map +1 -0
  345. package/dist/variants/core/file.d.ts +3 -0
  346. package/dist/variants/core/file.d.ts.map +1 -0
  347. package/dist/variants/core/file.js +6 -0
  348. package/dist/variants/core/file.js.map +1 -0
  349. package/dist/variants/core/keyvalue.d.ts +3 -0
  350. package/dist/variants/core/keyvalue.d.ts.map +1 -0
  351. package/dist/variants/core/keyvalue.js +9 -0
  352. package/dist/variants/core/keyvalue.js.map +1 -0
  353. package/dist/variants/core/multiselect.d.ts +11 -0
  354. package/dist/variants/core/multiselect.d.ts.map +1 -0
  355. package/dist/variants/core/multiselect.js +15 -0
  356. package/dist/variants/core/multiselect.js.map +1 -0
  357. package/dist/variants/core/number.d.ts +38 -0
  358. package/dist/variants/core/number.d.ts.map +1 -0
  359. package/dist/variants/core/number.js +62 -0
  360. package/dist/variants/core/number.js.map +1 -0
  361. package/dist/variants/core/password.d.ts +11 -0
  362. package/dist/variants/core/password.d.ts.map +1 -0
  363. package/dist/variants/core/password.js +29 -0
  364. package/dist/variants/core/password.js.map +1 -0
  365. package/dist/variants/core/phone.d.ts +3 -0
  366. package/dist/variants/core/phone.d.ts.map +1 -0
  367. package/dist/variants/core/phone.js +14 -0
  368. package/dist/variants/core/phone.js.map +1 -0
  369. package/dist/variants/core/radio.d.ts +8 -0
  370. package/dist/variants/core/radio.d.ts.map +1 -0
  371. package/dist/variants/core/radio.js +34 -0
  372. package/dist/variants/core/radio.js.map +1 -0
  373. package/dist/variants/core/select.d.ts +5 -0
  374. package/dist/variants/core/select.d.ts.map +1 -0
  375. package/dist/variants/core/select.js +11 -0
  376. package/dist/variants/core/select.js.map +1 -0
  377. package/dist/variants/core/slider.d.ts +19 -0
  378. package/dist/variants/core/slider.d.ts.map +1 -0
  379. package/dist/variants/core/slider.js +36 -0
  380. package/dist/variants/core/slider.js.map +1 -0
  381. package/dist/variants/core/text.d.ts +38 -0
  382. package/dist/variants/core/text.d.ts.map +1 -0
  383. package/{src/variants/core/text.tsx → dist/variants/core/text.js} +4 -56
  384. package/dist/variants/core/text.js.map +1 -0
  385. package/dist/variants/core/textarea.d.ts +3 -0
  386. package/dist/variants/core/textarea.d.ts.map +1 -0
  387. package/dist/variants/core/textarea.js +20 -0
  388. package/dist/variants/core/textarea.js.map +1 -0
  389. package/dist/variants/core/toggle.d.ts +6 -0
  390. package/dist/variants/core/toggle.d.ts.map +1 -0
  391. package/dist/variants/core/toggle.js +41 -0
  392. package/dist/variants/core/toggle.js.map +1 -0
  393. package/dist/variants/core/treeselect.d.ts +4 -0
  394. package/dist/variants/core/treeselect.d.ts.map +1 -0
  395. package/dist/variants/core/treeselect.js +7 -0
  396. package/dist/variants/core/treeselect.js.map +1 -0
  397. package/dist/variants/helpers/selection-summary.d.ts +24 -0
  398. package/dist/variants/helpers/selection-summary.d.ts.map +1 -0
  399. package/dist/variants/helpers/selection-summary.js +105 -0
  400. package/dist/variants/helpers/selection-summary.js.map +1 -0
  401. package/dist/variants/index.d.ts +16 -0
  402. package/dist/variants/index.d.ts.map +1 -0
  403. package/{src/variants/index.ts → dist/variants/index.js} +7 -27
  404. package/dist/variants/index.js.map +1 -0
  405. package/dist/variants/registry.d.ts +19 -0
  406. package/dist/variants/registry.d.ts.map +1 -0
  407. package/dist/variants/registry.js +29 -0
  408. package/dist/variants/registry.js.map +1 -0
  409. package/dist/variants/select-shared.d.ts +1 -0
  410. package/dist/variants/select-shared.d.ts.map +1 -0
  411. package/dist/variants/select-shared.js +2 -0
  412. package/dist/variants/select-shared.js.map +1 -0
  413. package/{src/variants/shared.ts → dist/variants/shared.d.ts} +3 -22
  414. package/dist/variants/shared.d.ts.map +1 -0
  415. package/dist/variants/shared.js +3 -0
  416. package/dist/variants/shared.js.map +1 -0
  417. package/package.json +4 -4
  418. package/.scaffold-cache.json +0 -537
  419. package/src/.scaffold-cache.json +0 -544
  420. package/src/adapters/axios.ts +0 -117
  421. package/src/adapters/index.ts +0 -91
  422. package/src/adapters/inertia.ts +0 -187
  423. package/src/core/bound/observe-bound-field.ts +0 -172
  424. package/src/core/bound/wait-for-bound-field.ts +0 -57
  425. package/src/core/core-root.tsx +0 -72
  426. package/src/core/core-shell.tsx +0 -44
  427. package/src/core/errors/index.ts +0 -2
  428. package/src/core/hooks/use-button.ts +0 -220
  429. package/src/core/hooks/use-core-utility.ts +0 -0
  430. package/src/core/hooks/use-field.ts +0 -497
  431. package/src/core/hooks/use-optional-field.ts +0 -28
  432. package/src/core/index.ts +0 -0
  433. package/src/core/registry/binder-registry.ts +0 -82
  434. package/src/core/test.tsx +0 -17
  435. package/src/global.d.ts +0 -14
  436. package/src/input/input-field.tsx +0 -854
  437. package/src/input/input-layout-graph.ts +0 -230
  438. package/src/lib/get-global-countries.ts +0 -87
  439. package/src/lib/utils.ts +0 -6
  440. package/src/presets/index.ts +0 -0
  441. package/src/presets/shadcn-preset.ts +0 -0
  442. package/src/presets/shadcn-variants/checkbox.tsx +0 -849
  443. package/src/presets/shadcn-variants/chips.tsx +0 -756
  444. package/src/presets/shadcn-variants/color.tsx +0 -284
  445. package/src/presets/shadcn-variants/custom.tsx +0 -227
  446. package/src/presets/shadcn-variants/date.tsx +0 -796
  447. package/src/presets/shadcn-variants/file.tsx +0 -764
  448. package/src/presets/shadcn-variants/keyvalue.tsx +0 -556
  449. package/src/presets/shadcn-variants/multiselect.tsx +0 -1132
  450. package/src/presets/shadcn-variants/number.tsx +0 -176
  451. package/src/presets/shadcn-variants/password.tsx +0 -737
  452. package/src/presets/shadcn-variants/phone.tsx +0 -628
  453. package/src/presets/shadcn-variants/radio.tsx +0 -578
  454. package/src/presets/shadcn-variants/select.tsx +0 -956
  455. package/src/presets/shadcn-variants/slider.tsx +0 -622
  456. package/src/presets/shadcn-variants/text.tsx +0 -343
  457. package/src/presets/shadcn-variants/textarea.tsx +0 -66
  458. package/src/presets/shadcn-variants/toggle.tsx +0 -218
  459. package/src/presets/shadcn-variants/treeselect.tsx +0 -784
  460. package/src/presets/ui/badge.tsx +0 -46
  461. package/src/presets/ui/button.tsx +0 -60
  462. package/src/presets/ui/calendar.tsx +0 -214
  463. package/src/presets/ui/checkbox.tsx +0 -115
  464. package/src/presets/ui/custom.tsx +0 -0
  465. package/src/presets/ui/dialog.tsx +0 -141
  466. package/src/presets/ui/field.tsx +0 -246
  467. package/src/presets/ui/input-mask.tsx +0 -739
  468. package/src/presets/ui/input-otp.tsx +0 -77
  469. package/src/presets/ui/input.tsx +0 -1011
  470. package/src/presets/ui/label.tsx +0 -22
  471. package/src/presets/ui/number.tsx +0 -1370
  472. package/src/presets/ui/popover.tsx +0 -46
  473. package/src/presets/ui/radio-group.tsx +0 -43
  474. package/src/presets/ui/scroll-area.tsx +0 -56
  475. package/src/presets/ui/select.tsx +0 -190
  476. package/src/presets/ui/separator.tsx +0 -28
  477. package/src/presets/ui/slider.tsx +0 -61
  478. package/src/presets/ui/switch.tsx +0 -32
  479. package/src/presets/ui/textarea.tsx +0 -634
  480. package/src/presets/ui/time-dropdowns.tsx +0 -350
  481. package/src/schema/field-map.ts +0 -0
  482. package/src/schema/index.ts +0 -0
  483. package/src/schema/presets.ts +0 -0
  484. package/src/variants/core/checkbox.tsx +0 -54
  485. package/src/variants/core/chips.tsx +0 -22
  486. package/src/variants/core/color.tsx +0 -16
  487. package/src/variants/core/date.tsx +0 -25
  488. package/src/variants/core/file.tsx +0 -9
  489. package/src/variants/core/keyvalue.tsx +0 -12
  490. package/src/variants/core/multiselect.tsx +0 -28
  491. package/src/variants/core/number.tsx +0 -115
  492. package/src/variants/core/password.tsx +0 -35
  493. package/src/variants/core/phone.tsx +0 -16
  494. package/src/variants/core/radio.tsx +0 -38
  495. package/src/variants/core/select.tsx +0 -15
  496. package/src/variants/core/slider.tsx +0 -55
  497. package/src/variants/core/textarea.tsx +0 -22
  498. package/src/variants/core/toggle.tsx +0 -50
  499. package/src/variants/core/treeselect.tsx +0 -11
  500. package/src/variants/helpers/selection-summary.tsx +0 -236
  501. package/src/variants/registry.ts +0 -38
  502. package/src/variants/select-shared.ts +0 -0
  503. package/tsconfig.json +0 -14
@@ -1,784 +0,0 @@
1
- import * as React from "react";
2
- import type { VariantBaseProps, ChangeDetail } from "@/variants/shared";
3
- import { cn } from "@/lib/utils";
4
- import { Input } from "@/presets/ui/input";
5
- import { Checkbox } from "@/presets/ui/checkbox";
6
- import { Badge } from "@/presets/ui/badge";
7
- import {
8
- Popover,
9
- PopoverTrigger,
10
- PopoverContent,
11
- } from "@/presets/ui/popover";
12
- import {
13
- ChevronDown,
14
- ChevronRight,
15
- Search,
16
- X,
17
- Folder,
18
- FolderOpen,
19
- File,
20
- Check,
21
- } from "lucide-react";
22
-
23
- type TreeKey = string | number;
24
-
25
- // Updated to support both single and array values
26
- type TreeValue = TreeKey | TreeKey[] | undefined;
27
-
28
- type Size = "sm" | "md" | "lg";
29
- type Density = "compact" | "comfortable" | "loose";
30
-
31
- export type TreeSelectOption =
32
- | TreeKey
33
- | {
34
- label?: React.ReactNode;
35
- value?: TreeKey;
36
- description?: React.ReactNode;
37
- disabled?: boolean;
38
- icon?: React.ReactNode;
39
- children?: TreeSelectOption[];
40
- [key: string]: any;
41
- };
42
-
43
- type NormalizedTreeItem = {
44
- key: string;
45
- value: TreeKey;
46
- labelNode: React.ReactNode;
47
- labelText: string;
48
- description?: React.ReactNode;
49
- disabled?: boolean;
50
- icon?: React.ReactNode;
51
- level: number;
52
- parentValue?: TreeKey;
53
- path: TreeKey[];
54
- hasChildren: boolean;
55
- children: NormalizedTreeItem[];
56
- raw: TreeSelectOption;
57
- };
58
-
59
- // ─────────────────────────────────────────────
60
- // Helpers
61
- // ─────────────────────────────────────────────
62
-
63
- function capitalizeFirst(label: string): string {
64
- if (!label) return label;
65
- return label.charAt(0).toUpperCase() + label.slice(1);
66
- }
67
-
68
- function normalizeTree(
69
- opts: readonly TreeSelectOption[] | undefined,
70
- config: Pick<
71
- ShadcnTreeSelectVariantProps,
72
- | "autoCap"
73
- | "optionLabel"
74
- | "optionValue"
75
- | "optionDescription"
76
- | "optionDisabled"
77
- | "optionIcon"
78
- | "optionKey"
79
- >,
80
- level = 0,
81
- parentValue?: TreeKey,
82
- path: TreeKey[] = []
83
- ): NormalizedTreeItem[] {
84
- if (!opts || !opts.length) return [];
85
-
86
- return opts.map((raw, index) => {
87
- const asObj: any =
88
- typeof raw === "string" || typeof raw === "number"
89
- ? { label: String(raw), value: raw }
90
- : raw;
91
-
92
- const value: TreeKey =
93
- typeof config.optionValue === "function"
94
- ? config.optionValue(raw)
95
- : typeof config.optionValue === "string"
96
- ? (asObj[config.optionValue] as TreeKey)
97
- : (asObj.value ??
98
- asObj.id ??
99
- asObj.key ??
100
- String(index));
101
-
102
- let labelNode: React.ReactNode =
103
- typeof config.optionLabel === "function"
104
- ? config.optionLabel(raw)
105
- : typeof config.optionLabel === "string"
106
- ? asObj[config.optionLabel] ?? asObj.label ?? String(value)
107
- : asObj.label ?? String(value);
108
-
109
- if (config.autoCap && typeof labelNode === "string") {
110
- labelNode = capitalizeFirst(labelNode);
111
- }
112
-
113
- const labelText =
114
- typeof labelNode === "string"
115
- ? labelNode
116
- : typeof labelNode === "number"
117
- ? String(labelNode)
118
- : asObj.labelText ?? String(value);
119
-
120
- const description: React.ReactNode =
121
- typeof config.optionDescription === "function"
122
- ? config.optionDescription(raw)
123
- : typeof config.optionDescription === "string"
124
- ? asObj[config.optionDescription]
125
- : asObj.description;
126
-
127
- const disabled: boolean =
128
- typeof config.optionDisabled === "function"
129
- ? config.optionDisabled(raw)
130
- : typeof config.optionDisabled === "string"
131
- ? !!asObj[config.optionDisabled]
132
- : !!asObj.disabled;
133
-
134
- const icon: React.ReactNode =
135
- typeof config.optionIcon === "function"
136
- ? config.optionIcon(raw)
137
- : typeof config.optionIcon === "string"
138
- ? asObj[config.optionIcon]
139
- : asObj.icon;
140
-
141
- const key: React.Key =
142
- typeof config.optionKey === "function"
143
- ? config.optionKey(raw, index)
144
- : typeof config.optionKey === "string"
145
- ? asObj[config.optionKey] ?? value ?? index
146
- : asObj.key ?? value ?? index;
147
-
148
- const childrenRaw: TreeSelectOption[] | undefined = asObj.children;
149
-
150
- const nextPath = [...path, value];
151
-
152
- const children = normalizeTree(
153
- childrenRaw ?? [],
154
- config,
155
- level + 1,
156
- value,
157
- nextPath
158
- );
159
-
160
- return {
161
- key: String(key),
162
- value,
163
- labelNode,
164
- labelText,
165
- description,
166
- disabled,
167
- icon,
168
- level,
169
- parentValue,
170
- path,
171
- hasChildren: !!children.length,
172
- children,
173
- raw,
174
- };
175
- });
176
- }
177
-
178
- function flattenTree(
179
- nodes: NormalizedTreeItem[]
180
- ): NormalizedTreeItem[] {
181
- const result: NormalizedTreeItem[] = [];
182
-
183
- function recurse(list: NormalizedTreeItem[]) {
184
- for(const node of list) {
185
- result.push(node);
186
- if(node.children.length) {
187
- recurse(node.children);
188
- }
189
- }
190
- }
191
- recurse(nodes);
192
- return result;
193
- }
194
-
195
- function toggleInArray(
196
- arr: TreeKey[] | undefined,
197
- key: TreeKey
198
- ): TreeKey[] | undefined {
199
- const list = arr ?? [];
200
- const idx = list.findIndex((v) => v === key);
201
- if (idx === -1) {
202
- return [...list, key];
203
- }
204
- const next = [...list];
205
- next.splice(idx, 1);
206
- return next.length ? next : undefined;
207
- }
208
-
209
- function triggerHeight(size?: Size) {
210
- switch (size) {
211
- case "sm":
212
- return "min-h-8 text-xs";
213
- case "lg":
214
- return "min-h-11 text-base";
215
- default:
216
- return "min-h-9 text-sm";
217
- }
218
- }
219
-
220
- // ─────────────────────────────────────────────
221
- // Props
222
- // ─────────────────────────────────────────────
223
-
224
- export interface ShadcnTreeSelectVariantProps
225
- extends Pick<
226
- VariantBaseProps<TreeValue>,
227
- | "value"
228
- | "onValue"
229
- | "error"
230
- | "disabled"
231
- | "readOnly"
232
- | "size"
233
- | "density"
234
- > {
235
- options?: TreeSelectOption[];
236
-
237
- /**
238
- * If true, allows multiple selection (checkboxes).
239
- * If false, allows single selection (no checkboxes, closes on select).
240
- * Default: true
241
- */
242
- multiple?: boolean;
243
-
244
- autoCap?: boolean;
245
- optionLabel?: string | ((item: TreeSelectOption) => React.ReactNode);
246
- optionValue?: string | ((item: TreeSelectOption) => TreeKey);
247
- optionDescription?: string | ((item: TreeSelectOption) => React.ReactNode);
248
- optionDisabled?: string | ((item: TreeSelectOption) => boolean);
249
- optionIcon?: string | ((item: TreeSelectOption) => React.ReactNode);
250
- optionKey?: string | ((item: TreeSelectOption, index: number) => React.Key);
251
-
252
- searchable?: boolean;
253
- searchPlaceholder?: string;
254
- emptyLabel?: React.ReactNode;
255
- emptySearchText?: React.ReactNode;
256
- clearable?: boolean;
257
- placeholder?: React.ReactNode;
258
-
259
- className?: string;
260
- triggerClassName?: string;
261
- contentClassName?: string;
262
-
263
- renderOption?: (ctx: {
264
- item: NormalizedTreeItem;
265
- selected: boolean;
266
- index: number;
267
- option: React.ReactNode;
268
- }) => React.ReactNode;
269
-
270
- renderValue?: (ctx: {
271
- selectedItems: NormalizedTreeItem[];
272
- placeholder?: React.ReactNode;
273
- }) => React.ReactNode;
274
-
275
- expandAll?: boolean;
276
- defaultExpandedValues?: TreeKey[];
277
- leafOnly?: boolean;
278
-
279
- // Icons & controls
280
- leadingIcons?: React.ReactNode[];
281
- trailingIcons?: React.ReactNode[];
282
- icon?: React.ReactNode;
283
- iconGap?: number;
284
- leadingIconSpacing?: number;
285
- trailingIconSpacing?: number;
286
-
287
- leadingControl?: React.ReactNode;
288
- trailingControl?: React.ReactNode;
289
- leadingControlClassName?: string;
290
- trailingControlClassName?: string;
291
-
292
- joinControls?: boolean;
293
- extendBoxToControls?: boolean;
294
- }
295
-
296
-
297
- // ─────────────────────────────────────────────
298
- // Component
299
- // ─────────────────────────────────────────────
300
-
301
- export const ShadcnTreeSelectVariant = React.forwardRef<
302
- HTMLButtonElement,
303
- ShadcnTreeSelectVariantProps
304
- >(function ShadcnTreeSelectVariant(props, _ref) {
305
- const {
306
- value,
307
- onValue,
308
- error,
309
- disabled,
310
- readOnly,
311
- size,
312
- density,
313
-
314
- options,
315
- multiple = true, // Default to true to match previous behavior
316
-
317
- autoCap,
318
- optionLabel,
319
- optionValue,
320
- optionDescription,
321
- optionDisabled,
322
- optionIcon,
323
- optionKey,
324
-
325
- searchable = true,
326
- searchPlaceholder,
327
-
328
- emptyLabel,
329
- emptySearchText,
330
-
331
- clearable = true,
332
- placeholder,
333
-
334
- className,
335
- triggerClassName,
336
- contentClassName,
337
-
338
- renderOption,
339
- renderValue,
340
-
341
- expandAll = false,
342
- defaultExpandedValues,
343
- leafOnly = false,
344
-
345
- // Icons & controls
346
- leadingIcons,
347
- trailingIcons,
348
- icon,
349
- iconGap,
350
- leadingIconSpacing,
351
- trailingIconSpacing,
352
- leadingControl,
353
- trailingControl,
354
- leadingControlClassName,
355
- trailingControlClassName,
356
- joinControls = true,
357
- extendBoxToControls = true,
358
- } = props;
359
-
360
- const [open, setOpen] = React.useState(false);
361
- const [query, setQuery] = React.useState("");
362
-
363
- // Normalize tree
364
- const tree = React.useMemo(
365
- () =>
366
- normalizeTree(options ?? [], {
367
- autoCap,
368
- optionLabel,
369
- optionValue,
370
- optionDescription,
371
- optionDisabled,
372
- optionIcon,
373
- optionKey,
374
- }),
375
- [
376
- options,
377
- autoCap,
378
- optionLabel,
379
- optionValue,
380
- optionDescription,
381
- optionDisabled,
382
- optionIcon,
383
- optionKey,
384
- ]
385
- );
386
-
387
- const allNodesFlat = React.useMemo(
388
- () => flattenTree(tree),
389
- [tree]
390
- );
391
-
392
- // Expanded tracking
393
- const initialExpanded = React.useMemo(() => {
394
- if (expandAll) {
395
- return new Set<TreeKey>(
396
- allNodesFlat
397
- .filter((n) => n.hasChildren)
398
- .map((n) => n.value)
399
- );
400
- }
401
- if (defaultExpandedValues?.length) {
402
- return new Set<TreeKey>(defaultExpandedValues);
403
- }
404
- return new Set<TreeKey>();
405
- }, [expandAll, defaultExpandedValues, allNodesFlat]);
406
-
407
- const [expanded, setExpanded] = React.useState<Set<TreeKey>>(initialExpanded);
408
-
409
- const toggleExpanded = React.useCallback(
410
- (key: TreeKey) => {
411
- setExpanded((prev) => {
412
- const next = new Set(prev);
413
- if (next.has(key)) {
414
- next.delete(key);
415
- } else {
416
- next.add(key);
417
- }
418
- return next;
419
- });
420
- },
421
- []
422
- );
423
-
424
- const displayedNodes = React.useMemo(() => {
425
- if (query) {
426
- const q = query.toLowerCase();
427
- const matchSet = new Set<TreeKey>();
428
- const checkMatch = (node: NormalizedTreeItem): boolean => {
429
- const selfMatch = node.labelText.toLowerCase().includes(q);
430
- const childMatch = node.children.some(checkMatch);
431
- if (selfMatch || childMatch) {
432
- matchSet.add(node.value);
433
- node.path.forEach(p => matchSet.add(p));
434
- return true;
435
- }
436
- return false;
437
- };
438
- tree.forEach(checkMatch);
439
- return allNodesFlat.filter(n => matchSet.has(n.value));
440
- }
441
-
442
- return allNodesFlat.filter((node) => {
443
- if (node.level === 0) return true;
444
- for (const ancestorKey of node.path) {
445
- if (!expanded.has(ancestorKey)) return false;
446
- }
447
- return true;
448
- });
449
- }, [allNodesFlat, query, tree, expanded]);
450
-
451
- // Selection State Normalization
452
- const selectedValues = React.useMemo(() => {
453
- if (value === undefined || value === null) return [];
454
- return Array.isArray(value) ? value : [value];
455
- }, [value]);
456
-
457
- const selectedItems = React.useMemo(
458
- () =>
459
- allNodesFlat.filter((node) =>
460
- selectedValues.includes(node.value)
461
- ),
462
- [allNodesFlat, selectedValues]
463
- );
464
-
465
- const isDisabled = disabled || readOnly;
466
-
467
- const handleToggleValue = React.useCallback(
468
- (item: NormalizedTreeItem) => {
469
- if (isDisabled) return;
470
-
471
- // In leafOnly mode, parents toggle expansion instead of selection
472
- if (leafOnly && item.hasChildren) {
473
- toggleExpanded(item.value);
474
- return;
475
- }
476
-
477
- let nextValue: TreeValue;
478
-
479
- if (multiple) {
480
- // Multi-select: toggle in array
481
- nextValue = toggleInArray(selectedValues, item.value);
482
- } else {
483
- // Single-select: set value, close popover
484
- // If clicking same item, do we deselect? usually no for select boxes,
485
- // but let's allow basic switch.
486
- nextValue = item.value;
487
- setOpen(false);
488
- }
489
-
490
- const detail: ChangeDetail = {
491
- source: "variant",
492
- raw: item.raw,
493
- nativeEvent: undefined,
494
- meta: {
495
- toggled: item.value,
496
- selectedValues: Array.isArray(nextValue) ? nextValue : (nextValue ? [nextValue] : []),
497
- },
498
- };
499
-
500
- onValue?.(nextValue, detail);
501
- },
502
- [isDisabled, leafOnly, multiple, selectedValues, onValue, toggleExpanded]
503
- );
504
-
505
- const handleClear = React.useCallback(() => {
506
- if (!onValue) return;
507
- const detail: ChangeDetail = {
508
- source: "variant",
509
- raw: undefined,
510
- nativeEvent: undefined,
511
- meta: { action: "clear" },
512
- };
513
- onValue(undefined, detail);
514
- }, [onValue]);
515
-
516
- const resolvedLeadingIcons = leadingIcons && leadingIcons.length ? leadingIcons : (icon ? [icon] : []);
517
- const resolvedTrailingIcons = trailingIcons ?? [];
518
- const baseIconGap = iconGap ?? 4;
519
- const leadingGap = leadingIconSpacing ?? baseIconGap;
520
- const trailingGap = trailingIconSpacing ?? baseIconGap;
521
- const hasLeadingControl = !!leadingControl;
522
- const hasTrailingControl = !!trailingControl;
523
- const hasControls = hasLeadingControl || hasTrailingControl;
524
- const showClear = clearable && !isDisabled && selectedValues.length > 0;
525
-
526
- // ─────────────────────────────────────────────
527
- // Render: Trigger
528
- // ─────────────────────────────────────────────
529
-
530
- const renderDefaultTriggerContent = () => {
531
- if (!selectedItems.length) {
532
- return <span className="text-muted-foreground">{placeholder ?? "Select..."}</span>;
533
- }
534
-
535
- // Single Select Mode: Just show text
536
- if (!multiple && selectedItems.length === 1) {
537
- return <span className="text-foreground">{selectedItems[0].labelNode}</span>;
538
- }
539
-
540
- // Multi Select Mode: Badges
541
- if (selectedItems.length <= 3) {
542
- return (
543
- <div className="flex flex-wrap gap-1">
544
- {selectedItems.map(item => (
545
- <Badge key={item.key} variant="secondary" className="px-1.5 h-5 text-[10px] font-medium border-border/50 bg-secondary/50">
546
- {item.labelNode}
547
- </Badge>
548
- ))}
549
- </div>
550
- )
551
- }
552
-
553
- return (
554
- <div className="flex items-center gap-1">
555
- <Badge variant="secondary" className="px-1.5 h-5 text-[10px] bg-secondary/50">
556
- {selectedItems.length} selected
557
- </Badge>
558
- </div>
559
- );
560
- }
561
-
562
- const triggerContent = renderValue
563
- ? renderValue({ selectedItems, placeholder })
564
- : renderDefaultTriggerContent();
565
-
566
- const baseBoxClasses = cn(
567
- "flex items-center justify-between border-input w-full min-w-0 rounded-md border bg-background px-3 py-2 text-sm shadow-xs ring-offset-background",
568
- "placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
569
- "disabled:cursor-not-allowed disabled:opacity-50",
570
- "aria-invalid:border-destructive"
571
- );
572
-
573
- const TriggerButton = (
574
- <button
575
- type="button"
576
- disabled={isDisabled}
577
- className={cn(
578
- triggerHeight(size as Size),
579
- hasControls && extendBoxToControls
580
- ? "border-none shadow-none focus:outline-none bg-transparent w-full text-left"
581
- : baseBoxClasses,
582
- triggerClassName
583
- )}
584
- >
585
- <div className="flex w-full items-center justify-between gap-2 overflow-hidden">
586
- <div className="flex flex-1 items-center gap-2 overflow-hidden">
587
- {resolvedLeadingIcons.length > 0 && (
588
- <span className="flex items-center shrink-0" style={{ columnGap: leadingGap }}>
589
- {resolvedLeadingIcons.map((node, idx) => <span key={idx}>{node}</span>)}
590
- </span>
591
- )}
592
- <div className="truncate w-full text-left">
593
- {triggerContent}
594
- </div>
595
- </div>
596
-
597
- <div className="flex items-center gap-1.5 shrink-0">
598
- {showClear && (
599
- <div
600
- role="button"
601
- onClick={(e) => {
602
- e.stopPropagation();
603
- handleClear();
604
- }}
605
- className="text-muted-foreground hover:text-foreground p-0.5 rounded-sm hover:bg-muted transition-colors"
606
- >
607
- <X className="h-3.5 w-3.5" />
608
- </div>
609
- )}
610
- {resolvedTrailingIcons.length > 0 && (
611
- <span className="flex items-center" style={{ columnGap: trailingGap }}>
612
- {resolvedTrailingIcons.map((node, idx) => <span key={idx}>{node}</span>)}
613
- </span>
614
- )}
615
- <ChevronDown className="h-4 w-4 opacity-50" />
616
- </div>
617
- </div>
618
- </button>
619
- );
620
-
621
- // ─────────────────────────────────────────────
622
- // Render: Tree Body
623
- // ─────────────────────────────────────────────
624
-
625
- const TreeBody = (
626
- <div className="max-h-80 w-full overflow-y-auto overflow-x-hidden py-1">
627
- {emptyLabel && tree.length === 0 && !query && (
628
- <div className="px-4 py-3 text-sm text-center text-muted-foreground">
629
- {emptyLabel}
630
- </div>
631
- )}
632
- {tree.length > 0 && displayedNodes.length === 0 && (
633
- <div className="px-4 py-3 text-sm text-center text-muted-foreground">
634
- {emptySearchText ?? "No results found"}
635
- </div>
636
- )}
637
-
638
- {displayedNodes.map((item, index) => {
639
- const selected = selectedValues.includes(item.value);
640
- const isExpanded = expanded.has(item.value);
641
-
642
- return (
643
- <div
644
- key={item.key}
645
- className={cn(
646
- "relative flex items-center gap-2 px-2 py-1.5 text-sm outline-none select-none",
647
- item.disabled ? "opacity-50" : "hover:bg-accent hover:text-accent-foreground cursor-pointer",
648
- selected && !multiple && "bg-accent", // Highlight background if single select
649
- selected && multiple && "bg-accent/50" // Subtler highlight if multi select (checkbox does work)
650
- )}
651
- style={{ paddingLeft: 12 + item.level * 20 }}
652
- onClick={(e) => {
653
- e.preventDefault();
654
- if(!item.disabled) handleToggleValue(item);
655
- }}
656
- >
657
- {/* Guidelines */}
658
- {item.level > 0 && Array.from({ length: item.level }).map((_, i) => (
659
- <div
660
- key={i}
661
- className="absolute border-l border-border/40 h-full top-0"
662
- style={{ left: 19 + i * 20 }}
663
- />
664
- ))}
665
-
666
- {/* Expander */}
667
- <button
668
- type="button"
669
- onClick={(e) => {
670
- e.stopPropagation();
671
- toggleExpanded(item.value);
672
- }}
673
- className={cn(
674
- "z-10 flex h-5 w-5 shrink-0 items-center justify-center rounded-sm text-muted-foreground hover:bg-muted hover:text-foreground transition-colors",
675
- !item.hasChildren && "opacity-0 pointer-events-none"
676
- )}
677
- >
678
- {isExpanded ? <ChevronDown className="h-3.5 w-3.5" /> : <ChevronRight className="h-3.5 w-3.5" />}
679
- </button>
680
-
681
- {/* Checkbox (Multi Only) */}
682
- {multiple && (
683
- <Checkbox
684
- checked={selected}
685
- className="shrink-0 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground"
686
- style={{ pointerEvents: 'none' }}
687
- />
688
- )}
689
-
690
- {/* Icon */}
691
- {item.icon ? (
692
- <span className="text-muted-foreground">{item.icon}</span>
693
- ) : (
694
- item.hasChildren ? (
695
- isExpanded ? <FolderOpen className="h-4 w-4 text-blue-400/80 fill-blue-400/20" /> : <Folder className="h-4 w-4 text-blue-400/80 fill-blue-400/20" />
696
- ) : (
697
- <File className="h-4 w-4 text-muted-foreground/60" />
698
- )
699
- )}
700
-
701
- {/* Label */}
702
- <div className="flex flex-col min-w-0 flex-1">
703
- <span className="truncate font-medium leading-none">
704
- {item.labelNode}
705
- </span>
706
- {item.description && (
707
- <span className="text-xs text-muted-foreground truncate mt-0.5">
708
- {item.description}
709
- </span>
710
- )}
711
- </div>
712
-
713
- {/* Checkmark (Single Only) */}
714
- {!multiple && selected && (
715
- <Check className="h-4 w-4 text-primary ml-auto" />
716
- )}
717
- </div>
718
- );
719
- })}
720
- </div>
721
- );
722
-
723
- const SelectBody = (
724
- <Popover
725
- open={open}
726
- onOpenChange={(next) => {
727
- setOpen(next);
728
- if (!next) setQuery("");
729
- }}
730
- modal={true}
731
- >
732
- <PopoverTrigger asChild>{TriggerButton}</PopoverTrigger>
733
- <PopoverContent
734
- className={cn("p-0 w-(--radix-popover-trigger-width) min-w-[300px]", contentClassName)}
735
- align="start"
736
- >
737
- {searchable && (
738
- <div className="flex items-center border-b px-3 py-2.5">
739
- <Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
740
- <input
741
- autoFocus
742
- className="flex h-4 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50"
743
- value={query}
744
- onChange={(e) => setQuery(e.target.value)}
745
- placeholder={searchPlaceholder ?? "Search..."}
746
- />
747
- </div>
748
- )}
749
- {TreeBody}
750
- </PopoverContent>
751
- </Popover>
752
- );
753
-
754
- if (!hasControls) {
755
- return <div data-slot="tree-select-field" className={cn("w-full", className)}>{SelectBody}</div>;
756
- }
757
-
758
- if (joinControls) {
759
- return (
760
- <div data-slot="tree-select-field" className={cn("w-full", className)}>
761
- <div className={cn(
762
- "flex items-center w-full rounded-md border border-input bg-background shadow-xs focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 ring-offset-background",
763
- isDisabled && "opacity-50 cursor-not-allowed bg-muted"
764
- )}>
765
- {hasLeadingControl && <div className={cn("pl-3 pr-1 text-muted-foreground", leadingControlClassName)}>{leadingControl}</div>}
766
- <div className="flex-1 min-w-0">{SelectBody}</div>
767
- {hasTrailingControl && <div className={cn("pr-3 pl-1 text-muted-foreground", trailingControlClassName)}>{trailingControl}</div>}
768
- </div>
769
- </div>
770
- );
771
- }
772
-
773
- return (
774
- <div className={cn("flex items-center gap-2 w-full", className)}>
775
- {hasLeadingControl && leadingControl}
776
- <div className="flex-1 min-w-0">{SelectBody}</div>
777
- {hasTrailingControl && trailingControl}
778
- </div>
779
- );
780
- });
781
-
782
- ShadcnTreeSelectVariant.displayName = "ShadcnTreeSelectVariant";
783
-
784
- export default ShadcnTreeSelectVariant;