eidos-ui 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (509) hide show
  1. package/LICENSE +22 -22
  2. package/README.md +227 -175
  3. package/dist/accordion/index.cjs +2 -2
  4. package/dist/accordion/index.cjs.map +1 -1
  5. package/dist/accordion/index.js +1 -1
  6. package/dist/alert/index.cjs +5 -5
  7. package/dist/alert/index.cjs.map +1 -1
  8. package/dist/alert/index.js +4 -4
  9. package/dist/avatar/index.cjs +2 -2
  10. package/dist/avatar/index.cjs.map +1 -1
  11. package/dist/avatar/index.js +1 -1
  12. package/dist/badge/index.cjs.map +1 -1
  13. package/dist/breadcrumb/index.cjs +2 -2
  14. package/dist/breadcrumb/index.cjs.map +1 -1
  15. package/dist/breadcrumb/index.js +1 -1
  16. package/dist/button/index.cjs +4 -4
  17. package/dist/button/index.cjs.map +1 -1
  18. package/dist/button/index.js +3 -3
  19. package/dist/button-group/index.cjs +2 -2
  20. package/dist/button-group/index.cjs.map +1 -1
  21. package/dist/button-group/index.js +1 -1
  22. package/dist/card/index.cjs +2 -2
  23. package/dist/card/index.cjs.map +1 -1
  24. package/dist/card/index.js +1 -1
  25. package/dist/checkbox/index.cjs +2 -2
  26. package/dist/checkbox/index.cjs.map +1 -1
  27. package/dist/checkbox/index.js +1 -1
  28. package/dist/chip/index.cjs +4 -4
  29. package/dist/chip/index.cjs.map +1 -1
  30. package/dist/chip/index.js +3 -3
  31. package/dist/{chunk-OHUVWPFJ.js → chunk-2BC4M4QZ.js} +1 -1
  32. package/dist/chunk-2BC4M4QZ.js.map +1 -0
  33. package/dist/{chunk-OT3VZLN4.js → chunk-2BXCIWL7.js} +3 -3
  34. package/dist/chunk-2BXCIWL7.js.map +1 -0
  35. package/dist/{chunk-6QFT3BUD.cjs → chunk-2ROKOO22.cjs} +1 -1
  36. package/dist/chunk-2ROKOO22.cjs.map +1 -0
  37. package/dist/{chunk-AOV32YBE.js → chunk-2RXQMQYW.js} +1 -1
  38. package/dist/chunk-2RXQMQYW.js.map +1 -0
  39. package/dist/{chunk-VYV45YOK.cjs → chunk-2U7UJOOB.cjs} +17 -17
  40. package/dist/chunk-2U7UJOOB.cjs.map +1 -0
  41. package/dist/{chunk-UTENJWSE.cjs → chunk-366R4GKR.cjs} +1 -1
  42. package/dist/chunk-366R4GKR.cjs.map +1 -0
  43. package/dist/{chunk-TQCNQKWF.cjs → chunk-3CXULV4G.cjs} +1 -1
  44. package/dist/chunk-3CXULV4G.cjs.map +1 -0
  45. package/dist/{chunk-PEPYVWGY.cjs → chunk-3EPND5M2.cjs} +3 -3
  46. package/dist/chunk-3EPND5M2.cjs.map +1 -0
  47. package/dist/chunk-3ETWFS2N.cjs.map +1 -1
  48. package/dist/{chunk-GL4DHGQE.js → chunk-3HMKE2GJ.js} +5 -5
  49. package/dist/chunk-3HMKE2GJ.js.map +1 -0
  50. package/dist/{chunk-QYHTMEI5.js → chunk-3LBWAUCR.js} +1 -1
  51. package/dist/chunk-3LBWAUCR.js.map +1 -0
  52. package/dist/{chunk-E2B33QB7.js → chunk-3LHQUOGP.js} +4 -4
  53. package/dist/chunk-3LHQUOGP.js.map +1 -0
  54. package/dist/chunk-3RUIKBH4.cjs.map +1 -1
  55. package/dist/{chunk-DK4S3EHG.js → chunk-3TUCQAYL.js} +1 -1
  56. package/dist/chunk-3TUCQAYL.js.map +1 -0
  57. package/dist/{chunk-BBOUUHLO.js → chunk-3VRMTWUS.js} +5 -5
  58. package/dist/chunk-3VRMTWUS.js.map +1 -0
  59. package/dist/{chunk-SXF3TCYA.js → chunk-4BKTBV2I.js} +1 -1
  60. package/dist/chunk-4BKTBV2I.js.map +1 -0
  61. package/dist/{chunk-P74HNSNJ.cjs → chunk-4BQM5F76.cjs} +3 -3
  62. package/dist/chunk-4BQM5F76.cjs.map +1 -0
  63. package/dist/{chunk-Z7S4UQKY.js → chunk-4LM33LDV.js} +2 -2
  64. package/dist/chunk-4LM33LDV.js.map +1 -0
  65. package/dist/{chunk-GRH57M3E.js → chunk-4M3LZLOH.js} +3 -3
  66. package/dist/chunk-4M3LZLOH.js.map +1 -0
  67. package/dist/{chunk-M56IGNH7.cjs → chunk-4UJ7LG4W.cjs} +3 -3
  68. package/dist/chunk-4UJ7LG4W.cjs.map +1 -0
  69. package/dist/{chunk-P6ZBENAG.js → chunk-56B6RLOE.js} +3 -3
  70. package/dist/chunk-56B6RLOE.js.map +1 -0
  71. package/dist/{chunk-XSGUFMT4.js → chunk-5CLC3FJO.js} +1 -1
  72. package/dist/chunk-5CLC3FJO.js.map +1 -0
  73. package/dist/{chunk-VLC2OZV3.cjs → chunk-5O73AALP.cjs} +1 -1
  74. package/dist/chunk-5O73AALP.cjs.map +1 -0
  75. package/dist/{chunk-F54MVGKO.js → chunk-5WROPW7Z.js} +4 -4
  76. package/dist/chunk-5WROPW7Z.js.map +1 -0
  77. package/dist/{chunk-H56YUMFB.cjs → chunk-6A2ZKVST.cjs} +5 -5
  78. package/dist/chunk-6A2ZKVST.cjs.map +1 -0
  79. package/dist/{chunk-CJUZDUXW.cjs → chunk-6RGJAQCU.cjs} +5 -5
  80. package/dist/chunk-6RGJAQCU.cjs.map +1 -0
  81. package/dist/{chunk-P2BTQ33C.cjs → chunk-6U2H26A4.cjs} +4 -4
  82. package/dist/chunk-6U2H26A4.cjs.map +1 -0
  83. package/dist/{chunk-6USUVU6J.js → chunk-6ZAT5CGB.js} +1 -1
  84. package/dist/chunk-6ZAT5CGB.js.map +1 -0
  85. package/dist/{chunk-YKECQKOV.cjs → chunk-7AHZTHXR.cjs} +9 -9
  86. package/dist/chunk-7AHZTHXR.cjs.map +1 -0
  87. package/dist/{chunk-QYK4ECSZ.js → chunk-7HEUWGYW.js} +1 -1
  88. package/dist/chunk-7HEUWGYW.js.map +1 -0
  89. package/dist/{chunk-KF64C4QI.js → chunk-A3NE2C7C.js} +2 -2
  90. package/dist/chunk-A3NE2C7C.js.map +1 -0
  91. package/dist/{chunk-LTOHGCU4.cjs → chunk-A7Z2QAFZ.cjs} +7 -7
  92. package/dist/chunk-A7Z2QAFZ.cjs.map +1 -0
  93. package/dist/{chunk-ICHPPNFV.js → chunk-ALGX5X4N.js} +5 -5
  94. package/dist/chunk-ALGX5X4N.js.map +1 -0
  95. package/dist/{chunk-FNUOTM44.cjs → chunk-AYMD4D4M.cjs} +3 -3
  96. package/dist/chunk-AYMD4D4M.cjs.map +1 -0
  97. package/dist/{chunk-HQ4KZRFH.js → chunk-BOB5JJ7F.js} +3 -3
  98. package/dist/chunk-BOB5JJ7F.js.map +1 -0
  99. package/dist/{chunk-6GAIQ2IY.cjs → chunk-CBLWP43O.cjs} +47 -47
  100. package/dist/chunk-CBLWP43O.cjs.map +1 -0
  101. package/dist/{chunk-BTPCSBGP.js → chunk-CJVC3A4O.js} +2 -2
  102. package/dist/chunk-CJVC3A4O.js.map +1 -0
  103. package/dist/{chunk-ZBGTVTQJ.js → chunk-CMOBXLNA.js} +1 -1
  104. package/dist/chunk-CMOBXLNA.js.map +1 -0
  105. package/dist/{chunk-POX6JZLO.cjs → chunk-DKZTDYH5.cjs} +5 -5
  106. package/dist/chunk-DKZTDYH5.cjs.map +1 -0
  107. package/dist/{chunk-S25WB7KJ.js → chunk-DRXPTACG.js} +1 -1
  108. package/dist/chunk-DRXPTACG.js.map +1 -0
  109. package/dist/chunk-DZUJEN5N.cjs.map +1 -1
  110. package/dist/chunk-EACNRR3C.cjs.map +1 -1
  111. package/dist/{chunk-7IOOFKG3.js → chunk-EF4Y6Q35.js} +1 -1
  112. package/dist/chunk-EF4Y6Q35.js.map +1 -0
  113. package/dist/chunk-EQ6BNPTL.cjs.map +1 -1
  114. package/dist/{chunk-VZ43OLU6.cjs → chunk-EQEV7GPT.cjs} +7 -7
  115. package/dist/chunk-EQEV7GPT.cjs.map +1 -0
  116. package/dist/{chunk-ICJ3SV5I.cjs → chunk-FKXKBJUI.cjs} +1 -1
  117. package/dist/chunk-FKXKBJUI.cjs.map +1 -0
  118. package/dist/{chunk-BFYSYUA6.cjs → chunk-FMPXSF3H.cjs} +11 -11
  119. package/dist/chunk-FMPXSF3H.cjs.map +1 -0
  120. package/dist/chunk-FQZ6F7FQ.cjs.map +1 -1
  121. package/dist/{chunk-KV2FG7AN.cjs → chunk-FRUOA2QU.cjs} +1 -1
  122. package/dist/chunk-FRUOA2QU.cjs.map +1 -0
  123. package/dist/{chunk-CDV2OAS3.cjs → chunk-G5IGADJI.cjs} +7 -7
  124. package/dist/chunk-G5IGADJI.cjs.map +1 -0
  125. package/dist/{chunk-TBMVUI7S.cjs → chunk-GOR642KK.cjs} +1 -1
  126. package/dist/chunk-GOR642KK.cjs.map +1 -0
  127. package/dist/{chunk-XJBMEDQ5.js → chunk-H6CWTMAH.js} +1 -1
  128. package/dist/chunk-H6CWTMAH.js.map +1 -0
  129. package/dist/{chunk-2ZWBN3LK.cjs → chunk-HFZ5FKRG.cjs} +1 -1
  130. package/dist/chunk-HFZ5FKRG.cjs.map +1 -0
  131. package/dist/{chunk-QGZF5MOS.cjs → chunk-HLNKIAE5.cjs} +7 -7
  132. package/dist/chunk-HLNKIAE5.cjs.map +1 -0
  133. package/dist/chunk-I44YNYI6.cjs.map +1 -1
  134. package/dist/chunk-I6UOIS4J.cjs.map +1 -1
  135. package/dist/{chunk-LEZ4HSBD.cjs → chunk-IC2M4N7R.cjs} +34 -34
  136. package/dist/chunk-IC2M4N7R.cjs.map +1 -0
  137. package/dist/{chunk-G2FANEA2.cjs → chunk-IJ4DXG7D.cjs} +1 -1
  138. package/dist/chunk-IJ4DXG7D.cjs.map +1 -0
  139. package/dist/{chunk-SOGUWOSQ.cjs → chunk-IJYYHBZC.cjs} +3 -3
  140. package/dist/chunk-IJYYHBZC.cjs.map +1 -0
  141. package/dist/{chunk-SAFSEXMU.cjs → chunk-ISABZ2VX.cjs} +8 -8
  142. package/dist/chunk-ISABZ2VX.cjs.map +1 -0
  143. package/dist/{chunk-VTAABT55.js → chunk-IV4LM3MB.js} +6 -6
  144. package/dist/chunk-IV4LM3MB.js.map +1 -0
  145. package/dist/{chunk-KO2MKZDW.cjs → chunk-IXZMKIV5.cjs} +1 -1
  146. package/dist/chunk-IXZMKIV5.cjs.map +1 -0
  147. package/dist/{chunk-7KGV6YCG.cjs → chunk-IYWAZEFI.cjs} +1 -1
  148. package/dist/chunk-IYWAZEFI.cjs.map +1 -0
  149. package/dist/{chunk-E3XATJ63.js → chunk-IZBJW37N.js} +6 -6
  150. package/dist/chunk-IZBJW37N.js.map +1 -0
  151. package/dist/{chunk-HO7P6IJO.js → chunk-JC4WLVBG.js} +2 -2
  152. package/dist/chunk-JC4WLVBG.js.map +1 -0
  153. package/dist/{chunk-O6B4KB4D.js → chunk-JMD3P4CY.js} +5 -5
  154. package/dist/chunk-JMD3P4CY.js.map +1 -0
  155. package/dist/{chunk-T56K5IKQ.js → chunk-JV7Z3D3U.js} +2 -2
  156. package/dist/chunk-JV7Z3D3U.js.map +1 -0
  157. package/dist/{chunk-DFADZZ3K.js → chunk-K7IFNKMN.js} +3 -3
  158. package/dist/chunk-K7IFNKMN.js.map +1 -0
  159. package/dist/{chunk-C7F2VFAI.cjs → chunk-KIXFSXIN.cjs} +1 -1
  160. package/dist/chunk-KIXFSXIN.cjs.map +1 -0
  161. package/dist/{chunk-V5JNYS77.cjs → chunk-KV3V2CPH.cjs} +1 -1
  162. package/dist/chunk-KV3V2CPH.cjs.map +1 -0
  163. package/dist/{chunk-5TGBNYZK.cjs → chunk-KVIL4EP4.cjs} +1 -1
  164. package/dist/chunk-KVIL4EP4.cjs.map +1 -0
  165. package/dist/{chunk-PWIA4XQD.js → chunk-LUSLBNSG.js} +1 -1
  166. package/dist/chunk-LUSLBNSG.js.map +1 -0
  167. package/dist/{chunk-73EKJU4G.js → chunk-LYH3EKKQ.js} +1 -1
  168. package/dist/chunk-LYH3EKKQ.js.map +1 -0
  169. package/dist/{chunk-D7PGZ3M3.cjs → chunk-MW2S7PZ7.cjs} +5 -5
  170. package/dist/chunk-MW2S7PZ7.cjs.map +1 -0
  171. package/dist/{chunk-LQ3C3OR2.js → chunk-MZZ4SAFY.js} +1 -1
  172. package/dist/chunk-MZZ4SAFY.js.map +1 -0
  173. package/dist/{chunk-KKOZX64Z.js → chunk-NEQXEVHM.js} +1 -1
  174. package/dist/chunk-NEQXEVHM.js.map +1 -0
  175. package/dist/{chunk-NDLMU6HJ.js → chunk-NFIK3KMT.js} +9 -9
  176. package/dist/chunk-NFIK3KMT.js.map +1 -0
  177. package/dist/{chunk-3YPTYI7R.js → chunk-NQ4L6PYW.js} +1 -1
  178. package/dist/chunk-NQ4L6PYW.js.map +1 -0
  179. package/dist/{chunk-JFA5ABVE.js → chunk-NSITXZBU.js} +1 -1
  180. package/dist/chunk-NSITXZBU.js.map +1 -0
  181. package/dist/{chunk-2YQE26EK.js → chunk-O3I3RBZJ.js} +1 -1
  182. package/dist/chunk-O3I3RBZJ.js.map +1 -0
  183. package/dist/{chunk-O5ZPSZNY.cjs → chunk-OGKD5PLS.cjs} +6 -6
  184. package/dist/chunk-OGKD5PLS.cjs.map +1 -0
  185. package/dist/{chunk-7R7IFWGB.cjs → chunk-OZZHOEN5.cjs} +1 -1
  186. package/dist/chunk-OZZHOEN5.cjs.map +1 -0
  187. package/dist/{chunk-6P4WYB3B.js → chunk-P2GCAVUZ.js} +2 -2
  188. package/dist/chunk-P2GCAVUZ.js.map +1 -0
  189. package/dist/{chunk-L3UPSLJ5.cjs → chunk-PA4IT2XQ.cjs} +19 -19
  190. package/dist/chunk-PA4IT2XQ.cjs.map +1 -0
  191. package/dist/{chunk-N7HX5635.cjs → chunk-PJC7NZUV.cjs} +3 -3
  192. package/dist/chunk-PJC7NZUV.cjs.map +1 -0
  193. package/dist/{chunk-QP2A5ZMK.cjs → chunk-PTBBY4ZX.cjs} +1 -1
  194. package/dist/chunk-PTBBY4ZX.cjs.map +1 -0
  195. package/dist/{chunk-VFYG7GAH.js → chunk-PY2376XI.js} +2 -2
  196. package/dist/chunk-PY2376XI.js.map +1 -0
  197. package/dist/{chunk-R5UNLPQZ.cjs → chunk-Q3GNKF74.cjs} +1 -1
  198. package/dist/chunk-Q3GNKF74.cjs.map +1 -0
  199. package/dist/{chunk-YLKESEHQ.cjs → chunk-QF2RAUPB.cjs} +1 -1
  200. package/dist/chunk-QF2RAUPB.cjs.map +1 -0
  201. package/dist/{chunk-2HTBZGBP.cjs → chunk-QQIALSTX.cjs} +1 -1
  202. package/dist/chunk-QQIALSTX.cjs.map +1 -0
  203. package/dist/{chunk-6HGDQ4BM.js → chunk-S2EICHZK.js} +13 -13
  204. package/dist/chunk-S2EICHZK.js.map +1 -0
  205. package/dist/{chunk-5QG2I3FK.cjs → chunk-S77GR5YQ.cjs} +3 -3
  206. package/dist/chunk-S77GR5YQ.cjs.map +1 -0
  207. package/dist/{chunk-YCUT6NQ4.js → chunk-S7TWEVC3.js} +2 -2
  208. package/dist/chunk-S7TWEVC3.js.map +1 -0
  209. package/dist/{chunk-2JWY36LD.cjs → chunk-SDEKANNL.cjs} +1 -1
  210. package/dist/chunk-SDEKANNL.cjs.map +1 -0
  211. package/dist/{chunk-RSBQNIJZ.js → chunk-SENVA467.js} +1 -1
  212. package/dist/chunk-SENVA467.js.map +1 -0
  213. package/dist/chunk-SJDTFR3I.cjs.map +1 -1
  214. package/dist/chunk-SWPZ3HFY.cjs.map +1 -1
  215. package/dist/{chunk-R36SGSJX.cjs → chunk-TROYIUDH.cjs} +1 -1
  216. package/dist/chunk-TROYIUDH.cjs.map +1 -0
  217. package/dist/{chunk-3KAR5KCS.cjs → chunk-UGMONQGH.cjs} +11 -11
  218. package/dist/chunk-UGMONQGH.cjs.map +1 -0
  219. package/dist/{chunk-CKH36D7H.js → chunk-UTUPJOBY.js} +1 -1
  220. package/dist/chunk-UTUPJOBY.js.map +1 -0
  221. package/dist/{chunk-63N2KZZX.cjs → chunk-V2S6XWIQ.cjs} +1 -1
  222. package/dist/chunk-V2S6XWIQ.cjs.map +1 -0
  223. package/dist/{chunk-G36S5CWN.cjs → chunk-V5RS3JZN.cjs} +1 -1
  224. package/dist/chunk-V5RS3JZN.cjs.map +1 -0
  225. package/dist/chunk-VW32UTUE.cjs.map +1 -1
  226. package/dist/{chunk-4NUZP66U.js → chunk-VZYLJSV5.js} +3 -3
  227. package/dist/chunk-VZYLJSV5.js.map +1 -0
  228. package/dist/{chunk-GOVOQZYN.js → chunk-W2F6WDUX.js} +1 -1
  229. package/dist/chunk-W2F6WDUX.js.map +1 -0
  230. package/dist/{chunk-XMRMCWSQ.js → chunk-W3X3V72Q.js} +3 -3
  231. package/dist/chunk-W3X3V72Q.js.map +1 -0
  232. package/dist/{chunk-AUFCW7QU.cjs → chunk-W6IKHJ76.cjs} +3 -3
  233. package/dist/chunk-W6IKHJ76.cjs.map +1 -0
  234. package/dist/{chunk-A35Y5MRJ.js → chunk-WE5FTQGD.js} +3 -3
  235. package/dist/chunk-WE5FTQGD.js.map +1 -0
  236. package/dist/{chunk-FO5FNTJX.js → chunk-WIE7HDIM.js} +3 -3
  237. package/dist/chunk-WIE7HDIM.js.map +1 -0
  238. package/dist/{chunk-YZOVF7JV.cjs → chunk-WPTMMOA6.cjs} +9 -9
  239. package/dist/chunk-WPTMMOA6.cjs.map +1 -0
  240. package/dist/{chunk-HUNMRKGE.js → chunk-WTXASLBB.js} +2 -2
  241. package/dist/chunk-WTXASLBB.js.map +1 -0
  242. package/dist/chunk-XJAXKENE.cjs.map +1 -1
  243. package/dist/{chunk-TCX3QKF3.js → chunk-XJBWFDDE.js} +1 -1
  244. package/dist/chunk-XJBWFDDE.js.map +1 -0
  245. package/dist/{chunk-IYQX7PBO.cjs → chunk-XKQMEVOD.cjs} +1 -1
  246. package/dist/chunk-XKQMEVOD.cjs.map +1 -0
  247. package/dist/{chunk-KQKJVFYF.js → chunk-YQLCPKGV.js} +1 -1
  248. package/dist/chunk-YQLCPKGV.js.map +1 -0
  249. package/dist/{chunk-GI7WPGP2.cjs → chunk-YRK56AOP.cjs} +5 -5
  250. package/dist/chunk-YRK56AOP.cjs.map +1 -0
  251. package/dist/{chunk-H523JFY2.js → chunk-YV57RSPD.js} +1 -1
  252. package/dist/chunk-YV57RSPD.js.map +1 -0
  253. package/dist/{chunk-JORQYNJD.js → chunk-Z4ZY7L7W.js} +3 -3
  254. package/dist/chunk-Z4ZY7L7W.js.map +1 -0
  255. package/dist/{chunk-R5QPUQSI.cjs → chunk-Z5U4NJTW.cjs} +1 -1
  256. package/dist/chunk-Z5U4NJTW.cjs.map +1 -0
  257. package/dist/{chunk-5D3LIJYW.cjs → chunk-ZBKJ3EMK.cjs} +5 -5
  258. package/dist/chunk-ZBKJ3EMK.cjs.map +1 -0
  259. package/dist/{chunk-K5TKNT6I.cjs → chunk-ZMDZGL5A.cjs} +1 -1
  260. package/dist/chunk-ZMDZGL5A.cjs.map +1 -0
  261. package/dist/{chunk-OVYIBDGE.js → chunk-ZZSPQFMX.js} +1 -1
  262. package/dist/chunk-ZZSPQFMX.js.map +1 -0
  263. package/dist/color-picker/index.cjs +3 -3
  264. package/dist/color-picker/index.cjs.map +1 -1
  265. package/dist/color-picker/index.js +2 -2
  266. package/dist/combobox/index.cjs +6 -6
  267. package/dist/combobox/index.cjs.map +1 -1
  268. package/dist/combobox/index.js +5 -5
  269. package/dist/command-palette/index.cjs +3 -3
  270. package/dist/command-palette/index.cjs.map +1 -1
  271. package/dist/command-palette/index.js +2 -2
  272. package/dist/context-menu/index.cjs +7 -7
  273. package/dist/context-menu/index.cjs.map +1 -1
  274. package/dist/context-menu/index.js +6 -6
  275. package/dist/data-grid/index.cjs +17 -17
  276. package/dist/data-grid/index.cjs.map +1 -1
  277. package/dist/data-grid/index.js +16 -16
  278. package/dist/date-picker/index.cjs +8 -8
  279. package/dist/date-picker/index.cjs.map +1 -1
  280. package/dist/date-picker/index.js +7 -7
  281. package/dist/divider/index.cjs +2 -2
  282. package/dist/divider/index.cjs.map +1 -1
  283. package/dist/divider/index.js +1 -1
  284. package/dist/drawer/index.cjs +5 -5
  285. package/dist/drawer/index.cjs.map +1 -1
  286. package/dist/drawer/index.js +4 -4
  287. package/dist/dropdown/index.cjs +2 -2
  288. package/dist/dropdown/index.cjs.map +1 -1
  289. package/dist/dropdown/index.js +1 -1
  290. package/dist/empty-state/index.cjs +2 -2
  291. package/dist/empty-state/index.cjs.map +1 -1
  292. package/dist/empty-state/index.js +1 -1
  293. package/dist/file-upload/index.cjs +2 -2
  294. package/dist/file-upload/index.cjs.map +1 -1
  295. package/dist/file-upload/index.js +1 -1
  296. package/dist/footer/index.cjs +2 -2
  297. package/dist/footer/index.cjs.map +1 -1
  298. package/dist/footer/index.js +1 -1
  299. package/dist/header/index.cjs +5 -5
  300. package/dist/header/index.cjs.map +1 -1
  301. package/dist/header/index.js +4 -4
  302. package/dist/index.cjs +56 -56
  303. package/dist/index.cjs.map +1 -1
  304. package/dist/index.js +55 -55
  305. package/dist/inline-edit/index.cjs +5 -5
  306. package/dist/inline-edit/index.cjs.map +1 -1
  307. package/dist/inline-edit/index.js +4 -4
  308. package/dist/input/index.cjs +4 -4
  309. package/dist/input/index.cjs.map +1 -1
  310. package/dist/input/index.js +3 -3
  311. package/dist/kbd/index.cjs +2 -2
  312. package/dist/kbd/index.cjs.map +1 -1
  313. package/dist/kbd/index.js +1 -1
  314. package/dist/menu/index.cjs +6 -6
  315. package/dist/menu/index.cjs.map +1 -1
  316. package/dist/menu/index.js +5 -5
  317. package/dist/modal/index.cjs +5 -5
  318. package/dist/modal/index.cjs.map +1 -1
  319. package/dist/modal/index.js +4 -4
  320. package/dist/navigation/index.cjs +6 -6
  321. package/dist/navigation/index.cjs.map +1 -1
  322. package/dist/navigation/index.js +5 -5
  323. package/dist/number-input/index.cjs +2 -2
  324. package/dist/number-input/index.cjs.map +1 -1
  325. package/dist/number-input/index.js +1 -1
  326. package/dist/o-t-p-input/index.cjs +2 -2
  327. package/dist/o-t-p-input/index.cjs.map +1 -1
  328. package/dist/o-t-p-input/index.js +1 -1
  329. package/dist/page-layout/index.cjs +15 -15
  330. package/dist/page-layout/index.cjs.map +1 -1
  331. package/dist/page-layout/index.js +14 -14
  332. package/dist/pagination/index.cjs +8 -8
  333. package/dist/pagination/index.cjs.map +1 -1
  334. package/dist/pagination/index.js +7 -7
  335. package/dist/pill/index.cjs.map +1 -1
  336. package/dist/popover/index.cjs +2 -2
  337. package/dist/popover/index.cjs.map +1 -1
  338. package/dist/popover/index.js +1 -1
  339. package/dist/progress/index.cjs +2 -2
  340. package/dist/progress/index.cjs.map +1 -1
  341. package/dist/progress/index.js +1 -1
  342. package/dist/radio/index.cjs +2 -2
  343. package/dist/radio/index.cjs.map +1 -1
  344. package/dist/radio/index.js +1 -1
  345. package/dist/segmented-control/index.cjs +4 -4
  346. package/dist/segmented-control/index.cjs.map +1 -1
  347. package/dist/segmented-control/index.js +3 -3
  348. package/dist/select/index.cjs +6 -6
  349. package/dist/select/index.cjs.map +1 -1
  350. package/dist/select/index.js +5 -5
  351. package/dist/skeleton/index.cjs +2 -2
  352. package/dist/skeleton/index.cjs.map +1 -1
  353. package/dist/skeleton/index.js +1 -1
  354. package/dist/slider/index.cjs +2 -2
  355. package/dist/slider/index.cjs.map +1 -1
  356. package/dist/slider/index.js +1 -1
  357. package/dist/snackbar/index.cjs +5 -5
  358. package/dist/snackbar/index.cjs.map +1 -1
  359. package/dist/snackbar/index.js +4 -4
  360. package/dist/spinner/index.cjs +2 -2
  361. package/dist/spinner/index.cjs.map +1 -1
  362. package/dist/spinner/index.js +1 -1
  363. package/dist/split-button/index.cjs +7 -7
  364. package/dist/split-button/index.cjs.map +1 -1
  365. package/dist/split-button/index.js +6 -6
  366. package/dist/stepper/index.cjs +2 -2
  367. package/dist/stepper/index.cjs.map +1 -1
  368. package/dist/stepper/index.js +1 -1
  369. package/dist/switch/index.cjs +2 -2
  370. package/dist/switch/index.cjs.map +1 -1
  371. package/dist/switch/index.js +1 -1
  372. package/dist/table/index.cjs +17 -17
  373. package/dist/table/index.cjs.map +1 -1
  374. package/dist/table/index.js +16 -16
  375. package/dist/tabs/index.cjs +3 -3
  376. package/dist/tabs/index.cjs.map +1 -1
  377. package/dist/tabs/index.js +2 -2
  378. package/dist/tag-input/index.cjs +6 -6
  379. package/dist/tag-input/index.cjs.map +1 -1
  380. package/dist/tag-input/index.js +5 -5
  381. package/dist/textarea/index.cjs +4 -4
  382. package/dist/textarea/index.cjs.map +1 -1
  383. package/dist/textarea/index.js +3 -3
  384. package/dist/timeline/index.cjs +2 -2
  385. package/dist/timeline/index.cjs.map +1 -1
  386. package/dist/timeline/index.js +1 -1
  387. package/dist/toolbar/index.cjs +11 -11
  388. package/dist/toolbar/index.cjs.map +1 -1
  389. package/dist/toolbar/index.js +10 -10
  390. package/dist/tooltip/index.cjs +2 -2
  391. package/dist/tooltip/index.cjs.map +1 -1
  392. package/dist/tooltip/index.js +1 -1
  393. package/dist/tree-view/index.cjs +2 -2
  394. package/dist/tree-view/index.cjs.map +1 -1
  395. package/dist/tree-view/index.js +1 -1
  396. package/dist/virtual-list/index.cjs +3 -3
  397. package/dist/virtual-list/index.cjs.map +1 -1
  398. package/dist/virtual-list/index.js +2 -2
  399. package/package.json +114 -110
  400. package/dist/chunk-2HTBZGBP.cjs.map +0 -1
  401. package/dist/chunk-2JWY36LD.cjs.map +0 -1
  402. package/dist/chunk-2YQE26EK.js.map +0 -1
  403. package/dist/chunk-2ZWBN3LK.cjs.map +0 -1
  404. package/dist/chunk-3KAR5KCS.cjs.map +0 -1
  405. package/dist/chunk-3YPTYI7R.js.map +0 -1
  406. package/dist/chunk-4NUZP66U.js.map +0 -1
  407. package/dist/chunk-5D3LIJYW.cjs.map +0 -1
  408. package/dist/chunk-5QG2I3FK.cjs.map +0 -1
  409. package/dist/chunk-5TGBNYZK.cjs.map +0 -1
  410. package/dist/chunk-63N2KZZX.cjs.map +0 -1
  411. package/dist/chunk-6GAIQ2IY.cjs.map +0 -1
  412. package/dist/chunk-6HGDQ4BM.js.map +0 -1
  413. package/dist/chunk-6P4WYB3B.js.map +0 -1
  414. package/dist/chunk-6QFT3BUD.cjs.map +0 -1
  415. package/dist/chunk-6USUVU6J.js.map +0 -1
  416. package/dist/chunk-73EKJU4G.js.map +0 -1
  417. package/dist/chunk-7IOOFKG3.js.map +0 -1
  418. package/dist/chunk-7KGV6YCG.cjs.map +0 -1
  419. package/dist/chunk-7R7IFWGB.cjs.map +0 -1
  420. package/dist/chunk-A35Y5MRJ.js.map +0 -1
  421. package/dist/chunk-AOV32YBE.js.map +0 -1
  422. package/dist/chunk-AUFCW7QU.cjs.map +0 -1
  423. package/dist/chunk-BBOUUHLO.js.map +0 -1
  424. package/dist/chunk-BFYSYUA6.cjs.map +0 -1
  425. package/dist/chunk-BTPCSBGP.js.map +0 -1
  426. package/dist/chunk-C7F2VFAI.cjs.map +0 -1
  427. package/dist/chunk-CDV2OAS3.cjs.map +0 -1
  428. package/dist/chunk-CJUZDUXW.cjs.map +0 -1
  429. package/dist/chunk-CKH36D7H.js.map +0 -1
  430. package/dist/chunk-D7PGZ3M3.cjs.map +0 -1
  431. package/dist/chunk-DFADZZ3K.js.map +0 -1
  432. package/dist/chunk-DK4S3EHG.js.map +0 -1
  433. package/dist/chunk-E2B33QB7.js.map +0 -1
  434. package/dist/chunk-E3XATJ63.js.map +0 -1
  435. package/dist/chunk-F54MVGKO.js.map +0 -1
  436. package/dist/chunk-FNUOTM44.cjs.map +0 -1
  437. package/dist/chunk-FO5FNTJX.js.map +0 -1
  438. package/dist/chunk-G2FANEA2.cjs.map +0 -1
  439. package/dist/chunk-G36S5CWN.cjs.map +0 -1
  440. package/dist/chunk-GI7WPGP2.cjs.map +0 -1
  441. package/dist/chunk-GL4DHGQE.js.map +0 -1
  442. package/dist/chunk-GOVOQZYN.js.map +0 -1
  443. package/dist/chunk-GRH57M3E.js.map +0 -1
  444. package/dist/chunk-H523JFY2.js.map +0 -1
  445. package/dist/chunk-H56YUMFB.cjs.map +0 -1
  446. package/dist/chunk-HO7P6IJO.js.map +0 -1
  447. package/dist/chunk-HQ4KZRFH.js.map +0 -1
  448. package/dist/chunk-HUNMRKGE.js.map +0 -1
  449. package/dist/chunk-ICHPPNFV.js.map +0 -1
  450. package/dist/chunk-ICJ3SV5I.cjs.map +0 -1
  451. package/dist/chunk-IYQX7PBO.cjs.map +0 -1
  452. package/dist/chunk-JFA5ABVE.js.map +0 -1
  453. package/dist/chunk-JORQYNJD.js.map +0 -1
  454. package/dist/chunk-K5TKNT6I.cjs.map +0 -1
  455. package/dist/chunk-KF64C4QI.js.map +0 -1
  456. package/dist/chunk-KKOZX64Z.js.map +0 -1
  457. package/dist/chunk-KO2MKZDW.cjs.map +0 -1
  458. package/dist/chunk-KQKJVFYF.js.map +0 -1
  459. package/dist/chunk-KV2FG7AN.cjs.map +0 -1
  460. package/dist/chunk-L3UPSLJ5.cjs.map +0 -1
  461. package/dist/chunk-LEZ4HSBD.cjs.map +0 -1
  462. package/dist/chunk-LQ3C3OR2.js.map +0 -1
  463. package/dist/chunk-LTOHGCU4.cjs.map +0 -1
  464. package/dist/chunk-M56IGNH7.cjs.map +0 -1
  465. package/dist/chunk-N7HX5635.cjs.map +0 -1
  466. package/dist/chunk-NDLMU6HJ.js.map +0 -1
  467. package/dist/chunk-O5ZPSZNY.cjs.map +0 -1
  468. package/dist/chunk-O6B4KB4D.js.map +0 -1
  469. package/dist/chunk-OHUVWPFJ.js.map +0 -1
  470. package/dist/chunk-OT3VZLN4.js.map +0 -1
  471. package/dist/chunk-OVYIBDGE.js.map +0 -1
  472. package/dist/chunk-P2BTQ33C.cjs.map +0 -1
  473. package/dist/chunk-P6ZBENAG.js.map +0 -1
  474. package/dist/chunk-P74HNSNJ.cjs.map +0 -1
  475. package/dist/chunk-PEPYVWGY.cjs.map +0 -1
  476. package/dist/chunk-POX6JZLO.cjs.map +0 -1
  477. package/dist/chunk-PWIA4XQD.js.map +0 -1
  478. package/dist/chunk-QGZF5MOS.cjs.map +0 -1
  479. package/dist/chunk-QP2A5ZMK.cjs.map +0 -1
  480. package/dist/chunk-QYHTMEI5.js.map +0 -1
  481. package/dist/chunk-QYK4ECSZ.js.map +0 -1
  482. package/dist/chunk-R36SGSJX.cjs.map +0 -1
  483. package/dist/chunk-R5QPUQSI.cjs.map +0 -1
  484. package/dist/chunk-R5UNLPQZ.cjs.map +0 -1
  485. package/dist/chunk-RSBQNIJZ.js.map +0 -1
  486. package/dist/chunk-S25WB7KJ.js.map +0 -1
  487. package/dist/chunk-SAFSEXMU.cjs.map +0 -1
  488. package/dist/chunk-SOGUWOSQ.cjs.map +0 -1
  489. package/dist/chunk-SXF3TCYA.js.map +0 -1
  490. package/dist/chunk-T56K5IKQ.js.map +0 -1
  491. package/dist/chunk-TBMVUI7S.cjs.map +0 -1
  492. package/dist/chunk-TCX3QKF3.js.map +0 -1
  493. package/dist/chunk-TQCNQKWF.cjs.map +0 -1
  494. package/dist/chunk-UTENJWSE.cjs.map +0 -1
  495. package/dist/chunk-V5JNYS77.cjs.map +0 -1
  496. package/dist/chunk-VFYG7GAH.js.map +0 -1
  497. package/dist/chunk-VLC2OZV3.cjs.map +0 -1
  498. package/dist/chunk-VTAABT55.js.map +0 -1
  499. package/dist/chunk-VYV45YOK.cjs.map +0 -1
  500. package/dist/chunk-VZ43OLU6.cjs.map +0 -1
  501. package/dist/chunk-XJBMEDQ5.js.map +0 -1
  502. package/dist/chunk-XMRMCWSQ.js.map +0 -1
  503. package/dist/chunk-XSGUFMT4.js.map +0 -1
  504. package/dist/chunk-YCUT6NQ4.js.map +0 -1
  505. package/dist/chunk-YKECQKOV.cjs.map +0 -1
  506. package/dist/chunk-YLKESEHQ.cjs.map +0 -1
  507. package/dist/chunk-YZOVF7JV.cjs.map +0 -1
  508. package/dist/chunk-Z7S4UQKY.js.map +0 -1
  509. package/dist/chunk-ZBGTVTQJ.js.map +0 -1
package/package.json CHANGED
@@ -1,110 +1,114 @@
1
- {
2
- "name": "eidos-ui",
3
- "version": "1.0.0",
4
- "description": "A modern React component library with TypeScript and SCSS",
5
- "type": "module",
6
- "main": "./dist/index.cjs",
7
- "module": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "types": "./dist/index.d.ts",
12
- "import": "./dist/index.js",
13
- "require": "./dist/index.cjs"
14
- },
15
- "./styles": {
16
- "types": "./dist/index.css.d.ts",
17
- "default": "./dist/index.css"
18
- },
19
- "./*": {
20
- "types": "./dist/*/index.d.ts",
21
- "import": "./dist/*/index.js",
22
- "require": "./dist/*/index.cjs"
23
- }
24
- },
25
- "sideEffects": [
26
- "dist/index.css",
27
- "dist/index.css.d.ts"
28
- ],
29
- "files": [
30
- "dist"
31
- ],
32
- "scripts": {
33
- "dev": "vite --config vite.dev.config.ts",
34
- "build": "tsup && node scripts/build-styles.js",
35
- "storybook": "storybook dev -p 6007",
36
- "build-storybook": "storybook build",
37
- "chromatic": "chromatic --exit-zero-on-changes",
38
- "lint": "eslint --report-unused-disable-directives --max-warnings 0",
39
- "typecheck": "tsc --noEmit",
40
- "prettier:check": "prettier --check .",
41
- "prettier:fix": "prettier --write .",
42
- "prepublishOnly": "npm run build",
43
- "version": "node scripts/promote-changelog.js",
44
- "postversion": "git push --follow-tags",
45
- "init": "npm run dev & npm run storybook",
46
- "release:needed": "node scripts/release-needed.js",
47
- "release:preflight": "node scripts/preflight-release.js && npm run lint && npm run typecheck && npm run build",
48
- "release:patch": "npm run release:preflight && npm version patch && npm publish",
49
- "release:minor": "npm run release:preflight && npm version minor && npm publish",
50
- "release:major": "npm run release:preflight && npm version major && npm publish"
51
- },
52
- "keywords": [
53
- "react",
54
- "components",
55
- "design-system",
56
- "ui",
57
- "typescript",
58
- "scss"
59
- ],
60
- "author": "Pedro Mealha",
61
- "license": "MIT",
62
- "dependencies": {
63
- "lucide-react": "^1.34.0"
64
- },
65
- "peerDependencies": {
66
- "react": "^18.0.0 || ^19.0.0",
67
- "react-dom": "^18.0.0 || ^19.0.0"
68
- },
69
- "devDependencies": {
70
- "@dnd-kit/core": "^6.3.1",
71
- "@dnd-kit/sortable": "^10.0.0",
72
- "@dnd-kit/utilities": "^3.2.2",
73
- "@eslint/js": "^10.0.1",
74
- "@storybook/addon-docs": "^10.6.0",
75
- "@storybook/addon-links": "^10.6.0",
76
- "@storybook/addon-vitest": "^10.6.0",
77
- "@storybook/react-vite": "^10.6.0",
78
- "@tanstack/react-virtual": "^3.14.9",
79
- "@types/node": "^26.3.0",
80
- "@types/react": "^19.2.18",
81
- "@types/react-dom": "^19.2.5",
82
- "@typescript-eslint/eslint-plugin": "^8.68.0",
83
- "@typescript-eslint/parser": "^8.68.0",
84
- "@vitejs/plugin-react": "^6.0.5",
85
- "@vitest/browser-playwright": "^4.1.10",
86
- "@vitest/coverage-v8": "^4.1.10",
87
- "chromatic": "^18.6.0",
88
- "dayjs": "^1.11.21",
89
- "eslint": "^10.9.1",
90
- "eslint-config-prettier": "^10.1.8",
91
- "eslint-plugin-react-hooks": "^7.0.0",
92
- "eslint-plugin-react-refresh": "^0.5.3",
93
- "eslint-plugin-storybook": "^10.6.0",
94
- "globals": "^17.8.0",
95
- "playwright": "^1.62.1",
96
- "prettier": "^3.9.6",
97
- "react": "^19.2.0",
98
- "react-dom": "^19.2.0",
99
- "sass": "^1.102.0",
100
- "storybook": "^10.6.0",
101
- "tsup": "^8.5.1",
102
- "typescript": "^6.0.3",
103
- "vite": "^8.2.0",
104
- "vitest": "^4.1.10"
105
- },
106
- "repository": {
107
- "type": "git",
108
- "url": "git+https://github.com/pmea/eidos-ui.git"
109
- }
110
- }
1
+ {
2
+ "name": "eidos-ui",
3
+ "version": "1.0.2",
4
+ "description": "A modern React component library with TypeScript and SCSS",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./styles": {
16
+ "types": "./dist/index.css.d.ts",
17
+ "default": "./dist/index.css"
18
+ },
19
+ "./*": {
20
+ "types": "./dist/*/index.d.ts",
21
+ "import": "./dist/*/index.js",
22
+ "require": "./dist/*/index.cjs"
23
+ }
24
+ },
25
+ "sideEffects": [
26
+ "dist/index.css",
27
+ "dist/index.css.d.ts"
28
+ ],
29
+ "files": [
30
+ "dist"
31
+ ],
32
+ "scripts": {
33
+ "dev": "vite --config vite.dev.config.ts",
34
+ "build": "tsup && node scripts/build-styles.js",
35
+ "storybook": "storybook dev -p 6007",
36
+ "build-storybook": "storybook build",
37
+ "chromatic": "chromatic --exit-zero-on-changes",
38
+ "lint": "eslint --report-unused-disable-directives --max-warnings 0",
39
+ "typecheck": "tsc --noEmit",
40
+ "prettier:check": "prettier --check .",
41
+ "prettier:fix": "prettier --write .",
42
+ "prepublishOnly": "npm run build",
43
+ "version": "node scripts/promote-changelog.js",
44
+ "postversion": "git push --follow-tags",
45
+ "init": "npm run dev & npm run storybook",
46
+ "release:needed": "node scripts/release-needed.js",
47
+ "release:preflight": "node scripts/preflight-release.js && npm run lint && npm run typecheck && npm run build",
48
+ "release:patch": "npm run release:preflight && npm version patch",
49
+ "release:minor": "npm run release:preflight && npm version minor",
50
+ "release:major": "npm run release:preflight && npm version major"
51
+ },
52
+ "keywords": [
53
+ "react",
54
+ "components",
55
+ "design-system",
56
+ "ui",
57
+ "typescript",
58
+ "scss"
59
+ ],
60
+ "author": "Pedro Mealha",
61
+ "license": "MIT",
62
+ "dependencies": {
63
+ "lucide-react": "^1.34.0"
64
+ },
65
+ "peerDependencies": {
66
+ "react": "^18.0.0 || ^19.0.0",
67
+ "react-dom": "^18.0.0 || ^19.0.0"
68
+ },
69
+ "devDependencies": {
70
+ "@dnd-kit/core": "^6.3.1",
71
+ "@dnd-kit/sortable": "^10.0.0",
72
+ "@dnd-kit/utilities": "^3.2.2",
73
+ "@eslint/js": "^10.0.1",
74
+ "@storybook/addon-docs": "^10.6.0",
75
+ "@storybook/addon-links": "^10.6.0",
76
+ "@storybook/addon-vitest": "^10.6.0",
77
+ "@storybook/react-vite": "^10.6.0",
78
+ "@tanstack/react-virtual": "^3.14.9",
79
+ "@types/node": "^26.3.0",
80
+ "@types/react": "^19.2.18",
81
+ "@types/react-dom": "^19.2.5",
82
+ "@typescript-eslint/eslint-plugin": "^8.68.0",
83
+ "@typescript-eslint/parser": "^8.68.0",
84
+ "@vitejs/plugin-react": "^6.0.5",
85
+ "@vitest/browser-playwright": "^4.1.10",
86
+ "@vitest/coverage-v8": "^4.1.10",
87
+ "chromatic": "^18.6.0",
88
+ "dayjs": "^1.11.21",
89
+ "eslint": "^10.9.1",
90
+ "eslint-config-prettier": "^10.1.8",
91
+ "eslint-plugin-react-hooks": "^7.0.0",
92
+ "eslint-plugin-react-refresh": "^0.5.3",
93
+ "eslint-plugin-storybook": "^10.6.0",
94
+ "globals": "^17.8.0",
95
+ "playwright": "^1.62.1",
96
+ "prettier": "^3.9.6",
97
+ "react": "^19.2.0",
98
+ "react-dom": "^19.2.0",
99
+ "sass": "^1.102.0",
100
+ "storybook": "^10.6.0",
101
+ "tsup": "^8.5.1",
102
+ "typescript": "^6.0.3",
103
+ "vite": "^8.2.0",
104
+ "vitest": "^4.1.10"
105
+ },
106
+ "repository": {
107
+ "type": "git",
108
+ "url": "git+https://github.com/PedroMealha/eidos-ui.git"
109
+ },
110
+ "homepage": "https://github.com/PedroMealha/eidos-ui#readme",
111
+ "bugs": {
112
+ "url": "https://github.com/PedroMealha/eidos-ui/issues"
113
+ }
114
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-2HTBZGBP.cjs","../src/components/Radio/Radio.component.tsx"],"names":[],"mappings":"AAAA;ACAA,8BAAmD;AACnD,2CAA4B;AA6DtB,+CAAA;AAtDC,IAAM,MAAA,EAAQ,+BAAA;AAAA,EACnB,CACE;AAAA,IACE,KAAA;AAAA,IACA,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY,EAAA;AAAA,IACZ,SAAA,EAAW,KAAA;AAAA,IACX,EAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,EACL,CAAA,EACA,GAAA,EAAA,GACG;AACH,IAAA,MAAM,YAAA,EAAc,0BAAA,CAAM;AAC1B,IAAA,MAAM,QAAA,EAAU,GAAA,GAAM,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA;AAKT,IAAA;AACO,IAAA;AAGX,IAAA;AAEoC,IAAA;AAC5C,MAAA;AACe,QAAA;AAClC,MAAA;AACY,sBAAA;AACd,IAAA;AAEuB,IAAA;AACrB,MAAA;AAC6B,MAAA;AACD,MAAA;AAChB,MAAA;AACZ,MAAA;AAGS,IAAA;AAEY,IAAA;AACrB,MAAA;AACa,MAAA;AACD,MAAA;AAGH,IAAA;AAGF,IAAA;AACL,sBAAA;AAAC,QAAA;AAAA,QAAA;AACC,UAAA;AACK,UAAA;AACD,UAAA;AACM,UAAA;AACV,UAAA;AACU,UAAA;AAC0B,UAAA;AAChC,UAAA;AAAA,QAAA;AACN,MAAA;AACiB,sBAAA;AAGD,MAAA;AAClB,IAAA;AAEJ,EAAA;AACF;AAEoB;AAWkC;AACpD,EAAA;AACO,EAAA;AACP,EAAA;AACA,EAAA;AACA,EAAA;AACY,EAAA;AACJ,EAAA;AACD,EAAA;AACI,EAAA;AACX,EAAA;AACY,EAAA;AACR;AAC+B,EAAA;AAC8B,EAAA;AAG7B,EAAA;AAEgB,EAAA;AAC/B,IAAA;AACQ,MAAA;AAC3B,IAAA;AACsB,oBAAA;AACxB,EAAA;AAE2C,EAAA;AAMvC,EAAA;AAAgB,oBAAA;AAEX,MAAA;AAAA,MAAA;AAEC,QAAA;AACc,QAAA;AACmB,QAAA;AAChB,QAAA;AACO,UAAA;AACxB,QAAA;AAC6B,QAAA;AACf,QAAA;AACd,QAAA;AACA,QAAA;AAAA,MAAA;AAVY,MAAA;AAalB,IAAA;AAGO,IAAA;AACU,sBAAA;AACN,sBAAA;AACT,IAAA;AAEJ,EAAA;AAEJ;AAEyB;AD9CsB;AACA;AACA;AACA;AACA","file":"/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-2HTBZGBP.cjs","sourcesContent":[null,"import React, { forwardRef, useId, useState } from 'react';\r\nimport { CircleAlert } from 'lucide-react';\r\nimport type { RadioProps, RadioGroupProps } from './Radio.types';\r\n\r\n// ============================================================================\r\n// Radio\r\n// ============================================================================\r\n\r\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(\r\n (\r\n {\r\n label,\r\n color = 'primary',\r\n size = 'md',\r\n className = '',\r\n disabled = false,\r\n id,\r\n checked,\r\n defaultChecked,\r\n onChange,\r\n ...inputProps\r\n },\r\n ref,\r\n ) => {\r\n const generatedId = useId();\r\n const radioId = id || `radio-${generatedId}`;\r\n\r\n // Track checked state for the visual control:\r\n // - controlled mode: `checked` prop drives the visual\r\n // - uncontrolled mode (standalone Radio): local state mirrors the native input\r\n const isControlled = checked !== undefined;\r\n const [localChecked, setLocalChecked] = useState<boolean>(defaultChecked ?? false);\r\n\r\n // `??` only falls back when `checked` is undefined – `false` is kept as-is\r\n const isChecked = checked ?? localChecked;\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!isControlled) {\r\n setLocalChecked(e.target.checked);\r\n }\r\n onChange?.(e);\r\n };\r\n\r\n const wrapperClasses = [\r\n 'eidos-radio-wrapper',\r\n `eidos-radio-wrapper--${color}`,\r\n `eidos-radio-wrapper--${size}`,\r\n disabled && 'eidos-radio-wrapper--disabled',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const controlClasses = [\r\n 'eidos-radio-control',\r\n isChecked && 'eidos-radio-control--checked',\r\n disabled && 'eidos-radio-control--disabled',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <label className={wrapperClasses}>\r\n <input\r\n ref={ref}\r\n type=\"radio\"\r\n id={radioId}\r\n className=\"eidos-radio-input\"\r\n disabled={disabled}\r\n onChange={handleChange}\r\n {...(isControlled ? { checked } : { defaultChecked })}\r\n {...inputProps}\r\n />\r\n <span className={controlClasses}>\r\n <span className=\"eidos-radio-dot\" />\r\n </span>\r\n {label && <span className=\"eidos-radio-label\">{label}</span>}\r\n </label>\r\n );\r\n },\r\n);\r\n\r\nRadio.displayName = 'Radio';\r\n\r\n// ============================================================================\r\n// RadioGroup\r\n//\r\n// Design note: RadioGroup always passes a controlled `checked` prop to every\r\n// Radio child so that the selection dot stays in sync across the full group.\r\n// For the \"uncontrolled\" case (defaultValue), RadioGroup owns the state\r\n// internally – individual Radios never need to manage it themselves.\r\n// ============================================================================\r\n\r\nexport const RadioGroup: React.FC<RadioGroupProps> = ({\r\n name,\r\n value: valueProp,\r\n defaultValue,\r\n onChange,\r\n options,\r\n direction = 'vertical',\r\n color = 'primary',\r\n size = 'md',\r\n disabled = false,\r\n error,\r\n className = '',\r\n}) => {\r\n const isControlled = valueProp !== undefined;\r\n const [localValue, setLocalValue] = useState<string | undefined>(defaultValue);\r\n\r\n // currentValue is always defined when valueProp is provided (controlled)\r\n const currentValue = isControlled ? valueProp : localValue;\r\n\r\n const handleOptionChange = (optionValue: string) => {\r\n if (!isControlled) {\r\n setLocalValue(optionValue);\r\n }\r\n onChange?.(optionValue);\r\n };\r\n\r\n const groupClasses = ['eidos-radio-group', `eidos-radio-group--${direction}`, className]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <div>\r\n <div className={groupClasses}>\r\n {options.map((option) => (\r\n <Radio\r\n key={option.value}\r\n name={name}\r\n value={option.value}\r\n checked={currentValue === option.value}\r\n onChange={(e) => {\r\n if (e.target.checked) handleOptionChange(option.value);\r\n }}\r\n disabled={disabled || option.disabled}\r\n label={option.label}\r\n color={color}\r\n size={size}\r\n />\r\n ))}\r\n </div>\r\n\r\n {error && (\r\n <div className=\"eidos-radio-error-message\">\r\n <CircleAlert />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nRadioGroup.displayName = 'RadioGroup';\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-2JWY36LD.cjs","../src/components/Accordion/Accordion.component.tsx"],"names":[],"mappings":"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","file":"/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-2JWY36LD.cjs","sourcesContent":[null,"import React, { useState, useRef, useContext, useId, useEffect, useCallback } from 'react';\r\nimport { ChevronDown } from 'lucide-react';\r\nimport type { AccordionProps, AccordionItemProps, AccordionContextValue } from './Accordion.types';\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\n/** Normalise a controlled/default value (string | string[] | undefined) to string[]. */\r\nconst toArray = (v: string | string[] | undefined): string[] =>\r\n v === undefined ? [] : Array.isArray(v) ? v : [v];\r\n\r\n// ============================================================================\r\n// CONTEXT\r\n// ============================================================================\r\n\r\nconst AccordionContext = React.createContext<AccordionContextValue | null>(null);\r\n\r\nconst useAccordion = (): AccordionContextValue => {\r\n const ctx = useContext(AccordionContext);\r\n if (!ctx) throw new Error('AccordionItem must be used inside <Accordion>');\r\n return ctx;\r\n};\r\n\r\n// ============================================================================\r\n// ACCORDION - root container; owns open state; provides context\r\n// ============================================================================\r\n\r\nexport const Accordion: React.FC<AccordionProps> = ({\r\n multiple = false,\r\n value,\r\n defaultValue,\r\n onChange,\r\n variant = 'default',\r\n size = 'md',\r\n color = 'primary',\r\n className = '',\r\n children,\r\n}) => {\r\n const isControlled = value !== undefined;\r\n\r\n const [localOpen, setLocalOpen] = useState<string[]>(() => toArray(defaultValue));\r\n const openValues = isControlled ? toArray(value) : localOpen;\r\n\r\n const toggle = useCallback(\r\n (itemValue: string) => {\r\n const isOpen = openValues.includes(itemValue);\r\n let next: string[];\r\n\r\n if (multiple) {\r\n next = isOpen ? openValues.filter((v) => v !== itemValue) : [...openValues, itemValue];\r\n } else {\r\n next = isOpen ? [] : [itemValue];\r\n }\r\n\r\n if (!isControlled) setLocalOpen(next);\r\n onChange?.(multiple ? next : (next[0] ?? ''));\r\n },\r\n [openValues, multiple, isControlled, onChange],\r\n );\r\n\r\n const rootClasses = ['eidos-accordion', `eidos-accordion--${variant}`, className]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <AccordionContext.Provider value={{ openValues, toggle, variant, size, color }}>\r\n <div className={rootClasses}>{children}</div>\r\n </AccordionContext.Provider>\r\n );\r\n};\r\n\r\nAccordion.displayName = 'Accordion';\r\n\r\n// ============================================================================\r\n// ACCORDION ITEM - individual item; reads context; renders trigger + animated panel\r\n// ============================================================================\r\n\r\nexport const AccordionItem: React.FC<AccordionItemProps> = ({\r\n value,\r\n label,\r\n icon,\r\n disabled = false,\r\n className = '',\r\n children,\r\n}) => {\r\n const { openValues, toggle, size, color } = useAccordion();\r\n const isOpen = openValues.includes(value);\r\n const contentRef = useRef<HTMLDivElement>(null);\r\n const triggerId = useId();\r\n const panelId = useId();\r\n\r\n // Drives the max-height CSS transition.\r\n // On open: set to scrollHeight so the wrapper animates to its natural height.\r\n // On close: set to 0 so the wrapper animates shut.\r\n // The CSS transition on .eidos-accordion-content-wrapper handles the animation.\r\n const [maxHeight, setMaxHeight] = useState<number>(0);\r\n\r\n useEffect(() => {\r\n if (!contentRef.current) return;\r\n setMaxHeight(isOpen ? contentRef.current.scrollHeight : 0);\r\n }, [isOpen]);\r\n\r\n const itemClasses = [\r\n 'eidos-accordion-item',\r\n isOpen && 'eidos-accordion-item--open',\r\n disabled && 'eidos-accordion-item--disabled',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const triggerClasses = [\r\n 'eidos-accordion-trigger',\r\n `eidos-accordion-trigger--${size}`,\r\n isOpen && 'eidos-accordion-trigger--open',\r\n isOpen && `eidos-accordion-trigger--${color}`,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <div className={itemClasses}>\r\n <button\r\n id={triggerId}\r\n type=\"button\"\r\n aria-expanded={isOpen}\r\n aria-controls={panelId}\r\n disabled={disabled}\r\n onClick={() => !disabled && toggle(value)}\r\n className={triggerClasses}\r\n >\r\n {icon && <span className=\"eidos-accordion-trigger-icon\">{icon}</span>}\r\n <span className=\"eidos-accordion-trigger-label\">{label}</span>\r\n <ChevronDown className=\"eidos-accordion-chevron\" aria-hidden=\"true\" />\r\n </button>\r\n\r\n <div\r\n id={panelId}\r\n role=\"region\"\r\n aria-labelledby={triggerId}\r\n ref={contentRef}\r\n className=\"eidos-accordion-content-wrapper\"\r\n style={{ maxHeight: `${maxHeight}px` }}\r\n >\r\n <div className=\"eidos-accordion-content\">{children}</div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nAccordionItem.displayName = 'AccordionItem';\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Skeleton/Skeleton.component.tsx"],"sourcesContent":["import React from 'react';\r\nimport type { SkeletonProps } from './Skeleton.types';\r\nimport './Skeleton.scss';\r\n\r\n// ============================================================================\r\n// Helpers\r\n// ============================================================================\r\n\r\nfunction toCssSize(value: number | string): string {\r\n return typeof value === 'number' ? `${value}px` : value;\r\n}\r\n\r\n// ============================================================================\r\n// Component\r\n// ============================================================================\r\n\r\nexport const Skeleton: React.FC<SkeletonProps> = ({\r\n variant = 'text',\r\n width,\r\n height,\r\n lines = 1,\r\n animation = 'wave',\r\n className,\r\n}) => {\r\n const widthStyle = width !== undefined ? toCssSize(width) : undefined;\r\n const heightStyle = height !== undefined ? toCssSize(height) : undefined;\r\n\r\n // Multi-line text variant\r\n if (variant === 'text' && lines > 1) {\r\n return (\r\n <div\r\n className={['eidos-skeleton-text-group', className].filter(Boolean).join(' ')}\r\n aria-hidden=\"true\"\r\n >\r\n {Array.from({ length: lines }, (_, i) => (\r\n <span\r\n key={i}\r\n className={`eidos-skeleton eidos-skeleton--text eidos-skeleton--${animation}`}\r\n style={{\r\n width: i === lines - 1 ? '60%' : (widthStyle ?? '100%'),\r\n height: heightStyle,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n // Single element\r\n return (\r\n <span\r\n className={[\r\n 'eidos-skeleton',\r\n `eidos-skeleton--${variant}`,\r\n `eidos-skeleton--${animation}`,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n style={{ width: widthStyle, height: heightStyle }}\r\n aria-hidden=\"true\"\r\n />\r\n );\r\n};\r\n"],"mappings":";AAmCU;AA3BV,SAAS,UAAU,OAAgC;AACjD,SAAO,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AACpD;AAMO,IAAM,WAAoC,CAAC;AAAA,EAChD,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ;AACF,MAAM;AACJ,QAAM,aAAa,UAAU,SAAY,UAAU,KAAK,IAAI;AAC5D,QAAM,cAAc,WAAW,SAAY,UAAU,MAAM,IAAI;AAG/D,MAAI,YAAY,UAAU,QAAQ,GAAG;AACnC,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,CAAC,6BAA6B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC5E,eAAY;AAAA,QAEX,gBAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MACjC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,uDAAuD,SAAS;AAAA,YAC3E,OAAO;AAAA,cACL,OAAO,MAAM,QAAQ,IAAI,QAAS,cAAc;AAAA,cAChD,QAAQ;AAAA,YACV;AAAA;AAAA,UALK;AAAA,QAMP,CACD;AAAA;AAAA,IACH;AAAA,EAEJ;AAGA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,mBAAmB,OAAO;AAAA,QAC1B,mBAAmB,SAAS;AAAA,QAC5B;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,OAAO,EAAE,OAAO,YAAY,QAAQ,YAAY;AAAA,MAChD,eAAY;AAAA;AAAA,EACd;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-2ZWBN3LK.cjs","../src/components/Stepper/Stepper.component.tsx"],"names":[],"mappings":"AAAA;ACCA,2CAAyB;AA6CjB,+CAAA;AA1CD,IAAM,QAAA,EAAkC,CAAC;AAAA,EAC9C,KAAA;AAAA,EACA,WAAA,EAAa,CAAA;AAAA,EACb,YAAA,EAAc,YAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,YAAA,EAAc,IAAA;AAAA,EACd,YAAA,EAAc,KAAA;AAAA,EACd,UAAA,EAAY,KAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,UAAA,EAAY,CAAC,KAAA,EAAe,cAAA,EAAA,GAA4C;AAC5E,IAAA,GAAA,CAAI,cAAA,EAAgB,OAAO,cAAA;AAC3B,IAAA,GAAA,CAAI,MAAA,EAAQ,UAAA,EAAY,OAAO,WAAA;AAC/B,IAAA,GAAA,CAAI,MAAA,IAAU,UAAA,EAAY,OAAO,QAAA;AACjC,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAOA,EAAA,MAAM,qBAAA,EAAuB,KAAA,CAAM,OAAA,EAAS,EAAA,GAAK,SAAA,CAAU,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,EAAA,IAAM,WAAA;AAEnF,EAAA,uBACE,8BAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,eAAA,EAAiB,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAA;AAG/C,MAAA;AAYV,MAAA;AACC,QAAA;AAAC,UAAA;AAAA,UAAA;AACY,YAAA;AACT,cAAA;AACA,cAAA;AACwB,cAAA;AAGf,YAAA;AACC,YAAA;AAAA,UAAA;AACd,QAAA;AAE0B,QAAA;AACiB,UAAA;AAKG,UAAA;AAMO,UAAA;AAItC,UAAA;AASb,UAAA;AAAC,YAAA;AAAA,YAAA;AAEY,cAAA;AACT,gBAAA;AAC6B,gBAAA;AACD,gBAAA;AACjB,gBAAA;AAGF,cAAA;AACkC,cAAA;AAG7C,cAAA;AAAe,gCAAA;AACE,kCAAA;AAIb,kBAAA;AAAC,oBAAA;AAAA,oBAAA;AACY,sBAAA;AACT,wBAAA;AACkB,wBAAA;AAGT,sBAAA;AACC,sBAAA;AAAA,oBAAA;AACd,kBAAA;AAEJ,gBAAA;AAGe,gCAAA;AACG,kCAAA;AAEb,kBAAA;AAEL,gBAAA;AAAA,cAAA;AAAA,YAAA;AAnCK,YAAA;AAoCP,UAAA;AAEH,QAAA;AAEC,QAAA;AAAC,UAAA;AAAA,UAAA;AACW,YAAA;AACE,YAAA;AAAA,UAAA;AACd,QAAA;AAAA,MAAA;AAAA,IAAA;AAEJ,EAAA;AAEJ;AAEsB;AD7C2C;AACA;AACA;AACA","file":"/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-2ZWBN3LK.cjs","sourcesContent":[null,"import React from 'react';\r\nimport { Check, X } from 'lucide-react';\r\nimport type { StepperProps, StepStatus } from './Stepper.types';\r\n\r\nexport const Stepper: React.FC<StepperProps> = ({\r\n steps,\r\n activeStep = 0,\r\n orientation = 'horizontal',\r\n color = 'primary',\r\n showNumbers = true,\r\n extendStart = false,\r\n extendEnd = false,\r\n className = '',\r\n}) => {\r\n const getStatus = (index: number, explicitStatus?: StepStatus): StepStatus => {\r\n if (explicitStatus) return explicitStatus;\r\n if (index < activeStep) return 'completed';\r\n if (index === activeStep) return 'active';\r\n return 'pending';\r\n };\r\n\r\n // `extendStart`'s connector has no real preceding step to take its color\r\n // from, so it mirrors the first step's own status instead - colored only\r\n // once that step is actually completed. `extendEnd`'s connector *does*\r\n // have a real preceding step (the last one) and colors via the adjacent-\r\n // sibling rule in Stepper.scss, same as a between-step connector.\r\n const isFirstStepCompleted = steps.length > 0 && getStatus(0, steps[0].status) === 'completed';\r\n\r\n return (\r\n <div\r\n className={['eidos-stepper', `eidos-stepper--${orientation}`, className]\r\n .filter(Boolean)\r\n .join(' ')}\r\n aria-label=\"Progress steps\"\r\n >\r\n {/*\r\n `extendStart`/`extendEnd` render as standalone connectors, siblings\r\n of the steps rather than nested inside one - nesting one inside (say)\r\n the first step's own dot-row would make it share that step's fixed\r\n flex slot with its regular trailing connector, silently shrinking\r\n the real Account-Profile gap to make room. As an extra sibling, it\r\n gets its own independent share of the row instead, so every existing\r\n gap shrinks by the same small, uniform amount rather than one\r\n specific connector taking the whole hit.\r\n */}\r\n {extendStart && (\r\n <div\r\n className={[\r\n 'eidos-stepper-connector',\r\n 'eidos-stepper-connector--extend',\r\n isFirstStepCompleted && `eidos-stepper-connector--${color}`,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n {steps.map((step, index) => {\r\n const status = getStatus(index, step.status);\r\n // The last step only skips its own trailing connector when there's\r\n // truly nothing after it - if `extendEnd` adds a connector past it,\r\n // it needs one too, exactly like every other step, so there's no\r\n // blank gap between its dot and the extend connector.\r\n const isLast = index === steps.length - 1 && !extendEnd;\r\n // That trailing connector and the standalone extend connector right\r\n // after it both carry the usual margin meant for the gap before a\r\n // *dot* - stacked together with no dot between them, that reads as\r\n // an unwanted extra gap. Only the extend connector's own side of\r\n // that junction is zeroed in Stepper.scss; this is the other side.\r\n const joinsExtendEnd = index === steps.length - 1 && extendEnd;\r\n\r\n const dotContent = step.icon ? (\r\n step.icon\r\n ) : status === 'completed' ? (\r\n <Check aria-hidden=\"true\" />\r\n ) : status === 'error' ? (\r\n <X aria-hidden=\"true\" />\r\n ) : showNumbers ? (\r\n <span>{index + 1}</span>\r\n ) : null;\r\n\r\n return (\r\n <div\r\n key={index}\r\n className={[\r\n 'eidos-stepper-step',\r\n `eidos-stepper-step--${status}`,\r\n `eidos-stepper-step--${color}`,\r\n !isLast && 'eidos-stepper-step--has-connector',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n aria-current={status === 'active' ? 'step' : undefined}\r\n >\r\n {/* Dot + connector wrapper */}\r\n <div className=\"eidos-stepper-dot-row\">\r\n <div className=\"eidos-stepper-dot\" aria-hidden=\"true\">\r\n {dotContent}\r\n </div>\r\n {!isLast && (\r\n <div\r\n className={[\r\n 'eidos-stepper-connector',\r\n joinsExtendEnd && 'eidos-stepper-connector--joins-extend',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Labels */}\r\n <div className=\"eidos-stepper-label-group\">\r\n <span className=\"eidos-stepper-label\">{step.label}</span>\r\n {step.description && (\r\n <span className=\"eidos-stepper-description\">{step.description}</span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n {extendEnd && (\r\n <div\r\n className=\"eidos-stepper-connector eidos-stepper-connector--extend\"\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nStepper.displayName = 'Stepper';\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-3KAR5KCS.cjs","../src/components/Toolbar/Toolbar.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACIsB,+CAAA;AAXf,IAAM,QAAA,EAAkC,CAAC;AAAA,EAC9C,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,QAAA,EAAU,CAAC,eAAA,EAAiB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAErE,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,OAAA,EACb,QAAA,EAAA;AAAA,IAAA,YAAA,mBAAe,6BAAA,4BAAC,EAAA,EAAY,GAAG,YAAA,CAAa,CAAA;AAAA,oBAC7C,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,gBAAA,GAAmB,eAAA,CAAgB,OAAA,EAAS,EAAA,mBAC3C,6BAAA,gCAAC,EAAA,EAAe,OAAA,EAAO,IAAA,EAAC,YAAA,EAAa,QAAA,EAAS,KAAA,EAAO,gBAAA,CAAiB,CAAA;AAAA,MAEvE,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAS,EAAA,mBAC3B,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,EAAA,mBACpB,6BAAA,4BAAC,EAAA,EAAuB,OAAA,EAAQ,MAAA,EAAO,IAAA,EAAK,IAAA,EAAM,GAAG,OAAA,CAAA,EAApC,KAA4C,CAC9D,EAAA,CACH,CAAA;AAAA,sBAEF,6BAAA;AAAA,QAAC,sBAAA;AAAA,QAAA;AAAA,UACC,OAAA,kBAAS,6BAAA,wBAAC,EAAA,EAAO,IAAA,EAAK,UAAA,EAAW,IAAA,EAAK,IAAA,EAAK,KAAA,EAAM,UAAA,CAAU,CAAA;AAAA,UAC3D,KAAA,EAAO,QAAA;AAAA,UACP,QAAA,EAAU;AAAA,QAAA;AAAA,MACZ;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF,CAAA;AAEJ,CAAA;ADEA;AACA;AACE;AACF,0BAAC","file":"/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-3KAR5KCS.cjs","sourcesContent":[null,"import React from 'react';\r\nimport type { ToolbarProps } from './Toolbar.types';\r\nimport './Toolbar.scss';\r\nimport { IconButton } from '../Button';\r\nimport { Breadcrumb } from '../Breadcrumb';\r\nimport { Avatar } from '../Avatar';\r\nimport { Menu } from '../Menu';\r\nimport { CommandPalette } from '../CommandPalette';\r\n\r\nexport const Toolbar: React.FC<ToolbarProps> = ({\r\n breadcrumbs,\r\n actions,\r\n userMenu,\r\n cmdPaletteItems,\r\n className = '',\r\n}) => {\r\n const classes = ['eidos-toolbar', className].filter(Boolean).join(' ');\r\n\r\n return (\r\n <div className={classes}>\r\n {breadcrumbs && <Breadcrumb {...breadcrumbs} />}\r\n <div className=\"eidos-toolbar__content\">\r\n {cmdPaletteItems && cmdPaletteItems.length > 0 && (\r\n <CommandPalette trigger triggerLabel=\"Search\" items={cmdPaletteItems} />\r\n )}\r\n {actions && actions.length > 0 && (\r\n <div className=\"eidos-toolbar__actions\">\r\n {actions.map((action, index) => (\r\n <IconButton key={index} variant=\"text\" size=\"sm\" {...action} />\r\n ))}\r\n </div>\r\n )}\r\n <Menu\r\n trigger={<Avatar name=\"John Doe\" size=\"sm\" color=\"primary\" />}\r\n items={userMenu}\r\n minWidth={220}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/FileUpload/FileUpload.component.tsx"],"sourcesContent":["import React, { useState, useRef } from 'react';\r\nimport { Upload, X, CircleAlert, FileText } from 'lucide-react';\r\nimport type { FileUploadProps } from './FileUpload.types';\r\n\r\n// ── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n}\r\n\r\nfunction isFileTypeAccepted(file: File, acceptedTypes: string[]): boolean {\r\n return acceptedTypes.some((type) => {\r\n const trimmed = type.trim();\r\n // Extension match: \".pdf\", \".docx\"\r\n if (trimmed.startsWith('.')) {\r\n return file.name.toLowerCase().endsWith(trimmed.toLowerCase());\r\n }\r\n // Wildcard MIME group: \"image/*\", \"video/*\"\r\n if (trimmed.endsWith('/*')) {\r\n const baseType = trimmed.slice(0, -2);\r\n return file.type.startsWith(`${baseType}/`);\r\n }\r\n // Exact MIME type: \"application/pdf\"\r\n return file.type === trimmed;\r\n });\r\n}\r\n\r\n// ── Component ─────────────────────────────────────────────────────────────────\r\n\r\nexport function FileUpload({\r\n accept,\r\n multiple = false,\r\n maxSize,\r\n maxFiles,\r\n onFilesAccepted,\r\n onFilesRejected,\r\n hint,\r\n disabled = false,\r\n className = '',\r\n}: FileUploadProps) {\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [files, setFiles] = useState<File[]>([]);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n // ── Validation ─────────────────────────────────────────────────────────────\r\n\r\n const validateAndAccept = (fileList: FileList | File[]) => {\r\n const incoming = Array.from(fileList);\r\n\r\n if (maxFiles !== undefined && incoming.length > maxFiles) {\r\n setError(`Maximum ${maxFiles} file${maxFiles === 1 ? '' : 's'} allowed`);\r\n onFilesRejected?.(incoming, 'count');\r\n return;\r\n }\r\n\r\n if (accept) {\r\n const acceptedTypes = accept.split(',').map((t) => t.trim());\r\n const invalid = incoming.filter((f) => !isFileTypeAccepted(f, acceptedTypes));\r\n if (invalid.length > 0) {\r\n setError('One or more files have an unsupported type');\r\n onFilesRejected?.(incoming, 'type');\r\n return;\r\n }\r\n }\r\n\r\n if (maxSize !== undefined) {\r\n const oversized = incoming.filter((f) => f.size > maxSize);\r\n if (oversized.length > 0) {\r\n setError(`File size exceeds the ${formatBytes(maxSize)} limit`);\r\n onFilesRejected?.(oversized, 'size');\r\n return;\r\n }\r\n }\r\n\r\n setError(null);\r\n setFiles(incoming);\r\n onFilesAccepted?.(incoming);\r\n };\r\n\r\n // ── Drag handlers ──────────────────────────────────────────────────────────\r\n\r\n const handleDragEnter = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n if (!disabled) setIsDragging(true);\r\n };\r\n\r\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\r\n // Prevent default to allow the drop event to fire\r\n e.preventDefault();\r\n };\r\n\r\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n // Only clear the dragging state when leaving the zone entirely,\r\n // not when moving over a child element inside it.\r\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\r\n setIsDragging(false);\r\n }\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n if (disabled) return;\r\n const { files: dropped } = e.dataTransfer;\r\n if (dropped.length > 0) validateAndAccept(dropped);\r\n };\r\n\r\n // ── Click / keyboard ───────────────────────────────────────────────────────\r\n\r\n const handleZoneClick = () => {\r\n if (!disabled) inputRef.current?.click();\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleZoneClick();\r\n }\r\n };\r\n\r\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (e.target.files && e.target.files.length > 0) {\r\n validateAndAccept(e.target.files);\r\n }\r\n // Reset the input value so the same file(s) can be re-selected\r\n e.target.value = '';\r\n };\r\n\r\n // ── File list management ───────────────────────────────────────────────────\r\n\r\n const handleRemoveFile = (index: number) => {\r\n const remaining = files.filter((_, i) => i !== index);\r\n setFiles(remaining);\r\n onFilesAccepted?.(remaining);\r\n };\r\n\r\n // ── CSS classes ────────────────────────────────────────────────────────────\r\n\r\n const rootClasses = ['eidos-file-upload', className].filter(Boolean).join(' ');\r\n\r\n const zoneClasses = [\r\n 'eidos-file-upload-zone',\r\n isDragging && 'eidos-file-upload-zone--dragging',\r\n disabled && 'eidos-file-upload-zone--disabled',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n // Build the auto-generated hint from the constraints when no hint is provided\r\n const autoHint = [\r\n accept ? `Accepted: ${accept}` : null,\r\n maxSize ? `Max size: ${formatBytes(maxSize)}` : null,\r\n maxFiles && multiple ? `Up to ${maxFiles} files` : null,\r\n ]\r\n .filter(Boolean)\r\n .join(' · ');\r\n\r\n const displayHint = hint ?? (autoHint.length > 0 ? autoHint : null);\r\n\r\n return (\r\n <div\r\n className={rootClasses}\r\n role=\"region\"\r\n aria-label=\"File upload\"\r\n aria-disabled={disabled || undefined}\r\n >\r\n <div\r\n className={zoneClasses}\r\n onClick={handleZoneClick}\r\n onDragEnter={handleDragEnter}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n onKeyDown={handleKeyDown}\r\n role=\"button\"\r\n tabIndex={disabled ? -1 : 0}\r\n aria-label=\"Upload files - click or drag and drop\"\r\n aria-disabled={disabled || undefined}\r\n >\r\n <div className=\"eidos-file-upload-icon\" aria-hidden=\"true\">\r\n <Upload />\r\n </div>\r\n\r\n <div className=\"eidos-file-upload-text\">\r\n <p className=\"eidos-file-upload-title\">\r\n <em>Click to upload</em>\r\n </p>\r\n <span style={{ fontWeight: 'normal', fontSize: '0.875rem' }}>or drag and drop</span>\r\n {displayHint && <p className=\"eidos-file-upload-hint\">{displayHint}</p>}\r\n </div>\r\n\r\n {/* Hidden native input - triggered programmatically via click() */}\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n disabled={disabled}\r\n onChange={handleFileChange}\r\n className=\"eidos-file-upload-input-hidden\"\r\n tabIndex={-1}\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n\r\n {error && (\r\n <p className=\"eidos-file-upload-error\" role=\"alert\">\r\n <CircleAlert aria-hidden=\"true\" />\r\n {error}\r\n </p>\r\n )}\r\n\r\n {files.length > 0 && (\r\n <ul className=\"eidos-file-upload-list\" aria-label=\"Selected files\">\r\n {files.map((file, index) => (\r\n <li key={`${file.name}-${index}`} className=\"eidos-file-upload-item\">\r\n <div className=\"eidos-file-upload-item-info\">\r\n <FileText aria-hidden=\"true\" />\r\n <span className=\"eidos-file-upload-item-name\">{file.name}</span>\r\n <span className=\"eidos-file-upload-item-size\">{formatBytes(file.size)}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"eidos-file-upload-item-remove\"\r\n onClick={() => handleRemoveFile(index)}\r\n aria-label={`Remove ${file.name}`}\r\n >\r\n <X />\r\n </button>\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nFileUpload.displayName = 'FileUpload';\r\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/TagInput/TagInput.component.tsx"],"sourcesContent":["import React, { useState, useId, useRef, useCallback, useMemo, useEffect } from 'react';\r\nimport { CircleAlert } from 'lucide-react';\r\nimport { Chip } from '../Chip/Chip.component';\r\nimport { Dropdown } from '../Dropdown/Dropdown.component';\r\nimport type { TagInputProps } from './TagInput.types';\r\nimport './TagInput.scss';\r\n\r\nexport const TagInput: React.FC<TagInputProps> = ({\r\n value,\r\n defaultValue = [],\r\n onChange,\r\n placeholder = 'Add tag…',\r\n size = 'md',\r\n disabled = false,\r\n label,\r\n error,\r\n hint,\r\n allowDuplicates = false,\r\n maxTags,\r\n separators = ['Enter', ',', 'Tab'],\r\n validate,\r\n className = '',\r\n fullWidth = false,\r\n suggestions,\r\n onSearch,\r\n suggestionsEmptyText = 'No matches',\r\n}) => {\r\n const generatedId = useId();\r\n const inputId = `tag-input-${generatedId}`;\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n /** Entire component wrapper - used for click-outside detection on the suggestions dropdown */\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n /** The field wrapper - passed to Dropdown as externalTriggerRef for width/anchoring */\r\n const fieldRef = useRef<HTMLDivElement>(null);\r\n\r\n /** The 0-height span that IS the Dropdown trigger element - programmatically clicked to open */\r\n const dropdownSpanRef = useRef<HTMLSpanElement>(null);\r\n\r\n const hasSuggestions = suggestions !== undefined;\r\n const isSuggestionsOpenRef = useRef(false);\r\n const [isSuggestionsOpen, setIsSuggestionsOpen] = useState(false);\r\n const [suggestionsMenuKey, setSuggestionsMenuKey] = useState(0);\r\n const [focusedSuggestionIndex, setFocusedSuggestionIndex] = useState(-1);\r\n\r\n const isControlled = value !== undefined;\r\n\r\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue);\r\n const [inputValue, setInputValue] = useState('');\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [validationError, setValidationError] = useState<string | null>(null);\r\n\r\n const tags = isControlled ? (value as string[]) : internalTags;\r\n\r\n const updateTags = useCallback(\r\n (newTags: string[]) => {\r\n if (!isControlled) {\r\n setInternalTags(newTags);\r\n }\r\n onChange?.(newTags);\r\n },\r\n [isControlled, onChange],\r\n );\r\n\r\n const addTag = useCallback(\r\n (rawTag: string) => {\r\n const tag = rawTag.trim();\r\n\r\n if (!tag) return;\r\n\r\n if (!allowDuplicates && tags.includes(tag)) return;\r\n\r\n if (maxTags !== undefined && tags.length >= maxTags) return;\r\n\r\n if (validate) {\r\n const result = validate(tag);\r\n if (result === false) return;\r\n if (typeof result === 'string') {\r\n setValidationError(result);\r\n return;\r\n }\r\n // result === true → valid, fall through\r\n }\r\n\r\n setValidationError(null);\r\n updateTags([...tags, tag]);\r\n setInputValue('');\r\n },\r\n [tags, allowDuplicates, maxTags, validate, updateTags],\r\n );\r\n\r\n const removeTag = useCallback(\r\n (index: number) => {\r\n updateTags(tags.filter((_, i) => i !== index));\r\n },\r\n [tags, updateTags],\r\n );\r\n\r\n // ─── Suggestions dropdown (autocomplete) ───────────────────────────────────\r\n\r\n const filteredSuggestions = useMemo<string[]>(() => {\r\n if (!suggestions) return [];\r\n const query = inputValue.trim().toLowerCase();\r\n return suggestions.filter((suggestion) => {\r\n if (!allowDuplicates && tags.includes(suggestion)) return false;\r\n if (!query) return true;\r\n return suggestion.toLowerCase().includes(query);\r\n });\r\n }, [suggestions, inputValue, tags, allowDuplicates]);\r\n\r\n useEffect(() => {\r\n setFocusedSuggestionIndex(-1);\r\n }, [filteredSuggestions]);\r\n\r\n const openSuggestions = useCallback(() => {\r\n if (isSuggestionsOpenRef.current || disabled || !hasSuggestions) return;\r\n dropdownSpanRef.current?.click(); // opens the Dropdown (bubbles to trigger)\r\n isSuggestionsOpenRef.current = true;\r\n setIsSuggestionsOpen(true);\r\n }, [disabled, hasSuggestions]);\r\n\r\n const closeSuggestions = useCallback(() => {\r\n isSuggestionsOpenRef.current = false;\r\n setIsSuggestionsOpen(false);\r\n setFocusedSuggestionIndex(-1);\r\n setSuggestionsMenuKey((prev) => prev + 1);\r\n }, []);\r\n\r\n const selectSuggestion = useCallback(\r\n (suggestion: string) => {\r\n addTag(suggestion);\r\n closeSuggestions();\r\n inputRef.current?.focus();\r\n },\r\n [addTag, closeSuggestions],\r\n );\r\n\r\n // Click-outside detection for the suggestions dropdown.\r\n useEffect(() => {\r\n if (!hasSuggestions) return;\r\n\r\n const handleMouseDown = (e: MouseEvent) => {\r\n if (!isSuggestionsOpenRef.current) return;\r\n if (e.defaultPrevented) return; // click inside the portal-rendered listbox\r\n if (containerRef.current?.contains(e.target as Node)) return;\r\n closeSuggestions();\r\n };\r\n\r\n document.addEventListener('mousedown', handleMouseDown);\r\n return () => document.removeEventListener('mousedown', handleMouseDown);\r\n }, [hasSuggestions, closeSuggestions]);\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (hasSuggestions && isSuggestionsOpenRef.current && filteredSuggestions.length > 0) {\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n setFocusedSuggestionIndex((prev) => (prev + 1 < filteredSuggestions.length ? prev + 1 : 0));\r\n return;\r\n }\r\n if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n setFocusedSuggestionIndex((prev) => (prev > 0 ? prev - 1 : filteredSuggestions.length - 1));\r\n return;\r\n }\r\n if (e.key === 'Enter' && focusedSuggestionIndex >= 0) {\r\n e.preventDefault();\r\n selectSuggestion(filteredSuggestions[focusedSuggestionIndex]);\r\n return;\r\n }\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n closeSuggestions();\r\n return;\r\n }\r\n }\r\n\r\n if (separators.includes(e.key)) {\r\n e.preventDefault();\r\n addTag(inputValue);\r\n return;\r\n }\r\n\r\n if (e.key === 'Backspace' && inputValue === '' && tags.length > 0) {\r\n e.preventDefault();\r\n removeTag(tags.length - 1);\r\n }\r\n };\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const query = e.target.value;\r\n setInputValue(query);\r\n if (validationError) {\r\n setValidationError(null);\r\n }\r\n onSearch?.(query);\r\n if (hasSuggestions && !isSuggestionsOpenRef.current) openSuggestions();\r\n };\r\n\r\n const handleInputFocus = () => {\r\n setIsFocused(true);\r\n if (hasSuggestions) openSuggestions();\r\n };\r\n\r\n const handleFieldClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n // Don't steal focus from interactive child elements\r\n if ((e.target as HTMLElement).closest('button, input')) return;\r\n if (!disabled) {\r\n inputRef.current?.focus();\r\n }\r\n };\r\n\r\n const displayError = validationError ?? error;\r\n const hasError = !!displayError;\r\n const errorId = `${inputId}-error`;\r\n const hintId = `${inputId}-hint`;\r\n\r\n const containerClasses = [\r\n 'eidos-tag-input',\r\n hasError && 'eidos-tag-input--error',\r\n disabled && 'eidos-tag-input--disabled',\r\n fullWidth && 'eidos-tag-input--full-width',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const fieldClasses = [\r\n 'eidos-tag-input-field',\r\n `eidos-tag-input-field--${size}`,\r\n isFocused && 'eidos-tag-input-field--focused',\r\n hasError && 'eidos-tag-input-field--error',\r\n disabled && 'eidos-tag-input-field--disabled',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const uid = generatedId;\r\n\r\n return (\r\n <div\r\n className={containerClasses}\r\n ref={containerRef}\r\n aria-expanded={hasSuggestions ? isSuggestionsOpen : undefined}\r\n aria-haspopup={hasSuggestions ? 'listbox' : undefined}\r\n >\r\n {label && (\r\n <label htmlFor={inputId} className=\"eidos-tag-input-label\">\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div className={fieldClasses} onClick={handleFieldClick} ref={fieldRef}>\r\n {tags.map((tag, index) => (\r\n <Chip\r\n key={`${tag}-${index}`}\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size={size}\r\n onRemove={disabled ? undefined : () => removeTag(index)}\r\n >\r\n {tag}\r\n </Chip>\r\n ))}\r\n\r\n <input\r\n ref={inputRef}\r\n id={inputId}\r\n className=\"eidos-tag-input-input\"\r\n type=\"text\"\r\n value={inputValue}\r\n placeholder={tags.length === 0 ? placeholder : undefined}\r\n disabled={disabled}\r\n onKeyDown={handleKeyDown}\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n onBlur={() => setIsFocused(false)}\r\n aria-label={label ? undefined : 'Tag input'}\r\n aria-describedby={hasError ? errorId : hint ? hintId : undefined}\r\n aria-autocomplete={hasSuggestions ? 'list' : undefined}\r\n aria-controls={hasSuggestions ? `${uid}-tag-suggestions` : undefined}\r\n aria-activedescendant={\r\n hasSuggestions && focusedSuggestionIndex >= 0\r\n ? `${uid}-tag-suggestion-${focusedSuggestionIndex}`\r\n : undefined\r\n }\r\n />\r\n\r\n {hasSuggestions && (\r\n <Dropdown\r\n key={suggestionsMenuKey}\r\n trigger={\r\n <span\r\n ref={dropdownSpanRef}\r\n className=\"eidos-tag-input-dropdown-anchor\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n content={\r\n <div\r\n id={`${uid}-tag-suggestions`}\r\n className=\"eidos-tag-input-suggestions\"\r\n role=\"listbox\"\r\n aria-label={label ?? 'Suggestions'}\r\n onMouseDown={(e) => e.preventDefault()}\r\n >\r\n {filteredSuggestions.length === 0 ? (\r\n <div className=\"eidos-tag-input-suggestions-empty\">{suggestionsEmptyText}</div>\r\n ) : (\r\n filteredSuggestions.map((suggestion, index) => (\r\n <div\r\n key={suggestion}\r\n id={`${uid}-tag-suggestion-${index}`}\r\n className={[\r\n 'eidos-tag-input-suggestion',\r\n index === focusedSuggestionIndex && 'eidos-tag-input-suggestion--focused',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"option\"\r\n aria-selected={index === focusedSuggestionIndex}\r\n onClick={() => selectSuggestion(suggestion)}\r\n onMouseEnter={() => setFocusedSuggestionIndex(index)}\r\n >\r\n {suggestion}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n }\r\n triggerRef={fieldRef as React.RefObject<HTMLElement | null>}\r\n autoWidth\r\n closeOnClickOutside={false}\r\n closeOnEscape={false}\r\n />\r\n )}\r\n </div>\r\n\r\n {hint && !hasError && (\r\n <p className=\"eidos-tag-input-hint\" id={hintId}>\r\n {hint}\r\n </p>\r\n )}\r\n\r\n {hasError && (\r\n <p className=\"eidos-tag-input-error-message\" id={errorId} role=\"alert\">\r\n <CircleAlert />\r\n {displayError}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nTagInput.displayName = 'TagInput';\r\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-5D3LIJYW.cjs","../src/components/TagInput/TagInput.component.tsx"],"names":[],"mappings":"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","file":"/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-5D3LIJYW.cjs","sourcesContent":[null,"import React, { useState, useId, useRef, useCallback, useMemo, useEffect } from 'react';\r\nimport { CircleAlert } from 'lucide-react';\r\nimport { Chip } from '../Chip/Chip.component';\r\nimport { Dropdown } from '../Dropdown/Dropdown.component';\r\nimport type { TagInputProps } from './TagInput.types';\r\nimport './TagInput.scss';\r\n\r\nexport const TagInput: React.FC<TagInputProps> = ({\r\n value,\r\n defaultValue = [],\r\n onChange,\r\n placeholder = 'Add tag…',\r\n size = 'md',\r\n disabled = false,\r\n label,\r\n error,\r\n hint,\r\n allowDuplicates = false,\r\n maxTags,\r\n separators = ['Enter', ',', 'Tab'],\r\n validate,\r\n className = '',\r\n fullWidth = false,\r\n suggestions,\r\n onSearch,\r\n suggestionsEmptyText = 'No matches',\r\n}) => {\r\n const generatedId = useId();\r\n const inputId = `tag-input-${generatedId}`;\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n /** Entire component wrapper - used for click-outside detection on the suggestions dropdown */\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n /** The field wrapper - passed to Dropdown as externalTriggerRef for width/anchoring */\r\n const fieldRef = useRef<HTMLDivElement>(null);\r\n\r\n /** The 0-height span that IS the Dropdown trigger element - programmatically clicked to open */\r\n const dropdownSpanRef = useRef<HTMLSpanElement>(null);\r\n\r\n const hasSuggestions = suggestions !== undefined;\r\n const isSuggestionsOpenRef = useRef(false);\r\n const [isSuggestionsOpen, setIsSuggestionsOpen] = useState(false);\r\n const [suggestionsMenuKey, setSuggestionsMenuKey] = useState(0);\r\n const [focusedSuggestionIndex, setFocusedSuggestionIndex] = useState(-1);\r\n\r\n const isControlled = value !== undefined;\r\n\r\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue);\r\n const [inputValue, setInputValue] = useState('');\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [validationError, setValidationError] = useState<string | null>(null);\r\n\r\n const tags = isControlled ? (value as string[]) : internalTags;\r\n\r\n const updateTags = useCallback(\r\n (newTags: string[]) => {\r\n if (!isControlled) {\r\n setInternalTags(newTags);\r\n }\r\n onChange?.(newTags);\r\n },\r\n [isControlled, onChange],\r\n );\r\n\r\n const addTag = useCallback(\r\n (rawTag: string) => {\r\n const tag = rawTag.trim();\r\n\r\n if (!tag) return;\r\n\r\n if (!allowDuplicates && tags.includes(tag)) return;\r\n\r\n if (maxTags !== undefined && tags.length >= maxTags) return;\r\n\r\n if (validate) {\r\n const result = validate(tag);\r\n if (result === false) return;\r\n if (typeof result === 'string') {\r\n setValidationError(result);\r\n return;\r\n }\r\n // result === true → valid, fall through\r\n }\r\n\r\n setValidationError(null);\r\n updateTags([...tags, tag]);\r\n setInputValue('');\r\n },\r\n [tags, allowDuplicates, maxTags, validate, updateTags],\r\n );\r\n\r\n const removeTag = useCallback(\r\n (index: number) => {\r\n updateTags(tags.filter((_, i) => i !== index));\r\n },\r\n [tags, updateTags],\r\n );\r\n\r\n // ─── Suggestions dropdown (autocomplete) ───────────────────────────────────\r\n\r\n const filteredSuggestions = useMemo<string[]>(() => {\r\n if (!suggestions) return [];\r\n const query = inputValue.trim().toLowerCase();\r\n return suggestions.filter((suggestion) => {\r\n if (!allowDuplicates && tags.includes(suggestion)) return false;\r\n if (!query) return true;\r\n return suggestion.toLowerCase().includes(query);\r\n });\r\n }, [suggestions, inputValue, tags, allowDuplicates]);\r\n\r\n useEffect(() => {\r\n setFocusedSuggestionIndex(-1);\r\n }, [filteredSuggestions]);\r\n\r\n const openSuggestions = useCallback(() => {\r\n if (isSuggestionsOpenRef.current || disabled || !hasSuggestions) return;\r\n dropdownSpanRef.current?.click(); // opens the Dropdown (bubbles to trigger)\r\n isSuggestionsOpenRef.current = true;\r\n setIsSuggestionsOpen(true);\r\n }, [disabled, hasSuggestions]);\r\n\r\n const closeSuggestions = useCallback(() => {\r\n isSuggestionsOpenRef.current = false;\r\n setIsSuggestionsOpen(false);\r\n setFocusedSuggestionIndex(-1);\r\n setSuggestionsMenuKey((prev) => prev + 1);\r\n }, []);\r\n\r\n const selectSuggestion = useCallback(\r\n (suggestion: string) => {\r\n addTag(suggestion);\r\n closeSuggestions();\r\n inputRef.current?.focus();\r\n },\r\n [addTag, closeSuggestions],\r\n );\r\n\r\n // Click-outside detection for the suggestions dropdown.\r\n useEffect(() => {\r\n if (!hasSuggestions) return;\r\n\r\n const handleMouseDown = (e: MouseEvent) => {\r\n if (!isSuggestionsOpenRef.current) return;\r\n if (e.defaultPrevented) return; // click inside the portal-rendered listbox\r\n if (containerRef.current?.contains(e.target as Node)) return;\r\n closeSuggestions();\r\n };\r\n\r\n document.addEventListener('mousedown', handleMouseDown);\r\n return () => document.removeEventListener('mousedown', handleMouseDown);\r\n }, [hasSuggestions, closeSuggestions]);\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (hasSuggestions && isSuggestionsOpenRef.current && filteredSuggestions.length > 0) {\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n setFocusedSuggestionIndex((prev) => (prev + 1 < filteredSuggestions.length ? prev + 1 : 0));\r\n return;\r\n }\r\n if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n setFocusedSuggestionIndex((prev) => (prev > 0 ? prev - 1 : filteredSuggestions.length - 1));\r\n return;\r\n }\r\n if (e.key === 'Enter' && focusedSuggestionIndex >= 0) {\r\n e.preventDefault();\r\n selectSuggestion(filteredSuggestions[focusedSuggestionIndex]);\r\n return;\r\n }\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n closeSuggestions();\r\n return;\r\n }\r\n }\r\n\r\n if (separators.includes(e.key)) {\r\n e.preventDefault();\r\n addTag(inputValue);\r\n return;\r\n }\r\n\r\n if (e.key === 'Backspace' && inputValue === '' && tags.length > 0) {\r\n e.preventDefault();\r\n removeTag(tags.length - 1);\r\n }\r\n };\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const query = e.target.value;\r\n setInputValue(query);\r\n if (validationError) {\r\n setValidationError(null);\r\n }\r\n onSearch?.(query);\r\n if (hasSuggestions && !isSuggestionsOpenRef.current) openSuggestions();\r\n };\r\n\r\n const handleInputFocus = () => {\r\n setIsFocused(true);\r\n if (hasSuggestions) openSuggestions();\r\n };\r\n\r\n const handleFieldClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n // Don't steal focus from interactive child elements\r\n if ((e.target as HTMLElement).closest('button, input')) return;\r\n if (!disabled) {\r\n inputRef.current?.focus();\r\n }\r\n };\r\n\r\n const displayError = validationError ?? error;\r\n const hasError = !!displayError;\r\n const errorId = `${inputId}-error`;\r\n const hintId = `${inputId}-hint`;\r\n\r\n const containerClasses = [\r\n 'eidos-tag-input',\r\n hasError && 'eidos-tag-input--error',\r\n disabled && 'eidos-tag-input--disabled',\r\n fullWidth && 'eidos-tag-input--full-width',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const fieldClasses = [\r\n 'eidos-tag-input-field',\r\n `eidos-tag-input-field--${size}`,\r\n isFocused && 'eidos-tag-input-field--focused',\r\n hasError && 'eidos-tag-input-field--error',\r\n disabled && 'eidos-tag-input-field--disabled',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const uid = generatedId;\r\n\r\n return (\r\n <div\r\n className={containerClasses}\r\n ref={containerRef}\r\n aria-expanded={hasSuggestions ? isSuggestionsOpen : undefined}\r\n aria-haspopup={hasSuggestions ? 'listbox' : undefined}\r\n >\r\n {label && (\r\n <label htmlFor={inputId} className=\"eidos-tag-input-label\">\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div className={fieldClasses} onClick={handleFieldClick} ref={fieldRef}>\r\n {tags.map((tag, index) => (\r\n <Chip\r\n key={`${tag}-${index}`}\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size={size}\r\n onRemove={disabled ? undefined : () => removeTag(index)}\r\n >\r\n {tag}\r\n </Chip>\r\n ))}\r\n\r\n <input\r\n ref={inputRef}\r\n id={inputId}\r\n className=\"eidos-tag-input-input\"\r\n type=\"text\"\r\n value={inputValue}\r\n placeholder={tags.length === 0 ? placeholder : undefined}\r\n disabled={disabled}\r\n onKeyDown={handleKeyDown}\r\n onChange={handleInputChange}\r\n onFocus={handleInputFocus}\r\n onBlur={() => setIsFocused(false)}\r\n aria-label={label ? undefined : 'Tag input'}\r\n aria-describedby={hasError ? errorId : hint ? hintId : undefined}\r\n aria-autocomplete={hasSuggestions ? 'list' : undefined}\r\n aria-controls={hasSuggestions ? `${uid}-tag-suggestions` : undefined}\r\n aria-activedescendant={\r\n hasSuggestions && focusedSuggestionIndex >= 0\r\n ? `${uid}-tag-suggestion-${focusedSuggestionIndex}`\r\n : undefined\r\n }\r\n />\r\n\r\n {hasSuggestions && (\r\n <Dropdown\r\n key={suggestionsMenuKey}\r\n trigger={\r\n <span\r\n ref={dropdownSpanRef}\r\n className=\"eidos-tag-input-dropdown-anchor\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n content={\r\n <div\r\n id={`${uid}-tag-suggestions`}\r\n className=\"eidos-tag-input-suggestions\"\r\n role=\"listbox\"\r\n aria-label={label ?? 'Suggestions'}\r\n onMouseDown={(e) => e.preventDefault()}\r\n >\r\n {filteredSuggestions.length === 0 ? (\r\n <div className=\"eidos-tag-input-suggestions-empty\">{suggestionsEmptyText}</div>\r\n ) : (\r\n filteredSuggestions.map((suggestion, index) => (\r\n <div\r\n key={suggestion}\r\n id={`${uid}-tag-suggestion-${index}`}\r\n className={[\r\n 'eidos-tag-input-suggestion',\r\n index === focusedSuggestionIndex && 'eidos-tag-input-suggestion--focused',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n role=\"option\"\r\n aria-selected={index === focusedSuggestionIndex}\r\n onClick={() => selectSuggestion(suggestion)}\r\n onMouseEnter={() => setFocusedSuggestionIndex(index)}\r\n >\r\n {suggestion}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n }\r\n triggerRef={fieldRef as React.RefObject<HTMLElement | null>}\r\n autoWidth\r\n closeOnClickOutside={false}\r\n closeOnEscape={false}\r\n />\r\n )}\r\n </div>\r\n\r\n {hint && !hasError && (\r\n <p className=\"eidos-tag-input-hint\" id={hintId}>\r\n {hint}\r\n </p>\r\n )}\r\n\r\n {hasError && (\r\n <p className=\"eidos-tag-input-error-message\" id={errorId} role=\"alert\">\r\n <CircleAlert />\r\n {displayError}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nTagInput.displayName = 'TagInput';\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-5QG2I3FK.cjs","../src/components/Tabs/Tabs.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,4EAAqE;AAkEjE,+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;AACA,EAAA;AACZ,EAAA;AACI;AACiB,EAAA;AACF,EAAA;AACC,EAAA;AAEJ,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;AAEC,EAAA;AACG,IAAA;AACH,MAAA;AAChB,IAAA;AACmB,oBAAA;AACrB,EAAA;AAI2C,EAAA;AACrC,EAAA;AAES,EAAA;AACF,IAAA;AACQ,IAAA;AACA,MAAA;AACF,IAAA;AACD,MAAA;AAChB,IAAA;AACD,EAAA;AAEoB,EAAA;AAID,EAAA;AAClB,IAAA;AACA,IAAA;AACa,IAAA;AAGZ,EAAA;AAEoC,EAAA;AACrC,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AAGE,EAAA;AAEI,oBAAA;AACG,MAAA;AACY,MAAA;AAGf,IAAA;AACA,oBAAA;AAEJ,EAAA;AAEJ;AAEmB;AD7DI;AACA;AACA;AACA;AACA;AACA","file":"/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-5QG2I3FK.cjs","sourcesContent":[null,"import React, { useState, useRef, useContext, useLayoutEffect } from 'react';\r\nimport { renderIcon } from '../../utils';\r\nimport type { TabsProps, TabProps, TabPanelProps, TabsContextValue } from './Tabs.types';\r\n\r\n// ============================================================================\r\n// CONTEXT\r\n// ============================================================================\r\n\r\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\r\n\r\nconst useTabsContext = (): TabsContextValue => {\r\n const ctx = useContext(TabsContext);\r\n if (!ctx) throw new Error('Tab/TabPanel must be used inside <Tabs>');\r\n return ctx;\r\n};\r\n\r\n// ============================================================================\r\n// TAB - individual tab trigger button\r\n// Defined before Tabs so Tabs can use `child.type === Tab` for child separation.\r\n// ============================================================================\r\n\r\nexport const Tab: React.FC<TabProps> = ({\r\n value,\r\n children,\r\n disabled = false,\r\n icon,\r\n className = '',\r\n}) => {\r\n const { activeValue, onSelect, size, fullWidth, listRef } = useTabsContext();\r\n const isActive = activeValue === value;\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\r\n const list = listRef.current;\r\n if (!list) return;\r\n\r\n const allTabs = Array.from(\r\n list.querySelectorAll('[role=\"tab\"]:not([disabled])'),\r\n ) as HTMLElement[];\r\n const currentIndex = allTabs.indexOf(e.currentTarget);\r\n if (currentIndex === -1) return;\r\n\r\n let targetIndex = -1;\r\n if (e.key === 'ArrowRight') targetIndex = (currentIndex + 1) % allTabs.length;\r\n else if (e.key === 'ArrowLeft')\r\n targetIndex = (currentIndex - 1 + allTabs.length) % allTabs.length;\r\n else if (e.key === 'Home') targetIndex = 0;\r\n else if (e.key === 'End') targetIndex = allTabs.length - 1;\r\n\r\n if (targetIndex !== -1) {\r\n e.preventDefault();\r\n allTabs[targetIndex].focus();\r\n }\r\n };\r\n\r\n const tabClasses = [\r\n 'eidos-tab',\r\n `eidos-tab--${size}`,\r\n isActive && 'eidos-tab--active',\r\n disabled && 'eidos-tab--disabled',\r\n fullWidth && 'eidos-tab--fullWidth',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <button\r\n id={`eidos-tab-${value}`}\r\n role=\"tab\"\r\n aria-selected={isActive}\r\n aria-controls={`eidos-tabpanel-${value}`}\r\n tabIndex={isActive ? 0 : -1}\r\n disabled={disabled}\r\n className={tabClasses}\r\n onClick={() => !disabled && onSelect(value)}\r\n onKeyDown={handleKeyDown}\r\n type=\"button\"\r\n >\r\n {icon && <span className=\"eidos-tab-icon\">{renderIcon(icon, 'eidos-tab-icon-svg')}</span>}\r\n <span className=\"eidos-tab-label\">{children}</span>\r\n </button>\r\n );\r\n};\r\n\r\nTab.displayName = 'Tab';\r\n\r\n// ============================================================================\r\n// TAB PANEL - content region shown when its value matches the active tab\r\n// Defined before Tabs for the same `child.type === TabPanel` check.\r\n// ============================================================================\r\n\r\nexport const TabPanel: React.FC<TabPanelProps> = ({ value, children, className = '' }) => {\r\n const { activeValue } = useTabsContext();\r\n const isActive = activeValue === value;\r\n\r\n if (!isActive) return null;\r\n\r\n return (\r\n <div\r\n id={`eidos-tabpanel-${value}`}\r\n role=\"tabpanel\"\r\n aria-labelledby={`eidos-tab-${value}`}\r\n tabIndex={0}\r\n className={['eidos-tab-panel', className].filter(Boolean).join(' ')}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nTabPanel.displayName = 'TabPanel';\r\n\r\n// ============================================================================\r\n// TABS - root container; provides context, separates tab/panel children\r\n// ============================================================================\r\n\r\nexport const Tabs: React.FC<TabsProps> = ({\r\n value,\r\n defaultValue,\r\n onChange,\r\n variant = 'line',\r\n size = 'md',\r\n color = 'primary',\r\n fullWidth = false,\r\n className = '',\r\n children,\r\n}) => {\r\n const isControlled = value !== undefined;\r\n const [localValue, setLocalValue] = useState(defaultValue ?? '');\r\n const activeValue = isControlled ? value! : localValue;\r\n\r\n const listRef = useRef<HTMLDivElement>(null);\r\n const indicatorRef = useRef<HTMLSpanElement>(null);\r\n // Tracks whether the indicator has been positioned at least once so we can\r\n // skip the CSS transition on the very first render and avoid it animating\r\n // from the top-left corner to the initial tab.\r\n const hasPositioned = useRef(false);\r\n\r\n useLayoutEffect(() => {\r\n if (variant !== 'line') return;\r\n const list = listRef.current;\r\n const indicator = indicatorRef.current;\r\n if (!list || !indicator) return;\r\n\r\n const activeTab = list.querySelector('[aria-selected=\"true\"]') as HTMLElement | null;\r\n if (!activeTab) return;\r\n\r\n // Suppress the CSS transition on the initial paint so the indicator snaps\r\n // into place rather than sliding from 0.\r\n if (!hasPositioned.current) {\r\n indicator.style.transition = 'none';\r\n }\r\n\r\n indicator.style.left = `${activeTab.offsetLeft}px`;\r\n indicator.style.width = `${activeTab.offsetWidth}px`;\r\n\r\n if (!hasPositioned.current) {\r\n // Force a synchronous reflow so the browser commits the no-transition\r\n // position before we re-enable the transition for future clicks.\r\n void indicator.offsetWidth;\r\n indicator.style.transition = '';\r\n hasPositioned.current = true;\r\n }\r\n }, [activeValue, variant, fullWidth]);\r\n\r\n const onSelect = (newValue: string) => {\r\n if (!isControlled) {\r\n setLocalValue(newValue);\r\n }\r\n onChange?.(newValue);\r\n };\r\n\r\n // Separate Tab and TabPanel children so the list and panels render in\r\n // distinct DOM regions, regardless of how the consumer orders them.\r\n const tabChildren: React.ReactElement[] = [];\r\n const panelChildren: React.ReactElement[] = [];\r\n\r\n React.Children.forEach(children, (child) => {\r\n if (!React.isValidElement(child)) return;\r\n if (child.type === Tab) {\r\n tabChildren.push(child);\r\n } else if (child.type === TabPanel) {\r\n panelChildren.push(child);\r\n }\r\n });\r\n\r\n const rootClasses = ['eidos-tabs', `eidos-tabs--${variant}`, `eidos-tabs--${color}`, className]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const listClasses = [\r\n 'eidos-tabs-list',\r\n `eidos-tabs-list--${size}`,\r\n fullWidth && 'eidos-tabs-list--fullWidth',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const contextValue: TabsContextValue = {\r\n activeValue,\r\n onSelect,\r\n variant,\r\n size,\r\n color,\r\n fullWidth,\r\n listRef,\r\n };\r\n\r\n return (\r\n <TabsContext.Provider value={contextValue}>\r\n <div className={rootClasses}>\r\n <div ref={listRef} className={listClasses} role=\"tablist\">\r\n {tabChildren}\r\n {variant === 'line' && (\r\n <span ref={indicatorRef} className=\"eidos-tabs-indicator\" aria-hidden=\"true\" />\r\n )}\r\n </div>\r\n <div className=\"eidos-tabs-panels\">{panelChildren}</div>\r\n </div>\r\n </TabsContext.Provider>\r\n );\r\n};\r\n\r\nTabs.displayName = 'Tabs';\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-5TGBNYZK.cjs","../src/components/Kbd/Kbd.component.tsx"],"names":[],"mappings":"AAAA;AC2BS,+CAAA;AAHF,IAAM,IAAA,EAA0B,CAAC,EAAE,QAAA,EAAU,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA,EAAA,GAAM;AACpF,EAAA,MAAM,QAAA,EAAU,CAAC,WAAA,EAAa,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA;AAEzB,EAAA;AACzB;ADtBmD;AACA;AACA;AACA","file":"/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-5TGBNYZK.cjs","sourcesContent":[null,"import React from 'react';\r\nimport type { KbdProps } from './Kbd.types';\r\n\r\n/**\r\n * Kbd - renders a keyboard key or shortcut with a physical key appearance.\r\n *\r\n * Use it anywhere a keyboard shortcut needs to be communicated: tooltips,\r\n * menu item shortcuts, inline documentation, command palettes.\r\n *\r\n * For multi-key combinations, place `<Kbd>` elements side-by-side and\r\n * separate them with a `+` character or a thin space as suits the context.\r\n *\r\n * @example\r\n * ```tsx\r\n * // Single key\r\n * <Kbd>⌘</Kbd>\r\n *\r\n * // Compound shortcut - wrap in a fragment or span\r\n * <span><Kbd>⌘</Kbd><Kbd>K</Kbd></span>\r\n *\r\n * // Inline in prose\r\n * Press <Kbd>Enter</Kbd> to confirm.\r\n * ```\r\n */\r\nexport const Kbd: React.FC<KbdProps> = ({ children, size = 'md', className = '' }) => {\r\n const classes = ['eidos-kbd', `eidos-kbd--${size}`, className].filter(Boolean).join(' ');\r\n\r\n return <kbd className={classes}>{children}</kbd>;\r\n};\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-63N2KZZX.cjs","../src/components/Progress/Progress.component.tsx"],"names":[],"mappings":"AAAA;ACyCI,+CAAA;AArCG,IAAM,SAAA,EAAoC,CAAC;AAAA,EAChD,KAAA;AAAA,EACA,IAAA,EAAM,GAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,UAAA,EAAY,KAAA;AAAA,EACZ,KAAA;AAAA,EACA,QAAA,EAAU,KAAA;AAAA,EACV;AACF,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,WAAA,EACJ,MAAA,IAAU,KAAA,EAAA,EAAY,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAI,MAAA,EAAQ,IAAA,EAAO,GAAG,CAAC,EAAA,EAAI,KAAA,CAAA;AAE1E,EAAA,MAAM,gBAAA,EAAkB,WAAA,IAAe,KAAA,CAAA;AAEvC,EAAA,MAAM,aAAA,mBACJ,KAAA,UAAA,CAAU,WAAA,IAAe,KAAA,EAAA,EAAY,CAAA,EAAA;AAEvB,EAAA;AACd,IAAA;AACwB,IAAA;AACD,IAAA;AACZ,IAAA;AACQ,IAAA;AACnB,IAAA;AAGS,EAAA;AAES,EAAA;AAClB,IAAA;AACmB,IAAA;AAGV,EAAA;AAGT,EAAA;AAAC,IAAA;AAAA,IAAA;AACY,MAAA;AACN,MAAA;AACU,MAAA;AACA,MAAA;AACA,MAAA;AACyB,MAAA;AAExC,MAAA;AAAe,wBAAA;AACZ,UAAA;AAAA,UAAA;AACY,YAAA;AAC2B,YAAA;AAAkB,UAAA;AAE5D,QAAA;AAEE,QAAA;AAAqD,MAAA;AAAA,IAAA;AAEzD,EAAA;AAEJ;ADX0D;AACA;AACA;AACA","file":"/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-63N2KZZX.cjs","sourcesContent":[null,"import React from 'react';\r\nimport type { ProgressProps } from './Progress.types';\r\nimport './Progress.scss';\r\n\r\nexport const Progress: React.FC<ProgressProps> = ({\r\n value,\r\n max = 100,\r\n color = 'primary',\r\n size = 'md',\r\n showLabel = false,\r\n label,\r\n striped = false,\r\n className,\r\n}) => {\r\n const percentage =\r\n value !== undefined ? Math.min(100, Math.max(0, (value / max) * 100)) : undefined;\r\n\r\n const isIndeterminate = percentage === undefined;\r\n\r\n const displayLabel =\r\n label ?? (percentage !== undefined ? `${Math.round(percentage)}%` : undefined);\r\n\r\n const classes = [\r\n 'eidos-progress',\r\n `eidos-progress--${color}`,\r\n `eidos-progress--${size}`,\r\n striped && 'eidos-progress--striped',\r\n isIndeterminate && 'eidos-progress--indeterminate',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const fillClasses = [\r\n 'eidos-progress-fill',\r\n isIndeterminate && 'eidos-progress-fill--indeterminate',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <div\r\n className={classes}\r\n role=\"progressbar\"\r\n aria-valuenow={percentage}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n aria-label={label ?? (isIndeterminate ? 'Loading…' : `${Math.round(percentage!)}%`)}\r\n >\r\n <div className=\"eidos-progress-track\">\r\n <div\r\n className={fillClasses}\r\n style={!isIndeterminate ? { width: `${percentage}%` } : undefined}\r\n />\r\n </div>\r\n {showLabel && !isIndeterminate && (\r\n <span className=\"eidos-progress-label\">{displayLabel}</span>\r\n )}\r\n </div>\r\n );\r\n};\r\n"]}