@tribepad/themis 1.0.1 → 1.0.3

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 (308) hide show
  1. package/dist/elements/Accordion/index.js +1 -335
  2. package/dist/elements/Accordion/index.js.map +1 -1
  3. package/dist/elements/Accordion/index.mjs +1 -317
  4. package/dist/elements/Accordion/index.mjs.map +1 -1
  5. package/dist/elements/AlertDialog/AlertDialog.d.ts +43 -0
  6. package/dist/elements/AlertDialog/AlertDialog.d.ts.map +1 -0
  7. package/dist/elements/AlertDialog/AlertDialog.styles.d.ts +15 -0
  8. package/dist/elements/AlertDialog/AlertDialog.styles.d.ts.map +1 -0
  9. package/dist/elements/AlertDialog/AlertDialog.types.d.ts +72 -0
  10. package/dist/elements/AlertDialog/AlertDialog.types.d.ts.map +1 -0
  11. package/dist/elements/AlertDialog/index.d.ts +25 -0
  12. package/dist/elements/AlertDialog/index.d.ts.map +1 -0
  13. package/dist/elements/AlertDialog/index.js +3 -0
  14. package/dist/elements/AlertDialog/index.js.map +1 -0
  15. package/dist/elements/AlertDialog/index.mjs +3 -0
  16. package/dist/elements/AlertDialog/index.mjs.map +1 -0
  17. package/dist/elements/Avatar/index.js +1 -468
  18. package/dist/elements/Avatar/index.js.map +1 -1
  19. package/dist/elements/Avatar/index.mjs +1 -456
  20. package/dist/elements/Avatar/index.mjs.map +1 -1
  21. package/dist/elements/Badge/index.js +1 -243
  22. package/dist/elements/Badge/index.js.map +1 -1
  23. package/dist/elements/Badge/index.mjs +1 -234
  24. package/dist/elements/Badge/index.mjs.map +1 -1
  25. package/dist/elements/Breadcrumbs/index.js +1 -821
  26. package/dist/elements/Breadcrumbs/index.js.map +1 -1
  27. package/dist/elements/Breadcrumbs/index.mjs +1 -810
  28. package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
  29. package/dist/elements/Button/Button.d.ts +26 -81
  30. package/dist/elements/Button/Button.d.ts.map +1 -1
  31. package/dist/elements/Button/Button.styles.d.ts +35 -0
  32. package/dist/elements/Button/Button.styles.d.ts.map +1 -0
  33. package/dist/elements/Button/Button.types.d.ts +20 -8
  34. package/dist/elements/Button/Button.types.d.ts.map +1 -1
  35. package/dist/elements/Button/index.js +1 -288
  36. package/dist/elements/Button/index.js.map +1 -1
  37. package/dist/elements/Button/index.mjs +1 -283
  38. package/dist/elements/Button/index.mjs.map +1 -1
  39. package/dist/elements/ButtonGroup/index.js +1 -237
  40. package/dist/elements/ButtonGroup/index.js.map +1 -1
  41. package/dist/elements/ButtonGroup/index.mjs +1 -222
  42. package/dist/elements/ButtonGroup/index.mjs.map +1 -1
  43. package/dist/elements/Card/index.js +1 -579
  44. package/dist/elements/Card/index.js.map +1 -1
  45. package/dist/elements/Card/index.mjs +1 -560
  46. package/dist/elements/Card/index.mjs.map +1 -1
  47. package/dist/elements/Carousel/Carousel.d.ts +1 -11
  48. package/dist/elements/Carousel/Carousel.d.ts.map +1 -1
  49. package/dist/elements/Carousel/LazyCarousel.d.ts +1 -1
  50. package/dist/elements/Carousel/LazyCarousel.d.ts.map +1 -1
  51. package/dist/elements/Carousel/index.js +1 -789
  52. package/dist/elements/Carousel/index.js.map +1 -1
  53. package/dist/elements/Carousel/index.mjs +1 -786
  54. package/dist/elements/Carousel/index.mjs.map +1 -1
  55. package/dist/elements/Chart/ChartContext.d.ts.map +1 -1
  56. package/dist/elements/Chart/index.js +1 -1842
  57. package/dist/elements/Chart/index.js.map +1 -1
  58. package/dist/elements/Chart/index.mjs +1 -1832
  59. package/dist/elements/Chart/index.mjs.map +1 -1
  60. package/dist/elements/Checkbox/index.js +1 -316
  61. package/dist/elements/Checkbox/index.js.map +1 -1
  62. package/dist/elements/Checkbox/index.mjs +1 -306
  63. package/dist/elements/Checkbox/index.mjs.map +1 -1
  64. package/dist/elements/CheckboxGroup/index.js +1 -455
  65. package/dist/elements/CheckboxGroup/index.js.map +1 -1
  66. package/dist/elements/CheckboxGroup/index.mjs +1 -439
  67. package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
  68. package/dist/elements/Combobox/Combobox.d.ts +56 -0
  69. package/dist/elements/Combobox/Combobox.d.ts.map +1 -0
  70. package/dist/elements/Combobox/Combobox.styles.d.ts +29 -0
  71. package/dist/elements/Combobox/Combobox.styles.d.ts.map +1 -0
  72. package/dist/elements/Combobox/Combobox.types.d.ts +67 -0
  73. package/dist/elements/Combobox/Combobox.types.d.ts.map +1 -0
  74. package/dist/elements/Combobox/index.d.ts +20 -0
  75. package/dist/elements/Combobox/index.d.ts.map +1 -0
  76. package/dist/elements/Combobox/index.js +3 -0
  77. package/dist/elements/Combobox/index.js.map +1 -0
  78. package/dist/elements/Combobox/index.mjs +3 -0
  79. package/dist/elements/Combobox/index.mjs.map +1 -0
  80. package/dist/elements/DatePicker/DatePicker.d.ts +1 -1
  81. package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
  82. package/dist/elements/DatePicker/index.js +1 -903
  83. package/dist/elements/DatePicker/index.js.map +1 -1
  84. package/dist/elements/DatePicker/index.mjs +1 -853
  85. package/dist/elements/DatePicker/index.mjs.map +1 -1
  86. package/dist/elements/Dropdown/Dropdown.d.ts +7 -15
  87. package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -1
  88. package/dist/elements/Dropdown/Dropdown.styles.d.ts +22 -0
  89. package/dist/elements/Dropdown/Dropdown.styles.d.ts.map +1 -0
  90. package/dist/elements/Dropdown/index.d.ts +1 -0
  91. package/dist/elements/Dropdown/index.d.ts.map +1 -1
  92. package/dist/elements/Dropdown/index.js +1 -193
  93. package/dist/elements/Dropdown/index.js.map +1 -1
  94. package/dist/elements/Dropdown/index.mjs +1 -184
  95. package/dist/elements/Dropdown/index.mjs.map +1 -1
  96. package/dist/elements/FileField/index.js +1 -1539
  97. package/dist/elements/FileField/index.js.map +1 -1
  98. package/dist/elements/FileField/index.mjs +1 -1507
  99. package/dist/elements/FileField/index.mjs.map +1 -1
  100. package/dist/elements/FormLayout/index.js +1 -170
  101. package/dist/elements/FormLayout/index.js.map +1 -1
  102. package/dist/elements/FormLayout/index.mjs +1 -167
  103. package/dist/elements/FormLayout/index.mjs.map +1 -1
  104. package/dist/elements/Modal/Modal.d.ts +9 -14
  105. package/dist/elements/Modal/Modal.d.ts.map +1 -1
  106. package/dist/elements/Modal/Modal.styles.d.ts +29 -0
  107. package/dist/elements/Modal/Modal.styles.d.ts.map +1 -0
  108. package/dist/elements/Modal/index.d.ts +1 -0
  109. package/dist/elements/Modal/index.d.ts.map +1 -1
  110. package/dist/elements/Modal/index.js +1 -232
  111. package/dist/elements/Modal/index.js.map +1 -1
  112. package/dist/elements/Modal/index.mjs +1 -220
  113. package/dist/elements/Modal/index.mjs.map +1 -1
  114. package/dist/elements/NumberField/NumberField.variants.d.ts +1 -1
  115. package/dist/elements/NumberField/index.js +1 -666
  116. package/dist/elements/NumberField/index.js.map +1 -1
  117. package/dist/elements/NumberField/index.mjs +1 -654
  118. package/dist/elements/NumberField/index.mjs.map +1 -1
  119. package/dist/elements/OTPInput/OTPInput.d.ts.map +1 -1
  120. package/dist/elements/OTPInput/index.js +1 -734
  121. package/dist/elements/OTPInput/index.js.map +1 -1
  122. package/dist/elements/OTPInput/index.mjs +1 -732
  123. package/dist/elements/OTPInput/index.mjs.map +1 -1
  124. package/dist/elements/Pagination/Pagination.d.ts +45 -0
  125. package/dist/elements/Pagination/Pagination.d.ts.map +1 -0
  126. package/dist/elements/Pagination/Pagination.styles.d.ts +10 -0
  127. package/dist/elements/Pagination/Pagination.styles.d.ts.map +1 -0
  128. package/dist/elements/Pagination/Pagination.types.d.ts +55 -0
  129. package/dist/elements/Pagination/Pagination.types.d.ts.map +1 -0
  130. package/dist/elements/Pagination/index.d.ts +21 -0
  131. package/dist/elements/Pagination/index.d.ts.map +1 -0
  132. package/dist/elements/Pagination/index.js +3 -0
  133. package/dist/elements/Pagination/index.js.map +1 -0
  134. package/dist/elements/Pagination/index.mjs +3 -0
  135. package/dist/elements/Pagination/index.mjs.map +1 -0
  136. package/dist/elements/Panel/index.js +1 -330
  137. package/dist/elements/Panel/index.js.map +1 -1
  138. package/dist/elements/Panel/index.mjs +1 -323
  139. package/dist/elements/Panel/index.mjs.map +1 -1
  140. package/dist/elements/PasswordField/PasswordField.d.ts +27 -0
  141. package/dist/elements/PasswordField/PasswordField.d.ts.map +1 -0
  142. package/dist/elements/PasswordField/PasswordField.styles.d.ts +32 -0
  143. package/dist/elements/PasswordField/PasswordField.styles.d.ts.map +1 -0
  144. package/dist/elements/PasswordField/PasswordField.types.d.ts +100 -0
  145. package/dist/elements/PasswordField/PasswordField.types.d.ts.map +1 -0
  146. package/dist/elements/PasswordField/index.css +2 -0
  147. package/dist/elements/PasswordField/index.css.map +1 -0
  148. package/dist/elements/PasswordField/index.d.ts +20 -0
  149. package/dist/elements/PasswordField/index.d.ts.map +1 -0
  150. package/dist/elements/PasswordField/index.js +3 -0
  151. package/dist/elements/PasswordField/index.js.map +1 -0
  152. package/dist/elements/PasswordField/index.mjs +3 -0
  153. package/dist/elements/PasswordField/index.mjs.map +1 -0
  154. package/dist/elements/Progress/index.js +1 -187
  155. package/dist/elements/Progress/index.js.map +1 -1
  156. package/dist/elements/Progress/index.mjs +1 -181
  157. package/dist/elements/Progress/index.mjs.map +1 -1
  158. package/dist/elements/RadioGroup/index.js +1 -369
  159. package/dist/elements/RadioGroup/index.js.map +1 -1
  160. package/dist/elements/RadioGroup/index.mjs +1 -359
  161. package/dist/elements/RadioGroup/index.mjs.map +1 -1
  162. package/dist/elements/Resizable/index.js +1 -1580
  163. package/dist/elements/Resizable/index.js.map +1 -1
  164. package/dist/elements/Resizable/index.mjs +1 -1566
  165. package/dist/elements/Resizable/index.mjs.map +1 -1
  166. package/dist/elements/SearchField/SearchField.d.ts +27 -0
  167. package/dist/elements/SearchField/SearchField.d.ts.map +1 -0
  168. package/dist/elements/SearchField/SearchField.styles.d.ts +32 -0
  169. package/dist/elements/SearchField/SearchField.styles.d.ts.map +1 -0
  170. package/dist/elements/SearchField/SearchField.types.d.ts +45 -0
  171. package/dist/elements/SearchField/SearchField.types.d.ts.map +1 -0
  172. package/dist/elements/SearchField/index.css +2 -0
  173. package/dist/elements/SearchField/index.css.map +1 -0
  174. package/dist/elements/SearchField/index.d.ts +21 -0
  175. package/dist/elements/SearchField/index.d.ts.map +1 -0
  176. package/dist/elements/SearchField/index.js +3 -0
  177. package/dist/elements/SearchField/index.js.map +1 -0
  178. package/dist/elements/SearchField/index.mjs +3 -0
  179. package/dist/elements/SearchField/index.mjs.map +1 -0
  180. package/dist/elements/Select/Select.d.ts +19 -48
  181. package/dist/elements/Select/Select.d.ts.map +1 -1
  182. package/dist/elements/Select/Select.styles.d.ts +55 -0
  183. package/dist/elements/Select/Select.styles.d.ts.map +1 -0
  184. package/dist/elements/Select/index.js +1 -589
  185. package/dist/elements/Select/index.js.map +1 -1
  186. package/dist/elements/Select/index.mjs +1 -582
  187. package/dist/elements/Select/index.mjs.map +1 -1
  188. package/dist/elements/Skeleton/index.js +1 -82
  189. package/dist/elements/Skeleton/index.js.map +1 -1
  190. package/dist/elements/Skeleton/index.mjs +1 -78
  191. package/dist/elements/Skeleton/index.mjs.map +1 -1
  192. package/dist/elements/Switch/index.js +1 -179
  193. package/dist/elements/Switch/index.js.map +1 -1
  194. package/dist/elements/Switch/index.mjs +1 -173
  195. package/dist/elements/Switch/index.mjs.map +1 -1
  196. package/dist/elements/Table/Table.d.ts +3 -24
  197. package/dist/elements/Table/Table.d.ts.map +1 -1
  198. package/dist/elements/Table/Table.styles.d.ts +24 -0
  199. package/dist/elements/Table/Table.styles.d.ts.map +1 -0
  200. package/dist/elements/Table/index.js +1 -595
  201. package/dist/elements/Table/index.js.map +1 -1
  202. package/dist/elements/Table/index.mjs +1 -578
  203. package/dist/elements/Table/index.mjs.map +1 -1
  204. package/dist/elements/Tabs/Tabs.d.ts +5 -3
  205. package/dist/elements/Tabs/Tabs.d.ts.map +1 -1
  206. package/dist/elements/Tabs/Tabs.types.d.ts +15 -0
  207. package/dist/elements/Tabs/Tabs.types.d.ts.map +1 -1
  208. package/dist/elements/Tabs/index.js +1 -337
  209. package/dist/elements/Tabs/index.js.map +1 -1
  210. package/dist/elements/Tabs/index.mjs +1 -320
  211. package/dist/elements/Tabs/index.mjs.map +1 -1
  212. package/dist/elements/TextField/TextField.d.ts +6 -42
  213. package/dist/elements/TextField/TextField.d.ts.map +1 -1
  214. package/dist/elements/TextField/TextField.hooks.d.ts +63 -0
  215. package/dist/elements/TextField/TextField.hooks.d.ts.map +1 -0
  216. package/dist/elements/TextField/TextField.icons.d.ts +19 -0
  217. package/dist/elements/TextField/TextField.icons.d.ts.map +1 -0
  218. package/dist/elements/TextField/TextField.styles.d.ts +37 -0
  219. package/dist/elements/TextField/TextField.styles.d.ts.map +1 -0
  220. package/dist/elements/TextField/TextField.types.d.ts +3 -0
  221. package/dist/elements/TextField/TextField.types.d.ts.map +1 -1
  222. package/dist/elements/TextField/index.css +1 -22
  223. package/dist/elements/TextField/index.css.map +1 -1
  224. package/dist/elements/TextField/index.js +1 -902
  225. package/dist/elements/TextField/index.js.map +1 -1
  226. package/dist/elements/TextField/index.mjs +1 -882
  227. package/dist/elements/TextField/index.mjs.map +1 -1
  228. package/dist/elements/TimeField/index.js +1 -254
  229. package/dist/elements/TimeField/index.js.map +1 -1
  230. package/dist/elements/TimeField/index.mjs +1 -238
  231. package/dist/elements/TimeField/index.mjs.map +1 -1
  232. package/dist/elements/Toast/Toast.d.ts +0 -22
  233. package/dist/elements/Toast/Toast.d.ts.map +1 -1
  234. package/dist/elements/Toast/index.js +1 -737
  235. package/dist/elements/Toast/index.js.map +1 -1
  236. package/dist/elements/Toast/index.mjs +1 -724
  237. package/dist/elements/Toast/index.mjs.map +1 -1
  238. package/dist/elements/Tooltip/index.js +1 -323
  239. package/dist/elements/Tooltip/index.js.map +1 -1
  240. package/dist/elements/Tooltip/index.mjs +1 -310
  241. package/dist/elements/Tooltip/index.mjs.map +1 -1
  242. package/dist/elements/index.css +1 -22
  243. package/dist/elements/index.css.map +1 -1
  244. package/dist/elements/index.d.ts +13 -1
  245. package/dist/elements/index.d.ts.map +1 -1
  246. package/dist/elements/index.js +1 -12455
  247. package/dist/elements/index.js.map +1 -1
  248. package/dist/elements/index.mjs +1 -12233
  249. package/dist/elements/index.mjs.map +1 -1
  250. package/dist/index.css +1 -22
  251. package/dist/index.css.map +1 -1
  252. package/dist/index.js +2 -12490
  253. package/dist/index.js.map +1 -1
  254. package/dist/index.mjs +2 -12262
  255. package/dist/index.mjs.map +1 -1
  256. package/dist/schemas/index.js +2 -54
  257. package/dist/schemas/index.js.map +1 -1
  258. package/dist/schemas/index.mjs +2 -48
  259. package/dist/schemas/index.mjs.map +1 -1
  260. package/dist/styles/defaults.css +151 -0
  261. package/dist/styles/index.js +1 -166
  262. package/dist/styles/index.js.map +1 -1
  263. package/dist/styles/index.mjs +1 -129
  264. package/dist/styles/index.mjs.map +1 -1
  265. package/dist/styles/shared-variants.d.ts +3 -3
  266. package/dist/styles/shared-variants.d.ts.map +1 -1
  267. package/dist/utils/index.js +1 -12
  268. package/dist/utils/index.js.map +1 -1
  269. package/dist/utils/index.mjs +1 -10
  270. package/dist/utils/index.mjs.map +1 -1
  271. package/package.json +9 -7
  272. package/src/elements/Accordion/Accordion.stories.tsx +1 -1
  273. package/src/elements/AlertDialog/AlertDialog.stories.tsx +124 -0
  274. package/src/elements/Avatar/Avatar.stories.tsx +1 -1
  275. package/src/elements/Badge/Badge.stories.tsx +1 -1
  276. package/src/elements/Breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  277. package/src/elements/Button/Button.stories.tsx +1 -1
  278. package/src/elements/ButtonGroup/ButtonGroup.stories.tsx +1 -1
  279. package/src/elements/Card/Card.stories.tsx +1 -1
  280. package/src/elements/Carousel/Carousel.stories.tsx +1 -1
  281. package/src/elements/Chart/Chart.stories.tsx +1 -1
  282. package/src/elements/Checkbox/Checkbox.stories.tsx +1 -1
  283. package/src/elements/CheckboxGroup/CheckboxGroup.stories.tsx +4 -4
  284. package/src/elements/Combobox/Combobox.stories.tsx +133 -0
  285. package/src/elements/DatePicker/DatePicker.stories.tsx +1 -1
  286. package/src/elements/Dropdown/Dropdown.stories.tsx +1 -1
  287. package/src/elements/FileField/FileField.stories.tsx +2 -2
  288. package/src/elements/FileField/FileProgress.stories.tsx +1 -1
  289. package/src/elements/FormLayout/FormLayout.stories.tsx +1 -1
  290. package/src/elements/Modal/Modal.stories.tsx +1 -1
  291. package/src/elements/NumberField/NumberField.stories.tsx +1 -1
  292. package/src/elements/OTPInput/OTPInput.stories.tsx +1 -1
  293. package/src/elements/Pagination/Pagination.stories.tsx +203 -0
  294. package/src/elements/Panel/Panel.stories.tsx +1 -1
  295. package/src/elements/PasswordField/PasswordField.stories.tsx +167 -0
  296. package/src/elements/Progress/Progress.stories.tsx +7 -2
  297. package/src/elements/RadioGroup/RadioGroup.stories.tsx +3 -3
  298. package/src/elements/Resizable/Resizable.stories.tsx +1 -1
  299. package/src/elements/SearchField/SearchField.stories.tsx +146 -0
  300. package/src/elements/Select/Select.stories.tsx +1 -1
  301. package/src/elements/Skeleton/Skeleton.stories.tsx +1 -1
  302. package/src/elements/Switch/Switch.stories.tsx +1 -1
  303. package/src/elements/Table/Table.stories.tsx +1 -1
  304. package/src/elements/Tabs/Tabs.stories.tsx +46 -2
  305. package/src/elements/TextField/TextField.stories.tsx +1 -1
  306. package/src/elements/TimeField/TimeField.stories.tsx +1 -1
  307. package/src/elements/Toast/Toast.stories.tsx +1 -1
  308. package/src/elements/Tooltip/Tooltip.stories.tsx +1 -1
@@ -1,736 +1,3 @@
1
1
  "use client";
2
- 'use strict';
3
-
4
- var react = require('react');
5
- var clsx = require('clsx');
6
- var tailwindMerge = require('tailwind-merge');
7
- var classVarianceAuthority = require('class-variance-authority');
8
- var jsxRuntime = require('react/jsx-runtime');
9
-
10
- // src/elements/OTPInput/OTPInput.tsx
11
- function cn(...inputs) {
12
- return tailwindMerge.twMerge(clsx.clsx(inputs));
13
- }
14
- function useOTPKeyboard(options) {
15
- const {
16
- value,
17
- length,
18
- focusedIndex,
19
- onChange,
20
- setFocusedIndex,
21
- disabled = false,
22
- readOnly = false
23
- } = options;
24
- const handleArrowLeft = react.useCallback(() => {
25
- if (focusedIndex > 0) {
26
- setFocusedIndex(focusedIndex - 1);
27
- }
28
- }, [focusedIndex, setFocusedIndex]);
29
- const handleArrowRight = react.useCallback(() => {
30
- if (focusedIndex < length - 1) {
31
- setFocusedIndex(focusedIndex + 1);
32
- }
33
- }, [focusedIndex, length, setFocusedIndex]);
34
- const handleBackspace = react.useCallback(() => {
35
- if (readOnly) return;
36
- const digits = value.split("");
37
- const currentDigit = digits[focusedIndex];
38
- if (currentDigit === "_") {
39
- if (focusedIndex > 0) {
40
- const newIndex = focusedIndex - 1;
41
- digits[newIndex] = "_";
42
- onChange(digits.join(""));
43
- setFocusedIndex(newIndex);
44
- }
45
- } else {
46
- digits[focusedIndex] = "_";
47
- onChange(digits.join(""));
48
- if (focusedIndex > 0) {
49
- setFocusedIndex(focusedIndex - 1);
50
- }
51
- }
52
- }, [value, focusedIndex, readOnly, onChange, setFocusedIndex]);
53
- const handleDelete = react.useCallback(() => {
54
- if (readOnly) return;
55
- const digits = value.split("");
56
- digits[focusedIndex] = "_";
57
- onChange(digits.join(""));
58
- }, [value, focusedIndex, readOnly, onChange]);
59
- const handleHome = react.useCallback(() => {
60
- setFocusedIndex(0);
61
- }, [setFocusedIndex]);
62
- const handleEnd = react.useCallback(() => {
63
- setFocusedIndex(length - 1);
64
- }, [length, setFocusedIndex]);
65
- const handleKeyDown = react.useCallback(
66
- (e) => {
67
- if (disabled) return;
68
- switch (e.key) {
69
- case "ArrowLeft":
70
- e.preventDefault();
71
- handleArrowLeft();
72
- break;
73
- case "ArrowRight":
74
- e.preventDefault();
75
- handleArrowRight();
76
- break;
77
- case "Backspace":
78
- e.preventDefault();
79
- handleBackspace();
80
- break;
81
- case "Delete":
82
- e.preventDefault();
83
- handleDelete();
84
- break;
85
- case "Home":
86
- e.preventDefault();
87
- handleHome();
88
- break;
89
- case "End":
90
- e.preventDefault();
91
- handleEnd();
92
- break;
93
- // Ctrl/Cmd+A (Select All) - Allow native behavior
94
- case "a":
95
- case "A":
96
- if (e.ctrlKey || e.metaKey) {
97
- return;
98
- }
99
- break;
100
- // Prevent Enter from submitting the form
101
- // Form submission should be handled by onComplete callback when all digits are filled
102
- case "Enter":
103
- e.preventDefault();
104
- break;
105
- }
106
- },
107
- [
108
- disabled,
109
- handleArrowLeft,
110
- handleArrowRight,
111
- handleBackspace,
112
- handleDelete,
113
- handleHome,
114
- handleEnd
115
- ]
116
- );
117
- return {
118
- handleKeyDown
119
- };
120
- }
121
-
122
- // src/elements/OTPInput/hooks/useOTPInput.ts
123
- function useOTPInput(props) {
124
- const {
125
- value: controlledValue,
126
- defaultValue = "",
127
- length = 6,
128
- type = "numeric",
129
- pattern,
130
- onChange,
131
- onComplete,
132
- validate,
133
- error: controlledError,
134
- disabled = false,
135
- readOnly = false
136
- } = props;
137
- const isControlled = controlledValue !== void 0;
138
- const [internalValue, setInternalValue] = react.useState(() => {
139
- return (defaultValue || "").padEnd(length, "_");
140
- });
141
- const [internalError, setInternalError] = react.useState(null);
142
- const [focusedIndex, setFocusedIndex] = react.useState(0);
143
- const completedRef = react.useRef(null);
144
- const debounceTimerRef = react.useRef(null);
145
- const currentValue = isControlled ? controlledValue || "".padEnd(length, "_") : internalValue;
146
- const currentError = controlledError !== void 0 ? controlledError : internalError;
147
- const runValidation = react.useCallback(
148
- (value) => {
149
- const filledLength = value.replace(/_/g, "").length;
150
- if (filledLength < length) {
151
- return null;
152
- }
153
- if (validate) {
154
- return validate(value);
155
- }
156
- if (type === "numeric") {
157
- const numericPattern = /^\d+$/;
158
- const cleanValue = value.replace(/_/g, "");
159
- if (!numericPattern.test(cleanValue)) {
160
- return "Code must contain only digits";
161
- }
162
- } else if (type === "alphanumeric") {
163
- const alphanumericPattern = /^[A-Za-z0-9]+$/;
164
- const cleanValue = value.replace(/_/g, "");
165
- if (!alphanumericPattern.test(cleanValue)) {
166
- return "Code must contain only letters and numbers";
167
- }
168
- } else if (type === "custom" && pattern) {
169
- const cleanValue = value.replace(/_/g, "");
170
- for (const char of cleanValue) {
171
- if (!pattern.test(char)) {
172
- return "Invalid character in code";
173
- }
174
- }
175
- }
176
- return null;
177
- },
178
- [length, type, pattern, validate]
179
- );
180
- const updateValue = react.useCallback(
181
- (newValue) => {
182
- if (!isControlled) {
183
- setInternalValue(newValue);
184
- }
185
- onChange?.(newValue);
186
- const validationError = runValidation(newValue);
187
- if (!isControlled) {
188
- setInternalError(validationError);
189
- }
190
- const filledLength = newValue.replace(/_/g, "").length;
191
- const isComplete2 = filledLength === length;
192
- if (isComplete2 && !validationError && completedRef.current !== newValue) {
193
- completedRef.current = newValue;
194
- if (debounceTimerRef.current) {
195
- clearTimeout(debounceTimerRef.current);
196
- }
197
- debounceTimerRef.current = setTimeout(() => {
198
- onComplete?.(newValue.replace(/_/g, ""));
199
- }, 200);
200
- }
201
- if (!isComplete2 && completedRef.current) {
202
- completedRef.current = null;
203
- }
204
- },
205
- [isControlled, length, onChange, onComplete, runValidation]
206
- );
207
- const handleChange = react.useCallback(
208
- (e) => {
209
- if (disabled) return;
210
- const inputValue = e.target.value;
211
- const newChar = inputValue[inputValue.length - 1] || "";
212
- let isValid = false;
213
- if (type === "numeric") {
214
- isValid = /^\d$/.test(newChar);
215
- } else if (type === "alphanumeric") {
216
- isValid = /^[A-Za-z0-9]$/.test(newChar);
217
- } else if (type === "custom" && pattern) {
218
- isValid = pattern.test(newChar);
219
- } else {
220
- isValid = true;
221
- }
222
- if (!isValid) {
223
- return;
224
- }
225
- const valueArray = currentValue.split("");
226
- valueArray[focusedIndex] = newChar;
227
- const newValue = valueArray.join("");
228
- updateValue(newValue);
229
- if (focusedIndex < length - 1) {
230
- setFocusedIndex(focusedIndex + 1);
231
- }
232
- },
233
- [disabled, type, pattern, currentValue, focusedIndex, length, updateValue]
234
- );
235
- const handlePaste = react.useCallback(
236
- async (e) => {
237
- if (disabled || readOnly) return;
238
- e.preventDefault();
239
- const pastedText = e.clipboardData.getData("text/plain").trim();
240
- if (!pastedText) return;
241
- if (props.onPaste) {
242
- const shouldProceed = await props.onPaste(pastedText);
243
- if (shouldProceed === false) return;
244
- }
245
- let validChars = "";
246
- for (const char of pastedText) {
247
- if (validChars.length >= length) break;
248
- let isValid = false;
249
- if (type === "numeric") {
250
- isValid = /^\d$/.test(char);
251
- } else if (type === "alphanumeric") {
252
- isValid = /^[A-Za-z0-9]$/.test(char);
253
- } else if (type === "custom" && pattern) {
254
- isValid = pattern.test(char);
255
- } else {
256
- isValid = true;
257
- }
258
- if (isValid) {
259
- validChars += char;
260
- }
261
- }
262
- const newValue = validChars.padEnd(length, "_");
263
- updateValue(newValue);
264
- const firstEmptyIndex = newValue.indexOf("_");
265
- setFocusedIndex(firstEmptyIndex === -1 ? length - 1 : firstEmptyIndex);
266
- },
267
- [disabled, readOnly, props, length, type, pattern, updateValue]
268
- );
269
- const clear = react.useCallback(() => {
270
- const emptyValue = "".padEnd(length, "_");
271
- updateValue(emptyValue);
272
- setFocusedIndex(0);
273
- if (!isControlled) {
274
- setInternalError(null);
275
- }
276
- completedRef.current = null;
277
- }, [length, updateValue, isControlled]);
278
- const setValue = react.useCallback(
279
- (newValue) => {
280
- const paddedValue = newValue.padEnd(length, "_").slice(0, length);
281
- updateValue(paddedValue);
282
- const firstEmptyIndex = paddedValue.indexOf("_");
283
- setFocusedIndex(firstEmptyIndex === -1 ? length - 1 : firstEmptyIndex);
284
- },
285
- [length, updateValue]
286
- );
287
- const validateCurrent = react.useCallback(() => {
288
- return runValidation(currentValue);
289
- }, [currentValue, runValidation]);
290
- const isComplete = currentValue.replace(/_/g, "").length === length;
291
- const { handleKeyDown } = useOTPKeyboard({
292
- value: currentValue,
293
- length,
294
- focusedIndex,
295
- onChange: updateValue,
296
- setFocusedIndex,
297
- disabled,
298
- readOnly
299
- });
300
- react.useEffect(() => {
301
- if (isControlled && controlledValue !== void 0) {
302
- const firstEmptyIndex = controlledValue.indexOf("_");
303
- if (firstEmptyIndex !== -1) {
304
- setFocusedIndex(firstEmptyIndex);
305
- }
306
- }
307
- }, [isControlled, controlledValue]);
308
- react.useEffect(() => {
309
- return () => {
310
- if (debounceTimerRef.current) {
311
- clearTimeout(debounceTimerRef.current);
312
- }
313
- };
314
- }, []);
315
- return {
316
- value: currentValue,
317
- focusedIndex,
318
- error: currentError,
319
- isComplete,
320
- handleChange,
321
- handleKeyDown,
322
- handlePaste,
323
- setFocusedIndex,
324
- clear,
325
- setValue,
326
- validate: validateCurrent
327
- };
328
- }
329
- var otpDigitVariants = classVarianceAuthority.cva(
330
- // Base styles - Applied to all variants
331
- [
332
- "inline-flex",
333
- "items-center",
334
- "justify-center",
335
- "rounded-md",
336
- "border-2",
337
- "font-semibold",
338
- "transition-all",
339
- "duration-200",
340
- "ease-in-out",
341
- "select-none",
342
- "tabindex-[-1]"
343
- // Not tabbable (hidden input handles focus)
344
- ],
345
- {
346
- variants: {
347
- /**
348
- * Size Variants
349
- * All sizes meet WCAG AAA touch target minimum (44x44px)
350
- */
351
- size: {
352
- /**
353
- * Small: 40×40px base + 4px padding = 44×44px touch target
354
- * Font: 16px (base size)
355
- * Use case: Compact layouts, mobile optimization
356
- */
357
- sm: [
358
- "h-10",
359
- // 40px
360
- "w-10",
361
- // 40px
362
- "text-base",
363
- // 16px
364
- "p-1"
365
- // 4px padding for touch target
366
- ],
367
- /**
368
- * Medium (default): 48×56px
369
- * Font: 20px (comfortable reading size)
370
- * Use case: Standard desktop/mobile layouts
371
- */
372
- md: [
373
- "h-14",
374
- // 56px
375
- "w-10 sm:w-12 md:w-14",
376
- // 48px
377
- "text-xl"
378
- // 20px
379
- ],
380
- /**
381
- * Large: 56×64px
382
- * Font: 24px (large reading size)
383
- * Use case: Accessibility focus, high-visibility needs
384
- */
385
- lg: [
386
- "h-16",
387
- // 64px
388
- "w-10 sm:w-12 md:w-16",
389
- // 56px
390
- "text-2xl"
391
- // 24px
392
- ]
393
- },
394
- /**
395
- * State Variants
396
- * All states meet WCAG AAA contrast (7:1 minimum)
397
- */
398
- state: {
399
- /**
400
- * Default: Standard input appearance
401
- * Border: --border
402
- * Background: --background
403
- * Text: --foreground
404
- */
405
- default: [
406
- "border-[var(--input)]",
407
- "bg-[var(--content-background)]",
408
- "text-[var(--content-foreground)]",
409
- "hover:border-[var(--input-hover)]"
410
- ],
411
- /**
412
- * Focus: Active digit being edited
413
- * Border: --primary
414
- * Ring: --ring (2px, 2px offset)
415
- * Contrast: 7:1 minimum
416
- */
417
- focus: [
418
- "border-[var(--input)]",
419
- "ring-2",
420
- "ring-[var(--primary)]",
421
- "ring-offset-2",
422
- "ring-offset-background",
423
- "outline-none"
424
- ],
425
- /**
426
- * Filled: Digit has been entered
427
- * Border: --primary with 50% opacity
428
- * Text: Bold weight for emphasis
429
- */
430
- filled: [
431
- "border-[var(--primary)]",
432
- "bg-[var(--content-background)]",
433
- "text-[var(--content-foreground)]",
434
- "font-bold"
435
- ],
436
- /**
437
- * Error: Validation failed
438
- * Border: --destructive
439
- * Background: --destructive with 10% opacity
440
- * Text: --destructive-foreground
441
- * Animation: Shake on error
442
- */
443
- error: [
444
- "border-[var(--destructive)]",
445
- "bg-[var(--content-background)]",
446
- "text-[var(--destructive-foreground)]",
447
- "animate-shake"
448
- ],
449
- /**
450
- * Success: Validation passed (optional)
451
- * Border: Green (or --success if available)
452
- * Background: Green with 10% opacity
453
- * May include checkmark icon
454
- */
455
- success: [
456
- "border-green-600",
457
- "bg-green-50",
458
- "text-green-900",
459
- "dark:border-green-500",
460
- "dark:bg-green-900/20",
461
- "dark:text-green-100"
462
- ],
463
- /**
464
- * Disabled: Input not interactive
465
- * Border: --border with 50% opacity
466
- * Background: --muted with 50% opacity
467
- * Text: --muted-foreground
468
- * Cursor: not-allowed
469
- * Opacity: 60%
470
- * Contrast: 4.5:1 minimum (AA standard for disabled)
471
- */
472
- disabled: [
473
- "border-[var(--accent-background)]",
474
- "bg-[var(--accent-background)]",
475
- "text-[var(--menu-muted)]",
476
- "cursor-not-allowed",
477
- "opacity-60",
478
- "hover:border-[var(--accent-background)]"
479
- // Prevent hover effect
480
- ]
481
- }
482
- },
483
- defaultVariants: {
484
- size: "md",
485
- state: "default"
486
- }
487
- }
488
- );
489
- var otpContainerVariants = classVarianceAuthority.cva(
490
- [
491
- "inline-flex",
492
- "flex-col",
493
- "gap-2"
494
- ],
495
- {
496
- variants: {
497
- /**
498
- * Container size variants
499
- * Affects spacing and layout
500
- */
501
- size: {
502
- sm: ["gap-1.5"],
503
- md: ["gap-2"],
504
- lg: ["gap-3"]
505
- }
506
- },
507
- defaultVariants: {
508
- size: "md"
509
- }
510
- }
511
- );
512
- var otpDigitGroupVariants = classVarianceAuthority.cva(
513
- [
514
- "flex",
515
- "items-center"
516
- ],
517
- {
518
- variants: {
519
- /**
520
- * Gap between digits
521
- */
522
- size: {
523
- sm: ["gap-1.5"],
524
- // 6px
525
- md: ["gap-2"],
526
- // 8px
527
- lg: ["gap-3"]
528
- // 12px
529
- }
530
- },
531
- defaultVariants: {
532
- size: "md"
533
- }
534
- }
535
- );
536
- var otpErrorVariants = classVarianceAuthority.cva([
537
- "text-sm",
538
- "font-medium",
539
- "text-[var(--destructive)]",
540
- "mt-1.5",
541
- "text-center"
542
- ]);
543
- var otpDescriptionVariants = classVarianceAuthority.cva([
544
- "text-sm",
545
- "text-[var(--menu-muted)]",
546
- "mt-1"
547
- ]);
548
- var OTPDigitComponent = ({
549
- value,
550
- focused,
551
- size = "md",
552
- state = "default",
553
- masked = false,
554
- className,
555
- index
556
- }) => {
557
- const isFilled = value !== "_" && value !== "";
558
- const computedState = focused && !state ? "focus" : isFilled && state === "default" ? "filled" : state;
559
- const displayValue = masked && isFilled ? "\u2022" : value === "_" ? "" : value;
560
- return /* @__PURE__ */ jsxRuntime.jsx(
561
- "div",
562
- {
563
- className: cn(
564
- otpDigitVariants({ size, state: computedState }),
565
- className
566
- ),
567
- role: "presentation",
568
- "aria-hidden": "true",
569
- "data-focused": focused,
570
- "data-filled": isFilled,
571
- "data-index": index,
572
- children: displayValue || /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[var(--menu-muted)] opacity-40", children: "\u2022" })
573
- }
574
- );
575
- };
576
- var OTPDigit = react.memo(OTPDigitComponent);
577
- OTPDigit.displayName = "OTPDigit";
578
- var OTPInput = react.forwardRef((props, ref) => {
579
- const {
580
- label,
581
- description,
582
- size = "md",
583
- disabled = false,
584
- readOnly = false,
585
- mask = false,
586
- showSuccess = false,
587
- className,
588
- digitClassName,
589
- onFocus,
590
- onBlur,
591
- inputMode = "numeric",
592
- length = 6
593
- } = props;
594
- const {
595
- value,
596
- focusedIndex,
597
- error,
598
- isComplete,
599
- handleChange,
600
- handleKeyDown,
601
- handlePaste,
602
- setFocusedIndex,
603
- clear,
604
- setValue,
605
- validate
606
- } = useOTPInput(props);
607
- const inputRef = react.useRef(null);
608
- react.useImperativeHandle(ref, () => ({
609
- focus: () => inputRef.current?.focus(),
610
- blur: () => inputRef.current?.blur(),
611
- clear,
612
- setValue,
613
- getValue: () => value.replace(/_/g, ""),
614
- isComplete: () => isComplete,
615
- validate,
616
- getElement: () => inputRef.current
617
- }));
618
- const digits = value.split("");
619
- const getDigitState = (index) => {
620
- if (disabled) return "disabled";
621
- if (error) return "error";
622
- if (showSuccess && isComplete && !error) return "success";
623
- if (index === focusedIndex) return "focus";
624
- if (digits[index] !== "_") return "filled";
625
- return "default";
626
- };
627
- const handleFocusEvent = (e) => {
628
- onFocus?.(e);
629
- };
630
- const handleBlurEvent = (e) => {
631
- onBlur?.(e);
632
- };
633
- const handleDigitClick = (index) => {
634
- if (disabled || readOnly) return;
635
- setFocusedIndex(index);
636
- inputRef.current?.focus();
637
- };
638
- const handleDigitKeyDown = (e, index) => {
639
- if (e.key === "Enter" || e.key === " ") {
640
- e.preventDefault();
641
- handleDigitClick(index);
642
- }
643
- };
644
- const descriptionId = description ? `otp-description-${Math.random().toString(36).slice(2, 9)}` : void 0;
645
- const errorId = error ? `otp-error-${Math.random().toString(36).slice(2, 9)}` : void 0;
646
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(otpContainerVariants({ size }), className), children: [
647
- /* @__PURE__ */ jsxRuntime.jsx(
648
- "input",
649
- {
650
- ref: inputRef,
651
- type: "text",
652
- inputMode,
653
- value: value.replace(/_/g, ""),
654
- onChange: handleChange,
655
- onKeyDown: handleKeyDown,
656
- onPaste: handlePaste,
657
- onFocus: handleFocusEvent,
658
- onBlur: handleBlurEvent,
659
- disabled,
660
- readOnly,
661
- "aria-label": label,
662
- "aria-describedby": [descriptionId, errorId].filter(Boolean).join(" "),
663
- "aria-invalid": !!error,
664
- "aria-errormessage": errorId,
665
- className: "sr-only",
666
- autoComplete: "one-time-code",
667
- maxLength: length
668
- }
669
- ),
670
- /* @__PURE__ */ jsxRuntime.jsx(
671
- "div",
672
- {
673
- className: cn(otpDigitGroupVariants({ size })),
674
- role: "presentation",
675
- "aria-hidden": "true",
676
- children: digits.map((digit, index) => /* @__PURE__ */ jsxRuntime.jsx(
677
- "div",
678
- {
679
- onClick: () => handleDigitClick(index),
680
- onKeyDown: (e) => handleDigitKeyDown(e, index),
681
- role: "button",
682
- tabIndex: -1,
683
- className: "cursor-text",
684
- children: /* @__PURE__ */ jsxRuntime.jsx(
685
- OTPDigit,
686
- {
687
- value: digit,
688
- focused: index === focusedIndex,
689
- size,
690
- state: getDigitState(index),
691
- masked: mask,
692
- className: digitClassName,
693
- index
694
- }
695
- )
696
- },
697
- index
698
- ))
699
- }
700
- ),
701
- description && /* @__PURE__ */ jsxRuntime.jsx("p", { id: descriptionId, className: otpDescriptionVariants(), children: description }),
702
- error && /* @__PURE__ */ jsxRuntime.jsx(
703
- "p",
704
- {
705
- id: errorId,
706
- className: otpErrorVariants(),
707
- role: "alert",
708
- "aria-live": "assertive",
709
- children: error
710
- }
711
- ),
712
- /* @__PURE__ */ jsxRuntime.jsxs(
713
- "div",
714
- {
715
- role: "status",
716
- "aria-live": "polite",
717
- "aria-atomic": "true",
718
- className: "sr-only",
719
- children: [
720
- !isComplete && !error && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
721
- value.replace(/_/g, "").length,
722
- " of ",
723
- length,
724
- " digits entered"
725
- ] }),
726
- isComplete && !error && /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Verification code complete" })
727
- ]
728
- }
729
- )
730
- ] });
731
- });
732
- OTPInput.displayName = "OTPInput";
733
-
734
- exports.OTPInput = OTPInput;
735
- //# sourceMappingURL=index.js.map
2
+ 'use strict';var react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime');function N(...d){return tailwindMerge.twMerge(clsx.clsx(d))}function Z(d){let{value:p,length:b,focusedIndex:e,onChange:a,setFocusedIndex:t,disabled:y=false,readOnly:f=false}=d,h=react.useCallback(()=>{e>0&&t(e-1);},[e,t]),x=react.useCallback(()=>{e<b-1&&t(e+1);},[e,b,t]),P=react.useCallback(()=>{if(f)return;let r=p.split("");if(r[e]==="_"){if(e>0){let l=e-1;r[l]="_",a(r.join("")),t(l);}}else r[e]="_",a(r.join("")),e>0&&t(e-1);},[p,e,f,a,t]),E=react.useCallback(()=>{if(f)return;let r=p.split("");r[e]="_",a(r.join(""));},[p,e,f,a]),m=react.useCallback(()=>{t(0);},[t]),w=react.useCallback(()=>{t(b-1);},[b,t]);return {handleKeyDown:react.useCallback(r=>{if(!y)switch(r.key){case "ArrowLeft":r.preventDefault(),h();break;case "ArrowRight":r.preventDefault(),x();break;case "Backspace":r.preventDefault(),P();break;case "Delete":r.preventDefault(),E();break;case "Home":r.preventDefault(),m();break;case "End":r.preventDefault(),w();break;case "a":case "A":if(r.ctrlKey||r.metaKey)return;break;case "Enter":r.preventDefault();break;}},[y,h,x,P,E,m,w])}}function Q(d){let{value:p,defaultValue:b="",length:e=6,type:a="numeric",pattern:t,onChange:y,onComplete:f,validate:h,error:x,disabled:P=false,readOnly:E=false}=d,m=p!==void 0,[w,R]=react.useState(()=>(b||"").padEnd(e,"_")),[r,K]=react.useState(null),[l,g]=react.useState(0),I=react.useRef(null),D=react.useRef(null),T=m?p||"".padEnd(e,"_"):w,F=x!==void 0?x:r,L=react.useCallback(n=>{if(n.replace(/_/g,"").length<e)return null;if(h)return h(n);if(a==="numeric"){let o=/^\d+$/,i=n.replace(/_/g,"");if(!o.test(i))return "Code must contain only digits"}else if(a==="alphanumeric"){let o=/^[A-Za-z0-9]+$/,i=n.replace(/_/g,"");if(!o.test(i))return "Code must contain only letters and numbers"}else if(a==="custom"&&t){let o=n.replace(/_/g,"");for(let i of o)if(!t.test(i))return "Invalid character in code"}return null},[e,a,t,h]),v=react.useCallback(n=>{m||R(n),y?.(n);let u=L(n);m||K(u);let i=n.replace(/_/g,"").length===e;i&&!u&&I.current!==n&&(I.current=n,D.current&&clearTimeout(D.current),D.current=setTimeout(()=>{f?.(n.replace(/_/g,""));},200)),!i&&I.current&&(I.current=null);},[m,e,y,f,L]),A=react.useCallback(n=>{if(P)return;let u=n.target.value,o=u[u.length-1]||"",i=false;if(a==="numeric"?i=/^\d$/.test(o):a==="alphanumeric"?i=/^[A-Za-z0-9]$/.test(o):a==="custom"&&t?i=t.test(o):i=true,!i)return;let s=T.split("");s[l]=o;let c=s.join("");v(c),l<e-1&&g(l+1);},[P,a,t,T,l,e,v]),O=react.useCallback(async n=>{if(P||E)return;n.preventDefault();let u=n.clipboardData.getData("text/plain").trim();if(!u||d.onPaste&&await d.onPaste(u)===false)return;let o="";for(let c of u){if(o.length>=e)break;let V=false;a==="numeric"?V=/^\d$/.test(c):a==="alphanumeric"?V=/^[A-Za-z0-9]$/.test(c):a==="custom"&&t?V=t.test(c):V=true,V&&(o+=c);}let i=o.padEnd(e,"_");v(i);let s=i.indexOf("_");g(s===-1?e-1:s);},[P,E,d,e,a,t,v]),M=react.useCallback(()=>{let n="".padEnd(e,"_");v(n),g(0),m||K(null),I.current=null;},[e,v,m]),$=react.useCallback(n=>{let u=n.padEnd(e,"_").slice(0,e);v(u);let o=u.indexOf("_");g(o===-1?e-1:o);},[e,v]),B=react.useCallback(()=>L(T),[T,L]),U=T.replace(/_/g,"").length===e,{handleKeyDown:z}=Z({value:T,length:e,focusedIndex:l,onChange:v,setFocusedIndex:g,disabled:P,readOnly:E});return react.useEffect(()=>{if(m&&p!==void 0){let n=p.indexOf("_");n!==-1&&g(n);}},[m,p]),react.useEffect(()=>()=>{D.current&&clearTimeout(D.current);},[]),{value:T,focusedIndex:l,error:F,isComplete:U,handleChange:A,handleKeyDown:z,handlePaste:O,setFocusedIndex:g,clear:M,setValue:$,validate:B}}var W=classVarianceAuthority.cva(["inline-flex","items-center","justify-center","rounded-md","border-2","font-semibold","transition-all","duration-200","ease-in-out","select-none","tabindex-[-1]"],{variants:{size:{sm:["h-10","w-10","text-base","p-1"],md:["h-14","w-10 sm:w-12 md:w-14","text-xl"],lg:["h-16","w-10 sm:w-12 md:w-16","text-2xl"]},state:{default:["border-[var(--input-border)]","bg-[var(--content-background)]","text-[var(--content-foreground)]","hover:border-[var(--input-border)]/80"],focus:["border-[var(--input-border)]","ring-2","ring-[var(--primary)]","ring-offset-2","ring-offset-background","outline-none"],filled:["border-[var(--primary)]","bg-[var(--content-background)]","text-[var(--content-foreground)]","font-bold"],error:["border-[var(--destructive-background)]","bg-[var(--content-background)]","text-[var(--destructive-foreground)]","animate-shake"],success:["border-green-600","bg-green-50","text-green-900","dark:border-green-500","dark:bg-green-900/20","dark:text-green-100"],disabled:["border-[var(--accent-background)]","bg-[var(--accent-background)]","text-[var(--menu-muted)]","cursor-not-allowed","opacity-60","hover:border-[var(--accent-background)]"]}},defaultVariants:{size:"md",state:"default"}}),X=classVarianceAuthority.cva(["inline-flex","flex-col","gap-2"],{variants:{size:{sm:["gap-1.5"],md:["gap-2"],lg:["gap-3"]}},defaultVariants:{size:"md"}}),Y=classVarianceAuthority.cva(["flex","items-center"],{variants:{size:{sm:["gap-1.5"],md:["gap-2"],lg:["gap-3"]}},defaultVariants:{size:"md"}}),ee=classVarianceAuthority.cva(["text-sm","font-medium","text-[var(--destructive-background)]","mt-1.5","text-center"]),te=classVarianceAuthority.cva(["text-sm","text-[var(--menu-muted)]","mt-1"]);var le=({value:d,focused:p,size:b="md",state:e="default",masked:a=false,className:t,index:y})=>{let f=d!=="_"&&d!=="",h=p&&!e?"focus":f&&e==="default"?"filled":e,x=a&&f?"\u2022":d==="_"?"":d;return jsxRuntime.jsx("div",{className:N(W({size:b,state:h}),t),role:"presentation","aria-hidden":"true","data-focused":p,"data-filled":f,"data-index":y,children:x||jsxRuntime.jsx("span",{className:"text-[var(--menu-muted)] opacity-40",children:"\u2022"})})},j=react.memo(le);j.displayName="OTPDigit";var ae=react.forwardRef((d,p)=>{let{label:b,description:e,size:a="md",disabled:t=false,readOnly:y=false,mask:f=false,showSuccess:h=false,className:x,digitClassName:P,onFocus:E,onBlur:m,inputMode:w="numeric",length:R=6}=d,{value:r,focusedIndex:K,error:l,isComplete:g,handleChange:I,handleKeyDown:D,handlePaste:T,setFocusedIndex:F,clear:L,setValue:v,validate:A}=Q(d),O=react.useRef(null);react.useImperativeHandle(p,()=>({focus:()=>O.current?.focus(),blur:()=>O.current?.blur(),clear:L,setValue:v,getValue:()=>r.replace(/_/g,""),isComplete:()=>g,validate:A,getElement:()=>O.current}));let M=r.split(""),$=s=>t?"disabled":l?"error":h&&g&&!l?"success":s===K?"focus":M[s]!=="_"?"filled":"default",B=s=>{E?.(s);},U=s=>{m?.(s);},z=s=>{t||y||(F(s),O.current?.focus());},n=(s,c)=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),z(c));},u=react.useId(),o=e?`${u}-description`:void 0,i=l?`${u}-error`:void 0;return jsxRuntime.jsxs("div",{className:N(X({size:a}),x),children:[jsxRuntime.jsx("input",{ref:O,type:"text",inputMode:w,value:r.replace(/_/g,""),onChange:I,onKeyDown:D,onPaste:T,onFocus:B,onBlur:U,disabled:t,readOnly:y,"aria-label":b,"aria-describedby":[o,i].filter(Boolean).join(" "),"aria-invalid":!!l,"aria-errormessage":i,className:"sr-only",autoComplete:"one-time-code",maxLength:R}),jsxRuntime.jsx("div",{className:N(Y({size:a})),role:"presentation","aria-hidden":"true",children:M.map((s,c)=>jsxRuntime.jsx("div",{onClick:()=>z(c),onKeyDown:V=>n(V,c),role:"button",tabIndex:-1,className:"cursor-text",children:jsxRuntime.jsx(j,{value:s,focused:c===K,size:a,state:$(c),masked:f,className:P,index:c})},c))}),e&&jsxRuntime.jsx("p",{id:o,className:te(),children:e}),l&&jsxRuntime.jsx("p",{id:i,className:ee(),role:"alert","aria-live":"assertive",children:l}),jsxRuntime.jsxs("div",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:[!g&&!l&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[r.replace(/_/g,"").length," of ",R," digits entered"]}),g&&!l&&jsxRuntime.jsx(jsxRuntime.Fragment,{children:"Verification code complete"})]})]})});ae.displayName="OTPInput";exports.OTPInput=ae;//# sourceMappingURL=index.js.map
736
3
  //# sourceMappingURL=index.js.map