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