@tribepad/themis 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (482) hide show
  1. package/dist/elements/Accordion/index.js +2 -77
  2. package/dist/elements/Accordion/index.js.map +1 -1
  3. package/dist/elements/Accordion/index.mjs +2 -4
  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 +2 -53
  18. package/dist/elements/Avatar/index.js.map +1 -1
  19. package/dist/elements/Avatar/index.mjs +2 -4
  20. package/dist/elements/Avatar/index.mjs.map +1 -1
  21. package/dist/elements/Badge/index.js +2 -42
  22. package/dist/elements/Badge/index.js.map +1 -1
  23. package/dist/elements/Badge/index.mjs +2 -5
  24. package/dist/elements/Badge/index.mjs.map +1 -1
  25. package/dist/elements/Breadcrumbs/index.js +2 -53
  26. package/dist/elements/Breadcrumbs/index.js.map +1 -1
  27. package/dist/elements/Breadcrumbs/index.mjs +2 -8
  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 +2 -26
  36. package/dist/elements/Button/index.js.map +1 -1
  37. package/dist/elements/Button/index.mjs +2 -5
  38. package/dist/elements/Button/index.mjs.map +1 -1
  39. package/dist/elements/ButtonGroup/index.js +2 -65
  40. package/dist/elements/ButtonGroup/index.js.map +1 -1
  41. package/dist/elements/ButtonGroup/index.mjs +2 -4
  42. package/dist/elements/ButtonGroup/index.mjs.map +1 -1
  43. package/dist/elements/Card/Card.d.ts.map +1 -1
  44. package/dist/elements/Card/index.js +2 -84
  45. package/dist/elements/Card/index.js.map +1 -1
  46. package/dist/elements/Card/index.mjs +2 -7
  47. package/dist/elements/Card/index.mjs.map +1 -1
  48. package/dist/elements/Carousel/Carousel.d.ts +1 -11
  49. package/dist/elements/Carousel/Carousel.d.ts.map +1 -1
  50. package/dist/elements/Carousel/LazyCarousel.d.ts +1 -1
  51. package/dist/elements/Carousel/LazyCarousel.d.ts.map +1 -1
  52. package/dist/elements/Carousel/index.js +2 -22
  53. package/dist/elements/Carousel/index.js.map +1 -1
  54. package/dist/elements/Carousel/index.mjs +2 -9
  55. package/dist/elements/Carousel/index.mjs.map +1 -1
  56. package/dist/elements/Chart/ChartContext.d.ts.map +1 -1
  57. package/dist/elements/Chart/index.js +2 -46
  58. package/dist/elements/Chart/index.js.map +1 -1
  59. package/dist/elements/Chart/index.mjs +2 -5
  60. package/dist/elements/Chart/index.mjs.map +1 -1
  61. package/dist/elements/Checkbox/index.js +2 -46
  62. package/dist/elements/Checkbox/index.js.map +1 -1
  63. package/dist/elements/Checkbox/index.mjs +2 -5
  64. package/dist/elements/Checkbox/index.mjs.map +1 -1
  65. package/dist/elements/CheckboxGroup/index.js +2 -70
  66. package/dist/elements/CheckboxGroup/index.js.map +1 -1
  67. package/dist/elements/CheckboxGroup/index.mjs +2 -5
  68. package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
  69. package/dist/elements/Combobox/Combobox.d.ts +56 -0
  70. package/dist/elements/Combobox/Combobox.d.ts.map +1 -0
  71. package/dist/elements/Combobox/Combobox.styles.d.ts +29 -0
  72. package/dist/elements/Combobox/Combobox.styles.d.ts.map +1 -0
  73. package/dist/elements/Combobox/Combobox.types.d.ts +67 -0
  74. package/dist/elements/Combobox/Combobox.types.d.ts.map +1 -0
  75. package/dist/elements/Combobox/index.d.ts +20 -0
  76. package/dist/elements/Combobox/index.d.ts.map +1 -0
  77. package/dist/elements/Combobox/index.js +3 -0
  78. package/dist/elements/Combobox/index.js.map +1 -0
  79. package/dist/elements/Combobox/index.mjs +3 -0
  80. package/dist/elements/Combobox/index.mjs.map +1 -0
  81. package/dist/elements/DatePicker/DatePicker.d.ts +1 -1
  82. package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
  83. package/dist/elements/DatePicker/index.js +2 -122
  84. package/dist/elements/DatePicker/index.js.map +1 -1
  85. package/dist/elements/DatePicker/index.mjs +2 -5
  86. package/dist/elements/DatePicker/index.mjs.map +1 -1
  87. package/dist/elements/Dropdown/Dropdown.d.ts +7 -15
  88. package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -1
  89. package/dist/elements/Dropdown/Dropdown.styles.d.ts +22 -0
  90. package/dist/elements/Dropdown/Dropdown.styles.d.ts.map +1 -0
  91. package/dist/elements/Dropdown/index.d.ts +1 -0
  92. package/dist/elements/Dropdown/index.d.ts.map +1 -1
  93. package/dist/elements/Dropdown/index.js +2 -40
  94. package/dist/elements/Dropdown/index.js.map +1 -1
  95. package/dist/elements/Dropdown/index.mjs +2 -3
  96. package/dist/elements/Dropdown/index.mjs.map +1 -1
  97. package/dist/elements/FileField/index.js +2 -137
  98. package/dist/elements/FileField/index.js.map +1 -1
  99. package/dist/elements/FileField/index.mjs +2 -8
  100. package/dist/elements/FileField/index.mjs.map +1 -1
  101. package/dist/elements/FormLayout/index.js +2 -16
  102. package/dist/elements/FormLayout/index.js.map +1 -1
  103. package/dist/elements/FormLayout/index.mjs +2 -3
  104. package/dist/elements/FormLayout/index.mjs.map +1 -1
  105. package/dist/elements/Modal/Modal.d.ts +9 -14
  106. package/dist/elements/Modal/Modal.d.ts.map +1 -1
  107. package/dist/elements/Modal/Modal.styles.d.ts +29 -0
  108. package/dist/elements/Modal/Modal.styles.d.ts.map +1 -0
  109. package/dist/elements/Modal/index.d.ts +1 -0
  110. package/dist/elements/Modal/index.d.ts.map +1 -1
  111. package/dist/elements/Modal/index.js +2 -51
  112. package/dist/elements/Modal/index.js.map +1 -1
  113. package/dist/elements/Modal/index.mjs +2 -2
  114. package/dist/elements/Modal/index.mjs.map +1 -1
  115. package/dist/elements/NumberField/index.js +2 -56
  116. package/dist/elements/NumberField/index.js.map +1 -1
  117. package/dist/elements/NumberField/index.mjs +2 -7
  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 +2 -12
  121. package/dist/elements/OTPInput/index.js.map +1 -1
  122. package/dist/elements/OTPInput/index.mjs +2 -3
  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 +2 -32
  137. package/dist/elements/Panel/index.js.map +1 -1
  138. package/dist/elements/Panel/index.mjs +2 -3
  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 +2 -29
  155. package/dist/elements/Progress/index.js.map +1 -1
  156. package/dist/elements/Progress/index.mjs +2 -4
  157. package/dist/elements/Progress/index.mjs.map +1 -1
  158. package/dist/elements/RadioGroup/index.js +2 -46
  159. package/dist/elements/RadioGroup/index.js.map +1 -1
  160. package/dist/elements/RadioGroup/index.mjs +2 -5
  161. package/dist/elements/RadioGroup/index.mjs.map +1 -1
  162. package/dist/elements/Resizable/components/ResizableHandle.d.ts +0 -8
  163. package/dist/elements/Resizable/components/ResizableHandle.d.ts.map +1 -1
  164. package/dist/elements/Resizable/components/ResizablePanel.d.ts +0 -8
  165. package/dist/elements/Resizable/components/ResizablePanel.d.ts.map +1 -1
  166. package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts +0 -8
  167. package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts.map +1 -1
  168. package/dist/elements/Resizable/components/ResizablePopover.d.ts +0 -8
  169. package/dist/elements/Resizable/components/ResizablePopover.d.ts.map +1 -1
  170. package/dist/elements/Resizable/index.js +2 -64
  171. package/dist/elements/Resizable/index.js.map +1 -1
  172. package/dist/elements/Resizable/index.mjs +2 -7
  173. package/dist/elements/Resizable/index.mjs.map +1 -1
  174. package/dist/elements/SearchField/SearchField.d.ts +27 -0
  175. package/dist/elements/SearchField/SearchField.d.ts.map +1 -0
  176. package/dist/elements/SearchField/SearchField.styles.d.ts +32 -0
  177. package/dist/elements/SearchField/SearchField.styles.d.ts.map +1 -0
  178. package/dist/elements/SearchField/SearchField.types.d.ts +45 -0
  179. package/dist/elements/SearchField/SearchField.types.d.ts.map +1 -0
  180. package/dist/elements/SearchField/index.css +2 -0
  181. package/dist/elements/SearchField/index.css.map +1 -0
  182. package/dist/elements/SearchField/index.d.ts +21 -0
  183. package/dist/elements/SearchField/index.d.ts.map +1 -0
  184. package/dist/elements/SearchField/index.js +3 -0
  185. package/dist/elements/SearchField/index.js.map +1 -0
  186. package/dist/elements/SearchField/index.mjs +3 -0
  187. package/dist/elements/SearchField/index.mjs.map +1 -0
  188. package/dist/elements/Select/Select.d.ts +19 -48
  189. package/dist/elements/Select/Select.d.ts.map +1 -1
  190. package/dist/elements/Select/Select.styles.d.ts +55 -0
  191. package/dist/elements/Select/Select.styles.d.ts.map +1 -0
  192. package/dist/elements/Select/index.js +2 -32
  193. package/dist/elements/Select/index.js.map +1 -1
  194. package/dist/elements/Select/index.mjs +2 -3
  195. package/dist/elements/Select/index.mjs.map +1 -1
  196. package/dist/elements/Skeleton/index.js +2 -21
  197. package/dist/elements/Skeleton/index.js.map +1 -1
  198. package/dist/elements/Skeleton/index.mjs +2 -4
  199. package/dist/elements/Skeleton/index.mjs.map +1 -1
  200. package/dist/elements/Switch/index.js +2 -48
  201. package/dist/elements/Switch/index.js.map +1 -1
  202. package/dist/elements/Switch/index.mjs +2 -30
  203. package/dist/elements/Switch/index.mjs.map +1 -1
  204. package/dist/elements/Table/Table.d.ts +3 -24
  205. package/dist/elements/Table/Table.d.ts.map +1 -1
  206. package/dist/elements/Table/Table.styles.d.ts +24 -0
  207. package/dist/elements/Table/Table.styles.d.ts.map +1 -0
  208. package/dist/elements/Table/index.js +2 -75
  209. package/dist/elements/Table/index.js.map +1 -1
  210. package/dist/elements/Table/index.mjs +2 -6
  211. package/dist/elements/Table/index.mjs.map +1 -1
  212. package/dist/elements/Tabs/index.js +2 -73
  213. package/dist/elements/Tabs/index.js.map +1 -1
  214. package/dist/elements/Tabs/index.mjs +2 -4
  215. package/dist/elements/Tabs/index.mjs.map +1 -1
  216. package/dist/elements/TextField/TextField.d.ts +6 -42
  217. package/dist/elements/TextField/TextField.d.ts.map +1 -1
  218. package/dist/elements/TextField/TextField.hooks.d.ts +63 -0
  219. package/dist/elements/TextField/TextField.hooks.d.ts.map +1 -0
  220. package/dist/elements/TextField/TextField.icons.d.ts +19 -0
  221. package/dist/elements/TextField/TextField.icons.d.ts.map +1 -0
  222. package/dist/elements/TextField/TextField.styles.d.ts +37 -0
  223. package/dist/elements/TextField/TextField.styles.d.ts.map +1 -0
  224. package/dist/elements/TextField/TextField.types.d.ts +3 -0
  225. package/dist/elements/TextField/TextField.types.d.ts.map +1 -1
  226. package/dist/elements/TextField/index.css +1 -22
  227. package/dist/elements/TextField/index.css.map +1 -1
  228. package/dist/elements/TextField/index.js +2 -259
  229. package/dist/elements/TextField/index.js.map +1 -1
  230. package/dist/elements/TextField/index.mjs +2 -206
  231. package/dist/elements/TextField/index.mjs.map +1 -1
  232. package/dist/elements/TimeField/index.js +2 -44
  233. package/dist/elements/TimeField/index.js.map +1 -1
  234. package/dist/elements/TimeField/index.mjs +2 -3
  235. package/dist/elements/TimeField/index.mjs.map +1 -1
  236. package/dist/elements/Toast/Toast.d.ts +0 -22
  237. package/dist/elements/Toast/Toast.d.ts.map +1 -1
  238. package/dist/elements/Toast/index.js +2 -59
  239. package/dist/elements/Toast/index.js.map +1 -1
  240. package/dist/elements/Toast/index.mjs +2 -6
  241. package/dist/elements/Toast/index.mjs.map +1 -1
  242. package/dist/elements/Tooltip/index.js +2 -58
  243. package/dist/elements/Tooltip/index.js.map +1 -1
  244. package/dist/elements/Tooltip/index.mjs +2 -5
  245. package/dist/elements/Tooltip/index.mjs.map +1 -1
  246. package/dist/elements/index.css +1 -22
  247. package/dist/elements/index.css.map +1 -1
  248. package/dist/elements/index.d.ts +13 -1
  249. package/dist/elements/index.d.ts.map +1 -1
  250. package/dist/elements/index.js +2 -838
  251. package/dist/elements/index.js.map +1 -1
  252. package/dist/elements/index.mjs +2 -41
  253. package/dist/elements/index.mjs.map +1 -1
  254. package/dist/index.css +1 -22
  255. package/dist/index.css.map +1 -1
  256. package/dist/index.js +3 -864
  257. package/dist/index.js.map +1 -1
  258. package/dist/index.mjs +3 -43
  259. package/dist/index.mjs.map +1 -1
  260. package/dist/schemas/index.js +2 -28
  261. package/dist/schemas/index.js.map +1 -1
  262. package/dist/schemas/index.mjs +2 -3
  263. package/dist/schemas/index.mjs.map +1 -1
  264. package/dist/styles/defaults.css +151 -0
  265. package/dist/styles/index.js +1 -152
  266. package/dist/styles/index.js.map +1 -1
  267. package/dist/styles/index.mjs +1 -3
  268. package/dist/styles/index.mjs.map +1 -1
  269. package/dist/utils/index.js +1 -12
  270. package/dist/utils/index.js.map +1 -1
  271. package/dist/utils/index.mjs +1 -3
  272. package/dist/utils/index.mjs.map +1 -1
  273. package/package.json +9 -7
  274. package/src/elements/Accordion/Accordion.stories.tsx +1 -1
  275. package/src/elements/AlertDialog/AlertDialog.stories.tsx +124 -0
  276. package/src/elements/Avatar/Avatar.stories.tsx +1 -1
  277. package/src/elements/Badge/Badge.stories.tsx +1 -1
  278. package/src/elements/Breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  279. package/src/elements/Button/Button.stories.tsx +1 -1
  280. package/src/elements/ButtonGroup/ButtonGroup.stories.tsx +1 -1
  281. package/src/elements/Card/Card.stories.tsx +1 -1
  282. package/src/elements/Carousel/Carousel.stories.tsx +1 -1
  283. package/src/elements/Chart/Chart.stories.tsx +1 -1
  284. package/src/elements/Checkbox/Checkbox.stories.tsx +1 -1
  285. package/src/elements/CheckboxGroup/CheckboxGroup.stories.tsx +1 -1
  286. package/src/elements/Combobox/Combobox.stories.tsx +133 -0
  287. package/src/elements/DatePicker/DatePicker.stories.tsx +1 -1
  288. package/src/elements/Dropdown/Dropdown.stories.tsx +1 -1
  289. package/src/elements/FileField/FileField.stories.tsx +1 -1
  290. package/src/elements/FileField/FileProgress.stories.tsx +1 -1
  291. package/src/elements/FormLayout/FormLayout.stories.tsx +1 -1
  292. package/src/elements/Modal/Modal.stories.tsx +1 -1
  293. package/src/elements/NumberField/NumberField.stories.tsx +1 -1
  294. package/src/elements/OTPInput/OTPInput.stories.tsx +1 -1
  295. package/src/elements/Pagination/Pagination.stories.tsx +203 -0
  296. package/src/elements/Panel/Panel.stories.tsx +1 -1
  297. package/src/elements/PasswordField/PasswordField.stories.tsx +167 -0
  298. package/src/elements/Progress/Progress.stories.tsx +1 -1
  299. package/src/elements/RadioGroup/RadioGroup.stories.tsx +1 -1
  300. package/src/elements/Resizable/Resizable.stories.tsx +1 -1
  301. package/src/elements/SearchField/SearchField.stories.tsx +146 -0
  302. package/src/elements/Select/Select.stories.tsx +1 -1
  303. package/src/elements/Skeleton/Skeleton.stories.tsx +1 -1
  304. package/src/elements/Switch/Switch.stories.tsx +1 -1
  305. package/src/elements/Table/Table.stories.tsx +1 -1
  306. package/src/elements/Tabs/Tabs.stories.tsx +1 -1
  307. package/src/elements/TextField/TextField.stories.tsx +1 -1
  308. package/src/elements/TimeField/TimeField.stories.tsx +1 -1
  309. package/src/elements/Toast/Toast.stories.tsx +1 -1
  310. package/src/elements/Tooltip/Tooltip.stories.tsx +1 -1
  311. package/dist/Carousel-NTZX5TOW.js +0 -16
  312. package/dist/Carousel-NTZX5TOW.js.map +0 -1
  313. package/dist/Carousel-YH3DOQJU.mjs +0 -7
  314. package/dist/Carousel-YH3DOQJU.mjs.map +0 -1
  315. package/dist/chunk-2HIUTHMU.mjs +0 -234
  316. package/dist/chunk-2HIUTHMU.mjs.map +0 -1
  317. package/dist/chunk-34GTFTDO.js +0 -431
  318. package/dist/chunk-34GTFTDO.js.map +0 -1
  319. package/dist/chunk-3H7ASYR7.js +0 -250
  320. package/dist/chunk-3H7ASYR7.js.map +0 -1
  321. package/dist/chunk-3IEN7JOP.js +0 -316
  322. package/dist/chunk-3IEN7JOP.js.map +0 -1
  323. package/dist/chunk-3JHN4GAL.js +0 -326
  324. package/dist/chunk-3JHN4GAL.js.map +0 -1
  325. package/dist/chunk-3MJPASQU.js +0 -232
  326. package/dist/chunk-3MJPASQU.js.map +0 -1
  327. package/dist/chunk-3XD2JUL3.js +0 -572
  328. package/dist/chunk-3XD2JUL3.js.map +0 -1
  329. package/dist/chunk-3YOY2VJ6.js +0 -189
  330. package/dist/chunk-3YOY2VJ6.js.map +0 -1
  331. package/dist/chunk-4DU5JSXB.js +0 -408
  332. package/dist/chunk-4DU5JSXB.js.map +0 -1
  333. package/dist/chunk-4E4E2GSS.js +0 -352
  334. package/dist/chunk-4E4E2GSS.js.map +0 -1
  335. package/dist/chunk-4NHAP4AN.mjs +0 -3
  336. package/dist/chunk-4NHAP4AN.mjs.map +0 -1
  337. package/dist/chunk-4S33J5NY.mjs +0 -415
  338. package/dist/chunk-4S33J5NY.mjs.map +0 -1
  339. package/dist/chunk-5SMGRT3G.mjs +0 -354
  340. package/dist/chunk-5SMGRT3G.mjs.map +0 -1
  341. package/dist/chunk-5SVLJN2C.mjs +0 -22
  342. package/dist/chunk-5SVLJN2C.mjs.map +0 -1
  343. package/dist/chunk-66WTU4EB.mjs +0 -299
  344. package/dist/chunk-66WTU4EB.mjs.map +0 -1
  345. package/dist/chunk-6S25NMOT.mjs +0 -335
  346. package/dist/chunk-6S25NMOT.mjs.map +0 -1
  347. package/dist/chunk-6SP7UB3D.js +0 -4
  348. package/dist/chunk-6SP7UB3D.js.map +0 -1
  349. package/dist/chunk-6TYWWQHM.mjs +0 -565
  350. package/dist/chunk-6TYWWQHM.mjs.map +0 -1
  351. package/dist/chunk-A3YUJA6W.mjs +0 -384
  352. package/dist/chunk-A3YUJA6W.mjs.map +0 -1
  353. package/dist/chunk-A6KEDVUR.js +0 -61
  354. package/dist/chunk-A6KEDVUR.js.map +0 -1
  355. package/dist/chunk-A77RUEWL.js +0 -730
  356. package/dist/chunk-A77RUEWL.js.map +0 -1
  357. package/dist/chunk-AA4IKMPE.mjs +0 -3
  358. package/dist/chunk-AA4IKMPE.mjs.map +0 -1
  359. package/dist/chunk-AKIA6GW6.mjs +0 -163
  360. package/dist/chunk-AKIA6GW6.mjs.map +0 -1
  361. package/dist/chunk-AL6P275L.mjs +0 -435
  362. package/dist/chunk-AL6P275L.mjs.map +0 -1
  363. package/dist/chunk-AZ3RJYTB.js +0 -37
  364. package/dist/chunk-AZ3RJYTB.js.map +0 -1
  365. package/dist/chunk-B5Q4UPL6.js +0 -32
  366. package/dist/chunk-B5Q4UPL6.js.map +0 -1
  367. package/dist/chunk-B6DHPMDP.mjs +0 -335
  368. package/dist/chunk-B6DHPMDP.mjs.map +0 -1
  369. package/dist/chunk-BDXKKMBZ.mjs +0 -184
  370. package/dist/chunk-BDXKKMBZ.mjs.map +0 -1
  371. package/dist/chunk-BL6E2DLZ.mjs +0 -52
  372. package/dist/chunk-BL6E2DLZ.mjs.map +0 -1
  373. package/dist/chunk-CGFDS4XS.mjs +0 -121
  374. package/dist/chunk-CGFDS4XS.mjs.map +0 -1
  375. package/dist/chunk-CJIW5TKI.js +0 -139
  376. package/dist/chunk-CJIW5TKI.js.map +0 -1
  377. package/dist/chunk-CKNISJOQ.js +0 -314
  378. package/dist/chunk-CKNISJOQ.js.map +0 -1
  379. package/dist/chunk-D6CBOECS.mjs +0 -1757
  380. package/dist/chunk-D6CBOECS.mjs.map +0 -1
  381. package/dist/chunk-DDWEVC2S.js +0 -166
  382. package/dist/chunk-DDWEVC2S.js.map +0 -1
  383. package/dist/chunk-DZ556D2F.mjs +0 -176
  384. package/dist/chunk-DZ556D2F.mjs.map +0 -1
  385. package/dist/chunk-E2KQFV3O.mjs +0 -10
  386. package/dist/chunk-E2KQFV3O.mjs.map +0 -1
  387. package/dist/chunk-EMMLADSC.js +0 -126
  388. package/dist/chunk-EMMLADSC.js.map +0 -1
  389. package/dist/chunk-EP4WOI5D.mjs +0 -926
  390. package/dist/chunk-EP4WOI5D.mjs.map +0 -1
  391. package/dist/chunk-FJRXLJC2.mjs +0 -160
  392. package/dist/chunk-FJRXLJC2.mjs.map +0 -1
  393. package/dist/chunk-FKQI434R.js +0 -345
  394. package/dist/chunk-FKQI434R.js.map +0 -1
  395. package/dist/chunk-FPKEAJRZ.mjs +0 -100
  396. package/dist/chunk-FPKEAJRZ.mjs.map +0 -1
  397. package/dist/chunk-FWQYB22U.js +0 -183
  398. package/dist/chunk-FWQYB22U.js.map +0 -1
  399. package/dist/chunk-GD5GHTMA.js +0 -189
  400. package/dist/chunk-GD5GHTMA.js.map +0 -1
  401. package/dist/chunk-GE5XTSDZ.js +0 -447
  402. package/dist/chunk-GE5XTSDZ.js.map +0 -1
  403. package/dist/chunk-GVE47ZAX.mjs +0 -32
  404. package/dist/chunk-GVE47ZAX.mjs.map +0 -1
  405. package/dist/chunk-HK46BT5U.mjs +0 -18
  406. package/dist/chunk-HK46BT5U.mjs.map +0 -1
  407. package/dist/chunk-HQVRMR6N.js +0 -365
  408. package/dist/chunk-HQVRMR6N.js.map +0 -1
  409. package/dist/chunk-HSGBJPJO.mjs +0 -398
  410. package/dist/chunk-HSGBJPJO.mjs.map +0 -1
  411. package/dist/chunk-I3AUTOMZ.mjs +0 -125
  412. package/dist/chunk-I3AUTOMZ.mjs.map +0 -1
  413. package/dist/chunk-IEI5LD5C.mjs +0 -1161
  414. package/dist/chunk-IEI5LD5C.mjs.map +0 -1
  415. package/dist/chunk-IIPTC2X7.mjs +0 -118
  416. package/dist/chunk-IIPTC2X7.mjs.map +0 -1
  417. package/dist/chunk-J7TLHF2Q.js +0 -4
  418. package/dist/chunk-J7TLHF2Q.js.map +0 -1
  419. package/dist/chunk-JJOWXFXQ.mjs +0 -765
  420. package/dist/chunk-JJOWXFXQ.mjs.map +0 -1
  421. package/dist/chunk-JPTSS2OA.mjs +0 -3
  422. package/dist/chunk-JPTSS2OA.mjs.map +0 -1
  423. package/dist/chunk-KFXXRLTP.js +0 -396
  424. package/dist/chunk-KFXXRLTP.js.map +0 -1
  425. package/dist/chunk-KPRRBSG6.mjs +0 -272
  426. package/dist/chunk-KPRRBSG6.mjs.map +0 -1
  427. package/dist/chunk-NFSBGRDB.mjs +0 -57
  428. package/dist/chunk-NFSBGRDB.mjs.map +0 -1
  429. package/dist/chunk-NGJVCFTM.js +0 -219
  430. package/dist/chunk-NGJVCFTM.js.map +0 -1
  431. package/dist/chunk-NSQ6MZJ6.mjs +0 -728
  432. package/dist/chunk-NSQ6MZJ6.mjs.map +0 -1
  433. package/dist/chunk-NYQYHT76.mjs +0 -296
  434. package/dist/chunk-NYQYHT76.mjs.map +0 -1
  435. package/dist/chunk-OLJJGI5B.js +0 -1193
  436. package/dist/chunk-OLJJGI5B.js.map +0 -1
  437. package/dist/chunk-Q3572X2J.js +0 -292
  438. package/dist/chunk-Q3572X2J.js.map +0 -1
  439. package/dist/chunk-QH7N7D4I.mjs +0 -210
  440. package/dist/chunk-QH7N7D4I.mjs.map +0 -1
  441. package/dist/chunk-R7XUIV25.js +0 -466
  442. package/dist/chunk-R7XUIV25.js.map +0 -1
  443. package/dist/chunk-RFFO4KPM.js +0 -135
  444. package/dist/chunk-RFFO4KPM.js.map +0 -1
  445. package/dist/chunk-RFX7QKA7.mjs +0 -180
  446. package/dist/chunk-RFX7QKA7.mjs.map +0 -1
  447. package/dist/chunk-SN5LFAP3.js +0 -940
  448. package/dist/chunk-SN5LFAP3.js.map +0 -1
  449. package/dist/chunk-T4COXKQ3.js +0 -24
  450. package/dist/chunk-T4COXKQ3.js.map +0 -1
  451. package/dist/chunk-TS54QM27.js +0 -125
  452. package/dist/chunk-TS54QM27.js.map +0 -1
  453. package/dist/chunk-UE2S4PCX.mjs +0 -220
  454. package/dist/chunk-UE2S4PCX.mjs.map +0 -1
  455. package/dist/chunk-UTW3QX2A.mjs +0 -282
  456. package/dist/chunk-UTW3QX2A.mjs.map +0 -1
  457. package/dist/chunk-V74LGMAE.js +0 -1767
  458. package/dist/chunk-V74LGMAE.js.map +0 -1
  459. package/dist/chunk-VIREG536.js +0 -12
  460. package/dist/chunk-VIREG536.js.map +0 -1
  461. package/dist/chunk-VY7M7346.js +0 -4
  462. package/dist/chunk-VY7M7346.js.map +0 -1
  463. package/dist/chunk-W3TJOO7H.mjs +0 -319
  464. package/dist/chunk-W3TJOO7H.mjs.map +0 -1
  465. package/dist/chunk-WIUOB36M.js +0 -54
  466. package/dist/chunk-WIUOB36M.js.map +0 -1
  467. package/dist/chunk-WJGLM4CY.js +0 -291
  468. package/dist/chunk-WJGLM4CY.js.map +0 -1
  469. package/dist/chunk-WNURH5OO.mjs +0 -453
  470. package/dist/chunk-WNURH5OO.mjs.map +0 -1
  471. package/dist/chunk-X25TNRSD.mjs +0 -364
  472. package/dist/chunk-X25TNRSD.mjs.map +0 -1
  473. package/dist/chunk-Y3GT7ETK.js +0 -108
  474. package/dist/chunk-Y3GT7ETK.js.map +0 -1
  475. package/dist/chunk-Z4FRNOF6.mjs +0 -115
  476. package/dist/chunk-Z4FRNOF6.mjs.map +0 -1
  477. package/dist/chunk-ZMYLD3BN.js +0 -166
  478. package/dist/chunk-ZMYLD3BN.js.map +0 -1
  479. package/dist/chunk-ZP2KV6EX.js +0 -815
  480. package/dist/chunk-ZP2KV6EX.js.map +0 -1
  481. package/dist/chunk-ZVKXFELU.js +0 -366
  482. package/dist/chunk-ZVKXFELU.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Button/Button.styles.ts","../../../src/styles/interaction-states.ts","../../../src/elements/ButtonGroup/ButtonGroupContext.tsx","../../../src/elements/ButtonGroup/ButtonGroup.variants.ts","../../../src/elements/Button/Button.tsx","../../../src/styles/shared-variants.ts","../../../src/elements/FileField/FileField.variants.ts","../../../src/elements/FileField/utils.ts","../../../src/elements/FileField/useFilePreview.ts","../../../src/elements/FileField/FilePreview.tsx","../../../src/elements/FileField/FileProgress.variants.ts","../../../src/elements/FileField/FileProgress.tsx","../../../src/elements/FileField/FileField.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/FileField/FileField.types.ts"],"names":["cn","inputs","twMerge","clsx","buttonOuterVariants","cva","buttonVisualVariants","PRESSED_STYLES","HOVER_STYLES","HIGH_CONTRAST_HOVER","HIGH_CONTRAST_PRESSED","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","FOCUS_WITHIN_RING","FOCUS_VISIBLE_RING","DISABLED_STANDARD","TEXT_SIZE_SMALL_SCALE","TEXT_SIZE_MEDIUM_SCALE","TOUCH_TARGET_MIN","ERROR_MESSAGE_BASE","SUCCESS_MESSAGE_BASE","DESCRIPTION_BASE","LABEL_BASE","TRANSITION_COLORS","combineStyles","styles","s","fileFieldContainerVariants","fileFieldDropZoneVariants","fileFieldTriggerVariants","fileFieldListVariants","fileFieldListHeaderVariants","fileFieldItemVariants","fileFieldRemoveButtonVariants","fileFieldErrorVariants","fileFieldSuccessVariants","fileFieldDescriptionVariants","fileFieldLabelVariants","formatFileSize","bytes","k","sizes","truncateFileName","name","maxLength","lastDotIndex","ext","base","availableLength","isFileTypeAccepted","file","acceptedTypes","type","category","getFileIcon","deduplicateFiles","existing","incoming","result","existingIndex","f","formatAcceptedTypes","RESIZE_THRESHOLD","isImageFile","createResizedPreview","maxDimension","resolve","reject","img","objectUrl","scale","width","height","canvas","ctx","blob","generatePreview","useFilePreview","options","enabled","maxBytes","preview","setPreview","useState","isLoading","setIsLoading","error","setError","isImage","useEffect","isActive","err","prev","FilePreview","renderPreview","sizeStyles","iconType","IconComponent","getIconForType","iconSize","ImageIcon","VideoIcon","AudioLines","FileIcon","fileProgressVariants","fileProgressTrackVariants","fileProgressBarVariants","fileProgressHeaderVariants","fileProgressErrorVariants","fileProgressRetryVariants","getStatusText","status","progress","FileProgress","onRetry","isIndeterminate","errorId","statusText","ProgressBar","percentage","valueText","FileField","label","acceptedFileTypes","allowsMultiple","maxFileSize","maxFiles","description","errorMessage","successMessage","triggerText","isRequired","isInvalid","isValid","id","value","onChange","validate","showPreviews","previewSize","maxPreviewBytes","showProgress","uploadProgress","uploadStatus","uploadErrors","dataTestId","_ariaLabel","_ariaLabelledBy","ariaDescribedBy","generatedId","fieldId","labelId","descriptionId","isDragOver","setIsDragOver","internalError","setInternalError","dragCounterRef","useRef","displayError","hasError","describedByParts","describedBy","validateFiles","useCallback","files","existingFiles","validFiles","errors","processFiles","fileList","newFiles","valid","customError","finalFiles","handleSelect","handleRemove","fileToRemove","handleClearAll","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","getIconComponent","acceptString","FileTrigger","Upload","index","effectivePreviewSize","fileStatus","fileProgress","fileError","showProgressForFile","X","BaseComponentPropsSchema","z","FileFieldPropsSchema","data"],"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","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","/**\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 } 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 * Shared CVA Variant Utilities\n *\n * Common patterns extracted from component variants for consistency and reduced bundle size.\n * Use these constants in CVA definitions to ensure consistent styling across Themis.\n *\n * @see interaction-states.ts for interaction-specific styles (focus, hover, pressed)\n */\n\n// =============================================================================\n// Focus Ring Patterns\n// =============================================================================\n\n/**\n * Focus-within ring (for container elements with focusable children)\n * Use when the container should show focus when any child is focused\n */\nexport const FOCUS_WITHIN_RING = [\n 'focus-within:outline-none',\n 'focus-within:ring-2',\n 'focus-within:ring-[var(--ring)]',\n 'focus-within:ring-offset-2',\n] as const;\n\n/**\n * Focus-visible ring (for directly focusable elements)\n * Use for buttons, inputs, and other interactive elements\n */\nexport const FOCUS_VISIBLE_RING = [\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n] as const;\n\n/**\n * Standard focus ring (for elements using :focus pseudo-class)\n * Prefer focus-visible when possible for better UX\n */\nexport const FOCUS_RING = [\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-[var(--ring)]',\n] as const;\n\n/**\n * Focus with background change (for segments, cells, menu items)\n */\nexport const FOCUS_HIGHLIGHT = [\n 'focus:outline-none',\n 'focus:bg-[var(--accent)]',\n 'focus:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Disabled State Patterns\n// =============================================================================\n\n/**\n * Standard disabled state using disabled attribute\n */\nexport const DISABLED_STANDARD = [\n 'disabled:pointer-events-none',\n 'disabled:opacity-50',\n] as const;\n\n/**\n * Disabled state using data attribute (React Aria pattern)\n */\nexport const DISABLED_DATA_ATTR = [\n 'data-[disabled]:pointer-events-none',\n 'data-[disabled]:opacity-50',\n 'data-[disabled]:cursor-not-allowed',\n] as const;\n\n// =============================================================================\n// Size-Based Text Variants\n// =============================================================================\n\n/**\n * Small text size scale (xs -> sm -> base)\n */\nexport const TEXT_SIZE_SMALL_SCALE = {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n} as const;\n\n/**\n * Medium text size scale (sm -> base -> lg)\n */\nexport const TEXT_SIZE_MEDIUM_SCALE = {\n sm: 'text-sm',\n default: 'text-base',\n lg: 'text-lg',\n} as const;\n\n// =============================================================================\n// Touch Target Utilities\n// =============================================================================\n\n/**\n * WCAG 2.2 AAA minimum touch target (44x44px)\n */\nexport const TOUCH_TARGET_MIN = [\n 'min-h-[44px]',\n 'min-w-[44px]',\n] as const;\n\n/**\n * Common button/cell sizes with touch target compliance\n */\nexport const INTERACTIVE_SIZES = {\n sm: 'h-9 w-9', // 36px - desktop only, NOT AAA compliant\n default: 'h-11 w-11', // 44px - AAA compliant\n lg: 'h-14 w-14', // 56px - AAA compliant, enhanced\n} as const;\n\n/**\n * Height-only sizes for fields and inputs\n */\nexport const FIELD_HEIGHTS = {\n sm: 'h-9', // 36px\n default: 'h-11', // 44px\n lg: 'h-14', // 56px\n} as const;\n\n// =============================================================================\n// Message/Feedback Patterns\n// =============================================================================\n\n/**\n * Error message styling\n */\nexport const ERROR_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--destructive)]',\n] as const;\n\n/**\n * Success message styling\n */\nexport const SUCCESS_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--success)]',\n] as const;\n\n/**\n * Description/helper text styling\n */\nexport const DESCRIPTION_BASE = [\n 'text-[var(--menu-muted)]',\n] as const;\n\n/**\n * Label base styling\n */\nexport const LABEL_BASE = [\n 'font-medium',\n 'text-[var(--content-foreground)]',\n] as const;\n\n/**\n * Required indicator pattern\n */\nexport const REQUIRED_INDICATOR = \"after:content-['*'] after:ml-0.5 after:text-[var(--destructive)]\";\n\n// =============================================================================\n// Animation Patterns\n// =============================================================================\n\n/**\n * Popover/dropdown entry animation\n */\nexport const POPOVER_ANIMATION_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n] as const;\n\n/**\n * Popover/dropdown exit animation\n */\nexport const POPOVER_ANIMATION_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n] as const;\n\n/**\n * Reduced motion support (WCAG 2.2)\n */\nexport const REDUCED_MOTION = [\n 'motion-reduce:transition-none',\n 'motion-reduce:animate-none',\n] as const;\n\n/**\n * Standard transition for colors\n */\nexport const TRANSITION_COLORS = [\n 'transition-colors',\n 'duration-200',\n] as const;\n\n/**\n * Fast transition for interactions\n */\nexport const TRANSITION_FAST = [\n 'transition-colors',\n 'duration-150',\n] as const;\n\n// =============================================================================\n// Hover State Patterns\n// =============================================================================\n\n/**\n * Accent background on hover (for interactive items)\n */\nexport const HOVER_ACCENT = [\n 'hover:bg-[var(--accent)]',\n 'hover:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Combines multiple style arrays into a flat array for CVA base styles\n */\nexport function combineStyles(...styles: (readonly string[] | string)[]): string[] {\n return styles.flatMap(s => Array.isArray(s) ? [...s] : [s]);\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport {\n FOCUS_WITHIN_RING,\n FOCUS_VISIBLE_RING,\n DISABLED_STANDARD,\n TEXT_SIZE_SMALL_SCALE,\n TEXT_SIZE_MEDIUM_SCALE,\n TOUCH_TARGET_MIN,\n ERROR_MESSAGE_BASE,\n SUCCESS_MESSAGE_BASE,\n DESCRIPTION_BASE,\n LABEL_BASE,\n TRANSITION_COLORS,\n combineStyles,\n} from '../../styles';\n\n/**\n * FileField CVA Variants\n * Uses shared utilities from styles/ for consistency and reduced bundle size.\n */\n\nexport const fileFieldContainerVariants = cva(\n 'flex flex-col gap-1.5 w-full',\n {\n variants: {\n size: TEXT_SIZE_MEDIUM_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldDropZoneVariants = cva(\n combineStyles(\n 'flex flex-col items-center justify-center rounded-md border-2 border-dashed',\n 'bg-[var(--content-background)] text-[var(--content-foreground)]',\n TRANSITION_COLORS,\n FOCUS_WITHIN_RING\n ),\n {\n variants: {\n size: {\n sm: 'min-h-[100px] p-4 gap-2',\n default: 'min-h-[140px] p-6 gap-3',\n lg: 'min-h-[180px] p-8 gap-4',\n },\n isDragOver: {\n true: 'border-[var(--primary)] bg-[var(--primary)]/5',\n false: 'border-[var(--input)] hover:border-[var(--primary)]/50',\n },\n isInvalid: {\n true: 'border-[var(--destructive)] bg-[var(--destructive)]/5',\n false: '',\n },\n isDisabled: {\n true: 'opacity-50 cursor-not-allowed pointer-events-none',\n false: 'cursor-pointer',\n },\n },\n compoundVariants: [\n {\n isInvalid: true,\n isDragOver: true,\n className: 'border-[var(--destructive)] bg-[var(--destructive)]/5',\n },\n ],\n defaultVariants: {\n size: 'default',\n isDragOver: false,\n isInvalid: false,\n isDisabled: false,\n },\n }\n);\n\nexport const fileFieldTriggerVariants = cva(\n combineStyles(\n 'inline-flex items-center justify-center gap-2 rounded-md font-medium',\n TRANSITION_COLORS,\n TOUCH_TARGET_MIN,\n FOCUS_VISIBLE_RING,\n DISABLED_STANDARD\n ),\n {\n variants: {\n size: {\n sm: 'px-3 py-2 text-xs',\n default: 'px-4 py-2 text-sm',\n lg: 'px-6 py-3 text-base',\n },\n variant: {\n default: 'bg-[var(--primary)] text-[var(--primary-foreground)] hover:bg-[var(--primary)]/90',\n outline: 'border border-[var(--input)] bg-transparent hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]',\n },\n },\n defaultVariants: {\n size: 'default',\n variant: 'default',\n },\n }\n);\n\nexport const fileFieldListVariants = cva(\n 'flex flex-col gap-2 mt-3',\n {\n variants: {\n size: {\n sm: 'gap-1.5',\n default: 'gap-2',\n lg: 'gap-3',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldListHeaderVariants = cva(\n 'flex items-center justify-between mb-1',\n {\n variants: {\n size: TEXT_SIZE_SMALL_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldItemVariants = cva(\n 'flex items-center justify-between gap-3 bg-[var(--accent-background)] rounded-md border border-[var(--border)]',\n {\n variants: {\n size: {\n sm: 'px-2 py-1.5 text-xs',\n default: 'px-3 py-2 text-sm',\n lg: 'px-4 py-3 text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldRemoveButtonVariants = cva(\n combineStyles(\n 'inline-flex items-center justify-center rounded-full',\n TOUCH_TARGET_MIN,\n '-mr-2 -my-1', // Negative margin for visual sizing\n 'text-[var(--menu-muted)] hover:text-[var(--destructive)] hover:bg-[var(--destructive)]/10',\n 'transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]'\n ),\n {\n variants: {\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldErrorVariants = cva(\n combineStyles(ERROR_MESSAGE_BASE, 'font-medium'),\n {\n variants: {\n size: TEXT_SIZE_SMALL_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldSuccessVariants = cva(\n combineStyles(SUCCESS_MESSAGE_BASE, 'font-medium'),\n {\n variants: {\n size: TEXT_SIZE_SMALL_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldDescriptionVariants = cva(\n DESCRIPTION_BASE,\n {\n variants: {\n size: TEXT_SIZE_SMALL_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldLabelVariants = cva(\n LABEL_BASE,\n {\n variants: {\n size: TEXT_SIZE_MEDIUM_SCALE,\n isRequired: {\n true: \"after:content-['*'] after:ml-0.5 after:text-[var(--destructive)]\",\n false: '',\n },\n },\n defaultVariants: {\n size: 'default',\n isRequired: false,\n },\n }\n);\n\n// Export variant prop types for consumers\nexport type FileFieldContainerVariants = VariantProps<\n typeof fileFieldContainerVariants\n>;\nexport type FileFieldDropZoneVariants = VariantProps<\n typeof fileFieldDropZoneVariants\n>;\nexport type FileFieldTriggerVariants = VariantProps<\n typeof fileFieldTriggerVariants\n>;\nexport type FileFieldItemVariants = VariantProps<typeof fileFieldItemVariants>;\nexport type FileFieldErrorVariants = VariantProps<\n typeof fileFieldErrorVariants\n>;\n","/**\n * FileField Utility Functions\n *\n * Helper functions for file validation, formatting, and manipulation\n * @see plan.md Section 3: Helper Utilities\n */\n\n/**\n * Format file size in human-readable format\n *\n * @param bytes - File size in bytes\n * @returns Formatted string like \"1.5 MB\" or \"0 B\"\n *\n * @example\n * formatFileSize(0) // \"0 B\"\n * formatFileSize(1024) // \"1 KB\"\n * formatFileSize(1536) // \"1.5 KB\"\n * formatFileSize(1048576) // \"1 MB\"\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const size = parseFloat((bytes / Math.pow(k, i)).toFixed(1));\n\n // Remove trailing .0\n const formatted = size % 1 === 0 ? size.toFixed(0) : size.toFixed(1);\n\n return `${formatted} ${sizes[i]}`;\n}\n\n/**\n * Truncate filename with ellipsis, preserving extension\n *\n * @param name - Original filename\n * @param maxLength - Maximum total length (default: 30)\n * @returns Truncated filename like \"resume-2024-fi...pdf\"\n *\n * @example\n * truncateFileName(\"resume.pdf\", 30) // \"resume.pdf\"\n * truncateFileName(\"my-very-long-filename-here.pdf\", 20) // \"my-very-long...pdf\"\n */\nexport function truncateFileName(name: string, maxLength: number = 30): string {\n if (name.length <= maxLength) return name;\n\n const lastDotIndex = name.lastIndexOf('.');\n if (lastDotIndex === -1) {\n // No extension - just truncate\n return `${name.slice(0, maxLength - 3)}...`;\n }\n\n const ext = name.slice(lastDotIndex);\n const base = name.slice(0, lastDotIndex);\n\n // Ensure we have at least some characters of the base name\n const availableLength = maxLength - ext.length - 3; // 3 for \"...\"\n if (availableLength < 1) {\n return `...${ext}`;\n }\n\n const truncatedBase = base.slice(0, availableLength);\n return `${truncatedBase}...${ext}`;\n}\n\n/**\n * Check if a file type is accepted based on accepted types array\n *\n * Supports:\n * - MIME type patterns: \"image/*\", \"video/*\"\n * - Exact MIME types: \"application/pdf\"\n * - File extensions: \".pdf\", \".docx\"\n *\n * @param file - File to check\n * @param acceptedTypes - Array of accepted type patterns\n * @returns true if file type is accepted\n *\n * @example\n * isFileTypeAccepted(pdfFile, ['application/pdf']) // true\n * isFileTypeAccepted(jpgFile, ['image/*']) // true\n * isFileTypeAccepted(docFile, ['.doc', '.docx']) // true\n */\nexport function isFileTypeAccepted(\n file: File,\n acceptedTypes?: string[]\n): boolean {\n // If no restrictions, accept all\n if (!acceptedTypes || acceptedTypes.length === 0) return true;\n\n return acceptedTypes.some((type) => {\n // Handle MIME type patterns (e.g., \"image/*\")\n if (type.endsWith('/*')) {\n const category = type.slice(0, -2);\n return file.type.startsWith(`${category}/`);\n }\n\n // Handle exact MIME types (e.g., \"application/pdf\")\n if (type.includes('/')) {\n return file.type === type;\n }\n\n // Handle extensions (e.g., \".pdf\")\n if (type.startsWith('.')) {\n return file.name.toLowerCase().endsWith(type.toLowerCase());\n }\n\n return false;\n });\n}\n\n/**\n * Get appropriate icon type for a file based on MIME type\n *\n * @param file - File to check\n * @returns Icon type identifier\n *\n * @example\n * getFileIcon(imageFile) // \"image\"\n * getFileIcon(pdfFile) // \"file\"\n */\nexport function getFileIcon(\n file: File\n): 'file' | 'image' | 'video' | 'audio' {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n if (file.type.startsWith('audio/')) return 'audio';\n return 'file';\n}\n\n/**\n * Merge file arrays, replacing duplicates by filename\n *\n * Used for append behavior when selecting additional files.\n * Files with the same name are replaced with the newer version.\n *\n * @param existing - Currently selected files\n * @param incoming - Newly selected files to add\n * @returns Merged array with duplicates replaced\n *\n * @example\n * const existing = [file1, file2];\n * const incoming = [file2New, file3];\n * deduplicateFiles(existing, incoming) // [file1, file2New, file3]\n *\n * @see plan.md Decision 8: Duplicate File Handling\n */\nexport function deduplicateFiles(existing: File[], incoming: File[]): File[] {\n const result = [...existing];\n\n for (const file of incoming) {\n const existingIndex = result.findIndex((f) => f.name === file.name);\n if (existingIndex >= 0) {\n // Replace with new version\n result[existingIndex] = file;\n } else {\n result.push(file);\n }\n }\n\n return result;\n}\n\n/**\n * Convert human-readable file types to MIME type display\n * Used for showing accepted types in UI\n *\n * @param acceptedTypes - Array of accepted type patterns\n * @returns Human-readable string\n *\n * @example\n * formatAcceptedTypes(['image/*']) // \"images\"\n * formatAcceptedTypes(['.pdf', '.doc']) // \"PDF, DOC\"\n * formatAcceptedTypes(['application/pdf']) // \"PDF\"\n */\nexport function formatAcceptedTypes(acceptedTypes?: string[]): string {\n if (!acceptedTypes || acceptedTypes.length === 0) return 'any file';\n\n const formatted = acceptedTypes.map((type) => {\n // MIME type patterns\n if (type === 'image/*') return 'images';\n if (type === 'video/*') return 'videos';\n if (type === 'audio/*') return 'audio';\n\n // File extensions\n if (type.startsWith('.')) {\n return type.slice(1).toUpperCase();\n }\n\n // Exact MIME types - extract subtype\n if (type.includes('/')) {\n const parts = type.split('/');\n const subtype = parts[1] ?? type;\n return subtype.toUpperCase();\n }\n\n return type;\n });\n\n return formatted.join(', ');\n}\n\n// ============================================================================\n// Phase 1: Image Preview Utilities\n// ============================================================================\n\n/**\n * Threshold for image resizing (2MB)\n * Images larger than this will be resized before preview to reduce memory usage\n */\nexport const RESIZE_THRESHOLD = 2 * 1024 * 1024;\n\n/**\n * Check if a file is an image based on MIME type or extension\n *\n * @param file - File to check\n * @returns true if file is an image\n *\n * @example\n * isImageFile(jpgFile) // true\n * isImageFile(pdfFile) // false\n */\nexport function isImageFile(file: File): boolean {\n // Check MIME type first (most reliable)\n if (file.type.startsWith('image/')) {\n return true;\n }\n\n // Fallback to extension check for files with missing/incorrect MIME type\n const imageExtensions =\n /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico|avif|heic|heif|tiff|tif)$/i;\n return imageExtensions.test(file.name);\n}\n\n/**\n * Create a resized preview image using canvas\n * Used for large images (>2MB) to reduce memory usage\n *\n * @param file - Image file to resize\n * @param maxDimension - Maximum width or height (default: 200)\n * @returns Promise resolving to resized blob URL\n *\n * @example\n * const previewUrl = await createResizedPreview(largeImage, 200);\n * // Remember to call URL.revokeObjectURL(previewUrl) when done\n */\nexport async function createResizedPreview(\n file: File,\n maxDimension: number = 200\n): Promise<string> {\n return new Promise((resolve, reject) => {\n // Use window.Image for browser environment\n const img = new window.Image();\n const objectUrl = URL.createObjectURL(file);\n\n img.onload = () => {\n // Free original object URL immediately\n URL.revokeObjectURL(objectUrl);\n\n // Calculate scaled dimensions (maintain aspect ratio)\n const scale = Math.min(\n maxDimension / img.width,\n maxDimension / img.height,\n 1 // Don't upscale\n );\n const width = Math.round(img.width * scale);\n const height = Math.round(img.height * scale);\n\n // Draw to canvas at reduced size\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n reject(new Error('Canvas context unavailable'));\n return;\n }\n\n ctx.drawImage(img, 0, 0, width, height);\n\n // Convert to blob URL\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(URL.createObjectURL(blob));\n } else {\n reject(new Error('Failed to create blob'));\n }\n },\n 'image/jpeg',\n 0.8 // Quality for JPEG compression\n );\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(objectUrl);\n reject(new Error('Failed to load image'));\n };\n\n img.src = objectUrl;\n });\n}\n\n/**\n * Generate a preview URL for a file\n * Automatically resizes large images (>2MB) to reduce memory usage\n *\n * @param file - Image file to preview\n * @param maxDimension - Maximum dimension for resized previews (default: 200)\n * @returns Promise resolving to preview blob URL\n *\n * @example\n * const previewUrl = await generatePreview(file, 100);\n * // Remember to call URL.revokeObjectURL(previewUrl) when done\n */\nexport async function generatePreview(\n file: File,\n maxDimension: number = 200\n): Promise<string> {\n if (file.size > RESIZE_THRESHOLD) {\n return createResizedPreview(file, maxDimension);\n }\n return URL.createObjectURL(file);\n}\n","/**\n * useFilePreview Hook\n *\n * Memory-efficient image preview generation with race condition protection\n * @see future-plan.md for architecture details\n */\n\nimport { useState, useEffect } from 'react';\nimport { isImageFile, generatePreview } from './utils';\n\nexport interface UseFilePreviewOptions {\n /** Whether preview generation is enabled */\n enabled?: boolean;\n /** Maximum file size for preview generation in bytes (default: 10MB) */\n maxBytes?: number;\n /** Maximum preview dimension in pixels (default: 200) */\n maxDimension?: number;\n}\n\nexport interface UseFilePreviewResult {\n /** Preview URL (blob URL) - remember to not revoke manually, hook handles cleanup */\n preview: string | null;\n /** Whether preview is currently being generated */\n isLoading: boolean;\n /** Error message if preview generation failed */\n error: string | null;\n /** Whether the file is an image */\n isImage: boolean;\n}\n\n/**\n * Hook for generating memory-efficient image previews\n *\n * Features:\n * - Uses URL.createObjectURL for better memory management\n * - Automatically resizes large images (>2MB) using canvas\n * - Race condition protection for rapid file changes\n * - Automatic cleanup of blob URLs on unmount/file change\n *\n * @param file - File to generate preview for\n * @param options - Preview configuration options\n * @returns Preview state including URL, loading, and error states\n *\n * @example\n * const { preview, isLoading, error, isImage } = useFilePreview(file, {\n * enabled: showPreviews,\n * maxBytes: 10 * 1024 * 1024,\n * maxDimension: 64\n * });\n */\nexport function useFilePreview(\n file: File,\n options: UseFilePreviewOptions = {}\n): UseFilePreviewResult {\n const { enabled = true, maxBytes = 10 * 1024 * 1024, maxDimension = 200 } = options;\n\n const [preview, setPreview] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const isImage = isImageFile(file);\n\n useEffect(() => {\n // Skip if disabled or not an image\n if (!enabled || !isImage) {\n setPreview(null);\n setIsLoading(false);\n setError(null);\n return;\n }\n\n // Skip preview for files exceeding size limit\n if (file.size > maxBytes) {\n setPreview(null);\n setIsLoading(false);\n setError('File too large for preview');\n return;\n }\n\n // Track if effect is still active (prevents race conditions)\n let isActive = true;\n let objectUrl: string | null = null;\n\n const generatePreviewAsync = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n // Generate preview (may resize if file > RESIZE_THRESHOLD)\n objectUrl = await generatePreview(file, maxDimension);\n\n // Only update state if effect is still active\n if (isActive) {\n setPreview(objectUrl);\n setIsLoading(false);\n } else {\n // Cleanup if component unmounted or file changed\n URL.revokeObjectURL(objectUrl);\n }\n } catch (err) {\n if (isActive) {\n setError(err instanceof Error ? err.message : 'Failed to generate preview');\n setIsLoading(false);\n setPreview(null);\n }\n }\n };\n\n generatePreviewAsync();\n\n // Cleanup: mark inactive and revoke object URL\n return () => {\n isActive = false;\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n // Also revoke current preview if it exists\n setPreview((prev) => {\n if (prev) {\n URL.revokeObjectURL(prev);\n }\n return null;\n });\n };\n }, [file, enabled, maxBytes, maxDimension, isImage]);\n\n return { preview, isLoading, error, isImage };\n}\n","\"use client\";\n\n/**\n * FilePreview Component\n *\n * Displays image thumbnail previews for files in the FileField list\n * @see future-plan.md for architecture details\n */\n\nimport { type ReactNode } from 'react';\nimport { FileIcon, ImageIcon, VideoIcon, AudioLines, Loader2 } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useFilePreview } from './useFilePreview';\nimport { getFileIcon } from './utils';\n\nexport interface FilePreviewProps {\n /** File to preview */\n file: File;\n /** Preview size in pixels (width and height) */\n size?: number;\n /** Maximum file size for preview generation */\n maxBytes?: number;\n /** Custom renderer for non-image files */\n renderPreview?: (file: File) => ReactNode;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * FilePreview Component\n *\n * Displays a thumbnail preview for image files, or an appropriate icon for other file types.\n * Includes loading and error states with accessible feedback.\n */\nexport function FilePreview({\n file,\n size = 64,\n maxBytes = 10 * 1024 * 1024,\n renderPreview,\n className,\n}: FilePreviewProps) {\n const { preview, isLoading, error, isImage } = useFilePreview(file, {\n enabled: true,\n maxBytes,\n maxDimension: size * 2, // Generate at 2x for retina displays\n });\n\n // Container size styles\n const sizeStyles = {\n width: size,\n height: size,\n minWidth: size,\n minHeight: size,\n };\n\n // If custom renderer provided and not an image, use it\n if (!isImage && renderPreview) {\n return (\n <div\n className={cn(\n 'flex items-center justify-center rounded-md overflow-hidden',\n 'bg-[var(--accent-background)]',\n className\n )}\n style={sizeStyles}\n >\n {renderPreview(file)}\n </div>\n );\n }\n\n // Loading state\n if (isLoading) {\n return (\n <div\n className={cn(\n 'flex items-center justify-center rounded-md overflow-hidden',\n 'bg-[var(--accent-background)]',\n className\n )}\n style={sizeStyles}\n aria-busy=\"true\"\n aria-label={`Loading preview for ${file.name}`}\n >\n <Loader2\n className=\"h-4 w-4 animate-spin text-[var(--menu-muted)]\"\n aria-hidden=\"true\"\n />\n </div>\n );\n }\n\n // Image preview\n if (isImage && preview && !error) {\n return (\n <div\n className={cn(\n 'flex items-center justify-center rounded-md overflow-hidden',\n 'bg-[var(--accent-background)]',\n className\n )}\n style={sizeStyles}\n >\n <img\n src={preview}\n alt={file.name}\n className=\"w-full h-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n );\n }\n\n // Error state or non-image file: show icon\n const iconType = getFileIcon(file);\n const IconComponent = getIconForType(iconType);\n\n // Calculate icon size (roughly 40% of container)\n const iconSize = Math.max(16, Math.floor(size * 0.4));\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center rounded-md overflow-hidden',\n 'bg-[var(--accent-background)]',\n className\n )}\n style={sizeStyles}\n aria-label={error ? `Preview unavailable for ${file.name}` : undefined}\n >\n <IconComponent\n className=\"text-[var(--menu-muted)]\"\n style={{ width: iconSize, height: iconSize }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n\n/**\n * Get icon component for file type\n */\nfunction getIconForType(\n iconType: 'file' | 'image' | 'video' | 'audio'\n): typeof FileIcon {\n switch (iconType) {\n case 'image':\n return ImageIcon;\n case 'video':\n return VideoIcon;\n case 'audio':\n return AudioLines;\n default:\n return FileIcon;\n }\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * FileProgress CVA Variants\n *\n * Type-safe variant definitions for upload progress component\n * Following Themis styling patterns with CSS variable references\n *\n * @see future-plan.md Section 2: Upload Progress Indication\n * @see constitution.md Principle IV: 7:1 contrast ratio\n */\n\n/**\n * Container variants for the FileProgress wrapper\n * Controls spacing and text sizing\n */\nexport const fileProgressVariants = cva(\n ['flex', 'flex-col', 'gap-1', 'w-full'],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Progress bar track variants (background)\n */\nexport const fileProgressTrackVariants = cva(\n ['rounded-full', 'bg-[var(--accent-background)]', 'overflow-hidden'],\n {\n variants: {\n size: {\n sm: 'h-1.5',\n default: 'h-2',\n lg: 'h-3',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Progress bar fill variants\n * Uses shimmer animation for pending (indeterminate) state\n *\n * WCAG 2.2 AAA: High contrast colors for all states\n */\nexport const fileProgressBarVariants = cva(\n ['h-full', 'rounded-full', 'transition-all', 'duration-300'],\n {\n variants: {\n status: {\n pending: [\n 'bg-gradient-to-r',\n 'from-[var(--menu-muted)]',\n 'via-[var(--accent-background)]',\n 'to-[var(--menu-muted)]',\n 'bg-[length:200%_100%]',\n 'animate-progress-shimmer',\n ],\n uploading: 'bg-[var(--primary)]',\n complete: 'bg-[var(--success)]',\n error: 'bg-[var(--destructive)]',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n }\n);\n\n/**\n * Header row variants (filename + status)\n */\nexport const fileProgressHeaderVariants = cva(\n ['flex', 'items-center', 'justify-between', 'gap-2'],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Error message variants\n */\nexport const fileProgressErrorVariants = cva(\n [\n 'flex',\n 'items-center',\n 'justify-between',\n 'gap-2',\n 'mt-1',\n 'text-[var(--destructive)]',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Retry button variants\n * 44x44px minimum touch target for WCAG 2.2 AAA\n */\nexport const fileProgressRetryVariants = cva(\n [\n 'underline',\n 'hover:no-underline',\n 'min-h-[44px]',\n 'min-w-[44px]',\n 'inline-flex',\n 'items-center',\n 'justify-center',\n // Negative margin to visually appear smaller while maintaining touch target\n '-mr-3',\n '-my-2',\n // Focus styling\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n 'rounded',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// Export variant prop types for consumers\nexport type FileProgressVariants = VariantProps<typeof fileProgressVariants>;\nexport type FileProgressBarVariants = VariantProps<typeof fileProgressBarVariants>;\nexport type FileProgressTrackVariants = VariantProps<typeof fileProgressTrackVariants>;\n","\"use client\";\n\n/**\n * FileProgress Component\n *\n * Accessible upload progress indicator using React Aria ProgressBar\n * WCAG 2.2 AAA compliant with shimmer animation for pending state\n *\n * @see future-plan.md Section 2: Upload Progress Indication\n * @see React Aria ProgressBar: https://react-aria.adobe.com/ProgressBar\n */\n\nimport { ProgressBar, Button } from 'react-aria-components';\nimport { cn } from '../../utils/cn';\nimport { truncateFileName } from './utils';\nimport {\n fileProgressVariants,\n fileProgressTrackVariants,\n fileProgressBarVariants,\n fileProgressHeaderVariants,\n fileProgressErrorVariants,\n fileProgressRetryVariants,\n} from './FileProgress.variants';\n\n/**\n * Upload status for progress indication\n */\nexport type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error';\n\n/**\n * FileProgress component props\n */\nexport interface FileProgressProps {\n /** File being uploaded */\n file: File;\n /** Progress percentage (0-100) */\n progress: number;\n /** Current upload status */\n status: FileProgressStatus;\n /** Error message when status is 'error' */\n error?: string;\n /** Callback when user clicks retry */\n onRetry?: () => void;\n /** Size variant */\n size?: 'sm' | 'default' | 'lg';\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Get status display text\n */\nfunction getStatusText(status: FileProgressStatus, progress: number): string {\n switch (status) {\n case 'pending':\n return 'Waiting...';\n case 'uploading':\n return `${progress}%`;\n case 'complete':\n return 'Complete';\n case 'error':\n return 'Failed';\n }\n}\n\n/**\n * FileProgress Component\n *\n * Displays upload progress for a single file with accessible progress bar,\n * status announcements, and retry functionality for failed uploads.\n */\nfunction FileProgress({\n file,\n progress,\n status,\n error,\n onRetry,\n size = 'default',\n className,\n}: FileProgressProps) {\n const isIndeterminate = status === 'pending';\n const errorId = `progress-error-${file.name.replace(/[^a-zA-Z0-9]/g, '-')}`;\n const statusText = getStatusText(status, progress);\n\n return (\n <div className={cn(fileProgressVariants({ size }), className)}>\n <ProgressBar\n aria-label={file.name}\n value={isIndeterminate ? undefined : progress}\n isIndeterminate={isIndeterminate}\n aria-describedby={status === 'error' && error ? errorId : undefined}\n >\n {({ percentage, valueText }) => (\n <>\n {/* Header: filename + status */}\n <div className={fileProgressHeaderVariants({ size })}>\n <span className=\"truncate\" title={file.name}>\n {truncateFileName(file.name, 30)}\n </span>\n <span className=\"text-[var(--menu-muted)] flex-shrink-0\">\n {status === 'error' ? 'Failed' : valueText ?? statusText}\n </span>\n </div>\n\n {/* Progress bar */}\n <div className={fileProgressTrackVariants({ size })}>\n <div\n className={fileProgressBarVariants({ status })}\n style={{\n width: isIndeterminate ? '100%' : `${percentage ?? 0}%`,\n }}\n />\n </div>\n </>\n )}\n </ProgressBar>\n\n {/* Error message and retry button */}\n {status === 'error' && error && (\n <div\n id={errorId}\n className={fileProgressErrorVariants({ size })}\n >\n <span>{error}</span>\n {onRetry && (\n <Button\n onPress={onRetry}\n className={fileProgressRetryVariants({ size })}\n >\n Retry\n </Button>\n )}\n </div>\n )}\n\n {/* Live region for screen reader announcements */}\n <div\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n >\n {status === 'complete' && `${file.name} upload complete`}\n {status === 'error' && `${file.name} upload failed${error ? `: ${error}` : ''}`}\n </div>\n </div>\n );\n}\n\nFileProgress.displayName = 'FileProgress';\n\nexport { FileProgress };\n","\"use client\";\n\n/**\n * FileField Component - Accessible file selection input\n *\n * Built with React Aria FileTrigger primitive and custom drag-and-drop\n * WCAG 2.2 AAA compliant (7:1 contrast, 44x44px touch targets)\n *\n * @see plan.md for architecture details\n * @see filefield-prd.md for requirements\n */\n\nimport {\n forwardRef,\n useId,\n useState,\n useCallback,\n useRef,\n type DragEvent,\n} from 'react';\nimport { FileTrigger } from 'react-aria-components';\nimport { Button } from '../Button';\nimport { Upload, X, FileIcon, ImageIcon, VideoIcon, AudioLines } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { FileFieldProps, ValidationResult } from './FileField.types';\nimport {\n fileFieldContainerVariants,\n fileFieldDropZoneVariants,\n fileFieldTriggerVariants,\n fileFieldListVariants,\n fileFieldListHeaderVariants,\n fileFieldItemVariants,\n fileFieldRemoveButtonVariants,\n fileFieldErrorVariants,\n fileFieldSuccessVariants,\n fileFieldDescriptionVariants,\n fileFieldLabelVariants,\n} from './FileField.variants';\nimport {\n formatFileSize,\n truncateFileName,\n isFileTypeAccepted,\n getFileIcon,\n deduplicateFiles,\n} from './utils';\nimport { FilePreview } from './FilePreview';\nimport { FileProgress } from './FileProgress';\n\n/**\n * FileField Component\n *\n * Accessible file selection input with drag-and-drop support\n */\nconst FileField = forwardRef<HTMLDivElement, FileFieldProps>(\n function FileField(\n {\n // Required\n label,\n\n // File selection\n acceptedFileTypes,\n allowsMultiple = false,\n\n // Constraints\n maxFileSize,\n maxFiles,\n\n // Display\n description,\n errorMessage,\n successMessage,\n triggerText,\n\n // States\n isRequired,\n isDisabled,\n isInvalid,\n isValid,\n\n // Variants\n size = 'default',\n\n // Form integration\n name,\n id,\n className,\n\n // Value (controlled)\n value = [],\n\n // Events\n onChange,\n validate,\n\n // Phase 1: Image Previews\n showPreviews = false,\n previewSize = 64,\n maxPreviewBytes = 10 * 1024 * 1024,\n renderPreview,\n\n // Phase 1: Upload Progress (will be used later)\n showProgress = false,\n uploadProgress,\n uploadStatus,\n uploadErrors,\n onRetry,\n\n // Standard\n 'data-testid': dataTestId,\n 'aria-label': _ariaLabel,\n 'aria-labelledby': _ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n ...props\n },\n ref\n ) {\n // Generate unique IDs\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n const labelId = `${fieldId}-label`;\n const descriptionId = `${fieldId}-description`;\n const errorId = `${fieldId}-error`;\n\n // Internal state\n const [isDragOver, setIsDragOver] = useState(false);\n const [internalError, setInternalError] = useState<string | null>(null);\n const dragCounterRef = useRef(0);\n\n // Determine which error to show (external takes precedence)\n const displayError = errorMessage ?? internalError;\n const hasError = isInvalid || !!displayError;\n\n // Build aria-describedby\n const describedByParts: string[] = [];\n if (ariaDescribedBy) describedByParts.push(ariaDescribedBy);\n if (description) describedByParts.push(descriptionId);\n if (displayError) describedByParts.push(errorId);\n const describedBy = describedByParts.length > 0 ? describedByParts.join(' ') : undefined;\n\n /**\n * Validate files against constraints\n */\n const validateFiles = useCallback(\n (files: File[], existingFiles: File[] = []): ValidationResult => {\n const validFiles: File[] = [];\n const errors: string[] = [];\n\n for (const file of files) {\n // Check file type\n if (acceptedFileTypes && !isFileTypeAccepted(file, acceptedFileTypes)) {\n errors.push(`\"${file.name}\" has an invalid file type`);\n continue;\n }\n\n // Check file size\n if (maxFileSize && file.size > maxFileSize) {\n errors.push(\n `\"${file.name}\" exceeds the maximum size of ${formatFileSize(maxFileSize)}`\n );\n continue;\n }\n\n validFiles.push(file);\n }\n\n // Check total count (after deduplication with existing files)\n if (maxFiles && allowsMultiple) {\n const combined = deduplicateFiles(existingFiles, validFiles);\n if (combined.length > maxFiles) {\n errors.push(`Maximum ${maxFiles} files allowed`);\n return { valid: [], errors };\n }\n }\n\n return { valid: validFiles, errors };\n },\n [acceptedFileTypes, maxFileSize, maxFiles, allowsMultiple]\n );\n\n /**\n * Process selected/dropped files\n */\n const processFiles = useCallback(\n (fileList: FileList | null) => {\n if (!fileList || fileList.length === 0) return;\n\n // Clear internal error on new attempt\n setInternalError(null);\n\n const newFiles = Array.from(fileList);\n\n // Validate files\n const existingFiles = allowsMultiple ? value : [];\n const { valid, errors } = validateFiles(newFiles, existingFiles);\n\n if (errors.length > 0) {\n setInternalError(errors[0] ?? 'Invalid file');\n return;\n }\n\n // Run custom validation if provided\n if (validate && valid.length > 0) {\n const customError = validate(\n allowsMultiple ? deduplicateFiles(existingFiles, valid) : valid\n );\n if (customError) {\n setInternalError(customError);\n return;\n }\n }\n\n // Calculate final file list\n let finalFiles: File[];\n if (allowsMultiple) {\n finalFiles = deduplicateFiles(existingFiles, valid);\n } else {\n finalFiles = valid.slice(0, 1);\n }\n\n onChange?.(finalFiles);\n },\n [allowsMultiple, value, validateFiles, validate, onChange]\n );\n\n /**\n * Handle FileTrigger selection\n */\n const handleSelect = useCallback(\n (fileList: FileList | null) => {\n processFiles(fileList);\n },\n [processFiles]\n );\n\n /**\n * Handle file removal\n */\n const handleRemove = useCallback(\n (fileToRemove: File) => {\n const newFiles = value.filter((f) => f !== fileToRemove);\n onChange?.(newFiles);\n },\n [value, onChange]\n );\n\n /**\n * Handle clear all\n */\n const handleClearAll = useCallback(() => {\n onChange?.([]);\n }, [onChange]);\n\n // Drag and drop handlers\n const handleDragEnter = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (isDisabled) return;\n\n dragCounterRef.current++;\n setIsDragOver(true);\n },\n [isDisabled]\n );\n\n const handleDragOver = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n },\n []\n );\n\n const handleDragLeave = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current--;\n if (dragCounterRef.current === 0) {\n setIsDragOver(false);\n }\n },\n []\n );\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current = 0;\n setIsDragOver(false);\n\n if (isDisabled) return;\n\n const files = e.dataTransfer?.files;\n processFiles(files ?? null);\n },\n [isDisabled, processFiles]\n );\n\n /**\n * Get icon component for file type\n */\n const getIconComponent = (file: File) => {\n const iconType = getFileIcon(file);\n switch (iconType) {\n case 'image':\n return ImageIcon;\n case 'video':\n return VideoIcon;\n case 'audio':\n return AudioLines;\n default:\n return FileIcon;\n }\n };\n\n // Build accept string for file input\n const acceptString = acceptedFileTypes?.join(',');\n\n return (\n <div\n ref={ref}\n id={fieldId}\n className={cn(fileFieldContainerVariants({ size }), className)}\n data-testid={dataTestId ?? 'file-field'}\n {...props}\n >\n {/* Label */}\n <label\n id={labelId}\n className={fileFieldLabelVariants({ size, isRequired })}\n >\n {label}\n </label>\n\n {/* Drop Zone */}\n <div\n role=\"group\"\n data-testid={`${dataTestId ?? 'file-field'}-dropzone`}\n className={cn(\n 'drop-zone', // Added for test selectors\n fileFieldDropZoneVariants({\n size,\n isDragOver,\n isInvalid: hasError,\n isDisabled,\n })\n )}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n aria-disabled={isDisabled || undefined}\n >\n <FileTrigger\n acceptedFileTypes={acceptedFileTypes}\n allowsMultiple={allowsMultiple}\n onSelect={handleSelect}\n >\n <Button\n variant=\"outline\"\n isDisabled={isDisabled}\n buttonVisualClassName={fileFieldTriggerVariants({ size })}\n >\n <Upload className=\"h-4 w-4\" aria-hidden=\"true\" />\n {isDragOver\n ? 'Drop files here'\n : triggerText ?? (allowsMultiple ? 'Choose files' : 'Choose file')}\n </Button>\n </FileTrigger>\n\n {/* Hidden file input for name attribute */}\n {name && (\n <input\n type=\"file\"\n name={name}\n accept={acceptString}\n multiple={allowsMultiple}\n disabled={isDisabled}\n className=\"sr-only\"\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {/* Description */}\n {description && (\n <p\n id={descriptionId}\n className={fileFieldDescriptionVariants({ size })}\n >\n {description}\n </p>\n )}\n\n {/* File List */}\n {value.length > 0 && (\n <div className={fileFieldListVariants({ size })}>\n {/* List Header with Clear All */}\n {value.length >= 2 && (\n <div className={fileFieldListHeaderVariants({ size })}>\n <span className=\"text-[var(--menu-muted)]\">\n {value.length} files selected\n </span>\n <Button\n variant=\"link\"\n visualSize=\"sm\"\n onPress={handleClearAll}\n buttonVisualClassName={cn(\n 'text-[var(--menu-muted)] hover:text-[var(--destructive)]',\n 'underline-offset-4 hover:underline'\n )}\n aria-label=\"Clear all files\"\n >\n Clear all\n </Button>\n </div>\n )}\n\n {/* File Items */}\n <ul className=\"space-y-2\">\n {value.map((file, index) => {\n const IconComponent = getIconComponent(file);\n // Calculate preview size based on field size variant\n const effectivePreviewSize =\n size === 'sm' ? Math.min(previewSize, 40) :\n size === 'lg' ? Math.min(previewSize, 80) :\n Math.min(previewSize, 48);\n\n // Check if we should show progress for this file\n const fileStatus = uploadStatus?.[index];\n const fileProgress = uploadProgress?.[index] ?? 0;\n const fileError = uploadErrors?.get(index);\n const showProgressForFile = showProgress && fileStatus !== undefined;\n\n return (\n <li\n key={`${file.name}-${index}`}\n className={showProgressForFile ? 'p-3' : fileFieldItemVariants({ size })}\n >\n {showProgressForFile ? (\n <FileProgress\n file={file}\n progress={fileProgress}\n status={fileStatus}\n error={fileError}\n onRetry={onRetry ? () => onRetry(index) : undefined}\n size={size}\n />\n ) : (\n <>\n <div className=\"flex items-center gap-2 min-w-0\">\n {showPreviews ? (\n <FilePreview\n file={file}\n size={effectivePreviewSize}\n maxBytes={maxPreviewBytes}\n renderPreview={renderPreview}\n className=\"flex-shrink-0\"\n />\n ) : (\n <IconComponent\n className=\"h-4 w-4 flex-shrink-0 text-[var(--menu-muted)]\"\n aria-hidden=\"true\"\n />\n )}\n <span className=\"truncate\" title={file.name}>\n {truncateFileName(file.name, 30)}\n </span>\n <span className=\"text-[var(--menu-muted)] flex-shrink-0\">\n {formatFileSize(file.size)}\n </span>\n </div>\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n onPress={() => handleRemove(file)}\n buttonVisualClassName={fileFieldRemoveButtonVariants({ size })}\n aria-label={`Remove ${file.name}`}\n isDisabled={isDisabled}\n >\n <X className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n </>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n )}\n\n {/* Error Message */}\n {displayError && (\n <p\n id={errorId}\n role=\"alert\"\n className={fileFieldErrorVariants({ size })}\n >\n {displayError}\n </p>\n )}\n\n {/* Success Message */}\n {!displayError && isValid && successMessage && (\n <p className={fileFieldSuccessVariants({ size })}>\n {successMessage}\n </p>\n )}\n </div>\n );\n }\n);\n\nFileField.displayName = 'FileField';\n\nexport { FileField };\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 type { ReactNode } from 'react';\nimport { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n/**\n * FileField props schema extending BaseComponentProps\n *\n * @see filefield-prd.md for full requirements\n * @see plan.md for architectural decisions\n * @see React Aria FileTrigger: https://react-aria.adobe.com/FileTrigger\n */\nexport const FileFieldPropsSchema = BaseComponentPropsSchema.extend({\n // Required\n /** Label text for the file field (required for accessibility) */\n label: z.string(),\n\n // File selection\n /**\n * Array of accepted file types (MIME types or extensions)\n * @example ['application/pdf', 'image/*', '.docx']\n */\n acceptedFileTypes: z.array(z.string()).optional(),\n\n /** Allow selecting multiple files */\n allowsMultiple: z.boolean().default(false),\n\n // Constraints\n /** Maximum file size in bytes */\n maxFileSize: z.number().optional(),\n\n /** Maximum number of files (only applies when allowsMultiple is true) */\n maxFiles: z.number().optional(),\n\n // Display\n /** Description text shown below the drop zone */\n description: z.string().optional(),\n\n /** Error message from external validation */\n errorMessage: z.string().optional(),\n\n /** Success message when files are valid */\n successMessage: z.string().optional(),\n\n /** Custom text for the trigger button */\n triggerText: z.string().optional(),\n\n // States\n /** Mark field as required */\n isRequired: z.boolean().optional(),\n\n /** Disable the field */\n isDisabled: z.boolean().optional(),\n\n /** Show invalid state styling */\n isInvalid: z.boolean().optional(),\n\n /** Show valid state styling */\n isValid: z.boolean().optional(),\n\n // Variants\n /** Size variant */\n size: z.enum(['sm', 'default', 'lg']).default('default'),\n\n // Form integration\n /** Name attribute for form association */\n name: z.string().optional(),\n\n // === Phase 1: Image Previews ===\n /** Enable image thumbnail previews (default: false) */\n showPreviews: z.boolean().default(false),\n\n /** Maximum preview dimension in pixels (default: 64) */\n previewSize: z.number().min(16).max(256).default(64),\n\n /** Maximum file size for preview generation in bytes (default: 10MB) */\n maxPreviewBytes: z.number().default(10 * 1024 * 1024),\n\n // === Phase 1: Upload Progress ===\n /** Enable upload progress display (default: false) */\n showProgress: z.boolean().default(false),\n\n /** Progress values per file (0-100), indexed parallel to files array */\n uploadProgress: z.array(z.number().min(0).max(100)).optional(),\n\n /** Upload status per file, indexed parallel to files array */\n uploadStatus: z\n .array(z.enum(['pending', 'uploading', 'complete', 'error']))\n .optional(),\n})\n .refine(\n (data) => !(data.successMessage && data.errorMessage),\n {\n message:\n '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 (\n typeof process !== 'undefined' &&\n process.env.NODE_ENV === 'development'\n ) {\n if (data.isValid && data.isInvalid) {\n console.error(\n '[FileField] Both isValid and isInvalid are true. isInvalid takes precedence.'\n );\n }\n }\n return true;\n }\n );\n\n/**\n * FileField component props type\n *\n * Includes Zod-validated props plus event handlers that can't be validated by Zod\n */\n/**\n * Upload status for progress indication\n */\nexport type UploadStatus = 'pending' | 'uploading' | 'complete' | 'error';\n\nexport type FileFieldProps = Omit<\n z.infer<typeof FileFieldPropsSchema>,\n 'children'\n> & {\n /** Controlled value - array of selected files */\n value?: File[];\n\n /** Callback when files change */\n onChange?: (files: File[]) => void;\n\n /**\n * Custom validation function\n * Called after internal validation (type, size, count)\n * Return a string to display as error, or undefined/null if valid\n */\n validate?: (files: File[]) => string | undefined | null;\n\n // === Phase 1: Image Previews ===\n /** Custom preview renderer for non-image files */\n renderPreview?: (file: File) => ReactNode;\n\n // === Phase 1: Upload Progress ===\n /** Error messages per file index */\n uploadErrors?: Map<number, string>;\n\n /** Callback when user requests retry for failed upload */\n onRetry?: (fileIndex: number) => void;\n};\n\n/**\n * File field size variants\n */\nexport type FileFieldSize = NonNullable<\n z.infer<typeof FileFieldPropsSchema>['size']\n>;\n\n/**\n * Internal drag state for drop zone styling\n */\nexport type DragState = 'idle' | 'drag-over' | 'drag-invalid';\n\n/**\n * Validation result from internal validation\n */\nexport interface ValidationResult {\n /** Files that passed validation */\n valid: File[];\n /** Error messages for files that failed */\n errors: string[];\n}\n"]}
@@ -1,17 +1,3 @@
1
- 'use strict';
2
-
3
- var chunkZMYLD3BN_js = require('../../chunk-ZMYLD3BN.js');
4
- require('../../chunk-VIREG536.js');
5
-
6
-
7
-
8
- Object.defineProperty(exports, "FormLayout", {
9
- enumerable: true,
10
- get: function () { return chunkZMYLD3BN_js.FormLayout; }
11
- });
12
- Object.defineProperty(exports, "formLayoutBodyVariants", {
13
- enumerable: true,
14
- get: function () { return chunkZMYLD3BN_js.formLayoutBodyVariants; }
15
- });
16
- //# sourceMappingURL=index.js.map
1
+ "use client";
2
+ 'use strict';var react=require('react'),classVarianceAuthority=require('class-variance-authority'),lucideReact=require('lucide-react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function r(...a){return tailwindMerge.twMerge(clsx.clsx(a))}var g=classVarianceAuthority.cva("grid grid-cols-1 mt-6",{variants:{columns:{1:"",2:"md:grid-cols-2"},density:{default:"gap-4",compact:"gap-2",comfortable:"gap-6"}},defaultVariants:{columns:1,density:"default"}}),_=({level:a,id:l,className:o,children:d})=>{let i=`h${a}`;return jsxRuntime.jsx(i,{id:l,className:o,children:d})},x=react.forwardRef(({title:a,requiredNote:l,description:o,columns:d=1,headingLevel:i=2,density:b="default",errorMessage:n,successMessage:s,fieldErrors:j,autoHideSuccess:c=false,autoHideDuration:f=5e3,className:N,children:h,actions:u,id:m,"data-testid":L,"aria-label":p,"aria-labelledby":F,"aria-describedby":w,...C},k)=>{let E=react.useId(),y=m?`${m}-title`:E,H=F||y,[S,v]=react.useState(true);return react.useEffect(()=>{if(v(true),s&&c){let P=setTimeout(()=>{v(false);},f);return ()=>clearTimeout(P)}},[s,c,f]),jsxRuntime.jsxs("section",{ref:k,id:m,"data-testid":L,"aria-label":p,"aria-labelledby":p?void 0:H,"aria-describedby":w,className:r("form-layout w-full",N),...C,children:[n&&jsxRuntime.jsxs("div",{role:"alert","aria-live":"assertive","data-testid":"form-layout-error",className:r("rounded-lg border px-4 py-3 mb-6 text-sm","border-[var(--destructive-background)] bg-[var(--destructive-foreground)] text-[var(--destructive-background)]","flex items-start gap-3"),children:[jsxRuntime.jsx(lucideReact.AlertCircle,{className:"h-5 w-5 flex-shrink-0 mt-0.5","aria-hidden":"true"}),jsxRuntime.jsxs("div",{className:"flex-1",children:[jsxRuntime.jsx("p",{className:"font-medium",children:"Error"}),jsxRuntime.jsx("p",{className:"mt-1",children:n})]})]}),s&&S&&jsxRuntime.jsxs("div",{role:"status","aria-live":"polite","data-testid":"form-layout-success",className:r("rounded-lg border px-4 py-3 mb-6 text-sm","border-success bg-success/10 text-success","flex items-start gap-3"),children:[jsxRuntime.jsx(lucideReact.CheckCircle2,{className:"h-5 w-5 flex-shrink-0 mt-0.5","aria-hidden":"true"}),jsxRuntime.jsxs("div",{className:"flex-1",children:[jsxRuntime.jsx("p",{className:"font-medium",children:"Success"}),jsxRuntime.jsx("p",{className:"mt-1",children:s})]})]}),jsxRuntime.jsxs("header",{className:"form-layout-header mb-6",children:[jsxRuntime.jsx(_,{level:i,id:y,className:"text-[var(--content-foreground)] font-semibold",children:a}),o&&jsxRuntime.jsx("p",{className:"text-sm text-[var(--content-foreground)] leading-relaxed mt-2",children:o}),jsxRuntime.jsx("p",{className:"text-sm text-[var(--content-foreground)]",children:l})]}),jsxRuntime.jsx("div",{"data-testid":"form-layout-body",className:r(g({columns:d,density:b})),children:h}),u&&jsxRuntime.jsx("div",{"data-testid":"form-layout-actions",className:"flex justify-between items-center mt-4 gap-2 max-md:flex-col max-md:w-full",children:u})]})});x.displayName="FormLayout";exports.FormLayout=x;exports.formLayoutBodyVariants=g;//# sourceMappingURL=index.js.map
17
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/FormLayout/FormLayout.tsx"],"names":["cn","inputs","twMerge","clsx","formLayoutBodyVariants","cva","Heading","level","id","className","children","Tag","jsx","FormLayout","forwardRef","title","requiredNote","description","columns","headingLevel","density","errorMessage","successMessage","_fieldErrors","autoHideSuccess","autoHideDuration","actions","dataTestId","ariaLabel","ariaLabelledby","ariaDescribedby","props","ref","headingId","useId","finalHeadingId","finalAriaLabelledby","showSuccess","setShowSuccess","useState","useEffect","timer","jsxs","AlertCircle","CheckCircle2"],"mappings":"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","file":"index.js","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","\"use client\";\n\n/**\n * FormLayout Component\n * Structural layout component for consistent form presentation\n *\n * @see FormLayout-plan.md (Component API Design)\n * @see FormLayout-design-decisions.md (Approved design specifications)\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements - WCAG 2.2 AAA)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { JSX, forwardRef, FC, useId, ReactNode, useState, useEffect } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { AlertCircle, CheckCircle2 } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { FormLayoutProps, HeadingLevel } from './FormLayout.types';\n\n/**\n * Body variant styles using CVA\n * Controls column layout and field spacing (density)\n */\nconst formLayoutBodyVariants = cva(\n // Base styles - grid layout with responsive columns\n \"grid grid-cols-1 mt-6\",\n {\n variants: {\n // Column variants (responsive: mobile single, desktop optional double)\n columns: {\n 1: \"\", // Single column (no additional classes needed)\n 2: \"md:grid-cols-2\", // Double column on md breakpoint and up\n },\n // Density variants (controls gap between form fields)\n density: {\n default: \"gap-4\", // 16px gap\n compact: \"gap-2\", // 8px gap\n comfortable: \"gap-6\", // 24px gap\n },\n },\n defaultVariants: {\n columns: 1,\n density: \"default\",\n },\n }\n);\n\n/**\n * Polymorphic Heading Component\n * Renders h1-h6 based on headingLevel prop for proper document hierarchy\n */\ninterface HeadingProps {\n level: HeadingLevel;\n id: string;\n className?: string;\n children: ReactNode;\n}\n\nconst Heading: FC<HeadingProps> = ({ level, id, className, children }) => {\n const Tag = `h${level}` as keyof JSX.IntrinsicElements;\n\n return (\n <Tag id={id} className={className}>\n {children}\n </Tag>\n );\n};\n\n/**\n * FormLayout Component\n * Provides consistent form structure with header, body, and optional actions\n */\nexport const FormLayout = forwardRef<HTMLElement, FormLayoutProps>(\n (\n {\n title,\n requiredNote,\n description,\n columns = 1,\n headingLevel = 2,\n density = 'default',\n errorMessage,\n successMessage,\n fieldErrors: _fieldErrors,\n autoHideSuccess = false,\n autoHideDuration = 5000,\n className,\n children,\n actions,\n id,\n 'data-testid': dataTestId,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n ...props\n },\n ref\n ) => {\n // Generate unique IDs for accessibility\n const headingId = useId();\n const finalHeadingId = id ? `${id}-title` : headingId;\n\n // Determine aria-labelledby (use prop if provided, otherwise point to heading)\n const finalAriaLabelledby = ariaLabelledby || finalHeadingId;\n\n // Auto-hide success message state\n const [showSuccess, setShowSuccess] = useState(true);\n\n // Auto-hide success message after duration\n useEffect(() => {\n // Reset show state when message changes (must come first!)\n setShowSuccess(true);\n\n // Set timeout to hide if autoHideSuccess is enabled\n if (successMessage && autoHideSuccess) {\n const timer = setTimeout(() => {\n setShowSuccess(false);\n }, autoHideDuration);\n\n return (): void => clearTimeout(timer);\n }\n }, [successMessage, autoHideSuccess, autoHideDuration]);\n\n return (\n <section\n ref={ref}\n id={id}\n data-testid={dataTestId}\n aria-label={ariaLabel}\n aria-labelledby={!ariaLabel ? finalAriaLabelledby : undefined}\n aria-describedby={ariaDescribedby}\n className={cn(\"form-layout w-full\", className)}\n {...props}\n >\n {/* Error Message Alert */}\n {errorMessage && (\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n data-testid=\"form-layout-error\"\n className={cn(\n \"rounded-lg border px-4 py-3 mb-6 text-sm\",\n \"border-[var(--destructive-background)] bg-[var(--destructive-foreground)] text-[var(--destructive-background)]\",\n \"flex items-start gap-3\"\n )}\n >\n <AlertCircle className=\"h-5 w-5 flex-shrink-0 mt-0.5\" aria-hidden=\"true\" />\n <div className=\"flex-1\">\n <p className=\"font-medium\">Error</p>\n <p className=\"mt-1\">{errorMessage}</p>\n </div>\n </div>\n )}\n\n {/* Success Message Alert */}\n {successMessage && showSuccess && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"form-layout-success\"\n className={cn(\n \"rounded-lg border px-4 py-3 mb-6 text-sm\",\n \"border-success bg-success/10 text-success\",\n \"flex items-start gap-3\"\n )}\n >\n <CheckCircle2 className=\"h-5 w-5 flex-shrink-0 mt-0.5\" aria-hidden=\"true\" />\n <div className=\"flex-1\">\n <p className=\"font-medium\">Success</p>\n <p className=\"mt-1\">{successMessage}</p>\n </div>\n </div>\n )}\n\n {/* Header Section: Title → Description → Required Note */}\n <header className=\"form-layout-header mb-6\">\n {/* Title (configurable heading level) */}\n <Heading\n level={headingLevel}\n id={finalHeadingId}\n className=\"text-[var(--content-foreground)] font-semibold\"\n >\n {title}\n </Heading>\n\n {/* Description (optional) */}\n {description && (\n <p className=\"text-sm text-[var(--content-foreground)] leading-relaxed mt-2\">\n {description}\n </p>\n )}\n\n {/* Required Note (always visible) */}\n <p className=\"text-sm text-[var(--content-foreground)]\">\n {requiredNote}\n </p>\n </header>\n\n {/* Body Section: Form fields with configurable layout */}\n <div\n data-testid=\"form-layout-body\"\n className={cn(\n formLayoutBodyVariants({\n columns,\n density,\n })\n )}\n >\n {children}\n </div>\n\n {/* Actions Section: Optional footer for buttons */}\n {actions && (\n <div data-testid=\"form-layout-actions\" className=\"flex justify-between items-center mt-4 gap-2 max-md:flex-col max-md:w-full\">\n {actions}\n </div>\n )}\n </section>\n );\n }\n);\n\nFormLayout.displayName = \"FormLayout\";\n\nexport { formLayoutBodyVariants };\n"]}
@@ -1,4 +1,3 @@
1
- export { FormLayout, formLayoutBodyVariants } from '../../chunk-AKIA6GW6.mjs';
2
- import '../../chunk-E2KQFV3O.mjs';
3
- //# sourceMappingURL=index.mjs.map
1
+ "use client";
2
+ import {forwardRef,useId,useState,useEffect}from'react';import {cva}from'class-variance-authority';import {AlertCircle,CheckCircle2}from'lucide-react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,jsx}from'react/jsx-runtime';function r(...a){return twMerge(clsx(a))}var g=cva("grid grid-cols-1 mt-6",{variants:{columns:{1:"",2:"md:grid-cols-2"},density:{default:"gap-4",compact:"gap-2",comfortable:"gap-6"}},defaultVariants:{columns:1,density:"default"}}),_=({level:a,id:l,className:o,children:d})=>{let i=`h${a}`;return jsx(i,{id:l,className:o,children:d})},x=forwardRef(({title:a,requiredNote:l,description:o,columns:d=1,headingLevel:i=2,density:b="default",errorMessage:n,successMessage:s,fieldErrors:j,autoHideSuccess:c=false,autoHideDuration:f=5e3,className:N,children:h,actions:u,id:m,"data-testid":L,"aria-label":p,"aria-labelledby":F,"aria-describedby":w,...C},k)=>{let E=useId(),y=m?`${m}-title`:E,H=F||y,[S,v]=useState(true);return useEffect(()=>{if(v(true),s&&c){let P=setTimeout(()=>{v(false);},f);return ()=>clearTimeout(P)}},[s,c,f]),jsxs("section",{ref:k,id:m,"data-testid":L,"aria-label":p,"aria-labelledby":p?void 0:H,"aria-describedby":w,className:r("form-layout w-full",N),...C,children:[n&&jsxs("div",{role:"alert","aria-live":"assertive","data-testid":"form-layout-error",className:r("rounded-lg border px-4 py-3 mb-6 text-sm","border-[var(--destructive-background)] bg-[var(--destructive-foreground)] text-[var(--destructive-background)]","flex items-start gap-3"),children:[jsx(AlertCircle,{className:"h-5 w-5 flex-shrink-0 mt-0.5","aria-hidden":"true"}),jsxs("div",{className:"flex-1",children:[jsx("p",{className:"font-medium",children:"Error"}),jsx("p",{className:"mt-1",children:n})]})]}),s&&S&&jsxs("div",{role:"status","aria-live":"polite","data-testid":"form-layout-success",className:r("rounded-lg border px-4 py-3 mb-6 text-sm","border-success bg-success/10 text-success","flex items-start gap-3"),children:[jsx(CheckCircle2,{className:"h-5 w-5 flex-shrink-0 mt-0.5","aria-hidden":"true"}),jsxs("div",{className:"flex-1",children:[jsx("p",{className:"font-medium",children:"Success"}),jsx("p",{className:"mt-1",children:s})]})]}),jsxs("header",{className:"form-layout-header mb-6",children:[jsx(_,{level:i,id:y,className:"text-[var(--content-foreground)] font-semibold",children:a}),o&&jsx("p",{className:"text-sm text-[var(--content-foreground)] leading-relaxed mt-2",children:o}),jsx("p",{className:"text-sm text-[var(--content-foreground)]",children:l})]}),jsx("div",{"data-testid":"form-layout-body",className:r(g({columns:d,density:b})),children:h}),u&&jsx("div",{"data-testid":"form-layout-actions",className:"flex justify-between items-center mt-4 gap-2 max-md:flex-col max-md:w-full",children:u})]})});x.displayName="FormLayout";export{x as FormLayout,g as formLayoutBodyVariants};//# sourceMappingURL=index.mjs.map
4
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/FormLayout/FormLayout.tsx"],"names":["cn","inputs","twMerge","clsx","formLayoutBodyVariants","cva","Heading","level","id","className","children","Tag","jsx","FormLayout","forwardRef","title","requiredNote","description","columns","headingLevel","density","errorMessage","successMessage","_fieldErrors","autoHideSuccess","autoHideDuration","actions","dataTestId","ariaLabel","ariaLabelledby","ariaDescribedby","props","ref","headingId","useId","finalHeadingId","finalAriaLabelledby","showSuccess","setShowSuccess","useState","useEffect","timer","jsxs","AlertCircle","CheckCircle2"],"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","\"use client\";\n\n/**\n * FormLayout Component\n * Structural layout component for consistent form presentation\n *\n * @see FormLayout-plan.md (Component API Design)\n * @see FormLayout-design-decisions.md (Approved design specifications)\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements - WCAG 2.2 AAA)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { JSX, forwardRef, FC, useId, ReactNode, useState, useEffect } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { AlertCircle, CheckCircle2 } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { FormLayoutProps, HeadingLevel } from './FormLayout.types';\n\n/**\n * Body variant styles using CVA\n * Controls column layout and field spacing (density)\n */\nconst formLayoutBodyVariants = cva(\n // Base styles - grid layout with responsive columns\n \"grid grid-cols-1 mt-6\",\n {\n variants: {\n // Column variants (responsive: mobile single, desktop optional double)\n columns: {\n 1: \"\", // Single column (no additional classes needed)\n 2: \"md:grid-cols-2\", // Double column on md breakpoint and up\n },\n // Density variants (controls gap between form fields)\n density: {\n default: \"gap-4\", // 16px gap\n compact: \"gap-2\", // 8px gap\n comfortable: \"gap-6\", // 24px gap\n },\n },\n defaultVariants: {\n columns: 1,\n density: \"default\",\n },\n }\n);\n\n/**\n * Polymorphic Heading Component\n * Renders h1-h6 based on headingLevel prop for proper document hierarchy\n */\ninterface HeadingProps {\n level: HeadingLevel;\n id: string;\n className?: string;\n children: ReactNode;\n}\n\nconst Heading: FC<HeadingProps> = ({ level, id, className, children }) => {\n const Tag = `h${level}` as keyof JSX.IntrinsicElements;\n\n return (\n <Tag id={id} className={className}>\n {children}\n </Tag>\n );\n};\n\n/**\n * FormLayout Component\n * Provides consistent form structure with header, body, and optional actions\n */\nexport const FormLayout = forwardRef<HTMLElement, FormLayoutProps>(\n (\n {\n title,\n requiredNote,\n description,\n columns = 1,\n headingLevel = 2,\n density = 'default',\n errorMessage,\n successMessage,\n fieldErrors: _fieldErrors,\n autoHideSuccess = false,\n autoHideDuration = 5000,\n className,\n children,\n actions,\n id,\n 'data-testid': dataTestId,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n ...props\n },\n ref\n ) => {\n // Generate unique IDs for accessibility\n const headingId = useId();\n const finalHeadingId = id ? `${id}-title` : headingId;\n\n // Determine aria-labelledby (use prop if provided, otherwise point to heading)\n const finalAriaLabelledby = ariaLabelledby || finalHeadingId;\n\n // Auto-hide success message state\n const [showSuccess, setShowSuccess] = useState(true);\n\n // Auto-hide success message after duration\n useEffect(() => {\n // Reset show state when message changes (must come first!)\n setShowSuccess(true);\n\n // Set timeout to hide if autoHideSuccess is enabled\n if (successMessage && autoHideSuccess) {\n const timer = setTimeout(() => {\n setShowSuccess(false);\n }, autoHideDuration);\n\n return (): void => clearTimeout(timer);\n }\n }, [successMessage, autoHideSuccess, autoHideDuration]);\n\n return (\n <section\n ref={ref}\n id={id}\n data-testid={dataTestId}\n aria-label={ariaLabel}\n aria-labelledby={!ariaLabel ? finalAriaLabelledby : undefined}\n aria-describedby={ariaDescribedby}\n className={cn(\"form-layout w-full\", className)}\n {...props}\n >\n {/* Error Message Alert */}\n {errorMessage && (\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n data-testid=\"form-layout-error\"\n className={cn(\n \"rounded-lg border px-4 py-3 mb-6 text-sm\",\n \"border-[var(--destructive-background)] bg-[var(--destructive-foreground)] text-[var(--destructive-background)]\",\n \"flex items-start gap-3\"\n )}\n >\n <AlertCircle className=\"h-5 w-5 flex-shrink-0 mt-0.5\" aria-hidden=\"true\" />\n <div className=\"flex-1\">\n <p className=\"font-medium\">Error</p>\n <p className=\"mt-1\">{errorMessage}</p>\n </div>\n </div>\n )}\n\n {/* Success Message Alert */}\n {successMessage && showSuccess && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"form-layout-success\"\n className={cn(\n \"rounded-lg border px-4 py-3 mb-6 text-sm\",\n \"border-success bg-success/10 text-success\",\n \"flex items-start gap-3\"\n )}\n >\n <CheckCircle2 className=\"h-5 w-5 flex-shrink-0 mt-0.5\" aria-hidden=\"true\" />\n <div className=\"flex-1\">\n <p className=\"font-medium\">Success</p>\n <p className=\"mt-1\">{successMessage}</p>\n </div>\n </div>\n )}\n\n {/* Header Section: Title → Description → Required Note */}\n <header className=\"form-layout-header mb-6\">\n {/* Title (configurable heading level) */}\n <Heading\n level={headingLevel}\n id={finalHeadingId}\n className=\"text-[var(--content-foreground)] font-semibold\"\n >\n {title}\n </Heading>\n\n {/* Description (optional) */}\n {description && (\n <p className=\"text-sm text-[var(--content-foreground)] leading-relaxed mt-2\">\n {description}\n </p>\n )}\n\n {/* Required Note (always visible) */}\n <p className=\"text-sm text-[var(--content-foreground)]\">\n {requiredNote}\n </p>\n </header>\n\n {/* Body Section: Form fields with configurable layout */}\n <div\n data-testid=\"form-layout-body\"\n className={cn(\n formLayoutBodyVariants({\n columns,\n density,\n })\n )}\n >\n {children}\n </div>\n\n {/* Actions Section: Optional footer for buttons */}\n {actions && (\n <div data-testid=\"form-layout-actions\" className=\"flex justify-between items-center mt-4 gap-2 max-md:flex-col max-md:w-full\">\n {actions}\n </div>\n )}\n </section>\n );\n }\n);\n\nFormLayout.displayName = \"FormLayout\";\n\nexport { formLayoutBodyVariants };\n"]}
@@ -132,25 +132,20 @@ declare namespace ModalClose {
132
132
  var displayName: string;
133
133
  }
134
134
  /**
135
- * CVA Variants for Modal.Content
136
- *
137
- * @see PRD.md TR-001 (CVA Variant Styling)
138
- * @see PRD.md DS-001 (Size Variants)
135
+ * Re-export CVA variants from Modal.styles.ts for backwards compatibility.
136
+ * Consumers importing { modalContentVariants, modalOverlayVariants } from './Modal'
137
+ * will continue to work.
139
138
  */
140
- export declare const modalContentVariants: (props?: ({
141
- size?: "sm" | "lg" | "md" | "xl" | "full" | null | undefined;
142
- animation?: "none" | "slide" | "fade-zoom" | "fade" | null | undefined;
143
- } & import("class-variance-authority/types").ClassProp) | undefined) => string;
144
- /**
145
- * CVA Variants for Modal Overlay
146
- */
147
- export declare const modalOverlayVariants: (props?: ({
148
- animation?: "none" | "slide" | "fade-zoom" | "fade" | null | undefined;
149
- } & import("class-variance-authority/types").ClassProp) | undefined) => string;
139
+ export { modalContentVariants, modalOverlayVariants } from './Modal.styles';
150
140
  /**
151
141
  * Compound Component Export
152
142
  *
153
143
  * Follows Themis library pattern using Object.assign() for compound components.
144
+ * Enables usage like Modal.Trigger, Modal.Content, etc.
145
+ *
146
+ * @deprecated The Object.assign compound pattern will be removed in v2.
147
+ * Use the direct named exports (ModalTrigger, ModalContent, etc.) instead.
148
+ * This pattern is kept for backwards compatibility only.
154
149
  *
155
150
  * @see RESEARCH.md Section 1 (Compound Component Pattern)
156
151
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/elements/Modal/Modal.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,EAML,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AAYf,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EAChB,MAAM,eAAe,CAAC;AAYvB;;;;;;;;;;;GAWG;AACH,iBAAS,SAAS,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,IAAe,EAAE,EAAE,UAAU,GAAG,YAAY,CA6C7G;kBA7CQ,SAAS;;;AAiDlB;;;;;;;;;;;;;GAaG;AACH,iBAAS,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,GAAG,YAAY,CAInE;kBAJQ,YAAY;;;AAQrB;;;;;;;;;;GAUG;AACH,iBAAS,YAAY,CAAC,EACpB,QAAQ,EACR,IAAW,EACX,SAAuB,EACvB,iBAAuB,EACvB,aAAoB,EACpB,yBAAiC,EACjC,SAAgB,EAChB,SAAS,GACV,EAAE,iBAAiB,GAAG,YAAY,CA8ClC;kBAvDQ,YAAY;;;AA2DrB;;;GAGG;AACH,iBAAS,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAErD;kBAFQ,YAAY;;;AAMrB;;;;;;;GAOG;AACH,iBAAS,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAM5E;kBANQ,WAAW;;;AAUpB;;;;;;;;GAQG;AACH,iBAAS,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAS,EAAE,SAAS,EAAE,EAAE,eAAe,GAAG,YAAY,CAUrF;kBAVQ,UAAU;;;AAcnB;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,qBAAqB,GAAG,YAAY,CAUtF;kBAVQ,gBAAgB;;;AAczB;;;;;;;;;GASG;AACH,iBAAS,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAM5E;kBANQ,WAAW;;;AAUpB;;;;;;;GAOG;AACH,iBAAS,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,YAAY,CA+B/D;kBA/BQ,UAAU;;;AAmCnB;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;8EAoChC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB;;8EAyBhC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,KAAK;;;;;;;;;CAShB,CAAC;AAGH,OAAO,EACL,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,GACX,CAAC"}
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/elements/Modal/Modal.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,EAML,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AAaf,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EAChB,MAAM,eAAe,CAAC;AAYvB;;;;;;;;;;;GAWG;AACH,iBAAS,SAAS,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,IAAe,EAAE,EAAE,UAAU,GAAG,YAAY,CA6D7G;kBA7DQ,SAAS;;;AAiElB;;;;;;;;;;;;;GAaG;AACH,iBAAS,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,GAAG,YAAY,CAInE;kBAJQ,YAAY;;;AAQrB;;;;;;;;;;GAUG;AACH,iBAAS,YAAY,CAAC,EACpB,QAAQ,EACR,IAAW,EACX,SAAuB,EACvB,iBAAuB,EACvB,aAAoB,EACpB,yBAAiC,EACjC,SAAgB,EAChB,SAAS,GACV,EAAE,iBAAiB,GAAG,YAAY,CA2ClC;kBApDQ,YAAY;;;AAwDrB;;;GAGG;AACH,iBAAS,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAErD;kBAFQ,YAAY;;;AAMrB;;;;;;;GAOG;AACH,iBAAS,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAE5E;kBAFQ,WAAW;;;AAMpB;;;;;;;;GAQG;AACH,iBAAS,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAS,EAAE,SAAS,EAAE,EAAE,eAAe,GAAG,YAAY,CAMrF;kBANQ,UAAU;;;AAUnB;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,qBAAqB,GAAG,YAAY,CAMtF;kBANQ,gBAAgB;;;AAUzB;;;;;;;;;GASG;AACH,iBAAS,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,YAAY,CAE5E;kBAFQ,WAAW;;;AAMpB;;;;;;;GAOG;AACH,iBAAS,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,YAAY,CA+B/D;kBA/BQ,UAAU;;;AAmCnB;;;;GAIG;AACH,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE5E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK;;;;;;;;;CAShB,CAAC;AAGH,OAAO,EACL,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,GACX,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ /**
3
+ * CVA Variants for Modal.Content
4
+ *
5
+ * Size and animation variant definitions for the modal content container.
6
+ * Uses CSS custom properties for all colours to support theming.
7
+ *
8
+ * @see Modal.types.ts (ModalSize, ModalAnimation)
9
+ */
10
+ export declare const modalContentVariants: (props?: ({
11
+ size?: "sm" | "lg" | "md" | "xl" | "full" | null | undefined;
12
+ animation?: "none" | "slide" | "fade-zoom" | "fade" | null | undefined;
13
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
14
+ /**
15
+ * CVA Variants for Modal Overlay
16
+ *
17
+ * Animation variant definitions for the modal backdrop overlay.
18
+ * Uses CSS custom properties for all colours to support theming.
19
+ */
20
+ export declare const modalOverlayVariants: (props?: ({
21
+ animation?: "none" | "slide" | "fade-zoom" | "fade" | null | undefined;
22
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
23
+ /**
24
+ * Type exports for variant props
25
+ * Allows TypeScript inference of variant combinations
26
+ */
27
+ export type ModalContentVariantProps = VariantProps<typeof modalContentVariants>;
28
+ export type ModalOverlayVariantProps = VariantProps<typeof modalOverlayVariants>;
29
+ //# sourceMappingURL=Modal.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.styles.d.ts","sourceRoot":"","sources":["../../../src/elements/Modal/Modal.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB;;;8EAoChC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;8EAyBhC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,YAAY,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACjF,MAAM,MAAM,wBAAwB,GAAG,YAAY,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -11,4 +11,5 @@
11
11
  */
12
12
  export { Modal, ModalTrigger, ModalContent, ModalOverlay, ModalHeader, ModalTitle, ModalDescription, ModalFooter, ModalClose, modalContentVariants, modalOverlayVariants, } from './Modal';
13
13
  export type { ModalProps, ModalTriggerProps, ModalContentProps, ModalOverlayProps, ModalHeaderProps, ModalTitleProps, ModalDescriptionProps, ModalFooterProps, ModalCloseProps, ModalSize, ModalAnimation, } from './Modal.types';
14
+ export type { ModalContentVariantProps, ModalOverlayVariantProps, } from './Modal.styles';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Modal/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,cAAc,GACf,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Modal/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC"}
@@ -1,52 +1,3 @@
1
- 'use strict';
2
-
3
- var chunk3MJPASQU_js = require('../../chunk-3MJPASQU.js');
4
-
5
-
6
-
7
- Object.defineProperty(exports, "Modal", {
8
- enumerable: true,
9
- get: function () { return chunk3MJPASQU_js.Modal; }
10
- });
11
- Object.defineProperty(exports, "ModalClose", {
12
- enumerable: true,
13
- get: function () { return chunk3MJPASQU_js.ModalClose; }
14
- });
15
- Object.defineProperty(exports, "ModalContent", {
16
- enumerable: true,
17
- get: function () { return chunk3MJPASQU_js.ModalContent; }
18
- });
19
- Object.defineProperty(exports, "ModalDescription", {
20
- enumerable: true,
21
- get: function () { return chunk3MJPASQU_js.ModalDescription; }
22
- });
23
- Object.defineProperty(exports, "ModalFooter", {
24
- enumerable: true,
25
- get: function () { return chunk3MJPASQU_js.ModalFooter; }
26
- });
27
- Object.defineProperty(exports, "ModalHeader", {
28
- enumerable: true,
29
- get: function () { return chunk3MJPASQU_js.ModalHeader; }
30
- });
31
- Object.defineProperty(exports, "ModalOverlay", {
32
- enumerable: true,
33
- get: function () { return chunk3MJPASQU_js.ModalOverlay; }
34
- });
35
- Object.defineProperty(exports, "ModalTitle", {
36
- enumerable: true,
37
- get: function () { return chunk3MJPASQU_js.ModalTitle; }
38
- });
39
- Object.defineProperty(exports, "ModalTrigger", {
40
- enumerable: true,
41
- get: function () { return chunk3MJPASQU_js.ModalTrigger; }
42
- });
43
- Object.defineProperty(exports, "modalContentVariants", {
44
- enumerable: true,
45
- get: function () { return chunk3MJPASQU_js.modalContentVariants; }
46
- });
47
- Object.defineProperty(exports, "modalOverlayVariants", {
48
- enumerable: true,
49
- get: function () { return chunk3MJPASQU_js.modalOverlayVariants; }
50
- });
51
- //# sourceMappingURL=index.js.map
1
+ "use client";
2
+ 'use strict';var react=require('react'),reactAriaComponents=require('react-aria-components'),lucideReact=require('lucide-react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime');function d(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var M=classVarianceAuthority.cva(["relative","bg-[var(--content-background)]","text-[var(--content-foreground)]","rounded-lg","shadow-lg","p-6","w-full","outline-none","mx-4","sm:mx-0"],{variants:{size:{sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-2xl",full:"max-w-full min-h-screen rounded-none"},animation:{"fade-zoom":"animate-fadeIn",fade:"animate-fadeIn",slide:"animate-slideUp",none:""}},defaultVariants:{size:"md",animation:"fade-zoom"}}),g=classVarianceAuthority.cva(["fixed","inset-0","z-50","flex","items-center","justify-center","bg-black/50","backdrop-blur-sm"],{variants:{animation:{"fade-zoom":"animate-fadeIn",fade:"animate-fadeIn",slide:"animate-fadeIn",none:""}},defaultVariants:{animation:"fade-zoom"}});var R=react.createContext(void 0);function h({children:e,defaultOpen:a,isOpen:r,onOpenChange:s,role:i="dialog"}){let l=react.Children.toArray(e);if(process.env.NODE_ENV!=="production"){let o=l.some(n=>react.isValidElement(n)&&(n.type===m||n.type.displayName==="ModalTrigger")),P=l.some(n=>react.isValidElement(n)&&(n.type===c||n.type.displayName==="ModalContent"));if(!o||!P)throw new Error("Modal requires exactly one Modal.Trigger and one Modal.Content as children")}let f=l.find(o=>react.isValidElement(o)&&(o.type===m||o.type.displayName==="ModalTrigger")),u=l.find(o=>react.isValidElement(o)&&(o.type===c||o.type.displayName==="ModalContent")),y=f,x=react.isValidElement(y)?y.props.children:null,C=u;return jsxRuntime.jsx(R.Provider,{value:{role:i},children:jsxRuntime.jsxs(reactAriaComponents.DialogTrigger,{defaultOpen:a,isOpen:r,onOpenChange:s,children:[x,C]})})}h.displayName="Modal";function m({children:e}){return e}m.displayName="ModalTrigger";function c({children:e,size:a="md",animation:r="fade-zoom",animationDuration:s=200,isDismissable:i=true,isKeyboardDismissDisabled:l=false,showClose:f=true,className:u}){let x=react.useContext(R)?.role??"dialog",C=g({animation:r}),o=M({size:a,animation:r}),P=d(o,u);return jsxRuntime.jsx(reactAriaComponents.ModalOverlay,{isDismissable:i,isKeyboardDismissDisabled:l,className:C,children:jsxRuntime.jsx(reactAriaComponents.Modal,{className:P,style:{transitionDuration:`${s}ms`},children:jsxRuntime.jsx(reactAriaComponents.Dialog,{role:x,className:"outline-none",children:({close:n})=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[f&&jsxRuntime.jsx(reactAriaComponents.Button,{onPress:n,className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-[var(--content-background)] transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-[var(--ring)] focus:ring-offset-2 disabled:pointer-events-none min-h-[44px] min-w-[44px]","aria-label":"Close modal",children:jsxRuntime.jsx(lucideReact.X,{className:"h-4 w-4","aria-hidden":"true"})}),e]})})})})}c.displayName="ModalContent";function v(e){return null}v.displayName="ModalOverlay";function N({children:e,className:a}){return jsxRuntime.jsx("div",{className:d("flex flex-col space-y-1.5 text-center sm:text-left",a),children:e})}N.displayName="ModalHeader";function O({children:e,as:a="h2",className:r}){return jsxRuntime.jsx(reactAriaComponents.Heading,{slot:"title",level:parseInt(a[1]??"2"),className:d("text-lg font-semibold leading-none tracking-tight",r),children:e})}O.displayName="ModalTitle";function V({children:e,className:a}){return jsxRuntime.jsx("p",{slot:"description",className:d("text-sm text-[var(--menu-muted)]",a),children:e})}V.displayName="ModalDescription";function E({children:e,className:a}){return jsxRuntime.jsx("div",{className:d("flex flex-col-reverse sm:flex-row sm:justify-end gap-2",a),children:e})}E.displayName="ModalFooter";function T({children:e}){let a=react.useContext(reactAriaComponents.OverlayTriggerStateContext);if(!a)throw new Error("Modal.Close must be used inside Modal.Content");if(!react.isValidElement(e))throw new Error("Modal.Close requires a valid React element as a child");let r=e,s=()=>{a.close();},i=r.props?.onPress;return react.cloneElement(r,{onPress:i?()=>{i(),s();}:s})}T.displayName="ModalClose";var X=Object.assign(h,{Trigger:m,Content:c,Overlay:v,Header:N,Title:O,Description:V,Footer:E,Close:T});exports.Modal=X;exports.ModalClose=T;exports.ModalContent=c;exports.ModalDescription=V;exports.ModalFooter=E;exports.ModalHeader=N;exports.ModalOverlay=v;exports.ModalTitle=O;exports.ModalTrigger=m;exports.modalContentVariants=M;exports.modalOverlayVariants=g;//# sourceMappingURL=index.js.map
52
3
  //# sourceMappingURL=index.js.map