@tribepad/themis 1.0.11 → 1.0.13

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 (224) hide show
  1. package/dist/elements/Accordion/Accordion.types.d.ts +44 -4
  2. package/dist/elements/Accordion/Accordion.types.d.ts.map +1 -1
  3. package/dist/elements/Accordion/index.js +1 -1
  4. package/dist/elements/Accordion/index.js.map +1 -1
  5. package/dist/elements/Accordion/index.mjs +1 -1
  6. package/dist/elements/Accordion/index.mjs.map +1 -1
  7. package/dist/elements/AlertDialog/AlertDialog.types.d.ts +19 -2
  8. package/dist/elements/AlertDialog/AlertDialog.types.d.ts.map +1 -1
  9. package/dist/elements/AlertDialog/index.js +1 -1
  10. package/dist/elements/AlertDialog/index.js.map +1 -1
  11. package/dist/elements/AlertDialog/index.mjs +1 -1
  12. package/dist/elements/AlertDialog/index.mjs.map +1 -1
  13. package/dist/elements/Avatar/Avatar.d.ts +1 -21
  14. package/dist/elements/Avatar/Avatar.d.ts.map +1 -1
  15. package/dist/elements/Avatar/Avatar.types.d.ts +30 -11
  16. package/dist/elements/Avatar/Avatar.types.d.ts.map +1 -1
  17. package/dist/elements/Avatar/AvatarGroup.d.ts +1 -17
  18. package/dist/elements/Avatar/AvatarGroup.d.ts.map +1 -1
  19. package/dist/elements/Avatar/index.js +1 -1
  20. package/dist/elements/Avatar/index.js.map +1 -1
  21. package/dist/elements/Avatar/index.mjs +1 -1
  22. package/dist/elements/Avatar/index.mjs.map +1 -1
  23. package/dist/elements/Badge/Badge.types.d.ts +16 -9
  24. package/dist/elements/Badge/Badge.types.d.ts.map +1 -1
  25. package/dist/elements/Badge/index.js +1 -1
  26. package/dist/elements/Badge/index.js.map +1 -1
  27. package/dist/elements/Badge/index.mjs +1 -1
  28. package/dist/elements/Badge/index.mjs.map +1 -1
  29. package/dist/elements/Breadcrumbs/Breadcrumbs.d.ts +2 -34
  30. package/dist/elements/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  31. package/dist/elements/Breadcrumbs/Breadcrumbs.types.d.ts +25 -2
  32. package/dist/elements/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -1
  33. package/dist/elements/Breadcrumbs/index.js +1 -1
  34. package/dist/elements/Breadcrumbs/index.js.map +1 -1
  35. package/dist/elements/Breadcrumbs/index.mjs +1 -1
  36. package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
  37. package/dist/elements/Button/Button.d.ts +1 -24
  38. package/dist/elements/Button/Button.d.ts.map +1 -1
  39. package/dist/elements/Button/Button.types.d.ts +28 -7
  40. package/dist/elements/Button/Button.types.d.ts.map +1 -1
  41. package/dist/elements/ButtonGroup/ButtonGroup.d.ts +3 -14
  42. package/dist/elements/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  43. package/dist/elements/ButtonGroup/ButtonGroup.types.d.ts +14 -5
  44. package/dist/elements/ButtonGroup/ButtonGroup.types.d.ts.map +1 -1
  45. package/dist/elements/ButtonGroup/index.js +1 -1
  46. package/dist/elements/ButtonGroup/index.js.map +1 -1
  47. package/dist/elements/ButtonGroup/index.mjs +1 -1
  48. package/dist/elements/ButtonGroup/index.mjs.map +1 -1
  49. package/dist/elements/Carousel/Carousel.types.d.ts +26 -7
  50. package/dist/elements/Carousel/Carousel.types.d.ts.map +1 -1
  51. package/dist/elements/Chart/Chart.d.ts +2 -40
  52. package/dist/elements/Chart/Chart.d.ts.map +1 -1
  53. package/dist/elements/Chart/Chart.types.d.ts +25 -10
  54. package/dist/elements/Chart/Chart.types.d.ts.map +1 -1
  55. package/dist/elements/Chart/index.js +1 -1
  56. package/dist/elements/Chart/index.js.map +1 -1
  57. package/dist/elements/Chart/index.mjs +1 -1
  58. package/dist/elements/Chart/index.mjs.map +1 -1
  59. package/dist/elements/Checkbox/Checkbox.d.ts +1 -31
  60. package/dist/elements/Checkbox/Checkbox.d.ts.map +1 -1
  61. package/dist/elements/Checkbox/Checkbox.types.d.ts +33 -1
  62. package/dist/elements/Checkbox/Checkbox.types.d.ts.map +1 -1
  63. package/dist/elements/Checkbox/index.js +1 -1
  64. package/dist/elements/Checkbox/index.js.map +1 -1
  65. package/dist/elements/Checkbox/index.mjs +1 -1
  66. package/dist/elements/Checkbox/index.mjs.map +1 -1
  67. package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts +1 -26
  68. package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  69. package/dist/elements/CheckboxGroup/CheckboxGroup.types.d.ts +48 -4
  70. package/dist/elements/CheckboxGroup/CheckboxGroup.types.d.ts.map +1 -1
  71. package/dist/elements/CheckboxGroup/index.js +1 -1
  72. package/dist/elements/CheckboxGroup/index.js.map +1 -1
  73. package/dist/elements/CheckboxGroup/index.mjs +1 -1
  74. package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
  75. package/dist/elements/Combobox/Combobox.d.ts +1 -30
  76. package/dist/elements/Combobox/Combobox.d.ts.map +1 -1
  77. package/dist/elements/Combobox/Combobox.types.d.ts +38 -4
  78. package/dist/elements/Combobox/Combobox.types.d.ts.map +1 -1
  79. package/dist/elements/Combobox/index.js +1 -1
  80. package/dist/elements/Combobox/index.js.map +1 -1
  81. package/dist/elements/Combobox/index.mjs +1 -1
  82. package/dist/elements/Combobox/index.mjs.map +1 -1
  83. package/dist/elements/Dropdown/Dropdown.d.ts +10 -124
  84. package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -1
  85. package/dist/elements/Dropdown/Dropdown.types.d.ts +53 -8
  86. package/dist/elements/Dropdown/Dropdown.types.d.ts.map +1 -1
  87. package/dist/elements/FileField/FileField.d.ts +2 -39
  88. package/dist/elements/FileField/FileField.d.ts.map +1 -1
  89. package/dist/elements/FileField/FileField.types.d.ts +31 -13
  90. package/dist/elements/FileField/FileField.types.d.ts.map +1 -1
  91. package/dist/elements/FileField/index.js +1 -1
  92. package/dist/elements/FileField/index.js.map +1 -1
  93. package/dist/elements/FileField/index.mjs +1 -1
  94. package/dist/elements/FileField/index.mjs.map +1 -1
  95. package/dist/elements/FormLayout/FormLayout.d.ts +2 -37
  96. package/dist/elements/FormLayout/FormLayout.d.ts.map +1 -1
  97. package/dist/elements/FormLayout/FormLayout.types.d.ts +19 -3
  98. package/dist/elements/FormLayout/FormLayout.types.d.ts.map +1 -1
  99. package/dist/elements/MatrixGrid/MatrixGrid.d.ts +2 -29
  100. package/dist/elements/MatrixGrid/MatrixGrid.d.ts.map +1 -1
  101. package/dist/elements/MatrixGrid/MatrixGrid.types.d.ts +22 -1
  102. package/dist/elements/MatrixGrid/MatrixGrid.types.d.ts.map +1 -1
  103. package/dist/elements/MatrixGrid/index.js +1 -1
  104. package/dist/elements/MatrixGrid/index.js.map +1 -1
  105. package/dist/elements/MatrixGrid/index.mjs +1 -1
  106. package/dist/elements/MatrixGrid/index.mjs.map +1 -1
  107. package/dist/elements/Modal/Modal.types.d.ts +69 -9
  108. package/dist/elements/Modal/Modal.types.d.ts.map +1 -1
  109. package/dist/elements/Pagination/Pagination.d.ts +2 -28
  110. package/dist/elements/Pagination/Pagination.d.ts.map +1 -1
  111. package/dist/elements/Pagination/Pagination.types.d.ts +26 -1
  112. package/dist/elements/Pagination/Pagination.types.d.ts.map +1 -1
  113. package/dist/elements/Pagination/index.js +1 -1
  114. package/dist/elements/Pagination/index.js.map +1 -1
  115. package/dist/elements/Pagination/index.mjs +1 -1
  116. package/dist/elements/Pagination/index.mjs.map +1 -1
  117. package/dist/elements/Panel/Panel.types.d.ts +67 -9
  118. package/dist/elements/Panel/Panel.types.d.ts.map +1 -1
  119. package/dist/elements/PasswordField/PasswordField.d.ts +2 -26
  120. package/dist/elements/PasswordField/PasswordField.d.ts.map +1 -1
  121. package/dist/elements/PasswordField/PasswordField.types.d.ts +27 -2
  122. package/dist/elements/PasswordField/PasswordField.types.d.ts.map +1 -1
  123. package/dist/elements/PasswordField/index.js +1 -1
  124. package/dist/elements/PasswordField/index.js.map +1 -1
  125. package/dist/elements/PasswordField/index.mjs +1 -1
  126. package/dist/elements/PasswordField/index.mjs.map +1 -1
  127. package/dist/elements/RadioGroup/RadioGroup.d.ts +1 -26
  128. package/dist/elements/RadioGroup/RadioGroup.d.ts.map +1 -1
  129. package/dist/elements/RadioGroup/RadioGroup.types.d.ts +43 -4
  130. package/dist/elements/RadioGroup/RadioGroup.types.d.ts.map +1 -1
  131. package/dist/elements/RadioGroup/index.js +1 -1
  132. package/dist/elements/RadioGroup/index.js.map +1 -1
  133. package/dist/elements/RadioGroup/index.mjs +1 -1
  134. package/dist/elements/RadioGroup/index.mjs.map +1 -1
  135. package/dist/elements/RatingScale/RatingScale.d.ts +2 -30
  136. package/dist/elements/RatingScale/RatingScale.d.ts.map +1 -1
  137. package/dist/elements/RatingScale/RatingScale.types.d.ts +29 -1
  138. package/dist/elements/RatingScale/RatingScale.types.d.ts.map +1 -1
  139. package/dist/elements/RatingScale/index.js +1 -1
  140. package/dist/elements/RatingScale/index.js.map +1 -1
  141. package/dist/elements/RatingScale/index.mjs +1 -1
  142. package/dist/elements/RatingScale/index.mjs.map +1 -1
  143. package/dist/elements/SearchField/SearchField.d.ts +2 -26
  144. package/dist/elements/SearchField/SearchField.d.ts.map +1 -1
  145. package/dist/elements/SearchField/SearchField.types.d.ts +26 -2
  146. package/dist/elements/SearchField/SearchField.types.d.ts.map +1 -1
  147. package/dist/elements/SearchField/index.js +1 -1
  148. package/dist/elements/SearchField/index.js.map +1 -1
  149. package/dist/elements/SearchField/index.mjs +1 -1
  150. package/dist/elements/SearchField/index.mjs.map +1 -1
  151. package/dist/elements/Select/Select.d.ts +3 -61
  152. package/dist/elements/Select/Select.d.ts.map +1 -1
  153. package/dist/elements/Select/Select.types.d.ts +52 -4
  154. package/dist/elements/Select/Select.types.d.ts.map +1 -1
  155. package/dist/elements/Select/index.js +1 -1
  156. package/dist/elements/Select/index.js.map +1 -1
  157. package/dist/elements/Select/index.mjs +1 -1
  158. package/dist/elements/Select/index.mjs.map +1 -1
  159. package/dist/elements/SituationalJudgement/SituationalJudgement.d.ts +2 -28
  160. package/dist/elements/SituationalJudgement/SituationalJudgement.d.ts.map +1 -1
  161. package/dist/elements/SituationalJudgement/SituationalJudgement.types.d.ts +23 -1
  162. package/dist/elements/SituationalJudgement/SituationalJudgement.types.d.ts.map +1 -1
  163. package/dist/elements/SituationalJudgement/index.js +1 -1
  164. package/dist/elements/SituationalJudgement/index.js.map +1 -1
  165. package/dist/elements/SituationalJudgement/index.mjs +1 -1
  166. package/dist/elements/SituationalJudgement/index.mjs.map +1 -1
  167. package/dist/elements/Skeleton/Skeleton.types.d.ts +11 -6
  168. package/dist/elements/Skeleton/Skeleton.types.d.ts.map +1 -1
  169. package/dist/elements/Skeleton/index.js +1 -1
  170. package/dist/elements/Skeleton/index.js.map +1 -1
  171. package/dist/elements/Skeleton/index.mjs +1 -1
  172. package/dist/elements/Skeleton/index.mjs.map +1 -1
  173. package/dist/elements/Switch/Switch.types.d.ts +31 -7
  174. package/dist/elements/Switch/Switch.types.d.ts.map +1 -1
  175. package/dist/elements/Switch/index.js +1 -1
  176. package/dist/elements/Switch/index.js.map +1 -1
  177. package/dist/elements/Switch/index.mjs +1 -1
  178. package/dist/elements/Switch/index.mjs.map +1 -1
  179. package/dist/elements/Table/Table.d.ts +7 -79
  180. package/dist/elements/Table/Table.d.ts.map +1 -1
  181. package/dist/elements/Table/Table.types.d.ts +82 -17
  182. package/dist/elements/Table/Table.types.d.ts.map +1 -1
  183. package/dist/elements/Table/index.js +1 -1
  184. package/dist/elements/Table/index.js.map +1 -1
  185. package/dist/elements/Table/index.mjs +1 -1
  186. package/dist/elements/Table/index.mjs.map +1 -1
  187. package/dist/elements/Tabs/Tabs.d.ts.map +1 -1
  188. package/dist/elements/Tabs/Tabs.types.d.ts +61 -5
  189. package/dist/elements/Tabs/Tabs.types.d.ts.map +1 -1
  190. package/dist/elements/Tabs/index.js +1 -1
  191. package/dist/elements/Tabs/index.js.map +1 -1
  192. package/dist/elements/Tabs/index.mjs +1 -1
  193. package/dist/elements/Tabs/index.mjs.map +1 -1
  194. package/dist/elements/TextField/TextField.d.ts +6 -71
  195. package/dist/elements/TextField/TextField.d.ts.map +1 -1
  196. package/dist/elements/TextField/TextField.types.d.ts +76 -12
  197. package/dist/elements/TextField/TextField.types.d.ts.map +1 -1
  198. package/dist/elements/TextField/index.js +1 -1
  199. package/dist/elements/TextField/index.js.map +1 -1
  200. package/dist/elements/TextField/index.mjs +1 -1
  201. package/dist/elements/TextField/index.mjs.map +1 -1
  202. package/dist/elements/Toast/Toast.types.d.ts +12 -20
  203. package/dist/elements/Toast/Toast.types.d.ts.map +1 -1
  204. package/dist/elements/Toast/Toaster.d.ts +2 -5
  205. package/dist/elements/Toast/Toaster.d.ts.map +1 -1
  206. package/dist/elements/Toast/index.js +1 -1
  207. package/dist/elements/Toast/index.js.map +1 -1
  208. package/dist/elements/Toast/index.mjs +1 -1
  209. package/dist/elements/Toast/index.mjs.map +1 -1
  210. package/dist/elements/Tooltip/Tooltip.types.d.ts +39 -4
  211. package/dist/elements/Tooltip/Tooltip.types.d.ts.map +1 -1
  212. package/dist/elements/Tooltip/index.js +1 -1
  213. package/dist/elements/Tooltip/index.js.map +1 -1
  214. package/dist/elements/Tooltip/index.mjs +1 -1
  215. package/dist/elements/Tooltip/index.mjs.map +1 -1
  216. package/dist/elements/index.js +1 -1
  217. package/dist/elements/index.js.map +1 -1
  218. package/dist/elements/index.mjs +1 -1
  219. package/dist/elements/index.mjs.map +1 -1
  220. package/dist/index.js +2 -2
  221. package/dist/index.js.map +1 -1
  222. package/dist/index.mjs +2 -2
  223. package/dist/index.mjs.map +1 -1
  224. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/MatrixGrid/MatrixGrid.styles.ts","../../../src/elements/MatrixGrid/MatrixGrid.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/MatrixGrid/MatrixGrid.types.ts"],"names":["cn","inputs","twMerge","clsx","matrixGridContainerVariants","cva","matrixGridScrollContainerVariants","matrixGridTableVariants","matrixGridColumnHeaderVariants","matrixGridRowHeaderVariants","matrixGridCellVariants","matrixGridRowVariants","matrixGridRadioOuterVariants","matrixGridRadioVisualVariants","matrixGridRadioDotVariants","MatrixGrid","forwardRef","props","ref","rows","columns","value","onChange","label","description","errorMessage","isRequired","isDisabled","isReadOnly","isInvalid","size","className","id","ariaLabel","ariaDescribedby","dataTestId","generatedId","useId","groupId","labelId","descriptionId","errorId","describedByParts","isControlled","internalValue","setInternalValue","useState","currentValue","focusedCell","setFocusedCell","gridRef","useRef","handleSelect","useCallback","rowId","colId","newValue","focusCell","rowIdx","colIdx","table","row","cell","button","handleKeyDown","maxRow","maxCol","nextRow","nextCol","handled","targetRow","targetCol","handleCellClick","handleCellFocus","jsxs","jsx","col","isSelected","isFocused","BaseComponentPropsSchema","z","MatrixGridSizeSchema","MatrixGridRowSchema","MatrixGridColumnSchema","MatrixGridPropsSchema","data","ids","r","c"],"mappings":"sOAcO,SAASA,MAAMC,CAAAA,CAA8B,CAClD,OAAOC,OAAAA,CAAQC,KAAKF,CAAM,CAAC,CAC7B,CCFO,IAAMG,CAAAA,CAA8BC,IAAI,uBAAA,CAAyB,CACtE,QAAA,CAAU,CACR,KAAM,CACJ,EAAA,CAAI,SAAA,CACJ,OAAA,CAAS,UACT,EAAA,CAAI,WACN,CACF,CAAA,CACA,gBAAiB,CAAE,IAAA,CAAM,SAAU,CACrC,CAAC,EAGYC,CAAAA,CAAoCD,GAAAA,CAC/C,4BAAA,CACA,CACE,SAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,SACJ,OAAA,CAAS,MAAA,CACT,EAAA,CAAI,QACN,CACF,CAAA,CACA,eAAA,CAAiB,CAAE,IAAA,CAAM,SAAU,CACrC,CACF,CAAA,CAOaE,CAAAA,CAA0BF,GAAAA,CACrC,yBACA,CACE,QAAA,CAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,EAAA,CACJ,OAAA,CAAS,EAAA,CACT,GAAI,EACN,CACF,CAAA,CACA,eAAA,CAAiB,CAAE,IAAA,CAAM,SAAU,CACrC,CACF,EAOaG,CAAAA,CAAiCH,GAAAA,CAC5C,CACE,0DAAA,CACA,mBACF,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CACV,CACE,QAAA,CAAU,CACR,KAAM,CACJ,EAAA,CAAI,sBACJ,OAAA,CAAS,mBAAA,CACT,EAAA,CAAI,qBACN,CACF,CAAA,CACA,eAAA,CAAiB,CAAE,IAAA,CAAM,SAAU,CACrC,CACF,CAAA,CAGaI,CAAAA,CAA8BJ,IACzC,CACE,wDAAA,CACA,eACF,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CACV,CACE,QAAA,CAAU,CACR,KAAM,CACJ,EAAA,CAAI,qBAAA,CACJ,OAAA,CAAS,oBACT,EAAA,CAAI,qBACN,CACF,CAAA,CACA,gBAAiB,CAAE,IAAA,CAAM,SAAU,CACrC,CACF,EAOaK,CAAAA,CAAyBL,GAAAA,CACpC,uCAAA,CACA,CACE,SAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,cACJ,OAAA,CAAS,WAAA,CACT,EAAA,CAAI,aACN,CACF,CAAA,CACA,eAAA,CAAiB,CAAE,IAAA,CAAM,SAAU,CACrC,CACF,CAAA,CAGaM,CAAAA,CAAwBN,IACnC,iCAAA,CACA,CACE,QAAA,CAAU,CACR,OAAQ,CACN,IAAA,CAAM,sBAAA,CACN,KAAA,CAAO,EACT,CACF,CAAA,CACA,gBAAiB,CAAE,MAAA,CAAQ,KAAM,CACnC,CACF,CAAA,CAOaO,CAAAA,CAA+BP,IAC1C,CACE,yCAAA,CACA,2BAAA,CACA,2BAAA,CACA,sHACA,2HAAA,CACA,kDACF,CAAA,CAAE,IAAA,CAAK,GAAG,CACZ,CAAA,CAGaQ,EAAgCR,GAAAA,CAC3C,CACE,wBACA,gCAAA,CACA,+BAAA,CACA,kCACF,CAAA,CAAE,KAAK,GAAG,CAAA,CACV,CACE,QAAA,CAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,SAAA,CACJ,QAAS,SAAA,CACT,EAAA,CAAI,SACN,CAAA,CACA,UAAA,CAAY,CACV,IAAA,CAAM,2DAAA,CACN,KAAA,CAAO,2DACT,EACA,SAAA,CAAW,CACT,IAAA,CAAM,wCAAA,CACN,MAAO,EACT,CACF,CAAA,CACA,gBAAA,CAAkB,CAChB,CACE,UAAA,CAAY,KACZ,SAAA,CAAW,IAAA,CACX,UAAW,2EACb,CACF,CAAA,CACA,eAAA,CAAiB,CACf,IAAA,CAAM,SAAA,CACN,UAAA,CAAY,KAAA,CACZ,UAAW,KACb,CACF,CACF,CAAA,CAGaS,EAA6BT,GAAAA,CACxC,CACE,qDACA,mCAAA,CACA,+BACF,EAAE,IAAA,CAAK,GAAG,CAAA,CACV,CACE,SAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,cACJ,OAAA,CAAS,SAAA,CACT,EAAA,CAAI,aACN,EACA,UAAA,CAAY,CACV,KAAM,WAAA,CACN,KAAA,CAAO,SACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,KAAM,SAAA,CACN,UAAA,CAAY,KACd,CACF,CACF,MC1KMU,EAAAA,CAAaC,UAAAA,CACjB,SAAoBC,CAAAA,CAAwBC,CAAAA,CAAmC,CAC7E,GAAM,CAEJ,IAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CAEA,MAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CAEA,KAAA,CAAAC,EACA,WAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CAEA,WAAAC,EAAAA,CAAa,KAAA,CACb,UAAA,CAAAC,CAAAA,CAAa,MACb,UAAA,CAAAC,CAAAA,CAAa,KAAA,CACb,SAAA,CAAAC,EAAY,KAAA,CAEZ,IAAA,CAAAC,CAAAA,CAAO,SAAA,CAEP,UAAAC,EAAAA,CACA,EAAA,CAAAC,GACA,YAAA,CAAcC,CAAAA,CACd,mBAAoBC,CAAAA,CACpB,aAAA,CAAeC,EACjB,CAAA,CAAIlB,EAEEmB,EAAAA,CAAcC,KAAAA,EAAM,CACpBC,CAAAA,CAAUN,IAAMI,EAAAA,CAChBG,CAAAA,CAAU,CAAA,EAAGD,CAAO,SACpBE,CAAAA,CAAgB,CAAA,EAAGF,CAAO,CAAA,YAAA,CAAA,CAC1BG,CAAAA,CAAU,GAAGH,CAAO,CAAA,MAAA,CAAA,CAEpBI,CAAAA,CAA6B,GAC/BR,CAAAA,EAAiBQ,CAAAA,CAAiB,IAAA,CAAKR,CAAe,EACtDV,CAAAA,EAAakB,CAAAA,CAAiB,IAAA,CAAKF,CAAa,EAChDX,CAAAA,EAAaJ,CAAAA,EAAciB,EAAiB,IAAA,CAAKD,CAAO,EAG5D,IAAME,CAAAA,CAAetB,CAAAA,GAAU,MAAA,CACzB,CAACuB,EAAAA,CAAeC,EAAgB,CAAA,CAAIC,QAAAA,CAAwC,EAAE,CAAA,CAC9EC,CAAAA,CAAeJ,CAAAA,CAAgBtB,GAAS,EAAC,CAAKuB,EAAAA,CAI9C,CAACI,EAAaC,CAAc,CAAA,CAAIH,QAAAA,CAA2B,CAAC,EAAG,CAAC,CAAC,CAAA,CACjEI,CAAAA,CAAUC,OAAyB,IAAI,CAAA,CAEvCC,CAAAA,CAAeC,WAAAA,CACnB,CAACC,CAAAA,CAAeC,CAAAA,GAAkB,CAChC,GAAI5B,CAAAA,EAAcC,EAAY,OAC9B,IAAM4B,CAAAA,CAAW,CAAE,GAAGT,CAAAA,CAAc,CAACO,CAAK,EAAGC,CAAM,CAAA,CAC9CZ,CAAAA,EACHE,EAAAA,CAAiBW,CAAQ,EAE3BlC,CAAAA,GAAWkC,CAAQ,EACrB,CAAA,CACA,CAACT,EAAczB,CAAAA,CAAUK,CAAAA,CAAYC,CAAAA,CAAYe,CAAY,CAC/D,CAAA,CAEMc,CAAAA,CAAYJ,WAAAA,CAChB,CAACK,EAAgBC,CAAAA,GAAmB,CAClCV,CAAAA,CAAe,CAACS,EAAQC,CAAM,CAAC,EAE/B,IAAMC,CAAAA,CAAQV,EAAQ,OAAA,CACtB,GAAI,CAACU,CAAAA,CAAO,OACZ,IAAMC,CAAAA,CAAMD,CAAAA,CAAM,gBAAA,CAAiB,UAAU,CAAA,CAAEF,CAAM,CAAA,CACrD,GAAI,CAACG,CAAAA,CAAK,OAEV,IAAMC,CAAAA,CAAOD,EAAI,gBAAA,CAAiB,IAAI,CAAA,CAAEF,CAAM,EAC9C,GAAI,CAACG,CAAAA,CAAM,OACX,IAAMC,CAAAA,CAASD,CAAAA,CAAK,aAAA,CAAc,QAAQ,EACtCC,CAAAA,EAAQA,CAAAA,CAAO,QACrB,CAAA,CACA,EACF,CAAA,CAEMC,EAAAA,CAAgBX,WAAAA,CACnB,GAAuC,CACtC,GAAM,CAACK,CAAAA,CAAQC,CAAM,CAAA,CAAIX,CAAAA,CACnBiB,CAAAA,CAAS9C,CAAAA,CAAK,OAAS,CAAA,CACvB+C,CAAAA,CAAS9C,EAAQ,MAAA,CAAS,CAAA,CAE5B+C,EAAUT,CAAAA,CACVU,CAAAA,CAAUT,CAAAA,CACVU,CAAAA,CAAU,MAEd,OAAQ,CAAA,CAAE,GAAA,EACR,KAAK,YAAA,CACHD,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAIT,EAAS,CAAA,CAAGO,CAAM,EACrCG,CAAAA,CAAU,IAAA,CACV,MACF,KAAK,WAAA,CACHD,CAAAA,CAAU,IAAA,CAAK,IAAIT,CAAAA,CAAS,CAAA,CAAG,CAAC,CAAA,CAChCU,EAAU,IAAA,CACV,MACF,KAAK,WAAA,CACHF,EAAU,IAAA,CAAK,GAAA,CAAIT,EAAS,CAAA,CAAGO,CAAM,EACrCI,CAAAA,CAAU,IAAA,CACV,MACF,KAAK,UACHF,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAIT,CAAAA,CAAS,EAAG,CAAC,CAAA,CAChCW,CAAAA,CAAU,IAAA,CACV,MACF,KAAK,MAAA,CACHD,EAAU,CAAA,CACVC,CAAAA,CAAU,KACV,MACF,KAAK,KAAA,CACHD,CAAAA,CAAUF,EACVG,CAAAA,CAAU,IAAA,CACV,MACF,KAAK,IACL,KAAK,OAAA,CAAS,CACZ,IAAMC,EAAYnD,CAAAA,CAAKuC,CAAM,EACvBa,CAAAA,CAAYnD,CAAAA,CAAQuC,CAAM,CAAA,CAC5B,CAAChC,CAAAA,EAAc,CAACC,GAAc0C,CAAAA,EAAaC,CAAAA,EAC7CnB,CAAAA,CAAakB,CAAAA,CAAU,GAAIC,CAAAA,CAAU,EAAE,CAAA,CAEzCF,CAAAA,CAAU,KACV,KACF,CAGF,CAEIA,IACF,CAAA,CAAE,cAAA,EAAe,CAAA,CACbF,CAAAA,GAAYT,GAAUU,CAAAA,GAAYT,CAAAA,GACpCF,CAAAA,CAAUU,CAAAA,CAASC,CAAO,CAAA,EAGhC,CAAA,CACA,CAACpB,CAAAA,CAAa7B,EAAMC,CAAAA,CAASgC,CAAAA,CAAcK,CAAAA,CAAW9B,CAAAA,CAAYC,CAAU,CAC9E,CAAA,CAEM4C,EAAAA,CAAkBnB,WAAAA,CACtB,CAACK,CAAAA,CAAgBC,CAAAA,CAAgBL,CAAAA,CAAeC,CAAAA,GAAkB,CAChEN,CAAAA,CAAe,CAACS,CAAAA,CAAQC,CAAM,CAAC,CAAA,CAC/BP,CAAAA,CAAaE,EAAOC,CAAK,EAC3B,EACA,CAACH,CAAY,CACf,CAAA,CAEMqB,GAAkBpB,WAAAA,CACtB,CAACK,CAAAA,CAAgBC,CAAAA,GAAmB,CAClCV,CAAAA,CAAe,CAACS,CAAAA,CAAQC,CAAM,CAAC,EACjC,CAAA,CACA,EACF,CAAA,CAEA,OACEe,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKxD,CAAAA,CACL,GAAIoB,CAAAA,CACJ,IAAA,CAAK,OAAA,CACL,YAAA,CAAYL,EACZ,iBAAA,CAAiBV,CAAAA,CAAQgB,CAAAA,CAAU,MAAA,CACnC,mBAAkBG,CAAAA,CAAiB,MAAA,CAAS,EAAIA,CAAAA,CAAiB,IAAA,CAAK,GAAG,CAAA,CAAI,MAAA,CAC7E,aAAA,CAAaP,EAAAA,CACb,UAAWnC,EAAAA,CAAGI,CAAAA,CAA4B,CAAE,IAAA,CAAA0B,CAAK,CAAC,CAAA,CAAGC,EAAS,CAAA,CAG7D,UAAAR,CAAAA,EACCmD,IAAAA,CAAC,MAAA,CAAA,CAAK,EAAA,CAAInC,EAAS,SAAA,CAAU,sDAAA,CAC1B,QAAA,CAAA,CAAAhB,CAAAA,CACAG,IACCiD,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,2CAAA,CAA4C,cAAY,MAAA,CAAO,QAAA,CAAA,GAAA,CAE/E,CAAA,CAAA,CAEJ,CAAA,CAIDnD,GACCmD,GAAAA,CAAC,MAAA,CAAA,CACC,GAAInC,CAAAA,CACJ,SAAA,CAAU,mCAET,QAAA,CAAAhB,CAAAA,CACH,CAAA,CAIFmD,GAAAA,CAAC,OAAI,SAAA,CAAWrE,CAAAA,CAAkC,CAAE,IAAA,CAAAwB,CAAK,CAAC,CAAA,CACxD,QAAA,CAAA4C,IAAAA,CAAC,SACC,GAAA,CAAKxB,CAAAA,CACL,KAAK,MAAA,CACL,YAAA,CAAYjB,GAAaV,CAAAA,CACzB,SAAA,CAAWyC,EAAAA,CACX,SAAA,CAAWzD,EAAwB,CAAE,IAAA,CAAAuB,CAAK,CAAC,EAE3C,QAAA,CAAA,CAAA6C,GAAAA,CAAC,OAAA,CAAA,CACC,QAAA,CAAAD,KAAC,IAAA,CAAA,CAAG,IAAA,CAAK,MAEP,QAAA,CAAA,CAAAC,GAAAA,CAAC,MAAG,SAAA,CAAWnE,CAAAA,CAA+B,CAAE,IAAA,CAAAsB,CAAK,CAAC,CAAA,CAAG,CAAA,CACxDV,CAAAA,CAAQ,IAAKwD,CAAAA,EACZD,GAAAA,CAAC,IAAA,CAAA,CAEC,EAAA,CAAI,GAAGrC,CAAO,CAAA,KAAA,EAAQsC,CAAAA,CAAI,EAAE,GAC5B,KAAA,CAAM,KAAA,CACN,IAAA,CAAK,cAAA,CACL,UAAWpE,CAAAA,CAA+B,CAAE,IAAA,CAAAsB,CAAK,CAAC,CAAA,CAEjD,QAAA,CAAA8C,CAAAA,CAAI,KAAA,CAAA,CANAA,EAAI,EAOX,CACD,GACH,CAAA,CACF,CAAA,CACAD,IAAC,OAAA,CAAA,CACE,QAAA,CAAAxD,CAAAA,CAAK,GAAA,CAAI,CAAC0C,CAAAA,CAAKH,CAAAA,GACdgB,IAAAA,CAAC,IAAA,CAAA,CAEC,KAAK,KAAA,CACL,SAAA,CAAW/D,CAAAA,CAAsB,CAAE,OAAQ+C,CAAAA,CAAS,CAAA,GAAM,CAAE,CAAC,CAAA,CAE7D,UAAAiB,GAAAA,CAAC,IAAA,CAAA,CACC,KAAA,CAAM,KAAA,CACN,KAAK,WAAA,CACL,SAAA,CAAWlE,CAAAA,CAA4B,CAAE,KAAAqB,CAAK,CAAC,CAAA,CAE9C,QAAA,CAAA+B,EAAI,KAAA,CACP,CAAA,CACCzC,EAAQ,GAAA,CAAI,CAACwD,EAAKjB,CAAAA,GAAW,CAC5B,IAAMkB,CAAAA,CAAa9B,EAAac,CAAAA,CAAI,EAAE,CAAA,GAAMe,CAAAA,CAAI,GAC1CE,CAAAA,CAAY9B,CAAAA,CAAY,CAAC,CAAA,GAAMU,GAAUV,CAAAA,CAAY,CAAC,IAAMW,CAAAA,CAElE,OACEgB,IAAC,IAAA,CAAA,CAEC,IAAA,CAAK,UAAA,CACL,kBAAA,CAAkB,GAAGrC,CAAO,CAAA,KAAA,EAAQsC,CAAAA,CAAI,EAAE,GAC1C,SAAA,CAAWlE,CAAAA,CAAuB,CAAE,IAAA,CAAAoB,CAAK,CAAC,CAAA,CAE1C,SAAA6C,GAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,IAAA,CAAK,OAAA,CACL,cAAA,CAAcE,EACd,YAAA,CAAY,CAAA,EAAGhB,CAAAA,CAAI,KAAK,KAAKe,CAAAA,CAAI,KAAK,CAAA,CAAA,CACtC,QAAA,CAAUE,EAAY,CAAA,CAAI,EAAA,CAC1B,SAAUnD,CAAAA,CACV,OAAA,CAAS,IAAM6C,EAAAA,CAAgBd,CAAAA,CAAQC,CAAAA,CAAQE,CAAAA,CAAI,GAAIe,CAAAA,CAAI,EAAE,CAAA,CAC7D,OAAA,CAAS,IAAMH,EAAAA,CAAgBf,CAAAA,CAAQC,CAAM,CAAA,CAC7C,UAAW/C,CAAAA,EAA6B,CAExC,SAAA+D,GAAAA,CAAC,MAAA,CAAA,CACC,UAAW9D,CAAAA,CAA8B,CACvC,IAAA,CAAAiB,CAAAA,CACA,WAAA+C,CAAAA,CACA,SAAA,CAAAhD,CACF,CAAC,EACD,aAAA,CAAY,MAAA,CAEZ,QAAA,CAAA8C,GAAAA,CAAC,QACC,SAAA,CAAW7D,CAAAA,CAA2B,CACpC,IAAA,CAAAgB,EACA,UAAA,CAAA+C,CACF,CAAC,CAAA,CACH,EACF,CAAA,CACF,CAAA,CAAA,CA/BKD,CAAAA,CAAI,EAgCX,CAEJ,CAAC,CAAA,CAAA,CAAA,CAnDIf,CAAAA,CAAI,EAoDX,CACD,CAAA,CACH,CAAA,CAAA,CACF,EACF,CAAA,CAGChC,CAAAA,EAAaJ,GACZkD,GAAAA,CAAC,KAAA,CAAA,CACC,EAAA,CAAIlC,CAAAA,CACJ,KAAK,OAAA,CACL,SAAA,CAAU,8CAAA,CAET,QAAA,CAAAhB,EACH,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAV,GAAW,WAAA,CAAc,YAAA,CC/TlB,IAAMgE,EAAAA,CAA2BC,CAAAA,CAAE,MAAA,CAAO,CAE/C,UAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAGtB,QAAA,CAAUA,CAAAA,CAAE,KAAI,CAAE,QAAA,GAClB,EAAA,CAAIA,CAAAA,CAAE,MAAA,EAAO,CAAE,UAAS,CAGxB,YAAA,CAAcA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAClC,iBAAA,CAAmBA,CAAAA,CAAE,QAAO,CAAE,QAAA,GAC9B,kBAAA,CAAoBA,CAAAA,CAAE,QAAO,CAAE,QAAA,EAAS,CACxC,WAAA,CAAaA,EAAE,IAAA,CAAK,CAAC,KAAA,CAAO,QAAA,CAAU,WAAW,CAAC,CAAA,CAAE,QAAA,EAAS,CAC7D,cAAeA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAGpC,cAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAC5B,CAAC,CAAA,CCnBM,IAAMC,EAAAA,CAAuBD,EAAE,IAAA,CAAK,CAAC,IAAA,CAAM,SAAA,CAAW,IAAI,CAAC,CAAA,CAMrDE,GAAsBF,CAAAA,CAAE,MAAA,CAAO,CAC1C,EAAA,CAAIA,CAAAA,CAAE,MAAA,EAAO,CACb,MAAOA,CAAAA,CAAE,MAAA,EACX,CAAC,EAOYG,EAAAA,CAAyBH,CAAAA,CAAE,MAAA,CAAO,CAC7C,GAAIA,CAAAA,CAAE,MAAA,GACN,KAAA,CAAOA,CAAAA,CAAE,QACX,CAAC,CAAA,CAaYI,EAAAA,CAAwBL,GAAyB,MAAA,CAAO,CAEnE,IAAA,CAAMC,CAAAA,CAAE,MAAME,EAAmB,CAAA,CAAE,GAAA,CAAI,CAAC,EACxC,OAAA,CAASF,CAAAA,CAAE,KAAA,CAAMG,EAAsB,EAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAGtD,KAAA,CAAOH,CAAAA,CAAE,MAAA,CAAOA,EAAE,MAAA,EAAO,CAAGA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAU,EAAE,QAAA,EAAS,CAC5D,SAAUA,CAAAA,CAAE,MAAA,EAAuD,CAAE,QAAA,GAGrE,KAAA,CAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,UAAS,CAC3B,WAAA,CAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CACjC,aAAcA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAGlC,UAAA,CAAYA,CAAAA,CAAE,SAAQ,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,KAAK,CAAA,CAChD,UAAA,CAAYA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA,CAChD,WAAYA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,GAAW,OAAA,CAAQ,KAAK,CAAA,CAChD,SAAA,CAAWA,EAAE,OAAA,EAAQ,CAAE,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA,CAG/C,KAAMC,EAAAA,CAAqB,QAAA,GAAW,OAAA,CAAQ,SAAS,CACzD,CAAC,EAAE,MAAA,CACAI,CAAAA,EAAS,CACR,IAAMC,EAAMD,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAKE,CAAAA,EAAMA,EAAE,EAAE,CAAA,CACrC,OAAO,IAAI,GAAA,CAAID,CAAG,CAAA,CAAE,IAAA,GAASA,CAAAA,CAAI,MACnC,EACA,CAAE,OAAA,CAAS,wBAAA,CAA0B,IAAA,CAAM,CAAC,MAAM,CAAE,CACtD,CAAA,CAAE,OACCD,CAAAA,EAAS,CACR,IAAMC,CAAAA,CAAMD,CAAAA,CAAK,QAAQ,GAAA,CAAKG,CAAAA,EAAMA,CAAAA,CAAE,EAAE,EACxC,OAAO,IAAI,GAAA,CAAIF,CAAG,EAAE,IAAA,GAASA,CAAAA,CAAI,MACnC,CAAA,CACA,CAAE,OAAA,CAAS,2BAAA,CAA6B,KAAM,CAAC,SAAS,CAAE,CAC5D","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 * MatrixGrid CVA Variant Definitions\n *\n * 10 variant groups covering container, table, headers, cells, and radio elements.\n * All interactive elements maintain 44x44px minimum touch targets (WCAG 2.2 AAA).\n */\n\n// =============================================================================\n// Container\n// =============================================================================\n\n/** Root wrapper (flex col, gap, text size) */\nexport const matrixGridContainerVariants = cva(\"flex flex-col gap-1.5\", {\n variants: {\n size: {\n sm: \"text-sm\",\n default: \"text-sm\",\n lg: \"text-base\",\n },\n },\n defaultVariants: { size: \"default\" },\n});\n\n/** Horizontal scroll wrapper with padding for focus ring breathing room */\nexport const matrixGridScrollContainerVariants = cva(\n \"overflow-x-auto -mx-1 px-1\",\n {\n variants: {\n size: {\n sm: \"py-0.5\",\n default: \"py-1\",\n lg: \"py-1.5\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n// =============================================================================\n// Table / Grid\n// =============================================================================\n\n/** Grid element (border-collapse, density) */\nexport const matrixGridTableVariants = cva(\n \"w-full border-collapse\",\n {\n variants: {\n size: {\n sm: \"\",\n default: \"\",\n lg: \"\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n// =============================================================================\n// Headers\n// =============================================================================\n\n/** Column header cells (centered, size padding) */\nexport const matrixGridColumnHeaderVariants = cva(\n [\n \"text-center font-medium text-[var(--content-foreground)]\",\n \"whitespace-nowrap\",\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"px-2 py-1.5 text-xs\",\n default: \"px-3 py-2 text-sm\",\n lg: \"px-4 py-3 text-base\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n/** Row header cells (left-aligned, min-width) */\nexport const matrixGridRowHeaderVariants = cva(\n [\n \"text-left font-normal text-[var(--content-foreground)]\",\n \"min-w-[120px]\",\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"px-2 py-1.5 text-xs\",\n default: \"px-3 py-2 text-sm\",\n lg: \"px-4 py-3 text-base\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n// =============================================================================\n// Cells & Rows\n// =============================================================================\n\n/** Data cells (centered, 44px min touch target) */\nexport const matrixGridCellVariants = cva(\n \"text-center min-w-[44px] min-h-[44px]\",\n {\n variants: {\n size: {\n sm: \"px-1 py-0.5\",\n default: \"px-2 py-1\",\n lg: \"px-3 py-1.5\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n/** Row styling with zebra striping */\nexport const matrixGridRowVariants = cva(\n \"border-b border-[var(--border)]\",\n {\n variants: {\n isEven: {\n true: \"bg-[var(--muted)]/30\",\n false: \"\",\n },\n },\n defaultVariants: { isEven: false },\n }\n);\n\n// =============================================================================\n// Radio (Three-Layer Architecture)\n// =============================================================================\n\n/** Layer 1: Transparent 44x44px touch target with focus ring */\nexport const matrixGridRadioOuterVariants = cva(\n [\n \"inline-flex items-center justify-center\",\n \"min-h-[44px] min-w-[44px]\",\n \"cursor-pointer rounded-sm\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--themis-ring)] focus-visible:ring-offset-2\",\n \"hc:focus-visible:outline hc:focus-visible:outline-4 hc:focus-visible:outline-offset-2 hc:focus-visible:outline-foreground\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n ].join(\" \"),\n);\n\n/** Layer 2: Radio circle (size, selected, invalid) */\nexport const matrixGridRadioVisualVariants = cva(\n [\n \"rounded-full border-2\",\n \"transition-colors duration-200\",\n \"motion-reduce:transition-none\",\n \"flex items-center justify-center\",\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"h-4 w-4\",\n default: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n isSelected: {\n true: \"border-[var(--primary-action)] bg-[var(--primary-action)]\",\n false: \"border-[var(--input-border)] bg-[var(--input-background)]\",\n },\n isInvalid: {\n true: \"border-[var(--destructive-background)]\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n isSelected: true,\n isInvalid: true,\n className: \"border-[var(--destructive-background)] bg-[var(--destructive-background)]\",\n },\n ],\n defaultVariants: {\n size: \"default\",\n isSelected: false,\n isInvalid: false,\n },\n }\n);\n\n/** Layer 3: Inner dot with spring animation */\nexport const matrixGridRadioDotVariants = cva(\n [\n \"rounded-full bg-[var(--primary-action-foreground)]\",\n \"transition-transform duration-200\",\n \"motion-reduce:transition-none\",\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"h-1.5 w-1.5\",\n default: \"h-2 w-2\",\n lg: \"h-2.5 w-2.5\",\n },\n isSelected: {\n true: \"scale-100\",\n false: \"scale-0\",\n },\n },\n defaultVariants: {\n size: \"default\",\n isSelected: false,\n },\n }\n);\n","'use client';\n\n/**\n * MatrixGrid Component\n * Grid-style survey question with rows (statements) and columns (rating options).\n * Each row has a single radio selection.\n *\n * Uses role=\"grid\" ARIA pattern with roving tabindex for keyboard navigation.\n * Built from React Aria primitives directly for cell-based selection.\n *\n * @see WCAG 2.2 AAA — 44x44px touch targets, 7:1 contrast, keyboard navigation\n */\n\nimport {\n forwardRef,\n useState,\n useId,\n useCallback,\n useRef,\n type ForwardedRef,\n type KeyboardEvent,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport type { MatrixGridProps } from './MatrixGrid.types';\nimport {\n matrixGridContainerVariants,\n matrixGridScrollContainerVariants,\n matrixGridTableVariants,\n matrixGridColumnHeaderVariants,\n matrixGridRowHeaderVariants,\n matrixGridCellVariants,\n matrixGridRadioOuterVariants,\n matrixGridRadioVisualVariants,\n matrixGridRadioDotVariants,\n matrixGridRowVariants,\n} from './MatrixGrid.styles';\n\n// =============================================================================\n// MatrixGrid Component\n// =============================================================================\n\nconst MatrixGrid = forwardRef<HTMLDivElement, MatrixGridProps>(\n function MatrixGrid(props: MatrixGridProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n // Data\n rows,\n columns,\n // Value\n value,\n onChange,\n // Labels\n label,\n description,\n errorMessage,\n // State\n isRequired = false,\n isDisabled = false,\n isReadOnly = false,\n isInvalid = false,\n // Sizing\n size = 'default',\n // Standard\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n } = props;\n\n const generatedId = useId();\n const groupId = id ?? generatedId;\n const labelId = `${groupId}-label`;\n const descriptionId = `${groupId}-description`;\n const errorId = `${groupId}-error`;\n\n const describedByParts: string[] = [];\n if (ariaDescribedby) describedByParts.push(ariaDescribedby);\n if (description) describedByParts.push(descriptionId);\n if (isInvalid && errorMessage) describedByParts.push(errorId);\n\n // Controlled vs uncontrolled state\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<Record<string, string | null>>({});\n const currentValue = isControlled ? (value ?? {}) : internalValue;\n\n // Roving tabindex: track focused cell [rowIndex, colIndex]\n // rowIndex is 0-based into data rows, colIndex is 0-based into columns\n const [focusedCell, setFocusedCell] = useState<[number, number]>([0, 0]);\n const gridRef = useRef<HTMLTableElement>(null);\n\n const handleSelect = useCallback(\n (rowId: string, colId: string) => {\n if (isDisabled || isReadOnly) return;\n const newValue = { ...currentValue, [rowId]: colId };\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n },\n [currentValue, onChange, isDisabled, isReadOnly, isControlled],\n );\n\n const focusCell = useCallback(\n (rowIdx: number, colIdx: number) => {\n setFocusedCell([rowIdx, colIdx]);\n // Focus the button in the target cell\n const table = gridRef.current;\n if (!table) return;\n const row = table.querySelectorAll('tbody tr')[rowIdx];\n if (!row) return;\n // +1 to skip the row header cell\n const cell = row.querySelectorAll('td')[colIdx];\n if (!cell) return;\n const button = cell.querySelector('button');\n if (button) button.focus();\n },\n [],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTableElement>) => {\n const [rowIdx, colIdx] = focusedCell;\n const maxRow = rows.length - 1;\n const maxCol = columns.length - 1;\n\n let nextRow = rowIdx;\n let nextCol = colIdx;\n let handled = false;\n\n switch (e.key) {\n case 'ArrowRight':\n nextCol = Math.min(colIdx + 1, maxCol);\n handled = true;\n break;\n case 'ArrowLeft':\n nextCol = Math.max(colIdx - 1, 0);\n handled = true;\n break;\n case 'ArrowDown':\n nextRow = Math.min(rowIdx + 1, maxRow);\n handled = true;\n break;\n case 'ArrowUp':\n nextRow = Math.max(rowIdx - 1, 0);\n handled = true;\n break;\n case 'Home':\n nextCol = 0;\n handled = true;\n break;\n case 'End':\n nextCol = maxCol;\n handled = true;\n break;\n case ' ':\n case 'Enter': {\n const targetRow = rows[rowIdx];\n const targetCol = columns[colIdx];\n if (!isDisabled && !isReadOnly && targetRow && targetCol) {\n handleSelect(targetRow.id, targetCol.id);\n }\n handled = true;\n break;\n }\n default:\n break;\n }\n\n if (handled) {\n e.preventDefault();\n if (nextRow !== rowIdx || nextCol !== colIdx) {\n focusCell(nextRow, nextCol);\n }\n }\n },\n [focusedCell, rows, columns, handleSelect, focusCell, isDisabled, isReadOnly],\n );\n\n const handleCellClick = useCallback(\n (rowIdx: number, colIdx: number, rowId: string, colId: string) => {\n setFocusedCell([rowIdx, colIdx]);\n handleSelect(rowId, colId);\n },\n [handleSelect],\n );\n\n const handleCellFocus = useCallback(\n (rowIdx: number, colIdx: number) => {\n setFocusedCell([rowIdx, colIdx]);\n },\n [],\n );\n\n return (\n <div\n ref={ref}\n id={groupId}\n role=\"group\"\n aria-label={ariaLabel}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={describedByParts.length > 0 ? describedByParts.join(' ') : undefined}\n data-testid={dataTestId}\n className={cn(matrixGridContainerVariants({ size }), className)}\n >\n {/* Label */}\n {label && (\n <span id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive-background)]\" aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n )}\n\n {/* Description */}\n {description && (\n <span\n id={descriptionId}\n className=\"text-sm text-[var(--menu-muted)]\"\n >\n {description}\n </span>\n )}\n\n {/* Scroll container */}\n <div className={matrixGridScrollContainerVariants({ size })}>\n <table\n ref={gridRef}\n role=\"grid\"\n aria-label={ariaLabel ?? label}\n onKeyDown={handleKeyDown}\n className={matrixGridTableVariants({ size })}\n >\n <thead>\n <tr role=\"row\">\n {/* Corner cell — visually empty but accessible */}\n <td className={matrixGridColumnHeaderVariants({ size })} />\n {columns.map((col) => (\n <th\n key={col.id}\n id={`${groupId}-col-${col.id}`}\n scope=\"col\"\n role=\"columnheader\"\n className={matrixGridColumnHeaderVariants({ size })}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr\n key={row.id}\n role=\"row\"\n className={matrixGridRowVariants({ isEven: rowIdx % 2 === 1 })}\n >\n <th\n scope=\"row\"\n role=\"rowheader\"\n className={matrixGridRowHeaderVariants({ size })}\n >\n {row.label}\n </th>\n {columns.map((col, colIdx) => {\n const isSelected = currentValue[row.id] === col.id;\n const isFocused = focusedCell[0] === rowIdx && focusedCell[1] === colIdx;\n\n return (\n <td\n key={col.id}\n role=\"gridcell\"\n aria-describedby={`${groupId}-col-${col.id}`}\n className={matrixGridCellVariants({ size })}\n >\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n aria-label={`${row.label}, ${col.label}`}\n tabIndex={isFocused ? 0 : -1}\n disabled={isDisabled}\n onClick={() => handleCellClick(rowIdx, colIdx, row.id, col.id)}\n onFocus={() => handleCellFocus(rowIdx, colIdx)}\n className={matrixGridRadioOuterVariants()}\n >\n <span\n className={matrixGridRadioVisualVariants({\n size,\n isSelected,\n isInvalid,\n })}\n aria-hidden=\"true\"\n >\n <span\n className={matrixGridRadioDotVariants({\n size,\n isSelected,\n })}\n />\n </span>\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Error message */}\n {isInvalid && errorMessage && (\n <div\n id={errorId}\n role=\"alert\"\n className=\"text-sm text-[var(--destructive-background)]\"\n >\n {errorMessage}\n </div>\n )}\n </div>\n );\n },\n);\n\nMatrixGrid.displayName = \"MatrixGrid\";\n\nexport { MatrixGrid };\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 { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n/**\n * MatrixGrid size schema\n * All sizes maintain 44px minimum touch targets (WCAG 2.2 AAA)\n */\nexport const MatrixGridSizeSchema = z.enum(['sm', 'default', 'lg']);\nexport type MatrixGridSize = z.infer<typeof MatrixGridSizeSchema>;\n\n/**\n * Individual row schema — a statement to rate\n */\nexport const MatrixGridRowSchema = z.object({\n id: z.string(),\n label: z.string(),\n});\n\nexport type MatrixGridRow = z.infer<typeof MatrixGridRowSchema>;\n\n/**\n * Individual column schema — a rating option\n */\nexport const MatrixGridColumnSchema = z.object({\n id: z.string(),\n label: z.string(),\n});\n\nexport type MatrixGridColumn = z.infer<typeof MatrixGridColumnSchema>;\n\n/**\n * MatrixGrid props schema\n *\n * Grid-style survey question with rows (statements) and columns (rating options).\n * Each row has a single radio selection.\n *\n * Uses .refine() to enforce unique row IDs and unique column IDs — requires\n * getShape() helper from test-utils.ts in contract tests.\n */\nexport const MatrixGridPropsSchema = BaseComponentPropsSchema.extend({\n // Data\n rows: z.array(MatrixGridRowSchema).min(2),\n columns: z.array(MatrixGridColumnSchema).min(2).max(10),\n\n // Value — Record<rowId, columnId | null>\n value: z.record(z.string(), z.string().nullable()).optional(),\n onChange: z.custom<(value: Record<string, string | null>) => void>().optional(),\n\n // Labels\n label: z.string().optional(),\n description: z.string().optional(),\n errorMessage: z.string().optional(),\n\n // State\n isRequired: z.boolean().optional().default(false),\n isDisabled: z.boolean().optional().default(false),\n isReadOnly: z.boolean().optional().default(false),\n isInvalid: z.boolean().optional().default(false),\n\n // Sizing\n size: MatrixGridSizeSchema.optional().default('default'),\n}).refine(\n (data) => {\n const ids = data.rows.map((r) => r.id);\n return new Set(ids).size === ids.length;\n },\n { message: 'Row IDs must be unique', path: ['rows'] },\n).refine(\n (data) => {\n const ids = data.columns.map((c) => c.id);\n return new Set(ids).size === ids.length;\n },\n { message: 'Column IDs must be unique', path: ['columns'] },\n);\n\nexport type MatrixGridProps = z.infer<typeof MatrixGridPropsSchema>;\n"]}
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/MatrixGrid/MatrixGrid.styles.ts","../../../src/elements/MatrixGrid/MatrixGrid.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/MatrixGrid/MatrixGrid.types.ts"],"names":["cn","inputs","twMerge","clsx","matrixGridContainerVariants","cva","matrixGridScrollContainerVariants","matrixGridTableVariants","matrixGridColumnHeaderVariants","matrixGridRowHeaderVariants","matrixGridCellVariants","matrixGridRowVariants","matrixGridRadioOuterVariants","matrixGridRadioVisualVariants","matrixGridRadioDotVariants","MatrixGrid","forwardRef","props","ref","rows","columns","value","onChange","label","description","errorMessage","isRequired","isDisabled","isReadOnly","isInvalid","size","className","id","ariaLabel","ariaDescribedby","dataTestId","generatedId","useId","groupId","labelId","descriptionId","errorId","describedByParts","isControlled","internalValue","setInternalValue","useState","currentValue","focusedCell","setFocusedCell","gridRef","useRef","handleSelect","useCallback","rowId","colId","newValue","focusCell","rowIdx","colIdx","table","row","cell","button","handleKeyDown","maxRow","maxCol","nextRow","nextCol","handled","targetRow","targetCol","handleCellClick","handleCellFocus","jsxs","jsx","col","isSelected","isFocused","BaseComponentPropsSchema","z","MatrixGridSizeSchema","MatrixGridRowSchema","MatrixGridColumnSchema","MatrixGridPropsSchema","data","ids","r","c"],"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 * MatrixGrid CVA Variant Definitions\n *\n * 10 variant groups covering container, table, headers, cells, and radio elements.\n * All interactive elements maintain 44x44px minimum touch targets (WCAG 2.2 AAA).\n */\n\n// =============================================================================\n// Container\n// =============================================================================\n\n/** Root wrapper (flex col, gap, text size) */\nexport const matrixGridContainerVariants = cva(\"flex flex-col gap-1.5\", {\n variants: {\n size: {\n sm: \"text-sm\",\n default: \"text-sm\",\n lg: \"text-base\",\n },\n },\n defaultVariants: { size: \"default\" },\n});\n\n/** Horizontal scroll wrapper with padding for focus ring breathing room */\nexport const matrixGridScrollContainerVariants = cva(\n \"overflow-x-auto -mx-1 px-1\",\n {\n variants: {\n size: {\n sm: \"py-0.5\",\n default: \"py-1\",\n lg: \"py-1.5\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n// =============================================================================\n// Table / Grid\n// =============================================================================\n\n/** Grid element (border-collapse, density) */\nexport const matrixGridTableVariants = cva(\n \"w-full border-collapse\",\n {\n variants: {\n size: {\n sm: \"\",\n default: \"\",\n lg: \"\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n// =============================================================================\n// Headers\n// =============================================================================\n\n/** Column header cells (centered, size padding) */\nexport const matrixGridColumnHeaderVariants = cva(\n [\n \"text-center font-medium text-[var(--content-foreground)]\",\n \"whitespace-nowrap\",\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"px-2 py-1.5 text-xs\",\n default: \"px-3 py-2 text-sm\",\n lg: \"px-4 py-3 text-base\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n/** Row header cells (left-aligned, min-width) */\nexport const matrixGridRowHeaderVariants = cva(\n [\n \"text-left font-normal text-[var(--content-foreground)]\",\n \"min-w-[120px]\",\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"px-2 py-1.5 text-xs\",\n default: \"px-3 py-2 text-sm\",\n lg: \"px-4 py-3 text-base\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n// =============================================================================\n// Cells & Rows\n// =============================================================================\n\n/** Data cells (centered, 44px min touch target) */\nexport const matrixGridCellVariants = cva(\n \"text-center min-w-[44px] min-h-[44px]\",\n {\n variants: {\n size: {\n sm: \"px-1 py-0.5\",\n default: \"px-2 py-1\",\n lg: \"px-3 py-1.5\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\n/** Row styling with zebra striping */\nexport const matrixGridRowVariants = cva(\n \"border-b border-[var(--border)]\",\n {\n variants: {\n isEven: {\n true: \"bg-[var(--muted)]/30\",\n false: \"\",\n },\n },\n defaultVariants: { isEven: false },\n }\n);\n\n// =============================================================================\n// Radio (Three-Layer Architecture)\n// =============================================================================\n\n/** Layer 1: Transparent 44x44px touch target with focus ring */\nexport const matrixGridRadioOuterVariants = cva(\n [\n \"inline-flex items-center justify-center\",\n \"min-h-[44px] min-w-[44px]\",\n \"cursor-pointer rounded-sm\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--themis-ring)] focus-visible:ring-offset-2\",\n \"hc:focus-visible:outline hc:focus-visible:outline-4 hc:focus-visible:outline-offset-2 hc:focus-visible:outline-foreground\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n ].join(\" \"),\n);\n\n/** Layer 2: Radio circle (size, selected, invalid) */\nexport const matrixGridRadioVisualVariants = cva(\n [\n \"rounded-full border-2\",\n \"transition-colors duration-200\",\n \"motion-reduce:transition-none\",\n \"flex items-center justify-center\",\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"h-4 w-4\",\n default: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n isSelected: {\n true: \"border-[var(--primary-action)] bg-[var(--primary-action)]\",\n false: \"border-[var(--input-border)] bg-[var(--input-background)]\",\n },\n isInvalid: {\n true: \"border-[var(--destructive-background)]\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n isSelected: true,\n isInvalid: true,\n className: \"border-[var(--destructive-background)] bg-[var(--destructive-background)]\",\n },\n ],\n defaultVariants: {\n size: \"default\",\n isSelected: false,\n isInvalid: false,\n },\n }\n);\n\n/** Layer 3: Inner dot with spring animation */\nexport const matrixGridRadioDotVariants = cva(\n [\n \"rounded-full bg-[var(--primary-action-foreground)]\",\n \"transition-transform duration-200\",\n \"motion-reduce:transition-none\",\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"h-1.5 w-1.5\",\n default: \"h-2 w-2\",\n lg: \"h-2.5 w-2.5\",\n },\n isSelected: {\n true: \"scale-100\",\n false: \"scale-0\",\n },\n },\n defaultVariants: {\n size: \"default\",\n isSelected: false,\n },\n }\n);\n","'use client';\n\n/**\n * MatrixGrid Component\n * Grid-style survey question with rows (statements) and columns (rating options).\n * Each row has a single radio selection.\n *\n * Uses role=\"grid\" ARIA pattern with roving tabindex for keyboard navigation.\n * Built from React Aria primitives directly for cell-based selection.\n *\n * @see WCAG 2.2 AAA — 44x44px touch targets, 7:1 contrast, keyboard navigation\n */\n\nimport {\n forwardRef,\n useState,\n useId,\n useCallback,\n useRef,\n type ForwardedRef,\n type KeyboardEvent,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport type { MatrixGridProps } from './MatrixGrid.types';\nimport {\n matrixGridContainerVariants,\n matrixGridScrollContainerVariants,\n matrixGridTableVariants,\n matrixGridColumnHeaderVariants,\n matrixGridRowHeaderVariants,\n matrixGridCellVariants,\n matrixGridRadioOuterVariants,\n matrixGridRadioVisualVariants,\n matrixGridRadioDotVariants,\n matrixGridRowVariants,\n} from './MatrixGrid.styles';\n\n// =============================================================================\n// MatrixGrid Component\n// =============================================================================\n\nconst MatrixGrid = forwardRef<HTMLDivElement, MatrixGridProps>(\n function MatrixGrid(props: MatrixGridProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n // Data\n rows,\n columns,\n // Value\n value,\n onChange,\n // Labels\n label,\n description,\n errorMessage,\n // State\n isRequired = false,\n isDisabled = false,\n isReadOnly = false,\n isInvalid = false,\n // Sizing\n size = 'default',\n // Standard\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n } = props;\n\n const generatedId = useId();\n const groupId = id ?? generatedId;\n const labelId = `${groupId}-label`;\n const descriptionId = `${groupId}-description`;\n const errorId = `${groupId}-error`;\n\n const describedByParts: string[] = [];\n if (ariaDescribedby) describedByParts.push(ariaDescribedby);\n if (description) describedByParts.push(descriptionId);\n if (isInvalid && errorMessage) describedByParts.push(errorId);\n\n // Controlled vs uncontrolled state\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<Record<string, string | null>>({});\n const currentValue = isControlled ? (value ?? {}) : internalValue;\n\n // Roving tabindex: track focused cell [rowIndex, colIndex]\n // rowIndex is 0-based into data rows, colIndex is 0-based into columns\n const [focusedCell, setFocusedCell] = useState<[number, number]>([0, 0]);\n const gridRef = useRef<HTMLTableElement>(null);\n\n const handleSelect = useCallback(\n (rowId: string, colId: string) => {\n if (isDisabled || isReadOnly) return;\n const newValue = { ...currentValue, [rowId]: colId };\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n },\n [currentValue, onChange, isDisabled, isReadOnly, isControlled],\n );\n\n const focusCell = useCallback(\n (rowIdx: number, colIdx: number) => {\n setFocusedCell([rowIdx, colIdx]);\n // Focus the button in the target cell\n const table = gridRef.current;\n if (!table) return;\n const row = table.querySelectorAll('tbody tr')[rowIdx];\n if (!row) return;\n // +1 to skip the row header cell\n const cell = row.querySelectorAll('td')[colIdx];\n if (!cell) return;\n const button = cell.querySelector('button');\n if (button) button.focus();\n },\n [],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTableElement>) => {\n const [rowIdx, colIdx] = focusedCell;\n const maxRow = rows.length - 1;\n const maxCol = columns.length - 1;\n\n let nextRow = rowIdx;\n let nextCol = colIdx;\n let handled = false;\n\n switch (e.key) {\n case 'ArrowRight':\n nextCol = Math.min(colIdx + 1, maxCol);\n handled = true;\n break;\n case 'ArrowLeft':\n nextCol = Math.max(colIdx - 1, 0);\n handled = true;\n break;\n case 'ArrowDown':\n nextRow = Math.min(rowIdx + 1, maxRow);\n handled = true;\n break;\n case 'ArrowUp':\n nextRow = Math.max(rowIdx - 1, 0);\n handled = true;\n break;\n case 'Home':\n nextCol = 0;\n handled = true;\n break;\n case 'End':\n nextCol = maxCol;\n handled = true;\n break;\n case ' ':\n case 'Enter': {\n const targetRow = rows[rowIdx];\n const targetCol = columns[colIdx];\n if (!isDisabled && !isReadOnly && targetRow && targetCol) {\n handleSelect(targetRow.id, targetCol.id);\n }\n handled = true;\n break;\n }\n default:\n break;\n }\n\n if (handled) {\n e.preventDefault();\n if (nextRow !== rowIdx || nextCol !== colIdx) {\n focusCell(nextRow, nextCol);\n }\n }\n },\n [focusedCell, rows, columns, handleSelect, focusCell, isDisabled, isReadOnly],\n );\n\n const handleCellClick = useCallback(\n (rowIdx: number, colIdx: number, rowId: string, colId: string) => {\n setFocusedCell([rowIdx, colIdx]);\n handleSelect(rowId, colId);\n },\n [handleSelect],\n );\n\n const handleCellFocus = useCallback(\n (rowIdx: number, colIdx: number) => {\n setFocusedCell([rowIdx, colIdx]);\n },\n [],\n );\n\n return (\n <div\n ref={ref}\n id={groupId}\n role=\"group\"\n aria-label={ariaLabel}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={describedByParts.length > 0 ? describedByParts.join(' ') : undefined}\n data-testid={dataTestId}\n className={cn(matrixGridContainerVariants({ size }), className)}\n >\n {/* Label */}\n {label && (\n <span id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive-background)]\" aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n )}\n\n {/* Description */}\n {description && (\n <span\n id={descriptionId}\n className=\"text-sm text-[var(--menu-muted)]\"\n >\n {description}\n </span>\n )}\n\n {/* Scroll container */}\n <div className={matrixGridScrollContainerVariants({ size })}>\n <table\n ref={gridRef}\n role=\"grid\"\n aria-label={ariaLabel ?? label}\n onKeyDown={handleKeyDown}\n className={matrixGridTableVariants({ size })}\n >\n <thead>\n <tr role=\"row\">\n {/* Corner cell — visually empty but accessible */}\n <td className={matrixGridColumnHeaderVariants({ size })} />\n {columns.map((col) => (\n <th\n key={col.id}\n id={`${groupId}-col-${col.id}`}\n scope=\"col\"\n role=\"columnheader\"\n className={matrixGridColumnHeaderVariants({ size })}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr\n key={row.id}\n role=\"row\"\n className={matrixGridRowVariants({ isEven: rowIdx % 2 === 1 })}\n >\n <th\n scope=\"row\"\n role=\"rowheader\"\n className={matrixGridRowHeaderVariants({ size })}\n >\n {row.label}\n </th>\n {columns.map((col, colIdx) => {\n const isSelected = currentValue[row.id] === col.id;\n const isFocused = focusedCell[0] === rowIdx && focusedCell[1] === colIdx;\n\n return (\n <td\n key={col.id}\n role=\"gridcell\"\n aria-describedby={`${groupId}-col-${col.id}`}\n className={matrixGridCellVariants({ size })}\n >\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n aria-label={`${row.label}, ${col.label}`}\n tabIndex={isFocused ? 0 : -1}\n disabled={isDisabled}\n onClick={() => handleCellClick(rowIdx, colIdx, row.id, col.id)}\n onFocus={() => handleCellFocus(rowIdx, colIdx)}\n className={matrixGridRadioOuterVariants()}\n >\n <span\n className={matrixGridRadioVisualVariants({\n size,\n isSelected,\n isInvalid,\n })}\n aria-hidden=\"true\"\n >\n <span\n className={matrixGridRadioDotVariants({\n size,\n isSelected,\n })}\n />\n </span>\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Error message */}\n {isInvalid && errorMessage && (\n <div\n id={errorId}\n role=\"alert\"\n className=\"text-sm text-[var(--destructive-background)]\"\n >\n {errorMessage}\n </div>\n )}\n </div>\n );\n },\n);\n\nMatrixGrid.displayName = \"MatrixGrid\";\n\nexport { MatrixGrid };\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 { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n/**\n * MatrixGrid size schema\n * All sizes maintain 44px minimum touch targets (WCAG 2.2 AAA)\n */\nexport const MatrixGridSizeSchema = z.enum(['sm', 'default', 'lg']);\nexport type MatrixGridSize = z.infer<typeof MatrixGridSizeSchema>;\n\n/**\n * Individual row schema — a statement to rate\n */\nexport const MatrixGridRowSchema = z.object({\n id: z.string(),\n label: z.string(),\n});\n\nexport type MatrixGridRow = z.infer<typeof MatrixGridRowSchema>;\n\n/**\n * Individual column schema — a rating option\n */\nexport const MatrixGridColumnSchema = z.object({\n id: z.string(),\n label: z.string(),\n});\n\nexport type MatrixGridColumn = z.infer<typeof MatrixGridColumnSchema>;\n\n/**\n * MatrixGrid props schema\n *\n * Grid-style survey question with rows (statements) and columns (rating options).\n * Each row has a single radio selection.\n *\n * Uses .refine() to enforce unique row IDs and unique column IDs — requires\n * getShape() helper from test-utils.ts in contract tests.\n */\nexport const MatrixGridPropsSchema = BaseComponentPropsSchema.extend({\n // Data\n rows: z.array(MatrixGridRowSchema).min(2),\n columns: z.array(MatrixGridColumnSchema).min(2).max(10),\n\n // Value — Record<rowId, columnId | null>\n value: z.record(z.string(), z.string().nullable()).optional(),\n onChange: z.custom<(value: Record<string, string | null>) => void>().optional(),\n\n // Labels\n label: z.string().optional(),\n description: z.string().optional(),\n errorMessage: z.string().optional(),\n\n // State\n isRequired: z.boolean().optional().default(false),\n isDisabled: z.boolean().optional().default(false),\n isReadOnly: z.boolean().optional().default(false),\n isInvalid: z.boolean().optional().default(false),\n\n // Sizing\n size: MatrixGridSizeSchema.optional().default('default'),\n}).refine(\n (data) => {\n const ids = data.rows.map((r) => r.id);\n return new Set(ids).size === ids.length;\n },\n { message: 'Row IDs must be unique', path: ['rows'] },\n).refine(\n (data) => {\n const ids = data.columns.map((c) => c.id);\n return new Set(ids).size === ids.length;\n },\n { message: 'Column IDs must be unique', path: ['columns'] },\n);\n\nexport interface MatrixGridProps {\n className?: string;\n children?: unknown;\n id?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-hidden'?: boolean;\n 'data-testid'?: string;\n rows: MatrixGridRow[];\n columns: MatrixGridColumn[];\n value?: Record<string, string | null>;\n onChange?: (value: Record<string, string | null>) => void;\n label?: string;\n description?: string;\n errorMessage?: string;\n isRequired?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isInvalid?: boolean;\n size?: MatrixGridSize;\n}\n"]}
@@ -29,7 +29,19 @@ export declare const ModalPropsSchema: z.ZodObject<{
29
29
  }>>>;
30
30
  children: z.ZodCustom<ReactNode, ReactNode>;
31
31
  }, z.core.$strip>;
32
- export type ModalProps = z.infer<typeof ModalPropsSchema>;
32
+ export interface ModalProps {
33
+ className?: string;
34
+ children?: ReactNode;
35
+ id?: string;
36
+ 'aria-label'?: string;
37
+ 'aria-labelledby'?: string;
38
+ 'aria-describedby'?: string;
39
+ 'data-testid'?: string;
40
+ defaultOpen?: boolean;
41
+ isOpen?: boolean;
42
+ onOpenChange?: (isOpen: boolean) => void;
43
+ role?: 'dialog' | 'alertdialog';
44
+ }
33
45
  /**
34
46
  * Modal.Trigger props schema
35
47
  *
@@ -50,7 +62,12 @@ export declare const ModalTriggerPropsSchema: z.ZodObject<{
50
62
  'data-testid': z.ZodOptional<z.ZodString>;
51
63
  children: z.ZodCustom<ReactNode, ReactNode>;
52
64
  }, z.core.$strip>;
53
- export type ModalTriggerProps = z.infer<typeof ModalTriggerPropsSchema>;
65
+ export interface ModalTriggerProps {
66
+ className?: string;
67
+ children?: ReactNode;
68
+ id?: string;
69
+ 'data-testid'?: string;
70
+ }
54
71
  /**
55
72
  * Modal size variants
56
73
  */
@@ -112,7 +129,19 @@ export declare const ModalContentPropsSchema: z.ZodObject<{
112
129
  className: z.ZodOptional<z.ZodString>;
113
130
  children: z.ZodCustom<ReactNode, ReactNode>;
114
131
  }, z.core.$strip>;
115
- export type ModalContentProps = z.infer<typeof ModalContentPropsSchema>;
132
+ export interface ModalContentProps {
133
+ className?: string;
134
+ children?: ReactNode;
135
+ id?: string;
136
+ 'aria-label'?: string;
137
+ 'data-testid'?: string;
138
+ size?: ModalSize;
139
+ animation?: ModalAnimation;
140
+ animationDuration?: number;
141
+ isDismissable?: boolean;
142
+ isKeyboardDismissDisabled?: boolean;
143
+ showClose?: boolean;
144
+ }
116
145
  /**
117
146
  * Modal.Overlay props schema
118
147
  *
@@ -139,7 +168,12 @@ export declare const ModalOverlayPropsSchema: z.ZodObject<{
139
168
  }>>>;
140
169
  className: z.ZodOptional<z.ZodString>;
141
170
  }, z.core.$strip>;
142
- export type ModalOverlayProps = z.infer<typeof ModalOverlayPropsSchema>;
171
+ export interface ModalOverlayProps {
172
+ className?: string;
173
+ id?: string;
174
+ 'data-testid'?: string;
175
+ animation?: ModalAnimation;
176
+ }
143
177
  /**
144
178
  * Modal.Header props schema
145
179
  *
@@ -160,7 +194,12 @@ export declare const ModalHeaderPropsSchema: z.ZodObject<{
160
194
  children: z.ZodCustom<ReactNode, ReactNode>;
161
195
  className: z.ZodOptional<z.ZodString>;
162
196
  }, z.core.$strip>;
163
- export type ModalHeaderProps = z.infer<typeof ModalHeaderPropsSchema>;
197
+ export interface ModalHeaderProps {
198
+ className?: string;
199
+ children?: ReactNode;
200
+ id?: string;
201
+ 'data-testid'?: string;
202
+ }
164
203
  /**
165
204
  * Modal.Title props schema
166
205
  *
@@ -190,7 +229,13 @@ export declare const ModalTitlePropsSchema: z.ZodObject<{
190
229
  children: z.ZodCustom<ReactNode, ReactNode>;
191
230
  className: z.ZodOptional<z.ZodString>;
192
231
  }, z.core.$strip>;
193
- export type ModalTitleProps = z.infer<typeof ModalTitlePropsSchema>;
232
+ export interface ModalTitleProps {
233
+ className?: string;
234
+ children?: ReactNode;
235
+ id?: string;
236
+ 'data-testid'?: string;
237
+ as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
238
+ }
194
239
  /**
195
240
  * Modal.Description props schema
196
241
  *
@@ -212,7 +257,12 @@ export declare const ModalDescriptionPropsSchema: z.ZodObject<{
212
257
  children: z.ZodCustom<ReactNode, ReactNode>;
213
258
  className: z.ZodOptional<z.ZodString>;
214
259
  }, z.core.$strip>;
215
- export type ModalDescriptionProps = z.infer<typeof ModalDescriptionPropsSchema>;
260
+ export interface ModalDescriptionProps {
261
+ className?: string;
262
+ children?: ReactNode;
263
+ id?: string;
264
+ 'data-testid'?: string;
265
+ }
216
266
  /**
217
267
  * Modal.Footer props schema
218
268
  *
@@ -234,7 +284,12 @@ export declare const ModalFooterPropsSchema: z.ZodObject<{
234
284
  children: z.ZodCustom<ReactNode, ReactNode>;
235
285
  className: z.ZodOptional<z.ZodString>;
236
286
  }, z.core.$strip>;
237
- export type ModalFooterProps = z.infer<typeof ModalFooterPropsSchema>;
287
+ export interface ModalFooterProps {
288
+ className?: string;
289
+ children?: ReactNode;
290
+ id?: string;
291
+ 'data-testid'?: string;
292
+ }
238
293
  /**
239
294
  * Modal.Close props schema
240
295
  *
@@ -255,7 +310,12 @@ export declare const ModalClosePropsSchema: z.ZodObject<{
255
310
  'data-testid': z.ZodOptional<z.ZodString>;
256
311
  children: z.ZodCustom<ReactNode, ReactNode>;
257
312
  }, z.core.$strip>;
258
- export type ModalCloseProps = z.infer<typeof ModalClosePropsSchema>;
313
+ export interface ModalCloseProps {
314
+ className?: string;
315
+ children?: ReactNode;
316
+ id?: string;
317
+ 'data-testid'?: string;
318
+ }
259
319
  /**
260
320
  * CVA variant configuration types
261
321
  * Used for class-variance-authority integration
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.types.d.ts","sourceRoot":"","sources":["../../../src/elements/Modal/Modal.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;qDAQK,OAAO,KAAK,IAAI,WAAhB,OAAO,KAAK,IAAI;;;;;;iBAOhD,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;iBAGlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;EAA2C,CAAC;AACxE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;EAAiD,CAAC;AACnF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwBlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;iBAMlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;iBAMjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;iBAShC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;iBAMtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;iBAMjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;iBAGhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;GAKG"}
1
+ {"version":3,"file":"Modal.types.d.ts","sourceRoot":"","sources":["../../../src/elements/Modal/Modal.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;qDAQK,OAAO,KAAK,IAAI,WAAhB,OAAO,KAAK,IAAI;;;;;;iBAOhD,CAAC;AAEH,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,IAAI,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;CACjC;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;iBAGlC,CAAC;AAEH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;EAA2C,CAAC;AACxE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;EAAiD,CAAC;AACnF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwBlC,CAAC;AAEH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;iBAMlC,CAAC;AAEH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;iBAMjC,CAAC;AAEH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;iBAShC,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC9C;AAED;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;iBAMtC,CAAC;AAEH,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;iBAMjC,CAAC;AAEH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;iBAGhC,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG"}
@@ -1,3 +1,4 @@
1
+ import type { PaginationProps } from './Pagination.types';
1
2
  /**
2
3
  * Pagination Component
3
4
  *
@@ -14,32 +15,5 @@
14
15
  * />
15
16
  * ```
16
17
  */
17
- export declare const Pagination: import("react").ForwardRefExoticComponent<{
18
- page: number;
19
- totalPages: number;
20
- onPageChange: (page: number) => void;
21
- size: "default" | "sm" | "lg";
22
- variant: "default" | "outline" | "ghost";
23
- siblingCount: number;
24
- showFirstLast: boolean;
25
- showPrevNext: boolean;
26
- isDisabled: boolean;
27
- className?: string | undefined;
28
- children?: any;
29
- id?: string | undefined;
30
- 'aria-label'?: string | undefined;
31
- 'aria-labelledby'?: string | undefined;
32
- 'aria-describedby'?: string | undefined;
33
- 'aria-live'?: "off" | "polite" | "assertive" | undefined;
34
- 'aria-hidden'?: boolean | undefined;
35
- 'data-testid'?: string | undefined;
36
- labels?: {
37
- previous: string;
38
- next: string;
39
- first: string;
40
- last: string;
41
- page: string;
42
- of: string;
43
- } | undefined;
44
- } & import("react").RefAttributes<HTMLElement>>;
18
+ export declare const Pagination: import("react").ForwardRefExoticComponent<PaginationProps & import("react").RefAttributes<HTMLElement>>;
45
19
  //# sourceMappingURL=Pagination.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../../src/elements/Pagination/Pagination.tsx"],"names":[],"mappings":"AAoFA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAgJtB,CAAC"}
1
+ {"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../../src/elements/Pagination/Pagination.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,oBAAoB,CAAC;AA6E7E;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,UAAU,yGAgJtB,CAAC"}
@@ -51,5 +51,30 @@ export declare const PaginationPropsSchema: z.ZodObject<{
51
51
  of: z.ZodDefault<z.ZodOptional<z.ZodString>>;
52
52
  }, z.core.$strip>>;
53
53
  }, z.core.$strip>;
54
- export type PaginationProps = z.infer<typeof PaginationPropsSchema>;
54
+ export interface PaginationProps {
55
+ className?: string;
56
+ children?: unknown;
57
+ id?: string;
58
+ 'aria-label'?: string;
59
+ 'aria-labelledby'?: string;
60
+ 'aria-describedby'?: string;
61
+ 'data-testid'?: string;
62
+ page: number;
63
+ totalPages: number;
64
+ onPageChange: (page: number) => void;
65
+ size?: PaginationSize;
66
+ variant?: PaginationVariant;
67
+ siblingCount?: number;
68
+ showFirstLast?: boolean;
69
+ showPrevNext?: boolean;
70
+ isDisabled?: boolean;
71
+ labels?: {
72
+ previous?: string;
73
+ next?: string;
74
+ first?: string;
75
+ last?: string;
76
+ page?: string;
77
+ of?: string;
78
+ };
79
+ }
55
80
  //# sourceMappingURL=Pagination.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.types.d.ts","sourceRoot":"","sources":["../../../src/elements/Pagination/Pagination.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,oBAAoB;;;;EAAkC,CAAC;AACpE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB;;;;EAA0C,CAAC;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;qCAQF,MAAM,KAAK,IAAI,SAAf,MAAM,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;iBA6B7C,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
1
+ {"version":3,"file":"Pagination.types.d.ts","sourceRoot":"","sources":["../../../src/elements/Pagination/Pagination.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,oBAAoB;;;;EAAkC,CAAC;AACpE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB;;;;EAA0C,CAAC;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;qCAQF,MAAM,KAAK,IAAI,SAAf,MAAM,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;iBA6B7C,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;CACH"}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- 'use strict';var react=require('react'),lucideReact=require('lucide-react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),reactAriaComponents=require('react-aria-components'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function N(...t){return tailwindMerge.twMerge(clsx.clsx(t))}var W=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}}),U=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 I="data-[pressed]:scale-[0.97]";var L="data-[hovered]:shadow-md";var z="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",C="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var J=react.createContext(null);J.displayName="ButtonGroupContext";function K(){return react.useContext(J)}var Q=react.createContext(null);Q.displayName="ButtonGroupItemContext";function X(){return react.useContext(Q)}classVarianceAuthority.cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var tt=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 x=react.memo(react.forwardRef(({className:t,buttonVisualClassName:e,variant:l,size:h,visualSize:u,fullWidth:g,loading:c=false,loadingText:b="Loading...",shortcut:i,children:o,isDisabled:s,paywall:r=false,paywallRedirect:S,paywallDescription:T,onPress:_,...p},G)=>{let m=react.useId(),v=K(),y=X(),R=l??v?.variant??"default",n=h??v?.size,P=s??v?.isDisabled??false,F=v?.orientation==="vertical",Y=g||F,rt=y?tt({orientation:v?.orientation??"horizontal",position:y.position}):"",w=u??n??"default";return process.env.NODE_ENV!=="production"&&(w==="dot"||w==="icon")&&!p["aria-label"]&&!o&&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:G,isDisabled:P||c||void 0,"aria-disabled":r?true:void 0,"aria-describedby":r?m:void 0,onPress:B=>{if(r){S&&window.open(S,"_blank","noopener,noreferrer");return}_?.(B);},className:N(W({fullWidth:Y,inVerticalGroup:F}),t),...p,children:B=>jsxRuntime.jsxs("span",{className:N(U({variant:R,visualSize:w,paywall:r,fullWidth:Y}),rt,e,I,L,z,C),"data-pressed":B.isPressed||void 0,children:[c&&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:b})]}),!c&&o,r&&jsxRuntime.jsx(lucideReact.Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),r&&jsxRuntime.jsxs("span",{id:m,className:"sr-only",children:["Premium feature: ",T||"Upgrade required to access this feature"]}),B.isFocusVisible&&i&&jsxRuntime.jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:i}),B.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"})]})})}));x.displayName="Button";var k=classVarianceAuthority.cva("flex items-center justify-center",{variants:{size:{sm:"gap-0.5",default:"gap-1",lg:"gap-1.5"}},defaultVariants:{size:"default"}}),$=classVarianceAuthority.cva("inline-flex items-center justify-center text-[var(--muted-foreground)]",{variants:{size:{sm:"h-8 w-8 text-xs",default:"h-10 w-10 text-sm",lg:"h-12 w-12 text-base"}},defaultVariants:{size:"default"}}),ht=classVarianceAuthority.cva("text-[var(--muted-foreground)]",{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}});function Bt(t,e,l){let h=l*2+5;if(e<=h)return Array.from({length:e},(o,s)=>s+1);let u=Math.max(t-l,1),g=Math.min(t+l,e),c=u>2,b=g<e-1;if(!c&&b){let o=l*2+3,s=Array.from({length:o},(r,S)=>S+1);return s.push("ellipsis-end"),s.push(e),s}if(c&&!b){let o=l*2+3,s=[1,"ellipsis-start"];for(let r=e-o+1;r<=e;r++)s.push(r);return s}let i=[1,"ellipsis-start"];for(let o=u;o<=g;o++)i.push(o);return i.push("ellipsis-end"),i.push(e),i}function E(t,e){return e?"default":t==="outline"?"outline":"ghost"}function Nt(t){return t==="sm"?"sm":t==="lg"?"lg":"default"}var ot=react.forwardRef(({page:t,totalPages:e,onPageChange:l,size:h="default",variant:u="default",siblingCount:g=1,showFirstLast:c=true,showPrevNext:b=true,isDisabled:i=false,labels:o,className:s,"aria-label":r,"data-testid":S,...T},_)=>{let p={previous:o?.previous??"Previous",next:o?.next??"Next",first:o?.first??"First page",last:o?.last??"Last page",page:o?.page??"Page",of:o?.of??"of"},G=react.useMemo(()=>Bt(t,e,g),[t,e,g]),m=react.useCallback(n=>{n>=1&&n<=e&&n!==t&&l(n);},[t,e,l]),v=t===1,y=t===e,R=Nt(h);return jsxRuntime.jsxs("nav",{ref:_,"aria-label":r??"Pagination",className:N(k({size:h}),s),"data-testid":S,...T,children:[c&&jsxRuntime.jsx(x,{variant:E(u,false),visualSize:"icon",isDisabled:i||v,"aria-label":p.first,onPress:()=>m(1),children:jsxRuntime.jsx(lucideReact.ChevronsLeft,{"aria-hidden":"true"})}),b&&jsxRuntime.jsx(x,{variant:E(u,false),visualSize:"icon",isDisabled:i||v,"aria-label":p.previous,onPress:()=>m(t-1),children:jsxRuntime.jsx(lucideReact.ChevronLeft,{"aria-hidden":"true"})}),G.map(n=>{if(n==="ellipsis-start"||n==="ellipsis-end")return jsxRuntime.jsx("span",{className:$({size:h}),"aria-hidden":"true",children:"..."},n);let P=n===t;return jsxRuntime.jsx(x,{variant:E(u,P),visualSize:R,isDisabled:i||P,"aria-label":`${p.page} ${n}`,"aria-current":P?"page":void 0,onPress:()=>m(n),children:n},n)}),b&&jsxRuntime.jsx(x,{variant:E(u,false),visualSize:"icon",isDisabled:i||y,"aria-label":p.next,onPress:()=>m(t+1),children:jsxRuntime.jsx(lucideReact.ChevronRight,{"aria-hidden":"true"})}),c&&jsxRuntime.jsx(x,{variant:E(u,false),visualSize:"icon",isDisabled:i||y,"aria-label":p.last,onPress:()=>m(e),children:jsxRuntime.jsx(lucideReact.ChevronsRight,{"aria-hidden":"true"})}),jsxRuntime.jsxs("span",{className:"sr-only",role:"status","aria-live":"polite","aria-atomic":"true",children:[p.page," ",t," ",p.of," ",e]})]})});ot.displayName="Pagination";var at=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});var nt=zod.z.enum(["sm","default","lg"]),it=zod.z.enum(["default","outline","ghost"]),Et=at.extend({page:zod.z.number().min(1),totalPages:zod.z.number().min(1),onPageChange:zod.z.custom(),size:nt.optional().default("default"),variant:it.optional().default("default"),siblingCount:zod.z.number().min(0).optional().default(1),showFirstLast:zod.z.boolean().optional().default(true),showPrevNext:zod.z.boolean().optional().default(true),isDisabled:zod.z.boolean().optional().default(false),labels:zod.z.object({previous:zod.z.string().optional().default("Previous"),next:zod.z.string().optional().default("Next"),first:zod.z.string().optional().default("First page"),last:zod.z.string().optional().default("Last page"),page:zod.z.string().optional().default("Page"),of:zod.z.string().optional().default("of")}).optional()});exports.Pagination=ot;exports.PaginationPropsSchema=Et;exports.PaginationSizeSchema=nt;exports.PaginationVariantSchema=it;exports.paginationEllipsisVariants=$;exports.paginationInfoVariants=ht;exports.paginationNavVariants=k;//# sourceMappingURL=index.js.map
2
+ 'use strict';var react=require('react'),lucideReact=require('lucide-react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),reactAriaComponents=require('react-aria-components'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function N(...t){return tailwindMerge.twMerge(clsx.clsx(t))}var W=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}}),U=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 I="data-[pressed]:scale-[0.97]";var L="data-[hovered]:shadow-md";var z="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",C="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var J=react.createContext(null);J.displayName="ButtonGroupContext";function K(){return react.useContext(J)}var Q=react.createContext(null);Q.displayName="ButtonGroupItemContext";function X(){return react.useContext(Q)}classVarianceAuthority.cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var tt=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 x=react.memo(react.forwardRef(({className:t,buttonVisualClassName:e,variant:l,size:g,visualSize:u,fullWidth:b,loading:c=false,loadingText:h="Loading...",shortcut:i,children:a,isDisabled:s,paywall:r=false,paywallRedirect:S,paywallDescription:T,onPress:w,...d},_)=>{let m=react.useId(),v=K(),y=X(),G=l??v?.variant??"default",n=g??v?.size,P=s??v?.isDisabled??false,F=v?.orientation==="vertical",Y=b||F,rt=y?tt({orientation:v?.orientation??"horizontal",position:y.position}):"",R=u??n??"default";return process.env.NODE_ENV!=="production"&&(R==="dot"||R==="icon")&&!d["aria-label"]&&!a&&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:_,isDisabled:P||c||void 0,"aria-disabled":r?true:void 0,"aria-describedby":r?m:void 0,onPress:B=>{if(r){S&&window.open(S,"_blank","noopener,noreferrer");return}w?.(B);},className:N(W({fullWidth:Y,inVerticalGroup:F}),t),...d,children:B=>jsxRuntime.jsxs("span",{className:N(U({variant:G,visualSize:R,paywall:r,fullWidth:Y}),rt,e,I,L,z,C),"data-pressed":B.isPressed||void 0,children:[c&&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:h})]}),!c&&a,r&&jsxRuntime.jsx(lucideReact.Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),r&&jsxRuntime.jsxs("span",{id:m,className:"sr-only",children:["Premium feature: ",T||"Upgrade required to access this feature"]}),B.isFocusVisible&&i&&jsxRuntime.jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:i}),B.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"})]})})}));x.displayName="Button";var k=classVarianceAuthority.cva("flex items-center justify-center",{variants:{size:{sm:"gap-0.5",default:"gap-1",lg:"gap-1.5"}},defaultVariants:{size:"default"}}),$=classVarianceAuthority.cva("inline-flex items-center justify-center text-[var(--muted-foreground)]",{variants:{size:{sm:"h-8 w-8 text-xs",default:"h-10 w-10 text-sm",lg:"h-12 w-12 text-base"}},defaultVariants:{size:"default"}}),gt=classVarianceAuthority.cva("text-[var(--muted-foreground)]",{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}});function Bt(t,e,l){let g=l*2+5;if(e<=g)return Array.from({length:e},(a,s)=>s+1);let u=Math.max(t-l,1),b=Math.min(t+l,e),c=u>2,h=b<e-1;if(!c&&h){let a=l*2+3,s=Array.from({length:a},(r,S)=>S+1);return s.push("ellipsis-end"),s.push(e),s}if(c&&!h){let a=l*2+3,s=[1,"ellipsis-start"];for(let r=e-a+1;r<=e;r++)s.push(r);return s}let i=[1,"ellipsis-start"];for(let a=u;a<=b;a++)i.push(a);return i.push("ellipsis-end"),i.push(e),i}function E(t,e){return e?"default":t==="outline"?"outline":"ghost"}function Nt(t){return t==="sm"?"sm":t==="lg"?"lg":"default"}var at=react.forwardRef(({page:t,totalPages:e,onPageChange:l,size:g="default",variant:u="default",siblingCount:b=1,showFirstLast:c=true,showPrevNext:h=true,isDisabled:i=false,labels:a,className:s,"aria-label":r,"data-testid":S,...T},w)=>{let d={previous:a?.previous??"Previous",next:a?.next??"Next",first:a?.first??"First page",last:a?.last??"Last page",page:a?.page??"Page",of:a?.of??"of"},_=react.useMemo(()=>Bt(t,e,b),[t,e,b]),m=react.useCallback(n=>{n>=1&&n<=e&&n!==t&&l(n);},[t,e,l]),v=t===1,y=t===e,G=Nt(g);return jsxRuntime.jsxs("nav",{ref:w,"aria-label":r??"Pagination",className:N(k({size:g}),s),"data-testid":S,...T,children:[c&&jsxRuntime.jsx(x,{variant:E(u,false),visualSize:"icon",isDisabled:i||v,"aria-label":d.first,onPress:()=>m(1),children:jsxRuntime.jsx(lucideReact.ChevronsLeft,{"aria-hidden":"true"})}),h&&jsxRuntime.jsx(x,{variant:E(u,false),visualSize:"icon",isDisabled:i||v,"aria-label":d.previous,onPress:()=>m(t-1),children:jsxRuntime.jsx(lucideReact.ChevronLeft,{"aria-hidden":"true"})}),_.map(n=>{if(n==="ellipsis-start"||n==="ellipsis-end")return jsxRuntime.jsx("span",{className:$({size:g}),"aria-hidden":"true",children:"..."},n);let P=n===t;return jsxRuntime.jsx(x,{variant:E(u,P),visualSize:G,isDisabled:i||P,"aria-label":`${d.page} ${n}`,"aria-current":P?"page":void 0,onPress:()=>m(n),children:n},n)}),h&&jsxRuntime.jsx(x,{variant:E(u,false),visualSize:"icon",isDisabled:i||y,"aria-label":d.next,onPress:()=>m(t+1),children:jsxRuntime.jsx(lucideReact.ChevronRight,{"aria-hidden":"true"})}),c&&jsxRuntime.jsx(x,{variant:E(u,false),visualSize:"icon",isDisabled:i||y,"aria-label":d.last,onPress:()=>m(e),children:jsxRuntime.jsx(lucideReact.ChevronsRight,{"aria-hidden":"true"})}),jsxRuntime.jsxs("span",{className:"sr-only",role:"status","aria-live":"polite","aria-atomic":"true",children:[d.page," ",t," ",d.of," ",e]})]})});at.displayName="Pagination";var ot=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});var nt=zod.z.enum(["sm","default","lg"]),it=zod.z.enum(["default","outline","ghost"]),Et=ot.extend({page:zod.z.number().min(1),totalPages:zod.z.number().min(1),onPageChange:zod.z.custom(),size:nt.optional().default("default"),variant:it.optional().default("default"),siblingCount:zod.z.number().min(0).optional().default(1),showFirstLast:zod.z.boolean().optional().default(true),showPrevNext:zod.z.boolean().optional().default(true),isDisabled:zod.z.boolean().optional().default(false),labels:zod.z.object({previous:zod.z.string().optional().default("Previous"),next:zod.z.string().optional().default("Next"),first:zod.z.string().optional().default("First page"),last:zod.z.string().optional().default("Last page"),page:zod.z.string().optional().default("Page"),of:zod.z.string().optional().default("of")}).optional()});exports.Pagination=at;exports.PaginationPropsSchema=Et;exports.PaginationSizeSchema=nt;exports.PaginationVariantSchema=it;exports.paginationEllipsisVariants=$;exports.paginationInfoVariants=gt;exports.paginationNavVariants=k;//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map