@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 +1 @@
1
- {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/styles/interaction-states.ts","../../../src/elements/ButtonGroup/ButtonGroupContext.tsx","../../../src/elements/ButtonGroup/ButtonGroup.variants.ts","../../../src/elements/Button/Button.tsx","../../../src/elements/TextField/TextField.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/TextField/TextField.types.ts"],"names":["cva","AriaButton","forwardRef","jsx","AriaLabel","AriaInput","AriaText","AriaFieldError","jsxs","useId","AriaTextField","z"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Global Interaction State Styles\n *\n * Consistent interaction patterns across all Themis components.\n * These styles ensure WCAG 2.2 AAA compliance and predictable UX.\n *\n * @see spec.md FR-010 (Visible focus ring for keyboard navigation)\n * @see spec.md FR-031 (Pressed state feedback)\n * @see spec.md FR-012 (High contrast mode support)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\n/**\n * Focus state styles (FR-010)\n * Visible focus ring for keyboard navigation - WCAG 2.2 Level AAA\n *\n * Components can override by extending these styles:\n * @example\n * cn(FOCUS_STYLES, \"ring-4\") // Increases ring width to 4px\n */\nexport const FOCUS_STYLES = \"data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2\";\n\n/**\n * Pressed/Active state styles (FR-031)\n * Visual feedback for press interactions\n *\n * Components can override the scale amount:\n * @example\n * cn(PRESSED_STYLES_BASE, \"data-[pressed]:scale-[0.95]\") // More pronounced scale\n */\nexport const PRESSED_STYLES = \"data-[pressed]:scale-[0.97]\";\n\n/**\n * Base pressed styles without scale (for components that need different feedback)\n */\nexport const PRESSED_STYLES_BASE = \"data-[pressed]:transition-transform data-[pressed]:duration-100\";\n\n/**\n * Hover state styles\n * Elevation change on hover for better affordance\n *\n * Components can override shadow depth:\n * @example\n * cn(HOVER_STYLES_BASE, \"data-[hovered]:shadow-lg\") // Larger shadow\n */\nexport const HOVER_STYLES = \"data-[hovered]:shadow-md\";\n\n/**\n * Base hover styles without shadow (for components that use different hover effects)\n */\nexport const HOVER_STYLES_BASE = \"data-[hovered]:transition-shadow data-[hovered]:duration-200\";\n\n/**\n * High contrast mode focus (FR-012)\n * Enhanced outlines for users requiring high contrast\n *\n * Uses 'hc:' prefix for prefers-contrast: more media query\n */\nexport const HIGH_CONTRAST_FOCUS = \"hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground\";\n\n/**\n * High contrast mode hover (FR-012)\n * Enhanced outlines for hover in high contrast mode\n */\nexport const HIGH_CONTRAST_HOVER = \"hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground\";\n\n/**\n * High contrast mode pressed state\n * Enhanced outlines for pressed state in high contrast mode\n */\nexport const HIGH_CONTRAST_PRESSED = \"hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground\";\n\n/**\n * Combined high contrast styles\n * Use this for components that need all high contrast interaction states\n */\nexport const HIGH_CONTRAST_INTERACTIONS = `${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Disabled state styles\n * Consistent disabled appearance across all components\n */\nexport const DISABLED_STYLES = \"disabled:pointer-events-none disabled:opacity-50\";\n\n/**\n * Default interaction bundle\n * Most common combination for interactive components\n *\n * Includes: focus ring, pressed scale, hover shadow, high contrast enhancements\n *\n * @example\n * <button className={cn(DEFAULT_INTERACTIONS, \"bg-primary\")}>Click</button>\n */\nexport const DEFAULT_INTERACTIONS = `${FOCUS_STYLES} ${PRESSED_STYLES} ${HOVER_STYLES} ${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Subtle interaction bundle\n * For components that need less pronounced feedback\n *\n * Includes: focus ring and high contrast, but no hover shadow or pressed scale\n */\nexport const SUBTLE_INTERACTIONS = `${FOCUS_STYLES} ${HIGH_CONTRAST_FOCUS}`;\n\n/**\n * Non-interactive element styles\n * For elements that should indicate they are not interactive\n */\nexport const NON_INTERACTIVE = \"cursor-default select-none\";\n","\"use client\";\n\nimport { createContext, useContext } from 'react';\nimport type {\n ButtonGroupContextValue,\n ButtonGroupItemContextValue,\n} from './ButtonGroup.types';\n\n/**\n * ButtonGroup Context System (Two-Level)\n *\n * Provides a two-level context pattern for ButtonGroup:\n *\n * 1. ButtonGroupContext (group-level):\n * - Provides: orientation, variant, size, isDisabled\n * - Consumed by: Button (for prop inheritance), Separator (for orientation)\n *\n * 2. ButtonGroupItemContext (item-level):\n * - Provides: position ('first' | 'middle' | 'last' | 'only')\n * - Consumed by: Button (for border-radius styling)\n *\n * Both contexts return null when not in a provider, allowing Button\n * to work standalone without any group context.\n *\n * @see plan.md for architecture details\n * @see ButtonGroup.tsx for Provider implementation\n */\n\n// =============================================================================\n// Group-Level Context\n// =============================================================================\n\n/**\n * Context for group-level props (orientation, variant, size, isDisabled)\n * Default value is null to indicate \"not in a group\"\n */\nconst ButtonGroupContext = createContext<ButtonGroupContextValue | null>(null);\n\nButtonGroupContext.displayName = 'ButtonGroupContext';\n\n/**\n * Hook to access group-level context\n * @returns ButtonGroupContextValue if inside a ButtonGroup, null otherwise\n */\nexport function useButtonGroupContext(): ButtonGroupContextValue | null {\n return useContext(ButtonGroupContext);\n}\n\n// =============================================================================\n// Item-Level Context\n// =============================================================================\n\n/**\n * Context for per-button position information\n * Default value is null to indicate \"not wrapped with position context\"\n */\nconst ButtonGroupItemContext =\n createContext<ButtonGroupItemContextValue | null>(null);\n\nButtonGroupItemContext.displayName = 'ButtonGroupItemContext';\n\n/**\n * Hook to access item-level context (position)\n * @returns ButtonGroupItemContextValue if wrapped with position context, null otherwise\n */\nexport function useButtonGroupItemContext(): ButtonGroupItemContextValue | null {\n return useContext(ButtonGroupItemContext);\n}\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ButtonGroupContext, ButtonGroupItemContext };\n","import { cva } from 'class-variance-authority';\n\n/**\n * ButtonGroup CVA Variants\n *\n * Defines Class Variance Authority (CVA) variants for:\n * - ButtonGroup container (orientation-based layout)\n * - ButtonGroupItem (position-based border-radius)\n * - ButtonGroupSeparator (orientation-based styling)\n *\n * @see plan.md Phase 1: Design & Contracts - CVA Variants\n * @see constitution.md Principle V (Component Quality Standards)\n */\n\n// =============================================================================\n// Container Variants\n// =============================================================================\n\n/**\n * ButtonGroup container variants\n * Controls the layout direction based on orientation\n * Uses gap-0 to ensure buttons are connected (share borders)\n */\nexport const buttonGroupVariants = cva('inline-flex items-center gap-0', {\n variants: {\n orientation: {\n horizontal: 'flex-row',\n vertical: 'flex-col w-full',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// =============================================================================\n// Item Position Variants\n// =============================================================================\n\n/**\n * ButtonGroupItem position variants\n * Applied to Button's visual layer (Layer 2) for position-aware border-radius\n *\n * Compound variants handle both orientation and position combinations:\n * - Horizontal: left/right borders and radii\n * - Vertical: top/bottom borders and radii\n */\nexport const buttonGroupItemVariants = cva('', {\n variants: {\n orientation: {\n // min-w-[44px] ensures visual layer fills touch target width (for icon buttons)\n horizontal: 'min-w-[44px]',\n // flex (overrides inline-flex) + min-h-[44px] makes visual layer fill touch target,\n // eliminating gaps between stacked buttons in vertical orientation\n vertical: 'flex min-h-[44px]',\n },\n position: {\n first: '',\n middle: '',\n last: '',\n only: '', // Single button - no modifications needed\n },\n },\n compoundVariants: [\n // ==========================================================================\n // Horizontal Orientation\n // ==========================================================================\n {\n orientation: 'horizontal',\n position: 'first',\n className: 'rounded-r-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'middle',\n className: 'rounded-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'last',\n className: 'rounded-l-none',\n },\n // ==========================================================================\n // Vertical Orientation\n // Note: w-full is handled by Button's effectiveFullWidth for both layers\n // ==========================================================================\n {\n orientation: 'vertical',\n position: 'first',\n className: 'rounded-b-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'middle',\n className: 'rounded-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'last',\n className: 'rounded-t-none',\n },\n ],\n defaultVariants: {\n orientation: 'horizontal',\n position: 'only',\n },\n});\n\n// =============================================================================\n// Separator Variants\n// =============================================================================\n\n/**\n * ButtonGroupSeparator variants\n * Orientation-aware visual divider between button groups\n */\nexport const buttonGroupSeparatorVariants = cva('bg-[var(--border)]', {\n variants: {\n orientation: {\n horizontal: 'w-px h-6 mx-1',\n vertical: 'h-px w-full my-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n","\"use client\";\n\n/**\n * Button Component - 3-Layer Architecture\n * Accessible button with React Aria primitives and CVA styling\n *\n * Architecture:\n * - Layer 1: Touch Target (44x44px WCAG AAA compliant, transparent)\n * - Layer 2: Visual Button (configurable size, colors, borders)\n * - Layer 3: Content & Effects (text, icons, ripple, loading spinner)\n *\n * @see 3layer-plan.md for architecture details\n * @see spec.md FR-029 to FR-037 (Button Component Requirements)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see spec.md FR-014 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, useId, type ReactNode } from 'react';\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from 'react-aria-components';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Loader2, Zap } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { PRESSED_STYLES, HOVER_STYLES, HIGH_CONTRAST_HOVER, HIGH_CONTRAST_PRESSED } from '../../styles/interaction-states';\nimport {\n useButtonGroupContext,\n useButtonGroupItemContext,\n} from '../ButtonGroup/ButtonGroupContext';\nimport { buttonGroupItemVariants } from '../ButtonGroup/ButtonGroup.variants';\n\n/**\n * Layer 1: Transparent outer touch target (44x44px minimum)\n * Handles WCAG 2.2 AAA touch target requirement\n * Always transparent, centers the visual button inside\n * IMPORTANT: Focus ring stays on Layer 1 for AAA compliance (2.4.13)\n *\n * In vertical ButtonGroups, uses items-stretch so the visual layer (Layer 2)\n * can fill the full touch target height, eliminating gaps between buttons.\n */\nconst buttonOuterVariants = cva(\n \"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\",\n {\n variants: {\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n inVerticalGroup: {\n true: \"items-stretch\",\n false: \"items-center\",\n },\n },\n defaultVariants: {\n fullWidth: false,\n inVerticalGroup: false,\n },\n }\n);\n\n/**\n * Layer 2: Visual button appearance (adjustable size)\n * Provides the visual appearance with configurable size\n * Can be smaller than touch target for use cases like carousel dots\n * NOTE: NO focus-visible styles here - focus ring is on Layer 1\n */\nconst buttonVisualVariants = cva(\n \"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\",\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80\",\n destructive:\n \"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80\",\n outline:\n \"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]\",\n secondary:\n \"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70\",\n ghost:\n \"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]\",\n link: \"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]\",\n },\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n visualSize: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3 text-xs\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n dot: \"h-5 w-5 rounded-full p-0 min-h-0 min-w-0\",\n },\n paywall: {\n true: \"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n visualSize: \"default\",\n paywall: false,\n },\n }\n);\n\n/**\n * @deprecated Use buttonVisualVariants instead. This alias is kept for backward compatibility.\n */\nconst buttonVariants = buttonVisualVariants;\n\nexport interface ButtonProps\n extends Omit<AriaButtonProps, 'className'>,\n VariantProps<typeof buttonVisualVariants> {\n as?: 'button' | 'a';\n loading?: boolean;\n loadingText?: string;\n shortcut?: string;\n className?: string;\n buttonVisualClassName?: string;\n children?: ReactNode;\n /** Enables paywall state - overrides variant styling and prevents normal action */\n paywall?: boolean;\n /** URL to open in new tab when paywalled button is clicked */\n paywallRedirect?: string;\n /** Description of the premium feature for tooltips and screen readers (max 200 chars) */\n paywallDescription?: string;\n /** Full width button */\n fullWidth?: boolean;\n /**\n * Visual size of the button (Layer 2)\n * Defaults to `size` for backward compatibility\n * Use independently for small visual buttons with large touch targets\n * @example <Button size=\"default\" visualSize=\"dot\" /> // 44px touch, 12px visual\n */\n visualSize?: 'sm' | 'default' | 'lg' | 'icon' | 'dot';\n /**\n * Size of the button - controls both touch target awareness and visual size\n * @deprecated For independent visual sizing, use visualSize prop instead\n */\n size?: 'sm' | 'default' | 'lg' | 'icon';\n}\n\n/**\n * Button Component - 3-Layer Architecture\n * Fully accessible button with React Aria and themed styling\n *\n * Layer 1: Touch Target (AriaButton) - 44x44px WCAG AAA compliant\n * Layer 2: Visual Button (span) - configurable appearance\n * Layer 3: Content (children) - text, icons, effects\n */\nconst Button = memo(forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n buttonVisualClassName,\n variant,\n size,\n visualSize,\n fullWidth,\n loading = false,\n loadingText = \"Loading...\",\n shortcut,\n children,\n isDisabled,\n paywall = false,\n paywallRedirect,\n paywallDescription,\n onPress,\n ...props\n },\n ref\n ) => {\n const paywallDescriptionId = useId();\n\n // ==========================================================================\n // ButtonGroup Context Integration\n // ==========================================================================\n\n // Consume group-level context (variant, size, isDisabled, orientation)\n const groupContext = useButtonGroupContext();\n\n // Consume item-level context (position for border-radius styling)\n const itemContext = useButtonGroupItemContext();\n\n // Merge context values with props (props take precedence)\n const effectiveVariant = variant ?? groupContext?.variant ?? 'default';\n const effectiveSize = size ?? groupContext?.size;\n const effectiveIsDisabled = isDisabled ?? groupContext?.isDisabled ?? false;\n\n // In vertical groups, buttons should be full width automatically\n const isInVerticalGroup = groupContext?.orientation === 'vertical';\n const effectiveFullWidth = fullWidth || isInVerticalGroup;\n\n // Position styling for ButtonGroup (only applied when in a group)\n const positionClassName = itemContext\n ? buttonGroupItemVariants({\n orientation: groupContext?.orientation ?? 'horizontal',\n position: itemContext.position,\n })\n : '';\n\n // Default visualSize to size for backward compatibility\n const effectiveVisualSize = visualSize ?? effectiveSize ?? 'default';\n\n // AAA Accessibility: Warn in dev/test if icon/dot variant lacks accessible name\n if (process.env.NODE_ENV !== 'production') {\n if (\n (effectiveVisualSize === 'dot' || effectiveVisualSize === 'icon') &&\n !props['aria-label'] &&\n !children\n ) {\n console.warn(\n '[Button] visualSize=\"dot\" or \"icon\" requires aria-label when no visible text is provided (WCAG 1.1.1)'\n );\n }\n }\n\n /**\n * Handle button press - intercepts action when paywalled\n * If paywalled with redirect URL, opens in new tab\n * Otherwise, calls the normal onPress handler\n */\n const handlePress = (e: Parameters<NonNullable<AriaButtonProps['onPress']>>[0]): void => {\n if (paywall) {\n if (paywallRedirect) {\n window.open(paywallRedirect, '_blank', 'noopener,noreferrer');\n }\n // Don't call onPress when paywalled\n return;\n }\n onPress?.(e);\n };\n\n // Only set isDisabled when we have a reason to disable\n // Otherwise, let slot system control disabled state (e.g., in NumberField)\n const computedIsDisabled = effectiveIsDisabled || loading || undefined;\n\n return (\n <AriaButton\n ref={ref}\n isDisabled={computedIsDisabled}\n aria-disabled={paywall ? true : undefined}\n aria-describedby={paywall ? paywallDescriptionId : undefined}\n onPress={handlePress}\n className={cn(buttonOuterVariants({ fullWidth: effectiveFullWidth, inVerticalGroup: isInVerticalGroup }), className)}\n {...props}\n >\n {(renderProps) => (\n /* Layer 2: Visual Button */\n <span\n className={cn(\n buttonVisualVariants({\n variant: effectiveVariant,\n visualSize: effectiveVisualSize,\n paywall,\n fullWidth: effectiveFullWidth,\n }),\n // Position styling from ButtonGroup context (border-radius adjustments)\n positionClassName,\n buttonVisualClassName,\n // Layer 2 interaction styles (no focus - focus ring is on Layer 1)\n PRESSED_STYLES,\n HOVER_STYLES,\n HIGH_CONTRAST_HOVER,\n HIGH_CONTRAST_PRESSED\n )}\n data-pressed={renderProps.isPressed || undefined}\n >\n {/* Layer 3: Content & Effects */}\n\n {/* FR-033: Loading spinner with screen reader announcement */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {loading && (\n <>\n <Loader2 className=\"motion-safe:animate-spin\" aria-hidden=\"true\" />\n <span className=\"sr-only\" aria-live=\"polite\">\n {loadingText}\n </span>\n </>\n )}\n\n {/* Hide children during loading */}\n {!loading && children}\n\n {/* Paywall: Lightning bolt icon */}\n {paywall && (\n <Zap\n data-testid=\"zap-icon\"\n aria-hidden=\"true\"\n className=\"ml-1\"\n />\n )}\n\n {/* Paywall: Screen reader description */}\n {paywall && (\n <span id={paywallDescriptionId} className=\"sr-only\">\n Premium feature: {paywallDescription || \"Upgrade required to access this feature\"}\n </span>\n )}\n\n {/* FR-034: Keyboard shortcut display on focus */}\n {renderProps.isFocusVisible && shortcut && (\n <kbd className=\"ml-auto hidden text-xs opacity-60 lg:inline\">\n {shortcut}\n </kbd>\n )}\n\n {/* Touch/press ripple effect - FR-031: Pressed state feedback */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {renderProps.isPressed && (\n <span\n className=\"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n )}\n </AriaButton>\n );\n }\n));\n\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants, buttonOuterVariants, buttonVisualVariants };\n","\"use client\";\n\n/**\n * TextField Component\n * Accessible text input with React Aria primitives and CVA styling\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements - WCAG 2.2 AAA)\n * @see React Aria TextField: https://react-spectrum.adobe.com/react-aria/TextField.html\n * @see ShadCN Input: https://ui.shadcn.com/docs/components/input\n * @see ShadCN Label: https://ui.shadcn.com/docs/components/label\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport './TextField.css';\nimport { forwardRef, useId, useMemo, useState, useEffect, useCallback } from 'react';\nimport {\n TextField as AriaTextField,\n Label as AriaLabel,\n Input as AriaInput,\n Text as AriaText,\n FieldError as AriaFieldError,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { DISABLED_STYLES } from '../../styles/interaction-states';\nimport type {\n TextFieldProps,\n TextFieldLabelProps,\n TextFieldInputProps,\n TextFieldDescriptionProps,\n TextFieldErrorProps,\n} from './TextField.types';\nimport { CircleAlert } from 'lucide-react';\nimport { Button } from '../Button';\n\n/**\n * Input variant styles using CVA\n * Adapts ShadCN Input styling with Themis semantic tokens\n */\nexport const inputVariants = cva(\n // Base styles - FR-014: Proper input styling with focus states\n \"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\",\n {\n variants: {\n // Size variants (matching Button sizes)\n size: {\n sm: \"h-9 text-xs px-2 py-1\",\n default: \"h-10 px-3 py-2\",\n lg: \"h-11 px-4 py-3 text-base\"\n },\n // State variants\n state: {\n default: \"border-[var(--input-border)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2\",\n error: \"border-[var(--destructive-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--destructive-background)] focus-visible:ring-offset-2\",\n success: \"border-green-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-green-500 focus-visible:ring-offset-2\",\n disabled: \"cursor-not-allowed opacity-50\",\n readonly: \"cursor-default bg-[var(--content-background)] opacity-70\"\n }\n },\n defaultVariants: {\n size: \"default\",\n state: \"default\"\n }\n }\n);\n\n/**\n * Label variant styles using CVA\n * Adapts ShadCN Label styling with Themis semantic tokens\n */\nexport const labelVariants = cva(\n // Base styles - FR-009: WCAG 2.2 AAA compliance\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n state: {\n default: \"text-[var(--content-foreground)]\",\n error: \"text-[var(--destructive-foreground)]\",\n disabled: \"opacity-50 cursor-not-allowed\"\n }\n },\n defaultVariants: {\n state: \"default\"\n }\n }\n);\n\n/**\n * Description text variant styles\n */\nexport const descriptionVariants = cva(\n \"text-sm text-[var(--content-foreground)]\"\n);\n\n/**\n * Error message variant styles\n */\nexport const errorMessageVariants = cva(\n \"text-sm text-[var(--destructive-foreground)] font-medium mt-1.5\"\n);\n\n/**\n * Success message variant styles\n */\nexport const successMessageVariants = cva(\n \"text-sm text-green-600 dark:text-green-500 font-medium mt-1.5\"\n);\n\n/**\n * TextFieldLabel Sub-component\n * Styled label with optional required indicator\n */\nexport const TextFieldLabel = forwardRef<HTMLLabelElement, TextFieldLabelProps>(\n ({ className, state = 'default', children, ...props }, ref) => {\n return (\n <AriaLabel\n ref={ref}\n className={cn(labelVariants({ state }), className)}\n {...props}\n >\n {children}\n </AriaLabel>\n );\n }\n);\n\nTextFieldLabel.displayName = \"TextFieldLabel\";\n\n/**\n * TextFieldInput Sub-component\n * Styled input with size and state variants\n */\nexport const TextFieldInput = forwardRef<HTMLInputElement, TextFieldInputProps>(\n ({ className, size = 'default', state = 'default', ...props }, ref) => {\n return (\n <AriaInput\n ref={ref}\n className={cn(inputVariants({ size, state }), DISABLED_STYLES, className)}\n {...props}\n />\n );\n }\n);\n\nTextFieldInput.displayName = \"TextFieldInput\";\n\n/**\n * TextFieldDescription Sub-component\n * Helper text displayed below the input\n */\nexport const TextFieldDescription = forwardRef<HTMLDivElement, TextFieldDescriptionProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <AriaText\n ref={ref}\n slot=\"description\"\n className={cn(descriptionVariants(), className)}\n {...props}\n >\n {children}\n </AriaText>\n );\n }\n);\n\nTextFieldDescription.displayName = \"TextFieldDescription\";\n\n/**\n * TextFieldError Sub-component\n * Error message displayed when field is invalid\n * Note: We use AriaFieldError with explicit role=\"alert\" for screen reader announcements\n */\nexport const TextFieldError = forwardRef<HTMLDivElement, TextFieldErrorProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <AriaFieldError\n ref={ref}\n {...props}\n className={cn(errorMessageVariants(), className)}\n >\n <span className=\"flex items-center gap-2\" role=\"alert\"><CircleAlert className=\"h-4 w-4\" />{children}</span>\n </AriaFieldError>\n );\n }\n);\n\nTextFieldError.displayName = \"TextFieldError\";\n\n/**\n * TextFieldSuccess Sub-component\n * Success message displayed when field is valid\n */\nexport const TextFieldSuccess = forwardRef<HTMLDivElement, TextFieldDescriptionProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <AriaText\n ref={ref}\n slot=\"description\"\n className={cn(successMessageVariants(), className)}\n {...props}\n >\n {children}\n </AriaText>\n );\n }\n);\n\nTextFieldSuccess.displayName = \"TextFieldSuccess\";\n\n/**\n * TextField Component\n * Fully accessible text input with React Aria and themed styling\n *\n * Composition:\n * - TextField (container with React Aria context)\n * - Label (optional, linked to input)\n * - Input (text input element)\n * - Description (optional helper text)\n * - ErrorMessage (optional, shown when invalid)\n *\n * @example\n * <TextField\n * label=\"Email\"\n * description=\"We'll never share your email\"\n * isRequired\n * type=\"email\"\n * />\n *\n * @example\n * <TextField\n * label=\"Username\"\n * errorMessage=\"Username is required\"\n * isInvalid\n * />\n */\nexport const TextField = forwardRef<HTMLDivElement, TextFieldProps>(\n (\n {\n className,\n size = 'default',\n label,\n description,\n errorMessage,\n successMessage,\n type = 'text',\n isRequired = false,\n isReadOnly = false,\n isDisabled = false,\n isInvalid = false,\n isValid = false,\n id,\n autoComplete,\n disableCopyPaste = false,\n pattern,\n patternDescription,\n expandOnFocus = false,\n collapsedWidth = '200px',\n prefix,\n suffix,\n prefixSize = 16,\n suffixSize = 16,\n showPasswordToggle,\n value,\n defaultValue,\n onFocus: userOnFocus,\n onBlur: userOnBlur,\n ...props\n },\n ref\n ) => {\n // Generate unique IDs for error message linking\n const errorId = useId();\n const generatedId = useId();\n const fieldId = id || generatedId;\n\n // Shake animation state for paste prevention\n const [isShaking, setIsShaking] = useState(false);\n const [screenReaderMessage, setScreenReaderMessage] = useState('');\n\n // Expand on focus state\n const [isFocused, setIsFocused] = useState(false);\n\n // Password visibility state\n const [showPassword, setShowPassword] = useState(false);\n\n // Development mode warning for disableCopyPaste\n useEffect(() => {\n if (disableCopyPaste && typeof process !== 'undefined' && process.env.NODE_ENV === 'development') {\n console.warn(\n '[TextField] Copy/paste prevention should only be used for security-critical fields like password confirmation. ' +\n 'This feature can break assistive technology workflows and password managers.'\n );\n }\n }, [disableCopyPaste]);\n\n // Handle paste prevention with shake animation\n const handlePaste = useCallback((e: React.ClipboardEvent<HTMLInputElement>) => {\n if (disableCopyPaste) {\n e.preventDefault();\n\n // Trigger shake animation\n setIsShaking(true);\n\n // Announce to screen readers\n setScreenReaderMessage('Pasting is not allowed in this field. Please type your entry.');\n\n // Remove shake animation and clear message after 400ms\n setTimeout(() => {\n setIsShaking(false);\n setScreenReaderMessage('');\n }, 400);\n }\n }, [disableCopyPaste]);\n\n // Handle focus for expand on focus feature\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n if (expandOnFocus) {\n setIsFocused(true);\n }\n // Call user's onFocus if provided\n userOnFocus?.(e);\n }, [expandOnFocus, userOnFocus]);\n\n // Handle blur for expand on focus feature\n const handleBlur = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n if (expandOnFocus) {\n // Only collapse if input is empty\n const isEmpty = e.target.value === '';\n if (isEmpty) {\n setIsFocused(false);\n }\n }\n // Call user's onBlur if provided\n userOnBlur?.(e);\n }, [expandOnFocus, userOnBlur]);\n\n // Calculate input width for expand on focus\n const inputWidth = useMemo(() => {\n if (!expandOnFocus) return undefined;\n\n // Check if input has value (controlled or uncontrolled)\n const hasValue = value !== undefined ? value !== '' : defaultValue !== undefined && defaultValue !== '';\n\n // Expand if focused or has value\n if (isFocused || hasValue) {\n return '100%';\n }\n\n return collapsedWidth;\n }, [expandOnFocus, isFocused, value, defaultValue, collapsedWidth]);\n\n // Determine input state based on props\n const inputState = useMemo(() => {\n if (isDisabled) return 'disabled';\n if (isReadOnly) return 'readonly';\n if (isInvalid) return 'error';\n if (isValid) return 'success';\n return 'default';\n }, [isDisabled, isReadOnly, isInvalid, isValid]);\n\n // Determine label state\n const labelState = useMemo(() => {\n if (isDisabled) return 'disabled';\n if (isInvalid) return 'error';\n return 'default';\n }, [isDisabled, isInvalid]);\n\n // Combine description and patternDescription\n const combinedDescription = useMemo(() => {\n if (description && patternDescription) {\n return `${description} ${patternDescription}`;\n }\n return description || patternDescription;\n }, [description, patternDescription]);\n\n // Calculate dynamic padding for prefix/suffix\n const inputPadding = useMemo(() => {\n const basePadding = { left: 12, right: 12 }; // Default px-3 = 12px\n\n if (prefix) {\n // If prefix is string, estimate width; if ReactNode, use prefixSize\n const prefixWidth = typeof prefix === 'string'\n ? prefix.length * 8 + 16 // Rough estimate: 8px per char + 16px margin\n : prefixSize + 16; // Icon size + margin\n basePadding.left = prefixWidth;\n }\n\n // Password toggle takes precedence over custom suffix\n if (type === 'password' && showPasswordToggle) {\n // Password toggle is always a 16px icon\n basePadding.right = 16 + 16; // Icon size + margin\n } else if (suffix) {\n // If suffix is string, estimate width; if ReactNode, use suffixSize\n const suffixWidth = typeof suffix === 'string'\n ? suffix.length * 8 + 16 // Rough estimate: 8px per char + 16px margin\n : suffixSize + 16; // Icon size + margin\n basePadding.right = suffixWidth;\n }\n\n return basePadding;\n }, [prefix, suffix, prefixSize, suffixSize, type, showPasswordToggle]);\n\n // Determine actual input type (handle password toggle)\n const actualType = useMemo(() => {\n if (type === 'password' && showPasswordToggle && showPassword) {\n return 'text';\n }\n return type;\n }, [type, showPasswordToggle, showPassword]);\n\n // Password toggle button\n const handlePasswordToggle = useCallback(() => {\n setShowPassword(prev => !prev);\n }, []);\n\n // Eye icons for password toggle\n const EyeIcon = () => (\n <svg\n data-testid=\"password-toggle-icon-show\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 8s3-5 7-5 7 5 7 5-3 5-7 5-7-5-7-5z\" />\n <circle cx=\"8\" cy=\"8\" r=\"2\" />\n </svg>\n );\n\n const EyeOffIcon = () => (\n <svg\n data-testid=\"password-toggle-icon-hide\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10.5 5.5l-5 5\" />\n <path d=\"M1 8s3-5 7-5c1.5 0 2.8.6 4 1.5M15 8s-1.5 2.5-4 4\" />\n <path d=\"M3 13l2-2m7-7l2-2\" />\n <circle cx=\"8\" cy=\"8\" r=\"2\" />\n </svg>\n );\n\n // Determine actual suffix (password toggle takes precedence for password fields)\n const actualSuffix = useMemo(() => {\n if (type === 'password' && showPasswordToggle) {\n return (\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n onPress={handlePasswordToggle}\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n className=\"!min-h-0 !min-w-0 h-8 w-8\"\n >\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </Button>\n );\n }\n return suffix;\n }, [type, showPasswordToggle, showPassword, suffix, handlePasswordToggle]);\n\n return (\n <AriaTextField\n ref={ref}\n className={cn(\"flex flex-col gap-1.5\", className)}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n value={value}\n defaultValue={defaultValue}\n {...props}\n >\n {/* Label with required indicator */}\n {label && (\n <AriaLabel className={cn(labelVariants({ state: labelState }))}>\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive-background)]\" aria-hidden=\"true\">\n <strong>*</strong>\n </span>\n )}\n </AriaLabel>\n )}\n\n {/* Description text (helper text) */}\n {combinedDescription && (\n <AriaText slot=\"description\" className={cn(descriptionVariants())}>\n {combinedDescription}\n </AriaText>\n )}\n\n {/* Input field with prefix/suffix */}\n <div\n className=\"relative flex items-center transition-all duration-200\"\n style={{\n width: inputWidth,\n }}\n >\n {/* Prefix */}\n {prefix && (\n <div\n data-testid=\"textfield-prefix\"\n className=\"absolute left-3 flex items-center justify-center pointer-events-none text-[var(--content-foreground)]\"\n aria-hidden=\"true\"\n >\n {prefix}\n </div>\n )}\n\n {/* Input */}\n <AriaInput\n type={actualType}\n id={fieldId}\n className={cn(\n inputVariants({ size, state: inputState }),\n DISABLED_STYLES,\n isShaking && 'shake'\n )}\n style={{\n width: '100%',\n paddingLeft: `${inputPadding.left}px`,\n paddingRight: `${inputPadding.right}px`,\n }}\n autoComplete={autoComplete}\n pattern={pattern}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onBlur={handleBlur}\n aria-required={isRequired ? 'true' : undefined}\n aria-readonly={isReadOnly ? 'true' : undefined}\n aria-errormessage={isInvalid && errorMessage ? errorId : undefined}\n />\n\n {/* Suffix */}\n {actualSuffix && (\n <div\n data-testid=\"textfield-suffix\"\n className={cn(\n \"absolute right-3 flex items-center justify-center text-[var(--content-foreground)]\",\n // Password toggle is clickable, other suffixes are not\n type === 'password' && showPasswordToggle ? \"\" : \"pointer-events-none\"\n )}\n aria-hidden={type === 'password' && showPasswordToggle ? undefined : \"true\"}\n >\n {actualSuffix}\n </div>\n )}\n </div>\n\n {/* Success message (shown when valid) */}\n {isValid && successMessage && !isInvalid && (\n <AriaText slot=\"description\" className={cn(successMessageVariants())}>\n {successMessage}\n </AriaText>\n )}\n\n {/* Error message (shown when invalid) - takes precedence over success */}\n {isInvalid && errorMessage && (\n <TextFieldError id={errorId}>\n {errorMessage}\n </TextFieldError>\n )}\n\n {/* Screen reader announcement for paste prevention */}\n {screenReaderMessage && (\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {screenReaderMessage}\n </div>\n )}\n </AriaTextField>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport { inputVariants as textFieldInputVariants, labelVariants as textFieldLabelVariants };\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport type { ReactNode } from 'react';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type {\n TextFieldProps as AriaTextFieldProps,\n LabelProps as AriaLabelProps,\n InputProps as AriaInputProps,\n TextProps as AriaTextProps,\n} from 'react-aria-components';\n\n/**\n * AutoComplete values from MDN spec\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete\n */\nexport const AutoCompleteValue = z.enum([\n // Control tokens\n 'off',\n 'on',\n // Name-related\n 'name',\n 'honorific-prefix',\n 'given-name',\n 'additional-name',\n 'family-name',\n 'honorific-suffix',\n 'nickname',\n // Contact\n 'email',\n 'username',\n // Authentication\n 'new-password',\n 'current-password',\n 'one-time-code',\n // Organization\n 'organization-title',\n 'organization',\n // Address\n 'street-address',\n 'address-line1',\n 'address-line2',\n 'address-line3',\n 'address-level4',\n 'address-level3',\n 'address-level2',\n 'address-level1',\n 'country',\n 'country-name',\n 'postal-code',\n // Payment\n 'cc-name',\n 'cc-given-name',\n 'cc-additional-name',\n 'cc-family-name',\n 'cc-number',\n 'cc-exp',\n 'cc-exp-month',\n 'cc-exp-year',\n 'cc-csc',\n 'cc-type',\n // Transaction\n 'transaction-currency',\n 'transaction-amount',\n // Personal\n 'language',\n 'bday',\n 'bday-day',\n 'bday-month',\n 'bday-year',\n 'sex',\n // Telephone\n 'tel',\n 'tel-country-code',\n 'tel-national',\n 'tel-area-code',\n 'tel-local',\n 'tel-extension',\n // Other\n 'impp',\n 'url',\n 'photo',\n]);\n\nexport type AutoCompleteValueType = z.infer<typeof AutoCompleteValue>;\n\n/**\n * Dangerous regex patterns that can cause ReDoS attacks\n * @see DECISIONS.md Decision 21\n */\nconst DANGEROUS_REGEX_PATTERNS = [\n /\\(\\.\\*\\)\\+/, // Catastrophic backtracking: (.*)+\n /\\(\\.\\+\\)\\+/, // Catastrophic backtracking: (.+)+\n /\\([^)]*\\)\\{.*,.*\\}/, // Excessive quantifiers: (x){10,1000}\n /\\(\\?!\\)/, // Negative lookahead (can be slow)\n /\\(\\?<=\\)/, // Positive lookbehind (can be slow)\n];\n\n/**\n * Validates regex pattern for ReDoS safety\n * @param pattern - Regular expression pattern string\n * @returns true if pattern is safe, false if potentially dangerous\n */\nexport const validatePatternSafety = (pattern: string): boolean => {\n // Check for known dangerous patterns\n for (const dangerous of DANGEROUS_REGEX_PATTERNS) {\n if (dangerous.test(pattern)) {\n return false;\n }\n }\n\n // Check for excessive nested quantifiers\n const quantifierCount = (pattern.match(/[*+{}]/g) || []).length;\n if (quantifierCount > 5) {\n return false;\n }\n\n return true;\n};\n\n/**\n * TextField props schema extending BaseComponentProps\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements - WCAG 2.2 AAA)\n * @see React Aria TextField: https://react-spectrum.adobe.com/react-aria/TextField.html\n * @see ShadCN Input: https://ui.shadcn.com/docs/components/input\n * @see ShadCN Label: https://ui.shadcn.com/docs/components/label\n */\nexport const TextFieldPropsSchema = BaseComponentPropsSchema.extend({\n // Size variants (matching Button sizes: sm, default, lg)\n size: z.enum(['sm', 'default', 'lg']).optional().default('default'),\n\n // Text content\n label: z.string().optional(),\n description: z.string().optional(),\n errorMessage: z.string().optional(),\n successMessage: z.string().optional(),\n\n // Input type - BREAKING: removed 'tel' (use TelField component instead)\n // @see DECISIONS.md Decision 14\n type: z\n .enum(['text', 'email', 'password', 'url', 'search'])\n .optional()\n .default('text'),\n\n // State props\n isRequired: z.boolean().optional(),\n isReadOnly: z.boolean().optional(),\n isDisabled: z.boolean().optional(),\n isInvalid: z.boolean().optional(),\n isValid: z.boolean().optional(),\n\n // Input attributes\n placeholder: z.string().optional(),\n value: z.string().optional(),\n defaultValue: z.string().optional(),\n name: z.string().optional(),\n autoFocus: z.boolean().optional(),\n\n // AutoComplete - BREAKING: strict MDN enum instead of string\n // @see DECISIONS.md Decision 13\n autoComplete: AutoCompleteValue.optional(),\n\n maxLength: z.number().optional(),\n minLength: z.number().optional(),\n\n // Pattern validation with security check\n // @see DECISIONS.md Decision 15, 18\n // @warning SECURITY: Only use patterns defined in source code, never from user input\n pattern: z.string().optional(),\n patternDescription: z.string().optional(),\n\n // Feature: Copy/Paste Restriction\n // @see DECISIONS.md Decision 4\n disableCopyPaste: z.boolean().optional().default(false),\n\n // Feature: Prefix/Suffix\n // @see DECISIONS.md Decision 9\n prefix: z.any().optional(), // ReactNode - can't validate with Zod\n suffix: z.any().optional(), // ReactNode - can't validate with Zod\n prefixSize: z.number().optional().default(16),\n suffixSize: z.number().optional().default(16),\n\n // Feature: Expand on Focus\n // @see DECISIONS.md Decision 6, 17\n expandOnFocus: z.boolean().optional().default(false),\n collapsedWidth: z.string().optional().default('200px'),\n\n // Feature: Password Toggle\n // @see DECISIONS.md Decision 8\n showPasswordToggle: z.boolean().optional(),\n\n // Event handlers (onChange, onBlur, onFocus inherited from AriaTextFieldProps)\n // Custom validate function added in TypeScript type below (not in Zod schema)\n})\n.refine(\n (data) => !data.pattern || data.patternDescription,\n {\n message: \"patternDescription is required when pattern is provided\",\n path: [\"patternDescription\"]\n }\n)\n.refine(\n (data) => !data.pattern || validatePatternSafety(data.pattern),\n {\n message: \"Unsafe regex pattern detected. Pattern may cause ReDoS vulnerability. Avoid patterns like (.*)+, (.+)+, or excessive quantifiers.\",\n path: [\"pattern\"]\n }\n)\n.refine(\n (data) => !(data.successMessage && data.errorMessage),\n {\n message: \"Cannot provide both successMessage and errorMessage. Use one based on validation state.\",\n path: [\"successMessage\"]\n }\n)\n.refine(\n (data) => {\n // Development mode warning for conflicting validation states\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'development') {\n if (data.isValid && data.isInvalid) {\n console.error('[TextField] Both isValid and isInvalid are true. isInvalid takes precedence.');\n }\n }\n return true;\n }\n);\n\nexport type TextFieldProps = Partial<z.infer<typeof TextFieldPropsSchema>> &\n Omit<AriaTextFieldProps, keyof z.infer<typeof TextFieldPropsSchema>> & {\n // Explicitly type onChange for better IntelliSense\n onChange?: (value: string) => void;\n\n // Custom validation function\n // @see DECISIONS.md Decision 7, 18\n // Pattern validation runs first, then custom validate\n validate?: (value: string) => string | undefined | null;\n\n // Prefix/Suffix with proper typing\n prefix?: ReactNode;\n suffix?: ReactNode;\n };\n\n/**\n * Label props schema for TextField label sub-component\n */\nexport const TextFieldLabelPropsSchema = z.object({\n children: z.any().optional(),\n className: z.string().optional(),\n htmlFor: z.string().optional(),\n state: z.enum(['default', 'error', 'disabled']).optional().default('default'),\n});\n\nexport type TextFieldLabelProps = z.infer<typeof TextFieldLabelPropsSchema> &\n Omit<AriaLabelProps, keyof z.infer<typeof TextFieldLabelPropsSchema>>;\n\n/**\n * Input props schema for TextField input sub-component\n */\nexport const TextFieldInputPropsSchema = z.object({\n className: z.string().optional(),\n size: z.enum(['sm', 'default', 'lg']).optional().default('default'),\n state: z\n .enum(['default', 'error', 'success', 'disabled', 'readonly'])\n .optional()\n .default('default'),\n});\n\nexport type TextFieldInputProps = z.infer<typeof TextFieldInputPropsSchema> &\n Omit<AriaInputProps, keyof z.infer<typeof TextFieldInputPropsSchema>>;\n\n/**\n * Description text props schema for TextField description sub-component\n */\nexport const TextFieldDescriptionPropsSchema = z.object({\n children: z.any().optional(),\n className: z.string().optional(),\n});\n\nexport type TextFieldDescriptionProps = z.infer<typeof TextFieldDescriptionPropsSchema> &\n Omit<AriaTextProps, keyof z.infer<typeof TextFieldDescriptionPropsSchema>>;\n\n/**\n * Error message props schema for TextField error sub-component\n */\nexport const TextFieldErrorPropsSchema = z.object({\n children: z.any().optional(),\n className: z.string().optional(),\n});\n\nexport type TextFieldErrorProps = z.infer<typeof TextFieldErrorPropsSchema> &\n Omit<AriaTextProps, keyof z.infer<typeof TextFieldErrorPropsSchema>>;\n\n/**\n * Success message props schema for TextField success sub-component\n * @see DECISIONS.md Decision 5\n */\nexport const TextFieldSuccessPropsSchema = z.object({\n children: z.any().optional(),\n className: z.string().optional(),\n});\n\nexport type TextFieldSuccessProps = z.infer<typeof TextFieldSuccessPropsSchema> &\n Omit<AriaTextProps, keyof z.infer<typeof TextFieldSuccessPropsSchema>>;\n\n/**\n * CVA variant configuration types\n */\nexport type TextFieldSize = z.infer<typeof TextFieldPropsSchema>['size'];\nexport type InputState = z.infer<typeof TextFieldInputPropsSchema>['state'];\nexport type LabelState = z.infer<typeof TextFieldLabelPropsSchema>['state'];\n"]}
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/styles/interaction-states.ts","../../../src/elements/Button/Button.styles.ts","../../../src/elements/ButtonGroup/ButtonGroupContext.tsx","../../../src/elements/ButtonGroup/ButtonGroup.variants.ts","../../../src/elements/Button/Button.tsx","../../../src/elements/TextField/TextField.icons.tsx","../../../src/elements/TextField/TextField.styles.ts","../../../src/elements/TextField/TextField.hooks.ts","../../../src/elements/TextField/TextField.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/TextField/TextField.types.ts"],"names":["cn","inputs","twMerge","clsx","PRESSED_STYLES","HOVER_STYLES","HIGH_CONTRAST_HOVER","HIGH_CONTRAST_PRESSED","DISABLED_STYLES","buttonOuterVariants","cva","buttonVisualVariants","ButtonGroupContext","createContext","useButtonGroupContext","useContext","ButtonGroupItemContext","useButtonGroupItemContext","buttonGroupItemVariants","Button","memo","forwardRef","className","buttonVisualClassName","variant","size","visualSize","fullWidth","loading","loadingText","shortcut","children","isDisabled","paywall","paywallRedirect","paywallDescription","onPress","props","ref","paywallDescriptionId","useId","groupContext","itemContext","effectiveVariant","effectiveSize","effectiveIsDisabled","isInVerticalGroup","effectiveFullWidth","positionClassName","effectiveVisualSize","jsx","AriaButton","e","renderProps","jsxs","Fragment","Loader2","Zap","EyeIcon","EyeOffIcon","inputVariants","labelVariants","descriptionVariants","errorMessageVariants","successMessageVariants","useExpandOnFocus","expandOnFocus","collapsedWidth","value","defaultValue","userOnFocus","userOnBlur","isFocused","setIsFocused","useState","handleFocus","useCallback","handleBlur","inputWidth","useMemo","useCopyPasteProtection","disableCopyPaste","isShaking","setIsShaking","screenReaderMessage","setScreenReaderMessage","useEffect","handlePaste","usePasswordToggle","type","showPasswordToggle","showPassword","setShowPassword","handlePasswordToggle","prev","actualType","TextFieldLabel","state","AriaLabel","TextFieldInput","AriaInput","TextFieldDescription","AriaText","TextFieldError","AriaFieldError","CircleAlert","TextFieldSuccess","TextField","label","description","errorMessage","successMessage","isRequired","isReadOnly","isInvalid","isValid","id","autoComplete","pattern","patternDescription","prefix","suffix","prefixSize","suffixSize","isIconHidden","onSubmit","onClear","errorId","generatedId","fieldId","isSearch","searchValue","setSearchValue","isControlledSearch","currentSearchValue","handleSearchChange","newValue","handleSearchClear","handleSearchKeyDown","inputState","labelState","combinedDescription","actualPrefix","Search","inputPadding","basePadding","prefixWidth","suffixWidth","actualSuffix","X","hasInteractiveSuffix","AriaTextField","BaseComponentPropsSchema","z","AutoCompleteValue","DANGEROUS_REGEX_PATTERNS","validatePatternSafety","dangerous","TextFieldPropsSchema","data","TextFieldLabelPropsSchema","TextFieldInputPropsSchema","TextFieldDescriptionPropsSchema","TextFieldErrorPropsSchema","TextFieldSuccessPropsSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Global Interaction State Styles\n *\n * Consistent interaction patterns across all Themis components.\n * These styles ensure WCAG 2.2 AAA compliance and predictable UX.\n *\n * @see spec.md FR-010 (Visible focus ring for keyboard navigation)\n * @see spec.md FR-031 (Pressed state feedback)\n * @see spec.md FR-012 (High contrast mode support)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\n/**\n * Focus state styles (FR-010)\n * Visible focus ring for keyboard navigation - WCAG 2.2 Level AAA\n *\n * Components can override by extending these styles:\n * @example\n * cn(FOCUS_STYLES, \"ring-4\") // Increases ring width to 4px\n */\nexport const FOCUS_STYLES = \"data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2\";\n\n/**\n * Pressed/Active state styles (FR-031)\n * Visual feedback for press interactions\n *\n * Components can override the scale amount:\n * @example\n * cn(PRESSED_STYLES_BASE, \"data-[pressed]:scale-[0.95]\") // More pronounced scale\n */\nexport const PRESSED_STYLES = \"data-[pressed]:scale-[0.97]\";\n\n/**\n * Base pressed styles without scale (for components that need different feedback)\n */\nexport const PRESSED_STYLES_BASE = \"data-[pressed]:transition-transform data-[pressed]:duration-100\";\n\n/**\n * Hover state styles\n * Elevation change on hover for better affordance\n *\n * Components can override shadow depth:\n * @example\n * cn(HOVER_STYLES_BASE, \"data-[hovered]:shadow-lg\") // Larger shadow\n */\nexport const HOVER_STYLES = \"data-[hovered]:shadow-md\";\n\n/**\n * Base hover styles without shadow (for components that use different hover effects)\n */\nexport const HOVER_STYLES_BASE = \"data-[hovered]:transition-shadow data-[hovered]:duration-200\";\n\n/**\n * High contrast mode focus (FR-012)\n * Enhanced outlines for users requiring high contrast\n *\n * Uses 'hc:' prefix for prefers-contrast: more media query\n */\nexport const HIGH_CONTRAST_FOCUS = \"hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground\";\n\n/**\n * High contrast mode hover (FR-012)\n * Enhanced outlines for hover in high contrast mode\n */\nexport const HIGH_CONTRAST_HOVER = \"hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground\";\n\n/**\n * High contrast mode pressed state\n * Enhanced outlines for pressed state in high contrast mode\n */\nexport const HIGH_CONTRAST_PRESSED = \"hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground\";\n\n/**\n * Combined high contrast styles\n * Use this for components that need all high contrast interaction states\n */\nexport const HIGH_CONTRAST_INTERACTIONS = `${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Disabled state styles\n * Consistent disabled appearance across all components\n */\nexport const DISABLED_STYLES = \"disabled:pointer-events-none disabled:opacity-50\";\n\n/**\n * Default interaction bundle\n * Most common combination for interactive components\n *\n * Includes: focus ring, pressed scale, hover shadow, high contrast enhancements\n *\n * @example\n * <button className={cn(DEFAULT_INTERACTIONS, \"bg-primary\")}>Click</button>\n */\nexport const DEFAULT_INTERACTIONS = `${FOCUS_STYLES} ${PRESSED_STYLES} ${HOVER_STYLES} ${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Subtle interaction bundle\n * For components that need less pronounced feedback\n *\n * Includes: focus ring and high contrast, but no hover shadow or pressed scale\n */\nexport const SUBTLE_INTERACTIONS = `${FOCUS_STYLES} ${HIGH_CONTRAST_FOCUS}`;\n\n/**\n * Non-interactive element styles\n * For elements that should indicate they are not interactive\n */\nexport const NON_INTERACTIVE = \"cursor-default select-none\";\n","import { cva } from 'class-variance-authority';\n\n/**\n * Layer 1: Transparent outer touch target (44x44px minimum)\n * Handles WCAG 2.2 AAA touch target requirement\n * Always transparent, centers the visual button inside\n * IMPORTANT: Focus ring stays on Layer 1 for AAA compliance (2.4.13)\n *\n * In vertical ButtonGroups, uses items-stretch so the visual layer (Layer 2)\n * can fill the full touch target height, eliminating gaps between buttons.\n */\nexport const buttonOuterVariants = cva(\n \"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\",\n {\n variants: {\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n inVerticalGroup: {\n true: \"items-stretch\",\n false: \"items-center\",\n },\n },\n defaultVariants: {\n fullWidth: false,\n inVerticalGroup: false,\n },\n }\n);\n\n/**\n * Layer 2: Visual button appearance (adjustable size)\n * Provides the visual appearance with configurable size\n * Can be smaller than touch target for use cases like carousel dots\n * NOTE: NO focus-visible styles here - focus ring is on Layer 1\n */\nexport const buttonVisualVariants = cva(\n \"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\",\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80\",\n destructive:\n \"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80\",\n outline:\n \"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]\",\n secondary:\n \"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70\",\n ghost:\n \"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]\",\n link: \"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]\",\n },\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n visualSize: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3 text-xs\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n dot: \"h-5 w-5 rounded-full p-0 min-h-0 min-w-0\",\n },\n paywall: {\n true: \"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n visualSize: \"default\",\n paywall: false,\n },\n }\n);\n\n/**\n * @deprecated Use buttonVisualVariants instead. This alias is kept for backward compatibility.\n */\nexport const buttonVariants = buttonVisualVariants;\n","\"use client\";\n\nimport { createContext, useContext } from 'react';\nimport type {\n ButtonGroupContextValue,\n ButtonGroupItemContextValue,\n} from './ButtonGroup.types';\n\n/**\n * ButtonGroup Context System (Two-Level)\n *\n * Provides a two-level context pattern for ButtonGroup:\n *\n * 1. ButtonGroupContext (group-level):\n * - Provides: orientation, variant, size, isDisabled\n * - Consumed by: Button (for prop inheritance), Separator (for orientation)\n *\n * 2. ButtonGroupItemContext (item-level):\n * - Provides: position ('first' | 'middle' | 'last' | 'only')\n * - Consumed by: Button (for border-radius styling)\n *\n * Both contexts return null when not in a provider, allowing Button\n * to work standalone without any group context.\n *\n * @see plan.md for architecture details\n * @see ButtonGroup.tsx for Provider implementation\n */\n\n// =============================================================================\n// Group-Level Context\n// =============================================================================\n\n/**\n * Context for group-level props (orientation, variant, size, isDisabled)\n * Default value is null to indicate \"not in a group\"\n */\nconst ButtonGroupContext = createContext<ButtonGroupContextValue | null>(null);\n\nButtonGroupContext.displayName = 'ButtonGroupContext';\n\n/**\n * Hook to access group-level context\n * @returns ButtonGroupContextValue if inside a ButtonGroup, null otherwise\n */\nexport function useButtonGroupContext(): ButtonGroupContextValue | null {\n return useContext(ButtonGroupContext);\n}\n\n// =============================================================================\n// Item-Level Context\n// =============================================================================\n\n/**\n * Context for per-button position information\n * Default value is null to indicate \"not wrapped with position context\"\n */\nconst ButtonGroupItemContext =\n createContext<ButtonGroupItemContextValue | null>(null);\n\nButtonGroupItemContext.displayName = 'ButtonGroupItemContext';\n\n/**\n * Hook to access item-level context (position)\n * @returns ButtonGroupItemContextValue if wrapped with position context, null otherwise\n */\nexport function useButtonGroupItemContext(): ButtonGroupItemContextValue | null {\n return useContext(ButtonGroupItemContext);\n}\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ButtonGroupContext, ButtonGroupItemContext };\n","import { cva } from 'class-variance-authority';\n\n/**\n * ButtonGroup CVA Variants\n *\n * Defines Class Variance Authority (CVA) variants for:\n * - ButtonGroup container (orientation-based layout)\n * - ButtonGroupItem (position-based border-radius)\n * - ButtonGroupSeparator (orientation-based styling)\n *\n * @see plan.md Phase 1: Design & Contracts - CVA Variants\n * @see constitution.md Principle V (Component Quality Standards)\n */\n\n// =============================================================================\n// Container Variants\n// =============================================================================\n\n/**\n * ButtonGroup container variants\n * Controls the layout direction based on orientation\n * Uses gap-0 to ensure buttons are connected (share borders)\n */\nexport const buttonGroupVariants = cva('inline-flex items-center gap-0', {\n variants: {\n orientation: {\n horizontal: 'flex-row',\n vertical: 'flex-col w-full',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// =============================================================================\n// Item Position Variants\n// =============================================================================\n\n/**\n * ButtonGroupItem position variants\n * Applied to Button's visual layer (Layer 2) for position-aware border-radius\n *\n * Compound variants handle both orientation and position combinations:\n * - Horizontal: left/right borders and radii\n * - Vertical: top/bottom borders and radii\n */\nexport const buttonGroupItemVariants = cva('', {\n variants: {\n orientation: {\n // min-w-[44px] ensures visual layer fills touch target width (for icon buttons)\n horizontal: 'min-w-[44px]',\n // flex (overrides inline-flex) + min-h-[44px] makes visual layer fill touch target,\n // eliminating gaps between stacked buttons in vertical orientation\n vertical: 'flex min-h-[44px]',\n },\n position: {\n first: '',\n middle: '',\n last: '',\n only: '', // Single button - no modifications needed\n },\n },\n compoundVariants: [\n // ==========================================================================\n // Horizontal Orientation\n // ==========================================================================\n {\n orientation: 'horizontal',\n position: 'first',\n className: 'rounded-r-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'middle',\n className: 'rounded-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'last',\n className: 'rounded-l-none',\n },\n // ==========================================================================\n // Vertical Orientation\n // Note: w-full is handled by Button's effectiveFullWidth for both layers\n // ==========================================================================\n {\n orientation: 'vertical',\n position: 'first',\n className: 'rounded-b-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'middle',\n className: 'rounded-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'last',\n className: 'rounded-t-none',\n },\n ],\n defaultVariants: {\n orientation: 'horizontal',\n position: 'only',\n },\n});\n\n// =============================================================================\n// Separator Variants\n// =============================================================================\n\n/**\n * ButtonGroupSeparator variants\n * Orientation-aware visual divider between button groups\n */\nexport const buttonGroupSeparatorVariants = cva('bg-[var(--border)]', {\n variants: {\n orientation: {\n horizontal: 'w-px h-6 mx-1',\n vertical: 'h-px w-full my-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n","\"use client\";\n\n/**\n * Button Component - 3-Layer Architecture\n * Accessible button with React Aria primitives and CVA styling\n *\n * Architecture:\n * - Layer 1: Touch Target (44x44px WCAG AAA compliant, transparent)\n * - Layer 2: Visual Button (configurable size, colors, borders)\n * - Layer 3: Content & Effects (text, icons, ripple, loading spinner)\n *\n * @see 3layer-plan.md for architecture details\n * @see spec.md FR-029 to FR-037 (Button Component Requirements)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see spec.md FR-014 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, useId } from 'react';\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from 'react-aria-components';\nimport { Loader2, Zap } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { ButtonProps } from './Button.types';\nimport { buttonOuterVariants, buttonVisualVariants, buttonVariants } from './Button.styles';\nimport { PRESSED_STYLES, HOVER_STYLES, HIGH_CONTRAST_HOVER, HIGH_CONTRAST_PRESSED } from '../../styles/interaction-states';\nimport {\n useButtonGroupContext,\n useButtonGroupItemContext,\n} from '../ButtonGroup/ButtonGroupContext';\nimport { buttonGroupItemVariants } from '../ButtonGroup/ButtonGroup.variants';\n\n/**\n * Button Component - 3-Layer Architecture\n * Fully accessible button with React Aria and themed styling\n *\n * Layer 1: Touch Target (AriaButton) - 44x44px WCAG AAA compliant\n * Layer 2: Visual Button (span) - configurable appearance\n * Layer 3: Content (children) - text, icons, effects\n */\nconst Button = memo(forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n buttonVisualClassName,\n variant,\n size,\n visualSize,\n fullWidth,\n loading = false,\n loadingText = \"Loading...\",\n shortcut,\n children,\n isDisabled,\n paywall = false,\n paywallRedirect,\n paywallDescription,\n onPress,\n ...props\n },\n ref\n ) => {\n const paywallDescriptionId = useId();\n\n // ==========================================================================\n // ButtonGroup Context Integration\n // ==========================================================================\n\n // Consume group-level context (variant, size, isDisabled, orientation)\n const groupContext = useButtonGroupContext();\n\n // Consume item-level context (position for border-radius styling)\n const itemContext = useButtonGroupItemContext();\n\n // Merge context values with props (props take precedence)\n const effectiveVariant = variant ?? groupContext?.variant ?? 'default';\n const effectiveSize = size ?? groupContext?.size;\n const effectiveIsDisabled = isDisabled ?? groupContext?.isDisabled ?? false;\n\n // In vertical groups, buttons should be full width automatically\n const isInVerticalGroup = groupContext?.orientation === 'vertical';\n const effectiveFullWidth = fullWidth || isInVerticalGroup;\n\n // Position styling for ButtonGroup (only applied when in a group)\n const positionClassName = itemContext\n ? buttonGroupItemVariants({\n orientation: groupContext?.orientation ?? 'horizontal',\n position: itemContext.position,\n })\n : '';\n\n // Default visualSize to size for backward compatibility\n const effectiveVisualSize = visualSize ?? effectiveSize ?? 'default';\n\n // AAA Accessibility: Warn in dev/test if icon/dot variant lacks accessible name\n if (process.env.NODE_ENV !== 'production') {\n if (\n (effectiveVisualSize === 'dot' || effectiveVisualSize === 'icon') &&\n !props['aria-label'] &&\n !children\n ) {\n console.warn(\n '[Button] visualSize=\"dot\" or \"icon\" requires aria-label when no visible text is provided (WCAG 1.1.1)'\n );\n }\n }\n\n /**\n * Handle button press - intercepts action when paywalled\n * If paywalled with redirect URL, opens in new tab\n * Otherwise, calls the normal onPress handler\n */\n const handlePress = (e: Parameters<NonNullable<AriaButtonProps['onPress']>>[0]): void => {\n if (paywall) {\n if (paywallRedirect) {\n window.open(paywallRedirect, '_blank', 'noopener,noreferrer');\n }\n // Don't call onPress when paywalled\n return;\n }\n onPress?.(e);\n };\n\n // Only set isDisabled when we have a reason to disable\n // Otherwise, let slot system control disabled state (e.g., in NumberField)\n const computedIsDisabled = effectiveIsDisabled || loading || undefined;\n\n return (\n <AriaButton\n ref={ref}\n isDisabled={computedIsDisabled}\n aria-disabled={paywall ? true : undefined}\n aria-describedby={paywall ? paywallDescriptionId : undefined}\n onPress={handlePress}\n className={cn(buttonOuterVariants({ fullWidth: effectiveFullWidth, inVerticalGroup: isInVerticalGroup }), className)}\n {...props}\n >\n {(renderProps) => (\n /* Layer 2: Visual Button */\n <span\n className={cn(\n buttonVisualVariants({\n variant: effectiveVariant,\n visualSize: effectiveVisualSize,\n paywall,\n fullWidth: effectiveFullWidth,\n }),\n // Position styling from ButtonGroup context (border-radius adjustments)\n positionClassName,\n buttonVisualClassName,\n // Layer 2 interaction styles (no focus - focus ring is on Layer 1)\n PRESSED_STYLES,\n HOVER_STYLES,\n HIGH_CONTRAST_HOVER,\n HIGH_CONTRAST_PRESSED\n )}\n data-pressed={renderProps.isPressed || undefined}\n >\n {/* Layer 3: Content & Effects */}\n\n {/* FR-033: Loading spinner with screen reader announcement */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {loading && (\n <>\n <Loader2 className=\"motion-safe:animate-spin\" aria-hidden=\"true\" />\n <span className=\"sr-only\" aria-live=\"polite\">\n {loadingText}\n </span>\n </>\n )}\n\n {/* Hide children during loading */}\n {!loading && children}\n\n {/* Paywall: Lightning bolt icon */}\n {paywall && (\n <Zap\n data-testid=\"zap-icon\"\n aria-hidden=\"true\"\n className=\"ml-1\"\n />\n )}\n\n {/* Paywall: Screen reader description */}\n {paywall && (\n <span id={paywallDescriptionId} className=\"sr-only\">\n Premium feature: {paywallDescription || \"Upgrade required to access this feature\"}\n </span>\n )}\n\n {/* FR-034: Keyboard shortcut display on focus */}\n {renderProps.isFocusVisible && shortcut && (\n <kbd className=\"ml-auto hidden text-xs opacity-60 lg:inline\">\n {shortcut}\n </kbd>\n )}\n\n {/* Touch/press ripple effect - FR-031: Pressed state feedback */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {renderProps.isPressed && (\n <span\n className=\"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n )}\n </AriaButton>\n );\n }\n));\n\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants, buttonOuterVariants, buttonVisualVariants };\nexport type { ButtonProps } from './Button.types';\n","/**\n * TextField Icon Components\n * SVG icons for password toggle functionality\n *\n * Extracted from TextField.tsx to keep the main component file focused.\n * These are module-level components to avoid re-creating on every render.\n */\n\nimport type { ReactElement } from 'react';\n\n/**\n * Eye icon for \"show password\" state\n * Rendered when the password is currently hidden\n */\nexport const EyeIcon = (): ReactElement => (\n <svg\n data-testid=\"password-toggle-icon-show\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 8s3-5 7-5 7 5 7 5-3 5-7 5-7-5-7-5z\" />\n <circle cx=\"8\" cy=\"8\" r=\"2\" />\n </svg>\n);\n\n/**\n * Eye-off icon for \"hide password\" state\n * Rendered when the password is currently visible\n */\nexport const EyeOffIcon = (): ReactElement => (\n <svg\n data-testid=\"password-toggle-icon-hide\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10.5 5.5l-5 5\" />\n <path d=\"M1 8s3-5 7-5c1.5 0 2.8.6 4 1.5M15 8s-1.5 2.5-4 4\" />\n <path d=\"M3 13l2-2m7-7l2-2\" />\n <circle cx=\"8\" cy=\"8\" r=\"2\" />\n </svg>\n);\n","/**\n * TextField CVA Variant Styles\n * Extracted from TextField.tsx for separation of concerns\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements - WCAG 2.2 AAA)\n * @see React Aria TextField: https://react-spectrum.adobe.com/react-aria/TextField.html\n * @see ShadCN Input: https://ui.shadcn.com/docs/components/input\n * @see ShadCN Label: https://ui.shadcn.com/docs/components/label\n */\n\nimport { cva } from 'class-variance-authority';\n\n/**\n * Input variant styles using CVA\n * Adapts ShadCN Input styling with Themis semantic tokens\n */\nexport const inputVariants = cva(\n // Base styles - FR-014: Proper input styling with focus states\n \"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\",\n {\n variants: {\n // Size variants (matching Button sizes)\n size: {\n sm: \"h-9 text-xs px-2 py-1\",\n default: \"h-10 px-3 py-2\",\n lg: \"h-11 px-4 py-3 text-base\"\n },\n // State variants\n state: {\n default: \"border-[var(--input-border)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2\",\n error: \"border-[var(--destructive-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--destructive-background)] focus-visible:ring-offset-2\",\n success: \"border-[var(--success-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--success-ring)] focus-visible:ring-offset-2\",\n disabled: \"cursor-not-allowed opacity-50\",\n readonly: \"cursor-default bg-[var(--content-background)] opacity-70\"\n }\n },\n defaultVariants: {\n size: \"default\",\n state: \"default\"\n }\n }\n);\n\n/**\n * Label variant styles using CVA\n * Adapts ShadCN Label styling with Themis semantic tokens\n */\nexport const labelVariants = cva(\n // Base styles - FR-009: WCAG 2.2 AAA compliance\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n state: {\n default: \"text-[var(--content-foreground)]\",\n error: \"text-[var(--destructive-foreground)]\",\n disabled: \"opacity-50 cursor-not-allowed\"\n }\n },\n defaultVariants: {\n state: \"default\"\n }\n }\n);\n\n/**\n * Description text variant styles\n */\nexport const descriptionVariants = cva(\n \"text-sm text-[var(--content-foreground)]\"\n);\n\n/**\n * Error message variant styles\n */\nexport const errorMessageVariants = cva(\n \"text-sm text-[var(--destructive-foreground)] font-medium mt-1.5\"\n);\n\n/**\n * Success message variant styles\n */\nexport const successMessageVariants = cva(\n \"text-sm text-[var(--success-foreground)] font-medium mt-1.5\"\n);\n","/**\n * TextField Custom Hooks\n * Extracted from TextField.tsx for separation of concerns\n *\n * These hooks encapsulate the behavioral logic for:\n * - Expand on focus\n * - Copy/paste protection\n * - Password visibility toggle\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { FocusEvent, ClipboardEvent } from 'react';\n\n/**\n * Hook: useExpandOnFocus\n * Manages the expand-on-focus behavior where an input starts narrow\n * and expands to full width when focused or when it has a value.\n *\n * @param expandOnFocus - Whether expand-on-focus is enabled\n * @param collapsedWidth - CSS width when collapsed (e.g., '200px')\n * @param value - Controlled value (if any)\n * @param defaultValue - Default value (if any)\n * @param userOnFocus - User-provided onFocus handler to call through\n * @param userOnBlur - User-provided onBlur handler to call through\n */\nexport function useExpandOnFocus({\n expandOnFocus,\n collapsedWidth,\n value,\n defaultValue,\n userOnFocus,\n userOnBlur,\n}: {\n expandOnFocus: boolean;\n collapsedWidth: string;\n value: string | undefined;\n defaultValue: string | undefined;\n userOnFocus: ((e: FocusEvent<HTMLInputElement>) => void) | undefined;\n userOnBlur: ((e: FocusEvent<HTMLInputElement>) => void) | undefined;\n}) {\n const [isFocused, setIsFocused] = useState(false);\n\n const handleFocus = useCallback((e: FocusEvent<HTMLInputElement>) => {\n if (expandOnFocus) {\n setIsFocused(true);\n }\n userOnFocus?.(e);\n }, [expandOnFocus, userOnFocus]);\n\n const handleBlur = useCallback((e: FocusEvent<HTMLInputElement>) => {\n if (expandOnFocus) {\n const isEmpty = e.target.value === '';\n if (isEmpty) {\n setIsFocused(false);\n }\n }\n userOnBlur?.(e);\n }, [expandOnFocus, userOnBlur]);\n\n const inputWidth = useMemo(() => {\n if (!expandOnFocus) return undefined;\n\n const hasValue = value !== undefined ? value !== '' : defaultValue !== undefined && defaultValue !== '';\n\n if (isFocused || hasValue) {\n return '100%';\n }\n\n return collapsedWidth;\n }, [expandOnFocus, isFocused, value, defaultValue, collapsedWidth]);\n\n return { handleFocus, handleBlur, inputWidth };\n}\n\n/**\n * Hook: useCopyPasteProtection\n * Manages copy/paste prevention with shake animation and screen reader announcements.\n *\n * @param disableCopyPaste - Whether copy/paste should be disabled\n */\nexport function useCopyPasteProtection({\n disableCopyPaste,\n}: {\n disableCopyPaste: boolean;\n}) {\n const [isShaking, setIsShaking] = useState(false);\n const [screenReaderMessage, setScreenReaderMessage] = useState('');\n\n // Development mode warning for disableCopyPaste\n useEffect(() => {\n if (disableCopyPaste && typeof process !== 'undefined' && process.env.NODE_ENV === 'development') {\n console.warn(\n '[TextField] Copy/paste prevention should only be used for security-critical fields like password confirmation. ' +\n 'This feature can break assistive technology workflows and password managers.'\n );\n }\n }, [disableCopyPaste]);\n\n const handlePaste = useCallback((e: ClipboardEvent<HTMLInputElement>) => {\n if (disableCopyPaste) {\n e.preventDefault();\n\n // Trigger shake animation\n setIsShaking(true);\n\n // Announce to screen readers\n setScreenReaderMessage('Pasting is not allowed in this field. Please type your entry.');\n\n // Remove shake animation and clear message after 400ms\n setTimeout(() => {\n setIsShaking(false);\n setScreenReaderMessage('');\n }, 400);\n }\n }, [disableCopyPaste]);\n\n return { isShaking, screenReaderMessage, handlePaste };\n}\n\n/**\n * Hook: usePasswordToggle\n * Manages password show/hide toggle state and determines the actual input type.\n *\n * @param type - The input type ('text', 'email', 'password', etc.)\n * @param showPasswordToggle - Whether the toggle button should be shown\n */\nexport function usePasswordToggle({\n type,\n showPasswordToggle,\n}: {\n type: string;\n showPasswordToggle: boolean | undefined;\n}) {\n const [showPassword, setShowPassword] = useState(false);\n\n const handlePasswordToggle = useCallback(() => {\n setShowPassword(prev => !prev);\n }, []);\n\n const actualType = useMemo(() => {\n if (type === 'password' && showPasswordToggle && showPassword) {\n return 'text';\n }\n return type;\n }, [type, showPasswordToggle, showPassword]);\n\n return { showPassword, actualType, handlePasswordToggle };\n}\n","\"use client\";\n\n/**\n * TextField Component\n * Accessible text input with React Aria primitives and CVA styling\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements - WCAG 2.2 AAA)\n * @see React Aria TextField: https://react-spectrum.adobe.com/react-aria/TextField.html\n * @see ShadCN Input: https://ui.shadcn.com/docs/components/input\n * @see ShadCN Label: https://ui.shadcn.com/docs/components/label\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport './TextField.css';\nimport { forwardRef, useId, useMemo, useState, useCallback } from 'react';\nimport {\n TextField as AriaTextField,\n Label as AriaLabel,\n Input as AriaInput,\n Text as AriaText,\n FieldError as AriaFieldError,\n} from 'react-aria-components';\nimport { cn } from '../../utils/cn';\nimport { DISABLED_STYLES } from '../../styles/interaction-states';\nimport type {\n TextFieldProps,\n TextFieldLabelProps,\n TextFieldInputProps,\n TextFieldDescriptionProps,\n TextFieldErrorProps,\n} from './TextField.types';\nimport { CircleAlert, Search, X } from 'lucide-react';\nimport { Button } from '../Button';\nimport { EyeIcon, EyeOffIcon } from './TextField.icons';\nimport {\n inputVariants,\n labelVariants,\n descriptionVariants,\n errorMessageVariants,\n successMessageVariants,\n} from './TextField.styles';\nimport { useExpandOnFocus, useCopyPasteProtection, usePasswordToggle } from './TextField.hooks';\n\n// Re-export CVA variants so existing imports from './TextField' continue to work\nexport {\n inputVariants,\n labelVariants,\n descriptionVariants,\n errorMessageVariants,\n successMessageVariants,\n};\n\n/**\n * TextFieldLabel Sub-component\n * Styled label with optional required indicator\n */\nexport const TextFieldLabel = forwardRef<HTMLLabelElement, TextFieldLabelProps>(\n ({ className, state = 'default', children, ...props }, ref) => {\n return (\n <AriaLabel\n ref={ref}\n className={cn(labelVariants({ state }), className)}\n {...props}\n >\n {children}\n </AriaLabel>\n );\n }\n);\n\nTextFieldLabel.displayName = \"TextFieldLabel\";\n\n/**\n * TextFieldInput Sub-component\n * Styled input with size and state variants\n */\nexport const TextFieldInput = forwardRef<HTMLInputElement, TextFieldInputProps>(\n ({ className, size = 'default', state = 'default', ...props }, ref) => {\n return (\n <AriaInput\n ref={ref}\n className={cn(inputVariants({ size, state }), DISABLED_STYLES, className)}\n {...props}\n />\n );\n }\n);\n\nTextFieldInput.displayName = \"TextFieldInput\";\n\n/**\n * TextFieldDescription Sub-component\n * Helper text displayed below the input\n */\nexport const TextFieldDescription = forwardRef<HTMLDivElement, TextFieldDescriptionProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <AriaText\n ref={ref}\n slot=\"description\"\n className={cn(descriptionVariants(), className)}\n {...props}\n >\n {children}\n </AriaText>\n );\n }\n);\n\nTextFieldDescription.displayName = \"TextFieldDescription\";\n\n/**\n * TextFieldError Sub-component\n * Error message displayed when field is invalid\n * Note: We use AriaFieldError with explicit role=\"alert\" for screen reader announcements\n */\nexport const TextFieldError = forwardRef<HTMLDivElement, TextFieldErrorProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <AriaFieldError\n ref={ref}\n {...props}\n className={cn(errorMessageVariants(), className)}\n >\n <span className=\"flex items-center gap-2\" role=\"alert\"><CircleAlert className=\"h-4 w-4\" />{children}</span>\n </AriaFieldError>\n );\n }\n);\n\nTextFieldError.displayName = \"TextFieldError\";\n\n/**\n * TextFieldSuccess Sub-component\n * Success message displayed when field is valid\n */\nexport const TextFieldSuccess = forwardRef<HTMLDivElement, TextFieldDescriptionProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <AriaText\n ref={ref}\n slot=\"description\"\n className={cn(successMessageVariants(), className)}\n {...props}\n >\n {children}\n </AriaText>\n );\n }\n);\n\nTextFieldSuccess.displayName = \"TextFieldSuccess\";\n\n/**\n * TextField Component\n * Fully accessible text input with React Aria and themed styling\n *\n * @example\n * <TextField\n * label=\"Email\"\n * description=\"We'll never share your email\"\n * isRequired\n * type=\"email\"\n * />\n */\nexport const TextField = forwardRef<HTMLDivElement, TextFieldProps>(\n (\n {\n className,\n size = 'default',\n label,\n description,\n errorMessage,\n successMessage,\n type = 'text',\n isRequired = false,\n isReadOnly = false,\n isDisabled = false,\n isInvalid = false,\n isValid = false,\n id,\n autoComplete,\n disableCopyPaste = false,\n pattern,\n patternDescription,\n expandOnFocus = false,\n collapsedWidth = '200px',\n prefix,\n suffix,\n prefixSize = 16,\n suffixSize = 16,\n showPasswordToggle,\n isIconHidden = false,\n onSubmit,\n onClear,\n value,\n defaultValue,\n onFocus: userOnFocus,\n onBlur: userOnBlur,\n ...props\n },\n ref\n ) => {\n // Generate unique IDs for error message linking\n const errorId = useId();\n const generatedId = useId();\n const fieldId = id || generatedId;\n\n // Custom hooks for behavioral logic\n const { handleFocus, handleBlur, inputWidth } = useExpandOnFocus({\n expandOnFocus,\n collapsedWidth,\n value,\n defaultValue,\n userOnFocus,\n userOnBlur,\n });\n\n const { isShaking, screenReaderMessage, handlePaste } = useCopyPasteProtection({\n disableCopyPaste,\n });\n\n const { showPassword, actualType, handlePasswordToggle } = usePasswordToggle({\n type,\n showPasswordToggle,\n });\n\n // ==========================================================================\n // Search functionality (type=\"search\")\n // ==========================================================================\n const isSearch = type === 'search';\n const [searchValue, setSearchValue] = useState(defaultValue ?? '');\n const isControlledSearch = value !== undefined;\n const currentSearchValue = isControlledSearch ? value : searchValue;\n\n const handleSearchChange = useCallback(\n (newValue: string) => {\n if (!isControlledSearch) {\n setSearchValue(newValue);\n }\n (props as { onChange?: (v: string) => void }).onChange?.(newValue);\n },\n [isControlledSearch, props]\n );\n\n const handleSearchClear = useCallback(() => {\n if (!isControlledSearch) {\n setSearchValue('');\n }\n (props as { onChange?: (v: string) => void }).onChange?.('');\n onClear?.();\n }, [isControlledSearch, props, onClear]);\n\n const handleSearchKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onSubmit) {\n onSubmit(currentSearchValue);\n }\n if (e.key === 'Escape' && currentSearchValue) {\n e.preventDefault();\n handleSearchClear();\n }\n },\n [currentSearchValue, onSubmit, handleSearchClear]\n );\n\n // Determine input state based on props\n const inputState = useMemo(() => {\n if (isDisabled) return 'disabled';\n if (isReadOnly) return 'readonly';\n if (isInvalid) return 'error';\n if (isValid) return 'success';\n return 'default';\n }, [isDisabled, isReadOnly, isInvalid, isValid]);\n\n // Determine label state\n const labelState = useMemo(() => {\n if (isDisabled) return 'disabled';\n if (isInvalid) return 'error';\n return 'default';\n }, [isDisabled, isInvalid]);\n\n // Combine description and patternDescription\n const combinedDescription = useMemo(() => {\n if (description && patternDescription) {\n return `${description} ${patternDescription}`;\n }\n return description || patternDescription;\n }, [description, patternDescription]);\n\n // Determine actual prefix (search icon auto-added for type=\"search\")\n const actualPrefix = useMemo(() => {\n if (isSearch && !isIconHidden && !prefix) {\n const iconSize = size === 'sm' ? 'h-3.5 w-3.5' : size === 'lg' ? 'h-5 w-5' : 'h-4 w-4';\n return <Search className={iconSize} />;\n }\n return prefix;\n }, [isSearch, isIconHidden, prefix, size]);\n\n // Calculate dynamic padding for prefix/suffix\n const inputPadding = useMemo(() => {\n const basePadding = { left: 12, right: 12 }; // Default px-3 = 12px\n\n if (actualPrefix) {\n const prefixWidth = typeof actualPrefix === 'string'\n ? actualPrefix.length * 8 + 16\n : prefixSize + 16;\n basePadding.left = prefixWidth;\n }\n\n if (type === 'password' && showPasswordToggle) {\n basePadding.right = 16 + 16;\n } else if (isSearch && currentSearchValue) {\n basePadding.right = 44; // Space for clear button\n } else if (suffix) {\n const suffixWidth = typeof suffix === 'string'\n ? suffix.length * 8 + 16\n : suffixSize + 16;\n basePadding.right = suffixWidth;\n }\n\n return basePadding;\n }, [actualPrefix, prefix, suffix, prefixSize, suffixSize, type, showPasswordToggle, isSearch, currentSearchValue]);\n\n // Determine actual suffix (password toggle / search clear / custom suffix)\n const actualSuffix = useMemo(() => {\n if (type === 'password' && showPasswordToggle) {\n return (\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n onPress={handlePasswordToggle}\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n className=\"!min-h-0 !min-w-0 h-8 w-8\"\n >\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </Button>\n );\n }\n if (isSearch && currentSearchValue) {\n const iconSize = size === 'sm' ? 'h-3 w-3' : size === 'lg' ? 'h-5 w-5' : 'h-4 w-4';\n return (\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n onPress={handleSearchClear}\n aria-label=\"Clear search\"\n className=\"!min-h-0 !min-w-0 h-8 w-8\"\n >\n <X className={iconSize} />\n </Button>\n );\n }\n return suffix;\n }, [type, showPasswordToggle, showPassword, suffix, handlePasswordToggle, isSearch, currentSearchValue, size, handleSearchClear]);\n\n // Whether the suffix is an interactive button (password toggle or search clear)\n const hasInteractiveSuffix = (type === 'password' && showPasswordToggle) || (isSearch && !!currentSearchValue);\n\n return (\n <AriaTextField\n ref={ref}\n className={cn(\"flex flex-col gap-1.5\", className)}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n value={isSearch ? currentSearchValue : value}\n defaultValue={isSearch ? undefined : defaultValue}\n onChange={isSearch ? handleSearchChange : undefined}\n {...props}\n >\n {/* Label with required indicator */}\n {label && (\n <AriaLabel className={cn(labelVariants({ state: labelState }))}>\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive-background)]\" aria-hidden=\"true\">\n <strong>*</strong>\n </span>\n )}\n </AriaLabel>\n )}\n\n {/* Description text (helper text) */}\n {combinedDescription && (\n <AriaText slot=\"description\" className={cn(descriptionVariants())}>\n {combinedDescription}\n </AriaText>\n )}\n\n {/* Input field with prefix/suffix */}\n <div\n className=\"relative flex items-center motion-safe:transition-all motion-safe:duration-200\"\n style={{\n width: inputWidth,\n }}\n >\n {/* Prefix */}\n {actualPrefix && (\n <div\n data-testid=\"textfield-prefix\"\n className=\"absolute left-3 flex items-center justify-center pointer-events-none text-[var(--content-foreground)]\"\n aria-hidden=\"true\"\n >\n {actualPrefix}\n </div>\n )}\n\n {/* Input */}\n <AriaInput\n type={actualType}\n id={fieldId}\n className={cn(\n inputVariants({ size, state: inputState }),\n DISABLED_STYLES,\n isShaking && 'shake'\n )}\n style={{\n width: '100%',\n paddingLeft: `${inputPadding.left}px`,\n paddingRight: `${inputPadding.right}px`,\n }}\n autoComplete={autoComplete}\n pattern={pattern}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={isSearch ? handleSearchKeyDown : undefined}\n aria-required={isRequired ? 'true' : undefined}\n aria-readonly={isReadOnly ? 'true' : undefined}\n aria-errormessage={isInvalid && errorMessage ? errorId : undefined}\n />\n\n {/* Suffix */}\n {actualSuffix && (\n <div\n data-testid=\"textfield-suffix\"\n className={cn(\n \"absolute right-3 flex items-center justify-center text-[var(--content-foreground)]\",\n hasInteractiveSuffix ? \"\" : \"pointer-events-none\"\n )}\n aria-hidden={hasInteractiveSuffix ? undefined : \"true\"}\n >\n {actualSuffix}\n </div>\n )}\n </div>\n\n {/* Success message (shown when valid) */}\n {isValid && successMessage && !isInvalid && (\n <AriaText slot=\"description\" className={cn(successMessageVariants())}>\n {successMessage}\n </AriaText>\n )}\n\n {/* Error message (shown when invalid) - takes precedence over success */}\n {isInvalid && errorMessage && (\n <TextFieldError id={errorId}>\n {errorMessage}\n </TextFieldError>\n )}\n\n {/* Screen reader announcement for paste prevention */}\n {screenReaderMessage && (\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {screenReaderMessage}\n </div>\n )}\n </AriaTextField>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport { inputVariants as textFieldInputVariants, labelVariants as textFieldLabelVariants };\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport type { ReactNode } from 'react';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type {\n TextFieldProps as AriaTextFieldProps,\n LabelProps as AriaLabelProps,\n InputProps as AriaInputProps,\n TextProps as AriaTextProps,\n} from 'react-aria-components';\n\n/**\n * AutoComplete values from MDN spec\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete\n */\nexport const AutoCompleteValue = z.enum([\n // Control tokens\n 'off',\n 'on',\n // Name-related\n 'name',\n 'honorific-prefix',\n 'given-name',\n 'additional-name',\n 'family-name',\n 'honorific-suffix',\n 'nickname',\n // Contact\n 'email',\n 'username',\n // Authentication\n 'new-password',\n 'current-password',\n 'one-time-code',\n // Organization\n 'organization-title',\n 'organization',\n // Address\n 'street-address',\n 'address-line1',\n 'address-line2',\n 'address-line3',\n 'address-level4',\n 'address-level3',\n 'address-level2',\n 'address-level1',\n 'country',\n 'country-name',\n 'postal-code',\n // Payment\n 'cc-name',\n 'cc-given-name',\n 'cc-additional-name',\n 'cc-family-name',\n 'cc-number',\n 'cc-exp',\n 'cc-exp-month',\n 'cc-exp-year',\n 'cc-csc',\n 'cc-type',\n // Transaction\n 'transaction-currency',\n 'transaction-amount',\n // Personal\n 'language',\n 'bday',\n 'bday-day',\n 'bday-month',\n 'bday-year',\n 'sex',\n // Telephone\n 'tel',\n 'tel-country-code',\n 'tel-national',\n 'tel-area-code',\n 'tel-local',\n 'tel-extension',\n // Other\n 'impp',\n 'url',\n 'photo',\n]);\n\nexport type AutoCompleteValueType = z.infer<typeof AutoCompleteValue>;\n\n/**\n * Dangerous regex patterns that can cause ReDoS attacks\n * @see DECISIONS.md Decision 21\n */\nconst DANGEROUS_REGEX_PATTERNS = [\n /\\(\\.\\*\\)\\+/, // Catastrophic backtracking: (.*)+\n /\\(\\.\\+\\)\\+/, // Catastrophic backtracking: (.+)+\n /\\([^)]*\\)\\{.*,.*\\}/, // Excessive quantifiers: (x){10,1000}\n /\\(\\?!\\)/, // Negative lookahead (can be slow)\n /\\(\\?<=\\)/, // Positive lookbehind (can be slow)\n];\n\n/**\n * Validates regex pattern for ReDoS safety\n * @param pattern - Regular expression pattern string\n * @returns true if pattern is safe, false if potentially dangerous\n */\nexport const validatePatternSafety = (pattern: string): boolean => {\n // Check for known dangerous patterns\n for (const dangerous of DANGEROUS_REGEX_PATTERNS) {\n if (dangerous.test(pattern)) {\n return false;\n }\n }\n\n // Check for excessive nested quantifiers\n const quantifierCount = (pattern.match(/[*+{}]/g) || []).length;\n if (quantifierCount > 5) {\n return false;\n }\n\n return true;\n};\n\n/**\n * TextField props schema extending BaseComponentProps\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements - WCAG 2.2 AAA)\n * @see React Aria TextField: https://react-spectrum.adobe.com/react-aria/TextField.html\n * @see ShadCN Input: https://ui.shadcn.com/docs/components/input\n * @see ShadCN Label: https://ui.shadcn.com/docs/components/label\n */\nexport const TextFieldPropsSchema = BaseComponentPropsSchema.extend({\n // Size variants (matching Button sizes: sm, default, lg)\n size: z.enum(['sm', 'default', 'lg']).optional().default('default'),\n\n // Text content\n label: z.string().optional(),\n description: z.string().optional(),\n errorMessage: z.string().optional(),\n successMessage: z.string().optional(),\n\n // Input type - BREAKING: removed 'tel' (use TelField component instead)\n // @see DECISIONS.md Decision 14\n type: z\n .enum(['text', 'email', 'password', 'url', 'search'])\n .optional()\n .default('text'),\n\n // State props\n isRequired: z.boolean().optional(),\n isReadOnly: z.boolean().optional(),\n isDisabled: z.boolean().optional(),\n isInvalid: z.boolean().optional(),\n isValid: z.boolean().optional(),\n\n // Input attributes\n placeholder: z.string().optional(),\n value: z.string().optional(),\n defaultValue: z.string().optional(),\n name: z.string().optional(),\n autoFocus: z.boolean().optional(),\n\n // AutoComplete - BREAKING: strict MDN enum instead of string\n // @see DECISIONS.md Decision 13\n autoComplete: AutoCompleteValue.optional(),\n\n maxLength: z.number().optional(),\n minLength: z.number().optional(),\n\n // Pattern validation with security check\n // @see DECISIONS.md Decision 15, 18\n // @warning SECURITY: Only use patterns defined in source code, never from user input\n pattern: z.string().optional(),\n patternDescription: z.string().optional(),\n\n // Feature: Copy/Paste Restriction\n // @see DECISIONS.md Decision 4\n disableCopyPaste: z.boolean().optional().default(false),\n\n // Feature: Prefix/Suffix\n // @see DECISIONS.md Decision 9\n prefix: z.any().optional(), // ReactNode - can't validate with Zod\n suffix: z.any().optional(), // ReactNode - can't validate with Zod\n prefixSize: z.number().optional().default(16),\n suffixSize: z.number().optional().default(16),\n\n // Feature: Expand on Focus\n // @see DECISIONS.md Decision 6, 17\n expandOnFocus: z.boolean().optional().default(false),\n collapsedWidth: z.string().optional().default('200px'),\n\n // Feature: Password Toggle\n // @see DECISIONS.md Decision 8\n showPasswordToggle: z.boolean().optional(),\n\n // Feature: Search (type=\"search\")\n /** Hide the search icon when type=\"search\" */\n isIconHidden: z.boolean().optional().default(false),\n\n /** Called when search is submitted (Enter key). Only applicable when type=\"search\". */\n onSubmit: z.custom<(value: string) => void>().optional(),\n\n /** Called when search is cleared (clear button or Escape key). Only applicable when type=\"search\". */\n onClear: z.custom<() => void>().optional(),\n\n // Event handlers (onChange, onBlur, onFocus inherited from AriaTextFieldProps)\n // Custom validate function added in TypeScript type below (not in Zod schema)\n})\n.refine(\n (data) => !data.pattern || data.patternDescription,\n {\n message: \"patternDescription is required when pattern is provided\",\n path: [\"patternDescription\"]\n }\n)\n.refine(\n (data) => !data.pattern || validatePatternSafety(data.pattern),\n {\n message: \"Unsafe regex pattern detected. Pattern may cause ReDoS vulnerability. Avoid patterns like (.*)+, (.+)+, or excessive quantifiers.\",\n path: [\"pattern\"]\n }\n)\n.refine(\n (data) => !(data.successMessage && data.errorMessage),\n {\n message: \"Cannot provide both successMessage and errorMessage. Use one based on validation state.\",\n path: [\"successMessage\"]\n }\n)\n.refine(\n (data) => {\n // Development mode warning for conflicting validation states\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'development') {\n if (data.isValid && data.isInvalid) {\n console.error('[TextField] Both isValid and isInvalid are true. isInvalid takes precedence.');\n }\n }\n return true;\n }\n);\n\nexport type TextFieldProps = Partial<z.infer<typeof TextFieldPropsSchema>> &\n Omit<AriaTextFieldProps, keyof z.infer<typeof TextFieldPropsSchema>> & {\n // Explicitly type onChange for better IntelliSense\n onChange?: (value: string) => void;\n\n // Custom validation function\n // @see DECISIONS.md Decision 7, 18\n // Pattern validation runs first, then custom validate\n validate?: (value: string) => string | undefined | null;\n\n // Prefix/Suffix with proper typing\n prefix?: ReactNode;\n suffix?: ReactNode;\n };\n\n/**\n * Label props schema for TextField label sub-component\n */\nexport const TextFieldLabelPropsSchema = z.object({\n children: z.any().optional(),\n className: z.string().optional(),\n htmlFor: z.string().optional(),\n state: z.enum(['default', 'error', 'disabled']).optional().default('default'),\n});\n\nexport type TextFieldLabelProps = z.infer<typeof TextFieldLabelPropsSchema> &\n Omit<AriaLabelProps, keyof z.infer<typeof TextFieldLabelPropsSchema>>;\n\n/**\n * Input props schema for TextField input sub-component\n */\nexport const TextFieldInputPropsSchema = z.object({\n className: z.string().optional(),\n size: z.enum(['sm', 'default', 'lg']).optional().default('default'),\n state: z\n .enum(['default', 'error', 'success', 'disabled', 'readonly'])\n .optional()\n .default('default'),\n});\n\nexport type TextFieldInputProps = z.infer<typeof TextFieldInputPropsSchema> &\n Omit<AriaInputProps, keyof z.infer<typeof TextFieldInputPropsSchema>>;\n\n/**\n * Description text props schema for TextField description sub-component\n */\nexport const TextFieldDescriptionPropsSchema = z.object({\n children: z.any().optional(),\n className: z.string().optional(),\n});\n\nexport type TextFieldDescriptionProps = z.infer<typeof TextFieldDescriptionPropsSchema> &\n Omit<AriaTextProps, keyof z.infer<typeof TextFieldDescriptionPropsSchema>>;\n\n/**\n * Error message props schema for TextField error sub-component\n */\nexport const TextFieldErrorPropsSchema = z.object({\n children: z.any().optional(),\n className: z.string().optional(),\n});\n\nexport type TextFieldErrorProps = z.infer<typeof TextFieldErrorPropsSchema> &\n Omit<AriaTextProps, keyof z.infer<typeof TextFieldErrorPropsSchema>>;\n\n/**\n * Success message props schema for TextField success sub-component\n * @see DECISIONS.md Decision 5\n */\nexport const TextFieldSuccessPropsSchema = z.object({\n children: z.any().optional(),\n className: z.string().optional(),\n});\n\nexport type TextFieldSuccessProps = z.infer<typeof TextFieldSuccessPropsSchema> &\n Omit<AriaTextProps, keyof z.infer<typeof TextFieldSuccessPropsSchema>>;\n\n/**\n * CVA variant configuration types\n */\nexport type TextFieldSize = z.infer<typeof TextFieldPropsSchema>['size'];\nexport type InputState = z.infer<typeof TextFieldInputPropsSchema>['state'];\nexport type LabelState = z.infer<typeof TextFieldLabelPropsSchema>['state'];\n"]}