@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,737 +0,0 @@
1
- // src/presets/shadcn-variants/password.tsx
2
-
3
- import * as React from "react";
4
-
5
- import type { VariantBaseProps, ChangeDetail } from "@/variants/shared";
6
- import type { ShadcnTextVariantProps } from "@/presets/shadcn-variants/text";
7
- import { Input } from "@/presets/ui/input";
8
- import { cn } from "@/lib/utils";
9
- import { Eye, EyeOff, Check } from "lucide-react";
10
-
11
- type BaseProps = VariantBaseProps<string | undefined>;
12
-
13
- /**
14
- * Options for the built-in password strength meter.
15
- *
16
- * NOTE: Score is always in the range 0–4 (inclusive).
17
- */
18
- export interface StrengthOptions {
19
- /**
20
- * Custom scoring function.
21
- * Return a number in the range 0–4 (inclusive) where 0 = weakest, 4 = strongest.
22
- */
23
- calc?: (value: string) => number;
24
-
25
- /**
26
- * Labels for each score bucket (index 0..4).
27
- * Defaults to: ["Very weak", "Weak", "Okay", "Good", "Strong"]
28
- */
29
- labels?: [string, string, string, string, string];
30
-
31
- /**
32
- * Thresholds for score steps using a 0–100 bar.
33
- * Defaults to [0, 25, 50, 75, 100] mapping to scores 0..4 respectively.
34
- */
35
- thresholds?: [number, number, number, number, number];
36
-
37
- /**
38
- * Minimum score required to consider the password acceptable (0–4).
39
- * This is purely visual unless you enforce it in validate/onChange.
40
- * Default: 2
41
- */
42
- minScore?: number | 2;
43
-
44
- /**
45
- * Whether to show the textual label next to/under the bar.
46
- * Default: true
47
- */
48
- showLabel?: boolean;
49
-
50
- /**
51
- * Where to render the meter.
52
- * - "inline" → compact row under the input
53
- * - "block" → stacked with more spacing
54
- * Default: "inline"
55
- */
56
- display?: "inline" | "block";
57
- }
58
-
59
- /** Heuristic length/charset score: fast, dependency-free. Returns 0..4. */
60
- function defaultScore(pw: string): number {
61
- if (!pw) return 0;
62
- let score = 0;
63
-
64
- // length
65
- if (pw.length >= 8) score++;
66
- if (pw.length >= 12) score++;
67
-
68
- // diversity
69
- const hasLower = /[a-z]/.test(pw);
70
- const hasUpper = /[A-Z]/.test(pw);
71
- const hasDigit = /\d/.test(pw);
72
- const hasSymbol = /[^A-Za-z0-9]/.test(pw);
73
-
74
- const variety = [hasLower, hasUpper, hasDigit, hasSymbol].filter(Boolean)
75
- .length;
76
- if (variety >= 2) score++;
77
- if (variety >= 3) score++;
78
-
79
- // Cap at 4
80
- return Math.max(0, Math.min(4, score));
81
- }
82
-
83
- const DEFAULT_LABELS: [string, string, string, string, string] = [
84
- "Very weak",
85
- "Weak",
86
- "Okay",
87
- "Good",
88
- "Strong",
89
- ];
90
-
91
- const DEFAULT_THRESHOLDS: [number, number, number, number, number] = [
92
- 0, 25, 50, 75, 100,
93
- ];
94
-
95
- function normalizeStrengthOptions(
96
- raw: boolean | StrengthOptions | undefined,
97
- ): StrengthOptions | null {
98
- if (!raw) return null;
99
-
100
- const base: StrengthOptions = {
101
- calc: defaultScore,
102
- labels: DEFAULT_LABELS,
103
- thresholds: DEFAULT_THRESHOLDS,
104
- minScore: 2,
105
- showLabel: true,
106
- display: "inline",
107
- };
108
-
109
- if (raw === true) {
110
- return base;
111
- }
112
-
113
- return {
114
- ...base,
115
- ...raw,
116
- labels: raw.labels ?? base.labels,
117
- thresholds: raw.thresholds ?? base.thresholds,
118
- minScore: raw.minScore ?? base.minScore,
119
- showLabel: raw.showLabel ?? base.showLabel,
120
- display: raw.display ?? base.display,
121
- };
122
- }
123
-
124
- // ─────────────────────────────────────────────
125
- // Definition map / rules
126
- // ─────────────────────────────────────────────
127
-
128
- export interface PasswordRuleConfig {
129
- /**
130
- * Pattern used to decide if the rule passes.
131
- */
132
- pattern: RegExp;
133
-
134
- /**
135
- * If true, the rule is considered optional (recommendation).
136
- * Default: false unless the rule name is not prefixed with "!".
137
- */
138
- optional?: boolean;
139
-
140
- /**
141
- * Weight in the scoring (relative importance).
142
- * Default: 1, doubled if the use key is prefixed with "!".
143
- */
144
- weight?: number;
145
-
146
- /**
147
- * Short label for the rule (e.g. "At least 8 characters").
148
- * Defaults to the map key if omitted.
149
- */
150
- label?: string;
151
-
152
- /**
153
- * Longer description, used in detailed rule view.
154
- */
155
- description?: string;
156
- }
157
-
158
- /**
159
- * A definition entry can be:
160
- * - string → treated as a regex source
161
- * - RegExp → used directly
162
- * - full config
163
- */
164
- export type PasswordRuleDefinition =
165
- | string
166
- | RegExp
167
- | PasswordRuleConfig;
168
-
169
- /**
170
- * Map of alias/keys → definition entries.
171
- */
172
- export type PasswordDefinitionMap = Record<string, PasswordRuleDefinition>;
173
-
174
- // Default rule definitions used by the meter.
175
- const DEFAULT_RULE_DEFINITIONS: PasswordDefinitionMap = {
176
- "length-8": {
177
- pattern: /.{8,}/,
178
- label: "8+ chars",
179
- description: "Use at least 8 characters.",
180
- },
181
- "length-12": {
182
- pattern: /.{12,}/,
183
- optional: true,
184
- label: "12+ chars",
185
- description: "Use 12 or more characters for stronger security.",
186
- },
187
- lower: {
188
- pattern: /[a-z]/,
189
- label: "Lowercase",
190
- description: "Include at least one lowercase letter (a–z).",
191
- },
192
- upper: {
193
- pattern: /[A-Z]/,
194
- label: "Uppercase",
195
- description: "Include at least one uppercase letter (A–Z).",
196
- },
197
- digit: {
198
- pattern: /\d/,
199
- label: "Number",
200
- description: "Include at least one digit (0–9).",
201
- },
202
- symbol: {
203
- pattern: /[^A-Za-z0-9]/,
204
- label: "Symbol",
205
- description: "Include at least one symbol (e.g. !, @, #, ?).",
206
- },
207
- "no-space": {
208
- pattern: /^\S+$/,
209
- optional: true,
210
- label: "No spaces",
211
- description: "Avoid spaces in your password.",
212
- },
213
- };
214
-
215
- /**
216
- * Merge default → global → local rule definitions.
217
- *
218
- * - DEFAULT_RULE_DEFINITIONS
219
- * - window["form-palette"]?.ruleDefinition
220
- * - props.ruleDefinitions
221
- */
222
- function getMergedRuleDefinitions(
223
- local?: PasswordDefinitionMap,
224
- ): PasswordDefinitionMap {
225
- let merged: PasswordDefinitionMap = { ...DEFAULT_RULE_DEFINITIONS };
226
-
227
- if (typeof window !== "undefined") {
228
- const fp = (window as any)["form-palette"];
229
- const globalDefs = fp?.ruleDefinition as
230
- | PasswordDefinitionMap
231
- | undefined;
232
-
233
- if (globalDefs && typeof globalDefs === "object") {
234
- merged = { ...merged, ...globalDefs };
235
- }
236
- }
237
-
238
- if (local && typeof local === "object") {
239
- merged = { ...merged, ...local };
240
- }
241
-
242
- return merged;
243
- }
244
-
245
- /**
246
- * Internal normalized state for a single rule.
247
- */
248
- interface NormalizedRuleState {
249
- key: string;
250
- label: string;
251
- description?: string;
252
- optional: boolean;
253
- required: boolean;
254
- weight: number;
255
- passed: boolean;
256
- }
257
-
258
- /**
259
- * Props passed to custom meter renderers.
260
- */
261
- export interface PasswordMeterRenderProps {
262
- /** Raw password value. */
263
- value: string;
264
- /** Bucket score 0..4 based on percent + thresholds. */
265
- score: number;
266
- /** 0–100 progress used for the bar. */
267
- percent: number;
268
- /** Human label for the current score. */
269
- label: string;
270
- /** Whether score >= minScore. */
271
- passed: boolean;
272
- /** Effective minScore after normalization. */
273
- minScore: number;
274
- /** Effective thresholds used for bucketing. */
275
- thresholds: [number, number, number, number, number];
276
- /** Effective labels used. */
277
- labels: [string, string, string, string, string];
278
- /** Rule-level details when using a definition map. */
279
- rules: NormalizedRuleState[];
280
- }
281
-
282
- /**
283
- * Password-only props (on top of Shadcn text UI props & VariantBaseProps).
284
- *
285
- * This is what the form runtime sees as VariantPropsFor<"password">.
286
- */
287
- export interface PasswordVariantProps {
288
- /** Maximum number of characters permitted. */
289
- maxLength?: number;
290
- /** Browser autocomplete hint (e.g., "current-password", "new-password"). */
291
- autoComplete?: string;
292
-
293
- /** Show an eye button to toggle between obscured/plain text. (default: true) */
294
- revealToggle?: boolean;
295
- /** Start in the revealed (plain text) state. */
296
- defaultRevealed?: boolean;
297
- /** Called whenever the reveal state changes. */
298
- onRevealChange?(revealed: boolean): void;
299
- /** Override the icons used for hide/show. */
300
- renderToggleIcon?(revealed: boolean): React.ReactNode;
301
- /** Accessible label for the toggle button. */
302
- toggleAriaLabel?(revealed: boolean): string;
303
-
304
- /**
305
- * Extra className for the reveal toggle button.
306
- */
307
- toggleButtonClassName?: string;
308
-
309
- /**
310
- * Enable the built-in strength meter (boolean or options).
311
- *
312
- * - false / undefined → no built-in meter is shown
313
- * - true → use defaults
314
- * - object → merge with defaults
315
- */
316
- strengthMeter?: boolean | StrengthOptions;
317
-
318
- /**
319
- * Optional rule definition map.
320
- */
321
- ruleDefinitions?: PasswordDefinitionMap;
322
-
323
- /**
324
- * Selection of rule aliases to apply.
325
- *
326
- * - "length" → use ruleDefinitions["length"] with default importance
327
- * - "!length" → same rule but treated as more important
328
- */
329
- ruleUses?: string[];
330
-
331
- /**
332
- * Built-in meter style:
333
- * - "simple" → single bar + label
334
- * - "rules" → bar + per-rule checklist
335
- * Default: "simple"
336
- */
337
- meterStyle?: "simple" | "rules";
338
-
339
- /**
340
- * Optional custom meter renderer.
341
- */
342
- renderMeter?(props: PasswordMeterRenderProps): React.ReactNode;
343
-
344
- /**
345
- * ClassNames for the meter and rules UI.
346
- */
347
- meterWrapperClassName?: string;
348
- meterContainerClassName?: string;
349
- meterBarClassName?: string;
350
- meterLabelClassName?: string;
351
-
352
- rulesWrapperClassName?: string;
353
- rulesHeadingClassName?: string;
354
- rulesListClassName?: string;
355
- ruleItemClassName?: string;
356
- ruleIconClassName?: string;
357
- ruleLabelClassName?: string;
358
-
359
- /**
360
- * Extra className for the outer field wrapper.
361
- */
362
- className?: string;
363
- }
364
-
365
- // We still *type* against ShadcnTextVariantProps so password can reuse
366
- // all the visual/text props. We take control of type, value, onValue & trailingControl.
367
- type TextUiProps = Omit<
368
- ShadcnTextVariantProps,
369
- "type" | "inputMode" | "leadingControl" | "trailingControl" | "value" | "onValue"
370
- >;
371
-
372
- /**
373
- * Full props for the Shadcn-based password variant.
374
- */
375
- export type ShadcnPasswordVariantProps = TextUiProps &
376
- PasswordVariantProps &
377
- Pick<BaseProps, "value" | "onValue" | "error">;
378
-
379
- // ─────────────────────────────────────────────
380
- // Rule normalization & scoring
381
- // ─────────────────────────────────────────────
382
-
383
- function normalizeRules(
384
- value: string,
385
- definitions?: PasswordDefinitionMap,
386
- uses?: string[],
387
- ): { rules: NormalizedRuleState[]; percent: number | null } {
388
- if (!definitions || Object.keys(definitions).length === 0) {
389
- return { rules: [], percent: null };
390
- }
391
-
392
- const useList =
393
- uses && uses.length ? uses : Object.keys(definitions);
394
-
395
- const rules: NormalizedRuleState[] = [];
396
- let totalWeight = 0;
397
- let passedWeight = 0;
398
-
399
- for (const rawKey of useList) {
400
- if (!rawKey) continue;
401
-
402
- const important = rawKey.startsWith("!");
403
- const key = important ? rawKey.slice(1) : rawKey;
404
- const def = definitions[key];
405
- if (!def) continue;
406
-
407
- let pattern: RegExp;
408
- let optional = !important;
409
- let weight = important ? 2 : 1;
410
- let label = key;
411
- let description: string | undefined;
412
-
413
- if (typeof def === "string") {
414
- pattern = new RegExp(def);
415
- } else if (def instanceof RegExp) {
416
- pattern = def;
417
- } else {
418
- pattern = def.pattern;
419
- if (def.optional !== undefined) optional = def.optional;
420
- if (def.weight !== undefined) weight = def.weight;
421
- if (def.label) label = def.label;
422
- if (def.description) description = def.description;
423
- }
424
-
425
- const passed = pattern.test(value);
426
- totalWeight += weight;
427
- if (passed) passedWeight += weight;
428
-
429
- rules.push({
430
- key,
431
- label,
432
- description,
433
- optional,
434
- required: !optional,
435
- weight,
436
- passed,
437
- });
438
- }
439
-
440
- if (totalWeight === 0) {
441
- return { rules, percent: null };
442
- }
443
-
444
- const percent = (passedWeight / totalWeight) * 100;
445
- return { rules, percent };
446
- }
447
-
448
- function clampScore(x: number): number {
449
- if (Number.isNaN(x)) return 0;
450
- return Math.max(0, Math.min(4, x));
451
- }
452
-
453
- function computeMeterState(
454
- value: string,
455
- strength: StrengthOptions,
456
- definitions?: PasswordDefinitionMap,
457
- uses?: string[],
458
- ): PasswordMeterRenderProps {
459
- const { rules, percent: rulesPercent } = normalizeRules(
460
- value,
461
- definitions,
462
- uses,
463
- );
464
-
465
- const labels = strength.labels ?? DEFAULT_LABELS;
466
- const thresholds = strength.thresholds ?? DEFAULT_THRESHOLDS;
467
- const minScore = (strength.minScore ?? 2) as number;
468
-
469
- let percent: number;
470
- let score: number;
471
-
472
- if (rulesPercent != null) {
473
- percent = rulesPercent;
474
- } else {
475
- const rawScore = clampScore(
476
- strength.calc ? strength.calc(value) : defaultScore(value),
477
- );
478
- percent = (rawScore / 4) * 100;
479
- }
480
-
481
- let bucketIndex = 0;
482
- for (let i = 0; i < thresholds.length; i++) {
483
- if (percent >= thresholds[i]) {
484
- bucketIndex = i;
485
- } else {
486
- break;
487
- }
488
- }
489
- score = bucketIndex;
490
-
491
- const label =
492
- labels[score] ??
493
- labels[labels.length - 1] ??
494
- DEFAULT_LABELS[DEFAULT_LABELS.length - 1];
495
-
496
- const passed = score >= minScore;
497
-
498
- return {
499
- value,
500
- score,
501
- percent,
502
- label,
503
- passed,
504
- minScore,
505
- thresholds: thresholds,
506
- labels,
507
- rules,
508
- };
509
- }
510
-
511
- function meterColor(score: number): string {
512
- if (score <= 1) return "bg-destructive";
513
- if (score === 2) return "bg-orange-500";
514
- if (score === 3) return "bg-amber-500";
515
- return "bg-emerald-500";
516
- }
517
-
518
- // ─────────────────────────────────────────────
519
- // Main variant component
520
- // ─────────────────────────────────────────────
521
-
522
- export const ShadcnPasswordVariant = React.forwardRef<
523
- HTMLInputElement,
524
- ShadcnPasswordVariantProps
525
- >(function ShadcnPasswordVariant(props, ref) {
526
- const {
527
- // base variant bits
528
- value,
529
- onValue,
530
- error,
531
-
532
- // password base props
533
- maxLength,
534
- autoComplete,
535
- revealToggle = true,
536
- defaultRevealed = false,
537
- onRevealChange,
538
- renderToggleIcon,
539
- toggleAriaLabel,
540
- toggleButtonClassName,
541
-
542
- // strength / rules
543
- strengthMeter,
544
- ruleDefinitions,
545
- ruleUses,
546
- meterStyle = "simple",
547
- renderMeter,
548
- meterWrapperClassName,
549
- meterContainerClassName,
550
- meterBarClassName,
551
- meterLabelClassName,
552
- rulesWrapperClassName,
553
- rulesHeadingClassName,
554
- rulesListClassName,
555
- ruleItemClassName,
556
- ruleIconClassName,
557
- ruleLabelClassName,
558
-
559
- className,
560
-
561
- // everything else from Shadcn text UI
562
- ...restTextProps
563
- } = props;
564
-
565
- const [revealed, setRevealed] = React.useState<boolean>(
566
- Boolean(defaultRevealed),
567
- );
568
-
569
- const normalizedStrength = React.useMemo(
570
- () => normalizeStrengthOptions(strengthMeter),
571
- [strengthMeter],
572
- );
573
-
574
- const effectiveRuleDefinitions = React.useMemo(
575
- () => getMergedRuleDefinitions(ruleDefinitions),
576
- [ruleDefinitions],
577
- );
578
-
579
- const meterState = React.useMemo<PasswordMeterRenderProps | null>(() => {
580
- if (!normalizedStrength) return null;
581
- const v = value ?? "";
582
- return computeMeterState(
583
- v,
584
- normalizedStrength,
585
- effectiveRuleDefinitions,
586
- ruleUses,
587
- );
588
- }, [normalizedStrength, value, ruleUses, effectiveRuleDefinitions]);
589
-
590
- const handleToggleReveal = React.useCallback(() => {
591
- setRevealed((prev) => {
592
- const next = !prev;
593
- onRevealChange?.(next);
594
- return next;
595
- });
596
- }, [onRevealChange]);
597
-
598
- const handleChange = React.useCallback(
599
- (event: React.ChangeEvent<HTMLInputElement>) => {
600
- const next = event.target.value ?? "";
601
- const detail: ChangeDetail<PasswordMeterRenderProps | undefined> = {
602
- source: "variant",
603
- raw: next,
604
- nativeEvent: event,
605
- meta: meterState ?? undefined,
606
- };
607
- onValue?.(next, detail);
608
- },
609
- [onValue, meterState],
610
- );
611
-
612
- const toggleLabel =
613
- toggleAriaLabel?.(revealed) ??
614
- (revealed ? "Hide password" : "Show password");
615
-
616
- const trailingControl =
617
- revealToggle === false ? undefined : (
618
- <button
619
- type="button"
620
- onClick={handleToggleReveal}
621
- aria-label={toggleLabel}
622
- tabIndex={-1}
623
- className={cn(
624
- "inline-flex h-full items-center justify-center px-3 text-muted-foreground transition-colors hover:text-foreground hover:bg-muted/50 focus-visible:outline-none focus-visible:bg-muted/50",
625
- toggleButtonClassName,
626
- )}
627
- data-slot="password-toggle"
628
- >
629
- {renderToggleIcon ? (
630
- renderToggleIcon(revealed)
631
- ) : revealed ? (
632
- <EyeOff className="h-4 w-4" />
633
- ) : (
634
- <Eye className="h-4 w-4" />
635
- )}
636
- </button>
637
- );
638
-
639
- const meterNode =
640
- normalizedStrength && meterState
641
- ? renderMeter?.(meterState) ??
642
- (strengthMeter && (
643
- <div
644
- className={cn(
645
- normalizedStrength.display === "block"
646
- ? "mt-2 space-y-2"
647
- : "mt-1.5 flex flex-col gap-0",
648
- meterWrapperClassName,
649
- )}
650
- data-slot="password-meter"
651
- >
652
- {/* Progress Bar Row */}
653
- <div
654
- className={cn(
655
- "flex w-full items-center gap-3",
656
- meterContainerClassName,
657
- )}
658
- >
659
- <div className="flex-1">
660
- {/* Reduced height from h-2 to h-1 */}
661
- <div className="h-1 w-full overflow-hidden rounded-full bg-secondary">
662
- <div
663
- className={cn(
664
- "h-full transition-all duration-300 ease-out",
665
- meterColor(meterState.score),
666
- meterBarClassName,
667
- )}
668
- style={{ width: `${meterState.percent}%` }}
669
- />
670
- </div>
671
- </div>
672
-
673
- {normalizedStrength.showLabel !== false && (
674
- <div
675
- className={cn(
676
- "min-w-[4rem] text-right text-[10px] font-medium uppercase tracking-wider text-muted-foreground",
677
- meterLabelClassName,
678
- )}
679
- >
680
- {meterState.label}
681
- </div>
682
- )}
683
- </div>
684
-
685
- {/* New Modern Chips for Rules */}
686
- {meterStyle === "rules" &&
687
- meterState.rules.length > 0 && (
688
- <div
689
- className={cn(
690
- "flex flex-wrap gap-1.5 pt-1",
691
- rulesWrapperClassName,
692
- )}
693
- >
694
- {meterState.rules.map((rule) => (
695
- <span
696
- key={rule.key}
697
- className={cn(
698
- "inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[10px] font-medium transition-colors duration-200",
699
- rule.passed
700
- ? "border-emerald-500/30 bg-emerald-500/10 text-emerald-600 dark:border-emerald-400/20 dark:bg-emerald-400/10 dark:text-emerald-400"
701
- : "border-transparent bg-secondary text-muted-foreground",
702
- ruleItemClassName
703
- )}
704
- >
705
- {rule.passed && (
706
- <Check className="h-3 w-3" strokeWidth={3} />
707
- )}
708
- {rule.label}
709
- </span>
710
- ))}
711
- </div>
712
- )}
713
- </div>
714
- ))
715
- : null;
716
-
717
- return (
718
- <div className={cn("group/password w-full", className)} data-slot="password-field">
719
- <Input
720
- ref={ref}
721
- {...restTextProps}
722
- type={revealed ? "text" : "password"}
723
- value={value ?? ""}
724
- onChange={handleChange}
725
- maxLength={maxLength}
726
- autoComplete={autoComplete}
727
- trailingControl={trailingControl}
728
- aria-invalid={error ? "true" : undefined}
729
- />
730
- {meterNode}
731
- </div>
732
- );
733
- });
734
-
735
- ShadcnPasswordVariant.displayName = "ShadcnPasswordVariant";
736
-
737
- export default ShadcnPasswordVariant;