eidos-ui 3.3.0 → 3.5.0

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 (354) hide show
  1. package/README.md +17 -5
  2. package/dist/{Input.types-XrJTI0JC.d.ts → Input.types-CSDMaZNe.d.ts} +10 -0
  3. package/dist/{Input.types-DFZNyJGF.d.cts → Input.types-D7-sWq-q.d.cts} +10 -0
  4. package/dist/{Menu.types-DNIpjSAK.d.ts → Menu.types-BN4g1-3A.d.ts} +9 -0
  5. package/dist/{Menu.types-DwcuCZM7.d.cts → Menu.types-CTnUijv5.d.cts} +9 -0
  6. package/dist/{Select.types-B4kDpkGB.d.ts → Select.types-C2tGy1vj.d.ts} +11 -1
  7. package/dist/{Select.types-CAkT2ACt.d.cts → Select.types-ok-03rLo.d.cts} +11 -1
  8. package/dist/{Table.types-CPj-udMc.d.cts → Table.types-D-9tC0kJ.d.cts} +2 -3
  9. package/dist/{Table.types-CZZ7QWAI.d.ts → Table.types-D8pmgxKA.d.ts} +2 -3
  10. package/dist/{Toolbar.types-RN0klQzu.d.ts → Toolbar.types-CKnQC_TW.d.ts} +1 -1
  11. package/dist/{Toolbar.types-DSk8z2iy.d.cts → Toolbar.types-DUz2mxct.d.cts} +1 -1
  12. package/dist/alert/index.cjs +5 -5
  13. package/dist/alert/index.js +4 -4
  14. package/dist/button/index.cjs +4 -4
  15. package/dist/button/index.js +3 -3
  16. package/dist/checkbox/index.cjs +2 -2
  17. package/dist/checkbox/index.js +1 -1
  18. package/dist/chip/index.cjs +4 -4
  19. package/dist/chip/index.js +3 -3
  20. package/dist/{chunk-ITXDSQT2.js → chunk-24HKKSKX.js} +94 -102
  21. package/dist/chunk-24HKKSKX.js.map +1 -0
  22. package/dist/{chunk-GDQWSCJQ.js → chunk-26SO4LZ5.js} +4 -4
  23. package/dist/{chunk-GPRJYPIG.js → chunk-2JW3WSBF.js} +6 -4
  24. package/dist/chunk-2JW3WSBF.js.map +1 -0
  25. package/dist/{chunk-MHZIBV2C.js → chunk-2PCCGQOH.js} +90 -19
  26. package/dist/chunk-2PCCGQOH.js.map +1 -0
  27. package/dist/{chunk-3EPND5M2.cjs → chunk-2T7ZMMH5.cjs} +72 -19
  28. package/dist/chunk-2T7ZMMH5.cjs.map +1 -0
  29. package/dist/chunk-35LGEPLP.cjs +134 -0
  30. package/dist/chunk-35LGEPLP.cjs.map +1 -0
  31. package/dist/{chunk-R4M6SNUU.cjs → chunk-36JFXFM2.cjs} +48 -37
  32. package/dist/chunk-36JFXFM2.cjs.map +1 -0
  33. package/dist/{chunk-ND526PMG.cjs → chunk-3KBBJZHK.cjs} +11 -11
  34. package/dist/{chunk-ND526PMG.cjs.map → chunk-3KBBJZHK.cjs.map} +1 -1
  35. package/dist/{chunk-EH42ND5Q.cjs → chunk-3RWZC6OW.cjs} +5 -5
  36. package/dist/{chunk-EH42ND5Q.cjs.map → chunk-3RWZC6OW.cjs.map} +1 -1
  37. package/dist/{chunk-G5N3C6AU.cjs → chunk-3ZRFOKDM.cjs} +36 -36
  38. package/dist/{chunk-G5N3C6AU.cjs.map → chunk-3ZRFOKDM.cjs.map} +1 -1
  39. package/dist/{chunk-I5XR2V4A.cjs → chunk-4AO5RKV5.cjs} +87 -96
  40. package/dist/chunk-4AO5RKV5.cjs.map +1 -0
  41. package/dist/{chunk-5HUZYY54.js → chunk-4J25XZDI.js} +23 -13
  42. package/dist/chunk-4J25XZDI.js.map +1 -0
  43. package/dist/{chunk-FXZJL2AM.cjs → chunk-4JSTBA4F.cjs} +12 -6
  44. package/dist/chunk-4JSTBA4F.cjs.map +1 -0
  45. package/dist/{chunk-GG5YGESX.js → chunk-4LNTZPSQ.js} +4 -3
  46. package/dist/chunk-4LNTZPSQ.js.map +1 -0
  47. package/dist/{chunk-3EUTXQDB.js → chunk-5XH2PHT2.js} +31 -24
  48. package/dist/chunk-5XH2PHT2.js.map +1 -0
  49. package/dist/{chunk-OJDYTCMO.cjs → chunk-66UQTF57.cjs} +69 -62
  50. package/dist/chunk-66UQTF57.cjs.map +1 -0
  51. package/dist/{chunk-MCWTQT3M.cjs → chunk-6JHVXWDV.cjs} +125 -54
  52. package/dist/chunk-6JHVXWDV.cjs.map +1 -0
  53. package/dist/chunk-75GFIQRU.js +88 -0
  54. package/dist/chunk-75GFIQRU.js.map +1 -0
  55. package/dist/{chunk-55J4LEKT.cjs → chunk-7BFODYNL.cjs} +11 -8
  56. package/dist/chunk-7BFODYNL.cjs.map +1 -0
  57. package/dist/{chunk-TEVZHN5I.cjs → chunk-7VJCGKVP.cjs} +28 -15
  58. package/dist/chunk-7VJCGKVP.cjs.map +1 -0
  59. package/dist/{chunk-KQJ3IAFT.js → chunk-A3LMUPG3.js} +2 -2
  60. package/dist/{chunk-O2AACVSF.js → chunk-AR2ZOO6L.js} +3 -3
  61. package/dist/{chunk-Z5U4NJTW.cjs → chunk-BEOECPVJ.cjs} +50 -23
  62. package/dist/chunk-BEOECPVJ.cjs.map +1 -0
  63. package/dist/{chunk-E7FGY7BJ.js → chunk-BFKPJ627.js} +5 -4
  64. package/dist/chunk-BFKPJ627.js.map +1 -0
  65. package/dist/{chunk-M7PF4FKQ.js → chunk-D7SQ7LHJ.js} +6 -3
  66. package/dist/chunk-D7SQ7LHJ.js.map +1 -0
  67. package/dist/chunk-DA375AI6.cjs +88 -0
  68. package/dist/chunk-DA375AI6.cjs.map +1 -0
  69. package/dist/{chunk-H6CWTMAH.js → chunk-DGXHR6FV.js} +5 -2
  70. package/dist/chunk-DGXHR6FV.js.map +1 -0
  71. package/dist/{chunk-ZNWIHUHZ.cjs → chunk-DU5JKTHK.cjs} +12 -4
  72. package/dist/chunk-DU5JKTHK.cjs.map +1 -0
  73. package/dist/{chunk-HALVTKW7.js → chunk-FIVMMCGM.js} +72 -81
  74. package/dist/chunk-FIVMMCGM.js.map +1 -0
  75. package/dist/{chunk-RYOQYYDO.js → chunk-GIEDIAPD.js} +12 -6
  76. package/dist/chunk-GIEDIAPD.js.map +1 -0
  77. package/dist/{chunk-NQ4L6PYW.js → chunk-GOF6A4M4.js} +2 -2
  78. package/dist/{chunk-NQ4L6PYW.js.map → chunk-GOF6A4M4.js.map} +1 -1
  79. package/dist/{chunk-L23WWO3D.js → chunk-GPVGGBIR.js} +2 -2
  80. package/dist/{chunk-OAK7HFOJ.js → chunk-GWHZFX2H.js} +21 -16
  81. package/dist/chunk-GWHZFX2H.js.map +1 -0
  82. package/dist/{chunk-HYDNZXPU.js → chunk-H2RS6Z6Q.js} +41 -25
  83. package/dist/{chunk-HYDNZXPU.js.map → chunk-H2RS6Z6Q.js.map} +1 -1
  84. package/dist/{chunk-2QEKSRVX.js → chunk-HEX4IMLO.js} +4 -4
  85. package/dist/{chunk-QJRKXT54.cjs → chunk-HMEREPDB.cjs} +7 -7
  86. package/dist/{chunk-QJRKXT54.cjs.map → chunk-HMEREPDB.cjs.map} +1 -1
  87. package/dist/{chunk-TTO7JXDB.cjs → chunk-HNGFRRVZ.cjs} +3 -3
  88. package/dist/{chunk-TTO7JXDB.cjs.map → chunk-HNGFRRVZ.cjs.map} +1 -1
  89. package/dist/{chunk-CJGFRPAS.cjs → chunk-I6M6CVI2.cjs} +4 -4
  90. package/dist/chunk-I6M6CVI2.cjs.map +1 -0
  91. package/dist/chunk-J76JHN7J.cjs +225 -0
  92. package/dist/chunk-J76JHN7J.cjs.map +1 -0
  93. package/dist/{chunk-YW65NAKH.cjs → chunk-JCKGAAPZ.cjs} +7 -7
  94. package/dist/{chunk-YW65NAKH.cjs.map → chunk-JCKGAAPZ.cjs.map} +1 -1
  95. package/dist/{chunk-6CPCNQKV.js → chunk-JHX6JK3M.js} +79 -75
  96. package/dist/chunk-JHX6JK3M.js.map +1 -0
  97. package/dist/{chunk-YV57RSPD.js → chunk-JNY7TUDS.js} +49 -22
  98. package/dist/chunk-JNY7TUDS.js.map +1 -0
  99. package/dist/{chunk-O3LG7B2J.cjs → chunk-JPYJQ4TF.cjs} +13 -5
  100. package/dist/chunk-JPYJQ4TF.cjs.map +1 -0
  101. package/dist/{chunk-PY2376XI.js → chunk-JT4KVXJK.js} +68 -15
  102. package/dist/chunk-JT4KVXJK.js.map +1 -0
  103. package/dist/{chunk-AOGNTG3W.cjs → chunk-KBQD4JLK.cjs} +5 -4
  104. package/dist/chunk-KBQD4JLK.cjs.map +1 -0
  105. package/dist/{chunk-P2JM22BF.cjs → chunk-KIZVY57H.cjs} +82 -78
  106. package/dist/chunk-KIZVY57H.cjs.map +1 -0
  107. package/dist/{chunk-QQIALSTX.cjs → chunk-KPMIIGHH.cjs} +27 -17
  108. package/dist/chunk-KPMIIGHH.cjs.map +1 -0
  109. package/dist/{chunk-ZXJU3TQD.cjs → chunk-KREHT4AQ.cjs} +11 -10
  110. package/dist/chunk-KREHT4AQ.cjs.map +1 -0
  111. package/dist/{chunk-S4S4LB63.js → chunk-L65MHFMD.js} +11 -3
  112. package/dist/chunk-L65MHFMD.js.map +1 -0
  113. package/dist/{chunk-OGC44JFZ.cjs → chunk-LQXFXXMJ.cjs} +8 -7
  114. package/dist/chunk-LQXFXXMJ.cjs.map +1 -0
  115. package/dist/{chunk-25PSIDPC.js → chunk-MPIVBAMY.js} +79 -21
  116. package/dist/chunk-MPIVBAMY.js.map +1 -0
  117. package/dist/{chunk-7SVDYEKM.js → chunk-MQAOXZD4.js} +28 -14
  118. package/dist/chunk-MQAOXZD4.js.map +1 -0
  119. package/dist/{chunk-6CSUUQ5M.cjs → chunk-NOQF7UQ5.cjs} +6 -6
  120. package/dist/{chunk-6CSUUQ5M.cjs.map → chunk-NOQF7UQ5.cjs.map} +1 -1
  121. package/dist/{chunk-OU7DCYIA.js → chunk-O3QM3BFE.js} +2 -2
  122. package/dist/{chunk-WKDT2XFQ.js → chunk-OOCCSMWM.js} +4 -4
  123. package/dist/chunk-P4XZH3OR.js +225 -0
  124. package/dist/chunk-P4XZH3OR.js.map +1 -0
  125. package/dist/{chunk-ZWAFL2B3.cjs → chunk-PMSENLOA.cjs} +37 -27
  126. package/dist/chunk-PMSENLOA.cjs.map +1 -0
  127. package/dist/{chunk-L5W2XC6M.js → chunk-RHFD2Z5V.js} +8 -8
  128. package/dist/chunk-RHHZRTWM.js +134 -0
  129. package/dist/chunk-RHHZRTWM.js.map +1 -0
  130. package/dist/{chunk-NZO2I5AL.cjs → chunk-RJVHR45I.cjs} +7 -7
  131. package/dist/{chunk-NZO2I5AL.cjs.map → chunk-RJVHR45I.cjs.map} +1 -1
  132. package/dist/{chunk-E6SE552P.cjs → chunk-RUDXHT76.cjs} +41 -25
  133. package/dist/chunk-RUDXHT76.cjs.map +1 -0
  134. package/dist/{chunk-SXGCRHBZ.js → chunk-SDUGYJGW.js} +24 -14
  135. package/dist/chunk-SDUGYJGW.js.map +1 -0
  136. package/dist/{chunk-VPRUHE35.js → chunk-SFFKQQ5Z.js} +4 -4
  137. package/dist/{chunk-2RXQMQYW.js → chunk-SXL4DMZ7.js} +27 -17
  138. package/dist/{chunk-2RXQMQYW.js.map → chunk-SXL4DMZ7.js.map} +1 -1
  139. package/dist/{chunk-OAPOGYA5.cjs → chunk-TC5IC6OP.cjs} +7 -4
  140. package/dist/chunk-TC5IC6OP.cjs.map +1 -0
  141. package/dist/{chunk-T2KB3DJJ.js → chunk-THCTUBX6.js} +12 -4
  142. package/dist/chunk-THCTUBX6.js.map +1 -0
  143. package/dist/{chunk-NEYLNRVG.cjs → chunk-TTLFY76J.cjs} +21 -16
  144. package/dist/chunk-TTLFY76J.cjs.map +1 -0
  145. package/dist/{chunk-ZZSPQFMX.js → chunk-U233KQZX.js} +2 -1
  146. package/dist/{chunk-ZZSPQFMX.js.map → chunk-U233KQZX.js.map} +1 -1
  147. package/dist/{chunk-65PC3YDT.cjs → chunk-V4BZWBZT.cjs} +7 -7
  148. package/dist/{chunk-65PC3YDT.cjs.map → chunk-V4BZWBZT.cjs.map} +1 -1
  149. package/dist/{chunk-FKXKBJUI.cjs → chunk-VHO6JPRR.cjs} +2 -1
  150. package/dist/chunk-VHO6JPRR.cjs.map +1 -0
  151. package/dist/{chunk-3E7TKBQI.cjs → chunk-VQGLVBPL.cjs} +24 -14
  152. package/dist/chunk-VQGLVBPL.cjs.map +1 -0
  153. package/dist/{chunk-27ZWUEPE.js → chunk-WE2SBWZ6.js} +20 -9
  154. package/dist/chunk-WE2SBWZ6.js.map +1 -0
  155. package/dist/{chunk-TQGO5WK6.js → chunk-WNDDS367.js} +7 -6
  156. package/dist/chunk-WNDDS367.js.map +1 -0
  157. package/dist/{chunk-Q5KQVBQP.cjs → chunk-X3BVQBXD.cjs} +18 -16
  158. package/dist/chunk-X3BVQBXD.cjs.map +1 -0
  159. package/dist/{chunk-J5RMLZ4P.cjs → chunk-XERBOFYZ.cjs} +80 -22
  160. package/dist/chunk-XERBOFYZ.cjs.map +1 -0
  161. package/dist/{chunk-3CXULV4G.cjs → chunk-XRVRGRC3.cjs} +2 -2
  162. package/dist/{chunk-3CXULV4G.cjs.map → chunk-XRVRGRC3.cjs.map} +1 -1
  163. package/dist/{chunk-K7T25Y3A.cjs → chunk-XZLSHEHE.cjs} +41 -27
  164. package/dist/chunk-XZLSHEHE.cjs.map +1 -0
  165. package/dist/{chunk-JRLUZDKA.js → chunk-YAKTVIVK.js} +20 -7
  166. package/dist/chunk-YAKTVIVK.js.map +1 -0
  167. package/dist/{chunk-IJ4DXG7D.cjs → chunk-YJNQLH2L.cjs} +5 -2
  168. package/dist/chunk-YJNQLH2L.cjs.map +1 -0
  169. package/dist/{chunk-ZPDETHQ7.js → chunk-YP4HUBKN.js} +3 -3
  170. package/dist/{chunk-ZPDETHQ7.js.map → chunk-YP4HUBKN.js.map} +1 -1
  171. package/dist/{chunk-5WH3JMR5.js → chunk-YXRKBKFB.js} +7 -4
  172. package/dist/chunk-YXRKBKFB.js.map +1 -0
  173. package/dist/{chunk-ACNTH2OQ.cjs → chunk-ZMRINZIO.cjs} +98 -106
  174. package/dist/chunk-ZMRINZIO.cjs.map +1 -0
  175. package/dist/color-picker/index.cjs +4 -4
  176. package/dist/color-picker/index.d.cts +8 -0
  177. package/dist/color-picker/index.d.ts +8 -0
  178. package/dist/color-picker/index.js +3 -3
  179. package/dist/combobox/index.cjs +6 -6
  180. package/dist/combobox/index.js +5 -5
  181. package/dist/command-palette/index.cjs +3 -2
  182. package/dist/command-palette/index.cjs.map +1 -1
  183. package/dist/command-palette/index.js +2 -1
  184. package/dist/context-menu/index.cjs +6 -6
  185. package/dist/context-menu/index.d.cts +1 -1
  186. package/dist/context-menu/index.d.ts +1 -1
  187. package/dist/context-menu/index.js +5 -5
  188. package/dist/conversation/index.cjs +8 -8
  189. package/dist/conversation/index.d.cts +1 -1
  190. package/dist/conversation/index.d.ts +1 -1
  191. package/dist/conversation/index.js +7 -7
  192. package/dist/data-grid/index.cjs +16 -16
  193. package/dist/data-grid/index.d.cts +14 -15
  194. package/dist/data-grid/index.d.ts +14 -15
  195. package/dist/data-grid/index.js +15 -15
  196. package/dist/date-picker/index.cjs +8 -8
  197. package/dist/date-picker/index.d.cts +12 -2
  198. package/dist/date-picker/index.d.ts +12 -2
  199. package/dist/date-picker/index.js +7 -7
  200. package/dist/drawer/index.cjs +5 -5
  201. package/dist/drawer/index.js +4 -4
  202. package/dist/dropdown/index.cjs +3 -3
  203. package/dist/dropdown/index.d.cts +34 -0
  204. package/dist/dropdown/index.d.ts +34 -0
  205. package/dist/dropdown/index.js +2 -2
  206. package/dist/file-upload/index.cjs +2 -2
  207. package/dist/file-upload/index.js +1 -1
  208. package/dist/header/index.cjs +6 -6
  209. package/dist/header/index.js +5 -5
  210. package/dist/index.cjs +42 -42
  211. package/dist/index.css +112 -40
  212. package/dist/index.d.cts +5 -5
  213. package/dist/index.d.ts +5 -5
  214. package/dist/index.js +41 -41
  215. package/dist/inline-edit/index.cjs +5 -5
  216. package/dist/inline-edit/index.js +4 -4
  217. package/dist/input/index.cjs +4 -4
  218. package/dist/input/index.d.cts +2 -2
  219. package/dist/input/index.d.ts +2 -2
  220. package/dist/input/index.js +3 -3
  221. package/dist/menu/index.cjs +5 -5
  222. package/dist/menu/index.d.cts +23 -2
  223. package/dist/menu/index.d.ts +23 -2
  224. package/dist/menu/index.js +4 -4
  225. package/dist/modal/index.cjs +5 -5
  226. package/dist/modal/index.js +4 -4
  227. package/dist/navigation/index.cjs +5 -5
  228. package/dist/navigation/index.js +4 -4
  229. package/dist/number-input/index.cjs +3 -3
  230. package/dist/number-input/index.js +2 -2
  231. package/dist/o-t-p-input/index.cjs +2 -2
  232. package/dist/o-t-p-input/index.js +1 -1
  233. package/dist/page-layout/index.cjs +12 -12
  234. package/dist/page-layout/index.d.cts +2 -2
  235. package/dist/page-layout/index.d.ts +2 -2
  236. package/dist/page-layout/index.js +11 -11
  237. package/dist/pagination/index.cjs +8 -8
  238. package/dist/pagination/index.js +7 -7
  239. package/dist/popover/index.cjs +3 -2
  240. package/dist/popover/index.cjs.map +1 -1
  241. package/dist/popover/index.d.cts +3 -1
  242. package/dist/popover/index.d.ts +3 -1
  243. package/dist/popover/index.js +2 -1
  244. package/dist/radio/index.cjs +2 -2
  245. package/dist/radio/index.js +1 -1
  246. package/dist/segmented-control/index.cjs +4 -4
  247. package/dist/segmented-control/index.js +3 -3
  248. package/dist/select/index.cjs +6 -6
  249. package/dist/select/index.d.cts +3 -3
  250. package/dist/select/index.d.ts +3 -3
  251. package/dist/select/index.js +5 -5
  252. package/dist/snackbar/index.cjs +5 -5
  253. package/dist/snackbar/index.d.cts +4 -0
  254. package/dist/snackbar/index.d.ts +4 -0
  255. package/dist/snackbar/index.js +4 -4
  256. package/dist/split-button/index.cjs +6 -6
  257. package/dist/split-button/index.js +5 -5
  258. package/dist/table/index.cjs +14 -14
  259. package/dist/table/index.d.cts +2 -2
  260. package/dist/table/index.d.ts +2 -2
  261. package/dist/table/index.js +13 -13
  262. package/dist/tabs/index.cjs +3 -3
  263. package/dist/tabs/index.js +2 -2
  264. package/dist/tag-input/index.cjs +6 -6
  265. package/dist/tag-input/index.js +5 -5
  266. package/dist/textarea/index.cjs +4 -4
  267. package/dist/textarea/index.js +3 -3
  268. package/dist/theme-editor/index.cjs +11 -11
  269. package/dist/theme-editor/index.js +10 -10
  270. package/dist/theme-provider/index.cjs +3 -3
  271. package/dist/theme-provider/index.js +2 -2
  272. package/dist/toolbar/index.cjs +8 -8
  273. package/dist/toolbar/index.d.cts +3 -3
  274. package/dist/toolbar/index.d.ts +3 -3
  275. package/dist/toolbar/index.js +7 -7
  276. package/dist/tooltip/index.cjs +3 -2
  277. package/dist/tooltip/index.cjs.map +1 -1
  278. package/dist/tooltip/index.js +2 -1
  279. package/dist/virtual-list/index.cjs +2 -2
  280. package/dist/virtual-list/index.js +1 -1
  281. package/package.json +7 -2
  282. package/dist/chunk-25PSIDPC.js.map +0 -1
  283. package/dist/chunk-27ZWUEPE.js.map +0 -1
  284. package/dist/chunk-3E7TKBQI.cjs.map +0 -1
  285. package/dist/chunk-3EPND5M2.cjs.map +0 -1
  286. package/dist/chunk-3EUTXQDB.js.map +0 -1
  287. package/dist/chunk-55J4LEKT.cjs.map +0 -1
  288. package/dist/chunk-5HUZYY54.js.map +0 -1
  289. package/dist/chunk-5WH3JMR5.js.map +0 -1
  290. package/dist/chunk-6CPCNQKV.js.map +0 -1
  291. package/dist/chunk-7SVDYEKM.js.map +0 -1
  292. package/dist/chunk-ACNTH2OQ.cjs.map +0 -1
  293. package/dist/chunk-AOGNTG3W.cjs.map +0 -1
  294. package/dist/chunk-BNVQ34FD.js +0 -125
  295. package/dist/chunk-BNVQ34FD.js.map +0 -1
  296. package/dist/chunk-CJGFRPAS.cjs.map +0 -1
  297. package/dist/chunk-CUJBNRJJ.cjs +0 -38
  298. package/dist/chunk-CUJBNRJJ.cjs.map +0 -1
  299. package/dist/chunk-E6SE552P.cjs.map +0 -1
  300. package/dist/chunk-E7FGY7BJ.js.map +0 -1
  301. package/dist/chunk-EAJHEYZM.js +0 -38
  302. package/dist/chunk-EAJHEYZM.js.map +0 -1
  303. package/dist/chunk-FKXKBJUI.cjs.map +0 -1
  304. package/dist/chunk-FXZJL2AM.cjs.map +0 -1
  305. package/dist/chunk-GG5YGESX.js.map +0 -1
  306. package/dist/chunk-GPRJYPIG.js.map +0 -1
  307. package/dist/chunk-H6CWTMAH.js.map +0 -1
  308. package/dist/chunk-HALVTKW7.js.map +0 -1
  309. package/dist/chunk-I5XR2V4A.cjs.map +0 -1
  310. package/dist/chunk-IJ4DXG7D.cjs.map +0 -1
  311. package/dist/chunk-ITXDSQT2.js.map +0 -1
  312. package/dist/chunk-J5RMLZ4P.cjs.map +0 -1
  313. package/dist/chunk-JRLUZDKA.js.map +0 -1
  314. package/dist/chunk-K7T25Y3A.cjs.map +0 -1
  315. package/dist/chunk-L5Q6UDY3.js +0 -69
  316. package/dist/chunk-L5Q6UDY3.js.map +0 -1
  317. package/dist/chunk-M7PF4FKQ.js.map +0 -1
  318. package/dist/chunk-MCWTQT3M.cjs.map +0 -1
  319. package/dist/chunk-MHZIBV2C.js.map +0 -1
  320. package/dist/chunk-NEYLNRVG.cjs.map +0 -1
  321. package/dist/chunk-O3LG7B2J.cjs.map +0 -1
  322. package/dist/chunk-OAK7HFOJ.js.map +0 -1
  323. package/dist/chunk-OAPOGYA5.cjs.map +0 -1
  324. package/dist/chunk-OGC44JFZ.cjs.map +0 -1
  325. package/dist/chunk-OJDYTCMO.cjs.map +0 -1
  326. package/dist/chunk-P2JM22BF.cjs.map +0 -1
  327. package/dist/chunk-PY2376XI.js.map +0 -1
  328. package/dist/chunk-Q5KQVBQP.cjs.map +0 -1
  329. package/dist/chunk-QQIALSTX.cjs.map +0 -1
  330. package/dist/chunk-R4M6SNUU.cjs.map +0 -1
  331. package/dist/chunk-RYOQYYDO.js.map +0 -1
  332. package/dist/chunk-S4S4LB63.js.map +0 -1
  333. package/dist/chunk-SXGCRHBZ.js.map +0 -1
  334. package/dist/chunk-T2KB3DJJ.js.map +0 -1
  335. package/dist/chunk-TEVZHN5I.cjs.map +0 -1
  336. package/dist/chunk-TQGO5WK6.js.map +0 -1
  337. package/dist/chunk-VXO2MYYH.cjs +0 -125
  338. package/dist/chunk-VXO2MYYH.cjs.map +0 -1
  339. package/dist/chunk-WWYJNWJY.cjs +0 -69
  340. package/dist/chunk-WWYJNWJY.cjs.map +0 -1
  341. package/dist/chunk-YV57RSPD.js.map +0 -1
  342. package/dist/chunk-Z5U4NJTW.cjs.map +0 -1
  343. package/dist/chunk-ZNWIHUHZ.cjs.map +0 -1
  344. package/dist/chunk-ZWAFL2B3.cjs.map +0 -1
  345. package/dist/chunk-ZXJU3TQD.cjs.map +0 -1
  346. /package/dist/{chunk-GDQWSCJQ.js.map → chunk-26SO4LZ5.js.map} +0 -0
  347. /package/dist/{chunk-KQJ3IAFT.js.map → chunk-A3LMUPG3.js.map} +0 -0
  348. /package/dist/{chunk-O2AACVSF.js.map → chunk-AR2ZOO6L.js.map} +0 -0
  349. /package/dist/{chunk-L23WWO3D.js.map → chunk-GPVGGBIR.js.map} +0 -0
  350. /package/dist/{chunk-2QEKSRVX.js.map → chunk-HEX4IMLO.js.map} +0 -0
  351. /package/dist/{chunk-OU7DCYIA.js.map → chunk-O3QM3BFE.js.map} +0 -0
  352. /package/dist/{chunk-WKDT2XFQ.js.map → chunk-OOCCSMWM.js.map} +0 -0
  353. /package/dist/{chunk-L5W2XC6M.js.map → chunk-RHFD2Z5V.js.map} +0 -0
  354. /package/dist/{chunk-VPRUHE35.js.map → chunk-SFFKQQ5Z.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-6CSUUQ5M.cjs","../src/components/Tabs/Tabs.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACNA,4EAAgF;AAChF,2CAA0C;AAkEtC,+CAAA;AA1DJ,IAAM,YAAA,EAAc,eAAA,CAAM,aAAA,CAAuC,IAAI,CAAA;AAErE,IAAM,eAAA,EAAiB,CAAA,EAAA,GAAwB;AAC7C,EAAA,MAAM,IAAA,EAAM,+BAAA,WAAsB,CAAA;AAClC,EAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,yCAAyC,CAAA;AACnE,EAAA,OAAO,GAAA;AACT,CAAA;AAOO,IAAM,IAAA,EAA0B,CAAC;AAAA,EACtC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,EACX,IAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,QAAQ,EAAA,EAAI,cAAA,CAAe,CAAA;AAC3E,EAAA,MAAM,SAAA,EAAW,YAAA,IAAgB,KAAA;AAEjC,EAAA,MAAM,cAAA,EAAgB,CAAC,CAAA,EAAA,GAA8C;AACnE,IAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,GAAA,CAAI,CAAC,IAAA,EAAM,MAAA;AAEX,IAAA,MAAM,QAAA,EAAU,KAAA,CAAM,IAAA;AAAA,MACpB,IAAA,CAAK,gBAAA,CAAiB,8BAA8B;AAAA,IACtD,CAAA;AACA,IAAA,MAAM,aAAA,EAAe,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAAE,aAAa,CAAA;AACpD,IAAA,GAAA,CAAI,aAAA,IAAiB,CAAA,CAAA,EAAI,MAAA;AAEzB,IAAA,IAAI,YAAA,EAAc,CAAA,CAAA;AAClB,IAAA,GAAA,CAAI,CAAA,CAAE,IAAA,IAAQ,YAAA,EAAc,YAAA,EAAA,CAAe,aAAA,EAAe,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA;AAAA,IAAA,KAAA,GAAA,CAC9D,CAAA,CAAE,IAAA,IAAQ,WAAA;AACjB,MAAA,YAAA,EAAA,CAAe,aAAA,EAAe,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAA,EAAU,OAAA,CAAQ,MAAA;AAAA,IAAA,KAAA,GAAA,CACrD,CAAA,CAAE,IAAA,IAAQ,MAAA,EAAQ,YAAA,EAAc,CAAA;AAAA,IAAA,KAAA,GAAA,CAChC,CAAA,CAAE,IAAA,IAAQ,KAAA,EAAO,YAAA,EAAc,OAAA,CAAQ,OAAA,EAAS,CAAA;AAEzD,IAAA,GAAA,CAAI,YAAA,IAAgB,CAAA,CAAA,EAAI;AACtB,MAAA,CAAA,CAAE,cAAA,CAAe,CAAA;AACjB,MAAA,OAAA,CAAQ,WAAW,CAAA,CAAE,KAAA,CAAM,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,EAAa;AAAA,IACjB,WAAA;AAAA,IACA,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA;AACN,IAAA;AACA,IAAA;AACC,IAAA;AACb,IAAA;AAGC,EAAA;AAGD,EAAA;AAAC,IAAA;AAAA,IAAA;AACkB,MAAA;AACZ,MAAA;AACU,MAAA;AACA,MAAA;AACL,MAAA;AACV,MAAA;AACW,MAAA;AACK,MAAA;AACL,MAAA;AACN,MAAA;AAEJ,MAAA;AAAQ,QAAA;AACT,wBAAA;AAA4C,MAAA;AAAA,IAAA;AAC9C,EAAA;AAEJ;AAEkB;AAOkC;AAC9B,EAAA;AACH,EAAA;AAEF,EAAA;AAGb,EAAA;AAAC,IAAA;AAAA,IAAA;AACK,MAAA;AACC,MAAA;AACL,MAAA;AACU,MAAA;AACE,MAAA;AAEX,MAAA;AAAA,IAAA;AACH,EAAA;AAEJ;AAEuB;AAMmB;AACxC,EAAA;AACA,EAAA;AACA,EAAA;AACU,EAAA;AACH,EAAA;AACC,EAAA;AACI,EAAA;AACI,EAAA;AACJ,EAAA;AACZ,EAAA;AACI;AACiB,EAAA;AACF,EAAA;AACC,EAAA;AAIuB,EAAA;AACrC,EAAA;AAES,EAAA;AACF,IAAA;AACQ,IAAA;AACA,MAAA;AACF,IAAA;AACD,MAAA;AAChB,IAAA;AACD,EAAA;AAEe,EAAA;AACK,EAAA;AAIf,EAAA;AAEU,EAAA;AACE,IAAA;AACH,IAAA;AACK,IAAA;AACJ,IAAA;AAEI,IAAA;AACF,IAAA;AAIG,IAAA;AACD,MAAA;AAClB,IAAA;AAEgB,IAAA;AACA,IAAA;AAEG,IAAA;AAGF,MAAA;AACC,MAAA;AACF,MAAA;AAChB,IAAA;AACe,EAAA;AAQD,EAAA;AACD,IAAA;AACF,IAAA;AAEO,IAAA;AACF,IAAA;AAEH,IAAA;AACC,IAAA;AAEE,IAAA;AACT,MAAA;AACY,IAAA;AACZ,MAAA;AACP,IAAA;AACc,EAAA;AAKI,EAAA;AACd,EAAA;AAEU,EAAA;AACT,IAAA;AACQ,IAAA;AACF,IAAA;AAEI,IAAA;AACP,MAAA;AAIA,MAAA;AACA,MAAA;AACN,MAAA;AACE,QAAA;AAGF,MAAA;AACF,IAAA;AAEO,IAAA;AACF,IAAA;AAKY,IAAA;AACA,IAAA;AACD,IAAA;AAEH,IAAA;AACN,MAAA;AACI,MAAA;AACX,IAAA;AACE,EAAA;AAEiB,EAAA;AACN,IAAA;AACF,IAAA;AAIO,IAAA;AACZ,IAAA;AACU,IAAA;AAClB,EAAA;AAEkB,EAAA;AACG,IAAA;AACH,MAAA;AAChB,IAAA;AACmB,oBAAA;AACrB,EAAA;AAEqB,EAAA;AAID,EAAA;AAClB,IAAA;AACA,IAAA;AACa,IAAA;AAAmC;AAAA;AAAA;AAIhD,IAAA;AAGC,EAAA;AAMG,EAAA;AACA,EAAA;AAEA,EAAA;AAEF,IAAA;AACA,IAAA;AACA,IAAA;AACQ,EAAA;AAE2B,EAAA;AACrC,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AAGE,EAAA;AAOI,oBAAA;AACG,MAAA;AACE,QAAA;AAAA,QAAA;AACM,UAAA;AACM,UAAA;AACF,UAAA;AAQI,UAAA;AACH,UAAA;AACV,UAAA;AAEA,UAAA;AAAuD,QAAA;AACzD,MAAA;AAGF,sBAAA;AACG,QAAA;AACY,QAAA;AAGf,MAAA;AAEC,MAAA;AACE,QAAA;AAAA,QAAA;AACM,UAAA;AACM,UAAA;AACF,UAAA;AACI,UAAA;AACH,UAAA;AACV,UAAA;AAEA,UAAA;AAAwD,QAAA;AAC1D,MAAA;AAEJ,IAAA;AAEA,oBAAA;AAEJ,EAAA;AAEJ;AAEmB;ADhHI;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-6CSUUQ5M.cjs","sourcesContent":[null,"import React, { useState, useRef, useContext, useEffect, useLayoutEffect } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { renderIcon, dualModifier, fullWidthModifier } from '../../utils';\nimport type { TabsProps, TabProps, TabPanelProps, TabsContextValue } from './Tabs.types';\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\nconst useTabsContext = (): TabsContextValue => {\n const ctx = useContext(TabsContext);\n if (!ctx) throw new Error('Tab/TabPanel must be used inside <Tabs>');\n return ctx;\n};\n\n// ============================================================================\n// TAB - individual tab trigger button\n// Defined before Tabs so Tabs can use `child.type === Tab` for child separation.\n// ============================================================================\n\nexport const Tab: React.FC<TabProps> = ({\n value,\n children,\n disabled = false,\n icon,\n className = '',\n}) => {\n const { activeValue, onSelect, size, fullWidth, listRef } = useTabsContext();\n const isActive = activeValue === value;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n const list = listRef.current;\n if (!list) return;\n\n const allTabs = Array.from(\n list.querySelectorAll('[role=\"tab\"]:not([disabled])'),\n ) as HTMLElement[];\n const currentIndex = allTabs.indexOf(e.currentTarget);\n if (currentIndex === -1) return;\n\n let targetIndex = -1;\n if (e.key === 'ArrowRight') targetIndex = (currentIndex + 1) % allTabs.length;\n else if (e.key === 'ArrowLeft')\n targetIndex = (currentIndex - 1 + allTabs.length) % allTabs.length;\n else if (e.key === 'Home') targetIndex = 0;\n else if (e.key === 'End') targetIndex = allTabs.length - 1;\n\n if (targetIndex !== -1) {\n e.preventDefault();\n allTabs[targetIndex].focus();\n }\n };\n\n const tabClasses = [\n 'eidos-tab',\n `eidos-tab--${size}`,\n isActive && 'eidos-tab--active',\n disabled && 'eidos-tab--disabled',\n fullWidth && fullWidthModifier('eidos-tab'),\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n id={`eidos-tab-${value}`}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`eidos-tabpanel-${value}`}\n tabIndex={isActive ? 0 : -1}\n disabled={disabled}\n className={tabClasses}\n onClick={() => !disabled && onSelect(value)}\n onKeyDown={handleKeyDown}\n type=\"button\"\n >\n {icon && <span className=\"eidos-tab-icon\">{renderIcon(icon, 'eidos-tab-icon-svg')}</span>}\n <span className=\"eidos-tab-label\">{children}</span>\n </button>\n );\n};\n\nTab.displayName = 'Tab';\n\n// ============================================================================\n// TAB PANEL - content region shown when its value matches the active tab\n// Defined before Tabs for the same `child.type === TabPanel` check.\n// ============================================================================\n\nexport const TabPanel: React.FC<TabPanelProps> = ({ value, children, className = '' }) => {\n const { activeValue } = useTabsContext();\n const isActive = activeValue === value;\n\n if (!isActive) return null;\n\n return (\n <div\n id={`eidos-tabpanel-${value}`}\n role=\"tabpanel\"\n aria-labelledby={`eidos-tab-${value}`}\n tabIndex={0}\n className={['eidos-tab-panel', className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n};\n\nTabPanel.displayName = 'TabPanel';\n\n// ============================================================================\n// TABS - root container; provides context, separates tab/panel children\n// ============================================================================\n\nexport const Tabs: React.FC<TabsProps> = ({\n value,\n defaultValue,\n onChange,\n variant = 'line',\n size = 'md',\n color = 'primary',\n fullWidth = false,\n scrollButtons = 'auto',\n className = '',\n children,\n}) => {\n const isControlled = value !== undefined;\n const [localValue, setLocalValue] = useState(defaultValue ?? '');\n const activeValue = isControlled ? value! : localValue;\n\n // Separate Tab and TabPanel children so the list and panels render in\n // distinct DOM regions, regardless of how the consumer orders them.\n const tabChildren: React.ReactElement[] = [];\n const panelChildren: React.ReactElement[] = [];\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n if (child.type === Tab) {\n tabChildren.push(child);\n } else if (child.type === TabPanel) {\n panelChildren.push(child);\n }\n });\n\n const listRef = useRef<HTMLDivElement>(null);\n const indicatorRef = useRef<HTMLSpanElement>(null);\n // Tracks whether the indicator has been positioned at least once so we can\n // skip the CSS transition on the very first render and avoid it animating\n // from the top-left corner to the initial tab.\n const hasPositioned = useRef(false);\n\n useLayoutEffect(() => {\n if (variant !== 'line') return;\n const list = listRef.current;\n const indicator = indicatorRef.current;\n if (!list || !indicator) return;\n\n const activeTab = list.querySelector('[aria-selected=\"true\"]') as HTMLElement | null;\n if (!activeTab) return;\n\n // Suppress the CSS transition on the initial paint so the indicator snaps\n // into place rather than sliding from 0.\n if (!hasPositioned.current) {\n indicator.style.transition = 'none';\n }\n\n indicator.style.left = `${activeTab.offsetLeft}px`;\n indicator.style.width = `${activeTab.offsetWidth}px`;\n\n if (!hasPositioned.current) {\n // Force a synchronous reflow so the browser commits the no-transition\n // position before we re-enable the transition for future clicks.\n void indicator.offsetWidth;\n indicator.style.transition = '';\n hasPositioned.current = true;\n }\n }, [activeValue, variant, fullWidth]);\n\n // The list scrolls horizontally when the strip is wider than its container,\n // so an activated tab can sit outside the scrollport - reachable by keyboard\n // (`End`) or by a controlled `value` change, but invisible. `scrollLeft` is\n // adjusted directly rather than via `scrollIntoView`, which walks the whole\n // ancestor chain and would scroll the page vertically when the strip is below\n // the fold.\n useLayoutEffect(() => {\n const list = listRef.current;\n if (!list) return;\n\n const activeTab = list.querySelector('[aria-selected=\"true\"]') as HTMLElement | null;\n if (!activeTab) return;\n\n const left = activeTab.offsetLeft;\n const right = left + activeTab.offsetWidth;\n\n if (left < list.scrollLeft) {\n list.scrollLeft = left;\n } else if (right > list.scrollLeft + list.clientWidth) {\n list.scrollLeft = right - list.clientWidth;\n }\n }, [activeValue]);\n\n // Whether either end of the strip has content hidden past it. Drives both\n // the presence of the scroll buttons (neither end scrollable = the strip\n // fits, so no buttons) and their disabled state at the extremes.\n const [scrollState, setScrollState] = useState({ canScrollPrev: false, canScrollNext: false });\n const hasScrollButtons = scrollButtons !== 'none';\n\n useEffect(() => {\n if (!hasScrollButtons) return;\n const list = listRef.current;\n if (!list) return;\n\n const update = () => {\n const maxScroll = list.scrollWidth - list.clientWidth;\n // 1px of tolerance: fractional layout widths leave a sub-pixel remainder\n // at either end that would otherwise keep a button enabled for a scroll\n // that can no longer move anything.\n const canScrollPrev = list.scrollLeft > 1;\n const canScrollNext = list.scrollLeft < maxScroll - 1;\n setScrollState((previous) =>\n previous.canScrollPrev === canScrollPrev && previous.canScrollNext === canScrollNext\n ? previous\n : { canScrollPrev, canScrollNext },\n );\n };\n\n update();\n list.addEventListener('scroll', update, { passive: true });\n\n // The list's own box stays the same width when a tab's label reflows or a\n // font finishes loading, so the tabs have to be observed as well as the\n // container - only their sizes tell us the strip started overflowing.\n const observer = new ResizeObserver(update);\n observer.observe(list);\n Array.from(list.children).forEach((child) => observer.observe(child));\n\n return () => {\n list.removeEventListener('scroll', update);\n observer.disconnect();\n };\n }, [hasScrollButtons, tabChildren.length, size, variant, fullWidth]);\n\n const scrollByStep = (direction: -1 | 1) => {\n const list = listRef.current;\n if (!list) return;\n\n // A step just short of a full page keeps a tab of context on screen, the\n // same way a paged scrollbar click does.\n const step = list.clientWidth * 0.8;\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n list.scrollBy({ left: direction * step, behavior: reducedMotion ? 'auto' : 'smooth' });\n };\n\n const onSelect = (newValue: string) => {\n if (!isControlled) {\n setLocalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const rootClasses = ['eidos-tabs', `eidos-tabs--${variant}`, `eidos-tabs--${color}`, className]\n .filter(Boolean)\n .join(' ');\n\n const listClasses = [\n 'eidos-tabs-list',\n `eidos-tabs-list--${size}`,\n fullWidth && fullWidthModifier('eidos-tabs-list'),\n // With buttons, they are the affordance - a native scrollbar underneath\n // them is redundant, and on a space-taking one it would also sit over the\n // `line` variant's rule.\n hasScrollButtons && dualModifier('eidos-tabs-list', 'hide-scrollbar', 'hideScrollbar'),\n ]\n .filter(Boolean)\n .join(' ');\n\n // Each button exists only while its own direction has somewhere to go: none\n // at all when the strip fits, and none at the end you have reached. A\n // disabled button would be pointing at nothing. They are positioned\n // absolutely, so appearing and disappearing never moves the tabs.\n const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;\n const showNextButton = hasScrollButtons && scrollState.canScrollNext;\n\n const scrollButtonClasses = (direction: 'prev' | 'next') =>\n [\n 'eidos-tabs-scroll-button',\n `eidos-tabs-scroll-button--${direction}`,\n `eidos-tabs-scroll-button--${size}`,\n ].join(' ');\n\n const contextValue: TabsContextValue = {\n activeValue,\n onSelect,\n variant,\n size,\n color,\n fullWidth,\n listRef,\n };\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div className={rootClasses}>\n {/* The buttons are siblings of the tab list, never children of it:\n `role=\"tablist\"` only accepts tabs. They are also hidden from\n assistive tech and skipped by Tab, because they are a pointer\n affordance for something the keyboard already does - arrow keys\n move between tabs and scroll the active one into view. */}\n <div className=\"eidos-tabs-bar\">\n {showPrevButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('prev')}\n onClick={() => scrollByStep(-1)}\n // `tabIndex={-1}` keeps these out of the tab order but does not\n // stop a click from focusing them, and focus inside an\n // `aria-hidden` subtree is an error the browser reports\n // (\"Blocked aria-hidden on an element because its descendant\n // retained focus\"). Suppressing the default mousedown keeps\n // them unfocusable by pointer too; the click still fires.\n // `inert` would prevent the click as well, so it is no help.\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronLeft className=\"eidos-tabs-scroll-button-icon\" />\n </button>\n )}\n\n <div ref={listRef} className={listClasses} role=\"tablist\">\n {tabChildren}\n {variant === 'line' && (\n <span ref={indicatorRef} className=\"eidos-tabs-indicator\" aria-hidden=\"true\" />\n )}\n </div>\n\n {showNextButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('next')}\n onClick={() => scrollByStep(1)}\n onMouseDown={(event) => event.preventDefault()} // see the prev button\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronRight className=\"eidos-tabs-scroll-button-icon\" />\n </button>\n )}\n </div>\n\n <div className=\"eidos-tabs-panels\">{panelChildren}</div>\n </div>\n </TabsContext.Provider>\n );\n};\n\nTabs.displayName = 'Tabs';\n"]}
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-NOQF7UQ5.cjs","../src/components/Tabs/Tabs.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACNA,4EAAgF;AAChF,2CAA0C;AAkEtC,+CAAA;AA1DJ,IAAM,YAAA,EAAc,eAAA,CAAM,aAAA,CAAuC,IAAI,CAAA;AAErE,IAAM,eAAA,EAAiB,CAAA,EAAA,GAAwB;AAC7C,EAAA,MAAM,IAAA,EAAM,+BAAA,WAAsB,CAAA;AAClC,EAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,yCAAyC,CAAA;AACnE,EAAA,OAAO,GAAA;AACT,CAAA;AAOO,IAAM,IAAA,EAA0B,CAAC;AAAA,EACtC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,EACX,IAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,QAAQ,EAAA,EAAI,cAAA,CAAe,CAAA;AAC3E,EAAA,MAAM,SAAA,EAAW,YAAA,IAAgB,KAAA;AAEjC,EAAA,MAAM,cAAA,EAAgB,CAAC,CAAA,EAAA,GAA8C;AACnE,IAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,GAAA,CAAI,CAAC,IAAA,EAAM,MAAA;AAEX,IAAA,MAAM,QAAA,EAAU,KAAA,CAAM,IAAA;AAAA,MACpB,IAAA,CAAK,gBAAA,CAAiB,8BAA8B;AAAA,IACtD,CAAA;AACA,IAAA,MAAM,aAAA,EAAe,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAAE,aAAa,CAAA;AACpD,IAAA,GAAA,CAAI,aAAA,IAAiB,CAAA,CAAA,EAAI,MAAA;AAEzB,IAAA,IAAI,YAAA,EAAc,CAAA,CAAA;AAClB,IAAA,GAAA,CAAI,CAAA,CAAE,IAAA,IAAQ,YAAA,EAAc,YAAA,EAAA,CAAe,aAAA,EAAe,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA;AAAA,IAAA,KAAA,GAAA,CAC9D,CAAA,CAAE,IAAA,IAAQ,WAAA;AACjB,MAAA,YAAA,EAAA,CAAe,aAAA,EAAe,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAA,EAAU,OAAA,CAAQ,MAAA;AAAA,IAAA,KAAA,GAAA,CACrD,CAAA,CAAE,IAAA,IAAQ,MAAA,EAAQ,YAAA,EAAc,CAAA;AAAA,IAAA,KAAA,GAAA,CAChC,CAAA,CAAE,IAAA,IAAQ,KAAA,EAAO,YAAA,EAAc,OAAA,CAAQ,OAAA,EAAS,CAAA;AAEzD,IAAA,GAAA,CAAI,YAAA,IAAgB,CAAA,CAAA,EAAI;AACtB,MAAA,CAAA,CAAE,cAAA,CAAe,CAAA;AACjB,MAAA,OAAA,CAAQ,WAAW,CAAA,CAAE,KAAA,CAAM,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,EAAa;AAAA,IACjB,WAAA;AAAA,IACA,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA;AACN,IAAA;AACA,IAAA;AACC,IAAA;AACb,IAAA;AAGC,EAAA;AAGD,EAAA;AAAC,IAAA;AAAA,IAAA;AACkB,MAAA;AACZ,MAAA;AACU,MAAA;AACA,MAAA;AACL,MAAA;AACV,MAAA;AACW,MAAA;AACK,MAAA;AACL,MAAA;AACN,MAAA;AAEJ,MAAA;AAAQ,QAAA;AACT,wBAAA;AAA4C,MAAA;AAAA,IAAA;AAC9C,EAAA;AAEJ;AAEkB;AAOkC;AAC9B,EAAA;AACH,EAAA;AAEF,EAAA;AAGb,EAAA;AAAC,IAAA;AAAA,IAAA;AACK,MAAA;AACC,MAAA;AACL,MAAA;AACU,MAAA;AACE,MAAA;AAEX,MAAA;AAAA,IAAA;AACH,EAAA;AAEJ;AAEuB;AAMmB;AACxC,EAAA;AACA,EAAA;AACA,EAAA;AACU,EAAA;AACH,EAAA;AACC,EAAA;AACI,EAAA;AACI,EAAA;AACJ,EAAA;AACZ,EAAA;AACI;AACiB,EAAA;AACF,EAAA;AACC,EAAA;AAIuB,EAAA;AACrC,EAAA;AAES,EAAA;AACF,IAAA;AACQ,IAAA;AACA,MAAA;AACF,IAAA;AACD,MAAA;AAChB,IAAA;AACD,EAAA;AAEe,EAAA;AACK,EAAA;AAIf,EAAA;AAEU,EAAA;AACE,IAAA;AACH,IAAA;AACK,IAAA;AACJ,IAAA;AAEI,IAAA;AACF,IAAA;AAIG,IAAA;AACD,MAAA;AAClB,IAAA;AAEgB,IAAA;AACA,IAAA;AAEG,IAAA;AAGF,MAAA;AACC,MAAA;AACF,MAAA;AAChB,IAAA;AACe,EAAA;AAQD,EAAA;AACD,IAAA;AACF,IAAA;AAEO,IAAA;AACF,IAAA;AAEH,IAAA;AACC,IAAA;AAEE,IAAA;AACT,MAAA;AACY,IAAA;AACZ,MAAA;AACP,IAAA;AACc,EAAA;AAKI,EAAA;AACd,EAAA;AAEU,EAAA;AACT,IAAA;AACQ,IAAA;AACF,IAAA;AAEI,IAAA;AACP,MAAA;AAIA,MAAA;AACA,MAAA;AACN,MAAA;AACE,QAAA;AAGF,MAAA;AACF,IAAA;AAEO,IAAA;AACF,IAAA;AAKY,IAAA;AACA,IAAA;AACD,IAAA;AAEH,IAAA;AACN,MAAA;AACI,MAAA;AACX,IAAA;AACE,EAAA;AAEiB,EAAA;AACN,IAAA;AACF,IAAA;AAIO,IAAA;AACZ,IAAA;AACU,IAAA;AAClB,EAAA;AAEkB,EAAA;AACG,IAAA;AACH,MAAA;AAChB,IAAA;AACmB,oBAAA;AACrB,EAAA;AAEqB,EAAA;AAID,EAAA;AAClB,IAAA;AACA,IAAA;AACa,IAAA;AAAmC;AAAA;AAAA;AAIhD,IAAA;AAGC,EAAA;AAMG,EAAA;AACA,EAAA;AAEA,EAAA;AAEF,IAAA;AACA,IAAA;AACA,IAAA;AACQ,EAAA;AAE2B,EAAA;AACrC,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AAGE,EAAA;AAOI,oBAAA;AACG,MAAA;AACE,QAAA;AAAA,QAAA;AACM,UAAA;AACM,UAAA;AACF,UAAA;AAQI,UAAA;AACH,UAAA;AACV,UAAA;AAEA,UAAA;AAAuD,QAAA;AACzD,MAAA;AAGF,sBAAA;AACG,QAAA;AACY,QAAA;AAGf,MAAA;AAEC,MAAA;AACE,QAAA;AAAA,QAAA;AACM,UAAA;AACM,UAAA;AACF,UAAA;AACI,UAAA;AACH,UAAA;AACV,UAAA;AAEA,UAAA;AAAwD,QAAA;AAC1D,MAAA;AAEJ,IAAA;AAEA,oBAAA;AAEJ,EAAA;AAEJ;AAEmB;ADhHI;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-NOQF7UQ5.cjs","sourcesContent":[null,"import React, { useState, useRef, useContext, useEffect, useLayoutEffect } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { renderIcon, dualModifier, fullWidthModifier } from '../../utils';\nimport type { TabsProps, TabProps, TabPanelProps, TabsContextValue } from './Tabs.types';\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\nconst useTabsContext = (): TabsContextValue => {\n const ctx = useContext(TabsContext);\n if (!ctx) throw new Error('Tab/TabPanel must be used inside <Tabs>');\n return ctx;\n};\n\n// ============================================================================\n// TAB - individual tab trigger button\n// Defined before Tabs so Tabs can use `child.type === Tab` for child separation.\n// ============================================================================\n\nexport const Tab: React.FC<TabProps> = ({\n value,\n children,\n disabled = false,\n icon,\n className = '',\n}) => {\n const { activeValue, onSelect, size, fullWidth, listRef } = useTabsContext();\n const isActive = activeValue === value;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n const list = listRef.current;\n if (!list) return;\n\n const allTabs = Array.from(\n list.querySelectorAll('[role=\"tab\"]:not([disabled])'),\n ) as HTMLElement[];\n const currentIndex = allTabs.indexOf(e.currentTarget);\n if (currentIndex === -1) return;\n\n let targetIndex = -1;\n if (e.key === 'ArrowRight') targetIndex = (currentIndex + 1) % allTabs.length;\n else if (e.key === 'ArrowLeft')\n targetIndex = (currentIndex - 1 + allTabs.length) % allTabs.length;\n else if (e.key === 'Home') targetIndex = 0;\n else if (e.key === 'End') targetIndex = allTabs.length - 1;\n\n if (targetIndex !== -1) {\n e.preventDefault();\n allTabs[targetIndex].focus();\n }\n };\n\n const tabClasses = [\n 'eidos-tab',\n `eidos-tab--${size}`,\n isActive && 'eidos-tab--active',\n disabled && 'eidos-tab--disabled',\n fullWidth && fullWidthModifier('eidos-tab'),\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n id={`eidos-tab-${value}`}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`eidos-tabpanel-${value}`}\n tabIndex={isActive ? 0 : -1}\n disabled={disabled}\n className={tabClasses}\n onClick={() => !disabled && onSelect(value)}\n onKeyDown={handleKeyDown}\n type=\"button\"\n >\n {icon && <span className=\"eidos-tab-icon\">{renderIcon(icon, 'eidos-tab-icon-svg')}</span>}\n <span className=\"eidos-tab-label\">{children}</span>\n </button>\n );\n};\n\nTab.displayName = 'Tab';\n\n// ============================================================================\n// TAB PANEL - content region shown when its value matches the active tab\n// Defined before Tabs for the same `child.type === TabPanel` check.\n// ============================================================================\n\nexport const TabPanel: React.FC<TabPanelProps> = ({ value, children, className = '' }) => {\n const { activeValue } = useTabsContext();\n const isActive = activeValue === value;\n\n if (!isActive) return null;\n\n return (\n <div\n id={`eidos-tabpanel-${value}`}\n role=\"tabpanel\"\n aria-labelledby={`eidos-tab-${value}`}\n tabIndex={0}\n className={['eidos-tab-panel', className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n};\n\nTabPanel.displayName = 'TabPanel';\n\n// ============================================================================\n// TABS - root container; provides context, separates tab/panel children\n// ============================================================================\n\nexport const Tabs: React.FC<TabsProps> = ({\n value,\n defaultValue,\n onChange,\n variant = 'line',\n size = 'md',\n color = 'primary',\n fullWidth = false,\n scrollButtons = 'auto',\n className = '',\n children,\n}) => {\n const isControlled = value !== undefined;\n const [localValue, setLocalValue] = useState(defaultValue ?? '');\n const activeValue = isControlled ? value! : localValue;\n\n // Separate Tab and TabPanel children so the list and panels render in\n // distinct DOM regions, regardless of how the consumer orders them.\n const tabChildren: React.ReactElement[] = [];\n const panelChildren: React.ReactElement[] = [];\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n if (child.type === Tab) {\n tabChildren.push(child);\n } else if (child.type === TabPanel) {\n panelChildren.push(child);\n }\n });\n\n const listRef = useRef<HTMLDivElement>(null);\n const indicatorRef = useRef<HTMLSpanElement>(null);\n // Tracks whether the indicator has been positioned at least once so we can\n // skip the CSS transition on the very first render and avoid it animating\n // from the top-left corner to the initial tab.\n const hasPositioned = useRef(false);\n\n useLayoutEffect(() => {\n if (variant !== 'line') return;\n const list = listRef.current;\n const indicator = indicatorRef.current;\n if (!list || !indicator) return;\n\n const activeTab = list.querySelector('[aria-selected=\"true\"]') as HTMLElement | null;\n if (!activeTab) return;\n\n // Suppress the CSS transition on the initial paint so the indicator snaps\n // into place rather than sliding from 0.\n if (!hasPositioned.current) {\n indicator.style.transition = 'none';\n }\n\n indicator.style.left = `${activeTab.offsetLeft}px`;\n indicator.style.width = `${activeTab.offsetWidth}px`;\n\n if (!hasPositioned.current) {\n // Force a synchronous reflow so the browser commits the no-transition\n // position before we re-enable the transition for future clicks.\n void indicator.offsetWidth;\n indicator.style.transition = '';\n hasPositioned.current = true;\n }\n }, [activeValue, variant, fullWidth]);\n\n // The list scrolls horizontally when the strip is wider than its container,\n // so an activated tab can sit outside the scrollport - reachable by keyboard\n // (`End`) or by a controlled `value` change, but invisible. `scrollLeft` is\n // adjusted directly rather than via `scrollIntoView`, which walks the whole\n // ancestor chain and would scroll the page vertically when the strip is below\n // the fold.\n useLayoutEffect(() => {\n const list = listRef.current;\n if (!list) return;\n\n const activeTab = list.querySelector('[aria-selected=\"true\"]') as HTMLElement | null;\n if (!activeTab) return;\n\n const left = activeTab.offsetLeft;\n const right = left + activeTab.offsetWidth;\n\n if (left < list.scrollLeft) {\n list.scrollLeft = left;\n } else if (right > list.scrollLeft + list.clientWidth) {\n list.scrollLeft = right - list.clientWidth;\n }\n }, [activeValue]);\n\n // Whether either end of the strip has content hidden past it. Drives both\n // the presence of the scroll buttons (neither end scrollable = the strip\n // fits, so no buttons) and their disabled state at the extremes.\n const [scrollState, setScrollState] = useState({ canScrollPrev: false, canScrollNext: false });\n const hasScrollButtons = scrollButtons !== 'none';\n\n useEffect(() => {\n if (!hasScrollButtons) return;\n const list = listRef.current;\n if (!list) return;\n\n const update = () => {\n const maxScroll = list.scrollWidth - list.clientWidth;\n // 1px of tolerance: fractional layout widths leave a sub-pixel remainder\n // at either end that would otherwise keep a button enabled for a scroll\n // that can no longer move anything.\n const canScrollPrev = list.scrollLeft > 1;\n const canScrollNext = list.scrollLeft < maxScroll - 1;\n setScrollState((previous) =>\n previous.canScrollPrev === canScrollPrev && previous.canScrollNext === canScrollNext\n ? previous\n : { canScrollPrev, canScrollNext },\n );\n };\n\n update();\n list.addEventListener('scroll', update, { passive: true });\n\n // The list's own box stays the same width when a tab's label reflows or a\n // font finishes loading, so the tabs have to be observed as well as the\n // container - only their sizes tell us the strip started overflowing.\n const observer = new ResizeObserver(update);\n observer.observe(list);\n Array.from(list.children).forEach((child) => observer.observe(child));\n\n return () => {\n list.removeEventListener('scroll', update);\n observer.disconnect();\n };\n }, [hasScrollButtons, tabChildren.length, size, variant, fullWidth]);\n\n const scrollByStep = (direction: -1 | 1) => {\n const list = listRef.current;\n if (!list) return;\n\n // A step just short of a full page keeps a tab of context on screen, the\n // same way a paged scrollbar click does.\n const step = list.clientWidth * 0.8;\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n list.scrollBy({ left: direction * step, behavior: reducedMotion ? 'auto' : 'smooth' });\n };\n\n const onSelect = (newValue: string) => {\n if (!isControlled) {\n setLocalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const rootClasses = ['eidos-tabs', `eidos-tabs--${variant}`, `eidos-tabs--${color}`, className]\n .filter(Boolean)\n .join(' ');\n\n const listClasses = [\n 'eidos-tabs-list',\n `eidos-tabs-list--${size}`,\n fullWidth && fullWidthModifier('eidos-tabs-list'),\n // With buttons, they are the affordance - a native scrollbar underneath\n // them is redundant, and on a space-taking one it would also sit over the\n // `line` variant's rule.\n hasScrollButtons && dualModifier('eidos-tabs-list', 'hide-scrollbar', 'hideScrollbar'),\n ]\n .filter(Boolean)\n .join(' ');\n\n // Each button exists only while its own direction has somewhere to go: none\n // at all when the strip fits, and none at the end you have reached. A\n // disabled button would be pointing at nothing. They are positioned\n // absolutely, so appearing and disappearing never moves the tabs.\n const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;\n const showNextButton = hasScrollButtons && scrollState.canScrollNext;\n\n const scrollButtonClasses = (direction: 'prev' | 'next') =>\n [\n 'eidos-tabs-scroll-button',\n `eidos-tabs-scroll-button--${direction}`,\n `eidos-tabs-scroll-button--${size}`,\n ].join(' ');\n\n const contextValue: TabsContextValue = {\n activeValue,\n onSelect,\n variant,\n size,\n color,\n fullWidth,\n listRef,\n };\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div className={rootClasses}>\n {/* The buttons are siblings of the tab list, never children of it:\n `role=\"tablist\"` only accepts tabs. They are also hidden from\n assistive tech and skipped by Tab, because they are a pointer\n affordance for something the keyboard already does - arrow keys\n move between tabs and scroll the active one into view. */}\n <div className=\"eidos-tabs-bar\">\n {showPrevButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('prev')}\n onClick={() => scrollByStep(-1)}\n // `tabIndex={-1}` keeps these out of the tab order but does not\n // stop a click from focusing them, and focus inside an\n // `aria-hidden` subtree is an error the browser reports\n // (\"Blocked aria-hidden on an element because its descendant\n // retained focus\"). Suppressing the default mousedown keeps\n // them unfocusable by pointer too; the click still fires.\n // `inert` would prevent the click as well, so it is no help.\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronLeft className=\"eidos-tabs-scroll-button-icon\" />\n </button>\n )}\n\n <div ref={listRef} className={listClasses} role=\"tablist\">\n {tabChildren}\n {variant === 'line' && (\n <span ref={indicatorRef} className=\"eidos-tabs-indicator\" aria-hidden=\"true\" />\n )}\n </div>\n\n {showNextButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('next')}\n onClick={() => scrollByStep(1)}\n onMouseDown={(event) => event.preventDefault()} // see the prev button\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronRight className=\"eidos-tabs-scroll-button-icon\" />\n </button>\n )}\n </div>\n\n <div className=\"eidos-tabs-panels\">{panelChildren}</div>\n </div>\n </TabsContext.Provider>\n );\n};\n\nTabs.displayName = 'Tabs';\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MenuPanel
3
- } from "./chunk-BNVQ34FD.js";
3
+ } from "./chunk-P4XZH3OR.js";
4
4
 
5
5
  // src/components/ContextMenu/ContextMenu.component.tsx
6
6
  import { useState, useEffect, useRef, useCallback } from "react";
@@ -103,4 +103,4 @@ var ContextMenu = ({
103
103
  export {
104
104
  ContextMenu
105
105
  };
106
- //# sourceMappingURL=chunk-OU7DCYIA.js.map
106
+ //# sourceMappingURL=chunk-O3QM3BFE.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  Popover
3
- } from "./chunk-5HUZYY54.js";
3
+ } from "./chunk-4J25XZDI.js";
4
4
  import {
5
5
  Avatar
6
6
  } from "./chunk-XJBWFDDE.js";
7
7
  import {
8
8
  Button
9
- } from "./chunk-L5Q6UDY3.js";
9
+ } from "./chunk-75GFIQRU.js";
10
10
  import {
11
11
  devWarn,
12
12
  renderIcon
13
- } from "./chunk-EAJHEYZM.js";
13
+ } from "./chunk-RHHZRTWM.js";
14
14
 
15
15
  // src/components/Header/Header.component.tsx
16
16
  import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
@@ -142,4 +142,4 @@ export {
142
142
  Header,
143
143
  IdentityHeader
144
144
  };
145
- //# sourceMappingURL=chunk-WKDT2XFQ.js.map
145
+ //# sourceMappingURL=chunk-OOCCSMWM.js.map
@@ -0,0 +1,225 @@
1
+ import {
2
+ Dropdown
3
+ } from "./chunk-JHX6JK3M.js";
4
+ import {
5
+ Kbd
6
+ } from "./chunk-LYH3EKKQ.js";
7
+ import {
8
+ Tooltip
9
+ } from "./chunk-JNY7TUDS.js";
10
+ import {
11
+ renderIcon,
12
+ useDialogFocus
13
+ } from "./chunk-RHHZRTWM.js";
14
+
15
+ // src/components/Menu/Menu.component.tsx
16
+ import React, { useCallback, useMemo, useRef, useState } from "react";
17
+ import { ChevronRight } from "lucide-react";
18
+ import { jsx, jsxs } from "react/jsx-runtime";
19
+ var MenuPanel = ({
20
+ items,
21
+ className = "",
22
+ onItemClick,
23
+ onRequestClose
24
+ }) => {
25
+ const listRef = useRef(null);
26
+ const itemRefs = useRef(/* @__PURE__ */ new Map());
27
+ const registerItem = useCallback((id, element) => {
28
+ if (element) itemRefs.current.set(id, element);
29
+ else itemRefs.current.delete(id);
30
+ }, []);
31
+ useDialogFocus(true, listRef, { trapTab: false });
32
+ const handleItemClick = useCallback(
33
+ (item) => {
34
+ if (item.disabled) return;
35
+ if (item.onClick) {
36
+ item.onClick();
37
+ }
38
+ if (onItemClick) {
39
+ onItemClick(item);
40
+ }
41
+ },
42
+ [onItemClick]
43
+ );
44
+ const navigableIds = useMemo(
45
+ () => items.filter((item) => (item.type === "item" || item.type === "nested") && !item.disabled).map((item) => item.id),
46
+ [items]
47
+ );
48
+ const [focusedId, setFocusedId] = useState(null);
49
+ const [openSubmenuId, setOpenSubmenuId] = useState(null);
50
+ const activeId = focusedId && navigableIds.includes(focusedId) ? focusedId : navigableIds[0] ?? null;
51
+ const handleKeyDown = useCallback(
52
+ (event) => {
53
+ if (!event.target.closest('[role="menuitem"]')) return;
54
+ if (navigableIds.length === 0) return;
55
+ const focusAt = (index) => {
56
+ const id = navigableIds[(index + navigableIds.length) % navigableIds.length];
57
+ setFocusedId(id);
58
+ itemRefs.current.get(id)?.focus();
59
+ };
60
+ const current = Math.max(0, navigableIds.indexOf(activeId ?? ""));
61
+ switch (event.key) {
62
+ case "ArrowDown":
63
+ event.preventDefault();
64
+ focusAt(current + 1);
65
+ break;
66
+ case "ArrowUp":
67
+ event.preventDefault();
68
+ focusAt(current - 1);
69
+ break;
70
+ case "Home":
71
+ event.preventDefault();
72
+ focusAt(0);
73
+ break;
74
+ case "End":
75
+ event.preventDefault();
76
+ focusAt(navigableIds.length - 1);
77
+ break;
78
+ case "ArrowLeft":
79
+ if (onRequestClose) {
80
+ event.preventDefault();
81
+ event.stopPropagation();
82
+ onRequestClose();
83
+ }
84
+ break;
85
+ default:
86
+ break;
87
+ }
88
+ },
89
+ [navigableIds, activeId, onRequestClose]
90
+ );
91
+ const renderMenuItem = (item) => {
92
+ switch (item.type) {
93
+ case "item":
94
+ return /* @__PURE__ */ jsxs(
95
+ "li",
96
+ {
97
+ ref: (element) => registerItem(item.id, element),
98
+ role: "menuitem",
99
+ tabIndex: !item.disabled && item.id === activeId ? 0 : -1,
100
+ "aria-disabled": item.disabled || void 0,
101
+ className: [
102
+ "eidos-menu-item",
103
+ item.disabled ? "eidos-menu-item--disabled" : "",
104
+ item.color ? `eidos-menu-item--${item.color}` : ""
105
+ ].filter(Boolean).join(" "),
106
+ onClick: () => handleItemClick(item),
107
+ onKeyDown: (event) => {
108
+ if (event.key === "Enter" || event.key === " ") {
109
+ event.preventDefault();
110
+ handleItemClick(item);
111
+ }
112
+ },
113
+ children: [
114
+ item.icon && renderIcon(item.icon, "eidos-menu-icon"),
115
+ /* @__PURE__ */ jsx("span", { className: `eidos-menu-label`, children: item.label }),
116
+ item.shortcut && /* @__PURE__ */ jsx(Kbd, { size: "sm", className: "eidos-menu-shortcut", children: item.shortcut })
117
+ ]
118
+ },
119
+ item.id
120
+ );
121
+ case "component":
122
+ return /* @__PURE__ */ jsx("li", { role: "none", className: `eidos-menu-component-item`, children: item.component }, item.id);
123
+ case "separator":
124
+ return /* @__PURE__ */ jsx("li", { role: "separator", className: `eidos-menu-separator` }, item.id);
125
+ case "nested": {
126
+ const triggerElement = /* @__PURE__ */ jsxs(
127
+ "div",
128
+ {
129
+ ref: (element) => registerItem(item.id, element),
130
+ role: "menuitem",
131
+ "aria-haspopup": "menu",
132
+ "aria-expanded": openSubmenuId === item.id,
133
+ "aria-disabled": item.disabled || void 0,
134
+ tabIndex: !item.disabled && item.id === activeId ? 0 : -1,
135
+ className: [
136
+ "eidos-menu-nested-trigger",
137
+ item.disabled ? "eidos-menu-nested-trigger--disabled" : ""
138
+ ].filter(Boolean).join(" "),
139
+ onKeyDown: (event) => {
140
+ if (item.disabled) return;
141
+ if (event.key === "ArrowRight" || event.key === "Enter" || event.key === " ") {
142
+ event.preventDefault();
143
+ setOpenSubmenuId(item.id);
144
+ }
145
+ },
146
+ children: [
147
+ item.icon && renderIcon(item.icon, "eidos-menu-icon"),
148
+ /* @__PURE__ */ jsx("span", { className: `eidos-menu-label`, children: item.label }),
149
+ /* @__PURE__ */ jsx(ChevronRight, { className: `eidos-menu-nested-arrow` })
150
+ ]
151
+ }
152
+ );
153
+ return /* @__PURE__ */ jsx("li", { role: "none", className: `eidos-menu-nested-item`, children: /* @__PURE__ */ jsx(
154
+ Dropdown,
155
+ {
156
+ open: openSubmenuId === item.id,
157
+ onOpenChange: (next) => setOpenSubmenuId(next ? item.id : null),
158
+ trigger: triggerElement,
159
+ content: /* @__PURE__ */ jsx(
160
+ MenuPanel,
161
+ {
162
+ items: item.items,
163
+ onItemClick,
164
+ onRequestClose: () => setOpenSubmenuId(null)
165
+ }
166
+ ),
167
+ placement: "right",
168
+ isNested: true,
169
+ fullWidth: true,
170
+ disabled: item.disabled
171
+ }
172
+ ) }, item.id);
173
+ }
174
+ default:
175
+ return null;
176
+ }
177
+ };
178
+ return /* @__PURE__ */ jsx("ul", { ref: listRef, role: "menu", className: `eidos-menu ${className}`, onKeyDown: handleKeyDown, children: items.map(renderMenuItem) });
179
+ };
180
+ var Menu = ({
181
+ trigger,
182
+ items,
183
+ minWidth,
184
+ maxWidth,
185
+ minHeight,
186
+ maxHeight,
187
+ autoWidth = true,
188
+ triggerRef,
189
+ closeOnItemClick = true,
190
+ tooltip
191
+ }) => {
192
+ const [isOpen, setIsOpen] = useState(false);
193
+ const handleItemClick = useCallback(
194
+ (_item) => {
195
+ if (closeOnItemClick) setIsOpen(false);
196
+ },
197
+ [closeOnItemClick]
198
+ );
199
+ const describedTrigger = React.isValidElement(trigger) ? React.cloneElement(
200
+ trigger,
201
+ { "aria-haspopup": "menu", "aria-expanded": isOpen }
202
+ ) : trigger;
203
+ const dropdown = /* @__PURE__ */ jsx(
204
+ Dropdown,
205
+ {
206
+ open: isOpen,
207
+ onOpenChange: setIsOpen,
208
+ trigger: describedTrigger,
209
+ content: /* @__PURE__ */ jsx(MenuPanel, { items, onItemClick: handleItemClick }),
210
+ minWidth,
211
+ maxWidth,
212
+ minHeight,
213
+ maxHeight,
214
+ autoWidth,
215
+ triggerRef
216
+ }
217
+ );
218
+ return tooltip ? /* @__PURE__ */ jsx(Tooltip, { message: tooltip, children: dropdown }) : dropdown;
219
+ };
220
+
221
+ export {
222
+ MenuPanel,
223
+ Menu
224
+ };
225
+ //# sourceMappingURL=chunk-P4XZH3OR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Menu/Menu.component.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { ChevronRight } from 'lucide-react';\nimport type { MenuProps, MenuItemType, MenuItem, MenuWrapperProps } from './Menu.types';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport { Tooltip } from '../Tooltip/Tooltip.component';\nimport { Kbd } from '../Kbd/Kbd.component';\nimport { renderIcon, useDialogFocus } from '../../utils';\n\n/**\n * MenuPanel - the bare menu list, without any trigger or dropdown wrapper.\n * Exported for use in SplitButton, ContextMenu, and other consumers that need\n * to render the menu content inside their own Dropdown / portal.\n *\n * ## This element owns the menu semantics, not the overlay around it\n *\n * `role=\"menu\"` belongs on the element that directly contains the items, which\n * is this `<ul>`. It used to sit on `Dropdown`'s content `<div>` instead, one\n * level further out, so the menu's only child was a list and the items were\n * `listitem`s - `aria-required-children`, and a structure no screen reader\n * could present as a menu.\n *\n * ## The keyboard model is not optional\n *\n * The items were plain `<li onClick>`: no role, no `tabIndex`, no key handler.\n * Every menu in the library - `Menu`, `ContextMenu`, `SplitButton`, `Table` and\n * `DataGrid` row actions - was therefore **operable by mouse only**, which is\n * WCAG 2.1.1 (Level A). Axe reported none of it, because every menu story\n * renders closed and axe only sees what is on screen.\n *\n * A `menuitem` role is a promise that arrow keys work, so the two land\n * together: roving `tabIndex` (one tab stop for the whole menu), Up/Down to\n * move, Home/End to jump, Enter/Space to activate, ArrowRight to open a\n * submenu. Focus enters on open and returns to the trigger on close.\n */\nexport const MenuPanel: React.FC<MenuProps> = ({\n items,\n className = '',\n onItemClick,\n onRequestClose,\n}) => {\n const listRef = useRef<HTMLUListElement>(null);\n const itemRefs = useRef(new Map<string, HTMLElement>());\n\n const registerItem = useCallback((id: string, element: HTMLElement | null) => {\n if (element) itemRefs.current.set(id, element);\n else itemRefs.current.delete(id);\n }, []);\n\n // Moves focus into the menu when it opens and back to the trigger when it\n // closes. `trapTab: false` - a menu is not a dialog, and confining Tab to it\n // would strand the user; the hook's frame-retry loop is what matters here,\n // because `Dropdown`'s content is `visibility: hidden` until it has been\n // positioned and `.focus()` on a hidden element is a silent no-op.\n //\n // `active` is unconditionally true: this panel is only ever mounted by an\n // open overlay (`Dropdown` and `ContextMenu` both render content\n // conditionally), so mounting *is* opening.\n useDialogFocus(true, listRef, { trapTab: false });\n\n // Handle menu item click\n const handleItemClick = useCallback(\n (item: MenuItem) => {\n if (item.disabled) return;\n\n // Execute the item's onClick handler first\n if (item.onClick) {\n item.onClick();\n }\n\n // Then call the onItemClick callback (which will close the dropdown)\n if (onItemClick) {\n onItemClick(item);\n }\n },\n [onItemClick],\n );\n\n // The items arrow keys move between, in visual order. Separators are not\n // stops, `component` items own their own focusable content, and a disabled\n // item is skipped rather than being a dead stop.\n const navigableIds = useMemo(\n () =>\n items\n .filter((item) => (item.type === 'item' || item.type === 'nested') && !item.disabled)\n .map((item) => item.id),\n [items],\n );\n\n const [focusedId, setFocusedId] = useState<string | null>(null);\n // Which submenu is open, owned here rather than inside each nested overlay:\n // the trigger has to advertise `aria-expanded`, and `ArrowLeft` in the child\n // has to be able to close it. Both were impossible while the overlay kept\n // that state to itself.\n const [openSubmenuId, setOpenSubmenuId] = useState<string | null>(null);\n // Validated rather than trusted: `items` can change while the menu is open\n // (a filtered list, an action that disables its neighbour), which would\n // otherwise leave the roving tabIndex on an id that no longer renders - and\n // therefore no tab stop in the menu at all.\n const activeId =\n focusedId && navigableIds.includes(focusedId) ? focusedId : (navigableIds[0] ?? null);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLUListElement>) => {\n // A `component` item may hold a real control - a text field, a switch -\n // whose own arrow keys must not be hijacked for menu navigation. Only\n // keys pressed on a menuitem drive the menu.\n if (!(event.target as HTMLElement).closest('[role=\"menuitem\"]')) return;\n if (navigableIds.length === 0) return;\n\n const focusAt = (index: number) => {\n const id = navigableIds[(index + navigableIds.length) % navigableIds.length];\n setFocusedId(id);\n itemRefs.current.get(id)?.focus();\n };\n const current = Math.max(0, navigableIds.indexOf(activeId ?? ''));\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n focusAt(current + 1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n focusAt(current - 1);\n break;\n case 'Home':\n event.preventDefault();\n focusAt(0);\n break;\n case 'End':\n event.preventDefault();\n focusAt(navigableIds.length - 1);\n break;\n case 'ArrowLeft':\n // Only meaningful in a submenu. `stopPropagation` keeps the parent\n // panel - which is a React ancestor, portal notwithstanding - from\n // treating the same keypress as its own.\n if (onRequestClose) {\n event.preventDefault();\n event.stopPropagation();\n onRequestClose();\n }\n break;\n default:\n break;\n }\n },\n [navigableIds, activeId, onRequestClose],\n );\n\n // Render individual menu item\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\n switch (item.type) {\n case 'item':\n return (\n <li\n key={item.id}\n ref={(element) => registerItem(item.id, element)}\n role=\"menuitem\"\n // Roving tabIndex: the menu is one tab stop and arrows move within\n // it. Making every item a tab stop would bury whatever follows a\n // ten-item menu ten presses deep.\n tabIndex={!item.disabled && item.id === activeId ? 0 : -1}\n // `aria-disabled`, not the `disabled` attribute, which an `li` does\n // not have. The click handler already returns early.\n aria-disabled={item.disabled || undefined}\n className={[\n 'eidos-menu-item',\n item.disabled ? 'eidos-menu-item--disabled' : '',\n item.color ? `eidos-menu-item--${item.color}` : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleItemClick(item)}\n onKeyDown={(event) => {\n // An `li` is not a button, so Enter and Space produce no click of\n // their own - activation has to be wired by hand. Space is\n // prevented to stop the page scrolling underneath.\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleItemClick(item);\n }\n }}\n >\n {item.icon && renderIcon(item.icon, 'eidos-menu-icon')}\n <span className={`eidos-menu-label`}>{item.label}</span>\n {item.shortcut && (\n <Kbd size=\"sm\" className=\"eidos-menu-shortcut\">\n {item.shortcut}\n </Kbd>\n )}\n </li>\n );\n\n case 'component':\n // `role=\"none\"` because the `li` is a wrapper: whatever the consumer\n // renders owns its own semantics, and calling it a `menuitem` would nest\n // that control inside an interactive role.\n return (\n <li key={item.id} role=\"none\" className={`eidos-menu-component-item`}>\n {item.component}\n </li>\n );\n\n case 'separator':\n return <li key={item.id} role=\"separator\" className={`eidos-menu-separator`} />;\n\n case 'nested': {\n const triggerElement = (\n <div\n ref={(element) => registerItem(item.id, element)}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={openSubmenuId === item.id}\n aria-disabled={item.disabled || undefined}\n tabIndex={!item.disabled && item.id === activeId ? 0 : -1}\n className={[\n 'eidos-menu-nested-trigger',\n item.disabled ? 'eidos-menu-nested-trigger--disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={(event) => {\n if (item.disabled) return;\n // ArrowRight is the menu idiom for \"open this submenu\"; Enter and\n // Space do the same. This used to synthesise a click on itself so\n // the event would reach the overlay's trigger wrapper; the state\n // is now right here.\n if (event.key === 'ArrowRight' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setOpenSubmenuId(item.id);\n }\n }}\n >\n {item.icon && renderIcon(item.icon, 'eidos-menu-icon')}\n <span className={`eidos-menu-label`}>{item.label}</span>\n <ChevronRight className={`eidos-menu-nested-arrow`} />\n </div>\n );\n\n return (\n <li key={item.id} role=\"none\" className={`eidos-menu-nested-item`}>\n <Dropdown\n open={openSubmenuId === item.id}\n onOpenChange={(next) => setOpenSubmenuId(next ? item.id : null)}\n trigger={triggerElement}\n content={\n <MenuPanel\n items={item.items}\n onItemClick={onItemClick}\n // Lets `ArrowLeft` in the child close this level. Focus\n // returns to the trigger on its own - `useDialogFocus`\n // restores it when the panel unmounts.\n onRequestClose={() => setOpenSubmenuId(null)}\n />\n }\n placement=\"right\"\n isNested={true}\n fullWidth\n // `disabled` was accepted on a nested item and then ignored, so a\n // disabled submenu opened like any other.\n disabled={item.disabled}\n />\n </li>\n );\n }\n\n default:\n return null;\n }\n };\n\n return (\n <ul ref={listRef} role=\"menu\" className={`eidos-menu ${className}`} onKeyDown={handleKeyDown}>\n {items.map(renderMenuItem)}\n </ul>\n );\n};\n\nexport const Menu: React.FC<MenuWrapperProps> = ({\n trigger,\n items,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n autoWidth = true,\n triggerRef,\n closeOnItemClick = true,\n tooltip,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n\n const handleItemClick = useCallback(\n (_item: MenuItem) => {\n // `item.onClick` has already run, in `MenuPanel`. All that is left is\n // closing.\n //\n // This used to dispatch a synthetic `mousedown` at `document` on a 10ms\n // timer - a counterfeit \"click outside\" - because the overlay owned its\n // open state privately and that was the only lever available. It worked by\n // being indistinguishable from the click a mouse user had just made, and\n // it broke the moment nobody had clicked: activating an item with the\n // keyboard closed every other dropdown on the page that dismisses on\n // outside clicks.\n if (closeOnItemClick) setIsOpen(false);\n },\n [closeOnItemClick],\n );\n\n // The trigger opens a menu, and nothing said so: `Dropdown` adds no ARIA to\n // its trigger (deliberately - it does not know what its content is), so a\n // screen reader announced a plain button. `Menu` does know, and now that it\n // owns the open state it can describe that too (SC 4.1.2), which was the\n // missing half while the state was private.\n const describedTrigger = React.isValidElement(trigger)\n ? React.cloneElement(\n trigger as React.ReactElement<{ 'aria-haspopup'?: string; 'aria-expanded'?: boolean }>,\n { 'aria-haspopup': 'menu', 'aria-expanded': isOpen },\n )\n : trigger;\n\n const dropdown = (\n <Dropdown\n open={isOpen}\n onOpenChange={setIsOpen}\n trigger={describedTrigger}\n content={<MenuPanel items={items} onItemClick={handleItemClick} />}\n minWidth={minWidth}\n maxWidth={maxWidth}\n minHeight={minHeight}\n maxHeight={maxHeight}\n autoWidth={autoWidth}\n triggerRef={triggerRef}\n />\n );\n\n return tooltip ? <Tooltip message={tooltip}>{dropdown}</Tooltip> : dropdown;\n};\n"],"mappings":"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","names":[]}
@@ -1,21 +1,21 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
- var _chunkMCWTQT3Mcjs = require('./chunk-MCWTQT3M.cjs');
3
+ var _chunk6JHVXWDVcjs = require('./chunk-6JHVXWDV.cjs');
4
4
 
5
5
 
6
- var _chunkK7T25Y3Acjs = require('./chunk-K7T25Y3A.cjs');
6
+ var _chunkXZLSHEHEcjs = require('./chunk-XZLSHEHE.cjs');
7
7
 
8
8
 
9
- var _chunkTEVZHN5Icjs = require('./chunk-TEVZHN5I.cjs');
9
+ var _chunk7VJCGKVPcjs = require('./chunk-7VJCGKVP.cjs');
10
10
 
11
11
 
12
- var _chunkP2JM22BFcjs = require('./chunk-P2JM22BF.cjs');
12
+ var _chunkKIZVY57Hcjs = require('./chunk-KIZVY57H.cjs');
13
13
 
14
14
 
15
15
  var _chunk3ETWFS2Ncjs = require('./chunk-3ETWFS2N.cjs');
16
16
 
17
17
 
18
- var _chunkWWYJNWJYcjs = require('./chunk-WWYJNWJY.cjs');
18
+ var _chunkDA375AI6cjs = require('./chunk-DA375AI6.cjs');
19
19
 
20
20
  // src/components/Table/TableFiltersDropdown.component.tsx
21
21
  var _react = require('react'); var _react2 = _interopRequireDefault(_react);
@@ -28,7 +28,7 @@ var TableFiltersDropdown = ({
28
28
  defaultFilters = {},
29
29
  className = ""
30
30
  }) => {
31
- const [dropdownKey, setDropdownKey] = _react.useState.call(void 0, 0);
31
+ const [isOpen, setIsOpen] = _react.useState.call(void 0, false);
32
32
  const [pendingFilters, setPendingFilters] = _react.useState.call(void 0, () => {
33
33
  const initialFilters = Object.keys(filters).length > 0 ? filters : defaultFilters;
34
34
  if (Object.keys(initialFilters).length === 0) {
@@ -138,7 +138,7 @@ var TableFiltersDropdown = ({
138
138
  }
139
139
  });
140
140
  onFiltersChange(cleanedFilters);
141
- setDropdownKey((prev) => prev + 1);
141
+ setIsOpen(false);
142
142
  };
143
143
  const resetFilters = () => {
144
144
  if (Object.keys(filters).length === 0) {
@@ -151,27 +151,30 @@ var TableFiltersDropdown = ({
151
151
  const emptyFilter = { [`__temp_${Date.now()}`]: "" };
152
152
  setPendingFilters(emptyFilter);
153
153
  onFiltersChange({});
154
- setDropdownKey((prev) => prev + 1);
154
+ setIsOpen(false);
155
155
  };
156
156
  const renderFilterInput = (row, column) => {
157
157
  const filterType = column.filterType || "text";
158
158
  switch (filterType) {
159
159
  case "select":
160
160
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
161
- _chunkK7T25Y3Acjs.Select,
161
+ _chunkXZLSHEHEcjs.Select,
162
162
  {
163
163
  value: row.value || "",
164
164
  onChange: (value) => updateFilter(row.id, row.columnKey, value),
165
165
  options: column.filterOptions || [],
166
166
  placeholder: "Select value",
167
167
  clearable: true,
168
- inputProps: { size: "sm" },
168
+ inputProps: {
169
+ size: "sm",
170
+ "aria-label": `Filter value${column.label ? ` for ${column.label}` : ""}`
171
+ },
169
172
  fullWidth: true
170
173
  }
171
174
  );
172
175
  case "boolean":
173
176
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
174
- _chunkK7T25Y3Acjs.Select,
177
+ _chunkXZLSHEHEcjs.Select,
175
178
  {
176
179
  value: row.value === void 0 ? "" : String(row.value),
177
180
  onChange: (value) => updateFilter(row.id, row.columnKey, value === "" ? void 0 : value === "true"),
@@ -182,7 +185,10 @@ var TableFiltersDropdown = ({
182
185
  ],
183
186
  placeholder: "Select value",
184
187
  clearable: false,
185
- inputProps: { size: "sm" },
188
+ inputProps: {
189
+ size: "sm",
190
+ "aria-label": `Filter value${column.label ? ` for ${column.label}` : ""}`
191
+ },
186
192
  fullWidth: true
187
193
  }
188
194
  );
@@ -232,7 +238,7 @@ var TableFiltersDropdown = ({
232
238
  }
233
239
  };
234
240
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
235
- _chunkMCWTQT3Mcjs.DatePicker,
241
+ _chunk6JHVXWDVcjs.DatePicker,
236
242
  {
237
243
  mode: dateMode,
238
244
  value: prepareValue(),
@@ -250,11 +256,12 @@ var TableFiltersDropdown = ({
250
256
  case "text":
251
257
  default:
252
258
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
253
- _chunkTEVZHN5Icjs.Input,
259
+ _chunk7VJCGKVPcjs.Input,
254
260
  {
255
261
  value: row.value || "",
256
262
  onChange: (e) => updateFilter(row.id, row.columnKey, e.target.value),
257
263
  placeholder: "Enter value",
264
+ "aria-label": `Filter value${row.columnKey ? ` for ${row.columnKey}` : ""}`,
258
265
  size: "sm",
259
266
  fullWidth: true
260
267
  }
@@ -263,12 +270,13 @@ var TableFiltersDropdown = ({
263
270
  };
264
271
  const canAddMore = filterRows.length < filterableColumns.length;
265
272
  const triggerButton = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3ETWFS2Ncjs.Badge, { content: activeFilterCount, max: 9, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
266
- _chunkWWYJNWJYcjs.Button,
273
+ _chunkDA375AI6cjs.Button,
267
274
  {
268
275
  variant: "text",
269
276
  size: "sm",
270
277
  icon: _lucidereact.Funnel,
271
278
  "aria-label": hasActiveFilters ? `Filters (${activeFilterCount} active)` : "Filters",
279
+ "aria-expanded": isOpen,
272
280
  className: hasActiveFilters ? "eidos-table-active-filter-button" : ""
273
281
  }
274
282
  ) });
@@ -280,7 +288,7 @@ var TableFiltersDropdown = ({
280
288
  const isTemporaryFilter = row.columnKey.startsWith("__temp_");
281
289
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-table-filter-row", children: [
282
290
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-table-column-select", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
283
- _chunkK7T25Y3Acjs.Select,
291
+ _chunkXZLSHEHEcjs.Select,
284
292
  {
285
293
  value: isTemporaryFilter ? "" : row.columnKey,
286
294
  onChange: (value) => {
@@ -292,22 +300,23 @@ var TableFiltersDropdown = ({
292
300
  options: allColumns,
293
301
  placeholder: "Select column",
294
302
  clearable: false,
295
- inputProps: { size: "sm" },
303
+ inputProps: { size: "sm", "aria-label": "Filter column" },
296
304
  fullWidth: true
297
305
  }
298
306
  ) }),
299
307
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-table-value-input", children: column && !isTemporaryFilter ? renderFilterInput(row, column) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
300
- _chunkTEVZHN5Icjs.Input,
308
+ _chunk7VJCGKVPcjs.Input,
301
309
  {
302
310
  value: "",
303
311
  disabled: true,
304
312
  placeholder: "Select column first",
313
+ "aria-label": "Filter value (choose a column first)",
305
314
  size: "sm",
306
315
  fullWidth: true
307
316
  }
308
317
  ) }),
309
318
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
310
- _chunkWWYJNWJYcjs.Button,
319
+ _chunkDA375AI6cjs.Button,
311
320
  {
312
321
  variant: "text",
313
322
  size: "sm",
@@ -322,7 +331,7 @@ var TableFiltersDropdown = ({
322
331
  }) }),
323
332
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-table-filters-footer", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-table-filters-actions", children: [
324
333
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
325
- _chunkWWYJNWJYcjs.Button,
334
+ _chunkDA375AI6cjs.Button,
326
335
  {
327
336
  variant: "text",
328
337
  size: "sm",
@@ -332,10 +341,10 @@ var TableFiltersDropdown = ({
332
341
  children: "Add Filter"
333
342
  }
334
343
  ),
335
- hasActiveFilters && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWWYJNWJYcjs.Button, { variant: "text", size: "sm", color: "secondary", onClick: clearAllFilters, children: "Clear All" }),
344
+ hasActiveFilters && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDA375AI6cjs.Button, { variant: "text", size: "sm", color: "secondary", onClick: clearAllFilters, children: "Clear All" }),
336
345
  hasChanges && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-table-filters-apply-actions", children: [
337
346
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
338
- _chunkWWYJNWJYcjs.Button,
347
+ _chunkDA375AI6cjs.Button,
339
348
  {
340
349
  variant: "outlined",
341
350
  size: "sm",
@@ -346,7 +355,7 @@ var TableFiltersDropdown = ({
346
355
  }
347
356
  ),
348
357
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
349
- _chunkWWYJNWJYcjs.Button,
358
+ _chunkDA375AI6cjs.Button,
350
359
  {
351
360
  variant: "filled",
352
361
  size: "sm",
@@ -360,8 +369,10 @@ var TableFiltersDropdown = ({
360
369
  ] }) })
361
370
  ] });
362
371
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
363
- _chunkP2JM22BFcjs.Dropdown,
372
+ _chunkKIZVY57Hcjs.Dropdown,
364
373
  {
374
+ open: isOpen,
375
+ onOpenChange: setIsOpen,
365
376
  trigger: triggerButton,
366
377
  content: dropdownContent,
367
378
  placement: "bottom",
@@ -370,8 +381,7 @@ var TableFiltersDropdown = ({
370
381
  maxWidth: "auto",
371
382
  maxHeight: "auto",
372
383
  closeOnClickOutside: true
373
- },
374
- dropdownKey
384
+ }
375
385
  );
376
386
  };
377
387
 
@@ -4433,4 +4443,4 @@ function isAfter(a, b) {
4433
4443
 
4434
4444
 
4435
4445
  exports.CSS = CSS; exports.useSensor = useSensor; exports.useSensors = useSensors; exports.closestCenter = closestCenter; exports.KeyboardSensor = KeyboardSensor; exports.PointerSensor = PointerSensor; exports.DndContext = DndContext; exports.arrayMove = arrayMove; exports.horizontalListSortingStrategy = horizontalListSortingStrategy; exports.verticalListSortingStrategy = verticalListSortingStrategy; exports.SortableContext = SortableContext; exports.useSortable = useSortable; exports.sortableKeyboardCoordinates = sortableKeyboardCoordinates; exports.TableFiltersDropdown = TableFiltersDropdown;
4436
- //# sourceMappingURL=chunk-ZWAFL2B3.cjs.map
4446
+ //# sourceMappingURL=chunk-PMSENLOA.cjs.map