@tribepad/themis 1.0.1 → 1.0.2

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 (301) 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/index.js +1 -666
  115. package/dist/elements/NumberField/index.js.map +1 -1
  116. package/dist/elements/NumberField/index.mjs +1 -654
  117. package/dist/elements/NumberField/index.mjs.map +1 -1
  118. package/dist/elements/OTPInput/OTPInput.d.ts.map +1 -1
  119. package/dist/elements/OTPInput/index.js +1 -734
  120. package/dist/elements/OTPInput/index.js.map +1 -1
  121. package/dist/elements/OTPInput/index.mjs +1 -732
  122. package/dist/elements/OTPInput/index.mjs.map +1 -1
  123. package/dist/elements/Pagination/Pagination.d.ts +45 -0
  124. package/dist/elements/Pagination/Pagination.d.ts.map +1 -0
  125. package/dist/elements/Pagination/Pagination.styles.d.ts +10 -0
  126. package/dist/elements/Pagination/Pagination.styles.d.ts.map +1 -0
  127. package/dist/elements/Pagination/Pagination.types.d.ts +55 -0
  128. package/dist/elements/Pagination/Pagination.types.d.ts.map +1 -0
  129. package/dist/elements/Pagination/index.d.ts +21 -0
  130. package/dist/elements/Pagination/index.d.ts.map +1 -0
  131. package/dist/elements/Pagination/index.js +3 -0
  132. package/dist/elements/Pagination/index.js.map +1 -0
  133. package/dist/elements/Pagination/index.mjs +3 -0
  134. package/dist/elements/Pagination/index.mjs.map +1 -0
  135. package/dist/elements/Panel/index.js +1 -330
  136. package/dist/elements/Panel/index.js.map +1 -1
  137. package/dist/elements/Panel/index.mjs +1 -323
  138. package/dist/elements/Panel/index.mjs.map +1 -1
  139. package/dist/elements/PasswordField/PasswordField.d.ts +27 -0
  140. package/dist/elements/PasswordField/PasswordField.d.ts.map +1 -0
  141. package/dist/elements/PasswordField/PasswordField.styles.d.ts +32 -0
  142. package/dist/elements/PasswordField/PasswordField.styles.d.ts.map +1 -0
  143. package/dist/elements/PasswordField/PasswordField.types.d.ts +100 -0
  144. package/dist/elements/PasswordField/PasswordField.types.d.ts.map +1 -0
  145. package/dist/elements/PasswordField/index.css +2 -0
  146. package/dist/elements/PasswordField/index.css.map +1 -0
  147. package/dist/elements/PasswordField/index.d.ts +20 -0
  148. package/dist/elements/PasswordField/index.d.ts.map +1 -0
  149. package/dist/elements/PasswordField/index.js +3 -0
  150. package/dist/elements/PasswordField/index.js.map +1 -0
  151. package/dist/elements/PasswordField/index.mjs +3 -0
  152. package/dist/elements/PasswordField/index.mjs.map +1 -0
  153. package/dist/elements/Progress/index.js +1 -187
  154. package/dist/elements/Progress/index.js.map +1 -1
  155. package/dist/elements/Progress/index.mjs +1 -181
  156. package/dist/elements/Progress/index.mjs.map +1 -1
  157. package/dist/elements/RadioGroup/index.js +1 -369
  158. package/dist/elements/RadioGroup/index.js.map +1 -1
  159. package/dist/elements/RadioGroup/index.mjs +1 -359
  160. package/dist/elements/RadioGroup/index.mjs.map +1 -1
  161. package/dist/elements/Resizable/index.js +1 -1580
  162. package/dist/elements/Resizable/index.js.map +1 -1
  163. package/dist/elements/Resizable/index.mjs +1 -1566
  164. package/dist/elements/Resizable/index.mjs.map +1 -1
  165. package/dist/elements/SearchField/SearchField.d.ts +27 -0
  166. package/dist/elements/SearchField/SearchField.d.ts.map +1 -0
  167. package/dist/elements/SearchField/SearchField.styles.d.ts +32 -0
  168. package/dist/elements/SearchField/SearchField.styles.d.ts.map +1 -0
  169. package/dist/elements/SearchField/SearchField.types.d.ts +45 -0
  170. package/dist/elements/SearchField/SearchField.types.d.ts.map +1 -0
  171. package/dist/elements/SearchField/index.css +2 -0
  172. package/dist/elements/SearchField/index.css.map +1 -0
  173. package/dist/elements/SearchField/index.d.ts +21 -0
  174. package/dist/elements/SearchField/index.d.ts.map +1 -0
  175. package/dist/elements/SearchField/index.js +3 -0
  176. package/dist/elements/SearchField/index.js.map +1 -0
  177. package/dist/elements/SearchField/index.mjs +3 -0
  178. package/dist/elements/SearchField/index.mjs.map +1 -0
  179. package/dist/elements/Select/Select.d.ts +19 -48
  180. package/dist/elements/Select/Select.d.ts.map +1 -1
  181. package/dist/elements/Select/Select.styles.d.ts +55 -0
  182. package/dist/elements/Select/Select.styles.d.ts.map +1 -0
  183. package/dist/elements/Select/index.js +1 -589
  184. package/dist/elements/Select/index.js.map +1 -1
  185. package/dist/elements/Select/index.mjs +1 -582
  186. package/dist/elements/Select/index.mjs.map +1 -1
  187. package/dist/elements/Skeleton/index.js +1 -82
  188. package/dist/elements/Skeleton/index.js.map +1 -1
  189. package/dist/elements/Skeleton/index.mjs +1 -78
  190. package/dist/elements/Skeleton/index.mjs.map +1 -1
  191. package/dist/elements/Switch/index.js +1 -179
  192. package/dist/elements/Switch/index.js.map +1 -1
  193. package/dist/elements/Switch/index.mjs +1 -173
  194. package/dist/elements/Switch/index.mjs.map +1 -1
  195. package/dist/elements/Table/Table.d.ts +3 -24
  196. package/dist/elements/Table/Table.d.ts.map +1 -1
  197. package/dist/elements/Table/Table.styles.d.ts +24 -0
  198. package/dist/elements/Table/Table.styles.d.ts.map +1 -0
  199. package/dist/elements/Table/index.js +1 -595
  200. package/dist/elements/Table/index.js.map +1 -1
  201. package/dist/elements/Table/index.mjs +1 -578
  202. package/dist/elements/Table/index.mjs.map +1 -1
  203. package/dist/elements/Tabs/index.js +1 -337
  204. package/dist/elements/Tabs/index.js.map +1 -1
  205. package/dist/elements/Tabs/index.mjs +1 -320
  206. package/dist/elements/Tabs/index.mjs.map +1 -1
  207. package/dist/elements/TextField/TextField.d.ts +6 -42
  208. package/dist/elements/TextField/TextField.d.ts.map +1 -1
  209. package/dist/elements/TextField/TextField.hooks.d.ts +63 -0
  210. package/dist/elements/TextField/TextField.hooks.d.ts.map +1 -0
  211. package/dist/elements/TextField/TextField.icons.d.ts +19 -0
  212. package/dist/elements/TextField/TextField.icons.d.ts.map +1 -0
  213. package/dist/elements/TextField/TextField.styles.d.ts +37 -0
  214. package/dist/elements/TextField/TextField.styles.d.ts.map +1 -0
  215. package/dist/elements/TextField/TextField.types.d.ts +3 -0
  216. package/dist/elements/TextField/TextField.types.d.ts.map +1 -1
  217. package/dist/elements/TextField/index.css +1 -22
  218. package/dist/elements/TextField/index.css.map +1 -1
  219. package/dist/elements/TextField/index.js +1 -902
  220. package/dist/elements/TextField/index.js.map +1 -1
  221. package/dist/elements/TextField/index.mjs +1 -882
  222. package/dist/elements/TextField/index.mjs.map +1 -1
  223. package/dist/elements/TimeField/index.js +1 -254
  224. package/dist/elements/TimeField/index.js.map +1 -1
  225. package/dist/elements/TimeField/index.mjs +1 -238
  226. package/dist/elements/TimeField/index.mjs.map +1 -1
  227. package/dist/elements/Toast/Toast.d.ts +0 -22
  228. package/dist/elements/Toast/Toast.d.ts.map +1 -1
  229. package/dist/elements/Toast/index.js +1 -737
  230. package/dist/elements/Toast/index.js.map +1 -1
  231. package/dist/elements/Toast/index.mjs +1 -724
  232. package/dist/elements/Toast/index.mjs.map +1 -1
  233. package/dist/elements/Tooltip/index.js +1 -323
  234. package/dist/elements/Tooltip/index.js.map +1 -1
  235. package/dist/elements/Tooltip/index.mjs +1 -310
  236. package/dist/elements/Tooltip/index.mjs.map +1 -1
  237. package/dist/elements/index.css +1 -22
  238. package/dist/elements/index.css.map +1 -1
  239. package/dist/elements/index.d.ts +13 -1
  240. package/dist/elements/index.d.ts.map +1 -1
  241. package/dist/elements/index.js +1 -12455
  242. package/dist/elements/index.js.map +1 -1
  243. package/dist/elements/index.mjs +1 -12233
  244. package/dist/elements/index.mjs.map +1 -1
  245. package/dist/index.css +1 -22
  246. package/dist/index.css.map +1 -1
  247. package/dist/index.js +2 -12490
  248. package/dist/index.js.map +1 -1
  249. package/dist/index.mjs +2 -12262
  250. package/dist/index.mjs.map +1 -1
  251. package/dist/schemas/index.js +2 -54
  252. package/dist/schemas/index.js.map +1 -1
  253. package/dist/schemas/index.mjs +2 -48
  254. package/dist/schemas/index.mjs.map +1 -1
  255. package/dist/styles/defaults.css +151 -0
  256. package/dist/styles/index.js +1 -166
  257. package/dist/styles/index.js.map +1 -1
  258. package/dist/styles/index.mjs +1 -129
  259. package/dist/styles/index.mjs.map +1 -1
  260. package/dist/utils/index.js +1 -12
  261. package/dist/utils/index.js.map +1 -1
  262. package/dist/utils/index.mjs +1 -10
  263. package/dist/utils/index.mjs.map +1 -1
  264. package/package.json +9 -7
  265. package/src/elements/Accordion/Accordion.stories.tsx +1 -1
  266. package/src/elements/AlertDialog/AlertDialog.stories.tsx +124 -0
  267. package/src/elements/Avatar/Avatar.stories.tsx +1 -1
  268. package/src/elements/Badge/Badge.stories.tsx +1 -1
  269. package/src/elements/Breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  270. package/src/elements/Button/Button.stories.tsx +1 -1
  271. package/src/elements/ButtonGroup/ButtonGroup.stories.tsx +1 -1
  272. package/src/elements/Card/Card.stories.tsx +1 -1
  273. package/src/elements/Carousel/Carousel.stories.tsx +1 -1
  274. package/src/elements/Chart/Chart.stories.tsx +1 -1
  275. package/src/elements/Checkbox/Checkbox.stories.tsx +1 -1
  276. package/src/elements/CheckboxGroup/CheckboxGroup.stories.tsx +1 -1
  277. package/src/elements/Combobox/Combobox.stories.tsx +133 -0
  278. package/src/elements/DatePicker/DatePicker.stories.tsx +1 -1
  279. package/src/elements/Dropdown/Dropdown.stories.tsx +1 -1
  280. package/src/elements/FileField/FileField.stories.tsx +1 -1
  281. package/src/elements/FileField/FileProgress.stories.tsx +1 -1
  282. package/src/elements/FormLayout/FormLayout.stories.tsx +1 -1
  283. package/src/elements/Modal/Modal.stories.tsx +1 -1
  284. package/src/elements/NumberField/NumberField.stories.tsx +1 -1
  285. package/src/elements/OTPInput/OTPInput.stories.tsx +1 -1
  286. package/src/elements/Pagination/Pagination.stories.tsx +203 -0
  287. package/src/elements/Panel/Panel.stories.tsx +1 -1
  288. package/src/elements/PasswordField/PasswordField.stories.tsx +167 -0
  289. package/src/elements/Progress/Progress.stories.tsx +1 -1
  290. package/src/elements/RadioGroup/RadioGroup.stories.tsx +1 -1
  291. package/src/elements/Resizable/Resizable.stories.tsx +1 -1
  292. package/src/elements/SearchField/SearchField.stories.tsx +146 -0
  293. package/src/elements/Select/Select.stories.tsx +1 -1
  294. package/src/elements/Skeleton/Skeleton.stories.tsx +1 -1
  295. package/src/elements/Switch/Switch.stories.tsx +1 -1
  296. package/src/elements/Table/Table.stories.tsx +1 -1
  297. package/src/elements/Tabs/Tabs.stories.tsx +1 -1
  298. package/src/elements/TextField/TextField.stories.tsx +1 -1
  299. package/src/elements/TimeField/TimeField.stories.tsx +1 -1
  300. package/src/elements/Toast/Toast.stories.tsx +1 -1
  301. package/src/elements/Tooltip/Tooltip.stories.tsx +1 -1
@@ -1,884 +1,3 @@
1
1
  "use client";
2
- import { createContext, memo, forwardRef, useId, useState, useEffect, useCallback, useMemo, useContext } from 'react';
3
- import { Button as Button$1, Label, Input, Text, FieldError, TextField as TextField$1 } from 'react-aria-components';
4
- import { cva } from 'class-variance-authority';
5
- import { clsx } from 'clsx';
6
- import { twMerge } from 'tailwind-merge';
7
- import { Loader2, Zap, CircleAlert } from 'lucide-react';
8
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
- import { z } from 'zod';
10
-
11
- // src/elements/TextField/TextField.tsx
12
- function cn(...inputs) {
13
- return twMerge(clsx(inputs));
14
- }
15
- var PRESSED_STYLES = "data-[pressed]:scale-[0.97]";
16
- var HOVER_STYLES = "data-[hovered]:shadow-md";
17
- var HIGH_CONTRAST_HOVER = "hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground";
18
- var HIGH_CONTRAST_PRESSED = "hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";
19
- var DISABLED_STYLES = "disabled:pointer-events-none disabled:opacity-50";
20
- var ButtonGroupContext = createContext(null);
21
- ButtonGroupContext.displayName = "ButtonGroupContext";
22
- function useButtonGroupContext() {
23
- return useContext(ButtonGroupContext);
24
- }
25
- var ButtonGroupItemContext = createContext(null);
26
- ButtonGroupItemContext.displayName = "ButtonGroupItemContext";
27
- function useButtonGroupItemContext() {
28
- return useContext(ButtonGroupItemContext);
29
- }
30
- cva("inline-flex items-center gap-0", {
31
- variants: {
32
- orientation: {
33
- horizontal: "flex-row",
34
- vertical: "flex-col w-full"
35
- }
36
- },
37
- defaultVariants: {
38
- orientation: "horizontal"
39
- }
40
- });
41
- var buttonGroupItemVariants = cva("", {
42
- variants: {
43
- orientation: {
44
- // min-w-[44px] ensures visual layer fills touch target width (for icon buttons)
45
- horizontal: "min-w-[44px]",
46
- // flex (overrides inline-flex) + min-h-[44px] makes visual layer fill touch target,
47
- // eliminating gaps between stacked buttons in vertical orientation
48
- vertical: "flex min-h-[44px]"
49
- },
50
- position: {
51
- first: "",
52
- middle: "",
53
- last: "",
54
- only: ""
55
- // Single button - no modifications needed
56
- }
57
- },
58
- compoundVariants: [
59
- // ==========================================================================
60
- // Horizontal Orientation
61
- // ==========================================================================
62
- {
63
- orientation: "horizontal",
64
- position: "first",
65
- className: "rounded-r-none border-r-0"
66
- },
67
- {
68
- orientation: "horizontal",
69
- position: "middle",
70
- className: "rounded-none border-r-0"
71
- },
72
- {
73
- orientation: "horizontal",
74
- position: "last",
75
- className: "rounded-l-none"
76
- },
77
- // ==========================================================================
78
- // Vertical Orientation
79
- // Note: w-full is handled by Button's effectiveFullWidth for both layers
80
- // ==========================================================================
81
- {
82
- orientation: "vertical",
83
- position: "first",
84
- className: "rounded-b-none border-b-0"
85
- },
86
- {
87
- orientation: "vertical",
88
- position: "middle",
89
- className: "rounded-none border-b-0"
90
- },
91
- {
92
- orientation: "vertical",
93
- position: "last",
94
- className: "rounded-t-none"
95
- }
96
- ],
97
- defaultVariants: {
98
- orientation: "horizontal",
99
- position: "only"
100
- }
101
- });
102
- cva("bg-[var(--border)]", {
103
- variants: {
104
- orientation: {
105
- horizontal: "w-px h-6 mx-1",
106
- vertical: "h-px w-full my-1"
107
- }
108
- },
109
- defaultVariants: {
110
- orientation: "horizontal"
111
- }
112
- });
113
- var buttonOuterVariants = cva(
114
- "inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",
115
- {
116
- variants: {
117
- fullWidth: {
118
- true: "w-full",
119
- false: ""
120
- },
121
- inVerticalGroup: {
122
- true: "items-stretch",
123
- false: "items-center"
124
- }
125
- },
126
- defaultVariants: {
127
- fullWidth: false,
128
- inVerticalGroup: false
129
- }
130
- }
131
- );
132
- var buttonVisualVariants = cva(
133
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",
134
- {
135
- variants: {
136
- variant: {
137
- default: "bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80",
138
- destructive: "bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80",
139
- outline: "border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]",
140
- secondary: "bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70",
141
- ghost: "hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]",
142
- link: "text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]"
143
- },
144
- fullWidth: {
145
- true: "w-full",
146
- false: ""
147
- },
148
- visualSize: {
149
- default: "h-10 px-4 py-2",
150
- sm: "h-9 rounded-md px-3 text-xs",
151
- lg: "h-11 rounded-md px-8",
152
- icon: "h-10 w-10",
153
- dot: "h-5 w-5 rounded-full p-0 min-h-0 min-w-0"
154
- },
155
- paywall: {
156
- true: "!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",
157
- false: ""
158
- }
159
- },
160
- defaultVariants: {
161
- variant: "default",
162
- visualSize: "default",
163
- paywall: false
164
- }
165
- }
166
- );
167
- var Button = memo(forwardRef(
168
- ({
169
- className,
170
- buttonVisualClassName,
171
- variant,
172
- size,
173
- visualSize,
174
- fullWidth,
175
- loading = false,
176
- loadingText = "Loading...",
177
- shortcut,
178
- children,
179
- isDisabled,
180
- paywall = false,
181
- paywallRedirect,
182
- paywallDescription,
183
- onPress,
184
- ...props
185
- }, ref) => {
186
- const paywallDescriptionId = useId();
187
- const groupContext = useButtonGroupContext();
188
- const itemContext = useButtonGroupItemContext();
189
- const effectiveVariant = variant ?? groupContext?.variant ?? "default";
190
- const effectiveSize = size ?? groupContext?.size;
191
- const effectiveIsDisabled = isDisabled ?? groupContext?.isDisabled ?? false;
192
- const isInVerticalGroup = groupContext?.orientation === "vertical";
193
- const effectiveFullWidth = fullWidth || isInVerticalGroup;
194
- const positionClassName = itemContext ? buttonGroupItemVariants({
195
- orientation: groupContext?.orientation ?? "horizontal",
196
- position: itemContext.position
197
- }) : "";
198
- const effectiveVisualSize = visualSize ?? effectiveSize ?? "default";
199
- if (process.env.NODE_ENV !== "production") {
200
- if ((effectiveVisualSize === "dot" || effectiveVisualSize === "icon") && !props["aria-label"] && !children) {
201
- console.warn(
202
- '[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'
203
- );
204
- }
205
- }
206
- const handlePress = (e) => {
207
- if (paywall) {
208
- if (paywallRedirect) {
209
- window.open(paywallRedirect, "_blank", "noopener,noreferrer");
210
- }
211
- return;
212
- }
213
- onPress?.(e);
214
- };
215
- const computedIsDisabled = effectiveIsDisabled || loading || void 0;
216
- return /* @__PURE__ */ jsx(
217
- Button$1,
218
- {
219
- ref,
220
- isDisabled: computedIsDisabled,
221
- "aria-disabled": paywall ? true : void 0,
222
- "aria-describedby": paywall ? paywallDescriptionId : void 0,
223
- onPress: handlePress,
224
- className: cn(buttonOuterVariants({ fullWidth: effectiveFullWidth, inVerticalGroup: isInVerticalGroup }), className),
225
- ...props,
226
- children: (renderProps) => (
227
- /* Layer 2: Visual Button */
228
- /* @__PURE__ */ jsxs(
229
- "span",
230
- {
231
- className: cn(
232
- buttonVisualVariants({
233
- variant: effectiveVariant,
234
- visualSize: effectiveVisualSize,
235
- paywall,
236
- fullWidth: effectiveFullWidth
237
- }),
238
- // Position styling from ButtonGroup context (border-radius adjustments)
239
- positionClassName,
240
- buttonVisualClassName,
241
- // Layer 2 interaction styles (no focus - focus ring is on Layer 1)
242
- PRESSED_STYLES,
243
- HOVER_STYLES,
244
- HIGH_CONTRAST_HOVER,
245
- HIGH_CONTRAST_PRESSED
246
- ),
247
- "data-pressed": renderProps.isPressed || void 0,
248
- children: [
249
- loading && /* @__PURE__ */ jsxs(Fragment, { children: [
250
- /* @__PURE__ */ jsx(Loader2, { className: "motion-safe:animate-spin", "aria-hidden": "true" }),
251
- /* @__PURE__ */ jsx("span", { className: "sr-only", "aria-live": "polite", children: loadingText })
252
- ] }),
253
- !loading && children,
254
- paywall && /* @__PURE__ */ jsx(
255
- Zap,
256
- {
257
- "data-testid": "zap-icon",
258
- "aria-hidden": "true",
259
- className: "ml-1"
260
- }
261
- ),
262
- paywall && /* @__PURE__ */ jsxs("span", { id: paywallDescriptionId, className: "sr-only", children: [
263
- "Premium feature: ",
264
- paywallDescription || "Upgrade required to access this feature"
265
- ] }),
266
- renderProps.isFocusVisible && shortcut && /* @__PURE__ */ jsx("kbd", { className: "ml-auto hidden text-xs opacity-60 lg:inline", children: shortcut }),
267
- renderProps.isPressed && /* @__PURE__ */ jsx(
268
- "span",
269
- {
270
- className: "absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95",
271
- "aria-hidden": "true"
272
- }
273
- )
274
- ]
275
- }
276
- )
277
- )
278
- }
279
- );
280
- }
281
- ));
282
- Button.displayName = "Button";
283
- var inputVariants = cva(
284
- // Base styles - FR-014: Proper input styling with focus states
285
- "flex w-full rounded-md border bg-[var(--content-background)] shadow-xs px-3 py-2 text-sm ring-offset-[var(--content-background)] file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-[var(--content-foreground)] placeholder:text-[var(--menu-muted)] transition-all duration-200",
286
- {
287
- variants: {
288
- // Size variants (matching Button sizes)
289
- size: {
290
- sm: "h-9 text-xs px-2 py-1",
291
- default: "h-10 px-3 py-2",
292
- lg: "h-11 px-4 py-3 text-base"
293
- },
294
- // State variants
295
- state: {
296
- default: "border-[var(--input-border)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2",
297
- error: "border-[var(--destructive-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--destructive-background)] focus-visible:ring-offset-2",
298
- success: "border-green-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-green-500 focus-visible:ring-offset-2",
299
- disabled: "cursor-not-allowed opacity-50",
300
- readonly: "cursor-default bg-[var(--content-background)] opacity-70"
301
- }
302
- },
303
- defaultVariants: {
304
- size: "default",
305
- state: "default"
306
- }
307
- }
308
- );
309
- var labelVariants = cva(
310
- // Base styles - FR-009: WCAG 2.2 AAA compliance
311
- "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
312
- {
313
- variants: {
314
- state: {
315
- default: "text-[var(--content-foreground)]",
316
- error: "text-[var(--destructive-foreground)]",
317
- disabled: "opacity-50 cursor-not-allowed"
318
- }
319
- },
320
- defaultVariants: {
321
- state: "default"
322
- }
323
- }
324
- );
325
- var descriptionVariants = cva(
326
- "text-sm text-[var(--content-foreground)]"
327
- );
328
- var errorMessageVariants = cva(
329
- "text-sm text-[var(--destructive-foreground)] font-medium mt-1.5"
330
- );
331
- var successMessageVariants = cva(
332
- "text-sm text-green-600 dark:text-green-500 font-medium mt-1.5"
333
- );
334
- var TextFieldLabel = forwardRef(
335
- ({ className, state = "default", children, ...props }, ref) => {
336
- return /* @__PURE__ */ jsx(
337
- Label,
338
- {
339
- ref,
340
- className: cn(labelVariants({ state }), className),
341
- ...props,
342
- children
343
- }
344
- );
345
- }
346
- );
347
- TextFieldLabel.displayName = "TextFieldLabel";
348
- var TextFieldInput = forwardRef(
349
- ({ className, size = "default", state = "default", ...props }, ref) => {
350
- return /* @__PURE__ */ jsx(
351
- Input,
352
- {
353
- ref,
354
- className: cn(inputVariants({ size, state }), DISABLED_STYLES, className),
355
- ...props
356
- }
357
- );
358
- }
359
- );
360
- TextFieldInput.displayName = "TextFieldInput";
361
- var TextFieldDescription = forwardRef(
362
- ({ className, children, ...props }, ref) => {
363
- return /* @__PURE__ */ jsx(
364
- Text,
365
- {
366
- ref,
367
- slot: "description",
368
- className: cn(descriptionVariants(), className),
369
- ...props,
370
- children
371
- }
372
- );
373
- }
374
- );
375
- TextFieldDescription.displayName = "TextFieldDescription";
376
- var TextFieldError = forwardRef(
377
- ({ className, children, ...props }, ref) => {
378
- return /* @__PURE__ */ jsx(
379
- FieldError,
380
- {
381
- ref,
382
- ...props,
383
- className: cn(errorMessageVariants(), className),
384
- children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", role: "alert", children: [
385
- /* @__PURE__ */ jsx(CircleAlert, { className: "h-4 w-4" }),
386
- children
387
- ] })
388
- }
389
- );
390
- }
391
- );
392
- TextFieldError.displayName = "TextFieldError";
393
- var TextFieldSuccess = forwardRef(
394
- ({ className, children, ...props }, ref) => {
395
- return /* @__PURE__ */ jsx(
396
- Text,
397
- {
398
- ref,
399
- slot: "description",
400
- className: cn(successMessageVariants(), className),
401
- ...props,
402
- children
403
- }
404
- );
405
- }
406
- );
407
- TextFieldSuccess.displayName = "TextFieldSuccess";
408
- var TextField = forwardRef(
409
- ({
410
- className,
411
- size = "default",
412
- label,
413
- description,
414
- errorMessage,
415
- successMessage,
416
- type = "text",
417
- isRequired = false,
418
- isReadOnly = false,
419
- isDisabled = false,
420
- isInvalid = false,
421
- isValid = false,
422
- id,
423
- autoComplete,
424
- disableCopyPaste = false,
425
- pattern,
426
- patternDescription,
427
- expandOnFocus = false,
428
- collapsedWidth = "200px",
429
- prefix,
430
- suffix,
431
- prefixSize = 16,
432
- suffixSize = 16,
433
- showPasswordToggle,
434
- value,
435
- defaultValue,
436
- onFocus: userOnFocus,
437
- onBlur: userOnBlur,
438
- ...props
439
- }, ref) => {
440
- const errorId = useId();
441
- const generatedId = useId();
442
- const fieldId = id || generatedId;
443
- const [isShaking, setIsShaking] = useState(false);
444
- const [screenReaderMessage, setScreenReaderMessage] = useState("");
445
- const [isFocused, setIsFocused] = useState(false);
446
- const [showPassword, setShowPassword] = useState(false);
447
- useEffect(() => {
448
- if (disableCopyPaste && typeof process !== "undefined" && process.env.NODE_ENV === "development") {
449
- console.warn(
450
- "[TextField] Copy/paste prevention should only be used for security-critical fields like password confirmation. This feature can break assistive technology workflows and password managers."
451
- );
452
- }
453
- }, [disableCopyPaste]);
454
- const handlePaste = useCallback((e) => {
455
- if (disableCopyPaste) {
456
- e.preventDefault();
457
- setIsShaking(true);
458
- setScreenReaderMessage("Pasting is not allowed in this field. Please type your entry.");
459
- setTimeout(() => {
460
- setIsShaking(false);
461
- setScreenReaderMessage("");
462
- }, 400);
463
- }
464
- }, [disableCopyPaste]);
465
- const handleFocus = useCallback((e) => {
466
- if (expandOnFocus) {
467
- setIsFocused(true);
468
- }
469
- userOnFocus?.(e);
470
- }, [expandOnFocus, userOnFocus]);
471
- const handleBlur = useCallback((e) => {
472
- if (expandOnFocus) {
473
- const isEmpty = e.target.value === "";
474
- if (isEmpty) {
475
- setIsFocused(false);
476
- }
477
- }
478
- userOnBlur?.(e);
479
- }, [expandOnFocus, userOnBlur]);
480
- const inputWidth = useMemo(() => {
481
- if (!expandOnFocus) return void 0;
482
- const hasValue = value !== void 0 ? value !== "" : defaultValue !== void 0 && defaultValue !== "";
483
- if (isFocused || hasValue) {
484
- return "100%";
485
- }
486
- return collapsedWidth;
487
- }, [expandOnFocus, isFocused, value, defaultValue, collapsedWidth]);
488
- const inputState = useMemo(() => {
489
- if (isDisabled) return "disabled";
490
- if (isReadOnly) return "readonly";
491
- if (isInvalid) return "error";
492
- if (isValid) return "success";
493
- return "default";
494
- }, [isDisabled, isReadOnly, isInvalid, isValid]);
495
- const labelState = useMemo(() => {
496
- if (isDisabled) return "disabled";
497
- if (isInvalid) return "error";
498
- return "default";
499
- }, [isDisabled, isInvalid]);
500
- const combinedDescription = useMemo(() => {
501
- if (description && patternDescription) {
502
- return `${description} ${patternDescription}`;
503
- }
504
- return description || patternDescription;
505
- }, [description, patternDescription]);
506
- const inputPadding = useMemo(() => {
507
- const basePadding = { left: 12, right: 12 };
508
- if (prefix) {
509
- const prefixWidth = typeof prefix === "string" ? prefix.length * 8 + 16 : prefixSize + 16;
510
- basePadding.left = prefixWidth;
511
- }
512
- if (type === "password" && showPasswordToggle) {
513
- basePadding.right = 16 + 16;
514
- } else if (suffix) {
515
- const suffixWidth = typeof suffix === "string" ? suffix.length * 8 + 16 : suffixSize + 16;
516
- basePadding.right = suffixWidth;
517
- }
518
- return basePadding;
519
- }, [prefix, suffix, prefixSize, suffixSize, type, showPasswordToggle]);
520
- const actualType = useMemo(() => {
521
- if (type === "password" && showPasswordToggle && showPassword) {
522
- return "text";
523
- }
524
- return type;
525
- }, [type, showPasswordToggle, showPassword]);
526
- const handlePasswordToggle = useCallback(() => {
527
- setShowPassword((prev) => !prev);
528
- }, []);
529
- const EyeIcon = () => /* @__PURE__ */ jsxs(
530
- "svg",
531
- {
532
- "data-testid": "password-toggle-icon-show",
533
- width: "16",
534
- height: "16",
535
- viewBox: "0 0 16 16",
536
- fill: "none",
537
- stroke: "currentColor",
538
- strokeWidth: "2",
539
- strokeLinecap: "round",
540
- strokeLinejoin: "round",
541
- children: [
542
- /* @__PURE__ */ jsx("path", { d: "M1 8s3-5 7-5 7 5 7 5-3 5-7 5-7-5-7-5z" }),
543
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "2" })
544
- ]
545
- }
546
- );
547
- const EyeOffIcon = () => /* @__PURE__ */ jsxs(
548
- "svg",
549
- {
550
- "data-testid": "password-toggle-icon-hide",
551
- width: "16",
552
- height: "16",
553
- viewBox: "0 0 16 16",
554
- fill: "none",
555
- stroke: "currentColor",
556
- strokeWidth: "2",
557
- strokeLinecap: "round",
558
- strokeLinejoin: "round",
559
- children: [
560
- /* @__PURE__ */ jsx("path", { d: "M10.5 5.5l-5 5" }),
561
- /* @__PURE__ */ jsx("path", { d: "M1 8s3-5 7-5c1.5 0 2.8.6 4 1.5M15 8s-1.5 2.5-4 4" }),
562
- /* @__PURE__ */ jsx("path", { d: "M3 13l2-2m7-7l2-2" }),
563
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "2" })
564
- ]
565
- }
566
- );
567
- const actualSuffix = useMemo(() => {
568
- if (type === "password" && showPasswordToggle) {
569
- return /* @__PURE__ */ jsx(
570
- Button,
571
- {
572
- variant: "ghost",
573
- visualSize: "icon",
574
- onPress: handlePasswordToggle,
575
- "aria-label": showPassword ? "Hide password" : "Show password",
576
- className: "!min-h-0 !min-w-0 h-8 w-8",
577
- children: showPassword ? /* @__PURE__ */ jsx(EyeOffIcon, {}) : /* @__PURE__ */ jsx(EyeIcon, {})
578
- }
579
- );
580
- }
581
- return suffix;
582
- }, [type, showPasswordToggle, showPassword, suffix, handlePasswordToggle]);
583
- return /* @__PURE__ */ jsxs(
584
- TextField$1,
585
- {
586
- ref,
587
- className: cn("flex flex-col gap-1.5", className),
588
- isRequired,
589
- isReadOnly,
590
- isDisabled,
591
- isInvalid,
592
- value,
593
- defaultValue,
594
- ...props,
595
- children: [
596
- label && /* @__PURE__ */ jsxs(Label, { className: cn(labelVariants({ state: labelState })), children: [
597
- label,
598
- isRequired && /* @__PURE__ */ jsx("span", { className: "ml-1 text-[var(--destructive-background)]", "aria-hidden": "true", children: /* @__PURE__ */ jsx("strong", { children: "*" }) })
599
- ] }),
600
- combinedDescription && /* @__PURE__ */ jsx(Text, { slot: "description", className: cn(descriptionVariants()), children: combinedDescription }),
601
- /* @__PURE__ */ jsxs(
602
- "div",
603
- {
604
- className: "relative flex items-center transition-all duration-200",
605
- style: {
606
- width: inputWidth
607
- },
608
- children: [
609
- prefix && /* @__PURE__ */ jsx(
610
- "div",
611
- {
612
- "data-testid": "textfield-prefix",
613
- className: "absolute left-3 flex items-center justify-center pointer-events-none text-[var(--content-foreground)]",
614
- "aria-hidden": "true",
615
- children: prefix
616
- }
617
- ),
618
- /* @__PURE__ */ jsx(
619
- Input,
620
- {
621
- type: actualType,
622
- id: fieldId,
623
- className: cn(
624
- inputVariants({ size, state: inputState }),
625
- DISABLED_STYLES,
626
- isShaking && "shake"
627
- ),
628
- style: {
629
- width: "100%",
630
- paddingLeft: `${inputPadding.left}px`,
631
- paddingRight: `${inputPadding.right}px`
632
- },
633
- autoComplete,
634
- pattern,
635
- onPaste: handlePaste,
636
- onFocus: handleFocus,
637
- onBlur: handleBlur,
638
- "aria-required": isRequired ? "true" : void 0,
639
- "aria-readonly": isReadOnly ? "true" : void 0,
640
- "aria-errormessage": isInvalid && errorMessage ? errorId : void 0
641
- }
642
- ),
643
- actualSuffix && /* @__PURE__ */ jsx(
644
- "div",
645
- {
646
- "data-testid": "textfield-suffix",
647
- className: cn(
648
- "absolute right-3 flex items-center justify-center text-[var(--content-foreground)]",
649
- // Password toggle is clickable, other suffixes are not
650
- type === "password" && showPasswordToggle ? "" : "pointer-events-none"
651
- ),
652
- "aria-hidden": type === "password" && showPasswordToggle ? void 0 : "true",
653
- children: actualSuffix
654
- }
655
- )
656
- ]
657
- }
658
- ),
659
- isValid && successMessage && !isInvalid && /* @__PURE__ */ jsx(Text, { slot: "description", className: cn(successMessageVariants()), children: successMessage }),
660
- isInvalid && errorMessage && /* @__PURE__ */ jsx(TextFieldError, { id: errorId, children: errorMessage }),
661
- screenReaderMessage && /* @__PURE__ */ jsx("div", { className: "sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true", children: screenReaderMessage })
662
- ]
663
- }
664
- );
665
- }
666
- );
667
- TextField.displayName = "TextField";
668
- var BaseComponentPropsSchema = z.object({
669
- // Styling
670
- className: z.string().optional(),
671
- // React
672
- children: z.any().optional(),
673
- // ReactNode not directly supported by Zod
674
- id: z.string().optional(),
675
- // Accessibility (WCAG 2.2 AA requirements)
676
- "aria-label": z.string().optional(),
677
- "aria-labelledby": z.string().optional(),
678
- "aria-describedby": z.string().optional(),
679
- "aria-live": z.enum(["off", "polite", "assertive"]).optional(),
680
- "aria-hidden": z.boolean().optional(),
681
- // Testing & Development
682
- "data-testid": z.string().optional()
683
- });
684
-
685
- // src/elements/TextField/TextField.types.ts
686
- var AutoCompleteValue = z.enum([
687
- // Control tokens
688
- "off",
689
- "on",
690
- // Name-related
691
- "name",
692
- "honorific-prefix",
693
- "given-name",
694
- "additional-name",
695
- "family-name",
696
- "honorific-suffix",
697
- "nickname",
698
- // Contact
699
- "email",
700
- "username",
701
- // Authentication
702
- "new-password",
703
- "current-password",
704
- "one-time-code",
705
- // Organization
706
- "organization-title",
707
- "organization",
708
- // Address
709
- "street-address",
710
- "address-line1",
711
- "address-line2",
712
- "address-line3",
713
- "address-level4",
714
- "address-level3",
715
- "address-level2",
716
- "address-level1",
717
- "country",
718
- "country-name",
719
- "postal-code",
720
- // Payment
721
- "cc-name",
722
- "cc-given-name",
723
- "cc-additional-name",
724
- "cc-family-name",
725
- "cc-number",
726
- "cc-exp",
727
- "cc-exp-month",
728
- "cc-exp-year",
729
- "cc-csc",
730
- "cc-type",
731
- // Transaction
732
- "transaction-currency",
733
- "transaction-amount",
734
- // Personal
735
- "language",
736
- "bday",
737
- "bday-day",
738
- "bday-month",
739
- "bday-year",
740
- "sex",
741
- // Telephone
742
- "tel",
743
- "tel-country-code",
744
- "tel-national",
745
- "tel-area-code",
746
- "tel-local",
747
- "tel-extension",
748
- // Other
749
- "impp",
750
- "url",
751
- "photo"
752
- ]);
753
- var DANGEROUS_REGEX_PATTERNS = [
754
- /\(\.\*\)\+/,
755
- // Catastrophic backtracking: (.*)+
756
- /\(\.\+\)\+/,
757
- // Catastrophic backtracking: (.+)+
758
- /\([^)]*\)\{.*,.*\}/,
759
- // Excessive quantifiers: (x){10,1000}
760
- /\(\?!\)/,
761
- // Negative lookahead (can be slow)
762
- /\(\?<=\)/
763
- // Positive lookbehind (can be slow)
764
- ];
765
- var validatePatternSafety = (pattern) => {
766
- for (const dangerous of DANGEROUS_REGEX_PATTERNS) {
767
- if (dangerous.test(pattern)) {
768
- return false;
769
- }
770
- }
771
- const quantifierCount = (pattern.match(/[*+{}]/g) || []).length;
772
- if (quantifierCount > 5) {
773
- return false;
774
- }
775
- return true;
776
- };
777
- var TextFieldPropsSchema = BaseComponentPropsSchema.extend({
778
- // Size variants (matching Button sizes: sm, default, lg)
779
- size: z.enum(["sm", "default", "lg"]).optional().default("default"),
780
- // Text content
781
- label: z.string().optional(),
782
- description: z.string().optional(),
783
- errorMessage: z.string().optional(),
784
- successMessage: z.string().optional(),
785
- // Input type - BREAKING: removed 'tel' (use TelField component instead)
786
- // @see DECISIONS.md Decision 14
787
- type: z.enum(["text", "email", "password", "url", "search"]).optional().default("text"),
788
- // State props
789
- isRequired: z.boolean().optional(),
790
- isReadOnly: z.boolean().optional(),
791
- isDisabled: z.boolean().optional(),
792
- isInvalid: z.boolean().optional(),
793
- isValid: z.boolean().optional(),
794
- // Input attributes
795
- placeholder: z.string().optional(),
796
- value: z.string().optional(),
797
- defaultValue: z.string().optional(),
798
- name: z.string().optional(),
799
- autoFocus: z.boolean().optional(),
800
- // AutoComplete - BREAKING: strict MDN enum instead of string
801
- // @see DECISIONS.md Decision 13
802
- autoComplete: AutoCompleteValue.optional(),
803
- maxLength: z.number().optional(),
804
- minLength: z.number().optional(),
805
- // Pattern validation with security check
806
- // @see DECISIONS.md Decision 15, 18
807
- // @warning SECURITY: Only use patterns defined in source code, never from user input
808
- pattern: z.string().optional(),
809
- patternDescription: z.string().optional(),
810
- // Feature: Copy/Paste Restriction
811
- // @see DECISIONS.md Decision 4
812
- disableCopyPaste: z.boolean().optional().default(false),
813
- // Feature: Prefix/Suffix
814
- // @see DECISIONS.md Decision 9
815
- prefix: z.any().optional(),
816
- // ReactNode - can't validate with Zod
817
- suffix: z.any().optional(),
818
- // ReactNode - can't validate with Zod
819
- prefixSize: z.number().optional().default(16),
820
- suffixSize: z.number().optional().default(16),
821
- // Feature: Expand on Focus
822
- // @see DECISIONS.md Decision 6, 17
823
- expandOnFocus: z.boolean().optional().default(false),
824
- collapsedWidth: z.string().optional().default("200px"),
825
- // Feature: Password Toggle
826
- // @see DECISIONS.md Decision 8
827
- showPasswordToggle: z.boolean().optional()
828
- // Event handlers (onChange, onBlur, onFocus inherited from AriaTextFieldProps)
829
- // Custom validate function added in TypeScript type below (not in Zod schema)
830
- }).refine(
831
- (data) => !data.pattern || data.patternDescription,
832
- {
833
- message: "patternDescription is required when pattern is provided",
834
- path: ["patternDescription"]
835
- }
836
- ).refine(
837
- (data) => !data.pattern || validatePatternSafety(data.pattern),
838
- {
839
- message: "Unsafe regex pattern detected. Pattern may cause ReDoS vulnerability. Avoid patterns like (.*)+, (.+)+, or excessive quantifiers.",
840
- path: ["pattern"]
841
- }
842
- ).refine(
843
- (data) => !(data.successMessage && data.errorMessage),
844
- {
845
- message: "Cannot provide both successMessage and errorMessage. Use one based on validation state.",
846
- path: ["successMessage"]
847
- }
848
- ).refine(
849
- (data) => {
850
- if (typeof process !== "undefined" && process.env.NODE_ENV === "development") {
851
- if (data.isValid && data.isInvalid) {
852
- console.error("[TextField] Both isValid and isInvalid are true. isInvalid takes precedence.");
853
- }
854
- }
855
- return true;
856
- }
857
- );
858
- var TextFieldLabelPropsSchema = z.object({
859
- children: z.any().optional(),
860
- className: z.string().optional(),
861
- htmlFor: z.string().optional(),
862
- state: z.enum(["default", "error", "disabled"]).optional().default("default")
863
- });
864
- var TextFieldInputPropsSchema = z.object({
865
- className: z.string().optional(),
866
- size: z.enum(["sm", "default", "lg"]).optional().default("default"),
867
- state: z.enum(["default", "error", "success", "disabled", "readonly"]).optional().default("default")
868
- });
869
- var TextFieldDescriptionPropsSchema = z.object({
870
- children: z.any().optional(),
871
- className: z.string().optional()
872
- });
873
- var TextFieldErrorPropsSchema = z.object({
874
- children: z.any().optional(),
875
- className: z.string().optional()
876
- });
877
- var TextFieldSuccessPropsSchema = z.object({
878
- children: z.any().optional(),
879
- className: z.string().optional()
880
- });
881
-
882
- export { AutoCompleteValue as AutoCompleteValueSchema, TextField, TextFieldDescription, TextFieldDescriptionPropsSchema, TextFieldError, TextFieldErrorPropsSchema, TextFieldInput, TextFieldInputPropsSchema, TextFieldLabel, TextFieldLabelPropsSchema, TextFieldPropsSchema, TextFieldSuccess, TextFieldSuccessPropsSchema, inputVariants, labelVariants, successMessageVariants, inputVariants as textFieldInputVariants, labelVariants as textFieldLabelVariants, validatePatternSafety };
883
- //# sourceMappingURL=index.mjs.map
2
+ import {createContext,memo,forwardRef,useId,useState,useCallback,useMemo,useContext,useEffect}from'react';import {Button,Label,Input,Text,FieldError,TextField}from'react-aria-components';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {Loader2,Zap,CircleAlert,Search,X as X$1}from'lucide-react';import {cva}from'class-variance-authority';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {z}from'zod';function d(...t){return twMerge(clsx(t))}var ae="data-[pressed]:scale-[0.97]";var ne="data-[hovered]:shadow-md";var U="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",q="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground",se="disabled:pointer-events-none disabled:opacity-50";var le=cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),de=cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80",outline:"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]",link:"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-8",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});var Ve=createContext(null);Ve.displayName="ButtonGroupContext";function we(){return useContext(Ve)}var Ce=createContext(null);Ce.displayName="ButtonGroupItemContext";function Ie(){return useContext(Ce)}cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var Le=cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}});cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});var R=memo(forwardRef(({className:t,buttonVisualClassName:o,variant:r,size:a,visualSize:s,fullWidth:c,loading:i=false,loadingText:g="Loading...",shortcut:h,children:m,isDisabled:u,paywall:l=false,paywallRedirect:L,paywallDescription:ee,onPress:te,...H},F)=>{let O=useId(),T=we(),S=Ie(),y=r??T?.variant??"default",W=a??T?.size,$=u??T?.isDisabled??false,v=T?.orientation==="vertical",A=c||v,k=S?Le({orientation:T?.orientation??"horizontal",position:S.position}):"",E=s??W??"default";return process.env.NODE_ENV!=="production"&&(E==="dot"||E==="icon")&&!H["aria-label"]&&!m&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsx(Button,{ref:F,isDisabled:$||i||void 0,"aria-disabled":l?true:void 0,"aria-describedby":l?O:void 0,onPress:P=>{if(l){L&&window.open(L,"_blank","noopener,noreferrer");return}te?.(P);},className:d(le({fullWidth:A,inVerticalGroup:v}),t),...H,children:P=>jsxs("span",{className:d(de({variant:y,visualSize:E,paywall:l,fullWidth:A}),k,o,ae,ne,U,q),"data-pressed":P.isPressed||void 0,children:[i&&jsxs(Fragment,{children:[jsx(Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsx("span",{className:"sr-only","aria-live":"polite",children:g})]}),!i&&m,l&&jsx(Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),l&&jsxs("span",{id:O,className:"sr-only",children:["Premium feature: ",ee||"Upgrade required to access this feature"]}),P.isFocusVisible&&h&&jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:h}),P.isPressed&&jsx("span",{className:"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95","aria-hidden":"true"})]})})}));R.displayName="Button";var Ae=()=>jsxs("svg",{"data-testid":"password-toggle-icon-show",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"M1 8s3-5 7-5 7 5 7 5-3 5-7 5-7-5-7-5z"}),jsx("circle",{cx:"8",cy:"8",r:"2"})]}),ke=()=>jsxs("svg",{"data-testid":"password-toggle-icon-hide",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"M10.5 5.5l-5 5"}),jsx("path",{d:"M1 8s3-5 7-5c1.5 0 2.8.6 4 1.5M15 8s-1.5 2.5-4 4"}),jsx("path",{d:"M3 13l2-2m7-7l2-2"}),jsx("circle",{cx:"8",cy:"8",r:"2"})]});var G=cva("flex w-full rounded-md border bg-[var(--content-background)] shadow-xs px-3 py-2 text-sm ring-offset-[var(--content-background)] file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-[var(--content-foreground)] placeholder:text-[var(--menu-muted)] transition-all duration-200",{variants:{size:{sm:"h-9 text-xs px-2 py-1",default:"h-10 px-3 py-2",lg:"h-11 px-4 py-3 text-base"},state:{default:"border-[var(--input-border)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2",error:"border-[var(--destructive-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--destructive-background)] focus-visible:ring-offset-2",success:"border-[var(--success-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--success-ring)] focus-visible:ring-offset-2",disabled:"cursor-not-allowed opacity-50",readonly:"cursor-default bg-[var(--content-background)] opacity-70"}},defaultVariants:{size:"default",state:"default"}}),M=cva("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",{variants:{state:{default:"text-[var(--content-foreground)]",error:"text-[var(--destructive-foreground)]",disabled:"opacity-50 cursor-not-allowed"}},defaultVariants:{state:"default"}}),ce=cva("text-sm text-[var(--content-foreground)]"),ze=cva("text-sm text-[var(--destructive-foreground)] font-medium mt-1.5"),X=cva("text-sm text-[var(--success-foreground)] font-medium mt-1.5");function Re({expandOnFocus:t,collapsedWidth:o,value:r,defaultValue:a,userOnFocus:s,userOnBlur:c}){let[i,g]=useState(false),h=useCallback(l=>{t&&g(true),s?.(l);},[t,s]),m=useCallback(l=>{t&&l.target.value===""&&g(false),c?.(l);},[t,c]),u=useMemo(()=>t?i||(r!==void 0?r!=="":a!==void 0&&a!=="")?"100%":o:void 0,[t,i,r,a,o]);return {handleFocus:h,handleBlur:m,inputWidth:u}}function _e({disableCopyPaste:t}){let[o,r]=useState(false),[a,s]=useState("");useEffect(()=>{t&&typeof process<"u"&&process.env.NODE_ENV==="development"&&console.warn("[TextField] Copy/paste prevention should only be used for security-critical fields like password confirmation. This feature can break assistive technology workflows and password managers.");},[t]);let c=useCallback(i=>{t&&(i.preventDefault(),r(true),s("Pasting is not allowed in this field. Please type your entry."),setTimeout(()=>{r(false),s("");},400));},[t]);return {isShaking:o,screenReaderMessage:a,handlePaste:c}}function Ge({type:t,showPasswordToggle:o}){let[r,a]=useState(false),s=useCallback(()=>{a(i=>!i);},[]),c=useMemo(()=>t==="password"&&o&&r?"text":t,[t,o,r]);return {showPassword:r,actualType:c,handlePasswordToggle:s}}var We=forwardRef(({className:t,state:o="default",children:r,...a},s)=>jsx(Label,{ref:s,className:d(M({state:o}),t),...a,children:r}));We.displayName="TextFieldLabel";var $e=forwardRef(({className:t,size:o="default",state:r="default",...a},s)=>jsx(Input,{ref:s,className:d(G({size:o,state:r}),se,t),...a}));$e.displayName="TextFieldInput";var je=forwardRef(({className:t,children:o,...r},a)=>jsx(Text,{ref:a,slot:"description",className:d(ce(),t),...r,children:o}));je.displayName="TextFieldDescription";var me=forwardRef(({className:t,children:o,...r},a)=>jsx(FieldError,{ref:a,...r,className:d(ze(),t),children:jsxs("span",{className:"flex items-center gap-2",role:"alert",children:[jsx(CircleAlert,{className:"h-4 w-4"}),o]})}));me.displayName="TextFieldError";var Ye=forwardRef(({className:t,children:o,...r},a)=>jsx(Text,{ref:a,slot:"description",className:d(X(),t),...r,children:o}));Ye.displayName="TextFieldSuccess";var Ue=forwardRef(({className:t,size:o="default",label:r,description:a,errorMessage:s,successMessage:c,type:i="text",isRequired:g=false,isReadOnly:h=false,isDisabled:m=false,isInvalid:u=false,isValid:l=false,id:L,autoComplete:ee,disableCopyPaste:te=false,pattern:H,patternDescription:F,expandOnFocus:O=false,collapsedWidth:T="200px",prefix:S,suffix:y,prefixSize:W=16,suffixSize:$=16,showPasswordToggle:v,isIconHidden:A=false,onSubmit:k,onClear:E,value:B,defaultValue:j,onFocus:P,onBlur:Ze,...z},Je)=>{let xe=useId(),Qe=useId(),et=L||Qe,{handleFocus:tt,handleBlur:ot,inputWidth:rt}=Re({expandOnFocus:O,collapsedWidth:T,value:B,defaultValue:j,userOnFocus:P,userOnBlur:Ze}),{isShaking:at,screenReaderMessage:he,handlePaste:nt}=_e({disableCopyPaste:te}),{showPassword:oe,actualType:it,handlePasswordToggle:ve}=Ge({type:i,showPasswordToggle:v}),f=i==="search",[st,be]=useState(j??""),D=B!==void 0,b=D?B:st,lt=useCallback(p=>{D||be(p),z.onChange?.(p);},[D,z]),Y=useCallback(()=>{D||be(""),z.onChange?.(""),E?.();},[D,z,E]),dt=useCallback(p=>{p.key==="Enter"&&k&&k(b),p.key==="Escape"&&b&&(p.preventDefault(),Y());},[b,k,Y]),pt=useMemo(()=>m?"disabled":h?"readonly":u?"error":l?"success":"default",[m,h,u,l]),ut=useMemo(()=>m?"disabled":u?"error":"default",[m,u]),ge=useMemo(()=>a&&F?`${a} ${F}`:a||F,[a,F]),N=useMemo(()=>f&&!A&&!S?jsx(Search,{className:o==="sm"?"h-3.5 w-3.5":o==="lg"?"h-5 w-5":"h-4 w-4"}):S,[f,A,S,o]),ye=useMemo(()=>{let p={left:12,right:12};if(N){let re=typeof N=="string"?N.length*8+16:W+16;p.left=re;}if(i==="password"&&v)p.right=32;else if(f&&b)p.right=44;else if(y){let re=typeof y=="string"?y.length*8+16:$+16;p.right=re;}return p},[N,S,y,W,$,i,v,f,b]),Te=useMemo(()=>i==="password"&&v?jsx(R,{variant:"ghost",visualSize:"icon",onPress:ve,"aria-label":oe?"Hide password":"Show password",className:"!min-h-0 !min-w-0 h-8 w-8",children:oe?jsx(ke,{}):jsx(Ae,{})}):f&&b?jsx(R,{variant:"ghost",visualSize:"icon",onPress:Y,"aria-label":"Clear search",className:"!min-h-0 !min-w-0 h-8 w-8",children:jsx(X$1,{className:o==="sm"?"h-3 w-3":o==="lg"?"h-5 w-5":"h-4 w-4"})}):y,[i,v,oe,y,ve,f,b,o,Y]),Se=i==="password"&&v||f&&!!b;return jsxs(TextField,{ref:Je,className:d("flex flex-col gap-1.5",t),isRequired:g,isReadOnly:h,isDisabled:m,isInvalid:u,value:f?b:B,defaultValue:f?void 0:j,onChange:f?lt:void 0,...z,children:[r&&jsxs(Label,{className:d(M({state:ut})),children:[r,g&&jsx("span",{className:"ml-1 text-[var(--destructive-background)]","aria-hidden":"true",children:jsx("strong",{children:"*"})})]}),ge&&jsx(Text,{slot:"description",className:d(ce()),children:ge}),jsxs("div",{className:"relative flex items-center motion-safe:transition-all motion-safe:duration-200",style:{width:rt},children:[N&&jsx("div",{"data-testid":"textfield-prefix",className:"absolute left-3 flex items-center justify-center pointer-events-none text-[var(--content-foreground)]","aria-hidden":"true",children:N}),jsx(Input,{type:it,id:et,className:d(G({size:o,state:pt}),se,at&&"shake"),style:{width:"100%",paddingLeft:`${ye.left}px`,paddingRight:`${ye.right}px`},autoComplete:ee,pattern:H,onPaste:nt,onFocus:tt,onBlur:ot,onKeyDown:f?dt:void 0,"aria-required":g?"true":void 0,"aria-readonly":h?"true":void 0,"aria-errormessage":u&&s?xe:void 0}),Te&&jsx("div",{"data-testid":"textfield-suffix",className:d("absolute right-3 flex items-center justify-center text-[var(--content-foreground)]",Se?"":"pointer-events-none"),"aria-hidden":Se?void 0:"true",children:Te})]}),l&&c&&!u&&jsx(Text,{slot:"description",className:d(X()),children:c}),u&&s&&jsx(me,{id:xe,children:s}),he&&jsx("div",{className:"sr-only",role:"status","aria-live":"polite","aria-atomic":"true",children:he})]})});Ue.displayName="TextField";var qe=z.object({className:z.string().optional(),children:z.any().optional(),id:z.string().optional(),"aria-label":z.string().optional(),"aria-labelledby":z.string().optional(),"aria-describedby":z.string().optional(),"aria-live":z.enum(["off","polite","assertive"]).optional(),"aria-hidden":z.boolean().optional(),"data-testid":z.string().optional()});var Xe=z.enum(["off","on","name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","email","username","new-password","current-password","one-time-code","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-extension","impp","url","photo"]),Ct=[/\(\.\*\)\+/,/\(\.\+\)\+/,/\([^)]*\)\{.*,.*\}/,/\(\?!\)/,/\(\?<=\)/],Ke=t=>{for(let r of Ct)if(r.test(t))return false;return !((t.match(/[*+{}]/g)||[]).length>5)},It=qe.extend({size:z.enum(["sm","default","lg"]).optional().default("default"),label:z.string().optional(),description:z.string().optional(),errorMessage:z.string().optional(),successMessage:z.string().optional(),type:z.enum(["text","email","password","url","search"]).optional().default("text"),isRequired:z.boolean().optional(),isReadOnly:z.boolean().optional(),isDisabled:z.boolean().optional(),isInvalid:z.boolean().optional(),isValid:z.boolean().optional(),placeholder:z.string().optional(),value:z.string().optional(),defaultValue:z.string().optional(),name:z.string().optional(),autoFocus:z.boolean().optional(),autoComplete:Xe.optional(),maxLength:z.number().optional(),minLength:z.number().optional(),pattern:z.string().optional(),patternDescription:z.string().optional(),disableCopyPaste:z.boolean().optional().default(false),prefix:z.any().optional(),suffix:z.any().optional(),prefixSize:z.number().optional().default(16),suffixSize:z.number().optional().default(16),expandOnFocus:z.boolean().optional().default(false),collapsedWidth:z.string().optional().default("200px"),showPasswordToggle:z.boolean().optional(),isIconHidden:z.boolean().optional().default(false),onSubmit:z.custom().optional(),onClear:z.custom().optional()}).refine(t=>!t.pattern||t.patternDescription,{message:"patternDescription is required when pattern is provided",path:["patternDescription"]}).refine(t=>!t.pattern||Ke(t.pattern),{message:"Unsafe regex pattern detected. Pattern may cause ReDoS vulnerability. Avoid patterns like (.*)+, (.+)+, or excessive quantifiers.",path:["pattern"]}).refine(t=>!(t.successMessage&&t.errorMessage),{message:"Cannot provide both successMessage and errorMessage. Use one based on validation state.",path:["successMessage"]}).refine(t=>(typeof process<"u"&&process.env.NODE_ENV==="development"&&t.isValid&&t.isInvalid&&console.error("[TextField] Both isValid and isInvalid are true. isInvalid takes precedence."),true)),Lt=z.object({children:z.any().optional(),className:z.string().optional(),htmlFor:z.string().optional(),state:z.enum(["default","error","disabled"]).optional().default("default")}),At=z.object({className:z.string().optional(),size:z.enum(["sm","default","lg"]).optional().default("default"),state:z.enum(["default","error","success","disabled","readonly"]).optional().default("default")}),kt=z.object({children:z.any().optional(),className:z.string().optional()}),Bt=z.object({children:z.any().optional(),className:z.string().optional()}),zt=z.object({children:z.any().optional(),className:z.string().optional()});export{Xe as AutoCompleteValueSchema,Ue as TextField,je as TextFieldDescription,kt as TextFieldDescriptionPropsSchema,me as TextFieldError,Bt as TextFieldErrorPropsSchema,$e as TextFieldInput,At as TextFieldInputPropsSchema,We as TextFieldLabel,Lt as TextFieldLabelPropsSchema,It as TextFieldPropsSchema,Ye as TextFieldSuccess,zt as TextFieldSuccessPropsSchema,G as inputVariants,M as labelVariants,X as successMessageVariants,G as textFieldInputVariants,M as textFieldLabelVariants,Ke as validatePatternSafety};//# sourceMappingURL=index.mjs.map
884
3
  //# sourceMappingURL=index.mjs.map