@timeax/form-palette 0.0.2 → 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 +5 -5
  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,796 +0,0 @@
1
- import * as React from "react";
2
- import { Calendar as CalendarIcon, X as XIcon } from "lucide-react";
3
-
4
- import type { VariantBaseProps, ChangeDetail } from "@/variants/shared";
5
- import type { ShadcnTextVariantProps } from "@/presets/shadcn-variants/text";
6
- import { Input } from "@/presets/ui/input";
7
- import { Popover, PopoverTrigger, PopoverContent } from "@/presets/ui/popover";
8
- import { Calendar } from "@/presets/ui/calendar";
9
- import { TimeDropdowns } from "../ui/time-dropdowns";
10
-
11
- type DateMode = "single" | "range";
12
-
13
- export interface DateRange {
14
- from?: Date;
15
- to?: Date;
16
- }
17
-
18
- type DateValue = Date | DateRange | undefined;
19
-
20
- type BaseProps = VariantBaseProps<DateValue>;
21
-
22
- // Calendar disabled type from your calendar wrapper
23
- type DisabledDays = React.ComponentProps<typeof Calendar>["disabled"];
24
-
25
- /**
26
- * Logical temporal "kind" for the field.
27
- *
28
- * This controls the default mask + formatting/parsing.
29
- *
30
- * - "date" → yyyy-MM-dd (default)
31
- * - "datetime" → yyyy-MM-dd HH:mm
32
- * - "time" → HH:mm
33
- * - "hour" → HH
34
- * - "monthYear" → MM/yyyy
35
- * - "year" → yyyy
36
- */
37
- export type DateKind =
38
- | "date"
39
- | "datetime"
40
- | "time"
41
- | "hour"
42
- | "monthYear"
43
- | "year"
44
- | (string & {});
45
-
46
- /**
47
- * Public props for the date variant (legacy + mask extensions).
48
- */
49
- export interface DateVariantProps {
50
- mode?: DateMode;
51
- placeholder?: React.ReactNode;
52
-
53
- clearable?: boolean;
54
-
55
- minDate?: Date;
56
- maxDate?: Date;
57
- disabledDays?: DisabledDays;
58
-
59
- /**
60
- * Pattern for single dates.
61
- *
62
- * Tokens:
63
- * - yyyy → full year
64
- * - MM → month (01–12)
65
- * - dd → day (01–31)
66
- * - HH → hours (00–23)
67
- * - mm → minutes (00–59)
68
- *
69
- * Default depends on `kind`:
70
- * - date → "yyyy-MM-dd"
71
- * - datetime → "yyyy-MM-dd HH:mm"
72
- * - time → "HH:mm"
73
- * - hour → "HH"
74
- * - monthYear → "MM/yyyy"
75
- * - year → "yyyy"
76
- */
77
- formatSingle?: string;
78
-
79
- /**
80
- * String pattern or custom formatter for ranges.
81
- *
82
- * - string → same token rules as formatSingle, applied to both ends
83
- * - function → full control over display text
84
- */
85
- formatRange?:
86
- | string
87
- | ((range: DateRange | undefined) => string);
88
-
89
- /**
90
- * Separator when formatRange is a string pattern.
91
- * Default: " – "
92
- */
93
- rangeSeparator?: string;
94
-
95
- /**
96
- * When true, keep the calendar open after a selection.
97
- *
98
- * For range mode, the picker also stays open until both
99
- * `from` and `to` are chosen.
100
- */
101
- stayOpenOnSelect?: boolean;
102
-
103
- /**
104
- * Controlled open state for the popover.
105
- */
106
- open?: boolean;
107
- onOpenChange?(o: boolean): void;
108
-
109
- /**
110
- * Temporal kind (controls default mask + formatting/parsing).
111
- *
112
- * Default: "date".
113
- */
114
- kind?: DateKind;
115
-
116
- /**
117
- * Optional explicit input mask pattern for the text input.
118
- *
119
- * If omitted, a sensible default based on `kind` is used.
120
- *
121
- * Mask tokens follow the same rules as the underlying Input mask:
122
- * 9 = digit, a = letter, * = alphanumeric.
123
- */
124
- inputMask?: string;
125
-
126
- /**
127
- * Whether to render the calendar popover.
128
- *
129
- * Defaults:
130
- * - true for `kind` = "date" | "datetime"
131
- * - false for time-only kinds ("time", "hour", "monthYear", "year")
132
- */
133
- showCalendar?: boolean;
134
- }
135
-
136
- /**
137
- * We still reuse the Shadcn text UI props (size, density, icons, etc.),
138
- * but we take over type/value/onValue and the controls.
139
- */
140
- type TextUiProps = Omit<
141
- ShadcnTextVariantProps,
142
- | "type"
143
- | "inputMode"
144
- | "leadingControl"
145
- | "trailingControl"
146
- | "value"
147
- | "onValue"
148
- >;
149
-
150
- /**
151
- * Full props for the Shadcn-based date variant.
152
- */
153
- export type ShadcnDateVariantProps = TextUiProps &
154
- DateVariantProps &
155
- Pick<BaseProps, "value" | "onValue" | "error">;
156
-
157
- // ─────────────────────────────────────────────
158
- // Helpers
159
- // ─────────────────────────────────────────────
160
-
161
- function isRange(value: DateValue): value is DateRange {
162
- return !!value && !(value instanceof Date);
163
- }
164
-
165
- function normalizeValueForMode(
166
- value: DateValue,
167
- mode: DateMode,
168
- ): { single: Date | undefined; range: DateRange | undefined } {
169
- if (mode === "single") {
170
- if (value instanceof Date) {
171
- return { single: value, range: undefined };
172
- }
173
- if (isRange(value)) {
174
- // prefer "from" when coming from a range
175
- return { single: value.from ?? value.to, range: undefined };
176
- }
177
- return { single: undefined, range: undefined };
178
- }
179
-
180
- // range mode
181
- if (isRange(value)) {
182
- return { single: undefined, range: value };
183
- }
184
- if (value instanceof Date) {
185
- return { single: undefined, range: { from: value } };
186
- }
187
- return { single: undefined, range: undefined };
188
- }
189
-
190
- function hasSelection(value: DateValue): boolean {
191
- if (!value) return false;
192
- if (value instanceof Date) return true;
193
- return !!value.from || !!value.to;
194
- }
195
-
196
- function isRangeComplete(range: DateRange | undefined): boolean {
197
- return !!(range && range.from && range.to);
198
- }
199
-
200
- function pad2(n: number): string {
201
- return n.toString().padStart(2, "0");
202
- }
203
-
204
- interface KindConfig {
205
- mask: string;
206
- singlePattern: string;
207
- }
208
-
209
- function resolveKindConfig(kind: DateKind | undefined): KindConfig {
210
- const k = (kind ?? "date") as DateKind;
211
-
212
- switch (k) {
213
- case "datetime":
214
- return {
215
- mask: "9999-99-99 99:99",
216
- singlePattern: "yyyy-MM-dd HH:mm",
217
- };
218
- case "time":
219
- return {
220
- mask: "99:99",
221
- singlePattern: "HH:mm",
222
- };
223
- case "hour":
224
- return {
225
- mask: "99",
226
- singlePattern: "HH",
227
- };
228
- case "monthYear":
229
- return {
230
- mask: "99/9999",
231
- singlePattern: "MM/yyyy",
232
- };
233
- case "year":
234
- return {
235
- mask: "9999",
236
- singlePattern: "yyyy",
237
- };
238
- case "date":
239
- default:
240
- return {
241
- mask: "9999-99-99",
242
- singlePattern: "yyyy-MM-dd",
243
- };
244
- }
245
- }
246
-
247
- function formatDateWithPattern(
248
- date: Date,
249
- pattern: string | undefined,
250
- ): string {
251
- const p = pattern ?? "yyyy-MM-dd";
252
-
253
- const yyyy = date.getFullYear().toString();
254
- const MM = pad2(date.getMonth() + 1);
255
- const dd = pad2(date.getDate());
256
- const HH = pad2(date.getHours());
257
- const mm = pad2(date.getMinutes());
258
-
259
- return p
260
- .replace(/yyyy/g, yyyy)
261
- .replace(/MM/g, MM)
262
- .replace(/dd/g, dd)
263
- .replace(/HH/g, HH)
264
- .replace(/mm/g, mm);
265
- }
266
-
267
- function formatDisplaySingle(
268
- date: Date | undefined,
269
- pattern?: string,
270
- ): string {
271
- if (!date) return "";
272
- return formatDateWithPattern(date, pattern);
273
- }
274
-
275
- function formatDisplayRange(
276
- range: DateRange | undefined,
277
- formatRange: DateVariantProps["formatRange"],
278
- singlePattern?: string,
279
- separator?: string,
280
- ): string {
281
- if (!range || (!range.from && !range.to)) return "";
282
-
283
- if (typeof formatRange === "function") {
284
- return formatRange(range);
285
- }
286
-
287
- const pattern = formatRange ?? singlePattern ?? "yyyy-MM-dd";
288
- const sep = separator ?? " – ";
289
-
290
- const fromStr = range.from
291
- ? formatDateWithPattern(range.from, pattern)
292
- : "";
293
- const toStr = range.to
294
- ? formatDateWithPattern(range.to, pattern)
295
- : "";
296
-
297
- if (!fromStr && !toStr) return "";
298
- if (!fromStr) return toStr;
299
- if (!toStr) return fromStr;
300
-
301
- return `${fromStr}${sep}${toStr}`;
302
- }
303
-
304
- /**
305
- * Parse a raw digit string (unmasked) into a Date based on `kind`.
306
- *
307
- * Returns null when the input is incomplete or invalid.
308
- */
309
- function parseRawToDate(rawDigits: string, kind: DateKind): Date | null {
310
- const len = rawDigits.length;
311
-
312
- switch (kind) {
313
- case "datetime": {
314
- if (len < 12) return null;
315
- const year = Number(rawDigits.slice(0, 4));
316
- const month = Number(rawDigits.slice(4, 6));
317
- const day = Number(rawDigits.slice(6, 8));
318
- const hour = Number(rawDigits.slice(8, 10));
319
- const minute = Number(rawDigits.slice(10, 12));
320
- if (!year || month < 1 || month > 12 || day < 1 || day > 31) {
321
- return null;
322
- }
323
- if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {
324
- return null;
325
- }
326
- return new Date(year, month - 1, day, hour, minute, 0, 0);
327
- }
328
-
329
- case "time": {
330
- if (len < 4) return null;
331
- const hour = Number(rawDigits.slice(0, 2));
332
- const minute = Number(rawDigits.slice(2, 4));
333
- if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {
334
- return null;
335
- }
336
- const d = new Date();
337
- d.setSeconds(0, 0);
338
- d.setHours(hour, minute);
339
- return d;
340
- }
341
-
342
- case "hour": {
343
- if (len < 2) return null;
344
- const hour = Number(rawDigits.slice(0, 2));
345
- if (hour < 0 || hour > 23) return null;
346
- const d = new Date();
347
- d.setSeconds(0, 0);
348
- d.setHours(hour, 0);
349
- return d;
350
- }
351
-
352
- case "monthYear": {
353
- if (len < 6) return null;
354
- const month = Number(rawDigits.slice(0, 2));
355
- const year = Number(rawDigits.slice(2, 6));
356
- if (!year || month < 1 || month > 12) {
357
- return null;
358
- }
359
- return new Date(year, month - 1, 1, 0, 0, 0, 0);
360
- }
361
-
362
- case "year": {
363
- if (len < 4) return null;
364
- const year = Number(rawDigits.slice(0, 4));
365
- if (!year) return null;
366
- return new Date(year, 0, 1, 0, 0, 0, 0);
367
- }
368
-
369
- case "date":
370
- default: {
371
- if (len < 8) return null;
372
- const year = Number(rawDigits.slice(0, 4));
373
- const month = Number(rawDigits.slice(4, 6));
374
- const day = Number(rawDigits.slice(6, 8));
375
- if (!year || month < 1 || month > 12 || day < 1 || day > 31) {
376
- return null;
377
- }
378
- return new Date(year, month - 1, day, 0, 0, 0, 0);
379
- }
380
- }
381
- }
382
-
383
- function meterSafeDigits(masked: string): string {
384
- return masked.replace(/\D+/g, "");
385
- }
386
-
387
- // ─────────────────────────────────────────────
388
- // Component
389
- // ─────────────────────────────────────────────
390
-
391
- export const ShadcnDateVariant = React.forwardRef<
392
- HTMLInputElement,
393
- ShadcnDateVariantProps
394
- >(function ShadcnDateVariant(props, ref) {
395
- const {
396
- // variant base bits
397
- value,
398
- onValue,
399
- error,
400
-
401
- // date props
402
- mode: modeProp = "single",
403
- placeholder,
404
- clearable = true,
405
- minDate,
406
- maxDate,
407
- disabledDays,
408
- formatSingle: formatSingleProp,
409
- formatRange,
410
- rangeSeparator,
411
- stayOpenOnSelect,
412
- open,
413
- onOpenChange,
414
-
415
- kind: kindProp = "date",
416
- inputMask,
417
- showCalendar: showCalendarProp,
418
-
419
- //@ts-ignore text UI bits (size, density, className, icons, etc.)
420
- className,
421
- ...restTextProps
422
- } = props;
423
-
424
- const mode: DateMode = modeProp ?? "single";
425
- const kind: DateKind = kindProp ?? "date";
426
-
427
- const kindConfig = resolveKindConfig(kind);
428
- const singlePattern = formatSingleProp ?? kindConfig.singlePattern;
429
- const resolvedMask = inputMask ?? kindConfig.mask;
430
-
431
- const defaultShowCalendar =
432
- kind === "date" || kind === "datetime";
433
- const showCalendar =
434
- typeof showCalendarProp === "boolean"
435
- ? showCalendarProp
436
- : defaultShowCalendar;
437
-
438
- const [internalOpen, setInternalOpen] = React.useState(false);
439
- const isControlledOpen = open !== undefined;
440
- const currentOpen = isControlledOpen ? !!open : internalOpen;
441
-
442
- const handleOpenChange = React.useCallback(
443
- (next: boolean) => {
444
- if (!isControlledOpen) {
445
- setInternalOpen(next);
446
- }
447
- onOpenChange?.(next);
448
- },
449
- [isControlledOpen, onOpenChange],
450
- );
451
-
452
- const { single, range } = normalizeValueForMode(value, mode);
453
-
454
- const displayValue = React.useMemo(() => {
455
- if (mode === "single") {
456
- return formatDisplaySingle(single, singlePattern);
457
- }
458
- return formatDisplayRange(
459
- range,
460
- formatRange,
461
- singlePattern,
462
- rangeSeparator,
463
- );
464
- }, [mode, single, range, singlePattern, formatRange, rangeSeparator]);
465
-
466
- const [localText, setLocalText] = React.useState<string>(displayValue);
467
-
468
- // Sync local text with external value / formatting
469
- React.useEffect(() => {
470
- setLocalText(displayValue);
471
- }, [displayValue]);
472
-
473
- // Time dropdown visibility:
474
- // - Only for mode="single"
475
- // - For datetime/time/hour kinds
476
- const showTimeDropdowns =
477
- mode === "single" &&
478
- (kind === "datetime" || kind === "time" || kind === "hour");
479
-
480
- const handleSelect = React.useCallback(
481
- (next: Date | DateRange | undefined) => {
482
- let nextValue: DateValue;
483
- let nextRange: DateRange | undefined;
484
-
485
- if (mode === "single") {
486
- if (next instanceof Date) {
487
- let selected = next;
488
-
489
- // For datetime, preserve previously chosen time (if any)
490
- if (kind === "datetime" && single) {
491
- selected = new Date(
492
- selected.getFullYear(),
493
- selected.getMonth(),
494
- selected.getDate(),
495
- single.getHours(),
496
- single.getMinutes(),
497
- single.getSeconds(),
498
- 0,
499
- );
500
- }
501
-
502
- nextValue = selected;
503
- } else {
504
- nextValue = undefined;
505
- }
506
- nextRange = undefined;
507
- } else {
508
- if (next && next instanceof Date) {
509
- nextRange = { from: next };
510
- } else {
511
- nextRange = (next as DateRange | undefined) ?? undefined;
512
- }
513
- nextValue = nextRange;
514
- }
515
-
516
- const rangeComplete =
517
- mode === "range" ? isRangeComplete(nextRange) : !!nextValue;
518
-
519
- const detail: ChangeDetail<{
520
- mode: DateMode;
521
- from: "calendar";
522
- rangeComplete: boolean;
523
- }> = {
524
- source: "variant",
525
- raw: nextValue,
526
- nativeEvent: undefined,
527
- meta: {
528
- mode,
529
- from: "calendar",
530
- rangeComplete,
531
- },
532
- };
533
-
534
- onValue?.(nextValue, detail);
535
-
536
- const shouldStayOpen =
537
- stayOpenOnSelect ||
538
- (mode === "range" && !rangeComplete);
539
-
540
- if (!shouldStayOpen) {
541
- handleOpenChange(false);
542
- }
543
- },
544
- [mode, stayOpenOnSelect, onValue, handleOpenChange, kind, single],
545
- );
546
-
547
- const handleTimeChange = React.useCallback(
548
- (next: Date | undefined) => {
549
- if (!next) {
550
- const detail: ChangeDetail<{
551
- mode: DateMode;
552
- kind: DateKind;
553
- from: "time";
554
- cleared: boolean;
555
- }> = {
556
- source: "variant",
557
- raw: undefined,
558
- nativeEvent: undefined,
559
- meta: {
560
- mode,
561
- kind,
562
- from: "time",
563
- cleared: true,
564
- },
565
- };
566
- onValue?.(undefined, detail);
567
- return;
568
- }
569
-
570
- const detail: ChangeDetail<{
571
- mode: DateMode;
572
- kind: DateKind;
573
- from: "time";
574
- }> = {
575
- source: "variant",
576
- raw: next,
577
- nativeEvent: undefined,
578
- meta: {
579
- mode,
580
- kind,
581
- from: "time",
582
- },
583
- };
584
-
585
- onValue?.(next, detail);
586
- },
587
- [mode, kind, onValue],
588
- );
589
-
590
- const handleClear = React.useCallback(
591
- (ev: React.MouseEvent) => {
592
- ev.preventDefault();
593
- ev.stopPropagation();
594
-
595
- const detail: ChangeDetail<{
596
- mode: DateMode;
597
- cleared: boolean;
598
- }> = {
599
- source: "variant",
600
- raw: undefined,
601
- nativeEvent: ev as any,
602
- meta: {
603
- mode,
604
- cleared: true,
605
- },
606
- };
607
- onValue?.(undefined, detail);
608
- },
609
- [mode, onValue],
610
- );
611
-
612
- const hasValue = hasSelection(value);
613
- const placeholderText =
614
- typeof placeholder === "string"
615
- ? placeholder
616
- : mode === "range"
617
- ? "Select date range"
618
- : "Select date";
619
-
620
- /**
621
- * Manual text input (mask-driven) — only for `mode = "single"`.
622
- * Range editing via text gets very hairy, so we keep range as
623
- * a calendar-driven control for now.
624
- */
625
- const handleInputChange = React.useCallback(
626
- (event: any) => {
627
- if (mode !== "single") return;
628
-
629
- const masked = (event?.value ??
630
- event?.target?.value ??
631
- "") as string;
632
-
633
- setLocalText(masked);
634
-
635
- const digits = meterSafeDigits(masked);
636
-
637
- if (!digits.length) {
638
- const detail: ChangeDetail<{
639
- mode: DateMode;
640
- kind: DateKind;
641
- from: "text";
642
- cleared: boolean;
643
- }> = {
644
- source: "variant",
645
- raw: undefined,
646
- nativeEvent: event,
647
- meta: {
648
- mode,
649
- kind,
650
- from: "text",
651
- cleared: true,
652
- },
653
- };
654
- onValue?.(undefined, detail);
655
- return;
656
- }
657
-
658
- const parsed = parseRawToDate(digits, kind);
659
- if (!parsed) {
660
- // Incomplete or invalid — keep local text but don't
661
- // push a Date value yet.
662
- return;
663
- }
664
-
665
- // If min/max are set, enforce them here.
666
- if (minDate && parsed < minDate) return;
667
- if (maxDate && parsed > maxDate) return;
668
-
669
- const detail: ChangeDetail<{
670
- mode: DateMode;
671
- kind: DateKind;
672
- from: "text";
673
- }> = {
674
- source: "variant",
675
- raw: parsed,
676
- nativeEvent: event,
677
- meta: {
678
- mode,
679
- kind,
680
- from: "text",
681
- },
682
- };
683
-
684
- onValue?.(parsed, detail);
685
- },
686
- [mode, kind, minDate, maxDate, onValue],
687
- );
688
-
689
- const trailingControl = (
690
- <div
691
- className="flex h-full items-center gap-1 pr-1"
692
- data-slot="date-controls"
693
- >
694
- {clearable && hasValue && (
695
- <button
696
- type="button"
697
- onClick={handleClear}
698
- className="inline-flex h-6 w-6 items-center justify-center rounded-full text-xs text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1"
699
- aria-label="Clear date"
700
- data-slot="date-clear"
701
- >
702
- <XIcon className="h-3 w-3" />
703
- </button>
704
- )}
705
-
706
- {showCalendar && (
707
- <button
708
- type="button"
709
- onClick={() => handleOpenChange(!currentOpen)}
710
- className="inline-flex h-6 w-6 items-center justify-center rounded-full text-xs text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1"
711
- aria-label="Open calendar"
712
- data-slot="date-toggle"
713
- >
714
- <CalendarIcon className="h-4 w-4" />
715
- </button>
716
- )}
717
- </div>
718
- );
719
-
720
- const inputNode = (
721
- <Input
722
- ref={ref}
723
- {...restTextProps}
724
- type="text"
725
- value={localText}
726
- onChange={mode === "single" ? (handleInputChange as any) : undefined}
727
- readOnly={mode !== "single" && showCalendar}
728
- placeholder={placeholderText}
729
- trailingControl={trailingControl}
730
- aria-invalid={error ? "true" : undefined}
731
- // Mask only makes sense when we allow typing.
732
- mask={mode === "single" ? resolvedMask : undefined}
733
- />
734
- );
735
-
736
- // If calendar is disabled completely, just render the masked input.
737
- if (!showCalendar) {
738
- return (
739
- <div className={className} data-slot="date-field">
740
- {inputNode}
741
- </div>
742
- );
743
- }
744
-
745
- const showCalendarBody = kind !== "time" && kind !== "hour";
746
-
747
- // Calendar / time popover.
748
- return (
749
- <Popover open={currentOpen} onOpenChange={handleOpenChange}>
750
- <PopoverTrigger asChild>
751
- <div className={className} data-slot="date-field">
752
- {inputNode}
753
- </div>
754
- </PopoverTrigger>
755
- <PopoverContent
756
- align="start"
757
- className="w-auto p-0"
758
- data-slot="date-popover"
759
- >
760
- <div className="flex flex-col gap-2 p-2">
761
- {showCalendarBody && (
762
- <Calendar
763
- mode={mode}
764
- //@ts-ignore date UI bits
765
- selected={mode === "single" ? single : range}
766
- onSelect={handleSelect as any}
767
- disabled={disabledDays}
768
- fromDate={minDate}
769
- toDate={maxDate}
770
- initialFocus
771
- />
772
- )}
773
-
774
- {showTimeDropdowns && (
775
- <TimeDropdowns
776
- value={single ?? undefined}
777
- onChange={handleTimeChange}
778
- label={
779
- kind === "datetime"
780
- ? "Time"
781
- : undefined
782
- }
783
- minuteStep={5}
784
- showSeconds={false}
785
- density="compact"
786
- />
787
- )}
788
- </div>
789
- </PopoverContent>
790
- </Popover>
791
- );
792
- });
793
-
794
- ShadcnDateVariant.displayName = "ShadcnDateVariant";
795
-
796
- export default ShadcnDateVariant;