eidos-ui 3.4.0 → 3.5.1

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 (286) hide show
  1. package/dist/{Menu.types-DNIpjSAK.d.ts → Menu.types-BN4g1-3A.d.ts} +9 -0
  2. package/dist/{Menu.types-DwcuCZM7.d.cts → Menu.types-CTnUijv5.d.cts} +9 -0
  3. package/dist/{Select.types-BqaD7bmB.d.ts → Select.types-C2tGy1vj.d.ts} +10 -0
  4. package/dist/{Select.types-2p-mpaBL.d.cts → Select.types-ok-03rLo.d.cts} +10 -0
  5. package/dist/{Table.types-CPj-udMc.d.cts → Table.types-D-9tC0kJ.d.cts} +2 -3
  6. package/dist/{Table.types-CZZ7QWAI.d.ts → Table.types-D8pmgxKA.d.ts} +2 -3
  7. package/dist/{Toolbar.types-RN0klQzu.d.ts → Toolbar.types-CKnQC_TW.d.ts} +1 -1
  8. package/dist/{Toolbar.types-DSk8z2iy.d.cts → Toolbar.types-DUz2mxct.d.cts} +1 -1
  9. package/dist/accordion/index.cjs +2 -2
  10. package/dist/accordion/index.js +1 -1
  11. package/dist/alert/index.cjs +5 -5
  12. package/dist/alert/index.js +4 -4
  13. package/dist/button/index.cjs +4 -4
  14. package/dist/button/index.js +3 -3
  15. package/dist/chip/index.cjs +4 -4
  16. package/dist/chip/index.js +3 -3
  17. package/dist/{chunk-WGCGSM5P.js → chunk-24HKKSKX.js} +11 -18
  18. package/dist/chunk-24HKKSKX.js.map +1 -0
  19. package/dist/{chunk-BBU7QG7L.js → chunk-26SO4LZ5.js} +4 -4
  20. package/dist/{chunk-Y7VSWZWM.js → chunk-2JW3WSBF.js} +4 -4
  21. package/dist/{chunk-IXVM2XNS.js → chunk-2PCCGQOH.js} +89 -19
  22. package/dist/chunk-2PCCGQOH.js.map +1 -0
  23. package/dist/{chunk-4LET2PEX.cjs → chunk-2T7ZMMH5.cjs} +64 -11
  24. package/dist/chunk-2T7ZMMH5.cjs.map +1 -0
  25. package/dist/{chunk-VHSTB7GB.cjs → chunk-35LGEPLP.cjs} +13 -2
  26. package/dist/chunk-35LGEPLP.cjs.map +1 -0
  27. package/dist/{chunk-5E4DYTZ3.cjs → chunk-36JFXFM2.cjs} +36 -36
  28. package/dist/{chunk-5E4DYTZ3.cjs.map → chunk-36JFXFM2.cjs.map} +1 -1
  29. package/dist/{chunk-XMXL6NVJ.cjs → chunk-3KBBJZHK.cjs} +11 -11
  30. package/dist/{chunk-XMXL6NVJ.cjs.map → chunk-3KBBJZHK.cjs.map} +1 -1
  31. package/dist/{chunk-BIANFFJL.cjs → chunk-3RWZC6OW.cjs} +5 -5
  32. package/dist/{chunk-BIANFFJL.cjs.map → chunk-3RWZC6OW.cjs.map} +1 -1
  33. package/dist/{chunk-CBT3TTQR.cjs → chunk-3ZRFOKDM.cjs} +30 -30
  34. package/dist/{chunk-CBT3TTQR.cjs.map → chunk-3ZRFOKDM.cjs.map} +1 -1
  35. package/dist/{chunk-5V7DXZWT.cjs → chunk-4AO5RKV5.cjs} +25 -37
  36. package/dist/chunk-4AO5RKV5.cjs.map +1 -0
  37. package/dist/{chunk-UDRAM6JU.js → chunk-4J25XZDI.js} +13 -11
  38. package/dist/chunk-4J25XZDI.js.map +1 -0
  39. package/dist/{chunk-TWXZKUCG.cjs → chunk-4JSTBA4F.cjs} +9 -7
  40. package/dist/chunk-4JSTBA4F.cjs.map +1 -0
  41. package/dist/{chunk-TYGVKSL6.js → chunk-4LNTZPSQ.js} +2 -2
  42. package/dist/{chunk-UGTKZ7HP.js → chunk-5XH2PHT2.js} +13 -13
  43. package/dist/{chunk-UGTKZ7HP.js.map → chunk-5XH2PHT2.js.map} +1 -1
  44. package/dist/{chunk-H5D3ZFBM.cjs → chunk-66UQTF57.cjs} +46 -46
  45. package/dist/{chunk-H5D3ZFBM.cjs.map → chunk-66UQTF57.cjs.map} +1 -1
  46. package/dist/{chunk-JKBBHAIC.cjs → chunk-6JHVXWDV.cjs} +124 -54
  47. package/dist/chunk-6JHVXWDV.cjs.map +1 -0
  48. package/dist/{chunk-44T4HMFU.js → chunk-75GFIQRU.js} +3 -3
  49. package/dist/{chunk-AHVDTWVM.cjs → chunk-7BFODYNL.cjs} +7 -7
  50. package/dist/{chunk-AHVDTWVM.cjs.map → chunk-7BFODYNL.cjs.map} +1 -1
  51. package/dist/{chunk-NCZUQFKL.cjs → chunk-7VJCGKVP.cjs} +11 -11
  52. package/dist/{chunk-NCZUQFKL.cjs.map → chunk-7VJCGKVP.cjs.map} +1 -1
  53. package/dist/{chunk-PG2EII6U.js → chunk-A3LMUPG3.js} +2 -2
  54. package/dist/{chunk-BO4LTIJI.js → chunk-AR2ZOO6L.js} +3 -3
  55. package/dist/{chunk-MLUHM3VG.cjs → chunk-BEOECPVJ.cjs} +5 -7
  56. package/dist/chunk-BEOECPVJ.cjs.map +1 -0
  57. package/dist/{chunk-FPLX5FIK.js → chunk-BFKPJ627.js} +5 -4
  58. package/dist/chunk-BFKPJ627.js.map +1 -0
  59. package/dist/{chunk-MP7LN5CW.js → chunk-D7SQ7LHJ.js} +2 -2
  60. package/dist/{chunk-OWWPHXAF.cjs → chunk-DA375AI6.cjs} +8 -8
  61. package/dist/{chunk-OWWPHXAF.cjs.map → chunk-DA375AI6.cjs.map} +1 -1
  62. package/dist/{chunk-7KVXXHFX.cjs → chunk-DU5JKTHK.cjs} +8 -6
  63. package/dist/chunk-DU5JKTHK.cjs.map +1 -0
  64. package/dist/{chunk-SDEKANNL.cjs → chunk-EAJGSXEW.cjs} +14 -6
  65. package/dist/chunk-EAJGSXEW.cjs.map +1 -0
  66. package/dist/{chunk-LH5A2SIX.js → chunk-FIVMMCGM.js} +8 -20
  67. package/dist/chunk-FIVMMCGM.js.map +1 -0
  68. package/dist/{chunk-22EKNTWJ.js → chunk-GIEDIAPD.js} +8 -6
  69. package/dist/chunk-GIEDIAPD.js.map +1 -0
  70. package/dist/{chunk-X6UKU3C3.js → chunk-GPVGGBIR.js} +2 -2
  71. package/dist/{chunk-NACA72XI.js → chunk-GWHZFX2H.js} +3 -3
  72. package/dist/{chunk-YIBPOLNN.js → chunk-HEX4IMLO.js} +4 -4
  73. package/dist/{chunk-KWDOOMHR.cjs → chunk-HMEREPDB.cjs} +7 -7
  74. package/dist/{chunk-KWDOOMHR.cjs.map → chunk-HMEREPDB.cjs.map} +1 -1
  75. package/dist/{chunk-TYSNOPMQ.cjs → chunk-HNGFRRVZ.cjs} +3 -3
  76. package/dist/{chunk-TYSNOPMQ.cjs.map → chunk-HNGFRRVZ.cjs.map} +1 -1
  77. package/dist/{chunk-3QQKWXMV.cjs → chunk-I6M6CVI2.cjs} +3 -3
  78. package/dist/{chunk-3QQKWXMV.cjs.map → chunk-I6M6CVI2.cjs.map} +1 -1
  79. package/dist/chunk-J76JHN7J.cjs +225 -0
  80. package/dist/chunk-J76JHN7J.cjs.map +1 -0
  81. package/dist/{chunk-SKLMBE3Z.cjs → chunk-JCKGAAPZ.cjs} +7 -7
  82. package/dist/{chunk-SKLMBE3Z.cjs.map → chunk-JCKGAAPZ.cjs.map} +1 -1
  83. package/dist/{chunk-67EXHO4T.js → chunk-JHX6JK3M.js} +79 -75
  84. package/dist/chunk-JHX6JK3M.js.map +1 -0
  85. package/dist/{chunk-XO7WTE6O.js → chunk-JNY7TUDS.js} +4 -6
  86. package/dist/chunk-JNY7TUDS.js.map +1 -0
  87. package/dist/{chunk-GMDVW76A.cjs → chunk-JPYJQ4TF.cjs} +6 -6
  88. package/dist/{chunk-GMDVW76A.cjs.map → chunk-JPYJQ4TF.cjs.map} +1 -1
  89. package/dist/{chunk-SVCWSW2F.js → chunk-JT4KVXJK.js} +65 -12
  90. package/dist/chunk-JT4KVXJK.js.map +1 -0
  91. package/dist/{chunk-FODRHCRP.cjs → chunk-KBQD4JLK.cjs} +3 -3
  92. package/dist/{chunk-FODRHCRP.cjs.map → chunk-KBQD4JLK.cjs.map} +1 -1
  93. package/dist/{chunk-P7J6WZTO.cjs → chunk-KIZVY57H.cjs} +82 -78
  94. package/dist/chunk-KIZVY57H.cjs.map +1 -0
  95. package/dist/{chunk-N5ZWQJTM.cjs → chunk-KREHT4AQ.cjs} +8 -8
  96. package/dist/{chunk-N5ZWQJTM.cjs.map → chunk-KREHT4AQ.cjs.map} +1 -1
  97. package/dist/{chunk-SCLFJHN2.js → chunk-L65MHFMD.js} +3 -3
  98. package/dist/{chunk-CMOBXLNA.js → chunk-LNDFVC2Q.js} +14 -6
  99. package/dist/chunk-LNDFVC2Q.js.map +1 -0
  100. package/dist/{chunk-N77VOYCK.cjs → chunk-LQXFXXMJ.cjs} +8 -7
  101. package/dist/chunk-LQXFXXMJ.cjs.map +1 -0
  102. package/dist/{chunk-OIXPYXR6.js → chunk-MPIVBAMY.js} +2 -2
  103. package/dist/{chunk-TLECMA3B.js → chunk-MQAOXZD4.js} +27 -14
  104. package/dist/chunk-MQAOXZD4.js.map +1 -0
  105. package/dist/{chunk-YUH56CJI.cjs → chunk-NOQF7UQ5.cjs} +6 -6
  106. package/dist/{chunk-YUH56CJI.cjs.map → chunk-NOQF7UQ5.cjs.map} +1 -1
  107. package/dist/{chunk-DMOZURHV.js → chunk-O3QM3BFE.js} +2 -2
  108. package/dist/{chunk-SFRILDXY.js → chunk-OOCCSMWM.js} +4 -4
  109. package/dist/chunk-P4XZH3OR.js +225 -0
  110. package/dist/chunk-P4XZH3OR.js.map +1 -0
  111. package/dist/{chunk-O46UJUZM.cjs → chunk-PMSENLOA.cjs} +35 -27
  112. package/dist/chunk-PMSENLOA.cjs.map +1 -0
  113. package/dist/{chunk-EWTMX4DK.js → chunk-RHFD2Z5V.js} +7 -7
  114. package/dist/{chunk-WT4WBHBR.js → chunk-RHHZRTWM.js} +13 -2
  115. package/dist/chunk-RHHZRTWM.js.map +1 -0
  116. package/dist/{chunk-NF55JG2V.cjs → chunk-RJVHR45I.cjs} +7 -7
  117. package/dist/{chunk-NF55JG2V.cjs.map → chunk-RJVHR45I.cjs.map} +1 -1
  118. package/dist/{chunk-FDMYDIGI.js → chunk-SDUGYJGW.js} +22 -14
  119. package/dist/chunk-SDUGYJGW.js.map +1 -0
  120. package/dist/{chunk-VRNCXYEP.js → chunk-SFFKQQ5Z.js} +4 -4
  121. package/dist/{chunk-AXPEJ5IG.cjs → chunk-TC5IC6OP.cjs} +3 -3
  122. package/dist/{chunk-AXPEJ5IG.cjs.map → chunk-TC5IC6OP.cjs.map} +1 -1
  123. package/dist/{chunk-BGBAZMFE.js → chunk-THCTUBX6.js} +8 -6
  124. package/dist/chunk-THCTUBX6.js.map +1 -0
  125. package/dist/{chunk-FXMRDNR6.cjs → chunk-TTLFY76J.cjs} +6 -6
  126. package/dist/{chunk-FXMRDNR6.cjs.map → chunk-TTLFY76J.cjs.map} +1 -1
  127. package/dist/{chunk-OZQKWDFH.cjs → chunk-V4BZWBZT.cjs} +7 -7
  128. package/dist/{chunk-OZQKWDFH.cjs.map → chunk-V4BZWBZT.cjs.map} +1 -1
  129. package/dist/{chunk-27UANGPW.cjs → chunk-VQGLVBPL.cjs} +13 -11
  130. package/dist/chunk-VQGLVBPL.cjs.map +1 -0
  131. package/dist/{chunk-LIKSLFX6.js → chunk-WE2SBWZ6.js} +7 -7
  132. package/dist/{chunk-GPK2THIG.js → chunk-WNDDS367.js} +3 -3
  133. package/dist/{chunk-3S33BIN2.cjs → chunk-X3BVQBXD.cjs} +16 -16
  134. package/dist/{chunk-3S33BIN2.cjs.map → chunk-X3BVQBXD.cjs.map} +1 -1
  135. package/dist/{chunk-SKBKTNEQ.cjs → chunk-XERBOFYZ.cjs} +3 -3
  136. package/dist/{chunk-SKBKTNEQ.cjs.map → chunk-XERBOFYZ.cjs.map} +1 -1
  137. package/dist/{chunk-6LCYO2HG.cjs → chunk-XZLSHEHE.cjs} +40 -27
  138. package/dist/chunk-XZLSHEHE.cjs.map +1 -0
  139. package/dist/{chunk-CEC3GO4R.js → chunk-YAKTVIVK.js} +3 -3
  140. package/dist/{chunk-3WV6RTXX.js → chunk-YP4HUBKN.js} +2 -2
  141. package/dist/{chunk-XK5USBHB.js → chunk-YXRKBKFB.js} +3 -3
  142. package/dist/{chunk-MW4YZVP5.cjs → chunk-ZMRINZIO.cjs} +17 -24
  143. package/dist/chunk-ZMRINZIO.cjs.map +1 -0
  144. package/dist/color-picker/index.cjs +4 -4
  145. package/dist/color-picker/index.js +3 -3
  146. package/dist/combobox/index.cjs +6 -6
  147. package/dist/combobox/index.js +5 -5
  148. package/dist/command-palette/index.cjs +3 -3
  149. package/dist/command-palette/index.js +2 -2
  150. package/dist/context-menu/index.cjs +6 -6
  151. package/dist/context-menu/index.d.cts +1 -1
  152. package/dist/context-menu/index.d.ts +1 -1
  153. package/dist/context-menu/index.js +5 -5
  154. package/dist/conversation/index.cjs +8 -8
  155. package/dist/conversation/index.d.cts +1 -1
  156. package/dist/conversation/index.d.ts +1 -1
  157. package/dist/conversation/index.js +7 -7
  158. package/dist/data-grid/index.cjs +15 -15
  159. package/dist/data-grid/index.d.cts +13 -14
  160. package/dist/data-grid/index.d.ts +13 -14
  161. package/dist/data-grid/index.js +14 -14
  162. package/dist/date-picker/index.cjs +8 -8
  163. package/dist/date-picker/index.d.cts +11 -1
  164. package/dist/date-picker/index.d.ts +11 -1
  165. package/dist/date-picker/index.js +7 -7
  166. package/dist/drawer/index.cjs +5 -5
  167. package/dist/drawer/index.js +4 -4
  168. package/dist/dropdown/index.cjs +3 -3
  169. package/dist/dropdown/index.d.cts +34 -0
  170. package/dist/dropdown/index.d.ts +34 -0
  171. package/dist/dropdown/index.js +2 -2
  172. package/dist/header/index.cjs +6 -6
  173. package/dist/header/index.js +5 -5
  174. package/dist/index.cjs +38 -38
  175. package/dist/index.css +19 -2
  176. package/dist/index.d.cts +4 -4
  177. package/dist/index.d.ts +4 -4
  178. package/dist/index.js +37 -37
  179. package/dist/inline-edit/index.cjs +5 -5
  180. package/dist/inline-edit/index.js +4 -4
  181. package/dist/input/index.cjs +4 -4
  182. package/dist/input/index.js +3 -3
  183. package/dist/menu/index.cjs +5 -5
  184. package/dist/menu/index.d.cts +23 -2
  185. package/dist/menu/index.d.ts +23 -2
  186. package/dist/menu/index.js +4 -4
  187. package/dist/modal/index.cjs +5 -5
  188. package/dist/modal/index.js +4 -4
  189. package/dist/navigation/index.cjs +5 -5
  190. package/dist/navigation/index.js +4 -4
  191. package/dist/number-input/index.cjs +3 -3
  192. package/dist/number-input/index.js +2 -2
  193. package/dist/page-layout/index.cjs +12 -12
  194. package/dist/page-layout/index.d.cts +2 -2
  195. package/dist/page-layout/index.d.ts +2 -2
  196. package/dist/page-layout/index.js +11 -11
  197. package/dist/pagination/index.cjs +8 -8
  198. package/dist/pagination/index.js +7 -7
  199. package/dist/popover/index.cjs +3 -3
  200. package/dist/popover/index.d.cts +3 -1
  201. package/dist/popover/index.d.ts +3 -1
  202. package/dist/popover/index.js +2 -2
  203. package/dist/segmented-control/index.cjs +4 -4
  204. package/dist/segmented-control/index.js +3 -3
  205. package/dist/select/index.cjs +6 -6
  206. package/dist/select/index.d.cts +2 -2
  207. package/dist/select/index.d.ts +2 -2
  208. package/dist/select/index.js +5 -5
  209. package/dist/snackbar/index.cjs +5 -5
  210. package/dist/snackbar/index.js +4 -4
  211. package/dist/split-button/index.cjs +6 -6
  212. package/dist/split-button/index.js +5 -5
  213. package/dist/table/index.cjs +13 -13
  214. package/dist/table/index.d.cts +2 -2
  215. package/dist/table/index.d.ts +2 -2
  216. package/dist/table/index.js +12 -12
  217. package/dist/tabs/index.cjs +3 -3
  218. package/dist/tabs/index.js +2 -2
  219. package/dist/tag-input/index.cjs +6 -6
  220. package/dist/tag-input/index.js +5 -5
  221. package/dist/textarea/index.cjs +4 -4
  222. package/dist/textarea/index.js +3 -3
  223. package/dist/theme-editor/index.cjs +11 -11
  224. package/dist/theme-editor/index.js +10 -10
  225. package/dist/theme-provider/index.cjs +3 -3
  226. package/dist/theme-provider/index.js +2 -2
  227. package/dist/toolbar/index.cjs +8 -8
  228. package/dist/toolbar/index.d.cts +3 -3
  229. package/dist/toolbar/index.d.ts +3 -3
  230. package/dist/toolbar/index.js +7 -7
  231. package/dist/tooltip/index.cjs +3 -3
  232. package/dist/tooltip/index.js +2 -2
  233. package/package.json +1 -1
  234. package/dist/chunk-22EKNTWJ.js.map +0 -1
  235. package/dist/chunk-27UANGPW.cjs.map +0 -1
  236. package/dist/chunk-4LET2PEX.cjs.map +0 -1
  237. package/dist/chunk-5V7DXZWT.cjs.map +0 -1
  238. package/dist/chunk-67EXHO4T.js.map +0 -1
  239. package/dist/chunk-6LCYO2HG.cjs.map +0 -1
  240. package/dist/chunk-7KVXXHFX.cjs.map +0 -1
  241. package/dist/chunk-BGBAZMFE.js.map +0 -1
  242. package/dist/chunk-CMOBXLNA.js.map +0 -1
  243. package/dist/chunk-CP335H4Q.js +0 -125
  244. package/dist/chunk-CP335H4Q.js.map +0 -1
  245. package/dist/chunk-FDMYDIGI.js.map +0 -1
  246. package/dist/chunk-FPLX5FIK.js.map +0 -1
  247. package/dist/chunk-G74DHVHV.cjs +0 -125
  248. package/dist/chunk-G74DHVHV.cjs.map +0 -1
  249. package/dist/chunk-IXVM2XNS.js.map +0 -1
  250. package/dist/chunk-JKBBHAIC.cjs.map +0 -1
  251. package/dist/chunk-LH5A2SIX.js.map +0 -1
  252. package/dist/chunk-MLUHM3VG.cjs.map +0 -1
  253. package/dist/chunk-MW4YZVP5.cjs.map +0 -1
  254. package/dist/chunk-N77VOYCK.cjs.map +0 -1
  255. package/dist/chunk-O46UJUZM.cjs.map +0 -1
  256. package/dist/chunk-P7J6WZTO.cjs.map +0 -1
  257. package/dist/chunk-SDEKANNL.cjs.map +0 -1
  258. package/dist/chunk-SVCWSW2F.js.map +0 -1
  259. package/dist/chunk-TLECMA3B.js.map +0 -1
  260. package/dist/chunk-TWXZKUCG.cjs.map +0 -1
  261. package/dist/chunk-UDRAM6JU.js.map +0 -1
  262. package/dist/chunk-VHSTB7GB.cjs.map +0 -1
  263. package/dist/chunk-WGCGSM5P.js.map +0 -1
  264. package/dist/chunk-WT4WBHBR.js.map +0 -1
  265. package/dist/chunk-XO7WTE6O.js.map +0 -1
  266. /package/dist/{chunk-BBU7QG7L.js.map → chunk-26SO4LZ5.js.map} +0 -0
  267. /package/dist/{chunk-Y7VSWZWM.js.map → chunk-2JW3WSBF.js.map} +0 -0
  268. /package/dist/{chunk-TYGVKSL6.js.map → chunk-4LNTZPSQ.js.map} +0 -0
  269. /package/dist/{chunk-44T4HMFU.js.map → chunk-75GFIQRU.js.map} +0 -0
  270. /package/dist/{chunk-PG2EII6U.js.map → chunk-A3LMUPG3.js.map} +0 -0
  271. /package/dist/{chunk-BO4LTIJI.js.map → chunk-AR2ZOO6L.js.map} +0 -0
  272. /package/dist/{chunk-MP7LN5CW.js.map → chunk-D7SQ7LHJ.js.map} +0 -0
  273. /package/dist/{chunk-X6UKU3C3.js.map → chunk-GPVGGBIR.js.map} +0 -0
  274. /package/dist/{chunk-NACA72XI.js.map → chunk-GWHZFX2H.js.map} +0 -0
  275. /package/dist/{chunk-YIBPOLNN.js.map → chunk-HEX4IMLO.js.map} +0 -0
  276. /package/dist/{chunk-SCLFJHN2.js.map → chunk-L65MHFMD.js.map} +0 -0
  277. /package/dist/{chunk-OIXPYXR6.js.map → chunk-MPIVBAMY.js.map} +0 -0
  278. /package/dist/{chunk-DMOZURHV.js.map → chunk-O3QM3BFE.js.map} +0 -0
  279. /package/dist/{chunk-SFRILDXY.js.map → chunk-OOCCSMWM.js.map} +0 -0
  280. /package/dist/{chunk-EWTMX4DK.js.map → chunk-RHFD2Z5V.js.map} +0 -0
  281. /package/dist/{chunk-VRNCXYEP.js.map → chunk-SFFKQQ5Z.js.map} +0 -0
  282. /package/dist/{chunk-LIKSLFX6.js.map → chunk-WE2SBWZ6.js.map} +0 -0
  283. /package/dist/{chunk-GPK2THIG.js.map → chunk-WNDDS367.js.map} +0 -0
  284. /package/dist/{chunk-CEC3GO4R.js.map → chunk-YAKTVIVK.js.map} +0 -0
  285. /package/dist/{chunk-3WV6RTXX.js.map → chunk-YP4HUBKN.js.map} +0 -0
  286. /package/dist/{chunk-XK5USBHB.js.map → chunk-YXRKBKFB.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-LQXFXXMJ.cjs","../src/components/SplitButton/SplitButton.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACVA,8BAAmC;AACnC,2CAA0C;AAsEpC,+CAAA;AA5CC,IAAM,YAAA,EAA0C,CAAC;AAAA,EACtD,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,QAAA,EAAU,KAAA;AAAA,EACV,OAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AAEJ,EAAA,MAAM,UAAA,EAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAA,GAAA,CAAS;AAAA,IAClD,IAAA,EAAM,MAAA;AAAA,IACN,EAAA,EAAI,GAAA,CAAI,EAAA;AAAA,IACR,KAAA,EAAO,GAAA,CAAI,KAAA;AAAA,IACX,IAAA,EAAM,GAAA,CAAI,IAAA;AAAA,IACV,QAAA,EAAU,GAAA,CAAI,QAAA;AAAA,IACd,OAAA,EAAS,GAAA,CAAI;AAAA,EACf,CAAA,CAAE,CAAA;AAEF,EAAA,MAAM,gBAAA,EAAkB,gCAAA,CAAY,EAAA,GAAM;AAExC,IAAA,UAAA,CAAW,CAAA,EAAA,GAAM;AACf,MAAA,QAAA,CAAS,aAAA;AAAA,QACP,IAAI,UAAA,CAAW,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,OAAO,CAAC;AAAA,MAC/E,CAAA;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAAA,EACP,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,EAAA,MAAM,UAAA,EAAY,CAAA,2BAAA,EAA8B,OAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA;AAC9D,EAAA;AAGpC,EAAA;AAAC,IAAA;AAAA,IAAA;AACM,MAAA;AACkB,MAAA;AACb,MAAA;AACC,MAAA;AAGG,MAAA;AAE4C,MAAA;AAAmB,IAAA;AAC/E,EAAA;AAIA,EAAA;AAAC,IAAA;AAAA,IAAA;AACY,MAAA;AACT,QAAA;AAC8B,QAAA;AACF,QAAA;AACD,QAAA;AACN,QAAA;AACrB,QAAA;AAGS,MAAA;AAGX,MAAA;AAAA,wBAAA;AAAC,UAAA;AAAA,UAAA;AACM,YAAA;AACkB,YAAA;AACb,YAAA;AACV,YAAA;AAEC,YAAA;AACuD,cAAA;AAIL,8BAAA;AAAA,YAAA;AAAA,UAAA;AACrD,QAAA;AAGA,wBAAA;AAAC,UAAA;AAAA,UAAA;AACU,YAAA;AAC2D,YAAA;AAC1D,YAAA;AACJ,YAAA;AACI,YAAA;AAAA,UAAA;AACZ,QAAA;AAAA,MAAA;AAAA,IAAA;AACF,EAAA;AAEJ;ADpBuG;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-LQXFXXMJ.cjs","sourcesContent":[null,"import React, { useCallback } from 'react';\nimport { ChevronDown, LoaderCircle } from 'lucide-react';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport { MenuPanel } from '../Menu';\nimport type { MenuItem } from '../Menu';\nimport { renderIcon } from '../../utils';\nimport type { SplitButtonProps } from './SplitButton.types';\n\n/**\n * SplitButton - a two-part control with a primary action button on the left\n * and a chevron that opens a dropdown of secondary actions on the right.\n *\n * The primary button fires `onClick` directly; clicking the chevron opens the\n * dropdown. Visually the two parts share a single bordered unit.\n *\n * @example\n * ```tsx\n * <SplitButton\n * label=\"Save\"\n * onClick={() => save()}\n * options={[\n * { id: 'draft', label: 'Save as draft', onClick: saveDraft },\n * { id: 'template', label: 'Save as template', onClick: saveTemplate },\n * ]}\n * />\n * ```\n */\nexport const SplitButton: React.FC<SplitButtonProps> = ({\n label,\n onClick,\n options,\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n preIcon,\n className = '',\n}) => {\n // Convert SplitButtonOption → MenuItemType so MenuPanel can render them.\n const menuItems: MenuItem[] = options.map((opt) => ({\n type: 'item' as const,\n id: opt.id,\n label: opt.label,\n icon: opt.icon,\n disabled: opt.disabled,\n onClick: opt.onClick,\n }));\n\n const handleItemClick = useCallback(() => {\n // Close the dropdown by dispatching a mousedown outside it.\n setTimeout(() => {\n document.dispatchEvent(\n new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window }),\n );\n }, 10);\n }, []);\n\n const baseClass = `eidos-button eidos-button--${variant} eidos-button--${color} eidos-button--${size}`;\n const disabledOrLoading = disabled || loading;\n\n const chevronTrigger = (\n <button\n type=\"button\"\n className={`${baseClass} eidos-split-button__chevron`}\n disabled={disabledOrLoading}\n aria-label=\"More options\"\n // The chevron opens a `MenuPanel`. `Dropdown` adds no ARIA to its trigger,\n // so without this the control is announced as a plain button.\n aria-haspopup=\"menu\"\n >\n <ChevronDown className=\"eidos-split-button__chevron-icon\" aria-hidden=\"true\" />\n </button>\n );\n\n return (\n <div\n className={[\n 'eidos-split-button',\n `eidos-split-button--${variant}`,\n `eidos-split-button--${color}`,\n `eidos-split-button--${size}`,\n disabledOrLoading && 'eidos-split-button--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {/* Primary action */}\n <button\n type=\"button\"\n className={`${baseClass} eidos-split-button__primary`}\n disabled={disabledOrLoading}\n onClick={onClick}\n >\n {loading ? (\n <LoaderCircle className=\"eidos-split-button__spinner\" aria-hidden=\"true\" />\n ) : (\n preIcon && renderIcon(preIcon, 'eidos-split-button__pre-icon')\n )}\n <span className=\"eidos-split-button__label\">{label}</span>\n </button>\n\n {/* Secondary actions dropdown */}\n <Dropdown\n trigger={chevronTrigger}\n content={<MenuPanel items={menuItems} onItemClick={handleItemClick} />}\n placement=\"bottom\"\n align=\"end\"\n disabled={disabledOrLoading}\n />\n </div>\n );\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Button
3
- } from "./chunk-44T4HMFU.js";
3
+ } from "./chunk-75GFIQRU.js";
4
4
 
5
5
  // src/components/Snackbar/Snackbar.context.tsx
6
6
  import { createContext, useContext, useState, useCallback, useRef } from "react";
@@ -293,4 +293,4 @@ export {
293
293
  SnackbarContainer,
294
294
  useSnackbar
295
295
  };
296
- //# sourceMappingURL=chunk-OIXPYXR6.js.map
296
+ //# sourceMappingURL=chunk-MPIVBAMY.js.map
@@ -1,13 +1,14 @@
1
1
  import {
2
2
  Input
3
- } from "./chunk-CEC3GO4R.js";
3
+ } from "./chunk-YAKTVIVK.js";
4
4
  import {
5
5
  Dropdown
6
- } from "./chunk-67EXHO4T.js";
6
+ } from "./chunk-JHX6JK3M.js";
7
7
  import {
8
+ devWarn,
8
9
  fullWidthModifier,
9
10
  renderIcon
10
- } from "./chunk-WT4WBHBR.js";
11
+ } from "./chunk-RHHZRTWM.js";
11
12
 
12
13
  // src/components/Select/Select.component.tsx
13
14
  import React, { useState, useCallback, useRef, useEffect, useMemo } from "react";
@@ -21,6 +22,7 @@ var Select = React.forwardRef(
21
22
  onChange,
22
23
  className = "",
23
24
  multiple = false,
25
+ label,
24
26
  placeholder = "Select an option...",
25
27
  disabled = false,
26
28
  inputProps = {},
@@ -45,9 +47,8 @@ var Select = React.forwardRef(
45
47
  }
46
48
  return /* @__PURE__ */ new Set();
47
49
  });
48
- const [menuKey, setMenuKey] = useState(0);
49
50
  const [focusedIndex, setFocusedIndex] = useState(-1);
50
- const [isOpen, setIsOpen] = useState(false);
51
+ const [isOpen, setIsOpen] = useState(autoOpen);
51
52
  const inputRef = useRef(null);
52
53
  const triggerRef = useRef(null);
53
54
  const optionRefs = useRef([]);
@@ -95,7 +96,7 @@ var Select = React.forwardRef(
95
96
  }
96
97
  if (!multiple) {
97
98
  setIsOpen(false);
98
- setMenuKey((prev) => prev + 1);
99
+ inputRef.current?.focus();
99
100
  }
100
101
  },
101
102
  [multiple, onChange, selectedValues, isControlled]
@@ -109,13 +110,24 @@ var Select = React.forwardRef(
109
110
  setSelectedValues(/* @__PURE__ */ new Set());
110
111
  }
111
112
  setIsOpen(false);
112
- setMenuKey((prev) => prev + 1);
113
+ inputRef.current?.focus();
113
114
  if (onChange) {
114
115
  onChange(multiple ? [] : "");
115
116
  }
116
117
  },
117
118
  [multiple, onChange, isControlled]
118
119
  );
120
+ useEffect(() => {
121
+ const element = inputRef.current;
122
+ if (!element) return;
123
+ const named = (element.labels?.length ?? 0) > 0 || element.hasAttribute("aria-label") || element.hasAttribute("aria-labelledby");
124
+ if (!named) {
125
+ devWarn(
126
+ "select-missing-label",
127
+ 'Select: no accessible name. Pass `label` for a visible one, or `inputProps={{ "aria-label": "..." }}` where it must stay visually unlabelled - otherwise the field is announced as just "combobox". A placeholder is not a label, and disappears as soon as something is chosen.'
128
+ );
129
+ }
130
+ }, []);
119
131
  const handleKeyDown = useCallback(
120
132
  (e) => {
121
133
  if (disabled) return;
@@ -172,7 +184,6 @@ var Select = React.forwardRef(
172
184
  if (isOpen) {
173
185
  setIsOpen(false);
174
186
  setFocusedIndex(-1);
175
- setMenuKey((prev) => prev + 1);
176
187
  }
177
188
  break;
178
189
  case "Home":
@@ -251,6 +262,7 @@ var Select = React.forwardRef(
251
262
  return /* @__PURE__ */ jsxs(
252
263
  "div",
253
264
  {
265
+ id: `${id || "select"}-option-${index}`,
254
266
  ref: (el) => {
255
267
  optionRefs.current[index] = el;
256
268
  },
@@ -274,7 +286,7 @@ var Select = React.forwardRef(
274
286
  option.id
275
287
  );
276
288
  }) }),
277
- [options, selectedValues, focusedIndex, handleOptionSelect, handleOptionsMount]
289
+ [options, selectedValues, focusedIndex, handleOptionSelect, handleOptionsMount, id]
278
290
  );
279
291
  const triggerElement = /* @__PURE__ */ jsx(
280
292
  "div",
@@ -286,7 +298,7 @@ var Select = React.forwardRef(
286
298
  role: "combobox",
287
299
  "aria-expanded": isOpen,
288
300
  "aria-haspopup": "listbox",
289
- "aria-controls": `${id || "select"}-options`,
301
+ "aria-controls": isOpen ? `${id || "select"}-options` : void 0,
290
302
  "aria-activedescendant": focusedIndex >= 0 ? `${id || "select"}-option-${focusedIndex}` : void 0,
291
303
  children: /* @__PURE__ */ jsx(
292
304
  Input,
@@ -301,6 +313,7 @@ var Select = React.forwardRef(
301
313
  disabled,
302
314
  readOnly: true,
303
315
  isSelect: true,
316
+ label,
304
317
  name,
305
318
  id,
306
319
  required,
@@ -318,7 +331,8 @@ var Select = React.forwardRef(
318
331
  children: /* @__PURE__ */ jsx(
319
332
  Dropdown,
320
333
  {
321
- defaultOpen: autoOpen,
334
+ open: isOpen,
335
+ onOpenChange: setIsOpen,
322
336
  trigger: triggerElement,
323
337
  content: /* @__PURE__ */ jsx("div", { id: `${id || "select"}-options`, role: "listbox", "aria-multiselectable": multiple, children: selectContent }),
324
338
  minWidth,
@@ -329,8 +343,7 @@ var Select = React.forwardRef(
329
343
  fullWidth,
330
344
  triggerRef,
331
345
  ...dropdownProps
332
- },
333
- menuKey
346
+ }
334
347
  )
335
348
  }
336
349
  );
@@ -341,4 +354,4 @@ Select.displayName = "Select";
341
354
  export {
342
355
  Select
343
356
  };
344
- //# sourceMappingURL=chunk-TLECMA3B.js.map
357
+ //# sourceMappingURL=chunk-MQAOXZD4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Select/Select.component.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { X, Check } from 'lucide-react';\nimport { Input } from '../Input/Input.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport type { SelectProps, SelectOption } from './Select.types';\nimport { renderIcon, fullWidthModifier, devWarn } from '../../utils';\n\nexport const Select = React.forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n options = [],\n value,\n defaultValue,\n onChange,\n className = '',\n multiple = false,\n label,\n placeholder = 'Select an option...',\n disabled = false,\n inputProps = {},\n name,\n id,\n required = false,\n fullWidth = false,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight = '300px',\n autoWidth = true,\n clearable = true,\n autoOpen = false,\n dropdownProps = {},\n },\n ref,\n ) => {\n const isControlled = value !== undefined;\n\n // Lazy initializer: seed from defaultValue in uncontrolled mode.\n const [selectedValues, setSelectedValues] = useState<Set<string>>(() => {\n if (defaultValue !== undefined) {\n const vals = Array.isArray(defaultValue) ? defaultValue : [defaultValue];\n return new Set(vals.filter((v) => v !== ''));\n }\n return new Set();\n });\n\n const [focusedIndex, setFocusedIndex] = useState(-1);\n // `Select` owns the open state and hands it to `Dropdown` as a controlled\n // value. It used to keep this flag *and* force the dropdown closed by\n // remounting it through a changing `key`, because `Dropdown`'s own state was\n // private - which meant this flag drove the ARIA attributes while reaching\n // nothing that renders, so the keyboard could not open the listbox at all.\n const [isOpen, setIsOpen] = useState(autoOpen);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const optionRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n // Kept in sync every render so the mount-only callback ref below can\n // read the latest values without needing them in its dependency array\n // (see `handleOptionsMount`).\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const selectedValuesRef = useRef(selectedValues);\n selectedValuesRef.current = selectedValues;\n\n useEffect(() => {\n if (value !== undefined) {\n const values = Array.isArray(value) ? value : [value];\n\n const validValues = values.filter((v) => v !== '');\n setSelectedValues(new Set(validValues));\n }\n }, [value]);\n\n useEffect(() => {\n setFocusedIndex(-1);\n }, [options]);\n\n useEffect(() => {\n optionRefs.current = optionRefs.current.slice(0, options.length);\n }, [options.length]);\n\n const handleOptionSelect = useCallback(\n (option: SelectOption) => {\n if (option.disabled) return;\n\n const newSelectedValues = new Set(selectedValues);\n\n if (multiple) {\n if (newSelectedValues.has(option.value)) {\n newSelectedValues.delete(option.value);\n } else {\n newSelectedValues.add(option.value);\n }\n } else {\n if (newSelectedValues.has(option.value)) {\n newSelectedValues.clear();\n } else {\n newSelectedValues.clear();\n newSelectedValues.add(option.value);\n }\n }\n\n // In uncontrolled mode, own the state directly.\n // In controlled mode, let the parent drive via value prop + useEffect sync.\n if (!isControlled) {\n setSelectedValues(newSelectedValues);\n }\n\n if (onChange) {\n const newValue = multiple\n ? Array.from(newSelectedValues)\n : Array.from(newSelectedValues)[0] || '';\n onChange(newValue);\n }\n\n if (!multiple) {\n setIsOpen(false);\n // Focus is returned explicitly because a click lands on an option\n // `div`, which is not focusable - without this, choosing with the\n // mouse would leave focus on `<body>` and the field would be\n // unreachable by keyboard until tabbed to again.\n inputRef.current?.focus();\n }\n },\n [multiple, onChange, selectedValues, isControlled],\n );\n\n const handleClear = useCallback(\n (e?: React.MouseEvent) => {\n if (e) {\n e.stopPropagation();\n }\n if (!isControlled) {\n setSelectedValues(new Set());\n }\n\n setIsOpen(false);\n inputRef.current?.focus();\n if (onChange) {\n onChange(multiple ? [] : '');\n }\n },\n [multiple, onChange, isControlled],\n );\n\n // A form control with no accessible name is announced as just \"combobox\".\n // `Select` was the only field in the library that could not be labelled\n // without knowing about `inputProps`, and three call sites duly shipped\n // without one - so the gap is closed from both ends: a first-class `label`\n // prop, and this warning.\n //\n // Measured from the DOM rather than from props, because a caller may name\n // the field with an external `<label for>` - `Pagination`'s page-size\n // picker does exactly that, and a props-only check would cry wolf at it.\n // `HTMLInputElement.labels` covers both wrapping and `for` labels.\n useEffect(() => {\n const element = inputRef.current;\n if (!element) return;\n const named =\n (element.labels?.length ?? 0) > 0 ||\n element.hasAttribute('aria-label') ||\n element.hasAttribute('aria-labelledby');\n if (!named) {\n devWarn(\n 'select-missing-label',\n 'Select: no accessible name. Pass `label` for a visible one, or `inputProps={{ \"aria-label\": \"...\" }}` where it must stay visually unlabelled - otherwise the field is announced as just \"combobox\". A placeholder is not a label, and disappears as soon as something is chosen.',\n );\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(0);\n } else {\n setFocusedIndex((prev) => {\n const nextIndex = prev < options.length - 1 ? prev + 1 : 0;\n\n setTimeout(() => {\n optionRefs.current[nextIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }, 0);\n return nextIndex;\n });\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(options.length - 1);\n } else {\n setFocusedIndex((prev) => {\n const nextIndex = prev > 0 ? prev - 1 : options.length - 1;\n\n setTimeout(() => {\n optionRefs.current[nextIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }, 0);\n return nextIndex;\n });\n }\n break;\n\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(0);\n } else if (focusedIndex >= 0 && focusedIndex < options.length) {\n const focusedOption = options[focusedIndex];\n handleOptionSelect(focusedOption);\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n if (isOpen) {\n setIsOpen(false);\n setFocusedIndex(-1);\n }\n break;\n\n case 'Home':\n e.preventDefault();\n if (isOpen) {\n setFocusedIndex(0);\n optionRefs.current[0]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n break;\n\n case 'End':\n e.preventDefault();\n if (isOpen) {\n const lastIndex = options.length - 1;\n setFocusedIndex(lastIndex);\n optionRefs.current[lastIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n break;\n\n default:\n if (isOpen && e.key.length === 1 && /[a-zA-Z0-9]/.test(e.key)) {\n const searchChar = e.key.toLowerCase();\n const foundIndex = options.findIndex(\n (option, index) =>\n index > focusedIndex && option.label.toLowerCase().startsWith(searchChar),\n );\n\n if (foundIndex !== -1) {\n setFocusedIndex(foundIndex);\n optionRefs.current[foundIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n } else {\n const foundFromStart = options.findIndex((option) =>\n option.label.toLowerCase().startsWith(searchChar),\n );\n if (foundFromStart !== -1) {\n setFocusedIndex(foundFromStart);\n optionRefs.current[foundFromStart]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n }\n }\n break;\n }\n },\n [disabled, isOpen, options, focusedIndex, handleOptionSelect],\n );\n\n // Scrolls the first selected option into view. Attached as the options\n // list's own ref below with an empty dependency array, so its identity\n // never changes and React only invokes it on genuine DOM mount/unmount -\n // i.e. exactly when the dropdown opens/closes (Dropdown unmounts its\n // `content` entirely while closed), not on every re-render while open.\n const handleOptionsMount = useCallback((el: HTMLDivElement | null) => {\n if (!el) return;\n const idx = optionsRef.current.findIndex((option) =>\n selectedValuesRef.current.has(option.value),\n );\n if (idx === -1) return;\n optionRefs.current[idx]?.scrollIntoView({ block: 'nearest' });\n }, []);\n\n // Past this many selections the full comma-joined label list becomes\n // unreadable in the trigger, so we switch to a compact \"N selected\" label.\n const COMPACT_LABEL_THRESHOLD = 2;\n\n const displayValue = useMemo(() => {\n if (selectedValues.size === 0) return '';\n\n if (multiple && selectedValues.size > COMPACT_LABEL_THRESHOLD) {\n return `${selectedValues.size} selected`;\n }\n\n const selectedOptions = options.filter((option) => selectedValues.has(option.value));\n const text = selectedOptions.map((option) => option.label).join(', ');\n return text;\n }, [options, selectedValues, multiple]);\n\n const selectContent = useMemo(\n () => (\n <div className={'eidos-select-options'} ref={handleOptionsMount}>\n {options.map((option, index) => {\n const isSelected = selectedValues.has(option.value);\n const isFocused = index === focusedIndex;\n return (\n <div\n key={option.id}\n // The trigger points `aria-activedescendant` at\n // `${id}-option-${focusedIndex}`, and nothing carried that id -\n // so the moment an option was hovered or arrowed to, the\n // attribute referenced an element that did not exist\n // (`aria-valid-attr-value`, critical). Invisible to axe until a\n // story left the listbox open, because the attribute is only\n // set once something is focused.\n id={`${id || 'select'}-option-${index}`}\n ref={(el) => {\n optionRefs.current[index] = el;\n }}\n className={`\n\t\t\t\t\t\t\t\t\t\t${'eidos-select-option'}\n\t\t\t\t\t\t\t\t\t\t${isSelected ? 'eidos-select-option--selected' : ''}\n\t\t\t\t\t\t\t\t\t\t${option.disabled ? 'eidos-select-option--disabled' : ''}\n\t\t\t\t\t\t\t\t\t\t${isFocused ? 'eidos-select-option--focused' : ''}\n\t\t\t\t\t\t\t\t\t`.trim()}\n onClick={() => handleOptionSelect(option)}\n onMouseEnter={() => setFocusedIndex(index)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n >\n {option.icon && renderIcon(option.icon, 'eidos-select-option-icon')}\n <span className={'eidos-select-option-label'}>{option.label}</span>\n {isSelected && <Check className={'eidos-select-option-check-icon'} />}\n </div>\n );\n })}\n </div>\n ),\n [options, selectedValues, focusedIndex, handleOptionSelect, handleOptionsMount, id],\n );\n\n const triggerElement = (\n <div\n ref={triggerRef}\n className={`eidos-select-trigger ${fullWidth ? fullWidthModifier('eidos-select-trigger') : ''}`}\n onKeyDown={handleKeyDown}\n tabIndex={disabled ? -1 : undefined}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n // Only while the listbox exists. An `aria-controls` pointing at an id\n // that is not in the document is invalid, and the listbox only renders\n // while open - `Combobox`, `TagInput` and `CommandPalette` already gate\n // theirs this way. It could not be gated here before, because `isOpen`\n // did not track whether the panel had actually rendered.\n aria-controls={isOpen ? `${id || 'select'}-options` : undefined}\n aria-activedescendant={\n focusedIndex >= 0 ? `${id || 'select'}-option-${focusedIndex}` : undefined\n }\n >\n <Input\n ref={inputRef}\n value={selectedValues.size > 0 ? displayValue : ''}\n placeholder={selectedValues.size === 0 ? placeholder : ''}\n posIcon={selectedValues.size > 0 && clearable ? X : undefined}\n posIconButton={selectedValues.size > 0 && clearable}\n onPosIconClick={selectedValues.size > 0 && clearable ? handleClear : undefined}\n posIconLabel=\"Clear selection\"\n disabled={disabled}\n readOnly={true}\n isSelect={true}\n label={label}\n name={name}\n id={id}\n required={required}\n fullWidth={fullWidth}\n {...inputProps}\n />\n </div>\n );\n\n return (\n <div\n ref={ref}\n className={`${'eidos-select-container'} ${\n fullWidth ? fullWidthModifier('eidos-select-container') : ''\n } ${className}`}\n >\n <Dropdown\n open={isOpen}\n onOpenChange={setIsOpen}\n trigger={triggerElement}\n content={\n <div id={`${id || 'select'}-options`} role=\"listbox\" aria-multiselectable={multiple}>\n {selectContent}\n </div>\n }\n minWidth={minWidth}\n maxWidth={maxWidth}\n minHeight={minHeight}\n maxHeight={maxHeight}\n autoWidth={autoWidth}\n fullWidth={fullWidth}\n triggerRef={triggerRef as React.RefObject<HTMLElement | null>}\n {...dropdownProps}\n />\n </div>\n );\n },\n);\n\nSelect.displayName = 'Select';\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkVHSTB7GBcjs = require('./chunk-VHSTB7GB.cjs');
5
+ var _chunk35LGEPLPcjs = require('./chunk-35LGEPLP.cjs');
6
6
 
7
7
  // src/components/Tabs/Tabs.component.tsx
8
8
  var _react = require('react'); var _react2 = _interopRequireDefault(_react);
@@ -47,7 +47,7 @@ var Tab = ({
47
47
  `eidos-tab--${size}`,
48
48
  isActive && "eidos-tab--active",
49
49
  disabled && "eidos-tab--disabled",
50
- fullWidth && _chunkVHSTB7GBcjs.fullWidthModifier.call(void 0, "eidos-tab"),
50
+ fullWidth && _chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-tab"),
51
51
  className
52
52
  ].filter(Boolean).join(" ");
53
53
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
@@ -64,7 +64,7 @@ var Tab = ({
64
64
  onKeyDown: handleKeyDown,
65
65
  type: "button",
66
66
  children: [
67
- icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-icon", children: _chunkVHSTB7GBcjs.renderIcon.call(void 0, icon, "eidos-tab-icon-svg") }),
67
+ icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-icon", children: _chunk35LGEPLPcjs.renderIcon.call(void 0, icon, "eidos-tab-icon-svg") }),
68
68
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-label", children })
69
69
  ]
70
70
  }
@@ -188,11 +188,11 @@ var Tabs = ({
188
188
  const listClasses = [
189
189
  "eidos-tabs-list",
190
190
  `eidos-tabs-list--${size}`,
191
- fullWidth && _chunkVHSTB7GBcjs.fullWidthModifier.call(void 0, "eidos-tabs-list"),
191
+ fullWidth && _chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-tabs-list"),
192
192
  // With buttons, they are the affordance - a native scrollbar underneath
193
193
  // them is redundant, and on a space-taking one it would also sit over the
194
194
  // `line` variant's rule.
195
- hasScrollButtons && _chunkVHSTB7GBcjs.dualModifier.call(void 0, "eidos-tabs-list", "hide-scrollbar", "hideScrollbar")
195
+ hasScrollButtons && _chunk35LGEPLPcjs.dualModifier.call(void 0, "eidos-tabs-list", "hide-scrollbar", "hideScrollbar")
196
196
  ].filter(Boolean).join(" ");
197
197
  const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;
198
198
  const showNextButton = hasScrollButtons && scrollState.canScrollNext;
@@ -251,4 +251,4 @@ Tabs.displayName = "Tabs";
251
251
 
252
252
 
253
253
  exports.Tab = Tab; exports.TabPanel = TabPanel; exports.Tabs = Tabs;
254
- //# sourceMappingURL=chunk-YUH56CJI.cjs.map
254
+ //# sourceMappingURL=chunk-NOQF7UQ5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-YUH56CJI.cjs","../src/components/Tabs/Tabs.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-YUH56CJI.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":"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","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-CP335H4Q.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-DMOZURHV.js.map
106
+ //# sourceMappingURL=chunk-O3QM3BFE.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  Popover
3
- } from "./chunk-UDRAM6JU.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-44T4HMFU.js";
9
+ } from "./chunk-75GFIQRU.js";
10
10
  import {
11
11
  devWarn,
12
12
  renderIcon
13
- } from "./chunk-WT4WBHBR.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-SFRILDXY.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