@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/schemas/BaseComponentProps.ts","../../../src/elements/Card/Card.types.ts","../../../src/elements/Card/Card.tsx"],"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","BaseComponentPropsSchema","z","FlipButtonPositionSchema","FlipButtonLabelSchema","FlipButtonIconSchema","CardPropsSchema","CardHeaderPropsSchema","CardTitlePropsSchema","CardDescriptionPropsSchema","CardContentPropsSchema","CardFooterPropsSchema","CardActionPropsSchema","flipButtonPositionVariants","Card","flippable","backContent","controlledFlipped","defaultFlipped","onFlipChange","flipButtonPosition","flipButtonLabel","flipButtonIcon","flipDuration","rest","internalFlipped","setInternalFlipped","useState","isControlled","flipped","handleFlip","useCallback","newState","showLabel","hideLabel","defaultIcon","RotateCcw","frontIcon","backIcon","FlipButton","label","icon","CardHeader","CardTitle","Comp","CardDescription","CardContent","CardFooter","CardAction"],"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","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { cva } from 'class-variance-authority';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode } from 'react';\n\n/**\n * Flip button position variants\n * Controls where the flip button appears on the card\n *\n * @see card-prd.md US-5 (Flip Button Position)\n */\nexport const FlipButtonPositionSchema = z.enum([\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n]);\nexport type FlipButtonPosition = z.infer<typeof FlipButtonPositionSchema>;\n\n/**\n * Flip button label configuration\n * Custom labels for the flip button title attribute\n *\n * @see card-prd.md US-6 (Custom Labels)\n */\nexport const FlipButtonLabelSchema = z.object({\n show: z.string().optional(),\n hide: z.string().optional(),\n});\nexport type FlipButtonLabel = z.infer<typeof FlipButtonLabelSchema>;\n\n/**\n * Flip button icon configuration\n * Custom icons for the front and back flip buttons\n */\nexport const FlipButtonIconSchema = z.object({\n /** Icon to show on front side button (default: RotateCcw) */\n front: z.custom<ReactNode>().optional(),\n /** Icon to show on back side button (default: same as front or RotateCcw) */\n back: z.custom<ReactNode>().optional(),\n});\nexport type FlipButtonIcon = z.infer<typeof FlipButtonIconSchema>;\n\n/**\n * Card root component props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n * @see card-prd.md US-2 (Flippable Card)\n * @see card-prd.md US-3 (Controlled/Uncontrolled State)\n */\nexport const CardPropsSchema = BaseComponentPropsSchema.extend({\n // Flip functionality\n /** Enable flip animation feature */\n flippable: z.boolean().optional().default(false),\n\n /** Content to display on the back side of the card */\n backContent: z.custom<ReactNode>().optional(),\n\n /** Controlled mode: current flip state */\n isFlipped: z.boolean().optional(),\n\n /** Uncontrolled mode: initial flip state */\n defaultFlipped: z.boolean().optional().default(false),\n\n /** Callback fired when flip state changes */\n onFlipChange: z.custom<(isFlipped: boolean) => void>().optional(),\n\n // Flip button configuration\n /** Position of the flip button on the card */\n flipButtonPosition: FlipButtonPositionSchema.optional().default('top-right'),\n\n /** Custom labels for the flip button title attribute */\n flipButtonLabel: FlipButtonLabelSchema.optional(),\n\n /** Custom icons for the flip button (default: RotateCcw) */\n flipButtonIcon: FlipButtonIconSchema.optional(),\n\n /** Duration of flip animation in milliseconds */\n flipDuration: z.number().optional().default(600),\n});\n\nexport type CardProps = z.infer<typeof CardPropsSchema>;\n\n/**\n * CardHeader props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardHeaderPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport type CardHeaderProps = z.infer<typeof CardHeaderPropsSchema>;\n\n/**\n * CardTitle props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardTitlePropsSchema = BaseComponentPropsSchema.extend({\n /** Heading level (h1-h6) - defaults to h3 */\n as: z.enum(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']).optional().default('h3'),\n\n children: z.custom<ReactNode>(),\n});\n\nexport type CardTitleProps = z.infer<typeof CardTitlePropsSchema>;\n\n/**\n * CardDescription props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardDescriptionPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport type CardDescriptionProps = z.infer<typeof CardDescriptionPropsSchema>;\n\n/**\n * CardContent props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardContentPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport type CardContentProps = z.infer<typeof CardContentPropsSchema>;\n\n/**\n * CardFooter props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardFooterPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport type CardFooterProps = z.infer<typeof CardFooterPropsSchema>;\n\n/**\n * CardAction props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardActionPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport type CardActionProps = z.infer<typeof CardActionPropsSchema>;\n\n/**\n * CVA variants for flip button positioning\n *\n * Provides consistent positioning classes for the flip button\n * based on the flipButtonPosition prop.\n *\n * Buttons are rendered INSIDE both front and back sides so they\n * flip along with the card content for a more natural feel.\n *\n * @see card-prd.md US-5 (Flip Button Position)\n */\nexport const flipButtonPositionVariants = cva(\n [\n 'absolute z-10 min-h-[44px] min-w-[44px] p-2',\n 'flex items-center justify-center',\n 'rounded-full bg-[var(--accent-background)]',\n 'text-[var(--primary-action)] hover:text-[var(--primary-action-hover)]',\n 'transition-colors duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]',\n ],\n {\n variants: {\n position: {\n 'top-right': 'top-2 right-2',\n 'top-left': 'top-2 left-2',\n 'bottom-right': 'bottom-2 right-2',\n 'bottom-left': 'bottom-2 left-2',\n },\n },\n defaultVariants: {\n position: 'top-right',\n },\n }\n);\n","'use client';\n\n/**\n * Card Component (TDD Stub)\n *\n * This is a minimal stub to allow tests to run during the RED phase.\n * Full implementation will be added in the GREEN phase.\n *\n * @see card-prd.md (Product Requirements)\n * @see plan.md (Implementation Plan)\n */\n\nimport { forwardRef, useState, useCallback, type HTMLAttributes, type ReactNode } from 'react';\nimport { RotateCcw } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport {\n flipButtonPositionVariants,\n type CardProps,\n type CardHeaderProps,\n type CardTitleProps,\n type CardDescriptionProps,\n type CardContentProps,\n type CardFooterProps,\n type CardActionProps,\n} from './Card.types';\n\n// ============================================================================\n// Card (Root Component)\n// ============================================================================\n\nexport const Card = forwardRef<HTMLElement, CardProps & HTMLAttributes<HTMLElement>>(\n (props, ref) => {\n const {\n children,\n className,\n flippable = false,\n backContent,\n isFlipped: controlledFlipped,\n defaultFlipped = false,\n onFlipChange,\n flipButtonPosition = 'top-right',\n flipButtonLabel,\n flipButtonIcon,\n flipDuration = 600,\n ...rest\n } = props;\n\n // Controlled/uncontrolled state\n const [internalFlipped, setInternalFlipped] = useState(defaultFlipped);\n const isControlled = controlledFlipped !== undefined;\n const flipped = isControlled ? controlledFlipped : internalFlipped;\n\n const handleFlip = useCallback(() => {\n const newState = !flipped;\n if (!isControlled) {\n setInternalFlipped(newState);\n }\n onFlipChange?.(newState);\n }, [flipped, isControlled, onFlipChange]);\n\n // Non-flippable card\n if (!flippable) {\n return (\n <article\n ref={ref}\n className={cn(\n 'rounded-lg border border-[var(--border)] bg-[var(--content-background)] text-[var(--content-foreground)] shadow-sm',\n className\n )}\n {...rest}\n >\n {children}\n </article>\n );\n }\n\n // Flippable card\n const showLabel = flipButtonLabel?.show ?? 'Show more details';\n const hideLabel = flipButtonLabel?.hide ?? 'Show less details';\n\n // Default icon\n const defaultIcon = <RotateCcw className=\"h-5 w-5\" aria-hidden=\"true\" />;\n // Custom icons (back defaults to front if not specified)\n const frontIcon = flipButtonIcon?.front ?? defaultIcon;\n const backIcon = flipButtonIcon?.back ?? flipButtonIcon?.front ?? defaultIcon;\n\n // Flip button component - rendered on both front and back\n const FlipButton = ({ label, icon }: { label: string; icon: ReactNode }) => (\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n aria-hidden={true}\n excludeFromTabOrder\n onPress={handleFlip}\n className={flipButtonPositionVariants({ position: flipButtonPosition })}\n aria-label={label}\n >\n {icon}\n </Button>\n );\n\n return (\n <article\n ref={ref}\n className={cn('relative', className)}\n style={{ perspective: '1000px' }}\n {...rest}\n >\n {/* Flipper container - handles 3D transform */}\n <div\n className={cn(\n 'relative transition-transform',\n 'motion-reduce:transition-none'\n )}\n style={{\n transformStyle: 'preserve-3d',\n transitionDuration: `${flipDuration}ms`,\n transform: flipped ? 'rotateY(180deg)' : 'rotateY(0deg)',\n }}\n data-flipped={flipped}\n >\n {/* Front side */}\n <div\n className=\"relative rounded-lg border border-[var(--border)] bg-[var(--content-background)] text-[var(--content-foreground)] shadow-sm\"\n style={{ backfaceVisibility: 'hidden' }}\n data-side=\"front\"\n >\n {children}\n <FlipButton label={showLabel} icon={frontIcon} />\n </div>\n\n {/* Back side - scrollable if content overflows */}\n <div\n className=\"absolute inset-0 overflow-y-auto rounded-lg border border-[var(--border)] bg-[var(--content-background)] text-[var(--content-foreground)] shadow-sm\"\n style={{\n backfaceVisibility: 'hidden',\n transform: 'rotateY(180deg)',\n }}\n data-side=\"back\"\n >\n {backContent}\n <FlipButton label={hideLabel} icon={backIcon} />\n </div>\n </div>\n </article>\n );\n }\n);\n\nCard.displayName = 'Card';\n\n// ============================================================================\n// CardHeader\n// ============================================================================\n\nexport const CardHeader = forwardRef<HTMLElement, CardHeaderProps & HTMLAttributes<HTMLElement>>(\n ({ className, children, ...props }, ref) => (\n <header\n ref={ref}\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n >\n {children}\n </header>\n )\n);\n\nCardHeader.displayName = 'CardHeader';\n\n// ============================================================================\n// CardTitle\n// ============================================================================\n\nexport const CardTitle = forwardRef<HTMLHeadingElement, CardTitleProps & HTMLAttributes<HTMLHeadingElement>>(\n ({ className, as: Comp = 'h3', children, ...props }, ref) => (\n <Comp\n ref={ref}\n className={cn('text-2xl font-semibold leading-none tracking-tight', className)}\n {...props}\n >\n {children}\n </Comp>\n )\n);\n\nCardTitle.displayName = 'CardTitle';\n\n// ============================================================================\n// CardDescription\n// ============================================================================\n\nexport const CardDescription = forwardRef<HTMLParagraphElement, CardDescriptionProps & HTMLAttributes<HTMLParagraphElement>>(\n ({ className, children, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-[var(--content-foreground-muted)]', className)}\n {...props}\n >\n {children}\n </p>\n )\n);\n\nCardDescription.displayName = 'CardDescription';\n\n// ============================================================================\n// CardContent\n// ============================================================================\n\nexport const CardContent = forwardRef<HTMLDivElement, CardContentProps & HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props}>\n {children}\n </div>\n )\n);\n\nCardContent.displayName = 'CardContent';\n\n// ============================================================================\n// CardFooter\n// ============================================================================\n\nexport const CardFooter = forwardRef<HTMLElement, CardFooterProps & HTMLAttributes<HTMLElement>>(\n ({ className, children, ...props }, ref) => (\n <footer\n ref={ref}\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n >\n {children}\n </footer>\n )\n);\n\nCardFooter.displayName = 'CardFooter';\n\n// ============================================================================\n// CardAction\n// ============================================================================\n\nexport const CardAction = forwardRef<HTMLDivElement, CardActionProps & HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('ml-auto', className)}\n {...props}\n >\n {children}\n </div>\n )\n);\n\nCardAction.displayName = 'CardAction';\n"]}
@@ -1,13 +1,3 @@
1
- /**
2
- * Carousel Component
3
- * Accessible carousel for displaying rotating content with React Node support
4
- *
5
- * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)
6
- */
7
- import { type ReactNode } from 'react';
8
1
  import type { CarouselProps } from './Carousel.types';
9
- export declare function Carousel({ items, autoRotateInterval, defaultIndex, currentIndex: controlledIndex, onIndexChange, isPaused: controlledIsPaused, onPauseChange, collapsible, defaultMinimized, isMinimized: controlledIsMinimized, onMinimizeChange, minimizedLabel, label, slideLabel, showNavigation, showPlayPause, respectReducedMotion, className, slideClassName, navigationClassName, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, itemDurations, elapsedTime: controlledElapsedTime, onElapsedTimeChange, ...props }: CarouselProps): ReactNode;
10
- export declare namespace Carousel {
11
- var displayName: string;
12
- }
2
+ export declare const Carousel: import("react").NamedExoticComponent<CarouselProps>;
13
3
  //# sourceMappingURL=Carousel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Carousel.d.ts","sourceRoot":"","sources":["../../../src/elements/Carousel/Carousel.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI1F,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,kBAAkB,CAAC;AAiFpE,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,kBAAyB,EACzB,YAAgB,EAChB,YAAY,EAAE,eAAe,EAC7B,aAAa,EACb,QAAQ,EAAE,kBAAkB,EAC5B,aAAa,EACb,WAAmB,EACnB,gBAAwB,EACxB,WAAW,EAAE,qBAAqB,EAClC,gBAAgB,EAChB,cAAuC,EACvC,KAAkB,EAClB,UAAU,EACV,cAAqB,EACrB,aAAoB,EACpB,oBAA2B,EAC3B,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EAEjC,aAAa,EACb,WAAW,EAAE,qBAAqB,EAClC,mBAAmB,EACnB,GAAG,KAAK,EACT,EAAE,aAAa,GAAG,SAAS,CAiY3B;yBA7Ze,QAAQ"}
1
+ {"version":3,"file":"Carousel.d.ts","sourceRoot":"","sources":["../../../src/elements/Carousel/Carousel.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,kBAAkB,CAAC;AAiFpE,eAAO,MAAM,QAAQ,qDA6ZnB,CAAC"}
@@ -23,7 +23,7 @@
23
23
  * ```
24
24
  */
25
25
  import { type ReactElement, type ComponentProps } from 'react';
26
- declare const Carousel: import("react").LazyExoticComponent<typeof import("./Carousel").Carousel>;
26
+ declare const Carousel: import("react").LazyExoticComponent<import("react").NamedExoticComponent<import("./Carousel.types").CarouselProps>>;
27
27
  type CarouselProps = ComponentProps<typeof Carousel>;
28
28
  export interface LazyCarouselProps extends CarouselProps {
29
29
  /** Minimum viewport width to load the carousel (default: 1024 for lg breakpoint) */
@@ -1 +1 @@
1
- {"version":3,"file":"LazyCarousel.d.ts","sourceRoot":"","sources":["../../../src/elements/Carousel/LazyCarousel.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAuB,KAAK,YAAY,EAAE,KAAK,cAAc,EAA4B,MAAM,OAAO,CAAC;AAI9G,QAAA,MAAM,QAAQ,2EAEb,CAAC;AAEF,KAAK,aAAa,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC;AAErD,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAe,EACf,aAAoB,EACpB,GAAG,KAAK,EACT,EAAE,iBAAiB,GAAG,YAAY,GAAG,IAAI,CA4CzC"}
1
+ {"version":3,"file":"LazyCarousel.d.ts","sourceRoot":"","sources":["../../../src/elements/Carousel/LazyCarousel.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAuB,KAAK,YAAY,EAAE,KAAK,cAAc,EAA4B,MAAM,OAAO,CAAC;AAI9G,QAAA,MAAM,QAAQ,qHAEb,CAAC;AAEF,KAAK,aAAa,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAC;AAErD,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAe,EACf,aAAoB,EACpB,GAAG,KAAK,EACT,EAAE,iBAAiB,GAAG,YAAY,GAAG,IAAI,CA4CzC"}
@@ -1,23 +1,3 @@
1
- 'use strict';
2
-
3
- var chunkWIUOB36M_js = require('../../chunk-WIUOB36M.js');
4
- var chunkZVKXFELU_js = require('../../chunk-ZVKXFELU.js');
5
- require('../../chunk-A6KEDVUR.js');
6
- require('../../chunk-3YOY2VJ6.js');
7
- require('../../chunk-Y3GT7ETK.js');
8
- require('../../chunk-B5Q4UPL6.js');
9
- require('../../chunk-VIREG536.js');
10
- require('../../chunk-T4COXKQ3.js');
11
-
12
-
13
-
14
- Object.defineProperty(exports, "LazyCarousel", {
15
- enumerable: true,
16
- get: function () { return chunkWIUOB36M_js.LazyCarousel; }
17
- });
18
- Object.defineProperty(exports, "Carousel", {
19
- enumerable: true,
20
- get: function () { return chunkZVKXFELU_js.Carousel; }
21
- });
22
- //# sourceMappingURL=index.js.map
1
+ "use client";
2
+ 'use strict';var clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),classVarianceAuthority=require('class-variance-authority'),react=require('react'),reactAriaComponents=require('react-aria-components'),lucideReact=require('lucide-react'),jsxRuntime=require('react/jsx-runtime');var Ke=Object.defineProperty;var C=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ze=(t,e)=>{for(var r in e)Ke(t,r,{get:e[r],enumerable:true});};function b(...t){return tailwindMerge.twMerge(clsx.clsx(t))}var W=C(()=>{});var oe,ne,ye=C(()=>{oe=classVarianceAuthority.cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),ne=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80",outline:"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]",link:"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-8",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});});var ae,ie,Y,F,Ne=C(()=>{ae="data-[pressed]:scale-[0.97]",ie="data-[hovered]:shadow-md",Y="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",F="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";});function Ee(){return react.useContext(Ce)}function Ie(){return react.useContext(Te)}var Ce,Te,Pe=C(()=>{"use client";Ce=react.createContext(null);Ce.displayName="ButtonGroupContext";Te=react.createContext(null);Te.displayName="ButtonGroupItemContext";});var Be,ze=C(()=>{classVarianceAuthority.cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}}),Be=classVarianceAuthority.cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}}),classVarianceAuthority.cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});});var P,_e=C(()=>{"use client";W();ye();Ne();Pe();ze();P=react.memo(react.forwardRef(({className:t,buttonVisualClassName:e,variant:r,size:a,visualSize:h,fullWidth:n,loading:w=false,loadingText:s="Loading...",shortcut:E,children:V,isDisabled:T,paywall:g=false,paywallRedirect:G,paywallDescription:Z,onPress:R,...O},j)=>{let L=react.useId(),I=Ee(),$=Ie(),J=r??I?.variant??"default",Q=a??I?.size,X=T??I?.isDisabled??false,l=I?.orientation==="vertical",B=n||l,z=$?Be({orientation:I?.orientation??"horizontal",position:$.position}):"",M=h??Q??"default";return process.env.NODE_ENV!=="production"&&(M==="dot"||M==="icon")&&!O["aria-label"]&&!V&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsxRuntime.jsx(reactAriaComponents.Button,{ref:j,isDisabled:X||w||void 0,"aria-disabled":g?true:void 0,"aria-describedby":g?L:void 0,onPress:y=>{if(g){G&&window.open(G,"_blank","noopener,noreferrer");return}R?.(y);},className:b(oe({fullWidth:B,inVerticalGroup:l}),t),...O,children:y=>jsxRuntime.jsxs("span",{className:b(ne({variant:J,visualSize:M,paywall:g,fullWidth:B}),z,e,ae,ie,Y,F),"data-pressed":y.isPressed||void 0,children:[w&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(lucideReact.Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"sr-only","aria-live":"polite",children:s})]}),!w&&V,g&&jsxRuntime.jsx(lucideReact.Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),g&&jsxRuntime.jsxs("span",{id:L,className:"sr-only",children:["Premium feature: ",Z||"Upgrade required to access this feature"]}),y.isFocusVisible&&E&&jsxRuntime.jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:E}),y.isPressed&&jsxRuntime.jsx("span",{className:"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95","aria-hidden":"true"})]})})}));P.displayName="Button";});var ke=C(()=>{_e();});var He={};Ze(He,{Carousel:()=>exports.Carousel});function Me(t){let e=0;return t.map((r,a)=>{let h=e,n=Math.max(r,ct);return e+=n,{index:a,startTime:h,endTime:e}})}function Ae(t,e){if(t.length===0)return 0;let r=t[t.length-1]?.endTime??0;if(r===0)return 0;let a=e%r;return t.find(n=>a>=n.startTime&&a<n.endTime)?.index??0}function ft(t,e,r){return r===0||!e||e.length===0?false:e.length!==t?(console.warn("Carousel: itemDurations length does not match items length. Falling back to autoRotateInterval."),false):true}var ct,Le;exports.Carousel=void 0;var pe=C(()=>{"use client";ke();W();ct=1e3,Le=1e3;exports.Carousel=react.memo(function({items:e,autoRotateInterval:r=5e3,defaultIndex:a=0,currentIndex:h,onIndexChange:n,isPaused:w,onPauseChange:s,collapsible:E=false,defaultMinimized:V=false,isMinimized:T,onMinimizeChange:g,minimizedLabel:G="Carousel (minimized)",label:Z="Carousel",slideLabel:R,showNavigation:O=true,showPlayPause:j=true,respectReducedMotion:L=true,className:I,slideClassName:$,navigationClassName:J,"aria-label":Q,"aria-labelledby":X,itemDurations:l,elapsedTime:B,onElapsedTimeChange:z,...M}){let p=h!==void 0,m=w!==void 0,y=T!==void 0,_=B!==void 0,[De,D]=react.useState(a),[Ue,U]=react.useState(false),[We,Ye]=react.useState(V),[Vt,ve]=react.useState(()=>!l||l.length===0||l.length!==e.length||a===0?0:Me(l)[a]?.startTime??0),ee=react.useRef(false),u=p?h:De,c=m?w:Ue,S=y?T:We,v=react.useMemo(()=>ft(e.length,l,r),[e.length,l,r]),f=react.useMemo(()=>!v||!l?[]:Me(l),[v,l]),te=react.useMemo(()=>f.length===0?0:f[f.length-1]?.endTime??0,[f]),Fe=react.useCallback(o=>{if(p?n?.(o):D(o),v&&f[o]){let i=f[o].startTime;_||ve(i),z?.(i);}m?s?.(true):U(true);},[p,m,_,n,s,z,v,f]),qe=react.useCallback(()=>{let o=!c;m?s?.(o):U(o);},[c,m,s]),be=react.useCallback(()=>{let o=!S;o?ee.current=!c:(ee.current&&c&&(m?s?.(false):U(false)),ee.current=false),y?g?.(o):Ye(o);},[S,y,g,c,m,s]);react.useEffect(()=>{r!==0&&L&&typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches&&(m?s?.(true):U(true));},[r,L,m,s]);let xe=react.useRef(u);xe.current=u,react.useEffect(()=>{if(!v||r===0||c||S||_)return;let o=setInterval(()=>{ve(i=>{let A=i+Le;te>0&&A>=te&&(A=0),z?.(A);let re=Ae(f,A);return re!==xe.current&&(p?n?.(re):D(re)),A});},Le);return ()=>clearInterval(o)},[v,r,c,S,_,te,f,p,n,z]),react.useEffect(()=>{if(v||r===0||c||S)return;let o=setInterval(()=>{let i=(u+1)%e.length;p?n?.(i):D(i);},r);return ()=>clearInterval(o)},[v,r,u,c,S,e.length,p,n]),react.useEffect(()=>{if(!v||!_)return;let o=Ae(f,B);o!==u&&(p?n?.(o):D(o));},[v,_,B,f,u,p,n]);let he=R?R(u,e.length):`Slide ${u+1} of ${e.length}`;return jsxRuntime.jsx("div",{className:b("flex flex-col mb-4 transition-all duration-300",!S&&"space-y-4",I),role:"region","aria-roledescription":"carousel","aria-label":S?G:Q||Z,"aria-labelledby":X,...M,children:S&&E?jsxRuntime.jsxs("div",{className:b("bg-[var(--primary)] rounded-lg px-4 py-2 shadow-md","flex items-center justify-between gap-4"),children:[jsxRuntime.jsxs("span",{className:"text-[var(--primary-foreground)] text-sm",children:[G," - ",he]}),jsxRuntime.jsx(P,{variant:"outline",visualSize:"icon",onPress:be,"aria-label":"Expand carousel","aria-expanded":false,children:jsxRuntime.jsx(lucideReact.ChevronUpIcon,{className:"w-5 h-5"})})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:b("bg-[var(--primary)] rounded-lg p-4 overflow-hidden shadow-md","slide-in-animation",$),role:"group","aria-roledescription":"slide","aria-label":he,"aria-live":"polite","aria-atomic":"true",children:jsxRuntime.jsx("div",{className:"text-[var(--primary-foreground)] min-h-[2rem] flex items-center",children:e[u]})},u),jsxRuntime.jsxs("div",{className:"flex items-center justify-between gap-4",children:[O&&jsxRuntime.jsx("div",{className:b("flex items-center",J),role:"group","aria-label":"Slide navigation",children:e.map((o,i)=>jsxRuntime.jsx(P,{variant:i===u?"default":"outline",visualSize:"dot",onPress:()=>Fe(i),"aria-label":`Go to slide ${i+1}`,"aria-current":i===u?true:void 0},i))}),jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[E&&jsxRuntime.jsx(P,{variant:"default",visualSize:"icon",onPress:be,"aria-label":"Minimize carousel","aria-expanded":true,children:jsxRuntime.jsx(lucideReact.ChevronDownIcon,{className:"w-5 h-5"})}),j&&r>0&&jsxRuntime.jsx(P,{variant:"default",visualSize:"icon",onPress:qe,"aria-label":c?"Play carousel":"Pause carousel",children:c?jsxRuntime.jsx(lucideReact.PlayIcon,{className:"w-5 h-5"}):jsxRuntime.jsx(lucideReact.PauseIcon,{className:"w-5 h-5"})})]})]})]})})});exports.Carousel.displayName="Carousel";});pe();W();var Oe=classVarianceAuthority.cva("animate-pulse bg-[var(--accent-background)] relative",{variants:{variant:{rectangle:"rounded-md",circle:"rounded-full",text:"rounded-sm h-4"}},defaultVariants:{variant:"rectangle"}}),N=react.memo(react.forwardRef(({className:t,variant:e,...r},a)=>jsxRuntime.jsx("div",{ref:a,role:"status","aria-live":"polite","aria-busy":"true",className:b(Oe({variant:e}),t),...r,children:jsxRuntime.jsx("span",{className:"sr-only",children:"Loading..."})})));N.displayName="Skeleton";var St=react.lazy(()=>Promise.resolve().then(()=>(pe(),He)).then(t=>({default:t.Carousel})));function Nt(){return jsxRuntime.jsxs("div",{className:"flex flex-col gap-4 p-4",children:[jsxRuntime.jsx(N,{className:"h-8 w-3/4"}),jsxRuntime.jsx(N,{className:"h-4 w-full"}),jsxRuntime.jsx(N,{className:"h-4 w-5/6"}),jsxRuntime.jsxs("div",{className:"flex gap-2 mt-4",children:[jsxRuntime.jsx(N,{className:"h-3 w-3 rounded-full"}),jsxRuntime.jsx(N,{className:"h-3 w-3 rounded-full"}),jsxRuntime.jsx(N,{className:"h-3 w-3 rounded-full"})]})]})}function wt({minWidth:t=1024,preserveState:e=true,...r}){let[a,h]=react.useState(false),[n,w]=react.useState(false),[s,E]=react.useState(false);return react.useEffect(()=>{E(true);let V=()=>{let T=window.innerWidth>=t;h(T),T&&w(true);};return V(),window.addEventListener("resize",V),()=>window.removeEventListener("resize",V)},[t]),!s||!n&&!a?null:jsxRuntime.jsx(react.Activity,{mode:e&&!a?"hidden":"visible",children:jsxRuntime.jsx(react.Suspense,{fallback:jsxRuntime.jsx(Nt,{}),children:jsxRuntime.jsx(St,{...r})})})}exports.LazyCarousel=wt;//# sourceMappingURL=index.js.map
23
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/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/elements/Button/index.ts","../../../src/elements/Carousel/Carousel.tsx","../../../src/elements/Carousel/index.ts","../../../src/elements/Skeleton/Skeleton.tsx","../../../src/elements/Carousel/LazyCarousel.tsx"],"names":["cn","inputs","twMerge","clsx","init_cn","__esmMin","buttonOuterVariants","buttonVisualVariants","init_Button_styles","cva","PRESSED_STYLES","HOVER_STYLES","HIGH_CONTRAST_HOVER","HIGH_CONTRAST_PRESSED","init_interaction_states","useButtonGroupContext","useContext","ButtonGroupContext","useButtonGroupItemContext","ButtonGroupItemContext","init_ButtonGroupContext","createContext","buttonGroupItemVariants","init_ButtonGroup_variants","Button","init_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","Carousel_exports","__export","Carousel","buildManifest","durations","cumulative","duration","index","start","safeDuration","MIN_ITEM_DURATION_MS","getCurrentItemIndex","manifest","elapsed","totalDuration","normalizedElapsed","m","shouldUsePerItemTiming","itemsLength","itemDurations","autoRotateInterval","TIMER_CHECK_INTERVAL_MS","init_Carousel","items","defaultIndex","controlledIndex","onIndexChange","controlledIsPaused","onPauseChange","collapsible","defaultMinimized","controlledIsMinimized","onMinimizeChange","minimizedLabel","label","slideLabel","showNavigation","showPlayPause","respectReducedMotion","slideClassName","navigationClassName","ariaLabel","ariaLabelledBy","controlledElapsedTime","onElapsedTimeChange","isControlled","isPauseControlled","isMinimizedControlled","isElapsedTimeControlled","internalIndex","setInternalIndex","useState","internalIsPaused","setInternalIsPaused","internalIsMinimized","setInternalIsMinimized","_internalElapsedTime","setInternalElapsedTime","wasPlayingBeforeMinimize","useRef","currentIndex","isPaused","isMinimized","usePerItemTiming","useMemo","goToSlide","useCallback","newElapsed","togglePause","newPauseState","toggleMinimize","newMinimizedState","useEffect","currentIndexRef","interval","prevElapsed","newIndex","nextIndex","currentSlideLabel","ChevronUpIcon","_","ChevronDownIcon","PlayIcon","PauseIcon","skeletonVariants","Skeleton","lazy","mod","CarouselSkeleton","LazyCarousel","minWidth","preserveState","isVisible","setIsVisible","hasLoaded","setHasLoaded","isClient","setIsClient","checkViewport","visible","Activity","Suspense"],"mappings":"oaAcO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAA8B,CAClD,OAAOC,sBAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CAhBA,IAAAG,EAAAC,CAAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CCAA,IAWaC,EAAAA,CA0BAC,EAAAA,CArCbC,EAAAA,CAAAH,CAAAA,CAAA,IAAA,CAWaC,EAAAA,CAAsBG,2BACjC,yPAAA,CACA,CACE,QAAA,CAAU,CACR,SAAA,CAAW,CACT,KAAM,QAAA,CACN,KAAA,CAAO,EACT,CAAA,CACA,eAAA,CAAiB,CACf,IAAA,CAAM,eAAA,CACN,KAAA,CAAO,cACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,UAAW,KAAA,CACX,eAAA,CAAiB,KACnB,CACF,CACF,CAAA,CAQaF,GAAuBE,0BAAAA,CAClC,6NAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CACE,kKAAA,CACF,WAAA,CACE,oLAAA,CACF,OAAA,CACE,wIAAA,CACF,SAAA,CACE,2IAAA,CACF,KAAA,CACE,kGAAA,CACF,IAAA,CAAM,yGACR,CAAA,CACA,SAAA,CAAW,CACT,IAAA,CAAM,QAAA,CACN,KAAA,CAAO,EACT,CAAA,CACA,UAAA,CAAY,CACV,OAAA,CAAS,gBAAA,CACT,EAAA,CAAI,6BAAA,CACJ,EAAA,CAAI,sBAAA,CACJ,KAAM,WAAA,CACN,GAAA,CAAK,0CACP,CAAA,CACA,OAAA,CAAS,CACP,IAAA,CAAM,yIAAA,CACN,KAAA,CAAO,EACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,QAAS,SAAA,CACT,UAAA,CAAY,SAAA,CACZ,OAAA,CAAS,KACX,CACF,CACF,EAAA,CAAA,CAAA,CC5EA,IA8BaC,EAAAA,CAeAC,EAAAA,CAmBAC,EAMAC,CAAAA,CAtEbC,EAAAA,CAAAT,CAAAA,CAAA,KA8BaK,EAAAA,CAAiB,6BAAA,CAejBC,EAAAA,CAAe,0BAAA,CAmBfC,CAAAA,CAAsB,4FAAA,CAMtBC,CAAAA,CAAwB,gIA+BoC,CAAA,ECzDlE,SAASE,EAAAA,EAAwD,CACtE,OAAOC,gBAAAA,CAAWC,EAAkB,CACtC,CAmBO,SAASC,EAAAA,EAAgE,CAC9E,OAAOF,gBAAAA,CAAWG,EAAsB,CAC1C,CAnEA,IAoCMF,EAAAA,CAoBAE,GAxDNC,EAAAA,CAAAf,CAAAA,CAAA,IAAA,CAAA,YAAA,CAoCMY,EAAAA,CAAqBI,mBAAAA,CAA8C,IAAI,EAE7EJ,EAAAA,CAAmB,WAAA,CAAc,oBAAA,CAkB3BE,EAAAA,CACJE,mBAAAA,CAAkD,IAAI,EAExDF,EAAAA,CAAuB,WAAA,CAAc,yBAAA,CAAA,CAAA,CC3DrC,IA+CaG,EAAAA,CA/CbC,EAAAA,CAAAlB,CAAAA,CAAA,IAAA,CAuBmCI,0BAAAA,CAAI,gCAAA,CAAkC,CACvE,QAAA,CAAU,CACR,WAAA,CAAa,CACX,UAAA,CAAY,UAAA,CACZ,QAAA,CAAU,iBACZ,CACF,CAAA,CACA,gBAAiB,CACf,WAAA,CAAa,YACf,CACF,CAAC,CAAA,CAcYa,GAA0Bb,0BAAAA,CAAI,EAAA,CAAI,CAC7C,QAAA,CAAU,CACR,WAAA,CAAa,CAEX,UAAA,CAAY,cAAA,CAGZ,QAAA,CAAU,mBACZ,CAAA,CACA,QAAA,CAAU,CACR,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,IAAA,CAAM,EAAA,CACN,KAAM,EACR,CACF,CAAA,CACA,gBAAA,CAAkB,CAIhB,CACE,WAAA,CAAa,YAAA,CACb,QAAA,CAAU,OAAA,CACV,SAAA,CAAW,2BACb,CAAA,CACA,CACE,YAAa,YAAA,CACb,QAAA,CAAU,QAAA,CACV,SAAA,CAAW,yBACb,CAAA,CACA,CACE,WAAA,CAAa,YAAA,CACb,QAAA,CAAU,MAAA,CACV,SAAA,CAAW,gBACb,EAKA,CACE,WAAA,CAAa,UAAA,CACb,QAAA,CAAU,OAAA,CACV,SAAA,CAAW,2BACb,CAAA,CACA,CACE,WAAA,CAAa,UAAA,CACb,QAAA,CAAU,QAAA,CACV,SAAA,CAAW,yBACb,CAAA,CACA,CACE,WAAA,CAAa,UAAA,CACb,QAAA,CAAU,MAAA,CACV,UAAW,gBACb,CACF,CAAA,CACA,eAAA,CAAiB,CACf,WAAA,CAAa,aACb,QAAA,CAAU,MACZ,CACF,CAAC,CAAA,CAU2CA,0BAAAA,CAAI,oBAAA,CAAsB,CACpE,QAAA,CAAU,CACR,WAAA,CAAa,CACX,UAAA,CAAY,gBACZ,QAAA,CAAU,kBACZ,CACF,CAAA,CACA,eAAA,CAAiB,CACf,YAAa,YACf,CACF,CAAC,EAAA,CAAA,EC9HD,IA0CMe,CAAAA,CA1CNC,EAAAA,CAAApB,CAAAA,CAAA,IAAA,CAAA,YAAA,CAwBAD,CAAAA,EAAAA,CAEAI,KACAM,EAAAA,EAAAA,CACAM,EAAAA,EAAAA,CAIAG,EAAAA,EAAAA,CAUMC,CAAAA,CAASE,UAAAA,CAAKC,gBAAAA,CAClB,CACE,CACE,SAAA,CAAAC,CAAAA,CACA,qBAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,KAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,EAAU,KAAA,CACV,WAAA,CAAAC,CAAAA,CAAc,YAAA,CACd,QAAA,CAAAC,CAAAA,CACA,SAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CAAU,KAAA,CACV,eAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,GAAGC,CACL,EACAC,CAAAA,GACG,CACH,IAAMC,CAAAA,CAAuBC,WAAAA,EAAM,CAO7BC,EAAehC,EAAAA,EAAsB,CAGrCiC,CAAAA,CAAc9B,EAAAA,EAA0B,CAGxC+B,CAAAA,CAAmBnB,GAAWiB,CAAAA,EAAc,OAAA,EAAW,SAAA,CACvDG,CAAAA,CAAgBnB,CAAAA,EAAQgB,CAAAA,EAAc,IAAA,CACtCI,CAAAA,CAAsBb,CAAAA,EAAcS,CAAAA,EAAc,UAAA,EAAc,KAAA,CAGhEK,CAAAA,CAAoBL,CAAAA,EAAc,cAAgB,UAAA,CAClDM,CAAAA,CAAqBpB,CAAAA,EAAamB,CAAAA,CAGlCE,CAAAA,CAAoBN,CAAAA,CACtB1B,GAAwB,CACtB,WAAA,CAAayB,CAAAA,EAAc,WAAA,EAAe,YAAA,CAC1C,QAAA,CAAUC,EAAY,QACxB,CAAC,CAAA,CACD,EAAA,CAGEO,CAAAA,CAAsBvB,CAAAA,EAAckB,GAAiB,SAAA,CAG3D,OAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,GAAa,YAAA,GAExBK,IAAwB,KAAA,EAASA,CAAAA,GAAwB,MAAA,CAAA,EAC1D,CAACZ,CAAAA,CAAM,YAAY,GACnB,CAACN,CAAAA,EAED,OAAA,CAAQ,IAAA,CACN,uGACF,CAAA,CAyBFmB,eAACC,0BAAAA,CAAA,CACC,GAAA,CAAKb,CAAAA,CACL,UAAA,CALuBO,CAAAA,EAAuBjB,CAAAA,EAAW,MAAA,CAMzD,eAAA,CAAeK,CAAAA,CAAU,IAAA,CAAO,MAAA,CAChC,kBAAA,CAAkBA,CAAAA,CAAUM,EAAuB,MAAA,CACnD,OAAA,CArBiBa,CAAAA,EAAoE,CACvF,GAAInB,CAAAA,CAAS,CACPC,CAAAA,EACF,MAAA,CAAO,IAAA,CAAKA,CAAAA,CAAiB,QAAA,CAAU,qBAAqB,EAG9D,MACF,CACAE,CAAAA,GAAUgB,CAAC,EACb,CAAA,CAaI,SAAA,CAAW1D,CAAAA,CAAGM,EAAAA,CAAoB,CAAE,SAAA,CAAW+C,CAAAA,CAAoB,eAAA,CAAiBD,CAAkB,CAAC,CAAA,CAAGxB,CAAS,CAAA,CAClH,GAAGe,CAAAA,CAEH,QAAA,CAACgB,GAEAC,eAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAW5D,CAAAA,CACTO,EAAAA,CAAqB,CACnB,QAAS0C,CAAAA,CACT,UAAA,CAAYM,CAAAA,CACZ,OAAA,CAAAhB,CAAAA,CACA,SAAA,CAAWc,CACb,CAAC,CAAA,CAEDC,CAAAA,CACAzB,CAAAA,CAEAnB,EAAAA,CACAC,EAAAA,CACAC,CAAAA,CACAC,CACF,CAAA,CACA,cAAA,CAAc8C,CAAAA,CAAY,SAAA,EAAa,MAAA,CAMtC,QAAA,CAAA,CAAAzB,GACC0B,eAAAA,CAAAC,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAL,cAAAA,CAACM,mBAAAA,CAAA,CAAQ,SAAA,CAAU,0BAAA,CAA2B,aAAA,CAAY,MAAA,CAAO,CAAA,CACjEN,cAAAA,CAAC,QAAK,SAAA,CAAU,SAAA,CAAU,WAAA,CAAU,QAAA,CACjC,QAAA,CAAArB,CAAAA,CACH,GACF,CAAA,CAID,CAACD,CAAAA,EAAWG,CAAAA,CAGZE,CAAAA,EACCiB,cAAAA,CAACO,gBAAA,CACC,aAAA,CAAY,UAAA,CACZ,aAAA,CAAY,MAAA,CACZ,SAAA,CAAU,OACZ,CAAA,CAIDxB,CAAAA,EACCqB,eAAAA,CAAC,MAAA,CAAA,CAAK,EAAA,CAAIf,CAAAA,CAAsB,SAAA,CAAU,SAAA,CAAU,QAAA,CAAA,CAAA,mBAAA,CAChCJ,CAAAA,EAAsB,yCAAA,CAAA,CAC1C,CAAA,CAIDkB,CAAAA,CAAY,cAAA,EAAkBvB,GAC7BoB,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6CAAA,CACZ,QAAA,CAAApB,CAAAA,CACH,EAKDuB,CAAAA,CAAY,SAAA,EACXH,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAU,wGAAA,CACV,cAAY,MAAA,CACd,CAAA,CAAA,CAEJ,CAAA,CAEJ,CAEJ,CACF,CAAC,CAAA,CAEDhC,CAAAA,CAAO,WAAA,CAAc,SAAA,CAAA,CAAA,CCtNrB,IAAAC,EAAAA,CAAApB,CAAAA,CAAA,IAAA,CAcAoB,QCdA,IAAAuC,EAAAA,CAAA,EAAA,CAAAC,EAAAA,CAAAD,EAAAA,CAAA,CAAA,QAAA,CAAA,IAAAE,mBAgCA,SAASC,EAAAA,CAAcC,CAAAA,CAAqC,CAC1D,IAAIC,CAAAA,CAAa,CAAA,CACjB,OAAOD,CAAAA,CAAU,GAAA,CAAI,CAACE,CAAAA,CAAUC,CAAAA,GAAU,CACxC,IAAMC,CAAAA,CAAQH,CAAAA,CAERI,EAAe,IAAA,CAAK,GAAA,CAAIH,CAAAA,CAAUI,EAAoB,CAAA,CAC5D,OAAAL,GAAcI,CAAAA,CACP,CAAE,KAAA,CAAAF,CAAAA,CAAO,SAAA,CAAWC,CAAAA,CAAO,QAASH,CAAW,CACxD,CAAC,CACH,CAQA,SAASM,EAAAA,CAAoBC,CAAAA,CAA0BC,CAAAA,CAAyB,CAC9E,GAAID,CAAAA,CAAS,MAAA,GAAW,CAAA,CAAG,OAAO,CAAA,CAElC,IAAME,CAAAA,CAAgBF,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,OAAA,EAAW,CAAA,CAChE,GAAIE,CAAAA,GAAkB,CAAA,CAAG,OAAO,CAAA,CAGhC,IAAMC,CAAAA,CAAoBF,CAAAA,CAAUC,CAAAA,CAKpC,OAHaF,CAAAA,CAAS,IAAA,CACnBI,CAAAA,EAAMD,CAAAA,EAAqBC,CAAAA,CAAE,SAAA,EAAaD,CAAAA,CAAoBC,CAAAA,CAAE,OACnE,CAAA,EACa,KAAA,EAAS,CACxB,CASA,SAASC,EAAAA,CACPC,EACAC,CAAAA,CACAC,CAAAA,CACS,CAKT,OAHIA,CAAAA,GAAuB,CAAA,EAGvB,CAACD,CAAAA,EAAiBA,CAAAA,CAAc,MAAA,GAAW,CAAA,CAAU,KAAA,CAGrDA,CAAAA,CAAc,MAAA,GAAWD,CAAAA,EAC3B,OAAA,CAAQ,IAAA,CACN,iGAEF,CAAA,CACO,KAAA,EAGF,IACT,CA5FA,IAmBMR,EAAAA,CAMAW,EAAAA,CAqEOnB,uBAAAA,KA9FboB,EAAAA,CAAAjF,CAAAA,CAAA,kBAUAoB,EAAAA,EAAAA,CAEArB,CAAAA,EAAAA,CAOMsE,EAAAA,CAAuB,GAAA,CAMvBW,EAAAA,CAA0B,GAAA,CAqEnBnB,iBAAWxC,UAAAA,CAAK,SAAkB,CAC7C,KAAA,CAAA6D,CAAAA,CACA,kBAAA,CAAAH,CAAAA,CAAqB,GAAA,CACrB,YAAA,CAAAI,CAAAA,CAAe,CAAA,CACf,YAAA,CAAcC,CAAAA,CACd,aAAA,CAAAC,EACA,QAAA,CAAUC,CAAAA,CACV,aAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CAAc,MACd,gBAAA,CAAAC,CAAAA,CAAmB,KAAA,CACnB,WAAA,CAAaC,CAAAA,CACb,gBAAA,CAAAC,EACA,cAAA,CAAAC,CAAAA,CAAiB,sBAAA,CACjB,KAAA,CAAAC,CAAAA,CAAQ,UAAA,CACR,UAAA,CAAAC,CAAAA,CACA,cAAA,CAAAC,CAAAA,CAAiB,IAAA,CACjB,aAAA,CAAAC,CAAAA,CAAgB,IAAA,CAChB,qBAAAC,CAAAA,CAAuB,IAAA,CACvB,SAAA,CAAA1E,CAAAA,CACA,cAAA,CAAA2E,CAAAA,CACA,oBAAAC,CAAAA,CACA,YAAA,CAAcC,CAAAA,CACd,iBAAA,CAAmBC,CAAAA,CAEnB,aAAA,CAAAvB,EACA,WAAA,CAAawB,CAAAA,CACb,mBAAA,CAAAC,CAAAA,CACA,GAAGjE,CACL,CAAA,CAA6B,CAE3B,IAAMkE,CAAAA,CAAepB,CAAAA,GAAoB,MAAA,CACnCqB,CAAAA,CAAoBnB,CAAAA,GAAuB,OAC3CoB,CAAAA,CAAwBhB,CAAAA,GAA0B,MAAA,CAClDiB,CAAAA,CAA0BL,CAAAA,GAA0B,MAAA,CAGpD,CAACM,EAAAA,CAAeC,CAAgB,CAAA,CAAIC,cAAAA,CAAS3B,CAAY,CAAA,CACzD,CAAC4B,EAAAA,CAAkBC,CAAmB,CAAA,CAAIF,cAAAA,CAAS,KAAK,CAAA,CACxD,CAACG,EAAAA,CAAqBC,EAAsB,CAAA,CAAIJ,cAAAA,CAASrB,CAAgB,CAAA,CAIzE,CAAC0B,GAAsBC,EAAsB,CAAA,CAAIN,cAAAA,CAAS,IAC1D,CAAChC,CAAAA,EAAiBA,EAAc,MAAA,GAAW,CAAA,EAC3CA,CAAAA,CAAc,MAAA,GAAWI,CAAAA,CAAM,MAAA,EAC/BC,IAAiB,CAAA,CAAU,CAAA,CAGVrB,EAAAA,CAAcgB,CAAa,CAAA,CAC5BK,CAAY,GAAG,SAAA,EAAa,CACjD,CAAA,CAGKkC,EAAAA,CAA2BC,YAAAA,CAAO,KAAK,EAGvCC,CAAAA,CAAef,CAAAA,CAAepB,CAAAA,CAAkBwB,EAAAA,CAChDY,CAAAA,CAAWf,CAAAA,CAAoBnB,EAAqByB,EAAAA,CACpDU,CAAAA,CAAcf,CAAAA,CAChBhB,CAAAA,CACAuB,EAAAA,CAEES,CAAAA,CAAmBC,cACvB,IAAM/C,EAAAA,CAAuBM,CAAAA,CAAM,MAAA,CAAQJ,CAAAA,CAAeC,CAAkB,CAAA,CAC5E,CAACG,CAAAA,CAAM,MAAA,CAAQJ,CAAAA,CAAeC,CAAkB,CAClD,CAAA,CAGMR,EAAWoD,aAAAA,CAAQ,IACnB,CAACD,CAAAA,EAAoB,CAAC5C,CAAAA,CAAsB,EAAC,CAC1ChB,EAAAA,CAAcgB,CAAa,CAAA,CACjC,CAAC4C,CAAAA,CAAkB5C,CAAa,CAAC,CAAA,CAG9BL,EAAAA,CAAgBkD,aAAAA,CAAQ,IACxBpD,CAAAA,CAAS,MAAA,GAAW,CAAA,CAAU,CAAA,CAC3BA,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,SAAW,CAAA,CAChD,CAACA,CAAQ,CAAC,CAAA,CAGPqD,EAAAA,CAAYC,kBACf3D,CAAAA,EAAkB,CAQjB,GAPIsC,CAAAA,CACFnB,CAAAA,GAAgBnB,CAAK,EAErB2C,CAAAA,CAAiB3C,CAAK,CAAA,CAIpBwD,CAAAA,EAAoBnD,CAAAA,CAASL,CAAK,CAAA,CAAG,CACvC,IAAM4D,CAAAA,CAAavD,CAAAA,CAASL,CAAK,CAAA,CAAE,SAAA,CAC9ByC,GACHS,EAAAA,CAAuBU,CAAU,CAAA,CAEnCvB,CAAAA,GAAsBuB,CAAU,EAClC,CAGIrB,CAAAA,CACFlB,CAAAA,GAAgB,IAAI,CAAA,CAEpByB,CAAAA,CAAoB,IAAI,EAE5B,CAAA,CACA,CACER,CAAAA,CACAC,CAAAA,CACAE,CAAAA,CACAtB,CAAAA,CACAE,EACAgB,CAAAA,CACAmB,CAAAA,CACAnD,CACF,CACF,CAAA,CAGMwD,EAAAA,CAAcF,kBAAY,IAAM,CACpC,IAAMG,CAAAA,CAAgB,CAACR,CAAAA,CAEnBf,EACFlB,CAAAA,GAAgByC,CAAa,CAAA,CAE7BhB,CAAAA,CAAoBgB,CAAa,EAErC,EAAG,CAACR,CAAAA,CAAUf,CAAAA,CAAmBlB,CAAa,CAAC,CAAA,CAGzC0C,EAAAA,CAAiBJ,iBAAAA,CAAY,IAAM,CACvC,IAAMK,CAAAA,CAAoB,CAACT,CAAAA,CAEvBS,EAEFb,EAAAA,CAAyB,OAAA,CAAU,CAACG,CAAAA,EAGhCH,EAAAA,CAAyB,OAAA,EAAWG,IAClCf,CAAAA,CACFlB,CAAAA,GAAgB,KAAK,CAAA,CAErByB,CAAAA,CAAoB,KAAK,GAG7BK,EAAAA,CAAyB,OAAA,CAAU,KAAA,CAAA,CAGjCX,CAAAA,CACFf,CAAAA,GAAmBuC,CAAiB,CAAA,CAEpChB,EAAAA,CAAuBgB,CAAiB,EAE5C,CAAA,CAAG,CAACT,CAAAA,CAAaf,CAAAA,CAAuBf,EAAkB6B,CAAAA,CAAUf,CAAAA,CAAmBlB,CAAa,CAAC,CAAA,CAGrG4C,eAAAA,CAAU,IAAM,CAEVpD,CAAAA,GAAuB,CAAA,EAGvBkB,CAAAA,EAEE,OAAO,MAAA,CAAW,KAAe,MAAA,CAAO,UAAA,EACb,MAAA,CAAO,UAAA,CAClC,kCACF,CAAA,CAAE,OAAA,GAGIQ,CAAAA,CACFlB,CAAAA,GAAgB,IAAI,CAAA,CAEpByB,CAAAA,CAAoB,IAAI,CAAA,EAKlC,EAAG,CAACjC,CAAAA,CAAoBkB,CAAAA,CAAsBQ,CAAAA,CAAmBlB,CAAa,CAAC,EAG/E,IAAM6C,EAAAA,CAAkBd,YAAAA,CAAOC,CAAY,CAAA,CAC3Ca,EAAAA,CAAgB,QAAUb,CAAAA,CAG1BY,eAAAA,CAAU,IAAM,CAWd,GATI,CAACT,GAGD3C,CAAAA,GAAuB,CAAA,EAGvByC,CAAAA,EAAYC,CAAAA,EAGZd,CAAAA,CAAyB,OAG7B,IAAM0B,CAAAA,CAAW,WAAA,CAAY,IAAM,CAEjCjB,EAAAA,CAAwBkB,CAAAA,EAAgB,CAEtC,IAAIR,CAAAA,CAAaQ,CAAAA,CAActD,EAAAA,CAG3BP,EAAAA,CAAgB,CAAA,EAAKqD,GAAcrD,EAAAA,GACrCqD,CAAAA,CAAa,CAAA,CAAA,CAIfvB,CAAAA,GAAsBuB,CAAU,CAAA,CAGhC,IAAMS,EAAAA,CAAWjE,EAAAA,CAAoBC,CAAAA,CAAUuD,CAAU,CAAA,CAGzD,OAAIS,EAAAA,GAAaH,GAAgB,OAAA,GAC3B5B,CAAAA,CACFnB,CAAAA,GAAgBkD,EAAQ,CAAA,CAExB1B,CAAAA,CAAiB0B,EAAQ,CAAA,CAAA,CAItBT,CACT,CAAC,EACH,CAAA,CAAG9C,EAAuB,EAE1B,OAAO,IAAM,aAAA,CAAcqD,CAAQ,CACrC,CAAA,CAAG,CACDX,CAAAA,CACA3C,CAAAA,CACAyC,CAAAA,CACAC,CAAAA,CACAd,CAAAA,CACAlC,EAAAA,CACAF,CAAAA,CACAiC,EACAnB,CAAAA,CACAkB,CACF,CAAC,CAAA,CAGD4B,eAAAA,CAAU,IAAM,CAQd,GANIT,CAAAA,EAGA3C,CAAAA,GAAuB,CAAA,EAGvByC,CAAAA,EAAYC,CAAAA,CAAa,OAE7B,IAAMY,CAAAA,CAAW,WAAA,CAAY,IAAM,CACjC,IAAMG,CAAAA,CAAAA,CAAajB,CAAAA,CAAe,CAAA,EAAKrC,CAAAA,CAAM,MAAA,CAEzCsB,CAAAA,CACFnB,CAAAA,GAAgBmD,CAAS,EAEzB3B,CAAAA,CAAiB2B,CAAS,EAE9B,CAAA,CAAGzD,CAAkB,CAAA,CAErB,OAAO,IAAM,aAAA,CAAcsD,CAAQ,CACrC,CAAA,CAAG,CACDX,EACA3C,CAAAA,CACAwC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAvC,CAAAA,CAAM,MAAA,CACNsB,CAAAA,CACAnB,CACF,CAAC,CAAA,CAGD8C,eAAAA,CAAU,IAAM,CACd,GAAI,CAACT,CAAAA,EAAoB,CAACf,CAAAA,CAAyB,OAEnD,IAAM4B,CAAAA,CAAWjE,GAAoBC,CAAAA,CAAU+B,CAAqB,CAAA,CAChEiC,CAAAA,GAAahB,CAAAA,GACXf,CAAAA,CACFnB,IAAgBkD,CAAQ,CAAA,CAExB1B,CAAAA,CAAiB0B,CAAQ,CAAA,EAG/B,CAAA,CAAG,CACDb,CAAAA,CACAf,CAAAA,CACAL,CAAAA,CACA/B,CAAAA,CACAgD,CAAAA,CACAf,CAAAA,CACAnB,CACF,CAAC,CAAA,CAGD,IAAMoD,EAAAA,CAAoB3C,CAAAA,CACtBA,CAAAA,CAAWyB,CAAAA,CAAcrC,EAAM,MAAM,CAAA,CACrC,CAAA,MAAA,EAASqC,CAAAA,CAAe,CAAC,CAAA,IAAA,EAAOrC,EAAM,MAAM,CAAA,CAAA,CAEhD,OACE/B,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWxD,CAAAA,CACT,gDAAA,CACA,CAAC8H,CAAAA,EAAe,WAAA,CAChBlG,CACF,CAAA,CACA,IAAA,CAAK,SACL,sBAAA,CAAqB,UAAA,CACrB,YAAA,CAAYkG,CAAAA,CAAc7B,CAAAA,CAAiBQ,CAAAA,EAAaP,EACxD,iBAAA,CAAiBQ,CAAAA,CAChB,GAAG/D,CAAAA,CAGH,QAAA,CAAAmF,CAAAA,EAAejC,EACdjC,eAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW5D,CAAAA,CACT,oDAAA,CACA,yCACF,CAAA,CAEA,QAAA,CAAA,CAAA4D,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAqC,CAAAA,CAAe,MAAI6C,EAAAA,CAAAA,CACtB,CAAA,CACAtF,cAAAA,CAAChC,CAAAA,CAAA,CACC,OAAA,CAAQ,UACR,UAAA,CAAW,MAAA,CACX,OAAA,CAAS8G,EAAAA,CACT,YAAA,CAAW,iBAAA,CACX,gBAAe,KAAA,CAEf,QAAA,CAAA9E,cAAAA,CAACuF,yBAAAA,CAAA,CAAc,SAAA,CAAU,UAAU,CAAA,CACrC,CAAA,CAAA,CACF,CAAA,CAEAnF,eAAAA,CAAAC,mBAAAA,CAAA,CAEE,UAAAL,cAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAWxD,CAAAA,CACT,8DAAA,CACA,oBAAA,CACAuG,CACF,CAAA,CACA,IAAA,CAAK,OAAA,CACL,sBAAA,CAAqB,OAAA,CACrB,YAAA,CAAYuC,GACZ,WAAA,CAAU,QAAA,CACV,aAAA,CAAY,MAAA,CAEZ,QAAA,CAAAtF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iEAAA,CACZ,QAAA,CAAA+B,CAAAA,CAAMqC,CAAY,CAAA,CACrB,CAAA,CAAA,CAdKA,CAeP,CAAA,CAGAhE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yCAAA,CAEZ,QAAA,CAAA,CAAAwC,GACC5C,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWxD,CAAAA,CAAG,mBAAA,CAAqBwG,CAAmB,EACtD,IAAA,CAAK,OAAA,CACL,YAAA,CAAW,kBAAA,CAEV,QAAA,CAAAjB,CAAAA,CAAM,GAAA,CAAI,CAACyD,CAAAA,CAAGzE,CAAAA,GACbf,cAAAA,CAAChC,CAAAA,CAAA,CAEC,OAAA,CAAS+C,IAAUqD,CAAAA,CAAe,SAAA,CAAY,SAAA,CAC9C,UAAA,CAAW,KAAA,CACX,OAAA,CAAS,IAAMK,EAAAA,CAAU1D,CAAK,CAAA,CAC9B,YAAA,CAAY,CAAA,YAAA,EAAeA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CACpC,cAAA,CAAcA,CAAAA,GAAUqD,CAAAA,CAAe,IAAA,CAAO,MAAA,CAAA,CALzCrD,CAMP,CACD,CAAA,CACH,CAAA,CAIFX,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CAEZ,UAAAiC,CAAAA,EACCrC,cAAAA,CAAChC,CAAAA,CAAA,CACC,OAAA,CAAQ,SAAA,CACR,WAAW,MAAA,CACX,OAAA,CAAS8G,EAAAA,CACT,YAAA,CAAW,mBAAA,CACX,eAAA,CAAe,KAEf,QAAA,CAAA9E,cAAAA,CAACyF,2BAAAA,CAAA,CAAgB,SAAA,CAAU,SAAA,CAAU,CAAA,CACvC,CAAA,CAID5C,CAAAA,EAAiBjB,CAAAA,CAAqB,CAAA,EACrC5B,cAAAA,CAAChC,CAAAA,CAAA,CACC,QAAQ,SAAA,CACR,UAAA,CAAW,MAAA,CACX,OAAA,CAAS4G,EAAAA,CACT,YAAA,CAAYP,EAAW,eAAA,CAAkB,gBAAA,CAExC,QAAA,CAAAA,CAAAA,CACCrE,cAAAA,CAAC0F,oBAAAA,CAAA,CAAS,SAAA,CAAU,SAAA,CAAU,CAAA,CAE9B1F,cAAAA,CAAC2F,qBAAAA,CAAA,CAAU,SAAA,CAAU,SAAA,CAAU,CAAA,CAEnC,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEJ,CAEJ,CAAC,CAAA,CAEDjF,gBAAAA,CAAS,WAAA,CAAc,WAAA,CAAA,EC7fvBoB,EAAAA,EAAAA,CCcAlF,CAAAA,EAAAA,CAMA,IAAMgJ,EAAAA,CAAmB3I,0BAAAA,CAEvB,sDAAA,CACA,CACE,QAAA,CAAU,CAER,OAAA,CAAS,CACP,SAAA,CAAW,YAAA,CACX,OAAQ,cAAA,CACR,IAAA,CAAM,gBACR,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,WACX,CACF,CACF,CAAA,CAeM4I,CAAAA,CAAW3H,UAAAA,CACfC,iBACE,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,OAAA,CAAAE,CAAAA,CAAS,GAAGa,CAAM,CAAA,CAAGC,CAAAA,GAE/BY,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKZ,EACL,IAAA,CAAK,QAAA,CACL,WAAA,CAAU,QAAA,CACV,WAAA,CAAU,MAAA,CACV,UAAW5C,CAAAA,CAAGoJ,EAAAA,CAAiB,CAAE,OAAA,CAAAtH,CAAQ,CAAC,EAAGF,CAAS,CAAA,CACrD,GAAGe,CAAAA,CAGJ,QAAA,CAAAa,cAAAA,CAAC,QAAK,SAAA,CAAU,SAAA,CAAU,QAAA,CAAA,YAAA,CAAU,CAAA,CACtC,CAGN,CACF,EAEA6F,CAAAA,CAAS,WAAA,CAAc,UAAA,CCxCvB,IAAMnF,EAAAA,CAAWoF,UAAAA,CAAK,IACpB,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAqB,IAAA,CAAKC,IAAQ,CAAE,OAAA,CAASA,CAAAA,CAAI,QAAS,CAAA,CAAE,CAC9D,EAcA,SAASC,EAAAA,EAAiC,CACxC,OACE5F,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yBAAA,CACb,QAAA,CAAA,CAAAJ,cAAAA,CAAC6F,CAAAA,CAAA,CAAS,SAAA,CAAU,WAAA,CAAY,CAAA,CAChC7F,cAAAA,CAAC6F,CAAAA,CAAA,CAAS,SAAA,CAAU,YAAA,CAAa,CAAA,CACjC7F,eAAC6F,CAAAA,CAAA,CAAS,SAAA,CAAU,WAAA,CAAY,CAAA,CAChCzF,eAAAA,CAAC,OAAI,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA,CAAAJ,cAAAA,CAAC6F,CAAAA,CAAA,CAAS,UAAU,sBAAA,CAAuB,CAAA,CAC3C7F,cAAAA,CAAC6F,CAAAA,CAAA,CAAS,SAAA,CAAU,sBAAA,CAAuB,CAAA,CAC3C7F,cAAAA,CAAC6F,CAAAA,CAAA,CAAS,SAAA,CAAU,sBAAA,CAAuB,CAAA,CAAA,CAC7C,GACF,CAEJ,CAYO,SAASI,EAAAA,CAAa,CAC3B,QAAA,CAAAC,EAAW,IAAA,CACX,aAAA,CAAAC,CAAAA,CAAgB,IAAA,CAChB,GAAGhH,CACL,EAA2C,CACzC,GAAM,CAACiH,CAAAA,CAAWC,CAAY,CAAA,CAAI1C,cAAAA,CAAS,KAAK,CAAA,CAC1C,CAAC2C,CAAAA,CAAWC,CAAY,CAAA,CAAI5C,cAAAA,CAAS,KAAK,CAAA,CAC1C,CAAC6C,CAAAA,CAAUC,CAAW,CAAA,CAAI9C,cAAAA,CAAS,KAAK,CAAA,CA2B9C,OAzBAqB,eAAAA,CAAU,IAAM,CACdyB,CAAAA,CAAY,IAAI,CAAA,CAGhB,IAAMC,CAAAA,CAAgB,IAAY,CAChC,IAAMC,CAAAA,CAAU,MAAA,CAAO,UAAA,EAAcT,CAAAA,CACrCG,CAAAA,CAAaM,CAAO,CAAA,CAChBA,CAAAA,EACFJ,EAAa,IAAI,EAErB,CAAA,CAEA,OAAAG,CAAAA,EAAc,CAGd,OAAO,gBAAA,CAAiB,QAAA,CAAUA,CAAa,CAAA,CACxC,IAAM,MAAA,CAAO,oBAAoB,QAAA,CAAUA,CAAa,CACjE,CAAA,CAAG,CAACR,CAAQ,CAAC,CAAA,CAGT,CAACM,CAAAA,EAKD,CAACF,CAAAA,EAAa,CAACF,CAAAA,CACV,KAOPpG,cAAAA,CAAC4G,cAAAA,CAAA,CAAS,IAAA,CAAMT,CAAAA,EAAiB,CAACC,EAAY,QAAA,CAAW,SAAA,CACvD,QAAA,CAAApG,cAAAA,CAAC6G,cAAAA,CAAA,CAAS,SAAU7G,cAAAA,CAACgG,EAAAA,CAAA,EAAiB,CAAA,CACpC,QAAA,CAAAhG,cAAAA,CAACU,EAAAA,CAAA,CAAU,GAAGvB,CAAAA,CAAO,CAAA,CACvB,CAAA,CACF,CAEJ","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","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 * Button Component Exports\n * Barrel export for Button component and utilities\n *\n * 3-Layer Architecture (v0.9.0):\n * - buttonOuterVariants: Layer 1 - Touch target (44x44px)\n * - buttonVisualVariants: Layer 2 - Visual appearance\n * - buttonVariants: Deprecated alias for buttonVisualVariants\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-038 (Tree-shakeable exports)\n */\n\nexport {\n Button,\n buttonOuterVariants,\n buttonVisualVariants,\n /** @deprecated Use buttonVisualVariants instead */\n buttonVariants,\n} from './Button';\nexport type { ButtonProps } from './Button';\n","'use client';\n\n/**\n * Carousel Component\n * Accessible carousel for displaying rotating content with React Node support\n *\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\n\nimport { memo, useState, useEffect, useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport { Button } from '../Button';\nimport { PauseIcon, PlayIcon, ChevronUpIcon, ChevronDownIcon } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { CarouselProps, ItemManifest } from './Carousel.types';\n\n/**\n * Minimum duration for any item in milliseconds.\n * Prevents disorienting rapid transitions and allows screen readers time to announce.\n */\nconst MIN_ITEM_DURATION_MS = 1000;\n\n/**\n * Timer check interval in milliseconds.\n * Used for per-item timing mode to check if item should transition.\n */\nconst TIMER_CHECK_INTERVAL_MS = 1000;\n\n/**\n * Builds a manifest mapping cumulative time thresholds to item indices.\n * @param durations - Array of durations in milliseconds for each item\n * @returns Array of ItemManifest entries with startTime and endTime\n */\nfunction buildManifest(durations: number[]): ItemManifest[] {\n let cumulative = 0;\n return durations.map((duration, index) => {\n const start = cumulative;\n // Enforce minimum duration\n const safeDuration = Math.max(duration, MIN_ITEM_DURATION_MS);\n cumulative += safeDuration;\n return { index, startTime: start, endTime: cumulative };\n });\n}\n\n/**\n * Gets the item index that should be displayed for a given elapsed time.\n * @param manifest - Array of ItemManifest entries\n * @param elapsed - Current elapsed time in milliseconds\n * @returns The index of the item that should be displayed\n */\nfunction getCurrentItemIndex(manifest: ItemManifest[], elapsed: number): number {\n if (manifest.length === 0) return 0;\n\n const totalDuration = manifest[manifest.length - 1]?.endTime ?? 0;\n if (totalDuration === 0) return 0;\n\n // Normalize elapsed time to handle wraparound\n const normalizedElapsed = elapsed % totalDuration;\n\n const item = manifest.find(\n (m) => normalizedElapsed >= m.startTime && normalizedElapsed < m.endTime\n );\n return item?.index ?? 0;\n}\n\n/**\n * Validates whether per-item timing should be used.\n * @param itemsLength - Number of items in the carousel\n * @param itemDurations - Optional array of durations\n * @param autoRotateInterval - The autoRotateInterval setting\n * @returns true if per-item timing should be used\n */\nfunction shouldUsePerItemTiming(\n itemsLength: number,\n itemDurations: number[] | undefined,\n autoRotateInterval: number\n): boolean {\n // Disabled if autoRotateInterval is 0\n if (autoRotateInterval === 0) return false;\n\n // Must have itemDurations array\n if (!itemDurations || itemDurations.length === 0) return false;\n\n // Array length must match items length\n if (itemDurations.length !== itemsLength) {\n console.warn(\n 'Carousel: itemDurations length does not match items length. ' +\n 'Falling back to autoRotateInterval.'\n );\n return false;\n }\n\n return true;\n}\n\nexport const Carousel = memo(function Carousel({\n items,\n autoRotateInterval = 5000,\n defaultIndex = 0,\n currentIndex: controlledIndex,\n onIndexChange,\n isPaused: controlledIsPaused,\n onPauseChange,\n collapsible = false,\n defaultMinimized = false,\n isMinimized: controlledIsMinimized,\n onMinimizeChange,\n minimizedLabel = 'Carousel (minimized)',\n label = 'Carousel',\n slideLabel,\n showNavigation = true,\n showPlayPause = true,\n respectReducedMotion = true,\n className,\n slideClassName,\n navigationClassName,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n // Per-item timing props\n itemDurations,\n elapsedTime: controlledElapsedTime,\n onElapsedTimeChange,\n ...props\n}: CarouselProps): ReactNode {\n // Determine if component is controlled or uncontrolled\n const isControlled = controlledIndex !== undefined;\n const isPauseControlled = controlledIsPaused !== undefined;\n const isMinimizedControlled = controlledIsMinimized !== undefined;\n const isElapsedTimeControlled = controlledElapsedTime !== undefined;\n\n // Internal state for uncontrolled mode\n const [internalIndex, setInternalIndex] = useState(defaultIndex);\n const [internalIsPaused, setInternalIsPaused] = useState(false);\n const [internalIsMinimized, setInternalIsMinimized] = useState(defaultMinimized);\n\n // Calculate initial elapsed time based on defaultIndex if itemDurations is provided\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_internalElapsedTime, setInternalElapsedTime] = useState(() => {\n if (!itemDurations || itemDurations.length === 0) return 0;\n if (itemDurations.length !== items.length) return 0;\n if (defaultIndex === 0) return 0;\n\n // Build manifest to find the startTime for the default index\n const tempManifest = buildManifest(itemDurations);\n return tempManifest[defaultIndex]?.startTime ?? 0;\n });\n\n // Ref to track if carousel was playing before minimize\n const wasPlayingBeforeMinimize = useRef(false);\n\n // Use controlled value if provided, otherwise use internal state\n const currentIndex = isControlled ? controlledIndex : internalIndex;\n const isPaused = isPauseControlled ? controlledIsPaused : internalIsPaused;\n const isMinimized = isMinimizedControlled\n ? controlledIsMinimized\n : internalIsMinimized;\n // Determine if per-item timing should be used\n const usePerItemTiming = useMemo(\n () => shouldUsePerItemTiming(items.length, itemDurations, autoRotateInterval),\n [items.length, itemDurations, autoRotateInterval]\n );\n\n // Build the manifest for per-item timing (memoized)\n const manifest = useMemo(() => {\n if (!usePerItemTiming || !itemDurations) return [];\n return buildManifest(itemDurations);\n }, [usePerItemTiming, itemDurations]);\n\n // Calculate total duration (memoized)\n const totalDuration = useMemo(() => {\n if (manifest.length === 0) return 0;\n return manifest[manifest.length - 1]?.endTime ?? 0;\n }, [manifest]);\n\n // Navigation handler\n const goToSlide = useCallback(\n (index: number) => {\n if (isControlled) {\n onIndexChange?.(index);\n } else {\n setInternalIndex(index);\n }\n\n // For per-item timing, jump elapsed time to item's startTime\n if (usePerItemTiming && manifest[index]) {\n const newElapsed = manifest[index].startTime;\n if (!isElapsedTimeControlled) {\n setInternalElapsedTime(newElapsed);\n }\n onElapsedTimeChange?.(newElapsed);\n }\n\n // Pause when user manually navigates\n if (isPauseControlled) {\n onPauseChange?.(true);\n } else {\n setInternalIsPaused(true);\n }\n },\n [\n isControlled,\n isPauseControlled,\n isElapsedTimeControlled,\n onIndexChange,\n onPauseChange,\n onElapsedTimeChange,\n usePerItemTiming,\n manifest,\n ]\n );\n\n // Pause toggle handler\n const togglePause = useCallback(() => {\n const newPauseState = !isPaused;\n\n if (isPauseControlled) {\n onPauseChange?.(newPauseState);\n } else {\n setInternalIsPaused(newPauseState);\n }\n }, [isPaused, isPauseControlled, onPauseChange]);\n\n // Minimize toggle handler\n const toggleMinimize = useCallback(() => {\n const newMinimizedState = !isMinimized;\n\n if (newMinimizedState) {\n // Minimizing - track if we were playing\n wasPlayingBeforeMinimize.current = !isPaused;\n } else {\n // Expanding - resume if we were playing before\n if (wasPlayingBeforeMinimize.current && isPaused) {\n if (isPauseControlled) {\n onPauseChange?.(false);\n } else {\n setInternalIsPaused(false);\n }\n }\n wasPlayingBeforeMinimize.current = false;\n }\n\n if (isMinimizedControlled) {\n onMinimizeChange?.(newMinimizedState);\n } else {\n setInternalIsMinimized(newMinimizedState);\n }\n }, [isMinimized, isMinimizedControlled, onMinimizeChange, isPaused, isPauseControlled, onPauseChange]);\n\n // Reduced motion preference check effect\n useEffect(() => {\n // Check if auto-rotation is disabled\n if (autoRotateInterval === 0) return;\n\n // Respect user's motion preferences\n if (respectReducedMotion) {\n // Check if matchMedia is available (not available in all test environments)\n if (typeof window !== 'undefined' && window.matchMedia) {\n const prefersReducedMotion = window.matchMedia(\n '(prefers-reduced-motion: reduce)'\n ).matches;\n\n if (prefersReducedMotion) {\n if (isPauseControlled) {\n onPauseChange?.(true);\n } else {\n setInternalIsPaused(true);\n }\n }\n }\n }\n }, [autoRotateInterval, respectReducedMotion, isPauseControlled, onPauseChange]);\n\n // Ref to track current index for the interval callback\n const currentIndexRef = useRef(currentIndex);\n currentIndexRef.current = currentIndex;\n\n // Per-item timing effect (uncontrolled elapsed time)\n useEffect(() => {\n // Skip if not using per-item timing\n if (!usePerItemTiming) return;\n\n // Don't run if auto-rotation is disabled\n if (autoRotateInterval === 0) return;\n\n // Don't run if paused or minimized\n if (isPaused || isMinimized) return;\n\n // Don't run if elapsed time is controlled externally\n if (isElapsedTimeControlled) return;\n\n // Set up 1-second interval for timer ticks\n const interval = setInterval(() => {\n // Use functional update to get the latest elapsed time\n setInternalElapsedTime((prevElapsed) => {\n // Calculate new elapsed time\n let newElapsed = prevElapsed + TIMER_CHECK_INTERVAL_MS;\n\n // Handle wraparound\n if (totalDuration > 0 && newElapsed >= totalDuration) {\n newElapsed = 0;\n }\n\n // Fire callback (using the new elapsed value)\n onElapsedTimeChange?.(newElapsed);\n\n // Calculate current item from manifest\n const newIndex = getCurrentItemIndex(manifest, newElapsed);\n\n // Update index if changed (using ref for latest value)\n if (newIndex !== currentIndexRef.current) {\n if (isControlled) {\n onIndexChange?.(newIndex);\n } else {\n setInternalIndex(newIndex);\n }\n }\n\n return newElapsed;\n });\n }, TIMER_CHECK_INTERVAL_MS);\n\n return () => clearInterval(interval);\n }, [\n usePerItemTiming,\n autoRotateInterval,\n isPaused,\n isMinimized,\n isElapsedTimeControlled,\n totalDuration,\n manifest,\n isControlled,\n onIndexChange,\n onElapsedTimeChange,\n ]);\n\n // Standard auto-rotation effect (fallback when not using per-item timing)\n useEffect(() => {\n // Skip if using per-item timing\n if (usePerItemTiming) return;\n\n // Check if auto-rotation is disabled\n if (autoRotateInterval === 0) return;\n\n // Don't auto-rotate if paused or minimized\n if (isPaused || isMinimized) return;\n\n const interval = setInterval(() => {\n const nextIndex = (currentIndex + 1) % items.length;\n\n if (isControlled) {\n onIndexChange?.(nextIndex);\n } else {\n setInternalIndex(nextIndex);\n }\n }, autoRotateInterval);\n\n return () => clearInterval(interval);\n }, [\n usePerItemTiming,\n autoRotateInterval,\n currentIndex,\n isPaused,\n isMinimized,\n items.length,\n isControlled,\n onIndexChange,\n ]);\n\n // Effect to sync controlled elapsedTime to displayed index\n useEffect(() => {\n if (!usePerItemTiming || !isElapsedTimeControlled) return;\n\n const newIndex = getCurrentItemIndex(manifest, controlledElapsedTime);\n if (newIndex !== currentIndex) {\n if (isControlled) {\n onIndexChange?.(newIndex);\n } else {\n setInternalIndex(newIndex);\n }\n }\n }, [\n usePerItemTiming,\n isElapsedTimeControlled,\n controlledElapsedTime,\n manifest,\n currentIndex,\n isControlled,\n onIndexChange,\n ]);\n\n // Generate slide label\n const currentSlideLabel = slideLabel\n ? slideLabel(currentIndex, items.length)\n : `Slide ${currentIndex + 1} of ${items.length}`;\n\n return (\n <div\n className={cn(\n 'flex flex-col mb-4 transition-all duration-300',\n !isMinimized && 'space-y-4',\n className\n )}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label={isMinimized ? minimizedLabel : ariaLabel || label}\n aria-labelledby={ariaLabelledBy}\n {...props}\n >\n {/* Minimized State */}\n {isMinimized && collapsible ? (\n <div\n className={cn(\n 'bg-[var(--primary)] rounded-lg px-4 py-2 shadow-md',\n 'flex items-center justify-between gap-4'\n )}\n >\n <span className=\"text-[var(--primary-foreground)] text-sm\">\n {minimizedLabel} - {currentSlideLabel}\n </span>\n <Button\n variant=\"outline\"\n visualSize=\"icon\"\n onPress={toggleMinimize}\n aria-label=\"Expand carousel\"\n aria-expanded={false}\n >\n <ChevronUpIcon className=\"w-5 h-5\" />\n </Button>\n </div>\n ) : (\n <>\n {/* Current Slide */}\n <div\n key={currentIndex}\n className={cn(\n 'bg-[var(--primary)] rounded-lg p-4 overflow-hidden shadow-md',\n 'slide-in-animation',\n slideClassName\n )}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={currentSlideLabel}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n <div className=\"text-[var(--primary-foreground)] min-h-[2rem] flex items-center\">\n {items[currentIndex]}\n </div>\n </div>\n\n {/* Controls Container */}\n <div className=\"flex items-center justify-between gap-4\">\n {/* Navigation Dots */}\n {showNavigation && (\n <div\n className={cn('flex items-center', navigationClassName)}\n role=\"group\"\n aria-label=\"Slide navigation\"\n >\n {items.map((_, index) => (\n <Button\n key={index}\n variant={index === currentIndex ? 'default' : 'outline'}\n visualSize=\"dot\"\n onPress={() => goToSlide(index)}\n aria-label={`Go to slide ${index + 1}`}\n aria-current={index === currentIndex ? true : undefined}\n />\n ))}\n </div>\n )}\n\n {/* Right Controls Group */}\n <div className=\"flex items-center gap-2\">\n {/* Minimize Button */}\n {collapsible && (\n <Button\n variant=\"default\"\n visualSize=\"icon\"\n onPress={toggleMinimize}\n aria-label=\"Minimize carousel\"\n aria-expanded={true}\n >\n <ChevronDownIcon className=\"w-5 h-5\" />\n </Button>\n )}\n \n {/* Play/Pause Button */}\n {showPlayPause && autoRotateInterval > 0 && (\n <Button\n variant=\"default\"\n visualSize=\"icon\"\n onPress={togglePause}\n aria-label={isPaused ? 'Play carousel' : 'Pause carousel'}\n >\n {isPaused ? (\n <PlayIcon className=\"w-5 h-5\" />\n ) : (\n <PauseIcon className=\"w-5 h-5\" />\n )}\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n </div>\n );\n});\n\nCarousel.displayName = 'Carousel';\n","export { Carousel } from './Carousel';\nexport { LazyCarousel } from './LazyCarousel';\nexport type { CarouselProps } from './Carousel.types';\nexport type { LazyCarouselProps } from './LazyCarousel';\n","\"use client\";\n\n/**\n * Skeleton Component\n * Loading placeholder with pulse animation and theme-aware styling\n *\n * @see ShadCN Skeleton: https://ui.shadcn.com/docs/components/skeleton\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see tasks.md Phase 2 (Green Phase - Implementation)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n/**\n * Skeleton variant styles using CVA\n * @see tasks.md Phase 2.2 (CVA Variant Definitions)\n */\nconst skeletonVariants = cva(\n // Base styles - pulse animation and theme-aware background\n \"animate-pulse bg-[var(--accent-background)] relative\",\n {\n variants: {\n // Shape variants\n variant: {\n rectangle: \"rounded-md\", // Default: 0.375rem border radius\n circle: \"rounded-full\", // Circular shape (for avatars, icons)\n text: \"rounded-sm h-4\", // Text line placeholder (1rem height, 0.125rem radius)\n },\n },\n defaultVariants: {\n variant: \"rectangle\",\n },\n }\n);\n\nexport interface SkeletonProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof skeletonVariants> {\n variant?: 'rectangle' | 'circle' | 'text';\n className?: string;\n}\n\n/**\n * Skeleton Component\n * Non-interactive loading placeholder with pulse animation\n *\n * @see tasks.md Phase 2.4 (Component Implementation)\n */\nconst Skeleton = memo(\n forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, variant, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n className={cn(skeletonVariants({ variant }), className)}\n {...props}\n >\n {/* Screen reader text for accessibility */}\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n }\n )\n);\n\nSkeleton.displayName = \"Skeleton\";\n\nexport { Skeleton, skeletonVariants };\n","'use client';\n\n/**\n * Lazy-loaded Carousel Component\n *\n * Only loads the Carousel component when:\n * 1. The viewport is large enough (configurable breakpoint)\n * 2. The component is mounted on the client\n *\n * Uses React Activity to preserve carousel state (current index, pause state,\n * elapsed time) when viewport resizes below breakpoint and back.\n *\n * This reduces initial bundle size for mobile users and improves TTI.\n *\n * @example\n * ```tsx\n * // Only loads on lg screens (1024px+)\n * <LazyCarousel items={items} label=\"Features\" />\n *\n * // Custom breakpoint\n * <LazyCarousel items={items} label=\"Features\" minWidth={768} />\n *\n * // Disable state preservation (unmount on resize)\n * <LazyCarousel items={items} label=\"Features\" preserveState={false} />\n * ```\n */\n\nimport { useState, useEffect, type ReactElement, type ComponentProps, Suspense, lazy, Activity } from 'react';\nimport { Skeleton } from '../Skeleton';\n\n// Lazy load the Carousel component\nconst Carousel = lazy(() =>\n import('./Carousel').then(mod => ({ default: mod.Carousel }))\n);\n\ntype CarouselProps = ComponentProps<typeof Carousel>;\n\nexport interface LazyCarouselProps extends CarouselProps {\n /** Minimum viewport width to load the carousel (default: 1024 for lg breakpoint) */\n minWidth?: number;\n /** Whether to preserve carousel state when hidden (default: true) */\n preserveState?: boolean;\n}\n\n/**\n * Carousel loading skeleton\n */\nfunction CarouselSkeleton(): ReactElement {\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n <Skeleton className=\"h-8 w-3/4\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <div className=\"flex gap-2 mt-4\">\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n </div>\n </div>\n );\n}\n\n/**\n * LazyCarousel - Only loads on screens meeting minimum width\n *\n * Use this instead of Carousel when the carousel is only visible\n * on larger screens (e.g., hidden on mobile with `hidden lg:block`).\n *\n * State preservation: When the viewport shrinks below minWidth and then\n * expands again, the carousel will resume from where it left off (same\n * slide, same pause state) instead of resetting to the beginning.\n */\nexport function LazyCarousel({\n minWidth = 1024,\n preserveState = true,\n ...props\n}: LazyCarouselProps): ReactElement | null {\n const [isVisible, setIsVisible] = useState(false);\n const [hasLoaded, setHasLoaded] = useState(false);\n const [isClient, setIsClient] = useState(false);\n\n useEffect(() => {\n setIsClient(true);\n\n // Check if viewport is large enough\n const checkViewport = (): void => {\n const visible = window.innerWidth >= minWidth;\n setIsVisible(visible);\n if (visible) {\n setHasLoaded(true);\n }\n };\n\n checkViewport();\n\n // Listen for resize events\n window.addEventListener('resize', checkViewport);\n return () => window.removeEventListener('resize', checkViewport);\n }, [minWidth]);\n\n // Don't render anything on server\n if (!isClient) {\n return null;\n }\n\n // If never loaded and not visible, don't load\n if (!hasLoaded && !isVisible) {\n return null;\n }\n\n // Use Activity to preserve state when hidden (viewport too small)\n // This allows the carousel to resume from where it left off when\n // the viewport expands again\n return (\n <Activity mode={preserveState && !isVisible ? 'hidden' : 'visible'}>\n <Suspense fallback={<CarouselSkeleton />}>\n <Carousel {...props} />\n </Suspense>\n </Activity>\n );\n}\n"]}
@@ -1,10 +1,3 @@
1
- export { LazyCarousel } from '../../chunk-BL6E2DLZ.mjs';
2
- export { Carousel } from '../../chunk-X25TNRSD.mjs';
3
- import '../../chunk-NFSBGRDB.mjs';
4
- import '../../chunk-BDXKKMBZ.mjs';
5
- import '../../chunk-FPKEAJRZ.mjs';
6
- import '../../chunk-HK46BT5U.mjs';
7
- import '../../chunk-E2KQFV3O.mjs';
8
- import '../../chunk-5SVLJN2C.mjs';
9
- //# sourceMappingURL=index.mjs.map
1
+ "use client";
2
+ import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {cva}from'class-variance-authority';import {memo,forwardRef,lazy,useState,useRef,useMemo,useCallback,useEffect,Activity,Suspense,useId,createContext,useContext}from'react';import {Button}from'react-aria-components';import {ChevronUpIcon,ChevronDownIcon,PlayIcon,PauseIcon,Loader2,Zap}from'lucide-react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var Ke=Object.defineProperty;var C=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ze=(t,e)=>{for(var r in e)Ke(t,r,{get:e[r],enumerable:true});};function b(...t){return twMerge(clsx(t))}var W=C(()=>{});var oe,ne,ye=C(()=>{oe=cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),ne=cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80",outline:"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]",link:"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-8",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});});var ae,ie,Y,F,Ne=C(()=>{ae="data-[pressed]:scale-[0.97]",ie="data-[hovered]:shadow-md",Y="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",F="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";});function Ee(){return useContext(Ce)}function Ie(){return useContext(Te)}var Ce,Te,Pe=C(()=>{"use client";Ce=createContext(null);Ce.displayName="ButtonGroupContext";Te=createContext(null);Te.displayName="ButtonGroupItemContext";});var Be,ze=C(()=>{cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}}),Be=cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}}),cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});});var P,_e=C(()=>{"use client";W();ye();Ne();Pe();ze();P=memo(forwardRef(({className:t,buttonVisualClassName:e,variant:r,size:a,visualSize:h,fullWidth:n,loading:w=false,loadingText:s="Loading...",shortcut:E,children:V,isDisabled:T,paywall:g=false,paywallRedirect:G,paywallDescription:Z,onPress:R,...O},j)=>{let L=useId(),I=Ee(),$=Ie(),J=r??I?.variant??"default",Q=a??I?.size,X=T??I?.isDisabled??false,l=I?.orientation==="vertical",B=n||l,z=$?Be({orientation:I?.orientation??"horizontal",position:$.position}):"",M=h??Q??"default";return process.env.NODE_ENV!=="production"&&(M==="dot"||M==="icon")&&!O["aria-label"]&&!V&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsx(Button,{ref:j,isDisabled:X||w||void 0,"aria-disabled":g?true:void 0,"aria-describedby":g?L:void 0,onPress:y=>{if(g){G&&window.open(G,"_blank","noopener,noreferrer");return}R?.(y);},className:b(oe({fullWidth:B,inVerticalGroup:l}),t),...O,children:y=>jsxs("span",{className:b(ne({variant:J,visualSize:M,paywall:g,fullWidth:B}),z,e,ae,ie,Y,F),"data-pressed":y.isPressed||void 0,children:[w&&jsxs(Fragment,{children:[jsx(Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsx("span",{className:"sr-only","aria-live":"polite",children:s})]}),!w&&V,g&&jsx(Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),g&&jsxs("span",{id:L,className:"sr-only",children:["Premium feature: ",Z||"Upgrade required to access this feature"]}),y.isFocusVisible&&E&&jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:E}),y.isPressed&&jsx("span",{className:"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95","aria-hidden":"true"})]})})}));P.displayName="Button";});var ke=C(()=>{_e();});var He={};Ze(He,{Carousel:()=>fe});function Me(t){let e=0;return t.map((r,a)=>{let h=e,n=Math.max(r,ct);return e+=n,{index:a,startTime:h,endTime:e}})}function Ae(t,e){if(t.length===0)return 0;let r=t[t.length-1]?.endTime??0;if(r===0)return 0;let a=e%r;return t.find(n=>a>=n.startTime&&a<n.endTime)?.index??0}function ft(t,e,r){return r===0||!e||e.length===0?false:e.length!==t?(console.warn("Carousel: itemDurations length does not match items length. Falling back to autoRotateInterval."),false):true}var ct,Le,fe,pe=C(()=>{"use client";ke();W();ct=1e3,Le=1e3;fe=memo(function({items:e,autoRotateInterval:r=5e3,defaultIndex:a=0,currentIndex:h,onIndexChange:n,isPaused:w,onPauseChange:s,collapsible:E=false,defaultMinimized:V=false,isMinimized:T,onMinimizeChange:g,minimizedLabel:G="Carousel (minimized)",label:Z="Carousel",slideLabel:R,showNavigation:O=true,showPlayPause:j=true,respectReducedMotion:L=true,className:I,slideClassName:$,navigationClassName:J,"aria-label":Q,"aria-labelledby":X,itemDurations:l,elapsedTime:B,onElapsedTimeChange:z,...M}){let p=h!==void 0,m=w!==void 0,y=T!==void 0,_=B!==void 0,[De,D]=useState(a),[Ue,U]=useState(false),[We,Ye]=useState(V),[Vt,ve]=useState(()=>!l||l.length===0||l.length!==e.length||a===0?0:Me(l)[a]?.startTime??0),ee=useRef(false),u=p?h:De,c=m?w:Ue,S=y?T:We,v=useMemo(()=>ft(e.length,l,r),[e.length,l,r]),f=useMemo(()=>!v||!l?[]:Me(l),[v,l]),te=useMemo(()=>f.length===0?0:f[f.length-1]?.endTime??0,[f]),Fe=useCallback(o=>{if(p?n?.(o):D(o),v&&f[o]){let i=f[o].startTime;_||ve(i),z?.(i);}m?s?.(true):U(true);},[p,m,_,n,s,z,v,f]),qe=useCallback(()=>{let o=!c;m?s?.(o):U(o);},[c,m,s]),be=useCallback(()=>{let o=!S;o?ee.current=!c:(ee.current&&c&&(m?s?.(false):U(false)),ee.current=false),y?g?.(o):Ye(o);},[S,y,g,c,m,s]);useEffect(()=>{r!==0&&L&&typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches&&(m?s?.(true):U(true));},[r,L,m,s]);let xe=useRef(u);xe.current=u,useEffect(()=>{if(!v||r===0||c||S||_)return;let o=setInterval(()=>{ve(i=>{let A=i+Le;te>0&&A>=te&&(A=0),z?.(A);let re=Ae(f,A);return re!==xe.current&&(p?n?.(re):D(re)),A});},Le);return ()=>clearInterval(o)},[v,r,c,S,_,te,f,p,n,z]),useEffect(()=>{if(v||r===0||c||S)return;let o=setInterval(()=>{let i=(u+1)%e.length;p?n?.(i):D(i);},r);return ()=>clearInterval(o)},[v,r,u,c,S,e.length,p,n]),useEffect(()=>{if(!v||!_)return;let o=Ae(f,B);o!==u&&(p?n?.(o):D(o));},[v,_,B,f,u,p,n]);let he=R?R(u,e.length):`Slide ${u+1} of ${e.length}`;return jsx("div",{className:b("flex flex-col mb-4 transition-all duration-300",!S&&"space-y-4",I),role:"region","aria-roledescription":"carousel","aria-label":S?G:Q||Z,"aria-labelledby":X,...M,children:S&&E?jsxs("div",{className:b("bg-[var(--primary)] rounded-lg px-4 py-2 shadow-md","flex items-center justify-between gap-4"),children:[jsxs("span",{className:"text-[var(--primary-foreground)] text-sm",children:[G," - ",he]}),jsx(P,{variant:"outline",visualSize:"icon",onPress:be,"aria-label":"Expand carousel","aria-expanded":false,children:jsx(ChevronUpIcon,{className:"w-5 h-5"})})]}):jsxs(Fragment,{children:[jsx("div",{className:b("bg-[var(--primary)] rounded-lg p-4 overflow-hidden shadow-md","slide-in-animation",$),role:"group","aria-roledescription":"slide","aria-label":he,"aria-live":"polite","aria-atomic":"true",children:jsx("div",{className:"text-[var(--primary-foreground)] min-h-[2rem] flex items-center",children:e[u]})},u),jsxs("div",{className:"flex items-center justify-between gap-4",children:[O&&jsx("div",{className:b("flex items-center",J),role:"group","aria-label":"Slide navigation",children:e.map((o,i)=>jsx(P,{variant:i===u?"default":"outline",visualSize:"dot",onPress:()=>Fe(i),"aria-label":`Go to slide ${i+1}`,"aria-current":i===u?true:void 0},i))}),jsxs("div",{className:"flex items-center gap-2",children:[E&&jsx(P,{variant:"default",visualSize:"icon",onPress:be,"aria-label":"Minimize carousel","aria-expanded":true,children:jsx(ChevronDownIcon,{className:"w-5 h-5"})}),j&&r>0&&jsx(P,{variant:"default",visualSize:"icon",onPress:qe,"aria-label":c?"Play carousel":"Pause carousel",children:c?jsx(PlayIcon,{className:"w-5 h-5"}):jsx(PauseIcon,{className:"w-5 h-5"})})]})]})]})})});fe.displayName="Carousel";});pe();W();var Oe=cva("animate-pulse bg-[var(--accent-background)] relative",{variants:{variant:{rectangle:"rounded-md",circle:"rounded-full",text:"rounded-sm h-4"}},defaultVariants:{variant:"rectangle"}}),N=memo(forwardRef(({className:t,variant:e,...r},a)=>jsx("div",{ref:a,role:"status","aria-live":"polite","aria-busy":"true",className:b(Oe({variant:e}),t),...r,children:jsx("span",{className:"sr-only",children:"Loading..."})})));N.displayName="Skeleton";var St=lazy(()=>Promise.resolve().then(()=>(pe(),He)).then(t=>({default:t.Carousel})));function Nt(){return jsxs("div",{className:"flex flex-col gap-4 p-4",children:[jsx(N,{className:"h-8 w-3/4"}),jsx(N,{className:"h-4 w-full"}),jsx(N,{className:"h-4 w-5/6"}),jsxs("div",{className:"flex gap-2 mt-4",children:[jsx(N,{className:"h-3 w-3 rounded-full"}),jsx(N,{className:"h-3 w-3 rounded-full"}),jsx(N,{className:"h-3 w-3 rounded-full"})]})]})}function wt({minWidth:t=1024,preserveState:e=true,...r}){let[a,h]=useState(false),[n,w]=useState(false),[s,E]=useState(false);return useEffect(()=>{E(true);let V=()=>{let T=window.innerWidth>=t;h(T),T&&w(true);};return V(),window.addEventListener("resize",V),()=>window.removeEventListener("resize",V)},[t]),!s||!n&&!a?null:jsx(Activity,{mode:e&&!a?"hidden":"visible",children:jsx(Suspense,{fallback:jsx(Nt,{}),children:jsx(St,{...r})})})}export{fe as Carousel,wt as LazyCarousel};//# sourceMappingURL=index.mjs.map
10
3
  //# sourceMappingURL=index.mjs.map